]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MUON/mapping/AliMpDEVisu.cxx
2fd08e745d719d8a46474fb6f14158249edd4ce2
[u/mrichter/AliRoot.git] / MUON / mapping / AliMpDEVisu.cxx
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"
20
21 #include "AliMpSlatMotifMap.h"
22 #include "AliMpSt345Reader.h"
23 #include "AliMpSectorReader.h"
24 #include "AliMpSlat.h"
25 #include "AliMpPCB.h"
26 #include "AliMpSectorReader.h"
27 #include "AliMpSector.h"
28 #include "AliMpRow.h"
29 #include "AliMpVRowSegment.h"
30 #include "AliMpVPainter.h"
31 #include "AliMpMotifPosition.h"
32 #include "AliMpMotifMap.h"
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"
40 #include "AliMpManuStore.h"
41 #include "AliMpVPadIterator.h"
42 #include "AliMpCDB.h"
43 #include "AliMpDataStreams.h"
44
45 #include "AliLog.h"
46
47 #include <TMath.h>
48 #include <TString.h>
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>
57
58 #include <cstdio>
59
60 // Category: graphics
61
62 //-----------------------------------------------------------------------------
63 // Class AliMpDEVisu
64 // -----------------------
65 // GUI for drawing segmentation
66 // motif manu and associated channels
67 // date: 2007/01/26
68 // Author: Ch. Finck
69 //-----------------------------------------------------------------------------
70
71 /// \cond CLASSIMP
72 ClassImp(AliMpDEVisu)
73 /// \endcond
74
75 //_________________________________________________________________
76 AliMpDEVisu::AliMpDEVisu(UInt_t w, UInt_t h) 
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),
86   fNameDECombo(0x0),
87   fLogMessage(0x0),
88   fLogFile(0x0),
89   fTrashList(0x0),
90   fDEComboIdx(),
91   fNameDEComboIdx(),
92   fDEOccurrence(1026),
93   fCurrentPlane(AliMp::kBendingPlane),
94   fCurrentDetElem(100),
95   fCurrentDEName(),
96   fkSegmentation(),
97   fDDLStore(0x0),
98   fManuStore(0x0),
99   fZoomMode(false)
100 {
101 /// Standard constructor
102
103   // Load mapping
104   if ( ! AliMpCDB::LoadDDLStore() ) {
105     AliFatal("Could not access mapping from OCDB !");
106   }
107
108   if ( ! AliMpCDB::LoadManuStore() ) {
109     AliFatal("Could not access run-dependent mapping from OCDB !");
110   }
111
112   fDDLStore = AliMpDDLStore::Instance();
113   fManuStore = AliMpManuStore::Instance();
114
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   {
150     snprintf(text,20,"%d",i+1);
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));
168   fDEOccurrence.Reset(-1);
169
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();
180   fNameDECombo = new  TGComboBox(hframe, kDEName);
181
182   UpdateNameView(kTRUE);
183   fNameDECombo->Resize(160, 20);
184   fNameDECombo->Select(0);
185   fNameDECombo->Associate(this);
186   hframe->AddFrame(fNameDECombo, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0));
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
232   TGTextButton* clearLog = new TGTextButton(logFrame,"&Clear");
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);
252
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
274   fkSegmentation = AliMpSegmentation::Instance()->GetMpSegmentation(fCurrentDetElem, detElem->GetCathodType(fCurrentPlane));
275   fLogMessage->AddLine("Segmentation loaded");
276   fLogMessage->ShowBottom();
277 }
278
279 //____________________________________________________________
280 AliMpDEVisu::~AliMpDEVisu() 
281 {
282   /// Clean up used widgets: frames, buttons, layouthints
283   
284   fChamberCombo->Delete();
285   fDECombo->Delete();
286   fNumberEntry->Delete();
287   fPlaneButton->Delete();
288   fNameDECombo->Delete();
289   fLogMessage->Delete();
290   fLogFile->Delete();
291   fMain->Cleanup();
292   delete fMain;
293 }
294
295 //__________________________________________________________
296 void AliMpDEVisu::HandleMovement(Int_t eventType, Int_t eventX, Int_t eventY, TObject* /*select*/)
297 {
298   /// handle cursor mouvement
299   
300   static Int_t eventXold, eventYold;
301   static Int_t eventX0, eventY0;
302   static Int_t linedrawn;
303   
304
305   // enable again  KeyAutoRepeat after HandleKey
306   if (eventType == kKeyPress) {
307     gVirtualX->SetKeyAutoRepeat(kTRUE);
308   }
309
310   fEcanvas->GetCanvas()->cd();
311
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 
347       Double_t x = 0.;
348       Double_t y = 0.;
349       
350       EventToReal(eventX,eventY,x,y);
351       
352       // get manu
353       AliMpPad pad = fkSegmentation->PadByPosition(x,y, false);
354       
355       if (!pad.IsValid()) {
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;
361       }
362       
363       Int_t manu = pad.GetManuId();
364       
365       fNumberEntry->SetNumber(manu);
366       
367      
368       fLogMessage->AddLine(Form("PopupManuMotif: DE: %d, manu: %d at position: %5.2f, %5.2f", 
369                                 fCurrentDetElem, manu, x, y));
370       fLogMessage->ShowBottom();
371       
372       DrawManuMotif(true);
373       
374     }
375   }
376 }
377
378 //__________________________________________________________
379 void AliMpDEVisu::DrawDE(Bool_t info) 
380 {
381   /// Draws function graphics in randomly choosen interval
382   
383   if (info)
384     InfoDE();
385   
386   fEcanvas->GetCanvas()->cd();
387   fEcanvas->GetCanvas()->SetEditable(kTRUE);
388   
389   fNameDECombo->Select(fDEOccurrence[fCurrentDetElem]);
390   TGLBEntry* entry = fNameDECombo->GetSelectedEntry();
391   entry->SetBackgroundColor(0xDDDDDD);
392
393   if (AliMpDEManager::GetStationType(fCurrentDetElem) == AliMp::kStation345 ) {
394     
395     DrawSlat("PMCI");
396     
397   } else {
398     
399     DrawQuadrant("RSMCI");
400     
401   }
402   DeletePopUp();
403   fEcanvas->GetCanvas()->SetEditable(kFALSE);
404   
405 }
406
407 //__________________________________________________________
408 void AliMpDEVisu::DrawManuMotif(Bool_t popup) 
409 {
410   ///  Draw manu motif in yellow and popup channel motif window
411   
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     
420     snprintf(command, 255, "%s%d", "PMCI:", (Int_t)fNumberEntry->GetIntNumber());
421     
422     DrawSlat(command, popup);
423     
424   } else {   
425     
426     snprintf(command, 255, "%s%d", "RSMCI:", (Int_t)fNumberEntry->GetIntNumber());
427     
428     DrawQuadrant(command, popup);
429     
430   }
431   
432   fEcanvas->GetCanvas()->SetEditable(kFALSE);
433 }
434
435 //__________________________________________________________
436 void AliMpDEVisu::DrawSlat(Option_t* option, Bool_t popup) 
437 {
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();
445
446   AliMpDataStreams dataStreams;
447
448   AliMpSlatMotifMap mm;
449   
450   AliMpSt345Reader reader(dataStreams,&mm);  
451   AliMpSlat* slatCurrent = reader.ReadSlat(nameType.Data(), fCurrentPlane);
452   AliMpSlat* slatOther   = reader.ReadSlat(nameType.Data(), AliMp::OtherPlaneType(fCurrentPlane));
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);
468   
469 }
470
471 //__________________________________________________________
472 void AliMpDEVisu::DrawQuadrant(Option_t* option, Bool_t popup)
473 {
474   /// draw quadrant segmentation
475   
476   TCanvas *canvas = fEcanvas->GetCanvas();
477   canvas->Clear();
478   
479   AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
480   AliMq::Station12Type  station = detElem->GetStation12Type();
481
482   AliMpDataStreams dataStreams;
483   
484   AliMpSectorReader readerCurrent(dataStreams, station, fCurrentPlane);
485   AliMpSector* sectorCurrent = readerCurrent.BuildSector();
486     
487   AliMpSectorReader readerOther(dataStreams, station, AliMp::OtherPlaneType(fCurrentPlane));
488   AliMpSector* sectorOther = readerOther.BuildSector();
489   
490   AliMpVPainter *painter = AliMpVPainter::CreatePainter(sectorCurrent);
491   painter->Draw(option);
492   
493   canvas->Update();
494   
495   Int_t numberOfManu =  
496       sectorCurrent->GetMotifMap()->GetNofMotifPositions() + 
497       sectorOther->GetMotifMap()->GetNofMotifPositions();
498   
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 
509 AliMpDEVisu::EventToReal(Int_t eventX, Int_t eventY, 
510                          Double_t& x, Double_t& y) const
511 {
512   /// estimate graphic pad sizes
513
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));
518
519   static Double_t padDimX = brx - ulx;
520   static Double_t padDimY = bry - uly;
521   
522   // get DE dimension (half size)
523   Double_t deDimX(fkSegmentation->GetDimensionX()*2.0);
524   Double_t deDimY(fkSegmentation->GetDimensionY()*2.0);
525   
526   if ( AliMpDEManager::GetStationType(fCurrentDetElem) == AliMp::kStation345 )
527   {
528     // origin at center
529     x = (eventX - ulx - padDimX/2.)/(padDimX)*deDimX; 
530     y = (bry - eventY - padDimY/2.)/(padDimY)*deDimY; 
531     
532   } 
533   else 
534   {
535     // origin at bottom left
536     x = (eventX - ulx)/(padDimX)*deDimX; 
537     y = (bry - eventY)/(padDimY)*deDimY; 
538   }
539   
540 }
541
542 //__________________________________________________________
543 void AliMpDEVisu::ResetManu() 
544 {
545   /// reset manu search entry 
546   fLogMessage->AddLine("Reset Motif Search Entry:");
547   fLogMessage->ShowBottom();
548   fNumberEntry->SetNumber(0);
549   
550 }
551
552 //__________________________________________________________
553 void AliMpDEVisu::DeletePopUp() 
554 {
555 /// delete motif popup windows 
556   
557   if (fTrashList.GetEntries() > 0) 
558   {
559     fLogMessage->AddLine("Delete Motif PopUp Windows:");
560     fLogMessage->ShowBottom();
561     
562     fTrashList.Delete();
563   } 
564 }
565
566 //__________________________________________________________
567 void AliMpDEVisu::SaveLogMessage() 
568 {
569   /// save log message into log file
570   
571   TString logFile = fLogFile->GetDisplayText();
572   fLogMessage->GetText()->Save(logFile.Data());
573
574   fLogMessage->AddLine(Form("SaveLogMessage: saving log message into logfile: %s", logFile.Data()));
575   fLogMessage->ShowBottom();  
576 }
577
578 //__________________________________________________________
579 void AliMpDEVisu::ClearLogMessage() 
580 {
581   /// clear log message 
582   fLogMessage->GetText()->Clear();
583   fLogMessage->AddLine("ClearLogMessage: clear log messages:");
584   fLogMessage->ShowBottom();  
585 }
586
587 //__________________________________________________________
588 void AliMpDEVisu::InfoDE() 
589 {
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);
599
600   Int_t firstBus     = TMath::MinElement(detElem->GetNofBusPatches(), vec);
601   Int_t lastBus      = TMath::MaxElement(detElem->GetNofBusPatches(), vec);
602   
603   Int_t numberOfSerialManu = fManuStore->NofManus(detElem->GetId()); // number of manu with an identified serial number
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));
615     fLogMessage->ShowBottom();
616   }
617   
618 }
619
620 //__________________________________________________________
621 Bool_t AliMpDEVisu::ProcessMessage(Long_t msg, Long_t parm1, Long_t /*parm2*/)
622 {
623   /// process message from widgets actions/entries
624
625   AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
626
627   switch(GET_MSG(msg)) 
628   {
629     case kC_COMMAND: 
630       switch (GET_SUBMSG(msg)) 
631       {
632         case kCM_COMBOBOX: 
633           
634           switch (parm1) 
635           {
636             case kChamberCombo: 
637               UpdateComboDE();
638               UpdateNameView(kTRUE);
639               break;
640               
641             case kDECombo:
642               UpdateNameView();
643               break; 
644              
645           case kDEName:
646               UpdateComboCH();
647               break;
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();
665               fkSegmentation = AliMpSegmentation::Instance()
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           
678       }
679       break;
680   }
681   return true;
682 }
683
684 //__________________________________________________________
685 void AliMpDEVisu::NextDE()
686 {
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();
698 }
699
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
709     Int_t idx =  AliMpDEManager::GetChamberId(detElem->GetId());
710     fChamberCombo->Select(idx);
711
712     UpdateComboDE();
713
714     idx = detElem->GetId() % 100;
715     fDECombo->Select(idx);
716
717     fCurrentDetElem = fDEComboIdx[fDECombo->GetSelected()];
718
719     fkSegmentation = AliMpSegmentation::Instance()
720         ->GetMpSegmentation(fCurrentDetElem, detElem->GetCathodType(fCurrentPlane));
721 }
722
723 //__________________________________________________________
724 void AliMpDEVisu::UpdateComboDE()
725 {
726   /// update DE in respect to selected chamber
727   
728   fDECombo->RemoveAll();
729   
730   AliMpDEIterator it;
731   Int_t i = 0;
732   fDEComboIdx.Reset();
733   
734   for ( it.First(fChamberCombo->GetSelected()); ! it.IsDone(); it.Next() ) {
735     fDECombo->AddEntry(Form("%d",it.CurrentDE()->GetId()), i);
736     fDEComboIdx[i++] = it.CurrentDE()->GetId();
737   }
738   fDECombo->Select(0);
739 }
740
741 //__________________________________________________________
742 void AliMpDEVisu::UpdateNameView(Bool_t firstTime)
743 {
744   /// update DE name in respect to selected DE id.
745     
746   fCurrentDetElem = fDEComboIdx[fDECombo->GetSelected()];
747
748   AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
749
750   fCurrentDEName = detElem->GetDEName();
751
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     }
767   }
768
769   fNameDECombo->Select(fDEOccurrence[fCurrentDetElem]);
770   fkSegmentation = AliMpSegmentation::Instance()
771     ->GetMpSegmentation(fCurrentDetElem, detElem->GetCathodType(fCurrentPlane));
772 }
773
774 //______________________________________________________________________________
775 void
776 AliMpDEVisu::CreatePopupWindow(Int_t w, Int_t h, const char* windowName,
777                                AliMpVPainter* painter,
778                                const char* option)
779 {
780   /// Create transient frame
781   
782   TCanvas* c = new TCanvas(windowName,windowName,-200,100,w,h);
783
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();
795 }
796
797 //__________________________________________________________
798 void AliMpDEVisu::PopUpManuMotif(AliMpSlat* slat)
799 {
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;
806
807   for ( Int_t i = 0; i < slat->GetSize(); ++i ) {
808     
809     AliMpPCB* pcb = slat->GetPCB(i);
810     
811     for ( Int_t j = 0; j < slat->GetPCB(i)->GetSize(); ++j ) {
812       
813       motifPos = pcb->GetMotifPosition(j);
814       
815       manuId = motifPos->GetID();
816       if (manuId == (Int_t)fNumberEntry->GetIntNumber()) {
817         motifPosFound = motifPos;
818         break;
819       }
820     }
821     if (motifPosFound)
822       break;
823   }  
824
825   if(motifPosFound) 
826   {
827     InfoManuMotif(motifPosFound);
828
829     Double_t dimensionX(motifPosFound->GetDimensionX()); 
830     Double_t dimensionY(motifPosFound->GetDimensionY());
831
832     Int_t h = 500;
833     Int_t w = Int_t(h*dimensionX/dimensionY);
834     AliMpVPainter* painter = AliMpVPainter::CreatePainter(motifPosFound);
835       
836     CreatePopupWindow(w,h,Form("Manu %ld",fNumberEntry->GetIntNumber()),
837                       painter,"ZT");
838   }
839 }
840
841 //__________________________________________________________
842 void AliMpDEVisu::PopUpManuMotif(AliMpSector* sector)
843 {
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;
850
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       
857       for (Int_t iRowSeg2 = 0; iRowSeg2 < row->GetNofRowSegments(); ++iRowSeg2) {
858         AliMpVRowSegment *rowSegment = row->GetRowSegment(iRowSeg2);
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   {    
882
883     InfoManuMotif(motifPosFound);
884
885     Double_t dimensionX(motifPosFound->GetDimensionX()); 
886     Double_t dimensionY(motifPosFound->GetDimensionY());
887
888     // Create transient frame
889     Int_t h = 400;
890     Int_t w = Int_t(h*dimensionX/dimensionY);
891
892     AliMpVPainter* painter = AliMpVPainter::CreatePainter(motifPosFound);
893     
894     CreatePopupWindow(w,h,Form("Manu %ld",fNumberEntry->GetIntNumber()),
895                       painter,"ZT");
896     
897   }
898 }
899
900 //__________________________________________________________
901 void AliMpDEVisu::InfoManuMotif(AliMpMotifPosition* motifPos)
902 {
903 /// info for popup manu motif
904
905    // log message
906     Int_t manuId = fNumberEntry->GetIntNumber();
907
908     fLogMessage->AddLine(Form("PopupManuMotif: motif dimension: %5.2f, %5.2f", 
909                               motifPos->GetDimensionX()*2., 
910                               motifPos->GetDimensionY()*2.));
911       
912     fLogMessage->AddLine( Form("PopupManuMotif: pad dimension: %4.2f, %4.2f", 
913                                motifPos->GetMotif()->GetPadDimensionX(0)*2.,  
914                                motifPos->GetMotif()->GetPadDimensionY(0)*2. ));
915
916     fLogMessage->AddLine( Form("PopupManuMotif: manu: %d, serial number: %d, buspatch: %d",
917                              manuId, 
918                              fManuStore->GetManuSerial(fCurrentDetElem, manuId),
919                              fDDLStore->GetBusPatchId(fCurrentDetElem, manuId)) );
920
921     fLogMessage->ShowBottom();
922
923 }
924
925 //______________________________________________________________________________
926 void AliMpDEVisu::PopUpZoom(Int_t ix0, Int_t iy0, Int_t ix1, Int_t iy1)
927 {
928   /// popup zoom window
929
930   Double_t x0,y0;
931   EventToReal(ix0,iy0,x0,y0);
932   Double_t x1,y1;
933   EventToReal(ix1,iy1,x1,y1);
934
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);
942
943   AliMpArea area((x0+x1)/2.0,(y0+y1)/2.0,
944                  TMath::Abs(x1-x0)/2.0,TMath::Abs(y1-y0)/2.0);
945 //  area.Print();
946   
947   if ( area.IsValid() )
948   {
949     AliMpVPadIterator* iterator = fkSegmentation->CreateIterator(area);
950     if (iterator)
951     {
952       AliMpVPainter* painter = AliMpVPainter::CreatePainter(iterator);
953       CreatePopupWindow(w,h,"Zoom",painter,"");
954     }
955     else
956     {
957       AliError("could not get iterator for that area");
958     }
959         
960     delete iterator;
961   }
962 }
963
964 //__________________________________________________________
965 void AliMpDEVisu::ClosePopupWindow(Int_t id)
966 {
967   /// close signal
968   fEcanvas->GetCanvas()->cd();
969   fTrashList.RemoveAt(id);
970 }