3 #include "TPCLoaderEditor.h"
4 #include <Alieve/TPCLoader.h>
5 #include <Alieve/TPCData.h>
6 #include <Reve/ReveManager.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->SetText(fM->fFile);
170 fEvent->SetValue(fM->fEvent);
171 fEvent->SetEnabled(fM->fEvent >= 0);
172 fDoubleSR->SetState(fM->fDoubleSR ? kButtonDown : kButtonUp);
174 TPCData* tpcd = fM->GetData();
175 Bool_t tpcp = (tpcd != 0);
176 fDataLoadThreshold->SetEnabled(tpcp);
177 fDataLoadPedestal ->SetEnabled(tpcp && ! tpcd->GetAutoPedestal());
178 fDataAutoPedestal ->SetEnabled(tpcp);
180 fDataLoadThreshold->SetValue(tpcd->GetLoadThreshold());
181 fDataLoadPedestal ->SetValue(tpcd->GetLoadPedestal());
182 fDataAutoPedestal ->SetState(tpcd->GetAutoPedestal() ? kButtonDown : kButtonUp);
186 /**************************************************************************/
187 /**************************************************************************/
190 const char *tpcfiletypes[] = {
191 "Root files", "*.root",
197 void TPCLoaderEditor::FileSelect()
200 fi.fIniDir = StrDup(gSystem->DirName (fM->fFile));
201 fi.fFilename = StrDup(gSystem->BaseName(fM->fFile));
202 fi.fFileTypes = tpcfiletypes;
204 new TGFileDialog(fClient->GetRoot(), gReve->GetMainWindow(), kFDOpen, &fi);
208 fFile->SetText(fi.fFilename);
211 void TPCLoaderEditor::FileChanged()
213 fM->fFile = fFile->GetText();
216 void TPCLoaderEditor::DoOpen()
222 /**************************************************************************/
224 void TPCLoaderEditor::DoEvent()
226 fM->GotoEvent((Int_t) fEvent->GetValue());
230 void TPCLoaderEditor::DoDoubleSR()
232 fM->SetDoubleSR(fDoubleSR->IsOn());
236 /**************************************************************************/
238 void TPCLoaderEditor::DoDataLoadThreshold()
240 if (fM->GetData() == 0) return;
241 fM->GetData()->SetLoadThreshold((Short_t) fDataLoadThreshold->GetValue());
244 void TPCLoaderEditor::DoDataLoadPedestal()
246 if (fM->GetData() == 0) return;
247 fM->GetData()->SetLoadPedestal((Short_t) fDataLoadPedestal->GetValue());
250 void TPCLoaderEditor::DoDataAutoPedestal()
252 if (fM->GetData() == 0) return;
253 fM->GetData()->SetAutoPedestal(fDataAutoPedestal->IsOn());
254 fDataLoadPedestal->SetEnabled(!fDataAutoPedestal->IsOn());
257 /**************************************************************************/
259 void TPCLoaderEditor::DoUpdateSectors()
264 void TPCLoaderEditor::DoReloadSectors()
269 void TPCLoaderEditor::DoCreateSectors3D()
271 fM->CreateSectors3D();
275 void TPCLoaderEditor::DoDeleteSectors3D()
277 fM->DeleteSectors3D();