#ifndef EXCITATIONCALIBRATION_HPP_INCLUDED
#define EXCITATIONCALIBRATION_HPP_INCLUDED

#include <iostream>
#include <memory>
#include <optional>
#include <set>
#include <string>
#include <vector>
#include <NBO/NBO/IntensityCalibration_Type.h>
#include <NBO/NBO/UnitsIrradiance_Type.h>
#include <NBO/NBO/UnitsLength_Type.h>
#include <NBO/NBO/UnitsPower_Type.h>
#include <NBO/NBO/ENBOType.h>
#include <NBO/NBOGlobal.h>
#include <NBO/Shared/Base/NBOBaseClass.h>


namespace Inscoper::NBO {

/*!
* \brief Represents the XML element ExcitationCalibration.
*
* This element describes the procedure used to measure and calibrate the Wavelength and Irradiance of the Excitation Light Source used to Acquire this experimental Image and the resulting calibration measurements.
*/
class NBO_EXPORT ExcitationCalibration : public IntensityCalibration_Type {

public:
	
	ExcitationCalibration();
	~ExcitationCalibration();

	/*!
	* \brief Cast a NBOBaseClass to a ExcitationCalibration.
	*
	* \param base The base class to cast
	* \return The casted element, or nullptr if the cast fails
	*/
	static std::shared_ptr<ExcitationCalibration> 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 SpinningDiskInLightPath attribute.
	*
	* In case of a Spinning Disk Confocal Microscope, this field records whether (True) or not (False)  the Spinning Disk was placed in the Light Path during this Calibration Procedure.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setSpinningDiskInLightPath(const bool& value, bool validate = true);

	/*!
	* \brief Returns the value of the SpinningDiskInLightPath attribute.
	*
	* In case of a Spinning Disk Confocal Microscope, this field records whether (True) or not (False)  the Spinning Disk was placed in the Light Path during this Calibration Procedure.
	*
	* \return The value of the attribute
	*/
	bool getSpinningDiskInLightPath() const;

	/*!
	* \brief Resets the SpinningDiskInLightPath attribute to an unset state.
	*
	* In case of a Spinning Disk Confocal Microscope, this field records whether (True) or not (False)  the Spinning Disk was placed in the Light Path during this Calibration Procedure.
	*/
	void resetSpinningDiskInLightPath();

	/*!
	* \brief Checks whether the SpinningDiskInLightPath attribute is present.
	*
	* In case of a Spinning Disk Confocal Microscope, this field records whether (True) or not (False)  the Spinning Disk was placed in the Light Path during this Calibration Procedure.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasSpinningDiskInLightPath() const;

	/*!
	* \brief Sets the value of the NominalEx_Wavelength attribute.
	*
	* In case this is different from the Excitation Wavelength of the Channel this Calibration Procedure is associated with, this field records the Nominal Peak Excitation Wavelength  that is employed during this Procedure.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setNominalEx_Wavelength(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the NominalEx_Wavelength attribute.
	*
	* In case this is different from the Excitation Wavelength of the Channel this Calibration Procedure is associated with, this field records the Nominal Peak Excitation Wavelength  that is employed during this Procedure.
	*
	* \return The value of the attribute
	*/
	float getNominalEx_Wavelength() const;

	/*!
	* \brief Resets the NominalEx_Wavelength attribute to an unset state.
	*
	* In case this is different from the Excitation Wavelength of the Channel this Calibration Procedure is associated with, this field records the Nominal Peak Excitation Wavelength  that is employed during this Procedure.
	*/
	void resetNominalEx_Wavelength();

	/*!
	* \brief Checks whether the NominalEx_Wavelength attribute is present.
	*
	* In case this is different from the Excitation Wavelength of the Channel this Calibration Procedure is associated with, this field records the Nominal Peak Excitation Wavelength  that is employed during this Procedure.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasNominalEx_Wavelength() const;

	/*!
	* \brief Sets the value of the NominalEx_WavelengthUnit attribute.
	*
	* 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 setNominalEx_WavelengthUnit(const Inscoper::NBO::UnitsLength_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the NominalEx_WavelengthUnit attribute.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the attribute
	*/
	UnitsLength_TypePtr getNominalEx_WavelengthUnit() const;

	/*!
	* \brief Resets the NominalEx_WavelengthUnit attribute to an unset state.
	*
	* No description available in the XSD standard.
	*/
	void resetNominalEx_WavelengthUnit();

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

