]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EVE/EveDet/AliEveTPCLoaderEditor.cxx
Coverity
[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 <TEveScene.h>
16 #include <TEveManager.h>
17 #include <TEveGValuators.h>
18 #include <TGDoubleSlider.h>
19
20 #include <TSystem.h>
21 #include <TVirtualPad.h>
22 #include <TColor.h>
23
24 #include <TGLabel.h>
25 #include <TGButton.h>
26 #include <TGTextEntry.h>
27 #include <TGNumberEntry.h>
28 #include <TGFileDialog.h>
29 #include <TGToolTip.h>
30
31
32 //______________________________________________________________________________
33 //
34 // Editor for AliEveTPCLoader.
35
36 ClassImp(AliEveTPCLoaderEditor)
37
38 AliEveTPCLoaderEditor::AliEveTPCLoaderEditor(const TGWindow *p,
39                                              Int_t width, Int_t height,
40                                              UInt_t options, Pixel_t back) :
41   TGedFrame(p, width, height, options | kVerticalFrame, back),
42
43   fM        (0),
44
45   fFile     (0),
46   fOpenFile (0),
47
48   fEvent    (0),
49   fDoubleSR (0),
50
51   fDataLoadThreshold (0),
52   fDataLoadPedestal  (0),
53   fDataAutoPedestal  (0),
54
55   fUpdateSectors   (0),
56   fReloadSectors   (0),
57   fCreateSectors3D (0),
58   fDeleteSectors3D (0),
59
60   gEtaRange(0),
61   gCutOnEta(0)
62   
63 {
64   // Constructor.
65
66   MakeTitle("AliEveTPCLoader");
67
68   Int_t labelW;
69
70   // File / event interface
71
72   labelW = 42;
73   {
74     TGHorizontalFrame* f = new TGHorizontalFrame(this);
75     TGHorizontalFrame* g = new TGHorizontalFrame(f, labelW, 0, kFixedWidth);
76     TGLabel* l = new TGLabel(g, "File: ");
77     g->AddFrame(l, new TGLayoutHints(kLHintsLeft, 0,0,4,0));
78     f->AddFrame(g);
79     fFile = new TGTextEntry(f);
80     fFile->SetWidth(140);
81     f->AddFrame(fFile);
82     fFile->Connect("DoubleClicked()",
83                    "AliEveTPCLoaderEditor", this, "FileSelect()");
84     fFile->Connect("TextChanged(const char *)",
85                    "AliEveTPCLoaderEditor", this, "FileChanged()");
86     fOpenFile = new TGTextButton(f, "Open");
87     f->AddFrame(fOpenFile);
88     fOpenFile->Connect("Clicked()",
89                        "AliEveTPCLoaderEditor", this, "DoOpen()");
90     AddFrame(f);
91   }
92
93   fEvent = new TEveGValuator(this, "Event:", 110, 0);
94   fEvent->SetShowSlider(kFALSE);
95   fEvent->SetLabelWidth(labelW);
96   fEvent->SetNELength(6);
97   fEvent->Build();
98   fEvent->SetLimits(0, 999999);
99   fEvent->SetToolTip("Current event number");
100   fEvent->Connect("ValueSet(Double_t)",
101                   "AliEveTPCLoaderEditor", this, "DoEvent()");
102   // Reuse Event for DoubleSR button
103   fDoubleSR = new TGCheckButton(fEvent, "Double SR");
104   fDoubleSR->SetToolTipText("Double sampling rate");
105   fEvent->AddFrame(fDoubleSR, new TGLayoutHints(kLHintsLeft, 12, 0, 2, 0));
106   fDoubleSR->Connect("Toggled(Bool_t)",
107                      "AliEveTPCLoaderEditor", this, "DoDoubleSR()");
108   AddFrame(fEvent);
109
110
111   // AliEveTPCData load settings
112
113   labelW = 90;
114
115   fDataLoadThreshold = new TEveGValuator(this, "Load threshold:", 110, 0);
116   fDataLoadThreshold->SetShowSlider(kFALSE);
117   fDataLoadThreshold->SetLabelWidth(labelW);
118   fDataLoadThreshold->SetNELength(6);
119   fDataLoadThreshold->Build();
120   fDataLoadThreshold->SetLimits(0, 1000);
121   fDataLoadThreshold->SetToolTip("Minimum signal that will be stored (pedestal subtracted first).");
122   fDataLoadThreshold->Connect
123     ("ValueSet(Double_t)",
124      "AliEveTPCLoaderEditor", this, "DoDataLoadThreshold()");
125   AddFrame(fDataLoadThreshold, new TGLayoutHints(kLHintsLeft, 0, 0, 6, 0));
126
127   fDataLoadPedestal = new TEveGValuator(this, "Load pedestal:", 110, 0);
128   fDataLoadPedestal->SetShowSlider(kFALSE);
129   fDataLoadPedestal->SetLabelWidth(labelW);
130   fDataLoadPedestal->SetNELength(6);
131   fDataLoadPedestal->Build();
132   fDataLoadPedestal->SetLimits(0, 1000);
133   fDataLoadPedestal->SetToolTip("Pedestal that will be subtracted during data loading.");
134   fDataLoadPedestal->Connect
135     ("ValueSet(Double_t)",
136      "AliEveTPCLoaderEditor", this, "DoDataLoadPedestal()");
137   // Reuse DataLoadPedestal for DataAutoPedestal check button
138   fDataAutoPedestal = new TGCheckButton(fDataLoadPedestal, "Automatic");
139   fDataAutoPedestal->SetToolTipText("Determine per-pad pedestal during data loading.");
140   fDataAutoPedestal->Connect
141     ("Toggled(Bool_t)",
142      "AliEveTPCLoaderEditor", this, "DoDataAutoPedestal()");
143   fDataLoadPedestal->AddFrame(fDataAutoPedestal, new TGLayoutHints(kLHintsLeft, 12, 0, 2, 0));
144   AddFrame(fDataLoadPedestal);
145
146   // Steering buttons: update/reload sectors; show/hide 3d
147
148   {
149     TGHorizontalFrame* f = new TGHorizontalFrame(this);
150     fUpdateSectors = new TGTextButton(f, "Update Sectors");
151     f->AddFrame(fUpdateSectors, new TGLayoutHints(kLHintsExpandX, 0,4,0,0));
152     fUpdateSectors->Connect("Clicked()",
153                             "AliEveTPCLoaderEditor", this, "DoUpdateSectors()");
154     fReloadSectors = new TGTextButton(f, "Reload Sectors");
155     f->AddFrame(fReloadSectors, new TGLayoutHints(kLHintsExpandX, 4,0,0,0));
156     fReloadSectors->Connect("Clicked()",
157                             "AliEveTPCLoaderEditor", this, "DoReloadSectors()");
158     AddFrame(f, new TGLayoutHints(kLHintsExpandX, 8,8,8,0));
159   }
160   {
161     TGHorizontalFrame* f = new TGHorizontalFrame(this);
162     fCreateSectors3D = new TGTextButton(f, "Create 3D");
163     f->AddFrame(fCreateSectors3D, new TGLayoutHints(kLHintsExpandX, 0,4,0,0));
164     fCreateSectors3D->Connect("Clicked()",
165                               "AliEveTPCLoaderEditor", this, "DoCreateSectors3D()");
166     fDeleteSectors3D = new TGTextButton(f, "Delete 3D");
167     f->AddFrame(fDeleteSectors3D, new TGLayoutHints(kLHintsExpandX, 4,0,0,0));
168     fDeleteSectors3D->Connect("Clicked()",
169                               "AliEveTPCLoaderEditor", this, "DoDeleteSectors3D()");
170     AddFrame(f, new TGLayoutHints(kLHintsExpandX, 8,8,8,0));
171   }
172   {
173     TGHorizontalFrame* f = new TGHorizontalFrame(this);
174     fCreateSectors3D = new TGTextButton(f, "Show 2D");
175     f->AddFrame(fCreateSectors3D, new TGLayoutHints(kLHintsExpandX, 0,4,0,0));
176     fCreateSectors3D->Connect("Clicked()",
177                               "AliEveTPCLoaderEditor", this, "DoShowSectors2D()");
178     fDeleteSectors3D = new TGTextButton(f, "Hide 2D");
179     f->AddFrame(fDeleteSectors3D, new TGLayoutHints(kLHintsExpandX, 4,0,0,0));
180     fDeleteSectors3D->Connect("Clicked()",
181                               "AliEveTPCLoaderEditor", this, "DoHideSectors2D()");
182     AddFrame(f, new TGLayoutHints(kLHintsExpandX, 8,8,8,0));
183   }
184
185    // Eta cuts slider
186
187   {
188    TGHorizontalFrame* f = new TGHorizontalFrame(this);
189
190    gEtaRange = new TEveGDoubleValuator(f,"Eta range:", 40, 0);
191    gEtaRange->SetNELength(6);
192    gEtaRange->SetLabelWidth(50);
193    gEtaRange->Build();
194    gEtaRange->GetSlider()->SetWidth(180);
195    gEtaRange->SetLimits(-1.5, 1.5, TGNumberFormat::kNESRealTwo);
196    gEtaRange->SetValues(-1.5, 1.5, TGNumberFormat::kNESRealTwo);
197
198    gCutOnEta = new TGCheckButton(f, "Set", 10);
199    gCutOnEta->SetEnabled(kTRUE);
200
201    f->AddFrame(gEtaRange, new TGLayoutHints(kLHintsExpandX, 10, 10, 10, 10));
202    f->AddFrame(gCutOnEta, new TGLayoutHints(kLHintsNormal, 10, 10, 10, 10));
203
204    AddFrame(f, new TGLayoutHints(kLHintsExpandX, 8,8,8,0));
205   }
206
207 }
208
209 /******************************************************************************/
210
211 void AliEveTPCLoaderEditor::SetModel(TObject* obj)
212 {
213   // Set model object.
214
215   fM = static_cast<AliEveTPCLoader*>(obj);
216
217   // !!!! order changed, need TGTextEntry::SetText NO BLOODY EMIT.
218   fFile->SetText(fM->fFile);
219   fEvent->SetValue(fM->fEvent);
220   fEvent->SetEnabled(fM->fEvent >= 0);
221   fDoubleSR->SetState(fM->fDoubleSR ? kButtonDown : kButtonUp);
222
223   AliEveTPCData* tpcd = fM->GetData();
224   Bool_t   tpcp = (tpcd != 0);
225   fDataLoadThreshold->SetEnabled(tpcp);
226   fDataLoadPedestal ->SetEnabled(tpcp && ! tpcd->GetAutoPedestal());
227   fDataAutoPedestal ->SetEnabled(tpcp);
228   if (tpcp) {
229     fDataLoadThreshold->SetValue(tpcd->GetLoadThreshold());
230     fDataLoadPedestal ->SetValue(tpcd->GetLoadPedestal());
231     fDataAutoPedestal ->SetState(tpcd->GetAutoPedestal() ? kButtonDown : kButtonUp);
232   }
233 }
234
235 /******************************************************************************/
236 /******************************************************************************/
237
238 void AliEveTPCLoaderEditor::FileSelect()
239 {
240   // Slot for FileSelect.
241
242   static const char *kTPCFileTypes[] = {
243    "Root files",  "*.root",
244    "All files",   "*.*",
245     0,               0
246 };
247
248   TGFileInfo fi;
249   fi.fIniDir    = StrDup(gSystem->DirName (fM->fFile));
250   fi.fFilename  = StrDup(gSystem->BaseName(fM->fFile));
251   fi.fFileTypes = kTPCFileTypes;
252
253   new TGFileDialog(fClient->GetRoot(), gEve->GetMainWindow(), kFDOpen, &fi);
254   if (!fi.fFilename)
255     return;
256
257   fFile->SetText(fi.fFilename);
258 }
259
260 void AliEveTPCLoaderEditor::FileChanged()
261 {
262   // Slot for FileChanged.
263
264   fM->fFile = fFile->GetText();
265 }
266
267 void AliEveTPCLoaderEditor::DoOpen()
268 {
269   // Slot for Open.
270
271   fM->OpenFile();
272   SetModel(fM);
273 }
274
275 /******************************************************************************/
276
277 void AliEveTPCLoaderEditor::DoEvent()
278 {
279   // Slot for Event.
280
281   fM->GotoEvent((Int_t) fEvent->GetValue());
282   SetModel(fM);
283 }
284
285 void AliEveTPCLoaderEditor::DoDoubleSR()
286 {
287   // Slot for DoubleSR.
288
289   fM->SetDoubleSR(fDoubleSR->IsOn());
290   Update();
291 }
292
293 /******************************************************************************/
294
295 void AliEveTPCLoaderEditor::DoDataLoadThreshold()
296 {
297   // Slot for DataLoadThreshold.
298
299   if (fM->GetData() == 0) return;
300   fM->GetData()->SetLoadThreshold((Short_t) fDataLoadThreshold->GetValue());
301 }
302
303 void AliEveTPCLoaderEditor::DoDataLoadPedestal()
304 {
305   // Slot for DataLoadPedestal.
306
307   if (fM->GetData() == 0) return;
308   fM->GetData()->SetLoadPedestal((Short_t) fDataLoadPedestal->GetValue());
309 }
310
311 void AliEveTPCLoaderEditor::DoDataAutoPedestal()
312 {
313   // Slot for DataAutoPedestal.
314
315   if (fM->GetData() == 0) return;
316   fM->GetData()->SetAutoPedestal(fDataAutoPedestal->IsOn());
317   fDataLoadPedestal->SetEnabled(!fDataAutoPedestal->IsOn());
318 }
319
320 /******************************************************************************/
321
322 void AliEveTPCLoaderEditor::DoUpdateSectors()
323 {
324   // Slot for UpdateSectors.
325
326   if(gCutOnEta)
327     fM->SetCutOnEta(gCutOnEta->IsOn());
328
329   if(gEtaRange)
330   {
331     fM->SetEtaMin(gEtaRange->GetMin());
332     fM->SetEtaMax(gEtaRange->GetMax());
333   }
334
335   fM->UpdateSectors();
336 }
337
338 void AliEveTPCLoaderEditor::DoReloadSectors()
339 {
340   // Slot for ReloadSectors.
341
342   if(gCutOnEta)
343     fM->SetCutOnEta(gCutOnEta->IsOn());
344
345   if(gEtaRange)
346   {
347     fM->SetEtaMin(gEtaRange->GetMin());
348     fM->SetEtaMax(gEtaRange->GetMax());
349   }
350
351
352   fM->ReloadSectors();
353 }
354
355 void AliEveTPCLoaderEditor::DoCreateSectors3D()
356 {
357   // Slot for CreateSectors3D.
358
359   if(gCutOnEta)
360     fM->SetCutOnEta(gCutOnEta->IsOn());
361
362   if(gEtaRange)
363   {
364     fM->SetEtaMin(gEtaRange->GetMin());
365     fM->SetEtaMax(gEtaRange->GetMax());
366   }
367
368   fM->CreateSectors3D();
369 }
370
371
372 void AliEveTPCLoaderEditor::DoDeleteSectors3D()
373 {
374   // Slot for DeleteSectors3D.
375
376   fM->DeleteSectors3D();
377 }
378
379 void AliEveTPCLoaderEditor::DoShowSectors2D()
380 {
381
382    for(Int_t i = 0; i< 36; i++)
383    {
384       if(gEve->GetEventScene()->FirstChild()->FindChild("AliEveTPCLoader")->FindChild(Form("Sector2D %d",i)))
385       {
386          gEve->GetEventScene()->FirstChild()->FindChild("AliEveTPCLoader")->FindChild(Form("Sector2D %d",i))->SetRnrSelf(kTRUE);
387          gEve->GetEventScene()->FirstChild()->FindChild("AliEveTPCLoader")->FindChild(Form("Sector2D %d",i))->SetRnrChildren(kTRUE);
388       }
389    }
390
391 }
392
393 void AliEveTPCLoaderEditor::DoHideSectors2D()
394 {
395
396    for(Int_t i = 0; i< 36; i++)
397    {
398       if(gEve->GetEventScene()->FirstChild()->FindChild("AliEveTPCLoader")->FindChild(Form("Sector2D %d",i)))
399       {
400          gEve->GetEventScene()->FirstChild()->FindChild("AliEveTPCLoader")->FindChild(Form("Sector2D %d",i))->SetRnrSelf(kFALSE);
401          gEve->GetEventScene()->FirstChild()->FindChild("AliEveTPCLoader")->FindChild(Form("Sector2D %d",i))->SetRnrChildren(kFALSE);
402       }
403    }
404
405 }
406