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