#ifndef IMAGE_HPP_INCLUDED
#define IMAGE_HPP_INCLUDED

#include <iostream>
#include <memory>
#include <optional>
#include <set>
#include <string>
#include <vector>
#include <NBO/NBO/AcquisitionSoftwareRef.h>
#include <NBO/NBO/AnnotationRef.h>
#include <NBO/NBO/Denomination_Type.h>
#include <NBO/NBO/Description.h>
#include <NBO/NBO/DetectorCalibration.h>
#include <NBO/NBO/ExperimentRef.h>
#include <NBO/NBO/ExperimenterGroupRef.h>
#include <NBO/NBO/ExperimenterRef.h>
#include <NBO/NBO/FocusStabilizationDeviceRef.h>
#include <NBO/NBO/ImageID_Type.h>
#include <NBO/NBO/ImagingEnvironment.h>
#include <NBO/NBO/InstrumentRef.h>
#include <NBO/NBO/MicroscopeStandSettings.h>
#include <NBO/NBO/MicroscopeTableSettings.h>
#include <NBO/NBO/ObjectiveSettings.h>
#include <NBO/NBO/OpticalCalibration.h>
#include <NBO/NBO/Pixels.h>
#include <NBO/NBO/ROIRef.h>
#include <NBO/NBO/SamplePositioningSettings.h>
#include <NBO/NBO/SampleRef.h>
#include <NBO/NBO/StageInsertRef.h>
#include <NBO/NBO/StageLabel.h>
#include <NBO/NBO/ENBOType.h>
#include <NBO/NBOGlobal.h>
#include <NBO/Shared/Base/NBOBaseClass.h>


namespace Inscoper::NBO {

/*!
* \brief Represents the XML element Image.
*
* This element describes the actual Image that was acquired and its meta-data. The elements that are references (ending in Ref or Settings) refer to elements defined outside of the Image element. Ref elements are simple links, while Settings elements are links with additional values. If any of the required Image attributes or elements are missing, its guaranteed to be an invalid document.
*/
class NBO_EXPORT Image : public NBOBaseClass {

public:
	
	Image();
	~Image();

	/*!
	* \brief Cast a NBOBaseClass to a Image.
	*
	* \param base The base class to cast
	* \return The casted element, or nullptr if the cast fails
	*/
	static std::shared_ptr<Image> fromBase(NBOBaseClassPtr base);

	/*!
	* \brief Returns the class type name.
	*
	* \return The class type name
	*/
	std::string getTypeName() const override;

	/*!
	* \brief Returns the XML element name corresponding to this class.
	*
	* \return The XML element name
	*/
	std::string getXMLName() const override;

	/*!
	* \brief Returns the NBO Type corresponding to this class.
	*
	* \return The NBO Type value
	*/
	ENBOType getNBOType() const override;

	/*!
	* \brief Returns a list of all classes derived from this class.
	*
	* \return The list of derived classes
	*/
	std::vector<NBOBaseClassPtr> getChildren() const override;

	/*!
	* \brief Returns a list of all child elements contained in this class.
	*
	* \return The list of child classes
	*/
	std::vector<NBOBaseClassPtr> getSubElements() const override;

	/*!
	* \brief Populates this object from a JSON file.
	*
	* \param path The path to the JSON file
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void fromJsonFile(const std::string& path, bool validate = true);

	/*!
	* \brief Populates this object from a JSON string.
	*
	* \param json_string The JSON content as a string
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void fromJsonString(const std::string& json_string, bool validate = true);

	/*!
	* \brief Populates this object from a XML file.
	*
	* \param path The path to the XML file
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void fromXmlFile(const std::string& path, bool validate = true);

	/*!
	* \brief Populates this object from a XML string.
	*
	* \param xml_string The XML content as a string
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void fromXmlString(const std::string& xml_string, bool validate = true);

	/*!
	* \brief Serializes this object to an XML file.
	*
	* \param filename The path to the output XML file
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void toXmlFile(const std::string& filename, bool validate = true) const;

	/*!
	* \brief Serializes this object to an XML string.
	*
	* \param validate If true, validates constraints on value. Default is true.
	* \return A string containing the XML representation of this object
	*/
	std::string toXmlString(bool validate = true) const;

