67int main(
int argc,
char **argv)
75 typedef JContainer< set<JTransmission_t> > disable_container;
77 JMultipleFileScanner<JEvent> inputFile;
78 JFileRecorder<JTYPELIST<JSuperEvt, JFitParameters, JMeta>::typelist> outputFile;
80 JLimit_t& numberOfEvents = inputFile.getLimit();
86 disable_container disable;
88 bool& squash = JFremantle::squash;
93 JParser<> zap(
"Application to fit position calibration model to acoustic data.");
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;
112 catch(
const exception &error) {
113 FATAL(error.what() << endl);
116 ROOT::EnableThreadSafety();
121 load(detectorFile, detector);
123 catch(
const JException& error) {
127 JHashMap<int, JLocation> receivers;
128 JHashMap<int, JEmitter> emitters;
130 for (JDetector::const_iterator i = detector.begin(); i != detector.end(); ++i) {
131 receivers[i->getID()] = i->getLocation();
134 for (tripods_container::const_iterator i = tripods.begin(); i != tripods.end(); ++i) {
135 emitters[i->getID()] =
JEmitter(i->getID(), i->getUTMPosition() - detector.getUTMPosition());
138 for (transmitters_container::const_iterator i = transmitters.begin(); i != transmitters.end(); ++i) {
140 emitters[i->getID()] =
JEmitter(i->getID(), i->getPosition() + detector.getModule(i->getLocation()).getPosition());
142 catch(
const exception&) {}
145 V.
set(detector.getUTMZ());
147 JGeometry geometry(detector, hydrophones);
155 if (inputFile.size() > 1u) {
157 map<double, string> zmap;
159 for (
const string& file_name : inputFile) {
161 STATUS(file_name <<
'\r'); DEBUG(endl);
163 for (JSingleFileScanner<JEvent> in(file_name, 1); in.hasNext(); ) {
165 const JEvent* evt = in.next();
168 FATAL(
"Invalid detector identifier " << evt->
getDetectorID() <<
" != " << JFremantle::detid << endl);
172 zmap[evt->begin()->getToE()] = file_name;
180 for (map<double, string>::const_iterator i = zmap.begin(); i != zmap.end(); ++i) {
181 inputFile.push_back(i->second);
185 if (outputFile.getFilename() !=
"" &&
186 outputFile.getFilename() !=
"--") {
190 JFremantle::output = &outputFile;
199 JFremantle fremantle(geometry, V, parameters, threads, 2 * threads);
201 typedef deque<JEvent> buffer_type;
203 for (buffer_type zbuf; inputFile.hasNext(); ) {
205 STATUS(inputFile.getFilename() <<
'\r'); DEBUG(endl);
209 for (
const string file_name = inputFile.getFilename(); inputFile.hasNext() && file_name == inputFile.getFilename(); ) {
211 const JEvent* evt = inputFile.next();
213 if (!evt->empty() && emitters.has(evt->
getID())) {
214 zbuf.push_back(*evt);
218 sort(zbuf.begin(), zbuf.end());
220 for (buffer_type::iterator p = zbuf.begin(), q; p != zbuf.end(); p = q) {
222 for (q = p; ++q != zbuf.end() && q->begin()->getToE() <= p->rbegin()->getToE() + parameters.
Tmax_s; ) {}
224 if (q == zbuf.end()) {
226 if (inputFile.hasNext()) {
228 zbuf.erase(zbuf.begin(), p);
236 if (getNumberOfEmitters(p,q) >= parameters.
Nmin) {
242 for (buffer_type::iterator evt = p; evt != q; ++evt) {
246 JEvent::iterator __end = unique(evt->begin(), evt->end(), make_comparator(&JTransmission::getID, JComparison::eq()));
248 const JEmitter& emitter = emitters [evt->getID()];
249 const double weight = getWeight(evt->getID());
251 for (JEvent::const_iterator i = evt->begin(); i != __end; ++i) {
256 if (receivers.has(i->getID()) && geometry.
hasLocation(receivers[i->getID()]) && i->getQ() >= parameters.
Qmin * (parameters.
Qmin <= 1.0 ? i->getW() : 1.0)) {
258 data.push_back(
JHit(emitter,
260 receivers[i->getID()],
269 if (getMinimumNumberOfEmitters(data.begin(), data.end()) >= parameters.
Nmin) {
277 catch(
const exception& error) {
278 FATAL(
"main " << error.what());
287 JFileOutputStream(3) << SCIENTIFIC(1,10) << JFremantle::Q.getMean(numeric_limits<float>::max()) << endl;