ATLAS Offline Software
Loading...
Searching...
No Matches
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
13from builtins import object
14import sys
15
16from PyCool import cool
17from 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
28 # BCID lookup, keyed by LB
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
204if __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))
if(febId1==febId2)
void print(char *figname, TCanvas *c1)