]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONDisplay.cxx
Corrected mapping management group definition
[u/mrichter/AliRoot.git] / MUON / AliMUONDisplay.cxx
index eb7f0cf6c5a31d8e7ade498d7497e3de4b322455..2c2fbecf454282064ae041fd888c97e15f8c5fd1 100644 (file)
 //                                                                      //
 //////////////////////////////////////////////////////////////////////////
 
-#include <TROOT.h>
-#include <TTree.h>
+#include "AliMUONDisplay.h"
+#include "AliMUON.h"
+#include "AliMUONPoints.h"
+#include "AliMUONGlobalTrigger.h"
+#include "AliMUONHit.h"
+#include "AliMUONDigit.h"
+#include "AliMUONRawCluster.h"
+#include "AliMUONTrack.h"
+#include "AliMUONTrackParam.h"
+#include "AliMUONGeometryTransformer.h"
+#include "AliMUONSegmentation.h"
+#include "AliMUONGeometrySegmentation.h"
+#include "AliMUONConstants.h"
+#include "AliMUONTriggerSegmentationV2.h"
+
+#include "AliMpDEIterator.h"
+#include "AliMpSegFactory.h"
+#include "AliMpSlatSegmentation.h"
+#include "AliMpSlat.h"
+#include "AliMpSectorSegmentation.h"
+#include "AliMpSector.h"
+#include "AliMpTriggerSegmentation.h"
+#include "AliMpTrigger.h"
+#include "AliMpStationType.h"
+#include "AliMpDEManager.h"
+
+#include "AliMC.h"
+#include "AliLog.h"
+#include "AliRun.h"
+#include "AliHeader.h"
+
 #include <TButton.h>
 #include <TColor.h>
 #include <TCanvas.h>
 #include <TView.h>
 #include <TText.h>
-#include <TPolyMarker3D.h>
 #include <TPaveLabel.h>
 #include <TPaveText.h>
-#include <TList.h>
 #include <TDiamond.h>
 #include <TNode.h>
 #include <TArc.h>
-#include <TTUBE.h>
 #include <TSlider.h>
-#include <TSliderBox.h>
-#include <TGaxis.h>
 #include <TVirtualX.h>
 #include <TMath.h>
-#include <TMatrix.h>
 #include <TGeometry.h>
-#include <X3DBuffer.h>
 #include <TMarker3DBox.h>
-
-#include "AliRun.h"
-#include "AliDetector.h"
-#include "AliMUON.h"
-#include "AliMUONDisplay.h"
-#include "AliMUONPoints.h"
-#include "TParticle.h"
-#include "AliMUONTriggerDecision.h"
-#include "AliHeader.h"
-
-#include "AliMUONHit.h"
-#include "AliMUONPadHit.h"
-#include "AliMUONDigit.h"
-#include "AliMUONRawCluster.h"
-
-#include "AliSegmentation.h"
-#include "AliMUONResponse.h"
-#include "AliMUONChamber.h"
-#include "AliMUONConstants.h"
-// to manage the same zoom on both cathodes
+#include <TParticle.h>
+#include <TPolyLine3D.h>
+#include <TBox.h>
 
 
 
@@ -75,6 +80,7 @@ ClassImp(AliMUONDisplay)
 
 //_____________________________________________________________________________
 AliMUONDisplay::AliMUONDisplay()
+  : AliDisplay()
 {
 // Constructor
     fPoints = 0;
@@ -86,7 +92,8 @@ AliMUONDisplay::AliMUONDisplay()
 }
 
 //_____________________________________________________________________________
-AliMUONDisplay::AliMUONDisplay(Int_t size)
+AliMUONDisplay::AliMUONDisplay(Int_t size, AliLoader * loader)
+  : AliDisplay()
 {
 // Create an event display object.
 // A canvas named "edisplay" is created with a vertical size in pixels
@@ -154,6 +161,7 @@ AliMUONDisplay::AliMUONDisplay(Int_t size)
     //   fRzone   = 1.e10;
     fDrawClusters  = kTRUE;
     fDrawCoG       = kTRUE;
+    fDrawTracks    = kFALSE;
     fZoomMode      = 1;
     fZooms         = 0;
     fClustersCuts  = 0;
@@ -166,7 +174,7 @@ AliMUONDisplay::AliMUONDisplay(Int_t size)
     Int_t ysize = size;
     if (ysize < 100) ysize = 750;
     Int_t xsize = Int_t(size*830./ysize);
-    fCanvas = new TCanvas("Canvas", "MUON Clusters Display",14,47,xsize,ysize);
+    fCanvas = new TCanvas("Canvas", "MUON Display",14,47,xsize,ysize);
     fCanvas->ToggleEventStatus();
     
    // Create main display pad
@@ -224,12 +232,20 @@ AliMUONDisplay::AliMUONDisplay(Int_t size)
     fButtons->SetEditable(kFALSE);
     fCanvas->Update();
     fNextCathode = kFALSE; 
+    fLoader = loader;
+    // initialize container
+    if(fLoader) 
+      fMUONData = new AliMUONData(fLoader,"MUON","MUON");
+    else
+      fMUONData =0x0;
 }
 
-AliMUONDisplay::AliMUONDisplay(const AliMUONDisplay & display):AliDisplay(display)
+AliMUONDisplay::AliMUONDisplay(const AliMUONDisplay & display)
+  : AliDisplay(display)
 {
-// Dummy copy constructor    
-    ;
+// Protected copy constructor
+
+  AliFatal("Not implemented.");
 }
 
 
@@ -318,6 +334,12 @@ void AliMUONDisplay::DisplayButtons()
     button->SetFillColor(38);
     button->Draw();
     
+    y -= dbutton + dy;
+    char but8[] = "((AliMUONDisplay*)(gAlice->Display()))->DrawReco()";
+    button = new TButton("Tracking", but8, x0, y - dbutton, x1, y);
+    button->SetFillColor(38);
+    button->Draw();
+
    // display logo
     TDiamond *diamond = new TDiamond(0.05,0.015,0.95,0.22);
     diamond->SetFillColor(50);
@@ -333,7 +355,7 @@ void AliMUONDisplay::DisplayButtons()
 }
 
 //_____________________________________________________________________________
