AliITStrackMI::AliITStrackMI():AliITStrackV2(),
fNUsed(0),
fNSkipped(0),
-fNDeadZone(0),
-fDeadZoneProbability(0),
+fNDeadZone(0),
fReconstructed(kFALSE),
fExpQ(40),
fChi22(0),
{
//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;
fNUsed(0),
fNSkipped(0),
fNDeadZone(0),
-fDeadZoneProbability(0),
fReconstructed(kFALSE),
fExpQ(40),
fChi22(0),
// 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;
fNUsed(t.fNUsed),
fNSkipped(t.fNSkipped),
fNDeadZone(t.fNDeadZone),
-fDeadZoneProbability(t.fDeadZoneProbability),
fReconstructed(t.fReconstructed),
fExpQ(t.fExpQ),
fChi22(t.fChi22),
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];}
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();
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
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
// 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
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);
}
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]++;
}
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
}
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
}
}
}
}
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()));
// 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
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;