Jpp 19.3.0-rc.2
the software that should make you happy
Loading...
Searching...
No Matches
JDiffAcousticsEvent.cc File Reference

Program to compare acoustics event data. More...

#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>
#include "TROOT.h"
#include "TFile.h"
#include "JAcoustics/JEvent.hh"
#include "JAcoustics/JSupport.hh"
#include "JSupport/JSingleFileScanner.hh"
#include "JLang/JException.hh"
#include "JLang/JComparator.hh"
#include "JLang/JComparison.hh"
#include "Jeep/JParser.hh"
#include "Jeep/JMessage.hh"

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 

Detailed Description

Program to compare acoustics event data.

Author
mdejong

Definition in file JDiffAcousticsEvent.cc.

Function Documentation

◆ main()

int main ( int argc,
char ** argv )

Definition at line 239 of file JDiffAcousticsEvent.cc.

240{
241 using namespace std;
242 using namespace JPP;
243
244 vector<string> inputFile;
245 JLimit numberOfEvents;
246 int option;
247 int debug;
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]");
254 zap['n'] = make_field(numberOfEvents) = JLimit::max();
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;
257 zap['d'] = make_field(debug) = 2;
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());
270 const printer print = { debug, width };
271
272 vector<JEvent> buffer[2];
273
274 for (int i = 0; i != 2; ++i) {
275
276 for (JSingleFileScanner<JEvent> in(inputFile[i], numberOfEvents); in.hasNext(); ) {
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
292 for (vector<JEvent>::iterator p = buffer[i].begin(); p != buffer[i].end(); ++p) {
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]) {
309 print(cout, inputFile[1], distance(buffer[1].cbegin(),p1), *p1, "<<", "");
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, "", "\\");
319 print(cout, inputFile[1], distance(buffer[1].cbegin(),p1), *p1, "", "/ ");
320
321 } else {
322
323 ++count[1];
324
325 print(cout, inputFile[0], distance(buffer[0].cbegin(),p0), *p0, "", "*");
326 print(cout, inputFile[1], distance(buffer[1].cbegin(),p1), *p1, "", "*");
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, ">>", "");
364 print(cout, inputFile[1], distance(buffer[1].cbegin(),p1), *p1, "<<", "");
365 }
366 }
367
368 if (toa(*p0,*p1) || toa(*p1,*p0)) {
369
370 } else {
371
372 ++p0;
373 ++p1;
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}
TPaveText * p1
#define STATUS(A)
Definition JMessage.hh:63
#define FATAL(A)
Definition JMessage.hh:67
int debug
debug level
Definition JSirene.cc:72
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition JParser.hh:2142
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.
Definition JParser.hh:1698
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.
Definition JLimit.hh:45
static counter_type max()
Get maximum counter value.
Definition JLimit.hh:128