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