3 #include "TPCLoaderEditor.h"
4 #include <Alieve/TPCLoader.h>
5 #include <Alieve/TPCData.h>
6 #include <Reve/RGTopFrame.h>
7 #include <Reve/RGValuators.h>
10 #include <TVirtualPad.h>
15 #include <TGTextEntry.h>
16 #include <TGNumberEntry.h>
17 #include <TGFileDialog.h>
18 #include <TGToolTip.h>
21 using namespace Alieve;
23 //______________________________________________________________________
27 ClassImp(TPCLoaderEditor)
29 TPCLoaderEditor::TPCLoaderEditor(const TGWindow *p,
30 Int_t width, Int_t height,
31 UInt_t options, Pixel_t back) :
32 TGedFrame(p, width, height, options | kVerticalFrame, back),
42 fDataLoadThreshold (0),
43 fDataLoadPedestal (0),
44 fDataAutoPedestal (0),
51 MakeTitle("TPCLoader");
55 // File / event interface
59 TGHorizontalFrame* f = new TGHorizontalFrame(this);
60 TGHorizontalFrame* g = new TGHorizontalFrame(f, labelW, 0, kFixedWidth);
61 TGLabel* l = new TGLabel(g, "File: ");
62 g->AddFrame(l, new TGLayoutHints(kLHintsLeft, 0,0,4,0));
64 fFile = new TGTextEntry(f);
67 fFile->Connect("DoubleClicked()",
68 "Alieve::TPCLoaderEditor", this, "FileSelect()");
69 fFile->Connect("TextChanged(const char *)",
70 "Alieve::TPCLoaderEditor", this, "FileChanged()");
71 fOpenFile = new TGTextButton(f, "Open");
72 f->AddFrame(fOpenFile);
73 fOpenFile->Connect("Clicked()",
74 "Alieve::TPCLoaderEditor", this, "DoOpen()");
78 fEvent = new RGValuator(this, "Event:", 110, 0);
79 fEvent->SetShowSlider(kFALSE);
80 fEvent->SetLabelWidth(labelW);
81 fEvent->SetNELength(6);
83 fEvent->SetLimits(0, 1000);
84 fEvent->SetToolTip("Current event number");
85 fEvent->Connect("ValueSet(Double_t)",
86 "Alieve::TPCLoaderEditor", this, "DoEvent()");
87 // Reuse Event for DoubleSR button
88 fDoubleSR = new TGCheckButton(fEvent, "Double SR");
89 fDoubleSR->SetToolTipText("Double sampling rate");
90 fEvent->AddFrame(fDoubleSR, new TGLayoutHints(kLHintsLeft, 12, 0, 2, 0));
91 fDoubleSR->Connect("Toggled(Bool_t)",
92 "Alieve::TPCLoaderEditor", this, "DoDoubleSR()");
96 // TPCData load settings
100 fDataLoadThreshold = new RGValuator(this, "Load threshold:", 110, 0);
101 fDataLoadThreshold->SetShowSlider(kFALSE);
102 fDataLoadThreshold->SetLabelWidth(labelW);
103 fDataLoadThreshold->SetNELength(6);
104 fDataLoadThreshold->Build();
105 fDataLoadThreshold->SetLimits(0, 1000);
106 fDataLoadThreshold->SetToolTip("Minimum signal that will be stored (pedestal subtracted first).");
107 fDataLoadThreshold->Connect
108 ("ValueSet(Double_t)",
109 "Alieve::TPCLoaderEditor", this, "DoDataLoadThreshold()");
110 AddFrame(fDataLoadThreshold, new TGLayoutHints(kLHintsLeft, 0, 0, 6, 0));
112 fDataLoadPedestal = new RGValuator(this, "Load pedestal:", 110, 0);
113 fDataLoadPedestal->SetShowSlider(kFALSE);
114 fDataLoadPedestal->SetLabelWidth(labelW);
115 fDataLoadPedestal->SetNELength(6);
116 fDataLoadPedestal->Build();
117 fDataLoadPedestal->SetLimits(0, 1000);
118 fDataLoadPedestal->SetToolTip("Pedestal that will be subtracted during data loading.");
119 fDataLoadPedestal->Connect
120 ("ValueSet(Double_t)",
121 "Alieve::TPCLoaderEditor", this, "DoDataLoadPedestal()");
122 // Reuse DataLoadPedestal for DataAutoPedestal check button
123 fDataAutoPedestal = new TGCheckButton(fDataLoadPedestal, "Automatic");
124 fDataAutoPedestal->SetToolTipText("Determine per-pad pedestal during data loading.");
125 fDataAutoPedestal->Connect
127 "Alieve::TPCLoaderEditor", this, "DoDataAutoPedestal()");
128 fDataLoadPedestal->AddFrame(fDataAutoPedestal, new TGLayoutHints(kLHintsLeft, 12, 0, 2, 0));
129 AddFrame(fDataLoadPedestal);
131 // Steering buttons: update/reload sectors; show/hide 3d
134 TGHorizontalFrame* f = new TGHorizontalFrame(this);
135 fUpdateSectors = new TGTextButton(f, "Update Sectors");
136 f->AddFrame(fUpdateSectors, new TGLayoutHints(kLHintsExpandX, 0,4,0,0));
137 fUpdateSectors->Connect("Clicked()",
138 "Alieve::TPCLoaderEditor", this, "DoUpdateSectors()");
139 fReloadSectors = new TGTextButton(f, "Reload Sectors");
140 f->AddFrame(fReloadSectors, new TGLayoutHints(kLHintsExpandX, 4,0,0,0));
141 fReloadSectors->Connect("Clicked()",
142 "Alieve::TPCLoaderEditor", this, "DoReloadSectors()");
143 AddFrame(f, new TGLayoutHints(kLHintsExpandX, 8,8,8,0));
146 TGHorizontalFrame* f = new TGHorizontalFrame(this);
147 fCreateSectors3D = new TGTextButton(f, "Create 3D");
148 f->AddFrame(fCreateSectors3D, new TGLayoutHints(kLHintsExpandX, 0,4,0,0));
149 fCreateSectors3D->Connect("Clicked()",
150 "Alieve::TPCLoaderEditor", this, "DoCreateSectors3D()");
151 fDeleteSectors3D = new TGTextButton(f, "Delete 3D");
152 f->AddFrame(fDeleteSectors3D, new TGLayoutHints(kLHintsExpandX, 4,0,0,0));
153 fDeleteSectors3D->Connect("Clicked()",
154 "Alieve::TPCLoaderEditor", this, "DoDeleteSectors3D()");
155 AddFrame(f, new TGLayoutHints(kLHintsExpandX, 8,8,8,0));
159 TPCLoaderEditor::~TPCLoaderEditor()
162 /**************************************************************************/
164 void TPCLoaderEditor::SetModel(TObject* obj)
166 fM = dynamic_cast<TPCLoader*>(obj);
168 // !!!! order changed, need TGTextEntry::SetText NO BLOODY EMIT.
169 fFile->SetToolTipText(gSystem->DirName(fM->fFile));
170 fFile->SetText(gSystem->BaseName(fM->fFile));
171 fEvent->SetValue(fM->fEvent);
172 fEvent->SetEnabled(fM->fEvent >= 0);
173 fDoubleSR->SetState(fM->fDoubleSR ? kButtonDown : kButtonUp);
175 TPCData* tpcd = fM->GetData();
176 Bool_t tpcp = (tpcd != 0);
177 fDataLoadThreshold->SetEnabled(tpcp);
178 fDataLoadPedestal ->SetEnabled(tpcp && ! tpcd->GetAutoPedestal());
179 fDataAutoPedestal ->SetEnabled(tpcp);
181 fDataLoadThreshold->SetValue(tpcd->GetLoadThreshold());
182 fDataLoadPedestal ->SetValue(tpcd->GetLoadPedestal());
183 fDataAutoPedestal ->SetState(tpcd->GetAutoPedestal() ? kButtonDown : kButtonUp);
187 /**************************************************************************/
188 /**************************************************************************/
191 const char *tpcfiletypes[] = {
192 "Root files", "*.root",
198 void TPCLoaderEditor::FileSelect()
201 fi.fIniDir = StrDup(gSystem->DirName (fM->fFile));
202 fi.fFilename = StrDup(gSystem->BaseName(fM->fFile));
203 fi.fFileTypes = tpcfiletypes;
205 new TGFileDialog(fClient->GetRoot(), gReve, kFDOpen, &fi);
209 fFile->SetToolTipText(gSystem->DirName (fi.fFilename));
210 fFile->SetText (gSystem->BaseName(fi.fFilename));
213 void TPCLoaderEditor::FileChanged()
215 fM->fFile = Form("%s/%s", fFile->GetToolTip()->GetText()->Data(),
219 void TPCLoaderEditor::DoOpen()
225 /**************************************************************************/
227 void TPCLoaderEditor::DoEvent()
229 fM->GotoEvent((Int_t) fEvent->GetValue());
233 void TPCLoaderEditor::DoDoubleSR()
235 fM->SetDoubleSR(fDoubleSR->IsOn());
239 /**************************************************************************/
241 void TPCLoaderEditor::DoDataLoadThreshold()
243 if (fM->GetData() == 0) return;
244 fM->GetData()->SetLoadThreshold((Short_t) fDataLoadThreshold->GetValue());
247 void TPCLoaderEditor::DoDataLoadPedestal()
249 if (fM->GetData() == 0) return;
250 fM->GetData()->SetLoadPedestal((Short_t) fDataLoadPedestal->GetValue());
253 void TPCLoaderEditor::DoDataAutoPedestal()
255 if (fM->GetData() == 0) return;
256 fM->GetData()->SetAutoPedestal(fDataAutoPedestal->IsOn());
257 fDataLoadPedestal->SetEnabled(!fDataAutoPedestal->IsOn());
260 /**************************************************************************/
262 void TPCLoaderEditor::DoUpdateSectors()
267 void TPCLoaderEditor::DoReloadSectors()
272 void TPCLoaderEditor::DoCreateSectors3D()
274 fM->CreateSectors3D();
278 void TPCLoaderEditor::DoDeleteSectors3D()
280 fM->DeleteSectors3D();