]>
Commit | Line | Data |
---|---|---|
215d5755 | 1 | /************************************************************************** |
2 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * | |
3 | * * | |
4 | * Author: The ALICE Off-line Project. * | |
5 | * Contributors are mentioned in the code where appropriate. * | |
6 | * * | |
7 | * Permission to use, copy, modify and distribute this software and its * | |
8 | * documentation strictly for non-commercial purposes is hereby granted * | |
9 | * without fee, provided that the above copyright notice appears in all * | |
10 | * copies and that both the copyright notice and this permission notice * | |
11 | * appear in the supporting documentation. The authors make no claims * | |
12 | * about the suitability of this software for any purpose. It is * | |
13 | * provided "as is" without express or implied warranty. * | |
14 | **************************************************************************/ | |
15 | ||
16 | // $Id$ | |
17 | // $MpId$ | |
18 | ||
19 | #include "AliMpDEVisu.h" | |
e4d2775e | 20 | |
21 | #include "AliMpSlatMotifMap.h" | |
22 | #include "AliMpSt345Reader.h" | |
23 | #include "AliMpSectorReader.h" | |
24 | #include "AliMpSlat.h" | |
25 | #include "AliMpPCB.h" | |
e4d2775e | 26 | #include "AliMpSectorReader.h" |
27 | #include "AliMpSector.h" | |
28 | #include "AliMpRow.h" | |
29 | #include "AliMpVRowSegment.h" | |
e4d2775e | 30 | #include "AliMpVPainter.h" |
e4d2775e | 31 | #include "AliMpMotifPosition.h" |
32 | #include "AliMpMotifMap.h" | |
e4d2775e | 33 | #include "AliMpDEIterator.h" |
34 | #include "AliMpDEManager.h" | |
35 | #include "AliMpDetElement.h" | |
36 | #include "AliMpStationType.h" | |
37 | #include "AliMpSegmentation.h" | |
38 | #include "AliMpPad.h" | |
39 | #include "AliMpDDLStore.h" | |
ab167304 | 40 | #include "AliMpManuStore.h" |
215d5755 | 41 | #include "AliMpVPadIterator.h" |
37ec2d4a | 42 | #include "AliMpCDB.h" |
ab167304 | 43 | #include "AliMpDataStreams.h" |
e4d2775e | 44 | |
215d5755 | 45 | #include "AliLog.h" |
46 | ||
47 | #include <TMath.h> | |
48 | #include <TString.h> | |
215d5755 | 49 | #include <TCanvas.h> |
50 | #include <TGButton.h> | |
51 | #include <TRootEmbeddedCanvas.h> | |
52 | #include <TGLabel.h> | |
53 | #include <TGComboBox.h> | |
54 | #include <TGNumberEntry.h> | |
55 | #include <TGTextView.h> | |
56 | #include <TGTextEntry.h> | |
e4d2775e | 57 | |
290882e9 | 58 | #include <cstdio> |
59 | ||
e4d2775e | 60 | // Category: graphics |
3d1463c8 | 61 | |
62 | //----------------------------------------------------------------------------- | |
e4d2775e | 63 | // Class AliMpDEVisu |
64 | // ----------------------- | |
65 | // GUI for drawing segmentation | |
66 | // motif manu and associated channels | |
67 | // date: 2007/01/26 | |
68 | // Author: Ch. Finck | |
3d1463c8 | 69 | //----------------------------------------------------------------------------- |
e4d2775e | 70 | |
71 | /// \cond CLASSIMP | |
72 | ClassImp(AliMpDEVisu) | |
73 | /// \endcond | |
74 | ||
75 | //_________________________________________________________________ | |
76 | AliMpDEVisu::AliMpDEVisu(UInt_t w, UInt_t h) | |
215d5755 | 77 | : TGFrame(gClient->GetRoot(), w, h), |
78 | fkMainWindow(gClient->GetRoot()), | |
79 | fMain(new TGMainFrame(gClient->GetRoot(), w, h)), | |
80 | fEcanvas(0x0), | |
81 | fChamberCombo(0x0), | |
82 | fDECombo(0x0), | |
83 | fNumberEntry(0x0), | |
84 | fPlaneButton(0x0), | |
85 | fZoomButton(0x0), | |
d58f6c58 | 86 | fNameDECombo(0x0), |
215d5755 | 87 | fLogMessage(0x0), |
88 | fLogFile(0x0), | |
89 | fTrashList(0x0), | |
90 | fDEComboIdx(), | |
d58f6c58 | 91 | fNameDEComboIdx(), |
92 | fDEOccurrence(1026), | |
215d5755 | 93 | fCurrentPlane(AliMp::kBendingPlane), |
94 | fCurrentDetElem(100), | |
95 | fCurrentDEName(), | |
7d5d0cc5 | 96 | fkSegmentation(), |
4a3224ff | 97 | fDDLStore(0x0), |
ab167304 | 98 | fManuStore(0x0), |
215d5755 | 99 | fZoomMode(false) |
e4d2775e | 100 | { |
215d5755 | 101 | /// Standard constructor |
e4d2775e | 102 | |
37ec2d4a | 103 | // Load mapping |
331a617a | 104 | if ( ! AliMpCDB::LoadDDLStore() ) { |
37ec2d4a | 105 | AliFatal("Could not access mapping from OCDB !"); |
106 | } | |
37ec2d4a | 107 | |
ab167304 | 108 | if ( ! AliMpCDB::LoadManuStore() ) { |
109 | AliFatal("Could not access run-dependent mapping from OCDB !"); | |
110 | } | |
37ec2d4a | 111 | |
ab167304 | 112 | fDDLStore = AliMpDDLStore::Instance(); |
113 | fManuStore = AliMpManuStore::Instance(); | |
37ec2d4a | 114 | |
215d5755 | 115 | fTrashList.SetOwner(kFALSE); |
116 | ||
117 | // Create canvas widget | |
118 | ||
119 | Int_t width = Int_t(w*0.99); | |
120 | Int_t height = Int_t(h*0.99); | |
121 | ||
122 | fEcanvas = new TRootEmbeddedCanvas("Ecanvas",fMain, width, height); | |
123 | fEcanvas->GetCanvas()->Connect("ProcessedEvent(Int_t, Int_t, Int_t, TObject*)", | |
124 | "AliMpDEVisu", | |
125 | this, | |
126 | "HandleMovement(Int_t, Int_t, Int_t, TObject*)"); | |
127 | ||
128 | // Create a horizontal frame widget with buttons | |
129 | TGHorizontalFrame *hframe = new TGHorizontalFrame(fMain,width,height/6); | |
130 | ||
131 | TGTextButton *draw = new TGTextButton(hframe,"&Draw"); | |
132 | draw->Connect("Clicked()","AliMpDEVisu",this,"DrawDE()"); | |
133 | hframe->AddFrame(draw, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,15,5,3,4)); | |
134 | ||
135 | TGTextButton *exit = new TGTextButton(hframe,"&Exit","gApplication->Terminate(0)"); | |
136 | hframe->AddFrame(exit, new TGLayoutHints(kLHintsLeft| kLHintsCenterY,5,5,3,4)); | |
137 | ||
138 | ||
139 | Int_t i = 0; | |
140 | Char_t text[20]; | |
141 | ||
142 | // chamber label | |
143 | TGLabel* chamberLabel = new TGLabel(hframe, "Chamber :"); | |
144 | hframe->AddFrame(chamberLabel, new TGLayoutHints(kLHintsCenterX | kLHintsLeft | kLHintsCenterY, 10, 0, 20, 0)); | |
145 | fChamberCombo = new TGComboBox(hframe, kChamberCombo); | |
146 | ||
147 | fDEComboIdx.Set(26); | |
148 | for(i = 0; i < 10; i++) | |
149 | { | |
290882e9 | 150 | snprintf(text,20,"%d",i+1); |
215d5755 | 151 | fChamberCombo->AddEntry(text,i); |
152 | } | |
153 | fChamberCombo->Resize(40,20); | |
154 | fChamberCombo->Select(0); | |
155 | fChamberCombo->Associate(this); | |
156 | hframe->AddFrame(fChamberCombo, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0)); | |
157 | ||
158 | // DE label | |
159 | TGLabel* detElemLabel = new TGLabel(hframe, "DE :"); | |
160 | hframe->AddFrame(detElemLabel, new TGLayoutHints(kLHintsCenterX | kLHintsLeft | kLHintsCenterY, 10, 0, 20, 0)); | |
161 | fDECombo = new TGComboBox(hframe, kDECombo); | |
162 | UpdateComboDE(); | |
163 | ||
164 | fDECombo->Resize(80,20); | |
165 | fDECombo->Select(0); | |
166 | fDECombo->Associate(this); | |
167 | hframe->AddFrame(fDECombo, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0)); | |
d58f6c58 | 168 | fDEOccurrence.Reset(-1); |
169 | ||
215d5755 | 170 | TGTextButton *next = new TGTextButton(hframe,"&Next"); |
171 | next->Connect("Clicked()","AliMpDEVisu",this,"NextDE()"); | |
172 | hframe->AddFrame(next, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,5,5,3,4)); | |
173 | ||
174 | // DE name | |
175 | TGLabel* detElemName = new TGLabel(hframe, "Name :"); | |
176 | hframe->AddFrame(detElemName, new TGLayoutHints(kLHintsCenterX | kLHintsLeft | kLHintsCenterY, 10, 0, 20, 0)); | |
177 | ||
178 | AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem); | |
179 | fCurrentDEName = detElem->GetDEName(); | |
d58f6c58 | 180 | fNameDECombo = new TGComboBox(hframe, kDEName); |
181 | ||
09840862 | 182 | UpdateNameView(kTRUE); |
d58f6c58 | 183 | fNameDECombo->Resize(160, 20); |
184 | fNameDECombo->Select(0); | |
185 | fNameDECombo->Associate(this); | |
186 | hframe->AddFrame(fNameDECombo, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0)); | |
215d5755 | 187 | |
188 | // plane type | |
189 | fPlaneButton = new TGCheckButton(hframe, "NB Plane", kPlaneType); | |
190 | fPlaneButton->SetState(kButtonUp); | |
191 | fPlaneButton->Associate(this); | |
192 | hframe->AddFrame(fPlaneButton, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0)); | |
193 | ||
194 | ||
195 | // button motif | |
196 | TGTextButton* drawManu = new TGTextButton(hframe,"&Search"); | |
197 | drawManu->Connect("Clicked()","AliMpDEVisu",this,"DrawManuMotif(Bool_t)"); | |
198 | drawManu->SetToolTipText("Search for a given manu number"); | |
199 | hframe->AddFrame(drawManu, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,15,5,3,4)); | |
200 | ||
201 | // entry manu | |
202 | fNumberEntry = new TGNumberEntry(hframe, 0, 4, -1, | |
203 | TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative, | |
204 | TGNumberFormat::kNELLimitMinMax, 1, 1500); | |
205 | fNumberEntry->Resize(60,20); | |
206 | hframe->AddFrame(fNumberEntry, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 10, 0, 9, 0)); | |
207 | ||
208 | // reset button | |
209 | TGTextButton *resetManu = new TGTextButton(hframe,"&Reset"); | |
210 | resetManu->Connect("Clicked()","AliMpDEVisu",this,"ResetManu()"); | |
211 | hframe->AddFrame(resetManu, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,10,5,3,4)); | |
212 | ||
213 | // delete window button | |
214 | TGTextButton* deletePopup = new TGTextButton(hframe,"&Delete_Popup"); | |
215 | deletePopup->Connect("Clicked()","AliMpDEVisu",this,"DeletePopUp()"); | |
216 | deletePopup->SetToolTipText("Delete motif popup window"); | |
217 | hframe->AddFrame(deletePopup, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,15,5,3,4)); | |
218 | ||
219 | ||
220 | // log mesg | |
221 | TGHorizontalFrame *logFrame = new TGHorizontalFrame(fMain, width/2, height/6); | |
222 | ||
223 | TGLabel* logName = new TGLabel(logFrame, "Log MSG:"); | |
224 | logFrame->AddFrame(logName, new TGLayoutHints(kLHintsCenterX | kLHintsLeft | kLHintsCenterY, 10, 0, 2, 0)); | |
225 | ||
226 | fLogMessage = new TGTextView(logFrame, width/2, 60); | |
227 | fLogMessage->ShowBottom(); | |
228 | ||
229 | logFrame->AddFrame(fLogMessage, new TGLayoutHints(kLHintsLeft, 10, 0, 2, 0)); | |
230 | ||
231 | // clear log mesg | |
e4d2775e | 232 | TGTextButton* clearLog = new TGTextButton(logFrame,"&Clear"); |
215d5755 | 233 | clearLog->Connect("Clicked()","AliMpDEVisu",this,"ClearLogMessage()"); |
234 | clearLog->SetToolTipText("Clear log message"); | |
235 | logFrame->AddFrame(clearLog, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,15,5,3,4)); | |
236 | ||
237 | // save log mesg | |
238 | TGTextButton* saveLog = new TGTextButton(logFrame,"&Save"); | |
239 | saveLog->Connect("Clicked()","AliMpDEVisu",this,"SaveLogMessage()"); | |
240 | saveLog->SetToolTipText("Save log message into file"); | |
241 | logFrame->AddFrame(saveLog, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,5,5,3,4)); | |
242 | ||
243 | // log file name | |
244 | fLogFile = new TGTextEntry(logFrame,"AliMpDEVisu.log"); | |
245 | fLogFile->SetToolTipText("Default log file name"); | |
246 | logFrame->AddFrame(fLogFile, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 10, 0, 9, 0)); | |
247 | ||
248 | // zoom mode | |
249 | fZoomButton = new TGCheckButton(logFrame, new TGHotString("&Zoom Mode"), kZoomMode); | |
250 | fZoomButton->Associate(this); | |
251 | fZoomButton->SetState(kButtonUp); | |
e4d2775e | 252 | |
215d5755 | 253 | logFrame->AddFrame(fZoomButton, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 20, 0, 9, 0)); |
254 | ||
255 | // frame | |
256 | fMain->AddFrame(hframe, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,2,2,10,10)); | |
257 | fMain->AddFrame(fEcanvas, new TGLayoutHints(kLHintsCenterX, 10,10,10,10)); | |
258 | ||
259 | fMain->AddFrame(logFrame, new TGLayoutHints(kLHintsLeft,2,2,2,10)); | |
260 | ||
261 | // Set a name to the main frame | |
262 | fMain->SetWindowName("MUON Detection Element Visualization"); | |
263 | ||
264 | // Map all subwindows of main frame | |
265 | fMain->MapSubwindows(); | |
266 | ||
267 | // Initialize the layout algorithm | |
268 | fMain->Resize(fMain->GetDefaultSize()); | |
269 | ||
270 | // Map main frame | |
271 | fMain->MapWindow(); | |
272 | ||
273 | // instance segmentation | |
7d5d0cc5 | 274 | fkSegmentation = AliMpSegmentation::Instance()->GetMpSegmentation(fCurrentDetElem, detElem->GetCathodType(fCurrentPlane)); |
215d5755 | 275 | fLogMessage->AddLine("Segmentation loaded"); |
276 | fLogMessage->ShowBottom(); | |
e4d2775e | 277 | } |
278 | ||
279 | //____________________________________________________________ | |
280 | AliMpDEVisu::~AliMpDEVisu() | |
281 | { | |
215d5755 | 282 | /// Clean up used widgets: frames, buttons, layouthints |
283 | ||
284 | fChamberCombo->Delete(); | |
285 | fDECombo->Delete(); | |
286 | fNumberEntry->Delete(); | |
287 | fPlaneButton->Delete(); | |
d58f6c58 | 288 | fNameDECombo->Delete(); |
215d5755 | 289 | fLogMessage->Delete(); |
290 | fLogFile->Delete(); | |
291 | fMain->Cleanup(); | |
292 | delete fMain; | |
e4d2775e | 293 | } |
294 | ||
295 | //__________________________________________________________ | |
296 | void AliMpDEVisu::HandleMovement(Int_t eventType, Int_t eventX, Int_t eventY, TObject* /*select*/) | |
297 | { | |
215d5755 | 298 | /// handle cursor mouvement |
299 | ||
300 | static Int_t eventXold, eventYold; | |
301 | static Int_t eventX0, eventY0; | |
302 | static Int_t linedrawn; | |
303 | ||
e4d2775e | 304 | |
215d5755 | 305 | // enable again KeyAutoRepeat after HandleKey |
306 | if (eventType == kKeyPress) { | |
307 | gVirtualX->SetKeyAutoRepeat(kTRUE); | |
308 | } | |
e4d2775e | 309 | |
215d5755 | 310 | fEcanvas->GetCanvas()->cd(); |
e4d2775e | 311 | |
215d5755 | 312 | // zoom mode |
313 | if (fZoomMode) { | |
314 | ||
315 | if (eventType == kButton1Down) { | |
316 | gVirtualX->SetLineWidth(3); | |
317 | eventX0 = eventX; eventY0 = eventY; | |
318 | eventXold = eventX; eventYold = eventY; | |
319 | linedrawn = 0; | |
320 | } | |
321 | ||
322 | if (eventType == kButton1Motion) { | |
323 | if (linedrawn) gVirtualX->DrawBox(eventX0, eventY0, eventXold, eventYold, TVirtualX::kHollow); | |
324 | eventXold = eventX; | |
325 | eventYold = eventY; | |
326 | linedrawn = 1; | |
327 | gVirtualX->DrawBox(eventX0, eventY0, eventXold, eventYold, TVirtualX::kHollow); | |
328 | } | |
329 | ||
330 | if (eventType == kButton1Up) | |
331 | { | |
332 | if ( (eventX0 - eventX) && (eventY0 - eventY) ) | |
333 | { | |
334 | PopUpZoom(eventX0,eventY0,eventX,eventY); | |
335 | linedrawn=1; | |
336 | } | |
337 | } | |
338 | ||
339 | ||
340 | } else { | |
341 | ||
342 | // click mode | |
343 | ||
344 | if (eventType == kButton1Down) { | |
345 | ||
346 | // calculated in pixel | |
e4d2775e | 347 | Double_t x = 0.; |
348 | Double_t y = 0.; | |
215d5755 | 349 | |
350 | EventToReal(eventX,eventY,x,y); | |
351 | ||
352 | // get manu | |
6e97fbb8 | 353 | AliMpPad pad = fkSegmentation->PadByPosition(x,y, false); |
215d5755 | 354 | |
e4d2775e | 355 | if (!pad.IsValid()) { |
215d5755 | 356 | |
357 | fLogMessage->AddLine(Form("PopupManuMotif: No manu for DE: %d at position (%5.2f, %5.2f)", | |
358 | fCurrentDetElem, x, y)); | |
359 | fLogMessage->ShowBottom(); | |
360 | return; | |
e4d2775e | 361 | } |
215d5755 | 362 | |
168e9c4d | 363 | Int_t manu = pad.GetManuId(); |
215d5755 | 364 | |
e4d2775e | 365 | fNumberEntry->SetNumber(manu); |
215d5755 | 366 | |
367 | ||
368 | fLogMessage->AddLine(Form("PopupManuMotif: DE: %d, manu: %d at position: %5.2f, %5.2f", | |
369 | fCurrentDetElem, manu, x, y)); | |
e4d2775e | 370 | fLogMessage->ShowBottom(); |
215d5755 | 371 | |
e4d2775e | 372 | DrawManuMotif(true); |
215d5755 | 373 | |
e4d2775e | 374 | } |
215d5755 | 375 | } |
e4d2775e | 376 | } |
377 | ||
378 | //__________________________________________________________ | |
215d5755 | 379 | void AliMpDEVisu::DrawDE(Bool_t info) |
e4d2775e | 380 | { |
215d5755 | 381 | /// Draws function graphics in randomly choosen interval |
382 | ||
383 | if (info) | |
e4d2775e | 384 | InfoDE(); |
215d5755 | 385 | |
386 | fEcanvas->GetCanvas()->cd(); | |
387 | fEcanvas->GetCanvas()->SetEditable(kTRUE); | |
388 | ||
09840862 | 389 | fNameDECombo->Select(fDEOccurrence[fCurrentDetElem]); |
390 | TGLBEntry* entry = fNameDECombo->GetSelectedEntry(); | |
391 | entry->SetBackgroundColor(0xDDDDDD); | |
392 | ||
215d5755 | 393 | if (AliMpDEManager::GetStationType(fCurrentDetElem) == AliMp::kStation345 ) { |
e4d2775e | 394 | |
215d5755 | 395 | DrawSlat("PMCI"); |
396 | ||
397 | } else { | |
398 | ||
399 | DrawQuadrant("RSMCI"); | |
400 | ||
401 | } | |
402 | DeletePopUp(); | |
403 | fEcanvas->GetCanvas()->SetEditable(kFALSE); | |
404 | ||
e4d2775e | 405 | } |
406 | ||
407 | //__________________________________________________________ | |
408 | void AliMpDEVisu::DrawManuMotif(Bool_t popup) | |
409 | { | |
71a2d3aa | 410 | /// Draw manu motif in yellow and popup channel motif window |
e4d2775e | 411 | |
215d5755 | 412 | fEcanvas->GetCanvas()->SetEditable(kTRUE); |
413 | ||
414 | if (!fNumberEntry->GetIntNumber()) return; | |
415 | ||
416 | Char_t command[255]; | |
417 | ||
418 | if (AliMpDEManager::GetStationType(fCurrentDetElem) == AliMp::kStation345 ) { | |
419 | ||
290882e9 | 420 | snprintf(command, 255, "%s%d", "PMCI:", (Int_t)fNumberEntry->GetIntNumber()); |
215d5755 | 421 | |
422 | DrawSlat(command, popup); | |
423 | ||
424 | } else { | |
425 | ||
290882e9 | 426 | snprintf(command, 255, "%s%d", "RSMCI:", (Int_t)fNumberEntry->GetIntNumber()); |
215d5755 | 427 | |
428 | DrawQuadrant(command, popup); | |
429 | ||
430 | } | |
431 | ||
432 | fEcanvas->GetCanvas()->SetEditable(kFALSE); | |
e4d2775e | 433 | } |
434 | ||
435 | //__________________________________________________________ | |
436 | void AliMpDEVisu::DrawSlat(Option_t* option, Bool_t popup) | |
437 | { | |
215d5755 | 438 | /// draw slat segmentation |
439 | ||
440 | TCanvas *canvas = fEcanvas->GetCanvas(); | |
441 | canvas->Clear(); | |
442 | ||
443 | AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem); | |
444 | TString nameType = detElem->GetSegType(); | |
ab167304 | 445 | |
446 | AliMpDataStreams dataStreams; | |
447 | ||
183279c1 | 448 | AliMpSlatMotifMap mm; |
449 | ||
21027e5a | 450 | AliMpSt345Reader reader(&mm); |
451 | AliMpSlat* slatCurrent = reader.ReadSlat(dataStreams,nameType.Data(), fCurrentPlane); | |
452 | AliMpSlat* slatOther = reader.ReadSlat(dataStreams,nameType.Data(), AliMp::OtherPlaneType(fCurrentPlane)); | |
215d5755 | 453 | |
454 | AliMpVPainter* painter = AliMpVPainter::CreatePainter(slatCurrent); | |
455 | painter->Draw(option); | |
456 | ||
457 | canvas->Update(); | |
458 | ||
459 | Int_t numberOfManu = | |
460 | slatCurrent->GetNofElectronicCards() + | |
461 | slatOther->GetNofElectronicCards(); | |
462 | ||
463 | fLogMessage->AddLine(Form("DrawSlat: number of manus: %d", numberOfManu)); | |
464 | fLogMessage->ShowBottom(); | |
465 | ||
466 | if (popup) | |
467 | PopUpManuMotif(slatCurrent); | |
e4d2775e | 468 | |
e4d2775e | 469 | } |
470 | ||
471 | //__________________________________________________________ | |
215d5755 | 472 | void AliMpDEVisu::DrawQuadrant(Option_t* option, Bool_t popup) |
e4d2775e | 473 | { |
215d5755 | 474 | /// draw quadrant segmentation |
475 | ||
476 | TCanvas *canvas = fEcanvas->GetCanvas(); | |
477 | canvas->Clear(); | |
478 | ||
479 | AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem); | |
4e51cfd2 | 480 | AliMq::Station12Type station = detElem->GetStation12Type(); |
e4d2775e | 481 | |
ab167304 | 482 | AliMpDataStreams dataStreams; |
483 | ||
21027e5a | 484 | AliMpSectorReader readerCurrent(station, fCurrentPlane); |
485 | AliMpSector* sectorCurrent = readerCurrent.BuildSector(dataStreams); | |
215d5755 | 486 | |
21027e5a | 487 | AliMpSectorReader readerOther(station, AliMp::OtherPlaneType(fCurrentPlane)); |
488 | AliMpSector* sectorOther = readerOther.BuildSector(dataStreams); | |
215d5755 | 489 | |
490 | AliMpVPainter *painter = AliMpVPainter::CreatePainter(sectorCurrent); | |
491 | painter->Draw(option); | |
492 | ||
493 | canvas->Update(); | |
494 | ||
495 | Int_t numberOfManu = | |
e4d2775e | 496 | sectorCurrent->GetMotifMap()->GetNofMotifPositions() + |
497 | sectorOther->GetMotifMap()->GetNofMotifPositions(); | |
e4d2775e | 498 | |
215d5755 | 499 | fLogMessage->AddLine(Form("DrawQuadrant: number of manus: %d", numberOfManu)); |
500 | fLogMessage->ShowBottom(); | |
501 | ||
502 | if (popup) | |
503 | PopUpManuMotif(sectorCurrent); | |
504 | ||
505 | } | |
506 | ||
507 | //______________________________________________________________________________ | |
508 | void | |
6e97fbb8 | 509 | AliMpDEVisu::EventToReal(Int_t eventX, Int_t eventY, |
510 | Double_t& x, Double_t& y) const | |
215d5755 | 511 | { |
512 | /// estimate graphic pad sizes | |
e4d2775e | 513 | |
6e97fbb8 | 514 | static Double_t ulx(gPad->XtoPixel(0.01)); |
515 | static Double_t uly(gPad->YtoPixel(0.99)); | |
516 | static Double_t brx(gPad->XtoPixel(0.99)); | |
517 | static Double_t bry(gPad->YtoPixel(0.01)); | |
e4d2775e | 518 | |
6e97fbb8 | 519 | static Double_t padDimX = brx - ulx; |
520 | static Double_t padDimY = bry - uly; | |
215d5755 | 521 | |
522 | // get DE dimension (half size) | |
6e97fbb8 | 523 | Double_t deDimX(fkSegmentation->GetDimensionX()*2.0); |
524 | Double_t deDimY(fkSegmentation->GetDimensionY()*2.0); | |
215d5755 | 525 | |
6e97fbb8 | 526 | if ( AliMpDEManager::GetStationType(fCurrentDetElem) == AliMp::kStation345 ) |
215d5755 | 527 | { |
528 | // origin at center | |
6e97fbb8 | 529 | x = (eventX - ulx - padDimX/2.)/(padDimX)*deDimX; |
530 | y = (bry - eventY - padDimY/2.)/(padDimY)*deDimY; | |
215d5755 | 531 | |
532 | } | |
533 | else | |
534 | { | |
535 | // origin at bottom left | |
6e97fbb8 | 536 | x = (eventX - ulx)/(padDimX)*deDimX; |
537 | y = (bry - eventY)/(padDimY)*deDimY; | |
215d5755 | 538 | } |
539 | ||
e4d2775e | 540 | } |
541 | ||
542 | //__________________________________________________________ | |
543 | void AliMpDEVisu::ResetManu() | |
544 | { | |
215d5755 | 545 | /// reset manu search entry |
546 | fLogMessage->AddLine("Reset Motif Search Entry:"); | |
547 | fLogMessage->ShowBottom(); | |
548 | fNumberEntry->SetNumber(0); | |
549 | ||
e4d2775e | 550 | } |
551 | ||
552 | //__________________________________________________________ | |
553 | void AliMpDEVisu::DeletePopUp() | |
554 | { | |
555 | /// delete motif popup windows | |
215d5755 | 556 | |
557 | if (fTrashList.GetEntries() > 0) | |
558 | { | |
559 | fLogMessage->AddLine("Delete Motif PopUp Windows:"); | |
560 | fLogMessage->ShowBottom(); | |
561 | ||
562 | fTrashList.Delete(); | |
563 | } | |
e4d2775e | 564 | } |
565 | ||
566 | //__________________________________________________________ | |
567 | void AliMpDEVisu::SaveLogMessage() | |
568 | { | |
215d5755 | 569 | /// save log message into log file |
570 | ||
571 | TString logFile = fLogFile->GetDisplayText(); | |
572 | fLogMessage->GetText()->Save(logFile.Data()); | |
e4d2775e | 573 | |
215d5755 | 574 | fLogMessage->AddLine(Form("SaveLogMessage: saving log message into logfile: %s", logFile.Data())); |
575 | fLogMessage->ShowBottom(); | |
e4d2775e | 576 | } |
577 | ||
578 | //__________________________________________________________ | |
579 | void AliMpDEVisu::ClearLogMessage() | |
580 | { | |
215d5755 | 581 | /// clear log message |
582 | fLogMessage->GetText()->Clear(); | |
583 | fLogMessage->AddLine("ClearLogMessage: clear log messages:"); | |
584 | fLogMessage->ShowBottom(); | |
e4d2775e | 585 | } |
586 | ||
587 | //__________________________________________________________ | |
588 | void AliMpDEVisu::InfoDE() | |
589 | { | |
215d5755 | 590 | /// info concerning the whole DE |
591 | ||
592 | AliMpDetElement* detElem = fDDLStore->GetDetElement(fCurrentDetElem); | |
593 | Int_t ddlId = detElem->GetDdlId(); | |
594 | Int_t numberOfBus = detElem->GetNofBusPatches(); | |
595 | ||
596 | Int_t vec[24]; | |
597 | for (Int_t i = 0; i < detElem->GetNofBusPatches(); ++i) | |
598 | vec[i] = detElem->GetBusPatchId(i); | |
e4d2775e | 599 | |
215d5755 | 600 | Int_t firstBus = TMath::MinElement(detElem->GetNofBusPatches(), vec); |
601 | Int_t lastBus = TMath::MaxElement(detElem->GetNofBusPatches(), vec); | |
602 | ||
ab167304 | 603 | Int_t numberOfSerialManu = fManuStore->NofManus(detElem->GetId()); // number of manu with an identified serial number |
215d5755 | 604 | |
605 | fLogMessage->AddLine(Form("DrawDE: detection element: %d, name: %s", | |
606 | fCurrentDetElem, fCurrentDEName.Data())); | |
607 | fLogMessage->ShowBottom(); | |
608 | ||
609 | fLogMessage->AddLine(Form("DrawDE: DDL: %d, number of buspatches %d from %d to %d", | |
610 | ddlId, numberOfBus, firstBus, lastBus)); | |
611 | fLogMessage->ShowBottom(); | |
612 | ||
613 | if (numberOfSerialManu != 0) { // not available yet for all DE | |
614 | fLogMessage->AddLine(Form("DrawDE: number of manus with serial number: %d", numberOfSerialManu)); | |
e4d2775e | 615 | fLogMessage->ShowBottom(); |
215d5755 | 616 | } |
617 | ||
e4d2775e | 618 | } |
619 | ||
620 | //__________________________________________________________ | |
621 | Bool_t AliMpDEVisu::ProcessMessage(Long_t msg, Long_t parm1, Long_t /*parm2*/) | |
622 | { | |
215d5755 | 623 | /// process message from widgets actions/entries |
e4d2775e | 624 | |
215d5755 | 625 | AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem); |
626 | ||
627 | switch(GET_MSG(msg)) | |
628 | { | |
e4d2775e | 629 | case kC_COMMAND: |
630 | switch (GET_SUBMSG(msg)) | |
631 | { | |
215d5755 | 632 | case kCM_COMBOBOX: |
633 | ||
634 | switch (parm1) | |
635 | { | |
636 | case kChamberCombo: | |
637 | UpdateComboDE(); | |
09840862 | 638 | UpdateNameView(kTRUE); |
215d5755 | 639 | break; |
640 | ||
641 | case kDECombo: | |
642 | UpdateNameView(); | |
643 | break; | |
d58f6c58 | 644 | |
645 | case kDEName: | |
646 | UpdateComboCH(); | |
647 | break; | |
215d5755 | 648 | } |
649 | break; | |
650 | ||
651 | case kCM_CHECKBUTTON: | |
652 | switch (parm1) | |
653 | { | |
654 | case kPlaneType: | |
655 | if (fPlaneButton->GetState() == kButtonDown) { | |
656 | fCurrentPlane = AliMp::kNonBendingPlane; | |
657 | if (fNumberEntry->GetIntNumber() && fNumberEntry->GetIntNumber() <= 1024) | |
658 | fNumberEntry->SetNumber(fNumberEntry->GetIntNumber() + 1024); | |
659 | } else { | |
660 | fCurrentPlane = AliMp::kBendingPlane; | |
661 | if (fNumberEntry->GetIntNumber() && fNumberEntry->GetIntNumber() > 1024) | |
662 | fNumberEntry->SetNumber(fNumberEntry->GetIntNumber() - 1024); | |
663 | } | |
664 | DrawDE(); | |
7d5d0cc5 | 665 | fkSegmentation = AliMpSegmentation::Instance() |
215d5755 | 666 | ->GetMpSegmentation(fCurrentDetElem, detElem->GetCathodType(fCurrentPlane)); |
667 | break; | |
668 | ||
669 | case kZoomMode: | |
670 | if (fZoomButton->GetState() == kButtonDown) | |
671 | fZoomMode = true; | |
672 | else | |
673 | fZoomMode = false; | |
674 | break; | |
675 | } | |
676 | break; | |
677 | ||
e4d2775e | 678 | } |
679 | break; | |
215d5755 | 680 | } |
681 | return true; | |
e4d2775e | 682 | } |
683 | ||
97c15de5 | 684 | //__________________________________________________________ |
685 | void AliMpDEVisu::NextDE() | |
686 | { | |
215d5755 | 687 | /// select next DE |
688 | ||
689 | Int_t next = fDECombo->GetSelected() + 1; | |
690 | ||
691 | if (next < fDECombo->GetNumberOfEntries()) | |
692 | fDECombo->Select(next); | |
693 | else | |
694 | fDECombo->Select(0); | |
695 | ||
696 | UpdateNameView(); | |
697 | DrawDE(); | |
97c15de5 | 698 | } |
699 | ||
d58f6c58 | 700 | //__________________________________________________________ |
701 | void AliMpDEVisu::UpdateComboCH() | |
702 | { | |
703 | /// update Chamber/DE in respect to DE Name | |
704 | ||
705 | fCurrentDEName = fNameDEComboIdx[fNameDECombo->GetSelected()]; | |
706 | ||
707 | AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDEName); | |
708 | ||
09840862 | 709 | Int_t idx = AliMpDEManager::GetChamberId(detElem->GetId()); |
710 | fChamberCombo->Select(idx); | |
d58f6c58 | 711 | |
712 | UpdateComboDE(); | |
713 | ||
09840862 | 714 | idx = detElem->GetId() % 100; |
715 | fDECombo->Select(idx); | |
d58f6c58 | 716 | |
717 | fCurrentDetElem = fDEComboIdx[fDECombo->GetSelected()]; | |
718 | ||
7d5d0cc5 | 719 | fkSegmentation = AliMpSegmentation::Instance() |
d58f6c58 | 720 | ->GetMpSegmentation(fCurrentDetElem, detElem->GetCathodType(fCurrentPlane)); |
721 | } | |
722 | ||
e4d2775e | 723 | //__________________________________________________________ |
724 | void AliMpDEVisu::UpdateComboDE() | |
725 | { | |
215d5755 | 726 | /// update DE in respect to selected chamber |
727 | ||
728 | fDECombo->RemoveAll(); | |
729 | ||
730 | AliMpDEIterator it; | |
731 | Int_t i = 0; | |
732 | fDEComboIdx.Reset(); | |
215d5755 | 733 | |
734 | for ( it.First(fChamberCombo->GetSelected()); ! it.IsDone(); it.Next() ) { | |
d58f6c58 | 735 | fDECombo->AddEntry(Form("%d",it.CurrentDE()->GetId()), i); |
215d5755 | 736 | fDEComboIdx[i++] = it.CurrentDE()->GetId(); |
737 | } | |
738 | fDECombo->Select(0); | |
e4d2775e | 739 | } |
740 | ||
741 | //__________________________________________________________ | |
09840862 | 742 | void AliMpDEVisu::UpdateNameView(Bool_t firstTime) |
e4d2775e | 743 | { |
215d5755 | 744 | /// update DE name in respect to selected DE id. |
d58f6c58 | 745 | |
215d5755 | 746 | fCurrentDetElem = fDEComboIdx[fDECombo->GetSelected()]; |
d58f6c58 | 747 | |
215d5755 | 748 | AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem); |
d58f6c58 | 749 | |
215d5755 | 750 | fCurrentDEName = detElem->GetDEName(); |
e4d2775e | 751 | |
09840862 | 752 | if (firstTime) { |
753 | AliMpDEIterator it; | |
754 | ||
755 | fNameDECombo->RemoveAll(); | |
756 | ||
757 | for ( it.First(fChamberCombo->GetSelected()); !it.IsDone(); it.Next() ) { | |
758 | ||
759 | Int_t detElemId = it.CurrentDE()->GetId(); | |
760 | TString deName = it.CurrentDE()->GetDEName(); | |
761 | ||
762 | Int_t idx = fNameDECombo->GetNumberOfEntries(); | |
763 | fNameDECombo->AddEntry(deName.Data(), idx); | |
764 | fNameDEComboIdx[idx] = deName; | |
765 | fDEOccurrence[detElemId] = idx; | |
766 | } | |
d58f6c58 | 767 | } |
768 | ||
769 | fNameDECombo->Select(fDEOccurrence[fCurrentDetElem]); | |
7d5d0cc5 | 770 | fkSegmentation = AliMpSegmentation::Instance() |
215d5755 | 771 | ->GetMpSegmentation(fCurrentDetElem, detElem->GetCathodType(fCurrentPlane)); |
772 | } | |
e4d2775e | 773 | |
215d5755 | 774 | //______________________________________________________________________________ |
775 | void | |
776 | AliMpDEVisu::CreatePopupWindow(Int_t w, Int_t h, const char* windowName, | |
777 | AliMpVPainter* painter, | |
778 | const char* option) | |
779 | { | |
71a2d3aa | 780 | /// Create transient frame |
215d5755 | 781 | |
782 | TCanvas* c = new TCanvas(windowName,windowName,-200,100,w,h); | |
e4d2775e | 783 | |
215d5755 | 784 | Int_t n = fTrashList.GetEntries(); |
785 | ||
786 | c->Connect("Closed()","AliMpDEVisu",this,Form("ClosePopupWindow(=%d)",n)); | |
787 | ||
788 | fTrashList.AddLast(c); | |
789 | ||
790 | c->Draw(); | |
791 | ||
792 | painter->Draw(option); | |
793 | ||
794 | c->Update(); | |
e4d2775e | 795 | } |
796 | ||
797 | //__________________________________________________________ | |
798 | void AliMpDEVisu::PopUpManuMotif(AliMpSlat* slat) | |
799 | { | |
215d5755 | 800 | /// pop up manu window motif painter for slat |
801 | ||
802 | // motif painter | |
803 | AliMpMotifPosition* motifPosFound = 0x0; | |
804 | AliMpMotifPosition* motifPos = 0x0; | |
805 | Int_t manuId = 0; | |
e4d2775e | 806 | |
630711ed | 807 | for ( Int_t i = 0; i < slat->GetSize(); ++i ) { |
215d5755 | 808 | |
e4d2775e | 809 | AliMpPCB* pcb = slat->GetPCB(i); |
215d5755 | 810 | |
630711ed | 811 | for ( Int_t j = 0; j < slat->GetPCB(i)->GetSize(); ++j ) { |
e4d2775e | 812 | |
97c15de5 | 813 | motifPos = pcb->GetMotifPosition(j); |
e4d2775e | 814 | |
215d5755 | 815 | manuId = motifPos->GetID(); |
e4d2775e | 816 | if (manuId == (Int_t)fNumberEntry->GetIntNumber()) { |
215d5755 | 817 | motifPosFound = motifPos; |
818 | break; | |
e4d2775e | 819 | } |
820 | } | |
821 | if (motifPosFound) | |
215d5755 | 822 | break; |
e4d2775e | 823 | } |
97c15de5 | 824 | |
215d5755 | 825 | if(motifPosFound) |
826 | { | |
827 | InfoManuMotif(motifPosFound); | |
97c15de5 | 828 | |
6e97fbb8 | 829 | Double_t dimensionX(motifPosFound->GetDimensionX()); |
830 | Double_t dimensionY(motifPosFound->GetDimensionY()); | |
97c15de5 | 831 | |
215d5755 | 832 | Int_t h = 500; |
6e97fbb8 | 833 | Int_t w = Int_t(h*dimensionX/dimensionY); |
215d5755 | 834 | AliMpVPainter* painter = AliMpVPainter::CreatePainter(motifPosFound); |
835 | ||
1130977f | 836 | CreatePopupWindow(w,h,Form("Manu %ld",fNumberEntry->GetIntNumber()), |
215d5755 | 837 | painter,"ZT"); |
838 | } | |
e4d2775e | 839 | } |
215d5755 | 840 | |
e4d2775e | 841 | //__________________________________________________________ |
842 | void AliMpDEVisu::PopUpManuMotif(AliMpSector* sector) | |
843 | { | |
215d5755 | 844 | /// pop up manu window motif painter for sector |
845 | ||
846 | // motif painter | |
847 | AliMpMotifPosition* motifPosFound = 0x0; | |
848 | AliMpMotifPosition* motifPos = 0x0; | |
849 | Int_t manuId = 0; | |
97c15de5 | 850 | |
215d5755 | 851 | for (Int_t iRow = 0; iRow < sector->GetNofRows(); ++iRow) { |
852 | ||
853 | AliMpRow* row = sector->GetRow(iRow); | |
854 | ||
855 | for (Int_t iRowSeg = 0; iRowSeg < sector->GetRow(iRow)->GetNofRowSegments(); ++iRowSeg){ | |
856 | ||
bf0d3528 | 857 | for (Int_t iRowSeg2 = 0; iRowSeg2 < row->GetNofRowSegments(); ++iRowSeg2) { |
858 | AliMpVRowSegment *rowSegment = row->GetRowSegment(iRowSeg2); | |
215d5755 | 859 | |
860 | for (Int_t iMotif = 0; iMotif < rowSegment->GetNofMotifs(); ++iMotif){ | |
861 | ||
862 | Int_t motifPositionId = rowSegment->GetMotifPositionId(iMotif); | |
863 | motifPos = rowSegment->GetRow() | |
864 | ->GetMotifMap()->FindMotifPosition(motifPositionId); | |
865 | ||
866 | manuId = motifPos->GetID(); | |
867 | if (manuId == (Int_t)fNumberEntry->GetIntNumber()) { | |
868 | motifPosFound = motifPos; | |
869 | break; | |
870 | } | |
871 | } | |
872 | if (motifPosFound) | |
873 | break; | |
874 | } | |
875 | } | |
876 | if (motifPosFound) | |
877 | break; | |
878 | } | |
879 | ||
880 | if(motifPosFound) | |
881 | { | |
e4d2775e | 882 | |
215d5755 | 883 | InfoManuMotif(motifPosFound); |
e4d2775e | 884 | |
6e97fbb8 | 885 | Double_t dimensionX(motifPosFound->GetDimensionX()); |
886 | Double_t dimensionY(motifPosFound->GetDimensionY()); | |
e4d2775e | 887 | |
215d5755 | 888 | // Create transient frame |
889 | Int_t h = 400; | |
6e97fbb8 | 890 | Int_t w = Int_t(h*dimensionX/dimensionY); |
e4d2775e | 891 | |
215d5755 | 892 | AliMpVPainter* painter = AliMpVPainter::CreatePainter(motifPosFound); |
893 | ||
1130977f | 894 | CreatePopupWindow(w,h,Form("Manu %ld",fNumberEntry->GetIntNumber()), |
215d5755 | 895 | painter,"ZT"); |
896 | ||
897 | } | |
898 | } | |
e4d2775e | 899 | |
215d5755 | 900 | //__________________________________________________________ |
901 | void AliMpDEVisu::InfoManuMotif(AliMpMotifPosition* motifPos) | |
902 | { | |
903 | /// info for popup manu motif | |
e4d2775e | 904 | |
215d5755 | 905 | // log message |
906 | Int_t manuId = fNumberEntry->GetIntNumber(); | |
6e97fbb8 | 907 | |
215d5755 | 908 | fLogMessage->AddLine(Form("PopupManuMotif: motif dimension: %5.2f, %5.2f", |
6e97fbb8 | 909 | motifPos->GetDimensionX()*2., |
910 | motifPos->GetDimensionY()*2.)); | |
215d5755 | 911 | |
912 | fLogMessage->AddLine( Form("PopupManuMotif: pad dimension: %4.2f, %4.2f", | |
6e97fbb8 | 913 | motifPos->GetMotif()->GetPadDimensionX(0)*2., |
914 | motifPos->GetMotif()->GetPadDimensionY(0)*2. )); | |
e4d2775e | 915 | |
215d5755 | 916 | fLogMessage->AddLine( Form("PopupManuMotif: manu: %d, serial number: %d, buspatch: %d", |
ab167304 | 917 | manuId, |
918 | fManuStore->GetManuSerial(fCurrentDetElem, manuId), | |
919 | fDDLStore->GetBusPatchId(fCurrentDetElem, manuId)) ); | |
97c15de5 | 920 | |
215d5755 | 921 | fLogMessage->ShowBottom(); |
e4d2775e | 922 | |
215d5755 | 923 | } |
e4d2775e | 924 | |
215d5755 | 925 | //______________________________________________________________________________ |
926 | void AliMpDEVisu::PopUpZoom(Int_t ix0, Int_t iy0, Int_t ix1, Int_t iy1) | |
927 | { | |
928 | /// popup zoom window | |
e4d2775e | 929 | |
215d5755 | 930 | Double_t x0,y0; |
931 | EventToReal(ix0,iy0,x0,y0); | |
932 | Double_t x1,y1; | |
933 | EventToReal(ix1,iy1,x1,y1); | |
e4d2775e | 934 | |
215d5755 | 935 | fLogMessage->AddLine(Form("PopUpZoom: zoom positions (x0, y0: %6.2f, %6.2f), (x1, y1: %6.2f, %6.2f)", |
936 | x0, y0, x1, y1)); | |
937 | fLogMessage->ShowBottom(); | |
938 | ||
939 | // Create transient frame | |
940 | Int_t h = 500;//TMath::Abs(x1-x0); | |
941 | Int_t w = 500;//TMath::Abs(y1-y0); | |
e4d2775e | 942 | |
6e97fbb8 | 943 | AliMpArea area((x0+x1)/2.0,(y0+y1)/2.0, |
944 | TMath::Abs(x1-x0)/2.0,TMath::Abs(y1-y0)/2.0); | |
215d5755 | 945 | // area.Print(); |
946 | ||
947 | if ( area.IsValid() ) | |
948 | { | |
7d5d0cc5 | 949 | AliMpVPadIterator* iterator = fkSegmentation->CreateIterator(area); |
215d5755 | 950 | if (iterator) |
951 | { | |
952 | AliMpVPainter* painter = AliMpVPainter::CreatePainter(iterator); | |
953 | CreatePopupWindow(w,h,"Zoom",painter,""); | |
e4d2775e | 954 | } |
215d5755 | 955 | else |
956 | { | |
957 | AliError("could not get iterator for that area"); | |
e4d2775e | 958 | } |
215d5755 | 959 | |
960 | delete iterator; | |
961 | } | |
97c15de5 | 962 | } |
963 | ||
964 | //__________________________________________________________ | |
215d5755 | 965 | void AliMpDEVisu::ClosePopupWindow(Int_t id) |
97c15de5 | 966 | { |
215d5755 | 967 | /// close signal |
968 | fEcanvas->GetCanvas()->cd(); | |
969 | fTrashList.RemoveAt(id); | |
e4d2775e | 970 | } |