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.