]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TRD/AliTRDpadPlane.cxx
New base class for all PHOS HLT processing component.
[u/mrichter/AliRoot.git] / TRD / AliTRDpadPlane.cxx
index cdc9665d06c463b241b87aee0fde8dd49b9c8460..89cf7140b1ab28d1b41b08ff7d85dffa14474477 100644 (file)
 //  tilting angle, etc.                                                      //
 //  It also provides methods to identify the current pad number from         //
 //  global coordinates.                                                      //
+//  The numbering and coordinates should follow the official convention      //
+//  (see David Emschermanns note on TRD convention                           //
 //                                                                           //
 ///////////////////////////////////////////////////////////////////////////////
 
+#include <TMath.h>
+
 #include "AliTRDpadPlane.h"
-#include "AliTRDgeometryFull.h"
+#include "AliTRDgeometry.h"
 
 ClassImp(AliTRDpadPlane)
 
 //_____________________________________________________________________________
-AliTRDpadPlane::AliTRDpadPlane():TObject()
+AliTRDpadPlane::AliTRDpadPlane()
+  :TObject()
+  ,fGeo(0)
+  ,fPla(0)
+  ,fCha(0)
+  ,fLength(0)
+  ,fWidth(0)
+  ,fLengthRim(0)
+  ,fWidthRim(0)
+  ,fLengthOPad(0)
+  ,fWidthOPad(0)
+  ,fLengthIPad(0)
+  ,fWidthIPad(0)
+  ,fRowSpacing(0)
+  ,fColSpacing(0)
+  ,fNrows(0)
+  ,fNcols(0)
+  ,fTiltingAngle(0)
+  ,fTiltingTan(0)
+  ,fPadRow(0)
+  ,fPadCol(0)
 {
   //
   // Default constructor
   //
 
-  fGeo          = 0;
-
-  fPla          = 0;
-  fCha          = 0;
-
-  fLength       = 0.0;
-  fWidth        = 0.0;
-  fLengthRim    = 0.0;
-  fWidthRim     = 0.0;
-  fLengthOPad   = 0.0;
-  fWidthOPad    = 0.0;
-  fLengthIPad   = 0.0;
-  fWidthIPad    = 0.0;
-
-  fRowSpacing   = 0.0;
-  fColSpacing   = 0.0;
-
-  fNrows        = 0;
-  fNcols        = 0;
-
-  fPadRow       = 0;
-  fPadCol       = 0;
-
-  fTiltingAngle = 0.0;
-
 }
 
 //_____________________________________________________________________________
-AliTRDpadPlane::AliTRDpadPlane(Int_t p, Int_t c):TObject()
+AliTRDpadPlane::AliTRDpadPlane(Int_t p, Int_t c)
+  :TObject()
+  ,fGeo(0)
+  ,fPla(0)
+  ,fCha(0)
+  ,fLength(0)
+  ,fWidth(0)
+  ,fLengthRim(0)
+  ,fWidthRim(0)
+  ,fLengthOPad(0)
+  ,fWidthOPad(0)
+  ,fLengthIPad(0)
+  ,fWidthIPad(0)
+  ,fRowSpacing(0)
+  ,fColSpacing(0)
+  ,fNrows(0)
+  ,fNcols(0)
+  ,fTiltingAngle(0)
+  ,fTiltingTan(0)
+  ,fPadRow(0)
+  ,fPadCol(0)
 {
   //
   // Constructor that initializes a given pad plane type
   //
 
-  fGeo = new AliTRDgeometryFull();
+  fGeo = new AliTRDgeometry();
 
   fPla = p;
   fCha = c;
@@ -235,16 +254,21 @@ AliTRDpadPlane::AliTRDpadPlane(Int_t p, Int_t c):TObject()
     break;
   };
 
+  //
+  // Store tilting angle as tangens
+  //
+  fTiltingTan = TMath::Tan(TMath::Pi()/180.0 * fTiltingAngle);
+
   //
   // The positions of the borders of the pads
   //
   // Row direction
   //
-  if (fPadRow) delete [] fPadRow;
   fPadRow = new Double_t[fNrows];
   Double_t row = fGeo->GetChamberLength(p,0)
               + fGeo->GetChamberLength(p,1)
