Improved treatment of dead areas in track chi2 calculation (A. Dainese)
authormasera <masera@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 1 Jul 2009 08:22:36 +0000 (08:22 +0000)
committermasera <masera@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 1 Jul 2009 08:22:36 +0000 (08:22 +0000)
ITS/AliITStrackMI.cxx
ITS/AliITStrackMI.h
ITS/AliITStrackerMI.cxx

index 3eb1f7195b2d2f30c38bc221c48f9d7667f3d1e7..715b4eaa14612c7e70d74c6a57e37220397a2342 100644 (file)
@@ -39,8 +39,7 @@ const Int_t kWARN=5;
 AliITStrackMI::AliITStrackMI():AliITStrackV2(),
 fNUsed(0),
 fNSkipped(0),
-fNDeadZone(0),
-fDeadZoneProbability(0),                              
+fNDeadZone(0),                        
 fReconstructed(kFALSE),
 fExpQ(40),
 fChi22(0),
@@ -50,7 +49,7 @@ fGoldV0(kFALSE)
 {
   //constructor
     for(Int_t i=0; i<AliITSgeomTGeo::GetNLayers(); i++) fClIndex[i]=-1;
-    for(Int_t i=0; i<6; i++) { fNy[i]=0; fNz[i]=0; fNormQ[i]=0; fNormChi2[i]=1000;}
+    for(Int_t i=0; i<6; i++) { fNy[i]=0; fNz[i]=0; fNormQ[i]=0; fNormChi2[i]=1000; fDeadZoneProbability[i]=0;}
     for(Int_t i=0; i<12; i++) {fDy[i]=0; fDz[i]=0; fSigmaY[i]=0; fSigmaZ[i]=0; fChi2MIP[i]=0;}
     fD[0]=0; fD[1]=0;
     fDnorm[0]=0; fDnorm[1]=0;
@@ -62,7 +61,6 @@ AliITStrackV2(t,c),
 fNUsed(0),
 fNSkipped(0),
 fNDeadZone(0),
-fDeadZoneProbability(0),                              
 fReconstructed(kFALSE),
 fExpQ(40),
 fChi22(0),
@@ -73,7 +71,7 @@ fGoldV0(kFALSE) {
   // Conversion ESD track -> ITS track.
   // If c==kTRUE, create the ITS track out of the constrained params.
   //------------------------------------------------------------------
-  for(Int_t i=0; i<6; i++) {fClIndex[i]=-1; fNy[i]=0; fNz[i]=0; fNormQ[i]=0; fNormChi2[i]=1000;}
+  for(Int_t i=0; i<6; i++) {fClIndex[i]=-1; fNy[i]=0; fNz[i]=0; fNormQ[i]=0; fNormChi2[i]=1000; fDeadZoneProbability[i]=0;}
   for(Int_t i=0; i<12; i++) {fDy[i]=0; fDz[i]=0; fSigmaY[i]=0; fSigmaZ[i]=0;fChi2MIP[i]=0;}
   fD[0]=0; fD[1]=0;
   fDnorm[0]=0; fDnorm[1]=0;
@@ -86,7 +84,6 @@ AliITStrackMI::AliITStrackMI(const AliITStrackMI& t) : AliITStrackV2(t),
 fNUsed(t.fNUsed),
 fNSkipped(t.fNSkipped),
 fNDeadZone(t.fNDeadZone),
-fDeadZoneProbability(t.fDeadZoneProbability),                         
 fReconstructed(t.fReconstructed),
 fExpQ(t.fExpQ),
 fChi22(t.fChi22),
@@ -102,7 +99,7 @@ fGoldV0(t.fGoldV0) {
   fD[0]=t.fD[0]; fD[1]=t.fD[1];
   fDnorm[0] = t.fDnorm[0]; fDnorm[1]=t.fDnorm[1];
   for(Int_t i=0; i<6; i++) {
-    fClIndex[i]= t.fClIndex[i]; fNy[i]=t.fNy[i]; fNz[i]=t.fNz[i]; fNormQ[i]=t.fNormQ[i]; fNormChi2[i] = t.fNormChi2[i];
+    fClIndex[i]= t.fClIndex[i]; fNy[i]=t.fNy[i]; fNz[i]=t.fNz[i]; fNormQ[i]=t.fNormQ[i]; fNormChi2[i] = t.fNormChi2[i];  fDeadZoneProbability[i]=t.fDeadZoneProbability[i];
   }
   for(Int_t i=0; i<12; i++) {fDy[i]=t.fDy[i]; fDz[i]=t.fDz[i]; 
     fSigmaY[i]=t.fSigmaY[i]; fSigmaZ[i]=t.fSigmaZ[i];fChi2MIP[i]=t.fChi2MIP[i];}
index 07c62a126048df1b9d19b609196e3d5cdee87126..9d96868065bb0400e1edd37afbbb84bcdf7e5be8 100644 (file)
@@ -93,8 +93,8 @@ public:
   void SetGoldV0(Bool_t g) {fGoldV0=g;}
   Float_t GetChi22() const {return fChi22;}
   void SetChi22(Float_t c) {fChi22=c;}
-  Float_t GetDeadZoneProbability() const {return fDeadZoneProbability;}
-  void SetDeadZoneProbability(Float_t d) {fDeadZoneProbability=d;}
+  Float_t GetDeadZoneProbability(Int_t ilayer) const {return fDeadZoneProbability[ilayer];}
+  void SetDeadZoneProbability(Int_t ilayer,Float_t d) {fDeadZoneProbability[ilayer]=d;}
 
   Double_t GetPredictedChi2MI(Double_t cy, Double_t cz, Double_t cerry, Double_t cerrz) const;
   Bool_t IsGoldPrimary();
@@ -103,7 +103,7 @@ protected:
   Float_t fNUsed;                          // number of shared clusters
   Float_t fNSkipped;                       // number of skipped clusters
   Float_t fNDeadZone;                     // number of clusters in dead zone
-  Float_t fDeadZoneProbability;          // probability to cross dead zone
+  Float_t fDeadZoneProbability[6];        // probability to cross dead zone
   Bool_t  fReconstructed;                 // reconstructed - accepted flag
   Float_t fChi2MIP[12];                   // MIP chi squres 
 
@@ -123,7 +123,7 @@ protected:
   Bool_t fConstrain;        //indication of the vertex constrain
   Int_t  fClIndex[6];       //cluster Index
   Bool_t fGoldV0;           //corresponding gold V0 found
-  ClassDef(AliITStrackMI,1)   //ITS reconstructed track
+  ClassDef(AliITStrackMI,2)   //ITS reconstructed track
 };
 
 #endif
index 14584171006849b22b76af3842a2450fcb7f3255..996b08d1c2020db9dcbb721bf4b160ff603191d5 100644 (file)
@@ -1004,6 +1004,7 @@ void AliITStrackerMI::FollowProlongationTree(AliITStrackMI * otrack, Int_t esdin
        // apply correction for material of the current layer
        CorrectForLayerMaterial(vtrack,ilayer,trackGlobXYZ1,"inward");
        vtrack->SetNDeadZone(vtrack->GetNDeadZone()+1);
+       vtrack->SetDeadZoneProbability(ilayer,1.); // no penalty for missing cluster
        vtrack->SetClIndex(ilayer,-1);
        modstatus = (skip==1 ? 3 : 4); // skipped : out in z
        if(LocalModuleCoord(ilayer,idet,vtrack,xloc,zloc)) { // local module coords
@@ -1084,7 +1085,7 @@ void AliITStrackerMI::FollowProlongationTree(AliITStrackMI * otrack, Int_t esdin
          modstatus = 5; // no cls in road
        } else if (dead==1) {
          modstatus = 7; // holes in z in SPD
-       } else if (dead==2 || dead==3) {
+       } else if (dead==2 || dead==3 || dead==4) {
          modstatus = 2; // dead from OCDB
        }
        updatetrack->SetModuleIndexInfo(ilayer,idet,modstatus,xloc,zloc);
@@ -1102,12 +1103,16 @@ void AliITStrackerMI::FollowProlongationTree(AliITStrackMI * otrack, Int_t esdin
          }
          if (isPrim) updatetrack->Improve(budgetToPrimVertex,xyzVtx,ersVtx);
        }
+       updatetrack->SetNDeadZone(updatetrack->GetNDeadZone()+1);
        if (dead) {
-         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())));
+           updatetrack->SetDeadZoneProbability(ilayer,GetSPDDeadZoneProbability(updatetrack->GetZ(),TMath::Sqrt(updatetrack->GetSigmaZ2())));
            deadzoneSPD=kTRUE;
-         }
+         } else if (dead==2 || dead==3) { // dead module or chip from OCDB  
+           updatetrack->SetDeadZoneProbability(ilayer,1.); 
+         } else if (dead==4) { // at least a single dead channel from OCDB  
+           updatetrack->SetDeadZoneProbability(ilayer,0.); 
+         } 
        }
        ntracks[ilayer]++;
       }
