26 #include <Riostream.h>
28 #include <TDatabasePDG.h>
31 #include "AliAnalysisManager.h"
32 #include "AliInputEventHandler.h"
33 #include "AliPIDResponse.h"
36 #include "AliAODTrack.h"
37 #include "AliESDtrack.h"
38 #include "AliESDVertex.h"
39 #include "AliAODVertex.h"
60 fMinCombinedProbability(0)
68 TString varNames[nvars]={
"Lc inv. mass if K0S [GeV/c2]",
69 "Lc inv. mass if Lambda [GeV/c2]",
70 "K0S inv. mass [GeV/c2]",
71 "Lambda/LambdaBar inv. mass[GeV/c2]",
72 "pT min bachelor track [GeV/c]",
73 "pT min V0-positive track [GeV/c]",
74 "pT min V0-negative track [GeV/c]",
75 "dca cascade (prong-to-prong) cut [cm]",
76 "dca V0 (prong-to-prong) cut [number of sigmas]",
77 "V0 cosPA min wrt PV",
78 "d0 max bachelor wrt PV [cm]",
79 "d0 max V0 wrt PV [cm]",
80 "mass K0S veto [GeV/c2]",
81 "mass Lambda/LambdaBar veto [GeV/c2]",
82 "mass Gamma veto [GeV/c2]",
83 "pT min V0 track [GeV/c]",
87 Bool_t isUpperCut[nvars]={kTRUE,
106 Bool_t forOpt[nvars]={kFALSE,
126 Float_t limits[2]={0,999999999.};
147 fPidSelectionFlag(source.fPidSelectionFlag),
149 fV0Type(source.fV0Type),
150 fHighPtCut(source.fHighPtCut),
151 fLowPtCut(source.fLowPtCut),
152 fExcludedCut(source.fExcludedCut),
153 fMinCombinedProbability(0)
172 if (
this != &source) {
217 if (pdgdaughters[0]==-9999)
return;
220 printf(
"AliRDHFCutsLctoV0::GetCutVarsForOpt: wrong number of variables\n");
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();
231 AliAODTrack *bachelorTrack = (AliAODTrack*)dd->
GetBachelor();
232 AliAODv0 *v0 = (AliAODv0*)dd->
Getv0();
251 vars[iter]=TMath::Abs(v0->MassK0Short()-mk0sPDG);
257 if (bachelorTrack->Charge()==1) {
259 vars[iter]=TMath::Abs(v0->MassLambda()-mLPDG);
260 }
else if (bachelorTrack->Charge()==-1) {
262 vars[iter]=TMath::Abs(v0->MassAntiLambda()-mLPDG);
270 vars[iter]=bachelorTrack->Pt();
276 vars[iter]=v0positiveTrack->Pt();
282 vars[iter]=v0negativeTrack->Pt();
288 vars[iter]=dd->GetDCA();
294 vars[iter]=v0->GetDCA();
306 vars[iter]=dd->Getd0Prong(0);
312 vars[iter]=dd->Getd0Prong(1);
318 vars[iter]=TMath::Abs(v0->MassK0Short()-mk0sPDG);
324 if (bachelorTrack->Charge()==1) {
326 vars[iter]=TMath::Abs(v0->MassLambda()-mLPDG);
327 }
else if (bachelorTrack->Charge()==-1) {
329 vars[iter]=TMath::Abs(v0->MassAntiLambda()-mLPDG);
337 vars[iter]= v0->InvMass2Prongs(0,1,11,11);
344 vars[iter]= v0->Pt();
357 AliFatal(
"Cut matrice not inizialized. Exit...");
363 AliDebug(2,
"AliAODRecoCascadeHF null");
371 if (!d->GetSecondaryVtx()) {
372 AliDebug(2,
"No secondary vertex for cascade");
376 if (d->GetNDaughters()!=2) {
377 AliDebug(2,Form(
"No 2 daughters for current cascade (nDaughters=%d)",d->GetNDaughters()));
381 AliAODv0 * v0 =
dynamic_cast<AliAODv0*
>(d->
Getv0());
386 AliAODTrack * bachelorTrack =
dynamic_cast<AliAODTrack*
>(d->
GetBachelor());
387 if (!v0 || !bachelorTrack) {
388 AliDebug(2,
"No V0 or no bachelor for current cascade");
392 if (bachelorTrack->GetID()<0) {
393 AliDebug(2,Form(
"Bachelor has negative ID %d",bachelorTrack->GetID()));
397 if (!v0->GetSecondaryVtx()) {
398 AliDebug(2,
"No secondary vertex for V0 by cascade");
402 if (v0->GetNDaughters()!=2) {
403 AliDebug(2,Form(
"No 2 daughters for V0 of current cascade (onTheFly=%d, nDaughters=%d)",v0->GetOnFlyStatus(),v0->GetNDaughters()));
411 if (!v0positiveTrack || !v0negativeTrack ) {
412 AliDebug(2,
"No V0 daughters' objects");
416 if (v0positiveTrack->GetID()<0 || v0negativeTrack->GetID()<0) {
417 AliDebug(2,Form(
"At least one of V0 daughters has negative ID %d %d",v0positiveTrack->GetID(),v0negativeTrack->GetID()));
423 AliDebug(2,
"Check on the bachelor FilterBit: no BIT(4). Candidate rejected.");
427 Int_t returnvalueTrack = 7;
437 Bool_t okLck0sp=kTRUE, okLcLpi=kTRUE, okLcLBarpi=kTRUE;
446 Double_t mLcPDG = TDatabasePDG::Instance()->GetParticle(4122)->Mass();
447 Double_t mk0sPDG = TDatabasePDG::Instance()->GetParticle(310)->Mass();
448 Double_t mLPDG = TDatabasePDG::Instance()->GetParticle(3122)->Mass();
455 Double_t mlambda = v0->MassLambda();
456 Double_t malambda = v0->MassAntiLambda();
459 Bool_t okK0spipi=kTRUE, okLppi=kTRUE, okLBarpip=kTRUE;
460 Bool_t isNotK0S = kTRUE, isNotLambda = kTRUE, isNotLambdaBar = kTRUE, isNotGamma = kTRUE;
465 AliDebug(4,Form(
" cascade mass is %2.2e and does not correspond to Lambda_c into K0S+p cut",mLck0sp));
471 AliDebug(4,Form(
" V0 mass is %2.2e and does not correspond to K0S cut",mk0s));
478 AliDebug(4,Form(
" cascade mass is %2.2e and does not correspond to Lambda_c into Lambda+pi cut",mLcLpi));
485 AliDebug(4,Form(
" V0 mass is %2.2e and does not correspond to LambdaBar cut",mlambda));
491 AliDebug(4,Form(
" V0 mass is %2.2e and does not correspond to LambdaBar cut",malambda));
496 AliDebug(4,Form(
" veto on K0S invariant mass doesn't pass the cut"));
503 AliDebug(4,Form(
" veto on Lambda invariant mass doesn't pass the cut"));
508 AliDebug(4,Form(
" veto on LambdaBar invariant mass doesn't pass the cut"));
509 isNotLambdaBar=kFALSE;
515 AliDebug(4,Form(
" veto on gamma invariant mass doesn't pass the cut"));
520 okLck0sp = okLck0sp && okK0spipi && isNotLambda && isNotLambdaBar && isNotGamma;
521 okLcLpi = okLcLpi && okLppi && isNotK0S && isNotLambdaBar && isNotGamma;
522 okLcLBarpi = okLcLBarpi && okLBarpip && isNotK0S && isNotLambda && isNotGamma;
524 if (!okLck0sp && !okLcLpi && !okLcLBarpi)
return 0;
528 AliDebug(4,Form(
" bachelor track Pt=%2.2e > %2.2e",bachelorTrack->Pt(),
fCutsRD[
GetGlobalIndex(4,ptbin)]));
532 AliDebug(4,Form(
" V0-positive track Pt=%2.2e > %2.2e",v0positiveTrack->Pt(),
fCutsRD[
GetGlobalIndex(5,ptbin)]));
536 AliDebug(4,Form(
" V0-negative track Pt=%2.2e > %2.2e",v0negativeTrack->Pt(),
fCutsRD[
GetGlobalIndex(6,ptbin)]));
542 AliDebug(4,Form(
" cascade tracks DCA don't pass the cut"));
548 AliDebug(4,Form(
" V0 DCA don't pass the cut"));
554 AliDebug(4,Form(
" V0 cosine of pointing angle doesn't pass the cut"));
560 AliDebug(4,Form(
" bachelor transverse impact parameter doesn't pass the cut"));
566 AliDebug(4,Form(
" V0 transverse impact parameter doesn't pass the cut"));
578 Int_t returnvalue = okLck0sp+2*okLcLBarpi+4*okLcLpi;
590 Int_t returnvaluePID = 7;
600 Int_t returnvalueTot = 0;
602 returnvalueTot =
CombineCuts(returnvalueTrack,returnvalue,returnvaluePID);
604 returnvalueTot =
CombineCuts(returnvalueTrack,returnvalue,7);
606 return returnvalueTot;
616 AliFatal(
"Cut matrix not inizialized. Exit...");
622 AliDebug(2,
"AliAODRecoCascadeHF null");
638 Double_t mLcPDG = TDatabasePDG::Instance()->GetParticle(4122)->Mass();
639 Double_t mk0sPDG = TDatabasePDG::Instance()->GetParticle(310)->Mass();
640 Double_t mLPDG = TDatabasePDG::Instance()->GetParticle(3122)->Mass();
647 Double_t mlambda = v0->MassLambda();
648 Double_t malambda = v0->MassAntiLambda();
651 Bool_t okLck0sp=kTRUE, okLcLpi=kTRUE, okLcLBarpi=kTRUE;
652 Bool_t okK0spipi=kTRUE, okLppi=kTRUE, okLBarpip=kTRUE;
653 Bool_t isNotK0S = kTRUE, isNotLambda = kTRUE, isNotLambdaBar = kTRUE, isNotGamma = kTRUE;
673 if (TMath::Abs(v0->MassAntiLambda()-mLPDG) <
fCutsRD[
GetGlobalIndex(13,ptbin)]) isNotLambdaBar=kFALSE;
678 okLck0sp = okLck0sp && okK0spipi && isNotLambda && isNotLambdaBar && isNotGamma;
679 okLcLpi = okLcLpi && okLppi && isNotK0S && isNotLambdaBar && isNotGamma;
680 okLcLBarpi = okLcLBarpi && okLBarpip && isNotK0S && isNotLambda && isNotGamma;
682 if (!okLck0sp && !okLcLpi && !okLcLBarpi)
return 0;
698 AliDebug(2,
"PID selection inactive. Candidate accepted.");
704 AliAODv0 * v0 =
dynamic_cast<AliAODv0*
>(objD->
Getv0());
708 AliAODTrack *bachelor = (AliAODTrack*)objD->
GetBachelor();
712 if (!bachelor || !v0Pos || !v0Neg)
return 0;
715 Bool_t okLcLambdaBarPi = kTRUE;
716 Bool_t okLcLambdaPi = kTRUE;
720 CheckPID(candPtBin,bachelor,v0Neg,v0Pos,okLcK0Sp,okLcLambdaBarPi,okLcLambdaPi);
722 Int_t returnvalue = okLcK0Sp+2*okLcLambdaBarPi+4*okLcLambdaPi;
728 AliAODTrack * , AliAODTrack * ,
732 Int_t idxIDbyTOF = -1;
733 Int_t idxIDbyTPC = -1;
752 isBachelorID1 = (idxIDbyTOF==4) && (idxIDbyTPC==4);
756 isBachelorID2 = (idxIDbyTOF==2) && (idxIDbyTPC==2);
758 isBachelorID4 = isBachelorID2;
769 isBachelorID1 = ( (idxIDbyTOF==4) || dummy );
775 isBachelorID2 = ( (idxIDbyTOF==2) || dummy );
777 isBachelorID4 = isBachelorID2;
788 trackIDByTOF = ( (tofID==1) && ( (bachelor->P()>=
fLowPtCut && bachelor->P()<
fHighPtCut && TMath::Abs(nTOFsigmas)<3) ||
789 (bachelor->P()>=
fHighPtCut && nTOFsigmas>-2 && nTOFsigmas<3) ) );
790 trackIDByTPC = ( (tpcID==1) && ( (bachelor->P()<
fLowPtCut && TMath::Abs(nTPCsigmas)<2) ||
791 (bachelor->P()>=
fLowPtCut && TMath::Abs(nTPCsigmas)<3) ) );
792 isBachelorID1 = (bachelor->P()<
fLowPtCut && trackIDByTPC) || (bachelor->P()>=
fLowPtCut && trackIDByTPC && trackIDByTOF);
798 trackIDByTOF = ( (tofID==1) && ( (bachelor->P()>=
fLowPtCut && bachelor->P()<
fHighPtCut && TMath::Abs(nTOFsigmas)<3) ||
799 (bachelor->P()>=
fHighPtCut && nTOFsigmas>-2 && nTOFsigmas<3) ) );
800 trackIDByTPC = ( (tpcID==1) && ( (bachelor->P()<
fLowPtCut && TMath::Abs(nTPCsigmas)<2) ||
801 (bachelor->P()>=
fLowPtCut && TMath::Abs(nTPCsigmas)<3) ) );
802 isBachelorID2 = (bachelor->P()<
fLowPtCut && trackIDByTPC) || (bachelor->P()>=
fLowPtCut && trackIDByTPC && trackIDByTOF);
804 isBachelorID4 = isBachelorID2;
815 trackIDByTOF = ( (tofID==1) && ( (bachelor->P()>=
fLowPtCut && bachelor->P()<
fHighPtCut && TMath::Abs(nTOFsigmas)<3) ||
816 (bachelor->P()>=
fHighPtCut && nTOFsigmas>-2 && nTOFsigmas<3) ) );
817 trackIDByTPC = ( (tpcID==1) && ( (bachelor->P()<
fLowPtCut && TMath::Abs(nTPCsigmas)<2) ||
819 (bachelor->P()>=
fHighPtCut && nTPCsigmas>-3 && nTPCsigmas<2) ) );
820 isBachelorID1 = (bachelor->P()<
fLowPtCut && trackIDByTPC) || (bachelor->P()>=
fLowPtCut && trackIDByTPC && trackIDByTOF);
826 trackIDByTOF = ( (tofID==1) && ( (bachelor->P()>=
fLowPtCut && bachelor->P()<
fHighPtCut && TMath::Abs(nTOFsigmas)<3) ||
827 (bachelor->P()>=
fHighPtCut && nTOFsigmas>-2 && nTOFsigmas<3) ) );
828 trackIDByTPC = ( (tpcID==1) && ( (bachelor->P()<
fLowPtCut && TMath::Abs(nTPCsigmas)<2) ||
830 (bachelor->P()>=
fHighPtCut && nTPCsigmas>-3 && nTPCsigmas<2) ) );
831 isBachelorID2 = (bachelor->P()<
fLowPtCut && trackIDByTPC) || (bachelor->P()>=
fLowPtCut && trackIDByTPC && trackIDByTOF);
833 isBachelorID4 = isBachelorID2;
844 trackIDByTOF = ( (tofID==1) && ( (bachelor->P()>=
fLowPtCut && bachelor->P()<
fHighPtCut && TMath::Abs(nTOFsigmas)<3) ||
845 (bachelor->P()>=
fHighPtCut && nTOFsigmas>-2 && nTOFsigmas<3) ) );
846 trackIDByTPC = ( (tpcID==1) && (TMath::Abs(nTPCsigmas)<2) );
847 isBachelorID1 = ( (bachelor->P()<
fLowPtCut && trackIDByTPC) || (bachelor->P()>=
fLowPtCut && trackIDByTOF) );
853 trackIDByTOF = ( (tofID==1) && ( (bachelor->P()>=
fLowPtCut && bachelor->P()<
fHighPtCut && TMath::Abs(nTOFsigmas)<3) ||
854 (bachelor->P()>=
fHighPtCut && nTOFsigmas>-2 && nTOFsigmas<3) ) );
855 trackIDByTPC = ( (tpcID==1) && (TMath::Abs(nTPCsigmas)<2) );
856 isBachelorID2 = ( (bachelor->P()<
fLowPtCut && trackIDByTPC) || (bachelor->P()>=
fLowPtCut && trackIDByTOF) );
858 isBachelorID4 = isBachelorID2;
869 trackIDByTOF = ( (tofID==1) && ( (bachelor->P()>=
fLowPtCut && bachelor->P()<
fHighPtCut && TMath::Abs(nTOFsigmas)<3) ||
870 (bachelor->P()>=
fHighPtCut && nTOFsigmas>-2 && nTOFsigmas<3) ) );
871 trackIDByTPC = ( (tpcID==1) && ( (bachelor->P()<
fLowPtCut && TMath::Abs(nTPCsigmas)<2) || (bachelor->P()>=
fHighPtCut && tofID!=1 && TMath::Abs(nTPCsigmas)<3) ) );
872 isBachelorID1 = (bachelor->P()<
fLowPtCut && trackIDByTPC) || (bachelor->P()>=
fLowPtCut && bachelor->P()<
fHighPtCut && trackIDByTOF) || (bachelor->P()>=
fHighPtCut && (trackIDByTOF || trackIDByTPC) );
878 trackIDByTOF = ( (tofID==1) && ( (bachelor->P()>=
fLowPtCut && bachelor->P()<
fHighPtCut && TMath::Abs(nTOFsigmas)<3) ||
879 (bachelor->P()>=
fHighPtCut && nTOFsigmas>-2 && nTOFsigmas<3) ) );
880 trackIDByTPC = ( (tpcID==1) && ( (bachelor->P()<
fLowPtCut && TMath::Abs(nTPCsigmas)<2) || (bachelor->P()>=
fHighPtCut && tofID!=1 && TMath::Abs(nTPCsigmas)<3) ) );
881 isBachelorID2 = (bachelor->P()<
fLowPtCut && trackIDByTPC) || (bachelor->P()>=
fLowPtCut && bachelor->P()<
fHighPtCut && trackIDByTOF) || (bachelor->P()>=
fHighPtCut && (trackIDByTOF || trackIDByTPC) );
883 isBachelorID4 = isBachelorID2;
894 trackIDByTOF = ( (tofID==1) && ( (bachelor->P()>=
fLowPtCut && bachelor->P()<
fHighPtCut && TMath::Abs(nTOFsigmas)<3) ||
895 (bachelor->P()>=
fHighPtCut && nTOFsigmas>-2 && nTOFsigmas<3) ) );
896 trackIDByTPC = ( (tpcID==1) && ( (bachelor->P()<
fLowPtCut && TMath::Abs(nTPCsigmas)<2) || (bachelor->P()>=
fHighPtCut && tofID!=1 && nTPCsigmas>-3 && nTPCsigmas<2) ) );
897 isBachelorID1 = (bachelor->P()<
fLowPtCut && trackIDByTPC) || (bachelor->P()>=
fLowPtCut && bachelor->P()<
fHighPtCut && trackIDByTOF) || (bachelor->P()>=
fHighPtCut && (trackIDByTOF || trackIDByTPC) );
903 trackIDByTOF = ( (tofID==1) && ( (bachelor->P()>=
fLowPtCut && bachelor->P()<
fHighPtCut && TMath::Abs(nTOFsigmas)<3) ||
904 (bachelor->P()>=
fHighPtCut && nTOFsigmas>-2 && nTOFsigmas<3) ) );
905 trackIDByTPC = ( (tpcID==1) && ( (bachelor->P()<
fLowPtCut && TMath::Abs(nTPCsigmas)<2) || (bachelor->P()>=
fHighPtCut && tofID!=1 && nTPCsigmas>-3 && nTPCsigmas<2) ) );
906 isBachelorID2 = (bachelor->P()<
fLowPtCut && trackIDByTPC) || (bachelor->P()>=
fLowPtCut && bachelor->P()<
fHighPtCut && trackIDByTOF) || (bachelor->P()>=
fHighPtCut && (trackIDByTOF || trackIDByTPC) );
908 isBachelorID4 = isBachelorID2;
919 trackIDByTOF = ( (tofID==1) && ( (bachelor->P()>=
fLowPtCut && bachelor->P()<
fHighPtCut && TMath::Abs(nTOFsigmas)<3) ||
920 (bachelor->P()>=
fHighPtCut && nTOFsigmas>-2 && nTOFsigmas<3) ) );
921 trackIDByTPC = ( (tpcID==1) && ( (bachelor->P()<
fLowPtCut && TMath::Abs(nTPCsigmas)<2) || (bachelor->P()>=
fLowPtCut && tofID!=1 && TMath::Abs(nTPCsigmas)<3) ) );
922 isBachelorID1 = (bachelor->P()<
fLowPtCut && trackIDByTPC) || (bachelor->P()>=
fLowPtCut && (trackIDByTOF || trackIDByTPC) );
928 trackIDByTOF = ( (tofID==1) && ( (bachelor->P()>=
fLowPtCut && bachelor->P()<
fHighPtCut && TMath::Abs(nTOFsigmas)<3) ||
929 (bachelor->P()>=
fHighPtCut && nTOFsigmas>-2 && nTOFsigmas<3) ) );
930 trackIDByTPC = ( (tpcID==1) && ( (bachelor->P()<
fLowPtCut && TMath::Abs(nTPCsigmas)<2) || (bachelor->P()>=
fHighPtCut && tofID!=1 && TMath::Abs(nTPCsigmas)<3) ) );
931 isBachelorID2 = (bachelor->P()<
fLowPtCut && trackIDByTPC) || (bachelor->P()>=
fLowPtCut && (trackIDByTOF || trackIDByTPC) );
933 isBachelorID4 = isBachelorID2;
944 trackIDByTOF = ( (tofID==1) && ( (bachelor->P()>=
fLowPtCut && bachelor->P()<
fHighPtCut && TMath::Abs(nTOFsigmas)<3) ||
945 (bachelor->P()>=
fHighPtCut && nTOFsigmas>-2 && nTOFsigmas<3) ) );
946 trackIDByTPC = ( (tpcID==1) && ( (bachelor->P()<
fLowPtCut && TMath::Abs(nTPCsigmas)<2) || (bachelor->P()>=
fLowPtCut && tofID!=1 && nTPCsigmas>-3 && nTPCsigmas<2) ) );
947 isBachelorID1 = (bachelor->P()<
fLowPtCut && trackIDByTPC) || (bachelor->P()>=
fLowPtCut && (trackIDByTOF || trackIDByTPC) );
953 trackIDByTOF = ( (tofID==1) && ( (bachelor->P()>=
fLowPtCut && bachelor->P()<
fHighPtCut && TMath::Abs(nTOFsigmas)<3) ||
954 (bachelor->P()>=
fHighPtCut && nTOFsigmas>-2 && nTOFsigmas<3) ) );
955 trackIDByTPC = ( (tpcID==1) && ( (bachelor->P()<
fLowPtCut && TMath::Abs(nTPCsigmas)<2) || (bachelor->P()>=
fHighPtCut && tofID!=1 && nTPCsigmas>-3 && nTPCsigmas<2) ) );
956 isBachelorID2 = (bachelor->P()<
fLowPtCut && trackIDByTPC) || (bachelor->P()>=
fLowPtCut && (trackIDByTOF || trackIDByTPC) );
958 isBachelorID4 = isBachelorID2;
967 Double_t probTPCTOF[AliPID::kSPECIES]={-1.};
973 probPion = probTPCTOF[AliPID::kPion];
980 probPion = probTPCTOF[AliPID::kPion];
989 isBachelorID4 = isBachelorID2;
1002 Int_t returnvalueTot=returnvalueTrack&returnvalue;
1003 returnvalueTot=returnvalueTot&returnvaluePID;
1005 return returnvalueTot;
1015 AliDebug(2,
"Cut matrice not inizialized. Exit...");
1021 AliDebug(2,
"AliAODRecoCascadeHF null");
1025 if (!d->GetSecondaryVtx()) {
1026 AliDebug(2,
"No secondary vertex for cascade");
1030 if (d->GetNDaughters()!=2) {
1031 AliDebug(2,Form(
"No 2 daughters for current cascade (nDaughters=%d)",d->GetNDaughters()));
1035 AliAODv0 * v0 =
dynamic_cast<AliAODv0*
>(d->
Getv0());
1039 AliAODTrack * bachelorTrack =
dynamic_cast<AliAODTrack*
>(d->
GetBachelor());
1040 if (!v0 || !bachelorTrack) {
1041 AliDebug(2,
"No V0 or no bachelor for current cascade");
1045 if (bachelorTrack->GetID()<0) {
1046 AliDebug(2,Form(
"Bachelor has negative ID %d",bachelorTrack->GetID()));
1050 if (!v0->GetSecondaryVtx()) {
1051 AliDebug(2,
"No secondary vertex for V0 by cascade");
1055 if (v0->GetNDaughters()!=2) {
1056 AliDebug(2,Form(
"No 2 daughters for V0 of current cascade (onTheFly=%d, nDaughters=%d)",v0->GetOnFlyStatus(),v0->GetNDaughters()));
1064 if (!v0positiveTrack || !v0negativeTrack ) {
1065 AliDebug(2,
"No V0 daughters' objects");
1069 if (v0positiveTrack->GetID()<0 || v0negativeTrack->GetID()<0) {
1070 AliDebug(2,Form(
"At least one of V0 daughters has negative ID %d %d",v0positiveTrack->GetID(),v0negativeTrack->GetID()));
1076 AliDebug(2,
"Check on the bachelor FilterBit: no BIT(4). Candidate rejected.");
1089 Bool_t okLck0sp=kFALSE, okLcLpi=kFALSE, okLcLBarpi=kFALSE;
1098 Double_t mLcPDG = TDatabasePDG::Instance()->GetParticle(4122)->Mass();
1099 Double_t mk0sPDG = TDatabasePDG::Instance()->GetParticle(310)->Mass();
1100 Double_t mLPDG = TDatabasePDG::Instance()->GetParticle(3122)->Mass();
1107 Double_t mlambda = v0->MassLambda();
1108 Double_t malambda = v0->MassAntiLambda();
1116 okLcLBarpi = kFALSE;
1122 okLcLBarpi = okLcLpi;
1128 okLcLBarpi = kFALSE;
1142 okLcLBarpi = okLck0sp;
1148 okLcLBarpi = okLck0sp;
1154 okLcLBarpi = okLck0sp;
1160 okLcLBarpi = okLck0sp;
1166 okLcLBarpi = okLck0sp;
1172 okLcLBarpi = okLck0sp;
1178 okLcLBarpi = okLck0sp;
1184 okLcLBarpi = okLck0sp;
1200 okLcLBarpi = okLck0sp;
1206 okLcLBarpi = okLck0sp;
1211 Int_t returnvalue = okLck0sp+2*okLcLBarpi+4*okLcLpi;
1234 Int_t returnvalueTot = 0;
1238 returnvalueTot = returnvalue;
1240 return returnvalueTot;
1246 SetName(
"LctoV0ProductionCuts");
1247 SetTitle(
"Production cuts for Lc->V0+bachelor analysis");
1249 AliESDtrackCuts* esdTrackCuts=
new AliESDtrackCuts();
1250 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
1252 esdTrackCuts->SetRequireTPCRefit(kTRUE);
1253 esdTrackCuts->SetRequireITSRefit(kTRUE);
1254 esdTrackCuts->SetMinNClustersITS(0);
1255 esdTrackCuts->SetMinNClustersTPC(70);
1259 esdTrackCuts->SetMinDCAToVertexXY(0.);
1260 esdTrackCuts->SetPtRange(0.3,1.e10);
1262 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
1264 delete esdTrackCuts;
1268 AliESDtrackCuts* esdTrackCutsV0daughters=
new AliESDtrackCuts();
1269 esdTrackCutsV0daughters->SetRequireSigmaToVertex(kFALSE);
1271 esdTrackCutsV0daughters->SetRequireTPCRefit(kTRUE);
1272 esdTrackCutsV0daughters->SetRequireITSRefit(kFALSE);
1273 esdTrackCutsV0daughters->SetMinNClustersITS(0);
1274 esdTrackCutsV0daughters->SetMinNClustersTPC(70);
1278 esdTrackCutsV0daughters->SetMinDCAToVertexXY(0.);
1279 esdTrackCutsV0daughters->SetPtRange(0.,1.e10);
1280 esdTrackCutsV0daughters->SetAcceptKinkDaughters(kFALSE);
1282 delete esdTrackCutsV0daughters;
1283 esdTrackCutsV0daughters=NULL;
1287 ptbins=
new Float_t[nptbins+1];
1289 ptbins[1]=99999999.;
1294 const Int_t nvars=17;
1297 prodcutsval=
new Float_t*[nvars];
1300 prodcutsval[0][ipt2]=1.;
1301 prodcutsval[1][ipt2]=1.;
1302 prodcutsval[2][ipt2]=0.05;
1303 prodcutsval[3][ipt2]=0.05;
1304 prodcutsval[4][ipt2]=0.3;
1305 prodcutsval[5][ipt2]=0.;
1306 prodcutsval[6][ipt2]=0.;
1307 prodcutsval[7][ipt2]=1000.;
1308 prodcutsval[8][ipt2]=1.5;
1309 prodcutsval[9][ipt2]=-1.;
1310 prodcutsval[10][ipt2]=3.;
1311 prodcutsval[11][ipt2]=1000.;
1312 prodcutsval[12][ipt2]=0.;
1313 prodcutsval[13][ipt2]=0.;
1314 prodcutsval[14][ipt2]=0.;
1315 prodcutsval[15][ipt2]=0.;
1316 prodcutsval[16][ipt2]=0.;
1318 SetCuts(nvars,nptbins,prodcutsval);
1327 Double_t sigmasBac[5]={3.,1.,1.,3.,3.};
1328 pidObjBachelor->
SetSigma(sigmasBac);
1329 pidObjBachelor->
SetAsym(kFALSE);
1331 pidObjBachelor->
SetTPC(kTRUE);
1332 pidObjBachelor->
SetTOF(kTRUE);
1340 for(
Int_t iiv=0;iiv<nvars;iiv++){
1341 delete [] prodcutsval[iiv];
1343 delete [] prodcutsval;
1349 delete pidObjBachelor;
1350 pidObjBachelor=NULL;
1357 SetName(
"LctoV0ProductionCuts");
1358 SetTitle(
"Production cuts for Lc->V0+bachelor analysis");
1389 if(sVarNames[nvars-1].Contains(
"V0 type"))
return (
Int_t)
fV0Type;
1390 else {AliInfo(
"AliRDHFCutsLctoV0 Last variable is not the V0 type!!!");
return -999;}
1408 printf(
"Pileup rejection: %s\n",(
fOptPileup > 0) ?
"Yes" :
"No");
1410 printf(
"Reject kink: %s\n",
fKinkReject ?
"Yes" :
"No");
1411 if(
fOptPileup==1) printf(
" -- Reject pileup event");
1412 if(
fOptPileup==2) printf(
" -- Reject tracks from pileup vtx");
1424 cout<<
"Array of variables"<<endl;
1431 cout<<
"Array of optimization"<<endl;
1438 cout<<
"Array of upper/lower cut"<<endl;
1445 cout<<
"Array of ptbin limits"<<endl;
1452 cout<<
"Matrix of cuts"<<endl;
1462 if (fPidSelectionFlag==9) {
1472 cout <<
" etaRange for Bachelor: [" << eta1 <<
"," << eta2 <<
"]\n";
1476 cout <<
" etaRange for V0daughters: [" << eta3 <<
"," << eta4 <<
"]\n";
1498 AliDebug(2,Form(
"pt of Lambda_c = %f (> 5), cutting at |y| < 0.8",pt));
1499 if (TMath::Abs(y) > 0.8)
return kFALSE;
1503 Double_t maxFiducialY = -0.2/15*pt*pt+1.9/15*pt+0.5;
1504 Double_t minFiducialY = 0.2/15*pt*pt-1.9/15*pt-0.5;
1505 AliDebug(2,Form(
"pt of Lambda_c = %f (< 5), cutting according to the fiducial zone [%f, %f]\n",pt,minFiducialY,maxFiducialY));
1506 if (y < minFiducialY || y > maxFiducialY)
return kFALSE;
1519 AliDebug(2,
"AliAODRecoCascadeHF null");
1524 AliFatal(
"Cut object is not defined for bachelor. Candidate accepted.");
1528 AliAODTrack * bachelorTrack =
dynamic_cast<AliAODTrack*
>(d->
GetBachelor());
1529 if (!bachelorTrack)
return kFALSE;
1532 if(!bachelorTrack->HasPointOnITSLayer(0))
return kFALSE;
1536 AliError(Form(
"Not compatible setting: fKinkReject=%1d - fTrackCuts->GetAcceptKinkDaughters()=%1d",
fKinkReject,
fTrackCuts->GetAcceptKinkDaughters()));
1541 Double_t pos[3]; vAOD->GetXYZ(pos);
1542 Double_t cov[6]; vAOD->GetCovarianceMatrix(cov);
1543 const AliESDVertex vESD(pos,cov,100.,100);
1548 AliFatal(
"Cut object is not defined for V0daughters. Candidate accepted.");
1552 AliAODv0 * v0 =
dynamic_cast<AliAODv0*
>(d->
Getv0());
1553 if (!v0)
return kFALSE;
1555 if (!v0positiveTrack)
return kFALSE;
1557 if (!v0negativeTrack)
return kFALSE;
1561 if ( (v0positiveTrack->Eta()<=etaMin || v0positiveTrack->Eta()>=etaMax) ||
1562 (v0negativeTrack->Eta()<=etaMin || v0negativeTrack->Eta()>=etaMax) )
return kFALSE;
1564 if ( (v0positiveTrack->Pt()<=ptMin || v0positiveTrack->Pt()>=
ptMax) ||
1565 (v0negativeTrack->Pt()<=ptMin || v0negativeTrack->Pt()>=
ptMax) )
return kFALSE;
1569 if ( ( ( v0positiveTrack->GetTPCClusterInfo(2,1) ) <
fV0daughtersCuts->GetMinNClusterTPC() ) ||
1570 ( ( v0negativeTrack->GetTPCClusterInfo(2,1) ) <
fV0daughtersCuts->GetMinNClusterTPC() ) )
return kFALSE;
1574 if (v0->GetOnFlyStatus()==kFALSE) {
1576 if( !(v0positiveTrack->GetStatus() & AliESDtrack::kTPCrefit))
return kFALSE;
1577 if( !(v0negativeTrack->GetStatus() & AliESDtrack::kTPCrefit))
return kFALSE;
1582 AliAODVertex *maybeKinkPos = (AliAODVertex*)v0positiveTrack->GetProdVertex();
1583 AliAODVertex *maybeKinkNeg = (AliAODVertex*)v0negativeTrack->GetProdVertex();
1584 if (maybeKinkPos->GetType()==AliAODVertex::kKink ||
1585 maybeKinkNeg->GetType()==AliAODVertex::kKink)
return kFALSE;
1616 printf(
"Wrong number of pt bins: it has to be %d\n",
fnPtBins);
1617 AliFatal(
"exiting");
AliESDtrackCuts * fV0daughtersCuts
virtual void SetStandardCutsPbPb2010()
Double_t fMaxPtCandTrackSPDFirst
flag to select the track kFirst criteria for pt < ptlimit
void SetAsym(Bool_t asym)
AliRDHFCutsLctoV0(const char *name="CutsLctoV0", Short_t v0channel=0)
Int_t GetnSigmaTOF(AliAODTrack *track, Int_t species, Double_t &sigma) const
virtual void SetStandardCutsPP2010()
Bool_t fRemoveDaughtersFromPrimary
AliAODTrack * Getv0NegativeTrack() const
Int_t GetnSigmaTPC(AliAODTrack *track, Int_t species, Double_t &sigma) const
Bool_t CheckTOFPIDStatus(AliAODTrack *track) const
Float_t * fPtBinLimits
"number of limits", that is fnPtBins+1
ECombDetectors GetCombDetectors() const
virtual void SetStandardCutsPbPb2011()
Int_t fMinVtxContr
0: not cut; 1: SPDZ; 2: SPD3D; 3: Tracks
Double_t InvMassLctoLambdaPi() const
Bool_t AreLctoV0DaughtersSelected(AliAODRecoDecayHF *rd, AliAODEvent *aod=0x0) const
Float_t fMaxVtxRedChi2
minimum vertex contributors
Int_t CombineCuts(Int_t returnvalueTrack, Int_t returnvalue, Int_t returnvaluePID) const
Float_t * fMinCombinedProbability
cut to be excluded (-1=none)
const Float_t * GetCuts() const
Float_t fV0Type
cuts for v0 daughters (AOD converted to ESD on the flight!)
void SetNVars(Int_t nVars)
Int_t fMinVtxType
cuts on the event
Double_t fMaxRapidityCand
minimum pt of the candidate
void EnableSemiCentralTrigger()
AliRDHFCutsLctoV0 & operator=(const AliRDHFCutsLctoV0 &source)
TString * GetVarNames() const
Int_t ApplyPidTPCRaw(AliAODTrack *track, Int_t specie) const
AliRDHFCuts & operator=(const AliRDHFCuts &source)
Int_t fUseCentrality
min deltaz between main and pileup vertices
void SetPidHF(AliAODPidHF *pidObj)
see enum below
Double_t InvMassLctoK0sP() const
AliAODPidHF * GetPidHF() const
AliAODTrack * Getv0PositiveTrack() const
virtual void GetCutVarsForOpt(AliAODRecoDecayHF *d, Float_t *vars, Int_t nvars, Int_t *pdgdaughters)
Bool_t fUseTrackSelectionWithFilterBits
flag to reject kink daughters
virtual ~AliRDHFCutsLctoV0()
void SetCuts(Int_t nVars, Int_t nPtBins, Float_t **cutsRD)
void ResetMaskAndEnableMBTrigger()
AliPIDCombined * GetPidCombined() const
TString * fVarNames
number of cut vars for candidates
Double_t fMaxPtCand
minimum pt of the candidate
AliESDtrackCuts * fTrackCuts
quality cuts on the daughter tracks
void AddTrackCutsV0daughters(AliESDtrackCuts *v0daug)
Float_t fLowPtCut
high pT cut separation for proton identification
AliAODTrack * GetBachelor() const
Int_t fOptPileup
use Physics selection criteria
Bool_t IsExcluded(AliAODTrack *track, Int_t labelTrack, Double_t nsigmaCut, TString detector)
virtual void PrintAll() const
AliPIDResponse * GetPidResponse() const
Int_t fnPtBinLimits
number of pt bins for cuts
void SetSigma(Double_t *sigma)
Float_t * fCutsRD
fnVars*fnPtBins
Double_t CosV0PointingAngle() const
Int_t ApplyPidTOFRaw(AliAODTrack *track, Int_t specie) const
void SetVarsForOpt(Int_t nVars, Bool_t *forOpt)
void SetVarNames(Int_t nVars, TString *varNames, Bool_t *isUpperCut)
Bool_t * fVarsForOpt
number of cut vars to be optimized for candidates
void SetMinCombinedProbability(Int_t ptBins, Float_t *ptMin)
Bool_t PreSelect(TObject *obj, AliAODv0 *v0, AliVTrack *bachelorTrack)
void EnableCentralTrigger()
void CheckPID(Int_t candPtBin, AliAODTrack *bachelor, AliAODTrack *, AliAODTrack *, Bool_t &isBachelorID1, Bool_t &isBachelorID2, Bool_t &isBachelorID4)
Int_t fMinSPDMultiplicity
maximum |z| of primary vertex
void SetUsePID(Bool_t flag=kTRUE)
Int_t fExcludedCut
low pT cut separation for proton identification
ClassImp(AliAnalysisTaskCRC) AliAnalysisTaskCRC
Bool_t fIsCandTrackSPDFirst
IsSelected returns always kTRUE for MC signal.
void SetPtBins(Int_t nPtBinLimits, Float_t *ptBinLimits)
Bool_t fKinkReject
cut on zSPD vertex to remove outliers in centrality vs. tracklets (0=no cut, 1= cut at 12 cm...
Bool_t fUsePhysicsSelection
use MC primary vertex
void SetTOFdecide(Bool_t tOFdecide)
void SetMatch(Int_t match)
AliAODVertex * GetPrimaryVtx() const
void AddTrackCuts(const AliESDtrackCuts *cuts)
Int_t fnPtBins
cuts on the candidate
Float_t fHighPtCut
V0 type – should be defined as in AliRDHFCuts.h.
void SetTriggerClass(TString trclass0, TString trclass1="")
AliAODPidHF * fPidHF
enable AOD049 centrality cleanup
virtual Bool_t IsInFiducialAcceptance(Double_t pt, Double_t y) const
Int_t PtBin(Double_t pt) const
Int_t GetGlobalIndex(Int_t iVar, Int_t iPtBin) const
Int_t IsSelectedSingleCut(TObject *obj, Int_t selectionLevel, Int_t cutIndex, AliAODEvent *aod=0x0)
Double_t fMinPtCand
outcome of PID selection
Bool_t IsDaughterSelected(AliAODTrack *track, const AliESDVertex *primary, AliESDtrackCuts *cuts, const AliAODEvent *aod=0x0) const
virtual Int_t IsSelected(TObject *obj, Int_t selectionLevel)
Float_t fMaxCentrality
minimum centrality for selected events
virtual Int_t IsSelectedPID(AliAODRecoDecayHF *obj)