	/*!
	* \brief Sets the value of the ID attribute.
	*
	* A unique identifier for this Image.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setID(const Inscoper::NBO::ImageID_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the ID attribute.
	*
	* A unique identifier for this Image.
	*
	* \return The value of the attribute
	*/
	ImageID_TypePtr getID() const;

	/*!
	* \brief Resets the ID attribute to an unset state.
	*
	* A unique identifier for this Image.
	*/
	void resetID();

	/*!
	* \brief Checks whether the optional ID attribute is present.
	*
	* A unique identifier for this Image.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasID() const;

	/*!
	* \brief Sets the value of the Name attribute.
	*
	* A user assigned name for this Image.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setName(const Inscoper::NBO::Denomination_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the Name attribute.
	*
	* A user assigned name for this Image.
	*
	* \return The value of the attribute
	*/
	Denomination_TypePtr getName() const;

	/*!
	* \brief Resets the Name attribute to an unset state.
	*
	* A user assigned name for this Image.
	*/
	void resetName();

	/*!
	* \brief Checks whether the optional Name attribute is present.
	*
	* A user assigned name for this Image.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasName() const;

	/*!
	* \brief Sets the value of the AcquisitionDate attribute.
	*
	* The Date in which this Image was Acquired.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setAcquisitionDate(const std::string& value, bool validate = true);

	/*!
	* \brief Returns the value of the AcquisitionDate attribute.
	*
	* The Date in which this Image was Acquired.
	*
	* \return The value of the attribute
	*/
	std::string getAcquisitionDate() const;

	/*!
	* \brief Resets the AcquisitionDate attribute to an unset state.
	*
	* The Date in which this Image was Acquired.
	*/
	void resetAcquisitionDate();

	/*!
	* \brief Checks whether the AcquisitionDate attribute is present.
	*
	* The Date in which this Image was Acquired.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasAcquisitionDate() const;

	/*!
	* \brief Returns the allowed values for this attribut.
	*
	* The Date in which this Image was Acquired.
	*
	* \return The list of allowed values
	*/
	static const std::set<std::string>& getAcquisitionDateAllowedValues();

	/*!
	* \brief Sets the value of the InstrumentRef element.
	*
	* No description available in the XSD standard.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setInstrumentRef(const Inscoper::NBO::InstrumentRefPtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the InstrumentRef element.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the element
	*/
	Inscoper::NBO::InstrumentRefPtr getInstrumentRef() const
;
	/*!
	* \brief Resets the InstrumentRef element to an unset state.
	*
	* No description available in the XSD standard.
	*/
	void resetInstrumentRef();

	/*!
	* \brief Checks whether the optional InstrumentRef element is present.
	*
	* No description available in the XSD standard.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasInstrumentRef() const;

	/*!
	* \brief Sets the value of the ExperimentRef element.
	*
	* This empty element refers to the Experiment during which this Image was acquired.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setExperimentRef(const Inscoper::NBO::ExperimentRefPtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the ExperimentRef element.
	*
	* This empty element refers to the Experiment during which this Image was acquired.
	*
	* \return The value of the element
	*/
	Inscoper::NBO::ExperimentRefPtr getExperimentRef() const
;
	/*!
	* \brief Resets the ExperimentRef element to an unset state.
	*
	* This empty element refers to the Experiment during which this Image was acquired.
	*/
	void resetExperimentRef();

	/*!
	* \brief Checks whether the optional ExperimentRef element is present.
	*
	* This empty element refers to the Experiment during which this Image was acquired.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasExperimentRef() const;

	/*!
	* \brief Sets the list of ExperimenterRef elements.
	*
	* No description available in the XSD standard.
	*
	* \param value The new list of ExperimenterRef elements
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setExperimenterRef_List(const std::vector<Inscoper::NBO::ExperimenterRefPtr>& value, bool validate = true);

	/*!
	* \brief Returns the list of ExperimenterRef elements.
	*
	* No description available in the XSD standard.
	*
	* \return The list of ExperimenterRef elements
	*/
	std::vector<Inscoper::NBO::ExperimenterRefPtr> getExperimenterRef_List() const;