@@ -1176,7 +1181,7 @@ void AliITStrackerMI::FollowProlongationTree(AliITStrackMI * otrack, Int_t esdin
            modstatus = 1; // found
          } else {             // virtual cluster in dead zone
            updatetrack->SetNDeadZone(updatetrack->GetNDeadZone()+1);
-           updatetrack->SetDeadZoneProbability(GetSPDDeadZoneProbability(updatetrack->GetZ(),TMath::Sqrt(updatetrack->GetSigmaZ2())));
+           updatetrack->SetDeadZoneProbability(ilayer,GetSPDDeadZoneProbability(updatetrack->GetZ(),TMath::Sqrt(updatetrack->GetSigmaZ2())));
            modstatus = 7; // holes in z in SPD
          }
 
@@ -2286,7 +2291,7 @@ Bool_t AliITStrackerMI::RefitAt(Double_t xx,AliITStrackMI *track,
         dy = 0.5*(ymax-ymin);
         Int_t dead = CheckDeadZone(track,ilayer,idet,dz,dy,kTRUE);
         if (dead==1) modstatus = 7; // holes in z in SPD
-        if (dead==2 || dead==3) modstatus = 2; // dead from OCDB
+        if (dead==2 || dead==3 || dead==4) modstatus = 2; // dead from OCDB
        }
      }
      
