]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG3/vertexingHF/AliRDHFCutsDstoKKpi.cxx
Update (Francesco, Sadhana)
[u/mrichter/AliRoot.git] / PWG3 / vertexingHF / AliRDHFCutsDstoKKpi.cxx
CommitLineData
e3d40058 1/**************************************************************************
2 * Copyright(c) 1998-2010, 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/////////////////////////////////////////////////////////////
17//
18// Class for cuts on AOD reconstructed Ds->KKpi
19//
20// Author: A.Dainese, andrea.dainese@pd.infn.it
21/////////////////////////////////////////////////////////////
22
23#include <TDatabasePDG.h>
24#include <Riostream.h>
25
26#include "AliRDHFCutsDstoKKpi.h"
27#include "AliAODRecoDecayHF3Prong.h"
28#include "AliAODTrack.h"
29#include "AliESDtrack.h"
30
31ClassImp(AliRDHFCutsDstoKKpi)
32
33//--------------------------------------------------------------------------
a9b75906 34AliRDHFCutsDstoKKpi::AliRDHFCutsDstoKKpi(const char* name) :
35AliRDHFCuts(name)
e3d40058 36{
37 //
38 // Default Constructor
39 //
a9b75906 40 Int_t nvars=14;
e3d40058 41 SetNVars(nvars);
a9b75906 42 TString varNames[14]={"inv. mass [GeV]",
4755453e 43 "pTK [GeV/c]",
44 "pTPi [GeV/c]",
45 "d0K [cm]",
46 "d0Pi [cm]",
47 "dist12 [cm]",
48 "sigmavert [cm]",
49 "decLen [cm]",
50 "ptMax [GeV/c]",
51 "cosThetaPoint",
52 "Sum d0^2 (cm^2)",
53 "dca [cm]",
54 "inv. mass (Mphi-MKK) [GeV]",
a9b75906 55 "inv. mass (MKo*-MKpi) [GeV]"};
56 Bool_t isUpperCut[14]={kTRUE,
4755453e 57 kFALSE,
58 kFALSE,
59 kFALSE,
60 kFALSE,
61 kFALSE,
62 kTRUE,
63 kFALSE,
64 kFALSE,
65 kFALSE,
66 kFALSE,
67 kTRUE,
68 kTRUE,
69 kTRUE};
a9b75906 70 SetVarNames(14,varNames,isUpperCut);
71 Bool_t forOpt[14]={kFALSE,
4755453e 72 kFALSE,
e3d40058 73 kFALSE,
74 kFALSE,
75 kFALSE,
76 kFALSE,
77 kTRUE,
4755453e 78 kTRUE,
79 kTRUE,
80 kTRUE,
81 kTRUE,
82 kFALSE,
83 kTRUE,
e3d40058 84 kTRUE};
4755453e 85 SetVarsForOpt(7,forOpt);
e3d40058 86 Float_t limits[2]={0,999999999.};
87 SetPtBins(2,limits);
88}
89//--------------------------------------------------------------------------
90AliRDHFCutsDstoKKpi::AliRDHFCutsDstoKKpi(const AliRDHFCutsDstoKKpi &source) :
91 AliRDHFCuts(source)
92{
93 //
94 // Copy constructor
95 //
96
97}
98//--------------------------------------------------------------------------
99AliRDHFCutsDstoKKpi &AliRDHFCutsDstoKKpi::operator=(const AliRDHFCutsDstoKKpi &source)
100{
101 //
102 // assignment operator
103 //
104 if(&source == this) return *this;
105
106 AliRDHFCuts::operator=(source);
107
108 return *this;
109}
110
111
112//---------------------------------------------------------------------------
113void AliRDHFCutsDstoKKpi::GetCutVarsForOpt(AliAODRecoDecayHF *d,Float_t *vars,Int_t nvars,Int_t *pdgdaughters) {
114 //
115 // Fills in vars the values of the variables
116 //
117
118 if(nvars!=fnVarsForOpt) {
119 printf("AliRDHFCutsDstoKKpi::GetCutsVarsForOpt: wrong number of variables\n");
120 return;
121 }
122
123 AliAODRecoDecayHF3Prong *dd = (AliAODRecoDecayHF3Prong*)d;
124
4755453e 125 Int_t iter=-1;
126 if(fVarsForOpt[0]){
127 iter++;
128 if(TMath::Abs(pdgdaughters[0]==321)){
129 vars[iter]=dd->InvMassDsKKpi();
130 }else{
131 vars[iter]=dd->InvMassDspiKK();
132 }
133 }
134 if(fVarsForOpt[1]){
135 iter++;
136 Float_t minPtDau=99999.;
137 for(Int_t iprong=0;iprong<3;iprong++){
138 if(TMath::Abs(pdgdaughters[iprong])==321 &&
139 dd->PtProng(iprong)<minPtDau) minPtDau=dd->PtProng(iprong);
140 }
141 vars[iter]=minPtDau;
142 }
143 if(fVarsForOpt[2]){
144 iter++;
145 for(Int_t iprong=0;iprong<3;iprong++){
146 if(TMath::Abs(pdgdaughters[iprong])==211) {
147 vars[iter]=dd->PtProng(iprong);
148 }
149 }
150 }
151 if(fVarsForOpt[3]){
152 iter++;
153 Float_t minImpParDau=99999.;
154 for(Int_t iprong=0;iprong<3;iprong++){
155 if(TMath::Abs(pdgdaughters[iprong])==321 &&
156 dd->Getd0Prong(iprong)<minImpParDau) minImpParDau=dd->Getd0Prong(iprong);
157 }
158 vars[iter]=minImpParDau;
159 }
160 if(fVarsForOpt[4]){
161 iter++;
162 for(Int_t iprong=0;iprong<3;iprong++){
163 if(TMath::Abs(pdgdaughters[iprong])==211) {
164 vars[iter]=dd->Getd0Prong(iprong);
165 }
166 }
167 }
168 if(fVarsForOpt[5]){
169 iter++;
170 Float_t minDistPair=TMath::Min(dd->GetDist12toPrim(),dd->GetDist23toPrim());
171 vars[iter]=minDistPair;
172 }
173 if(fVarsForOpt[6]){
174 iter++;
175 vars[iter]=dd->GetSigmaVert();
176 }
177 if(fVarsForOpt[7]){
178 iter++;
179 vars[iter] = dd->DecayLength();
180 }
181 if(fVarsForOpt[8]){
182 iter++;
183 Float_t ptmax=0;
184 for(Int_t i=0;i<3;i++){
185 if(dd->PtProng(i)>ptmax)ptmax=dd->PtProng(i);
186 }
187 vars[iter]=ptmax;
188 }
189 if(fVarsForOpt[9]){
190 iter++;
191 vars[iter]=dd->CosPointingAngle();
192 }
193 if(fVarsForOpt[10]){
194 iter++;
195 vars[iter]=dd->Getd0Prong(0)*dd->Getd0Prong(0)+dd->Getd0Prong(1)*dd->Getd0Prong(1)+dd->Getd0Prong(2)*dd->Getd0Prong(2);
196 }
197 if(fVarsForOpt[11]){
198 iter++;
199 Float_t maxDCA=0.;
200 for(Int_t i=0;i<3;i++){
201 if(d->GetDCA(i)>maxDCA) maxDCA=d->GetDCA(i);
202 }
203 vars[iter]=maxDCA;
204 }
205 if(fVarsForOpt[12]){
206 iter++;
2c3decce 207 Double_t mPDGPhi = TDatabasePDG::Instance()->GetParticle(333)->Mass();
4755453e 208 if(TMath::Abs(pdgdaughters[0]==321)){
2c3decce 209
210 Double_t phimass01=d->InvMass2Prongs(0,1,321,321);
211 vars[iter]=TMath::Abs(phimass01-mPDGPhi);
212 // vars[iter]=dd->InvMass2Prongs(0,1,321,321);
4755453e 213 }else{
2c3decce 214 Double_t phimass12=d->InvMass2Prongs(1,2,321,321);
215 vars[iter]=TMath::Abs(phimass12-mPDGPhi);
216 // vars[iter]=dd->InvMass2Prongs(1,2,321,321);
4755453e 217 }
218 }
219 if(fVarsForOpt[13]){
220 iter++;
2c3decce 221 Double_t mPDGK0star = TDatabasePDG::Instance()->GetParticle(313)->Mass();
4755453e 222 if(TMath::Abs(pdgdaughters[0]==321)){
2c3decce 223
224 Double_t mass12kpi=d->InvMass2Prongs(1,2,321,211);
225 vars[iter]=TMath::Abs(mass12kpi-mPDGK0star);
226 // vars[iter]=dd->InvMass2Prongs(1,2,321,211);
4755453e 227 }else{
2c3decce 228 Double_t mass01pik=d->InvMass2Prongs(0,1,211,321);
229 vars[iter]=TMath::Abs(mass01pik-mPDGK0star);
230 // vars[iter]=dd->InvMass2Prongs(0,1,211,321);
4755453e 231 }
232 }
233
e3d40058 234
235 return;
236}
237//---------------------------------------------------------------------------
238Int_t AliRDHFCutsDstoKKpi::IsSelected(TObject* obj,Int_t selectionLevel) {
239 //
240 // Apply selection
241 //
242
243 if(!fCutsRD){
244 cout<<"Cut matrice not inizialized. Exit..."<<endl;
245 return 0;
246 }
247 //PrintAll();
248 AliAODRecoDecayHF3Prong* d=(AliAODRecoDecayHF3Prong*)obj;
249
250 if(!d){
251 cout<<"AliAODRecoDecayHF3Prong null"<<endl;
252 return 0;
253 }
254
255
256 // selection on daughter tracks
257 if(selectionLevel==AliRDHFCuts::kAll ||
258 selectionLevel==AliRDHFCuts::kTracks) {
259 if(!AreDaughtersSelected(d)) return 0;
260 }
261
262
e3d40058 263
4755453e 264 Int_t returnvalue=1;
e3d40058 265 // selection on candidate
266 if(selectionLevel==AliRDHFCuts::kAll ||
267 selectionLevel==AliRDHFCuts::kCandidate) {
268
e3d40058 269
4755453e 270 Int_t okDsKKpi=1;
271 Int_t okDspiKK=1;
272 Int_t okMassPhi=0;
273 Int_t okMassK0star=0;
e3d40058 274
4755453e 275 Double_t pt=d->Pt();
276 Int_t ptbin=PtBin(pt);
277
278 Double_t mDsPDG = TDatabasePDG::Instance()->GetParticle(431)->Mass();
279 Double_t mDsKKpi=d->InvMassDsKKpi();
280 Double_t mDspiKK=d->InvMassDspiKK();
281 if(TMath::Abs(mDsKKpi-mDsPDG)>fCutsRD[GetGlobalIndex(0,ptbin)]) okDsKKpi = 0;
282 if(TMath::Abs(mDspiKK-mDsPDG)>fCutsRD[GetGlobalIndex(0,ptbin)]) okDspiKK = 0;
283 if(!okDsKKpi && !okDspiKK) return 0;
284
285 //single track
286 if(TMath::Abs(d->PtProng(1)) < fCutsRD[GetGlobalIndex(1,ptbin)] ||
287 TMath::Abs(d->Getd0Prong(1))<fCutsRD[GetGlobalIndex(3,ptbin)]) return 0;
288 if(okDsKKpi){
289 if(TMath::Abs(d->PtProng(0)) < fCutsRD[GetGlobalIndex(1,ptbin)] ||
290 TMath::Abs(d->Getd0Prong(0))<fCutsRD[GetGlobalIndex(3,ptbin)]) okDsKKpi=0;
291 if(TMath::Abs(d->PtProng(2)) < fCutsRD[GetGlobalIndex(2,ptbin)] ||
292 TMath::Abs(d->Getd0Prong(2))<fCutsRD[GetGlobalIndex(4,ptbin)]) okDsKKpi=0;
293 }
294 if(okDspiKK){
295 if(TMath::Abs(d->PtProng(0)) < fCutsRD[GetGlobalIndex(2,ptbin)] ||
296 TMath::Abs(d->Getd0Prong(0))<fCutsRD[GetGlobalIndex(4,ptbin)]) okDspiKK=0;
297 if(TMath::Abs(d->PtProng(2)) < fCutsRD[GetGlobalIndex(1,ptbin)] ||
298 TMath::Abs(d->Getd0Prong(2))<fCutsRD[GetGlobalIndex(3,ptbin)]) okDspiKK=0;
299 }
300 if(!okDsKKpi && !okDspiKK) return 0;
301
302 // cuts on resonant decays (via Phi or K0*)
303 Double_t mPhiPDG = TDatabasePDG::Instance()->GetParticle(333)->Mass();
304 Double_t mK0starPDG = TDatabasePDG::Instance()->GetParticle(313)->Mass();
305 if(okDsKKpi){
306 Double_t mass01phi=d->InvMass2Prongs(0,1,321,321);
307 Double_t mass12K0s=d->InvMass2Prongs(1,2,321,211);
308 if(TMath::Abs(mass01phi-mPhiPDG)<fCutsRD[GetGlobalIndex(12,ptbin)]) okMassPhi=1;
309 if(TMath::Abs(mass12K0s-mK0starPDG)<fCutsRD[GetGlobalIndex(13,ptbin)]) okMassK0star = 1;
310 if(!okMassPhi && !okMassK0star) okDsKKpi=0;
311 }
312 if(okDspiKK){
313 Double_t mass01K0s=d->InvMass2Prongs(0,1,211,321);
314 Double_t mass12phi=d->InvMass2Prongs(1,2,321,321);
315 if(TMath::Abs(mass01K0s-mK0starPDG)<fCutsRD[GetGlobalIndex(13,ptbin)]) okMassK0star = 1;
316 if(TMath::Abs(mass12phi-mPhiPDG)<fCutsRD[GetGlobalIndex(12,ptbin)]) okMassPhi=1;
317 if(!okMassPhi && !okMassK0star) okDspiKK=0;
318 }
319 if(!okDsKKpi && !okDspiKK) return 0;
320
321 // Cuts on track pairs
322 for(Int_t i=0;i<3;i++) if(d->GetDCA(i)>fCutsRD[GetGlobalIndex(11,ptbin)]) return 0;
323 if(d->GetDist12toPrim()<fCutsRD[GetGlobalIndex(5,ptbin)] ||
324 d->GetDist23toPrim()<fCutsRD[GetGlobalIndex(5,ptbin)]) return 0;
325
326
327 // Cuts on candidate triplet
328 if(d->GetSigmaVert()>fCutsRD[GetGlobalIndex(6,ptbin)]) return 0;
329 if(d->DecayLength()<fCutsRD[GetGlobalIndex(7,ptbin)]) return 0;
330 if(TMath::Abs(d->PtProng(0))<fCutsRD[GetGlobalIndex(8,ptbin)] &&
331 TMath::Abs(d->PtProng(1))<fCutsRD[GetGlobalIndex(8,ptbin)] &&
332 TMath::Abs(d->PtProng(2))<fCutsRD[GetGlobalIndex(8,ptbin)]) return 0;
333 if(d->CosPointingAngle()< fCutsRD[GetGlobalIndex(9,ptbin)])return 0;
334 Double_t sum2=d->Getd0Prong(0)*d->Getd0Prong(0)+d->Getd0Prong(1)*d->Getd0Prong(1)+d->Getd0Prong(2)*d->Getd0Prong(2);
335 if(sum2<fCutsRD[GetGlobalIndex(10,ptbin)])return 0;
336
337 returnvalue=0;
338 if(okDsKKpi) returnvalue+=1;
339 if(okDspiKK) returnvalue+=2;
340 if(okMassPhi) returnvalue+=4;
341 if(okMassK0star) returnvalue+=8;
342
343 }
e3d40058 344 return returnvalue;
345
346}
347//---------------------------------------------------------------------------