#include #include #include #include #include "JDetector/JDetector.hh" #include "JDetector/JDetectorToolkit.hh" #include "JDynamics/JDynamics.hh" #include "JTools/JQuantile.hh" #include "JAcoustics/JEvt.hh" #include "JAcoustics/JSupport.hh" #include "JSupport/JMultipleFileScanner.hh" #include "JSupport/JMeta.hh" #include "Jeep/JParser.hh" #include "Jeep/JMessage.hh" /** * \file * Example program to print dynamic detector calibration. * * \author mdejong */ int main(int argc, char **argv) { using namespace std; using namespace JPP; const char* const short_t = "short"; const char* const long_t = "long"; const char* const fft_t = "fft"; JMultipleFileScanner calibrationFile; string detectorFile; string outputFile; string format; double Tmax_s; int debug; try { JParser<> zap("Example program to print dynamic detector calibration."); zap['a'] = make_field(detectorFile); zap['+'] = make_field(calibrationFile); zap['o'] = make_field(outputFile) = ""; zap['F'] = make_field(format) = short_t, long_t, fft_t; zap['T'] = make_field(Tmax_s) = 1000.0; zap['d'] = make_field(debug) = 1; zap(argc, argv); } catch(const exception &error) { FATAL(error.what() << endl); } JDetector detector; try { load(detectorFile, detector); } catch(const JException& error) { FATAL(error); } getMechanics.load(detector.getID()); JDynamics dynamics(detector, 0.0); dynamics.load(calibrationFile); filebuf buffer; if (outputFile != "") { buffer.open(outputFile.c_str(), ios::out); } ostream os(buffer.is_open() ? &buffer : cout.rdbuf()); JComment comment; comment.add("documentation: https://common.pages.km3net.de/jpp/Position_calibration.PDF"); if (format == short_t) comment.add("format: string number; UTC [s]; Tx; Ty"); else if (format == long_t) comment.add("format: https://indico.cern.ch/event/1014814/contributions/4259426/attachments/2201529/3724129/KM3NeT_position_file_format.pdf"); else if (format == fft_t) comment.add("format: "); DEBUG(comment); comment.add(JMeta(argc, argv)); /* for (JMultipleFileScanner in(calibrationFile); in.hasNext(); ) { comment.add(*in.next()); } */ if (format == short_t) { os << comment; os << setw(4) << detector.getID() << ' ' << detector.getUTMGrid() << ' ' << detector.getUTMPosition() << endl; for (JDynamics::JPosition::const_iterator string = dynamics.position.begin(); string != dynamics.position.end(); ++string) { for (typename JDynamics::JPosition::function_type::const_iterator i = string->second.begin(); i != string->second.end(); ++i) { os << setw(4) << string->first << ';' << FIXED(20,5) << i->getX() << ';' << FIXED( 9,6) << i->getY().tx << ';' << FIXED( 9,6) << i->getY().ty << endl; } } } if (format == long_t) { os << comment; os << setw(4) << detector.getID() << ' ' << detector.getUTMGrid() << ' ' << detector.getUTMPosition() << endl; for (typename JDynamics::JPosition::function_type::const_iterator i = dynamics.position.begin()->second.begin(); i != dynamics.position.begin()->second.end(); ++i) { const double t1 = i->getX(); dynamics.update(t1); os << FIXED(20,5) << t1 << ' ' << FIXED(20,5) << t1 << ' ' << setw(4) << detector.size() << endl; for (JDetector::const_iterator module = dynamics.begin(); module != dynamics.end(); ++module) { os << setw(4) << module->getString() << ' ' << setw(2) << module->getFloor() << ' ' << setw(10) << module->getID() << endl; os << FIXED(9,2) << module->getX() << ' ' << FIXED(9,2) << module->getY() << ' ' << FIXED(9,2) << module->getZ() << ' ' << FIXED(9,2) << -1.0 << ' ' << FIXED(9,2) << -1.0 << ' ' << FIXED(9,2) << -1.0 << endl; } } } if (format == fft_t) { double xmin = numeric_limits::max(); double xmax = numeric_limits::lowest(); for (JDynamics::JPosition::const_iterator string = dynamics.position.begin(); string != dynamics.position.end(); ++string) { if (!string->second.empty()) { xmin = min(xmin, string->second.getXmin()); xmax = max(xmax, string->second.getXmax()); } } for (double x = xmin; x <= xmax; x += Tmax_s) { JQuantile Q; for (JDynamics::JPosition::const_iterator string = dynamics.position.begin(); string != dynamics.position.end(); ++string) { if (!string->second.empty()) { Q.put(string->second(x).getLength()); } } os << FIXED(9,5) << Q.getMean() << endl; } } buffer.close(); }