Fix in layers rmin/rmax calculation and their accounting in track navigation.
[u/mrichter/AliRoot.git] / ITS / UPGRADE / AliITSURecoLayer.cxx
index f83fd48..7b2e12e 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;
 
@@ -222,10 +227,12 @@ Int_t AliITSURecoLayer::FindSensors(const double* impPar, AliITSURecoSens *senso
   // find sensors having intersection with track
   // impPar contains: lab phi of track, dphi, labZ, dz
   double z = impPar[2];
-  if (z>fZMax+impPar[3]) return -1; // outside of Z coverage
+  if (z>fZMax+impPar[3]) return 0; // outside of Z coverage
   z -= fZMin;
-  if (z<-impPar[3]) return -1; // outside of Z coverage
+  if (z<-impPar[3]) return 0; // outside of Z coverage
   int sensInLad = int(z*fSensDZInv);
+  if      (sensInLad<0) sensInLad = 0;
+  else if (sensInLad>=fNSensInLadder) sensInLad = fNSensInLadder-1;
   //
   double phi = impPar[0] - fPhiOffs;
   BringTo02Pi(phi);
@@ -273,6 +280,7 @@ void AliITSURecoLayer::ProcessClusters(Int_t mode)
   // the clusters of the layer must be sorted per sensor
   int ncl = fClusters->GetEntriesFast();
   int curSensID = -1;
+  for (int i=fNSensors;i--;) GetSensor(i)->SetNClusters(0);
   AliITSURecoSens* curSens = 0;
   for (int icl=0;icl<ncl;icl++) {
     AliITSUClusterPix* cl = (AliITSUClusterPix*) fClusters->UncheckedAt(icl);
@@ -295,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;
 }
 
@@ -303,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];
+}