60int main(
int argc,
char **argv)
68 typedef JContainer< set<JTransmission_t> > disable_container;
70 JMultipleFileScanner<JEvent> inputFile;
71 JFileRecorder<JTYPELIST<JEvt, JEvent, JFitParameters, JMeta, TH1D, TH2D>::typelist> outputFile;
73 JLimit_t& numberOfEvents = inputFile.getLimit();
79 disable_container disable;
80 JROOTClassSelection selection = getROOTClassSelection<JTYPELIST<JEvent>::typelist>();
88 JParser<> zap(
"Application to fit position calibration model to acoustic data.");
90 zap[
'f'] = make_field(inputFile,
"output of JAcousticEventBuilder[.sh]");
91 zap[
'o'] = make_field(outputFile);
92 zap[
'n'] = make_field(numberOfEvents) = JLimit::max();
93 zap[
'a'] = make_field(detectorFile);
94 zap[
'@'] = make_field(parameters) = JPARSER::initialised();
95 zap[
'V'] = make_field(V,
"sound velocity") = JPARSER::initialised();
96 zap[
'T'] = make_field(tripods,
"tripod data");
97 zap[
'Y'] = make_field(transmitters,
"transmitter data") = JPARSER::initialised();
98 zap[
'H'] = make_field(hydrophones,
"hydrophone data") = JPARSER::initialised();
99 zap[
'M'] = make_field(getMechanics,
"mechanics data") = JPARSER::initialised();
100 zap[
'!'] = make_field(disable,
"disable transmission") = JPARSER::initialised();
101 zap[
'C'] = make_field(selection,
102 "Precede name of data structure by a '+' or '-' "
103 "to add or remove data types in the output, respectively."
104 "\nROOT wildcards are accepted.") = JPARSER::initialised();
105 zap[
'u'] = make_field(utc,
"select UTC time range") = JRange<double>();
106 zap[
'q'] = make_field(squash,
"squash meta data");
107 zap[
'R'] = make_field(autoflush) = 5000;
108 zap[
'd'] = make_field(debug) = 1;
112 catch(
const exception &error) {
113 FATAL(error.what() << endl);
120 load(detectorFile, detector);
122 catch(
const JException& error) {
126 const floor_range range = getRangeOfFloors(detector);
128 JHashMap<int, JLocation> receivers;
129 JHashMap<int, JEmitter> emitters;
131 for (JDetector::const_iterator i = detector.begin(); i != detector.end(); ++i) {
132 receivers[i->getID()] = i->getLocation();
135 for (tripods_container::const_iterator i = tripods.begin(); i != tripods.end(); ++i) {
136 emitters[i->getID()] =
JEmitter(i->getID(), i->getUTMPosition() - detector.getUTMPosition());
139 for (transmitters_container::const_iterator i = transmitters.begin(); i != transmitters.end(); ++i) {
141 emitters[i->getID()] =
JEmitter(i->getID(), i->getPosition() + detector.getModule(i->getLocation()).getPosition());
143 catch(
const exception&) {}
146 V.
set(detector.getUTMZ());
148 JGeometry geometry(detector, hydrophones);
156 typedef vector<JHit> data_type;
158 TH1D h0(
"chi2/NDF", NULL, 50000, 0.0, 1000.0);
159 TH1D h1(
"h1", NULL, 51, -0.5, 50.5);
160 TH1D hn(
"hn", NULL, 100, 0.0, 6.0);
162 JManager<int, TH2D> HA(
new TH2D(
"ha[%]", NULL,
163 getNumberOfStrings(detector) + 0, -0.5, getNumberOfStrings(detector) - 0.5,
164 range.getLength() + 1, range.getLowerLimit() - 0.5, range.getUpperLimit() + 0.5));
166 JManager<int, TH2D> HB(
new TH2D(
"hb[%]", NULL,
167 getNumberOfStrings(detector) + 0, -0.5, getNumberOfStrings(detector) - 0.5,
168 range.getLength() + 1, range.getLowerLimit() - 0.5, range.getUpperLimit() + 0.5));
170 for (Int_t i = 1; i <= HA->GetXaxis()->GetNbins(); ++i) {
171 HA->GetXaxis()->SetBinLabel(i, MAKE_CSTRING(geometry.at(i-1).first));
172 HB->GetXaxis()->SetBinLabel(i, MAKE_CSTRING(geometry.at(i-1).first));
175 if (inputFile.size() > 1u) {
177 map<double, string> zmap;
179 for (
const string& file_name : inputFile) {
181 STATUS(file_name <<
'\r'); DEBUG(endl);
183 for (JSingleFileScanner<JEvent> in(file_name, 1); in.hasNext(); ) {
185 const JEvent* evt = in.next();
192 zmap[evt->begin()->getToE()] = file_name;
200 for (map<double, string>::const_iterator i = zmap.begin(); i != zmap.end(); ++i) {
201 inputFile.push_back(i->second);
207 outputFile.put(JMeta(argc, argv));
208 outputFile.put(parameters);
211 dynamic_cast<JTreeWriterObjectOutput<JEvent>&
>(*outputFile).getTreeWriter().SetAutoFlush(autoflush);
212 dynamic_cast<JTreeWriterObjectOutput<JEvent>&
>(*outputFile).getTreeWriter().SetCacheSize();
214 catch(
const exception&) {}
216 int counter[] = { 0, 0 };
218 typedef deque<JEvent> buffer_type;
220 for (buffer_type zbuf; inputFile.hasNext(); ) {
222 STATUS(inputFile.getFilename() <<
'\r'); DEBUG(endl);
226 for (
const string file_name = inputFile.getFilename(); inputFile.hasNext() && file_name == inputFile.getFilename(); ) {
228 const JEvent* evt = inputFile.next();
230 if (!evt->empty() && emitters.has(evt->
getID())) {
231 if (utc(evt->begin()->getToA()) && utc(evt->rbegin()->getToA())) {
232 zbuf.push_back(*evt);
237 sort(zbuf.begin(), zbuf.end());
239 for (buffer_type::iterator p = zbuf.begin(), q; p != zbuf.end(); p = q) {
241 for (q = p; ++q != zbuf.end() && q->begin()->getToE() <= p->rbegin()->getToE() + parameters.
Tmax_s; ) {}
243 if (q == zbuf.end()) {
245 if (inputFile.hasNext()) {
247 zbuf.erase(zbuf.begin(), p);
255 if (getNumberOfEmitters(p,q) >= parameters.
Nmin) {
257 h1.Fill((
double) getNumberOfEmitters(p,q));
263 for (buffer_type::iterator evt = p; evt != q; ++evt) {
267 JEvent::iterator __end = unique(evt->begin(), evt->end(), make_comparator(&JTransmission::getID, JComparison::eq()));
269 const JEmitter& emitter = emitters [evt->getID()];
270 const double weight = getWeight(evt->getID());
272 for (JEvent::const_iterator i = evt->begin(); i != __end; ++i) {
277 if (receivers.has(i->getID()) && geometry.
hasLocation(receivers[i->getID()]) && i->getQ() >= parameters.
Qmin * (parameters.
Qmin <= 1.0 ? i->getW() : 1.0)) {
279 data.push_back(
JHit(emitter,
281 receivers[i->getID()],
290 if (getMinimumNumberOfEmitters(data.begin(), data.end()) >= parameters.
Nmin) {
292 for (data_type::const_iterator hit = data.begin(); hit != data.end(); ++hit) {
293 HA[hit->getID()]->Fill(geometry.getIndex(hit->getString()), hit->getFloor(), 1.0);
298 const auto result = katoomba(data.begin(), data.end());
300 for (data_type::const_iterator hit = result.begin; hit != result.end; ++hit) {
301 HB[hit->getID()]->Fill(geometry.getIndex(hit->getString()), hit->getFloor(), 1.0);
304 if (debug >= debug_t) {
306 cout <<
"result:" <<
' '
307 << FIXED(12,3) << result.chi2 <<
'/' << FIXED(6,1) << result.ndf << endl
308 << result.value << endl;
310 for (data_type::const_iterator hit = result.begin; hit != result.end; ++hit) {
311 cout <<
"hit: " << *hit <<
' ' << FIXED(9,3) << katoomba.
evaluator(result.value, *hit) << endl;
316 h0.Fill(result.chi2 / result.ndf);
324 result.getTimeRange(),
335 if (selection.is_valid<
JEvent>()) {
337 for (buffer_type::iterator i = p; i != q; ++i) {
341 const double toe = result.value.emission[
JEKey(i->getID(), distance(p,i))].t1;
343 for (JEvent::iterator hit = out.begin(); hit != out.end(); ++hit) {
357 WARNING(endl <<
"Event not written - chi2/NDF " << FIXED(12,3) << result.chi2 <<
'/' << FIXED(6,1) << result.ndf << endl);
364 WARNING(endl <<
"Event not accepted - minimum number of emitters " << getMinimumNumberOfEmitters(data.begin(), data.end()) << endl);
373 STATUS(
"Number of events written / rejected: " << counter[0] <<
" / " << counter[1] << endl);
377 JMultipleFileScanner<JMeta> io(inputFile);
386 for (JManager<int, TH2D>::const_iterator i = HA.begin(); i != HA.end(); ++i) { outputFile.put(*(i->second)); }
387 for (JManager<int, TH2D>::const_iterator i = HB.begin(); i != HB.end(); ++i) { outputFile.put(*(i->second)); }