]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MFT/AliMFTPlane.cxx
modifications to run accordingly to the modifications in the Flow package + some...
[u/mrichter/AliRoot.git] / MFT / AliMFTPlane.cxx
index 0e9cc07a7bd92e4179628cb45ef126b4d283d7f3..d06e150e5146ab0b4bf362efe2730fb96d395908 100644 (file)
@@ -63,7 +63,9 @@ AliMFTPlane::AliMFTPlane():
   fEquivalentSiliconBeforeBack(0),
   fActiveElements(0),
   fReadoutElements(0),
-  fSupportElements(0)
+  fSupportElements(0),
+  fHasPixelRectangularPatternAlongY(kFALSE),
+  fPlaneIsOdd(kFALSE)
 {
 
   // default constructor
@@ -89,13 +91,21 @@ AliMFTPlane::AliMFTPlane(const Char_t *name, const Char_t *title):
   fEquivalentSilicon(0),
   fEquivalentSiliconBeforeFront(0),
   fEquivalentSiliconBeforeBack(0),
-  fActiveElements(new TClonesArray("THnSparseC")),
-  fReadoutElements(new TClonesArray("THnSparseC")),
-  fSupportElements(new TClonesArray("THnSparseC"))
+  fActiveElements(0),
+  fReadoutElements(0),
+  fSupportElements(0),
+  fHasPixelRectangularPatternAlongY(kFALSE),
+  fPlaneIsOdd(kFALSE)
 {
 
   // constructor
-
+  fActiveElements  = new TClonesArray("THnSparseC");
+  fReadoutElements = new TClonesArray("THnSparseC");
+  fSupportElements = new TClonesArray("THnSparseC");
+  fActiveElements->SetOwner(kTRUE);
+  fReadoutElements->SetOwner(kTRUE);
+  fSupportElements->SetOwner(kTRUE);
+  
 }
 
 //====================================================================================================================================================
@@ -117,17 +127,50 @@ AliMFTPlane::AliMFTPlane(const AliMFTPlane& plane):
   fEquivalentSilicon(plane.fEquivalentSilicon),
   fEquivalentSiliconBeforeFront(plane.fEquivalentSiliconBeforeFront),
   fEquivalentSiliconBeforeBack(plane.fEquivalentSiliconBeforeBack),
-  fActiveElements(new TClonesArray("THnSparseC")),
-  fReadoutElements(new TClonesArray("THnSparseC")),
-  fSupportElements(new TClonesArray("THnSparseC"))
+  fActiveElements(0),
+  fReadoutElements(0),
+  fSupportElements(0),
+  fHasPixelRectangularPatternAlongY(plane.fHasPixelRectangularPatternAlongY),
+  fPlaneIsOdd(plane.fPlaneIsOdd)
 {
 
   // copy constructor
+  fActiveElements  = new TClonesArray(*(plane.fActiveElements));
+  fActiveElements  -> SetOwner(kTRUE);
+  fReadoutElements = new TClonesArray(*(plane.fReadoutElements));
+  fReadoutElements -> SetOwner(kTRUE);
+  fSupportElements = new TClonesArray(*(plane.fSupportElements));
+  fSupportElements -> SetOwner(kTRUE);
+
+       
+}
+
+//====================================================================================================================================================
+
+AliMFTPlane::~AliMFTPlane() {
+
+  AliInfo("Delete AliMFTPlane");
+  if(fActiveElements) fActiveElements->Delete();
+  delete fActiveElements; 
+  if(fReadoutElements) fReadoutElements->Delete();
+  delete fReadoutElements; 
+  if(fSupportElements) fSupportElements->Delete();
+  delete fSupportElements; 
+
+}
+
+//====================================================================================================================================================
+
+void AliMFTPlane::Clear(const Option_t* /*opt*/) {
+
+  AliInfo("Clear AliMFTPlane");
+  if(fActiveElements) fActiveElements->Delete();
+  delete fActiveElements; fActiveElements=NULL;
+  if(fReadoutElements) fReadoutElements->Delete();
+  delete fReadoutElements;  fReadoutElements=NULL; 
+  if(fSupportElements) fSupportElements->Delete();
+  delete fSupportElements;   fSupportElements=NULL;
 
-  *fActiveElements  = *plane.fActiveElements;
-  *fReadoutElements = *plane.fReadoutElements;
-  *fSupportElements = *plane.fSupportElements;
-  
 }
 
 //====================================================================================================================================================
@@ -135,33 +178,42 @@ AliMFTPlane::AliMFTPlane(const AliMFTPlane& plane):
 AliMFTPlane& AliMFTPlane::operator=(const AliMFTPlane& plane) {
 
   // Assignment operator
-
+  
   // check assignement to self
   if (this != &plane) {
-
+    
     // base class assignement
     TNamed::operator=(plane);
     
-    fPlaneNumber                  = plane.fPlaneNumber;
-    fZCenter                      = plane.fZCenter; 
-    fRMinSupport                  = plane.fRMinSupport; 
-    fRMax                         = plane.fRMax;
-    fRMaxSupport                  = plane.fRMaxSupport;
-    fPixelSizeX                   = plane.fPixelSizeX;
-    fPixelSizeY                   = plane.fPixelSizeY; 
-    fThicknessActive              = plane.fThicknessActive; 
-    fThicknessSupport             = plane.fThicknessSupport; 
-    fThicknessReadout             = plane.fThicknessReadout;
-    fZCenterActiveFront           = plane.fZCenterActiveFront;
-    fZCenterActiveBack            = plane.fZCenterActiveBack;
-    fEquivalentSilicon            = plane.fEquivalentSilicon;
-    fEquivalentSiliconBeforeFront = plane.fEquivalentSiliconBeforeFront;
-    fEquivalentSiliconBeforeBack  = plane.fEquivalentSiliconBeforeBack;
-    *fActiveElements              = *plane.fActiveElements;
-    *fReadoutElements             = *plane.fReadoutElements;
-    *fSupportElements             = *plane.fSupportElements;
-  }
+    // clear memory
+    Clear("");
+    
+    fPlaneNumber                      = plane.fPlaneNumber;
+    fZCenter                          = plane.fZCenter; 
+    fRMinSupport                      = plane.fRMinSupport; 
+    fRMax                             = plane.fRMax;
+    fRMaxSupport                      = plane.fRMaxSupport;
+    fPixelSizeX                       = plane.fPixelSizeX;
+    fPixelSizeY                       = plane.fPixelSizeY; 
+    fThicknessActive                  = plane.fThicknessActive; 
+    fThicknessSupport                 = plane.fThicknessSupport; 
+    fThicknessReadout                 = plane.fThicknessReadout;
+    fZCenterActiveFront               = plane.fZCenterActiveFront;
+    fZCenterActiveBack                = plane.fZCenterActiveBack;
+    fEquivalentSilicon                = plane.fEquivalentSilicon;
+    fEquivalentSiliconBeforeFront     = plane.fEquivalentSiliconBeforeFront;
+    fEquivalentSiliconBeforeBack      = plane.fEquivalentSiliconBeforeBack;
+    fActiveElements = new TClonesArray(*(plane.fActiveElements));
+    fActiveElements -> SetOwner(kTRUE);
+    fReadoutElements = new TClonesArray(*(plane.fReadoutElements));
+    fReadoutElements -> SetOwner(kTRUE);
+    fSupportElements = new TClonesArray(*(plane.fSupportElements));
+    fSupportElements -> SetOwner(kTRUE);
+    fHasPixelRectangularPatternAlongY = plane.fHasPixelRectangularPatternAlongY;
+    fPlaneIsOdd                       = plane.fPlaneIsOdd;
 
+  }
+  
   return *this;
   
 }
