61{
64
69
72 string detectorFile;
73 JLimit_t& numberOfEvents = inputFile.getLimit();
79 disable_container disable;
82 bool squash;
84
85 try {
86
87 JParser<> zap(
"Application to fit position calibration model to acoustic data.");
88
89 zap[
'f'] =
make_field(inputFile,
"output of JAcousticEventBuilder[.sh]");
101 "Precede name of data structure by a '+' or '-' "
102 "to add or remove data types in the output, respectively."
105 zap[
'q'] =
make_field(squash,
"squash meta data");
107
108 zap(argc, argv);
109 }
110 catch(const exception &error) {
111 FATAL(error.what() << endl);
112 }
113
114
116
117 try {
119 }
122 }
123
125
128
129 for (JDetector::const_iterator i =
detector.begin(); i !=
detector.end(); ++i) {
130 receivers[i->getID()] = i->getLocation();
131 }
132
133 for (tripods_container::const_iterator i = tripods.begin(); i != tripods.end(); ++i) {
134 emitters[i->getID()] =
JEmitter(i->getID(), i->getUTMPosition() -
detector.getUTMPosition());
135 }
136
137 for (transmitters_container::const_iterator i = transmitters.begin(); i != transmitters.end(); ++i) {
138 try {
139 emitters[i->getID()] =
JEmitter(i->getID(), i->getPosition() +
detector.getModule(i->getLocation()).getPosition());
140 }
141 catch(const exception&) {}
142 }
143
145
148
151
153
155
156 TH1D h0("chi2/NDF", NULL, 50000, 0.0, 1000.0);
157 TH1D h1("h1", NULL, 51, -0.5, 50.5);
158 TH1D hn("hn", NULL, 100, 0.0, 6.0);
159
163
167
168 for (Int_t i = 1; i <= HA->GetXaxis()->GetNbins(); ++i) {
169 HA->GetXaxis()->SetBinLabel(i,
MAKE_CSTRING(geometry.at(i-1).first));
170 HB->GetXaxis()->SetBinLabel(i,
MAKE_CSTRING(geometry.at(i-1).first));
171 }
172
173 if (inputFile.size() > 1u) {
174
176
177 for (const string& file_name : inputFile) {
178
180
182
183 const JEvent* evt = in.next();
184
187 }
188
189 if (!evt->empty()) {
190 zmap[evt->begin()->getToE()] = file_name;
191 }
192 }
193 }
195
196 inputFile.clear();
197
199 inputFile.push_back(i->second);
200 }
201 }
202
204
207
208 try {
210 }
211 catch(const exception&) {}
212
213 int counter[] = { 0, 0 };
214
216
218
219 STATUS(inputFile.getFilename() <<
'\r');
DEBUG(endl);
220
221
222
223 for (const string file_name = inputFile.getFilename(); inputFile.hasNext() && file_name == inputFile.getFilename(); ) {
224
225 const JEvent* evt = inputFile.next();
226
227 if (!evt->empty() && emitters.
has(evt->
getID())) {
228 if (utc(evt->begin()->getToA()) && utc(evt->rbegin()->getToA())) {
229 zbuf.push_back(*evt);
230 }
231 }
232 }
233
234 sort(zbuf.begin(), zbuf.end());
235
236 for (buffer_type::iterator p = zbuf.begin(), q; p != zbuf.end(); p = q) {
237
238 for (q = p; ++q != zbuf.end() && q->begin()->getToE() <= p->rbegin()->getToE() + parameters.
Tmax_s; ) {}
239
240 if (q == zbuf.end()) {
241
242 if (inputFile.hasNext()) {
243
244 zbuf.erase(zbuf.begin(), p);
245
246 break;
247 }
248 }
249
251
253
255
257
259
260 for (buffer_type::iterator evt = p; evt != q; ++evt) {
261
263
265
268
269 for (JEvent::const_iterator i = evt->begin(); i != __end; ++i) {
270
273
274 if (receivers.
has(i->getID()) && geometry.hasLocation(receivers[i->getID()]) && i->getQ() >= parameters.
Qmin * (parameters.
Qmin <= 1.0 ? i->getW() : 1.0)) {
275
278 receivers[i->getID()],
279 i->getToA(),
281 weight));
282 }
283 }
284 }
285 }
286
288
289 for (data_type::const_iterator hit =
data.begin(); hit !=
data.end(); ++hit) {
290 HA[hit->getID()]->Fill(geometry.getIndex(hit->getString()), hit->getFloor(), 1.0);
291 }
292
293
294
296
297 for (data_type::const_iterator hit =
result.begin; hit !=
result.end; ++hit) {
298 HB[hit->getID()]->Fill(geometry.getIndex(hit->getString()), hit->getFloor(), 1.0);
299 }
300
302
303 cout << "result:" << ' '
306
307 for (data_type::const_iterator hit =
result.begin; hit !=
result.end; ++hit) {
308 cout <<
"hit: " << *hit <<
' ' <<
FIXED(9,3) << katoomba.evaluator(
result.value, *hit) << endl;
309 }
310 }
311
312 hn.Fill(log10(katoomba.gandalf.numberOfIterations));
314
315
316
319
328
330
332
333 for (buffer_type::iterator i = p; i != q; ++i) {
334
336
338
339 for (JEvent::iterator hit = out.begin(); hit != out.end(); ++hit) {
340 hit->setToE(toe);
341 }
342
344 }
345
346 }
347
348 counter[0] += 1;
349
350 } else {
351
353
354 counter[1] += 1;
355 }
356
357 } else {
358
360
361 counter[1] += 1;
362 }
363 }
364 }
365 }
367
368 STATUS(
"Number of events written / rejected: " << counter[0] <<
" / " << counter[1] << endl);
369
370 if (!squash) {
371
373
375 }
376
380
383
385}
#define DEBUG(A)
Message macros.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
#define MAKE_CSTRING(A)
Make C-string.
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
Utility class to parse command line options.
Auxiliary class to manage set of compatible ROOT objects (e.g. histograms) using unique keys.
JTreeWriter object output.
JTreeWriter< T > & getTreeWriter()
Get TreeWriter.
General purpose class for object reading from a list of file names.
Object reading from a list of files.
virtual bool hasNext() override
Check availability of next element.
size_t getMinimumNumberOfEmitters(T __begin, T __end)
Get minimum number of emitters for any string in data.
double getWeight(T __begin, T __end)
Get total weight of data points.
JContainer< std::vector< JTripod > > tripods_container
JContainer< std::vector< JTransmitter > > transmitters_container
JContainer< std::vector< JHydrophone > > hydrophones_container
size_t getNumberOfEmitters(T __begin, T __end)
Get number of emitters.
static const JSoundVelocity getSoundVelocity(1541.0, -17.0e-3, -2000.0)
Function object for velocity of sound.
static JDetectorMechanics getMechanics
Function object to get string mechanics.
JEvt getEvt(const JHead &header, const JModel &model)
Get event.
floor_range getRangeOfFloors(const JDetector &detector)
Get range of floors.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
static const JStringCounter getNumberOfStrings
Function object to count unique strings.
JComparator< JResult_t T::*, JComparison::lt > make_comparator(JResult_t T::*member)
Helper method to create comparator between values of data member.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
std::vector< JHitW0 > buffer_type
hits
std::vector< event_type > data_type
Auxiliary data structure for floating point format specification.
int getID() const
Get emitter identifier.
const int getDetectorID() const
Get detector identifier.
double Qmin
minimal quality transmission
double deadTime_s
dead time between events [s]
size_t Nmin
minimum number of emitters
double sigma_s
time-of-arrival resolution [s]
double Tmax_s
time window to combine events [s]
double chi2perNDF
maximal chi2/NDF to store event
Global fit of prameterised detector geometry to acoustics data.
Template definition of fit function of acoustic model.
Implementation for depth dependend velocity of sound.
JSoundVelocity & set(const double z0)
Set depth.
Acoustic transmission identifier.
int getID() const
Get identifier.
Auxiliary data structure to unify weights of acoustics data according to the number of pings per emit...
Data structure for measured coincidence rates of all pairs of PMTs in optical module.
Auxiliary wrapper for I/O of container with optional comment (see JComment).
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Auxiliary class for ROOT class selection.
bool is_valid() const
Get status of given data type.
Auxiliary class for defining the range of iterations of objects.
static counter_type max()
Get maximum counter value.