ATLAS Offline Software
CoolDataReader.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
2 
3 #
4 # CoolDataReader
5 #
6 # Eric Torrence - October 2010
7 #
8 # Contents:
9 # CoolDataReader - utility object to handle reading of COOL DB folders.
10 # The benefit over just using AtlCoolLib directly is that each DB connection is
11 # cached, so multiple connections to the same DB will not be made.
12 #
13 # CoolDataReader.readData() returns a list the full IObject for maximal flexibility
14 #
15 # General usage example
16 # myReader = CoolDataReader('COOLONL_TRIGGER/COMP200', '/TRIGGER/LUMI/LBLESTONL')
17 # myReader.setIOVRange(startIOV, endIOV)
18 # myReader.readData()
19 # for obj in myReader.data:
20 # ...
21 #
22 # One can specify specific channels or IOV ranges if desired, but by default all data will be loaded
23 #
24 # The CoolDataReader uses the LumiDBHandler internally to cache multiple CoolConnections
25 #
26 
27 from __future__ import print_function
28 from PyCool import cool
29 
30 # Get our global DB handler object
31 from CoolLumiUtilities.LumiDBHandler import LumiDBHandler
32 
33 
35 
36  def __init__(self, dbstr=None, folderstr=None):
37 
38  self.verbose = False
39 
40  # Defined variables
41  self.dbstr = None
42  self.folderstr = None
43  self.channelIdList = []
44  self.tag = ''
45  self.iovstart = None
46  self.iovend = None
47 
48  self.folder = None
49  self.data = []
50 
51  # Initialize to default values
52  self.setChannel()
53  self.setTag()
54  self.setFolder(dbstr, folderstr)
55  self.setIOVRange()
56 
57  def setFolder(self, dbstr, folderstr):
58  # Force re-opening connection if these are different
59  if (dbstr != self.dbstr) or (folderstr != self.folderstr):
60  self.folder = None
61 
62  self.dbstr = dbstr
63  self.folderstr = folderstr
64 
65  def setTag(self, tagstr=''):
66  self.tag = tagstr
67 
68  def setChannel(self, channelIdList=[]):
69  self.channelIdList = channelIdList
70 
71  def setChannelAll(self):
72  self.setChannel()
73 
74  def setChannelId(self, channelId):
75  self.setChannel([channelId])
76 
77  def setIOVRange(self, iovstart=cool.ValidityKeyMin, iovend=cool.ValidityKeyMax):
78  self.iovstart = iovstart
79  self.iovend = iovend
80 
81  def setIOVRangeFromRun(self, runnum):
82  self.iovstart = runnum << 32
83  self.iovend = ((runnum+1) << 32) - 1
84 
85  # Call to get data after all other parameters are properly set
86  # Data is returned as a list of IObject values, one per DB entry.
87  # This gives maximal flexibility to manipulate the items
88  def readData(self):
89 
90  self.data = []
91 
92  # Open the DB connection here if needed
93  if self.folder is None:
94  dbHandler = LumiDBHandler()
95  self.folder = dbHandler.getFolder(self.dbstr, self.folderstr)
96 
97  if self.folder is None:
98  print("Can't access DB", self.dbstr, 'folder', self.folderstr, '!')
99  return self.data
100 
101  # Create the channel list
102  if len(self.channelIdList) == 0:
103  channels = cool.ChannelSelection.all()
104  self.readChannelList(channels)
105 
106  else:
107  # Build the channel list here
108  self.channelIdList.sort() # Must be sorted!
109 
110  # Must read channels 50 at a time due to COOL limit...
111  ichan = 0
112  while (ichan < len(self.channelIdList)) :
113 
114  jchan = 0
115  channels = None
116  firstChan = True
117 
118  for channelId in self.channelIdList[ichan:]:
119  jchan += 1
120  if firstChan:
121  firstChan = False
122  channels = cool.ChannelSelection(channelId)
123  else:
124  channels.addChannel(channelId)
125  if jchan == 50: break
126 
127  # Remeber how many we have read for next time
128  if self.verbose:
129  print('CoolDataReader.readData() - loaded %d channels from %d' % (jchan, ichan))
130  ichan += jchan
131 
132  if self.verbose:
133  print('CoolDataReader.readData() - browsing', self.iovstart, self.iovend, 'with channel', channels, 'and tag', self.tag)
134 
135  self.readChannelList(channels)
136 
137  # End of loop building channel list and reading
138 
139  # End of if statement reading data
140  return self.data
141 
142  def readChannelList(self, channels):
143 
144  # Open iterator over our defined IOV range
145  try:
146  itr = self.folder.browseObjects(self.iovstart, self.iovend, channels, self.tag)
147  except Exception as e:
148  print('CoolDataReader.readData() - exception reading folder:', self.folderstr)
149  print(e)
150  print('CoolDataReader.readData() - will try to reconnect (once)')
151 
152  # Force re-opening connection
153  dbHandler = LumiDBHandler()
154  dbHandler.verbose = True
155  self.folder = dbHandler.getFolder(self.dbstr, self.folderstr, force=True)
156 
157  if self.folder is None:
158  print('CoolDataReader.readData() - forced re-opening failed!')
159  return self.data
160 
161  # OK, lets try reading this again
162  print('CoolDataReader.readData() - trying to re-read re-opened folder!')
163  try:
164  itr = self.folder.browseObjects(self.iovstart, self.iovend, channels, self.tag)
165  except Exception as e:
166  print('CoolDataReader.readData() - exception reading folder:', self.folderstr)
167  print(e)
168  return self.data
169 
170  while itr.goToNext():
171  obj = itr.currentRef()
172  # print obj.payload()
173  self.data.append(obj.clone())
174 
175  itr.close()
176 
177 
178 
python.CoolDataReader.CoolDataReader.dbstr
dbstr
Definition: CoolDataReader.py:41
python.CoolDataReader.CoolDataReader.readChannelList
def readChannelList(self, channels)
Definition: CoolDataReader.py:142
python.CoolDataReader.CoolDataReader.iovstart
iovstart
Definition: CoolDataReader.py:45
python.CoolDataReader.CoolDataReader.setChannel
def setChannel(self, channelIdList=[])
Definition: CoolDataReader.py:68
dumpHVPathFromNtuple.append
bool append
Definition: dumpHVPathFromNtuple.py:91
python.CoolDataReader.CoolDataReader.folder
folder
Definition: CoolDataReader.py:48
python.CoolDataReader.CoolDataReader.setFolder
def setFolder(self, dbstr, folderstr)
Definition: CoolDataReader.py:57
python.CoolDataReader.CoolDataReader.setIOVRangeFromRun
def setIOVRangeFromRun(self, runnum)
Definition: CoolDataReader.py:81
python.CoolDataReader.CoolDataReader
Definition: CoolDataReader.py:34
python.CoolDataReader.CoolDataReader.data
data
Definition: CoolDataReader.py:49
python.CoolDataReader.CoolDataReader.folderstr
folderstr
Definition: CoolDataReader.py:42
python.CoolDataReader.CoolDataReader.setChannelAll
def setChannelAll(self)
Definition: CoolDataReader.py:71
python.CoolDataReader.CoolDataReader.iovend
iovend
Definition: CoolDataReader.py:46
python.CoolDataReader.CoolDataReader.setTag
def setTag(self, tagstr='')
Definition: CoolDataReader.py:65
python.CoolDataReader.CoolDataReader.setIOVRange
def setIOVRange(self, iovstart=cool.ValidityKeyMin, iovend=cool.ValidityKeyMax)
Definition: CoolDataReader.py:77
python.CoolDataReader.CoolDataReader.readData
def readData(self)
Definition: CoolDataReader.py:88
Muon::print
std::string print(const MuPatSegment &)
Definition: MuonTrackSteering.cxx:28
python.CoolDataReader.CoolDataReader.__init__
def __init__(self, dbstr=None, folderstr=None)
Definition: CoolDataReader.py:36
python.CoolDataReader.CoolDataReader.verbose
verbose
Definition: CoolDataReader.py:38
python.CoolDataReader.CoolDataReader.tag
tag
Definition: CoolDataReader.py:44
python.CoolDataReader.CoolDataReader.setChannelId
def setChannelId(self, channelId)
Definition: CoolDataReader.py:74
python.CoolDataReader.CoolDataReader.channelIdList
channelIdList
Definition: CoolDataReader.py:43