| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

Tools.py

Go to the documentation of this file.
00001 #!/usr/bin/env python
00002 #
00003 # Helper Algorithms
00004 #
00005 
00006 # Load GaudiPython
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 # Make shortcuts to ROOT classes
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         # List of headers in output tree
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         # GenEvent Data
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         # SimEvent Data
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         # SimReadoutEvent Data
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         # ReadoutEvent Data
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         # CalibReadoutEvent Data
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         # RecEvent Data
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         # Prepare tree branches for a particular reconstruction type
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         # GenEvent Data
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         # GenEvent Data
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                     #localPos = self.localCoord(pos)
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         # SimEvent Data
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         # SimEvent Data
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             # Particle History
00498             particleHistory = simHdr.particleHistory()
00499             if particleHistory != None:
00500                 # Currently doesn't copy particle history
00501                 pass
00502             # Unobservable Statistics
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         # SimReadoutEvent
00536         self.hasSimRo[0] = 0
00537         self.nSimRo[0] = 0
00538         
00539         evt = self.evtSvc()
00540         # SimReadoutEvent Data
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         # ReadoutEvent Data
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         # ReadoutEvent Data
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):  # Catch unset detector
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         # CalibReadoutEvent Data
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         # CalibReadoutEvent Data
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         # RecEvent Data
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         # RecEvent Data
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                         #{"title"   :"",
01077                         # "draw"    :"",
01078                         # "cut"     :"",
01079                         # "options" :"",
01080                         # "xaxis"   :"",
01081                         # "yaxis"   :"",
01082                         # "zaxis"   :"",
01083                         # "filename":""
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         # Make figures
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         # Generate html page
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 
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:33:30 2011 for DataQuality by doxygen 1.4.7