def prepare_dataset_simple(filename_dataset): """Prepare dataset for a given skymodel.""" log.info(f"Reading {IRF_FILE}") irfs = load_cta_irfs(IRF_FILE) edisp_gauss = EnergyDispersion2D.from_gauss( e_true=ENERGY_AXIS_TRUE.edges, migra=MIGRA_AXIS.edges, sigma=0.1, bias=0, offset=[0, 2, 4, 6, 8] * u.deg, ) irfs["edisp"] = edisp_gauss # irfs["aeff"].data.data = np.ones_like(irfs["aeff"].data.data) * 1e6 observation = Observation.create( obs_id=1001, pointing=POINTING, livetime=LIVETIME, irfs=irfs ) empty = MapDataset.create( WCS_GEOM, energy_axis_true=ENERGY_AXIS_TRUE, migra_axis=MIGRA_AXIS ) # maker = MapDatasetMaker(selection=["exposure", "edisp"]) # maker = MapDatasetMaker(selection=["exposure", "edisp", "background"]) maker = MapDatasetMaker(selection=["exposure", "edisp", "psf", "background"]) dataset = maker.run(empty, observation) filename_dataset.parent.mkdir(exist_ok=True, parents=True) log.info(f"Writing {filename_dataset}") dataset.write(filename_dataset, overwrite=True)
def setup_class(cls): filename = "$GAMMAPY_DATA/hess-dl3-dr1/data/hess_dl3_dr1_obs_id_020136.fits.gz" cls.edisp = EnergyDispersion2D.read(filename, hdu="EDISP") # Make a test case energy_axis_true = MapAxis.from_energy_bounds("0.1 TeV", "100 TeV", nbin=50, name="energy_true") migra_axis = MapAxis.from_bounds(0, 4, nbin=1000, node_type="edges", name="migra") offset_axis = MapAxis.from_bounds(0, 2.5, nbin=5, unit="deg", name="offset") energy_true = energy_axis_true.edges[:-1].reshape((-1, 1, 1)) sigma = 0.15 / (energy_true / (1 * u.TeV)).value**0.3 bias = 1e-3 * (energy_true - 1 * u.TeV).value cls.edisp2 = EnergyDispersion2D.from_gauss( energy_axis_true=energy_axis_true, migra_axis=migra_axis, bias=bias, sigma=sigma, offset_axis=offset_axis, )
def make_edisp_map_test(): etrue = [0.2, 0.7, 1.5, 2.0, 10.0] * u.TeV migra = np.linspace(0.0, 3.0, 51) offsets = np.array((0.0, 1.0, 2.0, 3.0)) * u.deg pointing = SkyCoord(0, 0, unit="deg") energy_axis = MapAxis( nodes=[0.2, 0.7, 1.5, 2.0, 10.0], unit="TeV", name="energy_true", node_type="edges", interp="log", ) migra_axis = MapAxis(nodes=np.linspace(0.0, 3.0, 51), unit="", name="migra") edisp2d = EnergyDispersion2D.from_gauss(etrue, migra, 0.0, 0.2, offsets) geom = WcsGeom.create( skydir=pointing, binsz=1.0, width=5.0, axes=[migra_axis, energy_axis] ) aeff2d = fake_aeff2d() exposure_geom = geom.squash(axis_name="migra") exposure_map = make_map_exposure_true_energy(pointing, "1 h", aeff2d, exposure_geom) return make_edisp_map(edisp2d, pointing, geom, exposure_map)
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 make_edisp_map_test(): pointing = SkyCoord(0, 0, unit="deg") energy_axis_true = MapAxis.from_energy_edges( energy_edges=[0.2, 0.7, 1.5, 2.0, 10.0] * u.TeV, name="energy_true", ) migra_axis = MapAxis(nodes=np.linspace(0.0, 3.0, 51), unit="", name="migra") offset_axis = MapAxis.from_nodes([0.0, 1.0, 2.0, 3.0] * u.deg, name="offset") edisp2d = EnergyDispersion2D.from_gauss( energy_axis_true=energy_axis_true, migra_axis=migra_axis, offset_axis=offset_axis, bias=0, sigma=0.2, ) geom = WcsGeom.create( skydir=pointing, binsz=1.0, width=5.0, axes=[migra_axis, energy_axis_true] ) aeff2d = fake_aeff2d() exposure_geom = geom.squash(axis_name="migra") exposure_map = make_map_exposure_true_energy(pointing, "1 h", aeff2d, exposure_geom) return make_edisp_map(edisp2d, pointing, geom, exposure_map)
def setup_class(cls): filename = "$GAMMAPY_DATA/hess-dl3-dr1/data/hess_dl3_dr1_obs_id_020136.fits.gz" cls.edisp = EnergyDispersion2D.read(filename, hdu="EDISP") # Make a test case e_true = np.logspace(-1.0, 2.0, 51) * u.TeV migra = np.linspace(0.0, 4.0, 1001) offset = np.linspace(0.0, 2.5, 5) * u.deg sigma = 0.15 / (e_true[:-1] / (1 * u.TeV)).value ** 0.3 bias = 1e-3 * (e_true[:-1] - 1 * u.TeV).value cls.edisp2 = EnergyDispersion2D.from_gauss(e_true, migra, bias, sigma, offset)
def setup(self): # TODO: use from_gauss method to create know edisp (see below) # At the moment only 1 test uses it (test_get_response) filename = "$GAMMAPY_DATA/tests/irf/hess/pa/hess_edisp_2d_023523.fits.gz" self.edisp = EnergyDispersion2D.read(filename, hdu="ENERGY DISPERSION") # Make a test case e_true = np.logspace(-1.0, 2.0, 51) * u.TeV migra = np.linspace(0.0, 4.0, 1001) offset = np.linspace(0.0, 2.5, 5) * u.deg sigma = 0.15 / (e_true[:-1] / (1 * u.TeV)).value**0.3 bias = 1e-3 * (e_true[:-1] - 1 * u.TeV).value self.edisp2 = EnergyDispersion2D.from_gauss(e_true, migra, bias, sigma, offset)
from gammapy.modeling.models import PowerLawSpectralModel, SkyModel energy_true = MapAxis.from_energy_bounds( "0.1 TeV", "20 TeV", nbin=20, per_decade=True, name="energy_true" ) energy_reco = MapAxis.from_energy_bounds("0.2 TeV", "10 TeV", nbin=10, per_decade=True) aeff = EffectiveAreaTable2D.from_parametrization( energy_axis_true=energy_true, instrument="HESS" ) offset_axis = MapAxis.from_bounds(0 * u.deg, 5 * u.deg, nbin=2, name="offset") edisp = EnergyDispersion2D.from_gauss( energy_axis_true=energy_true, offset_axis=offset_axis, migra_axis=MIGRA_AXIS_DEFAULT, bias=0, sigma=0.2, ) observation = Observation.create( obs_id=0, pointing=SkyCoord("0d", "0d", frame="icrs"), irfs={"aeff": aeff, "edisp": edisp}, tstart=0 * u.h, tstop=0.5 * u.h, location=observatory_locations["hess"], ) geom = RegionGeom.create("icrs;circle(0, 0, 0.1)", axes=[energy_reco])