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
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) {
130 fEsdTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
131 fEsdTrackCuts->SetMinNClustersTPC(70);
133 } else if (filterbit == 256) {
135 fEsdTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
136 fEsdTrackCuts->SetMinNClustersTPC(80);
137 fEsdTrackCuts->SetMaxChi2PerClusterTPC(3);
138 fEsdTrackCuts->SetMaxDCAToVertexZ(2.7);
139 fEsdTrackCuts->SetMaxDCAToVertexXY(1.9);
141 } else if (filterbit == 512) {
143 fEsdTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
144 fEsdTrackCuts->SetMinNClustersTPC(60);
145 fEsdTrackCuts->SetMaxChi2PerClusterTPC(5);
146 fEsdTrackCuts->SetMaxDCAToVertexZ(3.7);
147 fEsdTrackCuts->SetMaxDCAToVertexXY(2.9);
149 } else if (filterbit == 1024) {
151 fEsdTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
152 fEsdTrackCuts->SetMinNClustersTPC(-1);
153 fEsdTrackCuts->SetMinNCrossedRowsTPC(70);
154 fEsdTrackCuts->SetMinRatioCrossedRowsOverFindableClustersTPC(0.8);
156 } else if (filterbit == 2048) {
157 // mimic hybrid tracks
158 // correspond to esdTrackCutsHTG, but WITHOUT spd constraint. this is checked with the next object
160 fEsdTrackCuts = new AliESDtrackCuts();
161 TFormula *f1NClustersTPCLinearPtDep = new TFormula("f1NClustersTPCLinearPtDep","70.+30./20.*x");
162 fEsdTrackCuts->SetMinNClustersTPCPtDep(f1NClustersTPCLinearPtDep, 100);
163 fEsdTrackCuts->SetMaxChi2PerClusterTPC(4);
164 fEsdTrackCuts->SetRequireTPCStandAlone(kTRUE);
165 fEsdTrackCuts->SetAcceptKinkDaughters(kFALSE);
166 fEsdTrackCuts->SetRequireTPCRefit(kTRUE);
167 fEsdTrackCuts->SetMaxFractionSharedTPCClusters(0.4);
169 fEsdTrackCuts->SetMaxDCAToVertexXY(2.4);
170 fEsdTrackCuts->SetMaxDCAToVertexZ(3.2);
171 fEsdTrackCuts->SetDCAToVertex2D(kTRUE);
173 fEsdTrackCuts->SetMaxChi2PerClusterITS(36);
174 fEsdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
176 fEsdTrackCuts->SetRequireSigmaToVertex(kFALSE);
178 fEsdTrackCuts->SetEtaRange(-0.9, 0.9);
179 fEsdTrackCuts->SetPtRange(0.1, 1000000.0);
181 fEsdTrackCuts->SetRequireITSRefit(kFALSE); //not here, n
183 // Add SPD requirement
184 fEsdTrackCutsExtra1 = new AliESDtrackCuts("SPD", "Require 1 cluster in SPD");
185 fEsdTrackCutsExtra1->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny);
186 fEsdTrackCutsExtra1->SetRequireITSRefit(kTRUE);
187 // A track passing fEsdTrackCuts and fEsdTrackCutsExtra1 corresponds to esdTrackCutsHTG
189 fEsdTrackCutsExtra2 = new AliESDtrackCuts("No_SPD", "Reject tracks with cluster in SPD");
190 fEsdTrackCutsExtra2->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kNone);
191 // A track passing fEsdTrackCuts and fEsdTrackCutsExtra2 corresponds to esdTrackCutsHTGC and needs to be constrained
197 //______________________________________________________________________________
198 Bool_t AliConversionTrackCuts::AcceptTrack(AliESDtrack * track) {
204 if(fEsdTrackCuts) fEsdTrackCuts->SetMaxDCAToVertexXY(fDCAXYmax);
207 if(fEsdTrackCuts) fEsdTrackCuts->SetMaxDCAToVertexZ(fDCAZmax);
210 fInitialized = kTRUE;
213 FillHistograms(kPreCut, track);
217 if( !fEsdTrackCuts->IsSelected(track)) return kFALSE;
220 ///If only one track cuts then it has passed the cuts
221 if( !(fEsdTrackCutsExtra1 && fEsdTrackCutsExtra2)) {
222 FillHistograms(1, track);
226 if (fEsdTrackCutsExtra1 && fEsdTrackCutsExtra1->IsSelected(track)) {
227 FillHistograms(2, track);
228 FillHistograms(1, track);
233 if (fEsdTrackCutsExtra2 && fEsdTrackCutsExtra2->IsSelected(track)) {
234 const AliExternalTrackParam * param = track->GetConstrainedParam();
236 AliESDtrack* esdTrack = new AliESDtrack(*track);
237 esdTrack->CopyFromVTrack(param);
239 fOwnedTracks.Add(track);
241 FillHistograms(3, track);
242 FillHistograms(1, track);
251 cout << "error error, should not be herer!"<<endl;
254 // FillHistograms(kPreCut + 1, track);
257 // fhnclpt->Fill(track->Pt(), track->GetTPCNcls());
258 // if(track->GetTPCNclsF() > 0) fhnclsfpt->Fill(track->Pt(), ((Double_t) track->GetTPCNcls())/track->GetTPCNclsF());
259 // FillHistograms(kPreCut + 1, track);
261 // ///Get impact parameters
262 // Double_t extCov[15];
263 // track->GetExternalCovariance(extCov);
266 // track->GetImpactParameters(b,bCov);
267 // if (bCov[0]<=0 || bCov[2]<=0) {
268 // AliDebug(1, "Estimated b resolution lower or equal zero!");
269 // bCov[0]=0; bCov[2]=0;
272 // Float_t dcaToVertexXY = b[0];
273 // Float_t dcaToVertexZ = b[1];
274 // FillDCAHist(dcaToVertexZ, dcaToVertexXY, track);
278 Bool_t AliConversionTrackCuts::AcceptTrack(AliAODTrack * track) {
281 FillHistograms(kPreCut, track);
283 if(!track->IsHybridGlobalConstrainedGlobal()) return kFALSE;
285 if (!(track->GetStatus() & AliVTrack::kITSrefit)) {
291 //The cluster sharing cut can be done with:
292 Double_t frac = Double_t(track->GetTPCnclsS()) / Double_t(track->GetTPCncls());
293 if (frac > 0.4) return kFALSE;
297 FillHistograms(1, track);
300 Double_t dca[2] = { -999, -999};
303 FillDCAHist(dca[1], dca[0], track);
306 if(track->IsGlobalConstrained()) {
307 FillHistograms(3, track);
309 FillHistograms(2, track);
312 if(fhEtaPhi) fhEtaPhi->Fill(track->Eta(), track->Phi());
317 ///______________________________________________________________________________
318 Bool_t AliConversionTrackCuts::GetDCA(const AliAODTrack *track, Double_t dca[2]) {
319 if(track->TestBit(AliAODTrack::kIsDCA)){
321 dca[1]=track->ZAtDCA();
328 //AliAODTrack copy(*track);
329 AliExternalTrackParam etp; etp.CopyFromVTrack(track);
331 Float_t xstart = etp.GetX();
335 //printf("This method can be used only for propagation inside the beam pipe \n");
340 AliAODVertex *vtx =(AliAODVertex*)(fEvent->GetPrimaryVertex());
341 Double_t fBzkG = fEvent->GetMagneticField(); // z componenent of field in kG
342 ok = etp.PropagateToDCA(vtx,fBzkG,kVeryBig,dca,covdca);
343 //ok = copy.PropagateToDCA(vtx,fBzkG,kVeryBig,dca,covdca);
354 TList * AliConversionTrackCuts::CreateHistograms() {
355 //Create the histograms
357 if(!fHistograms) fHistograms = new TList();
359 fHistograms->SetOwner(kTRUE);
360 fHistograms->SetName("trackCuts");
362 fhPhi = new TH2F("phi", "phi", 5, -0.5, 4.5, 32, 0, TMath::TwoPi());
363 // TAxis * xax = fhPhi->GetXaxis();
364 // for(Int_t i = 0; i < kNCuts; i++){
365 // xax->SetBinLabel(xax->FindFixBin(i), fgkCutNames[i]);
367 fHistograms->Add(fhPhi);
370 fhEtaPhi = new TH2F("etahpi", "etaphi", 36, -0.9, 0.9, 32, 0, TMath::TwoPi());
371 fHistograms->Add(fhEtaPhi);
373 // fhPt = new TH2F("pt", "pt", kNCuts+2, kPreCut -0.5, kNCuts + 0.5,
375 // xax = fhPt->GetXaxis();
376 // for(Int_t i = 0; i < kNCuts; i++){
377 // xax->SetBinLabel(xax->FindFixBin(i), fgkCutNames[i]);
379 // fHistograms->Add(fhPt);
381 // fhPhiPt = new TH2F("phipt", "phipt", 100, 0, 100, 64, 0, TMath::TwoPi());
382 //fHistograms->Add(fhPhiPt);
384 fhdcaxyPt = new TH2F("dcaxypt", "dcaxypt", 20, 0, 20, 50, -2.5, 2.5);
385 fHistograms->Add(fhdcaxyPt);
387 fhdcazPt = new TH2F("dcazpt", "dcazpt", 20, 0, 20, 70, -3.5, 3.5);
388 fHistograms->Add(fhdcazPt);
390 fhdca = new TH2F("dca", "dca", 70, -3.5, 3.5, 50, -2.5, 2.5);
391 fhdca->SetXTitle("dca z");
392 fhdca->SetYTitle("dca xy");
395 fHistograms->Add(fhdca);
397 // fhnclpt = new TH2F("nclstpcvspt", "nclstpcvspt", 20, 0, 20, 50, 0, 100);
398 // fHistograms->Add(fhnclpt);
400 // fhnclsfpt = new TH2F("nclsfpt", "nclsfpt", 20, 0, 20, 60, 0, 1.2);
401 // fHistograms->Add(fhnclsfpt);
406 void AliConversionTrackCuts::FillHistograms(Int_t cutIndex, AliVTrack * track) {
409 if(fhPhi) fhPhi->Fill(cutIndex, track->Phi());
410 // if(fhPt) fhPt->Fill(cutIndex, track->Pt());
411 //if(passed) fhPhiPt->Fill(track->Pt(), track->Phi());
415 void AliConversionTrackCuts::FillDCAHist(Float_t dcaz, Float_t dcaxy, AliVTrack * track) {
416 if(fhdcaxyPt) fhdcaxyPt->Fill(track->Pt(), dcaxy);
417 if(fhdcazPt) fhdcazPt->Fill(track->Pt(), dcaz);
418 if(fhdca) fhdca->Fill(dcaz, dcaxy);
429 //_________________________________________________________________________________________________
430 void AliConversionTrackCuts::Print(const Option_t *) const
433 // Print information on this cut
436 // printf("Cut name : %s \n", GetName());
437 // printf("Kink daughters are : %s \n", (fRejectKinkDaughters ? "rejected" : "accepted"));
438 // printf("TPC requirements : clusters/findable %f, min. cluster = %d, max chi2 = %f, %s require refit\n", fTPCClusOverFindable, fTPCminNClusters, fTPCmaxChi2, (fRequireTPCRefit) ? "" : "Don't");
439 // printf("ITS requirements : min. cluster = %d (all), %d (SPD), max chi2 = %f \n", fITSminNClusters, fSPDminNClusters, fITSmaxChi2);
440 // printf("DCA z cut : fixed to %f cm \n", fDCAZmax);
441 // printf("DCA xy cut : fixed to %f cm \n", fDCAXYmax)
445 //_________________________________________________________________________________________________
447 Bool_t AliConversionTrackCuts::IsSelected(TObject * object ) {
448 AliAODTrack * aodtrack = dynamic_cast<AliAODTrack*>(object);
450 return AcceptTrack(aodtrack);
452 AliESDtrack * track = dynamic_cast<AliESDtrack*>(object);
454 return AcceptTrack(track);