Jpp
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Functions
JAcousticsEventBuilder.cc File Reference

Example program to trigger acoustic data. More...

#include <iostream>
#include <iomanip>
#include <vector>
#include <map>
#include <algorithm>
#include "TROOT.h"
#include "TFile.h"
#include "JLang/JComparator.hh"
#include "JDB/JToAshort.hh"
#include "JDB/JSupport.hh"
#include "JDetector/JDetector.hh"
#include "JDetector/JDetectorToolkit.hh"
#include "JDetector/JTripod.hh"
#include "JDetector/JBase.hh"
#include "JLang/JPredicate.hh"
#include "JTools/JRange.hh"
#include "JTools/JQuantile.hh"
#include "JTools/JHashMap.hh"
#include "JSupport/JMultipleFileScanner.hh"
#include "JSupport/JFileRecorder.hh"
#include "JAcoustics/JTransceiver.hh"
#include "JAcoustics/JTransmission.hh"
#include "JAcoustics/JAcousticsToolkit.hh"
#include "JAcoustics/JAcousticsSupportkit.hh"
#include "JAcoustics/JTriggerParameters.hh"
#include "JAcoustics/JEvent.hh"
#include "JAcoustics/JEventOverlap.hh"
#include "JAcoustics/JTriggerOutput.hh"
#include "JAcoustics/JSupport.hh"
#include "Jeep/JContainer.hh"
#include "Jeep/JPrint.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

Example program to trigger acoustic data.

Author
mdejong

Definition in file JAcousticsEventBuilder.cc.

Function Documentation

int main ( int  argc,
char **  argv 
)

Definition at line 49 of file JAcousticsEventBuilder.cc.

