]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG3/vertexingHF/AliAODRecoDecayHF4Prong.cxx
Bug fix in the order of the Ds cuts (Sadhana, Francesco)
[u/mrichter/AliRoot.git] / PWG3 / vertexingHF / AliAODRecoDecayHF4Prong.cxx
CommitLineData
3244eeed 1/**************************************************************************
2 * Copyright(c) 1998-2006, 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// Base class for AOD reconstructed heavy-flavour 4-prong decay
19//
20// Authors: G.E.Bruno Giuseppe.Bruno@to.infn.it, R.Romita Rossella.Romita@ba.infn.it
21/////////////////////////////////////////////////////////////
22
23#include <TDatabasePDG.h>
24#include "AliAODRecoDecayHF.h"
25#include "AliAODRecoDecayHF4Prong.h"
3244eeed 26
27ClassImp(AliAODRecoDecayHF4Prong)
28
29//--------------------------------------------------------------------------
30AliAODRecoDecayHF4Prong::AliAODRecoDecayHF4Prong() :
31 AliAODRecoDecayHF(),
3244eeed 32 fDist12toPrim(0),
721c0b8f 33 fDist3toPrim(0),
34 fDist4toPrim(0)
3244eeed 35{
36 //
37 // Default Constructor
38 //
39}
40//--------------------------------------------------------------------------
41AliAODRecoDecayHF4Prong::AliAODRecoDecayHF4Prong(AliAODVertex *vtx2,
42 Double_t *px,Double_t *py,Double_t *pz,
43 Double_t *d0,Double_t *d0err,
44 Double_t *dca, //Double_t sigvert,
721c0b8f 45 Double_t dist12,Double_t dist3,
46 Double_t dist4,
3244eeed 47 Short_t charge) :
48 AliAODRecoDecayHF(vtx2,4,charge,px,py,pz,d0,d0err),
49 // fSigmaVert(sigvert),
50 fDist12toPrim(dist12),
721c0b8f 51 fDist3toPrim(dist3),
52 fDist4toPrim(dist4)
3244eeed 53{
54 //
55 // Constructor with AliAODVertex for decay vertex
56 //
6185d025 57 SetDCAs(6,dca);
3244eeed 58}
59//--------------------------------------------------------------------------
60AliAODRecoDecayHF4Prong::AliAODRecoDecayHF4Prong(AliAODVertex *vtx2,
61 Double_t *d0,Double_t *d0err,
62 Double_t *dca, //Double_t sigvert,
721c0b8f 63 Double_t dist12,Double_t dist3,
64 Double_t dist4,
3244eeed 65 Short_t charge) :
66 AliAODRecoDecayHF(vtx2,4,charge,d0,d0err),
67 //fSigmaVert(sigvert),
68 fDist12toPrim(dist12),
721c0b8f 69 fDist3toPrim(dist3),
70 fDist4toPrim(dist4)
3244eeed 71{
72 //
73 // Constructor with AliAODVertex for decay vertex and without prongs momenta
74 //
6185d025 75 SetDCAs(6,dca);
3244eeed 76}
77//--------------------------------------------------------------------------
78AliAODRecoDecayHF4Prong::AliAODRecoDecayHF4Prong(const AliAODRecoDecayHF4Prong &source) :
79 AliAODRecoDecayHF(source),
80 //fSigmaVert(source.fSigmaVert),
81 fDist12toPrim(source.fDist12toPrim),
721c0b8f 82 fDist3toPrim(source.fDist3toPrim),
83 fDist4toPrim(source.fDist4toPrim)
3244eeed 84{
85 //
86 // Copy constructor
87 //
88}
89//--------------------------------------------------------------------------
90AliAODRecoDecayHF4Prong &AliAODRecoDecayHF4Prong::operator=(const AliAODRecoDecayHF4Prong &source)
91{
92 //
93 // assignment operator
94 //
95 if(&source == this) return *this;
dcb444c9 96
97 AliAODRecoDecayHF::operator=(source);
98
3244eeed 99 fDist12toPrim= source.fDist12toPrim;
721c0b8f 100 fDist3toPrim= source.fDist3toPrim;
101 fDist4toPrim= source.fDist4toPrim;
3244eeed 102 //fSigmaVert= source.fSigmaVert;
dcb444c9 103
3244eeed 104 return *this;
105}
106//--------------------------------------------------------------------------
721c0b8f 107void AliAODRecoDecayHF4Prong::InvMassD0(Double_t mD0[2]) const {
108 //
a76e1b15 109 // Mass for the two D0 hypotheses
110 //
721c0b8f 111 UInt_t pdg[4];
112 pdg[0]=211; pdg[1]=321; pdg[2]=211; pdg[3]=211;
113 mD0[0]=InvMass(4,pdg);
114 pdg[1]=211; pdg[3]=321;
115 mD0[1]=InvMass(4,pdg);
a76e1b15 116
721c0b8f 117 return;
118}
119//--------------------------------------------------------------------------
120void AliAODRecoDecayHF4Prong::InvMassD0bar(Double_t mD0bar[2]) const {
121 //
a76e1b15 122 // Mass for the two D0bar hypotheses
721c0b8f 123 //
124 UInt_t pdg[4];
125 pdg[0]=321; pdg[1]=211; pdg[2]=211; pdg[3]=211;
126 mD0bar[0]=InvMass(4,pdg);
127 pdg[0]=211; pdg[2]=321;
128 mD0bar[1]=InvMass(4,pdg);
129
130 return;
131}
132//--------------------------------------------------------------------------
3244eeed 133
a76e1b15 134Bool_t AliAODRecoDecayHF4Prong::SelectD0(const Double_t *cuts,Int_t &okD0,Int_t &okD0bar) const
135{
136 //
137 // This function compares the D0 with a set of cuts:
138 //
139 // cuts[0] = D0 invariant mass
140 // cuts[1] = DCA between opposite sign tracks
141 // cuts[2] = Distance between primary and two tracks vertex fDist12toPrim
142 // cuts[3] = Distance between primary and three tracks vertex fDist3toPrim
143 // cuts[4] = Distance between primary and two tracks vertex fDist4toPrim
144 // cuts[5] = Cosinus of the pointing angle
145 // cuts[6] = Transverse momentum of the D0 candidate
146 // cuts[7] = Mass Pi+Pi- = mass of the rho0
147 // cuts[8] = PID cut (one K in the quadruplet)
148 //
149 // If candidate D0 does not pass the cuts return kFALSE
150 //
151
13977a79 152 okD0=0; okD0bar=0;
a76e1b15 153 Double_t mD0PDG = TDatabasePDG::Instance()->GetParticle(421)->Mass();
154 Double_t mD0[2];
155 Double_t mD0bar[2];
156 InvMassD0(mD0);
157 InvMassD0bar(mD0bar);
158 Bool_t goodMass=kFALSE;
159 if(TMath::Abs(mD0[0]-mD0PDG)<=cuts[0]) {goodMass=kTRUE; okD0=1;}
160 if(TMath::Abs(mD0[1]-mD0PDG)<=cuts[0]) {goodMass=kTRUE; okD0=1;}
161 if(TMath::Abs(mD0bar[0]-mD0PDG)<=cuts[0]) {goodMass=kTRUE; okD0bar=1;}
162 if(TMath::Abs(mD0bar[1]-mD0PDG)<=cuts[0]) {goodMass=kTRUE; okD0bar=1;}
163 if(!goodMass) return kFALSE;
721c0b8f 164
165 //DCA btw opposite sign tracks
166 if(cuts[1]>0.){
167 if(GetDCA(0)>cuts[1]) return kFALSE;
168 if(GetDCA(1)>cuts[1]) return kFALSE;
169 if(GetDCA(2)>cuts[1]) return kFALSE;
170 if(GetDCA(3)>cuts[1]) return kFALSE;
171 if(GetDCA(4)>cuts[1]) return kFALSE;
172 if(GetDCA(5)>cuts[1]) return kFALSE;
173 }
3244eeed 174 //2track cuts
721c0b8f 175 if(cuts[2]>0.){
176 if(fDist12toPrim>10.)return kFALSE;
177 if(fDist12toPrim<cuts[2])return kFALSE;
178 }
179 //3track cuts
180 if(cuts[3]>0.){
181 if(fDist3toPrim<cuts[3])return kFALSE;
182 }
183 //4track cuts
184 if(cuts[4]>0.){
185 if(fDist4toPrim<cuts[4])return kFALSE;
186 }
187 if(cuts[5]>-1.1){
188 if(CosPointingAngle()<cuts[5])return kFALSE;
189 }
190 if(cuts[6]>0.){
191 if(Pt()<cuts[6])return kFALSE;
192 }
193 if(cuts[7]>0.){
194 Double_t massD0[2];
195 Double_t massD0bar[2];
196 Bool_t good=CutRhoMass(massD0,massD0bar,cuts[0],cuts[7]);
197 if(!good) return kFALSE;
198 }
a76e1b15 199
721c0b8f 200 return kTRUE;
201}
202//----------------------------------------------------------------------------
a76e1b15 203Bool_t AliAODRecoDecayHF4Prong::CutRhoMass(Double_t massD0[2],Double_t massD0bar[2],Double_t cutMass,Double_t cutRho) const
204{
721c0b8f 205 //
a76e1b15 206 // Cut on rho->pipi mass for any of the pairs
721c0b8f 207 //
208 Bool_t isGood=kFALSE;
209 Int_t nprongs=4;
210 for(Int_t i=0;i<2;i++){massD0[i]=0.;massD0bar[i]=0.;}
211 Bool_t isRho=kFALSE;
212 Bool_t isTrue=kFALSE;
213 Double_t mPDG=TDatabasePDG::Instance()->GetParticle(421)->Mass();
214 Double_t mPDGRho=TDatabasePDG::Instance()->GetParticle(113)->Mass();
215 Double_t minv01=InvMassRho(0,1);
216 if(TMath::Abs(minv01-mPDGRho)<cutRho) isRho=kTRUE;
217 if(isRho){
218 UInt_t pdg1[4]={211,211,321,211};
219 Double_t mass1=InvMass(nprongs,pdg1);
220 if(TMath::Abs(mass1-mPDG)<cutMass) {isTrue=kTRUE;isGood=kTRUE;}
221 if(isTrue) massD0bar[1]=mass1;
222 isTrue=kFALSE;
223 UInt_t pdg2[4]={211,211,211,321};
224 Double_t mass2=InvMass(4,pdg2);
225 if(TMath::Abs(mass2-mPDG)<cutMass) {isTrue=kTRUE;isGood=kTRUE;}
226 if(isTrue) massD0[1]=mass2;
227 isTrue=kFALSE;
228 }
229 Double_t minv03=InvMassRho(0,3);
230 if(TMath::Abs(minv03-mPDGRho)<cutRho) isRho=kTRUE;
231 if(isRho){
232 UInt_t pdg1[4]={211,211,321,211};
233 Double_t mass1=InvMass(4,pdg1);
234 if(TMath::Abs(mass1-mPDG)<cutMass) {isTrue=kTRUE;isGood=kTRUE;}
235 if(isTrue) massD0bar[1]=mass1;
236 isTrue=kFALSE;
237 UInt_t pdg2[4]={211,321,211,211};
238 Double_t mass2=InvMass(4,pdg2);
239 if(TMath::Abs(mass2-mPDG)<cutMass) {isTrue=kTRUE;isGood=kTRUE;}
240 if(isTrue) massD0[0]=mass2;
241 isTrue=kFALSE;
242 }
243 Double_t minv12=InvMassRho(1,2);
244 if(TMath::Abs(minv12-mPDGRho)<cutRho) isRho=kTRUE;
245 if(isRho){
246 UInt_t pdg1[4]={321,211,211,211};
247 Double_t mass1=InvMass(4,pdg1);
248 if(TMath::Abs(mass1-mPDG)<cutMass) {isTrue=kTRUE;isGood=kTRUE;}
249 if(isTrue) massD0bar[0]=mass1;
250 isTrue=kFALSE;
251 UInt_t pdg2[4]={211,211,211,321};
252 Double_t mass2=InvMass(4,pdg2);
253 if(TMath::Abs(mass2-mPDG)<cutMass) {isTrue=kTRUE;isGood=kTRUE;}
254 if(isTrue) massD0[1]=mass2;
255 isTrue=kFALSE;
256 }
257 Double_t minv23=InvMassRho(2,3);
258 if(TMath::Abs(minv23-mPDGRho)<cutRho) isRho=kTRUE;
259 if(isRho){
260 UInt_t pdg1[4]={321,211,211,211};
261 Double_t mass1=InvMass(4,pdg1);
262 if(TMath::Abs(mass1-mPDG)<cutMass) {isTrue=kTRUE;isGood=kTRUE;}
263 if(isTrue) massD0bar[0]=mass1;
264 isTrue=kFALSE;
265 UInt_t pdg2[4]={211,321,211,211};
266 Double_t mass2=InvMass(4,pdg2);
267 if(TMath::Abs(mass2-mPDG)<cutMass) {isTrue=kTRUE;isGood=kTRUE;}
268 if(isTrue) massD0[0]=mass2;
269 isTrue=kFALSE;
270 }
271 return isGood;
3244eeed 272}