29 #include <Riostream.h> 31 #include <TDatabasePDG.h> 34 #include <TProcessID.h> 36 #include "AliVEvent.h" 37 #include "AliVVertex.h" 38 #include "AliVTrack.h" 39 #include "AliVertexerTracks.h" 40 #include "AliKFVertex.h" 41 #include "AliESDEvent.h" 42 #include "AliESDVertex.h" 43 #include "AliExternalTrackParam.h" 44 #include "AliNeutralTrackParam.h" 45 #include "AliESDtrack.h" 46 #include "AliESDtrackCuts.h" 47 #include "AliAODEvent.h" 48 #include "AliPIDResponse.h" 49 #include "AliAODRecoDecay.h" 65 #include "AliAnalysisFilter.h" 67 #include "AliMixedEvent.h" 70 #include "AliCodeTimer.h" 71 #include "AliMultSelection.h" 85 fSecVtxWithKF(kFALSE),
86 fRecoPrimVtxSkippingTrks(kFALSE),
87 fRmTrksFromPrimVtx(kFALSE),
96 fLikeSign3prong(kFALSE),
99 fUseKaonPIDfor3Prong(kFALSE),
102 fUseKaonPIDforDs(kFALSE),
105 fUseTPCPIDOnlyIfNoTOF(kFALSE),
106 fMaxMomForTPCPid(1.),
108 fnSigmaTPCPionLow(5.),
109 fnSigmaTPCPionHi(5.),
110 fnSigmaTOFPionLow(5.),
111 fnSigmaTOFPionHi(5.),
112 fnSigmaTPCKaonLow(5.),
113 fnSigmaTPCKaonHi(5.),
114 fnSigmaTOFKaonLow(5.),
115 fnSigmaTOFKaonHi(5.),
116 fnSigmaTPCProtonLow(5.),
117 fnSigmaTPCProtonHi(5.),
118 fnSigmaTOFProtonLow(5.),
119 fnSigmaTOFProtonHi(5.),
120 fMaxCentPercentileForTightCuts(-9999),
122 fTrackFilter2prongCentral(0x0),
123 fTrackFilter3prongCentral(0x0),
124 fTrackFilterSoftPi(0x0),
125 fTrackFilterBachelor(0x0),
128 fCutsDplustoK0spi(0x0),
129 fCutsDplustoKpipi(0x0),
134 fCutsD0toKpipipi(0x0),
135 fCutsDStartoKpipi(0x0),
137 fFindVertexForDstar(kTRUE),
138 fFindVertexForCascades(kTRUE),
139 fV0TypeForCascadeVertex(0),
140 fMassCutBeforeVertexing(kFALSE),
144 fOKInvMassD0(kFALSE),
145 fOKInvMassJpsi(kFALSE),
146 fOKInvMassDplus(kFALSE),
147 fOKInvMassDs(kFALSE),
148 fOKInvMassLc(kFALSE),
149 fOKInvMassDstar(kFALSE),
150 fOKInvMassD0to4p(kFALSE),
151 fOKInvMassLctoV0(kFALSE),
154 fMakeReducedRHF(kFALSE),
167 fMassCalc2 =
new AliAODRecoDecay(0x0,2,0,d02);
168 fMassCalc3 =
new AliAODRecoDecay(0x0,3,1,d03);
169 fMassCalc4 =
new AliAODRecoDecay(0x0,4,0,d04);
267 if(&source ==
this)
return *
this;
381 list->SetName(
"ListOfCuts");
385 list->Add(cutsD0toKpi);
389 list->Add(cutsJpsitoee);
393 list->Add(cutsDplustoK0spi);
397 list->Add(cutsDplustoKpipi);
401 list->Add(cutsDstoK0sK);
405 list->Add(cutsDstoKKpi);
409 list->Add(cutsLctopKpi);
413 list->Add(cutsLctoV0);
417 list->Add(cutsD0toKpipipi);
421 list->Add(cutsDStartoKpipi);
426 if (bCutsOk == kFALSE) {AliFatal(
"AliAnalysisVertexingHF::FillListOfCuts vertexing and the analysis task cuts are not consistent!");}
435 TClonesArray *aodVerticesHFTClArr,
436 TClonesArray *aodD0toKpiTClArr,
437 TClonesArray *aodJPSItoEleTClArr,
438 TClonesArray *aodCharm3ProngTClArr,
439 TClonesArray *aodCharm4ProngTClArr,
440 TClonesArray *aodDstarTClArr,
441 TClonesArray *aodCascadesTClArr,
442 TClonesArray *aodLikeSign2ProngTClArr,
443 TClonesArray *aodLikeSign3ProngTClArr)
451 TString evtype =
event->IsA()->GetName();
452 fInputAOD = ((evtype==
"AliAODEvent") ? kTRUE : kFALSE);
456 AliDebug(2,
"Creating HF candidates from AOD");
458 AliDebug(2,
"Creating HF candidates from ESD");
461 if(!aodVerticesHFTClArr) {
462 printf(
"ERROR: no aodVerticesHFTClArr");
466 printf(
"ERROR: no aodD0toKpiTClArr");
470 printf(
"ERROR: no aodJPSItoEleTClArr");
473 if(
f3Prong && !aodCharm3ProngTClArr) {
474 printf(
"ERROR: no aodCharm3ProngTClArr");
477 if(
f4Prong && !aodCharm4ProngTClArr) {
478 printf(
"ERROR: no aodCharm4ProngTClArr");
481 if(
fDstar && !aodDstarTClArr) {
482 printf(
"ERROR: no aodDstarTClArr");
486 printf(
"ERROR: no aodCascadesTClArr ");
489 if(
fLikeSign && !aodLikeSign2ProngTClArr) {
490 printf(
"ERROR: no aodLikeSign2ProngTClArr");
494 printf(
"ERROR: no aodLikeSign3ProngTClArr");
499 Int_t iVerticesHF=0,iD0toKpi=0,iJPSItoEle=0,i3Prong=0,i4Prong=0,iDstar=0,iCascades=0,iLikeSign2Prong=0,iLikeSign3Prong=0;
500 aodVerticesHFTClArr->Delete();
501 iVerticesHF = aodVerticesHFTClArr->GetEntriesFast();
502 TClonesArray &verticesHFRef = *aodVerticesHFTClArr;
504 aodD0toKpiTClArr->Delete();
505 iD0toKpi = aodD0toKpiTClArr->GetEntriesFast();
508 aodJPSItoEleTClArr->Delete();
509 iJPSItoEle = aodJPSItoEleTClArr->GetEntriesFast();
512 aodCharm3ProngTClArr->Delete();
513 i3Prong = aodCharm3ProngTClArr->GetEntriesFast();
516 aodCharm4ProngTClArr->Delete();
517 i4Prong = aodCharm4ProngTClArr->GetEntriesFast();
520 aodDstarTClArr->Delete();
521 iDstar = aodDstarTClArr->GetEntriesFast();
524 aodCascadesTClArr->Delete();
525 iCascades = aodCascadesTClArr->GetEntriesFast();
528 aodLikeSign2ProngTClArr->Delete();
529 iLikeSign2Prong = aodLikeSign2ProngTClArr->GetEntriesFast();
532 aodLikeSign3ProngTClArr->Delete();
533 iLikeSign3Prong = aodLikeSign3ProngTClArr->GetEntriesFast();
536 TClonesArray &aodD0toKpiRef = *aodD0toKpiTClArr;
537 TClonesArray &aodJPSItoEleRef = *aodJPSItoEleTClArr;
538 TClonesArray &aodCharm3ProngRef = *aodCharm3ProngTClArr;
539 TClonesArray &aodCharm4ProngRef = *aodCharm4ProngTClArr;
540 TClonesArray &aodDstarRef = *aodDstarTClArr;
541 TClonesArray &aodCascadesRef = *aodCascadesTClArr;
542 TClonesArray &aodLikeSign2ProngRef = *aodLikeSign2ProngTClArr;
543 TClonesArray &aodLikeSign3ProngRef = *aodLikeSign3ProngTClArr;
551 Int_t iTrkP1,iTrkP2,iTrkN1,iTrkN2,iTrkSoftPi,trkEntries,iv0,nv0;
552 Double_t xdummy,ydummy,dcap1n1,dcap1n2,dcap2n1,dcap1p2,dcan1n2,dcap2n2,dcaV0,dcaCasc;
553 Bool_t okD0=kFALSE,okJPSI=kFALSE,ok3Prong=kFALSE,ok4Prong=kFALSE;
554 Bool_t okDstar=kFALSE,okD0fromDstar=kFALSE;
556 AliESDtrack *postrack1 = 0;
557 AliESDtrack *postrack2 = 0;
558 AliESDtrack *negtrack1 = 0;
559 AliESDtrack *negtrack2 = 0;
560 AliESDtrack *trackPi = 0;
561 Double_t mompos1[3],mompos2[3],momneg1[3],momneg2[3];
572 AliDebug(2,Form(
" dca cut set to %f cm",dcaMax));
584 trkEntries = (
Int_t)event->GetNumberOfTracks();
585 AliDebug(1,Form(
" Number of tracks: %d",trkEntries));
588 nv0 = (
Int_t)event->GetNumberOfV0s();
589 AliDebug(1,Form(
" Number of V0s: %d",nv0));
591 if( trkEntries<2 && (trkEntries<1 || nv0<1) ) {
592 AliDebug(1,Form(
" Not enough tracks: %d",trkEntries));
613 UChar_t *seleFlags =
new UChar_t[trkEntries];
618 AliDebug(1,Form(
" Selected tracks: %d",nSeleTrks));
630 Bool_t isLikeSign2Prong=kFALSE,isLikeSign3Prong=kFALSE;
640 for(iTrkP1=0; iTrkP1<nSeleTrks; iTrkP1++) {
646 postrack1 = (AliESDtrack*)seleTrksArray.UncheckedAt(iTrkP1);
647 postrack1->GetPxPyPz(mompos1);
653 for(iv0=0; iv0<nv0; iv0++){
656 if ( !TESTBIT(seleFlags[iTrkP1],
kBitBachelor) )
continue;
666 if ( (!v0 || !v0->IsA()->InheritsFrom(
"AliAODv0") ) &&
667 (!esdV0 || !esdV0->IsA()->InheritsFrom(
"AliESDv0") ) )
continue;
678 AliExternalTrackParam * posV0track;
679 AliExternalTrackParam * negV0track;
682 AliAODTrack *posVV0track = (AliAODTrack*)(v0->GetDaughter(0));
683 AliAODTrack *negVV0track = (AliAODTrack*)(v0->GetDaughter(1));
684 if( !posVV0track || !negVV0track )
continue;
689 if (posVV0track->GetID() == postrack1->GetID() ||
690 negVV0track->GetID() == postrack1->GetID())
continue;
692 if ( posVV0track->Charge() == negVV0track->Charge() )
continue;
694 if(!(posVV0track->GetStatus() & AliESDtrack::kTPCrefit) ||
695 !(negVV0track->GetStatus() & AliESDtrack::kTPCrefit))
continue;
698 posVV0track->PxPyPz(pxpypz); posVV0track->XvYvZv(xyz);
699 posVV0track->GetCovarianceXYZPxPyPz(cv); sign=posVV0track->Charge();
700 posV0track =
new AliExternalTrackParam(xyz,pxpypz,cv,sign);
701 negVV0track->PxPyPz(pxpypz); negVV0track->XvYvZv(xyz);
702 negVV0track->GetCovarianceXYZPxPyPz(cv); sign=negVV0track->Charge();
703 negV0track =
new AliExternalTrackParam(xyz,pxpypz,cv,sign);
705 AliESDtrack *posVV0track = (AliESDtrack*)(event->GetTrack( esdV0->GetPindex() ));
706 AliESDtrack *negVV0track = (AliESDtrack*)(event->GetTrack( esdV0->GetNindex() ));
707 if( !posVV0track || !negVV0track )
continue;
712 if (posVV0track->GetID() == postrack1->GetID() ||
713 negVV0track->GetID() == postrack1->GetID())
continue;
715 if ( posVV0track->Charge() == negVV0track->Charge() )
continue;
717 if(!(posVV0track->GetStatus() & AliESDtrack::kTPCrefit) ||
718 !(negVV0track->GetStatus() & AliESDtrack::kTPCrefit))
continue;
720 if (posVV0track->GetKinkIndex(0)>0 || negVV0track->GetKinkIndex(0)>0)
continue;
722 posV0track =
new AliExternalTrackParam(*posVV0track);
723 negV0track =
new AliExternalTrackParam(*negVV0track);
728 if( !posV0track || !negV0track ){
729 AliDebug(1,Form(
" Couldn't get the V0 daughters"));
734 twoTrackArrayV0->AddAt(posV0track,0);
735 twoTrackArrayV0->AddAt(negV0track,1);
738 dcaV0 = v0->DcaV0Daughters();
741 AliNeutralTrackParam *trackV0=NULL;
743 const AliVTrack *trackVV0 =
dynamic_cast<const AliVTrack*
>(v0);
744 if(trackVV0) trackV0 =
new AliNeutralTrackParam(trackVV0);
748 esdV0->PxPyPz(pxpypz);
749 Double_t cv[21];
for(
int i=0; i<21; i++) cv[i]=0;
750 trackV0 =
new AliNeutralTrackParam(xyz,pxpypz,cv,0);
755 twoTrackArrayCasc->AddAt(postrack1,0);
756 twoTrackArrayCasc->AddAt(trackV0,1);
758 AliAODVertex *vertexCasc = 0;
761 dcaCasc = postrack1->GetDCA(trackV0,
fBzkG,xdummy,ydummy);
768 fV1->GetCovMatrix(cov);
769 chi2perNDF =
fV1->GetChi2toNDF();
770 vertexCasc =
new AliAODVertex(pos,cov,chi2perNDF,0x0,-1,AliAODVertex::kUndef,2);
774 delete posV0track; posV0track=NULL;
775 delete negV0track; negV0track=NULL;
776 delete trackV0; trackV0=NULL;
778 twoTrackArrayV0->Clear();
779 twoTrackArrayCasc->Clear();
784 ioCascade =
MakeCascade(twoTrackArrayCasc,event,vertexCasc,v0,dcaCasc,okCascades);
785 if(okCascades && ioCascade) {
794 AliAODVertex *vCasc =
new(verticesHFRef[iVerticesHF++])AliAODVertex(*vertexCasc);
795 rc->SetSecondaryVtx(vCasc);
796 vCasc->SetParent(rc);
798 AddRefs(vCasc,rc,event,twoTrackArrayCasc);
799 vCasc->AddDaughter(v0);
806 delete posV0track; posV0track=NULL;
807 delete negV0track; negV0track=NULL;
808 delete trackV0; trackV0=NULL;
809 twoTrackArrayV0->Clear();
810 twoTrackArrayCasc->Clear();
811 if(ioCascade) {
delete ioCascade; ioCascade=NULL; }
812 if(vertexCasc) {
delete vertexCasc; vertexCasc=NULL; }
823 AliDebug(1,Form(
" Not enough tracks: %d",trkEntries));
827 if(!TESTBIT(seleFlags[iTrkP1],
kBitDispl))
continue;
828 if(postrack1->Charge()<0 && !
fLikeSign)
continue;
831 for(iTrkN1=0; iTrkN1<nSeleTrks; iTrkN1++) {
836 if(iTrkN1==iTrkP1)
continue;
839 negtrack1 = (AliESDtrack*)seleTrksArray.UncheckedAt(iTrkN1);
841 if(negtrack1->Charge()>0 && !
fLikeSign)
continue;
843 if(!TESTBIT(seleFlags[iTrkN1],
kBitDispl))
continue;
846 if(evtNumber[iTrkP1]==evtNumber[iTrkN1])
continue;
849 if(postrack1->Charge()==negtrack1->Charge()) {
850 isLikeSign2Prong=kTRUE;
852 if(iTrkN1<iTrkP1)
continue;
854 isLikeSign2Prong=kFALSE;
855 if(postrack1->Charge()<0 || negtrack1->Charge()>0)
continue;
857 if(evtNumber[iTrkP1]==evtNumber[iTrkN1])
continue;
867 negtrack1->GetPxPyPz(momneg1);
870 dcap1n1 = postrack1->GetDCA(negtrack1,
fBzkG,xdummy,ydummy);
871 if(dcap1n1>dcaMax) { negtrack1=0;
continue; }
874 twoTrackArray1->AddAt(postrack1,0);
875 twoTrackArray1->AddAt(negtrack1,1);
878 twoTrackArray1->Clear();
885 io2Prong =
Make2Prong(twoTrackArray1,event,vertexp1n1,dcap1n1,okD0,okJPSI,okD0fromDstar);
887 if((
fD0toKpi && okD0) || (
fJPSItoEle && okJPSI) || (isLikeSign2Prong && (okD0 || okJPSI))) {
889 AliAODVertex *v2Prong =0x0;
890 if(!
fMakeReducedRHF)v2Prong =
new(verticesHFRef[iVerticesHF++])AliAODVertex(*vertexp1n1);
891 if(!isLikeSign2Prong) {
900 rd->SetSecondaryVtx(v2Prong);
901 v2Prong->SetParent(rd);
902 AddRefs(v2Prong,rd,event,twoTrackArray1);
911 if(!okD0) v2Prong->SetParent(rd);
912 AddRefs(v2Prong,rd,event,twoTrackArray1);
923 rd->SetSecondaryVtx(v2Prong);
924 v2Prong->SetParent(rd);
925 AddRefs(v2Prong,rd,event,twoTrackArray1);
930 if(
fDstar && okD0fromDstar && !isLikeSign2Prong) {
935 vertexp1n1->AddDaughter(postrack1);
936 vertexp1n1->AddDaughter(negtrack1);
938 io2Prong->SetSecondaryVtx(vertexp1n1);
941 AliNeutralTrackParam *trackD0 =
new AliNeutralTrackParam(io2Prong);
944 for(iTrkSoftPi=0; iTrkSoftPi<nSeleTrks; iTrkSoftPi++) {
946 if(iTrkSoftPi==iTrkP1 || iTrkSoftPi==iTrkN1)
continue;
948 if(!TESTBIT(seleFlags[iTrkSoftPi],
kBitSoftPi))
continue;
951 if(evtNumber[iTrkP1]==evtNumber[iTrkSoftPi] ||
952 evtNumber[iTrkN1]==evtNumber[iTrkSoftPi] ||
953 evtNumber[iTrkP1]==evtNumber[iTrkN1])
continue;
958 trackD0->PropagateToDCA(
fV1,
fBzkG,kVeryBig);
959 if(trackD0->GetSigmaY2()<0. || trackD0->GetSigmaZ2()<0.)
continue;
962 trackPi = (AliESDtrack*)seleTrksArray.UncheckedAt(iTrkSoftPi);
965 twoTrackArrayCasc->AddAt(trackPi,0);
966 twoTrackArrayCasc->AddAt(trackD0,1);
968 twoTrackArrayCasc->Clear();
973 AliAODVertex *vertexCasc = 0;
977 dcaCasc = trackPi->GetDCA(trackD0,
fBzkG,xdummy,ydummy);
984 fV1->GetCovMatrix(cov);
985 chi2perNDF =
fV1->GetChi2toNDF();
986 vertexCasc =
new AliAODVertex(pos,cov,chi2perNDF,0x0,-1,AliAODVertex::kUndef,2);
990 twoTrackArrayCasc->Clear();
995 ioCascade =
MakeCascade(twoTrackArrayCasc,event,vertexCasc,io2Prong,dcaCasc,okDstar);
1004 AliAODVertex *v2Prong =
new (verticesHFRef[iVerticesHF++])AliAODVertex(*vertexp1n1);
1005 rd->SetSecondaryVtx(v2Prong);
1006 v2Prong->SetParent(rd);
1007 AddRefs(v2Prong,rd,event,twoTrackArray1);
1015 AliAODVertex *vCasc = 0x0;
1023 AliAODVertex *vCasc =
new(verticesHFRef[iVerticesHF++])AliAODVertex(*vertexCasc);
1024 rc->SetSecondaryVtx(vCasc);
1025 vCasc->SetParent(rc);
1027 AddRefs(vCasc,rc,event,twoTrackArrayCasc);
1028 vCasc->AddDaughter(rd);
1031 twoTrackArrayCasc->Clear();
1033 if(ioCascade) {
delete ioCascade; ioCascade=NULL;}
1034 delete vertexCasc; vertexCasc=NULL;
1037 if(trackD0) {
delete trackD0; trackD0=NULL;}
1040 if(io2Prong) {
delete io2Prong; io2Prong=NULL;}
1043 twoTrackArray1->Clear();
1045 (isLikeSign2Prong && !
f3Prong) ) {
1053 for(iTrkP2=iTrkP1+1; iTrkP2<nSeleTrks; iTrkP2++) {
1055 if(iTrkP2==iTrkP1 || iTrkP2==iTrkN1)
continue;
1060 postrack2 = (AliESDtrack*)seleTrksArray.UncheckedAt(iTrkP2);
1062 if(postrack2->Charge()<0)
continue;
1064 if(!TESTBIT(seleFlags[iTrkP2],
kBitDispl))
continue;
1067 if(!TESTBIT(seleFlags[iTrkP2],
kBit3Prong))
continue;
1068 if(!TESTBIT(seleFlags[iTrkP1],
kBit3Prong))
continue;
1069 if(!TESTBIT(seleFlags[iTrkN1],
kBit3Prong))
continue;
1072 if(evtNumber[iTrkP1]==evtNumber[iTrkP2] ||
1073 evtNumber[iTrkN1]==evtNumber[iTrkP2] ||
1074 evtNumber[iTrkP1]==evtNumber[iTrkN1])
continue;
1077 if(isLikeSign2Prong) {
1079 if(postrack1->Charge()>0) {
1080 isLikeSign3Prong=kTRUE;
1085 isLikeSign3Prong=kFALSE;
1087 if(evtNumber[iTrkP1]==evtNumber[iTrkP2] ||
1088 evtNumber[iTrkN1]==evtNumber[iTrkP2] ||
1089 evtNumber[iTrkP1]==evtNumber[iTrkN1])
continue;
1096 Bool_t okForLcTopKpi=kTRUE;
1097 Int_t pidLcStatus=3;
1101 okForLcTopKpi=kFALSE;
1105 okForLcTopKpi=kFALSE;
1109 okForLcTopKpi=kTRUE;
1114 okForLcTopKpi=kTRUE;
1119 Bool_t okForDsToKKpi=kTRUE;
1122 !TESTBIT(seleFlags[iTrkP2],
kBitKaonCompat) ) okForDsToKKpi=kFALSE;
1134 dcap2n1 = postrack2->GetDCA(negtrack1,
fBzkG,xdummy,ydummy);
1135 if(dcap2n1>dcaMax) { postrack2=0;
continue; }
1136 dcap1p2 = postrack2->GetDCA(postrack1,
fBzkG,xdummy,ydummy);
1137 if(dcap1p2>dcaMax) { postrack2=0;
continue; }
1142 if(postrack2->Charge()>0) {
1143 threeTrackArray->AddAt(postrack1,0);
1144 threeTrackArray->AddAt(negtrack1,1);
1145 threeTrackArray->AddAt(postrack2,2);
1147 threeTrackArray->AddAt(negtrack1,0);
1148 threeTrackArray->AddAt(postrack1,1);
1149 threeTrackArray->AddAt(postrack2,2);
1152 postrack2->GetPxPyPz(mompos2);
1153 Double_t pxDau[3]={mompos1[0],momneg1[0],mompos2[0]};
1154 Double_t pyDau[3]={mompos1[1],momneg1[1],mompos2[1]};
1155 Double_t pzDau[3]={mompos1[2],momneg1[2],mompos2[2]};
1162 threeTrackArray->Clear();
1170 twoTrackArray2->AddAt(postrack2,0);
1171 twoTrackArray2->AddAt(negtrack1,1);
1174 twoTrackArray2->Clear();
1183 io3Prong =
Make3Prong(threeTrackArray,event,secVert3PrAOD,dispersion,vertexp1n1,vertexp2n1,dcap1n1,dcap2n1,dcap1p2,okForLcTopKpi,okForDsToKKpi,ok3Prong);
1185 AliAODVertex *v3Prong=0x0;
1186 if(!
fMakeReducedRHF)v3Prong =
new (verticesHFRef[iVerticesHF++])AliAODVertex(*secVert3PrAOD);
1187 if(!isLikeSign3Prong) {
1197 v3Prong =
new (verticesHFRef[iVerticesHF++])AliAODVertex(*secVert3PrAOD);
1198 rd->SetSecondaryVtx(v3Prong);
1199 v3Prong->SetParent(rd);
1200 AddRefs(v3Prong,rd,event,threeTrackArray);
1213 rd->SetSecondaryVtx(v3Prong);
1214 v3Prong->SetParent(rd);
1215 AddRefs(v3Prong,rd,event,threeTrackArray);
1221 if(io3Prong) {
delete io3Prong; io3Prong=NULL;}
1222 if(secVert3PrAOD) {
delete secVert3PrAOD; secVert3PrAOD=NULL;}
1228 && !isLikeSign2Prong && !isLikeSign3Prong
1230 && dcap1n1 < fCutsD0toKpipipi->GetDCACut()
1231 && dcap2n1 < fCutsD0toKpipipi->GetDCACut()) {
1241 threeTrackArray->AddAt(postrack1,0);
1242 threeTrackArray->AddAt(negtrack1,1);
1243 threeTrackArray->AddAt(postrack2,2);
1247 for(iTrkN2=iTrkN1+1; iTrkN2<nSeleTrks; iTrkN2++) {
1249 if(iTrkN2==iTrkP1 || iTrkN2==iTrkP2 || iTrkN2==iTrkN1)
continue;
1254 negtrack2 = (AliESDtrack*)seleTrksArray.UncheckedAt(iTrkN2);
1256 if(negtrack2->Charge()>0)
continue;
1258 if(!TESTBIT(seleFlags[iTrkN2],
kBitDispl))
continue;
1260 if(evtNumber[iTrkP1]==evtNumber[iTrkN2] ||
1261 evtNumber[iTrkN1]==evtNumber[iTrkN2] ||
1262 evtNumber[iTrkP2]==evtNumber[iTrkN2] ||
1263 evtNumber[iTrkP1]==evtNumber[iTrkN1] ||
1264 evtNumber[iTrkP1]==evtNumber[iTrkP2] ||
1265 evtNumber[iTrkN1]==evtNumber[iTrkP2])
continue;
1278 dcap1n2 = postrack1->GetDCA(negtrack2,
fBzkG,xdummy,ydummy);
1280 dcap2n2 = postrack2->GetDCA(negtrack2,
fBzkG,xdummy,ydummy);
1284 fourTrackArray->AddAt(postrack1,0);
1285 fourTrackArray->AddAt(negtrack1,1);
1286 fourTrackArray->AddAt(postrack2,2);
1287 fourTrackArray->AddAt(negtrack2,3);
1295 fourTrackArray->Clear();
1302 io4Prong =
Make4Prong(fourTrackArray,event,secVert4PrAOD,vertexp1n1,vertexp1n1p2,dcap1n1,dcap1n2,dcap2n1,dcap2n2,ok4Prong);
1309 AliAODVertex *v4Prong =
new(verticesHFRef[iVerticesHF++])AliAODVertex(*secVert4PrAOD);
1310 rd->SetSecondaryVtx(v4Prong);
1311 v4Prong->SetParent(rd);
1312 AddRefs(v4Prong,rd,event,fourTrackArray);
1316 if(io4Prong) {
delete io4Prong; io4Prong=NULL;}
1317 if(secVert4PrAOD) {
delete secVert4PrAOD; secVert4PrAOD=NULL;}
1318 fourTrackArray->Clear();
1323 threeTrackArray->Clear();
1324 delete vertexp1n1p2;
1333 twoTrackArray2->Clear();
1336 for(iTrkN2=iTrkN1+1; iTrkN2<nSeleTrks; iTrkN2++) {
1338 if(iTrkN2==iTrkP1 || iTrkN2==iTrkP2 || iTrkN2==iTrkN1)
continue;
1343 negtrack2 = (AliESDtrack*)seleTrksArray.UncheckedAt(iTrkN2);
1345 if(negtrack2->Charge()>0)
continue;
1347 if(!TESTBIT(seleFlags[iTrkN2],
kBitDispl))
continue;
1350 if(!TESTBIT(seleFlags[iTrkN2],
kBit3Prong))
continue;
1351 if(!TESTBIT(seleFlags[iTrkP1],
kBit3Prong))
continue;
1352 if(!TESTBIT(seleFlags[iTrkN1],
kBit3Prong))
continue;
1355 if(evtNumber[iTrkP1]==evtNumber[iTrkN2] ||
1356 evtNumber[iTrkN1]==evtNumber[iTrkN2] ||
1357 evtNumber[iTrkP1]==evtNumber[iTrkN1])
continue;
1360 if(isLikeSign2Prong) {
1362 if(postrack1->Charge()<0) {
1363 isLikeSign3Prong=kTRUE;
1368 isLikeSign3Prong=kFALSE;
1374 Bool_t okForLcTopKpi=kTRUE;
1375 Int_t pidLcStatus=3;
1379 okForLcTopKpi=kFALSE;
1383 okForLcTopKpi=kFALSE;
1387 okForLcTopKpi=kTRUE;
1392 okForLcTopKpi=kTRUE;
1397 Bool_t okForDsToKKpi=kTRUE;
1400 !TESTBIT(seleFlags[iTrkN2],
kBitKaonCompat) ) okForDsToKKpi=kFALSE;
1412 dcap1n2 = postrack1->GetDCA(negtrack2,
fBzkG,xdummy,ydummy);
1413 if(dcap1n2>dcaMax) { negtrack2=0;
continue; }
1414 dcan1n2 = negtrack1->GetDCA(negtrack2,
fBzkG,xdummy,ydummy);
1415 if(dcan1n2>dcaMax) { negtrack2=0;
continue; }
1417 threeTrackArray->AddAt(negtrack1,0);
1418 threeTrackArray->AddAt(postrack1,1);
1419 threeTrackArray->AddAt(negtrack2,2);
1424 negtrack2->GetPxPyPz(momneg2);
1425 Double_t pxDau[3]={momneg1[0],mompos1[0],momneg2[0]};
1426 Double_t pyDau[3]={momneg1[1],mompos1[1],momneg2[1]};
1427 Double_t pzDau[3]={momneg1[2],mompos1[2],momneg2[2]};
1432 threeTrackArray->Clear();
1438 twoTrackArray2->AddAt(postrack1,0);
1439 twoTrackArray2->AddAt(negtrack2,1);
1443 twoTrackArray2->Clear();
1450 io3Prong =
Make3Prong(threeTrackArray,event,secVert3PrAOD,dispersion,vertexp1n1,vertexp1n2,dcap1n1,dcap1n2,dcan1n2,okForLcTopKpi,okForDsToKKpi,ok3Prong);
1452 AliAODVertex *v3Prong = 0x0;
1453 if(!
fMakeReducedRHF) v3Prong =
new(verticesHFRef[iVerticesHF++])AliAODVertex(*secVert3PrAOD);
1454 if(!isLikeSign3Prong) {
1463 rd->SetSecondaryVtx(v3Prong);
1464 v3Prong->SetParent(rd);
1465 AddRefs(v3Prong,rd,event,threeTrackArray);
1477 rd->SetSecondaryVtx(v3Prong);
1478 v3Prong->SetParent(rd);
1479 AddRefs(v3Prong,rd,event,threeTrackArray);
1485 if(io3Prong) {
delete io3Prong; io3Prong=NULL;}
1486 if(secVert3PrAOD) {
delete secVert3PrAOD; secVert3PrAOD=NULL;}
1488 threeTrackArray->Clear();
1494 twoTrackArray2->Clear();
1507 AliDebug(1,Form(
" D0->Kpi in event = %d;",
1508 (
Int_t)aodD0toKpiTClArr->GetEntriesFast()));
1511 AliDebug(1,Form(
" JPSI->ee in event = %d;",
1512 (
Int_t)aodJPSItoEleTClArr->GetEntriesFast()));
1515 AliDebug(1,Form(
" Charm->3Prong in event = %d;",
1516 (
Int_t)aodCharm3ProngTClArr->GetEntriesFast()));
1519 AliDebug(1,Form(
" Charm->4Prong in event = %d;\n",
1520 (
Int_t)aodCharm4ProngTClArr->GetEntriesFast()));
1523 AliDebug(1,Form(
" D*->D0pi in event = %d;\n",
1524 (
Int_t)aodDstarTClArr->GetEntriesFast()));
1527 AliDebug(1,Form(
" cascades -> v0 + track in event = %d;\n",
1528 (
Int_t)aodCascadesTClArr->GetEntriesFast()));
1531 AliDebug(1,Form(
" Like-sign 2Prong in event = %d;\n",
1532 (
Int_t)aodLikeSign2ProngTClArr->GetEntriesFast()));
1535 AliDebug(1,Form(
" Like-sign 3Prong in event = %d;\n",
1536 (
Int_t)aodLikeSign3ProngTClArr->GetEntriesFast()));
1540 twoTrackArray1->Delete();
delete twoTrackArray1;
1541 twoTrackArray2->Delete();
delete twoTrackArray2;
1542 twoTrackArrayCasc->Delete();
delete twoTrackArrayCasc;
1543 twoTrackArrayV0->Delete();
delete twoTrackArrayV0;
1544 threeTrackArray->Clear();
1545 threeTrackArray->Delete();
delete threeTrackArray;
1546 fourTrackArray->Delete();
delete fourTrackArray;
1547 delete [] seleFlags; seleFlags=NULL;
1548 if(evtNumber) {
delete [] evtNumber; evtNumber=NULL;}
1549 tracksAtVertex.Delete();
1552 seleTrksArray.Delete();
1563 const AliVEvent *event,
1588 const AliVEvent *event,
1594 Int_t nDg = v->GetNDaughters();
1596 if(nDg) dg = v->GetDaughter(0);
1600 Int_t nTrks = trkArray->GetEntriesFast();
1602 AliExternalTrackParam *track = 0;
1603 AliAODTrack *aodTrack = 0;
1606 for(
Int_t i=0; i<nTrks; i++) {
1607 track = (AliExternalTrackParam*)trkArray->UncheckedAt(i);
1608 id = (
Int_t)track->GetID();
1611 aodTrack =
dynamic_cast<AliAODTrack*
>(
event->GetTrack(
fAODMap[
id]));
1612 if(!aodTrack) AliFatal(
"Not a standard AOD");
1613 v->AddDaughter(aodTrack);
1627 TClonesArray *inputArray=(TClonesArray*)aod->GetList()->FindObject(
"VerticesHF");
1628 if(!inputArray)
return;
1630 AliAODTrack *track = 0;
1631 AliAODVertex *vertex = 0;
1634 for(
Int_t iv=0; iv<inputArray->GetEntriesFast(); iv++) {
1635 vertex = (AliAODVertex*)inputArray->UncheckedAt(iv);
1636 for(
Int_t id=0;
id<vertex->GetNDaughters();
id++) {
1637 track = (AliAODTrack*)vertex->GetDaughter(
id);
1638 if(!track->GetStatus()) needtofix=kTRUE;
1640 if(needtofix)
break;
1643 if(!needtofix)
return;
1646 printf(
"Fixing references\n");
1652 for(
Int_t i=0; i<aod->GetNumberOfTracks(); i++) {
1653 track =
dynamic_cast<AliAODTrack*
>(aod->GetTrack(i));
1654 if(!track) AliFatal(
"Not a standard AOD");
1657 if(track->GetStatus()&AliESDtrack::kITSpureSA)
continue;
1660 if(!(track->GetStatus()&AliESDtrack::kITSin))
continue;
1664 if(!track->GetCovarianceXYZPxPyPz(covtest))
continue;
1668 if (ind>-1 && ind < fAODMapSize)
fAODMap[ind] = i;
1672 Int_t ids[4]={-1,-1,-1,-1};
1673 for(
Int_t iv=0; iv<inputArray->GetEntriesFast(); iv++) {
1675 vertex = (AliAODVertex*)inputArray->UncheckedAt(iv);
1677 Int_t nDgs = vertex->GetNDaughters();
1678 for(
id=0;
id<nDgs;
id++) {
1679 track = (AliAODTrack*)vertex->GetDaughter(
id);
1680 if(track->Charge()==0) {cascade=kTRUE;
continue;}
1681 ids[id]=(
Int_t)track->GetID();
1682 vertex->RemoveDaughter(track);
1684 if(cascade)
continue;
1685 for(
id=0;
id<nDgs;
id++) {
1686 if (ids[
id]>-1 && ids[
id] < fAODMapSize) {
1687 track =
dynamic_cast<AliAODTrack*
>(aod->GetTrack(
fAODMap[ids[
id]]));
1688 if(!track) AliFatal(
"Not a standard AOD");
1689 vertex->AddDaughter(track);
1714 if(!track1)
return kFALSE;
1716 if(!track2)
return kFALSE;
1717 AliESDtrack *postrack1 = 0;
1718 AliESDtrack *negtrack1 = 0;
1719 postrack1 =
new AliESDtrack(track1);
1720 negtrack1 =
new AliESDtrack(track2);
1725 Double_t dca12 = postrack1->GetDCA(negtrack1,
fBzkG,xdummy,ydummy);
1727 const AliVVertex *vprimary =
event->GetPrimaryVertex();
1730 vprimary->GetXYZ(pos);
1731 vprimary->GetCovarianceMatrix(cov);
1732 fV1 =
new AliESDVertex(pos,cov,100.,100,vprimary->GetName());
1733 fV1->GetCovMatrix(cov);
1737 if(!track3)
return kFALSE;
1738 AliESDtrack *esdt3 =
new AliESDtrack(track3);
1742 threeTrackArray->AddAt(postrack1,0);
1743 threeTrackArray->AddAt(negtrack1,1);
1744 threeTrackArray->AddAt(esdt3,2);
1745 dca2 = esdt3->GetDCA(negtrack1,
fBzkG,xdummy,ydummy);
1746 dca3 = esdt3->GetDCA(postrack1,
fBzkG,xdummy,ydummy);
1750 if (!secVert3PrAOD) {
1751 threeTrackArray->Clear();
1752 threeTrackArray->Delete();
delete threeTrackArray;
1754 delete postrack1; postrack1=NULL;
1755 delete negtrack1; negtrack1=NULL;
1756 delete esdt3; esdt3=NULL;
1763 rd=
Make3Prong(threeTrackArray, event, secVert3PrAOD,dispersion, vtxRec, vertexp2n1, dca12, dca2, dca3, rd);
1766 threeTrackArray->Clear();
1767 threeTrackArray->Delete();
delete threeTrackArray;
1769 delete postrack1; postrack1=NULL;
1770 delete negtrack1; negtrack1=NULL;
1771 delete esdt3; esdt3=NULL;
1786 if(!track1)
return kFALSE;
1788 if(!track2)
return kFALSE;
1790 AliESDtrack *esdt1 = 0;
1791 AliESDtrack *esdt2 = 0;
1792 esdt1 =
new AliESDtrack(track1);
1793 esdt2 =
new AliESDtrack(track2);
1795 twoTrackArray1->AddAt(esdt1,0);
1796 twoTrackArray1->AddAt(esdt2,1);
1801 const AliVVertex *vprimary =
event->GetPrimaryVertex();
1804 vprimary->GetXYZ(pos);
1805 vprimary->GetCovarianceMatrix(cov);
1806 fV1 =
new AliESDVertex(pos,cov,100.,100,vprimary->GetName());
1807 fV1->GetCovMatrix(cov);
1813 twoTrackArray1->Clear();
1814 twoTrackArray1->Delete();
delete twoTrackArray1;
1816 delete esdt1; esdt1=NULL;
1817 delete esdt2; esdt2=NULL;
1821 Bool_t okD0FromDstar=kFALSE;
1824 rd=
Make2Prong(twoTrackArray1, event, vtxRec, dca12, okD0, okJPSI, okD0FromDstar,refill,rd);
1828 twoTrackArray1->Clear();
1829 twoTrackArray1->Delete();
delete twoTrackArray1;
1830 delete esdt1; esdt1=NULL;
1831 delete esdt2; esdt2=NULL;
1842 AliAODTrack *trackB =(AliAODTrack*)event->GetTrack(
fAODMap[rCasc->
GetProngID(0)]);
1843 if(!trackB)
return kFALSE;
1845 AliNeutralTrackParam *trackV0=NULL;
1851 TClonesArray *inputArrayD0=(TClonesArray*)event->GetList()->FindObject(
"D0toKpi");
1852 if(!inputArrayD0)
return kFALSE;
1854 if(!trackD0)
return kFALSE;
1857 trackV0 =
new AliNeutralTrackParam(trackD0);
1861 if(!v0)
return kFALSE;
1863 const AliVTrack *trackVV0 =
dynamic_cast<const AliVTrack*
>(v0);
1864 if(trackVV0) trackV0 =
new AliNeutralTrackParam(trackVV0);
1867 AliESDtrack *esdB =
new AliESDtrack(trackB);
1869 twoTrackArrayCasc->AddAt(esdB,0);
1870 twoTrackArrayCasc->AddAt(trackV0,1);
1873 const AliVVertex *vprimary =
event->GetPrimaryVertex();
1877 vprimary->GetXYZ(pos);
1878 vprimary->GetCovarianceMatrix(cov);
1879 fV1 =
new AliESDVertex(pos,cov,100.,100,vprimary->GetName());
1880 fV1->GetCovMatrix(cov);
1883 AliAODVertex *vtxCasc = 0x0;
1886 Double_t dispersion, xdummy, ydummy;
1887 dca = esdB->GetDCA(trackV0,
fBzkG,xdummy,ydummy);
1891 vtxCasc =
new AliAODVertex(pos,cov,chi2perNDF,0x0,-1,AliAODVertex::kUndef,2);
1894 twoTrackArrayCasc->Clear();
1895 twoTrackArrayCasc->Delete();
delete twoTrackArrayCasc;
1897 delete esdB; esdB=NULL;
1898 delete vtxCasc;vtxCasc=NULL;
1900 delete trackV0; trackV0=NULL;
1906 vtxCasc->SetParent(rCasc);
1907 rCasc->SetSecondaryVtx(vtxCasc);
1909 if(DStar)vtxCasc->AddDaughter(trackD0);
1910 else vtxCasc->AddDaughter(v0);
1915 Double_t px[2],py[2],pz[2],d0[2],d0err[2];
1917 esdB->PropagateToDCA(vtxCasc,
fBzkG,kVeryBig);
1918 trackV0->PropagateToDCA(vtxCasc,
fBzkG,kVeryBig);
1920 esdB->GetPxPyPz(momentum);
1921 px[0] = momentum[0]; py[0] = momentum[1]; pz[0] = momentum[2];
1922 trackV0->GetPxPyPz(momentum);
1923 px[1] = momentum[0]; py[1] = momentum[1]; pz[1] = momentum[2];
1925 AliAODVertex *primVertexAOD =
PrimaryVertex(twoTrackArrayCasc,event);
1928 delete vtxCasc; vtxCasc=NULL;
1929 twoTrackArrayCasc->Clear();
1930 twoTrackArrayCasc->Delete();
delete twoTrackArrayCasc;
1931 delete esdB; esdB=NULL;
1932 delete trackV0; trackV0=NULL;
1937 esdB->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
1939 d0err[0] = TMath::Sqrt(covd0z0[0]);
1940 trackV0->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
1942 d0err[1] = TMath::Sqrt(covd0z0[0]);
1943 rCasc->SetPxPyPzProngs(2,px,py,pz);
1945 rCasc->Setd0Prongs(2,d0);
1948 rCasc->SetCharge(esdB->Charge());
1950 Double_t esdpid0[5]={0.,0.,0.,0.,0.};
1951 if(esdB->GetStatus()&AliESDtrack::kESDpid) esdB->GetESDpid(esdpid0);
1952 Double_t esdpid1[5]={0.,0.,0.,0.,0.};
1954 for(
Int_t i=0;i<5;i++) {
1955 esdpid[i] = esdpid0[i];
1956 esdpid[5+i] = esdpid1[i];
1958 rCasc->SetPID(2,esdpid);
1963 if(primVertexAOD) {
delete primVertexAOD; primVertexAOD=NULL;}
1964 twoTrackArrayCasc->Clear();
1965 twoTrackArrayCasc->Delete();
delete twoTrackArrayCasc;
1966 delete esdB; esdB=NULL;
1967 delete trackV0; trackV0=NULL;
1985 AliAODTrack *trackB =
dynamic_cast<AliAODTrack*
> (rc->
GetBachelor());
1986 if (!trackB)
return kFALSE;
1988 AliAODv0 *v0 =
dynamic_cast<AliAODv0*
> (rc->
Getv0());
1989 if (!v0)
return kFALSE;
1993 AliESDtrack *esdB =
new AliESDtrack(trackB);
1994 if (!esdB)
return kFALSE;
1996 const AliVTrack *trackVV0 =
dynamic_cast<const AliVTrack*
>(v0);
1997 if (!trackVV0)
return kFALSE;
1999 AliNeutralTrackParam *trackV0 =
new AliNeutralTrackParam(trackVV0);
2000 if (!trackV0)
return kFALSE;
2003 twoTrackArrayCasc->AddAt(esdB, 0);
2004 twoTrackArrayCasc->AddAt(trackV0, 1);
2007 Double_t dispersion, xdummy, ydummy, pos[3], cov[6];
2015 const AliVVertex *vprimary =
event->GetPrimaryVertex();
2016 vprimary->GetXYZ(pos);
2017 vprimary->GetCovarianceMatrix(cov);
2018 fV1 =
new AliESDVertex(pos,cov,100.,100,vprimary->GetName());
2025 Double_t dca = esdB->GetDCA(trackV0,
fBzkG, xdummy, ydummy);
2029 twoTrackArrayCasc->Clear();
2030 twoTrackArrayCasc->Delete();
delete twoTrackArrayCasc;
2032 delete esdB; esdB=0;
2033 delete vtxCasc; vtxCasc=0;
2034 delete trackV0; trackV0=0;
2041 vtxCasc->SetParent(rc);
2042 rc->SetSecondaryVtx(vtxCasc);
2044 vtxCasc->AddDaughter(v0);
2049 Double_t momentum[3], px[2], py[2], pz[2], d0[2], d0err[2], d0z0[2], covd0z0[3];
2050 esdB->PropagateToDCA(vtxCasc,
fBzkG, kVeryBig);
2051 trackV0->PropagateToDCA(vtxCasc,
fBzkG, kVeryBig);
2052 esdB->GetPxPyPz(momentum);
2053 px[0] = momentum[0]; py[0] = momentum[1]; pz[0] = momentum[2];
2054 trackV0->GetPxPyPz(momentum);
2055 px[1] = momentum[0]; py[1] = momentum[1]; pz[1] = momentum[2];
2059 AliAODVertex *primVertexAOD =
PrimaryVertex(twoTrackArrayCasc, event);
2060 if (!primVertexAOD) {
2061 twoTrackArrayCasc->Clear();
2062 twoTrackArrayCasc->Delete();
delete twoTrackArrayCasc;
2064 delete esdB; esdB=0;
2065 delete vtxCasc; vtxCasc=0;
2066 delete trackV0; trackV0=0;
2071 esdB->PropagateToDCA(primVertexAOD,
fBzkG, kVeryBig, d0z0, covd0z0);
2073 d0err[0] = TMath::Sqrt(covd0z0[0]);
2074 trackV0->PropagateToDCA(primVertexAOD,
fBzkG, kVeryBig, d0z0, covd0z0);
2076 d0err[1] = TMath::Sqrt(covd0z0[0]);
2081 Double_t esdpid0[5] = {0., 0., 0., 0., 0.};
2082 Double_t esdpid1[5] = {0., 0., 0., 0., 0.};
2083 if (esdB->GetStatus()&AliESDtrack::kESDpid) esdB->GetESDpid(esdpid0);
2084 for (
Int_t ipid=0; ipid<5; ipid++) {
2085 esdpid[ipid] = esdpid0[ipid];
2086 esdpid[5+ipid] = esdpid1[ipid];
2093 rc->SetPxPyPzProngs(2, px, py, pz);
2094 rc->Setd0Prongs(2, d0);
2096 rc->SetCharge(esdB->Charge());
2097 rc->SetPID(2, esdpid);
2102 twoTrackArrayCasc->Clear();
2103 twoTrackArrayCasc->Delete();
delete twoTrackArrayCasc;
2105 delete primVertexAOD; primVertexAOD=0;
2106 delete esdB; esdB=0;
2107 delete trackV0; trackV0=0;
2115 TObjArray *twoTrackArray,AliVEvent *event,
2116 AliAODVertex *secVert,
2124 UInt_t ntref=TProcessID::GetObjectCount();
2126 AliFatal(Form(
"Number of TRef created (=%d), close to limit (16777216)",ntref));
2131 Bool_t dummy1,dummy2,dummy3;
2137 dummy1,dummy2,dummy3);
2138 if(!theCascade)
return 0x0;
2141 AliESDtrack *trackPi = (AliESDtrack*)twoTrackArray->UncheckedAt(0);
2142 theCascade->SetCharge(trackPi->Charge());
2150 AliAODTrack* trackPiAOD=
dynamic_cast<AliAODTrack*
>(
event->GetTrack(
fAODMap[idSoftPi]));
2151 if(!trackPiAOD) AliFatal(
"Not a standard AOD");
2152 tmpCascade->GetSecondaryVtx()->AddDaughter(trackPiAOD);
2155 tmpCascade->GetSecondaryVtx()->AddDaughter(trackPi);
2157 tmpCascade->GetSecondaryVtx()->AddDaughter(rd2Prong);
2159 AliAODVertex *primVertexAOD=0;
2171 tmpCascade->GetSecondaryVtx()->RemoveDaughters();
2173 delete tmpCascade; tmpCascade=NULL;
2177 if(primVertexAOD) {
delete primVertexAOD; primVertexAOD=NULL;}
2187 TObjArray *twoTrackArray,AliVEvent *event,
2188 AliAODVertex *secVert,
2196 UInt_t ntref=TProcessID::GetObjectCount();
2198 AliFatal(Form(
"Number of TRef created (=%d), close to limit (16777216)",ntref));
2203 AliESDtrack *postrack = (AliESDtrack*)twoTrackArray->UncheckedAt(0);
2204 AliESDtrack *negtrack = (AliESDtrack*)twoTrackArray->UncheckedAt(1);
2206 postrack->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2207 negtrack->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2209 postrack->GetPxPyPz(momentum);
2210 px[0] = momentum[0]; py[0] = momentum[1]; pz[0] = momentum[2];
2211 negtrack->GetPxPyPz(momentum);
2212 px[1] = momentum[0]; py[1] = momentum[1]; pz[1] = momentum[2];
2218 if(!presel)
return 0x0;
2221 okCascades = kFALSE;
2222 Bool_t dummy1,dummy2,dummy3;
2228 dummy1,dummy2,dummy3);
2229 if(!theCascade)
return 0x0;
2232 AliESDtrack *trackBachelor = (AliESDtrack*)twoTrackArray->UncheckedAt(0);
2233 theCascade->SetCharge(trackBachelor->Charge());
2240 Int_t idBachelor=(
Int_t)trackBachelor->GetID();
2241 if (idBachelor > -1 && idBachelor <
fAODMapSize) {
2242 AliAODTrack* trackBachelorAOD=
dynamic_cast<AliAODTrack*
>(
event->GetTrack(
fAODMap[idBachelor]));
2243 if(!trackBachelorAOD) AliFatal(
"Not a standard AOD");
2244 tmpCascade->GetSecondaryVtx()->AddDaughter(trackBachelorAOD);
2247 tmpCascade->GetSecondaryVtx()->AddDaughter(trackBachelor);
2249 tmpCascade->GetSecondaryVtx()->AddDaughter(v0);
2251 AliAODVertex *primVertexAOD=0;
2255 if(!primVertexAOD) primVertexAOD = (AliAODVertex*)event->GetPrimaryVertex();
2282 tmpCascade->GetSecondaryVtx()->RemoveDaughters();
2284 delete tmpCascade; tmpCascade=NULL;
2285 if(primVertexAOD) {
delete primVertexAOD; primVertexAOD=NULL;}
2293 TObjArray *twoTrackArray,AliVEvent *event,
2294 AliAODVertex *secVert,
Double_t dca,
2302 okD0=kFALSE; okJPSI=kFALSE; okD0fromDstar=kFALSE;
2304 UInt_t ntref=TProcessID::GetObjectCount();
2306 AliFatal(Form(
"Number of TRef created (=%d), close to limit (16777216)",ntref));
2309 Double_t px[2],py[2],pz[2],d0[2],d0err[2];
2310 AliESDtrack *postrack = (AliESDtrack*)twoTrackArray->UncheckedAt(0);
2311 AliESDtrack *negtrack = (AliESDtrack*)twoTrackArray->UncheckedAt(1);
2314 postrack->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2315 negtrack->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2318 postrack->GetPxPyPz(momentum);
2319 px[0] = momentum[0]; py[0] = momentum[1]; pz[0] = momentum[2];
2320 negtrack->GetPxPyPz(momentum);
2321 px[1] = momentum[0]; py[1] = momentum[1]; pz[1] = momentum[2];
2336 AliAODVertex *primVertexAOD =
PrimaryVertex(twoTrackArray,event);
2337 if(!primVertexAOD)
return 0x0;
2340 postrack->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2342 d0err[0] = TMath::Sqrt(covd0z0[0]);
2343 negtrack->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2345 d0err[1] = TMath::Sqrt(covd0z0[0]);
2353 if(postrack->Charge()!=0 && negtrack->Charge()!=0) {
2377 the2Prong->SetSecondaryVtx(secVert);
2378 secVert->SetParent(the2Prong);
2381 the2Prong->SetPxPyPzProngs(2,px,py,pz);
2382 the2Prong->SetDCA(dca);
2383 the2Prong->Setd0Prongs(2,d0);
2385 the2Prong->SetCharge(0);
2387 delete primVertexAOD; primVertexAOD=NULL;
2395 Double_t esdpid0[5]={0.,0.,0.,0.,0.};
2396 if(postrack->GetStatus()&AliESDtrack::kESDpid) postrack->GetESDpid(esdpid0);
2397 Double_t esdpid1[5]={0.,0.,0.,0.,0.};
2398 if(negtrack->GetStatus()&AliESDtrack::kESDpid) negtrack->GetESDpid(esdpid1);
2400 for(
Int_t i=0;i<5;i++) {
2401 esdpid[i] = esdpid0[i];
2402 esdpid[5+i] = esdpid1[i];
2404 the2Prong->SetPID(2,esdpid);
2409 TObjArray *threeTrackArray,AliVEvent *event,
2410 AliAODVertex *secVert,
Double_t dispersion,
2411 const AliAODVertex *vertexp1n1,
const AliAODVertex *vertexp2n1,
2421 UInt_t ntref=TProcessID::GetObjectCount();
2423 AliFatal(Form(
"Number of TRef created (=%d), close to limit (16777216)",ntref));
2427 if(!secVert || !vertexp1n1 || !vertexp2n1)
return 0x0;
2429 Double_t px[3],py[3],pz[3],d0[3],d0err[3];
2433 AliESDtrack *postrack1 = (AliESDtrack*)threeTrackArray->UncheckedAt(0);
2434 AliESDtrack *negtrack = (AliESDtrack*)threeTrackArray->UncheckedAt(1);
2435 AliESDtrack *postrack2 = (AliESDtrack*)threeTrackArray->UncheckedAt(2);
2437 postrack1->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2438 negtrack->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2439 postrack2->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2440 postrack1->GetPxPyPz(momentum);
2441 px[0] = momentum[0]; py[0] = momentum[1]; pz[0] = momentum[2];
2442 negtrack->GetPxPyPz(momentum);
2443 px[1] = momentum[0]; py[1] = momentum[1]; pz[1] = momentum[2];
2444 postrack2->GetPxPyPz(momentum);
2445 px[2] = momentum[0]; py[2] = momentum[1]; pz[2] = momentum[2];
2457 AliAODVertex *primVertexAOD =
PrimaryVertex(threeTrackArray,event);
2458 if(!primVertexAOD)
return 0x0;
2461 postrack1->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2463 d0err[0] = TMath::Sqrt(covd0z0[0]);
2464 negtrack->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2466 d0err[1] = TMath::Sqrt(covd0z0[0]);
2467 postrack2->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2469 d0err[2] = TMath::Sqrt(covd0z0[0]);
2473 Double_t pos[3]; primVertexAOD->GetXYZ(pos);
2474 Double_t dca[3]={dcap1n1,dcap2n1,dcap1p2};
2475 Double_t dist12=TMath::Sqrt((vertexp1n1->GetX()-pos[0])*(vertexp1n1->GetX()-pos[0])+(vertexp1n1->GetY()-pos[1])*(vertexp1n1->GetY()-pos[1])+(vertexp1n1->GetZ()-pos[2])*(vertexp1n1->GetZ()-pos[2]));
2476 Double_t dist23=TMath::Sqrt((vertexp2n1->GetX()-pos[0])*(vertexp2n1->GetX()-pos[0])+(vertexp2n1->GetY()-pos[1])*(vertexp2n1->GetY()-pos[1])+(vertexp2n1->GetZ()-pos[2])*(vertexp2n1->GetZ()-pos[2]));
2481 AliAODRecoDecayHF3Prong *the3Prong =
new AliAODRecoDecayHF3Prong(0x0,px,py,pz,d0,d0err,dca,dispersion,dist12,dist23,charge);
2484 AliAODVertex* ownsecv=secVert->CloneWithoutRefs();
2485 the3Prong->SetOwnSecondaryVtx(ownsecv);
2489 delete primVertexAOD; primVertexAOD=NULL;
2525 the3Prong->SetSecondaryVtx(secVert);
2530 Double_t esdpid0[5]={0.,0.,0.,0.,0.};
2531 if(postrack1->GetStatus()&AliESDtrack::kESDpid) postrack1->GetESDpid(esdpid0);
2532 Double_t esdpid1[5]={0.,0.,0.,0.,0.};
2533 if(negtrack->GetStatus()&AliESDtrack::kESDpid) negtrack->GetESDpid(esdpid1);
2534 Double_t esdpid2[5]={0.,0.,0.,0.,0.};
2535 if(postrack2->GetStatus()&AliESDtrack::kESDpid) postrack2->GetESDpid(esdpid2);
2538 for(
Int_t i=0;i<5;i++) {
2539 esdpid[i] = esdpid0[i];
2540 esdpid[5+i] = esdpid1[i];
2541 esdpid[10+i] = esdpid2[i];
2543 the3Prong->SetPID(3,esdpid);
2549 TObjArray *threeTrackArray,AliVEvent *event,
2550 AliAODVertex *secVert,
Double_t dispersion,
2551 Double32_t dist12, Double32_t dist23,
2564 UInt_t ntref=TProcessID::GetObjectCount();
2566 AliFatal(Form(
"Number of TRef created (=%d), close to limit (16777216)",ntref));
2569 Double_t px[3],py[3],pz[3],d0[3],d0err[3];
2573 AliESDtrack *postrack1 = (AliESDtrack*)threeTrackArray->UncheckedAt(0);
2574 AliESDtrack *negtrack = (AliESDtrack*)threeTrackArray->UncheckedAt(1);
2575 AliESDtrack *postrack2 = (AliESDtrack*)threeTrackArray->UncheckedAt(2);
2577 postrack1->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2578 negtrack->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2579 postrack2->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2580 postrack1->GetPxPyPz(momentum);
2581 px[0] = momentum[0]; py[0] = momentum[1]; pz[0] = momentum[2];
2582 negtrack->GetPxPyPz(momentum);
2583 px[1] = momentum[0]; py[1] = momentum[1]; pz[1] = momentum[2];
2584 postrack2->GetPxPyPz(momentum);
2585 px[2] = momentum[0]; py[2] = momentum[1]; pz[2] = momentum[2];
2587 AliAODVertex *primVertexAOD =
PrimaryVertex(threeTrackArray,event);
2588 if(!primVertexAOD)
return 0x0;
2590 postrack1->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2592 d0err[0] = TMath::Sqrt(covd0z0[0]);
2593 negtrack->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2595 d0err[1] = TMath::Sqrt(covd0z0[0]);
2596 postrack2->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2598 d0err[2] = TMath::Sqrt(covd0z0[0]);
2600 Double_t pos[3]; primVertexAOD->GetXYZ(pos);
2601 Double_t dca[3]={dcap1n1,dcap2n1,dcap1p2};
2604 rd->SetSecondaryVtx(secVert);
2605 secVert->SetParent(rd);
2608 rd->SetPxPyPzProngs(3,px,py,pz);
2610 rd->Setd0Prongs(3,d0);
2612 rd->SetCharge(charge);
2615 delete primVertexAOD; primVertexAOD=NULL;
2622 Double_t esdpid0[5]={0.,0.,0.,0.,0.};
2623 if(postrack1->GetStatus()&AliESDtrack::kESDpid) postrack1->GetESDpid(esdpid0);
2624 Double_t esdpid1[5]={0.,0.,0.,0.,0.};
2625 if(negtrack->GetStatus()&AliESDtrack::kESDpid) negtrack->GetESDpid(esdpid1);
2626 Double_t esdpid2[5]={0.,0.,0.,0.,0.};
2627 if(postrack2->GetStatus()&AliESDtrack::kESDpid) postrack2->GetESDpid(esdpid2);
2630 for(
Int_t i=0;i<5;i++) {
2631 esdpid[i] = esdpid0[i];
2632 esdpid[5+i] = esdpid1[i];
2633 esdpid[10+i] = esdpid2[i];
2635 rd->SetPID(3,esdpid);
2640 TObjArray *fourTrackArray,AliVEvent *event,
2641 AliAODVertex *secVert,
2642 const AliAODVertex *vertexp1n1,
2643 const AliAODVertex *vertexp1n1p2,
2653 UInt_t ntref=TProcessID::GetObjectCount();
2655 AliFatal(Form(
"Number of TRef created (=%d), close to limit (16777216)",ntref));
2659 if(!secVert || !vertexp1n1 || !vertexp1n1p2)
return 0x0;
2661 Double_t px[4],py[4],pz[4],d0[4],d0err[4];
2663 AliESDtrack *postrack1 = (AliESDtrack*)fourTrackArray->UncheckedAt(0);
2664 AliESDtrack *negtrack1 = (AliESDtrack*)fourTrackArray->UncheckedAt(1);
2665 AliESDtrack *postrack2 = (AliESDtrack*)fourTrackArray->UncheckedAt(2);
2666 AliESDtrack *negtrack2 = (AliESDtrack*)fourTrackArray->UncheckedAt(3);
2668 postrack1->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2669 negtrack1->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2670 postrack2->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2671 negtrack2->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2674 postrack1->GetPxPyPz(momentum);
2675 px[0] = momentum[0]; py[0] = momentum[1]; pz[0] = momentum[2];
2676 negtrack1->GetPxPyPz(momentum);
2677 px[1] = momentum[0]; py[1] = momentum[1]; pz[1] = momentum[2];
2678 postrack2->GetPxPyPz(momentum);
2679 px[2] = momentum[0]; py[2] = momentum[1]; pz[2] = momentum[2];
2680 negtrack2->GetPxPyPz(momentum);
2681 px[3] = momentum[0]; py[3] = momentum[1]; pz[3] = momentum[2];
2696 AliAODVertex *primVertexAOD =
PrimaryVertex(fourTrackArray,event);
2697 if(!primVertexAOD)
return 0x0;
2700 postrack1->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2702 d0err[0] = TMath::Sqrt(covd0z0[0]);
2703 negtrack1->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2705 d0err[1] = TMath::Sqrt(covd0z0[0]);
2706 postrack2->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2708 d0err[2] = TMath::Sqrt(covd0z0[0]);
2709 negtrack2->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2711 d0err[3] = TMath::Sqrt(covd0z0[0]);
2715 Double_t pos[3]; primVertexAOD->GetXYZ(pos);
2716 Double_t dca[6]={dcap1n1,0.,dcap1n2,dcap2n1,0.,dcap2n2};
2717 Double_t dist12=TMath::Sqrt((vertexp1n1->GetX()-pos[0])*(vertexp1n1->GetX()-pos[0])+(vertexp1n1->GetY()-pos[1])*(vertexp1n1->GetY()-pos[1])+(vertexp1n1->GetZ()-pos[2])*(vertexp1n1->GetZ()-pos[2]));
2718 Double_t dist3=TMath::Sqrt((vertexp1n1p2->GetX()-pos[0])*(vertexp1n1p2->GetX()-pos[0])+(vertexp1n1p2->GetY()-pos[1])*(vertexp1n1p2->GetY()-pos[1])+(vertexp1n1p2->GetZ()-pos[2])*(vertexp1n1p2->GetZ()-pos[2]));
2719 Double_t dist4=TMath::Sqrt((secVert->GetX()-pos[0])*(secVert->GetX()-pos[0])+(secVert->GetY()-pos[1])*(secVert->GetY()-pos[1])+(secVert->GetZ()-pos[2])*(secVert->GetZ()-pos[2]));
2721 AliAODRecoDecayHF4Prong *the4Prong =
new AliAODRecoDecayHF4Prong(secVert,px,py,pz,d0,d0err,dca,dist12,dist3,dist4,charge);
2726 delete primVertexAOD; primVertexAOD=NULL;
2737 Double_t esdpid0[5]={0.,0.,0.,0.,0.};
2738 if(postrack1->GetStatus()&AliESDtrack::kESDpid) postrack1->GetESDpid(esdpid0);
2739 Double_t esdpid1[5]={0.,0.,0.,0.,0.};
2740 if(negtrack1->GetStatus()&AliESDtrack::kESDpid) negtrack1->GetESDpid(esdpid1);
2741 Double_t esdpid2[5]={0.,0.,0.,0.,0.};
2742 if(postrack2->GetStatus()&AliESDtrack::kESDpid) postrack2->GetESDpid(esdpid2);
2743 Double_t esdpid3[5]={0.,0.,0.,0.,0.};
2744 if(negtrack2->GetStatus()&AliESDtrack::kESDpid) negtrack2->GetESDpid(esdpid3);
2747 for(
Int_t i=0;i<5;i++) {
2748 esdpid[i] = esdpid0[i];
2749 esdpid[5+i] = esdpid1[i];
2750 esdpid[10+i] = esdpid2[i];
2751 esdpid[15+i] = esdpid3[i];
2753 the4Prong->SetPID(4,esdpid);
2764 AliAODTrack *track=0;
2766 for(
Int_t i=0; i<aod->GetNumberOfTracks(); i++) {
2767 track =
dynamic_cast<AliAODTrack*
>(aod->GetTrack(i));
2768 if(!track) AliFatal(
"Not a standard AOD");
2770 if(track->GetStatus()&AliESDtrack::kITSpureSA)
continue;
2773 if(!(track->GetStatus()&AliESDtrack::kITSin))
continue;
2777 if(!track->GetCovarianceXYZPxPyPz(covtest))
continue;
2781 if (ind>-1 && ind < fAODMapSize)
fAODMap[ind] = i;
2787 AliVEvent *event)
const 2792 AliESDVertex *vertexESD = 0;
2793 AliAODVertex *vertexAOD = 0;
2799 vertexESD =
new AliESDVertex(*
fV1);
2804 Int_t nTrks = trkArray->GetEntriesFast();
2805 AliVertexerTracks *vertexer =
new AliVertexerTracks(event->GetMagneticField());
2810 if(strstr(
fV1->GetTitle(),
"VertexerTracksWithConstraint")) {
2812 event->GetDiamondCovXY(diamondcovxy);
2813 Double_t pos[3]={
event->GetDiamondX(),
event->GetDiamondY(),0.};
2814 Double_t cov[6]={diamondcovxy[0],diamondcovxy[1],diamondcovxy[2],0.,0.,10.*10.};
2815 AliESDVertex *diamond =
new AliESDVertex(pos,cov,1.,1);
2816 vertexer->SetVtxStart(diamond);
2817 delete diamond; diamond=NULL;
2818 if(strstr(
fV1->GetTitle(),
"VertexerTracksWithConstraintOnlyFitter"))
2819 vertexer->SetOnlyFitter();
2821 Int_t skipped[1000];
2822 Int_t nTrksToSkip=0,id;
2823 AliExternalTrackParam *t = 0;
2824 for(
Int_t i=0; i<nTrks; i++) {
2825 t = (AliExternalTrackParam*)trkArray->UncheckedAt(i);
2826 id = (
Int_t)t->GetID();
2828 skipped[nTrksToSkip++] = id;
2834 for(
Int_t j=0; j<
event->GetNumberOfTracks(); j++) {
2835 AliVTrack *vtrack = (AliVTrack*)event->GetTrack(j);
2836 if(!vtrack->GetCovarianceXYZPxPyPz(covtest)) {
2837 id = (
Int_t)vtrack->GetID();
2839 skipped[nTrksToSkip++] = id;
2843 for(
Int_t ijk=nTrksToSkip; ijk<1000; ijk++) skipped[ijk]=-1;
2845 vertexer->SetSkipTracks(nTrksToSkip,skipped);
2846 vertexESD = (AliESDVertex*)vertexer->FindPrimaryVertex(event);
2853 AliESDtrack *esdTrack = 0;
2855 for(
Int_t i=0; i<nTrks; i++) {
2856 t = (AliESDtrack*)trkArray->UncheckedAt(i);
2857 esdTrack =
new AliESDtrack(*t);
2858 rmArray.AddLast(esdTrack);
2859 if(esdTrack->GetID()>=0) {
2860 rmId[i]=(
UShort_t)esdTrack->GetID();
2865 Float_t diamondxy[2]={
static_cast<Float_t>(
event->GetDiamondX()),static_cast<Float_t>(event->GetDiamondY())};
2866 vertexESD = vertexer->RemoveTracksFromVertex(
fV1,&rmArray,rmId,diamondxy);
2867 delete [] rmId; rmId=NULL;
2872 if(!vertexESD)
return vertexAOD;
2873 if(vertexESD->GetNContributors()<=0) {
2875 delete vertexESD; vertexESD=NULL;
2879 delete vertexer; vertexer=NULL;
2885 vertexESD->GetXYZ(pos);
2886 vertexESD->GetCovMatrix(cov);
2887 chi2perNDF = vertexESD->GetChi2toNDF();
2888 delete vertexESD; vertexESD=NULL;
2890 vertexAOD =
new AliAODVertex(pos,cov,chi2perNDF);
2901 printf(
"Secondary vertex with Kalman filter package (AliKFParticle)\n");
2903 printf(
"Secondary vertex with AliVertexerTracks\n");
2908 printf(
"Reconstruct D0->Kpi candidates with cuts:\n");
2912 printf(
"Reconstruct D*->D0pi candidates with cuts:\n");
2914 printf(
" Reconstruct a secondary vertex for the D*\n");
2916 printf(
" Assume the D* comes from the primary vertex\n");
2921 printf(
"Reconstruct J/psi from B candidates with cuts:\n");
2925 printf(
"Reconstruct 3 prong candidates.\n");
2926 printf(
" D+->Kpipi cuts:\n");
2928 printf(
" Ds->KKpi cuts:\n");
2930 printf(
" Lc->pKpi cuts:\n");
2934 printf(
"Reconstruct 4 prong candidates.\n");
2935 printf(
" D0->Kpipipi cuts:\n");
2939 printf(
"Reconstruct cascade candidates formed with v0s.\n");
2940 printf(
" Lc -> k0s P & Lc -> L Pi cuts:\n");
2942 printf(
" D+ -> K0s pi cuts:\n");
2944 printf(
" Ds -> K0s K cuts:\n");
2957 AliESDVertex *vertexESD = 0;
2958 AliAODVertex *vertexAOD = 0;
2963 vertexESD = (AliESDVertex*)
fVertexerTracks->VertexForSelectedESDTracks(trkArray);
2965 if(!vertexESD)
return vertexAOD;
2967 if(vertexESD->GetNContributors()!=trkArray->GetEntriesFast()) {
2969 delete vertexESD; vertexESD=NULL;
2973 Double_t vertRadius2=vertexESD->GetX()*vertexESD->GetX()+vertexESD->GetY()*vertexESD->GetY();
2976 delete vertexESD; vertexESD=NULL;
2982 AliKFParticle::SetField(
fBzkG);
2984 AliKFVertex vertexKF;
2986 Int_t nTrks = trkArray->GetEntriesFast();
2987 for(
Int_t i=0; i<nTrks; i++) {
2988 AliESDtrack *esdTrack = (AliESDtrack*)trkArray->At(i);
2989 AliKFParticle daughterKF(*esdTrack,211);
2990 vertexKF.AddDaughter(daughterKF);
2992 vertexESD =
new AliESDVertex(vertexKF.Parameters(),
2993 vertexKF.CovarianceMatrix(),
2995 vertexKF.GetNContributors());
3001 vertexESD->GetXYZ(pos);
3002 vertexESD->GetCovMatrix(cov);
3003 chi2perNDF = vertexESD->GetChi2toNDF();
3004 dispersion = vertexESD->GetDispersion();
3005 delete vertexESD; vertexESD=NULL;
3007 Int_t nprongs= (useTRefArray ? 0 : trkArray->GetEntriesFast());
3008 vertexAOD =
new AliAODVertex(pos,cov,chi2perNDF,0x0,-1,AliAODVertex::kUndef,nprongs);
3017 Int_t retval=kFALSE;
3020 for(
Int_t iTrack=0; iTrack<3; iTrack++){
3021 AliESDtrack *track = (AliESDtrack*)trkArray->UncheckedAt(iTrack);
3022 track->GetPxPyPz(momentum);
3023 px[iTrack] = momentum[0]; py[iTrack] = momentum[1]; pz[iTrack] = momentum[2];
3035 Int_t retval=kFALSE;
3039 for(
Int_t iTrack=0; iTrack<4; iTrack++){
3040 AliESDtrack *track = (AliESDtrack*)trkArray->UncheckedAt(iTrack);
3041 track->GetPxPyPz(momentum);
3042 px[iTrack] = momentum[0]; py[iTrack] = momentum[1]; pz[iTrack] = momentum[2];
3054 Int_t retval=kFALSE;
3058 for(
Int_t iTrack=0; iTrack<2; iTrack++){
3059 AliESDtrack *track = (AliESDtrack*)trkArray->UncheckedAt(iTrack);
3060 track->GetPxPyPz(momentum);
3061 px[iTrack] = momentum[0]; py[iTrack] = momentum[1]; pz[iTrack] = momentum[2];
3081 fMassCalc2->SetPxPyPzProngs(nprongs,px,py,pz);
3086 if(
fMassCalc2->Pt2() < minPt*minPt)
return retval;
3091 pdg2[0]=211; pdg2[1]=321;
3093 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3097 pdg2[0]=321; pdg2[1]=211;
3099 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3120 fMassCalc2->SetPxPyPzProngs(nprongs,px,py,pz);
3125 if(
fMassCalc2->Pt2() < minPt*minPt)
return retval;
3131 pdg2[0]=11; pdg2[1]=11;
3133 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3156 fMassCalc3->SetPxPyPzProngs(nprongs,px,py,pz);
3164 if(
fMassCalc3->Pt2() < minPt*minPt)
return retval;
3169 pdg3[0]=211; pdg3[1]=321; pdg3[2]=211;
3171 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3179 pdg3[0]=321; pdg3[1]=321; pdg3[2]=211;
3181 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3185 pdg3[0]=211; pdg3[1]=321; pdg3[2]=321;
3187 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3196 pdg3[0]=2212; pdg3[1]=321; pdg3[2]=211;
3198 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3204 pdg3[0]=211; pdg3[1]=321; pdg3[2]=2212;
3206 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3229 fMassCalc2->SetPxPyPzProngs(nprongs,px,py,pz);
3234 if(
fMassCalc2->Pt2() < minPt*minPt)
return retval;
3236 pdg2[0]=211; pdg2[1]=421;
3241 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3264 fMassCalc4->SetPxPyPzProngs(nprongs,px,py,pz);
3269 if(
fMassCalc4->Pt2() < minPt*minPt)
return retval;
3275 pdg4[0]=321; pdg4[1]=211; pdg4[2]=211; pdg4[3]=211;
3277 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3282 pdg4[0]=211; pdg4[1]=321; pdg4[2]=211; pdg4[3]=211;
3284 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3289 pdg4[0]=211; pdg4[1]=211; pdg4[2]=321; pdg4[3]=211;
3291 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3296 pdg4[0]=211; pdg4[1]=211; pdg4[2]=211; pdg4[3]=321;
3298 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3319 fMassCalc2->SetPxPyPzProngs(nprongs,px,py,pz);
3322 if(
fMassCalc2->Pt2() < minPt*minPt)
return retval;
3331 pdg2[0] = 2212; pdg2[1] = 310;
3333 if ((minv2 > lolim*lolim) && (minv2 < hilim*hilim)) {
3337 pdg2[0] = 211; pdg2[1] = 3122;
3339 if ((minv2>lolim*lolim) && (minv2<hilim*hilim)) {
3350 pdg2[0] = 211; pdg2[1] = 310;
3352 if ((minv2 > lolim*lolim) && (minv2 < hilim*hilim)) {
3362 pdg2[0] = 321; pdg2[1] = 310;
3364 if ((minv2 > lolim*lolim) && (minv2 < hilim*hilim)) {
3377 UChar_t *seleFlags,
Int_t *evtNumber)
3386 const AliVVertex *vprimary =
event->GetPrimaryVertex();
3394 const Int_t entries =
event->GetNumberOfTracks();
3395 AliCentrality* cent;
3398 fV1 =
new AliESDVertex(*((AliESDVertex*)vprimary));
3401 vprimary->GetXYZ(pos);
3402 vprimary->GetCovarianceMatrix(cov);
3403 fV1 =
new AliESDVertex(pos,cov,100.,100,vprimary->GetName());
3404 if(entries<=0)
return;
3406 memset(indices,0,
sizeof(
UShort_t)*entries);
3413 if(event->GetRunNumber()<244824){
3414 centperc=cent->GetCentralityPercentile(
"V0M");
3416 AliMultSelection *multSelection = (AliMultSelection * ) event->FindListObject(
"MultSelection");
3418 centperc=multSelection->GetMultiplicityPercentile(
"V0M");
3419 Int_t qual = multSelection->GetEvSelCode();
3420 if(qual == 199 ) centperc=0.1;
3423 Bool_t okDisplaced=kFALSE,okSoftPi=kFALSE,okFor3Prong=kFALSE,okBachelor=kFALSE;
3427 for(
Int_t i=0; i<entries; i++) {
3429 track = (AliVTrack*)event->GetTrack(i);
3432 if(track->GetStatus()&AliESDtrack::kITSpureSA)
continue;
3435 if(!(track->GetStatus()&AliESDtrack::kITSin))
continue;
3439 if(track->GetID()<0)
continue;
3443 if(!track->GetCovarianceXYZPxPyPz(covtest))
continue;
3447 AliAODTrack *aodt = (AliAODTrack*)track;
3448 if(aodt->GetUsedForPrimVtxFit()) {
3449 indices[nindices]=aodt->GetID(); nindices++;
3455 AliESDtrack *esdt = 0;
3458 esdt = (AliESDtrack*)track;
3460 esdt =
new AliESDtrack(track);
3464 okDisplaced=kFALSE; okSoftPi=kFALSE; okFor3Prong=kFALSE; okBachelor=kFALSE;
3466 evtNumber[i]=((AliMixedEvent*)event)->EventIndex(i);
3467 const AliVVertex* eventVtx=((AliMixedEvent*)event)->GetEventVertex(i);
3468 Double_t vtxPos[3],primPos[3],primCov[6],trasl[3];
3469 eventVtx->GetXYZ(vtxPos);
3470 vprimary->GetXYZ(primPos);
3471 eventVtx->GetCovarianceMatrix(primCov);
3472 for(
Int_t ind=0;ind<3;ind++){
3473 trasl[ind]=vtxPos[ind]-primPos[ind];
3476 Bool_t isTransl=esdt->Translate(trasl,primCov);
3484 if(
SingleTrkCuts(esdt,centperc,okDisplaced,okSoftPi,okFor3Prong,okBachelor) && nSeleTrks<trkEntries) {
3485 esdt->PropagateToDCA(
fV1,
fBzkG,kVeryBig);
3486 seleTrksArray.AddLast(esdt);
3487 tracksAtVertex.AddLast(
new AliExternalTrackParam(*esdt));
3488 seleFlags[nSeleTrks]=0;
3489 if(okDisplaced) SETBIT(seleFlags[nSeleTrks],
kBitDispl);
3490 if(okFor3Prong) SETBIT(seleFlags[nSeleTrks],
kBit3Prong);
3491 if(okSoftPi) SETBIT(seleFlags[nSeleTrks],
kBitSoftPi);
3492 if(okBachelor) SETBIT(seleFlags[nSeleTrks],
kBitBachelor);
3500 if(nsigmatofPi>-990. && (nsigmatofPi<-fnSigmaTOFPionLow || nsigmatofPi>
fnSigmaTOFPionHi)){
3504 if(nsigmatofK>-990. && (nsigmatofK<-fnSigmaTOFKaonLow || nsigmatofK>
fnSigmaTOFKaonHi)){
3508 if(nsigmatofP>-990. && (nsigmatofP<-fnSigmaTOFProtonLow || nsigmatofP>
fnSigmaTOFProtonHi)){
3515 if(nsigmatpcPi>-990. && (nsigmatpcPi<-fnSigmaTPCPionLow || nsigmatpcPi>
fnSigmaTPCPionHi)){
3519 if(nsigmatpcK>-990. && (nsigmatpcK<-fnSigmaTPCKaonLow || nsigmatpcK>
fnSigmaTPCKaonHi)){
3523 if(nsigmatpcP>-990. && (nsigmatpcP<-fnSigmaTPCProtonLow || nsigmatpcP>
fnSigmaTPCProtonHi)){
3539 vprimary->GetXYZ(pos);
3540 vprimary->GetCovarianceMatrix(cov);
3541 Double_t chi2toNDF = vprimary->GetChi2perNDF();
3542 Int_t ncontr=nindices;
3543 if(!strcmp(vprimary->GetTitle(),
"VertexerTracksWithContraint")) ncontr += 1;
3545 fV1 =
new AliESDVertex(pos,cov,chi2,ncontr,vprimary->GetName());
3546 fV1->SetTitle(vprimary->GetTitle());
3547 fV1->SetIndices(nindices,indices);
3549 if(indices) {
delete [] indices; indices=NULL; }
3574 Bool_t &okBachelor)
const 3581 if (!trk->PropagateToDCA(
fV1,
fBzkG,kVeryBig))
return kFALSE;
3583 trk->RelateToVertex(
fV1,
fBzkG,kVeryBig);
3599 if(selectInfo) okDisplaced=kTRUE;
3613 if(selectInfo) okFor3Prong=kTRUE;
3620 if(selectInfo) okSoftPi=kTRUE;
3628 if(okDisplaced) selectInfo=1;
3631 if(selectInfo) okBachelor=kTRUE;
3633 if(okDisplaced || okSoftPi || okFor3Prong || okBachelor)
return kTRUE;
3648 Double_t vertex[3]; esdV0->GetXYZ(vertex[0],vertex[1],vertex[2]);
3649 AliAODVertex *vertexV0 =
new AliAODVertex(vertex,esdV0->GetChi2V0(),AliAODVertex::kV0,2);
3654 esdV0->PxPyPz(pxpypz);
3655 Double_t cv[21];
for(
int i=0; i<21; i++) cv[i]=0;
3656 AliNeutralTrackParam *trackesdV0 =
new AliNeutralTrackParam(xyz,pxpypz,cv,0);
3663 trackesdV0->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
3664 Double_t dcaV0ToPrimVertex = TMath::Sqrt(covd0z0[0]);
3666 Double_t dcaV0DaughterToPrimVertex[2];
3667 AliExternalTrackParam *posV0track = (AliExternalTrackParam*)twoTrackArrayV0->UncheckedAt(0);
3668 AliExternalTrackParam *negV0track = (AliExternalTrackParam*)twoTrackArrayV0->UncheckedAt(1);
3669 if( !posV0track || !negV0track) {
3670 if(trackesdV0) {
delete trackesdV0; trackesdV0=NULL;}
3672 delete primVertexAOD;
3675 posV0track->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
3678 dcaV0DaughterToPrimVertex[0] = TMath::Sqrt(covd0z0[0]);
3679 negV0track->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
3682 dcaV0DaughterToPrimVertex[1] = TMath::Sqrt(covd0z0[0]);
3683 Double_t dcaV0Daughters = esdV0->GetDcaV0Daughters();
3685 esdV0->GetNPxPyPz(nmom[0],nmom[1],nmom[2]);
3686 esdV0->GetPPxPyPz(pmom[0],pmom[1],pmom[2]);
3688 AliAODv0 *aodV0 =
new AliAODv0(vertexV0,dcaV0Daughters,dcaV0ToPrimVertex,pmom,nmom,dcaV0DaughterToPrimVertex);
3689 aodV0->SetOnFlyStatus(esdV0->GetOnFlyStatus());
3692 delete primVertexAOD;
3701 const Double_t *par=extpar->GetParameter();
3702 const Double_t *cov=extpar->GetCovariance();
3705 esdt->Set(x,alpha,par,cov);
3712 fMassDzero=TDatabasePDG::Instance()->GetParticle(421)->Mass();
3713 fMassDplus=TDatabasePDG::Instance()->GetParticle(411)->Mass();
3714 fMassDs=TDatabasePDG::Instance()->GetParticle(431)->Mass();
3715 fMassLambdaC=TDatabasePDG::Instance()->GetParticle(4122)->Mass();
3716 fMassDstar=TDatabasePDG::Instance()->GetParticle(413)->Mass();
3717 fMassJpsi=TDatabasePDG::Instance()->GetParticle(443)->Mass();
AliAODRecoDecay * fMassCalc4
for 3 prong
AliAODTrack * GetProng(AliVEvent *event, AliAODRecoDecayHF *rd, Int_t iprong)
Bool_t fUsePidTag
upper momentum limit to apply TPC PID
void SetSelectionBit(Int_t i)
selection map
Bool_t CheckCutsConsistency()
void UnsetOwnSecondaryVtx()
void SetupPID(AliVEvent *event)
AliAnalysisFilter * fTrackFilterSoftPi
Track Filter for displaced vertices in PbPb central events (tighter cuts) for 3 prong (D+...
AliVertexerTracks * fVertexerTracks
Float_t GetMassCut(Int_t iPtBin=0) const
AliPIDResponse * fPidResponse
event mixing
AliRDHFCutsDstoK0sK * fCutsDstoK0sK
D+->Kpipi cuts.
AliAODVertex * ReconstructSecondaryVertex(TObjArray *trkArray, Double_t &dispersion, Bool_t useTRefArray=kTRUE) const
Double_t fnSigmaTOFPionHi
Low cut value on n. of sigmas for pi TOF PID.
Double_t fnSigmaTOFProtonHi
Low cut value on n. of sigmas for p TOF PID.
virtual void PrintAll() const
void UnsetOwnPrimaryVtx()
AliAODVertex * PrimaryVertex(const TObjArray *trkArray=0x0, AliVEvent *event=0x0) const
Double_t GetDist12toPrim() const
AliAnalysisFilter * fTrackFilter3prongCentral
Track Filter for displaced vertices in PbPb central events (tighter cuts) for 2 prong (D0->Kpi) ...
AliAnalysisVertexingHF & operator=(const AliAnalysisVertexingHF &source)
virtual void PrintAll() const
Float_t GetMassCut(Int_t iPtBin=0) const
AliRDHFCutsDstoKKpi * fCutsDstoKKpi
Ds->K0s+K.
Int_t IsD0FromDStarSelected(Double_t pt, TObject *obj, Int_t selectionLevel, AliAODEvent *aod) const
Bool_t fSecVtxWithKF
z componenent of field in kG
AliRDHFCutsLctopKpi * fCutsLctopKpi
Ds->KKpi cuts.
Bool_t fRmTrksFromPrimVtx
Bool_t SelectInvMassAndPt3prong(Double_t *px, Double_t *py, Double_t *pz, Int_t pidLcStatus=3)
Int_t fnTrksTotal
triplet fullfilling Lc inv mass selection
Double_t fnSigmaTOFProtonLow
High cut value on n. of sigmas for p TPC PID.
Bool_t fOKInvMassDplus
pair fullfilling Jpsi inv mass selection
Double_t fnSigmaTPCKaonLow
High cut value on n. of sigmas for pi TOF PID.
Bool_t SingleTrkCuts(AliESDtrack *trk, Float_t centralityperc, Bool_t &okDisplaced, Bool_t &okSoftPi, Bool_t &ok3prong, Bool_t &okBachelor) const
Bool_t FillRecoCand(AliVEvent *event, AliAODRecoDecayHF3Prong *rd3)
Bool_t fUseTPCPIDOnlyIfNoTOF
switch use/not use TOF PID
AliRDHFCutsD0toKpi * fCutsD0toKpi
Track Filter for bachelor.
Bool_t fMixEvent
Like-sign triplets.
virtual void DeleteRecoD()
Float_t GetMassCut(Int_t iPtBin=0) const
Bool_t fUseTOFPID
switch use/not use TPC PID
Bool_t fOKInvMassD0to4p
combination fullfilling D* inv mass selection
Bool_t fOKInvMassLc
triplet fullfilling Ds inv mass selection
Float_t GetMassCut(Int_t iPtBin=0) const
Int_t * fAODMap
map between index and ID for AOD tracks
Double_t fnSigmaTPCPionLow
flag to control usage of PID tagging
Bool_t FillRecoCasc(AliVEvent *event, AliAODRecoCascadeHF *rc, Bool_t isDStar, Bool_t recoSecVtx=kFALSE)
virtual Int_t IsSelectedPID(AliAODRecoDecayHF *)
Bool_t fFindVertexForCascades
reconstruct a secondary vertex or assume it's from the primary vertex
Double_t fnSigmaTPCKaonHi
Low cut value on n. of sigmas for K TPC PID.
AliAODPidHF * GetPidHF() const
Bool_t fUseKaonPIDfor3Prong
PID response.
AliRDHFCutsDplustoK0spi * fCutsDplustoK0spi
J/psi->ee cuts.
AliRDHFCutsDplustoKpipi * fCutsDplustoKpipi
D+->K0s+pi.
AliRDHFCutsD0toKpipipi * fCutsD0toKpipipi
Lc –> v0 + bachelor cuts.
virtual Int_t IsSelected(TObject *obj, Int_t selectionLevel)
Bool_t fLikeSign3prong
Like-sign pairs.
Bool_t SelectInvMassAndPtCascade(Double_t *px, Double_t *py, Double_t *pz)
AliAODRecoDecayHF4Prong * Make4Prong(TObjArray *fourTrackArray, AliVEvent *event, AliAODVertex *secVert, const AliAODVertex *vertexp1n1, const AliAODVertex *vertexp1n1p2, Double_t dcap1n1, Double_t dcap1n2, Double_t dcap2n1, Double_t dcap2n2, Bool_t &ok4Prong)
Class for cuts on AOD reconstructed D+->Kpipi.
Float_t GetDCACut(Int_t iPtBin=0) const
Double_t fnSigmaTPCProtonLow
High cut value on n. of sigmas for K TOF PID.
virtual ~AliAnalysisVertexingHF()
void SetParametersAtVertex(AliESDtrack *esdt, const AliExternalTrackParam *extpar) const
Float_t GetMassCut(Int_t iPtBin=0) const
Float_t GetDCACut(Int_t iPtBin=0) const
Double_t fMaxMomForTPCPid
use TPC PID only for tracks that without TOF
virtual Int_t IsSelected(TObject *obj, Int_t selectionLevel)
Int_t GetIsFilled() const
Class for cuts on AOD reconstructed Ds->K0S+K.
Float_t GetMassCut(Int_t iPtBin=0) const
Float_t GetMassCut(Int_t iPtBin=0) const
AliAnalysisFilter * fTrackFilter2prongCentral
Track Filter for displaced vertices.
Double_t fnSigmaTOFKaonLow
High cut value on n. of sigmas for K TPC PID.
Bool_t fCascades
D*->D0pi.
Float_t fMaxCentPercentileForTightCuts
High cut value on n. of sigmas for p TOF PID.
AliAODTrack * GetBachelor() const
Bool_t fOKInvMassDstar
triplet fullfilling Lc inv mass selection
virtual Int_t IsSelected(TObject *obj, Int_t selectionLevel, AliAODEvent *aod)
virtual Int_t IsSelected(TObject *obj, Int_t selectionLevel)
Double_t fBzkG
vertexer, to compute secondary vertices
Float_t GetDCACut(Int_t iPtBin=0) const
Bool_t fUsePIDforLc2V0
PID for Lambdac: 0=no, 1=proton, 2=p and pi.
void SetProngIDs(Int_t nIDs, UShort_t *id)
Class for cuts on AOD reconstructed D+->K0S+pi.
virtual void PrintAll() const
UShort_t GetProngID(Int_t ip) const
Float_t GetMassCut(Int_t iPtBin=0) const
Bool_t fUseKaonPIDforDs
PID for Lambdac 2 V0: 0=no, 1=proton,.
Bool_t fUseTPCPID
Kaon PID usage for Ds.
Bool_t fOKInvMassLctoV0
4tracks fullfilling D0 inv mass selection
void SetPrimaryVtxRef(TObject *vtx)
primary vertex
Double_t GetDist23toPrim() const
void SetOwnPrimaryVtx(const AliAODVertex *vtx)
Bool_t fFindVertexForDstar
pointer to list of cuts for output file
Double_t fnSigmaTOFKaonHi
Low cut value on n. of sigmas for K TOF PID.
AliAODRecoDecay * fMassCalc2
to go faster in PbPb
Float_t GetDCACut(Int_t iPtBin=0) const
void FindCandidates(AliVEvent *event, TClonesArray *aodVerticesHFTClArr, TClonesArray *aodD0toKpiTClArr, TClonesArray *aodJPSItoEleTClArr, TClonesArray *aodCharm3ProngTClArr, TClonesArray *aodCharm4ProngTClArr, TClonesArray *aodDstarTClArr, TClonesArray *aodCascadesTClArr, TClonesArray *aodLikeSign2ProngTClArr, TClonesArray *aodLikeSign3ProngTClArr)
virtual Int_t IsSelected(TObject *obj, Int_t selectionLevel)
void AddDaughterRefs(AliAODVertex *v, const AliVEvent *event, const TObjArray *trkArray) const
Bool_t PreSelect(TObject *obj, AliAODv0 *v0, AliVTrack *bachelorTrack)
Int_t fUsePIDforLc
Kaon PID usage for 3 prongs.
Bool_t IsEventSelected(AliVEvent *event)
Bool_t fLikeSign
cascades, Lc –> v0+track, D+ –> K0s+Pi, Ds –> K0s+K
virtual Int_t IsSelected(TObject *obj, Int_t selectionLevel)
void SetUsePID(Bool_t flag=kTRUE)
Bool_t fDstar
D0->Kpipipi.
virtual void PrintAll() const
Float_t GetDCACut(Int_t iPtBin=0) const
virtual Int_t IsSelected(TObject *obj, Int_t selectionLevel)
AliRDHFCutsJpsitoee * fCutsJpsitoee
D0->Kpi cuts.
Bool_t SelectInvMassAndPtJpsiee(Double_t *px, Double_t *py, Double_t *pz)
Bool_t fOKInvMassD0
for 4 prong
void Setd0errProngs(Int_t nprongs, Double_t *d0)
Bool_t fOKInvMassJpsi
pair fullfilling D0 inv mass selection
Bool_t SelectInvMassAndPtDstarD0pi(Double_t *px, Double_t *py, Double_t *pz)
Int_t fV0TypeForCascadeVertex
reconstruct a secondary vertex or assume it's from the primary vertex
Bool_t fJPSItoEle
D0->Kpi.
AliAnalysisFilter * fTrackFilterBachelor
Track Filter for D* soft pion.
virtual Int_t IsSelected(TObject *obj, Int_t selectionLevel)
Bool_t GetIsUsePID() const
Bool_t fMassCutBeforeVertexing
Select which V0 type we want to use for the cascas.
Int_t fAODMapSize
input from AOD (kTRUE) or ESD (kFALSE)
void FixReferences(AliAODEvent *aod)
void SetSelectionBitForPID(AliRDHFCuts *cuts, AliAODRecoDecayHF *rd, Int_t bit)
AliAODRecoCascadeHF * MakeCascade(TObjArray *twoTrackArray, AliVEvent *event, AliAODVertex *secVert, AliAODRecoDecayHF2Prong *rd2Prong, Double_t dca, Bool_t &okDstar)
void SelectTracksAndCopyVertex(const AliVEvent *event, Int_t trkEntries, TObjArray &seleTrksArray, TObjArray &tracksAtVertex, Int_t &nSeleTrks, UChar_t *seleFlags, Int_t *evtNumber)
void SetSigmaVert(Double_t sigmaVert)
Bool_t fRecoPrimVtxSkippingTrks
if kTRUE use KF vertexer, else AliVertexerTracks
AliAODRecoDecay * fMassCalc3
for 2 prong
TList * fListOfCuts
Dstar->D0pi cuts.
Bool_t RecoSecondaryVertexForCascades(AliVEvent *event, AliAODRecoCascadeHF *rc)
Float_t GetMassCut(Int_t iPtBin=0) const
Double_t fnSigmaTPCProtonHi
Low cut value on n. of sigmas for p TPC PID.
Double_t GetMinPtCandidate() const
virtual Int_t IsSelected(TObject *obj, Int_t selectionLevel)
Float_t GetMassCut(Int_t iPtBin=0) const
AliRDHFCutsLctoV0 * fCutsLctoV0
Lc->pKpi cuts.
Float_t GetDCACut(Int_t iPtBin=0) const
void MapAODtracks(AliVEvent *aod)
AliAODRecoDecayHF3Prong * Make3Prong(TObjArray *threeTrackArray, AliVEvent *event, AliAODVertex *secVert, Double_t dispersion, const AliAODVertex *vertexp1n1, const AliAODVertex *vertexp2n1, Double_t dcap1n1, Double_t dcap2n1, Double_t dcap1p2, Bool_t useForLc, Bool_t useForDs, Bool_t &ok3Prong)
AliRDHFCutsDStartoKpipi * fCutsDStartoKpipi
D0->Kpipipi cuts.
AliAnalysisFilter * fTrackFilter
max. centrality percentile for using tight cuts
Float_t GetDCACut(Int_t iPtBin=0) const
Bool_t SelectInvMassAndPtD0Kpi(Double_t *px, Double_t *py, Double_t *pz)
Bool_t GetUsePID(Int_t iPtBin=0) const
AliAODv0 * TransformESDv0toAODv0(AliESDv0 *esdv0, TObjArray *twoTrackArrayV0)
Bool_t SelectInvMassAndPt4prong(Double_t *px, Double_t *py, Double_t *pz)
virtual Int_t IsSelected(TObject *obj, Int_t selectionLevel)
Double_t fnSigmaTPCPionHi
Low cut value on n. of sigmas for pi TPC PID.
Bool_t fD0toKpi
primary vertex
Bool_t fOKInvMassDs
triplet fullfilling D+ inv mass selection
void SetIsFilled(Int_t filled)
void AddRefs(AliAODVertex *v, AliAODRecoDecayHF *rd, const AliVEvent *event, const TObjArray *trkArray) const
AliAODRecoDecayHF2Prong * Make2Prong(TObjArray *twoTrackArray1, AliVEvent *event, AliAODVertex *secVert, Double_t dcap1n1, Bool_t &okD0, Bool_t &okJPSI, Bool_t &okD0fromDstar, Bool_t refill=kFALSE, AliAODRecoDecayHF2Prong *rd=0x0)
Double_t fnSigmaTOFPionLow
High cut value on n. of sigmas for pi TPC PID.