use crate::error::Error; use enum_utils::{FromStr, IterVariants}; #[cfg(feature = "python")] use pyo3::types::{PyDict, PyInt, PyString}; #[cfg(feature = "python")] use pyo3::{Bound, IntoPyObject, PyErr, PyResult, Python}; use serde::{Deserialize, Serialize}; use std::cmp::PartialEq; #[cfg(feature = "python")] macro_rules! impl_enum_into_py_object { ($($t:ty $(,)?)*) => { $( impl<'py> IntoPyObject<'py> for $t { type Target = PyString; type Output = Bound<'py, Self::Target>; type Error = PyErr; fn into_pyobject(self, py: Python<'py>) -> PyResult { Ok(format!("{:?}", self).into_pyobject(py)?) } } )* }; } #[cfg(feature = "python")] macro_rules! impl_empty_struct_into_py_object { ($($t:ty $(,)?)*) => { $( impl<'py> IntoPyObject<'py> for $t { type Target = PyInt; type Output = Bound<'py, Self::Target>; type Error = PyErr; fn into_pyobject(self, py: Python<'py>) -> PyResult { Ok(0usize.into_pyobject(py)?) } } )* }; } #[cfg(feature = "python")] macro_rules! impl_boxed_struct_into_py_object { ($($t:ty $(,)?)*) => { $( impl<'py> IntoPyObject<'py> for Box<$t> { type Target = PyDict; type Output = Bound<'py, Self::Target>; type Error = PyErr; fn into_pyobject(self, py: Python<'py>) -> PyResult { (*self).into_pyobject(py) } } )* }; } #[cfg(feature = "python")] impl_enum_into_py_object!( ArcType, BinDataCompressionType, BinningType, ChannelIlluminationType, ChannelAcquisitionModeType, ChannelContrastMethodType, DetectorType, ExperimentItemType, FilamentType, FilterType, FontFamilyType, LaserType, LaserLaserMediumType, LaserPulseType, MarkerType, MicrobeamManipulationItemType, MicroscopeType, NamingConventionType, ObjectiveCorrectionType, ObjectiveImmersionType, ObjectiveSettingsMediumType, PixelsDimensionOrderType, PixelType, ShapeFillRuleType, ShapeFontStyleType ); #[cfg(feature = "python")] impl_empty_struct_into_py_object!(MetadataOnly, XmlAnnotationValue); #[cfg(feature = "python")] impl_boxed_struct_into_py_object!(Channel, Image); #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct AffineTransform { #[serde(rename = "@A00")] pub a00: f32, #[serde(rename = "@A10")] pub a10: f32, #[serde(rename = "@A01")] pub a01: f32, #[serde(rename = "@A11")] pub a11: f32, #[serde(rename = "@A02")] pub a02: f32, #[serde(rename = "@A12")] pub a12: f32, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Annotation { #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@Namespace")] pub namespace: Option, #[serde(default, rename = "@Annotator")] pub annotator: Option, #[serde(default, rename = "Description")] pub description: Option, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct AnnotationRef { #[serde(rename = "@ID")] pub id: String, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Arc { #[serde(default, rename = "@Manufacturer")] pub manufacturer: Option, #[serde(default, rename = "@Model")] pub model: Option, #[serde(default, rename = "@SerialNumber")] pub serial_number: Option, #[serde(default, rename = "@LotNumber")] pub lot_number: Option, #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@Power")] pub power: Option, #[serde(default = "Arc::default_power_unit", rename = "@PowerUnit")] pub power_unit: UnitsPower, #[serde(default, rename = "@Type")] pub r#type: Option, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, } impl Arc { pub fn default_power_unit() -> UnitsPower { UnitsPower::W } } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum ArcType { #[serde(rename = "Hg")] Hg, #[serde(rename = "Xe")] Xe, #[serde(rename = "HgXe")] HgXe, #[serde(rename = "Other")] Other, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct BinData { #[serde(default = "BinData::default_compression", rename = "@Compression")] pub compression: BinDataCompressionType, #[serde(rename = "@BigEndian")] pub big_endian: bool, #[serde(rename = "@Length")] pub length: i64, #[serde(rename = "$text")] pub content: String, } impl BinData { pub fn default_compression() -> BinDataCompressionType { BinDataCompressionType::None } } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum BinDataCompressionType { #[serde(rename = "zlib")] Zlib, #[serde(rename = "bzip2")] Bzip2, #[serde(rename = "none")] None, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct BinaryFile { #[serde(rename = "@FileName")] pub file_name: String, #[serde(rename = "@Size")] pub size: i64, #[serde(default, rename = "@MIMEType")] pub mime_type: Option, #[serde(rename = "$value")] pub content: BinaryFileContent, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub enum BinaryFileContent { #[serde(rename = "External")] External(External), #[serde(rename = "BinData")] BinData(BinData), } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum BinningType { #[serde(rename = "1x1")] _1X1, #[serde(rename = "2x2")] _2X2, #[serde(rename = "4x4")] _4X4, #[serde(rename = "8x8")] _8X8, #[serde(rename = "Other")] Other, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct BooleanAnnotation { #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@Namespace")] pub namespace: Option, #[serde(default, rename = "@Annotator")] pub annotator: Option, #[serde(default, rename = "Description")] pub description: Option, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, #[serde(rename = "Value")] pub value: bool, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Channel { #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@Name")] pub name: Option, #[serde(default, rename = "@SamplesPerPixel")] pub samples_per_pixel: Option, #[serde(default, rename = "@IlluminationType")] pub illumination_type: Option, #[serde(default, rename = "@PinholeSize")] pub pinhole_size: Option, #[serde( default = "Channel::default_pinhole_size_unit", rename = "@PinholeSizeUnit" )] pub pinhole_size_unit: UnitsLength, #[serde(default, rename = "@AcquisitionMode")] pub acquisition_mode: Option, #[serde(default, rename = "@ContrastMethod")] pub contrast_method: Option, #[serde(default, rename = "@ExcitationWavelength")] pub excitation_wavelength: Option, #[serde( default = "Channel::default_excitation_wavelength_unit", rename = "@ExcitationWavelengthUnit" )] pub excitation_wavelength_unit: UnitsLength, #[serde(default, rename = "@EmissionWavelength")] pub emission_wavelength: Option, #[serde( default = "Channel::default_emission_wavelength_unit", rename = "@EmissionWavelengthUnit" )] pub emission_wavelength_unit: UnitsLength, #[serde(default, rename = "@Fluor")] pub fluor: Option, #[serde(default, rename = "@NDFilter")] pub nd_filter: Option, #[serde(default, rename = "@PockelCellSetting")] pub pockel_cell_setting: Option, #[serde(default = "Channel::default_color", rename = "@Color")] pub color: i32, #[serde(default, rename = "LightSourceSettings")] pub light_source_settings: Option, #[serde(default, rename = "DetectorSettings")] pub detector_settings: Option, #[serde(default, rename = "FilterSetRef")] pub filter_set_ref: Option, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, #[serde(default, rename = "LightPath")] pub light_path: Option, } impl Channel { pub fn default_pinhole_size_unit() -> UnitsLength { UnitsLength::um } pub fn default_color() -> i32 { 0 } pub fn default_excitation_wavelength_unit() -> UnitsLength { UnitsLength::nm } pub fn default_emission_wavelength_unit() -> UnitsLength { UnitsLength::nm } } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum ChannelAcquisitionModeType { #[serde(rename = "WideField")] WideField, #[serde(rename = "LaserScanningConfocalMicroscopy")] LaserScanningConfocalMicroscopy, #[serde(rename = "SpinningDiskConfocal")] SpinningDiskConfocal, #[serde(rename = "SlitScanConfocal")] SlitScanConfocal, #[serde(rename = "MultiPhotonMicroscopy")] MultiPhotonMicroscopy, #[serde(rename = "StructuredIllumination")] StructuredIllumination, #[serde(rename = "SingleMoleculeImaging")] SingleMoleculeImaging, #[serde(rename = "TotalInternalReflection")] TotalInternalReflection, #[serde(rename = "FluorescenceLifetime")] FluorescenceLifetime, #[serde(rename = "SpectralImaging")] SpectralImaging, #[serde(rename = "FluorescenceCorrelationSpectroscopy")] FluorescenceCorrelationSpectroscopy, #[serde(rename = "NearFieldScanningOpticalMicroscopy")] NearFieldScanningOpticalMicroscopy, #[serde(rename = "SecondHarmonicGenerationImaging")] SecondHarmonicGenerationImaging, #[serde(rename = "PALM")] Palm, #[serde(rename = "STORM")] Storm, #[serde(rename = "STED")] Sted, #[serde(rename = "TIRF")] Tirf, #[serde(rename = "FSM")] Fsm, #[serde(rename = "LCM")] Lcm, #[serde(rename = "Other")] Other, #[serde(rename = "BrightField")] BrightField, #[serde(rename = "SweptFieldConfocal")] SweptFieldConfocal, #[serde(rename = "SPIM")] Spim, } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum ChannelContrastMethodType { #[serde(rename = "Brightfield")] Brightfield, #[serde(rename = "Phase")] Phase, #[serde(rename = "DIC")] Dic, #[serde(rename = "HoffmanModulation")] HoffmanModulation, #[serde(rename = "ObliqueIllumination")] ObliqueIllumination, #[serde(rename = "PolarizedLight")] PolarizedLight, #[serde(rename = "Darkfield")] Darkfield, #[serde(rename = "Fluorescence")] Fluorescence, #[serde(rename = "Other")] Other, } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum ChannelIlluminationType { #[serde(rename = "Transmitted")] Transmitted, #[serde(rename = "Epifluorescence")] Epifluorescence, #[serde(rename = "Oblique")] Oblique, #[serde(rename = "NonLinear")] NonLinear, #[serde(rename = "Other")] Other, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct CommentAnnotation { #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@Namespace")] pub namespace: Option, #[serde(default, rename = "@Annotator")] pub annotator: Option, #[serde(default, rename = "Description")] pub description: Option, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, #[serde(rename = "Value")] pub value: String, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Dataset { #[serde(default, rename = "@Name")] pub name: Option, #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "Description")] pub description: Option, #[serde(default, rename = "ExperimenterRef")] pub experimenter_ref: Option, #[serde(default, rename = "ExperimenterGroupRef")] pub experimenter_group_ref: Option, #[serde(default, rename = "ImageRef")] pub image_ref: Vec, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Detector { #[serde(default, rename = "@Manufacturer")] pub manufacturer: Option, #[serde(default, rename = "@Model")] pub model: Option, #[serde(default, rename = "@SerialNumber")] pub serial_number: Option, #[serde(default, rename = "@LotNumber")] pub lot_number: Option, #[serde(default, rename = "@Gain")] pub gain: Option, #[serde(default, rename = "@Voltage")] pub voltage: Option, #[serde(default = "Detector::default_voltage_unit", rename = "@VoltageUnit")] pub voltage_unit: UnitsElectricPotential, #[serde(default, rename = "@Offset")] pub offset: Option, #[serde(default, rename = "@Zoom")] pub zoom: Option, #[serde(default, rename = "@AmplificationGain")] pub amplification_gain: Option, #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@Type")] pub r#type: Option, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, } impl Detector { pub fn default_voltage_unit() -> UnitsElectricPotential { UnitsElectricPotential::V } } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct DetectorSettings { #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@Offset")] pub offset: Option, #[serde(default, rename = "@Gain")] pub gain: Option, #[serde(default, rename = "@Voltage")] pub voltage: Option, #[serde( default = "DetectorSettings::default_voltage_unit", rename = "@VoltageUnit" )] pub voltage_unit: UnitsElectricPotential, #[serde(default, rename = "@Zoom")] pub zoom: Option, #[serde(default, rename = "@ReadOutRate")] pub read_out_rate: Option, #[serde( default = "DetectorSettings::default_read_out_rate_unit", rename = "@ReadOutRateUnit" )] pub read_out_rate_unit: UnitsFrequency, #[serde(default, rename = "@Binning")] pub binning: Option, #[serde(default, rename = "@Integration")] pub integration: Option, } impl DetectorSettings { pub fn default_voltage_unit() -> UnitsElectricPotential { UnitsElectricPotential::V } pub fn default_read_out_rate_unit() -> UnitsFrequency { UnitsFrequency::Hz } } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum DetectorType { #[serde(rename = "CCD")] Ccd, #[serde(rename = "IntensifiedCCD")] IntensifiedCcd, #[serde(rename = "AnalogVideo")] AnalogVideo, #[serde(rename = "PMT")] Pmt, #[serde(rename = "Photodiode")] Photodiode, #[serde(rename = "Spectroscopy")] Spectroscopy, #[serde(rename = "LifetimeImaging")] LifetimeImaging, #[serde(rename = "CorrelationSpectroscopy")] CorrelationSpectroscopy, #[serde(rename = "FTIR")] Ftir, #[serde(rename = "EMCCD")] Emccd, #[serde(rename = "APD")] Apd, #[serde(rename = "CMOS")] Cmos, #[serde(rename = "EBCCD")] Ebccd, #[serde(rename = "Other")] Other, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Dichroic { #[serde(default, rename = "@Manufacturer")] pub manufacturer: Option, #[serde(default, rename = "@Model")] pub model: Option, #[serde(default, rename = "@SerialNumber")] pub serial_number: Option, #[serde(default, rename = "@LotNumber")] pub lot_number: Option, #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct DoubleAnnotation { #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@Namespace")] pub namespace: Option, #[serde(default, rename = "@Annotator")] pub annotator: Option, #[serde(default, rename = "Description")] pub description: Option, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, #[serde(rename = "Value")] pub value: f64, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Ellipse { #[serde(default, rename = "@FillColor")] pub fill_color: Option, #[serde(default, rename = "@FillRule")] pub fill_rule: Option, #[serde(default, rename = "@StrokeColor")] pub stroke_color: Option, #[serde(default, rename = "@StrokeWidth")] pub stroke_width: Option, #[serde( default = "Ellipse::default_stroke_width_unit", rename = "@StrokeWidthUnit" )] pub stroke_width_unit: UnitsLength, #[serde(default, rename = "@StrokeDashArray")] pub stroke_dash_array: Option, #[serde(default, rename = "@Text")] pub text: Option, #[serde(default, rename = "@FontFamily")] pub font_family: Option, #[serde(default, rename = "@FontSize")] pub font_size: Option, #[serde(default = "Ellipse::default_font_size_unit", rename = "@FontSizeUnit")] pub font_size_unit: UnitsLength, #[serde(default, rename = "@FontStyle")] pub font_style: Option, #[serde(default, rename = "@Locked")] pub locked: Option, #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@TheZ")] pub the_z: Option, #[serde(default, rename = "@TheT")] pub the_t: Option, #[serde(default, rename = "@TheC")] pub the_c: Option, #[serde(rename = "@X")] pub x: f32, #[serde(rename = "@Y")] pub y: f32, #[serde(rename = "@RadiusX")] pub radius_x: f32, #[serde(rename = "@RadiusY")] pub radius_y: f32, #[serde(default, rename = "Transform")] pub transform: Option, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, } impl Ellipse { pub fn default_stroke_width_unit() -> UnitsLength { UnitsLength::Pixel } pub fn default_font_size_unit() -> UnitsLength { UnitsLength::Pixel } } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Experiment { #[serde(default, rename = "@Type")] pub r#type: Option, #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "Description")] pub description: Option, #[serde(default, rename = "ExperimenterRef")] pub experimenter_ref: Option, #[serde(default, rename = "MicrobeamManipulation")] pub microbeam_manipulation: Vec, } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum ExperimentItemType { #[serde(rename = "FP")] Fp, #[serde(rename = "FRET")] Fret, #[serde(rename = "TimeLapse")] TimeLapse, #[serde(rename = "FourDPlus")] FourDPlus, #[serde(rename = "Screen")] Screen, #[serde(rename = "Immunocytochemistry")] Immunocytochemistry, #[serde(rename = "Immunofluorescence")] Immunofluorescence, #[serde(rename = "FISH")] Fish, #[serde(rename = "Electrophysiology")] Electrophysiology, #[serde(rename = "IonImaging")] IonImaging, #[serde(rename = "Colocalization")] Colocalization, #[serde(rename = "PGIDocumentation")] PgiDocumentation, #[serde(rename = "FluorescenceLifetime")] FluorescenceLifetime, #[serde(rename = "SpectralImaging")] SpectralImaging, #[serde(rename = "Photobleaching")] Photobleaching, #[serde(rename = "SPIM")] Spim, #[serde(rename = "Other")] Other, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize, Default)] pub struct ExperimentType(pub Vec); #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Experimenter { #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@FirstName")] pub first_name: Option, #[serde(default, rename = "@MiddleName")] pub middle_name: Option, #[serde(default, rename = "@LastName")] pub last_name: Option, #[serde(default, rename = "@Email")] pub email: Option, #[serde(default, rename = "@Institution")] pub institution: Option, #[serde(default, rename = "@UserName")] pub user_name: Option, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct ExperimenterGroup { #[serde(default, rename = "@Name")] pub name: Option, #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "Description")] pub description: Option, #[serde(default, rename = "ExperimenterRef")] pub experimenter_ref: Vec, #[serde(default, rename = "Leader")] pub leader: Vec, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct External { #[serde(rename = "@href")] pub href: String, #[serde(rename = "@SHA1")] pub sha_1: String, #[serde(default = "External::default_compression", rename = "@Compression")] pub compression: BinDataCompressionType, } impl External { pub fn default_compression() -> BinDataCompressionType { BinDataCompressionType::None } } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Filament { #[serde(default, rename = "@Manufacturer")] pub manufacturer: Option, #[serde(default, rename = "@Model")] pub model: Option, #[serde(default, rename = "@SerialNumber")] pub serial_number: Option, #[serde(default, rename = "@LotNumber")] pub lot_number: Option, #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@Power")] pub power: Option, #[serde(default = "Filament::default_power_unit", rename = "@PowerUnit")] pub power_unit: UnitsPower, #[serde(default, rename = "@Type")] pub r#type: Option, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, } impl Filament { pub fn default_power_unit() -> UnitsPower { UnitsPower::W } } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum FilamentType { #[serde(rename = "Incandescent")] Incandescent, #[serde(rename = "Halogen")] Halogen, #[serde(rename = "Other")] Other, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct FileAnnotation { #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@Namespace")] pub namespace: Option, #[serde(default, rename = "@Annotator")] pub annotator: Option, #[serde(default, rename = "Description")] pub description: Option, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, #[serde(rename = "BinaryFile")] pub binary_file: BinaryFile, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Filter { #[serde(default, rename = "@Manufacturer")] pub manufacturer: Option, #[serde(default, rename = "@Model")] pub model: Option, #[serde(default, rename = "@SerialNumber")] pub serial_number: Option, #[serde(default, rename = "@LotNumber")] pub lot_number: Option, #[serde(default, rename = "@Type")] pub r#type: Option, #[serde(default, rename = "@FilterWheel")] pub filter_wheel: Option, #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "TransmittanceRange")] pub transmittance_range: Option, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct FilterSet { #[serde(default, rename = "@Manufacturer")] pub manufacturer: Option, #[serde(default, rename = "@Model")] pub model: Option, #[serde(default, rename = "@SerialNumber")] pub serial_number: Option, #[serde(default, rename = "@LotNumber")] pub lot_number: Option, #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "ExcitationFilterRef")] pub excitation_filter_ref: Vec, #[serde(default, rename = "DichroicRef")] pub dichroic_ref: Option, #[serde(default, rename = "EmissionFilterRef")] pub emission_filter_ref: Vec, } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum FilterType { #[serde(rename = "Dichroic")] Dichroic, #[serde(rename = "LongPass")] LongPass, #[serde(rename = "ShortPass")] ShortPass, #[serde(rename = "BandPass")] BandPass, #[serde(rename = "MultiPass")] MultiPass, #[serde(rename = "NeutralDensity")] NeutralDensity, #[serde(rename = "Tuneable")] Tuneable, #[serde(rename = "Other")] Other, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Folder { #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@Name")] pub name: Option, #[serde(default, rename = "Description")] pub description: Option, #[serde(default, rename = "FolderRef")] pub folder_ref: Vec, #[serde(default, rename = "ImageRef")] pub image_ref: Vec, #[serde(default, rename = "ROIRef")] pub roi_ref: Vec, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum FontFamilyType { #[serde(rename = "serif")] Serif, #[serde(rename = "sans-serif")] SansSerif, #[serde(rename = "cursive")] Cursive, #[serde(rename = "fantasy")] Fantasy, #[serde(rename = "monospace")] Monospace, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct GenericExcitationSource { #[serde(default, rename = "@Manufacturer")] pub manufacturer: Option, #[serde(default, rename = "@Model")] pub model: Option, #[serde(default, rename = "@SerialNumber")] pub serial_number: Option, #[serde(default, rename = "@LotNumber")] pub lot_number: Option, #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@Power")] pub power: Option, #[serde( default = "GenericExcitationSource::default_power_unit", rename = "@PowerUnit" )] pub power_unit: UnitsPower, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, #[serde(default, rename = "Map")] pub map: Option, } impl GenericExcitationSource { pub fn default_power_unit() -> UnitsPower { UnitsPower::W } } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Image { #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@Name")] pub name: Option, #[serde(default, rename = "AcquisitionDate")] pub acquisition_date: Option, #[serde(default, rename = "ExperimenterRef")] pub experimenter_ref: Option, #[serde(default, rename = "Description")] pub description: Option, #[serde(default, rename = "ExperimentRef")] pub experiment_ref: Option, #[serde(default, rename = "ExperimenterGroupRef")] pub experimenter_group_ref: Option, #[serde(default, rename = "InstrumentRef")] pub instrument_ref: Option, #[serde(default, rename = "ObjectiveSettings")] pub objective_settings: Option, #[serde(default, rename = "ImagingEnvironment")] pub imaging_environment: Option, #[serde(default, rename = "StageLabel")] pub stage_label: Option, #[serde(rename = "Pixels")] pub pixels: Pixels, #[serde(default, rename = "ROIRef")] pub roi_ref: Vec, #[serde(default, rename = "MicrobeamManipulationRef")] pub microbeam_manipulation_ref: Vec, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct ImagingEnvironment { #[serde(default, rename = "@Temperature")] pub temperature: Option, #[serde( default = "ImagingEnvironment::default_temperature_unit", rename = "@TemperatureUnit" )] pub temperature_unit: UnitsTemperature, #[serde(default, rename = "@AirPressure")] pub air_pressure: Option, #[serde( default = "ImagingEnvironment::default_air_pressure_unit", rename = "@AirPressureUnit" )] pub air_pressure_unit: UnitsPressure, #[serde(default, rename = "@Humidity")] pub humidity: Option, #[serde(default, rename = "@CO2Percent")] pub co_2_percent: Option, #[serde(default, rename = "Map")] pub map: Option, } impl ImagingEnvironment { pub fn default_temperature_unit() -> UnitsTemperature { UnitsTemperature::C } pub fn default_air_pressure_unit() -> UnitsPressure { UnitsPressure::atm } } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Instrument { #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "Microscope")] pub microscope: Option, #[serde(default, rename = "LightSourceGroup")] pub light_source_group: Vec, #[serde(default, rename = "Detector")] pub detector: Vec, #[serde(default, rename = "Objective")] pub objective: Vec, #[serde(default, rename = "FilterSet")] pub filter_set: Vec, #[serde(default, rename = "Filter")] pub filter: Vec, #[serde(default, rename = "Dichroic")] pub dichroic: Vec, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Label { #[serde(default, rename = "@FillColor")] pub fill_color: Option, #[serde(default, rename = "@FillRule")] pub fill_rule: Option, #[serde(default, rename = "@StrokeColor")] pub stroke_color: Option, #[serde(default, rename = "@StrokeWidth")] pub stroke_width: Option, #[serde( default = "Label::default_stroke_width_unit", rename = "@StrokeWidthUnit" )] pub stroke_width_unit: UnitsLength, #[serde(default, rename = "@StrokeDashArray")] pub stroke_dash_array: Option, #[serde(default, rename = "@Text")] pub text: Option, #[serde(default, rename = "@FontFamily")] pub font_family: Option, #[serde(default, rename = "@FontSize")] pub font_size: Option, #[serde(default = "Label::default_font_size_unit", rename = "@FontSizeUnit")] pub font_size_unit: UnitsLength, #[serde(default, rename = "@FontStyle")] pub font_style: Option, #[serde(default, rename = "@Locked")] pub locked: Option, #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@TheZ")] pub the_z: Option, #[serde(default, rename = "@TheT")] pub the_t: Option, #[serde(default, rename = "@TheC")] pub the_c: Option, #[serde(rename = "@X")] pub x: f32, #[serde(rename = "@Y")] pub y: f32, #[serde(default, rename = "Transform")] pub transform: Option, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, } impl Label { pub fn default_stroke_width_unit() -> UnitsLength { UnitsLength::Pixel } pub fn default_font_size_unit() -> UnitsLength { UnitsLength::Pixel } } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Laser { #[serde(default, rename = "@Manufacturer")] pub manufacturer: Option, #[serde(default, rename = "@Model")] pub model: Option, #[serde(default, rename = "@SerialNumber")] pub serial_number: Option, #[serde(default, rename = "@LotNumber")] pub lot_number: Option, #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@Power")] pub power: Option, #[serde(default = "Laser::default_power_unit", rename = "@PowerUnit")] pub power_unit: UnitsPower, #[serde(default, rename = "@Type")] pub r#type: Option, #[serde(default, rename = "@LaserMedium")] pub laser_medium: Option, #[serde(default, rename = "@Wavelength")] pub wavelength: Option, #[serde(default = "Laser::default_wavelength_unit", rename = "@WavelengthUnit")] pub wavelength_unit: UnitsLength, #[serde(default, rename = "@FrequencyMultiplication")] pub frequency_multiplication: Option, #[serde(default, rename = "@Tuneable")] pub tuneable: Option, #[serde(default, rename = "@Pulse")] pub pulse: Option, #[serde(default, rename = "@PockelCell")] pub pockel_cell: Option, #[serde(default, rename = "@RepetitionRate")] pub repetition_rate: Option, #[serde( default = "Laser::default_repetition_rate_unit", rename = "@RepetitionRateUnit" )] pub repetition_rate_unit: UnitsFrequency, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, #[serde(default, rename = "Pump")] pub pump: Option, } impl Laser { pub fn default_power_unit() -> UnitsPower { UnitsPower::mW } pub fn default_wavelength_unit() -> UnitsLength { UnitsLength::nm } pub fn default_repetition_rate_unit() -> UnitsFrequency { UnitsFrequency::Hz } } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum LaserLaserMediumType { #[serde(rename = "Cu")] Cu, #[serde(rename = "Ag")] Ag, #[serde(rename = "ArFl")] ArFl, #[serde(rename = "ArCl")] ArCl, #[serde(rename = "KrFl")] KrFl, #[serde(rename = "KrCl")] KrCl, #[serde(rename = "XeFl")] XeFl, #[serde(rename = "XeCl")] XeCl, #[serde(rename = "XeBr")] XeBr, #[serde(rename = "N")] N, #[serde(rename = "Ar")] Ar, #[serde(rename = "Kr")] Kr, #[serde(rename = "Xe")] Xe, #[serde(rename = "HeNe")] HeNe, #[serde(rename = "HeCd")] HeCd, #[serde(rename = "CO")] Co, #[serde(rename = "CO2")] Co2, #[serde(rename = "H2O")] H2O, #[serde(rename = "HFl")] Hfl, #[serde(rename = "NdGlass")] NdGlass, #[serde(rename = "NdYAG")] NdYag, #[serde(rename = "ErGlass")] ErGlass, #[serde(rename = "ErYAG")] ErYag, #[serde(rename = "HoYLF")] HoYlf, #[serde(rename = "HoYAG")] HoYag, #[serde(rename = "Ruby")] Ruby, #[serde(rename = "TiSapphire")] TiSapphire, #[serde(rename = "Alexandrite")] Alexandrite, #[serde(rename = "Rhodamine6G")] Rhodamine6G, #[serde(rename = "CoumarinC30")] CoumarinC30, #[serde(rename = "GaAs")] GaAs, #[serde(rename = "GaAlAs")] GaAlAs, #[serde(rename = "EMinus")] Eminus, #[serde(rename = "Other")] Other, } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum LaserPulseType { #[serde(rename = "CW")] Cw, #[serde(rename = "Single")] Single, #[serde(rename = "QSwitched")] Qswitched, #[serde(rename = "Repetitive")] Repetitive, #[serde(rename = "ModeLocked")] ModeLocked, #[serde(rename = "Other")] Other, } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum LaserType { #[serde(rename = "Excimer")] Excimer, #[serde(rename = "Gas")] Gas, #[serde(rename = "MetalVapor")] MetalVapor, #[serde(rename = "SolidState")] SolidState, #[serde(rename = "Dye")] Dye, #[serde(rename = "Semiconductor")] Semiconductor, #[serde(rename = "FreeElectron")] FreeElectron, #[serde(rename = "Other")] Other, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct LightEmittingDiode { #[serde(default, rename = "@Manufacturer")] pub manufacturer: Option, #[serde(default, rename = "@Model")] pub model: Option, #[serde(default, rename = "@SerialNumber")] pub serial_number: Option, #[serde(default, rename = "@LotNumber")] pub lot_number: Option, #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@Power")] pub power: Option, #[serde( default = "LightEmittingDiode::default_power_unit", rename = "@PowerUnit" )] pub power_unit: UnitsPower, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, } impl LightEmittingDiode { pub fn default_power_unit() -> UnitsPower { UnitsPower::mW } } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct LightPath { #[serde(default, rename = "ExcitationFilterRef")] pub excitation_filter_ref: Vec, #[serde(default, rename = "DichroicRef")] pub dichroic_ref: Option, #[serde(default, rename = "EmissionFilterRef")] pub emission_filter_ref: Vec, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct LightSourceType { #[serde(default, rename = "@Manufacturer")] pub manufacturer: Option, #[serde(default, rename = "@Model")] pub model: Option, #[serde(default, rename = "@SerialNumber")] pub serial_number: Option, #[serde(default, rename = "@LotNumber")] pub lot_number: Option, #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@Power")] pub power: Option, #[serde(default = "LightSourceType::default_power_unit", rename = "@PowerUnit")] pub power_unit: UnitsPower, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, } impl LightSourceType { pub fn default_power_unit() -> UnitsPower { UnitsPower::mW } } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub enum LightSourceGroup { #[serde(rename = "Laser")] Laser(Laser), #[serde(rename = "Arc")] Arc(Arc), #[serde(rename = "Filament")] Filament(Filament), #[serde(rename = "LightEmittingDiode")] LightEmittingDiode(LightEmittingDiode), #[serde(rename = "GenericExcitationSource")] GenericExcitationSource(GenericExcitationSource), } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct LightSourceSettings { #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@Attenuation")] pub attenuation: Option, #[serde(default, rename = "@Wavelength")] pub wavelength: Option, #[serde( default = "LightSourceSettings::default_wavelength_unit", rename = "@WavelengthUnit" )] pub wavelength_unit: UnitsLength, } impl LightSourceSettings { pub fn default_wavelength_unit() -> UnitsLength { UnitsLength::nm } } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Line { #[serde(default, rename = "@FillColor")] pub fill_color: Option, #[serde(default, rename = "@FillRule")] pub fill_rule: Option, #[serde(default, rename = "@StrokeColor")] pub stroke_color: Option, #[serde(default, rename = "@StrokeWidth")] pub stroke_width: Option, #[serde( default = "Line::default_stroke_width_unit", rename = "@StrokeWidthUnit" )] pub stroke_width_unit: UnitsLength, #[serde(default, rename = "@StrokeDashArray")] pub stroke_dash_array: Option, #[serde(default, rename = "@Text")] pub text: Option, #[serde(default, rename = "@FontFamily")] pub font_family: Option, #[serde(default, rename = "@FontSize")] pub font_size: Option, #[serde(default = "Line::default_font_size_unit", rename = "@FontSizeUnit")] pub font_size_unit: UnitsLength, #[serde(default, rename = "@FontStyle")] pub font_style: Option, #[serde(default, rename = "@Locked")] pub locked: Option, #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@TheZ")] pub the_z: Option, #[serde(default, rename = "@TheT")] pub the_t: Option, #[serde(default, rename = "@TheC")] pub the_c: Option, #[serde(rename = "@X1")] pub x1: f32, #[serde(rename = "@Y1")] pub y1: f32, #[serde(rename = "@X2")] pub x2: f32, #[serde(rename = "@Y2")] pub y2: f32, #[serde(default, rename = "@MarkerStart")] pub marker_start: Option, #[serde(default, rename = "@MarkerEnd")] pub marker_end: Option, #[serde(default, rename = "Transform")] pub transform: Option, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, } impl Line { pub fn default_stroke_width_unit() -> UnitsLength { UnitsLength::Pixel } pub fn default_font_size_unit() -> UnitsLength { UnitsLength::Pixel } } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct LongAnnotation { #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@Namespace")] pub namespace: Option, #[serde(default, rename = "@Annotator")] pub annotator: Option, #[serde(default, rename = "Description")] pub description: Option, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, #[serde(rename = "Value")] pub value: i64, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct MapType { #[serde(default, rename = "M")] pub m: Vec, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct MapAnnotation { #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@Namespace")] pub namespace: Option, #[serde(default, rename = "@Annotator")] pub annotator: Option, #[serde(default, rename = "Description")] pub description: Option, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, #[serde(rename = "Value")] pub value: MapType, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct MapM { #[serde(default, rename = "@K")] pub k: Option, #[serde(rename = "$text")] pub content: String, } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum MarkerType { #[serde(rename = "Arrow")] Arrow, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Mask { #[serde(default, rename = "@FillColor")] pub fill_color: Option, #[serde(default, rename = "@FillRule")] pub fill_rule: Option, #[serde(default, rename = "@StrokeColor")] pub stroke_color: Option, #[serde(default, rename = "@StrokeWidth")] pub stroke_width: Option, #[serde( default = "Mask::default_stroke_width_unit", rename = "@StrokeWidthUnit" )] pub stroke_width_unit: UnitsLength, #[serde(default, rename = "@StrokeDashArray")] pub stroke_dash_array: Option, #[serde(default, rename = "@Text")] pub text: Option, #[serde(default, rename = "@FontFamily")] pub font_family: Option, #[serde(default, rename = "@FontSize")] pub font_size: Option, #[serde(default = "Mask::default_font_size_unit", rename = "@FontSizeUnit")] pub font_size_unit: UnitsLength, #[serde(default, rename = "@FontStyle")] pub font_style: Option, #[serde(default, rename = "@Locked")] pub locked: Option, #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@TheZ")] pub the_z: Option, #[serde(default, rename = "@TheT")] pub the_t: Option, #[serde(default, rename = "@TheC")] pub the_c: Option, #[serde(rename = "@X")] pub x: f32, #[serde(rename = "@Y")] pub y: f32, #[serde(rename = "@Width")] pub width: f32, #[serde(rename = "@Height")] pub height: f32, #[serde(default, rename = "Transform")] pub transform: Option, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, #[serde(rename = "BinData")] pub bin_data: BinData, } impl Mask { pub fn default_stroke_width_unit() -> UnitsLength { UnitsLength::Pixel } pub fn default_font_size_unit() -> UnitsLength { UnitsLength::Pixel } } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct MetadataOnly; #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct MicrobeamManipulation { #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@Type")] pub r#type: Option, #[serde(default, rename = "Description")] pub description: Option, #[serde(default, rename = "ROIRef")] pub roi_ref: Vec, #[serde(rename = "ExperimenterRef")] pub experimenter_ref: AnnotationRef, #[serde(default, rename = "LightSourceSettings")] pub light_source_settings: Vec, } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum MicrobeamManipulationItemType { #[serde(rename = "FRAP")] Frap, #[serde(rename = "FLIP")] Flip, #[serde(rename = "InverseFRAP")] InverseFrap, #[serde(rename = "Photoablation")] Photoablation, #[serde(rename = "Photoactivation")] Photoactivation, #[serde(rename = "Uncaging")] Uncaging, #[serde(rename = "OpticalTrapping")] OpticalTrapping, #[serde(rename = "Other")] Other, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize, Default)] pub struct MicrobeamManipulationType(pub Vec); #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Microscope { #[serde(default, rename = "@Manufacturer")] pub manufacturer: Option, #[serde(default, rename = "@Model")] pub model: Option, #[serde(default, rename = "@SerialNumber")] pub serial_number: Option, #[serde(default, rename = "@LotNumber")] pub lot_number: Option, #[serde(default, rename = "@Type")] pub r#type: Option, } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum MicroscopeType { #[serde(rename = "Upright")] Upright, #[serde(rename = "Inverted")] Inverted, #[serde(rename = "Dissection")] Dissection, #[serde(rename = "Electrophysiology")] Electrophysiology, #[serde(rename = "Other")] Other, } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum NamingConventionType { #[serde(rename = "letter")] Letter, #[serde(rename = "number")] Number, } /// The root of the metadata, create this by parsing an XML string. /// ``` /// use ome_metadata::Ome; /// /// let xml = r#" /// /// 2025-01-29T14:42:42 /// /// /// /// /// /// /// /// /// "#; /// /// let ome: Ome = xml.parse().unwrap(); /// let image = &ome.image.unwrap()[0]; /// println!("acquisition date: {:#?}", image.acquisition_date); /// ``` #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Ome { #[serde(default, rename = "@UUID")] pub uuid: Option, #[serde(default, rename = "@Creator")] pub creator: Option, #[serde(rename = "Rights")] pub rights: Option, #[serde(rename = "Project")] pub project: Option>, #[serde(rename = "Dataset")] pub dataset: Option>, #[serde(rename = "Folder")] pub folder: Option>, #[serde(rename = "Experiment")] pub experiment: Option>, #[serde(rename = "Plate")] pub plate: Option>, #[serde(rename = "Screen")] pub screen: Option>, #[serde(rename = "Experimenter")] pub experimenter: Option>, #[serde(rename = "ExperimenterGroup")] pub experimenter_group: Option>, #[serde(rename = "Instrument")] pub instrument: Option>, #[serde(rename = "Image")] pub image: Option>, #[serde(rename = "StructuredAnnotations")] pub structured_annotations: Option, #[serde(rename = "ROI")] pub roi: Option>, #[serde(rename = "BinaryOnly")] pub binary_only: Option, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Objective { #[serde(default, rename = "@Manufacturer")] pub manufacturer: Option, #[serde(default, rename = "@Model")] pub model: Option, #[serde(default, rename = "@SerialNumber")] pub serial_number: Option, #[serde(default, rename = "@LotNumber")] pub lot_number: Option, #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@Correction")] pub correction: Option, #[serde(default, rename = "@Immersion")] pub immersion: Option, #[serde(default, rename = "@LensNA")] pub lens_na: Option, #[serde(default, rename = "@NominalMagnification")] pub nominal_magnification: Option, #[serde(default, rename = "@CalibratedMagnification")] pub calibrated_magnification: Option, #[serde(default, rename = "@WorkingDistance")] pub working_distance: Option, #[serde( default = "Objective::default_working_distance_unit", rename = "@WorkingDistanceUnit" )] pub working_distance_unit: UnitsLength, #[serde(default, rename = "@Iris")] pub iris: Option, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, } impl Objective { pub fn default_working_distance_unit() -> UnitsLength { UnitsLength::um } } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum ObjectiveCorrectionType { #[serde(rename = "UV")] Uv, #[serde(rename = "PlanApo")] PlanApo, #[serde(rename = "PlanFluor")] PlanFluor, #[serde(rename = "SuperFluor")] SuperFluor, #[serde(rename = "VioletCorrected")] VioletCorrected, #[serde(rename = "Achro")] Achro, #[serde(rename = "Achromat")] Achromat, #[serde(rename = "Fluor")] Fluor, #[serde(rename = "Fl")] Fl, #[serde(rename = "Fluar")] Fluar, #[serde(rename = "Neofluar")] Neofluar, #[serde(rename = "Fluotar")] Fluotar, #[serde(rename = "Apo")] Apo, #[serde(rename = "PlanNeofluar")] PlanNeofluar, #[serde(rename = "Other")] Other, } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum ObjectiveImmersionType { #[serde(rename = "Oil")] Oil, #[serde(rename = "Water")] Water, #[serde(rename = "WaterDipping")] WaterDipping, #[serde(rename = "Air")] Air, #[serde(rename = "Multi")] Multi, #[serde(rename = "Glycerol")] Glycerol, #[serde(rename = "Other")] Other, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct ObjectiveSettings { #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@CorrectionCollar")] pub correction_collar: Option, #[serde(default, rename = "@Medium")] pub medium: Option, #[serde(default, rename = "@RefractiveIndex")] pub refractive_index: Option, } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum ObjectiveSettingsMediumType { #[serde(rename = "Air")] Air, #[serde(rename = "Oil")] Oil, #[serde(rename = "Water")] Water, #[serde(rename = "Glycerol")] Glycerol, #[serde(rename = "Other")] Other, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct OmeBinaryOnly { #[serde(rename = "@MetadataFile")] pub metadata_file: String, #[serde(rename = "@UUID")] pub uuid: String, } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum PixelType { #[serde(rename = "int8")] Int8, #[serde(rename = "int16")] Int16, #[serde(rename = "int32")] Int32, #[serde(rename = "uint8")] Uint8, #[serde(rename = "uint16")] Uint16, #[serde(rename = "uint32")] Uint32, #[serde(rename = "float")] Float, #[serde(rename = "double")] Double, #[serde(rename = "complex")] Complex, #[serde(rename = "double-complex")] DoubleComplex, #[serde(rename = "bit")] Bit, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Pixels { #[serde(rename = "@ID")] pub id: String, #[serde(rename = "@DimensionOrder")] pub dimension_order: PixelsDimensionOrderType, #[serde(rename = "@Type")] pub r#type: PixelType, #[serde(default, rename = "@SignificantBits")] pub significant_bits: Option, #[serde(default, rename = "@Interleaved")] pub interleaved: Option, #[serde(default, rename = "@BigEndian")] pub big_endian: Option, #[serde(rename = "@SizeX")] pub size_x: i32, #[serde(rename = "@SizeY")] pub size_y: i32, #[serde(rename = "@SizeZ")] pub size_z: i32, #[serde(rename = "@SizeC")] pub size_c: i32, #[serde(rename = "@SizeT")] pub size_t: i32, #[serde(default, rename = "@PhysicalSizeX")] pub physical_size_x: Option, #[serde( default = "Pixels::default_physical_size_x_unit", rename = "@PhysicalSizeXUnit" )] pub physical_size_x_unit: UnitsLength, #[serde(default, rename = "@PhysicalSizeY")] pub physical_size_y: Option, #[serde( default = "Pixels::default_physical_size_y_unit", rename = "@PhysicalSizeYUnit" )] pub physical_size_y_unit: UnitsLength, #[serde(default, rename = "@PhysicalSizeZ")] pub physical_size_z: Option, #[serde( default = "Pixels::default_physical_size_z_unit", rename = "@PhysicalSizeZUnit" )] pub physical_size_z_unit: UnitsLength, #[serde(default, rename = "@TimeIncrement")] pub time_increment: Option, #[serde( default = "Pixels::default_time_increment_unit", rename = "@TimeIncrementUnit" )] pub time_increment_unit: UnitsTime, #[serde(rename = "Channel")] pub channel: Vec, #[serde(rename = "BinData")] pub bin_data: Option, #[serde(rename = "TiffData")] pub tiff_data: Option, #[serde(rename = "MetadataOnly")] pub metadata_only: Option, #[serde(rename = "Plane")] pub plane: Option>, } impl Pixels { pub fn default_physical_size_x_unit() -> UnitsLength { UnitsLength::um } pub fn default_physical_size_y_unit() -> UnitsLength { UnitsLength::um } pub fn default_physical_size_z_unit() -> UnitsLength { UnitsLength::um } pub fn default_time_increment_unit() -> UnitsTime { UnitsTime::s } } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum PixelsDimensionOrderType { #[serde(rename = "XYZCT")] Xyzct, #[serde(rename = "XYZTC")] Xyztc, #[serde(rename = "XYCTZ")] Xyctz, #[serde(rename = "XYCZT")] Xyczt, #[serde(rename = "XYTCZ")] Xytcz, #[serde(rename = "XYTZC")] Xytzc, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Plane { #[serde(rename = "@TheZ")] pub the_z: i32, #[serde(rename = "@TheT")] pub the_t: i32, #[serde(rename = "@TheC")] pub the_c: i32, #[serde(default, rename = "@DeltaT")] pub delta_t: Option, #[serde(default = "Plane::default_delta_t_unit", rename = "@DeltaTUnit")] pub delta_t_unit: UnitsTime, #[serde(default, rename = "@ExposureTime")] pub exposure_time: Option, #[serde( default = "Plane::default_exposure_time_unit", rename = "@ExposureTimeUnit" )] pub exposure_time_unit: UnitsTime, #[serde(default, rename = "@PositionX")] pub position_x: Option, #[serde(default = "Plane::default_position_x_unit", rename = "@PositionXUnit")] pub position_x_unit: UnitsLength, #[serde(default, rename = "@PositionY")] pub position_y: Option, #[serde(default = "Plane::default_position_y_unit", rename = "@PositionYUnit")] pub position_y_unit: UnitsLength, #[serde(default, rename = "@PositionZ")] pub position_z: Option, #[serde(default = "Plane::default_position_z_unit", rename = "@PositionZUnit")] pub position_z_unit: UnitsLength, #[serde(rename = "HashSHA1")] pub hash_sha1: Option, #[serde(rename = "AnnotationRef")] pub annotation_ref: Option, } impl Plane { pub fn default_delta_t_unit() -> UnitsTime { UnitsTime::s } pub fn default_exposure_time_unit() -> UnitsTime { UnitsTime::s } pub fn default_position_x_unit() -> UnitsLength { UnitsLength::um } pub fn default_position_y_unit() -> UnitsLength { UnitsLength::um } pub fn default_position_z_unit() -> UnitsLength { UnitsLength::um } } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Plate { #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@Name")] pub name: Option, #[serde(default, rename = "@Status")] pub status: Option, #[serde(default, rename = "@ExternalIdentifier")] pub external_identifier: Option, #[serde(default, rename = "@ColumnNamingConvention")] pub column_naming_convention: Option, #[serde(default, rename = "@RowNamingConvention")] pub row_naming_convention: Option, #[serde(default, rename = "@WellOriginX")] pub well_origin_x: Option, #[serde( default = "Plate::default_well_origin_x_unit", rename = "@WellOriginXUnit" )] pub well_origin_x_unit: UnitsLength, #[serde(default, rename = "@WellOriginY")] pub well_origin_y: Option, #[serde( default = "Plate::default_well_origin_y_unit", rename = "@WellOriginYUnit" )] pub well_origin_y_unit: UnitsLength, #[serde(default, rename = "@Rows")] pub rows: Option, #[serde(default, rename = "@Columns")] pub columns: Option, #[serde(default, rename = "@FieldIndex")] pub field_index: Option, #[serde(default, rename = "Description")] pub description: Option, #[serde(default, rename = "Well")] pub well: Vec, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, #[serde(default, rename = "PlateAcquisition")] pub plate_acquisition: Vec, } impl Plate { pub fn default_well_origin_x_unit() -> UnitsLength { UnitsLength::um } pub fn default_well_origin_y_unit() -> UnitsLength { UnitsLength::um } } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct PlateAcquisition { #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@Name")] pub name: Option, #[serde(default, rename = "@EndTime")] pub end_time: Option, #[serde(default, rename = "@StartTime")] pub start_time: Option, #[serde(default, rename = "@MaximumFieldCount")] pub maximum_field_count: Option, #[serde(default, rename = "Description")] pub description: Option, #[serde(default, rename = "WellSampleRef")] pub well_sample_ref: Vec, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Polygon { #[serde(default, rename = "@FillColor")] pub fill_color: Option, #[serde(default, rename = "@FillRule")] pub fill_rule: Option, #[serde(default, rename = "@StrokeColor")] pub stroke_color: Option, #[serde(default, rename = "@StrokeWidth")] pub stroke_width: Option, #[serde( default = "Polygon::default_stroke_width_unit", rename = "@StrokeWidthUnit" )] pub stroke_width_unit: UnitsLength, #[serde(default, rename = "@StrokeDashArray")] pub stroke_dash_array: Option, #[serde(default, rename = "@Text")] pub text: Option, #[serde(default, rename = "@FontFamily")] pub font_family: Option, #[serde(default, rename = "@FontSize")] pub font_size: Option, #[serde(default = "Polygon::default_font_size_unit", rename = "@FontSizeUnit")] pub font_size_unit: UnitsLength, #[serde(default, rename = "@FontStyle")] pub font_style: Option, #[serde(default, rename = "@Locked")] pub locked: Option, #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@TheZ")] pub the_z: Option, #[serde(default, rename = "@TheT")] pub the_t: Option, #[serde(default, rename = "@TheC")] pub the_c: Option, #[serde(rename = "@Points")] pub points: String, #[serde(default, rename = "Transform")] pub transform: Option, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, } impl Polygon { pub fn default_stroke_width_unit() -> UnitsLength { UnitsLength::Pixel } pub fn default_font_size_unit() -> UnitsLength { UnitsLength::Pixel } } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Polyline { #[serde(default, rename = "@FillColor")] pub fill_color: Option, #[serde(default, rename = "@FillRule")] pub fill_rule: Option, #[serde(default, rename = "@StrokeColor")] pub stroke_color: Option, #[serde(default, rename = "@StrokeWidth")] pub stroke_width: Option, #[serde( default = "Polyline::default_stroke_width_unit", rename = "@StrokeWidthUnit" )] pub stroke_width_unit: UnitsLength, #[serde(default, rename = "@StrokeDashArray")] pub stroke_dash_array: Option, #[serde(default, rename = "@Text")] pub text: Option, #[serde(default, rename = "@FontFamily")] pub font_family: Option, #[serde(default, rename = "@FontSize")] pub font_size: Option, #[serde(default = "Polyline::default_font_size_unit", rename = "@FontSizeUnit")] pub font_size_unit: UnitsLength, #[serde(default, rename = "@FontStyle")] pub font_style: Option, #[serde(default, rename = "@Locked")] pub locked: Option, #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@TheZ")] pub the_z: Option, #[serde(default, rename = "@TheT")] pub the_t: Option, #[serde(default, rename = "@TheC")] pub the_c: Option, #[serde(rename = "@Points")] pub points: String, #[serde(default, rename = "@MarkerStart")] pub marker_start: Option, #[serde(default, rename = "@MarkerEnd")] pub marker_end: Option, #[serde(default, rename = "Transform")] pub transform: Option, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, } impl Polyline { pub fn default_stroke_width_unit() -> UnitsLength { UnitsLength::Pixel } pub fn default_font_size_unit() -> UnitsLength { UnitsLength::Pixel } } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Project { #[serde(default, rename = "@Name")] pub name: Option, #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "Description")] pub description: Option, #[serde(default, rename = "ExperimenterRef")] pub experimenter_ref: Option, #[serde(default, rename = "ExperimenterGroupRef")] pub experimenter_group_ref: Option, #[serde(default, rename = "DatasetRef")] pub dataset_ref: Vec, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Roi { #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@Name")] pub name: Option, #[serde(rename = "Union")] pub union: Option, #[serde(rename = "AnnotationRef")] pub annotation_ref: Option, #[serde(rename = "Description")] pub description: Option, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Reagent { #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@Name")] pub name: Option, #[serde(default, rename = "@ReagentIdentifier")] pub reagent_identifier: Option, #[serde(default, rename = "Description")] pub description: Option, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Rectangle { #[serde(default, rename = "@FillColor")] pub fill_color: Option, #[serde(default, rename = "@FillRule")] pub fill_rule: Option, #[serde(default, rename = "@StrokeColor")] pub stroke_color: Option, #[serde(default, rename = "@StrokeWidth")] pub stroke_width: Option, #[serde( default = "Rectangle::default_stroke_width_unit", rename = "@StrokeWidthUnit" )] pub stroke_width_unit: UnitsLength, #[serde(default, rename = "@StrokeDashArray")] pub stroke_dash_array: Option, #[serde(default, rename = "@Text")] pub text: Option, #[serde(default, rename = "@FontFamily")] pub font_family: Option, #[serde(default, rename = "@FontSize")] pub font_size: Option, #[serde( default = "Rectangle::default_font_size_unit", rename = "@FontSizeUnit" )] pub font_size_unit: UnitsLength, #[serde(default, rename = "@FontStyle")] pub font_style: Option, #[serde(default, rename = "@Locked")] pub locked: Option, #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@TheZ")] pub the_z: Option, #[serde(default, rename = "@TheT")] pub the_t: Option, #[serde(default, rename = "@TheC")] pub the_c: Option, #[serde(rename = "@X")] pub x: f32, #[serde(rename = "@Y")] pub y: f32, #[serde(rename = "@Width")] pub width: f32, #[serde(rename = "@Height")] pub height: f32, #[serde(default, rename = "Transform")] pub transform: Option, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, } impl Rectangle { pub fn default_stroke_width_unit() -> UnitsLength { UnitsLength::Pixel } pub fn default_font_size_unit() -> UnitsLength { UnitsLength::Pixel } } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Rights { #[serde(default, rename = "RightsHolder")] pub rights_holder: Option, #[serde(default, rename = "RightsHeld")] pub rights_held: Option, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct RoiUnion { #[serde(default, rename = "ShapeGroup")] pub shape_group: Vec, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Screen { #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@Name")] pub name: Option, #[serde(default, rename = "@ProtocolIdentifier")] pub protocol_identifier: Option, #[serde(default, rename = "@ProtocolDescription")] pub protocol_description: Option, #[serde(default, rename = "@ReagentSetDescription")] pub reagent_set_description: Option, #[serde(default, rename = "@ReagentSetIdentifier")] pub reagent_set_identifier: Option, #[serde(default, rename = "@Type")] pub r#type: Option, #[serde(default, rename = "Description")] pub description: Option, #[serde(default, rename = "Reagent")] pub reagent: Vec, #[serde(default, rename = "PlateRef")] pub plate_ref: Vec, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct ShapeType { #[serde(default, rename = "@FillColor")] pub fill_color: Option, #[serde(default, rename = "@FillRule")] pub fill_rule: Option, #[serde(default, rename = "@StrokeColor")] pub stroke_color: Option, #[serde(default, rename = "@StrokeWidth")] pub stroke_width: Option, #[serde( default = "ShapeType::default_stroke_width_unit", rename = "@StrokeWidthUnit" )] pub stroke_width_unit: UnitsLength, #[serde(default, rename = "@StrokeDashArray")] pub stroke_dash_array: Option, #[serde(default, rename = "@Text")] pub text: Option, #[serde(default, rename = "@FontFamily")] pub font_family: Option, #[serde(default, rename = "@FontSize")] pub font_size: Option, #[serde( default = "ShapeType::default_font_size_unit", rename = "@FontSizeUnit" )] pub font_size_unit: UnitsLength, #[serde(default, rename = "@FontStyle")] pub font_style: Option, #[serde(default, rename = "@Locked")] pub locked: Option, #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@TheZ")] pub the_z: Option, #[serde(default, rename = "@TheT")] pub the_t: Option, #[serde(default, rename = "@TheC")] pub the_c: Option, #[serde(default, rename = "Transform")] pub transform: Option, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, } impl ShapeType { pub fn default_stroke_width_unit() -> UnitsLength { UnitsLength::Pixel } pub fn default_font_size_unit() -> UnitsLength { UnitsLength::Pixel } } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum ShapeFillRuleType { #[serde(rename = "EvenOdd")] EvenOdd, #[serde(rename = "NonZero")] NonZero, } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum ShapeFontStyleType { #[serde(rename = "Bold")] Bold, #[serde(rename = "BoldItalic")] BoldItalic, #[serde(rename = "Italic")] Italic, #[serde(rename = "Normal")] Normal, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub enum ShapeGroup { #[serde(rename = "Rectangle")] Rectangle(Rectangle), #[serde(rename = "Mask")] Mask(Mask), #[serde(rename = "Point")] Point(Label), #[serde(rename = "Ellipse")] Ellipse(Ellipse), #[serde(rename = "Line")] Line(Line), #[serde(rename = "Polyline")] Polyline(Polyline), #[serde(rename = "Polygon")] Polygon(Polygon), #[serde(rename = "Label")] Label(Label), } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct StageLabel { #[serde(rename = "@Name")] pub name: String, #[serde(default, rename = "@X")] pub x: Option, #[serde(default = "StageLabel::default_x_unit", rename = "@XUnit")] pub x_unit: UnitsLength, #[serde(default, rename = "@Y")] pub y: Option, #[serde(default = "StageLabel::default_y_unit", rename = "@YUnit")] pub y_unit: UnitsLength, #[serde(default, rename = "@Z")] pub z: Option, #[serde(default = "StageLabel::default_z_unit", rename = "@ZUnit")] pub z_unit: UnitsLength, } impl StageLabel { pub fn default_x_unit() -> UnitsLength { UnitsLength::um } pub fn default_y_unit() -> UnitsLength { UnitsLength::um } pub fn default_z_unit() -> UnitsLength { UnitsLength::um } } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct StructuredAnnotations { #[serde(default, rename = "$value")] pub content: Option, } #[allow(clippy::enum_variant_names)] #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub enum StructuredAnnotationsContent { #[serde(rename = "XMLAnnotation")] XmlAnnotation(XmlAnnotation), #[serde(rename = "FileAnnotation")] FileAnnotation(FileAnnotation), #[serde(rename = "ListAnnotation")] ListAnnotation(Annotation), #[serde(rename = "LongAnnotation")] LongAnnotation(LongAnnotation), #[serde(rename = "DoubleAnnotation")] DoubleAnnotation(DoubleAnnotation), #[serde(rename = "CommentAnnotation")] CommentAnnotation(CommentAnnotation), #[serde(rename = "BooleanAnnotation")] BooleanAnnotation(BooleanAnnotation), #[serde(rename = "TimestampAnnotation")] TimestampAnnotation(CommentAnnotation), #[serde(rename = "TagAnnotation")] TagAnnotation(CommentAnnotation), #[serde(rename = "TermAnnotation")] TermAnnotation(CommentAnnotation), #[serde(rename = "MapAnnotation")] MapAnnotation(MapAnnotation), } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct TiffData { #[serde(default = "TiffData::default_ifd", rename = "@IFD")] pub ifd: i32, #[serde(default = "TiffData::default_first_z", rename = "@FirstZ")] pub first_z: i32, #[serde(default = "TiffData::default_first_t", rename = "@FirstT")] pub first_t: i32, #[serde(default = "TiffData::default_first_c", rename = "@FirstC")] pub first_c: i32, #[serde(default, rename = "@PlaneCount")] pub plane_count: Option, #[serde(default, rename = "UUID")] pub uuid: Option, } impl TiffData { pub fn default_ifd() -> i32 { 0 } pub fn default_first_z() -> i32 { 0 } pub fn default_first_t() -> i32 { 0 } pub fn default_first_c() -> i32 { 0 } } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct TiffDataUuid { #[serde(default, rename = "@FileName")] pub file_name: Option, #[serde(rename = "$text")] pub content: String, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct TransmittanceRange { #[serde(default, rename = "@CutIn")] pub cut_in: Option, #[serde( default = "TransmittanceRange::default_cut_in_unit", rename = "@CutInUnit" )] pub cut_in_unit: UnitsLength, #[serde(default, rename = "@CutOut")] pub cut_out: Option, #[serde( default = "TransmittanceRange::default_cut_out_unit", rename = "@CutOutUnit" )] pub cut_out_unit: UnitsLength, #[serde(default, rename = "@CutInTolerance")] pub cut_in_tolerance: Option, #[serde( default = "TransmittanceRange::default_cut_in_tolerance_unit", rename = "@CutInToleranceUnit" )] pub cut_in_tolerance_unit: UnitsLength, #[serde(default, rename = "@CutOutTolerance")] pub cut_out_tolerance: Option, #[serde( default = "TransmittanceRange::default_cut_out_tolerance_unit", rename = "@CutOutToleranceUnit" )] pub cut_out_tolerance_unit: UnitsLength, #[serde(default, rename = "@Transmittance")] pub transmittance: Option, } impl TransmittanceRange { pub fn default_cut_in_unit() -> UnitsLength { UnitsLength::m } pub fn default_cut_out_unit() -> UnitsLength { UnitsLength::m } pub fn default_cut_in_tolerance_unit() -> UnitsLength { UnitsLength::m } pub fn default_cut_out_tolerance_unit() -> UnitsLength { UnitsLength::m } } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, FromStr, IterVariants)] pub enum UnitsElectricPotential { YV, ZV, EV, PV, TV, GV, MV, kV, hV, daV, V, dV, cV, mV, #[serde(rename = "µV")] uV, nV, pV, fV, aV, zV, yV, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, FromStr, IterVariants)] pub enum UnitsFrequency { YHz, ZHz, EHz, PHz, THz, GHz, MHz, kHz, hHz, daHz, Hz, dHz, cHz, mHz, #[serde(rename = "µHz")] uHz, nHz, pHz, fHz, aHz, zHz, yHz, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, FromStr, IterVariants)] pub enum UnitsLength { Ym, Zm, Em, Pm, Tm, Gm, Mm, km, hm, dam, m, dm, cm, mm, #[serde(rename = "µm")] um, nm, pm, fm, am, zm, ym, #[serde(rename = "Å")] A, #[serde(rename = "thou")] Thou, #[serde(rename = "li")] Li, #[serde(rename = "in")] In, #[serde(rename = "ft")] Ft, #[serde(rename = "yd")] Yd, #[serde(rename = "mi")] Mi, #[serde(rename = "ua")] Ua, #[serde(rename = "ly")] Ly, #[serde(rename = "pc")] Pc, #[serde(rename = "pt")] Pt, #[serde(rename = "pixel")] Pixel, #[serde(rename = "reference frame")] ReferenceFrame, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, FromStr, IterVariants)] pub enum UnitsPower { YW, ZW, EW, PW, TW, GW, MW, kW, hW, daW, W, dW, cW, mW, #[serde(rename = "µW")] uW, nW, pW, fW, aW, zW, yW, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, FromStr, IterVariants)] pub enum UnitsPressure { YPa, ZPa, EPa, PPa, TPa, GPa, MPa, kPa, hPa, daPa, Pa, dPa, cPa, mPa, #[serde(rename = "µPa")] uPa, nPa, pPa, fPa, aPa, zPa, yPa, bar, Mbar, kbar, dbar, cbar, mbar, atm, psi, Torr, mTorr, #[serde(rename = "mm Hg")] mmHg, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, FromStr, IterVariants)] pub enum UnitsTemperature { #[serde(rename = "°C")] C, #[serde(rename = "°F")] F, #[serde(rename = "K")] K, #[serde(rename = "°R")] R, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, FromStr, IterVariants)] pub enum UnitsTime { Ys, Zs, Es, Ps, Ts, Gs, Ms, ks, hs, das, s, ds, cs, ms, #[serde(rename = "µs")] us, ns, ps, fs, r#as, zs, ys, min, h, d, } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Well { #[serde(rename = "@ID")] pub id: String, #[serde(rename = "@Column")] pub column: i32, #[serde(rename = "@Row")] pub row: i32, #[serde(default, rename = "@ExternalDescription")] pub external_description: Option, #[serde(default, rename = "@ExternalIdentifier")] pub external_identifier: Option, #[serde(default, rename = "@Type")] pub r#type: Option, #[serde(default = "Well::default_color", rename = "@Color")] pub color: i32, #[serde(default, rename = "WellSample")] pub well_sample: Vec, #[serde(default, rename = "ReagentRef")] pub reagent_ref: Option, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, } impl Well { pub fn default_color() -> i32 { 0 } } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct WellSample { #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@PositionX")] pub position_x: Option, #[serde( default = "WellSample::default_position_x_unit", rename = "@PositionXUnit" )] pub position_x_unit: UnitsLength, #[serde(default, rename = "@PositionY")] pub position_y: Option, #[serde( default = "WellSample::default_position_y_unit", rename = "@PositionYUnit" )] pub position_y_unit: UnitsLength, #[serde(default, rename = "@Timepoint")] pub timepoint: Option, #[serde(rename = "@Index")] pub index: i32, #[serde(default, rename = "ImageRef")] pub image_ref: Option, } impl WellSample { pub fn default_position_x_unit() -> UnitsLength { UnitsLength::um } pub fn default_position_y_unit() -> UnitsLength { UnitsLength::um } } #[cfg_attr(feature = "python", derive(IntoPyObject))] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct XmlAnnotation { #[serde(rename = "@ID")] pub id: String, #[serde(default, rename = "@Namespace")] pub namespace: Option, #[serde(default, rename = "@Annotator")] pub annotator: Option, #[serde(default, rename = "Description")] pub description: Option, #[serde(default, rename = "AnnotationRef")] pub annotation_ref: Vec, #[serde(rename = "Value")] pub value: XmlAnnotationValue, } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct XmlAnnotationValue; pub trait Convert: PartialEq { /// conversion factor between this and SI value fn as_si(&self) -> Result; /// convert a value with this unit into another unit fn convert(&self, unit: &Self, value: f64) -> Result { if self == unit { Ok(value) } else { Ok(value * self.as_si()? / unit.as_si()?) } } } macro_rules! impl_enum_variants { ($($t:ty $(,)?)*) => { $( impl $t { /// all possible variants of this enum that can be constructed or converted into pub fn variants() -> Vec { Self::iter().collect::>() } } )* }; } impl_enum_variants!( UnitsElectricPotential, UnitsFrequency, UnitsLength, UnitsPower, UnitsPressure, UnitsTemperature, UnitsTime, ); impl Convert for UnitsElectricPotential { fn as_si(&self) -> Result { match self { UnitsElectricPotential::YV => Ok(1e24), UnitsElectricPotential::ZV => Ok(1e21), UnitsElectricPotential::EV => Ok(1e18), UnitsElectricPotential::PV => Ok(1e15), UnitsElectricPotential::TV => Ok(1e12), UnitsElectricPotential::GV => Ok(1e9), UnitsElectricPotential::MV => Ok(1e6), UnitsElectricPotential::kV => Ok(1e3), UnitsElectricPotential::hV => Ok(1e2), UnitsElectricPotential::daV => Ok(1e1), UnitsElectricPotential::V => Ok(1e0), UnitsElectricPotential::dV => Ok(1e-1), UnitsElectricPotential::cV => Ok(1e-2), UnitsElectricPotential::mV => Ok(1e-3), UnitsElectricPotential::uV => Ok(1e-6), UnitsElectricPotential::nV => Ok(1e-9), UnitsElectricPotential::pV => Ok(1e-12), UnitsElectricPotential::fV => Ok(1e-15), UnitsElectricPotential::aV => Ok(1e-18), UnitsElectricPotential::zV => Ok(1e-21), UnitsElectricPotential::yV => Ok(1e-24), } } } impl Convert for UnitsFrequency { fn as_si(&self) -> Result { match self { UnitsFrequency::YHz => Ok(1e24), UnitsFrequency::ZHz => Ok(1e21), UnitsFrequency::EHz => Ok(1e18), UnitsFrequency::PHz => Ok(1e15), UnitsFrequency::THz => Ok(1e12), UnitsFrequency::GHz => Ok(1e9), UnitsFrequency::MHz => Ok(1e6), UnitsFrequency::kHz => Ok(1e3), UnitsFrequency::hHz => Ok(1e2), UnitsFrequency::daHz => Ok(1e1), UnitsFrequency::Hz => Ok(1e0), UnitsFrequency::dHz => Ok(1e-1), UnitsFrequency::cHz => Ok(1e-2), UnitsFrequency::mHz => Ok(1e-3), UnitsFrequency::uHz => Ok(1e-6), UnitsFrequency::nHz => Ok(1e-9), UnitsFrequency::pHz => Ok(1e-12), UnitsFrequency::fHz => Ok(1e-15), UnitsFrequency::aHz => Ok(1e-18), UnitsFrequency::zHz => Ok(1e-21), UnitsFrequency::yHz => Ok(1e-24), } } } impl Convert for UnitsLength { fn as_si(&self) -> Result { match self { UnitsLength::Ym => Ok(1e24), UnitsLength::Zm => Ok(1e21), UnitsLength::Em => Ok(1e18), UnitsLength::Pm => Ok(1e15), UnitsLength::Tm => Ok(1e12), UnitsLength::Gm => Ok(1e9), UnitsLength::Mm => Ok(1e6), UnitsLength::km => Ok(1e3), UnitsLength::hm => Ok(1e2), UnitsLength::dam => Ok(1e1), UnitsLength::m => Ok(1e0), UnitsLength::dm => Ok(1e-1), UnitsLength::cm => Ok(1e-2), UnitsLength::mm => Ok(1e-3), UnitsLength::um => Ok(1e-6), UnitsLength::nm => Ok(1e-9), UnitsLength::pm => Ok(1e-12), UnitsLength::fm => Ok(1e-15), UnitsLength::am => Ok(1e-18), UnitsLength::zm => Ok(1e-21), UnitsLength::ym => Ok(1e-24), UnitsLength::A => Ok(1e-10), UnitsLength::Thou => Ok(2.54e-5), UnitsLength::Li => Ok(5e2), UnitsLength::In => Ok(2.54e-2), UnitsLength::Ft => Ok(3.05e-1), UnitsLength::Yd => Ok(9.14e-1), UnitsLength::Mi => Ok(1.609344e3), UnitsLength::Ua => Ok(1.496e11), UnitsLength::Ly => Ok(9.461e15), UnitsLength::Pc => Ok(3.086e16), UnitsLength::Pt => Ok(3.52778e-4), UnitsLength::Pixel => Err(Error::SizeOfUnknown("pixel".to_string())), UnitsLength::ReferenceFrame => Err(Error::SizeOfUnknown("reference frame".to_string())), } } } impl Convert for UnitsPower { fn as_si(&self) -> Result { match self { UnitsPower::YW => Ok(1e24), UnitsPower::ZW => Ok(1e21), UnitsPower::EW => Ok(1e18), UnitsPower::PW => Ok(1e15), UnitsPower::TW => Ok(1e12), UnitsPower::GW => Ok(1e9), UnitsPower::MW => Ok(1e6), UnitsPower::kW => Ok(1e3), UnitsPower::hW => Ok(1e2), UnitsPower::daW => Ok(1e1), UnitsPower::W => Ok(1e0), UnitsPower::dW => Ok(1e-1), UnitsPower::cW => Ok(1e-2), UnitsPower::mW => Ok(1e-3), UnitsPower::uW => Ok(1e-6), UnitsPower::nW => Ok(1e-9), UnitsPower::pW => Ok(1e-12), UnitsPower::fW => Ok(1e-15), UnitsPower::aW => Ok(1e-18), UnitsPower::zW => Ok(1e-21), UnitsPower::yW => Ok(1e-24), } } } impl Convert for UnitsPressure { fn as_si(&self) -> Result { match self { UnitsPressure::YPa => Ok(1e24), UnitsPressure::ZPa => Ok(1e21), UnitsPressure::EPa => Ok(1e18), UnitsPressure::PPa => Ok(1e15), UnitsPressure::TPa => Ok(1e12), UnitsPressure::GPa => Ok(1e9), UnitsPressure::MPa => Ok(1e6), UnitsPressure::kPa => Ok(1e3), UnitsPressure::hPa => Ok(1e2), UnitsPressure::daPa => Ok(1e1), UnitsPressure::Pa => Ok(1e0), UnitsPressure::dPa => Ok(1e-1), UnitsPressure::cPa => Ok(1e-2), UnitsPressure::mPa => Ok(1e-3), UnitsPressure::uPa => Ok(1e-6), UnitsPressure::nPa => Ok(1e-9), UnitsPressure::pPa => Ok(1e-12), UnitsPressure::fPa => Ok(1e-15), UnitsPressure::aPa => Ok(1e-18), UnitsPressure::zPa => Ok(1e-21), UnitsPressure::yPa => Ok(1e-24), UnitsPressure::bar => Ok(1e5), UnitsPressure::Mbar => Ok(1e11), UnitsPressure::kbar => Ok(1e8), UnitsPressure::dbar => Ok(1e4), UnitsPressure::cbar => Ok(1e3), UnitsPressure::mbar => Ok(1e2), UnitsPressure::atm => Ok(1.01325e5), UnitsPressure::psi => Ok(6.89476e3), UnitsPressure::Torr => Ok(1.33322e3), UnitsPressure::mTorr => Ok(1.33322), UnitsPressure::mmHg => Ok(1.33322e2), } } } impl Convert for UnitsTemperature { fn as_si(&self) -> Result { match self { UnitsTemperature::C => Err(Error::TemparatureConversion), UnitsTemperature::F => Err(Error::TemparatureConversion), UnitsTemperature::K => Ok(1e1), UnitsTemperature::R => Ok(5f64 / 9f64), } } fn convert(&self, unit: &Self, value: f64) -> Result { match (self, unit) { (UnitsTemperature::F, UnitsTemperature::C) => Ok((value - 32.) * 5. / 9.), (UnitsTemperature::K, UnitsTemperature::C) => Ok(value - 273.15), (UnitsTemperature::R, UnitsTemperature::C) => Ok((value * 5. / 9.) - 273.15), (UnitsTemperature::C, UnitsTemperature::F) => Ok((value * 9. / 5.) + 32.), (UnitsTemperature::K, UnitsTemperature::F) => Ok((value * 9. / 5.) - 459.67), (UnitsTemperature::R, UnitsTemperature::F) => Ok(value - 459.67), (UnitsTemperature::C, UnitsTemperature::K) => Ok(value + 273.15), (UnitsTemperature::F, UnitsTemperature::K) => Ok((value + 459.67) * 5. / 9.), (UnitsTemperature::R, UnitsTemperature::K) => Ok(value * 5. / 9.), (UnitsTemperature::C, UnitsTemperature::R) => Ok((value + 273.15) * 9. / 5.), (UnitsTemperature::F, UnitsTemperature::R) => Ok(value + 459.67), (UnitsTemperature::K, UnitsTemperature::R) => Ok(value * 9. / 5.), _ => Ok(value), } } } impl Convert for UnitsTime { fn as_si(&self) -> Result { match self { UnitsTime::Ys => Ok(1e24), UnitsTime::Zs => Ok(1e21), UnitsTime::Es => Ok(1e18), UnitsTime::Ps => Ok(1e15), UnitsTime::Ts => Ok(1e12), UnitsTime::Gs => Ok(1e9), UnitsTime::Ms => Ok(1e6), UnitsTime::ks => Ok(1e3), UnitsTime::hs => Ok(1e2), UnitsTime::das => Ok(1e1), UnitsTime::s => Ok(1e0), UnitsTime::ds => Ok(1e-1), UnitsTime::cs => Ok(1e-2), UnitsTime::ms => Ok(1e-3), UnitsTime::us => Ok(1e-6), UnitsTime::ns => Ok(1e-9), UnitsTime::ps => Ok(1e-12), UnitsTime::fs => Ok(1e-15), UnitsTime::r#as => Ok(1e-18), UnitsTime::zs => Ok(1e-21), UnitsTime::ys => Ok(1e-24), UnitsTime::min => Ok(6e1), UnitsTime::h => Ok(3.6e2), UnitsTime::d => Ok(8.64e4), } } }