]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/UPGRADE/AliITSURecoLayer.cxx
Fix in layers rmin/rmax calculation and their accounting in track navigation.
[u/mrichter/AliRoot.git] / ITS / UPGRADE / AliITSURecoLayer.cxx
index 6ff89e12b33ca7ffa7b6fa85e180f3b2eef4f69a..7b2e12e3253c7ccf8bc37dbee29239cc864b0c39 100644 (file)
@@ -1,9 +1,10 @@
 #include <TClonesArray.h>
 #include "AliITSURecoLayer.h"
-#include "AliITSUGeomTGeo.h"
 #include "AliITSsegmentation.h"
 #include "AliITSUAux.h"
 #include "AliITSUClusterPix.h"
+#include "AliITSUGeomTGeo.h"
+#include "AliLog.h"
 
 using namespace AliITSUAux;
 using namespace TMath;
@@ -69,6 +70,7 @@ AliITSURecoLayer::~AliITSURecoLayer()
   delete[] fSensors;
   delete[] fPhiLadMax;
   delete[] fPhiLadMin;
+  if (GetOwnsClusterArray()) delete fClusters;
 }
 
 //______________________________________________________
@@ -85,6 +87,7 @@ void AliITSURecoLayer::Print(Option_t* opt) const
 void AliITSURecoLayer::Build()
 {
   // build internal structures
+  const double kSafeR = 0.05; // safety margin for Rmin,Rmax of the layer
   if (fActiveID<0) return;
   fNLadders = fITSGeom->GetNLadders(fActiveID);
   fNSensInLadder = fITSGeom->GetNDetectors(fActiveID);
@@ -113,7 +116,7 @@ void AliITSURecoLayer::Build()
       fSensors[ild*fNSensInLadder+idt] = sens;
       //
       double phiMin=1e9,phiMax=-1e9,zMin=1e9,zMax=-1e9;
-      mmod = *fITSGeom->GetMatrix(fActiveID,ild,idt);
+      mmod = *fITSGeom->GetMatrixSens(fActiveID,ild,idt);
       for (int ix=0;ix<2;ix++) {
        loc[0] = (ix-0.5)*kSegm->Dx(); // +-DX/2
        for (int iy=0;iy<2;iy++) {
@@ -162,6 +165,8 @@ void AliITSURecoLayer::Build()
   fRMin = Sqrt(fRMin);
   fRMax = Sqrt(fRMax);
   fR = 0.5*(fRMin+fRMax);
+  fRMin -= kSafeR;
+  fRMax += kSafeR;
   double dz = fNSensInLadder>0 ? fSensDZInv/(fNSensInLadder-1)/fNLadders : fZMax-fZMin;
   fSensDZInv = 1./dz;
 
@@ -298,7 +303,7 @@ void AliITSURecoLayer::ProcessClusters(Int_t mode)
 Bool_t AliITSURecoLayer::IsEqual(const TObject* obj) const
 {
   // check if layers are equal in R
-  const AliITSURecoLayer* lr = dynamic_cast<const AliITSURecoLayer*>(obj);
+  const AliITSURecoLayer* lr = (const AliITSURecoLayer*)obj;
   return Abs(lr->GetR()-GetR())<1e-6 ? kTRUE : kFALSE;
 }
 
@@ -306,9 +311,18 @@ Bool_t AliITSURecoLayer::IsEqual(const TObject* obj) const
 Int_t  AliITSURecoLayer::Compare(const TObject* obj) const
 {
   // compare two layers
-  const AliITSURecoLayer* lr = dynamic_cast<const AliITSURecoLayer*>(obj);
+  const AliITSURecoLayer* lr = (const AliITSURecoLayer*)obj;
   double dr = GetR() - lr->GetR();
   if (Abs(dr)<1e-6) return 0;
   return dr>0 ? 1:-1;
   //      
 }
+
+//_________________________________________________________________
+AliITSURecoSens* AliITSURecoLayer::GetSensorFromID(Int_t i) const 
+{
+  // get sensor from its global id
+  i -= fITSGeom->GetFirstModIndex(fActiveID);
+  if (i<0||i>=fNSensors) AliFatal(Form("Sensor with id=%d is not in layer %d",i+fITSGeom->GetFirstModIndex(fActiveID),fActiveID));
+  return (AliITSURecoSens*)fSensors[i];
+}