428 typedef JTYPELIST<JEvent, JTriggerParameters, JMeta, TH1D, TGraph>::typelist typelist;
432 JMultipleFileScanner<JToA> inputFile;
433 JLimit_t& numberOfEvents = inputFile.getLimit();
435 int factoryLimit = 10000;
436 double TMaxExtra_s = 500.0e-6;
442 double fraction = 0.75;
444 JFileRecorder<typelist> outputFile;
454 JProperties properties;
456 properties.insert(gmake_property(parameters.
Q));
457 properties.insert(gmake_property(parameters.
TMax_s));
458 properties.insert(gmake_property(parameters.
numberOfHits));
459 properties.insert(gmake_property(fraction));
460 properties.insert(gmake_property(factoryLimit));
461 properties.insert(gmake_property(TMaxExtra_s));
462 properties.insert(gmake_property(RMax_m));
463 properties.insert(gmake_property(DMax_m));
464 properties.insert(gmake_property(Xv_m));
465 properties.insert(gmake_property(factor));
466 properties.insert(gmake_property(Z_m));
467 properties.insert(gmake_property(grid));
469 JParser<> zap(
"Main program to trigger acoustic data.");
471 zap[
'f'] = make_field(inputFile,
"output of JToA");
472 zap[
'n'] = make_field(numberOfEvents) = JLimit::max();
473 zap[
'@'] = make_field(properties,
"trigger parameters");
474 zap[
'o'] = make_field(outputFile,
"output file") =
"event.root";
475 zap[
'V'] = make_field(V,
"sound velocity") = JPARSER::initialised();
476 zap[
'a'] = make_field(detectorFile,
"detector file");
477 zap[
'H'] = make_field(hydrophones,
"hydrophone data") = JPARSER::initialised();
478 zap[
'p'] = make_field(precision,
"precision time-of-arrival") = 1.0e-6;
479 zap[
'W'] = make_field(ID,
"waveform identifiers") = JPARSER::initialised();
480 zap[
'd'] = make_field(debug) = 1;
484 catch(
const exception &error) {
485 FATAL(error.what() << endl);
492 load(detectorFile, detector);
494 catch(
const JException& error) {
498 V.
set(detector.getUTMZ());
500 const JCylinder3D cylinder(detector.begin(), detector.end());
502 const JVector3D center(cylinder.getX(), cylinder.getY(), Z_m);
507 const JVelo Velo(V0, RMax_m, Xv_m*grid, factor);
508 const JVelo velo(V0, RMax_m/grid, Xv_m, factor);
510 const JMatch3D match(V0, TMaxExtra_s);
514 JHashMap<int, JReceiver> receivers;
516 for (JDetector::const_iterator i = detector.begin(); i != detector.end(); ++i) {
518 JPosition3D pos(0.0, 0.0, 0.0);
520 if (i->getFloor() == 0) {
523 pos = getPosition(hydrophones.begin(),
525 make_predicate(&JHydrophone::getString, i->getString()));
527 catch(
const exception&) {
532 receivers[i->getID()] =
JReceiver(i->getID(),
533 i->getPosition() + pos,
534 i->getT0() * 1.0e-9);
539 JManager<int, TH1D> M1(
new TH1D(
"M1[%]", NULL, 2001, -0.5, 2000.5));
540 JManager<int, TH1D> M2(
new TH1D(
"M2[%]", NULL, 2001, -0.5, 2000.5));
541 JManager<int, TH1D> M3(
new TH1D(
"M3[%]", NULL, 2001, -0.5, 2000.5));
542 JManager<int, TH1D> M4(
new TH1D(
"M4[%]", NULL, 2001, -0.5, 2000.5));
543 JManager<int, TH1D> M5(
new TH1D(
"M5[%]", NULL, 2001, -0.5, 2000.5));
545 map<int, JGraph_t> G2;
549 if (!outputFile.is_open()) {
550 FATAL(
"Error opening file " << outputFile << endl);
553 outputFile.put(JMeta(argc, argv));
554 outputFile.put(parameters);
559 typedef vector<hit_type> buffer_type;
561 map<int, map<int, buffer_type> > f1;
565 STATUS(
"reading data... " << flush); DEBUG(endl);
567 while (inputFile.hasNext()) {
569 JToA* parameters = inputFile.next();
571 if (detector.getID() != parameters->
DETID) {
572 FATAL(
"Invalid detector identifier " << parameters->
DETID <<
" != " << detector.getID() << endl);
575 if (receivers.has(parameters->
DOMID)) {
577 ids.insert(parameters->
DOMID);
580 const double toa_s = parameters->
TOA_S();
582 if (toa_s < event_type::TOA_s) {
583 event_type::TOA_s = toa_s;
590 receiver.
getT(toa_s),
591 receiver.
getT(toa_s));
593 if (ID.empty() || ID.count(getWaveformID(parameters->
WAVEFORMID)) != 0) {
594 f1[getWaveformID(parameters->
WAVEFORMID)][receiver.getID()].push_back(
hit_type(receiver.getPosition(), transmission));
598 STATUS(
"OK" << endl);
602 parameters.
numberOfHits = (int) (ids.size() * fraction);
604 STATUS(
"Number of hits " << parameters.
numberOfHits << endl);
607 vector<event_type> queue;
609 for (map<
int, map<int, buffer_type> >::iterator i = f1.begin(); i != f1.end(); ++i) {
611 STATUS(
"processing: " << setw(3) << i->first << endl);
615 for (map<int, buffer_type>::iterator receiver = i->second.begin(); receiver != i->second.end(); ++receiver) {
621 buffer_type::iterator __end = unique(receiver->second.begin(), receiver->second.end(),
JTransmission::equals(precision));
625 for (buffer_type::const_iterator p = receiver->second.begin(); p != __end; ++p) {
626 if (p->getQ() >= parameters.
Q * (parameters.
Q <= 1.0 ? p->getW() : 1.0)) {
634 sort(data.begin(), data.end(), make_comparator(&hit_type::getToA, JComparison::lt()));
636 buffer_type buffer(factoryLimit);
639 TH1D* h1 = M1[i->first];
640 TH1D* h2 = M2[i->first];
641 TH1D* h3 = M3[i->first];
642 TH1D* h4 = M4[i->first];
643 TH1D* h5 = M5[i->first];
645 for (buffer_type::const_iterator p = data.begin(); p != data.end(); ++p) {
647 buffer_type::const_iterator q = p;
649 while (++q != data.end() && q->getToA() - p->getToA() <= parameters.
TMax_s) {}
651 h1->Fill(distance(p,q));
655 if (distance(p,q) < factoryLimit) {
663 buffer_type::iterator root = buffer.begin();
664 buffer_type::iterator __p = buffer.begin();
665 buffer_type::iterator __q = buffer.begin();
672 for (buffer_type::const_iterator i = p; ++i != q; ) {
679 h2->Fill(distance(root,__q));
683 __q = clusterize(__p, __q, match);
685 h3->Fill(distance(root,__q));
693 vx = velo(vx.getPosition(), *root, __p, __q, parameters.
numberOfHits);
710 if (!out[1].empty()) {
712 if (out[0].empty()) {
716 }
else if (overlap2D(out[0],out[1])) {
718 out[0].
merge(out[1]);
722 STATUS(
"trigger: " << out[0] << endl);
724 h5->Fill(out[0].size());
726 queue.push_back(out[0]);
736 if (!out[0].empty()) {
738 queue.push_back(out[0]);
744 if (!queue.empty()) {
746 sort(queue.begin(), queue.end());
748 for (vector<event_type>::iterator p = queue.begin(); p != queue.end(); ) {
752 vector<event_type>::iterator q = p;
753 vector<event_type>::iterator i = p;
757 for ( ; q != queue.end() && overlap1D(*p,*q); ++q) {
759 STATUS(
"| " << *q << endl);
761 if (q->getQ() > i->getQ()) {
766 STATUS(
"event: " << *i << endl);
770 G2[i->getID()].put(i->getX(), i->getY());
776 JMultipleFileScanner<JMeta> io(inputFile);
780 for (
const auto M : { &M1, &M2, &M3, &M4, &M5 }){
781 for (
const auto& i : *M) {
782 outputFile.put(*i.second);
786 for (map<int, JGraph_t>::const_iterator i = G2.begin(); i != G2.end(); ++i) {
787 outputFile.put(JGraph(i->second, MAKE_CSTRING(
"G[" << FILL(2,
'0') << i->first <<
"]")));