Пример #1
0
    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
Пример #2
0
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)
Пример #3
0
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
Пример #4
0
    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)
Пример #5
0
    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
Пример #6
0
    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,
        )