5 #include <FairRootManager.h>
9 #include <TClonesArray.h>
10 #include <TEveBrowser.h>
11 #include <TEveGeoNode.h>
12 #include <TEveManager.h>
13 #include <TEveViewer.h>
14 #include <TEveWindow.h>
19 #include <TGLCamera.h>
20 #include <TGLViewer.h>
23 #include <TGNumberEntry.h>
26 #include <TGeoManager.h>
27 #include <TGeoVolume.h>
32 #include <TRootBrowser.h>
33 #include <TRootEmbeddedCanvas.h>
37 #include <TVirtualPad.h>
38 #include <TVirtualX.h>
48 constexpr
auto cRED =
"\033[1;31m";
51 constexpr
auto cGREEN =
"\033[1;32m";
52 constexpr
auto cBLUE =
"\033[1;34m";
65 : TEveEventManager(
"AtEventManagerS800",
""), fRootManager(FairRootManager::Instance()),
66 fRunAna(FairRunAna::Instance()), fEntry(0), fEvent(nullptr), fCurrentEvent(nullptr), f3DThresDisplay(nullptr),
67 fCvsPadPlane(nullptr), fPadWave(nullptr), fPadAll(nullptr), fCvsQEvent(nullptr), fCvsHough(nullptr),
68 fCvsRad(nullptr), drawallpad(nullptr), eraseQevent(nullptr), drawHoughSpace(nullptr), saveASCIIevent(nullptr),
69 toggleCorr(nullptr), kDrawAllOn(false), kDrawAllOff(false), kEraseQ(false), kDrawHoughOn(false), kDraw3DGeo(false),
70 kDraw3DHist(false), kToggleData(false), k3DThreshold(0), fCvsLvsTheta(nullptr), fCvsPID(nullptr),
71 fCvsMesh(nullptr), fCvsPIDFull(nullptr), fCvsPID2(nullptr), fCvsPID2Full(nullptr)
90 gStyle->SetOptTitle(0);
92 gStyle->SetPalette(55);
93 TEveManager::Create();
97 UInt_t widthMax = 1400, heightMax = 650;
99 TVirtualX::Instance()->GetWindowSize(gClient->GetRoot()->GetId(), dummy, dummy, width, height);
113 TEveWindowSlot *slot =
nullptr;
114 TEveWindowPack *pack =
nullptr;
117 slot = TEveWindow::CreateWindowInTab(gEve->GetBrowser()->GetTabRight());
118 pack = slot->MakePack();
119 pack->SetElementName(
"AtTPC 3D/Pad plane views");
120 pack->SetHorizontal();
122 pack->SetShowTitleBar(kFALSE);
124 pack->NewSlot()->MakeCurrent();
126 TEveViewer *view3D = gEve->SpawnNewViewer(
"3D View",
"");
127 view3D->AddScene(gEve->GetGlobalScene());
128 view3D->AddScene(gEve->GetEventScene());
142 slot = pack->NewSlot();
143 TEveWindowPack *pack2 = slot->MakePack();
144 pack2->SetShowTitleBar(kFALSE);
145 pack2->SetVertical();
159 slot = pack2->NewSlotWithWeight(1.5);
160 auto *ecvs01 =
new TRootEmbeddedCanvas();
161 TEveWindowFrame *frame01 = slot->MakeFrame(ecvs01);
162 frame01->SetElementName(
"AtTPC Mesh");
163 pack->GetEveFrame()->SetShowTitleBar(kFALSE);
164 fCvsMesh = ecvs01->GetCanvas();
167 slot = pack2->NewSlotWithWeight(1.5);
168 auto *ecvs =
new TRootEmbeddedCanvas();
169 TEveWindowFrame *frame = slot->MakeFrame(ecvs);
170 frame->SetElementName(
"AtTPC Pad Plane");
171 pack->GetEveFrame()->SetShowTitleBar(kFALSE);
172 fCvsPadPlane = ecvs->GetCanvas();
197 TEveWindowSlot *slot2 = TEveWindow::CreateWindowInTab(gEve->GetBrowser()->GetTabRight());
198 TEveWindowPack *pack3 = slot2->MakePack();
199 pack3->SetShowTitleBar(kFALSE);
200 pack3->SetElementName(
"S800 PID1");
202 slot2 = pack3->NewSlotWithWeight(1.5);
203 auto *ecvs3 =
new TRootEmbeddedCanvas();
204 TEveWindowFrame *frame3 = slot2->MakeFrame(ecvs3);
205 frame3->SetElementName(
"T[Xf_Obj]-TObj (gated)");
206 fCvsPID = ecvs3->GetCanvas();
208 slot2 = pack3->NewSlotWithWeight(1.5);
209 auto *ecvs31 =
new TRootEmbeddedCanvas();
210 TEveWindowFrame *frame31 = slot2->MakeFrame(ecvs31);
211 frame31->SetElementName(
"T[Xf_Obj]-TObj (full)");
215 TEveWindowSlot *slot2b = TEveWindow::CreateWindowInTab(gEve->GetBrowser()->GetTabRight());
216 TEveWindowPack *pack3b = slot2b->MakePack();
217 pack3b->SetShowTitleBar(kFALSE);
218 pack3b->SetElementName(
"S800 PID2");
220 slot2b = pack3b->NewSlotWithWeight(1.5);
221 auto *ecvs3b =
new TRootEmbeddedCanvas();
222 TEveWindowFrame *frame3b = slot2b->MakeFrame(ecvs3b);
223 frame3b->SetElementName(
"ICSumE-ToF (gated)");
224 fCvsPID2 = ecvs3b->GetCanvas();
226 slot2b = pack3b->NewSlotWithWeight(1.5);
227 auto *ecvs31b =
new TRootEmbeddedCanvas();
228 TEveWindowFrame *frame31b = slot2b->MakeFrame(ecvs31b);
229 frame31b->SetElementName(
"ICSumE-ToF (full)");
252 TEveWindowSlot *slot3 = TEveWindow::CreateWindowInTab(gEve->GetBrowser()->GetTabRight());
253 TEveWindowPack *pack4 = slot3->MakePack();
254 pack4->SetShowTitleBar(kFALSE);
255 pack4->SetHorizontal();
256 pack4->SetElementName(
"Reconstruction");
258 slot3 = pack4->NewSlotWithWeight(1.5);
259 auto *ecvs4 =
new TRootEmbeddedCanvas();
260 TEveWindowFrame *frame4 = slot3->MakeFrame(ecvs4);
261 frame4->SetElementName(
"Cumulated PadPlane Hits");
262 fCvsHough = ecvs4->GetCanvas();
264 slot3 = pack4->NewSlotWithWeight(1.5);
265 auto *ecvs4_add =
new TRootEmbeddedCanvas();
266 TEveWindowFrame *frame4_add = slot3->MakeFrame(ecvs4_add);
267 frame4_add->SetElementName(
"Track Length vs Theta");
268 fCvsLvsTheta = ecvs4_add->GetCanvas();
358 TGeoNode *geoNode = gGeoManager->GetTopNode();
359 auto *topNode =
new TEveGeoTopNode(gGeoManager, geoNode, option, level, nNodes);
360 gEve->AddGlobalElement(topNode);
362 Int_t transparency = 80;
366 gGeoManager->GetVolume(
"drift_volume")->SetTransparency(transparency);
380 gEve->FullRedraw3D(kTRUE);
381 fEvent = gEve->AddEvent(
this);
386 gEve->GetBrowser()->GetTabRight()->SetTab(1);
389 gEve->Redraw3D(kTRUE, kTRUE);
391 TGLViewer *dfViewer = gEve->GetDefaultGLViewer();
392 dfViewer->CurrentCamera().RotateRad(-.7, 0.5);
400 GotoEvent(fCurrentEvent->GetIntNumber());
408 std::cout <<
cWHITERED <<
" Event number : " << fEntry <<
cNORMAL << std::endl;
409 fRunAna->Run((Long64_t)event);
415 Bool_t gated = kFALSE;
416 while (gated == kFALSE) {
420 if (fEntry < 1 || fEntry >
Entries) {
422 std::cout <<
" No gated events found! " << std::endl;
425 fRootManager->ReadEvent(fEntry);
426 cArray =
dynamic_cast<TClonesArray *
>(fRootManager->GetObject(
"AtEventH"));
427 cevent =
dynamic_cast<AtEvent *
>(cArray->At(0));
431 std::cout <<
" Event number : " << fEntry << std::endl;
432 fRunAna->Run((Long64_t)fEntry);
438 Bool_t gated = kFALSE;
439 while (gated == kFALSE) {
443 if (fEntry < 1 || fEntry >
Entries) {
445 std::cout <<
" No gated events found! " << std::endl;
448 fRootManager->ReadEvent(fEntry);
449 cArray =
dynamic_cast<TClonesArray *
>(fRootManager->GetObject(
"AtEventH"));
450 cevent =
dynamic_cast<AtEvent *
>(cArray->At(0));
454 std::cout <<
" Event number : " << fEntry << std::endl;
455 fRunAna->Run((Long64_t)fEntry);
461 fPIDFull =
new TH2F(
"PIDFull",
"PIDFull", 500, -150, 50, 300, 230, 260);
471 fPID2Full =
new TH2F(
"PID2Full",
"PID2Full", 500, -150, 50, 1000, 1400, 2200);
487 TChain *chain = FairRootManager::Instance()->GetInChain();
488 Entries = chain->GetEntriesFast();
490 for (
int neve = 1; neve <
Entries; neve++) {
491 fRootManager->ReadEvent(neve);
496 cS800Calc =
dynamic_cast<S800Calc *
>(fRootManager->GetObject(
"s800cal"));
497 if (cS800Calc ==
nullptr)
501 Double_t x0_corr_tof = 0.;
502 Double_t afp_corr_tof = 0.;
503 Double_t afp_corr_dE = 0.;
504 Double_t x0_corr_dE = 0.;
505 Double_t rf_offset = 0.;
506 Double_t corrGainE1up = 1;
507 Double_t corrGainE1down = 1;
516 Int_t CondMTDCXfObj = 0;
517 Double_t ObjCorr1C1 = 100.;
518 Double_t ObjCorr1C2 = 0.009;
521 Float_t S800_timeObjSelect = -999;
522 Float_t S800_timeXfSelect = -999;
523 Float_t ObjCorr = -999;
525 for (
float k : S800_timeMTDCXf) {
526 if (k > 140 && k < 230)
527 S800_timeXfSelect = k;
529 for (
float k : S800_timeMTDCObj) {
530 if (k > -115 && k < -20)
531 S800_timeObjSelect = k;
534 Double_t XfObj_tof = S800_timeXfSelect - S800_timeObjSelect;
535 if (S800_timeXfSelect != -999 && S800_timeObjSelect != -999) {
536 XfObj_tof = S800_timeXfSelect - S800_timeObjSelect;
539 Double_t S800_ICSum = cS800Calc->
GetIC()->
GetSum();
551 Double_t S800_afp = atan((S800_x1 - S800_x0) / 1073.);
558 if (CondMTDCXfObj && std::isnan(S800_ICSum) == 0 && std::isnan(S800_afp) == 0 && std::isnan(S800_x0) == 0)
559 ObjCorr = S800_timeObjSelect + ObjCorr1C1 * S800_afp + ObjCorr1C2 * S800_x0;
572 int event = gPad->GetEvent();
575 TObject *select = gPad->GetSelected();
578 if (select->InheritsFrom(TH2::Class())) {
579 auto *h =
dynamic_cast<TH2Poly *
>(select);
580 gPad->GetCanvas()->FeedbackMode(kTRUE);
583 int pyold = gPad->GetUniqueID();
584 int px = gPad->GetEventX();
585 int py = gPad->GetEventY();
586 float uxmin = gPad->GetUxmin();
587 float uxmax = gPad->GetUxmax();
588 int pxmin = gPad->XtoAbsPixel(uxmin);
589 int pxmax = gPad->XtoAbsPixel(uxmax);
591 TVirtualX::Instance()->DrawLine(pxmin, pyold, pxmax, pyold);
592 TVirtualX::Instance()->DrawLine(pxmin, py, pxmax, py);
593 gPad->SetUniqueID(py);
594 Float_t upx = gPad->AbsPixeltoX(px);
595 Float_t upy = gPad->AbsPixeltoY(py);
596 Double_t x = gPad->PadtoX(upx);
597 Double_t
y = gPad->PadtoY(upy);
598 Int_t bin = h->FindBin(x,
y);
599 const char *bin_name = h->GetBinName(bin);
602 std::cout <<
" Bin number selected : " << bin <<
" Bin name :" << bin_name << std::endl;
619 fRunAna->Run((Long64_t)fEntry);
626 TChain *chain = FairRootManager::Instance()->GetInChain();
627 Entries = chain->GetEntriesFast();
631 TEveBrowser *browser = gEve->GetBrowser();
632 browser->StartEmbedding(TRootBrowser::kLeft);
634 auto *frmMain =
new TGMainFrame(gClient->GetRoot(), 1000, 600);
635 frmMain->SetWindowName(
"XX GUI");
636 frmMain->SetCleanup(kDeepCleanup);
638 auto *hf =
new TGVerticalFrame(frmMain);
647 drawallpad =
new TGTextButton(hf,
"&Enable Draw All Pads");
648 drawallpad->SetToolTipText(
649 "Press to Enable/Disble drawing of all pads signal\n (Display on AtTPC Pad Plane Raw Signals tab) ", 400);
650 drawallpad->Connect(
"Clicked()",
"AtEventManagerS800", fInstance,
"ChangeDrawAllPads()");
651 hf->AddFrame(drawallpad,
new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));
653 eraseQevent =
new TGTextButton(hf,
"&Erase Q Event Pad");
654 eraseQevent->SetToolTipText(
"Press to erase Event Q histogram upon calling the next event", 400);
655 eraseQevent->Connect(
"Clicked()",
"AtEventManagerS800", fInstance,
"EraseQEvent()");
656 hf->AddFrame(eraseQevent,
new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));
658 drawHoughSpace =
new TGTextButton(hf,
"&Visualize Reconstruction");
659 drawHoughSpace->SetToolTipText(
"Press to enable Reconstruction visualization", 400);
660 drawHoughSpace->Connect(
"Clicked()",
"AtEventManagerS800", fInstance,
"EnableDrawHoughSpace()");
661 hf->AddFrame(drawHoughSpace,
new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));
663 saveASCIIevent =
new TGTextButton(hf,
"&Save event as text file");
664 saveASCIIevent->SetToolTipText(
"Dump the waveform of each hit into a text file", 400);
665 saveASCIIevent->Connect(
"Clicked()",
"AtEventManagerS800", fInstance,
"SaveASCIIEvent()");
666 hf->AddFrame(saveASCIIevent,
new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));
668 toggleCorr =
new TGTextButton(hf,
"&Toggle Corrected Data");
669 toggleCorr->SetToolTipText(
"Press to toggle between data corrected by Lorentz Angle ", 400);
670 toggleCorr->Connect(
"Clicked()",
"AtEventManagerS800", fInstance,
"ToggleCorrData()");
671 hf->AddFrame(toggleCorr,
new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));
686 auto *hf_2 =
new TGHorizontalFrame(frmMain);
689 TString icondir(Form(
"%s/icons/", gSystem->Getenv(
"VMCWORKDIR")));
690 TGPictureButton *b =
nullptr;
692 b =
new TGPictureButton(hf_2, gClient->GetPicture(icondir +
"arrow_left.gif"));
694 b->Connect(
"Clicked()",
"AtEventManagerS800", fInstance,
"PrevEvent()");
696 b =
new TGPictureButton(hf_2, gClient->GetPicture(icondir +
"arrow_right.gif"));
698 b->Connect(
"Clicked()",
"AtEventManagerS800", fInstance,
"NextEvent()");
701 frmMain->AddFrame(hf);
702 frmMain->AddFrame(hf_2);
704 TString Infile =
"Input file : ";
706 TFile *file = FairRootManager::Instance()->GetInChain()->GetFile();
707 Infile += file->GetName();
708 auto *TFName =
new TGLabel(frmMain, Infile.Data());
709 frmMain->AddFrame(TFName);
711 UInt_t RunId = FairRunAna::Instance()->getRunId();
712 TString run =
"Run Id : ";
714 auto *TRunId =
new TGLabel(frmMain, run.Data());
715 frmMain->AddFrame(TRunId);
717 TString nevent =
"No of events : ";
719 auto *TEvent =
new TGLabel(frmMain, nevent.Data());
720 frmMain->AddFrame(TEvent);
722 auto *
f =
new TGHorizontalFrame(frmMain);
723 auto *l =
new TGLabel(
f,
"Current Event:");
724 f->AddFrame(l,
new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 1, 2, 1, 1));
726 fCurrentEvent =
new TGNumberEntry(
f, 0., 6, -1, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative,
727 TGNumberFormat::kNELLimitMinMax, 0,
Entries);
728 f->AddFrame(fCurrentEvent,
new TGLayoutHints(kLHintsLeft, 1, 1, 1, 1));
729 fCurrentEvent->Connect(
"ValueSet(Long_t)",
"AtEventManagerS800", fInstance,
"SelectEvent()");
730 frmMain->AddFrame(
f);
732 auto *fThres =
new TGHorizontalFrame(frmMain);
733 auto *lThres =
new TGLabel(fThres,
"3D threshold:");
734 fThres->AddFrame(lThres,
new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 1, 2, 1, 1));
735 f3DThresDisplay =
new TGNumberEntry(fThres, 0., 6, -1, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative,
736 TGNumberFormat::kNELLimitMinMax, 0,
Entries);
737 fThres->AddFrame(f3DThresDisplay,
new TGLayoutHints(kLHintsLeft, 1, 1, 1, 1));
738 f3DThresDisplay->Connect(
"ValueSet(Long_t)",
"AtEventManagerS800", fInstance,
"Select3DThres()");
739 frmMain->AddFrame(fThres);
741 frmMain->MapSubwindows();
743 frmMain->MapWindow();
745 browser->StopEmbedding();
746 browser->SetTabTitle(
"AtTPC Event Control", 0);
751 drawallpad->SetState(kButtonDown);
753 drawallpad->SetText(
"&Disable Draw All Pads");
756 drawallpad->SetText(
"&Enable Draw All Pads");
759 drawallpad->SetState(kButtonUp);
765 drawHoughSpace->SetState(kButtonDown);
767 drawHoughSpace->SetText(
"&Disable Vis. Recons.");
768 kDrawHoughOn = kTRUE;
770 drawHoughSpace->SetText(
"&Visualize Reconstruction");
771 kDrawHoughOn = kFALSE;
773 drawHoughSpace->SetState(kButtonUp);
795 k3DThreshold = f3DThresDisplay->GetIntNumber();
801 Int_t
event = fEntry;
802 TFile *file = FairRootManager::Instance()->GetInChain()->GetFile();
803 std::string file_name = file->GetName();
804 std::string cmd =
"mv event.dat event_" + std::to_string(event) +
".dat";
805 gSystem->Exec(cmd.c_str());
811 toggleCorr->SetState(kButtonDown);
813 toggleCorr->SetText(
"&Toggle Raw Data");
816 toggleCorr->SetText(
"&Toggle Corrected Data");
817 kToggleData = kFALSE;
819 toggleCorr->SetState(kButtonUp);