ATLAS Offline Software
LumiDeadtimeHandler.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 # Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
4 #
5 # LumiDeadtimeHandler
6 #
7 # Eric Torrence - June 2011
8 #
9 # Contents:
10 #
11 # LumiDeadtimeHandler - function to determine L1 deadtime from trigger information
12 #
13 
14 # Get our global DB handler object
15 from CoolLumiUtilities.CoolDataReader import CoolDataReader
16 
17 from CoolLumiUtilities.LumiBlobConversion import unpackLiveFraction
18 
20 
21  # Constructor
22  def __init__(self):
23 
24  self.verbose = False
25 
26  # Data readers
27  self.vetoReader = None
28  self.menuReader = None
29  self.countsReader = None
30 
31  # Trigger channels to read for live fractions
32  self.trigList=['L1_EM30']
33 
34  # Storage of per-BCID deadtime (index by [runlb][bcid])
35  self.liveFracBCID = dict()
36 
37  # Storage of L1 trigger counts deadtime (index by [runlb][trigname])
38  self.liveFracTrig = dict()
39 
40  # Storage for L1 trigger name -> value mapping
41  self.trigChan = dict()
42 
43  def calculateAll(self, run):
44  self.loadData(run)
45  self.findBCIDDeadtime()
46 
47  def loadData(self, run):
48  self.loadVetoData(run)
49  self.loadTrigChannels(run)
50  self.loadTrigCounts(run)
51 
52  def loadVetoData(self, run):
53  if self.verbose: print('Loading trigger veto data')
54 
55  # Instantiate new COOL data reader if not already done
56  if self.vetoReader is None:
57  self.vetoReader = CoolDataReader('COOLONL_TRIGGER/COMP200', '/TRIGGER/LUMI/PerBcidDeadtime')
58 
59  self.vetoReader.setIOVRangeFromRun(run)
60  self.vetoReader.readData()
61 
62  if self.verbose:
63  print('Read %d Trig veto records' % len(self.vetoReader.data))
64 
65  # Read trigger channel mappings
66  # Fills self.trigChan based on values in self.trigList
67  def loadTrigChannels(self, run):
68  if self.verbose: print('Loading trigger channel data')
69 
70  self.trigChan = dict()
71  for trig in self.trigList:
72  self.trigChan[trig] = -1
73 
74  if self.menuReader is None:
75  self.menuReader = CoolDataReader('COOLONL_TRIGGER/COMP200', '/TRIGGER/LVL1/Menu')
76 
77  self.menuReader.setIOVRangeFromRun(run)
78  self.menuReader.readData()
79 
80  for obj in self.menuReader.data:
81  trigName = obj.payload()['ItemName']
82  if trigName in self.trigList:
83  self.trigChan[trigName] = int(obj.channelId())
84 
85  for trig in self.trigList:
86  if self.trigChan[trig] == -1:
87  print("Couldn't find", trig, "in run", run)
88 
89  if self.verbose:
90  print('Found', trig, 'in channel', self.trigChan[trig])
91 
92 
93  # Load all trigger counts for the given run
94  # Fills counts for all triggers with channels found in self.trigChan
95  def loadTrigCounts(self, run):
96 
97  if self.verbose:
98  print('loading Trigger Counts data')
99 
100  self.liveFracTrig = dict()
101 
102  if self.countsReader is None:
103  self.countsReader = CoolDataReader('COOLONL_TRIGGER/COMP200', '/TRIGGER/LUMI/LVL1COUNTERS')
104 
105  self.countsReader.setIOVRangeFromRun(run)
106 
107  # Build channel list
108  chanList = self.trigChan.values()
109  chanList.sort()
110 
111  # Skip any trigger we didn't find
112  tmpList = []
113  for chan in chanList:
114  if chan < 0: continue
115  tmpList.append( chan )
116  chanList = tmpList
117 
118  self.countsReader.setChannel(chanList)
119  self.countsReader.readData()
120 
121  for obj in self.countsReader.data:
122 
123  #if self.verbose:
124  # print obj.since()>>32, '/', obj.since()&0xFFFFFFFF, obj.channelId(), obj.payload()['BeforePrescale'], obj.payload()['AfterPrescale'], obj.payload()['L1Accept']
125 
126  # use the string as the dictionary key
127  ss = obj.since()
128 
129  if ss not in self.liveFracTrig:
130  self.liveFracTrig[ss] = dict()
131 
132  for (trig, chan) in self.trigChan.iteritems():
133  if chan != obj.channelId(): continue
134 
135  ratio = 0.
136  if obj.payload()['AfterPrescale'] > 0:
137  ratio = float(obj.payload()['L1Accept'])/obj.payload()['AfterPrescale']
138 
139  self.liveFracTrig[ss][trig] = ratio
140 
141  if self.verbose:
142  print(obj.since()>>32, '/', obj.since()&0xFFFFFFFF, trig, ratio)
143 
144  def findBCIDDeadtime(self):
145  if self.verbose: print('Calculating per-BCID deadtime')
146 
147  # First dictionary index is lumiblock IOV
148  self.liveFracBCID = dict()
149 
150  # Loop over each lumi block
151  for obj in self.vetoReader.data:
152 
153  key = obj.since()
154 
155  if self.verbose:
156  run = key >> 32
157  lb = key & 0xFFFFFFFF
158  bloblength = obj.payload()['HighPriority'].size()
159  print('%d %d Found trigger counter blob of length %d' % (run, lb, bloblength))
160 
161  # Unpack High Priority blob here
162  liveVec = unpackLiveFraction(obj.payload())
163  self.liveFracBCID[key] = liveVec
164 
165  # Each BCID is one 24-bit integer
166  #if self.verbose:
167  #
168  # for i in range(10):
169  # print('BICD: %d Live: %f' % (i+1, liveVec[i]))
170 
171 
172 if __name__ == '__main__':
174  odh.loadData(183128)
175  odh.findBCIDDeadtime()
176 
python.LumiBlobConversion.unpackLiveFraction
def unpackLiveFraction(trigPayload, priority='high')
Definition: LumiBlobConversion.py:269
python.Bindings.iteritems
iteritems
Definition: Control/AthenaPython/python/Bindings.py:823
python.LumiDeadtimeHandler.LumiDeadtimeHandler.trigList
trigList
Definition: LumiDeadtimeHandler.py:32
python.LumiDeadtimeHandler.LumiDeadtimeHandler.__init__
def __init__(self)
Definition: LumiDeadtimeHandler.py:22
python.LumiDeadtimeHandler.LumiDeadtimeHandler.vetoReader
vetoReader
Definition: LumiDeadtimeHandler.py:27
python.LumiDeadtimeHandler.LumiDeadtimeHandler.liveFracBCID
liveFracBCID
Definition: LumiDeadtimeHandler.py:35
python.LumiDeadtimeHandler.LumiDeadtimeHandler.calculateAll
def calculateAll(self, run)
Definition: LumiDeadtimeHandler.py:43
python.Bindings.values
values
Definition: Control/AthenaPython/python/Bindings.py:808
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
python.LumiDeadtimeHandler.LumiDeadtimeHandler.loadData
def loadData(self, run)
Definition: LumiDeadtimeHandler.py:47
python.LumiDeadtimeHandler.LumiDeadtimeHandler.liveFracTrig
liveFracTrig
Definition: LumiDeadtimeHandler.py:38
python.LumiDeadtimeHandler.LumiDeadtimeHandler.loadTrigChannels
def loadTrigChannels(self, run)
Definition: LumiDeadtimeHandler.py:67
python.LumiDeadtimeHandler.LumiDeadtimeHandler.verbose
verbose
Definition: LumiDeadtimeHandler.py:24
python.LumiDeadtimeHandler.LumiDeadtimeHandler.countsReader
countsReader
Definition: LumiDeadtimeHandler.py:29
print
void print(char *figname, TCanvas *c1)
Definition: TRTCalib_StrawStatusPlots.cxx:25
python.LumiDeadtimeHandler.LumiDeadtimeHandler
Definition: LumiDeadtimeHandler.py:19
python.LumiDeadtimeHandler.LumiDeadtimeHandler.trigChan
trigChan
Definition: LumiDeadtimeHandler.py:41
python.CaloAddPedShiftConfig.int
int
Definition: CaloAddPedShiftConfig.py:45
python.LumiDeadtimeHandler.LumiDeadtimeHandler.menuReader
menuReader
Definition: LumiDeadtimeHandler.py:28
python.LumiDeadtimeHandler.LumiDeadtimeHandler.findBCIDDeadtime
def findBCIDDeadtime(self)
Definition: LumiDeadtimeHandler.py:144
python.LumiDeadtimeHandler.LumiDeadtimeHandler.loadVetoData
def loadVetoData(self, run)
Definition: LumiDeadtimeHandler.py:52
python.LArMinBiasAlgConfig.float
float
Definition: LArMinBiasAlgConfig.py:65
python.LumiDeadtimeHandler.LumiDeadtimeHandler.loadTrigCounts
def loadTrigCounts(self, run)
Definition: LumiDeadtimeHandler.py:95