57 tripods_container tripods;
58 hydrophones_container hydrophones;
66 numberOfPings[-1] = 11;
70 JParser<> zap(
"Example application to test fit of model to simukated acoustic data.");
81 zap[
'u'] =
make_field(unique,
"one ping per cycle");
87 catch(
const exception &error) {
88 FATAL(error.what() << endl);
94 gRandom->SetSeed(seed);
96 if (numberOfEvents <= 0) {
FATAL(
"Invalid number of events " << numberOfEvents << endl); }
109 for (tripods_container::const_iterator i = tripods.begin(); i != tripods.end(); ++i) {
110 emitters.push_back(
JEmitter(i->getID(), i->getUTMPosition() -
detector.getUTMPosition()));
113 if (
detector.empty()) {
FATAL(
"No modules in detector." << endl); }
114 if (emitters.empty()) {
FATAL(
"No emitters in system." << endl); }
130 simplex.debug =
debug;
131 gandalf.debug =
debug;
139 TH1D h0(
"cpu", NULL, 100, 1.0, 7.0);
140 TH1D
h1(
"chi2/NDF", NULL, 100, 0.0, 5.0);
148 for (
int number_of_events = 0,
count = 0; number_of_events != numberOfEvents; ++number_of_events) {
150 STATUS(
"event: " << setw(10) << number_of_events <<
'\r');
DEBUG(endl);
154 for (JDetector::const_iterator module =
detector.begin(); module !=
detector.end(); ++module) {
159 gRandom->Uniform(-2.0e-2, +2.0e-2));
167 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
168 if (geometry.hasLocation(module->getLocation())) {
169 module->set(estimator.detector[module->getString()].getPosition(model.
string[module->getString()], module->getFloor()));
180 int number_of_pings = numberOfPings[-1];
182 if (numberOfPings.find(emitter->getID()) != numberOfPings.end()) {
183 number_of_pings = numberOfPings[emitter->getID()];
186 int weight = numeric_limits<int>::max();
189 if (i->second < weight) {
194 const double signal = (unique ? (double) weight / (
double) number_of_pings : 1.0);
196 for (
int ping_counter = 0; ping_counter != number_of_pings; ++ping_counter) {
200 const double toe_s = ping_counter * 10.0 + gRandom->Uniform(-1.0, +1.0);
204 for (JDetector::const_iterator module =
detector.begin(); module !=
detector.end(); ++module) {
206 if (geometry.hasLocation(module->getLocation())) {
208 const double toa_s = toe_s + V.getTime(
getDistance(module->getPosition(), emitter->getPosition()), emitter->getZ(), module->getZ());
213 t1_s = gRandom->Gaus(toa_s,
parameters.sigma_s);
215 t1_s = gRandom->Uniform(toa_s + T_s.getLowerLimit(),
216 toa_s + T_s.getUpperLimit());
220 module->getLocation(),
227 DEBUG(
"Model" << endl << model << endl);
230 DEBUG(
"hit: " << *hit << endl);
238 double chi2 = numeric_limits<double>::max();
244 chi2 = evaluator(result, data.begin(), data.end());
251 chi2 = simplex(data.begin(), data.end()) / simplex.estimator->getRho(1.0);
252 result = simplex.value;
259 chi2 = gandalf(data.begin(), data.end()) / gandalf.estimator->getRho(1.0);
260 result = gandalf.value;
272 W += hit->getWeight();
275 const int ndf = data.size() - model.
getN();
277 DEBUG(
"Final values" << endl
278 <<
FIXED(9,3) << chi2 <<
'/' << ndf << endl
282 h0.Fill(log10((
double) timer.usec_wall));
283 h1.Fill(chi2 / (
double) (W - model.
getN()));
286 H2[i->first]->Fill((i->second.tx - result.
string [i->first].tx) * 1.0e3,
287 (i->second.ty - result.
string [i->first].ty) * 1.0e3);
291 H1[i->first.getID()]->Fill(i->second.t1 - result.
emitter[i->first].t1);
Utility class to parse command line options.
size_t getN() const
Get number of fit parameters.
Template specialisation of fit function of acoustic model based on linear approximation.
Template specialisation of fit function of acoustic model based on JSimplex minimiser.
*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
then for HISTOGRAM in h0 h1
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Auxiliary data structure for floating point format specification.
double getDistance(const JFirst_t &first, const JSecond_t &second)
Get distance between objects.
Model for fit to acoustics data.
static const JSoundVelocity getSoundVelocity(1541.0,-17.0e-3,-2000.0)
Function object for velocity of sound.
Template specialisation of fit function of acoustic model based on JGandalf minimiser.
do for((RUN=${RANGE%%-*};$RUN<=${RANGE##*-};RUN+=1))
Auxiliary class to manage set of compatible ROOT objects (e.g. histograms) using unique keys...
Auxiliary wrapper for I/O of container with optional comment (see JComment).
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Auxiliary class for CPU timing and usage.
Implementation for velocity of sound.
JACOUSTICS::JModel::string_type string
JACOUSTICS::JModel::emitter_type emitter
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
Simple fit method based on Powell's algorithm, see reference: Numerical Recipes in C++...
Template specialisation of fit function of acoustic model based on JAbstractMinimiser minimiser...
then usage $script< input_file >< detector_file > fi set_variable OUTPUT_DIR set_variable SELECTOR JDAQTimesliceL1 set_variable DEBUG case set_variable DEBUG
Custom probability density function of time-of-arrival.
JMEstimator * getMEstimator(const int type)
Get M-Estimator.
do set_variable DETECTOR_TXT $WORKDIR detector
std::vector< double > weight