@@ -2433,7 +2438,22 @@ Double_t AliITStrackerMI::GetNormalizedChi2(AliITStrackMI * track, Int_t mode)
     }
   }
   if (match<0) match=0;
-  Float_t deadzonefactor = (track->GetNDeadZone()>0) ? 3*(1.1-track->GetDeadZoneProbability()):0.;
+
+  // penalty factor for missing points (NDeadZone>0), but no penalty
+  // for layer with deadZoneProb close to 1 (either we wanted to skip layer
+  // or there is a dead from OCDB)
+  Float_t deadzonefactor = 0.; 
+  if (track->GetNDeadZone()>0.) {    
+    Float_t sumDeadZoneProbability=0; 
+    for(Int_t ilay=0;ilay<6;ilay++) sumDeadZoneProbability+=track->GetDeadZoneProbability(ilay);
+    Float_t nDeadZoneWithProbNot1=(Float_t)(track->GetNDeadZone())-sumDeadZoneProbability;
+    if(nDeadZoneWithProbNot1>0.) {
+      Float_t deadZoneProbability = sumDeadZoneProbability - (Float_t)((Int_t)sumDeadZoneProbability);
+      deadZoneProbability /= nDeadZoneWithProbNot1;
+      deadzonefactor = 3.*(1.1-deadZoneProbability);  
+    }
+  }  
+
   Double_t normchi2 = 2*track->GetNSkipped()+match+deadzonefactor+(1+(2*track->GetNSkipped()+deadzonefactor)/track->GetNumberOfClusters())*
     (chi2)/TMath::Max(double(sum-track->GetNSkipped()),
                                1./(1.+track->GetNSkipped()));     
@@ -4218,7 +4238,8 @@ Int_t AliITStrackerMI::CheckDeadZone(AliITStrackMI *track,
   // In this case the return value is > 0:
   // return 1: dead zone at z=0,+-7cm in SPD
   // return 2: all road is "bad" (dead or noisy) from the OCDB
-  // return 3: something "bad" (dead or noisy) from the OCDB
+  // return 3: at least a chip is "bad" (dead or noisy) from the OCDB
+  // return 4: at least a single channel is "bad" (dead or noisy) from the OCDB
   //-----------------------------------------------------------------
 
   // check dead zones at z=0,+-7cm in the SPD
@@ -4326,7 +4347,7 @@ Int_t AliITStrackerMI::CheckDeadZone(AliITStrackMI *track,
 
   if (fITSChannelStatus->AnyBadInRoad(idetInITS,zlocmin,zlocmax,xlocmin,xlocmax)) {
     AliDebug(2,Form("Bad channel in det %d of layer %d\n",idet,ilayer));
-    return 3;
+    return 4;
   }
   //if (fITSChannelStatus->FractionOfBadInRoad(idet,zlocmin,zlocmax,xlocmin,xlocmax) > AliITSReconstructor::GetRecoParam()->GetMinFractionOfBadInRoad()) return 3;