]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGHF/vertexingHF/AliRDHFCutsLctoV0.cxx
24a17e7790c6adf2d7a1482304ff704706265ca6
[u/mrichter/AliRoot.git] / PWGHF / vertexingHF / AliRDHFCutsLctoV0.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-2010, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /* $Id$ */
17
18 /////////////////////////////////////////////////////////////
19 //
20 // Class for cuts on AOD reconstructed Lc->V0+X
21 //
22 // Modified by A.De Caro - decaro@sa.infn.it
23 //
24 /////////////////////////////////////////////////////////////
25
26 #include <Riostream.h>
27
28 #include <TDatabasePDG.h>
29 #include <TMath.h>
30
31 #include "AliAnalysisManager.h"
32 #include "AliInputEventHandler.h"
33 #include "AliPIDResponse.h"
34 #include "AliRDHFCutsLctoV0.h"
35 #include "AliAODRecoCascadeHF.h"
36 #include "AliAODTrack.h"
37 #include "AliESDtrack.h"
38 #include "AliESDVertex.h"
39 #include "AliAODVertex.h"
40 #include "AliAODv0.h"
41 #include "AliESDv0.h"
42
43 using std::cout;
44 using std::endl;
45
46 ClassImp(AliRDHFCutsLctoV0)
47
48 //--------------------------------------------------------------------------
49   AliRDHFCutsLctoV0::AliRDHFCutsLctoV0(const char* name, Short_t /*v0channel*/) :
50   AliRDHFCuts(name),
51   fPidSelectionFlag(0),
52   fPidHFV0pos(0),
53   fPidHFV0neg(0),
54   fV0daughtersCuts(0),
55   fV0Type(0)
56 {
57   //
58   // Default Constructor
59   //
60
61   const Int_t nvars=17;
62   SetNVars(nvars);
63   TString varNames[nvars]={"Lc inv. mass if K0S [GeV/c2]",                   //  0
64                            "Lc inv. mass if Lambda [GeV/c2]",                //  1
65                            "K0S inv. mass [GeV/c2]",                         //  2
66                            "Lambda/LambdaBar inv. mass[GeV/c2]",             //  3
67                            "pT min bachelor track [GeV/c]",                  //  4
68                            "pT min V0-positive track [GeV/c]",               //  5
69                            "pT min V0-negative track [GeV/c]",               //  6
70                            "dca cascade (prong-to-prong) cut [cm]",          //  7
71                            "dca V0 (prong-to-prong) cut [number of sigmas]", //  8
72                            "V0 cosPA min wrt PV",                            //  9
73                            "d0 max bachelor wrt PV [cm]",                    // 10
74                            "d0 max V0 wrt PV [cm]",                          // 11
75                            "mass K0S veto [GeV/c2]",                         // 12
76                            "mass Lambda/LambdaBar veto [GeV/c2]",            // 13
77                            "mass Gamma veto [GeV/c2]",                       // 14
78                            "pT min V0 track [GeV/c]",                        // 15
79                            "V0 type"                                         // 16
80   };
81
82   Bool_t isUpperCut[nvars]={kTRUE,  //  0
83                             kTRUE,  //  1
84                             kTRUE,  //  2
85                             kTRUE,  //  3
86                             kFALSE, //  4
87                             kFALSE, //  5
88                             kFALSE, //  6
89                             kTRUE,  //  7
90                             kTRUE,  //  8
91                             kFALSE, //  9
92                             kTRUE,  // 10
93                             kTRUE,  // 11
94                             kFALSE, // 12
95                             kFALSE, // 13
96                             kFALSE, // 14
97                             kFALSE, // 15
98                             kFALSE  // 16
99   };
100   SetVarNames(nvars,varNames,isUpperCut);
101   Bool_t forOpt[nvars]={kFALSE, //  0
102                         kFALSE, //  1
103                         kTRUE,  //  2
104                         kTRUE,  //  3
105                         kTRUE,  //  4
106                         kTRUE,  //  5
107                         kTRUE,  //  6
108                         kTRUE,  //  7
109                         kTRUE,  //  8
110                         kTRUE,  //  9
111                         kTRUE,  // 10
112                         kTRUE,  // 11
113                         kTRUE,  // 12
114                         kTRUE,  // 13
115                         kTRUE,  // 14
116                         kTRUE,  // 15
117                         kFALSE  // 16
118   };
119   SetVarsForOpt(nvars,forOpt);
120
121   Float_t limits[2]={0,999999999.};
122   SetPtBins(2,limits);
123
124   /*
125   switch (v0channel) {
126   case 0:
127     fV0channel = 0x0001;
128     break;
129   case 1:
130     fV0channel = 0x0002;
131     break;
132   case 2:
133     fV0channel = 0x0004;
134     break;
135   }
136   */
137
138 }
139 //--------------------------------------------------------------------------
140 AliRDHFCutsLctoV0::AliRDHFCutsLctoV0(const AliRDHFCutsLctoV0 &source) :
141   AliRDHFCuts(source),
142   fPidSelectionFlag(source.fPidSelectionFlag),
143   fPidHFV0pos(0),
144   fPidHFV0neg(0),
145   fV0daughtersCuts(0),
146   fV0Type(source.fV0Type)
147     /*fV0channel(source.fV0channel)*/
148 {
149   //
150   // Copy constructor
151   //
152
153   if (source.fPidHFV0pos) fPidHFV0pos = new AliAODPidHF(*(source.fPidHFV0pos));
154   else fPidHFV0pos = new AliAODPidHF();
155   if (source.fPidHFV0neg) fPidHFV0neg = new AliAODPidHF(*(source.fPidHFV0neg));
156   else fPidHFV0neg = new AliAODPidHF();
157
158   if (source.fV0daughtersCuts) fV0daughtersCuts = new AliESDtrackCuts(*(source.fV0daughtersCuts));
159   else fV0daughtersCuts = new AliESDtrackCuts();
160
161 }
162 //--------------------------------------------------------------------------
163 AliRDHFCutsLctoV0 &AliRDHFCutsLctoV0::operator=(const AliRDHFCutsLctoV0 &source)
164 {
165   //
166   // assignment operator
167   //
168
169   if (this != &source) {
170
171     AliRDHFCuts::operator=(source);
172     fPidSelectionFlag = source.fPidSelectionFlag;
173     delete fPidHFV0pos;
174     fPidHFV0pos = new AliAODPidHF(*(source.fPidHFV0pos));
175     delete fPidHFV0neg;
176     fPidHFV0neg = new AliAODPidHF(*(source.fPidHFV0neg));
177
178     delete fV0daughtersCuts;
179     fV0daughtersCuts = new AliESDtrackCuts(*(source.fV0daughtersCuts));
180
181     fV0Type  = source.fV0Type;
182
183   }
184
185   return *this;
186 }
187
188
189 //---------------------------------------------------------------------------
190 AliRDHFCutsLctoV0::~AliRDHFCutsLctoV0() {
191  //
192  //  Default Destructor
193  //
194
195  if (fPidHFV0pos) {
196   delete fPidHFV0pos;
197   fPidHFV0pos=0;
198  }
199  if (fPidHFV0neg) {
200   delete fPidHFV0neg;
201   fPidHFV0neg=0;
202  }
203
204  if (fV0daughtersCuts) {
205   delete fV0daughtersCuts;
206   fV0daughtersCuts=0;
207  }
208
209 }
210
211 //---------------------------------------------------------------------------
212 void AliRDHFCutsLctoV0::GetCutVarsForOpt(AliAODRecoDecayHF *d,Float_t *vars,Int_t nvars,Int_t *pdgdaughters) {
213   //
214   // Fills in vars the values of the variables
215   //
216
217   if (pdgdaughters[0]==-9999) return; // dummy
218
219   if (nvars!=fnVarsForOpt) {
220     printf("AliRDHFCutsLctoV0::GetCutVarsForOpt: wrong number of variables\n");
221     return;
222   }
223
224   Double_t mLcPDG  = TDatabasePDG::Instance()->GetParticle(4122)->Mass();
225   Double_t mk0sPDG = TDatabasePDG::Instance()->GetParticle(310)->Mass();
226   Double_t mLPDG   = TDatabasePDG::Instance()->GetParticle(3122)->Mass();
227
228   AliAODRecoCascadeHF *dd = (AliAODRecoCascadeHF*)d;
229
230   // Get the v0 and all daughter tracks
231   AliAODTrack *bachelorTrack = (AliAODTrack*)dd->GetBachelor();
232   AliAODv0 *v0 = (AliAODv0*)dd->Getv0();
233   AliAODTrack *v0positiveTrack = (AliAODTrack*)dd->Getv0PositiveTrack();
234   AliAODTrack *v0negativeTrack = (AliAODTrack*)dd->Getv0NegativeTrack();
235
236   Int_t iter=-1;
237   // cut on cascade mass, if K0S + p
238   if (fVarsForOpt[0]) {
239     iter++;
240     vars[iter]=TMath::Abs(dd->InvMassLctoK0sP()-mLcPDG);
241   }
242   // cut on cascade mass, if Lambda/LambdaBar + pi
243   if (fVarsForOpt[1]) {
244     iter++;
245     vars[iter]=TMath::Abs(dd->InvMassLctoLambdaPi()-mLcPDG);
246   }
247
248   // cut on V0 mass if K0S
249   if (fVarsForOpt[2]) {
250     iter++;
251     vars[iter]=TMath::Abs(v0->MassK0Short()-mk0sPDG);
252   }
253
254   // cut on V0 mass if Lambda/LambdaBar
255   if (fVarsForOpt[3]) {
256
257     if (bachelorTrack->Charge()==1) {
258       iter++;
259       vars[iter]=TMath::Abs(v0->MassLambda()-mLPDG);
260     } else if (bachelorTrack->Charge()==-1) {
261       iter++;
262       vars[iter]=TMath::Abs(v0->MassAntiLambda()-mLPDG);
263     }
264
265   }
266
267   // cut bachelor min pt
268   if (fVarsForOpt[4]) {
269     iter++;
270     vars[iter]=bachelorTrack->Pt();
271   }
272
273   // cut on V0-positive min pt
274   if (fVarsForOpt[5]) {
275     iter++;
276     vars[iter]=v0positiveTrack->Pt();
277   }
278
279   // cut on V0-negative min pt
280   if (fVarsForOpt[6]) {
281     iter++;
282     vars[iter]=v0negativeTrack->Pt();
283   }
284
285   // cut on cascade dca (prong-to-prong)
286   if (fVarsForOpt[7]) {
287     iter++;
288     vars[iter]=dd->GetDCA(); // prong-to-prong cascade DCA
289   }
290
291   // cut on V0 dca (prong-to-prong)
292   if (fVarsForOpt[8]) {
293     iter++;
294     vars[iter]=v0->GetDCA(); // prong-to-prong V0 DCA
295   }
296
297   // cut on V0 cosPA wrt PV
298   if (fVarsForOpt[9]) {
299     iter++;
300     vars[iter]=dd->CosV0PointingAngle(); // cosine of V0 pointing angle wrt primary vertex
301   }
302
303   // cut on bachelor transverse impact parameter wrt PV
304   if (fVarsForOpt[10]) {
305     iter++;
306     vars[iter]=dd->Getd0Prong(0); // bachelor transverse impact parameter wrt primary vertex
307   }
308
309   // cut on V0 transverse impact parameter wrt PV
310   if (fVarsForOpt[11]) {
311     iter++;
312     vars[iter]=dd->Getd0Prong(1); // V0 transverse impact parameter wrt primary vertex
313   }
314
315   // cut on K0S invariant mass veto
316   if (fVarsForOpt[12]) {
317     iter++;
318     vars[iter]=TMath::Abs(v0->MassK0Short()-mk0sPDG); // K0S invariant mass veto
319   }
320
321   // cut on Lambda/LambdaBar invariant mass veto
322   if (fVarsForOpt[13]) {
323
324     if (bachelorTrack->Charge()==1) {
325       iter++;
326       vars[iter]=TMath::Abs(v0->MassLambda()-mLPDG);
327     } else if (bachelorTrack->Charge()==-1) {
328       iter++;
329       vars[iter]=TMath::Abs(v0->MassAntiLambda()-mLPDG);
330     }
331
332   }
333
334   // cut on gamma invariant mass veto
335   if (fVarsForOpt[14]) {
336     iter++;
337     vars[iter]= v0->InvMass2Prongs(0,1,11,11); // gamma invariant mass veto
338   }
339
340
341   // cut on V0 pT min
342   if (fVarsForOpt[15]) {
343     iter++;
344     vars[iter]= v0->Pt(); // V0 pT min
345   }
346
347
348   return;
349 }
350 //---------------------------------------------------------------------------
351 Int_t AliRDHFCutsLctoV0::IsSelected(TObject* obj,Int_t selectionLevel) {
352   //
353   // Apply selection
354   //
355
356   if (!fCutsRD) {
357     cout<<"Cut matrice not inizialized. Exit..."<<endl;
358     return 0;
359   }
360
361   //PrintAll();
362
363   AliAODRecoCascadeHF* d = (AliAODRecoCascadeHF*)obj;
364   if (!d) {
365     AliDebug(2,"AliAODRecoCascadeHF null");
366     return 0;
367   }
368
369   // Get the bachelor track
370   AliAODTrack *bachelorTrack = (AliAODTrack*)d->GetBachelor();
371   if (!bachelorTrack) {
372     AliDebug(2,"No bachelor object");
373     return 0;
374   }
375
376   // not used
377   //if ( fUseTrackSelectionWithFilterBits &&
378   //!(bachelorTrack->TestFilterMask(BIT(4))) ) return 0;
379
380   // Get V0
381   AliAODv0 *v0 = (AliAODv0*)d->Getv0();
382   if (!v0) {
383     AliDebug(2,"No v0 object");
384     return 0;
385   }
386
387   // Get the V0 daughter tracks
388   AliAODTrack *v0positiveTrack = (AliAODTrack*)d->Getv0PositiveTrack();
389   AliAODTrack *v0negativeTrack = (AliAODTrack*)d->Getv0NegativeTrack();
390   if (!v0positiveTrack || !v0negativeTrack ) {
391     AliDebug(2,"No V0 daughters' objects");
392     return 0;
393   }
394
395   // selection on daughter tracks
396   if (selectionLevel==AliRDHFCuts::kAll ||
397       selectionLevel==AliRDHFCuts::kTracks) {
398
399     if (fIsCandTrackSPDFirst && d->Pt()<fMaxPtCandTrackSPDFirst) {
400       if (!bachelorTrack->HasPointOnITSLayer(0)) return 0;
401     }
402     if (fTrackCuts && fV0daughtersCuts) {
403       AliAODVertex *vAOD = (AliAODVertex*)d->GetPrimaryVtx();
404       Double_t pos[3]; vAOD->GetXYZ(pos);
405       Double_t cov[6]; vAOD->GetCovarianceMatrix(cov);
406       const AliESDVertex vESD(pos,cov,100.,100);
407       if ( !(IsDaughterSelected(bachelorTrack,&vESD,fTrackCuts)) ||
408            !(IsDaughterSelected(v0negativeTrack,&vESD,fV0daughtersCuts)) ||
409            !(IsDaughterSelected(v0positiveTrack,&vESD,fV0daughtersCuts)) ) return 0;
410     }
411     //if (!AreDaughtersSelected(d)) return 0;
412   }
413
414   Bool_t okLck0sp=kTRUE, okLcLpi=kTRUE, okLcLBarpi=kTRUE;
415   Bool_t okK0spipi=kTRUE, okLppi=kTRUE, okLBarpip=kTRUE;
416
417   // selection on candidate
418   if (selectionLevel==AliRDHFCuts::kAll ||
419       selectionLevel==AliRDHFCuts::kCandidate) {
420
421     Double_t pt = d->Pt();
422     Int_t ptbin = PtBin(pt);
423
424     Double_t mLcPDG  = TDatabasePDG::Instance()->GetParticle(4122)->Mass();
425     Double_t mk0sPDG = TDatabasePDG::Instance()->GetParticle(310)->Mass();
426     Double_t mLPDG   = TDatabasePDG::Instance()->GetParticle(3122)->Mass();
427
428     // K0S + p
429     Double_t mk0s    = v0->MassK0Short();
430     Double_t mLck0sp = d->InvMassLctoK0sP();
431
432     // Lambda + pi
433     Double_t mlambda  = v0->MassLambda();
434     Double_t malambda = v0->MassAntiLambda();
435     Double_t mLcLpi   = d->InvMassLctoLambdaPi();
436
437     // cut on Lc mass with K0S+p hypothesis
438     if (TMath::Abs(mLck0sp-mLcPDG) > fCutsRD[GetGlobalIndex(0,ptbin)]) {
439       okLck0sp = kFALSE;
440       AliDebug(4,Form(" cascade mass is %2.2e and does not correspond to Lambda_c into K0S+p cut",mLck0sp));
441     }
442
443     // cuts on the V0 mass: K0S case
444     if (TMath::Abs(mk0s-mk0sPDG) > fCutsRD[GetGlobalIndex(2,ptbin)]) {
445       okK0spipi = kFALSE;
446       AliDebug(4,Form(" V0 mass is %2.2e and does not correspond to K0S cut",mk0s));
447     }
448
449     // cut on Lc mass with Lambda+pi hypothesis
450     if (TMath::Abs(mLcLpi-mLcPDG) > fCutsRD[GetGlobalIndex(1,ptbin)]) {
451       okLcLpi = kFALSE;
452       okLcLBarpi = kFALSE;
453       AliDebug(4,Form(" cascade mass is %2.2e and does not correspond to Lambda_c into Lambda+pi cut",mLcLpi));
454     }
455
456     // cuts on the V0 mass: Lambda/LambdaBar case
457     //if ( !(bachelorTrack->Charge()==+1 && TMath::Abs(mlambda-mLPDG) <= fCutsRD[GetGlobalIndex(3,ptbin)] ) ) {
458     if ( TMath::Abs(mlambda-mLPDG) > fCutsRD[GetGlobalIndex(3,ptbin)] ) {
459       okLppi = kFALSE;
460       AliDebug(4,Form(" V0 mass is %2.2e and does not correspond to LambdaBar cut",mlambda));
461     }
462
463     //if ( !(bachelorTrack->Charge()==-1 && TMath::Abs(malambda-mLPDG) <= fCutsRD[GetGlobalIndex(3,ptbin)] ) ) {
464     if ( TMath::Abs(malambda-mLPDG) > fCutsRD[GetGlobalIndex(3,ptbin)] ) {
465       okLBarpip = kFALSE;
466       AliDebug(4,Form(" V0 mass is %2.2e and does not correspond to LambdaBar cut",malambda));
467     }
468
469     okLck0sp   = okLck0sp   && okK0spipi;
470     okLcLpi    = okLcLpi    && okLppi;
471     okLcLBarpi = okLcLBarpi && okLBarpip;
472
473     if (!okLck0sp && !okLcLpi && !okLcLBarpi) return 0;
474
475     // cuts on the minimum pt of the tracks
476     if (TMath::Abs(bachelorTrack->Pt()) < fCutsRD[GetGlobalIndex(4,ptbin)]) {
477       AliDebug(4,Form(" bachelor track Pt=%2.2e > %2.2e",bachelorTrack->Pt(),fCutsRD[GetGlobalIndex(4,ptbin)]));
478       return 0;
479     }
480     if (TMath::Abs(v0positiveTrack->Pt()) < fCutsRD[GetGlobalIndex(5,ptbin)]) {
481       AliDebug(4,Form(" V0-positive track Pt=%2.2e > %2.2e",v0positiveTrack->Pt(),fCutsRD[GetGlobalIndex(5,ptbin)]));
482       return 0;
483     }
484     if (TMath::Abs(v0negativeTrack->Pt()) < fCutsRD[GetGlobalIndex(6,ptbin)]) {
485       AliDebug(4,Form(" V0-negative track Pt=%2.2e > %2.2e",v0negativeTrack->Pt(),fCutsRD[GetGlobalIndex(6,ptbin)]));
486       return 0;
487     }
488
489     // cut on cascade dca (prong-to-prong)
490     if ( TMath::Abs(d->GetDCA()) > fCutsRD[GetGlobalIndex(7,ptbin)] ) { // prong-to-prong cascade DCA
491       AliDebug(4,Form(" cascade tracks DCA don't pass the cut"));
492       return 0;
493     }
494
495     // cut on V0 dca (prong-to-prong)
496     if ( TMath::Abs(v0->GetDCA()) > fCutsRD[GetGlobalIndex(8,ptbin)] ) { // prong-to-prong V0 DCA
497       AliDebug(4,Form(" V0 DCA don't pass the cut"));
498       return 0;
499     }
500
501     // cut on V0 cosine of pointing angle wrt PV
502     if (d->CosV0PointingAngle() < fCutsRD[GetGlobalIndex(9,ptbin)]) { // cosine of V0 pointing angle wrt primary vertex
503       AliDebug(4,Form(" V0 cosine of pointing angle doesn't pass the cut"));
504       return 0;
505     }
506
507     // cut on bachelor transverse impact parameter wrt PV
508     if (TMath::Abs(d->Getd0Prong(0)) > fCutsRD[GetGlobalIndex(10,ptbin)]) { // bachelor transverse impact parameter wrt PV
509       AliDebug(4,Form(" bachelor transverse impact parameter doesn't pass the cut"));
510       return 0;
511     }
512
513     // cut on V0 transverse impact parameter wrt PV
514     if (TMath::Abs(d->Getd0Prong(1)) > fCutsRD[GetGlobalIndex(11,ptbin)]) { // V0 transverse impact parameter wrt PV
515       AliDebug(4,Form(" V0 transverse impact parameter doesn't pass the cut"));
516       return 0;
517     }
518
519     // cut on K0S invariant mass veto
520     if (TMath::Abs(v0->MassK0Short()-mk0sPDG) < fCutsRD[GetGlobalIndex(12,ptbin)]) { // K0S invariant mass veto
521       AliDebug(4,Form(" veto on K0S invariant mass doesn't pass the cut"));
522       return 0;
523     }
524
525     // cut on Lambda/LambdaBar invariant mass veto
526     if (TMath::Abs(v0->MassLambda()-mLPDG) < fCutsRD[GetGlobalIndex(13,ptbin)] ||
527         TMath::Abs(v0->MassAntiLambda()-mLPDG) < fCutsRD[GetGlobalIndex(13,ptbin)] ) { // Lambda/LambdaBar invariant mass veto
528       AliDebug(4,Form(" veto on K0S invariant mass doesn't pass the cut"));
529       return 0;
530     }
531
532     // cut on gamma invariant mass veto
533     if (v0->InvMass2Prongs(0,1,11,11) < fCutsRD[GetGlobalIndex(14,ptbin)]) { // K0S invariant mass veto
534       AliDebug(4,Form(" veto on gamma invariant mass doesn't pass the cut"));
535       return 0;
536     }
537
538     // cut on V0 pT min
539     if (v0->Pt() < fCutsRD[GetGlobalIndex(15,ptbin)]) { // V0 pT min
540       AliDebug(4,Form(" V0 track Pt=%2.2e > %2.2e",v0->Pt(),fCutsRD[GetGlobalIndex(15,ptbin)]));
541       return 0;
542     }
543
544   }
545
546   Int_t returnvalue = okLck0sp+2*okLcLBarpi+4*okLcLpi;
547   /*
548     retvalue case
549           1  Lc->K0S + p
550           2  Lc->LambdaBar + pi
551           3  Lc->K0S + p AND Lc->LambdaBar + pi
552           4  Lc->Lambda + pi
553           5  Lc->K0S + p AND Lc->Lambda + pi
554           6  Lc->LambdaBar + pi AND Lc->Lambda + pi
555           7  Lc->K0S + p AND Lc->LambdaBar + pi AND Lc->Lambda + pi
556   */
557
558   Int_t returnvaluePID = 7;
559
560   // selection on candidate
561   if (selectionLevel==AliRDHFCuts::kAll ||
562       selectionLevel==AliRDHFCuts::kCandidate ||
563       selectionLevel==AliRDHFCuts::kPID )
564     returnvaluePID = IsSelectedPID(d);
565
566   //if (fUsePID && returnvaluePID==0) return 0;
567
568   Int_t returnvalueTot = 0;
569   if ( fUsePID )
570     returnvalueTot = CombinePIDCuts(returnvalue,returnvaluePID);
571   else
572     returnvalueTot = returnvalue;
573
574   return returnvalueTot;
575
576 }
577 //---------------------------------------------------------------------------
578 Int_t AliRDHFCutsLctoV0::IsSelectedPID(AliAODRecoDecayHF* obj) {
579
580   // fPidHF -> PID object for bachelor
581   // fPidHFV0pos -> PID object for positive V0 daughter
582   // fPidHFV0neg -> PID object for negative V0 daughter
583
584   if (!fUsePID || !obj) return 7; // all hypothesis are valid
585
586   if (fPidHF->GetPidResponse()==0x0 ||
587       fPidHFV0pos->GetPidResponse()==0x0 ||
588       fPidHFV0neg->GetPidResponse()==0x0) {
589     AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
590     AliInputEventHandler *inputHandler=(AliInputEventHandler*)mgr->GetInputEventHandler();
591     AliPIDResponse *pidResp=inputHandler->GetPIDResponse();
592     fPidHF->SetPidResponse(pidResp);
593     fPidHFV0pos->SetPidResponse(pidResp);
594     fPidHFV0neg->SetPidResponse(pidResp);
595     fPidHF->SetOldPid(kFALSE);
596     fPidHFV0pos->SetOldPid(kFALSE);
597     fPidHFV0neg->SetOldPid(kFALSE);
598   }
599
600   AliAODRecoCascadeHF *objD = (AliAODRecoCascadeHF*)obj;
601
602   Bool_t isPeriodd = fPidHF->GetOnePad();
603   Bool_t isMC = fPidHF->GetMC();
604
605   if (isPeriodd) {
606     fPidHFV0pos->SetOnePad(kTRUE);
607     fPidHFV0neg->SetOnePad(kTRUE);
608   }
609   if (isMC) {
610     fPidHFV0neg->SetMC(kTRUE);
611     fPidHFV0pos->SetMC(kTRUE);
612   }
613
614   AliAODTrack *bachelor = (AliAODTrack*)objD->GetBachelor();
615   AliAODTrack *v0Pos = (AliAODTrack*)objD->Getv0PositiveTrack();
616   AliAODTrack *v0Neg = (AliAODTrack*)objD->Getv0NegativeTrack();
617
618   if (!bachelor || !v0Pos || !v0Neg) return 0;
619
620   Bool_t okLcK0Sp = kTRUE; // K0S case
621   Bool_t okLcLambdaBarPi = kTRUE; // LambdaBar case
622   Bool_t okLcLambdaPi = kTRUE; // Lambda case
623
624   CheckPID(bachelor,v0Neg,v0Pos,okLcK0Sp,okLcLambdaBarPi,okLcLambdaPi);
625
626   Int_t returnvalue = okLcK0Sp+2*okLcLambdaBarPi+4*okLcLambdaPi;
627
628   return returnvalue;
629 }
630 //-----------------------
631 void AliRDHFCutsLctoV0::CheckPID(AliAODTrack *bachelor, AliAODTrack *v0Neg, AliAODTrack *v0Pos,
632                                  Bool_t &isBachelorID1, Bool_t &isV0NegID2, Bool_t &isV0PosID4) {
633   // identification strategy
634
635   Int_t trackIDtof = -1;
636   Int_t trackIDtpc = -1;
637
638   Bool_t dummy1 = kFALSE;
639   Bool_t dummy2 = kFALSE;
640   Bool_t dummy4 = kFALSE;
641
642   Int_t tpcID = -1;
643   Int_t tofID = -1;
644   Double_t nTPCsigmasPr = -999;
645   Double_t nTOFsigmasPr = -999;
646
647   Bool_t trackIDtofB = -1;
648   Bool_t trackIDtpcB = -1;
649
650   switch (fPidSelectionFlag) {
651
652   case 0:
653
654     // identify bachelor
655     trackIDtof = fPidHF->ApplyPidTOFRaw(bachelor,4);
656     trackIDtpc = fPidHF->ApplyPidTPCRaw(bachelor,4);
657     AliDebug(1,Form(" fPidHF->ApplyPidTOFRaw(bachelor,4)=%d fPidHF->ApplyPidTPCRaw(bachelor,4)=%d",trackIDtof,trackIDtpc));
658     isBachelorID1 = (trackIDtof==4) && (trackIDtpc==4); // K0S case
659     //isBachelorID2 = (fPidHF->ApplyPidTPCRaw(bachelor,2)==2) && (fPidHF->ApplyPidTOFRaw(bachelor,2)==2); // LambdaBar case
660     //isBachelorID4 = isBachelorID2; // Lambda case
661
662     // identify V0neg
663     trackIDtof = fPidHFV0neg->ApplyPidTOFRaw(v0Neg,4);
664     trackIDtpc = fPidHFV0neg->ApplyPidTPCRaw(v0Neg,4);
665     AliDebug(1,Form(" fPidHFV0neg->ApplyPidTOFRaw(v0Neg,4)=%d fPidHFV0neg->ApplyPidTPCRaw(v0Neg,4)=%d",trackIDtof,trackIDtpc));
666     //isV0NegID1 = (fPidHFV0neg->ApplyPidTPCRaw(v0Neg,2)==2) && (fPidHFV0neg->ApplyPidTOFRaw(v0Neg,2)==2); // K0S case
667     isV0NegID2 = (trackIDtof==4) && (trackIDtpc==4); // LambdaBar case
668     //isV0NegID4 = isV0NegID1; // Lambda case
669
670     // identify V0pos
671     trackIDtof = fPidHFV0pos->ApplyPidTOFRaw(v0Pos,4);
672     trackIDtpc = fPidHFV0pos->ApplyPidTPCRaw(v0Pos,4);
673     AliDebug(1,Form(" fPidHFV0pos->ApplyPidTOFRaw(v0Pos,4)=%d fPidHFV0pos->ApplyPidTPCRaw(v0POS,4)=%d",trackIDtof,trackIDtpc));
674     //isV0PosID1 = (fPidHFV0pos->ApplyPidTPCRaw(v0Pos,2)==2) && (fPidHFV0pos->ApplyPidTOFRaw(v0Pos,2)==2); // K0S case
675     //isV0PosID2 = isV0PosID1; // LambdaBar case
676     isV0PosID4 = (trackIDtof==4) && (trackIDtpc==4); // Lambda case
677
678     break;
679   case 1:
680
681     // identify bachelor
682     trackIDtof = fPidHF->ApplyPidTOFRaw(bachelor,4);
683     trackIDtpc = fPidHF->ApplyPidTPCRaw(bachelor,4);
684     AliDebug(1,Form(" fPidHF->ApplyPidTOFRaw(bachelor,4)=%d fPidHFV0->ApplyPidTPCRaw(bachelor,4)=%d",trackIDtof,trackIDtpc));
685     isBachelorID1 = ( trackIDtof==4 );
686     dummy1 = ( !(fPidHF->CheckTOFPIDStatus(bachelor)) && (trackIDtpc==4) &&
687                fPidHF->IsExcluded(bachelor,2,2.,"TPC") && fPidHF->IsExcluded(bachelor,3,2.,"TPC") ); // K0S case
688     isBachelorID1 = isBachelorID1 || dummy1;
689
690
691     // identify V0neg
692     trackIDtof = fPidHFV0neg->ApplyPidTOFRaw(v0Neg,4);
693     trackIDtpc = fPidHFV0neg->ApplyPidTPCRaw(v0Neg,4);
694     AliDebug(1,Form(" fPidHFV0neg->ApplyPidTOFRaw(v0Neg,4)=%d fPidHFV0neg->ApplyPidTPCRaw(v0Neg,4)=%d",trackIDtof,trackIDtpc));
695     isV0NegID2    = ( trackIDtof==4 );
696     dummy2 = ( !(fPidHFV0neg->CheckTOFPIDStatus(v0Neg)) && (trackIDtpc==4) &&
697                fPidHFV0neg->IsExcluded(v0Neg,2,2.,"TPC") && fPidHFV0neg->IsExcluded(v0Neg,3,2.,"TPC") ); // LambdaBar case
698     isV0NegID2 = isV0NegID2 || dummy2;
699
700
701     // identify V0pos
702     trackIDtof = fPidHFV0pos->ApplyPidTOFRaw(v0Pos,4);
703     trackIDtpc = fPidHFV0pos->ApplyPidTPCRaw(v0Pos,4);
704     AliDebug(1,Form(" fPidHFV0pos->ApplyPidTOFRaw(v0Pos,4)=%d fPidHFV0pos->ApplyPidTPCRaw(v0Pos,4)=%d",trackIDtof,trackIDtpc));
705     isV0PosID4    = ( trackIDtof==4 );
706     dummy4 = ( !(fPidHFV0pos->CheckTOFPIDStatus(v0Pos)) && (trackIDtpc==4) &&
707                fPidHFV0pos->IsExcluded(v0Pos,2,2.,"TPC") && fPidHFV0pos->IsExcluded(v0Pos,3,2.,"TPC") ); // Lambda case
708     isV0PosID4 = isV0PosID4 || dummy4;
709
710
711     break;
712   case 2:
713
714     // identify bachelor
715     nTOFsigmasPr = -999;
716     tofID = fPidHF->GetnSigmaTOF(bachelor,4,nTOFsigmasPr);
717     nTPCsigmasPr = -999;
718     tpcID = fPidHF->GetnSigmaTPC(bachelor,4,nTPCsigmasPr);
719     trackIDtofB = (tofID==1) && ( (bachelor->P()>=1.0 && bachelor->P()<2.5 && TMath::Abs(nTOFsigmasPr)<3) ||
720                                   (bachelor->P()>=2.5 && nTOFsigmasPr>-2 && nTOFsigmasPr<3) );
721     trackIDtpcB = (tpcID==1) && ( (bachelor->P()<1.0 && TMath::Abs(nTPCsigmasPr)<2) ||
722                                   (bachelor->P()>=1.0 && TMath::Abs(nTPCsigmasPr)<3) );
723     AliDebug(1,Form(" trackIDtofB=%d trackIDtpcB=%d",trackIDtofB,trackIDtpcB));
724     isBachelorID1 = (bachelor->P()<1 && trackIDtpcB) || (bachelor->P()>=1 && trackIDtpcB && trackIDtofB); // K0S case
725
726     // identify V0neg
727     nTOFsigmasPr = -999;
728     tofID = fPidHFV0neg->GetnSigmaTOF(v0Neg,4,nTOFsigmasPr);
729     nTPCsigmasPr = -999;
730     tpcID = fPidHFV0neg->GetnSigmaTPC(v0Neg,4,nTPCsigmasPr);
731     trackIDtofB = (tofID==1) && ( (v0Neg->P()>=1.0 && v0Neg->P()<2.5 && TMath::Abs(nTOFsigmasPr)<3) ||
732                                   (v0Neg->P()>=2.5 && nTOFsigmasPr>-2 && nTOFsigmasPr<3) );
733     trackIDtpcB = (tpcID==1) && ( (v0Neg->P()<1.0 && TMath::Abs(nTPCsigmasPr)<2) ||
734                                   (v0Neg->P()>=1.0 && TMath::Abs(nTPCsigmasPr)<3) );
735     AliDebug(1,Form(" trackIDtofB=%d trackIDtpcB=%d",trackIDtofB,trackIDtpcB));
736     isV0NegID2 = (v0Neg->P()<1 && trackIDtpcB) || (v0Neg->P()>=1 && trackIDtpcB && trackIDtofB); // LambdaBar case
737     
738     // identify V0pos
739     nTOFsigmasPr = -999;
740     tofID = fPidHFV0pos->GetnSigmaTOF(v0Pos,4,nTOFsigmasPr);
741     nTPCsigmasPr = -999;
742     tpcID = fPidHFV0pos->GetnSigmaTPC(v0Pos,4,nTPCsigmasPr);
743     trackIDtofB = (tofID==1) && ( (v0Pos->P()>=1.0 && v0Pos->P()<2.5 && TMath::Abs(nTOFsigmasPr)<3) ||
744                                   (v0Pos->P()>=2.5 && nTOFsigmasPr>-2 && nTOFsigmasPr<3) );
745     trackIDtpcB = (tpcID==1) && ( (v0Pos->P()<1.0 && TMath::Abs(nTPCsigmasPr)<2) ||
746                                   (v0Pos->P()>=1.0 && TMath::Abs(nTPCsigmasPr)<3) );
747     AliDebug(1,Form(" trackIDtofB=%d trackIDtpcB=%d",trackIDtofB,trackIDtpcB));
748     isV0PosID4 = (v0Pos->P()<1 && trackIDtpcB) || (v0Pos->P()>=1 && trackIDtpcB && trackIDtofB); // Lambda case
749
750     break;
751   case 3:
752
753     // identify bachelor
754     nTOFsigmasPr = -999;
755     tofID = fPidHF->GetnSigmaTOF(bachelor,4,nTOFsigmasPr);
756     nTPCsigmasPr = -999;
757     tpcID = fPidHF->GetnSigmaTPC(bachelor,4,nTPCsigmasPr);
758     trackIDtofB = (tofID==1) && ( (bachelor->P()>=1.0 && bachelor->P()<2.5 && TMath::Abs(nTOFsigmasPr)<3) ||
759                                   (bachelor->P()>=2.5 && nTOFsigmasPr>-2 && nTOFsigmasPr<3) );
760     trackIDtpcB = (tpcID==1) && ( (bachelor->P()<1.0 && TMath::Abs(nTPCsigmasPr)<2) ||
761                                   (bachelor->P()>=1.0 && bachelor->P()<3.0 && TMath::Abs(nTPCsigmasPr)<3) ||
762                                   (bachelor->P()>=3.0 && nTPCsigmasPr>-3 && nTPCsigmasPr<2) );
763     AliDebug(1,Form(" trackIDtofB=%d trackIDtpcB=%d",trackIDtofB,trackIDtpcB));
764     isBachelorID1 = (bachelor->P()<1 && trackIDtpcB) || (bachelor->P()>=1 && trackIDtpcB && trackIDtofB); // K0S case
765
766     // identify V0neg
767     nTOFsigmasPr = -999;
768     tofID = fPidHFV0neg->GetnSigmaTOF(v0Neg,4,nTOFsigmasPr);
769     nTPCsigmasPr = -999;
770     tpcID = fPidHFV0neg->GetnSigmaTPC(v0Neg,4,nTPCsigmasPr);
771     trackIDtofB = (tofID==1) && ( (v0Neg->P()>=1.0 && v0Neg->P()<2.5 && TMath::Abs(nTOFsigmasPr)<3) ||
772                                   (v0Neg->P()>=2.5 && nTOFsigmasPr>-2 && nTOFsigmasPr<3) );
773     trackIDtpcB = (tpcID==1) && ( (v0Neg->P()<1.0 && TMath::Abs(nTPCsigmasPr)<2) ||
774                                   (v0Neg->P()>=1.0 && v0Neg->P()<3.0 && TMath::Abs(nTPCsigmasPr)<3) ||
775                                   (v0Neg->P()>=3.0 && nTPCsigmasPr>-3 && nTPCsigmasPr<2) );
776     AliDebug(1,Form(" trackIDtofB=%d trackIDtpcB=%d",trackIDtofB,trackIDtpcB));
777     isV0NegID2 = (v0Neg->P()<1 && trackIDtpcB) || (v0Neg->P()>=1 && trackIDtpcB && trackIDtofB); // LambdaBar case
778
779     // identify V0pos
780     nTOFsigmasPr = -999;
781     tofID = fPidHFV0pos->GetnSigmaTOF(v0Pos,4,nTOFsigmasPr);
782     nTPCsigmasPr = -999;
783     tpcID = fPidHFV0pos->GetnSigmaTPC(v0Pos,4,nTPCsigmasPr);
784     trackIDtofB = (tofID==1) && ( (v0Pos->P()>=1.0 && v0Pos->P()<2.5 && TMath::Abs(nTOFsigmasPr)<3) ||
785                                   (v0Pos->P()>=2.5 && nTOFsigmasPr>-2 && nTOFsigmasPr<3) );
786     trackIDtpcB = (tpcID==1) && ( (v0Pos->P()<1.0 && TMath::Abs(nTPCsigmasPr)<2) ||
787                                   (v0Pos->P()>=1.0 && v0Pos->P()<3.0 && TMath::Abs(nTPCsigmasPr)<3) ||
788                                   (v0Pos->P()>=3.0 && nTPCsigmasPr>-3 && nTPCsigmasPr<2) );
789     AliDebug(1,Form(" trackIDtofB=%d trackIDtpcB=%d",trackIDtofB,trackIDtpcB));
790     isV0PosID4 = (v0Pos->P()<1 && trackIDtpcB) || (v0Pos->P()>=1 && trackIDtpcB && trackIDtofB); // Lambda case
791
792     break;
793
794   }
795
796 }
797 //----------------
798 Int_t AliRDHFCutsLctoV0::CombinePIDCuts(Int_t returnvalue, Int_t returnvaluePID) const {
799   // combine PID with topological cuts
800
801  Int_t returnvalueTot=returnvalue&returnvaluePID;
802
803  return returnvalueTot;
804 }
805
806 //----------------------------------
807 Int_t AliRDHFCutsLctoV0::IsSelectedSingleCut(TObject* obj, Int_t selectionLevel, Int_t cutIndex) {
808   //
809   // Apply selection on single cut
810   //
811
812   if (!fCutsRD) {
813     cout<<"Cut matrice not inizialized. Exit..."<<endl;
814     return 0;
815   }
816
817   AliAODRecoCascadeHF* d = (AliAODRecoCascadeHF*)obj;
818   if (!d) {
819     AliDebug(2,"AliAODRecoCascadeHF null");
820     return 0;
821   }
822
823   // Get the v0 and all daughter tracks
824   AliAODTrack *bachelorTrack = (AliAODTrack*)d->GetBachelor();
825   if (!bachelorTrack) {
826     AliDebug(2,"No bachelor object");
827     return 0;
828   }
829
830   // not used
831   //if ( fUseTrackSelectionWithFilterBits &&
832   //!(bachelorTrack->TestFilterMask(BIT(4))) ) return 0;
833
834   AliAODv0 *v0 = (AliAODv0*)d->Getv0();
835   if (!v0) {
836     AliDebug(2,"No v0 object");
837     return 0;
838   }
839
840   // Get the V0 daughter tracks
841   AliAODTrack *v0positiveTrack = (AliAODTrack*)d->Getv0PositiveTrack();
842   AliAODTrack *v0negativeTrack = (AliAODTrack*)d->Getv0NegativeTrack();
843   if (!v0positiveTrack || !v0negativeTrack ) {
844     AliDebug(2,"No V0 daughters' objects");
845     return 0;
846   }
847
848   // selection on daughter tracks
849   if (selectionLevel==AliRDHFCuts::kAll ||
850       selectionLevel==AliRDHFCuts::kTracks) {
851
852     if (fIsCandTrackSPDFirst && d->Pt()<fMaxPtCandTrackSPDFirst) {
853       if (!bachelorTrack->HasPointOnITSLayer(0)) return 0;
854     }
855     if (fTrackCuts && fV0daughtersCuts) {
856       AliAODVertex *vAOD = (AliAODVertex*)d->GetPrimaryVtx();
857       Double_t pos[3]; vAOD->GetXYZ(pos);
858       Double_t cov[6]; vAOD->GetCovarianceMatrix(cov);
859       const AliESDVertex vESD(pos,cov,100.,100);
860       if ( !(IsDaughterSelected(bachelorTrack,&vESD,fTrackCuts)) ||
861            !(IsDaughterSelected(v0negativeTrack,&vESD,fV0daughtersCuts)) ||
862            !(IsDaughterSelected(v0positiveTrack,&vESD,fV0daughtersCuts)) ) return 0;
863     }
864     //if (!AreDaughtersSelected(d)) return 0;
865   }
866
867   Bool_t okLck0sp=kFALSE, okLcLpi=kFALSE, okLcLBarpi=kFALSE;
868
869   // selection on candidate
870   if (selectionLevel==AliRDHFCuts::kAll ||
871       selectionLevel==AliRDHFCuts::kCandidate) {
872
873     Double_t pt = d->Pt();
874     Int_t ptbin = PtBin(pt);
875
876     Double_t mLcPDG  = TDatabasePDG::Instance()->GetParticle(4122)->Mass();
877     Double_t mk0sPDG = TDatabasePDG::Instance()->GetParticle(310)->Mass();
878     Double_t mLPDG   = TDatabasePDG::Instance()->GetParticle(3122)->Mass();
879
880     // K0S + p
881     Double_t mk0s    = v0->MassK0Short();
882     Double_t mLck0sp = d->InvMassLctoK0sP();
883
884     // Lambda + pi
885     Double_t mlambda  = v0->MassLambda();
886     Double_t malambda = v0->MassAntiLambda();
887     Double_t mLcLpi   = d->InvMassLctoLambdaPi();
888
889     switch (cutIndex) {
890     case 0:
891       // cut on Lc mass with K0S+p hypothesis
892       okLck0sp   = TMath::Abs(mLck0sp-mLcPDG)<=fCutsRD[GetGlobalIndex(0,ptbin)];
893       okLcLpi    = kFALSE;
894       okLcLBarpi = kFALSE;
895       break;
896     case 1:
897       // cut on Lc mass with Lambda+pi hypothesis
898       okLck0sp   = kFALSE;
899       okLcLpi    = TMath::Abs(mLcLpi-mLcPDG)<=fCutsRD[GetGlobalIndex(1,ptbin)];
900       okLcLBarpi = okLcLpi;
901       break;
902     case 2:
903       // cuts on the V0 mass: K0S case
904       okLck0sp   = TMath::Abs(mk0s-mk0sPDG)<=fCutsRD[GetGlobalIndex(2,ptbin)];
905       okLcLpi    = kFALSE;
906       okLcLBarpi = kFALSE;
907       break;
908     case 3:
909       // cuts on the V0 mass: Lambda/LambdaBar case
910       okLck0sp   = kFALSE;
911       okLcLpi    = TMath::Abs(mlambda-mLPDG)<=fCutsRD[GetGlobalIndex(3,ptbin)];
912       //okLcLpi    = okLcLpi && (bachelorTrack->Charge()==+1);
913       okLcLBarpi = TMath::Abs(malambda-mLPDG)<=fCutsRD[GetGlobalIndex(3,ptbin)];
914       //okLcLBarpi = okLcLBarpi && (bachelorTrack->Charge()==-1);
915       break;
916     case 4:
917       // cuts on the minimum pt of bachelor
918       okLck0sp   = TMath::Abs(bachelorTrack->Pt())>=fCutsRD[GetGlobalIndex(4,ptbin)];
919       okLcLpi    = okLck0sp;
920       okLcLBarpi = okLck0sp;
921       break;
922     case 5:
923       // cuts on the minimum pt of positive V0daughter
924       okLck0sp   = TMath::Abs(v0positiveTrack->Pt())>=fCutsRD[GetGlobalIndex(5,ptbin)];
925       okLcLpi    = okLck0sp;
926       okLcLBarpi = okLck0sp;
927       break;
928     case 6:
929       // cuts on the minimum pt of negative V0daughter
930       okLck0sp   = TMath::Abs(v0negativeTrack->Pt())>=fCutsRD[GetGlobalIndex(6,ptbin)];
931       okLcLpi    = okLck0sp;
932       okLcLBarpi = okLck0sp;
933       break;
934     case 7:
935       // cut on cascade dca
936       okLck0sp   = TMath::Abs(d->GetDCA())<=fCutsRD[GetGlobalIndex(7,ptbin)];
937       okLcLpi    = okLck0sp;
938       okLcLBarpi = okLck0sp;
939       break;
940     case 8:
941       // cut on V0 dca
942       okLck0sp   = TMath::Abs(v0->GetDCA())<=fCutsRD[GetGlobalIndex(8,ptbin)];
943       okLcLpi    = okLck0sp;
944       okLcLBarpi = okLck0sp;
945       break;
946     case 9:
947       // cut on V0 cosine of pointing angle wrt PV
948       okLck0sp   = d->CosV0PointingAngle()>=fCutsRD[GetGlobalIndex(9,ptbin)];
949       okLcLpi    = okLck0sp;
950       okLcLBarpi = okLck0sp;
951       break;
952     case 10:
953       // cut on bachelor transverse impact parameter wrt PV
954       okLck0sp   = TMath::Abs(d->Getd0Prong(0))<=fCutsRD[GetGlobalIndex(10,ptbin)];
955       okLcLpi    = okLck0sp;
956       okLcLBarpi = okLck0sp;
957       break;
958     case 11:
959       // cut on V0 transverse impact parameter wrt PV
960       okLck0sp   = TMath::Abs(d->Getd0Prong(1))<=fCutsRD[GetGlobalIndex(11,ptbin)];
961       okLcLpi    = okLck0sp;
962       okLcLBarpi = okLck0sp;
963       break;
964     case 12:
965       // cut on K0S invariant mass veto
966       okLcLpi    = TMath::Abs(mk0s-mk0sPDG)>=fCutsRD[GetGlobalIndex(12,ptbin)];
967       okLcLBarpi = TMath::Abs(mk0s-mk0sPDG)>=fCutsRD[GetGlobalIndex(12,ptbin)];
968       break;
969     case 13:
970       // cut on Lambda/LambdaBar invariant mass veto
971       okLck0sp   = (TMath::Abs(mlambda-mLPDG)>=fCutsRD[GetGlobalIndex(13,ptbin)] &&
972                     TMath::Abs(malambda-mLPDG)>=fCutsRD[GetGlobalIndex(13,ptbin)]);
973       break;
974     case 14:
975       // cut on gamma invariant mass veto
976       okLck0sp   = v0->InvMass2Prongs(0,1,11,11)>=fCutsRD[GetGlobalIndex(14,ptbin)];
977       okLcLpi    = okLck0sp;
978       okLcLBarpi = okLck0sp;
979       break;
980     case 15:
981       // cut on V0 pT min
982       okLck0sp   = v0->Pt()>=fCutsRD[GetGlobalIndex(15,ptbin)];
983       okLcLpi    = okLck0sp;
984       okLcLBarpi = okLck0sp;
985       break;
986     }
987   }
988
989   Int_t returnvalue = okLck0sp+2*okLcLBarpi+4*okLcLpi;
990   /*
991     retvalue case
992           1  Lc->K0S + p
993           2  Lc->LambdaBar + pi
994           3  Lc->K0S + p AND Lc->LambdaBar + pi
995           4  Lc->Lambda + pi
996           5  Lc->K0S + p AND Lc->Lambda + pi
997           6  Lc->LambdaBar + pi AND Lc->Lambda + pi
998           7  Lc->K0S + p AND Lc->LambdaBar + pi AND Lc->Lambda + pi
999   */
1000
1001
1002   /*
1003   Int_t returnvaluePID = 7;
1004
1005   // selection on PID
1006   if (selectionLevel==AliRDHFCuts::kAll ||
1007       selectionLevel==AliRDHFCuts::kCandidate ||
1008       selectionLevel==AliRDHFCuts::kPID )
1009     returnvaluePID = IsSelectedPID(d);
1010   */
1011
1012   Int_t returnvalueTot = 0;
1013   //if ( fUsePID )
1014   //returnvalueTot = CombinePIDCuts(returnvalue,returnvaluePID);
1015   //else
1016   returnvalueTot = returnvalue;
1017
1018   return returnvalueTot;
1019
1020 }
1021 //----------------------------------
1022 void AliRDHFCutsLctoV0::SetStandardCutsPP2010() {
1023
1024  SetName("LctoV0ProductionCuts");
1025  SetTitle("Production cuts for Lc->V0+bachelor analysis");
1026
1027   AliESDtrackCuts* esdTrackCuts=new AliESDtrackCuts();
1028   esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
1029   //default
1030   esdTrackCuts->SetRequireTPCRefit(kTRUE);
1031   esdTrackCuts->SetRequireITSRefit(kTRUE);
1032   esdTrackCuts->SetMinNClustersITS(0);//(4); // default is 5
1033   esdTrackCuts->SetMinNClustersTPC(70);
1034   //esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
1035   //                                       AliESDtrackCuts::kAny);
1036   // default is kBoth, otherwise kAny
1037   esdTrackCuts->SetMinDCAToVertexXY(0.);
1038   esdTrackCuts->SetPtRange(0.3,1.e10);
1039   //esdTrackCuts->SetEtaRange(-0.8,+0.8);
1040   esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
1041   AddTrackCuts(esdTrackCuts);
1042
1043
1044   AliESDtrackCuts* esdTrackCutsV0daughters=new AliESDtrackCuts();
1045   esdTrackCutsV0daughters->SetRequireSigmaToVertex(kFALSE);
1046   //default
1047   esdTrackCutsV0daughters->SetRequireTPCRefit(kTRUE);
1048   esdTrackCutsV0daughters->SetRequireITSRefit(kFALSE);//(kTRUE);
1049   esdTrackCutsV0daughters->SetMinNClustersITS(0);//(4); // default is 5
1050   esdTrackCutsV0daughters->SetMinNClustersTPC(70);
1051   //esdTrackCutsV0daughters->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
1052   //                                                  AliESDtrackCuts::kAny);
1053   // default is kBoth, otherwise kAny
1054   esdTrackCutsV0daughters->SetMinDCAToVertexXY(0.);
1055   esdTrackCutsV0daughters->SetPtRange(0.,1.e10);
1056   esdTrackCutsV0daughters->SetAcceptKinkDaughters(kFALSE);
1057   AddTrackCutsV0daughters(esdTrackCutsV0daughters);
1058
1059   const Int_t nptbins=1;
1060   Float_t* ptbins;
1061   ptbins=new Float_t[nptbins+1];
1062   ptbins[0]=0.;
1063   ptbins[1]=99999999.;
1064
1065   SetPtBins(nptbins+1,ptbins);
1066   SetPtBins(nptbins+1,ptbins);
1067
1068   const Int_t nvars=17;
1069
1070   Float_t** prodcutsval;
1071   prodcutsval=new Float_t*[nvars];
1072   for(Int_t ic=0;ic<nvars;ic++){prodcutsval[ic]=new Float_t[nptbins];}
1073   for(Int_t ipt2=0;ipt2<nptbins;ipt2++){
1074    prodcutsval[0][ipt2]=1.;    // inv. mass if K0S [GeV/c2]
1075    prodcutsval[1][ipt2]=1.;    // inv. mass if Lambda [GeV/c2]
1076    prodcutsval[2][ipt2]=0.05;  // inv. mass V0 if K0S [GeV/c2]
1077    prodcutsval[3][ipt2]=0.05;  // inv. mass V0 if Lambda [GeV/c2]
1078    prodcutsval[4][ipt2]=0.3;   // pT min bachelor track [GeV/c] // AOD by construction
1079    prodcutsval[5][ipt2]=0.;    // pT min V0-positive track [GeV/c]
1080    prodcutsval[6][ipt2]=0.;    // pT min V0-negative track [GeV/c]
1081    prodcutsval[7][ipt2]=1000.; // dca cascade cut [cm]
1082    prodcutsval[8][ipt2]=1.5;   // dca V0 cut [nSigma] // it's 1.5 x offline V0s
1083    prodcutsval[9][ipt2]=-1.;   // cosPA V0 cut // it's 0.90 x offline V0s at reconstruction level, 0.99 at filtering level
1084    prodcutsval[10][ipt2]=3.;   // d0 max bachelor wrt PV [cm]
1085    prodcutsval[11][ipt2]=1000.;// d0 max V0 wrt PV [cm]
1086    prodcutsval[12][ipt2]=0.;   // mass K0S veto [GeV/c2]
1087    prodcutsval[13][ipt2]=0.;   // mass Lambda/LambdaBar veto [GeV/c2]
1088    prodcutsval[14][ipt2]=0.;   // mass Gamma veto [GeV/c2]
1089    prodcutsval[15][ipt2]=0.;   // pT min V0 track [GeV/c]
1090    prodcutsval[16][ipt2]=0.;   // V0 type cut
1091   }
1092   SetCuts(nvars,nptbins,prodcutsval);
1093
1094   SetGlobalIndex(nvars,nptbins);
1095   SetPtBins(nptbins+1,ptbins);
1096
1097
1098   //pid settings
1099   //1. bachelor: default one
1100   AliAODPidHF* pidObjBachelor = new AliAODPidHF();
1101   Double_t sigmasBac[5]={3.,1.,1.,3.,3.}; // 0, 1(A), 2(A) -> TPC; 3 -> TOF; 4 -> ITS
1102   pidObjBachelor->SetSigma(sigmasBac);
1103   pidObjBachelor->SetAsym(kFALSE);
1104   pidObjBachelor->SetMatch(1);
1105   pidObjBachelor->SetTPC(kTRUE);
1106   pidObjBachelor->SetTOF(kTRUE);
1107   pidObjBachelor->SetTOFdecide(kFALSE);
1108   SetPidHF(pidObjBachelor);
1109
1110   //2. V0pos
1111   AliAODPidHF* pidObjV0pos = new AliAODPidHF();
1112   Double_t sigmasV0pos[5]={3.,1.,1.,3.,3.}; // 0, 1(A), 2(A) -> TPC; 3 -> TOF; 4 -> ITS
1113   pidObjV0pos->SetSigma(sigmasV0pos);
1114   pidObjV0pos->SetAsym(kFALSE);
1115   pidObjV0pos->SetMatch(1);
1116   pidObjV0pos->SetTPC(kTRUE);
1117   pidObjV0pos->SetTOF(kTRUE);
1118   pidObjV0pos->SetTOFdecide(kFALSE);
1119   SetPidV0pos(pidObjV0pos);
1120
1121   //2. V0neg
1122   AliAODPidHF* pidObjV0neg = new AliAODPidHF();
1123   Double_t sigmasV0neg[5]={3.,1.,1.,3.,3.}; // 0, 1(A), 2(A) -> TPC; 3 -> TOF; 4 -> ITS
1124   pidObjV0neg->SetSigma(sigmasV0neg);
1125   pidObjV0neg->SetAsym(kFALSE);
1126   pidObjV0neg->SetMatch(1);
1127   pidObjV0neg->SetTPC(kTRUE);
1128   pidObjV0neg->SetTOF(kTRUE);
1129   pidObjV0neg->SetTOFdecide(kFALSE);
1130   SetPidV0neg(pidObjV0neg);
1131
1132   SetUsePID(kFALSE);//(kTRUE);
1133
1134   PrintAll();
1135
1136  for(Int_t iiv=0;iiv<nvars;iiv++){
1137   delete [] prodcutsval[iiv];
1138  }
1139  delete [] prodcutsval;
1140  prodcutsval=NULL;
1141  delete [] ptbins;
1142  ptbins=NULL;
1143
1144
1145  delete pidObjBachelor;
1146  pidObjBachelor=NULL;
1147
1148  delete pidObjV0pos;
1149  pidObjV0pos=NULL;
1150
1151  delete pidObjV0neg;
1152  pidObjV0neg=NULL;
1153
1154  return;
1155 }
1156 //------------------
1157 void AliRDHFCutsLctoV0::SetStandardCutsPbPb2010() {
1158
1159  SetName("LctoV0ProductionCuts");
1160  SetTitle("Production cuts for Lc->V0+bachelor analysis");
1161
1162  SetStandardCutsPP2010();
1163
1164  return;
1165 }
1166 //------------------
1167 void AliRDHFCutsLctoV0::SetStandardCutsPbPb2011() {
1168
1169   // Default 2010 PbPb cut object
1170   SetStandardCutsPbPb2010();
1171
1172   //
1173   // Enable all 2011 PbPb run triggers
1174   //
1175   SetTriggerClass("");
1176   ResetMaskAndEnableMBTrigger();
1177   EnableCentralTrigger();
1178   EnableSemiCentralTrigger();
1179
1180 }
1181 //-----------------------
1182 Int_t AliRDHFCutsLctoV0::GetV0Type(){
1183
1184   const Int_t nvars = this->GetNVars() ;
1185   //Float_t *vArray =GetCuts();
1186   //fV0Type = vArray[nvars-1];
1187   fV0Type = (this->GetCuts())[nvars-1];
1188   //this->GetCuts(vArray);
1189   TString *sVarNames=GetVarNames();
1190
1191   if(sVarNames[nvars-1].Contains("V0 type")) return (Int_t)fV0Type;
1192   else {AliInfo("AliRDHFCutsLctoV0 Last variable is not the V0 type!!!"); return -999;}
1193 }
1194
1195 //---------------------------------------------------------------------------
1196 void AliRDHFCutsLctoV0::PrintAll() const {
1197   //
1198   // print all cuts values
1199   // 
1200
1201   printf("Minimum vtx type %d\n",fMinVtxType);
1202   printf("Minimum vtx contr %d\n",fMinVtxContr);
1203   printf("Max vtx red chi2 %f\n",fMaxVtxRedChi2);
1204   printf("Min SPD mult %d\n",fMinSPDMultiplicity);
1205   printf("Use PID %d (PID selection flag = %d) OldPid=%d\n",(Int_t)fUsePID,(Int_t)fPidSelectionFlag,fPidHF ? fPidHF->GetOldPid() : -1);
1206   printf("Remove daughters from vtx %d\n",(Int_t)fRemoveDaughtersFromPrimary);
1207   printf("Recompute primary vertex %d\n",(Int_t)fRecomputePrimVertex);
1208   printf("Physics selection: %s\n",fUsePhysicsSelection ? "Yes" : "No");
1209   printf("Pileup rejection: %s\n",(fOptPileup > 0) ? "Yes" : "No");
1210   if(fOptPileup==1) printf(" -- Reject pileup event");
1211   if(fOptPileup==2) printf(" -- Reject tracks from pileup vtx");
1212   if(fUseCentrality>0) {
1213     TString estimator="";
1214     if(fUseCentrality==1) estimator = "V0";
1215     if(fUseCentrality==2) estimator = "Tracks";
1216     if(fUseCentrality==3) estimator = "Tracklets";
1217     if(fUseCentrality==4) estimator = "SPD clusters outer"; 
1218     printf("Centrality class considered: %.1f-%.1f, estimated with %s",fMinCentrality,fMaxCentrality,estimator.Data());
1219   }
1220   if(fIsCandTrackSPDFirst) printf("Check for candidates with pt < %2.2f, that daughters fullfill kFirst criteria\n",fMaxPtCandTrackSPDFirst);
1221
1222   if(fVarNames){
1223     cout<<"Array of variables"<<endl;
1224     for(Int_t iv=0;iv<fnVars;iv++){
1225       cout<<fVarNames[iv]<<"\t";
1226     }
1227     cout<<endl;
1228   }
1229   if(fVarsForOpt){
1230     cout<<"Array of optimization"<<endl;
1231     for(Int_t iv=0;iv<fnVars;iv++){
1232       cout<<fVarsForOpt[iv]<<"\t";
1233     }
1234     cout<<endl;
1235   }
1236   if(fIsUpperCut){
1237     cout<<"Array of upper/lower cut"<<endl;
1238    for(Int_t iv=0;iv<fnVars;iv++){
1239      cout<<fIsUpperCut[iv]<<"\t";
1240    }
1241    cout<<endl;
1242   }
1243   if(fPtBinLimits){
1244     cout<<"Array of ptbin limits"<<endl;
1245     for(Int_t ib=0;ib<fnPtBinLimits;ib++){
1246       cout<<fPtBinLimits[ib]<<"\t";
1247     }
1248     cout<<endl;
1249   }
1250   if(fCutsRD){
1251     cout<<"Matrix of cuts"<<endl;
1252    for(Int_t iv=0;iv<fnVars;iv++){
1253      for(Int_t ib=0;ib<fnPtBins;ib++){
1254        cout<<"fCutsRD["<<iv<<"]["<<ib<<"] = "<<fCutsRD[GetGlobalIndex(iv,ib)]<<"\t";
1255      } 
1256      cout<<endl;
1257    }
1258    cout<<endl;
1259   }
1260   return;
1261 }
1262
1263 //-------------------------
1264 Bool_t AliRDHFCutsLctoV0::IsInFiducialAcceptance(Double_t pt, Double_t y) const
1265 {
1266   //
1267   //
1268   // Checking if Lc is in fiducial acceptance region
1269   //
1270   //
1271
1272   if(fMaxRapidityCand>-998.){
1273     if(TMath::Abs(y) > fMaxRapidityCand) return kFALSE;
1274     else return kTRUE;
1275   }
1276
1277   if(pt > 5.) {
1278     // applying cut for pt > 5 GeV
1279     AliDebug(2,Form("pt of Lambda_c = %f (> 5), cutting at |y| < 0.8",pt));
1280     if (TMath::Abs(y) > 0.8) return kFALSE;
1281
1282   } else {
1283     // appliying smooth cut for pt < 5 GeV
1284     Double_t maxFiducialY = -0.2/15*pt*pt+1.9/15*pt+0.5;
1285     Double_t minFiducialY = 0.2/15*pt*pt-1.9/15*pt-0.5;
1286     AliDebug(2,Form("pt of Lambda_c = %f (< 5), cutting  according to the fiducial zone [%f, %f]\n",pt,minFiducialY,maxFiducialY));
1287     if (y < minFiducialY || y > maxFiducialY) return kFALSE;
1288   }
1289   //
1290   return kTRUE;
1291 }