ATTPCROOT  0.3.0-alpha
A ROOT-based framework for analyzing data from active target detectors
AtSidebarFrames.cxx
Go to the documentation of this file.
1 #include "AtSidebarFrames.h"
2 // IWYU pragma: no_include <ext/alloc_traits.h>
3 
4 #include "AtMap.h" // for AtMap
5 #include "AtPadReference.h" // for AtPadReference
6 #include "AtViewerManager.h" // for AtViewerManager
7 
8 #include <FairRootManager.h> // for FairRootManager
9 #include <FairRunAna.h> // for FairRunAna
10 
11 #include <TChain.h> // for TChain
12 #include <TFile.h> // for TFile
13 #include <TGButton.h> // for TGTextButton, TGButton, TGPictureButton
14 #include <TGClient.h> // for TGClient, gClient
15 #include <TGComboBox.h> // for TGComboBox
16 #include <TGLabel.h> // for TGLabel
17 #include <TGLayout.h> // for TGLayoutHints, kLHintsExpandX, kLHints...
18 #include <TGNumberEntry.h> // for TGNumberEntry, TGNumberFormat, TGNumbe...
19 #include <TSystem.h> // for TSystem, gSystem
20 
21 #include <algorithm> // for find
22 #include <iterator> // for begin, distance, end
23 #include <memory> // for allocator, allocator_traits<>::value_type
24 
25 class TGWindow;
26 namespace DataHandling {
27 class AtSubject;
28 }
29 
30 TString AtSidebarRunInfo::GetFileName(TString filePath)
31 {
32  TString tok;
33  Ssiz_t loc = 0;
34  TString name;
35  while (filePath.Tokenize(tok, loc, "/")) {
36  name = tok;
37  continue;
38  }
39 
40  return name;
41 }
43 {
44  TString Infile = "Input file : ";
45  TFile *file = FairRootManager::Instance()->GetInChain()->GetFile();
46 
47  fRunFile = new TGLabel(this, (Infile + file->GetName()).Data());
48 
49  // If the file path is too long to fit in the sidebar, just grab the file name
50  if (fRunFile->GetWidth() > this->GetWidth()) {
51  delete fRunFile;
52  TString fileName = GetFileName(file->GetName());
53  fRunFile = new TGLabel(this, (Infile + fileName).Data());
54  }
55 
56  this->AddFrame(fRunFile);
57 
58  UInt_t RunId = FairRunAna::Instance()->getRunId();
59  TString run = "Run Id : ";
60  run += RunId;
61  fRunId = new TGLabel(this, run.Data());
62  this->AddFrame(fRunId);
63 
64  TString nevent = "No of events : ";
65  nevent += FairRootManager::Instance()->GetInChain()->GetEntriesFast();
66  fRunLength = new TGLabel(this, nevent.Data());
67  this->AddFrame(fRunLength);
68 }
69 AtSidebarPadControl::AtSidebarPadControl(DataHandling::AtPadNum &entryNum, const TGWindow *p, UInt_t w, UInt_t h,
70  UInt_t options, Pixel_t back)
71  : AtVerticalSidebarFrame(p, w, h, options, back), fPadNum(entryNum)
72 {
73  fPadNum.Attach(this);
74 }
76 {
77  fPadNum.Detach(this);
78 }
79 
81 {
82  /**** Pad Selection *****/
83  fCurrentPadFrame = new TGHorizontalFrame(this);
84  fCurrentPadLabel = new TGLabel(fCurrentPadFrame, "Current Pad: ");
85 
86  fCurrentPadEntry =
87  new TGNumberEntry(fCurrentPadFrame, 0., 6, -1, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber,
88  TGNumberFormat::kNELLimitMinMax, -1, AtViewerManager::Instance()->GetMap()->GetNumPads());
89 
90  fCurrentPadEntry->Connect("ValueSet(Long_t)", "AtSidebarPadControl", this, "SelectPad()");
91 
92  fCurrentPadFrame->AddFrame(fCurrentPadLabel, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 1, 2, 1, 1));
93  fCurrentPadFrame->AddFrame(fCurrentPadEntry);
94 
95  fRedrawPadButton = new TGTextButton(fCurrentPadFrame, "Redraw Pad");
96  fRedrawPadButton->Connect("Clicked()", "AtSidebarPadControl", this, "SelectPad()");
97  fCurrentPadFrame->AddFrame(fRedrawPadButton, new TGLayoutHints(kLHintsCenterY, 1, 1, 1, 1));
98  this->AddFrame(fCurrentPadFrame, new TGLayoutHints());
99 
100  fCurrentPadId = new TGLabel(this, fPadRefString);
101  this->AddFrame(fCurrentPadId, new TGLayoutHints(kLHintsCenterX | kLHintsExpandX));
102 }
103 
105 {
106  if (changedSubject == &fPadNum && fCurrentPadEntry) {
107  fCurrentPadEntry->SetIntNumber(fPadNum.Get());
108  auto ref = AtViewerManager::Instance()->GetMap()->GetPadRef(fPadNum.Get());
109  fCurrentPadId->SetText(TString::Format(fPadRefString, ref.cobo, ref.asad, ref.aget, ref.ch));
110  // this->Layout();
111  }
112 }
114 {
115  fPadNum.Set(fCurrentPadEntry->GetIntNumber(), false);
116  fPadNum.Notify();
117 }
118 
119 AtSidebarEventControl::AtSidebarEventControl(DataHandling::AtTreeEntry &entryNum, const TGWindow *p, UInt_t w, UInt_t h,
120  UInt_t options, Pixel_t back)
121  : AtVerticalSidebarFrame(p, w, h, options, back), fEntryNumber(entryNum)
122 {
123  fEntryNumber.Attach(this);
124 }
126 {
127  fEntryNumber.Detach(this);
128 }
129 
131 {
132  if (changedSubject == &fEntryNumber && fCurrentEventEntry)
133  fCurrentEventEntry->SetIntNumber(fEntryNumber.Get());
134 }
135 
137 {
138  fEntryNumber.Set(fCurrentEventEntry->GetIntNumber());
139 }
140 
142 {
143  fEntryNumber.Set(fEntryNumber.Get());
144 }
145 
147 {
148  /**** Event Selection *****/
149  fCurrentEventFrame = new TGHorizontalFrame(this);
150  fCurrentEventLabel = new TGLabel(fCurrentEventFrame, "Current Event: ");
151 
152  fCurrentEventEntry = new TGNumberEntry(fCurrentEventFrame, 0., 6, -1, TGNumberFormat::kNESInteger,
153  TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELLimitMinMax, 0,
154  FairRootManager::Instance()->GetInChain()->GetEntriesFast());
155 
156  fCurrentEventEntry->Connect("ValueSet(Long_t)", "AtSidebarEventControl", this, "SelectEvent()");
157 
158  fCurrentEventFrame->AddFrame(fCurrentEventLabel, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 1, 2, 1, 1));
159  fCurrentEventFrame->AddFrame(fCurrentEventEntry);
160 
161  this->AddFrame(fCurrentEventFrame, new TGLayoutHints(kLHintsExpandX));
162 
163  /*** Button Frame ****/
164  fButtonFrame = new TGHorizontalFrame(this); // Navigation button frame
165  {
166  TString icondir(Form("%s/icons/", gSystem->Getenv("VMCWORKDIR")));
167 
168  TGButton *b = nullptr;
169  if (kUsePictureButtons)
170  b = new TGPictureButton(fButtonFrame, gClient->GetPicture(icondir + "arrow_left.gif"));
171  else
172  b = new TGTextButton(fButtonFrame, "Prev");
173 
174  fButtonFrame->AddFrame(b, new TGLayoutHints(kLHintsCenterY, 1, 1, 1, 1));
175  b->Connect("Clicked()", "AtViewerManager", AtViewerManager::Instance(), "PrevEvent()");
176 
177  if (kUsePictureButtons)
178  b = new TGPictureButton(fButtonFrame, gClient->GetPicture(icondir + "arrow_right.gif"));
179  else
180  b = new TGTextButton(fButtonFrame, "Next");
181  fButtonFrame->AddFrame(b, new TGLayoutHints(kLHintsCenterY, 1, 1, 1, 1));
182  b->Connect("Clicked()", "AtViewerManager", AtViewerManager::Instance(), "NextEvent()");
183 
184  fRerunButton = new TGTextButton(fButtonFrame, "Rerun Event");
185  fRerunButton->Connect("Clicked()", "AtSidebarEventControl", this, "RedrawEvent()");
186  fButtonFrame->AddFrame(fRerunButton, new TGLayoutHints(kLHintsCenterY, 1, 1, 1, 1));
187  }
188  this->AddFrame(fButtonFrame, new TGLayoutHints(kLHintsCenterX));
189 }
190 
192  DataHandling::AtBranch &patternEvent, const TGWindow *p, UInt_t w,
193  UInt_t h, UInt_t options, Pixel_t back)
194  : AtVerticalSidebarFrame(p, w, h, options, back)
195 {
196 
197  fBranches.insert({"AtRawEvent", rawEvent});
198  fBranches.insert({"AtEvent", event});
199  fBranches.insert({"AtPatternEvent", patternEvent});
200 
201  for (auto &[className, branch] : fBranches)
202  branch.Attach(this);
203 }
204 
206 {
207  // this->AddFrame(new TGLabel(this, "Selected Branches"), new TGLayoutHints(kLHintsCenterX));
208  auto frame = new TGHorizontalFrame(this);
209 
210  fLabels = new TGVerticalFrame(frame);
211  fBoxes = new TGVerticalFrame(frame);
212 
213  FillBranchFrame("Raw Event: ", "AtRawEvent");
214  FillBranchFrame("Event: ", "AtEvent");
215  FillBranchFrame("Pattern Event: ", "AtPatternEvent");
216 
217  // Resize boxes
218  for (auto &[name, box] : fBranchBoxes)
219  box->SetWidth(125);
220 
221  frame->AddFrame(fLabels);
222  frame->AddFrame(fBoxes);
223  this->AddFrame(frame, new TGLayoutHints(kLHintsExpandX));
224 }
225 
231 void AtSidebarBranchControl::FillBranchFrame(std::string label, std::string className)
232 {
233  auto &branchMap = AtViewerManager::Instance()->GetBranchNames();
234  if (branchMap.find(className) == branchMap.end())
235  return;
236 
237  auto labelf = new TGLabel(fLabels, label.data());
238  fLabels->AddFrame(labelf, new TGLayoutHints(kLHintsRight));
239 
240  auto &branchNames = branchMap.at(className);
241  fBranchBoxes[className] = new TGComboBox(fBoxes);
242  for (int i = 0; i < branchNames.size(); ++i)
243  fBranchBoxes[className]->AddEntry(branchNames[i], i);
244  fBranchBoxes[className]->Connect("Selected(Int_t)", "AtSidebarBranchControl", this,
245  TString::Format("Selected%s(Int_t)", className.data()));
246  fBranchBoxes[className]->Select(0);
247 
248  fBranchBoxes[className]->SetHeight(labelf->GetHeight());
249  fBoxes->AddFrame(fBranchBoxes[className], new TGLayoutHints(kLHintsExpandX));
250 }
251 
253 {
254  for (auto &[className, branch] : fBranches)
255  branch.Detach(this);
256 }
257 
258 int AtSidebarBranchControl::GetIndex(TString val, const std::vector<TString> &vec)
259 {
260  auto iter = std::find(begin(vec), end(vec), val);
261  if (iter == vec.end())
262  return -1;
263  else
264  return std::distance(begin(vec), iter);
265 }
266 
267 void AtSidebarBranchControl::SelectEvent(Int_t ind, TString className)
268 {
269  if (ind < 0)
270  return;
271  auto name = AtViewerManager::Instance()->GetBranchNames().at(className.Data()).at(ind);
272  fBranchBoxes[className]->Select(ind);
273  fBranches.at(className).SetBranchName(name);
274 }
275 
277 {
278  SelectEvent(ind, "AtRawEvent");
279 }
280 
282 {
283  SelectEvent(ind, "AtEvent");
284 }
285 
287 {
288  SelectEvent(ind, "AtPatternEvent");
289 }
290 
292 {
293  auto &branchNames = AtViewerManager::Instance()->GetBranchNames();
294 
295  for (auto &[name, branch] : fBranches)
296  if (changedSubject == &branch)
297  fBranchBoxes[name]->Select(GetIndex(branch.GetBranchName(), branchNames.at(name)));
298 }
AtSidebarEventControl::FillFrame
void FillFrame() override
Definition: AtSidebarFrames.cxx:146
DataHandling::AtTreeEntry::Set
void Set(long entry)
Definition: AtViewerManagerSubject.cxx:10
AtSidebarBranchControl::AtSidebarBranchControl
AtSidebarBranchControl(DataHandling::AtBranch &rawEvent, DataHandling::AtBranch &event, DataHandling::AtBranch &patternEvent, const TGWindow *p=nullptr, UInt_t w=1, UInt_t h=1, UInt_t options=0, Pixel_t back=GetDefaultFrameBackground())
Definition: AtSidebarFrames.cxx:191
DataHandling::AtBranch
Subject for the branch in the FairRoot tree.
Definition: AtViewerManagerSubject.h:38
AtPadReference.h
AtSidebarEventControl::RedrawEvent
void RedrawEvent()
Definition: AtSidebarFrames.cxx:141
AtSidebarPadControl::Update
void Update(DataHandling::AtSubject *changedSubject) override
Definition: AtSidebarFrames.cxx:104
AtSidebarBranchControl::SelectedAtPatternEvent
void SelectedAtPatternEvent(Int_t)
Definition: AtSidebarFrames.cxx:286
DataHandling::AtSimpleType
Subject for any simple type.
Definition: AtDataSubject.h:51
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
AtSidebarBranchControl::SelectEvent
void SelectEvent(Int_t ind, TString className)
Definition: AtSidebarFrames.cxx:267
DataHandling::AtSubject::Notify
void Notify()
Notify all attached subjects that something changed.
Definition: AtDataSubject.cxx:7
AtSidebarPadControl::SelectPad
void SelectPad()
Definition: AtSidebarFrames.cxx:113
AtSidebarPadControl::AtSidebarPadControl
AtSidebarPadControl(DataHandling::AtPadNum &padNum, const TGWindow *p=nullptr, UInt_t w=1, UInt_t h=1, UInt_t options=0, Pixel_t back=GetDefaultFrameBackground())
Definition: AtSidebarFrames.cxx:69
AtSidebarFrame::kUsePictureButtons
bool kUsePictureButtons
Option to disable picture buttons since they break some machines.
Definition: AtSidebarFrames.h:33
AtVerticalSidebarFrame
Definition: AtSidebarFrames.h:53
AtViewerManager::GetMap
AtMap * GetMap()
Definition: AtViewerManager.h:66
AtSidebarBranchControl::Update
void Update(DataHandling::AtSubject *changedSubject) override
Definition: AtSidebarFrames.cxx:291
DataHandling
Definition: AtDataObserver.h:4
AtViewerManager::GetBranchNames
std::map< TString, std::vector< TString > > const & GetBranchNames() const
Definition: AtViewerManager.h:68
AtSidebarEventControl::~AtSidebarEventControl
~AtSidebarEventControl()
Definition: AtSidebarFrames.cxx:125
AtSidebarEventControl::Update
void Update(DataHandling::AtSubject *changedSubject) override
Definition: AtSidebarFrames.cxx:130
DataHandling::AtSimpleType::Get
T Get() const
Definition: AtDataSubject.h:57
AtSidebarRunInfo::FillFrame
void FillFrame() override
Definition: AtSidebarFrames.cxx:42
AtSidebarPadControl::~AtSidebarPadControl
~AtSidebarPadControl()
Definition: AtSidebarFrames.cxx:75
DataHandling::AtSubject::Attach
void Attach(AtObserver *observer)
Attach an observer to get notified when this subject changes.
Definition: AtDataSubject.cxx:12
AtSidebarBranchControl::~AtSidebarBranchControl
~AtSidebarBranchControl()
Definition: AtSidebarFrames.cxx:252
AtMap.h
DataHandling::AtSubject
Definition: AtDataSubject.h:24
AtSidebarBranchControl::SelectedAtRawEvent
void SelectedAtRawEvent(Int_t)
Definition: AtSidebarFrames.cxx:276
AtSidebarEventControl::SelectEvent
void SelectEvent()
Definition: AtSidebarFrames.cxx:136
AtSidebarPadControl::FillFrame
void FillFrame() override
Definition: AtSidebarFrames.cxx:80
AtSidebarBranchControl::SelectedAtEvent
void SelectedAtEvent(Int_t)
Definition: AtSidebarFrames.cxx:281
DataHandling::AtSimpleType::Set
void Set(T data, bool notify=true)
Definition: AtDataSubject.h:58
DataHandling::AtTreeEntry
Subject for the entry number in the FairRoot tree.
Definition: AtViewerManagerSubject.h:17
AtViewerManager.h
AtSidebarBranchControl::FillFrame
void FillFrame() override
Definition: AtSidebarFrames.cxx:205
AtMap::GetPadRef
AtPadReference GetPadRef(int padNum) const
Definition: AtMap.cxx:281
AtSidebarEventControl::AtSidebarEventControl
AtSidebarEventControl(DataHandling::AtTreeEntry &entryNum, const TGWindow *p=nullptr, UInt_t w=1, UInt_t h=1, UInt_t options=0, Pixel_t back=GetDefaultFrameBackground())
Definition: AtSidebarFrames.cxx:119
AtSidebarFrames.h
DataHandling::AtTreeEntry::Get
long Get() const
Definition: AtViewerManagerSubject.h:23