#ifndef OPTICALCALIBRATION_HPP_INCLUDED
#define OPTICALCALIBRATION_HPP_INCLUDED

#include <iostream>
#include <memory>
#include <optional>
#include <set>
#include <string>
#include <vector>
#include <NBO/NBO/CalibrationSoftware.h>
#include <NBO/NBO/ChromaticRegistrationEvaluation.h>
#include <NBO/NBO/FieldUniformityEvaluation.h>
#include <NBO/NBO/FileAnnotation_Type.h>
#include <NBO/NBO/LSID_Type.h>
#include <NBO/NBO/OpticalCalibrationImageRef.h>
#include <NBO/NBO/OpticalCalibrationStandard_Type.h>
#include <NBO/NBO/PositiveInt_Type.h>
#include <NBO/NBO/UnitsLength_Type.h>
#include <NBO/NBO/Reference_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 OpticalCalibration.
*
* This describes the procedure that was used for Optical Calibration and the resulting Calibration measurements.
*/
class NBO_EXPORT OpticalCalibration : public NBOBaseClass {

public:
	/*!
	* \brief Represents the XML element AnnotationRef.
	*
	* This is a simple multi-line comment or annotation describing this component.
	*/
	class NBO_EXPORT InlineAnnotationRef : public Reference_Type {
	
	public:
		
		InlineAnnotationRef();
		~InlineAnnotationRef();
	
		/*!
		* \brief Cast a NBOBaseClass to a InlineAnnotationRef.
		*
		* \param base The base class to cast
		* \return The casted element, or nullptr if the cast fails
		*/
		static std::shared_ptr<InlineAnnotationRef> 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;
	
	
	private:
		class Impl;
		std::unique_ptr<Impl> pImpl;
	
	};
	
	/*! Shared pointer for InlineAnnotationRef*/
	typedef std::shared_ptr<InlineAnnotationRef> InlineAnnotationRefPtr;
	
	
	OpticalCalibration();
	~OpticalCalibration();

