68{
69 using namespace std;
71
75 typedef JContainer< set<JTransmission_t> > disable_container;
76
77 JMultipleFileScanner<JEvent> inputFile;
78 JFileRecorder<JTYPELIST<JSuperEvt, JFitParameters, JMeta>::typelist> outputFile;
79 string detectorFile;
80 JLimit_t& numberOfEvents = inputFile.getLimit();
86 disable_container disable;
87 size_t threads;
88 bool& squash = JFremantle::squash;
89 int debug;
90
91 try {
92
93 JParser<> zap("Application to fit position calibration model to acoustic data.");
94
95 zap['f'] = make_field(inputFile, "output of JAcousticEventBuilder[.sh]");
96 zap['o'] = make_field(outputFile) = "";
97 zap['n'] = make_field(numberOfEvents) = JLimit::max();
98 zap['a'] = make_field(detectorFile);
99 zap['@'] = make_field(parameters) = JPARSER::initialised();
100 zap['V'] = make_field(V, "sound velocity") = JPARSER::initialised();
101 zap['T'] = make_field(tripods, "tripod data");
102 zap['Y'] = make_field(transmitters, "transmitter data") = JPARSER::initialised();
103 zap['H'] = make_field(hydrophones, "hydrophone data") = JPARSER::initialised();
104 zap['M'] = make_field(getMechanics, "mechanics data") = JPARSER::initialised();
105 zap['!'] = make_field(disable, "disable transmission") = JPARSER::initialised();
106 zap['N'] = make_field(threads, "number of threads") = 1;
107 zap['s'] = make_field(squash, "squash transmissions in output");
108 zap['d'] = make_field(debug) = 1;
109
110 zap(argc, argv);
111 }
112 catch(const exception &error) {
113 FATAL(error.what() << endl);
114 }
115
116 ROOT::EnableThreadSafety();
117
118 JDetector detector;
119
120 try {
121 load(detectorFile, detector);
122 }
123 catch(const JException& error) {
124 FATAL(error);
125 }
126
127 JHashMap<int, JLocation> receivers;
128 JHashMap<int, JEmitter> emitters;
129
130 for (JDetector::const_iterator i = detector.begin(); i != detector.end(); ++i) {
131 receivers[i->getID()] = i->getLocation();
132 }
133
134 for (tripods_container::const_iterator i = tripods.begin(); i != tripods.end(); ++i) {
135 emitters[i->getID()] =
JEmitter(i->getID(), i->getUTMPosition() - detector.getUTMPosition());
136 }
137
138 for (transmitters_container::const_iterator i = transmitters.begin(); i != transmitters.end(); ++i) {
139 try {
140 emitters[i->getID()] =
JEmitter(i->getID(), i->getPosition() + detector.getModule(i->getLocation()).getPosition());
141 }
142 catch(const exception&) {}
143 }
144
145 V.
set(detector.getUTMZ());
146
147 JGeometry geometry(detector, hydrophones);
149
151
154
155 if (inputFile.size() > 1u) {
156
157 map<double, string> zmap;
158
159 for (const string& file_name : inputFile) {
160
161 STATUS(file_name << '\r'); DEBUG(endl);
162
163 for (JSingleFileScanner<JEvent> in(file_name, 1); in.hasNext(); ) {
164
165 const JEvent* evt = in.next();
166
168 FATAL(
"Invalid detector identifier " << evt->
getDetectorID() <<
" != " << JFremantle::detid << endl);
169 }
170
171 if (!evt->empty()) {
172 zmap[evt->begin()->getToE()] = file_name;
173 }
174 }
175 }
176 STATUS(endl);
177
178 inputFile.clear();
179
180 for (map<double, string>::const_iterator i = zmap.begin(); i != zmap.end(); ++i) {
181 inputFile.push_back(i->second);
182 }
183 }
184
185 if (outputFile.getFilename() != "" &&
186 outputFile.getFilename() != "--") {
187
188 outputFile.open();
189
190 JFremantle::output = &outputFile;
191 }
192
193
194
195
196
197 try {
198
199 JFremantle fremantle(geometry, V, parameters, threads, 2 * threads);
200
201 typedef deque<JEvent> buffer_type;
202
203 for (buffer_type zbuf; inputFile.hasNext(); ) {
204
205 STATUS(inputFile.getFilename() << '\r'); DEBUG(endl);
206
207
208
209 for (const string file_name = inputFile.getFilename(); inputFile.hasNext() && file_name == inputFile.getFilename(); ) {
210
211 const JEvent* evt = inputFile.next();
212
213 if (!evt->empty() && emitters.has(evt->
getID())) {
214 zbuf.push_back(*evt);
215 }
216 }
217
218 sort(zbuf.begin(), zbuf.end());
219
220 for (buffer_type::iterator p = zbuf.begin(), q; p != zbuf.end(); p = q) {
221
222 for (q = p; ++q != zbuf.end() && q->begin()->getToE() <= p->rbegin()->getToE() + parameters.
Tmax_s; ) {}
223
224 if (q == zbuf.end()) {
225
226 if (inputFile.hasNext()) {
227
228 zbuf.erase(zbuf.begin(), p);
229
230 break;
231 }
232 }
233
235
237
239
241
242 for (buffer_type::iterator evt = p; evt != q; ++evt) {
243
245
246 JEvent::iterator __end = unique(evt->begin(), evt->end(), make_comparator(&JTransmission::getID, JComparison::eq()));
247
250
251 for (JEvent::const_iterator i = evt->begin(); i != __end; ++i) {
252
255
256 if (receivers.has(i->getID()) && geometry.hasLocation(receivers[i->getID()]) && i->getQ() >= parameters.
Qmin * (parameters.
Qmin <= 1.0 ? i->getW() : 1.0)) {
257
258 data.push_back(
JHit(emitter,
259 distance(p,evt),
260 receivers[i->getID()],
261 i->getToA(),
263 weight));
264 }
265 }
266 }
267 }
268
270 fremantle.enqueue(data);
271 }
272 }
273 }
274 }
275 STATUS(endl);
276 }
277 catch(const exception& error) {
278 FATAL("main " << error.what());
279 }
280
281
282
283
284
285 outputFile.close();
286
287 JFileOutputStream(3) << SCIENTIFIC(1,10) << JFremantle::Q.getMean(numeric_limits<float>::max()) << endl;
288}
Thread pool for global fits.
std::vector< JHit > input_type
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.
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]
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.
Auxiliary data structure to unify weights of acoustics data according to the number of pings per emit...