10 #include <framework/core/ModuleParam.h>
12 #include <framework/dataobjects/DisplayData.h>
13 #include <display/DisplayUI.h>
14 #include <display/VisualRepMap.h>
15 #include <display/BrowsableWrapper.h>
16 #include <display/SplitGLView.h>
17 #include <display/InfoWidget.h>
19 #include <framework/core/InputController.h>
20 #include <framework/datastore/StoreObjPtr.h>
21 #include <framework/datastore/StoreArray.h>
22 #include <framework/dataobjects/EventMetaData.h>
23 #include <framework/logging/Logger.h>
24 #include <framework/pcore/AsyncWrapper.h>
26 #include <TApplication.h>
28 #include <TEveBrowser.h>
29 #include <TEveManager.h>
30 #include <TEveEventManager.h>
31 #include <TEveSelection.h>
32 #include <TEveScene.h>
33 #include <TEveViewer.h>
35 #include <TGFileBrowser.h>
38 #include <TGNumberEntry.h>
40 #include <TGFileDialog.h>
41 #include <TGInputDialog.h>
42 #include <TGTextEntry.h>
43 #include <TGLViewer.h>
44 #include <TGLWidget.h>
48 #include <TVirtualX.h>
50 #include <sys/prctl.h>
59 m_automatic(automatic), m_advance(advance)
62 prctl(PR_SET_PDEATHSIG, SIGHUP);
65 B2INFO(
"Creating TEve window.");
70 TEveBrowser* browser = gEve->GetBrowser();
71 browser->HideBottomTab();
72 browser->StartEmbedding(TRootBrowser::kRight);
74 browser->StopEmbedding();
77 browser->Resize(TGDimension(1200, 1000));
117 std::string title(
"Belle II Event Display");
118 if (!fileName.empty())
119 title +=
" - " + fileName;
121 TEveBrowser* browser = gEve->GetBrowser();
122 browser->SetWindowName(title.c_str());
126 std::string label =
"Flag this Event";
127 if (!description.empty())
128 label +=
" for " + description;
130 m_flagEvent =
new TGCheckButton(
nullptr, label.c_str());
162 if (!eventMetaData) {
163 m_eventLabel->SetText(
"No EventMetaData object available.");
165 time_t secondsSinceEpoch = eventMetaData->getTime() / 1e9;
167 char date[30] =
"<Invalid time>";
168 if (secondsSinceEpoch == 0)
170 else if (
auto gmt = gmtime(&secondsSinceEpoch))
171 strftime(date, 30,
"<%Y-%m-%d %H:%M:%S UTC>", gmt);
172 m_eventLabel->SetText(TString::Format(
"Event: \t\t%u\nRun: \t\t%d\nExperiment: \t%d\n\n%s",
173 eventMetaData->getEvent(),
174 eventMetaData->getRun(), eventMetaData->getExperiment(),
179 gVirtualX->SetCursor(gEve->GetBrowser()->GetId(), gVirtualX->CreateCursor(kPointer));
187 if (numEntries > 0 and
id >= numEntries)
194 B2ERROR(
"Cannot switch to event " <<
id <<
", only works in conjunction with RootInput.");
198 B2DEBUG(100,
"Switching to event " <<
id);
203 gVirtualX->SetCursor(gEve->GetBrowser()->GetId(), gVirtualX->CreateCursor(kWatch));
211 gSystem->ProcessEvents();
213 B2DEBUG(100,
"exiting event loop now.");
222 B2DEBUG(100,
"Switching to event " << event <<
" in run " << run <<
", experiment " << experiment);
223 gVirtualX->SetCursor(gEve->GetBrowser()->GetId(), gVirtualX->CreateCursor(kWatch));
226 B2DEBUG(100,
"exiting event loop now.");
245 const TString icondir(Form(
"%s/icons/", gSystem->Getenv(
"ROOTSYS")));
255 m_timer->Connect(
"Timeout()",
"Belle2::DisplayUI",
this,
"next()");
256 m_timer->Start(pollIntervalMs);
257 m_playPauseButton->SetPicture(gClient->GetPicture(icondir +
"ed_interrupt.png"));
267 char returnString[256];
268 new TGInputDialog(gEve->GetBrowser()->GetClient()->GetDefaultRoot(), gEve->GetBrowser(),
269 "Jump to event '#evt/#run/#exp':",
270 TString::Format(
"%u/%d/%d", eventMetaData->getEvent(), eventMetaData->getRun(), eventMetaData->getExperiment()),
272 if (returnString[0] ==
'\0')
275 unsigned int event, run, exp;
276 returnString[255] =
'\0';
277 if (sscanf(returnString,
"%u/%u/%u", &event, &run, &exp) != 3) {
278 B2WARNING(
"Wrong format!");
289 gEve->AddEvent(
new TEveEventManager());
291 if (gEve->GetCurrentEvent())
292 gEve->GetCurrentEvent()->DestroyElements();
307 if (representedObject)
316 if (event->fType == kGKeyPress) {
318 switch (event->fCode) {
332 if (event->fState & kKeyControlMask)
345 TTimer* t =
new TTimer();
346 const int pollIntervalMs = 300;
347 t->Connect(
"Timeout()",
"Belle2::DisplayUI",
this,
"pollNewEvents()");
348 t->Start(pollIntervalMs);
356 TEveScene* gs = gEve->GetGlobalScene();
359 rphiManager->ImportElements(gs);
363 rhozManager->ImportElements(gs);
367 gEve->GetSelection()->Connect(
"SelectionAdded(TEveElement*)",
"Belle2::DisplayUI",
this,
"selectionHandler(TEveElement*)");
368 gEve->GetSelection()->Connect(
"SelectionRepeated(TEveElement*)",
"Belle2::DisplayUI",
this,
"selectionHandler(TEveElement*)");
379 TGListTreeItem* eventItem = gEve->GetListTree()->FindItemByPathname(
"Event");
380 TGListTreeItem* item = gEve->GetListTree()->FindChildByName(eventItem, name.c_str());
382 B2INFO(
"hiding object '" << name <<
"'.");
383 TEveElement* eveItem =
static_cast<TEveElement*
>(item->GetUserData());
384 eveItem->SetRnrSelfChildren(
false,
false);
386 B2ERROR(
"hideObjects: '" << name <<
"' not found.");
392 gEve->Redraw3D(
false);
399 gApplication->Run(
true);
414 TEveBrowser* browser = gEve->GetBrowser();
415 const int margin = 3;
417 browser->Connect(
"CloseWindow()",
"Belle2::DisplayUI",
this,
"exit()");
420 browser->Connect(
"ProcessedEvent(Event_t*)",
"Belle2::DisplayUI",
this,
"handleEvent(Event_t*)");
421 TEveViewerList* viewers = gEve->GetViewers();
422 TEveElement::List_ci end_it = viewers->EndChildren();
423 for (TEveElement::List_i it = viewers->BeginChildren(); it != end_it; ++it) {
424 TEveViewer* v =
static_cast<TEveViewer*
>(*it);
425 TGLViewer* glv = v->GetGLViewer();
426 glv->GetGLWidget()->Connect(
"ProcessedEvent(Event_t*)",
"Belle2::DisplayUI",
this,
"handleEvent(Event_t*)");
430 browser->StartEmbedding(TRootBrowser::kLeft);
432 TGMainFrame* frmMain =
new TGMainFrame(gClient->GetRoot(), 240, 600);
433 frmMain->SetWindowName(
"Event control main frame");
434 frmMain->SetCleanup(kDeepCleanup);
436 const TString icondir(Form(
"%s/icons/", gSystem->Getenv(
"ROOTSYS")));
438 TGGroupFrame* event_frame =
new TGGroupFrame(frmMain);
439 event_frame->SetTitle(
"Event");
441 TGHorizontalFrame* hf =
new TGHorizontalFrame(event_frame);
443 m_prevButton =
new TGPictureButton(hf, gClient->GetPicture(icondir +
"GoBack.gif"));
444 m_prevButton->SetToolTipText(
"Go to previous event (Page Up)");
445 hf->AddFrame(
m_prevButton,
new TGLayoutHints(kLHintsLeft | kLHintsCenterY, margin, margin, margin, margin));
446 m_prevButton->Connect(
"Clicked()",
"Belle2::DisplayUI",
this,
"prev()");
450 TGNumberFormat::kNEANonNegative,
451 TGNumberFormat::kNELLimitMinMax,
454 hf->AddFrame(
m_eventNumberWidget,
new TGLayoutHints(kLHintsLeft | kLHintsCenterY, margin, margin, margin, margin));
456 m_eventNumberWidget->Connect(
"ValueSet(Long_t)",
"Belle2::DisplayUI",
this,
"goToEventWidget()");
457 m_eventNumberWidget->GetNumberEntry()->Connect(
"ReturnPressed()",
"Belle2::DisplayUI",
this,
"goToEventWidget()");
460 if (numEntries > 0) {
461 TGLabel* maxEvents =
new TGLabel(hf, TString::Format(
"/%ld", numEntries - 1));
462 hf->AddFrame(maxEvents,
new TGLayoutHints(kLHintsLeft | kLHintsCenterY, margin, margin, margin, margin));
465 m_nextButton =
new TGPictureButton(hf, gClient->GetPicture(icondir +
"GoForward.gif"));
466 m_nextButton->SetToolTipText(
"Go to next event (Page Down)");
467 hf->AddFrame(
m_nextButton,
new TGLayoutHints(kLHintsLeft | kLHintsCenterY, margin, margin, margin, margin));
468 m_nextButton->Connect(
"Clicked()",
"Belle2::DisplayUI",
this,
"next()");
470 event_frame->AddFrame(hf,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 0, 0, 0, 0));
472 hf =
new TGHorizontalFrame(event_frame);
477 TGLabel* delayLabel =
new TGLabel(hf,
"Delay (s):");
478 hf->AddFrame(delayLabel,
new TGLayoutHints(kLHintsLeft | kLHintsCenterY, margin, margin, margin, margin));
480 const double valueSeconds = async ? 0.5 : 3.5;
481 m_autoAdvanceDelay =
new TGNumberEntry(hf, valueSeconds, 3, 999, TGNumberFormat::kNESRealOne,
482 TGNumberFormat::kNEAPositive,
483 TGNumberFormat::kNELLimitMin,
486 hf->AddFrame(
m_autoAdvanceDelay,
new TGLayoutHints(kLHintsLeft | kLHintsCenterY, margin, margin, margin, margin));
488 m_autoAdvanceDelay->Connect(
"ValueSet(Long_t)",
"Belle2::DisplayUI",
this,
"autoAdvanceDelayChanged()");
489 m_autoAdvanceDelay->GetNumberEntry()->Connect(
"ReturnPressed()",
"Belle2::DisplayUI",
this,
"autoAdvanceDelayChanged()");
491 m_playPauseButton =
new TGPictureButton(hf, gClient->GetPicture(icondir +
"ed_execute.png"));
493 m_playPauseButton->SetToolTipText(
"Advance automatically to next event after the given delay.");
494 hf->AddFrame(
m_playPauseButton,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, margin, margin, margin, margin));
495 m_playPauseButton->Connect(
"Clicked()",
"Belle2::DisplayUI",
this,
"togglePlayPause()");
497 event_frame->AddFrame(hf,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 0, 0, 0, 0));
499 TGButton* jumpToEventButton =
new TGTextButton(event_frame,
"Jump to event/run/exp...");
501 jumpToEventButton->SetToolTipText(
"Find a given entry identified by an event / run / experiment triplet in the current file");
502 event_frame->AddFrame(jumpToEventButton,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, margin, margin, margin, margin));
503 jumpToEventButton->Connect(
"Clicked()",
"Belle2::DisplayUI",
this,
"showJumpToEventDialog()");
506 event_frame->AddFrame(
m_eventLabel,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, margin, margin, margin, margin));
511 m_flagEvent =
new TGCheckButton(event_frame, descr);
512 m_flagEvent->SetToolTipText(
"Set return value to true for this event");
514 event_frame->AddFrame(
m_flagEvent,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, margin, margin, margin, margin));
517 frmMain->AddFrame(event_frame,
new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
519 TGGroupFrame* param_frame =
new TGGroupFrame(frmMain);
520 param_frame->SetTitle(
"Options");
523 for (
int i = 0; i < nParams; i++) {
524 TGCheckButton* b =
new TGCheckButton(param_frame,
m_paramList[i].m_label.c_str(), i);
525 b->SetToolTipText(
m_paramList[i].m_param->getDescription().c_str());
526 b->SetState(
m_paramList[i].m_param->getValue() ? kButtonDown : kButtonUp);
527 b->Connect(
"Clicked()",
"Belle2::DisplayUI",
this, TString::Format(
"handleParameterChange(=%d)", i));
529 param_frame->AddFrame(b,
new TGLayoutHints(kLHintsExpandX | kLHintsCenterY, indentation, margin, margin, margin));
533 frmMain->AddFrame(param_frame,
new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
536 TGGroupFrame* viewer_frame =
new TGGroupFrame(frmMain);
537 viewer_frame->SetTitle(
"Current Viewer");
539 TGHorizontalFrame* hf =
new TGHorizontalFrame(viewer_frame);
542 b =
new TGTextButton(hf,
"Save As...");
543 b->SetToolTipText(
"Save a bitmap graphic for the current viewer");
544 hf->AddFrame(b,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, margin + 1, margin, margin, margin));
545 b->Connect(
"Clicked()",
"Belle2::DisplayUI",
this,
"savePicture()");
547 b =
new TGTextButton(hf,
"Save As (High-Res)... ");
548 b->SetToolTipText(
"Save a bitmap graphic for the current viewer with user-specified size");
549 hf->AddFrame(b,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, margin, margin, margin, margin));
550 b->Connect(
"Clicked()",
"Belle2::DisplayUI",
this,
"saveHiResPicture()");
553 viewer_frame->AddFrame(hf,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 0, 0, 0, 0));
555 hf =
new TGHorizontalFrame(viewer_frame);
557 b =
new TGTextButton(hf,
"Dock/Undock Viewer");
558 b->SetToolTipText(
"Move current viewer into it's own window, or back to its original position");
559 hf->AddFrame(b,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, margin, margin, margin, margin));
560 b->Connect(
"Clicked()",
"Belle2::DisplayUI",
this,
"toggleUndock()");
562 viewer_frame->AddFrame(hf,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 0, 0, 0, 0));
564 frmMain->AddFrame(viewer_frame,
new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
567 TGGroupFrame* visOptionsFrame =
new TGGroupFrame(frmMain);
568 visOptionsFrame->SetTitle(
"Visualisation Options");
570 TGHorizontalFrame* hf =
new TGHorizontalFrame(visOptionsFrame);
572 TGButton* b =
new TGTextButton(hf,
"Dark/light colors");
573 b->SetToolTipText(
"Toggle background color");
574 hf->AddFrame(b,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, margin, margin, margin, margin));
575 b->Connect(
"Clicked()",
"Belle2::DisplayUI",
this,
"toggleColorScheme()");
577 visOptionsFrame->AddFrame(hf,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 0, 0, 0, 0));
580 TGCheckButton* c =
new TGCheckButton(visOptionsFrame,
"Cumulative mode (experimental)");
581 c->SetToolTipText(
"Do not erase previous event, i.e. show data from multiple events. This is quite unstable and will crash sooner or later.");
583 c->Connect(
"Clicked()",
"Belle2::DisplayUI",
this,
"toggleCumulative()");
584 visOptionsFrame->AddFrame(c,
new TGLayoutHints(kLHintsExpandX | kLHintsCenterY, 0, margin, margin, margin));
587 frmMain->AddFrame(visOptionsFrame,
new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
590 TGGroupFrame* automatisation_frame =
new TGGroupFrame(frmMain);
591 automatisation_frame->SetTitle(
"Automatic Saving (experimental)");
593 TGHorizontalFrame* hf =
new TGHorizontalFrame(automatisation_frame);
595 TGLabel* prefixLabel =
new TGLabel(hf,
"Prefix:");
596 hf->AddFrame(prefixLabel,
new TGLayoutHints(kLHintsLeft | kLHintsCenterY, margin, margin, margin, margin));
599 hf->AddFrame(
m_autoFileNamePrefix,
new TGLayoutHints(kLHintsLeft | kLHintsCenterY, margin, margin, margin, margin));
601 automatisation_frame->AddFrame(hf,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 0, 0, 0, 0));
603 hf =
new TGHorizontalFrame(automatisation_frame);
605 TGLabel* widthLabel =
new TGLabel(hf,
"Width (px):");
606 hf->AddFrame(widthLabel,
new TGLayoutHints(kLHintsLeft | kLHintsCenterY, margin, margin, margin, margin));
609 TGNumberFormat::kNEANonNegative,
610 TGNumberFormat::kNELLimitMinMax,
612 hf->AddFrame(
m_autoPictureWidth,
new TGLayoutHints(kLHintsLeft | kLHintsCenterY, margin, margin, margin, margin));
614 TGButton* b =
new TGTextButton(hf,
"Save PNGs");
615 b->SetToolTipText(
"Save bitmap graphics for all further events. Cannot be aborted. (EXPERIMENTAL)");
616 hf->AddFrame(b,
new TGLayoutHints(kLHintsLeft | kLHintsCenterY, margin, margin, margin, margin));
617 b->Connect(
"Clicked()",
"Belle2::DisplayUI",
this,
"startAutomaticRun()");
619 automatisation_frame->AddFrame(hf,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 0, 0, 0, 0));
622 frmMain->AddFrame(automatisation_frame,
new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
625 TGGroupFrame* exit_frame =
new TGGroupFrame(frmMain);
626 exit_frame->SetTitle(
"Closing");
628 TGHorizontalFrame* hf =
new TGHorizontalFrame(exit_frame);
630 TGButton* b =
new TGTextButton(hf,
" Exit ");
631 b->SetToolTipText(
"Close the display and stop basf2 after this event.");
632 hf->AddFrame(b,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, margin, margin, margin, margin));
633 b->Connect(
"Clicked()",
"Belle2::DisplayUI",
this,
"exit()");
636 exit_frame->AddFrame(hf,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 0, 0, 0, 0));
639 frmMain->AddFrame(exit_frame,
new TGLayoutHints(kLHintsExpandX | kLHintsBottom, 0, 0, 0, 0));
642 frmMain->MapSubwindows();
644 frmMain->MapWindow();
645 browser->StopEmbedding(
"Event Control");
651 B2ERROR(
"widget ID too large!");
664 TEveViewerList* viewers = gEve->GetViewers();
665 TEveElement::List_ci end_it = viewers->EndChildren();
666 for (TEveElement::List_i it = viewers->BeginChildren(); it != end_it; ++it) {
667 TEveViewer* v =
static_cast<TEveViewer*
>(*it);
668 TGLViewer* glv = v->GetGLViewer();
670 bool dark = glv->ColorSet().Background().GetColorIndex() != kWhite;
671 glv->RefLightColorSet().Background().SetColor(kWhite);
672 glv->RefDarkColorSet().Background().SetColor(kBlack);
674 glv->UseLightColorSet();
676 glv->UseDarkColorSet();
684 TEveViewerList* viewers = gEve->GetViewers();
685 TEveElement::List_ci end_it = viewers->EndChildren();
686 TEveViewer* activeViewer =
nullptr;
687 for (TEveElement::List_i it = viewers->BeginChildren(); it != end_it; ++it) {
688 TEveViewer* v =
static_cast<TEveViewer*
>(*it);
689 if (v->GetGLViewer() == activeGLviewer) {
696 B2ERROR(
"No active viewer. Please select one by clicking on it.");
700 TEveCompositeFrameInMainFrame* packFrame =
dynamic_cast<TEveCompositeFrameInMainFrame*
>(activeViewer->GetEveFrame());
703 activeViewer->UndockWindow();
706 packFrame->MainFrameClosed();
712 const char* filetypes[] = {
713 "PNG (bitmap)",
"*.png",
714 "PDF (experimental!)",
"*.pdf",
719 fi.fFileTypes = filetypes;
722 new TGFileDialog(gEve->GetBrowser()->GetClient()->GetDefaultRoot(), gEve->GetBrowser(), kFDSave, &fi);
726 bool success =
false;
728 success = v->SavePicture(fi.fFilename);
730 char returnString[256];
731 new TGInputDialog(gEve->GetBrowser()->GetClient()->GetDefaultRoot(), gEve->GetBrowser(),
732 "Bitmap width (pixels) [Note: Values larger than ~5000 may cause crashes.]",
735 if (returnString[0] ==
'\0')
737 const TString t(returnString);
739 B2ERROR(
"Given width is not a number!");
742 const int width = t.Atoi();
743 B2INFO(
"Saving bitmap (width: " << width <<
"px)...");
744 success = v->SavePictureWidth(fi.fFilename, width,
false);
748 B2INFO(
"Saved image in: " << fi.fFilename);
750 new TGMsgBox(gEve->GetBrowser()->GetClient()->GetDefaultRoot(), gEve->GetBrowser(),
"Saving image failed",
751 TString::Format(
"Couldn't save to '%s'! Please verify you used an appropriate image file extension in the file name. Check console output for further information.",
756 gEve->FullRedraw3D(
false);
761 B2INFO(
"Starting automatic run.");
773 B2INFO(
"Saving event " << i);
776 gEve->FullRedraw3D();
778 TEveViewerList* viewers = gEve->GetViewers();
779 TEveElement::List_ci end_it = viewers->EndChildren();
780 for (TEveElement::List_i it = viewers->BeginChildren(); it != end_it; ++it) {
781 TEveViewer* v =
static_cast<TEveViewer*
>(*it);
782 TGLViewer* glv = v->GetGLViewer();
784 TString projectionName(v->GetName());
785 projectionName.ReplaceAll(
" viewer",
"");
786 projectionName.ReplaceAll(
"/",
"");
788 const bool scalePixelObjects =
false;
789 TString name = TString::Format(
"%s_%s_%d.png",
m_autoFileNamePrefix->GetText(), projectionName.Data(), i);
790 glv->SavePictureWidth(name, width, scalePixelObjects);
806 if (state != (numEvents > 0))
813 gROOT->SetInterrupt();
820 gEve->GetBrowser()->Disconnect();
822 gEve->GetSelection()->Disconnect();
823 gEve->GetHighlight()->Disconnect();
825 gEve->GetBrowser()->UnmapWindow();
826 gEve->GetBrowser()->SendCloseMessage();
830 eventMetaData->setEndOfData();
835 static std::map<std::string, BrowsableWrapper*> wrapperMap;
836 for (
auto& entry : wrapperMap) {
841 static TGFileBrowser* fileBrowser = NULL;
843 gEve->GetBrowser()->StartEmbedding(0);
844 fileBrowser = gEve->GetBrowser()->MakeFileBrowser();
845 gEve->GetBrowser()->StopEmbedding(
"Histograms");
849 gEve->GetBrowser()->StartEmbedding(TRootBrowser::kRight);
850 TEveWindowSlot* slot = TEveWindow::CreateWindowMainFrame();
851 gEve->GetBrowser()->StopEmbedding();
852 slot->StartEmbedding();
854 slot->StopEmbedding(
"Canvas");
859 std::map<std::string, TVirtualPad*> nameMap;
860 for (
const auto& entry : padMap) {
861 nameMap[entry.second] = entry.first;
864 for (
unsigned int i = 0; i < displayData.
m_histograms.size(); i++) {
865 std::string name(displayData.
m_histograms.at(i)->GetName());
866 if (!wrapperMap[name])
869 wrapperMap[name]->setWrapped(displayData.
m_histograms.at(i));
872 if (nameMap.find(name) != nameMap.end()) {
873 TVirtualPad* oldGpad = gPad;
876 wrapper->Browse(fileBrowser->Browser());
881 fileBrowser->Add(wrapper);
889 const TObject* obj = array[pair.second];
893 B2WARNING(
"Cannot select object " << pair.first <<
"[" << pair.second <<
"], not found. Is the array available?");
static bool isAsync()
returns true if the current process is on the receiving (async) side of an AsyncWrapper.
static int numAvailableEvents()
Retun number of events available in the RingBuffer.
A wrapper for browsable objects to enable automatic redrawing.
static const std::map< TVirtualPad *, std::string > & getPads()
Get list of pads (static).
Add custom information to the display.
std::vector< TH1 * > m_histograms
Histograms to be shown in Eve.
std::vector< std::pair< std::string, unsigned int > > m_selectedObjects
List of selected objects (array name, index).
void clearEvent()
remove all event data in current event.
void next()
Go to next event.
TGLabel * m_eventLabel
show event/run/exp number for current event.
void handleEvent(Event_t *event)
Handles keyboard shortcuts.
long m_currentEntry
Current entry id.
std::vector< Parameter > m_paramList
List of run time configurable module parameters.
void startAutomaticRun()
switch to automatic mode, where visualisations are saved for each event, with no interactive control.
void autoAdvanceDelayChanged()
m_autoAdvanceDelay was changed, update m_timer if enabled.
void togglePlayPause()
Handle Play/Pause button clicks.
TGButton * m_prevButton
Button to switch to previous event.
void exit()
Close window and exit immediately.
bool m_automatic
If true, disable interactive control and call automaticEvent() instead.
bool getReturnValue() const
Return value for current event, only makes sense if allowFlaggingEvents(true) was called.
void setTitle(const std::string &fileName="")
Set title of Eve window.
DisplayUI(bool automatic=false, bool advance=false)
Constructor.
TEveElementList * m_eventData
List of event data, including projections.
void automaticEvent()
The actual per-event functionality for automatic saving.
void selectionHandler(TEveElement *eveObj)
Handle special actions when objects are selected.
void makeGui()
Build the buttons for event navigation.
void pollNewEvents()
Check if new events are available, and go to next event.
TGButton * m_nextButton
Button to switch to next event.
TGPictureButton * m_playPauseButton
Play / Pause button.
TTimer * m_timer
Polling/auto-advance timer.
void handleParameterChange(int id)
Called when one of the module parameters is changed via UI.
bool m_guiInitialized
Was GUI already built?
SplitGLView * getViewPane()
return right-side pane with viewers.
void toggleUndock()
dock/undock active viewer.
void updateUI()
Update UI after a new event was loaded, as well as m_currentEntry.
TGNumberEntry * m_autoAdvanceDelay
Delay for automatic advance, in seconds.
void goToEvent(Long_t id)
Go to event with index id.
TGNumberEntry * m_eventNumberWidget
Event switcher with numeric entry.
void addParameter(const std::string &label, ModuleParam< bool > ¶m, int level)
Generate UI elements so the given module parameter can be changed at run time.
void savePicture(bool highres=false)
Save the current view to a user-defined filename.
TGCheckButton * m_flagEvent
Show control for flagging events (to set module return value).
void toggleColorScheme()
Toggle between light and dark color scheme for viewers.
bool startDisplay()
Start interactive display for current event.
void showUserData(const DisplayData &displayData)
Add user-defined data (histograms, etc.).
void prev()
Go to previous event.
TGNumberEntry * m_autoPictureWidth
width of saved PNGs.
void goToEventWidget()
go to the event given by m_eventNumberWidget.
bool m_reshowCurrentEvent
Show current event again after startDisplay() returns?
bool m_advance
If true, start advancing through the events on startup.
TGTextEntry * m_autoFileNamePrefix
File name prefix (prefix + #event + "_" + projection + ".png").
void showJumpToEventDialog()
Show a dialog to to enter exp, run, event numbers.
void saveHiResPicture()
alias for savePicture(true).
SplitGLView * m_viewPane
pointer to right-side pane with viewers.
std::vector< std::string > m_hideObjects
objects which are to be hidden (can be manually re-enabled in tree view).
void allowFlaggingEvents(const std::string &description="")
Show control for flagging events (to set module return value).
bool m_cumulative
If true, DisplayModule shouldn't clear previous data (i.e.
Responsible for arranging the GL viewers and providing related functionality.
InfoWidget * getInfoWidget() const
text-based info viewer.
TEveProjectionManager * getRPhiMgr() const
return R-Phi projection manager.
TGLEmbeddedViewer * getActiveGLViewer()
return TGLEmbeddedViewer that is active right now.
TEveProjectionManager * getRhoZMgr() const
return Rho-Z projection manager.
Type-safe access to single objects in the data store.
const TObject * getDataStoreObject(TEveElement *elem) const
Get object represented by given visual representation.
static VisualRepMap * getInstance()
get instance pointer.
void selectRelated(TEveElement *eveObj) const
Select related objects.
void selectOnly(TEveElement *eveObj) const
Deselect all other objects.
void select(const TObject *object) const
Select the representation of the given object.
Abstract base class for different kinds of events.
Wraps a module parameter that can be toggled from the UI.