]>
Commit | Line | Data |
---|---|---|
e4d2775e | 1 | #include <TObject.h> |
2 | #include <TList.h> | |
3 | #include <TString.h> | |
4 | #include <TVector2.h> | |
5 | #include <TCanvas.h> | |
6 | #include <TGClient.h> | |
7 | #include <TGButton.h> | |
8 | #include <TRootEmbeddedCanvas.h> | |
9 | #include <TGLabel.h> | |
10 | #include <TGComboBox.h> | |
11 | #include <TGNumberEntry.h> | |
12 | #include <TGTextView.h> | |
13 | #include <TGTextEntry.h> | |
14 | ||
15 | #include "AliMpSlatMotifMap.h" | |
16 | #include "AliMpSt345Reader.h" | |
17 | #include "AliMpSectorReader.h" | |
18 | #include "AliMpSlat.h" | |
19 | #include "AliMpPCB.h" | |
20 | #include "AliMpPCBPainter.h" | |
21 | #include "AliMpSectorReader.h" | |
22 | #include "AliMpSector.h" | |
23 | #include "AliMpRow.h" | |
24 | #include "AliMpVRowSegment.h" | |
25 | #include "AliMpRowPainter.h" | |
26 | #include "AliMpVPainter.h" | |
27 | #include "AliMpMotifPainter.h" | |
28 | #include "AliMpMotifPosition.h" | |
29 | #include "AliMpMotifMap.h" | |
30 | ||
31 | #include "AliMpDEIterator.h" | |
32 | #include "AliMpDEManager.h" | |
33 | #include "AliMpDetElement.h" | |
34 | #include "AliMpStationType.h" | |
35 | #include "AliMpSegmentation.h" | |
36 | #include "AliMpPad.h" | |
37 | #include "AliMpDDLStore.h" | |
38 | ||
39 | #include "AliMpDEVisu.h" | |
40 | ||
41 | // Category: graphics | |
42 | // | |
43 | // Class AliMpDEVisu | |
44 | // ----------------------- | |
45 | // GUI for drawing segmentation | |
46 | // motif manu and associated channels | |
47 | // date: 2007/01/26 | |
48 | // Author: Ch. Finck | |
49 | ||
50 | /// \cond CLASSIMP | |
51 | ClassImp(AliMpDEVisu) | |
52 | /// \endcond | |
53 | ||
54 | //_________________________________________________________________ | |
55 | AliMpDEVisu::AliMpDEVisu(UInt_t w, UInt_t h) | |
56 | : TGFrame(gClient->GetRoot(), w, h), | |
57 | fkMainWindow(gClient->GetRoot()), | |
58 | fMain(new TGMainFrame(gClient->GetRoot(), w, h)), | |
59 | fEcanvas(0x0), | |
60 | fChamberCombo(0x0), | |
61 | fDECombo(0x0), | |
62 | fNumberEntry(0x0), | |
63 | fPlaneButton(0x0), | |
64 | fNameDEView(0x0), | |
65 | fLogMessage(0x0), | |
66 | fLogFile(0x0), | |
67 | fTrashList(0x0), | |
68 | fDEComboIdx(), | |
69 | fCurrentPlane(AliMp::kBendingPlane), | |
70 | fCurrentDetElem(100), | |
71 | fCurrentDEName(), | |
72 | fSegmentation(), | |
73 | fDDLStore(AliMpDDLStore::Instance()) | |
74 | ||
75 | { | |
76 | ||
77 | // Create canvas widget | |
78 | ||
79 | Int_t width = Int_t(w*0.99); | |
80 | Int_t height = Int_t(h*0.99); | |
81 | ||
82 | fEcanvas = new TRootEmbeddedCanvas("Ecanvas",fMain, width, height); | |
83 | fEcanvas->GetCanvas()->Connect("ProcessedEvent(Int_t, Int_t, Int_t, TObject*)", | |
84 | "AliMpDEVisu", | |
85 | this, | |
86 | "HandleMovement(Int_t, Int_t, Int_t, TObject*)"); | |
87 | ||
88 | // Create a horizontal frame widget with buttons | |
89 | TGHorizontalFrame *hframe = new TGHorizontalFrame(fMain,width,height/6); | |
90 | ||
91 | TGTextButton *draw = new TGTextButton(hframe,"&Draw"); | |
92 | draw->Connect("Clicked()","AliMpDEVisu",this,"DrawDE()"); | |
93 | hframe->AddFrame(draw, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,15,5,3,4)); | |
94 | ||
95 | TGTextButton *exit = new TGTextButton(hframe,"&Exit","gApplication->Terminate(0)"); | |
96 | hframe->AddFrame(exit, new TGLayoutHints(kLHintsLeft| kLHintsCenterY,5,5,3,4)); | |
97 | ||
98 | ||
99 | Int_t i = 0; | |
100 | Char_t text[20]; | |
101 | ||
102 | // chamber label | |
103 | TGLabel* chamberLabel = new TGLabel(hframe, "Chamber :"); | |
104 | hframe->AddFrame(chamberLabel, new TGLayoutHints(kLHintsCenterX | kLHintsLeft | kLHintsCenterY, 10, 0, 20, 0)); | |
105 | fChamberCombo = new TGComboBox(hframe, kChamberCombo); | |
106 | ||
107 | fDEComboIdx.Set(26); | |
108 | for(i = 0; i < 10; i++) | |
109 | { | |
110 | sprintf(text,"%d",i+1); | |
111 | fChamberCombo->AddEntry(text,i); | |
112 | } | |
113 | fChamberCombo->Resize(40,20); | |
114 | fChamberCombo->Select(0); | |
115 | fChamberCombo->Associate(this); | |
116 | hframe->AddFrame(fChamberCombo, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0)); | |
117 | ||
118 | // DE label | |
119 | TGLabel* detElemLabel = new TGLabel(hframe, "DE :"); | |
120 | hframe->AddFrame(detElemLabel, new TGLayoutHints(kLHintsCenterX | kLHintsLeft | kLHintsCenterY, 10, 0, 20, 0)); | |
121 | fDECombo = new TGComboBox(hframe, kDECombo); | |
122 | UpdateComboDE(); | |
123 | ||
124 | fDECombo->Resize(80,20); | |
125 | fDECombo->Select(0); | |
126 | fDECombo->Associate(this); | |
127 | hframe->AddFrame(fDECombo, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0)); | |
128 | ||
129 | ||
130 | // DE name | |
131 | TGLabel* detElemName = new TGLabel(hframe, "Name :"); | |
132 | hframe->AddFrame(detElemName, new TGLayoutHints(kLHintsCenterX | kLHintsLeft | kLHintsCenterY, 10, 0, 20, 0)); | |
133 | ||
134 | AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem); | |
135 | fCurrentDEName = detElem->GetDEName(); | |
136 | fNameDEView = new TGTextView(hframe, 180, 25, fCurrentDEName.Data(), kDEName); | |
137 | hframe->AddFrame(fNameDEView, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0)); | |
138 | ||
139 | // plane type | |
140 | fPlaneButton = new TGCheckButton(hframe, "NB Plane", kPlaneType); | |
141 | fPlaneButton->SetState(kButtonUp); | |
142 | fPlaneButton->Associate(this); | |
143 | hframe->AddFrame(fPlaneButton, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0)); | |
144 | ||
145 | ||
146 | // button motif | |
147 | TGTextButton* drawManu = new TGTextButton(hframe,"&Search"); | |
148 | drawManu->Connect("Clicked()","AliMpDEVisu",this,"DrawManuMotif(Bool_t)"); | |
149 | drawManu->SetToolTipText("Search for a given manu number"); | |
150 | hframe->AddFrame(drawManu, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,15,5,3,4)); | |
151 | ||
152 | // entry manu | |
153 | fNumberEntry = new TGNumberEntry(hframe, 0, 4, -1, | |
154 | TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative, | |
155 | TGNumberFormat::kNELLimitMinMax, 1, 1500); | |
156 | fNumberEntry->Resize(60,20); | |
157 | hframe->AddFrame(fNumberEntry, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 10, 0, 9, 0)); | |
158 | ||
159 | // reset button | |
160 | TGTextButton *resetManu = new TGTextButton(hframe,"&Reset"); | |
161 | resetManu->Connect("Clicked()","AliMpDEVisu",this,"ResetManu()"); | |
162 | hframe->AddFrame(resetManu, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,10,5,3,4)); | |
163 | ||
164 | // delete window button | |
165 | TGTextButton* deletePopup = new TGTextButton(hframe,"&Delete_Popup"); | |
166 | deletePopup->Connect("Clicked()","AliMpDEVisu",this,"DeletePopUp()"); | |
167 | deletePopup->SetToolTipText("Delete motif popup window"); | |
168 | hframe->AddFrame(deletePopup, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,15,5,3,4)); | |
169 | ||
170 | ||
171 | // log mesg | |
172 | TGHorizontalFrame *logFrame = new TGHorizontalFrame(fMain, width/2, height/6); | |
173 | ||
174 | TGLabel* logName = new TGLabel(logFrame, "Log MSG:"); | |
175 | logFrame->AddFrame(logName, new TGLayoutHints(kLHintsCenterX | kLHintsLeft | kLHintsCenterY, 10, 0, 2, 0)); | |
176 | ||
177 | fLogMessage = new TGTextView(logFrame, width/2, 60); | |
178 | fLogMessage->ShowBottom(); | |
179 | ||
180 | logFrame->AddFrame(fLogMessage, new TGLayoutHints(kLHintsLeft, 10, 0, 2, 0)); | |
181 | ||
182 | // clear log mesg | |
183 | TGTextButton* clearLog = new TGTextButton(logFrame,"&Clear"); | |
184 | clearLog->Connect("Clicked()","AliMpDEVisu",this,"ClearLogMessage()"); | |
185 | clearLog->SetToolTipText("Clear log message"); | |
186 | logFrame->AddFrame(clearLog, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,15,5,3,4)); | |
187 | ||
188 | // save log mesg | |
189 | TGTextButton* saveLog = new TGTextButton(logFrame,"&Save"); | |
190 | saveLog->Connect("Clicked()","AliMpDEVisu",this,"SaveLogMessage()"); | |
191 | saveLog->SetToolTipText("Save log message into file"); | |
192 | logFrame->AddFrame(saveLog, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,5,5,3,4)); | |
193 | ||
194 | // log file name | |
195 | fLogFile = new TGTextEntry(logFrame,"AliMpDEVisu.log"); | |
196 | fLogFile->SetToolTipText("Default log file name"); | |
197 | logFrame->AddFrame(fLogFile, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 10, 0, 9, 0)); | |
198 | ||
199 | // frame | |
200 | fMain->AddFrame(hframe, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,2,2,10,10)); | |
201 | fMain->AddFrame(fEcanvas, new TGLayoutHints(kLHintsCenterX, 10,10,10,10)); | |
202 | ||
203 | fMain->AddFrame(logFrame, new TGLayoutHints(kLHintsLeft,2,2,2,10)); | |
204 | ||
205 | // Set a name to the main frame | |
206 | fMain->SetWindowName("MUON Detection Element Visualization"); | |
207 | ||
208 | // Map all subwindows of main frame | |
209 | fMain->MapSubwindows(); | |
210 | ||
211 | // Initialize the layout algorithm | |
212 | fMain->Resize(fMain->GetDefaultSize()); | |
213 | ||
214 | // Map main frame | |
215 | fMain->MapWindow(); | |
216 | ||
217 | // instance segmentation | |
218 | fSegmentation = AliMpSegmentation::Instance()->GetMpSegmentation(fCurrentDetElem, | |
219 | AliMp::GetCathodType(fCurrentPlane)); | |
220 | fLogMessage->AddLine("Segmentation loaded"); | |
221 | fLogMessage->ShowBottom(); | |
222 | } | |
223 | ||
224 | //____________________________________________________________ | |
225 | AliMpDEVisu::~AliMpDEVisu() | |
226 | { | |
227 | // Clean up used widgets: frames, buttons, layouthints | |
228 | ||
229 | fChamberCombo->Delete(); | |
230 | fDECombo->Delete(); | |
231 | fNumberEntry->Delete(); | |
232 | fPlaneButton->Delete(); | |
233 | fNameDEView->Delete(); | |
234 | fLogMessage->Delete(); | |
235 | fLogFile->Delete(); | |
236 | fMain->Cleanup(); | |
237 | delete fMain; | |
238 | } | |
239 | ||
240 | //__________________________________________________________ | |
241 | void AliMpDEVisu::HandleMovement(Int_t eventType, Int_t eventX, Int_t eventY, TObject* /*select*/) | |
242 | { | |
243 | /// handle cursor mouvement | |
244 | ||
245 | if (eventType == 11) {// 61) {// double click | |
246 | ||
247 | TCanvas *canvas = fEcanvas->GetCanvas(); | |
248 | canvas->cd(1); | |
249 | ||
250 | // estimate graphic pad sizes | |
251 | TVector2 ul(gPad->XtoPixel(0.02), gPad->YtoPixel(0.98)); | |
252 | TVector2 br(gPad->XtoPixel(1.00), gPad->YtoPixel(0.02)); | |
253 | ||
254 | TVector2 padDim = br - ul; | |
255 | ||
256 | fSegmentation = AliMpSegmentation::Instance() | |
257 | ->GetMpSegmentation(fCurrentDetElem, AliMp::GetCathodType(fCurrentPlane)); | |
258 | ||
259 | // get DE dimension (half size) | |
260 | TVector2 deDim = fSegmentation-> Dimensions(); | |
261 | deDim *= 2.; | |
262 | ||
263 | // calculated in pixel | |
264 | Double_t x = 0.; | |
265 | Double_t y = 0.; | |
266 | ||
267 | if (fCurrentDetElem >= 500) { | |
268 | // origin at center | |
269 | x = (eventX - ul.X() - padDim.X()/2.)/(padDim.X())*deDim.X(); | |
270 | y = (br.Y() - eventY - padDim.Y()/2.)/(padDim.Y())*deDim.Y(); | |
271 | ||
272 | } else { | |
273 | // origin at bl | |
274 | x = (eventX - ul.X())/(padDim.X())*deDim.X(); | |
275 | y = (br.Y() - eventY)/(padDim.Y())*deDim.Y(); | |
276 | ||
277 | } | |
278 | ||
279 | TVector2 padReal(x,y); | |
280 | ||
281 | ||
282 | // get manu | |
283 | AliMpPad pad = fSegmentation->PadByPosition(padReal, false); | |
284 | ||
285 | Char_t log[255]; | |
286 | if (!pad.IsValid()) { | |
287 | sprintf(log, "PopupManuMotif: No manu for DE: %d at position (%5.2f, %5.2f)", | |
288 | fCurrentDetElem, x, y); | |
289 | fLogMessage->AddLine(log); | |
290 | fLogMessage->ShowBottom(); | |
291 | DrawDE(); | |
292 | return; | |
293 | } | |
294 | ||
295 | Int_t manu = pad.GetLocation().GetFirst(); | |
296 | ||
297 | fNumberEntry->SetNumber(manu); | |
298 | ||
299 | sprintf(log, "PopupManuMotif: DE: %d, manu: %d at position: %5.2f, %5.2f", fCurrentDetElem, manu, x, y); | |
300 | fLogMessage->AddLine(log); | |
301 | fLogMessage->ShowBottom(); | |
302 | ||
303 | DrawManuMotif(true); | |
304 | ||
305 | } | |
306 | } | |
307 | ||
308 | //__________________________________________________________ | |
309 | void AliMpDEVisu::DrawDE() | |
310 | { | |
311 | /// Draws function graphics in randomly choosen interval | |
312 | ||
313 | InfoDE(); | |
314 | ||
315 | if (fCurrentDetElem >= 500) { | |
316 | ||
317 | DrawSlat("PMCI"); | |
318 | ||
319 | } else { | |
320 | ||
321 | DrawQuadrant("RSMCI"); | |
322 | ||
323 | } | |
324 | DeletePopUp(); | |
325 | } | |
326 | ||
327 | //__________________________________________________________ | |
328 | void AliMpDEVisu::DrawManuMotif(Bool_t popup) | |
329 | { | |
330 | // Draw manu motif in yellow and popup channel motif window | |
331 | ||
332 | ||
333 | if (!fNumberEntry->GetIntNumber()) return; | |
334 | ||
335 | Char_t command[255]; | |
336 | ||
337 | if (fCurrentDetElem >= 500) { | |
338 | ||
339 | sprintf(command, "%s%d", "PMCI:", (Int_t)fNumberEntry->GetIntNumber()); | |
340 | ||
341 | DrawSlat(command, popup); | |
342 | ||
343 | } else { | |
344 | ||
345 | sprintf(command, "%s%d", "RSMCI:", (Int_t)fNumberEntry->GetIntNumber()); | |
346 | ||
347 | DrawQuadrant(command, popup); | |
348 | ||
349 | } | |
350 | } | |
351 | ||
352 | //__________________________________________________________ | |
353 | void AliMpDEVisu::DrawSlat(Option_t* option, Bool_t popup) | |
354 | { | |
355 | /// draw slat segmentation | |
356 | ||
357 | TCanvas *canvas = fEcanvas->GetCanvas(); | |
358 | canvas->Clear(); | |
359 | ||
360 | AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem); | |
361 | TString nameType = detElem->GetSegType(); | |
362 | ||
363 | AliMpSlatMotifMap mm; | |
364 | AliMpSt345Reader reader(mm); | |
365 | AliMpSlat* slatCurrent = reader.ReadSlat(nameType.Data(), fCurrentPlane); | |
366 | AliMpSlat* slatOther = reader.ReadSlat(nameType.Data(), AliMp::OtherPlaneType(fCurrentPlane)); | |
367 | ||
368 | canvas->Divide(1); | |
369 | canvas->cd(1); | |
370 | ||
371 | AliMpVPainter* painter = AliMpVPainter::CreatePainter(slatCurrent); | |
372 | painter->Draw(option); | |
373 | ||
374 | canvas->Update(); | |
375 | ||
376 | delete painter; | |
377 | ||
378 | Int_t numberOfManu = slatCurrent->GetNofElectronicCards() + | |
379 | slatOther->GetNofElectronicCards(); | |
380 | ||
381 | Char_t log[255]; | |
382 | ||
383 | sprintf(log, "DrawSlat: number of manus: %d", numberOfManu); | |
384 | ||
385 | fLogMessage->AddLine(log); | |
386 | fLogMessage->ShowBottom(); | |
387 | ||
388 | if (popup) | |
389 | PopUpManuMotif(slatCurrent); | |
390 | ||
391 | } | |
392 | ||
393 | //__________________________________________________________ | |
394 | void AliMpDEVisu:: DrawQuadrant(Option_t* option, Bool_t popup) | |
395 | { | |
396 | /// draw quadrant segmentation | |
397 | ||
398 | TCanvas *canvas = fEcanvas->GetCanvas(); | |
399 | canvas->Clear(); | |
400 | ||
401 | AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem); | |
402 | AliMp::StationType station = detElem->GetStationType(); | |
403 | ||
404 | AliMpSectorReader readerCurrent(station, fCurrentPlane); | |
405 | AliMpSector* sectorCurrent = readerCurrent.BuildSector(); | |
406 | ||
407 | AliMpSectorReader readerOther(station, AliMp::OtherPlaneType(fCurrentPlane)); | |
408 | AliMpSector* sectorOther = readerOther.BuildSector(); | |
409 | ||
410 | canvas->Divide(1); | |
411 | canvas->cd(1); | |
412 | ||
413 | AliMpVPainter *painter = AliMpVPainter::CreatePainter(sectorCurrent); | |
414 | painter->Draw(option); | |
415 | ||
416 | canvas->Update(); | |
417 | ||
418 | delete painter; | |
419 | ||
420 | Int_t numberOfManu = | |
421 | sectorCurrent->GetMotifMap()->GetNofMotifPositions() + | |
422 | sectorOther->GetMotifMap()->GetNofMotifPositions(); | |
423 | ||
424 | Char_t log[255]; | |
425 | ||
426 | sprintf(log, "DrawQuadrant: number of manus: %d", numberOfManu); | |
427 | ||
428 | fLogMessage->AddLine(log); | |
429 | fLogMessage->ShowBottom(); | |
430 | ||
431 | if (popup) | |
432 | PopUpManuMotif(sectorCurrent); | |
433 | } | |
434 | ||
435 | //__________________________________________________________ | |
436 | void AliMpDEVisu::ResetManu() | |
437 | { | |
438 | /// reset manu search entry | |
439 | fLogMessage->AddLine("Reset Motif Search Entry:"); | |
440 | fLogMessage->ShowBottom(); | |
441 | fNumberEntry->SetNumber(0); | |
442 | ||
443 | } | |
444 | ||
445 | //__________________________________________________________ | |
446 | void AliMpDEVisu::DeletePopUp() | |
447 | { | |
448 | /// delete motif popup windows | |
449 | ||
450 | if (fTrashList.GetEntries() > 0) { | |
451 | fLogMessage->AddLine("Delete Motif PopUp Windows:"); | |
452 | fLogMessage->ShowBottom(); | |
453 | ||
454 | // for (Int_t i = 0; i < fTrashList.GetEntries(); ++i) { | |
455 | ||
456 | // TGTransientFrame* trans = (TGTransientFrame*)fTrashList.At(i); | |
457 | // if (trans) | |
458 | // delete trans; | |
459 | // } | |
460 | ||
461 | fTrashList.Delete(); | |
462 | } | |
463 | } | |
464 | ||
465 | //__________________________________________________________ | |
466 | void AliMpDEVisu::SaveLogMessage() | |
467 | { | |
468 | /// save log message into log file | |
469 | ||
470 | TString logFile = fLogFile->GetDisplayText(); | |
471 | fLogMessage->GetText()->Save(logFile.Data()); | |
472 | ||
473 | Char_t log[255]; | |
474 | sprintf(log, "SaveLogMessage: saving log message into logfile: %s", logFile.Data()); | |
475 | fLogMessage->AddLine(log); | |
476 | fLogMessage->ShowBottom(); | |
477 | } | |
478 | ||
479 | //__________________________________________________________ | |
480 | void AliMpDEVisu::ClearLogMessage() | |
481 | { | |
482 | /// clear log message | |
483 | fLogMessage->GetText()->Clear(); | |
484 | Char_t log[255]; | |
485 | sprintf(log, "ClearLogMessage: clear log messages:"); | |
486 | fLogMessage->AddLine(log); | |
487 | fLogMessage->ShowBottom(); | |
488 | } | |
489 | ||
490 | //__________________________________________________________ | |
491 | void AliMpDEVisu::InfoDE() | |
492 | { | |
493 | /// info concerning the whole DE | |
494 | ||
495 | AliMpDetElement* detElem = fDDLStore->GetDetElement(fCurrentDetElem); | |
496 | Int_t ddlId = detElem->GetDdlId(); | |
497 | Int_t numberOfBus = detElem->GetNofBusPatches(); | |
498 | Int_t firstBus = detElem->GetBusPatchId(0); | |
499 | Int_t lastBus = detElem->GetBusPatchId(numberOfBus - 1); // expect a continuous numbering | |
500 | ||
501 | detElem = AliMpDEManager::GetDetElement(fCurrentDetElem); | |
502 | Int_t numberOfSerialManu = detElem->GetNofManus(); // number of manu with an identified serial number | |
503 | ||
504 | Char_t log[255]; | |
505 | sprintf(log, "DrawDE: detection element: %d, name: %s", fCurrentDetElem, fCurrentDEName.Data()); | |
506 | fLogMessage->AddLine(log); | |
507 | fLogMessage->ShowBottom(); | |
508 | ||
509 | ||
510 | sprintf(log, "DrawDE: DDL: %d, number of buspatches %d from %d to %d", | |
511 | ddlId, numberOfBus, firstBus, lastBus); | |
512 | fLogMessage->AddLine(log); | |
513 | fLogMessage->ShowBottom(); | |
514 | ||
515 | if (numberOfSerialManu != 0) { // not available yet for all DE | |
516 | sprintf(log, "DrawDE: number of manus with serial number: %d", numberOfSerialManu); | |
517 | fLogMessage->AddLine(log); | |
518 | fLogMessage->ShowBottom(); | |
519 | } | |
520 | ||
521 | } | |
522 | ||
523 | //__________________________________________________________ | |
524 | Bool_t AliMpDEVisu::ProcessMessage(Long_t msg, Long_t parm1, Long_t /*parm2*/) | |
525 | { | |
526 | /// process message from widgets actions/entries | |
527 | ||
528 | switch(GET_MSG(msg)) | |
529 | { | |
530 | case kC_COMMAND: | |
531 | switch (GET_SUBMSG(msg)) | |
532 | { | |
533 | case kCM_COMBOBOX: | |
534 | ||
535 | switch (parm1) | |
536 | { | |
537 | case kChamberCombo: | |
538 | UpdateComboDE(); | |
539 | UpdateNameView(); | |
540 | break; | |
541 | ||
542 | case kDECombo: | |
543 | UpdateNameView(); | |
544 | break; | |
545 | } | |
546 | break; | |
547 | ||
548 | case kCM_CHECKBUTTON: | |
549 | if (fPlaneButton->GetState() == kButtonDown) { | |
550 | fCurrentPlane = AliMp::kNonBendingPlane; | |
551 | if (fNumberEntry->GetIntNumber() && fNumberEntry->GetIntNumber() <= 1024) | |
552 | fNumberEntry->SetNumber(fNumberEntry->GetIntNumber() + 1024); | |
553 | } else { | |
554 | fCurrentPlane = AliMp::kBendingPlane; | |
555 | if (fNumberEntry->GetIntNumber() && fNumberEntry->GetIntNumber() > 1024) | |
556 | fNumberEntry->SetNumber(fNumberEntry->GetIntNumber() - 1024); | |
557 | } | |
558 | break; | |
559 | ||
560 | } | |
561 | break; | |
562 | } | |
563 | return true; | |
564 | } | |
565 | ||
566 | //__________________________________________________________ | |
567 | void AliMpDEVisu::UpdateComboDE() | |
568 | { | |
569 | /// update DE in respect to selected chamber | |
570 | ||
571 | fDECombo->RemoveAll(); | |
572 | ||
573 | AliMpDEIterator it; | |
574 | Int_t i = 0; | |
575 | Char_t text[20]; | |
576 | ||
577 | for ( it.First(fChamberCombo->GetSelected()); ! it.IsDone(); it.Next() ) { | |
578 | sprintf(text,"%d",it.CurrentDE()->GetId()); | |
579 | fDECombo->AddEntry(text,i); | |
580 | fDEComboIdx[i++] = it.CurrentDE()->GetId(); | |
581 | } | |
582 | fDECombo->Select(0); | |
583 | } | |
584 | ||
585 | //__________________________________________________________ | |
586 | void AliMpDEVisu::UpdateNameView() | |
587 | { | |
588 | /// update DE name in respect to selected DE id. | |
589 | ||
590 | fNameDEView->Clear(); | |
591 | ||
592 | fCurrentDetElem = fDEComboIdx[fDECombo->GetSelected()]; | |
593 | AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem); | |
594 | fCurrentDEName = detElem->GetDEName(); | |
595 | ||
596 | fNameDEView->AddLine(fCurrentDEName.Data()); | |
597 | fNameDEView->ShowBottom(); | |
598 | } | |
599 | ||
600 | //__________________________________________________________ | |
601 | void AliMpDEVisu::PopUpManuMotif(AliMpSlat* slat) | |
602 | { | |
603 | /// pop up manu window motif painter for slat | |
604 | ||
605 | // Create transient frame | |
606 | TGTransientFrame* trans = new TGTransientFrame(fkMainWindow, fMain, 400, 400); | |
607 | trans->DontCallClose(); | |
608 | trans->CenterOnParent(); | |
609 | ||
610 | // fill trash | |
611 | fTrashList.Add(trans); | |
612 | ||
613 | Char_t title[255]; | |
614 | sprintf(title,"Manu Motif: %d", (Int_t)fNumberEntry->GetIntNumber()); | |
615 | trans->SetWindowName(title); | |
616 | ||
617 | // Create canvas widget | |
618 | TRootEmbeddedCanvas* eTransCanvas = | |
619 | new TRootEmbeddedCanvas("ETransCanvas",trans,400,400); | |
620 | ||
621 | trans->AddFrame(eTransCanvas, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 10,10,1,10)); | |
622 | ||
623 | ||
624 | // motif painter | |
625 | AliMpMotifPosition* motifPosFound = 0x0; | |
626 | ||
627 | TCanvas *canvas = eTransCanvas->GetCanvas(); | |
628 | canvas->Clear(); | |
629 | ||
630 | for ( AliMpSlat::Size_t i = 0; i < slat->GetSize(); ++i ) { | |
631 | ||
632 | AliMpPCB* pcb = slat->GetPCB(i); | |
633 | AliMpPCBPainter* pcbPainter = new AliMpPCBPainter(pcb); | |
634 | ||
635 | for ( AliMpPCB::Size_t j = 0; j < slat->GetPCB(i)->GetSize(); ++j ) { | |
636 | ||
637 | AliMpMotifPosition*motifPos = pcb->GetMotifPosition(j); | |
638 | ||
639 | Int_t manuId = motifPos->GetID(); | |
640 | if (manuId == (Int_t)fNumberEntry->GetIntNumber()) { | |
641 | motifPosFound = motifPos; | |
642 | break; | |
643 | } | |
644 | } | |
645 | if (motifPosFound) | |
646 | break; | |
647 | delete pcbPainter; | |
648 | } | |
649 | ||
650 | if(motifPosFound) { | |
651 | // maps | |
652 | trans->MapSubwindows(); | |
653 | trans->MapWindow(); | |
654 | // painter | |
655 | AliMpVPainter* painter = AliMpVPainter::CreatePainter(motifPosFound); | |
656 | painter->Draw("ZT"); | |
657 | // canvas | |
658 | canvas->Update(); | |
659 | ||
660 | } | |
661 | ||
662 | ||
663 | } | |
664 | //__________________________________________________________ | |
665 | void AliMpDEVisu::PopUpManuMotif(AliMpSector* sector) | |
666 | { | |
667 | ||
668 | /// pop up manu window motif painter for sector | |
669 | ||
670 | // Create transient frame | |
671 | TGTransientFrame* trans = new TGTransientFrame(fkMainWindow, fMain, 400, 400); | |
672 | trans->DontCallClose(); | |
673 | trans->CenterOnParent(); | |
674 | ||
675 | // fill trash | |
676 | fTrashList.Add(trans); | |
677 | ||
678 | Char_t title[255]; | |
679 | sprintf(title,"Manu Motif: %d", (Int_t)fNumberEntry->GetIntNumber()); | |
680 | trans->SetWindowName(title); | |
681 | ||
682 | // Create canvas widget | |
683 | TRootEmbeddedCanvas* eTransCanvas = | |
684 | new TRootEmbeddedCanvas("ETransCanvas",trans,400,400); | |
685 | ||
686 | trans->AddFrame(eTransCanvas, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, | |
687 | 10,10,1,10)); | |
688 | ||
689 | // motif painter | |
690 | AliMpMotifPosition* motifPosFound = 0x0; | |
691 | ||
692 | TCanvas *canvas = eTransCanvas->GetCanvas(); | |
693 | canvas->Clear(); | |
694 | ||
695 | for (Int_t iRow = 0; iRow < sector->GetNofRows(); ++iRow) { | |
696 | ||
697 | AliMpRow* row = sector->GetRow(iRow); | |
698 | AliMpRowPainter* rowPainter = new AliMpRowPainter(row); | |
699 | ||
700 | for (Int_t iRowSeg = 0; iRowSeg < sector->GetRow(iRow)->GetNofRowSegments(); ++iRowSeg){ | |
701 | ||
702 | for (Int_t iRowSeg = 0; iRowSeg < row->GetNofRowSegments(); ++iRowSeg) { | |
703 | AliMpVRowSegment *rowSegment = row->GetRowSegment(iRowSeg); | |
704 | ||
705 | for (Int_t iMotif = 0; iMotif < rowSegment->GetNofMotifs(); ++iMotif){ | |
706 | ||
707 | Int_t motifPositionId = rowSegment->GetMotifPositionId(iMotif); | |
708 | AliMpMotifPosition *motifPos = rowSegment->GetRow() | |
709 | ->GetMotifMap()->FindMotifPosition(motifPositionId); | |
710 | ||
711 | Int_t manuId = motifPos->GetID(); | |
712 | if (manuId == (Int_t)fNumberEntry->GetIntNumber()) { | |
713 | motifPosFound = motifPos; | |
714 | break; | |
715 | } | |
716 | } | |
717 | if (motifPosFound) | |
718 | break; | |
719 | } | |
720 | } | |
721 | if (motifPosFound) | |
722 | break; | |
723 | delete rowPainter; | |
724 | } | |
725 | ||
726 | if(motifPosFound) { | |
727 | // map | |
728 | trans->MapSubwindows(); | |
729 | trans->MapWindow(); | |
730 | // painter | |
731 | AliMpVPainter* painter = AliMpVPainter::CreatePainter(motifPosFound); | |
732 | painter->Draw("ZT"); | |
733 | // canvas | |
734 | canvas->Update(); | |
735 | } | |
736 | } |