00001
00002
00003 '''
00004
00005 Configure the full chain of simulation from kinematics to readouts and
00006 with multiple kinematics types mixed together.
00007
00008 usage:
00009 nuwa.py -n50 -o fifteen.root -m "MDC09a.runIBD15.FullChain -T SingleLoader" > log
00010
00011 More options are available like -w: wall clock starting time
00012 -s: seed for IBD generator
00013 -v: volume
00014
00015 Here is another example:
00016 nuwa.py -n50 -o fifteen.root -m "MDC09a.runIBD15.FullChain -T SingleLoader -w 2008-04-15T15:15:00 -s 1 -v /dd/Structure/AD/db-oil1"
00017
00018 '''
00019 import GaudiKernel.SystemOfUnits as units
00020
00021 class ConfigureFullChain:
00022
00023 '''
00024 Configure a Full Chain of pull simulations.
00025 '''
00026
00027 def __init__(self,argv):
00028 self.parse_args(argv)
00029 return
00030
00031 def parse_args(self,argv):
00032 from optparse import OptionParser
00033 import time
00034 parser = OptionParser(usage=self.__doc__)
00035 default_time_format = '%Y-%m-%dT%H:%M:%S'
00036 parser.add_option("-w","--start-time",
00037 help="Date string to set simulation start, assumed UTC",
00038 default=time.strftime(default_time_format,time.gmtime(0)))
00039 parser.add_option("-F","--time-format",
00040 help="Format for parsing time (see man date), " \
00041 + "default is '%s'"%default_time_format \
00042 + " ('[YYYY]-[MM]-[DD]T[HH]:[MM]:[SS]')",
00043 default=default_time_format)
00044 parser.add_option("-T","--top-stage",
00045 help="Kinematic, Detector, Electronic, TrigRead or SingleLoader",
00046 default="SingleLoader")
00047 parser.add_option("-s","--seed",
00048 help="Random seed for generators",
00049 default=1234567)
00050 parser.add_option("-v","--volume",
00051 help="A way to set volume parameter",
00052 default="/dd/Structure/AD/db-oil1")
00053
00054 (options,args) = parser.parse_args(args=argv)
00055 self.opts = options
00056 self.args = args
00057
00058 timeformat = self.opts.time_format
00059 print "Using time format =",timeformat
00060
00061 try:
00062 datestring = self.opts.start_time
00063 except AttributeError:
00064 self.start_time_seconds = 0
00065 else:
00066
00067
00068 t = time.strptime(datestring,timeformat)
00069 self.start_time_seconds = time.mktime(t) - time.timezone
00070 print 'Start time in human readable format',self.opts.start_time
00071 print 'Start time in seconds UTC =',self.start_time_seconds
00072 print 'Top stage =',self.opts.top_stage
00073
00074 return
00075
00076 def configureKinematic(self):
00077
00078
00079
00080
00081
00082
00083 from MDC09a.runIBD15.IBD import IBD
00084 ibd=IBD(stage=self.stage_cfg,
00085 name='IBD',
00086 volume=self.opts.volume,
00087 start_time=self.start_time_seconds,
00088 seed=self.opts.seed)
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099 return
00100
00101 def configureDetector(self):
00102 '''Configure the Detector stage'''
00103
00104 import DetSim
00105 ds = DetSim.Configure(physlist=DetSim.physics_list_basic+DetSim.physics_list_nuclear,site="dayabay",
00106 use_push_algs = False)
00107
00108 from DetSimProc.DetSimProcConf import DetSimProc
00109 dsp = DetSimProc()
00110 dsp.ThisStageName = "Detector"
00111 dsp.LowerStageName = "Kinematic"
00112
00113 self.stage_cfg.DetectorSequence.Members.append(dsp)
00114
00115 ds.historian(trackSelection="(pdg == 2112)",vertexSelection="(pdg == 2112)")
00116 params = {
00117 'start' :"(start > 0)",
00118 'track1':"(id==1)",
00119 'track2':"(id==2)",
00120 'inGdLS':"DetectorElementName == 'db-gds1'",
00121 'inLS': "DetectorElementName == 'db-lso1'",
00122 'GD': "MaterialName == '/dd/Materials/GdDopedLS'",
00123 'LS': "MaterialName == '/dd/Materials/LiquidScintillator'",
00124 'MO': "MaterialName == '/dd/Materials/MineralOil'",
00125 'IAV': "DetectorElementName == 'db-iav1'",
00126 'OAV': "DetectorElementName == 'db-oav1'",
00127 'IWS': "MaterialName == '/dd/Materials/IwsWater'",
00128 'OWS': "MaterialName == '/dd/Materials/OwsWater'",
00129 'lastvtx': "IsStopping == 1",
00130 'firstvtx': "IsStarting == 1",
00131 'NeutronTrk': "pdg == 2112",
00132 'NeutronMom': "creator == 2112",
00133 'NCap': "ProcessName == 'nCapture'",
00134 'Gamma': "pdg == 22",
00135 'Muon': "(pdg == 13 or pdg == -13)"
00136 }
00137
00138 ds.unobserver(stats=[
00139 ["EDepInGdLS", "dE", "%(GD)s"%params],
00140 ["EDepInLS", "dE", "%(LS)s"%params],
00141 ["EDepInIAV", "dE", "%(IAV)s"%params],
00142 ["EDepInOAV", "dE", "%(OAV)s"%params],
00143 ["EDepInOIL", "dE", "%(MO)s"%params],
00144
00145 ["QEDepInGdLS", "qdE", "%(GD)s"%params],
00146 ["QEDepInLS", "qdE", "%(LS)s"%params],
00147 ["QEDepInIAV", "qdE", "%(IAV)s"%params],
00148 ["QEDepInOAV", "qdE", "%(OAV)s"%params],
00149 ["QEDepInOIL", "qdE", "%(MO)s"%params],
00150
00151 ["tQESumGdLS", "qEt", "%(GD)s"%params],
00152 ["xQESumGdLS", "qEx", "%(GD)s"%params],
00153 ["yQESumGdLS", "qEy", "%(GD)s"%params],
00154 ["zQESumGdLS", "qEz", "%(GD)s"%params],
00155
00156 ["tQESumLS", "qEt", "%(LS)s"%params],
00157 ["xQESumLS", "qEx", "%(LS)s"%params],
00158 ["yQESumLS", "qEy", "%(LS)s"%params],
00159 ["zQESumLS", "qEz", "%(LS)s"%params],
00160
00161 ["tQESumMO", "qEt", "%(MO)s"%params],
00162 ["xQESumMO", "qEx", "%(MO)s"%params],
00163 ["yQESumMO", "qEy", "%(MO)s"%params],
00164 ["zQESumMO", "qEz", "%(MO)s"%params],
00165
00166 ["capTarget", "capTargetZ","%(track2)s and %(NCap)s"%params],
00167
00168
00169 ["pdgId_Trk1","pdg","%(track1)s and %(start)s"%params],
00170 ["t_Trk1", "t" , "%(track1)s and %(start)s"%params],
00171 ["x_Trk1", "x", "%(track1)s and %(start)s"%params],
00172 ["y_Trk1", "y", "%(track1)s and %(start)s"%params],
00173 ["z_Trk1", "z", "%(track1)s and %(start)s"%params],
00174 ["tEnd_Trk1", "t" , "%(track1)s and %(lastvtx)s"%params],
00175 ["xEnd_Trk1", "x", "%(track1)s and %(lastvtx)s"%params],
00176 ["yEnd_Trk1", "y", "%(track1)s and %(lastvtx)s"%params],
00177 ["zEnd_Trk1", "z", "%(track1)s and %(lastvtx)s"%params],
00178 ["e_Trk1", "E", "%(track1)s and %(start)s"%params],
00179 ["p_Trk1", "p", "%(track1)s and %(start)s"%params],
00180 ["ke_Trk1", "KE", "%(track1)s and %(start)s"%params],
00181 ["vx_Trk1", "lvx","%(track1)s and %(start)s"%params],
00182 ["vy_Trk1", "lvy","%(track1)s and %(start)s"%params],
00183 ["vz_Trk1", "lvz","%(track1)s and %(start)s"%params],
00184 ["TrkLength_GD_Trk1", "dx","%(track1)s and %(GD)s"%params],
00185 ["TrkLength_iAV_Trk1", "dx","%(track1)s and %(IAV)s"%params],
00186 ["TrkLength_LS_Trk1", "dx","%(track1)s and %(LS)s"%params],
00187 ["TrkLength_oAV_Trk1", "dx","%(track1)s and %(OAV)s"%params],
00188 ["TrkLength_Oil_Trk1", "dx","%(track1)s and %(MO)s"%params],
00189
00190 ["pdgId_Trk2","pdg","%(track2)s and %(start)s"%params],
00191 ["t_Trk2", "t" , "%(track2)s and %(start)s"%params],
00192 ["x_Trk2", "x", "%(track2)s and %(start)s"%params],
00193 ["y_Trk2", "y", "%(track2)s and %(start)s"%params],
00194 ["z_Trk2", "z", "%(track2)s and %(start)s"%params],
00195 ["tEnd_Trk2", "t" , "%(track2)s and %(lastvtx)s"%params],
00196 ["xEnd_Trk2", "x", "%(track2)s and %(lastvtx)s"%params],
00197 ["yEnd_Trk2", "y", "%(track2)s and %(lastvtx)s"%params],
00198 ["zEnd_Trk2", "z", "%(track2)s and %(lastvtx)s"%params],
00199 ["e_Trk2", "E", "%(track2)s and %(start)s"%params],
00200 ["p_Trk2", "p", "%(track2)s and %(start)s"%params],
00201 ["ke_Trk2", "KE", "%(track2)s and %(start)s"%params],
00202 ["vx_Trk2", "lvx","%(track2)s and %(start)s"%params],
00203 ["vy_Trk2", "lvy","%(track2)s and %(start)s"%params],
00204 ["vz_Trk2", "lvz","%(track2)s and %(start)s"%params],
00205 ["TrkLength_GD_Trk2", "dx","%(track2)s and %(GD)s"%params],
00206 ["TrkLength_iAV_Trk2", "dx","%(track2)s and %(IAV)s"%params],
00207 ["TrkLength_LS_Trk2", "dx","%(track2)s and %(LS)s"%params],
00208 ["TrkLength_oAV_Trk2", "dx","%(track2)s and %(OAV)s"%params],
00209 ["TrkLength_Oil_Trk2", "dx","%(track2)s and %(MO)s"%params]
00210 ])
00211
00212 return
00213
00214 def configureElectronic(self):
00215 '''Configure the Electronics stage'''
00216
00217 import ElecSim
00218 es = ElecSim.Configure(use_push_algs = False)
00219
00220 from ElecSimProc.ElecSimProcConf import ElecSimProc
00221 esp = ElecSimProc()
00222 esp.ThisStageName = "Electronic"
00223 esp.LowerStageName = "Detector"
00224
00225 self.stage_cfg.ElectronicSequence.Members.append(esp)
00226 return
00227
00228 def configureTrigRead(self):
00229 '''Configure the Trigger and Readout stage'''
00230 from TrigReadProc.TrigReadProcConf import TrigReadProc
00231 tsp = TrigReadProc()
00232 tsp.ThisStageName = "TrigRead"
00233 tsp.LowerStageName = "Electronic"
00234
00235
00236
00237 self.stage_cfg.TrigReadSequence.Members.append(tsp)
00238 return
00239
00240 def configureSingleLoader(self):
00241 '''Configure the SingleLoader stage'''
00242 from SingleLoader.SingleLoaderConf import SingleLoader
00243 sll = SingleLoader()
00244 sll.ThisStageName = "SingleLoader"
00245 sll.LowerStageName = "TrigRead"
00246
00247 self.stage_cfg.SingleLoaderSequence.Members.append(sll)
00248
00249 def configureSim15(self):
00250 from Stage.StageConf import Sim15
00251 sim15=Sim15()
00252 sim15.TopStage=self.opts.top_stage
00253
00254 from Gaudi.Configuration import ApplicationMgr
00255 theApp = ApplicationMgr()
00256 theApp.TopAlg.append(sim15)
00257
00258 def configure(self):
00259
00260 from Stage import Configure as StageConfigure
00261 self.stage_cfg = StageConfigure()
00262
00263 stagedic={'Kinematic':1,'Detector':2,'Electronic':3,'TrigRead':4,'SingleLoader':5}
00264
00265 if not self.opts.top_stage in stagedic:
00266 print 'Error, wrong top stage parameter', self.opts.top_stage
00267
00268 for stg,idx in stagedic.iteritems():
00269 if idx <= stagedic[self.opts.top_stage]:
00270 self.stage_cfg.addStages([stg])
00271
00272 for stg in self.stage_cfg.stages:
00273
00274 pass
00275
00276 if stagedic[self.opts.top_stage]>=1:
00277 self.configureKinematic()
00278 if stagedic[self.opts.top_stage]>=2:
00279 self.configureDetector()
00280 if stagedic[self.opts.top_stage]>=3:
00281 self.configureElectronic()
00282 if stagedic[self.opts.top_stage]>=4:
00283 self.configureTrigRead()
00284 if stagedic[self.opts.top_stage]>=5:
00285 self.configureSingleLoader()
00286
00287 self.configureSim15()
00288
00289 return
00290
00291 def configure(argv=[]):
00292 cfc = ConfigureFullChain(argv)
00293 cfc.configure()
00294 return
00295
00296 if __name__ == "__main__":
00297 configure()
00298 pass