"n crossed rows TPC",
"n crossed rows / n findable clusters",
"missing ITS points",
- "#Chi^{2} TPC constrained vs. global"
+ "#Chi^{2} TPC constrained vs. global",
+ "require TOF out",
+ "TOF Distance cut"
};
AliESDtrackCuts* AliESDtrackCuts::fgMultEstTrackCuts[AliESDtrackCuts::kNMultEstTrackCuts] = { 0, 0, 0, 0 };
+Char_t AliESDtrackCuts::fgBeamTypeFlag = -1;
//____________________________________________________________________
AliESDtrackCuts::AliESDtrackCuts(const Char_t* name, const Char_t* title) : AliAnalysisCuts(name,title),
fEtaMax(0),
fRapMin(0),
fRapMax(0),
+ fCutRequireTOFout(kFALSE),
+ fFlagCutTOFdistance(kFALSE),
+ fCutTOFdistance(3.),
fHistogramsOn(0),
ffDTheoretical(0),
fhCutStatistics(0),
fEtaMax(0),
fRapMin(0),
fRapMax(0),
+ fCutRequireTOFout(kFALSE),
+ fFlagCutTOFdistance(kFALSE),
+ fCutTOFdistance(3.),
fHistogramsOn(0),
- ffDTheoretical(0),
- fhCutStatistics(0),
+ ffDTheoretical(0),
+ fhCutStatistics(0),
fhCutCorrelation(0)
{
//
delete fhPt[i];
if (fhEta[i])
delete fhEta[i];
+ if (fhTOFdistance[i])
+ delete fhTOFdistance[i];
}
if(f1CutMaxDCAToVertexXYPtDep)delete f1CutMaxDCAToVertexXYPtDep;
fhPt[i] = 0;
fhEta[i] = 0;
+ fhTOFdistance[i] = 0;
}
ffDTheoretical = 0;
target.fCutMinDCAToVertexZ = fCutMinDCAToVertexZ;
target.fCutMaxDCAToVertexXYPtDep = fCutMaxDCAToVertexXYPtDep;
- target.SetMaxDCAToVertexXYPtDep(fCutMaxDCAToVertexXYPtDep.Data());
+ if(fCutMaxDCAToVertexXYPtDep.Length()>0)target.SetMaxDCAToVertexXYPtDep(fCutMaxDCAToVertexXYPtDep.Data());
target.fCutMaxDCAToVertexZPtDep = fCutMaxDCAToVertexZPtDep;
- target.SetMaxDCAToVertexZPtDep(fCutMaxDCAToVertexZPtDep.Data());
+ if(fCutMaxDCAToVertexZPtDep.Length()>0)target.SetMaxDCAToVertexZPtDep(fCutMaxDCAToVertexZPtDep.Data());
target.fCutMinDCAToVertexXYPtDep = fCutMinDCAToVertexXYPtDep;
- target.SetMinDCAToVertexXYPtDep(fCutMinDCAToVertexXYPtDep.Data());
+ if(fCutMinDCAToVertexXYPtDep.Length()>0)target.SetMinDCAToVertexXYPtDep(fCutMinDCAToVertexXYPtDep.Data());
target.fCutMinDCAToVertexZPtDep = fCutMinDCAToVertexZPtDep;
- target.SetMinDCAToVertexZPtDep(fCutMinDCAToVertexZPtDep.Data());
+ if(fCutMinDCAToVertexZPtDep.Length()>0)target.SetMinDCAToVertexZPtDep(fCutMinDCAToVertexZPtDep.Data());
target.fPMin = fPMin;
target.fPMax = fPMax;
target.fRapMin = fRapMin;
target.fRapMax = fRapMax;
+ target.fFlagCutTOFdistance = fFlagCutTOFdistance;
+ target.fCutTOFdistance = fCutTOFdistance;
+ target.fCutRequireTOFout = fCutRequireTOFout;
+
target.fHistogramsOn = fHistogramsOn;
for (Int_t i=0; i<2; ++i)
if (fhPt[i]) target.fhPt[i] = (TH1F*) fhPt[i]->Clone();
if (fhEta[i]) target.fhEta[i] = (TH1F*) fhEta[i]->Clone();
+ if (fhTOFdistance[i]) target.fhTOFdistance[i] = (TH2F*) fhTOFdistance[i]->Clone();
}
if (ffDTheoretical) target.ffDTheoretical = (TF1*) ffDTheoretical->Clone();
fhPt[i] ->Add(entry->fhPt[i]);
fhEta[i] ->Add(entry->fhEta[i]);
+ fhTOFdistance[i] ->Add(entry->fhTOFdistance[i]);
}
fhCutStatistics ->Add(entry->fhCutStatistics);
if(selPrimaries) {
// 7*(0.0050+0.0060/pt^0.9)
esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0350+0.0420/pt^0.9");
+ esdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
}
esdTrackCuts->SetMaxDCAToVertexZ(1.e6);
esdTrackCuts->SetDCAToVertex2D(kFALSE);
//esdTrackCuts->SetEtaRange(-0.8,+0.8);
esdTrackCuts->SetMaxChi2PerClusterITS(36);
- esdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
return esdTrackCuts;
}
+//____________________________________________________________________
+AliESDtrackCuts* AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(Bool_t selPrimaries, Int_t clusterCut)
+{
+ // creates an AliESDtrackCuts object and fills it with standard values for ITS-TPC cuts for pp 2011 data
+ // if clusterCut = 1, the cut on the number of clusters is replaced by
+ // a cut on the number of crossed rows and on the ration crossed
+ // rows/findable clusters
+
+ AliInfoClass("Creating track cuts for ITS+TPC (2011 definition).");
+
+ AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
+
+ // TPC
+ if(clusterCut == 0) esdTrackCuts->SetMinNClustersTPC(50);
+ else if (clusterCut == 1) {
+ esdTrackCuts->SetMinNCrossedRowsTPC(70);
+ esdTrackCuts->SetMinRatioCrossedRowsOverFindableClustersTPC(0.8);
+ }
+ else {
+ AliWarningClass(Form("Wrong value of the clusterCut parameter (%d), using cut on Nclusters",clusterCut));
+ esdTrackCuts->SetMinNClustersTPC(50);
+ }
+ esdTrackCuts->SetMaxChi2PerClusterTPC(4);
+ esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
+ esdTrackCuts->SetRequireTPCRefit(kTRUE);
+ // ITS
+ esdTrackCuts->SetRequireITSRefit(kTRUE);
+ esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
+ AliESDtrackCuts::kAny);
+ if(selPrimaries) {
+ // 7*(0.0015+0.0050/pt^1.1)
+ esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0105+0.0350/pt^1.1");
+ esdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
+ }
+ esdTrackCuts->SetMaxDCAToVertexZ(2);
+ esdTrackCuts->SetDCAToVertex2D(kFALSE);
+ esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
+
+ esdTrackCuts->SetMaxChi2PerClusterITS(36);
+
+ return esdTrackCuts;
+}
+
//____________________________________________________________________
AliESDtrackCuts* AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(Bool_t selPrimaries,Int_t clusterCut)
{
if(selPrimaries) {
// 7*(0.0026+0.0050/pt^1.01)
esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
+ esdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
}
esdTrackCuts->SetMaxDCAToVertexZ(2);
esdTrackCuts->SetDCAToVertex2D(kFALSE);
esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
esdTrackCuts->SetMaxChi2PerClusterITS(36);
- esdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
return esdTrackCuts;
}
}
//____________________________________________________________________
-Bool_t AliESDtrackCuts::AcceptTrack(const AliESDtrack* esdTrack, const AliESDEvent* esdEvent)
+Bool_t AliESDtrackCuts::AcceptTrack(const AliESDtrack* esdTrack)
{
//
// figure out if the tracks survives all the track cuts defined
}
if(nMissITSpts>fCutMaxMissingITSPoints) cuts[38] = kTRUE;
+ //kTOFout
+ if (fCutRequireTOFout && (status&AliESDtrack::kTOFout)==0)
+ cuts[40]=kTRUE;
+
+ // TOF signal Dz cut
+ Float_t dxTOF = esdTrack->GetTOFsignalDx();
+ Float_t dzTOF = esdTrack->GetTOFsignalDz();
+ if (fFlagCutTOFdistance && (esdTrack->GetStatus() & AliESDtrack::kTOFout) == AliESDtrack::kTOFout){ // applying the TOF distance cut only if requested, and only on tracks that reached the TOF and where associated with a TOF hit
+ if (fgBeamTypeFlag < 0) { // the check on the beam type was not done yet
+ const AliESDEvent* event = esdTrack->GetESDEvent();
+ if (event){
+ TString beamTypeESD = event->GetBeamType();
+ AliDebug(2,Form("Beam type from ESD event = %s",beamTypeESD.Data()));
+ if (beamTypeESD.CompareTo("A-A",TString::kIgnoreCase) == 0){ // we are in PbPb collisions --> fgBeamTypeFlag will be set to 1, to apply the cut on TOF signal Dz
+ fgBeamTypeFlag = 1;
+ }
+ else { // we are NOT in PbPb collisions --> fgBeamTypeFlag will be set to 0, to NOT apply the cu6 on TOF signal Dz
+ fgBeamTypeFlag = 0;
+ }
+ }
+ else{
+ AliFatal("Beam type not available, but it is needed to apply the TOF cut!");
+ }
+ }
+
+ if (fgBeamTypeFlag == 1){ // we are in PbPb collisions --> apply the cut on TOF signal Dz
+ Float_t radiusTOF = TMath::Sqrt(dxTOF*dxTOF + dzTOF*dzTOF);
+ AliDebug(3,Form("TOF check (with fCutTOFdistance = %f) --> dx = %f, dz = %f, radius = %f", fCutTOFdistance, dxTOF, dzTOF, radiusTOF));
+ if (radiusTOF > fCutTOFdistance){
+ AliDebug(2, Form("************* the radius is outside the range! %f > %f, the track will be skipped", radiusTOF, fCutTOFdistance));
+ cuts[41] = kTRUE;
+ }
+ }
+ }
+
Bool_t cut=kFALSE;
for (Int_t i=0; i<kNCuts; i++)
if (cuts[i]) {cut = kTRUE;}
// max chi2 TPC constrained vs global track only if track passed the other cut
if (fCutMaxChi2TPCConstrainedVsGlobal < 1e9)
{
+ const AliESDEvent* esdEvent = esdTrack->GetESDEvent();
+
if (!esdEvent)
- AliFatal("fCutMaxChi2TPCConstrainedVsGlobal set but ESD event not provided.");
+ AliFatal("fCutMaxChi2TPCConstrainedVsGlobal set but ESD event not set in AliESDTrack. Use AliESDTrack::SetESDEvent before calling AliESDtrackCuts.");
// get vertex
const AliESDVertex* vertex = 0;
}
}
}
-
+
//########################################################################
// filling histograms
if (fHistogramsOn) {
fhPt[id]->Fill(pt);
fhEta[id]->Fill(eta);
+ fhTOFdistance[id]->Fill(dxTOF, dzTOF);
Float_t bRes[2];
bRes[0] = TMath::Sqrt(bCov[0]);
if (!tpcTrack)
continue;
- if (AcceptTrack(tpcTrack, esd)) {
+ if (AcceptTrack(tpcTrack)) {
acceptedTracks->Add(tpcTrack);
}
else
else
{
AliESDtrack* track = esd->GetTrack(iTrack);
- if(AcceptTrack(track, esd))
+ if(AcceptTrack(track))
acceptedTracks->Add(track);
}
}
// loop over esd tracks
for (Int_t iTrack = 0; iTrack < esd->GetNumberOfTracks(); iTrack++) {
AliESDtrack* track = esd->GetTrack(iTrack);
- if (AcceptTrack(track, esd))
+ if (AcceptTrack(track))
count++;
}
fhPt[i] = new TH1F("pt" ,"p_{T} distribution;p_{T} (GeV/c)", 800, 0.0, 10.0);
fhEta[i] = new TH1F("eta" ,"#eta distribution;#eta",40,-2.0,2.0);
+ fhTOFdistance[i] = new TH2F("TOFdistance" ,"TOF distance;dx (cm};dz (cm)", 150, -15, 15, 150, -15, 15);
fhNClustersITS[i]->SetTitle("n ITS clusters");
fhNClustersTPC[i]->SetTitle("n TPC clusters");
fhPt[i] = dynamic_cast<TH1F*> (gDirectory->Get("pt"));
fhEta[i] = dynamic_cast<TH1F*> (gDirectory->Get("eta"));
+ fhTOFdistance[i] = dynamic_cast<TH2F*> (gDirectory->Get("TOFdistance"));
gDirectory->cd("../");
}
fhPt[i] ->Write();
fhEta[i] ->Write();
+ fhTOFdistance[i] ->Write();
gDirectory->cd("../");
}
return multiplicityEstimate;
}
+
+//____________________________________________________________________
+void AliESDtrackCuts::SetRequireStandardTOFmatchCuts(){
+
+ // setting the TOF cuts flags (kTOFout = TOF matching distance) to true, to include the selection on the standard TOF matching
+
+ SetRequireTOFout(kTRUE);
+ SetFlagCutTOFdistance(kTRUE);
+ SetCutTOFdistance(3.);
+
+}
+