18 import sys, json, copy
19 from CoolConvUtilities
import AtlCoolLib
20 from PyCool
import cool
23 """A class to store database folder, its specification, and its tag at the same place, so they won't be mixed up"""
24 def __init__ (self, folder,folderName,spec,tag):
31 """Turns run number and lumibock into integrer needed by the database"""
35 """A function that will ensure a folder is in the database, it creates it if necessary. Also defines content of the folders. It contains only a single entry of a long string"""
37 spec=cool.RecordSpecification()
40 spec.extend(
"data",cool.StorageType.String64k)
46 folder=AtlCoolLib.ensureFolder(db,folderName,spec,AtlCoolLib.athenaDesc(runLumi,
'CondAttrListCollection'),cool.FolderVersioning.MULTI_VERSION)
51 return folderBulk(folder, folderName, spec, tag)
54 """A class to create a dictionary, fill it with zeros in the constructor and to overwrite zeros later"""
56 if(folderBlk.folderName==
"/FWD/Onl/AFP/ToFParameters/Local"):
57 emptydict={
"stationID":0,
"trainID":-1,
"barID":-1,
"barWeight":1.0,
"barTimeOffset":0.0}
59 elif(folderBlk.folderName==
"/FWD/Onl/AFP/ToFParameters/Vertex"):
60 emptydict={
"stationID":0,
"timeGlobalOffset":0.0,
"timeOffset":(0.0,0.0,0.0,0.0),
"timeSlope":(0.0,0.0,0.0,0.0),
"trainEdge":(0.0,0.0,0.0,0.0,0.0)}
63 print (
"unknown folder %s, please edit \"AFPDBDict\" class constructor, exiting now" % folderBlk.folderName)
67 "version":
"AFP_DB_v2",
68 "nchannels":nchannels,
69 "data": dict.fromkeys(
range(0, nchannels))}
71 for i
in range(0, nchannels):
72 self.
mydict[
"data"][i]=copy.deepcopy(emptydict)
73 if(folderBlk.folderName==
"/FWD/Onl/AFP/ToFParameters/Local"):
74 self.
mydict[
"data"][i][
"stationID"]=(i//16)*3
75 self.
mydict[
"data"][i][
"trainID"]=(i%16)//4
76 self.
mydict[
"data"][i][
"barID"]=i%4
77 if(folderBlk.folderName==
"/FWD/Onl/AFP/ToFParameters/Vertex"):
78 self.
mydict[
"data"][i][
"stationID"]=i*3
80 def append(self, stationID, trainID=-1, barID=-1, barWeight=1.0, barTimeOffset=0.0, timeGlobalOffset=0.0, timeOffset=(0.,0.,0.,0.), timeSlope=(0.,0.,0.,0.), trainEdge=(0.,0.,0.,0.,0.)):
81 """A function that overwrites one slice of the ToF parameters in the dictionary. Local ToF parameters have to have both trainID and barID defined, Vertex ToF parameters neither."""
84 if(stationID!=0
and stationID!=3):
85 print (
"cannot save payload, got stationID=%d, unknown" % stationID)
88 trainValid=
True if 0<=trainID
and trainID<4
else False
89 barValid =
True if 0<=barID
and barID<4
else False
90 if(trainValid!=barValid):
92 print (
"cannot save payload, got trainID=%d, barID=%d" % (trainID,barID))
100 channel=(stationID//3)*16+trainID*4+barID
103 mydict_helper=self.
mydict[
"data"][channel]
104 mydict_helper[
'stationID'], mydict_helper[
'trainID'], mydict_helper[
'barID'] = stationID, trainID, barID
105 mydict_helper[
'barWeight'], mydict_helper[
'barTimeOffset'] = barWeight, barTimeOffset
112 mydict_helper=self.
mydict[
"data"][channel]
113 mydict_helper[
'stationID']=stationID
114 mydict_helper[
'timeGlobalOffset'], mydict_helper[
'timeOffset'] = timeGlobalOffset, timeOffset
115 mydict_helper[
'timeSlope'], mydict_helper[
'trainEdge'] = timeSlope, trainEdge
119 """A function to transform the dictionary to JSON and save it in IOV from a given run and LB; upper limits are undefined and the maximum value (until beginning of a next entry) is used."""
123 print (
"cannot save payload, got fromRun=%d, it has to be positive" % fromRun)
128 until=cool.ValidityKeyMax
131 payload=cool.Record(folderBlk.spec)
133 payload[
"data"]=json.dumps(self.
mydict, indent = 1)
135 folderBlk.folder.storeObject(since,until,payload,0,folderBlk.tag)
139 dbFile =
"Example.db"
150 dbSvc = cool.DatabaseSvcFactory.databaseService()
153 dbString =
"sqlite://;schema=%s;dbname=%s" % (dbFile, dbName)
155 db = dbSvc.createDatabase(dbString)
156 except Exception
as e:
157 print (
'Problem creating database', e)
159 print (
"Created database", dbString)
162 folderBlkLoc_01=
makeFolderAndSpec(db,folderName=
"/FWD/Onl/AFP/ToFParameters/Local", tag=
"AFPToFLoc-01")
163 folderBlkVtx_01=
makeFolderAndSpec(db,folderName=
"/FWD/Onl/AFP/ToFParameters/Vertex", tag=
"AFPToFVtx-01")
169 myDict.append(stationID=0, trainID=0, barID=0, barWeight=1.0, barTimeOffset=1494.0)
170 myDict.append(stationID=0, trainID=0, barID=1, barWeight=1.0, barTimeOffset=1500.0)
171 myDict.append(stationID=0, trainID=0, barID=2, barWeight=1.0, barTimeOffset=1500.0)
172 myDict.append(stationID=0, trainID=0, barID=3, barWeight=1.0, barTimeOffset=1500.0)
173 myDict.append(stationID=0, trainID=1, barID=0, barWeight=1.0, barTimeOffset=1500.0)
174 myDict.append(stationID=0, trainID=1, barID=1, barWeight=1.0, barTimeOffset=1500.0)
175 myDict.append(stationID=0, trainID=1, barID=2, barWeight=1.0, barTimeOffset=1500.0)
176 myDict.append(stationID=0, trainID=1, barID=3, barWeight=1.0, barTimeOffset=1500.0)
177 myDict.append(stationID=0, trainID=2, barID=0, barWeight=1.0, barTimeOffset=1500.0)
178 myDict.append(stationID=0, trainID=2, barID=1, barWeight=1.0, barTimeOffset=1500.0)
179 myDict.append(stationID=0, trainID=2, barID=2, barWeight=1.0, barTimeOffset=1500.0)
180 myDict.append(stationID=0, trainID=2, barID=3, barWeight=1.0, barTimeOffset=1500.0)
181 myDict.append(stationID=0, trainID=3, barID=0, barWeight=1.0, barTimeOffset=1500.0)
182 myDict.append(stationID=0, trainID=3, barID=1, barWeight=1.0, barTimeOffset=1500.0)
183 myDict.append(stationID=0, trainID=3, barID=2, barWeight=1.0, barTimeOffset=1500.0)
184 myDict.append(stationID=0, trainID=3, barID=3, barWeight=1.0, barTimeOffset=1500.0)
185 myDict.append(stationID=3, trainID=0, barID=0, barWeight=1.0, barTimeOffset=1500.0)
186 myDict.append(stationID=3, trainID=0, barID=1, barWeight=1.0, barTimeOffset=1500.0)
187 myDict.append(stationID=3, trainID=0, barID=2, barWeight=1.0, barTimeOffset=1500.0)
188 myDict.append(stationID=3, trainID=0, barID=3, barWeight=1.0, barTimeOffset=1500.0)
189 myDict.append(stationID=3, trainID=1, barID=0, barWeight=1.0, barTimeOffset=1500.0)
190 myDict.append(stationID=3, trainID=1, barID=1, barWeight=1.0, barTimeOffset=1500.0)
191 myDict.append(stationID=3, trainID=1, barID=2, barWeight=1.0, barTimeOffset=1500.0)
192 myDict.append(stationID=3, trainID=1, barID=3, barWeight=1.0, barTimeOffset=1500.0)
193 myDict.append(stationID=3, trainID=2, barID=0, barWeight=1.0, barTimeOffset=1500.0)
194 myDict.append(stationID=3, trainID=2, barID=1, barWeight=1.0, barTimeOffset=1500.0)
195 myDict.append(stationID=3, trainID=2, barID=2, barWeight=1.0, barTimeOffset=1500.0)
196 myDict.append(stationID=3, trainID=2, barID=3, barWeight=1.0, barTimeOffset=1500.0)
197 myDict.append(stationID=3, trainID=3, barID=0, barWeight=1.0, barTimeOffset=1500.0)
198 myDict.append(stationID=3, trainID=3, barID=1, barWeight=1.0, barTimeOffset=1500.0)
199 myDict.append(stationID=3, trainID=3, barID=2, barWeight=1.0, barTimeOffset=1500.0)
200 myDict.append(stationID=3, trainID=3, barID=3, barWeight=1.0, barTimeOffset=1500.0)
201 myDict.savePayload(folderBlk=folderBlkLoc_01, fromRun=fromRun)
206 myDict =
AFPDBDict(folderBlk=folderBlkVtx_01)
207 myDict.append(stationID=0, timeGlobalOffset=0.0, timeOffset=(64.,45.,25.,11.), timeSlope=(-7.3,-5.0,-4.0,-4.0), trainEdge=(-18.7,-13.2,-8.1,-4.0,-2.5))
208 myDict.append(stationID=3, timeGlobalOffset=5.0, timeOffset=( 2., 9.,14.,12.), timeSlope=( 4.0, 5.0, 3.0, 6.0), trainEdge=(-18.7,-13.2,-8.1,-4.0,-2.5))
209 myDict.savePayload(folderBlk=folderBlkVtx_01, fromRun=fromRun)
212 print (
"\nClose database")
216 if __name__==
"__main__":