Jpp 20.0.0-72-g597b30bc9
the software that should make you happy
Loading...
Searching...
No Matches
JRandomTimesliceWriter.cc File Reference

Auxiliary program to write KM3NETDAQ::JDAQTimeslice with random data. More...

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 

Detailed Description

Auxiliary program to write KM3NETDAQ::JDAQTimeslice with random data.


To pipe data to application JTriggerProcessor.cc whilst maintaining header and meta data, two output files can be specified.
The file names should have extensions ".root" and ".dat", respectively.
The first corresponds to a ROOT formatted file with header and meta data and the second to the pipe with timeslice data.

Author
mdejong

Definition in file software/JTimeslice/JRandomTimesliceWriter.cc.

Function Documentation

◆ main()

int main ( int argc,
char ** argv )

Definition at line 53 of file software/JTimeslice/JRandomTimesliceWriter.cc.

54{
55 using namespace std;
56 using namespace JPP;
57 using namespace KM3NETDAQ;
58
60
62 string detectorFile;
63 Long64_t numberOfSlices;
64 JDAQHit::JTDC_t TCLB_ns;
65 JPMTParametersMap pmtParameters;
66 JK40Rates rates_Hz;
67 JMixedK40Rates mixed_Hz;
68 int run;
69 JRunByRun runbyrun;
70 pair<size_t, double> recycling;
71 double sigma_ns;
72 bool fast;
73 JRandom seed;
74 int debug;
75
76 try {
77
78 JParser<> zap("Auxiliary program to write time slices with random data.");
79
80 zap['o'] = make_field(outputFile, "output file");
81 zap['n'] = make_field(numberOfSlices);
82 zap['a'] = make_field(detectorFile, "detector.");
83 zap['R'] = make_field(run, "run number") = -1;
84 zap['r'] = make_field(runbyrun, "option for run-by-run mode") = JPARSER::initialised();
85 zap['P'] = make_field(pmtParameters, "PMT simulation data (or corresponding file name)") = JPARSER::initialised();
86 zap['B'] = make_field(rates_Hz, "background rates [Hz]") = JPARSER::initialised();
87 zap['X'] = make_field(mixed_Hz, "mixed-L1/L0 background rates [Hz]") = JPARSER::initialised();
88 zap['T'] = make_field(TCLB_ns, "CLB state-machine time jitter") = 256; // [ns]
89 zap['N'] = make_field(recycling, "number of recycles / time interval for sampling data [ns]") = make_pair(0, 0.0);
90 zap['s'] = make_field(sigma_ns, "intrinsic time smearing of K40 coincidences [ns]") = JK40DefaultSimulatorInterface::getSigma();
91 zap['F'] = make_field(fast, "fast - disable PMT simulation");
92 zap['S'] = make_field(seed, "seed") = 0;
93 zap['d'] = make_field(debug, "debug") = 0;
94
95 zap(argc, argv);
96 }
97 catch(const exception &error) {
98 FATAL(error.what() << endl);
99 }
100
101
102 if (outputFile.size() != 1 &&
103 outputFile.size() != 2) {
104 FATAL("Invalid number of output files; should be 1 or 2." << endl);
105 }
106
107 seed.set(gRandom);
108
110
111
113
114 if (pmtParameters.getQE() != 1.0) {
115
116 WARNING("Correct background rates with global efficiency " << pmtParameters.getQE() << endl);
117
118 rates_Hz.correct(pmtParameters.getQE());
119 }
120
121 DEBUG("PMT parameters: " << endl << pmtParameters << endl);
122 DEBUG("K40 rates: " << endl << rates_Hz << endl);
123
125
126 try {
127 load(detectorFile, detector);
128 }
129 catch(const JException& error) {
130 FATAL(error);
131 }
132
134
136 JSummaryRouter summaryRouter;
137
138 JDAQUTCExtended UTC = JDAQUTCExtended::getInstance(); // start of run
139
140 if (runbyrun.is_valid()) {
141
142 NOTICE("Using run-by-run:" << endl << runbyrun << endl);
143
144 if (!runbyrun.hasNext()) {
145 FATAL("Run-by-run simulation yields no input." << endl);
146 }
147
148 try {
149 simbad.reset(new JK40RunByRunSimulator(summaryRouter, rates_Hz, mixed_Hz));
150 simbad.reset(new JPMTDefaultSimulator(pmtParameters, detector));
151 simbad.reset(new JCLBRunByRunSimulator(summaryRouter));
152 }
153 catch(const JException& error) {
154 FATAL(error.what() << endl);
155 }
156
157 } else {
158
159 NOTICE("Using fixed rates [Hz]: " << rates_Hz << endl);
160
161 try {
162 simbad.reset(new JK40DefaultSimulator(rates_Hz, mixed_Hz));
163 simbad.reset(fast ?
165 new JPMTDefaultSimulator(pmtParameters, detector));
166 simbad.reset(new JCLBDefaultSimulator());
167 }
168 catch(const JException& error) {
169 FATAL(error.what() << endl);
170 }
171 }
172
173
174 JTimer timerco("constructor");
175 JTimer timerrc("recycle");
176 JTimer timerIO("I/O");
177
178 for (size_t i = 0; i != outputFile.size(); ++i) {
179
180 outputFile[i].open();
181
182 if (!outputFile[i].is_open()) {
183 FATAL("Error opening file " << outputFile[i] << endl);
184 }
185 }
186
187 outputFile[0].put(JMeta(argc, argv));
188 outputFile[0].put(*gRandom);
189
190 int counter = 0;
191
192 for ( ; counter != numberOfSlices; ) {
193
194 STATUS("slice: " << setw(10) << counter << '\r'); DEBUG(endl);
195
196 int frame_index = counter + 1;
197
198 JDAQUTCExtended utc(UTC.getTimeNanoSecond() + getTimeOfFrame(frame_index));
199
200 if (runbyrun.hasNext()) {
201
202 summaryRouter.update(runbyrun.next());
203
204 summaryRouter.correct(dynamic_cast<const JPMTDefaultSimulatorInterface&>(simbad.getPMTSimulator()));
205
206 run = summaryRouter.getRunNumber();
207 frame_index = summaryRouter.getFrameIndex();
208 utc = summaryRouter.getTimesliceStart();
209 }
210
211 const JDAQChronometer chronometer(detector.getID(), run, frame_index, utc);
212
213 timerco.start();
214
215 JRandomTimeslice timeslice(chronometer, simbad);
216
217 timerco.stop();
218
219 timerIO.start();
220
221 outputFile.rbegin()->put(timeslice); ++counter;
222
223 timerIO.stop();
224
225 for (size_t i = 1; i <= recycling.first && counter != numberOfSlices; ++i) {
226
227 STATUS("slice: " << setw(10) << counter << '\r'); DEBUG(endl);
228
229 timerrc.start();
230
231 timeslice.recycle(recycling.second);
232
233 timerrc.stop();
234
235 timerIO.start();
236
237 outputFile.rbegin()->put(timeslice); ++counter;
238
239 timerIO.stop();
240 }
241 }
242 STATUS(endl);
243
244 if (debug >= notice_t) {
245 timerco.print(cout, true);
246 timerrc.print(cout, true);
247 timerIO.print(cout, true);
248 }
249
250 Head header;
251
252 {
253 JHead buffer;
254
255 buffer.DAQ.livetime_s = getLivetime(runbyrun->getFilelist());
256 buffer.K40.livetime_s = counter * getFrameTime() * 1.0e-9;
257
258 buffer.push(&JHead::DAQ);
259 buffer.push(&JHead::K40);
260
261 copy(buffer, header);
262 }
263
264 outputFile[0].put(header);
265 outputFile[0].put(*gRandom);
266
267 for (size_t i = 0; i != outputFile.size(); ++i) {
268 outputFile[i].close();
269 }
270}
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::DAQ DAQ
Definition JHead.hh:1625
void push(T JHead::*pd)
Push given data member to Head.
Definition JHead.hh:1374
JAANET::K40 K40
Definition JHead.hh:1626
Detector data structure.
Definition JDetector.hh:96
static double getSigma()
Get intrinsic time smearing of K40 coincidences.
static void setSigma(const double sigma)
Set intrinsic time smearing of K40 coincidences.
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.
Auxiliary class for CPU timing and usage.
Definition JTimer.hh:33
General exception.
Definition JException.hh:24
virtual const char * what() const override
Get error message.
Definition JException.hh:64
virtual bool hasNext() override
Check availability of next element.
virtual const pointer_type & next() override
Get next element.
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
Object writing to file.
Router for fast addressing of summary data in KM3NETDAQ::JDAQSummaryslice data structure as a functio...
void update(const JDAQSummaryslice *ps)
Update router.
CLB simulation based on run-by-run information.
K40 simulation based on run-by-run information.
int getRunNumber() const
Get run number.
JDAQUTCExtended getTimesliceStart() const
Get start of timeslice.
int getFrameIndex() const
Get frame index.
unsigned int JTDC_t
leading edge [ns]
Definition JDAQHit.hh:39
Data structure for UTC time.
static const JDAQUTCExtended & getInstance()
Get arbitrary offset (e.g.
double getTimeNanoSecond() const
Get time (limited to 16 ns cycles).
void copy(const Head &from, JHead &to)
Copy header from from to to.
Definition JHead.cc:163
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
@ debug_t
debug
Definition JMessage.hh:29
@ notice_t
notice
Definition JMessage.hh:32
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
double getLivetime(const std::string &file_name)
Get data taking live time.
KM3NeT DAQ data structures and auxiliaries.
Definition DataQueue.cc:39
double getFrameTime()
Get frame time duration.
Definition JDAQClock.hh:162
void setDAQLongprint(const bool option)
Set DAQ print option.
Definition JDAQPrint.hh:28
The Head class reflects the header of Monte-Carlo event files, which consists of keys (also referred ...
Definition Head.hh:65
double livetime_s
Live time [s].
Definition JHead.hh:1053
double livetime_s
Live time [s].
Definition JHead.hh:1107
Detector file.
Definition JHead.hh:227
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 mixed-L1/L0 K40 rates.
Definition JK40Rates.hh:229
Auxiliary class for ROOT I/O of application specific meta data.
Definition JMeta.hh:72
Auxiliary class to select summary data (KM3NETDAQ::JDAQSummaryslice) from the specified raw data file...
Definition JRunByRun.hh:34
bool is_valid() const
Check validity of run by run options.
Definition JRunByRun.hh:48
Timeslice with random data.