	/*!
	* \brief Sets the value of the ObservedEx_Wavelength attribute.
	*
	* This field records the observed Peak Excitation Wavelength at the Back Objective as measured by using this Calibration Procedure.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setObservedEx_Wavelength(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the ObservedEx_Wavelength attribute.
	*
	* This field records the observed Peak Excitation Wavelength at the Back Objective as measured by using this Calibration Procedure.
	*
	* \return The value of the attribute
	*/
	float getObservedEx_Wavelength() const;

	/*!
	* \brief Resets the ObservedEx_Wavelength attribute to an unset state.
	*
	* This field records the observed Peak Excitation Wavelength at the Back Objective as measured by using this Calibration Procedure.
	*/
	void resetObservedEx_Wavelength();

	/*!
	* \brief Checks whether the ObservedEx_Wavelength attribute is present.
	*
	* This field records the observed Peak Excitation Wavelength at the Back Objective as measured by using this Calibration Procedure.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasObservedEx_Wavelength() const;

	/*!
	* \brief Sets the value of the ObservedEx_WavelengthUnit attribute.
	*
	* 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 setObservedEx_WavelengthUnit(const Inscoper::NBO::UnitsLength_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the ObservedEx_WavelengthUnit attribute.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the attribute
	*/
	UnitsLength_TypePtr getObservedEx_WavelengthUnit() const;

	/*!
	* \brief Resets the ObservedEx_WavelengthUnit attribute to an unset state.
	*
	* No description available in the XSD standard.
	*/
	void resetObservedEx_WavelengthUnit();

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

	/*!
	* \brief Sets the value of the PercentageNominalPowerSettings attribute.
	*
	* This field records the input % Nominal Illumination Power that was set during this Calibration Procedure as by the Manufacturer.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setPercentageNominalPowerSettings(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the PercentageNominalPowerSettings attribute.
	*
	* This field records the input % Nominal Illumination Power that was set during this Calibration Procedure as by the Manufacturer.
	*
	* \return The value of the attribute
	*/
	float getPercentageNominalPowerSettings() const;

	/*!
	* \brief Resets the PercentageNominalPowerSettings attribute to an unset state.
	*
	* This field records the input % Nominal Illumination Power that was set during this Calibration Procedure as by the Manufacturer.
	*/
	void resetPercentageNominalPowerSettings();

	/*!
	* \brief Checks whether the PercentageNominalPowerSettings attribute is present.
	*
	* This field records the input % Nominal Illumination Power that was set during this Calibration Procedure as by the Manufacturer.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasPercentageNominalPowerSettings() const;

	/*!
	* \brief Sets the value of the ObservedIlluminationPowerAtBackOfObjective attribute.
	*
	* This field records the observed excitation Illumination Power (also known as Power Output or Illumination Intensity) as recorded  at the back focal plane of the Objective by using this Calibration Procedure. In order to collect this metric it is necessary to remove the Objective.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setObservedIlluminationPowerAtBackOfObjective(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the ObservedIlluminationPowerAtBackOfObjective attribute.
	*
	* This field records the observed excitation Illumination Power (also known as Power Output or Illumination Intensity) as recorded  at the back focal plane of the Objective by using this Calibration Procedure. In order to collect this metric it is necessary to remove the Objective.
	*
	* \return The value of the attribute
	*/
	float getObservedIlluminationPowerAtBackOfObjective() const;

	/*!
	* \brief Resets the ObservedIlluminationPowerAtBackOfObjective attribute to an unset state.
	*
	* This field records the observed excitation Illumination Power (also known as Power Output or Illumination Intensity) as recorded  at the back focal plane of the Objective by using this Calibration Procedure. In order to collect this metric it is necessary to remove the Objective.
	*/
	void resetObservedIlluminationPowerAtBackOfObjective();

	/*!
	* \brief Checks whether the ObservedIlluminationPowerAtBackOfObjective attribute is present.
	*
	* This field records the observed excitation Illumination Power (also known as Power Output or Illumination Intensity) as recorded  at the back focal plane of the Objective by using this Calibration Procedure. In order to collect this metric it is necessary to remove the Objective.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasObservedIlluminationPowerAtBackOfObjective() const;

	/*!
	* \brief Sets the value of the ObservedIlluminationPowerAtBackObjectiveUnit attribute.
	*
	* 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 setObservedIlluminationPowerAtBackObjectiveUnit(const Inscoper::NBO::UnitsPower_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the ObservedIlluminationPowerAtBackObjectiveUnit attribute.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the attribute
	*/
	UnitsPower_TypePtr getObservedIlluminationPowerAtBackObjectiveUnit() const;

