#include #include #include #include #include "km3net-dataformat/offline/Head.hh" #include "km3net-dataformat/offline/MultiHead.hh" #include "km3net-dataformat/offline/Evt.hh" #include "km3net-dataformat/online/JDAQClock.hh" #include "JSupport/JMultipleFileScanner.hh" #include "JSupport/JFileRecorder.hh" #include "JSupport/JMonteCarloFileSupportkit.hh" #include "JSupport/JSupport.hh" #include "JSupport/JMeta.hh" #include "JAAnet/JAAnetToolkit.hh" #include "Jeep/JParser.hh" #include "Jeep/JMessage.hh" /** * \file * * Example program to filter out-of-time hits in Evt data. * \author mdejong */ int main(int argc, char **argv) { using namespace std; using namespace JPP; using namespace KM3NETDAQ; JMultipleFileScanner inputFile; JFileRecorder ::typelist> outputFile; JLimit_t& numberOfEvents = inputFile.getLimit(); double T_ns; int debug; try { JParser<> zap("Example program to filter out-of-time hits in Evt data."); zap['f'] = make_field(inputFile); zap['o'] = make_field(outputFile); zap['n'] = make_field(numberOfEvents) = JLimit::max(); zap['T'] = make_field(T_ns) = getFrameTime(); zap['d'] = make_field(debug) = 2; zap(argc, argv); } catch(const exception& error) { FATAL(error.what() << endl); } outputFile.open(); if (!outputFile.is_open()) { FATAL("Error opening file " << outputFile << endl); } outputFile.put(JMeta(argc, argv)); outputFile.put(getHeader(inputFile)); long long int number_of_hits[] = { 0, 0 }; while (inputFile.hasNext()) { STATUS("event: " << setw(10) << inputFile.getCounter() << '\r'); DEBUG(endl); Evt* evt = inputFile.next(); number_of_hits[0] += evt->mc_hits.size(); double t0 = numeric_limits::max(); for (vector::iterator hit = evt->mc_hits.begin(); hit != evt->mc_hits.end(); ++hit) { if (getTime(*hit) < t0) { t0 = getTime(*hit); } } vector::iterator __end = evt->mc_hits.end(); for (vector::iterator hit = evt->mc_hits.begin(); hit != __end; ) { if (getTime(*hit) <= t0 + T_ns) ++hit; else iter_swap(hit, --__end); } number_of_hits[1] += distance(__end, evt->mc_hits.end()); evt->mc_hits.erase(__end, evt->mc_hits.end()); outputFile.put(*evt); } STATUS(endl); cout << "Number of hits processed/removed " << number_of_hits[0] << "/" << number_of_hits[1] << endl; JMultipleFileScanner::typelist> io(inputFile); io >> outputFile; outputFile.close(); }