def check_bkg(label): irf_file = '1dc/1dc/caldb/data/cta/1dc/bcf/' + label + '/irf_file.fits' log.info(f'Reading {irf_file}') plt.clf() bkg = Background3D.read(irf_file, hdu='BACKGROUND') table = bkg.data.data raise NotImplementedError # Columns: # BGD float32 (21, 36, 36) 1/s/MeV/sr # ENERG_LO float32 (21,) TeV # DETX_LO float32 (36,) deg # DETY_LO float32 (36,) deg for idx_detx in [18, 21, 22, 23, 24, 25, 26, 27]: detx = table['DETX_LO'].data.squeeze()[idx_detx] dety = table['DETY_LO'].data.squeeze()[18] energy = table['ENERG_LO'].data.squeeze() bkg = table['BGD'].data.squeeze()[:, idx_detx, 18] txt = f'detx={detx:.1f}, dety={dety:.1f}' plt.plot(energy, bkg, label=txt) plt.legend(loc='lower left') plt.xlabel('Energy (TeV)') plt.xlim(0.01, 1) plt.ylim(1e-6, 1) plt.ylabel('Background rate (s-1 MeV-1 sr-1)') plt.loglog() filename = 'checks/irfs/' + label + '_bkg.png' log.info(f'Writing {filename}') plt.savefig(filename)
def get_irfs(): filename = '$GAMMAPY_EXTRA/datasets/cta-1dc/caldb/data/cta//1dc/bcf/South_z20_50h/irf_file.fits' psf = EnergyDependentMultiGaussPSF.read(filename, hdu='POINT SPREAD FUNCTION') aeff = EffectiveAreaTable2D.read(filename, hdu='EFFECTIVE AREA') edisp = EnergyDispersion2D.read(filename, hdu='ENERGY DISPERSION') bkg = Background3D.read(filename, hdu='BACKGROUND') return dict(psf=psf, aeff=aeff, edisp=edisp, bkg=bkg)
def read(cls, filename): """Read from a FITS file. Parameters ---------- filename : `str` File containing the IRFs """ filename = str(make_path(filename)) hdu_list = fits.open(filename) aeff = EffectiveAreaTable2D.read(filename, hdu='EFFECTIVE AREA') bkg = Background3D.read(filename, hdu='BACKGROUND') edisp = EnergyDispersion2D.read(filename, hdu='ENERGY DISPERSION') psf = EnergyDependentMultiGaussPSF.read(filename, hdu='POINT SPREAD FUNCTION') if 'SENSITIVITY' in hdu_list: sensi = SensitivityTable.read(filename, hdu='SENSITIVITY') else: sensi = None return cls( aeff=aeff, bkg=bkg, edisp=edisp, psf=psf, ref_sensi=sensi, )
def background_3d_plot(irf_file_path, ax=None, hdu="BACKGROUND"): if not ax: fig = plt.figure(figsize=(10, 7), ) ax = fig.add_subplot(111, projection='3d') bkg3d = Background3D.read(irf_file_path, hdu=hdu) energy_reco = np.logspace(-2, 2, 20) * u.TeV offset_centers = _bin_center(bkg3d.data.axes[1].bins) data = bkg3d.data.data.sum(axis=0).value data = _log_data(data) vmin, vmax = -4, 1.5 data = np.clip(data, vmin, vmax) X, Y = np.meshgrid(offset_centers, offset_centers) X, Y, Z, = X.ravel(), Y.ravel(), gaussian_filter(data, sigma=0.8).ravel() surf = ax.plot_trisurf(X, Y, Z, cmap='viridis', antialiased=True) ax.zaxis.set_major_locator(mticker.FixedLocator([ -4, -3, -2, -1, 0, 1, ])) ax.zaxis.set_major_formatter(mticker.FuncFormatter(_log_tick_formatter)) ax.set_zlim([-4, 1]) return ax
def get_irfs(config, filename): '''Get IRFs from file. Parameters ---------- config : `dict` Configuration dictionary. filename : fits file IRFs file Returns ------- irfs : `dict` IRFs dictionary. ''' offset = Angle(config['selection']['offset_fov'] * u.deg) psf_fov = EnergyDependentMultiGaussPSF.read(filename, hdu='POINT SPREAD FUNCTION') psf = psf_fov.to_energy_dependent_table_psf(theta=offset) print(' psf', psf) aeff = EffectiveAreaTable2D.read(filename, hdu='EFFECTIVE AREA') edisp_fov = EnergyDispersion2D.read(filename, hdu='ENERGY DISPERSION') table = fits.open('irf_file.fits')['BACKGROUND'] table.columns.change_name(str('BGD'), str('Bgd')) table.header['TUNIT7'] = '1 / (MeV s sr)' bkg = Background3D.read(filename, hdu='BACKGROUND') irfs = dict(psf=psf, aeff=aeff, edisp=edisp_fov, bkg=bkg, offset=offset) return irfs
def test_background_3d_read_gadf(): filename = "$GAMMAPY_DATA/tests/irf/bkg_3d_full_example.fits" bkg = Background3D.read(filename) data = bkg.quantity assert bkg.axes.names == ["energy", "fov_lon", "fov_lat"] assert data.shape == (20, 15, 15) assert data.unit == "s-1 MeV-1 sr-1"
def test_background_3D_read(): filename = ( "$GAMMAPY_DATA/cta-1dc/caldb/data/cta/1dc/bcf/South_z20_50h/irf_file.fits" ) bkg = Background3D.read(filename) data = bkg.data.data assert data.shape == (21, 36, 36) assert data.unit == "s-1 MeV-1 sr-1"
def get_irfs(): """Load CTA IRFs""" filename = "$GAMMAPY_DATA/cta-1dc/caldb/data/cta/1dc/bcf/South_z20_50h/irf_file.fits" psf = EnergyDependentMultiGaussPSF.read(filename, hdu="POINT SPREAD FUNCTION") aeff = EffectiveAreaTable2D.read(filename, hdu="EFFECTIVE AREA") edisp = EnergyDispersion2D.read(filename, hdu="ENERGY DISPERSION") bkg = Background3D.read(filename, hdu="BACKGROUND") return dict(psf=psf, aeff=aeff, edisp=edisp, bkg=bkg)
def test_background_3d_read(): filename = ( "$GAMMAPY_DATA/cta-1dc/caldb/data/cta/1dc/bcf/South_z20_50h/irf_file.fits" ) bkg = Background3D.read(filename) data = bkg.quantity assert bkg.axes.names == ["energy", "fov_lon", "fov_lat"] assert data.shape == (21, 36, 36) assert data.unit == "s-1 MeV-1 sr-1"
def load(self): """Load HDU as appropriate class. TODO: this should probably go via an extensible registry. """ hdu_class = self.hdu_class filename = self.path() hdu = self.hdu_name if hdu_class == "events": from gammapy.data import EventList return EventList.read(filename, hdu=hdu) elif hdu_class == "gti": from gammapy.data import GTI return GTI.read(filename, hdu=hdu) elif hdu_class == "aeff_2d": from gammapy.irf import EffectiveAreaTable2D return EffectiveAreaTable2D.read(filename, hdu=hdu) elif hdu_class == "edisp_2d": from gammapy.irf import EnergyDispersion2D return EnergyDispersion2D.read(filename, hdu=hdu) elif hdu_class == "psf_table": from gammapy.irf import PSF3D return PSF3D.read(filename, hdu=hdu) elif hdu_class == "psf_3gauss": from gammapy.irf import EnergyDependentMultiGaussPSF return EnergyDependentMultiGaussPSF.read(filename, hdu=hdu) elif hdu_class == "psf_king": from gammapy.irf import PSFKing return PSFKing.read(filename, hdu=hdu) elif hdu_class == "bkg_2d": from gammapy.irf import Background2D return Background2D.read(filename, hdu=hdu) elif hdu_class == "bkg_3d": from gammapy.irf import Background3D return Background3D.read(filename, hdu=hdu) else: raise ValueError(f"Invalid hdu_class: {hdu_class}")
def test_writeread(self, tmp_path): path = tmp_path / "tmp.fits" fits.HDUList([ fits.PrimaryHDU(), self.aeff.to_table_hdu(), self.edisp.to_table_hdu(), self.bkg.to_table_hdu(), ]).writeto(path) read_aeff = EffectiveAreaTable2D.read(path, hdu="EFFECTIVE AREA") assert_allclose(read_aeff.data.data, self.aeff_data) read_edisp = EnergyDispersion2D.read(path, hdu="ENERGY DISPERSION") assert_allclose(read_edisp.data.data, self.edisp_data) read_bkg = Background3D.read(path, hdu="BACKGROUND") assert_allclose(read_bkg.data.data, self.bkg_data)
def test_background_3d_read_write(tmp_path, bkg_3d): bkg_3d.to_fits().writeto(tmp_path / "bkg3d.fits") bkg_3d_2 = Background3D.read(tmp_path / "bkg3d.fits") axis = bkg_3d_2.data.axis("energy") assert axis.nbin == 2 assert axis.unit == "TeV" axis = bkg_3d_2.data.axis("fov_lon") assert axis.nbin == 3 assert axis.unit == "deg" axis = bkg_3d_2.data.axis("fov_lat") assert axis.nbin == 3 assert axis.unit == "deg" data = bkg_3d_2.data.data assert data.shape == (2, 3, 3) assert data.unit == "s-1 MeV-1 sr-1"
def test_writeread(self, tmpdir): filename = str(tmpdir / "testirf.fits") fits.HDUList([ fits.PrimaryHDU(), self.aeff.to_fits(), self.edisp.to_fits(), self.bkg.to_fits(), ]).writeto(filename) read_aeff = EffectiveAreaTable2D.read(filename=filename, hdu="EFFECTIVE AREA") assert_allclose(read_aeff.data.data, self.aeff_data) read_edisp = EnergyDispersion2D.read(filename=filename, hdu="ENERGY DISPERSION") assert_allclose(read_edisp.data.data, self.edisp_data) read_bkg = Background3D.read(filename=filename, hdu="BACKGROUND") assert_allclose(read_bkg.data.data, self.bkg_data)
def test_background_3d_read_write(tmp_path, bkg_3d): bkg_3d.to_table_hdu().writeto(tmp_path / "bkg3d.fits") bkg_3d_2 = Background3D.read(tmp_path / "bkg3d.fits") axis = bkg_3d_2.axes["energy"] assert axis.nbin == 2 assert axis.unit == "TeV" axis = bkg_3d_2.axes["fov_lon"] assert axis.nbin == 3 assert axis.unit == "deg" axis = bkg_3d_2.axes["fov_lat"] assert axis.nbin == 3 assert axis.unit == "deg" data = bkg_3d_2.quantity assert data.shape == (2, 3, 3) assert data.unit == "s-1 GeV-1 sr-1"
def bkg_3d(): filename = ( "$GAMMAPY_DATA/cta-1dc/caldb/data/cta/1dc/bcf/South_z20_50h/irf_file.fits" ) return Background3D.read(filename, hdu="BACKGROUND")
"""Example of how to create an ObservationCTA from CTA's 1DC""" from gammapy.data import ObservationCTA, EventList, GTI from gammapy.irf import ( EnergyDependentMultiGaussPSF, EffectiveAreaTable2D, EnergyDispersion2D, Background3D, ) filename = "$GAMMAPY_DATA/cta-1dc/data/baseline/gps/gps_baseline_110380.fits" event_list = EventList.read(filename) gti = GTI.read(filename) filename = "$GAMMAPY_DATA/cta-1dc/caldb/data/cta/1dc/bcf/South_z20_50h/irf_file.fits" aeff = EffectiveAreaTable2D.read(filename) bkg = Background3D.read(filename) edisp = EnergyDispersion2D.read(filename, hdu="Energy Dispersion") psf = EnergyDependentMultiGaussPSF.read(filename, hdu="Point Spread Function") obs = ObservationCTA( obs_id=event_list.table.meta["OBS_ID"], events=event_list, gti=gti, psf=psf, aeff=aeff, edisp=edisp, bkg=bkg, pointing_radec=event_list.pointing_radec, observation_live_time_duration=event_list.observation_live_time_duration, observation_dead_time_fraction=event_list.observation_dead_time_fraction, )
# This is how for analysis you could slice out the PSF # at a given field of view offset psf.to_energy_dependent_table_psf("1 deg") # ### Background # # The hadronic background for CTA DC-1 is given as a template model with an absolute rate that depends on `energy`, `detx` and `dety`. The coordinates `detx` and `dety` are angles in the "field of view" coordinate frame. # # Note that really the background model for DC-1 and most CTA IRFs produced so far are radially symmetric, i.e. only depend on the FOV offset. The background model here was rotated to fill the FOV in a rotationally symmetric way, for no good reason. # In[ ]: from gammapy.irf import Background3D bkg = Background3D.read(irf_filename, hdu="BACKGROUND") print(bkg) # In[ ]: # TODO: implement a peek method for Background3D # bkg.peek() # In[ ]: bkg.data.evaluate(energy="3 TeV", fov_lon="1 deg", fov_lat="0 deg") # ## Index files and DataStore # # As we saw, you can access all of the CTA data using Astropy and Gammapy. #
"""Plot the background rate from the HESS DL3 data release 1.""" import matplotlib.pyplot as plt from gammapy.irf import Background3D filename = "$GAMMAPY_DATA/hess-dl3-dr1/data/hess_dl3_dr1_obs_id_020136.fits.gz" bkg = Background3D.read(filename, hdu="BKG") bkg.peek() plt.show()