104 using namespace KM3NETDAQ;
111 string detectorFileA;
112 string detectorFileB;
115 bool triggeredEventsOnly;
125 JParser<> zap(
"Auxiliary program to trigger Monte Carlo events.");
127 zap[
'f'] =
make_field(inputFile,
"input file (output of detector simulation)");
129 zap[
'n'] =
make_field(numberOfEvents) = JLimit::max();
130 zap[
'a'] =
make_field(detectorFileA,
"detector used for conversion from Monte Carlo truth to raw data.");
131 zap[
'b'] =
make_field(detectorFileB,
"detector used for conversion of raw data to calibrated data.") =
"";
132 zap[
'R'] =
make_field(run,
"run number") = -1;
135 zap[
'O'] =
make_field(triggeredEventsOnly,
"optionally write only triggered events.");
144 catch(
const exception &error) {
145 FATAL(error.what() << endl);
148 gRandom->SetSeed(seed);
150 JK40DefaultSimulatorInterface::setSigma(sigma_ns);
156 if (detectorFileB ==
"") {
157 detectorFileB = detectorFileA;
165 load(detectorFileA, detectorA);
166 load(detectorFileB, detectorB);
172 JPMTParametersMap::Throw(
true);
174 if (!pmtParameters.is_valid()) {
175 FATAL(
"Invalid PMT parameters " << pmtParameters << endl);
178 if (pmtParameters.getQE() != 1.0) {
180 WARNING(
"Correct background rates with global efficiency " << pmtParameters.getQE() << endl);
182 rates_Hz.correct(pmtParameters.getQE());
198 if (runbyrun.is_valid()) {
200 NOTICE(
"Using run-by-run:" << endl << runbyrun << endl);
202 if (!runbyrun.hasNext()) {
203 FATAL(
"Run-by-run simulation yields no input." << endl);
206 if (rates_Hz.getSinglesRate() != 0.0) {
207 WARNING(
"Run-by-run simulation discards singles rate [Hz] " << rates_Hz.getSinglesRate() << endl);
223 NOTICE(
"Set trigger parameters from run-by-run input." << endl);
226 WARNING(
"No trigger parameters from run-by-run input;\nrun with default/user input." << endl);
231 JHead buffer(header);
233 buffer.DAQ.livetime_s =
getLivetime(runbyrun->getFilelist());
236 copy(buffer, header);
240 NOTICE(
"Using fixed rates [Hz]: " << rates_Hz << endl);
256 NOTICE(
"Disabling high-rate veto of all PMTs." << endl);
264 DEBUG(
"PMT parameters:" << endl << pmtParameters << endl);
290 const JPosition3D center = get<JPosition3D>(header);
292 NOTICE(
"Apply detector offset from Monte Carlo run header (" << center <<
")" << endl);
313 int trigger_counter = 0;
323 mc_run_id = head.start_run.run_id;
331 limit.setLowerLimit(limit.getLowerLimit() -
in.skip(limit.getLowerLimit()));
333 for ( ;
in.hasNext() && number_of_events != limit; ++number_of_events) {
335 STATUS(
"event: " << setw(10) << number_of_events <<
'\r');
DEBUG(endl);
337 Evt*
event =
in.next();
339 event->mc_run_id = mc_run_id;
341 DEBUG(*event << endl);
343 bool trigger =
false;
345 if (!event->mc_hits.empty()) {
347 int frame_index = (int)
in.getCounter() + 1;
349 if (runbyrun.is_valid() && runbyrun.hasNext()) {
351 summaryRouter.update(runbyrun.next());
353 summaryRouter.correct(dynamic_cast<const JPMTDefaultSimulatorInterface&>(simbad.getPMTSimulator()));
355 frame_index = summaryRouter.getFrameIndex();
356 run = summaryRouter.getRunNumber();
372 timeRange.
add(event->mc_t);
373 timeRange.
add(period);
377 if (event->mc_event_time != TTimeStamp(0)) {
381 const JDAQChronometer chronometer(detectorB.getID(), (run != -1 ? run : mc_run_id), frame_index, utc);
385 DEBUG(timeslice << endl);
388 timesliceRouter.configure(timeslice);
390 JTimeslice_t timesliceL0(timeslice.getDAQChronometer());
391 JTimeslice_t timesliceL1(timeslice.getDAQChronometer());
392 JTimeslice_t timesliceL2(timeslice.getDAQChronometer());
393 JTimeslice_t timesliceSN(timeslice.getDAQChronometer());
395 for (JDAQTimeslice::const_iterator super_frame = timeslice.begin(); super_frame != timeslice.end(); ++super_frame) {
397 if (moduleRouter.hasModule(super_frame->getModuleID())) {
401 const JModule& module = moduleRouter.getModule(super_frame->getModuleID());
402 const JSuperFrame2D_t& buffer = JSuperFrame2D_t::demultiplex(*super_frame, module);
406 timesliceL0.push_back(JSuperFrame1D_t(buffer));
410 timesliceL1.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
411 super_frame->getModuleIdentifier(),
414 buildL1(*timesliceL0.rbegin(), back_inserter(*timesliceL1.rbegin()));
418 timesliceL2.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
419 super_frame->getModuleIdentifier(),
422 buildL2(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceL2.rbegin()));
426 timesliceSN.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
427 super_frame->getModuleIdentifier(),
430 buildSN(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceSN.rbegin()));
432 DEBUG(
"L0 " << setw(8) << timesliceL0.rbegin()->getModuleID() <<
' ' << setw(8) << timesliceL0.rbegin()->size() << endl);
433 DEBUG(
"L1 " << setw(8) << timesliceL1.rbegin()->getModuleID() <<
' ' << setw(8) << timesliceL1.rbegin()->size() << endl);
434 DEBUG(
"L2 " << setw(8) << timesliceL2.rbegin()->getModuleID() <<
' ' << setw(8) << timesliceL2.rbegin()->size() << endl);
435 DEBUG(
"SN " << setw(8) << timesliceSN.rbegin()->getModuleID() <<
' ' << setw(8) << timesliceSN.rbegin()->size() << endl);
445 trigger3DMuon (trigger_input, back_inserter(trigger_output));
446 trigger3DShower(trigger_input, back_inserter(trigger_output));
447 triggerMXShower(trigger_input, timesliceL0, back_inserter(trigger_output));
451 for (JTriggerOutput::const_iterator to = trigger_output.begin(); to != trigger_output.end(); ++to) {
453 for (
int i = 0; i != h1.GetNbinsX(); ++i) {
454 if (to->hasTriggerBit(i)) {
462 << to->getFrameIndex() <<
' '
464 << timeRange << endl);
466 if (timeRange.
overlap(eventTime)) {
476 tev.setCounter(trigger_counter);
485 if (!triggeredEventsOnly || trigger) {
509 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 fast addressing of hits in KM3NETDAQ::JDAQTimeslice data structure as a function of the op...
double getSigma(vector< double > &v)
get standard deviation of vector content
Router for direct addressing of module data in detector data structure.
static const int HIGH_RATE_VETO_DISABLE
Enable (disable) use of high-rate veto test if this status bit is 0 (1);.
*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
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.
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 KM3NETDAQ::JDAQSummaryslice data structure as a functio...
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.
double getLivetime(const std::string &file_name)
Get data taking live time.
void copy(const Head &from, JHead &to)
Copy header from from to to.
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 JAcoustics sh $DETECTOR_ID source JAcousticsToolkit sh CHECK_EXIT_CODE typeset A EMITTERS get_tripods $WORKDIR tripod txt EMITTERS get_transmitters $WORKDIR transmitter txt EMITTERS 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.