#include <TRandom.h>
#include <TTreeStream.h>
#include <TVector3.h>
+#include <TBits.h>
#include "AliLog.h"
#include "AliGeomManager.h"
fITSChannelStatus(0),
fkDetTypeRec(0),
fPlaneEff(0),
+fSPDChipIntPlaneEff(0),
fITSPid(0)
{
fITSChannelStatus(0),
fkDetTypeRec(0),
fPlaneEff(0),
+fSPDChipIntPlaneEff(0),
fITSPid(0) {
//--------------------------------------------------------------------
//This is the AliITStrackerMI constructor
Int_t iplane=AliITSReconstructor::GetRecoParam()->GetIPlanePlaneEff();
if(!AliITSReconstructor::GetRecoParam()->GetLayersToSkip(iplane)==1)
AliWarning(Form("Evaluation of Plane Eff for layer %d will be attempted without removing it from tracker",iplane));
- if (iplane<2) fPlaneEff = new AliITSPlaneEffSPD();
+ if (iplane<2) {
+ fPlaneEff = new AliITSPlaneEffSPD();
+ fSPDChipIntPlaneEff = new Bool_t[AliITSPlaneEffSPD::kNModule*AliITSPlaneEffSPD::kNChip];
+ for (UInt_t i=0; i<AliITSPlaneEffSPD::kNModule*AliITSPlaneEffSPD::kNChip; i++) fSPDChipIntPlaneEff[i]=kFALSE;
+ }
else if (iplane<4) fPlaneEff = new AliITSPlaneEffSDD();
else fPlaneEff = new AliITSPlaneEffSSD();
if(AliITSReconstructor::GetRecoParam()->GetReadPlaneEffFromOCDB())
if(fITSChannelStatus) delete fITSChannelStatus;
if(fPlaneEff) delete fPlaneEff;
if(fITSPid) delete fITSPid;
+ if (fSPDChipIntPlaneEff) delete [] fSPDChipIntPlaneEff;
}
//------------------------------------------------------------------------
for (Int_t i=0; i<nentr; i++) {
AliESDtrack *esd=event->GetTrack(i);
- if ((esd->GetStatus()&AliESDtrack::kITSin)==0) continue;
- if (esd->GetStatus()&AliESDtrack::kITSout) continue;
-
- AliITStrackMI *t = new AliITStrackMI(*esd);
-
- t->SetExpQ(TMath::Max(0.8*t->GetESDtrack()->GetTPCsignal(),30.));
-
- ResetTrackToFollow(*t);
-
- /*
- // propagate to vertex [SR, GSI 17.02.2003]
- // Start Time measurement [SR, GSI 17.02.2003], corrected by I.Belikov
- if (CorrectForPipeMaterial(&fTrackToFollow,"inward")) {
- if (fTrackToFollow.PropagateToVertex(event->GetVertex()))
- fTrackToFollow.StartTimeIntegral();
- // from vertex to outside pipe
- CorrectForPipeMaterial(&fTrackToFollow,"outward");
- }*/
// Start time integral and add distance from current position to vertex
+ if (esd->GetStatus()&AliESDtrack::kITSout) continue;
+ AliITStrackMI t(*esd);
Double_t xyzTrk[3],xyzVtx[3]={GetX(),GetY(),GetZ()};
- fTrackToFollow.GetXYZ(xyzTrk);
+ t.GetXYZ(xyzTrk);
Double_t dst2 = 0.;
- for (Int_t icoord=0; icoord<3; icoord++) {
- Double_t di = xyzTrk[icoord] - xyzVtx[icoord];
- dst2 += di*di;
- }
- fTrackToFollow.StartTimeIntegral();
- fTrackToFollow.AddTimeStep(TMath::Sqrt(dst2));
+ for (Int_t icoord=0; icoord<3; icoord++) {Double_t di = xyzTrk[icoord] - xyzVtx[icoord];dst2 += di*di; }
+ t.StartTimeIntegral();
+ t.AddTimeStep(TMath::Sqrt(dst2));
+ //
+ // transfer the time integral to ESD track
+ esd->SetStatus(AliESDtrack::kTIME);
+ Double_t times[10];t.GetIntegratedTimes(times); esd->SetIntegratedTimes(times);
+ esd->SetIntegratedLength(t.GetIntegratedLength());
+ //
+ if ((esd->GetStatus()&AliESDtrack::kITSin)==0) continue;
+ t.SetExpQ(TMath::Max(0.8*t.GetESDtrack()->GetTPCsignal(),30.));
+ ResetTrackToFollow(t);
+ //
fTrackToFollow.ResetCovariance(10.); fTrackToFollow.ResetClusters();
- if (RefitAt(AliITSRecoParam::GetrInsideITSscreen(),&fTrackToFollow,t)) {
- if (!CorrectForTPCtoITSDeadZoneMaterial(&fTrackToFollow)) {
- delete t;
- continue;
- }
- fTrackToFollow.SetLabel(t->GetLabel());
- //fTrackToFollow.CookdEdx();
- CookLabel(&fTrackToFollow,0.); //For comparison only
- fTrackToFollow.UpdateESDtrack(AliESDtrack::kITSout);
- //UseClusters(&fTrackToFollow);
- ntrk++;
+ if (RefitAt(AliITSRecoParam::GetrInsideITSscreen(),&fTrackToFollow,&t)) {
+ if (!CorrectForTPCtoITSDeadZoneMaterial(&fTrackToFollow)) continue;
+ fTrackToFollow.SetLabel(t.GetLabel());
+ //fTrackToFollow.CookdEdx();
+ CookLabel(&fTrackToFollow,0.); //For comparison only
+ fTrackToFollow.UpdateESDtrack(AliESDtrack::kITSout);
+ //UseClusters(&fTrackToFollow);
+ ntrk++;
}
- delete t;
}
AliInfo(Form("Number of back propagated ITS tracks: %d out of %d ESD tracks",ntrk,nentr));
Int_t nentr=event->GetNumberOfTracks();
// Info("RefitInward", "Number of ESD tracks: %d\n", nentr);
+ // only for PlaneEff and in case of SPD (for FO studies)
+ if( AliITSReconstructor::GetRecoParam()->GetComputePlaneEff() &&
+ AliITSReconstructor::GetRecoParam()->GetIPlanePlaneEff()>=0 &&
+ AliITSReconstructor::GetRecoParam()->GetIPlanePlaneEff()<2) {
+ for (UInt_t i=0; i<AliITSPlaneEffSPD::kNModule*AliITSPlaneEffSPD::kNChip; i++) fSPDChipIntPlaneEff[i]=kFALSE;
+ }
+
Int_t ntrk=0;
for (Int_t i=0; i<nentr; i++) {
AliESDtrack *esd=event->GetTrack(i);
fYB[0]=0;
fYB[1]=0;
- for (Int_t j=0; j<AliITSRecoParam::fgkMaxClusterPerLayer5; j++) {
+ for (Int_t j=0; j<AliITSRecoParam::kMaxClusterPerLayer5; j++) {
for (Int_t j1=0; j1<6; j1++) {
fClusters5[j1][j]=0;
fClusterIndex5[j1][j]=-1;
}
}
- for (Int_t j=0; j<AliITSRecoParam::fgkMaxClusterPerLayer10; j++) {
+ for (Int_t j=0; j<AliITSRecoParam::kMaxClusterPerLayer10; j++) {
for (Int_t j1=0; j1<11; j1++) {
fClusters10[j1][j]=0;
fClusterIndex10[j1][j]=-1;
}
}
- for (Int_t j=0; j<AliITSRecoParam::fgkMaxClusterPerLayer20; j++) {
+ for (Int_t j=0; j<AliITSRecoParam::kMaxClusterPerLayer20; j++) {
for (Int_t j1=0; j1<21; j1++) {
fClusters20[j1][j]=0;
fClusterIndex20[j1][j]=-1;
fBy20[j1][1]=0;
}
}
- for(Int_t i=0;i<AliITSRecoParam::fgkMaxClusterPerLayer;i++){
+ for(Int_t i=0;i<AliITSRecoParam::kMaxClusterPerLayer;i++){
fClusters[i]=NULL;
fClusterIndex[i]=0;
}
fYB[0]=0;
fYB[1]=0;
- for (Int_t j=0; j<AliITSRecoParam::fgkMaxClusterPerLayer5; j++) {
+ for (Int_t j=0; j<AliITSRecoParam::kMaxClusterPerLayer5; j++) {
for (Int_t j1=0; j1<6; j1++) {
fClusters5[j1][j]=0;
fClusterIndex5[j1][j]=-1;
}
}
- for (Int_t j=0; j<AliITSRecoParam::fgkMaxClusterPerLayer10; j++) {
+ for (Int_t j=0; j<AliITSRecoParam::kMaxClusterPerLayer10; j++) {
for (Int_t j1=0; j1<11; j1++) {
fClusters10[j1][j]=0;
fClusterIndex10[j1][j]=-1;
}
}
- for (Int_t j=0; j<AliITSRecoParam::fgkMaxClusterPerLayer20; j++) {
+ for (Int_t j=0; j<AliITSRecoParam::kMaxClusterPerLayer20; j++) {
for (Int_t j1=0; j1<21; j1++) {
fClusters20[j1][j]=0;
fClusterIndex20[j1][j]=-1;
fBy20[j1][1]=0;
}
}
- for(Int_t i=0;i<AliITSRecoParam::fgkMaxClusterPerLayer;i++){
+ for(Int_t i=0;i<AliITSRecoParam::kMaxClusterPerLayer;i++){
fClusters[i]=NULL;
fClusterIndex[i]=0;
}
}
//------------------------------------------------------------------------
-void AliITStrackerMI::FlagFakes(TObjArray &itsTracks)
+void AliITStrackerMI::FlagFakes(const TObjArray &itsTracks)
{
//
// RS: flag those tracks which are suxpected to have fake clusters
}
if(!fPlaneEff->UpDatePlaneEff(found,key))
AliWarning(Form("UseTrackForPlaneEff: cannot UpDate PlaneEff for key=%d",key));
+
+// this for FO efficiency studies (only for SPD) //
+ UInt_t keyFO=999999;
+ Bool_t foundFO=kFALSE;
+ if(ilayer<2){ //ONLY SPD layers for FastOr studies
+ TBits mapFO = fkDetTypeRec->GetFastOrFiredMap();
+ Int_t phase = (fEsd->GetBunchCrossNumber())%4;
+ if(!fSPDChipIntPlaneEff[key]){
+ AliITSPlaneEffSPD spd;
+ keyFO = spd.SwitchChipKeyNumbering(key);
+ if(mapFO.TestBitNumber(keyFO))foundFO=kTRUE;
+ keyFO = key + (AliITSPlaneEffSPD::kNModule*AliITSPlaneEffSPD::kNChip)*(phase+1);
+ if(keyFO<AliITSPlaneEffSPD::kNModule*AliITSPlaneEffSPD::kNChip) {
+ AliWarning(Form("UseTrackForPlaneEff: too small keyF0 (= %d), setting it to 999999",keyFO));
+ keyFO=999999;
+ }
+ if(!fPlaneEff->UpDatePlaneEff(foundFO,keyFO))
+ AliWarning(Form("UseTrackForPlaneEff: cannot UpDate PlaneEff for FastOR for key=%d",keyFO));
+ }
+ }
+
+
+
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)
AngleModTrack[1]-=TMath::Pi()/2.; // range of angle is -pi/2 , pi/2
AngleModTrack[1]*=180./TMath::Pi(); // in degree
- fPlaneEff->FillHistos(key,found,tr,clu,cltype,AngleModTrack);
+ fPlaneEff->FillHistos(key,found,tr,clu,cltype,AngleModTrack);
+
+ // For FO efficiency studies of SPD
+ if(ilayer<2 && !fSPDChipIntPlaneEff[key]) fPlaneEff->FillHistos(keyFO,foundFO,tr,clu,cltype,AngleModTrack);
}
+ if(ilayer<2) fSPDChipIntPlaneEff[key]=kTRUE;
return;
}