def test_spectrum_dataset_stack_nondiagonal_no_bkg(self): aeff = EffectiveAreaTable.from_parametrization(self.src.energy.edges, "HESS") edisp1 = EDispKernel.from_gauss(self.src.energy.edges, self.src.energy.edges, 0.1, 0.0) livetime = self.livetime dataset1 = SpectrumDataset(counts=None, livetime=livetime, aeff=aeff, edisp=edisp1, background=None) livetime2 = livetime aeff2 = EffectiveAreaTable(self.src.energy.edges[:-1], self.src.energy.edges[1:], aeff.data.data) edisp2 = EDispKernel.from_gauss(self.src.energy.edges, self.src.energy.edges, 0.2, 0.0) dataset2 = SpectrumDataset( counts=self.src.copy(), livetime=livetime2, aeff=aeff2, edisp=edisp2, background=None, ) dataset1.stack(dataset2) assert dataset1.counts is None assert dataset1.background is None assert dataset1.livetime == 2 * self.livetime assert_allclose(dataset1.aeff.data.data.to_value("m2"), aeff.data.data.to_value("m2")) assert_allclose(dataset1.edisp.get_bias(1 * u.TeV), 0.0, atol=1.2e-3) assert_allclose(dataset1.edisp.get_resolution(1 * u.TeV), 0.1581, atol=1e-2)
def test_spectrum_dataset_stack_nondiagonal_no_bkg(spectrum_dataset): energy = spectrum_dataset.counts.geom.axes[0].edges aeff = EffectiveAreaTable.from_parametrization(energy, "HESS") edisp1 = EDispKernel.from_gauss(energy, energy, 0.1, 0) livetime = 100 * u.s spectrum_dataset1 = SpectrumDataset( counts=spectrum_dataset.counts.copy(), livetime=livetime, aeff=aeff, edisp=edisp1, ) livetime2 = livetime aeff2 = EffectiveAreaTable( energy[:-1], energy[1:], aeff.data.data ) edisp2 = EDispKernel.from_gauss(energy, energy, 0.2, 0.0) spectrum_dataset2 = SpectrumDataset( counts=spectrum_dataset.counts.copy(), livetime=livetime2, aeff=aeff2, edisp=edisp2, ) spectrum_dataset1.stack(spectrum_dataset2) assert spectrum_dataset1.background is None assert spectrum_dataset1.livetime == 2 * livetime assert_allclose( spectrum_dataset1.aeff.data.data.to_value("m2"), aeff.data.data.to_value("m2") ) assert_allclose(spectrum_dataset1.edisp.get_bias(1 * u.TeV), 0.0, atol=1.2e-3) assert_allclose(spectrum_dataset1.edisp.get_resolution(1 * u.TeV), 0.1581, atol=1e-2)
def make_observation_list(): """obs with dummy IRF""" nbin = 3 energy = np.logspace(-1, 1, nbin + 1) * u.TeV livetime = 2 * u.h data_on = np.arange(nbin) dataoff_1 = np.ones(3) dataoff_2 = np.ones(3) * 3 dataoff_1[1] = 0 dataoff_2[1] = 0 on_vector = CountsSpectrum(energy_lo=energy[:-1], energy_hi=energy[1:], data=data_on) off_vector1 = CountsSpectrum(energy_lo=energy[:-1], energy_hi=energy[1:], data=dataoff_1) off_vector2 = CountsSpectrum(energy_lo=energy[:-1], energy_hi=energy[1:], data=dataoff_2) aeff = EffectiveAreaTable.from_constant(energy, "1 cm2") edisp = EDispKernel.from_gauss(e_true=energy, e_reco=energy, sigma=0.2, bias=0) time_ref = Time("2010-01-01") gti1 = make_gti({ "START": [5, 6, 1, 2], "STOP": [8, 7, 3, 4] }, time_ref=time_ref) gti2 = make_gti({"START": [14], "STOP": [15]}, time_ref=time_ref) obs1 = SpectrumDatasetOnOff( counts=on_vector, counts_off=off_vector1, aeff=aeff, edisp=edisp, livetime=livetime, mask_safe=np.ones(on_vector.energy.nbin, dtype=bool), acceptance=1, acceptance_off=2, name="1", gti=gti1, ) obs2 = SpectrumDatasetOnOff( counts=on_vector, counts_off=off_vector2, aeff=aeff, edisp=edisp, livetime=livetime, mask_safe=np.ones(on_vector.energy.nbin, dtype=bool), acceptance=1, acceptance_off=4, name="2", gti=gti2, ) obs_list = [obs1, obs2] return obs_list
def run(self, geom): """Create and fill the map dataset""" dataset = MapDataset.create(geom, binsz_irf=1.0) dataset.counts.fill_events(self.events) dataset.gti = self._make_gti() self._fill_psfmap(self.psf, dataset) # recompute exposure on geom coords = geom.get_coord() # this is to change the axis name. Can we avoid this? coords = MapCoord.create( dict(skycoord=coords.skycoord, energy_true=coords['energy'])) values = self.exposure.interp_by_coord(coords) dataset.exposure = Map.from_geom(geom, data=values, unit=self.exposure.unit) # Not the real Fermi-LAT EDISP: Use 5% energy resolution as approximation energy = geom.axes[0] edisp = EDispKernel.from_gauss(e_true=energy.edges, e_reco=energy.edges, sigma=0.05, bias=0) dataset.edisp = edisp return dataset
def make_observation_list(): """obs with dummy IRF""" nbin = 3 energy = np.logspace(-1, 1, nbin + 1) * u.TeV livetime = 2 * u.h data_on = np.arange(nbin) dataoff_1 = np.ones(3) dataoff_2 = np.ones(3) * 3 dataoff_1[1] = 0 dataoff_2[1] = 0 axis = MapAxis.from_edges(energy, name="energy", interp="log") geom = RegionGeom(region=None, axes=[axis]) on_vector = RegionNDMap.from_geom(geom=geom, data=data_on) off_vector1 = RegionNDMap.from_geom(geom=geom, data=dataoff_1) off_vector2 = RegionNDMap.from_geom(geom=geom, data=dataoff_2) mask_safe = RegionNDMap.from_geom(geom, dtype=bool) mask_safe.data += True aeff = EffectiveAreaTable.from_constant(energy, "1 cm2") edisp = EDispKernel.from_gauss(e_true=energy, e_reco=energy, sigma=0.2, bias=0) time_ref = Time("2010-01-01") gti1 = make_gti({"START": [5, 6, 1, 2], "STOP": [8, 7, 3, 4]}, time_ref=time_ref) gti2 = make_gti({"START": [14], "STOP": [15]}, time_ref=time_ref) obs1 = SpectrumDatasetOnOff( counts=on_vector, counts_off=off_vector1, aeff=aeff, edisp=edisp, livetime=livetime, mask_safe=mask_safe, acceptance=1, acceptance_off=2, name="1", gti=gti1, ) obs2 = SpectrumDatasetOnOff( counts=on_vector, counts_off=off_vector2, aeff=aeff, edisp=edisp, livetime=livetime, mask_safe=mask_safe, acceptance=1, acceptance_off=4, name="2", gti=gti2, ) obs_list = [obs1, obs2] return obs_list
def setup(self): self.e_true = np.logspace(0, 1, 101) * u.TeV self.e_reco = self.e_true self.resolution = 0.1 self.bias = 0 self.edisp = EDispKernel.from_gauss( e_true=self.e_true, e_reco=self.e_reco, pdf_threshold=1e-7, sigma=self.resolution, bias=self.bias, )
def setup(self): energy_axis = MapAxis.from_energy_bounds("1 TeV", "10 TeV", nbin=100) energy_axis_true = energy_axis.copy(name="energy_true") self.resolution = 0.1 self.bias = 0 self.edisp = EDispKernel.from_gauss( energy_axis_true=energy_axis_true, energy_axis=energy_axis, pdf_threshold=1e-7, sigma=self.resolution, bias=self.bias, )
def test_to_image(self): e_reco = MapAxis.from_energy_bounds("0.1 TeV", "10 TeV", nbin=3) e_true = MapAxis.from_energy_bounds( "0.08 TeV", "20 TeV", nbin=5, name="energy_true" ) edisp = EDispKernel.from_gauss( energy=e_reco.edges, energy_true=e_true.edges, sigma=0.2, bias=0.1 ) im = edisp.to_image() assert im.pdf_matrix.shape == (5, 1) assert_allclose( im.pdf_matrix, [[0.97142], [1.0], [1.0], [1.0], [0.12349]], rtol=1e-3 ) assert_allclose(im.energy_axis.edges, [0.1, 10] * u.TeV)
def test_edispkernel_from_1D(): energy_axis_true = MapAxis.from_energy_bounds( "0.5 TeV", "5 TeV", nbin=31, name="energy_true" ) energy_axis = MapAxis.from_energy_bounds( "0.1 TeV", "10 TeV", nbin=11, name="energy" ) edisp = EDispKernel.from_gauss(energy_axis_true.edges, energy_axis.edges, 0.1, 0.0) region = make_region("fk5;circle(0.,0., 10.") geom = RegionGeom(region) region_edisp = EDispKernelMap.from_edisp_kernel(edisp, geom=geom) sum_kernel = np.sum(region_edisp.edisp_map.data[..., 0, 0], axis=1) assert_allclose(sum_kernel, 1, rtol=1e-5) allsky_edisp = EDispKernelMap.from_edisp_kernel(edisp) sum_kernel = np.sum(allsky_edisp.edisp_map.data[..., 0, 0], axis=1) assert allsky_edisp.edisp_map.data.shape == (31, 11, 1, 2) assert_allclose(sum_kernel, 1, rtol=1e-5)
def get_test_cases(): e_true = Quantity(np.logspace(-1, 2, 120), "TeV") e_reco = Quantity(np.logspace(-1, 2, 100), "TeV") return [ dict( model=SkyModel(spectral_model=PowerLawSpectralModel( amplitude="1e-11 TeV-1 cm-2 s-1")), aeff=EffectiveAreaTable.from_parametrization(e_true), livetime="10 h", npred=1448.05960, ), dict( model=SkyModel(spectral_model=PowerLawSpectralModel( reference="1 GeV", amplitude="1e-11 GeV-1 cm-2 s-1")), aeff=EffectiveAreaTable.from_parametrization(e_true), livetime="30 h", npred=4.34417881, ), dict( model=SkyModel(spectral_model=PowerLawSpectralModel( amplitude="1e-11 TeV-1 cm-2 s-1")), aeff=EffectiveAreaTable.from_parametrization(e_true), edisp=EDispKernel.from_gauss(e_reco=e_reco, e_true=e_true, bias=0, sigma=0.2), livetime="10 h", npred=1437.494815, ), dict( model=SkyModel(spectral_model=TemplateSpectralModel( energy=[0.1, 0.2, 0.3, 0.4] * u.TeV, values=[4.0, 3.0, 1.0, 0.1] * u.Unit("TeV-1"), )), aeff=EffectiveAreaTable.from_constant([0.1, 0.2, 0.3, 0.4] * u.TeV, 1), npred=0.554513062, ), ]
"""Plot an energy dispersion using a gaussian parametrisation""" import matplotlib.pyplot as plt from gammapy.irf import EDispKernel from gammapy.maps import MapAxis energy_axis = MapAxis.from_energy_bounds("1 TeV", "10 TeV", nbin=10) energy_axis_true = MapAxis.from_energy_bounds( "0.5 TeV", "30 TeV", nbin=10, per_decade=True, name="energy_true" ) edisp = EDispKernel.from_gauss( energy_axis=energy_axis, energy_axis_true=energy_axis_true, sigma=0.1, bias=0 ) edisp.peek() plt.show()
"""Plot energy dispersion example.""" import numpy as np import astropy.units as u import matplotlib.pyplot as plt from gammapy.irf import EDispKernel ebounds = np.logspace(-1, 2, 101) * u.TeV edisp = EDispKernel.from_gauss(e_true=ebounds, e_reco=ebounds, bias=0, sigma=0.3) edisp.peek() plt.show()
"""Plot an energy dispersion using a gaussian parametrisation""" import numpy as np import astropy.units as u from gammapy.irf import EDispKernel import matplotlib.pyplot as plt energy = np.logspace(0, 1, 101) * u.TeV edisp = EDispKernel.from_gauss( e_true=energy, e_reco=energy, sigma=0.1, bias=0, ) edisp.peek() plt.show()
"""Plot an energy dispersion using a gaussian parametrisation""" import numpy as np import astropy.units as u import matplotlib.pyplot as plt from gammapy.irf import EDispKernel energy = np.logspace(0, 1, 101) * u.TeV edisp = EDispKernel.from_gauss( energy=energy, energy_true=energy, sigma=0.1, bias=0, ) edisp.peek() plt.show()