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);
1715 if(!track1)
return kFALSE;
1717 if(!track2)
return kFALSE;
1718 AliESDtrack *postrack1 = 0;
1719 AliESDtrack *negtrack1 = 0;
1720 postrack1 =
new AliESDtrack(track1);
1721 negtrack1 =
new AliESDtrack(track2);
1726 Double_t dca12 = postrack1->GetDCA(negtrack1,
fBzkG,xdummy,ydummy);
1728 const AliVVertex *vprimary =
event->GetPrimaryVertex();
1731 vprimary->GetXYZ(pos);
1732 vprimary->GetCovarianceMatrix(cov);
1733 fV1 =
new AliESDVertex(pos,cov,100.,100,vprimary->GetName());
1734 fV1->GetCovMatrix(cov);
1738 if(!track3)
return kFALSE;
1739 AliESDtrack *esdt3 =
new AliESDtrack(track3);
1743 threeTrackArray->AddAt(postrack1,0);
1744 threeTrackArray->AddAt(negtrack1,1);
1745 threeTrackArray->AddAt(esdt3,2);
1746 dca2 = esdt3->GetDCA(negtrack1,
fBzkG,xdummy,ydummy);
1747 dca3 = esdt3->GetDCA(postrack1,
fBzkG,xdummy,ydummy);
1751 if (!secVert3PrAOD) {
1752 threeTrackArray->Clear();
1753 threeTrackArray->Delete();
delete threeTrackArray;
1755 delete postrack1; postrack1=NULL;
1756 delete negtrack1; negtrack1=NULL;
1757 delete esdt3; esdt3=NULL;
1764 rd=
Make3Prong(threeTrackArray, event, secVert3PrAOD,dispersion, vtxRec, vertexp2n1, dca12, dca2, dca3, rd);
1767 threeTrackArray->Clear();
1768 threeTrackArray->Delete();
delete threeTrackArray;
1770 delete postrack1; postrack1=NULL;
1771 delete negtrack1; negtrack1=NULL;
1772 delete esdt3; esdt3=NULL;
1787 if(!track1)
return kFALSE;
1789 if(!track2)
return kFALSE;
1791 AliESDtrack *esdt1 = 0;
1792 AliESDtrack *esdt2 = 0;
1793 esdt1 =
new AliESDtrack(track1);
1794 esdt2 =
new AliESDtrack(track2);
1796 twoTrackArray1->AddAt(esdt1,0);
1797 twoTrackArray1->AddAt(esdt2,1);
1802 const AliVVertex *vprimary =
event->GetPrimaryVertex();
1805 vprimary->GetXYZ(pos);
1806 vprimary->GetCovarianceMatrix(cov);
1807 fV1 =
new AliESDVertex(pos,cov,100.,100,vprimary->GetName());
1808 fV1->GetCovMatrix(cov);
1814 twoTrackArray1->Clear();
1815 twoTrackArray1->Delete();
delete twoTrackArray1;
1817 delete esdt1; esdt1=NULL;
1818 delete esdt2; esdt2=NULL;
1822 Bool_t okD0FromDstar=kFALSE;
1825 rd=
Make2Prong(twoTrackArray1, event, vtxRec, dca12, okD0, okJPSI, okD0FromDstar,refill,rd);
1829 twoTrackArray1->Clear();
1830 twoTrackArray1->Delete();
delete twoTrackArray1;
1831 delete esdt1; esdt1=NULL;
1832 delete esdt2; esdt2=NULL;
1843 AliAODTrack *trackB =(AliAODTrack*)event->GetTrack(
fAODMap[rCasc->
GetProngID(0)]);
1844 if(!trackB)
return kFALSE;
1846 AliNeutralTrackParam *trackV0=NULL;
1852 TClonesArray *inputArrayD0=(TClonesArray*)event->GetList()->FindObject(
"D0toKpi");
1853 if(!inputArrayD0)
return kFALSE;
1855 if(!trackD0)
return kFALSE;
1858 trackV0 =
new AliNeutralTrackParam(trackD0);
1862 if(!v0)
return kFALSE;
1864 const AliVTrack *trackVV0 =
dynamic_cast<const AliVTrack*
>(v0);
1865 if(trackVV0) trackV0 =
new AliNeutralTrackParam(trackVV0);
1868 AliESDtrack *esdB =
new AliESDtrack(trackB);
1870 twoTrackArrayCasc->AddAt(esdB,0);
1871 twoTrackArrayCasc->AddAt(trackV0,1);
1874 const AliVVertex *vprimary =
event->GetPrimaryVertex();
1878 vprimary->GetXYZ(pos);
1879 vprimary->GetCovarianceMatrix(cov);
1880 fV1 =
new AliESDVertex(pos,cov,100.,100,vprimary->GetName());
1881 fV1->GetCovMatrix(cov);
1884 AliAODVertex *vtxCasc = 0x0;
1887 Double_t dispersion, xdummy, ydummy;
1888 dca = esdB->GetDCA(trackV0,
fBzkG,xdummy,ydummy);
1892 vtxCasc =
new AliAODVertex(pos,cov,chi2perNDF,0x0,-1,AliAODVertex::kUndef,2);
1895 twoTrackArrayCasc->Clear();
1896 twoTrackArrayCasc->Delete();
delete twoTrackArrayCasc;
1898 delete esdB; esdB=NULL;
1899 delete vtxCasc;vtxCasc=NULL;
1901 delete trackV0; trackV0=NULL;
1907 vtxCasc->SetParent(rCasc);
1908 rCasc->SetSecondaryVtx(vtxCasc);
1910 if(DStar)vtxCasc->AddDaughter(trackD0);
1911 else vtxCasc->AddDaughter(v0);
1916 Double_t px[2],py[2],pz[2],d0[2],d0err[2];
1918 esdB->PropagateToDCA(vtxCasc,
fBzkG,kVeryBig);
1919 trackV0->PropagateToDCA(vtxCasc,
fBzkG,kVeryBig);
1921 esdB->GetPxPyPz(momentum);
1922 px[0] = momentum[0]; py[0] = momentum[1]; pz[0] = momentum[2];
1923 trackV0->GetPxPyPz(momentum);
1924 px[1] = momentum[0]; py[1] = momentum[1]; pz[1] = momentum[2];
1926 AliAODVertex *primVertexAOD =
PrimaryVertex(twoTrackArrayCasc,event);
1929 delete vtxCasc; vtxCasc=NULL;
1930 twoTrackArrayCasc->Clear();
1931 twoTrackArrayCasc->Delete();
delete twoTrackArrayCasc;
1932 delete esdB; esdB=NULL;
1933 delete trackV0; trackV0=NULL;
1938 esdB->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
1940 d0err[0] = TMath::Sqrt(covd0z0[0]);
1941 trackV0->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
1943 d0err[1] = TMath::Sqrt(covd0z0[0]);
1944 rCasc->SetPxPyPzProngs(2,px,py,pz);
1946 rCasc->Setd0Prongs(2,d0);
1949 rCasc->SetCharge(esdB->Charge());
1951 Double_t esdpid0[5]={0.,0.,0.,0.,0.};
1952 if(esdB->GetStatus()&AliESDtrack::kESDpid) esdB->GetESDpid(esdpid0);
1953 Double_t esdpid1[5]={0.,0.,0.,0.,0.};
1955 for(
Int_t i=0;i<5;i++) {
1956 esdpid[i] = esdpid0[i];
1957 esdpid[5+i] = esdpid1[i];
1959 rCasc->SetPID(2,esdpid);
1964 if(primVertexAOD) {
delete primVertexAOD; primVertexAOD=NULL;}
1965 twoTrackArrayCasc->Clear();
1966 twoTrackArrayCasc->Delete();
delete twoTrackArrayCasc;
1967 delete esdB; esdB=NULL;
1968 delete trackV0; trackV0=NULL;
1986 AliAODTrack *trackB =
dynamic_cast<AliAODTrack*
> (rc->
GetBachelor());
1987 if (!trackB)
return kFALSE;
1989 AliAODv0 *v0 =
dynamic_cast<AliAODv0*
> (rc->
Getv0());
1990 if (!v0)
return kFALSE;
1994 AliESDtrack *esdB =
new AliESDtrack(trackB);
1995 if (!esdB)
return kFALSE;
1997 const AliVTrack *trackVV0 =
dynamic_cast<const AliVTrack*
>(v0);
1998 if (!trackVV0)
return kFALSE;
2000 AliNeutralTrackParam *trackV0 =
new AliNeutralTrackParam(trackVV0);
2001 if (!trackV0)
return kFALSE;
2004 twoTrackArrayCasc->AddAt(esdB, 0);
2005 twoTrackArrayCasc->AddAt(trackV0, 1);
2008 Double_t dispersion, xdummy, ydummy, pos[3], cov[6];
2016 const AliVVertex *vprimary =
event->GetPrimaryVertex();
2017 vprimary->GetXYZ(pos);
2018 vprimary->GetCovarianceMatrix(cov);
2019 fV1 =
new AliESDVertex(pos,cov,100.,100,vprimary->GetName());
2026 Double_t dca = esdB->GetDCA(trackV0,
fBzkG, xdummy, ydummy);
2030 twoTrackArrayCasc->Clear();
2031 twoTrackArrayCasc->Delete();
delete twoTrackArrayCasc;
2033 delete esdB; esdB=0;
2034 delete vtxCasc; vtxCasc=0;
2035 delete trackV0; trackV0=0;
2042 vtxCasc->SetParent(rc);
2043 rc->SetSecondaryVtx(vtxCasc);
2045 vtxCasc->AddDaughter(v0);
2050 Double_t momentum[3], px[2], py[2], pz[2], d0[2], d0err[2], d0z0[2], covd0z0[3];
2051 esdB->PropagateToDCA(vtxCasc,
fBzkG, kVeryBig);
2052 trackV0->PropagateToDCA(vtxCasc,
fBzkG, kVeryBig);
2053 esdB->GetPxPyPz(momentum);
2054 px[0] = momentum[0]; py[0] = momentum[1]; pz[0] = momentum[2];
2055 trackV0->GetPxPyPz(momentum);
2056 px[1] = momentum[0]; py[1] = momentum[1]; pz[1] = momentum[2];
2060 AliAODVertex *primVertexAOD =
PrimaryVertex(twoTrackArrayCasc, event);
2061 if (!primVertexAOD) {
2062 twoTrackArrayCasc->Clear();
2063 twoTrackArrayCasc->Delete();
delete twoTrackArrayCasc;
2065 delete esdB; esdB=0;
2066 delete vtxCasc; vtxCasc=0;
2067 delete trackV0; trackV0=0;
2072 esdB->PropagateToDCA(primVertexAOD,
fBzkG, kVeryBig, d0z0, covd0z0);
2074 d0err[0] = TMath::Sqrt(covd0z0[0]);
2075 trackV0->PropagateToDCA(primVertexAOD,
fBzkG, kVeryBig, d0z0, covd0z0);
2077 d0err[1] = TMath::Sqrt(covd0z0[0]);
2082 Double_t esdpid0[5] = {0., 0., 0., 0., 0.};
2083 Double_t esdpid1[5] = {0., 0., 0., 0., 0.};
2084 if (esdB->GetStatus()&AliESDtrack::kESDpid) esdB->GetESDpid(esdpid0);
2085 for (
Int_t ipid=0; ipid<5; ipid++) {
2086 esdpid[ipid] = esdpid0[ipid];
2087 esdpid[5+ipid] = esdpid1[ipid];
2094 rc->SetPxPyPzProngs(2, px, py, pz);
2095 rc->Setd0Prongs(2, d0);
2097 rc->SetCharge(esdB->Charge());
2098 rc->SetPID(2, esdpid);
2103 twoTrackArrayCasc->Clear();
2104 twoTrackArrayCasc->Delete();
delete twoTrackArrayCasc;
2106 delete primVertexAOD; primVertexAOD=0;
2107 delete esdB; esdB=0;
2108 delete trackV0; trackV0=0;
2116 TObjArray *twoTrackArray,AliVEvent *event,
2117 AliAODVertex *secVert,
2125 UInt_t ntref=TProcessID::GetObjectCount();
2127 AliFatal(Form(
"Number of TRef created (=%d), close to limit (16777216)",ntref));
2132 Bool_t dummy1,dummy2,dummy3;
2138 dummy1,dummy2,dummy3);
2139 if(!theCascade)
return 0x0;
2142 AliESDtrack *trackPi = (AliESDtrack*)twoTrackArray->UncheckedAt(0);
2143 theCascade->SetCharge(trackPi->Charge());
2151 AliAODTrack* trackPiAOD=
dynamic_cast<AliAODTrack*
>(
event->GetTrack(
fAODMap[idSoftPi]));
2152 if(!trackPiAOD) AliFatal(
"Not a standard AOD");
2153 tmpCascade->GetSecondaryVtx()->AddDaughter(trackPiAOD);
2156 tmpCascade->GetSecondaryVtx()->AddDaughter(trackPi);
2158 tmpCascade->GetSecondaryVtx()->AddDaughter(rd2Prong);
2160 AliAODVertex *primVertexAOD=0;
2172 tmpCascade->GetSecondaryVtx()->RemoveDaughters();
2174 delete tmpCascade; tmpCascade=NULL;
2178 if(primVertexAOD) {
delete primVertexAOD; primVertexAOD=NULL;}
2188 TObjArray *twoTrackArray,AliVEvent *event,
2189 AliAODVertex *secVert,
2197 UInt_t ntref=TProcessID::GetObjectCount();
2199 AliFatal(Form(
"Number of TRef created (=%d), close to limit (16777216)",ntref));
2204 AliESDtrack *postrack = (AliESDtrack*)twoTrackArray->UncheckedAt(0);
2205 AliESDtrack *negtrack = (AliESDtrack*)twoTrackArray->UncheckedAt(1);
2207 postrack->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2208 negtrack->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2210 postrack->GetPxPyPz(momentum);
2211 px[0] = momentum[0]; py[0] = momentum[1]; pz[0] = momentum[2];
2212 negtrack->GetPxPyPz(momentum);
2213 px[1] = momentum[0]; py[1] = momentum[1]; pz[1] = momentum[2];
2219 if(!presel)
return 0x0;
2222 okCascades = kFALSE;
2223 Bool_t dummy1,dummy2,dummy3;
2229 dummy1,dummy2,dummy3);
2230 if(!theCascade)
return 0x0;
2233 AliESDtrack *trackBachelor = (AliESDtrack*)twoTrackArray->UncheckedAt(0);
2234 theCascade->SetCharge(trackBachelor->Charge());
2241 Int_t idBachelor=(
Int_t)trackBachelor->GetID();
2242 if (idBachelor > -1 && idBachelor <
fAODMapSize) {
2243 AliAODTrack* trackBachelorAOD=
dynamic_cast<AliAODTrack*
>(
event->GetTrack(
fAODMap[idBachelor]));
2244 if(!trackBachelorAOD) AliFatal(
"Not a standard AOD");
2245 tmpCascade->GetSecondaryVtx()->AddDaughter(trackBachelorAOD);
2248 tmpCascade->GetSecondaryVtx()->AddDaughter(trackBachelor);
2250 tmpCascade->GetSecondaryVtx()->AddDaughter(v0);
2252 AliAODVertex *primVertexAOD=0;
2256 if(!primVertexAOD) primVertexAOD = (AliAODVertex*)event->GetPrimaryVertex();
2283 tmpCascade->GetSecondaryVtx()->RemoveDaughters();
2285 delete tmpCascade; tmpCascade=NULL;
2286 if(primVertexAOD) {
delete primVertexAOD; primVertexAOD=NULL;}
2294 TObjArray *twoTrackArray,AliVEvent *event,
2295 AliAODVertex *secVert,
Double_t dca,
2303 okD0=kFALSE; okJPSI=kFALSE; okD0fromDstar=kFALSE;
2305 UInt_t ntref=TProcessID::GetObjectCount();
2307 AliFatal(Form(
"Number of TRef created (=%d), close to limit (16777216)",ntref));
2310 Double_t px[2],py[2],pz[2],d0[2],d0err[2];
2311 AliESDtrack *postrack = (AliESDtrack*)twoTrackArray->UncheckedAt(0);
2312 AliESDtrack *negtrack = (AliESDtrack*)twoTrackArray->UncheckedAt(1);
2315 postrack->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2316 negtrack->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2319 postrack->GetPxPyPz(momentum);
2320 px[0] = momentum[0]; py[0] = momentum[1]; pz[0] = momentum[2];
2321 negtrack->GetPxPyPz(momentum);
2322 px[1] = momentum[0]; py[1] = momentum[1]; pz[1] = momentum[2];
2337 AliAODVertex *primVertexAOD =
PrimaryVertex(twoTrackArray,event);
2338 if(!primVertexAOD)
return 0x0;
2341 postrack->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2343 d0err[0] = TMath::Sqrt(covd0z0[0]);
2344 negtrack->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2346 d0err[1] = TMath::Sqrt(covd0z0[0]);
2354 if(postrack->Charge()!=0 && negtrack->Charge()!=0) {
2378 the2Prong->SetSecondaryVtx(secVert);
2379 secVert->SetParent(the2Prong);
2382 the2Prong->SetPxPyPzProngs(2,px,py,pz);
2383 the2Prong->SetDCA(dca);
2384 the2Prong->Setd0Prongs(2,d0);
2386 the2Prong->SetCharge(0);
2388 delete primVertexAOD; primVertexAOD=NULL;
2396 Double_t esdpid0[5]={0.,0.,0.,0.,0.};
2397 if(postrack->GetStatus()&AliESDtrack::kESDpid) postrack->GetESDpid(esdpid0);
2398 Double_t esdpid1[5]={0.,0.,0.,0.,0.};
2399 if(negtrack->GetStatus()&AliESDtrack::kESDpid) negtrack->GetESDpid(esdpid1);
2401 for(
Int_t i=0;i<5;i++) {
2402 esdpid[i] = esdpid0[i];
2403 esdpid[5+i] = esdpid1[i];
2405 the2Prong->SetPID(2,esdpid);
2410 TObjArray *threeTrackArray,AliVEvent *event,
2411 AliAODVertex *secVert,
Double_t dispersion,
2412 const AliAODVertex *vertexp1n1,
const AliAODVertex *vertexp2n1,
2422 UInt_t ntref=TProcessID::GetObjectCount();
2424 AliFatal(Form(
"Number of TRef created (=%d), close to limit (16777216)",ntref));
2428 if(!secVert || !vertexp1n1 || !vertexp2n1)
return 0x0;
2430 Double_t px[3],py[3],pz[3],d0[3],d0err[3];
2434 AliESDtrack *postrack1 = (AliESDtrack*)threeTrackArray->UncheckedAt(0);
2435 AliESDtrack *negtrack = (AliESDtrack*)threeTrackArray->UncheckedAt(1);
2436 AliESDtrack *postrack2 = (AliESDtrack*)threeTrackArray->UncheckedAt(2);
2438 postrack1->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2439 negtrack->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2440 postrack2->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2441 postrack1->GetPxPyPz(momentum);
2442 px[0] = momentum[0]; py[0] = momentum[1]; pz[0] = momentum[2];
2443 negtrack->GetPxPyPz(momentum);
2444 px[1] = momentum[0]; py[1] = momentum[1]; pz[1] = momentum[2];
2445 postrack2->GetPxPyPz(momentum);
2446 px[2] = momentum[0]; py[2] = momentum[1]; pz[2] = momentum[2];
2458 AliAODVertex *primVertexAOD =
PrimaryVertex(threeTrackArray,event);
2459 if(!primVertexAOD)
return 0x0;
2462 postrack1->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2464 d0err[0] = TMath::Sqrt(covd0z0[0]);
2465 negtrack->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2467 d0err[1] = TMath::Sqrt(covd0z0[0]);
2468 postrack2->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2470 d0err[2] = TMath::Sqrt(covd0z0[0]);
2474 Double_t pos[3]; primVertexAOD->GetXYZ(pos);
2475 Double_t dca[3]={dcap1n1,dcap2n1,dcap1p2};
2476 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]));
2477 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]));
2482 AliAODRecoDecayHF3Prong *the3Prong =
new AliAODRecoDecayHF3Prong(0x0,px,py,pz,d0,d0err,dca,dispersion,dist12,dist23,charge);
2485 AliAODVertex* ownsecv=secVert->CloneWithoutRefs();
2486 the3Prong->SetOwnSecondaryVtx(ownsecv);
2490 delete primVertexAOD; primVertexAOD=NULL;
2526 the3Prong->SetSecondaryVtx(secVert);
2531 Double_t esdpid0[5]={0.,0.,0.,0.,0.};
2532 if(postrack1->GetStatus()&AliESDtrack::kESDpid) postrack1->GetESDpid(esdpid0);
2533 Double_t esdpid1[5]={0.,0.,0.,0.,0.};
2534 if(negtrack->GetStatus()&AliESDtrack::kESDpid) negtrack->GetESDpid(esdpid1);
2535 Double_t esdpid2[5]={0.,0.,0.,0.,0.};
2536 if(postrack2->GetStatus()&AliESDtrack::kESDpid) postrack2->GetESDpid(esdpid2);
2539 for(
Int_t i=0;i<5;i++) {
2540 esdpid[i] = esdpid0[i];
2541 esdpid[5+i] = esdpid1[i];
2542 esdpid[10+i] = esdpid2[i];
2544 the3Prong->SetPID(3,esdpid);
2550 TObjArray *threeTrackArray,AliVEvent *event,
2551 AliAODVertex *secVert,
Double_t dispersion,
2552 Double32_t dist12, Double32_t dist23,
2565 UInt_t ntref=TProcessID::GetObjectCount();
2567 AliFatal(Form(
"Number of TRef created (=%d), close to limit (16777216)",ntref));
2570 Double_t px[3],py[3],pz[3],d0[3],d0err[3];
2574 AliESDtrack *postrack1 = (AliESDtrack*)threeTrackArray->UncheckedAt(0);
2575 AliESDtrack *negtrack = (AliESDtrack*)threeTrackArray->UncheckedAt(1);
2576 AliESDtrack *postrack2 = (AliESDtrack*)threeTrackArray->UncheckedAt(2);
2578 postrack1->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2579 negtrack->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2580 postrack2->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2581 postrack1->GetPxPyPz(momentum);
2582 px[0] = momentum[0]; py[0] = momentum[1]; pz[0] = momentum[2];
2583 negtrack->GetPxPyPz(momentum);
2584 px[1] = momentum[0]; py[1] = momentum[1]; pz[1] = momentum[2];
2585 postrack2->GetPxPyPz(momentum);
2586 px[2] = momentum[0]; py[2] = momentum[1]; pz[2] = momentum[2];
2588 AliAODVertex *primVertexAOD =
PrimaryVertex(threeTrackArray,event);
2589 if(!primVertexAOD)
return 0x0;
2591 postrack1->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2593 d0err[0] = TMath::Sqrt(covd0z0[0]);
2594 negtrack->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2596 d0err[1] = TMath::Sqrt(covd0z0[0]);
2597 postrack2->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2599 d0err[2] = TMath::Sqrt(covd0z0[0]);
2601 Double_t pos[3]; primVertexAOD->GetXYZ(pos);
2602 Double_t dca[3]={dcap1n1,dcap2n1,dcap1p2};
2605 rd->SetSecondaryVtx(secVert);
2606 secVert->SetParent(rd);
2609 rd->SetPxPyPzProngs(3,px,py,pz);
2611 rd->Setd0Prongs(3,d0);
2613 rd->SetCharge(charge);
2616 delete primVertexAOD; primVertexAOD=NULL;
2623 Double_t esdpid0[5]={0.,0.,0.,0.,0.};
2624 if(postrack1->GetStatus()&AliESDtrack::kESDpid) postrack1->GetESDpid(esdpid0);
2625 Double_t esdpid1[5]={0.,0.,0.,0.,0.};
2626 if(negtrack->GetStatus()&AliESDtrack::kESDpid) negtrack->GetESDpid(esdpid1);
2627 Double_t esdpid2[5]={0.,0.,0.,0.,0.};
2628 if(postrack2->GetStatus()&AliESDtrack::kESDpid) postrack2->GetESDpid(esdpid2);
2631 for(
Int_t i=0;i<5;i++) {
2632 esdpid[i] = esdpid0[i];
2633 esdpid[5+i] = esdpid1[i];
2634 esdpid[10+i] = esdpid2[i];
2636 rd->SetPID(3,esdpid);
2641 TObjArray *fourTrackArray,AliVEvent *event,
2642 AliAODVertex *secVert,
2643 const AliAODVertex *vertexp1n1,
2644 const AliAODVertex *vertexp1n1p2,
2654 UInt_t ntref=TProcessID::GetObjectCount();
2656 AliFatal(Form(
"Number of TRef created (=%d), close to limit (16777216)",ntref));
2660 if(!secVert || !vertexp1n1 || !vertexp1n1p2)
return 0x0;
2662 Double_t px[4],py[4],pz[4],d0[4],d0err[4];
2664 AliESDtrack *postrack1 = (AliESDtrack*)fourTrackArray->UncheckedAt(0);
2665 AliESDtrack *negtrack1 = (AliESDtrack*)fourTrackArray->UncheckedAt(1);
2666 AliESDtrack *postrack2 = (AliESDtrack*)fourTrackArray->UncheckedAt(2);
2667 AliESDtrack *negtrack2 = (AliESDtrack*)fourTrackArray->UncheckedAt(3);
2669 postrack1->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2670 negtrack1->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2671 postrack2->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2672 negtrack2->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2675 postrack1->GetPxPyPz(momentum);
2676 px[0] = momentum[0]; py[0] = momentum[1]; pz[0] = momentum[2];
2677 negtrack1->GetPxPyPz(momentum);
2678 px[1] = momentum[0]; py[1] = momentum[1]; pz[1] = momentum[2];
2679 postrack2->GetPxPyPz(momentum);
2680 px[2] = momentum[0]; py[2] = momentum[1]; pz[2] = momentum[2];
2681 negtrack2->GetPxPyPz(momentum);
2682 px[3] = momentum[0]; py[3] = momentum[1]; pz[3] = momentum[2];
2697 AliAODVertex *primVertexAOD =
PrimaryVertex(fourTrackArray,event);
2698 if(!primVertexAOD)
return 0x0;
2701 postrack1->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2703 d0err[0] = TMath::Sqrt(covd0z0[0]);
2704 negtrack1->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2706 d0err[1] = TMath::Sqrt(covd0z0[0]);
2707 postrack2->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2709 d0err[2] = TMath::Sqrt(covd0z0[0]);
2710 negtrack2->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2712 d0err[3] = TMath::Sqrt(covd0z0[0]);
2716 Double_t pos[3]; primVertexAOD->GetXYZ(pos);
2717 Double_t dca[6]={dcap1n1,0.,dcap1n2,dcap2n1,0.,dcap2n2};
2718 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]));
2719 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]));
2720 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]));
2722 AliAODRecoDecayHF4Prong *the4Prong =
new AliAODRecoDecayHF4Prong(secVert,px,py,pz,d0,d0err,dca,dist12,dist3,dist4,charge);
2727 delete primVertexAOD; primVertexAOD=NULL;
2738 Double_t esdpid0[5]={0.,0.,0.,0.,0.};
2739 if(postrack1->GetStatus()&AliESDtrack::kESDpid) postrack1->GetESDpid(esdpid0);
2740 Double_t esdpid1[5]={0.,0.,0.,0.,0.};
2741 if(negtrack1->GetStatus()&AliESDtrack::kESDpid) negtrack1->GetESDpid(esdpid1);
2742 Double_t esdpid2[5]={0.,0.,0.,0.,0.};
2743 if(postrack2->GetStatus()&AliESDtrack::kESDpid) postrack2->GetESDpid(esdpid2);
2744 Double_t esdpid3[5]={0.,0.,0.,0.,0.};
2745 if(negtrack2->GetStatus()&AliESDtrack::kESDpid) negtrack2->GetESDpid(esdpid3);
2748 for(
Int_t i=0;i<5;i++) {
2749 esdpid[i] = esdpid0[i];
2750 esdpid[5+i] = esdpid1[i];
2751 esdpid[10+i] = esdpid2[i];
2752 esdpid[15+i] = esdpid3[i];
2754 the4Prong->SetPID(4,esdpid);
2765 AliAODTrack *track=0;
2767 for(
Int_t i=0; i<aod->GetNumberOfTracks(); i++) {
2768 track =
dynamic_cast<AliAODTrack*
>(aod->GetTrack(i));
2769 if(!track) AliFatal(
"Not a standard AOD");
2771 if(track->GetStatus()&AliESDtrack::kITSpureSA)
continue;
2774 if(!(track->GetStatus()&AliESDtrack::kITSin))
continue;
2778 if(!track->GetCovarianceXYZPxPyPz(covtest))
continue;
2782 if (ind>-1 && ind < fAODMapSize)
fAODMap[ind] = i;
2788 AliVEvent *event)
const 2793 AliESDVertex *vertexESD = 0;
2794 AliAODVertex *vertexAOD = 0;
2800 vertexESD =
new AliESDVertex(*
fV1);
2805 Int_t nTrks = trkArray->GetEntriesFast();
2806 AliVertexerTracks *vertexer =
new AliVertexerTracks(event->GetMagneticField());
2811 if(strstr(
fV1->GetTitle(),
"VertexerTracksWithConstraint")) {
2813 event->GetDiamondCovXY(diamondcovxy);
2814 Double_t pos[3]={
event->GetDiamondX(),
event->GetDiamondY(),0.};
2815 Double_t cov[6]={diamondcovxy[0],diamondcovxy[1],diamondcovxy[2],0.,0.,10.*10.};
2816 AliESDVertex *diamond =
new AliESDVertex(pos,cov,1.,1);
2817 vertexer->SetVtxStart(diamond);
2818 delete diamond; diamond=NULL;
2819 if(strstr(
fV1->GetTitle(),
"VertexerTracksWithConstraintOnlyFitter"))
2820 vertexer->SetOnlyFitter();
2822 Int_t skipped[1000];
2823 Int_t nTrksToSkip=0,id;
2824 AliExternalTrackParam *t = 0;
2825 for(
Int_t i=0; i<nTrks; i++) {
2826 t = (AliExternalTrackParam*)trkArray->UncheckedAt(i);
2827 id = (
Int_t)t->GetID();
2829 skipped[nTrksToSkip++] = id;
2835 for(
Int_t j=0; j<
event->GetNumberOfTracks(); j++) {
2836 AliVTrack *vtrack = (AliVTrack*)event->GetTrack(j);
2837 if(!vtrack->GetCovarianceXYZPxPyPz(covtest)) {
2838 id = (
Int_t)vtrack->GetID();
2840 skipped[nTrksToSkip++] = id;
2844 for(
Int_t ijk=nTrksToSkip; ijk<1000; ijk++) skipped[ijk]=-1;
2846 vertexer->SetSkipTracks(nTrksToSkip,skipped);
2847 vertexESD = (AliESDVertex*)vertexer->FindPrimaryVertex(event);
2854 AliESDtrack *esdTrack = 0;
2856 for(
Int_t i=0; i<nTrks; i++) {
2857 t = (AliESDtrack*)trkArray->UncheckedAt(i);
2858 esdTrack =
new AliESDtrack(*t);
2859 rmArray.AddLast(esdTrack);
2860 if(esdTrack->GetID()>=0) {
2861 rmId[i]=(
UShort_t)esdTrack->GetID();
2866 Float_t diamondxy[2]={
static_cast<Float_t>(
event->GetDiamondX()),static_cast<Float_t>(event->GetDiamondY())};
2867 vertexESD = vertexer->RemoveTracksFromVertex(
fV1,&rmArray,rmId,diamondxy);
2868 delete [] rmId; rmId=NULL;
2873 if(!vertexESD)
return vertexAOD;
2874 if(vertexESD->GetNContributors()<=0) {
2876 delete vertexESD; vertexESD=NULL;
2880 delete vertexer; vertexer=NULL;
2886 vertexESD->GetXYZ(pos);
2887 vertexESD->GetCovMatrix(cov);
2888 chi2perNDF = vertexESD->GetChi2toNDF();
2889 delete vertexESD; vertexESD=NULL;
2891 vertexAOD =
new AliAODVertex(pos,cov,chi2perNDF);
2902 printf(
"Secondary vertex with Kalman filter package (AliKFParticle)\n");
2904 printf(
"Secondary vertex with AliVertexerTracks\n");
2909 printf(
"Reconstruct D0->Kpi candidates with cuts:\n");
2913 printf(
"Reconstruct D*->D0pi candidates with cuts:\n");
2915 printf(
" Reconstruct a secondary vertex for the D*\n");
2917 printf(
" Assume the D* comes from the primary vertex\n");
2922 printf(
"Reconstruct J/psi from B candidates with cuts:\n");
2926 printf(
"Reconstruct 3 prong candidates.\n");
2927 printf(
" D+->Kpipi cuts:\n");
2929 printf(
" Ds->KKpi cuts:\n");
2931 printf(
" Lc->pKpi cuts:\n");
2935 printf(
"Reconstruct 4 prong candidates.\n");
2936 printf(
" D0->Kpipipi cuts:\n");
2940 printf(
"Reconstruct cascade candidates formed with v0s.\n");
2941 printf(
" Lc -> k0s P & Lc -> L Pi cuts:\n");
2943 printf(
" D+ -> K0s pi cuts:\n");
2945 printf(
" Ds -> K0s K cuts:\n");
2958 AliESDVertex *vertexESD = 0;
2959 AliAODVertex *vertexAOD = 0;
2964 vertexESD = (AliESDVertex*)
fVertexerTracks->VertexForSelectedESDTracks(trkArray);
2966 if(!vertexESD)
return vertexAOD;
2968 if(vertexESD->GetNContributors()!=trkArray->GetEntriesFast()) {
2970 delete vertexESD; vertexESD=NULL;
2974 Double_t vertRadius2=vertexESD->GetX()*vertexESD->GetX()+vertexESD->GetY()*vertexESD->GetY();
2977 delete vertexESD; vertexESD=NULL;
2983 AliKFParticle::SetField(
fBzkG);
2985 AliKFVertex vertexKF;
2987 Int_t nTrks = trkArray->GetEntriesFast();
2988 for(
Int_t i=0; i<nTrks; i++) {
2989 AliESDtrack *esdTrack = (AliESDtrack*)trkArray->At(i);
2990 AliKFParticle daughterKF(*esdTrack,211);
2991 vertexKF.AddDaughter(daughterKF);
2993 vertexESD =
new AliESDVertex(vertexKF.Parameters(),
2994 vertexKF.CovarianceMatrix(),
2996 vertexKF.GetNContributors());
3002 vertexESD->GetXYZ(pos);
3003 vertexESD->GetCovMatrix(cov);
3004 chi2perNDF = vertexESD->GetChi2toNDF();
3005 dispersion = vertexESD->GetDispersion();
3006 delete vertexESD; vertexESD=NULL;
3008 Int_t nprongs= (useTRefArray ? 0 : trkArray->GetEntriesFast());
3009 vertexAOD =
new AliAODVertex(pos,cov,chi2perNDF,0x0,-1,AliAODVertex::kUndef,nprongs);
3018 Int_t retval=kFALSE;
3021 for(
Int_t iTrack=0; iTrack<3; iTrack++){
3022 AliESDtrack *track = (AliESDtrack*)trkArray->UncheckedAt(iTrack);
3023 track->GetPxPyPz(momentum);
3024 px[iTrack] = momentum[0]; py[iTrack] = momentum[1]; pz[iTrack] = momentum[2];
3036 Int_t retval=kFALSE;
3040 for(
Int_t iTrack=0; iTrack<4; iTrack++){
3041 AliESDtrack *track = (AliESDtrack*)trkArray->UncheckedAt(iTrack);
3042 track->GetPxPyPz(momentum);
3043 px[iTrack] = momentum[0]; py[iTrack] = momentum[1]; pz[iTrack] = momentum[2];
3055 Int_t retval=kFALSE;
3059 for(
Int_t iTrack=0; iTrack<2; iTrack++){
3060 AliESDtrack *track = (AliESDtrack*)trkArray->UncheckedAt(iTrack);
3061 track->GetPxPyPz(momentum);
3062 px[iTrack] = momentum[0]; py[iTrack] = momentum[1]; pz[iTrack] = momentum[2];
3082 fMassCalc2->SetPxPyPzProngs(nprongs,px,py,pz);
3087 if(
fMassCalc2->Pt2() < minPt*minPt)
return retval;
3092 pdg2[0]=211; pdg2[1]=321;
3094 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3098 pdg2[0]=321; pdg2[1]=211;
3100 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3121 fMassCalc2->SetPxPyPzProngs(nprongs,px,py,pz);
3126 if(
fMassCalc2->Pt2() < minPt*minPt)
return retval;
3132 pdg2[0]=11; pdg2[1]=11;
3134 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3157 fMassCalc3->SetPxPyPzProngs(nprongs,px,py,pz);
3165 if(
fMassCalc3->Pt2() < minPt*minPt)
return retval;
3170 pdg3[0]=211; pdg3[1]=321; pdg3[2]=211;
3172 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3180 pdg3[0]=321; pdg3[1]=321; pdg3[2]=211;
3182 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3186 pdg3[0]=211; pdg3[1]=321; pdg3[2]=321;
3188 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3197 pdg3[0]=2212; pdg3[1]=321; pdg3[2]=211;
3199 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3205 pdg3[0]=211; pdg3[1]=321; pdg3[2]=2212;
3207 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3230 fMassCalc2->SetPxPyPzProngs(nprongs,px,py,pz);
3235 if(
fMassCalc2->Pt2() < minPt*minPt)
return retval;
3237 pdg2[0]=211; pdg2[1]=421;
3242 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3265 fMassCalc4->SetPxPyPzProngs(nprongs,px,py,pz);
3270 if(
fMassCalc4->Pt2() < minPt*minPt)
return retval;
3276 pdg4[0]=321; pdg4[1]=211; pdg4[2]=211; pdg4[3]=211;
3278 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3283 pdg4[0]=211; pdg4[1]=321; pdg4[2]=211; pdg4[3]=211;
3285 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3290 pdg4[0]=211; pdg4[1]=211; pdg4[2]=321; pdg4[3]=211;
3292 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3297 pdg4[0]=211; pdg4[1]=211; pdg4[2]=211; pdg4[3]=321;
3299 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3320 fMassCalc2->SetPxPyPzProngs(nprongs,px,py,pz);
3323 if(
fMassCalc2->Pt2() < minPt*minPt)
return retval;
3332 pdg2[0] = 2212; pdg2[1] = 310;
3334 if ((minv2 > lolim*lolim) && (minv2 < hilim*hilim)) {
3338 pdg2[0] = 211; pdg2[1] = 3122;
3340 if ((minv2>lolim*lolim) && (minv2<hilim*hilim)) {
3351 pdg2[0] = 211; pdg2[1] = 310;
3353 if ((minv2 > lolim*lolim) && (minv2 < hilim*hilim)) {
3363 pdg2[0] = 321; pdg2[1] = 310;
3365 if ((minv2 > lolim*lolim) && (minv2 < hilim*hilim)) {
3378 UChar_t *seleFlags,
Int_t *evtNumber)
3387 const AliVVertex *vprimary =
event->GetPrimaryVertex();
3395 const Int_t entries =
event->GetNumberOfTracks();
3396 AliCentrality* cent;
3399 fV1 =
new AliESDVertex(*((AliESDVertex*)vprimary));
3402 vprimary->GetXYZ(pos);
3403 vprimary->GetCovarianceMatrix(cov);
3404 fV1 =
new AliESDVertex(pos,cov,100.,100,vprimary->GetName());
3405 if(entries<=0)
return;
3407 memset(indices,0,
sizeof(
UShort_t)*entries);
3414 if(event->GetRunNumber()<244824){
3415 centperc=cent->GetCentralityPercentile(
"V0M");
3417 AliMultSelection *multSelection = (AliMultSelection * ) event->FindListObject(
"MultSelection");
3419 centperc=multSelection->GetMultiplicityPercentile(
"V0M");
3420 Int_t qual = multSelection->GetEvSelCode();
3421 if(qual == 199 ) centperc=0.1;
3424 Bool_t okDisplaced=kFALSE,okSoftPi=kFALSE,okFor3Prong=kFALSE,okBachelor=kFALSE;
3428 for(
Int_t i=0; i<entries; i++) {
3430 track = (AliVTrack*)event->GetTrack(i);
3433 if(track->GetStatus()&AliESDtrack::kITSpureSA)
continue;
3436 if(!(track->GetStatus()&AliESDtrack::kITSin))
continue;
3440 if(track->GetID()<0)
continue;
3444 if(!track->GetCovarianceXYZPxPyPz(covtest))
continue;
3448 AliAODTrack *aodt = (AliAODTrack*)track;
3449 if(aodt->GetUsedForPrimVtxFit()) {
3450 indices[nindices]=aodt->GetID(); nindices++;
3456 AliESDtrack *esdt = 0;
3459 esdt = (AliESDtrack*)track;
3461 esdt =
new AliESDtrack(track);
3465 okDisplaced=kFALSE; okSoftPi=kFALSE; okFor3Prong=kFALSE; okBachelor=kFALSE;
3467 evtNumber[i]=((AliMixedEvent*)event)->EventIndex(i);
3468 const AliVVertex* eventVtx=((AliMixedEvent*)event)->GetEventVertex(i);
3469 Double_t vtxPos[3],primPos[3],primCov[6],trasl[3];
3470 eventVtx->GetXYZ(vtxPos);
3471 vprimary->GetXYZ(primPos);
3472 eventVtx->GetCovarianceMatrix(primCov);
3473 for(
Int_t ind=0;ind<3;ind++){
3474 trasl[ind]=vtxPos[ind]-primPos[ind];
3477 Bool_t isTransl=esdt->Translate(trasl,primCov);
3485 if(
SingleTrkCuts(esdt,centperc,okDisplaced,okSoftPi,okFor3Prong,okBachelor) && nSeleTrks<trkEntries) {
3486 esdt->PropagateToDCA(
fV1,
fBzkG,kVeryBig);
3487 seleTrksArray.AddLast(esdt);
3488 tracksAtVertex.AddLast(
new AliExternalTrackParam(*esdt));
3489 seleFlags[nSeleTrks]=0;
3490 if(okDisplaced) SETBIT(seleFlags[nSeleTrks],
kBitDispl);
3491 if(okFor3Prong) SETBIT(seleFlags[nSeleTrks],
kBit3Prong);
3492 if(okSoftPi) SETBIT(seleFlags[nSeleTrks],
kBitSoftPi);
3493 if(okBachelor) SETBIT(seleFlags[nSeleTrks],
kBitBachelor);
3501 if(nsigmatofPi>-990. && (nsigmatofPi<-fnSigmaTOFPionLow || nsigmatofPi>
fnSigmaTOFPionHi)){
3505 if(nsigmatofK>-990. && (nsigmatofK<-fnSigmaTOFKaonLow || nsigmatofK>
fnSigmaTOFKaonHi)){
3509 if(nsigmatofP>-990. && (nsigmatofP<-fnSigmaTOFProtonLow || nsigmatofP>
fnSigmaTOFProtonHi)){
3516 if(nsigmatpcPi>-990. && (nsigmatpcPi<-fnSigmaTPCPionLow || nsigmatpcPi>
fnSigmaTPCPionHi)){
3520 if(nsigmatpcK>-990. && (nsigmatpcK<-fnSigmaTPCKaonLow || nsigmatpcK>
fnSigmaTPCKaonHi)){
3524 if(nsigmatpcP>-990. && (nsigmatpcP<-fnSigmaTPCProtonLow || nsigmatpcP>
fnSigmaTPCProtonHi)){
3540 vprimary->GetXYZ(pos);
3541 vprimary->GetCovarianceMatrix(cov);
3542 Double_t chi2toNDF = vprimary->GetChi2perNDF();
3543 Int_t ncontr=nindices;
3544 if(!strcmp(vprimary->GetTitle(),
"VertexerTracksWithContraint")) ncontr += 1;
3546 fV1 =
new AliESDVertex(pos,cov,chi2,ncontr,vprimary->GetName());
3547 fV1->SetTitle(vprimary->GetTitle());
3548 fV1->SetIndices(nindices,indices);
3550 if(indices) {
delete [] indices; indices=NULL; }
3575 Bool_t &okBachelor)
const 3582 if (!trk->PropagateToDCA(
fV1,
fBzkG,kVeryBig))
return kFALSE;
3584 trk->RelateToVertex(
fV1,
fBzkG,kVeryBig);
3600 if(selectInfo) okDisplaced=kTRUE;
3614 if(selectInfo) okFor3Prong=kTRUE;
3621 if(selectInfo) okSoftPi=kTRUE;
3629 if(okDisplaced) selectInfo=1;
3632 if(selectInfo) okBachelor=kTRUE;
3634 if(okDisplaced || okSoftPi || okFor3Prong || okBachelor)
return kTRUE;
3649 Double_t vertex[3]; esdV0->GetXYZ(vertex[0],vertex[1],vertex[2]);
3650 AliAODVertex *vertexV0 =
new AliAODVertex(vertex,esdV0->GetChi2V0(),AliAODVertex::kV0,2);
3655 esdV0->PxPyPz(pxpypz);
3656 Double_t cv[21];
for(
int i=0; i<21; i++) cv[i]=0;
3657 AliNeutralTrackParam *trackesdV0 =
new AliNeutralTrackParam(xyz,pxpypz,cv,0);
3664 trackesdV0->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
3665 Double_t dcaV0ToPrimVertex = TMath::Sqrt(covd0z0[0]);
3667 Double_t dcaV0DaughterToPrimVertex[2];
3668 AliExternalTrackParam *posV0track = (AliExternalTrackParam*)twoTrackArrayV0->UncheckedAt(0);
3669 AliExternalTrackParam *negV0track = (AliExternalTrackParam*)twoTrackArrayV0->UncheckedAt(1);
3670 if( !posV0track || !negV0track) {
3671 if(trackesdV0) {
delete trackesdV0; trackesdV0=NULL;}
3673 delete primVertexAOD;
3676 posV0track->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
3679 dcaV0DaughterToPrimVertex[0] = TMath::Sqrt(covd0z0[0]);
3680 negV0track->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
3683 dcaV0DaughterToPrimVertex[1] = TMath::Sqrt(covd0z0[0]);
3684 Double_t dcaV0Daughters = esdV0->GetDcaV0Daughters();
3686 esdV0->GetNPxPyPz(nmom[0],nmom[1],nmom[2]);
3687 esdV0->GetPPxPyPz(pmom[0],pmom[1],pmom[2]);
3689 AliAODv0 *aodV0 =
new AliAODv0(vertexV0,dcaV0Daughters,dcaV0ToPrimVertex,pmom,nmom,dcaV0DaughterToPrimVertex);
3690 aodV0->SetOnFlyStatus(esdV0->GetOnFlyStatus());
3693 delete primVertexAOD;
3702 const Double_t *par=extpar->GetParameter();
3703 const Double_t *cov=extpar->GetCovariance();
3706 esdt->Set(x,alpha,par,cov);
3713 fMassDzero=TDatabasePDG::Instance()->GetParticle(421)->Mass();
3714 fMassDplus=TDatabasePDG::Instance()->GetParticle(411)->Mass();
3715 fMassDs=TDatabasePDG::Instance()->GetParticle(431)->Mass();
3716 fMassLambdaC=TDatabasePDG::Instance()->GetParticle(4122)->Mass();
3717 fMassDstar=TDatabasePDG::Instance()->GetParticle(413)->Mass();
3718 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.