3
# This file is part of MAUS: http://micewww.pp.rl.ac.uk/projects/maus
5
# MAUS is free software: you can redistribute it and/or modify
6
# it under the terms of the GNU General Public License as published by
7
# the Free Software Foundation, either version 3 of the License, or
8
# (at your option) any later version.
10
# MAUS is distributed in the hope that it will be useful,
11
# but WITHOUT ANY WARRANTY; without even the implied warranty of
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
# GNU General Public License for more details.
15
# You should have received a copy of the GNU General Public License
16
# along with MAUS. If not, see <http://www.gnu.org/licenses/>.
20
import io # generic python library for I/O
25
# definitions of MAUS data structure for PyROOT
26
import libMausCpp #pylint: disable = W0611
39
upstream_reference = 9001
40
downstream_reference = 9002
42
print_everything = False
48
number_reference_cut = 0
49
number_reference_e = 0
51
reference_hit_count = 0
56
if len( sys.argv ) <= 1 :
57
print "No File Supplied."
60
filename = sys.argv[1]
66
infile = ROOT.TFile( filename, "READ" )
68
data = ROOT.MAUS.Data()
69
tree = infile.Get("Spill")
70
tree.SetBranchAddress("data", data)
72
kalman_up_bunches = [ xboa.Bunch.Bunch() for i in range( 5 ) ]
73
kalman_down_bunches = [ xboa.Bunch.Bunch() for i in range( 5 ) ]
74
reference1_bunch = xboa.Bunch.Bunch()
75
reference2_bunch = xboa.Bunch.Bunch()
78
print "Please Wait..."
81
global number_recon_cut
82
global number_reference_cut
83
global number_reference_e
85
global upstream_reference
86
global downstream_reference
90
global reference_hit_count
93
for i in range( tree.GetEntries() ) :
95
spill = data.GetSpill()
97
if spill.GetDaqEventType() != "physics_event" :
101
for j in range( spill.GetReconEvents().size() ) :
102
for k in range( spill.GetReconEvents()[j].GetSciFiEvent().scifitracks().size() ) :
103
track = spill.GetReconEvents()[j].GetSciFiEvent().scifitracks()[k]
105
if track.tracker() == 0 :
106
appendHits( kalman_up_bunches, track )
107
appendMC( reference1_bunch, track )
108
elif track.tracker() == 1 :
109
appendHits( kalman_down_bunches, track )
110
appendMC( reference2_bunch, track )
112
print "Unknown Tracker,", track.tracker()
117
for i in range( 5 ) :
118
number_kalman += len( kalman_up_bunches[i] )
119
number_kalman += len( kalman_down_bunches[i] )
122
print "Found ", number_kalman, " Kalman Points"
123
print "Found ", len( reference1_bunch ) + len( reference2_bunch ), " Kalman MC Hits"
125
print "Cut", number_recon_cut, "Particles from the Reconstruction."
126
# print "Cut", number_reference_cut, "Particles from the Reference Planes."
127
# print "Removed", number_reference_e, "Electrons from Reference Planes"
129
print "Calculating Emittances"
131
print reference_hit_count
135
reference1_means = reference1_bunch.mean( ['x', 'y', 'z', 'pz', 'p', 'energy', 'bz' ] )
136
reference1_emittance = reference1_bunch.get_emittance( ['x', 'y'] )
137
reference1_weight = reference1_bunch.bunch_weight()
138
reference1_beta = reference1_bunch.get_beta( ['x', 'y'] )
140
reference2_means = reference2_bunch.mean( ['x', 'y', 'z', 'pz', 'p', 'energy', 'bz' ] )
141
reference2_emittance = reference2_bunch.get_emittance( ['x', 'y'] )
142
reference2_weight = reference2_bunch.bunch_weight()
143
reference2_beta = reference2_bunch.get_beta( ['x', 'y'] )
147
print "=========================================="
148
print " --- USING KALMAN MC POINTS --- "
149
print "=========================================="
153
print " --- Tracker 1 --- "
155
print "Weight = " + str( reference1_weight )
156
print "Beta = " + str( reference1_beta )
157
print "Mean x = " + str( reference1_means[ 'x' ] )
158
print "Mean y = " + str( reference1_means[ 'y' ] )
159
print "Mean z = " + str( reference1_means[ 'z' ] )
160
print "Mean pz = " + str( reference1_means[ 'pz' ] )
161
print "Mean p = " + str( reference1_means[ 'p' ] )
162
print "Mean Energy = " + str( reference1_means[ 'energy' ] )
163
print "Mean Bz = " + str( reference1_means[ 'bz' ] )
164
print "Emittance = " + str( reference1_emittance )
168
print " --- Tracker 2 --- "
170
print "Weight = " + str( reference2_weight )
171
print "Beta = " + str( reference2_beta )
172
print "Mean x = " + str( reference2_means[ 'x' ] )
173
print "Mean y = " + str( reference2_means[ 'y' ] )
174
print "Mean z = " + str( reference2_means[ 'z' ] )
175
print "Mean pz = " + str( reference2_means[ 'pz' ] )
176
print "Mean p = " + str( reference2_means[ 'p' ] )
177
print "Mean Energy = " + str( reference2_means[ 'energy' ] )
178
print "Mean Bz = " + str( reference2_means[ 'bz' ] )
179
print "Emittance = " + str( reference2_emittance )
183
kalman1_means = kalman_up_bunches[0].mean( ['x', 'y', 'z', 'pz', 'p', 'energy', 'bz' ] )
184
kalman1_emittance = kalman_up_bunches[0].get_emittance( ['x', 'y'] )
185
kalman1_weight = kalman_up_bunches[0].bunch_weight()
186
kalman1_beta = kalman_up_bunches[0].get_beta( ['x', 'y'] )
188
kalman2_means = kalman_down_bunches[0].mean( ['x', 'y', 'z', 'pz', 'p', 'energy', 'bz' ] )
189
kalman2_emittance = kalman_down_bunches[0].get_emittance( ['x', 'y'] )
190
kalman2_weight = kalman_down_bunches[0].bunch_weight()
191
kalman2_beta = kalman_down_bunches[0].get_beta( ['x', 'y'] )
194
print "=========================================="
195
print " --- USING KALMAN FITTED TRACK POINTS --- "
196
print "=========================================="
200
print " --- Tracker 1 --- "
202
print "Weight = " + str( kalman1_weight )
203
print "Beta = " + str( kalman1_beta )
204
print "Mean x = " + str( kalman1_means[ 'x' ] )
205
print "Mean y = " + str( kalman1_means[ 'y' ] )
206
print "Mean z = " + str( kalman1_means[ 'z' ] )
207
print "Mean pz = " + str( kalman1_means[ 'pz' ] )
208
print "Mean p = " + str( kalman1_means[ 'p' ] )
209
print "Mean Energy = " + str( kalman1_means[ 'energy' ] )
210
print "Mean Bz = " + str( kalman1_means[ 'bz' ] )
211
print "Emittance = " + str( kalman1_emittance )
215
print " --- Tracker 2 --- "
217
print "Weight = " + str( kalman2_weight )
218
print "Beta = " + str( kalman2_beta )
219
print "Mean x = " + str( kalman2_means[ 'x' ] )
220
print "Mean y = " + str( kalman2_means[ 'y' ] )
221
print "Mean z = " + str( kalman2_means[ 'z' ] )
222
print "Mean pz = " + str( kalman2_means[ 'pz' ] )
223
print "Mean p = " + str( kalman2_means[ 'p' ] )
224
print "Mean Energy = " + str( kalman2_means[ 'energy' ] )
225
print "Mean Bz = " + str( kalman2_means[ 'bz' ] )
226
print "Emittance = " + str( kalman2_emittance )
231
if print_everything :
232
printPlots( reference1_bunch, "Ref1_" )
233
printPlots( reference2_bunch, "Ref2_" )
234
printPlots( kalman_up_bunches[0], "Kal_up_1_" )
235
printPlots( kalman_up_bunches[1], "Kal_up_2_" )
236
printPlots( kalman_up_bunches[2], "Kal_up_3_" )
237
printPlots( kalman_up_bunches[3], "Kal_up_4_" )
238
printPlots( kalman_up_bunches[4], "Kal_up_5_" )
239
printPlots( kalman_down_bunches[0], "Kal_down_1_" )
240
printPlots( kalman_down_bunches[1], "Kal_down_2_" )
241
printPlots( kalman_down_bunches[2], "Kal_down_3_" )
242
printPlots( kalman_down_bunches[3], "Kal_down_4_" )
243
printPlots( kalman_down_bunches[4], "Kal_down_5_" )
246
if print_data is True :
248
print "Saving Station Data"
251
with open( 'station_data.txt', 'w' ) as outfile :
252
outfile.write( '# StationNum Mean X Mean Y Mean Px Mean Py Mean Pz Mean Pt Mean Bz Energy Beta Emittance Weight \n' )
254
for i in range( 5 ) :
255
bun_up = kalman_up_bunches[i]
256
means_up = bun_up.mean( ['x','y','px','py','pz','pt','energy','bz'] )
258
outfile.write( "UPSTREAM " + str( i ) + ' ' +
259
str( means_up[ 'x' ] ) + ' ' +
260
str( means_up[ 'y' ] ) + ' ' +
261
str( means_up[ 'px' ] ) + ' ' +
262
str( means_up[ 'py' ] ) + ' ' +
263
str( means_up[ 'pz' ] ) + ' ' +
264
str( means_up[ 'pt' ] ) + ' ' +
265
str( means_up[ 'bz' ] ) + ' ' +
266
str( means_up[ 'energy' ] ) + ' ' +
267
str( bun_up.get_emittance( [ 'x','y' ] ) ) + ' ' +
268
str( bun_up.get_beta( ['x','y'] ) ) + ' ' +
269
str( bun_up.bunch_weight() ) + "\n" )
271
outfile.write( '\n' )
272
for i in range( 5 ) :
273
bun_down = kalman_down_bunches[i]
274
means_down = bun_down.mean( ['x','y','px','py','pz','pt','energy','bz'] )
276
outfile.write( "DOWNSTREAM " + str( i ) + ' ' +
277
str( means_down[ 'x' ] ) + ' ' +
278
str( means_down[ 'y' ] ) + ' ' +
279
str( means_down[ 'px' ] ) + ' ' +
280
str( means_down[ 'py' ] ) + ' ' +
281
str( means_down[ 'pz' ] ) + ' ' +
282
str( means_down[ 'pt' ] ) + ' ' +
283
str( means_down[ 'bz' ] ) + ' ' +
284
str( means_down[ 'energy' ] ) + ' ' +
285
str( bun_down.get_emittance( [ 'x','y' ] ) ) + ' ' +
286
str( bun_down.get_beta( ['x','y'] ) ) + ' ' +
287
str( bun_down.bunch_weight() ) + "\n" )
289
print 'station_data.txt Created'
293
def appendHits( bunch_list, track ) :
294
global number_recon_cut
295
if track.P_value() < p_value_cut :
296
number_recon_cut += 1
299
trackPoints = track.scifitrackpoints()
301
for point in trackPoints :
302
if point.plane() != 0 :
313
if math.sqrt(px**2 + py**2) > pt_cut or pz > pz_cut :
314
print "KAL - OOPS :", px, py, pz, track.P_value()
315
number_recon_cut += 1
322
hit = xboa.Hit.Hit.new_from_dict( { 'x':x, 'y':y, 'z':z, 'px':px, 'py':py, 'pz':pz, 'pid':pid, 'bz':bz, 'mass':xboa.Common.pdg_pid_to_mass[pid] }, 'energy' )
323
bunch_list[ point.station() ].append( hit )
327
def appendMC( bunch, track ) :
328
global reference_hit_count
330
trackPoints = track.scifitrackpoints()
332
for point in trackPoints :
333
if point.station() != 0 or point.plane() != 0 :
348
hit = xboa.Hit.Hit.new_from_dict( { 'x':x, 'y':y, 'z':z, 'px':px, 'py':py, 'pz':pz, 'pid':pid, 'bz':bz, 'mass':xboa.Common.pdg_pid_to_mass[pid] }, 'energy' )
350
reference_hit_count += 1
353
def appendReferenceHit( bunch, spechit ) :
355
x = spechit.GetPosition()[0]
356
y = spechit.GetPosition()[1]
357
z = spechit.GetPosition()[2]
358
px = spechit.GetMomentum()[0]
359
py = spechit.GetMomentum()[1]
360
pz = spechit.GetMomentum()[2]
361
pid = abs( spechit.GetParticleId() )
365
hit = xboa.Hit.Hit.new_from_dict( { 'x':x, 'y':y, 'z':z, 'px':px, 'py':py, 'pz':pz, 'pid':pid, 'bz':bz, 'mass':xboa.Common.pdg_pid_to_mass[pid] }, 'energy' )
369
#def check_hit( hit ) :
370
# if hit.GetParticleId() != pid_cut :
373
# x = hit.GetPosition()[0]
374
# y = hit.GetPosition()[1]
375
# z = hit.GetPosition()[2]
377
# if ( math.sqrt( x*x + y*y ) > aperture_cut ) :
380
# px = hit.GetMomentum()[0]
381
# py = hit.GetMomentum()[1]
382
# pz = hit.GetMomentum()[2]
383
# PT = math.sqrt(px**2 + py**2)
387
# if pz > pz_cut or pz < 0.0 :
394
def printPlots( bunch, prefix ) :
395
canvas, hist = bunch.root_histogram( 'x', 'm', 'px', 'MeV/c' )
396
canvas.Print( prefix+"EmittanceX.eps", "eps")
398
canvas, hist = bunch.root_histogram( 'y', 'm', 'py', 'MeV/c' )
399
canvas.Print( prefix+"EmittanceY.eps", "eps")
401
canvas, hist = bunch.root_histogram( 'pt', 'MeV/c' )
402
canvas.Print( prefix+"PT.eps", "eps")
404
canvas, hist = bunch.root_histogram( 'pz', 'MeV/c' )
405
canvas.Print( prefix+"PZ.eps", "eps")
407
canvas, hist = bunch.root_histogram( 'x', 'mm', 'y', 'MeV/c' )
408
canvas.Print( prefix+"X-Y.eps", "eps")
410
canvas, hist = bunch.root_histogram( 'px', 'mm', 'py', 'MeV/c' )
411
canvas.Print( prefix+"PX-PY.eps", "eps")
414
filename = prefix+"hitList.txt"
416
with open( filename, 'w' ) as outfile :
417
outfile.write( '# Position (x,y,z) | Momentum (px,py,pz) | Magnetic Field (bz) \n\n' )
420
outfile.write( str(hit.get('x')) + ' '
421
+ str(hit.get( 'y' )) + ' '
422
+ str(hit.get( 'z' )) + ' '
423
+ str(hit.get( 'px' )) + ' '
424
+ str(hit.get( 'py' )) + ' '
425
+ str(hit.get( 'pz' )) + ' '
426
+ str(hit.get( 'bz' )) + '\n' )
429
if __name__ == "__main__":