	/*!
	* \brief Cast a NBOBaseClass to a OpticalCalibration.
	*
	* \param base The base class to cast
	* \return The casted element, or nullptr if the cast fails
	*/
	static std::shared_ptr<OpticalCalibration> 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 component.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setID(const Inscoper::NBO::LSID_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the ID attribute.
	*
	* A Unique Identifier for this component.
	*
	* \return The value of the attribute
	*/
	LSID_TypePtr getID() const;

	/*!
	* \brief Resets the ID attribute to an unset state.
	*
	* A Unique Identifier for this component.
	*/
	void resetID();

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

	/*!
	* \brief Sets the value of the Date attribute.
	*
	* Ths field records the Date in which this Calibration procedure was performed.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setDate(const std::string& value, bool validate = true);

	/*!
	* \brief Returns the value of the Date attribute.
	*
	* Ths field records the Date in which this Calibration procedure was performed.
	*
	* \return The value of the attribute
	*/
	std::string getDate() const;

	/*!
	* \brief Resets the Date attribute to an unset state.
	*
	* Ths field records the Date in which this Calibration procedure was performed.
	*/
	void resetDate();

	/*!
	* \brief Checks whether the Date attribute is present.
	*
	* Ths field records the Date in which this Calibration procedure was performed.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasDate() const;

	/*!
	* \brief Returns the allowed values for this attribut.
	*
	* Ths field records the Date in which this Calibration procedure was performed.
	*
	* \return The list of allowed values
	*/
	static const std::set<std::string>& getDateAllowedValues();

	/*!
	* \brief Sets the value of the TheoreticalXYSpotSize_FWHM attribute.
	*
	* This field captures the Theoretical (expected) lateral spot size expressed as the Full Width at Half Maximum (FWHM) of the Point Spread Function (PSF) intensity profile fitted using a Gaussian function, on the basis of the given optical conditions. This is a measure of the expected resolution of the system in the xy-plane. This value should be calculated in a manner as to be compared to the Median XY Spot Size_FWHM.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setTheoreticalXYSpotSize_FWHM(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the TheoreticalXYSpotSize_FWHM attribute.
	*
	* This field captures the Theoretical (expected) lateral spot size expressed as the Full Width at Half Maximum (FWHM) of the Point Spread Function (PSF) intensity profile fitted using a Gaussian function, on the basis of the given optical conditions. This is a measure of the expected resolution of the system in the xy-plane. This value should be calculated in a manner as to be compared to the Median XY Spot Size_FWHM.
	*
	* \return The value of the attribute
	*/
	float getTheoreticalXYSpotSize_FWHM() const;

	/*!
	* \brief Resets the TheoreticalXYSpotSize_FWHM attribute to an unset state.
	*
	* This field captures the Theoretical (expected) lateral spot size expressed as the Full Width at Half Maximum (FWHM) of the Point Spread Function (PSF) intensity profile fitted using a Gaussian function, on the basis of the given optical conditions. This is a measure of the expected resolution of the system in the xy-plane. This value should be calculated in a manner as to be compared to the Median XY Spot Size_FWHM.
	*/
	void resetTheoreticalXYSpotSize_FWHM();

	/*!
	* \brief Checks whether the TheoreticalXYSpotSize_FWHM attribute is present.
	*
	* This field captures the Theoretical (expected) lateral spot size expressed as the Full Width at Half Maximum (FWHM) of the Point Spread Function (PSF) intensity profile fitted using a Gaussian function, on the basis of the given optical conditions. This is a measure of the expected resolution of the system in the xy-plane. This value should be calculated in a manner as to be compared to the Median XY Spot Size_FWHM.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasTheoreticalXYSpotSize_FWHM() const;

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

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

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

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

	/*!
	* \brief Sets the value of the MedianXYSpotSize_FWHM attribute.
	*
	* An important way of evaluating the effective resolution of any Microscope, consists in measuring the size and shape of the observed Point Spread Function (PSF) generated by imaging one or more fluorescent Point-like objects (i.e., Point Emitters) under conditions that are identical to those used to Acquire a given experimental Image. More specifically and according to ISO 21073:2019, lateral Resolution is defined by the FWHM of the intensity signal along a lateral direction through the centre of a fluorescent Point-like object (i.e., Spot or Point Emitter) positioned at the center of the Field of View (FOV). This field captures the average Observed Median lateral (i.e., in the xy-plane) Spot Sze expressed as the Full Width at Half Maximum (FWHM) of the Point Spread Function (PSF) intensity profile fitted using an Elliptic Gaussian function. Ideally this measurement should be reflective of multiple individual Point Emitter observations across the Field of View (FOV). However, if a single measurement is taken, it is essential that this be taken from the center of the Objective FOV.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setMedianXYSpotSize_FWHM(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the MedianXYSpotSize_FWHM attribute.
	*
	* An important way of evaluating the effective resolution of any Microscope, consists in measuring the size and shape of the observed Point Spread Function (PSF) generated by imaging one or more fluorescent Point-like objects (i.e., Point Emitters) under conditions that are identical to those used to Acquire a given experimental Image. More specifically and according to ISO 21073:2019, lateral Resolution is defined by the FWHM of the intensity signal along a lateral direction through the centre of a fluorescent Point-like object (i.e., Spot or Point Emitter) positioned at the center of the Field of View (FOV). This field captures the average Observed Median lateral (i.e., in the xy-plane) Spot Sze expressed as the Full Width at Half Maximum (FWHM) of the Point Spread Function (PSF) intensity profile fitted using an Elliptic Gaussian function. Ideally this measurement should be reflective of multiple individual Point Emitter observations across the Field of View (FOV). However, if a single measurement is taken, it is essential that this be taken from the center of the Objective FOV.
	*
	* \return The value of the attribute
	*/
	float getMedianXYSpotSize_FWHM() const;

	/*!
	* \brief Resets the MedianXYSpotSize_FWHM attribute to an unset state.
	*
	* An important way of evaluating the effective resolution of any Microscope, consists in measuring the size and shape of the observed Point Spread Function (PSF) generated by imaging one or more fluorescent Point-like objects (i.e., Point Emitters) under conditions that are identical to those used to Acquire a given experimental Image. More specifically and according to ISO 21073:2019, lateral Resolution is defined by the FWHM of the intensity signal along a lateral direction through the centre of a fluorescent Point-like object (i.e., Spot or Point Emitter) positioned at the center of the Field of View (FOV). This field captures the average Observed Median lateral (i.e., in the xy-plane) Spot Sze expressed as the Full Width at Half Maximum (FWHM) of the Point Spread Function (PSF) intensity profile fitted using an Elliptic Gaussian function. Ideally this measurement should be reflective of multiple individual Point Emitter observations across the Field of View (FOV). However, if a single measurement is taken, it is essential that this be taken from the center of the Objective FOV.
	*/
	void resetMedianXYSpotSize_FWHM();

	/*!
	* \brief Checks whether the MedianXYSpotSize_FWHM attribute is present.
	*
	* An important way of evaluating the effective resolution of any Microscope, consists in measuring the size and shape of the observed Point Spread Function (PSF) generated by imaging one or more fluorescent Point-like objects (i.e., Point Emitters) under conditions that are identical to those used to Acquire a given experimental Image. More specifically and according to ISO 21073:2019, lateral Resolution is defined by the FWHM of the intensity signal along a lateral direction through the centre of a fluorescent Point-like object (i.e., Spot or Point Emitter) positioned at the center of the Field of View (FOV). This field captures the average Observed Median lateral (i.e., in the xy-plane) Spot Sze expressed as the Full Width at Half Maximum (FWHM) of the Point Spread Function (PSF) intensity profile fitted using an Elliptic Gaussian function. Ideally this measurement should be reflective of multiple individual Point Emitter observations across the Field of View (FOV). However, if a single measurement is taken, it is essential that this be taken from the center of the Objective FOV.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasMedianXYSpotSize_FWHM() const;

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

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

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

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

	/*!
	* \brief Sets the value of the MinXYSpotSize_FWHM attribute.
	*
	* An important way of evaluating the effective resolution of any Microscope, consists in measuring the size and shape of the observed Point Spread Function (PSF) generated by imaging one or more fluorescent Point-like objects (i.e., Point Emitters) under conditions that are identical to those used to Acquire a given experimental Image. More specifically and according to ISO 21073:2019, lateral Resolution is defined by the FWHM of the intensity signal along a lateral direction through the centre of a fluorescent Point-like object (i.e., Spot or Point Emitter) positioned at the center of the Field of View (FOV). This field captures the average Observed Minimum lateral (i.e., in the xy-plane) Spot Sze expressed as the Full Width at Half Maximum (FWHM) of the Point Spread Function (PSF) intensity profile fitted using an Elliptic Gaussian function. Ideally this measurement should be reflective of multiple individual Point Emitter observations across the Field of View (FOV). However, if a single measurement is taken, it is essential that this be taken from the center of the Objective FOV.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setMinXYSpotSize_FWHM(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the MinXYSpotSize_FWHM attribute.
	*
	* An important way of evaluating the effective resolution of any Microscope, consists in measuring the size and shape of the observed Point Spread Function (PSF) generated by imaging one or more fluorescent Point-like objects (i.e., Point Emitters) under conditions that are identical to those used to Acquire a given experimental Image. More specifically and according to ISO 21073:2019, lateral Resolution is defined by the FWHM of the intensity signal along a lateral direction through the centre of a fluorescent Point-like object (i.e., Spot or Point Emitter) positioned at the center of the Field of View (FOV). This field captures the average Observed Minimum lateral (i.e., in the xy-plane) Spot Sze expressed as the Full Width at Half Maximum (FWHM) of the Point Spread Function (PSF) intensity profile fitted using an Elliptic Gaussian function. Ideally this measurement should be reflective of multiple individual Point Emitter observations across the Field of View (FOV). However, if a single measurement is taken, it is essential that this be taken from the center of the Objective FOV.
	*
	* \return The value of the attribute
	*/
	float getMinXYSpotSize_FWHM() const;

	/*!
	* \brief Resets the MinXYSpotSize_FWHM attribute to an unset state.
	*
	* An important way of evaluating the effective resolution of any Microscope, consists in measuring the size and shape of the observed Point Spread Function (PSF) generated by imaging one or more fluorescent Point-like objects (i.e., Point Emitters) under conditions that are identical to those used to Acquire a given experimental Image. More specifically and according to ISO 21073:2019, lateral Resolution is defined by the FWHM of the intensity signal along a lateral direction through the centre of a fluorescent Point-like object (i.e., Spot or Point Emitter) positioned at the center of the Field of View (FOV). This field captures the average Observed Minimum lateral (i.e., in the xy-plane) Spot Sze expressed as the Full Width at Half Maximum (FWHM) of the Point Spread Function (PSF) intensity profile fitted using an Elliptic Gaussian function. Ideally this measurement should be reflective of multiple individual Point Emitter observations across the Field of View (FOV). However, if a single measurement is taken, it is essential that this be taken from the center of the Objective FOV.
	*/
	void resetMinXYSpotSize_FWHM();

	/*!
	* \brief Checks whether the MinXYSpotSize_FWHM attribute is present.
	*
	* An important way of evaluating the effective resolution of any Microscope, consists in measuring the size and shape of the observed Point Spread Function (PSF) generated by imaging one or more fluorescent Point-like objects (i.e., Point Emitters) under conditions that are identical to those used to Acquire a given experimental Image. More specifically and according to ISO 21073:2019, lateral Resolution is defined by the FWHM of the intensity signal along a lateral direction through the centre of a fluorescent Point-like object (i.e., Spot or Point Emitter) positioned at the center of the Field of View (FOV). This field captures the average Observed Minimum lateral (i.e., in the xy-plane) Spot Sze expressed as the Full Width at Half Maximum (FWHM) of the Point Spread Function (PSF) intensity profile fitted using an Elliptic Gaussian function. Ideally this measurement should be reflective of multiple individual Point Emitter observations across the Field of View (FOV). However, if a single measurement is taken, it is essential that this be taken from the center of the Objective FOV.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasMinXYSpotSize_FWHM() const;

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

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

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

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

	/*!
	* \brief Sets the value of the MaxXYSpotSize_FWHM attribute.
	*
	* An important way of evaluating the effective resolution of any Microscope, consists in measuring the size and shape of the observed Point Spread Function (PSF) generated by imaging one or more fluorescent Point-like objects (i.e., Point Emitters) under conditions that are identical to those used to Acquire a given experimental Image. More specifically and according to ISO 21073:2019, lateral Resolution is defined by the FWHM of the intensity signal along a lateral direction through the centre of a fluorescent Point-like object (i.e., Spot or Point Emitter) positioned at the center of the Field of View (FOV). This field captures the average Observed Maximum lateral (i.e., in the xy-plane) Spot Sze expressed as the Full Width at Half Maximum (FWHM) of the Point Spread Function (PSF) intensity profile fitted using an Elliptic Gaussian function. Ideally this measurement should be reflective of multiple individual Point Emitter observations across the Field of View (FOV). However, if a single measurement is taken, it is essential that this be taken from the center of the Objective FOV.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setMaxXYSpotSize_FWHM(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the MaxXYSpotSize_FWHM attribute.
	*
	* An important way of evaluating the effective resolution of any Microscope, consists in measuring the size and shape of the observed Point Spread Function (PSF) generated by imaging one or more fluorescent Point-like objects (i.e., Point Emitters) under conditions that are identical to those used to Acquire a given experimental Image. More specifically and according to ISO 21073:2019, lateral Resolution is defined by the FWHM of the intensity signal along a lateral direction through the centre of a fluorescent Point-like object (i.e., Spot or Point Emitter) positioned at the center of the Field of View (FOV). This field captures the average Observed Maximum lateral (i.e., in the xy-plane) Spot Sze expressed as the Full Width at Half Maximum (FWHM) of the Point Spread Function (PSF) intensity profile fitted using an Elliptic Gaussian function. Ideally this measurement should be reflective of multiple individual Point Emitter observations across the Field of View (FOV). However, if a single measurement is taken, it is essential that this be taken from the center of the Objective FOV.
	*
	* \return The value of the attribute
	*/
	float getMaxXYSpotSize_FWHM() const;

	/*!
	* \brief Resets the MaxXYSpotSize_FWHM attribute to an unset state.
	*
	* An important way of evaluating the effective resolution of any Microscope, consists in measuring the size and shape of the observed Point Spread Function (PSF) generated by imaging one or more fluorescent Point-like objects (i.e., Point Emitters) under conditions that are identical to those used to Acquire a given experimental Image. More specifically and according to ISO 21073:2019, lateral Resolution is defined by the FWHM of the intensity signal along a lateral direction through the centre of a fluorescent Point-like object (i.e., Spot or Point Emitter) positioned at the center of the Field of View (FOV). This field captures the average Observed Maximum lateral (i.e., in the xy-plane) Spot Sze expressed as the Full Width at Half Maximum (FWHM) of the Point Spread Function (PSF) intensity profile fitted using an Elliptic Gaussian function. Ideally this measurement should be reflective of multiple individual Point Emitter observations across the Field of View (FOV). However, if a single measurement is taken, it is essential that this be taken from the center of the Objective FOV.
	*/
	void resetMaxXYSpotSize_FWHM();

	/*!
	* \brief Checks whether the MaxXYSpotSize_FWHM attribute is present.
	*
	* An important way of evaluating the effective resolution of any Microscope, consists in measuring the size and shape of the observed Point Spread Function (PSF) generated by imaging one or more fluorescent Point-like objects (i.e., Point Emitters) under conditions that are identical to those used to Acquire a given experimental Image. More specifically and according to ISO 21073:2019, lateral Resolution is defined by the FWHM of the intensity signal along a lateral direction through the centre of a fluorescent Point-like object (i.e., Spot or Point Emitter) positioned at the center of the Field of View (FOV). This field captures the average Observed Maximum lateral (i.e., in the xy-plane) Spot Sze expressed as the Full Width at Half Maximum (FWHM) of the Point Spread Function (PSF) intensity profile fitted using an Elliptic Gaussian function. Ideally this measurement should be reflective of multiple individual Point Emitter observations across the Field of View (FOV). However, if a single measurement is taken, it is essential that this be taken from the center of the Objective FOV.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasMaxXYSpotSize_FWHM() const;

	/*!
	* \brief Sets the value of the MaxXYSpotSize_FWHMUnit 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 setMaxXYSpotSize_FWHMUnit(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the MaxXYSpotSize_FWHMUnit attribute.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the attribute
	*/
	float getMaxXYSpotSize_FWHMUnit() const;

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

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

	/*!
	* \brief Sets the value of the TheoreticaZSpotSize_FWHM attribute.
	*
	* This field captures the Theoretical (expected) z-axial spot size expressed as the Full Width at Half Maximum (FWHM) of the Point Spread Function (PSF) intensity profile fitted using a Gaussian function, on the basis of the given optical conditions. This is a measure of the expected resolution of the system in the z-plane. This value should be used calculated in a manner as to be compared to the median Z spot size.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setTheoreticaZSpotSize_FWHM(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the TheoreticaZSpotSize_FWHM attribute.
	*
	* This field captures the Theoretical (expected) z-axial spot size expressed as the Full Width at Half Maximum (FWHM) of the Point Spread Function (PSF) intensity profile fitted using a Gaussian function, on the basis of the given optical conditions. This is a measure of the expected resolution of the system in the z-plane. This value should be used calculated in a manner as to be compared to the median Z spot size.
	*
	* \return The value of the attribute
	*/
	float getTheoreticaZSpotSize_FWHM() const;

	/*!
	* \brief Resets the TheoreticaZSpotSize_FWHM attribute to an unset state.
	*
	* This field captures the Theoretical (expected) z-axial spot size expressed as the Full Width at Half Maximum (FWHM) of the Point Spread Function (PSF) intensity profile fitted using a Gaussian function, on the basis of the given optical conditions. This is a measure of the expected resolution of the system in the z-plane. This value should be used calculated in a manner as to be compared to the median Z spot size.
	*/
	void resetTheoreticaZSpotSize_FWHM();

	/*!
	* \brief Checks whether the TheoreticaZSpotSize_FWHM attribute is present.
	*
	* This field captures the Theoretical (expected) z-axial spot size expressed as the Full Width at Half Maximum (FWHM) of the Point Spread Function (PSF) intensity profile fitted using a Gaussian function, on the basis of the given optical conditions. This is a measure of the expected resolution of the system in the z-plane. This value should be used calculated in a manner as to be compared to the median Z spot size.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasTheoreticaZSpotSize_FWHM() const;

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

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

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

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

	/*!
	* \brief Sets the value of the MedianZSpotSize_FWHM attribute.
	*
	* An important way of evaluating the effective resolution of any Microscope, consists in measuring the size and shape of the observed Point Spread Function (PSF) generated by imaging one or more fluorescent Point-like objects (i.e., Point Emitters) under conditions that are identical to those used to Acquire a given experimental Image. More specifically and according to ISO 21073:2019, axial Resolution is defined by the FWHM of the intensity signal along the axial direction through the centre of a fluorescent Point-like object (i.e., Spot or Point Emitter) positioned at the center of the Field of View (FOV). This field captures the average Observed Median Z-axial Spot Sze expressed as the Full Width at Half Maximum (FWHM) of the Point Spread Function (PSF) intensity profile fitted using an Elliptic Gaussian function. Ideally this measurement should be reflective of multiple individual Point Emitter observations across the Field of View (FOV). However, if a single measurement is taken, it is essential that this be taken from the center of the Objective FOV.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setMedianZSpotSize_FWHM(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the MedianZSpotSize_FWHM attribute.
	*
	* An important way of evaluating the effective resolution of any Microscope, consists in measuring the size and shape of the observed Point Spread Function (PSF) generated by imaging one or more fluorescent Point-like objects (i.e., Point Emitters) under conditions that are identical to those used to Acquire a given experimental Image. More specifically and according to ISO 21073:2019, axial Resolution is defined by the FWHM of the intensity signal along the axial direction through the centre of a fluorescent Point-like object (i.e., Spot or Point Emitter) positioned at the center of the Field of View (FOV). This field captures the average Observed Median Z-axial Spot Sze expressed as the Full Width at Half Maximum (FWHM) of the Point Spread Function (PSF) intensity profile fitted using an Elliptic Gaussian function. Ideally this measurement should be reflective of multiple individual Point Emitter observations across the Field of View (FOV). However, if a single measurement is taken, it is essential that this be taken from the center of the Objective FOV.
	*
	* \return The value of the attribute
	*/
	float getMedianZSpotSize_FWHM() const;

	/*!
	* \brief Resets the MedianZSpotSize_FWHM attribute to an unset state.
	*
	* An important way of evaluating the effective resolution of any Microscope, consists in measuring the size and shape of the observed Point Spread Function (PSF) generated by imaging one or more fluorescent Point-like objects (i.e., Point Emitters) under conditions that are identical to those used to Acquire a given experimental Image. More specifically and according to ISO 21073:2019, axial Resolution is defined by the FWHM of the intensity signal along the axial direction through the centre of a fluorescent Point-like object (i.e., Spot or Point Emitter) positioned at the center of the Field of View (FOV). This field captures the average Observed Median Z-axial Spot Sze expressed as the Full Width at Half Maximum (FWHM) of the Point Spread Function (PSF) intensity profile fitted using an Elliptic Gaussian function. Ideally this measurement should be reflective of multiple individual Point Emitter observations across the Field of View (FOV). However, if a single measurement is taken, it is essential that this be taken from the center of the Objective FOV.
	*/
	void resetMedianZSpotSize_FWHM();

	/*!
	* \brief Checks whether the MedianZSpotSize_FWHM attribute is present.
	*
	* An important way of evaluating the effective resolution of any Microscope, consists in measuring the size and shape of the observed Point Spread Function (PSF) generated by imaging one or more fluorescent Point-like objects (i.e., Point Emitters) under conditions that are identical to those used to Acquire a given experimental Image. More specifically and according to ISO 21073:2019, axial Resolution is defined by the FWHM of the intensity signal along the axial direction through the centre of a fluorescent Point-like object (i.e., Spot or Point Emitter) positioned at the center of the Field of View (FOV). This field captures the average Observed Median Z-axial Spot Sze expressed as the Full Width at Half Maximum (FWHM) of the Point Spread Function (PSF) intensity profile fitted using an Elliptic Gaussian function. Ideally this measurement should be reflective of multiple individual Point Emitter observations across the Field of View (FOV). However, if a single measurement is taken, it is essential that this be taken from the center of the Objective FOV.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasMedianZSpotSize_FWHM() const;

	/*!
	* \brief Sets the value of the MedianZSpotSize_FWHMUnit 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 setMedianZSpotSize_FWHMUnit(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the MedianZSpotSize_FWHMUnit attribute.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the attribute
	*/
	float getMedianZSpotSize_FWHMUnit() const;

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

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

	/*!
	* \brief Sets the value of the CheckedNA attribute.
	*
	* In case the Numerical Aperture (NA) of the Objective utilized to perform this Optical Calibration is variable (i.e., as for example in case of Objectives that can be used with or without Cover Glass or Objectives that can be dipped in different media), this field capture whether (True) or not (False) a manual check was performed to confirm that the Numerical Aperture was set to the Maximum allowable value. This check is necessary because often NA regulation in these types of Objectives occurs via a rotating collar whose exact position is difficult to measure and reproduce across different Experiments. In this context, setting the collar to the Maximum NA position is desirable not only because it is more easy to reproduce and it best to estimate the maximal resolution of the system.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setCheckedNA(const bool& value, bool validate = true);

	/*!
	* \brief Returns the value of the CheckedNA attribute.
	*
	* In case the Numerical Aperture (NA) of the Objective utilized to perform this Optical Calibration is variable (i.e., as for example in case of Objectives that can be used with or without Cover Glass or Objectives that can be dipped in different media), this field capture whether (True) or not (False) a manual check was performed to confirm that the Numerical Aperture was set to the Maximum allowable value. This check is necessary because often NA regulation in these types of Objectives occurs via a rotating collar whose exact position is difficult to measure and reproduce across different Experiments. In this context, setting the collar to the Maximum NA position is desirable not only because it is more easy to reproduce and it best to estimate the maximal resolution of the system.
	*
	* \return The value of the attribute
	*/
	bool getCheckedNA() const;

	/*!
	* \brief Resets the CheckedNA attribute to an unset state.
	*
	* In case the Numerical Aperture (NA) of the Objective utilized to perform this Optical Calibration is variable (i.e., as for example in case of Objectives that can be used with or without Cover Glass or Objectives that can be dipped in different media), this field capture whether (True) or not (False) a manual check was performed to confirm that the Numerical Aperture was set to the Maximum allowable value. This check is necessary because often NA regulation in these types of Objectives occurs via a rotating collar whose exact position is difficult to measure and reproduce across different Experiments. In this context, setting the collar to the Maximum NA position is desirable not only because it is more easy to reproduce and it best to estimate the maximal resolution of the system.
	*/
	void resetCheckedNA();

	/*!
	* \brief Checks whether the CheckedNA attribute is present.
	*
	* In case the Numerical Aperture (NA) of the Objective utilized to perform this Optical Calibration is variable (i.e., as for example in case of Objectives that can be used with or without Cover Glass or Objectives that can be dipped in different media), this field capture whether (True) or not (False) a manual check was performed to confirm that the Numerical Aperture was set to the Maximum allowable value. This check is necessary because often NA regulation in these types of Objectives occurs via a rotating collar whose exact position is difficult to measure and reproduce across different Experiments. In this context, setting the collar to the Maximum NA position is desirable not only because it is more easy to reproduce and it best to estimate the maximal resolution of the system.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasCheckedNA() const;

	/*!
	* \brief Sets the value of the Z_Dimension attribute.
	*
	* This field records whether (True) or not (False) this Optical Calibration procedure was performed using XY or XYZ Images of the Optical Standard sample.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setZ_Dimension(const bool& value, bool validate = true);

	/*!
	* \brief Returns the value of the Z_Dimension attribute.
	*
	* This field records whether (True) or not (False) this Optical Calibration procedure was performed using XY or XYZ Images of the Optical Standard sample.
	*
	* \return The value of the attribute
	*/
	bool getZ_Dimension() const;

	/*!
	* \brief Resets the Z_Dimension attribute to an unset state.
	*
	* This field records whether (True) or not (False) this Optical Calibration procedure was performed using XY or XYZ Images of the Optical Standard sample.
	*/
	void resetZ_Dimension();

	/*!
	* \brief Checks whether the Z_Dimension attribute is present.
	*
	* This field records whether (True) or not (False) this Optical Calibration procedure was performed using XY or XYZ Images of the Optical Standard sample.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasZ_Dimension() const;

	/*!
	* \brief Sets the value of the NyquistRate attribute.
	*
	* This field captures the ratio between the Pixel Size and the Nyquist Criterion. The Nyquist-Shannon sampling theorem establishes that 'when sampling a signal (e.g., converting from an analog signal to digital), the sampling frequency must be greater than twice the Band Width of the input signal in order to be able to reconstruct the original perfectly from the sampled version' (Whittaker E.T., (1915). Proc. Roy. Soc. Edinburgh Sect. A, 25:181; Shannon C.E., (1949) Proc. IRE, 37:10). The Nyquist Criterion determines the minimal Sampling Density needed to capture ALL information from the Specimen into the Image. It can be shown that if the Sampling Density is higher than the Nyquist Rate (also referred to as Critical Sampling Distance) all information about the object is captured. It is important to note that the Nyquist Rate depends on the Objective Numerical Aperture (NA) and on the Excitation and Emission WaveLengths. The recommended Nyquist Rate is > 2 for conventional light microscopy, and it is 2.5 - 3 for high resolution imaging.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setNyquistRate(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the NyquistRate attribute.
	*
	* This field captures the ratio between the Pixel Size and the Nyquist Criterion. The Nyquist-Shannon sampling theorem establishes that 'when sampling a signal (e.g., converting from an analog signal to digital), the sampling frequency must be greater than twice the Band Width of the input signal in order to be able to reconstruct the original perfectly from the sampled version' (Whittaker E.T., (1915). Proc. Roy. Soc. Edinburgh Sect. A, 25:181; Shannon C.E., (1949) Proc. IRE, 37:10). The Nyquist Criterion determines the minimal Sampling Density needed to capture ALL information from the Specimen into the Image. It can be shown that if the Sampling Density is higher than the Nyquist Rate (also referred to as Critical Sampling Distance) all information about the object is captured. It is important to note that the Nyquist Rate depends on the Objective Numerical Aperture (NA) and on the Excitation and Emission WaveLengths. The recommended Nyquist Rate is > 2 for conventional light microscopy, and it is 2.5 - 3 for high resolution imaging.
	*
	* \return The value of the attribute
	*/
	float getNyquistRate() const;

	/*!
	* \brief Resets the NyquistRate attribute to an unset state.
	*
	* This field captures the ratio between the Pixel Size and the Nyquist Criterion. The Nyquist-Shannon sampling theorem establishes that 'when sampling a signal (e.g., converting from an analog signal to digital), the sampling frequency must be greater than twice the Band Width of the input signal in order to be able to reconstruct the original perfectly from the sampled version' (Whittaker E.T., (1915). Proc. Roy. Soc. Edinburgh Sect. A, 25:181; Shannon C.E., (1949) Proc. IRE, 37:10). The Nyquist Criterion determines the minimal Sampling Density needed to capture ALL information from the Specimen into the Image. It can be shown that if the Sampling Density is higher than the Nyquist Rate (also referred to as Critical Sampling Distance) all information about the object is captured. It is important to note that the Nyquist Rate depends on the Objective Numerical Aperture (NA) and on the Excitation and Emission WaveLengths. The recommended Nyquist Rate is > 2 for conventional light microscopy, and it is 2.5 - 3 for high resolution imaging.
	*/
	void resetNyquistRate();

	/*!
	* \brief Checks whether the NyquistRate attribute is present.
	*
	* This field captures the ratio between the Pixel Size and the Nyquist Criterion. The Nyquist-Shannon sampling theorem establishes that 'when sampling a signal (e.g., converting from an analog signal to digital), the sampling frequency must be greater than twice the Band Width of the input signal in order to be able to reconstruct the original perfectly from the sampled version' (Whittaker E.T., (1915). Proc. Roy. Soc. Edinburgh Sect. A, 25:181; Shannon C.E., (1949) Proc. IRE, 37:10). The Nyquist Criterion determines the minimal Sampling Density needed to capture ALL information from the Specimen into the Image. It can be shown that if the Sampling Density is higher than the Nyquist Rate (also referred to as Critical Sampling Distance) all information about the object is captured. It is important to note that the Nyquist Rate depends on the Objective Numerical Aperture (NA) and on the Excitation and Emission WaveLengths. The recommended Nyquist Rate is > 2 for conventional light microscopy, and it is 2.5 - 3 for high resolution imaging.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasNyquistRate() const;

	/*!
	* \brief Sets the value of the SampleSize attribute.
	*
	* This field captures the Sample size that was used to calculate the reported Optical Calibration metrics. For example, this might represent the number of Colored Beads that were utilized to gather data on the Optical performance of the Microscope.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setSampleSize(const Inscoper::NBO::PositiveInt_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the SampleSize attribute.
	*
	* This field captures the Sample size that was used to calculate the reported Optical Calibration metrics. For example, this might represent the number of Colored Beads that were utilized to gather data on the Optical performance of the Microscope.
	*
	* \return The value of the attribute
	*/
	PositiveInt_TypePtr getSampleSize() const;

	/*!
	* \brief Resets the SampleSize attribute to an unset state.
	*
	* This field captures the Sample size that was used to calculate the reported Optical Calibration metrics. For example, this might represent the number of Colored Beads that were utilized to gather data on the Optical performance of the Microscope.
	*/
	void resetSampleSize();

	/*!
	* \brief Checks whether the optional SampleSize attribute is present.
	*
	* This field captures the Sample size that was used to calculate the reported Optical Calibration metrics. For example, this might represent the number of Colored Beads that were utilized to gather data on the Optical performance of the Microscope.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasSampleSize() const;

	/*!
	* \brief Sets the value of the PSFEquation attribute.
	*
	* This field captures the Equation that was used to perform the Eliptical PSF Gaussian Fit.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setPSFEquation(const std::string& value, bool validate = true);

	/*!
	* \brief Returns the value of the PSFEquation attribute.
	*
	* This field captures the Equation that was used to perform the Eliptical PSF Gaussian Fit.
	*
	* \return The value of the attribute
	*/
	std::string getPSFEquation() const;

	/*!
	* \brief Resets the PSFEquation attribute to an unset state.
	*
	* This field captures the Equation that was used to perform the Eliptical PSF Gaussian Fit.
	*/
	void resetPSFEquation();

	/*!
	* \brief Checks whether the PSFEquation attribute is present.
	*
	* This field captures the Equation that was used to perform the Eliptical PSF Gaussian Fit.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasPSFEquation() const;

	/*!
	* \brief Returns the allowed values for this attribut.
	*
	* This field captures the Equation that was used to perform the Eliptical PSF Gaussian Fit.
	*
	* \return The list of allowed values
	*/
	static const std::set<std::string>& getPSFEquationAllowedValues();

	/*!
	* \brief Sets the value of the Planarity attribute.
	*
	* This is a measure of the flatness of the focal plane across the Field of View (FOV). The planarity of the focal plane is calculated from the observed z-position of the best focus of each Point Emitter. It indicates focal aberrations or tilt. Ideally this measurement should be reflective of multiple individual Point Emitter observations across the Field of View (FOV). However, if a single measurement is taken, it is essential that this be taken from the center of the Objective FOV.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setPlanarity(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the Planarity attribute.
	*
	* This is a measure of the flatness of the focal plane across the Field of View (FOV). The planarity of the focal plane is calculated from the observed z-position of the best focus of each Point Emitter. It indicates focal aberrations or tilt. Ideally this measurement should be reflective of multiple individual Point Emitter observations across the Field of View (FOV). However, if a single measurement is taken, it is essential that this be taken from the center of the Objective FOV.
	*
	* \return The value of the attribute
	*/
	float getPlanarity() const;

	/*!
	* \brief Resets the Planarity attribute to an unset state.
	*
	* This is a measure of the flatness of the focal plane across the Field of View (FOV). The planarity of the focal plane is calculated from the observed z-position of the best focus of each Point Emitter. It indicates focal aberrations or tilt. Ideally this measurement should be reflective of multiple individual Point Emitter observations across the Field of View (FOV). However, if a single measurement is taken, it is essential that this be taken from the center of the Objective FOV.
	*/
	void resetPlanarity();

	/*!
	* \brief Checks whether the Planarity attribute is present.
	*
	* This is a measure of the flatness of the focal plane across the Field of View (FOV). The planarity of the focal plane is calculated from the observed z-position of the best focus of each Point Emitter. It indicates focal aberrations or tilt. Ideally this measurement should be reflective of multiple individual Point Emitter observations across the Field of View (FOV). However, if a single measurement is taken, it is essential that this be taken from the center of the Objective FOV.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasPlanarity() const;

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

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

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

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

	/*!
	* \brief Sets the value of the LateralAsymmetry attribute.
	*
	* This field reports the mean +/- standard deviation over the Field of View (FOV) of the observed Point Spread Function (PSF) Lateral Asymmetry (i.e. the ratio of the minimum lateral FWMH over the maximum lateral FWHM). It indicates the presence of optical aberrations. Ideally this measurement should be reflective of multiple individual Point Emitter observations across the Field of View (FOV). However, if a single measurement is taken, it is essential that this be taken from the center of the Objective FOV.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setLateralAsymmetry(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the LateralAsymmetry attribute.
	*
	* This field reports the mean +/- standard deviation over the Field of View (FOV) of the observed Point Spread Function (PSF) Lateral Asymmetry (i.e. the ratio of the minimum lateral FWMH over the maximum lateral FWHM). It indicates the presence of optical aberrations. Ideally this measurement should be reflective of multiple individual Point Emitter observations across the Field of View (FOV). However, if a single measurement is taken, it is essential that this be taken from the center of the Objective FOV.
	*
	* \return The value of the attribute
	*/
	float getLateralAsymmetry() const;

	/*!
	* \brief Resets the LateralAsymmetry attribute to an unset state.
	*
	* This field reports the mean +/- standard deviation over the Field of View (FOV) of the observed Point Spread Function (PSF) Lateral Asymmetry (i.e. the ratio of the minimum lateral FWMH over the maximum lateral FWHM). It indicates the presence of optical aberrations. Ideally this measurement should be reflective of multiple individual Point Emitter observations across the Field of View (FOV). However, if a single measurement is taken, it is essential that this be taken from the center of the Objective FOV.
	*/
	void resetLateralAsymmetry();

	/*!
	* \brief Checks whether the LateralAsymmetry attribute is present.
	*
	* This field reports the mean +/- standard deviation over the Field of View (FOV) of the observed Point Spread Function (PSF) Lateral Asymmetry (i.e. the ratio of the minimum lateral FWMH over the maximum lateral FWHM). It indicates the presence of optical aberrations. Ideally this measurement should be reflective of multiple individual Point Emitter observations across the Field of View (FOV). However, if a single measurement is taken, it is essential that this be taken from the center of the Objective FOV.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasLateralAsymmetry() const;

	/*!
	* \brief Sets the value of the AxialAsymmetry attribute.
	*
	* This field reports the mean +/- standard deviation over the Field of View (FOV) of the observed Point Spread Function (PSF) Axial Asymmetry (i.e. the ratio of the minimum axial FWMH over the maximum axial FWHM; also referred to as Spherical Aberration). It indicates the presence of optical aberrations. Ideally this measurement should be reflective of multiple individual Point Emitter observations across the Field of View (FOV). However, if a single measurement is taken, it is essential that this be taken from the center of the Objective FOV.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setAxialAsymmetry(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the AxialAsymmetry attribute.
	*
	* This field reports the mean +/- standard deviation over the Field of View (FOV) of the observed Point Spread Function (PSF) Axial Asymmetry (i.e. the ratio of the minimum axial FWMH over the maximum axial FWHM; also referred to as Spherical Aberration). It indicates the presence of optical aberrations. Ideally this measurement should be reflective of multiple individual Point Emitter observations across the Field of View (FOV). However, if a single measurement is taken, it is essential that this be taken from the center of the Objective FOV.
	*
	* \return The value of the attribute
	*/
	float getAxialAsymmetry() const;

	/*!
	* \brief Resets the AxialAsymmetry attribute to an unset state.
	*
	* This field reports the mean +/- standard deviation over the Field of View (FOV) of the observed Point Spread Function (PSF) Axial Asymmetry (i.e. the ratio of the minimum axial FWMH over the maximum axial FWHM; also referred to as Spherical Aberration). It indicates the presence of optical aberrations. Ideally this measurement should be reflective of multiple individual Point Emitter observations across the Field of View (FOV). However, if a single measurement is taken, it is essential that this be taken from the center of the Objective FOV.
	*/
	void resetAxialAsymmetry();

	/*!
	* \brief Checks whether the AxialAsymmetry attribute is present.
	*
	* This field reports the mean +/- standard deviation over the Field of View (FOV) of the observed Point Spread Function (PSF) Axial Asymmetry (i.e. the ratio of the minimum axial FWMH over the maximum axial FWHM; also referred to as Spherical Aberration). It indicates the presence of optical aberrations. Ideally this measurement should be reflective of multiple individual Point Emitter observations across the Field of View (FOV). However, if a single measurement is taken, it is essential that this be taken from the center of the Objective FOV.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasAxialAsymmetry() const;

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

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

	/*!
	* \brief Adds a new OpticalCalibrationImageRef 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 addToOpticalCalibrationImageRef_List(const Inscoper::NBO::OpticalCalibrationImageRefPtr& value, bool validate = true);

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

	/*!
	* \brief Sets the list of PSFEquationFile elements.
	*
	* This element refers to any type of file describing the PSF Equation that was used in this case.
	*
	* \param value The new list of PSFEquationFile elements
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setPSFEquationFile_List(const std::vector<Inscoper::NBO::FileAnnotation_TypePtr>& value, bool validate = true);

	/*!
	* \brief Returns the list of PSFEquationFile elements.
	*
	* This element refers to any type of file describing the PSF Equation that was used in this case.
	*
	* \return The list of PSFEquationFile elements
	*/
	std::vector<Inscoper::NBO::FileAnnotation_TypePtr> getPSFEquationFile_List() const;

	/*!
	* \brief Adds a new PSFEquationFile element to this object.
	*
	* This element refers to any type of file describing the PSF Equation that was used in this case.
	*
	* \param value The element to add
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void addToPSFEquationFile_List(const Inscoper::NBO::FileAnnotation_TypePtr& value, bool validate = true);

	/*!
	* \brief Clear the list of PSFEquationFile.
	*
	* This element refers to any type of file describing the PSF Equation that was used in this case.
	*/
	void clearPSFEquationFile_List();

	/*!
	* \brief Sets the list of OpticalCalibrationReport elements.
	*
	* This element refers to any File containing a report generated by the Calibration Software referred to in Calibration procedure.
	*
	* \param value The new list of OpticalCalibrationReport elements
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setOpticalCalibrationReport_List(const std::vector<Inscoper::NBO::FileAnnotation_TypePtr>& value, bool validate = true);

	/*!
	* \brief Returns the list of OpticalCalibrationReport elements.
	*
	* This element refers to any File containing a report generated by the Calibration Software referred to in Calibration procedure.
	*
	* \return The list of OpticalCalibrationReport elements
	*/
	std::vector<Inscoper::NBO::FileAnnotation_TypePtr> getOpticalCalibrationReport_List() const;

	/*!
	* \brief Adds a new OpticalCalibrationReport element to this object.
	*
	* This element refers to any File containing a report generated by the Calibration Software referred to in Calibration procedure.
	*
	* \param value The element to add
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void addToOpticalCalibrationReport_List(const Inscoper::NBO::FileAnnotation_TypePtr& value, bool validate = true);

	/*!
	* \brief Clear the list of OpticalCalibrationReport.
	*
	* This element refers to any File containing a report generated by the Calibration Software referred to in Calibration procedure.
	*/
	void clearOpticalCalibrationReport_List();

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

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

	/*!
	* \brief Adds a new ChromaticRegistrationEvaluation 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 addToChromaticRegistrationEvaluation_List(const Inscoper::NBO::ChromaticRegistrationEvaluationPtr& value, bool validate = true);

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

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

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

	/*!
	* \brief Adds a new FieldUniformityEvaluation 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 addToFieldUniformityEvaluation_List(const Inscoper::NBO::FieldUniformityEvaluationPtr& value, bool validate = true);

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

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

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

	/*!
	* \brief Adds a new OpticalCalibrationStandardGroup 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 addToOpticalCalibrationStandardGroup_List(const Inscoper::NBO::OpticalCalibrationStandard_TypePtr& value, bool validate = true);

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

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

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

	/*!
	* \brief Adds a new CalibrationSoftware 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 addToCalibrationSoftware_List(const Inscoper::NBO::CalibrationSoftwarePtr& value, bool validate = true);

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

	/*!
	* \brief Sets the value of the AnnotationRef element.
	*
	* This is a simple multi-line comment or annotation describing this component.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setAnnotationRef(const Inscoper::NBO::OpticalCalibration::InlineAnnotationRefPtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the AnnotationRef element.
	*
	* This is a simple multi-line comment or annotation describing this component.
	*
	* \return The value of the element
	*/
	Inscoper::NBO::OpticalCalibration::InlineAnnotationRefPtr getAnnotationRef() const;

	/*!
	* \brief Resets the AnnotationRef element to an unset state.
	*
	* This is a simple multi-line comment or annotation describing this component.
	*/
	void resetAnnotationRef();

	/*!
	* \brief Checks whether the optional AnnotationRef element is present.
	*
	* This is a simple multi-line comment or annotation describing this component.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasAnnotationRef() const;


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

	LSID_TypePtr ID = nullptr; // Required attribute
    std::optional<std::string> Date; // Required attribute
    static const std::set<std::string> DateAllowedValues;
    std::optional<float> TheoreticalXYSpotSize_FWHM; // Optional attribute
	UnitsLength_TypePtr TheoreticalXYSpotSize_FWHMUnit = nullptr; // Optional attribute
    std::optional<float> MedianXYSpotSize_FWHM; // Optional attribute
	UnitsLength_TypePtr MedianXYSpotSize_FWHMUnit = nullptr; // Optional attribute
    std::optional<float> MinXYSpotSize_FWHM; // Optional attribute
	UnitsLength_TypePtr MinXYSpotSize_FWHMUnit = nullptr; // Optional attribute
    std::optional<float> MaxXYSpotSize_FWHM; // Optional attribute
    std::optional<float> MaxXYSpotSize_FWHMUnit; // Optional attribute
    std::optional<float> TheoreticaZSpotSize_FWHM; // Optional attribute
	UnitsLength_TypePtr TheoreticaZSpotSize_FWHMUnit = nullptr; // Optional attribute
    std::optional<float> MedianZSpotSize_FWHM; // Optional attribute
    std::optional<float> MedianZSpotSize_FWHMUnit; // Optional attribute
    std::optional<bool> CheckedNA; // Optional attribute
    std::optional<bool> Z_Dimension; // Optional attribute
    std::optional<float> NyquistRate; // Optional attribute
	PositiveInt_TypePtr SampleSize = nullptr; // Optional attribute
    std::optional<std::string> PSFEquation; // Optional attribute
    static const std::set<std::string> PSFEquationAllowedValues;
    std::optional<float> Planarity; // Optional attribute
	UnitsLength_TypePtr PlanarityUnit = nullptr; // Optional attribute
    std::optional<float> LateralAsymmetry; // Optional attribute
    std::optional<float> AxialAsymmetry; // Optional attribute
    std::vector<Inscoper::NBO::OpticalCalibrationImageRefPtr> OpticalCalibrationImageRef_List;
    std::vector<Inscoper::NBO::FileAnnotation_TypePtr> PSFEquationFile_List;
    std::vector<Inscoper::NBO::FileAnnotation_TypePtr> OpticalCalibrationReport_List;
    std::vector<Inscoper::NBO::ChromaticRegistrationEvaluationPtr> ChromaticRegistrationEvaluation_List;
    std::vector<Inscoper::NBO::FieldUniformityEvaluationPtr> FieldUniformityEvaluation_List;
    std::vector<Inscoper::NBO::OpticalCalibrationStandard_TypePtr> OpticalCalibrationStandardGroup_List;
    std::vector<Inscoper::NBO::CalibrationSoftwarePtr> CalibrationSoftware_List;
    Inscoper::NBO::OpticalCalibration::InlineAnnotationRefPtr AnnotationRef = nullptr;
};

/*! Shared pointer for OpticalCalibration*/
typedef std::shared_ptr<OpticalCalibration> OpticalCalibrationPtr;

} // namespace Inscoper::NBO

#endif // OPTICALCALIBRATION_HPP_INCLUDED