64 tripods_container tripods;
65 hydrophones_container hydrophones;
73 JParser<> zap(
"Application to fit position calibration model to acoustic data.");
75 zap[
'f'] =
make_field(inputFile,
"output of JAcousticEventBuilder[.sh]");
77 zap[
'n'] =
make_field(numberOfEvents) = JLimit::max();
85 zap[
'u'] =
make_field(unique,
"one ping per cycle");
90 catch(
const exception &error) {
91 FATAL(error.what() << endl);
110 for (JDetector::const_iterator i =
detector.begin(); i !=
detector.end(); ++i) {
111 receivers[i->getID()] = i->getLocation();
114 for (tripods_container::const_iterator i = tripods.begin(); i != tripods.end(); ++i) {
115 emitters[i->getID()] =
JEmitter(i->getID(),
116 i->getUTMPosition() -
detector.getUTMPosition());
134 simplex.debug =
debug;
135 gandalf.debug =
debug;
141 TH1D h0(
"chi2/NDF", NULL, 5000, 0.0, 100.0);
151 for (Int_t i = 1; i <= ha.GetXaxis()->GetNbins(); ++i) {
152 ha.GetXaxis()->SetBinLabel(i,
MAKE_CSTRING(geometry.at(i-1).first));
153 hb.GetXaxis()->SetBinLabel(i,
MAKE_CSTRING(geometry.at(i-1).first));
162 while (inputFile.hasNext()) {
164 STATUS(
"input " << setw(6) << inputFile.getCounter() <<
'\r');
DEBUG(endl);
166 const JEvent* evt = inputFile.next();
172 if (oid != evt->
getOID()) {
173 FATAL(
"Invalid detector identifier " << evt->
getOID() <<
" != " << oid << endl);
176 zbuf.push_back(*evt);
180 sort(zbuf.begin(), zbuf.end());
192 for (q = p; ++q != zbuf.end() && q->begin()->getToE() <= p->rbegin()->getToE() +
parameters.Tmax_s; ) {}
199 numberOfPings[i->getID()] += 1;
202 int weight = numeric_limits<int>::max();
205 DEBUG(
"Number of pings " << setw(2) << i->first <<
' ' << setw(3) << i->second << endl);
209 if (i->second < weight) {
219 const JEmitter& emitter = emitters[i->getID()];
221 const double signal = (unique ? (double) weight / (
double) numberOfPings[i->getID()] : 1.0);
227 for (
JEvent::const_iterator hit = i->begin(); hit != i->end(); ++hit) {
228 buffer[hit->getID()].push_back(*hit);
233 if (receivers.has(ps->first) && geometry.hasLocation(receivers[ps->first])) {
235 sort(ps->second.begin(), ps->second.end(),
make_comparator(&JTransmission::getToA));
239 receivers[ps->first],
247 DEBUG(
"hit: " << *hit << endl);
254 DEBUG(
"prefit:" << endl
259 ha.Fill(geometry.getIndex(hit->getString()), hit->getFloor(), 1.0);
267 double chi2_old = evaluator(result, data.begin(), data.end());
277 const double x = fabs(hit->getValue() - estimator.getToA(result, *hit)) / hit->sigma;
289 iter_swap(out, --__end);
291 result = estimator(data.begin(), __end);
293 double chi2_new = evaluator(result, data.begin(), __end);
297 DEBUG(
"Remove outlier " << __end->getLocation() <<
' ' << xmax << endl);
312 DEBUG(
"hit: " << *hit << endl);
315 DEBUG(
"prefit:" << endl
319 hb.Fill(geometry.getIndex(hit->getString()), hit->getFloor(), 1.0);
323 double chi2 = numeric_limits<double>::max();
329 result = estimator(data.begin(), data.end());
330 chi2 = evaluator(result, data.begin(), data.end());
337 chi2 = simplex(data.begin(), data.end()) / simplex.estimator->getRho(1.0);
338 result = simplex.value;
345 chi2 = gandalf(data.begin(), data.end()) / gandalf.estimator->getRho(1.0);
346 result = gandalf.value;
356 W += hit->getWeight();
359 const int ndf = data.size() - result.
getN();
361 DEBUG(
"result:" << endl
362 <<
FIXED(9,3) << chi2 <<
'/' << ndf << endl
365 h0.Fill(chi2 / (W - result.
getN()));
369 const JEvt evt =
getEvt(
JHead(oid, data.begin()->getValue(), data.rbegin()->getValue(), ndf, chi2), result);
377 const double toe = result.
emitter[
JEKey(i->getID(), i->getCounter())].t1;
379 for (JEvent::iterator hit = out.begin(); hit != out.end(); ++hit) {
Utility class to parse command line options.
size_t getN() const
Get number of fit parameters.
JComparator< JResult_t T::*, JComparison::lt > make_comparator(JResult_t T::*member)
Helper method to create comparator between values of data member.
static JDetectorMechanics getMechanics
Function object to get string mechanics.
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
Template specialisation of fit function of acoustic model based on linear approximation.
Template specialisation of fit function of acoustic model based on JSimplex minimiser.
JEvt getEvt(const JHead &header, const JModel &model)
Get event.
*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
#define MAKE_CSTRING(A)
Make C-string.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Auxiliary data structure for floating point format specification.
size_t getNumberOfEmitters(T __begin, T __end)
Get number of emitters.
Model for fit to acoustics data.
Auxiliary class for defining the range of iterations of objects.
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))
JLANG::JSharedPointer< JMEstimator > estimator
M-Estimator function.
Auxiliary wrapper for I/O of container with optional comment (see JComment).
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
const std::string & getOID() const
Get detector identifier.
int getNumberOfFloors(const JDetector &detector)
Get number of floors.
static const JStringCounter getNumberOfStrings
Function object to count unique strings.
Implementation for velocity of sound.
JACOUSTICS::JModel::emitter_type emitter
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
General purpose class for object reading from a list of file names.
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...
Custom probability density function of time-of-arrival.
const JLimit & getLimit() const
Get limit.
JMEstimator * getMEstimator(const int type)
Get M-Estimator.
do set_variable DETECTOR_TXT $WORKDIR detector
std::vector< double > weight
do if[[!-f $ACOUSTICS_WORKDIR/${KEY}.txt]]
#define DEBUG(A)
Message macros.