85{
89
91 typedef JTriggeredFileScanner_t::multi_pointer_type multi_pointer_type;
92
93 JTriggeredFileScanner_t inputFile;
96 size_t numberOfPrefits;
99 double Emin_GeV;
100 int application;
101 string option;
104
105 try {
106
107 JParser<> zap(
"Example program to histogram fit results.");
108
117 zap[
'O'] =
make_field(option) = LINE_t, LOGE_t, LINN_t, LOGN_t;
120
121 zap(argc, argv);
122 }
123 catch(const exception& error) {
124 FATAL(error.what() << endl);
125 }
126
128
129 try {
131 }
132 catch(const exception& error) {
133 FATAL(error.what() << endl);
134 }
135
136 JVolume volume(head, option != LINE_t);
140
141 cylinder.
add(offset);
142
143 NOTICE(
"Offset: " << offset << endl);
144 NOTICE(
"Cylinder: " << cylinder << endl);
145
147
148 TH1D job("job", NULL, 100, 0.5, 100.5);
149
150 TH1D hn("hn", NULL, 250, -0.5, 249.5);
151 TH1D hq("hq", NULL, 300, 0.0, 600.0);
152 TH1D hi("hi", NULL, 101, -0.5, 100.5);
153 TH1D hc("hc", NULL, 200, -1.0, +1.0);
154 TH1D hu("hu", NULL, 400, -1.0e3, 1.0e3);
155
156 TH1D hx("hx", NULL, 70, -3.0, +2.3);
157 TH1D hd("hd", NULL, 100, 0.0, 10.0);
158 TH1D ht("ht", NULL, 100, -100.0, 100.0);
159
160 TH1D hz0("hz0[start]", NULL, 400, -200.0, 200.0);
161 TH1D hz1("hz1[end]", NULL, 400, -200.0, 200.0);
162
163 TH1D E_0("E_0", NULL, 100, volume.getXmin(), volume.getXmax());
164 TH1D E_1("E_1", NULL, 100, volume.getXmin(), volume.getXmax());
165 TH1D E_2("E_2", NULL, 100, volume.getXmin(), volume.getXmax());
166 TH1D E_E("E_E", NULL, 100, -5.0, +5.0);
167 TH2D ExE("ExE", NULL,
168 40, volume.getXmin(), volume.getXmax(),
169 40, volume.getXmin(), volume.getXmax());
170
171 const Int_t ny = 28800;
172 const Double_t ymin = 0.0;
173 const Double_t ymax = 180.0;
174
176
177 if (option == LINN_t) {
178
179 const double xmin = log((double) 3);
180 const double xmax = log((double) 300);
181
182 for (
double x = xmin, dx = (xmax - xmin) / 20;
x <= xmax;
x += dx) {
183 X.push_back((
int) exp(x));
184 }
185
186 } else if (option == LOGN_t) {
187
188 const double xmin = log10((double) 3);
189 const double xmax = log10((double) 400);
190
191 for (
double x = xmin, dx = (xmax - xmin) / 20;
x <= xmax;
x += dx) {
193 }
194
195 } else {
196
197 for (double x = volume.getXmin(), dx = (volume.getXmax() - volume.getXmin()) / 20.0; x < volume.getXmax() + 0.5*dx; x += dx) {
199 }
200 }
201
202 TH2D h2(
"h2", NULL,
X.size() - 1,
X.data(), ny, ymin, ymax);
203
204 TH2D Va("Va", NULL,
207 TH2D Vb("Vb", NULL,
210
213
214
215 while (inputFile.hasNext()) {
216
217 STATUS(
"event: " << setw(10) << inputFile.getCounter() <<
'\r');
DEBUG(endl);
218
219 multi_pointer_type ps = inputFile.next();
220
224
226
227 job.Fill(1.0);
228
229
230 double Enu = 0.0;
231 double Emu = 0.0;
232 double Emax = 0.0;
233
236 }
237
238 vector<Trk>::const_iterator muon = event->mc_trks.end();
239
240 for (vector<Trk>::const_iterator track = event->mc_trks.begin(); track != event->mc_trks.end(); ++track) {
241
243
244 Emu += track->E;
245
246 if (track->E > Emax) {
247 muon = track;
248 Emax = track->E;
249 }
250 }
251 }
252
253 if (muon == event->mc_trks.end()) {
254 continue;
255 }
256
257 job.Fill(3.0);
258
259
260
261
263
264 {
265 const double E = event->mc_trks[0].E;
267
268 if (option == LINN_t)
270 else if (option == LOGN_t)
272 else
274 }
275
276
277 if (!evt->empty()) {
278
280
281 if (evt->begin() == __end) {
282 continue;
283 }
284
285 job.Fill(4.0);
286
287 if (numberOfPrefits > 0) {
288
289 JEvt::iterator __q = __end;
290
291 advance(__end = evt->begin(), min(numberOfPrefits, (
size_t)
distance(evt->begin(), __q)));
292
294
295 } else {
296
298 }
299
300 double E = 0.0;
302
304 E = Emu;
306 }
else if (
primary == neutrino_t) {
307 E = Enu;
309 }
310
311 JEvt::iterator best = pointing(evt->begin(), __end);
312 const Double_t beta = pointing.
getAngle(*best);
313 const double Efit = best->getE();
314 const double Eraw = best->getW(
JENERGY_ENERGY, numeric_limits<double>::min());
315
316
317
318 bool ok = (Efit >= Emin_GeV);
319
320 if (ok) {
321
322 job.Fill(5.0);
323
324 hn.Fill((Double_t) best->getNDF());
325 hq.Fill(best->getQ());
326 hi.Fill((Double_t)
distance(evt->begin(), best));
327 hc.Fill(best->getDZ());
328
329
330
333 hu.Fill(atmosphere(evt->begin(), __end));
334 }
335
336 hx.Fill(max(log10(beta), hx.GetXaxis()->GetXmin()));
337
338 Q.put(beta);
339
342
344 tb.
sub(converter.putTime());
345
348
350
352
353 job.Fill(6.0);
354
356
358
360
362
363 job.Fill(7.0);
364
366
368
371 }
372 }
373
376
377 E_0.Fill(volume.getX(E, true));
378 E_1.Fill(volume.getX(Eraw, true));
379 E_2.Fill(volume.getX(Efit, true));
380 E_E.Fill(volume.getX(Efit) - volume.getX(E));
381 ExE.Fill(volume.getX(E), volume.getX(Efit));
382
383 h2.Fill(x, beta);
384 }
385 }
386 }
388
389 NOTICE(
"Number of events input " << setw(8) << right << job.GetBinContent(1) << endl);
390 NOTICE(
"Number of events with muon " << setw(8) << right << job.GetBinContent(3) << endl);
391 NOTICE(
"Number of events with fit " << setw(8) << right << job.GetBinContent(4) << endl);
392 NOTICE(
"Number of events selected " << setw(8) << right << job.GetBinContent(5) << endl);
393 NOTICE(
"Number of events with neutrino " << setw(8) << right << job.GetBinContent(6) << endl);
394 NOTICE(
"Number of events contained " << setw(8) << right << job.GetBinContent(7) << endl);
395
396 if (Q.getCount() != 0) {
397
398 NOTICE(
"Median space angle [deg] " <<
FIXED (6,3) << Q.getQuantile(0.5) << endl);
399
400 for (double q : {0.50, 0.90, 0.99}) {
401 NOTICE(
"Space angle " <<
FIXED(5,1) << (100.0 * q) <<
"% quantile [deg] " <<
FIXED(6,3) << Q.getQuantile(q) << endl);
402 }
403 }
404
405 out.Write();
406 out.Close();
407}
#define DEBUG(A)
Message macros.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
double getRadius() const
Get radius.
Data structure for vector in two dimensions.
double getLengthSquared() const
Get length squared.
double getIntersection(const JVector3D &pos) const
Get longitudinal position along axis of position of closest approach with given position.
double getZmin() const
Get minimal z position.
bool is_inside(const JVector3D &pos) const
Check whether given point is inside cylinder.
double getZmax() const
Get maximal z position.
JCylinder3D & add(const JVector3D &pos)
Add position.
Data structure for position in three dimensions.
const JPosition3D & getPosition() const
Get position.
double getT(const JVector3D &pos) const
Get arrival time of Cherenkov light at given position.
JTime & add(const JTime &value)
Addition operator.
JTime & sub(const JTime &value)
Subtraction operator.
JVector3D & add(const JVector3D &vector)
Add vector.
Utility class to parse command line options.
Auxiliary class to evaluate atmospheric muon hypothesis.
Auxiliary class to compare fit results with respect to a reference direction (e.g....
double getAngle(const JFit &fit) const
Get angle between reference direction and fit result.
const_iterator< T > end() const
Get end of data.
const_iterator< T > begin() const
Get begin of data.
Auxiliary class to convert DAQ hit time to/from Monte Carlo hit time.
static const int JENERGY_ENERGY
uncorrected energy [GeV] see JRECONSTRUCTION::JMuonEnergy
static const int JSTART_LENGTH_METRES
distance between projected positions on the track of optical modules for which the response does not ...
Vec getOrigin(const JHead &header)
Get origin.
JDirection3D getDirection(const Vec &dir)
Get direction.
JTrack3E getTrack(const Trk &track)
Get track.
JCylinder3D getCylinder(const JHead &header)
Get cylinder corresponding to the positions of generated tracks (i.e.
bool has_neutrino(const Evt &evt)
Test whether given event has an incoming neutrino.
JPosition3D getPosition(const Vec &pos)
Get position.
bool is_muon(const Trk &track)
Test whether given track is a (anti-)muon.
Vec getOffset(const JHead &header)
Get offset.
const Trk & get_neutrino(const Evt &evt)
Get incoming neutrino.
size_t getCount(const array_type< T > &buffer, const JCompare_t &compare)
Count number of unique values.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
counter_type advance(counter_type &counter, const counter_type value, const counter_type limit=std::numeric_limits< counter_type >::max())
Advance counter.
Head getCommonHeader(const JMultipleFileScanner_t &file_list)
Get common Monte Carlo header.
KM3NeT DAQ data structures and auxiliaries.
const char *const neutrino_t
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
Auxiliary data structure for floating point format specification.
Auxiliary class for histogramming of effective volume.
Auxiliary class to test history.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
General purpose sorter of fit results.
Auxiliary class for defining the range of iterations of objects.
const JLimit & getLimit() const
Get limit.
static counter_type max()
Get maximum counter value.
Auxiliary class to synchronously read DAQ events and Monte Carlo events (and optionally other events)...
The Trk class represents a Monte Carlo (MC) particle as well as a reconstructed track/shower.
double E
Energy [GeV] (either MC truth or reconstructed)
Reconstruction type dependent comparison of track quality.