ATLAS Offline Software
StandaloneBunchgroupHandler.py
Go to the documentation of this file.
1 #!/bin/env python
2 
3 # Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
4 #
5 # BunchgroupHandler
6 #
7 # David Berge - October 2010
8 #
9 # Contents:
10 # BunchgroupHandler - utility tool to access bunch-group information from COOL
11 #
12 
13 from builtins import object
14 import sys
15 
16 from PyCool import cool
17 from CoolConvUtilities.AtlCoolLib import indirectOpen
18 
20 
21  def __init__(self,run):
22 
23  self.run = run
24  # physics bunch group BCIDs, keyed by LB
26  # BCID lookup, keyed by LB
27  self.bcidLookupBefore = {}
28  # BCID lookup, keyed by LB
29  self.bcidLookupAfter = {}
30  # LB lookup
31  self.lbLookup = {}
32 
33  self.verbose = False
34 
35  def createLookup(self,lb,bcidRange):
36  if self.verbose:
37  print("createLookup called")
38  self.bcidLookupBefore[lb] = []
39  self.bcidLookupAfter[lb] = []
40  for bcid in range(3564):
41  bcidListBefore = []
42  bcidListAfter = []
43  for offset in range(1,bcidRange+1):
44  checkBcid = bcid + offset
45  if checkBcid > 3563:
46  checkBcid -= 3564
47  if checkBcid in self.physicsBunchgroupBcids[lb]:
48  bcidListAfter.append(1)
49  else:
50  bcidListAfter.append(0)
51  self.bcidLookupAfter[lb].append(bcidListAfter)
52 
53  for offset in range(1,bcidRange+1):
54  checkBcid = bcid - offset
55  if checkBcid < 0:
56  checkBcid += 3564
57  if checkBcid in self.physicsBunchgroupBcids[lb]:
58  bcidListBefore.append(1)
59  else:
60  bcidListBefore.append(0)
61  self.bcidLookupBefore[lb].append(bcidListBefore)
62 
63  if self.verbose:
64  print("Bg run data, Run",self.run,"LB",lb)
65  for bcid in range(3564):
66  print("BCID",bcid,"before",self.bcidLookupBefore[lb][bcid])
67  print("BCID",bcid,"after",self.bcidLookupAfter[lb][bcid])
68 
70 
71  def __init__(self):
72 
73  # Database parameters
74  self.trigProdDbName = 'COOLONL_TRIGGER/COMP200'
75  self.bunchGroupContentFolder = '/TRIGGER/LVL1/BunchGroupContent'
76  self.bunchGroupDescFolder = '/TRIGGER/LVL1/BunchGroupDescription'
77 
78  # Database handle
79  self.trigProdDb = None
80 
81  # self.verbose = False
82  self.verbose = True
83 
84  # set physics bunch group
86 
87  # run objects
88  self.runObjects = dict()
89 
90  # remember how many runs we have, keep only runsToArchive in memory
91  self.runArchive = []
92  # number of runs we keep in memory
93  self.runsToArchive = 20
94 
95  # BCID range
96  self.bcidRange = 32
97 
98  def openDB(self):
99  # Open the trigger COOL database
100  try:
101  self.trigProdDb = indirectOpen(self.trigProdDbName, True, False)
102  if self.verbose: print('Connected to', self.trigProdDbName, 'for Trigger data')
103  except Exception as e:
104  print(e)
105  return False
106  return True
107 
108  def closeDB(self):
109  # Close the database
110  if self.trigProdDb is not None:
111  self.trigProdDb.closeDatabase()
112  self.trigProdDb = None
113 
114  def loadRunData(self, run):
115  self.openDB()
116  self.loadBunchgroups(run)
117  self.closeDB()
118  if len(self.runArchive) > self.runsToArchive:
119  if self.verbose:
120  print("Remove run",self.runArchive[0],"from memory")
121  del self.runObjects[self.runArchive[0]]
122  self.runArchive.pop(0)
123 
124  def loadBunchgroups(self, run):
125 
126  self.runObjects[run] = BunchgroupRunData(run)
127  self.runArchive.append(run)
128  self.runObjects[run].verbose = self.verbose
129 
130  if self.verbose:
131  print('loadBounchgroups called, run',run)
132 
133  bgFolder = self.trigProdDb.getFolder(self.bunchGroupContentFolder)
134  itr = bgFolder.browseObjects(run << 32,(run+1) << 32,cool.ChannelSelection.all())
135  while itr.goToNext() :
136  obj=itr.currentRef()
137  lb=(obj.since() & 0xffff)
138  self.runObjects[run].physicsBunchgroupBcids[lb] = []
139  bgcont = obj.payload()['BunchCode']
140  for bcid in range(3564):
141  if(bgcont[bcid]>>self.physicsBunchgroupBit & 1): self.runObjects[run].physicsBunchgroupBcids[lb].append(bcid)
142  self.runObjects[run].createLookup(lb,self.bcidRange)
143  if self.verbose:
144  print("LB",lb,"BCIDs",self.runObjects[run].physicsBunchgroupBcids[lb])
145 
146  def getTrainPosition(self,run,lb,bcid):
147 
148  if self.verbose:
149  print('getTrainPosition called')
150  before, after = self.getNeighbourBcids(run,lb,bcid)
151  return (len(before)+1)
152 
153  def getNeighbourBcids(self,run,lb,bcid):
154 
155  if self.verbose:
156  print('getNeighbourBcids called')
157 
158  before, after = self.getNeighbourPattern(run,lb,bcid)
159 
160  l1 = []
161  for bcidOffset in range(len(before)):
162  checkBcid = bcid - (bcidOffset+1)
163  if checkBcid < 0: checkBcid += 3564
164  if before[bcidOffset]:
165  if self.verbose:
166  print("BCID",checkBcid,"is filled")
167  l1.append(checkBcid)
168  l2 = []
169  for bcidOffset in range(len(after)):
170  checkBcid = bcid + (bcidOffset+1)
171  if checkBcid > 3563: checkBcid -= 3564
172  if after[bcidOffset]:
173  if self.verbose:
174  print("BCID",checkBcid,"is filled")
175  l2.append(checkBcid)
176  return l1, l2
177 
178 
179  def getNeighbourPattern(self,run,lb,bcid):
180 
181  if self.verbose:
182  print('getNeighbourPattern called')
183 
184  lbList = []
185  try:
186  lbList = list(self.runObjects[run].physicsBunchgroupBcids.keys())
187  except KeyError:
188  self.loadRunData(run)
189  lbList = list(self.runObjects[run].physicsBunchgroupBcids.keys())
190 
191  latestLb = -1
192  try:
193  latestLb = self.runObjects[run].lbLookup[lb]
194  except KeyError:
195  for testLb in sorted(lbList):
196  if latestLb < 0: latestLb = testLb
197  if lb > testLb: latestLb = testLb
198  if self.verbose:
199  print("LB",lb,"latest LB",latestLb)
200  self.runObjects[run].lbLookup[lb] = latestLb
201 
202  return (self.runObjects[run].bcidLookupBefore[latestLb][bcid], self.runObjects[run].bcidLookupAfter[latestLb][bcid])
203 
204 if __name__ == '__main__':
205 
206  import getopt
207 
208  def usage():
209  print("%s" % sys.argv[0])
210  print(" --help this printout")
211  print(" --run <runNo> run number")
212  print(" --bcid <bcid> BCID")
213  print(" --lb <lb> LB")
214 
215  try:
216  longopts=['run=','bcid=','lb=','help']
217  opts,args=getopt.getopt(sys.argv[1:],'',longopts)
218  except getopt.GetoptError:
219  usage()
220  sys.exit(2)
221 
222  run = -1
223  lb = -1
224  bcid = -1
225 
226  for o,a in opts:
227  if o in ('-h','--help'):
228  usage()
229  sys.exit(0)
230  if o == '--run':
231  run = int(a)
232  if o == '--bcid':
233  bcid = int(a)
234  if o == '--lb':
235  lb = int(a)
236 
237  if (run == -1 or bcid == -1 or lb == -1) :
238  usage()
239  sys.exit(2)
240 
242  bg.verbose = False
243  bg.loadRunData(run)
244 
245  l1, l2 = bg.getNeighbourBcids(run,lb,bcid)
246  print("Run",run,"neighbouring filled BCIDs for BCID",bcid,":",sorted(l1), sorted(l2))
DerivationFramework::TriggerMatchingUtils::sorted
std::vector< typename R::value_type > sorted(const R &r, PROJ proj={})
Helper function to create a sorted vector from an unsorted range.
StandaloneBunchgroupHandler.BunchgroupHandler.__init__
def __init__(self)
Definition: StandaloneBunchgroupHandler.py:71
StandaloneBunchgroupHandler.BunchgroupRunData.verbose
verbose
Definition: StandaloneBunchgroupHandler.py:33
StandaloneBunchgroupHandler.BunchgroupHandler.runObjects
runObjects
Definition: StandaloneBunchgroupHandler.py:88
StandaloneBunchgroupHandler.BunchgroupRunData.physicsBunchgroupBcids
physicsBunchgroupBcids
Definition: StandaloneBunchgroupHandler.py:25
StandaloneBunchgroupHandler.BunchgroupHandler.bunchGroupContentFolder
bunchGroupContentFolder
Definition: StandaloneBunchgroupHandler.py:75
StandaloneBunchgroupHandler.BunchgroupHandler.getNeighbourBcids
def getNeighbourBcids(self, run, lb, bcid)
Definition: StandaloneBunchgroupHandler.py:153
StandaloneBunchgroupHandler.BunchgroupHandler.physicsBunchgroupBit
physicsBunchgroupBit
Definition: StandaloneBunchgroupHandler.py:85
StandaloneBunchgroupHandler.BunchgroupHandler.loadRunData
def loadRunData(self, run)
Definition: StandaloneBunchgroupHandler.py:114
StandaloneBunchgroupHandler.BunchgroupRunData.run
run
Definition: StandaloneBunchgroupHandler.py:23
dumpHVPathFromNtuple.append
bool append
Definition: dumpHVPathFromNtuple.py:91
StandaloneBunchgroupHandler.BunchgroupRunData.lbLookup
lbLookup
Definition: StandaloneBunchgroupHandler.py:31
StandaloneBunchgroupHandler.BunchgroupHandler.trigProdDbName
trigProdDbName
Definition: StandaloneBunchgroupHandler.py:74
StandaloneBunchgroupHandler.BunchgroupHandler.getNeighbourPattern
def getNeighbourPattern(self, run, lb, bcid)
Definition: StandaloneBunchgroupHandler.py:179
StandaloneBunchgroupHandler.BunchgroupHandler.runArchive
runArchive
Definition: StandaloneBunchgroupHandler.py:91
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:194
histSizes.list
def list(name, path='/')
Definition: histSizes.py:38
print
void print(char *figname, TCanvas *c1)
Definition: TRTCalib_StrawStatusPlots.cxx:25
StandaloneBunchgroupHandler.BunchgroupRunData.__init__
def __init__(self, run)
Definition: StandaloneBunchgroupHandler.py:21
StandaloneBunchgroupHandler.BunchgroupHandler
Definition: StandaloneBunchgroupHandler.py:69
StandaloneBunchgroupHandler.BunchgroupRunData.bcidLookupBefore
bcidLookupBefore
Definition: StandaloneBunchgroupHandler.py:27
StandaloneBunchgroupHandler.BunchgroupHandler.getTrainPosition
def getTrainPosition(self, run, lb, bcid)
Definition: StandaloneBunchgroupHandler.py:146
StandaloneBunchgroupHandler.BunchgroupHandler.openDB
def openDB(self)
Definition: StandaloneBunchgroupHandler.py:98
StandaloneBunchgroupHandler.BunchgroupHandler.runsToArchive
runsToArchive
Definition: StandaloneBunchgroupHandler.py:93
python.CaloAddPedShiftConfig.int
int
Definition: CaloAddPedShiftConfig.py:45
StandaloneBunchgroupHandler.BunchgroupHandler.bunchGroupDescFolder
bunchGroupDescFolder
Definition: StandaloneBunchgroupHandler.py:76
StandaloneBunchgroupHandler.BunchgroupRunData.bcidLookupAfter
bcidLookupAfter
Definition: StandaloneBunchgroupHandler.py:29
StandaloneBunchgroupHandler.BunchgroupHandler.closeDB
def closeDB(self)
Definition: StandaloneBunchgroupHandler.py:108
if
if(febId1==febId2)
Definition: LArRodBlockPhysicsV0.cxx:567
StandaloneBunchgroupHandler.usage
def usage()
Definition: StandaloneBunchgroupHandler.py:208
StandaloneBunchgroupHandler.BunchgroupRunData
Definition: StandaloneBunchgroupHandler.py:19
pickleTool.object
object
Definition: pickleTool.py:29
StandaloneBunchgroupHandler.BunchgroupHandler.loadBunchgroups
def loadBunchgroups(self, run)
Definition: StandaloneBunchgroupHandler.py:124
StandaloneBunchgroupHandler.BunchgroupHandler.trigProdDb
trigProdDb
Definition: StandaloneBunchgroupHandler.py:79
StandaloneBunchgroupHandler.BunchgroupHandler.bcidRange
bcidRange
Definition: StandaloneBunchgroupHandler.py:96
StandaloneBunchgroupHandler.BunchgroupHandler.verbose
verbose
Definition: StandaloneBunchgroupHandler.py:82
python.AtlCoolLib.indirectOpen
def indirectOpen(coolstr, readOnly=True, debug=False)
Definition: AtlCoolLib.py:129
StandaloneBunchgroupHandler.BunchgroupRunData.createLookup
def createLookup(self, lb, bcidRange)
Definition: StandaloneBunchgroupHandler.py:35