diff --git a/common-tools/clas-io/src/main/java/org/jlab/utils/HipoDiff.java b/common-tools/clas-io/src/main/java/org/jlab/utils/HipoDiff.java index 8826afff82..726eb129ce 100644 --- a/common-tools/clas-io/src/main/java/org/jlab/utils/HipoDiff.java +++ b/common-tools/clas-io/src/main/java/org/jlab/utils/HipoDiff.java @@ -4,6 +4,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; +import java.util.TreeMap; import org.jlab.jnp.hipo4.io.HipoReader; import org.jlab.jnp.hipo4.data.Bank; import org.jlab.jnp.hipo4.data.Event; @@ -96,6 +97,8 @@ public Bank getDiff(Bank b) { static double tolerance; static boolean verboseMode; static boolean quietMode; + static boolean sortEvents; + static int tag; static Bank runConfigBank; static HipoWriter writer; static Event event; @@ -112,7 +115,9 @@ public static void main(String args[]) { op.addOption("-Q", null, "verbose mode"); op.addOption("-b", null, "name of bank to diff"); op.addOption("-B", "", "names of banks to ignore (comma separated)"); - op.addOption("-s", null, "sort on column index"); + op.addOption("-s", null, "column indices to sort on (comma separated)"); + op.addOption("-e", null, "sort events by RUN::config.event"); + op.addOption("-T", "0", "event tag to compare"); op.addOption("-o", null, "output HIPO diff file"); op.setRequiresInputList(true); op.parse(args); @@ -128,8 +133,10 @@ public static void main(String args[]) { } verboseMode = op.getOption("-Q").stringValue() != null; quietMode = op.getOption("-q").stringValue() != null; + sortEvents = op.getOption("-e").stringValue() != null; nmax = op.getOption("-n").intValue(); tolerance = op.getOption("-t").doubleValue(); + tag = op.getOption("-T").intValue(); HipoReader readerA = new HipoReader(); HipoReader readerB = new HipoReader(); @@ -157,22 +164,64 @@ public static void main(String args[]) { writer.open(op.getOption("-o").stringValue()); } - compare(readerA, readerB); + compare(tag, readerA, readerB); if (writer != null) writer.close(); } - public static int compare(HipoReader a, HipoReader b) { + public static TreeMap getEventMap(int tag, HipoReader reader) { + TreeMap m = new TreeMap<>(); + ArrayList duplicates = new ArrayList<>(); + Event event = new Event(); + for (int eventIndex=0; eventIndex 0) { + int eventNumber = runConfigBank.getInt("event",0); + if (m.containsKey(eventNumber)) { + System.out.println("WARNING: Duplicate event number " + eventNumber + " at event index " + eventIndex); + duplicates.add(eventNumber); + } + else { + m.put(eventNumber, eventIndex); + } + } + } + m.keySet().removeAll(duplicates); + return m; + } + + public static int compare(int tag, HipoReader a, HipoReader b) { int ret=0; Event eventA = new Event(); Event eventB = new Event(); - while (a.hasNext() && b.hasNext() && (nmax < 1 || nevent < nmax)) { - if (++nevent % 5000 == 0) System.out.println("Analyzed " + nevent + " events"); - a.nextEvent(eventA); - b.nextEvent(eventB); - eventA.read(runConfigBank); - ret += compare(eventA, eventB); + if (sortEvents) { + TreeMap mapA = getEventMap(tag, a); + TreeMap mapB = getEventMap(tag, b); + for (Integer eventNumber : mapA.keySet()) { + if (mapB.containsKey(eventNumber)){ + if (nmax > 0 && nevent >= nmax) break; + if (++nevent % 5000 == 0) System.out.println("Analyzed " + nevent + " events"); + a.getEvent(eventA, mapA.get(eventNumber)); + b.getEvent(eventB, mapB.get(eventNumber)); + eventA.read(runConfigBank); + ret += compare(eventA, eventB); + } + } } + else { + a.setTags(tag); + b.setTags(tag); + while (a.hasNext() && b.hasNext() && (nmax < 1 || nevent < nmax)) { + if (++nevent % 5000 == 0) System.out.println("Analyzed " + nevent + " events"); + a.nextEvent(eventA); + b.nextEvent(eventB); + eventA.read(runConfigBank); + ret += compare(eventA, eventB); + } + } + System.out.println("\n Analyzed " + nevent + " with " + nbadevent + " bad banks"); System.out.println(nbadrow + "/" + nrow + " mismatched rows"); System.out.println(nbadentry + "/" + nentry + " mismatched entry");