Example #1
0
    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)
Example #2
0
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)
Example #3
0
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
Example #5
0
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
Example #6
0
 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,
     )
Example #7
0
    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,
        )
Example #8
0
    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)
Example #9
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)
Example #10
0
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()
Example #12
0
"""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()
Example #13
0
"""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()
Example #14
0
"""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()