File indexing completed on 2024-11-26 02:34:40
0001
0002
0003 import argparse
0004 import itertools
0005 import collections
0006
0007 import Validation.RecoTrack.plotting.ntuple as ntuple
0008
0009 def body(opts, ev1, ev2, printTrack):
0010 print(ev1.eventIdStr())
0011
0012 tracks1 = ev1.tracks()
0013 tracks2 = ev2.tracks()
0014
0015 singleTrack = (opts.track is not None)
0016 if singleTrack:
0017 tracks1 = [tracks1[opts.track]]
0018
0019 diff = ntuple.diffTrackListsGeneric(printTrack, tracks1, tracks2, ignoreAdditionalLst2=singleTrack)
0020 if diff.hasDifference():
0021 print(str(diff))
0022 print()
0023
0024 def inOrder(opts, ntpl1, ntpl2, *args, **kwargs):
0025 if opts.entry is not None:
0026 ev1 = ntpl1.getEvent(opts.entry)
0027 ev2 = ntpl2.getEvent(opts.entry)
0028
0029 if ev1.eventId() != ev2.eventId():
0030 raise Exception("Events are out of order, entry %d file1 has %s and file %s. Use --outOfOrder option instead." % (ev1.entry(), ev1.eventIdStr(), ev2.eventIdStr()))
0031
0032 body(opts, ev1, ev2, *args, **kwargs)
0033 return
0034
0035 for i, (ev1, ev2) in enumerate(itertools.izip(ntpl1, ntpl2)):
0036 if opts.maxEvents >= 0 and i >= opts.maxEvents:
0037 break
0038
0039 if ev1.eventId() != ev2.eventId():
0040 raise Exception("Events are out of order, entry %d file1 has %s and file %s. Use --outOfOrder option instead." % (ev1.entry(), ev1.eventIdStr(), ev2.eventIdStr()))
0041
0042 body(opts, ev1, ev2, *args, **kwargs)
0043
0044
0045 def outOfOrder(opts, ntpl1, ntpl2, *args, **kwargs):
0046 if opts.entry is not None:
0047 raise Exception("--entry does not make sense with --outOfOrder")
0048
0049 events2 = collections.OrderedDict()
0050 for ev2 in ntpl2:
0051 events2[ev2.eventIdStr()] = ev2.entry()
0052
0053 for i, ev1 in enumerate(ntpl1):
0054 if opts.maxEvents >= 0 and i >= opts.maxEvents:
0055 break
0056
0057 if not ev1.eventId() in events2:
0058 print("-", ev1.eventIdStr())
0059 continue
0060
0061 ev2 = ntpl2.getEvent(events2[ev1.eventIdStr()])
0062 events2.remove(ev1.eventId())
0063
0064 body(opts, ev1, ev2, *args, **kwargs)
0065
0066
0067 for eventIdStr in events2.iterkeys():
0068 print("+", eventIdStr)
0069
0070 def main(opts):
0071 ntpl1 = ntuple.TrackingNtuple(opts.file1)
0072 ntpl2 = ntuple.TrackingNtuple(opts.file2)
0073
0074 print("--- %s" % opts.file1)
0075 print("+++ %s" % opts.file2)
0076
0077 printTrack = ntuple.TrackPrinter(trackingParticlePrinter=ntuple.TrackingParticlePrinter(parentage=False), diffForTwiki=opts.twiki)
0078
0079 if opts.outOfOrder:
0080 outOfOrder(opts, ntpl1, ntpl2, printTrack)
0081 else:
0082 inOrder(opts, ntpl1, ntpl2, printTrack)
0083
0084 if __name__ == "__main__":
0085 parser = argparse.ArgumentParser(description="Unified diff of two TrackingNtuple files (clusters i.e. hits and TrackingParticles are assumed to be the same")
0086 parser.add_argument("file1", type=str,
0087 help="File1")
0088 parser.add_argument("file2", type=str,
0089 help="File2")
0090 parser.add_argument("--outOfOrder", action="store_true",
0091 help="Set this if events are in different order in the files")
0092 parser.add_argument("--twiki", action="store_true",
0093 help="Additional twiki-friendly diff formatting")
0094 parser.add_argument("--maxEvents", type=int, default=-1,
0095 help="Maximum number of events to process (default: -1 for all events)")
0096 parser.add_argument("--entry", type=int, default=None,
0097 help="Make diff only for this entry")
0098 parser.add_argument("--track", type=int,
0099 help="Make diff only for this track (indexing from FILE1; only if --entry is given)")
0100
0101 opts = parser.parse_args()
0102
0103 if opts.track is not None and opts.entry is None:
0104 parser.error("With --track need --entry, which was not given")
0105 main(opts)