#include <TTreeStream.h>
#include "AliLog.h"
+#include "AliGeomManager.h"
#include "AliITSPlaneEff.h"
-#include "AliITSCalibrationSPD.h"
-#include "AliITSCalibrationSDD.h"
-#include "AliITSCalibrationSSD.h"
-#include "AliCDBEntry.h"
-#include "AliCDBManager.h"
-#include "AliAlignObj.h"
#include "AliTrackPointArray.h"
-#include "AliESDVertex.h"
#include "AliESDEvent.h"
#include "AliESDtrack.h"
#include "AliV0.h"
-#include "AliHelix.h"
#include "AliITSChannelStatus.h"
#include "AliITSDetTypeRec.h"
#include "AliITSRecPoint.h"
#include "AliITSPlaneEffSSD.h"
#include "AliITSV0Finder.h"
#include "AliITStrackerMI.h"
+#include "AliMathBase.h"
ClassImp(AliITStrackerMI)
for(i=0;i<4;i++) fSPDdetzcentre[i]=0.;
for(i=0;i<2;i++) {fxOverX0Shield[i]=-1.;fxTimesRhoShield[i]=-1.;}
for(i=0;i<6;i++) {fxOverX0Layer[i]=-1.;fxTimesRhoLayer[i]=-1.;}
+ fOriginal.SetOwner();
}
//------------------------------------------------------------------------
AliITStrackerMI::AliITStrackerMI(const Char_t *geom) : AliTracker(),
AliWarning("\"geom\" is actually a dummy argument !");
}
+ fOriginal.SetOwner();
fCoefficients = 0;
fAfterV0 = kFALSE;
Int_t ndet=AliITSgeomTGeo::GetNDetectors(i);
Double_t xyz[3], &x=xyz[0], &y=xyz[1], &z=xyz[2];
- AliITSgeomTGeo::GetOrigTranslation(i,1,1,xyz);
+ AliITSgeomTGeo::GetTranslation(i,1,1,xyz);
Double_t poff=TMath::ATan2(y,x);
Double_t zoff=z;
+
+ AliITSgeomTGeo::GetOrigTranslation(i,1,1,xyz);
Double_t r=TMath::Sqrt(x*x + y*y);
AliITSgeomTGeo::GetOrigTranslation(i,1,2,xyz);
}
// store positions of centre of SPD modules (in z)
+ // The convetion is that fSPDdetzcentre is ordered from -z to +z
Double_t tr[3];
- AliITSgeomTGeo::GetTranslation(1,1,1,tr);
- fSPDdetzcentre[0] = tr[2];
- AliITSgeomTGeo::GetTranslation(1,1,2,tr);
- fSPDdetzcentre[1] = tr[2];
- AliITSgeomTGeo::GetTranslation(1,1,3,tr);
- fSPDdetzcentre[2] = tr[2];
- AliITSgeomTGeo::GetTranslation(1,1,4,tr);
- fSPDdetzcentre[3] = tr[2];
+ if (tr[2]<0) { // old geom (up to v5asymmPPR)
+ AliITSgeomTGeo::GetTranslation(1,1,1,tr);
+ fSPDdetzcentre[0] = tr[2];
+ AliITSgeomTGeo::GetTranslation(1,1,2,tr);
+ fSPDdetzcentre[1] = tr[2];
+ AliITSgeomTGeo::GetTranslation(1,1,3,tr);
+ fSPDdetzcentre[2] = tr[2];
+ AliITSgeomTGeo::GetTranslation(1,1,4,tr);
+ fSPDdetzcentre[3] = tr[2];
+ } else { // new geom (from v11Hybrid)
+ AliITSgeomTGeo::GetTranslation(1,1,4,tr);
+ fSPDdetzcentre[0] = tr[2];
+ AliITSgeomTGeo::GetTranslation(1,1,3,tr);
+ fSPDdetzcentre[1] = tr[2];
+ AliITSgeomTGeo::GetTranslation(1,1,2,tr);
+ fSPDdetzcentre[2] = tr[2];
+ AliITSgeomTGeo::GetTranslation(1,1,1,tr);
+ fSPDdetzcentre[3] = tr[2];
+ }
fUseTGeo = AliITSReconstructor::GetRecoParam()->GetUseTGeoInTracker();
if(AliITSReconstructor::GetRecoParam()->GetExtendedEtaAcceptance() && fUseTGeo!=1 && 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.;}
- fDebugStreamer = new TTreeSRedirector("ITSdebug.root");
+ if (AliITSReconstructor::GetRecoParam()->GetESDV0Params()->StreamLevel()>0)
+ fDebugStreamer = new TTreeSRedirector("ITSdebug.root");
// only for plane efficiency evaluation
if (AliITSReconstructor::GetRecoParam()->GetComputePlaneEff() &&
fkDetTypeRec(tracker.fkDetTypeRec),
fPlaneEff(tracker.fPlaneEff) {
//Copy constructor
+ fOriginal.SetOwner();
Int_t i;
for(i=0;i<4;i++) {
fSPDdetzcentre[i]=tracker.fSPDdetzcentre[i];
// add dead zone "virtual" cluster in SPD, if there is a cluster within
// zwindow cm from the dead zone
+ // This method assumes that fSPDdetzcentre is ordered from -z to +z
if (i<2 && AliITSReconstructor::GetRecoParam()->GetAddVirtualClustersInDeadZone()) {
for (Float_t xdead = 0; xdead < AliITSRecoParam::GetSPDdetxlength(); xdead += (i+1.)*AliITSReconstructor::GetRecoParam()->GetXPassDeadZoneHits()) {
Int_t lab[4] = {0,0,0,detector};
if(AliITSReconstructor::GetRecoParam()->GetFindV0s()) AliITSV0Finder::FindV02(event,this);
fAfterV0 = kTRUE;
//
- itsTracks.Delete();
+ itsTracks.Clear();
//
Int_t entries = fTrackHypothesys.GetEntriesFast();
for (Int_t ientry=0; ientry<entries; ientry++) {
}
fTrackHypothesys.Delete();
+ entries = fBestHypothesys.GetEntriesFast();
+ for (Int_t ientry=0; ientry<entries; ientry++) {
+ TObjArray * array =(TObjArray*)fBestHypothesys.UncheckedAt(ientry);
+ if (array) array->Delete();
+ delete fBestHypothesys.RemoveAt(ientry);
+ }
fBestHypothesys.Delete();
fOriginal.Clear();
delete [] fCoefficients;
TObjArray *bestarray = (TObjArray*)fBestHypothesys.At(esdindex);
if (!bestarray){
bestarray = new TObjArray(5);
+ bestarray->SetOwner();
fBestHypothesys.AddAt(bestarray,esdindex);
}
while ((cl=layer.GetNextCluster(clidx))!=0) {
if (ntracks[ilayer]>95) break; //space for skipped clusters
Bool_t changedet =kFALSE;
- if (cl->GetQ()==0 && deadzoneSPD==kTRUE) continue;
+ if (TMath::Abs(cl->GetQ())<1.e-13 && deadzoneSPD==kTRUE) continue;
Int_t idetc=cl->GetDetectorIndex();
if (currenttrack->GetDetectorIndex()==idetc) { // track already on the cluster's detector
// chi2 cut
AliDebug(2,Form("chi2 %f max %f",chi2trkcl,AliITSReconstructor::GetRecoParam()->GetMaxChi2s(ilayer)));
if (chi2trkcl < AliITSReconstructor::GetRecoParam()->GetMaxChi2s(ilayer)) {
- if (cl->GetQ()==0) deadzoneSPD=kTRUE; // only 1 prolongation with virtual cluster
+ if (TMath::Abs(cl->GetQ())<1.e-13) 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,-1);
if (changedet) new (¤ttrack2) AliITStrackMI(backuptrack);
- if (cl->GetQ()!=0) { // real cluster
+ if (TMath::Abs(cl->GetQ())>1.e-13) { // real cluster
if (!UpdateMI(updatetrack,cl,chi2trkcl,(ilayer<<28)+clidx)) {
AliDebug(2,"update failed");
continue;
} // loop over possible prolongations
// allow one prolongation without clusters
- if (constrain && itrack<=1 && currenttrack1.GetNSkipped()==0 && deadzoneSPD==kFALSE && ntracks[ilayer]<100) {
+ if (constrain && itrack<=1 && TMath::Abs(currenttrack1.GetNSkipped())<1.e-13 && 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");
Double_t dz=fZOffset-z;
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;
+ if (nz>=fNdetectors || nz<0) {
+ //printf("ndet %d phi %f z %f np %d nz %d\n",fNdetectors,phi,z,np,nz);
+ return -1;
+ }
// ad hoc correction for 3rd ladder of SDD inner layer,
// which is reversed (rotated by pi around local y)
if (z+fNMaxSigmaCl*TMath::Sqrt(fClusters[i]->GetSigmaZ2())<fZmin+fNMaxSigmaCl*fMaxSigmaClZ) continue;
if (z-fNMaxSigmaCl*TMath::Sqrt(fClusters[i]->GetSigmaZ2())>fZmax-fNMaxSigmaCl*fMaxSigmaClZ) continue;
//
- if (fClusters[i]->GetQ()==0&&fSkip==2) continue;
+ if (TMath::Abs(fClusters[i]->GetQ())<1.e-13 && fSkip==2) continue;
ci=i;
if (!test) fI=i+1;
return fClusters[i];
for (Int_t i=fI; i<fImax; i++) {
if (fYcs[i]<fYmin) continue;
if (fYcs[i]>fYmax) continue;
- if (fClustersCs[i]->GetQ()==0&&fSkip==2) continue;
+ if (TMath::Abs(fClustersCs[i]->GetQ())<1.e-13 && fSkip==2) continue;
ci=fClusterIndexCs[i];
if (!test) fI=i+1;
return fClustersCs[i];
index[k]=clusters[k];
}
- // special for cosmics: check which the innermost layer crossed
- // by the track
- Int_t innermostlayer=5;
- Double_t drphi = TMath::Abs(track->GetD(0.,0.));
- for(innermostlayer=0; innermostlayer<AliITSgeomTGeo::GetNLayers(); innermostlayer++) {
- if(drphi < fgLayers[innermostlayer].GetR()) break;
+ // special for cosmics and TPC prolonged tracks:
+ // propagate to the innermost of:
+ // - innermost layer crossed by the track
+ // - innermost layer where a cluster was associated to the track
+ static AliITSRecoParam *repa = NULL;
+ if(!repa){
+ repa = (AliITSRecoParam*) AliITSReconstructor::GetRecoParam();
+ if(!repa){
+ repa = AliITSRecoParam::GetHighFluxParam();
+ AliWarning("Using default AliITSRecoParam class");
+ }
+ }
+ Int_t evsp=repa->GetEventSpecie();
+ ULong_t trStatus=0;
+ if(track->GetESDtrack()) trStatus=track->GetStatus();
+ Int_t innermostlayer=0;
+ if((evsp&AliRecoParam::kCosmic) || (trStatus&AliESDtrack::kTPCin)) {
+ innermostlayer=5;
+ Double_t drphi = TMath::Abs(track->GetD(0.,0.));
+ for(innermostlayer=0; innermostlayer<AliITSgeomTGeo::GetNLayers(); innermostlayer++) {
+ if( (drphi < (fgLayers[innermostlayer].GetR()+1.)) ||
+ index[innermostlayer] >= 0 ) break;
+ }
+
+ AliDebug(2,Form(" drphi %f innermost %d",drphi,innermostlayer));
}
- AliDebug(2,Form(" drphi %f innermost %d",drphi,innermostlayer));
Int_t modstatus=1; // found
Float_t xloc,zloc;
// 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;
+ Int_t sumDeadZoneProbability=0;
+ for(Int_t ilay=0;ilay<6;ilay++) {
+ if(track->GetDeadZoneProbability(ilay)>0.) sumDeadZoneProbability++;
+ }
+ Int_t nDeadZoneWithProbNot1=(Int_t)(track->GetNDeadZone())-sumDeadZoneProbability;
+ if(nDeadZoneWithProbNot1>0) {
+ Float_t deadZoneProbability = track->GetNDeadZone()-(Float_t)sumDeadZoneProbability;
+ AliDebug(2,Form("nDeadZone %f sumDZProbability %f nDZWithProbNot1 %f deadZoneProb %f\n",track->GetNDeadZone(),sumDeadZoneProbability,nDeadZoneWithProbNot1,deadZoneProbability));
+ deadZoneProbability /= (Float_t)nDeadZoneWithProbNot1;
+ Float_t one = 1.;
+ deadZoneProbability = TMath::Min(deadZoneProbability,one);
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()));
-
- return normchi2;
+ AliDebug(2,Form("match %f deadzonefactor %f chi2 %f sum %f skipped\n",match,deadzonefactor,chi2,sum,track->GetNSkipped()));
+ AliDebug(2,Form("NormChi2 %f cls %d\n",normchi2,track->GetNumberOfClusters()));
+ return normchi2;
}
//------------------------------------------------------------------------
Double_t AliITStrackerMI::GetMatchingChi2(const AliITStrackMI * track1,const AliITStrackMI * track2)
//
// return probability that given point (characterized by z position and error)
// is in SPD dead zone
+ // This method assumes that fSPDdetzcentre is ordered from -z to +z
//
Double_t probability = 0.;
- Double_t absz = TMath::Abs(zpos);
- Double_t nearestz = (absz<2.) ? 0.5*(fSPDdetzcentre[1]+fSPDdetzcentre[2]) :
- 0.5*(fSPDdetzcentre[2]+fSPDdetzcentre[3]);
- if (TMath::Abs(absz-nearestz)>0.25+3.*zerr) return probability;
+ Double_t nearestz = 0.,distz=0.;
+ Int_t nearestzone = -1;
+ Double_t mindistz = 1000.;
+
+ // find closest dead zone
+ for (Int_t i=0; i<3; i++) {
+ distz=TMath::Abs(zpos-0.5*(fSPDdetzcentre[i]+fSPDdetzcentre[i+1]));
+ if (distz<mindistz) {
+ nearestzone=i;
+ nearestz=0.5*(fSPDdetzcentre[i]+fSPDdetzcentre[i+1]);
+ mindistz=distz;
+ }
+ }
+
+ // too far from dead zone
+ if (TMath::Abs(zpos-nearestz)>0.25+3.*zerr) return probability;
+
+
Double_t zmin, zmax;
- if (zpos<-6.) { // dead zone at z = -7
+ if (nearestzone==0) { // dead zone at z = -7
zmin = fSPDdetzcentre[0] + 0.5*AliITSRecoParam::GetSPDdetzlength();
zmax = fSPDdetzcentre[1] - 0.5*AliITSRecoParam::GetSPDdetzlength();
- } else if (zpos>6.) { // dead zone at z = +7
- zmin = fSPDdetzcentre[2] + 0.5*AliITSRecoParam::GetSPDdetzlength();
- zmax = fSPDdetzcentre[3] - 0.5*AliITSRecoParam::GetSPDdetzlength();
- } else if (absz<2.) { // dead zone at z = 0
+ } else if (nearestzone==1) { // dead zone at z = 0
zmin = fSPDdetzcentre[1] + 0.5*AliITSRecoParam::GetSPDdetzlength();
zmax = fSPDdetzcentre[2] - 0.5*AliITSRecoParam::GetSPDdetzlength();
+ } else if (nearestzone==2) { // dead zone at z = +7
+ zmin = fSPDdetzcentre[2] + 0.5*AliITSRecoParam::GetSPDdetzlength();
+ zmax = fSPDdetzcentre[3] - 0.5*AliITSRecoParam::GetSPDdetzlength();
} else {
zmin = 0.;
zmax = 0.;
}
// probability that the true z is in the range [zmin,zmax] (i.e. inside
// dead zone)
- probability = 0.5*( TMath::Erf((zpos-zmin)/zerr/TMath::Sqrt(2.)) -
- TMath::Erf((zpos-zmax)/zerr/TMath::Sqrt(2.)) );
+ probability = 0.5*( AliMathBase::ErfFast((zpos-zmin)/zerr/TMath::Sqrt(2.)) -
+ AliMathBase::ErfFast((zpos-zmax)/zerr/TMath::Sqrt(2.)) );
+ AliDebug(2,Form("zpos %f +- %f nearestzone %d zmin zmax %f %f prob %f\n",zpos,zerr,nearestzone,zmin,zmax,probability));
return probability;
}
//------------------------------------------------------------------------
Int_t l=(index & 0xf0000000) >> 28;
Int_t c=(index & 0x0fffffff) >> 00;
if (c>fgLayers[l].GetNumberOfClusters()) continue;
- if (ny[l]==0){
+ if (ny[l]<1.e-13){
printf("problem\n");
}
AliITSRecPoint *cl = (AliITSRecPoint*)GetCluster(index);
Int_t index = clusterlist[icluster];
Int_t l=(index & 0xf0000000) >> 28;
Int_t c=(index & 0x0fffffff) >> 00;
- if (ny[l]==0){
+ if (ny[l]<1.e-13){
printf("problem\n");
}
if (c>fgLayers[l].GetNumberOfClusters()) continue;
for (Int_t itrack=0;itrack<entries;itrack++){
AliITStrackMI * track = (AliITStrackMI*)array->At(itrack);
if (track){
+ AliDebug(2,Form("track %d ncls %d\n",itrack,track->GetNumberOfClusters()));
track->SetChi2MIP(0,GetNormalizedChi2(track, mode));
if (track->GetChi2MIP(0)<AliITSReconstructor::GetRecoParam()->GetMaxChi2PerCluster(0))
chi2[itrack] = track->GetChi2MIP(0);
//
TMath::Sort(entries,chi2,index,kFALSE);
besttrack = (AliITStrackMI*)array->At(index[0]);
+ if(besttrack) AliDebug(2,Form("ncls best track %d\n",besttrack->GetNumberOfClusters()));
if (besttrack&&besttrack->GetChi2MIP(0)<AliITSReconstructor::GetRecoParam()->GetMaxChi2PerCluster(0)){
for (Int_t j=0;j<6;j++){
if (besttrack->GetClIndex(j)>=0){
for (Int_t itrack=0;itrack<entries;itrack++){
AliITStrackMI * track = (AliITStrackMI*)array->At(itrack);
if (track){
- track->SetChi2MIP(0,GetNormalizedChi2(track,mode));
+ track->SetChi2MIP(0,GetNormalizedChi2(track,mode));
+ AliDebug(2,Form("track %d ncls %d\n",itrack,track->GetNumberOfClusters()));
if (track->GetChi2MIP(0)<AliITSReconstructor::GetRecoParam()->GetMaxChi2PerCluster(0))
chi2[itrack] = track->GetChi2MIP(0)-0*(track->GetNumberOfClusters()+track->GetNDeadZone());
else
TMath::Sort(entries,chi2,index,kFALSE);
besttrack = (AliITStrackMI*)array->At(index[0]);
if (besttrack){
+ AliDebug(2,Form("ncls best track %d %f %f\n",besttrack->GetNumberOfClusters(),besttrack->GetChi2MIP(0),chi2[index[0]]));
//
for (Int_t j=0;j<6;j++){
if (besttrack->GetNz(j)>0&&besttrack->GetNy(j)>0){
//--------------------------------------------------------------------
Int_t tpcLabel=-1;
- if ( track->GetESDtrack()) tpcLabel = TMath::Abs(track->GetESDtrack()->GetTPCLabel());
-
+ if (track->GetESDtrack()){
+ tpcLabel = track->GetESDtrack()->GetTPCLabel();
+ ULong_t trStatus=track->GetESDtrack()->GetStatus();
+ if(!(trStatus&AliESDtrack::kTPCin)) tpcLabel=track->GetLabel(); // for ITSsa tracks
+ }
track->SetChi2MIP(9,0);
Int_t nwrong=0;
for (Int_t i=0;i<track->GetNumberOfClusters();i++){
AliITSRecPoint *cl = (AliITSRecPoint*)GetCluster(cindex);
Int_t isWrong=1;
for (Int_t ind=0;ind<3;ind++){
- if (tpcLabel>0)
- if (cl->GetLabel(ind)==tpcLabel) isWrong=0;
- AliDebug(2,Form("icl %d ilab %d lab %d",i,ind,cl->GetLabel(ind)));
+ if (cl->GetLabel(ind)==TMath::Abs(tpcLabel)) isWrong=0;
+ //AliDebug(2,Form("icl %d ilab %d lab %d",i,ind,cl->GetLabel(ind)));
}
track->SetChi2MIP(9,track->GetChi2MIP(9)+isWrong*(2<<l));
nwrong+=isWrong;
Int_t nclusters = track->GetNumberOfClusters();
if (nclusters > 0) //PH Some tracks don't have any cluster
track->SetFakeRatio(double(nwrong)/double(nclusters));
- if (tpcLabel>0){
- if (track->GetFakeRatio()>wrong) track->SetLabel(-tpcLabel);
- else
- track->SetLabel(tpcLabel);
+ if (tpcLabel>0 && track->GetFakeRatio()>wrong) {
+ track->SetLabel(-tpcLabel);
+ } else {
+ track->SetLabel(tpcLabel);
}
AliDebug(2,Form(" nls %d wrong %d label %d tpcLabel %d\n",nclusters,nwrong,track->GetLabel(),tpcLabel));
}
//------------------------------------------------------------------------
-void AliITStrackerMI::CookdEdx(AliITStrackMI* track)
-{
+void AliITStrackerMI::CookdEdx(AliITStrackMI* track){
+ //
+ // Fill the dE/dx in this track
//
track->SetChi2MIP(9,0);
for (Int_t i=0;i<track->GetNumberOfClusters();i++){
}
}
- if (cl->GetQ()<=0) return 0; // ingore the "virtual" clusters
+ if (TMath::Abs(cl->GetQ())<1.e-13) return 0; // ingore the "virtual" clusters
// Take into account the mis-alignment (bring track to cluster plane)
// without clusters, because there is a dead zone in the road.
// In this case the return value is > 0:
// return 1: dead zone at z=0,+-7cm in SPD
+ // This method assumes that fSPDdetzcentre is ordered from -z to +z
// return 2: all road is "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
fSPDdetzcentre[3] - 0.5*AliITSRecoParam::GetSPDdetzlength()};
for (Int_t i=0; i<3; i++)
if (track->GetZ()-dz<zmaxdead[i] && track->GetZ()+dz>zmindead[i]) {
- AliDebug(2,Form("crack SPD %d",ilayer));
- return 1;
+ AliDebug(2,Form("crack SPD %d track z %f %f %f %f\n",ilayer,track->GetZ(),dz,zmaxdead[i],zmindead[i]));
+ if (GetSPDDeadZoneProbability(track->GetZ(),TMath::Sqrt(track->GetSigmaZ2()))>0.1) return 1;
}
}
AliITStrackMI tmp(*track);
// require a minimal number of cluster in other layers and eventually clusters in closest layers
- Int_t ncl=0;
- for(Int_t lay=AliITSgeomTGeo::kNLayers-1;lay>ilayer;lay--) {
+ Int_t ncl_out=0; Int_t ncl_in=0;
+ for(Int_t lay=AliITSgeomTGeo::kNLayers-1;lay>ilayer;lay--) { // count n. of cluster in outermost layers
AliDebug(2,Form("trak=%d lay=%d ; index=%d ESD label= %d",tmp.GetLabel(),lay,
tmp.GetClIndex(lay),((AliESDtrack*)tmp.GetESDtrack())->GetLabel())) ;
- if (tmp.GetClIndex(lay)>=0) ncl++;
+ if (tmp.GetClIndex(lay)>=0) ncl_out++;
}
+ for(Int_t lay=ilayer-1; lay>=0;lay--) { // count n. of cluster in innermost layers
+ AliDebug(2,Form("trak=%d lay=%d ; index=%d ESD label= %d",tmp.GetLabel(),lay,
+ tmp.GetClIndex(lay),((AliESDtrack*)tmp.GetESDtrack())->GetLabel())) ;
+ if (tmp.GetClIndex(lay)>=0) ncl_in++;
+ }
+ Int_t ncl=ncl_out+ncl_out;
Bool_t nextout = kFALSE;
if(ilayer==AliITSgeomTGeo::kNLayers-1) nextout=kTRUE; // you are already on the outermost layer
else nextout = ((tmp.GetClIndex(ilayer+1)>=0)? kTRUE : kFALSE );
Bool_t nextin = kFALSE;
if(ilayer==0) nextin=kTRUE; // you are already on the innermost layer
else nextin = ((index[ilayer-1]>=0)? kTRUE : kFALSE );
- if(ncl<AliITSgeomTGeo::kNLayers-(ilayer+1)-AliITSReconstructor::GetRecoParam()->GetMaxMissingClustersPlaneEff())
+ // maximum number of missing clusters allowed in outermost layers
+ if(ncl_out<AliITSgeomTGeo::kNLayers-(ilayer+1)-AliITSReconstructor::GetRecoParam()->GetMaxMissingClustersOutPlaneEff())
+ return kFALSE;
+ // maximum number of missing clusters allowed (both in innermost and in outermost layers)
+ if(ncl<AliITSgeomTGeo::kNLayers-1-AliITSReconstructor::GetRecoParam()->GetMaxMissingClustersPlaneEff())
return kFALSE;
if(AliITSReconstructor::GetRecoParam()->GetRequireClusterInOuterLayerPlaneEff() && !nextout) return kFALSE;
if(AliITSReconstructor::GetRecoParam()->GetRequireClusterInInnerLayerPlaneEff() && !nextin) return kFALSE;
// DEFINITION OF SEARCH ROAD FOR accepting a track
//
//For the time being they are hard-wired, later on from AliITSRecoParam
- // Double_t nsigx=AliITSRecoParam::GetNSigXFarFromBoundary();
- // Double_t nsigz=AliITSRecoParam::GetNSigZFarFromBoundary();
- Double_t nsigz=4;
- Double_t nsigx=4;
+ Double_t nsigx=AliITSReconstructor::GetRecoParam()->GetNSigXFromBoundaryPlaneEff();
+ Double_t nsigz=AliITSReconstructor::GetRecoParam()->GetNSigZFromBoundaryPlaneEff();
+ // Double_t nsigz=4;
+ // Double_t nsigx=4;
Double_t dx=nsigx*TMath::Sqrt(tmp.GetSigmaY2()); // those are precisions in the tracking reference system
Double_t dz=nsigz*TMath::Sqrt(tmp.GetSigmaZ2()); // Use it also for the module reference system, as it is
// done for RecPoints