Gli errori dei fit si estraggono dalla matrice di covarianza che viene "restituita" dal comando di fit. Vedere in fondo come.
Per i più curiosi: discussione moooooolto approfondita
import uproot
import matplotlib.pyplot as plt
import numpy as np
import scipy.optimize as opt
# ho trasformato histo di paw in root (con h2root)
histos = uproot.open('gamma_020006.hbk.root')
# prendo il 2000
h2000 = histos['h2000']
# per comodità metto gli edge dei bin in "x" e i valori in "y"
x = h2000.bins[:,0]
y = h2000.values
# plot
plt.plot(x,y, drawstyle='steps', color='k')
plt.title('histo 2000')
plt.show()
# definisco esponenziale
def expo(x,A,B):
return np.exp(A + B*x)
# range da fittare
sel = (x > 510) & (x < 1000)
# inizializzazione parametri (per fit non banali serve)
init_pars = [10, -0.01]
p, cov = opt.curve_fit(expo,x[sel],y[sel], p0=init_pars)
In p
e cov
si intercettano i "risultati" del fit. In particolare:
Gli errori sui parametri si possono calcolare dalla radice quadrata della diagonale della matrice di covarianza, cioè:
errp = np.sqrt(np.diag(cov))
# stampo per leggerli
for i in range(2):
print('Parametro',p[i],' -> errore',errp[i])
Plot finale con risultato fit e relativi errori scritti sul plot
plt.plot(x,y, label='dati', drawstyle='steps', color='k')
label_da_mettere = f'fit exp(A+Bx)\nconst = {p[0]:.2f} ± {errp[0]:.2}\ntau = {p[1]:.2E} ± {errp[1]:.2E}'
plt.plot(x[sel], expo(x[sel], *p), '--r', linewidth=2, label=label_da_mettere)
plt.legend(fontsize=12)
plt.show()