12 #include <framework/core/ModuleParam.h>
14 #include <framework/dataobjects/DisplayData.h>
15 #include <display/DisplayUI.h>
16 #include <display/VisualRepMap.h>
17 #include <display/BrowsableWrapper.h>
18 #include <display/SplitGLView.h>
19 #include <display/InfoWidget.h>
21 #include <framework/core/InputController.h>
22 #include <framework/datastore/StoreObjPtr.h>
23 #include <framework/datastore/StoreArray.h>
24 #include <framework/dataobjects/EventMetaData.h>
25 #include <framework/logging/Logger.h>
26 #include <framework/pcore/AsyncWrapper.h>
28 #include <TApplication.h>
30 #include <TEveBrowser.h>
31 #include <TEveManager.h>
32 #include <TEveEventManager.h>
33 #include <TEveSelection.h>
34 #include <TEveScene.h>
35 #include <TEveViewer.h>
37 #include <TGFileBrowser.h>
40 #include <TGNumberEntry.h>
42 #include <TGFileDialog.h>
43 #include <TGInputDialog.h>
44 #include <TGTextEntry.h>
45 #include <TGLViewer.h>
46 #include <TGLWidget.h>
51 #include <sys/prctl.h>
60 m_automatic(automatic)
63 prctl(PR_SET_PDEATHSIG, SIGHUP);
66 B2INFO(
"Creating TEve window.");
71 TEveBrowser* browser = gEve->GetBrowser();
72 browser->HideBottomTab();
73 browser->StartEmbedding(TRootBrowser::kRight);
75 browser->StopEmbedding();
78 browser->Resize(TGDimension(1200, 1000));
118 std::string title(
"Belle II Event Display");
119 if (!fileName.empty())
120 title +=
" - " + fileName;
122 TEveBrowser* browser = gEve->GetBrowser();
123 browser->SetWindowName(title.c_str());
127 std::string label =
"Flag this Event";
128 if (!description.empty())
129 label +=
" for " + description;
131 m_flagEvent =
new TGCheckButton(
nullptr, label.c_str());
163 if (!eventMetaData) {
164 m_eventLabel->SetText(
"No EventMetaData object available.");
166 time_t secondsSinceEpoch = eventMetaData->getTime() / 1e9;
168 char date[30] =
"<Invalid time>";
169 if (secondsSinceEpoch == 0)
171 else if (
auto gmt = gmtime(&secondsSinceEpoch))
172 strftime(date, 30,
"<%Y-%m-%d %H:%M:%S UTC>", gmt);
173 m_eventLabel->SetText(TString::Format(
"Event: \t\t%u\nRun: \t\t%d\nExperiment: \t%d\n\n%s",
174 eventMetaData->getEvent(),
175 eventMetaData->getRun(), eventMetaData->getExperiment(),
180 gVirtualX->SetCursor(gEve->GetBrowser()->GetId(), gVirtualX->CreateCursor(kPointer));
188 if (numEntries > 0 and
id >= numEntries)
195 B2ERROR(
"Cannot switch to event " <<
id <<
", only works in conjunction with RootInput.");
199 B2DEBUG(100,
"Switching to event " <<
id);
204 gVirtualX->SetCursor(gEve->GetBrowser()->GetId(), gVirtualX->CreateCursor(kWatch));
212 gSystem->ProcessEvents();
214 B2DEBUG(100,
"exiting event loop now.");
223 B2DEBUG(100,
"Switching to event " << event <<
" in run " << run <<
", experiment " << experiment);
224 gVirtualX->SetCursor(gEve->GetBrowser()->GetId(), gVirtualX->CreateCursor(kWatch));
227 B2DEBUG(100,
"exiting event loop now.");
246 const TString icondir(Form(
"%s/icons/", gSystem->Getenv(
"ROOTSYS")));
256 m_timer->Connect(
"Timeout()",
"Belle2::DisplayUI",
this,
"next()");
257 m_timer->Start(pollIntervalMs);
258 m_playPauseButton->SetPicture(gClient->GetPicture(icondir +
"ed_interrupt.png"));
268 char returnString[256];
269 new TGInputDialog(gEve->GetBrowser()->GetClient()->GetDefaultRoot(), gEve->GetBrowser(),
270 "Jump to event '#evt/#run/#exp':",
271 TString::Format(
"%u/%d/%d", eventMetaData->getEvent(), eventMetaData->getRun(), eventMetaData->getExperiment()),
273 if (returnString[0] ==
'\0')
276 unsigned int event, run, exp;
277 returnString[255] =
'\0';
278 if (sscanf(returnString,
"%u/%u/%u", &event, &run, &exp) != 3) {
279 B2WARNING(
"Wrong format!");
290 gEve->AddEvent(
new TEveEventManager());
292 if (gEve->GetCurrentEvent())
293 gEve->GetCurrentEvent()->DestroyElements();
308 if (representedObject)
317 if (event->fType == kGKeyPress) {
319 switch (event->fCode) {
333 if (event->fState & kKeyControlMask)
346 TTimer* t =
new TTimer();
347 const int pollIntervalMs = 300;
348 t->Connect(
"Timeout()",
"Belle2::DisplayUI",
this,
"pollNewEvents()");
349 t->Start(pollIntervalMs);
353 TEveScene* gs = gEve->GetGlobalScene();
356 rphiManager->ImportElements(gs);
360 rhozManager->ImportElements(gs);
364 gEve->GetSelection()->Connect(
"SelectionAdded(TEveElement*)",
"Belle2::DisplayUI",
this,
"selectionHandler(TEveElement*)");
365 gEve->GetSelection()->Connect(
"SelectionRepeated(TEveElement*)",
"Belle2::DisplayUI",
this,
"selectionHandler(TEveElement*)");
375 TGListTreeItem* eventItem = gEve->GetListTree()->FindItemByPathname(
"Event");
376 TGListTreeItem* item = gEve->GetListTree()->FindChildByName(eventItem, name.c_str());
378 B2INFO(
"hiding object '" << name <<
"'.");
379 TEveElement* eveItem =
static_cast<TEveElement*
>(item->GetUserData());
380 eveItem->SetRnrSelfChildren(
false,
false);
382 B2ERROR(
"hideObjects: '" << name <<
"' not found.");
388 gEve->Redraw3D(
false);
395 gApplication->Run(
true);
409 TEveBrowser* browser = gEve->GetBrowser();
410 const int margin = 3;
412 browser->Connect(
"CloseWindow()",
"Belle2::DisplayUI",
this,
"exit()");
415 browser->Connect(
"ProcessedEvent(Event_t*)",
"Belle2::DisplayUI",
this,
"handleEvent(Event_t*)");
416 TEveViewerList* viewers = gEve->GetViewers();
417 TEveElement::List_ci end_it = viewers->EndChildren();
418 for (TEveElement::List_i it = viewers->BeginChildren(); it != end_it; ++it) {
419 TEveViewer* v =
static_cast<TEveViewer*
>(*it);
420 TGLViewer* glv = v->GetGLViewer();
421 glv->GetGLWidget()->Connect(
"ProcessedEvent(Event_t*)",
"Belle2::DisplayUI",
this,
"handleEvent(Event_t*)");
425 browser->StartEmbedding(TRootBrowser::kLeft);
427 TGMainFrame* frmMain =
new TGMainFrame(gClient->GetRoot(), 240, 600);
428 frmMain->SetWindowName(
"Event control main frame");
429 frmMain->SetCleanup(kDeepCleanup);
431 const TString icondir(Form(
"%s/icons/", gSystem->Getenv(
"ROOTSYS")));
433 TGGroupFrame* event_frame =
new TGGroupFrame(frmMain);
434 event_frame->SetTitle(
"Event");
436 TGHorizontalFrame* hf =
new TGHorizontalFrame(event_frame);
438 m_prevButton =
new TGPictureButton(hf, gClient->GetPicture(icondir +
"GoBack.gif"));
439 m_prevButton->SetToolTipText(
"Go to previous event (Page Up)");
440 hf->AddFrame(
m_prevButton,
new TGLayoutHints(kLHintsLeft | kLHintsCenterY, margin, margin, margin, margin));
441 m_prevButton->Connect(
"Clicked()",
"Belle2::DisplayUI",
this,
"prev()");
445 TGNumberFormat::kNEANonNegative,
446 TGNumberFormat::kNELLimitMinMax,
449 hf->AddFrame(
m_eventNumberWidget,
new TGLayoutHints(kLHintsLeft | kLHintsCenterY, margin, margin, margin, margin));
451 m_eventNumberWidget->Connect(
"ValueSet(Long_t)",
"Belle2::DisplayUI",
this,
"goToEventWidget()");
452 m_eventNumberWidget->GetNumberEntry()->Connect(
"ReturnPressed()",
"Belle2::DisplayUI",
this,
"goToEventWidget()");
455 if (numEntries > 0) {
456 TGLabel* maxEvents =
new TGLabel(hf, TString::Format(
"/%ld", numEntries - 1));
457 hf->AddFrame(maxEvents,
new TGLayoutHints(kLHintsLeft | kLHintsCenterY, margin, margin, margin, margin));
460 m_nextButton =
new TGPictureButton(hf, gClient->GetPicture(icondir +
"GoForward.gif"));
461 m_nextButton->SetToolTipText(
"Go to next event (Page Down)");
462 hf->AddFrame(
m_nextButton,
new TGLayoutHints(kLHintsLeft | kLHintsCenterY, margin, margin, margin, margin));
463 m_nextButton->Connect(
"Clicked()",
"Belle2::DisplayUI",
this,
"next()");
465 event_frame->AddFrame(hf,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 0, 0, 0, 0));
467 hf =
new TGHorizontalFrame(event_frame);
472 TGLabel* delayLabel =
new TGLabel(hf,
"Delay (s):");
473 hf->AddFrame(delayLabel,
new TGLayoutHints(kLHintsLeft | kLHintsCenterY, margin, margin, margin, margin));
475 const double valueSeconds = async ? 0.5 : 3.5;
476 m_autoAdvanceDelay =
new TGNumberEntry(hf, valueSeconds, 3, 999, TGNumberFormat::kNESRealOne,
477 TGNumberFormat::kNEAPositive,
478 TGNumberFormat::kNELLimitMin,
481 hf->AddFrame(
m_autoAdvanceDelay,
new TGLayoutHints(kLHintsLeft | kLHintsCenterY, margin, margin, margin, margin));
483 m_autoAdvanceDelay->Connect(
"ValueSet(Long_t)",
"Belle2::DisplayUI",
this,
"autoAdvanceDelayChanged()");
484 m_autoAdvanceDelay->GetNumberEntry()->Connect(
"ReturnPressed()",
"Belle2::DisplayUI",
this,
"autoAdvanceDelayChanged()");
486 m_playPauseButton =
new TGPictureButton(hf, gClient->GetPicture(icondir +
"ed_execute.png"));
488 m_playPauseButton->SetToolTipText(
"Advance automatically to next event after the given delay.");
489 hf->AddFrame(
m_playPauseButton,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, margin, margin, margin, margin));
490 m_playPauseButton->Connect(
"Clicked()",
"Belle2::DisplayUI",
this,
"togglePlayPause()");
492 event_frame->AddFrame(hf,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 0, 0, 0, 0));
494 TGButton* jumpToEventButton =
new TGTextButton(event_frame,
"Jump to event/run/exp...");
496 jumpToEventButton->SetToolTipText(
"Find a given entry identified by an event / run / experiment triplet in the current file");
497 event_frame->AddFrame(jumpToEventButton,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, margin, margin, margin, margin));
498 jumpToEventButton->Connect(
"Clicked()",
"Belle2::DisplayUI",
this,
"showJumpToEventDialog()");
501 event_frame->AddFrame(
m_eventLabel,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, margin, margin, margin, margin));
506 m_flagEvent =
new TGCheckButton(event_frame, descr);
507 m_flagEvent->SetToolTipText(
"Set return value to true for this event");
509 event_frame->AddFrame(
m_flagEvent,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, margin, margin, margin, margin));
512 frmMain->AddFrame(event_frame,
new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
514 TGGroupFrame* param_frame =
new TGGroupFrame(frmMain);
515 param_frame->SetTitle(
"Options");
518 for (
int i = 0; i < nParams; i++) {
519 TGCheckButton* b =
new TGCheckButton(param_frame,
m_paramList[i].m_label.c_str(), i);
520 b->SetToolTipText(
m_paramList[i].m_param->getDescription().c_str());
521 b->SetState(
m_paramList[i].m_param->getValue() ? kButtonDown : kButtonUp);
522 b->Connect(
"Clicked()",
"Belle2::DisplayUI",
this, TString::Format(
"handleParameterChange(=%d)", i));
524 param_frame->AddFrame(b,
new TGLayoutHints(kLHintsExpandX | kLHintsCenterY, indentation, margin, margin, margin));
528 frmMain->AddFrame(param_frame,
new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
531 TGGroupFrame* viewer_frame =
new TGGroupFrame(frmMain);
532 viewer_frame->SetTitle(
"Current Viewer");
534 TGHorizontalFrame* hf =
new TGHorizontalFrame(viewer_frame);
537 b =
new TGTextButton(hf,
"Save As...");
538 b->SetToolTipText(
"Save a bitmap graphic for the current viewer");
539 hf->AddFrame(b,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, margin + 1, margin, margin, margin));
540 b->Connect(
"Clicked()",
"Belle2::DisplayUI",
this,
"savePicture()");
542 b =
new TGTextButton(hf,
"Save As (High-Res)... ");
543 b->SetToolTipText(
"Save a bitmap graphic for the current viewer with user-specified size");
544 hf->AddFrame(b,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, margin, margin, margin, margin));
545 b->Connect(
"Clicked()",
"Belle2::DisplayUI",
this,
"saveHiResPicture()");
548 viewer_frame->AddFrame(hf,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 0, 0, 0, 0));
550 hf =
new TGHorizontalFrame(viewer_frame);
552 b =
new TGTextButton(hf,
"Dock/Undock Viewer");
553 b->SetToolTipText(
"Move current viewer into it's own window, or back to its original position");
554 hf->AddFrame(b,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, margin, margin, margin, margin));
555 b->Connect(
"Clicked()",
"Belle2::DisplayUI",
this,
"toggleUndock()");
557 viewer_frame->AddFrame(hf,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 0, 0, 0, 0));
559 frmMain->AddFrame(viewer_frame,
new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
562 TGGroupFrame* visOptionsFrame =
new TGGroupFrame(frmMain);
563 visOptionsFrame->SetTitle(
"Visualisation Options");
565 TGHorizontalFrame* hf =
new TGHorizontalFrame(visOptionsFrame);
567 TGButton* b =
new TGTextButton(hf,
"Dark/light colors");
568 b->SetToolTipText(
"Toggle background color");
569 hf->AddFrame(b,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, margin, margin, margin, margin));
570 b->Connect(
"Clicked()",
"Belle2::DisplayUI",
this,
"toggleColorScheme()");
572 visOptionsFrame->AddFrame(hf,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 0, 0, 0, 0));
575 TGCheckButton* c =
new TGCheckButton(visOptionsFrame,
"Cumulative mode (experimental)");
576 c->SetToolTipText(
"Do not erase previous event, i.e. show data from multiple events. This is quite unstable and will crash sooner or later.");
578 c->Connect(
"Clicked()",
"Belle2::DisplayUI",
this,
"toggleCumulative()");
579 visOptionsFrame->AddFrame(c,
new TGLayoutHints(kLHintsExpandX | kLHintsCenterY, 0, margin, margin, margin));
582 frmMain->AddFrame(visOptionsFrame,
new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
585 TGGroupFrame* automatisation_frame =
new TGGroupFrame(frmMain);
586 automatisation_frame->SetTitle(
"Automatic Saving (experimental)");
588 TGHorizontalFrame* hf =
new TGHorizontalFrame(automatisation_frame);
590 TGLabel* prefixLabel =
new TGLabel(hf,
"Prefix:");
591 hf->AddFrame(prefixLabel,
new TGLayoutHints(kLHintsLeft | kLHintsCenterY, margin, margin, margin, margin));
594 hf->AddFrame(
m_autoFileNamePrefix,
new TGLayoutHints(kLHintsLeft | kLHintsCenterY, margin, margin, margin, margin));
596 automatisation_frame->AddFrame(hf,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 0, 0, 0, 0));
598 hf =
new TGHorizontalFrame(automatisation_frame);
600 TGLabel* widthLabel =
new TGLabel(hf,
"Width (px):");
601 hf->AddFrame(widthLabel,
new TGLayoutHints(kLHintsLeft | kLHintsCenterY, margin, margin, margin, margin));
604 TGNumberFormat::kNEANonNegative,
605 TGNumberFormat::kNELLimitMinMax,
607 hf->AddFrame(
m_autoPictureWidth,
new TGLayoutHints(kLHintsLeft | kLHintsCenterY, margin, margin, margin, margin));
609 TGButton* b =
new TGTextButton(hf,
"Save PNGs");
610 b->SetToolTipText(
"Save bitmap graphics for all further events. Cannot be aborted. (EXPERIMENTAL)");
611 hf->AddFrame(b,
new TGLayoutHints(kLHintsLeft | kLHintsCenterY, margin, margin, margin, margin));
612 b->Connect(
"Clicked()",
"Belle2::DisplayUI",
this,
"startAutomaticRun()");
614 automatisation_frame->AddFrame(hf,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 0, 0, 0, 0));
617 frmMain->AddFrame(automatisation_frame,
new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
620 TGGroupFrame* exit_frame =
new TGGroupFrame(frmMain);
621 exit_frame->SetTitle(
"Closing");
623 TGHorizontalFrame* hf =
new TGHorizontalFrame(exit_frame);
625 TGButton* b =
new TGTextButton(hf,
" Exit ");
626 b->SetToolTipText(
"Close the display and stop basf2 after this event.");
627 hf->AddFrame(b,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, margin, margin, margin, margin));
628 b->Connect(
"Clicked()",
"Belle2::DisplayUI",
this,
"exit()");
631 exit_frame->AddFrame(hf,
new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 0, 0, 0, 0));
634 frmMain->AddFrame(exit_frame,
new TGLayoutHints(kLHintsExpandX | kLHintsBottom, 0, 0, 0, 0));
637 frmMain->MapSubwindows();
639 frmMain->MapWindow();
640 browser->StopEmbedding(
"Event Control");
646 B2ERROR(
"widget ID too large!");
659 TEveViewerList* viewers = gEve->GetViewers();
660 TEveElement::List_ci end_it = viewers->EndChildren();
661 for (TEveElement::List_i it = viewers->BeginChildren(); it != end_it; ++it) {
662 TEveViewer* v =
static_cast<TEveViewer*
>(*it);
663 TGLViewer* glv = v->GetGLViewer();
665 bool dark = glv->ColorSet().Background().GetColorIndex() != kWhite;
666 glv->RefLightColorSet().Background().SetColor(kWhite);
667 glv->RefDarkColorSet().Background().SetColor(kBlack);
669 glv->UseLightColorSet();
671 glv->UseDarkColorSet();
679 TEveViewerList* viewers = gEve->GetViewers();
680 TEveElement::List_ci end_it = viewers->EndChildren();
681 TEveViewer* activeViewer =
nullptr;
682 for (TEveElement::List_i it = viewers->BeginChildren(); it != end_it; ++it) {
683 TEveViewer* v =
static_cast<TEveViewer*
>(*it);
684 if (v->GetGLViewer() == activeGLviewer) {
691 B2ERROR(
"No active viewer. Please select one by clicking on it.");
695 TEveCompositeFrameInMainFrame* packFrame =
dynamic_cast<TEveCompositeFrameInMainFrame*
>(activeViewer->GetEveFrame());
698 activeViewer->UndockWindow();
701 packFrame->MainFrameClosed();
707 const char* filetypes[] = {
708 "PNG (bitmap)",
"*.png",
709 "PDF (experimental!)",
"*.pdf",
714 fi.fFileTypes = filetypes;
717 new TGFileDialog(gEve->GetBrowser()->GetClient()->GetDefaultRoot(), gEve->GetBrowser(), kFDSave, &fi);
721 bool success =
false;
723 success = v->SavePicture(fi.fFilename);
725 char returnString[256];
726 new TGInputDialog(gEve->GetBrowser()->GetClient()->GetDefaultRoot(), gEve->GetBrowser(),
727 "Bitmap width (pixels) [Note: Values larger than ~5000 may cause crashes.]",
730 if (returnString[0] ==
'\0')
732 const TString t(returnString);
734 B2ERROR(
"Given width is not a number!");
737 const int width = t.Atoi();
738 B2INFO(
"Saving bitmap (width: " << width <<
"px)...");
739 success = v->SavePictureWidth(fi.fFilename, width,
false);
743 B2INFO(
"Saved image in: " << fi.fFilename);
745 new TGMsgBox(gEve->GetBrowser()->GetClient()->GetDefaultRoot(), gEve->GetBrowser(),
"Saving image failed",
746 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.",
751 gEve->FullRedraw3D(
false);
756 B2INFO(
"Starting automatic run.");
768 B2INFO(
"Saving event " << i);
771 gEve->FullRedraw3D();
773 TEveViewerList* viewers = gEve->GetViewers();
774 TEveElement::List_ci end_it = viewers->EndChildren();
775 for (TEveElement::List_i it = viewers->BeginChildren(); it != end_it; ++it) {
776 TEveViewer* v =
static_cast<TEveViewer*
>(*it);
777 TGLViewer* glv = v->GetGLViewer();
779 TString projectionName(v->GetName());
780 projectionName.ReplaceAll(
" viewer",
"");
781 projectionName.ReplaceAll(
"/",
"");
783 const bool scalePixelObjects =
false;
784 TString name = TString::Format(
"%s_%s_%d.png",
m_autoFileNamePrefix->GetText(), projectionName.Data(), i);
785 glv->SavePictureWidth(name, width, scalePixelObjects);
801 if (state != (numEvents > 0))
808 gROOT->SetInterrupt();
815 gEve->GetBrowser()->Disconnect();
817 gEve->GetSelection()->Disconnect();
818 gEve->GetHighlight()->Disconnect();
820 gEve->GetBrowser()->UnmapWindow();
821 gEve->GetBrowser()->SendCloseMessage();
825 eventMetaData->setEndOfData();
830 static std::map<std::string, BrowsableWrapper*> wrapperMap;
831 for (
auto& entry : wrapperMap) {
836 static TGFileBrowser* fileBrowser = NULL;
838 gEve->GetBrowser()->StartEmbedding(0);
839 fileBrowser = gEve->GetBrowser()->MakeFileBrowser();
840 gEve->GetBrowser()->StopEmbedding(
"Histograms");
844 gEve->GetBrowser()->StartEmbedding(TRootBrowser::kRight);
845 TEveWindowSlot* slot = TEveWindow::CreateWindowMainFrame();
846 gEve->GetBrowser()->StopEmbedding();
847 slot->StartEmbedding();
849 slot->StopEmbedding(
"Canvas");
854 std::map<std::string, TVirtualPad*> nameMap;
855 for (
const auto& entry : padMap) {
856 nameMap[entry.second] = entry.first;
859 for (
unsigned int i = 0; i < displayData.
m_histograms.size(); i++) {
860 std::string name(displayData.
m_histograms.at(i)->GetName());
861 if (!wrapperMap[name])
864 wrapperMap[name]->setWrapped(displayData.
m_histograms.at(i));
867 if (nameMap.find(name) != nameMap.end()) {
868 TVirtualPad* oldGpad = gPad;
871 wrapper->Browse(fileBrowser->Browser());
876 fileBrowser->Add(wrapper);
884 const TObject* obj = array[pair.second];
888 B2WARNING(
"Cannot select object " << pair.first <<
"[" << pair.second <<
"], not found. Is the array available?");