]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
- Using TCanvas instead of TGTransientFrame
authorivana <ivana@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 8 Mar 2007 14:11:15 +0000 (14:11 +0000)
committerivana <ivana@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 8 Mar 2007 14:11:15 +0000 (14:11 +0000)
- Add Zoom option for selecting a region in DE
- Applying DrawDE() when activate Next and NB plane buttons
- Add more information in log message (serial number, buspatches, etc...)
- Right handling of plane type for segmentation.
(Laurent & Christian)

MUON/mapping/AliMpDEVisu.cxx
MUON/mapping/AliMpDEVisu.h

index 3b8c405a70fae2bda1e1506b6c7aa554f6d09d8f..6ec2f684b41c41fee1397d7c4ee44ad8569a2a11 100644 (file)
@@ -1,33 +1,35 @@
-#include <TObject.h>
-#include <TList.h>
-#include <TString.h>
-#include <TVector2.h>
-#include <TCanvas.h>
-#include <TGClient.h>
-#include <TGButton.h>
-#include <TRootEmbeddedCanvas.h>
-#include <TGLabel.h>
-#include <TGComboBox.h>
-#include <TGNumberEntry.h>
-#include <TGTextView.h>
-#include <TGTextEntry.h>
+/**************************************************************************
+* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+*                                                                        *
+* Author: The ALICE Off-line Project.                                    *
+* Contributors are mentioned in the code where appropriate.              *
+*                                                                        *
+* Permission to use, copy, modify and distribute this software and its   *
+* documentation strictly for non-commercial purposes is hereby granted   *
+* without fee, provided that the above copyright notice appears in all   *
+* copies and that both the copyright notice and this permission notice   *
+* appear in the supporting documentation. The authors make no claims     *
+* about the suitability of this software for any purpose. It is          *
+* provided "as is" without express or implied warranty.                  *
+**************************************************************************/
+
+// $Id$
+// $MpId$
+
+#include "AliMpDEVisu.h"
 
 #include "AliMpSlatMotifMap.h"
 #include "AliMpSt345Reader.h"
 #include "AliMpSectorReader.h"
 #include "AliMpSlat.h"
 #include "AliMpPCB.h"
-#include "AliMpPCBPainter.h"
 #include "AliMpSectorReader.h"
 #include "AliMpSector.h"
 #include "AliMpRow.h"
 #include "AliMpVRowSegment.h"
-#include "AliMpRowPainter.h"
 #include "AliMpVPainter.h"
-#include "AliMpMotifPainter.h"
 #include "AliMpMotifPosition.h"
 #include "AliMpMotifMap.h"
-
 #include "AliMpDEIterator.h"
 #include "AliMpDEManager.h"
 #include "AliMpDetElement.h"
 #include "AliMpSegmentation.h"
 #include "AliMpPad.h"
 #include "AliMpDDLStore.h"
+#include "AliMpVPadIterator.h"
 
-#include "AliMpDEVisu.h"
+#include "AliLog.h"
+
+#include <TMath.h>
+#include <TString.h>
+#include <TVector2.h>
+#include <TCanvas.h>
+#include <TGButton.h>
+#include <TRootEmbeddedCanvas.h>
+#include <TGLabel.h>
+#include <TGComboBox.h>
+#include <TGNumberEntry.h>
+#include <TGTextView.h>
+#include <TGTextEntry.h>
 
 // Category: graphics
 //
@@ -53,754 +68,822 @@ ClassImp(AliMpDEVisu)
 
 //_________________________________________________________________
 AliMpDEVisu::AliMpDEVisu(UInt_t w, UInt_t h) 
