ATLAS Offline Software
AtlCoolLib.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 # Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
4 # AtlCoolLib.py
5 # module defining utilities for ATLAS command line tool use of COOL
6 # Richard Hawkings, started 5/2/07
7 """
8 Module defining utilities for ATLAS command line/python use of COOL
9 """
10 
11 from __future__ import print_function
12 import sys,os,getopt,time,calendar
13 from PyCool import cool
14 # Work around pyroot issue with long long --- see ATEAM-997.
15 import ROOT
16 ROOT.gInterpreter
17 
18 def transConn(conn):
19  """
20  Translate simple connection string (no slash) to mycool.db with given
21  instance, all others left alone
22  """
23  if ('/' not in conn):
24  return 'sqlite://X;schema=mycool.db;dbname='+conn
25  else:
26  return conn
27 
28 def forceOpen(conn):
29  """
30  Open COOL database with given connection, or force open if not possible
31  Return COOL database object, or None if cannot be opened
32  Database is opened in update mode
33  """
34  dbSvc=cool.DatabaseSvcFactory.databaseService()
35  conn2=transConn(conn)
36  try:
37  db=dbSvc.openDatabase(conn2,False)
38  except Exception as e:
39  print (e)
40  print ('Could not connect to',conn,'try to create it')
41  try:
42  db=dbSvc.createDatabase(conn2)
43  except Exception as e:
44  print (e)
45  print ('Could not create the database - give up')
46  return None
47  return db
48 
49 def readOpen(conn):
50  """
51  Open COOL database with given connection for reading
52  """
53  dbSvc=cool.DatabaseSvcFactory.databaseService()
54  conn2=transConn(conn)
55  try:
56  db=dbSvc.openDatabase(conn2,True)
57  except Exception as e:
58  print (e)
59  print ('Could not connect to',conn)
60  return None
61  return db
62 
63 def ensureFolder(db,folder,spec,desc,version=cool.FolderVersioning.SINGLE_VERSION):
64  """
65  Ensure folder exists, creating it if needed with given spec
66  Return COOL folder object
67  """
68  if (not db.existsFolder(folder)):
69  print ('Attempting to create',folder,'with description',desc)
70  try:
71  # Deprecated/dropped: db.createFolder(folder,spec,desc,version,True)
72  folderSpec = cool.FolderSpecification(version,spec)
73  db.createFolder(folder,folderSpec,desc,True)
74  print ('Folder created')
75  except Exception as e:
76  print (e)
77  print ('Could not create folder',folder)
78  return None
79  return db.getFolder(folder)
80 
81 def athenaDesc(runLumi,datatype):
82  """
83  Return the correct folder description string for Athena IOVDbSVc access
84  runLumi=True or False for timestamp
85  datatype= { AthenaAttributeList | CondAttrListCollection }
86  """
87  if (runLumi):
88  desc='<timeStamp>run-lumi</timeStamp>'
89  else:
90  desc='<timeStamp>time</timeStamp>'
91  stype=71
92  clid=0
93  tname=''
94  if (datatype=='CondAttrListCollection'):
95  clid=1238547719
96  tname='CondAttrListCollection'
97  elif (datatype=='AthenaAttributeList'):
98  clid=40774348
99  tname='AthenaAttributeList'
100  elif (datatype=='CondAttrListVec'):
101  clid=55403898
102  tname='CondAttrListVec'
103 
104  desc+='<addrHeader><address_header service_type=\"'+str(stype)+'\" clid=\"'+str(clid)+'\" /></addrHeader><typeName>'+tname+'</typeName>'
105  return desc
106 
107 def timeVal(val):
108  "Convert argument to time in seconds, treating as a literal or date"
109  try:
110  a=int(val)
111  return a
112  except ValueError:
113  try:
114  ts=time.strptime(val+'/UTC','%Y-%m-%d:%H:%M:%S/%Z')
115  return int(calendar.timegm(ts))
116  except ValueError:
117  print ("ERROR in time specification, use e.g. 2007-05-25:14:01:00")
118  sys.exit(-1)
119 
120 def timeString(iovkey):
121  "Convert the IOVkey (63 bit) to a string representing timestamp"
122  if (iovkey==cool.ValidityKeyMin):
123  return "ValidityKeyMin"
124  elif (iovkey==cool.ValidityKeyMax):
125  return "ValidityKeyMax"
126  else:
127  stime=int(iovkey/1000000000)
128  return time.asctime(time.gmtime(stime))+" UTC"
129 
130 def indirectOpen(coolstr,readOnly=True,debug=False):
131  """Obtain a connection to the database coolstr (e.g.
132  COOLONL_INDET/OFLP200) using Oracle servers only, bypassing SQLite files
133  and simulating the action of DBReplicaSvc to choose the correct one.
134  Returns None in case a connection cannot be established.
135  debug=True produces debug printout to show servers being tried"""
136  dbSvc=cool.DatabaseSvcFactory.databaseService()
137  connstr=transConn(coolstr)
138 
139  # split the name into schema and dbinstance
140  splitname=connstr.split('/')
141  forceSQLite='ATLAS_COOL_FORCESQLITE' in os.environ
142  if (debug and forceSQLite):
143  print ("ATLAS_COOL_FORCESQLITE: Force consideration of SQLite replicas")
144  if (len(splitname)!=2 or readOnly is False or forceSQLite):
145  try:
146  db=dbSvc.openDatabase(connstr,readOnly)
147  except Exception as e:
148  # if writeable connection on readonly filesystem, get
149  # 'cannot be established error' - retry readonly
150  if (not readOnly and ('attempt to write a readonly database' in e.__repr__())):
151  print ("Writeable open failed - retry in readonly mode")
152  db=dbSvc.openDatabase(connstr,True)
153  else:
154  raise
155  return db
156  if (debug): print ("Trying to establish connection for %s from Oracle" % connstr)
157  schema=splitname[0]
158  dbinst=splitname[1]
159  # list of servers to try, first one at beginning
160  serverlist=replicaList()
161  if (debug): print (serverlist)
162  # will pop candidates from end of list - so reverse it first
163  serverlist.reverse()
164  while len(serverlist)>0:
165  server=serverlist.pop()
166  # deal with frontier server - use only if FRONTIER_SERVER is set
167  if server=='ATLF':
168  if ('FRONTIER_SERVER' in os.environ):
169  connstr='frontier://ATLF/();schema=ATLAS_%s;dbname=%s' % (schema,dbinst)
170  else:
171  # skip ATLF replica if FRONTIER_SERVER not set
172  continue
173  elif server=='atlas_dd': continue
174  else:
175  connstr='oracle://%s;schema=ATLAS_%s;dbname=%s' % (server,schema,dbinst)
176  if (debug): print ("Attempting to open %s" % connstr)
177  try:
178  dbconn=dbSvc.openDatabase(connstr)
179  if (dbconn is not None and dbconn.isOpen()):
180  if (debug): print ("Established connection to %s" % server)
181  return dbconn
182  if (debug): print ("Cannot connect to %s" % server)
183  except Exception:
184  if (debug): print ("Exception connecting to %s" % server)
185  # all replicas tried - give up
186  print ("All available replicas tried - giving up")
187  return None
188 
190  """Return list of Oracle database server names to try, mimicing action of
191  Athena DBReplicaSvc"""
192  configfile=pathResolver('dbreplica.config')
193  if configfile is None:
194  print ("Cannot find dbreplica.config")
195  return None
196  hostname=getHostname()
197  best=0
198  serverlist=[]
199  for line in configfile.readlines():
200  epos=line.find('=')
201  if (epos>0 and line[0]!="#"):
202  domains=line[0:epos].split()
203  for dom in domains:
204  if ((hostname[-len(dom):]==dom and len(dom)>best) or (best==0 and dom=='default')):
205  best=len(dom)
206  serverlist=line[epos+1:].split()
207  configfile.close()
208  if (len(serverlist)==0):
209  print ("No suitable servers found")
210  return None
211  return serverlist
212 
213 def pathResolver(leaf,retFile=True):
214  """Find the file leaf using the DATAPATH variable to look for it
215  Return a read-only file object, or None if not found.
216  If retFile is false, just return the pathname.
217  Current directory takes precendence if file is there"""
218  try:
219  paths=os.environ['DATAPATH'].split(':')
220  except Exception:
221  # DATAPATH not set - just use current directory
222  paths=[]
223  paths=['.']+paths
224  for path in paths:
225  try:
226  os.stat(path+'/'+leaf)
227  if (retFile):
228  return open(path+'/'+leaf,'r')
229  else:
230  return path+'/'+leaf
231  except OSError:
232  pass
233  return None
234 
236  "Get the hostname including domain name if possible"
237  if ('ATLAS_CONDDB' in os.environ):
238  name=os.environ['ATLAS_CONDDB']
239  else:
240  try:
241  name=os.environ['HOSTNAME']
242  except Exception:
243  # try socket lib (for Mac) as HOSTNAME does not contain os.environ
244  import socket
245  try:
246  name=socket.getfqdn()
247  except Exception:
248  name='unknown'
249  # check name has a . (and doesn't end with .local, as macs default to),
250  # otherwise try command hostname --fqdn
251  if (name.find('.')>=0 and name[-6:]!=".local"):
252  return name
253  else:
254  if (name[-6:]==".local"):
255  print ("WARNING. Hostname is ",name, " which does not define a domain. Consider setting $ATLAS_CONDDB to avoid this")
256  return "unknown"
257 
258  import subprocess
259  try:
260  name=subprocess.check_output('hostname --fqdn').decode('utf-8')
261  except Exception:
262  name='unknown'
263 
264  #Calling hostname wrong will fill 'name' with error message
265  if (name.find('illegal')>-1 or name.find('unrecognized')>-1):
266  print ("WARNING. hostname --fqdn returned the following:",name)
267  print ("Consider setting $ATLAS_CONDDB to avoid this.")
268  return "unknown"
269  return name
270 
271 
272 # test code
273 def tests():
274  print ('AtlCoolLib tests')
275  db=forceOpen("TESTCOOL")
276  if (db is None):
277  print ('Could not create test database')
278  sys.exit(1)
279  spec=cool.RecordSpecification()
280  spec.extend('testString',cool.StorageType.String255)
281  folder=ensureFolder(db,'/TEST/TEST1',spec,athenaDesc(True,'CondAttrListCollection'),cool.FolderVersioning.MULTI_VERSION)
282  if (folder is None):
283  print ('Could not create test folder')
284  sys.exit(1)
285  print ('All done')
286  return
287 
288 class coolTool:
289  """
290  Class coolTool implements a base for python command-line tools to access
291  and set data in COOL folders
292  Incomplete baseclass implementation - clients must implement the following:
293  - setup(self,args) - set additional arguments
294  - usage(self) - print usage
295  - execute(self) - execute command
296  - procopts(self,opts) - (optional) - process additional command switches
297  """
298  def __init__(self,name,readonly,minarg,maxarg,longopts):
299  """
300  Initialise class and process command line options and switches
301  """
302  self.name=name
303  self.readonly=readonly
304  self.runLumi=True
305  self.runmin=0
306  self.runmax=(1 << 31)-1
307  self.lumimin=0
308  self.lumimax=(1 << 32)-2
309  self.tsmin=cool.ValidityKeyMin
310  self.tsmax=cool.ValidityKeyMax
311  self.since=cool.ValidityKeyMin
312  self.until=cool.ValidityKeyMax
313  self.debug=False
314  # get and process options - note only use long options format
315  try:
316  fullopts=longopts+['r=','rs=','ru=','l=','ls=','lu=','ts=','tu=','debug']
317  opts,args=getopt.getopt(sys.argv[1:],'',fullopts)
318  except getopt.GetoptError as e:
319  print (e)
320  self.usage()
321  sys.exit(1)
322  if len(args)<minarg or len(args)>maxarg:
323  print (name,'takes between',minarg,'and',maxarg,'non-optional parameters')
324  self.usage()
325  sys.exit(1)
326  # set standard parameters
327  self.conn=transConn(str(args[0]))
328  # allow derived class to set parameters
329  self.setup(args[1:])
330  self._procopts(opts)
331  self.procopts(opts)
332  # open database connection and execute command
333  if self.readonly:
334  self.db=indirectOpen(self.conn,debug=self.debug)
335  else:
336  self.db=forceOpen(self.conn)
337  self.execute()
338 
339  def _usage1(self):
340  # base implementation of usage - first part
341  print ('Usage:',self.name,' {<options>} dbname ',)
342 
343  def _usage2(self):
344  # base implementation of usage - second part
345  print ('Options to specify IOV (default valid for all intervals)')
346  print ('--rs=<first run>')
347  print ('--ru=<last run> (inclusive)')
348  print ('--r=<run> (only single run)')
349  print ('--ls=<lumi block since>')
350  print ('--l=<lumi block> (only single LB)')
351  print ('--lu=<lumi block until> (inclusive)')
352  print ('--ts=<initial timestamp> (in seconds)')
353  print ('--tu=<final timestamp> (in seconds)')
354  print ('--debug: Enable debugging information')
355 
356  def _procopts(self,opts):
357  # process the standard parameters
358  for o,a in opts:
359  if (o=='--rs'): self.runmin=int(a)
360  if (o=='--ru'): self.runmax=int(a)
361  if (o=='--r'):
362  self.runmin=int(a)
363  self.runmax=int(a)
364  if (o=='--ls'): self.lumimin=int(a)
365  if (o=='--lu'): self.lumimax=int(a)
366  if (o=='--l'):
367  self.lumimin=int(a)
368  self.lumimax=int(a)
369  if (o=='--ts'):
370  self.tsmin=timeVal(a)*1000000000
371  self.runLumi=False
372  if (o=='--tu'):
373  self.tsmax=timeVal(a)*1000000000
374  self.runLumi=False
375  if (o=='--debug'): self.debug=True
376  # now set the real interval of validity
377  if (self.runLumi):
378  print ('>== Data valid for run,LB [',self.runmin,',',self.lumimin,'] to [',self.runmax,',',self.lumimax,']')
379  self.since=(self.runmin << 32)+self.lumimin
380  self.until=(self.runmax << 32)+self.lumimax+1
381  else:
382  self.since=self.tsmin
383  self.until=self.tsmax
384  print ('>== Data valid for timestamps (sec) from ',self.since/1000000000,'(',timeString(self.since),') to ',self.until/1000000000,'(',timeString(self.until),')')
385  # check IOV is OK
386  if (self.until<self.since):
387  print ('ERROR in IOV definition: until<since')
388  sys.exit(1)
389 
390  def procopts(self,opts):
391  # default implementation of procopts - do nothing
392  pass
393 
394 
395 class RangeList:
396  """Hold a list of IOVs (start/end pairs) which are good, allowing parts
397  of list to be vetoed. start/end interpreted in COOL convention"""
398  def __init__(self,start,end):
399  "Initalise RangeList with given start and end (end=1 after last valid)"
400  self._starts=[start]
401  self._ends=[end]
402 
403  def vetoRange(self,start,end):
404  "Veto part of the original range, splitting it if needed"
405  if (start>=end): return
406  if (len(self._starts)==0): return
407  ix=0
408  while (ix<len(self._starts) and end>self._starts[ix]):
409  if (end>=self._starts[ix]):
410  if (start<=self._starts[ix] and end>=self._ends[ix]):
411  # remove whole interval
412  self._remove(ix)
413  ix-=1
414  elif (start<=self._starts[ix] and end<self._ends[ix]):
415  # remove front of stored interval
416  self._starts[ix]=end
417  elif (start<=self._ends[ix] and end>=self._ends[ix]):
418  # remove back of stored interval
419  self._ends[ix]=start
420  elif (start>self._starts[ix] and end<self._ends[ix]):
421  # have to split the stored interval
422  oldend=self._ends[ix]
423  self._ends[ix]=start
424  self._insert(ix+1,end,oldend)
425  ix+=1
426  ix+=1
427 
428  def getAllowedRanges(self,start,end):
429  """Return a list of tuples giving the allowed (start,end) within the
430  specified (start,end)"""
431  result=[]
432  for ix in range(0,len(self._starts)):
433  if (self._ends[ix]>start and self._starts[ix]<end):
434  result+=[(max(self._starts[ix],start),min(self._ends[ix],end))]
435  return result
436 
437  def __str__(self):
438  "Print representation of range as list of [x,y] allowed values"
439  rep=''
440  for i in range(0,len(self._starts)):
441  rep+='[%i,%i] ' % (self._starts[i],self._ends[i])
442  return rep
443 
444  def _remove(self,idx):
445  "Remove the entry at idx"
446  self._starts[idx:]=self._starts[1+idx:]
447  self._ends[idx:]=self._ends[1+idx:]
448 
449  def _insert(self,idx,start,end):
450  "Put a new entry at idx, moving others to make space"
451  self._starts.insert(idx,start)
452  self._ends.insert(idx,end)
453 
455  "Translation between timestamps and RunLB IOVs using /TRIGGER/LUMI/LBLB"
456  # contribution from Jahred Adelman
457  def __init__(self,dbconn,iovstart,iovend):
458  "Initialise and cache using the given DB connection, for RLB start/end"
459  # dbconn must correspond to COOLONL_TRIGGER/COMP200
460  self.StartTime = -1
461  self.EndTime = -1
462  self.since=iovstart
463  self.until=iovend
464  self.TSBeginMap = []
465  self.TSEndMap = []
466  self.RLMap = []
467  self.readdb = dbconn
468 
469  lblbname='/TRIGGER/LUMI/LBLB'
470  try:
471  readfolder=self.readdb.getFolder(lblbname)
472  except Exception as e:
473  print (e)
474  print ("Could not access folder %s " % lblbname)
475  raise RuntimeError ("TimeStampToRLB initialisation error")
476  # First try to read timestamp info
477  isFirst=True
478  try:
479  readobjs=readfolder.browseObjects(self.since,self.until,cool.ChannelSelection.all())
480  while readobjs.goToNext():
481  readobj=readobjs.currentRef()
482  payload=readobj.payload()
483  if (isFirst is True):
484  isFirst=False
485  self.StartTime=payload['StartTime']
486  else:
487  self.EndTime = payload['EndTime']
488  except Exception as e:
489  print (e)
490  print ("Problem reading data from folder %s" % lblbname)
491  raise RuntimeError ("TimeStampToRLB: initialisation error")
492  if (self.StartTime==-1):
493  raise RuntimeError ("TimeStampToRLB: no data for given runs")
494 
495  # Now try to read the LBTIME folder to translate timestamps into run/lumi blocks
496  lbtimename='/TRIGGER/LUMI/LBTIME'
497  try:
498  readfolder=self.readdb.getFolder(lbtimename)
499  except Exception as e:
500  print (e)
501  print ("Problem accessing folder %s" % lbtimename)
502  raise RuntimeError ("TimeStampToRLB: Initialisation error")
503  try:
504  readobjs=readfolder.browseObjects(self.StartTime, self.EndTime, cool.ChannelSelection.all())
505  while readobjs.goToNext():
506  readobj=readobjs.currentRef()
507  payload=readobj.payload()
508  TimeStampStart = readobj.since()
509  TimeStampEnd = readobj.until()
510  iov=(payload['Run'] << 32)+payload['LumiBlock']
511  self.TSBeginMap+=[TimeStampStart]
512  self.TSEndMap+=[TimeStampEnd]
513  self.RLMap+=[iov]
514  except Exception as e:
515  print (e)
516  print ("Problem reading from folder %s" % lbtimename)
517  raise RuntimeError ("TimeStampToRLB: Time data access error")
518  print ("TimeStampToRLB initialised with %i entries in map" % len(self.RLMap))
519 
520  def getRLB(self,timestamp,StartType=True):
521  """Lookup a timestamp value. If it is outside a run, round up to next
522 run (StartType=True) or down to previous (StartType=False)"""
523 
524  # New version. Let's take advantage of the fact that the DB entries should be time-ordered
525  if (StartType):
526  for TSbegin, RL in zip(self.TSBeginMap, self.RLMap):
527  if (timestamp <= TSbegin):
528  return RL
529  # Timestamp above cached endtime - return endtime
530  return self.until
531 
532  else:
533  for TSend, RL in reversed(zip(self.TSEndMap, self.RLMap)):
534  if (timestamp >= TSend):
535  return RL
536  # Timestamp below cached starttime - return starttime
537  return self.since
538 
539 
540 
541 # main code - run test of library functions
542 if __name__=='__main__':
543  tests()
544  print ('All OK')
545 
python.AtlCoolLib.forceOpen
def forceOpen(conn)
Definition: AtlCoolLib.py:28
python.AtlCoolLib.replicaList
def replicaList()
Definition: AtlCoolLib.py:189
python.AtlCoolLib.TimeStampToRLB.EndTime
EndTime
Definition: AtlCoolLib.py:461
python.AtlCoolLib.coolTool.name
name
Definition: AtlCoolLib.py:302
AtlasMcWeight::decode
double decode(number_type binnedWeight)
Convert weight from unsigned to double.
Definition: AtlasMcWeight.cxx:32
python.AtlCoolLib.TimeStampToRLB.TSBeginMap
TSBeginMap
Definition: AtlCoolLib.py:464
python.AtlCoolLib.coolTool.tsmax
tsmax
Definition: AtlCoolLib.py:310
python.AtlCoolLib.TimeStampToRLB.since
since
Definition: AtlCoolLib.py:462
python.AtlCoolLib.TimeStampToRLB.StartTime
StartTime
Definition: AtlCoolLib.py:460
python.AtlCoolLib.readOpen
def readOpen(conn)
Definition: AtlCoolLib.py:49
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
python.AtlCoolLib.coolTool
Definition: AtlCoolLib.py:288
python.AtlCoolLib.TimeStampToRLB
Definition: AtlCoolLib.py:454
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
python.AtlCoolLib.coolTool.debug
debug
Definition: AtlCoolLib.py:313
python.AtlCoolLib.coolTool.lumimin
lumimin
Definition: AtlCoolLib.py:307
python.AtlCoolLib.coolTool.conn
conn
Definition: AtlCoolLib.py:327
python.AtlCoolLib.tests
def tests()
Definition: AtlCoolLib.py:273
python.AtlCoolLib.RangeList._ends
_ends
Definition: AtlCoolLib.py:401
python.AtlCoolLib.RangeList.__init__
def __init__(self, start, end)
Definition: AtlCoolLib.py:398
python.AtlCoolLib.RangeList.getAllowedRanges
def getAllowedRanges(self, start, end)
Definition: AtlCoolLib.py:428
python.AtlCoolLib.RangeList.vetoRange
def vetoRange(self, start, end)
Definition: AtlCoolLib.py:403
python.AtlCoolLib.RangeList._starts
_starts
Definition: AtlCoolLib.py:400
python.AtlCoolLib.TimeStampToRLB.__init__
def __init__(self, dbconn, iovstart, iovend)
Definition: AtlCoolLib.py:457
python.AtlCoolLib.coolTool.until
until
Definition: AtlCoolLib.py:312
python.AtlCoolLib.coolTool._usage2
def _usage2(self)
Definition: AtlCoolLib.py:343
python.AtlCoolLib.athenaDesc
def athenaDesc(runLumi, datatype)
Definition: AtlCoolLib.py:81
python.AtlCoolLib.coolTool.readonly
readonly
Definition: AtlCoolLib.py:303
python.AtlCoolLib.coolTool.__init__
def __init__(self, name, readonly, minarg, maxarg, longopts)
Definition: AtlCoolLib.py:298
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:195
python.AtlCoolLib.coolTool.db
db
Definition: AtlCoolLib.py:334
python.AtlCoolLib.coolTool._usage1
def _usage1(self)
Definition: AtlCoolLib.py:339
python.AtlCoolLib.RangeList._remove
def _remove(self, idx)
Definition: AtlCoolLib.py:444
python.AtlCoolLib.timeVal
def timeVal(val)
Definition: AtlCoolLib.py:107
python.AtlCoolLib.coolTool.since
since
Definition: AtlCoolLib.py:311
python.AtlCoolLib.timeString
def timeString(iovkey)
Definition: AtlCoolLib.py:120
python.AtlCoolLib.coolTool._procopts
def _procopts(self, opts)
Definition: AtlCoolLib.py:356
python.AtlCoolLib.TimeStampToRLB.until
until
Definition: AtlCoolLib.py:463
python.AtlCoolLib.TimeStampToRLB.RLMap
RLMap
Definition: AtlCoolLib.py:466
Trk::open
@ open
Definition: BinningType.h:40
python.AtlCoolLib.coolTool.runLumi
runLumi
Definition: AtlCoolLib.py:304
python.AtlCoolLib.coolTool.procopts
def procopts(self, opts)
Definition: AtlCoolLib.py:390
python.AtlCoolLib.getHostname
def getHostname()
Definition: AtlCoolLib.py:235
python.AtlCoolLib.pathResolver
def pathResolver(leaf, retFile=True)
Definition: AtlCoolLib.py:213
python.AtlCoolLib.RangeList.__str__
def __str__(self)
Definition: AtlCoolLib.py:437
python.AtlCoolLib.transConn
def transConn(conn)
Definition: AtlCoolLib.py:18
python.AtlCoolLib.ensureFolder
def ensureFolder(db, folder, spec, desc, version=cool.FolderVersioning.SINGLE_VERSION)
Definition: AtlCoolLib.py:63
str
Definition: BTagTrackIpAccessor.cxx:11
python.AtlCoolLib.coolTool.lumimax
lumimax
Definition: AtlCoolLib.py:308
python.AtlCoolLib.coolTool.tsmin
tsmin
Definition: AtlCoolLib.py:309
python.AtlCoolLib.TimeStampToRLB.getRLB
def getRLB(self, timestamp, StartType=True)
Definition: AtlCoolLib.py:520
python.AtlCoolLib.TimeStampToRLB.TSEndMap
TSEndMap
Definition: AtlCoolLib.py:465
python.AtlCoolLib.TimeStampToRLB.readdb
readdb
Definition: AtlCoolLib.py:467
python.AtlCoolLib.coolTool.runmax
runmax
Definition: AtlCoolLib.py:306
python.AtlCoolLib.indirectOpen
def indirectOpen(coolstr, readOnly=True, debug=False)
Definition: AtlCoolLib.py:130
Trk::split
@ split
Definition: LayerMaterialProperties.h:38
python.AtlCoolLib.RangeList._insert
def _insert(self, idx, start, end)
Definition: AtlCoolLib.py:449
python.AtlCoolLib.coolTool.runmin
runmin
Definition: AtlCoolLib.py:305