Source code for gammapy.data.metadata

# Licensed under a 3-clause BSD style license - see LICENSE.rst
from typing import Optional, Union
from astropy.coordinates import EarthLocation
from astropy.time import Time
from pydantic import Field, validator
from gammapy.utils.fits import earth_location_from_dict
from gammapy.utils.metadata import (
    METADATA_FITS_KEYS,
    CreatorMetaData,
    MetaData,
    ObsInfoMetaData,
    PointingInfoMetaData,
    TargetMetaData,
)

__all__ = ["ObservationMetaData"]

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


[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. time_start : `~astropy.time.Time` or str The observation start time. time_stop : `~astropy.time.Time` or str The observation stop time. reference_time : `~astropy.time.Time` or str The observation reference time. optional : dict, optional Additional optional metadata. """ _tag = "observation" obs_info: Optional[ObsInfoMetaData] pointing: Optional[PointingInfoMetaData] target: Optional[TargetMetaData] location: Optional[Union[EarthLocation, str]] deadtime_fraction: float = Field(0.0, ge=0, le=1.0) time_start: Optional[Union[Time, str]] time_stop: Optional[Union[Time, str]] reference_time: Optional[Union[Time, str]] creation: Optional[CreatorMetaData] optional: Optional[dict]
[docs] @validator("location") def validate_location(cls, v): """Validate the location value.""" from gammapy.data import observatory_locations if isinstance(v, str) and v in observatory_locations.keys(): return observatory_locations[v] elif v is None or isinstance(v, EarthLocation): return v else: raise ValueError("Incorrect location value")
[docs] @validator("time_start", "time_stop", "reference_time") def validate_time(cls, v): """Validate the time value.""" if isinstance(v, str): return Time(v) elif isinstance(v, Time) or v is None: # check size? return v else: raise ValueError("Incorrect time input value.")
[docs] @classmethod def from_header(cls, header, format="gadf"): meta = super(ObservationMetaData, cls).from_header(header, format) meta.creation = CreatorMetaData.from_default() # 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", ] optional = dict() for key in optional_keywords: if key in header.keys(): optional[key] = header[key] meta.optional = optional return meta