6 #include <FairRootManager.h>
7 #include <FairRunAna.h>
12 #include <TClonesArray.h>
13 #include <TEveBrowser.h>
14 #include <TEveEventManager.h>
15 #include <TEveGeoNode.h>
16 #include <TEveManager.h>
17 #include <TEveViewer.h>
18 #include <TEveWindow.h>
23 #include <TGLCamera.h>
24 #include <TGLViewer.h>
27 #include <TGNumberEntry.h>
30 #include <TGeoManager.h>
31 #include <TGeoVolume.h>
35 #include <TRootBrowser.h>
36 #include <TRootEmbeddedCanvas.h>
40 #include <TVirtualPad.h>
41 #include <TVirtualX.h>
46 constexpr
auto cRED =
"\033[1;31m";
49 constexpr
auto cGREEN =
"\033[1;32m";
50 constexpr
auto cBLUE =
"\033[1;34m";
69 : TEveEventManager(
"AtEventManager",
""), fRootManager(FairRootManager::Instance()), fRunAna(FairRunAna::Instance()),
70 fEntry(0), fEvent(nullptr), fCurrentEvent(nullptr), f3DThresDisplay(nullptr), fCvsPadPlane(nullptr),
71 fPadWave(nullptr), fPadAll(nullptr), fCvsQEvent(nullptr), fCvsHough(nullptr), fCvsRad(nullptr),
72 drawallpad(nullptr), eraseQevent(nullptr), drawReconstruction(nullptr), saveASCIIevent(nullptr),
73 toggleCorr(nullptr), kDrawAllOn(false), kEraseQ(false), kDrawReconstruction(false), kDraw3DGeo(false),
74 kDraw3DHist(false), kToggleData(false), k3DThreshold(0), fTofObjCorr(0), fMTDCObjRange(0), fMTDCXfRange(0),
75 cArray(nullptr), cS800Array(nullptr), cevent(nullptr), cS800Calc(nullptr), fCvsPIDFull(nullptr), fCvsPID(nullptr),
76 fCvsPID2(nullptr), fPIDFull(nullptr), fCvsPID2Full(nullptr), fPID2Full(nullptr), fEntries(0)
95 gStyle->SetOptTitle(0);
97 gStyle->SetPalette(55);
98 TEveManager::Create();
101 UInt_t width, height;
102 UInt_t widthMax = 1400, heightMax = 650;
104 gVirtualX->GetWindowSize(gClient->GetRoot()->GetId(), dummy, dummy, width, height);
117 TEveWindowSlot *slot =
nullptr;
118 TEveWindowPack *pack =
nullptr;
121 slot = TEveWindow::CreateWindowInTab(gEve->GetBrowser()->GetTabRight());
122 pack = slot->MakePack();
123 pack->SetElementName(
"AtTPC 3D/Pad plane views");
124 pack->SetHorizontal();
126 pack->SetShowTitleBar(kFALSE);
128 pack->NewSlot()->MakeCurrent();
130 TEveViewer *view3D = gEve->SpawnNewViewer(
"3D View",
"");
131 view3D->AddScene(gEve->GetGlobalScene());
132 view3D->AddScene(gEve->GetEventScene());
146 slot = pack->NewSlot();
147 TEveWindowPack *pack2 = slot->MakePack();
148 pack2->SetShowTitleBar(kFALSE);
149 pack2->SetVertical();
150 slot = pack2->NewSlot();
151 slot->StartEmbedding();
152 fPadWave =
new TCanvas(
"AtPad Canvas");
153 fPadWave->ToggleEditor();
154 slot->StopEmbedding();
164 slot = pack2->NewSlotWithWeight(1.5);
165 auto *ecvs =
new TRootEmbeddedCanvas();
166 TEveWindowFrame *frame = slot->MakeFrame(ecvs);
167 frame->SetElementName(
"AtTPC Pad Plane");
168 pack->GetEveFrame()->SetShowTitleBar(kFALSE);
169 fCvsPadPlane = ecvs->GetCanvas();
180 TEveWindowSlot *slot5 = TEveWindow::CreateWindowInTab(gEve->GetBrowser()->GetTabRight());
181 TEveWindowPack *pack6 = slot5->MakePack();
182 pack6->SetShowTitleBar(kFALSE);
183 pack6->SetElementName(
"3D Histogram View");
184 slot5 = pack6->NewSlotWithWeight(1.5);
185 auto *ecvs6 =
new TRootEmbeddedCanvas();
186 TEveWindowFrame *frame6 = slot5->MakeFrame(ecvs6);
187 frame6->SetElementName(
"3D Histogram View");
188 fCvs3DHist = ecvs6->GetCanvas();
191 TEveWindowSlot *slot2 = TEveWindow::CreateWindowInTab(gEve->GetBrowser()->GetTabRight());
192 TEveWindowPack *pack3 = slot2->MakePack();
193 pack3->SetShowTitleBar(kFALSE);
194 pack3->SetElementName(
"Pad plane raw signals");
196 slot2 = pack3->NewSlotWithWeight(1.5);
197 auto *ecvs3 =
new TRootEmbeddedCanvas();
198 TEveWindowFrame *frame3 = slot2->MakeFrame(ecvs3);
199 frame3->SetElementName(
"AtTPC Pad Plane All");
200 fPadAll = ecvs3->GetCanvas();
202 slot2 = pack3->NewSlotWithWeight(1.5);
203 auto *ecvs31 =
new TRootEmbeddedCanvas();
204 TEveWindowFrame *frame31 = slot2->MakeFrame(ecvs31);
205 frame31->SetElementName(
"AtTPC Mesh");
206 fCvsMesh = ecvs31->GetCanvas();
227 TEveWindowSlot *slot3 = TEveWindow::CreateWindowInTab(gEve->GetBrowser()->GetTabRight());
228 TEveWindowPack *pack4 = slot3->MakePack();
229 pack4->SetShowTitleBar(kFALSE);
230 pack4->SetHorizontal();
231 pack4->SetElementName(
"Reconstruction");
233 slot3 = pack4->NewSlotWithWeight(1.5);
234 auto *ecvs4 =
new TRootEmbeddedCanvas();
235 TEveWindowFrame *frame4 = slot3->MakeFrame(ecvs4);
236 frame4->SetElementName(
"Hough Space");
237 fCvsHough = ecvs4->GetCanvas();
239 slot3 = pack4->NewSlotWithWeight(1.5);
240 auto *ecvs4_add =
new TRootEmbeddedCanvas();
241 TEveWindowFrame *frame4_add = slot3->MakeFrame(ecvs4_add);
242 frame4_add->SetElementName(
"Radius of curvature");
243 fCvsRad = ecvs4_add->GetCanvas();
245 slot3 = pack4->NewSlotWithWeight(1.5);
246 auto *ecvs4_add2 =
new TRootEmbeddedCanvas();
247 TEveWindowFrame *frame4_add2 = slot3->MakeFrame(ecvs4_add2);
248 frame4_add2->SetElementName(
"Theta");
249 fCvsTheta = ecvs4_add2->GetCanvas();
251 slot3 = pack4->NewSlotWithWeight(1.5);
252 auto *ecvs4_add3 =
new TRootEmbeddedCanvas();
253 TEveWindowFrame *frame4_add3 = slot3->MakeFrame(ecvs4_add3);
254 frame4_add3->SetElementName(
"Theta X Phi");
255 fCvsThetaxPhi = ecvs4_add3->GetCanvas();
292 TEveWindowSlot *slot4 = TEveWindow::CreateWindowInTab(gEve->GetBrowser()->GetTabRight());
293 TEveWindowPack *pack5 = slot4->MakePack();
294 pack5->SetShowTitleBar(kFALSE);
295 pack5->SetElementName(
"Prototype Phi Recons.");
296 slot4 = pack5->NewSlotWithWeight(1.5);
297 auto *ecvs5 =
new TRootEmbeddedCanvas();
298 TEveWindowFrame *frame5 = slot4->MakeFrame(ecvs5);
299 frame5->SetElementName(
"Phi Reconstruction");
300 fCvsPhi = ecvs5->GetCanvas();
303 TEveWindowSlot *slotMC = TEveWindow::CreateWindowInTab(gEve->GetBrowser()->GetTabRight());
304 TEveWindowPack *packMC = slotMC->MakePack();
305 packMC->SetShowTitleBar(kFALSE);
306 packMC->SetHorizontal();
307 packMC->SetElementName(
"Monte Carlo");
309 slotMC = packMC->NewSlotWithWeight(1.5);
310 auto *ecvsMC_XY =
new TRootEmbeddedCanvas();
311 TEveWindowFrame *frameMC_XY = slotMC->MakeFrame(ecvsMC_XY);
312 frameMC_XY->SetElementName(
"XY Projection");
313 fCvsMC_XY = ecvsMC_XY->GetCanvas();
315 slotMC = packMC->NewSlotWithWeight(1.5);
316 auto *ecvsMC_Z =
new TRootEmbeddedCanvas();
317 TEveWindowFrame *frameMC_Z = slotMC->MakeFrame(ecvsMC_Z);
318 frameMC_Z->SetElementName(
"Time Projection");
319 fCvsMC_Z = ecvsMC_Z->GetCanvas();
321 TEveWindowSlot *slotAux = TEveWindow::CreateWindowInTab(gEve->GetBrowser()->GetTabRight());
322 TEveWindowPack *packAux = slotAux->MakePack();
323 packAux->SetShowTitleBar(kFALSE);
324 packAux->SetHorizontal();
325 packAux->SetElementName(
"Auxiliary GET Channels");
327 slotAux = packAux->NewSlotWithWeight(1.5);
328 auto *ecvsAux1 =
new TRootEmbeddedCanvas();
329 TEveWindowFrame *frameAux1 = slotAux->MakeFrame(ecvsAux1);
330 frameAux1->SetElementName(
"Auxiliary GET Channels");
331 fCvsAux = ecvsAux1->GetCanvas();
334 TEveWindowSlot *slotS800 = TEveWindow::CreateWindowInTab(gEve->GetBrowser()->GetTabRight());
335 TEveWindowPack *packPID = slotS800->MakePack();
336 packPID->SetShowTitleBar(kFALSE);
337 packPID->SetElementName(
"S800 PIDs");
338 packPID->SetHorizontal();
340 slotS800 = packPID->NewSlotWithWeight(1.5);
341 auto ecvsS800tof1 =
new TRootEmbeddedCanvas();
342 TEveWindowFrame *frameS800tof1 = slotS800->MakeFrame(ecvsS800tof1);
343 frameS800tof1->SetElementName(
"T[Xf_Obj]-TObj (gated)");
344 fCvsPID = ecvsS800tof1->GetCanvas();
346 slotS800 = packPID->NewSlotWithWeight(1.5);
347 auto ecvsS800tof2 =
new TRootEmbeddedCanvas();
348 TEveWindowFrame *frameS800tof2 = slotS800->MakeFrame(ecvsS800tof2);
349 frameS800tof2->SetElementName(
"T[Xf_Obj]-TObj (full)");
350 fCvsPIDFull = ecvsS800tof2->GetCanvas();
358 slotS800 = packPID->NewSlotWithWeight(1.5);
359 auto ecvsS800dE1 =
new TRootEmbeddedCanvas();
360 TEveWindowFrame *frameS800dE1 = slotS800->MakeFrame(ecvsS800dE1);
361 frameS800dE1->SetElementName(
"ICSumE-ToF (gated)");
362 fCvsPID2 = ecvsS800dE1->GetCanvas();
364 slotS800 = packPID->NewSlotWithWeight(1.5);
365 auto ecvsS800dE2 =
new TRootEmbeddedCanvas();
366 TEveWindowFrame *frameS800dE2 = slotS800->MakeFrame(ecvsS800dE2);
367 frameS800dE2->SetElementName(
"ICSumE-ToF (full)");
368 fCvsPID2Full = ecvsS800dE2->GetCanvas();
381 TGeoNode *geoNode = gGeoManager->GetTopNode();
382 auto *topNode =
new TEveGeoTopNode(gGeoManager, geoNode, option, level, nNodes);
383 gEve->AddGlobalElement(topNode);
385 Int_t transparency = 80;
389 gGeoManager->GetVolume(
"drift_volume")->SetTransparency(transparency);
403 gEve->FullRedraw3D(kTRUE);
404 fEvent = gEve->AddEvent(
this);
409 gEve->GetBrowser()->GetTabRight()->SetTab(1);
412 gEve->Redraw3D(kTRUE, kTRUE);
414 TGLViewer *dfViewer = gEve->GetDefaultGLViewer();
415 dfViewer->CurrentCamera().RotateRad(-.7, 0.5);
419 std::cout <<
"End of AtEventManager" << std::endl;
424 GotoEvent(fCurrentEvent->GetIntNumber());
432 std::cout <<
cWHITERED <<
" Event number : " << fEntry <<
cNORMAL << std::endl;
433 fRunAna->Run((Long64_t)event);
439 Bool_t gated = kFALSE;
440 while (gated == kFALSE) {
444 if (fEntry < 1 || fEntry > fEntries) {
446 std::cout <<
" No gated events found! " << std::endl;
449 fRootManager->ReadEvent(fEntry);
450 cArray =
dynamic_cast<TClonesArray *
>(fRootManager->GetObject(
"AtEventH"));
452 cevent =
dynamic_cast<AtEvent *
>(cArray->At(0));
456 std::cout <<
" Event number : " << fEntry << std::endl;
457 fRunAna->Run((Long64_t)fEntry);
463 Bool_t gated = kFALSE;
464 while (gated == kFALSE) {
468 if (fEntry < 1 || fEntry > fEntries) {
470 std::cout <<
" No gated events found! " << std::endl;
473 fRootManager->ReadEvent(fEntry);
474 cArray =
dynamic_cast<TClonesArray *
>(fRootManager->GetObject(
"AtEventH"));
476 cevent =
dynamic_cast<AtEvent *
>(cArray->At(0));
480 std::cout <<
" Event number : " << fEntry << std::endl;
481 fRunAna->Run((Long64_t)fEntry);
487 fPIDFull =
new TH2F(
"PIDFull",
"PIDFull", 200, -150, 50, 300, 150, 450);
491 fPIDFull->Draw(
"colz");
497 fPID2Full =
new TH2F(
"PID2Full",
"PID2Full", 200, -150, 50, 300, 150, 450);
501 fPID2Full->Draw(
"colz");
507 TChain *chain = FairRootManager::Instance()->GetInChain();
508 fEntries = chain->GetEntriesFast();
510 for (
int neve = 1; neve < fEntries; neve++) {
511 fRootManager->ReadEvent(neve);
512 cS800Calc =
dynamic_cast<S800Calc *
>(fRootManager->GetObject(
"s800cal"));
513 if (cS800Calc ==
nullptr)
541 int event = gPad->GetEvent();
544 TObject *select = gPad->GetSelected();
547 if (select->InheritsFrom(TH2::Class())) {
548 auto *h =
dynamic_cast<TH2Poly *
>(select);
549 gPad->GetCanvas()->FeedbackMode(kTRUE);
552 int pyold = gPad->GetUniqueID();
553 int px = gPad->GetEventX();
554 int py = gPad->GetEventY();
555 float uxmin = gPad->GetUxmin();
556 float uxmax = gPad->GetUxmax();
557 int pxmin = gPad->XtoAbsPixel(uxmin);
558 int pxmax = gPad->XtoAbsPixel(uxmax);
560 gVirtualX->DrawLine(pxmin, pyold, pxmax, pyold);
561 gVirtualX->DrawLine(pxmin, py, pxmax, py);
562 gPad->SetUniqueID(py);
563 Float_t upx = gPad->AbsPixeltoX(px);
564 Float_t upy = gPad->AbsPixeltoY(py);
565 Double_t x = gPad->PadtoX(upx);
566 Double_t
y = gPad->PadtoY(upy);
567 Int_t bin = h->FindBin(x,
y);
568 const char *bin_name = h->GetBinName(bin);
571 std::cout <<
" Bin number selected : " << bin <<
" Bin name :" << bin_name << std::endl;
588 fRunAna->Run((Long64_t)fEntry);
595 TChain *chain = FairRootManager::Instance()->GetInChain();
596 Int_t Entries = chain->GetEntriesFast();
598 TEveBrowser *browser = gEve->GetBrowser();
599 browser->StartEmbedding(TRootBrowser::kLeft);
601 auto *frmMain =
new TGMainFrame(gClient->GetRoot(), 1000, 600);
602 frmMain->SetWindowName(
"XX GUI");
603 frmMain->SetCleanup(kDeepCleanup);
605 auto *hf =
new TGVerticalFrame(frmMain);
614 drawallpad =
new TGTextButton(hf,
"&Enable Draw All Pads");
615 drawallpad->SetToolTipText(
616 "Press to Enable/Disble drawing of all pads signal\n (Display on AtTPC Pad Plane Raw Signals tab) ", 400);
617 drawallpad->Connect(
"Clicked()",
"AtEventManager", fInstance,
"ChangeDrawAllPads()");
618 hf->AddFrame(drawallpad,
new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));
620 eraseQevent =
new TGTextButton(hf,
"&Erase Q Event Pad");
621 eraseQevent->SetToolTipText(
"Press to erase Event Q histogram upon calling the next event", 400);
622 eraseQevent->Connect(
"Clicked()",
"AtEventManager", fInstance,
"EraseQEvent()");
623 hf->AddFrame(eraseQevent,
new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));
625 drawReconstruction =
new TGTextButton(hf,
"&Visualize Reconstruction");
626 drawReconstruction->SetToolTipText(
"Press to enable Reconstruction visualization", 400);
627 drawReconstruction->Connect(
"Clicked()",
"AtEventManager", fInstance,
"EnableDrawReconstruction()");
628 hf->AddFrame(drawReconstruction,
new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));
630 saveASCIIevent =
new TGTextButton(hf,
"&Save event as text file");
631 saveASCIIevent->SetToolTipText(
"Dump the waveform of each hit into a text file", 400);
632 saveASCIIevent->Connect(
"Clicked()",
"AtEventManager", fInstance,
"SaveASCIIEvent()");
633 hf->AddFrame(saveASCIIevent,
new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));
635 toggleCorr =
new TGTextButton(hf,
"&Toggle Corrected Data");
636 toggleCorr->SetToolTipText(
"Press to toggle between data corrected by Lorentz Angle ", 400);
637 toggleCorr->Connect(
"Clicked()",
"AtEventManager", fInstance,
"ToggleCorrData()");
638 hf->AddFrame(toggleCorr,
new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));
653 auto *hf_2 =
new TGHorizontalFrame(frmMain);
656 TString icondir(Form(
"%s/icons/", gSystem->Getenv(
"VMCWORKDIR")));
657 TGPictureButton *b =
nullptr;
659 b =
new TGPictureButton(hf_2, gClient->GetPicture(icondir +
"arrow_left.gif"));
661 b->Connect(
"Clicked()",
"AtEventManager", fInstance,
"PrevEvent()");
663 b =
new TGPictureButton(hf_2, gClient->GetPicture(icondir +
"arrow_right.gif"));
665 b->Connect(
"Clicked()",
"AtEventManager", fInstance,
"NextEvent()");
668 frmMain->AddFrame(hf);
669 frmMain->AddFrame(hf_2);
671 TString Infile =
"Input file : ";
673 TFile *file = FairRootManager::Instance()->GetInChain()->GetFile();
674 Infile += file->GetName();
675 auto *TFName =
new TGLabel(frmMain, Infile.Data());
676 frmMain->AddFrame(TFName);
678 UInt_t RunId = FairRunAna::Instance()->getRunId();
679 TString run =
"Run Id : ";
681 auto *TRunId =
new TGLabel(frmMain, run.Data());
682 frmMain->AddFrame(TRunId);
684 TString nevent =
"No of events : ";
686 auto *TEvent =
new TGLabel(frmMain, nevent.Data());
687 frmMain->AddFrame(TEvent);
689 auto *
f =
new TGHorizontalFrame(frmMain);
690 auto *l =
new TGLabel(
f,
"Current Event:");
691 f->AddFrame(l,
new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 1, 2, 1, 1));
693 fCurrentEvent =
new TGNumberEntry(
f, 0., 6, -1, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative,
694 TGNumberFormat::kNELLimitMinMax, 0, Entries);
695 f->AddFrame(fCurrentEvent,
new TGLayoutHints(kLHintsLeft, 1, 1, 1, 1));
696 fCurrentEvent->Connect(
"ValueSet(Long_t)",
"AtEventManager", fInstance,
"SelectEvent()");
697 frmMain->AddFrame(
f);
699 auto *fThres =
new TGHorizontalFrame(frmMain);
700 auto *lThres =
new TGLabel(fThres,
"3D threshold:");
701 fThres->AddFrame(lThres,
new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 1, 2, 1, 1));
702 f3DThresDisplay =
new TGNumberEntry(fThres, 0., 6, -1, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative,
703 TGNumberFormat::kNELLimitMinMax, 0, Entries);
704 fThres->AddFrame(f3DThresDisplay,
new TGLayoutHints(kLHintsLeft, 1, 1, 1, 1));
705 f3DThresDisplay->Connect(
"ValueSet(Long_t)",
"AtEventManager", fInstance,
"Select3DThres()");
706 frmMain->AddFrame(fThres);
708 frmMain->MapSubwindows();
710 frmMain->MapWindow();
712 browser->StopEmbedding();
713 browser->SetTabTitle(
"AtTPC Event Control", 0);
718 drawallpad->SetState(kButtonDown);
720 drawallpad->SetText(
"&Disable Draw All Pads");
723 drawallpad->SetText(
"&Enable Draw All Pads");
726 drawallpad->SetState(kButtonUp);
732 drawReconstruction->SetState(kButtonDown);
733 if (!kDrawReconstruction) {
734 drawReconstruction->SetText(
"&Disable Vis. Recons.");
735 kDrawReconstruction = kTRUE;
737 drawReconstruction->SetText(
"&Visualize Reconstruction");
738 kDrawReconstruction = kFALSE;
740 drawReconstruction->SetState(kButtonUp);
762 k3DThreshold = f3DThresDisplay->GetIntNumber();
768 Int_t
event = fEntry;
769 TFile *file = FairRootManager::Instance()->GetInChain()->GetFile();
770 std::string file_name = file->GetName();
771 std::string cmd =
"mv event.dat event_" + std::to_string(event) +
".dat";
772 gSystem->Exec(cmd.c_str());
778 toggleCorr->SetState(kButtonDown);
780 toggleCorr->SetText(
"&Toggle Raw Data");
783 toggleCorr->SetText(
"&Toggle Corrected Data");
784 kToggleData = kFALSE;
786 toggleCorr->SetState(kButtonUp);