11package org .jlab .utils ;
22
3+ import java .util .ArrayList ;
4+ import java .util .HashMap ;
5+ import java .util .Map ;
36import org .jlab .jnp .hipo4 .io .HipoReader ;
47import org .jlab .jnp .hipo4 .data .Bank ;
58import org .jlab .jnp .hipo4 .data .Event ;
69import org .jlab .jnp .hipo4 .data .Schema ;
7- import java . util . HashMap ;
10+ import org . jlab . jnp . hipo4 . data . SchemaFactory ;
811import org .jlab .utils .options .OptionParser ;
912
1013public class HipoDiff {
1114
15+ static int nrow = 0 ;
16+ static int nevent = -1 ;
17+ static int nentry = 0 ;
18+ static int nbadevent = 0 ;
19+ static int nbadrow = 0 ;
20+ static int nbadentry = 0 ;
21+ static double tolerance ;
22+ static boolean verboseMode = false ;
23+ static boolean quietMode = false ;
24+ static Bank runConfigBank = null ;
25+ static SchemaFactory schemaFactory = null ;
26+ static ArrayList <Bank > banksA = new ArrayList <>();
27+ static ArrayList <Bank > banksB = new ArrayList <>();
28+ static HashMap <String , HashMap <String ,Integer >> badEntries = new HashMap <>();
29+
1230 public static void main (String args []) {
1331
1432 OptionParser op = new OptionParser ("hipo-diff" );
1533 op .addOption ("-t" , "0.00001" , "absolute tolerance for comparisons" );
1634 op .addOption ("-n" , "-1" , "number of events" );
17- op .addRequired ("-b" , "name of bank to diff" );
35+ op .addOption ("-q" , null , "quiet mode" );
36+ op .addOption ("-Q" , null , "verbose mode" );
37+ op .addOption ("-b" , null ,"name of bank to diff" );
1838 op .setRequiresInputList (true );
1939 op .parse (args );
2040 if (op .getInputList ().size () != 2 ) {
@@ -23,120 +43,126 @@ public static void main(String args[]) {
2343 System .exit (1 );
2444 }
2545
26- final String bankName = op .getOption ("-b " ).stringValue ();
27- final double tolerance = op .getOption ("-t " ).doubleValue () ;
46+ verboseMode = op .getOption ("-Q " ).stringValue () != null ;
47+ quietMode = op .getOption ("-q " ).stringValue () != null ;
2848 final int nmax = op .getOption ("-n" ).intValue ();
49+ tolerance = op .getOption ("-t" ).doubleValue ();
2950
3051 HipoReader readerA = new HipoReader ();
3152 HipoReader readerB = new HipoReader ();
3253 readerA .open (op .getInputList ().get (0 ));
3354 readerB .open (op .getInputList ().get (1 ));
34-
35- Schema schema = readerA .getSchemaFactory ().getSchema (bankName );
36- Bank bankA = new Bank (schema );
37- Bank bankB = new Bank (schema );
38-
39- Bank runConfigBank = new Bank (readerA .getSchemaFactory ().getSchema ("RUN::config" ));
40- Event event = new Event ();
41-
42- int nevent = -1 ;
43- int nrow = 0 ;
44- int nentry = 0 ;
45- int nbadevent = 0 ;
46- int nbadrow = 0 ;
47- int nbadentry = 0 ;
48- HashMap <String , Integer > badEntries = new HashMap <>();
49-
50- while (readerA .hasNext () && readerB .hasNext () && (nmax <1 || nevent <nmax )) {
51-
52- if (++nevent % 10000 == 0 ) {
53- System .out .println ("Analyzed " + nevent + " events" );
54- }
55-
56- readerA .nextEvent (event );
57- event .read (bankA );
58- readerB .nextEvent (event );
59- event .read (bankB );
60-
61- event .read (runConfigBank );
62-
63- if (bankA .getRows () != bankB .getRows ()) {
64- System .out .println ("========================= Different number of rows:" );
65- runConfigBank .show ();
66- bankA .show ();
67- bankB .show ();
68- nbadevent ++;
69- System .out .println ("=========================" );
55+ Event eventA = new Event ();
56+ Event eventB = new Event ();
57+
58+ schemaFactory = readerA .getSchemaFactory ();
59+ runConfigBank = new Bank (schemaFactory .getSchema ("RUN::config" ));
60+ if (op .getOption ("-b" ).stringValue () == null ) {
61+ for (Schema s : schemaFactory .getSchemaList ()) {
62+ banksA .add (new Bank (s ));
63+ banksB .add (new Bank (s ));
7064 }
65+ }
66+ else {
67+ banksA .add (new Bank (schemaFactory .getSchema (op .getOption ("-b" ).stringValue ())));
68+ banksB .add (new Bank (schemaFactory .getSchema (op .getOption ("-b" ).stringValue ())));
69+ }
7170
72- else {
73- for (int i = 0 ; i < bankA .getRows (); i ++) {
74- boolean mismatch = false ;
75- nrow ++;
76- for (int j = 0 ; j < schema .getElements (); j ++) {
77- final int type = schema .getType (j );
78- final String name = schema .getElementName (j );
79- int element = -1 ;
80- String values = "" ;
81- nentry ++;
82- switch (type ) {
83- case 1 :
84- if (bankA .getByte (name , i ) != bankB .getByte (name , i )) {
85- element = j ;
86- values += bankA .getByte (name , i ) + "/" + bankB .getByte (name , i );
87- }
88- break ;
89- case 2 :
90- if (bankA .getShort (name , i ) != bankB .getShort (name , i )) {
91- element = j ;
92- values += bankA .getShort (name , i ) + "/" + bankB .getShort (name , i );
93- }
94- break ;
95- case 3 :
96- if (bankA .getInt (name , i ) != bankB .getInt (name , i )) {
97- element = j ;
98- values += bankA .getInt (name , i ) + "/" + bankB .getInt (name , i );
99- }
100- break ;
101- case 4 :
102- if ((!Double .isNaN (bankA .getFloat (name , i )) || !Double .isNaN (bankB .getFloat (name , i )))
103- && (!Double .isInfinite (bankA .getFloat (name , i )) || !Double .isInfinite (bankB .getFloat (name , i )))
104- && Math .abs (bankA .getFloat (name , i ) - bankB .getFloat (name , i )) > tolerance ) {
105- element = j ;
106- values += bankA .getFloat (name , i ) + "/" + bankB .getFloat (name , i );
107- }
108- break ;
109- }
110- if (element >= 0 ) {
111- System .out .println ("mismatch at event " + runConfigBank .getInt ("event" , 0 )
112- + " in row " + i
113- + " for variable " + name
114- + " with values " + values );
115- mismatch = true ;
116- nbadentry ++;
117- if (badEntries .containsKey (schema .getElementName (element ))) {
118- int nbad = badEntries .get (schema .getElementName (element )) + 1 ;
119- badEntries .replace (schema .getElementName (element ), nbad );
120- } else {
121- badEntries .put (schema .getElementName (element ), 1 );
122- }
123- }
124- }
125- if (mismatch ) {
126- nbadrow ++;
127- }
128- }
129- }
71+ while (readerA .hasNext () && readerB .hasNext () && (nmax < 1 || nevent < nmax )) {
72+ if (++nevent % 10000 == 0 ) System .out .println ("Analyzed " + nevent + " events" );
73+ readerA .nextEvent (eventA );
74+ readerB .nextEvent (eventB );
75+ eventA .read (runConfigBank );
76+ compare (eventA , eventB );
13077 }
13178 System .out .println ("\n Analyzed " + nevent + " with " + nbadevent + " bad banks" );
13279 System .out .println (nbadrow + "/" + nrow + " mismatched rows" );
13380 System .out .println (nbadentry + "/" + nentry + " mismatched entry" );
13481 for (String name : badEntries .keySet ()) {
13582 System .out .println (name + " " + badEntries .get (name ));
13683 }
84+ System .exit (nbadevent + nbadrow + nbadentry );
85+ }
13786
138- if (nbadevent + nbadrow + nbadentry > 0 ) {
139- System .exit (7 );
87+ public static void compare (Event a , Event b ) {
88+ for (int i =0 ; i <banksA .size (); i ++) {
89+ a .read (banksA .get (i ));
90+ b .read (banksB .get (i ));
91+ compare (banksA .get (i ),banksB .get (i ));
92+ }
93+ }
94+
95+ public static void compare (Bank a , Bank b ) {
96+
97+ if (a .getRows () != b .getRows ()) {
98+ System .out .println ("========================= Different number of rows:" );
99+ runConfigBank .show ();
100+ a .show ();
101+ b .show ();
102+ nbadevent ++;
103+ System .out .println ("=========================" );
104+ }
105+ else {
106+ for (int i = 0 ; i < a .getRows (); i ++) {
107+ boolean mismatch = false ;
108+ nrow ++;
109+ for (int j = 0 ; j < a .getSchema ().getElements (); j ++) {
110+ final int type = a .getSchema ().getType (j );
111+ final String name = a .getSchema ().getElementName (j );
112+ int element = -1 ;
113+ String values = "" ;
114+ nentry ++;
115+ switch (type ) {
116+ case 1 :
117+ if (a .getByte (name , i ) != b .getByte (name , i )) {
118+ element = j ;
119+ values += a .getByte (name , i ) + "/" + b .getByte (name , i );
120+ }
121+ break ;
122+ case 2 :
123+ if (a .getShort (name , i ) != b .getShort (name , i )) {
124+ element = j ;
125+ values += a .getShort (name , i ) + "/" + b .getShort (name , i );
126+ }
127+ break ;
128+ case 3 :
129+ if (a .getInt (name , i ) != b .getInt (name , i )) {
130+ element = j ;
131+ values += a .getInt (name , i ) + "/" + b .getInt (name , i );
132+ }
133+ break ;
134+ case 4 :
135+ if ((!Double .isNaN (a .getFloat (name , i )) || !Double .isNaN (b .getFloat (name , i )))
136+ && (!Double .isInfinite (a .getFloat (name , i )) || !Double .isInfinite (b .getFloat (name , i )))
137+ && Math .abs (a .getFloat (name , i ) - b .getFloat (name , i )) > tolerance ) {
138+ element = j ;
139+ values += a .getFloat (name , i ) + "/" + b .getFloat (name , i );
140+ }
141+ break ;
142+ }
143+ if (element >= 0 ) {
144+ if (verboseMode ) {
145+ System .out .println ("Bank.show " +a .getSchema ().getName ());
146+ a .show ();
147+ b .show ();
148+ }
149+ if (!quietMode ) {
150+ System .out .println (a .getSchema ().getName ()+" mismatch at event " + runConfigBank .getInt ("event" , 0 )
151+ + " in row " + i + " for variable " + name + " with values " + values );
152+ }
153+ mismatch = true ;
154+ nbadentry ++;
155+ String bankName = a .getSchema ().getName ();
156+ String elementName = a .getSchema ().getElementName (element );
157+ if (!badEntries .containsKey (bankName )) badEntries .put (bankName , new HashMap <>());
158+ Map <String ,Integer > m = badEntries .get (bankName );
159+ if (!m .containsKey (elementName )) m .put (elementName , 0 );
160+ m .put (elementName , m .get (elementName )+1 );
161+ }
162+ }
163+ if (mismatch ) nbadrow ++;
164+ }
140165 }
141166 }
167+
142168}
0 commit comments