def test_make_edisp_kernel_map(): migra = MapAxis.from_edges(np.linspace(0.5, 1.5, 50), unit="", name="migra") etrue = MapAxis.from_energy_bounds(0.5, 2, 6, unit="TeV", name="energy_true") offset = MapAxis.from_edges(np.linspace(0.0, 2.0, 3), unit="deg", name="offset") ereco = MapAxis.from_energy_bounds(0.5, 2, 3, unit="TeV", name="energy") edisp = EnergyDispersion2D.from_gauss(energy_axis_true=etrue, migra_axis=migra, bias=0, sigma=0.01, offset_axis=offset) geom = WcsGeom.create(10, binsz=0.5, axes=[ereco, etrue]) pointing = SkyCoord(0, 0, frame="icrs", unit="deg") edispmap = make_edisp_kernel_map(edisp, pointing, geom) kernel = edispmap.get_edisp_kernel(pointing) assert_allclose(kernel.pdf_matrix[:, 0], (1.0, 1.0, 0.0, 0.0, 0.0, 0.0), atol=1e-14) assert_allclose(kernel.pdf_matrix[:, 1], (0.0, 0.0, 1.0, 1.0, 0.0, 0.0), atol=1e-14) assert_allclose(kernel.pdf_matrix[:, 2], (0.0, 0.0, 0.0, 0.0, 1.0, 1.0), atol=1e-14)
def to_edisp_kernel(self, offset, energy_true=None, energy=None): """Detector response R(Delta E_reco, Delta E_true) Probability to reconstruct an energy in a given true energy band in a given reconstructed energy band Parameters ---------- offset : `~astropy.coordinates.Angle` Offset energy_true : `~astropy.units.Quantity`, None True energy axis energy : `~astropy.units.Quantity` Reconstructed energy axis Returns ------- edisp : `~gammapy.irf.EDispKernel` Energy dispersion matrix """ from gammapy.makers.utils import make_edisp_kernel_map offset = Angle(offset) # TODO: expect directly MapAxis here? if energy is None: energy_axis = self.axes["energy_true"].copy(name="energy") else: energy_axis = MapAxis.from_energy_edges(energy) if energy_true is None: energy_axis_true = self.axes["energy_true"] else: energy_axis_true = MapAxis.from_energy_edges( energy_true, name="energy_true", ) pointing = SkyCoord("0d", "0d") center = pointing.directional_offset_by(position_angle=0 * u.deg, separation=offset) geom = RegionGeom.create(region=center, axes=[energy_axis, energy_axis_true]) edisp = make_edisp_kernel_map(geom=geom, edisp=self, pointing=pointing) return edisp.get_edisp_kernel()