def make_edisp_kernel(self, geom, observation): """Make energy dispersion. Parameters ---------- geom : `~gammapy.maps.Geom` Reference geom. Must contain "energy" and "energy_true" axes in that order. observation: `~gammapy.data.Observation` Observation to compute edisp for. Returns ------- edisp : `~gammapy.irf.EDispKernelMap` Energy dispersion kernel map """ position = geom.center_skydir energy_axis = geom.axes["energy"] energy_axis_true = geom.axes["energy_true"] offset = observation.pointing_radec.separation(position) kernel = observation.edisp.to_edisp_kernel( offset, energy=energy_axis.edges, energy_true=energy_axis_true.edges) edisp = EDispKernelMap.from_edisp_kernel(kernel, geom=geom.to_image()) exposure = self.make_exposure(geom.squash("energy"), observation) edisp.exposure_map.data = exposure.data[:, :, np.newaxis, :] return edisp
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_edisp(geom, geom_etrue): filename = "$GAMMAPY_DATA/hess-dl3-dr1/data/hess_dl3_dr1_obs_id_020136.fits.gz" edisp2d = EnergyDispersion2D.read(filename, hdu="EDISP") energy = geom.axes["energy"].edges energy_true = geom_etrue.axes["energy_true"].edges edisp_kernel = edisp2d.to_edisp_kernel( offset="1.2 deg", energy=energy, energy_true=energy_true ) edisp = EDispKernelMap.from_edisp_kernel(edisp_kernel) return edisp
def run(self, dataset, observation): """Make spectrum dataset. Parameters ---------- dataset : `~gammapy.spectrum.SpectrumDataset` Spectrum dataset. observation: `~gammapy.data.Observation` Observation to reduce. Returns ------- dataset : `~gammapy.spectrum.SpectrumDataset` Spectrum dataset. """ kwargs = { "gti": observation.gti, "livetime": observation.observation_live_time_duration, "meta_table": self.make_meta_table(observation) } energy_axis = dataset.counts.geom.get_axis_by_name("energy") energy_axis_true = dataset.aeff.geom.get_axis_by_name("energy_true") region = dataset.counts.geom.region if "counts" in self.selection: kwargs["counts"] = self.make_counts(dataset.counts.geom, observation) if "background" in self.selection: kwargs["background"] = self.make_background( dataset.counts.geom, observation) if "aeff" in self.selection: kwargs["aeff"] = self.make_aeff(dataset.aeff.geom, observation) if "edisp" in self.selection: edisp = self.make_edisp(region.center, energy_axis, energy_axis_true, observation) kwargs["edisp"] = EDispKernelMap.from_edisp_kernel( edisp, geom=dataset.counts.geom) return SpectrumDataset(name=dataset.name, **kwargs)
def read_rmf(filename, exposure): """Read RMF file Parameters ---------- filename : str or `Path` PHA file name exposure : `RegionNDMap` Exposure map Returns ------- data : `EDispKernelMap` Dict with edisp """ kernel = EDispKernel.read(filename) edisp = EDispKernelMap.from_edisp_kernel(kernel, geom=exposure.geom) # TODO: resolve this separate handling of exposure for edisp edisp.exposure_map.data = exposure.data[:, :, np.newaxis, :] return edisp
def from_ogip_files(cls, filename): """Read `~gammapy.spectrum.SpectrumDatasetOnOff` from OGIP files. BKG file, ARF, and RMF must be set in the PHA header and be present in the same folder. The naming scheme is fixed to the following scheme: * PHA file is named ``pha_obs{name}.fits`` * BKG file is named ``bkg_obs{name}.fits`` * ARF file is named ``arf_obs{name}.fits`` * RMF file is named ``rmf_obs{name}.fits`` with ``{name}`` the dataset name. Parameters ---------- filename : str OGIP PHA file to read """ filename = make_path(filename) dirname = filename.parent with fits.open(str(filename), memmap=False) as hdulist: counts = RegionNDMap.from_hdulist(hdulist, format="ogip") acceptance = RegionNDMap.from_hdulist( hdulist, format="ogip", ogip_column="BACKSCAL" ) if "GTI" in hdulist: gti = GTI(Table.read(hdulist["GTI"])) else: gti = None mask_safe = RegionNDMap.from_hdulist( hdulist, format="ogip", ogip_column="QUALITY" ) mask_safe.data = np.logical_not(mask_safe.data) phafile = filename.name try: rmffile = phafile.replace("pha", "rmf") kernel = EDispKernel.read(dirname / rmffile) edisp = EDispKernelMap.from_edisp_kernel(kernel, geom=counts.geom) except OSError: # TODO : Add logger and echo warning edisp = None try: bkgfile = phafile.replace("pha", "bkg") with fits.open(str(dirname / bkgfile), memmap=False) as hdulist: counts_off = RegionNDMap.from_hdulist(hdulist, format="ogip") acceptance_off = RegionNDMap.from_hdulist( hdulist, ogip_column="BACKSCAL" ) except OSError: # TODO : Add logger and echo warning counts_off, acceptance_off = None, None arffile = phafile.replace("pha", "arf") aeff = RegionNDMap.read(dirname / arffile, format="ogip-arf") return cls( counts=counts, aeff=aeff, counts_off=counts_off, edisp=edisp, livetime=counts.meta["EXPOSURE"] * u.s, mask_safe=mask_safe, acceptance=acceptance, acceptance_off=acceptance_off, name=str(counts.meta["OBS_ID"]), gti=gti, )