def __init__( self, energy_lo, energy_hi, offset_lo, offset_hi, data, meta=None, interp_kwargs=None, ): if interp_kwargs is None: interp_kwargs = self.default_interp_kwargs e_edges = edges_from_lo_hi(energy_lo, energy_hi) energy_axis = MapAxis.from_edges(e_edges, interp="log", name="energy_true") # TODO: for some reason the H.E.S.S. DL3 files contain the same values for offset_hi and offset_lo if np.allclose(offset_lo.to_value("deg"), offset_hi.to_value("deg")): offset_axis = MapAxis.from_nodes(offset_lo, interp="lin", name="offset") else: offset_edges = edges_from_lo_hi(offset_lo, offset_hi) offset_axis = MapAxis.from_edges(offset_edges, interp="lin", name="offset") self.data = NDDataArray(axes=[energy_axis, offset_axis], data=data, interp_kwargs=interp_kwargs) self.meta = meta or {}
def __init__( self, e_true_lo, e_true_hi, migra_lo, migra_hi, offset_lo, offset_hi, data, interp_kwargs=None, meta=None, ): if interp_kwargs is None: interp_kwargs = self.default_interp_kwargs e_true_edges = edges_from_lo_hi(e_true_lo, e_true_hi) e_true_axis = MapAxis.from_edges(e_true_edges, interp="log", name="e_true") migra_edges = edges_from_lo_hi(migra_lo, migra_hi) migra_axis = MapAxis.from_edges( migra_edges, interp="log", name="migra", unit="" ) # TODO: for some reason the H.E.S.S. DL3 files contain the same values for offset_hi and offset_lo if np.allclose(offset_lo.to_value("deg"), offset_hi.to_value("deg")): offset_axis = MapAxis.from_nodes(offset_lo, interp="lin", name="offset") else: offset_edges = edges_from_lo_hi(offset_lo, offset_hi) offset_axis = MapAxis.from_edges(offset_edges, interp="lin", name="offset") axes = [e_true_axis, migra_axis, offset_axis] self.data = NDDataArray(axes=axes, data=data, interp_kwargs=interp_kwargs) self.meta = OrderedDict(meta) if meta else OrderedDict()
def __init__( self, energy_lo, energy_hi, offset_lo, offset_hi, data, meta=None, interp_kwargs=None, ): if interp_kwargs is None: interp_kwargs = self.default_interp_kwargs e_edges = edges_from_lo_hi(energy_lo, energy_hi) energy_axis = MapAxis.from_edges(e_edges, interp="log", name="energy") offset_edges = edges_from_lo_hi(offset_lo, offset_hi) offset_axis = MapAxis.from_edges(offset_edges, interp="lin", name="offset") self.data = NDDataArray(axes=[energy_axis, offset_axis], data=data, interp_kwargs=interp_kwargs) self.meta = meta or {}
def __init__( self, e_true_lo, e_true_hi, e_reco_lo, e_reco_hi, data, interp_kwargs=None, meta=None, ): if interp_kwargs is None: interp_kwargs = self.default_interp_kwargs e_true_edges = edges_from_lo_hi(e_true_lo, e_true_hi) e_true_axis = MapAxis.from_edges(e_true_edges, interp="log", name="e_true") e_reco_edges = edges_from_lo_hi(e_reco_lo, e_reco_hi) e_reco_axis = MapAxis.from_edges(e_reco_edges, interp="log", name="e_reco") self.data = NDDataArray(axes=[e_true_axis, e_reco_axis], data=data, interp_kwargs=interp_kwargs) self.meta = meta or {}
def __init__( self, energy_lo, energy_hi, fov_lon_lo, fov_lon_hi, fov_lat_lo, fov_lat_hi, data, meta=None, interp_kwargs=None, ): if interp_kwargs is None: interp_kwargs = self.default_interp_kwargs e_edges = edges_from_lo_hi(energy_lo, energy_hi) energy_axis = MapAxis.from_edges(e_edges, interp="log", name="energy") fov_lon_edges = edges_from_lo_hi(fov_lon_lo, fov_lon_hi) fov_lon_axis = MapAxis.from_edges(fov_lon_edges, interp="lin", name="fov_lon") fov_lat_edges = edges_from_lo_hi(fov_lat_lo, fov_lat_hi) fov_lat_axis = MapAxis.from_edges(fov_lat_edges, interp="lin", name="fov_lat") self.data = NDDataArray( axes=[energy_axis, fov_lon_axis, fov_lat_axis], data=data, interp_kwargs=interp_kwargs, ) self.meta = meta or {}
def __init__(self, rad_axis, data, interp_kwargs=None): interp_kwargs = interp_kwargs or {} rad_axis.assert_name("rad") self.data = NDDataArray(axes=[rad_axis], data=u.Quantity(data).to("sr^-1"), interp_kwargs=interp_kwargs)
def __init__(self, energy_axis_true, data, meta=None): interp_kwargs = {"extrapolate": False, "bounds_error": False} self.data = NDDataArray(axes=[energy_axis_true], data=data, interp_kwargs=interp_kwargs) self.data.axes.assert_names(["energy_true"]) self.meta = meta or {}
def __init__(self, energy_lo, energy_hi, data): axes = [ BinnedDataAxis(energy_lo, energy_hi, interpolation_mode='log', name='energy'), ] self.data = NDDataArray(axes=axes, data=data)
def __init__( self, e_true, e_reco, data, interp_kwargs=None, meta=None, ): if interp_kwargs is None: interp_kwargs = self.default_interp_kwargs self.data = NDDataArray( axes=[e_true, e_reco], data=data, interp_kwargs=interp_kwargs ) self.meta = meta or {}
def __init__( self, energy_axis_true, energy_axis, data, interp_kwargs=None, meta=None, ): if interp_kwargs is None: interp_kwargs = self.default_interp_kwargs self.data = NDDataArray( axes=[energy_axis_true, energy_axis], data=data, interp_kwargs=interp_kwargs ) self.meta = meta or {}
def __init__(self, energy_lo, energy_hi, data, meta=None): e_edges = edges_from_lo_hi(energy_lo, energy_hi) energy_axis = MapAxis.from_edges(e_edges, interp="log", name="energy") interp_kwargs = {"extrapolate": False, "bounds_error": False} self.data = NDDataArray(axes=[energy_axis], data=data, interp_kwargs=interp_kwargs) self.meta = meta or {}
def __init__( self, energy_axis, offset_axis, data, meta=None, interp_kwargs=None, ): if interp_kwargs is None: interp_kwargs = self.default_interp_kwargs self.data = NDDataArray( axes=[energy_axis, offset_axis], data=data, interp_kwargs=interp_kwargs ) self.data.axes.assert_names(["energy", "offset"]) self.meta = meta or {}
def __init__( self, energy_axis, offset_axis, data, meta=None, interp_kwargs=None, ): if interp_kwargs is None: interp_kwargs = self.default_interp_kwargs assert offset_axis.name == "offset" self.data = NDDataArray( axes=[energy_axis, offset_axis], data=data, interp_kwargs=interp_kwargs ) self.meta = meta or {}
def load_irf(self): filename = os.path.join(self.outdir, "irf.fits.gz") with fits.open(filename, memmap=False) as hdulist: aeff = EffectiveAreaTable2D.from_hdulist(hdulist=hdulist) edisp = EnergyDispersion2D.read(filename, hdu="ENERGY DISPERSION") bkg_fits_table = hdulist["BACKGROUND"] bkg_table = Table.read(bkg_fits_table) energy_lo = bkg_table["ENERG_LO"].quantity energy_hi = bkg_table["ENERG_HI"].quantity bkg = bkg_table["BGD"].quantity axes = [ BinnedDataAxis(energy_lo, energy_hi, interpolation_mode="log", name="energy") ] bkg = BkgData(data=NDDataArray(axes=axes, data=bkg)) # Create rmf with appropriate dimensions (e_reco->bkg, e_true->area) e_reco_min = bkg.energy.lo[0] e_reco_max = bkg.energy.hi[-1] e_reco_bin = bkg.energy.nbins e_reco_axis = EnergyBounds.equal_log_spacing(e_reco_min, e_reco_max, e_reco_bin, "TeV") e_true_min = aeff.data.axes[0].lo[0] e_true_max = aeff.data.axes[0].hi[-1] e_true_bin = len(aeff.data.axes[0].bins) - 1 e_true_axis = EnergyBounds.equal_log_spacing(e_true_min, e_true_max, e_true_bin, "TeV") # Fake offset... rmf = edisp.to_energy_dispersion(offset=0.5 * u.deg, e_reco=e_reco_axis, e_true=e_true_axis) # This is required because in gammapy v0.8 # gammapy.spectrum.utils.integrate_model # calls the attribute aeff.energy which is an attribute of # EffectiveAreaTable and not of EffectiveAreaTable2D # WARNING the angle is not important, but only because we started with # on-axis data! TO UPDATE aeff = aeff.to_effective_area_table(Angle("1d")) self.irf = Irf(bkg=bkg, aeff=aeff, rmf=rmf)
def __init__( self, energy_axis_true, offset_axis, rad_axis, data, meta=None, interp_kwargs=None, ): interp_kwargs = interp_kwargs or {} axes = MapAxes([energy_axis_true, offset_axis, rad_axis]) axes.assert_names(["energy_true", "offset", "rad"]) self.data = NDDataArray(axes=axes, data=u.Quantity(data).to("sr^-1"), interp_kwargs=interp_kwargs) self.meta = meta or {}
def __init__( self, energy_axis_true, rad_axis, exposure=None, data=None, interp_kwargs=None, ): interp_kwargs = interp_kwargs or {} axes = MapAxes([energy_axis_true, rad_axis]) axes.assert_names(["energy_true", "rad"]) self.data = NDDataArray(axes=axes, data=u.Quantity(data).to("sr^-1"), interp_kwargs=interp_kwargs) if exposure is None: self.exposure = u.Quantity(np.ones(self.energy_axis_true.nbin), "cm^2 s") else: self.exposure = u.Quantity(exposure).to("cm^2 s")
def load_irf(self): filename = os.path.join(self.outdir, 'irf.fits.gz') with fits.open(filename, memmap=False) as hdulist: aeff = EffectiveAreaTable.from_hdulist(hdulist=hdulist) edisp = EnergyDispersion2D.read(filename, hdu="ENERGY DISPERSION") bkg_fits_table = hdulist["BACKGROUND"] bkg_table = Table.read(bkg_fits_table) energy_lo = bkg_table["ENERG_LO"].quantity energy_hi = bkg_table["ENERG_HI"].quantity bkg = bkg_table["BGD"].quantity axes = [ BinnedDataAxis( energy_lo, energy_hi, interpolation_mode="log", name="energy" ) ] bkg = BkgData(data=NDDataArray(axes=axes, data=bkg)) # Create rmf with appropriate dimensions (e_reco->bkg, e_true->area) e_reco_min = bkg.energy.lo[0] e_reco_max = bkg.energy.hi[-1] e_reco_bin = bkg.energy.nbins e_reco_axis = EnergyBounds.equal_log_spacing( e_reco_min, e_reco_max, e_reco_bin, "TeV" ) e_true_min = aeff.energy.lo[0] e_true_max = aeff.energy.hi[-1] e_true_bin = aeff.energy.nbins e_true_axis = EnergyBounds.equal_log_spacing( e_true_min, e_true_max, e_true_bin, "TeV" ) # Fake offset... rmf = edisp.to_energy_dispersion( offset=0.5 * u.deg, e_reco=e_reco_axis, e_true=e_true_axis ) self.irf = Irf(bkg=bkg, aeff=aeff, rmf=rmf)
def nddata_1d(axis_x): return NDDataArray( axes=[axis_x], data=[1, -1, 2], interp_kwargs=dict(bounds_error=False, fill_value=None), )
def nddata_2d(axis_energy, axis_offset): return NDDataArray( axes=[axis_energy, axis_offset], data=np.arange(8).reshape(2, 4) * u.cm * u.cm, interp_kwargs=dict(bounds_error=False, fill_value=None), )
from gammapy.utils.energy import Energy, EnergyBounds import numpy as np import astropy.units as u # ## 1D example # # Let's start with a simple example. A one dimensional array storing an exposure in ``cm-2 s-1`` as a function of energy. The energy axis is log spaced and thus also the interpolation shall take place in log. # In[ ]: energies = Energy.equal_log_spacing(10, 100, 10, unit=u.TeV) x_axis = DataAxis(energies, name="energy", interpolation_mode="log") data = np.arange(20, 0, -2) / u.cm ** 2 / u.s nddata = NDDataArray(axes=[x_axis], data=data) print(nddata) print(nddata.axis("energy")) # In[ ]: eval_energies = np.linspace(2, 6, 20) * 1e4 * u.GeV eval_exposure = nddata.evaluate(energy=eval_energies, method="linear") plt.plot( nddata.axis("energy").nodes.value, nddata.data.value, ".", label="Interpolation nodes",
def test_init_error(self): with pytest.raises(ValueError): NDDataArray( axes=[MapAxis.from_nodes([1, 3, 6], name="x")], data=np.arange(8).reshape(4, 2), )