]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONSegmentationV01.cxx
Some B mesons added
[u/mrichter/AliRoot.git] / MUON / AliMUONSegmentationV01.cxx
index 4df8c6d4129f05cbdf405b73a0edbcdee6f81559..602afbfcb2ed46a6b6aa7b4ed293fd5367b2bf73 100644 (file)
 
 /*
 $Log$
+Revision 1.16  2001/01/30 09:23:14  hristov
+Streamers removed (R.Brun)
+
+Revision 1.15  2001/01/26 21:25:48  morsch
+Empty default constructors and.
+
+Revision 1.14  2000/12/21 22:12:41  morsch
+Clean-up of coding rule violations,
+
+Revision 1.13  2000/12/07 10:41:51  hristov
+fCorr replaced by fCorrA
+
+Revision 1.12  2000/12/06 11:55:41  morsch
+Introduce  SetOffsetY(Float_t off) method as simplified simulation of pad staggering.
+fOffset is the staggering offset in y.
+
+Revision 1.11  2000/11/06 09:20:43  morsch
+AliMUON delegates part of BuildGeometry() to AliMUONSegmentation using the
+Draw() method. This avoids code and parameter replication.
+
+Revision 1.10  2000/10/18 11:42:06  morsch
+- AliMUONRawCluster contains z-position.
+- Some clean-up of useless print statements during initialisations.
+
+Revision 1.9  2000/10/18 08:41:32  morsch
+Make NextPad() and MorePads() to iterate until the end.
+
+Revision 1.8  2000/10/03 21:48:07  morsch
+Adopt to const declaration of some of the methods in AliSegmentation.
+
+Revision 1.7  2000/10/02 21:28:09  fca
+Removal of useless dependecies via forward declarations
+
+Revision 1.6  2000/10/02 16:58:29  egangler
+Cleaning of the code :
+-> coding conventions
+-> void Streamers
+-> some useless includes removed or replaced by "class" statement
+
+Revision 1.5  2000/07/13 16:19:44  fca
+Mainly coding conventions + some small bug fixes
+
+Revision 1.4  2000/07/03 11:54:57  morsch
+AliMUONSegmentation and AliMUONHitMap have been replaced by AliSegmentation and AliHitMap in STEER
+The methods GetPadIxy and GetPadXxy of AliMUONSegmentation have changed name to GetPadI and GetPadC.
+
+Revision 1.3  2000/06/29 12:34:09  morsch
+AliMUONSegmentation class has been made independent of AliMUONChamber. This makes
+it usable with any other geometry class. The link to the object to which it belongs is
+established via an index. This assumes that there exists a global geometry manager
+from which the pointer to the parent object can be obtained (in our case gAlice).
+
+Revision 1.2  2000/06/15 07:58:48  morsch
+Code from MUON-dev joined
+
 Revision 1.1.2.1  2000/06/09 21:37:30  morsch
 AliMUONSegmentationV01 code  from  AliMUONSegResV01.cxx
 
@@ -26,12 +81,18 @@ AliMUONSegmentationV01 code  from  AliMUONSegResV01.cxx
 /////////////////////////////////////////////////////
 
 #include <TBox.h> 
+#include <TTUBE.h>
+#include <TBRIK.h>
+#include <TNode.h>  
+#include <TGeometry.h>  
 #include <TF1.h> 
 #include <TObjArray.h>
 #include <iostream.h>
 
 #include "AliMUONSegmentationV01.h"
 #include "AliMUON.h"
+#include "AliMUONChamber.h"
+#include "AliRun.h"
 
 
 
@@ -42,30 +103,58 @@ AliMUONSegmentationV01::AliMUONSegmentationV01(const AliMUONSegmentationV01& seg
 {
 // Dummy copy constructor
 }
+
 AliMUONSegmentationV01::AliMUONSegmentationV01() 
 {
 // Default constructor
-    fNsec=4;
-    fRSec.Set(fNsec);    
-    fNDiv.Set(fNsec);      
-    fDpxD.Set(fNsec);      
-    fRSec[0]=fRSec[1]=fRSec[2]=fRSec[3]=0;     
-    fNDiv[0]=fNDiv[1]=fNDiv[2]=fNDiv[3]=0;     
-    fDpxD[0]=fDpxD[1]=fDpxD[2]=fDpxD[3]=0;     
-    fCorr = new TObjArray(3);
-    (*fCorr)[0]=0;
-    (*fCorr)[1]=0;
-    (*fCorr)[2]=0;
+    fRSec = 0;
+    fNDiv = 0;      
+    fDpxD = 0;
+    fCorrA = 0;
+}
+
+AliMUONSegmentationV01::AliMUONSegmentationV01(Int_t nsec) 
+{
+//  Non default constructor
+
+    fNsec = nsec;
+    fRSec = new TArrayF(fNsec);
+    fNDiv = new TArrayI(fNsec);      
+    fDpxD = new TArrayF(fNsec);      
+
+
+    (*fRSec)[0]=(*fRSec)[1]=(*fRSec)[2]=(*fRSec)[3]=0;     
+    (*fNDiv)[0]=(*fNDiv)[1]=(*fNDiv)[2]=(*fNDiv)[3]=0;     
+    (*fDpxD)[0]=(*fDpxD)[1]=(*fDpxD)[2]=(*fDpxD)[3]=0;     
+    fCorrA = new TObjArray(3);
+    (*fCorrA)[0]=0;
+    (*fCorrA)[1]=0;
+    (*fCorrA)[2]=0;
+    fOffsetY=0;
 } 
 
-Float_t AliMUONSegmentationV01::Dpx(Int_t isec)
+AliMUONSegmentationV01::~AliMUONSegmentationV01() 
+{
+// Destructor
+    if (fRSec) delete fRSec;
+    if (fNDiv) delete fNDiv;
+    if (fDpxD) delete fDpxD;
+    if (fCorrA) {
+       fCorrA->Delete();
+       delete fCorrA;
+    }
+} 
+
+
+Float_t AliMUONSegmentationV01::Dpx(Int_t isec) const
 {
 //
 // Returns x-pad size for given sector isec
-   return fDpxD[isec];
+   Float_t dpx = (*fDpxD)[isec];
+   return dpx;
 }
 
-Float_t AliMUONSegmentationV01::Dpy(Int_t isec)
+Float_t AliMUONSegmentationV01::Dpy(Int_t isec) const
 {
 //
 // Returns y-pad size for given sector isec
@@ -77,9 +166,7 @@ void   AliMUONSegmentationV01::SetSegRadii(Float_t  r[4])
 //
 // Set the radii of the segmentation zones 
     for (Int_t i=0; i<4; i++) {
-       fRSec[i]=r[i];
-       printf("\n R %d %f \n",i,fRSec[i]);
-       
+       (*fRSec)[i]=r[i];
     }
 }
 
@@ -92,14 +179,13 @@ void AliMUONSegmentationV01::SetPadDivision(Int_t ndiv[4])
 // fDpx
 // 
     for (Int_t i=0; i<4; i++) {
-       fNDiv[i]=ndiv[i];
-       printf("\n Ndiv %d %d \n",i,fNDiv[i]);
+       (*fNDiv)[i]=ndiv[i];
     }
     ndiv[0]=ndiv[1];
 }
 
 
-void AliMUONSegmentationV01::Init(AliMUONChamber* Chamber)
+void AliMUONSegmentationV01::Init(Int_t chamber)
 {
 //
 //  Fill the arrays fCx (x-contour) and fNpxS (ix-contour) for each sector
@@ -108,14 +194,15 @@ void AliMUONSegmentationV01::Init(AliMUONChamber* Chamber)
 //  This version approximates concentric segmentation zones
 //
     Int_t isec;
-    printf("\n Initialise segmentation v01 -- test !!!!!!!!!!!!!! \n");
-    fNpy=Int_t(fRSec[fNsec-1]/fDpy)+1;
+    printf("\n Initialise Segmentation V01\n");
+
 
-    fDpxD[fNsec-1]=fDpx;
+    fNpy=Int_t((*fRSec)[fNsec-1]/fDpy)+1;
+
+    (*fDpxD)[fNsec-1]=fDpx;
     if (fNsec > 1) {
        for (Int_t i=fNsec-2; i>=0; i--){
-           fDpxD[i]=fDpxD[fNsec-1]/fNDiv[i];
-           printf("\n test ---dx %d %f \n",i,fDpxD[i]);
+           (*fDpxD)[i]=(*fDpxD)[fNsec-1]/(*fNDiv)[i];
        }
     }
 //
@@ -131,33 +218,38 @@ void AliMUONSegmentationV01::Init(AliMUONChamber* Chamber)
        for (Int_t iy=1; iy<=fNpy; iy++) {
 //
            Float_t x=iy*fDpy-fDpy/2;
-           if (x > fRSec[isec]) {
+           if (x > (*fRSec)[isec]) {
                fNpxS[isec][iy]=0;
                fCx[isec][iy]=0;
            } else {
-               ry=TMath::Sqrt(fRSec[isec]*fRSec[isec]-x*x);
+               ry=TMath::Sqrt((*fRSec)[isec]*(*fRSec)[isec]-x*x);
                if (isec > 1) {
-                   dnx= Int_t((ry-fCx[isec-1][iy])/fDpxD[isec]);
+                   dnx= Int_t((ry-fCx[isec-1][iy])/(*fDpxD)[isec]);
                    if (isec < fNsec-1) {
                        if (TMath::Odd((Long_t)dnx)) dnx++;             
                    }
                     fNpxS[isec][iy]=fNpxS[isec-1][iy]+dnx;
-                   fCx[isec][iy]=fCx[isec-1][iy]+dnx*fDpxD[isec];
+                   fCx[isec][iy]=fCx[isec-1][iy]+dnx*(*fDpxD)[isec];
                } else if (isec == 1) {
-                   dnx= Int_t((ry-fCx[isec-1][iy])/fDpxD[isec]);
+                   dnx= Int_t((ry-fCx[isec-1][iy])/(*fDpxD)[isec]);
                    fNpxS[isec][iy]=fNpxS[isec-1][iy]+dnx;
                     add=4 - (fNpxS[isec][iy])%4;
                     if (add < 4) fNpxS[isec][iy]+=add; 
                    dnx=fNpxS[isec][iy]-fNpxS[isec-1][iy];
-                   fCx[isec][iy]=fCx[isec-1][iy]+dnx*fDpxD[isec];
+                   fCx[isec][iy]=fCx[isec-1][iy]+dnx*(*fDpxD)[isec];
                } else {
-                   dnx=Int_t(ry/fDpxD[isec]);
+                   dnx=Int_t(ry/(*fDpxD)[isec]);
                     fNpxS[isec][iy]=dnx;
-                   fCx[isec][iy]=dnx*fDpxD[isec];
+                   fCx[isec][iy]=dnx*(*fDpxD)[isec];
                }
            }
        } // y-pad loop
     } // sector loop
+// reference to chamber
+    AliMUON *pMUON  = (AliMUON *) gAlice->GetModule("MUON");
+    fChamber=&(pMUON->Chamber(chamber));
+    fZ = fChamber->Z();
+    fId=chamber;
 }
 
 Int_t AliMUONSegmentationV01::Sector(Int_t ix, Int_t iy)
@@ -177,11 +269,15 @@ Int_t AliMUONSegmentationV01::Sector(Int_t ix, Int_t iy)
 }
 
 void AliMUONSegmentationV01::
-GetPadIxy(Float_t x, Float_t y, Int_t &ix, Int_t &iy)
+GetPadI(Float_t x, Float_t y, Int_t &ix, Int_t &iy)
 {
 //  Returns pad coordinates (ix,iy) for given real coordinates (x,y)
 //
-    iy = (y>0)? Int_t(y/fDpy)+1 : Int_t(y/fDpy)-1;
+    iy = (y-fOffsetY >0)? 
+      Int_t((y-fOffsetY)/fDpy)+1 
+      : 
+      Int_t((y-fOffsetY)/fDpy)-1;
+  
     if (iy >  fNpy) iy= fNpy;
     if (iy < -fNpy) iy=-fNpy;
 //
@@ -196,10 +292,10 @@ GetPadIxy(Float_t x, Float_t y, Int_t &ix, Int_t &iy)
        }
     }
     if (isec>0) {
-       ix= Int_t((absx-fCx[isec-1][absiy])/fDpxD[isec])
+       ix= Int_t((absx-fCx[isec-1][absiy])/(*fDpxD)[isec])
            +fNpxS[isec-1][absiy]+1;
     } else if (isec == 0) {
-       ix= Int_t(absx/fDpxD[isec])+1;
+       ix= Int_t(absx/(*fDpxD)[isec])+1;
     } else {
        ix=fNpxS[fNsec-1][absiy]+1;     
     }
@@ -207,11 +303,14 @@ GetPadIxy(Float_t x, Float_t y, Int_t &ix, Int_t &iy)
 }
 
 void AliMUONSegmentationV01::
-GetPadCxy(Int_t ix, Int_t iy, Float_t &x, Float_t &y)
+GetPadC(Int_t ix, Int_t iy, Float_t &x, Float_t &y)
 {
 //  Returns real coordinates (x,y) for given pad coordinates (ix,iy)
 //
-    y = (iy>0) ? Float_t(iy*fDpy)-fDpy/2. : Float_t(iy*fDpy)+fDpy/2.;
+    y = (iy>0) ? 
+      Float_t(iy*fDpy)-fDpy/2.+fOffsetY 
+      : 
+      Float_t(iy*fDpy)+fDpy/2.-fOffsetY;
 //
 //  Find sector isec
     Int_t isec=AliMUONSegmentationV01::Sector(ix,iy);
@@ -219,8 +318,8 @@ GetPadCxy(Int_t ix, Int_t iy, Float_t &x, Float_t &y)
     Int_t absix=TMath::Abs(ix);
     Int_t absiy=TMath::Abs(iy);
     if (isec) {
-       x=fCx[isec-1][absiy]+(absix-fNpxS[isec-1][absiy])*fDpxD[isec];
-       x=(ix>0) ?  x-fDpxD[isec]/2 : -x+fDpxD[isec]/2;
+       x=fCx[isec-1][absiy]+(absix-fNpxS[isec-1][absiy])*(*fDpxD)[isec];
+       x=(ix>0) ?  x-(*fDpxD)[isec]/2 : -x+(*fDpxD)[isec]/2;
     } else {
        x=y=0;
     }
@@ -232,7 +331,7 @@ SetPad(Int_t ix, Int_t iy)
     //
     // Sets virtual pad coordinates, needed for evaluating pad response 
     // outside the tracking program 
-    GetPadCxy(ix,iy,fx,fy);
+    GetPadC(ix,iy,fX,fY);
     fSector=Sector(ix,iy);
 }
 
@@ -245,8 +344,8 @@ FirstPad(Float_t xhit, Float_t yhit, Float_t dx, Float_t dy)
     //
     // Find the wire position (center of charge distribution)
     Float_t x0a=GetAnod(xhit);
-    fxhit=x0a;
-    fyhit=yhit;
+    fXhit=x0a;
+    fYhit=yhit;
     
     //
     // and take fNsigma*sigma around this center
@@ -256,20 +355,21 @@ FirstPad(Float_t xhit, Float_t yhit, Float_t dx, Float_t dy)
     Float_t y02=yhit + dy;
     //
     // find the pads over which the charge distributes
-    GetPadIxy(x01,y01,fixmin,fiymin);
-    GetPadIxy(x02,y02,fixmax,fiymax);
-    fxmin=x01;
-    fxmax=x02;
-    fymin=y01;
-    fymax=y02;
+
+    GetPadI(x01,y01,fIxmin,fIymin);
+    GetPadI(x02,y02,fIxmax,fIymax);
+    fXmin=x01;
+    fXmax=x02;
+    fYmin=y01;
+    fYmax=y02;
     
     // 
     // Set current pad to lower left corner
-    if (fixmax < fixmin) fixmax=fixmin;
-    if (fiymax < fiymin) fiymax=fiymin;    
-    fix=fixmin;
-    fiy=fiymin;
-    GetPadCxy(fix,fiy,fx,fy);
+    if (fIxmax < fIxmin) fIxmax=fIxmin;
+    if (fIymax < fIymin) fIymax=fIymin;    
+    fIx=fIxmin;
+    fIy=fIymin;
+    GetPadC(fIx,fIy,fX,fY);
 }
 
 
@@ -284,37 +384,43 @@ void AliMUONSegmentationV01::NextPad()
     Int_t   iyc;
     
 //  step from left to right    
-    if (fx < fxmax && fx != 0) {
-       if (fix==-1) fix++;
-       fix++;
+
+    if (fX < fXmax && fX != 0) {
+       if (fIx==-1) fIx++;
+       fIx++;
 //  step up 
-    } else if (fiy != fiymax) {
-       if (fiy==-1) fiy++;
-       fiy++;
+    } else if (fIy != fIymax) {
+       if (fIy==-1) fIy++;
+       fIy++;
 //      get y-position of next row (yc), xc not used here      
-       GetPadCxy(fix,fiy,xc,yc);
-//      get x-pad coordiante for first pad in row (fix)
-       GetPadIxy(fxmin,yc,fix,iyc);
+       GetPadC(fIx,fIy,xc,yc);
+//      get x-pad coordiante for first pad in row (fIx)
+       GetPadI(fXmin,yc,fIx,iyc);
     } else {
-       printf("\n Error: Stepping outside integration region\n ");
+       fIx=-1;
+       fIy=-1;
     }
-    GetPadCxy(fix,fiy,fx,fy);
-    fSector=Sector(fix,fiy);
+    GetPadC(fIx,fIy,fX,fY);
+    fSector=Sector(fIx,fIy);
     if (MorePads() && 
        (fSector ==-1 || fSector==0)) 
        NextPad();
 }
 
 Int_t AliMUONSegmentationV01::MorePads()
+
+{
 // Stopping condition for the iterator over pads
 //
 // Are there more pads in the integration region
-{
-    if ((fx >= fxmax  && fiy >= fiymax) || fy==0) {
+    return  (fIx != -1  || fIy != -1);
+/*
+    if ((fX >= fXmax  && fIy >= fIymax) || fY==0) {
        return 0;
     } else {
        return 1;
     }
+*/
 }
 
 void AliMUONSegmentationV01::
