77 transmitters_container transmitters;
78 hydrophones_container hydrophones;
83 disable_container disable;
84 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.");
105 zap[
'u'] =
make_field(unify,
"unify weighing of pings");
113 catch(
const exception &error) {
114 FATAL(error.what() << endl);
118 gRandom->SetSeed(seed);
120 if (numberOfEvents <= 0) {
FATAL(
"Invalid number of events " << numberOfEvents << endl); }
133 for (tripods_container::const_iterator i =
tripods.begin(); i !=
tripods.end(); ++i) {
134 emitters.push_back(
JEmitter(i->getID(),
135 i->getUTMPosition() -
detector.getUTMPosition()));
138 for (transmitters_container::const_iterator i = transmitters.begin(); i != transmitters.end(); ++i) {
140 emitters.push_back(
JEmitter(i->getID(),
143 catch(
const exception&) {
148 if (
detector.empty()) {
FATAL(
"No modules in detector." << endl); }
149 if (emitters.empty()) {
FATAL(
"No emitters in system." << endl); }
154 const double D_m = -
detector.getUTMZ();
169 simplex.debug =
debug;
170 gandalf.debug =
debug;
178 TH1D h0(
"cpu", NULL, 100, 1.0, 7.0);
179 TH1D h1(
"chi2/NDF", NULL, 100, 0.0, 5.0);
187 for (
int number_of_events = 0, count = 0; number_of_events != numberOfEvents; ++number_of_events) {
189 STATUS(
"event: " << setw(10) << number_of_events <<
'\r');
DEBUG(endl);
193 for (JDetector::const_iterator module =
detector.begin(); module !=
detector.end(); ++module) {
198 gRandom->Uniform(-2.0e-2, +2.0e-2));
202 DEBUG(
"Model" << endl << model << endl);
206 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
207 if (geometry.hasLocation(module->getLocation())) {
208 module->set(estimator.detector[module->getString()].getPosition(model.
string[module->getString()], module->getFloor()));
215 int minimum_number_of_pings = numeric_limits<int>::max();
218 minimum_number_of_pings = min(minimum_number_of_pings,
getValue(numberOfPings, emitter->getID(), numberOfPings[WILDCARD]));
225 const int number_of_pings =
getValue(numberOfPings, emitter->getID(), numberOfPings[WILDCARD]);
227 const double signal = (unify ? (double) minimum_number_of_pings / (
double) number_of_pings : 1.0);
229 for (
int ping_counter = 0; ping_counter != number_of_pings; ++ping_counter) {
233 const double toe_s = ping_counter * 10.0 + gRandom->Uniform(-1.0, +1.0);
235 model.
emitter[emitter->getID()][count] = toe_s;
237 for (JDetector::const_iterator module =
detector.begin(); module !=
detector.end(); ++module) {
239 if (disable.count(
JTransmission_t(emitter->getID(), module->getID())) == 0) {
241 if (geometry.hasLocation(module->getLocation())) {
243 const JWaveform& waveform =
getValue(waveforms, emitter->getID(), waveforms[WILDCARD]);
245 const double d_m =
getDistance(module->getPosition(), emitter->getPosition());
246 const double toa_s = toe_s +
V.getTime(d_m, emitter->getZ(), module->getZ());
247 const double Q = waveform.
getQ(D_m, d_m);
254 t1_s = gRandom->Gaus(toa_s,
parameters.sigma_s);
256 t1_s = gRandom->Uniform(toa_s + T_s.getLowerLimit(),
257 toa_s + T_s.getUpperLimit());
261 module->getLocation(),
264 DEBUG(
"hit: " << hit <<
' ' <<
FIXED(7,1) << Q << endl);
279 double chi2 = numeric_limits<double>::max();
285 chi2 = evaluator(result, data.begin(), data.end());
292 chi2 = simplex(data.begin(), data.end()) / simplex.estimator->getRho(1.0);
293 result = simplex.value;
300 chi2 = gandalf(data.begin(), data.end()) / gandalf.estimator->getRho(1.0);
301 result = gandalf.value;
313 W += hit->getWeight();
316 const int ndf = data.size() - result.
getN();
318 DEBUG(
"Final values" << endl
319 <<
FIXED(9,3) << chi2 <<
'/' << ndf << endl
323 h0.Fill(
log10((
double) timer.usec_wall));
324 h1.Fill(chi2 / (
double) (W - result.
getN()));
327 H2[i->first]->Fill((i->second.tx - result.
string [i->first].tx) * 1.0e3,
328 (i->second.ty - result.
string [i->first].ty) * 1.0e3);
332 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.
Q(UTCMax_s-UTCMin_s)-livetime_s
double getValue(const JScale_t scale)
Get numerical value corresponding to scale.
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
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)
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.
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
set_variable E_E log10(E_{fit}/E_{#mu})"
Auxiliary class for CPU timing and usage.
JPosition3D getPosition(const Vec &pos)
Get position.
Implementation for depth dependend 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 if[[!-f $DETECTOR]] then JDetector sh $DETECTOR fi cat $WORKDIR trigger_parameters txt<< EOFtrigger3DMuon.enabled=1;trigger3DMuon.numberOfHits=5;trigger3DMuon.gridAngle_deg=1;ctMin=0.0;TMaxLocal_ns=15.0;EOF set_variable TRIGGEREFFICIENCY_TRIGGERED_EVENTS_ONLY INPUT_FILES=() for((i=1;$i<=$NUMBER_OF_RUNS;++i));do JSirene.sh $DETECTOR $JPP_DATA/genhen.km3net_wpd_V2_0.evt.gz $WORKDIR/sirene_ ${i}.root JTriggerEfficiency.sh $DETECTOR $DETECTOR $WORKDIR/sirene_ ${i}.root $WORKDIR/trigger_efficiency_ ${i}.root $WORKDIR/trigger_parameters.txt $JPP_DATA/PMT_parameters.txt INPUT_FILES+=($WORKDIR/trigger_efficiency_ ${i}.root) done for ANGLE_DEG in $ANGLES_DEG[*];do set_variable SIGMA_NS 3.0 set_variable OUTLIERS 3 set_variable OUTPUT_FILE $WORKDIR/matrix\[${ANGLE_DEG}\deg\].root $JPP_DIR/examples/JReconstruction-f"$INPUT_FILES[*]"-o $OUTPUT_FILE-S ${SIGMA_NS}-A ${ANGLE_DEG}-O ${OUTLIERS}-d ${DEBUG}--!fiif[[$OPTION=="plot"]];then if((0));then for H1 in h0 h1;do JPlot1D-f"$WORKDIR/matrix["${^ANGLES_DEG}" deg].root:${H1}"-y"1 2e3"-Y-L TR-T""-\^"number of events [a.u.]"-> o chi2
Custom probability density function of time-of-arrival.
JMEstimator * getMEstimator(const int type)
Get M-Estimator.
do echo n Creating graphics for string $STRING for((FLOOR=$FIRST_FLOOR;$FLOOR<=$LAST_FLOOR;FLOOR+=1))
do set_variable DETECTOR_TXT $WORKDIR detector
Acoustic transmission identifier.
#define DEBUG(A)
Message macros.