Skip to content
Snippets Groups Projects
Commit e3b0d5f2 authored by Jiajun Huang's avatar Jiajun Huang
Browse files

Modified zdc lyso analysis code.

parent 0a6a4816
No related branches found
No related tags found
No related merge requests found
Pipeline #98794 passed with warnings with stages
in 2 hours, 22 minutes, and 59 seconds
...@@ -3,9 +3,10 @@ import matplotlib.pyplot as plt ...@@ -3,9 +3,10 @@ import matplotlib.pyplot as plt
import mplhep as hep import mplhep as hep
import uproot import uproot
import pandas as pd import pandas as pd
import os
from scipy.optimize import curve_fit from scipy.optimize import curve_fit
from matplotlib.backends.backend_pdf import PdfPages from matplotlib.backends.backend_pdf import PdfPages
import os
import awkward as ak
plt.figure() plt.figure()
hep.set_style(hep.style.CMS) hep.set_style(hep.style.CMS)
...@@ -22,18 +23,21 @@ def rotateY(xdata, zdata, angle): ...@@ -22,18 +23,21 @@ def rotateY(xdata, zdata, angle):
return rotatedx, rotatedz return rotatedx, rotatedz
Energy = [0.005, 0.01, 0.05, 0.1, 0.5, 1.0] Energy = [0.005, 0.01, 0.05, 0.1, 0.5, 1.0]
q0 = [5, 10, 40, 90, 400, 700]
q1 = [0.5, 0.5, 0.9, 5, 10, 20]
df = pd.DataFrame({}) df = pd.DataFrame({})
for eng in Energy: for eng in Energy:
tree = uproot.open(f'sim_output/zdc_lyso/{os.environ["DETECTOR_CONFIG"]}_gamma_{eng}GeV_theta_0deg_thru_0.3deg.eicrecon.tree.edm4eic.root')['events'] tree = uproot.open(f'sim_output/zdc_lyso/{os.environ["DETECTOR_CONFIG"]}_gamma_{eng}GeV_theta_0deg_thru_0.3deg.eicrecon.tree.edm4eic.root')['events']
ecal_reco_energy = tree['EcalFarForwardZDCClusters/EcalFarForwardZDCClusters.energy'].array() ecal_reco_energy = list(map(sum, tree['EcalFarForwardZDCClusters/EcalFarForwardZDCClusters.energy'].array()))
#hcal_reco_energy = tree['HcalFarForwardZDCClusters/HcalFarForwardZDCClusters.energy'].array() hcal_reco_energy = list(map(sum, tree['HcalFarForwardZDCClusters/HcalFarForwardZDCClusters.energy'].array()))
ecal_rec_energy = list(map(sum, tree['EcalFarForwardZDCRecHits/EcalFarForwardZDCRecHits.energy'].array()))
hcal_rec_energy = list(map(sum, tree['HcalFarForwardZDCRecHits/HcalFarForwardZDCRecHits.energy'].array()))
ecal_reco_clusters = [len(row) if len(row)>=1 else 0 for row in tree['EcalFarForwardZDCClusters/EcalFarForwardZDCClusters.nhits'].array()]
ecal_reco_nhits = [row[0] if len(row)>=1 else 0 for row in tree['EcalFarForwardZDCClusters/EcalFarForwardZDCClusters.nhits'].array()]
tree = uproot.open(f'sim_output/zdc_lyso/{os.environ["DETECTOR_CONFIG"]}_gamma_{eng}GeV_theta_0deg_thru_0.3deg.edm4hep.root')['events'] tree = uproot.open(f'sim_output/zdc_lyso/{os.environ["DETECTOR_CONFIG"]}_gamma_{eng}GeV_theta_0deg_thru_0.3deg.edm4hep.root')['events']
ecal_sim_energy = tree['EcalFarForwardZDCHits/EcalFarForwardZDCHits.energy'].array() ecal_sim_energy = list(map(sum, tree['EcalFarForwardZDCHits/EcalFarForwardZDCHits.energy'].array()))
hcal_sim_energy = tree['HcalFarForwardZDCHits/HcalFarForwardZDCHits.energy'].array() hcal_sim_energy = list(map(sum, tree['HcalFarForwardZDCHits/HcalFarForwardZDCHits.energy'].array()))
par_x = tree['MCParticles/MCParticles.momentum.x'].array()[:,2] par_x = tree['MCParticles/MCParticles.momentum.x'].array()[:,2]
par_y = tree['MCParticles/MCParticles.momentum.y'].array()[:,2] par_y = tree['MCParticles/MCParticles.momentum.y'].array()[:,2]
...@@ -41,66 +45,103 @@ for eng in Energy: ...@@ -41,66 +45,103 @@ for eng in Energy:
eng = int(eng*1000) eng = int(eng*1000)
ecal_reco_energy = pd.DataFrame({f'ecal_reco_energy_{eng}': np.array(ecal_reco_energy.tolist(), dtype=object)}) ecal_reco_energy = pd.DataFrame({f'ecal_reco_energy_{eng}': np.array(ecal_reco_energy, dtype=object)})
#hcal_reco_energy = pd.DataFrame({f'hcal_reco_energy_{eng}': np.array(hcal_reco_energy.tolist(), dtype=object)}) hcal_reco_energy = pd.DataFrame({f'hcal_reco_energy_{eng}': np.array(hcal_reco_energy, dtype=object)})
ecal_sim_energy = pd.DataFrame({f'ecal_sim_energy_{eng}': np.array(ecal_sim_energy.tolist(), dtype=object)}) ecal_rec_energy = pd.DataFrame({f'ecal_rec_energy_{eng}': np.array(ecal_rec_energy, dtype=object)})
hcal_sim_energy = pd.DataFrame({f'hcal_sim_energy_{eng}': np.array(hcal_sim_energy.tolist(), dtype=object)}) hcal_rec_energy = pd.DataFrame({f'hcal_rec_energy_{eng}': np.array(hcal_rec_energy, dtype=object)})
ecal_sim_energy = pd.DataFrame({f'ecal_sim_energy_{eng}': np.array(ecal_sim_energy, dtype=object)})
hcal_sim_energy = pd.DataFrame({f'hcal_sim_energy_{eng}': np.array(hcal_sim_energy, dtype=object)})
ecal_reco_nhits = pd.DataFrame({f'ecal_reco_nhits_{eng}': np.array(ecal_reco_nhits, dtype=object)})
ecal_reco_clusters = pd.DataFrame({f'ecal_reco_clusters_{eng}': np.array(ecal_reco_clusters, dtype=object)})
par_x = pd.DataFrame({f'par_x_{eng}': np.array(par_x.tolist(), dtype=object)}) par_x = pd.DataFrame({f'par_x_{eng}': np.array(par_x.tolist(), dtype=object)})
par_y = pd.DataFrame({f'par_y_{eng}': np.array(par_y.tolist(), dtype=object)}) par_y = pd.DataFrame({f'par_y_{eng}': np.array(par_y.tolist(), dtype=object)})
par_z = pd.DataFrame({f'par_z_{eng}': np.array(par_z.tolist(), dtype=object)}) par_z = pd.DataFrame({f'par_z_{eng}': np.array(par_z.tolist(), dtype=object)})
df = pd.concat([df,ecal_reco_energy,ecal_sim_energy,hcal_sim_energy,par_x,par_y,par_z],axis=1)
df = pd.concat([df,ecal_reco_energy,ecal_rec_energy,ecal_sim_energy,hcal_reco_energy,hcal_rec_energy,hcal_sim_energy,ecal_reco_clusters,ecal_reco_nhits,par_x,par_y,par_z],axis=1)
mu = [] mu = []
sigma = [] sigma = []
resolution = []
fig1, ax = plt.subplots(3,2,figsize=(20,10)) fig1, ax = plt.subplots(3,2,figsize=(20,10))
#fig1.suptitle('ZDC ECal Cluster Energy Reconstruction') fig1.suptitle('ZDC ECal Cluster Energy Reconstruction')
plt.tight_layout() plt.tight_layout()
for i in range(6): for i in range(6):
x = df[f'par_x_{eng}'].astype(float).to_numpy()
y = df[f'par_y_{eng}'].astype(float).to_numpy()
z = df[f'par_z_{eng}'].astype(float).to_numpy()
x, z = rotateY(x,z, 0.025)
theta = np.arccos(z/np.sqrt((x**2+y**2+z**2)))*1000
condition = theta <= 3.5
plt.sca(ax[i%3,i//3]) plt.sca(ax[i%3,i//3])
eng = int(Energy[i]*1000) eng = int(Energy[i]*1000)
plt.title(f'Gamma Energy: {eng} MeV') plt.title(f'Gamma Energy: {eng} MeV')
temp = np.array([sum(item) if (item != 0) else 0 for item in df[f'ecal_reco_energy_{eng}']]) temp = np.array(df[f'ecal_reco_energy_{eng}'].astype(float).to_numpy()[condition])*1000
hist, x = np.histogram(np.array(temp)*1000,bins=30) hist, x = np.histogram(temp,bins=np.linspace(min(temp),max(temp)+np.std(abs(temp)),2*int(np.sqrt(len(temp)))))
x = x[1:]/2 + x[:-1]/2 x = x[1:]/2 + x[:-1]/2
plt.errorbar(x,hist,yerr=np.sqrt(hist),fmt='-o') plt.errorbar(x,hist,yerr=np.sqrt(hist),fmt='-o',label='Cluster')
temp = np.array([item[0] for item in df[f'ecal_reco_energy_{eng}'] if item]) coeff, covar = curve_fit(gaussian,x[1:],hist[1:],p0=(max(hist[x>=np.std(abs(temp))]),np.mean(temp[temp!=0]),np.std(temp[temp!=0])))
hist, x = np.histogram(np.array(temp)*1000,bins=30) #plt.plot(np.linspace(coeff[1]-3*coeff[2],coeff[1]+3*coeff[2],50),gaussian(np.linspace(coeff[1]-3*coeff[2],coeff[1]+3*coeff[2],50),*coeff))
mu.append(coeff[1])
sigma.append(coeff[2])
temp = np.array(df[f'ecal_rec_energy_{eng}'].astype(float).to_numpy()[condition])*1000
hist, x = np.histogram(temp,bins=np.linspace(min(temp),max(temp)+np.std(abs(temp)),2*int(np.sqrt(len(temp)))))
x = x[1:]/2 + x[:-1]/2 x = x[1:]/2 + x[:-1]/2
coeff, covar = curve_fit(gaussian,x,hist,p0=(200,q0[i],q1[i]),maxfev = 80000) plt.errorbar(x,hist,yerr=np.sqrt(hist),fmt='-o',label='Digitization')
plt.plot(np.linspace(coeff[1]-5*coeff[2],coeff[1]+5*coeff[2],50),gaussian(np.linspace(coeff[1]-5*coeff[2],coeff[1]+5*coeff[2],50),*coeff) coeff, covar = curve_fit(gaussian,x[1:],hist[1:],p0=(max(hist[x>=np.std(abs(temp))]),np.mean(temp[temp!=0]),np.std(temp[temp!=0])))
,label = f'$\mu$ = {coeff[1]:.3f} $\pm$ {covar[1][1]:.3f}\n$\sigma$ = {np.abs(coeff[2]):.3f} $\pm$ {covar[2][2]:.3f}\nResolution = {np.abs(coeff[2])*100/coeff[1]:.2f}%') #plt.plot(np.linspace(coeff[1]-3*coeff[2],coeff[1]+3*coeff[2],50),gaussian(np.linspace(coeff[1]-3*coeff[2],coeff[1]+3*coeff[2],50),*coeff))
mu.append(coeff[1])
sigma.append(coeff[2])
plt.xlabel('Energy (MeV)') temp = np.array(df[f'ecal_sim_energy_{eng}'].astype(float).to_numpy()[condition])*1000
plt.legend() hist, x = np.histogram(temp,bins=np.linspace(min(temp),max(temp)+np.std(abs(temp)),2*int(np.sqrt(len(temp)))))
x = x[1:]/2 + x[:-1]/2
plt.errorbar(x,hist,yerr=np.sqrt(hist),fmt='-o',label='Simulation')
coeff, covar = curve_fit(gaussian,x[1:],hist[1:],p0=(max(hist[x>=np.std(abs(temp))]),np.mean(temp[temp!=0]),np.std(temp[temp!=0])))
#plt.plot(np.linspace(coeff[1]-3*coeff[2],coeff[1]+3*coeff[2],50),gaussian(np.linspace(coeff[1]-3*coeff[2],coeff[1]+3*coeff[2],50),*coeff))
mu.append(coeff[1]) mu.append(coeff[1])
sigma.append(coeff[2]) sigma.append(coeff[2])
resolution.append(np.abs(coeff[2])*100/coeff[1])
plt.xlabel('Energy (MeV)')
plt.legend()
#plt.savefig('results/Energy_reconstruction_cluster.pdf') #plt.savefig('results/Energy_reconstruction_cluster.pdf')
#plt.show()
mu = np.array(mu)
sigma = np.array(sigma)
plt.show()
fig2, (ax1,ax2) = plt.subplots(2,1,figsize=(15,10),sharex=True) fig2, (ax1,ax2) = plt.subplots(2,1,figsize=(15,10),sharex=True)
plt.tight_layout() plt.tight_layout()
# Plot data on primary axis # Plot data on primary axis
ax1.scatter(np.array(Energy)*1000, mu, c='b') ax1.scatter(np.array(Energy)*1000, mu[::3], label='cluster')
ax1.scatter(np.array(Energy)*1000, mu[1::3], label='digitization')
ax1.scatter(np.array(Energy)*1000, mu[2::3], label='simulation')
ax1.plot([4.5,1000],[4.5,1000],c='black',label='x=y') ax1.plot([4.5,1000],[4.5,1000],c='black',label='x=y')
ax1.set_ylabel('Reconstructed Energy (MeV)') ax1.set_ylabel('Reconstructed Energy (MeV)')
ax1.set_yscale('log') ax1.set_yscale('log')
ax1.legend() ax1.legend()
ax1.set_title('ECal Craterlake Cluster Energy Reconstruction') ax1.set_title('ECal Craterlake Cluster Energy Reconstruction')
ax2.plot(np.array(Energy)*1000, resolution, c='r') ax2.errorbar(np.array(Energy)*1000, abs(sigma[::3]/mu[::3])*100, fmt='-o', label='cluster')
ax2.scatter(np.array(Energy)*1000, resolution, c='r') ax2.errorbar(np.array(Energy)*1000, abs(sigma[1::3]/mu[1::3])*100, fmt='-o', label='digitization')
ax2.errorbar(np.array(Energy)*1000, abs(sigma[2::3]/mu[2::3])*100, fmt='-o', label='simulation')
ax2.set_ylabel('Resolution (%)') ax2.set_ylabel('Resolution (%)')
ax2.set_xlabel('Gamma Energy (MeV)') ax2.set_xlabel('Gamma Energy (MeV)')
ax2.set_xscale('log') ax2.set_xscale('log')
ax2.legend()
#plt.savefig('results/Energy_resolution.pdf') #plt.savefig('results/Energy_resolution.pdf')
#plt.show()
plt.show()
htower = [] htower = []
herr = [] herr = []
...@@ -127,14 +168,14 @@ for i in range(6): ...@@ -127,14 +168,14 @@ for i in range(6):
condition = theta <= 3.5 condition = theta <= 3.5
plt.title(f'Gamma Energy: {eng} MeV') plt.title(f'Gamma Energy: {eng} MeV')
energy1 = np.array([sum(item) if (item != 0) else 0 for item in df[f'hcal_sim_energy_{eng}']])#df.eval(f'hcal_sim_energy_{eng}').apply(lambda row: sum(row)) energy1 = df[f'hcal_sim_energy_{eng}'].astype(float).to_numpy()#df.eval(f'hcal_sim_energy_{eng}').apply(lambda row: sum(row))
hist, x = np.histogram(energy1*1000,bins=np.logspace(0,3,200)) hist, x = np.histogram(energy1*1000,bins=np.logspace(0,3,200))
x = x[1:]/2 + x[:-1]/2 x = x[1:]/2 + x[:-1]/2
plt.plot(x,hist,marker='o',label="HCal") plt.plot(x,hist,marker='o',label="HCal")
hhits.append(len(energy1[energy1!=0])) hhits.append(len(energy1[energy1!=0]))
condition1 = energy1!=0 condition1 = energy1!=0
hhits_cut.append(len(energy1[condition & condition1])/len(condition[condition==True])) hhits_cut.append(len(energy1[condition & condition1])/len(condition[condition==True]))
energy = np.array([sum(item) if (item != 0) else 0 for item in df[f'ecal_sim_energy_{eng}']])#df.eval(f'ecal_sim_energy_{eng}').apply(lambda row: sum(row)) energy = df[f'ecal_sim_energy_{eng}'].astype(float).to_numpy()#df.eval(f'ecal_sim_energy_{eng}').apply(lambda row: sum(row))
hist, x = np.histogram(energy*1000,bins=np.logspace(0,3,200)) hist, x = np.histogram(energy*1000,bins=np.logspace(0,3,200))
x = x[1:]/2 + x[:-1]/2 x = x[1:]/2 + x[:-1]/2
plt.plot(x,hist,marker='o',label="ECal") plt.plot(x,hist,marker='o',label="ECal")
...@@ -147,13 +188,18 @@ for i in range(6): ...@@ -147,13 +188,18 @@ for i in range(6):
plt.xscale('log') plt.xscale('log')
plt.xlim(1e0,1e3) plt.xlim(1e0,1e3)
plt.xlabel('Energy (MeV)') plt.xlabel('Energy (MeV)')
#plt.savefig('results/Energy_deposition.pdf') #plt.savefig('results/Energy_deposition.pdf')
#plt.show() plt.show()
fig4, ax = plt.subplots(2,1,sharex=True,gridspec_kw={'height_ratios': [2,1]}) fig4, ax = plt.subplots(2,1,sharex=True,gridspec_kw={'height_ratios': [2,1]})
plt.sca(ax[0]) plt.sca(ax[0])
plt.errorbar(np.array(Energy)*1000,np.array(hmean)*47.619+np.array(emean),label='HCal+ECal',fmt='-o') plt.errorbar(np.array(Energy)*1000,np.array(hmean)*47.619+np.array(emean),label='HCal/sf+ECal',fmt='-o')
plt.errorbar(np.array(Energy)*1000,emean,label='ECal',fmt='-o') plt.errorbar(np.array(Energy)*1000,emean,label='ECal',fmt='-o')
plt.legend() plt.legend()
plt.yscale('log') plt.yscale('log')
...@@ -166,7 +212,7 @@ plt.ylabel('Fraction of energy\n deposited in Hcal (%)') ...@@ -166,7 +212,7 @@ plt.ylabel('Fraction of energy\n deposited in Hcal (%)')
plt.xlabel('Truth Energy (MeV)') plt.xlabel('Truth Energy (MeV)')
#plt.savefig('results/Energy_ratio_and_Leakage.pdf') #plt.savefig('results/Energy_ratio_and_Leakage.pdf')
plt.tight_layout() plt.tight_layout()
#plt.show() plt.show()
fig5 = plt.figure() fig5 = plt.figure()
plt.errorbar(np.array(Energy)*1000,np.array(hhits)/1000*100,label='HCal Hits',fmt='-o') plt.errorbar(np.array(Energy)*1000,np.array(hhits)/1000*100,label='HCal Hits',fmt='-o')
...@@ -183,7 +229,46 @@ plt.xlabel('Simulation Truth Gamma Energy (MeV)') ...@@ -183,7 +229,46 @@ plt.xlabel('Simulation Truth Gamma Energy (MeV)')
plt.ylabel('Fraction of Events with non-zero energy (%)') plt.ylabel('Fraction of Events with non-zero energy (%)')
#plt.savefig('results/Hits.pdf') #plt.savefig('results/Hits.pdf')
plt.xscale('log') plt.xscale('log')
#plt.show() plt.show()
fig6, ax = plt.subplots(2,3,figsize=(20,10))
fig6.suptitle('ZDC Clustering')
fig6.tight_layout(pad=1.8)
for i in range(6):
plt.sca(ax[i//3,i%3])
eng = int(Energy[i]*1000)
x = df[f'par_x_{eng}'].astype(float).to_numpy()
y = df[f'par_y_{eng}'].astype(float).to_numpy()
z = df[f'par_z_{eng}'].astype(float).to_numpy()
x, z = rotateY(x,z, 0.025)
theta = np.arccos(z/np.sqrt((x**2+y**2+z**2)))*1000
condition = theta <= 3.5
plt.hist(df[f'ecal_reco_clusters_{eng}'][condition],bins=np.linspace(0,5,6))
plt.xlabel('Number of Clusters')
plt.title(f'Gamma Energy: {eng} MeV')
plt.show()
fig7, ax = plt.subplots(2,3,figsize=(20,10))
fig7.suptitle('ZDC Towering in Clusters')
fig7.tight_layout(pad=1.8)
for i in range(6):
plt.sca(ax[i//3,i%3])
eng = int(Energy[i]*1000)
x = df[f'par_x_{eng}'].astype(float).to_numpy()
y = df[f'par_y_{eng}'].astype(float).to_numpy()
z = df[f'par_z_{eng}'].astype(float).to_numpy()
x, z = rotateY(x,z, 0.025)
theta = np.arccos(z/np.sqrt((x**2+y**2+z**2)))*1000
condition = theta <= 3.5
plt.hist(df[f'ecal_reco_nhits_{eng}'][condition],bins=np.linspace(0,max(df[f'ecal_reco_nhits_{eng}'][condition]),max(df[f'ecal_reco_nhits_{eng}'][condition])+1))
plt.xlabel('Number of tower in Clusters')
plt.title(f'Gamma Energy: {eng} MeV')
plt.show()
#pdfs = ['results/Energy_reconstruction_cluster.pdf','results/Energy_resolution.pdf','results/Energy_deposition.pdf','results/Energy_ratio_and_Leakage.pdf','results/Hits.pdf'] #pdfs = ['results/Energy_reconstruction_cluster.pdf','results/Energy_resolution.pdf','results/Energy_deposition.pdf','results/Energy_ratio_and_Leakage.pdf','results/Hits.pdf']
with PdfPages(f'results/{os.environ["DETECTOR_CONFIG"]}/zdc_lyso/plots.pdf') as pdf: with PdfPages(f'results/{os.environ["DETECTOR_CONFIG"]}/zdc_lyso/plots.pdf') as pdf:
...@@ -192,4 +277,5 @@ with PdfPages(f'results/{os.environ["DETECTOR_CONFIG"]}/zdc_lyso/plots.pdf') as ...@@ -192,4 +277,5 @@ with PdfPages(f'results/{os.environ["DETECTOR_CONFIG"]}/zdc_lyso/plots.pdf') as
pdf.savefig(fig3) pdf.savefig(fig3)
pdf.savefig(fig4) pdf.savefig(fig4)
pdf.savefig(fig5) pdf.savefig(fig5)
pdf.savefig(fig6)
pdf.savefig(fig7)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment