ATTPCROOT  0.3.0-alpha
A ROOT-based framework for analyzing data from active target detectors
AtEventManagerProto.cxx
Go to the documentation of this file.
1 #include "AtEventManagerProto.h"
2 
3 #include <FairRootManager.h>
4 #include <FairRunAna.h>
5 
6 #include <Rtypes.h>
7 #include <TCanvas.h>
8 #include <TChain.h>
9 #include <TEveBrowser.h>
10 #include <TEveEventManager.h>
11 #include <TEveGeoNode.h>
12 #include <TEveManager.h>
13 #include <TEveViewer.h>
14 #include <TEveWindow.h>
15 #include <TFile.h>
16 #include <TGButton.h>
17 #include <TGClient.h>
18 #include <TGFrame.h>
19 #include <TGLCamera.h>
20 #include <TGLViewer.h>
21 #include <TGLabel.h>
22 #include <TGLayout.h>
23 #include <TGNumberEntry.h>
24 #include <TGTab.h>
25 #include <TGWindow.h>
26 #include <TGeoManager.h>
27 #include <TGeoVolume.h>
28 #include <TH2.h>
29 #include <TH2Poly.h>
30 #include <TObject.h>
31 #include <TRootBrowser.h>
32 #include <TRootEmbeddedCanvas.h>
33 #include <TString.h>
34 #include <TStyle.h>
35 #include <TSystem.h>
36 #include <TVirtualPad.h>
37 #include <TVirtualX.h>
38 
39 #include <iostream>
40 #include <string>
41 
42 class TGeoNode;
43 
44 using namespace std;
45 
47 
48 AtEventManagerProto *AtEventManagerProto::fInstance = nullptr;
50 {
51  return fInstance;
52 }
53 
55  : TEveEventManager("AtEventManagerProto", ""), fRootManager(FairRootManager::Instance()),
56  fRunAna(FairRunAna::Instance()), fEntry(0), fEvent(nullptr), kDrawPROn(false), drawPatternRecognition(nullptr),
57  saveASCIIevent(nullptr), fCurrentEvent(nullptr)
58 
59 {
60  fInstance = this;
61 }
62 
64 
65 void AtEventManagerProto::Init(Int_t option, Int_t level, Int_t nNodes)
66 {
67 
68  gStyle->SetOptTitle(0);
69  gStyle->SetPalette(55);
70  TEveManager::Create();
71 
72  Int_t dummy;
73  UInt_t width, height;
74  UInt_t widthMax = 1400, heightMax = 650;
75  // Double_t ratio = (Double_t)widthMax / heightMax;
76  gVirtualX->GetWindowSize(gClient->GetRoot()->GetId(), dummy, dummy, width, height);
77  // Assume that width of screen is always larger than the height of screen
78  /*
79  if (width > widthMax) {
80  width = widthMax;
81  height = heightMax;
82  } else
83  height = (Int_t)(width / ratio);
84  */
85  // gEve->GetMainWindow()->Resize(width,height);
86 
87  TEveWindowSlot *slot = nullptr;
88  TEveWindowPack *pack = nullptr;
89 
90  // 3D
91  slot = TEveWindow::CreateWindowInTab(gEve->GetBrowser()->GetTabRight());
92  pack = slot->MakePack();
93  pack->SetElementName("AtTPC 3D/Pad plane views");
94  pack->SetHorizontal();
95  // pack->SetVertical();
96  pack->SetShowTitleBar(kFALSE);
97 
98  pack->NewSlot()->MakeCurrent();
99  // if(kDraw3DGeo){
100  TEveViewer *view3D = gEve->SpawnNewViewer("3D View", "");
101  view3D->AddScene(gEve->GetGlobalScene());
102  view3D->AddScene(gEve->GetEventScene());
103  // }
104 
105  slot = pack->NewSlot();
106  TEveWindowPack *pack2 = slot->MakePack();
107  pack2->SetShowTitleBar(kFALSE);
108  pack2->SetVertical();
109  slot = pack2->NewSlot();
110  slot->StartEmbedding();
111  fPadWave = new TCanvas("AtPad Canvas");
112  fPadWave->ToggleEditor();
113  slot->StopEmbedding();
114 
115  // Pad Plane
116  slot = pack2->NewSlotWithWeight(1.5);
117  auto *ecvs = new TRootEmbeddedCanvas();
118  TEveWindowFrame *frame = slot->MakeFrame(ecvs);
119  frame->SetElementName("AtTPC Pad Plane");
120  pack->GetEveFrame()->SetShowTitleBar(kFALSE);
121  fCvsPadPlane = ecvs->GetCanvas();
122 
123  // Raw signals
124  TEveWindowSlot *slot2 = TEveWindow::CreateWindowInTab(gEve->GetBrowser()->GetTabRight());
125  TEveWindowPack *pack3 = slot2->MakePack();
126  pack3->SetShowTitleBar(kFALSE);
127  pack3->SetElementName("Pad plane raw signals");
128 
129  slot2 = pack3->NewSlotWithWeight(1.5);
130  auto *ecvs3 = new TRootEmbeddedCanvas();
131  TEveWindowFrame *frame3 = slot2->MakeFrame(ecvs3);
132  frame3->SetElementName("AtTPC Pad Plane All");
133  fPadAll = ecvs3->GetCanvas();
134 
135  slot2 = pack3->NewSlotWithWeight(1.5);
136  auto *ecvs31 = new TRootEmbeddedCanvas();
137  TEveWindowFrame *frame31 = slot2->MakeFrame(ecvs31);
138  frame31->SetElementName("AtTPC Mesh");
139  fCvsMesh = ecvs31->GetCanvas();
140 
141  // Quadrants Radius vs Time
142 
143  TEveWindowSlot *slotH = TEveWindow::CreateWindowInTab(gEve->GetBrowser()->GetTabRight());
144  TEveWindowPack *packH = slotH->MakePack();
145  packH->SetShowTitleBar(kFALSE);
146  packH->SetHorizontal();
147  packH->SetElementName("Radius - Z ");
148 
149  slotH = packH->NewSlotWithWeight(1.5);
150  auto *ecvsH1 = new TRootEmbeddedCanvas();
151  TEveWindowFrame *frameH1 = slotH->MakeFrame(ecvsH1);
152  frameH1->SetElementName("Quadrant 1");
153  fCvsQuadrant1 = ecvsH1->GetCanvas();
154 
155  slotH = packH->NewSlotWithWeight(1.5);
156  auto *ecvsH2 = new TRootEmbeddedCanvas();
157  TEveWindowFrame *frameH2 = slotH->MakeFrame(ecvsH2);
158  frameH2->SetElementName("Quadrant 2");
159  fCvsQuadrant2 = ecvsH2->GetCanvas();
160 
161  slotH = packH->NewSlotWithWeight(1.5);
162  auto *ecvsH3 = new TRootEmbeddedCanvas();
163  TEveWindowFrame *frameH3 = slotH->MakeFrame(ecvsH3);
164  frameH3->SetElementName("Quadrant 3");
165  fCvsQuadrant3 = ecvsH3->GetCanvas();
166 
167  slotH = packH->NewSlotWithWeight(1.5);
168  auto *ecvsH4 = new TRootEmbeddedCanvas();
169  TEveWindowFrame *frameH4 = slotH->MakeFrame(ecvsH4);
170  frameH4->SetElementName("Quadrant 4");
171  fCvsQuadrant4 = ecvsH4->GetCanvas();
172 
173  // Quadrants Radius vs Energy Loss
174 
175  TEveWindowSlot *slotHEL = TEveWindow::CreateWindowInTab(gEve->GetBrowser()->GetTabRight());
176  TEveWindowPack *packHEL = slotHEL->MakePack();
177  packHEL->SetShowTitleBar(kFALSE);
178  packHEL->SetHorizontal();
179  packHEL->SetElementName("Radius - Energy Loss ");
180 
181  slotHEL = packHEL->NewSlotWithWeight(1.5);
182  auto *ecvsHEL1 = new TRootEmbeddedCanvas();
183  TEveWindowFrame *frameHEL1 = slotHEL->MakeFrame(ecvsHEL1);
184  frameHEL1->SetElementName("Quadrant Energy Loss 1");
185  fCvsELQuadrant1 = ecvsHEL1->GetCanvas();
186 
187  slotHEL = packHEL->NewSlotWithWeight(1.5);
188  auto *ecvsHEL2 = new TRootEmbeddedCanvas();
189  TEveWindowFrame *frameHEL2 = slotHEL->MakeFrame(ecvsHEL2);
190  frameHEL2->SetElementName("Quadrant Energy Loss 2");
191  fCvsELQuadrant2 = ecvsHEL2->GetCanvas();
192 
193  slotHEL = packHEL->NewSlotWithWeight(1.5);
194  auto *ecvsHEL3 = new TRootEmbeddedCanvas();
195  TEveWindowFrame *frameHEL3 = slotHEL->MakeFrame(ecvsHEL3);
196  frameHEL3->SetElementName("Quadrant Energy Loss 3");
197  fCvsELQuadrant3 = ecvsHEL3->GetCanvas();
198 
199  slotHEL = packHEL->NewSlotWithWeight(1.5);
200  auto *ecvsHEL4 = new TRootEmbeddedCanvas();
201  TEveWindowFrame *frameHEL4 = slotHEL->MakeFrame(ecvsHEL4);
202  frameHEL4->SetElementName("Quadrant Energy Loss 4");
203  fCvsELQuadrant4 = ecvsHEL4->GetCanvas();
204 
205  // Vertex and kinematics
206  TEveWindowSlot *slotHK = TEveWindow::CreateWindowInTab(gEve->GetBrowser()->GetTabRight());
207  TEveWindowPack *packHK = slotHK->MakePack();
208  packHK->SetShowTitleBar(kFALSE);
209  packHK->SetHorizontal();
210  packHK->SetElementName("Vertex - Kinematics ");
211 
212  slotHK = packHK->NewSlotWithWeight(1.5);
213  auto *ecvsHK1 = new TRootEmbeddedCanvas();
214  TEveWindowFrame *frameHK1 = slotHK->MakeFrame(ecvsHK1);
215  frameHK1->SetElementName("Vertex Position");
216  fCvsVertex = ecvsHK1->GetCanvas();
217 
218  slotHK = packHK->NewSlotWithWeight(1.5);
219  auto *ecvsHK2 = new TRootEmbeddedCanvas();
220  TEveWindowFrame *frameHK2 = slotHK->MakeFrame(ecvsHK2);
221  frameHK2->SetElementName("Angle-Angle Kinematics");
222  fCvsKineAA = ecvsHK2->GetCanvas();
223 
224  TEveWindowSlot *slotAux = TEveWindow::CreateWindowInTab(gEve->GetBrowser()->GetTabRight());
225  TEveWindowPack *packAux = slotAux->MakePack();
226  packAux->SetShowTitleBar(kFALSE);
227  packAux->SetHorizontal();
228  packAux->SetElementName("Auxiliary GET Channels");
229 
230  slotAux = packAux->NewSlotWithWeight(1.5);
231  auto *ecvsAux1 = new TRootEmbeddedCanvas();
232  TEveWindowFrame *frameAux1 = slotAux->MakeFrame(ecvsAux1);
233  frameAux1->SetElementName("Auxiliary GET Channels");
234  fCvsAux = ecvsAux1->GetCanvas();
235 
236  fRunAna->Init();
237 
238  if (gGeoManager) {
239  TGeoNode *geoNode = gGeoManager->GetTopNode();
240  auto *topNode = new TEveGeoTopNode(gGeoManager, geoNode, option, level, nNodes);
241  gEve->AddGlobalElement(topNode);
242 
243  Int_t transparency = 80;
244 
245  // gGeoManager -> DefaultColors();
246  // gGeoManager -> GetVolume("field_cage_in") -> SetVisibility(kFALSE); //active
247  gGeoManager->GetVolume("drift_volume")->SetTransparency(transparency);
248  // gGeoManager -> GetVolume("cageSide") -> SetTransparency(transparency);
249  // gGeoManager -> GetVolume("cageCorner") -> SetTransparency(transparency);
250  // gGeoManager -> GetVolume("frontWindow") -> SetTransparency(transparency);
251  // gGeoManager -> GetVolume("frontWindowFrame") -> SetTransparency(transparency);
252  // gGeoManager -> GetVolume("frontWindowCradle") -> SetTransparency(transparency);
253  // gGeoManager -> GetVolume("bottomPlate") -> SetTransparency(transparency);
254  // gGeoManager -> GetVolume("backWindowFrame") -> SetTransparency(transparency);
256  // gGeoManager -> GetVolume("topFrame") -> SetTransparency(transparency);
257  // gGeoManager -> GetVolume("ribmain") -> SetTransparency(transparency);
258  // gGeoManager -> GetVolume("wirePlane") -> SetTransparency(transparency);
259  // gGeoManager -> GetVolume("padPlane") -> SetTransparency(transparency);
260 
261  gEve->FullRedraw3D(kTRUE);
262  fEvent = gEve->AddEvent(this);
263  }
264 
265  /**************************************************************************/
266 
267  gEve->GetBrowser()->GetTabRight()->SetTab(1);
268  make_gui();
269 
270  gEve->Redraw3D(kTRUE, kTRUE);
271 
272  TGLViewer *dfViewer = gEve->GetDefaultGLViewer(); // Is this doing anything?
273  dfViewer->CurrentCamera().RotateRad(-.7, 0.5);
274  dfViewer->DoDraw();
275 }
276 
278 {
279  GotoEvent(fCurrentEvent->GetIntNumber());
280 }
281 
283 {
284 
285  fEntry = event;
286  std::cout << " Event number : " << fEntry << std::endl;
287  fRunAna->Run((Long64_t)event);
288 }
289 
291 {
292  fEntry += 1;
293  std::cout << " Event number : " << fEntry << std::endl;
294  fRunAna->Run((Long64_t)fEntry);
295 }
296 
298 {
299  fEntry -= 1;
300  std::cout << " Event number : " << fEntry << std::endl;
301  fRunAna->Run((Long64_t)fEntry);
302 }
303 
305 {
306  int event = gPad->GetEvent();
307  if (event != 11)
308  return; // may be comment this line
309  TObject *select = gPad->GetSelected();
310  if (!select)
311  return;
312  if (select->InheritsFrom(TH2::Class())) {
313  auto *h = dynamic_cast<TH2Poly *>(select);
314  gPad->GetCanvas()->FeedbackMode(kTRUE);
315  // Char_t *bin_name = h->GetBinName();
316 
317  int pyold = gPad->GetUniqueID();
318  int px = gPad->GetEventX();
319  int py = gPad->GetEventY();
320  float uxmin = gPad->GetUxmin();
321  float uxmax = gPad->GetUxmax();
322  int pxmin = gPad->XtoAbsPixel(uxmin);
323  int pxmax = gPad->XtoAbsPixel(uxmax);
324  if (pyold)
325  gVirtualX->DrawLine(pxmin, pyold, pxmax, pyold);
326  gVirtualX->DrawLine(pxmin, py, pxmax, py);
327  gPad->SetUniqueID(py);
328  Float_t upx = gPad->AbsPixeltoX(px);
329  Float_t upy = gPad->AbsPixeltoY(py);
330  Double_t x = gPad->PadtoX(upx);
331  Double_t y = gPad->PadtoY(upy);
332  Int_t bin = h->FindBin(x, y);
333  const char *bin_name = h->GetBinName(bin);
334  // std::cout<<" X : "<<x<<" Y: "<<y<<std::endl;
335  // std::cout<<bin_name<<std::endl;
336  std::cout << " Bin number selected : " << bin << " Bin name :" << bin_name << std::endl;
337  }
338 }
339 
341 {
342  fRunAna->Run((Long64_t)fEntry);
343 }
344 
346 {
347  // Create minimal GUI for event navigation.
348 
349  TChain *chain = FairRootManager::Instance()->GetInChain();
350  Int_t Entries = chain->GetEntriesFast();
351 
352  TEveBrowser *browser = gEve->GetBrowser();
353  browser->StartEmbedding(TRootBrowser::kLeft);
354 
355  auto *frmMain = new TGMainFrame(gClient->GetRoot(), 1000, 600);
356  frmMain->SetWindowName("XX GUI");
357  frmMain->SetCleanup(kDeepCleanup);
358 
359  auto *hf = new TGVerticalFrame(frmMain);
360  {
361 
362  // drawallpad = new TGTextButton(hf, "&Enable Draw All Pads");
363  // drawallpad -> SetToolTipText("Press to Enable/Disble drawing of all pads signal\n (Display on AtTPC Pad Plane
364  // Raw Signals tab) ",400); drawallpad->Connect("Clicked()", "AtEventManager", fInstance, "ChangeDrawAllPads()");
365  // hf->AddFrame(drawallpad, new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));
366 
367  // eraseQevent = new TGTextButton(hf, "&Erase Q Event Pad");
368  // eraseQevent -> SetToolTipText("Press to erase Event Q histogram upon calling the next event",400);
369  // eraseQevent->Connect("Clicked()", "AtEventManager", fInstance, "EraseQEvent()");
370  // hf->AddFrame(eraseQevent, new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));
371 
372  drawPatternRecognition = new TGTextButton(hf, "&Enable Pattern Recognition visualization");
373  drawPatternRecognition->SetToolTipText("Press to enable Pattern Recognition visualization", 400);
374  drawPatternRecognition->Connect("Clicked()", "AtEventManagerProto", fInstance, "EnableDrawPatternRecognition()");
375  hf->AddFrame(drawPatternRecognition, new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));
376 
377  saveASCIIevent = new TGTextButton(hf, "&Save event as text file");
378  saveASCIIevent->SetToolTipText("Dump the waveform of each hit into a text file", 400);
379  saveASCIIevent->Connect("Clicked()", "AtEventManagerProto", fInstance, "SaveASCIIEvent()");
380  hf->AddFrame(saveASCIIevent, new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));
381 
382  // toggleCorr = new TGTextButton(hf, "&Toggle Corrected Data");
383  // toggleCorr -> SetToolTipText("Press to toggle between data corrected by Lorentz Angle ",400);
384  // toggleCorr->Connect("Clicked()", "AtEventManager", fInstance, "ToggleCorrData()");
385  // hf->AddFrame(toggleCorr, new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));
386  }
387 
388  /* TGHorizontalFrame* hf_2 = new TGHorizontalFrame(frmMain);
389  {
390 
391  TString icondir( Form("%s/icons/", gSystem->Getenv("VMCWORKDIR")) );
392  TGPictureButton* b = 0;
393 
394  b = new TGPictureButton(hf_2, gClient->GetPicture(icondir+"arrow_left.gif"));
395  hf_2->AddFrame(b);
396  b->Connect("Clicked()", "AtEventManager", fInstance, "PrevEvent()");
397 
398  b = new TGPictureButton(hf_2, gClient->GetPicture(icondir+"arrow_right.gif"));
399  hf_2->AddFrame(b);
400  b->Connect("Clicked()", "AtEventManager", fInstance, "NextEvent()");
401 
402  }*/
403 
404  frmMain->AddFrame(hf);
405  // frmMain->AddFrame(hf_2);
406 
407  TString Infile = "Input file : ";
408  // TFile* file =FairRunAna::Instance()->GetInputFile();
409  TFile *file = FairRootManager::Instance()->GetInChain()->GetFile();
410  Infile += file->GetName();
411  auto *TFName = new TGLabel(frmMain, Infile.Data());
412  frmMain->AddFrame(TFName);
413 
414  UInt_t RunId = FairRunAna::Instance()->getRunId();
415  TString run = "Run Id : ";
416  run += RunId;
417  auto *TRunId = new TGLabel(frmMain, run.Data());
418  frmMain->AddFrame(TRunId);
419 
420  TString nevent = "No of events : ";
421  nevent += Entries;
422  auto *TEvent = new TGLabel(frmMain, nevent.Data());
423  frmMain->AddFrame(TEvent);
424 
425  auto *f = new TGHorizontalFrame(frmMain);
426  auto *l = new TGLabel(f, "Current Event:");
427  f->AddFrame(l, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 1, 2, 1, 1));
428 
429  fCurrentEvent = new TGNumberEntry(f, 0., 6, -1, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative,
430  TGNumberFormat::kNELLimitMinMax, 0, Entries);
431  f->AddFrame(fCurrentEvent, new TGLayoutHints(kLHintsLeft, 1, 1, 1, 1));
432  fCurrentEvent->Connect("ValueSet(Long_t)", "AtEventManager", fInstance, "SelectEvent()");
433  frmMain->AddFrame(f);
434 
435  /*TGHorizontalFrame* fThres = new TGHorizontalFrame(frmMain);
436  TGLabel* lThres = new TGLabel(fThres, "3D threshold:");
437  fThres->AddFrame(lThres, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 1, 2, 1, 1));
438  f3DThresDisplay = new TGNumberEntry(fThres, 0., 6, -1,
439  TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative,
440  TGNumberFormat::kNELLimitMinMax, 0, Entries);
441  fThres->AddFrame(f3DThresDisplay, new TGLayoutHints(kLHintsLeft, 1, 1, 1, 1));
442  f3DThresDisplay->Connect("ValueSet(Long_t)","AtEventManager",fInstance, "Select3DThres()");
443  frmMain->AddFrame(fThres);*/
444 
445  frmMain->MapSubwindows();
446  frmMain->Resize();
447  frmMain->MapWindow();
448 
449  browser->StopEmbedding();
450  browser->SetTabTitle("AtTPC Event Control", 0);
451 }
452 
454 {
455 
456  drawPatternRecognition->SetState(kButtonDown);
457  if (!kDrawPROn) {
458  drawPatternRecognition->SetText("&Disable Vis. Recons.");
459  kDrawPROn = kTRUE;
460  } else {
461  drawPatternRecognition->SetText("&Visualize Reconstruction");
462  kDrawPROn = kFALSE;
463  }
464  drawPatternRecognition->SetState(kButtonUp);
465 }
466 
468 {
469 
470  Int_t event = fEntry;
471  TFile *file = FairRootManager::Instance()->GetInChain()->GetFile();
472  std::string file_name = file->GetName();
473  std::string cmd = "mv event.dat event_" + std::to_string(event) + ".dat";
474  gSystem->Exec(cmd.c_str());
475 }
AtEventManagerProto::DrawWave
static void DrawWave()
Definition: AtEventManagerProto.cxx:304
AtEventManagerProto::NextEvent
virtual void NextEvent()
MENU
Definition: AtEventManagerProto.cxx:290
AtEventManagerProto::Instance
static AtEventManagerProto * Instance()
Definition: AtEventManagerProto.cxx:49
AtEventManagerProto::RunEvent
void RunEvent()
Definition: AtEventManagerProto.cxx:340
f
double(* f)(double t, const double *par)
Definition: lmcurve.cxx:21
AtEventManagerProto.h
ClassImp
ClassImp(AtEventManagerProto)
AtEventManagerProto::AtEventManagerProto
AtEventManagerProto()
Definition: AtEventManagerProto.cxx:54
AtEventManagerProto::~AtEventManagerProto
virtual ~AtEventManagerProto()
AtEventManagerProto::SaveASCIIEvent
void SaveASCIIEvent()
Definition: AtEventManagerProto.cxx:467
AtEventManagerProto::SelectEvent
virtual void SelectEvent()
Definition: AtEventManagerProto.cxx:277
y
const double * y
Definition: lmcurve.cxx:20
AtEventManagerProto
Definition: AtEventManagerProto.h:19
AtEventManagerProto::EnableDrawPatternRecognition
void EnableDrawPatternRecognition()
Definition: AtEventManagerProto.cxx:453
AtEventManagerProto::PrevEvent
virtual void PrevEvent()
MENU
Definition: AtEventManagerProto.cxx:297
AtEventManagerProto::Init
virtual void Init(Int_t option=1, Int_t level=3, Int_t nNodes=10000)
Definition: AtEventManagerProto.cxx:65
AtEventManagerProto::make_gui
virtual void make_gui()
Definition: AtEventManagerProto.cxx:345
AtEventManagerProto::GotoEvent
virtual void GotoEvent(Int_t event)
MENU
Definition: AtEventManagerProto.cxx:282