183{
186
188
190
192 JLimit_t& numberOfEvents = inputFile.getLimit();
194 int factoryLimit = 10000;
195 double TMaxExtra_s = 100.0e-6;
198 string detectorFile;
200 double precision;
202
203 try {
204
206
212
213 JParser<> zap(
"Main program to trigger acoustic data.");
214
215 zap[
'f'] =
make_field(inputFile,
"output of JConvertDB -q toashort");
217 zap[
'@'] =
make_field(properties,
"trigger parameters");
220 zap[
'a'] =
make_field(detectorFile,
"detector file");
222 zap[
'p'] =
make_field(precision,
"precision time-of-arrival") = 1.0e-6;
225
226 zap(argc, argv);
227 }
228 catch(const exception &error) {
229 FATAL(error.what() << endl);
230 }
231
232
234
235 try {
237 }
240 }
241
243
244
245
246 const JMatch3D match(V, TMaxExtra_s);
248
249
251
252 for (JDetector::const_iterator i =
detector.begin(); i !=
detector.end(); ++i) {
253
255
256 if (i->getFloor() == 0) {
257
258 try {
260 hydrophones.end(),
262 }
263 catch(const exception&) {
264 continue;
265 }
266 }
267
268 receivers[i->getID()] =
JReceiver(i->getID(),
269 i->getPosition() + pos,
270 i->getT0() * 1.0e-9);
271 }
272
274
277 }
278
281
282
283
284
286
288
290
293 }
294
295 JToA* parameters = inputFile.
next();
296
298 FATAL(
"Invalid detector identifier " << parameters->
DETID <<
" != " <<
detector.getID() << endl);
299 }
300
301 if (receivers.
has(parameters->
DOMID)) {
302
304
305 double toa = parameters->
TOA_S();
306
313 try {
315 }
316 catch(const exception&) {}
317 }
318 }
320
322
324
326
327
328
330
331 buffer_type::iterator __end = unique(receiver->second.begin(), receiver->second.end(),
JTransmission::equals(precision));
332
333
334
335 for (buffer_type::const_iterator p = receiver->second.begin(); p != __end; ++p) {
336 if (p->getQ() >= parameters.Q * (parameters.Q <= 1.0 ? p->getW() : 1.0)) {
338 }
339 }
340 }
341
343
346
347 for (buffer_type::const_iterator p =
data.begin(); p !=
data.end(); ++p) {
348
350 STATUS(
"processed[" << i->first <<
"]: " <<
FIXED(5,1) << (
double) (100 *
distance(
data.cbegin(),p)) / (
double)
data.size() <<
"%" <<
'\r' << flush);
DEBUG(endl);
351 }
352
353 buffer_type::const_iterator q = p;
354
355 while (++q !=
data.end() && q->getToA() - p->getToA() <= parameters.TMax_s) {}
356
357 if (
distance(p,q) >= parameters.numberOfHits) {
358
360
361 buffer_type::iterator
root = buffer.begin();
362 buffer_type::iterator __p = buffer.begin();
363 buffer_type::iterator __q = buffer.begin();
364
366
367 ++__p;
368 ++__q;
369
370 for (buffer_type::const_iterator i = p; ++i != q; ) {
371 if (match(*p,*i)) {
372 *__q = *i;
373 ++__q;
374 }
375 }
376
378
379 __q =
clusterize(__p, __q, match, parameters.numberOfHits - 1);
380
383 }
384 }
385
386 } else {
387
388 out[1] =
JEvent(
detector.getID(), out[0].getCounter() + 1, i->first, p, q);
389 }
390
391 if (out[0].empty()) {
392
393 out[0] = out[1];
394
395 }
else if (
overlap(out[0],out[1])) {
396
397 out[0].
merge(out[1]);
398
399 } else {
400
402
403 out[0] = out[1];
404 }
405
406 out[1].clear();
407 }
408 }
409
410 if (!out[0].empty()) {
411
413 }
415 STATUS(
"triggers[" << i->first <<
"]: " << setw(7) << out[0].getCounter() << endl);
416 }
417
419
421
423}
#define DEBUG(A)
Message macros.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
#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.
int getString() const
Get string number.
Utility class to parse parameter values.
Data structure for position in three dimensions.
const JPosition3D & getPosition() const
Get position.
int getID() const
Get identifier.
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.
const JPolynome f1(1.0, 2.0, 3.0)
Function.
JPosition3D getPosition(const Vec &pos)
Get position.
static JEmitterID getEmitterID
Function object for emitter identification.
JContainer< std::vector< JHydrophone > > hydrophones_container
static const JSoundVelocity getSoundVelocity(1541.0, -17.0e-3, -2000.0)
Function object for velocity of sound.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
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
static const struct JTRIGGER::clusterize clusterize
Auxiliary data structure for floating point format specification.
Match of two events considering overlap in time.
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)
Auxiliary class to compare transmissions.
Auxiliary class to compare transmissions.
double Q
minimal quality if larger than one; else minimal normalised quality
double TMax_s
maximal difference between times of emission [s]
int numberOfHits
minimal number of hits to trigger event
Auxiliary wrapper for I/O of container with optional comment (see JComment).
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.