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);
154 if (detectorFileB ==
"") {
155 detectorFileB = detectorFileA;
163 load(detectorFileA, detectorA);
164 load(detectorFileB, detectorB);
170 JPMTParametersMap::Throw(
true);
172 if (!pmtParameters.is_valid()) {
173 FATAL(
"Invalid PMT parameters " << pmtParameters << endl);
176 if (pmtParameters.getQE() != 1.0) {
178 WARNING(
"Correct background rates with global efficiency " << pmtParameters.getQE() << endl);
180 rates_Hz.correct(pmtParameters.getQE());
196 if (runbyrun.is_valid()) {
198 NOTICE(
"Using run-by-run:" << endl << runbyrun << endl);
200 if (!runbyrun.hasNext()) {
201 FATAL(
"Run-by-run simulation yields no input." << endl);
204 if (rates_Hz.getSinglesRate() != 0.0) {
205 WARNING(
"Run-by-run simulation discards singles rate [Hz] " << rates_Hz.getSinglesRate() << endl);
221 NOTICE(
"Set trigger parameters from run-by-run input." << endl);
224 WARNING(
"No trigger parameters from run-by-run input;\nrun with default/user input." << endl);
229 JHead buffer(header);
231 buffer.DAQ.livetime_s =
getLivetime(runbyrun->getFilelist());
234 copy(buffer, header);
238 NOTICE(
"Using fixed rates [Hz]: " << rates_Hz << endl);
254 NOTICE(
"Disabling high-rate veto of all PMTs." << endl);
262 DEBUG(
"PMT parameters:" << endl << pmtParameters << endl);
305 int trigger_counter = 0;
315 mc_run_id = head.start_run.run_id;
323 limit.setLowerLimit(limit.getLowerLimit() -
in.skip(limit.getLowerLimit()));
325 for ( ;
in.hasNext() && number_of_events != limit; ++number_of_events) {
327 STATUS(
"event: " << setw(10) << number_of_events <<
'\r');
DEBUG(endl);
329 Evt*
event =
in.next();
331 event->mc_run_id = mc_run_id;
333 DEBUG(*event << endl);
335 bool trigger =
false;
337 if (!event->mc_hits.empty()) {
339 int frame_index = (int)
in.getCounter() + 1;
341 if (runbyrun.is_valid() && runbyrun.hasNext()) {
343 summaryRouter.update(runbyrun.next());
345 summaryRouter.correct(dynamic_cast<const JPMTDefaultSimulatorInterface&>(simbad.getPMTSimulator()));
347 frame_index = summaryRouter.getFrameIndex();
348 run = summaryRouter.getRunNumber();
364 timeRange.
add(event->mc_t);
365 timeRange.
add(period);
370 if (event->mc_event_time != TTimeStamp(0)) {
374 const JDAQChronometer chronometer(detectorB.getID(), (run != -1 ? run : mc_run_id), frame_index, utc);
378 DEBUG(timeslice << endl);
381 timesliceRouter.configure(timeslice);
383 JTimeslice_t timesliceL0(timeslice.getDAQChronometer());
384 JTimeslice_t timesliceL1(timeslice.getDAQChronometer());
385 JTimeslice_t timesliceL2(timeslice.getDAQChronometer());
386 JTimeslice_t timesliceSN(timeslice.getDAQChronometer());
388 for (JDAQTimeslice::const_iterator super_frame = timeslice.begin(); super_frame != timeslice.end(); ++super_frame) {
390 if (moduleRouter.hasModule(super_frame->getModuleID())) {
394 const JModule& module = moduleRouter.getModule(super_frame->getModuleID());
395 const JSuperFrame2D_t& buffer = JSuperFrame2D_t::demultiplex(*super_frame, module);
399 timesliceL0.push_back(JSuperFrame1D_t(buffer));
403 timesliceL1.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
404 super_frame->getModuleIdentifier(),
407 buildL1(*timesliceL0.rbegin(), back_inserter(*timesliceL1.rbegin()));
411 timesliceL2.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
412 super_frame->getModuleIdentifier(),
415 buildL2(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceL2.rbegin()));
419 timesliceSN.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
420 super_frame->getModuleIdentifier(),
423 buildSN(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceSN.rbegin()));
425 DEBUG(
"L0 " << setw(8) << timesliceL0.rbegin()->getModuleID() <<
' ' << setw(8) << timesliceL0.rbegin()->size() << endl);
426 DEBUG(
"L1 " << setw(8) << timesliceL1.rbegin()->getModuleID() <<
' ' << setw(8) << timesliceL1.rbegin()->size() << endl);
427 DEBUG(
"L2 " << setw(8) << timesliceL2.rbegin()->getModuleID() <<
' ' << setw(8) << timesliceL2.rbegin()->size() << endl);
428 DEBUG(
"SN " << setw(8) << timesliceSN.rbegin()->getModuleID() <<
' ' << setw(8) << timesliceSN.rbegin()->size() << endl);
438 trigger3DMuon (trigger_input, back_inserter(trigger_output));
439 trigger3DShower(trigger_input, back_inserter(trigger_output));
440 triggerMXShower(trigger_input, timesliceL0, back_inserter(trigger_output));
444 for (JTriggerOutput::const_iterator to = trigger_output.begin(); to != trigger_output.end(); ++to) {
446 for (
int i = 0;
i != h1.GetNbinsX(); ++
i) {
447 if (to->hasTriggerBit(
i)) {
455 << to->getFrameIndex() <<
' '
457 << timeRange << endl);
459 if (timeRange.
overlap(eventTime)) {
469 tev.setCounter(trigger_counter);
478 if (!triggeredEventsOnly || trigger) {
502 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...
then usage $script[< detector identifier >< run range >]< QA/QCfile > nExample script to produce data quality plots nWhen a detector identifier and run range are data are downloaded from the database nand subsequently stored in the given QA QC file
Match of two events considering overlap in time.
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.
void merge(const JMatch_t &match)
Merge events.
T & getInstance(const T &object)
Get static instance from temporary object.
#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.
then fatal The output file must have the wildcard in the e g root fi 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
void copy(const Head &from, JHead &to)
Copy header from from to to.
double getMaximalDistance(const JDetector &detector, const bool option=false)
Get maximal distance between modules in detector.
2-dimensional frame with time calibrated data from one optical module.
const JLimit & getLimit() const
Get limit.
JDAQUTCExtended getDAQUTCExtended(const TTimeStamp &t0, const double t1=0.0)
Get DAQ UTC 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.