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 double NPE;
96 int application;
97 string option;
100
101 try {
102
103 JParser<> zap(
"Example program to histogram fit results.");
104
114 zap[
'O'] =
make_field(option) =
"LINE",
"LOGE",
"LINN",
"LOGN";
117
118 zap(argc, argv);
119 }
120 catch(const exception& error) {
121 FATAL(error.what() << endl);
122 }
123
125
126 try {
128 }
129 catch(const exception& error) {
130 FATAL(error.what() << endl);
131 }
132
133 JVolume volume(head, option !=
"LINE");
137
138 cylinder.
add(offset);
139
140 NOTICE(
"Offset: " << offset << endl);
141 NOTICE(
"Cylinder: " << cylinder << endl);
142
144
145 TH1D job("job", NULL, 100, 0.5, 100.5);
146
147 TH1D hn("hn", NULL, 250, -0.5, 249.5);
148 TH1D hq("hq", NULL, 300, 0.0, 600.0);
149 TH1D hi("hi", NULL, 101, -0.5, 100.5);
150 TH1D hv("hv", NULL, 200, -6.0, 0.0);
151 TH1D h1("h1", NULL, 200, -2.0, +2.0);
152 TH1D hc("hc", NULL, 200, -1.0, +1.0);
153 TH1D hu("hu", NULL, 400, -1.0e3, 1.0e3);
154
155 TH1D hx("hx", NULL, 70, -3.0, +2.3);
156 TH1D hd("hd", NULL, 100, 0.0, 10.0);
157 TH1D ht("ht", NULL, 100, -100.0, 100.0);
158
159 TH1D hz0("hz0[start]", NULL, 400, -200.0, 200.0);
160 TH1D hz1("hz1[end]", NULL, 400, -200.0, 200.0);
161
162 TH1D E_0("E_0", NULL, 100, volume.getXmin(), volume.getXmax());
163 TH1D E_1("E_1", NULL, 100, volume.getXmin(), volume.getXmax());
164 TH1D E_2("E_2", NULL, 100, volume.getXmin(), volume.getXmax());
165 TH1D E_E("E_E", NULL, 100, -5.0, +5.0);
166 TH2D ExE("ExE", NULL,
167 40, volume.getXmin(), volume.getXmax(),
168 40, volume.getXmin(), volume.getXmax());
169
170 const Int_t ny = 28800;
171 const Double_t ymin = 0.0;
172 const Double_t ymax = 180.0;
173
175
176 if (option == "LINN") {
177
178 const double xmin = log((
double) 3);
179 const double xmax = log((
double) 300);
180
181 for (
double x = xmin, dx = (xmax - xmin) / 20;
x <=
xmax;
x += dx) {
182 X.push_back((int) exp(x));
183 }
184
185 } else if (option == "LOGN") {
186
187 const double xmin = log10((
double) 3);
188 const double xmax = log10((
double) 300);
189
190 for (
double x = xmin, dx = (xmax - xmin) / 20;
x <=
xmax;
x += dx) {
191 X.push_back(x);
192 }
193
194 } else {
195
196 for (double x = volume.getXmin(), dx = (volume.getXmax() - volume.getXmin()) / 20.0; x < volume.getXmax() + 0.5*dx; x += dx) {
197 X.push_back(x);
198 }
199 }
200
201 TH2D h2("h2", NULL, X.size() - 1, X.data(), ny, ymin, ymax);
202
203 TH2D Va("Va", NULL,
206 TH2D Vb("Vb", NULL,
209
212
213
214 while (inputFile.hasNext()) {
215
216 STATUS(
"event: " << setw(10) << inputFile.getCounter() <<
'\r');
DEBUG(endl);
217
218 multi_pointer_type ps = inputFile.next();
219
223
225
226 job.Fill(1.0);
227
228
229 double Enu = 0.0;
230 double Emu = 0.0;
231 double Emax = 0.0;
232
235 }
236
237 vector<Trk>::const_iterator muon = event->mc_trks.end();
238
239 for (vector<Trk>::const_iterator track = event->mc_trks.begin(); track != event->mc_trks.end(); ++track) {
240
242
243 Emu += track->E;
244
245 if (track->E > Emax) {
246 muon = track;
247 Emax = track->E;
248 }
249 }
250 }
251
252 if (muon == event->mc_trks.end()) {
253 continue;
254 }
255
256 job.Fill(3.0);
257
258
259
260
262
263 {
264 const double E = event->mc_trks[0].E;
266
267 if (option == "LINN")
269 else if (option == "LOGN")
271 else
273 }
274
275
276 if (!evt->empty()) {
277
279
280 if (evt->begin() == __end) {
281 continue;
282 }
283
284 job.Fill(4.0);
285
286 if (numberOfPrefits > 0) {
287
288 JEvt::iterator __q = __end;
289
290 advance(__end = evt->begin(), min(numberOfPrefits, (
size_t)
distance(evt->begin(), __q)));
291
293
294 } else {
295
297 }
298
299 double E = 0.0;
301
303 E = Emu;
305 }
else if (
primary == neutrino_t) {
306 E = Enu;
308 }
309
310 JEvt::iterator best = pointing(evt->begin(), __end);
311 const Double_t beta = pointing.
getAngle(*best);
312 const double Efit = best->getE();
313 const double Eraw = best->getW(
JENERGY_ENERGY, numeric_limits<double>::min());
314 const double mip = best->getW(
JSTART_NPE_MIP, numeric_limits<double>::max());
315
316
317
318 bool ok = (Efit >= Emin_GeV && mip >= NPE);
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
387 }
388
390
391 const double npe = best->getW(
JVETO_NPE);
393 const double pv = TMath::PoissonI(count, npe);
394
395 hv.Fill(max(log10(pv), hv.GetXaxis()->GetXmin()));
396 }
397 }
398 }
399 }
401
402 NOTICE(
"Number of events input " << setw(8) << right << job.GetBinContent(1) << endl);
403 NOTICE(
"Number of events with muon " << setw(8) << right << job.GetBinContent(3) << endl);
404 NOTICE(
"Number of events with fit " << setw(8) << right << job.GetBinContent(4) << endl);
405 NOTICE(
"Number of events selected " << setw(8) << right << job.GetBinContent(5) << endl);
406 NOTICE(
"Number of events with neutrino " << setw(8) << right << job.GetBinContent(6) << endl);
407 NOTICE(
"Number of events contained " << setw(8) << right << job.GetBinContent(7) << endl);
408
409 if (Q.getCount() != 0) {
410 NOTICE(
"Median space angle [deg] " <<
FIXED (6,3) << Q.getQuantile(0.5) << endl);
411 }
412
413 out.Write();
414 out.Close();
415}
#define DEBUG(A)
Message macros.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
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 JMUONGANDALF
static const int JMUONPREFIT
static const int JMUONENERGY
static const int JMUONSIMPLEX
static const int JMUONPATH
static const int JMUONSTART
static const int JENERGY_ENERGY
uncorrected energy [GeV] from JEnergy.cc
static const int JVETO_NPE
number of photo-electrons from JVeto.cc
static const int JSTART_LENGTH_METRES
distance between projected positions on the track of optical modules for which the response does not ...
static const int JVETO_NUMBER_OF_HITS
number of hits from JVeto.cc
static const int JSTART_NPE_MIP
number of photo-electrons up to the barycentre from JStart.cc
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.