11 #include <ecl/modules/eclDisplay/EclFrame.h>
17 #include <TRootEmbeddedCanvas.h>
18 #include <TGDoubleSlider.h>
19 #include <TGNumberEntry.h>
20 #include <TGListTree.h>
21 #include <TGFileDialog.h>
24 #include <TGComboBox.h>
28 #include <ecl/modules/eclDisplay/geometry.h>
29 #include <ecl/utility/ECLChannelMapper.h>
30 #include <ecl/modules/eclDisplay/MultilineWidget.h>
31 #include <ecl/modules/eclDisplay/EclPainter.h>
32 #include <ecl/modules/eclDisplay/EclPainter1D.h>
36 using namespace ECLDisplayUtility;
41 "Encapsulated PostScript",
"*.eps",
46 "ROOT files",
"*.root",
59 m_subsys = EclData::ALL;
67 for (
int i = 1; i <= data->getCrystalCount(); i++) {
68 int phi_id = data->getPhiId(i);
69 int theta_id = data->getThetaId(i);
71 if (phi_id == -1 || theta_id == -1)
72 data->excludeChannel(i);
77 m_auto_display = auto_display;
79 gStyle->SetOptStat(0);
92 B2DEBUG(100,
"EclFrame:: initializing GUI.");
94 SetLayoutManager(
new TGVerticalLayout(
this));
95 TGCompositeFrame* frame_container =
new TGCompositeFrame(
this, w, h, kHorizontalFrame);
99 TGPopupMenu* menu_file =
new TGPopupMenu(gClient->GetRoot());
100 menu_file->AddEntry(
"&Open...", M_FILE_OPEN);
101 menu_file->AddEntry(
"&Export TTree...", M_FILE_EXPORT_TREE);
102 menu_file->AddEntry(
"&Save As...", M_FILE_SAVE);
103 menu_file->AddSeparator();
104 menu_file->AddEntry(
"&Exit", M_FILE_EXIT);
105 TGPopupMenu* menu_view =
new TGPopupMenu(gClient->GetRoot());
106 menu_view->AddEntry(
"&Show event counts in histograms", M_VIEW_EVENTS);
107 menu_view->AddEntry(
"&Show energy in histograms", M_VIEW_ENERGY);
108 menu_view->AddSeparator();
109 menu_view->AddEntry(
"&Show events from all ECL subsystems", M_VIEW_DET_FULL);
110 menu_view->AddEntry(
"&Show events from ECL barrel", M_VIEW_DET_BARR);
111 menu_view->AddEntry(
"&Show events from ECL forward endcap", M_VIEW_DET_FORW);
112 menu_view->AddEntry(
"&Show events from ECL backward endcap", M_VIEW_DET_BACK);
114 TGMenuBar* menubar =
new TGMenuBar(
this, w, 30);
115 menubar->AddPopup(
"&File", menu_file,
new TGLayoutHints(kLHintsTop | kLHintsLeft));
116 menubar->AddPopup(
"&View", menu_view,
new TGLayoutHints(kLHintsTop | kLHintsLeft));
118 menu_file->Connect(
"Activated(Int_t)",
"Belle2::EclFrame",
119 this,
"handleMenu(Int_t)");
120 menu_view->Connect(
"Activated(Int_t)",
"Belle2::EclFrame",
121 this,
"handleMenu(Int_t)");
123 AddFrame(menubar,
new TGLayoutHints(kLHintsExpandX | kLHintsTop, 0, 0, 1, 1));
127 m_settings =
new TGVerticalFrame(frame_container, w / 6, h);
131 TGComboBox* diagram_type =
new TGComboBox(m_settings, -1);
132 diagram_type->SetName(
"DiagramType");
135 for (
int i = 0; i < types_count; i++)
136 diagram_type->AddEntry(types_names[i], i);
137 diagram_type->Select(m_painter_type);
138 diagram_type->SetHeight(16);
139 m_settings->AddFrame(diagram_type,
new TGLayoutHints(kLHintsExpandX));
140 diagram_type->Connect(
"Selected(Int_t)",
"Belle2::EclFrame",
this,
141 "changeType(Int_t)");
146 m_frame1->setLineCount(4);
148 m_settings->AddFrame(m_frame1,
new TGLayoutHints(kLHintsExpandX));
152 m_frame2 =
new TGGroupFrame(m_settings,
"Range of displayed events");
153 m_frame2->SetLayoutManager(
new TGVerticalLayout(m_frame2));
155 TGHorizontalFrame* frame2_1 =
new TGHorizontalFrame(m_frame2);
156 TGLabel* ev_min_label =
new TGLabel(frame2_1,
"Min: ");
157 frame2_1->AddFrame(ev_min_label,
new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 2, 2, 2, 2));
158 m_events_min =
new TGNumberEntry(frame2_1, 0, 6, -1, TGNumberFormat::kNESInteger);
159 frame2_1->AddFrame(m_events_min,
new TGLayoutHints(kLHintsLeft, 2, 2, 2, 2));
160 TGLabel* ev_max_label =
new TGLabel(frame2_1,
"Max: ");
161 frame2_1->AddFrame(ev_max_label,
new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 2, 2, 2, 2));
162 m_events_max =
new TGNumberEntry(frame2_1, 0, 6, -1, TGNumberFormat::kNESInteger);
163 frame2_1->AddFrame(m_events_max,
new TGLayoutHints(kLHintsLeft, 2, 2, 2, 2));
164 m_frame2->AddFrame(frame2_1);
166 m_ev_slider =
new TGDoubleHSlider(m_frame2, w / 6, 2);
167 m_frame2->AddFrame(m_ev_slider,
new TGLayoutHints(kLHintsExpandX, 5, 5, 3, 4));
169 TGHorizontalFrame* frame2_2 =
new TGHorizontalFrame(m_frame2);
170 TGTextButton* prev =
new TGTextButton(frame2_2,
"&Prev");
171 prev->Connect(
"Clicked()",
"Belle2::EclFrame",
this,
"showPrevEvents()");
172 frame2_2->AddFrame(prev,
new TGLayoutHints(kLHintsLeft, 5, 5, 3, 4));
173 TGTextButton* next =
new TGTextButton(frame2_2,
"&Next");
174 next->Connect(
"Clicked()",
"Belle2::EclFrame",
this,
"showNextEvents()");
175 frame2_2->AddFrame(next,
new TGLayoutHints(kLHintsRight, 5, 5, 3, 4));
176 m_frame2->AddFrame(frame2_2,
new TGLayoutHints(kLHintsExpandX));
178 m_settings->AddFrame(m_frame2,
new TGLayoutHints(kLHintsExpandX, 2, 2, 2, 2));
184 m_frame3 =
new TGGroupFrame(m_settings,
"Displayed channels");
186 TGCanvas* list_canvas =
new TGCanvas(m_frame3, 1, 100);
187 m_list_tree =
new TGListTree(list_canvas, kHorizontalFrame);
188 m_list_tree->Associate(m_frame3);
189 TGListTreeItem* root = m_list_tree->AddItem(0,
"Detector");
190 m_list_tree->OpenItem(root);
191 for (
int i = 0; i < 52; i++) {
192 sprintf(temp,
"Collector %d", i);
193 TGListTreeItem* parent = m_list_tree->AddItem(root, temp);
194 parent->SetUserData((
void*)((intptr_t)i));
195 for (
int j = 0; j < 12; j++) {
196 sprintf(temp,
"Shaper %d", i * 12 + j);
197 TGListTreeItem* item = m_list_tree->AddItem(parent, temp);
198 item->SetUserData((
void*)((intptr_t)j));
202 m_list_tree->Connect(
"Clicked(TGListTreeItem*, Int_t)",
"Belle2::EclFrame",
this,
203 "changeRange(TGListTreeItem*, Int_t)");
205 m_frame3->AddFrame(list_canvas,
new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
206 m_settings->AddFrame(m_frame3,
new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 2, 2, 2, 2));
210 m_frame4 =
new TGGroupFrame(m_settings,
"Channel exclusion");
211 m_frame4->SetLayoutManager(
new TGHorizontalLayout(m_frame4));
212 m_channel_id =
new TGNumberEntry(m_frame4, 0, 6, -1, TGNumberFormat::kNESInteger);
213 m_frame4->AddFrame(m_channel_id,
new TGLayoutHints(kLHintsLeft, 2, 2, 2, 2));
214 TGTextButton* exclude =
new TGTextButton(m_frame4,
"&Exclude");
215 exclude->Connect(
"Clicked()",
"Belle2::EclFrame",
this,
"excludeChannel()");
216 m_frame4->AddFrame(exclude,
new TGLayoutHints(kLHintsRight, 5, 5, 3, 4));
218 m_settings->AddFrame(m_frame4,
new TGLayoutHints(kLHintsExpandX, 2, 2, 2, 2));
222 m_frame5 =
new TGGroupFrame(m_settings,
"Energy threshold");
223 TGHorizontalFrame* frame5_1 =
new TGHorizontalFrame(m_frame5);
224 frame5_1->SetLayoutManager(
new TGHorizontalLayout(frame5_1));
225 m_min_en_threshold =
new TGNumberEntry(frame5_1, 2.5, 6, -1);
226 TGLabel* min_lab =
new TGLabel(frame5_1,
"MeV");
227 m_max_en_threshold =
new TGNumberEntry(frame5_1, 150, 6, -1);
228 TGLabel* max_lab =
new TGLabel(frame5_1,
"MeV");
229 frame5_1->AddFrame(m_min_en_threshold,
new TGLayoutHints(kLHintsLeft, 2, 2, 2, 2));
230 frame5_1->AddFrame(min_lab,
new TGLayoutHints(kLHintsLeft, 2, 2, 2, 2));
231 frame5_1->AddFrame(max_lab,
new TGLayoutHints(kLHintsRight, 2, 2, 2, 2));
232 frame5_1->AddFrame(m_max_en_threshold,
new TGLayoutHints(kLHintsRight, 2, 2, 2, 2));
234 m_frame5->AddFrame(frame5_1);
235 m_threshold_switch =
new TGCheckButton(m_frame5,
"Enable energy threshold");
236 m_threshold_switch->SetState(kButtonDown);
237 m_frame5->AddFrame(m_threshold_switch);
239 m_settings->AddFrame(m_frame5,
new TGLayoutHints(kLHintsExpandX, 2, 2, 2, 2));
243 m_draw =
new TGTextButton(m_settings,
"&Draw");
244 m_draw->Connect(
"Clicked()",
"Belle2::EclFrame",
this,
"doDraw()");
245 m_settings->AddFrame(m_draw,
new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));
247 m_draw_all =
new TGTextButton(m_settings,
"&Draw All");
248 m_draw_all->Connect(
"Clicked()",
"Belle2::EclFrame",
this,
"doDrawAll()");
249 m_settings->AddFrame(m_draw_all,
new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));
253 frame_container->AddFrame(m_settings);
257 m_ecanvas =
new TRootEmbeddedCanvas(
"Ecanvas", frame_container, w / 2, h / 2);
258 m_ecanvas->GetCanvas()->SetRightMargin(0.125);
259 m_ecanvas->GetCanvas()->SetLeftMargin(0.1);
260 frame_container->AddFrame(m_ecanvas,
new TGLayoutHints(
261 kLHintsExpandX | kLHintsExpandY, 10, 10, 10, 1));
263 m_ecanvas->GetCanvas()->
264 Connect(
"TCanvas",
"ProcessedEvent(Int_t, Int_t, Int_t, TObject*)",
265 "Belle2::EclFrame",
this,
"updateInfo(Int_t, Int_t, Int_t, TObject*)");
269 AddFrame(frame_container,
new TGLayoutHints(kLHintsExpandX | kLHintsExpandY,
272 B2DEBUG(100,
"EclFrame:: GUI initialized.");
274 frame_container->SetMinWidth(w / 2);
278 SetWindowName(
"ECL Data");
283 B2DEBUG(100,
"EclFrame:: Initializing data.");
285 B2DEBUG(100,
"EclFrame:: Data initialized.");
290 m_events_min->SetLimits(TGNumberFormat::kNELLimitMinMax,
291 0, m_ecl_data->getLastEventId());
292 m_events_max->SetLimits(TGNumberFormat::kNELLimitMinMax,
293 0, m_ecl_data->getLastEventId());
295 B2DEBUG(500,
"Last event id: " << m_ecl_data->getLastEventId());
296 m_ev_slider->SetRange(0, m_ecl_data->getLastEventId());
297 m_ev_slider->SetPosition(0, 0);
298 m_ev_slider->Connect(
"TGDoubleHSlider",
"PositionChanged()",
299 "Belle2::EclFrame",
this,
"updateEventRange()");
305 static TString dir(
".");
312 fi.fIniDir = StrDup(dir);
313 new TGFileDialog(gClient->GetRoot(),
this, kFDOpen, &fi);
315 if (gSystem->AccessPathName(fi.fFilename, kFileExists) == 0) {
316 B2DEBUG(50,
"ECLFrame:: Opening file " << fi.fFilename);
317 m_ecl_data->loadRootFile(fi.fFilename);
324 fi.fFileTypes = filetypes;
325 fi.fIniDir = StrDup(dir);
326 new TGFileDialog(gClient->GetRoot(),
this, kFDSave, &fi);
327 B2DEBUG(50,
"Save file: " << fi.fFilename
328 <<
"(dir: " << fi.fIniDir <<
")");
329 m_ecanvas->GetCanvas()->SaveAs(fi.fFilename);
331 case M_FILE_EXPORT_TREE:
332 static const char* filetypes_root[] = {
"Root",
"*.root", 0, 0};
333 fi.fFileTypes = filetypes_root;
334 fi.fIniDir = StrDup(dir);
335 new TGFileDialog(gClient->GetRoot(),
this, kFDSave, &fi);
336 B2DEBUG(50,
"Save file: " << fi.fFilename
337 <<
"(dir: " << fi.fIniDir <<
")");
338 file =
new TFile(fi.fFilename,
"RECREATE");
339 m_ecl_data->getTree()->Write(
"tree");
353 case M_VIEW_DET_FULL:
354 m_subsys = EclData::ALL;
355 m_ecl_painter->setDisplayedSubsystem(m_subsys);
358 case M_VIEW_DET_BARR:
359 m_subsys = EclData::BARR;
360 m_ecl_painter->setDisplayedSubsystem(m_subsys);
363 case M_VIEW_DET_FORW:
364 m_subsys = EclData::FORW;
365 m_ecl_painter->setDisplayedSubsystem(m_subsys);
368 case M_VIEW_DET_BACK:
369 m_subsys = EclData::BACKW;
370 m_ecl_painter->setDisplayedSubsystem(m_subsys);
380 m_ev_slider->SetRange(0, m_ecl_data->getLastEventId());
381 m_events_min->SetLimits(TGNumberFormat::kNELLimitMinMax,
382 0, m_ecl_data->getLastEventId());
383 m_events_max->SetLimits(TGNumberFormat::kNELLimitMinMax,
384 0, m_ecl_data->getLastEventId());
386 if (m_last_event < m_ecl_data->getLastEventId() &&
387 (m_auto_display || m_last_event == -1)) {
389 if (m_last_event <= 1) {
392 m_settings->MapSubwindows();
395 m_ev_slider->SetPosition(0, 0);
403 TCanvas* fCanvas = m_ecanvas->GetCanvas();
407 m_ecl_painter->Draw();
408 updateInfo(51, 0, 0, 0);
414 Float_t ev_min, ev_max;
415 m_ev_slider->GetPosition(&ev_min, &ev_max);
417 m_events_min->SetNumber(ev_min);
418 m_events_max->SetNumber(ev_max);
420 m_ev_slider->MapWindow();
421 m_ev_slider->MapSubwindows();
426 Float_t ev_min, ev_max, diff;
428 ev_min = m_events_min->GetNumber();
429 ev_max = m_events_max->GetNumber();
434 diff = ev_max - ev_min + 1;
440 m_ev_slider->SetPosition(ev_min, ev_max);
447 Float_t ev_min, ev_max, diff;
449 ev_min = m_events_min->GetNumber();
450 ev_max = m_events_max->GetNumber();
452 if (ev_max >= m_ecl_data->getLastEventId())
455 diff = ev_max - ev_min + 1;
458 if (ev_max > m_ecl_data->getLastEventId())
459 ev_max = m_ecl_data->getLastEventId();
461 m_ev_slider->SetPosition(ev_min, ev_max);
468 int ch = m_channel_id->GetNumber();
469 m_ecl_data->excludeChannel(ch,
true);
475 m_ecl_data->setEventRange(m_events_min->GetIntNumber(),
476 m_events_max->GetIntNumber());
478 float en_min = m_min_en_threshold->GetNumber();
479 float en_max = m_max_en_threshold->GetNumber();
480 if (m_threshold_switch->GetState() == kButtonDown)
481 m_ecl_data->setEnergyThreshold(en_min, en_max);
483 m_ecl_data->setEnergyThreshold(0, -1);
490 m_ecl_data->setEventRange(0, m_ecl_data->getLastEventId());
500 if (new_painter != NULL) {
501 delete m_ecl_painter;
502 m_ecl_painter = new_painter;
511 m_ecl_painter->getInformation(px, py, m_frame1);
519 m_frame1->setLineCount(0);
523 TGListTreeItem* parent = entry->GetParent();
528 TGListTreeItem* grandparent = parent->GetParent();
532 long crate = (long)entry->GetUserData();
533 m_ecl_painter->setXRange(crate * 12, crate * 12 + 11);
538 long shaper = (long)entry->GetUserData();
539 long crate = (long)parent->GetUserData();
540 shaper = 12 * crate + shaper;
541 ((
EclPainter1D*)m_ecl_painter)->setShaper(crate + 1, shaper + 1);
556 delete m_ecl_painter;
557 m_ecl_painter = new_painter;
558 m_frame1->setLineCount(0);
559 m_ecanvas->GetCanvas()->Clear();
561 updateInfo(51, 0, 0, 0);