def test_spectrum_dataset_stack_nondiagonal_no_bkg(spectrum_dataset): energy = spectrum_dataset.counts.geom.axes["energy"] geom = spectrum_dataset.counts.geom.to_image() edisp1 = EDispKernelMap.from_gauss( energy_axis=energy, energy_axis_true=energy.copy(name="energy_true"), sigma=0.1, bias=0, geom=geom) edisp1.exposure_map.data += 1 aeff = EffectiveAreaTable.from_parametrization( energy.edges, "HESS").to_region_map(geom.region) geom = spectrum_dataset.counts.geom counts = RegionNDMap.from_geom(geom=geom) gti = GTI.create(start=0 * u.s, stop=100 * u.s) spectrum_dataset1 = SpectrumDataset( counts=counts, exposure=aeff * gti.time_sum, edisp=edisp1, meta_table=Table({"OBS_ID": [0]}), gti=gti.copy(), ) edisp2 = EDispKernelMap.from_gauss( energy_axis=energy, energy_axis_true=energy.copy(name="energy_true"), sigma=0.2, bias=0.0, geom=geom) edisp2.exposure_map.data += 1 gti2 = GTI.create(start=100 * u.s, stop=200 * u.s) spectrum_dataset2 = SpectrumDataset( counts=counts, exposure=aeff * gti2.time_sum, edisp=edisp2, meta_table=Table({"OBS_ID": [1]}), gti=gti2, ) spectrum_dataset1.stack(spectrum_dataset2) assert_allclose(spectrum_dataset1.meta_table["OBS_ID"][0], [0, 1]) assert spectrum_dataset1.background_model is None assert_allclose(spectrum_dataset1.gti.time_sum.to_value("s"), 200) assert_allclose(spectrum_dataset1.exposure.quantity[2].to_value("m2 s"), 1573851.079861) kernel = edisp1.get_edisp_kernel() assert_allclose(kernel.get_bias(1 * u.TeV), 0.0, atol=1.2e-3) assert_allclose(kernel.get_resolution(1 * u.TeV), 0.1581, atol=1e-2)
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") axis_true = axis.copy(name="energy_true") geom = RegionGeom(region=None, axes=[axis]) geom_true = RegionGeom(region=None, axes=[axis_true]) 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 = RegionNDMap.from_geom(geom_true, data=1, unit="m2") edisp = EDispKernelMap.from_gauss( energy_axis=axis, energy_axis_true=axis, sigma=0.2, bias=0, geom=geom ) 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) exposure = aeff * livetime exposure.meta["livetime"] = livetime obs1 = SpectrumDatasetOnOff( counts=on_vector, counts_off=off_vector1, exposure=exposure, edisp=edisp, mask_safe=mask_safe, acceptance=1, acceptance_off=2, name="1", gti=gti1, ) obs2 = SpectrumDatasetOnOff( counts=on_vector, counts_off=off_vector2, exposure=exposure.copy(), edisp=edisp, mask_safe=mask_safe, 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""" energy = geom.axes[0] energy_true = energy.copy(name="energy_true") geom_true = geom.to_image().to_cube([energy_true]) dataset = MapDataset.create(geom, energy_axis_true=energy_true, binsz_irf=1.0) dataset.mask_safe.data += True dataset.counts.fill_events(self.events) dataset.gti = self._make_gti() dataset.psf = self.psf # recompute exposure on geom coords = geom_true.get_coord() data = self.exposure.interp_by_coord(coords) dataset.exposure = Map.from_geom(geom_true, data=data, unit=self.exposure.unit) # Not the real Fermi-LAT EDISP: Use 5% energy resolution as approximation edisp = EDispKernelMap.from_gauss(energy_axis=energy, energy_axis_true=energy_true, sigma=0.05, bias=0) dataset.edisp = edisp return dataset
def test_spectrum_dataset_stack_nondiagonal_no_bkg(spectrum_dataset): energy = spectrum_dataset.counts.geom.axes[0] aeff = EffectiveAreaTable.from_parametrization(energy.edges, "HESS") geom = spectrum_dataset.counts.geom.to_image() edisp1 = EDispKernelMap.from_gauss(energy, energy, 0.1, 0, geom=geom) edisp1.exposure_map.data += 1 livetime = 100 * u.s spectrum_dataset1 = SpectrumDataset( counts=spectrum_dataset.counts.copy(), livetime=livetime, aeff=aeff, edisp=edisp1, ) livetime2 = livetime aeff2 = EffectiveAreaTable(energy.edges[:-1], energy.edges[1:], aeff.data.data) edisp2 = EDispKernelMap.from_gauss(energy, energy, 0.2, 0.0, geom=geom) edisp2.exposure_map.data += 1 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")) kernel = edisp1.get_edisp_kernel() assert_allclose(kernel.get_bias(1 * u.TeV), 0.0, atol=1.2e-3) assert_allclose(kernel.get_resolution(1 * u.TeV), 0.1581, atol=1e-2)
def test_spectrum_dataset_stack_nondiagonal_no_bkg(spectrum_dataset): energy = spectrum_dataset.counts.geom.axes[0] geom = spectrum_dataset.counts.geom.to_image() edisp1 = EDispKernelMap.from_gauss(energy, energy, 0.1, 0, geom=geom) edisp1.exposure_map.data += 1 aeff = EffectiveAreaTable.from_parametrization( energy.edges, "HESS").to_region_map(geom.region) livetime = 100 * u.s spectrum_dataset1 = SpectrumDataset(counts=spectrum_dataset.counts.copy(), livetime=livetime, aeff=aeff, edisp=edisp1, meta_table=Table({"OBS_ID": [0]})) livetime2 = livetime aeff2 = aeff.copy() edisp2 = EDispKernelMap.from_gauss(energy, energy, 0.2, 0.0, geom=geom) edisp2.exposure_map.data += 1 spectrum_dataset2 = SpectrumDataset(counts=spectrum_dataset.counts.copy(), livetime=livetime2, aeff=aeff2, edisp=edisp2, meta_table=Table({"OBS_ID": [1]})) spectrum_dataset1.stack(spectrum_dataset2) assert_allclose(spectrum_dataset1.meta_table["OBS_ID"][0], [0, 1]) assert spectrum_dataset1.background is None assert spectrum_dataset1.livetime == 2 * livetime assert_allclose(spectrum_dataset1.aeff.quantity.to_value("m2"), aeff.quantity.to_value("m2")) kernel = edisp1.get_edisp_kernel() assert_allclose(kernel.get_bias(1 * u.TeV), 0.0, atol=1.2e-3) assert_allclose(kernel.get_resolution(1 * u.TeV), 0.1581, atol=1e-2)
def prepare_dataset(): energy = MapAxis.from_energy_bounds(0.1, 100, 5, per_decade=True, unit="TeV") energy_true = MapAxis.from_energy_bounds(0.1, 100, 5, unit="TeV", per_decade=True, name="energy_true") geom = WcsGeom.create(npix=500, binsz=0.01, axes=[energy]) dataset = MapDataset.create(geom, energy_axis_true=energy_true) dataset.exposure += "1 m2 s" dataset.psf = PSFMap.from_gauss(energy_true) dataset.edisp = EDispKernelMap.from_gauss(energy, energy_true, 0.1, 0.) return Datasets([dataset])
def test_interpolate_map_dataset(): energy = MapAxis.from_energy_bounds("1 TeV", "300 TeV", nbin=5, name="energy") energy_true = MapAxis.from_nodes(np.logspace(-1, 3, 20), name="energy_true", interp="log", unit="TeV") # make dummy map IRFs geom_allsky = WcsGeom.create(npix=(5, 3), proj="CAR", binsz=60, axes=[energy], skydir=(0, 0)) geom_allsky_true = geom_allsky.drop('energy').to_cube([energy_true]) #background value = 30 bkg_map = Map.from_geom(geom_allsky, unit="") bkg_map.data = value*np.ones(bkg_map.data.shape) #effective area - with a gradient that also depends on energy aeff_map = Map.from_geom(geom_allsky_true, unit="cm2 s") ra_arr = np.arange(aeff_map.data.shape[1]) dec_arr = np.arange(aeff_map.data.shape[2]) for i in np.arange(aeff_map.data.shape[0]): aeff_map.data[i, :, :] = (i+1)*10*np.meshgrid(dec_arr, ra_arr)[0]+10*np.meshgrid(dec_arr, ra_arr)[1]+10 aeff_map.meta["TELESCOP"] = "HAWC" #psf map width = 0.2*u.deg rad_axis = MapAxis.from_nodes(np.linspace(0, 2, 50), name="rad", unit="deg") psfMap = PSFMap.from_gauss(energy_true, rad_axis, width) #edispmap edispmap = EDispKernelMap.from_gauss(energy, energy_true, sigma=0.1, bias=0.0, geom=geom_allsky) #events and gti nr_ev = 10 ev_t = Table() gti_t = Table() ev_t['EVENT_ID'] = np.arange(nr_ev) ev_t['TIME'] = nr_ev*[Time('2011-01-01 00:00:00', scale='utc', format='iso')] ev_t['RA'] = np.linspace(-1, 1, nr_ev)*u.deg ev_t['DEC'] = np.linspace(-1, 1, nr_ev)*u.deg ev_t['ENERGY'] = np.logspace(0, 2, nr_ev)*u.TeV gti_t['START'] = [Time('2010-12-31 00:00:00', scale='utc', format='iso')] gti_t['STOP'] = [Time('2011-01-02 00:00:00', scale='utc', format='iso')] events = EventList(ev_t) gti = GTI(gti_t) #define observation obs = Observation( obs_id=0, obs_info={}, gti=gti, aeff=aeff_map, edisp=edispmap, psf=psfMap, bkg=bkg_map, events=events, obs_filter=None, ) #define analysis geometry geom_target = WcsGeom.create( skydir=(0, 0), width=(10, 10), binsz=0.1*u.deg, axes=[energy] ) maker = MapDatasetMaker(selection=["exposure", "counts", "background", "edisp", "psf"]) dataset = MapDataset.create(geom=geom_target, energy_axis_true=energy_true, name="test") dataset = maker.run(dataset, obs) # test counts assert dataset.counts.data.sum() == nr_ev #test background coords_bg = { 'skycoord' : SkyCoord("0 deg", "0 deg"), 'energy' : energy.center[0] } assert_allclose( dataset.background_model.evaluate().get_by_coord(coords_bg)[0], value, atol=1e-7) #test effective area coords_aeff = { 'skycoord' : SkyCoord("0 deg", "0 deg"), 'energy_true' : energy_true.center[0] } assert_allclose( aeff_map.get_by_coord(coords_aeff)[0]/dataset.exposure.get_by_coord(coords_aeff)[0], 1, atol=1e-3) #test edispmap pdfmatrix_preinterp = edispmap.get_edisp_kernel(SkyCoord("0 deg", "0 deg")).pdf_matrix pdfmatrix_postinterp = dataset.edisp.get_edisp_kernel(SkyCoord("0 deg", "0 deg")).pdf_matrix assert_allclose(pdfmatrix_preinterp, pdfmatrix_postinterp, atol=1e-7) #test psfmap geom_psf = geom_target.drop('energy').to_cube([energy_true]) psfkernel_preinterp = psfMap.get_psf_kernel(SkyCoord("0 deg", "0 deg"), geom_psf, max_radius=2*u.deg).data psfkernel_postinterp = dataset.psf.get_psf_kernel(SkyCoord("0 deg", "0 deg"), geom_psf, max_radius=2*u.deg).data assert_allclose(psfkernel_preinterp, psfkernel_postinterp, atol=1e-4)