	/*!
	* \brief Adds a new ExperimenterRef element to this object.
	*
	* No description available in the XSD standard.
	*
	* \param value The element to add
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void addToExperimenterRef_List(const Inscoper::NBO::ExperimenterRefPtr& value, bool validate = true);

	/*!
	* \brief Clear the list of ExperimenterRef.
	*
	* No description available in the XSD standard.
	*/
	void clearExperimenterRef_List();

	/*!
	* \brief Sets the list of SampleRef elements.
	*
	* This empty element refers to the Sample that was imaged in this Image Acquisition.
	*
	* \param value The new list of SampleRef elements
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setSampleRef_List(const std::vector<Inscoper::NBO::SampleRefPtr>& value, bool validate = true);

	/*!
	* \brief Returns the list of SampleRef elements.
	*
	* This empty element refers to the Sample that was imaged in this Image Acquisition.
	*
	* \return The list of SampleRef elements
	*/
	std::vector<Inscoper::NBO::SampleRefPtr> getSampleRef_List() const;

	/*!
	* \brief Adds a new SampleRef element to this object.
	*
	* This empty element refers to the Sample that was imaged in this Image Acquisition.
	*
	* \param value The element to add
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void addToSampleRef_List(const Inscoper::NBO::SampleRefPtr& value, bool validate = true);

	/*!
	* \brief Clear the list of SampleRef.
	*
	* This empty element refers to the Sample that was imaged in this Image Acquisition.
	*/
	void clearSampleRef_List();

	/*!
	* \brief Sets the list of ExperimenterGroupRef elements.
	*
	* No description available in the XSD standard.
	*
	* \param value The new list of ExperimenterGroupRef elements
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setExperimenterGroupRef_List(const std::vector<Inscoper::NBO::ExperimenterGroupRefPtr>& value, bool validate = true);

	/*!
	* \brief Returns the list of ExperimenterGroupRef elements.
	*
	* No description available in the XSD standard.
	*
	* \return The list of ExperimenterGroupRef elements
	*/
	std::vector<Inscoper::NBO::ExperimenterGroupRefPtr> getExperimenterGroupRef_List() const;

	/*!
	* \brief Adds a new ExperimenterGroupRef element to this object.
	*
	* No description available in the XSD standard.
	*
	* \param value The element to add
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void addToExperimenterGroupRef_List(const Inscoper::NBO::ExperimenterGroupRefPtr& value, bool validate = true);

	/*!
	* \brief Clear the list of ExperimenterGroupRef.
	*
	* No description available in the XSD standard.
	*/
	void clearExperimenterGroupRef_List();

	/*!
	* \brief Sets the list of ROIRef elements.
	*
	* This empty element refers to any predefined four dimensional ROI (Region of Interest) that is associated with this Image.
	*
	* \param value The new list of ROIRef elements
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setROIRef_List(const std::vector<Inscoper::NBO::ROIRefPtr>& value, bool validate = true);

	/*!
	* \brief Returns the list of ROIRef elements.
	*
	* This empty element refers to any predefined four dimensional ROI (Region of Interest) that is associated with this Image.
	*
	* \return The list of ROIRef elements
	*/
	std::vector<Inscoper::NBO::ROIRefPtr> getROIRef_List() const;

	/*!
	* \brief Adds a new ROIRef element to this object.
	*
	* This empty element refers to any predefined four dimensional ROI (Region of Interest) that is associated with this Image.
	*
	* \param value The element to add
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void addToROIRef_List(const Inscoper::NBO::ROIRefPtr& value, bool validate = true);

	/*!
	* \brief Clear the list of ROIRef.
	*
	* This empty element refers to any predefined four dimensional ROI (Region of Interest) that is associated with this Image.
	*/
	void clearROIRef_List();

