]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EVE/Alieve/TPCLoaderEditor.cxx
3c89a5e835db03f6f6eb3b85d92d454b170f6f06
[u/mrichter/AliRoot.git] / EVE / Alieve / TPCLoaderEditor.cxx
1 // $Header$
2
3 #include "TPCLoaderEditor.h"
4 #include <Alieve/TPCLoader.h>
5 #include <Alieve/TPCData.h>
6 #include <Reve/ReveManager.h>
7 #include <Reve/RGValuators.h>
8
9 #include <TSystem.h>
10 #include <TVirtualPad.h>
11 #include <TColor.h>
12
13 #include <TGLabel.h>
14 #include <TGButton.h>
15 #include <TGTextEntry.h>
16 #include <TGNumberEntry.h>
17 #include <TGFileDialog.h>
18 #include <TGToolTip.h>
19
20 using namespace Reve;
21 using namespace Alieve;
22
23 //______________________________________________________________________
24 // TPCLoaderEditor
25 //
26
27 ClassImp(TPCLoaderEditor)
28
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),
33
34     fM (0),
35
36     fFile     (0),
37     fOpenFile (0),
38
39     fEvent    (0),
40     fDoubleSR (0),
41
42     fDataLoadThreshold (0),
43     fDataLoadPedestal  (0),
44     fDataAutoPedestal  (0),
45
46     fUpdateSectors   (0),
47     fReloadSectors   (0),
48     fCreateSectors3D (0),
49     fDeleteSectors3D (0)
50 {
51   MakeTitle("TPCLoader");
52
53   Int_t labelW;
54
55   // File / event interface
56
57   labelW = 42;
58   {
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));
63     f->AddFrame(g);
64     fFile = new TGTextEntry(f);
65     fFile->SetWidth(140);
66     f->AddFrame(fFile);
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()");
75     AddFrame(f);
76   }
77
78   fEvent = new RGValuator(this, "Event:", 110, 0);
79   fEvent->SetShowSlider(kFALSE);
80   fEvent->SetLabelWidth(labelW);
81   fEvent->SetNELength(6);
82   fEvent->Build();
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()");
93   AddFrame(fEvent);
94
95
96   // TPCData load settings
97
98   labelW = 90;
99
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));
111
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
126     ("Toggled(Bool_t)",
127      "Alieve::TPCLoaderEditor", this, "DoDataAutoPedestal()");
128   fDataLoadPedestal->AddFrame(fDataAutoPedestal, new TGLayoutHints(kLHintsLeft, 12, 0, 2, 0));
129   AddFrame(fDataLoadPedestal);
130
131   // Steering buttons: update/reload sectors; show/hide 3d
132
133   {
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));
144   }
145   {
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));
156   }
157 }
158
159 TPCLoaderEditor::~TPCLoaderEditor()
160 {}
161
162 /**************************************************************************/
163
164 void TPCLoaderEditor::SetModel(TObject* obj)
165 {
166   fM = dynamic_cast<TPCLoader*>(obj);
167
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);
173
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);
179   if (tpcp) {
180     fDataLoadThreshold->SetValue(tpcd->GetLoadThreshold());
181     fDataLoadPedestal ->SetValue(tpcd->GetLoadPedestal());
182     fDataAutoPedestal ->SetState(tpcd->GetAutoPedestal() ? kButtonDown : kButtonUp);
183   }
184 }
185
186 /**************************************************************************/
187 /**************************************************************************/
188
189 namespace {
190 const char *tpcfiletypes[] = {
191    "Root files",  "*.root",
192    "All files",   "*.*",
193     0,               0
194 };
195 }
196
197 void TPCLoaderEditor::FileSelect()
198 {
199   TGFileInfo fi;
200   fi.fIniDir    = StrDup(gSystem->DirName (fM->fFile));
201   fi.fFilename  = StrDup(gSystem->BaseName(fM->fFile));
202   fi.fFileTypes = tpcfiletypes;
203
204   new TGFileDialog(fClient->GetRoot(), gReve->GetMainWindow(), kFDOpen, &fi);
205   if (!fi.fFilename)
206     return;
207
208   fFile->SetText(fi.fFilename);
209 }
210
211 void TPCLoaderEditor::FileChanged()
212 {
213   fM->fFile = fFile->GetText();
214 }
215
216 void TPCLoaderEditor::DoOpen()
217 {
218   fM->OpenFile();
219   SetModel(fM);
220 }
221
222 /**************************************************************************/
223
224 void TPCLoaderEditor::DoEvent()
225 {
226   fM->GotoEvent((Int_t) fEvent->GetValue());
227   SetModel(fM);
228 }
229
230 void TPCLoaderEditor::DoDoubleSR()
231 {
232   fM->SetDoubleSR(fDoubleSR->IsOn());
233   Update();
234 }
235
236 /**************************************************************************/
237
238 void TPCLoaderEditor::DoDataLoadThreshold()
239 {
240   if (fM->GetData() == 0) return;
241   fM->GetData()->SetLoadThreshold((Short_t) fDataLoadThreshold->GetValue());
242 }
243
244 void TPCLoaderEditor::DoDataLoadPedestal()
245 {
246   if (fM->GetData() == 0) return;
247   fM->GetData()->SetLoadPedestal((Short_t) fDataLoadPedestal->GetValue());
248 }
249
250 void TPCLoaderEditor::DoDataAutoPedestal()
251 {
252   if (fM->GetData() == 0) return;
253   fM->GetData()->SetAutoPedestal(fDataAutoPedestal->IsOn());
254   fDataLoadPedestal->SetEnabled(!fDataAutoPedestal->IsOn());
255 }
256
257 /**************************************************************************/
258
259 void TPCLoaderEditor::DoUpdateSectors()
260 {
261   fM->UpdateSectors();
262 }
263
264 void TPCLoaderEditor::DoReloadSectors()
265 {
266   fM->ReloadSectors();
267 }
268
269 void TPCLoaderEditor::DoCreateSectors3D()
270 {
271   fM->CreateSectors3D();
272 }
273
274
275 void TPCLoaderEditor::DoDeleteSectors3D()
276 {
277   fM->DeleteSectors3D();
278 }
279