def check_edisp_normalisation(): import matplotlib.pyplot as plt obs = SpectrumObservation.read(obs_path) p = obs.edisp.data.data.sum(axis=1) e = obs.edisp.data.axis("e_true").nodes plt.plot(e, p) plt.semilogx() plt.show()
def setup(self): self.model = PowerLaw( index=Quantity(2, ""), amplitude=Quantity(1e-11, "m-2 s-1 TeV-1"), reference=Quantity(1, "TeV") ) # TODO: simulate known spectrum instead of using this example: filename = "$GAMMAPY_EXTRA/datasets/hess-crab4_pha/pha_obs23523.fits" self.obs = SpectrumObservation.read(filename) self.seg = SpectrumEnergyGroupMaker(obs=self.obs) ebounds = [0.3, 1.001, 3, 10.001, 30] * u.TeV self.seg.compute_range_safe() self.seg.compute_groups_fixed(ebounds=ebounds) self.groups = self.seg.groups
def setup(self): self.model = PowerLaw( index=Quantity(2, ''), amplitude=Quantity(1e-11, 'm-2 s-1 TeV-1'), reference=Quantity(1, 'TeV'), ) # TODO: simulate known spectrum instead of using this example: filename = '$GAMMAPY_EXTRA/datasets/hess-crab4_pha/pha_obs23523.fits' self.obs = SpectrumObservation.read(filename) self.seg = SpectrumEnergyGroupMaker(obs=self.obs) ebounds = [0.3, 1.001, 3, 10.001, 30] * u.TeV self.seg.compute_range_safe() self.seg.compute_groups_fixed(ebounds=ebounds) self.groups = self.seg.groups
def fit_gammapy(): """ Current results Parameters: name value error unit min max frozen --------- --------- --------- --------------- --- --- ------ index 2.602e+00 1.555e-01 nan nan False amplitude 2.441e-11 3.452e-12 1 / (cm2 s TeV) nan nan False reference 1.000e+00 0.000e+00 TeV nan nan True Covariance: name/name index amplitude --------- -------- --------- index 0.0242 3.79e-13 amplitude 3.79e-13 1.19e-23 Statistic: -157.719 (cash) Fit Range: [1.0000000e+09 2.7825594e+10] keV """ obs = SpectrumObservation.read(obs_path) # obs.peek() # plt.show() model = PowerLaw( amplitude=1.23 * 1e-11 * u.Unit("cm-2 s-1 TeV-1"), reference=1 * u.Unit("TeV"), index=2.14 * u.Unit(""), ) fit = SpectrumFit(obs_list=obs, model=model, fit_range=energy_range, stat="cash") fit.run() print(fit.result[0]) pprint(fit.__dict__) obs = fit.obs_list[0] print(obs) print("This is fit_gammapy") obs.peek() import matplotlib.pyplot as plt plt.savefig("fit_gammapy.png")
def setup(self): pha = gammapy_extra.filename("datasets/hess-crab4_pha/pha_obs23592.fits") self.obs = SpectrumObservation.read(pha) self.best_fit_model = models.PowerLaw(index=2 * u.Unit(''), amplitude=1e-11 * u.Unit('cm-2 s-1 TeV-1'), reference=1 * u.TeV) self.npred = self.obs.predicted_counts(self.best_fit_model).data.value self.covar_axis = ['index', 'amplitude'] self.covar = np.diag([0.1 ** 2, 1e-12 ** 2]) self.fit_range = [0.1, 50] * u.TeV self.fit_result = SpectrumFitResult( model=self.best_fit_model, covariance=self.covar, covar_axis=self.covar_axis, fit_range=self.fit_range, statname='wstat', statval=42, npred=self.npred, obs=self.obs, )
"""Compute flux points This is an example script that show how to compute flux points in Gammapy. TODO: Refactor and add to FluxPointsComputation class or so """ from gammapy.spectrum import (SpectrumObservation, SpectrumFit, FluxPoints, SpectrumResult) import astropy.units as u from astropy.table import Table import numpy as np import copy import matplotlib.pyplot as plt plt.style.use('ggplot') obs = SpectrumObservation.read( '$GAMMAPY_EXTRA/datasets/hess-crab4_pha/pha_obs23523.fits') fit = SpectrumFit(obs) fit.run() best_fit = copy.deepcopy(fit.result[0].fit) # Define Flux points binning emin = np.log10(obs.lo_threshold.to('TeV').value) emax = np.log10(40) binning = np.logspace(emin, emax, 8) * u.TeV # Fix index fit.model.gamma.freeze() # Fit norm in bands diff_flux = list()
"""Test spectrum energy grouping. """ import warnings import astropy.units as u from gammapy.spectrum import SpectrumObservation, SpectrumEnergyGroupMaker warnings.filterwarnings('ignore') filename = '$GAMMAPY_EXTRA/datasets/hess-crab4_pha/pha_obs23523.fits' obs = SpectrumObservation.read(filename) table = obs.stats_table() seg = SpectrumEnergyGroupMaker(obs=obs) ebounds = [0.03, 1, 3, 10, 30] * u.TeV seg.compute_range_safe() seg.compute_groups_fixed(ebounds=ebounds) print('\nTable of original energy bins:') seg.table[['energy_group_idx', 'bin_idx', 'energy_min', 'energy_max']].pprint(max_lines=-1) print('\nTable of grouped energy bins:') seg.groups.to_group_table().pprint(max_lines=-1) print('\nTable of grouped energy bins:') seg.groups.to_total_table().pprint(max_lines=-1) print(seg)
from gammapy.spectrum import ( SpectrumObservation, SpectrumFit, DifferentialFluxPoints, SpectrumFitResult, SpectrumResult ) import astropy.units as u import numpy as np import copy import matplotlib.pyplot as plt plt.style.use('ggplot') obs = SpectrumObservation.read('$GAMMAPY_EXTRA/datasets/hess-crab4_pha/pha_obs23523.fits') fit = SpectrumFit(obs) fit.run() best_fit = copy.deepcopy(fit.result[0].fit) # Define Flux points binning emin = np.log10(obs.lo_threshold.to('TeV').value) emax = np.log10(40) binning = np.logspace(emin, emax, 8) * u.TeV # Fix index fit.model.gamma.freeze() # Fit norm in bands diff_flux = list()
def check_energy_binning_effects(): """Check how spectral fit results change with energy binnings. Actually this is still using the default: In [14]: print(analysis.extraction.observations[0].edisp) EnergyDispersion NDDataArray summary info e_true : size = 108, min = 0.010 TeV, max = 301.416 TeV e_reco : size = 72, min = 0.011 TeV, max = 93.804 TeV Data : size = 7776, min = 0.000, max = 1.000 But now, the fit results from SpectrumAnalysisIACT, which is just driving Fitspectrum, are different, almost the same as Sherpa. Current results Parameters: name value error unit min max frozen --------- --------- --------- --------------- --- --- ------ index 2.620e+00 1.540e-01 nan nan False amplitude 3.849e-11 5.407e-12 1 / (cm2 s TeV) nan nan False reference 1.000e+00 0.000e+00 TeV nan nan True Covariance: name/name index amplitude --------- -------- --------- index 0.0237 5.85e-13 amplitude 5.85e-13 2.92e-23 Statistic: -157.166 (cash) Fit Range: [ 1. 27.82559402] TeV ??? """ data_store = DataStore.from_dir("data/hess") obs_list = data_store.obs_list([23523]) on_region = CircleSkyRegion(conf.crab_position, conf.on_radius["hess"]) fp_binning = [1, 10, 30] * u.TeV exclusion_mask = get_exclusion_mask(conf.crab_position) model = PowerLaw( amplitude=1.23 * 1e-11 * u.Unit("cm-2 s-1 TeV-1"), reference=1 * u.Unit("TeV"), index=2.14 * u.Unit(""), ) cfg = dict( outdir=None, background=dict( on_region=on_region, exclusion_mask=exclusion_mask, # min_distance=0.1 * u.rad, ), extraction=dict(containment_correction=True), fit=dict( model=model, stat="cash", # forward_folded=True, fit_range=energy_range, ), fp_binning=fp_binning, ) analysis = SpectrumAnalysisIACT(obs_list, cfg) analysis.run() analysis.fit.est_errors() print("BEFORE", analysis.fit.result[0]) # print(analysis.extraction.observations[0].edisp) # pprint(analysis.fit.__dict__) # obs = analysis.fit.obs_list[0] # print(obs) # # import IPython; IPython.embed() # obs.peek() # import matplotlib.pyplot as plt # plt.savefig('check_energy_binning_effects.png') # print('This is check_energy_binning_effects') # Try to see if the I/O causes a change in results. analysis.extraction.observations.write("temp123") analysis.extraction.observations.write("temp123", use_sherpa=True) obs = SpectrumObservation.read("temp123/pha_obs23523.fits") model = PowerLaw( amplitude=1.23 * 1e-11 * u.Unit("cm-2 s-1 TeV-1"), reference=1 * u.Unit("TeV"), index=2.14 * u.Unit(""), ) fit = SpectrumFit(obs_list=obs, model=model, fit_range=energy_range, stat="cash") fit.run() print("AFTER", fit.result[0])
from gammapy.spectrum import SpectrumFit, SpectrumObservation, SpectrumFitResult import matplotlib.pyplot as plt import astropy.units as u obs = SpectrumObservation.read('pha_obs31415.fits') fit = SpectrumFit(obs) obs.peek() plt.savefig('observation.png') plt.cla() fit.run() fit.result[0].plot_fit() plt.savefig('debug_fit.png') # TODO: implement properly plt.cla() fig = plt.figure() ax = fig.add_subplot(111) fit.result[0].fit.plot_butterfly(ax=ax, label='Fit result') input_parameters = dict(index = 2.3 * u.Unit(''), norm = 2.5 * 1e-12 * u.Unit('cm-2 s-1 TeV-1'), reference = 1 * u.TeV) input_parameter_errors = dict(index = 0 * u.TeV, norm = 0 * u.Unit('cm-2 s-1 TeV-1'), reference = 0 * u.TeV) input_model = SpectrumFitResult(spectral_model = 'PowerLaw', parameters = input_parameters, parameter_errors = input_parameter_errors)
lw=2, label=name) ax.step(x[start:stop], bkg_counts[start:stop], where='post', lw=1, color=line.get_color(), alpha=0.5) return ax fig, ax = plt.subplots(1, 1) # filenames = glob.glob('./plots/data/joint_crab/spectra/magic/pha_*.fits') filenames = glob.glob('./build/pymc_results/spectra/magic/pha_*.fits') obs = [SpectrumObservation.read(f) for f in filenames] plot_counts(ax, obs, 'MAGIC') filenames = glob.glob('./build/pymc_results/spectra/fact/pha_*.fits') obs = [SpectrumObservation.read(f) for f in filenames] plot_counts(ax, obs, 'FACT') filenames = glob.glob('./build/pymc_results/spectra/veritas/pha_*.fits') obs = [SpectrumObservation.read(f) for f in filenames] plot_counts(ax, obs, 'VERITAS') filenames = glob.glob('./build/pymc_results/spectra/hess/pha_*.fits') obs = [SpectrumObservation.read(f) for f in filenames] plot_counts(ax, obs, 'H.E.S.S') ax.legend()