	/*!
	* \brief Sets the list of StageInsertRef elements.
	*
	* No description available in the XSD standard.
	*
	* \param value The new list of StageInsertRef elements
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setStageInsertRef_List(const std::vector<Inscoper::NBO::StageInsertRefPtr>& value, bool validate = true);

	/*!
	* \brief Returns the list of StageInsertRef elements.
	*
	* No description available in the XSD standard.
	*
	* \return The list of StageInsertRef elements
	*/
	std::vector<Inscoper::NBO::StageInsertRefPtr> getStageInsertRef_List() const;

	/*!
	* \brief Adds a new StageInsertRef element to this object.
	*
	* No description available in the XSD standard.
	*
	* \param value The element to add
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void addToStageInsertRef_List(const Inscoper::NBO::StageInsertRefPtr& value, bool validate = true);

	/*!
	* \brief Clear the list of StageInsertRef.
	*
	* No description available in the XSD standard.
	*/
	void clearStageInsertRef_List();

	/*!
	* \brief Sets the list of FocusStabilizationDeviceRef elements.
	*
	* This empty element refers to the optional Focus Stabilization device that was used for the Acquisition of this Image.
	*
	* \param value The new list of FocusStabilizationDeviceRef elements
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setFocusStabilizationDeviceRef_List(const std::vector<Inscoper::NBO::FocusStabilizationDeviceRefPtr>& value, bool validate = true);

	/*!
	* \brief Returns the list of FocusStabilizationDeviceRef elements.
	*
	* This empty element refers to the optional Focus Stabilization device that was used for the Acquisition of this Image.
	*
	* \return The list of FocusStabilizationDeviceRef elements
	*/
	std::vector<Inscoper::NBO::FocusStabilizationDeviceRefPtr> getFocusStabilizationDeviceRef_List() const;

	/*!
	* \brief Adds a new FocusStabilizationDeviceRef element to this object.
	*
	* This empty element refers to the optional Focus Stabilization device that was used for the Acquisition of this Image.
	*
	* \param value The element to add
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void addToFocusStabilizationDeviceRef_List(const Inscoper::NBO::FocusStabilizationDeviceRefPtr& value, bool validate = true);

	/*!
	* \brief Clear the list of FocusStabilizationDeviceRef.
	*
	* This empty element refers to the optional Focus Stabilization device that was used for the Acquisition of this Image.
	*/
	void clearFocusStabilizationDeviceRef_List();

	/*!
	* \brief Sets the list of AcquisitionSoftwareRef elements.
	*
	* No description available in the XSD standard.
	*
	* \param value The new list of AcquisitionSoftwareRef elements
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setAcquisitionSoftwareRef_List(const std::vector<Inscoper::NBO::AcquisitionSoftwareRefPtr>& value, bool validate = true);

	/*!
	* \brief Returns the list of AcquisitionSoftwareRef elements.
	*
	* No description available in the XSD standard.
	*
	* \return The list of AcquisitionSoftwareRef elements
	*/
	std::vector<Inscoper::NBO::AcquisitionSoftwareRefPtr> getAcquisitionSoftwareRef_List() const;

	/*!
	* \brief Adds a new AcquisitionSoftwareRef element to this object.
	*
	* No description available in the XSD standard.
	*
	* \param value The element to add
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void addToAcquisitionSoftwareRef_List(const Inscoper::NBO::AcquisitionSoftwareRefPtr& value, bool validate = true);

	/*!
	* \brief Clear the list of AcquisitionSoftwareRef.
	*
	* No description available in the XSD standard.
	*/
	void clearAcquisitionSoftwareRef_List();

	/*!
	* \brief Sets the value of the Description element.
	*
	* No description available in the XSD standard.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setDescription(const Inscoper::NBO::DescriptionPtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the Description element.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the element
	*/
	Inscoper::NBO::DescriptionPtr getDescription() const;