-               + fGeo->GetChamberLength(p,2) / 2.
+               + fGeo->GetChamberLength(p,2) / 2.0
+               - fGeo->RpadW()
                - fLengthRim;
   for (Int_t ic = 0; ic < c; ic++) {
     row -= fGeo->GetChamberLength(p,ic);
@@ -252,7 +276,7 @@ AliTRDpadPlane::AliTRDpadPlane(Int_t p, Int_t c):TObject()
   for (Int_t ir = 0; ir < fNrows; ir++) {
     fPadRow[ir] = row;
     row -= fRowSpacing;
-    if (ir == 1) {
+    if (ir == 0) {
       row -= fLengthOPad;
     }
     else {
@@ -262,15 +286,14 @@ AliTRDpadPlane::AliTRDpadPlane(Int_t p, Int_t c):TObject()
   //
   // Column direction
   //
-  if (fPadCol) delete [] fPadCol;
   fPadCol = new Double_t[fNcols];
-  Double_t col = fGeo->GetChamberWidth(p) / 2. 
+  Double_t col = fGeo->GetChamberWidth(p) / 2.0
                + fGeo->CroWid()
                - fWidthRim;
   for (Int_t ic = 0; ic < fNcols; ic++) {
     fPadCol[ic] = col;
     col -= fColSpacing;
-    if (ic == 1) {
+    if (ic == 0) {
       col -= fWidthOPad;
     }
     else {
@@ -281,13 +304,49 @@ AliTRDpadPlane::AliTRDpadPlane(Int_t p, Int_t c):TObject()
 }
 
 //_____________________________________________________________________________
-AliTRDpadPlane::AliTRDpadPlane(const AliTRDpadPlane &p):TObject(p)
+AliTRDpadPlane::AliTRDpadPlane(const AliTRDpadPlane &p)
+  :TObject(p)
+  ,fGeo(0)
+  ,fPla(p.fPla)
+  ,fCha(p.fCha)
+  ,fLength(p.fLength)
+  ,fWidth(p.fWidth)
+  ,fLengthRim(p.fLengthRim)
+  ,fWidthRim(p.fLengthRim)
+  ,fLengthOPad(p.fLengthOPad)
+  ,fWidthOPad(p.fWidthOPad)
+  ,fLengthIPad(p.fLengthIPad)
+  ,fWidthIPad(p.fWidthIPad)
+  ,fRowSpacing(p.fRowSpacing)
+  ,fColSpacing(p.fColSpacing)
+  ,fNrows(p.fNrows)
+  ,fNcols(p.fNcols)
+  ,fTiltingAngle(p.fTiltingAngle)
+  ,fTiltingTan(p.fTiltingTan)
+  ,fPadRow(0)
+  ,fPadCol(0)
 {
   //
   // AliTRDpadPlane copy constructor
   //
 
-  ((AliTRDpadPlane &) p).Copy(*this);
+  Int_t iBin = 0;
+
+  if (((AliTRDpadPlane &) p).fPadRow) {
+    delete [] ((AliTRDpadPlane &) p).fPadRow;
+  }
+  ((AliTRDpadPlane &) p).fPadRow = new Double_t[fNrows];
+  for (iBin = 0; iBin < fNrows; iBin++) {
+    ((AliTRDpadPlane &) p).fPadRow[iBin] = fPadRow[iBin];
+  }                                                                             
+
+  if (((AliTRDpadPlane &) p).fPadCol) {
+    delete [] ((AliTRDpadPlane &) p).fPadCol;
+  }
+  ((AliTRDpadPlane &) p).fPadCol = new Double_t[fNrows];
+  for (iBin = 0; iBin < fNrows; iBin++) {
+    ((AliTRDpadPlane &) p).fPadCol[iBin] = fPadCol[iBin];
+  }                                                                             
 
 }
 
@@ -322,7 +381,10 @@ AliTRDpadPlane &AliTRDpadPlane::operator=(const AliTRDpadPlane &p)
   // Assignment operator
   //
 
-  if (this != &p) ((AliTRDpadPlane &) p).Copy(*this);
+  if (this != &p) {
+    ((AliTRDpadPlane &) p).Copy(*this);
+  }
+
   return *this;
 
 }
@@ -357,14 +419,19 @@ void AliTRDpadPlane::Copy(TObject &p) const
   ((AliTRDpadPlane &) p).fNcols        = fNcols;
 
   ((AliTRDpadPlane &) p).fTiltingAngle = fTiltingAngle;
+  ((AliTRDpadPlane &) p).fTiltingTan   = fTiltingTan;
 
-  if (((AliTRDpadPlane &) p).fPadRow) delete [] ((AliTRDpadPlane &) p).fPadRow;
+  if (((AliTRDpadPlane &) p).fPadRow) {
+    delete [] ((AliTRDpadPlane &) p).fPadRow;
+  }
   ((AliTRDpadPlane &) p).fPadRow = new Double_t[fNrows];
   for (iBin = 0; iBin < fNrows; iBin++) {
     ((AliTRDpadPlane &) p).fPadRow[iBin] = fPadRow[iBin];
   }                                                                             
 
-  if (((AliTRDpadPlane &) p).fPadCol) delete [] ((AliTRDpadPlane &) p).fPadCol;
+  if (((AliTRDpadPlane &) p).fPadCol) {
+    delete [] ((AliTRDpadPlane &) p).fPadCol;
+  }
   ((AliTRDpadPlane &) p).fPadCol = new Double_t[fNrows];
   for (iBin = 0; iBin < fNrows; iBin++) {
     ((AliTRDpadPlane &) p).fPadCol[iBin] = fPadCol[iBin];
@@ -375,7 +442,7 @@ void AliTRDpadPlane::Copy(TObject &p) const
 }
 
 //_____________________________________________________________________________
-Int_t AliTRDpadPlane::GetPadRowNumber(const Double_t z)
+Int_t AliTRDpadPlane::GetPadRowNumber(Double_t z) const
 {
   //
   // Finds the pad row number for a given global z-position
@@ -386,20 +453,30 @@ Int_t AliTRDpadPlane::GetPadRowNumber(const Double_t z)
   Int_t nbelow = 0;
   Int_t middle = 0;
 
-  if ((z > fPadRow[0]) ||
-      (z < fPadRow[0] - fLength + 2.0*fLengthRim)) {
+  if ((z > GetRow0()  ) || 
+      (z < GetRowEnd())) {
+
     row = -1;
+
   }
   else {
-    nabove = fNrows+1;
+
+    nabove = fNrows + 1;
     nbelow = 0;
     while (nabove - nbelow > 1) {
       middle = (nabove + nbelow) / 2;
-      if (z == fPadRow[middle-1]) row    = middle;
-      if (z  > fPadRow[middle-1]) nabove = middle;
-      else                        nbelow = middle;
+      if (z == fPadRow[middle-1]) {
+        row    = middle;
+      }
+      if (z  > fPadRow[middle-1]) {
+        nabove = middle;
+      }
+      else {
+        nbelow = middle;
+      }
     }
     row = nbelow - 1;
+
   }
 
   return row;
@@ -407,65 +484,44 @@ Int_t AliTRDpadPlane::GetPadRowNumber(const Double_t z)
 }
 
 //_____________________________________________________________________________
-Int_t AliTRDpadPlane::GetPadColNumber(const Double_t rphi)
+Int_t AliTRDpadPlane::GetPadColNumber(Double_t rphi
+                                   , Double_t /*rowOffset*/) const
 {
   //
   // Finds the pad column number for a given global rphi-position
   //
 
-  Int_t col    = 0;
-  Int_t nabove = 0;
-  Int_t nbelow = 0;
-  Int_t middle = 0;
+  Int_t    col    = 0;
+  Int_t    nabove = 0;
+  Int_t    nbelow = 0;
+  Int_t    middle = 0;
+
+  if ((rphi > GetCol0()  ) || 
+      (rphi < GetColEnd())) {
 
-  if ((rphi > fPadCol[0]) ||
-      (rphi < fPadCol[0] - fWidth + 2.0*fWidthRim)) {
     col = -1;
+
   }
   else {
-    nabove = fNcols+1;
+
+    nabove = fNcols + 1;
     nbelow = 0;
     while (nabove - nbelow > 1) {
       middle = (nabove + nbelow) / 2;
-      if (rphi == fPadCol[middle-1]) col    = middle;
-      if (rphi  > fPadCol[middle-1]) nabove = middle;
-      else                           nbelow = middle;
+      if (rphi == fPadCol[middle-1]) {
+        col    = middle;
+      }
+      if (rphi  > fPadCol[middle-1]) {
+        nabove = middle;
+      }
+      else {
+        nbelow = middle;
+      }
     }
     col = nbelow - 1;
-  }
-
-  return col;
-
-}
-
-//_____________________________________________________________________________
-Double_t AliTRDpadPlane::GetPadRowOffset(const Int_t row, const Double_t z)
-{
-  //
-  // Calculates the distance to the pad border in row direction
-  //
 
-  if ((row < 0) || (row >= fNrows)) {
-    return -1.0;
-  }
-  else {
-    return fPadRow[row] - z;
   }
 
-}
-
-//_____________________________________________________________________________
-Double_t AliTRDpadPlane::GetPadColOffset(const Int_t col, const Double_t rphi)
-{
-  //
-  // Calculates the distance to the pad border in column direction
-  //
-
-  if ((col < 0) || (col >= fNcols)) {
-    return -1.0;
-  }
-  else {
-    return fPadCol[col] - rphi;
-  }
+  return col;
 
 }