Source code for gammapy.datasets.metadata
from typing import ClassVar, Literal, Optional, Union
import numpy as np
from astropy.coordinates import SkyCoord
from pydantic import ConfigDict
from gammapy.utils.metadata import (
METADATA_FITS_KEYS,
CreatorMetaData,
MetaData,
ObsInfoMetaData,
PointingInfoMetaData,
)
__all__ = ["MapDatasetMetaData"]
MapDataset_METADATA_FITS_KEYS = {
"MapDataset": {
"event_types": "EVT_TYPE",
"optional": "OPTIONAL",
},
}
METADATA_FITS_KEYS.update(MapDataset_METADATA_FITS_KEYS)
[docs]class MapDatasetMetaData(MetaData):
"""Metadata containing information about the Dataset.
Parameters
----------
creation : `~gammapy.utils.CreatorMetaData`, optional
The creation metadata.
obs_info : list of `~gammapy.utils.ObsInfoMetaData`
info about the observation.
event_types : list of int or str
Event types used in analysis.
pointing: list of `~gammapy.utils.PointingInfoMetaData`
Telescope pointing directions.
optional : dict
Additional optional metadata.
"""
model_config = ConfigDict(coerce_numbers_to_str=True)
_tag: ClassVar[Literal["MapDataset"]] = "MapDataset"
creation: Optional[CreatorMetaData] = CreatorMetaData()
obs_info: Optional[Union[ObsInfoMetaData, list[ObsInfoMetaData]]] = None
pointing: Optional[Union[PointingInfoMetaData, list[PointingInfoMetaData]]] = None
event_type: Optional[Union[str, list[str]]] = None
optional: Optional[dict] = None
[docs] def stack(self, other):
kwargs = {}
kwargs["creation"] = self.creation
return self.__class__(**kwargs)
@classmethod
def _from_meta_table(cls, table):
"""Create MapDatasetMetaData from MapDataset.meta_table
Parameters
----------
table: `~astropy.table.Table`
"""
kwargs = {}
kwargs["creation"] = CreatorMetaData()
telescope = np.atleast_1d(table["TELESCOP"].data[0])
obs_id = np.atleast_1d(table["OBS_ID"].data[0].astype(str))
observation_mode = np.atleast_1d(table["OBS_MODE"].data[0])
obs_info = []
for i in range(len(obs_id)):
obs_meta = ObsInfoMetaData(
**{
"telescope": telescope[i],
"obs_id": obs_id[i],
"observation_mode": observation_mode[i],
}
)
obs_info.append(obs_meta)
kwargs["obs_info"] = obs_info
pointing_radec, pointing_altaz = None, None
if "RA_PNT" in table.colnames:
pointing_radec = SkyCoord(
ra=table["RA_PNT"].data[0], dec=table["DEC_PNT"].data[0], unit="deg"
)
if "ALT_PNT" in table.colnames:
pointing_altaz = SkyCoord(
alt=table["ALT_PNT"].data[0],
az=table["AZ_PNT"].data[0],
unit="deg",
frame="altaz",
)
pointings = []
for pra, paz in zip(
np.atleast_1d(pointing_radec), np.atleast_1d(pointing_altaz)
):
pointings.append(PointingInfoMetaData(radec_mean=pra, altaz_mean=paz))
kwargs["pointing"] = pointings
return cls(**kwargs)