48   static const int       NUMBER_OF_PINGS  =  11;          
 
   49   static const JWaveform EMITTER_WAVEFORM(2.5e6,          
 
   60 int main(
int argc, 
char **argv)
 
   82   disable_container       disable;                              
 
   83   waveform_container      waveforms;                            
 
   88   numberOfPings[
WILDCARD] = NUMBER_OF_PINGS;
 
   89   waveforms    [
WILDCARD] = EMITTER_WAVEFORM;
 
   93     JParser<> zap(
"Example application to test fit of model to simulated acoustic data.");
 
  101     zap[
'T'] = 
make_field(tripods,         
"tripod data");
 
  104     zap[
'u'] = 
make_field(unify,           
"unify weighing of pings");
 
  108     zap[
'B'] = 
make_field(background,      
"background probability")         = 0.0;
 
  114   catch(
const exception &error) {
 
  115     FATAL(error.what() << endl);
 
  119   gRandom->SetSeed(seed);
 
  121   if (numberOfEvents <= 0) { 
FATAL(
"Invalid number of events " << numberOfEvents << endl); }
 
  134   for (tripods_container::const_iterator i = tripods.begin(); i != tripods.end(); ++i) {
 
  135     emitters.push_back(
JEmitter(i->getID(),
 
  136                                 i->getUTMPosition() - 
detector.getUTMPosition()));
 
  139   for (transmitters_container::const_iterator i = transmitters.begin(); i != transmitters.end(); ++i) {
 
  141       emitters.push_back(
JEmitter(i->getID(),
 
  142                                   i->getPosition() + 
detector.getModule(i->getLocation()).getPosition()));
 
  144     catch(
const exception&) {
 
  149   if (
detector.empty()) { 
FATAL(
"No modules in detector." << endl); }
 
  150   if (emitters.empty()) { 
FATAL(
"No emitters in system."  << endl); }
 
  155   const double D_m = -
detector.getUTMZ();                             
 
  168   TH1D h0(
"cpu",      NULL, 100, 0.0, 1.0e3);
 
  169   TH1D h1(
"chi2/NDF", NULL, 100, 0.0, 5.0);
 
  175   for (
int number_of_events = 0, count = 0; number_of_events != numberOfEvents; ++number_of_events) {
 
  177     STATUS(
"event: " << setw(10) << number_of_events << 
'\r'); 
DEBUG(endl);
 
  181     for (JDetector::const_iterator module = 
detector.begin(); module != 
detector.end(); ++module) {
 
  186                                                             gRandom->Uniform(-2.0e-2, +2.0e-2));
 
  194     for (JDetector::iterator module = 
detector.begin(); module != 
detector.end(); ++module) {
 
  195       if (module->getFloor() != 0 && geometry.
hasLocation(module->getLocation())) {
 
  196         module->set(geometry[module->getString()].getPosition(
model.string[module->getString()], module->getFloor()));
 
  203     int minimum_number_of_pings = numeric_limits<int>::max();
 
  206       minimum_number_of_pings = min(minimum_number_of_pings, 
getValue(numberOfPings, emitter->getID(), numberOfPings[
WILDCARD]));
 
  213       const int number_of_pings = 
getValue(numberOfPings, emitter->getID(), numberOfPings[
WILDCARD]);
 
  215       const double weight = (unify ? (double) minimum_number_of_pings / (
double) number_of_pings : 1.0);
 
  217       for (
int ping_counter = 0; ping_counter != number_of_pings; ++ping_counter) {
 
  221         const double toe_s = emitter->getID() * 1000.0  +  ping_counter * 10.0  +  gRandom->Uniform(-1.0, +1.0);
 
  223         model.emission[emitter->getID()][count] = toe_s;
 
  225         for (JDetector::const_iterator module = 
detector.begin(); module != 
detector.end(); ++module) {
 
  227           if (disable.count(
JTransmission_t(emitter->getID(), module->getID())) == 0) {
 
  233               const double d_m   = 
getDistance(module->getPosition(), emitter->getPosition());
 
  234               const double toa_s = toe_s + V.
getTime(d_m, emitter->getZ(), module->getZ());
 
  235               const double Q     = waveform.
getQ(D_m, d_m);
 
  237               if (Q >= parameters.
Qmin) {
 
  241                 if (gRandom->Rndm() >= background)
 
  242                   t1_s = gRandom->Gaus(toa_s, parameters.
sigma_s);
 
  247                 const JHit hit(*emitter,
 
  249                                module->getLocation(),
 
  254                 DEBUG(
"hit: " << hit << 
' ' << 
FIXED(7,1) << Q << endl);
 
  264     const chrono::steady_clock::time_point t0 = chrono::steady_clock::now();
 
  268     const chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
 
  272       cout << 
"result:"                                                     << 
' ' 
  276       for (data_type::const_iterator hit = 
result.begin; hit != 
result.end; ++hit) {
 
  281     h0.Fill(chrono::duration_cast<chrono::milliseconds>(t1 - t0).count());
 
  286       const double tx = (i->second.tx - 
result.value.string [i->first].tx) * 1.0e3;   
 
  287       const double ty = (i->second.ty - 
result.value.string [i->first].ty) * 1.0e3;  
 
  290       H2[i->first]->Fill(tx, ty);                        
 
  295       const double t1 = i->second.t1 - 
result.value.emission[i->first].t1;
 
  298       H1[i->first.getID()]->Fill(t1);
 
Data structure for detector geometry and calibration.
 
Fit function of acoustic model.
 
Data structure for hydrophone.
 
Dynamic ROOT object management.
 
General purpose messaging.
 
#define DEBUG(A)
Message macros.
 
Data structure for optical module.
 
Utility class to parse command line options.
 
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
 
Acoustic transmission identifier.
 
Data structure for transmitter.
 
Data structure for tripod.
 
Utility class to parse command line options.
 
Auxiliary class to manage set of compatible ROOT objects (e.g. histograms) using unique keys.
 
void Write(TDirectory &out, const bool wm=false)
Write objects to file.
 
int main(int argc, char **argv)
 
JContainer< std::vector< JTripod > > tripods_container
 
JContainer< std::vector< JTransmitter > > transmitters_container
 
JContainer< std::vector< JHydrophone > > hydrophones_container
 
static const JSoundVelocity getSoundVelocity(1541.0, -17.0e-3, -2000.0)
Function object for velocity of sound.
 
static JDetectorMechanics getMechanics
Function object to get string mechanics.
 
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
 
double getValue(const JScale_t scale)
Get numerical value corresponding to scale.
 
double getDistance(const JFirst_t &first, const JSecond_t &second)
Get distance between objects.
 
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
 
std::vector< event_type > data_type
 
static const char WILDCARD
 
Auxiliary data structure for floating point format specification.
 
double Qmin
minimal quality transmission
 
double sigma_s
time-of-arrival resolution [s]
 
bool hasLocation(const JLocation &location) const
Check if this detector has given location.
 
Global fit of prameterised detector geometry to acoustics data.
 
JKatoomba< JAbstractMinimiser > evaluator
 
Template definition of fit function of acoustic model.
 
Model for fit to acoustics data.
 
Implementation for depth dependend velocity of sound.
 
JSoundVelocity & set(const double z0)
Set depth.
 
virtual double getTime(const double D_m, const double z1, const double z2) const override
Get propagation time of sound.
 
Acoustic transmission identifier.
 
Data structure for measured coincidence rates of all pairs of PMTs in optical module.
 
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)...