]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EVE/EveDet/AliEveTPCLoaderEditor.cxx
New code for full visualization of the vzero raw data. ctrl-alt-letf-button shows...
[u/mrichter/AliRoot.git] / EVE / EveDet / AliEveTPCLoaderEditor.cxx
1 // $Id$
2 // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
3
4 /**************************************************************************
5  * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
6  * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
7  * full copyright notice.                                                 *
8  **************************************************************************/
9
10 #include "AliEveTPCLoaderEditor.h"
11
12 #include <EveDet/AliEveTPCLoader.h>
13 #include <EveDet/AliEveTPCData.h>
14
15 #include <TEveManager.h>
16 #include <TEveGValuators.h>
17
18 #include <TSystem.h>
19 #include <TVirtualPad.h>
20 #include <TColor.h>
21
22 #include <TGLabel.h>
23 #include <TGButton.h>
24 #include <TGTextEntry.h>
25 #include <TGNumberEntry.h>
26 #include <TGFileDialog.h>
27 #include <TGToolTip.h>
28
29
30 //______________________________________________________________________________
31 //
32 // Editor for AliEveTPCLoader.
33
34 ClassImp(AliEveTPCLoaderEditor)
35
36 AliEveTPCLoaderEditor::AliEveTPCLoaderEditor(const TGWindow *p,
37                                              Int_t width, Int_t height,
38                                              UInt_t options, Pixel_t back) :
39   TGedFrame(p, width, height, options | kVerticalFrame, back),
40
41   fM        (0),
42
43   fFile     (0),
44   fOpenFile (0),
45
46   fEvent    (0),
47   fDoubleSR (0),
48
49   fDataLoadThreshold (0),
50   fDataLoadPedestal  (0),
51   fDataAutoPedestal  (0),
52
53   fUpdateSectors   (0),
54   fReloadSectors   (0),
55   fCreateSectors3D (0),
56   fDeleteSectors3D (0)
57 {
58   // Constructor.
59
60   MakeTitle("AliEveTPCLoader");
61
62   Int_t labelW;
63
64   // File / event interface
65
66   labelW = 42;
67   {
68     TGHorizontalFrame* f = new TGHorizontalFrame(this);
69     TGHorizontalFrame* g = new TGHorizontalFrame(f, labelW, 0, kFixedWidth);
70     TGLabel* l = new TGLabel(g, "File: ");
71     g->AddFrame(l, new TGLayoutHints(kLHintsLeft, 0,0,4,0));
72     f->AddFrame(g);
73     fFile = new TGTextEntry(f);
74     fFile->SetWidth(140);
75     f->AddFrame(fFile);
76     fFile->Connect("DoubleClicked()",
77                    "AliEveTPCLoaderEditor", this, "FileSelect()");
78     fFile->Connect("TextChanged(const char *)",
79                    "AliEveTPCLoaderEditor", this, "FileChanged()");
80     fOpenFile = new TGTextButton(f, "Open");
81     f->AddFrame(fOpenFile);
82     fOpenFile->Connect("Clicked()",
83                        "AliEveTPCLoaderEditor", this, "DoOpen()");
84     AddFrame(f);
85   }
86
87   fEvent = new TEveGValuator(this, "Event:", 110, 0);
88   fEvent->SetShowSlider(kFALSE);
89   fEvent->SetLabelWidth(labelW);
90   fEvent->SetNELength(6);
91   fEvent->Build();
92   fEvent->SetLimits(0, 999999);
93   fEvent->SetToolTip("Current event number");
94   fEvent->Connect("ValueSet(Double_t)",
95                   "AliEveTPCLoaderEditor", this, "DoEvent()");
96   // Reuse Event for DoubleSR button
97   fDoubleSR = new TGCheckButton(fEvent, "Double SR");
98   fDoubleSR->SetToolTipText("Double sampling rate");
99   fEvent->AddFrame(fDoubleSR, new TGLayoutHints(kLHintsLeft, 12, 0, 2, 0));
100   fDoubleSR->Connect("Toggled(Bool_t)",
101                      "AliEveTPCLoaderEditor", this, "DoDoubleSR()");
102   AddFrame(fEvent);
103
104
105   // AliEveTPCData load settings
106
107   labelW = 90;
108
109   fDataLoadThreshold = new TEveGValuator(this, "Load threshold:", 110, 0);
110   fDataLoadThreshold->SetShowSlider(kFALSE);
111   fDataLoadThreshold->SetLabelWidth(labelW);
112   fDataLoadThreshold->SetNELength(6);
113   fDataLoadThreshold->Build();
114   fDataLoadThreshold->SetLimits(0, 1000);
115   fDataLoadThreshold->SetToolTip("Minimum signal that will be stored (pedestal subtracted first).");
116   fDataLoadThreshold->Connect
117     ("ValueSet(Double_t)",
118      "AliEveTPCLoaderEditor", this, "DoDataLoadThreshold()");
119   AddFrame(fDataLoadThreshold, new TGLayoutHints(kLHintsLeft, 0, 0, 6, 0));
120
121   fDataLoadPedestal = new TEveGValuator(this, "Load pedestal:", 110, 0);
122   fDataLoadPedestal->SetShowSlider(kFALSE);
123   fDataLoadPedestal->SetLabelWidth(labelW);
124   fDataLoadPedestal->SetNELength(6);
125   fDataLoadPedestal->Build();
126   fDataLoadPedestal->SetLimits(0, 1000);
127   fDataLoadPedestal->SetToolTip("Pedestal that will be subtracted during data loading.");
128   fDataLoadPedestal->Connect
129     ("ValueSet(Double_t)",
130      "AliEveTPCLoaderEditor", this, "DoDataLoadPedestal()");
131   // Reuse DataLoadPedestal for DataAutoPedestal check button
132   fDataAutoPedestal = new TGCheckButton(fDataLoadPedestal, "Automatic");
133   fDataAutoPedestal->SetToolTipText("Determine per-pad pedestal during data loading.");
134   fDataAutoPedestal->Connect
135     ("Toggled(Bool_t)",
136      "AliEveTPCLoaderEditor", this, "DoDataAutoPedestal()");
137   fDataLoadPedestal->AddFrame(fDataAutoPedestal, new TGLayoutHints(kLHintsLeft, 12, 0, 2, 0));
138   AddFrame(fDataLoadPedestal);
139
140   // Steering buttons: update/reload sectors; show/hide 3d
141
142   {
143     TGHorizontalFrame* f = new TGHorizontalFrame(this);
144     fUpdateSectors = new TGTextButton(f, "Update Sectors");
145     f->AddFrame(fUpdateSectors, new TGLayoutHints(kLHintsExpandX, 0,4,0,0));
146     fUpdateSectors->Connect("Clicked()",
147                             "AliEveTPCLoaderEditor", this, "DoUpdateSectors()");
148     fReloadSectors = new TGTextButton(f, "Reload Sectors");
149     f->AddFrame(fReloadSectors, new TGLayoutHints(kLHintsExpandX, 4,0,0,0));
150     fReloadSectors->Connect("Clicked()",
151                             "AliEveTPCLoaderEditor", this, "DoReloadSectors()");
152     AddFrame(f, new TGLayoutHints(kLHintsExpandX, 8,8,8,0));
153   }
154   {
155     TGHorizontalFrame* f = new TGHorizontalFrame(this);
156     fCreateSectors3D = new TGTextButton(f, "Create 3D");
157     f->AddFrame(fCreateSectors3D, new TGLayoutHints(kLHintsExpandX, 0,4,0,0));
158     fCreateSectors3D->Connect("Clicked()",
159                               "AliEveTPCLoaderEditor", this, "DoCreateSectors3D()");
160     fDeleteSectors3D = new TGTextButton(f, "Delete 3D");
161     f->AddFrame(fDeleteSectors3D, new TGLayoutHints(kLHintsExpandX, 4,0,0,0));
162     fDeleteSectors3D->Connect("Clicked()",
163                               "AliEveTPCLoaderEditor", this, "DoDeleteSectors3D()");
164     AddFrame(f, new TGLayoutHints(kLHintsExpandX, 8,8,8,0));
165   }
166 }
167
168 /******************************************************************************/
169
170 void AliEveTPCLoaderEditor::SetModel(TObject* obj)
171 {
172   // Set model object.
173
174   fM = dynamic_cast<AliEveTPCLoader*>(obj);
175
176   // !!!! order changed, need TGTextEntry::SetText NO BLOODY EMIT.
177   fFile->SetText(fM->fFile);
178   fEvent->SetValue(fM->fEvent);
179   fEvent->SetEnabled(fM->fEvent >= 0);
180   fDoubleSR->SetState(fM->fDoubleSR ? kButtonDown : kButtonUp);
181
182   AliEveTPCData* tpcd = fM->GetData();
183   Bool_t   tpcp = (tpcd != 0);
184   fDataLoadThreshold->SetEnabled(tpcp);
185   fDataLoadPedestal ->SetEnabled(tpcp && ! tpcd->GetAutoPedestal());
186   fDataAutoPedestal ->SetEnabled(tpcp);
187   if (tpcp) {
188     fDataLoadThreshold->SetValue(tpcd->GetLoadThreshold());
189     fDataLoadPedestal ->SetValue(tpcd->GetLoadPedestal());
190     fDataAutoPedestal ->SetState(tpcd->GetAutoPedestal() ? kButtonDown : kButtonUp);
191   }
192 }
193
194 /******************************************************************************/
195 /******************************************************************************/
196
197 void AliEveTPCLoaderEditor::FileSelect()
198 {
199   // Slot for FileSelect.
200
201   static const char *kTPCFileTypes[] = {
202    "Root files",  "*.root",
203    "All files",   "*.*",
204     0,               0
205 };
206
207   TGFileInfo fi;
208   fi.fIniDir    = StrDup(gSystem->DirName (fM->fFile));
209   fi.fFilename  = StrDup(gSystem->BaseName(fM->fFile));
210   fi.fFileTypes = kTPCFileTypes;
211
212   new TGFileDialog(fClient->GetRoot(), gEve->GetMainWindow(), kFDOpen, &fi);
213   if (!fi.fFilename)
214     return;
215
216   fFile->SetText(fi.fFilename);
217 }
218
219 void AliEveTPCLoaderEditor::FileChanged()
220 {
221   // Slot for FileChanged.
222
223   fM->fFile = fFile->GetText();
224 }
225
226 void AliEveTPCLoaderEditor::DoOpen()
227 {
228   // Slot for Open.
229
230   fM->OpenFile();
231   SetModel(fM);
232 }
233
234 /******************************************************************************/
235
236 void AliEveTPCLoaderEditor::DoEvent()
237 {
238   // Slot for Event.
239
240   fM->GotoEvent((Int_t) fEvent->GetValue());
241   SetModel(fM);
242 }
243
244 void AliEveTPCLoaderEditor::DoDoubleSR()
245 {
246   // Slot for DoubleSR.
247
248   fM->SetDoubleSR(fDoubleSR->IsOn());
249   Update();
250 }
251
252 /******************************************************************************/
253
254 void AliEveTPCLoaderEditor::DoDataLoadThreshold()
255 {
256   // Slot for DataLoadThreshold.
257
258   if (fM->GetData() == 0) return;
259   fM->GetData()->SetLoadThreshold((Short_t) fDataLoadThreshold->GetValue());
260 }
261
262 void AliEveTPCLoaderEditor::DoDataLoadPedestal()
263 {
264   // Slot for DataLoadPedestal.
265
266   if (fM->GetData() == 0) return;
267   fM->GetData()->SetLoadPedestal((Short_t) fDataLoadPedestal->GetValue());
268 }
269
270 void AliEveTPCLoaderEditor::DoDataAutoPedestal()
271 {
272   // Slot for DataAutoPedestal.
273
274   if (fM->GetData() == 0) return;
275   fM->GetData()->SetAutoPedestal(fDataAutoPedestal->IsOn());
276   fDataLoadPedestal->SetEnabled(!fDataAutoPedestal->IsOn());
277 }
278
279 /******************************************************************************/
280
281 void AliEveTPCLoaderEditor::DoUpdateSectors()
282 {
283   // Slot for UpdateSectors.
284
285   fM->UpdateSectors();
286 }
287
288 void AliEveTPCLoaderEditor::DoReloadSectors()
289 {
290   // Slot for ReloadSectors.
291
292   fM->ReloadSectors();
293 }
294
295 void AliEveTPCLoaderEditor::DoCreateSectors3D()
296 {
297   // Slot for CreateSectors3D.
298
299   fM->CreateSectors3D();
300 }
301
302
303 void AliEveTPCLoaderEditor::DoDeleteSectors3D()
304 {
305   // Slot for DeleteSectors3D.
306
307   fM->DeleteSectors3D();
308 }