diff --git a/benchmarks/dis/analysis/truth_reconstruction.py b/benchmarks/dis/analysis/truth_reconstruction.py index 3089488c5a10fa24d385f8663488497eb7b83c5c..131185617f02303b5f2e61a39701b04b8a30741d 100644 --- a/benchmarks/dis/analysis/truth_reconstruction.py +++ b/benchmarks/dis/analysis/truth_reconstruction.py @@ -16,75 +16,86 @@ args = parser.parse_args() kwargs = vars(args) rec_file = args.rec_file -config = args.config Nevents = int(args.nevents) -r_path = args.results_path + '/truth_reconstruction/' +r_path = args.results_path + '/truth_reconstruction/' #Path for output figures and file. +Dconfig = 'epic' + args.config.split('_epic')[1].strip() #Detector config +config = args.config.split('_epic')[0].strip() for array in ur.iterate(rec_file + ':events',['MCParticles/MCParticles.generatorStatus', 'MCParticles/MCParticles.PDG', 'MCParticles/MCParticles.momentum.x', 'MCParticles/MCParticles.momentum.y', 'MCParticles/MCParticles.momentum.z', - 'ReconstructedParticles/ReconstructedParticles.PDG', - 'ReconstructedParticles/ReconstructedParticles.momentum.x', - 'ReconstructedParticles/ReconstructedParticles.momentum.y', - 'ReconstructedParticles/ReconstructedParticles.momentum.z', - 'ReconstructedParticlesAssoc/ReconstructedParticlesAssoc.simID', - 'ReconstructedParticlesAssoc/ReconstructedParticlesAssoc.recID',],step_size=Nevents): - PDG_mc = array['MCParticles/MCParticles.PDG'] + 'ReconstructedChargedParticles/ReconstructedChargedParticles.PDG', + 'ReconstructedChargedParticles/ReconstructedChargedParticles.momentum.x', + 'ReconstructedChargedParticles/ReconstructedChargedParticles.momentum.y', + 'ReconstructedChargedParticles/ReconstructedChargedParticles.momentum.z', + 'ReconstructedChargedParticlesAssoc/ReconstructedChargedParticlesAssoc.simID', + 'ReconstructedChargedParticlesAssoc/ReconstructedChargedParticlesAssoc.recID'],step_size=Nevents): + PDG_mc = array['MCParticles/MCParticles.PDG'] #Monte Carlo (MC) particle numbering scheme. px_mc = array['MCParticles/MCParticles.momentum.x'] py_mc = array['MCParticles/MCParticles.momentum.y'] pz_mc = array['MCParticles/MCParticles.momentum.z'] - PDG_rc = array['ReconstructedParticles/ReconstructedParticles.PDG'] - px_rc = array['ReconstructedParticles/ReconstructedParticles.momentum.x'] - py_rc = array['ReconstructedParticles/ReconstructedParticles.momentum.y'] - pz_rc = array['ReconstructedParticles/ReconstructedParticles.momentum.z'] - simID = array['ReconstructedParticlesAssoc/ReconstructedParticlesAssoc.simID'] - recID = array['ReconstructedParticlesAssoc/ReconstructedParticlesAssoc.recID'] - + PDG_rc = array['ReconstructedChargedParticles/ReconstructedChargedParticles.PDG'] + px_rc = array['ReconstructedChargedParticles/ReconstructedChargedParticles.momentum.x'] + py_rc = array['ReconstructedChargedParticles/ReconstructedChargedParticles.momentum.y'] + pz_rc = array['ReconstructedChargedParticles/ReconstructedChargedParticles.momentum.z'] + simID = array['ReconstructedChargedParticlesAssoc/ReconstructedChargedParticlesAssoc.simID'] + recID = array['ReconstructedChargedParticlesAssoc/ReconstructedChargedParticlesAssoc.recID'] + #SimID and recID contain the indices of the MCParticles and ReconstructedParticles entry for that event. + +### MCParticles Variables momentum_mc = np.sqrt(((px_mc**2)+(py_mc**2)+(pz_mc**2))) theta_mc = np.arctan2(np.sqrt(px_mc**2+py_mc**2), pz_mc) phi_mc = np.arctan2(py_mc, px_mc) - +### ReconstructedParticles Variables momentum_rc = np.sqrt(((px_rc**2)+(py_rc**2)+(pz_rc**2))) theta_rc = np.arctan2(np.sqrt(px_rc**2+py_rc**2), pz_rc) phi_rc = np.arctan2(py_rc, px_rc) -booll = (PDG_mc[simID])==(PDG_rc[recID]) -boolean_pion = np.logical_or(ak.Array(PDG_mc[simID][booll])==-211, ak.Array(PDG_mc[simID][booll])==+211) -boolean_proton = np.logical_or(ak.Array(PDG_mc[simID][booll])==-2212, ak.Array(PDG_mc[simID][booll])==+2212) -boolean_electron = ak.Array(PDG_mc[simID][booll])==11 -boolean_neutron = ak.Array(PDG_mc[simID][booll])==2112 -boolean_photon = ak.Array(PDG_mc[simID][booll])==22 - -MC_list = [ak.Array(momentum_mc[simID][booll]), - ak.Array(theta_mc[simID][booll]), - ak.Array(phi_mc[simID][booll]), - -np.log(np.tan((ak.Array(theta_mc[simID][booll]))/2))] -RC_list = [ak.Array(momentum_rc[recID][booll]), - ak.Array(theta_rc[recID][booll]), - ak.Array(phi_rc[recID][booll]), - -np.log(np.tan((ak.Array(theta_rc[recID][booll]))/2))] +booll = (PDG_mc[simID])==(PDG_rc[recID]) #boolean that allows events where the same particle is reconstructed +boolean_pion = np.logical_or(ak.Array(PDG_mc[simID][booll])==-211, ak.Array(PDG_mc[simID][booll])==+211) #boolean that allows events involving pions +boolean_proton = np.logical_or(ak.Array(PDG_mc[simID][booll])==-2212, ak.Array(PDG_mc[simID][booll])==+2212) #boolean that allows events involving protons +boolean_electron = ak.Array(PDG_mc[simID][booll])==11 #boolean that allows events involving electrons +boolean_neutron = ak.Array(PDG_mc[simID][booll])==2112 #boolean that allows events involving neutrons +boolean_photon = ak.Array(PDG_mc[simID][booll])==22 #boolean that allows events involving photons + +### MCParticles variables list +MC_list = [ak.Array(momentum_mc[simID][booll]), #Momentum + ak.Array(theta_mc[simID][booll]), #Theta + ak.Array(phi_mc[simID][booll]), #Phi + -np.log(np.tan((ak.Array(theta_mc[simID][booll]))/2))] #Eta +### ReconstructedParticles variables list +RC_list = [ak.Array(momentum_rc[recID][booll]), #Momentum + ak.Array(theta_rc[recID][booll]), #Theta + ak.Array(phi_rc[recID][booll]), #Phi + -np.log(np.tan((ak.Array(theta_rc[recID][booll]))/2))] #Eta +title_list = ['Momentum','Theta','Phi','Eta'] +### MC Momentum for different particles list M_list = [ak.Array(momentum_mc[simID][booll]), ak.Array(momentum_mc[simID][booll][boolean_pion]), ak.Array(momentum_mc[simID][booll][boolean_proton]), ak.Array(momentum_mc[simID][booll][boolean_electron]), ak.Array(momentum_mc[simID][booll][boolean_neutron]), ak.Array(momentum_mc[simID][booll][boolean_photon])] -title_list = ['Momentum','Theta','Phi','Eta'] +#Marker Size in plots if Nevents == 100: ssize = 1 else: ssize = 0.01 +#Particle type for Single events particle = config.split('-')[0].strip() particle_dict = {'e':[boolean_electron,'Electrons'],'pi':[boolean_pion,'Pions']} -################### -for i in range(len(MC_list)): - X1 = MC_list[i] - Y1 = RC_list[i] +#################################################################################################### + #Ratio +#################################################################################################### + +for i in range(len(MC_list)): #Repeat the following steps for each variable (momentum,theta,phi,eta) + X1 = MC_list[i] #MCParticles events to be plotted on x-axis + Y1 = RC_list[i] #ReconstructedParticles events X_list = [ak.Array(X1), ak.Array(X1[boolean_pion]), ak.Array(X1[boolean_proton]), @@ -97,11 +108,10 @@ for i in range(len(MC_list)): ak.Array(Y1[boolean_electron]), ak.Array(Y1[boolean_neutron]), ak.Array(Y1[boolean_photon])] - X_plot = list(np.zeros(len(X_list))) Y_plot = list(np.zeros(len(X_list))) - for j in range(len(X_list)): + for j in range(len(X_list)): #Repeat the following steps for each particle (pions,protons,electrons,neutrons,photons) X = X_list[j] Y = Y_list[j] X_len = ak.count(X,axis=None) @@ -110,11 +120,11 @@ for i in range(len(MC_list)): F_boolean = np.ones_like(Y) == 1 else: F_boolean = np.ones_like(X) == 1 - X_s = np.array(ak.flatten(X[F_boolean])) + X_s = np.array(ak.flatten(X[F_boolean])) #Filtered lists Y_s = np.array(ak.flatten(Y[F_boolean])) if i == 0: #Momentum ratio = np.array((ak.Array(Y_s)/ak.Array(X_s))) - else: + else: #Angle difference ratio = np.array((ak.Array(Y_s)-(ak.Array(X_s)))) X_plot[j] = X_s Y_plot[j] = ratio @@ -123,7 +133,7 @@ for i in range(len(MC_list)): gs = fig.add_gridspec(3, 2, wspace=0) (ax1, ax2), (ax3, ax4),(ax5, ax6) = gs.subplots(sharex=True, sharey=True) # fig.suptitle('') - if i == 1: #theta + if i == 1: # for theta X_plot[0],X_plot[1],X_plot[2],X_plot[3],X_plot[4],X_plot[5] = -X_plot[0],-X_plot[1],-X_plot[2],-X_plot[3],-X_plot[4],-X_plot[5] ax1.scatter(X_plot[0], Y_plot[0], s = ssize) ax2.scatter(X_plot[1], Y_plot[1], s = ssize) @@ -132,17 +142,15 @@ for i in range(len(MC_list)): ax5.scatter(X_plot[4], Y_plot[4], s = ssize) ax6.scatter(X_plot[5], Y_plot[5], s = ssize) - ax_list = [ax1,ax2,ax3,ax4,ax5] - if i == 0: - ax1.set_ylabel('rc/mc') + if i == 0: # for momentum + ax1.set_ylabel('rc/mc') #ratio ax3.set_ylabel('rc/mc') ax5.set_ylabel('rc/mc') title ='ratio' - for ax in ax_list: - ax.set_yscale('log') - ax.set_xscale('log') - else: - ax1.set_ylabel('rc-mc') + ax1.set_yscale('log') + ax1.set_xscale('log') + else: # for angles + ax1.set_ylabel('rc-mc') #difference ax3.set_ylabel('rc-mc') ax5.set_ylabel('rc-mc') title ='difference' @@ -165,12 +173,57 @@ for i in range(len(MC_list)): x_range = list(ax1.get_xlim()) fig.set_figwidth(20) fig.set_figheight(10) - ax1.set_title('%s %s %s %s events'%(title_list[i],title,config,Nevents)) + ax1.set_title('%s %s %s %s events\n DETECTOR_CONFIG: %s'%(title_list[i],title,config,Nevents,Dconfig)) plt.savefig(os.path.join(r_path, '%s_%s_%s.png' % (title_list[i],title,config))) plt.close() - ############ - - #Correlation + +################################################################################################### + #Ratio vs momentum +################################################################################################### + + if i > 0: #for each variable theta, phi, and eta + for j in range(len(M_list)): #Repeat the following steps for each particle (pions,protons,electrons,neutrons,photons) + X = X_list[j] + Y = Y_list[j] + M_mc = M_list[j] + boolean_M = np.ones_like(M_mc) == 1 + X_s = np.array(ak.flatten(X[boolean_M])) + Y_s = np.array(ak.flatten(Y[boolean_M])) + M_s = np.array(ak.flatten(M_mc)) + ratio = np.array((ak.Array(Y_s)-(ak.Array(X_s)))) + X_plot[j] = M_s + Y_plot[j] = ratio + + fig = plt.figure() + gs = fig.add_gridspec(3, 2, wspace=0) + (ax1, ax2), (ax3, ax4),(ax5, ax6) = gs.subplots(sharex=True, sharey=True) + ax1.scatter(X_plot[0], Y_plot[0], s = ssize) + ax2.scatter(X_plot[1], Y_plot[1], s = ssize) + ax3.scatter(X_plot[2], Y_plot[2], s = ssize) + ax4.scatter(X_plot[3], Y_plot[3], s = ssize) + ax5.scatter(X_plot[4], Y_plot[4], s = ssize) + ax6.scatter(X_plot[5], Y_plot[5], s = ssize) + ax1.set_xscale('log') + ax1.set_ylabel('rc-mc') + ax3.set_ylabel('rc-mc') + ax5.set_ylabel('rc-mc') + ax5.set_xlabel('Momentum mc') + ax6.set_xlabel('Momentum mc') + ax2.set_title('Pions') + ax3.set_title('Protons') + ax4.set_title('Electrons') + ax5.set_title('Neutrons') + ax6.set_title('Photons') + fig.set_figwidth(20) + fig.set_figheight(10) + ax1.set_title('%s Difference Vs Momentum %s %s events\n DETECTOR_CONFIG: %s'%(title_list[i],config,Nevents,Dconfig)) + plt.savefig(os.path.join(r_path, '%s_difference_vs_momentum_%s.png' % (title_list[i],config))) + +################################################################################################### + #Correlation +################################################################################################### + + #Repeat the following steps for each variable (momentum,theta,phi,eta) X_len = ak.count(X1,axis=None) Y_len = ak.count(Y1,axis=None) if X_len > Y_len: @@ -179,7 +232,8 @@ for i in range(len(MC_list)): F_boolean = np.ones_like(X1) == 1 X_s = np.array(ak.flatten(X1[F_boolean])) Y_s = np.array(ak.flatten(Y1[F_boolean])) - + + #Histogram if i == 0 and particle in particle_dict.keys(): #Momentum in Single events h, xedges, yedges, image = plt.hist2d(x=X_s,y= Y_s, bins = 11) else: @@ -188,7 +242,7 @@ for i in range(len(MC_list)): col_sum = ak.sum(h,axis=-1) #number of events in each (verticle) column norm_h = [] #norm_h is the normalized matrix - norm_h_text = [] #display labels matrix + norm_h_text = [] for j in range(len(col_sum)): if col_sum[j] != 0: norm_c = h[j]/col_sum[j] #normalized column = column values divide by sum of the column @@ -211,53 +265,15 @@ for i in range(len(MC_list)): axs[1].set_xlabel('%s_mc'%(title_list[i])) axs[1].set_ylabel('%s_rc'%(title_list[i])) axs[1].set_title('%s Correlation'%(title_list[i])) - fig.suptitle('%s %s events'%(config,Nevents)) + fig.suptitle('%s %s events\n DETECTOR_CONFIG: %s'%(config,Nevents,Dconfig)) plt.savefig(os.path.join(r_path, '%s_correlation_%s.png' % (title_list[i],config))) -############### - - if i > 0: - for j in range(len(X_list)): - X = X_list[j] - Y = Y_list[j] - M_mc = M_list[j] - boolean_M = np.ones_like(M_mc) == 1 - X_s = np.array(ak.flatten(X[boolean_M])) - Y_s = np.array(ak.flatten(Y[boolean_M])) - M_s = np.array(ak.flatten(M_mc)) - ratio = np.array((ak.Array(Y_s)-(ak.Array(X_s)))) - X_plot[j] = M_s - Y_plot[j] = ratio - - fig = plt.figure() - gs = fig.add_gridspec(3, 2, wspace=0) - (ax1, ax2), (ax3, ax4),(ax5, ax6) = gs.subplots(sharex=True, sharey=True) - # fig.suptitle('') - ax1.scatter(X_plot[0], Y_plot[0], s = ssize) - ax2.scatter(X_plot[1], Y_plot[1], s = ssize) - ax3.scatter(X_plot[2], Y_plot[2], s = ssize) - ax4.scatter(X_plot[3], Y_plot[3], s = ssize) - ax5.scatter(X_plot[4], Y_plot[4], s = ssize) - ax6.scatter(X_plot[5], Y_plot[5], s = ssize) - ax1.set_xscale('log') - ax1.set_ylabel('rc-mc') - ax3.set_ylabel('rc-mc') - ax5.set_ylabel('rc-mc') - ax5.set_xlabel('Momentum mc') - ax6.set_xlabel('Momentum mc') - ax2.set_title('Pions') - ax3.set_title('Protons') - ax4.set_title('Electrons') - ax5.set_title('Neutrons') - ax6.set_title('Photons') - fig.set_figwidth(20) - fig.set_figheight(10) - ax1.set_title('%s Difference Vs Momentum %s %s events'%(title_list[i],config,Nevents)) - plt.savefig(os.path.join(r_path, '%s_difference_vs_momentum_%s.png' % (title_list[i],config))) - -################ +################################################################################################### + #Phi vs Theta plots +################################################################################################### def particle_plots(boolean_particle): + #filtered lists w.r.t the particle theta_mc_fil = ak.Array(theta_mc[simID][booll])[boolean_particle] theta_rc_fil = ak.Array(theta_rc[recID][booll])[boolean_particle] phi_mc_fil = ak.Array(phi_mc[simID][booll])[boolean_particle] @@ -269,6 +285,7 @@ def particle_plots(boolean_particle): F_boolean = np.ones_like(theta_rc_fil) == 1 else: F_boolean = np.ones_like(theta_mc_fil) == 1 + #filtered lists w.r.t length theta_mc_F = np.array(ak.flatten(theta_mc_fil[F_boolean])) theta_rc_F = np.array(ak.flatten(theta_rc_fil[F_boolean])) phi_mc_F = np.array(ak.flatten(phi_mc_fil[F_boolean])) @@ -298,7 +315,7 @@ if particle in particle_dict.keys(): particle_name = particle_dict[particle][1] particle_plots(boolean_particle) - plt.suptitle('%s in %s %s events'%(particle_name,config,Nevents)) + plt.suptitle('%s in %s %s events\n DETECTOR_CONFIG: %s'%(particle_name,config,Nevents,Dconfig)) plt.savefig(os.path.join(r_path, '%s_%s.png' % (particle_name,config))) else: for i in [[boolean_photon,'Photons'],[boolean_electron,'Electrons'],[boolean_pion,'Pions']]: @@ -306,7 +323,7 @@ else: particle_name = i[1] particle_plots(boolean_particle) - plt.suptitle('%s in %s %s events'%(particle_name,config,Nevents)) + plt.suptitle('%s in %s %s events\n DETECTOR_CONFIG: %s'%(particle_name,config,Nevents,Dconfig)) plt.savefig(os.path.join(r_path, '%s_%s.png' % (particle_name,config))) diff --git a/benchmarks/dis/dis.sh b/benchmarks/dis/dis.sh index 2c25719a64a05c61a3c3e3b7cead3597dfc56d10..7b5d952bbcaa697e80fb2551e81e57a257627882 100755 --- a/benchmarks/dis/dis.sh +++ b/benchmarks/dis/dis.sh @@ -128,7 +128,7 @@ if [[ "$?" -ne "0" ]] ; then exit 1 fi -python benchmarks/dis/analysis/truth_reconstruction.py --rec_file ${REC_FILE} --config ${PLOT_TAG} --results_path ${RESULTS_PATH} --nevents ${JUGGLER_N_EVENTS} +python benchmarks/dis/analysis/truth_reconstruction.py --rec_file ${REC_FILE} --config ${PLOT_TAG}_${DETECTOR_CONFIG} --results_path ${RESULTS_PATH} --nevents ${JUGGLER_N_EVENTS} if [[ "$?" -ne "0" ]] ; then echo "ERROR running truth_reconstruction script" exit 1 diff --git a/benchmarks/single/analysis/analyze.cxx b/benchmarks/single/analysis/analyze.cxx index 4070868e5e475f4b33a38c8b163b2f201ca96d3b..8151c94a5a0437ef0890d9d415981bcad49b82c4 100644 --- a/benchmarks/single/analysis/analyze.cxx +++ b/benchmarks/single/analysis/analyze.cxx @@ -8,7 +8,7 @@ int analyze(std::string file) { // open dataframe - ROOT::RDataFrame df("events", file, {"GeneratedParticles", "ReconstructedParticles"}); + ROOT::RDataFrame df("events", file, {"GeneratedParticles", "ReconstructedChargedParticles"}); // count total events auto count = df.Count(); @@ -21,7 +21,7 @@ int analyze(std::string file) auto d = df .Define("n_tracks_gen", n_tracks, {"GeneratedParticles"}) - .Define("n_tracks_rec", n_tracks, {"ReconstructedParticles"}) + .Define("n_tracks_rec", n_tracks, {"ReconstructedChargedParticles"}) ; auto stats_n_tracks_gen = d.Stats("n_tracks_gen"); diff --git a/benchmarks/single/analyze.sh b/benchmarks/single/analyze.sh index 6271888dfc00173af9d9bdf661041970d6415e7e..681e32ccc91705d5b46a3fc6483b04b101d442ac 100644 --- a/benchmarks/single/analyze.sh +++ b/benchmarks/single/analyze.sh @@ -10,7 +10,7 @@ if [[ "$?" -ne "0" ]] ; then exit 1 fi -python benchmarks/dis/analysis/truth_reconstruction.py --rec_file ${JUGGLER_REC_FILE} --config ${JUGGLER_FILE_NAME_TAG} --results_path ${RESULTS_PATH} --nevents ${JUGGLER_N_EVENTS} +python benchmarks/dis/analysis/truth_reconstruction.py --rec_file ${JUGGLER_REC_FILE} --config ${JUGGLER_FILE_NAME_TAG}_${DETECTOR_CONFIG} --results_path ${RESULTS_PATH} --nevents ${JUGGLER_N_EVENTS} if [[ "$?" -ne "0" ]] ; then echo "ERROR running truth_reconstruction script" exit 1 diff --git a/benchmarks/single/pi-_1GeV_3to45deg.steer b/benchmarks/single/pi-_1GeV_3to45deg.steer index f547e2e116d6b7a7bb1896dae75ee09090195fb5..40d767e5e0037f91e293e53dd3fc7ad5c468a2f6 100644 --- a/benchmarks/single/pi-_1GeV_3to45deg.steer +++ b/benchmarks/single/pi-_1GeV_3to45deg.steer @@ -3,7 +3,7 @@ from g4units import mm, GeV, MeV, degree SIM = DD4hepSimulation() SIM.gun.energy = 1*GeV -SIM.gun.particle = "e-" +SIM.gun.particle = "pi-" SIM.gun.position = (0.0, 0.0, 0.0) SIM.gun.direction = (0.0, 0.0, 1.0) SIM.gun.distribution = "cos(theta)"