Added check of daughters clustermap in ITS
[u/mrichter/AliRoot.git] / PWG3 / vertexingHF / AliAODRecoDecayHF.h
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                               */
5
6 //***********************************************************
7 // Class AliAODRecoDecayHF
8 // base class for AOD reconstructed heavy-flavour decays
9 // Author: A.Dainese, andrea.dainese@lnl.infn.it
10 //***********************************************************
11
12 #include <TRef.h>
13 #include <TList.h>
14 #include "AliAODTrack.h"
15 #include "AliAODRecoDecay.h"
16
17 class AliRDHFCuts;
18 class AliKFParticle;
19
20 class AliAODRecoDecayHF : public AliAODRecoDecay {
21
22  public:
23
24   AliAODRecoDecayHF();
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();
34
35   AliAODRecoDecayHF(const AliAODRecoDecayHF& source);
36   AliAODRecoDecayHF& operator=(const AliAODRecoDecayHF& source); 
37    
38
39   // primary vertex
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()); }
50
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());}
76
77   // prongs
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);}
81   
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;}}
85
86   // ITS clustermap for daughters
87   Bool_t DaughterHasPointOnITSLayer(Int_t dg,Int_t l) const;
88
89   // check if it is like-sign
90   Bool_t IsLikeSign() const;
91
92   // list of cuts
93   void SetListOfCutsRef(TObject *obj) {fListOfCuts=obj;}
94   TList *GetListOfCuts() const {return (TList*)(fListOfCuts.GetObject());}
95   AliRDHFCuts *GetCuts(const char* name) const;
96
97   // vertexing KF:
98   AliKFParticle *ApplyVertexingKF(Int_t *iprongs,Int_t nprongs,Int_t *pdgs,
99                                  Bool_t topoCostraint,Double_t bzkG,
100                                  Double_t *mass) const;
101   
102  protected:
103
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
109
110   ClassDef(AliAODRecoDecayHF,4)  // base class for AOD reconstructed heavy-flavour decays
111 };
112
113 inline void AliAODRecoDecayHF::SetProngIDs(Int_t nIDs,UShort_t *id) 
114 {
115   if(nIDs!=GetNProngs()) { 
116     printf("Wrong number of IDs, must be nProngs\n");
117     return;
118   }
119   if(fProngID) delete [] fProngID;
120   fProngID = new UShort_t[nIDs];
121   for(Int_t i=0;i<nIDs;i++) 
122     fProngID[i] = id[i]; 
123   return;
124 }
125
126 inline Bool_t AliAODRecoDecayHF::IsLikeSign() const
127 {
128   // check if it is like-sign
129
130   Int_t ndg=GetNDaughters();
131   if(!ndg) {
132     printf("Daughters not available\n");
133     return kFALSE;
134   }
135   Int_t chargeDg0 = ((AliAODTrack*)GetDaughter(0))->Charge();
136
137   for(Int_t i=1; i<ndg; i++) {
138     if(chargeDg0!=((AliAODTrack*)GetDaughter(i))->Charge()) return kFALSE;
139   }
140
141   return kTRUE;
142 }
143
144 inline AliRDHFCuts *AliAODRecoDecayHF::GetCuts(const char* name) const
145
146   // returns the analysis cuts
147
148   TList *list = GetListOfCuts();
149   if(!list) return 0;
150
151
152   return (AliRDHFCuts*)list->FindObject(name);
153 }
154
155 inline Bool_t AliAODRecoDecayHF::DaughterHasPointOnITSLayer(Int_t dg,Int_t l) const
156 {
157   // ITS clustermap for daughters
158
159   if(l<0 || l>5) {
160     printf("ERROR: layer has to be in the range 0-5\n");
161     return kFALSE;
162   }
163   AliAODTrack *t = (AliAODTrack*)GetDaughter(dg);
164   if(!t) return kFALSE;
165
166   return TESTBIT(t->GetITSClusterMap(),l);
167 }
168
169 #endif
170