1 #ifndef ALIAODRECODECAYHF_H
2 #define ALIAODRECODECAYHF_H
3 /* Copyright(c) 1998-2006, ALICE Experiment at CERN, All rights reserved. *
4 * See cxx source for full Copyright notice */
6 //***********************************************************
7 // Class AliAODRecoDecayHF
8 // base class for AOD reconstructed heavy-flavour decays
9 // Author: A.Dainese, andrea.dainese@lnl.infn.it
10 //***********************************************************
14 #include "AliAODTrack.h"
15 #include "AliAODRecoDecay.h"
20 class AliAODRecoDecayHF : public AliAODRecoDecay {
25 AliAODRecoDecayHF(AliAODVertex *vtx2,Int_t nprongs,Short_t charge,
26 Double_t *px,Double_t *py,Double_t *pz,
27 Double_t *d0,Double_t *d0err);
28 AliAODRecoDecayHF(AliAODVertex *vtx2,Int_t nprongs,Short_t charge,
29 Double_t *d0,Double_t *d0err);
30 AliAODRecoDecayHF(Double_t vtx1[3],Double_t vtx2[3],
31 Int_t nprongs,Short_t charge,
32 Double_t *px,Double_t *py,Double_t *pz,Double_t *d0);
33 virtual ~AliAODRecoDecayHF();
35 AliAODRecoDecayHF(const AliAODRecoDecayHF& source);
36 AliAODRecoDecayHF& operator=(const AliAODRecoDecayHF& source);
40 void SetPrimaryVtxRef(TObject *vtx) { fEventPrimaryVtx = vtx; }
41 AliAODVertex* GetPrimaryVtxRef() const { return (AliAODVertex*)(fEventPrimaryVtx.GetObject()); }
42 void SetOwnPrimaryVtx(const AliAODVertex *vtx) { UnsetOwnPrimaryVtx(); fOwnPrimaryVtx = new AliAODVertex(*vtx);}
43 void CheckOwnPrimaryVtx() const
44 {if(!fOwnPrimaryVtx) printf("fOwnPrimaryVtx not set"); return;}
45 AliAODVertex* GetOwnPrimaryVtx() const {return fOwnPrimaryVtx;}
46 void GetOwnPrimaryVtx(Double_t vtx[3]) const
47 {CheckOwnPrimaryVtx();fOwnPrimaryVtx->GetPosition(vtx);}
48 void UnsetOwnPrimaryVtx() {if(fOwnPrimaryVtx) {delete fOwnPrimaryVtx; fOwnPrimaryVtx=0;} return;}
49 AliAODVertex* GetPrimaryVtx() const { return (GetOwnPrimaryVtx() ? GetOwnPrimaryVtx() : GetPrimaryVtxRef()); }
51 // kinematics & topology
52 Double_t DecayLength() const
53 { return AliAODRecoDecay::DecayLength(GetPrimaryVtx());}
54 Double_t DecayLengthError() const
55 { return AliAODRecoDecay::DecayLengthError(GetPrimaryVtx());}
56 Double_t NormalizedDecayLength() const
57 { return AliAODRecoDecay::NormalizedDecayLength(GetPrimaryVtx());}
58 Double_t DecayLengthXY() const
59 { return AliAODRecoDecay::DecayLengthXY(GetPrimaryVtx());}
60 Double_t DecayLengthXYError() const
61 { return AliAODRecoDecay::DecayLengthXYError(GetPrimaryVtx());}
62 Double_t NormalizedDecayLengthXY() const
63 { return AliAODRecoDecay::NormalizedDecayLengthXY(GetPrimaryVtx());}
64 Double_t Ct(UInt_t pdg) const
65 { return AliAODRecoDecay::Ct(pdg,GetPrimaryVtx());}
66 Double_t CosPointingAngle() const
67 { return AliAODRecoDecay::CosPointingAngle(GetPrimaryVtx());}
68 Double_t CosPointingAngleXY() const
69 { return AliAODRecoDecay::CosPointingAngleXY(GetPrimaryVtx());}
70 Double_t ImpParXY() const
71 { return AliAODRecoDecay::ImpParXY(GetPrimaryVtx());}
72 Double_t QtProngFlightLine(Int_t ip) const
73 { return AliAODRecoDecay::QtProngFlightLine(ip,GetPrimaryVtx());}
74 Double_t QlProngFlightLine(Int_t ip) const
75 { return AliAODRecoDecay::QlProngFlightLine(ip,GetPrimaryVtx());}
78 Double_t Getd0errProng(Int_t ip) const {return fd0err[ip];}
79 Double_t Normalizedd0Prong(Int_t ip) const
80 {return Getd0Prong(ip)/Getd0errProng(ip);}
82 void SetProngIDs(Int_t nIDs,UShort_t *id);
83 UShort_t GetProngID(Int_t ip) const
84 {if(fProngID) {return fProngID[ip];} else {return 9999;}}
86 // ITS clustermap for daughters
87 Bool_t DaughterHasPointOnITSLayer(Int_t dg,Int_t l) const;
89 // check if it is like-sign
90 Bool_t IsLikeSign() const;
93 void SetListOfCutsRef(TObject *obj) {fListOfCuts=obj;}
94 TList *GetListOfCuts() const {return (TList*)(fListOfCuts.GetObject());}
95 AliRDHFCuts *GetCuts(const char* name) const;
98 AliKFParticle *ApplyVertexingKF(Int_t *iprongs,Int_t nprongs,Int_t *pdgs,
99 Bool_t topoCostraint,Double_t bzkG,
100 Double_t *mass) const;
104 AliAODVertex *fOwnPrimaryVtx; // primary vertex for this candidate
105 TRef fEventPrimaryVtx; // ref to primary vertex of the event
106 TRef fListOfCuts; // ref to the list of analysis cuts
107 Double_t *fd0err; //[fNProngs] error on prongs rphi impact param [cm]
108 UShort_t *fProngID; //[fNProngs] track ID of daughters
110 ClassDef(AliAODRecoDecayHF,4) // base class for AOD reconstructed heavy-flavour decays
113 inline void AliAODRecoDecayHF::SetProngIDs(Int_t nIDs,UShort_t *id)
115 if(nIDs!=GetNProngs()) {
116 printf("Wrong number of IDs, must be nProngs\n");
119 if(fProngID) delete [] fProngID;
120 fProngID = new UShort_t[nIDs];
121 for(Int_t i=0;i<nIDs;i++)
126 inline Bool_t AliAODRecoDecayHF::IsLikeSign() const
128 // check if it is like-sign
130 Int_t ndg=GetNDaughters();
132 printf("Daughters not available\n");
135 Int_t chargeDg0 = ((AliAODTrack*)GetDaughter(0))->Charge();
137 for(Int_t i=1; i<ndg; i++) {
138 if(chargeDg0!=((AliAODTrack*)GetDaughter(i))->Charge()) return kFALSE;
144 inline AliRDHFCuts *AliAODRecoDecayHF::GetCuts(const char* name) const
146 // returns the analysis cuts
148 TList *list = GetListOfCuts();
152 return (AliRDHFCuts*)list->FindObject(name);
155 inline Bool_t AliAODRecoDecayHF::DaughterHasPointOnITSLayer(Int_t dg,Int_t l) const
157 // ITS clustermap for daughters
160 printf("ERROR: layer has to be in the range 0-5\n");
163 AliAODTrack *t = (AliAODTrack*)GetDaughter(dg);
164 if(!t) return kFALSE;
166 return TESTBIT(t->GetITSClusterMap(),l);