61int main(
int argc,
char **argv)
66 typedef JTYPELIST<JEvent, JTriggerParameters, JMeta>::typelist typelist;
72 JMultipleFileScanner<JToA> inputFile;
73 JLimit_t& numberOfEvents = inputFile.getLimit();
75 JFileRecorder<typelist> outputFile;
86 JParser<> zap(
"Main program to trigger events in acoustic data.");
88 zap[
'f'] = make_field(inputFile,
"output of JToA");
89 zap[
'n'] = make_field(numberOfEvents) = JLimit::max();
90 zap[
'@'] = make_field(parameters,
"trigger parameters");
91 zap[
'o'] = make_field(outputFile,
"output file") =
"event.root";
92 zap[
'V'] = make_field(V,
"sound velocity") = JPARSER::initialised();
93 zap[
'a'] = make_field(detectorFile,
"detector file");
94 zap[
'T'] = make_field(tripods,
"tripod data");
95 zap[
'Y'] = make_field(transmitters,
"transmitter data") = JPARSER::initialised();
96 zap[
'H'] = make_field(hydrophones,
"hydrophone data") = JPARSER::initialised();
97 zap[
'W'] = make_field(getEmitterID,
"waveform identification data") = JPARSER::initialised();
98 zap[
'p'] = make_field(precision,
"precision time-of-arrival") = 1.0e-6;
99 zap[
'd'] = make_field(debug) = 1;
103 catch(
const exception &error) {
104 FATAL(error.what() << endl);
111 load(detectorFile, detector);
113 catch(
const JException& error) {
117 V.
set(detector.getUTMZ());
119 JHashMap<int, JReceiver> receivers;
120 JHashMap<int, JEmitter> emitters;
122 for (JDetector::const_iterator i = detector.begin(); i != detector.end(); ++i) {
124 if ((i->getFloor() == 0 && !i->has(HYDROPHONE_DISABLE)) ||
125 (i->getFloor() != 0 && !i->has(PIEZO_DISABLE))) {
127 JPosition3D pos = getPiezoPosition();
129 if (i->getFloor() == 0) {
132 pos = getPosition(hydrophones.begin(),
134 make_predicate(&JHydrophone::getString, i->getString()));
136 catch(
const exception&) {
141 receivers[i->getID()] =
JReceiver(i->getID(),
142 i->getPosition() + pos,
143 i->getT0() * 1.0e-9);
147 for (tripods_container::const_iterator i = tripods.begin(); i != tripods.end(); ++i) {
148 emitters[i->getID()] =
JEmitter(i->getID(),
149 i->getUTMPosition() - detector.getUTMPosition());
152 for (transmitters_container::const_iterator i = transmitters.begin(); i != transmitters.end(); ++i) {
154 emitters[i->getID()] =
JEmitter(i->getID(),
155 i->getPosition() + detector.getModule(i->getLocation()).getPosition());
157 catch(
const exception&) {
164 if (!outputFile.is_open()) {
165 FATAL(
"Error opening file " << outputFile << endl);
168 outputFile.put(JMeta(argc, argv));
169 outputFile.put(parameters);
174 public map<int, JStats>
176 long long int sum()
const
178 long long int count = 0;
180 for (const_iterator i = this->begin(); i != this->end(); ++i) {
181 count += i->second.getCount();
188 map_type number_of_entries;
189 map_type number_of_aliens;
190 map_type number_of_misses;
191 map_type number_of_triggers;
192 map_type number_of_events;
196 typedef vector<JTransmission> buffer_type;
198 map<int, map< int, buffer_type > > f1;
200 while (inputFile.hasNext()) {
202 if (inputFile.getCounter()%10000 == 0) {
203 STATUS(
"counter: " << setw(8) << inputFile.getCounter() <<
'\r' << flush); DEBUG(endl);
206 JToA* parameters = inputFile.next();
208 if (detector.getID() != parameters->
DETID) {
209 FATAL(
"Invalid detector identifier " << parameters->
DETID <<
" != " << detector.getID() << endl);
214 const int id = getEmitterID(parameters->
WAVEFORMID);
216 number_of_entries[parameters->
WAVEFORMID].put(1);
218 if (emitters.has(
id)) {
220 if (receivers.has(parameters->
DOMID)) {
228 number_of_misses[id].put(1);
231 catch(
const exception&) {
232 number_of_aliens[parameters->
WAVEFORMID].put(1);
237 for (map_type::const_iterator i = number_of_entries.begin(); i != number_of_entries.end(); ++i) {
238 STATUS(
"number of entries: " << setw(3) << i->first <<
' ' << setw(8) << i->second.getCount() << endl);
241 for (map_type::const_iterator i = number_of_aliens.begin(); i != number_of_aliens.end(); ++i) {
242 STATUS(
"number of aliens: " << setw(3) << i->first <<
' ' << setw(8) << i->second.getCount() << endl);
245 for (map_type::const_iterator i = number_of_misses.begin(); i != number_of_misses.end(); ++i) {
246 STATUS(
"number of misses: " << setw(3) << i->first <<
' ' << setw(8) << i->second.getCount() << endl);
251 for (map<
int, map< int, buffer_type> >::iterator i = f1.begin(); i != f1.end(); ++i) {
255 for (map< int, buffer_type>::iterator receiver = i->second.begin(); receiver != i->second.end(); ++receiver) {
261 buffer_type::iterator __end = unique(receiver->second.begin(), receiver->second.end(),
JTransmission::equals(precision));
265 for (buffer_type::const_iterator p = receiver->second.begin(); p != __end; ++p) {
266 if (p->getQ() >= parameters.
Q * (parameters.
Q <= 1.0 ? p->getW() : 1.0)) {
267 buffer.push_back(*p);
272 sort(buffer.begin(), buffer.end());
277 for (buffer_type::const_iterator p = buffer.begin(); p != buffer.end(); ++p) {
279 buffer_type::const_iterator q = p;
283 while (++q != buffer.end() && q->getToE() - p->getToE() <= parameters.
TMax_s) {}
285 Q.put(distance(p,q));
289 JEvent event(detector.getID(), number_of_triggers.sum(), i->first, p, q);
291 number_of_triggers[i->first].put(event.size());
293 DEBUG(
"trigger: " << endl << event);
299 }
else if (match(out, event)) {
307 number_of_events[out.
getID()].put(out.size());
318 number_of_events[out.
getID()].put(out.size());
321 STATUS(
"number of toes: " << setw(3) << i->first <<
' ' << setw(8) << buffer.size());
322 if (Q.getCount() > 0) {
323 STATUS(
' ' << FIXED(6,1) << Q.getMean() <<
324 ' ' << FIXED(6,1) << Q.getXmin() <<
325 ' ' << FIXED(6,1) << Q.getXmax());
331 for (map_type::const_iterator i = number_of_triggers.begin(); i != number_of_triggers.end(); ++i) {
332 STATUS(
"number of triggers: " << setw(3) << i->first <<
' ' << setw(8) << i->second.getCount() << endl);
335 for (map_type::const_iterator i = number_of_events.begin(); i != number_of_events.end(); ++i) {
336 STATUS(
"number of events: " << setw(3) << i->first <<
' ' << setw(8) << i->second.getCount() <<
' ' << FIXED(7,3) << i->second.getMean() << endl);
339 JMultipleFileScanner<JMeta> io(inputFile);