240{
  243  
  246  int            option;
  248 
  249  try {
  250 
  251    JParser<> zap(
"Program to compare acoustics event data.");
 
  252    
  253    zap[
'f'] = 
make_field(inputFile,  
"two outputs of JAcousticsEventBuilder[.sh]");
 
  255    zap[
'O'] = 
make_field(option,     Null_t << 
" -> nothing " << Sort_t << 
" -> sort")  = Null_t, Sort_t;
 
  256    zap[
'C'] = 
make_field(cta,        ToA_t  << 
" -> ToA "     << ToE_t  << 
" -> ToE")   = ToA_t,  ToE_t;
 
  258 
  259    zap(argc, argv);
  260  }
  261  catch(const exception &error) {
  262    FATAL(error.what() << endl);
 
  263  }
  264 
  265  if (inputFile.size() != 2u) {
  266    FATAL(
"Wrong number of input files " << inputFile.size() << endl); 
 
  267  }
  268 
  269  const size_t  width = max(inputFile[0].size(), inputFile[1].size());
  271  
  273 
  274  for (int i = 0; i != 2; ++i) {
  275    
  277      buffer[i].push_back(*in.next());
  278    }
  279  }
  280 
  281  if (option == Sort_t) {
  282 
  283    for (int i = 0; i != 2; ++i) {
  284 
  285      for (
JEvent& evt : buffer[i]) {
 
  286        sort(evt.begin(), evt.end(), compare);
  287      }
  288 
  289      if (cta == ToA_t) { sort(buffer[i].begin(), buffer[i].end(), toa); }
  290      if (cta == ToE_t) { sort(buffer[i].begin(), buffer[i].end(), toe); }
  291 
  293        sort(p->begin(), p->end(), compare);
  294      }
  295    }
  296  }
  297 
  298  int count[] = { 0, 0 };
  299  
  300  for (vector<JEvent>::const_iterator
  301         p0 = buffer[0].begin(),
  302         p1 = buffer[1].begin(); p0 != buffer[0].end() && 
p1 != buffer[1].end(); ) {
 
  303 
  304    for ( ; p0 != buffer[0].end() && 
p1 != buffer[1].end() && ((cta == ToA_t && toa(*p0,*
p1)) || (cta == ToE_t && toe(*p0,*
p1))); ++p0, ++count[1]) {
 
  305      print(cout, inputFile[0], 
distance(buffer[0].cbegin(),p0), *p0, 
">>", 
"");
 
  306    }
  307 
  308    for ( ; p0 != buffer[0].end() && 
p1 != buffer[1].end() && ((cta == ToA_t && toa(*
p1,*p0)) || (cta == ToE_t && toe(*
p1,*p0))); ++
p1, ++count[1]) {
 
  310    }
  311 
  312    if (p0 != buffer[0].end() && 
p1 != buffer[1].end()) {
 
  313 
  314      if (!compare(*p0,*
p1) && !compare(*
p1,*p0)) {
 
  315 
  316        ++count[0];
  317 
  318        print(cout, inputFile[0], 
distance(buffer[0].cbegin(),p0), *p0, 
"", 
"\\");
 
  320 
  321      } else {
  322        
  323        ++count[1];
  324 
  325        print(cout, inputFile[0], 
distance(buffer[0].cbegin(),p0), *p0, 
"", 
"*");
 
  327 
  328        if (p0->getDetectorID() == 
p1->getDetectorID() &&
 
  329            p0->getCounter()    == 
p1->getCounter()    &&
 
  330            p0->getID()         == 
p1->getID()) {
 
  331 
  332          JEvent::const_iterator i0 = p0->begin();
  333          JEvent::const_iterator i1 = 
p1->begin();
 
  334 
  335          while (i0 != p0->end() && i1 != 
p1->end()) {
 
  336 
  337            for ( ; i0 != p0->end() && i1 != 
p1->end() && compare(*i0,*i1); ++i0) {
 
  338              print(cout, *i0, 
">>", 
"");
 
  339            }
  340 
  341            for ( ; i0 != p0->end() && i1 != 
p1->end() && compare(*i1,*i0); ++i1) {
 
  342              print(cout, *i1, 
"<<", 
"");
 
  343            }
  344 
  345            if (i0 != p0->end() && i1 != 
p1->end()) {
 
  346              if (!compare(*i0, *i1) && !compare(*i1,*i0)) {
  347                ++i0;
  348                ++i1;
  349              }
  350            }
  351          }
  352 
  353          for ( ; i0 != p0->end(); ++i0) {
  354            print(cout, *i0, 
">>", 
"");
 
  355          }
  356 
  357          for ( ; i1 != 
p1->end(); ++i1) {
 
  358            print(cout, *i1, 
"<<", 
"");
 
  359          }
  360 
  361        } else {
  362 
  363          print(cout, inputFile[0], 
distance(buffer[0].cbegin(),p0), *p0, 
">>", 
"");
 
  365        }
  366      }
  367      
  368      if (toa(*p0,*
p1) || toa(*
p1,*p0)) {
 
  369 
  370      } else {
  371 
  372        ++p0;
  374      }
  375    }
  376  }
  377 
  378  STATUS(
"Number of differences / events: " << count[1] << 
" / " << count[0] << endl);
 
  379    
  380  if (buffer[0].size() != buffer[1].size()) {
  381    FATAL(
"Different size " << buffer[0].size() << 
' ' << buffer[1].size() << endl);
 
  382  }
  383  
  384  if (count[1] != 0) {
  385    FATAL(
"Number of differences " << count[1] << endl);
 
  386  }
  387}
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
 
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
 
Utility class to parse command line options.
 
Object reading from a list of files.
 
virtual bool hasNext() override
Check availability of next element.
 
std::ostream & print(std::ostream &out, const JTestSummary &summary, const char delimiter=' ', const bool useColors=true)
Print test summary.
 
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
 
Auxiliary class for defining the range of iterations of objects.
 
static counter_type max()
Get maximum counter value.