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 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 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_aeff2d_pointlike(): filename = "$GAMMAPY_DATA/joint-crab/dl3/magic/run_05029748_DL3.fits" aeff = EffectiveAreaTable2D.read(filename) hdu = aeff.to_table_hdu() assert aeff.is_pointlike assert hdu.header["HDUCLAS3"] == "POINT-LIKE"
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 check_aeff(label): irf_file = '1dc/1dc/caldb/data/cta/1dc/bcf/' + label + '/irf_file.fits' log.info(f'Reading {irf_file}') aeff = EffectiveAreaTable2D.read(irf_file, hdu='EFFECTIVE AREA') aeff.peek() filename = 'checks/irfs/' + label + '_aeff.png' log.info(f'Writing {filename}') plt.savefig(filename)
def test_effective_area2d_gammapy(aeff2d_hdus): '''Test our effective area is readable by gammapy''' from gammapy.irf import EffectiveAreaTable2D area, hdus = aeff2d_hdus for hdu in hdus: with tempfile.NamedTemporaryFile(suffix='.fits') as f: fits.HDUList([fits.PrimaryHDU(), hdu]).writeto(f.name) # test reading with gammapy works aeff2d = EffectiveAreaTable2D.read(f.name) assert u.allclose(area, aeff2d.data.data, atol=1e-16 * u.m**2)
def get_exposure(geom_etrue): filename = ( "$GAMMAPY_DATA/cta-1dc/caldb/data/cta/1dc/bcf/South_z20_50h/irf_file.fits" ) aeff = EffectiveAreaTable2D.read(filename, hdu="EFFECTIVE AREA") exposure_map = make_map_exposure_true_energy( pointing=SkyCoord(1, 0.5, unit="deg", frame="galactic"), livetime=1 * u.hr, aeff=aeff, geom=geom_etrue, ) return exposure_map
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 get_irfs(config): filename = '$GAMMAPY_EXTRA/datasets/cta-1dc/caldb/data/cta//1dc/bcf/South_z20_50h/irf_file.fits' 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') edisp = edisp_fov.to_energy_dispersion(offset=offset) # TODO: read background once it's working! # bkg = Background3D.read(filename, hdu='BACKGROUND') return dict(psf=psf, aeff=aeff, edisp=edisp)
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 get_irfs(config): filename = '$GAMMAPY_EXTRA/datasets/cta-1dc/caldb/data/cta//1dc/bcf/South_z20_50h/irf_file.fits' 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') edisp = edisp_fov.to_energy_dispersion(offset=offset) # TODO: read background once it's working! # bkg = Background3D.read(filename, hdu='BACKGROUND') return dict(psf=psf, aeff=aeff, edisp=edisp)
def test_effective_area2d(): '''Test our effective area is readable by gammapy''' pytest.importorskip('gammapy') from pyirf.io import create_aeff2d_hdu from gammapy.irf import EffectiveAreaTable2D e_bins = np.geomspace(0.1, 100, 31) * u.TeV fov_bins = [0, 1, 2, 3] * u.deg area = np.full((30, 3), 1e6) * u.m**2 for point_like in [True, False]: with tempfile.NamedTemporaryFile(suffix='.fits') as f: hdu = create_aeff2d_hdu(area, e_bins, fov_bins, point_like=point_like) fits.HDUList([fits.PrimaryHDU(), hdu]).writeto(f.name) # test reading with gammapy works aeff2d = EffectiveAreaTable2D.read(f.name) assert u.allclose(area, aeff2d.data.data, atol=1e-16 * u.m**2)
def effective_area_3d_plot(irf_file_path, ax=None, hdu="EFFECTIVE AREA"): if not ax: fig = plt.figure(figsize=(10, 7), ) ax = fig.add_subplot(111, projection='3d') energy_reco = np.logspace(-2, 2, 20) * u.TeV offsets = np.linspace(0, 6, 13) * u.deg aeff = EffectiveAreaTable2D.read(irf_file_path, hdu=hdu) X, Y = np.meshgrid(_bin_center(energy_reco), offsets) Z = [] for offset in offsets: t = aeff.to_effective_area_table(offset=offset, energy=energy_reco) Z.append(t.data.data) Z = np.vstack(Z).value * u.m**2 X, Y, Z = np.log10( X.to_value('TeV')).ravel(), Y.ravel(), Z.to('km2').ravel() surf = ax.plot_trisurf(X, Y, Z, cmap='viridis', vmin=0, vmax=np.nanpercentile(Z, 99), antialiased=True) ax.xaxis.set_major_formatter(mticker.FuncFormatter(_log_tick_formatter)) ax.view_init(15, -140) ax.set_ylabel('Offset in FoV / deg') ax.set_zlabel('Effective Area / $km^2$') ax.set_xlabel('Reconstructed Energy / TeV') return ax
"""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, )
def aeff(): filename = ( "$GAMMAPY_DATA/cta-1dc/caldb/data/cta/1dc/bcf/South_z20_50h/irf_file.fits" ) return EffectiveAreaTable2D.read(filename, hdu="EFFECTIVE AREA")
def aeff(): filename = "$GAMMAPY_DATA/hess-dl3-dr1/data/hess_dl3_dr1_obs_id_023523.fits.gz" return EffectiveAreaTable2D.read(filename, hdu="AEFF")
"""Plot the effective area at a given offset""" import matplotlib.pyplot as plt from astropy.coordinates import Angle from gammapy.irf import EffectiveAreaTable2D filename = "$GAMMAPY_DATA/hess-dl3-dr1/data/hess_dl3_dr1_obs_id_020136.fits.gz" aeff = EffectiveAreaTable2D.read(filename, hdu="AEFF") # offset at which we want to examine the effective area offset = Angle("0.5 deg") aeff_table = aeff.to_effective_area_table(offset=offset) aeff_table.plot() plt.show()
import matplotlib.pyplot as plt import numpy as np import astropy.units as u from astropy.coordinates import SkyCoord from gammapy.irf import EffectiveAreaTable2D from gammapy.maps import WcsGeom, MapAxis, WcsNDMap from gammapy.spectrum.models import PowerLaw from gammapy.image.models import SkyGaussian from gammapy.utils.random import get_random_state from gammapy.cube import make_map_exposure_true_energy, MapFit, MapEvaluator from gammapy.cube.models import SkyModel filename = "$GAMMAPY_DATA/cta-1dc/caldb/data/cta/1dc/bcf/South_z20_50h/irf_file.fits" aeff = EffectiveAreaTable2D.read(filename, hdu="EFFECTIVE AREA") # Define sky model to simulate the data lon_0_1 = 0.2 lon_0_2 = 0.4 lat_0_1 = 0.1 lat_0_2 = 0.6 spatial_model_1 = SkyGaussian( lon_0=lon_0_1 * u.deg, lat_0=lat_0_1 * u.deg, sigma="0.3 deg" ) spatial_model_2 = SkyGaussian( lon_0=lon_0_2 * u.deg, lat_0=lat_0_2 * u.deg, sigma="0.2 deg" ) spectral_model_1 = PowerLaw( index=3, amplitude="1e-11 cm-2 s-1 TeV-1", reference="1 TeV" )
from gammapy.spectrum.models import PowerLaw import os #now reading IRFs from one particular observation DIR = "/Users/asinha/HESS_data/ash_stereo/run054200-054399/run054213/" files = os.listdir(DIR) for afile in files: if afile[0:4] == "aeff": f_ar = str(DIR + afile) if afile[0:5] == "edisp": f_edp = str(DIR + afile) if afile[0:3] == "psf": f_psf = str(DIR + afile) aeff = EffectiveAreaTable2D.read(f_ar, hdu='EFFECTIVE AREA') edisp = EnergyDispersion2D.read(f_edp) #psf = EnergyDependentMultiGaussPSF.read(f_psf, hdu='POINT SPREAD FUNCTION') # Define obs parameters livetime = 1.0 * u.hr offset = 0.01 * u.deg lo_threshold = 0.1 * u.TeV hi_threshold = 60 * u.TeV # Define spectral model index = 2.0 * u.Unit('') amplitude = 2.5 * 1e-10 * u.Unit('cm-2 s-1 TeV-1') reference = 1 * u.TeV model = PowerLaw(index=index, amplitude=amplitude, reference=reference)
"cta-1dc/caldb/data/cta/1dc/bcf/South_z20_50h/irf_file.fits", ) from astropy.io import fits hdu_list = fits.open(irf_filename) hdu_list.info() # ### Effective area # # The effective area is given as a 2-dim array with energy and field of view offset axes. # In[ ]: from gammapy.irf import EffectiveAreaTable2D aeff = EffectiveAreaTable2D.read(irf_filename, hdu="EFFECTIVE AREA") # In[ ]: type(aeff) # In[ ]: type(aeff.data) # In[ ]: print(aeff.data) # In[ ]: