178 def stop(self):
179
180 from CoolConvUtilities.AtlCoolLib import indirectOpen
181
182
183 inconn = indirectOpen(self.indb, True)
184 if (inconn is None):
185 self.msg.
error(f
"Cannot connect to database {self.indb}")
186 raise RuntimeError(f"ERROR: Cannot connect to database {self.indb}")
187
188 contents = {}
189 contents2 = {}
190 try:
191 folder=inconn.getFolder(self.folder)
192 runiov=self.run << 32
193 obj=folder.findObject(runiov,0)
194 payload=obj.payload()
195
196 contents.update(payload_dict(payload))
197
198 except Exception as e:
199 self.msg.warning(f"Could not decode {self.folder} from {self.indb}\n{e}")
200 return StatusCode.Failure
201
202
203 if self.indb == self.patchdb:
204 inconn2=inconn
205 else:
206 inconn2 = indirectOpen(self.patchdb, True)
207 if (inconn2 is None):
208 self.msg.
error(f
"Cannot connect to database {self.patchdb}")
209 raise RuntimeError(f"ERROR: Cannot connect to database {self.patchdb}")
210
211 try:
212 folder=inconn2.getFolder(self.folder)
213 runiov=self.run << 32
214 obj=folder.findObject(runiov,0)
215 payload=obj.payload()
216 contents2.update(payload_dict(payload))
217 except Exception:
218 self.msg.warning(f"Could not decode {self.folder} from {self.patchdb}")
219 return StatusCode.Failure
220
221
222 dbSvc = cool.DatabaseSvcFactory.databaseService()
223 try:
224 outconn = dbSvc.openDatabase(self.outdb,False)
225 outfolder = outconn.getFolder(self.folder)
226 except Exception:
227
228 outconn = dbSvc.createDatabase(self.outdb)
229 folder = inconn.getFolder(self.folder)
230 fspec = folder.folderSpecification()
231 from CaloCondBlobAlgs import CaloCondTools
232 desc = CaloCondTools.getAthenaFolderDescr()
233 outfolder = outconn.createFolder(self.folder, fspec, desc, True)
234
235
236 spec = cool.RecordSpecification()
237
238 for k in contents.keys():
239 if isinstance(contents[k]["payload"], cppyy.gbl.coral.Blob):
240 spec.extend( k, cool.StorageType.Blob16M )
241 elif isinstance(contents[k]["payload"], int):
242 spec.extend( k, cool.StorageType.UInt32 )
243 else:
244 self.msg.
error(f
"CANNOT WORK OUT THE DATATYPE OF {k}: {contents[k]} FOR STORAGE")
245 return StatusCode.Failure
246
247 data = cool.Record( spec )
248
249 hash_max = self.onlineID.channelHashMax()
250 fsize = 4
251
252 btype=getattr(ROOT,"coral::Blob")
253 outblob = {}
254 vVec = {}
255 blobvals = [ k for k in contents.keys() if isinstance( contents[k]["payload"], cppyy.gbl.coral.Blob) ]
256 blobvals2 = [ k for k in contents2.keys() if isinstance( contents2[k]["payload"], cppyy.gbl.coral.Blob) ]
257
258 if len(blobvals) != len(blobvals2):
259 self.msg.
error(
"The same blob payloads are not present in the two dbs!\n(1) {blobvals}\n(2) {blobvals2}")
260 return StatusCode.Failure
261
262 for bv in blobvals:
263 vecLength = contents[bv]["size"]
264 blobsize = vecLength*hash_max*fsize
265 outblob[bv] = btype()
266 outblob[bv].resize(blobsize)
267
268 if blobsize != len(contents[bv]["payload"]):
269 self.msg.
error(f
'Wrong size {len(contents[bv]["payload"])} of the input blob, should be {blobsize}')
270 return StatusCode.Failure
271
272 vVec[bv] = ROOT.std.vector('float')(vecLength*hash_max)
273
274 blobdata = contents[bv][
"payload"].
read()
275
276 for i in range(0,hash_max):
277 if vecLength > 1:
278 for iv in range(0, vecLength):
279 vVec[bv][i*vecLength + iv] = float(struct.unpack('f',blobdata[(i*vecLength + iv)*fsize:((i*vecLength+iv)*fsize+fsize)])[0])
280 else:
281 vVec[bv][i] = float(struct.unpack('f',blobdata[i*fsize:(i*fsize+fsize)])[0])
282
283 if blobsize != len(contents2[bv]["payload"]):
284 self.msg.
error(f
'Wrong size {len(contents2[bv]["payload"])} of the input blob, should be {blobsize}')
285 return StatusCode.Failure
286
287
288 blobdata2 = contents2[bv][
"payload"].
read()
289 vecLength2 = contents2[bv]["size"]
290 if vecLength != vecLength2:
291 self.msg.
error(f
"Item {bv} has a different shape in the base and patch dbs! {vecLength} & {vecLength2}")
292 return StatusCode.Failure
293
294
295 for i in range(0,hash_max):
296 doPatch = patchChannel(self.onlineID, i, self.patchdet, self.patchFT, self.patchChan)
297 if doPatch:
298 if vecLength > 1:
299 for iv in range(0, vecLength):
300 vVec[bv][i*vecLength + iv] = float(struct.unpack('f',blobdata2[(i*vecLength + iv)*fsize:((i*vecLength+iv)*fsize+fsize)])[0])
301 else:
302 vVec[bv][i] = float(struct.unpack('f', blobdata2[i*fsize:(i*fsize+fsize)])[0])
303
304
305 writable_buf = { k:
array(
'f')
for k
in vVec.keys() }
306 buff = {}
307 for key in vVec.keys():
308 for i in range(0,vVec[key].size()):
309 writable_buf[key].append(vVec[key][i])
310
311 buff[key] = writable_buf[key].tobytes()
312
313 for j in range(0, len(buff[key])):
314 outblob[key][j] = buff[key][j]
315
316 data[key] = outblob[key]
317
318 tofill = [ k for k in contents.keys() if k not in outblob.keys() ]
319
320 for tf in tofill:
321 if contents[tf]["payload"] != contents2[tf]["payload"]:
322 self.msg.warning(f'Setting {tf} to {contents[tf]["payload"]}, but beware: the value is {contents2[tf]["payload"]} in the patching db')
323 data[tf] = contents[tf]["payload"]
324
325
326 outfolder.storeObject(self.iovSince, self.iovUntil, data, cool.ChannelId(0))
327
328
329 outconn.closeDatabase()
330
331 return StatusCode.Success
332
333
334
335
336
IovVectorMap_t read(const Folder &theFolder, const SelectionCriterion &choice, const unsigned int limit=10)