diff --git a/src/ome_types/_mixins/_base_type.py b/src/ome_types/_mixins/_base_type.py
index 3c11012a..a6bb9e88 100644
--- a/src/ome_types/_mixins/_base_type.py
+++ b/src/ome_types/_mixins/_base_type.py
@@ -156,8 +156,7 @@ def __getattr__(self, key: str) -> Any:
stacklevel=2,
)
return getattr(self, new_key)
-
- return super().__getattr__(key) # type: ignore
+ return object.__getattribute__(self, key)
def to_xml(self, **kwargs: Any) -> str:
"""Serialize this object to XML.
diff --git a/src/ome_types/_mixins/_collections.py b/src/ome_types/_mixins/_collections.py
index 99ff7bd2..6769205d 100644
--- a/src/ome_types/_mixins/_collections.py
+++ b/src/ome_types/_mixins/_collections.py
@@ -105,8 +105,18 @@ def _field_name(cls, item: Any) -> str:
raise TypeError( # pragma: no cover
f"Expected an instance of {AnnotationInstances}, got {item!r}"
)
+
+ item_type = type(item)
# where 10 is the length of "Annotation"
- return item.__class__.__name__[:-10].lower() + "_annotations"
+ field_name = item_type.__name__[:-10].lower() + "_annotations"
+ if hasattr(cls, field_name):
+ return field_name
+ for annotation_type in AnnotationInstances:
+ if issubclass(item_type, annotation_type):
+ return annotation_type.__name__[:-10].lower() + "_annotations"
+ raise TypeError( # pragma: no cover
+ f"Could not find field name for {item_type.__name__}"
+ )
ShapeType = Union[Rectangle, Mask, Point, Ellipse, Line, Polyline, Polygon, Label]
diff --git a/src/ome_types/model/modulo.py b/src/ome_types/model/modulo.py
new file mode 100644
index 00000000..548be194
--- /dev/null
+++ b/src/ome_types/model/modulo.py
@@ -0,0 +1,145 @@
+from enum import Enum
+from typing import List, Optional, Union
+
+from pydantic_compat import model_validator
+
+from ome_types._autogenerated.ome_2016_06 import XMLAnnotation
+from ome_types._mixins._base_type import OMEType
+from xsdata_pydantic_basemodel.pydantic_compat import Field
+
+MODULO_NS = "openmicroscopy.org/omero/dimension/modulo"
+ADDITIONS_NS = "http://www.openmicroscopy.org/Schemas/Additions/2011-09"
+
+
+class ModuloType(Enum):
+ """The dimension represented by this modulo."""
+
+ ANGLE = "angle"
+ PHASE = "phase"
+ TILE = "tile"
+ LIFETIME = "lifetime"
+ LAMBDA = "lambda"
+ OTHER = "other"
+
+
+class Label(OMEType):
+ value: int = Field(
+ metadata={
+ "required": True,
+ "format": "base64",
+ }
+ )
+
+
+class Modulo(OMEType):
+ class Meta:
+ namespace = MODULO_NS
+
+ type: ModuloType = Field(
+ metadata={
+ "name": "Type",
+ "type": "Attribute",
+ "required": True,
+ },
+ )
+ labels: List[Label] = Field(
+ default_factory=list,
+ metadata={
+ "name": "Label",
+ "type": "Element",
+ },
+ )
+ type_description: Optional[str] = Field(
+ default=None,
+ metadata={
+ "name": "TypeDescription",
+ "type": "Attribute",
+ },
+ )
+ unit: Optional[str] = Field(
+ default=None,
+ metadata={
+ "name": "Unit",
+ "type": "Attribute",
+ },
+ )
+ start: Union[int, float, None] = Field(
+ default=None,
+ metadata={
+ "name": "Start",
+ "type": "Attribute",
+ },
+ )
+ step: Union[int, float, None] = Field(
+ default=None,
+ metadata={
+ "name": "Step",
+ "type": "Attribute",
+ },
+ )
+ end: Union[int, float, None] = Field(
+ default=None,
+ metadata={
+ "name": "End",
+ "type": "Attribute",
+ },
+ )
+
+ @model_validator(mode="after")
+ def _vroot(cls, v: "Modulo") -> "Modulo":
+ if not v.labels and (v.start is None or v.end is None):
+ raise ValueError("Must specify either labels or start/end")
+ return v
+
+
+class ModuloContainer(OMEType):
+ class Meta:
+ namespace = ADDITIONS_NS
+
+ modulo_along_c: Optional[Modulo] = Field(
+ default=None,
+ metadata={
+ "type": "Element",
+ "name": "ModuloAlongC",
+ },
+ )
+ modulo_along_z: Optional[Modulo] = Field(
+ default=None,
+ metadata={
+ "type": "Element",
+ "name": "ModuloAlongZ",
+ },
+ )
+ modulo_along_t: Optional[Modulo] = Field(
+ default=None,
+ metadata={
+ "type": "Element",
+ "name": "ModuloAlongT",
+ },
+ )
+
+
+class ModuloValue(XMLAnnotation.Value):
+ class Meta:
+ namespace = "http://www.openmicroscopy.org/Schemas/OME/2016-06"
+
+ modulos: ModuloContainer = Field(
+ default_factory=list,
+ metadata={
+ "name": "Modulo",
+ "type": "Element",
+ },
+ )
+
+
+class ModuloAnnotation(XMLAnnotation):
+ class Meta:
+ namespace = MODULO_NS
+
+ value: ModuloValue = Field(
+ default_factory=ModuloValue,
+ metadata={
+ "name": "Value",
+ "type": "Element",
+ },
+ )
diff --git a/tests/data/FLIM-ModuloAlongC.ome.xml b/tests/data/FLIM-ModuloAlongC.ome.xml
new file mode 100644
index 00000000..b4274962
--- /dev/null
+++ b/tests/data/FLIM-ModuloAlongC.ome.xml
@@ -0,0 +1,3 @@
+2011-10-03T14:34:07urn:uuid:51fb5d8e-7ae1-437f-96bc-ed67b8d14822urn:uuid:51fb5d8e-7ae1-437f-96bc-ed67b8d14822urn:uuid:51fb5d8e-7ae1-437f-96bc-ed67b8d14822urn:uuid:51fb5d8e-7ae1-437f-96bc-ed67b8d14822urn:uuid:51fb5d8e-7ae1-437f-96bc-ed67b8d14822urn:uuid:51fb5d8e-7ae1-437f-96bc-ed67b8d14822urn:uuid:51fb5d8e-7ae1-437f-96bc-ed67b8d14822urn:uuid:51fb5d8e-7ae1-437f-96bc-ed67b8d14822urn:uuid:51fb5d8e-7ae1-437f-96bc-ed67b8d14822urn:uuid:51fb5d8e-7ae1-437f-96bc-ed67b8d14822urn:uuid:51fb5d8e-7ae1-437f-96bc-ed67b8d14822urn:uuid:51fb5d8e-7ae1-437f-96bc-ed67b8d14822urn:uuid:51fb5d8e-7ae1-437f-96bc-ed67b8d14822urn:uuid:51fb5d8e-7ae1-437f-96bc-ed67b8d14822urn:uuid:51fb5d8e-7ae1-437f-96bc-ed67b8d14822urn:uuid:51fb5d8e-7ae1-437f-96bc-ed67b8d14822
+
+
\ No newline at end of file
diff --git a/tests/data/FLIM-ModuloAlongT-TSCPC.ome.xml b/tests/data/FLIM-ModuloAlongT-TSCPC.ome.xml
new file mode 100644
index 00000000..c44bca2d
--- /dev/null
+++ b/tests/data/FLIM-ModuloAlongT-TSCPC.ome.xml
@@ -0,0 +1,6 @@
+2013-07-11T15:56:06urn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eurn:uuid:4bd6aecd-1da8-47b3-8271-b02240bfcd1eFor a description of how 6D, 7D, and 8D data is stored
+ using the Modulo extension see
+ http://www.openmicroscopy.org/site/support/ome-model/developers/6d-7d-and-8d-storage.html
+
+
+
\ No newline at end of file
diff --git a/tests/data/LAMBDA-ModuloAlongZ-ModuloAlongT.ome.xml b/tests/data/LAMBDA-ModuloAlongZ-ModuloAlongT.ome.xml
new file mode 100644
index 00000000..5bf88012
--- /dev/null
+++ b/tests/data/LAMBDA-ModuloAlongZ-ModuloAlongT.ome.xml
@@ -0,0 +1,15 @@
+2011-09-16T10:45:48urn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafburn:uuid:e4249d03-da06-4442-b365-6511cfbddafb
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/data/SPIM-ModuloAlongZ.ome.xml b/tests/data/SPIM-ModuloAlongZ.ome.xml
new file mode 100644
index 00000000..99cfee90
--- /dev/null
+++ b/tests/data/SPIM-ModuloAlongZ.ome.xml
@@ -0,0 +1,9 @@
+2011-08-30T16:06:00urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2urn:uuid:37d77e32-0ee2-4278-8456-f876332f9df2
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/data/modulo.ome.xml b/tests/data/modulo.ome.xml
new file mode 100644
index 00000000..d771676e
--- /dev/null
+++ b/tests/data/modulo.ome.xml
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ For a description of how 6D, 7D, and 8D data is stored
+ using the Modulo extension see
+ http://www.openmicroscopy.org/site/support/ome-model/developers/6d-7d-and-8d-storage.html
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/x.py b/x.py
new file mode 100644
index 00000000..54cb0674
--- /dev/null
+++ b/x.py
@@ -0,0 +1,11 @@
+from ome_types.model import OME, modulo
+
+m = modulo.ModuloAnnotation()
+m.value.modulos.modulo_along_c = modulo.Modulo(
+ type=modulo.ModuloType.ANGLE, start=0, end=360
+)
+
+ome = OME()
+ome.structured_annotations.append(m)
+
+print(ome.to_xml())