#  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_v13.schema.ism.cvegenerated.cvenum_ism25_x import CVEnumISM25X
from .external.ism_v13.schema.ism.cvegenerated.cvenum_ismatomic_energy_markings import (
    CVEnumISMatomicEnergyMarkingsValuesvalue,
)
from .external.ism_v13.schema.ism.cvegenerated.cvenum_ismclassification_all import CVEnumISMClassificationAll
from .external.ism_v13.schema.ism.cvegenerated.cvenum_ismcomplies_with import CVEnumISMCompliesWithValues
from .external.ism_v13.schema.ism.cvegenerated.cvenum_ismdissem import CVEnumISMDissemValues
from .external.ism_v13.schema.ism.cvegenerated.cvenum_ismexempt_from import CVEnumISMExemptFromValues
from .external.ism_v13.schema.ism.cvegenerated.cvenum_ismnon_ic import CVEnumISMNonICValuesvalue
from .external.ism_v13.schema.ism.cvegenerated.cvenum_ismnon_uscontrols import CVEnumISMNonUSControlsValues
from .external.ism_v13.schema.ism.cvegenerated.cvenum_ismnotice import CVEnumISMNoticeValues
from .external.ism_v13.schema.ism.cvegenerated.cvenum_ismscicontrols import CVEnumISMSCIControlsValuesvalue
from .external.ism_v13.schema.ismcat.cvegenerated.cvenum_ismcatfgiopen import CVEnumISMCATFGIOpenValuesvalue
from .external.ism_v13.schema.ismcat.cvegenerated.cvenum_ismcatfgiprotected import CVEnumISMCATFGIProtectedValuesvalue
from .external.ism_v13.schema.ismcat.cvegenerated.cvenum_ismcatowner_producer import CVEnumISMCATOwnerProducerValuesvalue
from .external.ism_v13.schema.ismcat.cvegenerated.cvenum_ismcatrel_to import CVEnumISMCATRelToValuesvalue
from .sfa import LinearRingType, LineType, MultiLineStringType, MultiPointType, MultiPolygonType, PointType
from .sfa import PolygonType as SfaPolygonType
from .sfa import PolyhedralSurfaceType, ReferenceSystemType
from .sicommon_types_v1_0 import (
    AngleZeroToExclusive360MagnitudeType,
    CornerStringType,
    ErrorStatisticsType,
    GeoInfo,
    LatLonType,
    LatLonVertexType,
    MatchInfoType,
    ParameterType,
    Polarization1Typevalue,
    Poly2DType,
    RadarModeType,
    RadiometricType,
    RangeAzimuthType,
    ReferencePointType,
    RowColDoubleType,
    RowColIntType,
    RowColVertexType,
    XYZPolyType,
    XYZType,
)

__NAMESPACE__ = "urn:SIDD:3.0.0"


@dataclass
class AccuracyType:
    horizontal: List[float] = field(
        default_factory=list,
        metadata={
            "name": "Horizontal",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "min_occurs": 1,
        },
    )
    vertical: List[float] = field(
        default_factory=list,
        metadata={
            "name": "Vertical",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "min_occurs": 1,
        },
    )


