11 from __future__
import print_function
14 from multiprocessing
import Process, Queue
16 from Configurables
import LHCbApp
18 from ROOT
import TBuffer, TBufferFile, TFile
20 from GaudiPython
import AppMgr, gbl
32 tf = TFile(fname,
"REC")
36 importOptions(
"$ENV_PROJECT_SOURCE_DIR/RootCnv/options/Setup.opts")
43 ApplicationMgr(OutputLevel=ERROR, AppName=
"File Check - Serial vs Parallel")
51 pf = TFile(pname,
"REC")
52 sf = TFile(sname,
"REC")
54 pfks = pf.GetListOfKeys()
55 sfks = sf.GetListOfKeys()
56 pfkeys = list([pfk.GetName()
for pfk
in pfks])
58 sfkeys = list([sfk.GetName()
for sfk
in sfks])
64 if k.startswith(event):
66 elif k.startswith(
"##"):
74 if k.startswith(event):
76 elif k.startswith(
"##"):
84 print(
"Meta Data differs")
89 print(
"Event data differs")
97 print(
"Extra Data in parallel file : ", pExtra)
99 print(
"Extra Data in serial file : ", sExtra)
101 print(
"Files will have different sizes")
109 nkeys = len(d.keys())
113 if vals.count(v) > 1:
114 print(
"Dictionary cannot be switched, values not unique")
116 print(
"Dict has keys/values : %i/%i" % (nkeys, nvals))
119 for k, entry
in pairs:
133 print(
"Dictionary %s : " % (name))
134 for k
in iter(d.keys()):
135 print(
"\t", k,
"\t", d[k])
139 def Reader(readerType, filename, qacross, qToEngine):
156 header =
"/Event/Rec/Header"
166 eNumber = int(evt[header].evtNumber())
172 if readerType == SER:
179 elif readerType == PAR:
181 for serOrder
in iter(qacross.get,
None):
183 lsks = len(serOrder.keys())
184 lpks = len(order.keys())
185 print(
"Events in Files (serial/parallel) : %i / %i" % (lsks, lpks))
189 for i
in iter(serOrder.keys()):
190 if readerType == PAR:
191 i = order[serOrder[i]]
193 a.runSelectedEvents(fname, i)
197 ascii = dict([(l, (evt[l].__class__.__name__, evt[l].
__repr__()))
for l
in lst])
200 print(
"%s Reader Finished" % (readerType))
216 if pitem == sitem ==
None:
217 print(
"Termination Signals received ok")
220 print(
"pitem != sitem : ", pitem, sitem)
223 print(
"pitem != sitem : ", pitem, sitem)
227 print(
"Comparison Engine Finished")
229 print(
"Total Events Checked : %i" % (len(results)))
230 print(
"Perfect Matches : %i" % (sum(results)))
231 print(
"Errors : %i" % (len(results) - sum(results)))
244 ref =
"DataObject at 0x"
245 if a[:16] == b[:16] == ref:
260 if len(sks) == len(pks):
271 extras = list(set(pks) - set(sks))
273 if p[e][0] ==
"DataObject":
276 print(
"Extra Other thing found!", e, p[e][0])
291 if s[key][0] == p[key][0]:
296 if s[key][1] == p[key][1]:
312 print(
"Checking File Records")
314 parFSR = GetFSRdicts(par)
315 serFSR = GetFSRdicts(ser)
317 diff1 = set(parFSR[
"TimeSpanFSR"].
iteritems()) - set(
320 diff2 = set(parFSR[
"EventCountFSR"].
iteritems()) - set(
325 "\nDifferent entries in TimeSpanFSR: \t"
327 +
"\nDifferent entries in EventCountFSR:\t"
331 for k
in [
"LumiFSRBeamCrossing",
"LumiFSRBeam2",
"LumiFSRNoBeam"]:
332 diff3 = set(parFSR[k][
"key"]) - set(serFSR[k][
"key"])
333 diff4 = set(parFSR[k][
"incr"]) - set(serFSR[k][
"incr"])
334 diff5 = set(parFSR[k][
"integral"]) - set(serFSR[k][
"integral"])
336 "Different entries in "
354 for r
in lumi.runNumbers():
357 for f
in lumi.fileIDs():
360 sa = s.split(
"info (key/incr/integral) : ")[-1]
361 sa = sa.split(
"/")[:-1]
367 k, i, t = rec.split()
370 integral.append(int(t))
372 return (runs, files, key, incr, integral)
378 "TimeSpanFSR": {
"earliest": 0,
"latest": 0},
379 "LumiFSRBeamCrossing": {
"key": 0,
"incr": 0,
"integral": 0},
380 "LumiFSRBeam1": {
"key": 0,
"incr": 0,
"integral": 0},
381 "LumiFSRBeam2": {
"key": 0,
"incr": 0,
"integral": 0},
382 "LumiFSRNoBeam": {
"key": 0,
"incr": 0,
"integral": 0},
383 "EventCountFSR": {
"input": 0,
"output": 0,
"statusFlag": 0},
387 "from LumiAlgs.LumiFsrReaderConf import LumiFsrReaderConf as LumiFsrReader; LumiFsrReader().OutputLevel = INFO; LumiFsrReader().inputFiles = ['%s'] ;"
390 options +=
"LumiFsrReader().Persistency='ROOT'; LumiFsrReader().EvtMax = 1; from Configurables import LHCbApp; LHCbApp().Persistency='ROOT'; from Configurables import CondDB, DDDBConf;"
391 options +=
" CondDB().UseLatestTags=['%s']; DDDBConf(DataType='%s');" % (2011, 2011)
395 fsr = app.filerecordsvc()
397 lst = fsr.getHistoNames()
402 ob = fsr.retrieveObject(l)
406 assert ob.numberOfObjects() == 1
407 k = ob.containedObject(0)
408 runs, files, keys, increment, integral =
LumiFSR(k)
410 FSR[l[l.rfind(
"/") + 1 :]][
"runs"] = runs
411 FSR[l[l.rfind(
"/") + 1 :]][
"files"] = files
412 FSR[l[l.rfind(
"/") + 1 :]][
"key"] = keys
413 FSR[l[l.rfind(
"/") + 1 :]][
"incr"] = increment
414 FSR[l[l.rfind(
"/") + 1 :]][
"integral"] = integral
416 if "TimeSpanFSR" in l:
418 FSR[
"TimeSpanFSR"][
"earliest"] = ob.containedObject(0).earliest()
419 FSR[
"TimeSpanFSR"][
"latest"] = ob.containedObject(0).latest()
421 if "EventCountFSR" in l:
423 FSR[
"EventCountFSR"][
"input"] = ob.input()
424 FSR[
"EventCountFSR"][
"output"] = ob.output()
425 FSR[
"EventCountFSR"][
"statusFlag"] = ob.statusFlag()
438 print(
"Comparing File Records")
440 diff1 = set(parFSR[
"TimeSpanFSR"].
iteritems()) - set(
443 diff2 = set(parFSR[
"EventCountFSR"].
iteritems()) - set(
448 "\nDifferent entries in TimeSpanFSR: \t"
450 +
"\nDifferent entries in EventCountFSR:\t"
454 for k
in [
"LumiFSRBeamCrossing",
"LumiFSRBeam2",
"LumiFSRNoBeam"]:
455 diff3 = set(parFSR[k][
"key"]) - set(serFSR[k][
"key"])
456 diff4 = set(parFSR[k][
"incr"]) - set(serFSR[k][
"incr"])
457 diff5 = set(parFSR[k][
"integral"]) - set(serFSR[k][
"integral"])
459 "Different entries in "
469 print(
"\nParallel: \n" + str(parFSR))
470 print(
"\nSerial: \n" + str(serFSR))
473 if __name__ ==
"__main__":
479 "Please supply two arguments : > python loadFile <parallelFile> <serialFile>"
483 par =
"PFN:" + args[0]
484 ser =
"PFN:" + args[1]
485 print(
"Parallel File to be analysed : %s" % (par))
486 print(
"Serial File to be analysed : %s" % (ser))
495 par = Process(target=Reader, args=(PAR, par, qacross, pout))
496 ser = Process(target=Reader, args=(SER, ser, qacross, sout))
497 com = Process(target=ComparisonEngine, args=(pout, sout))
504 print(
"Check File Records")
512 sp = Process(target=GetFSRdict, args=(ser, sout))
513 pp = Process(target=GetFSRdict, args=(par, pout))
514 cp = Process(target=CompareFSR, args=(pout, sout))