]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MUON/mapping/AliMpDEVisu.cxx
New GUI class for drawing detection element segmentation
[u/mrichter/AliRoot.git] / MUON / mapping / AliMpDEVisu.cxx
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 }