	/*!
	* \brief Resets the Description element to an unset state.
	*
	* No description available in the XSD standard.
	*/
	void resetDescription();

	/*!
	* \brief Checks whether the optional Description element is present.
	*
	* No description available in the XSD standard.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasDescription() const;

	/*!
	* \brief Sets the list of ImagingEnvironment elements.
	*
	* No description available in the XSD standard.
	*
	* \param value The new list of ImagingEnvironment elements
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setImagingEnvironment_List(const std::vector<Inscoper::NBO::ImagingEnvironmentPtr>& value, bool validate = true);

	/*!
	* \brief Returns the list of ImagingEnvironment elements.
	*
	* No description available in the XSD standard.
	*
	* \return The list of ImagingEnvironment elements
	*/
	std::vector<Inscoper::NBO::ImagingEnvironmentPtr> getImagingEnvironment_List() const;

	/*!
	* \brief Adds a new ImagingEnvironment element to this object.
	*
	* No description available in the XSD standard.
	*
	* \param value The element to add
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void addToImagingEnvironment_List(const Inscoper::NBO::ImagingEnvironmentPtr& value, bool validate = true);

	/*!
	* \brief Clear the list of ImagingEnvironment.
	*
	* No description available in the XSD standard.
	*/
	void clearImagingEnvironment_List();

	/*!
	* \brief Sets the value of the MicroscopeStandSettings element.
	*
	* No description available in the XSD standard.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setMicroscopeStandSettings(const Inscoper::NBO::MicroscopeStandSettingsPtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the MicroscopeStandSettings element.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the element
	*/
	Inscoper::NBO::MicroscopeStandSettingsPtr getMicroscopeStandSettings() const
;
	/*!
	* \brief Resets the MicroscopeStandSettings element to an unset state.
	*
	* No description available in the XSD standard.
	*/
	void resetMicroscopeStandSettings();

	/*!
	* \brief Checks whether the optional MicroscopeStandSettings element is present.
	*
	* No description available in the XSD standard.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasMicroscopeStandSettings() const;

	/*!
	* \brief Sets the list of MicroscopeTableSettings elements.
	*
	* No description available in the XSD standard.
	*
	* \param value The new list of MicroscopeTableSettings elements
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setMicroscopeTableSettings_List(const std::vector<Inscoper::NBO::MicroscopeTableSettingsPtr>& value, bool validate = true);

	/*!
	* \brief Returns the list of MicroscopeTableSettings elements.
	*
	* No description available in the XSD standard.
	*
	* \return The list of MicroscopeTableSettings elements
	*/
	std::vector<Inscoper::NBO::MicroscopeTableSettingsPtr> getMicroscopeTableSettings_List() const;

	/*!
	* \brief Adds a new MicroscopeTableSettings element to this object.
	*
	* No description available in the XSD standard.
	*
	* \param value The element to add
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void addToMicroscopeTableSettings_List(const Inscoper::NBO::MicroscopeTableSettingsPtr& value, bool validate = true);

	/*!
	* \brief Clear the list of MicroscopeTableSettings.
	*
	* No description available in the XSD standard.
	*/
	void clearMicroscopeTableSettings_List();

	/*!
	* \brief Sets the value of the ObjectiveSettings element.
	*
	* No description available in the XSD standard.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setObjectiveSettings(const Inscoper::NBO::ObjectiveSettingsPtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the ObjectiveSettings element.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the element
	*/
	Inscoper::NBO::ObjectiveSettingsPtr getObjectiveSettings() const
;
	/*!
	* \brief Resets the ObjectiveSettings element to an unset state.
	*
	* No description available in the XSD standard.
	*/
	void resetObjectiveSettings();

	/*!
	* \brief Checks whether the optional ObjectiveSettings element is present.
	*
	* No description available in the XSD standard.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasObjectiveSettings() const;

	/*!
	* \brief Sets the list of StageLabel elements.
	*
	* No description available in the XSD standard.
	*
	* \param value The new list of StageLabel elements
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setStageLabel_List(const std::vector<Inscoper::NBO::StageLabelPtr>& value, bool validate = true);

	/*!
	* \brief Returns the list of StageLabel elements.
	*
	* No description available in the XSD standard.
	*
	* \return The list of StageLabel elements
	*/
	std::vector<Inscoper::NBO::StageLabelPtr> getStageLabel_List() const;

