BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
MpdEventManagerEditor.cxx
Go to the documentation of this file.
1// MpdEventManagerEditor
2//
3// Specialization of TGedEditor for proper update propagation to TEveManager
4
6
7#include "FairRootManager.h"
8#include "FairRunAna.h"
9#include "TChain.h"
10#include "TDatabasePDG.h"
11#include "TEveBrowser.h"
12#include "TEveElement.h"
13#include "TEveGedEditor.h"
14#include "TEveManager.h"
15#include "TFile.h"
16#include "TGFileDialog.h"
17#include "TGLayout.h"
18#include "TGWindow.h"
19#include "TGeoManager.h"
20#include "TString.h"
21#include "TThread.h"
22#include "TVirtualX.h"
23
24#include <TGLScenePad.h>
25#include <TGLViewer.h>
26#include <iostream>
27#include <regex>
28#include <vector>
29
30using namespace std;
31
32//______________________________________________________________________________
33MpdEventManagerEditor::MpdEventManagerEditor(const TGWindow* p, Int_t width, Int_t height, UInt_t options, Pixel_t back)
34 : TGedFrame(p, width, height, options | kVerticalFrame, back)
35 , iThreadState(0)
36 , iEventCount(-1)
37 , isStreamSource(false)
38 , fSave(nullptr)
39 , fUpdate(nullptr)
40 , fCurrentEvent(nullptr)
41 , fGeometry(nullptr)
42 , fShowMCPoints(nullptr)
43 , fShowMCTracks(nullptr)
44 , fShowRecoPoints(nullptr)
45 , fShowRecoTracks(nullptr)
46 ,
47
48 fObject(nullptr)
49 , fEventManager(MpdEventManager::Instance())
50 , fEventTime(nullptr)
51 , fCurrentPDGTextEntry(nullptr)
53 , fVizPri(nullptr)
54 , sliderMinEnergy(nullptr)
55 , sliderMaxEnergy(nullptr)
56 , fGeometryFrame(nullptr)
57 , ShowMagnetButton(nullptr)
58 , isMagnetFound(false)
59{
60 fEventManager->SetEventEditor(this);
61 Init();
62}
63
65{
66 FairRootManager* fRootManager = FairRootManager::Instance();
67 TChain* chain = fRootManager->GetInChain();
68
69 // create tab for event visualization
70 MakeTitle("EventManager Editor");
71 TGVerticalFrame* fInfoFrame = CreateEditorTabSubFrame("Event Info");
72 TGCompositeFrame* title1 =
74
75 // display file name (or stream name if no input file)
76 TString InSource = "File: ";
77 TFile* pChainFile = chain->GetFile();
78 if (pChainFile == NULL) {
79 InSource = "Data Stream";
80 isStreamSource = true;
81 } else
82 InSource += pChainFile->GetName();
83 TGLabel* TFName = new TGLabel(title1, InSource.Data());
84 title1->AddFrame(TFName);
85
86 // textbox for Run ID and time cutting
87 TGHorizontalFrame* f2 = new TGHorizontalFrame(title1);
88 // Run Id
89 UInt_t RunId = FairRunAna::Instance()->getRunId();
90 TString run = TString::Format("Run Id: %d. ", RunId);
91 TGLabel* TRunId = new TGLabel(f2, run.Data());
92 // time cutting
93 TGLabel* EventTimeLabel = new TGLabel(f2, " Event Time: ");
94 fEventTime = new TGLabel(f2, "");
95 f2->AddFrame(TRunId);
96 f2->AddFrame(EventTimeLabel);
98 title1->AddFrame(f2);
99 // display event time
100 TString time = TString::Format("%.2f ns", FairRootManager::Instance()->GetEventTime());
101 fEventTime->SetText(time.Data());
102
103 // display event count and count of geometry nodes
104 iEventCount = chain->GetEntriesFast();
105 Int_t nodes = gGeoManager->GetNNodes();
106 TString nevent = TString::Format("No of events: %d. No. of nodes: %d", iEventCount, nodes);
107 TGLabel* TEvent = new TGLabel(title1, nevent.Data());
108 title1->AddFrame(TEvent);
109
110 // setting textbox for event number
111 TGHorizontalFrame* f = new TGHorizontalFrame(title1);
112 TGLabel* l = new TGLabel(f, "Current Event:");
113 f->AddFrame(l, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 1, 2, 1, 1));
116 f->AddFrame(fCurrentEvent, new TGLayoutHints(kLHintsLeft, 1, 1, 1, 1));
117 fCurrentEvent->Connect("ValueSet(Long_t)", "MpdEventManagerEditor", this, "SelectEvent()");
118 // if event count is 0 then deactivate the field for event number
119 if (iEventCount < 1)
120 fCurrentEvent->SetState(kFALSE);
121
122 // button for saving the current image (EVE screenshot)
123 fSave = new TGPictureButton(f, gClient->GetPicture("save.xpm"), 5);
124 f->AddFrame(fSave, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 1, 2, 1, 1));
125 fSave->Connect("Clicked()", "MpdEventManagerEditor", this, "SaveImage()");
126 title1->AddFrame(f);
127
128 // checkbox to display only primary particles in event
129 fVizPri = new TGCheckButton(title1, "Primary Only");
130 AddFrame(fVizPri, new TGLayoutHints(kLHintsTop, 3, 1, 1, 0));
131 fVizPri->Connect("Toggled(Bool_t)", "MpdEventManagerEditor", this, "DoVizPri()");
132 title1->AddFrame(fVizPri);
133
134 // textbox to display only particles with given PDG
135 TGHorizontalFrame* f1 = new TGHorizontalFrame(title1);
136 TGLabel* L1 = new TGLabel(f1, "Select Particles: ");
137 f1->AddFrame(L1, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 1, 2, 1, 1));
140 fCurrentPDGTextEntry->Connect("TextChanged(char*)", "MpdEventManagerEditor", this, "SelectPDG()");
141 title1->AddFrame(f1);
142
143 // textbox for min energy cutting
144 sliderMinEnergy = new TEveGValuator(title1, "Min Energy:", 90, 0);
145 sliderMinEnergy->SetNELength(5);
146 sliderMinEnergy->SetLabelWidth(80);
147 sliderMinEnergy->Build();
148 sliderMinEnergy->SetLimits(fEventManager->GetMinEnergyLimit(), fEventManager->GetMaxEnergyLimit(), 2001,
150 sliderMinEnergy->SetToolTip("Minimum energy of displayed tracks");
151 sliderMinEnergy->SetValue(fEventManager->GetMinEnergyLimit());
152 sliderMinEnergy->Connect("ValueSet(Double_t)", "MpdEventManagerEditor", this, "SetMinEnergyCut()");
153 title1->AddFrame(sliderMinEnergy, new TGLayoutHints(kLHintsTop, 1, 1, 1, 0));
154
155 // textbox with slider for max energy cutting
156 sliderMaxEnergy = new TEveGValuator(title1, "Max Energy:", 90, 0);
157 sliderMaxEnergy->SetNELength(5);
158 sliderMaxEnergy->SetLabelWidth(80);
159 sliderMaxEnergy->Build();
160 sliderMaxEnergy->SetLimits(fEventManager->GetMinEnergyLimit(), fEventManager->GetMaxEnergyLimit(), 2001,
162 sliderMaxEnergy->SetToolTip("Maximum energy of displayed tracks");
163 sliderMaxEnergy->SetValue(fEventManager->GetMaxEnergyLimit());
164 sliderMaxEnergy->Connect("ValueSet(Double_t)", "MpdEventManagerEditor", this, "SetMaxEnergyCut()");
165 title1->AddFrame(sliderMaxEnergy, new TGLayoutHints(kLHintsTop, 1, 1, 1, 0));
166
167 fGeometryFrame = new TGHorizontalFrame(title1);
168 // button: whether show detector geometry or not
169 fGeometry = new TGCheckButton(fGeometryFrame, "show geometry");
170 fGeometryFrame->AddFrame(fGeometry, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 5, 5, 1, 1));
171 fGeometry->Connect("Toggled(Bool_t)", "MpdEventManagerEditor", this, "ShowGeometry(Bool_t)");
172 fGeometry->SetOn();
173 // button: whether show magnet or not
174 TGeoVolume* magnet = gGeoManager->FindVolumeFast("Magnet");
175 if (magnet) {
176 isMagnetFound = true;
177 ShowMagnetButton = new TGCheckButton(fGeometryFrame, "show magnet");
179 ShowMagnetButton->Connect("Toggled(Bool_t)", "MpdEventManagerEditor", this, "ShowMagnet(Bool_t)");
180 ShowMagnetButton->SetOn();
181 }
182 title1->AddFrame(fGeometryFrame);
183
184 // button for high transparency of detectors' geometry to highlight event objects
185 TGCheckButton* fTransparency = new TGCheckButton(title1, "high transparency");
186 title1->AddFrame(fTransparency, new TGLayoutHints(kLHintsRight | kLHintsExpandX, 5, 5, 1, 1));
187 fTransparency->Connect("Toggled(Bool_t)", "MpdEventManagerEditor", this, "SwitchTransparency(Bool_t)");
188
189 // button for switching from black to white background
190 TGCheckButton* backgroundButton = new TGCheckButton(title1, "light background");
191 title1->AddFrame(backgroundButton, new TGLayoutHints(kLHintsRight | kLHintsExpandX, 5, 5, 1, 1));
192 backgroundButton->Connect("Toggled(Bool_t)", "MpdEventManagerEditor", this, "SwitchBackground(Bool_t)");
193 if (!fEventManager->isDarkColor) {
194 backgroundButton->SetOn();
195 gEve->GetViewers()->SwitchColorSet();
196 }
197
198 // group for displaying simulation and reconstruction data
199 TGGroupFrame* groupData = new TGGroupFrame(title1, "Show MC and reco data");
201
202 TGHorizontalFrame* framePointsInfo = new TGHorizontalFrame(groupData);
203 // button for show|hide MC points
204 fShowMCPoints = new TGCheckButton(framePointsInfo, "MC points");
205 framePointsInfo->AddFrame(fShowMCPoints, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
206 fShowMCPoints->Connect("Toggled(Bool_t)", "MpdEventManagerEditor", this, "ShowMCPoints(Bool_t)");
207 fShowMCPoints->SetDisabledAndSelected(kFALSE);
208
209 // button for show|hide reconstructed points
210 fShowRecoPoints = new TGCheckButton(framePointsInfo, "Reco points");
211 framePointsInfo->AddFrame(fShowRecoPoints, new TGLayoutHints(kLHintsRight, 0, 0, 1, 0));
212 fShowRecoPoints->Connect("Toggled(Bool_t)", "MpdEventManagerEditor", this, "ShowRecoPoints(Bool_t)");
213 fShowRecoPoints->SetDisabledAndSelected(kFALSE);
214 groupData->AddFrame(framePointsInfo, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 1, 1, 5, 0));
215
216 TGHorizontalFrame* frameTracksInfo = new TGHorizontalFrame(groupData);
217 // button for show|hide MC tracks
218 fShowMCTracks = new TGCheckButton(frameTracksInfo, "MC tracks");
219 frameTracksInfo->AddFrame(fShowMCTracks, new TGLayoutHints(kLHintsNormal, 0, 0, 0, 0));
220 fShowMCTracks->Connect("Toggled(Bool_t)", "MpdEventManagerEditor", this, "ShowMCTracks(Bool_t)");
221 fShowMCTracks->SetDisabledAndSelected(kFALSE);
222
223 // button for show|hide reco tracks
224 fShowRecoTracks = new TGCheckButton(frameTracksInfo, "Reco tracks");
225 frameTracksInfo->AddFrame(fShowRecoTracks, new TGLayoutHints(kLHintsRight, 0, 0, 1, 0));
226 fShowRecoTracks->Connect("Toggled(Bool_t)", "MpdEventManagerEditor", this, "ShowRecoTracks(Bool_t)");
227 fShowRecoTracks->SetDisabledAndSelected(kFALSE);
228
229 groupData->AddFrame(frameTracksInfo, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 1, 1, 5, 0));
230 title1->AddFrame(groupData, new TGLayoutHints(kLHintsRight | kLHintsExpandX, 3, 15, 1, 1));
231
232 // button for update of event visualization
233 if (fEventManager->isOnline)
234 fUpdate = new TGTextButton(title1, "Start online display");
235 else
236 fUpdate = new TGTextButton(title1, "Update event");
237 title1->AddFrame(fUpdate, new TGLayoutHints(kLHintsRight | kLHintsExpandX, 3, 15, 1, 1));
238 fUpdate->Connect("Clicked()", "MpdEventManagerEditor", this, "UpdateEvent()");
239
240 // add all frame above to "event info" tab
241 fInfoFrame->AddFrame(title1, new TGLayoutHints(kLHintsTop, 0, 0, 2, 0));
242
243 if ((iEventCount < 1) && (!isStreamSource)) {
244 fUpdate->SetEnabled(kFALSE);
245 return;
246 }
247
248 // read first event in Offline mode
249 if (!fEventManager->isOnline)
250 fEventManager->GotoEvent(0);
251
252 // update tab controls
253 Update();
254}
255
256// set flag: show all particles or only primary
258{
259 if (fVizPri->IsOn())
260 fEventManager->SetPriOnly(kTRUE);
261 else
262 fEventManager->SetPriOnly(kFALSE);
263}
264
265// select displaying particle by PDG code
270
271//______________________________________________________________________________
273{
274 fEventManager->SetMinEnergyCut(sliderMinEnergy->GetValue());
275}
276
277//______________________________________________________________________________
279{
280 fEventManager->SetMaxEnergyCut(sliderMaxEnergy->GetValue());
281}
282
283// show or hide detector geometry
285{
286 // set cursor HourClock
287 gVirtualX->SetCursor(gEve->GetMainWindow()->GetId(), gVirtualX->CreateCursor(kWatch));
288 gVirtualX->SetCursor(gEve->GetLTEFrame()->GetListTree()->GetId(), gVirtualX->CreateCursor(kWatch));
289 gVirtualX->SetCursor(gEve->GetLTEFrame()->GetEditor()->GetId(), gVirtualX->CreateCursor(kWatch));
290
291 gEve->GetGlobalScene()->SetRnrState(is_show);
292 if (!fEventManager->isOnline) {
293 fEventManager->GetRPhiScene()->SetRnrState(is_show);
294 fEventManager->GetRhoZScene()->SetRnrState(is_show);
295 }
296
297 // disable "Magnet Show" box after hiding of detector geometry
298 if (isMagnetFound) {
299 if (!is_show)
301 else
303 }
304
305 gEve->Redraw3D();
306
307 // set cursor Pointer
308 gSystem->ProcessEvents();
309 gVirtualX->SetCursor(gEve->GetMainWindow()->GetId(), gVirtualX->CreateCursor(kPointer));
310 gVirtualX->SetCursor(gEve->GetLTEFrame()->GetListTree()->GetId(), gVirtualX->CreateCursor(kPointer));
311 gVirtualX->SetCursor(gEve->GetLTEFrame()->GetEditor()->GetId(), gVirtualX->CreateCursor(kPointer));
312}
313
314// show or hide magnet
316{
317 TGeoVolume* magnet = gGeoManager->FindVolumeFast("Magnet");
318 if (!magnet) {
319 cout << "ERROR: There is no magnet with given name: Magnet" << endl;
320 return;
321 }
322
323 magnet->SetVisibility(is_show);
324 magnet->VisibleDaughters(is_show);
325
326 if (gEve->GetGlobalScene()->GetRnrState()) {
327 gEve->GetGlobalScene()->SetRnrState(kFALSE);
328 gEve->GetGlobalScene()->SetRnrState(kTRUE);
329 gEve->Redraw3D();
330 }
331}
332
333// switch between light and dark background
335{
336 gEve->GetViewers()->SwitchColorSet();
337}
338
339// set transparency to high value (80%)
341{
342 fEventManager->SetTransparentGeometry(is_on);
343
344 if (gEve->GetGlobalScene()->GetRnrState()) {
345 gEve->GetGlobalScene()->SetRnrState(kFALSE);
346 gEve->GetGlobalScene()->SetRnrState(kTRUE);
347 gEve->Redraw3D();
348 }
349}
350
351// show|hide MC points
353{
354 /*
355 TEveElement::List_t matches;
356 TPRegexp* regexp = new TPRegexp("(\\w+)Point\\b");
357 Int_t numFound = fEventManager->FindChildren(matches, *regexp);
358 if (numFound > 0)
359 {
360 for (TEveElement::List_i p = matches.begin(); p != matches.end(); ++p)
361 (*p)->SetRnrState(is_show);
362 }
363 */
364
365 TEveElement* points = fEventManager->FindChild("MC points");
366 if (points == NULL) {
367 cout << "There is no information about MC points" << endl;
368 fShowMCPoints->SetDisabledAndSelected(kFALSE);
369 return;
370 }
371
372 points->SetRnrState(is_show);
373
374 if (fEventManager->isZDCModule) {
375 if (is_show)
376 RedrawZDC(false);
377 else
378 RedrawZDC(true);
379 }
380
381 fEventManager->fgShowShowMCPoints = is_show;
382 // exec event visualization of selected event
383 if (!fEventManager->isOnline && fEventManager->fgRedrawRecoPointsReqired)
384 fEventManager->GotoEvent(fCurrentEvent->GetIntNumber());
385
386 // redraw points
387 gEve->Redraw3D();
388}
389
390bool MpdEventManagerEditor::RedrawZDC(bool isFull, bool isRedraw)
391{
392 TGeoVolume* curVolume = gGeoManager->GetVolume("VETO");
393 if (!curVolume) {
394 cout << "ERROR: There is no volume with given name: VETO" << endl;
395 return false;
396 } else {
397 int i = 0;
398 for (; i < 68; i++) {
399 TGeoNode* child = curVolume->FindNode(Form("VMDL_%d", i + 1));
400 if (child == NULL)
401 continue;
402 // cout<<"Node: "<<child->GetName()<<". Number is equal "<<i<<endl;
403
404 if (isFull) {
405 if (fEventManager->isZDCModule[i] == false) {
406 child->SetVisibility(true);
407 child->VisibleDaughters(true);
408 }
409 } else {
410 child->SetVisibility(fEventManager->isZDCModule[i]);
411 child->VisibleDaughters(fEventManager->isZDCModule[i]);
412 }
413 }
414
415 for (; i < 104; i++) {
416 TGeoNode* child = curVolume->FindNode(Form("UMDL_%d", i + 1 - 68));
417 if (child == NULL)
418 continue;
419 // cout<<"Node: "<<child->GetName()<<". Number is equal "<<i<<endl;
420
421 if (isFull) {
422 if (fEventManager->isZDCModule[i] == false) {
423 child->SetVisibility(true);
424 child->VisibleDaughters(true);
425 }
426 } else {
427 child->SetVisibility(fEventManager->isZDCModule[i]);
428 child->VisibleDaughters(fEventManager->isZDCModule[i]);
429 }
430 }
431
432 if ((isFull || isRedraw) && (gEve->GetGlobalScene()->GetRnrState())) {
433 gEve->GetGlobalScene()->SetRnrState(kFALSE);
434 gEve->GetGlobalScene()->SetRnrState(kTRUE);
435
436 return true;
437 }
438 } // else - ZDC detector was found
439
440 return false;
441}
442
444{
445 // display new min and max energy limits given by event energy range
446 sliderMinEnergy->SetLimits(fEventManager->GetMinEnergyLimit(), fEventManager->GetMaxEnergyLimit(), 2001);
447 sliderMinEnergy->SetValue(fEventManager->GetMinEnergyCut());
448 sliderMaxEnergy->SetLimits(fEventManager->GetMinEnergyLimit(), fEventManager->GetMaxEnergyLimit(), 2001);
449 sliderMaxEnergy->SetValue(fEventManager->GetMaxEnergyCut());
450}
451
452//______________________________________________________________________________
454{
455 TEveElement* tracks = fEventManager->FindChild("MC tracks");
456 if (tracks == NULL) {
457 cout << "There is no information about MC tracks" << endl;
458 fShowMCTracks->SetDisabledAndSelected(kFALSE);
459 return;
460 }
461
462 tracks->SetRnrState(is_show);
463 gEve->Redraw3D();
464}
465
466//______________________________________________________________________________
468{
469 TEveElement* points = fEventManager->FindChild("Reco points");
470 if (points == NULL) {
471 cout << "There is no information about reconstructed points" << endl;
472 fShowRecoPoints->SetDisabledAndSelected(kFALSE);
473 return;
474 }
475
476 fEventManager->fgShowShowRecoPoints = is_show;
477 // exec event visualization of selected event
478 if (!fEventManager->isOnline && fEventManager->fgRedrawRecoPointsReqired)
479 fEventManager->GotoEvent(fCurrentEvent->GetIntNumber());
480
481 points->SetRnrState(is_show);
482 gEve->Redraw3D();
483}
484
485//______________________________________________________________________________
487{
488 TEveElement* tracks = fEventManager->FindChild("Reco tracks");
489 if (tracks == NULL) {
490 cout << "There is no information about reconstructed tracks" << endl;
491 fShowRecoTracks->SetDisabledAndSelected(kFALSE);
492 return;
493 }
494
495 fEventManager->fgShowShowRecoTracks = is_show;
496 // exec event visualization of selected event
497 if (!fEventManager->isOnline && fEventManager->fgRedrawRecoPointsReqired)
498 fEventManager->GotoEvent(fCurrentEvent->GetIntNumber());
499
500 tracks->SetRnrState(is_show);
501 gEve->Redraw3D();
502}
503
505{
506 const char* filetypes[] = {"PNG", "*.png", "JPG", "*.jpg", 0, 0};
507 TGFileInfo fi;
508 fi.fFileTypes = filetypes;
509 fi.fIniDir = StrDup(".");
510 new TGFileDialog(gClient->GetRoot(), gEve->GetMainWindow(), kFDSave, &fi);
511
512 printf("Saving file: %s (dir: %s)\n", fi.fFilename, fi.fIniDir);
513 gEve->GetDefaultGLViewer()->SavePicture(fi.fFilename);
514
515 return;
516}
517
518// update event display when setting event number in textbox
520{
521 // if OFFLINE mode
522 if (!fEventManager->isOnline) {
523 int iOldEvent = fEventManager->GetCurrentEvent(), iNewEvent = fCurrentEvent->GetIntNumber();
524 // exec event visualization of selected event
525 fEventManager->GotoEvent(iNewEvent);
526
527 if ((fEventManager->isZDCModule) && (fShowMCPoints->IsOn()))
528 RedrawZDC(false);
529
530 if (iOldEvent != iNewEvent) {
531 // display event time
532 TString time = TString::Format("%.2f ns", FairRootManager::Instance()->GetEventTime());
533 fEventTime->SetText(time.Data());
534
536 }
537
538 // update tab controls
539 Update();
540
541 return;
542 }
543
544 /*// update all scenes
545 fEventManager->fRPhiView->GetGLViewer()->UpdateScene(kTRUE);
546 fEventManager->fRhoZView->GetGLViewer()->UpdateScene(kTRUE);
547 fEventManager->fMulti3DView->GetGLViewer()->UpdateScene(kTRUE);
548 fEventManager->fMultiRPhiView->GetGLViewer()->UpdateScene(kTRUE);
549 fEventManager->fMultiRhoZView->GetGLViewer()->UpdateScene(kTRUE);*/
550}
551
552// clicking 'Update event' button to update event display OR 'Start online display' button to start/stop online event
553// display
555{
556 if (iThreadState == 1) {
557 iThreadState = 0;
558 return;
559 }
560
561 fEventManager->fCurrentPDG.clear();
562 istringstream iss(fCurrentPDGString);
563 auto databasePDG = TDatabasePDG::Instance();
564 regex rgx("[\\s,]+");
565 sregex_token_iterator iter(fCurrentPDGString.begin(), fCurrentPDGString.end(), rgx, -1);
566 sregex_token_iterator end;
567 for (; iter != end; ++iter) {
568 string s = (*iter).str();
569 if (s != "") {
570 auto pdg = atoi(s.c_str());
571 if (pdg)
572 fEventManager->fCurrentPDG.insert(pdg);
573 else {
574 auto particle = databasePDG->GetParticle(s.c_str());
575 if (particle)
576 fEventManager->fCurrentPDG.insert(particle->PdgCode());
577 }
578 }
579 }
580
581 // if OFFLINE mode
582 if (!fEventManager->isOnline) {
583 int iOldEvent = fEventManager->GetCurrentEvent(), iNewEvent = fCurrentEvent->GetIntNumber();
584 // exec event visualization of selected event
585 fEventManager->GotoEvent(iNewEvent);
586
587 if ((fEventManager->isZDCModule) && (fShowMCPoints->IsOn()))
588 RedrawZDC(false);
589
590 if (iOldEvent != iNewEvent) {
591 // display event time
592 TString time = TString::Format("%.2f ns", FairRootManager::Instance()->GetEventTime());
593 fEventTime->SetText(time.Data());
594
596 }
597
598 // update tab controls
599 Update();
600
601 return;
602 }
603 // if ONLINE mode
604 else
605 {
606 // block user interface to exclude sharing of Redraw access
607 BlockUI();
608
609 // Run separate thread for Online Display
610 ThreadParam_OnlineDisplay* par_online_display = new ThreadParam_OnlineDisplay();
611 par_online_display->fEventManager = fEventManager;
612 par_online_display->fManagerEditor = this;
613 par_online_display->fRootManager = FairRootManager::Instance();
614 par_online_display->isZDCRedraw = false;
615 if ((fEventManager->isZDCModule) && (fShowMCPoints->IsOn()))
616 par_online_display->isZDCRedraw = true;
617 par_online_display->iCurrentEvent = fCurrentEvent->GetIntNumber();
618 par_online_display->isStreamSource = isStreamSource;
619
620 TThread* thread_run_online = new TThread(RunOnlineDisplay, (void*)par_online_display);
621 iThreadState = 1;
622 thread_run_online->Run();
623
624 return;
625 }
626}
627
629{
630 // fCurrentEvent->SetState(kFALSE);
631 // fUpdate->SetEnabled(kFALSE);
632 fUpdate->SetText("Stop online display");
633 // fGeometry->SetEnabled(kFALSE);
634}
635
637{
638 // fCurrentEvent->SetState(kTRUE);
639 // fUpdate->SetEnabled(kTRUE);
640 fUpdate->SetText("Start online display");
641 // fGeometry->SetEnabled(kTRUE);
642}
643
644// thread function for Online Display
645void* RunOnlineDisplay(void* ptr)
646{
648 MpdEventManager* fEventManager = thread_par->fEventManager;
649 MpdEventManagerEditor* fEditor = thread_par->fManagerEditor;
650 FairRootManager* fRootManager = thread_par->fRootManager;
651 int current_event = thread_par->iCurrentEvent;
652 bool stream_source = thread_par->isStreamSource;
653 bool isZDCRedraw = thread_par->isZDCRedraw;
654
655 // get all tasks from FairRunAna
656 FairRunAna* pRun = fEventManager->fRunAna;
657 FairTask* pMainTask = pRun->GetMainTask();
658 TList* taskList = pMainTask->GetListOfTasks();
659
660 for (int i = current_event + 1; ((stream_source) || (i < fEditor->iEventCount)); i++) {
661 if (fEditor->iThreadState == 0)
662 break;
663 do {
664 TThread::Sleep(0, 200000000);
665 } while ((gEve->GetGlobalScene()->GetGLScene()->IsLocked())
666 || (gEve->GetEventScene()->GetGLScene()->IsLocked()));
667
668 fRootManager->ReadEvent(i);
669 fEventManager->SetCurrentEvent(i);
670
671 // run all tasks
672 TObjLink* lnk = taskList->FirstLink();
673 while (lnk) {
674 FairTask* pCurTask = (FairTask*)lnk->GetObject();
675 pCurTask->ExecuteTask("");
676 lnk = lnk->Next();
677 }
678
679 // fEditor->fCurrentEvent->SetIntNumber(i);
680
681 // highlight ZDC modules if ZDC present
682 if (isZDCRedraw)
683 fEditor->RedrawZDC();
684
685 // redraw points
686 cout << "Redrawing event #" << i << "..." << endl << endl;
687 gEve->Redraw3D();
688 // TThread::Sleep(1,0);
689 // gSystem->ProcessEvents();
690 }
691
692 fEditor->UnblockUI();
693 fEditor->iThreadState = 0;
694
695 return NULL;
696}
kWatch
kPointer
kVerticalFrame
kFixedWidth
kOwnBackground
ULong_t Pixel_t
void * RunOnlineDisplay(void *ptr)
int i
Definition P4_F32vec4.h:22
bool Bool_t
int Int_t
constexpr Bool_t kFALSE
constexpr Bool_t kTRUE
R__EXTERN TEveManager * gEve
#define gClient
kFDSave
kLHintsRight
kLHintsLeft
kLHintsCenterY
kLHintsNormal
kLHintsTop
kLHintsExpandX
R__EXTERN TGeoManager * gGeoManager
char * Form(const char *fmt,...)
char * StrDup(const char *str)
R__EXTERN TSystem * gSystem
#define gVirtualX
MpdEventManager * fEventManager
virtual void ShowMCTracks(Bool_t is_show)
virtual void ShowRecoTracks(Bool_t is_show)
virtual void ShowMagnet(Bool_t is_show)
virtual void SwitchTransparency(Bool_t is_on)
virtual void ShowGeometry(Bool_t is_show)
virtual void SwitchBackground(Bool_t is_on)
bool RedrawZDC(bool isFull=false, bool isRedraw=true)
MpdEventManagerEditor(const TGWindow *p=0, Int_t width=170, Int_t height=30, UInt_t options=kChildFrame, Pixel_t back=GetDefaultFrameBackground())
virtual void ShowRecoPoints(Bool_t is_show)
virtual void ShowMCPoints(Bool_t is_show)
TGHorizontalFrame * fGeometryFrame
virtual void SetCurrentEvent(Int_t event_number)
FairRunAna * fRunAna
TFile * GetFile() const
static TDatabasePDG * Instance()
virtual Bool_t SetRnrState(Bool_t rnr)
virtual void SetOn(Bool_t on=kTRUE, Bool_t emit=kFALSE)
virtual void AddFrame(TGFrame *f, TGLayoutHints *l=nullptr)
TGCompositeFrame(const TGWindow *p=nullptr, UInt_t w=1, UInt_t h=1, UInt_t options=0, Pixel_t back=GetDefaultFrameBackground())
char * fFilename
const char ** fFileTypes
char * fIniDir
virtual void SetTitlePos(ETitlePos pos=kLeft)
virtual TGVerticalFrame * CreateEditorTabSubFrame(const char *name)
virtual void MakeTitle(const char *title)
virtual void Update()
TGedFrame(const TGWindow *p=nullptr, Int_t width=140, Int_t height=30, UInt_t options=kChildFrame, Pixel_t back=GetDefaultFrameBackground())
void SetVisibility(Bool_t vis=kTRUE) override
void VisibleDaughters(Bool_t vis=kTRUE)
TGeoNode * FindNode(const char *name) const
virtual TObjLink * FirstLink() const
const char * GetName() const override
Bool_t Connect(const char *signal, const char *receiver_class, void *receiver, const char *slot)
const char * Data() const
static TString Format(const char *fmt,...)
static Int_t Sleep(ULong_t secs, ULong_t nanos=0)
Int_t Run(void *arg=nullptr, const int affinity=-1)
virtual Long64_t GetEntriesFast() const
void * RunOnlineDisplay(void *ptr)
Definition json.hpp:4446
MpdEventManagerEditor * fManagerEditor