Setters added (Magnus)
[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 AliAODEvent;
18 class AliRDHFCuts;
19 class AliKFParticle;
20
21 class AliAODRecoDecayHF : public AliAODRecoDecay {
22
23  public:
24
25   AliAODRecoDecayHF();
26   AliAODRecoDecayHF(AliAODVertex *vtx2,Int_t nprongs,Short_t charge,
27                     Double_t *px,Double_t *py,Double_t *pz,
28                     Double_t *d0,Double_t *d0err);
29   AliAODRecoDecayHF(AliAODVertex *vtx2,Int_t nprongs,Short_t charge,
30                     Double_t *d0,Double_t *d0err);
31   AliAODRecoDecayHF(Double_t vtx1[3],Double_t vtx2[3],
32                     Int_t nprongs,Short_t charge,
33                     Double_t *px,Double_t *py,Double_t *pz,Double_t *d0);
34   virtual ~AliAODRecoDecayHF();
35
36   AliAODRecoDecayHF(const AliAODRecoDecayHF& source);
37   AliAODRecoDecayHF& operator=(const AliAODRecoDecayHF& source); 
38    
39
40   // primary vertex
41   void SetPrimaryVtxRef(TObject *vtx) { fEventPrimaryVtx = vtx; }
42   AliAODVertex* GetPrimaryVtxRef() const { return (AliAODVertex*)(fEventPrimaryVtx.GetObject()); }
43   void SetOwnPrimaryVtx(const AliAODVertex *vtx) { UnsetOwnPrimaryVtx(); fOwnPrimaryVtx = new AliAODVertex(*vtx);}
44   void CheckOwnPrimaryVtx() const 
45     {if(!fOwnPrimaryVtx) printf("fOwnPrimaryVtx not set"); return;}
46   AliAODVertex* GetOwnPrimaryVtx() const {return fOwnPrimaryVtx;}
47   void GetOwnPrimaryVtx(Double_t vtx[3]) const 
48     {CheckOwnPrimaryVtx();fOwnPrimaryVtx->GetPosition(vtx);}
49   void UnsetOwnPrimaryVtx() {if(fOwnPrimaryVtx) {delete fOwnPrimaryVtx; fOwnPrimaryVtx=0;} return;}
50   AliAODVertex* GetPrimaryVtx() const { return (GetOwnPrimaryVtx() ? GetOwnPrimaryVtx() : GetPrimaryVtxRef()); }
51   AliAODVertex* RemoveDaughtersFromPrimaryVtx(AliAODEvent *aod);  
52
53
54   // kinematics & topology
55   Double_t DecayLength2() const 
56     { return AliAODRecoDecay::DecayLength2(GetPrimaryVtx());}
57   Double_t DecayLength() const 
58     { return AliAODRecoDecay::DecayLength(GetPrimaryVtx());}
59   Double_t DecayLengthError() const 
60     { return AliAODRecoDecay::DecayLengthError(GetPrimaryVtx());}
61   Double_t NormalizedDecayLength() const 
62     { return AliAODRecoDecay::NormalizedDecayLength(GetPrimaryVtx());}
63   Double_t NormalizedDecayLength2() const 
64     { return AliAODRecoDecay::NormalizedDecayLength2(GetPrimaryVtx());}
65   Double_t DecayLengthXY() const 
66     { return AliAODRecoDecay::DecayLengthXY(GetPrimaryVtx());}
67   Double_t DecayLengthXYError() const 
68     { return AliAODRecoDecay::DecayLengthXYError(GetPrimaryVtx());}
69   Double_t NormalizedDecayLengthXY() const 
70     { return AliAODRecoDecay::NormalizedDecayLengthXY(GetPrimaryVtx());}
71   Double_t Ct(UInt_t pdg) const 
72     { return AliAODRecoDecay::Ct(pdg,GetPrimaryVtx());}
73   Double_t CosPointingAngle() const 
74     { return AliAODRecoDecay::CosPointingAngle(GetPrimaryVtx());}
75   Double_t CosPointingAngleXY() const 
76     { return AliAODRecoDecay::CosPointingAngleXY(GetPrimaryVtx());}
77   Double_t ImpParXY() const 
78     { return AliAODRecoDecay::ImpParXY(GetPrimaryVtx());}
79   Double_t QtProngFlightLine(Int_t ip) const 
80     { return AliAODRecoDecay::QtProngFlightLine(ip,GetPrimaryVtx());}
81   Double_t QlProngFlightLine(Int_t ip) const 
82     { return AliAODRecoDecay::QlProngFlightLine(ip,GetPrimaryVtx());}
83
84   // prongs
85   Double_t Getd0errProng(Int_t ip) const {return fd0err[ip];}
86   void     Setd0errProngs(Int_t nprongs,Double_t *d0);
87   Double_t Normalizedd0Prong(Int_t ip) const 
88     {return Getd0Prong(ip)/Getd0errProng(ip);}
89   
90   void SetProngIDs(Int_t nIDs,UShort_t *id);
91   UShort_t GetProngID(Int_t ip) const 
92     {if(fProngID) {return fProngID[ip];} else {return 9999;}}
93
94   // ITS clustermap for daughters
95   Bool_t DaughterHasPointOnITSLayer(Int_t dg,Int_t l) const;
96
97   // check if it is like-sign
98   Bool_t IsLikeSign() const;
99
100   // list of cuts
101   void SetListOfCutsRef(TObject *obj) {fListOfCuts=obj;}
102   TList *GetListOfCuts() const {return (TList*)(fListOfCuts.GetObject());}
103   AliRDHFCuts *GetCuts(const char* name) const;
104
105   // vertexing KF:
106   AliKFParticle *ApplyVertexingKF(Int_t *iprongs,Int_t nprongs,Int_t *pdgs,
107                                  Bool_t topoCostraint,Double_t bzkG,
108                                  Double_t *mass) const;
109   
110   // misalign
111   void Misalign(TString misal="null");
112
113   // selection map
114   void    SetSelectionBit(Int_t i) {SETBIT(fSelectionMap,i); return;}
115   Bool_t  HasSelectionBit(Int_t i) const {return TESTBIT(fSelectionMap,i);}
116   ULong_t GetSelectionMap() const {return fSelectionMap;}
117
118   Int_t   NumberOfFakeDaughters() const;
119
120  protected:
121
122   AliAODVertex *fOwnPrimaryVtx; // primary vertex for this candidate
123   TRef          fEventPrimaryVtx; // ref to primary vertex of the event
124   TRef          fListOfCuts;  // ref to the list of analysis cuts
125   Double_t     *fd0err;  //[fNProngs] error on prongs rphi impact param [cm]
126   UShort_t     *fProngID;  //[fNProngs] track ID of daughters
127   ULong_t       fSelectionMap; // used to store outcome of selection in AliAnalysisVertexingHF
128
129   ClassDef(AliAODRecoDecayHF,5)  // base class for AOD reconstructed heavy-flavour decays
130 };
131
132 inline void AliAODRecoDecayHF::SetProngIDs(Int_t nIDs,UShort_t *id) 
133 {
134   if(nIDs!=GetNProngs()) { 
135     printf("Wrong number of IDs, must be nProngs\n");
136     return;
137   }
138   if(fProngID) delete [] fProngID;
139   fProngID = new UShort_t[nIDs];
140   for(Int_t i=0;i<nIDs;i++) 
141     fProngID[i] = id[i]; 
142   return;
143 }
144
145 inline Bool_t AliAODRecoDecayHF::IsLikeSign() const
146 {
147   // check if it is like-sign
148
149   Int_t ndg=GetNDaughters();
150   if(!ndg) {
151     printf("Daughters not available\n");
152     return kFALSE;
153   }
154   Int_t chargeDg0 = ((AliAODTrack*)GetDaughter(0))->Charge();
155
156   for(Int_t i=1; i<ndg; i++) {
157     if(chargeDg0!=((AliAODTrack*)GetDaughter(i))->Charge()) return kFALSE;
158   }
159
160   return kTRUE;
161 }
162
163 inline AliRDHFCuts *AliAODRecoDecayHF::GetCuts(const char* name) const
164
165   // returns the analysis cuts
166
167   TList *list = GetListOfCuts();
168   if(!list) return 0;
169
170
171   return (AliRDHFCuts*)list->FindObject(name);
172 }
173
174 inline Bool_t AliAODRecoDecayHF::DaughterHasPointOnITSLayer(Int_t dg,Int_t l) const
175 {
176   // ITS clustermap for daughters
177
178   if(l<0 || l>5) {
179     printf("ERROR: layer has to be in the range 0-5\n");
180     return kFALSE;
181   }
182   AliAODTrack *t = (AliAODTrack*)GetDaughter(dg);
183   if(!t) return kFALSE;
184
185   return TESTBIT(t->GetITSClusterMap(),l);
186 }
187
188 inline Int_t AliAODRecoDecayHF::NumberOfFakeDaughters() const 
189 {
190   // Count number of daughters with negative label
191
192   Int_t nfakes=0;
193   for(Int_t i=0; i<GetNDaughters(); i++) {
194     AliAODTrack *track=(AliAODTrack*)GetDaughter(i);
195
196     if(track->Charge()==0) { // this is a two prong decay
197       AliAODRecoDecay *rd=(AliAODRecoDecay*)GetDaughter(i);
198       for(Int_t j=0; j<rd->GetNDaughters(); j++) {
199         AliAODTrack *track2=(AliAODTrack*)GetDaughter(j);
200         if(track2->GetLabel()<0) nfakes++;
201       }
202       continue;
203     }
204
205     if(track->GetLabel()<0) nfakes++;
206   }
207   return nfakes;
208 }
209
210 inline void AliAODRecoDecayHF::Setd0errProngs(Int_t nprongs,Double_t *d0err) 
211 {
212   if(nprongs!=GetNProngs()) { 
213     printf("Wrong number of momenta, must be nProngs");
214     return;
215   }
216   if(!fd0) {
217     fd0err = new Double32_t[nprongs];
218   }
219   for(Int_t i=0;i<nprongs;i++) {
220     fd0err[i] = d0err[i]; 
221   }
222
223   return;
224 }
225
226 #endif
227