-void AliMUONDisplay::CreateColors()
+void AliMUONDisplay::CreateColors() const
 {
 //    Create the colors palette used to display clusters
 
@@ -413,11 +435,9 @@ void AliMUONDisplay::DisplayColorScale()
     text->SetTextSize(0.2);
     text->SetTextAlign(22);
     
-    AliMUON *pMUON  = (AliMUON*)gAlice->GetModule("MUON");
-    AliMUONChamber *iChamber = &(pMUON->Chamber(fChamber-1));
-    AliMUONResponse * response=iChamber->ResponseModel();
-    Int_t adcmax=1024;
-    if (response) adcmax = (Int_t) response->MaxAdc();
+
+    Int_t adcmax=4096; // default 12 bits ADC
+
     
 
     TBox *box;
@@ -466,73 +486,137 @@ void AliMUONDisplay::Draw(Option_t *)
 {
 //    Display current event
 
-    fPad->cd();
+    if (!fDrawTracks) 
+      DrawChamber();   
+    else 
+      DrawReco();
+    
+}
+//_____________________________________________________________________________
+void AliMUONDisplay::DrawChamber()
+{
+
+  fDrawTracks = kFALSE;
+  fPad->cd();
+  DrawView(fTheta, fPhi, fPsi);   
+  // Display the event number and title
+  fPad->cd();
+  DrawTitle();
+}
+//_____________________________________________________________________________
+void AliMUONDisplay::DrawReco(Option_t *)
+{
+//    Display current event
 
-    DrawView(fTheta, fPhi, fPsi);   
+  fDrawTracks = kTRUE;
+  // print kinematics of generated particles
+    PrintKinematics();
+    // Draw global view of muon system
+    fPad->cd();
+    DrawGlobalView(135, -50, -140); 
+  
     // Display the event number and title
     fPad->cd();
     DrawTitle();
 }
 
+//_____________________________________________________________________________
+void AliMUONDisplay::PrintKinematics()
+{
+  AliRunLoader * runLoader;
+  TParticle *particle = new TParticle();
+  Int_t nPart;
+  Float_t vertex[3], momentum[3];
+
+  if (fLoader)
+    runLoader = fLoader->GetRunLoader();
+  else
+    runLoader = 0x0;
+  
+  printf("******  Event # %d ******\n",runLoader->GetEventNumber());
+  runLoader->TreeK()->GetBranch("Particles")->SetAddress(&particle);
+  nPart = (Int_t)runLoader->TreeK()->GetEntries();
+  for(Int_t iPart = 0; iPart < nPart; iPart++) {
+    runLoader->TreeK()->GetEvent(iPart);
+    vertex[0] = particle->Vx();
+    vertex[1] = particle->Vy();
+    vertex[2] = particle->Vz();
+    momentum[0] = particle->Px();
+    momentum[1] = particle->Py();
+    momentum[2] = particle->Pz();
+    
+    printf("===================================================\n");
+    printf(" Generated particle # %d \n",iPart);
+    printf(" name: %s \n",particle->GetName());
+    printf(" vertex x,y,z (cm): %f %f %f \n",vertex[0],vertex[1],vertex[2]); 
+    printf(" momentum Px,Py,Pz (GeV/c): %f %f %f \n",momentum[0],momentum[1],momentum[2]);
+  }
+  delete particle;    
+}
+
 void AliMUONDisplay::DrawSegmentation()
 {
+  // to be re-written for new seg
 // Draw graphical representation of segmenatation
 // Attention: still experimental code
-    Int_t icat=1;
+//     Int_t icat=1;
     
-    AliMUON *pMUON  = (AliMUON*)gAlice->GetModule("MUON");
-    AliMUONChamber*   iChamber;
-    AliSegmentation*  seg;
-    iChamber = &(pMUON->Chamber(fChamber));
-    seg=iChamber->SegmentationModel(icat);
-    Float_t zpos=iChamber->Z();
-    Float_t r=iChamber->ROuter();
+//     AliMUON *pMUON  = (AliMUON*)gAlice->GetModule("MUON");
+//     AliMUONChamber*   iChamber;
+
+//     AliSegmentation*  seg;
+//     iChamber = &(pMUON->Chamber(fChamber));
+//     seg=iChamber->SegmentationModel(icat);
+
+//     Float_t zpos=iChamber->Z();
+//     Float_t r=iChamber->ROuter();
     
-    TMarker3DBox *marker;
-    if (icat == 1) {
-       for (Int_t j=0; j<seg->Npy(); j++) {
-           Float_t y0;
-           y0=j*seg->Dpy()-seg->Dpy()/2.;
-           for (seg->FirstPad(0.,y0,0,300,0.); 
-                seg->MorePads();
-                seg->NextPad())
-           {
-               if (seg->ISector()==0) continue;
-               Float_t x,y,z;
-               seg->GetPadC(seg->Ix(), seg->Iy(), x, y, z);
-               Float_t dpx=seg->Dpx(seg->ISector())/2;
-               Float_t dpy=seg->Dpy(seg->ISector())/2;
-               marker=new TMarker3DBox(x,y,zpos,dpx,dpy,0,0,0);
-               marker->SetLineColor(seg->ISector()+1);
-               marker->SetFillStyle(1001);
-               marker->SetFillColor(0);
-               marker->Draw();
-           }
-       }
-    } else {
-       for (Int_t j=0; j<250; j++) {
-           Float_t x0=j*seg->Dpx();
-           Float_t y0=TMath::Sqrt(r*r-x0*x0);
+//     TMarker3DBox *marker;
+//     if (icat == 1) {
+//     for (Int_t j=0; j<seg->Npy(); j++) {
+//         Float_t y0;
+//         y0=j*seg->Dpy()-seg->Dpy()/2.;
+//         for (seg->FirstPad(0.,y0,0,300,0.); 
+//              seg->MorePads();
+//              seg->NextPad())
+//         {
+//             if (seg->ISector()==0) continue;
+//             Float_t x,y,z;
+//             seg->GetPadC(seg->Ix(), seg->Iy(), x, y, z);
+//             Float_t dpx=seg->Dpx(seg->ISector())/2;
+//             Float_t dpy=seg->Dpy(seg->ISector())/2;
+//             marker=new TMarker3DBox(x,y,zpos,dpx,dpy,0,0,0);
+//             marker->SetLineColor(seg->ISector()+1);
+//             marker->SetFillStyle(1001);
+//             marker->SetFillColor(0);
+//             marker->Draw();
+//         }
+//     }
+//     } else {
+//     for (Int_t j=0; j<250; j++) {
+//         Float_t x0=j*seg->Dpx();
+//         Float_t y0=TMath::Sqrt(r*r-x0*x0);
            
-           for (seg->FirstPad(x0,0,0,0,y0); 
-                seg->MorePads();
-                seg->NextPad())
-           {
-               if (seg->ISector()==0) continue;
+//         for (seg->FirstPad(x0,0,0,0,y0); 
+//              seg->MorePads();
+//              seg->NextPad())
+//         {
+//             if (seg->ISector()==0) continue;
                
-               Float_t x,y,z;
-               seg->GetPadC(seg->Ix(), seg->Iy(), x, y, z);
-               Float_t dpx=seg->Dpx(seg->ISector())/2;
-               Float_t dpy=seg->Dpy(seg->ISector())/2;
-               marker=new TMarker3DBox(x,y,zpos,dpx,dpy,0,0,0);
-               marker->SetLineColor(seg->ISector()+1);
-               marker->SetFillStyle(1001);
-               marker->SetFillColor(0);
-               marker->Draw();
-           }
-       }
-    }
-}
+//             Float_t x,y,z;
+//             seg->GetPadC(seg->Ix(), seg->Iy(), x, y, z);
+//             Float_t dpx=seg->Dpx(seg->ISector())/2;
+//             Float_t dpy=seg->Dpy(seg->ISector())/2;
+//             marker=new TMarker3DBox(x,y,zpos,dpx,dpy,0,0,0);
+//             marker->SetLineColor(seg->ISector()+1);
+//             marker->SetFillStyle(1001);
+//             marker->SetFillColor(0);
+//             marker->Draw();
+//         }
+//     }
+//     }
+ }
 
 //_____________________________________________________________________________
 void AliMUONDisplay::DrawClusters()