50 {
51  using namespace std;
52  using namespace JPP;
53 
54  JMultipleFileScanner<JToAshort> inputFile; // ROOT file (after JConvertDB -q toashort)
57  JSoundVelocity V = getSoundVelocity; // default sound velocity
58  string detectorFile;
59  JContainer<JTripod> tripods; // tripods
60  JContainer<JBase> bases; // base modules
61  double precision;
62  int debug;
63 
64  try {
65 
66  JParser<> zap("Example program to trigger acoustic data.");
67 
68  zap['f'] = make_field(inputFile, "output of JConvertDB -q toashort") = JPARSER::initialised();
69  zap['@'] = make_field(parameters, "trigger parameters");
70  zap['o'] = make_field(outputFile, "output file") = "event.root";
71  zap['V'] = make_field(V, "sound velocity") = JPARSER::initialised();
72  zap['a'] = make_field(detectorFile, "detector file");
73  zap['T'] = make_field(tripods, "tripod data");
74  zap['B'] = make_field(bases, "base module data") = JPARSER::initialised();
75  zap['p'] = make_field(precision, "precision time-of-arrival") = 1.0e-6;
76  zap['d'] = make_field(debug) = 1;
77 
78  zap(argc, argv);
79  }
80  catch(const exception &error) {
81  FATAL(error.what() << endl);
82  }
83 
84 
86 
87  try {
88  load(detectorFile, detector);
89  }
90  catch(const JException& error) {
91  FATAL(error);
92  }
93 
94  JHashMap<int, JReceiver> receivers;
95  JHashMap<int, JEmitter> emitters;
96 
97  for (JDetector::const_iterator i = detector.begin(); i != detector.end(); ++i) {
98  receivers[i->getID()] = JReceiver(i->getID(), i->getPosition(), getT0(*i) * 1.0e-9, PIEZO_DELAYTIME_US * 1.0e-6);
99  }
100 
101  for (JContainer<JBase>::const_iterator i = bases.begin(); i != bases.end(); ++i) {
102  receivers[i->getID()] = JReceiver(i->getID(), i->getPosition(), getT0(*i) * 1.0e-9, HYDROPHONE_DELAYTIME_US * 1.0e-6);
103  }
104 
105  for (JContainer<JTripod>::const_iterator i = tripods.begin(); i != tripods.end(); ++i) {
106  emitters[i->getID()] = JEmitter(i->getID(), i->getUTMPosition() - detector.getUTMPosition());
107  }
108 
109 
110  outputFile.open();
111 
112  if (!outputFile.is_open()) {
113  FATAL("Error opening file " << outputFile << endl);
114  }
115 
116 
117  // input data
118 
119  typedef vector<JTransmission> buffer_type; // acoustic data type
120 
121  map<int, map< int, buffer_type > > f1; // emitter -> receiver -> data
122 
123  for (int counter = 0; inputFile.hasNext(); ++counter) {
124 
125  STATUS("counter: " << setw(8) << counter << '\r' << flush); DEBUG(endl);
126 
127  const JToAshort* parameters = inputFile.next();
128  const JTransceiver transceiver(emitters[parameters->EMITTERID], receivers[parameters->DOMID]);
129 
130  f1[transceiver.emitter.getID()][transceiver.receiver.getID()].push_back(transceiver.getTransmission(*parameters, V[detector.getUTMZ()]));
131  }
132  STATUS(endl);
133 
134 
135  // filter similar hits
136 
137  for (map<int, map< int, buffer_type> >::iterator i = f1.begin(); i != f1.end(); ++i) {
138 
139  for (map< int, buffer_type>::iterator receiver = i->second.begin(); receiver != i->second.end(); ++receiver) {
140 
141  buffer_type& buffer = receiver->second;
142 
143  sort(buffer.begin(), buffer.end(), make_comparator(&JTransmission::getToA, JComparison::lt()));
144 
145  buffer.erase(unique(buffer.begin(), buffer.end(), JTransmission::compare(precision)), buffer.end());
146  }
147  }
148 
149 
150  // output events
151 
152  int counter = 0;
153 
154  for (map<int, map< int, buffer_type> >::iterator i = f1.begin(); i != f1.end(); ++i) {
155 
156  buffer_type buffer;
157 
158  for (map< int, buffer_type>::iterator receiver = i->second.begin(); receiver != i->second.end(); ++receiver) {
159 
160  // selection based on quality
161 
162  buffer_type& f2 = receiver->second;
163 
164  const JQuantile Q1("quality", f2.begin(), f2.end(), &JTransmission::getQ, true);
165 
166  const double Qmin = Q1.getQuantile(parameters.Q);
167 
168  buffer_type::iterator __end = partition(f2.begin(), f2.end(), make_predicate(&JTransmission::getQ, Qmin, JComparison::gt()));
169 
170  copy(f2.begin(), __end, back_inserter(buffer));
171  }
172 
173 
174  // sort according time-of-emisson
175 
176  sort(buffer.begin(), buffer.end());
177 
178 
179  JTriggerOutput data;
180 
181  for (buffer_type::const_iterator p = buffer.begin(); p != buffer.end(); ++p) {
182 
183  buffer_type::const_iterator q = p;
184 
185  // basic correlator
186 
187  while (++q != buffer.end() && q->getToE() - p->getToE() <= parameters.TMax_s) {}
188 
189  if (distance(p,q) >= parameters.numberOfHits) {
190 
191  ++counter;
192 
193  STATUS("event: " << setw(8) << counter << '\r' << flush); DEBUG(endl);
194 
195  JEvent event(counter, i->first, p, q);
196 
197  DEBUG("event: " << endl << event);
198 
199  data.push_back(event);
200  }
201  }
202 
203  data.merge(JEventOverlap(parameters.TMax_s));
204 
205  for (JTriggerOutput::const_iterator event = data.begin(); event != data.end(); ++event) {
206  outputFile.put(*event);
207  }
208  }
209  STATUS(endl);
210 
211  outputFile.close();
212 }
Object writing to file.
Utility class to parse command line options.
Definition: JParser.hh:1493
General exception.
Definition: JException.hh:23
Acoustic receiver.
Definition: JReceiver.hh:27
JPredicate< JResult_t T::*, JComparison::eq > make_predicate(JResult_t T::*member, const JResult_t value)
Helper method to create predicate for data member.
Definition: JPredicate.hh:128
Greater than.
Definition: JComparison.hh:73
JComparator< JResult_t T::*, JComparison::lt > make_comparator(JResult_t T::*member)
Helper method to create comparator between values of data member.
Definition: JComparator.hh:143
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
General purpose class for hash map of unique keys.
Definition: JHashMap.hh:71
Quantile calculator.
Definition: JQuantile.hh:83
#define STATUS(A)
Definition: JMessage.hh:63
Detector data structure.
Definition: JDetector.hh:80
std::vector< T >::const_iterator const_iterator
Definition: JContainer.hh:32
static const double HYDROPHONE_DELAYTIME_US
Hydrophone delay time [us].
*fatal Wrong number of arguments esac JCookie sh typeset Z DETECTOR typeset Z SOURCE_RUN typeset Z TARGET_RUN set_variable PARAMETERS_FILE $WORKDIR parameters
Definition: diff-Tuna.sh:38
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition: JParser.hh:63
string outputFile
double getQuantile(const double Q, const bool reverse=false) const
Get quantile.
Definition: JQuantile.hh:402
static const JSoundVelocity getSoundVelocity(1541.0,-17.0e-3,-2000.0)
Function object for velocity of sound.
Detector file.
Definition: JHead.hh:130
static const double PIEZO_DELAYTIME_US
Piezo delay time [us].
Acoustic emitter.
Definition: JEmitter.hh:27
Auxiliary container for detector elements.
Definition: JContainer.hh:29
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1954
Acoustic transceiver.
Definition: JTransceiver.hh:29
void load(const JString &file_name, JDetector &detector)
Load detector from input file.
int debug
debug level
Definition: JSirene.cc:61
Implementation for velocity of sound.
#define FATAL(A)
Definition: JMessage.hh:67
double getT0(const JModule &module)
Get time offset of optical module.
General purpose class for object reading from a list of file names.
Auxiliary class to compare transmissions.
void copy(const Head &from, JHead &to)
Copy header from from to to.
Definition: JHead.cc:153
Acoustic event.
Match of two events considering overlap in time.
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62