def peak(line): if (len(sys.argv) != 2): print('Usage: fit_calibrated_peaks.py [run number]') sys.exit() # take calibration parameter for the 'calibration.py' output with open("calDB.json") as f: calDB = json.load(f) cal = calDB["cal_pass1"]["1"]["p1cal"] with open("runDB.json") as f: runDB = json.load(f) meta_dir = os.path.expandvars(runDB["meta_dir"]) tier_dir = os.path.expandvars(runDB["tier_dir"]) #df = pd.read_hdf("{}/Spectrum_{}_2.hdf5".format(meta_dir,sys.argv[1]), key="df") df = pd.read_hdf("{}/t2_run{}.h5".format(tier_dir, sys.argv[1])) df['e_cal'] = cal * df['e_ftp'] df = df.loc[(df.index > 1000) & (df.index < 500000)] def gauss(x, mu, sigma, A=1): """ define a gaussian distribution, w/ args: mu, sigma, area (optional). """ return A * (1. / sigma / np.sqrt(2 * np.pi)) * np.exp(-(x - mu)**2 / (2. * sigma**2)) line_min = 0.995 * line line_max = 1.005 * line nbin = 60 res = 6.3e-4 * line + 0.85 # empirical energy resolution curve from experience hist, bins, var = pgh.get_hist(df['e_cal'], range=(line_min, line_max), dx=(line_max - line_min) / nbin) pgh.plot_hist(hist, bins, var=hist, label="data", color='blue') pars, cov = pga.fit_hist(gauss, hist, bins, var=hist, guess=[line, res, 50]) pgu.print_fit_results(pars, cov, gauss) pgu.plot_func(gauss, pars, label="chi2 fit", color='red') FWHM = '%.2f' % Decimal(pars[1] * 2) FWHM_uncertainty = '%.2f' % Decimal(np.sqrt(cov[1][1]) * 2) peak = '%.2f' % Decimal(pars[0]) peak_uncertainty = '%.2f' % Decimal(np.sqrt(cov[0][0])) residual = '%.2f' % abs(line - float(peak)) label_01 = 'Peak = ' + str(peak) + r' $\pm$ ' + str(peak_uncertainty) label_02 = 'FWHM = ' + str(FWHM) + r' $\pm$ ' + str(FWHM_uncertainty) labels = [ label_01, label_02, ] plt.xlim(line_min, line_max) plt.xlabel('Energy (keV)', ha='right', x=1.0) plt.ylabel('Counts', ha='right', y=1.0) plt.tight_layout() plt.hist(df['e_cal'], range=(line_min, line_max), bins=nbin) plt.legend(labels, frameon=False, loc='upper right', fontsize='small') return peak, FWHM
def peak(df, runDB, calDB, r, line, p=[1, 0], plotit=False): cal = 0.04998 # calDB["cal_pass1"]["1"]["p1cal"] meta_dir = os.path.expandvars(runDB["meta_dir"]) tier_dir = os.path.expandvars(runDB["tier2_dir"]) df['e_cal'] = p[0] * (cal * df['e_ftp']) + p[1] #h = df.hist('e_cal',bins=2000) #plt.yscale('log') df = df.loc[(df.index > 1000) & (df.index < 500000)] def gauss(x, mu, sigma, A=1): """ define a gaussian distribution, w/ args: mu, sigma, area (optional). """ return A * (1. / sigma / np.sqrt(2 * np.pi)) * np.exp(-(x - mu)**2 / (2. * sigma**2)) line_min = 0.995 * line line_max = 1.005 * line nbin = 60 res = 6.3e-4 * line + 0.85 # empirical energy resolution curve from experience hist, bins, var = pgh.get_hist(df['e_cal'], range=(line_min, line_max), dx=(line_max - line_min) / nbin) if plotit: pgh.plot_hist(hist, bins, var=hist, label="data", color='blue') pars, cov = pga.fit_hist(gauss, hist, bins, var=hist, guess=[line, res, 50]) pgu.print_fit_results(pars, cov, gauss) if plotit: pgu.plot_func(gauss, pars, label="chi2 fit", color='red') FWHM = '%.2f' % Decimal( pars[1] * 2. * np.sqrt(2. * np.log(2))) # convert sigma to FWHM FWHM_uncertainty = '%.2f' % Decimal( np.sqrt(cov[1][1]) * 2. * np.sqrt(2. * np.log(2))) peak = '%.2f' % Decimal(pars[0]) peak_uncertainty = '%.2f' % Decimal(np.sqrt(cov[0][0])) residual = '%.2f' % abs(line - float(peak)) if plotit: label_01 = 'Peak = ' + str(peak) + r' $\pm$ ' + str(peak_uncertainty) label_02 = 'FWHM = ' + str(FWHM) + r' $\pm$ ' + str(FWHM_uncertainty) labels = [ label_01, label_02, ] plt.xlim(line_min, line_max) plt.xlabel('Energy (keV)', ha='right', x=1.0) plt.ylabel('Counts', ha='right', y=1.0) plt.tight_layout() plt.hist(df['e_cal'], range=(line_min, line_max), bins=nbin) plt.legend(labels, frameon=False, loc='upper right', fontsize='small') plt.savefig(meta_dir + '/plots/lineFit_' + str(r) + '.png') return peak, FWHM
def peak_352(): if (len(sys.argv) != 2): print('Usage: fit_bkg_peaks.py [run number]') sys.exit() with open("runDB.json") as f: runDB = json.load(f) meta_dir = os.path.expandvars(runDB["meta_dir"]) #df = pd.read_hdf("{}/Spectrum_280-329.hdf5".format(meta_dir), key="df") df = pd.read_hdf("{}/Spectrum_{}.hdf5".format(meta_dir, sys.argv[1]), key="df") def gauss(x, mu, sigma, A=1): """ define a gaussian distribution, w/ args: mu, sigma, area (optional). """ return A * (1. / sigma / np.sqrt(2 * np.pi)) * np.exp(-(x - mu)**2 / (2. * sigma**2)) def radford_peak(x, mu, sigma, hstep, htail, tau, bg0, a=1): """ David Radford's HPGe peak shape function """ # make sure the fractional amplitude parameters stay reasonable... if htail < 0 or htail > 1: return np.zeros_like(x) if hstep < 0 or hstep > 1: return np.zeros_like(x) bg_term = bg0 #+ x*bg1 if np.any(bg_term < 0): return np.zeros_like(x) # compute the step and the low energy tail step = a * hstep * erfc((x - mu) / (sigma * np.sqrt(2))) le_tail = a * htail le_tail *= erfc((x - mu) / (sigma * np.sqrt(2)) + sigma / (tau * np.sqrt(2))) le_tail *= np.exp((x - mu) / tau) le_tail /= (2 * tau * np.exp(-(sigma / (np.sqrt(2) * tau))**2)) # add up all the peak shape components return (1 - htail) * gauss(x, mu, sigma, a) + bg_term + step + le_tail hist, bins, var = pgh.get_hist(df['e_cal'], range=(345, 360), dx=0.5) pgh.plot_hist(hist, bins, var=hist, label="data") pars, cov = pga.fit_hist(radford_peak, hist, bins, var=hist, guess=[352, 1.05, 0.001, 0.02, 500, 1000, 40000]) pgu.print_fit_results(pars, cov, radford_peak) pgu.plot_func(radford_peak, pars, label="chi2 fit", color='red') #x_vals = np.arange(345,360,0.5) #plt.plot(x_vals, radford_peak(x_vals, 353, 1.05, .001, 0.02, 500, 1000, 40000)) FWHM = '%.2f' % Decimal(pars[1] * 2) FWHM_uncertainty = '%.2f' % Decimal(np.sqrt(cov[1][1]) * 2) peak = '%.2f' % Decimal(pars[0]) peak_uncertainty = '%.2f' % Decimal(np.sqrt(cov[0][0])) residual = '%.2f' % (351.93 - float(peak)) #chi_2_element_list = [] #for i in range(len(hist)): #chi_2_element = abs((radford_peak(bins[i], *pars) - hist[i])**2/radford_peak(bins[i], *pars)) #chi_2_element_list.append(chi_2_element) #chi_2 = sum(chi_2_element_list) #reduced_chi_2 = '%.2f' % Decimal(chi_2/len(hist)) label_01 = '351.93 keV peak fit' label_02 = 'FWHM = ' + str(FWHM) + r' $\pm$ ' + str(FWHM_uncertainty) label_03 = 'Peak = ' + str(peak) + r' $\pm$ ' + str(peak_uncertainty) label_04 = 'Residual = ' + str(residual) + r' $\pm$ ' + str( peak_uncertainty) colors = ['red', 'red', 'red', 'red'] lines = [Line2D([0], [0], color=c, lw=2) for c in colors] labels = [label_01, label_02, label_03, label_04] plt.xlim(345, 360) plt.ylim(0, plt.ylim()[1]) plt.xlabel('Energy (keV)', ha='right', x=1.0) plt.ylabel('Counts', ha='right', y=1.0) plt.tight_layout() #plt.semilogy() plt.legend(lines, labels, frameon=False, loc='upper right', fontsize='small') plt.show()