-    : TGFrame(gClient->GetRoot(), w, h),
-      fkMainWindow(gClient->GetRoot()),
-      fMain(new TGMainFrame(gClient->GetRoot(), w, h)),
-      fEcanvas(0x0),
-      fChamberCombo(0x0),
-      fDECombo(0x0),
-      fNumberEntry(0x0),
-      fPlaneButton(0x0),
-      fNameDEView(0x0),
-      fLogMessage(0x0),
-      fLogFile(0x0),
-      fTrashList(0x0),
-      fDEComboIdx(),
-      fCurrentPlane(AliMp::kBendingPlane),
-      fCurrentDetElem(100),
-      fCurrentDEName(),
-      fSegmentation(),
-      fDDLStore(AliMpDDLStore::Instance()),
-      fNumberOfPopUp(0)
-
+: TGFrame(gClient->GetRoot(), w, h),
+  fkMainWindow(gClient->GetRoot()),
+  fMain(new TGMainFrame(gClient->GetRoot(), w, h)),
+  fEcanvas(0x0),
+  fChamberCombo(0x0),
+  fDECombo(0x0),
+  fNumberEntry(0x0),
+  fPlaneButton(0x0),
+  fZoomButton(0x0),
+  fNameDEView(0x0),
+  fLogMessage(0x0),
+  fLogFile(0x0),
+  fTrashList(0x0),
+  fDEComboIdx(),
+  fCurrentPlane(AliMp::kBendingPlane),
+  fCurrentDetElem(100),
+  fCurrentDEName(),
+  fSegmentation(),
+  fDDLStore(AliMpDDLStore::Instance()),
+  fZoomMode(false)
 {
+/// Standard constructor
 
-// Create canvas widget
-
-    Int_t width  = Int_t(w*0.99);
-    Int_t height = Int_t(h*0.99);
-
-    fEcanvas = new TRootEmbeddedCanvas("Ecanvas",fMain, width, height);
-    fEcanvas->GetCanvas()->Connect("ProcessedEvent(Int_t, Int_t, Int_t, TObject*)",
-                                   "AliMpDEVisu",
-                                   this,
-                                   "HandleMovement(Int_t, Int_t, Int_t, TObject*)");
-
-// Create a horizontal frame widget with buttons
-    TGHorizontalFrame *hframe = new TGHorizontalFrame(fMain,width,height/6);
-
-    TGTextButton *draw = new TGTextButton(hframe,"&Draw");
-    draw->Connect("Clicked()","AliMpDEVisu",this,"DrawDE()");
-    hframe->AddFrame(draw, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,15,5,3,4));
-
-    TGTextButton *exit = new TGTextButton(hframe,"&Exit","gApplication->Terminate(0)");
-    hframe->AddFrame(exit, new TGLayoutHints(kLHintsLeft| kLHintsCenterY,5,5,3,4));
-
-
-    Int_t i = 0;
-    Char_t text[20];
-
-// chamber label
-    TGLabel* chamberLabel = new TGLabel(hframe, "Chamber :");
-    hframe->AddFrame(chamberLabel, new TGLayoutHints(kLHintsCenterX | kLHintsLeft | kLHintsCenterY, 10, 0, 20, 0));
-    fChamberCombo = new TGComboBox(hframe, kChamberCombo);
-
-    fDEComboIdx.Set(26);
-    for(i = 0; i < 10; i++)
-    {
-      sprintf(text,"%d",i+1);
-      fChamberCombo->AddEntry(text,i);
-    }
-    fChamberCombo->Resize(40,20);
-    fChamberCombo->Select(0);
-    fChamberCombo->Associate(this);
-    hframe->AddFrame(fChamberCombo, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0));
-
-// DE label
-    TGLabel*  detElemLabel = new TGLabel(hframe, "DE :");
-    hframe->AddFrame(detElemLabel, new TGLayoutHints(kLHintsCenterX | kLHintsLeft | kLHintsCenterY, 10, 0, 20, 0));
-    fDECombo = new TGComboBox(hframe, kDECombo);
-    UpdateComboDE();
-
-    fDECombo->Resize(80,20);
-    fDECombo->Select(0);
-    fDECombo->Associate(this);
-    hframe->AddFrame(fDECombo, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0));
-
-    TGTextButton *next = new TGTextButton(hframe,"&Next");
-    next->Connect("Clicked()","AliMpDEVisu",this,"NextDE()");
-    hframe->AddFrame(next, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,5,5,3,4));
-
-// DE name
-    TGLabel*  detElemName = new TGLabel(hframe, "Name :");
-    hframe->AddFrame(detElemName, new TGLayoutHints(kLHintsCenterX | kLHintsLeft | kLHintsCenterY, 10, 0, 20, 0));
-
-    AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
-    fCurrentDEName = detElem->GetDEName();
-    fNameDEView = new TGTextView(hframe, 180, 25, fCurrentDEName.Data(), kDEName);
-    hframe->AddFrame(fNameDEView, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0));
-
-// plane type
-    fPlaneButton = new TGCheckButton(hframe, "NB Plane", kPlaneType);
-    fPlaneButton->SetState(kButtonUp);
-    fPlaneButton->Associate(this);
-    hframe->AddFrame(fPlaneButton, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0));
-
-
-// button motif
-    TGTextButton* drawManu = new TGTextButton(hframe,"&Search");
-    drawManu->Connect("Clicked()","AliMpDEVisu",this,"DrawManuMotif(Bool_t)");
-    drawManu->SetToolTipText("Search for a given manu number");
-    hframe->AddFrame(drawManu, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,15,5,3,4));
-
-// entry manu
-    fNumberEntry  = new TGNumberEntry(hframe, 0, 4, -1, 
-                                       TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative,
-                                       TGNumberFormat::kNELLimitMinMax, 1, 1500);
-    fNumberEntry->Resize(60,20);
-    hframe->AddFrame(fNumberEntry, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 10, 0, 9, 0));
-
-// reset button
-    TGTextButton *resetManu = new TGTextButton(hframe,"&Reset");
-    resetManu->Connect("Clicked()","AliMpDEVisu",this,"ResetManu()");
-    hframe->AddFrame(resetManu, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,10,5,3,4));
-
-// delete window button
-    TGTextButton* deletePopup = new TGTextButton(hframe,"&Delete_Popup");
-    deletePopup->Connect("Clicked()","AliMpDEVisu",this,"DeletePopUp()");
-    deletePopup->SetToolTipText("Delete motif popup window");
-    hframe->AddFrame(deletePopup, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,15,5,3,4));
-
-
-// log mesg
-    TGHorizontalFrame *logFrame = new TGHorizontalFrame(fMain, width/2, height/6);
-
-    TGLabel*  logName = new TGLabel(logFrame, "Log MSG:");
-    logFrame->AddFrame(logName, new TGLayoutHints(kLHintsCenterX | kLHintsLeft | kLHintsCenterY, 10, 0, 2, 0));
-
-    fLogMessage = new TGTextView(logFrame, width/2, 60);
-    fLogMessage->ShowBottom();
-
-    logFrame->AddFrame(fLogMessage, new TGLayoutHints(kLHintsLeft, 10, 0, 2, 0));
-
-// clear log mesg
+  fTrashList.SetOwner(kFALSE);
+  
+  // Create canvas widget
+  
+  Int_t width  = Int_t(w*0.99);
+  Int_t height = Int_t(h*0.99);
+  
+  fEcanvas = new TRootEmbeddedCanvas("Ecanvas",fMain, width, height);
+  fEcanvas->GetCanvas()->Connect("ProcessedEvent(Int_t, Int_t, Int_t, TObject*)",
+                                 "AliMpDEVisu",
+                                 this,
+                                 "HandleMovement(Int_t, Int_t, Int_t, TObject*)");
+
+  // Create a horizontal frame widget with buttons
+  TGHorizontalFrame *hframe = new TGHorizontalFrame(fMain,width,height/6);
+  
+  TGTextButton *draw = new TGTextButton(hframe,"&Draw");
+  draw->Connect("Clicked()","AliMpDEVisu",this,"DrawDE()");
+  hframe->AddFrame(draw, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,15,5,3,4));
+  
+  TGTextButton *exit = new TGTextButton(hframe,"&Exit","gApplication->Terminate(0)");
+  hframe->AddFrame(exit, new TGLayoutHints(kLHintsLeft| kLHintsCenterY,5,5,3,4));
+  
+  
+  Int_t i = 0;
+  Char_t text[20];
+  
+  // chamber label
+  TGLabel* chamberLabel = new TGLabel(hframe, "Chamber :");
+  hframe->AddFrame(chamberLabel, new TGLayoutHints(kLHintsCenterX | kLHintsLeft | kLHintsCenterY, 10, 0, 20, 0));
+  fChamberCombo = new TGComboBox(hframe, kChamberCombo);
+  
+  fDEComboIdx.Set(26);
+  for(i = 0; i < 10; i++)
+  {
+    sprintf(text,"%d",i+1);
+    fChamberCombo->AddEntry(text,i);
+  }
+  fChamberCombo->Resize(40,20);
+  fChamberCombo->Select(0);
+  fChamberCombo->Associate(this);
+  hframe->AddFrame(fChamberCombo, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0));
+  
+  // DE label
+  TGLabel*  detElemLabel = new TGLabel(hframe, "DE :");
+  hframe->AddFrame(detElemLabel, new TGLayoutHints(kLHintsCenterX | kLHintsLeft | kLHintsCenterY, 10, 0, 20, 0));
+  fDECombo = new TGComboBox(hframe, kDECombo);
+  UpdateComboDE();
+  
+  fDECombo->Resize(80,20);
+  fDECombo->Select(0);
+  fDECombo->Associate(this);
+  hframe->AddFrame(fDECombo, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0));
+  
+  TGTextButton *next = new TGTextButton(hframe,"&Next");
+  next->Connect("Clicked()","AliMpDEVisu",this,"NextDE()");
+  hframe->AddFrame(next, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,5,5,3,4));
+  
+  // DE name
+  TGLabel*  detElemName = new TGLabel(hframe, "Name :");
+  hframe->AddFrame(detElemName, new TGLayoutHints(kLHintsCenterX | kLHintsLeft | kLHintsCenterY, 10, 0, 20, 0));
+  
+  AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
+  fCurrentDEName = detElem->GetDEName();
+  fNameDEView = new TGTextView(hframe, 180, 25, fCurrentDEName.Data(), kDEName);
+  hframe->AddFrame(fNameDEView, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0));
+
+  // plane type
+  fPlaneButton = new TGCheckButton(hframe, "NB Plane", kPlaneType);
+  fPlaneButton->SetState(kButtonUp);
+  fPlaneButton->Associate(this);
+  hframe->AddFrame(fPlaneButton, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0));
+  
+  
+  // button motif
+  TGTextButton* drawManu = new TGTextButton(hframe,"&Search");
+  drawManu->Connect("Clicked()","AliMpDEVisu",this,"DrawManuMotif(Bool_t)");
+  drawManu->SetToolTipText("Search for a given manu number");
+  hframe->AddFrame(drawManu, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,15,5,3,4));
+  
+  // entry manu
+  fNumberEntry  = new TGNumberEntry(hframe, 0, 4, -1, 
+                                    TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative,
+                                    TGNumberFormat::kNELLimitMinMax, 1, 1500);
+  fNumberEntry->Resize(60,20);
+  hframe->AddFrame(fNumberEntry, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 10, 0, 9, 0));
+  
+  // reset button
+  TGTextButton *resetManu = new TGTextButton(hframe,"&Reset");
+  resetManu->Connect("Clicked()","AliMpDEVisu",this,"ResetManu()");
+  hframe->AddFrame(resetManu, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,10,5,3,4));
+  
+  // delete window button
+  TGTextButton* deletePopup = new TGTextButton(hframe,"&Delete_Popup");
+  deletePopup->Connect("Clicked()","AliMpDEVisu",this,"DeletePopUp()");
+  deletePopup->SetToolTipText("Delete motif popup window");
+  hframe->AddFrame(deletePopup, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,15,5,3,4));
+  
+  
+  // log mesg
+  TGHorizontalFrame *logFrame = new TGHorizontalFrame(fMain, width/2, height/6);
+  
+  TGLabel*  logName = new TGLabel(logFrame, "Log MSG:");
+  logFrame->AddFrame(logName, new TGLayoutHints(kLHintsCenterX | kLHintsLeft | kLHintsCenterY, 10, 0, 2, 0));
+  
+  fLogMessage = new TGTextView(logFrame, width/2, 60);
+  fLogMessage->ShowBottom();
+  
+  logFrame->AddFrame(fLogMessage, new TGLayoutHints(kLHintsLeft, 10, 0, 2, 0));
+  
+  // clear log mesg
   TGTextButton* clearLog = new TGTextButton(logFrame,"&Clear");
