]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGHF/vertexingHF/AliAODRecoDecayHF4Prong.cxx
Correct formula for the error on significance
[u/mrichter/AliRoot.git] / PWGHF / 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
27de2dfb 16/* $Id$ */
17
3244eeed 18/////////////////////////////////////////////////////////////
19//
20// Base class for AOD reconstructed heavy-flavour 4-prong decay
21//
22// Authors: G.E.Bruno Giuseppe.Bruno@to.infn.it, R.Romita Rossella.Romita@ba.infn.it
23/////////////////////////////////////////////////////////////
24
25#include <TDatabasePDG.h>
26#include "AliAODRecoDecayHF.h"
27#include "AliAODRecoDecayHF4Prong.h"
3244eeed 28
29ClassImp(AliAODRecoDecayHF4Prong)
30
31//--------------------------------------------------------------------------
32AliAODRecoDecayHF4Prong::AliAODRecoDecayHF4Prong() :
33 AliAODRecoDecayHF(),
3244eeed 34 fDist12toPrim(0),
721c0b8f 35 fDist3toPrim(0),
36 fDist4toPrim(0)
3244eeed 37{
38 //
39 // Default Constructor
40 //
41}
42//--------------------------------------------------------------------------
43AliAODRecoDecayHF4Prong::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,
721c0b8f 47 Double_t dist12,Double_t dist3,
48 Double_t dist4,
3244eeed 49 Short_t charge) :
50 AliAODRecoDecayHF(vtx2,4,charge,px,py,pz,d0,d0err),
51 // fSigmaVert(sigvert),
52 fDist12toPrim(dist12),
721c0b8f 53 fDist3toPrim(dist3),
54 fDist4toPrim(dist4)
3244eeed 55{
56 //
57 // Constructor with AliAODVertex for decay vertex
58 //
6185d025 59 SetDCAs(6,dca);
3244eeed 60}
61//--------------------------------------------------------------------------
62AliAODRecoDecayHF4Prong::AliAODRecoDecayHF4Prong(AliAODVertex *vtx2,
63 Double_t *d0,Double_t *d0err,
64 Double_t *dca, //Double_t sigvert,
721c0b8f 65 Double_t dist12,Double_t dist3,
66 Double_t dist4,
3244eeed 67 Short_t charge) :
68 AliAODRecoDecayHF(vtx2,4,charge,d0,d0err),
69 //fSigmaVert(sigvert),
70 fDist12toPrim(dist12),
721c0b8f 71 fDist3toPrim(dist3),
72 fDist4toPrim(dist4)
3244eeed 73{
74 //
75 // Constructor with AliAODVertex for decay vertex and without prongs momenta
76 //
6185d025 77 SetDCAs(6,dca);
3244eeed 78}
79//--------------------------------------------------------------------------
80AliAODRecoDecayHF4Prong::AliAODRecoDecayHF4Prong(const AliAODRecoDecayHF4Prong &source) :
81 AliAODRecoDecayHF(source),
82 //fSigmaVert(source.fSigmaVert),
83 fDist12toPrim(source.fDist12toPrim),
721c0b8f 84 fDist3toPrim(source.fDist3toPrim),
85 fDist4toPrim(source.fDist4toPrim)
3244eeed 86{
87 //
88 // Copy constructor
89 //
90}
91//--------------------------------------------------------------------------
92AliAODRecoDecayHF4Prong &AliAODRecoDecayHF4Prong::operator=(const AliAODRecoDecayHF4Prong &source)
93{
94 //
95 // assignment operator
96 //
97 if(&source == this) return *this;
dcb444c9 98
99 AliAODRecoDecayHF::operator=(source);
100
3244eeed 101 fDist12toPrim= source.fDist12toPrim;
721c0b8f 102 fDist3toPrim= source.fDist3toPrim;
103 fDist4toPrim= source.fDist4toPrim;
3244eeed 104 //fSigmaVert= source.fSigmaVert;
dcb444c9 105
3244eeed 106 return *this;
107}
108//--------------------------------------------------------------------------
721c0b8f 109void AliAODRecoDecayHF4Prong::InvMassD0(Double_t mD0[2]) const {
110 //
a76e1b15 111 // Mass for the two D0 hypotheses
112 //
721c0b8f 113 UInt_t pdg[4];
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);
a76e1b15 118
721c0b8f 119 return;
120}
121//--------------------------------------------------------------------------
122void AliAODRecoDecayHF4Prong::InvMassD0bar(Double_t mD0bar[2]) const {
123 //
a76e1b15 124 // Mass for the two D0bar hypotheses
721c0b8f 125 //
126 UInt_t pdg[4];
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);
131
132 return;
133}
134//--------------------------------------------------------------------------
3244eeed 135
a76e1b15 136Bool_t AliAODRecoDecayHF4Prong::SelectD0(const Double_t *cuts,Int_t &okD0,Int_t &okD0bar) const
137{
138 //
139 // This function compares the D0 with a set of cuts:
140 //
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)
150 //
151 // If candidate D0 does not pass the cuts return kFALSE
152 //
153
13977a79 154 okD0=0; okD0bar=0;
a76e1b15 155 Double_t mD0PDG = TDatabasePDG::Instance()->GetParticle(421)->Mass();
156 Double_t mD0[2];
157 Double_t mD0bar[2];
158 InvMassD0(mD0);
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;
721c0b8f 166
167 //DCA btw opposite sign tracks
168 if(cuts[1]>0.){
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;
175 }
3244eeed 176 //2track cuts
721c0b8f 177 if(cuts[2]>0.){
178 if(fDist12toPrim>10.)return kFALSE;
179 if(fDist12toPrim<cuts[2])return kFALSE;
180 }
181 //3track cuts
182 if(cuts[3]>0.){
183 if(fDist3toPrim<cuts[3])return kFALSE;
184 }
185 //4track cuts
186 if(cuts[4]>0.){
187 if(fDist4toPrim<cuts[4])return kFALSE;
188 }
189 if(cuts[5]>-1.1){
190 if(CosPointingAngle()<cuts[5])return kFALSE;
191 }
192 if(cuts[6]>0.){
193 if(Pt()<cuts[6])return kFALSE;
194 }
195 if(cuts[7]>0.){
196 Double_t massD0[2];
197 Double_t massD0bar[2];
198 Bool_t good=CutRhoMass(massD0,massD0bar,cuts[0],cuts[7]);
199 if(!good) return kFALSE;
200 }
a76e1b15 201
721c0b8f 202 return kTRUE;
203}
204//----------------------------------------------------------------------------
a76e1b15 205Bool_t AliAODRecoDecayHF4Prong::CutRhoMass(Double_t massD0[2],Double_t massD0bar[2],Double_t cutMass,Double_t cutRho) const
206{
721c0b8f 207 //
a76e1b15 208 // Cut on rho->pipi mass for any of the pairs
721c0b8f 209 //
210 Bool_t isGood=kFALSE;
211 Int_t nprongs=4;
212 for(Int_t i=0;i<2;i++){massD0[i]=0.;massD0bar[i]=0.;}
213 Bool_t isRho=kFALSE;
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;
219 if(isRho){
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;
224 isTrue=kFALSE;
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;
229 isTrue=kFALSE;
230 }
231 Double_t minv03=InvMassRho(0,3);
232 if(TMath::Abs(minv03-mPDGRho)<cutRho) isRho=kTRUE;
233 if(isRho){
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;
238 isTrue=kFALSE;
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;
243 isTrue=kFALSE;
244 }
245 Double_t minv12=InvMassRho(1,2);
246 if(TMath::Abs(minv12-mPDGRho)<cutRho) isRho=kTRUE;
247 if(isRho){
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;
252 isTrue=kFALSE;
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;
257 isTrue=kFALSE;
258 }
259 Double_t minv23=InvMassRho(2,3);
260 if(TMath::Abs(minv23-mPDGRho)<cutRho) isRho=kTRUE;
261 if(isRho){
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;
266 isTrue=kFALSE;
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;
271 isTrue=kFALSE;
272 }
273 return isGood;
3244eeed 274}