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