Belle II Software  release-06-02-00
makeMCParticlesFromGCRData.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 
4 
11 
12 # --------------------------------------------------------------------------------
13 # Make MCParticles from reconstructed cosmic tracks and write to basf2 root file
14 # This file can be used as input to simulation, see examples/simGCRData.py
15 # --------------------------------------------------------------------------------
16 
17 import basf2 as b2
18 from rawdata import add_unpackers
19 from reconstruction import add_cosmics_reconstruction
20 from ROOT import Belle2
21 import math
22 
23 
24 class MakeMCParticles(b2.Module):
25  ''' make MCParticles from reconstructed cosmic tracks '''
26 
27  def initialize(self):
28  ''' initialization '''
29 
30  mcParticles = Belle2.PyStoreArray('MCParticles')
31  mcParticles.registerInDataStore()
32 
33  def event(self):
34  ''' event processing '''
35 
36  mcParticles = Belle2.PyStoreArray('MCParticles')
37  tracks = Belle2.PyStoreArray('Tracks')
38  absPDG = abs(Belle2.Const.muon.getPDGCode())
39  mass = Belle2.Const.muon.getMass()
40  for track in tracks:
41  extHits = track.getRelationsWith('ExtHits')
42  selExtHits = []
43  for extHit in extHits:
44  if extHit.getDetectorID() != Belle2.Const.TOP:
45  continue
46  if abs(extHit.getPdgCode()) != absPDG:
47  continue
48  if extHit.getPosition().Perp() < 123.5:
49  continue
50  if extHit.getPosition() * extHit.getMomentum() > 0:
51  continue
52  selExtHits.append(extHit)
53  if len(selExtHits) == 0:
54  continue
55  sortedExtHits = sorted(selExtHits, key=lambda x: (x.getTOF()))
56  extHit = sortedExtHits[0]
57  pos = extHit.getPosition()
58  mom = extHit.getMomentum()
59  tof = extHit.getTOF()
60  part = mcParticles.appendNew()
61  part.setPDG(extHit.getPdgCode())
62  part.setMass(mass)
63  part.setProductionVertex(pos)
64  part.setProductionTime(tof)
65  part.setMomentum(mom)
66  part.setEnergy(math.sqrt(mom.Mag2() + mass**2))
67  part.setValidVertex(True)
68  part.setStatus(Belle2.MCParticle.c_PrimaryParticle)
69  part.addStatus(Belle2.MCParticle.c_StableInGenerator)
70 
71  if mcParticles.getEntries() > 0:
72  self.return_value(1)
73  else:
74  self.return_value(0)
75 
76 
77 # Create path
78 main = b2.create_path()
79 emptypath = b2.create_path()
80 
81 # input
82 roinput = b2.register_module('RootInput')
83 # roinput = register_module('SeqRootInput')
84 main.add_module(roinput)
85 
86 # geometry parameters
87 gearbox = b2.register_module('Gearbox')
88 main.add_module(gearbox)
89 
90 # Geometry
91 geometry = b2.register_module('Geometry')
92 main.add_module(geometry)
93 
94 # unpackers
95 add_unpackers(main, components=['CDC'])
96 
97 # reconstruction
98 add_cosmics_reconstruction(main, components=['CDC'], merge_tracks=True)
99 
100 # make MCParticles from reconstructed tracks
101 maker = MakeMCParticles()
102 main.add_module(maker)
103 maker.if_false(emptypath)
104 
105 # output
106 output = b2.register_module('RootOutput')
107 output.param('branchNames', ['MCParticles'])
108 main.add_module(output)
109 
110 # Print progress
111 progress = b2.register_module('Progress')
112 main.add_module(progress)
113 
114 # Process events
115 b2.process(main)
116 
117 # Print statistics
118 print(b2.statistics)
a (simplified) python wrapper for StoreArray.
Definition: PyStoreArray.h:56