]>
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 | |
84aff7a4 | 15 | #include <TEveManager.h> |
16 | #include <TEveGValuators.h> | |
e9a38ea3 | 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> | |
89ec258e | 27 | #include <TGToolTip.h> |
d810d0de | 28 | |
e9a38ea3 | 29 | |
57ffa5fb | 30 | //______________________________________________________________________________ |
e9a38ea3 | 31 | // |
a97abca8 | 32 | // Editor for AliEveTPCLoader. |
e9a38ea3 | 33 | |
d810d0de | 34 | ClassImp(AliEveTPCLoaderEditor) |
e9a38ea3 | 35 | |
707b281a | 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), | |
265ecb21 | 40 | |
707b281a | 41 | fM (0), |
265ecb21 | 42 | |
707b281a | 43 | fFile (0), |
44 | fOpenFile (0), | |
265ecb21 | 45 | |
707b281a | 46 | fEvent (0), |
47 | fDoubleSR (0), | |
265ecb21 | 48 | |
707b281a | 49 | fDataLoadThreshold (0), |
50 | fDataLoadPedestal (0), | |
51 | fDataAutoPedestal (0), | |
10b1edfc | 52 | |
707b281a | 53 | fUpdateSectors (0), |
54 | fReloadSectors (0), | |
55 | fCreateSectors3D (0), | |
56 | fDeleteSectors3D (0) | |
e9a38ea3 | 57 | { |
a97abca8 | 58 | // Constructor. |
59 | ||
d810d0de | 60 | MakeTitle("AliEveTPCLoader"); |
e9a38ea3 | 61 | |
10b1edfc | 62 | Int_t labelW; |
63 | ||
64 | // File / event interface | |
65 | ||
66 | labelW = 42; | |
e9a38ea3 | 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()", | |
d810d0de | 77 | "AliEveTPCLoaderEditor", this, "FileSelect()"); |
e9a38ea3 | 78 | fFile->Connect("TextChanged(const char *)", |
d810d0de | 79 | "AliEveTPCLoaderEditor", this, "FileChanged()"); |
e9a38ea3 | 80 | fOpenFile = new TGTextButton(f, "Open"); |
81 | f->AddFrame(fOpenFile); | |
82 | fOpenFile->Connect("Clicked()", | |
d810d0de | 83 | "AliEveTPCLoaderEditor", this, "DoOpen()"); |
e9a38ea3 | 84 | AddFrame(f); |
85 | } | |
86 | ||
16718cdc | 87 | fEvent = new TEveGValuator(this, "Event:", 110, 0); |
e9a38ea3 | 88 | fEvent->SetShowSlider(kFALSE); |
89 | fEvent->SetLabelWidth(labelW); | |
90 | fEvent->SetNELength(6); | |
91 | fEvent->Build(); | |
92 | fEvent->SetLimits(0, 1000); | |
93 | fEvent->SetToolTip("Current event number"); | |
94 | fEvent->Connect("ValueSet(Double_t)", | |
d810d0de | 95 | "AliEveTPCLoaderEditor", this, "DoEvent()"); |
16718cdc | 96 | // Reuse Event for DoubleSR button |
6e91772d | 97 | fDoubleSR = new TGCheckButton(fEvent, "Double SR"); |
98 | fDoubleSR->SetToolTipText("Double sampling rate"); | |
10b1edfc | 99 | fEvent->AddFrame(fDoubleSR, new TGLayoutHints(kLHintsLeft, 12, 0, 2, 0)); |
b6b01ba3 | 100 | fDoubleSR->Connect("Toggled(Bool_t)", |
d810d0de | 101 | "AliEveTPCLoaderEditor", this, "DoDoubleSR()"); |
e9a38ea3 | 102 | AddFrame(fEvent); |
103 | ||
10b1edfc | 104 | |
d810d0de | 105 | // AliEveTPCData load settings |
10b1edfc | 106 | |
107 | labelW = 90; | |
108 | ||
84aff7a4 | 109 | fDataLoadThreshold = new TEveGValuator(this, "Load threshold:", 110, 0); |
10b1edfc | 110 | fDataLoadThreshold->SetShowSlider(kFALSE); |
111 | fDataLoadThreshold->SetLabelWidth(labelW); | |
112 | fDataLoadThreshold->SetNELength(6); | |
113 | fDataLoadThreshold->Build(); | |
114 | fDataLoadThreshold->SetLimits(0, 1000); | |
fe83f7ce | 115 | fDataLoadThreshold->SetToolTip("Minimum signal that will be stored (pedestal subtracted first)."); |
10b1edfc | 116 | fDataLoadThreshold->Connect |
117 | ("ValueSet(Double_t)", | |
d810d0de | 118 | "AliEveTPCLoaderEditor", this, "DoDataLoadThreshold()"); |
10b1edfc | 119 | AddFrame(fDataLoadThreshold, new TGLayoutHints(kLHintsLeft, 0, 0, 6, 0)); |
120 | ||
84aff7a4 | 121 | fDataLoadPedestal = new TEveGValuator(this, "Load pedestal:", 110, 0); |
10b1edfc | 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)", | |
d810d0de | 130 | "AliEveTPCLoaderEditor", this, "DoDataLoadPedestal()"); |
10b1edfc | 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)", | |
d810d0de | 136 | "AliEveTPCLoaderEditor", this, "DoDataAutoPedestal()"); |
10b1edfc | 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()", | |
d810d0de | 147 | "AliEveTPCLoaderEditor", this, "DoUpdateSectors()"); |
10b1edfc | 148 | fReloadSectors = new TGTextButton(f, "Reload Sectors"); |
149 | f->AddFrame(fReloadSectors, new TGLayoutHints(kLHintsExpandX, 4,0,0,0)); | |
150 | fReloadSectors->Connect("Clicked()", | |
d810d0de | 151 | "AliEveTPCLoaderEditor", this, "DoReloadSectors()"); |
10b1edfc | 152 | AddFrame(f, new TGLayoutHints(kLHintsExpandX, 8,8,8,0)); |
153 | } | |
e9a38ea3 | 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()", | |
d810d0de | 159 | "AliEveTPCLoaderEditor", this, "DoCreateSectors3D()"); |
e9a38ea3 | 160 | fDeleteSectors3D = new TGTextButton(f, "Delete 3D"); |
161 | f->AddFrame(fDeleteSectors3D, new TGLayoutHints(kLHintsExpandX, 4,0,0,0)); | |
162 | fDeleteSectors3D->Connect("Clicked()", | |
d810d0de | 163 | "AliEveTPCLoaderEditor", this, "DoDeleteSectors3D()"); |
e9a38ea3 | 164 | AddFrame(f, new TGLayoutHints(kLHintsExpandX, 8,8,8,0)); |
165 | } | |
e9a38ea3 | 166 | } |
167 | ||
57ffa5fb | 168 | /******************************************************************************/ |
e9a38ea3 | 169 | |
d810d0de | 170 | void AliEveTPCLoaderEditor::SetModel(TObject* obj) |
e9a38ea3 | 171 | { |
a97abca8 | 172 | // Set model object. |
173 | ||
d810d0de | 174 | fM = dynamic_cast<AliEveTPCLoader*>(obj); |
e9a38ea3 | 175 | |
89ec258e | 176 | // !!!! order changed, need TGTextEntry::SetText NO BLOODY EMIT. |
ad549815 | 177 | fFile->SetText(fM->fFile); |
e9a38ea3 | 178 | fEvent->SetValue(fM->fEvent); |
179 | fEvent->SetEnabled(fM->fEvent >= 0); | |
10b1edfc | 180 | fDoubleSR->SetState(fM->fDoubleSR ? kButtonDown : kButtonUp); |
181 | ||
d810d0de | 182 | AliEveTPCData* tpcd = fM->GetData(); |
10b1edfc | 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 | } | |
e9a38ea3 | 192 | } |
193 | ||
57ffa5fb | 194 | /******************************************************************************/ |
195 | /******************************************************************************/ | |
e9a38ea3 | 196 | |
a15e6d7d | 197 | void AliEveTPCLoaderEditor::FileSelect() |
198 | { | |
199 | // Slot for FileSelect. | |
200 | ||
201 | static const char *kTPCFileTypes[] = { | |
e9a38ea3 | 202 | "Root files", "*.root", |
203 | "All files", "*.*", | |
204 | 0, 0 | |
205 | }; | |
a97abca8 | 206 | |
e9a38ea3 | 207 | TGFileInfo fi; |
fda47a05 | 208 | fi.fIniDir = StrDup(gSystem->DirName (fM->fFile)); |
209 | fi.fFilename = StrDup(gSystem->BaseName(fM->fFile)); | |
a15e6d7d | 210 | fi.fFileTypes = kTPCFileTypes; |
89ec258e | 211 | |
84aff7a4 | 212 | new TGFileDialog(fClient->GetRoot(), gEve->GetMainWindow(), kFDOpen, &fi); |
89ec258e | 213 | if (!fi.fFilename) |
214 | return; | |
215 | ||
ad549815 | 216 | fFile->SetText(fi.fFilename); |
e9a38ea3 | 217 | } |
218 | ||
d810d0de | 219 | void AliEveTPCLoaderEditor::FileChanged() |
e9a38ea3 | 220 | { |
a97abca8 | 221 | // Slot for FileChanged. |
222 | ||
ad549815 | 223 | fM->fFile = fFile->GetText(); |
e9a38ea3 | 224 | } |
225 | ||
d810d0de | 226 | void AliEveTPCLoaderEditor::DoOpen() |
e9a38ea3 | 227 | { |
a97abca8 | 228 | // Slot for Open. |
229 | ||
e9a38ea3 | 230 | fM->OpenFile(); |
a8600b56 | 231 | SetModel(fM); |
e9a38ea3 | 232 | } |
233 | ||
57ffa5fb | 234 | /******************************************************************************/ |
e9a38ea3 | 235 | |
d810d0de | 236 | void AliEveTPCLoaderEditor::DoEvent() |
e9a38ea3 | 237 | { |
a97abca8 | 238 | // Slot for Event. |
239 | ||
e9a38ea3 | 240 | fM->GotoEvent((Int_t) fEvent->GetValue()); |
a8600b56 | 241 | SetModel(fM); |
e9a38ea3 | 242 | } |
243 | ||
d810d0de | 244 | void AliEveTPCLoaderEditor::DoDoubleSR() |
6e91772d | 245 | { |
a97abca8 | 246 | // Slot for DoubleSR. |
247 | ||
6e91772d | 248 | fM->SetDoubleSR(fDoubleSR->IsOn()); |
249 | Update(); | |
250 | } | |
251 | ||
57ffa5fb | 252 | /******************************************************************************/ |
e9a38ea3 | 253 | |
d810d0de | 254 | void AliEveTPCLoaderEditor::DoDataLoadThreshold() |
10b1edfc | 255 | { |
a97abca8 | 256 | // Slot for DataLoadThreshold. |
257 | ||
10b1edfc | 258 | if (fM->GetData() == 0) return; |
259 | fM->GetData()->SetLoadThreshold((Short_t) fDataLoadThreshold->GetValue()); | |
260 | } | |
261 | ||
d810d0de | 262 | void AliEveTPCLoaderEditor::DoDataLoadPedestal() |
10b1edfc | 263 | { |
a97abca8 | 264 | // Slot for DataLoadPedestal. |
265 | ||
10b1edfc | 266 | if (fM->GetData() == 0) return; |
267 | fM->GetData()->SetLoadPedestal((Short_t) fDataLoadPedestal->GetValue()); | |
268 | } | |
269 | ||
d810d0de | 270 | void AliEveTPCLoaderEditor::DoDataAutoPedestal() |
10b1edfc | 271 | { |
a97abca8 | 272 | // Slot for DataAutoPedestal. |
273 | ||
10b1edfc | 274 | if (fM->GetData() == 0) return; |
275 | fM->GetData()->SetAutoPedestal(fDataAutoPedestal->IsOn()); | |
276 | fDataLoadPedestal->SetEnabled(!fDataAutoPedestal->IsOn()); | |
277 | } | |
278 | ||
57ffa5fb | 279 | /******************************************************************************/ |
10b1edfc | 280 | |
d810d0de | 281 | void AliEveTPCLoaderEditor::DoUpdateSectors() |
e9a38ea3 | 282 | { |
a97abca8 | 283 | // Slot for UpdateSectors. |
284 | ||
e9a38ea3 | 285 | fM->UpdateSectors(); |
286 | } | |
287 | ||
d810d0de | 288 | void AliEveTPCLoaderEditor::DoReloadSectors() |
10b1edfc | 289 | { |
a97abca8 | 290 | // Slot for ReloadSectors. |
291 | ||
10b1edfc | 292 | fM->ReloadSectors(); |
293 | } | |
294 | ||
d810d0de | 295 | void AliEveTPCLoaderEditor::DoCreateSectors3D() |
e9a38ea3 | 296 | { |
a97abca8 | 297 | // Slot for CreateSectors3D. |
298 | ||
e9a38ea3 | 299 | fM->CreateSectors3D(); |
300 | } | |
301 | ||
302 | ||
d810d0de | 303 | void AliEveTPCLoaderEditor::DoDeleteSectors3D() |
e9a38ea3 | 304 | { |
a97abca8 | 305 | // Slot for DeleteSectors3D. |
306 | ||
e9a38ea3 | 307 | fM->DeleteSectors3D(); |
308 | } |