#include <TString.h>
#include <TRandom.h>
-
#include "AliESDEvent.h"
#include "AliESDtrack.h"
#include "AliESDVertex.h"
break; // only one layer type to skip at once
}
}
- if(!fPlaneEff->ReadFromCDB())
- {AliWarning("AliITStrackerMI reading of AliITSPlaneEff from OCDB failed") ;}
+ if(AliITSReconstructor::GetRecoParam()->GetReadPlaneEffFromOCDB())
+ if(!fPlaneEff->ReadFromCDB()) {AliWarning("AliITStrackerMI reading of AliITSPlaneEff from OCDB failed") ;}
+ if(AliITSReconstructor::GetRecoParam()->GetHistoPlaneEff()) {
+ fPlaneEff->SetCreateHistos(kTRUE);
+ //fPlaneEff->ReadHistosFromFile();
+ }
}
}
//------------------------------------------------------------------------
// This functions reconstructs ITS tracks
// The clusters must be already loaded !
//--------------------------------------------------------------------
+
+
fTrackingPhase="Clusters2Tracks";
TObjArray itsTracks(15000);
GetBestHypothesysMIP(itsTracks);
} // end loop on the two tracking passes
- //GetBestHypothesysMIP(itsTracks);
if(event->GetNumberOfV0s()>0) UpdateTPCV0(event);
if(AliITSReconstructor::GetRecoParam()->GetFindV0s()) FindV02(event);
fAfterV0 = kTRUE;
- //GetBestHypothesysMIP(itsTracks);
//
itsTracks.Delete();
//
// add track to the list of hypothesys
//------------------------------------------------------------------
- if (esdindex>=fTrackHypothesys.GetEntriesFast()) fTrackHypothesys.Expand(esdindex*2+10);
+ if (esdindex>=fTrackHypothesys.GetEntriesFast())
+ fTrackHypothesys.Expand(TMath::Max(fTrackHypothesys.GetSize(),esdindex*2+10));
//
TObjArray * array = (TObjArray*) fTrackHypothesys.At(esdindex);
if (!array) {
delete forwardtrack;
Int_t accepted=0;
for (Int_t i=0;i<entries;i++){
- AliITStrackMI * track = (AliITStrackMI*)array->At(i);
+ AliITStrackMI * track = (AliITStrackMI*)array->At(i);
+
if (!track) continue;
if (accepted>checkmax || track->GetChi2MIP(3)>AliITSReconstructor::GetRecoParam()->GetMaxChi2PerCluster(3)*6. ||
//
array->Compress();
SortTrackHypothesys(esdindex,checkmax,1);
+
array = (TObjArray*) fTrackHypothesys.At(esdindex);
if (!array) return 0; // PH What can be the reason? Check SortTrackHypothesys
besttrack = (AliITStrackMI*)array->At(0);
if (cl->GetQ()<=0) return 0; // ingore the "virtual" clusters
- //Float_t clxyz[3]; cl->GetGlobalXYZ(clxyz);Double_t trxyz[3]; track->GetXYZ(trxyz);printf("gtr %f %f %f\n",trxyz[0],trxyz[1],trxyz[2]);printf("gcl %f %f %f\n",clxyz[0],clxyz[1],clxyz[2]);
+ // Float_t clxyz[3]; cl->GetGlobalXYZ(clxyz);Double_t trxyz[3]; track->GetXYZ(trxyz);//printf("gtr %f %f %f\n",trxyz[0],trxyz[1],trxyz[2]);printf("gcl %f %f %f\n",clxyz[0],clxyz[1],clxyz[2]);
// Take into account the mis-alignment
Double_t x=track->GetX()+cl->GetX();
if (!track->PropagateTo(x,0.,0.)) return 0;
+
+
AliCluster c(*cl);
c.SetSigmaY2(track->GetSigmaY(layer)*track->GetSigmaY(layer));
if(ilayer==3) idet += AliITSgeomTGeo::GetNLadders(3)*AliITSgeomTGeo::GetNDetectors(3);
//printf("SDD det: %d\n",idet);
AliITSCalibrationSDD *calibSDD = (AliITSCalibrationSDD*)sddEntry->At(idet);
- if (calibSDD->IsDead()) return 2;
+ if (calibSDD->IsBad()) return 2;
} else if (ilayer==4 || ilayer==5) { // SSD
} else {
Error("CheckDeadZone","Wrong layer number\n");
//
// input: AliITStrackMI* track, ilayer= layer number [0,5]
// output: Bool_t -> kTRUE 2f usable track, kFALSE if not usable.
+ if(!fPlaneEff)
+ {AliWarning("IsOKForPlaneEff: null pointer to AliITSPlaneEff"); return kFALSE;}
AliITSlayer &layer=fgLayers[ilayer];
Double_t r=layer.GetR();
//AliITStrackV2 tmp(*track);
if(key>fPlaneEff->Nblock()) return kFALSE;
Float_t blockXmn,blockXmx,blockZmn,blockZmx;
if (!fPlaneEff->GetBlockBoundaries(key,blockXmn,blockXmx,blockZmn,blockZmx)) return kFALSE;
- // transform Local boundaries of the basic block into Global (i.e. tracking) coordinate
+ // transform Local boundaries of the basic block into
+ // Global (i.e. ALICE, not tracking reference) coordinate
//
Double_t a1[3]={blockXmn,0.,blockZmn};
Double_t a2[3]={blockXmx,0.,blockZmn};
Int_t ndet=AliITSgeomTGeo::GetNDetectors(ilayer+1); // layers from 1 to 6
Int_t lad = Int_t(idet/ndet) + 1;
Int_t hdet = idet - (lad-1)*ndet + 1;
+ Double_t xyzGlob[3];
AliITSgeomTGeo::LocalToGlobal(ilayer+1,lad,hdet,a1,a1);
AliITSgeomTGeo::LocalToGlobal(ilayer+1,lad,hdet,a2,a2);
AliITSgeomTGeo::LocalToGlobal(ilayer+1,lad,hdet,a3,a3);
Double_t gBlockYmn,gBlockYmx,gBlockZmn,gBlockZmx;
if(a1[1]>a2[1]) {gBlockYmn=a2[1]; gBlockYmx=a1[1];}
else {gBlockYmn=a1[1]; gBlockYmx=a2[1];}
- if(a2[2]>a3[2]) {gBlockZmn=a2[2]; gBlockZmx=a3[2];}
- else {gBlockZmn=a3[2]; gBlockZmx=a2[2];}
+ if(a2[2]>a3[2]) {gBlockZmn=a3[2]; gBlockZmx=a2[2];}
+ else {gBlockZmn=a2[2]; gBlockZmx=a3[2];}
+ AliDebug(2,Form("Boundaries in Global system Ymin=%f, Ymax=%f, Zmin=%f, Zmax=%f",
+ gBlockYmn,gBlockYmx,gBlockZmn,gBlockZmx));
//***************
// DEFINITION OF SEARCH ROAD FOR accepting a track
//
//For the time being they are hard-wired, later on from AliITSRecoParam
- Double_t dz=4.*TMath::Sqrt(tmp.GetSigmaZ2());
- Double_t dy=4.*TMath::Sqrt(tmp.GetSigmaY2());
+ Double_t dz=4.*TMath::Sqrt(tmp.GetSigmaZ2()); // those are precisions in the tracking reference system
+ Double_t dy=4.*TMath::Sqrt(tmp.GetSigmaY2()); // dy needs to be reduced (it is max now) if you do
+ // comparison in Global Reference system
+ Float_t gdz=dz;
+ Float_t gdy=dy*TMath::Abs(TMath::Cos(tmp.GetAlpha()));
// exclude tracks at boundary between detectors
//Double_t boundaryWidth=AliITSRecoParam::GetBoundaryWidth();
Double_t boundaryWidth=0; // for the time being hard-wired, later on from AliITSRecoParam
- if ( (tmp.GetY()-dy < gBlockYmn+boundaryWidth) ||
- (tmp.GetY()+dy > gBlockYmx-boundaryWidth) ||
- (tmp.GetZ()-dz < gBlockZmn+boundaryWidth) ||
- (tmp.GetZ()+dz > gBlockZmx-boundaryWidth) ) return kFALSE;
+ AliDebug(2,Form("Tracking: track impact x=%f, y=%f, z=%f",tmp.GetX(), tmp.GetY(), tmp.GetZ()));
+ tmp.GetXYZ(xyzGlob);
+ AliDebug(2,Form("Global: track impact x=%f, y=%f, z=%f",xyzGlob[0],xyzGlob[1],xyzGlob[2]));
+ //AliInfo(Form("TEST GLOBAL track y = %f, z=%f",tmp.GetY(),tmp.GetZ()));
+ AliDebug(2,Form("Search Road. Tracking: dy=%f , dz=%f",dy,dz));
+ AliDebug(2,Form("Search Road. Global: Gdy=%f , Gdz=%f",gdy,gdz));
+ if ( (xyzGlob[1]-gdy < gBlockYmn+boundaryWidth) ||
+ (xyzGlob[1]+gdy > gBlockYmx-boundaryWidth) ||
+ (xyzGlob[2]-gdz < gBlockZmn+boundaryWidth) ||
+ (xyzGlob[2]+gdz > gBlockZmx-boundaryWidth) ) return kFALSE;
return kTRUE;
}
// AliITSPlaneEff::UpDatePlaneEff(key,kTRUE);
// - if not, the AliITSPlaneEff::UpDatePlaneEff(key,kFALSE) is called
//
+ if(!fPlaneEff)
+ {AliWarning("UseTrackForPlaneEff: null pointer to AliITSPlaneEff"); return;}
AliITSlayer &layer=fgLayers[ilayer];
Double_t r=layer.GetR();
//AliITStrackV2 tmp(*track);
if(key>fPlaneEff->Nblock()) return;
Bool_t found=kFALSE;
//if (ci>=0) {
+ Double_t chi2;
while ((cl=layer.GetNextCluster(clidx))!=0) {
idetc = cl->GetDetectorIndex();
if(idet!=idetc) continue;
if ( (tmp.GetZ()-cl->GetZ())*(tmp.GetZ()-cl->GetZ())*msz +
(tmp.GetY()-cl->GetY())*(tmp.GetY()-cl->GetY())*msy > 1. ) continue;
// calculate track-clusters chi2
- Double_t chi2 = GetPredictedChi2MI(&tmp,cl,ilayer); // note that this method change track tmp
+ chi2 = GetPredictedChi2MI(&tmp,cl,ilayer); // note that this method change track tmp
+ // in particular, the error associated to the cluster
//Double_t chi2 = tmp.GetPredictedChi(cl); // this method does not change track tmp
// chi2 cut
if (chi2 > AliITSReconstructor::GetRecoParam()->GetMaxChi2s(ilayer)) continue;
}
if(!fPlaneEff->UpDatePlaneEff(found,key))
AliWarning(Form("UseTrackForPlaneEff: cannot UpDate PlaneEff for key=%d",key));
+ if(fPlaneEff->GetCreateHistos()&& AliITSReconstructor::GetRecoParam()->GetHistoPlaneEff()) {
+ Float_t tr[4]={99999.,99999.,9999.,9999.}; // initialize to high values
+ Float_t clu[4]={-99999.,-99999.,9999.,9999.}; // (in some cases GetCov fails)
+ Int_t cltype[2]={-999,-999};
+ Int_t ndet=AliITSgeomTGeo::GetNDetectors(ilayer+1); // layers from 1 to 6
+ Int_t lad = Int_t(idet/ndet) + 1;
+ Int_t hdet = idet - (lad-1)*ndet + 1;
+ Double_t xyzGlob[3],xyzLoc[3],cv[21],exyzLoc[3],exyzGlob[3];
+ if(tmp.GetXYZ(xyzGlob)) {
+ if (AliITSgeomTGeo::GlobalToLocal(ilayer+1,lad,hdet,xyzGlob,xyzLoc)) {
+ tr[0]=xyzLoc[0];
+ tr[1]=xyzLoc[2];
+ }
+ }
+ if(tmp.GetCovarianceXYZPxPyPz(cv)) {
+ exyzGlob[0]=TMath::Sqrt(cv[0]);
+ exyzGlob[1]=TMath::Sqrt(cv[2]);
+ exyzGlob[2]=TMath::Sqrt(cv[5]);
+ if (AliITSgeomTGeo::GlobalToLocalVect(AliITSgeomTGeo::GetModuleIndex(ilayer+1,lad,hdet),exyzGlob,exyzLoc)) {
+ tr[2]=TMath::Abs(exyzLoc[0]);
+ tr[3]=TMath::Abs(exyzLoc[2]);
+ }
+ }
+ if (found){
+ clu[0]=layer.GetCluster(ci)->GetDetLocalX();
+ clu[1]=layer.GetCluster(ci)->GetDetLocalZ();
+ cltype[0]=layer.GetCluster(ci)->GetNy();
+ cltype[1]=layer.GetCluster(ci)->GetNz();
+
+ // Without the following 6 lines you would retrieve the nominal error of a cluster (e.g. for the SPD:
+ // X->50/sqrt(12)=14 micron Z->450/sqrt(12)= 120 micron)
+ // Within AliTrackerMI/AliTrackMI the error on the cluster is associated to the AliITStrackMI (fSigmaY,Z)
+ // It is computed properly by calling the method
+ // AliITStrackerMI::GetPredictedChi2MI(AliITStrackMI* track, const AliITSRecPoint *cluster,Int_t layer)
+ // T
+ //Double_t x=0.5*(tmp.GetX()+layer.GetCluster(ci)->GetX()); // Take into account the mis-alignment
+ //if (tmp.PropagateTo(x,0.,0.)) {
+ chi2=GetPredictedChi2MI(&tmp,layer.GetCluster(ci),ilayer);
+ AliCluster c(*layer.GetCluster(ci));
+ c.SetSigmaY2(tmp.GetSigmaY(ilayer)*tmp.GetSigmaY(ilayer));
+ c.SetSigmaZ2(tmp.GetSigmaZ(ilayer)*tmp.GetSigmaZ(ilayer));
+ Float_t cov[6];
+ //if (layer.GetCluster(ci)->GetGlobalCov(cov)) // by using this, instead, you got nominal cluster errors
+ if (c.GetGlobalCov(cov))
+ {
+ exyzGlob[0]=TMath::Sqrt(cov[0]);
+ exyzGlob[1]=TMath::Sqrt(cov[3]);
+ exyzGlob[2]=TMath::Sqrt(cov[5]);
+ if (AliITSgeomTGeo::GlobalToLocalVect(AliITSgeomTGeo::GetModuleIndex(ilayer+1,lad,hdet),exyzGlob,exyzLoc)) {
+ clu[2]=TMath::Abs(exyzLoc[0]);
+ clu[3]=TMath::Abs(exyzLoc[2]);
+ }
+ }
+ //}
+ }
+ fPlaneEff->FillHistos(key,found,tr,clu,cltype);
+ }
return;
}