]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
- Possibility to reconstruct (TPC+SPD) tracks outside SSD and SDD acceptance
authormasera <masera@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 23 Nov 2007 17:35:43 +0000 (17:35 +0000)
committermasera <masera@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 23 Nov 2007 17:35:43 +0000 (17:35 +0000)
- Creation of virtual clusters in SPD dead zones (z) not needed anymore
- AliITSRecoParam inherits from AliDetectorRecoParam
- Added switches for cluster unfolding in ITS
- TGeo used by default for material corrections

ITS/AliITSRecoParam.cxx
ITS/AliITSRecoParam.h
ITS/AliITStrackerMI.cxx
ITS/AliITStrackerMI.h

index d1602a759107842eb8feea4478bc1f6786ff1e4c..71ac349edd3f9b160c5d06c0939255e8d32de000 100644 (file)
@@ -61,7 +61,7 @@ const Double_t AliITSRecoParam::fgkSPDdetzlength=6.960; // 7.072-2*0.056
 const Double_t AliITSRecoParam::fgkSPDdetxlength=1.298; // 1.410-2*0.056
 
 //_____________________________________________________________________________
-AliITSRecoParam::AliITSRecoParam() : TObject(),
+AliITSRecoParam::AliITSRecoParam() : AliDetectorRecoParam(),
 fMaxSnp(1.),
 fNSigmaYLayerForRoadY(0),
 fNSigmaRoadY(0),
@@ -89,27 +89,34 @@ fMaxDforV0dghtrForProlongation(0),
 fMaxDForProlongation(0),
 fMaxDZForProlongation(0),
 fMinPtForProlongation(0),
-fAddVirtualClustersInDeadZone(kTRUE),
+fAddVirtualClustersInDeadZone(kFALSE),
 fZWindowDeadZone(0),
 fSigmaXDeadZoneHit2(0),
 fSigmaZDeadZoneHit2(0),
 fXPassDeadZoneHits(0),
-fUseTGeoInTracker(0),
+fUseTGeoInTracker(3),
 fAllowSharedClusters(kTRUE),
 fClusterErrorsParam(1),
 fExtendedEtaAcceptance(kFALSE),
+fUseDeadZonesFromOCDB(kFALSE),
 fFactorSAWindowSizes(1.),
-fFindV0s(kTRUE)
+fFindV0s(kTRUE),
+fUseUnfoldingInClusterFinderSPD(kFALSE),
+fUseUnfoldingInClusterFinderSDD(kTRUE),
+fUseUnfoldingInClusterFinderSSD(kTRUE)
 {
   //
   // constructor
   //
+  SetName("ITS");
+  SetTitle("ITS");
+
   SetLayersParameters();
   for(Int_t i=0; i<AliITSgeomTGeo::kNLayers; i++) fLayersToSkip[i]=0;
-  SetUseTGeoInTracker(0);
+  SetUseTGeoInTracker(3);
   SetAllowSharedClusters(kTRUE);
   SetFindV0s(kTRUE);
-  SetAddVirtualClustersInDeadZone(kTRUE);
+  SetAddVirtualClustersInDeadZone(kFALSE);
   SetUseAmplitudeInfo(kTRUE);
   SetClusterErrorsParam(1);
 }
@@ -199,8 +206,8 @@ AliITSRecoParam *AliITSRecoParam::GetHighFluxParam()
   param->fMaxDZToUseConstraint = 3.;
 
   param->fMaxDforV0dghtrForProlongation = 30.;
-  param->fMaxDForProlongation = 10.;
-  param->fMaxDZForProlongation = 20.;
+  param->fMaxDForProlongation = 40.;//10.;
+  param->fMaxDZForProlongation = 60.;//20.;
   param->fMinPtForProlongation = 0.120;
 
   param->fZWindowDeadZone = 2.0;
index 3b19dfe00a4a7e4d39d26bd2d5cb99bbf3610121..ab5b678258bf0fc4669a27373bf4a056805d0eaa 100644 (file)
 ///////////////////////////////////////////////////////////////////////////////
 
 
-#include "TObject.h"
+#include "AliDetectorRecoParam.h"
 #include "AliITSgeomTGeo.h"
 
