]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGLF/SPECTRA/Nuclei/B2/AliLnAODtrackCuts.cxx
add momentum correction for tritons and He3
[u/mrichter/AliRoot.git] / PWGLF / SPECTRA / Nuclei / B2 / AliLnAODtrackCuts.cxx
CommitLineData
9e44412b 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
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 **************************************************************************/
15
16// AOD track cuts for B2
17// author: Eulogio Serradilla <eulogio.serradilla@cern.ch>
18
19#include <TMath.h>
20#include <TString.h>
21#include <TVector3.h>
22#include <AliPID.h>
23#include <AliAODEvent.h>
24#include <AliAODMCParticle.h>
25#include <AliAODTrack.h>
26#include "AliLnAODtrackCuts.h"
27
28ClassImp(AliLnAODtrackCuts)
29
30AliLnAODtrackCuts::AliLnAODtrackCuts()
31: TObject()
32, fTrackSel("its_tpc_dca")
33, fMaxDCAxy(1)
34, fMaxDCAz(2)
35, fMaxNSigma(3)
36, fMaxEta(0.8)
37, fTPCXRows(0)
38, fMinTPCnClsOrXRows(70)
39, fTOFmatch(0)
40{
41//
42// constructor
43}
44
45AliLnAODtrackCuts::~AliLnAODtrackCuts()
46{
47//
48// virtual destructor
49}
50
51void AliLnAODtrackCuts::SetSelectionCriteria(const TString& trksel)
52{
53//
54// set track selection criteria
55//
56 fTrackSel = trksel;
57 fTrackSel.ToLower();
58 fTOFmatch = (fTrackSel.Contains("tof")) ? kTRUE : kFALSE;
59}
60
61Bool_t AliLnAODtrackCuts::IsWithinGeoAcceptance(const AliAODMCParticle* prt) const
62{
63//
64// is particle within the geometrical acceptance?
65//
66 if( TMath::Abs(prt->Eta()) >= fMaxEta ) return kFALSE;
67
68 return kTRUE;
69}
70
71Bool_t AliLnAODtrackCuts::IsWithinGeoAcceptance(const AliAODTrack* trk) const
72{
73//
74// is track within the geometrical acceptance?
75//
76//
77 if( TMath::Abs(trk->Eta()) >= fMaxEta ) return kFALSE;
78
79 return kTRUE;
80}
81
82Bool_t AliLnAODtrackCuts::IsWithinGeoAcceptance(Double_t p[3]) const
83{
84//
85// is track within the geometrical acceptance?
86//
87//
88 TVector3 trk(p[0],p[1],p[2]);
89 if( TMath::Abs(trk.Eta()) >= fMaxEta ) return kFALSE;
90
91 return kTRUE;
92}
93
94Double_t AliLnAODtrackCuts::GetNTPCXRowsOverFindable(const AliAODTrack* trk) const
95{
96//
97// number of TPC crossed rows over findable
98//
99 if(trk->GetTPCNclsF() == 0) return -1;
100
101 return static_cast<Double_t>(trk->GetTPCNCrossedRows())/static_cast<Double_t>(trk->GetTPCNclsF());
102}
103
104Bool_t AliLnAODtrackCuts::AcceptItsTpcNSigma(const AliAODTrack* trk, Double_t b[2], Double_t bCov[3]) const
105{
106//
107// Check ITS-TPC nsigma base cuts
108//
109 if(!trk->IsOn(AliAODTrack::kITSrefit)) return kFALSE;
110 if(trk->GetITSNcls()<2) return kFALSE;
111 //if(trk->GetITSchi2PerCluster()>36) return kFALSE;
112
113 if(!trk->TestFilterBit(AliAODTrack::kTrkTPCOnly)) return kFALSE;
114 if(!trk->IsOn(AliAODTrack::kTPCrefit) ) return kFALSE;
115
116 if(fTPCXRows)
117 {
118 if(trk->GetTPCNCrossedRows()<fMinTPCnClsOrXRows) return kFALSE;
119 if(this->GetNTPCXRowsOverFindable(trk)< 0.8 ) return kFALSE;
120 }
121 else
122 {
123 if(trk->GetTPCNcls()<fMinTPCnClsOrXRows) return kFALSE;
124 }
125
126 //if(trk->GetTPCchi2Global()>36) return kFALSE;
127
128 if(this->GetNSigmaToVertex(b, bCov) > fMaxNSigma) return kFALSE;
129
130 return kTRUE;
131}
132
133Bool_t AliLnAODtrackCuts::AcceptItsTpcDCA(const AliAODTrack* trk, Double_t b[2]) const
134{
135//
136// Check ITS-TPC-DCA base cuts
137//
138
139
140 if(!trk->IsOn(AliAODTrack::kITSrefit) ) return kFALSE;
141 if(trk->GetITSNcls()<2) return kFALSE;
142 //if(trk->GetITSchi2PerCluster()>36) return kFALSE;
143
144 if(!trk->IsOn(AliAODTrack::kTPCrefit) ) return kFALSE;
145 if(!trk->TestFilterBit(AliAODTrack::kTrkTPCOnly)) return kFALSE;
146
147 if(fTPCXRows)
148 {
149 if(trk->GetTPCNCrossedRows()<fMinTPCnClsOrXRows) return kFALSE;
150 if(this->GetNTPCXRowsOverFindable(trk)< 0.8 ) return kFALSE;
151 }
152 else
153 {
154 if(trk->GetTPCNcls()<fMinTPCnClsOrXRows) return kFALSE;
155 }
156
157 //if(trk->GetTPCchi2Global()>36) return kFALSE;
158
159 if(TMath::Abs(b[0]) > fMaxDCAxy) return kFALSE;
160 if(TMath::Abs(b[1]) > fMaxDCAz) return kFALSE;
161
162 return kTRUE;
163}
164
165Bool_t AliLnAODtrackCuts::AcceptItsTpcStdCut(const AliAODTrack* trk, Double_t b[2]) const
166{
167//
168// standard cuts with very loose DCA
169//
170 if(!trk->TestFilterBit(AliAODTrack::kTrkGlobalNoDCA)) return kFALSE;
171
172 if(trk->GetTPCNcls()<70) return kFALSE;
173
174 if(TMath::Abs(b[0]) > fMaxDCAxy) return kFALSE;
175 if(TMath::Abs(b[1]) > fMaxDCAz) return kFALSE;
176
177 return kTRUE;
178}
179
180Bool_t AliLnAODtrackCuts::AcceptTOF(const AliAODTrack* trk) const
181{
182//
183// check TOF match signal
184//
185 if( !trk->IsOn(AliAODTrack::kTOFout) || !trk->IsOn(AliAODTrack::kTIME)) return kFALSE;
186 //if( trk->GetIntegratedLength() < 350) return kFALSE;
187 if( this->GetIntegratedLength(trk) < 350) return kFALSE;
188 if( trk->GetTOFsignal() < 1e-6) return kFALSE;
189
190 return kTRUE;
191}
192
193Bool_t AliLnAODtrackCuts::AcceptTrack(const AliAODTrack* trk, Double_t b[2], Double_t bCov[3]) const
194{
195//
196// check if the tracks fulfill the track selection criteria
197// from a predefined set of track cuts
198//
199 if(fTrackSel == "its_tpc_dca")
200 {
201 if(!this->AcceptItsTpcDCA(trk, b)) return kFALSE;
202 }
203 else if(fTrackSel == "its_tpc_dca_spd1")
204 {
205 if(!this->AcceptItsTpcDCA(trk, b)) return kFALSE;
206 if(!trk->HasPointOnITSLayer(0) ) return kFALSE;
207 }
208 else if(fTrackSel == "its_tpc_dca_spd" || fTrackSel == "its_tpc_dca_spd2")
209 {
210 if(!this->AcceptItsTpcDCA(trk, b)) return kFALSE;
211 if(!trk->HasPointOnITSLayer(0) && !trk->HasPointOnITSLayer(1) ) return kFALSE;
212 }
213 else if(fTrackSel == "its_tpc_tof_nsigma")
214 {
215 if(!this->AcceptItsTpcNSigma(trk, b, bCov)) return kFALSE;
216 if(!this->AcceptTOF(trk)) return kFALSE;
217 }
218 else if(fTrackSel == "its_tpc_tof_nsigma_spd" || fTrackSel == "its_tpc_tof_nsigma_spd2")
219 {
220 if(!this->AcceptItsTpcNSigma(trk, b, bCov)) return kFALSE;
221 if(!this->AcceptTOF(trk)) return kFALSE;
222 if(!trk->HasPointOnITSLayer(0) && !trk->HasPointOnITSLayer(1) ) return kFALSE;
223 }
224 else if(fTrackSel == "its_tpc_tof_dca")
225 {
226 if(!this->AcceptItsTpcDCA(trk, b)) return kFALSE;
227 if(!this->AcceptTOF(trk)) return kFALSE;
228 }
229 else if(fTrackSel == "its_tpc_tof_dca_spd1")
230 {
231 if(!this->AcceptItsTpcDCA(trk, b)) return kFALSE;
232 if(!this->AcceptTOF(trk)) return kFALSE;
233 if(!trk->HasPointOnITSLayer(0) ) return kFALSE;
234 }
235 else if(fTrackSel == "its_tpc_tof_dca_spd" || fTrackSel == "its_tpc_tof_dca_spd2")
236 {
237 if(!this->AcceptItsTpcDCA(trk, b)) return kFALSE;
238 if(!this->AcceptTOF(trk)) return kFALSE;
239 if(!trk->HasPointOnITSLayer(0) && !trk->HasPointOnITSLayer(1) ) return kFALSE;
240 }
241 else if(fTrackSel == "std_its_tpc_dca")
242 {
243 if(!this->AcceptItsTpcStdCut(trk, b)) return kFALSE;
244 }
245 else if(fTrackSel == "std_its_tpc_tof_dca")
246 {
247 if(!this->AcceptItsTpcStdCut(trk, b)) return kFALSE;
248 if(!this->AcceptTOF(trk)) return kFALSE;
249 }
250 else if(fTrackSel == "std_its_tpc_2010" || fTrackSel == "std_its_tpc_2011")
251 {
252 if(!trk->TestFilterBit(AliAODTrack::kTrkGlobal)) return kFALSE;
253 if(trk->GetTPCNcls()<70) return kFALSE;
254 }
255 else if(fTrackSel == "std_its_tpc_tof_2010" || fTrackSel == "std_its_tpc_tof_2011")
256 {
257 if(!trk->TestFilterBit(AliAODTrack::kTrkGlobal)) return kFALSE;
258 if(trk->GetTPCNcls()<70) return kFALSE;
259 if(!this->AcceptTOF(trk)) return kFALSE;
260 }
261 else
262 {
263 // default to standard cuts with tight DCA cut
264 return trk->TestFilterBit(AliAODTrack::kTrkGlobal);
265 }
266
267 return kTRUE;
268}
269
270Double_t AliLnAODtrackCuts::GetIntegratedLength(const AliAODTrack* trk, Int_t pid) const
271{
272//
273// track length workaround (cm)
274//
275 Double_t times[10];
276 trk->GetIntegratedTimes(times);
277
278 Double_t m = AliPID::ParticleMass(AliPID::kElectron);
279 Double_t t = times[0];
280 Double_t p = (pid > AliPID::kTriton) ? 2.*trk->P() : trk->P();
281 Double_t c = 2.99792458e-2; // cm/ps
282 Double_t beta = p/TMath::Sqrt(p*p+m*m);
283
284 return c*t*beta;
285}
286
287Double_t AliLnAODtrackCuts::GetNSigmaToVertex(Double_t b[2], Double_t bCov[3]) const
288{
289//
290// Number of sigma to the vertex (adapted from AliESDtrackCuts.cxx)
291//
292 //Double_t b[2];
293 Double_t bRes[2];
294 //Double_t bCov[3];
295
296 //if(!this->GetImpactParameters(trk, b, b, bCov)) return 1.e+6;
297
298 if (bCov[0]<=0 || bCov[2]<=0) {
299 AliDebugClass(1, "Estimated b resolution lower or equal zero!");
300 bCov[0]=0; bCov[2]=0;
301 }
302 bRes[0] = TMath::Sqrt(bCov[0]);
303 bRes[1] = TMath::Sqrt(bCov[2]);
304
305 // -----------------------------------
306 // How to get to a n-sigma cut?
307 //
308 // The accumulated statistics from 0 to d is
309 //
310 // -> Erf(d/Sqrt(2)) for a 1-dim gauss (d = n_sigma)
311 // -> 1 - Exp(-d**2) for a 2-dim gauss (d*d = dx*dx + dy*dy != n_sigma)
312 //
313 // It means that for a 2-dim gauss: n_sigma(d) = Sqrt(2)*ErfInv(1 - Exp((-d**2)/2)
314 // Can this be expressed in a different way?
315
316 if (bRes[0] == 0 || bRes[1] ==0)
317 return -1;
318
319 Double_t d = TMath::Sqrt(TMath::Power(b[0]/bRes[0],2) + TMath::Power(b[1]/bRes[1],2));
320
321 // work around precision problem
322 // if d is too big, TMath::Exp(...) gets 0, and TMath::ErfInverse(1) that should be infinite, gets 0 :(
323 // 1e-15 corresponds to nsigma ~ 7.7
324 if (TMath::Exp(-d * d / 2) < 1e-15)
325 return 1000;
326
327 Double_t nSigma = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2);
328 return nSigma;
329}