00001
00002 ''' Several helper classes to assist in configuring GenTools. They
00003 assume geometry has already been setup. The helper classes that
00004 produce tools need to define a "tools()" method that returns an
00005 ordered list of what tools it created. Users of these helper classes
00006 should use them like:
00007
00008
00009
00010 '''
00011
00012 import GaudiKernel.SystemOfUnits as units
00013 from GenTools.GenToolsConf import GtHepEvtGenTool, GtPositionerTool
00014 from GenTools.GenToolsConf import GtGunGenTool, GtDiffuserBallTool
00015 from GenTools.GenToolsConf import GtTimeratorTool, GtTransformTool
00016 import LED
00017
00018 class Gun:
00019 '''
00020 Configure a particle gun based kinematics
00021 '''
00022
00023 def __init__(self,
00024 name = "gun",
00025 volume = '/dd/Structure/AD/far-oil1',
00026 gun = None,
00027 positioner = None,
00028 timerator = None,
00029 transformer = None
00030 ):
00031
00032 '''Construct the configuration. Coustom configured tools can
00033 be passed in or customization can be done after construction
00034 using the data members:
00035
00036 .gun
00037 .positioner
00038 .timerator
00039 .transformer
00040
00041 They can be accessed for additional, direct configuration.
00042
00043 If the Volume property for the positioner and transformer is
00044 not yet set, it will be set to the value of "volume"
00045 '''
00046
00047 if gun == None:
00048 gun = GtGunGenTool(name,
00049 ParticlesPerEvent = 1,
00050 ParticleName = 'e+',
00051 Momentum = 3*units.MeV,
00052 MomentumMode = 'Fixed',
00053 DirectionMode = 'Fixed',
00054 Direction = [1,0,0])
00055 if positioner == None:
00056 positioner = GtPositionerTool(name+"Positioner",
00057 Mode = 'Fixed',
00058 Position = [0,0,0])
00059 if timerator == None:
00060 timerator = GtTimeratorTool(name+"Timerator",
00061 LifeTime = 1*units.second)
00062 if transformer == None:
00063 transformer = GtTransformTool(name+"Transformer")
00064
00065 try:
00066 v = positioner.Volume
00067 except AttributeError:
00068 positioner.Volume = volume
00069
00070 try:
00071 v = transformer.Volume
00072 except AttributeError:
00073 transformer.Volume = volume
00074
00075 self.gun = gun
00076 self.positioner = positioner
00077 self.timerator = timerator
00078 self.transformer = transformer
00079 return
00080
00081 def setVolume(self,volumename):
00082 self.positioner.Volume = volumename
00083 self.transformer.Volume = volumename
00084 return
00085
00086 def tools(self):
00087 return [self.gun,self.positioner,self.timerator,self.transformer]
00088
00089 pass
00090
00091
00092 class DiffuserBall:
00093 '''
00094 Configure a calibration diffuser ball
00095 '''
00096
00097 def __init__(self,
00098 name = "deployedLed_ad1",
00099 volume = '/dd/Structure/AD/db-oil1',
00100 ball = None,
00101 positioner = None,
00102 timerator = None,
00103 transformer = None,
00104 useGeometry = True
00105 ):
00106
00107 '''Construct the configuration. Custom configured tools can
00108 be passed in or customization can be done after construction
00109 using the data members:
00110
00111 .ball
00112 .positioner
00113 .timerator
00114 .transformer
00115
00116 They can be accessed for additional, direct configuration.
00117
00118 If the Volume property for the positioner and transformer is
00119 not yet set, it will be set to the value of "volume"
00120 '''
00121
00122 if ball == None:
00123 ball = GtDiffuserBallTool(name+"ball",
00124 PhotonsPerEvent = 3500,
00125 WavelengthMode = 'Defined',
00126 Wavelength = 430.0*units.nanometer,
00127 WavelengthSpread = 5.0*units.nanometer,
00128 PdfWave = LED.PdfWave(),
00129 PdfEdgesWave = LED.PdfEdgesWave(),
00130 TimingMode = 'Defined',
00131 PdfTime = LED.PdfTime(),
00132 PdfEdgesTime = LED.PdfEdgesTime(),
00133 Radius = 0.9525*units.cm)
00134 if positioner == None:
00135 positioner = GtPositionerTool(name+"Positioner",
00136 Mode = 'Relative',
00137 Position = [0,0,0])
00138 if timerator == None:
00139 timerator = GtTimeratorTool(name+"Timerator",
00140 Mode = 'Relative',
00141 Distribution = 'Uniform',
00142 LifeTime = 1.0/(500.0*units.hertz))
00143 if transformer == None:
00144 transformer = GtTransformTool(name+"Transformer")
00145 self.geometryTool = None
00146 if useGeometry:
00147 from DetHelpers.DetHelpersConf import AutoPositionerTool
00148 self.geometryTool = AutoPositionerTool("diffuserBallGeomPos",
00149 PhysicalVolume = "pvDiffuserBall",
00150 LogicalVolume = "/dd/Geometry/CalibrationSources/lvLedSourceAssy",
00151 CoordinateDetElem = "/dd/Structure/AD/db-oil1",
00152 Position = [0., 0., 0.],
00153 Element = "db-ad1-deployedLed",
00154 ElementPath = "/dd/Structure/CalibrationSources")
00155
00156 self.ball = ball
00157 self.positioner = positioner
00158 self.timerator = timerator
00159 self.transformer = transformer
00160 if useGeometry:
00161 self.ball.GeomPosTool = self.geometryTool
00162 else:
00163 self.ball.GeomPosTool = ""
00164 self.setVolume( volume )
00165 return
00166
00167 def setVolume(self,volumename):
00168 self.positioner.Volume = volumename
00169 self.transformer.Volume = volumename
00170 if self.geometryTool != None:
00171 self.geometryTool.CoordinateDetElem = volumename
00172 return
00173
00174 def setPosition(self, position):
00175 self.positioner.Position = position
00176 if self.geometryTool != None:
00177 self.geometryTool.Position = position
00178
00179 def tools(self):
00180 return [self.ball,self.positioner,self.timerator,self.transformer]
00181
00182 pass
00183
00184
00185 class HepEVT:
00186 '''
00187 Configure kinematics to use a HepEVT source.
00188 '''
00189
00190 def __init__(self,
00191 hepEvtDataSource,
00192 name = None,
00193 positioner = None,
00194 timerator = None,
00195 transformer = None
00196 ):
00197 ''' Configure for a HepEVT data source. First argument is the
00198 data source and must be specified. If it is an executable
00199 source the last character in the string must be a pipe ('|')
00200 and if the executable is not specified with an absolute path
00201 it will be looked up using your PATH environment variable.
00202 You may specify the "positioner", "timerator", and "transformer" tools or later
00203 configure them through the members of these same names.
00204 '''
00205
00206 exe = hepEvtDataSource.split(' ')[0]
00207 if name == None:
00208
00209 exeName = exe[exe.rfind('/')+1:]
00210 dot = exeName.rfind('.')
00211 basename = exeName
00212 if dot > 0: basename = exeName[:dot]
00213 sanitized = basename.replace('.','_')
00214 name = sanitized
00215
00216
00217 if hepEvtDataSource[-1] == '|' and hepEvtDataSource[0] != '/':
00218 import os, os.path
00219 path = os.getenv('PATH')
00220 for p in path:
00221 if (os.path.isfile(path+'/'+exe)):
00222 hepEvtDataSource = path+'/'+exe + ' ' + ' '.join(hepEvtDataSource.split(' ')[1:])
00223 break
00224 continue
00225 pass
00226
00227 self.hepevt = GtHepEvtGenTool(name+'HepEvt',
00228 HepEvtDataSource = hepEvtDataSource)
00229 if positioner == None:
00230 positioner = GtPositionerTool(name+"Positioner")
00231 if timerator == None:
00232 timerator = GtTimeratorTool(name+"Timerator",
00233 LifeTime = 1*units.second)
00234 if transformer == None:
00235 transformer = GtTransformTool(name+"Transformer")
00236
00237
00238 self.positioner = positioner
00239
00240 self.timerator = timerator
00241
00242 self.transformer = transformer
00243
00244 return
00245
00246 def tools(self):
00247 return [self.hepevt,self.positioner,self.timerator,self.transformer]
00248
00249 pass
00250
00251