-    clearLog->Connect("Clicked()","AliMpDEVisu",this,"ClearLogMessage()");
-    clearLog->SetToolTipText("Clear log message");
-    logFrame->AddFrame(clearLog, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,15,5,3,4));
-
-// save log mesg
-    TGTextButton* saveLog = new TGTextButton(logFrame,"&Save");
-    saveLog->Connect("Clicked()","AliMpDEVisu",this,"SaveLogMessage()");
-    saveLog->SetToolTipText("Save log message into file");
-    logFrame->AddFrame(saveLog, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,5,5,3,4));
-
-// log file name
-    fLogFile = new TGTextEntry(logFrame,"AliMpDEVisu.log");
-    fLogFile->SetToolTipText("Default log file name");
-    logFrame->AddFrame(fLogFile, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 10, 0, 9, 0));
-
-// frame
-    fMain->AddFrame(hframe, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,2,2,10,10));
-    fMain->AddFrame(fEcanvas, new TGLayoutHints(kLHintsCenterX,        10,10,10,10));
-
-    fMain->AddFrame(logFrame, new TGLayoutHints(kLHintsLeft,2,2,2,10));
-
-// Set a name to the main frame
-    fMain->SetWindowName("MUON Detection Element Visualization");
-
-// Map all subwindows of main frame
-    fMain->MapSubwindows();
-
-// Initialize the layout algorithm
-    fMain->Resize(fMain->GetDefaultSize());
-
-// Map main frame
-    fMain->MapWindow();
+  clearLog->Connect("Clicked()","AliMpDEVisu",this,"ClearLogMessage()");
+  clearLog->SetToolTipText("Clear log message");
+  logFrame->AddFrame(clearLog, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,15,5,3,4));
+  
+  // save log mesg
+  TGTextButton* saveLog = new TGTextButton(logFrame,"&Save");
+  saveLog->Connect("Clicked()","AliMpDEVisu",this,"SaveLogMessage()");
+  saveLog->SetToolTipText("Save log message into file");
+  logFrame->AddFrame(saveLog, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,5,5,3,4));
+  
+  // log file name
+  fLogFile = new TGTextEntry(logFrame,"AliMpDEVisu.log");
+  fLogFile->SetToolTipText("Default log file name");
+  logFrame->AddFrame(fLogFile, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 10, 0, 9, 0));
+  
+  // zoom mode
+  fZoomButton = new TGCheckButton(logFrame, new TGHotString("&Zoom Mode"), kZoomMode);
+  fZoomButton->Associate(this);
+  fZoomButton->SetState(kButtonUp);
 
