1 /**************************************************************************
2 * Copyright(c) 1998-2008, 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 // Class for AOD reconstructed heavy-flavour cascades 3prong
21 // Used for Xic->pi Xi pi analysis
23 // Author: Y.S. Watanabe, wyosuke@cns.s.u-tokyo.ac.jp
24 /////////////////////////////////////////////////////////////
27 #include <TDatabasePDG.h>
28 #include <TClonesArray.h>
29 #include "AliAODMCParticle.h"
30 #include "AliAODRecoDecay.h"
31 #include "AliAODVertex.h"
32 #include "AliAODRecoDecayHF3Prong.h"
33 #include "AliAODRecoCascadeHF3Prong.h"
35 ClassImp(AliAODRecoCascadeHF3Prong)
37 //-----------------------------------------------------------------------------
39 AliAODRecoCascadeHF3Prong::AliAODRecoCascadeHF3Prong() :
40 AliAODRecoDecayHF3Prong()
43 // Default Constructor
47 //-----------------------------------------------------------------------------
48 AliAODRecoCascadeHF3Prong::AliAODRecoCascadeHF3Prong(AliAODVertex *vtx2, Short_t charge,
49 Double_t *px, Double_t *py, Double_t *pz,
50 Double_t *d0, Double_t *d0err,
51 Double_t *dca, Double_t sigvert,
52 Double_t dist12,Double_t dist23):
53 AliAODRecoDecayHF3Prong(vtx2, px, py, pz, d0, d0err, dca,sigvert,dist12,dist23,charge)
56 // Constructor with AliAODVertex for decay vertex
60 //-----------------------------------------------------------------------------
61 AliAODRecoCascadeHF3Prong::AliAODRecoCascadeHF3Prong(const AliAODRecoCascadeHF3Prong &source) :
62 AliAODRecoDecayHF3Prong(source)
69 //-----------------------------------------------------------------------------
70 AliAODRecoCascadeHF3Prong &AliAODRecoCascadeHF3Prong::operator=(const AliAODRecoCascadeHF3Prong &source)
73 // assignment operator
75 if(&source == this) return *this;
77 AliAODRecoDecayHF3Prong::operator=(source);
82 //-----------------------------------------------------------------------------
83 AliAODRecoCascadeHF3Prong::~AliAODRecoCascadeHF3Prong()
90 //----------------------------------------------------------------------------
91 //Int_t AliAODRecoCascadeHF3Prong::MatchToMC(Int_t pdgabs,Int_t pdgabs3prong,
92 // Int_t *pdgDg,Int_t *pdgDg3prong,
93 // TClonesArray *mcArray, Bool_t isV0) const
96 // // Check if this candidate is matched to a MC signal
97 // // If no, return -1
98 // // If yes, return label (>=0) of the AliAODMCParticle
101 // Int_t ndg=GetNDaughters();
103 // AliError("No daughters available");
108 // ( (pdgDg[1]==2212 && pdgDg[0]==310) ||
109 // (pdgDg[1]==211 && pdgDg[0]==3122) ) ) {
110 // AliWarning(Form("Please, pay attention: first element in AliAODRecoCascadeHF3Prong object must be the bachelor and second one V0. Skipping! (pdgDg[0] = %d, (pdgDg[1] = %d)", pdgDg[0], pdgDg[1]));
114 // Int_t lab3Prong = -1;
117 // AliAODRecoDecayHF2Prong *the2Prong = Get2Prong();
118 // lab2Prong = the2Prong->MatchToMC(pdgabs2prong,mcArray,2,pdgDg2prong);
120 // AliAODv0 *theV0 = dynamic_cast<AliAODv0*>(Getv0());
121 // lab2Prong = theV0->MatchToMC(pdgabs2prong,mcArray,2,pdgDg2prong); // the V0
124 // if(lab2Prong<0) return -1;
126 // Int_t dgLabels[10]={0,0,0,0,0,0,0,0,0,0};
129 // // loop on daughters and write labels
130 // for(Int_t i=0; i<ndg; i++) {
131 // AliVTrack *trk = dynamic_cast<AliVTrack*>(GetDaughter(i));
132 // if(!trk) continue;
133 // Int_t lab = trk->GetLabel();
134 // if(lab==-1) { // this daughter is the 2prong
136 // } else if(lab<-1) continue;
137 // dgLabels[i] = lab;
140 // AliVTrack *trk = dynamic_cast<AliVTrack*>(GetBachelor()); // the bachelor
141 // if (!trk) return -1;
142 // dgLabels[0] = trk->GetLabel();//TMath::Abs(trk->GetLabel());
143 // dgLabels[1] = lab2Prong;
146 // Int_t finalLabel = AliAODRecoDecay::MatchToMC(pdgabs,mcArray,dgLabels,2,2,pdgDg);
148 // if (finalLabel>=0){
149 // // debug printouts for Lc->V0 bachelor case
151 // if ( isV0 && (dgLabels[0]!=-1 && dgLabels[1]!=-1) ) {
152 // AliAODv0 *theV0 = dynamic_cast<AliAODv0*>(Getv0());
153 // Bool_t onTheFly = theV0->GetOnFlyStatus();
154 // if (pdgDg[0]==2212 && pdgDg[1]==310) {
155 // AliAODMCParticle*k0s = dynamic_cast<AliAODMCParticle*>(mcArray->At(lab2Prong));
157 // Int_t labK0 = k0s->GetMother();
158 // AliAODMCParticle*k0bar = dynamic_cast<AliAODMCParticle*>(mcArray->At(labK0));
160 // AliDebug(1,Form(" (onTheFly=%1d) LabelV0=%d (%d) -> LabelK0S=%d (%d -> %d %d)",onTheFly,labK0,k0bar->GetPdgCode(),lab2Prong,pdgabs2prong,pdgDg2prong[0],pdgDg2prong[1]));
161 // AliDebug(1,Form(" LabelLc=%d (%d) -> LabelBachelor=%d (%d) LabelV0=%d (%d)",
162 // finalLabel,pdgabs,
163 // dgLabels[0],pdgDg[0],dgLabels[1],pdgDg[1]));
166 // } else if (pdgDg[0]==211 && pdgDg[1]==3122) {
167 // AliDebug(1,Form(" (onTheFly=%1d) LabelV0=%d (%d -> %d %d)",onTheFly,lab2Prong,pdgabs2prong,pdgDg2prong[0],pdgDg2prong[1]));
168 // AliDebug(1,Form(" LabelLc=%d (%d) -> LabelBachelor=%d (%d) LabelV0=%d (%d)",
169 // finalLabel,pdgabs,
170 // dgLabels[0],pdgDg[0],dgLabels[1],pdgDg[1]));
176 // return finalLabel;
180 //________________________________________________________________________
181 Double_t AliAODRecoCascadeHF3Prong::CascDcaXiDaughters() const
184 // DCA between Xi daughters
187 AliAODcascade *casc = (AliAODcascade*)GetCascade();
190 return casc->DcaXiDaughters();
194 //________________________________________________________________________
195 Double_t AliAODRecoCascadeHF3Prong::CascDcaV0Daughters() const
198 // DCA between Cascade-V0 daughters
201 AliAODcascade *casc = (AliAODcascade*)GetCascade();
204 return casc->DcaV0Daughters();
208 //________________________________________________________________________
209 Double_t AliAODRecoCascadeHF3Prong::CascDecayLength() const
212 // Decay length of Xi
215 AliAODcascade *casc = (AliAODcascade*)GetCascade();
219 AliAODVertex *vtxPrimary = GetPrimaryVtx();
220 Double_t posVtx[3] = {0.,0.,0.};
221 vtxPrimary->GetXYZ(posVtx);
222 return casc->DecayLengthXi(posVtx[0],posVtx[1],posVtx[2]);
226 //________________________________________________________________________
227 Double_t AliAODRecoCascadeHF3Prong::CascDecayLengthV0() const
230 // Decay length of V0 from Xi
233 AliAODcascade *casc = (AliAODcascade*)GetCascade();
236 return casc->DecayLengthV0();
239 //________________________________________________________________________
240 Double_t AliAODRecoCascadeHF3Prong::CascCosPointingAngle() const
243 // Xi pointing angle to primary vertex
246 AliAODcascade *casc = (AliAODcascade*)GetCascade();
250 AliAODVertex *vtxPrimary = GetPrimaryVtx();
251 Double_t posVtx[3] = {0.,0.,0.};
252 vtxPrimary->GetXYZ(posVtx);
253 return casc->CosPointingAngleXi(posVtx[0],posVtx[1],posVtx[2]);
255 //________________________________________________________________________
256 Double_t AliAODRecoCascadeHF3Prong::CascCosPointingAngleV0() const
259 // Cos pointing angle of V0 to Xi decay vertex
262 AliAODcascade *casc = (AliAODcascade*)GetCascade();
265 return casc->CosPointingAngle(casc->GetDecayVertexXi());
268 //________________________________________________________________________
269 Double_t AliAODRecoCascadeHF3Prong::CascDcaV0ToPrimVertex() const
272 // DCA to primary vertex of Cascade-V0
275 AliAODcascade *casc = (AliAODcascade*)GetCascade();
278 return casc->DcaV0ToPrimVertex();
281 //________________________________________________________________________
282 Double_t AliAODRecoCascadeHF3Prong::CascDcaPosToPrimVertex() const
285 // DCA to primary vertex of Cascade-positive track
288 AliAODcascade *casc = (AliAODcascade*)GetCascade();
291 return casc->DcaPosToPrimVertex();
294 //________________________________________________________________________
295 Double_t AliAODRecoCascadeHF3Prong::CascDcaNegToPrimVertex() const
298 // DCA to primary vertex of Cascade-negative track
301 AliAODcascade *casc = (AliAODcascade*)GetCascade();
304 return casc->DcaNegToPrimVertex();
307 //________________________________________________________________________
308 Double_t AliAODRecoCascadeHF3Prong::CascDcaBachToPrimVertex() const
311 // DCA to primary vertex of Cascade-Bachelor track
314 AliAODcascade *casc = (AliAODcascade*)GetCascade();
317 return casc->DcaBachToPrimVertex();
320 //________________________________________________________________________
321 Double_t AliAODRecoCascadeHF3Prong::CascMassXi() const
327 AliAODcascade *casc = (AliAODcascade*)GetCascade();
330 return casc->MassXi();
333 //________________________________________________________________________
334 Double_t AliAODRecoCascadeHF3Prong::CascMassLambda() const
337 // Lambda mass of cascade-v0
340 AliAODcascade *casc = (AliAODcascade*)GetCascade();
343 return casc->MassLambda();
346 //________________________________________________________________________
347 Double_t AliAODRecoCascadeHF3Prong::CascMassAntiLambda() const
350 // Anti-Lambda mass of cascade-v0
353 AliAODcascade *casc = (AliAODcascade*)GetCascade();
356 return casc->MassAntiLambda();
359 //________________________________________________________________________
360 Double_t AliAODRecoCascadeHF3Prong::XicCosPointingAngle() const
363 // Xic pointing angle to primary vertex
366 AliAODVertex *vtxPrimary = GetPrimaryVtx();
367 AliAODVertex *vtxSecondary = GetSecondaryVtx();
369 Double_t dx = vtxSecondary->GetX()-vtxPrimary->GetX();
370 Double_t dy = vtxSecondary->GetY()-vtxPrimary->GetY();
371 Double_t dl = sqrt(dx*dx+dy*dy);
378 return (px*dx+py*dy)/pt/dl;