@@ -322,9 +428,9 @@ IntegrationLimits(Float_t& x1,Float_t& x2,Float_t& y1, Float_t& y2)
 {
 //  Returns integration limits for current pad
 //
-    x1=fxhit-fx-Dpx(fSector)/2.;
+    x1=fXhit-fX-Dpx(fSector)/2.;
     x2=x1+Dpx(fSector);
-    y1=fyhit-fy-Dpy(fSector)/2.;
+    y1=fYhit-fY-Dpy(fSector)/2.;
     y2=y1+Dpy(fSector);    
 }
 
@@ -352,8 +458,8 @@ Neighbours(Int_t iX, Int_t iY, Int_t* Nlist, Int_t Xlist[10], Int_t Ylist[10])
     Ylist[i++]=iY;
 //
 //  step up 
-    AliMUONSegmentationV01::GetPadCxy(iX,iY,x,y);
-    AliMUONSegmentationV01::GetPadIxy(x+kEpsilon,y+fDpy,ixx,iyy);
+    AliMUONSegmentationV01::GetPadC(iX,iY,x,y);
+    AliMUONSegmentationV01::GetPadI(x+kEpsilon,y+fDpy,ixx,iyy);
     Xlist[i]=ixx;
     Ylist[i++]=iyy;
     isec1=AliMUONSegmentationV01::Sector(ixx,iyy);
