119 """ Calculate the integrated luminosity for a list of LBs, returning
120 a lumiResult object"""
123 if triggerlevel
is None:
return None
130 folderLBCOUNTL1=self.
cooldb.getFolder(
'/TRIGGER/LUMI/LVL1COUNTERS')
131 folderLBCOUNTHLT=self.
cooldb.getFolder(
'/TRIGGER/LUMI/HLTCOUNTERS')
132 folderL1PRESCALE=self.
cooldb.getFolder(
'/TRIGGER/LVL1/Prescales')
134 for lbinfo
in lblist:
135 if (self.
loglevel>0):
print(
"Beginning calculation for",lbinfo)
137 runstat,chainnums,hltprescale=self.
_getChains(lbinfo.run,triggername,triggerlevel)
138 if (self.
loglevel>1):
print(
"L1/2/3 chain numbers",chainnums[0],chainnums[1],chainnums[2])
140 since,until=lbinfo.IOVRange()
147 gooddetstatus=RangeList(since,until)
149 if (self.
loglevel>0):
print(
"LumiB L1-Acc L2-Acc L3-Acc L1-pre L2-pre L3-pre LiveTime IntL/nb-1")
152 itr=folderL1PRESCALE.browseObjects(since,until-1,cool.ChannelSelection(chainnums[0]))
153 while (itr.goToNext()):
155 l1precache.add(obj.since(),obj.until(),obj.payload()[
'Lvl1Prescale'])
164 l1countitr=folderLBCOUNTL1.browseObjects(since,until-1,cool.ChannelSelection(chainnums[0]))
166 l2countitr=folderLBCOUNTHLT.browseObjects(since,until-1,cool.ChannelSelection(chainnums[1]))
168 l3countitr=folderLBCOUNTHLT.browseObjects(since,until-1,cool.ChannelSelection(chainnums[2]))
169 while l1countitr.goToNext():
171 l1countobj=l1countitr.currentRef()
172 lb=l1countobj.since() & 0xFFFFFFFF
173 l1payload=l1countobj.payload()
174 l1acc=l1payload[
'L1Accept']
177 if (l1payload[
'AfterPrescale']>0):
178 livefrac=float(l1payload[
'L1Accept'])/float(l1payload[
'AfterPrescale'])
183 l2countitr.goToNext()
184 l2countobj=l2countitr.currentRef()
185 if (l2countobj.since()!=l1countobj.since()):
186 raise RuntimeError(
"L2/L1 counter synchronisation error")
187 l2payload=l2countobj.payload()
188 l2acc=l2payload[
'HLTAccept']
193 l3countitr.goToNext()
194 l3countobj=l3countitr.currentRef()
195 if (l3countobj.since()!=l1countobj.since()):
196 raise RuntimeError(
"L3/L1 counter synchronisation error")
197 l3payload=l3countobj.payload()
198 l3acc=l3payload[
'HLTAccept']
201 if (len(gooddetstatus.getAllowedRanges(l1countobj.since(),l1countobj.until()))>0):
206 (lumi,deltat)=lumicache.find(l1countobj.since())
207 l1prescale=l1precache.find(l1countobj.since())
208 if (lumi
is not None and l1prescale
is not None):
211 livetime=livefrac*deltat
212 intlumi=(lumi*livetime)/float(l1prescale*hltprescale[0]*hltprescale[1])
213 if (self.
loglevel>1):
print(
"%5i %7i %7i %7i %8i %8i %8i %8.2f %10.1f" % (lb,l1acc,l2acc,l3acc,l1prescale,hltprescale[0],hltprescale[1],livetime,intlumi))
216 print(
"%5i %7i %7i %7i <missing prescale or lumi>" %(lb,l1acc,l2acc,l3acc))
228 print(
"Trigger not defined for run",lbinfo.run)
229 if (self.
loglevel>0):
print(
"Rng-T %7i %7i %7i %8.2f %10.1f" % (totalacc[0],totalacc[1],totalacc[2],totaltime,totalL))
230 return lumiResult(totalL,totalacc[0],totalacc[1],totalacc[2],totaltime,totalgoodblock,totalbadblock)
242 """Returns the trigger chain numbers for the specified trigger in this
243 run, which are used as the channel indexes for the LVL1/Prescale
244 and LUMI/LVL1COUNTERS and HLTCOUNTERS folders"""
245 if (self.
loglevel>1):
print(
"Get chain numbers for run",run,triggername,
"level",triggerlevel)
252 if (triggerlevel==3):
254 l3chain,l3prescale,lvl2name=self.
_getHLTChain(run,lvl3name,3)
258 l2chain,l2prescale,lvl1name=self.
_getHLTChain(run,lvl2name,2)
259 if (l2chain==-1): badrun=
True
260 elif (triggerlevel==2):
262 l2chain,l2prescale,lvl1name=self.
_getHLTChain(run,lvl2name,2)
263 if (l2chain==-1): badrun=
True
268 l1menu=self.
cooldb.getFolder(
"/TRIGGER/LVL1/Menu")
270 itr=l1menu.browseObjects(since,until-1,cool.ChannelSelection.all())
271 while itr.goToNext():
273 if (obj.payload()[
'ItemName']==lvl1name):
274 l1chain=obj.channelId()
277 print(
"LVL1 trigger %s not defined for run %i" % (lvl1name,run))
280 return (
not badrun,(l1chain,l2chain,l3chain),(l2prescale,l3prescale))