#  Copyright 2023-2024 Amazon.com, Inc. or its affiliates.

"""This file was generated by xsdata, v23.8, on 2023-10-05 09:59:45

Generator: DataclassGenerator
See: https://xsdata.readthedocs.io/
"""
from dataclasses import dataclass, field
from enum import Enum
from typing import List, Optional, Union

from xsdata.models.datatype import XmlDate, XmlDateTime

from .external.ism.schema.cvegenerated.cvenum_ism25_x import CVEnumISM25X
from .external.ism.schema.cvegenerated.cvenum_ismclassification_all import CVEnumISMClassificationAll
from .external.ism.schema.cvegenerated.cvenum_ismcomplies_with import CVEnumISMCompliesWithValues
from .external.ism.schema.cvegenerated.cvenum_ismdissem import CVEnumISMDissemValuesvalue
from .external.ism.schema.cvegenerated.cvenum_ismfgiopen import CVEnumISMFGIOpenValues
from .external.ism.schema.cvegenerated.cvenum_ismfgiprotected import CVEnumISMFGIProtectedValues
from .external.ism.schema.cvegenerated.cvenum_ismnon_ic import CVEnumISMNonICValues
from .external.ism.schema.cvegenerated.cvenum_ismnon_uscontrols import CVEnumISMNonUSControlsValues
from .external.ism.schema.cvegenerated.cvenum_ismowner_producer import CVEnumISMOwnerProducerValues
from .external.ism.schema.cvegenerated.cvenum_ismrel_to import CVEnumISMRelToValues
from .external.ism.schema.cvegenerated.cvenum_ismscicontrols import CVEnumISMSCIControlsValuesvalue
from .external.ism.schema.cvegenerated.cvenum_ismsource_marked import CVEnumISMSourceMarked
from .sfa import (
    LinearRingType,
    LineType,
    MultiLineStringType,
    MultiPointType,
    MultiPolygonType,
    PointType,
    PolygonType,
    PolyhedralSurfaceType,
    ReferenceSystemType,
)
from .sicommon_types import (
    AngleMagnitudeType,
    ErrorStatisticsType,
    LatLonVertexType,
    ParameterType,
    PolarizationType,
    Poly2DType,
    RadarModeType,
    RadiometricType,
    RangeAzimuthType,
    ReferencePointType,
    RowColDoubleType,
    RowColIntType,
    XYZPolyType,
    XYZType,
)

__NAMESPACE__ = "urn:SIDD:1.0.0"


@dataclass
class AcheivedResolutionType:
    """
    Finest achievable resolution parameters.
    """


