]> git.uio.no Git - u/mrichter/AliRoot.git/blame - EVE/EveDet/AliEveTPCLoaderEditor.cxx
Online reconstruction simplified and prepared to be controlled by Storage Manager...
[u/mrichter/AliRoot.git] / EVE / EveDet / AliEveTPCLoaderEditor.cxx
CommitLineData
d810d0de 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 *
51346b82 7 * full copyright notice. *
d810d0de 8 **************************************************************************/
9
10#include "AliEveTPCLoaderEditor.h"
707b281a 11
cb4245bb 12#include <EveDet/AliEveTPCLoader.h>
13#include <EveDet/AliEveTPCData.h>
707b281a 14
969e051c 15#include <TEveScene.h>
84aff7a4 16#include <TEveManager.h>
17#include <TEveGValuators.h>
969e051c 18#include <TGDoubleSlider.h>
e9a38ea3 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>
89ec258e 29#include <TGToolTip.h>
d810d0de 30
e9a38ea3 31
57ffa5fb 32//______________________________________________________________________________
e9a38ea3 33//
a97abca8 34// Editor for AliEveTPCLoader.
e9a38ea3 35
d810d0de 36ClassImp(AliEveTPCLoaderEditor)
e9a38ea3 37
707b281a 38AliEveTPCLoaderEditor::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),
265ecb21 42
707b281a 43 fM (0),
265ecb21 44
707b281a 45 fFile (0),
46 fOpenFile (0),
265ecb21 47
707b281a 48 fEvent (0),
49 fDoubleSR (0),
265ecb21 50
707b281a 51 fDataLoadThreshold (0),
52 fDataLoadPedestal (0),
53 fDataAutoPedestal (0),
10b1edfc 54
707b281a 55 fUpdateSectors (0),
56 fReloadSectors (0),
57 fCreateSectors3D (0),
969e051c 58 fDeleteSectors3D (0),
59
60 gEtaRange(0),
61 gCutOnEta(0)
62
e9a38ea3 63{
a97abca8 64 // Constructor.
65
d810d0de 66 MakeTitle("AliEveTPCLoader");
e9a38ea3 67
10b1edfc 68 Int_t labelW;
69
70 // File / event interface
71
72 labelW = 42;
e9a38ea3 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()",
d810d0de 83 "AliEveTPCLoaderEditor", this, "FileSelect()");
e9a38ea3 84 fFile->Connect("TextChanged(const char *)",
d810d0de 85 "AliEveTPCLoaderEditor", this, "FileChanged()");
e9a38ea3 86 fOpenFile = new TGTextButton(f, "Open");
87 f->AddFrame(fOpenFile);
88 fOpenFile->Connect("Clicked()",
d810d0de 89 "AliEveTPCLoaderEditor", this, "DoOpen()");
e9a38ea3 90 AddFrame(f);
91 }
92
16718cdc 93 fEvent = new TEveGValuator(this, "Event:", 110, 0);
e9a38ea3 94 fEvent->SetShowSlider(kFALSE);
95 fEvent->SetLabelWidth(labelW);
96 fEvent->SetNELength(6);
97 fEvent->Build();
adafff32 98 fEvent->SetLimits(0, 999999);
e9a38ea3 99 fEvent->SetToolTip("Current event number");
100 fEvent->Connect("ValueSet(Double_t)",
d810d0de 101 "AliEveTPCLoaderEditor", this, "DoEvent()");
16718cdc 102 // Reuse Event for DoubleSR button
6e91772d 103 fDoubleSR = new TGCheckButton(fEvent, "Double SR");
104 fDoubleSR->SetToolTipText("Double sampling rate");
10b1edfc 105 fEvent->AddFrame(fDoubleSR, new TGLayoutHints(kLHintsLeft, 12, 0, 2, 0));
b6b01ba3 106 fDoubleSR->Connect("Toggled(Bool_t)",
d810d0de 107 "AliEveTPCLoaderEditor", this, "DoDoubleSR()");
e9a38ea3 108 AddFrame(fEvent);
109
10b1edfc 110
d810d0de 111 // AliEveTPCData load settings
10b1edfc 112
113 labelW = 90;
114
84aff7a4 115 fDataLoadThreshold = new TEveGValuator(this, "Load threshold:", 110, 0);
10b1edfc 116 fDataLoadThreshold->SetShowSlider(kFALSE);
117 fDataLoadThreshold->SetLabelWidth(labelW);
118 fDataLoadThreshold->SetNELength(6);
119 fDataLoadThreshold->Build();
120 fDataLoadThreshold->SetLimits(0, 1000);
fe83f7ce 121 fDataLoadThreshold->SetToolTip("Minimum signal that will be stored (pedestal subtracted first).");
10b1edfc 122 fDataLoadThreshold->Connect
123 ("ValueSet(Double_t)",
d810d0de 124 "AliEveTPCLoaderEditor", this, "DoDataLoadThreshold()");
10b1edfc 125 AddFrame(fDataLoadThreshold, new TGLayoutHints(kLHintsLeft, 0, 0, 6, 0));
126
84aff7a4 127 fDataLoadPedestal = new TEveGValuator(this, "Load pedestal:", 110, 0);
10b1edfc 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)",
d810d0de 136 "AliEveTPCLoaderEditor", this, "DoDataLoadPedestal()");
10b1edfc 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)",
d810d0de 142 "AliEveTPCLoaderEditor", this, "DoDataAutoPedestal()");
10b1edfc 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()",
d810d0de 153 "AliEveTPCLoaderEditor", this, "DoUpdateSectors()");
10b1edfc 154 fReloadSectors = new TGTextButton(f, "Reload Sectors");
155 f->AddFrame(fReloadSectors, new TGLayoutHints(kLHintsExpandX, 4,0,0,0));
156 fReloadSectors->Connect("Clicked()",
d810d0de 157 "AliEveTPCLoaderEditor", this, "DoReloadSectors()");
10b1edfc 158 AddFrame(f, new TGLayoutHints(kLHintsExpandX, 8,8,8,0));
159 }
e9a38ea3 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()",
d810d0de 165 "AliEveTPCLoaderEditor", this, "DoCreateSectors3D()");
e9a38ea3 166 fDeleteSectors3D = new TGTextButton(f, "Delete 3D");
167 f->AddFrame(fDeleteSectors3D, new TGLayoutHints(kLHintsExpandX, 4,0,0,0));
168 fDeleteSectors3D->Connect("Clicked()",
d810d0de 169 "AliEveTPCLoaderEditor", this, "DoDeleteSectors3D()");
e9a38ea3 170 AddFrame(f, new TGLayoutHints(kLHintsExpandX, 8,8,8,0));
171 }
969e051c 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
e9a38ea3 207}
208
57ffa5fb 209/******************************************************************************/
e9a38ea3 210
d810d0de 211void AliEveTPCLoaderEditor::SetModel(TObject* obj)
e9a38ea3 212{
a97abca8 213 // Set model object.
214
223408ad 215 fM = static_cast<AliEveTPCLoader*>(obj);
e9a38ea3 216
89ec258e 217 // !!!! order changed, need TGTextEntry::SetText NO BLOODY EMIT.
ad549815 218 fFile->SetText(fM->fFile);
e9a38ea3 219 fEvent->SetValue(fM->fEvent);
220 fEvent->SetEnabled(fM->fEvent >= 0);
10b1edfc 221 fDoubleSR->SetState(fM->fDoubleSR ? kButtonDown : kButtonUp);
222
d810d0de 223 AliEveTPCData* tpcd = fM->GetData();
10b1edfc 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 }
e9a38ea3 233}
234
57ffa5fb 235/******************************************************************************/
236/******************************************************************************/
e9a38ea3 237
a15e6d7d 238void AliEveTPCLoaderEditor::FileSelect()
239{
240 // Slot for FileSelect.
241
242 static const char *kTPCFileTypes[] = {
e9a38ea3 243 "Root files", "*.root",
244 "All files", "*.*",
245 0, 0
246};
a97abca8 247
e9a38ea3 248 TGFileInfo fi;
fda47a05 249 fi.fIniDir = StrDup(gSystem->DirName (fM->fFile));
250 fi.fFilename = StrDup(gSystem->BaseName(fM->fFile));
a15e6d7d 251 fi.fFileTypes = kTPCFileTypes;
89ec258e 252
84aff7a4 253 new TGFileDialog(fClient->GetRoot(), gEve->GetMainWindow(), kFDOpen, &fi);
89ec258e 254 if (!fi.fFilename)
255 return;
256
ad549815 257 fFile->SetText(fi.fFilename);
e9a38ea3 258}
259
d810d0de 260void AliEveTPCLoaderEditor::FileChanged()
e9a38ea3 261{
a97abca8 262 // Slot for FileChanged.
263
ad549815 264 fM->fFile = fFile->GetText();
e9a38ea3 265}
266
d810d0de 267void AliEveTPCLoaderEditor::DoOpen()
e9a38ea3 268{
a97abca8 269 // Slot for Open.
270
e9a38ea3 271 fM->OpenFile();
a8600b56 272 SetModel(fM);
e9a38ea3 273}
274
57ffa5fb 275/******************************************************************************/
e9a38ea3 276
d810d0de 277void AliEveTPCLoaderEditor::DoEvent()
e9a38ea3 278{
a97abca8 279 // Slot for Event.
280
e9a38ea3 281 fM->GotoEvent((Int_t) fEvent->GetValue());
a8600b56 282 SetModel(fM);
e9a38ea3 283}
284
d810d0de 285void AliEveTPCLoaderEditor::DoDoubleSR()
6e91772d 286{
a97abca8 287 // Slot for DoubleSR.
288
6e91772d 289 fM->SetDoubleSR(fDoubleSR->IsOn());
290 Update();
291}
292
57ffa5fb 293/******************************************************************************/
e9a38ea3 294
d810d0de 295void AliEveTPCLoaderEditor::DoDataLoadThreshold()
10b1edfc 296{
a97abca8 297 // Slot for DataLoadThreshold.
298
10b1edfc 299 if (fM->GetData() == 0) return;
300 fM->GetData()->SetLoadThreshold((Short_t) fDataLoadThreshold->GetValue());
301}
302
d810d0de 303void AliEveTPCLoaderEditor::DoDataLoadPedestal()
10b1edfc 304{
a97abca8 305 // Slot for DataLoadPedestal.
306
10b1edfc 307 if (fM->GetData() == 0) return;
308 fM->GetData()->SetLoadPedestal((Short_t) fDataLoadPedestal->GetValue());
309}
310
d810d0de 311void AliEveTPCLoaderEditor::DoDataAutoPedestal()
10b1edfc 312{
a97abca8 313 // Slot for DataAutoPedestal.
314
10b1edfc 315 if (fM->GetData() == 0) return;
316 fM->GetData()->SetAutoPedestal(fDataAutoPedestal->IsOn());
317 fDataLoadPedestal->SetEnabled(!fDataAutoPedestal->IsOn());
318}
319
57ffa5fb 320/******************************************************************************/
10b1edfc 321
d810d0de 322void AliEveTPCLoaderEditor::DoUpdateSectors()
e9a38ea3 323{
a97abca8 324 // Slot for UpdateSectors.
325
969e051c 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
e9a38ea3 335 fM->UpdateSectors();
336}
337
d810d0de 338void AliEveTPCLoaderEditor::DoReloadSectors()
10b1edfc 339{
a97abca8 340 // Slot for ReloadSectors.
341
969e051c 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
10b1edfc 352 fM->ReloadSectors();
353}
354
d810d0de 355void AliEveTPCLoaderEditor::DoCreateSectors3D()
e9a38ea3 356{
a97abca8 357 // Slot for CreateSectors3D.
358
969e051c 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
e9a38ea3 368 fM->CreateSectors3D();
369}
370
371
d810d0de 372void AliEveTPCLoaderEditor::DoDeleteSectors3D()
e9a38ea3 373{
a97abca8 374 // Slot for DeleteSectors3D.
375
e9a38ea3 376 fM->DeleteSectors3D();
377}
969e051c 378
379void 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
393void 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