#include <TDirectory.h>
#include <TH2F.h>
#include <TF1.h>
+#include <TBits.h>
//____________________________________________________________________
ClassImp(AliESDtrackCuts)
"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);
AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
// TPC
- if(clusterCut == 0) esdTrackCuts->SetMinNClustersTPC(70);
+ 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(70);
+ esdTrackCuts->SetMinNClustersTPC(50);
}
esdTrackCuts->SetMaxChi2PerClusterTPC(4);
esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexZ) < fCutMinDCAToVertexZ)
cuts[27] = kTRUE;
- for (Int_t i = 0; i < 3; i++)
- cuts[28+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], esdTrack->HasPointOnITSLayer(i*2), esdTrack->HasPointOnITSLayer(i*2+1));
+ for (Int_t i = 0; i < 3; i++) {
+ if(!(esdTrack->GetStatus()&AliESDtrack::kITSupg)) { // current ITS
+ cuts[28+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], esdTrack->HasPointOnITSLayer(i*2), esdTrack->HasPointOnITSLayer(i*2+1));
+ } else { // upgraded ITS (7 layers)
+ // at the moment, for L012 the layers 12 are considered together
+ if(i==0) { // L012
+ cuts[28+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], esdTrack->HasPointOnITSLayer(0), (esdTrack->HasPointOnITSLayer(1))&(esdTrack->HasPointOnITSLayer(2)));
+ } else { // L34 or L56
+ cuts[28+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], esdTrack->HasPointOnITSLayer(i*2+1), esdTrack->HasPointOnITSLayer(i*2+2));
+ }
+ }
+ }
if(fCutRequireITSStandAlone || fCutRequireITSpureSA){
if ((status & AliESDtrack::kITSin) == 0 || (status & AliESDtrack::kTPCin)){
}
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;}
}
}
}
-
+
//########################################################################
// 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]);
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("../");
}
const Int_t kSecBit = BIT(16); // set this bit in global tracks if it is secondary according to a cut
for(Int_t itracks=0; itracks < nESDTracks; itracks++) {
- if(esd->GetTrack(itracks)->GetLabel() > highestID) highestID = esd->GetTrack(itracks)->GetLabel();
esd->GetTrack(itracks)->ResetBit(kSecBit|kRejBit); //reset bits used for flagging secondaries and rejected tracks in case they were changed before this analysis
}
- const Int_t maxid = highestID+1; // used to define bool array for check multiple associations of tracklets to one track. array starts at 0.
+ const Int_t maxid = nESDTracks+1; // used to define bool array for check multiple associations of tracklets to one track. array starts at 0.
// bit mask for esd tracks, to check if multiple tracklets are associated to it
- Bool_t globalBits[maxid], pureITSBits[maxid];
- for(Int_t i=0; i<maxid; i++){ // set all bools to false
- globalBits[i]=kFALSE;
- pureITSBits[i]=kFALSE;
- }
+ TBits globalBits(maxid), pureITSBits(maxid);
+ // why labels are used with the data? RS
+ // Bool_t globalBits[maxid], pureITSBits[maxid];
+ // for(Int_t i=0; i<maxid; i++){ // set all bools to false
+ // globalBits[i]=kFALSE;
+ // pureITSBits[i]=kFALSE;
+ // }
//*******************************************************************************************************
// get multiplicity from global tracks
track->SetBit(kSecBit);
continue;
}
-
+ /* done via proper DCA cut
//secondary?
if (track->IsOn(AliESDtrack::kMultSec)) {
track->SetBit(kSecBit);
continue;
}
-
+ */
// check tracks with ITS part
//*******************************************************************************************************
if (track->IsOn(AliESDtrack::kITSin) && !track->IsOn(AliESDtrack::kITSpureSA) && trackType == kTrackletsITSTPC) { // track has ITS part but is not an ITS_SA
if (fgMultEstTrackCuts[kMultEstTrackCutGlobal]->AcceptTrack(track)) { // good ITSTPC track
if (fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->AcceptTrack(track) || fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->AcceptTrack(track)) {
tracksITSTPC++; //global track counted
- globalBits[itracks] = kTRUE;
+ globalBits.SetBitNumber(itracks);
}
else track->SetBit(kSecBit); // large DCA -> secondary, don't count either track not associated tracklet
}
else if (fgMultEstTrackCuts[kMultEstTrackCutITSSA]->AcceptTrack(track)) { // good ITS complementary track
if (fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->AcceptTrack(track) || fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->AcceptTrack(track)) {
tracksITSTPCSA_complementary++;
- globalBits[itracks] = kTRUE;
+ globalBits.SetBitNumber(itracks);
}
else track->SetBit(kSecBit); // large DCA -> secondary, don't count either track not associated tracklet
}
if (fgMultEstTrackCuts[kMultEstTrackCutITSSA]->AcceptTrack(track)) { // good ITSSA track
if (fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->AcceptTrack(track) || fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->AcceptTrack(track)) {
tracksITSSA++;
- pureITSBits[itracks] = kTRUE;
+ pureITSBits.SetBitNumber(itracks);
}
else track->SetBit(kRejBit);
}
// are both clusters from the same tracks? If not, skip the tracklet (shouldn't change things much)
if ((id1!=id2 && id1>=0 && id2>=0) || (id3!=id4 && id3>=0 && id4>=0)) continue;
- Bool_t bUsedInGlobal = (id1 != -1) ? globalBits[id1] : 0;// has associated global track been associated to a previous tracklet?
- Bool_t bUsedInPureITS = (id3 != -1) ? pureITSBits[id3] : 0;// has associated pure ITS track been associated to a previous tracklet?
+ Bool_t bUsedInGlobal = (id1 != -1) ? globalBits.TestBitNumber(id1) : 0;// has associated global track been associated to a previous tracklet?
+ Bool_t bUsedInPureITS = (id3 != -1) ? pureITSBits.TestBitNumber(id3) : 0;// has associated pure ITS track been associated to a previous tracklet?
//*******************************************************************************************************
if (trackType == kTrackletsITSTPC) {
// count tracklets towards global+complementary tracks
(tr1 && tr1->TestBit(kRejBit)) ) { // count tracklet as bad quality track
if(!bUsedInGlobal){
++trackletsITSTPC_complementary;
- if(id1>0) globalBits[id1] = kTRUE; // mark global track linked to this tracklet as "associated"
+ if(id1>0) globalBits.SetBitNumber(id1); // mark global track linked to this tracklet as "associated"
}
}
else if(id1<0) {
(tr3 && tr3->TestBit(kRejBit)) ) { // count tracklet as bad quality track
if(!bUsedInPureITS) {
++trackletsITSSA_complementary;
- if(id3>0) pureITSBits[id3] = kTRUE; // mark global track linked to this tracklet as "associated"
+ if(id3>0) pureITSBits.SetBitNumber(id3); // mark global track linked to this tracklet as "associated"
}
}
else if(id3<0) {
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.);
+
+}
+