ATLAS Offline Software
ParameterDbFiller.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
2 
3 # @author: RD Schaffer <R.D.Schaffer@cern.ch>
4 # @date: May 2008
5 #
6 #
7 
8 
9 __version__ = "$Id: ParameterDbFiller.py,v 1.3 2008-11-13 12:25:23 schaffer Exp $"
10 __author__ = "RD Schaffer <R.D.Schaffer@cern.ch>"
11 
12 import sys
13 import os
14 import collections
15 from PyCool import cool
16 
17 class ParameterDbFillerError(Exception):
18  def __init__(self, value):
19  self.value = value
20  def __str__(self):
21  return repr(self.value)
22 
23 
25  """
26  A simple class used to fill SQLite db file with parameters for simulation
27  and/or digitization.
28  """
29 
30  def __init__(self):
31  object.__init__(self)
32 
33  self.beginRun = None
34  self.endRun = None
35  self.simParams = collections.OrderedDict()
36  self.digitParams = collections.OrderedDict()
37  self.digitParams64 = collections.OrderedDict()
38  return
39 
40  #
41  def setBeginRun(self, beginRun):
42  self.beginRun = beginRun << 32
43  return
44 
45  def setEndRun(self, endRun):
46  self.endRun = endRun << 32
47  return
48 
49  def addSimParam(self, name, value):
50  self.simParams[name] = value
51  return
52 
53  def addDigitParam(self, name, value):
54  self.digitParams[name] = value
55  return
56 
57  def addDigitParam64(self, name, value):
58  self.digitParams64[name] = value
59  return
60 
61  def genSimDb(self, dbFileName = None):
62  # Allow to define specific file name, otherwise use
63  if dbFileName is None:
64  # Set to default value
65  dbFileName = "SimParams.db"
66 
67  # Generate db: args - file name, dbname, params, folder path
68  self.genDb(dbFileName, 'SIMPARAM', self.simParams, '/Simulation/Parameters')
69 
70 
71  def genDigitDb(self, dbFileName = None):
72  # Allow to define specific file name, otherwise use
73  if dbFileName is None:
74  # Set to default value
75  dbFileName = "DigitParams.db"
76 
77  # Generate db: args - file name, dbname, params, folder path
78  self.genDb(dbFileName, 'DIGPARAM', self.digitParams, '/Digitization/Parameters', self.digitParams64)
79 
80 
81  def genDb(self, dbFileName, dbName, params, folderPath, params64 = {}):
82 
83  # Do checks
84  if self.beginRun is None:
85  raise ParameterDbFillerError ('Must set begin run number before generating db')
86  if self.endRun is None:
87  raise ParameterDbFillerError ('Must set end run number before generating db')
88  if len(params) == 0:
89  raise ParameterDbFillerError ('No parameters for db ' + dbName)
90 
91  # remove existing db, if any
92  try:
93  os.remove(dbFileName)
94  print ("ParameterDbFiller.genDb: Removed db", dbFileName)
95  except Exception:
96  pass
97 
98  # get database service and open database
99  dbSvc=cool.DatabaseSvcFactory.databaseService()
100 
101  # build dbstring - database accessed via physical name
102  dbstring="sqlite://;schema=" + dbFileName + ";dbname=" + dbName
103  try:
104  db=dbSvc.createDatabase(dbstring)
105  except Exception as e:
106  print ('ParameterDbFiller.genDb: Problem creating database',e)
107  sys.exit(-1)
108  print ("ParameterDbFiller.genDb: Created database",dbstring)
109 
110  # setup a folder payload specification
111  spec=cool.RecordSpecification()
112  for key in params:
113  spec.extend(key, cool.StorageType.String4k)
114  pass
115  # add in spec for long strings
116  for key in params64:
117  spec.extend(key, cool.StorageType.String64k)
118 
119  # folder meta-data - note for Athena this has a special meaning
120  desc = '<timeStamp>run-event</timeStamp><addrHeader><address_header service_type="71" clid="40774348" /></addrHeader><typeName>AthenaAttributeList</typeName>'
121  # create the folder - single version
122  # last argument is createParents - if true, automatically creates parent
123  # folders if needed
124  # note this will not work if the database already exists - delete mycool.db first
125  # myfolder=db.createFolder(folderPath, spec, desc, cool.FolderVersioning.SINGLE_VERSION,True)
126  folderSpec = cool.FolderSpecification(cool.FolderVersioning.SINGLE_VERSION, spec)
127  myfolder = db.createFolder(folderPath, folderSpec, desc, True)
128 
129  # now fill in parameters
130  data = cool.Record(spec)
131  for k, v in params.items():
132  data[k] = v
133  for k, v in params64.items():
134  data[k] = v
135 
136  print ("ParameterDbFiller.genDb: Recording parameters", data)
137 
138  # store object with IOV valid from 0-10, channel 3
139  myfolder.storeObject(self.beginRun, self.endRun, data, 0)
140  print ("ParameterDbFiller.genDb: Stored object")
141 
142  # finalize
143  db.closeDatabase()
144 
145  # Try to dump out db as test
146  self.dumpDb(dbstring)
147 
148  def dumpDb(self, dbstring):
149 
150  print ("ParameterDbFiller.dumpDb: Dumping database:", dbstring)
151  # get database service and open database
152  dbSvc = cool.DatabaseSvcFactory.databaseService()
153  # database accessed via physical name
154  try:
155  db = dbSvc.openDatabase(dbstring,False)
156  except Exception as e:
157  print ('ParameterDbFiller.dumpDb: Problem opening database',e)
158  sys.exit(-1)
159 
160  # Loop over folders
161  folders = db.listAllNodes()
162  for ff in folders:
163  # Get Folder
164  if (not db.existsFolder(ff)):
165  continue
166  try:
167  f = db.getFolder(ff)
168  print ("ParameterDbFiller.dumpDb: Dumping folder " + str(ff))
169  except Exception:
170  #print ("Skipping " + str(ff))
171  continue
172 
173  # get tags
174  # tags = f.listTags()
175  # print ("for tags ", end='')
176  # for tag in tags: print (tag)
177 
178  # for tag in tags:
179 
180  nobjs = f.countObjects( cool.ValidityKeyMin,
181  cool.ValidityKeyMax,
182  cool.ChannelSelection.all())
183 
184  print ("ParameterDbFiller.dumpDb: number of IOV payloads", nobjs)
185 
186  objs = f.browseObjects( cool.ValidityKeyMin,
187  cool.ValidityKeyMax,
188  cool.ChannelSelection.all())
189  i = 0
190  while objs.goToNext():
191  obj = objs.currentRef()
192  print ("ParameterDbFiller.dumpDb: Payload", i, end='')
193  print ("since [r,l]: [", obj.since() >> 32,',',obj.since()%0x100000000,']', end='')
194  print ("until [r,l]: [", obj.until() >> 32,',',obj.until()%0x100000000,']', end='')
195  print ("payload", obj.payload(), end='')
196  print ("chan",obj.channelId() )
197  i += 1
198 
199  objs.close()
200 
201  # finish
202  db.closeDatabase()
python.ParameterDbFiller.ParameterDbFiller.genDigitDb
def genDigitDb(self, dbFileName=None)
Definition: ParameterDbFiller.py:71
python.ParameterDbFiller.ParameterDbFiller
Definition: ParameterDbFiller.py:24
python.ParameterDbFiller.ParameterDbFiller.__init__
def __init__(self)
Definition: ParameterDbFiller.py:30
python.ParameterDbFiller.ParameterDbFiller.beginRun
beginRun
Definition: ParameterDbFiller.py:33
python.ParameterDbFiller.ParameterDbFiller.digitParams
digitParams
Definition: ParameterDbFiller.py:36
python.ParameterDbFiller.ParameterDbFiller.addDigitParam
def addDigitParam(self, name, value)
Definition: ParameterDbFiller.py:53
python.ParameterDbFiller.ParameterDbFillerError.__str__
def __str__(self)
Definition: ParameterDbFiller.py:20
python.ParameterDbFiller.ParameterDbFiller.genDb
def genDb(self, dbFileName, dbName, params, folderPath, params64={})
Definition: ParameterDbFiller.py:81
python.ParameterDbFiller.ParameterDbFiller.addDigitParam64
def addDigitParam64(self, name, value)
Definition: ParameterDbFiller.py:57
python.ParameterDbFiller.ParameterDbFillerError.value
value
Definition: ParameterDbFiller.py:19
PyAthena::repr
std::string repr(PyObject *o)
returns the string representation of a python object equivalent of calling repr(o) in python
Definition: PyAthenaUtils.cxx:106
python.ParameterDbFiller.ParameterDbFiller.genSimDb
def genSimDb(self, dbFileName=None)
Definition: ParameterDbFiller.py:61
python.ParameterDbFiller.ParameterDbFiller.addSimParam
def addSimParam(self, name, value)
Definition: ParameterDbFiller.py:49
python.ParameterDbFiller.ParameterDbFiller.simParams
simParams
Definition: ParameterDbFiller.py:35
python.ParameterDbFiller.ParameterDbFiller.setEndRun
def setEndRun(self, endRun)
Definition: ParameterDbFiller.py:45
python.ParameterDbFiller.ParameterDbFillerError.__init__
def __init__(self, value)
Definition: ParameterDbFiller.py:18
python.ParameterDbFiller.ParameterDbFiller.setBeginRun
def setBeginRun(self, beginRun)
Definition: ParameterDbFiller.py:41
python.ParameterDbFiller.ParameterDbFiller.digitParams64
digitParams64
Definition: ParameterDbFiller.py:37
python.ParameterDbFiller.ParameterDbFiller.dumpDb
def dumpDb(self, dbstring)
Definition: ParameterDbFiller.py:148
pickleTool.object
object
Definition: pickleTool.py:29
str
Definition: BTagTrackIpAccessor.cxx:11
python.ParameterDbFiller.ParameterDbFillerError
Definition: ParameterDbFiller.py:17
python.ParameterDbFiller.ParameterDbFiller.endRun
endRun
Definition: ParameterDbFiller.py:34