	/*!
	* \brief Adds a new StageLabel element to this object.
	*
	* No description available in the XSD standard.
	*
	* \param value The element to add
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void addToStageLabel_List(const Inscoper::NBO::StageLabelPtr& value, bool validate = true);

	/*!
	* \brief Clear the list of StageLabel.
	*
	* No description available in the XSD standard.
	*/
	void clearStageLabel_List();

	/*!
	* \brief Sets the list of SamplePositioningSettings elements.
	*
	* No description available in the XSD standard.
	*
	* \param value The new list of SamplePositioningSettings elements
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setSamplePositioningSettings_List(const std::vector<Inscoper::NBO::SamplePositioningSettingsPtr>& value, bool validate = true);

	/*!
	* \brief Returns the list of SamplePositioningSettings elements.
	*
	* No description available in the XSD standard.
	*
	* \return The list of SamplePositioningSettings elements
	*/
	std::vector<Inscoper::NBO::SamplePositioningSettingsPtr> getSamplePositioningSettings_List() const;

	/*!
	* \brief Adds a new SamplePositioningSettings element to this object.
	*
	* No description available in the XSD standard.
	*
	* \param value The element to add
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void addToSamplePositioningSettings_List(const Inscoper::NBO::SamplePositioningSettingsPtr& value, bool validate = true);

	/*!
	* \brief Clear the list of SamplePositioningSettings.
	*
	* No description available in the XSD standard.
	*/
	void clearSamplePositioningSettings_List();

	/*!
	* \brief Sets the list of OpticalCalibration elements.
	*
	* No description available in the XSD standard.
	*
	* \param value The new list of OpticalCalibration elements
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setOpticalCalibration_List(const std::vector<Inscoper::NBO::OpticalCalibrationPtr>& value, bool validate = true);

	/*!
	* \brief Returns the list of OpticalCalibration elements.
	*
	* No description available in the XSD standard.
	*
	* \return The list of OpticalCalibration elements
	*/
	std::vector<Inscoper::NBO::OpticalCalibrationPtr> getOpticalCalibration_List() const;

	/*!
	* \brief Adds a new OpticalCalibration element to this object.
	*
	* No description available in the XSD standard.
	*
	* \param value The element to add
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void addToOpticalCalibration_List(const Inscoper::NBO::OpticalCalibrationPtr& value, bool validate = true);

	/*!
	* \brief Clear the list of OpticalCalibration.
	*
	* No description available in the XSD standard.
	*/
	void clearOpticalCalibration_List();

	/*!
	* \brief Sets the list of DetectorCalibration elements.
	*
	* No description available in the XSD standard.
	*
	* \param value The new list of DetectorCalibration elements
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setDetectorCalibration_List(const std::vector<Inscoper::NBO::DetectorCalibrationPtr>& value, bool validate = true);

	/*!
	* \brief Returns the list of DetectorCalibration elements.
	*
	* No description available in the XSD standard.
	*
	* \return The list of DetectorCalibration elements
	*/
	std::vector<Inscoper::NBO::DetectorCalibrationPtr> getDetectorCalibration_List() const;

	/*!
	* \brief Adds a new DetectorCalibration element to this object.
	*
	* No description available in the XSD standard.
	*
	* \param value The element to add
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void addToDetectorCalibration_List(const Inscoper::NBO::DetectorCalibrationPtr& value, bool validate = true);

	/*!
	* \brief Clear the list of DetectorCalibration.
	*
	* No description available in the XSD standard.
	*/
	void clearDetectorCalibration_List();