@dataclass
class ClassificationGuidanceType:
    """
    Classification guidance authority (only if file is classified).

    :ivar authority: Classifying authority.
    :ivar date: Date that the authority was provided. Specified in YYYY-MM-DD.
    """

    authority: Optional[str] = field(
        default=None,
        metadata={
            "name": "Authority",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    date: Optional[XmlDate] = field(
        default=None,
        metadata={
            "name": "Date",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )


@dataclass
class DRAHistogramOverridesType:
    """
    :ivar clip_min: Suggested override for the lower end-point of the display histogram in the ELT DRA
        application. Referred to as Pmin in SIPS documentation.
    :ivar clip_max: Suggested override for the upper end-point of the display histogram in the ELT DRA
        application. Referred to as Pmax in SIPS documentation.
    """

    clip_min: Optional[int] = field(
        default=None,
        metadata={
            "name": "ClipMin",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    clip_max: Optional[int] = field(
        default=None,
        metadata={
            "name": "ClipMax",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )


class DecimationMethodType(Enum):
    """Default ELT decimation method for this data.

    Also used as default for reduced resolution dataset generation (if applicable).
    """

    NEAREST_NEIGHBOR = "NEAREST_NEIGHBOR"
    BILINEAR = "BILINEAR"
    BRIGHTEST_PIXEL = "BRIGHTEST_PIXEL"
    LAGRANGE = "LAGRANGE"


@dataclass
class Lookup3TableType:
    """
    :ivar value:
    :ivar size: Size of LUT
    """

    value: List[str] = field(
        default_factory=list,
        metadata={
            "pattern": r"([0-9]+),([0-9]+),([0-9]+)",
            "tokens": True,
        },
    )
    size: Optional[int] = field(
        default=None,
        metadata={
            "type": "Attribute",
            "required": True,
        },
    )


@dataclass
class LookupTableType:
    """
    :ivar value:
    :ivar size: Size of LUT.
    """

    value: List[int] = field(
        default_factory=list,
        metadata={
            "tokens": True,
        },
    )
    size: Optional[int] = field(
        default=None,
        metadata={
            "type": "Attribute",
            "required": True,
        },
    )


class MagnificationMethodType(Enum):
    """
    Default ELT magnification method for this data.
    """

    NEAREST_NEIGHBOR = "NEAREST_NEIGHBOR"
    BILINEAR = "BILINEAR"
    LAGRANGE = "LAGRANGE"


@dataclass
class MonitorCompensationAppliedType:
    """
    Describes monitor compensation that may have been applied to the product during
    processing.

    :ivar gamma: Gamma value for monitor compensation pre-applied to the image.
    :ivar xmin: Xmin value for monitor compensation pre-applied to the image.
    """

    gamma: Optional[float] = field(
        default=None,
        metadata={
            "name": "Gamma",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    xmin: Optional[float] = field(
        default=None,
        metadata={
            "name": "XMin",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )


class PixelType(Enum):
    MONO8_I = "MONO8I"
    MONO8_LU = "MONO8LU"
    MONO16_I = "MONO16I"
    RGB8_LU = "RGB8LU"
    RGB24_I = "RGB24I"


@dataclass
class ProcessorInformationType:
    """
    :ivar application: Software application name and version number.
    :ivar processing_date_time: Date and time defined in Coordinated Universal Time (UTC). The seconds should be
        followed by a Z to indicate UTC.
    :ivar site: Creation location of product.
    :ivar profile: Product-specific profile applied during product processing.
    """

    application: Optional[str] = field(
        default=None,
        metadata={
            "name": "Application",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    processing_date_time: Optional[XmlDateTime] = field(
        default=None,
        metadata={
            "name": "ProcessingDateTime",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    site: Optional[str] = field(
        default=None,
        metadata={
            "name": "Site",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    profile: Optional[str] = field(
        default=None,
        metadata={
            "name": "Profile",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )


@dataclass
class AnnotationObjectType:
    """
    Geometrical representation of the annotation.
    """

    point: Optional[PointType] = field(
        default=None,
        metadata={
            "name": "Point",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    line: Optional[LineType] = field(
        default=None,
        metadata={
            "name": "Line",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    linear_ring: Optional[LinearRingType] = field(
        default=None,
        metadata={
            "name": "LinearRing",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    polygon: Optional[PolygonType] = field(
        default=None,
        metadata={
            "name": "Polygon",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    polyhedral_surface: Optional[PolyhedralSurfaceType] = field(
        default=None,
        metadata={
            "name": "PolyhedralSurface",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    multi_polygon: Optional[MultiPolygonType] = field(
        default=None,
        metadata={
            "name": "MultiPolygon",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    multi_line_string: Optional[MultiLineStringType] = field(
        default=None,
        metadata={
            "name": "MultiLineString",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    multi_point: Optional[MultiPointType] = field(
        default=None,
        metadata={
            "name": "MultiPoint",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )


@dataclass
class BaseProjectionType:
    """
    :ivar reference_point: Reference point for the geometrical system.
    """

    reference_point: Optional[ReferencePointType] = field(
        default=None,
        metadata={
            "name": "ReferencePoint",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )


@dataclass
class ColorDisplayRemapType:
    """
    Object representing that the data requires color display.

    :ivar remap_lut: LUT-base remap indicating that the color display is done through index-based color.
    """

    remap_lut: Optional[Lookup3TableType] = field(
        default=None,
        metadata={
            "name": "RemapLUT",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )


@dataclass
class ExploitationFeaturesCollectionGeometryType:
    """
    Key geometry parameters independent of product processing.

    :ivar azimuth: Angle clockwise from north indicating the ETP line of sight vector.
    :ivar slope: Angle between the ETP at scene center and the range vector perpendicular to the direction of
        motion.
    :ivar squint: Angle from the ground track to platform velocity vector at nadir. Left-look is negative, right-
        look is positive.
    :ivar graze: Angle between the ETP and the line of sight vector.
    :ivar tilt: Angle between the ETP and the cross range vector. Also known as the twist angle.
    :ivar extension: Exploitation feature extension related to geometry for a single input image
    """

    azimuth: Optional[float] = field(
        default=None,
        metadata={
            "name": "Azimuth",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    slope: Optional[float] = field(
        default=None,
        metadata={
            "name": "Slope",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "min_inclusive": 0.0,
            "max_inclusive": 90.0,
        },
    )
    squint: Optional[float] = field(
        default=None,
        metadata={
            "name": "Squint",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "min_inclusive": -180.0,
            "max_inclusive": 180.0,
        },
    )
    graze: Optional[float] = field(
        default=None,
        metadata={
            "name": "Graze",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "min_inclusive": 0.0,
            "max_inclusive": 90.0,
        },
    )
    tilt: Optional[float] = field(
        default=None,
        metadata={
            "name": "Tilt",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "min_inclusive": -180.0,
            "max_inclusive": 180.0,
        },
    )
    extension: List[ParameterType] = field(
        default_factory=list,
        metadata={
            "name": "Extension",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )


@dataclass
class ExploitationFeaturesCollectionPhenomenologyType:
    """
    Phenomenology related to both the geometry and the final product processing.

    :ivar shadow: The phenomon where vertical objects occlude radar energy.
    :ivar layover: The phenomenon where vertical objects appear as ground objects with the same range/range rate.
    :ivar multi_path: This is a range dependent phenomenon which describes the energy from a single scatter
        returned to the radar via more than one path and results in a nominally constant direction in the ETP.
    :ivar ground_track: Counter-clockwise angle from increasing row direction to ground track at the center of
        the image.
    :ivar extension: Exploitation feature extension related to phenomenology for a single input image
    """

    shadow: Optional[AngleMagnitudeType] = field(
        default=None,
        metadata={
            "name": "Shadow",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    layover: Optional[AngleMagnitudeType] = field(
        default=None,
        metadata={
            "name": "Layover",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    multi_path: Optional[float] = field(
        default=None,
        metadata={
            "name": "MultiPath",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "min_inclusive": -180.0,
            "max_inclusive": 180.0,
        },
    )
    ground_track: Optional[float] = field(
        default=None,
        metadata={
            "name": "GroundTrack",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "min_inclusive": -180.0,
            "max_inclusive": 180.0,
        },
    )
    extension: List[ParameterType] = field(
        default_factory=list,
        metadata={
            "name": "Extension",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )


@dataclass
class ExploitationFeaturesProductType:
    """
    Metadata regarding the product.

    :ivar resolution: Uniformly-weighted resolution projected into the Earth Tangent Plane (ETP).
    :ivar north: Counter-clockwise angle from increasing row direction to north at the center of the image.
    :ivar extension: Exploitation feature extension for the end product
    """

    resolution: Optional[RowColDoubleType] = field(
        default=None,
        metadata={
            "name": "Resolution",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    north: Optional[float] = field(
        default=None,
        metadata={
            "name": "North",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "min_inclusive": -180.0,
            "max_inclusive": 180.0,
        },
    )
    extension: List[ParameterType] = field(
        default_factory=list,
        metadata={
            "name": "Extension",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )


@dataclass
class FootprintType:
    vertex: List[LatLonVertexType] = field(
        default_factory=list,
        metadata={
            "name": "Vertex",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "min_occurs": 4,
            "max_occurs": 4,
        },
    )
    size: Optional[int] = field(
        default=None,
        metadata={
            "type": "Attribute",
            "required": True,
        },
    )


@dataclass
class GeographicInformationType:
    """
    :ivar country_code: Country identifier for this geographic region.
    :ivar security_info: Specifies classification level or special handling designators for this geographic
        region
    :ivar geographic_info_extension: Implementation specific geographic information.
    """

    country_code: List[str] = field(
        default_factory=list,
        metadata={
            "name": "CountryCode",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    security_info: Optional[str] = field(
        default=None,
        metadata={
            "name": "SecurityInfo",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    geographic_info_extension: List[ParameterType] = field(
        default_factory=list,
        metadata={
            "name": "GeographicInfoExtension",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )


@dataclass
class GeometricChipType:
    """
    :ivar chip_size: Size of the chipped product in pixels.
    :ivar original_upper_left_coordinate: Upper-left corner with respect to the original product.
    :ivar original_upper_right_coordinate: Upper-right corner with respect to the original product.
    :ivar original_lower_left_coordinate: Lower-left corner with respect to the original product.
    :ivar original_lower_right_coordinate: Lower-right corner with respect to the original product.
    """

    chip_size: Optional[RowColIntType] = field(
        default=None,
        metadata={
            "name": "ChipSize",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    original_upper_left_coordinate: Optional[RowColDoubleType] = field(
        default=None,
        metadata={
            "name": "OriginalUpperLeftCoordinate",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    original_upper_right_coordinate: Optional[RowColDoubleType] = field(
        default=None,
        metadata={
            "name": "OriginalUpperRightCoordinate",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    original_lower_left_coordinate: Optional[RowColDoubleType] = field(
        default=None,
        metadata={
            "name": "OriginalLowerLeftCoordinate",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    original_lower_right_coordinate: Optional[RowColDoubleType] = field(
        default=None,
        metadata={
            "name": "OriginalLowerRightCoordinate",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )


@dataclass
class InputROIType:
    """
    ROI representing portion of input data used to make this product.

    :ivar size: Number of rows and columns extracted from the input.
    :ivar upper_left: The upper-left pixel extracted from the input.
    """

    size: Optional[RowColIntType] = field(
        default=None,
        metadata={
            "name": "Size",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    upper_left: Optional[RowColIntType] = field(
        default=None,
        metadata={
            "name": "UpperLeft",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )


@dataclass
class MonochromeDisplayRemapType:
    """This remap works by taking the input space and using the LUT to map it to a
    log space (for 8-bit only).

    From the log space the C0 and Ch fields are applied to get to display-ready density space.
    The density should then be rendered by the TTC and monitor comp.
    This means that the default DRA should not apply anything besides the clip points.
    If a different contrast/brightness is applied it should be done through modification of the clip points via DRA.
    Examples:
    Remap                LUT                    Clips
    =============================
    PEDF            PEDF-&gt;D                0,255
    LLG            LLG-&gt;A-&gt;LogA        C0,Ch
    Log                N/A                         C0,Ch
    NRL                N/A                        0,255 (Supposed to be display ready)

    :ivar remap_type: Name of remap applied (for informational purposes only).
    :ivar remap_lut: Lookup table for remap to log amplitude for display.  Used during the "Product Generation
        Option" portion of the SIPS display chain. Required for 8-bit data. Not to be used for 16-bit data.
    :ivar remap_parameter: Textual remap parameter. Filled based upon remap type (for informational purposes
        only).  For example, if the data is linlog encoded a RemapParameter could be used to describe any
        amplitude scaling that was performed prior to linlog encoding the data.
    """

    remap_type: Optional[str] = field(
        default=None,
        metadata={
            "name": "RemapType",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    remap_lut: Optional[LookupTableType] = field(
        default=None,
        metadata={
            "name": "RemapLUT",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    remap_parameter: List[ParameterType] = field(
        default_factory=list,
        metadata={
            "name": "RemapParameter",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )


@dataclass
class ProcessingEventType:
    """
    :ivar application_name: Application which applied a modification.
    :ivar applied_date_time: Date and time defined in Coordinated Universal Time (UTC). The seconds should be
        followed by a Z to indicate UTC.
    :ivar interpolation_method: Type of interpolation applied to the data.
    :ivar descriptor: Descriptor for the processing event.
    """

    application_name: Optional[str] = field(
        default=None,
        metadata={
            "name": "ApplicationName",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    applied_date_time: Optional[XmlDateTime] = field(
        default=None,
        metadata={
            "name": "AppliedDateTime",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    interpolation_method: Optional[str] = field(
        default=None,
        metadata={
            "name": "InterpolationMethod",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    descriptor: List[ParameterType] = field(
        default_factory=list,
        metadata={
            "name": "Descriptor",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )


@dataclass
class ProcessingModuleType:
    """
    :ivar module_name: The name of the algorithm used in processing the product.
    :ivar module_parameter: Parameters associated with the algorithm used in processing the product.
    :ivar processing_module: ProcessingModule is a repeatable structure within itself to create an algorithm as a
        subset of another algorithm.
    """

    module_name: Optional[ParameterType] = field(
        default=None,
        metadata={
            "name": "ModuleName",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    module_parameter: List[ParameterType] = field(
        default_factory=list,
        metadata={
            "name": "ModuleParameter",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    processing_module: List["ProcessingModuleType"] = field(
        default_factory=list,
        metadata={
            "name": "ProcessingModule",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )


@dataclass
class ProductClassificationType:
    """
    The overall classification of the product.

    :ivar security_extension: Extensible parameters used to support profile-specific needs related to product
        security.
    :ivar desversion: The version number of the DES. Should there be multiple specified in an instance document
        the one at the root node is the one that will apply to the entire document.
    :ivar resource_element:
    :ivar create_date:
    :ivar complies_with:
    :ivar classification:
    :ivar owner_producer:
    :ivar scicontrols:
    :ivar saridentifier:
    :ivar dissemination_controls:
    :ivar fgisource_open:
    :ivar fgisource_protected:
    :ivar releasable_to:
    :ivar non_icmarkings:
    :ivar classified_by:
    :ivar compilation_reason:
    :ivar derivatively_classified_by:
    :ivar classification_reason:
    :ivar non_uscontrols:
    :ivar derived_from:
    :ivar declass_date:
    :ivar declass_event:
    :ivar declass_exception:
    :ivar type_of_exempted_source:
    :ivar date_of_exempted_source:
    """

    security_extension: List[ParameterType] = field(
        default_factory=list,
        metadata={
            "name": "SecurityExtension",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    desversion: int = field(
        init=False,
        default=4,
        metadata={
            "name": "DESVersion",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism",
            "required": True,
        },
    )
    resource_element: bool = field(
        init=False,
        default=True,
        metadata={
            "name": "resourceElement",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism",
            "required": True,
        },
    )
    create_date: Optional[XmlDate] = field(
        default=None,
        metadata={
            "name": "createDate",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism",
            "required": True,
        },
    )
    complies_with: List[CVEnumISMCompliesWithValues] = field(
        default_factory=list,
        metadata={
            "name": "compliesWith",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism",
            "tokens": True,
        },
    )
    classification: Optional[CVEnumISMClassificationAll] = field(
        default=None,
        metadata={
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism",
            "required": True,
        },
    )
    owner_producer: List[CVEnumISMOwnerProducerValues] = field(
        default_factory=list,
        metadata={
            "name": "ownerProducer",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism",
            "required": True,
            "tokens": True,
        },
    )
    scicontrols: List[Union[str, CVEnumISMSCIControlsValuesvalue]] = field(
        default_factory=list,
        metadata={
            "name": "SCIcontrols",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism",
            "pattern": r"SI-G-[A-Z][A-Z][A-Z][A-Z]|SI-ECI-[A-Z][A-Z][A-Z]",
            "tokens": True,
        },
    )
    saridentifier: List[str] = field(
        default_factory=list,
        metadata={
            "name": "SARIdentifier",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism",
            "pattern": r"SAR-[A-Z][A-Z][A-Z]?",
            "tokens": True,
        },
    )
    dissemination_controls: List[Union[str, CVEnumISMDissemValuesvalue]] = field(
        default_factory=list,
        metadata={
            "name": "disseminationControls",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism",
            "pattern": r"RD-SG-[1-9][0-9]?|FRD-SG-[1-9][0-9]?",
            "tokens": True,
        },
    )
    fgisource_open: List[CVEnumISMFGIOpenValues] = field(
        default_factory=list,
        metadata={
            "name": "FGIsourceOpen",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism",
            "tokens": True,
        },
    )
    fgisource_protected: List[CVEnumISMFGIProtectedValues] = field(
        default_factory=list,
        metadata={
            "name": "FGIsourceProtected",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism",
            "tokens": True,
        },
    )
    releasable_to: List[CVEnumISMRelToValues] = field(
        default_factory=list,
        metadata={
            "name": "releasableTo",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism",
            "tokens": True,
        },
    )
    non_icmarkings: List[CVEnumISMNonICValues] = field(
        default_factory=list,
        metadata={
            "name": "nonICmarkings",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism",
            "tokens": True,
        },
    )
    classified_by: Optional[str] = field(
        default=None,
        metadata={
            "name": "classifiedBy",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism",
            "max_length": 1024,
        },
    )
    compilation_reason: Optional[str] = field(
        default=None,
        metadata={
            "name": "compilationReason",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism",
            "max_length": 1024,
        },
    )
    derivatively_classified_by: Optional[str] = field(
        default=None,
        metadata={
            "name": "derivativelyClassifiedBy",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism",
            "max_length": 1024,
        },
    )
    classification_reason: Optional[str] = field(
        default=None,
        metadata={
            "name": "classificationReason",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism",
            "max_length": 4096,
        },
    )
    non_uscontrols: List[CVEnumISMNonUSControlsValues] = field(
        default_factory=list,
        metadata={
            "name": "nonUSControls",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism",
            "tokens": True,
        },
    )
    derived_from: Optional[str] = field(
        default=None,
        metadata={
            "name": "derivedFrom",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism",
            "max_length": 1024,
        },
    )
    declass_date: Optional[XmlDate] = field(
        default=None,
        metadata={
            "name": "declassDate",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism",
        },
    )
    declass_event: Optional[str] = field(
        default=None,
        metadata={
            "name": "declassEvent",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism",
            "max_length": 1024,
        },
    )
    declass_exception: Optional[CVEnumISM25X] = field(
        default=None,
        metadata={
            "name": "declassException",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism",
        },
    )
    type_of_exempted_source: Optional[CVEnumISMSourceMarked] = field(
        default=None,
        metadata={
            "name": "typeOfExemptedSource",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism",
        },
    )
    date_of_exempted_source: Optional[XmlDate] = field(
        default=None,
        metadata={
            "name": "dateOfExemptedSource",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism",
        },
    )


@dataclass
class ProductPlaneType:
    """
    Plane definition for the product.

    :ivar row_unit_vector: Unit vector of the plane defined to be aligned in the increasing row direction of the
        product. (Defined as Rpgd in Design and Exploitation document)
    :ivar col_unit_vector: Unit vector of the plane defined to be aligned in the increasing column direction of
        the product. (Defined as Cpgd in Design and Exploitation document)
    """

    row_unit_vector: Optional[XYZType] = field(
        default=None,
        metadata={
            "name": "RowUnitVector",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    col_unit_vector: Optional[XYZType] = field(
        default=None,
        metadata={
            "name": "ColUnitVector",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )


@dataclass
class TxRcvPolarizationType:
    """
    :ivar tx_polarization: Polarization transmit type
    :ivar rcv_polarization: Receive polarization type
    :ivar rcv_polarization_offset: Optional angle offset for the receive polarization defined at aperture center.
    :ivar processed: Optional flag to describe whether this input polarization was used in processing the
        product.
    """

    tx_polarization: Optional[PolarizationType] = field(
        default=None,
        metadata={
            "name": "TxPolarization",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    rcv_polarization: Optional[PolarizationType] = field(
        default=None,
        metadata={
            "name": "RcvPolarization",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    rcv_polarization_offset: Optional[float] = field(
        default=None,
        metadata={
            "name": "RcvPolarizationOffset",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "min_inclusive": -180.0,
            "max_inclusive": 180.0,
        },
    )
    processed: Optional[bool] = field(
        default=None,
        metadata={
            "name": "Processed",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )


@dataclass
class AnnotationType:
    """
    Single annotation.

    :ivar identifier: Identifier for the annotation which idicates the type of object represented by this
        annotation.
    :ivar spatial_reference_system: Spatial reference system of the annotation.  Assumed to be WGS-84 geographic
        coordinate system if not specified with (lat, lon, h) units in (arc-sec, arc-sec, meters above
        ellipsoid).
    :ivar object_value: The geometrical representation of the annotation.
    """

    identifier: Optional[str] = field(
        default=None,
        metadata={
            "name": "Identifier",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    spatial_reference_system: Optional[ReferenceSystemType] = field(
        default=None,
        metadata={
            "name": "SpatialReferenceSystem",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    object_value: List[AnnotationObjectType] = field(
        default_factory=list,
        metadata={
            "name": "Object",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "min_occurs": 1,
        },
    )


@dataclass
class DownstreamReprocessingType:
    """
    :ivar geometric_chip: Contains information related to downstream chipping of the product.
    :ivar processing_event: Contains information related to downstream processing of the product.
    """

    geometric_chip: Optional[GeometricChipType] = field(
        default=None,
        metadata={
            "name": "GeometricChip",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    processing_event: List[ProcessingEventType] = field(
        default_factory=list,
        metadata={
            "name": "ProcessingEvent",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )


@dataclass
class ExploitationFeaturesCollectionInformationType:
    """
    General collection information.

    :ivar sensor_name: The name of the sensor.
    :ivar radar_mode: Radar collection mode.  The ModeType refers to the collection type [SPOTLIGHT, STRIPMAP,
        DYNAMIC STRIPMAP].  The optional ModeID is used to represent system-specific mode identifiers.
    :ivar collection_date_time: Collection date and time defined in Coordinated Universal Time (UTC). The seconds
        should be followed by a Z to indicate UTC.
    :ivar local_date_time: Date and time defined in local time.
    :ivar collection_duration: The duration of the collection (units = seconds).
    :ivar resolution: Uniformly-weighted resolution (range and azimuth) processed in the slant plane.
    :ivar input_roi: ROI representing portion of input data used to make this product.
    :ivar polarization: Transmit and receive polarization.
    """

    sensor_name: Optional[str] = field(
        default=None,
        metadata={
            "name": "SensorName",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    radar_mode: Optional[RadarModeType] = field(
        default=None,
        metadata={
            "name": "RadarMode",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    collection_date_time: Optional[XmlDateTime] = field(
        default=None,
        metadata={
            "name": "CollectionDateTime",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    local_date_time: Optional[XmlDateTime] = field(
        default=None,
        metadata={
            "name": "LocalDateTime",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    collection_duration: Optional[float] = field(
        default=None,
        metadata={
            "name": "CollectionDuration",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    resolution: Optional[RangeAzimuthType] = field(
        default=None,
        metadata={
            "name": "Resolution",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    input_roi: Optional[InputROIType] = field(
        default=None,
        metadata={
            "name": "InputROI",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    polarization: List[TxRcvPolarizationType] = field(
        default_factory=list,
        metadata={
            "name": "Polarization",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )


@dataclass
class GeographicCoverageType:
    """
    :ivar georegion_identifier: Identifier for the georegion.
    :ivar footprint: Estimated ground footprint of the product.
    :ivar sub_region: Used to represent hierarchical decomposition into sub-regions.
    :ivar geographic_info: Specifics about the georegion.
    """

    georegion_identifier: List[ParameterType] = field(
        default_factory=list,
        metadata={
            "name": "GeoregionIdentifier",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    footprint: Optional[FootprintType] = field(
        default=None,
        metadata={
            "name": "Footprint",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    sub_region: List["GeographicCoverageType"] = field(
        default_factory=list,
        metadata={
            "name": "SubRegion",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    geographic_info: Optional[GeographicInformationType] = field(
        default=None,
        metadata={
            "name": "GeographicInfo",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )


@dataclass
class MeasurableProjectionType(BaseProjectionType):
    """
    :ivar sample_spacing: Sample spacing in row and column.
    :ivar time_coapoly: Time (units = seconds) at which center of aperture for a given pixel coordinate in the
        product occurs.
    """

    sample_spacing: Optional[RowColDoubleType] = field(
        default=None,
        metadata={
            "name": "SampleSpacing",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    time_coapoly: Optional[Poly2DType] = field(
        default=None,
        metadata={
            "name": "TimeCOAPoly",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )


@dataclass
class PolynomialProjectionType(BaseProjectionType):
    """Polynomial pixel to ground.

    Only used for sensor systems where the radar geometry parameters are not recorded.

    :ivar row_col_to_lat: Polynomial that converts Row/Col to Latitude (degrees).
    :ivar row_col_to_lon: Polynomial that converts Row/Col to Longitude (degrees).
    :ivar row_col_to_alt: Polynomial that converts Row/Col to Altitude (meters above WGS-84 ellipsoid).
    :ivar lat_lon_to_row: Polynomial that converts Latitude (degrees) and Longitude (degrees) to pixel row
        location.
    :ivar lat_lon_to_col: Polynomial that converts Latitude (degrees) and Longitude (degrees) to pixel column
        location
    """

    row_col_to_lat: Optional[Poly2DType] = field(
        default=None,
        metadata={
            "name": "RowColToLat",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    row_col_to_lon: Optional[Poly2DType] = field(
        default=None,
        metadata={
            "name": "RowColToLon",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    row_col_to_alt: Optional[Poly2DType] = field(
        default=None,
        metadata={
            "name": "RowColToAlt",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    lat_lon_to_row: Optional[Poly2DType] = field(
        default=None,
        metadata={
            "name": "LatLonToRow",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    lat_lon_to_col: Optional[Poly2DType] = field(
        default=None,
        metadata={
            "name": "LatLonToCol",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )


@dataclass
class ProductCreationType:
    """
    Contains general information about product creation.

    :ivar processor_information: Details regarding processor.
    :ivar classification: The overall classification of the product.
    :ivar product_name: The output product name defined by the processor.
    :ivar product_class: Class of product. (examples: Dynamic Image, Amplitude Change Detection, Coherent Change
        Detection, etc.).
    :ivar product_type: Type of sub-product. (examples: Frame #, Reference, Match, etc.). This field is only
        needed if there is a suite of associated products.
    :ivar product_creation_extension: Extensible parameters used to support profile-specific needs related to
        product creation.
    """

    processor_information: Optional[ProcessorInformationType] = field(
        default=None,
        metadata={
            "name": "ProcessorInformation",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    classification: Optional[ProductClassificationType] = field(
        default=None,
        metadata={
            "name": "Classification",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    product_name: Optional[str] = field(
        default=None,
        metadata={
            "name": "ProductName",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    product_class: Optional[str] = field(
        default=None,
        metadata={
            "name": "ProductClass",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    product_type: Optional[str] = field(
        default=None,
        metadata={
            "name": "ProductType",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    product_creation_extension: List[ParameterType] = field(
        default_factory=list,
        metadata={
            "name": "ProductCreationExtension",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )


@dataclass
class ProductProcessingType:
    """
    :ivar processing_module: Processing module to keep track of the name and any parameters associated with the
        algorithms used to produce the SIDD.
    """

    processing_module: List[ProcessingModuleType] = field(
        default_factory=list,
        metadata={
            "name": "ProcessingModule",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "min_occurs": 1,
        },
    )


@dataclass
class RemapChoiceType:
    """
    :ivar color_display_remap: Information for proper color display of the data.
    :ivar monochrome_display_remap: Information for proper monochrome display of the data.
    """

    color_display_remap: Optional[ColorDisplayRemapType] = field(
        default=None,
        metadata={
            "name": "ColorDisplayRemap",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    monochrome_display_remap: Optional[MonochromeDisplayRemapType] = field(
        default=None,
        metadata={
            "name": "MonochromeDisplayRemap",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )


@dataclass
class TargetInformationType:
    """
    :ivar identifier: Target may have one or more identifiers.  Examples: names, BE numbers, etc. Use the "name"
        attribute to describe what this is.
    :ivar footprint: Target footprint as defined by polygonal shape.
    :ivar target_information_extension: Generic extension.  Could be used to indicate type of target, terrain,
        etc.
    """

    identifier: List[ParameterType] = field(
        default_factory=list,
        metadata={
            "name": "Identifier",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "min_occurs": 1,
        },
    )
    footprint: Optional[FootprintType] = field(
        default=None,
        metadata={
            "name": "Footprint",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    target_information_extension: List[ParameterType] = field(
        default_factory=list,
        metadata={
            "name": "TargetInformationExtension",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )


@dataclass
class AnnotationsType:
    """
    :ivar annotation: Annotation Object.
    """

    annotation: List[AnnotationType] = field(
        default_factory=list,
        metadata={
            "name": "Annotation",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "min_occurs": 1,
        },
    )


@dataclass
class CylindricalProjectionType(MeasurableProjectionType):
    """
    Cylindrical mapping of the pixel grid.

    :ivar stripmap_direction: Along stripmap direction
    :ivar curvature_radius: Radius of Curvature defined at scene center.  If not present, the radius of curvature
        will be derived based upon the equations provided in the Design and Exploitation Document
    """

    stripmap_direction: Optional[XYZType] = field(
        default=None,
        metadata={
            "name": "StripmapDirection",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    curvature_radius: Optional[float] = field(
        default=None,
        metadata={
            "name": "CurvatureRadius",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )


@dataclass
class ExploitationFeaturesCollectionType:
    """
    :ivar information: General collection information.
    :ivar geometry: Key geometry parameters independent of product processing.
    :ivar phenomenology: Phenomenology related to both the geometry and the final product processing.
    """

    information: Optional[ExploitationFeaturesCollectionInformationType] = field(
        default=None,
        metadata={
            "name": "Information",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    geometry: Optional[ExploitationFeaturesCollectionGeometryType] = field(
        default=None,
        metadata={
            "name": "Geometry",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    phenomenology: Optional[ExploitationFeaturesCollectionPhenomenologyType] = field(
        default=None,
        metadata={
            "name": "Phenomenology",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )


@dataclass
class GeographicAndTargetType:
    """
    :ivar geographic_coverage: Provides geographic coverage information.
    :ivar target_information: Provides target specific geographic information.
    """

    geographic_coverage: Optional[GeographicCoverageType] = field(
        default=None,
        metadata={
            "name": "GeographicCoverage",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    target_information: List[TargetInformationType] = field(
        default_factory=list,
        metadata={
            "name": "TargetInformation",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )


@dataclass
class GeographicProjectionType(MeasurableProjectionType):
    """
    Geographic mapping of the pixel grid.
    """


@dataclass
class PlaneProjectionType(MeasurableProjectionType):
    """
    Planar representation of the pixel grid.

    :ivar product_plane: Plane definition for the product.
    """

    product_plane: Optional[ProductPlaneType] = field(
        default=None,
        metadata={
            "name": "ProductPlane",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )


@dataclass
class ProductDisplayType:
    """
    Type for describing proper display of the derived product.

    :ivar pixel_type: Defines the pixel type, based on enumeration and definition in Design and Exploitation
        document.
    :ivar remap_information: Information regarding the encoding of the pixel data. Used for 8-bit pixel types.
    :ivar magnification_method: Recommended ELT magnification method for this data.
    :ivar decimation_method: Recommended ELT decimation method for this data. Also used as default for reduced
        resolution dataset generation (if applicable).
    :ivar drahistogram_overrides: Recommended ELT DRA overrides.
    :ivar monitor_compensation_applied: Describes monitor compensation that may have been applied to the product
        during processing.
    :ivar display_extension: Extensible parameters used to support profile-specific needs related to product
        display.
    """

    pixel_type: Optional[PixelType] = field(
        default=None,
        metadata={
            "name": "PixelType",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    remap_information: Optional[RemapChoiceType] = field(
        default=None,
        metadata={
            "name": "RemapInformation",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    magnification_method: Optional[MagnificationMethodType] = field(
        default=None,
        metadata={
            "name": "MagnificationMethod",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    decimation_method: Optional[DecimationMethodType] = field(
        default=None,
        metadata={
            "name": "DecimationMethod",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    drahistogram_overrides: Optional[DRAHistogramOverridesType] = field(
        default=None,
        metadata={
            "name": "DRAHistogramOverrides",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    monitor_compensation_applied: Optional[MonitorCompensationAppliedType] = field(
        default=None,
        metadata={
            "name": "MonitorCompensationApplied",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    display_extension: List[ParameterType] = field(
        default_factory=list,
        metadata={
            "name": "DisplayExtension",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )


@dataclass
class ExploitationFeaturesType:
    """
    Computed metadata regarding the collect.

    :ivar collection: Metadata regarding one of the input collections.
    :ivar product: Metadata regarding the product.
    """

    collection: List["ExploitationFeaturesType.Collection"] = field(
        default_factory=list,
        metadata={
            "name": "Collection",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "min_occurs": 1,
        },
    )
    product: Optional[ExploitationFeaturesProductType] = field(
        default=None,
        metadata={
            "name": "Product",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )

    @dataclass
    class Collection(ExploitationFeaturesCollectionType):
        identifier: Optional[str] = field(
            default=None,
            metadata={
                "type": "Attribute",
                "required": True,
            },
        )


@dataclass
class MeasurementType:
    """
    Geometric SAR information required for measurement/geolocation.

    :ivar polynomial_projection: Polynomial pixel to ground.  Only used for sensor systems where the radar
        geometry parameters are not recorded.
    :ivar geographic_projection: Geographic mapping of the pixel grid referred to as GGD in the Design and
        Exploitation document.
    :ivar plane_projection: Planar representation of the pixel grid referred to as PGD in the Design and
        Exploitation document.
    :ivar cylindrical_projection: Cylindrical mapping of the pixel grid referred to as CGD in the Design and
        Exploitation document.
    :ivar pixel_footprint: Size of the image.
    :ivar arppoly: Center of aperture polynomial (units = m) based upon time into the collect.
    """

    polynomial_projection: Optional[PolynomialProjectionType] = field(
        default=None,
        metadata={
            "name": "PolynomialProjection",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    geographic_projection: Optional[GeographicProjectionType] = field(
        default=None,
        metadata={
            "name": "GeographicProjection",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    plane_projection: Optional[PlaneProjectionType] = field(
        default=None,
        metadata={
            "name": "PlaneProjection",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    cylindrical_projection: Optional[CylindricalProjectionType] = field(
        default=None,
        metadata={
            "name": "CylindricalProjection",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
        },
    )
    pixel_footprint: Optional[RowColIntType] = field(
        default=None,
        metadata={
            "name": "PixelFootprint",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )
    arppoly: Optional[XYZPolyType] = field(
        default=None,
        metadata={
            "name": "ARPPoly",
            "type": "Element",
            "namespace": "urn:SIDD:1.0.0",
            "required": True,
        },
    )


@dataclass
class SIDD:
    """
    Root element of the SIDD document.

    :ivar product_creation: Information related to processor, classification, and product type.
    :ivar display: Contains information on the parameters needed to display the product in an exploitation tool.
    :ivar geographic_and_target: Contains generic and extensible targeting and geographic region information.
    :ivar measurement: Contains the metadata necessary for performing measurements.
    :ivar exploitation_features: Computed metadata regarding the input collections and final product.
    :ivar product_processing: Contains metadata related to algorithms used during product generation.
    :ivar downstream_reprocessing: Contains metadata related to downstream processing of the product.
    :ivar error_statistics: See SICD documentation for metadata definitions.
    :ivar radiometric: Radiometric information about the product.
    :ivar annotations: List of annotations for the imagery.
    """

    class Meta:
        namespace = "urn:SIDD:1.0.0"

    product_creation: Optional[ProductCreationType] = field(
        default=None,
        metadata={
            "name": "ProductCreation",
            "type": "Element",
            "required": True,
        },
    )
    display: Optional[ProductDisplayType] = field(
        default=None,
        metadata={
            "name": "Display",
            "type": "Element",
            "required": True,
        },
    )
    geographic_and_target: Optional[GeographicAndTargetType] = field(
        default=None,
        metadata={
            "name": "GeographicAndTarget",
            "type": "Element",
            "required": True,
        },
    )
    measurement: Optional[MeasurementType] = field(
        default=None,
        metadata={
            "name": "Measurement",
            "type": "Element",
            "required": True,
        },
    )
    exploitation_features: Optional[ExploitationFeaturesType] = field(
        default=None,
        metadata={
            "name": "ExploitationFeatures",
            "type": "Element",
            "required": True,
        },
    )
    product_processing: Optional[ProductProcessingType] = field(
        default=None,
        metadata={
            "name": "ProductProcessing",
            "type": "Element",
        },
    )
    downstream_reprocessing: Optional[DownstreamReprocessingType] = field(
        default=None,
        metadata={
            "name": "DownstreamReprocessing",
            "type": "Element",
        },
    )
    error_statistics: Optional[ErrorStatisticsType] = field(
        default=None,
        metadata={
            "name": "ErrorStatistics",
            "type": "Element",
        },
    )
    radiometric: Optional[RadiometricType] = field(
        default=None,
        metadata={
            "name": "Radiometric",
            "type": "Element",
        },
    )
    annotations: Optional[AnnotationsType] = field(
        default=None,
        metadata={
            "name": "Annotations",
            "type": "Element",
        },
    )
