ATTPCROOT  0.3.0-alpha
A ROOT-based framework for analyzing data from active target detectors
AtViewerManager.cxx
Go to the documentation of this file.
1 #include "AtViewerManager.h"
2 
3 #include "AtEventSidebar.h" // for AtEventSidebar
4 #include "AtRawEvent.h"
5 #include "AtSidebarFrames.h"
6 #include "AtTabBase.h" // for AtTabBase
7 
8 #include <FairLogger.h> // for Logger, LOG
9 #include <FairRootManager.h> // for FairRootManager
10 #include <FairRunAna.h> // for FairRunAna
11 
12 #include <Rtypes.h> // for ClassImp, Long64_t, TGenericClassInfo
13 #include <TClonesArray.h>
14 #include <TEveBrowser.h> // for TEveBrowser
15 #include <TEveManager.h> // for TEveManager, gEve
16 #include <TList.h> // for TList
17 #include <TObject.h> // for TObject
18 #include <TRootBrowser.h> // for TRootBrowser, TRootBrowser::kLeft
19 #include <TString.h> // for TString, operator<<, operator<
20 #include <TStyle.h> // for TStyle, gStyle
21 
22 #include <GuiTypes.h> // for kHorizontalFrame
23 
24 #include <iostream> // for operator<<, endl, basic_ostream, cout
25 #include <utility> // for move
26 
27 namespace DataHandling {
28 class AtSubject;
29 }
30 
31 constexpr auto cRED = "\033[1;31m";
32 constexpr auto cYELLOW = "\033[1;33m";
33 constexpr auto cNORMAL = "\033[0m";
34 constexpr auto cGREEN = "\033[1;32m";
35 constexpr auto cBLUE = "\033[1;34m";
36 constexpr auto cWHITERED = "\033[37;41m";
37 
38 using namespace std;
39 
41 
42 AtViewerManager *AtViewerManager::fInstance = nullptr;
44 {
45  return fInstance;
46 }
47 
48 AtViewerManager::AtViewerManager(std::shared_ptr<AtMap> map) : fMap(std::move(map))
49 {
50  if (fInstance != nullptr)
51  LOG(fatal) << "Attempting to create a second instance of AtViewerManager! Only one is allowed!";
52  fInstance = this;
53 
54  // In order to get the sidebar to actually be *in* the sidebar we need to create the EveManager
55  // and embedd it there.
56  TEveManager::Create(true, "IV"); // Create a mapped manager without the file viewer
57  TEveBrowser *browser = gEve->GetBrowser();
58 
59  // Create and embed the sidebar
60  browser->StartEmbedding(TRootBrowser::kLeft);
61 
62  fSidebar = new AtEventSidebar();
63  fSidebar->AddSidebarFrame(new AtSidebarRunInfo(fSidebar));
64  fSidebar->AddSidebarFrame(new AtSidebarPadControl(fPadNum, fSidebar));
65 
66  browser->StopEmbedding();
67  browser->SetTabTitle("Control", TRootBrowser::kLeft);
68 
69  // Create and embed the basebar
70  browser->StartEmbedding(TRootBrowser::kBottom);
71 
72  fBasebar = new AtEventSidebar(kHorizontalFrame);
73  fBasebar->AddSidebarFrame(new AtSidebarEventControl(fEntry, fBasebar));
74  fBasebar->AddSidebarFrame(new AtSidebarBranchControl(fRawEventBranch, fEventBranch, fPatternEventBranch, fBasebar));
75 
76  browser->StopEmbedding();
77  browser->SetTabTitle("Control", TRootBrowser::kBottom);
78 
79  fEntry.Attach(this);
80 }
81 
83 {
84  fInstance = nullptr;
85  fEntry.Detach(this);
86 }
87 
88 void AtViewerManager::AddTask(FairTask *task)
89 {
90  FairRunAna::Instance()->AddTask(task);
91 }
92 void AtViewerManager::AddTab(std::unique_ptr<AtTabBase> tab)
93 {
94  fTabs.push_back(std::move(tab));
95 }
96 
98 {
99  // gStyle->SetOptTitle(0);
100  gStyle->SetPalette(55);
101 
102  FairRunAna::Instance()->Init();
103  for (auto &tab : fTabs)
104  tab->Init();
105 
106  // Everything is loaded so construct the list of branch names
107  GenerateBranchLists();
108 
109  fSidebar->FillFrames(); // Creates the entire sidebar GUI
110  fBasebar->FillFrames(); // Creates the entire basebar GUI
111 
112  FairRootManager *ioMan = FairRootManager::Instance();
113  if (ioMan == nullptr) {
114  LOG(fatal) << "Cannot find RootManager!";
115  }
116 
117  GotoEvent(0);
118  std::cout << "End of AtViewerManager" << std::endl;
119 }
120 
121 void AtViewerManager::GenerateBranchLists()
122 {
123  LOG(info) << "Generating branch list";
124 
125  auto ioMan = FairRootManager::Instance();
126  GotoEvent(0);
127 
128  // Loop through the entire branch list and map class type to branch name in fBranchNames
129  for (int i = 0; i < ioMan->GetBranchNameList()->GetSize(); i++) {
130 
131  auto branchName = ioMan->GetBranchName(i);
132  auto branchArray = dynamic_cast<TClonesArray *>(ioMan->GetObject(branchName));
133  if (branchArray == nullptr)
134  continue;
135 
136  // Loop until there is something in this branch
137  int event = 0;
138  while (branchArray->GetEntries() == 0 && event < 5) {
139  GotoEvent(event++);
140  }
141 
142  if (branchArray->GetEntries() == 0) {
143  LOG(error) << "Failed to find type of branch " << branchName << std::endl;
144 
145  continue;
146  }
147  LOG(debug) << "Examining " << branchArray->At(0);
148  LOG(debug) << "With type " << branchArray->At(0)->ClassName();
149 
150  if (branchArray->At(0) == nullptr)
151  LOG(error) << "Failed to determine type of " << branchName << "! The TCLonesArray contains a nullptr.";
152 
153  auto type = branchArray->At(0)->ClassName();
154  fBranchNames[type].push_back(branchName);
155  LOG(info) << "Found " << branchName << " with type " << type << std::endl;
156  }
157  LOG(info) << "Done generating branch list";
158 }
159 
160 void AtViewerManager::GotoEventImpl()
161 {
162  for (auto &tab : fTabs)
163  tab->Exec();
164 
165  fPadNum.Notify(); // Inform everyone they should act as is the pad changed
166 }
167 
169 {
170  if (subject == &fEntry) {
171  GotoEventImpl();
172  }
173 }
174 
176 {
177  while (true) {
178  GotoEvent(fEntry.Get() + 1);
179  if (fCheckGood == false) {
180  return;
181  } else if (fCheckEvt->GetInfo()->IsGood())
182  return;
183  }
184 }
185 
187 {
188  while (true) {
189  GotoEvent(fEntry.Get() - 1);
190  if (fCheckGood == false) {
191  return;
192  } else if (fCheckEvt->GetInfo()->IsGood())
193  return;
194  }
195 }
AtRawEvent.h
AtViewerManager::AddTask
void AddTask(FairTask *task)
Definition: AtViewerManager.cxx:88
AtViewerManager::GotoEvent
virtual void GotoEvent(Int_t event)
Definition: AtViewerManager.h:87
AtSidebarRunInfo
Definition: AtSidebarFrames.h:74
AtViewerManager::AtViewerManager
AtViewerManager(std::shared_ptr< AtMap > map)
Definition: AtViewerManager.cxx:48
AtViewerManager::AddTab
void AddTab(std::unique_ptr< AtTabBase > tab)
Definition: AtViewerManager.cxx:92
AtViewerManager::Init
void Init()
Definition: AtViewerManager.cxx:97
AtSidebarPadControl
Definition: AtSidebarFrames.h:92
AtViewerManager::PrevEvent
void PrevEvent()
Definition: AtViewerManager.cxx:186
DataHandling::AtSubject::Detach
void Detach(AtObserver *observer)
Detach an observer to stop getting notified when this subject changes.
Definition: AtDataSubject.h:37
AtViewerManager::Instance
static AtViewerManager * Instance()
Definition: AtViewerManager.cxx:43
AtEventSidebar::AddSidebarFrame
void AddSidebarFrame(AtSidebarFrame *frame)
Definition: AtEventSidebar.cxx:28
AtViewerManager::~AtViewerManager
~AtViewerManager()
Definition: AtViewerManager.cxx:82
AtSidebarBranchControl
Definition: AtSidebarFrames.h:137
cGREEN
constexpr auto cGREEN
Definition: AtViewerManager.cxx:34
DataHandling::AtSubject::Notify
void Notify()
Notify all attached subjects that something changed.
Definition: AtDataSubject.cxx:7
AtViewerManager::NextEvent
void NextEvent()
Definition: AtViewerManager.cxx:175
cNORMAL
constexpr auto cNORMAL
Definition: AtViewerManager.cxx:33
cRED
constexpr auto cRED
Definition: AtViewerManager.cxx:31
AtEventSidebar.h
cBLUE
constexpr auto cBLUE
Definition: AtViewerManager.cxx:35
cYELLOW
constexpr auto cYELLOW
Definition: AtViewerManager.cxx:32
ClassImp
ClassImp(AtViewerManager)
DataHandling
Definition: AtDataObserver.h:4
AtViewerManager::Update
virtual void Update(DataHandling::AtSubject *) override
Definition: AtViewerManager.cxx:168
cWHITERED
constexpr auto cWHITERED
Definition: AtViewerManager.cxx:36
AtEventSidebar
Definition: AtEventSidebar.h:15
AtTabBase.h
AtViewerManager
Definition: AtViewerManager.h:33
DataHandling::AtSubject::Attach
void Attach(AtObserver *observer)
Attach an observer to get notified when this subject changes.
Definition: AtDataSubject.cxx:12
DataHandling::AtSubject
Definition: AtDataSubject.h:24
AtSidebarEventControl
Definition: AtSidebarFrames.h:114
AtViewerManager.h
AtSidebarFrames.h
AtEventSidebar::FillFrames
void FillFrames()
Actually generate content of the frames once Init has run.
Definition: AtEventSidebar.cxx:11
DataHandling::AtTreeEntry::Get
long Get() const
Definition: AtViewerManagerSubject.h:23