Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-11-26 02:34:40

0001 #!/usr/bin/env python3
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)