ATLAS Offline Software
Loading...
Searching...
No Matches
CaloNoise_fillDB.py
Go to the documentation of this file.
1#!/bin/env python
2# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
3
4
5import sys
6import math
7
8def usage():
9 print ("Syntax for UPD4 open-end IoV noise update")
10 print (" The first parameter is the run number of IoV start, the second parameter is the lumiblock number for IoV start")
11 print (" The third and fourth parameter are the Run/lb for IoV end (if run is -1, uses open ended IoV)")
12 print (" The fifth parameter is the upd4 tag name")
13 print (" The sixth parameter is input text file name (default calonoise.txt)")
14 print (" The seventh parameter is output sqlite file name (default caloSqlite.db)")
15 print (" The eigth parameter is output DB name (default CONDBR2)")
16 print (" The nineth parameter is output folder name (default /LAR/NoiseOfl/CellNoise) ")
17 print (" The tenth parameter is mu (default 30)")
18 print (" The eleventh parameter is dt (default 25)")
19
20
21if len(sys.argv)<6:
22 usage()
23 sys.exit(-1)
24
25runSince = sys.argv[1]
26lbkSince = sys.argv[2]
27runUntil = sys.argv[3]
28lbkUntil = sys.argv[4]
29tag = sys.argv[5]
30if len(sys.argv)>6:
31 inputFile=sys.argv[6]
32else:
33 inputFile="calonoise.txt"
34
35if len(sys.argv)>7:
36 filename=sys.argv[7]
37else:
38 filename="larnoisesqlite.db"
39
40if len(sys.argv)>8:
41 dbname=sys.argv[8]
42else:
43 dbname="CONDBR2"
44
45if len(sys.argv)>9:
46 folderPath = sys.argv[9]
47else:
48 folderPath = "/LAR/NoiseOfl/CellNoise"
49
50if len(sys.argv)>10:
51 mu = int(sys.argv[10])
52else:
53 mu = -1
54
55if len(sys.argv)>11:
56 dt = int(sys.argv[11])
57else:
58 dt = -1
59
60if len(sys.argv)>11:
61 dt = int(sys.argv[11])
62else:
63 dt = -1
64
65
66print ("input: ",inputFile)
67print ("runUntil ", runUntil, lbkUntil)
68print ("output:",filename)
69print ("input: ",inputFile)
70
71import ROOT
72import cppyy
73from PyCool import cool
74from CaloCondBlobAlgs import CaloCondTools, CaloCondLogger
75
76#==================================================
77#===
78#=== Configuration section
79#===
80#==================================================
81#=== IOV range
82iovSince = CaloCondTools.iovFromRunLumi(runSince,lbkSince)
83iovUntil = cool.ValidityKeyMax
84print (" iovUntil max ",iovUntil)
85if int(runUntil) > 0:
86 print (" use run number to define iobUntil ", runUntil)
87 iovUntil = CaloCondTools.iovFromRunLumi(runUntil,lbkUntil)
88
89print (" iovSince ", iovSince)
90print (" iovUntil ", iovUntil)
91
92#=== values for the comment channel
93author = "gunal"
94comment = "Updated noise values"
95
96#==================================================
97#===
98#=== Code starts below here
99#===
100#==================================================
101
102#=== get a logger
103log = CaloCondLogger.getLogger("CaloNoiseWriter")
104
105#=== (re-)create the database
106dbSvc = cool.DatabaseSvcFactory.databaseService()
107try:
108 db=dbSvc.openDatabase("sqlite://;schema="+filename+";dbname="+dbname, False)
109except Exception:
110 db=dbSvc.createDatabase("sqlite://;schema="+filename+";dbname="+dbname)
111
112try:
113 #=== creating folder specifications
114 spec = cool.RecordSpecification()
115 spec.extend( 'CaloCondBlob16M', cool.StorageType.Blob16M )
116 fspec = cool.FolderSpecification(cool.FolderVersioning.MULTI_VERSION, spec)
117
118 #=== create the folder
119 folderTag = tag
120 log.info( "Filling COOL folder %s with tag %s", folderPath, folderTag )
121 desc = CaloCondTools.getAthenaFolderDescr()
122 try:
123 folder = db.getFolder(folderPath)
124 except Exception:
125 log.warning("Folder %s not found, creating it...", folderPath)
126 #folder = db.createFolder(folderPath, spec, desc, cool.FolderVersioning.MULTI_VERSION, True)
127 folder = db.createFolder(folderPath, fspec, desc, True)
128
129 #==================================================
130 #=== Create the CaloCondBlobFlt objects
131 #==================================================
132 #=== default a and b to be used for each gain
133 gainDefVec = ROOT.std.vector('float')()
134 gainDefVec.push_back(0.) # a
135 gainDefVec.push_back(0.) # b
136 #=== three gains per channel for LAr
137 #defVecLAr = g.std.vector('std::vector<float>')()
138 defVecLAr = ROOT.std.vector('std::vector<float>')()
139 defVecLAr.push_back(gainDefVec)
140 defVecLAr.push_back(gainDefVec)
141 defVecLAr.push_back(gainDefVec)
142 #=== four "gains" per channel for Tile
143 #defVecTile = g.std.vector('std::vector<float>')()
144 defVecTile = ROOT.std.vector('std::vector<float>')()
145 defVecTile.push_back(gainDefVec)
146 defVecTile.push_back(gainDefVec)
147 defVecTile.push_back(gainDefVec)
148 defVecTile.push_back(gainDefVec)
149
150 #=== system specific data: sysId -> (nChannel, hash-offset, default-vector, name)
151 systemDict = { 0 : (31872, 0, defVecLAr , 'EMEC, z<0'),
152 1 : (54784, 31872, defVecLAr , 'EMB , z<0'),
153 2 : (54784, 86656, defVecLAr , 'EMB , z>0'),
154 3 : (31872, 141440, defVecLAr , 'EMEC, z>0'),
155 16 : ( 5632, 0, defVecLAr , 'HEC' ),
156 32 : ( 3524, 0, defVecLAr , 'FCAL' ),
157 48 : ( 5184, 0, defVecTile, 'TILE' )
158 }
159 fltDict = {}
160 for systemId, info in systemDict.items():
161 if (systemId<48) :
162 nChannel = info[0]
163 defVec = info[2]
164 sysName = info[3]
165 log.info("Creating BLOB for %s", sysName)
166 data = cool.Record( spec )
167 blob = data['CaloCondBlob16M']
168 flt = ROOT.CaloCondBlobFlt.getInstance(blob)
169 flt.init(defVec,nChannel,1,author,comment)
170 fltDict[systemId] = [data,flt]
171 mbSize = float(blob.size()) / 1024.
172 log.info("---> BLOB size is %4.1f kB", mbSize)
173
174 #=== read noise values from file
175 lines = open(inputFile,"r").readlines()
176 for line in lines:
177 fields = line.split()
178 if len(fields) < 5:
179 log.info("---> wrong line length %d entries ", len(fields))
180 continue
181 pass
182 offId = int(fields[0])
183 systemId = int(fields[1])
184 hash = int(fields[2]) - systemDict[systemId][1]
185 gain = ROOT.CaloCondUtils.getDbCaloGain(int(fields[3]))
186 noiseA = float(fields[4])
187 noiseB = float(fields[5])
188 flt = fltDict[systemId][1]
189 if mu > 0 and dt > 0:
190 # new normalization
191 if dt > 25:
192 noiseB /= math.sqrt(mu/53.*10.)
193 else:
194 noiseB /= math.sqrt(mu/29.*10.)
195 pass
196 if mu == 0:
197 noiseB = 0
198 flt.setData(hash,gain,0,noiseA)
199 flt.setData(hash,gain,1,noiseB)
200
201 #=== write to DB
202 for systemId, dataList in fltDict.items():
203 if (systemId<48):
204 sysName = systemDict[systemId][3]
205 log.info("Committing BLOB for %s", sysName)
206 channelId = cool.ChannelId(systemId)
207 log.info("Cool channel ID %s", channelId)
208 data = dataList[0]
209 folder.storeObject(iovSince, iovUntil, data, channelId, folderTag)
210
211except Exception as e:
212 log.fatal("Exception caught:")
213 print (e)
214
215#=== close the database
216db.closeDatabase()
217