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 **************************************************************************/
18 /////////////////////////////////////////////////////////////
20 // Base class for AOD reconstructed heavy-flavour 4-prong decay
22 // Authors: G.E.Bruno Giuseppe.Bruno@to.infn.it, R.Romita Rossella.Romita@ba.infn.it
23 /////////////////////////////////////////////////////////////
25 #include <TDatabasePDG.h>
26 #include "AliAODRecoDecayHF.h"
27 #include "AliAODRecoDecayHF4Prong.h"
29 ClassImp(AliAODRecoDecayHF4Prong)
31 //--------------------------------------------------------------------------
32 AliAODRecoDecayHF4Prong::AliAODRecoDecayHF4Prong() :
39 // Default Constructor
42 //--------------------------------------------------------------------------
43 AliAODRecoDecayHF4Prong::AliAODRecoDecayHF4Prong(AliAODVertex *vtx2,
44 Double_t *px,Double_t *py,Double_t *pz,
45 Double_t *d0,Double_t *d0err,
46 Double_t *dca, //Double_t sigvert,
47 Double_t dist12,Double_t dist3,
50 AliAODRecoDecayHF(vtx2,4,charge,px,py,pz,d0,d0err),
51 // fSigmaVert(sigvert),
52 fDist12toPrim(dist12),
57 // Constructor with AliAODVertex for decay vertex
61 //--------------------------------------------------------------------------
62 AliAODRecoDecayHF4Prong::AliAODRecoDecayHF4Prong(AliAODVertex *vtx2,
63 Double_t *d0,Double_t *d0err,
64 Double_t *dca, //Double_t sigvert,
65 Double_t dist12,Double_t dist3,
68 AliAODRecoDecayHF(vtx2,4,charge,d0,d0err),
69 //fSigmaVert(sigvert),
70 fDist12toPrim(dist12),
75 // Constructor with AliAODVertex for decay vertex and without prongs momenta
79 //--------------------------------------------------------------------------
80 AliAODRecoDecayHF4Prong::AliAODRecoDecayHF4Prong(const AliAODRecoDecayHF4Prong &source) :
81 AliAODRecoDecayHF(source),
82 //fSigmaVert(source.fSigmaVert),
83 fDist12toPrim(source.fDist12toPrim),
84 fDist3toPrim(source.fDist3toPrim),
85 fDist4toPrim(source.fDist4toPrim)
91 //--------------------------------------------------------------------------
92 AliAODRecoDecayHF4Prong &AliAODRecoDecayHF4Prong::operator=(const AliAODRecoDecayHF4Prong &source)
95 // assignment operator
97 if(&source == this) return *this;
99 AliAODRecoDecayHF::operator=(source);
101 fDist12toPrim= source.fDist12toPrim;
102 fDist3toPrim= source.fDist3toPrim;
103 fDist4toPrim= source.fDist4toPrim;
104 //fSigmaVert= source.fSigmaVert;
108 //--------------------------------------------------------------------------
109 void AliAODRecoDecayHF4Prong::InvMassD0(Double_t mD0[2]) const {
111 // Mass for the two D0 hypotheses
114 pdg[0]=211; pdg[1]=321; pdg[2]=211; pdg[3]=211;
115 mD0[0]=InvMass(4,pdg);
116 pdg[1]=211; pdg[3]=321;
117 mD0[1]=InvMass(4,pdg);
121 //--------------------------------------------------------------------------
122 void AliAODRecoDecayHF4Prong::InvMassD0bar(Double_t mD0bar[2]) const {
124 // Mass for the two D0bar hypotheses
127 pdg[0]=321; pdg[1]=211; pdg[2]=211; pdg[3]=211;
128 mD0bar[0]=InvMass(4,pdg);
129 pdg[0]=211; pdg[2]=321;
130 mD0bar[1]=InvMass(4,pdg);
134 //--------------------------------------------------------------------------
136 Bool_t AliAODRecoDecayHF4Prong::SelectD0(const Double_t *cuts,Int_t &okD0,Int_t &okD0bar) const
139 // This function compares the D0 with a set of cuts:
141 // cuts[0] = D0 invariant mass
142 // cuts[1] = DCA between opposite sign tracks
143 // cuts[2] = Distance between primary and two tracks vertex fDist12toPrim
144 // cuts[3] = Distance between primary and three tracks vertex fDist3toPrim
145 // cuts[4] = Distance between primary and two tracks vertex fDist4toPrim
146 // cuts[5] = Cosinus of the pointing angle
147 // cuts[6] = Transverse momentum of the D0 candidate
148 // cuts[7] = Mass Pi+Pi- = mass of the rho0
149 // cuts[8] = PID cut (one K in the quadruplet)
151 // If candidate D0 does not pass the cuts return kFALSE
155 Double_t mD0PDG = TDatabasePDG::Instance()->GetParticle(421)->Mass();
159 InvMassD0bar(mD0bar);
160 Bool_t goodMass=kFALSE;
161 if(TMath::Abs(mD0[0]-mD0PDG)<=cuts[0]) {goodMass=kTRUE; okD0=1;}
162 if(TMath::Abs(mD0[1]-mD0PDG)<=cuts[0]) {goodMass=kTRUE; okD0=1;}
163 if(TMath::Abs(mD0bar[0]-mD0PDG)<=cuts[0]) {goodMass=kTRUE; okD0bar=1;}
164 if(TMath::Abs(mD0bar[1]-mD0PDG)<=cuts[0]) {goodMass=kTRUE; okD0bar=1;}
165 if(!goodMass) return kFALSE;
167 //DCA btw opposite sign tracks
169 if(GetDCA(0)>cuts[1]) return kFALSE;
170 if(GetDCA(1)>cuts[1]) return kFALSE;
171 if(GetDCA(2)>cuts[1]) return kFALSE;
172 if(GetDCA(3)>cuts[1]) return kFALSE;
173 if(GetDCA(4)>cuts[1]) return kFALSE;
174 if(GetDCA(5)>cuts[1]) return kFALSE;
178 if(fDist12toPrim>10.)return kFALSE;
179 if(fDist12toPrim<cuts[2])return kFALSE;
183 if(fDist3toPrim<cuts[3])return kFALSE;
187 if(fDist4toPrim<cuts[4])return kFALSE;
190 if(CosPointingAngle()<cuts[5])return kFALSE;
193 if(Pt()<cuts[6])return kFALSE;
197 Double_t massD0bar[2];
198 Bool_t good=CutRhoMass(massD0,massD0bar,cuts[0],cuts[7]);
199 if(!good) return kFALSE;
204 //----------------------------------------------------------------------------
205 Bool_t AliAODRecoDecayHF4Prong::CutRhoMass(Double_t massD0[2],Double_t massD0bar[2],Double_t cutMass,Double_t cutRho) const
208 // Cut on rho->pipi mass for any of the pairs
210 Bool_t isGood=kFALSE;
212 for(Int_t i=0;i<2;i++){massD0[i]=0.;massD0bar[i]=0.;}
214 Bool_t isTrue=kFALSE;
215 Double_t mPDG=TDatabasePDG::Instance()->GetParticle(421)->Mass();
216 Double_t mPDGRho=TDatabasePDG::Instance()->GetParticle(113)->Mass();
217 Double_t minv01=InvMassRho(0,1);
218 if(TMath::Abs(minv01-mPDGRho)<cutRho) isRho=kTRUE;
220 UInt_t pdg1[4]={211,211,321,211};
221 Double_t mass1=InvMass(nprongs,pdg1);
222 if(TMath::Abs(mass1-mPDG)<cutMass) {isTrue=kTRUE;isGood=kTRUE;}
223 if(isTrue) massD0bar[1]=mass1;
225 UInt_t pdg2[4]={211,211,211,321};
226 Double_t mass2=InvMass(4,pdg2);
227 if(TMath::Abs(mass2-mPDG)<cutMass) {isTrue=kTRUE;isGood=kTRUE;}
228 if(isTrue) massD0[1]=mass2;
231 Double_t minv03=InvMassRho(0,3);
232 if(TMath::Abs(minv03-mPDGRho)<cutRho) isRho=kTRUE;
234 UInt_t pdg1[4]={211,211,321,211};
235 Double_t mass1=InvMass(4,pdg1);
236 if(TMath::Abs(mass1-mPDG)<cutMass) {isTrue=kTRUE;isGood=kTRUE;}
237 if(isTrue) massD0bar[1]=mass1;
239 UInt_t pdg2[4]={211,321,211,211};
240 Double_t mass2=InvMass(4,pdg2);
241 if(TMath::Abs(mass2-mPDG)<cutMass) {isTrue=kTRUE;isGood=kTRUE;}
242 if(isTrue) massD0[0]=mass2;
245 Double_t minv12=InvMassRho(1,2);
246 if(TMath::Abs(minv12-mPDGRho)<cutRho) isRho=kTRUE;
248 UInt_t pdg1[4]={321,211,211,211};
249 Double_t mass1=InvMass(4,pdg1);
250 if(TMath::Abs(mass1-mPDG)<cutMass) {isTrue=kTRUE;isGood=kTRUE;}
251 if(isTrue) massD0bar[0]=mass1;
253 UInt_t pdg2[4]={211,211,211,321};
254 Double_t mass2=InvMass(4,pdg2);
255 if(TMath::Abs(mass2-mPDG)<cutMass) {isTrue=kTRUE;isGood=kTRUE;}
256 if(isTrue) massD0[1]=mass2;
259 Double_t minv23=InvMassRho(2,3);
260 if(TMath::Abs(minv23-mPDGRho)<cutRho) isRho=kTRUE;
262 UInt_t pdg1[4]={321,211,211,211};
263 Double_t mass1=InvMass(4,pdg1);
264 if(TMath::Abs(mass1-mPDG)<cutMass) {isTrue=kTRUE;isGood=kTRUE;}
265 if(isTrue) massD0bar[0]=mass1;
267 UInt_t pdg2[4]={211,321,211,211};
268 Double_t mass2=InvMass(4,pdg2);
269 if(TMath::Abs(mass2-mPDG)<cutMass) {isTrue=kTRUE;isGood=kTRUE;}
270 if(isTrue) massD0[0]=mass2;