@@ -390,8 +496,8 @@ Neighbours(Int_t iX, Int_t iY, Int_t* Nlist, Int_t Xlist[10], Int_t Ylist[10])
 
 //
 // step down 
-    AliMUONSegmentationV01::GetPadCxy(iX,iY,x,y);
-    AliMUONSegmentationV01::GetPadIxy(x+kEpsilon,y-fDpy,ixx,iyy);
+    AliMUONSegmentationV01::GetPadC(iX,iY,x,y);
+    AliMUONSegmentationV01::GetPadI(x+kEpsilon,y-fDpy,ixx,iyy);
     Xlist[i]=ixx;
     Ylist[i++]=iyy;
     isec1=AliMUONSegmentationV01::Sector(ixx,iyy);
@@ -430,24 +536,83 @@ Neighbours(Int_t iX, Int_t iY, Int_t* Nlist, Int_t Xlist[10], Int_t Ylist[10])
     *Nlist=i;
 }
 
-void AliMUONSegmentationV01::GiveTestPoints(Int_t &n, Float_t *x, Float_t *y)
+void AliMUONSegmentationV01::GiveTestPoints(Int_t &n, Float_t *x, Float_t *y) const
 {
 // Returns test point on the pad plane.
 // Used during determination of the segmoid correction of the COG-method
 
     n=3;
-    x[0]=(fRSec[0]+fRSec[1])/2/TMath::Sqrt(2.);
+    x[0]=((*fRSec)[0]+(*fRSec)[1])/2/TMath::Sqrt(2.);
     y[0]=x[0];
-    x[1]=(fRSec[1]+fRSec[2])/2/TMath::Sqrt(2.);
+    x[1]=((*fRSec)[1]+(*fRSec)[2])/2/TMath::Sqrt(2.);
     y[1]=x[1];
-    x[2]=(fRSec[2]+fRSec[3])/2/TMath::Sqrt(2.);
+    x[2]=((*fRSec)[2]+(*fRSec)[3])/2/TMath::Sqrt(2.);
     y[2]=x[2];
 }
 
