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.