DataProducts#

Implementation of the CTAO DataProducts Data Model.

pydantic model ACADADataSource#

Bases: ModelBase

ACADA Data Source, see ACADA-DPPS ICD.

Show JSON schema
{
   "title": "ACADADataSource",
   "description": "ACADA Data Source, see ACADA-DPPS ICD.",
   "type": "object",
   "properties": {
      "component": {
         "description": "ACADA data source name:  the component, or instrument, generating the data. Normally will be the string of the ACS or OPC UA component instance name.",
         "examples": [
            "SDH",
            "SWAT"
         ],
         "title": "Component",
         "type": "string"
      },
      "id": {
         "description": "Instance identifier of the DataSource component. ",
         "title": "Id",
         "type": "integer"
      }
   },
   "additionalProperties": false,
   "required": [
      "component",
      "id"
   ]
}

Config:
  • extra: str = forbid

Fields:
field component: str [Required]#

ACADA data source name: the component, or instrument, generating the data. Normally will be the string of the ACS or OPC UA component instance name.

Validated by:
  • _parse_from_string

field id: int [Required]#

Instance identifier of the DataSource component.

Validated by:
  • _parse_from_string

pydantic model Acquisition#

Bases: ModelBase

Acquisition context metadata.

Show JSON schema
{
   "title": "Acquisition",
   "description": "Acquisition context metadata.",
   "type": "object",
   "properties": {
      "sb_id": {
         "anyOf": [
            {
               "type": "integer"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Unique identifier of the scheduling block associated with this data product, in a format defined in the Scheduling Block Data Model Specification.",
         "fits_keyword": "SB_ID",
         "ivoa_keyword": "sb_id",
         "title": "Sb Id"
      }
   },
   "additionalProperties": false
}

Config:
  • extra: str = forbid

Fields:
field sb_id: int | None = None#

Unique identifier of the scheduling block associated with this data product, in a format defined in the Scheduling Block Data Model Specification.

pydantic model Activity#

Bases: ModelBase

The activity (software or human) that produced this data product.

Show JSON schema
{
   "title": "Activity",
   "description": "The activity (software or human) that produced this data product.",
   "type": "object",
   "properties": {
      "process": {
         "anyOf": [
            {
               "$ref": "#/$defs/ObservatoryProcess"
            },
            {
               "type": "null"
            }
         ],
         "default": "user",
         "description": "Observatory operational Process.  These are the top-level processes",
         "fits_keyword": "ACTPROC"
      },
      "name": {
         "description": "Name of the activity that produced this data product.",
         "examples": [
            "observation data processing",
            "lab calibration"
         ],
         "fits_keyword": "ACTIVITY",
         "title": "Name",
         "type": "string"
      },
      "description": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Human-readable details of the activity, if more specificity than the `name` is required.",
         "fits_keyword": "ACTDESC",
         "title": "Description"
      },
      "id": {
         "description": "Unique identifier of this process, which is used to link multiple data products produced together.  If this is a human process, this can be generated with the `uuidgen` linux command for example.",
         "fits_keyword": "ACTID",
         "format": "uuid",
         "title": "Id",
         "type": "string"
      },
      "start": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "format": "date-time",
               "type": "string"
            }
         ],
         "description": "Start time of the activity",
         "fits_keyword": "ACTSTART",
         "title": "Start"
      },
      "end": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "format": "date-time",
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "End time of the activity, which is generally not known when the data product is being written and is therefore optional. ",
         "fits_keyword": "ACTSTOP",
         "title": "End"
      },
      "software": {
         "anyOf": [
            {
               "$ref": "#/$defs/Software"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "if the activity involved software, describes it."
      },
      "configuration_id": {
         "description": "Identifier for the configuration for the software used to produce this data product. This is normally a unique identifier of the configuration used to produce this data product, It should be possible for a user knowing this identifier and details of how and where configurations are stored, to find the full original configuration. It is recommended to use a URI when possible, particularly for REST API endpoints or  git repositories.",
         "examples": [
            "dl3/hillas-standard/v1",
            "dl5/quicklook-followup/v1",
            "https://myobservatory.org/API/v1/config/data-processing/standard-v1.2"
         ],
         "fits_keyword": "ANAMODE",
         "ivoa_keyword": "analysis_mode",
         "title": "Configuration Id",
         "type": "string"
      },
      "inputs": {
         "anyOf": [
            {
               "items": {
                  "$ref": "#/$defs/ExternalDataProduct"
               },
               "type": "array"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Describes the input data products to the activity that produced this data product.",
         "title": "Inputs"
      }
   },
   "$defs": {
      "ExternalDataProduct": {
         "additionalProperties": false,
         "description": "Another data product used as input to the Activity.",
         "properties": {
            "uri": {
               "description": "URI of the data product, can be a https address, DOI, Bulk Archive LFN, or a file:// if only known locally.",
               "examples": [
                  "https://doi.org/10.5281/zenodo.6218687",
                  "file://myfile.fits.gz",
                  "lfn://ctao/dpps/"
               ],
               "format": "uri",
               "minLength": 1,
               "title": "Uri",
               "type": "string"
            },
            "role": {
               "description": "context of the data product",
               "examples": [
                  "reconstruction-model",
                  "configuration",
                  "camera-calibration"
               ],
               "title": "Role",
               "type": "string"
            },
            "id": {
               "default": null,
               "description": "Unique ``instance.id`` of the data product, if known.",
               "format": "uuid",
               "title": "Id",
               "type": "string"
            }
         },
         "required": [
            "uri",
            "role"
         ],
         "title": "ExternalDataProduct",
         "type": "object"
      },
      "ObservatoryProcess": {
         "description": "Observatory operational Process.\n\nThese are the top-level processes",
         "enum": [
            "proposal_handling",
            "observation_planning",
            "acquisition",
            "simulation",
            "data_processing",
            "science_data_challenge",
            "science_analysis",
            "instrument",
            "user"
         ],
         "title": "ObservatoryProcess",
         "type": "string"
      },
      "Software": {
         "additionalProperties": false,
         "description": "Describes the software package that created the data product.",
         "properties": {
            "name": {
               "description": "Descriptive name of the software.",
               "examples": [
                  "datapipe"
               ],
               "fits_keyword": "SOFTWARE",
               "title": "Name",
               "type": "string"
            },
            "version": {
               "description": "Version number",
               "examples": [
                  "v1.0.1"
               ],
               "fits_keyword": "SOFTVER",
               "title": "Version",
               "type": "string"
            },
            "url": {
               "anyOf": [
                  {
                     "format": "uri",
                     "minLength": 1,
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "description": "URL or DOI linking to more detail.",
               "fits_keyword": "SOFTURL",
               "title": "Url"
            }
         },
         "required": [
            "name",
            "version",
            "url"
         ],
         "title": "Software",
         "type": "object"
      }
   },
   "additionalProperties": false,
   "required": [
      "name",
      "id",
      "start",
      "configuration_id"
   ]
}

Config:
  • extra: str = forbid

Fields:
field configuration_id: str [Required]#

Identifier for the configuration for the software used to produce this data product. This is normally a unique identifier of the configuration used to produce this data product, It should be possible for a user knowing this identifier and details of how and where configurations are stored, to find the full original configuration. It is recommended to use a URI when possible, particularly for REST API endpoints or git repositories.

field description: str | None = None#

Human-readable details of the activity, if more specificity than the name is required.

field end: Annotated[Time, _AstropyTimePydanticTypeAnnotation] | None = None#

End time of the activity, which is generally not known when the data product is being written and is therefore optional.

field id: UUID [Required]#

Unique identifier of this process, which is used to link multiple data products produced together. If this is a human process, this can be generated with the uuidgen linux command for example.

field inputs: list[ExternalDataProduct] | None = None#

Describes the input data products to the activity that produced this data product.

field name: str [Required]#

Name of the activity that produced this data product.

field process: ObservatoryProcess | None = ObservatoryProcess.USER#

Observatory operational Process. These are the top-level processes

field software: Software | None = None#

if the activity involved software, describes it.

field start: Annotated[Time, _AstropyTimePydanticTypeAnnotation] [Required]#

Start time of the activity

Constraints:
  • __module__ = astropydantic.time

  • __firstlineno__ = 8

  • __get_pydantic_core_schema__ = <bound method _AstropyTimePydanticTypeAnnotation.__get_pydantic_core_schema__ of <class ‘astropydantic.time._AstropyTimePydanticTypeAnnotation’>>

  • __static_attributes__ = ()

  • __dict__ = {‘__module__’: ‘astropydantic.time’, ‘__firstlineno__’: 8, ‘__get_pydantic_core_schema__’: <classmethod(<function _AstropyTimePydanticTypeAnnotation.__get_pydantic_core_schema__ at 0x7fd59fd145e0>)>, ‘__static_attributes__’: (), ‘__dict__’: <attribute ‘__dict__’ of ‘_AstropyTimePydanticTypeAnnotation’ objects>, ‘__weakref__’: <attribute ‘__weakref__’ of ‘_AstropyTimePydanticTypeAnnotation’ objects>, ‘__doc__’: None}

  • __weakref__ = <attribute ‘__weakref__’ of ‘_AstropyTimePydanticTypeAnnotation’ objects>

class ArrayElement(*values)#

Bases: StrEnum

Class of array element, for use in the ArrayElementID.

AUX = 'AUX'#
LIDAR = 'LIDAR'#
SUBARRAY = 'SUB'#
TELESCOPE = 'TEL'#
class ArrayElementClass(*values)#

Bases: StrEnum

Classification of Array Element, following ACADA-DPPS ICD.

ACE = 'ACE'#
TEL = 'TEL'#
pydantic model Atmosphere#

Bases: ModelBase

Overall atmospheric quality of the observation.

Show JSON schema
{
   "title": "Atmosphere",
   "description": "Overall atmospheric quality of the observation.",
   "type": "object",
   "properties": {
      "quality": {
         "$ref": "#/$defs/SkyQuality",
         "description": "Broad categorisation of sky quality.  For the purposes of scheduling or rough observation selection. *A*: no clouds detectable within observable sky, very low aerosol optical depth (AOD<0.1). *B*: intermediate aerosol optical depth (0.1<AOD<0.2) and/or clouds visible in the sky but not within the target field of view (FoV). *C*: clouds detectable within the FoV or AOD>0.2. Options are: \"a\", \"b\", \"c\".",
         "fits_keyword": "SKYQUAL"
      },
      "brightness": {
         "$ref": "#/$defs/SkyBrightness",
         "description": "Average level of night-sky-background light  during an observation.  *Dark*: corresponding to moon below the horizon and sun elevation of less than \u221218 degrees for an ambient brightness of \u2248 $0.24 ph\\,ns^{\u22121}\\,cm^{\u22122}\\,sr^{\u22121}$ away from the Galactic plane. *Grey*: corresponding to moon above the horizon for an increase in ambient NSB of up to 5x the dark sky case. *Bright*: corresponding to moon above the horizon for an increase in ambient NSB of up to 30x the dark sky case. Options are: \"dark\", \"gray\", \"bright\".",
         "fits_keyword": "SKYBRIGH"
      }
   },
   "$defs": {
      "SkyBrightness": {
         "description": "Average level of night-sky-background light  during an observation.\n\n*Dark*: corresponding to moon below the horizon and\nsun elevation of less than \u221218 degrees for an ambient brightness of \u2248 $0.24\nph\\,ns^{\u22121}\\,cm^{\u22122}\\,sr^{\u22121}$ away from the Galactic plane. *Grey*:\ncorresponding to moon above the horizon for an increase in ambient NSB of up\nto 5x the dark sky case. *Bright*: corresponding to moon above the horizon\nfor an increase in ambient NSB of up to 30x the dark sky case.",
         "enum": [
            "dark",
            "gray",
            "bright"
         ],
         "title": "SkyBrightness",
         "type": "string"
      },
      "SkyQuality": {
         "description": "Broad categorisation of sky quality.\n\nFor the purposes of scheduling or rough observation selection. *A*: no\nclouds detectable within observable sky, very low aerosol optical depth\n(AOD<0.1). *B*: intermediate aerosol optical depth (0.1<AOD<0.2) and/or\nclouds visible in the sky but not within the target field of view (FoV).\n*C*: clouds detectable within the FoV or AOD>0.2.",
         "enum": [
            "a",
            "b",
            "c"
         ],
         "title": "SkyQuality",
         "type": "string"
      }
   },
   "additionalProperties": false,
   "required": [
      "quality",
      "brightness"
   ]
}

Config:
  • extra: str = forbid

Fields:
field brightness: SkyBrightness [Required]#

Average level of night-sky-background light during an observation. Dark: corresponding to moon below the horizon and sun elevation of less than −18 degrees for an ambient brightness of ≈ $0.24 ph,ns^{−1},cm^{−2},sr^{−1}$ away from the Galactic plane. Grey: corresponding to moon above the horizon for an increase in ambient NSB of up to 5x the dark sky case. Bright: corresponding to moon above the horizon for an increase in ambient NSB of up to 30x the dark sky case. Options are: “dark”, “gray”, “bright”.

field quality: SkyQuality [Required]#

Broad categorisation of sky quality. For the purposes of scheduling or rough observation selection. A: no clouds detectable within observable sky, very low aerosol optical depth (AOD<0.1). B: intermediate aerosol optical depth (0.1<AOD<0.2) and/or clouds visible in the sky but not within the target field of view (FoV). C: clouds detectable within the FoV or AOD>0.2. Options are: “a”, “b”, “c”.

pydantic model Contact#

Bases: ModelBase

Contact information for this data product.

Show JSON schema
{
   "title": "Contact",
   "description": "Contact information for this data product.",
   "type": "object",
   "properties": {
      "name": {
         "description": "Contact name for this data product.",
         "fits_keyword": "AUTHOR",
         "title": "Name",
         "type": "string"
      },
      "organization": {
         "description": "Contact organization name of this data product.",
         "fits_keyword": "ORIGIN",
         "title": "Organization",
         "type": "string"
      },
      "email": {
         "description": "Contact's email address",
         "fits_keyword": "EMAIL",
         "format": "email",
         "title": "Email",
         "type": "string"
      }
   },
   "additionalProperties": false,
   "required": [
      "name",
      "organization",
      "email"
   ]
}

Config:
  • extra: str = forbid

Fields:
field email: EmailStr [Required]#

Contact’s email address

field name: str [Required]#

Contact name for this data product.

field organization: str [Required]#

Contact organization name of this data product.

pydantic model Coverage#

Bases: ModelBase

Describes the spatial, temporal, spectral, and tracking coverage of a data product.

This information is for the discovery of data products, not to specify precise bounds for science analysis. Typically this information can only be attached to higher-level data products, e.g. DL3 and above, as the information may not be available before processing.

Show JSON schema
{
   "title": "Coverage",
   "description": "Describes the spatial, temporal, spectral, and tracking coverage of a data product.\n\nThis information is for the discovery of data products, not to specify\nprecise bounds for science analysis. Typically this information can only be\nattached to higher-level data products, e.g. DL3 and above, as the\ninformation may not be available before processing.",
   "type": "object",
   "properties": {
      "time": {
         "anyOf": [
            {
               "$ref": "#/$defs/TimeCoverage"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Time bounds for discoverability of a data product with time coverage."
      },
      "space": {
         "anyOf": [
            {
               "$ref": "#/$defs/SpaceCoverage"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Defines spatial coverage of a data product.  The circle defined by ra, dec, field_of_view is used for the discoverability of data products by cone search, and should be considered a bounding circle if the true region covered is non-circular. The optional fields region_of_interest and moc can be used for more precise definition of the coverage."
      },
      "energy": {
         "anyOf": [
            {
               "$ref": "#/$defs/EnergyCoverage"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Describes spectral energy coverage of a data product."
      },
      "tracking": {
         "anyOf": [
            {
               "$ref": "#/$defs/TrackingCoverage"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Describes the coverage of ground-referenced observing parameters.  This is required only for data products where knowing the horizontal (ground based alt/az) coverage is relevant. For equatorial tracking, elevation and azimuth vary with time. For fixed-horizontal tracking, ranges may collapse to single values."
      }
   },
   "$defs": {
      "EnergyCoverage": {
         "additionalProperties": false,
         "description": "Describes spectral energy coverage of a data product.",
         "properties": {
            "energy_unit": {
               "description": "Unit for all energy metadata.",
               "fits_keyword": "EUNIT",
               "title": "Energy Unit",
               "type": "string"
            },
            "energy_min": {
               "description": "Approximate minimum energy of the dataset, precise enough for discovering the data product by energy range. Note that this maps to the IVOA ObsCore ``em_min`` keyword, however that is expressed as a wavelength.",
               "fits_keyword": "EMIN",
               "title": "Energy Min",
               "type": "number",
               "ucd": "em.energy;stat.min",
               "unit": "TeV"
            },
            "energy_max": {
               "description": "Approximate maximum energy of the dataset, precise enough for discovering the data product by energy range. Note that this maps to the IVOA ObsCore ``em_max`` keyword, however that is expressed as a wavelength.",
               "fits_keyword": "EMAX",
               "title": "Energy Max",
               "type": "number",
               "ucd": "em.energy;stat.max",
               "unit": "TeV"
            }
         },
         "required": [
            "energy_unit",
            "energy_min",
            "energy_max"
         ],
         "title": "EnergyCoverage",
         "type": "object"
      },
      "SpaceCoverage": {
         "additionalProperties": false,
         "description": "Defines spatial coverage of a data product.\n\nThe circle defined by ra, dec, field_of_view is used for the discoverability\nof data products by cone search, and should be considered a bounding circle\nif the true region covered is non-circular. The optional fields\nregion_of_interest and moc can be used for more precise definition of the\ncoverage.",
         "properties": {
            "frame": {
               "$ref": "#/$defs/SpatialFrame",
               "default": "ICRS",
               "description": "Standard equatorial coordinate system used for RA/Dec coordinates.  Note that for tablular data products, columns of coordinate values have their own standards in FITS and IVOA for specifying the frame, e.g. the ``RADESYSn`` column metadata attribute.",
               "fits_keyword": "RADESYS"
            },
            "ra": {
               "description": "ICRS Right ascension of the center of the region covered.",
               "fits_keyword": "RA_PNT",
               "ivoa_keyword": "s_ra",
               "title": "Ra",
               "type": "number",
               "ucd": "pos.eq.ra",
               "unit": "deg"
            },
            "dec": {
               "description": "ICRS Declination of the center of the region covered",
               "fits_keyword": "DEC_PNT",
               "ivoa_keyword": "s_dec",
               "title": "Dec",
               "type": "number",
               "ucd": "pos.eq.dec",
               "unit": "deg"
            },
            "field_of_view": {
               "description": "Approximate diameter (not radius) of the region covered by this data product if approximated as a circle on a sphere. For energy-dependent FOVs, a representative value should be chosen such that the data product can be identified in a cone search. Note that more accurate ROI shapes can be specified using the `region_of_interest` field, but `field_of_view` should always be filled because it provides a simple way to do a rough filtering.",
               "fits_keyword": "FOV",
               "ivoa_keyword": "s_fov",
               "title": "Field Of View",
               "type": "number",
               "ucd": "pos.spherical.r;instr.fov",
               "unit": "deg"
            },
            "region_of_interest": {
               "anyOf": [
                  {
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "IVOA ADQL-format region string describing the region of interest.",
               "examples": [
                  "Box ICRS 83.633083 22.0145 5 5",
                  "Circle ICRS 83.633083 22.0145 5",
                  "Polygon ICRS 81.133083 19.5145  86.133083 19.5145  86.133083 24.5145  81.133083 24.5145"
               ],
               "fits_keyword": "REGION",
               "ivoa_keyword": "s_region",
               "title": "Region Of Interest"
            },
            "moc": {
               "anyOf": [
                  {
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Multi-order coverage (MOC) string describing the region covered by the data product. https://www.ivoa.net/documents/MOC/",
               "examples": [
                  "4/2609 2611-2612  5/10350-10351 10362-10363 10433-10435 10440-10441 10443 10452 10456-10458   10468-10469  6/41398-41399 41442-41443 41446-41447 41464 41466-41467 41769-41771 41816-41818   41836 41840 41857 41860-41861 41863 41920"
               ],
               "title": "Moc"
            }
         },
         "required": [
            "ra",
            "dec",
            "field_of_view"
         ],
         "title": "SpaceCoverage",
         "type": "object"
      },
      "SpatialFrame": {
         "description": "Standard equatorial coordinate system used for RA/Dec coordinates.\n\nNote that for tablular data products, columns of coordinate values have\ntheir own standards in FITS and IVOA for specifying the frame, e.g. the\n``RADESYSn`` column metadata attribute.",
         "enum": [
            "ICRS"
         ],
         "title": "SpatialFrame",
         "type": "string"
      },
      "TimeCoverage": {
         "additionalProperties": false,
         "description": "Time bounds for discoverability of a data product with time coverage.",
         "properties": {
            "reference": {
               "anyOf": [
                  {
                     "$ref": "#/$defs/TimeReference"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Reference time for floating point time representations.  For timestamps represented as ISO time strings, this is not relevant."
            },
            "t_min": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "string"
                  },
                  {
                     "format": "date-time",
                     "type": "string"
                  }
               ],
               "description": "Start of time range of the data as either an ISO string or a float in the system defined by the time reference.",
               "fits_keyword": "TSTART",
               "title": "T Min"
            },
            "t_max": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "string"
                  },
                  {
                     "format": "date-time",
                     "type": "string"
                  }
               ],
               "description": "End of time range of the data, as either an ISO string or a float in the system defined by the time reference.",
               "fits_keyword": "TSTOP",
               "title": "T Max"
            }
         },
         "required": [
            "t_min",
            "t_max"
         ],
         "title": "TimeCoverage",
         "type": "object"
      },
      "TimeRefPos": {
         "description": "Spatial location at which the observation time is valid.\n\nFrom FITS standard v4",
         "enum": [
            "TOPOCENTER",
            "RELOCATABLE"
         ],
         "title": "TimeRefPos",
         "type": "string"
      },
      "TimeReference": {
         "additionalProperties": false,
         "description": "Reference time for floating point time representations.\n\nFor timestamps represented as ISO time strings, this is not relevant.",
         "properties": {
            "position": {
               "$ref": "#/$defs/TimeRefPos",
               "description": "Spatial location at which the observation time is valid.  From FITS standard v4 Options are: \"TOPOCENTER\", \"RELOCATABLE\".",
               "fits_keyword": "TREFPOS"
            },
            "time_mjd": {
               "description": "Reference time in MJD",
               "fits_keyword": "MJDREF",
               "title": "Time Mjd",
               "type": "number",
               "unit": "d"
            },
            "unit": {
               "default": "s",
               "fits_keyword": "TIMEUNIT",
               "title": "Unit",
               "type": "string"
            },
            "system": {
               "$ref": "#/$defs/TimeSystem",
               "default": "tai",
               "description": "The time scale of the time-related keywords.  For simulated data, use LOCAL. Options are: \"tt\", \"utc\", \"ut1\", \"tai\", \"gps\", \"local\".",
               "fits_keyword": "TIMESYS"
            },
            "resolution": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "time resolution in the time unit.",
               "fits_keyword": "TIMEDELT",
               "ivoa_keyword": "t_resolution",
               "title": "Resolution"
            }
         },
         "required": [
            "position",
            "time_mjd"
         ],
         "title": "TimeReference",
         "type": "object"
      },
      "TimeSystem": {
         "description": "The time scale of the time-related keywords.\n\nFor simulated data, use LOCAL.",
         "enum": [
            "tt",
            "utc",
            "ut1",
            "tai",
            "gps",
            "local"
         ],
         "title": "TimeSystem",
         "type": "string"
      },
      "TrackingCoverage": {
         "additionalProperties": false,
         "description": "Describes the coverage of ground-referenced observing parameters.\n\nThis is required only for data products where knowing the horizontal (ground\nbased alt/az) coverage is relevant. For equatorial tracking, elevation and\nazimuth vary with time. For fixed-horizontal tracking, ranges may collapse\nto single values.",
         "properties": {
            "elevation_min": {
               "description": "Minimum elevation above horizon of observation.",
               "fits_keyword": "ALT_MIN",
               "title": "Elevation Min",
               "type": "number",
               "ucd": "pos.az.alt;stat.min",
               "unit": "deg"
            },
            "elevation_max": {
               "description": "Maximum elevation above horizon of observation.",
               "fits_keyword": "ALT_MAX",
               "title": "Elevation Max",
               "type": "number",
               "ucd": "pos.az.alt;stat.max",
               "unit": "deg"
            },
            "azimuth_mean": {
               "description": "Mean azimith of observation.",
               "fits_keyword": "AZ_MEAN",
               "title": "Azimuth Mean",
               "type": "number",
               "ucd": "pos.az.azi;stat.mean",
               "unit": "deg"
            },
            "azimuth_range": {
               "description": "Full angular width of the observation in azimuth. Defines the horizontal coverage around `azimuth_mean`. The value should be capped at 360 deg, even if the telecope moves for larger than one rotation during the observation.",
               "fits_keyword": "AZ_RANGE",
               "maximum": 360.0,
               "minimum": 0.0,
               "title": "Azimuth Range",
               "type": "number",
               "ucd": "pos.az.azi;stat.interval",
               "unit": "deg"
            },
            "mode": {
               "$ref": "#/$defs/TrackingMode",
               "fits_keyword": "TRACKING"
            }
         },
         "required": [
            "elevation_min",
            "elevation_max",
            "azimuth_mean",
            "azimuth_range",
            "mode"
         ],
         "title": "TrackingCoverage",
         "type": "object"
      },
      "TrackingMode": {
         "description": "Coordinate system tracked by the nominal pointing position.",
         "enum": [
            "fixed_icrs",
            "fixed_horizontal",
            "other"
         ],
         "title": "TrackingMode",
         "type": "string"
      }
   },
   "additionalProperties": false
}

Config:
  • extra: str = forbid

Fields:
field energy: EnergyCoverage | None = None#

Describes spectral energy coverage of a data product.

field space: SpaceCoverage | None = None#

Defines spatial coverage of a data product. The circle defined by ra, dec, field_of_view is used for the discoverability of data products by cone search, and should be considered a bounding circle if the true region covered is non-circular. The optional fields region_of_interest and moc can be used for more precise definition of the coverage.

field time: TimeCoverage | None = None#

Time bounds for discoverability of a data product with time coverage.

field tracking: TrackingCoverage | None = None#

Describes the coverage of ground-referenced observing parameters. This is required only for data products where knowing the horizontal (ground based alt/az) coverage is relevant. For equatorial tracking, elevation and azimuth vary with time. For fixed-horizontal tracking, ranges may collapse to single values.

pydantic model Curation#

Bases: ModelBase

Information related to the release and usage of data products.

Show JSON schema
{
   "title": "Curation",
   "description": "Information related to the release and usage of data products.",
   "type": "object",
   "properties": {
      "release": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Name of the data release (data collection) that this data product belongs to.",
         "examples": [
            "CTAO/DL3-DR1",
            "CTAO/DL3-SDC1"
         ],
         "fits_keyword": "RELEASE",
         "ivoa_keyword": "obs_collection",
         "title": "Release"
      },
      "reference": {
         "anyOf": [
            {
               "format": "uri",
               "minLength": 1,
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "a reference to where the data product is published. It is recommended that either the 19-digit bibliographic identifier used in the Astrophysics Data System bibliographic databases (http://adswww.harvard.edu/) or the Digital Object Identifier (http://doi.org) be included in the value string, when available.",
         "examples": [
            "1994A&AS..103..135A",
            "doi:10.1006/jmbi.1998.2354"
         ],
         "fits_keyword": "REFERENC",
         "title": "Reference"
      },
      "license": {
         "default": "CC-BY-SA-4.0",
         "description": "License for this data product",
         "examples": [
            "CC-BY-SA-4.0"
         ],
         "fits_keyword": "LICENSE",
         "title": "License",
         "type": "string"
      },
      "license_url": {
         "default": "https://creativecommons.org/licenses/by-sa/4.0/",
         "description": "URL pointing to the details of the license described by ``license``",
         "examples": [
            "https://creativecommons.org/licenses/by-sa/4.0/"
         ],
         "fits_keyword": "LICENURL",
         "title": "License Url",
         "type": "string"
      },
      "copyright": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": "CTAO 2025",
         "description": "Copyright holder(s) of this data product",
         "examples": [
            "CTAO 2025"
         ],
         "fits_keyword": "COPYRIGH",
         "title": "Copyright"
      },
      "rights": {
         "anyOf": [
            {
               "$ref": "#/$defs/DataRights"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Availability of the data product, if known at time of creation. Options are: \"public\", \"secure\", \"proprietary\".",
         "fits_keyword": "RIGHTS",
         "ivoa_keyword": "data_rights"
      },
      "release_date": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "format": "date-time",
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Date of the public release of this data product, if different from the creation_time, e.g. if there is a proprietary period this may be set to the date when the data product is no longer private.",
         "fits_keyword": "PUBDATE",
         "ivoa_keyword": "obs_release_date",
         "title": "Release Date"
      },
      "valid_from": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "format": "date-time",
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Starting UTC date-time where the contents of this data product are valid, if known. This is meant to be able to time-order data products by scientific validity, rather than creation_date. ",
         "examples": [
            "2023-10-15 05:45:12.21",
            "2023-10-15T05:45:12"
         ],
         "title": "Valid From"
      },
      "valid_to": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "format": "date-time",
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Ending UTC date-time where the contents of this data product are valid, if known. This is meant to be able to time-order data products by scientific validity, rather than creation_date. ",
         "examples": [
            "2023-10-15 05:45:12.21",
            "2023-10-15T05:45:12"
         ],
         "title": "Valid To"
      }
   },
   "$defs": {
      "DataRights": {
         "description": "Availability of the data product, if known at time of creation.",
         "enum": [
            "public",
            "secure",
            "proprietary"
         ],
         "title": "DataRights",
         "type": "string"
      }
   },
   "additionalProperties": false
}

Config:
  • extra: str = forbid

Fields:
field copyright: str | None = 'CTAO 2025'#

Copyright holder(s) of this data product

field license: str = 'CC-BY-SA-4.0'#

License for this data product

field license_url: str = 'https://creativecommons.org/licenses/by-sa/4.0/'#

URL pointing to the details of the license described by license

field reference: AnyUrl | None = None#

a reference to where the data product is published. It is recommended that either the 19-digit bibliographic identifier used in the Astrophysics Data System bibliographic databases (http://adswww.harvard.edu/) or the Digital Object Identifier (http://doi.org) be included in the value string, when available.

field release: str | None = None#

Name of the data release (data collection) that this data product belongs to.

field release_date: Annotated[Time, _AstropyTimePydanticTypeAnnotation] | None = None#

Date of the public release of this data product, if different from the creation_time, e.g. if there is a proprietary period this may be set to the date when the data product is no longer private.

field rights: DataRights | None = None#

Availability of the data product, if known at time of creation. Options are: “public”, “secure”, “proprietary”.

field valid_from: Annotated[Time, _AstropyTimePydanticTypeAnnotation] | None = None#

Starting UTC date-time where the contents of this data product are valid, if known. This is meant to be able to time-order data products by scientific validity, rather than creation_date.

field valid_to: Annotated[Time, _AstropyTimePydanticTypeAnnotation] | None = None#

Ending UTC date-time where the contents of this data product are valid, if known. This is meant to be able to time-order data products by scientific validity, rather than creation_date.

class DataAssociation(*values)#

Bases: StrEnum

The main associated instrument or analysis part.

ARRAY = 'Array'#
REGION = 'Region'#
SUBARRAY = 'Subarray'#
TARGET = 'Target'#
TELESCOPE = 'Telescope'#
class DataDivision(*values)#

Bases: StrEnum

Primary data type.

See the CTAO Top-level Data Model Specification for more info. If more than one are contained in the same data product, the most important one should be chosen, e.g. EVENT if all three are present.

BINNED = 'Binned'#
CATALOG = 'Catalog'#
EVENT = 'Event'#
MODEL = 'Model'#
MONITORING = 'Monitoring'#
SERVICE = 'Service'#
class DataLevel(*values)#

Bases: StrEnum

CTAO Data Level, see Top-Level Data Model.

DL0 = 'DL0'#
DL1 = 'DL1'#
DL2 = 'DL2'#
DL3 = 'DL3'#
DL4 = 'DL4'#
DL5 = 'DL5'#
DL6 = 'DL6'#
R0 = 'R0'#
R1 = 'R1'#
SCIOPS = 'SciOps'#
SIM = 'SIM'#
pydantic model DataModel#

Bases: ModelBase

Describes the data model and/or format of the data product.

Show JSON schema
{
   "title": "DataModel",
   "description": "Describes the data model and/or format of the data product.",
   "type": "object",
   "properties": {
      "name": {
         "anyOf": [
            {
               "$ref": "#/$defs/DataModelName"
            },
            {
               "type": "string"
            }
         ],
         "description": "Name of the overall data model, which may contain multiple data product specifications. For CTAO models/formats, this should be the fully qualified name of the data model as defined by the top-level model.",
         "fits_keyword": "MODEL",
         "title": "Name"
      },
      "version": {
         "description": "Version number of the data model",
         "fits_keyword": "MODELVER",
         "title": "Version",
         "type": "string"
      },
      "url": {
         "anyOf": [
            {
               "format": "uri",
               "minLength": 1,
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "description": "URL or DOI linking to more detail.",
         "fits_keyword": "MODELURL",
         "title": "Url"
      }
   },
   "$defs": {
      "DataModelName": {
         "description": "Allowed data models/format specifications.",
         "enum": [
            "gadf",
            "vodf",
            "ctao"
         ],
         "title": "DataModelName",
         "type": "string"
      }
   },
   "additionalProperties": false,
   "required": [
      "name",
      "version",
      "url"
   ]
}

Config:
  • extra: str = forbid

Fields:
field name: DataModelName | str [Required]#

Name of the overall data model, which may contain multiple data product specifications. For CTAO models/formats, this should be the fully qualified name of the data model as defined by the top-level model.

field url: AnyUrl | None [Required]#

URL or DOI linking to more detail.

field version: str [Required]#

Version number of the data model

class DataModelName(*values)#

Bases: StrEnum

Allowed data models/format specifications.

CTAO = 'ctao'#
GADF = 'gadf'#
VODF = 'vodf'#
class DataProcessingCategory(*values)#

Bases: StrEnum

Which data processing pipeline category produced this product.

A=realtime, B=next-day, C=final/publication-quality.

A = 'A'#
B = 'B'#
C = 'C'#
class DataRights(*values)#

Bases: StrEnum

Availability of the data product, if known at time of creation.

PROPRIETARY = 'proprietary'#
PUBLIC = 'public'#
SECURE = 'secure'#
class DataType(*values)#

Bases: StrEnum

The specific type of the product.

This is used to disambiguate products with different data models within the same DataLevel, DataDivision, and DataAssociation. If two data products have different contents or do not share the same instance identifiers, they should have different DataTypes.

This can also be used to set the IVOA data_product_type, but may need some remapping to match IVOA terminology.

AIRSHOWER = 'AirShower'#
AIRSHOWER_SIM = 'AirShowerSim'#
ALL_SKY_CAMERA = 'AllSkyCamera'#
BACKGROUND_IRF_COMPONENT = 'BackgroundIRFComponent'#
BACKGROUND_MAP = 'BackgroundMap'#
CALIBRATION = 'Calibration'#
CALIBRATION_SIM = 'CalibrationSim'#
CEILOMETER = 'Ceilometer'#
CONTEMPORARY_ATMOSPHERE = 'ContemporaryAtmosphere'#
COUNTS_MAP = 'CountsMap'#
EDISP_MAP = 'EDispMap'#
EXCESS_MAP = 'ExcessMap'#
EXCLUSION_MAP = 'ExclusionMap'#
EXPOSURE_MAP = 'ExposureMap'#
FIT_SKY_MODEL = 'FitSkyModel'#
FLUX_MAP = 'FluxMap'#
FRAM = 'Fram'#
GRB_CATALOG = 'GRBCatalog'#
GRID_IRF = 'GridIRF'#
LIDAR = 'Lidar'#
LIGHTCURVE = 'LightCurve'#
LONG_TERM_SCHEDULE = 'LongTermSchedule'#
LST_DRS4_BASELINE_CALIBRATION = 'LSTDRS4BaselineCalibration'#
LST_DRS4_SAMPLING_CALIBRATION = 'LSTDRS4SamplingCalibration'#
LST_DRS4_TIMELAPSE_CALIBRATION = 'LSTDRS4TimelapseCalibration'#
MEDIUM_TERM_SCHEDULE = 'MediumTermSchedule'#
MUON_CANDIDATE = 'MuonCandidate'#
NECTARCAM_CALIBRATION = 'NectarCamCalibration'#
OBSERVATION = 'Observation'#
OBSERVATION_CATALOG = 'ObservationCatalog'#
OBSERVATION_SIM = 'ObservationSim'#
PHASE_MAP = 'PhaseMap'#
POINTING = 'Pointing'#
PSF_MAP = 'PSFMap'#
RECO_MODEL = 'RecoModel'#
SIGNFICANCE_MAP = 'SignificanceMap'#
SKYMODEL = 'SkyModel'#
SOURCE_CATALOG = 'SourceCatalog'#
SPECTRUM = 'Spectrum'#
TAILORED_IRF = 'TailoredIRF'#
TELESCOPE_TRIGGERS = 'TelescopeTriggers'#
TRIGGER = 'Trigger'#
WEATHER = 'Weather'#
pydantic model EnergyCoverage#

Bases: ModelBase

Describes spectral energy coverage of a data product.

Show JSON schema
{
   "title": "EnergyCoverage",
   "description": "Describes spectral energy coverage of a data product.",
   "type": "object",
   "properties": {
      "energy_unit": {
         "description": "Unit for all energy metadata.",
         "fits_keyword": "EUNIT",
         "title": "Energy Unit",
         "type": "string"
      },
      "energy_min": {
         "description": "Approximate minimum energy of the dataset, precise enough for discovering the data product by energy range. Note that this maps to the IVOA ObsCore ``em_min`` keyword, however that is expressed as a wavelength.",
         "fits_keyword": "EMIN",
         "title": "Energy Min",
         "type": "number",
         "ucd": "em.energy;stat.min",
         "unit": "TeV"
      },
      "energy_max": {
         "description": "Approximate maximum energy of the dataset, precise enough for discovering the data product by energy range. Note that this maps to the IVOA ObsCore ``em_max`` keyword, however that is expressed as a wavelength.",
         "fits_keyword": "EMAX",
         "title": "Energy Max",
         "type": "number",
         "ucd": "em.energy;stat.max",
         "unit": "TeV"
      }
   },
   "additionalProperties": false,
   "required": [
      "energy_unit",
      "energy_min",
      "energy_max"
   ]
}

Config:
  • extra: str = forbid

Fields:
field energy_max: float [Required]#

Approximate maximum energy of the dataset, precise enough for discovering the data product by energy range. Note that this maps to the IVOA ObsCore em_max keyword, however that is expressed as a wavelength.

field energy_min: float [Required]#

Approximate minimum energy of the dataset, precise enough for discovering the data product by energy range. Note that this maps to the IVOA ObsCore em_min keyword, however that is expressed as a wavelength.

field energy_unit: AstroPydanticUnit [Required]#

Unit for all energy metadata.

pydantic model ExternalDataProduct#

Bases: ModelBase

Another data product used as input to the Activity.

Show JSON schema
{
   "title": "ExternalDataProduct",
   "description": "Another data product used as input to the Activity.",
   "type": "object",
   "properties": {
      "uri": {
         "description": "URI of the data product, can be a https address, DOI, Bulk Archive LFN, or a file:// if only known locally.",
         "examples": [
            "https://doi.org/10.5281/zenodo.6218687",
            "file://myfile.fits.gz",
            "lfn://ctao/dpps/"
         ],
         "format": "uri",
         "minLength": 1,
         "title": "Uri",
         "type": "string"
      },
      "role": {
         "description": "context of the data product",
         "examples": [
            "reconstruction-model",
            "configuration",
            "camera-calibration"
         ],
         "title": "Role",
         "type": "string"
      },
      "id": {
         "default": null,
         "description": "Unique ``instance.id`` of the data product, if known.",
         "format": "uuid",
         "title": "Id",
         "type": "string"
      }
   },
   "additionalProperties": false,
   "required": [
      "uri",
      "role"
   ]
}

Config:
  • extra: str = forbid

Fields:
field id: UUID = None#

Unique instance.id of the data product, if known.

field role: str [Required]#

context of the data product

field uri: AnyUrl [Required]#

URI of the data product, can be a https address, DOI, Bulk Archive LFN, or a file:// if only known locally.

class FacilityName(*values)#

Bases: StrEnum

Name of observatory.

CTAO = 'CTAO'#
SIMULATED_CTAO = 'Simulated-CTAO'#
pydantic model GeodeticEarthLocation#

Bases: ModelBase

Position on Earth of the observatory in geodetic coordinates.

Show JSON schema
{
   "title": "GeodeticEarthLocation",
   "description": "Position on Earth of the observatory in geodetic coordinates.",
   "type": "object",
   "properties": {
      "longitude": {
         "description": "Longitude, with East positive.",
         "fits_keyword": "OBSGEO-L",
         "title": "Longitude",
         "type": "number",
         "unit": "deg"
      },
      "latitude": {
         "description": "Latitude, with North positive.",
         "fits_keyword": "OBSGEO-B",
         "title": "Latitude",
         "type": "number",
         "unit": "deg"
      },
      "height": {
         "description": "Height above sea level",
         "fits_keyword": "OBSGEO-H",
         "title": "Height",
         "type": "number",
         "unit": "m"
      }
   },
   "additionalProperties": false,
   "required": [
      "longitude",
      "latitude",
      "height"
   ]
}

Config:
  • extra: str = forbid

Fields:
field height: float [Required]#

Height above sea level

field latitude: float [Required]#

Latitude, with North positive.

field longitude: float [Required]#

Longitude, with East positive.

pydantic model InstanceIdentifier#

Bases: ModelBase

Keys that uniquely identify an instance of an observed data product.

Which of these is required depends on the ProductType.

Show JSON schema
{
   "title": "InstanceIdentifier",
   "description": "Keys that uniquely identify an instance of an observed data product.\n\nWhich of these is required depends on the ProductType.",
   "type": "object",
   "properties": {
      "id": {
         "description": "A locally-generated unique ID for this data product instance. This is used to trace the data product and link it to others. It should be unique even when same data product is produced multiple times. A UUID4 (purely random) should be used to avoid id collisions and for cybersecurity (other UUID versions encode local IP info, for example).",
         "fits_keyword": "DATAID",
         "format": "uuid",
         "title": "Id",
         "type": "string"
      },
      "obs_id": {
         "anyOf": [
            {
               "type": "integer"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Unique identifier of the observation block, in a format defined in the Common Data Model Specification.",
         "fits_keyword": "OBS_ID",
         "ivoa_keyword": "obs_id",
         "title": "Obs Id"
      },
      "event_type_group": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "For data products that are associated with a specific group of event types, this defines the name of that group.Note that for data products that mix different event type groups, this is not necessary.",
         "fits_keyword": "EVTYPE",
         "ivoa_keyword": "event_type",
         "title": "Event Type Group"
      },
      "ae_id": {
         "anyOf": [
            {
               "type": "integer"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "ID of a CTAO array element. See common data model. ``tel_id`` may be used as an alias in the case where the array element is a telescope.",
         "fits_keyword": "AE_ID",
         "title": "Ae Id"
      },
      "ae_class": {
         "anyOf": [
            {
               "$ref": "#/$defs/ArrayElementClass"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Classification of Array Element, following ACADA-DPPS ICD. Options are: \"TEL\", \"ACE\".",
         "fits_keyword": "AE_CLASS"
      },
      "subarray_id": {
         "anyOf": [
            {
               "type": "integer"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Subarray id, for data products from a subarray.",
         "fits_keyword": "SUB_ID",
         "title": "Subarray Id"
      },
      "chunk_id": {
         "anyOf": [
            {
               "type": "integer"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "For files that are split into multiple pieces (chunks) to keep the file size under a limit, this describes the chunk number (from 0) of a particular data product.",
         "fits_keyword": "CHUNK_ID",
         "title": "Chunk Id"
      },
      "batch_id": {
         "anyOf": [
            {
               "type": "integer"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Batch identifier for intermediate data products that are grouped/merged in batches. ",
         "fits_keyword": "BATCH_ID",
         "title": "Batch Id"
      },
      "calibration_service_id": {
         "anyOf": [
            {
               "type": "integer"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "ID assigned during data acquisition to link calibration products used when producing a data product.",
         "title": "Calibration Service Id"
      },
      "observing_night": {
         "anyOf": [
            {
               "format": "date",
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Date associated with the start of data taking.  It shall be created according to the date of the beginning of the observation night prior to the injection of data to DPPS. The date of the beginning of the observation night formally starts at 12:00 local civil time, is valid for the next 24 hours, and ends the next day at 12:00 local civil time.",
         "fits_keyword": "OBSNIGHT",
         "title": "Observing Night"
      },
      "sublevel_id": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "integer"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Used to distinguish partilly filled DL1 or DL2 products. Options are: \"IMAGES\", \"PARAMETERS\", \"GEOMETRY\", \"ENERGY\", \"GAMMANESS\".",
         "title": "Sublevel Id"
      },
      "target_id": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Name of the target or ROI covered by this instance.",
         "title": "Target Id"
      },
      "region_id": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Identifier for region-of-interest used for this instance.",
         "title": "Region Id"
      },
      "observing_period_id": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "ID of the observing period.",
         "title": "Observing Period Id"
      },
      "lunar_cycle_id": {
         "anyOf": [
            {
               "type": "integer"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "ID of the lunar cycle associated with this instance. Combined with the observing_period_id, this gives a unique ID of the 'period' in which this data product was observed.",
         "title": "Lunar Cycle Id"
      },
      "facility_name": {
         "$ref": "#/$defs/FacilityName",
         "default": "CTAO",
         "description": "Observatory or facility used to collect the data. If the data are simulated, it is recommended to explicitly use the word 'simulated' in the name.",
         "fits_keyword": "TELESCOP",
         "ivoa_keyword": "facility_name"
      },
      "site_id": {
         "anyOf": [
            {
               "$ref": "#/$defs/SiteID"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "CTAO site associated with this instance.",
         "fits_keyword": "INSTRUME",
         "ivoa_keyword": "instrument_name"
      },
      "particle_pdgid": {
         "anyOf": [
            {
               "type": "integer"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "For simulated data products associated with a single point in simulation phase space, the primary particle ID in PDGID format, e.g. photon=22, electron=11.",
         "title": "Particle Pdgid"
      },
      "category": {
         "anyOf": [
            {
               "$ref": "#/$defs/DataProcessingCategory"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Which data processing pipeline category produced this product.  A=realtime, B=next-day, C=final/publication-quality."
      },
      "data_source": {
         "anyOf": [
            {
               "$ref": "#/$defs/ACADADataSource"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "ACADA Data Source, see ACADA-DPPS ICD.",
         "fits_keyword": "DATASRC"
      },
      "assembly_name": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "For monitoring time-series, describes the assembly (group of monnitoring points) associated with the data product.",
         "title": "Assembly Name"
      }
   },
   "$defs": {
      "ACADADataSource": {
         "additionalProperties": false,
         "description": "ACADA Data Source, see ACADA-DPPS ICD.",
         "properties": {
            "component": {
               "description": "ACADA data source name:  the component, or instrument, generating the data. Normally will be the string of the ACS or OPC UA component instance name.",
               "examples": [
                  "SDH",
                  "SWAT"
               ],
               "title": "Component",
               "type": "string"
            },
            "id": {
               "description": "Instance identifier of the DataSource component. ",
               "title": "Id",
               "type": "integer"
            }
         },
         "required": [
            "component",
            "id"
         ],
         "title": "ACADADataSource",
         "type": "object"
      },
      "ArrayElementClass": {
         "description": "Classification of Array Element, following ACADA-DPPS ICD.",
         "enum": [
            "TEL",
            "ACE"
         ],
         "title": "ArrayElementClass",
         "type": "string"
      },
      "DataProcessingCategory": {
         "description": "Which data processing pipeline category produced this product.\n\nA=realtime, B=next-day, C=final/publication-quality.",
         "enum": [
            "A",
            "B",
            "C"
         ],
         "title": "DataProcessingCategory",
         "type": "string"
      },
      "FacilityName": {
         "description": "Name of observatory.",
         "enum": [
            "CTAO",
            "Simulated-CTAO"
         ],
         "title": "FacilityName",
         "type": "string"
      },
      "SiteID": {
         "description": "CTAO sites.",
         "enum": [
            "SDMC-SUSS",
            "CTAO-North",
            "CTAO-South",
            "SDMC-DPPS",
            "HQ",
            "EXTERNAL"
         ],
         "title": "SiteID",
         "type": "string"
      }
   },
   "additionalProperties": false
}

Config:
  • extra: str = forbid

Fields:
field ae_class: ArrayElementClass | None = None#

Classification of Array Element, following ACADA-DPPS ICD. Options are: “TEL”, “ACE”.

Validated by:
  • _check_lunar_cycle_id

field ae_id: int | None = None#

ID of a CTAO array element. See common data model. tel_id may be used as an alias in the case where the array element is a telescope.

Validated by:
  • _check_lunar_cycle_id

field assembly_name: str | None = None#

For monitoring time-series, describes the assembly (group of monnitoring points) associated with the data product.

Validated by:
  • _check_lunar_cycle_id

field batch_id: int | None = None#

Batch identifier for intermediate data products that are grouped/merged in batches.

Validated by:
  • _check_lunar_cycle_id

field calibration_service_id: int | None = None#

ID assigned during data acquisition to link calibration products used when producing a data product.

Validated by:
  • _check_lunar_cycle_id

field category: DataProcessingCategory | None = None#

Which data processing pipeline category produced this product. A=realtime, B=next-day, C=final/publication-quality.

Validated by:
  • _check_lunar_cycle_id

field chunk_id: int | None = None#

For files that are split into multiple pieces (chunks) to keep the file size under a limit, this describes the chunk number (from 0) of a particular data product.

Validated by:
  • _check_lunar_cycle_id

field data_source: ACADADataSource | None = None#

ACADA Data Source, see ACADA-DPPS ICD.

Validated by:
  • _check_lunar_cycle_id

field event_type_group: str | None = None#

For data products that are associated with a specific group of event types, this defines the name of that group.Note that for data products that mix different event type groups, this is not necessary.

Validated by:
  • _check_lunar_cycle_id

field facility_name: FacilityName = FacilityName.CTAO#

Observatory or facility used to collect the data. If the data are simulated, it is recommended to explicitly use the word ‘simulated’ in the name.

Validated by:
  • _check_lunar_cycle_id

field id: UUID [Optional]#

A locally-generated unique ID for this data product instance. This is used to trace the data product and link it to others. It should be unique even when same data product is produced multiple times. A UUID4 (purely random) should be used to avoid id collisions and for cybersecurity (other UUID versions encode local IP info, for example).

Validated by:
  • _check_lunar_cycle_id

field lunar_cycle_id: int | None = None#

ID of the lunar cycle associated with this instance. Combined with the observing_period_id, this gives a unique ID of the ‘period’ in which this data product was observed.

Validated by:
  • _check_lunar_cycle_id

field obs_id: int | None = None#

Unique identifier of the observation block, in a format defined in the Common Data Model Specification.

Validated by:
  • _check_lunar_cycle_id

field observing_night: date | None = None#

Date associated with the start of data taking. It shall be created according to the date of the beginning of the observation night prior to the injection of data to DPPS. The date of the beginning of the observation night formally starts at 12:00 local civil time, is valid for the next 24 hours, and ends the next day at 12:00 local civil time.

Validated by:
  • _check_lunar_cycle_id

field observing_period_id: str | None = None#

ID of the observing period.

Validated by:
  • _check_lunar_cycle_id

field particle_pdgid: int | None = None#

For simulated data products associated with a single point in simulation phase space, the primary particle ID in PDGID format, e.g. photon=22, electron=11.

Validated by:
  • _check_lunar_cycle_id

field region_id: str | None = None#

Identifier for region-of-interest used for this instance.

Validated by:
  • _check_lunar_cycle_id

field site_id: SiteID | None = None#

CTAO site associated with this instance.

Validated by:
  • _check_lunar_cycle_id

field subarray_id: int | None = None#

Subarray id, for data products from a subarray.

Validated by:
  • _check_lunar_cycle_id

field sublevel_id: ProcessingSublevel | None = None#

Used to distinguish partilly filled DL1 or DL2 products. Options are: “IMAGES”, “PARAMETERS”, “GEOMETRY”, “ENERGY”, “GAMMANESS”.

Validated by:
  • _check_lunar_cycle_id

field target_id: str | None = None#

Name of the target or ROI covered by this instance.

Validated by:
  • _check_lunar_cycle_id

pydantic model Observation#

Bases: ModelBase

Context info for data products associated with an observation.

Show JSON schema
{
   "title": "Observation",
   "description": "Context info for data products associated with an observation.",
   "type": "object",
   "properties": {
      "coverage": {
         "anyOf": [
            {
               "$ref": "#/$defs/Coverage"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Describes the spatial, temporal, spectral, and tracking coverage of a data product.  This information is for the discovery of data products, not to specify precise bounds for science analysis. Typically this information can only be attached to higher-level data products, e.g. DL3 and above, as the information may not be available before processing."
      },
      "location": {
         "anyOf": [
            {
               "$ref": "#/$defs/GeodeticEarthLocation"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Position on Earth of the observatory in geodetic coordinates."
      }
   },
   "$defs": {
      "Coverage": {
         "additionalProperties": false,
         "description": "Describes the spatial, temporal, spectral, and tracking coverage of a data product.\n\nThis information is for the discovery of data products, not to specify\nprecise bounds for science analysis. Typically this information can only be\nattached to higher-level data products, e.g. DL3 and above, as the\ninformation may not be available before processing.",
         "properties": {
            "time": {
               "anyOf": [
                  {
                     "$ref": "#/$defs/TimeCoverage"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Time bounds for discoverability of a data product with time coverage."
            },
            "space": {
               "anyOf": [
                  {
                     "$ref": "#/$defs/SpaceCoverage"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Defines spatial coverage of a data product.  The circle defined by ra, dec, field_of_view is used for the discoverability of data products by cone search, and should be considered a bounding circle if the true region covered is non-circular. The optional fields region_of_interest and moc can be used for more precise definition of the coverage."
            },
            "energy": {
               "anyOf": [
                  {
                     "$ref": "#/$defs/EnergyCoverage"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Describes spectral energy coverage of a data product."
            },
            "tracking": {
               "anyOf": [
                  {
                     "$ref": "#/$defs/TrackingCoverage"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Describes the coverage of ground-referenced observing parameters.  This is required only for data products where knowing the horizontal (ground based alt/az) coverage is relevant. For equatorial tracking, elevation and azimuth vary with time. For fixed-horizontal tracking, ranges may collapse to single values."
            }
         },
         "title": "Coverage",
         "type": "object"
      },
      "EnergyCoverage": {
         "additionalProperties": false,
         "description": "Describes spectral energy coverage of a data product.",
         "properties": {
            "energy_unit": {
               "description": "Unit for all energy metadata.",
               "fits_keyword": "EUNIT",
               "title": "Energy Unit",
               "type": "string"
            },
            "energy_min": {
               "description": "Approximate minimum energy of the dataset, precise enough for discovering the data product by energy range. Note that this maps to the IVOA ObsCore ``em_min`` keyword, however that is expressed as a wavelength.",
               "fits_keyword": "EMIN",
               "title": "Energy Min",
               "type": "number",
               "ucd": "em.energy;stat.min",
               "unit": "TeV"
            },
            "energy_max": {
               "description": "Approximate maximum energy of the dataset, precise enough for discovering the data product by energy range. Note that this maps to the IVOA ObsCore ``em_max`` keyword, however that is expressed as a wavelength.",
               "fits_keyword": "EMAX",
               "title": "Energy Max",
               "type": "number",
               "ucd": "em.energy;stat.max",
               "unit": "TeV"
            }
         },
         "required": [
            "energy_unit",
            "energy_min",
            "energy_max"
         ],
         "title": "EnergyCoverage",
         "type": "object"
      },
      "GeodeticEarthLocation": {
         "additionalProperties": false,
         "description": "Position on Earth of the observatory in geodetic coordinates.",
         "properties": {
            "longitude": {
               "description": "Longitude, with East positive.",
               "fits_keyword": "OBSGEO-L",
               "title": "Longitude",
               "type": "number",
               "unit": "deg"
            },
            "latitude": {
               "description": "Latitude, with North positive.",
               "fits_keyword": "OBSGEO-B",
               "title": "Latitude",
               "type": "number",
               "unit": "deg"
            },
            "height": {
               "description": "Height above sea level",
               "fits_keyword": "OBSGEO-H",
               "title": "Height",
               "type": "number",
               "unit": "m"
            }
         },
         "required": [
            "longitude",
            "latitude",
            "height"
         ],
         "title": "GeodeticEarthLocation",
         "type": "object"
      },
      "SpaceCoverage": {
         "additionalProperties": false,
         "description": "Defines spatial coverage of a data product.\n\nThe circle defined by ra, dec, field_of_view is used for the discoverability\nof data products by cone search, and should be considered a bounding circle\nif the true region covered is non-circular. The optional fields\nregion_of_interest and moc can be used for more precise definition of the\ncoverage.",
         "properties": {
            "frame": {
               "$ref": "#/$defs/SpatialFrame",
               "default": "ICRS",
               "description": "Standard equatorial coordinate system used for RA/Dec coordinates.  Note that for tablular data products, columns of coordinate values have their own standards in FITS and IVOA for specifying the frame, e.g. the ``RADESYSn`` column metadata attribute.",
               "fits_keyword": "RADESYS"
            },
            "ra": {
               "description": "ICRS Right ascension of the center of the region covered.",
               "fits_keyword": "RA_PNT",
               "ivoa_keyword": "s_ra",
               "title": "Ra",
               "type": "number",
               "ucd": "pos.eq.ra",
               "unit": "deg"
            },
            "dec": {
               "description": "ICRS Declination of the center of the region covered",
               "fits_keyword": "DEC_PNT",
               "ivoa_keyword": "s_dec",
               "title": "Dec",
               "type": "number",
               "ucd": "pos.eq.dec",
               "unit": "deg"
            },
            "field_of_view": {
               "description": "Approximate diameter (not radius) of the region covered by this data product if approximated as a circle on a sphere. For energy-dependent FOVs, a representative value should be chosen such that the data product can be identified in a cone search. Note that more accurate ROI shapes can be specified using the `region_of_interest` field, but `field_of_view` should always be filled because it provides a simple way to do a rough filtering.",
               "fits_keyword": "FOV",
               "ivoa_keyword": "s_fov",
               "title": "Field Of View",
               "type": "number",
               "ucd": "pos.spherical.r;instr.fov",
               "unit": "deg"
            },
            "region_of_interest": {
               "anyOf": [
                  {
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "IVOA ADQL-format region string describing the region of interest.",
               "examples": [
                  "Box ICRS 83.633083 22.0145 5 5",
                  "Circle ICRS 83.633083 22.0145 5",
                  "Polygon ICRS 81.133083 19.5145  86.133083 19.5145  86.133083 24.5145  81.133083 24.5145"
               ],
               "fits_keyword": "REGION",
               "ivoa_keyword": "s_region",
               "title": "Region Of Interest"
            },
            "moc": {
               "anyOf": [
                  {
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Multi-order coverage (MOC) string describing the region covered by the data product. https://www.ivoa.net/documents/MOC/",
               "examples": [
                  "4/2609 2611-2612  5/10350-10351 10362-10363 10433-10435 10440-10441 10443 10452 10456-10458   10468-10469  6/41398-41399 41442-41443 41446-41447 41464 41466-41467 41769-41771 41816-41818   41836 41840 41857 41860-41861 41863 41920"
               ],
               "title": "Moc"
            }
         },
         "required": [
            "ra",
            "dec",
            "field_of_view"
         ],
         "title": "SpaceCoverage",
         "type": "object"
      },
      "SpatialFrame": {
         "description": "Standard equatorial coordinate system used for RA/Dec coordinates.\n\nNote that for tablular data products, columns of coordinate values have\ntheir own standards in FITS and IVOA for specifying the frame, e.g. the\n``RADESYSn`` column metadata attribute.",
         "enum": [
            "ICRS"
         ],
         "title": "SpatialFrame",
         "type": "string"
      },
      "TimeCoverage": {
         "additionalProperties": false,
         "description": "Time bounds for discoverability of a data product with time coverage.",
         "properties": {
            "reference": {
               "anyOf": [
                  {
                     "$ref": "#/$defs/TimeReference"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Reference time for floating point time representations.  For timestamps represented as ISO time strings, this is not relevant."
            },
            "t_min": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "string"
                  },
                  {
                     "format": "date-time",
                     "type": "string"
                  }
               ],
               "description": "Start of time range of the data as either an ISO string or a float in the system defined by the time reference.",
               "fits_keyword": "TSTART",
               "title": "T Min"
            },
            "t_max": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "string"
                  },
                  {
                     "format": "date-time",
                     "type": "string"
                  }
               ],
               "description": "End of time range of the data, as either an ISO string or a float in the system defined by the time reference.",
               "fits_keyword": "TSTOP",
               "title": "T Max"
            }
         },
         "required": [
            "t_min",
            "t_max"
         ],
         "title": "TimeCoverage",
         "type": "object"
      },
      "TimeRefPos": {
         "description": "Spatial location at which the observation time is valid.\n\nFrom FITS standard v4",
         "enum": [
            "TOPOCENTER",
            "RELOCATABLE"
         ],
         "title": "TimeRefPos",
         "type": "string"
      },
      "TimeReference": {
         "additionalProperties": false,
         "description": "Reference time for floating point time representations.\n\nFor timestamps represented as ISO time strings, this is not relevant.",
         "properties": {
            "position": {
               "$ref": "#/$defs/TimeRefPos",
               "description": "Spatial location at which the observation time is valid.  From FITS standard v4 Options are: \"TOPOCENTER\", \"RELOCATABLE\".",
               "fits_keyword": "TREFPOS"
            },
            "time_mjd": {
               "description": "Reference time in MJD",
               "fits_keyword": "MJDREF",
               "title": "Time Mjd",
               "type": "number",
               "unit": "d"
            },
            "unit": {
               "default": "s",
               "fits_keyword": "TIMEUNIT",
               "title": "Unit",
               "type": "string"
            },
            "system": {
               "$ref": "#/$defs/TimeSystem",
               "default": "tai",
               "description": "The time scale of the time-related keywords.  For simulated data, use LOCAL. Options are: \"tt\", \"utc\", \"ut1\", \"tai\", \"gps\", \"local\".",
               "fits_keyword": "TIMESYS"
            },
            "resolution": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "time resolution in the time unit.",
               "fits_keyword": "TIMEDELT",
               "ivoa_keyword": "t_resolution",
               "title": "Resolution"
            }
         },
         "required": [
            "position",
            "time_mjd"
         ],
         "title": "TimeReference",
         "type": "object"
      },
      "TimeSystem": {
         "description": "The time scale of the time-related keywords.\n\nFor simulated data, use LOCAL.",
         "enum": [
            "tt",
            "utc",
            "ut1",
            "tai",
            "gps",
            "local"
         ],
         "title": "TimeSystem",
         "type": "string"
      },
      "TrackingCoverage": {
         "additionalProperties": false,
         "description": "Describes the coverage of ground-referenced observing parameters.\n\nThis is required only for data products where knowing the horizontal (ground\nbased alt/az) coverage is relevant. For equatorial tracking, elevation and\nazimuth vary with time. For fixed-horizontal tracking, ranges may collapse\nto single values.",
         "properties": {
            "elevation_min": {
               "description": "Minimum elevation above horizon of observation.",
               "fits_keyword": "ALT_MIN",
               "title": "Elevation Min",
               "type": "number",
               "ucd": "pos.az.alt;stat.min",
               "unit": "deg"
            },
            "elevation_max": {
               "description": "Maximum elevation above horizon of observation.",
               "fits_keyword": "ALT_MAX",
               "title": "Elevation Max",
               "type": "number",
               "ucd": "pos.az.alt;stat.max",
               "unit": "deg"
            },
            "azimuth_mean": {
               "description": "Mean azimith of observation.",
               "fits_keyword": "AZ_MEAN",
               "title": "Azimuth Mean",
               "type": "number",
               "ucd": "pos.az.azi;stat.mean",
               "unit": "deg"
            },
            "azimuth_range": {
               "description": "Full angular width of the observation in azimuth. Defines the horizontal coverage around `azimuth_mean`. The value should be capped at 360 deg, even if the telecope moves for larger than one rotation during the observation.",
               "fits_keyword": "AZ_RANGE",
               "maximum": 360.0,
               "minimum": 0.0,
               "title": "Azimuth Range",
               "type": "number",
               "ucd": "pos.az.azi;stat.interval",
               "unit": "deg"
            },
            "mode": {
               "$ref": "#/$defs/TrackingMode",
               "fits_keyword": "TRACKING"
            }
         },
         "required": [
            "elevation_min",
            "elevation_max",
            "azimuth_mean",
            "azimuth_range",
            "mode"
         ],
         "title": "TrackingCoverage",
         "type": "object"
      },
      "TrackingMode": {
         "description": "Coordinate system tracked by the nominal pointing position.",
         "enum": [
            "fixed_icrs",
            "fixed_horizontal",
            "other"
         ],
         "title": "TrackingMode",
         "type": "string"
      }
   },
   "additionalProperties": false
}

Config:
  • extra: str = forbid

Fields:
field coverage: Coverage | None = None#

Describes the spatial, temporal, spectral, and tracking coverage of a data product. This information is for the discovery of data products, not to specify precise bounds for science analysis. Typically this information can only be attached to higher-level data products, e.g. DL3 and above, as the information may not be available before processing.

field location: GeodeticEarthLocation | None = None#

Position on Earth of the observatory in geodetic coordinates.

class ObservatoryProcess(*values)#

Bases: StrEnum

Observatory operational Process.

These are the top-level processes

ACQUISITION = 'acquisition'#
DATA_PROCESSING = 'data_processing'#
INSTRUMENT = 'instrument'#
OBSERVATION_PLANNING = 'observation_planning'#
PROPOSAL_HANDLING = 'proposal_handling'#
SCIENCE_ANALYSIS = 'science_analysis'#
SCIENCE_DATA_CHALLENGE = 'science_data_challenge'#
SIMULATION = 'simulation'#
USER = 'user'#
class ProcessingSublevel(*values)#

Bases: StrFlag

Used to distinguish partilly filled DL1 or DL2 products.

ENERGY = 8#
GAMMANESS = 16#
GEOMETRY = 4#
IMAGES = 1#
PARAMETERS = 2#
pydantic model Product#

Bases: ModelBase

Common metadata for all CTAO data products.

Show JSON schema
{
   "title": "Product",
   "description": "Common metadata for all CTAO data products.",
   "type": "object",
   "properties": {
      "ctao_metadata_version": {
         "const": "1.0.0rc3",
         "default": "1.0.0rc3",
         "description": "CTAO DataProducts Metadata Version",
         "fits_keyword": "CTAOMETA",
         "title": "Ctao Metadata Version",
         "type": "string"
      },
      "description": {
         "description": "Human-readable description of this data product",
         "fits_keyword": "TITLE",
         "ivoa_keyword": "obs_title",
         "title": "Description",
         "type": "string"
      },
      "data": {
         "$ref": "#/$defs/ProductType",
         "description": "Describes all possible types of CTAO data product.  This can also be used as a hierarchy for defining DataSets containing data of the same type within a higher-level collection like a data release."
      },
      "instance": {
         "$ref": "#/$defs/InstanceIdentifier",
         "description": "Keys that uniquely identify an instance of an observed data product.  Which of these is required depends on the ProductType."
      },
      "curation": {
         "$ref": "#/$defs/Curation"
      },
      "model": {
         "$ref": "#/$defs/DataModel"
      },
      "disclaimer": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Text describing e.g. the allowed usage of this data product, if specifics are required.",
         "fits_keyword": "COMMENT",
         "title": "Disclaimer"
      },
      "creation_time": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "format": "date-time",
               "type": "string"
            }
         ],
         "description": "UTC Date-time the data product was created",
         "examples": [
            "2023-10-15 05:45:12.21",
            "2023-10-15T05:45:12"
         ],
         "fits_keyword": "CREATED",
         "ivoa_keyword": "obs_creation_date",
         "title": "Creation Time",
         "ucd": "time.creation"
      },
      "contact": {
         "$ref": "#/$defs/Contact"
      },
      "activity": {
         "anyOf": [
            {
               "$ref": "#/$defs/Activity"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "The activity (software or human) that produced this data product."
      },
      "observation": {
         "anyOf": [
            {
               "$ref": "#/$defs/Observation"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Context info for data products associated with an observation."
      },
      "acquisition": {
         "anyOf": [
            {
               "$ref": "#/$defs/Acquisition"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Acquisition context metadata."
      }
   },
   "$defs": {
      "ACADADataSource": {
         "additionalProperties": false,
         "description": "ACADA Data Source, see ACADA-DPPS ICD.",
         "properties": {
            "component": {
               "description": "ACADA data source name:  the component, or instrument, generating the data. Normally will be the string of the ACS or OPC UA component instance name.",
               "examples": [
                  "SDH",
                  "SWAT"
               ],
               "title": "Component",
               "type": "string"
            },
            "id": {
               "description": "Instance identifier of the DataSource component. ",
               "title": "Id",
               "type": "integer"
            }
         },
         "required": [
            "component",
            "id"
         ],
         "title": "ACADADataSource",
         "type": "object"
      },
      "Acquisition": {
         "additionalProperties": false,
         "description": "Acquisition context metadata.",
         "properties": {
            "sb_id": {
               "anyOf": [
                  {
                     "type": "integer"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Unique identifier of the scheduling block associated with this data product, in a format defined in the Scheduling Block Data Model Specification.",
               "fits_keyword": "SB_ID",
               "ivoa_keyword": "sb_id",
               "title": "Sb Id"
            }
         },
         "title": "Acquisition",
         "type": "object"
      },
      "Activity": {
         "additionalProperties": false,
         "description": "The activity (software or human) that produced this data product.",
         "properties": {
            "process": {
               "anyOf": [
                  {
                     "$ref": "#/$defs/ObservatoryProcess"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": "user",
               "description": "Observatory operational Process.  These are the top-level processes",
               "fits_keyword": "ACTPROC"
            },
            "name": {
               "description": "Name of the activity that produced this data product.",
               "examples": [
                  "observation data processing",
                  "lab calibration"
               ],
               "fits_keyword": "ACTIVITY",
               "title": "Name",
               "type": "string"
            },
            "description": {
               "anyOf": [
                  {
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Human-readable details of the activity, if more specificity than the `name` is required.",
               "fits_keyword": "ACTDESC",
               "title": "Description"
            },
            "id": {
               "description": "Unique identifier of this process, which is used to link multiple data products produced together.  If this is a human process, this can be generated with the `uuidgen` linux command for example.",
               "fits_keyword": "ACTID",
               "format": "uuid",
               "title": "Id",
               "type": "string"
            },
            "start": {
               "anyOf": [
                  {
                     "type": "string"
                  },
                  {
                     "format": "date-time",
                     "type": "string"
                  }
               ],
               "description": "Start time of the activity",
               "fits_keyword": "ACTSTART",
               "title": "Start"
            },
            "end": {
               "anyOf": [
                  {
                     "type": "string"
                  },
                  {
                     "format": "date-time",
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "End time of the activity, which is generally not known when the data product is being written and is therefore optional. ",
               "fits_keyword": "ACTSTOP",
               "title": "End"
            },
            "software": {
               "anyOf": [
                  {
                     "$ref": "#/$defs/Software"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "if the activity involved software, describes it."
            },
            "configuration_id": {
               "description": "Identifier for the configuration for the software used to produce this data product. This is normally a unique identifier of the configuration used to produce this data product, It should be possible for a user knowing this identifier and details of how and where configurations are stored, to find the full original configuration. It is recommended to use a URI when possible, particularly for REST API endpoints or  git repositories.",
               "examples": [
                  "dl3/hillas-standard/v1",
                  "dl5/quicklook-followup/v1",
                  "https://myobservatory.org/API/v1/config/data-processing/standard-v1.2"
               ],
               "fits_keyword": "ANAMODE",
               "ivoa_keyword": "analysis_mode",
               "title": "Configuration Id",
               "type": "string"
            },
            "inputs": {
               "anyOf": [
                  {
                     "items": {
                        "$ref": "#/$defs/ExternalDataProduct"
                     },
                     "type": "array"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Describes the input data products to the activity that produced this data product.",
               "title": "Inputs"
            }
         },
         "required": [
            "name",
            "id",
            "start",
            "configuration_id"
         ],
         "title": "Activity",
         "type": "object"
      },
      "ArrayElementClass": {
         "description": "Classification of Array Element, following ACADA-DPPS ICD.",
         "enum": [
            "TEL",
            "ACE"
         ],
         "title": "ArrayElementClass",
         "type": "string"
      },
      "Contact": {
         "additionalProperties": false,
         "description": "Contact information for this data product.",
         "properties": {
            "name": {
               "description": "Contact name for this data product.",
               "fits_keyword": "AUTHOR",
               "title": "Name",
               "type": "string"
            },
            "organization": {
               "description": "Contact organization name of this data product.",
               "fits_keyword": "ORIGIN",
               "title": "Organization",
               "type": "string"
            },
            "email": {
               "description": "Contact's email address",
               "fits_keyword": "EMAIL",
               "format": "email",
               "title": "Email",
               "type": "string"
            }
         },
         "required": [
            "name",
            "organization",
            "email"
         ],
         "title": "Contact",
         "type": "object"
      },
      "Coverage": {
         "additionalProperties": false,
         "description": "Describes the spatial, temporal, spectral, and tracking coverage of a data product.\n\nThis information is for the discovery of data products, not to specify\nprecise bounds for science analysis. Typically this information can only be\nattached to higher-level data products, e.g. DL3 and above, as the\ninformation may not be available before processing.",
         "properties": {
            "time": {
               "anyOf": [
                  {
                     "$ref": "#/$defs/TimeCoverage"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Time bounds for discoverability of a data product with time coverage."
            },
            "space": {
               "anyOf": [
                  {
                     "$ref": "#/$defs/SpaceCoverage"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Defines spatial coverage of a data product.  The circle defined by ra, dec, field_of_view is used for the discoverability of data products by cone search, and should be considered a bounding circle if the true region covered is non-circular. The optional fields region_of_interest and moc can be used for more precise definition of the coverage."
            },
            "energy": {
               "anyOf": [
                  {
                     "$ref": "#/$defs/EnergyCoverage"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Describes spectral energy coverage of a data product."
            },
            "tracking": {
               "anyOf": [
                  {
                     "$ref": "#/$defs/TrackingCoverage"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Describes the coverage of ground-referenced observing parameters.  This is required only for data products where knowing the horizontal (ground based alt/az) coverage is relevant. For equatorial tracking, elevation and azimuth vary with time. For fixed-horizontal tracking, ranges may collapse to single values."
            }
         },
         "title": "Coverage",
         "type": "object"
      },
      "Curation": {
         "additionalProperties": false,
         "description": "Information related to the release and usage of data products.",
         "properties": {
            "release": {
               "anyOf": [
                  {
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Name of the data release (data collection) that this data product belongs to.",
               "examples": [
                  "CTAO/DL3-DR1",
                  "CTAO/DL3-SDC1"
               ],
               "fits_keyword": "RELEASE",
               "ivoa_keyword": "obs_collection",
               "title": "Release"
            },
            "reference": {
               "anyOf": [
                  {
                     "format": "uri",
                     "minLength": 1,
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "a reference to where the data product is published. It is recommended that either the 19-digit bibliographic identifier used in the Astrophysics Data System bibliographic databases (http://adswww.harvard.edu/) or the Digital Object Identifier (http://doi.org) be included in the value string, when available.",
               "examples": [
                  "1994A&AS..103..135A",
                  "doi:10.1006/jmbi.1998.2354"
               ],
               "fits_keyword": "REFERENC",
               "title": "Reference"
            },
            "license": {
               "default": "CC-BY-SA-4.0",
               "description": "License for this data product",
               "examples": [
                  "CC-BY-SA-4.0"
               ],
               "fits_keyword": "LICENSE",
               "title": "License",
               "type": "string"
            },
            "license_url": {
               "default": "https://creativecommons.org/licenses/by-sa/4.0/",
               "description": "URL pointing to the details of the license described by ``license``",
               "examples": [
                  "https://creativecommons.org/licenses/by-sa/4.0/"
               ],
               "fits_keyword": "LICENURL",
               "title": "License Url",
               "type": "string"
            },
            "copyright": {
               "anyOf": [
                  {
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": "CTAO 2025",
               "description": "Copyright holder(s) of this data product",
               "examples": [
                  "CTAO 2025"
               ],
               "fits_keyword": "COPYRIGH",
               "title": "Copyright"
            },
            "rights": {
               "anyOf": [
                  {
                     "$ref": "#/$defs/DataRights"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Availability of the data product, if known at time of creation. Options are: \"public\", \"secure\", \"proprietary\".",
               "fits_keyword": "RIGHTS",
               "ivoa_keyword": "data_rights"
            },
            "release_date": {
               "anyOf": [
                  {
                     "type": "string"
                  },
                  {
                     "format": "date-time",
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Date of the public release of this data product, if different from the creation_time, e.g. if there is a proprietary period this may be set to the date when the data product is no longer private.",
               "fits_keyword": "PUBDATE",
               "ivoa_keyword": "obs_release_date",
               "title": "Release Date"
            },
            "valid_from": {
               "anyOf": [
                  {
                     "type": "string"
                  },
                  {
                     "format": "date-time",
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Starting UTC date-time where the contents of this data product are valid, if known. This is meant to be able to time-order data products by scientific validity, rather than creation_date. ",
               "examples": [
                  "2023-10-15 05:45:12.21",
                  "2023-10-15T05:45:12"
               ],
               "title": "Valid From"
            },
            "valid_to": {
               "anyOf": [
                  {
                     "type": "string"
                  },
                  {
                     "format": "date-time",
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Ending UTC date-time where the contents of this data product are valid, if known. This is meant to be able to time-order data products by scientific validity, rather than creation_date. ",
               "examples": [
                  "2023-10-15 05:45:12.21",
                  "2023-10-15T05:45:12"
               ],
               "title": "Valid To"
            }
         },
         "title": "Curation",
         "type": "object"
      },
      "DataAssociation": {
         "description": "The main associated instrument or analysis part.",
         "enum": [
            "Array",
            "Subarray",
            "Telescope",
            "Region",
            "Target"
         ],
         "title": "DataAssociation",
         "type": "string"
      },
      "DataDivision": {
         "description": "Primary data type.\n\nSee the CTAO Top-level Data Model Specification for more info. If more than\none are contained in the same data product, the most important one should be\nchosen, e.g. EVENT if all three are present.",
         "enum": [
            "Event",
            "Monitoring",
            "Service",
            "Model",
            "Binned",
            "Catalog"
         ],
         "title": "DataDivision",
         "type": "string"
      },
      "DataLevel": {
         "description": "CTAO Data Level, see Top-Level Data Model.",
         "enum": [
            "R0",
            "R1",
            "DL0",
            "DL1",
            "DL2",
            "DL3",
            "DL4",
            "DL5",
            "DL6",
            "SIM",
            "SciOps"
         ],
         "title": "DataLevel",
         "type": "string"
      },
      "DataModel": {
         "additionalProperties": false,
         "description": "Describes the data model and/or format of the data product.",
         "properties": {
            "name": {
               "anyOf": [
                  {
                     "$ref": "#/$defs/DataModelName"
                  },
                  {
                     "type": "string"
                  }
               ],
               "description": "Name of the overall data model, which may contain multiple data product specifications. For CTAO models/formats, this should be the fully qualified name of the data model as defined by the top-level model.",
               "fits_keyword": "MODEL",
               "title": "Name"
            },
            "version": {
               "description": "Version number of the data model",
               "fits_keyword": "MODELVER",
               "title": "Version",
               "type": "string"
            },
            "url": {
               "anyOf": [
                  {
                     "format": "uri",
                     "minLength": 1,
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "description": "URL or DOI linking to more detail.",
               "fits_keyword": "MODELURL",
               "title": "Url"
            }
         },
         "required": [
            "name",
            "version",
            "url"
         ],
         "title": "DataModel",
         "type": "object"
      },
      "DataModelName": {
         "description": "Allowed data models/format specifications.",
         "enum": [
            "gadf",
            "vodf",
            "ctao"
         ],
         "title": "DataModelName",
         "type": "string"
      },
      "DataProcessingCategory": {
         "description": "Which data processing pipeline category produced this product.\n\nA=realtime, B=next-day, C=final/publication-quality.",
         "enum": [
            "A",
            "B",
            "C"
         ],
         "title": "DataProcessingCategory",
         "type": "string"
      },
      "DataRights": {
         "description": "Availability of the data product, if known at time of creation.",
         "enum": [
            "public",
            "secure",
            "proprietary"
         ],
         "title": "DataRights",
         "type": "string"
      },
      "DataType": {
         "description": "The specific type of the product.\n\nThis is used to disambiguate products with different data models within the\nsame DataLevel, DataDivision, and DataAssociation. If two data products have\ndifferent contents or do not share the same instance identifiers, they\nshould have different DataTypes.\n\nThis can also be used to set the IVOA ``data_product_type``, but may need some\nremapping to match IVOA terminology.",
         "enum": [
            "AllSkyCamera",
            "BackgroundMap",
            "BackgroundIRFComponent",
            "AirShower",
            "AirShowerSim",
            "Calibration",
            "CalibrationSim",
            "MuonCandidate",
            "Ceilometer",
            "ContemporaryAtmosphere",
            "CountsMap",
            "EDispMap",
            "ExposureMap",
            "ExcessMap",
            "ExclusionMap",
            "FitSkyModel",
            "FluxMap",
            "Fram",
            "GRBCatalog",
            "GridIRF",
            "Lidar",
            "LightCurve",
            "LongTermSchedule",
            "MediumTermSchedule",
            "Observation",
            "ObservationSim",
            "ObservationCatalog",
            "PhaseMap",
            "Pointing",
            "PSFMap",
            "RecoModel",
            "SignificanceMap",
            "SkyModel",
            "SourceCatalog",
            "Spectrum",
            "TailoredIRF",
            "TelescopeTriggers",
            "Trigger",
            "LSTDRS4BaselineCalibration",
            "LSTDRS4SamplingCalibration",
            "LSTDRS4TimelapseCalibration",
            "NectarCamCalibration",
            "Weather"
         ],
         "title": "DataType",
         "type": "string"
      },
      "EnergyCoverage": {
         "additionalProperties": false,
         "description": "Describes spectral energy coverage of a data product.",
         "properties": {
            "energy_unit": {
               "description": "Unit for all energy metadata.",
               "fits_keyword": "EUNIT",
               "title": "Energy Unit",
               "type": "string"
            },
            "energy_min": {
               "description": "Approximate minimum energy of the dataset, precise enough for discovering the data product by energy range. Note that this maps to the IVOA ObsCore ``em_min`` keyword, however that is expressed as a wavelength.",
               "fits_keyword": "EMIN",
               "title": "Energy Min",
               "type": "number",
               "ucd": "em.energy;stat.min",
               "unit": "TeV"
            },
            "energy_max": {
               "description": "Approximate maximum energy of the dataset, precise enough for discovering the data product by energy range. Note that this maps to the IVOA ObsCore ``em_max`` keyword, however that is expressed as a wavelength.",
               "fits_keyword": "EMAX",
               "title": "Energy Max",
               "type": "number",
               "ucd": "em.energy;stat.max",
               "unit": "TeV"
            }
         },
         "required": [
            "energy_unit",
            "energy_min",
            "energy_max"
         ],
         "title": "EnergyCoverage",
         "type": "object"
      },
      "ExternalDataProduct": {
         "additionalProperties": false,
         "description": "Another data product used as input to the Activity.",
         "properties": {
            "uri": {
               "description": "URI of the data product, can be a https address, DOI, Bulk Archive LFN, or a file:// if only known locally.",
               "examples": [
                  "https://doi.org/10.5281/zenodo.6218687",
                  "file://myfile.fits.gz",
                  "lfn://ctao/dpps/"
               ],
               "format": "uri",
               "minLength": 1,
               "title": "Uri",
               "type": "string"
            },
            "role": {
               "description": "context of the data product",
               "examples": [
                  "reconstruction-model",
                  "configuration",
                  "camera-calibration"
               ],
               "title": "Role",
               "type": "string"
            },
            "id": {
               "default": null,
               "description": "Unique ``instance.id`` of the data product, if known.",
               "format": "uuid",
               "title": "Id",
               "type": "string"
            }
         },
         "required": [
            "uri",
            "role"
         ],
         "title": "ExternalDataProduct",
         "type": "object"
      },
      "FacilityName": {
         "description": "Name of observatory.",
         "enum": [
            "CTAO",
            "Simulated-CTAO"
         ],
         "title": "FacilityName",
         "type": "string"
      },
      "GeodeticEarthLocation": {
         "additionalProperties": false,
         "description": "Position on Earth of the observatory in geodetic coordinates.",
         "properties": {
            "longitude": {
               "description": "Longitude, with East positive.",
               "fits_keyword": "OBSGEO-L",
               "title": "Longitude",
               "type": "number",
               "unit": "deg"
            },
            "latitude": {
               "description": "Latitude, with North positive.",
               "fits_keyword": "OBSGEO-B",
               "title": "Latitude",
               "type": "number",
               "unit": "deg"
            },
            "height": {
               "description": "Height above sea level",
               "fits_keyword": "OBSGEO-H",
               "title": "Height",
               "type": "number",
               "unit": "m"
            }
         },
         "required": [
            "longitude",
            "latitude",
            "height"
         ],
         "title": "GeodeticEarthLocation",
         "type": "object"
      },
      "InstanceIdentifier": {
         "additionalProperties": false,
         "description": "Keys that uniquely identify an instance of an observed data product.\n\nWhich of these is required depends on the ProductType.",
         "properties": {
            "id": {
               "description": "A locally-generated unique ID for this data product instance. This is used to trace the data product and link it to others. It should be unique even when same data product is produced multiple times. A UUID4 (purely random) should be used to avoid id collisions and for cybersecurity (other UUID versions encode local IP info, for example).",
               "fits_keyword": "DATAID",
               "format": "uuid",
               "title": "Id",
               "type": "string"
            },
            "obs_id": {
               "anyOf": [
                  {
                     "type": "integer"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Unique identifier of the observation block, in a format defined in the Common Data Model Specification.",
               "fits_keyword": "OBS_ID",
               "ivoa_keyword": "obs_id",
               "title": "Obs Id"
            },
            "event_type_group": {
               "anyOf": [
                  {
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "For data products that are associated with a specific group of event types, this defines the name of that group.Note that for data products that mix different event type groups, this is not necessary.",
               "fits_keyword": "EVTYPE",
               "ivoa_keyword": "event_type",
               "title": "Event Type Group"
            },
            "ae_id": {
               "anyOf": [
                  {
                     "type": "integer"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "ID of a CTAO array element. See common data model. ``tel_id`` may be used as an alias in the case where the array element is a telescope.",
               "fits_keyword": "AE_ID",
               "title": "Ae Id"
            },
            "ae_class": {
               "anyOf": [
                  {
                     "$ref": "#/$defs/ArrayElementClass"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Classification of Array Element, following ACADA-DPPS ICD. Options are: \"TEL\", \"ACE\".",
               "fits_keyword": "AE_CLASS"
            },
            "subarray_id": {
               "anyOf": [
                  {
                     "type": "integer"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Subarray id, for data products from a subarray.",
               "fits_keyword": "SUB_ID",
               "title": "Subarray Id"
            },
            "chunk_id": {
               "anyOf": [
                  {
                     "type": "integer"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "For files that are split into multiple pieces (chunks) to keep the file size under a limit, this describes the chunk number (from 0) of a particular data product.",
               "fits_keyword": "CHUNK_ID",
               "title": "Chunk Id"
            },
            "batch_id": {
               "anyOf": [
                  {
                     "type": "integer"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Batch identifier for intermediate data products that are grouped/merged in batches. ",
               "fits_keyword": "BATCH_ID",
               "title": "Batch Id"
            },
            "calibration_service_id": {
               "anyOf": [
                  {
                     "type": "integer"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "ID assigned during data acquisition to link calibration products used when producing a data product.",
               "title": "Calibration Service Id"
            },
            "observing_night": {
               "anyOf": [
                  {
                     "format": "date",
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Date associated with the start of data taking.  It shall be created according to the date of the beginning of the observation night prior to the injection of data to DPPS. The date of the beginning of the observation night formally starts at 12:00 local civil time, is valid for the next 24 hours, and ends the next day at 12:00 local civil time.",
               "fits_keyword": "OBSNIGHT",
               "title": "Observing Night"
            },
            "sublevel_id": {
               "anyOf": [
                  {
                     "type": "string"
                  },
                  {
                     "type": "integer"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Used to distinguish partilly filled DL1 or DL2 products. Options are: \"IMAGES\", \"PARAMETERS\", \"GEOMETRY\", \"ENERGY\", \"GAMMANESS\".",
               "title": "Sublevel Id"
            },
            "target_id": {
               "anyOf": [
                  {
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Name of the target or ROI covered by this instance.",
               "title": "Target Id"
            },
            "region_id": {
               "anyOf": [
                  {
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Identifier for region-of-interest used for this instance.",
               "title": "Region Id"
            },
            "observing_period_id": {
               "anyOf": [
                  {
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "ID of the observing period.",
               "title": "Observing Period Id"
            },
            "lunar_cycle_id": {
               "anyOf": [
                  {
                     "type": "integer"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "ID of the lunar cycle associated with this instance. Combined with the observing_period_id, this gives a unique ID of the 'period' in which this data product was observed.",
               "title": "Lunar Cycle Id"
            },
            "facility_name": {
               "$ref": "#/$defs/FacilityName",
               "default": "CTAO",
               "description": "Observatory or facility used to collect the data. If the data are simulated, it is recommended to explicitly use the word 'simulated' in the name.",
               "fits_keyword": "TELESCOP",
               "ivoa_keyword": "facility_name"
            },
            "site_id": {
               "anyOf": [
                  {
                     "$ref": "#/$defs/SiteID"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "CTAO site associated with this instance.",
               "fits_keyword": "INSTRUME",
               "ivoa_keyword": "instrument_name"
            },
            "particle_pdgid": {
               "anyOf": [
                  {
                     "type": "integer"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "For simulated data products associated with a single point in simulation phase space, the primary particle ID in PDGID format, e.g. photon=22, electron=11.",
               "title": "Particle Pdgid"
            },
            "category": {
               "anyOf": [
                  {
                     "$ref": "#/$defs/DataProcessingCategory"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Which data processing pipeline category produced this product.  A=realtime, B=next-day, C=final/publication-quality."
            },
            "data_source": {
               "anyOf": [
                  {
                     "$ref": "#/$defs/ACADADataSource"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "ACADA Data Source, see ACADA-DPPS ICD.",
               "fits_keyword": "DATASRC"
            },
            "assembly_name": {
               "anyOf": [
                  {
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "For monitoring time-series, describes the assembly (group of monnitoring points) associated with the data product.",
               "title": "Assembly Name"
            }
         },
         "title": "InstanceIdentifier",
         "type": "object"
      },
      "Observation": {
         "additionalProperties": false,
         "description": "Context info for data products associated with an observation.",
         "properties": {
            "coverage": {
               "anyOf": [
                  {
                     "$ref": "#/$defs/Coverage"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Describes the spatial, temporal, spectral, and tracking coverage of a data product.  This information is for the discovery of data products, not to specify precise bounds for science analysis. Typically this information can only be attached to higher-level data products, e.g. DL3 and above, as the information may not be available before processing."
            },
            "location": {
               "anyOf": [
                  {
                     "$ref": "#/$defs/GeodeticEarthLocation"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Position on Earth of the observatory in geodetic coordinates."
            }
         },
         "title": "Observation",
         "type": "object"
      },
      "ObservatoryProcess": {
         "description": "Observatory operational Process.\n\nThese are the top-level processes",
         "enum": [
            "proposal_handling",
            "observation_planning",
            "acquisition",
            "simulation",
            "data_processing",
            "science_data_challenge",
            "science_analysis",
            "instrument",
            "user"
         ],
         "title": "ObservatoryProcess",
         "type": "string"
      },
      "ProductType": {
         "additionalProperties": false,
         "description": "Describes all possible types of CTAO data product.\n\nThis can also be used as a hierarchy for defining DataSets containing data\nof the same type within a higher-level collection like a data release.",
         "properties": {
            "level": {
               "$ref": "#/$defs/DataLevel",
               "description": "CTAO Data Level, see Top-Level Data Model. Options are: \"R0\", \"R1\", \"DL0\", \"DL1\", \"DL2\", \"DL3\", \"DL4\", \"DL5\", \"DL6\", \"SIM\", \"SciOps\".This should be the primary, aor highest level if more than one is included in the data product.",
               "fits_keyword": "DATALEVL"
            },
            "division": {
               "$ref": "#/$defs/DataDivision",
               "description": "Primary data type.  See the CTAO Top-level Data Model Specification for more info. If more than one are contained in the same data product, the most important one should be chosen, e.g. EVENT if all three are present. Options are: \"Event\", \"Monitoring\", \"Service\", \"Model\", \"Binned\", \"Catalog\".",
               "fits_keyword": "DATADIV"
            },
            "association": {
               "$ref": "#/$defs/DataAssociation",
               "description": "The main associated instrument or analysis part. Options are: \"Array\", \"Subarray\", \"Telescope\", \"Region\", \"Target\".",
               "fits_keyword": "DATAASSO"
            },
            "type": {
               "$ref": "#/$defs/DataType",
               "description": "The specific type of the product.  This is used to disambiguate products with different data models within the same DataLevel, DataDivision, and DataAssociation. If two data products have different contents or do not share the same instance identifiers, they should have different DataTypes.  This can also be used to set the IVOA ``data_product_type``, but may need some remapping to match IVOA terminology. Options are: \"AllSkyCamera\", \"BackgroundMap\", \"BackgroundIRFComponent\", \"AirShower\", \"AirShowerSim\", \"Calibration\", \"CalibrationSim\", \"MuonCandidate\", \"Ceilometer\", \"ContemporaryAtmosphere\", \"CountsMap\", \"EDispMap\", \"ExposureMap\", \"ExcessMap\", \"ExclusionMap\", \"FitSkyModel\", \"FluxMap\", \"Fram\", \"GRBCatalog\", \"GridIRF\", \"Lidar\", \"LightCurve\", \"LongTermSchedule\", \"MediumTermSchedule\", \"Observation\", \"ObservationSim\", \"ObservationCatalog\", \"PhaseMap\", \"Pointing\", \"PSFMap\", \"RecoModel\", \"SignificanceMap\", \"SkyModel\", \"SourceCatalog\", \"Spectrum\", \"TailoredIRF\", \"TelescopeTriggers\", \"Trigger\", \"LSTDRS4BaselineCalibration\", \"LSTDRS4SamplingCalibration\", \"LSTDRS4TimelapseCalibration\", \"NectarCamCalibration\", \"Weather\".",
               "fits_keyword": "DATATYPE"
            }
         },
         "required": [
            "level",
            "division",
            "association",
            "type"
         ],
         "title": "ProductType",
         "type": "object"
      },
      "SiteID": {
         "description": "CTAO sites.",
         "enum": [
            "SDMC-SUSS",
            "CTAO-North",
            "CTAO-South",
            "SDMC-DPPS",
            "HQ",
            "EXTERNAL"
         ],
         "title": "SiteID",
         "type": "string"
      },
      "Software": {
         "additionalProperties": false,
         "description": "Describes the software package that created the data product.",
         "properties": {
            "name": {
               "description": "Descriptive name of the software.",
               "examples": [
                  "datapipe"
               ],
               "fits_keyword": "SOFTWARE",
               "title": "Name",
               "type": "string"
            },
            "version": {
               "description": "Version number",
               "examples": [
                  "v1.0.1"
               ],
               "fits_keyword": "SOFTVER",
               "title": "Version",
               "type": "string"
            },
            "url": {
               "anyOf": [
                  {
                     "format": "uri",
                     "minLength": 1,
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "description": "URL or DOI linking to more detail.",
               "fits_keyword": "SOFTURL",
               "title": "Url"
            }
         },
         "required": [
            "name",
            "version",
            "url"
         ],
         "title": "Software",
         "type": "object"
      },
      "SpaceCoverage": {
         "additionalProperties": false,
         "description": "Defines spatial coverage of a data product.\n\nThe circle defined by ra, dec, field_of_view is used for the discoverability\nof data products by cone search, and should be considered a bounding circle\nif the true region covered is non-circular. The optional fields\nregion_of_interest and moc can be used for more precise definition of the\ncoverage.",
         "properties": {
            "frame": {
               "$ref": "#/$defs/SpatialFrame",
               "default": "ICRS",
               "description": "Standard equatorial coordinate system used for RA/Dec coordinates.  Note that for tablular data products, columns of coordinate values have their own standards in FITS and IVOA for specifying the frame, e.g. the ``RADESYSn`` column metadata attribute.",
               "fits_keyword": "RADESYS"
            },
            "ra": {
               "description": "ICRS Right ascension of the center of the region covered.",
               "fits_keyword": "RA_PNT",
               "ivoa_keyword": "s_ra",
               "title": "Ra",
               "type": "number",
               "ucd": "pos.eq.ra",
               "unit": "deg"
            },
            "dec": {
               "description": "ICRS Declination of the center of the region covered",
               "fits_keyword": "DEC_PNT",
               "ivoa_keyword": "s_dec",
               "title": "Dec",
               "type": "number",
               "ucd": "pos.eq.dec",
               "unit": "deg"
            },
            "field_of_view": {
               "description": "Approximate diameter (not radius) of the region covered by this data product if approximated as a circle on a sphere. For energy-dependent FOVs, a representative value should be chosen such that the data product can be identified in a cone search. Note that more accurate ROI shapes can be specified using the `region_of_interest` field, but `field_of_view` should always be filled because it provides a simple way to do a rough filtering.",
               "fits_keyword": "FOV",
               "ivoa_keyword": "s_fov",
               "title": "Field Of View",
               "type": "number",
               "ucd": "pos.spherical.r;instr.fov",
               "unit": "deg"
            },
            "region_of_interest": {
               "anyOf": [
                  {
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "IVOA ADQL-format region string describing the region of interest.",
               "examples": [
                  "Box ICRS 83.633083 22.0145 5 5",
                  "Circle ICRS 83.633083 22.0145 5",
                  "Polygon ICRS 81.133083 19.5145  86.133083 19.5145  86.133083 24.5145  81.133083 24.5145"
               ],
               "fits_keyword": "REGION",
               "ivoa_keyword": "s_region",
               "title": "Region Of Interest"
            },
            "moc": {
               "anyOf": [
                  {
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Multi-order coverage (MOC) string describing the region covered by the data product. https://www.ivoa.net/documents/MOC/",
               "examples": [
                  "4/2609 2611-2612  5/10350-10351 10362-10363 10433-10435 10440-10441 10443 10452 10456-10458   10468-10469  6/41398-41399 41442-41443 41446-41447 41464 41466-41467 41769-41771 41816-41818   41836 41840 41857 41860-41861 41863 41920"
               ],
               "title": "Moc"
            }
         },
         "required": [
            "ra",
            "dec",
            "field_of_view"
         ],
         "title": "SpaceCoverage",
         "type": "object"
      },
      "SpatialFrame": {
         "description": "Standard equatorial coordinate system used for RA/Dec coordinates.\n\nNote that for tablular data products, columns of coordinate values have\ntheir own standards in FITS and IVOA for specifying the frame, e.g. the\n``RADESYSn`` column metadata attribute.",
         "enum": [
            "ICRS"
         ],
         "title": "SpatialFrame",
         "type": "string"
      },
      "TimeCoverage": {
         "additionalProperties": false,
         "description": "Time bounds for discoverability of a data product with time coverage.",
         "properties": {
            "reference": {
               "anyOf": [
                  {
                     "$ref": "#/$defs/TimeReference"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Reference time for floating point time representations.  For timestamps represented as ISO time strings, this is not relevant."
            },
            "t_min": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "string"
                  },
                  {
                     "format": "date-time",
                     "type": "string"
                  }
               ],
               "description": "Start of time range of the data as either an ISO string or a float in the system defined by the time reference.",
               "fits_keyword": "TSTART",
               "title": "T Min"
            },
            "t_max": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "string"
                  },
                  {
                     "format": "date-time",
                     "type": "string"
                  }
               ],
               "description": "End of time range of the data, as either an ISO string or a float in the system defined by the time reference.",
               "fits_keyword": "TSTOP",
               "title": "T Max"
            }
         },
         "required": [
            "t_min",
            "t_max"
         ],
         "title": "TimeCoverage",
         "type": "object"
      },
      "TimeRefPos": {
         "description": "Spatial location at which the observation time is valid.\n\nFrom FITS standard v4",
         "enum": [
            "TOPOCENTER",
            "RELOCATABLE"
         ],
         "title": "TimeRefPos",
         "type": "string"
      },
      "TimeReference": {
         "additionalProperties": false,
         "description": "Reference time for floating point time representations.\n\nFor timestamps represented as ISO time strings, this is not relevant.",
         "properties": {
            "position": {
               "$ref": "#/$defs/TimeRefPos",
               "description": "Spatial location at which the observation time is valid.  From FITS standard v4 Options are: \"TOPOCENTER\", \"RELOCATABLE\".",
               "fits_keyword": "TREFPOS"
            },
            "time_mjd": {
               "description": "Reference time in MJD",
               "fits_keyword": "MJDREF",
               "title": "Time Mjd",
               "type": "number",
               "unit": "d"
            },
            "unit": {
               "default": "s",
               "fits_keyword": "TIMEUNIT",
               "title": "Unit",
               "type": "string"
            },
            "system": {
               "$ref": "#/$defs/TimeSystem",
               "default": "tai",
               "description": "The time scale of the time-related keywords.  For simulated data, use LOCAL. Options are: \"tt\", \"utc\", \"ut1\", \"tai\", \"gps\", \"local\".",
               "fits_keyword": "TIMESYS"
            },
            "resolution": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "time resolution in the time unit.",
               "fits_keyword": "TIMEDELT",
               "ivoa_keyword": "t_resolution",
               "title": "Resolution"
            }
         },
         "required": [
            "position",
            "time_mjd"
         ],
         "title": "TimeReference",
         "type": "object"
      },
      "TimeSystem": {
         "description": "The time scale of the time-related keywords.\n\nFor simulated data, use LOCAL.",
         "enum": [
            "tt",
            "utc",
            "ut1",
            "tai",
            "gps",
            "local"
         ],
         "title": "TimeSystem",
         "type": "string"
      },
      "TrackingCoverage": {
         "additionalProperties": false,
         "description": "Describes the coverage of ground-referenced observing parameters.\n\nThis is required only for data products where knowing the horizontal (ground\nbased alt/az) coverage is relevant. For equatorial tracking, elevation and\nazimuth vary with time. For fixed-horizontal tracking, ranges may collapse\nto single values.",
         "properties": {
            "elevation_min": {
               "description": "Minimum elevation above horizon of observation.",
               "fits_keyword": "ALT_MIN",
               "title": "Elevation Min",
               "type": "number",
               "ucd": "pos.az.alt;stat.min",
               "unit": "deg"
            },
            "elevation_max": {
               "description": "Maximum elevation above horizon of observation.",
               "fits_keyword": "ALT_MAX",
               "title": "Elevation Max",
               "type": "number",
               "ucd": "pos.az.alt;stat.max",
               "unit": "deg"
            },
            "azimuth_mean": {
               "description": "Mean azimith of observation.",
               "fits_keyword": "AZ_MEAN",
               "title": "Azimuth Mean",
               "type": "number",
               "ucd": "pos.az.azi;stat.mean",
               "unit": "deg"
            },
            "azimuth_range": {
               "description": "Full angular width of the observation in azimuth. Defines the horizontal coverage around `azimuth_mean`. The value should be capped at 360 deg, even if the telecope moves for larger than one rotation during the observation.",
               "fits_keyword": "AZ_RANGE",
               "maximum": 360.0,
               "minimum": 0.0,
               "title": "Azimuth Range",
               "type": "number",
               "ucd": "pos.az.azi;stat.interval",
               "unit": "deg"
            },
            "mode": {
               "$ref": "#/$defs/TrackingMode",
               "fits_keyword": "TRACKING"
            }
         },
         "required": [
            "elevation_min",
            "elevation_max",
            "azimuth_mean",
            "azimuth_range",
            "mode"
         ],
         "title": "TrackingCoverage",
         "type": "object"
      },
      "TrackingMode": {
         "description": "Coordinate system tracked by the nominal pointing position.",
         "enum": [
            "fixed_icrs",
            "fixed_horizontal",
            "other"
         ],
         "title": "TrackingMode",
         "type": "string"
      }
   },
   "additionalProperties": false,
   "required": [
      "description",
      "data",
      "instance",
      "curation",
      "model",
      "creation_time",
      "contact"
   ]
}

Config:
  • extra: str = forbid

Fields:
field acquisition: Acquisition | None = None#

Acquisition context metadata.

field activity: Activity | None = None#

The activity (software or human) that produced this data product.

field contact: Contact [Required]#

Contact information for this data product.

field creation_time: Annotated[Time, _AstropyTimePydanticTypeAnnotation] [Required]#

UTC Date-time the data product was created

Constraints:
  • __module__ = astropydantic.time

  • __firstlineno__ = 8

  • __get_pydantic_core_schema__ = <bound method _AstropyTimePydanticTypeAnnotation.__get_pydantic_core_schema__ of <class ‘astropydantic.time._AstropyTimePydanticTypeAnnotation’>>

  • __static_attributes__ = ()

  • __dict__ = {‘__module__’: ‘astropydantic.time’, ‘__firstlineno__’: 8, ‘__get_pydantic_core_schema__’: <classmethod(<function _AstropyTimePydanticTypeAnnotation.__get_pydantic_core_schema__ at 0x7fd59fd145e0>)>, ‘__static_attributes__’: (), ‘__dict__’: <attribute ‘__dict__’ of ‘_AstropyTimePydanticTypeAnnotation’ objects>, ‘__weakref__’: <attribute ‘__weakref__’ of ‘_AstropyTimePydanticTypeAnnotation’ objects>, ‘__doc__’: None}

  • __weakref__ = <attribute ‘__weakref__’ of ‘_AstropyTimePydanticTypeAnnotation’ objects>

field ctao_metadata_version: Literal['1.0.0rc3'] = '1.0.0rc3'#

CTAO DataProducts Metadata Version

field curation: Curation [Required]#

Information related to the release and usage of data products.

field data: ProductType [Required]#

Describes all possible types of CTAO data product. This can also be used as a hierarchy for defining DataSets containing data of the same type within a higher-level collection like a data release.

field description: str [Required]#

Human-readable description of this data product

field disclaimer: str | None = None#

Text describing e.g. the allowed usage of this data product, if specifics are required.

field instance: InstanceIdentifier [Required]#

Keys that uniquely identify an instance of an observed data product. Which of these is required depends on the ProductType.

field model: DataModel [Required]#

Describes the data model and/or format of the data product.

field observation: Observation | None = None#

Context info for data products associated with an observation.

pydantic model ProductType#

Bases: ModelBase

Describes all possible types of CTAO data product.

This can also be used as a hierarchy for defining DataSets containing data of the same type within a higher-level collection like a data release.

Show JSON schema
{
   "title": "ProductType",
   "description": "Describes all possible types of CTAO data product.\n\nThis can also be used as a hierarchy for defining DataSets containing data\nof the same type within a higher-level collection like a data release.",
   "type": "object",
   "properties": {
      "level": {
         "$ref": "#/$defs/DataLevel",
         "description": "CTAO Data Level, see Top-Level Data Model. Options are: \"R0\", \"R1\", \"DL0\", \"DL1\", \"DL2\", \"DL3\", \"DL4\", \"DL5\", \"DL6\", \"SIM\", \"SciOps\".This should be the primary, aor highest level if more than one is included in the data product.",
         "fits_keyword": "DATALEVL"
      },
      "division": {
         "$ref": "#/$defs/DataDivision",
         "description": "Primary data type.  See the CTAO Top-level Data Model Specification for more info. If more than one are contained in the same data product, the most important one should be chosen, e.g. EVENT if all three are present. Options are: \"Event\", \"Monitoring\", \"Service\", \"Model\", \"Binned\", \"Catalog\".",
         "fits_keyword": "DATADIV"
      },
      "association": {
         "$ref": "#/$defs/DataAssociation",
         "description": "The main associated instrument or analysis part. Options are: \"Array\", \"Subarray\", \"Telescope\", \"Region\", \"Target\".",
         "fits_keyword": "DATAASSO"
      },
      "type": {
         "$ref": "#/$defs/DataType",
         "description": "The specific type of the product.  This is used to disambiguate products with different data models within the same DataLevel, DataDivision, and DataAssociation. If two data products have different contents or do not share the same instance identifiers, they should have different DataTypes.  This can also be used to set the IVOA ``data_product_type``, but may need some remapping to match IVOA terminology. Options are: \"AllSkyCamera\", \"BackgroundMap\", \"BackgroundIRFComponent\", \"AirShower\", \"AirShowerSim\", \"Calibration\", \"CalibrationSim\", \"MuonCandidate\", \"Ceilometer\", \"ContemporaryAtmosphere\", \"CountsMap\", \"EDispMap\", \"ExposureMap\", \"ExcessMap\", \"ExclusionMap\", \"FitSkyModel\", \"FluxMap\", \"Fram\", \"GRBCatalog\", \"GridIRF\", \"Lidar\", \"LightCurve\", \"LongTermSchedule\", \"MediumTermSchedule\", \"Observation\", \"ObservationSim\", \"ObservationCatalog\", \"PhaseMap\", \"Pointing\", \"PSFMap\", \"RecoModel\", \"SignificanceMap\", \"SkyModel\", \"SourceCatalog\", \"Spectrum\", \"TailoredIRF\", \"TelescopeTriggers\", \"Trigger\", \"LSTDRS4BaselineCalibration\", \"LSTDRS4SamplingCalibration\", \"LSTDRS4TimelapseCalibration\", \"NectarCamCalibration\", \"Weather\".",
         "fits_keyword": "DATATYPE"
      }
   },
   "$defs": {
      "DataAssociation": {
         "description": "The main associated instrument or analysis part.",
         "enum": [
            "Array",
            "Subarray",
            "Telescope",
            "Region",
            "Target"
         ],
         "title": "DataAssociation",
         "type": "string"
      },
      "DataDivision": {
         "description": "Primary data type.\n\nSee the CTAO Top-level Data Model Specification for more info. If more than\none are contained in the same data product, the most important one should be\nchosen, e.g. EVENT if all three are present.",
         "enum": [
            "Event",
            "Monitoring",
            "Service",
            "Model",
            "Binned",
            "Catalog"
         ],
         "title": "DataDivision",
         "type": "string"
      },
      "DataLevel": {
         "description": "CTAO Data Level, see Top-Level Data Model.",
         "enum": [
            "R0",
            "R1",
            "DL0",
            "DL1",
            "DL2",
            "DL3",
            "DL4",
            "DL5",
            "DL6",
            "SIM",
            "SciOps"
         ],
         "title": "DataLevel",
         "type": "string"
      },
      "DataType": {
         "description": "The specific type of the product.\n\nThis is used to disambiguate products with different data models within the\nsame DataLevel, DataDivision, and DataAssociation. If two data products have\ndifferent contents or do not share the same instance identifiers, they\nshould have different DataTypes.\n\nThis can also be used to set the IVOA ``data_product_type``, but may need some\nremapping to match IVOA terminology.",
         "enum": [
            "AllSkyCamera",
            "BackgroundMap",
            "BackgroundIRFComponent",
            "AirShower",
            "AirShowerSim",
            "Calibration",
            "CalibrationSim",
            "MuonCandidate",
            "Ceilometer",
            "ContemporaryAtmosphere",
            "CountsMap",
            "EDispMap",
            "ExposureMap",
            "ExcessMap",
            "ExclusionMap",
            "FitSkyModel",
            "FluxMap",
            "Fram",
            "GRBCatalog",
            "GridIRF",
            "Lidar",
            "LightCurve",
            "LongTermSchedule",
            "MediumTermSchedule",
            "Observation",
            "ObservationSim",
            "ObservationCatalog",
            "PhaseMap",
            "Pointing",
            "PSFMap",
            "RecoModel",
            "SignificanceMap",
            "SkyModel",
            "SourceCatalog",
            "Spectrum",
            "TailoredIRF",
            "TelescopeTriggers",
            "Trigger",
            "LSTDRS4BaselineCalibration",
            "LSTDRS4SamplingCalibration",
            "LSTDRS4TimelapseCalibration",
            "NectarCamCalibration",
            "Weather"
         ],
         "title": "DataType",
         "type": "string"
      }
   },
   "additionalProperties": false,
   "required": [
      "level",
      "division",
      "association",
      "type"
   ]
}

Config:
  • extra: str = forbid

Fields:
field association: DataAssociation [Required]#

The main associated instrument or analysis part. Options are: “Array”, “Subarray”, “Telescope”, “Region”, “Target”.

Validated by:
  • _check_division

field division: DataDivision [Required]#

Primary data type. See the CTAO Top-level Data Model Specification for more info. If more than one are contained in the same data product, the most important one should be chosen, e.g. EVENT if all three are present. Options are: “Event”, “Monitoring”, “Service”, “Model”, “Binned”, “Catalog”.

Validated by:
  • _check_division

field level: DataLevel [Required]#

CTAO Data Level, see Top-Level Data Model. Options are: “R0”, “R1”, “DL0”, “DL1”, “DL2”, “DL3”, “DL4”, “DL5”, “DL6”, “SIM”, “SciOps”.This should be the primary, aor highest level if more than one is included in the data product.

Validated by:
  • _check_division

field type: DataType [Required]#

The specific type of the product. This is used to disambiguate products with different data models within the same DataLevel, DataDivision, and DataAssociation. If two data products have different contents or do not share the same instance identifiers, they should have different DataTypes. This can also be used to set the IVOA data_product_type, but may need some remapping to match IVOA terminology. Options are: “AllSkyCamera”, “BackgroundMap”, “BackgroundIRFComponent”, “AirShower”, “AirShowerSim”, “Calibration”, “CalibrationSim”, “MuonCandidate”, “Ceilometer”, “ContemporaryAtmosphere”, “CountsMap”, “EDispMap”, “ExposureMap”, “ExcessMap”, “ExclusionMap”, “FitSkyModel”, “FluxMap”, “Fram”, “GRBCatalog”, “GridIRF”, “Lidar”, “LightCurve”, “LongTermSchedule”, “MediumTermSchedule”, “Observation”, “ObservationSim”, “ObservationCatalog”, “PhaseMap”, “Pointing”, “PSFMap”, “RecoModel”, “SignificanceMap”, “SkyModel”, “SourceCatalog”, “Spectrum”, “TailoredIRF”, “TelescopeTriggers”, “Trigger”, “LSTDRS4BaselineCalibration”, “LSTDRS4SamplingCalibration”, “LSTDRS4TimelapseCalibration”, “NectarCamCalibration”, “Weather”.

Validated by:
  • _check_division

classmethod from_str(typestr: str) Self[source]#

Construct a ProductType from it’s string representation.

pydantic model Software#

Bases: ModelBase

Describes the software package that created the data product.

Show JSON schema
{
   "title": "Software",
   "description": "Describes the software package that created the data product.",
   "type": "object",
   "properties": {
      "name": {
         "description": "Descriptive name of the software.",
         "examples": [
            "datapipe"
         ],
         "fits_keyword": "SOFTWARE",
         "title": "Name",
         "type": "string"
      },
      "version": {
         "description": "Version number",
         "examples": [
            "v1.0.1"
         ],
         "fits_keyword": "SOFTVER",
         "title": "Version",
         "type": "string"
      },
      "url": {
         "anyOf": [
            {
               "format": "uri",
               "minLength": 1,
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "description": "URL or DOI linking to more detail.",
         "fits_keyword": "SOFTURL",
         "title": "Url"
      }
   },
   "additionalProperties": false,
   "required": [
      "name",
      "version",
      "url"
   ]
}

Config:
  • extra: str = forbid

Fields:
field name: str [Required]#

Descriptive name of the software.

field url: AnyUrl | None [Required]#

URL or DOI linking to more detail.

field version: str [Required]#

Version number

pydantic model SpaceCoverage#

Bases: ModelBase

Defines spatial coverage of a data product.

The circle defined by ra, dec, field_of_view is used for the discoverability of data products by cone search, and should be considered a bounding circle if the true region covered is non-circular. The optional fields region_of_interest and moc can be used for more precise definition of the coverage.

Show JSON schema
{
   "title": "SpaceCoverage",
   "description": "Defines spatial coverage of a data product.\n\nThe circle defined by ra, dec, field_of_view is used for the discoverability\nof data products by cone search, and should be considered a bounding circle\nif the true region covered is non-circular. The optional fields\nregion_of_interest and moc can be used for more precise definition of the\ncoverage.",
   "type": "object",
   "properties": {
      "frame": {
         "$ref": "#/$defs/SpatialFrame",
         "default": "ICRS",
         "description": "Standard equatorial coordinate system used for RA/Dec coordinates.  Note that for tablular data products, columns of coordinate values have their own standards in FITS and IVOA for specifying the frame, e.g. the ``RADESYSn`` column metadata attribute.",
         "fits_keyword": "RADESYS"
      },
      "ra": {
         "description": "ICRS Right ascension of the center of the region covered.",
         "fits_keyword": "RA_PNT",
         "ivoa_keyword": "s_ra",
         "title": "Ra",
         "type": "number",
         "ucd": "pos.eq.ra",
         "unit": "deg"
      },
      "dec": {
         "description": "ICRS Declination of the center of the region covered",
         "fits_keyword": "DEC_PNT",
         "ivoa_keyword": "s_dec",
         "title": "Dec",
         "type": "number",
         "ucd": "pos.eq.dec",
         "unit": "deg"
      },
      "field_of_view": {
         "description": "Approximate diameter (not radius) of the region covered by this data product if approximated as a circle on a sphere. For energy-dependent FOVs, a representative value should be chosen such that the data product can be identified in a cone search. Note that more accurate ROI shapes can be specified using the `region_of_interest` field, but `field_of_view` should always be filled because it provides a simple way to do a rough filtering.",
         "fits_keyword": "FOV",
         "ivoa_keyword": "s_fov",
         "title": "Field Of View",
         "type": "number",
         "ucd": "pos.spherical.r;instr.fov",
         "unit": "deg"
      },
      "region_of_interest": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "IVOA ADQL-format region string describing the region of interest.",
         "examples": [
            "Box ICRS 83.633083 22.0145 5 5",
            "Circle ICRS 83.633083 22.0145 5",
            "Polygon ICRS 81.133083 19.5145  86.133083 19.5145  86.133083 24.5145  81.133083 24.5145"
         ],
         "fits_keyword": "REGION",
         "ivoa_keyword": "s_region",
         "title": "Region Of Interest"
      },
      "moc": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Multi-order coverage (MOC) string describing the region covered by the data product. https://www.ivoa.net/documents/MOC/",
         "examples": [
            "4/2609 2611-2612  5/10350-10351 10362-10363 10433-10435 10440-10441 10443 10452 10456-10458   10468-10469  6/41398-41399 41442-41443 41446-41447 41464 41466-41467 41769-41771 41816-41818   41836 41840 41857 41860-41861 41863 41920"
         ],
         "title": "Moc"
      }
   },
   "$defs": {
      "SpatialFrame": {
         "description": "Standard equatorial coordinate system used for RA/Dec coordinates.\n\nNote that for tablular data products, columns of coordinate values have\ntheir own standards in FITS and IVOA for specifying the frame, e.g. the\n``RADESYSn`` column metadata attribute.",
         "enum": [
            "ICRS"
         ],
         "title": "SpatialFrame",
         "type": "string"
      }
   },
   "additionalProperties": false,
   "required": [
      "ra",
      "dec",
      "field_of_view"
   ]
}

Config:
  • extra: str = forbid

Fields:
field dec: float [Required]#

ICRS Declination of the center of the region covered

field field_of_view: float [Required]#

Approximate diameter (not radius) of the region covered by this data product if approximated as a circle on a sphere. For energy-dependent FOVs, a representative value should be chosen such that the data product can be identified in a cone search. Note that more accurate ROI shapes can be specified using the region_of_interest field, but field_of_view should always be filled because it provides a simple way to do a rough filtering.

field frame: SpatialFrame = SpatialFrame.ICRS#

Standard equatorial coordinate system used for RA/Dec coordinates. Note that for tablular data products, columns of coordinate values have their own standards in FITS and IVOA for specifying the frame, e.g. the RADESYSn column metadata attribute.

field moc: str | None = None#

Multi-order coverage (MOC) string describing the region covered by the data product. https://www.ivoa.net/documents/MOC/

field ra: float [Required]#

ICRS Right ascension of the center of the region covered.

field region_of_interest: str | None = None#

IVOA ADQL-format region string describing the region of interest.

class SpatialFrame(*values)#

Bases: StrEnum

Standard equatorial coordinate system used for RA/Dec coordinates.

Note that for tablular data products, columns of coordinate values have their own standards in FITS and IVOA for specifying the frame, e.g. the RADESYSn column metadata attribute.

ICRS = 'ICRS'#
pydantic model TimeCoverage#

Bases: ModelBase

Time bounds for discoverability of a data product with time coverage.

Show JSON schema
{
   "title": "TimeCoverage",
   "description": "Time bounds for discoverability of a data product with time coverage.",
   "type": "object",
   "properties": {
      "reference": {
         "anyOf": [
            {
               "$ref": "#/$defs/TimeReference"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "Reference time for floating point time representations.  For timestamps represented as ISO time strings, this is not relevant."
      },
      "t_min": {
         "anyOf": [
            {
               "type": "number"
            },
            {
               "type": "string"
            },
            {
               "format": "date-time",
               "type": "string"
            }
         ],
         "description": "Start of time range of the data as either an ISO string or a float in the system defined by the time reference.",
         "fits_keyword": "TSTART",
         "title": "T Min"
      },
      "t_max": {
         "anyOf": [
            {
               "type": "number"
            },
            {
               "type": "string"
            },
            {
               "format": "date-time",
               "type": "string"
            }
         ],
         "description": "End of time range of the data, as either an ISO string or a float in the system defined by the time reference.",
         "fits_keyword": "TSTOP",
         "title": "T Max"
      }
   },
   "$defs": {
      "TimeRefPos": {
         "description": "Spatial location at which the observation time is valid.\n\nFrom FITS standard v4",
         "enum": [
            "TOPOCENTER",
            "RELOCATABLE"
         ],
         "title": "TimeRefPos",
         "type": "string"
      },
      "TimeReference": {
         "additionalProperties": false,
         "description": "Reference time for floating point time representations.\n\nFor timestamps represented as ISO time strings, this is not relevant.",
         "properties": {
            "position": {
               "$ref": "#/$defs/TimeRefPos",
               "description": "Spatial location at which the observation time is valid.  From FITS standard v4 Options are: \"TOPOCENTER\", \"RELOCATABLE\".",
               "fits_keyword": "TREFPOS"
            },
            "time_mjd": {
               "description": "Reference time in MJD",
               "fits_keyword": "MJDREF",
               "title": "Time Mjd",
               "type": "number",
               "unit": "d"
            },
            "unit": {
               "default": "s",
               "fits_keyword": "TIMEUNIT",
               "title": "Unit",
               "type": "string"
            },
            "system": {
               "$ref": "#/$defs/TimeSystem",
               "default": "tai",
               "description": "The time scale of the time-related keywords.  For simulated data, use LOCAL. Options are: \"tt\", \"utc\", \"ut1\", \"tai\", \"gps\", \"local\".",
               "fits_keyword": "TIMESYS"
            },
            "resolution": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "time resolution in the time unit.",
               "fits_keyword": "TIMEDELT",
               "ivoa_keyword": "t_resolution",
               "title": "Resolution"
            }
         },
         "required": [
            "position",
            "time_mjd"
         ],
         "title": "TimeReference",
         "type": "object"
      },
      "TimeSystem": {
         "description": "The time scale of the time-related keywords.\n\nFor simulated data, use LOCAL.",
         "enum": [
            "tt",
            "utc",
            "ut1",
            "tai",
            "gps",
            "local"
         ],
         "title": "TimeSystem",
         "type": "string"
      }
   },
   "additionalProperties": false,
   "required": [
      "t_min",
      "t_max"
   ]
}

Config:
  • extra: str = forbid

Fields:
field reference: TimeReference | None = None#

Reference time for floating point time representations. For timestamps represented as ISO time strings, this is not relevant.

Validated by:
  • _check_if_reference_is_needed

field t_max: float | Annotated[Time, _AstropyTimePydanticTypeAnnotation] [Required]#

End of time range of the data, as either an ISO string or a float in the system defined by the time reference.

Validated by:
  • _check_if_reference_is_needed

field t_min: float | Annotated[Time, _AstropyTimePydanticTypeAnnotation] [Required]#

Start of time range of the data as either an ISO string or a float in the system defined by the time reference.

Validated by:
  • _check_if_reference_is_needed

class TimeRefPos(*values)#

Bases: StrEnum

Spatial location at which the observation time is valid.

From FITS standard v4

RELOCATABLE = 'RELOCATABLE'#
TOPOCENTER = 'TOPOCENTER'#
pydantic model TimeReference#

Bases: ModelBase

Reference time for floating point time representations.

For timestamps represented as ISO time strings, this is not relevant.

Show JSON schema
{
   "title": "TimeReference",
   "description": "Reference time for floating point time representations.\n\nFor timestamps represented as ISO time strings, this is not relevant.",
   "type": "object",
   "properties": {
      "position": {
         "$ref": "#/$defs/TimeRefPos",
         "description": "Spatial location at which the observation time is valid.  From FITS standard v4 Options are: \"TOPOCENTER\", \"RELOCATABLE\".",
         "fits_keyword": "TREFPOS"
      },
      "time_mjd": {
         "description": "Reference time in MJD",
         "fits_keyword": "MJDREF",
         "title": "Time Mjd",
         "type": "number",
         "unit": "d"
      },
      "unit": {
         "default": "s",
         "fits_keyword": "TIMEUNIT",
         "title": "Unit",
         "type": "string"
      },
      "system": {
         "$ref": "#/$defs/TimeSystem",
         "default": "tai",
         "description": "The time scale of the time-related keywords.  For simulated data, use LOCAL. Options are: \"tt\", \"utc\", \"ut1\", \"tai\", \"gps\", \"local\".",
         "fits_keyword": "TIMESYS"
      },
      "resolution": {
         "anyOf": [
            {
               "type": "number"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "description": "time resolution in the time unit.",
         "fits_keyword": "TIMEDELT",
         "ivoa_keyword": "t_resolution",
         "title": "Resolution"
      }
   },
   "$defs": {
      "TimeRefPos": {
         "description": "Spatial location at which the observation time is valid.\n\nFrom FITS standard v4",
         "enum": [
            "TOPOCENTER",
            "RELOCATABLE"
         ],
         "title": "TimeRefPos",
         "type": "string"
      },
      "TimeSystem": {
         "description": "The time scale of the time-related keywords.\n\nFor simulated data, use LOCAL.",
         "enum": [
            "tt",
            "utc",
            "ut1",
            "tai",
            "gps",
            "local"
         ],
         "title": "TimeSystem",
         "type": "string"
      }
   },
   "additionalProperties": false,
   "required": [
      "position",
      "time_mjd"
   ]
}

Config:
  • extra: str = forbid

Fields:
field position: TimeRefPos [Required]#

Spatial location at which the observation time is valid. From FITS standard v4 Options are: “TOPOCENTER”, “RELOCATABLE”.

field resolution: float | None = None#

time resolution in the time unit.

field system: TimeSystem = TimeSystem.TAI#

The time scale of the time-related keywords. For simulated data, use LOCAL. Options are: “tt”, “utc”, “ut1”, “tai”, “gps”, “local”.

field time_mjd: float [Required]#

Reference time in MJD

field unit: AstroPydanticUnit = 's'#
class TimeSystem(*values)#

Bases: StrEnum

The time scale of the time-related keywords.

For simulated data, use LOCAL.

GPS = 'gps'#
LOCAL = 'local'#
TAI = 'tai'#
TT = 'tt'#
UT1 = 'ut1'#
UTC = 'utc'#
pydantic model TrackingCoverage#

Bases: ModelBase

Describes the coverage of ground-referenced observing parameters.

This is required only for data products where knowing the horizontal (ground based alt/az) coverage is relevant. For equatorial tracking, elevation and azimuth vary with time. For fixed-horizontal tracking, ranges may collapse to single values.

Show JSON schema
{
   "title": "TrackingCoverage",
   "description": "Describes the coverage of ground-referenced observing parameters.\n\nThis is required only for data products where knowing the horizontal (ground\nbased alt/az) coverage is relevant. For equatorial tracking, elevation and\nazimuth vary with time. For fixed-horizontal tracking, ranges may collapse\nto single values.",
   "type": "object",
   "properties": {
      "elevation_min": {
         "description": "Minimum elevation above horizon of observation.",
         "fits_keyword": "ALT_MIN",
         "title": "Elevation Min",
         "type": "number",
         "ucd": "pos.az.alt;stat.min",
         "unit": "deg"
      },
      "elevation_max": {
         "description": "Maximum elevation above horizon of observation.",
         "fits_keyword": "ALT_MAX",
         "title": "Elevation Max",
         "type": "number",
         "ucd": "pos.az.alt;stat.max",
         "unit": "deg"
      },
      "azimuth_mean": {
         "description": "Mean azimith of observation.",
         "fits_keyword": "AZ_MEAN",
         "title": "Azimuth Mean",
         "type": "number",
         "ucd": "pos.az.azi;stat.mean",
         "unit": "deg"
      },
      "azimuth_range": {
         "description": "Full angular width of the observation in azimuth. Defines the horizontal coverage around `azimuth_mean`. The value should be capped at 360 deg, even if the telecope moves for larger than one rotation during the observation.",
         "fits_keyword": "AZ_RANGE",
         "maximum": 360.0,
         "minimum": 0.0,
         "title": "Azimuth Range",
         "type": "number",
         "ucd": "pos.az.azi;stat.interval",
         "unit": "deg"
      },
      "mode": {
         "$ref": "#/$defs/TrackingMode",
         "fits_keyword": "TRACKING"
      }
   },
   "$defs": {
      "TrackingMode": {
         "description": "Coordinate system tracked by the nominal pointing position.",
         "enum": [
            "fixed_icrs",
            "fixed_horizontal",
            "other"
         ],
         "title": "TrackingMode",
         "type": "string"
      }
   },
   "additionalProperties": false,
   "required": [
      "elevation_min",
      "elevation_max",
      "azimuth_mean",
      "azimuth_range",
      "mode"
   ]
}

Config:
  • extra: str = forbid

Fields:
field azimuth_mean: float [Required]#

Mean azimith of observation.

field azimuth_range: float [Required]#

Full angular width of the observation in azimuth. Defines the horizontal coverage around azimuth_mean. The value should be capped at 360 deg, even if the telecope moves for larger than one rotation during the observation.

Constraints:
  • ge = 0.0

  • le = 360.0

field elevation_max: float [Required]#

Maximum elevation above horizon of observation.

field elevation_min: float [Required]#

Minimum elevation above horizon of observation.

field mode: TrackingMode [Required]#

Coordinate system tracked by the nominal pointing position.