316{
319
321
323 JLimit_t& numberOfEvents = inputFile.getLimit();
324
325 struct {
326 int factoryLimit = 100000;
327 int numberOfHits = 0;
328 double Q = 0.0;
329 double TMax_s = 0.0;
330 double DMax_m = 500.0;
331 double ZMax_m = 200.0;
332 double TMaxExtra_s = 100.0e-6;
333 double TMaxVertex_s = 1.0e-2;
334 double gridAngle_deg = 10.0;
335 } parameters;
336
342 string detectorFile;
343 int waveform;
345
346 try {
347
349
359
360 JParser<> zap(
"Main program to trigger acoustic data.");
361
370 zap[
'a'] =
make_field(detectorFile,
"detector file");
371 zap[
'W'] =
make_field(waveform,
"waveform identifier");
373
374 zap(argc, argv);
375 }
376 catch(const exception &error) {
377 FATAL(error.what() << endl);
378 }
379
381
382 try {
384 }
387 }
388
390
392
393 const double v0 = V(cylinder.getZmax());
394
395 if (parameters.TMax_s < parameters.DMax_m / v0) {
396
397 parameters.TMax_s = parameters.DMax_m / v0;
398
399 NOTICE(
"Set maximal time [s] " <<
FIXED(7,3) << parameters.TMax_s << endl);
400 }
401
402 const JMatch3D match3D(v0, parameters.DMax_m, parameters.TMaxExtra_s);
403 const JMatch1D match1D(v0, parameters.DMax_m, parameters.ZMax_m, parameters.TMaxExtra_s);
404
406
407 const JCheck check(X, Y, Z, v0, parameters.TMaxVertex_s, parameters.numberOfHits);
408
411
412
414
415 const JPosition3D center(cylinder.getX(), cylinder.getY(), 0.5 * (cylinder.getZmin() + cylinder.getZmax()));
416
417 for (JDetector::const_iterator module =
detector.begin(); module !=
detector.end(); ++module) {
418
419 if (module->getFloor() != 0) {
420
421 receivers[module->getID()] =
JReceiver(module->getID(),
423 module->getT0() * 1.0e-9);
424 }
425 }
426
427 TH1D h0("h0", NULL, 21, -0.5, 20.5);
428
430
431 for (size_t i = 2; i <= 5; ++i) {
432 M1[i] =
new TH1D(
MAKE_CSTRING(
"M[" << i <<
"]"), NULL, 1001, -0.5, 1000.5);
433 }
434
436
439 }
440
442
443
444
446
448
450
453 }
454
456
458 FATAL(
"Invalid detector identifier " << p->
DETID <<
" != " <<
detector.getID() << endl);
459 }
460
462
464
466
467 const double toa = p->
TOA_S();
468
475
477 }
478 }
479 }
481
482
484
485
488
489 const chrono::steady_clock::time_point t0 = chrono::steady_clock::now();
490
491 size_t trigger_counter = 0;
492
493 for (buffer_type::const_iterator p =
data.begin(), q = p; p !=
data.end(); ++p) {
494
496
497
498 const chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
499
502 <<
FIXED(8,1) << p->getToA() <<
" [s]" <<
' '
503 << setw(6) << chrono::duration_cast<chrono::seconds>(t1 - t0).count() << " [s]" << ' '
504 << setw(6) << trigger_counter << endl);
505 }
506
507 h0.Fill(0.0);
508
509 while (q !=
data.end() && q->getToA() - p->getToA() <= parameters.TMax_s) { ++q; }
510
511 if (
distance(p,q) >= parameters.numberOfHits) {
512
513 h0.Fill(1.0);
514
515 if (
distance(p,q) < parameters.factoryLimit) {
516
517 h0.Fill(2.0);
518
519 buffer_type::iterator
root = buffer.begin();
520 buffer_type::iterator __p = buffer.begin();
521 buffer_type::iterator __q = buffer.begin();
522
524
525 ++__p;
526 ++__q;
527
528 for (buffer_type::const_iterator i = p; ++i != q; ) {
529 if (match3D(*
root,*i)) {
530 *(__q++) = *i;
531 }
532 }
533
535
537
538 h0.Fill(3.0);
539
541
543
545
546 h0.Fill(4.0);
547
548 const double W = 1.0 / (double) rotator.size();
549
551
552 for (buffer_type::iterator i =
root; i != __q; ++i) {
553 i->rotate(R);
554 }
555
556 buffer_type::iterator __z = partition(__p, __q,
JBind2nd(match1D,*
root));
557
559
561
562 h0.Fill(5.0, W);
563
565
567
569
570 h0.Fill(6.0, W);
571
572 if (!check.is_valid() || check(*
root, __p, __z)) {
573
574 trigger_counter += 1;
575
576 h0.Fill(7.0, W);
577
578 out[1] =
JEvent(
detector.getID(), out[0].getCounter() + 1, waveform, p, q);
579
580 break;
581 }
582 }
583 }
584 }
585 }
586 }
587
588 } else {
589
590 trigger_counter += 1;
591
592 out[1] =
JEvent(
detector.getID(), out[0].getCounter() + 1, waveform, p, q);
593 }
594
595 if (!out[1].empty()) {
596
597 if (out[0].empty()) {
598
599 out[0] = out[1];
600
601 }
else if (
overlap(out[0],out[1])) {
602
603 out[0].
merge(out[1]);
604
605 } else {
606
608
610
611 out[0] = out[1];
612 }
613 }
614
615 out[1].clear();
616 }
617 }
618
619 if (!out[0].empty()) {
620
622
624 }
626
628
629 for (TH1D* h1 : M1) {
630 if (h1 != NULL) {
632 }
633 }
634
636
638
640}
#define DEBUG(A)
Message macros.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
#define MAKE_CSTRING(A)
Make C-string.
#define gmake_property(A)
macros to convert (template) parameter to JPropertiesElement object
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
3D match criterion for acoustic signals.
Utility class to parse parameter values.
Data structure for angles in three dimensions.
Direction set covering (part of) solid angle.
Data structure for position in three dimensions.
const JPosition3D & getPosition() const
Get position.
Utility class to parse command line options.
General purpose class for object reading from a list of file names.
virtual bool hasNext() override
Check availability of next element.
counter_type getCounter() const
Get counter.
virtual const pointer_type & next() override
Get next element.
static const JSoundVelocity getSoundVelocity(1541.0, -17.0e-3, -2000.0)
Function object for velocity of sound.
std::ostream & print(std::ostream &out, const JTestSummary &summary, const char delimiter=' ', const bool useColors=true)
Print test summary.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
JPosition3D getPiezoPosition()
Get relative position of piezo in optical module.
JComparator< JResult_t T::*, JComparison::lt > make_comparator(JResult_t T::*member)
Helper method to create comparator between values of data member.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
std::vector< JHitW0 > buffer_type
hits
JBinder2nd< JHit_t > JBind2nd(const JMatch< JHit_t > &match, const JHit_t &second)
Auxiliary method to create JBinder2nd object.
JHitIterator_t clusterize(JHitIterator_t __begin, JHitIterator_t __end, const JMatch_t &match, const int Nmin=1)
Partition data according given binary match operator.
Auxiliary data structure for floating point format specification.
Auxiliary data structure for final check on event.
Match of two events considering overlap in time and position.
void merge(const JEvent &event)
Merge event.
double getT(const double t_s) const
Get corrected time.
Implementation for depth dependend velocity of sound.
JSoundVelocity & set(const double z0)
Set depth.
Time-of-arrival data from acoustic piezo sensor or hydrophone.
uint32_t DOMID
DAQ run number.
uint32_t QUALITYFACTOR
The ticks (16ns) part of the DAQ frame timestamp.
uint32_t QUALITYNORMALISATION
A measure of how good the waveform match was to the signal.
int32_t WAVEFORMID
DOM unique identifeir.
int32_t RUN
detector identifier
double TOA_S() const
Time of Arrival, expressed in seconds relative to Unix epoch (1 January 1970 00:00:00 UTC)
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Auxiliary class for defining the range of iterations of objects.
static counter_type max()
Get maximum counter value.