71 hydrophones_container hydrophones;
75 disable_container disable;
80 JParser<> zap(
"Application to fit position calibration model to acoustic data.");
82 zap[
'f'] =
make_field(inputFile,
"output of JAcousticEventBuilder[.sh]");
84 zap[
'n'] =
make_field(numberOfEvents) = JLimit::max();
92 zap[
'u'] =
make_field(unify,
"unify weighing of pings");
98 catch(
const exception &error) {
99 FATAL(error.what() << endl);
119 for (JDetector::const_iterator i =
detector.begin(); i !=
detector.end(); ++i) {
120 receivers[i->getID()] = i->getLocation();
123 for (tripods_container::const_iterator i =
tripods.begin(); i !=
tripods.end(); ++i) {
124 emitters[i->getID()] =
JEmitter(i->getID(),
125 i->getUTMPosition() -
detector.getUTMPosition());
144 simplex.debug =
debug;
145 gandalf.debug =
debug;
148 JKatoomba_t::setOption(
false);
155 TH1D h0(
"chi2/NDF", NULL, 50000, 0.0, 1000.0);
156 TH1D
h1(
"h1", NULL, 51, -0.5, 50.5);
160 range.getLength() + 1,
range.getLowerLimit() - 0.5,
range.getUpperLimit() + 0.5));
164 range.getLength() + 1,
range.getLowerLimit() - 0.5,
range.getUpperLimit() + 0.5));
166 for (Int_t i = 1; i <= HA->GetXaxis()->GetNbins(); ++i) {
167 HA->GetXaxis()->SetBinLabel(i,
MAKE_CSTRING(geometry.at(i-1).first));
168 HB->GetXaxis()->SetBinLabel(i,
MAKE_CSTRING(geometry.at(i-1).first));
176 for (
const string& file_name : inputFile) {
186 else if (oid != evt->
getOID())
187 FATAL(
"Invalid detector identifier " << evt->
getOID() <<
" != " << oid << endl);
190 zmap[evt->begin()->getToE()] = file_name;
199 inputFile.push_back(i->second);
208 int counter[] = { 0, 0 };
210 typedef deque<JEvent> buffer_type;
212 for (buffer_type zbuf; inputFile.hasNext(); ) {
214 STATUS(inputFile.getFilename() <<
'\r');
DEBUG(endl);
218 for (
const string file_name = inputFile.getFilename(); inputFile.hasNext() && file_name == inputFile.getFilename(); ) {
220 const JEvent* evt = inputFile.next();
222 zbuf.push_back(*evt);
225 sort(zbuf.begin(), zbuf.end());
227 for (buffer_type::iterator p = zbuf.begin(), q; p != zbuf.end(); p = q) {
229 for (q = p; ++q != zbuf.end() && q->begin()->getToE() <= p->rbegin()->getToE() +
parameters.Tmax_s; ) {}
231 if (q == zbuf.end()) {
233 if (inputFile.hasNext()) {
235 zbuf.erase(zbuf.begin(), p);
247 for (buffer_type::const_iterator i = p; i != q; ++i) {
248 numberOfPings[i->getID()] += 1;
252 DEBUG(
"Number of pings " << setw(2) << i->first <<
' ' << setw(3) << i->second << endl);
255 int minimum_number_of_pings = numeric_limits<int>::max();
258 minimum_number_of_pings = min(minimum_number_of_pings, i->second);
263 for (buffer_type::iterator i = p; i != q; ++i) {
265 const JEmitter& emitter = emitters[i->getID()];
267 const double signal = (unify ? (double) minimum_number_of_pings / (
double) numberOfPings[i->getID()] : 1.0);
273 for (
JEvent::const_iterator hit = i->begin(); hit != i->end(); ++hit) {
276 buffer[hit->getID()].push_back(*hit);
282 if (receivers.has(ps->first) && geometry.hasLocation(receivers[ps->first])) {
286 if (ps->second.begin()->getQ() >=
parameters.Qmin) {
290 receivers[ps->first],
298 DEBUG(
"hit: " << *hit << endl);
304 DEBUG(
"prefit:" << endl
309 HA[hit->getID()]->Fill(geometry.getIndex(hit->getString()), hit->getFloor(), 1.0);
317 double chi2_old = evaluator(result, data.begin(), data.end());
327 const double x = fabs(hit->getValue() - estimator.getToA(result, *hit)) / hit->sigma;
339 iter_swap(out, --__end);
341 result = estimator(data.begin(), __end);
343 double chi2_new = evaluator(result, data.begin(), __end);
347 DEBUG(
"Remove outlier " << __end->getEKey() <<
' ' << __end->getLocation() <<
' ' << xmax << endl);
357 result = estimator(data.begin(), ++__end);
366 DEBUG(
"hit: " << *hit << endl);
369 DEBUG(
"prefit:" << endl
373 HB[hit->getID()]->Fill(geometry.getIndex(hit->getString()), hit->getFloor(), 1.0);
377 double chi2 = numeric_limits<double>::max();
383 result = estimator(data.begin(), data.end());
384 chi2 = evaluator(result, data.begin(), data.end());
391 chi2 = simplex(data.begin(), data.end()) / simplex.estimator->getRho(1.0);
392 result = simplex.value;
399 chi2 = gandalf(data.begin(), data.end()) / gandalf.estimator->getRho(1.0);
400 result = gandalf.value;
410 W += hit->getWeight();
413 const int ndf = data.size() - result.
getN();
415 DEBUG(
"result:" << endl
416 <<
FIXED(9,3) << chi2 <<
'/' << ndf << endl
419 h0.Fill(chi2 / (W - result.
getN()));
425 const JEvt evt =
getEvt(
JHead(oid, data.begin()->getValue(), data.rbegin()->getValue(), ndf, (W - result.
getN()), chi2),
result);
429 for (buffer_type::const_iterator i = p; i != q; ++i) {
433 const double toe = result.
emitter[
JEKey(i->getID(), i->getCounter())].t1;
435 for (JEvent::iterator hit = out.begin(); hit != out.end(); ++hit) {
446 WARNING(endl <<
"Event not written: " << chi2 <<
'/' << ndf << endl);
455 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.
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)...
Auxiliary data structure for floating point format specification.
V(JDAQEvent-JTriggerReprocessor)*1.0/(JDAQEvent+1.0e-10)
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.
static const JStringCounter getNumberOfStrings
Function object to count unique strings.
Implementation for depth dependend 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.
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...
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 Not enough tripods
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]]