def test_from_parametrization(): # Log center of this is 100 GeV area_ref = 1.65469579e07 * u.cm ** 2 axis = MapAxis.from_energy_edges([80, 125] * u.GeV, name="energy_true") area = EffectiveAreaTable2D.from_parametrization(axis, "HESS") assert_allclose(area.quantity, area_ref) assert area.unit == area_ref.unit # Log center of this is 0.1, 2 TeV area_ref = [1.65469579e07, 1.46451957e09] * u.cm * u.cm axis = MapAxis.from_energy_edges([0.08, 0.125, 32] * u.TeV, name="energy_true") area = EffectiveAreaTable2D.from_parametrization(axis, "HESS") assert_allclose(area.quantity[:, 0], area_ref) assert area.unit == area_ref.unit
def simulate_spectrum_dataset(model, random_state=0): energy_edges = np.logspace(-0.5, 1.5, 21) * u.TeV energy_axis = MapAxis.from_edges(energy_edges, interp="log", name="energy") energy_axis_true = energy_axis.copy(name="energy_true") aeff = EffectiveAreaTable2D.from_parametrization( energy_axis_true=energy_axis_true) bkg_model = SkyModel( spectral_model=PowerLawSpectralModel(index=2.5, amplitude="1e-12 cm-2 s-1 TeV-1"), name="background", ) bkg_model.spectral_model.amplitude.frozen = True bkg_model.spectral_model.index.frozen = True geom = RegionGeom.create(region="icrs;circle(0, 0, 0.1)", axes=[energy_axis]) acceptance = RegionNDMap.from_geom(geom=geom, data=1) edisp = EDispKernelMap.from_diagonal_response( energy_axis=energy_axis, energy_axis_true=energy_axis_true, geom=geom, ) geom_true = RegionGeom.create(region="icrs;circle(0, 0, 0.1)", axes=[energy_axis_true]) exposure = make_map_exposure_true_energy(pointing=SkyCoord("0d", "0d"), aeff=aeff, livetime=100 * u.h, geom=geom_true) mask_safe = RegionNDMap.from_geom(geom=geom, dtype=bool) mask_safe.data += True acceptance_off = RegionNDMap.from_geom(geom=geom, data=5) dataset = SpectrumDatasetOnOff( name="test_onoff", exposure=exposure, acceptance=acceptance, acceptance_off=acceptance_off, edisp=edisp, mask_safe=mask_safe, ) dataset.models = bkg_model bkg_npred = dataset.npred_signal() dataset.models = model dataset.fake( random_state=random_state, npred_background=bkg_npred, ) return dataset
def test_spectrum_dataset_stack_nondiagonal_no_bkg(spectrum_dataset): energy = spectrum_dataset.counts.geom.axes["energy"] geom = spectrum_dataset.counts.geom edisp1 = EDispKernelMap.from_gauss( energy_axis=energy, energy_axis_true=energy.copy(name="energy_true"), sigma=0.1, bias=0, geom=geom.to_image(), ) edisp1.exposure_map.data += 1 aeff = EffectiveAreaTable2D.from_parametrization( energy_axis_true=energy.copy(name="energy_true"), instrument="HESS") livetime = 100 * u.s geom_true = geom.as_energy_true exposure = make_map_exposure_true_energy(geom=geom_true, livetime=livetime, pointing=geom_true.center_skydir, aeff=aeff) geom = spectrum_dataset.counts.geom counts = RegionNDMap.from_geom(geom=geom) gti = GTI.create(start=0 * u.s, stop=livetime) spectrum_dataset1 = SpectrumDataset( counts=counts, exposure=exposure, edisp=edisp1, meta_table=Table({"OBS_ID": [0]}), gti=gti.copy(), ) edisp2 = EDispKernelMap.from_gauss( energy_axis=energy, energy_axis_true=energy.copy(name="energy_true"), sigma=0.2, bias=0.0, geom=geom, ) edisp2.exposure_map.data += 1 gti2 = GTI.create(start=100 * u.s, stop=200 * u.s) spectrum_dataset2 = SpectrumDataset( counts=counts, exposure=exposure.copy(), edisp=edisp2, meta_table=Table({"OBS_ID": [1]}), gti=gti2, ) spectrum_dataset1.stack(spectrum_dataset2) assert_allclose(spectrum_dataset1.meta_table["OBS_ID"][0], [0, 1]) assert spectrum_dataset1.background_model is None assert_allclose(spectrum_dataset1.gti.time_sum.to_value("s"), 200) assert_allclose(spectrum_dataset1.exposure.quantity[2].to_value("m2 s"), 1573851.079861) kernel = edisp1.get_edisp_kernel() assert_allclose(kernel.get_bias(1 * u.TeV), 0.0, atol=1.2e-3) assert_allclose(kernel.get_resolution(1 * u.TeV), 0.1581, atol=1e-2)
def test_spectrum_dataset_stack_diagonal_safe_mask(spectrum_dataset): geom = spectrum_dataset.counts.geom energy = MapAxis.from_energy_bounds("0.1 TeV", "10 TeV", nbin=30) energy_true = MapAxis.from_energy_bounds("0.1 TeV", "10 TeV", nbin=30, name="energy_true") aeff = EffectiveAreaTable2D.from_parametrization( energy_axis_true=energy_true, instrument="HESS") livetime = 100 * u.s gti = GTI.create(start=0 * u.s, stop=livetime) geom_true = geom.as_energy_true exposure = make_map_exposure_true_energy(geom=geom_true, livetime=livetime, pointing=geom_true.center_skydir, aeff=aeff) edisp = EDispKernelMap.from_diagonal_response(energy, energy_true, geom=geom.to_image()) edisp.exposure_map.data = exposure.data[:, :, np.newaxis, :] background = spectrum_dataset.background mask_safe = RegionNDMap.from_geom(geom=geom, dtype=bool) mask_safe.data += True spectrum_dataset1 = SpectrumDataset( name="ds1", counts=spectrum_dataset.counts.copy(), exposure=exposure.copy(), edisp=edisp.copy(), background=background.copy(), gti=gti.copy(), mask_safe=mask_safe, ) livetime2 = 0.5 * livetime gti2 = GTI.create(start=200 * u.s, stop=200 * u.s + livetime2) bkg2 = RegionNDMap.from_geom(geom=geom, data=2 * background.data) geom = spectrum_dataset.counts.geom data = np.ones(spectrum_dataset.data_shape, dtype="bool") data[0] = False safe_mask2 = RegionNDMap.from_geom(geom=geom, data=data) exposure2 = exposure.copy() edisp = edisp.copy() edisp.exposure_map.data = exposure2.data[:, :, np.newaxis, :] spectrum_dataset2 = SpectrumDataset( name="ds2", counts=spectrum_dataset.counts.copy(), exposure=exposure2, edisp=edisp, background=bkg2, mask_safe=safe_mask2, gti=gti2, ) spectrum_dataset1.stack(spectrum_dataset2) reference = spectrum_dataset.counts.data assert_allclose(spectrum_dataset1.counts.data[1:], reference[1:] * 2) assert_allclose(spectrum_dataset1.counts.data[0], 141363) assert_allclose(spectrum_dataset1.exposure.quantity[0], 4.755644e09 * u.Unit("cm2 s")) assert_allclose(spectrum_dataset1.background.data[1:], 3 * background.data[1:]) assert_allclose(spectrum_dataset1.background.data[0], background.data[0]) kernel = edisp.get_edisp_kernel() kernel_stacked = spectrum_dataset1.edisp.get_edisp_kernel() assert_allclose(kernel_stacked.pdf_matrix[1:], kernel.pdf_matrix[1:]) assert_allclose(kernel_stacked.pdf_matrix[0], 0.5 * kernel.pdf_matrix[0])
import matplotlib.pyplot as plt from gammapy.data import Observation, observatory_locations from gammapy.datasets import SpectrumDataset from gammapy.datasets.map import MIGRA_AXIS_DEFAULT from gammapy.irf import EffectiveAreaTable2D, EnergyDispersion2D from gammapy.makers import SpectrumDatasetMaker from gammapy.maps import MapAxis, RegionGeom from gammapy.modeling.models import PowerLawSpectralModel, SkyModel energy_true = MapAxis.from_energy_bounds( "0.1 TeV", "20 TeV", nbin=20, per_decade=True, name="energy_true" ) energy_reco = MapAxis.from_energy_bounds("0.2 TeV", "10 TeV", nbin=10, per_decade=True) aeff = EffectiveAreaTable2D.from_parametrization( energy_axis_true=energy_true, instrument="HESS" ) offset_axis = MapAxis.from_bounds(0 * u.deg, 5 * u.deg, nbin=2, name="offset") edisp = EnergyDispersion2D.from_gauss( energy_axis_true=energy_true, offset_axis=offset_axis, migra_axis=MIGRA_AXIS_DEFAULT, bias=0, sigma=0.2, ) observation = Observation.create( obs_id=0, pointing=SkyCoord("0d", "0d", frame="icrs"), irfs={"aeff": aeff, "edisp": edisp},
import matplotlib.pyplot as plt from astropy import units as u from gammapy.irf import EffectiveAreaTable2D for instrument in ["HESS", "HESS2", "CTA"]: aeff = EffectiveAreaTable2D.from_parametrization(instrument=instrument) ax = aeff.plot_energy_dependence(label=instrument, offset=[0] * u.deg) ax.set_yscale("log") ax.set_xlim([1e-3, 1e3]) ax.set_ylim([1e3, 1e12]) plt.legend(loc="best") plt.show()