	/*!
	* \brief Sets the value of the Pixels element.
	*
	* No description available in the XSD standard.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setPixels(const Inscoper::NBO::PixelsPtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the Pixels element.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the element
	*/
	Inscoper::NBO::PixelsPtr getPixels() const
;
	/*!
	* \brief Resets the Pixels element to an unset state.
	*
	* No description available in the XSD standard.
	*/
	void resetPixels();

	/*!
	* \brief Checks whether the optional Pixels element is present.
	*
	* No description available in the XSD standard.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasPixels() const;

	/*!
	* \brief Sets the list of AnnotationRef elements.
	*
	* This is a simple multi-line comment or annotation describing this component.
	*
	* \param value The new list of AnnotationRef elements
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setAnnotationRef_List(const std::vector<Inscoper::NBO::AnnotationRefPtr>& value, bool validate = true);

	/*!
	* \brief Returns the list of AnnotationRef elements.
	*
	* This is a simple multi-line comment or annotation describing this component.
	*
	* \return The list of AnnotationRef elements
	*/
	std::vector<Inscoper::NBO::AnnotationRefPtr> getAnnotationRef_List() const;

	/*!
	* \brief Adds a new AnnotationRef element to this object.
	*
	* This is a simple multi-line comment or annotation describing this component.
	*
	* \param value The element to add
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void addToAnnotationRef_List(const Inscoper::NBO::AnnotationRefPtr& value, bool validate = true);

	/*!
	* \brief Clear the list of AnnotationRef.
	*
	* This is a simple multi-line comment or annotation describing this component.
	*/
	void clearAnnotationRef_List();


private:
	class Impl;
	std::unique_ptr<Impl> pImpl;

	ImageID_TypePtr ID = nullptr; // Required attribute
	Denomination_TypePtr Name = nullptr; // Required attribute
    std::optional<std::string> AcquisitionDate; // Optional attribute
    static const std::set<std::string> AcquisitionDateAllowedValues;
    Inscoper::NBO::InstrumentRefPtr InstrumentRef = nullptr;
    Inscoper::NBO::ExperimentRefPtr ExperimentRef = nullptr;
    std::vector<Inscoper::NBO::ExperimenterRefPtr> ExperimenterRef_List;
    std::vector<Inscoper::NBO::SampleRefPtr> SampleRef_List;
    std::vector<Inscoper::NBO::ExperimenterGroupRefPtr> ExperimenterGroupRef_List;
    std::vector<Inscoper::NBO::ROIRefPtr> ROIRef_List;
    std::vector<Inscoper::NBO::StageInsertRefPtr> StageInsertRef_List;
    std::vector<Inscoper::NBO::FocusStabilizationDeviceRefPtr> FocusStabilizationDeviceRef_List;
    std::vector<Inscoper::NBO::AcquisitionSoftwareRefPtr> AcquisitionSoftwareRef_List;
    Inscoper::NBO::DescriptionPtr Description = nullptr;
    std::vector<Inscoper::NBO::ImagingEnvironmentPtr> ImagingEnvironment_List;
    Inscoper::NBO::MicroscopeStandSettingsPtr MicroscopeStandSettings = nullptr;
    std::vector<Inscoper::NBO::MicroscopeTableSettingsPtr> MicroscopeTableSettings_List;
    Inscoper::NBO::ObjectiveSettingsPtr ObjectiveSettings = nullptr;
    std::vector<Inscoper::NBO::StageLabelPtr> StageLabel_List;
    std::vector<Inscoper::NBO::SamplePositioningSettingsPtr> SamplePositioningSettings_List;
    std::vector<Inscoper::NBO::OpticalCalibrationPtr> OpticalCalibration_List;
    std::vector<Inscoper::NBO::DetectorCalibrationPtr> DetectorCalibration_List;
    Inscoper::NBO::PixelsPtr Pixels = nullptr;
    std::vector<Inscoper::NBO::AnnotationRefPtr> AnnotationRef_List;
};

/*! Shared pointer for Image*/
typedef std::shared_ptr<Image> ImagePtr;

} // namespace Inscoper::NBO

#endif // IMAGE_HPP_INCLUDED