	/*!
	* \brief Resets the ObservedIlluminationPowerAtBackObjectiveUnit attribute to an unset state.
	*
	* No description available in the XSD standard.
	*/
	void resetObservedIlluminationPowerAtBackObjectiveUnit();

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

	/*!
	* \brief Sets the value of the ObseredIlluminationPowerAtSample attribute.
	*
	* This field records the observed excitation Illumination Power (also known as Power Output or Illumination Intensity) as recorded  at the Sample (also referred to as the Front of the Objective) by using this Calibration Procedure. This metric is typically recorded with the Objective in place.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setObseredIlluminationPowerAtSample(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the ObseredIlluminationPowerAtSample attribute.
	*
	* This field records the observed excitation Illumination Power (also known as Power Output or Illumination Intensity) as recorded  at the Sample (also referred to as the Front of the Objective) by using this Calibration Procedure. This metric is typically recorded with the Objective in place.
	*
	* \return The value of the attribute
	*/
	float getObseredIlluminationPowerAtSample() const;

	/*!
	* \brief Resets the ObseredIlluminationPowerAtSample attribute to an unset state.
	*
	* This field records the observed excitation Illumination Power (also known as Power Output or Illumination Intensity) as recorded  at the Sample (also referred to as the Front of the Objective) by using this Calibration Procedure. This metric is typically recorded with the Objective in place.
	*/
	void resetObseredIlluminationPowerAtSample();

	/*!
	* \brief Checks whether the ObseredIlluminationPowerAtSample attribute is present.
	*
	* This field records the observed excitation Illumination Power (also known as Power Output or Illumination Intensity) as recorded  at the Sample (also referred to as the Front of the Objective) by using this Calibration Procedure. This metric is typically recorded with the Objective in place.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasObseredIlluminationPowerAtSample() const;

	/*!
	* \brief Sets the value of the ObseredIlluminationPowerAtSampleUnit attribute.
	*
	* 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 setObseredIlluminationPowerAtSampleUnit(const Inscoper::NBO::UnitsPower_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the ObseredIlluminationPowerAtSampleUnit attribute.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the attribute
	*/
	UnitsPower_TypePtr getObseredIlluminationPowerAtSampleUnit() const;

	/*!
	* \brief Resets the ObseredIlluminationPowerAtSampleUnit attribute to an unset state.
	*
	* No description available in the XSD standard.
	*/
	void resetObseredIlluminationPowerAtSampleUnit();

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

	/*!
	* \brief Sets the value of the ShortTermIlluminationStability attribute.
	*
	* According to ISO 21073:2019, Illumination Stability is defined as the percentage deviation of Minimum and Maximum Illumination Power from the Average Power during the time interval considered. Specifically, SATB [%] = 100x {1-[(Pmax-Pmin)/Pmax+Pmin]}, where Pmax is the maximum laser power recorded during the time interval; and Pmin is the minimum laser power recorded during the time interval. This field records the Short Term Illumination Stability recorded during this Calibration Procedure by measuring Illumination Power every second for a time interval of 5 min of continuous illumination.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setShortTermIlluminationStability(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the ShortTermIlluminationStability attribute.
	*
	* According to ISO 21073:2019, Illumination Stability is defined as the percentage deviation of Minimum and Maximum Illumination Power from the Average Power during the time interval considered. Specifically, SATB [%] = 100x {1-[(Pmax-Pmin)/Pmax+Pmin]}, where Pmax is the maximum laser power recorded during the time interval; and Pmin is the minimum laser power recorded during the time interval. This field records the Short Term Illumination Stability recorded during this Calibration Procedure by measuring Illumination Power every second for a time interval of 5 min of continuous illumination.
	*
	* \return The value of the attribute
	*/
	float getShortTermIlluminationStability() const;

	/*!
	* \brief Resets the ShortTermIlluminationStability attribute to an unset state.
	*
	* According to ISO 21073:2019, Illumination Stability is defined as the percentage deviation of Minimum and Maximum Illumination Power from the Average Power during the time interval considered. Specifically, SATB [%] = 100x {1-[(Pmax-Pmin)/Pmax+Pmin]}, where Pmax is the maximum laser power recorded during the time interval; and Pmin is the minimum laser power recorded during the time interval. This field records the Short Term Illumination Stability recorded during this Calibration Procedure by measuring Illumination Power every second for a time interval of 5 min of continuous illumination.
	*/
	void resetShortTermIlluminationStability();

