def make_x_plot(): energy_min = np.array([300]) energy_max = np.array([1000]) energies = np.array(_energy_lafferty_power_law(energy_min, energy_max, SPECTRAL_INDEX)) diff_flux = power_law_eval(energies, 1, SPECTRAL_INDEX, 1) # `True' differential & integral fluxes int_flux = power_law_integral_flux(diff_flux, SPECTRAL_INDEX, energies, energy_min, energy_max) # Put data into table table = Table() table['ENERGY_MIN'] = energy_min table['ENERGY_MAX'] = energy_max table['INT_FLUX'] = int_flux lafferty_array = [] log_array = [] spectral_indices = np.arange(1.1, 6, 0.01) for spectral_index in spectral_indices: lafferty_flux, log_flux = get_flux_tables(table, 'power_law', None, spectral_index) residuals_lafferty = ((np.log(lafferty_flux['ENERGY']) - np.log(energy_min)) / (np.log(energy_max)-np.log(energy_min))) residuals_log = ((np.log(log_flux['ENERGY']) - np.log(energy_min)) / (np.log(energy_max)-np.log(energy_min))) lafferty_array.append(residuals_lafferty[0]) log_array.append(residuals_log[0]) plt.plot(spectral_indices, lafferty_array, color='k', linewidth=1, ms=0, label='Lafferty Method') plt.plot(spectral_indices, log_array, color='r', linewidth=1, ms=0, label='Log Center Method') plt.legend() plt.ylabel('X position in bin') plt.xlabel('Guessed spectral Index')
def compute_flux_error(gamma_true, gamma_reco, method): # Let's assume a concrete true spectrum and energy bin. # Note that the residuals computed below do *not* depend on # these parameters. energy_min, energy_max = 1, 10 energy_ref, diff_flux_ref = 1, 1 # Compute integral flux in the energy band assuming `gamma_true` int_flux = power_law_integral_flux(diff_flux_ref, gamma_true, energy_ref, energy_min, energy_max) # Compute flux point table = compute_differential_flux_points(method, 'power_law', spectral_index=gamma_reco, energy_min=energy_min, energy_max=energy_max, int_flux=int_flux) # Compute relative error of the flux point energy = table['ENERGY'].data flux_reco = table['DIFF_FLUX'].data flux_true = power_law_eval(energy, diff_flux_ref * np.ones_like(energy), np.array(gamma_true).reshape(energy.shape), energy_ref * np.ones_like(energy)) flux_true = flux_true.reshape(gamma_true.shape) flux_reco = flux_reco.reshape(gamma_true.shape) flux_error = (flux_reco - flux_true) / flux_true return flux_error