69 tripods_container tripods;
70 hydrophones_container hydrophones;
74 disable_container disable;
79 JParser<> zap(
"Application to fit position calibration model to acoustic data.");
81 zap[
'f'] =
make_field(inputFile,
"output of JAcousticEventBuilder[.sh]");
83 zap[
'n'] =
make_field(numberOfEvents) = JLimit::max();
91 zap[
'u'] =
make_field(unify,
"unify weighing of pings");
97 catch(
const exception &error) {
98 FATAL(error.what() << endl);
118 for (JDetector::const_iterator i =
detector.begin(); i !=
detector.end(); ++i) {
119 receivers[i->getID()] = i->getLocation();
122 for (tripods_container::const_iterator i = tripods.begin(); i != tripods.end(); ++i) {
123 emitters[i->getID()] =
JEmitter(i->getID(),
124 i->getUTMPosition() -
detector.getUTMPosition());
143 simplex.debug =
debug;
144 gandalf.debug =
debug;
147 JKatoomba_t::setOption(
false);
154 TH1D h0(
"chi2/NDF", NULL, 50000, 0.0, 1000.0);
155 TH1D
h1(
"h1", NULL, 51, -0.5, 50.5);
159 range.getLength(),
range.getLowerLimit() - 0.5,
range.getLowerLimit() + 0.5));
163 range.getLength(),
range.getLowerLimit() - 0.5,
range.getLowerLimit() + 0.5));
165 for (Int_t i = 1; i <= HA->GetXaxis()->GetNbins(); ++i) {
166 HA->GetXaxis()->SetBinLabel(i,
MAKE_CSTRING(geometry.at(i-1).first));
167 HB->GetXaxis()->SetBinLabel(i,
MAKE_CSTRING(geometry.at(i-1).first));
183 limit.setLowerLimit(limit.getLowerLimit() -
in.skip(limit.getLowerLimit()));
185 const size_t N = zbuf.size();
187 for ( ;
in.hasNext() && number_of_events != limit; ++number_of_events) {
189 STATUS(
"input " << setw(8) << number_of_events <<
'\r');
DEBUG(endl);
197 if (oid != evt->
getOID()) {
198 FATAL(
"Invalid detector identifier " << evt->
getOID() <<
" != " << oid << endl);
201 zbuf.push_back(*evt);
210 if (q != zbuf.begin() && q != zbuf.end()) {
216 if (p->empty() || q->empty() || *q < *p) {
228 int counter[] = { 0, 0 };
234 for (q = p; ++q != zbuf.end() && q->begin()->getToE() <= p->rbegin()->getToE() +
parameters.Tmax_s; ) {}
243 numberOfPings[i->getID()] += 1;
247 DEBUG(
"Number of pings " << setw(2) << i->first <<
' ' << setw(3) << i->second << endl);
250 int minimum_number_of_pings = numeric_limits<int>::max();
253 minimum_number_of_pings = min(minimum_number_of_pings, i->second);
260 const JEmitter& emitter = emitters[i->getID()];
262 const double signal = (unify ? (double) minimum_number_of_pings / (
double) numberOfPings[i->getID()] : 1.0);
268 for (
JEvent::const_iterator hit = i->begin(); hit != i->end(); ++hit) {
271 buffer[hit->getID()].push_back(*hit);
277 if (receivers.has(ps->first) && geometry.hasLocation(receivers[ps->first])) {
281 if (ps->second.begin()->getQ() >=
parameters.Qmin) {
285 receivers[ps->first],
293 DEBUG(
"hit: " << *hit << endl);
300 DEBUG(
"prefit:" << endl
305 HA[hit->getID()]->Fill(geometry.getIndex(hit->getString()), hit->getFloor(), 1.0);
313 double chi2_old = evaluator(result, data.begin(), data.end());
323 const double x = fabs(hit->getValue() - estimator.getToA(result, *hit)) / hit->sigma;
335 iter_swap(out, --__end);
337 result = estimator(data.begin(), __end);
339 double chi2_new = evaluator(result, data.begin(), __end);
343 DEBUG(
"Remove outlier " << __end->getLocation() <<
' ' << xmax << endl);
358 DEBUG(
"hit: " << *hit << endl);
361 DEBUG(
"prefit:" << endl
365 HB[hit->getID()]->Fill(geometry.getIndex(hit->getString()), hit->getFloor(), 1.0);
369 double chi2 = numeric_limits<double>::max();
375 result = estimator(data.begin(), data.end());
376 chi2 = evaluator(result, data.begin(), data.end());
383 chi2 = simplex(data.begin(), data.end()) / simplex.estimator->getRho(1.0);
384 result = simplex.value;
391 chi2 = gandalf(data.begin(), data.end()) / gandalf.estimator->getRho(1.0);
392 result = gandalf.value;
402 W += hit->getWeight();
405 const int ndf = data.size() - result.
getN();
407 DEBUG(
"result:" << endl
408 <<
FIXED(9,3) << chi2 <<
'/' << ndf << endl
411 h0.Fill(chi2 / (W - result.
getN()));
417 const JEvt evt =
getEvt(
JHead(oid, data.begin()->getValue(), data.rbegin()->getValue(), ndf, (W - result.
getN()), chi2),
result);
425 const double toe = result.
emitter[
JEKey(i->getID(), i->getCounter())].t1;
427 for (JEvent::iterator hit = out.begin(); hit != out.end(); ++hit) {
438 WARNING(endl <<
"Event not written: " << chi2 <<
'/' << ndf << endl);
446 STATUS(
"Number of events written / rejected: " << counter[0] <<
" / " << counter[1] << endl);
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.
then JShowerPostfit f $INPUT_FILE o $OUTPUT_FILE N
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.
then for HISTOGRAM in h0 h1
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Long64_t counter_type
Type definition for counter.
Auxiliary data structure for floating point format specification.
floor_range getRangeOfFloors(const JDetector &detector)
Get range of floors.
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))
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
const std::string & getOID() const
Get detector identifier.
double getQ(const double D_m, const double f_kHz, const double d_m)
Get relative quality for given frequency at given distance.
counter_type advance(counter_type &counter, const counter_type value, const counter_type limit=std::numeric_limits< counter_type >::max())
Advance counter.
static const JStringCounter getNumberOfStrings
Function object to count unique strings.
Implementation for velocity of sound.
z range($ZMAX-$ZMIN)< $MINIMAL_DZ." fi fi typeset -Z 4 STRING typeset -Z 2 FLOOR JPlot1D -f $
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.
const JLimit & getLimit() const
Get limit.
JMEstimator * getMEstimator(const int type)
Get M-Estimator.
do set_variable DETECTOR_TXT $WORKDIR detector
then fatal Wrong number of arguments fi set_variable DETECTOR $argv[1] set_variable INPUT_FILE $argv[2] eval JPrintDetector a $DETECTOR O IDENTIFIER eval JPrintDetector a $DETECTOR O SUMMARY source JAcoustics sh $DETECTOR_ID CHECK_EXIT_CODE typeset A TRIPODS get_tripods $WORKDIR tripod txt TRIPODS for EMITTER in
Acoustic transmission identifier.
do if[[!-f $ACOUSTICS_WORKDIR/${KEY}.txt]]
then usage $script< string identifier >< detectorfile > event file(toashort file)+" "\nNote that the event files and toashort files should be one-to-one related." fi if (( $