	/*!
	* \brief Checks whether the ShortTermIlluminationStability attribute is present.
	*
	* According to ISO 21073:2019, Illumination Stability is defined as the percentage deviation of Minimum and Maximum Illumination Power from the Average Power during the time interval considered. Specifically, SATB [%] = 100x {1-[(Pmax-Pmin)/Pmax+Pmin]}, where Pmax is the maximum laser power recorded during the time interval; and Pmin is the minimum laser power recorded during the time interval. This field records the Short Term Illumination Stability recorded during this Calibration Procedure by measuring Illumination Power every second for a time interval of 5 min of continuous illumination.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasShortTermIlluminationStability() const;

	/*!
	* \brief Sets the value of the LongTermIlluminationStability attribute.
	*
	* According to ISO 21073:2019, Illumination Stability is defined as the percentage deviation of Minimum and Maximum Illumination Power from the Average Power during the time interval considered. Specifically, SATB [%] = 100x {1-[(Pmax-Pmin)/Pmax+Pmin]}, where Pmax is the maximum laser power recorded during the time interval; and Pmin is the minimum laser power recorded during the time interval. This field records the Long Term Illumination Stability recorded during this Calibration Procedure by measuring Illumination Power every 30 s for one second for a time interval of 120 min of continuous illumination.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setLongTermIlluminationStability(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the LongTermIlluminationStability attribute.
	*
	* According to ISO 21073:2019, Illumination Stability is defined as the percentage deviation of Minimum and Maximum Illumination Power from the Average Power during the time interval considered. Specifically, SATB [%] = 100x {1-[(Pmax-Pmin)/Pmax+Pmin]}, where Pmax is the maximum laser power recorded during the time interval; and Pmin is the minimum laser power recorded during the time interval. This field records the Long Term Illumination Stability recorded during this Calibration Procedure by measuring Illumination Power every 30 s for one second for a time interval of 120 min of continuous illumination.
	*
	* \return The value of the attribute
	*/
	float getLongTermIlluminationStability() const;

	/*!
	* \brief Resets the LongTermIlluminationStability attribute to an unset state.
	*
	* According to ISO 21073:2019, Illumination Stability is defined as the percentage deviation of Minimum and Maximum Illumination Power from the Average Power during the time interval considered. Specifically, SATB [%] = 100x {1-[(Pmax-Pmin)/Pmax+Pmin]}, where Pmax is the maximum laser power recorded during the time interval; and Pmin is the minimum laser power recorded during the time interval. This field records the Long Term Illumination Stability recorded during this Calibration Procedure by measuring Illumination Power every 30 s for one second for a time interval of 120 min of continuous illumination.
	*/
	void resetLongTermIlluminationStability();

	/*!
	* \brief Checks whether the LongTermIlluminationStability attribute is present.
	*
	* According to ISO 21073:2019, Illumination Stability is defined as the percentage deviation of Minimum and Maximum Illumination Power from the Average Power during the time interval considered. Specifically, SATB [%] = 100x {1-[(Pmax-Pmin)/Pmax+Pmin]}, where Pmax is the maximum laser power recorded during the time interval; and Pmin is the minimum laser power recorded during the time interval. This field records the Long Term Illumination Stability recorded during this Calibration Procedure by measuring Illumination Power every 30 s for one second for a time interval of 120 min of continuous illumination.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasLongTermIlluminationStability() const;

	/*!
	* \brief Sets the value of the IlluminationLinearity attribute.
	*
	* This field captures the Linear Correlation Coefficient of observed Output Illumination Power response to different input Power settings, as measured at the back of the Objective.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setIlluminationLinearity(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the IlluminationLinearity attribute.
	*
	* This field captures the Linear Correlation Coefficient of observed Output Illumination Power response to different input Power settings, as measured at the back of the Objective.
	*
	* \return The value of the attribute
	*/
	float getIlluminationLinearity() const;

	/*!
	* \brief Resets the IlluminationLinearity attribute to an unset state.
	*
	* This field captures the Linear Correlation Coefficient of observed Output Illumination Power response to different input Power settings, as measured at the back of the Objective.
	*/
	void resetIlluminationLinearity();