@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:3.0.0",
            "required": True,
        },
    )
    date: Optional[XmlDate] = field(
        default=None,
        metadata={
            "name": "Date",
            "type": "Element",
            "namespace": "urn:SIDD:3.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:3.0.0",
            "required": True,
        },
    )
    clip_max: Optional[int] = field(
        default=None,
        metadata={
            "name": "ClipMax",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )


@dataclass
class DRAOverrides:
    """
    :ivar subtractor: Subtractor value used to reduce haze in the image. Range: [0.0 to 2047.0]
    :ivar multiplier: Multiplier value used to reduce haze in the image. Range: [0.0 to 2047.0]
    """

    subtractor: Optional[float] = field(
        default=None,
        metadata={
            "name": "Subtractor",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    multiplier: Optional[float] = field(
        default=None,
        metadata={
            "name": "Multiplier",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )


@dataclass
class DRAParameters:
    """
    :ivar pmin: DRA clip low point. This is the cumulative histogram percentage value that defines the lower end-
        point of the dynamic range to be displayed. Range: [0.0 to 1.0]
    :ivar pmax: DRA clip high point. This is the cumulative histogram percentage value that defines the upper
        end-point of the dynamic range to be displayed. Range: [0.0 to 1.0]
    :ivar emin_modifier: The pixel value corresponding to the Pmin percentage poitn in the image histogram.
        Range: [0.0 to 1.0]/
    :ivar emax_modifier: The pixel value corresponding to the Pmax percentage poitn in the image histogram.
        Range: [0.0 to 1.0]/
    """

    pmin: Optional[float] = field(
        default=None,
        metadata={
            "name": "Pmin",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    pmax: Optional[float] = field(
        default=None,
        metadata={
            "name": "Pmax",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    emin_modifier: Optional[float] = field(
        default=None,
        metadata={
            "name": "EminModifier",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    emax_modifier: Optional[float] = field(
        default=None,
        metadata={
            "name": "EmaxModifier",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )


class DownsamplingMethodType(Enum):
    DECIMATE = "DECIMATE"
    MAX_PIXEL = "MAX PIXEL"
    AVERAGE = "AVERAGE"
    NEAREST_NEIGHBOR = "NEAREST NEIGHBOR"
    BILINEAR = "BILINEAR"
    LAGRANGE = "LAGRANGE"


class EarthModelType(Enum):
    """Identifies the earth model used for latitude, longitude and height
    parameters.

    All height values are Height Above The Ellipsoid (HAE).
    """

    WGS_84 = "WGS_84"


class EqualizationAlgorithmType(Enum):
    VALUE_1_DLUT = "1DLUT"


@dataclass
class FilterBankCoefType:
    coef: List["FilterBankCoefType.Coef"] = field(
        default_factory=list,
        metadata={
            "name": "Coef",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "min_occurs": 1,
        },
    )
    num_phasings: Optional[int] = field(
        default=None,
        metadata={
            "name": "numPhasings",
            "type": "Attribute",
            "required": True,
        },
    )
    num_points: Optional[int] = field(
        default=None,
        metadata={
            "name": "numPoints",
            "type": "Attribute",
            "required": True,
        },
    )

    @dataclass
    class Coef:
        value: Optional[float] = field(
            default=None,
            metadata={
                "required": True,
            },
        )
        phasing: Optional[int] = field(
            default=None,
            metadata={
                "type": "Attribute",
                "required": True,
            },
        )
        point: Optional[int] = field(
            default=None,
            metadata={
                "type": "Attribute",
                "required": True,
            },
        )


class FilterDatabaseNameType(Enum):
    BILINEAR = "BILINEAR"
    CUBIC = "CUBIC"
    LAGRANGE = "LAGRANGE"
    NEAREST_NEIGHBOR = "NEAREST NEIGHBOR"


@dataclass
class FilterKernelCoefType:
    coef: List["FilterKernelCoefType.Coef"] = field(
        default_factory=list,
        metadata={
            "name": "Coef",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "min_occurs": 1,
        },
    )
    num_rows: Optional[int] = field(
        default=None,
        metadata={
            "name": "numRows",
            "type": "Attribute",
            "required": True,
        },
    )
    num_cols: Optional[int] = field(
        default=None,
        metadata={
            "name": "numCols",
            "type": "Attribute",
            "required": True,
        },
    )

    @dataclass
    class Coef:
        value: Optional[float] = field(
            default=None,
            metadata={
                "required": True,
            },
        )
        row: Optional[int] = field(
            default=None,
            metadata={
                "type": "Attribute",
                "required": True,
            },
        )
        col: Optional[int] = field(
            default=None,
            metadata={
                "type": "Attribute",
                "required": True,
            },
        )


class FilterOperationType(Enum):
    CONVOLUTION = "CONVOLUTION"
    CORRELATION = "CORRELATION"


class GeopositioningTypeCoordinateSystemType(Enum):
    GCS = "GCS"
    UTM = "UTM"


class GeopositioningTypeGeodeticDatum(Enum):
    WORLD_GEODETIC_SYSTEM_1984 = "World Geodetic System 1984"


class GeopositioningTypeReferenceEllipsoid(Enum):
    WORLD_GEODETIC_SYSTEM_1984 = "World Geodetic System 1984"


class GeopositioningTypeSoundingDatum(Enum):
    MEAN_SEA_LEVEL = "Mean Sea Level"


class GeopositioningTypeVerticalDatum(Enum):
    MEAN_SEA_LEVEL = "Mean Sea Level"


@dataclass
class LayerType:
    """
    :ivar bitrate: The bit rate target associated with the layer. It may happen that the bit rate was not
        achieved due to data characteristics. Note: for JPEG 2000 numerically lossless quality, the bit rate for
        the final layer is an expected value, based on performance.
    :ivar index:
    """

    bitrate: Optional[float] = field(
        default=None,
        metadata={
            "name": "Bitrate",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    index: Optional[int] = field(
        default=None,
        metadata={
            "type": "Attribute",
            "required": True,
        },
    )


@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 lut: Size of LUT.
    """

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


class MeasurementTypeARPFlag(Enum):
    """
    :cvar REALTIME: Based on ephemeries at time of collect
    :cvar PREDICTED: Based on predicted ephemeries (i.e. pre-collect)
    :cvar POST_PROCESSED: Ephemeris has been refined after data collection
    """

    REALTIME = "REALTIME"
    PREDICTED = "PREDICTED"
    POST_PROCESSED = "POST PROCESSED"


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


@dataclass
class PredefinedLookupType:
    """
    :ivar database_name: Database name of LUT to use.
    :ivar remap_family: Index specifying the remap family.
    :ivar remap_member: Index specifying the member for the remap family.
    """

    database_name: Optional[str] = field(
        default=None,
        metadata={
            "name": "DatabaseName",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    remap_family: Optional[int] = field(
        default=None,
        metadata={
            "name": "RemapFamily",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    remap_member: Optional[int] = field(
        default=None,
        metadata={
            "name": "RemapMember",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )


@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:3.0.0",
            "required": True,
        },
    )
    processing_date_time: Optional[XmlDateTime] = field(
        default=None,
        metadata={
            "name": "ProcessingDateTime",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    site: Optional[str] = field(
        default=None,
        metadata={
            "name": "Site",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    profile: Optional[str] = field(
        default=None,
        metadata={
            "name": "Profile",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )


class RangeAdjustmentAlgorithmType(Enum):
    """
    Algorithm used for dynamic range adjustment.
    """

    AUTO = "AUTO"
    MANUAL = "MANUAL"
    NONE = "NONE"


class RenderingIntentType(Enum):
    PERCEPTUAL = "PERCEPTUAL"
    SATURATION = "SATURATION"
    RELATIVE = "RELATIVE"
    ABSOLUTE = "ABSOLUTE"


class ShadowDirectionType(Enum):
    """
    Descirbes the shadow direciton relative to the pixels in the file.
    """

    UP = "UP"
    DOWN = "DOWN"
    LEFT = "LEFT"
    RIGHT = "RIGHT"
    ARBITRARY = "ARBITRARY"


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

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


@dataclass
class BankCustomType:
    filter_coefficients: Optional[FilterBankCoefType] = field(
        default=None,
        metadata={
            "name": "FilterCoefficients",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )


@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:3.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:3.0.0",
            "required": True,
        },
    )


@dataclass
class ColorManagementModuleType:
    """
    Parameters describing the Color Management Module (CMM).

    :ivar rendering_intent:
    :ivar source_profile: Name of sensor profile in ICC Profile database.
    :ivar display_profile: Name of display profile in ICC Profile database.
    :ivar iccprofile_signature: Valid ICC profile signature.
    """

    rendering_intent: Optional[RenderingIntentType] = field(
        default=None,
        metadata={
            "name": "RenderingIntent",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    source_profile: Optional[str] = field(
        default=None,
        metadata={
            "name": "SourceProfile",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    display_profile: Optional[str] = field(
        default=None,
        metadata={
            "name": "DisplayProfile",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    iccprofile_signature: Optional[str] = field(
        default=None,
        metadata={
            "name": "ICCProfileSignature",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )


@dataclass
class DynamicRangeAdjustmentType:
    """
    Parameter describing DRA.

    :ivar algorithm_type: Algorithm used for dynamic range adjustment.
    :ivar band_stats_source: Indicates which band to use in computing statistics for DRA. Valid range = 1 to
        NumBands.
    :ivar draparameters:
    :ivar draoverrides:
    """

    algorithm_type: Optional[RangeAdjustmentAlgorithmType] = field(
        default=None,
        metadata={
            "name": "AlgorithmType",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    band_stats_source: Optional[int] = field(
        default=None,
        metadata={
            "name": "BandStatsSource",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    draparameters: Optional[DRAParameters] = field(
        default=None,
        metadata={
            "name": "DRAParameters",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    draoverrides: Optional[DRAOverrides] = field(
        default=None,
        metadata={
            "name": "DRAOverrides",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )


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

    All values computed at the center time of the full collection.

    :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 positive, right-
        look is negative.
    :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 doppler_cone_angle: The angle between the velocity vector and the radar line-of-sight vector. Also
        known as the slant plane squint 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:3.0.0",
            "min_inclusive": 0.0,
            "max_exclusive": 360.0,
        },
    )
    slope: Optional[float] = field(
        default=None,
        metadata={
            "name": "Slope",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "min_inclusive": 0.0,
            "max_inclusive": 90.0,
        },
    )
    squint: Optional[float] = field(
        default=None,
        metadata={
            "name": "Squint",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "min_inclusive": -180.0,
            "max_inclusive": 180.0,
        },
    )
    graze: Optional[float] = field(
        default=None,
        metadata={
            "name": "Graze",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "min_inclusive": 0.0,
            "max_inclusive": 90.0,
        },
    )
    tilt: Optional[float] = field(
        default=None,
        metadata={
            "name": "Tilt",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "min_inclusive": -180.0,
            "max_inclusive": 180.0,
        },
    )
    doppler_cone_angle: Optional[float] = field(
        default=None,
        metadata={
            "name": "DopplerConeAngle",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "min_inclusive": 0.0,
            "max_exclusive": 180.0,
        },
    )
    extension: List[ParameterType] = field(
        default_factory=list,
        metadata={
            "name": "Extension",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )


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

    All values computed at the center time of the full collection.

    :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[AngleZeroToExclusive360MagnitudeType] = field(
        default=None,
        metadata={
            "name": "Shadow",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    layover: Optional[AngleZeroToExclusive360MagnitudeType] = field(
        default=None,
        metadata={
            "name": "Layover",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    multi_path: Optional[float] = field(
        default=None,
        metadata={
            "name": "MultiPath",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "min_inclusive": 0.0,
            "max_exclusive": 360.0,
        },
    )
    ground_track: Optional[float] = field(
        default=None,
        metadata={
            "name": "GroundTrack",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "min_inclusive": 0.0,
            "max_exclusive": 360.0,
        },
    )
    extension: List[ParameterType] = field(
        default_factory=list,
        metadata={
            "name": "Extension",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )


@dataclass
class GeographicCoordinatesType:
    """
    Describes the Local Geographic Coordinate system linking row/column to the
    absolute geographic coordinate (lat/lon)

    :ivar longitude_density: Pixel ground spacing in E/W direction that is the number of pixels or element
        intervals in 360 degrees.
    :ivar latitude_density: Pixel ground spacing in N/S direction that is the number of pixels or element
        intervals in 360 degrees.
    :ivar reference_origin: Northwest corner Latitude/Longitude - product NW corner
    """

    longitude_density: Optional[float] = field(
        default=None,
        metadata={
            "name": "LongitudeDensity",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    latitude_density: Optional[float] = field(
        default=None,
        metadata={
            "name": "LatitudeDensity",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    reference_origin: Optional[LatLonType] = field(
        default=None,
        metadata={
            "name": "ReferenceOrigin",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )


@dataclass
class GeometricChipType:
    """Contains information related to downstream chipping of the product.

    There is only one instance, and the instance is updated with respect to the full image parameters. For
    example, if an image is chipped out of a smaller chip, the new chip needs to be updated to the original full
    image corners. Since this relationship is linear, bi-linear interpolation is sufficient to determine an
    arbitrary chip coordinate in terms of the original full image coordinates. Chipping is typically done using
    an exploitation tool, and should not be done in the initial product creation.

    :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:3.0.0",
            "required": True,
        },
    )
    original_upper_left_coordinate: Optional[RowColDoubleType] = field(
        default=None,
        metadata={
            "name": "OriginalUpperLeftCoordinate",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    original_upper_right_coordinate: Optional[RowColDoubleType] = field(
        default=None,
        metadata={
            "name": "OriginalUpperRightCoordinate",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    original_lower_left_coordinate: Optional[RowColDoubleType] = field(
        default=None,
        metadata={
            "name": "OriginalLowerLeftCoordinate",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    original_lower_right_coordinate: Optional[RowColDoubleType] = field(
        default=None,
        metadata={
            "name": "OriginalLowerRightCoordinate",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )


@dataclass
class GeopositioningType:
    """
    Describes the absolute coordinate system to which the data is referenced.

    :ivar coordinate_system_type:
    :ivar geodetic_datum:
    :ivar reference_ellipsoid:
    :ivar vertical_datum:
    :ivar sounding_datum:
    :ivar false_origin: Z values false origin
    :ivar utmgrid_zone_number: Gride zone number, required for UTM, not include for GCS. (4 character field)
        Values: +001 to +060 (northern hemisphere) -001 to -060 (southern hemisphere)
    """

    coordinate_system_type: Optional[GeopositioningTypeCoordinateSystemType] = field(
        default=None,
        metadata={
            "name": "CoordinateSystemType",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    geodetic_datum: Optional[GeopositioningTypeGeodeticDatum] = field(
        default=None,
        metadata={
            "name": "GeodeticDatum",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    reference_ellipsoid: Optional[GeopositioningTypeReferenceEllipsoid] = field(
        default=None,
        metadata={
            "name": "ReferenceEllipsoid",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    vertical_datum: Optional[GeopositioningTypeVerticalDatum] = field(
        default=None,
        metadata={
            "name": "VerticalDatum",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    sounding_datum: Optional[GeopositioningTypeSoundingDatum] = field(
        default=None,
        metadata={
            "name": "SoundingDatum",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    false_origin: Optional[int] = field(
        default=None,
        metadata={
            "name": "FalseOrigin",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    utmgrid_zone_number: Optional[int] = field(
        default=None,
        metadata={
            "name": "UTMGridZoneNumber",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )


@dataclass
class ImageCornersType:
    """Parameters apply to image corners of the product projected to the same
    height as the SCP.

    These corners are an approximate geographic location that is not intended for analytical use.

    :ivar icp: Image Corner Point (ICP) data for the 4 corners in product. ICPs indexed x = 1, 2, 3, 4,
        clockwise.
    """

    icp: List["ImageCornersType.ICP"] = field(
        default_factory=list,
        metadata={
            "name": "ICP",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "min_occurs": 4,
            "max_occurs": 4,
        },
    )

    @dataclass
    class ICP(LatLonType):
        index: Optional[CornerStringType] = field(
            default=None,
            metadata={
                "type": "Attribute",
                "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:3.0.0",
            "required": True,
        },
    )
    upper_left: Optional[RowColIntType] = field(
        default=None,
        metadata={
            "name": "UpperLeft",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )


@dataclass
class KernelCustomType:
    filter_coefficients: Optional[FilterKernelCoefType] = field(
        default=None,
        metadata={
            "name": "FilterCoefficients",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )


@dataclass
class LUTInfoType:
    lutvalues: List[LookupTableType] = field(
        default_factory=list,
        metadata={
            "name": "LUTValues",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "min_occurs": 1,
        },
    )
    num_luts: Optional[int] = field(
        default=None,
        metadata={
            "name": "numLuts",
            "type": "Attribute",
            "required": True,
        },
    )
    size: Optional[int] = field(
        default=None,
        metadata={
            "type": "Attribute",
            "required": True,
        },
    )


@dataclass
class LayerInfoType:
    """Original Layer Information.

    The following fileds repeat for all layers in (0, 1, ..., numLayers - 1).
    The default number of layers per tile in original image out of the original processor.

    :ivar layer: Layer Index Number indicates the number of layers being described. Layers are numbered from 0 to
        (numLayers - 1).
    :ivar num_layers:
    """

    layer: List[LayerType] = field(
        default_factory=list,
        metadata={
            "name": "Layer",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "min_occurs": 1,
        },
    )
    num_layers: Optional[int] = field(
        default=None,
        metadata={
            "name": "numLayers",
            "type": "Attribute",
            "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_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:3.0.0",
            "required": True,
        },
    )
    remap_parameter: List[ParameterType] = field(
        default_factory=list,
        metadata={
            "name": "RemapParameter",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )


@dataclass
class Orientation:
    """
    Parameters describing the default orientation of the product.

    :ivar shadow_direction: Descirbes the shadow direciton relative to the pixels in the file.
    """

    shadow_direction: Optional[ShadowDirectionType] = field(
        default=None,
        metadata={
            "name": "ShadowDirection",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )


@dataclass
class PolygonType:
    """Indicates the full image includes both valid data and some zero filled
    pixels.

    Simple convex polygon enclosed the valid data (may include some zero filled pixels for simplification).
    Vertices in clockwise order.

    :ivar vertex: Vertices indexed n = 1, 2, ..., NumVertices. NumVertices &gt;= 3. Vertex 1 is determined by (1)
        minimum row index, (2) minimum column index if 2 vertices with minimum row index, 1st and last vertices
        are connected to form the polygon.
    :ivar size:
    """

    vertex: List[LatLonVertexType] = field(
        default_factory=list,
        metadata={
            "name": "Vertex",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "min_occurs": 3,
        },
    )
    size: Optional[int] = field(
        default=None,
        metadata={
            "type": "Attribute",
            "required": True,
        },
    )


@dataclass
class PositionalAccuracyType:
    """
    Describes the horizontal and vertical point and regional information for the
    DED.

    :ivar num_regions: Number of positional accuracy regions.
    :ivar absolute_accuracy:
    :ivar point_to_point_accuracy:
    """

    num_regions: Optional[int] = field(
        default=None,
        metadata={
            "name": "NumRegions",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    absolute_accuracy: Optional[AccuracyType] = field(
        default=None,
        metadata={
            "name": "AbsoluteAccuracy",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    point_to_point_accuracy: Optional[AccuracyType] = field(
        default=None,
        metadata={
            "name": "PointToPointAccuracy",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )


@dataclass
class PredefinedFilterType:
    database_name: Optional[FilterDatabaseNameType] = field(
        default=None,
        metadata={
            "name": "DatabaseName",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    filter_family: Optional[int] = field(
        default=None,
        metadata={
            "name": "FilterFamily",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    filter_member: Optional[int] = field(
        default=None,
        metadata={
            "name": "FilterMember",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )


@dataclass
class ProcTxRcvPolarizationType:
    """
    :ivar tx_polarization_proc: Polarization transmit type
    :ivar rcv_polarization_proc: Receive polarization type
    """

    tx_polarization_proc: Optional[Union[str, Polarization1Typevalue]] = field(
        default=None,
        metadata={
            "name": "TxPolarizationProc",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
            "pattern": r"OTHER.*",
        },
    )
    rcv_polarization_proc: Optional[Union[str, Polarization1Typevalue]] = field(
        default=None,
        metadata={
            "name": "RcvPolarizationProc",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
            "pattern": r"OTHER.*",
        },
    )


@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:3.0.0",
            "required": True,
        },
    )
    applied_date_time: Optional[XmlDateTime] = field(
        default=None,
        metadata={
            "name": "AppliedDateTime",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    interpolation_method: Optional[str] = field(
        default=None,
        metadata={
            "name": "InterpolationMethod",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    descriptor: List[ParameterType] = field(
        default_factory=list,
        metadata={
            "name": "Descriptor",
            "type": "Element",
            "namespace": "urn:SIDD:3.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:3.0.0",
            "required": True,
        },
    )
    module_parameter: List[ParameterType] = field(
        default_factory=list,
        metadata={
            "name": "ModuleParameter",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    processing_module: List["ProcessingModuleType"] = field(
        default_factory=list,
        metadata={
            "name": "ProcessingModule",
            "type": "Element",
            "namespace": "urn:SIDD:3.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:
    :ivar ismcatcesversion:
    :ivar resource_element:
    :ivar complies_with:
    :ivar create_date:
    :ivar exempt_from:
    :ivar classification:
    :ivar owner_producer:
    :ivar joint:
    :ivar scicontrols:
    :ivar saridentifier:
    :ivar atomic_energy_markings:
    :ivar dissemination_controls:
    :ivar display_only_to:
    :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 notice_type:
    :ivar notice_reason:
    :ivar notice_date:
    :ivar unregistered_notice_type:
    :ivar external_notice:
    """

    security_extension: List[ParameterType] = field(
        default_factory=list,
        metadata={
            "name": "SecurityExtension",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    desversion: Optional[str] = field(
        default=None,
        metadata={
            "name": "DESVersion",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
            "required": True,
            "max_length": 256,
        },
    )
    ismcatcesversion: Optional[str] = field(
        default=None,
        metadata={
            "name": "ISMCATCESVersion",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
            "required": True,
            "max_length": 256,
        },
    )
    resource_element: Optional[bool] = field(
        default=None,
        metadata={
            "name": "resourceElement",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
            "required": True,
        },
    )
    complies_with: List[CVEnumISMCompliesWithValues] = field(
        default_factory=list,
        metadata={
            "name": "compliesWith",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
            "required": True,
            "tokens": True,
        },
    )
    create_date: Optional[XmlDate] = field(
        default=None,
        metadata={
            "name": "createDate",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
            "required": True,
        },
    )
    exempt_from: List[CVEnumISMExemptFromValues] = field(
        default_factory=list,
        metadata={
            "name": "exemptFrom",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
            "tokens": True,
        },
    )
    classification: Optional[CVEnumISMClassificationAll] = field(
        default=None,
        metadata={
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
            "required": True,
        },
    )
    owner_producer: List[Union[str, CVEnumISMCATOwnerProducerValuesvalue]] = field(
        default_factory=list,
        metadata={
            "name": "ownerProducer",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
            "required": True,
            "pattern": r"NATO/[a-zA-Z\-_]",
            "tokens": True,
        },
    )
    joint: Optional[bool] = field(
        default=None,
        metadata={
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
        },
    )
    scicontrols: List[Union[str, CVEnumISMSCIControlsValuesvalue]] = field(
        default_factory=list,
        metadata={
            "name": "SCIcontrols",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
            "pattern": r"KDK-BLFH-[A-Z0-9]{1,6}|KDK-IDIT-[A-Z0-9]{1,6}|KDK-KAND-[A-Z0-9]{1,6}|RSV-[A-Z0-9]{3}|SI-G-[A-Z]{4}|SI-[A-Z]{3}|SI-[A-Z]{3}-[A-Z]{4}",
            "tokens": True,
        },
    )
    saridentifier: List[str] = field(
        default_factory=list,
        metadata={
            "name": "SARIdentifier",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
            "pattern": r"[A-Z_0-9\-]{1,100}|[A-Z]{2,}|[A-Z]{2,}-[A-Z][A-Z0-9]+|[A-Z]{2,}-[A-Z][A-Z0-9]+-[A-Z0-9]{2,}",
            "tokens": True,
        },
    )
    atomic_energy_markings: List[Union[str, CVEnumISMatomicEnergyMarkingsValuesvalue]] = field(
        default_factory=list,
        metadata={
            "name": "atomicEnergyMarkings",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
            "pattern": r"RD-SG-((14)|(15)|(18)|(20))|FRD-SG-((14)|(15)|(18)|(20))",
            "tokens": True,
        },
    )
    dissemination_controls: List[CVEnumISMDissemValues] = field(
        default_factory=list,
        metadata={
            "name": "disseminationControls",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
            "tokens": True,
        },
    )
    display_only_to: List[Union[str, CVEnumISMCATRelToValuesvalue]] = field(
        default_factory=list,
        metadata={
            "name": "displayOnlyTo",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
            "pattern": r"NATO/[a-zA-Z\-_]",
            "tokens": True,
        },
    )
    fgisource_open: List[Union[str, CVEnumISMCATFGIOpenValuesvalue]] = field(
        default_factory=list,
        metadata={
            "name": "FGIsourceOpen",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
            "pattern": r"NATO/[a-zA-Z\-_]",
            "tokens": True,
        },
    )
    fgisource_protected: List[Union[str, CVEnumISMCATFGIProtectedValuesvalue]] = field(
        default_factory=list,
        metadata={
            "name": "FGIsourceProtected",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
            "pattern": r"NATO/[a-zA-Z\-_]",
            "tokens": True,
        },
    )
    releasable_to: List[Union[str, CVEnumISMCATRelToValuesvalue]] = field(
        default_factory=list,
        metadata={
            "name": "releasableTo",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
            "pattern": r"NATO/[a-zA-Z\-_]",
            "tokens": True,
        },
    )
    non_icmarkings: List[Union[str, CVEnumISMNonICValuesvalue]] = field(
        default_factory=list,
        metadata={
            "name": "nonICmarkings",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
            "pattern": r"ACCM-[A-Z0-9\-_]{1,61}|NNPI",
            "tokens": True,
        },
    )
    classified_by: Optional[str] = field(
        default=None,
        metadata={
            "name": "classifiedBy",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
            "max_length": 1024,
        },
    )
    compilation_reason: Optional[str] = field(
        default=None,
        metadata={
            "name": "compilationReason",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
            "max_length": 1024,
        },
    )
    derivatively_classified_by: Optional[str] = field(
        default=None,
        metadata={
            "name": "derivativelyClassifiedBy",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
            "max_length": 1024,
        },
    )
    classification_reason: Optional[str] = field(
        default=None,
        metadata={
            "name": "classificationReason",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
            "max_length": 4096,
        },
    )
    non_uscontrols: List[CVEnumISMNonUSControlsValues] = field(
        default_factory=list,
        metadata={
            "name": "nonUSControls",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
            "tokens": True,
        },
    )
    derived_from: Optional[str] = field(
        default=None,
        metadata={
            "name": "derivedFrom",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
            "max_length": 1024,
        },
    )
    declass_date: Optional[XmlDate] = field(
        default=None,
        metadata={
            "name": "declassDate",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
        },
    )
    declass_event: Optional[str] = field(
        default=None,
        metadata={
            "name": "declassEvent",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
            "max_length": 1024,
        },
    )
    declass_exception: Optional[CVEnumISM25X] = field(
        default=None,
        metadata={
            "name": "declassException",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
        },
    )
    notice_type: List[CVEnumISMNoticeValues] = field(
        default_factory=list,
        metadata={
            "name": "noticeType",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
            "tokens": True,
        },
    )
    notice_reason: Optional[str] = field(
        default=None,
        metadata={
            "name": "noticeReason",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
            "max_length": 2048,
        },
    )
    notice_date: Optional[XmlDate] = field(
        default=None,
        metadata={
            "name": "noticeDate",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
        },
    )
    unregistered_notice_type: Optional[str] = field(
        default=None,
        metadata={
            "name": "unregisteredNoticeType",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
            "max_length": 2048,
        },
    )
    external_notice: Optional[bool] = field(
        default=None,
        metadata={
            "name": "externalNotice",
            "type": "Attribute",
            "namespace": "urn:us:gov:ic:ism:13",
        },
    )


@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:3.0.0",
            "required": True,
        },
    )
    col_unit_vector: Optional[XYZType] = field(
        default=None,
        metadata={
            "name": "ColUnitVector",
            "type": "Element",
            "namespace": "urn:SIDD:3.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.
    """

    tx_polarization: Optional[Union[str, Polarization1Typevalue]] = field(
        default=None,
        metadata={
            "name": "TxPolarization",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
            "pattern": r"OTHER.*",
        },
    )
    rcv_polarization: Optional[Union[str, Polarization1Typevalue]] = field(
        default=None,
        metadata={
            "name": "RcvPolarization",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
            "pattern": r"OTHER.*",
        },
    )
    rcv_polarization_offset: Optional[float] = field(
        default=None,
        metadata={
            "name": "RcvPolarizationOffset",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "min_inclusive": -180.0,
            "max_inclusive": 180.0,
        },
    )


@dataclass
class ValidDataType:
    """Indicates the full image includes both valid data and some zero filled
    pixels.

    Simple convex polygon enclosed the valid data (may include some zero filled pixels for simplification).
    Vertices in clockwise order.

    :ivar vertex: Vertices indexed n = 1, 2, ..., NumVertices. NumVertices &gt;= 3. Vertex 1 is determined by (1)
        minimum row index, (2) minimum column index if 2 vertices with minimum row index, 1st and last vertices
        are connected to form the polygon.
    :ivar size:
    """

    vertex: List[RowColVertexType] = field(
        default_factory=list,
        metadata={
            "name": "Vertex",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "min_occurs": 3,
        },
    )
    size: Optional[int] = field(
        default=None,
        metadata={
            "type": "Attribute",
            "required": True,
        },
    )


@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:3.0.0",
            "required": True,
        },
    )
    spatial_reference_system: Optional[ReferenceSystemType] = field(
        default=None,
        metadata={
            "name": "SpatialReferenceSystem",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    object_value: List[AnnotationObjectType] = field(
        default_factory=list,
        metadata={
            "name": "Object",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "min_occurs": 1,
        },
    )


@dataclass
class ColorSpaceTransformType:
    """
    :ivar color_management_module: Parameters describing the Color Management Module (CMM).
    """

    color_management_module: Optional[ColorManagementModuleType] = field(
        default=None,
        metadata={
            "name": "ColorManagementModule",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )


@dataclass
class CustomLookupType:
    lutinfo: Optional[LUTInfoType] = field(
        default=None,
        metadata={
            "name": "LUTInfo",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )


@dataclass
class DigitalElevationDataType:
    """
    This block describes the Digital ElevatioNData when it is included with the
    SIDD product.

    :ivar geographic_coordinates: Describes the Local Geographic Coordinate system linking row/column to the
        absolute geographic coordinate (lat/lon)
    :ivar geopositioning: Describes the absolute coordinate system to which the data is referenced.
    :ivar positional_accuracy: Describes the horizontal and vertical point and regional information for the DED.
    :ivar null_value:
    """

    geographic_coordinates: Optional[GeographicCoordinatesType] = field(
        default=None,
        metadata={
            "name": "GeographicCoordinates",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    geopositioning: Optional[GeopositioningType] = field(
        default=None,
        metadata={
            "name": "Geopositioning",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    positional_accuracy: Optional[PositionalAccuracyType] = field(
        default=None,
        metadata={
            "name": "PositionalAccuracy",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    null_value: Optional[int] = field(
        default=None,
        metadata={
            "name": "NullValue",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )


@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:3.0.0",
        },
    )
    processing_event: List[ProcessingEventType] = field(
        default_factory=list,
        metadata={
            "name": "ProcessingEvent",
            "type": "Element",
            "namespace": "urn:SIDD:3.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:3.0.0",
            "required": True,
        },
    )
    radar_mode: Optional[RadarModeType] = field(
        default=None,
        metadata={
            "name": "RadarMode",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    collection_date_time: Optional[XmlDateTime] = field(
        default=None,
        metadata={
            "name": "CollectionDateTime",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    local_date_time: Optional[XmlDateTime] = field(
        default=None,
        metadata={
            "name": "LocalDateTime",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    collection_duration: Optional[float] = field(
        default=None,
        metadata={
            "name": "CollectionDuration",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    resolution: Optional[RangeAzimuthType] = field(
        default=None,
        metadata={
            "name": "Resolution",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    input_roi: Optional[InputROIType] = field(
        default=None,
        metadata={
            "name": "InputROI",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    polarization: List[TxRcvPolarizationType] = field(
        default_factory=list,
        metadata={
            "name": "Polarization",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )


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

    :ivar resolution: Uniformly-weighted resolution projected into the Earth Tangent Plane (ETP).
    :ivar ellipticity: Ellipticity of the 2D-IPR at the ORP, measured in the Earth Geodetic Tangent Plane (EGTP).
        Ellipticity is the ratio of the IPR ellipse's major axis to minor axis.
    :ivar polarization: Describes the processed transmit and receive polarizations for the product.
    :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:3.0.0",
            "required": True,
        },
    )
    ellipticity: Optional[float] = field(
        default=None,
        metadata={
            "name": "Ellipticity",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    polarization: List[ProcTxRcvPolarizationType] = field(
        default_factory=list,
        metadata={
            "name": "Polarization",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "min_occurs": 1,
        },
    )
    north: Optional[float] = field(
        default=None,
        metadata={
            "name": "North",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "min_inclusive": 0.0,
            "max_exclusive": 360.0,
        },
    )
    extension: List[ParameterType] = field(
        default_factory=list,
        metadata={
            "name": "Extension",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )


@dataclass
class FilterBankType:
    predefined: Optional[PredefinedFilterType] = field(
        default=None,
        metadata={
            "name": "Predefined",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    custom: Optional[BankCustomType] = field(
        default=None,
        metadata={
            "name": "Custom",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )


@dataclass
class FilterKernelType:
    predefined: Optional[PredefinedFilterType] = field(
        default=None,
        metadata={
            "name": "Predefined",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    custom: Optional[KernelCustomType] = field(
        default=None,
        metadata={
            "name": "Custom",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )


@dataclass
class GeoDataType:
    earth_model: Optional[EarthModelType] = field(
        default=None,
        metadata={
            "name": "EarthModel",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    image_corners: Optional[ImageCornersType] = field(
        default=None,
        metadata={
            "name": "ImageCorners",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    valid_data: Optional[PolygonType] = field(
        default=None,
        metadata={
            "name": "ValidData",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    geo_info: List[GeoInfo] = field(
        default_factory=list,
        metadata={
            "name": "GeoInfo",
            "type": "Element",
            "namespace": "urn:SICommon:1.0",
        },
    )


@dataclass
class J2KSubtype:
    """
    :ivar num_wavelet_levels: The default number of wavelet decompositionlevels performed per tile in the
        original image out of the processors.
    :ivar num_bands: The number of spectral bands in the original image out of the processors.
    :ivar layer_info: Original Layer Information. The following fileds repeat for all layers in (0, 1, ...,
        numLayers - 1). The default number of layers per tile in original image out of the original processor.
    """

    num_wavelet_levels: Optional[int] = field(
        default=None,
        metadata={
            "name": "NumWaveletLevels",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    num_bands: Optional[int] = field(
        default=None,
        metadata={
            "name": "NumBands",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    layer_info: Optional[LayerInfoType] = field(
        default=None,
        metadata={
            "name": "LayerInfo",
            "type": "Element",
            "namespace": "urn:SIDD:3.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:3.0.0",
            "required": True,
        },
    )
    time_coapoly: Optional[Poly2DType] = field(
        default=None,
        metadata={
            "name": "TimeCOAPoly",
            "type": "Element",
            "namespace": "urn:SIDD:3.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:3.0.0",
            "required": True,
        },
    )
    row_col_to_lon: Optional[Poly2DType] = field(
        default=None,
        metadata={
            "name": "RowColToLon",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    row_col_to_alt: Optional[Poly2DType] = field(
        default=None,
        metadata={
            "name": "RowColToAlt",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    lat_lon_to_row: Optional[Poly2DType] = field(
        default=None,
        metadata={
            "name": "LatLonToRow",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    lat_lon_to_col: Optional[Poly2DType] = field(
        default=None,
        metadata={
            "name": "LatLonToCol",
            "type": "Element",
            "namespace": "urn:SIDD:3.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:3.0.0",
            "required": True,
        },
    )
    classification: Optional[ProductClassificationType] = field(
        default=None,
        metadata={
            "name": "Classification",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    product_name: Optional[str] = field(
        default=None,
        metadata={
            "name": "ProductName",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    product_class: Optional[str] = field(
        default=None,
        metadata={
            "name": "ProductClass",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    product_type: Optional[str] = field(
        default=None,
        metadata={
            "name": "ProductType",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    product_creation_extension: List[ParameterType] = field(
        default_factory=list,
        metadata={
            "name": "ProductCreationExtension",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )


@dataclass
class ProductProcessingType:
    """
    Computed metadata regarding one or more of the input collections and final
    product.

    :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:3.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:3.0.0",
        },
    )
    monochrome_display_remap: Optional[MonochromeDisplayRemapType] = field(
        default=None,
        metadata={
            "name": "MonochromeDisplayRemap",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )


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

    annotation: List[AnnotationType] = field(
        default_factory=list,
        metadata={
            "name": "Annotation",
            "type": "Element",
            "namespace": "urn:SIDD:3.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:3.0.0",
            "required": True,
        },
    )
    curvature_radius: Optional[float] = field(
        default=None,
        metadata={
            "name": "CurvatureRadius",
            "type": "Element",
            "namespace": "urn:SIDD:3.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:3.0.0",
            "required": True,
        },
    )
    geometry: Optional[ExploitationFeaturesCollectionGeometryType] = field(
        default=None,
        metadata={
            "name": "Geometry",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    phenomenology: Optional[ExploitationFeaturesCollectionPhenomenologyType] = field(
        default=None,
        metadata={
            "name": "Phenomenology",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )


@dataclass
class FilterType:
    filter_name: Optional[str] = field(
        default=None,
        metadata={
            "name": "FilterName",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    filter_kernel: Optional[FilterKernelType] = field(
        default=None,
        metadata={
            "name": "FilterKernel",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    filter_bank: Optional[FilterBankType] = field(
        default=None,
        metadata={
            "name": "FilterBank",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    operation: Optional[FilterOperationType] = field(
        default=None,
        metadata={
            "name": "Operation",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )


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


@dataclass
class J2KType:
    """
    :ivar original:
    :ivar parsed: Conditional fields that exist only for parsed images.
    """

    original: Optional[J2KSubtype] = field(
        default=None,
        metadata={
            "name": "Original",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    parsed: Optional[J2KSubtype] = field(
        default=None,
        metadata={
            "name": "Parsed",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )


@dataclass
class NewLookupTableType:
    lutname: Optional[str] = field(
        default=None,
        metadata={
            "name": "LUTName",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    predefined: Optional[PredefinedLookupType] = field(
        default=None,
        metadata={
            "name": "Predefined",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    custom: Optional[CustomLookupType] = field(
        default=None,
        metadata={
            "name": "Custom",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )


@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:3.0.0",
            "required": True,
        },
    )


@dataclass
class BandEqualizationType:
    """
    Band equalization ensures that real-world neutral colors have equal digital
    count values (i.e. are represented as neutral colors) across the dynamic range
    of the imaged scene.

    :ivar algorithm: Allowed values: 1DLUT
    :ivar band_lut:
    """

    algorithm: Optional[EqualizationAlgorithmType] = field(
        default=None,
        metadata={
            "name": "Algorithm",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    band_lut: List["BandEqualizationType.BandLUT"] = field(
        default_factory=list,
        metadata={
            "name": "BandLUT",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "min_occurs": 1,
        },
    )

    @dataclass
    class BandLUT(NewLookupTableType):
        k: Optional[int] = field(
            default=None,
            metadata={
                "type": "Attribute",
                "required": True,
            },
        )


@dataclass
class CompressionType:
    """
    Contains information regarding any compression that has occured to the image
    data.

    :ivar j2_k: Block describing details of JPEG 2000 compression.
    """

    j2_k: Optional[J2KType] = field(
        default=None,
        metadata={
            "name": "J2K",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )


@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:3.0.0",
            "min_occurs": 1,
        },
    )
    product: List[ExploitationFeaturesProductType] = field(
        default_factory=list,
        metadata={
            "name": "Product",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "min_occurs": 1,
        },
    )

    @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 in pixels.
    :ivar arpflag: Flag indicating whether ARP polynomial is based on the best available ("collect time" or
        "predicted") ephemeris.
    :ivar arppoly: Center of aperture polynomial (units = m) based upon time into the collect.
    :ivar valid_data: Indicates the full image includes both valid data and some zero filled pixels. Simple
        convex polygon enclosed the valid data (may include some zero filled pixels for simplification). Vertices
        in clockwise order.
    """

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


@dataclass
class RRDSType:
    """
    :ivar downsampling_method: Algorithm used to perform RRDS downsampling
    :ivar anti_alias: Only included if DownSamplingMethod=DECIMET
    :ivar interpolation: Only included if DownSamplingMethod=DECIMET
    """

    downsampling_method: Optional[DownsamplingMethodType] = field(
        default=None,
        metadata={
            "name": "DownsamplingMethod",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    anti_alias: Optional[FilterType] = field(
        default=None,
        metadata={
            "name": "AntiAlias",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    interpolation: Optional[FilterType] = field(
        default=None,
        metadata={
            "name": "Interpolation",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )


@dataclass
class ScalingType:
    """
    :ivar anti_alias: Anti-Alias Filter used for scaling. Refer to program-specific documentation for population
        guidance
    :ivar interpolation: Interpolation Filter used for scaling. Refer to program-specific documentation for
        population guidance.
    """

    anti_alias: Optional[FilterType] = field(
        default=None,
        metadata={
            "name": "AntiAlias",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    interpolation: Optional[FilterType] = field(
        default=None,
        metadata={
            "name": "Interpolation",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )


@dataclass
class SharpnessEnhancementType:
    """
    :ivar modular_transfer_function_compensation: Note: If defining a custom Filter, it must be no larger than
        5x5.
    :ivar modular_transfer_function_enhancement: Note: If defining a custom Filter, it must be no larger than
        5x5.
    """

    modular_transfer_function_compensation: Optional[FilterType] = field(
        default=None,
        metadata={
            "name": "ModularTransferFunctionCompensation",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    modular_transfer_function_enhancement: Optional[FilterType] = field(
        default=None,
        metadata={
            "name": "ModularTransferFunctionEnhancement",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )


@dataclass
class GeometricTransformType:
    """
    :ivar scaling:
    :ivar orientation: Parameters describing the default orientation of the product
    """

    scaling: Optional[ScalingType] = field(
        default=None,
        metadata={
            "name": "Scaling",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    orientation: Optional[Orientation] = field(
        default=None,
        metadata={
            "name": "Orientation",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )


@dataclass
class ProductGenerationOptionsType:
    """
    Performs several key actions on an image to prepare it for necessary additional
    processing to achieve the desired output product.

    :ivar band_equalization: Band equalization ensures that real-world neutral colors have equal digital count
        values (i.e. are represented as neutral colors) across the dynamic range of the imaged scene.
    :ivar modular_transfer_function_restoration: Filter must be no larger than 15x15.
    :ivar data_remapping: Data remapping refers to the specific need to convert the data of incoming, expanded or
        uncompressed image band data to non-mapped image data.
    :ivar asymmetric_pixel_correction:
    """

    band_equalization: Optional[BandEqualizationType] = field(
        default=None,
        metadata={
            "name": "BandEqualization",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    modular_transfer_function_restoration: Optional[FilterType] = field(
        default=None,
        metadata={
            "name": "ModularTransferFunctionRestoration",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    data_remapping: Optional[NewLookupTableType] = field(
        default=None,
        metadata={
            "name": "DataRemapping",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    asymmetric_pixel_correction: Optional[FilterType] = field(
        default=None,
        metadata={
            "name": "AsymmetricPixelCorrection",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )


@dataclass
class InteractiveProcessingType:
    """
    :ivar geometric_transform: The geometric transform element is used to perform various geometric distortions
        to each band of image data. These distortions include image chipping, scaling, rotation, shearing, etc.
    :ivar sharpness_enhancement:
    :ivar color_space_transform:
    :ivar dynamic_range_adjustment: Specifies the recommended ELT DRA overrides
    :ivar tonal_transfer_curve: The 1-D LUT element uses one or more 1-D LUTs to stretch or compress tome data in
        valorous regions within a digital image's dynamic range. 1-D LUT can be implemented using a Tonal
        Transfer Curve (TTC). There are 12 families of TTCs: Range = [0,11]. There are 64 members for each
        family: Range=[0, 63].
    :ivar band:
    """

    geometric_transform: Optional[GeometricTransformType] = field(
        default=None,
        metadata={
            "name": "GeometricTransform",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    sharpness_enhancement: Optional[SharpnessEnhancementType] = field(
        default=None,
        metadata={
            "name": "SharpnessEnhancement",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    color_space_transform: Optional[ColorSpaceTransformType] = field(
        default=None,
        metadata={
            "name": "ColorSpaceTransform",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    dynamic_range_adjustment: Optional[DynamicRangeAdjustmentType] = field(
        default=None,
        metadata={
            "name": "DynamicRangeAdjustment",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    tonal_transfer_curve: Optional[NewLookupTableType] = field(
        default=None,
        metadata={
            "name": "TonalTransferCurve",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    band: Optional[int] = field(
        default=None,
        metadata={
            "type": "Attribute",
            "required": True,
        },
    )


@dataclass
class NonInteractiveProcessingType:
    """
    :ivar product_generation_options: Performs several key actions on an image to prepare it for necessary
        additional processing to achieve the desired output product.
    :ivar rrds: Creates a set of sub-sampled versions of an image to provide processing chains with quick access
        to lower mangification values for faster computation speeds and performance.
    :ivar band:
    """

    product_generation_options: Optional[ProductGenerationOptionsType] = field(
        default=None,
        metadata={
            "name": "ProductGenerationOptions",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    rrds: Optional[RRDSType] = field(
        default=None,
        metadata={
            "name": "RRDS",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    band: Optional[int] = field(
        default=None,
        metadata={
            "type": "Attribute",
            "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 num_bands: Number of bands contained in the image. Populate with the number of bands present after
        remapping. For example an 8-bit RGB image (RGBLU) this should be populated with 3.
    :ivar default_band_display: Indicates which band to display by default. Valid range = 1 to NumBands.
    :ivar non_interactive_processing:
    :ivar interactive_processing:
    :ivar display_extension: Optional extensible parameters used to support profile-specific needs related to
        product display. Predefined filter types.
    """

    pixel_type: Optional[PixelType] = field(
        default=None,
        metadata={
            "name": "PixelType",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    num_bands: Optional[int] = field(
        default=None,
        metadata={
            "name": "NumBands",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "required": True,
        },
    )
    default_band_display: Optional[int] = field(
        default=None,
        metadata={
            "name": "DefaultBandDisplay",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )
    non_interactive_processing: List[NonInteractiveProcessingType] = field(
        default_factory=list,
        metadata={
            "name": "NonInteractiveProcessing",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "min_occurs": 1,
        },
    )
    interactive_processing: List[InteractiveProcessingType] = field(
        default_factory=list,
        metadata={
            "name": "InteractiveProcessing",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
            "min_occurs": 1,
        },
    )
    display_extension: List[ParameterType] = field(
        default_factory=list,
        metadata={
            "name": "DisplayExtension",
            "type": "Element",
            "namespace": "urn:SIDD:3.0.0",
        },
    )


@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 geo_data: Contains geographic data.
    :ivar measurement: Contains the metadata necessary for performing measurements.
    :ivar exploitation_features: Computed metadata regarding the input collections and final product.
    :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 match_info: Information about other collections that are matched to the current collection. The current
        collection is the collection from which this SIDD product was generated.
    :ivar compression: Contains information regarding any compression that has occured to the image data.
    :ivar digital_elevation_data: This block describes the Digital ElevatioNData when it is included with the
        SIDD product.
    :ivar product_processing: Contains metadata related to algorithms used during product generation.
    :ivar annotations: List of annotations for the imagery.
    """

    class Meta:
        namespace = "urn:SIDD:3.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,
        },
    )
    geo_data: Optional[GeoDataType] = field(
        default=None,
        metadata={
            "name": "GeoData",
            "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,
        },
    )
    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",
        },
    )
    match_info: Optional[MatchInfoType] = field(
        default=None,
        metadata={
            "name": "MatchInfo",
            "type": "Element",
        },
    )
    compression: Optional[CompressionType] = field(
        default=None,
        metadata={
            "name": "Compression",
            "type": "Element",
        },
    )
    digital_elevation_data: Optional[DigitalElevationDataType] = field(
        default=None,
        metadata={
            "name": "DigitalElevationData",
            "type": "Element",
        },
    )
    product_processing: Optional[ProductProcessingType] = field(
        default=None,
        metadata={
            "name": "ProductProcessing",
            "type": "Element",
        },
    )
    annotations: Optional[AnnotationsType] = field(
        default=None,
        metadata={
            "name": "Annotations",
            "type": "Element",
        },
    )
