1 /**************************************************************************
2 * Copyright(c) 1998-2006, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 /////////////////////////////////////////////////////////////
18 // Base class for AOD reconstructed heavy-flavour 4-prong decay
20 // Authors: G.E.Bruno Giuseppe.Bruno@to.infn.it, R.Romita Rossella.Romita@ba.infn.it
21 /////////////////////////////////////////////////////////////
23 #include <TDatabasePDG.h>
24 #include "AliAODRecoDecayHF.h"
25 #include "AliAODRecoDecayHF4Prong.h"
27 ClassImp(AliAODRecoDecayHF4Prong)
29 //--------------------------------------------------------------------------
30 AliAODRecoDecayHF4Prong::AliAODRecoDecayHF4Prong() :
37 // Default Constructor
40 //--------------------------------------------------------------------------
41 AliAODRecoDecayHF4Prong::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,
45 Double_t dist12,Double_t dist3,
48 AliAODRecoDecayHF(vtx2,4,charge,px,py,pz,d0,d0err),
49 // fSigmaVert(sigvert),
50 fDist12toPrim(dist12),
55 // Constructor with AliAODVertex for decay vertex
59 //--------------------------------------------------------------------------
60 AliAODRecoDecayHF4Prong::AliAODRecoDecayHF4Prong(AliAODVertex *vtx2,
61 Double_t *d0,Double_t *d0err,
62 Double_t *dca, //Double_t sigvert,
63 Double_t dist12,Double_t dist3,
66 AliAODRecoDecayHF(vtx2,4,charge,d0,d0err),
67 //fSigmaVert(sigvert),
68 fDist12toPrim(dist12),
73 // Constructor with AliAODVertex for decay vertex and without prongs momenta
77 //--------------------------------------------------------------------------
78 AliAODRecoDecayHF4Prong::AliAODRecoDecayHF4Prong(const AliAODRecoDecayHF4Prong &source) :
79 AliAODRecoDecayHF(source),
80 //fSigmaVert(source.fSigmaVert),
81 fDist12toPrim(source.fDist12toPrim),
82 fDist3toPrim(source.fDist3toPrim),
83 fDist4toPrim(source.fDist4toPrim)
89 //--------------------------------------------------------------------------
90 AliAODRecoDecayHF4Prong &AliAODRecoDecayHF4Prong::operator=(const AliAODRecoDecayHF4Prong &source)
93 // assignment operator
95 if(&source == this) return *this;
97 AliAODRecoDecayHF::operator=(source);
99 fDist12toPrim= source.fDist12toPrim;
100 fDist3toPrim= source.fDist3toPrim;
101 fDist4toPrim= source.fDist4toPrim;
102 //fSigmaVert= source.fSigmaVert;
106 //--------------------------------------------------------------------------
107 void AliAODRecoDecayHF4Prong::InvMassD0(Double_t mD0[2]) const {
109 // Mass for the two D0 hypotheses
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);
119 //--------------------------------------------------------------------------
120 void AliAODRecoDecayHF4Prong::InvMassD0bar(Double_t mD0bar[2]) const {
122 // Mass for the two D0bar hypotheses
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);
132 //--------------------------------------------------------------------------
134 Bool_t AliAODRecoDecayHF4Prong::SelectD0(const Double_t *cuts,Int_t &okD0,Int_t &okD0bar) const
137 // This function compares the D0 with a set of cuts:
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)
149 // If candidate D0 does not pass the cuts return kFALSE
153 Double_t mD0PDG = TDatabasePDG::Instance()->GetParticle(421)->Mass();
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;
165 //DCA btw opposite sign tracks
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;
176 if(fDist12toPrim>10.)return kFALSE;
177 if(fDist12toPrim<cuts[2])return kFALSE;
181 if(fDist3toPrim<cuts[3])return kFALSE;
185 if(fDist4toPrim<cuts[4])return kFALSE;
188 if(CosPointingAngle()<cuts[5])return kFALSE;
191 if(Pt()<cuts[6])return kFALSE;
195 Double_t massD0bar[2];
196 Bool_t good=CutRhoMass(massD0,massD0bar,cuts[0],cuts[7]);
197 if(!good) return kFALSE;
202 //----------------------------------------------------------------------------
203 Bool_t AliAODRecoDecayHF4Prong::CutRhoMass(Double_t massD0[2],Double_t massD0bar[2],Double_t cutMass,Double_t cutRho) const
206 // Cut on rho->pipi mass for any of the pairs
208 Bool_t isGood=kFALSE;
210 for(Int_t i=0;i<2;i++){massD0[i]=0.;massD0bar[i]=0.;}
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;
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;
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;
229 Double_t minv03=InvMassRho(0,3);
230 if(TMath::Abs(minv03-mPDGRho)<cutRho) isRho=kTRUE;
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;
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;
243 Double_t minv12=InvMassRho(1,2);
244 if(TMath::Abs(minv12-mPDGRho)<cutRho) isRho=kTRUE;
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;
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;
257 Double_t minv23=InvMassRho(2,3);
258 if(TMath::Abs(minv23-mPDGRho)<cutRho) isRho=kTRUE;
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;
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;