101 using namespace KM3NETDAQ;
108 string detectorFileA;
109 string detectorFileB;
112 bool triggeredEventsOnly;
121 JParser<> zap(
"Auxiliary program to trigger Monte Carlo events.");
123 zap[
'f'] =
make_field(inputFile,
"input file (output of detector simulation)");
125 zap[
'n'] =
make_field(numberOfEvents) = JLimit::max();
126 zap[
'a'] =
make_field(detectorFileA,
"detector used for conversion from Monte Carlo truth to raw data.");
127 zap[
'b'] =
make_field(detectorFileB,
"detector used for conversion of raw data to calibrated data.") =
"";
128 zap[
'R'] =
make_field(run,
"run number") = -1;
131 zap[
'O'] =
make_field(triggeredEventsOnly,
"optionally write only triggered events.");
139 catch(
const exception &error) {
140 FATAL(error.what() << endl);
143 gRandom->SetSeed(seed);
149 if (detectorFileB ==
"") {
150 detectorFileB = detectorFileA;
158 load(detectorFileA, detectorA);
159 load(detectorFileB, detectorB);
165 JPMTParametersMap::Throw(
true);
167 if (!pmtParameters.is_valid()) {
168 FATAL(
"Invalid PMT parameters " << pmtParameters << endl);
171 if (pmtParameters.getQE() != 1.0) {
173 WARNING(
"Correct background rates with global efficiency " << pmtParameters.getQE() << endl);
175 rates_Hz.correct(pmtParameters.getQE());
182 if (runbyrun.is_valid()) {
184 NOTICE(
"Using run-by-run:" << endl << runbyrun << endl);
186 if (!runbyrun.hasNext()) {
187 FATAL(
"Run-by-run simulation yields no input." << endl);
190 if (rates_Hz.getSinglesRate() != 0.0) {
191 WARNING(
"Run-by-run simulation discards singles rate [Hz] " << rates_Hz.getSinglesRate() << endl);
207 NOTICE(
"Set trigger parameters from run-by-run input." << endl);
210 WARNING(
"No trigger parameters from run-by-run input;\nrun with default/user input." << endl);
215 NOTICE(
"Using fixed rates [Hz]: " << rates_Hz << endl);
230 DEBUG(
"PMT parameters:" << endl << pmtParameters << endl);
238 typedef double hit_type;
266 const JPosition3D center = get<JPosition3D>(header);
268 NOTICE(
"Apply detector offset from Monte Carlo run header (" << center <<
")" << endl);
289 int trigger_counter = 0;
299 mc_run_id = head.start_run.run_id;
307 limit.setLowerLimit(limit.getLowerLimit() -
in.skip(limit.getLowerLimit()));
309 for ( ;
in.hasNext() && number_of_events != limit; ++number_of_events) {
311 STATUS(
"event: " << setw(10) << number_of_events <<
'\r');
DEBUG(endl);
313 Evt*
event =
in.next();
315 event->mc_run_id = mc_run_id;
317 DEBUG(*event << endl);
319 bool trigger =
false;
321 if (!event->mc_hits.empty()) {
323 int frame_index = (int)
in.getCounter() + 1;
325 if (runbyrun.is_valid() && runbyrun.hasNext()) {
327 summaryRouter.update(runbyrun.next());
329 summaryRouter.correct(dynamic_cast<const JPMTDefaultSimulatorInterface&>(simbad.getPMTSimulator()));
331 frame_index = summaryRouter.getFrameIndex();
332 run = summaryRouter.getRunNumber();
348 timeRange.
add(event->mc_t);
349 timeRange.
add(period);
353 if (event->mc_event_time != TTimeStamp(0)) {
357 const JDAQChronometer chronometer(detectorB.getID(), (run != -1 ? run : mc_run_id), frame_index, utc);
361 DEBUG(timeslice << endl);
364 timesliceRouter.configure(timeslice);
366 JTimeslice_t timesliceL0(timeslice.getDAQChronometer());
367 JTimeslice_t timesliceL1(timeslice.getDAQChronometer());
368 JTimeslice_t timesliceL2(timeslice.getDAQChronometer());
369 JTimeslice_t timesliceSN(timeslice.getDAQChronometer());
371 for (JDAQTimeslice::const_iterator super_frame = timeslice.begin(); super_frame != timeslice.end(); ++super_frame) {
373 if (moduleRouter.hasModule(super_frame->getModuleID())) {
377 const JModule& module = moduleRouter.getModule(super_frame->getModuleID());
378 const JSuperFrame2D_t& buffer = JSuperFrame2D_t::demultiplex(*super_frame, module);
382 timesliceL0.push_back(JSuperFrame1D_t(buffer));
386 timesliceL1.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
387 super_frame->getModuleIdentifier(),
390 buildL1(*timesliceL0.rbegin(), back_inserter(*timesliceL1.rbegin()));
394 timesliceL2.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
395 super_frame->getModuleIdentifier(),
398 buildL2(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceL2.rbegin()));
402 timesliceSN.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
403 super_frame->getModuleIdentifier(),
406 buildSN(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceSN.rbegin()));
408 DEBUG(
"L0 " << setw(8) << timesliceL0.rbegin()->getModuleID() <<
' ' << setw(8) << timesliceL0.rbegin()->size() << endl);
409 DEBUG(
"L1 " << setw(8) << timesliceL1.rbegin()->getModuleID() <<
' ' << setw(8) << timesliceL1.rbegin()->size() << endl);
410 DEBUG(
"L2 " << setw(8) << timesliceL2.rbegin()->getModuleID() <<
' ' << setw(8) << timesliceL2.rbegin()->size() << endl);
411 DEBUG(
"SN " << setw(8) << timesliceSN.rbegin()->getModuleID() <<
' ' << setw(8) << timesliceSN.rbegin()->size() << endl);
421 trigger3DMuon (trigger_input, back_inserter(trigger_output));
422 trigger3DShower(trigger_input, back_inserter(trigger_output));
423 triggerMXShower(trigger_input, timesliceL0, back_inserter(trigger_output));
427 for (JTriggerOutput::const_iterator to = trigger_output.begin(); to != trigger_output.end(); ++to) {
429 for (
int i = 0; i !=
h1.GetNbinsX(); ++i) {
430 if (to->hasTriggerBit(i)) {
438 << to->getFrameIndex() <<
' '
440 << timeRange << endl);
442 if (timeRange.
overlap(eventTime)) {
452 tev.setCounter(trigger_counter);
461 if (!triggeredEventsOnly || trigger) {
485 if (!triggeredEventsOnly || trigger) {
Auxiliary class to select summary data (KM3NETDAQ::JDAQSummaryslice) from the specified raw data file...
Utility class to parse command line options.
static const unsigned int NUMBER_OF_TRIGGER_BITS
Number of trigger bits.
Default implementation of the simulation of K40 background.
Data structure for a composite optical module.
Router for direct addressing of module data in detector data structure.
*fatal Wrong number of arguments esac JCookie sh typeset Z DETECTOR typeset Z SOURCE_RUN typeset Z TARGET_RUN set_variable PARAMETERS_FILE $WORKDIR parameters
then for HISTOGRAM in h0 h1
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Long64_t counter_type
Type definition for counter.
double getTimeOfRTS(const JDAQChronometer &chronometer)
Get time of last RTS in ns since start of run for a given chronometer.
Data structure for UTC time.
double getTimeOfFrame(const int frame_index)
Get start time of frame in ns since start of run for a given frame index.
1-dimensional frame with time calibrated data from one optical module.
JTimeRange getTimeRange(const Evt &event)
Get time range (i.e. time between earliest and latest hit) of Monte Carlo event.
K40 simulation based on run-by-run information.
Head getHeader(const JMultipleFileScanner_t &file_list)
Get Monte Carlo header.
void setDAQLongprint(const bool option)
Set DAQ print option.
Auxiliary class for defining the range of iterations of objects.
double getMaximalDistance(const JDetector &detector)
Get maximal distance between modules in detector.
void merge(const JMatch_t &match)
Merge events.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
CLB simulation based on run-by-run information.
Router for fast addressing of hits in KM3NETDAQ::JDAQTimeslice data structure as a function of the op...
double getFrameTime()
Get frame time duration.
Auxiliary class to create summary data.
Auxiliary class to build JDAQEvent for a triggered event.
Auxiliary class for map of PMT parameters.
const JPosition3D & getPosition() const
Get position.
double getMaximalTime(const double R_Hz)
Get maximal time for given rate.
Router for fast addressing of summary data in JDAQSummaryslice data structure as a function of the op...
The Head class reflects the header of Monte-Carlo event files, which consists of keys (also referred ...
PMT simulation based on run-by-run information.
virtual const char * what() const override
Get error message.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
Auxiliary class to build JDAQTimeslice for L1 timeslice.
2-dimensional frame with time calibrated data from one optical module.
Data structure for position in three dimensions.
const JLimit & getLimit() const
Get limit.
then fatal Wrong number of arguments fi set_variable DETECTOR $argv[1] set_variable INPUT_FILE $argv[2] eval JPrintDetector a $DETECTOR O IDENTIFIER eval JPrintDetector a $DETECTOR O SUMMARY source JAcoustics sh $DETECTOR_ID typeset A TRIPODS get_tripods $WORKDIR tripod txt TRIPODS for EMITTER in
JDAQUTCExtended getDAQUTCExtended(const TTimeStamp &t0, const double t1=0.0)
Get DAQ UTC time.
Match of two events considering overlap in time.
Timeslice with Monte Carlo event.
JTriggerParameters getTriggerParameters(const JMultipleFileScanner_t &file_list)
Get trigger parameters.
Auxiliary class for K40 rates.
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
Time slice with calibrated data.
#define DEBUG(A)
Message macros.