1
# Author: Christopher Tunnell <tunnell@hep.uchicago.edu>
7
# July 16, 2009 : Adapted to LASER by Seb Viret <viret@in2p3.fr>
10
from src.ReadGenericCalibration import *
11
from src.region import *
13
from array import array
16
from TileCalibBlobPython import TileCalibTools, TileBchTools
17
from TileCalibBlobPython.TileCalibTools import MINRUN, MINLBK, MAXRUN, MAXLBK, LASPARTCHAN
18
from TileCalibBlobObjs.Classes import *
20
# For turning off annoying logging
22
from TileCalibBlobPython.TileCalibLogger import TileCalibLogger, getLogger
24
class WriteDB(ReadGenericCalibration):
25
"write out a tileSqlite.db file with database constants"
27
def get_latest_run(self):
29
Usage: get_latest_run()
37
* integer indicating the latest run
40
f = urllib.urlopen('http://atlas-service-db-runlist.web.cern.ch/atlas-service-db-runlist/cgi-bin/latestRun.py')
46
def __init__(self, runType = 'CIS', offline_tag = 'HLT-UPD1-00',version = 1):
47
self.runType = runType
50
# S.Viret (24/08/2009) :
51
# 'version' is the version number of the offline database you want to use
52
# This is usually 1 but it appears that in some cases (cesium and LASER
59
# Here things are done depending on runType
63
offline_tag = 'TileOfl0%dCalibCisFitLin-%s' % (version,offline_tag)
64
self.offline_folder = TileCalibTools.getTilePrefix()+"CALIB/CIS/FIT/LIN"
65
self.offline_tag = offline_tag
66
self.online_folder = TileCalibTools.getTilePrefix(ofl=False)+"CALIB/CIS/LIN"
69
elif runType == 'Las':
70
self.offline_tag = 'TileOfl0%dCalibLasLin-%s' % (version,offline_tag)
71
self.offline_tag_F = 'TileOfl0%dCalibLasFiber-%s' % (version,offline_tag)
72
self.offline_folder = TileCalibTools.getTilePrefix()+"CALIB/LAS/LIN"
73
self.offline_folder_F = TileCalibTools.getTilePrefix()+"CALIB/LAS/FIBER"
74
self.online_folder = TileCalibTools.getTilePrefix(ofl=False)+"CALIB/LAS/LIN"
77
elif runType == 'Las_REF' or runType=='cesium':
78
offline_tag = 'TileOfl0%dCalibCes-%s' % (version,offline_tag)
79
self.offline_folder = '/TILE/OFL0%d/CALIB/CES' % version
80
self.offline_tag = offline_tag
81
self.online_folder = TileCalibTools.getTilePrefix(ofl=False)+"CALIB/CES"
85
print 'WriteDB: Failed to initialize'
88
# use the latest run number as starting point (common to everyone)
89
self.offline_iov = (self.get_latest_run(), 0)
90
self.online_iov = (self.get_latest_run(), 0)
92
PyCintex.makeClass('std::vector<float>')
93
PyCintex.makeClass('std::vector<unsigned int>')
97
# Here we instantiate the different parameters
100
def ProcessStart(self):
101
# open DB connection to sqlite file
102
self.db = TileCalibTools.openDb('SQLITE', 'COMP200', 'UPDATE')
104
self.blobWriterOnline = TileCalibTools.TileBlobWriter(self.db,self.online_folder, 'Flt', False)
105
self.blobWriterOffline = TileCalibTools.TileBlobWriter(self.db,self.offline_folder, 'Flt')
107
if self.runType == 'Las': # For fiber and partition stuff
108
self.blobWriterOffline_F = TileCalibTools.TileBlobWriter(self.db,self.offline_folder_F, 'Flt')
110
if self.runType == 'Las_REF' or self.runType == 'cesium': # For recovering Cesium reference values
111
#self.db_REF = TileCalibTools.openDb('ORACLE', 'COMP200', 'READONLY')
112
self.db_REF = TileCalibTools.openDbConn('COOLOFL_TILE/COMP200', 'READONLY')
113
self.blobReader = TileCalibTools.TileBlobReader(self.db_REF, self.offline_folder, self.offline_tag)
115
util = PyCintex.gbl.TileCalibUtils()
118
# Once again things are done depending on runType
121
if self.runType == 'CIS':
123
loGainDef=(1023./800.)
124
hiGainDef=(64.*1023./800.)
125
loGainDefVec = PyCintex.gbl.std.vector('float')()
126
loGainDefVec.push_back(loGainDef)
127
hiGainDefVec = PyCintex.gbl.std.vector('float')()
128
hiGainDefVec.push_back(hiGainDef)
129
defVec = PyCintex.gbl.std.vector('std::vector<float>')()
130
defVec.push_back(loGainDefVec)
131
defVec.push_back(hiGainDefVec)
133
elif self.runType == 'Las':
135
lohiGainDefVec = PyCintex.gbl.std.vector('float')()
136
lohiGainDefVec.push_back(1.)
137
defVec = PyCintex.gbl.std.vector('std::vector<float>')()
138
defVec.push_back(lohiGainDefVec)
139
defVec.push_back(lohiGainDefVec)
141
elif self.runType == 'Las_REF' or self.runType == 'cesium':
143
default = PyCintex.gbl.std.vector('float')()
144
default.push_back( 1.) # cesium constant
145
default.push_back( -1.) # laser default value
146
default.push_back(700.) # reference HV
147
default.push_back( 20.) # reference temperature (same for all channels)
148
defVec = PyCintex.gbl.std.vector('std::vector<float>')()
149
defVec.push_back(default)
150
defVec.push_back(default)
152
# Then we initialize everything
154
for ros in xrange(util.max_ros()):
155
for drawer in xrange(util.getMaxDrawer(ros)):
156
flt = self.blobWriterOffline.getDrawer(ros,drawer)
157
flt.init(defVec, 48, 1)
159
if self.runType == 'Las':
160
flt = self.blobWriterOffline_F.getDrawer(ros,drawer)
161
flt.init(defVec, 48, 1)
163
flt = self.blobWriterOnline.getDrawer(ros,drawer)
164
flt.init(defVec, 48, 1)
166
def ProcessStop(self):
167
# iov until is the end of the interval of validity, so infinity here
168
iovUntil = (MAXRUN,MAXLBK)
169
author = "%s" % os.getlogin()
171
self.blobWriterOnline.setComment(author, "TUCS %s" % (" ".join(sys.argv)))
172
self.blobWriterOnline.register(self.online_iov, iovUntil, self.online_tag)
174
self.blobWriterOffline.setComment(author, "TUCS %s" % (" ".join(sys.argv)))
175
self.blobWriterOffline.register(self.offline_iov, iovUntil, self.offline_tag)
177
if self.runType == 'Las':
178
self.blobWriterOffline_F.setComment(author, "TUCS %s" % (" ".join(sys.argv)))
179
self.blobWriterOffline_F.register(self.offline_iov, iovUntil, self.offline_tag_F)
181
if self.runType == 'Las_REF' or self.runType == 'cesium':
182
self.db_REF.closeDatabase()
184
self.db.closeDatabase()
189
# Here we do the writing
192
def ProcessRegion(self, region):
194
if 'gain' not in region.GetHash():
197
# First the LASER case
199
if self.runType == 'Las' or self.runType == 'Las_REF':
201
part, mod, chan, gain = region.GetNumber()
202
for event in region.GetEvents():
204
# Case 1: relative variation
205
if self.runType == 'Las' and event.data.has_key('calibration'):
207
#print 'region updated: ', event.data['region'], event.data['calibration']
209
drawer = self.blobWriterOffline.getDrawer(part, mod-1)
210
drawer_F = self.blobWriterOffline_F.getDrawer(part, mod-1)
212
# Then we update if there is a new value (coefficients are in %, so we put in correct format)
214
# First update PMT variation
215
drawer.setData(int(chan), int(gain), 0, float(1+event.data['deviation']/100))
217
# Then update Fiber variation (optional)
218
if event.data.has_key('fiber_var'):
219
drawer_F.setData(int(chan), int(gain), 0, float(1+event.data['fiber_var']/100))
221
# Finally update Partition variation (optional)
222
if event.data.has_key('part_var'):
223
drawer_F.setData(LASPARTCHAN, int(gain), 0, float(1+event.data['part_var']/100))
225
# Case 2: reference values
226
if self.runType == 'Las_REF':
228
drawer_R = self.blobReader.getDrawer(part, mod-1, (event.runNumber, 0))
230
if event.data.has_key('calibration_db'): # Channel has a relevant value, store it
232
reference = event.data['calibration']
233
drawer = self.blobWriterOffline.getDrawer(part, mod-1)
235
drawer.setData(int(chan), int(gain), 0, drawer_R.getData(chan, gain, 0))
236
drawer.setData(int(chan), int(gain), 1, float(reference))
237
drawer.setData(int(chan), int(gain), 2, drawer_R.getData(chan, gain, 2))
238
drawer.setData(int(chan), int(gain), 3, drawer_R.getData(chan, gain, 3))
240
elif event.data.has_key('is_OK'):
242
print 'No data, set default for region', region.GetHash()
243
drawer = self.blobWriterOffline.getDrawer(part, mod-1)
245
drawer.setData(int(chan), int(gain), 0, drawer_R.getData(chan, gain, 0))
246
drawer.setData(int(chan), int(gain), 1, float(-1))
247
drawer.setData(int(chan), int(gain), 2, drawer_R.getData(chan, gain, 2))
248
drawer.setData(int(chan), int(gain), 3, drawer_R.getData(chan, gain, 3))
250
# Then the other cases
252
elif self.runType=='cesium':
254
part, mod, chan, gain = region.GetNumber()
257
drawer = self.blobWriterOffline.getDrawer(part, mod-1)
258
if not region.GetEvents():
259
# region is empty, writing defaults
260
self.writeCsDef(region,drawer,chan,gain)
264
for event in region.GetEvents():
265
if event.runType==self.runType:
266
if event.data.has_key('calibration') and event.data['calibration']:
267
# channel was calibrated
269
drawer.setData(int(chan), int(gain), 0, event.data['calibration'])
270
drawer.setData(int(chan), int(gain), 1, -1.0)
271
drawer.setData(int(chan), int(gain), 2, event.data['HV'])
272
drawer.setData(int(chan), int(gain), 3, event.data['temp'])
274
self.writeCsDef(region,drawer,chan,gain)
279
x, y, z, w = region.GetNumber()
282
for event in region.GetEvents():
283
if event.runType == self.runType:
284
if event.data.has_key('calibratableRegion') and event.data['calibratableRegion']:
285
if event.data.has_key('mean'):
286
calibration = event.data['mean']
291
print 'region updated: ', region.GetHash(), calibration
292
modBlob = self.blobWriterOnline.getDrawer(int(x), int(y-1))
293
modBlob.setData(int(z), int(w), 0, float(calibration))
295
modBlob = self.blobWriterOffline.getDrawer(int(x), int(y-1))
296
modBlob.setData(int(z), int(w), int(0), float(calibration))
298
default_val = (64.*1023./800.) # highgain
299
if 'low' in region.GetHash():
300
default_val = (1023./800.)
302
print 'region default: ', region.GetHash(), default_val
304
modBlob = self.blobWriterOnline.getDrawer(int(x), int(y-1))
305
modBlob.setData(int(z), int(w), 0, float(default_val))
307
modBlob = self.blobWriterOffline.getDrawer(int(x), int(y-1))
308
modBlob.setData(int(z), int(w), int(0), float(default_val))
310
def writeCsDef(self,region,drawer,chan,gain):
313
tower=region.GetParent('physical').GetParent('physical')
314
if 'sD' in tower.GetHash():
316
if 'sE' in tower.GetHash():
318
drawer.setData(int(chan), int(gain), 0, calibration)
319
drawer.setData(int(chan), int(gain), 1, -1.0)
320
drawer.setData(int(chan), int(gain), 2, 700.0 )
321
drawer.setData(int(chan), int(gain), 3, 20.0)