00001
00002
00003
00004
00005
00006 __all__ = ['plotGammaBasics']
00007 from GaudiPython.GaudiAlgs import GaudiAlgo
00008 from GaudiPython import SUCCESS, FAILURE
00009 from GaudiPython import gbl
00010
00011 from DybPython.Util import irange
00012 from GaudiKernel import SystemOfUnits as units
00013 import ROOT
00014
00015 TH1F = gbl.TH1F
00016 TH1D = gbl.TH1D
00017 TH2F = gbl.TH2F
00018 TH2D = gbl.TH2D
00019
00020 class plotGammaBasics(GaudiAlgo):
00021
00022 def __init__(self,name):
00023 GaudiAlgo.__init__(self,name)
00024 self.hist = {}
00025 return
00026
00027 def initialize(self):
00028 print "Initializing the gamma basic ploter", self.name()
00029 status = GaudiAlgo.initialize(self)
00030 if status.isFailure(): return status
00031 self.target_de_name = '/dd/Structure/AD/db-ade1/db-sst1/db-oil1'
00032
00033
00034
00035 self.coorSvc = self.svc('ICoordSysSvc', 'CoordSysSvc')
00036 if not self.coorSvc:
00037 print 'Failed to get CoordSysSvc'
00038 return FAILURE
00039
00040
00041
00042 self.statsSvc = self.svc('IStatisticsSvc','StatisticsSvc')
00043 if self.statsSvc == None:
00044 self.error("Failed to initialize IStat service.")
00045 return FAILURE
00046
00047 self.hist["genRZ"] = TH2D("genRZ", "Generation Vertex R-Z", \
00048 100, 0.0, 6.1504, 100, -2.48, 2.48)
00049 status = self.statsSvc.put('/file1/basics/genRZ', \
00050 self.hist["genRZ"])
00051 if status.isFailure(): return status
00052
00053 self.hist["genXY"] = TH2D("genXY", "Generation Vertex X-Y", \
00054 100, -2.48, 2.48, 100, -2.48, 2.48)
00055 status = self.statsSvc.put('/file1/basics/genXY', \
00056 self.hist["genXY"])
00057 if status.isFailure(): return status
00058
00059 self.hist["HitTime"] = TH1F("HitTime", "Hit Time",
00060 100, 0.0, 100)
00061 status = self.statsSvc.put('/file1/basics/HitTime',
00062 self.hist["HitTime"])
00063 if status.isFailure(): return status
00064
00065 self.hist["peGen_GdLS"] = TH1F("peGen_GdLS", "pe of a gamma (in GdLS)",
00066 500, 0, 1400)
00067 status = self.statsSvc.put('/file1/basics/peGen_GdLS',
00068 self.hist["peGen_GdLS"])
00069 if status.isFailure(): return status
00070
00071 self.hist["peGen_LS"] = TH1F("peGen_LS",
00072 "pe of a gamma(in LS)",
00073 500, 0, 1400)
00074 status = self.statsSvc.put('/file1/basics/peGen_LS',
00075 self.hist["peGen_LS"])
00076 if status.isFailure(): return status
00077
00078 self.hist["peGen_inLS"] = TH1F("peGen_inLS",
00079 "pe of a gamma (within LS)",
00080 500, 0, 1400)
00081 status = self.statsSvc.put('/file1/basics/peGen_inLS',
00082 self.hist["peGen_inLS"])
00083 if status.isFailure(): return status
00084
00085 self.hist["peGen_MO"] = TH1F("peGen_MO",
00086 "pe of a gamma (in MO)",
00087 500, 0, 1400)
00088 status = self.statsSvc.put('/file1/basics/peGen_MO',
00089 self.hist["peGen_MO"])
00090 if status.isFailure(): return status
00091
00092 self.hist["peGen_all"] = TH1F("peGen_all",
00093 "pe of a gamma (in AD)",
00094 500, 0, 1400)
00095 status = self.statsSvc.put('/file1/basics/peGen_all',
00096 self.hist["peGen_all"])
00097 if status.isFailure(): return status
00098
00099 self.hist["peCap_GdLS"] = TH1F("peCap_GdLS",
00100 "pe of a gamma stop in GdLS",
00101 500, 0, 1400)
00102 status = self.statsSvc.put('/file1/basics/peCap_GdLS',
00103 self.hist["peCap_GdLS"])
00104 if status.isFailure(): return status
00105
00106 self.hist["peCap_LS"] = TH1F("peCap_LS",
00107 "pe of a gamma stop in LS",
00108 500, 0, 1400)
00109 status = self.statsSvc.put('/file1/basics/peCap_LS',
00110 self.hist["peCap_LS"])
00111 if status.isFailure(): return status
00112
00113 self.hist["peCap_MO"] = TH1F("peCap_MO",
00114 "pe of a gamma stop in MO",
00115 500, 0, 1400)
00116 status = self.statsSvc.put('/file1/basics/peCap_MO',
00117 self.hist["peCap_MO"])
00118 if status.isFailure(): return status
00119
00120 self.hist["peGenCap_GdLS"] = TH1F("peGenCap_GdLS",
00121 "pe of a gamma in AD",
00122 500, 0, 1400)
00123 status = self.statsSvc.put('/file1/basics/peGenCap_GdLS',
00124 self.hist["peGenCap_GdLS"])
00125 if status.isFailure(): return status
00126
00127 self.hist["eDepInGdLS"] = TH1D("eDepInGdLS", "Deposited Energy [MeV]",
00128 70, 0, 7)
00129 status = self.statsSvc.put('/file1/basics/eDepInGdLS',
00130 self.hist["eDepInGdLS"])
00131 if status.isFailure(): return status
00132
00133 self.hist["eDepInLS"] = TH1D("eDepInLS", "Deposited Energy [MeV]",
00134 70, 0, 7)
00135 status = self.statsSvc.put('/file1/basics/eDepInLS',
00136 self.hist["eDepInLS"])
00137 if status.isFailure(): return status
00138
00139 self.hist["eDepInAD"] = TH1D("eDepInAD", "Deposited Energy [MeV]",
00140 700, 0, 7)
00141 status = self.statsSvc.put('/file1/basics/eDepInAD',
00142 self.hist["eDepInAD"])
00143 if status.isFailure(): return status
00144
00145 self.hist["eInitial"] = TH1D("eInitial", "Intial Energy [MeV]",
00146 70, 0, 7)
00147 status = self.statsSvc.put('/file1/basics/eInitial',
00148 self.hist["eInitial"])
00149 if status.isFailure(): return status
00150
00151 self.hist["drift_Gamma"] = TH1F("drift_Gamma",
00152 "Gamma Drift Distance [cm]",
00153 250, 0, 250)
00154 status = self.statsSvc.put('/file1/basics/drift_Gamma',
00155 self.hist["drift_Gamma"])
00156 if status.isFailure(): return status
00157
00158 self.hist["drift_GdLS"] = TH1F("drift_GdLS",
00159 "Gamma Drift Distance in GdLS [cm]",
00160 250, 0, 250)
00161 status = self.statsSvc.put('/file1/basics/drift_GdLS',
00162 self.hist["drift_GdLS"])
00163 if status.isFailure(): return status
00164
00165 self.hist["drift_LS"] = TH1F("drift_LS",
00166 "Gamma Drift Distance in LS [cm]",
00167 250, 0, 250)
00168 status = self.statsSvc.put('/file1/basics/drift_LS',
00169 self.hist["drift_LS"])
00170 if status.isFailure(): return status
00171
00172 self.hist["time_GdLS"] = TH1F("time_GdLS",
00173 "Gamma drift time in GdLS [ns]",
00174 40, 0, 20)
00175 status = self.statsSvc.put('/file1/basics/time_GdLS',
00176 self.hist["time_GdLS"])
00177 if status.isFailure(): return status
00178
00179 self.hist["time_LS"] = TH1F("time_LS",
00180 "Gamma Capture Time in LS [ns]",
00181 40, 0, 20)
00182 status = self.statsSvc.put('/file1/basics/time_LS',
00183 self.hist["time_LS"])
00184 if status.isFailure(): return status
00185
00186 return SUCCESS
00187
00188 def execute(self):
00189 print "Executing plotGammaBasics", self.name()
00190 evt = self.evtSvc()
00191 simhdr = evt['/Event/Sim/SimHeader']
00192
00193 det = self.detSvc(self.target_de_name)
00194
00195
00196 statshdr = simhdr.unobservableStatistics()
00197 stats = statshdr.stats()
00198 tGen = stats["t_Trk1"].sum()
00199 xGen = stats["x_Trk1"].sum()
00200 yGen = stats["y_Trk1"].sum()
00201 zGen = stats["z_Trk1"].sum()
00202
00203 tCap = stats["tEnd_Trk1"].sum()
00204 xCap = stats["xEnd_Trk1"].sum()
00205 yCap = stats["yEnd_Trk1"].sum()
00206 zCap = stats["zEnd_Trk1"].sum()
00207
00208
00209 de = self.getDet(self.target_de_name)
00210 if not de:
00211 print 'Failed to get DE',self.target_de_name
00212 return FAILURE
00213
00214
00215 import PyCintex
00216 Gaudi = PyCintex.makeNamespace('Gaudi')
00217 genGlbPoint = Gaudi.XYZPoint(xGen, yGen, zGen)
00218 capGlbPoint = Gaudi.XYZPoint(xCap, yCap, zCap)
00219
00220 genLclPoint = de.geometry().toLocal(genGlbPoint)
00221 capLclPoint = de.geometry().toLocal(capGlbPoint)
00222
00223
00224
00225 ndrift = ROOT.TVector3(xCap-xGen, yCap-yGen, zCap-zGen)
00226
00227 capTime = tCap - tGen
00228 capDis = ndrift.Mag()
00229
00230 print 'Generation locations', \
00231 '[', genGlbPoint.x(), genGlbPoint.y(), genGlbPoint.z(),']', \
00232 '[', genLclPoint.x()/units.cm, genLclPoint.y()/units.cm, genLclPoint.z()/units.cm,']'
00233
00234 self.hist["genRZ"].Fill(genLclPoint.x()/units.meter * genLclPoint.x()/units.meter + genLclPoint.y()/units.meter * genLclPoint.y()/units.meter, genLclPoint.z()/units.meter)
00235
00236 self.hist["genXY"].Fill(genLclPoint.x()/units.meter,genLclPoint.y()/units.meter)
00237
00238 self.hist["drift_Gamma"].Fill(capDis/units.cm)
00239
00240
00241 genDE = self.coorSvc.coordSysDE(genGlbPoint)
00242 capDE = self.coorSvc.coordSysDE(capGlbPoint)
00243 if not genDE:
00244 print 'Failed to find coordinate system DE for generation', \
00245 '[', genGlbPoint.x(), genGlbPoint.y(), genGlbPoint.z(),']', \
00246 '[', genLclPoint.x()/units.mm, genLclPoint.y()/units.mm, genLclPoint.z()/units.mm,']'
00247 return FAILURE
00248 else:
00249 gendmvol = genDE.geometry().belongsToPath(genGlbPoint,-1)
00250
00251 if not capDE:
00252 print 'Failed to find coordinate system DE for capture'\
00253 '[',capGlbPoint.x(),capGlbPoint.y(),capGlbPoint.z(),']'
00254 return FAILURE
00255 else:
00256 capdmvol = capDE.geometry().belongsToPath(capGlbPoint,-1)
00257
00258 import re
00259 genDM = re.split('/', gendmvol).pop()
00260 capDM = re.split('/', capdmvol).pop()
00261 print "Generated in ", genDM
00262 print "Captured in ", capDM
00263
00264 pmtHits = 0
00265 simhits = simhdr.hits()
00266 for detector in simhits.hitDetectors():
00267 hitCollection = simhits.hitsByDetector(detector)
00268 if hitCollection == None:
00269 print "No hits in ", detector
00270 hits = hitCollection.collection()
00271 for hit in hits:
00272
00273
00274 self.hist["HitTime"].Fill(hit.hitTime()/units.nanosecond)
00275 pmtHits += 1
00276
00277
00278 PID_trk1 = stats["pdgId_Trk1"].sum()
00279
00280 if PID_trk1 != 22:
00281 print "PID of track 1 is", PID_trk1
00282 print "Not an gamma event."
00283 return FAILURE
00284
00285 self.hist["peGen_all"].Fill(pmtHits)
00286
00287 if genDM == 'db-gds1':
00288 self.hist["peGen_GdLS"].Fill(pmtHits)
00289
00290 if genDM == 'db-lso1':
00291 self.hist["peGen_LS"].Fill(pmtHits)
00292
00293 if re.search('db-lso1',gendmvol):
00294 self.hist["peGen_inLS"].Fill(pmtHits)
00295
00296 if genDM == 'db-oil1':
00297 self.hist["peGen_MO"].Fill(pmtHits)
00298
00299 if capDM == 'db-lso1':
00300 self.hist["peCap_LS"].Fill(pmtHits)
00301
00302 if capDM == 'db-oil1':
00303 self.hist["peCap_MO"].Fill(pmtHits)
00304
00305 if capDM == 'db-gds1':
00306 self.hist["peCap_GdLS"].Fill(pmtHits)
00307
00308 if genDM == 'db-gds1' and capDM == 'db-gds1':
00309 self.hist["peGenCap_GdLS"].Fill(pmtHits)
00310 self.hist["time_GdLS"].Fill(capTime/units.nanosecond)
00311 self.hist["drift_GdLS"].Fill(capDis/units.cm)
00312
00313 if genDM == 'db-lso1' and capDM == 'db-lso1':
00314 self.hist["time_LS"].Fill(capTime/units.nanosecond)
00315 self.hist["drift_LS"].Fill(capDis/units.cm)
00316
00317 eDepInGdLS = stats["EDepInGdLS"].sum()
00318 eDepInLS = stats["EDepInLS"].sum()
00319 self.hist["eDepInGdLS"].Fill(eDepInGdLS/units.MeV)
00320 self.hist["eDepInLS"].Fill(eDepInLS/units.MeV)
00321
00322 self.hist["eDepInAD"].Fill((eDepInLS+eDepInGdLS)/units.MeV)
00323
00324 if eDepInLS+eDepInGdLS > 6: print "Accumulative: ", str(eDepInLS+eDepInGdLS)
00325
00326 eInitial = stats["e_Trk1"].sum()
00327 self.hist["eInitial"].Fill(eInitial/units.MeV)
00328
00329 return SUCCESS
00330
00331 def finalize(self):
00332 print "Finalizing ", self.name()
00333 status = GaudiAlgo.finalize(self)
00334 return status
00335
00336 def configure(argv = []):
00337 import sys, getopt
00338 from time import localtime, gmtime, mktime, strftime, strptime, timezone
00339 opts,args = getopt.getopt(argv,"o:w:")
00340 outputrootfile = 'GammaBasicPlots.root'
00341 wallTime = 0
00342 for opt,arg in opts:
00343 if opt == "-o":
00344 outputrootfile = arg
00345 if opt == "-w":
00346 if -1 != arg.find('T'):
00347 wallTime = int(mktime(strptime(arg,
00348 DATETIME_FORMAT)) - timezone)
00349 else:
00350 wallTime = int(arg)
00351
00352 print "Your output ROOT files is: ", outputrootfile
00353 from DetHelpers.DetHelpersConf import CoordSysSvc
00354
00355
00356 from StatisticsSvc.StatisticsSvcConf import StatisticsSvc
00357 statsSvc = StatisticsSvc()
00358 statsSvc.Output ={"file1":outputrootfile}
00359
00360
00361
00362
00363
00364 coorSvc = CoordSysSvc()
00365 coorSvc.OutputLevel = 1
00366
00367 from Gaudi.Configuration import ApplicationMgr
00368 theApp = ApplicationMgr()
00369 theApp.ExtSvc.append(coorSvc)
00370
00371 return
00372
00373 def run(app):
00374 '''Configure and add this algorithm to job'''
00375
00376
00377
00378 app.ExtSvc += ["StatisticsSvc"]
00379 plotBasics = plotGammaBasics("myBasics")
00380 app.addAlgorithm(plotBasics)
00381 pass