00001
00002
00003
00004
00005
00006
00007 from DybPython.DybPythonAlg import DybPythonAlg
00008 from GaudiPython import SUCCESS, FAILURE
00009 from GaudiPython import gbl, loaddict
00010 from DybPython.Util import irange
00011
00012
00013 TH1F = gbl.TH1F
00014 TTree = gbl.TTree
00015 TCanvas = gbl.TCanvas
00016
00017 Detector = gbl.DayaBay.Detector
00018 Site = gbl.Site
00019 DetectorId = gbl.DetectorId
00020 ServiceMode = gbl.ServiceMode
00021 AdPmtSensor = gbl.DayaBay.AdPmtSensor
00022
00023 from array import array
00024 import math
00025
00026 loaddict("libCLHEPRflx")
00027 HepLorentzVector = gbl.CLHEP.HepLorentzVector
00028 loaddict("libHepMCRflx")
00029 HepMCGenEvent = gbl.HepMC.GenEvent
00030
00031 class TesToTreeAlg(DybPythonAlg):
00032 "Dump TES contents to ROOT tree"
00033 def __init__(self,name):
00034 DybPythonAlg.__init__(self,name)
00035
00036 self.HeaderList = ["Gen","Sim","SimReadout","Readout","CalibReadout",
00037 "Rec"]
00038 self.ForceReconResults = ["AdSimple"]
00039 return
00040
00041 def initialize(self):
00042 status = DybPythonAlg.initialize(self)
00043 if status.isFailure(): return status
00044 self.info("initialize")
00045
00046 self.firstEntry = True
00047
00048 self.tesTree= TTree("tesTree","TES converted to ROOT Tree")
00049
00050 if "Gen" in self.HeaderList:
00051 self.initGenHeader()
00052 if "Sim" in self.HeaderList:
00053 self.initSimHeader()
00054 if "SimReadout" in self.HeaderList:
00055 self.initSimReadoutHeader()
00056 if "Readout" in self.HeaderList:
00057 self.initReadoutHeader()
00058 if "CalibReadout" in self.HeaderList:
00059 self.initCalibReadoutHeader()
00060 if "Rec" in self.HeaderList:
00061 self.initRecHeader()
00062
00063 self.stats['/file0/tes/tesTree'] = self.tesTree
00064 return SUCCESS
00065
00066 def initGenHeader(self):
00067
00068 self.hasGen = array('i',[0])
00069 self.genTimeSec = array('i',[0])
00070 self.genTimeNanoSec = array('i',[0])
00071 self.nGenParticles = array('i',[0])
00072 self.maxGenParticles = 256
00073 self.genPdgid = array('i',self.maxGenParticles*[0])
00074 self.genStatus = array('i',self.maxGenParticles*[0])
00075 self.genX = array('d',self.maxGenParticles*[0])
00076 self.genY = array('d',self.maxGenParticles*[0])
00077 self.genZ = array('d',self.maxGenParticles*[0])
00078 self.genT = array('d',self.maxGenParticles*[0])
00079 self.genE = array('d',self.maxGenParticles*[0])
00080
00081 self.tesTree.Branch('hasGen',self.hasGen,'hasGen/I')
00082 self.tesTree.Branch('genTimeSec',self.genTimeSec,'genTimeSec/I')
00083 self.tesTree.Branch('genTimeNanoSec',self.genTimeNanoSec,
00084 'genTimeNanoSec/I')
00085 self.tesTree.Branch('nGenParticles',self.nGenParticles,
00086 'nGenParticles/I')
00087 self.tesTree.Branch('genPdgid',self.genPdgid,
00088 'genPdgid[nGenParticles]/I')
00089 self.tesTree.Branch('genStatus',self.genStatus,
00090 'genStatus[nGenParticles]/I')
00091 self.tesTree.Branch('genX',self.genX,'genX[nGenParticles]/D')
00092 self.tesTree.Branch('genY',self.genY,'genY[nGenParticles]/D')
00093 self.tesTree.Branch('genZ',self.genZ,'genZ[nGenParticles]/D')
00094 self.tesTree.Branch('genT',self.genT,'genT[nGenParticles]/D')
00095 self.tesTree.Branch('genE',self.genE,'genE[nGenParticles]/D')
00096
00097 def initSimHeader(self):
00098
00099 self.hasSim = array('i',[0])
00100 self.simTimeSec = array('i',[0])
00101 self.simTimeNanoSec = array('i',[0])
00102 self.nSimHits = array('i',[0])
00103 self.maxSimHits = 4096
00104 self.simHitSite = array('i',self.maxSimHits*[0])
00105 self.simHitDet = array('i',self.maxSimHits*[0])
00106 self.simHitSensId = array('i',self.maxSimHits*[0])
00107 self.simHitTime = array('d',self.maxSimHits*[0])
00108 self.simHitWeight = array('d',self.maxSimHits*[0])
00109 self.simHitX = array('d',self.maxSimHits*[0])
00110 self.simHitY = array('d',self.maxSimHits*[0])
00111 self.simHitZ = array('d',self.maxSimHits*[0])
00112 self.simHitRing = array('i',self.maxSimHits*[0])
00113 self.simHitColumn = array('i',self.maxSimHits*[0])
00114 self.simHitWavelength = array('d',self.maxSimHits*[0])
00115 self.simHitType = array('i',self.maxSimHits*[0])
00116 self.simStat = {}
00117
00118 self.tesTree.Branch('hasSim',self.hasSim,'hasSim/I')
00119 self.tesTree.Branch('simTimeSec',self.simTimeSec,'simTimeSec/I')
00120 self.tesTree.Branch('simTimeNanoSec',self.simTimeNanoSec,
00121 'simTimeNanoSec/I')
00122 self.tesTree.Branch('nSimHits',self.nSimHits,'nSimHits/I')
00123 self.tesTree.Branch('simHitSite',self.simHitSite,
00124 'simHitSite[nSimHits]/I')
00125 self.tesTree.Branch('simHitDet',self.simHitDet,'simHitDet[nSimHits]/I')
00126 self.tesTree.Branch('simHitSensId',self.simHitSensId,
00127 'simHitSensId[nSimHits]/I')
00128 self.tesTree.Branch('simHitTime',self.simHitTime,
00129 'simHitTime[nSimHits]/D')
00130 self.tesTree.Branch('simHitWeight',self.simHitWeight,
00131 'simHitWeight[nSimHits]/D')
00132 self.tesTree.Branch('simHitX',self.simHitX,'simHitX[nSimHits]/D')
00133 self.tesTree.Branch('simHitY',self.simHitY,'simHitY[nSimHits]/D')
00134 self.tesTree.Branch('simHitZ',self.simHitZ,'simHitZ[nSimHits]/D')
00135 self.tesTree.Branch('simHitRing',self.simHitRing,
00136 'simHitRing[nSimHits]/I')
00137 self.tesTree.Branch('simHitColumn',self.simHitColumn,
00138 'simHitColumn[nSimHits]/I')
00139 self.tesTree.Branch('simHitWavelength',self.simHitWavelength,
00140 'simHitWavelength[nSimHits]/D')
00141 self.tesTree.Branch('simHitType',self.simHitType,
00142 'simHitType[nSimHits]/I')
00143
00144 def initSimReadoutHeader(self):
00145
00146 self.hasSimRo = array('i',[0])
00147 self.nSimRo = array('i',[0])
00148
00149 self.tesTree.Branch('hasSimRo',self.hasSimRo,'hasSimRo/I')
00150 self.tesTree.Branch('nSimRo',self.nSimRo,'nSimRo/I')
00151
00152 def initReadoutHeader(self):
00153
00154 self.hasRo = array('i',[0])
00155 self.roTimeSec = array('i',[0])
00156 self.roTimeNanoSec = array('i',[0])
00157 self.hasReadout = array('i',[0])
00158 self.roSite = array('i',[0])
00159 self.roDetector = array('i',[0])
00160 self.roTriggerNumber = array('i',[0])
00161 self.roTriggerTimeSec = array('i',[0])
00162 self.roTriggerTimeNanoSec = array('i',[0])
00163 self.nRoChannels = array('i',[0])
00164 self.nRoTdcs = array('i',[0])
00165 self.nRoAdcs = array('i',[0])
00166 self.maxRoChannels = 512
00167 self.roChanId = array('i',self.maxRoChannels*[0])
00168 self.roBoard = array('i',self.maxRoChannels*[0])
00169 self.roConnector = array('i',self.maxRoChannels*[0])
00170 self.nRoChanTdc = array('i',self.maxRoChannels*[0])
00171 self.nRoChanAdc = array('i',self.maxRoChannels*[0])
00172 self.roChanAdcGain = array('i',self.maxRoChannels*[0])
00173 self.roChanFirstTdc = array('i',self.maxRoChannels*[0])
00174 self.roChanPeakAdc = array('i',self.maxRoChannels*[0])
00175 self.maxRoTdcs = 4096
00176 self.roTdc = array('i',self.maxRoTdcs*[0])
00177 self.roTdcChanId = array('i',self.maxRoTdcs*[0])
00178 self.maxRoAdcs = 4096
00179 self.roAdcClock = array('i',self.maxRoAdcs*[0])
00180 self.roAdc = array('i',self.maxRoAdcs*[0])
00181 self.roAdcChanId = array('i',self.maxRoAdcs*[0])
00182
00183 self.tesTree.Branch('hasRo',self.hasRo,'hasRo/I')
00184 self.tesTree.Branch('roTimeSec',self.roTimeSec,'roTimeSec/I')
00185 self.tesTree.Branch('roTimeNanoSec',self.roTimeNanoSec,
00186 'roTimeNanoSec/I')
00187 self.tesTree.Branch('hasReadout',self.hasReadout,'hasReadout/I')
00188 self.tesTree.Branch('roSite',self.roSite,'roSite/I')
00189 self.tesTree.Branch('roDetector',self.roDetector,'roDetector/I')
00190 self.tesTree.Branch('roTriggerNumber',self.roTriggerNumber,
00191 'roTriggerNumber/I')
00192 self.tesTree.Branch('roTriggerTimeSec',self.roTriggerTimeSec,
00193 'roTriggerTimeSec/I')
00194 self.tesTree.Branch('roTriggerTimeNanoSec',self.roTriggerTimeNanoSec,
00195 'roTriggerTimeNanoSec/I')
00196 self.tesTree.Branch('nRoChannels',self.nRoChannels,'nRoChannels/I')
00197 self.tesTree.Branch('nRoTdcs',self.nRoTdcs,'nRoTdcs/I')
00198 self.tesTree.Branch('nRoAdcs',self.nRoAdcs,'nRoAdcs/I')
00199 self.tesTree.Branch('roChanId',self.roChanId,'roChanId[nRoChannels]/I')
00200 self.tesTree.Branch('roBoard',self.roBoard,'roBoard[nRoChannels]/I')
00201 self.tesTree.Branch('roConnector',self.roConnector,
00202 'roConnector[nRoChannels]/I')
00203 self.tesTree.Branch('nRoChanTdc',self.nRoChanTdc,
00204 'nRoChanTdc[nRoChannels]/I')
00205 self.tesTree.Branch('nRoChanAdc',self.nRoChanAdc,
00206 'nRoChanAdc[nRoChannels]/I')
00207 self.tesTree.Branch('roChanAdcGain',self.roChanAdcGain,
00208 'roChanAdcGain[nRoChannels]/I')
00209 self.tesTree.Branch('roChanFirstTdc',self.roChanFirstTdc,
00210 'roChanFirstTdc[nRoChannels]/I')
00211 self.tesTree.Branch('roChanPeakAdc',self.roChanPeakAdc,
00212 'roChanPeakAdc[nRoChannels]/I')
00213 self.tesTree.Branch('roTdc',self.roTdc,'roTdc[nRoTdcs]/I')
00214 self.tesTree.Branch('roTdcChanId',self.roTdcChanId,
00215 'roTdcChanId[nRoTdcs]/I')
00216 self.tesTree.Branch('roAdcClock',self.roAdcClock,
00217 'roAdcClock[nRoAdcs]/I')
00218 self.tesTree.Branch('roAdc',self.roAdc,'roAdc[nRoAdcs]/I')
00219 self.tesTree.Branch('roAdcChanId',self.roAdcChanId,
00220 'roAdcChanId[nRoAdcs]/I')
00221
00222 def initCalibReadoutHeader(self):
00223
00224 self.hasCro = array('i',[0])
00225 self.croTimeSec = array('i',[0])
00226 self.croTimeNanoSec = array('i',[0])
00227 self.hasCalibReadout = array('i',[0])
00228 self.croSite = array('i',[0])
00229 self.croDetector = array('i',[0])
00230 self.croTriggerNumber = array('i',[0])
00231 self.croTriggerTimeSec = array('i',[0])
00232 self.croTriggerTimeNanoSec = array('i',[0])
00233 self.nCroChannels = array('i',[0])
00234 self.nCroTdcs = array('i',[0])
00235 self.nCroAdcs = array('i',[0])
00236 self.maxCroChannels = 512
00237 self.croChanId = array('i',self.maxCroChannels*[0])
00238 self.croBoard = array('i',self.maxCroChannels*[0])
00239 self.croConnector = array('i',self.maxCroChannels*[0])
00240 self.nCroChanTdc = array('i',self.maxCroChannels*[0])
00241 self.nCroChanAdc = array('i',self.maxCroChannels*[0])
00242 self.croChanAdcGain = array('i',self.maxCroChannels*[0])
00243 self.croChanFirstTdc = array('d',self.maxCroChannels*[0])
00244 self.croChanPeakAdc = array('d',self.maxCroChannels*[0])
00245 self.maxCroTdcs = 4096
00246 self.croTdc = array('d',self.maxCroTdcs*[0])
00247 self.croTdcChanId = array('i',self.maxCroTdcs*[0])
00248 self.maxCroAdcs = 4096
00249 self.croAdcClock = array('i',self.maxCroAdcs*[0])
00250 self.croAdc = array('d',self.maxCroAdcs*[0])
00251 self.croAdcChanId = array('i',self.maxCroAdcs*[0])
00252
00253 self.tesTree.Branch('hasCro',self.hasCro,'hasCro/I')
00254 self.tesTree.Branch('croTimeSec',self.croTimeSec,'croTimeSec/I')
00255 self.tesTree.Branch('croTimeNanoSec',self.croTimeNanoSec,
00256 'croTimeNanoSec/I')
00257 self.tesTree.Branch('hasCalibReadout',self.hasCalibReadout,
00258 'hasCalibReadout/I')
00259 self.tesTree.Branch('croSite',self.croSite,'croSite/I')
00260 self.tesTree.Branch('croDetector',self.croDetector,'croDetector/I')
00261 self.tesTree.Branch('croTriggerNumber',self.croTriggerNumber,
00262 'croTriggerNumber/I')
00263 self.tesTree.Branch('croTriggerTimeSec',self.croTriggerTimeSec,
00264 'croTriggerTimeSec/I')
00265 self.tesTree.Branch('croTriggerTimeNanoSec',self.croTriggerTimeNanoSec,
00266 'croTriggerTimeNanoSec/I')
00267 self.tesTree.Branch('nCroChannels',self.nCroChannels,'nCroChannels/I')
00268 self.tesTree.Branch('nCroTdcs',self.nCroTdcs,'nCroTdcs/I')
00269 self.tesTree.Branch('nCroAdcs',self.nCroAdcs,'nCroAdcs/I')
00270 self.tesTree.Branch('croChanId',self.croChanId,
00271 'croChanId[nCroChannels]/I')
00272 self.tesTree.Branch('croBoard',self.croBoard,'croBoard[nCroChannels]/I')
00273 self.tesTree.Branch('croConnector',self.croConnector,
00274 'croConnector[nCroChannels]/I')
00275 self.tesTree.Branch('nCroChanTdc',self.nCroChanTdc,
00276 'nCroChanTdc[nCroChannels]/I')
00277 self.tesTree.Branch('nCroChanAdc',self.nCroChanAdc,
00278 'nCroChanAdc[nCroChannels]/I')
00279 self.tesTree.Branch('croChanAdcGain',self.croChanAdcGain,
00280 'croChanAdcGain[nCroChannels]/I')
00281 self.tesTree.Branch('croChanFirstTdc',self.croChanFirstTdc,
00282 'croChanFirstTdc[nCroChannels]/D')
00283 self.tesTree.Branch('croChanPeakAdc',self.croChanPeakAdc,
00284 'croChanPeakAdc[nCroChannels]/D')
00285 self.tesTree.Branch('croTdc',self.croTdc,'croTdc[nCroTdcs]/D')
00286 self.tesTree.Branch('croTdcChanId',self.croTdcChanId,
00287 'croTdcChanId[nCroTdcs]/I')
00288 self.tesTree.Branch('croAdcClock',self.croAdcClock,
00289 'croAdcClock[nCroAdcs]/I')
00290 self.tesTree.Branch('croAdc',self.croAdc,'croAdc[nCroAdcs]/D')
00291 self.tesTree.Branch('croAdcChanId',self.croAdcChanId,
00292 'croAdcChanId[nCroAdcs]/I')
00293
00294 def initRecHeader(self):
00295
00296 self.hasRec = array('i',[0])
00297 self.recTimeSec = array('i',[0])
00298 self.recTimeNanoSec = array('i',[0])
00299 self.hasRecTrigger = array('i',[0])
00300 self.recResults = {}
00301
00302 self.tesTree.Branch('hasRec',self.hasRec,'hasRec/I')
00303 self.tesTree.Branch('recTimeSec',self.recTimeSec,'recTimeSec/I')
00304 self.tesTree.Branch('recTimeNanoSec',self.recTimeNanoSec,
00305 'recTimeNanoSec/I')
00306 self.tesTree.Branch('hasRecTrigger',self.hasRecTrigger,
00307 'hasRecTrigger/I')
00308 for recName in self.ForceReconResults:
00309 self.prepareRecResults(recName)
00310
00311 def prepareRecResults(self, recName):
00312
00313 recSiteName = "rec_" + recName + "_site"
00314 recDetName = "rec_" + recName + "_det"
00315 recTrigNumName = "rec_" + recName + "_trigNum"
00316 recTrigTimeSecName = "rec_" + recName + "_trigTimeSec"
00317 recTrigTimeNanoSecName = "rec_" + recName + "_trigTimeNanoSec"
00318 recEnergyName = "rec_" + recName + "_energy"
00319 recPosName = "rec_" + recName + "_position"
00320 recDirName = "rec_" + recName + "_direction"
00321 recEnergyStatName = "rec_" + recName + "_energyStatus"
00322 recPosStatName = "rec_" + recName + "_positionStatus"
00323 recDirStatName = "rec_" + recName + "_directionStatus"
00324 recEnergyQualName = "rec_" + recName + "_energyQuality"
00325 recPosQualName = "rec_" + recName + "_positionQuality"
00326 recDirQualName = "rec_" + recName + "_directionQuality"
00327 if not self.recResults.has_key(recSiteName):
00328 self.recResults[recSiteName] = array('i',[0])
00329 self.recResults[recDetName] = array('i',[0])
00330 self.recResults[recTrigNumName] = array('i',[0])
00331 self.recResults[recTrigTimeSecName] = array('i',[0])
00332 self.recResults[recTrigTimeNanoSecName] = array('i',[0])
00333 self.recResults[recEnergyName] = array('d',[0])
00334 self.recResults[recPosName] = array('d',4*[0])
00335 self.recResults[recDirName] = array('d',4*[0])
00336 self.recResults[recEnergyStatName] = array('i',[0])
00337 self.recResults[recPosStatName] = array('i',[0])
00338 self.recResults[recDirStatName] = array('i',[0])
00339 self.recResults[recEnergyQualName] = array('d',[0])
00340 self.recResults[recPosQualName] = array('d',[0])
00341 self.recResults[recDirQualName] = array('d',[0])
00342 if self.firstEntry:
00343 self.info(" Adding reconstruction "+recName)
00344 self.tesTree.Branch(recSiteName,
00345 self.recResults[recSiteName],
00346 "%s/I" % recSiteName)
00347 self.tesTree.Branch(recDetName,
00348 self.recResults[recDetName],
00349 "%s/I" % recDetName)
00350 self.tesTree.Branch(recTrigNumName,
00351 self.recResults[recTrigNumName],
00352 "%s/I" % recTrigNumName)
00353 self.tesTree.Branch(recTrigTimeSecName,
00354 self.recResults[recTrigTimeSecName],
00355 "%s/I" % recTrigTimeSecName)
00356 self.tesTree.Branch(recTrigTimeNanoSecName,
00357 self.recResults[recTrigTimeNanoSecName],
00358 "%s/I" % recTrigTimeNanoSecName)
00359 self.tesTree.Branch(recEnergyName,
00360 self.recResults[recEnergyName],
00361 "%s/D" % recEnergyName)
00362 self.tesTree.Branch(recPosName,
00363 self.recResults[recPosName],
00364 "%s[4]/D" % recPosName)
00365 self.tesTree.Branch(recDirName,
00366 self.recResults[recDirName],
00367 "%s[4]/D" % recDirName)
00368 self.tesTree.Branch(recEnergyStatName,
00369 self.recResults[recEnergyStatName],
00370 "%s/I" % recEnergyStatName)
00371 self.tesTree.Branch(recPosStatName,
00372 self.recResults[recPosStatName],
00373 "%s/I" % recPosStatName)
00374 self.tesTree.Branch(recDirStatName,
00375 self.recResults[recDirStatName],
00376 "%s/I" % recDirStatName)
00377 self.tesTree.Branch(recEnergyQualName,
00378 self.recResults[recEnergyQualName],
00379 "%s/D" % recEnergyQualName)
00380 self.tesTree.Branch(recPosQualName,
00381 self.recResults[recPosQualName],
00382 "%s/D" % recPosQualName)
00383 self.tesTree.Branch(recDirQualName,
00384 self.recResults[recDirQualName],
00385 "%s/D" % recDirQualName)
00386 else:
00387 self.warning("Cannot add "+recName+" to tree after first entry")
00388 return
00389
00390 def execute(self):
00391 self.info("executing")
00392
00393 if "Gen" in self.HeaderList:
00394 self.writeGenHeader()
00395 if "Sim" in self.HeaderList:
00396 self.writeSimHeader()
00397 if "SimReadout" in self.HeaderList:
00398 self.writeSimReadoutHeader()
00399 if "Readout" in self.HeaderList:
00400 self.writeReadoutHeader()
00401 if "CalibReadout" in self.HeaderList:
00402 self.writeCalibReadoutHeader()
00403 if "Rec" in self.HeaderList:
00404 self.writeRecHeader()
00405
00406 self.tesTree.Fill()
00407 self.firstEntry = False
00408 return SUCCESS
00409
00410 def writeGenHeader(self):
00411
00412 self.hasGen[0] = 0
00413 self.genTimeSec[0] = 0
00414 self.genTimeNanoSec[0] = 0
00415 self.nGenParticles[0] = 0
00416
00417 evt = self.evtSvc()
00418
00419 genHdr = evt["/Event/Gen/GenHeader"]
00420 if genHdr != None:
00421 self.genTimeSec[0] = genHdr.timeStamp().GetSec()
00422 self.genTimeNanoSec[0] = genHdr.timeStamp().GetNanoSec()
00423 genEvt = genHdr.event()
00424 if genEvt != None:
00425 self.hasGen[0] = 1
00426 nParticles = 0
00427 for vertex in irange(genEvt.vertices_begin(),
00428 genEvt.vertices_end()):
00429 pos = vertex.position()
00430
00431 for particle in irange(vertex.particles_out_const_begin(),
00432 vertex.particles_out_const_end()):
00433 if nParticles >= self.maxGenParticles: break
00434 self.genPdgid[nParticles] = particle.pdg_id()
00435 self.genStatus[nParticles] = particle.status()
00436 self.genX[nParticles] = pos.x()
00437 self.genY[nParticles] = pos.y()
00438 self.genZ[nParticles] = pos.z()
00439 self.genT[nParticles] = pos.t()
00440 self.genE[nParticles] = particle.momentum().e()
00441 nParticles += 1
00442 self.nGenParticles[0] = nParticles
00443 return
00444
00445 def writeSimHeader(self):
00446
00447 self.hasSim[0] = 0
00448 self.simTimeSec[0] = 0
00449 self.simTimeNanoSec[0] = 0
00450 self.nSimHits[0] = 0
00451 for name in self.simStat.keys():
00452 self.simStat[name][0] = 0
00453
00454 evt = self.evtSvc()
00455
00456 simHdr = evt["/Event/Sim/SimHeader"]
00457 if simHdr != None:
00458 self.hasSim[0] = 1
00459 self.simTimeSec[0] = simHdr.timeStamp().GetSec()
00460 self.simTimeNanoSec[0] = simHdr.timeStamp().GetNanoSec()
00461 shh = simHdr.hits()
00462 if shh != None:
00463 nHits = 0
00464 hitCollectionMap = shh.hitCollection()
00465 for shcPair in irange(hitCollectionMap.begin(),
00466 hitCollectionMap.end()):
00467 detectorInt = shcPair.first
00468 hitCollection = shcPair.second
00469 hits = hitCollection.collection()
00470 detId = Detector(detectorInt<<16)
00471 for hit in hits:
00472 self.simHitSite[nHits] = detId.site()
00473 self.simHitDet[nHits] = detId.detectorId()
00474 self.simHitSensId[nHits] = hit.sensDetId()
00475 self.simHitTime[nHits] = hit.hitTime()
00476 self.simHitWeight[nHits] = hit.weight()
00477 pos = hit.localPos()
00478 self.simHitX[nHits] = pos.x()
00479 self.simHitY[nHits] = pos.y()
00480 self.simHitZ[nHits] = pos.z()
00481 if (detId.detectorId() == DetectorId.kAD1
00482 or detId.detectorId() == DetectorId.kAD2
00483 or detId.detectorId() == DetectorId.kAD3
00484 or detId.detectorId() == DetectorId.kAD4):
00485 pmtId = AdPmtSensor(hit.sensDetId())
00486 self.simHitRing[nHits] = pmtId.ring()
00487 self.simHitColumn[nHits] = pmtId.column()
00488 self.simHitWavelength[nHits] = hit.wavelength()
00489 self.simHitType[nHits] = hit.type()
00490 else:
00491 self.simHitRing[nHits] = 0
00492 self.simHitColumn[nHits] = 0
00493 self.simHitWavelength[nHits] = 0
00494 self.simHitType[nHits] = 0
00495 nHits += 1
00496 self.nSimHits[0] = nHits
00497
00498 particleHistory = simHdr.particleHistory()
00499 if particleHistory != None:
00500
00501 pass
00502
00503 statsHdr = simHdr.unobservableStatistics()
00504 if statsHdr != None:
00505 stats = statsHdr.stats()
00506 if self.firstEntry: self.info("Adding unobservables to tree")
00507 for statPair in irange(stats.begin(),stats.end()):
00508 name = statPair.first
00509 stat = statPair.second
00510 countName = "simUnobs_"+name+"_count"
00511 sumName = "simUnobs_"+name+"_sum"
00512 sqSumName = "simUnobs_"+name+"_sqSum"
00513 if not self.simStat.has_key(countName):
00514 self.simStat[countName] = array('d',[0])
00515 self.simStat[sumName] = array('d',[0])
00516 self.simStat[sqSumName] = array('d',[0])
00517 if self.firstEntry:
00518 self.info(" Adding "+name)
00519 self.tesTree.Branch(countName,
00520 self.simStat[countName],
00521 "%s/D" % countName)
00522 self.tesTree.Branch(sumName,self.simStat[sumName],
00523 "%s/D"%sumName)
00524 self.tesTree.Branch(sqSumName,
00525 self.simStat[sqSumName],
00526 "%s/D"%sqSumName)
00527 else:
00528 self.warning("Too late to add unobservable "+name)
00529 self.simStat[countName][0] = stat.count()
00530 self.simStat[sumName][0] = stat.sum()
00531 self.simStat[sqSumName][0] = stat.squaredsum()
00532 return
00533
00534 def writeSimReadoutHeader(self):
00535
00536 self.hasSimRo[0] = 0
00537 self.nSimRo[0] = 0
00538
00539 evt = self.evtSvc()
00540
00541 simRoHdr = evt["/Event/Sim/SimReadoutHeader"]
00542 if simRoHdr != None:
00543 self.hasSimRo[0] = 1
00544 self.nSimRo[0] = simRoHdr.readouts().size()
00545 return
00546
00547
00548 def writeReadoutHeader(self):
00549
00550 self.hasRo[0] = 0
00551 self.roTimeSec[0] = 0
00552 self.roTimeNanoSec[0] = 0
00553 self.hasReadout[0] = 0
00554 self.roSite[0] = 0
00555 self.roDetector[0] = 0
00556 self.roTriggerNumber[0] = 0
00557 self.roTriggerTimeSec[0] = 0
00558 self.roTriggerTimeNanoSec[0] = 0
00559 self.nRoChannels[0] = 0
00560 self.nRoTdcs[0] = 0
00561 self.nRoAdcs[0] = 0
00562
00563 evt = self.evtSvc()
00564
00565 roHdr = evt["/Event/Readout/ReadoutHeader"]
00566 if roHdr != None:
00567 self.hasRo[0] = 1
00568 self.roTimeSec[0] = roHdr.timeStamp().GetSec()
00569 self.roTimeNanoSec[0] = roHdr.timeStamp().GetNanoSec()
00570 readout = roHdr.readout()
00571 if readout != None:
00572 self.hasReadout[0] = 1
00573 self.roSite[0] = readout.detector().site()
00574 detId = readout.detector().detectorId()
00575 self.roDetector[0] = detId
00576 self.roTriggerNumber[0] = readout.triggerNumber()
00577 trigTime = readout.triggerTime()
00578 self.roTriggerTimeSec[0] = trigTime.GetSec()
00579 self.roTriggerTimeNanoSec[0] = trigTime.GetNanoSec()
00580 if (detId == DetectorId.kAD1 or
00581 detId == DetectorId.kAD2 or
00582 detId == DetectorId.kAD3 or
00583 detId == DetectorId.kAD4 or
00584 detId == DetectorId.kIWS or
00585 detId == DetectorId.kOWS or
00586 detId == DetectorId.kUnknown):
00587 nRoChannels = 0
00588 nRoTdcs = 0
00589 nRoAdcs = 0
00590 for channelPair in readout.channelReadout():
00591 channel = channelPair.second
00592 chanId = channel.channelId()
00593 self.roChanId[nRoChannels] = chanId.fullPackedData()
00594 self.roBoard[nRoChannels] = chanId.board()
00595 self.roConnector[nRoChannels] = chanId.connector()
00596 self.nRoChanTdc[nRoChannels] = channel.tdc().size()
00597 self.nRoChanAdc[nRoChannels] = channel.adc().size()
00598 self.roChanAdcGain[nRoChannels] = channel.adcGain()
00599 firstTdc = 0
00600 for tdc in channel.tdc():
00601 self.roTdc[nRoTdcs] = tdc
00602 self.roTdcChanId[nRoTdcs] = chanId.fullPackedData()
00603 firstTdc = max(firstTdc, tdc)
00604 nRoTdcs += 1
00605 peakAdc = 0
00606 for adcPair in irange(channel.adc().begin(),
00607 channel.adc().end()):
00608 adcClock = adcPair.first
00609 adc = adcPair.second
00610 self.roAdcClock[nRoAdcs] = adcClock
00611 self.roAdc[nRoAdcs] = adc
00612 self.roAdcChanId[nRoAdcs] = chanId.fullPackedData()
00613 peakAdc = max(peakAdc, adc)
00614 nRoAdcs += 1
00615 self.roChanFirstTdc[nRoChannels] = firstTdc
00616 self.roChanPeakAdc[nRoChannels] = peakAdc
00617 nRoChannels += 1
00618 self.nRoChannels[0] = nRoChannels
00619 self.nRoTdcs[0] = nRoTdcs
00620 self.nRoAdcs[0] = nRoAdcs
00621 return
00622
00623 def writeCalibReadoutHeader(self):
00624
00625 self.hasCro[0] = 0
00626 self.croTimeSec[0] = 0
00627 self.croTimeNanoSec[0] = 0
00628 self.hasCalibReadout[0] = 0
00629 self.croSite[0] = 0
00630 self.croDetector[0] = 0
00631 self.croTriggerNumber[0] = 0
00632 self.croTriggerTimeSec[0] = 0
00633 self.croTriggerTimeNanoSec[0] = 0
00634 self.nCroChannels[0] = 0
00635 self.nCroTdcs[0] = 0
00636 self.nCroAdcs[0] = 0
00637
00638 evt = self.evtSvc()
00639
00640 croHdr = evt["/Event/CalibReadout/CalibReadoutHeader"]
00641 if croHdr != None:
00642 self.hasCro[0] = 1
00643 self.croTimeSec[0] = croHdr.timeStamp().GetSec()
00644 self.croTimeNanoSec[0] = croHdr.timeStamp().GetNanoSec()
00645 readout = croHdr.calibReadout()
00646 if readout != None:
00647 self.hasCalibReadout[0] = 1
00648 self.croSite[0] = readout.detector().site()
00649 detId = readout.detector().detectorId()
00650 self.croDetector[0] = detId
00651 self.croTriggerNumber[0] = readout.triggerNumber()
00652 trigTime = readout.triggerTime()
00653 self.croTriggerTimeSec[0] = trigTime.GetSec()
00654 self.croTriggerTimeNanoSec[0] = trigTime.GetNanoSec()
00655 if (detId == DetectorId.kAD1 or
00656 detId == DetectorId.kAD2 or
00657 detId == DetectorId.kAD3 or
00658 detId == DetectorId.kAD4 or
00659 detId == DetectorId.kIWS or
00660 detId == DetectorId.kOWS):
00661 nCroChannels = 0
00662 nCroTdcs = 0
00663 nCroAdcs = 0
00664 for channelPair in readout.channelReadout():
00665 channel = channelPair.second
00666 chanId = channel.channelId()
00667 self.croChanId[nCroChannels] = chanId.fullPackedData()
00668 self.croBoard[nCroChannels] = chanId.board()
00669 self.croConnector[nCroChannels] = chanId.connector()
00670 self.nCroChanTdc[nCroChannels] = channel.tdc().size()
00671 self.nCroChanAdc[nCroChannels] = channel.adc().size()
00672 self.croChanAdcGain[nCroChannels] = channel.adcGain()
00673 for tdc in channel.tdc():
00674 self.croTdc[nCroTdcs] = tdc
00675 self.croTdcChanId[nCroTdcs]= chanId.fullPackedData()
00676 nCroTdcs += 1
00677 for adcPair in irange(channel.adc().begin(),
00678 channel.adc().end()):
00679 adcClock = adcPair.first
00680 adc = adcPair.second
00681 self.croAdcClock[nCroAdcs] = adcClock
00682 self.croAdc[nCroAdcs] = adc
00683 self.croAdcChanId[nCroAdcs]= chanId.fullPackedData()
00684 nCroAdcs += 1
00685 self.croChanFirstTdc[nCroChannels] = channel.firstTdc()
00686 self.croChanPeakAdc[nCroChannels] = channel.peakAdc()
00687 nCroChannels += 1
00688 self.nCroChannels[0] = nCroChannels
00689 self.nCroTdcs[0] = nCroTdcs
00690 self.nCroAdcs[0] = nCroAdcs
00691 return
00692
00693 def writeRecHeader(self):
00694
00695 self.hasRec[0] = 0
00696 self.recTimeSec[0] = 0
00697 self.recTimeNanoSec[0] = 0
00698 self.hasRecTrigger[0] = 0
00699 for name in self.recResults.keys():
00700 for fieldIdx in range(len(self.recResults[name])):
00701 self.recResults[name][fieldIdx] = 0
00702
00703 evt = self.evtSvc()
00704
00705 recHdr = evt["/Event/Rec/RecHeader"]
00706 if recHdr != None:
00707 self.hasRec[0] = 1
00708 self.recTimeSec[0] = recHdr.timeStamp().GetSec()
00709 self.recTimeNanoSec[0] = recHdr.timeStamp().GetNanoSec()
00710 for recPair in irange(recHdr.recResults().begin(),
00711 recHdr.recResults().end()):
00712 self.hasRecTrigger[0] = 1
00713 recTrigger = recPair.second
00714 recName = recTrigger.name()
00715 recSiteName = "rec_" + recName + "_site"
00716 recDetName = "rec_" + recName + "_det"
00717 recTrigNumName = "rec_" + recName + "_trigNum"
00718 recTrigTimeSecName = "rec_" + recName + "_trigTimeSec"
00719 recTrigTimeNanoSecName = "rec_" + recName + "_trigTimeNanoSec"
00720 recEnergyName = "rec_" + recName + "_energy"
00721 recPosName = "rec_" + recName + "_position"
00722 recDirName = "rec_" + recName + "_direction"
00723 recEnergyStatName = "rec_" + recName + "_energyStatus"
00724 recPosStatName = "rec_" + recName + "_positionStatus"
00725 recDirStatName = "rec_" + recName + "_directionStatus"
00726 recEnergyQualName = "rec_" + recName + "_energyQuality"
00727 recPosQualName = "rec_" + recName + "_positionQuality"
00728 recDirQualName = "rec_" + recName + "_directionQuality"
00729 if not self.recResults.has_key(recSiteName):
00730 self.prepareRecResults(recName)
00731 self.recResults[recSiteName][0] = recTrigger.detector().site()
00732 self.recResults[recDetName][0] = recTrigger.detector().detectorId()
00733 self.recResults[recTrigNumName][0] = recTrigger.triggerNumber()
00734 self.recResults[recTrigTimeSecName][0] = recTrigger.triggerTime().GetSec()
00735 self.recResults[recTrigTimeNanoSecName][0] = recTrigger.triggerTime().GetNanoSec()
00736 self.recResults[recEnergyName][0] = recTrigger.energy()
00737 self.recResults[recPosName][0] = recTrigger.position().x()
00738 self.recResults[recPosName][1] = recTrigger.position().y()
00739 self.recResults[recPosName][2] = recTrigger.position().z()
00740 self.recResults[recPosName][3] = recTrigger.position().t()
00741 self.recResults[recDirName][0] = recTrigger.direction().x()
00742 self.recResults[recDirName][1] = recTrigger.direction().y()
00743 self.recResults[recDirName][2] = recTrigger.direction().z()
00744 self.recResults[recDirName][3] = recTrigger.direction().t()
00745 self.recResults[recEnergyStatName][0] = recTrigger.energyStatus()
00746 self.recResults[recPosStatName][0] = recTrigger.positionStatus()
00747 self.recResults[recDirStatName][0]= recTrigger.directionStatus()
00748 self.recResults[recEnergyQualName][0]=recTrigger.energyQuality()
00749 self.recResults[recPosQualName][0]= recTrigger.positionQuality()
00750 self.recResults[recDirQualName][0]=recTrigger.directionQuality()
00751 return
00752
00753
00754 def finalize(self):
00755 self.info("finalizing")
00756 status = DybPythonAlg.finalize(self)
00757 return status
00758
00759
00760
00761 class DiagnosticAlg(DybPythonAlg):
00762 "Diagnostic Figures Algorithm"
00763 def __init__(self,name):
00764 DybPythonAlg.__init__(self,name)
00765 self.SaveHistograms = True
00766 return
00767
00768 def initialize(self):
00769 status = DybPythonAlg.initialize(self)
00770 if status.isFailure(): return status
00771 self.info("initialize")
00772
00773 self.figures = [{"name" :"genTime",
00774 "title" :"Generator Time",
00775 "draw" :"genTimeSec+(genTimeNanoSec*1e-9)",
00776 "cut" :"hasGen",
00777 "options" :"",
00778 "xaxis" :"time [s]",
00779 "yaxis" :"Generated Events",
00780 "filename":"genTime.png"
00781 },
00782 {"name" :"nGenParticles",
00783 "title" :"Number of Generated Particles",
00784 "draw" :"nGenParticles>>htemp(20,0,20)",
00785 "cut" :"hasGen",
00786 "options" :"",
00787 "xaxis" :"Number of particles",
00788 "yaxis" :"Generated Events",
00789 "filename":"nGenParticles.png"
00790 },
00791 {"name" :"genPdgid",
00792 "title" :"PDG ID",
00793 "draw" :"genPdgid",
00794 "cut" :"hasGen",
00795 "options" :"",
00796 "xaxis" :"PDG ID",
00797 "yaxis" :"Generated Particles",
00798 "filename":"genPdgid.png"
00799 },
00800 {"name" :"genPosition",
00801 "title" :"Generated Position",
00802 "draw" :"genZ:genY:genX",
00803 "cut" :"hasGen",
00804 "options" :"",
00805 "xaxis" :"x [mm]",
00806 "yaxis" :"y [mm]",
00807 "zaxis" :"z [mm]",
00808 "filename":"genPosition.png"
00809 },
00810 {"name" :"genE",
00811 "title" :"Generated Particle Energy",
00812 "draw" :"genE",
00813 "cut" :"hasGen",
00814 "options" :"",
00815 "xaxis" :"Energy [MeV]",
00816 "yaxis" :"Generated Particles",
00817 "filename":"genE.png"
00818 },
00819 {"name" :"genT",
00820 "title" :"Generated Particle Time Offset",
00821 "draw" :"genT",
00822 "cut" :"hasGen",
00823 "options" :"",
00824 "xaxis" :"Time Offset [ns]",
00825 "yaxis" :"Generated Particles",
00826 "filename":"genT.png"
00827 },
00828 {"name" :"nSimHits",
00829 "title" :"Number of Simulated Hits",
00830 "draw" :"nSimHits>>htemp(2000,0,2000)",
00831 "cut" :"hasSim",
00832 "options" :"",
00833 "xaxis" :"Number of hits on detectors",
00834 "yaxis" :"Number of Simulated Events",
00835 "filename":"nSimHits.png"
00836 },
00837 {"name" :"simHitTime",
00838 "title" :"Simulated Hit Time",
00839 "draw" :"simHitTime>>htemp(1000,0,500)",
00840 "cut" :"hasSim",
00841 "options" :"",
00842 "xaxis" :"time [ns]",
00843 "yaxis" :"Number of hits",
00844 "filename":"simHitTime.png"
00845 },
00846 {"name" :"simHitPosition",
00847 "title" :"Simulated Hit Position on PMT",
00848 "draw" :"simHitZ:simHitY:simHitX>>htemp(100,-100,100,100,-100,100,150,0,150)",
00849 "cut" :"hasSim",
00850 "options" :"",
00851 "xaxis" :"x [mm]",
00852 "yaxis" :"y [mm]",
00853 "zaxis" :"z [mm]",
00854 "filename":"simHitPosition.png"
00855 },
00856 {"name" :"simHitPmt",
00857 "title" :"Simulated Hits on AD PMTs",
00858 "draw" :"simHitRing:simHitColumn>>htemp(25,0,25,9,0,9)",
00859 "cut" :"hasSim",
00860 "options" :"colz",
00861 "xaxis" :"PMT column",
00862 "yaxis" :"PMT ring",
00863 "filename":"simHitPmt.png"
00864 },
00865 {"name" :"simQuenchedEnergyGdLS",
00866 "title" :"Quenched energy deposition in GdLS",
00867 "draw" :"simUnobs_QEDepInGdLS_sum>>htemp(2000,0,20)",
00868 "cut" :"",
00869 "options" :"",
00870 "xaxis" :"Quenched Energy [MeV]",
00871 "yaxis" :"Number of Simulated Events",
00872 "filename":"simQuenchedEnergyGdLS.png"
00873 },
00874 {"name" :"simQuenchedEnergyLS",
00875 "title" :"Quenched energy deposition in LS",
00876 "draw" :"simUnobs_QEDepInLS_sum>>htemp(2000,0,20)",
00877 "cut" :"",
00878 "options" :"",
00879 "xaxis" :"Quenched Energy [MeV]",
00880 "yaxis" :"Number of Simulated Events",
00881 "filename":"simQuenchedEnergyLS.png"
00882 },
00883 {"name" :"simQuenchedEnergyOil",
00884 "title" :"Quenched energy deposition in Buffer Oil",
00885 "draw" :"simUnobs_QEDepInOIL_sum>>htemp(2000,0,20)",
00886 "cut" :"",
00887 "options" :"",
00888 "xaxis" :"Quenched Energy [MeV]",
00889 "yaxis" :"Number of Simulated Events",
00890 "filename":"simQuenchedEnergyOil.png"
00891 },
00892 {"name" :"hasReadout",
00893 "title" :"Detector Triggered?",
00894 "draw" :"hasReadout>>htemp(2,0,2)",
00895 "cut" :"hasRo",
00896 "options" :"",
00897 "xaxis" :"False=0, True=1",
00898 "yaxis" :"Number of Events",
00899 "filename":"hasReadout.png"
00900 },
00901 {"name" :"readoutDetector",
00902 "title" :"Triggered Detector",
00903 "draw" :"roSite:roDetector>>htemp(10,0,10,10,0,10)",
00904 "cut" :"hasReadout",
00905 "options" :"colz",
00906 "xaxis" :"Detector ID",
00907 "yaxis" :"Site ID",
00908 "filename":"readoutDetector.png"
00909 },
00910 {"name" :"readoutTime",
00911 "title" :"Trigger Time",
00912 "draw" :"roTriggerTimeSec+(roTriggerTimeNanoSec*1e-9)",
00913 "cut" :"hasReadout",
00914 "options" :"",
00915 "xaxis" :"Time [s]",
00916 "yaxis" :"Number of Readouts",
00917 "filename":"readoutTime.png"
00918 },
00919 {"name" :"nRoChannels",
00920 "title" :"Number of Channels in Readout",
00921 "draw" :"nRoChannels>>htemp(300,0,300)",
00922 "cut" :"hasReadout",
00923 "options" :"",
00924 "xaxis" :"Number of Channels",
00925 "yaxis" :"Number of Readouts",
00926 "filename":"nRoChannels.png"
00927 },
00928 {"name" :"roChannel",
00929 "title" :"Readout Channels in Crate",
00930 "draw" :"roConnector:roBoard>>htemp(17,0,17,17,0,17)",
00931 "cut" :"hasReadout",
00932 "options" :"colz",
00933 "xaxis" :"FEE Board",
00934 "yaxis" :"FEE Connector",
00935 "filename":"roChannel.png"
00936 },
00937 {"name" :"tdc",
00938 "title" :"Readout TDC Spectrum",
00939 "draw" :"roTdc>>htemp(400,0,400)",
00940 "cut" :"hasReadout",
00941 "options" :"",
00942 "xaxis" :"TDC value",
00943 "yaxis" :"Number of TDCs",
00944 "filename":"tdc.png"
00945 },
00946 {"name" :"adc",
00947 "title" :"Readout ADC Spectrum",
00948 "draw" :"roAdc>>htemp(1000,0,1000)",
00949 "cut" :"hasReadout",
00950 "options" :"",
00951 "xaxis" :"ADC value",
00952 "yaxis" :"Number of ADCs",
00953 "filename":"adc.png"
00954 },
00955 {"name" :"adcClock",
00956 "title" :"Clock Offset of ADC value",
00957 "draw" :"roAdcClock>>htemp(16,0,16)",
00958 "cut" :"hasReadout",
00959 "options" :"",
00960 "xaxis" :"ADC clock (40 MHz)",
00961 "yaxis" :"Number of ADCs",
00962 "filename":"adcClock.png"
00963 },
00964 {"name" :"calibTdc",
00965 "title" :"Calibrated TDC values",
00966 "draw" :"croTdc>>htemp(500,-500,0)",
00967 "cut" :"hasCro && hasCalibReadout",
00968 "options" :"",
00969 "xaxis" :"Calibrated TDC value [ns]",
00970 "yaxis" :"Number of TDC values",
00971 "filename":"calibTdc.png"
00972 },
00973 {"name" :"calibAdc",
00974 "title" :"Calibrated ADC values",
00975 "draw" :"croAdc>>htemp(500,0,50)",
00976 "cut" :"hasCro && hasCalibReadout",
00977 "options" :"",
00978 "xaxis" :"Calibrated ADC values [Number of Photoelectrons]",
00979 "yaxis" :"Number of ADC values",
00980 "filename":"calibAdc.png"
00981 },
00982 {"name" :"calibAdcSum",
00983 "title" :"Sum of Calibrated ADC values in Readout",
00984 "draw" :"Sum$(croAdc)>>htemp(1000,0,2000)",
00985 "cut" :"hasCro && hasCalibReadout",
00986 "options" :"",
00987 "xaxis" :"ADC Sum [Number of Photoelectrons]",
00988 "yaxis" :"Number of Readouts",
00989 "filename":"calibAdcSum.png"
00990 },
00991 {"name" :"reconEnergy",
00992 "title" :"Reconstucted Energy",
00993 "draw" :"rec_AdSimple_energy>>htemp(1000,0,20)",
00994 "cut" :"hasRecTrigger && rec_AdSimple_energyStatus==1",
00995 "options" :"",
00996 "xaxis" :"Visible Energy [MeV]",
00997 "yaxis" :"Number of Readouts",
00998 "fit" :"gaus",
00999 "filename":"reconEnergy.png"
01000 },
01001 {"name" :"reconEnergyStatus",
01002 "title" :"Reconstucted Energy Status",
01003 "draw" :"rec_AdSimple_energyStatus>>htemp(10,0,10)",
01004 "cut" :"hasRecTrigger",
01005 "options" :"",
01006 "xaxis" :"Status: Unknown=0, Good=1, Bad>1",
01007 "yaxis" :"Number of Readouts",
01008 "filename":"reconEnergyStatus.png"
01009 },
01010 {"name" :"reconEnergyQuality",
01011 "title" :"Reconstucted Energy Quality",
01012 "draw" :"rec_AdSimple_energyQuality>>htemp(200,0,10)",
01013 "cut" :"hasRecTrigger && rec_AdSimple_energyStatus==1",
01014 "options" :"",
01015 "xaxis" :"Quality Measure",
01016 "yaxis" :"Number of Readouts",
01017 "filename":"reconEnergyQuality.png"
01018 },
01019 {"name" :"reconPosition",
01020 "title" :"Reconstucted Position",
01021 "draw" :"rec_AdSimple_position[2]:sqrt(rec_AdSimple_position[0]*rec_AdSimple_position[0]+rec_AdSimple_position[1]*rec_AdSimple_position[1])>>htemp(100,0,3000.,1000,-3000.,3000.)",
01022 "cut" :"hasRecTrigger && rec_AdSimple_positionStatus==1",
01023 "options" :"colz",
01024 "xaxis" :"#rho [mm]",
01025 "yaxis" :"z [mm]",
01026 "filename":"reconPosition.png"
01027 },
01028 {"name" :"reconPositionX",
01029 "title" :"Reconstucted X Position",
01030 "draw" :"rec_AdSimple_position[0]>>htemp(1000,-3000.,3000.)",
01031 "cut" :"hasRecTrigger && rec_AdSimple_positionStatus==1",
01032 "options" :"colz",
01033 "xaxis" :"x [mm]",
01034 "yaxis" :"Entries",
01035 "fit" :"gaus",
01036 "filename":"reconPositionX.png"
01037 },
01038 {"name" :"reconPositionY",
01039 "title" :"Reconstucted Y Position",
01040 "draw" :"rec_AdSimple_position[1]>>htemp(1000,-3000.,3000.)",
01041 "cut" :"hasRecTrigger && rec_AdSimple_positionStatus==1",
01042 "options" :"colz",
01043 "xaxis" :"y [mm]",
01044 "yaxis" :"Entries",
01045 "fit" :"gaus",
01046 "filename":"reconPositionY.png"
01047 },
01048 {"name" :"reconPositionZ",
01049 "title" :"Reconstucted Z Position",
01050 "draw" :"rec_AdSimple_position[2]>>htemp(1000,-3000.,3000.)",
01051 "cut" :"hasRecTrigger && rec_AdSimple_positionStatus==1",
01052 "options" :"colz",
01053 "xaxis" :"z [mm]",
01054 "yaxis" :"Entries",
01055 "fit" :"gaus",
01056 "filename":"reconPositionZ.png"
01057 },
01058 {"name" :"reconPositionStatus",
01059 "title" :"Reconstucted Position Status",
01060 "draw" :"rec_AdSimple_positionStatus>>htemp(10,0,10)",
01061 "cut" :"hasRecTrigger",
01062 "options" :"",
01063 "xaxis" :"Status: Unknown=0, Good=1, Bad>1",
01064 "yaxis" :"Number of Readouts",
01065 "filename":"reconPositionStatus.png"
01066 },
01067 {"name" :"reconPositionQuality",
01068 "title" :"Reconstucted Position Quality",
01069 "draw" :"rec_AdSimple_positionQuality>>htemp(200,0,5000)",
01070 "cut" :"hasRecTrigger && rec_AdSimple_positionStatus==1",
01071 "options" :"",
01072 "xaxis" :"Quality measure",
01073 "yaxis" :"Number of Readouts",
01074 "filename":"reconPositionQuality.png"
01075 }
01076
01077
01078
01079
01080
01081
01082
01083
01084
01085 ]
01086 return SUCCESS
01087
01088 def execute(self):
01089 return SUCCESS
01090
01091 def finalize(self):
01092 self.info("finalize")
01093 tesTree = self.stats['/file0/tes/tesTree']
01094 if tesTree == None:
01095 self.error("Failed to retrieve tree of TES data")
01096 return FAILURE
01097
01098 canvas = TCanvas()
01099 failedFigs = []
01100 for figure in self.figures:
01101 self.info("Making figure "+figure["title"])
01102 nEntries = tesTree.Draw(figure["draw"], figure["cut"], figure["options"])
01103 hist = canvas.FindObject("htemp")
01104 if nEntries < 1 or hist == None:
01105 self.warning("Failed to generate figure: "+figure["title"])
01106 failedFigs.append( figure["name"] )
01107 continue
01108 hist.SetTitle(figure["title"])
01109 hist.SetLineColor(4)
01110 if figure.has_key("xaxis"):
01111 hist.GetXaxis().SetTitle(figure["xaxis"])
01112 if figure.has_key("yaxis"):
01113 hist.GetYaxis().SetTitle(figure["yaxis"])
01114 if figure.has_key("zaxis"):
01115 hist.GetZaxis().SetTitle(figure["zaxis"])
01116 if figure.has_key("fit"):
01117 hist.Fit(figure["fit"])
01118 canvas.SaveAs(figure["filename"])
01119 if self.SaveHistograms:
01120 hist.SetName(figure["name"])
01121 self.stats["/file1/diagnostics/"+figure["name"]] = hist.Clone()
01122
01123 htmlList = []
01124 htmlList.append("<HTML>")
01125 htmlList.append("<HEAD>")
01126 htmlList.append("<TITLE>")
01127 htmlList.append(" Diagnostics Figures")
01128 htmlList.append("</TITLE>")
01129 htmlList.append("</HEAD>")
01130 htmlList.append("<BODY>")
01131 htmlList.append(" <H1>Diagnostics Figures</H1>")
01132 htmlList.append(' <P>Histogram file: <A HREF="diagnostics.root">diagnostics.root</A></P>')
01133 htmlList.append(' <P>Diagnostics <A HREF="log/">logs</A></P>')
01134 htmlList.append(" <TABLE>")
01135 for figureIdx in range(len(self.figures)):
01136 figure = self.figures[figureIdx]
01137 if figureIdx % 2 == 0:
01138 htmlList.append(" <TR>")
01139 figString =" <TD><H3>"+figure["title"]+"</H3>"
01140 if figure["name"] in failedFigs:
01141 figString += "<P>No Data for this figure</P>"
01142 else:
01143 figString += "<IMG SRC=\""+figure["filename"]+"\" WIDTH=70%>"
01144 figString += "</TD>"
01145 htmlList.append(figString)
01146 if figureIdx % 2 != 0:
01147 htmlList.append(" </TR>")
01148 elif figureIdx == len(self.figures):
01149 htmlList.append(" <TD></TD>")
01150 htmlList.append(" </TR>")
01151 htmlList.append(" </TABLE>")
01152 htmlList.append("</BODY>")
01153 htmlList.append("</HTML>")
01154 htmlFile = open("index.html","w")
01155 htmlFile.write("\n".join(htmlList))
01156 htmlFile.close()
01157 status = DybPythonAlg.finalize(self)
01158 return status
01159
01160