-void AliMUONSegmentationV01::Draw()
+void AliMUONSegmentationV01::Draw(const char* opt) const
 {
 // Draws the segmentation zones
 //
+  if (!strcmp(opt,"eventdisplay")) { 
+    const int kColorMUON  = kBlue;
+
+    TRotMatrix* rot000 = new TRotMatrix("Rot000"," ", 90,  0, 90, 90, 0, 0);
+    TRotMatrix* rot090 = new TRotMatrix("Rot090"," ", 90, 90, 90,180, 0, 0);
+    TRotMatrix* rot180 = new TRotMatrix("Rot180"," ", 90,180, 90,270, 0, 0);
+    TRotMatrix* rot270 = new TRotMatrix("Rot270"," ", 90,270, 90,  0, 0, 0);
+
+    char nameChamber[9], nameSense[9], nameFrame[9], nameNode[9];
+    char nameSense1[9], nameSense2[9];    
+    TNode *node, *nodeF;
+    sprintf(nameChamber,"C_MUON%d",fId+1);
+    sprintf(nameSense,"S_MUON%d",fId+1);
+    sprintf(nameSense1,"S1_MUON%d",fId+1);
+    sprintf(nameSense2,"S2_MUON%d",fId+1);
+    sprintf(nameFrame,"F_MUON%d",fId+1);       
+
+    TNode* top=gAlice->GetGeometry()->GetNode("alice");
+
+    Float_t rmin = (*fRSec)[0]-3;
+    Float_t rmax = (*fRSec)[3]+3;
+    new TTUBE(nameChamber,"Mother","void",rmin,rmax,0.25,1.);
+    rmin = (*fRSec)[0];
+    rmax = (*fRSec)[3];
+    new TTUBE(nameSense,"Sens. region","void",rmin,rmax,0.25, 1.);
+    Float_t dx=(rmax-rmin)/2;
+    Float_t dy=3.;
+    Float_t dz=0.25;
+    TBRIK* frMUON = new TBRIK(nameFrame,"Frame","void",dx,dy,dz);
+    top->cd();
+    sprintf(nameNode,"MUON%d",100+fId+1);
+    node = new TNode(nameNode,"ChamberNode",nameChamber,0,0,fChamber->Z(),"");
+    node->SetLineColor(kColorMUON);
+    AliMUON *pMUON  = (AliMUON *) gAlice->GetModule("MUON");
+    (pMUON->Nodes())->Add(node);
+    node->cd();
+    sprintf(nameNode,"MUON%d",200+fId+1);
+    node = new TNode(nameNode,"Sens. Region Node",nameSense,0,0,0,"");
+    node->SetLineColor(kColorMUON);
+    node->cd();
+    Float_t dr=dx+rmin;
+    sprintf(nameNode,"MUON%d",300+fId+1);
+    nodeF = new TNode(nameNode,"Frame0",frMUON,dr, 0, 0,rot000,"");
+    nodeF->SetLineColor(kColorMUON);
+    node->cd();
+    sprintf(nameNode,"MUON%d",400+fId+1);
+    nodeF = new TNode(nameNode,"Frame1",frMUON,0 ,dr,0,rot090,"");
+    nodeF->SetLineColor(kColorMUON);
+    node->cd();
+    sprintf(nameNode,"MUON%d",500+fId+1);
+    nodeF = new TNode(nameNode,"Frame2",frMUON,-dr,0,0,rot180,"");
+    nodeF->SetLineColor(kColorMUON);
+    node  ->cd();
+    sprintf(nameNode,"MUON%d",600+fId+1);   
+    nodeF = new TNode(nameNode,"Frame3",frMUON,0,-dr,0,rot270,"");
+    nodeF->SetLineColor(kColorMUON);   
+  } else {
     TBox *box;
     
     Float_t dx=0.95/fCx[3][1]/2;
@@ -456,44 +621,46 @@ void AliMUONSegmentationV01::Draw()
     Float_t xc=0.5;
     Float_t yc=0.5;
     
-    for (Int_t iy=1; iy<Npy(); iy++)
-    {
-       for (Int_t isec=0; isec<4; isec++) {
-           if (isec==0) {
-               x0=0;
-               x1=fCx[isec][iy]*dx;
-           } else {
-               x0=fCx[isec-1][iy]*dx;
-               x1=fCx[isec][iy]*dx;
-           }
-           y0=Float_t(iy-1)*dy;
-           y1=y0+dy;
-           box=new TBox(x0+xc,y0+yc,x1+xc,y1+yc);
-           box->SetFillColor(isec+1);
-           box->Draw();
-
-           box=new TBox(-x1+xc,y0+yc,-x0+xc,y1+yc);
-           box->SetFillColor(isec+1);
-           box->Draw();
-
-           box=new TBox(x0+xc,-y1+yc,x1+xc,-y0+yc);
-           box->SetFillColor(isec+1);
-           box->Draw();
-
-           box=new TBox(-x1+xc,-y1+yc,-x0+xc,-y0+yc);
-           box->SetFillColor(isec+1);
-           box->Draw();
+    for (Int_t iy=1; iy<Npy(); iy++) {
+      for (Int_t isec=0; isec<4; isec++) {
+       if (isec==0) {
+         x0=0;
+         x1=fCx[isec][iy]*dx;
+       } else {
+         x0=fCx[isec-1][iy]*dx;
+         x1=fCx[isec][iy]*dx;
        }
+       y0=Float_t(iy-1)*dy;
+       y1=y0+dy;
+       box=new TBox(x0+xc,y0+yc,x1+xc,y1+yc);
+       box->SetFillColor(isec+1);
+       box->Draw();
+       
+       box=new TBox(-x1+xc,y0+yc,-x0+xc,y1+yc);
+       box->SetFillColor(isec+1);
+       box->Draw();
+       
+       box=new TBox(x0+xc,-y1+yc,x1+xc,-y0+yc);
+       box->SetFillColor(isec+1);
+       box->Draw();
+       
+       box=new TBox(-x1+xc,-y1+yc,-x0+xc,-y0+yc);
+       box->SetFillColor(isec+1);
+       box->Draw();
+      }
     }
+  }
 }
 void AliMUONSegmentationV01::SetCorrFunc(Int_t isec, TF1* func)
 {
-    (*fCorr)[isec]=func;
+// Set the correction function
+    (*fCorrA)[isec]=func;
 }
 
-TF1* AliMUONSegmentationV01::CorrFunc(Int_t isec)
+TF1* AliMUONSegmentationV01::CorrFunc(Int_t isec) const
 { 
-    return (TF1*) (*fCorr)[isec];
+// Get correction function
+    return (TF1*) (*fCorrA)[isec];
 }
 
 AliMUONSegmentationV01& AliMUONSegmentationV01::operator 
@@ -502,3 +669,4 @@ AliMUONSegmentationV01& AliMUONSegmentationV01::operator
 // Dummy assignment operator
     return *this;
 }
+