Main Page | Packages | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | Related Pages

standardLDF.py

00001 #!/usr/local/bin/python
00002 #
00003 #                               Copyright 2003
00004 #                                     by
00005 #                        The Board of Trustees of the
00006 #                     Leland Stanford Junior University.
00007 #                            All rights reserved.
00008 #
00009 
00010 
00011 __facility__ = "Online"
00012 __abstract__ = "LDF Interface for standardPlotter"
00013 __author__   = "Lester Miller"
00014 __date__     = "11/18/2003"
00015 __version__  = "$Revision: 1.7 $"
00016 __credits__  = "SLAC"
00017 
00018 import LATTE.copyright_SLAC
00019 import LDF
00020 import Numeric as numarray
00021 import time
00022 
00023 class LATcomponentIterator(LDF.LATcomponentIterator):
00024   def __init__(self):
00025     LDF.LATcomponentIterator.__init__(self)
00026     self.eventMarker  = None
00027     self.ntDefinitions = self.declareNtDefinitions()
00028     self.ntDescriptions = self.declareNtDescriptions()
00029     # protect against failure to have dictionaries and pedestals
00030     self.ntDict = {}
00031     self.numarrayDict = {}
00032     self.acdPeds = None
00033     self.calPeds = None
00034     self.sparsify = False
00035     # other needed internal variables
00036     self.nEvtSeen = 0
00037     self.prevPpcTime = 0
00038     self.prevGmTime = 0
00039     self.markerPpcTime = 0
00040     self.markerGmTime = 0
00041     self.ppcTimeInSec = 0.
00042     self.gemTimeInSec = 0.
00043     self.prevGemTime = 0.
00044     self.collectingPedestals = False
00045     
00046   def UDFcomponent(self, event, ebfContribution):
00047     return 0
00048 
00049   def OSWcomponent(self, event, oswContribution):
00050     oswContribIter = OSWcontributionIterator(event, oswContribution, self)
00051     oswContribIter.iterate()
00052     self.nEvtSeen+=1
00053     return 0
00054 
00055   def ACDcomponent(self, event, aemContribution):
00056     acdContrib = AEMcontributionIterator(event, aemContribution, self)
00057     acdContrib.fill()
00058     return 0
00059 
00060   def GEMcomponent(self, event, gemContribution):
00061     gemContrib = GEMcontribution(event, gemContribution, self)
00062     gemContrib.fill()
00063     return 0
00064 
00065   def CALcomponent(self, event, calContribution):
00066     calContrib = CALcontributionIterator(event, calContribution, self)
00067     calContrib.fill()
00068     return 0
00069 
00070   def TKRcomponent(self, event, tkrContribution):
00071     tkrContrib = TKRcontributionIterator(event, tkrContribution, self)
00072     tkrContrib.fill()
00073     return 0
00074 
00075   def diagnostic(self, event, contribution):
00076     if not LDF.EventSummary.diagnostic(contribution.summary()):
00077       return
00078     diagContrib = DIAGcontributionIterator(event,contribution,self.TKRend(),self)
00079     diagContrib.iterateCAL()
00080     diagContrib.iterateTKR()
00081     self.diagnosticEnd(self.TKRend() + diagContrib.size())
00082     return 0
00083 
00084   def error(self, event, contribution):
00085     if  not LDF.EventSummary.error(contribution.summary()):
00086       return
00087     if self.diagnosticEnd() != 0:
00088       offset=self.diagnosticEnd()
00089     else:
00090       offset=self.TKRend()
00091     errorContrib = LDF.ERRcontributionIterator(event,contribution,offset)
00092     theError = errorContrib.theError()
00093     if 'evt_error' in self.ntDict:
00094       cRow = [0,theError.tmo(),theError.phs(),theError.cal()<<8|theError.tkr(),self.ppcTimeInSec]
00095       cNt = self.ntDict['evt_error']
00096       cNt.addRow(cRow)
00097     self.errorEnd(offset + errorContrib.size())
00098     return 0
00099 
00100   def getEventMarker(self):
00101     return self.eventMarker
00102   
00103   def declareNtDefinitions(self):
00104     definitions = {}
00105     definitions['osw_time']  = ["eventnum","evtsize","dtppc","gmtime","ppctime"]
00106     definitions['tkr_trig']  = ["tower", "layer", "end","chanindex","ppctime"]
00107     definitions['tkr_hit']   = ["tower", "layer", "fenum", "hit","chanindex","ppctime"]
00108     definitions['tkr_tot']   = ["tower", "layer", "end", "tot","chanindex","ppctime"]
00109     definitions['tkr_layer'] = ["tower", "layer", "nhit","chanindex","ppctime"]
00110     definitions['cal_trig']  = ["tower", "layer", "end", "le", "he","chanindex","ppctime"] 
00111     definitions['cal_lac']   = ["tower", "layer", "col", "end","lac","chanindex","ppctime"]
00112     definitions['cal_accept']= ["tower", "layer", "col", "end","adc","chanindex","ppctime"]
00113     definitions['cal_log']   = ["tower", "layer", "col", "adcp", "adcn", "adcmean", "adcdiff","chanindex","ppctime"]
00114     definitions['acd_hit']   = ["arc", "afe", "tile", "side","chanindex","ppctime"]
00115     definitions['acd_accept']= ["arc", "afe", "tile", "side", "pha","chanindex","ppctime"]
00116     definitions['acd_tile']  = ["tile", "pha1", "pha2", "phamean", "phadiff", "hit1", "hit2", "hitor","chanindex","ppctime"]
00117     definitions['gem_event'] = ["dtreg", "dtcalc", "condsum", "ntile", "live", "gtime", "prescale", "discarded", "sent","ppctime"]
00118     definitions['gem_input'] = ["cno","tileXY","tileXZM","tileXZP","tileYZM","tileYZP","tileRBN","tileNA","roi", "tkr", "callo", "calhe","ppctime"]
00119     definitions['evt_error'] = ["tower", "phasing", "timeout","cc","ppctime"]
00120     return definitions
00121 
00122   def declareNtDescriptions(self):
00123     descriptions = {}
00124     descriptions['osw_time']  = ["Event Number","Event Size","PPC Delta t","G.M. time","PPC time"]
00125     descriptions['tkr_trig']  = ["Tower", "Layer (0-35)", "End","Channel: Tower, Layer(0-35), End(0-1)","PPC time"]
00126     descriptions['tkr_hit']   = ["Tower", "Layer (0-35)", "TFE number (0-23)", "Strip Number","Channel: Tower, Layer (0-35), TFE (0-23)","PPC time"]
00127     descriptions['tkr_tot']   = ["Tower", "Layer (0-35)", "End", "TOT","Channel: Tower, Layer(0-35), End(0-1)","PPC time"]
00128     descriptions['tkr_layer'] = ["Tower", "Layer (0-35)", "Number Strips Hit","Layer: Tower, Layer(0-35)","PPC time"]
00129     descriptions['cal_trig']  = ["Tower", "Layer", "End", "FLE fired", "FHE fired","Channel: Tower, Layer(0-7), End(0-1)","PPC time"] 
00130     descriptions['cal_lac']   = ["Tower", "Layer", "Column", "End","LAC fired","Channel: Tower, Layer(0-7), Column(0-11), End(0-1)","PPC time"]
00131     descriptions['cal_accept']= ["Tower", "Layer", "Column", "End","ADC Value","Channel: Tower, Layer(0-7), Column(0-11), End(0-1)","PPC time"]
00132     descriptions['cal_log']   = ["Tower", "Layer", "Column", "ADC+", "ADC-", "ADC Mean", "ADC Relative Difference","Log: Tower, Layer(0-7), Column(0-11)","PPC time"]
00133     descriptions['acd_hit']   = ["ARC (cable)", "AFE (channel)", "Tile Number", "Tile Side","Channel: Tile (0-107), Side(0-1)","PPC time"]
00134     descriptions['acd_accept']= ["ARC (cable)", "AFE (channel)", "Tile Number", "Tile Side","ADC Value","Channel: Tile Number(0-107), Side(0-1)","PPC time"]
00135     descriptions['acd_tile']  = ["Tile Number", "ADC Side A", "ADC Side B", "ADC Mean", "ADC Relative Difference", "Veto A Fired", "Veto B Fired", "Veto Fired","Channel: Tile (0-107)","PPC time"]
00136     descriptions['gem_event'] = ["Delta T Register", "Delta T Calculated", "Condition Summary", "Number Tiles Fired", "Live Time", "Gem Time", "Prescaled Register", "Discarded Register", "Sent Register","PPC time"]
00137     descriptions['gem_input'] = ["CNO Vector","ACD Tile XY","ACD Tile XZ-","ACD tile XZ+","ACD Tile YZ-","ACD Tile YZ+","ACD Fiber","ACD NA","Roi Vector", "Tkr Vector", "Cal Low Vector", "Cal High Vector","PPC time"]
00138     descriptions['evt_error'] = ["Tower", "Phasing Error bit", "Timeout bit","CC Bit Field","PPC time"]
00139     return descriptions
00140 
00141   def getColumnDescription(self,ntName,columnName):
00142     index = 0
00143     result = ''
00144     if ntName not in self.ntDefinitions or ntName not in self.ntDescriptions:
00145       return result
00146     descriptionList = self.ntDescriptions[ntName]
00147     for column in self.ntDefinitions[ntName]:
00148       if column == columnName:
00149         result = descriptionList[index]
00150       index+=1
00151     return result
00152   
00153   def getChanIndexDescription(self,ntName,value):
00154     result = 'chanindex'
00155     if ntName == 'cal_accept':
00156       tower  = value/(8*12*2)
00157       value  = value%(8*12*2)
00158       layer  = value/(12*2)
00159       value  = value%(12*2)
00160       column = value/(2)
00161       value  = value%(2)
00162       end    = value
00163       result = 'Tower %d Layer %d Column %d End %d'%(tower,layer,column,end)
00164     if ntName == 'cal_log':
00165       tower  = value/(8*12)
00166       value  = value%(8*12)
00167       layer  = value/(12)
00168       value  = value%(12)
00169       column = value
00170       result = 'Tower %d Layer %d Column %d'%(tower,layer,column)
00171     if ntName == 'cal_lac':
00172       tower  = value/(8*12*2)
00173       value  = value%(8*12*2)
00174       layer  = value/(12*2)
00175       value  = value%(12*2)
00176       column = value/(2)
00177       value  = value%(2)
00178       end    = value
00179       result = 'Tower %d Layer %d Column %d End %d'%(tower,layer,column,end)
00180     if ntName == 'cal_trig':
00181       tower  = value/(8*2)
00182       value  = value%(8*2)
00183       layer  = value/(2)
00184       value  = value%(2)
00185       end    = value
00186       result = 'Tower %d Layer %d End %d'%(tower,layer,end)
00187 
00188     if ntName == 'tkr_layer':
00189       tower  = value/(36)
00190       value  = value%(36)
00191       layer  = value
00192       result = 'Tower %d Layer %d'%(tower,layer)
00193     if ntName == 'tkr_hit':
00194       tower  = value/(36*24)
00195       value  = value%(36*24)
00196       layer  = value/(24)
00197       value  = value%(24)
00198       fenum  = value
00199       result = 'Tower %d Layer %d TFE %d'%(tower,layer,fenum)
00200     if ntName == 'tkr_tot':
00201       tower  = value/(36*2)
00202       value  = value%(36*2)
00203       layer  = value/(2)
00204       value  = value%(2)
00205       end    = value
00206       result = 'Tower %d Layer %d End %d'%(tower,layer,end)
00207     if ntName == 'tkr_trig':
00208       tower  = value/(36*2)
00209       value  = value%(36*2)
00210       layer  = value/(2)
00211       value  = value%(2)
00212       end    = value
00213       result = 'Tower %d Layer %d End %d'%(tower,layer,end)
00214 
00215     if ntName == 'acd_accept':
00216       tileRemap = value/(2)
00217       value     = value%(2)
00218       side      = value
00219       tile = self.getTileNumber(int(tileRemap))
00220       result = 'Tile %d Side %d'%(tile,side)
00221     if ntName == 'acd_tile':
00222       tileRemap = value
00223       tile = self.getTileNumber(int(tileRemap))
00224       result = 'Tile %d'%(tile)
00225     return result
00226 
00227   def getTileNumber(self,remapTileNumber):
00228     # remap: top has 25, sides 16, 8 fibers and last 11 unassigned
00229     # three digits of tilenumber are [side][xcoord][yxoord]
00230     result = None
00231     if remapTileNumber<25:
00232       result = 10*(remapTileNumber/5) + remapTileNumber%5
00233     elif remapTileNumber<(25+4*16):
00234       result = 100+100*((remapTileNumber-25)/16)
00235       remainder = (remapTileNumber-25)%16
00236       result += 10*(remainder/5) + remapTileNumber%5
00237     elif remapTileNumber<(25+4*16+8):
00238       division = (remapTileNumber-25-4*16)/4
00239       remainder = (remapTileNumber-25-4*16)%4
00240       result = 500+100*division+10*remainder
00241     else:
00242       result = 700+(remapTileNumber-25-4*16-8)
00243     return result
00244 
00245   def getNtupleDefinition(self,ntName):
00246     # this returns the string of column names if it is known of here
00247     if ntName in self.ntDefinitions:
00248       return self.ntDefinitions[ntName]
00249     else:
00250       return None
00251 
00252 class CALcontributionIterator(LDF.CALcontributionIterator):
00253   def __init__(self, event, contribution,lci):
00254     LDF.CALcontributionIterator.__init__(self, event, contribution)
00255     self.lci     = lci
00256     
00257   def fill(self):
00258     length = self.contribution().numLogAccepts()
00259     if length == 0:
00260       return
00261     self.iterate()
00262 
00263   def log(self, tower, layer, theLog):
00264     column = theLog.column()
00265     positive = theLog.positive()
00266     negative = theLog.negative()
00267     posRange = positive.range()
00268     posValue = positive.value()
00269     negRange = negative.range()
00270     negValue = negative.value()
00271     if self.lci.calPeds is not None:
00272       posValue -= self.lci.calPeds[tower,layer,column,0,posRange,0]
00273       negValue -= self.lci.calPeds[tower,layer,column,1,negRange,0]
00274       # to translate from range to range, lo to hi is 8, with area between diodes of 6
00275       rangeMultiplier = [1.,8.,6.*8.,6.*8.*8.]
00276       posValue *= rangeMultiplier[posRange]
00277       negValue *= rangeMultiplier[negRange]
00278       # until I decide to get four range pedestals, this will kludge
00279       if posRange>0: posValue = 4096.
00280       if negRange>0: negValue = 4096.
00281       negRange = 0
00282       posRange = 0
00283       if self.lci.sparsify:
00284         if negValue < 3.*self.lci.calPeds[tower,layer,column,0,posRange,1]:
00285           negValue = None
00286         if posValue < 3.*self.lci.calPeds[tower,layer,column,1,posRange,1]:
00287           posValue = None
00288     else:
00289       # can't relate ranges without peds so just fill overflow for other ranges
00290       if not self.lci.collectingPedestals:
00291         if posRange>0: posValue = 4096.
00292         if negRange>0: negValue = 4096.
00293     if 'cal_accept' in self.lci.ntDict:
00294       cNt = self.lci.ntDict['cal_accept']
00295       if negValue is not None:
00296         chanIndex = tower*8*12*2 + layer*12*2 + column*2
00297         cRow = [tower,layer,column,0,negValue,chanIndex,self.lci.ppcTimeInSec]
00298         cNt.addRow(cRow)
00299       if posValue is not None:
00300         chanIndex = tower*8*12*2 + layer*12*2 + column*2 + 1
00301         cRow = [tower,layer,column,1,posValue,chanIndex,self.lci.ppcTimeInSec]
00302         cNt.addRow(cRow)
00303     if 'cal_log' in self.lci.numarrayDict:
00304       cNumarray = self.lci.numarrayDict['cal_log']
00305       if negValue is not None:
00306         cNumarray[tower,layer,column,0,negRange] = negValue
00307       if posValue is not None:
00308         cNumarray[tower,layer,column,1,posRange] = posValue
00309     if posValue is None or negValue is None:
00310       return
00311     average = (posValue+negValue)/2.
00312     if average!=0:
00313       difference = (posValue-negValue)/(2.*average)
00314     else:
00315       difference = 0
00316     if 'cal_log' in self.lci.ntDict:
00317       cNt = self.lci.ntDict["cal_log"]
00318       chanIndex = tower*8*12 + layer*12 + column
00319       cRow = [tower,layer,column,posValue,negValue,average,difference,chanIndex,self.lci.ppcTimeInSec]
00320       cNt.addRow(cRow)
00321 
00322 class TKRcontributionIterator(LDF.TKRcontributionIterator):
00323   def __init__(self, event, contribution, lci):
00324     LDF.TKRcontributionIterator.__init__(self, event, contribution)
00325     self.lci     = lci
00326     self.__debug      = 0
00327     
00328   def fill(self):
00329     length  = self.contribution().numAccepts(self.event())
00330     if length == 0:
00331       return
00332     self.layerHits = [0] * 16 * 36
00333     self.iterateStrips()
00334     self.iterateTOTs()
00335     # fill layer hits ntuple
00336     if 'tkr_layer' in self.lci.ntDict:
00337       cNt = self.lci.ntDict['tkr_layer']
00338       for tower in range(16):
00339         for layer in range(36):
00340           chanIndex = tower*36+layer
00341           if self.layerHits[chanIndex]>0:
00342             cRow = [tower,layer,self.layerHits[layer],chanIndex,self.lci.ppcTimeInSec]
00343             cNt.addRow(cRow)
00344 
00345   def strip(self, tower, layerEnd, hit):
00346     layer = layerEnd >> 1
00347     fenum = int(hit/64)
00348     self.layerHits[tower*36+layer]+=1;
00349     if 'tkr_hit' in self.lci.ntDict:
00350       cNt = self.lci.ntDict['tkr_hit']
00351       chanIndex = tower*36*24+layer*24+fenum
00352       cRow = [tower,layer,fenum,hit,chanIndex,self.lci.ppcTimeInSec]
00353       cNt.addRow(cRow)
00354 
00355   def TOT(self, tower, layerEnd, tot):
00356     layer = layerEnd>>1
00357     end = layerEnd%2
00358     if 'tkr_tot' in self.lci.ntDict:
00359       cNt = self.lci.ntDict['tkr_tot']
00360       chanIndex = tower*36*2+layer*2+end
00361       cRow = [tower,layer,end,tot,chanIndex,self.lci.ppcTimeInSec]
00362       cNt.addRow(cRow)
00363 
00364 class AEMcontributionIterator(LDF.AEMcontributionIterator):
00365   def __init__(self,event,contribution, lci):
00366     LDF.AEMcontributionIterator.__init__(self,event,contribution)
00367     self.lci = lci
00368   def fill(self):
00369     if 'acd_tile' in self.lci.ntDict:
00370       self.acdAdc0 = {}
00371       self.acdAdc1 = {}
00372       self.acdHit0 = {}
00373       self.acdHit1 = {}
00374     self.iterate()
00375     if 'acd_tile' in self.lci.ntDict:
00376       for tileNumber in self.acdAdc0.keys():
00377         pha0 = self.acdAdc0[tileNumber]
00378         pha1 = self.acdAdc1[tileNumber]
00379         hit0=0
00380         hit1=0
00381         if tileNumber in self.acdHit0:
00382           hit0 = self.acdHit0[tileNumber]
00383           if hit0 is None:
00384             hit0 = 0
00385         if tileNumber in self.acdHit1:
00386           hit1 = self.acdHit1[tileNumber]
00387           if hit1 is None:
00388             hit1 = 0
00389         if pha0 is not None and pha1 is not None:
00390           # have both read out so make it a tile...
00391           average = (pha0+pha1)/2.
00392           if average!=0:
00393             difference = (pha0-pha1)/(2.*average)
00394           else:
00395             difference = 0
00396           cNt = self.lci.ntDict['acd_tile']
00397           chanIndex = self.getRemappedTileNumber(tileNumber)
00398           cRow = [tileNumber,pha0,pha1,average,difference,hit0,hit1,hit0|hit1,chanIndex,self.lci.ppcTimeInSec]
00399           cNt.addRow(cRow)
00400 
00401   def header(self, cable, hdr):
00402     for channel in range(18):
00403       if (hdr.hitMap()>>channel)&0x1:
00404         tileNumber = self.getMiniAcdTileNumber(cable,channel)
00405         remappedTileNumber = self.getRemappedTileNumber(tileNumber)
00406         side = self.getMiniAcdSide(cable,channel)
00407         if 'acd_hit' in self.lci.ntDict:
00408           cNt = self.lci.ntDict['acd_hit']
00409           chanIndex = remappedTileNumber*2+side
00410           cRow = [cable,channel,tileNumber,side,chanIndex,self.lci.ppcTimeInSec]
00411           cNt.addRow(cRow)
00412         if 'acd_tile' in self.lci.ntDict:
00413           if side==0:
00414             self.acdHit0[tileNumber]=1
00415             if not tileNumber in self.acdHit1:
00416               self.acdHit1[tileNumber]=None
00417           if side==1:
00418             self.acdHit1[tileNumber]=1
00419             if not tileNumber in self.acdHit0:
00420               self.acdHit0[tileNumber]=None
00421             
00422   def pha(self, cable, channel, p):
00423     adcValue = p.ADCvalue()
00424     adcRange = p.ADCrange()
00425     if self.lci.acdPeds is not None:
00426       adcValue -= self.lci.acdPeds[cable,channel,p.ADCrange(),0]
00427       rangeMultiplier = [1.,100.]
00428       adcValue*=rangeMultiplier[p.ADCrange()]
00429       # until second range pedestals are available, just overflow the other range
00430       if adcRange>0: adcValue = 4096.
00431       adcRange = 0
00432       if self.lci.sparsify:
00433         if adcValue < 3.*self.lci.acdPeds[cable,channel,adcRange,1]:
00434           return # don't fill if we're sparsifying
00435     else:
00436       # overflow the second range if no pedestals
00437       if not self.lci.collectingPedestals:
00438         if adcRange>0: adcValue = 4096.
00439     tileNumber = self.getMiniAcdTileNumber(cable,channel)
00440     remapTileNumber = self.getRemappedTileNumber(tileNumber)
00441     # side
00442     side = self.getMiniAcdSide(cable,channel)
00443     if 'acd_accept' in self.lci.ntDict:
00444       cNt = self.lci.ntDict["acd_accept"]
00445       chanIndex = remapTileNumber*2+side
00446       cRow = [cable,channel,tileNumber,side,adcValue,chanIndex,self.lci.ppcTimeInSec]
00447       cNt.addRow(cRow)
00448     if 'acd_tile' in self.lci.ntDict:
00449       if side==0:
00450         self.acdAdc0[tileNumber]=adcValue
00451         if not tileNumber in self.acdAdc1:
00452           self.acdAdc1[tileNumber]=None
00453       if side==1:
00454         self.acdAdc1[tileNumber]=adcValue
00455         if not tileNumber in self.acdAdc0:
00456           self.acdAdc0[tileNumber]=None
00457     if 'acd_pha' in self.lci.numarrayDict:
00458       cNumarray = self.lci.numarrayDict["acd_pha"]
00459       cNumarray[cable,channel,adcRange] = adcValue
00460 
00461   def getSide(self,cable,channel):
00462     id   = self.event().identity()
00463     tbl  = self.map().lookup(id, cable, channel)
00464     if tbl.a() == 'A':
00465       side = 0
00466     else:
00467       side = 1
00468     return side
00469   
00470   def getIntegerTileNumber(self,cable,channel):
00471     id   = self.event().identity()
00472     tbl  = self.map().lookup(id, cable, channel)
00473     tileName  = tbl.name()
00474     if tileName[0:2] == 'NA':
00475       tileNumber = int(tileName[2:])
00476       tileNumber += 700
00477     else:
00478       tileNumber = int(tileName)
00479     return tileNumber
00480   
00481   def getMiniAcdSide(self,cable,channel):
00482     # special kludged version for miniAcd
00483     id   = self.event().identity()
00484     tbl  = self.map().lookup(id, cable, channel)
00485     if tbl.a() == 'A':
00486       side = 0
00487     else:
00488       side = 1
00489 
00490     # special remaps
00491     if cable==10 and channel==6:
00492       side = 1
00493     if cable==10 and channel==7:
00494       side = 1
00495     if cable==10 and channel==11:
00496       side = 0
00497     if cable==10 and channel==12:
00498       side = 0
00499 
00500     return side
00501   
00502   def getMiniAcdTileNumber(self,cable,channel):
00503     # special kludged version for miniAcd
00504     id   = self.event().identity()
00505     tbl  = self.map().lookup(id, cable, channel)
00506     tileName  = tbl.name()
00507     if tileName[0:2] == 'NA':
00508       tileNumber = int(tileName[2:])
00509       tileNumber += 700
00510     else:
00511       tileNumber = int(tileName)
00512 
00513     # special remaps
00514     if cable==10 and channel==6:
00515       tileNumber = 0
00516     if cable==10 and channel==7:
00517       tileNumber = 1
00518     if cable==10 and channel==11:
00519       tileNumber = 0
00520     if cable==10 and channel==12:
00521       tileNumber = 1
00522 
00523     return tileNumber
00524   
00525   def getRemappedTileNumber(self,tileNumber):
00526     # remap: top has 25, sides 16, 8 fibers and last 11 unassigned
00527     # three digits of tilenumber are [side][xcoord][yxoord]
00528     remainder = tileNumber%100
00529     division  = tileNumber/100
00530     remapTileNumber = 5*(remainder/10)+remainder%10
00531     if division>=1 and division<5:
00532       remapTileNumber+=25+16*(division-1)
00533     elif division==5 or division==6:
00534       remapTileNumber=25+16*4+(remainder/10)
00535     elif division==7:
00536       remapTileNumber=25+16*4+8+remainder
00537     return remapTileNumber
00538 
00539 class OSWcontributionIterator(LDF.OSWcontributionIterator):
00540   def __init__(self, event, contribution, lci):
00541     LDF.OSWcontributionIterator.__init__(self, event, contribution)
00542     self.lci  = lci
00543     # these are for filling ntuple (in OSWtime)
00544     self.eventNumber = LDF.EventSummary.eventNumber(event.summary())*4+LDF.EventSummary.tag(event.summary())
00545     self.eventSize = event.length()
00546     # marker is kept by the lci for access from scripts
00547     self.lci.eventMarker = LDF.EventSummary.marker(event.summary())
00548 
00549   def OSWtime(self, timeStamp, timebase):
00550     ts = LDF.OSWtimeSpec(timeStamp)
00551     gmTime = ts.sec()+1.e-9*ts.nsec()
00552     # get around the sign bit problem
00553     lowerTime = long(timebase.lower())
00554     if lowerTime<0: lowerTime += 0x100000000L-1
00555     upperTime = long(timebase.upper())
00556     if upperTime<0: upperTime += 0x100000000L-1
00557     ppcTime = upperTime<<32 | lowerTime
00558     if self.lci.eventMarker==5:
00559       self.lci.markerPpcTime = ppcTime
00560       self.lci.markerGmTime  = gmTime
00561     # convert to seconds since marker for ntuple
00562     # at 64 bits don't have to worry about rolling over...
00563     dtPpc = 0.
00564     if self.lci.prevPpcTime!=0:
00565       dtPpc = ppcTime - self.lci.prevPpcTime
00566     dtPpcInSec = (1.*dtPpc)/20.e6
00567     ppcTimeInSec = 1.*(ppcTime - self.lci.markerPpcTime)/20.e6
00568     gmTimeInSec  = 1.*(gmTime - self.lci.markerGmTime)
00569     self.lci.ppcTimeInSec = ppcTimeInSec
00570     if 'osw_time' in self.lci.ntDict:
00571       cRow = [self.eventNumber,self.eventSize,dtPpcInSec,gmTimeInSec,ppcTimeInSec]
00572       cNt = self.lci.ntDict['osw_time']
00573       cNt.addRow(cRow)
00574     self.lci.prevPpcTime = ppcTime
00575     self.lci.prevGmTime  = gmTime
00576     return 0
00577 
00578   def OSW_UDF(self, event, contribution):
00579     return 0
00580 
00581 class DIAGcontributionIterator(LDF.DIAGcontributionIterator):
00582   __gtccEndMap    = [0,1,1,0,1,0,0,1]
00583   __gtccLayerStart= [0,0,1,1,3,3,2,2]
00584   def __init__(self,event,contribution,dataStart,lci):
00585     LDF.DIAGcontributionIterator.__init__(self,event,contribution)
00586     self.offset(dataStart)  # Set the start of the diagnostic data
00587     self.lci=lci
00588 
00589   def CALdiag(self, tower, layer, diag):
00590     if 'cal_lac' in self.lci.ntDict:
00591       cNt = self.lci.ntDict['cal_lac']
00592       for column in range(12):
00593         for end in range(2):
00594           lac = (diag.logAccepts(end)>>column)&0x1
00595           if lac:
00596             realEnd = (end+1)%2
00597             chanIndex = tower*8*12*2 + layer*12*2 + column*2 + realEnd
00598             cRow = [tower,layer,column,realEnd,lac,chanIndex,self.lci.ppcTimeInSec]
00599             cNt.addRow(cRow)
00600     if 'cal_trig' in self.lci.ntDict:
00601       cNt = self.lci.ntDict['cal_trig']
00602       for end in range(2):
00603         le = diag.low(end)
00604         he = diag.high(end)
00605         if le or he:
00606           realEnd = (end+1)%2
00607           chanIndex = tower*8*2 + layer*2 + realEnd
00608           cRow = [tower,layer,realEnd,le,he,chanIndex,self.lci.ppcTimeInSec]
00609           cNt.addRow(cRow)
00610     return 0
00611 
00612   def TKRdiag(self, tower, gtcc, diag):
00613     if 'tkr_trig' in self.lci.ntDict:
00614       cNt = self.lci.ntDict['tkr_trig']
00615       for gtrc in range(9):
00616         if (diag.datum()>>gtrc)&0x1:
00617           layer = self.__gtccLayerStart[gtcc]+4*gtrc
00618           end = self.__gtccEndMap[gtcc]
00619           chanIndex = tower*36*2+layer*2+end
00620           cRow = [tower,layer,end,chanIndex,self.lci.ppcTimeInSec]
00621           cNt.addRow(cRow)
00622     return 0
00623 
00624 class GEMcontribution(object):
00625   def __init__(self, event, contribution,lci):
00626     self.lci = lci
00627     self.__event        = event
00628     self.__contribution = contribution
00629 
00630   def __getattr__(self, attr):
00631     """This method fakes up inheritance from an LDF.GEMcontribution.
00632     When a called method can not be found to belong to this class, this
00633     method is called.  We use it to redirect the call to the 'base' class.
00634     """
00635     return getattr(self.__contribution, attr)
00636 
00637   def fill(self, prefix = ""):
00638     tl  = self.tileList()
00639     dtCalc = self.triggerTime()-self.lci.prevGemTime
00640     if (self.triggerTime()<self.lci.prevGemTime):
00641       # it rolled (happens every 1.7 seconds)
00642       dtCalc += 1<<25
00643     dtCalcInSec = dtCalc/20.e6
00644     gemTimeInSec = dtCalcInSec+self.lci.gemTimeInSec+dtCalcInSec
00645     dtRegInSec = self.deltaEventTime()/20.e6
00646     if 'gem_event' in self.lci.ntDict:
00647       livetimeInSec = self.liveTime()/20.e6
00648       prescale = self.prescaled()
00649       discarded = self.discarded()
00650       send = self.sent()
00651       numberTiles = 0
00652       for tileIndex in range(16):
00653         if (tl.XZM()>>tileIndex)&0x1: numberTiles+=1
00654         if (tl.XZP()>>tileIndex)&0x1: numberTiles+=1
00655         if (tl.YZM()>>tileIndex)&0x1: numberTiles+=1
00656         if (tl.YZP()>>tileIndex)&0x1: numberTiles+=1
00657       for tileIndex in range(25):
00658         if (tl.XY()>>tileIndex)&0x1: numberTiles+=1
00659       for tileIndex in range(8):
00660         if (tl.RBN()>>tileIndex)&0x1: numberTiles+=1
00661       for tileIndex in range(11):
00662         if (tl.NA()>>tileIndex)&0x1: numberTiles+=1
00663       cNt = self.lci.ntDict['gem_event']
00664       cRow = [dtRegInSec,dtCalcInSec,self.conditionSummary(),numberTiles,livetimeInSec,gemTimeInSec,prescale,discarded,send,self.lci.ppcTimeInSec]
00665       cNt.addRow(cRow)
00666     if 'gem_input' in self.lci.ntDict:
00667       cNt = self.lci.ntDict['gem_input']
00668       cRow = [self.cnoVector(),tl.XY(),tl.XZM(),tl.XZP(),tl.YZM(),tl.YZP(),tl.RBN(),tl.NA(),self.roiVector(),self.tkrVector(),self.calLEvector(),self.calHEvector(),self.lci.ppcTimeInSec]
00669       cNt.addRow(cRow)
00670     self.lci.prevGemTime = self.triggerTime()
00671     self.lci.gemTimeInSec = gemTimeInSec
00672     
00673 class LATcontributionIterator(LDF.LDBI_LATcontributionIterator):
00674   def __init__(self, eei):
00675     LDF.LDBI_LATcontributionIterator.__init__(self, eei)
00676     self.__udfDict = {}
00677     
00678   #def EBF(self, start, end):          # Use the default
00679   #  return status
00680   
00681   def UDF(self, start, end):
00682     # the raw data is a string with comma separated key=value pairs
00683     udfString = str(start.rawData())
00684     # strip null characters
00685     import string
00686     udfString = string.strip(udfString,'\000')
00687 
00688     # now split and see what you get
00689     udfList = string.split(udfString,',')
00690     for udfItem in udfList:
00691       udfSplitItem = string.split(udfItem,'=')
00692       if len(udfSplitItem) == 2:
00693         udfKey = string.strip(udfSplitItem[0])
00694         string.strip(udfSplitItem[1])
00695         udfValue = udfSplitItem[1]
00696         self.__udfDict[udfKey] = udfValue
00697     return 0
00698 
00699   def getUdfDict(self):
00700     return self.__udfDict
00701 
00702   def clearUdfDict(self):
00703     self.__udfDict.clear()
00704 
00705 class EBFeventIterator(LDF.LDBI_EBFeventIterator):
00706   def __init__(self, lci):
00707     LDF.LDBI_EBFeventIterator.__init__(self, lci)
00708     self.__lci = lci
00709     
00710   def process(self, evt):
00711     self.__lci.iterate(evt)
00712     return self.__lci.status()
00713 
00714 
00715 def hexdump( chars, sep, width ):
00716   while chars:
00717     line = chars[0:width]
00718     chars = chars[width:]
00719     line = line + '\000' * (width - len(line))
00720     print "%s%s%s" % ( sep.join( map( lambda c: "%02x" % ord(c), line )),sep, quotechars( line ))
00721      
00722 
00723 def quotechars( chars ):
00724   return ''.join( map( lambda c: ['.', c][c.isalnum()], chars ))

Generated on Fri Jul 21 13:26:32 2006 for LATTE R04-12-00 by doxygen 1.4.3