	/*!
	* \brief Checks whether the IlluminationLinearity attribute is present.
	*
	* This field captures the Linear Correlation Coefficient of observed Output Illumination Power response to different input Power settings, as measured at the back of the Objective.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasIlluminationLinearity() const;

	/*!
	* \brief Sets the value of the ObservedIrradianceAtSample attribute.
	*
	* Observed mean excitation light irradiance (radiant power per unit area) as measured at the sample plane over the Field of View (FOV).
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setObservedIrradianceAtSample(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the ObservedIrradianceAtSample attribute.
	*
	* Observed mean excitation light irradiance (radiant power per unit area) as measured at the sample plane over the Field of View (FOV).
	*
	* \return The value of the attribute
	*/
	float getObservedIrradianceAtSample() const;

	/*!
	* \brief Resets the ObservedIrradianceAtSample attribute to an unset state.
	*
	* Observed mean excitation light irradiance (radiant power per unit area) as measured at the sample plane over the Field of View (FOV).
	*/
	void resetObservedIrradianceAtSample();

	/*!
	* \brief Checks whether the ObservedIrradianceAtSample attribute is present.
	*
	* Observed mean excitation light irradiance (radiant power per unit area) as measured at the sample plane over the Field of View (FOV).
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasObservedIrradianceAtSample() const;

	/*!
	* \brief Sets the value of the ObservedIrradianceAtSampleUnit attribute.
	*
	* 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 setObservedIrradianceAtSampleUnit(const Inscoper::NBO::UnitsIrradiance_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the ObservedIrradianceAtSampleUnit attribute.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the attribute
	*/
	UnitsIrradiance_TypePtr getObservedIrradianceAtSampleUnit() const;

	/*!
	* \brief Resets the ObservedIrradianceAtSampleUnit attribute to an unset state.
	*
	* No description available in the XSD standard.
	*/
	void resetObservedIrradianceAtSampleUnit();

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

	/*!
	* \brief Sets the value of the ObservedIrradianceVariance attribute.
	*
	* Observed excitation light irradiance (radiant power per unit area) variation over the Field of View (FOV).
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setObservedIrradianceVariance(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the ObservedIrradianceVariance attribute.
	*
	* Observed excitation light irradiance (radiant power per unit area) variation over the Field of View (FOV).
	*
	* \return The value of the attribute
	*/
	float getObservedIrradianceVariance() const;

	/*!
	* \brief Resets the ObservedIrradianceVariance attribute to an unset state.
	*
	* Observed excitation light irradiance (radiant power per unit area) variation over the Field of View (FOV).
	*/
	void resetObservedIrradianceVariance();

	/*!
	* \brief Checks whether the ObservedIrradianceVariance attribute is present.
	*
	* Observed excitation light irradiance (radiant power per unit area) variation over the Field of View (FOV).
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasObservedIrradianceVariance() const;


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

    std::optional<bool> SpinningDiskInLightPath; // Optional attribute
    std::optional<float> NominalEx_Wavelength; // Optional attribute
	UnitsLength_TypePtr NominalEx_WavelengthUnit = nullptr; // Optional attribute
    std::optional<float> ObservedEx_Wavelength; // Required attribute
	UnitsLength_TypePtr ObservedEx_WavelengthUnit = nullptr; // Optional attribute
    std::optional<float> PercentageNominalPowerSettings; // Required attribute
    std::optional<float> ObservedIlluminationPowerAtBackOfObjective; // Optional attribute
	UnitsPower_TypePtr ObservedIlluminationPowerAtBackObjectiveUnit = nullptr; // Optional attribute
    std::optional<float> ObseredIlluminationPowerAtSample; // Required attribute
	UnitsPower_TypePtr ObseredIlluminationPowerAtSampleUnit = nullptr; // Optional attribute
    std::optional<float> ShortTermIlluminationStability; // Optional attribute
    std::optional<float> LongTermIlluminationStability; // Optional attribute
    std::optional<float> IlluminationLinearity; // Optional attribute
    std::optional<float> ObservedIrradianceAtSample; // Optional attribute
	UnitsIrradiance_TypePtr ObservedIrradianceAtSampleUnit = nullptr; // Optional attribute
    std::optional<float> ObservedIrradianceVariance; // Optional attribute
};

/*! Shared pointer for ExcitationCalibration*/
typedef std::shared_ptr<ExcitationCalibration> ExcitationCalibrationPtr;

} // namespace Inscoper::NBO

#endif // EXCITATIONCALIBRATION_HPP_INCLUDED