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