-class AliITSRecoParam : public TObject
+class AliITSRecoParam : public AliDetectorRecoParam
 {
  public: 
   AliITSRecoParam();
@@ -125,6 +125,8 @@ class AliITSRecoParam : public TObject
   Bool_t GetUseAmplitudeInfo(Int_t ilay) const { return fUseAmplitudeInfo[ilay]; }
   void   SetExtendedEtaAcceptance(Bool_t ext=kTRUE) { fExtendedEtaAcceptance=ext; return; }
   Bool_t GetExtendedEtaAcceptance() const { return fExtendedEtaAcceptance; }
+  void   SetUseDeadZonesFromOCDB(Bool_t use=kTRUE) { fUseDeadZonesFromOCDB=use; return; }
+  Bool_t GetUseDeadZonesFromOCDB() const { return fUseDeadZonesFromOCDB; }
 
   void   SetFactorSAWindowSizes(Double_t fact=1.) { fFactorSAWindowSizes=fact; return; }
   Double_t GetFactorSAWindowSizes() const { return fFactorSAWindowSizes; }
@@ -137,6 +139,13 @@ class AliITSRecoParam : public TObject
   void   SetLayerToSkip(Int_t i) { fLayersToSkip[i]=1; return; }
   Int_t  GetLayersToSkip(Int_t i) const { return fLayersToSkip[i]; }
 
+  void   SetUseUnfoldingInClusterFinderSPD(Bool_t use=kTRUE) { fUseUnfoldingInClusterFinderSPD=use; return; }
+  Bool_t GetUseUnfoldingInClusterFinderSPD() const { return fUseUnfoldingInClusterFinderSPD; }
+  void   SetUseUnfoldingInClusterFinderSDD(Bool_t use=kTRUE) { fUseUnfoldingInClusterFinderSDD=use; return; }
+  Bool_t GetUseUnfoldingInClusterFinderSDD() const { return fUseUnfoldingInClusterFinderSDD; }
+  void   SetUseUnfoldingInClusterFinderSSD(Bool_t use=kTRUE) { fUseUnfoldingInClusterFinderSSD=use; return; }
+  Bool_t GetUseUnfoldingInClusterFinderSSD() const { return fUseUnfoldingInClusterFinderSSD; }
+
   //
 
   enum {fgkMaxClusterPerLayer=70000}; //7000*10;   // max clusters per layer
@@ -242,10 +251,16 @@ class AliITSRecoParam : public TObject
   Int_t fClusterErrorsParam; // parametrization for cluster errors (MI), see AliITSRecoParam::GetError()
   Bool_t fUseAmplitudeInfo[AliITSgeomTGeo::kNLayers]; // use cluster charge in cluster-track matching (SDD,SSD) (MI)
   Bool_t fExtendedEtaAcceptance;  // enable jumping from TPC to SPD at large eta (MI)
+  Bool_t fUseDeadZonesFromOCDB; // enable using OCDB info on dead modules.. (MI)
   Double_t fFactorSAWindowSizes; // larger window sizes in SA
 
   Bool_t fFindV0s;  // flag to enable V0 finder (MI)
 
+  // cluster unfolding in ITS cluster finders
+  Bool_t fUseUnfoldingInClusterFinderSPD; // SPD
+  Bool_t fUseUnfoldingInClusterFinderSDD; // SDD
+  Bool_t fUseUnfoldingInClusterFinderSSD; // SSD
+
   ClassDef(AliITSRecoParam,1) // ITS reco parameters
 };
 
index 91f0e9529d5311738f353704be48e40a032a23f4..589c783055d4e1fcdbd42164a6ed786898d7a344 100644 (file)
@@ -63,7 +63,7 @@ fLastLayerToTrackTo(0),
 fCoefficients(0),
 fEsd(0),
 fTrackingPhase("Default"),
-fUseTGeo(0),
+fUseTGeo(3),
 fNtracks(0),
 fxOverX0Pipe(-1.),
 fxTimesRhoPipe(-1.),
@@ -95,7 +95,7 @@ fLastLayerToTrackTo(AliITSRecoParam::GetLastLayerToTrackTo()),
 fCoefficients(0),
 fEsd(0),
 fTrackingPhase("Default"),
-fUseTGeo(0),
+fUseTGeo(3),
 fNtracks(0),
 fxOverX0Pipe(-1.),
 fxTimesRhoPipe(-1.),
