00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 from DybPython.DybPythonAlg import DybPythonAlg
00011 from GaudiPython import SUCCESS, FAILURE
00012 from GaudiPython import gbl, loaddict
00013 from DybPython.Util import irange
00014
00015
00016 TTree = gbl.TTree
00017
00018 Detector = gbl.DayaBay.Detector
00019 Site = gbl.Site
00020 DetectorId = gbl.DetectorId
00021 ServiceMode = gbl.ServiceMode
00022 AdPmtSensor = gbl.DayaBay.AdPmtSensor
00023
00024 from array import array
00025 import math
00026
00027 class TesToTreeAlg(DybPythonAlg):
00028 "Dump TES contents to ROOT tree"
00029 def __init__(self,name):
00030 DybPythonAlg.__init__(self,name)
00031
00032 self.HeaderList = ["Readout"]
00033 return
00034
00035 def initialize(self):
00036 status = DybPythonAlg.initialize(self)
00037 if status.isFailure(): return status
00038 self.info("initialize")
00039
00040
00041
00042 self.cableSvc = self.svc('ICableSvc','StaticCableSvc')
00043 if self.cableSvc == None:
00044 self.error("Failed to get StaticCableSvc")
00045 return FAILURE
00046
00047 self.firstEntry = True
00048
00049 self.tesTree= TTree("eventTree","Event data converted to ROOT Tree")
00050
00051 self.initReadoutHeader()
00052
00053 self.stats['/file0/event/eventTree'] = self.tesTree
00054 return SUCCESS
00055
00056 def initReadoutHeader(self):
00057
00058 self.hasRo = array('i',[0])
00059 self.roTimeSec = array('i',[0])
00060 self.roTimeNanoSec = array('i',[0])
00061 self.hasReadout = array('i',[0])
00062 self.roSite = array('i',[0])
00063 self.roDetector = array('i',[0])
00064 self.roTriggerNumber = array('i',[0])
00065 self.roTriggerTimeSec = array('i',[0])
00066 self.roTriggerTimeNanoSec = array('i',[0])
00067 self.nRoChannels = array('i',[0])
00068 self.nRoTdcs = array('i',[0])
00069 self.nRoAdcs = array('i',[0])
00070 self.maxRoTdcs = 4096
00071 self.roBoard = array('i',self.maxRoTdcs*[0])
00072 self.roConnector = array('i',self.maxRoTdcs*[0])
00073 self.roTdc = array('i',self.maxRoTdcs*[0])
00074 self.maxRoAdcs = 4096
00075 self.roAdcClock = array('i',self.maxRoAdcs*[0])
00076 self.roAdc = array('i',self.maxRoAdcs*[0])
00077 self.roPed = array('i',self.maxRoAdcs*[0])
00078 self.roAdcGain = array('i',self.maxRoAdcs*[0])
00079 self.roRing = array('i',self.maxRoTdcs*[0])
00080 self.roColumn = array('i',self.maxRoTdcs*[0])
00081
00082 self.tesTree.Branch('hasReadoutHeader',self.hasRo,'hasReadoutHeader/I')
00083 self.tesTree.Branch('roTimeSec',self.roTimeSec,'roTimeSec/I')
00084 self.tesTree.Branch('roTimeNanoSec',self.roTimeNanoSec,
00085 'roTimeNanoSec/I')
00086 self.tesTree.Branch('hasReadout',self.hasReadout,'hasReadout/I')
00087 self.tesTree.Branch('site',self.roSite,'site/I')
00088 self.tesTree.Branch('detector',self.roDetector,'detector/I')
00089 self.tesTree.Branch('triggerNumber',self.roTriggerNumber,
00090 'triggerNumber/I')
00091 self.tesTree.Branch('triggerTimeSec',self.roTriggerTimeSec,
00092 'triggerTimeSec/I')
00093 self.tesTree.Branch('triggerTimeNanoSec',self.roTriggerTimeNanoSec,
00094 'triggerTimeNanoSec/I')
00095 self.tesTree.Branch('nChannels',self.nRoChannels,'nChannels/I')
00096 self.tesTree.Branch('nTdcs',self.nRoTdcs,'nTdcs/I')
00097 self.tesTree.Branch('nAdcs',self.nRoAdcs,'nAdcs/I')
00098 self.tesTree.Branch('board',self.roBoard,'board[nTdcs]/I')
00099 self.tesTree.Branch('connector',self.roConnector,
00100 'connector[nTdcs]/I')
00101 self.tesTree.Branch('tdc',self.roTdc,'tdc[nTdcs]/I')
00102 self.tesTree.Branch('adcClock',self.roAdcClock,
00103 'adcClock[nAdcs]/I')
00104 self.tesTree.Branch('adcGain',self.roAdcGain,
00105 'adcGain[nAdcs]/I')
00106 self.tesTree.Branch('adc',self.roAdc,'adc[nAdcs]/I')
00107 self.tesTree.Branch('ped',self.roPed,'ped[nAdcs]/I')
00108 self.tesTree.Branch('ring',self.roRing,'ring[nTdcs]/I')
00109 self.tesTree.Branch('column',self.roColumn,
00110 'column[nTdcs]/I')
00111
00112 def execute(self):
00113 self.info("executing")
00114
00115 self.writeReadoutHeader()
00116
00117 self.tesTree.Fill()
00118 self.firstEntry = False
00119 return SUCCESS
00120
00121 def writeReadoutHeader(self):
00122
00123 self.hasRo[0] = 0
00124 self.roTimeSec[0] = 0
00125 self.roTimeNanoSec[0] = 0
00126 self.hasReadout[0] = 0
00127 self.roSite[0] = 0
00128 self.roDetector[0] = 0
00129 self.roTriggerNumber[0] = 0
00130 self.roTriggerTimeSec[0] = 0
00131 self.roTriggerTimeNanoSec[0] = 0
00132 self.nRoChannels[0] = 0
00133 self.nRoTdcs[0] = 0
00134 self.nRoAdcs[0] = 0
00135
00136 evt = self.evtSvc()
00137
00138 roHdr = evt["/Event/Readout/ReadoutHeader"]
00139 if roHdr != None:
00140 self.hasRo[0] = 1
00141 self.roTimeSec[0] = roHdr.timeStamp().GetSec()
00142 self.roTimeNanoSec[0] = roHdr.timeStamp().GetNanoSec()
00143 svcMode = ServiceMode( roHdr.context(), 0 )
00144 readout = roHdr.readout()
00145 if readout != None:
00146 self.hasReadout[0] = 1
00147 self.roSite[0] = readout.detector().site()
00148 detId = readout.detector().detectorId()
00149 self.roDetector[0] = detId
00150 self.roTriggerNumber[0] = readout.triggerNumber()
00151 trigTime = readout.triggerTime()
00152 self.roTriggerTimeSec[0] = trigTime.GetSec()
00153 self.roTriggerTimeNanoSec[0] = trigTime.GetNanoSec()
00154 if (detId == DetectorId.kAD1 or
00155 detId == DetectorId.kAD2 or
00156 detId == DetectorId.kAD3 or
00157 detId == DetectorId.kAD4):
00158 nRoChannels = 0
00159 nRoTdcs = 0
00160 nRoAdcs = 0
00161 for channelPair in readout.channelReadout():
00162 channel = channelPair.second
00163 chanId = channel.channelId()
00164 for tdcIdx in range( channel.size() ):
00165 self.roBoard[nRoTdcs] = chanId.board()
00166 self.roConnector[nRoTdcs] = chanId.connector()
00167 self.roTdc[nRoTdcs] = channel.tdc( tdcIdx )
00168 self.roAdc[nRoAdcs] = channel.adc( tdcIdx )
00169 self.roPed[nRoAdcs] = channel.pedestal( tdcIdx )
00170 self.roAdcGain[nRoAdcs] = channel.adcRange( tdcIdx )
00171 self.roAdcClock[nRoAdcs] = channel.adcCycle( tdcIdx )
00172
00173 pmtId = self.cableSvc.adPmtSensor(chanId, svcMode)
00174 self.roRing[nRoTdcs] = pmtId.ring()
00175 self.roColumn[nRoTdcs] = pmtId.column()
00176 nRoTdcs += 1
00177 nRoAdcs += 1
00178 nRoChannels += 1
00179 self.nRoChannels[0] = nRoChannels
00180 self.nRoTdcs[0] = nRoTdcs
00181 self.nRoAdcs[0] = nRoAdcs
00182 return
00183
00184 def finalize(self):
00185 self.info("finalizing")
00186 status = DybPythonAlg.finalize(self)
00187 return status
00188
00189
00190
00191 def configure(argv = []):
00192
00193 import sys, getopt
00194 opts,args = getopt.getopt(argv,"o:")
00195 statsOutput = "eventTree.root"
00196 initializeDataSvc = True
00197 for opt,arg in opts:
00198 if opt == "-o":
00199 statsOutput = arg
00200 if statsOutput != "None":
00201 from StatisticsSvc.StatisticsSvcConf import StatisticsSvc
00202 statsSvc = StatisticsSvc()
00203 statsSvc.Output = {"file0":statsOutput}
00204 return
00205
00206 def run(app):
00207 '''
00208 Configure and add an algorithm to job
00209 '''
00210 app.ExtSvc += ["StatisticsSvc","StaticCableSvc"]
00211 tesToTreeAlg = TesToTreeAlg("TesToTreeAlg")
00212 app.addAlgorithm(tesToTreeAlg)
00213 pass