80{
84
86 typedef JTriggeredFileScanner_t::multi_pointer_type multi_pointer_type;
87
88 JTriggeredFileScanner_t inputFile;
91 size_t numberOfPrefits;
94 double Emin_GeV;
95 int application;
96 string option;
99
100 try {
101
102 JParser<> zap(
"Example program to histogram fit results.");
103
112 zap[
'O'] =
make_field(option) =
"LINE",
"LOGE",
"LINN",
"LOGN";
115
116 zap(argc, argv);
117 }
118 catch(const exception& error) {
119 FATAL(error.what() << endl);
120 }
121
123
124 try {
126 }
127 catch(const exception& error) {
128 FATAL(error.what() << endl);
129 }
130
131 JVolume volume(head, option !=
"LINE");
135
136 cylinder.
add(offset);
137
138 NOTICE(
"Offset: " << offset << endl);
139 NOTICE(
"Cylinder: " << cylinder << endl);
140
142
143 TH1D job("job", NULL, 100, 0.5, 100.5);
144
145 TH1D hn("hn", NULL, 250, -0.5, 249.5);
146 TH1D hq("hq", NULL, 300, 0.0, 600.0);
147 TH1D hi("hi", NULL, 101, -0.5, 100.5);
148 TH1D hc("hc", NULL, 200, -1.0, +1.0);
149 TH1D hu("hu", NULL, 400, -1.0e3, 1.0e3);
150
151 TH1D hx("hx", NULL, 70, -3.0, +2.3);
152 TH1D hd("hd", NULL, 100, 0.0, 10.0);
153 TH1D ht("ht", NULL, 100, -100.0, 100.0);
154
155 TH1D hz0("hz0[start]", NULL, 400, -200.0, 200.0);
156 TH1D hz1("hz1[end]", NULL, 400, -200.0, 200.0);
157
158 TH1D E_0("E_0", NULL, 100, volume.getXmin(), volume.getXmax());
159 TH1D E_1("E_1", NULL, 100, volume.getXmin(), volume.getXmax());
160 TH1D E_2("E_2", NULL, 100, volume.getXmin(), volume.getXmax());
161 TH1D E_E("E_E", NULL, 100, -5.0, +5.0);
162 TH2D ExE("ExE", NULL,
163 40, volume.getXmin(), volume.getXmax(),
164 40, volume.getXmin(), volume.getXmax());
165
166 const Int_t ny = 28800;
167 const Double_t ymin = 0.0;
168 const Double_t ymax = 180.0;
169
171
172 if (option == "LINN") {
173
174 const double xmin = log((double) 3);
175 const double xmax = log((double) 300);
176
177 for (
double x = xmin, dx = (xmax - xmin) / 20;
x <= xmax;
x += dx) {
178 X.push_back((int) exp(x));
179 }
180
181 } else if (option == "LOGN") {
182
183 const double xmin = log10((double) 3);
184 const double xmax = log10((double) 400);
185
186 for (
double x = xmin, dx = (xmax - xmin) / 20;
x <= xmax;
x += dx) {
187 X.push_back(x);
188 }
189
190 } else {
191
192 for (double x = volume.getXmin(), dx = (volume.getXmax() - volume.getXmin()) / 20.0; x < volume.getXmax() + 0.5*dx; x += dx) {
193 X.push_back(x);
194 }
195 }
196
197 TH2D h2("h2", NULL, X.size() - 1, X.data(), ny, ymin, ymax);
198
199 TH2D Va("Va", NULL,
202 TH2D Vb("Vb", NULL,
205
208
209
210 while (inputFile.hasNext()) {
211
212 STATUS(
"event: " << setw(10) << inputFile.getCounter() <<
'\r');
DEBUG(endl);
213
214 multi_pointer_type ps = inputFile.next();
215
219
221
222 job.Fill(1.0);
223
224
225 double Enu = 0.0;
226 double Emu = 0.0;
227 double Emax = 0.0;
228
231 }
232
233 vector<Trk>::const_iterator muon = event->mc_trks.end();
234
235 for (vector<Trk>::const_iterator track = event->mc_trks.begin(); track != event->mc_trks.end(); ++track) {
236
238
239 Emu += track->E;
240
241 if (track->E > Emax) {
242 muon = track;
243 Emax = track->E;
244 }
245 }
246 }
247
248 if (muon == event->mc_trks.end()) {
249 continue;
250 }
251
252 job.Fill(3.0);
253
254
255
256
258
259 {
260 const double E = event->mc_trks[0].E;
262
263 if (option == "LINN")
265 else if (option == "LOGN")
267 else
269 }
270
271
272 if (!evt->empty()) {
273
275
276 if (evt->begin() == __end) {
277 continue;
278 }
279
280 job.Fill(4.0);
281
282 if (numberOfPrefits > 0) {
283
284 JEvt::iterator __q = __end;
285
286 advance(__end = evt->begin(), min(numberOfPrefits, (
size_t)
distance(evt->begin(), __q)));
287
289
290 } else {
291
293 }
294
295 double E = 0.0;
297
299 E = Emu;
301 }
else if (
primary == neutrino_t) {
302 E = Enu;
304 }
305
306 JEvt::iterator best = pointing(evt->begin(), __end);
307 const Double_t beta = pointing.
getAngle(*best);
308 const double Efit = best->getE();
309 const double Eraw = best->getW(
JENERGY_ENERGY, numeric_limits<double>::min());
310
311
312
313 bool ok = (Efit >= Emin_GeV);
314
315 if (ok) {
316
317 job.Fill(5.0);
318
319 hn.Fill((Double_t) best->getNDF());
320 hq.Fill(best->getQ());
321 hi.Fill((Double_t)
distance(evt->begin(), best));
322 hc.Fill(best->getDZ());
323
324
325
328 hu.Fill(atmosphere(evt->begin(), __end));
329 }
330
331 hx.Fill(max(log10(beta), hx.GetXaxis()->GetXmin()));
332
333 Q.put(beta);
334
337
339 tb.
sub(converter.putTime());
340
343
345
347
348 job.Fill(6.0);
349
351
353
355
357
358 job.Fill(7.0);
359
361
363
366 }
367 }
368
371
372 E_0.Fill(volume.getX(E, true));
373 E_1.Fill(volume.getX(Eraw, true));
374 E_2.Fill(volume.getX(Efit, true));
375 E_E.Fill(volume.getX(Efit) - volume.getX(E));
376 ExE.Fill(volume.getX(E), volume.getX(Efit));
377
378 h2.Fill(x, beta);
379 }
380 }
381 }
383
384 NOTICE(
"Number of events input " << setw(8) << right << job.GetBinContent(1) << endl);
385 NOTICE(
"Number of events with muon " << setw(8) << right << job.GetBinContent(3) << endl);
386 NOTICE(
"Number of events with fit " << setw(8) << right << job.GetBinContent(4) << endl);
387 NOTICE(
"Number of events selected " << setw(8) << right << job.GetBinContent(5) << endl);
388 NOTICE(
"Number of events with neutrino " << setw(8) << right << job.GetBinContent(6) << endl);
389 NOTICE(
"Number of events contained " << setw(8) << right << job.GetBinContent(7) << endl);
390
391 if (Q.getCount() != 0) {
392
393 NOTICE(
"Median space angle [deg] " <<
FIXED (6,3) << Q.getQuantile(0.5) << endl);
394
395 for (double q : {0.50, 0.90, 0.99}) {
396 NOTICE(
"Space angle " <<
FIXED(5,1) << (100.0 * q) <<
"% quantile [deg] " <<
FIXED(6,3) << Q.getQuantile(q) << endl);
397 }
398 }
399
400 out.Write();
401 out.Close();
402}
#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] from 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 container for statistical analysis of a large number of values.
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.