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