Jpp 19.3.0-rc.1
the software that should make you happy
Loading...
Searching...
No Matches
JEventTimesliceWriter.cc File Reference

Auxiliary program to convert multiple Monte Carlo events to DAQ timeslices. More...

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 

Detailed Description

Auxiliary program to convert multiple Monte Carlo events to DAQ timeslices.

Events are timed according to a given rate (if > 0), otherwise they are timed according to Evt::mc_t.

Author
mdejong, mlincett

Definition in file JEventTimesliceWriter.cc.

Function Documentation

◆ main()

int main ( int argc,
char ** argv )

Definition at line 48 of file JEventTimesliceWriter.cc.

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}
string outputFile
#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
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition JParser.hh:2142
Monte Carlo run header.
Definition JHead.hh:1236
JAANET::livetime livetime
Definition JHead.hh:1604
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.