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 */
6 //-------------------------------------------------------------------------
7 // Class AliAnalysisVertexingHF
8 // Reconstruction of heavy-flavour decay candidates
10 // Origin: E.Bruna, G.E.Bruno, A.Dainese, F.Prino, R.Romita, X.M.Zhang
11 // Contact: andrea.dainese@pd.infn.it
12 //-------------------------------------------------------------------------
18 class AliAODRecoDecayHF;
19 class AliAODRecoDecayHF2Prong;
20 class AliAODRecoDecayHF3Prong;
21 class AliAODRecoDecayHF4Prong;
22 class AliAODRecoCascadeHF;
23 class AliAnalysisFilter;
24 class AliRDHFCutsD0toKpi;
25 class AliRDHFCutsJpsitoee;
26 class AliRDHFCutsDplustoKpipi;
27 class AliRDHFCutsDstoKKpi;
28 class AliRDHFCutsLctopKpi;
29 class AliRDHFCutsD0toKpipipi;
34 //-----------------------------------------------------------------------------
35 class AliAnalysisVertexingHF : public TNamed {
38 AliAnalysisVertexingHF();
39 AliAnalysisVertexingHF(const AliAnalysisVertexingHF& source);
40 AliAnalysisVertexingHF& operator=(const AliAnalysisVertexingHF& source);
41 virtual ~AliAnalysisVertexingHF();
43 void FindCandidates(AliVEvent *event,
44 TClonesArray *aodVerticesHFTClArr,
45 TClonesArray *aodD0toKpiTClArr,
46 TClonesArray *aodJPSItoEleTClArr,
47 TClonesArray *aodCharm3ProngTClArr,
48 TClonesArray *aodCharm4ProngTClArr,
49 TClonesArray *aodDstarTClArr,
50 TClonesArray *aodLikeSign2ProngTClArr,
51 TClonesArray *aodLikeSign3ProngTClArr);
53 TList* FillListOfCuts();
54 void PrintStatus() const;
55 void SetSecVtxWithKF() { fSecVtxWithKF=kTRUE; }
56 void SetD0toKpiOn() { fD0toKpi=kTRUE; }
57 void SetD0toKpiOff() { fD0toKpi=kFALSE; }
58 void SetJPSItoEleOn() { fJPSItoEle=kTRUE; }
59 void SetJPSItoEleOff() { fJPSItoEle=kFALSE; }
60 void Set3ProngOn() { f3Prong=kTRUE; }
61 void Set3ProngOff() { f3Prong=kFALSE; }
62 void Set4ProngOn() { f4Prong=kTRUE; }
63 void Set4ProngOff() { f4Prong=kFALSE; }
64 void SetDstarOn() { fDstar=kTRUE; }
65 void SetDstarOff() { fDstar=kFALSE; }
66 void SetLikeSignOn() { fLikeSign=kTRUE; }
67 void SetLikeSignOff() { fLikeSign=kFALSE; }
68 void SetMixEventOn() { fMixEvent=kTRUE; }
69 void SetMixEventOff() { fMixEvent=kFALSE; }
70 void SetInputAOD() { fInputAOD=kTRUE; }
71 Bool_t GetD0toKpi() const { return fD0toKpi; }
72 Bool_t GetJPSItoEle() const { return fJPSItoEle; }
73 Bool_t Get3Prong() const { return f3Prong; }
74 Bool_t Get4Prong() const { return f4Prong; }
75 Bool_t GetDstar() const { return fDstar; }
76 Bool_t GetLikeSign() const { return fLikeSign; }
77 Bool_t GetMixEvent() const { return fMixEvent; }
78 Bool_t GetInputAOD() const { return fInputAOD; }
79 Bool_t GetRecoPrimVtxSkippingTrks() const {return fRecoPrimVtxSkippingTrks;}
80 Bool_t GetRmTrksFromPrimVtx() const {return fRmTrksFromPrimVtx;}
81 void SetFindVertexForDstar(Bool_t vtx=kTRUE) { fFindVertexForDstar=vtx; }
82 void SetRecoPrimVtxSkippingTrks()
83 { fRecoPrimVtxSkippingTrks=kTRUE; fRmTrksFromPrimVtx=kFALSE;}
84 void UnsetRecoPrimVtxSkippingTrks()
85 { fRecoPrimVtxSkippingTrks=kFALSE; fRmTrksFromPrimVtx=kFALSE;}
86 void SetRmTrksFromPrimVtx()
87 {fRmTrksFromPrimVtx=kTRUE; fRecoPrimVtxSkippingTrks=kFALSE; }
88 void SetTrackFilter(AliAnalysisFilter* trackF) { fTrackFilter = trackF; }
89 void SetTrackFilterSoftPi(AliAnalysisFilter* trackF) { fTrackFilterSoftPi = trackF; }
90 AliAnalysisFilter* GetTrackFilter() const { return fTrackFilter; }
91 AliAnalysisFilter* GetTrackFilterSoftPi() const { return fTrackFilterSoftPi; }
92 void SetCutsD0toKpi(AliRDHFCutsD0toKpi* cuts) { fCutsD0toKpi = cuts; }
93 AliRDHFCutsD0toKpi* GetCutsD0toKpi() const { return fCutsD0toKpi; }
94 void SetCutsJpsitoee(AliRDHFCutsJpsitoee* cuts) { fCutsJpsitoee = cuts; }
95 AliRDHFCutsJpsitoee* GetCutsJpsitoee() const { return fCutsJpsitoee; }
96 void SetCutsDplustoKpipi(AliRDHFCutsDplustoKpipi* cuts) { fCutsDplustoKpipi = cuts; }
97 AliRDHFCutsDplustoKpipi* GetCutsDplustoKpipi() const { return fCutsDplustoKpipi; }
98 void SetCutsDstoKKpi(AliRDHFCutsDstoKKpi* cuts) { fCutsDstoKKpi = cuts; }
99 AliRDHFCutsDstoKKpi* GetCutsDstoKKpi() const { return fCutsDstoKKpi; }
100 void SetCutsLctopKpi(AliRDHFCutsLctopKpi* cuts) { fCutsLctopKpi = cuts; }
101 AliRDHFCutsLctopKpi* GetCutsLctopKpi() const { return fCutsLctopKpi; }
102 void SetCutsD0toKpipipi(AliRDHFCutsD0toKpipipi* cuts) { fCutsD0toKpipipi = cuts; }
103 AliRDHFCutsD0toKpipipi* GetCutsD0toKpipipi() const { return fCutsD0toKpipipi; }
104 void SetCutsD0fromDstar(AliRDHFCutsD0toKpi* cuts) { fCutsD0fromDstar = cuts; }
105 AliRDHFCutsD0toKpi* GetCutsD0fromDstar() const { return fCutsD0fromDstar; }
106 void SetD0toKpiCuts(Double_t cut0=1000.,Double_t cut1=100000.,
107 Double_t cut2=1.1,Double_t cut3=0.,Double_t cut4=0.,
108 Double_t cut5=100000.,Double_t cut6=100000.,
109 Double_t cut7=100000000.,Double_t cut8=-1.1);
110 void SetD0toKpiCuts(const Double_t cuts[9]);
111 void SetD0fromDstarCuts(Double_t cut0=1000.,Double_t cut1=100000.,
112 Double_t cut2=1.1,Double_t cut3=0.,Double_t cut4=0.,
113 Double_t cut5=100000.,Double_t cut6=100000.,
114 Double_t cut7=100000000.,Double_t cut8=-1.1);
115 void SetD0fromDstarCuts(const Double_t cuts[9]);
116 void SetBtoJPSICuts(Double_t cut0=1000.,Double_t cut1=100000.,
117 Double_t cut2=1.1,Double_t cut3=0.,Double_t cut4=0.,
118 Double_t cut5=100000.,Double_t cut6=100000.,
119 Double_t cut7=100000000.,Double_t cut8=-1.1);
120 void SetBtoJPSICuts(const Double_t cuts[9]);
121 void SetDplusCuts(Double_t cut0=1000.,Double_t cut1=0.,
122 Double_t cut2=0.,Double_t cut3=0.,Double_t cut4=0.,
123 Double_t cut5=0.,Double_t cut6=10000000000.,
124 Double_t cut7=0.,Double_t cut8=0.,
125 Double_t cut9=-1.1,Double_t cut10=0.,
126 Double_t cut11=10000000000.);
127 void SetDplusCuts(const Double_t cuts[12]);
128 void SetDsCuts(Double_t cut0=1000.,Double_t cut1=0.,
129 Double_t cut2=0.,Double_t cut3=0.,Double_t cut4=0.,
130 Double_t cut5=0.,Double_t cut6=10000000000.,
131 Double_t cut7=0.,Double_t cut8=0.,
132 Double_t cut9=-1.1,Double_t cut10=0.,
133 Double_t cut11=10000000000., Double_t cut12=1000.,
134 Double_t cut13=1000.);
135 void SetDsCuts(const Double_t cuts[14]);
136 void SetLcCuts(Double_t cut0=1000.,Double_t cut1=0.,
137 Double_t cut2=0.,Double_t cut3=0.,Double_t cut4=0.,
138 Double_t cut5=0.,Double_t cut6=10000000000.,
139 Double_t cut7=0.,Double_t cut8=0.,
140 Double_t cut9=-1.1,Double_t cut10=0.,
141 Double_t cut11=10000000000.);
142 void SetLcCuts(const Double_t cuts[12]);
143 void SetDstarCuts(Double_t cut0=1000., Double_t cut1=1000.,
144 Double_t cut2=-1., Double_t cut3=1000.,
146 void SetDstarCuts(const Double_t cuts[5]);
147 void SetD0to4ProngsCuts(Double_t cut0=1000.,Double_t cut1=100000.,
148 Double_t cut2=0.,Double_t cut3=0.,Double_t cut4=0.,
149 Double_t cut5=-1.1,Double_t cut6=0.,
150 Double_t cut7=0.,Double_t cut8=0.);
151 void SetD0to4ProngsCuts(const Double_t cuts[9]);
152 const Double_t *GetD0toKpiCuts() const {return fD0toKpiCuts;}
153 const Double_t *GetD0fromDstarCuts() const {return fD0fromDstarCuts;}
154 const Double_t *GetBtoJPSICuts() const {return fBtoJPSICuts;}
155 const Double_t *GetDplusCuts() const {return fDplusCuts;}
156 const Double_t *GetDsCuts() const {return fDsCuts;}
157 const Double_t *GetLcCuts() const {return fLcCuts;}
158 const Double_t *GetDstarCuts() const {return fDstarCuts;}
159 const Double_t *GetD0to4ProngsCuts() const {return fD0to4ProngsCuts;}
164 enum { kBitDispl = 0, kBitSoftPi = 1 };
166 Bool_t fInputAOD; // input from AOD (kTRUE) or ESD (kFALSE)
167 Int_t fAODMapSize; // size of fAODMap
168 Int_t *fAODMap; //[fAODMapSize] map between index and ID for AOD tracks
170 Double_t fBzkG; // z componenent of field in kG
172 Bool_t fSecVtxWithKF; // if kTRUE use KF vertexer, else AliVertexerTracks
174 Bool_t fRecoPrimVtxSkippingTrks; // flag for primary vertex reco on the fly
175 // for each candidate, w/o its daughters
176 Bool_t fRmTrksFromPrimVtx; // flag for fast removal of daughters from
177 // the primary vertex
179 AliESDVertex *fV1; // primary vertex
181 // flag to enable candidates production
182 Bool_t fD0toKpi; // D0->Kpi
183 Bool_t fJPSItoEle; // Jpsi->ee
184 Bool_t f3Prong; // D+,Ds,Lc
185 Bool_t f4Prong; // D0->Kpipipi
186 Bool_t fDstar; // D*->D0pi
187 Bool_t fLikeSign; // Like-sign pairs
188 Bool_t fMixEvent; // event mixing
191 AliAnalysisFilter *fTrackFilter; // Track Filter for displaced vertices
192 AliAnalysisFilter *fTrackFilterSoftPi; // Track Filter for D* soft pion
194 AliRDHFCutsD0toKpi *fCutsD0toKpi; // D0->Kpi cuts
195 AliRDHFCutsJpsitoee *fCutsJpsitoee; // J/psi->ee cuts
196 AliRDHFCutsDplustoKpipi *fCutsDplustoKpipi; // D+->Kpipi cuts
197 AliRDHFCutsDstoKKpi *fCutsDstoKKpi; // Ds->KKpi cuts
198 AliRDHFCutsLctopKpi *fCutsLctopKpi; // Lc->pKpi cuts
199 AliRDHFCutsD0toKpipipi *fCutsD0toKpipipi; // D0->Kpipipi cuts
200 AliRDHFCutsD0toKpi *fCutsD0fromDstar; // D0 from Dstar cuts
202 Double_t fD0toKpiCuts[9]; // cuts on D0->Kpi candidates
203 // (to be passed to AliAODRecoDecayHF2Prong::SelectD0())
204 // 0 = inv. mass half width [GeV]
209 // 5 = d0K [cm] upper limit!
210 // 6 = d0Pi [cm] upper limit!
213 Double_t fD0fromDstarCuts[9]; // cuts on D0->Kpi candidates from D*
214 // (to be passed to AliAODRecoCascadeHF::SelectDstar())
215 // 0 = inv. mass half width [GeV]
220 // 5 = d0K [cm] upper limit!
221 // 6 = d0Pi [cm] upper limit!
224 Double_t fBtoJPSICuts[9]; // cuts on JPSI candidates
225 // (to be passed to AliAODRecoDecayHF2Prong::SelectBtoJPSI())
226 // 0 = inv. mass half width [GeV]
228 // 2 = cosThetaStar (negative electron)
231 // 5 = d0O [cm] upper limit!
232 // 6 = d0N [cm] upper limit!
235 Double_t fDplusCuts[12]; // cuts on Dplus candidates
236 // (to be passed to AliAODRecoDecayHF3Prong::SelectDplus())
237 // 0 = inv. mass half width [GeV]
240 // 3 = d0K [cm] lower limit!
241 // 4 = d0Pi [cm] lower limit!
243 // 6 = sigmavert (cm)
244 // 7 = dist prim-sec (cm)
245 // 8 = pM=Max{pT1,pT2,pT3} (GeV/c)
247 // 10 = Sum d0^2 (cm^2)
249 Double_t fDsCuts[14]; // cuts on Ds candidates
250 // (to be passed to AliAODRecoDecayHF3Prong::SelectDs())
251 // 0 = inv. mass half width [GeV]
254 // 3 = d0K [cm] lower limit!
255 // 4 = d0Pi [cm] lower limit!
257 // 6 = sigmavert (cm)
258 // 7 = dist prim-sec (cm)
259 // 8 = pM=Max{pT1,pT2,pT3} (GeV/c)
261 // 10 = Sum d0^2 (cm^2)
263 // 12 = inv. mass cut around phi
264 // 13 = inv. mass cut around phi K0* [GeV]
265 Double_t fLcCuts[12]; // cuts on Lambdac candidates
266 // (to be passed to AliAODRecoDecayHF3Prong::SelectLc())
267 // 0 = inv. mass half width [GeV]
269 // 2 = pTPi abd pTK [GeV/c]
270 // 3 = d0P [cm] lower limit!
271 // 4 = d0Pi and d0K [cm] lower limit!
273 // 6 = sigmavert (cm)
274 // 7 = dist prim-sec (cm)
275 // 8 = pM=Max{pT1,pT2,pT3} (GeV/c)
277 // 10 = Sum d0^2 (cm^2)
279 Double_t fDstarCuts[5]; // cuts on D* candidates
280 // (to be passed to AliAODRecoCascadeHF::SelectDstar())
281 // 0 = inv. mass half width of D* [GeV]
282 // 1 = half width of (M_Kpipi-M_Kpi) [GeV]
283 // 2 = PtMin of pi_s [GeV/c]
284 // 3 = PtMax of pi_s [GeV/c]
285 // 4 = theta, angle between the track of pi_s and D0 decay plane [rad]
287 Double_t fD0to4ProngsCuts[9]; // cuts on D0->K3pi candidates
288 // (to be passed to AliAODRecoDecayHF4Prong::SelectD0())
289 // 0 = inv. mass half width of D0 [GeV]
290 // 1 = DCA between opposite sign tracks
291 // 2 = Distance between primary and two tracks vertex fDist12toPrim
292 // 3 = Distance between primary and three tracks vertex fDist3toPrim
293 // 4 = Distance between primary and two tracks vertex fDist4toPrim
294 // 5 = Cosinus of the pointing angle
295 // 6 = Transverse momentum of the D0 candidate
296 // 7 = Mass Pi+Pi- = mass of the rho0
297 // 8 = PID cut (one K in the quadruplet)
299 TList *fListOfCuts; // pointer to list of cuts for output file
300 Bool_t fFindVertexForDstar; // reconstruct a secondary vertex or assume it's from the primary vertex
302 void AddRefs(AliAODVertex *v,AliAODRecoDecayHF *rd,const AliVEvent *event,
303 const TObjArray *trkArray) const;
304 void AddDaughterRefs(AliAODVertex *v,const AliVEvent *event,
305 const TObjArray *trkArray) const;
306 AliAODRecoDecayHF2Prong* Make2Prong(TObjArray *twoTrackArray1,AliVEvent *event,
307 AliAODVertex *secVert,Double_t dcap1n1,
308 Bool_t &okD0,Bool_t &okJPSI,Bool_t &okD0fromDstar) const;
309 AliAODRecoDecayHF3Prong* Make3Prong(TObjArray *threeTrackArray,AliVEvent *event,
310 AliAODVertex *secVert,
312 const AliAODVertex *vertexp1n1,
313 const AliAODVertex *vertexp2n1,
314 Double_t dcap1n1,Double_t dcap2n1,Double_t dcap1p2,
315 Bool_t &ok3Prong) const;
316 AliAODRecoDecayHF4Prong* Make4Prong(TObjArray *fourTrackArray,AliVEvent *event,
317 AliAODVertex *secVert,
318 const AliAODVertex *vertexp1n1,
319 const AliAODVertex *vertexp1n1p2,
320 Double_t dcap1n1,Double_t dcap1n2,
321 Double_t dcap2n1,Double_t dcap2n2,
322 Bool_t &ok4Prong) const;
323 AliAODRecoCascadeHF* MakeCascade(TObjArray *twoTrackArray,AliVEvent *event,
324 AliAODVertex *secVert,
325 AliAODRecoDecayHF2Prong *rd2Prong,
327 Bool_t &okDstar) const;
329 AliAODVertex* PrimaryVertex(const TObjArray *trkArray=0x0,AliVEvent *event=0x0) const;
330 AliAODVertex* ReconstructSecondaryVertex(TObjArray *trkArray,Double_t &dispersion,Bool_t useTRefArray=kTRUE) const;
331 Bool_t SelectInvMass(Int_t decay,Int_t nprongs,
332 Double_t *px,Double_t *py,Double_t *pz) const;
333 void SelectTracksAndCopyVertex(const AliVEvent *event,
334 TObjArray &seleTrksArray,Int_t &nSeleTrks,
335 UChar_t *seleFlags,Int_t *evtNumber);
336 Bool_t SingleTrkCuts(AliESDtrack *trk,Bool_t &okDisplaced,Bool_t &okSoftPi) const;
338 ClassDef(AliAnalysisVertexingHF,16); // Reconstruction of HF decay candidates