-// instance segmentation
-    fSegmentation = AliMpSegmentation::Instance()->GetMpSegmentation(fCurrentDetElem,
-                                                                    AliMp::GetCathodType(fCurrentPlane));
-    fLogMessage->AddLine("Segmentation loaded");
-    fLogMessage->ShowBottom();
+  logFrame->AddFrame(fZoomButton, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 20, 0, 9, 0));
+  
+  // frame
+  fMain->AddFrame(hframe, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,2,2,10,10));
+  fMain->AddFrame(fEcanvas, new TGLayoutHints(kLHintsCenterX,  10,10,10,10));
+  
+  fMain->AddFrame(logFrame, new TGLayoutHints(kLHintsLeft,2,2,2,10));
+  
+  // Set a name to the main frame
+  fMain->SetWindowName("MUON Detection Element Visualization");
+  
+  // Map all subwindows of main frame
+  fMain->MapSubwindows();
+  
+  // Initialize the layout algorithm
+  fMain->Resize(fMain->GetDefaultSize());
+  
+  // Map main frame
+  fMain->MapWindow();
+  
+  // instance segmentation
+  fSegmentation = AliMpSegmentation::Instance()->GetMpSegmentation(fCurrentDetElem, detElem->GetCathodType(fCurrentPlane));
+  fLogMessage->AddLine("Segmentation loaded");
+  fLogMessage->ShowBottom();
 }
 
 //____________________________________________________________
 AliMpDEVisu::~AliMpDEVisu() 
 {
-// Clean up used widgets: frames, buttons, layouthints
-    
-    fChamberCombo->Delete();
-    fDECombo->Delete();
-    fNumberEntry->Delete();
-    fPlaneButton->Delete();
-    fNameDEView->Delete();
-    fLogMessage->Delete();
-    fLogFile->Delete();
-    fMain->Cleanup();
-    delete fMain;
+  /// Clean up used widgets: frames, buttons, layouthints
+  
+  fChamberCombo->Delete();
+  fDECombo->Delete();
+  fNumberEntry->Delete();
+  fPlaneButton->Delete();
+  fNameDEView->Delete();
+  fLogMessage->Delete();
+  fLogFile->Delete();
+  fMain->Cleanup();
+  delete fMain;
 }
 
 //__________________________________________________________
 void AliMpDEVisu::HandleMovement(Int_t eventType, Int_t eventX, Int_t eventY, TObject* /*select*/)
 {
-/// handle cursor mouvement
-
-    if (eventType == kButton1Down) {
-       
-      TCanvas *canvas = fEcanvas->GetCanvas();
-      canvas->cd(1);
-
-// estimate graphic pad sizes
-      TVector2 ul(gPad->XtoPixel(0.02), gPad->YtoPixel(0.98));
-      TVector2 br(gPad->XtoPixel(1.00), gPad->YtoPixel(0.02));
+  /// handle cursor mouvement
+  
+  static Int_t eventXold, eventYold;
+  static Int_t eventX0, eventY0;
+  static Int_t linedrawn;
+  
 
-      TVector2 padDim = br - ul;
-     
-      fSegmentation = AliMpSegmentation::Instance()
-         ->GetMpSegmentation(fCurrentDetElem, AliMp::GetCathodType(fCurrentPlane));
+  // enable again  KeyAutoRepeat after HandleKey
+  if (eventType == kKeyPress) {
+    gVirtualX->SetKeyAutoRepeat(kTRUE);
+  }
 
-// get DE dimension (half size)
-      TVector2 deDim =  fSegmentation-> Dimensions();
-      deDim *= 2.;
+  fEcanvas->GetCanvas()->cd();
 
-// calculated in pixel 
+  // zoom mode
+  if (fZoomMode) {
+    
+    if (eventType == kButton1Down) {
+      gVirtualX->SetLineWidth(3);
+      eventX0   = eventX; eventY0   = eventY;
+      eventXold = eventX; eventYold = eventY;
+      linedrawn = 0;
+    }
+    
+    if (eventType == kButton1Motion) {
+      if (linedrawn) gVirtualX->DrawBox(eventX0, eventY0, eventXold, eventYold, TVirtualX::kHollow);
+      eventXold = eventX;
+      eventYold = eventY;
+      linedrawn = 1;
+      gVirtualX->DrawBox(eventX0, eventY0, eventXold, eventYold,  TVirtualX::kHollow);
+    }
+    
+    if (eventType == kButton1Up)
+    {
+      if ( (eventX0 - eventX) && (eventY0 - eventY) ) 
+      {
+        PopUpZoom(eventX0,eventY0,eventX,eventY);
+        linedrawn=1;
+      }
+    }
+    
+    
+  } else {
+    
+    // click mode
+    
+    if (eventType == kButton1Down) {
+      
+      // calculated in pixel 
       Double_t x = 0.;
       Double_t y = 0.;
-
-     if (fCurrentDetElem >= 500) {
-       // origin at center
-       x = (eventX - ul.X() - padDim.X()/2.)/(padDim.X())*deDim.X(); 
-       y = (br.Y() - eventY - padDim.Y()/2.)/(padDim.Y())*deDim.Y(); 
-
-     } else {
-       // origin at bl
-       x = (eventX - ul.X())/(padDim.X())*deDim.X(); 
-       y = (br.Y() - eventY)/(padDim.Y())*deDim.Y(); 
-
-     }
-
-      TVector2 padReal(x,y);
-  
-
-// get manu
-      AliMpPad pad = fSegmentation->PadByPosition(padReal, false);
-
-      Char_t log[255];
+      
+      EventToReal(eventX,eventY,x,y);
+      
+      // get manu
+      AliMpPad pad = fSegmentation->PadByPosition(TVector2(x,y), false);
+      
       if (!pad.IsValid()) {
-       sprintf(log, "PopupManuMotif: No manu for DE: %d at position (%5.2f, %5.2f)",
-                       fCurrentDetElem, x, y);
-       fLogMessage->AddLine(log);
-       fLogMessage->ShowBottom();
-       DrawDE();
-       return;
+       
+        fLogMessage->AddLine(Form("PopupManuMotif: No manu for DE: %d at position (%5.2f, %5.2f)",
+                             fCurrentDetElem, x, y));
+        fLogMessage->ShowBottom();
+        return;
       }
-
+      
       Int_t manu = pad.GetLocation().GetFirst();
-       
+      
       fNumberEntry->SetNumber(manu);
-
-      sprintf(log, "PopupManuMotif: DE: %d, manu: %d at position: %5.2f, %5.2f", fCurrentDetElem, manu, x, y);
-      fLogMessage->AddLine(log);
+      
+     
+      fLogMessage->AddLine(Form("PopupManuMotif: DE: %d, manu: %d at position: %5.2f, %5.2f", 
+                               fCurrentDetElem, manu, x, y));
       fLogMessage->ShowBottom();
-
+      
       DrawManuMotif(true);
-
+      
     }
+  }
 }
 
 //__________________________________________________________
-void AliMpDEVisu::DrawDE() 
+void AliMpDEVisu::DrawDE(Bool_t info
 {
-/// Draws function graphics in randomly choosen interval
-
+  /// Draws function graphics in randomly choosen interval
+  
+  if (info)
     InfoDE();
-
-    if (fCurrentDetElem >= 500) {
-
-      DrawSlat("PMCI");
-
-    } else {
-
-      DrawQuadrant("RSMCI");
+  
+  fEcanvas->GetCanvas()->cd();
+  fEcanvas->GetCanvas()->SetEditable(kTRUE);
+  
+  if (AliMpDEManager::GetStationType(fCurrentDetElem) == AliMp::kStation345 ) {
     
-    }
-    DeletePopUp();
+    DrawSlat("PMCI");
+    
+  } else {
+    
+    DrawQuadrant("RSMCI");
+    
+  }
+  DeletePopUp();
+  fEcanvas->GetCanvas()->SetEditable(kFALSE);
+  
 }
 
 //__________________________________________________________
 void AliMpDEVisu::DrawManuMotif(Bool_t popup) 
 {
-//  Draw manu motif in yellow and popup channel motif window
-
-    if (!fNumberEntry->GetIntNumber()) return;
-
-    Char_t command[255];
-
-    if (fCurrentDetElem >= 500) {
-      sprintf(command, "%s%d", "PMCI:", (Int_t)fNumberEntry->GetIntNumber());
-
-      DrawSlat(command, popup);
-
-    } else {   
-
-      sprintf(command, "%s%d", "RSMCI:", (Int_t)fNumberEntry->GetIntNumber());
+  //  Draw manu motif in yellow and popup channel motif window
   
-      DrawQuadrant(command, popup);
-
-    }
+  fEcanvas->GetCanvas()->SetEditable(kTRUE);
+  
+  if (!fNumberEntry->GetIntNumber()) return;
+  
+  Char_t command[255];
+  
+  if (AliMpDEManager::GetStationType(fCurrentDetElem) == AliMp::kStation345 ) {
+    
+    sprintf(command, "%s%d", "PMCI:", (Int_t)fNumberEntry->GetIntNumber());
+    
+    DrawSlat(command, popup);
+    
+  } else {   
+    
+    sprintf(command, "%s%d", "RSMCI:", (Int_t)fNumberEntry->GetIntNumber());
+    
+    DrawQuadrant(command, popup);
+    
+  }
+  
+  fEcanvas->GetCanvas()->SetEditable(kFALSE);
 }
 
 //__________________________________________________________
 void AliMpDEVisu::DrawSlat(Option_t* option, Bool_t popup) 
 {
-/// draw slat segmentation
-
-    TCanvas *canvas = fEcanvas->GetCanvas();
-    canvas->Clear();
-
-    AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
-    TString nameType =  detElem->GetSegType();
-
-    AliMpSlatMotifMap mm;
-    AliMpSt345Reader reader(mm);  
-    AliMpSlat* slatCurrent = reader.ReadSlat(nameType.Data(), fCurrentPlane);
-    AliMpSlat* slatOther   = reader.ReadSlat(nameType.Data(), AliMp::OtherPlaneType(fCurrentPlane));
-
-    canvas->Divide(1);
-    canvas->cd(1);
-
-    AliMpVPainter* painter = AliMpVPainter::CreatePainter(slatCurrent);
-    painter->Draw(option);
-
-    canvas->Update();
-
-    delete painter;
-
-    Int_t numberOfManu =  slatCurrent->GetNofElectronicCards() + 
-                                            slatOther->GetNofElectronicCards();
-
-    Char_t log[255];
+  /// draw slat segmentation
+  
+  TCanvas *canvas = fEcanvas->GetCanvas();
+  canvas->Clear();
+  
+  AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
+  TString nameType =  detElem->GetSegType();
+  
+  AliMpSlatMotifMap mm;
+  AliMpSt345Reader reader(mm);  
+  AliMpSlat* slatCurrent = reader.ReadSlat(nameType.Data(), fCurrentPlane);
+  AliMpSlat* slatOther   = reader.ReadSlat(nameType.Data(), AliMp::OtherPlaneType(fCurrentPlane));
+  
+  AliMpVPainter* painter = AliMpVPainter::CreatePainter(slatCurrent);
+  painter->Draw(option);
+  
+  canvas->Update();
+  
+  Int_t numberOfManu = 
+      slatCurrent->GetNofElectronicCards() + 
+      slatOther->GetNofElectronicCards();
+    
+  fLogMessage->AddLine(Form("DrawSlat: number of manus: %d", numberOfManu));
+  fLogMessage->ShowBottom();   
+  
+  if (popup)
+    PopUpManuMotif(slatCurrent);
   
-    sprintf(log, "DrawSlat: number of manus: %d", numberOfManu);
-
-    fLogMessage->AddLine(log);
-    fLogMessage->ShowBottom();   
-
-    if (popup)
-       PopUpManuMotif(slatCurrent);
-
 }
 
 //__________________________________________________________
-void AliMpDEVisu:: DrawQuadrant(Option_t* option, Bool_t popup)
+void AliMpDEVisu::DrawQuadrant(Option_t* option, Bool_t popup)
 {
-/// draw quadrant segmentation
-
-    TCanvas *canvas = fEcanvas->GetCanvas();
-    canvas->Clear();
-
-    AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
-    AliMp::StationType  station = detElem->GetStationType();
-
-    AliMpSectorReader readerCurrent(station, fCurrentPlane);
-    AliMpSector* sectorCurrent = readerCurrent.BuildSector();
-
-    AliMpSectorReader readerOther(station, AliMp::OtherPlaneType(fCurrentPlane));
-    AliMpSector* sectorOther = readerOther.BuildSector();
-     
-    canvas->Divide(1);
-    canvas->cd(1);
-
-    AliMpVPainter *painter = AliMpVPainter::CreatePainter(sectorCurrent);
-    painter->Draw(option);
-
-    canvas->Update();
-
-    delete painter;
+  /// draw quadrant segmentation
+  
+  TCanvas *canvas = fEcanvas->GetCanvas();
+  canvas->Clear();
+  
+  AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
+  AliMp::StationType  station = detElem->GetStationType();
 
-    Int_t numberOfManu =  
+  AliMpSectorReader readerCurrent(station, fCurrentPlane);
+  AliMpSector* sectorCurrent = readerCurrent.BuildSector();
+    
+  AliMpSectorReader readerOther(station, AliMp::OtherPlaneType(fCurrentPlane));
+  AliMpSector* sectorOther = readerOther.BuildSector();
+  
+  AliMpVPainter *painter = AliMpVPainter::CreatePainter(sectorCurrent);
+  painter->Draw(option);
+  
+  canvas->Update();
+  
+  Int_t numberOfManu =  
       sectorCurrent->GetMotifMap()->GetNofMotifPositions() + 
       sectorOther->GetMotifMap()->GetNofMotifPositions();
-
-    Char_t log[255];
   
-    sprintf(log, "DrawQuadrant: number of manus: %d", numberOfManu);
+  fLogMessage->AddLine(Form("DrawQuadrant: number of manus: %d", numberOfManu));
+  fLogMessage->ShowBottom();   
+
+  if (popup) 
+    PopUpManuMotif(sectorCurrent);
+}
+
+//______________________________________________________________________________
+void 
+AliMpDEVisu::EventToReal(Int_t eventX, Int_t eventY, Double_t& x, Double_t& y) const
+{
+  /// estimate graphic pad sizes
 
-    fLogMessage->AddLine(log);
-    fLogMessage->ShowBottom();   
+  static TVector2 ul(gPad->XtoPixel(0.01), gPad->YtoPixel(0.99));
+  static TVector2 br(gPad->XtoPixel(0.99), gPad->YtoPixel(0.01));
 
-    if (popup)
-       PopUpManuMotif(sectorCurrent);
+  static TVector2 padDim = br - ul;
+  
+  // get DE dimension (half size)
+  TVector2 deDim(fSegmentation->Dimensions()*2.0);
+  
+  TVector2 padReal;
+  
+  if (AliMpDEManager::GetStationType(fCurrentDetElem) == AliMp::kStation345 )
+  {
+    // origin at center
+    x = (eventX - ul.X() - padDim.X()/2.)/(padDim.X())*deDim.X(); 
+    y = (br.Y() - eventY - padDim.Y()/2.)/(padDim.Y())*deDim.Y(); 
+    
+  } 
+  else 
+  {
+    // origin at bottom left
+    x = (eventX - ul.X())/(padDim.X())*deDim.X(); 
+    y = (br.Y() - eventY)/(padDim.Y())*deDim.Y(); 
+  }
+  
 }
 
 //__________________________________________________________
 void AliMpDEVisu::ResetManu() 
 {
-/// reset manu search entry 
-    fLogMessage->AddLine("Reset Motif Search Entry:");
-    fLogMessage->ShowBottom();
-    fNumberEntry->SetNumber(0);
-
+  /// reset manu search entry 
+  fLogMessage->AddLine("Reset Motif Search Entry:");
+  fLogMessage->ShowBottom();
+  fNumberEntry->SetNumber(0);
+  
 }
 
 //__________________________________________________________
 void AliMpDEVisu::DeletePopUp() 
 {
 /// delete motif popup windows 
-
-    if (fTrashList.GetEntries() > 0) {
-      fLogMessage->AddLine("Delete Motif PopUp Windows:");
-      fLogMessage->ShowBottom();
-
-      for (Int_t i = 0; i < fTrashList.GetEntries(); ++i) {
-
-       TGTransientFrame* trans = (TGTransientFrame*)fTrashList.At(i);
-       if (trans) 
-           trans->CloseWindow();
-      }
-
-      fTrashList.Clear();
-      fNumberOfPopUp = 0;
-    } 
+  
+  if (fTrashList.GetEntries() > 0) 
+  {
+    fLogMessage->AddLine("Delete Motif PopUp Windows:");
+    fLogMessage->ShowBottom();
+    
+    fTrashList.Delete();
+  } 
 }
 
 //__________________________________________________________
 void AliMpDEVisu::SaveLogMessage() 
 {
-/// save log message into log file
-    
-    TString logFile = fLogFile->GetDisplayText();
-    fLogMessage->GetText()->Save(logFile.Data());
+  /// save log message into log file
+  
+  TString logFile = fLogFile->GetDisplayText();
+  fLogMessage->GetText()->Save(logFile.Data());
 
-    Char_t log[255];
-    sprintf(log, "SaveLogMessage: saving log message into logfile: %s", logFile.Data());
-    fLogMessage->AddLine(log);
-    fLogMessage->ShowBottom();  
+  fLogMessage->AddLine(Form("SaveLogMessage: saving log message into logfile: %s", logFile.Data()));
+  fLogMessage->ShowBottom();  
 }
 
 //__________________________________________________________
 void AliMpDEVisu::ClearLogMessage() 
 {
-/// clear log message 
-    fLogMessage->GetText()->Clear();
-    Char_t log[255];
-    sprintf(log, "ClearLogMessage: clear log messages:");
-    fLogMessage->AddLine(log);
-    fLogMessage->ShowBottom();  
+  /// clear log message 
+  fLogMessage->GetText()->Clear();
+  fLogMessage->AddLine("ClearLogMessage: clear log messages:");
+  fLogMessage->ShowBottom();  
 }
 
 //__________________________________________________________
 void AliMpDEVisu::InfoDE() 
 {
-/// info concerning the whole DE
-
-    AliMpDetElement* detElem = fDDLStore->GetDetElement(fCurrentDetElem);
-    Int_t ddlId        = detElem->GetDdlId();
-    Int_t numberOfBus  = detElem->GetNofBusPatches();
-    Int_t firstBus     = detElem->GetBusPatchId(0);
-    Int_t lastBus      = detElem->GetBusPatchId(numberOfBus - 1); // expect a continuous numbering 
-
-    detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
-    Int_t numberOfSerialManu = detElem->GetNofManus(); // number of manu with an identified serial number
-
-    Char_t log[255];
-    sprintf(log, "DrawDE: detection element: %d, name: %s", fCurrentDetElem, fCurrentDEName.Data());
-    fLogMessage->AddLine(log);
-    fLogMessage->ShowBottom();   
+  /// info concerning the whole DE
+  
+  AliMpDetElement* detElem = fDDLStore->GetDetElement(fCurrentDetElem);
+  Int_t ddlId        = detElem->GetDdlId();
+  Int_t numberOfBus  = detElem->GetNofBusPatches();
+  
+  Int_t vec[24];
+  for (Int_t i = 0; i <  detElem->GetNofBusPatches(); ++i)
+      vec[i] = detElem->GetBusPatchId(i);
 
-    
-    sprintf(log, "DrawDE: DDL: %d, number of buspatches %d from %d to %d", 
-           ddlId, numberOfBus, firstBus, lastBus);
-    fLogMessage->AddLine(log);
+  Int_t firstBus     = TMath::MinElement(detElem->GetNofBusPatches(), vec);
+  Int_t lastBus      = TMath::MaxElement(detElem->GetNofBusPatches(), vec);
+  
+  detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
+  Int_t numberOfSerialManu = detElem->GetNofManus(); // number of manu with an identified serial number
+  
+  fLogMessage->AddLine(Form("DrawDE: detection element: %d, name: %s", 
+                      fCurrentDetElem, fCurrentDEName.Data()));
+  fLogMessage->ShowBottom();   
+  
+  fLogMessage->AddLine(Form("DrawDE: DDL: %d, number of buspatches %d from %d to %d", 
+                           ddlId, numberOfBus, firstBus, lastBus));
+  fLogMessage->ShowBottom();
+  
+  if (numberOfSerialManu != 0) { // not available yet for all DE 
+    fLogMessage->AddLine(Form("DrawDE: number of manus with serial number: %d", numberOfSerialManu));
     fLogMessage->ShowBottom();
-
-    if (numberOfSerialManu != 0) { // not available yet for all DE 
-       sprintf(log, "DrawDE: number of manus with serial number: %d", numberOfSerialManu);
-       fLogMessage->AddLine(log);
-       fLogMessage->ShowBottom();
-    }
-
+  }
+  
 }
 
 //__________________________________________________________
 Bool_t AliMpDEVisu::ProcessMessage(Long_t msg, Long_t parm1, Long_t /*parm2*/)
 {
-/// process message from widgets actions/entries
+  /// process message from widgets actions/entries
 
-    switch(GET_MSG(msg)) 
-    {
+  AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
+
+  switch(GET_MSG(msg)) 
+  {
     case kC_COMMAND: 
       switch (GET_SUBMSG(msg)) 
       {
-      case kCM_COMBOBOX: 
-
-       switch (parm1) 
-       {
-       case kChamberCombo: 
-           UpdateComboDE();
-           UpdateNameView();
-           break;
-   
-       case kDECombo:
-           UpdateNameView();
-           break; 
-       }
-       break;
-  
-      case kCM_CHECKBUTTON:
-         if (fPlaneButton->GetState() == kButtonDown) {
-           fCurrentPlane = AliMp::kNonBendingPlane;
-           if (fNumberEntry->GetIntNumber() && fNumberEntry->GetIntNumber() <= 1024)
-               fNumberEntry->SetNumber(fNumberEntry->GetIntNumber() + 1024);
-         } else {
-           fCurrentPlane = AliMp::kBendingPlane;
-           if (fNumberEntry->GetIntNumber() && fNumberEntry->GetIntNumber() > 1024)
-               fNumberEntry->SetNumber(fNumberEntry->GetIntNumber() - 1024);
-         }
-       break;
-
+        case kCM_COMBOBOX: 
+          
+          switch (parm1) 
+          {
+            case kChamberCombo: 
+              UpdateComboDE();
+              UpdateNameView();
+              break;
+              
+            case kDECombo:
+              UpdateNameView();
+              break; 
+          }
+          break;
+          
+        case kCM_CHECKBUTTON:
+          switch (parm1) 
+          {
+            case kPlaneType:
+              if (fPlaneButton->GetState() == kButtonDown) {
+                fCurrentPlane = AliMp::kNonBendingPlane;
+                if (fNumberEntry->GetIntNumber() && fNumberEntry->GetIntNumber() <= 1024)
+                  fNumberEntry->SetNumber(fNumberEntry->GetIntNumber() + 1024);
+              } else {
+                fCurrentPlane = AliMp::kBendingPlane;
+                if (fNumberEntry->GetIntNumber() && fNumberEntry->GetIntNumber() > 1024)
+                  fNumberEntry->SetNumber(fNumberEntry->GetIntNumber() - 1024);
+              }
+              DrawDE();
+              fSegmentation = AliMpSegmentation::Instance()
+                ->GetMpSegmentation(fCurrentDetElem, detElem->GetCathodType(fCurrentPlane));
+              break;
+
+            case kZoomMode:
+               if (fZoomButton->GetState() == kButtonDown)
+                   fZoomMode = true;
+               else
+                   fZoomMode = false;
+              break;
+          }
+          break;
+          
       }
       break;
-    }
-    return true;
+  }
+  return true;
 }
 
 //__________________________________________________________
 void AliMpDEVisu::NextDE()
 {
-/// select next DE
-    Int_t next = fDECombo->GetSelected() + 1;
-
-    if (next < fDECombo->GetNumberOfEntries())
-       fDECombo->Select(fDECombo->GetSelected() + 1);
-    else 
-       fDECombo->Select(0);
-
-    UpdateNameView();
+  /// select next DE
+  
+  Int_t next = fDECombo->GetSelected() + 1;
+  
+  if (next < fDECombo->GetNumberOfEntries())
+    fDECombo->Select(next);
+  else 
+    fDECombo->Select(0);
+  
+  UpdateNameView();
+  DrawDE();
 }
 
 //__________________________________________________________
 void AliMpDEVisu::UpdateComboDE()
 {
-/// update DE in respect to selected chamber
-    fDECombo->RemoveAll();
-
-    AliMpDEIterator it;
-    Int_t i = 0;
-    fDEComboIdx.Reset();
-    Char_t text[20];
-
-    for ( it.First(fChamberCombo->GetSelected()); ! it.IsDone(); it.Next() ) {
-      sprintf(text,"%d",it.CurrentDE()->GetId());
-      fDECombo->AddEntry(text,i);
-      fDEComboIdx[i++] = it.CurrentDE()->GetId();
-    }
-    fDECombo->Select(0);
+  /// update DE in respect to selected chamber
+  
+  fDECombo->RemoveAll();
+  
+  AliMpDEIterator it;
+  Int_t i = 0;
+  fDEComboIdx.Reset();
+  Char_t text[20];
+  
+  for ( it.First(fChamberCombo->GetSelected()); ! it.IsDone(); it.Next() ) {
+    sprintf(text,"%d",it.CurrentDE()->GetId());
+    fDECombo->AddEntry(text,i);
+    fDEComboIdx[i++] = it.CurrentDE()->GetId();
+  }
+  fDECombo->Select(0);
 }
 
 //__________________________________________________________
 void AliMpDEVisu::UpdateNameView()
 {
-/// update DE name in respect to selected DE id.
+  /// update DE name in respect to selected DE id.
+  
+  fNameDEView->Clear();
+  
+  fCurrentDetElem = fDEComboIdx[fDECombo->GetSelected()];
+  AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
+  fCurrentDEName = detElem->GetDEName();
+  
+  fNameDEView->AddLine(fCurrentDEName.Data());
+  fNameDEView->ShowBottom();
 
-    fNameDEView->Clear();
+  fSegmentation = AliMpSegmentation::Instance()
+    ->GetMpSegmentation(fCurrentDetElem, detElem->GetCathodType(fCurrentPlane));
+}
 
-    fCurrentDetElem = fDEComboIdx[fDECombo->GetSelected()];
-    AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
-    fCurrentDEName = detElem->GetDEName();
+//______________________________________________________________________________
+void
+AliMpDEVisu::CreatePopupWindow(Int_t w, Int_t h, const char* windowName,
+                               AliMpVPainter* painter,
+                               const char* option)
+{
+  // Create transient frame
+  
+  TCanvas* c = new TCanvas(windowName,windowName,-200,100,w,h);
 
-    fNameDEView->AddLine(fCurrentDEName.Data());
-    fNameDEView->ShowBottom();
+  Int_t n = fTrashList.GetEntries();
+  
+  c->Connect("Closed()","AliMpDEVisu",this,Form("ClosePopupWindow(=%d)",n));
+             
+  fTrashList.AddLast(c);
+  
+  c->Draw();
+  
+  painter->Draw(option);
+  
+  c->Update();
 }
 
 //__________________________________________________________
 void AliMpDEVisu::PopUpManuMotif(AliMpSlat* slat)
 {
-/// pop up manu window motif painter for slat
-
-// Create transient frame
-    TGTransientFrame* trans = new TGTransientFrame(fkMainWindow, fMain, 400, 400);
-
-    Char_t slot[255];
-    sprintf(slot, "ClosedPopUpMotif(=%d)", fNumberOfPopUp++);
-
-     trans->Connect("CloseWindow()", "AliMpDEVisu", this, slot);
-
-// fill trash
-    fTrashList.Add(trans);
-
-    Char_t title[255];
-    sprintf(title,"Manu Motif: %d", (Int_t)fNumberEntry->GetIntNumber()); 
-    trans->SetWindowName(title);
-
-// Create canvas widget
-    TRootEmbeddedCanvas* eTransCanvas = 
-       new TRootEmbeddedCanvas("ETransCanvas", trans, 400, 400);
-
-    trans->AddFrame(eTransCanvas, new TGLayoutHints(kLHintsCenterX,
-                                               5,5,5,5));
-
-    trans->CenterOnParent();
-    trans->Layout();
-
-    TCanvas* canvas = eTransCanvas->GetCanvas();
-    canvas->Clear();
-// motif painter
-    AliMpMotifPosition* motifPosFound = 0x0;
-    AliMpMotifPosition* motifPos = 0x0;
-
-    for ( AliMpSlat::Size_t i = 0; i < slat->GetSize(); ++i ) {
+  /// pop up manu window motif painter for slat
+  
+  // motif painter
+  AliMpMotifPosition* motifPosFound = 0x0;
+  AliMpMotifPosition* motifPos = 0x0;
+  Int_t manuId = 0;
 
+  for ( AliMpSlat::Size_t i = 0; i < slat->GetSize(); ++i ) {
+    
     AliMpPCB* pcb = slat->GetPCB(i);
-    AliMpPCBPainter* pcbPainter = new AliMpPCBPainter(pcb);
-
+    
     for ( AliMpPCB::Size_t j = 0; j < slat->GetPCB(i)->GetSize(); ++j ) {
       
       motifPos = pcb->GetMotifPosition(j);
       
-      Int_t manuId = motifPos->GetID();
+      manuId = motifPos->GetID();
       if (manuId == (Int_t)fNumberEntry->GetIntNumber()) {
-         motifPosFound = motifPos;
-         break;
+        motifPosFound = motifPos;
+        break;
       }
     }
     if (motifPosFound)
-       break;
-    delete pcbPainter;
+      break;
   }  
-    
-    if(motifPosFound) {
-// maps
-      trans->MapSubwindows();
-      trans->MapWindow();
-// painter
-      AliMpVPainter* painter = AliMpVPainter::CreatePainter(motifPosFound);
-      painter->Draw("ZT");
-// canvas
-      canvas->Update();
-  }
-    TVector2 dimension(motifPos->Dimensions());
 
-    Char_t log[255];
-    sprintf(log, "PopupManuMotif: motif dimension: %5.2f, %5.2f", dimension.X()*2., dimension.Y()*2.);
-    fLogMessage->AddLine(log);
+  if(motifPosFound) 
+  {
+    InfoManuMotif(motifPosFound);
 
-   sprintf(log, "PopupManuMotif: pad dimension: %4.2f, %4.2f", 
-          motifPos->GetMotif()->GetPadDimensions(0).X()*2.,  
-          motifPos->GetMotif()->GetPadDimensions(0).Y()*2. );
+    TVector2 dimension(motifPosFound->Dimensions());
 
-    fLogMessage->AddLine(log);
-
-    fLogMessage->ShowBottom();
+    Int_t h = 500;
+    Int_t w = Int_t(h*dimension.X()/dimension.Y());
+    AliMpVPainter* painter = AliMpVPainter::CreatePainter(motifPosFound);
+      
+    CreatePopupWindow(w,h,Form("Manu %d",fNumberEntry->GetIntNumber()),
+                     painter,"ZT");
+  }
 }
+
 //__________________________________________________________
 void AliMpDEVisu::PopUpManuMotif(AliMpSector* sector)
 {
-/// pop up manu window motif painter for sector
-
-// Create transient frame
-    TGTransientFrame* trans = new TGTransientFrame(fkMainWindow, fMain, 400, 400);
-
-    Char_t slot[255];
-    sprintf(slot, "ClosedPopUpMotif(=%d)", fNumberOfPopUp++);
+  /// pop up manu window motif painter for sector
+    
+  // motif painter
+  AliMpMotifPosition* motifPosFound = 0x0;
+  AliMpMotifPosition* motifPos = 0x0;
+  Int_t manuId = 0;
 
-     trans->Connect("CloseWindow()", "AliMpDEVisu", this, slot);
+  for (Int_t iRow = 0; iRow < sector->GetNofRows(); ++iRow) {
+    
+    AliMpRow* row = sector->GetRow(iRow);
+    
+    for (Int_t iRowSeg = 0; iRowSeg < sector->GetRow(iRow)->GetNofRowSegments(); ++iRowSeg){
+      
+      for (Int_t iRowSeg = 0; iRowSeg < row->GetNofRowSegments(); ++iRowSeg) {
+        AliMpVRowSegment *rowSegment = row->GetRowSegment(iRowSeg);
+        
+        for (Int_t iMotif = 0; iMotif < rowSegment->GetNofMotifs(); ++iMotif){
+          
+          Int_t motifPositionId = rowSegment->GetMotifPositionId(iMotif);
+          motifPos = rowSegment->GetRow()
+            ->GetMotifMap()->FindMotifPosition(motifPositionId);
+          
+          manuId = motifPos->GetID();
+          if (manuId == (Int_t)fNumberEntry->GetIntNumber()) {
+            motifPosFound = motifPos;
+            break;
+          }
+        }
+        if (motifPosFound)
+          break;
+      }
+    }
+    if (motifPosFound)
+      break;
+  }
+  
+  if(motifPosFound) 
+  {    
 
-// fill trash
-    fTrashList.Add(trans);
+    InfoManuMotif(motifPosFound);
 
-    Char_t title[255];
-    sprintf(title,"Manu Motif: %d", (Int_t)fNumberEntry->GetIntNumber()); 
-    trans->SetWindowName(title);
+    TVector2 dimension(motifPosFound->Dimensions());
 
-// Create canvas widget
-    TRootEmbeddedCanvas* eTransCanvas = 
-       new TRootEmbeddedCanvas("ETransCanvas", trans, 400, 400);
+    // Create transient frame
+    Int_t h = 400;
+    Int_t w = Int_t(h*dimension.X()/dimension.Y());
 
-    trans->AddFrame(eTransCanvas, new TGLayoutHints(kLHintsCenterX,
-                                               5,5,5,5));
+    AliMpVPainter* painter = AliMpVPainter::CreatePainter(motifPosFound);
+    
+    CreatePopupWindow(w,h,Form("Manu %d",fNumberEntry->GetIntNumber()),
+                      painter,"ZT");
+    
+  }
+}
 
-    trans->CenterOnParent();
-    trans->Layout();
+//__________________________________________________________
+void AliMpDEVisu::InfoManuMotif(AliMpMotifPosition* motifPos)
+{
+/// info for popup manu motif
 
-    TCanvas* canvas = eTransCanvas->GetCanvas();
-    canvas->Clear();
+   // log message
+    Int_t manuId = fNumberEntry->GetIntNumber();
+    TVector2 dimension(motifPos->Dimensions());
+    fLogMessage->AddLine(Form("PopupManuMotif: motif dimension: %5.2f, %5.2f", 
+                             dimension.X()*2., dimension.Y()*2.));
+      
+    fLogMessage->AddLine( Form("PopupManuMotif: pad dimension: %4.2f, %4.2f", 
+                              motifPos->GetMotif()->GetPadDimensions(0).X()*2.,  
+                              motifPos->GetMotif()->GetPadDimensions(0).Y()*2. ));
 
-// motif painter
-    AliMpMotifPosition* motifPosFound = 0x0;
-    AliMpMotifPosition* motifPos = 0x0;
+    fLogMessage->AddLine( Form("PopupManuMotif: manu: %d, serial number: %d, buspatch: %d",
+                              manuId, 
+                              fDDLStore->GetDetElement(fCurrentDetElem)->GetManuSerialFromId(manuId),
+                              fDDLStore->GetBusPatchId(fCurrentDetElem, manuId)) );
 
-     for (Int_t iRow = 0; iRow < sector->GetNofRows(); ++iRow) {
+    fLogMessage->ShowBottom();
 
-      AliMpRow* row = sector->GetRow(iRow);
-      AliMpRowPainter* rowPainter = new  AliMpRowPainter(row);
+}
 
-      for (Int_t iRowSeg = 0; iRowSeg < sector->GetRow(iRow)->GetNofRowSegments(); ++iRowSeg){
+//______________________________________________________________________________
+void AliMpDEVisu::PopUpZoom(Int_t ix0, Int_t iy0, Int_t ix1, Int_t iy1)
+{
+  /// popup zoom window
 
-       for (Int_t iRowSeg = 0; iRowSeg < row->GetNofRowSegments(); ++iRowSeg) {
-         AliMpVRowSegment *rowSegment = row->GetRowSegment(iRowSeg);
+  Double_t x0,y0;
+  EventToReal(ix0,iy0,x0,y0);
+  Double_t x1,y1;
+  EventToReal(ix1,iy1,x1,y1);
 
-         for (Int_t iMotif = 0; iMotif < rowSegment->GetNofMotifs(); ++iMotif){
+  fLogMessage->AddLine(Form("PopUpZoom: zoom positions (x0, y0: %6.2f, %6.2f), (x1, y1: %6.2f, %6.2f)",
+                             x0, y0, x1, y1));
+  fLogMessage->ShowBottom();
+  
+  // Create transient frame
+  Int_t h = 500;//TMath::Abs(x1-x0);
+  Int_t w = 500;//TMath::Abs(y1-y0);
 
-           Int_t motifPositionId = rowSegment->GetMotifPositionId(iMotif);
-           motifPos = rowSegment->GetRow()
-               ->GetMotifMap()->FindMotifPosition(motifPositionId);
-               
-           Int_t manuId = motifPos->GetID();
-           if (manuId == (Int_t)fNumberEntry->GetIntNumber()) {
-             motifPosFound = motifPos;
-             break;
-           }
-         }
-         if (motifPosFound)
-             break;
-       }
-      }
-      if (motifPosFound)
-         break;
-      delete rowPainter;
+  AliMpArea area(TVector2((x0+x1)/2.0,(y0+y1)/2.0),
+                  TVector2(TMath::Abs(x1-x0)/2.0,TMath::Abs(y1-y0)/2.0));
+//  area.Print();
+  
+  if ( area.IsValid() )
+  {
+    AliMpVPadIterator* iterator = fSegmentation->CreateIterator(area);
+    if (iterator)
+    {
+      AliMpVPainter* painter = AliMpVPainter::CreatePainter(iterator);
+      CreatePopupWindow(w,h,"Zoom",painter,"");
     }
-
-    if(motifPosFound) {
-// map
-      trans->MapSubwindows();
-      trans->MapWindow();
-// painter
-      AliMpVPainter* painter = AliMpVPainter::CreatePainter(motifPosFound);
-      painter->Draw("ZT");
-// canvas
-      canvas->Update();
+    else
+    {
+      AliError("could not get iterator for that area");
     }
-
-    TVector2 dimension(motifPos->Dimensions());
-
-    Char_t log[255];
-    sprintf(log, "PopupManuMotif: motif dimension: %5.2f, %5.2f", dimension.X()*2., dimension.Y()*2.);
-    fLogMessage->AddLine(log);
-
-    sprintf(log, "PopupManuMotif: pad dimension: %4.2f, %4.2f", 
-          motifPos->GetMotif()->GetPadDimensions(0).X()*2.,  
-          motifPos->GetMotif()->GetPadDimensions(0).Y()*2. );
-
-    fLogMessage->AddLine(log);
-
-    fLogMessage->ShowBottom();
-
+        
+    delete iterator;
+  }
 }
 
 //__________________________________________________________
-void AliMpDEVisu::ClosedPopUpMotif(Int_t id)
+void AliMpDEVisu::ClosePopupWindow(Int_t id)
 {
-/// close signal
-
-    TGTransientFrame* trans = (TGTransientFrame*)fTrashList.At(id);
-    fTrashList.Remove(trans);
+  /// close signal
+  fEcanvas->GetCanvas()->cd();
+  fTrashList.RemoveAt(id);
 }
index f03f98027c95e2a7c5857786297a4c104d1aef17..b1e0dc77867bf1173468ba757a62c7847976d316 100644 (file)
 #define ALI_MP_DE_VISU_H
 
 #include <TGFrame.h>
+
 #include "AliMpPlaneType.h"
 
+#include <TArrayI.h>
+#include <TObjArray.h>
+
 class TObject;
 class TString;
-class TList;
-class TArrayI;
 class TRootEmbeddedCanvas;
 class TGComboBox;
 class TGMainFrame;
@@ -31,9 +33,10 @@ class AliMpSector;
 class AliMpVSegmentation;
 class AliMpDDLStore;
 class TGTextEntry;
+class AliMpMotifPosition;
 
-class AliMpDEVisu : public TGFrame {
-
+class AliMpDEVisu : public TGFrame 
+{
 
 public:
     AliMpDEVisu(UInt_t w = 1200, UInt_t h = 600);
@@ -42,7 +45,7 @@ public:
 
     void   UpdateComboDE();
     Bool_t ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2);
-    void   DrawDE();
+    void   DrawDE(Bool_t info = kTRUE);
     void   NextDE();
     void   DrawManuMotif(Bool_t popup = kFALSE);
     void   DrawQuadrant(Option_t* option, Bool_t popup = kFALSE);
@@ -52,15 +55,23 @@ public:
     void   UpdateNameView();
     void   PopUpManuMotif(AliMpSlat* slat);
     void   PopUpManuMotif(AliMpSector* sector);
-
-    void   ClosedPopUpMotif(Int_t id);
+    void   PopUpZoom(Int_t ix0, Int_t iy0, Int_t ix1, Int_t iy1);
+    
+    void   ClosePopupWindow(Int_t id);
     void   InfoDE();
+    void   InfoManuMotif(AliMpMotifPosition* motifPos);
     void   DeletePopUp();
     void   SaveLogMessage();
     void   ClearLogMessage();
 
     void   HandleMovement(Int_t eventType, Int_t eventX, Int_t eventY, TObject* select);
 
+private:
+    void EventToReal(Int_t eventX, Int_t eventY, Double_t& x, Double_t& y) const;
+    void CreatePopupWindow(Int_t w, Int_t h, const char* title,
+                           AliMpVPainter* painter,
+                           const char* option);
+    
 private:
 
     const TGWindow*    fkMainWindow; //!< main window
@@ -71,10 +82,11 @@ private:
     TGComboBox*    fDECombo;         //!< DE botton
     TGNumberEntry* fNumberEntry;     //!< manu id button
     TGCheckButton* fPlaneButton;     //!< check button for NB plane, defaultwise B plane
+    TGCheckButton* fZoomButton;      //!< check button to activate zoom mode, default wise disable
     TGTextView*    fNameDEView;      //!< name of the DE
     TGTextView*    fLogMessage;      //!< log message
     TGTextEntry*   fLogFile;         //!< text entry for log file name
-    TList          fTrashList;       //!< list of transient windows to delete
+    TObjArray      fTrashList;       //!< list of transient windows to delete
 
     TArrayI        fDEComboIdx;      //!< array for index vs DE id
 
@@ -85,10 +97,9 @@ private:
     const AliMpVSegmentation* fSegmentation; //!< segmentation instance
     AliMpDDLStore*            fDDLStore;     //!< DDL Store
 
-    Int_t            fNumberOfPopUp;   //!< number of manu motif popup window open    
-
-    enum {kChamberCombo, kDECombo, kPlaneType, kDEName, kManuEntries, kLogMessage};
+    Bool_t           fZoomMode;        //!< flag for zoom mode on canvas instead of click mode
 
+    enum {kChamberCombo, kDECombo, kPlaneType, kDEName, kManuEntries, kLogMessage, kZoomMode};
 
     AliMpDEVisu(const AliMpDEVisu& src);
     AliMpDEVisu& operator=(const AliMpDEVisu& src);
@@ -96,3 +107,4 @@ private:
     ClassDef(AliMpDEVisu,1)
 };
 #endif
+