4@begin_doc_example{python}
5@file iguana_ex_python_01_action_functions.py
6@brief Python version of `iguana_ex_cpp_01_action_functions.cc` (for more details, see this `.cc` file)
7@note You may need to run this example using `stdbuf -o0` (preceding your command) if the output appears to be jumbled
18 'iguana/algorithms/clas12/EventBuilderFilter/Algorithm.h',
19 'iguana/algorithms/clas12/SectorFinder/Algorithm.h',
20 'iguana/algorithms/clas12/MomentumCorrection/Algorithm.h',
23from cppyy.gbl
import hipo, iguana
27inFile = sys.argv[1]
if len(sys.argv)>1
else 'data.hipo'
28numEvents = int(sys.argv[2])
if len(sys.argv)>2
else 3
31reader = hipo.reader(inFile)
34banks = reader.getBanks([
43b_particle = hipo.getBanklistIndex(banks,
"REC::Particle")
44b_config = hipo.getBanklistIndex(banks,
"RUN::config")
45b_track = hipo.getBanklistIndex(banks,
"REC::Track");
46b_calorimeter = hipo.getBanklistIndex(banks,
"REC::Calorimeter");
47b_scintillator = hipo.getBanklistIndex(banks,
"REC::Scintillator");
55algo_eventbuilder_filter.SetOption(
'log',
'info')
56algo_sector_finder.SetOption(
'log',
'info')
57algo_momentum_correction.SetOption(
'log',
'info')
60algo_eventbuilder_filter.SetOption(
'pids', [11, 211, -211])
63algo_eventbuilder_filter.Start()
64algo_sector_finder.Start()
65algo_momentum_correction.Start()
69while(reader.next(banks)
and (numEvents==0
or iEvent < numEvents)):
73 particleBank = banks[b_particle]
74 configBank = banks[b_config]
75 trackBank = banks[b_track]
76 calorimeterBank = banks[b_calorimeter]
77 scintillatorBank = banks[b_scintillator]
83 print(f
'evnum = {configBank.getInt("event",0)}')
89 trackBank_sectors = []
90 trackBank_pindices = []
91 calorimeterBank_sectors = []
92 calorimeterBank_pindices = []
93 scintillatorBank_sectors = []
94 scintillatorBank_pindices = []
95 for r
in trackBank.getRowList():
96 trackBank_sectors.append(trackBank.getByte(
"sector", r))
97 trackBank_pindices.append(trackBank.getShort(
"pindex", r))
98 for r
in calorimeterBank.getRowList():
99 calorimeterBank_sectors.append(calorimeterBank.getByte(
"sector", r))
100 calorimeterBank_pindices.append(calorimeterBank.getShort(
"pindex", r))
101 for r
in scintillatorBank.getRowList():
102 scintillatorBank_sectors.append(scintillatorBank.getByte(
"sector", r))
103 scintillatorBank_pindices.append(scintillatorBank.getShort(
"pindex", r))
106 for row
in particleBank.getRowList():
109 pid = particleBank.getInt(
'pid', row)
110 if(algo_eventbuilder_filter.Filter(pid)):
114 sector = algo_sector_finder.GetStandardSector(
117 calorimeterBank_sectors,
118 calorimeterBank_pindices,
119 scintillatorBank_sectors,
120 scintillatorBank_pindices,
124 p_corrected = algo_momentum_correction.Transform(
125 particleBank.getFloat(
"px", row),
126 particleBank.getFloat(
"py", row),
127 particleBank.getFloat(
"pz", row),
130 configBank.getFloat(
"torus", 0)
134 print(f
'Analysis Particle PDG = {pid}')
135 print(f
' sector = {sector}')
136 print(f
' p_old = ({particleBank.getFloat("px", row):11.5f}, {particleBank.getFloat("py", row):11.5f}, {particleBank.getFloat("pz", row):11.5f})')
137 print(f
' p_new = ({p_corrected.px:11.5f}, {p_corrected.py:11.5f}, {p_corrected.pz:11.5f})')
140algo_eventbuilder_filter.Stop()
141algo_sector_finder.Stop()
142algo_momentum_correction.Stop()
Algorithm: Filter the REC::Particle (or similar) bank by PID from the Event Builder
Algorithm: Momentum Corrections
Algorithm: Find the sector for all rows in REC::Particle