@@ -559,7 +643,7 @@ void AliMUONDisplay::DrawClusters()
                marker->Draw();
        }
        pm->Draw();
-       fClustersCuts +=pm->GetN();
+       fClustersCuts += pm->GetN();
     }
 }
 
@@ -609,6 +693,26 @@ void AliMUONDisplay::DrawCoG()
     }
 }
 //_____________________________________________________________________________
+void AliMUONDisplay::DrawTracks()
+{
+//    Draw tracks
+    if (!fDrawTracks) return;
+    LoadTracks();
+    
+    Int_t nTrack, iTrack;
+    TObjArray *points;
+    TPolyLine3D *pm;
+
+    points = Rpoints();
+    if (!points) return;
+    nTrack = points->GetEntriesFast();
+    for ( iTrack = 0; iTrack < nTrack; iTrack++) {
+       pm = (TPolyLine3D*)points->UncheckedAt(iTrack);
+       if (!pm) continue;
+       pm->Draw();
+    }
+}
+//_____________________________________________________________________________
 
 void AliMUONDisplay::DrawTitle(Option_t *option)
 {
@@ -621,6 +725,13 @@ void AliMUONDisplay::DrawTitle(Option_t *option)
     Float_t dx   = xmax-xmin;
     Float_t dy   = ymax-ymin;
     
+    AliRunLoader * runLoader;
+    if (fLoader)
+      runLoader = fLoader->GetRunLoader();
+    else
+      runLoader = 0x0;
+
+
     if (strlen(option) == 0) {
        TPaveText *title = new TPaveText(xmin +0.01*dx, ymax-0.09*dy, xmin +0.5*dx, ymax-0.01*dy);
 //      title->SetTextSize(0.023932);
@@ -630,12 +741,12 @@ void AliMUONDisplay::DrawTitle(Option_t *option)
        title->Draw();
        char ptitle[100];
        sprintf(ptitle, "Alice event:%d Run:%d Chamber:%d Cathode:%d",
-               gAlice->GetHeader()->GetEvent(),
+               runLoader->GetEventNumber(),
                gAlice->GetHeader()->GetRun(),
                fChamber,
                fCathode);
        title->AddText(ptitle);
-       Int_t nparticles = gAlice->Particles()->GetEntriesFast();
+       Int_t nparticles = gAlice->GetMCApp()->Particles()->GetEntriesFast();
        sprintf(ptitle,"Nparticles = %d Nhits = %d Npads fired = %d",
                nparticles, fHitsCuts,fClustersCuts);
        title->AddText(ptitle);
@@ -651,7 +762,7 @@ void AliMUONDisplay::DrawTitle(Option_t *option)
 void AliMUONDisplay::DrawView(Float_t theta, Float_t phi, Float_t psi)
 {
 //    Draw a view of MUON clusters
-    printf("\n Draw View");
+    AliInfo(" Draw View");
     
     gPad->SetCursor(kWatch);
     // gPad->SetFillColor(39);
@@ -675,12 +786,164 @@ void AliMUONDisplay::DrawView(Float_t theta, Float_t phi, Float_t psi)
        fZooms = 0;
     }
 
+    Float_t xg1, xg2, yg1, yg2, zg1, zg2;
+
+    // Recovering the chamber 
+    AliMUON *pMUON  = (AliMUON*)gAlice->GetModule("MUON");
+
+    const AliMUONGeometryTransformer* kGeomTransformer 
+      = pMUON->GetGeometryTransformer();
+
+    AliMUONSegmentation* segmentation = pMUON->GetSegmentation();
+    AliMpSegFactory segFactory;
+        // Mapping segmentation factory will be used only to create mapping
+       // segmentations if not present in the DE segmentations
+
 // Display MUON Chamber Geometry
     char nodeName[7];
     sprintf(nodeName,"MUON%d",100+fChamber);
+    printf(">>>> chamber is %d\n",fChamber);
+
+    if(fChamber < 5) {
+      AliMpDEIterator it;
+      for ( it.First(fChamber-1); ! it.IsDone(); it.Next() ) {
+
+       Int_t detElemId = it.CurrentDE();
+       AliMpSectorSegmentation * seg =   
+         (AliMpSectorSegmentation *) segmentation->GetMpSegmentation(detElemId, 0);
+       const AliMpSector * sector = seg->GetSector();
+
+       // get sector measurements
+       TVector2 position  = sector->Position(); 
+       TVector2 dimension = sector->Dimensions(); // half length
+       
+       Float_t xlocal1 =  position.Px(); // mm to cm
+       Float_t ylocal1 =  position.Py();
+       Float_t xlocal2 =  dimension.Px() * 2.;
+       Float_t ylocal2 =  dimension.Px() * 2.;
+
+       kGeomTransformer->Local2Global(detElemId, xlocal1, ylocal1, 0, xg1, yg1, zg1);
+       kGeomTransformer->Local2Global(detElemId, xlocal2, ylocal2, 0, xg2, yg2, zg2);
+
+       // drawing 
+       TPolyLine3D* poly = new  TPolyLine3D();
+       Int_t nPoint = 0;
+
+       poly->SetPoint(nPoint++, xg1, yg1, 0.);
+       for (Float_t d = 0; d < TMath::Pi()/2.; d+= 0.01) {
+         Float_t x = xg1 + xg2 * TMath::Cos(d);
+         Float_t y = yg1 + yg2 * TMath::Sin(d);
+         poly->SetPoint(nPoint++, x, y, 0.);
+       }
+       poly->SetPoint(nPoint++, xg1, yg1, 0.);
+
+       poly->SetLineColor(2);
+       poly->Draw("s");
+      }
+   
+      //     }
+
+    }
+
+    if(fChamber >4 && fChamber <11) {
+      AliMpDEIterator it;
+      for ( it.First(fChamber-1); ! it.IsDone(); it.Next() ) {
+       Int_t detElemId = it.CurrentDE();
+       if (  segmentation->HasDE(detElemId) ) {
+         AliMpSlatSegmentation * seg =   
+           (AliMpSlatSegmentation *) segmentation->GetMpSegmentation(detElemId, 0);
+         if (!seg) { 
+           // Create mapping segmentation if old trigger segmentation
+           // (not using mapping)
+           seg = (AliMpSlatSegmentation *)
+                  segFactory.CreateMpSegmentation(detElemId, 0);
+         }       
+         if (seg) {  
+           const AliMpSlat* slat = seg->Slat();
+           Float_t deltax = slat->DX();
+           Float_t deltay = slat->DY();
+           Float_t xlocal1 =  -deltax;
+           Float_t ylocal1 =  -deltay;
+           Float_t xlocal2 =  +deltax;
+           Float_t ylocal2 =  +deltay;
+           kGeomTransformer->Local2Global(detElemId, xlocal1, ylocal1, 0, xg1, yg1, zg1);
+           kGeomTransformer->Local2Global(detElemId, xlocal2, ylocal2, 0, xg2, yg2, zg2);
+
+           // drawing slat active volumes
+           Float_t xCenter = (xg1 + xg2)/2.;
+           Float_t yCenter = (yg1 + yg2)/2.;
+
+           TMarker3DBox* box = new TMarker3DBox(xCenter,yCenter,0,xlocal1,ylocal2,0,0,0);
+
+           box->SetFillStyle(0);
+           box->SetLineColor(2);
+           box->Draw("s");
+
+           // drawing inner circle + disc
+           TPolyLine3D* poly  = new  TPolyLine3D();
+           TPolyLine3D* poly1 = new  TPolyLine3D();
+
+           Int_t nPoint = 0;
+           Int_t nPoint1 = 0;
+           for (Float_t d = 0; d < 6.24; d+= 0.005) {
+             Double_t x = AliMUONConstants::Dmin((fChamber-1)/2) * TMath::Cos(d)/2.;
+             Double_t y = AliMUONConstants::Dmin((fChamber-1)/2) * TMath::Sin(d)/2.;
+             if (nPoint % 2 == 0) poly->SetPoint(nPoint++, 0., 0., 0.);
+             poly->SetPoint(nPoint++, x, y, 0.);
+             poly1->SetPoint(nPoint1++, x, y, 0.);
+
+           }
+           poly->SetLineColor(1);
+           poly->Draw("s");
+           poly1->SetLineColor(2);
+           poly1->Draw("s");
+         }  
+       }
+      }
+    }
+    
+/*-- Trigger Chambers ---------------------------------------*/
+    if(fChamber >10 && fChamber <15) {
+      AliMpDEIterator it;
+      for ( it.First(fChamber-1); ! it.IsDone(); it.Next() ) {
+       Int_t detElemId = it.CurrentDE();
+       AliMpTriggerSegmentation * seg  
+         = (AliMpTriggerSegmentation *) segmentation->GetMpSegmentation(detElemId, 0);
+       if (!seg) {  
+           printf(" AliMUONDisplay no segmentation \n");
+           
+         // Create mapping segmentation if old trigger segmentation
+         // (not using mapping)
+         seg = (AliMpTriggerSegmentation *)
+                segFactory.CreateMpSegmentation(detElemId, 0);
+       }         
+       if (seg) {   
+         const AliMpTrigger* slat = seg->Slat();
+         Float_t deltax = slat->DX();
+         Float_t deltay = slat->DY();
+         Float_t xlocal1 =  -deltax;
+         Float_t ylocal1 =  -deltay;
+         Float_t xlocal2 =  +deltax;
+         Float_t ylocal2 =  +deltay;
+         
+         kGeomTransformer->Local2Global(detElemId, xlocal1, ylocal1, 0, xg1, yg1, zg1);
+         kGeomTransformer->Local2Global(detElemId, xlocal2, ylocal2, 0, xg2, yg2, zg2);
+
+         // drawing slat active volumes
+         Float_t xCenter = (xg1 + xg2)/2.;
+         Float_t yCenter = (yg1 + yg2)/2.;
+
+         TMarker3DBox* box = new TMarker3DBox(xCenter,yCenter,0,xlocal1,ylocal2,0,0,0);
+
+         box->SetFillStyle(0);
+         box->SetLineColor(4);
+         box->Draw("s");
+       }  
+      }
+    }
+    // Delete mapping segmentations created with factory
+    segFactory.DeleteSegmentations();
     
-    TNode *node1=gAlice->GetGeometry()->GetNode(nodeName);
-    if (node1) node1->Draw("same");  
 //add clusters to the pad
     DrawClusters();
     DrawHits();
@@ -691,6 +954,55 @@ void AliMUONDisplay::DrawView(Float_t theta, Float_t phi, Float_t psi)
     view->SetView(phi, theta, psi, iret);
 }
 
+//_____________________________________________________________________________
+void AliMUONDisplay::DrawGlobalView(Float_t theta, Float_t phi, Float_t psi)
+{
+//    Draw a view of muons chambers with tracks
+    
+    gPad->SetCursor(kWatch);
+    // gPad->SetFillColor(39);
+    gPad->SetFillColor(1);
+    gPad->Clear();
+    // gPad->SetFillColor(39);
+    gPad->SetFillColor(1);
+    
+
+    Int_t iret=0;
+    TView *view = new TView(1);
+    
+    Float_t range = fRrange*fRangeSlider->GetMaximum()*3.;
+    view->SetRange(-range,-range,-range,range,range,range);
+
+// Display all MUON Chambers segmentation
+    char nodeName[7];
+    TNode *node1;
+    sprintf(nodeName,"alice");
+    
+    node1=gAlice->GetGeometry()->GetNode(nodeName);
+    if (node1) node1->Draw("same"); 
+     
+      
+// Draw clusters for all chambers
+    Int_t chamberSave = fChamber;
+    for (fChamber = 1; fChamber <= 10; fChamber++){
+      DrawCoG();
+    }
+    fChamber = chamberSave;
+// Draw reconstructed tracks
+    DrawTracks();
+
+    AppendPad();
+
+    Float_t zoom = 2.;
+    Float_t shift = 0.9;
+    Float_t x0 = (-1+shift)/zoom;
+    Float_t y0 = (-1+shift)/zoom;
+    Float_t x1 = (1+shift)/zoom;
+    Float_t y1 = (1+shift)/zoom;
+    gPad->Range(x0,y0,x1,y1);
+    view->SetView(phi, theta, psi, iret);
+
+}
 
 //______________________________________________________________________________
 void AliMUONDisplay::ExecuteEvent(Int_t event, Int_t px, Int_t py)
@@ -767,114 +1079,204 @@ void AliMUONDisplay::LoadDigits(Int_t chamber, Int_t cathode)
 // Loop on all detectors
 
     if (chamber > 14) return;
-    printf(" chamber %d \n",chamber);
     fChamber = chamber;
     fCathode = cathode;
     
     ResetPoints();
     
     AliMUON *pMUON  =     (AliMUON*)gAlice->GetModule("MUON");
-    AliMUONChamber*       iChamber;
-    AliSegmentation*      segmentation;
-    AliMUONResponse*      response;
 
-    TClonesArray *muonDigits  = pMUON->GetMUONData()->Digits(chamber-1,0);
+    AliMUONGeometrySegmentation*  segmentation2 = 0x0;
+
+    GetMUONData()->SetTreeAddress("D");
+
+    TClonesArray *muonDigits  = GetMUONData()->Digits(chamber-1);
     if (muonDigits == 0) return;
 
-//     gAlice->ResetDigits();
+    gAlice->ResetDigits();
     Int_t nent = 0;
  
-   if (gAlice->TreeD()) {
-     nent = (Int_t) gAlice->TreeD()->GetEntries();
-     printf(" entries %d \n", nent);
-     //     gAlice->TreeD()->GetEvent(nent-2+cathode-1);
-     gAlice->TreeD()->GetEvent(cathode-1);
+    if (GetLoader()->TreeD()) {
+       nent = (Int_t) GetLoader()->TreeD()->GetEntries();
+       //     gAlice->TreeD()->GetEvent(nent-2+cathode-1);
+       GetMUONData()->GetDigits();
     }
     
-    Int_t ndigits = muonDigits->GetEntriesFast();
+    Int_t ndigits = muonDigits->GetEntriesFast();    
     if (ndigits == 0) return;
     if (fPoints == 0) fPoints = new TObjArray(ndigits);
     
-    iChamber = &(pMUON->Chamber(chamber-1));
-
-    segmentation = iChamber->SegmentationModel(cathode);
-    response     = iChamber->ResponseModel();
-    Float_t zpos = iChamber->Z();
+    Float_t zpos = AliMUONConstants::DefaultChamberZ(chamber-1);
 
     AliMUONDigit  *mdig;
     AliMUONPoints *points  = 0;
     TMarker3DBox  *marker  = 0;
-    //
-    //loop over all digits and store their position
-    
+
     Int_t npoints  = 1;
-    Float_t adcmax = 1024;
-    if (response) adcmax = response->MaxAdc();
-
-    for (Int_t digit = 0; digit < ndigits; digit++) {
-        mdig    = (AliMUONDigit*)muonDigits->UncheckedAt(digit);
-       if (mdig->Cathode() != cathode-1) continue;
-
-        //
-        // First get all needed parameters
-        //
-        Int_t charge = mdig->Signal();
-        Int_t index  = Int_t(TMath::Log(charge)/(TMath::Log(adcmax)/22));
-        Int_t color  = 261+index;
-       Int_t colorTrigger = 2;   
-        if (color > 282) color = 282;
-
-       if (chamber > 10) { // trigger chamber 
-           Int_t sumCharge = 0;
-           for (Int_t icharge = 0; icharge < 10; icharge++) {
-               sumCharge = sumCharge+mdig->TrackCharge(icharge);
+    Float_t adcmax = 1024; // default
+    if (chamber<11) adcmax = 4096;
+
+// check if trigger is using new or old segmentation
+    Bool_t old = true;
+    AliMUONSegmentation* segmentation = pMUON->GetSegmentation();
+    if ( segmentation->GetMpSegmentation(1100, cathode-1) ) old = false;
+
+    if ( old  && chamber > 10) {
+       if (chamber > 10) printf(">>> old segmentation for trigger \n");
+       else printf(">>> old segmentation for tracking \n");
+
+       segmentation2
+           = pMUON->GetSegmentation()->GetModuleSegmentation(chamber-1, cathode-1);
+       for (Int_t digit = 0; digit < ndigits; digit++) {
+           mdig    = (AliMUONDigit*)muonDigits->UncheckedAt(digit);
+           if (mdig->Cathode() != cathode-1) continue;
+           
+           //
+           // First get all needed parameters
+           //
+           Int_t charge = mdig->Signal();
+           Int_t index  = Int_t(TMath::Log(charge)/(TMath::Log(adcmax)/22));
+           Int_t color  = 261+index;
+           Int_t colorTrigger = 2;   
+           if (color > 282) color = 282;
+           
+           if (chamber > 10) { // trigger chamber 
+               
+               Int_t sumCharge = 0;
+               for (Int_t icharge = 0; icharge < 10; icharge++) {
+                   sumCharge = sumCharge+mdig->TrackCharge(icharge);
+               }
+               Int_t testCharge = sumCharge-(Int_t(sumCharge/10))*10;
+               if(sumCharge <= 10 || testCharge > 0) {
+                   colorTrigger = color; 
+               } else {
+                   colorTrigger = 5; 
+               }
            }
-           Int_t testCharge = sumCharge-(Int_t(sumCharge/10))*10;
-           if(sumCharge <= 10 || testCharge > 0) {
-               colorTrigger = color; 
-           } else {
-               colorTrigger = 5; 
+           
+           // get the center of the pad - add on x and y half of pad size
+           Float_t xpad, ypad, zpad;
+           Int_t isec;
+           Float_t dpx, dpy;
+           
+           Int_t detElemId = mdig->DetElemId();
+           segmentation2->GetPadC(detElemId, mdig->PadX(), mdig->PadY(), xpad, ypad, zpad);
+           isec = segmentation2->Sector(detElemId, mdig->PadX(), mdig->PadY());
+           dpx = segmentation2->Dpx(detElemId, isec)/2;
+           dpy = segmentation2->Dpy(detElemId, isec)/2;
+           
+           // Then set the objects
+           points = new AliMUONPoints(npoints);
+           fPoints->AddAt(points,digit);
+           if (chamber > 10) {
+               points->SetMarkerColor(colorTrigger);
+           } else {  
+               points->SetMarkerColor(color);
            }
-       }
-
-       // get the center of the pad - add on x and y half of pad size
-       Float_t xpad, ypad, zpad;
-       segmentation->GetPadC(mdig->PadX(), mdig->PadY(), xpad, ypad, zpad);
+           points->SetMarkerStyle(21);
+           points->SetMarkerSize(0.5);
+           points->SetParticle(-1);
+           points->SetHitIndex(-1);
+           points->SetTrackIndex(-1);
+           points->SetDigitIndex(digit);
+           points->SetPoint(0,xpad,ypad,zpos);
+           
+           Int_t lineColor = (zpad-zpos > 0) ? 2:3;
+           marker=new TMarker3DBox(xpad,ypad,zpos,dpx,dpy,0,0,0);
+           
+           
+           marker->SetLineColor(lineColor);
+           marker->SetFillStyle(1001);
+           marker->SetFillColor(color);
+           marker->SetRefObject((TObject*)points);
+           points->Set3DMarker(0, marker);
+       } // end loop on digits     
        
-        Int_t   isec = segmentation->Sector(mdig->PadX(), mdig->PadY());
-        Float_t  dpx = segmentation->Dpx(isec)/2;
-        Float_t  dpy = segmentation->Dpy(isec)/2;
-//
-//     segmentation->Dump();
+    } else {   
+       if (chamber > 10) printf(">>> new segmentation for trigger \n");
+       else printf(">>> new segmentation for tracking \n");
        
-       //
-       // Then set the objects
-       //
-        points = new AliMUONPoints(npoints);
-       fPoints->AddAt(points,digit);
-       if (chamber > 10) {
-           points->SetMarkerColor(colorTrigger);
-       } else {  
-           points->SetMarkerColor(color);
-       }
-        points->SetMarkerStyle(21);
-        points->SetMarkerSize(0.5);
-        points->SetParticle(-1);
-        points->SetHitIndex(-1);
-        points->SetTrackIndex(-1);
-        points->SetDigitIndex(digit);
-        points->SetPoint(0,xpad,ypad,zpos);    
-
-       Int_t lineColor = (zpad-zpos > 0) ? 2:3;
-       marker=new TMarker3DBox(xpad,ypad,zpos,dpx,dpy,0,0,0);
-
+       const AliMUONGeometryTransformer* kGeomTransformer 
+           = pMUON->GetGeometryTransformer();
+       
+       //loop over all digits and store their position
+       for (Int_t digit = 0; digit < ndigits; digit++) {
+           mdig    = (AliMUONDigit*)muonDigits->UncheckedAt(digit);
+           if (mdig->Cathode() != cathode-1) continue;
            
-       marker->SetLineColor(lineColor);
-       marker->SetFillStyle(1001);
-       marker->SetFillColor(color);
-       marker->SetRefObject((TObject*)points);
-       points->Set3DMarker(0, marker);
-    }
+           // get all needed parameters
+           Int_t ix=mdig->PadX();
+           Int_t iy=mdig->PadY();
+           Int_t detElemId=mdig->DetElemId();      
+           Int_t charge = mdig->Signal();
+           Int_t index  = Int_t(TMath::Log(charge)/(TMath::Log(adcmax)/22));
+           Int_t color  = 261+index;
+           Int_t colorTrigger = 2;   
+           if (color > 282) color = 282;
+           
+           const AliMpVSegmentation* seg = 
+               pMUON->GetSegmentation()->GetMpSegmentation(detElemId,cathode-1);
+           
+           AliMpStationType station = AliMpDEManager::GetStationType(detElemId);
+           
+           Int_t intOffset = station == kStation345 ? 1 : 0;   
+           
+           AliMpPad pad = 
+               seg->PadByIndices(AliMpIntPair(ix-intOffset,iy-intOffset),kTRUE);
+           
+           if (chamber > 10) { // trigger chamber
+               Int_t sumCharge = 0;
+               for (Int_t icharge = 0; icharge < 10; icharge++) {
+                   sumCharge = sumCharge+mdig->TrackCharge(icharge);
+               }
+               Int_t testCharge = sumCharge-(Int_t(sumCharge/10))*10;
+               if(sumCharge <= 10 || testCharge > 0) {
+                   colorTrigger = color; 
+               } else {
+                   colorTrigger = 5; 
+               }
+           }
+           
+           // get the pad position and dimensions
+           Float_t xlocal1 = pad.Position().X();
+           Float_t ylocal1 = pad.Position().Y();
+           Float_t xlocal2 = pad.Dimensions().X();
+           Float_t ylocal2 = pad.Dimensions().Y();
+           
+           Float_t xg1, xg2, yg1, yg2, zg1;
+           
+           kGeomTransformer->Local2Global(detElemId, xlocal1, ylocal1, 0, xg1, yg1, zg1);
+           // (no transformation for pad dimensions)
+           xg2 = xlocal2;
+           yg2 = ylocal2;
+           
+           // Then set the objects
+           points = new AliMUONPoints(npoints);
+           fPoints->AddAt(points,digit);
+           if (chamber > 10) {
+               points->SetMarkerColor(colorTrigger);
+           } else {  
+               points->SetMarkerColor(color);
+           }
+           points->SetMarkerStyle(21);
+           points->SetMarkerSize(0.5);
+           points->SetParticle(-1);
+           points->SetHitIndex(-1);
+           points->SetTrackIndex(-1);
+           points->SetDigitIndex(digit);
+           points->SetPoint(0,xg1,yg1,zpos);
+           
+           Int_t lineColor = (zg1-zpos > 0) ? 2:3;
+           marker=new TMarker3DBox(xg1,yg1,zpos,xg2,yg2,0,0,0);
+           
+           marker->SetLineColor(lineColor);
+           marker->SetFillStyle(1001);
+           marker->SetFillColor(color);
+           marker->SetRefObject((TObject*)points);
+           points->Set3DMarker(0, marker);
+           
+       } // end loop on digits
+    } // end of new segmentation    
 }
 //___________________________________________
 void AliMUONDisplay::LoadCoG(Int_t chamber, Int_t /*cathode*/)
@@ -886,26 +1288,22 @@ void AliMUONDisplay::LoadCoG(Int_t chamber, Int_t /*cathode*/)
     
     ResetRpoints();
     
-    AliMUON *pMUON  = (AliMUON*)gAlice->GetModule("MUON");
-    AliMUONChamber*  iChamber;
-    
-    TClonesArray *muonRawClusters  = pMUON->GetMUONData()->RawClusters(chamber-1);
-    if (muonRawClusters == 0) return;
+    GetMUONData()->SetTreeAddress("RC");
+    TClonesArray *muonRawClusters  = GetMUONData()->RawClusters(chamber-1);
 
-//     pMUON->ResetRawClusters();
+    if (muonRawClusters == 0) return;
 
     Int_t nent = 0;
-    if (gAlice->TreeR()) {
-       nent=(Int_t)gAlice->TreeR()->GetEntries();
-       gAlice->TreeR()->GetEvent(0);
+    if (GetMUONData()->TreeR()) {
+       nent=(Int_t) GetMUONData()->TreeR()->GetEntries();
+       GetMUONData()->TreeR()->GetEvent(0);
     }
     
     Int_t nrawcl = muonRawClusters->GetEntriesFast();
     if (nrawcl == 0) return;
     if (fRpoints == 0) fRpoints = new TObjArray(nrawcl);
     
-    iChamber = &(pMUON->Chamber(chamber-1));
-    Float_t zpos=iChamber->Z();  
+    Float_t zpos = AliMUONConstants::DefaultChamberZ(chamber-1);  
     AliMUONRawCluster  *mRaw;
     AliMUONPoints *points = 0;
     //
@@ -913,7 +1311,6 @@ void AliMUONDisplay::LoadCoG(Int_t chamber, Int_t /*cathode*/)
     points = new AliMUONPoints(nrawcl);
     for (Int_t iraw=0;iraw<nrawcl;iraw++) {
        mRaw   = (AliMUONRawCluster*)muonRawClusters->UncheckedAt(iraw);
-       fRpoints->AddAt(points,iraw);
         points->SetMarkerColor(51);
         points->SetMarkerStyle(2);
         points->SetMarkerSize(1.);
@@ -921,14 +1318,108 @@ void AliMUONDisplay::LoadCoG(Int_t chamber, Int_t /*cathode*/)
         points->SetHitIndex(-1);
         points->SetTrackIndex(-1);
         points->SetDigitIndex(-1);
-        points->SetPoint(iraw,mRaw->fX[0],mRaw->fY[0],zpos);
+        points->SetPoint(iraw,mRaw->GetX(0),mRaw->GetY(0),zpos);
+       fRpoints->AddAt(points,iraw);
+       //      printf("%f and %f and %f\n",mRaw->GetX(0),mRaw->GetY(0),mRaw->GetZ(0));
     }
 }
+
+//___________________________________________
+void AliMUONDisplay::LoadTracks()
+{
+// Load tracks
+  AliMUONTrack* recTrack = 0;
+  AliMUONTrackParam* trackParam = 0;
+  TClonesArray *  trackParamAtHit = 0;   
+
+  ResetRpoints();
+
+  GetMUONData()->SetTreeAddress("RT");
+  TClonesArray* recTracksArray = GetMUONData()->RecTracks();
+  if (recTracksArray == NULL) return;
+  GetMUONData()->GetRecTracks();
+
+  Int_t nRecTracks = 0;
+  if (recTracksArray)
+    nRecTracks = (Int_t) recTracksArray->GetEntriesFast();
+
+
+  if (fRpoints == 0) fRpoints = new TObjArray(nRecTracks);
+
+  for (Int_t iRecTracks = 0; iRecTracks <  nRecTracks;  iRecTracks++) {
+    // reading info from tracks
+    recTrack = (AliMUONTrack*) recTracksArray->At(iRecTracks);
+
+    Int_t nTrackHits = recTrack->GetNTrackHits();
+
+    if (nTrackHits == 0) continue;
+
+    Int_t iPoint = 0;
+    TPolyLine3D *points = new TPolyLine3D(nTrackHits+1); 
+    points->SetLineColor(6);
+    points->SetLineWidth(1);
+    fRpoints->AddAt(points,iRecTracks);
+
+    Float_t xRec=0;
+    Float_t yRec=0;
+    Float_t zRec=0;
+
+    trackParam = recTrack->GetTrackParamAtVertex(); 
+    xRec  = trackParam->GetNonBendingCoor();
+    yRec  = trackParam->GetBendingCoor();
+    zRec  = trackParam->GetZ();
+    points->SetPoint(iPoint,xRec,yRec,zRec);
+    iPoint++;  
+
+    for (Int_t iHit = 0; iHit < nTrackHits; iHit++){
+      trackParamAtHit = recTrack->GetTrackParamAtHit();
+      trackParam = (AliMUONTrackParam*) trackParamAtHit->At(iHit); 
+      xRec  = trackParam->GetNonBendingCoor();
+      yRec  = trackParam->GetBendingCoor();
+      zRec  = trackParam->GetZ();
+      points->SetPoint(iPoint,xRec,yRec,zRec);
+      iPoint++;        
+    } // end loop rec. hits
+    PrintTrack(iRecTracks,recTrack);
+  } // end loop tracks
+  
+
+}
+
+void AliMUONDisplay::PrintTrack(Int_t iRecTracks, AliMUONTrack *recTrack)
+{
+  AliMUONTrackParam *trackParam;
+  Float_t vertex[3], momentum[3];
+  Float_t pYZ, bendingSlope, nonBendingSlope, chi2dof;
+  Int_t charge;
+
+  trackParam = recTrack->GetTrackParamAtVertex();
+  vertex[0] = trackParam->GetNonBendingCoor();
+  vertex[1] = trackParam->GetBendingCoor();
+  vertex[2] = trackParam->GetZ();
+  pYZ =  1./TMath::Abs(trackParam->GetInverseBendingMomentum());
+  bendingSlope = trackParam->GetBendingSlope();
+  nonBendingSlope = trackParam->GetNonBendingSlope();
+  momentum[2] = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope);
+  momentum[0] = momentum[2] * nonBendingSlope;
+  momentum[1] = momentum[2] * bendingSlope;
+  charge = Int_t(TMath::Sign(1.,trackParam->GetInverseBendingMomentum()));
+  chi2dof = recTrack->GetFitFMin()/(2.0 * recTrack->GetNTrackHits() - 5.);
+  
+  printf("===================================================\n");
+  printf(" Reconstructed track # %d \n",iRecTracks);
+  printf(" charge: %d \n",charge);
+  printf(" vertex x,y,z (cm): %f %f %f \n",vertex[0],vertex[1],vertex[2]); 
+  printf(" momentum Px,Py,Pz (GeV/c): %f %f %f \n",momentum[0],momentum[1],momentum[2]);
+  printf(" track chi2/dof: %f \n",chi2dof); 
+  
+}
+
 //___________________________________________
 void AliMUONDisplay::LoadHits(Int_t chamber)
 {
-// Read hits info and store x,y,z info in arrays fPhits
-// Loop on all detectors
+  // Read hits info and store x,y,z info in arrays fPhits
+  // Loop on all detectors
 
     if (chamber > 14) return;
     Int_t track;
@@ -937,27 +1428,25 @@ void AliMUONDisplay::LoadHits(Int_t chamber)
  
     ResetPhits();
     
-    AliMUON *pMUON  = (AliMUON*)gAlice->GetModule("MUON");
-    AliMUONChamber*  iChamber;
-
-    iChamber = &(pMUON->Chamber(chamber-1));
-    Float_t zpos=iChamber->Z();
-
-    Int_t ntracks = (Int_t)pMUON->TreeH()->GetEntries(); //skowron
-    Int_t nthits  = 0;
-    for (track = 0; track < ntracks; track++) {
-       gAlice->ResetHits();
-       pMUON->TreeH()->GetEvent(track);//skowron
-       TClonesArray *muonHits  = pMUON->Hits();
+    Float_t zpos=AliMUONConstants::DefaultChamberZ(chamber-1);
+
+    if (GetMUONData()->TreeH()) {
+      GetMUONData()->SetTreeAddress("H");
+      Int_t ntracks = (Int_t)GetMUONData()->TreeH()->GetEntries(); //skowron
+      Int_t nthits  = 0;
+      for (track = 0; track < ntracks; track++) {
+       GetMUONData()->ResetHits();
+       GetMUONData()->GetTrack(track);//skowron
+       TClonesArray *muonHits  = GetMUONData()->Hits();
        if (muonHits == 0) return;
        nthits += muonHits->GetEntriesFast();
-    } 
-    if (fPhits == 0) fPhits = new TObjArray(nthits);
-    Int_t nhold=0;
-    for (track=0; track<ntracks;track++) {
-       gAlice->ResetHits();
-       pMUON->TreeH()->GetEvent(track);//skowron
-       TClonesArray *muonHits  = pMUON->Hits();
+      
+      if (fPhits == 0) fPhits = new TObjArray(nthits);
+      Int_t nhold=0;
+      for (track=0; track<ntracks;track++) {
+       GetMUONData()->ResetHits();
+       GetMUONData()->GetTrack(track);//skowron
+       TClonesArray *muonHits  = GetMUONData()->Hits();
        if (muonHits == 0) return;
        Int_t nhits = muonHits->GetEntriesFast();
        if (nhits == 0) continue;
@@ -965,24 +1454,26 @@ void AliMUONDisplay::LoadHits(Int_t chamber)
        AliMUONPoints *points = 0;
        Int_t npoints=1;
        for (Int_t hit=0;hit<nhits;hit++) {
-            mHit = (AliMUONHit*)muonHits->UncheckedAt(hit);
-            Int_t nch  = mHit->Chamber();              // chamber number
-            if (nch != chamber) continue;
-           //
-           // Retrieve info and set the objects
-           //
-           points = new AliMUONPoints(npoints);
-           fPhits->AddAt(points,nhold+hit);
-            points->SetMarkerColor(kRed);
-            points->SetMarkerStyle(5);
-            points->SetMarkerSize(1.);
-            points->SetParticle(mHit->Track());
-            points->SetHitIndex(hit);
-            points->SetTrackIndex(track);
-            points->SetDigitIndex(-1);
-           points->SetPoint(0,mHit->X(),mHit->Y(),zpos);
+         mHit = (AliMUONHit*)muonHits->UncheckedAt(hit);
+         Int_t nch  = mHit->Chamber();              // chamber number
+         if (nch != chamber) continue;
+         //
+         // Retrieve info and set the objects
+         //
+         points = new AliMUONPoints(npoints);
+         fPhits->AddAt(points,nhold+hit);
+         points->SetMarkerColor(kRed);
+         points->SetMarkerStyle(5);
+         points->SetMarkerSize(1.);
+         points->SetParticle(mHit->Track());
+         points->SetHitIndex(hit);
+         points->SetTrackIndex(track);
+         points->SetDigitIndex(-1);
+         points->SetPoint(0,mHit->X(),mHit->Y(),zpos);
+         //        printf("%f and %f and %f\n",mHit->X(),mHit->Y(),mHit->Z());
        }
        nhold+=nhits;
+      }
     }
 }
 
@@ -1026,7 +1517,7 @@ void AliMUONDisplay::NextChamber(Int_t delta)
     if (!fPad) return;
     fPad->Clear();
     LoadDigits(fChamber, fCathode);
-    Draw();
+    DrawChamber();
 }
 
 //_____________________________________________________________________________
@@ -1041,7 +1532,7 @@ void AliMUONDisplay::NextCathode()
        LoadDigits(fChamber, 1);
     }
     fNextCathode = kTRUE; // to keep the same zoom
-    Draw();
+    DrawChamber();
     fNextCathode = kFALSE;
     TPad *pad = (TPad*)gPad->GetPadSave();
     pad->Range(fZoomX0[fZooms], fZoomY0[fZooms],
@@ -1054,12 +1545,59 @@ void AliMUONDisplay::NextCathode()
 //_____________________________________________________________________________
 void AliMUONDisplay::Trigger()
 {
-  // returns Trigger Decision for current event
-  AliMUONTriggerDecision* decision= new AliMUONTriggerDecision(1);
-  decision->Trigger(); 
-}
-
 
+  AliMUONGlobalTrigger* globalTrig;
+
+  GetMUONData()->SetTreeAddress("GLT");
+  GetMUONData()->GetTriggerD();
+
+  globalTrig =  (AliMUONGlobalTrigger*)GetMUONData()->GlobalTrigger()->UncheckedAt(0);
+  if (globalTrig == 0) return;
+
+  printf("===================================================\n");
+  printf(" Global Trigger output       Low pt  High pt   All\n");
+
+  printf(" number of Single Plus      :\t");
+  printf("%i\t",globalTrig->SinglePlusLpt());
+  printf("%i\t",globalTrig->SinglePlusHpt());
+  printf("%i\t",globalTrig->SinglePlusApt());
+  printf("\n");
+
+  printf(" number of Single Minus     :\t");
+  printf("%i\t",globalTrig->SingleMinusLpt());
+  printf("%i\t",globalTrig->SingleMinusHpt());
+  printf("%i\t",globalTrig->SingleMinusApt());
+  printf("\n");
+
+  printf(" number of Single Undefined :\t"); 
+  printf("%i\t",globalTrig->SingleUndefLpt());
+  printf("%i\t",globalTrig->SingleUndefHpt());
+  printf("%i\t",globalTrig->SingleUndefApt());
+  printf("\n");
+
+  printf(" number of UnlikeSign pair  :\t"); 
+  printf("%i\t",globalTrig->PairUnlikeLpt());
+  printf("%i\t",globalTrig->PairUnlikeHpt());
+  printf("%i\t",globalTrig->PairUnlikeApt());
+  printf("\n");
+
+  printf(" number of LikeSign pair    :\t");  
+  printf("%i\t",globalTrig->PairLikeLpt());
+  printf("%i\t",globalTrig->PairLikeHpt());
+  printf("%i\t",globalTrig->PairLikeApt());
+  printf("\n");
+  printf("===================================================\n");
+  printf("\n");
+  
+
+ //  // returns Trigger Decision for current event
+//   AliMUONTriggerDecision* decision= new AliMUONTriggerDecision(GetLoader(),1);
+
+//   //  AliMUONTriggerDecision* decision= new AliMUONTriggerDecision(1);
+//   AliMUONData* muonData = decision->GetMUONData();
+//   muonData->SetTreeAddress("D");
+//   decision->Trigger(); 
+}
 //_____________________________________________________________________________
 void AliMUONDisplay::SetChamberAndCathode(Int_t chamber, Int_t cathode)
 {
@@ -1070,7 +1608,7 @@ void AliMUONDisplay::SetChamberAndCathode(Int_t chamber, Int_t cathode)
    if (!fPad) return;
    fPad->Clear();
    LoadDigits(chamber,cathode);
-   Draw();
+   DrawChamber();
 }
 
 void AliMUONDisplay::SetEvent(Int_t newevent)
@@ -1117,18 +1655,23 @@ void AliMUONDisplay::SetView(Float_t theta, Float_t phi, Float_t psi)
 //_____________________________________________________________________________
 void AliMUONDisplay::ShowNextEvent(Int_t delta)
 {
+  AliRunLoader * runLoader;
+  if (fLoader)
+    runLoader = fLoader->GetRunLoader();
+  else
+    runLoader = 0x0;
+    
 //  Display (current event_number + delta)
 //    delta =  1  shown next event
 //    delta = -1 show previous event
     if (delta) {
-       gAlice->Clear();
-       Int_t currentEvent = gAlice->GetHeader()->GetEvent();
-       Int_t newEvent     = currentEvent + delta;
-       gAlice->GetEvent(newEvent);
-       fEvent=newEvent;
-       if (!gAlice->TreeD()) return; 
+      //runLoader->CleanDetectors();
+      //runLoader->CleanKinematics();
+      Int_t currentEvent = runLoader->GetEventNumber();
+      Int_t newEvent     = currentEvent + delta;
+      runLoader->GetEvent(newEvent);
+      fEvent=newEvent;
     }
-    
     LoadDigits(fChamber, fCathode);
     fPad->cd(); 
     Draw();
@@ -1176,16 +1719,21 @@ void AliMUONDisplay::ResetRpoints()
   // Reset array of points
   //
     if (fRpoints) {
-       fRpoints->Delete();
-       delete fRpoints;
+       fRpoints->Clear();
+       //      delete fRpoints;
        fRpoints = 0;
     }
 }
 
-AliMUONDisplay & AliMUONDisplay::operator = (const AliMUONDisplay &)
+AliMUONDisplay & AliMUONDisplay::operator = (const AliMUONDisplay & rhs)
 {
-// Dummy assignment operator
-    return *this;
+// Protected assignement operator
+
+  if (this == &rhs) return *this;
+
+  AliFatal("Not implemented.");
+    
+  return *this;  
 }