Source code for gammapy.data.metadata
# Licensed under a 3-clause BSD style license - see LICENSE.rst
from typing import ClassVar, Literal, Optional
from pydantic import Field
from gammapy.utils.fits import earth_location_from_dict
from gammapy.utils.metadata import (
METADATA_FITS_KEYS,
CreatorMetaData,
MetaData,
ObsInfoMetaData,
PointingInfoMetaData,
TargetMetaData,
TimeInfoMetaData,
)
from gammapy.utils.types import EarthLocationType, TimeType
__all__ = ["ObservationMetaData", "GTIMetaData", "EventListMetaData"]
OBSERVATION_METADATA_FITS_KEYS = {
"location": {
"input": lambda v: earth_location_from_dict(v),
"output": lambda v: {
"GEOLON": v.lon.deg,
"GEOLAT": v.lat.deg,
"ALTITUDE": v.height.to_value("m"),
},
},
"deadtime_fraction": {
"input": lambda v: 1 - v["DEADC"],
"output": lambda v: {"DEADC": 1 - v},
},
}
METADATA_FITS_KEYS["observation"] = OBSERVATION_METADATA_FITS_KEYS
EVENTLIST_METADATA_FITS_KEYS = {
"event_class": "EV_CLASS",
}
METADATA_FITS_KEYS["eventlist"] = EVENTLIST_METADATA_FITS_KEYS
[docs]
class ObservationMetaData(MetaData):
"""Metadata containing information about the Observation.
Parameters
----------
obs_info : `~gammapy.utils.ObsInfoMetaData`
The general observation information.
pointing : `~gammapy.utils.PointingInfoMetaData`
The pointing metadata.
target : `~gammapy.utils.TargetMetaData`
The target metadata.
creation : `~gammapy.utils.CreatorMetaData`
The creation metadata.
location : `~astropy.coordinates.EarthLocation` or str, optional
The observatory location.
deadtime_fraction : float
The observation deadtime fraction. Default is 0.
optional : dict, optional
Additional optional metadata.
"""
_tag: ClassVar[Literal["observation"]] = "observation"
obs_info: Optional[ObsInfoMetaData] = None
pointing: Optional[PointingInfoMetaData] = None
target: Optional[TargetMetaData] = None
location: Optional[EarthLocationType] = None
deadtime_fraction: float = Field(0.0, ge=0, le=1.0)
time_info: Optional[TimeInfoMetaData] = None
creation: Optional[CreatorMetaData] = None
optional: Optional[dict] = None
[docs]
@classmethod
def from_header(cls, header, format="gadf"):
"""Create and fill the observation metadata from the event list metadata.
Parameters
----------
header : dict
Input FITS header.
format : str
The header data format. Default is gadf.
"""
meta = super().from_header(header, format)
meta.creation = CreatorMetaData()
# Include additional gadf keywords not specified as ObservationMetaData attributes
optional_keywords = [
"OBSERVER",
"EV_CLASS",
"TELAPSE",
"TELLIST",
"N_TELS",
"TASSIGN",
"DST_VER",
"ANA_VER",
"CAL_VER",
"CONV_DEP",
"CONV_RA",
"CONV_DEC",
"TRGRATE",
"ZTRGRATE",
"MUONEFF",
"BROKPIX",
"AIRTEMP",
"PRESSURE",
"RELHUM",
"NSBLEVEL",
"CREATOR",
"HDUVERS",
]
optional = dict()
for key in optional_keywords:
if key in header.keys():
optional[key] = header[key]
meta.optional = optional
return meta
class GTIMetaData(MetaData):
"""Metadata containing information about the GTI.
Parameters
----------
reference_time : Time, str
The GTI reference time.
"""
_tag: ClassVar[Literal["GTI"]] = "GTI"
reference_time: Optional[TimeType] = None
def from_header(cls, header, format="gadf"):
meta = super().from_header(header, format)
return meta
[docs]
class EventListMetaData(MetaData):
"""
Metadata containing information about the EventList.
Parameters
----------
event_class : str
The event class metadata.
creation : `~gammapy.utils.metadata.CreatorMetaData`
The creation metadata.
"""
_tag: ClassVar[Literal["EventList"]] = "eventlist"
event_class: Optional[str] = None
creation: Optional[CreatorMetaData] = None
optional: Optional[dict] = None
[docs]
@classmethod
def from_header(cls, header, format="gadf"):
meta = super().from_header(header, format)
# Include additional gadf keywords
optional_keywords = [
"DST_VER",
"ANA_VER",
"CAL_VER",
]
optional = dict()
for key in optional_keywords:
if key in header.keys():
optional[key] = header[key]
meta.optional = optional
return meta