def test_psfmap_read_write(tmp_path): psfmap = make_test_psfmap(0.15 * u.deg) psfmap.write(tmp_path / "tmp.fits") new_psfmap = PSFMap.read(tmp_path / "tmp.fits") assert_allclose(psfmap.psf_map.quantity, new_psfmap.psf_map.quantity)
def test_psfmap_read_write(tmpdir): psfmap = make_test_psfmap(0.15 * u.deg) # test read/write filename = str(tmpdir / "psfmap.fits") psfmap.write(filename, overwrite=True) new_psfmap = PSFMap.read(filename) assert_allclose(psfmap.psf_map.quantity, new_psfmap.psf_map.quantity)
def get_psf(): filename = ( "$GAMMAPY_DATA/cta-1dc/caldb/data/cta/1dc/bcf/South_z20_50h/irf_file.fits" ) psf = EnergyDependentMultiGaussPSF.read(filename, hdu="POINT SPREAD FUNCTION") table_psf = psf.to_energy_dependent_table_psf(theta=0.5 * u.deg) psf_map = PSFMap.from_energy_dependent_table_psf(table_psf) return psf_map
def test_psfmap_to_from_hdulist(): psfmap = make_test_psfmap(0.15 * u.deg) hdulist = psfmap.to_hdulist(psf_hdu="PSF", psf_hdubands="BANDS") assert "PSF" in hdulist assert "BANDS" in hdulist assert "EXPMAP" in hdulist assert "BANDSEXP" in hdulist new_psfmap = PSFMap.from_hdulist(hdulist, psf_hdu="PSF", psf_hdubands="BANDS") assert_allclose(psfmap.psf_map.data, new_psfmap.psf_map.data) assert new_psfmap.psf_map.geom == psfmap.psf_map.geom assert new_psfmap.exposure_map.geom == psfmap.exposure_map.geom
def simulate_dataset( skymodel, geom, pointing, irfs, livetime=1 * u.h, offset=1 * u.deg, max_radius=0.8 * u.deg, random_state="random-seed", ): """Simulate a 3D dataset. Simulate a source defined with a sky model for a given pointing, geometry and irfs for a given exposure time. This will return a dataset object which includes the counts cube, the exposure cube, the psf cube, the background model and the sky model. Parameters ---------- skymodel : `~gammapy.modeling.models.SkyModel` Background model map geom : `~gammapy.maps.WcsGeom` Geometry object for the observation pointing : `~astropy.coordinates.SkyCoord` Pointing position irfs : dict Irfs used for simulating the observation livetime : `~astropy.units.Quantity` Livetime exposure of the simulated observation offset : `~astropy.units.Quantity` Offset from the center of the pointing position. This is used for the PSF and Edisp estimation max_radius : `~astropy.coordinates.Angle` The maximum radius of the PSF kernel. random_state: {int, 'random-seed', 'global-rng', `~numpy.random.RandomState`} Defines random number generator initialisation. Returns ------- dataset : `~gammapy.cube.MapDataset` A dataset of the simulated observation. """ background = make_map_background_irf(pointing=pointing, ontime=livetime, bkg=irfs["bkg"], geom=geom) background_model = BackgroundModel(background) psf = irfs["psf"].to_energy_dependent_table_psf(theta=offset) psf_map = PSFMap.from_energy_dependent_table_psf(psf) exposure = make_map_exposure_true_energy(pointing=pointing, livetime=livetime, aeff=irfs["aeff"], geom=geom) if "edisp" in irfs: energy = geom.axes[0].edges edisp = irfs["edisp"].to_energy_dispersion(offset, e_reco=energy, e_true=energy) else: edisp = None dataset = MapDataset( models=skymodel, exposure=exposure, background_model=background_model, psf=psf_map, edisp=edisp, ) npred_map = dataset.npred() rng = get_random_state(random_state) counts = rng.poisson(npred_map.data) dataset.counts = WcsNDMap(geom, counts) return dataset