Jpp master_rocky-44-g75b7c4f75
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 "Jeep/JParser.hh"
37#include "Jeep/JMessage.hh"
38
39
40/**
41 * \file
42 * Auxiliary program to convert multiple Monte Carlo events to DAQ timeslices.
43 * Events are timed according to a given rate (if > 0), otherwise they are timed according to Evt::mc_t.
44 * \author mdejong, mlincett
45 */
46int main(int argc, char **argv)
47{
48 using namespace std;
49 using namespace JPP;
50 using namespace KM3NETDAQ;
51
52
54 JFileRecorder <JTYPELIST<JAAnetTypes_t, JDAQTimesliceL0, JMeta, JRootTypes_t>::typelist> outputFile;
55 JLimit_t& numberOfEvents = inputFile.getLimit();
56 string detectorFile;
57 int run;
58 JPMTParametersMap pmtParameters;
59 JK40Rates rates_Hz;
60 double eventRate_Hz;
61 UInt_t seed;
62 int debug;
63
64 try {
65
66 JParser<> zap("Auxiliary program to convert multiple Monte Carlo events to time slices.");
67
68 zap['f'] = make_field(inputFile);
69 zap['o'] = make_field(outputFile) = "timeslice.root";
70 zap['n'] = make_field(numberOfEvents) = JLimit::max();
71 zap['a'] = make_field(detectorFile);
72 zap['R'] = make_field(run) = 1;
73 zap['P'] = make_field(pmtParameters) = JPARSER::initialised();
74 zap['B'] = make_field(rates_Hz) = JPARSER::initialised();
75 zap['r'] = make_field(eventRate_Hz);
76 zap['S'] = make_field(seed) = 0;
77 zap['d'] = make_field(debug) = 0;
78
79 zap(argc, argv);
80 }
81 catch(const exception &error) {
82 FATAL(error.what() << endl);
83 }
84
85 gRandom->SetSeed(seed);
86
87
89
90 if (pmtParameters.getQE() != 1.0) {
91
92 WARNING("Correct background rates with global efficiency " << pmtParameters.getQE() << endl);
93
94 rates_Hz.correct(pmtParameters.getQE());
95 }
96
97 // parameters
98
99 DEBUG("PMT paramaters: " << endl << pmtParameters << endl);
100 DEBUG("K40 rates: " << endl << rates_Hz << endl);
101
102 if (eventRate_Hz < 0.0) {
103 FATAL("Invalid event rate " << eventRate_Hz << "; consider using JRandomTimesliceWriter." << endl);
104 }
105
106 // detector
107
109
110 try {
111 load(detectorFile, detector);
112 }
113 catch(const JException& error) {
114 FATAL(error);
115 }
116
117 // header
118
119 Head header;
120
121 try {
122 header = getHeader(inputFile);
123 }
124 catch (const exception& error) {
125 FATAL("Monte Carlo header is invalid");
126 }
127
128 double liveTimeMC = JHead(header).livetime.numberOfSeconds;
129
130 if (liveTimeMC < 0) {
131 FATAL("Monte Carlo live time is negative; input file may be corrupted.");
132 }
133
134 // background simulator
135
137
139
140 simbad.reset(new JPMTDefaultSimulator(pmtParameters, detector));
141 simbad.reset(new JK40DefaultSimulator(rates_Hz));
142 simbad.reset(new JCLBDefaultSimulator());
143
144 // output file
145
146 outputFile.open();
147
148 if (!outputFile.is_open()) {
149 FATAL("Error opening file " << outputFile << endl);
150 }
151
152 outputFile.put(*gRandom);
153 outputFile.put(JMeta(argc, argv));
154 outputFile.put(header);
155
156 // input stream;
157
158 bool absTime = false;
159
161
162 if (eventRate_Hz == 0.0 && liveTimeMC == 0.0) {
163
164 NOTICE("Event will be timed according to absolute MC time." << endl);
165
166 absTime = true;
167
168 // sorted access;
169 scan = new JTreeScanner<Evt, JEvtEvaluator>(inputFile);
171
172 } else {
173
174 // unsorted access;
175 scan = new JTreeScanner<Evt>(inputFile);
177
178 if (eventRate_Hz == 0.0 && liveTimeMC > 0.0) {
179 int nEntries = scan->getEntries();
180 eventRate_Hz = nEntries / liveTimeMC;
181 DEBUG(nEntries << " events to be written." << endl);
182 NOTICE("MC live time is " << liveTimeMC << " s" << endl);
183 NOTICE("Event rate set to " << eventRate_Hz << " Hz from MC header." << endl);
184 }
185 }
186
187 // begin timeslice generation;
188
189 // state variables;
190 bool pendingEvt = false;
191 bool pendingTimeslice = false;
192
193 Evt* event = NULL; // pending event;
194
195 JTimeRange timeRange;
196 double tDAQ = 0; // DAQ event time;
197 double tOff = 0; // hit production time offset;
198
199 int frame_index = 0;
200 JDAQChronometer chronometer;
201 JRandomTimeslice timeslice;
202
203 counter_type evtCount = 0;
204
205 while (pendingEvt || scan->hasNext()) {
206
207 if (!pendingTimeslice) {
208 // update background timeslice;
209 frame_index++;
210 chronometer = JDAQChronometer(detector.getID(), run, frame_index, JDAQUTCExtended(getTimeOfFrame(frame_index)));
211 timeslice = JRandomTimeslice(chronometer, simbad);
212 DEBUG("evt count: " << setw(10) << evtCount << endl);
213 STATUS("frame index: " << setw(10) << frame_index << " | evt count: " << setw(10) << evtCount << "\r"); DEBUG(endl);
214 pendingTimeslice = true;
215 }
216
217 if (!pendingEvt) {
218 // get new event;
219 event = scan->next();
220 timeRange = getTimeRange(*event);
221 tOff = timeRange.is_valid() ? timeRange.getLowerLimit() : 0;
222 // update DAQ time according to absolute or random;
223 if (absTime)
224 tDAQ = getEvtValue(*event) + tOff;
225 else
226 tDAQ += gRandom->Exp(1.0e9 / eventRate_Hz);
227
228 DEBUG("event time [s] " << setprecision(5) << tDAQ * 1.0e-9 << endl);
229 pendingEvt = true;
230 }
231
232 // DEBUG("tDAQ : " << tDAQ << " - frame index: " << frame_index << " - DAQ frame index " << getFrameIndex(tDAQ) << endl);
233 if (getFrameIndex(tDAQ) == frame_index) {
234
235 // process event;
236 if (timeRange.is_valid()) {
237 DEBUG(*event << endl);
238 // real start time of the hits will be always tDAQ;
239 event->mc_t = tDAQ - tOff;
240 timeslice.add(JEventTimeslice(chronometer, simbad, *event));
241 evtCount++;
242 }
243 // event processed;
244 outputFile.put(*event);
245 pendingEvt = false;
246 } else {
247 // event time is past end of timeslice;
248 DEBUG(timeslice << endl);
249 outputFile.put(timeslice);
250 pendingTimeslice = false;
251 }
252
253 }
254
255 if (pendingTimeslice) {
256 DEBUG(timeslice << endl);
257 outputFile.put(timeslice);
258 pendingTimeslice = false;
259 }
260
261 STATUS(endl);
262
263 outputFile.put(*gRandom);
264 outputFile.close();
265
266 NOTICE(evtCount << " events written over " << frame_index << " timeslices. " << endl);
267}
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:69
#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
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.