]>
Commit | Line | Data |
---|---|---|
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 | 36 | ClassImp(AliEveTPCLoaderEditor) |
e9a38ea3 | 37 | |
707b281a | 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), | |
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 | 211 | void AliEveTPCLoaderEditor::SetModel(TObject* obj) |
e9a38ea3 | 212 | { |
a97abca8 | 213 | // Set model object. |
214 | ||
d810d0de | 215 | fM = dynamic_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 | 238 | void 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 | 260 | void AliEveTPCLoaderEditor::FileChanged() |
e9a38ea3 | 261 | { |
a97abca8 | 262 | // Slot for FileChanged. |
263 | ||
ad549815 | 264 | fM->fFile = fFile->GetText(); |
e9a38ea3 | 265 | } |
266 | ||
d810d0de | 267 | void 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 | 277 | void 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 | 285 | void 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 | 295 | void 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 | 303 | void 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 | 311 | void 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 | 322 | void 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 | 338 | void 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 | 355 | void 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 | 372 | void AliEveTPCLoaderEditor::DoDeleteSectors3D() |
e9a38ea3 | 373 | { |
a97abca8 | 374 | // Slot for DeleteSectors3D. |
375 | ||
e9a38ea3 | 376 | fM->DeleteSectors3D(); |
377 | } | |
969e051c | 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 |