196{
200
202 JLimit_t& numberOfEvents = inputFile.getLimit();
203 string pdfFile;
206 int application;
209 bool batch;
211 double arrowSize = 0.003;
212 string arrowType = "|->";
213 double arrowScale = 250.0;
214 Width_t lineWidth = 2;
215 Style_t lineStyle = 1;
216 int nbinsX = 50;
217 int nbinsY = 250;
218 double T_ns = 0.0;
219 } graphics;
220 string option;
222
223
224 try {
225
227
234
236
237 JParser<> zap(
"Program to display hit probabilities.");
238
239 zap[
'w'] =
make_field(canvas,
"size of canvas <nx>x<ny> [pixels]") =
JCanvas(1200, 600);
240 zap[
'f'] =
make_field(inputFile,
"input file (output of JXXXMuonReconstruction.sh)");
248 zap[
'O'] =
make_field(option,
"draw option") = arrow_t, histogram_t;
249 zap[
'B'] =
make_field(batch,
"batch processing");
251
252 zap(argc, argv);
253 }
254 catch(const exception& error) {
255 FATAL(error.what() << endl);
256 }
257
259 FATAL(
"Missing output file name " <<
outputFile <<
" in batch mode." << endl);
260 }
261
264 }
265
268 }
269
271
273
275
277
280
281
282
283
284 gROOT->SetBatch(batch);
285
286 TApplication* tp = new TApplication("user", NULL, NULL);
287 TCanvas* cv =
new TCanvas(
"display",
"", canvas.
x, canvas.
y);
288
289 if (!batch) {
290 ((TRootCanvas *) cv->GetCanvasImp())->Connect("CloseWindow()", "TApplication", tp, "Terminate()");
291 }
292
293 unique_ptr<TStyle> gStyle(
new JStyle(
"gplot", cv->GetWw(), cv->GetWh(), graphics));
294
295 gROOT->SetStyle("gplot");
296 gROOT->ForceStyle();
297
298 const size_t NUMBER_OF_PADS = 3;
299
300 cv->SetFillStyle(4000);
301 cv->SetFillColor(kWhite);
302
303 TPad*
p1 =
new TPad(
"p1", NULL, 0.0, 0.00, 1.0, 0.95);
304 TPad* p2 = new TPad("p2", NULL, 0.0, 0.95, 1.0, 1.00);
305
306 p1->Divide(NUMBER_OF_PADS, 1);
307
309 p2->Draw();
310
311 const double Dmax = 1000.0;
312 const double Rmin = 0.0;
313 const double Rmax = min(parameters.
roadWidth_m, 0.4 * Dmax);
314 const double Tmin = min(parameters.
TMin_ns, -10.0);
315 const double Tmax = max(parameters.
TMax_ns, +100.0);
316 const double Amin = 0.002 * (Tmax - Tmin);
317 const double Amax = 0.8 * (Tmax - Tmin);
318 const double ymin = Tmin - (option == arrow_t ? 0.2 * Amax : 0.0);
319 const double ymax = Tmax + (option == arrow_t ? 0.5 * Amax : 0.0);
320
321 const string Xlabel[NUMBER_OF_PADS] = { "R [m]", "#phi [rad]", "z [m]" };
322 const double Xmin [NUMBER_OF_PADS] = { Rmin, -
PI, -0.4 * Dmax };
323 const double Xmax [NUMBER_OF_PADS] = { Rmax, +
PI, +0.4 * Dmax };
324
325 double Xs[NUMBER_OF_PADS];
326
327 for (size_t i = 0; i != NUMBER_OF_PADS; ++i) {
328 Xs[i] = 0.003 * (Xmax[i] - Xmin[i]) * (0.5 * NUMBER_OF_PMTS);
329 }
330
331 TH2D H2[NUMBER_OF_PADS];
332 TGraph G2[NUMBER_OF_PADS];
333
334 for (size_t i = 0; i != NUMBER_OF_PADS; ++i) {
335
336 H2[i] = TH2D(
MAKE_CSTRING(
"h" << i), NULL, graphics.nbinsX, Xmin[i] - Xs[i], Xmax[i] + Xs[i], graphics.nbinsY, ymin, ymax);
337
338 H2[i].GetXaxis()->SetTitle(Xlabel[i].c_str());
339 H2[i].GetYaxis()->SetTitle("#Deltat [ns]");
340
341 H2[i].GetXaxis()->CenterTitle(true);
342 H2[i].GetYaxis()->CenterTitle(true);
343
344 H2[i].SetStats(kFALSE);
345
346 G2[i].Set(2);
347
348 G2[i].SetPoint(0, H2[i].GetXaxis()->GetXmin(), 0.0);
349 G2[i].SetPoint(1, H2[i].GetXaxis()->GetXmax(), 0.0);
350
352
353 H2[i].Draw("AXIS");
354 G2[i].Draw("SAME");
355 }
356
357
359
360 cout <<
"event: " << setw(8) << inputFile.
getCounter() << endl;
361
362 const Evt* evt = inputFile.
next();
363
365
367
368 if (!event_selector(fit, *evt)) {
369 continue;
370 }
371
372 JDataL0_t dataL0;
373
374 for (
const Hit& hit : evt->
hits) {
378 }
379
384
386
388
390
391 for (
const auto& trk : evt->
mc_trks) {
393 if (trk.E > muon.
E) {
394
395 muon = trk;
397
399 }
400 }
401 }
402 }
403
404
405 bool monte_carlo = false;
406
407 for (bool next = false; !next; ) {
408
409 for (size_t i = 0; i != NUMBER_OF_PADS; ++i) {
410 H2[i].Reset();
411 }
412
414
415 if (!monte_carlo)
416 trk = fit;
417 else
418 trk = muon;
419
423
424
425
426
427
429
430
431
433
434 for (JDataL0_t::const_iterator i = dataL0.begin(); i != dataL0.end(); ++i) {
435
436 JHitW0 hit(*i, summary.getRate(i->getPMTIdentifier(), parameters.
R_Hz));
437
438 hit.rotate(R);
439
440 if (match(hit)) {
442 }
443 }
444
445
446
447 sort(
data.begin(),
data.end(), JHitW0::compare);
448
449 JDataW0_t::iterator __end = unique(
data.begin(),
data.end(), equal_to<JDAQPMTIdentifier>());
450
451 double E_GeV = parameters.
E_GeV;
452
453
454
455
456
457
458
459
461
462 for (JDataW0_t::iterator hit =
data.begin(); hit != __end; ++hit) {
463
464 const double x = hit->getX() - tz.getX();
465 const double y = hit->getY() - tz.getY();
466 const double z = hit->getZ();
467 const double R = sqrt(x*x + y*y);
468
470 }
471
472 const double z0 = tz.getZ();
474
476
477
478
479
480 ostringstream os;
483
485
486 marker[2].push_back(TMarker(z0 - tz.getZ(), 0.0, kFullCircle));
488
489 static_cast<TAttMarker&>(marker[2][0]) = TAttMarker(kRed, kFullCircle, 0.7);
490 static_cast<TAttMarker&>(marker[2][1]) = TAttMarker(kRed, kFullCircle, 0.7);
491 }
492
494 <<
FIXED(7,2) << tz.getX() <<
' '
495 <<
FIXED(7,2) << tz.getY() <<
' '
496 <<
FIXED(7,2) << tz.getZ() <<
' '
497 <<
FIXED(12,2) << tz.getT() << endl);
498
499 double chi2 = 0;
500
501 for (JDataW0_t::const_iterator hit =
data.begin(); hit != __end; ++hit) {
502
503 const double x = hit->getX() - tz.getX();
504 const double y = hit->getY() - tz.getY();
505 const double z = hit->getZ() - tz.getZ();
506 const double R = sqrt(x*x + y*y);
507
509
510 JDirection3D dir(hit->getDX(), hit->getDY(), hit->getDZ());
511
513
514 const double theta = dir.getTheta();
515 const double phi = fabs(dir.getPhi());
516
517
518 const double E = E_GeV;
519 const double dt = T_ns.constrain(hit->getT() - t1);
520
523
526 }
527
528 H1 += H0;
529
530 chi2 += H1.getChi2() - H0.getChi2();
531
533 << setw(8) << hit->getModuleID() <<
'.' <<
FILL(2,
'0') << (
int) hit->getPMTAddress() <<
FILL() <<
' '
535 <<
FIXED(7,2) << R <<
' '
536 <<
FIXED(7,4) << theta <<
' '
537 <<
FIXED(7,4) << phi <<
' '
538 <<
FIXED(7,3) << dt <<
' '
539 <<
FIXED(7,3) << H1.getChi2() <<
' '
540 <<
FIXED(7,3) << H0.getChi2() << endl);
541
542 const double derivative = H1.getDerivativeOfChi2() - H0.getDerivativeOfChi2();
543
544 double size = derivative * graphics.arrowScale;
545
546 if (fabs(size) < Amin) {
547 size = (size > 0.0 ? +Amin : -Amin);
548 } else if (fabs(size) > Amax) {
549 size = (size > 0.0 ? +Amax : -Amax);
550 }
551
552 const double X[NUMBER_OF_PADS] = { R, atan2(y,x), z - R/
getTanThetaC() };
553
554 const double xs = (double) (NUMBER_OF_PMTS - 2 * hit->getPMTAddress()) / (double) NUMBER_OF_PMTS;
555
556 for (size_t i = 0; i != NUMBER_OF_PADS; ++i) {
557
558 TArrow a1(X[i] + xs*Xs[i], dt + graphics.T_ns, X[i] + xs*Xs[i], dt + graphics.T_ns + size, graphics.arrowSize, graphics.arrowType.c_str());
559
560 a1.SetLineWidth(graphics.lineWidth);
561 a1.SetLineStyle(graphics.lineStyle);
562
563 arrow[i].push_back(a1);
564
565 H2[i].Fill(X[i], dt + graphics.T_ns);
566 }
567 }
568
569 double zmax = 0.0;
570
571 for (size_t i = 0; i != NUMBER_OF_PADS; ++i) {
572 if (H2[i].GetMaximum() > zmax) {
573 zmax = H2[i].GetMaximum();
574 }
575 }
576
577 zmax *= 1.2;
578
579 for (size_t i = 0; i != NUMBER_OF_PADS; ++i) {
580 H2[i].SetMaximum(zmax);
581 }
582
584 os <<
" Q = " <<
FIXED(4,0) << trk.
lik
585 <<
'/' <<
FIXED(4,0) << -chi2;
586 os <<
" E = " <<
SCIENTIFIC(7,1) << trk.
E <<
" [GeV]";
587 os <<
" cos(#theta) = " <<
FIXED(6,3) << trk.
dir.
z;
589
590 if (monte_carlo)
591 os << " Monte Carlo";
594
595
596
597
598 TLatex title(0.05, 0.5, os.str().c_str());
599
600 title.SetTextAlign(12);
601 title.SetTextFont(42);
602 title.SetTextSize(0.6);
603
604 p2->cd();
605
606 title.Draw();
607
608 for (int i = 0; i != NUMBER_OF_PADS; ++i) {
609
611
612 if (option == arrow_t) {
613
614 for (auto& a1 : arrow[i]) {
615 a1.Draw();
616 }
617
618 for (auto& m1 : marker[i]) {
619 m1.Draw();
620 }
621 }
622
623 if (option == histogram_t) {
624 H2[i].Draw("SAME");
625 }
626 }
627
628 cv->Update();
629
630
631
632
633 if (batch) {
634
636
637 next = true;
638
639 } else {
640
641 static int count = 0;
642
643 if (count++ == 0) {
644 cout << endl << "Type '?' for possible options." << endl;
645 }
646
647 for (bool user = true; user; ) {
648
649 cout << "\n> " << flush;
650
652
653 case '?':
654 cout << endl;
655 cout << "possible options: " << endl;
656 cout << 'q' << " -> " << "exit application" << endl;
657 cout << 'u' << " -> " << "update canvas" << endl;
658 cout << 's' << " -> " << "save graphics to file" << endl;
659 cout << 'M' << " -> " << "Monte Carlo true muon information" << endl;
660 cout << 'F' << " -> " << "fit information" << endl;
662 cout << 'L' << " -> " << "reload event selector" << endl;
663 }
664 cout << 'r' << " -> " << "rewind input file" << endl;
665 cout << 'R' << " -> " << "switch to ROOT mode (quit ROOT to continue)" << endl;
666 cout << 'p' << " -> " << "print event information" << endl;
667 cout << ' ' << " -> " << "next event (as well as any other key)" << endl;
668 break;
669
670 case 'q':
671 cout << endl;
672 return 0;
673
674 case 'u':
675 cv->Update();
676 break;
677
678 case 's':
680 break;
681
682 case 'M':
684 monte_carlo = true;
685 else
686 ERROR(endl <<
"No Monte Carlo muon available." << endl);
687 user = false;
688 break;
689
690 case 'F':
691 monte_carlo = false;
692 user = false;
693 break;
694
695 case 'L':
697 execute(
MAKE_STRING(
"make -f " <<
getPath(argv[0]) <<
"/JMakeEventSelector libs"), 3);
699 }
700 break;
701
702 case 'R':
703 tp->Run(kTRUE);
704 break;
705
706 case 'p':
707 cout << endl;
710 for (
const auto& trk : evt->
mc_trks) {
711 cout <<
"MC "; trk.
print(cout); cout << endl;
712 }
713 for (
const auto& trk : evt->
trks) {
714 cout <<
"fit "; trk.
print(cout); cout << endl;
715 }
716 for (
const auto& hit : evt->
hits) {
717 cout <<
"hit "; hit.
print(cout); cout << endl;
718 }
719 }
720 break;
721
722 case 'r':
724
725 default:
726 next = true;
727 user = false;
728 break;
729 }
730 }
731 }
732 }
733 }
734 }
735 cout << endl;
736}
#define DEBUG(A)
Message macros.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
#define MAKE_CSTRING(A)
Make C-string.
#define MAKE_STRING(A)
Make string.
#define gmake_property(A)
macros to convert (template) parameter to JPropertiesElement object
Utility class to parse parameter values.
Data structure for fit of straight line paralel to z-axis.
Data structure for direction in three dimensions.
Utility class to parse command line options.
Auxiliary class for a hit with background rate value.
Data structure for size of TCanvas.
int y
number of pixels in Y
int x
number of pixels in X
Wrapper class around ROOT TStyle.
Object reading from a list of files.
virtual void rewind() override
Rewind.
virtual bool hasNext() override
Check availability of next element.
counter_type getCounter() const
Get counter.
virtual const pointer_type & next() override
Get next element.
File router for fast addressing of summary data.
Enable unbuffered terminal input.
Data structure for L0 hit.
static void setSlewing(const bool slewing)
Set slewing option.
Data structure for UTC time.
Auxiliary class to convert DAQ hit time to/from Monte Carlo hit time.
double putTime() const
Get Monte Carlo time minus DAQ/trigger time.
static const int JMUONGANDALF
static const int JMUONPREFIT
static const int JMUONENERGY
static const int JMUONSIMPLEX
static const int JMUONSTART
static const int JSTART_LENGTH_METRES
distance between projected positions on the track of optical modules for which the response does not ...
JDirection3D getDirection(const Vec &dir)
Get direction.
bool hasW(const Trk &trk, const int i)
Check availability of value.
bool has_muon(const Evt &evt)
Test whether given event has a muon.
void setW(Trk &trk, const int i, const double value)
Set associated value.
double getW(const Trk &track, const size_t index, const double value)
Get track information.
JPosition3D getPosition(const Vec &pos)
Get position.
bool is_muon(const Trk &track)
Test whether given track is a (anti-)muon.
std::string getPath(const std::string &file_name)
Get path, i.e. part before last JEEP::PATHNAME_SEPARATOR if any.
double getAngle(const JQuaternion3D &first, const JQuaternion3D &second)
Get space angle between quanternions.
std::string replace(const std::string &input, const std::string &target, const std::string &replacement)
Replace tokens in string.
static const double PI
Mathematical constants.
const double getInverseSpeedOfLight()
Get inverse speed of light.
double getTanThetaC()
Get average tangent of Cherenkov angle of water corresponding to group velocity.
const double getSpeedOfLight()
Get speed of light.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
const JFit & get_best_reconstructed_track(const JEvt &evt, JTrackSelector_t selector, JQualitySorter_t comparator)
Get best reconstructed track.
bool has_reconstructed_track(const JEvt &evt, JTrackSelector_t selector)
Test whether given event has a track according selection.
KM3NeT DAQ data structures and auxiliaries.
static const char WILDCARD
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
int frame_index
from the raw data
int run_id
DAQ run identifier.
std::vector< Hit > hits
list of hits
std::vector< Trk > mc_trks
MC: list of MC truth tracks.
int det_id
detector identifier from DAQ
ULong64_t trigger_counter
trigger counter
void print(std::ostream &out=std::cout) const
Print event.
std::vector< Trk > trks
list of reconstructed tracks (can be several because of prefits,showers, etc).
TTimeStamp t
UTC time of the timeslice, or the event_time for MC. (default: 01 Jan 1970 00:00:00)
Auxiliary data structure for sequence of same character.
Auxiliary data structure for floating point format specification.
int dom_id
module identifier from the data (unique in the detector).
void print(std::ostream &out=std::cout) const
Print hit.
Vec dir
hit direction; i.e. direction of the PMT
unsigned int channel_id
PMT channel id {0,1, .., 30} local to moduke.
unsigned int tot
tot value as stored in raw data (int for pyroot)
double t
hit time (from tdc+calibration or MC truth)
Model for fit to acoustics data.
bool is_valid() const
Check validity of function.
void reload()
Reload function from shared library.
Auxiliary data structure for muon PDF.
JFunction1D_t::result_type result_type
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Data structure for fit parameters.
double TTS_ns
transition-time spread [ns]
double TMin_ns
minimal time w.r.t. Cherenkov hypothesis [ns]
double roadWidth_m
road width [m]
double TMax_ns
maximal time w.r.t. Cherenkov hypothesis [ns]
double VMax_npe
maximum number of of photo-electrons
double R_Hz
default rate [Hz]
size_t numberOfPrefits
number of prefits
Auxiliary class for defining the range of iterations of objects.
static counter_type max()
Get maximum counter value.
Auxiliary data structure for floating point format specification.
The Trk class represents a Monte Carlo (MC) particle as well as a reconstructed track/shower.
void print(std::ostream &out=std::cout) const
Print track.
double E
Energy [GeV] (either MC truth or reconstructed)
double t
track time [ns] (when the particle is at pos )
double len
length, if applicable [m]
double lik
likelihood or lambda value (for aafit, lambda)
Range of reconstruction stages.