Jpp 19.3.0-rc.1
the software that should make you happy
Loading...
Searching...
No Matches
JEventTimesliceWriter.cc
Go to the documentation of this file.
1#include <string>
2#include <iostream>
3#include <fstream>
4
5#include "TRandom3.h"
6
11
14
22
27
29#include "JSupport/JMeta.hh"
32#include "JSupport/JSupport.hh"
35
36#include "JROOT/JRandom.hh"
37
38#include "Jeep/JParser.hh"
39#include "Jeep/JMessage.hh"
40
41
42/**
43 * \file
44 * Auxiliary program to convert multiple Monte Carlo events to DAQ timeslices.
45 * Events are timed according to a given rate (if > 0), otherwise they are timed according to Evt::mc_t.
46 * \author mdejong, mlincett
47 */
48int main(int argc, char **argv)
49{
50 using namespace std;
51 using namespace JPP;
52 using namespace KM3NETDAQ;
53
54
56 JFileRecorder <JTYPELIST<JAAnetTypes_t, JDAQTimesliceL0, JMeta, JRootTypes_t>::typelist> outputFile;
57 JLimit_t& numberOfEvents = inputFile.getLimit();
58 string detectorFile;
59 int run;
60 JPMTParametersMap pmtParameters;
61 JK40Rates rates_Hz;
62 double eventRate_Hz;
63 JRandom seed;
64 int debug;
65
66 try {
67
68 JParser<> zap("Auxiliary program to convert multiple Monte Carlo events to time slices.");
69
70 zap['f'] = make_field(inputFile);
71 zap['o'] = make_field(outputFile) = "timeslice.root";
72 zap['n'] = make_field(numberOfEvents) = JLimit::max();
73 zap['a'] = make_field(detectorFile);
74 zap['R'] = make_field(run) = 1;
75 zap['P'] = make_field(pmtParameters) = JPARSER::initialised();
76 zap['B'] = make_field(rates_Hz) = JPARSER::initialised();
77 zap['r'] = make_field(eventRate_Hz);
78 zap['S'] = make_field(seed) = 0;
79 zap['d'] = make_field(debug) = 0;
80
81 zap(argc, argv);
82 }
83 catch(const exception &error) {
84 FATAL(error.what() << endl);
85 }
86
87 seed.set(gRandom);
88
90
91 if (pmtParameters.getQE() != 1.0) {
92
93 WARNING("Correct background rates with global efficiency " << pmtParameters.getQE() << endl);
94
95 rates_Hz.correct(pmtParameters.getQE());
96 }
97
98 // parameters
99
100 DEBUG("PMT paramaters: " << endl << pmtParameters << endl);
101 DEBUG("K40 rates: " << endl << rates_Hz << endl);
102
103 if (eventRate_Hz < 0.0) {
104 FATAL("Invalid event rate " << eventRate_Hz << "; consider using JRandomTimesliceWriter." << endl);
105 }
106
107 // detector
108
110
111 try {
112 load(detectorFile, detector);
113 }
114 catch(const JException& error) {
115 FATAL(error);
116 }
117
118 // header
119
120 Head header;
121
122 try {
123 header = getHeader(inputFile);
124 }
125 catch (const exception& error) {
126 FATAL("Monte Carlo header is invalid");
127 }
128
129 double liveTimeMC = JHead(header).livetime.numberOfSeconds;
130
131 if (liveTimeMC < 0) {
132 FATAL("Monte Carlo live time is negative; input file may be corrupted.");
133 }
134
135 // background simulator
136
138
140
141 simbad.reset(new JPMTDefaultSimulator(pmtParameters, detector));
142 simbad.reset(new JK40DefaultSimulator(rates_Hz));
143 simbad.reset(new JCLBDefaultSimulator());
144
145 // output file
146
147 outputFile.open();
148
149 if (!outputFile.is_open()) {
150 FATAL("Error opening file " << outputFile << endl);
151 }
152
153 outputFile.put(*gRandom);
154 outputFile.put(JMeta(argc, argv));
155 outputFile.put(header);
156
157 // input stream;
158
159 bool absTime = false;
160
162
163 if (eventRate_Hz == 0.0 && liveTimeMC == 0.0) {
164
165 NOTICE("Event will be timed according to absolute MC time." << endl);
166
167 absTime = true;
168
169 // sorted access;
170 scan = new JTreeScanner<Evt, JEvtEvaluator>(inputFile);
172
173 } else {
174
175 // unsorted access;
176 scan = new JTreeScanner<Evt>(inputFile);
178
179 if (eventRate_Hz == 0.0 && liveTimeMC > 0.0) {
180 int nEntries = scan->getEntries();
181 eventRate_Hz = nEntries / liveTimeMC;
182 DEBUG(nEntries << " events to be written." << endl);
183 NOTICE("MC live time is " << liveTimeMC << " s" << endl);
184 NOTICE("Event rate set to " << eventRate_Hz << " Hz from MC header." << endl);
185 }
186 }
187
188 // begin timeslice generation;
189
190 // state variables;
191 bool pendingEvt = false;
192 bool pendingTimeslice = false;
193
194 Evt* event = NULL; // pending event;
195
196 JTimeRange timeRange;
197 double tDAQ = 0; // DAQ event time;
198 double tOff = 0; // hit production time offset;
199
200 int frame_index = 0;
201 JDAQChronometer chronometer;
202 JRandomTimeslice timeslice;
203
204 counter_type evtCount = 0;
205
206 while (pendingEvt || scan->hasNext()) {
207
208 if (!pendingTimeslice) {
209 // update background timeslice;
210 frame_index++;
211 chronometer = JDAQChronometer(detector.getID(), run, frame_index, JDAQUTCExtended(getTimeOfFrame(frame_index)));
212 timeslice = JRandomTimeslice(chronometer, simbad);
213 DEBUG("evt count: " << setw(10) << evtCount << endl);
214 STATUS("frame index: " << setw(10) << frame_index << " | evt count: " << setw(10) << evtCount << "\r"); DEBUG(endl);
215 pendingTimeslice = true;
216 }
217
218 if (!pendingEvt) {
219 // get new event;
220 event = scan->next();
221 timeRange = getTimeRange(*event);
222 tOff = timeRange.is_valid() ? timeRange.getLowerLimit() : 0;
223 // update DAQ time according to absolute or random;
224 if (absTime)
225 tDAQ = getEvtValue(*event) + tOff;
226 else
227 tDAQ += gRandom->Exp(1.0e9 / eventRate_Hz);
228
229 DEBUG("event time [s] " << setprecision(5) << tDAQ * 1.0e-9 << endl);
230 pendingEvt = true;
231 }
232
233 // DEBUG("tDAQ : " << tDAQ << " - frame index: " << frame_index << " - DAQ frame index " << getFrameIndex(tDAQ) << endl);
234 if (getFrameIndex(tDAQ) == frame_index) {
235
236 // process event;
237 if (timeRange.is_valid()) {
238 DEBUG(*event << endl);
239 // real start time of the hits will be always tDAQ;
240 event->mc_t = tDAQ - tOff;
241 timeslice.add(JEventTimeslice(chronometer, simbad, *event));
242 evtCount++;
243 }
244 // event processed;
245 outputFile.put(*event);
246 pendingEvt = false;
247 } else {
248 // event time is past end of timeslice;
249 DEBUG(timeslice << endl);
250 outputFile.put(timeslice);
251 pendingTimeslice = false;
252 }
253
254 }
255
256 if (pendingTimeslice) {
257 DEBUG(timeslice << endl);
258 outputFile.put(timeslice);
259 pendingTimeslice = false;
260 }
261
262 STATUS(endl);
263
264 outputFile.put(*gRandom);
265 outputFile.close();
266
267 NOTICE(evtCount << " events written over " << frame_index << " timeslices. " << endl);
268}
Definition of hit and track types and auxiliary methods for handling Monte Carlo data.
string outputFile
Data structure for detector geometry and calibration.
int main(int argc, char **argv)
Recording of objects on file according a format that follows from the file name extension.
General purpose messaging.
#define DEBUG(A)
Message macros.
Definition JMessage.hh:62
#define STATUS(A)
Definition JMessage.hh:63
#define NOTICE(A)
Definition JMessage.hh:64
#define FATAL(A)
Definition JMessage.hh:67
int debug
debug level
Definition JSirene.cc:72
#define WARNING(A)
Definition JMessage.hh:65
ROOT I/O of application specific meta data.
Scanning of objects from multiple files according a format that follows from the extension of each fi...
Utility class to parse command line options.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition JParser.hh:2142
ROOT TTree parameter settings of various packages.
Monte Carlo run header.
Definition JHead.hh:1236
JAANET::livetime livetime
Definition JHead.hh:1604
void reset(JK40Simulator *k40Simulator)
Reset K40 simulator.
Detector data structure.
Definition JDetector.hh:96
Default implementation of the simulation of K40 background.
Auxiliary class for map of PMT parameters.
double getQE(const JPMTIdentifier &id) const
Get QE of given PMT.
General exception.
Definition JException.hh:24
static void Throw(const bool option)
Enable/disable throw option.
Definition JThrow.hh:37
Utility class to parse command line options.
Definition JParser.hh:1698
General purpose class for object reading from a list of file names.
Auxiliary interface for direct access of elements in ROOT TChain.
Template definition for direct access of elements in ROOT TChain.
bool is_valid() const
Check validity of range.
Definition JRange.hh:311
T getLowerLimit() const
Get lower limit.
Definition JRange.hh:202
JDAQTimeslice & add(const JDAQTimeslice &timeslice)
Add another timeslice.
Data structure for UTC time.
JTimeRange getTimeRange(const Evt &event)
Get time range (i.e. time between earliest and latest hit) of Monte Carlo event.
static const JEvtEvaluator getEvtValue
Function object for evaluation of DAQ objects.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
@ debug_t
debug
Definition JMessage.hh:29
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Long64_t counter_type
Type definition for counter.
Head getHeader(const JMultipleFileScanner_t &file_list)
Get Monte Carlo header.
KM3NeT DAQ data structures and auxiliaries.
Definition DataQueue.cc:39
void setDAQLongprint(const bool option)
Set DAQ print option.
Definition JDAQPrint.hh:28
double getTimeOfFrame(const int frame_index)
Get start time of frame in ns since start of run for a given frame index.
Definition JDAQClock.hh:185
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
Definition Evt.hh:21
The Head class reflects the header of Monte-Carlo event files, which consists of keys (also referred ...
Definition Head.hh:65
Detector file.
Definition JHead.hh:227
double numberOfSeconds
Live time [s].
Definition JHead.hh:896
Template definition of random value generator.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition JParser.hh:68
Auxiliary class for K40 rates.
Definition JK40Rates.hh:41
void correct(const double QE)
Correct rates for global efficiency,.
Definition JK40Rates.hh:130
Auxiliary class for defining the range of iterations of objects.
Definition JLimit.hh:45
static counter_type max()
Get maximum counter value.
Definition JLimit.hh:128
Auxiliary class for ROOT I/O of application specific meta data.
Definition JMeta.hh:72
Timeslice with Monte Carlo event.
Timeslice with random data.