]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGHF/vertexingHF/AliAnalysisVertexingHF.h
adding checks and debugging information
[u/mrichter/AliRoot.git] / PWGHF / vertexingHF / AliAnalysisVertexingHF.h
1 #ifndef ALIANALYSISVERTEXINGHF_H
2 #define ALIANALYSISVERTEXINGHF_H
3 /* Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
4  * See cxx source for full Copyright notice                               */
5
6 /* $Id$ */ 
7
8 //-------------------------------------------------------------------------
9 //                      Class AliAnalysisVertexingHF
10 //            Reconstruction of heavy-flavour decay candidates
11 //      
12 //  Origin: E.Bruna, G.E.Bruno, A.Dainese, F.Prino, R.Romita, X.M.Zhang
13 //  Contact: andrea.dainese@pd.infn.it
14 //-------------------------------------------------------------------------
15
16 #include <TNamed.h>
17 #include <TList.h>
18
19 #include "AliAnalysisFilter.h"
20 #include "AliESDtrackCuts.h"
21
22 class AliPIDResponse;
23 class AliESDVertex;
24 class AliAODRecoDecay;
25 class AliAODRecoDecayHF;
26 class AliAODRecoDecayHF2Prong;
27 class AliAODRecoDecayHF3Prong;
28 class AliAODRecoDecayHF4Prong;
29 class AliAODRecoCascadeHF;
30 class AliAnalysisFilter;
31 class AliRDHFCuts;
32 class AliRDHFCutsD0toKpi;
33 class AliRDHFCutsJpsitoee;
34 class AliRDHFCutsDplustoKpipi;
35 class AliRDHFCutsDstoKKpi;
36 class AliRDHFCutsLctopKpi;
37 class AliRDHFCutsLctoV0;
38 class AliRDHFCutsD0toKpipipi;
39 class AliRDHFCutsDStartoKpipi;
40 class AliESDtrack;
41 class AliVEvent;
42 class AliAODVertex;
43 class AliVertexerTracks;
44 class AliESDv0; 
45 class AliAODv0; 
46
47 //-----------------------------------------------------------------------------
48 class AliAnalysisVertexingHF : public TNamed {
49  public:
50   //
51   AliAnalysisVertexingHF();
52   AliAnalysisVertexingHF(const AliAnalysisVertexingHF& source);
53   AliAnalysisVertexingHF& operator=(const AliAnalysisVertexingHF& source); 
54   virtual ~AliAnalysisVertexingHF();
55
56   void FindCandidates(AliVEvent *event,
57                       TClonesArray *aodVerticesHFTClArr,
58                       TClonesArray *aodD0toKpiTClArr,
59                       TClonesArray *aodJPSItoEleTClArr,
60                       TClonesArray *aodCharm3ProngTClArr,
61                       TClonesArray *aodCharm4ProngTClArr,
62                       TClonesArray *aodDstarTClArr,
63                       TClonesArray *aodCascadesTClArr,
64                       TClonesArray *aodLikeSign2ProngTClArr,
65                       TClonesArray *aodLikeSign3ProngTClArr);
66
67   TList* FillListOfCuts();
68   void FixReferences(AliAODEvent *aod);  
69   void PrintStatus() const;
70   void SetSecVtxWithKF() { fSecVtxWithKF=kTRUE; }
71   void SetD0toKpiOn() { fD0toKpi=kTRUE; }
72   void SetD0toKpiOff() { fD0toKpi=kFALSE; }
73   void SetJPSItoEleOn() { fJPSItoEle=kTRUE; }
74   void SetJPSItoEleOff() { fJPSItoEle=kFALSE; }
75   void Set3ProngOn() { f3Prong=kTRUE; }
76   void Set3ProngOff() { f3Prong=kFALSE; }
77   void Set4ProngOn() { f4Prong=kTRUE; }
78   void Set4ProngOff() { f4Prong=kFALSE; }
79   void SetDstarOn() { fDstar=kTRUE; }
80   void SetDstarOff() { fDstar=kFALSE; }
81   void SetCascadesOn() { fCascades=kTRUE; }
82   void SetCascadesOff() { fCascades=kFALSE; }
83   void SetLikeSignOn() { fLikeSign=kTRUE; }
84   void SetLikeSignOff() {fLikeSign=kFALSE; fLikeSign3prong=kFALSE;}
85   void SetLikeSign3prongOn() { fLikeSign=kTRUE; fLikeSign3prong=kTRUE; }
86   void SetLikeSign3prongOff() { fLikeSign3prong=kFALSE; }
87   void SetMixEventOn() { fMixEvent=kTRUE; }
88   void SetMixEventOff() { fMixEvent=kFALSE; }
89   void SetInputAOD() { fInputAOD=kTRUE; }
90   Bool_t GetD0toKpi() const { return fD0toKpi; }
91   Bool_t GetJPSItoEle() const { return fJPSItoEle; }
92   Bool_t Get3Prong() const { return f3Prong; }
93   Bool_t Get4Prong() const { return f4Prong; }
94   Bool_t GetDstar()  const { return fDstar; }
95   Bool_t GetCascades() const { return fCascades; }
96   Bool_t GetLikeSign() const { return fLikeSign; }
97   Bool_t GetLikeSign3prong() const { return fLikeSign3prong; }
98   Bool_t GetMixEvent() const { return fMixEvent; }
99   Bool_t GetInputAOD() const { return fInputAOD; }
100   Bool_t GetRecoPrimVtxSkippingTrks() const {return fRecoPrimVtxSkippingTrks;}
101   Bool_t GetRmTrksFromPrimVtx() const {return fRmTrksFromPrimVtx;}
102   void SetFindVertexForDstar(Bool_t vtx=kTRUE) { fFindVertexForDstar=vtx; }
103   void SetFindVertexForCascades(Bool_t vtx=kTRUE) { fFindVertexForCascades=vtx; }
104
105   void  SetV0TypeForCascadeVertex(Int_t type) {fV0TypeForCascadeVertex = type;}
106   Int_t GetV0TypeForCascadeVertex()           { return fV0TypeForCascadeVertex;}
107   
108   void SetRecoPrimVtxSkippingTrks() 
109     { fRecoPrimVtxSkippingTrks=kTRUE; fRmTrksFromPrimVtx=kFALSE;}
110   void UnsetRecoPrimVtxSkippingTrks()
111     { fRecoPrimVtxSkippingTrks=kFALSE; fRmTrksFromPrimVtx=kFALSE;}
112   void SetRmTrksFromPrimVtx() 
113     {fRmTrksFromPrimVtx=kTRUE; fRecoPrimVtxSkippingTrks=kFALSE; }
114   void SetTrackFilter(AliAnalysisFilter* trackF) {
115     // switch off the TOF selection that cannot be applied with AODTracks 
116     TList *l = (TList*)trackF->GetCuts();
117     AliESDtrackCuts *tcuts = (AliESDtrackCuts*)l->FindObject("AliESDtrackCuts");
118     if(tcuts->GetFlagCutTOFdistance()) tcuts->SetFlagCutTOFdistance(kFALSE);
119     fTrackFilter = trackF; 
120   }
121   void SetTrackFilter2prongPbCentral(Float_t maxPercentile, AliAnalysisFilter* trackF) {
122     // switch off the TOF selection that cannot be applied with AODTracks 
123     TList *l = (TList*)trackF->GetCuts();
124     AliESDtrackCuts *tcuts = (AliESDtrackCuts*)l->FindObject("AliESDtrackCuts");
125     if(tcuts->GetFlagCutTOFdistance()) tcuts->SetFlagCutTOFdistance(kFALSE);
126     fTrackFilter2prongCentral = trackF; 
127     fMaxCentPercentileForTightCuts=maxPercentile;
128   }
129   void SetTrackFilter3prongPbCentral(Float_t maxPercentile, AliAnalysisFilter* trackF) {
130     // switch off the TOF selection that cannot be applied with AODTracks 
131     TList *l = (TList*)trackF->GetCuts();
132     AliESDtrackCuts *tcuts = (AliESDtrackCuts*)l->FindObject("AliESDtrackCuts");
133     if(tcuts->GetFlagCutTOFdistance()) tcuts->SetFlagCutTOFdistance(kFALSE);
134     fTrackFilter3prongCentral = trackF; 
135     fMaxCentPercentileForTightCuts=maxPercentile;
136   }
137   void SetTrackFilterSoftPi(AliAnalysisFilter* trackF) { 
138     // switch off the TOF selection that cannot be applied with AODTracks 
139     TList *l = (TList*)trackF->GetCuts();
140     AliESDtrackCuts *tcuts = (AliESDtrackCuts*)l->FindObject("AliESDtrackCuts");
141     if(tcuts->GetFlagCutTOFdistance()) tcuts->SetFlagCutTOFdistance(kFALSE);
142     fTrackFilterSoftPi = trackF; 
143   }
144   AliAnalysisFilter* GetTrackFilter() const { return fTrackFilter; }
145   AliAnalysisFilter* GetTrackFilterSoftPi() const { return fTrackFilterSoftPi; }
146   void SetCutsD0toKpi(AliRDHFCutsD0toKpi* cuts) { fCutsD0toKpi = cuts; }
147   AliRDHFCutsD0toKpi* GetCutsD0toKpi() const { return fCutsD0toKpi; }
148   void SetCutsJpsitoee(AliRDHFCutsJpsitoee* cuts) { fCutsJpsitoee = cuts; }
149   AliRDHFCutsJpsitoee* GetCutsJpsitoee() const { return fCutsJpsitoee; }
150   void SetCutsDplustoKpipi(AliRDHFCutsDplustoKpipi* cuts) { fCutsDplustoKpipi = cuts; }
151   AliRDHFCutsDplustoKpipi* GetCutsDplustoKpipi() const { return fCutsDplustoKpipi; }
152   void SetCutsDstoKKpi(AliRDHFCutsDstoKKpi* cuts) { fCutsDstoKKpi = cuts; }
153   AliRDHFCutsDstoKKpi* GetCutsDstoKKpi() const { return fCutsDstoKKpi; }
154   void SetCutsLctopKpi(AliRDHFCutsLctopKpi* cuts) { fCutsLctopKpi = cuts; }
155   AliRDHFCutsLctopKpi* GetCutsLctopKpi() const { return fCutsLctopKpi; }
156   void SetCutsLctoV0(AliRDHFCutsLctoV0* cuts) { fCutsLctoV0 = cuts; }
157   AliRDHFCutsLctoV0* GetCutsLctoV0() const { return fCutsLctoV0; }
158   void SetCutsD0toKpipipi(AliRDHFCutsD0toKpipipi* cuts) { fCutsD0toKpipipi = cuts; }
159   AliRDHFCutsD0toKpipipi* GetCutsD0toKpipipi() const { return fCutsD0toKpipipi; }
160   void SetCutsDStartoKpipi(AliRDHFCutsDStartoKpipi* cuts) { fCutsDStartoKpipi = cuts; }
161   AliRDHFCutsDStartoKpipi* GetCutsDStartoKpipi() const { return fCutsDStartoKpipi; }
162   void SetMassCutBeforeVertexing(Bool_t flag) { fMassCutBeforeVertexing=flag; } 
163
164   void SetMasses();
165   Bool_t CheckCutsConsistency();
166
167   void SetUseTPCPID(Bool_t opt=kTRUE){fUseTPCPID=opt;}
168   void SetUseTOFPID(Bool_t opt=kTRUE){fUseTOFPID=opt;}
169   void SetUseTPCPIDOnlyIfNoTOF(Bool_t opt=kTRUE){fUseTPCPIDOnlyIfNoTOF=opt;}
170   void SetMaxMomForTPCPid(Double_t mom){fMaxMomForTPCPid=mom;}
171   void SetnSigmaTPCforPionSel(Double_t nsl, Double_t nsh){
172     fnSigmaTPCPionLow=nsl; fnSigmaTPCPionHi=nsh;}
173   void SetnSigmaTOFforPionSel(Double_t nsl, Double_t nsh){
174     fnSigmaTOFPionLow=nsl; fnSigmaTOFPionHi=nsh;}
175   void SetnSigmaTPCforKaonSel(Double_t nsl, Double_t nsh){
176     fnSigmaTPCKaonLow=nsl; fnSigmaTPCKaonHi=nsh;}
177   void SetnSigmaTOFforKaonSel(Double_t nsl, Double_t nsh){
178     fnSigmaTOFKaonLow=nsl; fnSigmaTOFKaonHi=nsh;}
179   void SetnSigmaTPCforProtonSel(Double_t nsl, Double_t nsh){
180     fnSigmaTPCProtonLow=nsl; fnSigmaTPCProtonHi=nsh;}
181   void SetnSigmaTOFforProtonSel(Double_t nsl, Double_t nsh){
182     fnSigmaTOFProtonLow=nsl; fnSigmaTOFProtonHi=nsh;}
183
184   void SetUseKaonPIDfor3Prong(Bool_t opt=kTRUE){fUseKaonPIDfor3Prong=opt;}
185   void SetNotUseProtonPIDforLambdaC(){fUsePIDforLc=0;}
186   void SetUseProtonPIDforLambdaC(){fUsePIDforLc=1;}
187   void SetUseProtonAndPionPIDforLambdaC(){fUsePIDforLc=2;}
188   void SetUseKaonPIDforDs(Bool_t opt=kTRUE){fUseKaonPIDforDs=opt;}
189
190   void SetPidResponse(AliPIDResponse* p){fPidResponse=p;}
191
192   //
193  private:
194   //
195   enum { kBitDispl = 0, kBitSoftPi = 1, kBit3Prong = 2, kBitPionCompat = 3, kBitKaonCompat = 4, kBitProtonCompat = 5};
196
197   Bool_t fInputAOD; // input from AOD (kTRUE) or ESD (kFALSE) 
198   Int_t fAODMapSize; // size of fAODMap 
199   Int_t *fAODMap; //[fAODMapSize] map between index and ID for AOD tracks
200
201   AliVertexerTracks* fVertexerTracks; // vertexer, to compute secondary vertices
202   Double_t fBzkG; // z componenent of field in kG
203
204   Bool_t fSecVtxWithKF; // if kTRUE use KF vertexer, else AliVertexerTracks
205
206   Bool_t fRecoPrimVtxSkippingTrks; // flag for primary vertex reco on the fly
207                                    // for each candidate, w/o its daughters
208   Bool_t fRmTrksFromPrimVtx; // flag for fast removal of daughters from 
209                              // the primary vertex
210
211   AliESDVertex *fV1; // primary vertex
212
213   // flag to enable candidates production
214   Bool_t fD0toKpi;   // D0->Kpi 
215   Bool_t fJPSItoEle; // Jpsi->ee
216   Bool_t f3Prong;    // D+,Ds,Lc
217   Bool_t f4Prong;    // D0->Kpipipi
218   Bool_t fDstar;     // D*->D0pi
219   Bool_t fCascades;  // cascades, Lc --> v0+track
220   Bool_t fLikeSign;  // Like-sign pairs
221   Bool_t fLikeSign3prong;  // Like-sign triplets
222   Bool_t fMixEvent; // event mixing
223
224   AliPIDResponse* fPidResponse; // PID response
225   Bool_t fUseKaonPIDfor3Prong;  // Kaon PID usage for 3 prongs
226   Int_t  fUsePIDforLc;          // PID for Lambdac: 0=no, 1=proton, 2=p and pi
227   Bool_t fUseKaonPIDforDs;      // Kaon PID usage for Ds
228   Bool_t fUseTPCPID;            // switch use/not use TPC PID
229   Bool_t fUseTOFPID;            // switch use/not use TOF PID
230   Bool_t fUseTPCPIDOnlyIfNoTOF; // use TPC PID only for tracks that without TOF
231   Double_t fMaxMomForTPCPid;    // upper momentum limit to apply TPC PID
232   Double_t fnSigmaTPCPionLow;   //Low cut value on n. of sigmas for pi TPC PID
233   Double_t fnSigmaTPCPionHi;    //High cut value on n. of sigmas for pi TPC PID
234   Double_t fnSigmaTOFPionLow;   //Low cut value on n. of sigmas for pi TOF PID
235   Double_t fnSigmaTOFPionHi;    //High cut value on n. of sigmas for pi TOF PID
236   Double_t fnSigmaTPCKaonLow;   //Low cut value on n. of sigmas for K TPC PID
237   Double_t fnSigmaTPCKaonHi;    //High cut value on n. of sigmas for K TPC PID
238   Double_t fnSigmaTOFKaonLow;   //Low cut value on n. of sigmas for K TOF PID
239   Double_t fnSigmaTOFKaonHi;    //High cut value on n. of sigmas for K TOF PID
240   Double_t fnSigmaTPCProtonLow; //Low cut value on n. of sigmas for p TPC PID
241   Double_t fnSigmaTPCProtonHi;  //High cut value on n. of sigmas for p TPC PID
242   Double_t fnSigmaTOFProtonLow; //Low cut value on n. of sigmas for p TOF PID
243   Double_t fnSigmaTOFProtonHi;  //High cut value on n. of sigmas for p TOF PID
244
245   Float_t fMaxCentPercentileForTightCuts; //max. centrality percentile for using tight cuts
246
247   // single-track cuts
248   AliAnalysisFilter *fTrackFilter; //  Track Filter for displaced vertices
249   AliAnalysisFilter *fTrackFilter2prongCentral; //  Track Filter for displaced vertices in PbPb central events (tighter cuts) for 2 prong (D0->Kpi)
250   AliAnalysisFilter *fTrackFilter3prongCentral; //  Track Filter for displaced vertices in PbPb central events (tighter cuts) for 3 prong (D+, Ds, Lc)
251   AliAnalysisFilter *fTrackFilterSoftPi; //  Track Filter for D* soft pion
252   // candidates cuts
253   AliRDHFCutsD0toKpi *fCutsD0toKpi; // D0->Kpi cuts
254   AliRDHFCutsJpsitoee *fCutsJpsitoee; // J/psi->ee cuts
255   AliRDHFCutsDplustoKpipi *fCutsDplustoKpipi; // D+->Kpipi cuts
256   AliRDHFCutsDstoKKpi *fCutsDstoKKpi; // Ds->KKpi cuts
257   AliRDHFCutsLctopKpi *fCutsLctopKpi; // Lc->pKpi cuts
258   AliRDHFCutsLctoV0 *fCutsLctoV0; // Lc --> v0 + bachelor cuts
259   AliRDHFCutsD0toKpipipi *fCutsD0toKpipipi; // D0->Kpipipi cuts
260   AliRDHFCutsDStartoKpipi *fCutsDStartoKpipi; // Dstar->D0pi cuts
261
262   TList *fListOfCuts;    // pointer to list of cuts for output file
263   Bool_t fFindVertexForDstar; // reconstruct a secondary vertex or assume it's from the primary vertex
264   Bool_t fFindVertexForCascades;  // reconstruct a secondary vertex or assume it's from the primary vertex
265   Int_t  fV0TypeForCascadeVertex;  // Select which V0 type we want to use for the cascas
266   Bool_t fMassCutBeforeVertexing; // to go faster in PbPb
267   // dummies for invariant mass calculation
268   AliAODRecoDecay *fMassCalc2; // for 2 prong
269   AliAODRecoDecay *fMassCalc3; // for 3 prong
270   AliAODRecoDecay *fMassCalc4; // for 4 prong
271   Bool_t fOKInvMassD0; // pair fullfilling D0 inv mass selection
272   Bool_t fOKInvMassJpsi; // pair fullfilling Jpsi inv mass selection
273   Bool_t fOKInvMassDplus; // triplet fullfilling D+ inv mass selection
274   Bool_t fOKInvMassDs; // triplet fullfilling Ds inv mass selection
275   Bool_t fOKInvMassLc; // triplet fullfilling Lc inv mass selection
276   Bool_t fOKInvMassDstar; // combination fullfilling D* inv mass selection
277   Bool_t fOKInvMassD0to4p; // 4tracks fullfilling D0 inv mass selection
278   Bool_t fOKInvMassLctoV0; // triplet fullfilling Lc inv mass selection
279
280   Int_t fnTrksTotal;
281   Int_t fnSeleTrksTotal;
282
283   Double_t fMassDzero;
284   Double_t fMassDplus;
285   Double_t fMassDs;
286   Double_t fMassLambdaC;
287   Double_t fMassDstar;
288   Double_t fMassJpsi;
289
290
291   //
292   void AddRefs(AliAODVertex *v,AliAODRecoDecayHF *rd,const AliVEvent *event,
293                const TObjArray *trkArray) const;
294   void AddDaughterRefs(AliAODVertex *v,const AliVEvent *event,
295                        const TObjArray *trkArray) const;
296   AliAODRecoDecayHF2Prong* Make2Prong(TObjArray *twoTrackArray1,AliVEvent *event,
297                                       AliAODVertex *secVert,Double_t dcap1n1,
298                                       Bool_t &okD0,Bool_t &okJPSI,Bool_t &okD0fromDstar);
299   AliAODRecoDecayHF3Prong* Make3Prong(TObjArray *threeTrackArray,AliVEvent *event,
300                                       AliAODVertex *secVert,
301                                       Double_t dispersion,
302                                       const AliAODVertex *vertexp1n1,
303                                       const AliAODVertex *vertexp2n1,
304                                       Double_t dcap1n1,Double_t dcap2n1,Double_t dcap1p2, 
305                                       Bool_t useForLc, Bool_t useForDs,
306                                       Bool_t &ok3Prong);
307   AliAODRecoDecayHF4Prong* Make4Prong(TObjArray *fourTrackArray,AliVEvent *event,
308                                       AliAODVertex *secVert,
309                                       const AliAODVertex *vertexp1n1,
310                                       const AliAODVertex *vertexp1n1p2,
311                                       Double_t dcap1n1,Double_t dcap1n2,
312                                       Double_t dcap2n1,Double_t dcap2n2,
313                                       Bool_t &ok4Prong);
314   AliAODRecoCascadeHF* MakeCascade(TObjArray *twoTrackArray,AliVEvent *event,
315                                    AliAODVertex *secVert,
316                                    AliAODRecoDecayHF2Prong *rd2Prong,
317                                    Double_t dca,
318                                    Bool_t &okDstar);
319   AliAODRecoCascadeHF* MakeCascade(TObjArray *twoTrackArray,AliVEvent *event,
320                                    AliAODVertex *secVert,
321                                    AliAODv0 *v0,
322                                    Double_t dca,
323                                    Bool_t &okCascades);
324
325   AliAODVertex* PrimaryVertex(const TObjArray *trkArray=0x0,AliVEvent *event=0x0) const;
326   AliAODVertex* ReconstructSecondaryVertex(TObjArray *trkArray,Double_t &dispersion,Bool_t useTRefArray=kTRUE) const;
327
328   Bool_t SelectInvMassAndPt3prong(Double_t *px,Double_t *py,Double_t *pz, Int_t pidLcStatus=3);
329   Bool_t SelectInvMassAndPt4prong(Double_t *px,Double_t *py,Double_t *pz);
330   Bool_t SelectInvMassAndPtD0Kpi(Double_t *px,Double_t *py,Double_t *pz);
331   Bool_t SelectInvMassAndPtJpsiee(Double_t *px,Double_t *py,Double_t *pz);
332   Bool_t SelectInvMassAndPtDstarD0pi(Double_t *px,Double_t *py,Double_t *pz);
333   Bool_t SelectInvMassAndPtCascade(Double_t *px,Double_t *py,Double_t *pz);
334
335   Bool_t SelectInvMassAndPt3prong(TObjArray *trkArray);
336   Bool_t SelectInvMassAndPt4prong(TObjArray *trkArray);
337   Bool_t SelectInvMassAndPtDstarD0pi(TObjArray *trkArray);
338
339   void   SelectTracksAndCopyVertex(const AliVEvent *event,Int_t trkEntries,
340                                    TObjArray &seleTrksArray,
341                                    TObjArray &tracksAtVertex,
342                                    Int_t &nSeleTrks,
343                                    UChar_t *seleFlags,Int_t *evtNumber);
344   void SetParametersAtVertex(AliESDtrack* esdt, const AliExternalTrackParam* extpar) const;
345
346   Bool_t SingleTrkCuts(AliESDtrack *trk,Float_t centralityperc, Bool_t &okDisplaced,Bool_t &okSoftPi, Bool_t &ok3prong) const;
347
348   void   SetSelectionBitForPID(AliRDHFCuts *cuts,AliAODRecoDecayHF *rd,Int_t bit);
349
350   AliAODv0* TransformESDv0toAODv0(AliESDv0 *esdv0, 
351                                   TObjArray *twoTrackArrayV0);
352
353   //
354   ClassDef(AliAnalysisVertexingHF,23);  // Reconstruction of HF decay candidates
355 };
356
357
358 #endif
359
360
361
362
363
364
365
366