]>
Commit | Line | Data |
---|---|---|
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 | ||
28 | ClassImp(AliLnAODtrackCuts) | |
29 | ||
30 | AliLnAODtrackCuts::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 | ||
45 | AliLnAODtrackCuts::~AliLnAODtrackCuts() | |
46 | { | |
47 | // | |
48 | // virtual destructor | |
49 | } | |
50 | ||
51 | void 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 | ||
61 | Bool_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 | ||
71 | Bool_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 | ||
82 | Bool_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 | ||
94 | Double_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 | ||
104 | Bool_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 | ||
133 | Bool_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 | ||
165 | Bool_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 | ||
180 | Bool_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 | ||
193 | Bool_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 | ||
270 | Double_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 | ||
287 | Double_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 | } |