@@ -187,6 +187,10 @@ fDebugStreamer(0){
   fSPDdetzcentre[3] = tr[2];
 
   fUseTGeo = AliITSReconstructor::GetRecoParam()->GetUseTGeoInTracker();
+  if(AliITSReconstructor::GetRecoParam()->GetExtendedEtaAcceptance() && fUseTGeo!=1 && fUseTGeo!=3) {
+    AliWarning("fUseTGeo changed to 3 because fExtendedEtaAcceptance is kTRUE");
+    fUseTGeo = 3;
+  }
 
   for(Int_t i=0;i<2;i++) {fxOverX0Shield[i]=-1.;fxTimesRhoShield[i]=-1.;}
   for(Int_t i=0;i<6;i++) {fxOverX0Layer[i]=-1.;fxTimesRhoLayer[i]=-1.;}
@@ -300,7 +304,7 @@ Int_t AliITStrackerMI::LoadClusters(TTree *cTree) {
        for (Float_t xdead = 0; xdead < AliITSRecoParam::GetSPDdetxlength(); xdead += (i+1.)*AliITSReconstructor::GetRecoParam()->GetXPassDeadZoneHits()) {
          Int_t lab[4]   = {0,0,0,detector};
          Int_t info[3]  = {0,0,i};
-         Float_t q      = 0.;
+         Float_t q      = 0.; // this identifies virtual clusters
          Float_t hit[5] = {xdead,
                            0.,
                            AliITSReconstructor::GetRecoParam()->GetSigmaXDeadZoneHit2(),
@@ -327,7 +331,7 @@ Int_t AliITStrackerMI::LoadClusters(TTree *cTree) {
          if (TMath::Abs(fgLayers[i].GetDetector(detector).GetZmax()-hit[1])<zwindow) 
            fgLayers[i].InsertCluster(new AliITSRecPoint(lab,hit,info,local));
        }
-      }
+      } // "virtual" clusters in SPD
       
     }
     //
@@ -408,6 +412,8 @@ Int_t AliITStrackerMI::Clusters2Tracks(AliESDEvent *event) {
       }
       t->GetDZ(GetX(),GetY(),GetZ(),t->GetDP());              //I.B.
       Double_t vdist = TMath::Sqrt(t->GetD(0)*t->GetD(0)+t->GetD(1)*t->GetD(1));
+
+
       // look at the ESD mass hypothesys !
       if (t->GetMass()<0.9*pimass) t->SetMass(pimass); 
       // write expected q
@@ -465,6 +471,7 @@ Int_t AliITStrackerMI::Clusters2Tracks(AliESDEvent *event) {
        fI = 6;
        ResetTrackToFollow(*t);
        ResetBestTrack();
+
        FollowProlongationTree(t,fCurrentEsdTrack,fConstraint[fPass]);
 
        SortTrackHypothesys(fCurrentEsdTrack,20,0);  //MI change
@@ -859,16 +866,19 @@ void AliITStrackerMI::FollowProlongationTree(AliITStrackMI * otrack, Int_t esdin
       Double_t budgetToPrimVertex = GetEffectiveThickness();
 
       // check if we allow a prolongation without point
-      Int_t skip = SkipLayer(&currenttrack1,ilayer,idet);
+      Int_t skip = CheckSkipLayer(&currenttrack1,ilayer,idet);
       if (skip) {
        AliITStrackMI* vtrack = new (&tracks[ilayer][ntracks[ilayer]]) AliITStrackMI(currenttrack1);
+       // propagate to the layer radius
+       Double_t xToGo; vtrack->GetLocalXat(r,xToGo);
+       vtrack->AliExternalTrackParam::PropagateTo(xToGo,GetBz());
        // apply correction for material of the current layer
        CorrectForLayerMaterial(vtrack,ilayer,trackGlobXYZ1,"inward");
        vtrack->SetNDeadZone(vtrack->GetNDeadZone()+1);
        vtrack->SetClIndex(ilayer,0);
        if(constrain) vtrack->Improve(budgetToPrimVertex,xyzVtx,ersVtx);
        ntracks[ilayer]++;
-       continue;  //if (skip==1 || skip==2) continue;
+       continue;
       }
 
       // track outside layer acceptance in z
@@ -881,7 +891,7 @@ void AliITStrackerMI::FollowProlongationTree(AliITStrackMI * otrack, Int_t esdin
       currenttrack2.Propagate(det.GetPhi(),det.GetR());
       currenttrack1.SetDetectorIndex(idet);
       currenttrack2.SetDetectorIndex(idet);
-      
+
       //***************
       // DEFINITION OF SEARCH ROAD FOR CLUSTERS SELECTION
       //
@@ -946,13 +956,41 @@ void AliITStrackerMI::FollowProlongationTree(AliITStrackMI * otrack, Int_t esdin
       const AliITSRecPoint *cl=0; 
       Int_t clidx=-1;
       Double_t chi2trkcl=AliITSReconstructor::GetRecoParam()->GetMaxChi2(); // init with big value
-      Int_t deadzone=0;
+      Bool_t deadzoneSPD=kFALSE;
       currenttrack = &currenttrack1;
-      // loop over selected clusters
+
+      // check if the road contains a dead zone and create a prolongation
+      Int_t dead = CheckDeadZone(/*currenttrack,*/ilayer,/*idet,*/zmin,zmax/*,ymin,ymax*/);
+      if (dead) {
+       AliITStrackMI * updatetrack = new (&tracks[ilayer][ntracks[ilayer]]) AliITStrackMI(*currenttrack);
+       updatetrack->SetClIndex(ilayer,0);
+       // apply correction for material of the current layer
+       CorrectForLayerMaterial(updatetrack,ilayer,trackGlobXYZ1,"inward");
+       if (constrain) { // apply vertex constrain
+         updatetrack->SetConstrain(constrain);
+         Bool_t isPrim = kTRUE;
+         if (ilayer<4) { // check that it's close to the vertex
+           updatetrack->GetDZ(GetX(),GetY(),GetZ(),updatetrack->GetDP()); //I.B.
+           if (TMath::Abs(updatetrack->GetD(0)/(1.+ilayer)) > // y
+               AliITSReconstructor::GetRecoParam()->GetMaxDZforPrimTrk() || 
+               TMath::Abs(updatetrack->GetD(1)/(1.+ilayer)) > // z
+               AliITSReconstructor::GetRecoParam()->GetMaxDZforPrimTrk()) isPrim=kFALSE;
+         }
+         if (isPrim) updatetrack->Improve(budgetToPrimVertex,xyzVtx,ersVtx);
+       }
+       updatetrack->SetNDeadZone(updatetrack->GetNDeadZone()+1);
+       if (dead==1) { // dead zone at z=0,+-7cm in SPD
+         updatetrack->SetDeadZoneProbability(GetSPDDeadZoneProbability(updatetrack->GetZ(),TMath::Sqrt(updatetrack->GetSigmaZ2())));
+         deadzoneSPD=kTRUE;
+       }
+       ntracks[ilayer]++;
+      }
+
+      // loop over clusters in the road
       while ((cl=layer.GetNextCluster(clidx))!=0) { 
        if (ntracks[ilayer]>95) break; //space for skipped clusters  
        Bool_t changedet =kFALSE;  
-       if (cl->GetQ()==0 && (deadzone==1)) continue;
+       if (cl->GetQ()==0 && deadzoneSPD==kTRUE) continue;
        Int_t idet=cl->GetDetectorIndex();
 
        if (currenttrack->GetDetectorIndex()==idet) { // track already on the cluster's detector
@@ -987,18 +1025,18 @@ void AliITStrackerMI::FollowProlongationTree(AliITStrackMI * otrack, Int_t esdin
        chi2trkcl = GetPredictedChi2MI(currenttrack,cl,ilayer); 
        // chi2 cut
        if (chi2trkcl < AliITSReconstructor::GetRecoParam()->GetMaxChi2s(ilayer)) {
-         if (cl->GetQ()==0) deadzone=1;            // take dead zone only once   
+         if (cl->GetQ()==0) deadzoneSPD=kTRUE; // only 1 prolongation with virtual cluster       
          if (ntracks[ilayer]>=100) continue;
          AliITStrackMI * updatetrack = new (&tracks[ilayer][ntracks[ilayer]]) AliITStrackMI(*currenttrack);
          updatetrack->SetClIndex(ilayer,0);
          if (changedet) new (&currenttrack2) AliITStrackMI(backuptrack);
          
-         if (cl->GetQ()!=0) {
+         if (cl->GetQ()!=0) { // real cluster
            if (!UpdateMI(updatetrack,cl,chi2trkcl,(ilayer<<28)+clidx)) continue; 
            updatetrack->SetSampledEdx(cl->GetQ(),updatetrack->GetNumberOfClusters()-1); //b.b.
-         } else { // cluster in dead zone
+         } else {             // virtual cluster in dead zone
            updatetrack->SetNDeadZone(updatetrack->GetNDeadZone()+1);
-           updatetrack->SetDeadZoneProbability(GetDeadZoneProbability(updatetrack->GetZ(),TMath::Sqrt(updatetrack->GetSigmaZ2())));
+           updatetrack->SetDeadZoneProbability(GetSPDDeadZoneProbability(updatetrack->GetZ(),TMath::Sqrt(updatetrack->GetSigmaZ2())));
          }
          if (cl->IsUsed()) updatetrack->IncrementNUsed();
 
@@ -1022,7 +1060,7 @@ void AliITStrackerMI::FollowProlongationTree(AliITStrackMI * otrack, Int_t esdin
       } // loop over possible prolongations 
      
       // allow one prolongation without clusters
-      if (constrain && itrack<=1 && currenttrack1.GetNSkipped()==0 && deadzone==0 && ntracks[ilayer]<100) {
+      if (constrain && itrack<=1 && currenttrack1.GetNSkipped()==0 && deadzoneSPD==kFALSE && ntracks[ilayer]<100) {
        AliITStrackMI* vtrack = new (&tracks[ilayer][ntracks[ilayer]]) AliITStrackMI(currenttrack1);
        // apply correction for material of the current layer
        CorrectForLayerMaterial(vtrack,ilayer,trackGlobXYZ1,"inward");
@@ -1075,7 +1113,6 @@ void AliITStrackerMI::FollowProlongationTree(AliITStrackMI * otrack, Int_t esdin
     if (ntracks[ilayer]>90) ntracks[ilayer]=90; 
   } // end loop over layers
 
-  //printf("%d\t%d\t%d\t%d\t%d\t%d\n",ntracks[0],ntracks[1],ntracks[2],ntracks[3],ntracks[4],ntracks[5]);
 
   //
   // Now select tracks to be kept
@@ -1087,7 +1124,9 @@ void AliITStrackerMI::FollowProlongationTree(AliITStrackMI * otrack, Int_t esdin
     AliITStrackMI & track= tracks[0][nindexes[0][i]];
     if (track.GetNumberOfClusters()<2) continue;
     if (!constrain && track.GetNormChi2(0) >
-       AliITSReconstructor::GetRecoParam()->GetMaxNormChi2NonCForHypothesis()) continue;
+       AliITSReconstructor::GetRecoParam()->GetMaxNormChi2NonCForHypothesis()) {
+      continue;
+    }
     AddTrackHypothesys(new AliITStrackMI(track), esdindex);
   }
 
@@ -1108,7 +1147,7 @@ void AliITStrackerMI::FollowProlongationTree(AliITStrackMI * otrack, Int_t esdin
     AddTrackHypothesys(new AliITStrackMI(track), esdindex);
   }
 
-  // tracks that reack layer 2 (SDD inner), only during non-constrained pass
+  // tracks that reach layer 2 (SDD inner), only during non-constrained pass
   if (!constrain){  
     for (Int_t i=0;i<TMath::Min(2,ntracks[2]);i++) {
       AliITStrackMI & track= tracks[2][nindexes[2][i]];
@@ -1582,6 +1621,8 @@ SelectClusters(Double_t zmin,Double_t zmax,Double_t ymin, Double_t ymax) {
   fImax = TMath::Min(FindClusterIndex(zmax)+1,fNcs);
   fSkip = 0;
   fAccepted =0;
+
+  return;
 }
 //------------------------------------------------------------------------
 Int_t AliITStrackerMI::AliITSlayer::
@@ -1595,14 +1636,17 @@ FindDetectorIndex(Double_t phi, Double_t z) const {
   else                       // new geometry
     dphi = phi-fPhiOffset;
 
+
   if      (dphi <  0) dphi += 2*TMath::Pi();
   else if (dphi >= 2*TMath::Pi()) dphi -= 2*TMath::Pi();
   Int_t np=Int_t(dphi*fNladders*0.5/TMath::Pi()+0.5);
   if (np>=fNladders) np-=fNladders;
   if (np<0)          np+=fNladders;
 
+
   Double_t dz=fZOffset-z;
-  Int_t nz=Int_t(dz*(fNdetectors-1)*0.5/fZOffset+0.5);
+  Double_t nnz = dz*(fNdetectors-1)*0.5/fZOffset+0.5;
+  Int_t nz = (nnz<0 ? -1 : (Int_t)nnz);
   if (nz>=fNdetectors) return -1;
   if (nz<0)            return -1;
 
@@ -1806,6 +1850,7 @@ Bool_t AliITStrackerMI::RefitAt(Double_t xx,AliITStrackMI *t,
   // If "extra"==kTRUE, 
   //    the clusters from overlapped modules get attached to "t" 
   //--------------------------------------------------------------------
+
   Int_t index[AliITSgeomTGeo::kNLayers];
   Int_t k;
   for (k=0; k<AliITSgeomTGeo::GetNLayers(); k++) index[k]=-1;
@@ -1815,7 +1860,7 @@ Bool_t AliITStrackerMI::RefitAt(Double_t xx,AliITStrackMI *t,
     index[nl]=idx; 
   }
 
-  // special for cosmics: check which the innermost layer crossed
+  // special for cosmics: check which is the innermost layer crossed
   // by the track
   Int_t innermostlayer=5;
   Double_t d = TMath::Abs(t->GetD(0.,0.));
@@ -1834,12 +1879,12 @@ Bool_t AliITStrackerMI::RefitAt(Double_t xx,AliITStrackMI *t,
   TString dir=(step>0 ? "outward" : "inward");
 
   // loop on the layers
-  for (Int_t i=from; i != to; i += step) {
-     AliITSlayer &layer=fgLayers[i];
+  for (Int_t ilayer=from; ilayer != to; ilayer += step) {
+     AliITSlayer &layer=fgLayers[ilayer];
      Double_t r=layer.GetR();
  
      // material between SSD and SDD, SDD and SPD
-     Double_t hI=i-0.5*step; 
+     Double_t hI=ilayer-0.5*step; 
      if (TMath::Abs(hI-3.5)<0.01) // SDDouter
        if(!CorrectForShieldMaterial(t,"SDD",dir)) return kFALSE;
      if (TMath::Abs(hI-1.5)<0.01) // SPDouter
@@ -1859,6 +1904,26 @@ Bool_t AliITStrackerMI::RefitAt(Double_t xx,AliITStrackMI *t,
      if (!t->GetPhiZat(r,phi,z)) return kFALSE;
 
      Int_t idet=layer.FindDetectorIndex(phi,z);
+
+     // check if we allow a prolongation without point for large-eta tracks
+     Int_t skip = CheckSkipLayer(t,ilayer,idet);
+     if (skip==2) {
+       // propagate to the layer radius
+       Double_t xToGo; t->GetLocalXat(r,xToGo);
+       t->AliExternalTrackParam::PropagateTo(xToGo,GetBz());
+       // apply correction for material of the current layer
+       CorrectForLayerMaterial(t,ilayer,oldGlobXYZ,dir);
+       // track time update [SR, GSI 17.02.2003]
+       if (t->IsStartedTimeIntegral() && step==1) {
+        Double_t newX, newY, newZ;
+        t->GetGlobalXYZat(t->GetX(),newX,newY,newZ);
+        Double_t dL2 = (oldX-newX)*(oldX-newX) + (oldY-newY)*(oldY-newY) + 
+                       (oldZ-newZ)*(oldZ-newZ);
+        t->AddTimeStep(TMath::Sqrt(dL2));
+       }
+       continue;
+     }
+     
      if (idet<0) return kFALSE;
 
      const AliITSdetector &det=layer.GetDetector(idet);
@@ -1869,10 +1934,10 @@ Bool_t AliITStrackerMI::RefitAt(Double_t xx,AliITStrackMI *t,
      const AliITSRecPoint *cl=0;
      Double_t maxchi2=1000.*AliITSReconstructor::GetRecoParam()->GetMaxChi2();
 
-     Int_t idx=index[i];
+     Int_t idx=index[ilayer];
      if (idx>=0) {
         const AliITSRecPoint *c=(AliITSRecPoint *)GetCluster(idx); 
-       if (c){
+       if (c) {
          if (idet != c->GetDetectorIndex()) {
            idet=c->GetDetectorIndex();
            const AliITSdetector &det=layer.GetDetector(idet);
@@ -1900,9 +1965,9 @@ Bool_t AliITStrackerMI::RefitAt(Double_t xx,AliITStrackMI *t,
 
      if (extra) { //search for extra clusters
         AliITStrackV2 tmp(*t);
-        Double_t dz=4*TMath::Sqrt(tmp.GetSigmaZ2()+AliITSReconstructor::GetRecoParam()->GetSigmaZ2(i));
+        Double_t dz=4*TMath::Sqrt(tmp.GetSigmaZ2()+AliITSReconstructor::GetRecoParam()->GetSigmaZ2(ilayer));
         if (dz < 0.5*TMath::Abs(tmp.GetTgl())) dz=0.5*TMath::Abs(tmp.GetTgl());
-        Double_t dy=4*TMath::Sqrt(t->GetSigmaY2()+AliITSReconstructor::GetRecoParam()->GetSigmaY2(i));
+        Double_t dy=4*TMath::Sqrt(t->GetSigmaY2()+AliITSReconstructor::GetRecoParam()->GetSigmaY2(ilayer));
         if (dy < 0.5*TMath::Abs(tmp.GetSnp())) dy=0.5*TMath::Abs(tmp.GetSnp());
         Double_t zmin=t->GetZ() - dz;
         Double_t zmax=t->GetZ() + dz;
@@ -1925,7 +1990,7 @@ Bool_t AliITStrackerMI::RefitAt(Double_t xx,AliITStrackMI *t,
            Double_t chi2=tmp.GetPredictedChi2(c);
            if (chi2<maxchi2) { maxchi2=chi2; cci=ci; }
         }
-        if (cci>=0) t->SetExtraCluster(i,(i<<28)+cci);
+        if (cci>=0) t->SetExtraCluster(ilayer,(ilayer<<28)+cci);
      }
 
      // track time update [SR, GSI 17.02.2003]
@@ -1939,7 +2004,7 @@ Bool_t AliITStrackerMI::RefitAt(Double_t xx,AliITStrackMI *t,
      //
 
      // Correct for material of the current layer
-     if(!CorrectForLayerMaterial(t,i,oldGlobXYZ,dir)) return kFALSE;
+     if(!CorrectForLayerMaterial(t,ilayer,oldGlobXYZ,dir)) return kFALSE;
 
   } // end loop on the layers
 
@@ -1979,13 +2044,13 @@ AliITStrackerMI::RefitAt(Double_t xx,AliITStrackMI *t,const Int_t *clindex) {
   }
   TString dir=(step>0 ? "outward" : "inward");
 
-  for (Int_t i=from; i != to; i += step) {
-     AliITSlayer &layer=fgLayers[i];
+  for (Int_t ilayer=from; ilayer != to; ilayer += step) {
+     AliITSlayer &layer=fgLayers[ilayer];
      Double_t r=layer.GetR();
      if (step<0 && xx>r) break;
 
      // material between SSD and SDD, SDD and SPD
-     Double_t hI=i-0.5*step; 
+     Double_t hI=ilayer-0.5*step; 
      if (TMath::Abs(hI-3.5)<0.01) // SDDouter
        if(!CorrectForShieldMaterial(t,"SDD",dir)) return kFALSE;
      if (TMath::Abs(hI-1.5)<0.01) // SPDouter
@@ -2004,6 +2069,26 @@ AliITStrackerMI::RefitAt(Double_t xx,AliITStrackMI *t,const Int_t *clindex) {
      if (!t->GetPhiZat(r,phi,z)) return kFALSE;
 
      Int_t idet=layer.FindDetectorIndex(phi,z);
+
+     // check if we allow a prolongation without point for large-eta tracks
+     Int_t skip = CheckSkipLayer(t,ilayer,idet);
+     if (skip==2) {
+       // propagate to the layer radius
+       Double_t xToGo; t->GetLocalXat(r,xToGo);
+       t->AliExternalTrackParam::PropagateTo(xToGo,GetBz());
+       // apply correction for material of the current layer
+       CorrectForLayerMaterial(t,ilayer,oldGlobXYZ,dir);
+       // track time update [SR, GSI 17.02.2003]
+       if (t->IsStartedTimeIntegral() && step==1) {
+        Double_t newX, newY, newZ;
+        t->GetGlobalXYZat(t->GetX(),newX,newY,newZ);
+        Double_t dL2 = (oldX-newX)*(oldX-newX) + (oldY-newY)*(oldY-newY) + 
+                       (oldZ-newZ)*(oldZ-newZ);
+        t->AddTimeStep(TMath::Sqrt(dL2));
+       }
+       continue;
+     }
+
      if (idet<0) return kFALSE;
      const AliITSdetector &det=layer.GetDetector(idet);
      phi=det.GetPhi();
@@ -2013,7 +2098,7 @@ AliITStrackerMI::RefitAt(Double_t xx,AliITStrackMI *t,const Int_t *clindex) {
      const AliITSRecPoint *cl=0;
      Double_t maxchi2=1000.*AliITSReconstructor::GetRecoParam()->GetMaxChi2();
 
-     Int_t idx=index[i];
+     Int_t idx=index[ilayer];
      if (idx>=0) {
         const AliITSRecPoint *c=(AliITSRecPoint *)GetCluster(idx); 
        if (c){
@@ -2043,7 +2128,7 @@ AliITStrackerMI::RefitAt(Double_t xx,AliITStrackMI *t,const Int_t *clindex) {
      }
 
      // Correct for material of the current layer
-     if(!CorrectForLayerMaterial(t,i,oldGlobXYZ,dir)) return kFALSE;
+     if(!CorrectForLayerMaterial(t,ilayer,oldGlobXYZ,dir)) return kFALSE;
                  
      // track time update [SR, GSI 17.02.2003]
      if (t->IsStartedTimeIntegral() && step==1) {
@@ -2203,7 +2288,7 @@ Double_t AliITStrackerMI::GetMatchingChi2(AliITStrackMI * track1, AliITStrackMI
   return chi2(0,0);
 }
 //------------------------------------------------------------------------
-Double_t  AliITStrackerMI::GetDeadZoneProbability(Double_t zpos, Double_t zerr)
+Double_t  AliITStrackerMI::GetSPDDeadZoneProbability(Double_t zpos, Double_t zerr)
 {
   //
   //  return probability that given point (characterized by z position and error) 
@@ -3079,7 +3164,7 @@ AliITStrackMI * AliITStrackerMI::GetBestHypothesys(Int_t esdindex, AliITStrackMI
   AliITStrackMI *longtrack =0;
   minchi2 =1000;
   Float_t minn=besttrack->GetNumberOfClusters()+besttrack->GetNDeadZone();
-  for (Int_t itrack=entries-1;itrack>0;itrack--){
+  for (Int_t itrack=entries-1;itrack>0;itrack--) {
     AliITStrackMI * track = (AliITStrackMI*)array->At(itrack);
     if (!track->GetConstrain()) continue;
     if (track->GetNumberOfClusters()+track->GetNDeadZone()<minn) continue;
@@ -4512,7 +4597,6 @@ Int_t AliITStrackerMI::CorrectForShieldMaterial(AliITStrackMI *t,
     shieldindex=0;
   } else {
     Error("CorrectForShieldMaterial"," Wrong shield name\n");
-    //    printf("%s\n",shield.Data());
     return 0;
   }
   Double_t xToGo; t->GetLocalXat(rToGo,xToGo);
@@ -4714,8 +4798,8 @@ void AliITStrackerMI::DeleteTrksMaterialLUT() {
   return;
 }
 //------------------------------------------------------------------------
-Int_t AliITStrackerMI::SkipLayer(AliITStrackMI *track,
-                                Int_t ilayer,Int_t idet) const {
+Int_t AliITStrackerMI::CheckSkipLayer(AliITStrackMI *track,
+                                     Int_t ilayer,Int_t idet) const {
   //-----------------------------------------------------------------
   // This method is used to decide whether to allow a prolongation 
   // without clusters, because we want to skip the layer.
@@ -4729,7 +4813,7 @@ Int_t AliITStrackerMI::SkipLayer(AliITStrackMI *track,
   if (idet<0 && ilayer>1 && AliITSReconstructor::GetRecoParam()->GetExtendedEtaAcceptance()) {
     // check if track will cross SPD outer layer
     Double_t phiAtSPD2,zAtSPD2;
-    if(track->GetPhiZat(fgLayers[1].GetR(),phiAtSPD2,zAtSPD2)) {
+    if (track->GetPhiZat(fgLayers[1].GetR(),phiAtSPD2,zAtSPD2)) {
       if (TMath::Abs(zAtSPD2)<2.*AliITSRecoParam::GetSPDdetzlength()) return 2;
     }
   }
@@ -4737,3 +4821,36 @@ Int_t AliITStrackerMI::SkipLayer(AliITStrackMI *track,
   return 0;
 }
 //------------------------------------------------------------------------
+Int_t AliITStrackerMI::CheckDeadZone(/*AliITStrackMI *track,*/
+                                    Int_t ilayer,/*Int_t idet,*/
+                                    Double_t zmin,Double_t zmax/*,Double_t ymin,Double_t ymax*/) const {
+  //-----------------------------------------------------------------
+  // This method is used to decide whether to allow a prolongation 
+  // without clusters, because there is dead zone in the road.
+  // In this case the return value is > 0:
+  // return 1: dead zone at z=0,+-7cm in SPD
+  // return 2: dead area from the OCDB
+  //-----------------------------------------------------------------
+
+  // check dead zones at z=0,+-7cm in the SPD
+  if (ilayer<2 && !AliITSReconstructor::GetRecoParam()->GetAddVirtualClustersInDeadZone()) {
+    Double_t zmindead[3]={fSPDdetzcentre[0] + 0.5*AliITSRecoParam::GetSPDdetzlength(),
+                         fSPDdetzcentre[1] + 0.5*AliITSRecoParam::GetSPDdetzlength(),
+                         fSPDdetzcentre[2] + 0.5*AliITSRecoParam::GetSPDdetzlength()};
+    Double_t zmaxdead[3]={fSPDdetzcentre[1] - 0.5*AliITSRecoParam::GetSPDdetzlength(),
+                         fSPDdetzcentre[2] - 0.5*AliITSRecoParam::GetSPDdetzlength(),
+                         fSPDdetzcentre[3] - 0.5*AliITSRecoParam::GetSPDdetzlength()};
+    for (Int_t i=0; i<3; i++)
+      if (zmin<zmaxdead[i] && zmax>zmindead[i]) return 1;
+     
+  }
+
+  if (AliITSReconstructor::GetRecoParam()->GetUseDeadZonesFromOCDB()) {
+    // NOT YET IMPLEMENTED
+    // look in OCDB
+    //if (deadfromOCDB) return 2;
+  }
+
+  return 0;
+}
+//------------------------------------------------------------------------
index c41eaff4800fddcc9efc48a3b53dfe2beac910e1..6f5eed6dc6beecb4f1c27122e8502d74107aaa18 100644 (file)
@@ -87,7 +87,7 @@ public:
     void  SortClusters();
     void ResetClusters();
     void ResetWeights();
-    void SelectClusters(Double_t zmi,Double_t zma,Double_t ymi,Double_t yma);
+    void SelectClusters(Double_t zmin,Double_t zmax,Double_t ymin,Double_t ymax);
     const AliITSRecPoint *GetNextCluster(Int_t &ci);
     void ResetRoad();
     Double_t GetRoad() const {return fRoad;}
@@ -194,7 +194,7 @@ protected:
   Double_t NormalizedChi2(AliITStrackMI * track, Int_t layer);
   Double_t GetInterpolatedChi2(AliITStrackMI * forwardtrack, AliITStrackMI * backtrack);  
   Double_t GetMatchingChi2(AliITStrackMI * track1, AliITStrackMI * track2);
-  Double_t GetDeadZoneProbability(Double_t zpos, Double_t zerr);
+  Double_t GetSPDDeadZoneProbability(Double_t zpos, Double_t zerr);
 
   Float_t    *GetWeight(Int_t index);
   void AddTrackHypothesys(AliITStrackMI * track, Int_t esdindex);
@@ -219,7 +219,8 @@ protected:
   Int_t CorrectForShieldMaterial(AliITStrackMI *t, TString shield, TString direction="inward");
   Int_t CorrectForLayerMaterial(AliITStrackMI *t, Int_t layerindex, Double_t oldGlobXYZ[3], TString direction="inward");
   void UpdateESDtrack(AliITStrackMI* track, ULong_t flags) const;
-  Int_t SkipLayer(AliITStrackMI *track,Int_t ilayer,Int_t idet) const;
+  Int_t CheckSkipLayer(AliITStrackMI *track,Int_t ilayer,Int_t idet) const;
+  Int_t CheckDeadZone(/*AliITStrackMI *track,*/Int_t ilayer,/*Int_t idet,*/Double_t zmin,Double_t zmax/*,Double_t ymin,Double_t ymax*/) const;
   Int_t fI;                              // index of the current layer
   static AliITSlayer fgLayers[AliITSgeomTGeo::kNLayers];// ITS layers
   AliITStrackMI fTracks[AliITSgeomTGeo::kNLayers];      // track estimations at the ITS layers