@@ -176,7 +228,8 @@ Bool_t AliMFTPlane::Init(Int_t    planeNumber,
                         Double_t pixelSizeY, 
                         Double_t thicknessActive, 
                         Double_t thicknessSupport, 
-                        Double_t thicknessReadout) {
+                        Double_t thicknessReadout,
+                        Bool_t   hasPixelRectangularPatternAlongY) {
 
   AliDebug(1, Form("Initializing Plane Structure for Plane %s", GetName()));
 
@@ -190,21 +243,27 @@ Bool_t AliMFTPlane::Init(Int_t    planeNumber,
   fThicknessSupport = thicknessSupport;
   fThicknessReadout = thicknessReadout;
 
+  fHasPixelRectangularPatternAlongY = hasPixelRectangularPatternAlongY;
+
   fZCenterActiveFront = fZCenter - 0.5*fThicknessSupport - 0.5*fThicknessActive;
   fZCenterActiveBack  = fZCenter + 0.5*fThicknessSupport + 0.5*fThicknessActive;
 
-  if (fRMinSupport <= fRadiusMin) fRMinSupport = fRadiusMin;
-  else {
-    fRMinSupport = fRadiusMin + (fHeightActive-fActiveSuperposition) * Int_t((fRMinSupport-fRadiusMin)/(fHeightActive-fActiveSuperposition));
-  }
+//   if (fRMinSupport <= fRadiusMin) fRMinSupport = fRadiusMin;
+//   else {
+//     fRMinSupport = fRadiusMin + (fHeightActive-fActiveSuperposition) * Int_t((fRMinSupport-fRadiusMin)/(fHeightActive-fActiveSuperposition));
+//   }
   
   if (fRMax < fRMinSupport+fHeightActive) fRMax = fRMinSupport + fHeightActive;
-  
+
+  Int_t nLaddersWithinPipe = Int_t(fRMinSupport/(fHeightActive-fActiveSuperposition));
+  if (fRMinSupport-nLaddersWithinPipe*(fHeightActive-fActiveSuperposition) > 0.5*(fHeightActive-2*fActiveSuperposition)) fPlaneIsOdd = kTRUE;
+  else fPlaneIsOdd = kFALSE;
+
   fRMax = fRMinSupport + (fHeightActive-fActiveSuperposition) * 
     (Int_t((fRMax-fRMinSupport-fHeightActive)/(fHeightActive-fActiveSuperposition))+1) + fHeightActive;
-  
+
   fRMaxSupport = TMath::Sqrt(fHeightActive*(2.*rMax-fHeightActive) + fRMax*fRMax) + fSupportExtMargin;
+   
   return kTRUE;
  
 }
@@ -216,39 +275,22 @@ Bool_t AliMFTPlane::CreateStructure() {
   Int_t nBins[3]={0};
   Double_t minPosition[3]={0}, maxPosition[3]={0};
   
-  // ------------------- support element -------------------------------------------------
-  
-  nBins[0] = 1;
-  nBins[1] = 1;
-  nBins[2] = 1;
-  
-  minPosition[0] = -1.*fRMaxSupport;
-  minPosition[1] = -1.*fRMaxSupport;
-  minPosition[2] = fZCenter - 0.5*fThicknessSupport;
-  
-  maxPosition[0] = +1.*fRMaxSupport;
-  maxPosition[1] = +1.*fRMaxSupport;
-  maxPosition[2] = fZCenter + 0.5*fThicknessSupport;
-  
-  new ((*fSupportElements)[fSupportElements->GetEntries()]) THnSparseC(Form("MFTSupportElemHist_%02d%03d", fPlaneNumber, fSupportElements->GetEntries()), 
-                                                                      Form("MFTSupportElemHist_%02d%03d", fPlaneNumber, fSupportElements->GetEntries()), 
-                                                                      3, nBins, minPosition, maxPosition);
-
   // ------------------- det elements: active + readout ----------------------------------
-  
+
+  // 1st Section : below and above the beam pipe
+
   Double_t lowEdgeActive = -1.*fRMax;
   Double_t supEdgeActive = lowEdgeActive + fHeightActive;
+  Double_t zMinFront = fZCenter - 0.5*fThicknessSupport - fThicknessActive;
+  Double_t zMinBack  = fZCenter + 0.5*fThicknessSupport;
   Double_t zMin = 0.;
   Bool_t isFront = kTRUE;
   
-  while (supEdgeActive < fRMax+0.01) {
-    
-    if (isFront) zMin = fZCenter - 0.5*fThicknessSupport - fThicknessActive;
-    else         zMin = fZCenter + 0.5*fThicknessSupport;
+  while (lowEdgeActive < 0) {
     
     Double_t extLimitAtLowEdgeActive = TMath::Sqrt((fRMax-TMath::Abs(lowEdgeActive)) * TMath::Abs(2*fRMax - (fRMax-TMath::Abs(lowEdgeActive))));
     Double_t extLimitAtSupEdgeActive = TMath::Sqrt((fRMax-TMath::Abs(supEdgeActive)) * TMath::Abs(2*fRMax - (fRMax-TMath::Abs(supEdgeActive))));
-    
+
     // creating new det element: active + readout
     
     Double_t extLimitDetElem = TMath::Max(extLimitAtLowEdgeActive, extLimitAtSupEdgeActive);
@@ -258,7 +300,12 @@ Bool_t AliMFTPlane::CreateStructure() {
       nBins[0] = TMath::Nint(2.*extLimitDetElem/fPixelSizeX);
       nBins[1] = TMath::Nint(fHeightActive/fPixelSizeY);
       nBins[2] = 1;
+
+      // element below the pipe
       
+      if (isFront) zMin = zMinFront;
+      else         zMin = zMinBack;
+
       minPosition[0] = -1.*extLimitDetElem;
       minPosition[1] = lowEdgeActive;
       minPosition[2] = zMin;
@@ -270,20 +317,40 @@ Bool_t AliMFTPlane::CreateStructure() {
       new ((*fActiveElements)[fActiveElements->GetEntries()]) THnSparseC(Form("MFTActiveElemHist_%02d%03d", fPlaneNumber, fActiveElements->GetEntries()), 
                                                                         Form("MFTActiveElemHist_%02d%03d", fPlaneNumber, fActiveElements->GetEntries()), 
                                                                         3, nBins, minPosition, maxPosition);
+
+      minPosition[1] = lowEdgeActive-fHeightReadout;
+      maxPosition[1] = lowEdgeActive;
       
-      if (supEdgeActive>0.) {
-       minPosition[1] = supEdgeActive;
-       maxPosition[1] = supEdgeActive+fHeightReadout;
-      }
-      else {
-       minPosition[1] = lowEdgeActive-fHeightReadout;
-       maxPosition[1] = lowEdgeActive;
+      new ((*fReadoutElements)[fReadoutElements->GetEntries()]) THnSparseC(Form("MFTReadoutElemHist_%02d%03d", fPlaneNumber, fReadoutElements->GetEntries()), 
+                                                                          Form("MFTReadoutElemHist_%02d%03d", fPlaneNumber, fReadoutElements->GetEntries()), 
+                                                                          3, nBins, minPosition, maxPosition);
+
+      // specular element above the pipe
+
+      if (fPlaneIsOdd) {
+       if (isFront) zMin = zMinBack;
+       else         zMin = zMinFront;
       }
+
+      minPosition[0] = -1.*extLimitDetElem;
+      minPosition[1] = -1.*supEdgeActive;
+      minPosition[2] = zMin;
+      
+      maxPosition[0] = +1.*extLimitDetElem;
+      maxPosition[1] = -1.*lowEdgeActive;
+      maxPosition[2] = zMin+fThicknessActive; 
       
+      new ((*fActiveElements)[fActiveElements->GetEntries()]) THnSparseC(Form("MFTActiveElemHist_%02d%03d", fPlaneNumber, fActiveElements->GetEntries()), 
+                                                                        Form("MFTActiveElemHist_%02d%03d", fPlaneNumber, fActiveElements->GetEntries()), 
+                                                                        3, nBins, minPosition, maxPosition);
+
+      minPosition[1] = -1.*lowEdgeActive;
+      maxPosition[1] = -1.*(lowEdgeActive-fHeightReadout);
+
       new ((*fReadoutElements)[fReadoutElements->GetEntries()]) THnSparseC(Form("MFTReadoutElemHist_%02d%03d", fPlaneNumber, fReadoutElements->GetEntries()), 
                                                                           Form("MFTReadoutElemHist_%02d%03d", fPlaneNumber, fReadoutElements->GetEntries()), 
                                                                           3, nBins, minPosition, maxPosition);
-      
+
     }
     
     else {     // two elements covering the row
@@ -297,8 +364,11 @@ Bool_t AliMFTPlane::CreateStructure() {
       nBins[1] = TMath::Nint(fHeightActive/fPixelSizeY);
       nBins[2] = 1;
       
-      // left element
+      // left element: below the beam pipe
       
+      if (isFront) zMin = zMinFront;
+      else         zMin = zMinBack;
+
       minPosition[0] = -1.*extLimitDetElem;
       minPosition[1] = lowEdgeActive;
       minPosition[2] = zMin;
@@ -311,21 +381,48 @@ Bool_t AliMFTPlane::CreateStructure() {
                                                                         Form("MFTActiveElemHist_%02d%03d", fPlaneNumber, fActiveElements->GetEntries()), 
                                                                         3, nBins, minPosition, maxPosition);   
       
-      if (supEdgeActive>0.) {
-       minPosition[1] = supEdgeActive;
-       maxPosition[1] = supEdgeActive+fHeightReadout;
-      }
-      else {
-       minPosition[1] = lowEdgeActive-fHeightReadout;
-       maxPosition[1] = lowEdgeActive;
-      }
+      minPosition[1] = lowEdgeActive-fHeightReadout;
+      maxPosition[1] = lowEdgeActive;
       
       new ((*fReadoutElements)[fReadoutElements->GetEntries()]) THnSparseC(Form("MFTReadoutElemHist_%02d%03d", fPlaneNumber, fReadoutElements->GetEntries()), 
                                                                           Form("MFTReadoutElemHist_%02d%03d", fPlaneNumber, fReadoutElements->GetEntries()), 
                                                                           3, nBins, minPosition, maxPosition);
+
+      // left element: above the beam pipe
       
-      // right element
+      if (supEdgeActive < 0.5*fHeightActive) {
+       
+       if (fPlaneIsOdd) {
+         if (isFront) zMin = zMinBack;
+         else         zMin = zMinFront;
+       }
+       
+       minPosition[0] = -1.*extLimitDetElem;
+       minPosition[1] = -1.*supEdgeActive;
+       minPosition[2] = zMin;
+       
+       maxPosition[0] = -1.*intLimitDetElem;
+       maxPosition[1] = -1.*lowEdgeActive;
+       maxPosition[2] = zMin+fThicknessActive; 
+       
+       new ((*fActiveElements)[fActiveElements->GetEntries()]) THnSparseC(Form("MFTActiveElemHist_%02d%03d", fPlaneNumber, fActiveElements->GetEntries()), 
+                                                                          Form("MFTActiveElemHist_%02d%03d", fPlaneNumber, fActiveElements->GetEntries()), 
+                                                                          3, nBins, minPosition, maxPosition); 
+       
+       minPosition[1] = -1.*lowEdgeActive;
+       maxPosition[1] = -1.*(lowEdgeActive-fHeightReadout);
+       
+       new ((*fReadoutElements)[fReadoutElements->GetEntries()]) THnSparseC(Form("MFTReadoutElemHist_%02d%03d", fPlaneNumber, fReadoutElements->GetEntries()), 
+                                                                            Form("MFTReadoutElemHist_%02d%03d", fPlaneNumber, fReadoutElements->GetEntries()), 
+                                                                            3, nBins, minPosition, maxPosition);
       
+      }
+
+      // right element: below the beam pipe
+      
+      if (isFront) zMin = zMinFront;
+      else         zMin = zMinBack;
+
       minPosition[0] = +1.*intLimitDetElem;
       minPosition[1] = lowEdgeActive;
       minPosition[2] = zMin;
@@ -338,18 +435,42 @@ Bool_t AliMFTPlane::CreateStructure() {
                                                                         Form("MFTActiveElemHist_%02d%03d", fPlaneNumber, fActiveElements->GetEntries()), 
                                                                         3, nBins, minPosition, maxPosition);   
       
-      if (supEdgeActive>0.) {
-       minPosition[1] = supEdgeActive;
-       maxPosition[1] = supEdgeActive+fHeightReadout;
-      }
-      else {
-       minPosition[1] = lowEdgeActive-fHeightReadout;
-       maxPosition[1] = lowEdgeActive;
-      }
-      
+      minPosition[1] = lowEdgeActive-fHeightReadout;
+      maxPosition[1] = lowEdgeActive;
+
       new ((*fReadoutElements)[fReadoutElements->GetEntries()]) THnSparseC(Form("MFTReadoutElemHist_%02d%03d", fPlaneNumber, fReadoutElements->GetEntries()), 
                                                                           Form("MFTReadoutElemHist_%02d%03d", fPlaneNumber, fReadoutElements->GetEntries()), 
                                                                           3, nBins, minPosition, maxPosition);
+
+      // right element: above the beam pipe
+      
+      if (supEdgeActive < 0.5*fHeightActive) {
+
+       if (fPlaneIsOdd) {
+         if (isFront) zMin = zMinBack;
+         else         zMin = zMinFront;
+       }
+       
+       minPosition[0] = +1.*intLimitDetElem;
+       minPosition[1] = -1.*supEdgeActive;
+       minPosition[2] = zMin;
+       
+       maxPosition[0] = +1.*extLimitDetElem;
+       maxPosition[1] = -1.*lowEdgeActive;
+       maxPosition[2] = zMin+fThicknessActive; 
+       
+       new ((*fActiveElements)[fActiveElements->GetEntries()]) THnSparseC(Form("MFTActiveElemHist_%02d%03d", fPlaneNumber, fActiveElements->GetEntries()), 
+                                                                          Form("MFTActiveElemHist_%02d%03d", fPlaneNumber, fActiveElements->GetEntries()), 
+                                                                          3, nBins, minPosition, maxPosition); 
+       
+       minPosition[1] = -1.*lowEdgeActive;
+       maxPosition[1] = -1.*(lowEdgeActive-fHeightReadout);
+       
+       new ((*fReadoutElements)[fReadoutElements->GetEntries()]) THnSparseC(Form("MFTReadoutElemHist_%02d%03d", fPlaneNumber, fReadoutElements->GetEntries()), 
+                                                                            Form("MFTReadoutElemHist_%02d%03d", fPlaneNumber, fReadoutElements->GetEntries()), 
+                                                                            3, nBins, minPosition, maxPosition);
+
+      }
       
     }
     
@@ -359,6 +480,26 @@ Bool_t AliMFTPlane::CreateStructure() {
     
   }
   
+  // ------------------- support element -------------------------------------------------
+  
+  nBins[0] = 1;
+  nBins[1] = 1;
+  nBins[2] = 1;
+  
+  minPosition[0] = -1.*fRMaxSupport;
+  minPosition[1] = -1.*fRMaxSupport;
+  minPosition[2] = fZCenter - 0.5*fThicknessSupport;
+  
+  maxPosition[0] = +1.*fRMaxSupport;
+  maxPosition[1] = +1.*fRMaxSupport;
+  maxPosition[2] = fZCenter + 0.5*fThicknessSupport;
+  
+  new ((*fSupportElements)[fSupportElements->GetEntries()]) THnSparseC(Form("MFTSupportElemHist_%02d%03d", fPlaneNumber, fSupportElements->GetEntries()), 
+                                                                      Form("MFTSupportElemHist_%02d%03d", fPlaneNumber, fSupportElements->GetEntries()), 
+                                                                      3, nBins, minPosition, maxPosition);
+
+  // --------------------------------------------------------------------------------------
+
   AliDebug(1, Form("Structure completed for MFT plane %s", GetName()));
 
   return kTRUE;
@@ -403,8 +544,6 @@ void AliMFTPlane::DrawPlane(Option_t *opt) {
     TCanvas *cnv = new TCanvas("cnv", GetName(), 900, 900);
     cnv->Draw();
 
-    //    printf("Created Canvas\n");
-
     TH2D *h = new TH2D("tmp", GetName(), 
                       1, 1.1*GetSupportElement(0)->GetAxis(0)->GetXmin(), 1.1*GetSupportElement(0)->GetAxis(0)->GetXmax(), 
                       1, 1.1*GetSupportElement(0)->GetAxis(1)->GetXmin(), 1.1*GetSupportElement(0)->GetAxis(1)->GetXmax());
@@ -420,10 +559,7 @@ void AliMFTPlane::DrawPlane(Option_t *opt) {
     supportExt -> Draw("same");
     supportInt -> Draw("same");
 
-    //    printf("Created Ellipses\n");
-
     for (Int_t iEl=0; iEl<GetNActiveElements(); iEl++) {
-      //      printf("Active element %d\n", iEl);
       if (!IsFront(GetActiveElement(iEl))) continue;
       TPave *pave = new TPave(GetActiveElement(iEl)->GetAxis(0)->GetXmin(), 
                              GetActiveElement(iEl)->GetAxis(1)->GetXmin(), 
@@ -434,7 +570,6 @@ void AliMFTPlane::DrawPlane(Option_t *opt) {
     }
 
     for (Int_t iEl=0; iEl<GetNReadoutElements(); iEl++) {
-      //      printf("Readout element %d\n", iEl);
       if (!IsFront(GetReadoutElement(iEl))) continue;
       TPave *pave = new TPave(GetReadoutElement(iEl)->GetAxis(0)->GetXmin(), 
                              GetReadoutElement(iEl)->GetAxis(1)->GetXmin(), 
@@ -619,3 +754,28 @@ void AliMFTPlane::DrawPlane(Option_t *opt) {
 
 //====================================================================================================================================================
 
+Int_t AliMFTPlane::GetNumberOfChips(Option_t *opt) {
+
+  Int_t nChips = 0;
+
+  if (!strcmp(opt, "front")) {
+    for (Int_t iEl=0; iEl<GetNActiveElements(); iEl++) {
+      if (!IsFront(GetActiveElement(iEl))) continue;
+      Double_t length = GetActiveElement(iEl)->GetAxis(0)->GetXmax() - GetActiveElement(iEl)->GetAxis(0)->GetXmin();
+      nChips += Int_t (length/AliMFTConstants::fWidthChip) + 1;
+    }
+  }
+
+  else if (!strcmp(opt, "back")) {
+    for (Int_t iEl=0; iEl<GetNActiveElements(); iEl++) {
+      if (IsFront(GetActiveElement(iEl))) continue;
+      Double_t length = GetActiveElement(iEl)->GetAxis(0)->GetXmax() - GetActiveElement(iEl)->GetAxis(0)->GetXmin();
+      nChips += Int_t (length/AliMFTConstants::fWidthChip) + 1;
+    }
+  }
+
+  return nChips;
+
+}
+
+//====================================================================================================================================================