-
Notifications
You must be signed in to change notification settings - Fork 101
/
Copy pathParticleHandler.py
156 lines (127 loc) · 5.49 KB
/
ParticleHandler.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
"""Configuration Helper for ParticleHandler"""
from DDSim.Helper.ConfigHelper import ConfigHelper
from g4units import MeV, mm
import logging
logger = logging.getLogger(__name__)
class ParticleHandler(ConfigHelper):
"""Configuration for the Particle Handler/ MCTruth treatment"""
def __init__(self):
super(ParticleHandler, self).__init__()
self._saveProcesses = ['Decay']
self._minimalKineticEnergy = 1 * MeV
self._keepAllParticles = False
self._printEndTracking = False
self._printStartTracking = False
self._minDistToParentVertex = 2.2e-14 * mm
self._enableDetailedHitsAndParticleInfo = False
self._userParticleHandler = "Geant4TCUserParticleHandler"
self._closeProperties()
@property
def enableDetailedHitsAndParticleInfo(self):
"""Enable lots of printout on simulated hits and MC-truth information"""
return self._enableDetailedHitsAndParticleInfo
@enableDetailedHitsAndParticleInfo.setter
def enableDetailedHitsAndParticleInfo(self, val):
self._enableDetailedHitsAndParticleInfo = val
@property
def userParticleHandler(self):
"""Optionally enable an extended Particle Handler"""
return self._userParticleHandler
@userParticleHandler.setter
def userParticleHandler(self, val):
self._userParticleHandler = val
@property
def minDistToParentVertex(self):
"""Minimal distance between particle vertex and endpoint of parent after
which the vertexIsNotEndpointOfParent flag is set
"""
return self._minDistToParentVertex
@minDistToParentVertex.setter
def minDistToParentVertex(self, val):
self._minDistToParentVertex = val
@property
def saveProcesses(self):
"""List of processes to save, on command line give as whitespace separated string in quotation marks"""
return self._saveProcesses
@saveProcesses.setter
def saveProcesses(self, stringVal):
self._saveProcesses = ConfigHelper.makeList(stringVal)
@property
def minimalKineticEnergy(self):
"""MinimalKineticEnergy to store particles created in the tracking region"""
return self._minimalKineticEnergy
@minimalKineticEnergy.setter
def minimalKineticEnergy(self, val):
self._minimalKineticEnergy = val
@property
def keepAllParticles(self):
""" Keep all created particles """
return self._keepAllParticles
@keepAllParticles.setter
def keepAllParticles(self, val):
self._keepAllParticles = val
@property
def printStartTracking(self):
""" Printout at Start of Tracking """
return self._printStartTracking
@printStartTracking.setter
def printStartTracking(self, val):
self._printEndTracking = val
@property
def printEndTracking(self):
""" Printout at End of Tracking """
return self._printEndTracking
@printEndTracking.setter
def printEndTracking(self, val):
self._printEndTracking = val
def setDumpDetailedParticleInfo(self, kernel, DDG4):
# ---- debug code from Markus for detailed dumps of hits and MC-truth assignement ------
# Add the particle dumper to associate the MC truth
evt = DDG4.EventAction(kernel, "Geant4ParticleDumpAction/ParticleDump")
kernel.eventAction().adopt(evt)
evt.enableUI()
# Add the hit dumper BEFORE any hit truth is fixed
evt = DDG4.EventAction(kernel, "Geant4HitDumpAction/RawDump")
kernel.eventAction().adopt(evt)
evt.enableUI()
# Add the hit dumper to the event action sequence
evt = DDG4.EventAction(kernel, "Geant4HitTruthHandler/HitTruth")
kernel.eventAction().adopt(evt)
evt.enableUI()
# Add the hit dumper AFTER any hit truth is fixed. We should see the reduced track references
evt = DDG4.EventAction(kernel, "Geant4HitDumpAction/HitDump")
kernel.eventAction().adopt(evt)
evt.enableUI()
def setupUserParticleHandler(self, part, kernel, DDG4):
"""Create the UserParticleHandler and configure it.
FIXME: this is not extensible at the moment
"""
if not self.userParticleHandler:
return
if self.userParticleHandler not in ["Geant4TCUserParticleHandler"]:
logger.error("unknown UserParticleHandler: %r" % self.userParticleHandler)
exit(1)
if self.userParticleHandler == "Geant4TCUserParticleHandler":
user = DDG4.Action(kernel, "%s/UserParticleHandler" % self.userParticleHandler)
try:
user.TrackingVolume_Zmax = DDG4.tracker_region_zmax
user.TrackingVolume_Rmax = DDG4.tracker_region_rmax
except AttributeError as e:
logger.error("Attribute of tracker region missing in detector model %s", e)
logger.error(" make sure to specify the global constants tracker_region_zmax and tracker_region_rmax ")
logger.error(" this is needed for the MC-truth link of created sim-hits ! ")
logger.error(" Or Disable the User Particle Handler with --part.userParticleHandler=''")
exit(1)
try:
user.TrackingVolume_Zmin = DDG4.tracker_region_zmin
except AttributeError as e:
logger.debug("Attribute tracker_region_zmin for asymmetric tracker region missing %s", e)
logger.debug(" will use symmetric region defined by tracker_region_zmax")
user.TrackingVolume_Zmin = str(-float(DDG4.tracker_region_zmax))
logger.info(" *** definition of tracker region *** ")
logger.info(" tracker_region_zmin = %s", user.TrackingVolume_Zmin)
logger.info(" tracker_region_zmax = %s", user.TrackingVolume_Zmax)
logger.info(" tracker_region_rmax = %s", user.TrackingVolume_Rmax)
logger.info(" ************************************ ")
part.adopt(user)
return