#include #include #include #include "km3net-dataformat/offline/Head.hh" #include "km3net-dataformat/offline/Evt.hh" #include "JAAnet/JAAnetToolkit.hh" #include "JAAnet/JAtmosphericNeutrinoFlux.hh" #include "JSupport/JSupport.hh" #include "JSupport/JMultipleFileScanner.hh" #include "JSupport/JEvtWeightFileScannerSet.hh" #include "JOscProb/JOscParameters.hh" #include "JOscProb/JOscProbInterpolator.hh" #include "JOscProb/JOscProbHelper.hh" #include "Jeep/JPrint.hh" #include "Jeep/JParser.hh" #include "Jeep/JMessage.hh" /** * \file * Example program for printing the atmospheric neutrino fluxes for the events in a given neutrino MC-file. * * \author bjung */ int main(int argc, char **argv) { using namespace std; using namespace JPP; JMultipleFileScanner_t inputFiles; string oscProbTable; JOscParameters parameters; int debug; try { JParser<> zap; zap['f'] = make_field(inputFiles); zap['P'] = make_field(oscProbTable, "oscillation probability table file"); zap['@'] = make_field(parameters, "oscillation parameters") = JPARSER::initialised(); zap['d'] = make_field(debug) = 1; zap(argc, argv); } catch(const exception& error) { FATAL(error.what() << endl); } // Create atmospheric neutrino flux function const JOscProbHelper oscProb = JOscProbInterpolator<>(oscProbTable.c_str(), parameters); const JAtmosphericNeutrinoFlux flux(oscProb); // Scan events JEvtWeightFileScannerSet<> scanners(inputFiles); for (JEvtWeightFileScannerSet<>::iterator scanner = scanners.begin(); scanner != scanners.end(); ++scanner) { scanner->setFlux(flux); //!< Set flux for this file scanner if (scanner->simul.size() > 0) { STATUS("Scanning " << scanner->simul[0].program << " files..." << endl); } STATUS(LEFT (10) << "event ID" << ' ' << RIGHT(15) << "E [GeV]" << ' ' << RIGHT(15) << "costh" << ' ' << RIGHT(40) << "flux [GeV^-1 * m^-2 * sr^-1 * s^-1]" << ' ' << RIGHT(20) << "rate [Hz]" << endl); while (scanner->hasNext()) { const Evt* event = scanner->next(); const Trk& neutrino = get_neutrino(*event); const double E = neutrino.E; const double costh = -neutrino.dir.z / neutrino.dir.len(); const double F = flux.getFlux(*event); const double weight = scanner->getWeight(*event); STATUS(LEFT (10) << scanner->getCounter() << ' ' << FIXED (15, 3) << E << ' ' << FIXED (15, 3) << costh << ' ' << SCIENTIFIC(40, 3) << F << ' ' << SCIENTIFIC(20, 3) << weight << '\r'); DEBUG(endl); } } return 0; }