1 /**************************************************************************
2 * This file is property of and copyright by the ALICE HLT Project *
3 * ALICE Experiment at CERN, All rights reserved. *
5 * Primary Author: Svein Lindal <slindal@fys.uio.no> *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 /// @file AliConversionTrackCuts.cxx
17 /// @author Svein Lindal
18 /// @brief Base class for analysation of conversion particle - track correlations - track cuts
21 #include "AliConversionTrackCuts.h"
22 //#include "AliAODTrack.h"
23 #include "AliAODEvent.h"
27 #include "AliESDtrackCuts.h"
30 ClassImp(AliConversionTrackCuts)
33 const char* AliConversionTrackCuts::fgkCutNames[AliConversionTrackCuts::kNCuts] = {
46 //________________________________________________________________________
47 AliConversionTrackCuts::AliConversionTrackCuts() :
50 fEsdTrackCutsExtra1(NULL),
51 fEsdTrackCutsExtra2(NULL),
70 fOwnedTracks.SetOwner(kTRUE);
72 //________________________________________________________________________
73 AliConversionTrackCuts::AliConversionTrackCuts(TString name, TString title = "title") :
74 AliAnalysisCuts(name, title),
76 fEsdTrackCutsExtra1(NULL),
77 fEsdTrackCutsExtra2(NULL),
96 fOwnedTracks.SetOwner(kTRUE);
100 //________________________________________________________________________________
101 AliConversionTrackCuts::~AliConversionTrackCuts() {
104 // delete fHistograms;
105 // fHistograms = NULL;
108 delete fEsdTrackCuts;
109 fEsdTrackCuts = NULL;
111 if(fEsdTrackCutsExtra1)
112 delete fEsdTrackCutsExtra1;
113 fEsdTrackCutsExtra1 = NULL;
115 if(fEsdTrackCutsExtra2)
116 delete fEsdTrackCutsExtra2;
117 fEsdTrackCutsExtra2 = NULL;
119 fOwnedTracks.Delete();
122 //______________________________________________________________________________
123 void AliConversionTrackCuts::DefineESDCuts() {
124 // Reproduces the cuts of the corresponding bit in the ESD->AOD filtering
125 // (see $ALICE_ROOT/ANALYSIS/macros/AddTaskESDFilter.C)
126 ///Copied from alianalyseleadingue
127 const Int_t filterbit = fFilterBit;
129 if (filterbit == 128) {
131 fEsdTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
132 fEsdTrackCuts->SetMinNClustersTPC(70);
134 } else if (filterbit == 256) {
137 fEsdTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
138 fEsdTrackCuts->SetMinNClustersTPC(80);
139 fEsdTrackCuts->SetMaxChi2PerClusterTPC(3);
140 fEsdTrackCuts->SetMaxDCAToVertexZ(2.7);
141 fEsdTrackCuts->SetMaxDCAToVertexXY(1.9);
143 } else if (filterbit == 512) {
146 fEsdTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
147 fEsdTrackCuts->SetMinNClustersTPC(60);
148 fEsdTrackCuts->SetMaxChi2PerClusterTPC(5);
149 fEsdTrackCuts->SetMaxDCAToVertexZ(3.7);
150 fEsdTrackCuts->SetMaxDCAToVertexXY(2.9);
152 } else if (filterbit == 1024) {
154 fEsdTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
155 fEsdTrackCuts->SetMinNClustersTPC(-1);
156 fEsdTrackCuts->SetMinNCrossedRowsTPC(70);
157 fEsdTrackCuts->SetMinRatioCrossedRowsOverFindableClustersTPC(0.8);
159 } else if (filterbit == 2048) {
160 // mimic hybrid tracks
161 // correspond to esdTrackCutsHTG, but WITHOUT spd constraint. this is checked with the next object
163 fEsdTrackCuts = new AliESDtrackCuts();
164 TFormula *f1NClustersTPCLinearPtDep = new TFormula("f1NClustersTPCLinearPtDep","70.+30./20.*x");
165 fEsdTrackCuts->SetMinNClustersTPCPtDep(f1NClustersTPCLinearPtDep, 100);
166 fEsdTrackCuts->SetMaxChi2PerClusterTPC(4);
167 fEsdTrackCuts->SetRequireTPCStandAlone(kTRUE);
168 fEsdTrackCuts->SetAcceptKinkDaughters(kFALSE);
169 fEsdTrackCuts->SetRequireTPCRefit(kTRUE);
170 fEsdTrackCuts->SetMaxFractionSharedTPCClusters(0.4);
172 fEsdTrackCuts->SetMaxDCAToVertexXY(2.4);
173 fEsdTrackCuts->SetMaxDCAToVertexZ(3.2);
174 fEsdTrackCuts->SetDCAToVertex2D(kTRUE);
176 fEsdTrackCuts->SetMaxChi2PerClusterITS(36);
177 fEsdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
179 fEsdTrackCuts->SetRequireSigmaToVertex(kFALSE);
181 fEsdTrackCuts->SetEtaRange(-0.9, 0.9);
182 fEsdTrackCuts->SetPtRange(0.1, 1000000.0);
184 fEsdTrackCuts->SetRequireITSRefit(kFALSE); //not here, n
186 // Add SPD requirement
187 fEsdTrackCutsExtra1 = new AliESDtrackCuts("SPD", "Require 1 cluster in SPD");
188 fEsdTrackCutsExtra1->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny);
189 fEsdTrackCutsExtra1->SetRequireITSRefit(kTRUE);
190 // A track passing fEsdTrackCuts and fEsdTrackCutsExtra1 corresponds to esdTrackCutsHTG
192 fEsdTrackCutsExtra2 = new AliESDtrackCuts("No_SPD", "Reject tracks with cluster in SPD");
193 fEsdTrackCutsExtra2->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kNone);
194 // A track passing fEsdTrackCuts and fEsdTrackCutsExtra2 corresponds to esdTrackCutsHTGC and needs to be constrained
201 //______________________________________________________________________________
202 Bool_t AliConversionTrackCuts::AcceptTrack(AliESDtrack * track) {
204 FillHistograms(kPreCut, track);
207 if( fFilterBit == 256) {
209 ///Standalone tpc tracks constrained
210 const AliExternalTrackParam * param = track->GetConstrainedParam();
212 AliESDtrack* esdTrack = new AliESDtrack(*track);
213 esdTrack->CopyFromVTrack(param);
215 fOwnedTracks.Add(track);
217 if( !fEsdTrackCuts->IsSelected(track)) return kFALSE;
219 FillHistograms(1, track);
224 FillDCAHist(dca[1], dca[0], track);
225 if(fhEtaPhi) fhEtaPhi->Fill(track->Eta(), track->Phi());
238 // if(fDCAXYmax > 0) {
239 // if(fEsdTrackCuts) fEsdTrackCuts->SetMaxDCAToVertexXY(fDCAXYmax);
241 // if(fDCAZmax > 0) {
242 // if(fEsdTrackCuts) fEsdTrackCuts->SetMaxDCAToVertexZ(fDCAZmax);
245 fInitialized = kTRUE;
253 ///If only one track cuts then it has passed the cuts
254 if( !(fEsdTrackCutsExtra1 && fEsdTrackCutsExtra2)) {
255 FillHistograms(1, track);
256 FillDCAHist(dca[1], dca[0], track);
257 if(fhEtaPhi) fhEtaPhi->Fill(track->Eta(), track->Phi());
262 if (fEsdTrackCutsExtra1 && fEsdTrackCutsExtra1->IsSelected(track)) {
263 FillHistograms(1, track);
264 FillHistograms(2, track);
266 FillDCAHist(dca[1], dca[0], track);
267 if(fhEtaPhi) fhEtaPhi->Fill(track->Eta(), track->Phi());
273 if (fEsdTrackCutsExtra2 && fEsdTrackCutsExtra2->IsSelected(track)) {
274 const AliExternalTrackParam * param = track->GetConstrainedParam();
276 AliESDtrack* esdTrack = new AliESDtrack(*track);
277 esdTrack->CopyFromVTrack(param);
279 fOwnedTracks.Add(track);
281 FillHistograms(3, track);
282 FillHistograms(1, track);
284 FillDCAHist(dca[1], dca[0], track);
285 if(fhEtaPhi) fhEtaPhi->Fill(track->Eta(), track->Phi());
295 cout << "error error, should not be herer!"<<endl;
298 // FillHistograms(kPreCut + 1, track);
301 // fhnclpt->Fill(track->Pt(), track->GetTPCNcls());
302 // if(track->GetTPCNclsF() > 0) fhnclsfpt->Fill(track->Pt(), ((Double_t) track->GetTPCNcls())/track->GetTPCNclsF());
303 // FillHistograms(kPreCut + 1, track);
305 // ///Get impact parameters
306 // Double_t extCov[15];
307 // track->GetExternalCovariance(extCov);
311 Bool_t AliConversionTrackCuts::AcceptTrack(AliAODTrack * track) {
314 FillHistograms(kPreCut, track);
316 if (fFilterBit == 768) {
317 if(!track->IsHybridGlobalConstrainedGlobal()) return kFALSE;
319 if (!(track->GetStatus() & AliVTrack::kITSrefit)) {
323 //The cluster sharing cut can be done with:
324 Double_t frac = Double_t(track->GetTPCnclsS()) / Double_t(track->GetTPCncls());
325 if (frac > 0.4) return kFALSE;
328 FillHistograms(1, track);
331 Double_t dca[2] = { -999, -999};
334 FillDCAHist(dca[1], dca[0], track);
337 if(track->IsGlobalConstrained()) {
338 FillHistograms(3, track);
340 FillHistograms(2, track);
343 if(fhEtaPhi) fhEtaPhi->Fill(track->Eta(), track->Phi());
347 ////////////////////////////////
349 ////////////////////////////////
350 } else if(fFilterBit == 256) {
351 if(!track->IsTPCConstrained()) return kFALSE;
356 Double_t dca[2] = { -999, -999};
359 if( (dca[0]*dca[0]/fDCAXYmax + dca[1]*dca[1]/fDCAZmax) > 1 ) {
360 FillHistograms(3, track);
364 if(track->GetTPCncls() < 70) {
365 FillHistograms(4, track);
369 AliAODVertex * vtx = track->GetProdVertex();
370 if (vtx->GetType() == AliAODVertex::kKink ) {
371 FillHistograms(5, track);
375 if(track->Chi2perNDF() > 36) {
376 FillHistograms(6, track);
379 if(track->Chi2perNDF() > 26) {
380 FillHistograms(7, track);
383 if(track->Chi2perNDF() > 16) {
384 FillHistograms(8, track);
387 if(track->Chi2perNDF() > 4) {
388 FillHistograms(9, track);
394 FillDCAHist(dca[1], dca[0], track);
396 FillHistograms(2, track);
397 if(fhEtaPhi) fhEtaPhi->Fill(track->Eta(), track->Phi());
405 ///______________________________________________________________________________
406 Bool_t AliConversionTrackCuts::GetDCA(const AliESDtrack *track, Double_t dcaxyz[2]) {
407 ///Get track dca esd trck
410 track->GetImpactParameters(dca,bCov);
411 if (bCov[0]<=0 || bCov[2]<=0) {
412 AliDebug(1, "Estimated b resolution lower or equal zero!");
413 bCov[0]=0; bCov[2]=0;
423 ///_____________________________________________________________________________
424 Bool_t AliConversionTrackCuts::GetDCA(const AliAODTrack *track, Double_t dca[2]) {
425 ///Get track dca aod trck
426 if(track->TestBit(AliAODTrack::kIsDCA)){
428 dca[1]=track->ZAtDCA();
435 //AliAODTrack copy(*track);
436 AliExternalTrackParam etp; etp.CopyFromVTrack(track);
438 Float_t xstart = etp.GetX();
442 //printf("This method can be used only for propagation inside the beam pipe \n");
447 AliAODVertex *vtx =(AliAODVertex*)(fEvent->GetPrimaryVertex());
448 Double_t fBzkG = fEvent->GetMagneticField(); // z componenent of field in kG
449 ok = etp.PropagateToDCA(vtx,fBzkG,kVeryBig,dca,covdca);
450 //ok = copy.PropagateToDCA(vtx,fBzkG,kVeryBig,dca,covdca);
461 TList * AliConversionTrackCuts::CreateHistograms() {
462 //Create the histograms
464 if(!fHistograms) fHistograms = new TList();
466 fHistograms->SetOwner(kTRUE);
467 fHistograms->SetName("trackCuts");
469 fhPhi = new TH2F(Form("phi_%s", GetName()), Form("phi_%s", GetTitle()), 5, -0.5, 4.5, 32, 0, TMath::TwoPi());
470 // TAxis * xax = fhPhi->GetXaxis();
471 // for(Int_t i = 0; i < kNCuts; i++){
472 // xax->SetBinLabel(xax->FindFixBin(i), fgkCutNames[i]);
474 fHistograms->Add(fhPhi);
477 fhEtaPhi = new TH2F(Form("etaphi_%s",GetName()), Form("etaphi_%s", GetTitle()), 36, -0.9, 0.9, 32, 0, TMath::TwoPi());
478 fHistograms->Add(fhEtaPhi);
480 // fhPt = new TH2F("pt", "pt", kNCuts+2, kPreCut -0.5, kNCuts + 0.5,
482 // xax = fhPt->GetXaxis();
483 // for(Int_t i = 0; i < kNCuts; i++){
484 // xax->SetBinLabel(xax->FindFixBin(i), fgkCutNames[i]);
486 // fHistograms->Add(fhPt);
488 // fhPhiPt = new TH2F("phipt", "phipt", 100, 0, 100, 64, 0, TMath::TwoPi());
489 //fHistograms->Add(fhPhiPt);
491 fhdcaxyPt = new TH2F(Form("dcaxypt_%s", GetName()), Form("dcaxypt_%s", GetTitle()), 20, 0, 20, 50, -2.5, 2.5);
492 fHistograms->Add(fhdcaxyPt);
494 fhdcazPt = new TH2F(Form("dcazpt_%s", GetName()), Form("dcazpt_%s", GetTitle()), 20, 0, 20, 70, -3.5, 3.5);
495 fHistograms->Add(fhdcazPt);
497 fhdca = new TH2F(Form("dca_%s", GetName()), Form("dca_%s", GetTitle()), 70, -3.5, 3.5, 50, -2.5, 2.5);
498 fhdca->SetXTitle("dca z");
499 fhdca->SetYTitle("dca xy");
502 fHistograms->Add(fhdca);
504 // fhnclpt = new TH2F("nclstpcvspt", "nclstpcvspt", 20, 0, 20, 50, 0, 100);
505 // fHistograms->Add(fhnclpt);
507 // fhnclsfpt = new TH2F("nclsfpt", "nclsfpt", 20, 0, 20, 60, 0, 1.2);
508 // fHistograms->Add(fhnclsfpt);
513 void AliConversionTrackCuts::FillHistograms(Int_t cutIndex, AliVTrack * track) {
516 if(fhPhi) fhPhi->Fill(cutIndex, track->Phi());
517 // if(fhPt) fhPt->Fill(cutIndex, track->Pt());
518 //if(passed) fhPhiPt->Fill(track->Pt(), track->Phi());
522 void AliConversionTrackCuts::FillDCAHist(Float_t dcaz, Float_t dcaxy, AliVTrack * track) {
523 if(fhdcaxyPt) fhdcaxyPt->Fill(track->Pt(), dcaxy);
524 if(fhdcazPt) fhdcazPt->Fill(track->Pt(), dcaz);
525 if(fhdca) fhdca->Fill(dcaz, dcaxy);
531 //_________________________________________________________________________________________________
532 void AliConversionTrackCuts::Print(const Option_t *) const
535 // Print information on this cut
538 // printf("Cut name : %s \n", GetName());
539 // printf("Kink daughters are : %s \n", (fRejectKinkDaughters ? "rejected" : "accepted"));
540 // printf("TPC requirements : clusters/findable %f, min. cluster = %d, max chi2 = %f, %s require refit\n", fTPCClusOverFindable, fTPCminNClusters, fTPCmaxChi2, (fRequireTPCRefit) ? "" : "Don't");
541 // printf("ITS requirements : min. cluster = %d (all), %d (SPD), max chi2 = %f \n", fITSminNClusters, fSPDminNClusters, fITSmaxChi2);
542 // printf("DCA z cut : fixed to %f cm \n", fDCAZmax);
543 // printf("DCA xy cut : fixed to %f cm \n", fDCAXYmax)
547 //_________________________________________________________________________________________________
549 Bool_t AliConversionTrackCuts::IsSelected(TObject * object ) {
550 AliAODTrack * aodtrack = dynamic_cast<AliAODTrack*>(object);
552 return AcceptTrack(aodtrack);
554 AliESDtrack * track = dynamic_cast<AliESDtrack*>(object);
556 return AcceptTrack(track);