00001
00002 '''
00003 Usage:
00004 '''
00005
00006 from UserTagging.UserTaggingAlg import UserTaggingAlg
00007 from UserTagging.Models import Tag, Data, Int, Float, IntArray, FloatArray
00008 from GaudiPython import SUCCESS, FAILURE
00009 from GaudiPython import gbl
00010
00011 class ADChannelData(UserTaggingAlg):
00012 '''Add AD Channel Stats to UserData'''
00013
00014
00015 def initTagList(self):
00016
00017
00018
00019
00020
00021 self.addTag('Dummy', ''
00022 ).addData('ADChannelData', '/Event/UserData/AD/ADChannelData'
00023 ).addIntArray('board', 'connector', 'ring', 'column', 'hitCount'
00024 ).addFloatArray('adc0', 'preAdc0', 'charge0', 'tdc0', 'adcMax', 'charge')
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 self.cableSvc = self.svc('ICableSvc','StaticCableSvc')
00045 if self.cableSvc == None:
00046 self.error("Failed to get StaticCableSvc")
00047 return FAILURE
00048
00049
00050
00051 def check(self, evt):
00052 ADTag = evt['/Event/UserTag/Detector/AD']
00053 if not ADTag:
00054 return
00055
00056 readoutHdr = evt['/Event/Readout/ReadoutHeader']
00057 if not readoutHdr:
00058 self.warning('cannot find readoutHdr')
00059 return
00060 self.SaveReadoutData(readoutHdr)
00061
00062 self.tagIt('Dummy')
00063
00064
00065 def SaveReadoutData(self, readoutHdr):
00066
00067 myData = self.getTag('Dummy').getData('ADChannelData')
00068
00069 svcMode = gbl.ServiceMode(readoutHdr.context(), 0)
00070 daqCrate = readoutHdr.daqCrate()
00071 pmtCrate = daqCrate.asPmtCrate();
00072
00073 nChannels = 0
00074 for channel in pmtCrate.channelReadouts():
00075 nChannels += 1
00076 channelId = channel.channelId()
00077 board = channelId.board()
00078 connector = channelId.connector()
00079 pmtId = self.cableSvc.adPmtSensor(channelId, svcMode)
00080 ring = pmtId.ring()
00081 column = pmtId.column()
00082
00083 myData.append('board', board
00084 ).append('connector', connector
00085 ).append('ring', ring
00086 ).append('column', column
00087 ).append('hitCount', channel.hitCount())
00088
00089
00090
00091
00092
00093
00094
00095
00096 adc0 = channel.adc(0)
00097 preAdc0 = channel.preAdcAvg(0)
00098 if channel.isHighGainAdc(0):
00099 charge0 = adc0 - preAdc0
00100 else:
00101 charge0 = (adc0 - preAdc0) * 20
00102 tdc0 = channel.tdc(0)
00103
00104 myData.append('adc0', adc0
00105 ).append('preAdc0', preAdc0
00106 ).append('charge0', charge0
00107 ).append('tdc0', tdc0)
00108
00109 adcMax = adc0
00110 charge = charge0
00111 for i in range(1, channel.hitCount()):
00112 adc = channel.adc(i)
00113 preAdc = channel.preAdcAvg(i)
00114
00115 if channel.isHighGainAdc(i):
00116 if (adc > adcMax): adcMax = adc
00117 charge += (adc - preAdc)
00118 else:
00119 if (adc*20 > adcMax): adcMax = adc*20
00120 charge += (adc - preAdc) * 20
00121
00122 myData.append('adcMax', adcMax
00123 ).append('charge', charge)
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133 def configure(argv=[]):
00134 pass
00135
00136 def run(app):
00137 app.ExtSvc += ["StaticCableSvc"]
00138 myAlg = ADChannelData("UserData::ADChannelData")
00139 app.addAlgorithm(myAlg)
00140 pass