]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EVE/Alieve/TPCLoaderEditor.cxx
Missing initialization; fiddle with the track marker-style a bit more.
[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/RGTopFrame.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->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);
174
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);
180   if (tpcp) {
181     fDataLoadThreshold->SetValue(tpcd->GetLoadThreshold());
182     fDataLoadPedestal ->SetValue(tpcd->GetLoadPedestal());
183     fDataAutoPedestal ->SetState(tpcd->GetAutoPedestal() ? kButtonDown : kButtonUp);
184   }
185 }
186
187 /**************************************************************************/
188 /**************************************************************************/
189
190 namespace {
191 const char *tpcfiletypes[] = {
192    "Root files",  "*.root",
193    "All files",   "*.*",
194     0,               0
195 };
196 }
197
198 void TPCLoaderEditor::FileSelect()
199 {
200   TGFileInfo fi;
201   fi.fIniDir    = StrDup(gSystem->DirName (fM->fFile));
202   fi.fFilename  = StrDup(gSystem->BaseName(fM->fFile));
203   fi.fFileTypes = tpcfiletypes;
204
205   new TGFileDialog(fClient->GetRoot(), gReve, kFDOpen, &fi);
206   if (!fi.fFilename)
207     return;
208
209   fFile->SetToolTipText(gSystem->DirName (fi.fFilename));
210   fFile->SetText       (gSystem->BaseName(fi.fFilename));
211 }
212
213 void TPCLoaderEditor::FileChanged()
214 {
215   fM->fFile = Form("%s/%s", fFile->GetToolTip()->GetText()->Data(),
216                    fFile->GetText());
217 }
218
219 void TPCLoaderEditor::DoOpen()
220 {
221   fM->OpenFile();
222   SetModel(fM);
223 }
224
225 /**************************************************************************/
226
227 void TPCLoaderEditor::DoEvent()
228 {
229   fM->GotoEvent((Int_t) fEvent->GetValue());
230   SetModel(fM);
231 }
232
233 void TPCLoaderEditor::DoDoubleSR()
234 {
235   fM->SetDoubleSR(fDoubleSR->IsOn());
236   Update();
237 }
238
239 /**************************************************************************/
240
241 void TPCLoaderEditor::DoDataLoadThreshold()
242 {
243   if (fM->GetData() == 0) return;
244   fM->GetData()->SetLoadThreshold((Short_t) fDataLoadThreshold->GetValue());
245 }
246
247 void TPCLoaderEditor::DoDataLoadPedestal()
248 {
249   if (fM->GetData() == 0) return;
250   fM->GetData()->SetLoadPedestal((Short_t) fDataLoadPedestal->GetValue());
251 }
252
253 void TPCLoaderEditor::DoDataAutoPedestal()
254 {
255   if (fM->GetData() == 0) return;
256   fM->GetData()->SetAutoPedestal(fDataAutoPedestal->IsOn());
257   fDataLoadPedestal->SetEnabled(!fDataAutoPedestal->IsOn());
258 }
259
260 /**************************************************************************/
261
262 void TPCLoaderEditor::DoUpdateSectors()
263 {
264   fM->UpdateSectors();
265 }
266
267 void TPCLoaderEditor::DoReloadSectors()
268 {
269   fM->ReloadSectors();
270 }
271
272 void TPCLoaderEditor::DoCreateSectors3D()
273 {
274   fM->CreateSectors3D();
275 }
276
277
278 void TPCLoaderEditor::DoDeleteSectors3D()
279 {
280   fM->DeleteSectors3D();
281 }
282