Skip to content
Snippets Groups Projects
Commit 5ed37b55 authored by Jihee Kim's avatar Jihee Kim
Browse files

Resolve "Add true decaying particle info onto event display"

parent f8df6fdc
No related branches found
No related tags found
1 merge request!149Resolve "Add true decaying particle info onto event display"
...@@ -6,6 +6,7 @@ from GaudiKernel.SystemOfUnits import mm, MeV, rad, ns ...@@ -6,6 +6,7 @@ from GaudiKernel.SystemOfUnits import mm, MeV, rad, ns
from Configurables import ApplicationMgr, EICDataSvc, PodioOutput, GeoSvc from Configurables import ApplicationMgr, EICDataSvc, PodioOutput, GeoSvc
from Configurables import PodioInput from Configurables import PodioInput
from Configurables import Jug__Base__InputCopier_dd4pod__Geant4ParticleCollection_dd4pod__Geant4ParticleCollection_ as MCCopier
from Configurables import Jug__Digi__CalorimeterHitDigi as CalHitDigi from Configurables import Jug__Digi__CalorimeterHitDigi as CalHitDigi
from Configurables import Jug__Reco__CalorimeterHitReco as CalHitReco from Configurables import Jug__Reco__CalorimeterHitReco as CalHitReco
from Configurables import Jug__Reco__CalorimeterHitsEtaPhiProjector as CalHitsProj from Configurables import Jug__Reco__CalorimeterHitsEtaPhiProjector as CalHitsProj
...@@ -37,6 +38,12 @@ podioevent = EICDataSvc('EventDataSvc', inputs=kwargs['input'].split(','), Outpu ...@@ -37,6 +38,12 @@ podioevent = EICDataSvc('EventDataSvc', inputs=kwargs['input'].split(','), Outpu
podin = PodioInput('PodioReader', collections=['mcparticles', 'EcalBarrelHits'], OutputLevel=DEBUG) podin = PodioInput('PodioReader', collections=['mcparticles', 'EcalBarrelHits'], OutputLevel=DEBUG)
podout = PodioOutput('out', filename=kwargs['output']) podout = PodioOutput('out', filename=kwargs['output'])
mccopier = MCCopier('MCCopier',
# OutputLevel=DEBUG,
inputCollection='mcparticles',
outputCollection='mcparticles2')
# use the same daq_setting for digi/reco pair # use the same daq_setting for digi/reco pair
imcal_barrel_daq = dict( imcal_barrel_daq = dict(
dynamicRangeADC=3.*MeV, dynamicRangeADC=3.*MeV,
...@@ -86,7 +93,7 @@ imcal_barrel_clreco = RecoCoG('imcal_barrel_clreco', ...@@ -86,7 +93,7 @@ imcal_barrel_clreco = RecoCoG('imcal_barrel_clreco',
podout.outputCommands = ['keep *'] podout.outputCommands = ['keep *']
ApplicationMgr( ApplicationMgr(
TopAlg=[podin, TopAlg=[podin, mccopier,
imcal_barrel_digi, imcal_barrel_reco, imcal_barrel_digi, imcal_barrel_reco,
imcal_barrel_merger, imcal_barrel_cl, imcal_barrel_clreco, imcal_barrel_merger, imcal_barrel_cl, imcal_barrel_clreco,
podout], podout],
......
...@@ -87,7 +87,7 @@ ls -lh ${CB_EMCAL_GEN_FILE} ...@@ -87,7 +87,7 @@ ls -lh ${CB_EMCAL_GEN_FILE}
# Run geant4 simulations # Run geant4 simulations
npsim --runType batch \ npsim --runType batch \
-v WARNING \ -v WARNING \
--part.minimalKineticEnergy "1*TeV" \ --part.minimalKineticEnergy "0.5*MeV" \
--numberOfEvents ${CB_EMCAL_NUMEV} \ --numberOfEvents ${CB_EMCAL_NUMEV} \
--compactFile ${CB_EMCAL_COMPACT_PATH} \ --compactFile ${CB_EMCAL_COMPACT_PATH} \
--inputFiles ${CB_EMCAL_GEN_FILE} \ --inputFiles ${CB_EMCAL_GEN_FILE} \
......
...@@ -83,7 +83,7 @@ ls -lh ${CB_EMCAL_GEN_FILE} ...@@ -83,7 +83,7 @@ ls -lh ${CB_EMCAL_GEN_FILE}
# Run geant4 simulations # Run geant4 simulations
npsim --runType batch \ npsim --runType batch \
-v WARNING \ -v WARNING \
--part.minimalKineticEnergy "1*TeV" \ --part.minimalKineticEnergy "0.5*MeV" \
--numberOfEvents ${CB_EMCAL_NUMEV} \ --numberOfEvents ${CB_EMCAL_NUMEV} \
--compactFile ${CB_EMCAL_COMPACT_PATH} \ --compactFile ${CB_EMCAL_COMPACT_PATH} \
--inputFiles ${CB_EMCAL_GEN_FILE} \ --inputFiles ${CB_EMCAL_GEN_FILE} \
......
...@@ -5,6 +5,10 @@ ...@@ -5,6 +5,10 @@
Author: Chao Peng (ANL) Author: Chao Peng (ANL)
Date: 04/30/2021 Date: 04/30/2021
Added true decaying particles on eta-phi plane projection plot
Author: Jihee Kim (ANL)
Data: 08/06/2021
''' '''
import os import os
...@@ -143,9 +147,26 @@ if __name__ == '__main__': ...@@ -143,9 +147,26 @@ if __name__ == '__main__':
df['theta'] = np.arccos(df['z'].values/df['r'].values)*1000. df['theta'] = np.arccos(df['z'].values/df['r'].values)*1000.
df['eta'] = -np.log(np.tan(df['theta'].values/1000./2.)) df['eta'] = -np.log(np.tan(df['theta'].values/1000./2.))
# Read all mc particles
dfallmcp = get_all_mcp(args.file, args.iev, 'mcparticles2')
pdgbase = ROOT.TDatabasePDG()
# Select decaying particles
dftemp = dfallmcp[dfallmcp['g4Parent'] == 1.0]
if len(dftemp) > 0:
dfdecaymcp = dftemp.copy()
for iptl in [0, len(dfdecaymcp) - 1]:
infoptl = pdgbase.GetParticle(int(dfdecaymcp['pid'].iloc[iptl]))
print("{} Decaying particle = {}, pdgcode = {}, charge = {}, mass = {}"\
.format(iptl, infoptl.GetName(), infoptl.PdgCode(), infoptl.Charge(), infoptl.Mass()))
# Calculate geometric variables of decaying particles
dfdecaymcp['r'] = np.sqrt(dfdecaymcp['vex'].values**2 + dfdecaymcp['vey'].values**2 + dfdecaymcp['vez'].values**2)
dfdecaymcp['phi'] = np.arctan2(dfdecaymcp['vey'].values, dfdecaymcp['vex'].values)*1000.
dfdecaymcp['theta'] = np.arccos(dfdecaymcp['vez'].values/dfdecaymcp['r'].values)*1000.
dfdecaymcp['eta'] = -np.log(np.tan(dfdecaymcp['theta'].values/1000./2.))
# truth # truth
dfmcp = get_mcp_simple(args.file, args.iev, 'mcparticles2').iloc[0] dfmcp = get_mcp_simple(args.file, args.iev, 'mcparticles2').iloc[0]
pdgbase = ROOT.TDatabasePDG() #pdgbase = ROOT.TDatabasePDG()
inpart = pdgbase.GetParticle(int(dfmcp['pid'])) inpart = pdgbase.GetParticle(int(dfmcp['pid']))
print("Incoming particle = {}, pdgcode = {}, charge = {}, mass = {}"\ print("Incoming particle = {}, pdgcode = {}, charge = {}, mass = {}"\
.format(inpart.GetName(), inpart.PdgCode(), inpart.Charge(), inpart.Mass())) .format(inpart.GetName(), inpart.PdgCode(), inpart.Charge(), inpart.Mass()))
...@@ -216,6 +237,9 @@ if __name__ == '__main__': ...@@ -216,6 +237,9 @@ if __name__ == '__main__':
ax, sm = draw_heatmap(axs[0], df['eta'].values, df['phi'].values, weights=df['energy'].values, ax, sm = draw_heatmap(axs[0], df['eta'].values, df['phi'].values, weights=df['energy'].values,
bins=(np.arange(*eta_rg, step=args.topo_size/1000.), np.arange(*phi_rg, step=args.topo_size)), bins=(np.arange(*eta_rg, step=args.topo_size/1000.), np.arange(*phi_rg, step=args.topo_size)),
cmap=cmap, cmin=0., pc_kw=dict(alpha=0.8, edgecolor='k')) cmap=cmap, cmin=0., pc_kw=dict(alpha=0.8, edgecolor='k'))
# draw true decaying particle position
if len(dftemp) > 0:
ax.scatter(dfdecaymcp['eta'].values, dfdecaymcp['phi'].values, marker='x', color='red', s=22**2, linewidth=5.0)
ax.set_ylabel(r'$\phi$ (mrad)', fontsize=32) ax.set_ylabel(r'$\phi$ (mrad)', fontsize=32)
ax.set_xlabel(r'$\eta$', fontsize=32) ax.set_xlabel(r'$\eta$', fontsize=32)
......
...@@ -3,6 +3,10 @@ ...@@ -3,6 +3,10 @@
Author: Chao Peng (ANL) Author: Chao Peng (ANL)
Date: 04/30/2021 Date: 04/30/2021
Added all mc particle info to obtain decaying particles
Author: Jihee Kim (ANL)
Date: 08/06/2021
''' '''
import os import os
...@@ -79,6 +83,31 @@ def get_mcp_simple(path, evnums=None, branch='mcparticles2'): ...@@ -79,6 +83,31 @@ def get_mcp_simple(path, evnums=None, branch='mcparticles2'):
idb += 1 idb += 1
return pd.DataFrame(data=dbuf[:idb], columns=['event', 'px', 'py', 'pz', 'pid', 'status']) return pd.DataFrame(data=dbuf[:idb], columns=['event', 'px', 'py', 'pz', 'pid', 'status'])
#######################################
# read all mc particles from root file
#######################################
def get_all_mcp(path, evnums=None, branch='mcparticles2'):
f = ROOT.TFile(path)
events = f.events
if evnums is None:
evnums = np.arange(events.GetEntries())
elif isinstance(evnums, int):
evnums = [evnums]
dbuf = np.zeros(shape=(2000*len(evnums), 10))
idb = 0
for iev in evnums:
if iev >= events.GetEntries():
print('Error: event {:d} is out of range (0 - {:d})'.format(iev, events.GetEntries() - 1))
continue
events.GetEntry(iev)
# extract mc particle data
for ptl in getattr(events, branch):
dbuf[idb] = (iev, ptl.ps.x, ptl.ps.y, ptl.ps.z, ptl.pdgID, ptl.status, ptl.g4Parent, ptl.ve.x, ptl.ve.y, ptl.ve.z)
idb += 1
return pd.DataFrame(data=dbuf[:idb], columns=['event', 'px', 'py', 'pz', 'pid', 'status', 'g4Parent', 'vex', 'vey', 'vez'])
# read hits data from root file # read hits data from root file
def get_hits_data(path, evnums=None, branch='RecoEcalBarrelHits'): def get_hits_data(path, evnums=None, branch='RecoEcalBarrelHits'):
......
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