Compare commits

...

2 commits

Author SHA1 Message Date
Ava
ca7358e95a ADD Ecalib 2025-02-26 12:20:12 +01:00
Ava
afec9ea818 Update BB-chaos 2025-02-26 12:19:58 +01:00
4 changed files with 226 additions and 51 deletions

View file

@ -30,13 +30,13 @@ particles = {
'z': 1
},
'Helium': {
'E0_min': 10, # MeV
'E0_min': 100, # MeV
'E0_max': 5000, # MeV
'm0': 6.644657e-27,
'z': 2
},
'Muon': {
'E0_min': 10, # MeV
'E0_min': 1 , # MeV
'E0_max': 5000, # MeV
'm0': 1.883531627e-28,
'z': 1
@ -99,6 +99,22 @@ materials = {
'd': 2e-2
}
}
materials = {
'Si': {
'ne': (2.336e3 / (28.085e-3)) * 14.0 * N_A, # Elektronendichte in Si
'I': 173 * e, # Ionisierungsenergie in Silizium in J
'd': 300e-6 # Dicke in m (300um)
},
'BGO': {
# Elektronendichte in BGO berechnen (gewichteter Durchschnitt)
'ne': (4 * (9.78e3 / (208.98e-3)) * 83 * N_A + 3 * (5.323e3 / (72.63e-3)) * 32 * N_A + 12 * (1.429e3 / (16.00e-3)) * 8 * N_A) / (4 + 3 + 12),
# Ionisierungsenergie in BGO (gewichteter Durchschnitt)
'I': (4 * 250 * e + 3 * 290 * e + 12 * 150 * e) / (4 + 3 + 12),
# Dicke in m (2cm)
'd': 2e-2
}
}
# #Output the parameters for each material
# print("Materials and their parameters:\n")
@ -162,6 +178,11 @@ def plot_Eloss_E():
'BGO': '-' # Linienstil für BGO (nun geändert)
}
linestyles = {
'Si': '-', # Linienstil für Si
'BGO': ':' # Linienstil für BGO (nun geändert)
}
colors = {
'Proton': 'red',
'Helium': 'green',
@ -181,7 +202,8 @@ def plot_Eloss_E():
E = np.linspace(particle_params['E0_min'], particle_params['E0_max'], 100000) * 1e6 * e # Umrechnung in Joule
dEdx = bethebloch(E, particle_params['m0'], particle_params['z'], params['ne'], params['I'])
dEdx_cm = dEdx / (1e6 * e) * 1e-2 # eV/m to MeV/cm
linewidth = 1.5 if material != 'BGO' else 3
#linewidth = 1.5 if material != 'BGO' else 3
linewidth = 2
plt.plot(E / (1e6 * e), dEdx_cm, color=colors[name], linestyle=linestyles[material], linewidth=linewidth)
if f'{name}' not in legend_particle_labels:
@ -193,11 +215,11 @@ def plot_Eloss_E():
plt.xscale('log')
plt.yscale('log')
plt.xlabel('kinetic energy E [MeV]')
plt.ylabel('Stopping Power in MeV/cm')
plt.xlabel('kinetic energy E [MeV]',fontsize=15)
plt.ylabel('stopping power in MeV/cm',fontsize=15)
plt.title('Energy loss in Si, BGO, Bi, Ge, and O')
legend_particle = plt.legend(handles=legend_particle_handles, labels=legend_particle_labels, loc='upper center', title="Particles", frameon=True, fontsize=12*1.5)
legend_material = plt.legend(handles=legend_material_handles, labels=legend_material_labels, loc='lower left', title="Materials", frameon=True, fontsize=12*1.5)
legend_particle = plt.legend(handles=legend_particle_handles, labels=legend_particle_labels, loc='lower left', title="Particles", frameon=True, fontsize=15, title_fontsize=15)
legend_material = plt.legend(handles=legend_material_handles, labels=legend_material_labels, loc='upper right', title="Materials", frameon=True, fontsize=15, title_fontsize=15)
plt.gca().add_artist(legend_particle)
plt.gca().add_artist(legend_particle)
@ -217,21 +239,25 @@ def plot_Eloss_E():
E = particle_params['m0'] * c**2 * (gam - 1) # Berechnung der kinetischen Energie aus gamma
dEdx = bethebloch(E, particle_params['m0'], particle_params['z'], params['ne'], params['I']) # Energieverlust pro Distanz
dEdx_cm = dEdx / (1e6 * e) * 1e-2 # Umrechnung von eV/m in MeV/cm
linewidth = 1.5 if material != 'BGO' else 3
plt.plot(beta_gamma, dEdx_cm, color=colors[name], linestyle=linestyles[material], linewidth=linewidth)
#linewidth = 1.5 if material != 'BGO' else 3
linewidth = 2
f=1
if name == 'Muon': f = 0.8
plt.plot(beta_gamma, dEdx_cm, color=colors[name], linestyle=linestyles[material], linewidth=f*linewidth)
# Plot-Einstellungen für den zweiten Plot
plt.xscale('log')
plt.yscale('log')
plt.xlabel(r'$\beta \cdot \gamma$')
plt.ylabel('Stopping Power in MeV/cm')
plt.xlabel(r'$\beta \cdot \gamma$',fontsize=15)
plt.ylabel('stopping power in MeV/cm',fontsize=15)
plt.title('Energy loss in Si, BGO, Bi, Ge, and O (βγ)')
legend_particle = plt.legend(handles=legend_particle_handles, labels=legend_particle_labels, loc='upper center', title="Particles", frameon=True, fontsize=12*1.5)
legend_material = plt.legend(handles=legend_material_handles, labels=legend_material_labels, loc='upper right', title="Materials", frameon=True, fontsize=12*1.5)
legend_particle = plt.legend(handles=legend_particle_handles, labels=legend_particle_labels, loc='lower left', title="Particles", frameon=True, fontsize=15, title_fontsize=15)
legend_material = plt.legend(handles=legend_material_handles, labels=legend_material_labels, loc='upper right', title="Materials", frameon=True, fontsize=15, title_fontsize=15)
plt.gca().add_artist(legend_particle)
plt.gca().add_artist(legend_material)
plt.grid(True, which="both", ls="--", lw=0.5)
plt.tight_layout(rect=[0, 0, 0.95, 1])
plt.show()
@ -253,7 +279,7 @@ def plot_only_Si():
plt.xscale('log')
plt.yscale('log')
plt.xlabel('kinetic energy E [MeV]')
plt.ylabel('Stopping Power in MeV/cm')
plt.ylabel('stopping power in MeV/cm')
plt.title('Energy loss in silicon')
plt.legend()
plt.grid(True, which="both", ls="--", lw=0.5)
@ -278,11 +304,12 @@ def plot_only_Si():
plt.xscale('log')
plt.yscale('log')
plt.xlabel(r'$\beta \cdot \gamma$')
plt.ylabel('Stopping Power in MeV/cm')
plt.ylabel('stopping power in MeV/cm')
plt.title('Energy loss in silicon (βγ)')
plt.legend()
plt.grid(True, which="both", ls="--", lw=0.5)
plt.tight_layout(rect=[0, 0, 0.95, 1])
plt.show()
@ -291,7 +318,7 @@ def plot_only_Si():
def calculate_CHAOS(params):
#E0s = np.linspace(params['E0_min'], params['E0_max'], 1000)
E0s = np.logspace(np.log10(params['E0_min']), np.log10(params['E0_max']), 1000)
dx = 1e-7
dx = 1e-9
results = []
Si_data = materials['Si']
BGO_data = materials['BGO']
@ -308,36 +335,39 @@ def calculate_CHAOS(params):
return results
results_p = calculate_CHAOS(particles['Proton'])
results_h = calculate_CHAOS(particles['Helium'])
results_mu = calculate_CHAOS(particles['Muon'])
# results_p = calculate_CHAOS(particles['Proton'])
# results_h = calculate_CHAOS(particles['Helium'])
# results_mu = calculate_CHAOS(particles['Muon'])
def format_frame(results, particle_name):
df = pd.DataFrame(results, columns=["E0", "EA", "EC", "ED", "EE", "E_rest"])
df = df.round(3)
df.to_csv(f'hists_sim/BB-{particle_name}.histlog', sep=' ')
return df
# def format_frame(results, particle_name):
# df = pd.DataFrame(results, columns=["E0", "EA", "EC", "ED", "EE", "E_rest"])
# df = df.round(3)
# df.to_csv(f'hists_sim/BB-{particle_name}.histlog', sep=' ')
# return df
frame_p = format_frame(results_p, 'Proton')
frame_h = format_frame(results_h, 'Helium')
frame_mu = format_frame(results_mu, 'Muon')
# frame_p = format_frame(results_p, 'Proton')
# frame_h = format_frame(results_h, 'Helium')
# frame_mu = format_frame(results_mu, 'Muon')
print(frame_p)
print(frame_h)
print(frame_mu)
# print(frame_p)
# print(frame_h)
# print(frame_mu)
# plt.plot(frame_p["ED"], frame_p["EC"], 'x', label="proton")
# plt.plot(frame_h["ED"], frame_h["EC"], 'x', label="helium")
# plt.plot(frame_mu["ED"], frame_mu["EC"], 'x', label="muon")
# plt.xlabel('Energieverlust im BGO (MeV)')
# #plt.ylabel('Verhältnis der Energieverluste (E_si2 / E_si1)')
# plt.ylabel('Energieverluste in (A)')
# plt.title('Energieverluste von Teilchen in Detektoren')
# plt.yscale('log')
# plt.ylim(0.01, 100)
# plt.legend()
# plt.show()
plot_Eloss_E()
plt.plot(frame_p["ED"], frame_p["EC"], 'x', label="proton")
plt.plot(frame_h["ED"], frame_h["EC"], 'x', label="helium")
plt.plot(frame_mu["ED"], frame_mu["EC"], 'x', label="muon")
plt.xlabel('Energieverlust im BGO (MeV)')
#plt.ylabel('Verhältnis der Energieverluste (E_si2 / E_si1)')
plt.ylabel('Energieverluste in (A)')
plt.title('Energieverluste von Teilchen in Detektoren')
plt.yscale('log')
plt.ylim(0.01, 100)
plt.legend()
plt.show()

View file

@ -146,7 +146,9 @@ if args.lim:
if args.xray:
nameadd = nameadd + '_xray'
if args.res: nameadd=nameadd+"_res"+str(args.res[0])
if args.res:
if float(args.res[0]) > 1.0: nameadd=nameadd+"_res"+str(int(args.res[0]))
else: nameadd=nameadd+"_res0"+str(int(float(args.res[0])*10))
if args.equal: nameadd = nameadd + '_equal'
global axes
@ -431,7 +433,7 @@ def generate_hist_D_MeV_log():
def generate_hist_xlog():
minX = 1
maxX = 3500
maxX = 10000
maxX = 100000
resX = 1000*resV
bin_x = int((maxX-minX)/resX)
edges_x = np.logspace(np.log10(minX), np.log10(maxX), bin_x)
@ -452,7 +454,7 @@ def generate_hist_xlog():
if l[0] == 'H':
timestamp = int(l[1])
T = get_T(float(l[8]))
if l[0] == 'EI' and len(l)>3*18 and conditions(l,T,args) and isMask_other(l,T,mask):
if l[0] == 'EI' and len(l)>3*18 and conditions(l,T,args):# and isMask_other(l,T,mask):
for i,chan in enumerate(chans):
#b = value_HL(l,chan,u)
x_expr, x_op, x_next_op, x_next_channel = parse_channel_expression(chan)

141
Ecalib.py Normal file
View file

@ -0,0 +1,141 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Feb 25 14:02:18 2025
Energy calibration for CHAOS
@author: ava
"""
import argparse
import sys
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from scipy import special
from scipy import constants
from scipy.optimize import curve_fit
import os.path
from fit_functions import lan
from fit_functions import mips
keV = True
factor = 1/0.00362
plt.figure(figsize=(17,10))
fchaos = 'histograms/chaos_sd_floata_cut-AC_ch-a.1dhistlog'
fproton = 'histograms/protona_cut-AC_ch-a.1dhistlog'
fmuon = 'histograms/mua_cut-AC_ch-a.1dhistlog'
fe = 'histograms/e-a_cut-AC_ch-a.1dhistlog'
fhe = 'histograms/hea_cut-AC_ch-a.1dhistlog'
# fchaos = 'histograms/chaos_sd_floata_cut-AC_res05_ch-a.1dhistlog'
# fproton = 'histograms/protona_cut-AC_res05_ch-a.1dhistlog'
# fmuon = 'histograms/mua_cut-AC_res05_ch-a.1dhistlog'
# fe = 'histograms/e-a_cut-AC_res05_ch-a.1dhistlog'
#fhe = 'histograms/hea_cut-AC_res05_ch-a.1dhistlog'
data_chaos = pd.read_csv(fchaos, sep = '\s+', skiprows=0)
data_p = pd.read_csv(fproton, sep = '\s+', skiprows=0)
data_m = pd.read_csv(fmuon, sep = '\s+', skiprows=0)
data_e = pd.read_csv(fe, sep = '\s+', skiprows=0)
data_h = pd.read_csv(fhe, sep = '\s+', skiprows=0)
datas = [data_chaos,data_p, data_m, data_e, data_h]
names = ["fligt","proton","muon","electron","helium"]
ch = pd.read_csv(fchaos, sep=' ', nrows=0)
energy = ch.columns[0]
resV = data_chaos[energy][1]-data_chaos[energy][0]
# channels = ['A1','A2','C1','C2']
# for ch in channels:
# plt.step(data_chaos[energy], np.multiply(data_chaos[ch], resV),label = ch, lw = 2)
# plt.step(data_p[energy], np.multiply(data_p[ch], resV),label = str(ch)+'(P)', lw = 2)
# for i in range (0,len(datas)):
# plt.step(datas[i][energy], np.add(datas[i]['A1'],datas[i]['A2']),label = names[i]+'-A', lw = 2)
# plt.step(datas[i][energy], np.add(datas[i]['C1'],datas[i]['C2']),label = names[i]+'-C', lw = 2)
# i=0
# plt.step(datas[i][energy], np.add(datas[i]['A1'],datas[i]['A2']),label = names[i]+'-A', lw = 2)
# plt.step(datas[i][energy], np.add(datas[i]['C1'],datas[i]['C2']),label = names[i]+'-C', lw = 2)
[80000, 85, 10, 700, 24000000]
# plt.plot(data_chaos[energy][a:b], lan(data_chaos[energy], *[200000, 85, 10, 14000, 200])[a:b], 'r--')
# plt.plot(data_chaos[energy][a:b], lan(data_chaos[energy], *[180000, 85, 10, 14000, 200])[a:b], 'b--')
# plt.plot(data_chaos[energy][a:b], lan(data_chaos[energy], *[160000, 85, 10, 14000, 200])[a:b], 'k--')
#AC chaos proton muon
startparams=[[2000, 91, 14, 180, 1000],[60000, 83, 9, 11000, 600],[154000, 85, 9, 16000, 170],[120000, 85, 8, 5000, 200],[]]
a = [86,88,87,87]
b = [124,129,120,127]
a = [2*86,2*88,2*87,2*87]
b = [2*124,2*129,2*120,2*127]
for i in []:
ydata=np.add(datas[i]['A1'],datas[i]['A2'])
plt.step(datas[i][energy], ydata,label = names[i]+'-A', lw = 2)
sig = np.power(ydata+1, 0.5)
par, cov = curve_fit(lan, datas[i][energy][a[i]:b[i]], ydata[a[i]:b[i]], startparams[i], sigma = sig[a[i]:b[i]], absolute_sigma=True)
print(par)
plt.plot(data_chaos[energy][a[i]:b[i]], lan(data_chaos[energy], *par)[a[i]:b[i]], 'k--')
ydata=np.add(datas[i]['C1'],datas[i]['C2'])
plt.step(datas[i][energy], ydata,label = names[i]+'-C', lw = 2)
sig = np.power(ydata+1, 0.5)
par, cov = curve_fit(lan, datas[i][energy][a[i]:b[i]], ydata[a[i]:b[i]], startparams[i], sigma = sig[a[i]:b[i]], absolute_sigma=True)
print(par)
plt.plot(data_chaos[energy][a[i]:b[i]], lan(data_chaos[energy], *par)[a[i]:b[i]], 'g--')
# i=3
# plt.step(datas[i][energy], np.add(datas[i]['A1'],datas[i]['A2']),label = names[i]+'-A', lw = 2)
# plt.step(datas[i][energy], np.add(datas[i]['C1'],datas[i]['C2']),label = names[i]+'-C', lw = 2)
################# BGO ###################
a=150
b=160
i=0
plt.vlines(datas[i][energy][a],0,100000,colors='red')
plt.vlines(datas[i][energy][b],0,100000,colors='blue')
#D chaos proton muon electron
startparams=[[2000, 91, 14, 180, 1000],[60000, 83, 9, 11000, 600],[154000, 85, 9, 16000, 170],[120000, 85, 8, 5000, 200],[]]
a = [95,103,103,0, 134]
b = [122,140,124,0,127]
c = 126
d = 150
for i in [0,1,2,3,4]:
ydata=np.add(datas[i]['D1'],datas[i]['D2'])
plt.step(datas[i][energy], ydata,label = names[i]+'-D', lw = 2)
#sig = np.power(ydata+1, 0.5)
#par, cov = curve_fit(lan, datas[i][energy][a[i]:b[i]], ydata[a[i]:b[i]], startparams[i], sigma = sig[a[i]:b[i]], absolute_sigma=True)
#print(par)
#plt.plot(data_chaos[energy][a[i]:b[i]], lan(data_chaos[energy], *par)[a[i]:b[i]], 'k--')
fs = 24
ylab = 'counts'
xlab = 'signal in ' + energy
plt.yscale('log')
plt.xscale('log')
plt.ylabel(ylab, fontsize=fs + 5)
plt.xlabel(xlab, fontsize=fs + 5)
plt.xticks(fontsize=fs)
plt.yticks(fontsize=fs)
plt.tick_params(axis='both', size=7, width=1.5)
plt.xlim(10, 100000)
plt.ylim(0.9, 200000)
plt.legend(fontsize=fs-1, loc="upper right",ncol=1)
plt.show()

View file

@ -91,7 +91,7 @@ def do_1dhist():
if not Itime==None:
plt.step(data[energy], np.multiply(data[ch], f*3600/resV/Itime),label=ch, lw=2)
else:
plt.step(data[energy], data[ch], label=ch)
plt.step(data[energy], data[ch]/resV, label=ch)
#limits = args.limits if args.limits else [-100, 10000, 0.1, 100000]
limits = args.limits if args.limits else [0, 100, 10, 10000]
@ -114,7 +114,7 @@ def do_1dhist():
#plt.axvline(x=43, color='black', linestyle='--', linewidth=2, label='43 mV')
plot_layout(title, energy, limits,None,None,None)
plot_layout(title, energy, limits,None,None,None,None)
save_or_show_plot(channels)
@ -148,7 +148,7 @@ def do_1dhist_morefiles(files):
title = args.title if args.title else f'Histplot: {", ".join([f.split("/")[-1] for f in files])}'
plot_layout(title, energy, limits,None,None,None)
plot_layout(title, energy, limits,None,None,None,None)
save_or_show_plot(channels)
@ -333,7 +333,7 @@ def do_2dhist():
xx = np.linspace(limits[0], limits[1], 10000)
plt.plot(xx, xx, color='black', linewidth=0.5)
plot_layout(tit,energy, limits,xlab,ylab,cbar)
plot_layout(tit,energy, limits,xlab,ylab,cbar,None)
save_or_show_plot([])
@ -360,7 +360,7 @@ def read_Itime(file, end):
###############################################################################
def plot_layout(title, energy, limits, x, y, cbar):
def plot_layout(title, energy, limits, x, y, cbar, Itime):
fs = 15
fs = 24
@ -370,6 +370,8 @@ def plot_layout(title, energy, limits, x, y, cbar):
add = '$_{Si}$'
add = ""
ylab = 'counts / h / ' + energy + add
if Itime == None:
ylab = 'counts / ' + energy + add
xlab = 'signal in ' + energy + add
plt.yscale('log')
@ -411,7 +413,7 @@ def plot_layout(title, energy, limits, x, y, cbar):
cbar.ax.tick_params(labelsize=fs)
if plt.gca().get_legend_handles_labels()[0]: # Gibt eine Liste von Künstlern (Handles) und Labels zurück
plt.legend(fontsize=fs-1, loc="upper right",ncol=4)
plt.legend(fontsize=fs-1, loc="upper right",ncol=1)
#plt.legend(fontsize=fs+5, loc="upper right")