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 bool equalize = false;
220 } graphics;
221 string option;
223
224
225 try {
226
228
236
238
239 JParser<> zap(
"Program to display hit probabilities.");
240
241 zap[
'w'] =
make_field(canvas,
"size of canvas <nx>x<ny> [pixels]") =
JCanvas(1200, 600);
242 zap[
'f'] =
make_field(inputFile,
"input file (output of JXXXMuonReconstruction.sh)");
250 zap[
'O'] =
make_field(option,
"draw option") = arrow_t, histogram_t;
251 zap[
'B'] =
make_field(batch,
"batch processing");
253
254 zap(argc, argv);
255 }
256 catch(const exception& error) {
257 FATAL(error.what() << endl);
258 }
259
261 FATAL(
"Missing output file name " <<
outputFile <<
" in batch mode." << endl);
262 }
263
266 }
267
270 }
271
273
275
277
279
282
283
284
285
286 gROOT->SetBatch(batch);
287
288 TApplication* tp = new TApplication("user", NULL, NULL);
289 TCanvas* cv =
new TCanvas(
"display",
"", canvas.
x, canvas.
y);
290
291 if (!batch) {
292 ((TRootCanvas *) cv->GetCanvasImp())->Connect("CloseWindow()", "TApplication", tp, "Terminate()");
293 }
294
295 unique_ptr<TStyle> gStyle(
new JStyle(
"gplot", cv->GetWw(), cv->GetWh(), graphics));
296
297 gROOT->SetStyle("gplot");
298 gROOT->ForceStyle();
299
300 const size_t NUMBER_OF_PADS = 3;
301
302 cv->SetFillStyle(4000);
303 cv->SetFillColor(kWhite);
304
305 TPad*
p1 =
new TPad(
"p1", NULL, 0.0, 0.00, 1.0, 0.95);
306 TPad* p2 = new TPad("p2", NULL, 0.0, 0.95, 1.0, 1.00);
307
308 p1->Divide(NUMBER_OF_PADS, 1);
309
311 p2->Draw();
312
313 const double Dmax = 1000.0;
314 const double Rmin = 0.0;
315 const double Rmax = min(parameters.
roadWidth_m, 0.4 * Dmax);
316 const double Tmin = min(parameters.
TMin_ns, -10.0);
317 const double Tmax = max(parameters.
TMax_ns, +100.0);
318 const double Amin = 0.002 * (Tmax - Tmin);
319 const double Amax = 0.8 * (Tmax - Tmin);
320 const double ymin = Tmin - (option == arrow_t ? 0.2 * Amax : 0.0);
321 const double ymax = Tmax + (option == arrow_t ? 0.5 * Amax : 0.0);
322
323 const string Xlabel[NUMBER_OF_PADS] = { "R [m]", "#phi [rad]", "z [m]" };
324 const double Xmin [NUMBER_OF_PADS] = { Rmin, -
PI, -0.4 * Dmax };
325 const double Xmax [NUMBER_OF_PADS] = { Rmax, +
PI, +0.4 * Dmax };
326
327 double Xs[NUMBER_OF_PADS];
328
329 for (size_t i = 0; i != NUMBER_OF_PADS; ++i) {
330 Xs[i] = 0.003 * (Xmax[i] - Xmin[i]) * (0.5 * NUMBER_OF_PMTS);
331 }
332
333 TH2D H2[NUMBER_OF_PADS];
334 TGraph G2[NUMBER_OF_PADS];
335
336 for (size_t i = 0; i != NUMBER_OF_PADS; ++i) {
337
338 H2[i] = TH2D(
MAKE_CSTRING(
"h" << i), NULL, graphics.nbinsX, Xmin[i] - Xs[i], Xmax[i] + Xs[i], graphics.nbinsY, ymin, ymax);
339
340 H2[i].GetXaxis()->SetTitle(Xlabel[i].c_str());
341 H2[i].GetYaxis()->SetTitle("#Deltat [ns]");
342
343 H2[i].GetXaxis()->CenterTitle(true);
344 H2[i].GetYaxis()->CenterTitle(true);
345
346 H2[i].SetStats(kFALSE);
347
348 G2[i].Set(2);
349
350 G2[i].SetPoint(0, H2[i].GetXaxis()->GetXmin(), 0.0);
351 G2[i].SetPoint(1, H2[i].GetXaxis()->GetXmax(), 0.0);
352
354
355 H2[i].Draw("AXIS");
356 G2[i].Draw("SAME");
357 }
358
359
361
362 cout <<
"event: " << setw(8) << inputFile.
getCounter() << endl;
363
364 const Evt* evt = inputFile.
next();
365
367
369
370 if (!event_selector(fit, *evt)) {
371 continue;
372 }
373
374 JDataL0_t dataL0;
375
376 for (
const Hit& hit : evt->
hits) {
380 }
381
386
388
390
392
393 for (
const auto& trk : evt->
mc_trks) {
395 if (trk.E > muon.
E) {
396
397 muon = trk;
399
401 }
402 }
403 }
404 }
405
406
407 bool monte_carlo = false;
408
409 for (bool next = false; !next; ) {
410
411 for (size_t i = 0; i != NUMBER_OF_PADS; ++i) {
412 H2[i].Reset();
413 }
414
416
417 if (!monte_carlo)
418 trk = fit;
419 else
420 trk = muon;
421
425
426
427
428
429
431
432
433
435
436 for (JDataL0_t::const_iterator i = dataL0.begin(); i != dataL0.end(); ++i) {
437
438 const int type = 0;
439 const double QE = 1.0;
440 const double R_Hz = summary.getRate(i->getPMTIdentifier(), parameters.
R_Hz);
441
442 JHitW0 hit(*i, type, QE, R_Hz);
443
444 hit.rotate(R);
445
446 if (match(hit)) {
448 }
449 }
450
451
452
453 sort(
data.begin(),
data.end(), JHitW0::compare);
454
455 JDataW0_t::iterator __end = unique(
data.begin(),
data.end(), equal_to<JDAQPMTIdentifier>());
456
457 double E_GeV = parameters.
E_GeV;
458
459
460
461
462
463
464
465
467
468 for (JDataW0_t::iterator hit =
data.begin(); hit != __end; ++hit) {
469
470 const double x = hit->getX() - tz.getX();
471 const double y = hit->getY() - tz.getY();
472 const double z = hit->getZ();
473 const double R = sqrt(x*x + y*y);
474
476 }
477
478 const double z0 = tz.getZ();
480
482
483
484
485
486 ostringstream os;
489
491
492 marker[2].push_back(TMarker(z0 - tz.getZ(), 0.0, kFullCircle));
494
495 static_cast<TAttMarker&>(marker[2][0]) = TAttMarker(kRed, kFullCircle, 0.7);
496 static_cast<TAttMarker&>(marker[2][1]) = TAttMarker(kRed, kFullCircle, 0.7);
497 }
498
500 <<
FIXED(7,2) << tz.getX() <<
' '
501 <<
FIXED(7,2) << tz.getY() <<
' '
502 <<
FIXED(7,2) << tz.getZ() <<
' '
503 <<
FIXED(12,2) << tz.getT() << endl);
504
505 double chi2 = 0;
506
507 for (JDataW0_t::const_iterator hit =
data.begin(); hit != __end; ++hit) {
508
509 const double x = hit->getX() - tz.getX();
510 const double y = hit->getY() - tz.getY();
511 const double z = hit->getZ() - tz.getZ();
512 const double R = sqrt(x*x + y*y);
513
515
516 JDirection3D dir(hit->getDX(), hit->getDY(), hit->getDZ());
517
519
520 const double theta = dir.getTheta();
521 const double phi = fabs(dir.getPhi());
522
523
524 const double E = E_GeV;
525 const double dt = T_ns.constrain(hit->getT() - t1);
526
529
532 }
533
534 H1 += H0;
535
536 chi2 += H1.getChi2() - H0.getChi2();
537
539 << setw(8) << hit->getModuleID() <<
'.' <<
FILL(2,
'0') << (
int) hit->getPMTAddress() <<
FILL() <<
' '
541 <<
FIXED(7,2) << R <<
' '
542 <<
FIXED(7,4) << theta <<
' '
543 <<
FIXED(7,4) << phi <<
' '
544 <<
FIXED(7,3) << dt <<
' '
545 <<
FIXED(7,3) << H1.getChi2() <<
' '
546 <<
FIXED(7,3) << H0.getChi2() << endl);
547
548 const double derivative = H1.getDerivativeOfChi2() - H0.getDerivativeOfChi2();
549
550 double size = derivative * graphics.arrowScale;
551
552 if (fabs(size) < Amin) {
553 size = (size > 0.0 ? +Amin : -Amin);
554 } else if (fabs(size) > Amax) {
555 size = (size > 0.0 ? +Amax : -Amax);
556 }
557
558 const double X[NUMBER_OF_PADS] = { R, atan2(y,x), z - R/
getTanThetaC() };
559
560 const double xs = (double) (NUMBER_OF_PMTS - 2 * hit->getPMTAddress()) / (double) NUMBER_OF_PMTS;
561
562 for (size_t i = 0; i != NUMBER_OF_PADS; ++i) {
563
564 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());
565
566 a1.SetLineWidth(graphics.lineWidth);
567 a1.SetLineStyle(graphics.lineStyle);
568
569 arrow[i].push_back(a1);
570
571 H2[i].Fill(X[i], dt + graphics.T_ns);
572 }
573 }
574
575 if (graphics.equalize) {
576
577 double zmax = 0.0;
578
579 for (size_t i = 0; i != NUMBER_OF_PADS; ++i) {
580 if (H2[i].GetMaximum() > zmax) {
581 zmax = H2[i].GetMaximum();
582 }
583 }
584
585 zmax *= 1.2;
586
587 for (size_t i = 0; i != NUMBER_OF_PADS; ++i) {
588 H2[i].SetMaximum(zmax);
589 }
590 }
591
593 os <<
" Q = " <<
FIXED(4,0) << trk.
lik
594 <<
'/' <<
FIXED(4,0) << -chi2;
595 os <<
" E = " <<
SCIENTIFIC(7,1) << trk.
E <<
" [GeV]";
596 os <<
" cos(#theta) = " <<
FIXED(6,3) << trk.
dir.
z;
598
599 if (monte_carlo)
600 os << " Monte Carlo";
603
604
605
606
607 TLatex title(0.05, 0.5, os.str().c_str());
608
609 title.SetTextAlign(12);
610 title.SetTextFont(42);
611 title.SetTextSize(0.6);
612
613 p2->cd();
614
615 title.Draw();
616
617 for (int i = 0; i != NUMBER_OF_PADS; ++i) {
618
620
621 if (option == arrow_t) {
622
623 for (auto& a1 : arrow[i]) {
624 a1.Draw();
625 }
626
627 for (auto& m1 : marker[i]) {
628 m1.Draw();
629 }
630 }
631
632 if (option == histogram_t) {
633 H2[i].Draw("SAME");
634 }
635 }
636
637 cv->Update();
638
639
640
641
642 if (batch) {
643
645
646 next = true;
647
648 } else {
649
650 static int count = 0;
651
652 if (count++ == 0) {
653 cout << endl << "Type '?' for possible options." << endl;
654 }
655
656 for (bool user = true; user; ) {
657
658 cout << "\n> " << flush;
659
661
662 case '?':
663 cout << endl;
664 cout << "possible options: " << endl;
665 cout << 'q' << " -> " << "exit application" << endl;
666 cout << 'u' << " -> " << "update canvas" << endl;
667 cout << 's' << " -> " << "save graphics to file" << endl;
668 cout << 'M' << " -> " << "Monte Carlo true muon information" << endl;
669 cout << 'F' << " -> " << "fit information" << endl;
671 cout << 'L' << " -> " << "reload event selector" << endl;
672 }
673 cout << 'r' << " -> " << "rewind input file" << endl;
674 cout << 'R' << " -> " << "switch to ROOT mode (quit ROOT to continue)" << endl;
675 cout << 'p' << " -> " << "print event information" << endl;
676 cout << ' ' << " -> " << "next event (as well as any other key)" << endl;
677 break;
678
679 case 'q':
680 cout << endl;
681 return 0;
682
683 case 'u':
684 cv->Update();
685 break;
686
687 case 's':
689 break;
690
691 case 'M':
693 monte_carlo = true;
694 else
695 ERROR(endl <<
"No Monte Carlo muon available." << endl);
696 user = false;
697 break;
698
699 case 'F':
700 monte_carlo = false;
701 user = false;
702 break;
703
704 case 'L':
706 execute(
MAKE_STRING(
"make -f " <<
getPath(argv[0]) <<
"/JMakeEventSelector libs"), 3);
708 }
709 break;
710
711 case 'R':
712 tp->Run(kTRUE);
713 break;
714
715 case 'p':
716 cout << endl;
719 for (
const auto& trk : evt->
mc_trks) {
720 cout <<
"MC "; trk.
print(cout); cout << endl;
721 }
722 for (
const auto& trk : evt->
trks) {
723 cout <<
"fit "; trk.
print(cout); cout << endl;
724 }
725 for (
const auto& hit : evt->
hits) {
726 cout <<
"hit "; hit.
print(cout); cout << endl;
727 }
728 }
729 break;
730
731 case 'r':
733
734 default:
735 next = true;
736 user = false;
737 break;
738 }
739 }
740 }
741 }
742 }
743 }
744 cout << endl;
745}
#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 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.