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"
63 #include "AliAnalysisFilter.h"
65 #include "AliMixedEvent.h"
68 #include "AliCodeTimer.h"
69 #include "AliMultSelection.h"
83 fSecVtxWithKF(kFALSE),
84 fRecoPrimVtxSkippingTrks(kFALSE),
85 fRmTrksFromPrimVtx(kFALSE),
94 fLikeSign3prong(kFALSE),
97 fUseKaonPIDfor3Prong(kFALSE),
100 fUseKaonPIDforDs(kFALSE),
103 fUseTPCPIDOnlyIfNoTOF(kFALSE),
104 fMaxMomForTPCPid(1.),
106 fnSigmaTPCPionLow(5.),
107 fnSigmaTPCPionHi(5.),
108 fnSigmaTOFPionLow(5.),
109 fnSigmaTOFPionHi(5.),
110 fnSigmaTPCKaonLow(5.),
111 fnSigmaTPCKaonHi(5.),
112 fnSigmaTOFKaonLow(5.),
113 fnSigmaTOFKaonHi(5.),
114 fnSigmaTPCProtonLow(5.),
115 fnSigmaTPCProtonHi(5.),
116 fnSigmaTOFProtonLow(5.),
117 fnSigmaTOFProtonHi(5.),
118 fMaxCentPercentileForTightCuts(-9999),
120 fTrackFilter2prongCentral(0x0),
121 fTrackFilter3prongCentral(0x0),
122 fTrackFilterSoftPi(0x0),
125 fCutsDplustoKpipi(0x0),
129 fCutsD0toKpipipi(0x0),
130 fCutsDStartoKpipi(0x0),
132 fFindVertexForDstar(kTRUE),
133 fFindVertexForCascades(kTRUE),
134 fV0TypeForCascadeVertex(0),
135 fMassCutBeforeVertexing(kFALSE),
139 fOKInvMassD0(kFALSE),
140 fOKInvMassJpsi(kFALSE),
141 fOKInvMassDplus(kFALSE),
142 fOKInvMassDs(kFALSE),
143 fOKInvMassLc(kFALSE),
144 fOKInvMassDstar(kFALSE),
145 fOKInvMassD0to4p(kFALSE),
146 fOKInvMassLctoV0(kFALSE),
149 fMakeReducedRHF(kFALSE),
159 Double_t d02[2]={0.,0.};
160 Double_t d03[3]={0.,0.,0.};
161 Double_t d04[4]={0.,0.,0.,0.};
162 fMassCalc2 =
new AliAODRecoDecay(0x0,2,0,d02);
163 fMassCalc3 =
new AliAODRecoDecay(0x0,3,1,d03);
164 fMassCalc4 =
new AliAODRecoDecay(0x0,4,0,d04);
170 fInputAOD(source.fInputAOD),
171 fAODMapSize(source.fAODMapSize),
172 fAODMap(source.fAODMap),
173 fVertexerTracks(source.fVertexerTracks),
175 fSecVtxWithKF(source.fSecVtxWithKF),
176 fRecoPrimVtxSkippingTrks(source.fRecoPrimVtxSkippingTrks),
177 fRmTrksFromPrimVtx(source.fRmTrksFromPrimVtx),
179 fD0toKpi(source.fD0toKpi),
180 fJPSItoEle(source.fJPSItoEle),
181 f3Prong(source.f3Prong),
182 f4Prong(source.f4Prong),
183 fDstar(source.fDstar),
184 fCascades(source.fCascades),
185 fLikeSign(source.fLikeSign),
186 fLikeSign3prong(source.fLikeSign3prong),
187 fMixEvent(source.fMixEvent),
188 fPidResponse(source.fPidResponse),
189 fUseKaonPIDfor3Prong(source.fUseKaonPIDfor3Prong),
190 fUsePIDforLc(source.fUsePIDforLc),
191 fUsePIDforLc2V0(source.fUsePIDforLc2V0),
192 fUseKaonPIDforDs(source.fUseKaonPIDforDs),
193 fUseTPCPID(source.fUseTPCPID),
194 fUseTOFPID(source.fUseTOFPID),
195 fUseTPCPIDOnlyIfNoTOF(source.fUseTPCPIDOnlyIfNoTOF),
196 fMaxMomForTPCPid(source.fMaxMomForTPCPid),
197 fUsePidTag(source.fUsePidTag),
198 fnSigmaTPCPionLow(source.fnSigmaTPCPionLow),
199 fnSigmaTPCPionHi(source.fnSigmaTPCPionHi),
200 fnSigmaTOFPionLow(source.fnSigmaTOFPionLow),
201 fnSigmaTOFPionHi(source.fnSigmaTOFPionHi),
202 fnSigmaTPCKaonLow(source.fnSigmaTPCKaonLow),
203 fnSigmaTPCKaonHi(source.fnSigmaTPCKaonHi),
204 fnSigmaTOFKaonLow(source.fnSigmaTOFKaonLow),
205 fnSigmaTOFKaonHi(source.fnSigmaTOFKaonHi),
206 fnSigmaTPCProtonLow(source.fnSigmaTPCProtonLow),
207 fnSigmaTPCProtonHi(source.fnSigmaTPCProtonHi),
208 fnSigmaTOFProtonLow(source.fnSigmaTOFProtonLow),
209 fnSigmaTOFProtonHi(source.fnSigmaTOFProtonHi),
210 fMaxCentPercentileForTightCuts(source.fMaxCentPercentileForTightCuts),
211 fTrackFilter(source.fTrackFilter),
212 fTrackFilter2prongCentral(source.fTrackFilter2prongCentral),
213 fTrackFilter3prongCentral(source.fTrackFilter3prongCentral),
214 fTrackFilterSoftPi(source.fTrackFilterSoftPi),
215 fCutsD0toKpi(source.fCutsD0toKpi),
216 fCutsJpsitoee(source.fCutsJpsitoee),
217 fCutsDplustoKpipi(source.fCutsDplustoKpipi),
218 fCutsDstoKKpi(source.fCutsDstoKKpi),
219 fCutsLctopKpi(source.fCutsLctopKpi),
220 fCutsLctoV0(source.fCutsLctoV0),
221 fCutsD0toKpipipi(source.fCutsD0toKpipipi),
222 fCutsDStartoKpipi(source.fCutsDStartoKpipi),
223 fListOfCuts(source.fListOfCuts),
224 fFindVertexForDstar(source.fFindVertexForDstar),
225 fFindVertexForCascades(source.fFindVertexForCascades),
226 fV0TypeForCascadeVertex(source.fV0TypeForCascadeVertex),
227 fMassCutBeforeVertexing(source.fMassCutBeforeVertexing),
228 fMassCalc2(source.fMassCalc2),
229 fMassCalc3(source.fMassCalc3),
230 fMassCalc4(source.fMassCalc4),
231 fOKInvMassD0(source.fOKInvMassD0),
232 fOKInvMassJpsi(source.fOKInvMassJpsi),
233 fOKInvMassDplus(source.fOKInvMassDplus),
234 fOKInvMassDs(source.fOKInvMassDs),
235 fOKInvMassLc(source.fOKInvMassLc),
236 fOKInvMassDstar(source.fOKInvMassDstar),
237 fOKInvMassD0to4p(source.fOKInvMassD0to4p),
238 fOKInvMassLctoV0(source.fOKInvMassLctoV0),
241 fMakeReducedRHF(kFALSE),
242 fMassDzero(source.fMassDzero),
243 fMassDplus(source.fMassDplus),
244 fMassDs(source.fMassDs),
245 fMassLambdaC(source.fMassLambdaC),
246 fMassDstar(source.fMassDstar),
247 fMassJpsi(source.fMassJpsi)
259 if(&source ==
this)
return *
this;
365 TList *
list =
new TList();
367 list->SetName(
"ListOfCuts");
371 list->Add(cutsD0toKpi);
375 list->Add(cutsJpsitoee);
379 list->Add(cutsDplustoKpipi);
383 list->Add(cutsDstoKKpi);
387 list->Add(cutsLctopKpi);
391 list->Add(cutsLctoV0);
395 list->Add(cutsD0toKpipipi);
399 list->Add(cutsDStartoKpipi);
404 if (bCutsOk == kFALSE) {AliFatal(
"AliAnalysisVertexingHF::FillListOfCuts vertexing and the analysis task cuts are not consistent!");}
413 TClonesArray *aodVerticesHFTClArr,
414 TClonesArray *aodD0toKpiTClArr,
415 TClonesArray *aodJPSItoEleTClArr,
416 TClonesArray *aodCharm3ProngTClArr,
417 TClonesArray *aodCharm4ProngTClArr,
418 TClonesArray *aodDstarTClArr,
419 TClonesArray *aodCascadesTClArr,
420 TClonesArray *aodLikeSign2ProngTClArr,
421 TClonesArray *aodLikeSign3ProngTClArr)
429 TString evtype =
event->IsA()->GetName();
430 fInputAOD = ((evtype==
"AliAODEvent") ? kTRUE : kFALSE);
434 AliDebug(2,
"Creating HF candidates from AOD");
436 AliDebug(2,
"Creating HF candidates from ESD");
439 if(!aodVerticesHFTClArr) {
440 printf(
"ERROR: no aodVerticesHFTClArr");
444 printf(
"ERROR: no aodD0toKpiTClArr");
448 printf(
"ERROR: no aodJPSItoEleTClArr");
451 if(
f3Prong && !aodCharm3ProngTClArr) {
452 printf(
"ERROR: no aodCharm3ProngTClArr");
455 if(
f4Prong && !aodCharm4ProngTClArr) {
456 printf(
"ERROR: no aodCharm4ProngTClArr");
459 if(
fDstar && !aodDstarTClArr) {
460 printf(
"ERROR: no aodDstarTClArr");
464 printf(
"ERROR: no aodCascadesTClArr ");
467 if(
fLikeSign && !aodLikeSign2ProngTClArr) {
468 printf(
"ERROR: no aodLikeSign2ProngTClArr");
472 printf(
"ERROR: no aodLikeSign3ProngTClArr");
477 Int_t iVerticesHF=0,iD0toKpi=0,iJPSItoEle=0,i3Prong=0,i4Prong=0,iDstar=0,iCascades=0,iLikeSign2Prong=0,iLikeSign3Prong=0;
478 aodVerticesHFTClArr->Delete();
479 iVerticesHF = aodVerticesHFTClArr->GetEntriesFast();
480 TClonesArray &verticesHFRef = *aodVerticesHFTClArr;
482 aodD0toKpiTClArr->Delete();
483 iD0toKpi = aodD0toKpiTClArr->GetEntriesFast();
486 aodJPSItoEleTClArr->Delete();
487 iJPSItoEle = aodJPSItoEleTClArr->GetEntriesFast();
490 aodCharm3ProngTClArr->Delete();
491 i3Prong = aodCharm3ProngTClArr->GetEntriesFast();
494 aodCharm4ProngTClArr->Delete();
495 i4Prong = aodCharm4ProngTClArr->GetEntriesFast();
498 aodDstarTClArr->Delete();
499 iDstar = aodDstarTClArr->GetEntriesFast();
502 aodCascadesTClArr->Delete();
503 iCascades = aodCascadesTClArr->GetEntriesFast();
506 aodLikeSign2ProngTClArr->Delete();
507 iLikeSign2Prong = aodLikeSign2ProngTClArr->GetEntriesFast();
510 aodLikeSign3ProngTClArr->Delete();
511 iLikeSign3Prong = aodLikeSign3ProngTClArr->GetEntriesFast();
514 TClonesArray &aodD0toKpiRef = *aodD0toKpiTClArr;
515 TClonesArray &aodJPSItoEleRef = *aodJPSItoEleTClArr;
516 TClonesArray &aodCharm3ProngRef = *aodCharm3ProngTClArr;
517 TClonesArray &aodCharm4ProngRef = *aodCharm4ProngTClArr;
518 TClonesArray &aodDstarRef = *aodDstarTClArr;
519 TClonesArray &aodCascadesRef = *aodCascadesTClArr;
520 TClonesArray &aodLikeSign2ProngRef = *aodLikeSign2ProngTClArr;
521 TClonesArray &aodLikeSign3ProngRef = *aodLikeSign3ProngTClArr;
529 Int_t iTrkP1,iTrkP2,iTrkN1,iTrkN2,iTrkSoftPi,trkEntries,iv0,nv0;
530 Double_t xdummy,ydummy,dcap1n1,dcap1n2,dcap2n1,dcap1p2,dcan1n2,dcap2n2,dcaV0,dcaCasc;
531 Bool_t okD0=kFALSE,okJPSI=kFALSE,ok3Prong=kFALSE,ok4Prong=kFALSE;
532 Bool_t okDstar=kFALSE,okD0fromDstar=kFALSE;
533 Bool_t okCascades=kFALSE;
534 AliESDtrack *postrack1 = 0;
535 AliESDtrack *postrack2 = 0;
536 AliESDtrack *negtrack1 = 0;
537 AliESDtrack *negtrack2 = 0;
538 AliESDtrack *trackPi = 0;
539 Double_t mompos1[3],mompos2[3],momneg1[3],momneg2[3];
550 AliDebug(2,Form(
" dca cut set to %f cm",dcaMax));
554 fBzkG = (Double_t)event->GetMagneticField();
562 trkEntries = (Int_t)event->GetNumberOfTracks();
563 AliDebug(1,Form(
" Number of tracks: %d",trkEntries));
566 nv0 = (Int_t)event->GetNumberOfV0s();
567 AliDebug(1,Form(
" Number of V0s: %d",nv0));
569 if( trkEntries<2 && (trkEntries<1 || nv0<1) ) {
570 AliDebug(1,Form(
" Not enough tracks: %d",trkEntries));
587 TObjArray seleTrksArray(trkEntries);
588 TObjArray tracksAtVertex(trkEntries);
589 UChar_t *seleFlags =
new UChar_t[trkEntries];
591 Int_t *evtNumber =
new Int_t[trkEntries];
594 AliDebug(1,Form(
" Selected tracks: %d",nSeleTrks));
598 TObjArray *twoTrackArray1 =
new TObjArray(2);
599 TObjArray *twoTrackArray2 =
new TObjArray(2);
600 TObjArray *twoTrackArrayV0 =
new TObjArray(2);
601 TObjArray *twoTrackArrayCasc =
new TObjArray(2);
602 TObjArray *threeTrackArray =
new TObjArray(3);
603 TObjArray *fourTrackArray =
new TObjArray(4);
606 Bool_t isLikeSign2Prong=kFALSE,isLikeSign3Prong=kFALSE;
613 Bool_t massCutOK=kTRUE;
616 for(iTrkP1=0; iTrkP1<nSeleTrks; iTrkP1++) {
622 postrack1 = (AliESDtrack*)seleTrksArray.UncheckedAt(iTrkP1);
623 if(!TESTBIT(seleFlags[iTrkP1],
kBitDispl))
continue;
624 postrack1->GetPxPyPz(mompos1);
630 for(iv0=0; iv0<nv0; iv0++){
638 v0 = ((AliAODEvent*)event)->GetV0(iv0);
640 esdV0 = ((AliESDEvent*)event)->GetV0(iv0);
642 if ( (!v0 || !v0->IsA()->InheritsFrom(
"AliAODv0") ) &&
643 (!esdV0 || !esdV0->IsA()->InheritsFrom(
"AliESDv0") ) )
continue;
654 AliExternalTrackParam * posV0track;
655 AliExternalTrackParam * negV0track;
658 AliAODTrack *posVV0track = (AliAODTrack*)(v0->GetDaughter(0));
659 AliAODTrack *negVV0track = (AliAODTrack*)(v0->GetDaughter(1));
660 if( !posVV0track || !negVV0track )
continue;
665 if (posVV0track->GetID() == postrack1->GetID() ||
666 negVV0track->GetID() == postrack1->GetID())
continue;
668 if ( posVV0track->Charge() == negVV0track->Charge() )
continue;
670 if(!(posVV0track->GetStatus() & AliESDtrack::kTPCrefit) ||
671 !(negVV0track->GetStatus() & AliESDtrack::kTPCrefit))
continue;
673 Double_t xyz[3], pxpypz[3], cv[21]; Short_t sign;
674 posVV0track->PxPyPz(pxpypz); posVV0track->XvYvZv(xyz);
675 posVV0track->GetCovarianceXYZPxPyPz(cv); sign=posVV0track->Charge();
676 posV0track =
new AliExternalTrackParam(xyz,pxpypz,cv,sign);
677 negVV0track->PxPyPz(pxpypz); negVV0track->XvYvZv(xyz);
678 negVV0track->GetCovarianceXYZPxPyPz(cv); sign=negVV0track->Charge();
679 negV0track =
new AliExternalTrackParam(xyz,pxpypz,cv,sign);
681 AliESDtrack *posVV0track = (AliESDtrack*)(event->GetTrack( esdV0->GetPindex() ));
682 AliESDtrack *negVV0track = (AliESDtrack*)(event->GetTrack( esdV0->GetNindex() ));
683 if( !posVV0track || !negVV0track )
continue;
688 if (posVV0track->GetID() == postrack1->GetID() ||
689 negVV0track->GetID() == postrack1->GetID())
continue;
691 if ( posVV0track->Charge() == negVV0track->Charge() )
continue;
693 if(!(posVV0track->GetStatus() & AliESDtrack::kTPCrefit) ||
694 !(negVV0track->GetStatus() & AliESDtrack::kTPCrefit))
continue;
696 if (posVV0track->GetKinkIndex(0)>0 || negVV0track->GetKinkIndex(0)>0)
continue;
698 posV0track =
new AliExternalTrackParam(*posVV0track);
699 negV0track =
new AliExternalTrackParam(*negVV0track);
704 if( !posV0track || !negV0track ){
705 AliDebug(1,Form(
" Couldn't get the V0 daughters"));
710 twoTrackArrayV0->AddAt(posV0track,0);
711 twoTrackArrayV0->AddAt(negV0track,1);
714 dcaV0 = v0->DcaV0Daughters();
717 AliNeutralTrackParam *trackV0=NULL;
719 const AliVTrack *trackVV0 =
dynamic_cast<const AliVTrack*
>(v0);
720 if(trackVV0) trackV0 =
new AliNeutralTrackParam(trackVV0);
722 Double_t xyz[3], pxpypz[3];
724 esdV0->PxPyPz(pxpypz);
725 Double_t cv[21];
for(
int i=0; i<21; i++) cv[i]=0;
726 trackV0 =
new AliNeutralTrackParam(xyz,pxpypz,cv,0);
731 twoTrackArrayCasc->AddAt(postrack1,0);
732 twoTrackArrayCasc->AddAt(trackV0,1);
734 AliAODVertex *vertexCasc = 0;
737 dcaCasc = postrack1->GetDCA(trackV0,
fBzkG,xdummy,ydummy);
742 Double_t pos[3],cov[6],chi2perNDF;
744 fV1->GetCovMatrix(cov);
745 chi2perNDF =
fV1->GetChi2toNDF();
746 vertexCasc =
new AliAODVertex(pos,cov,chi2perNDF,0x0,-1,AliAODVertex::kUndef,2);
750 delete posV0track; posV0track=NULL;
751 delete negV0track; negV0track=NULL;
752 delete trackV0; trackV0=NULL;
754 twoTrackArrayV0->Clear();
755 twoTrackArrayCasc->Clear();
760 ioCascade =
MakeCascade(twoTrackArrayCasc,event,vertexCasc,v0,dcaCasc,okCascades);
761 if(okCascades && ioCascade) {
766 UShort_t
id[2]={(UShort_t)postrack1->GetID(),(UShort_t)iv0};
770 AliAODVertex *vCasc =
new(verticesHFRef[iVerticesHF++])AliAODVertex(*vertexCasc);
771 rc->SetSecondaryVtx(vCasc);
772 vCasc->SetParent(rc);
774 AddRefs(vCasc,rc,event,twoTrackArrayCasc);
775 vCasc->AddDaughter(v0);
782 delete posV0track; posV0track=NULL;
783 delete negV0track; negV0track=NULL;
784 delete trackV0; trackV0=NULL;
785 twoTrackArrayV0->Clear();
786 twoTrackArrayCasc->Clear();
787 if(ioCascade) {
delete ioCascade; ioCascade=NULL; }
788 if(vertexCasc) {
delete vertexCasc; vertexCasc=NULL; }
796 AliDebug(1,Form(
" Not enough tracks: %d",trkEntries));
800 if(postrack1->Charge()<0 && !
fLikeSign)
continue;
803 for(iTrkN1=0; iTrkN1<nSeleTrks; iTrkN1++) {
808 if(iTrkN1==iTrkP1)
continue;
811 negtrack1 = (AliESDtrack*)seleTrksArray.UncheckedAt(iTrkN1);
813 if(negtrack1->Charge()>0 && !
fLikeSign)
continue;
815 if(!TESTBIT(seleFlags[iTrkN1],
kBitDispl))
continue;
818 if(evtNumber[iTrkP1]==evtNumber[iTrkN1])
continue;
821 if(postrack1->Charge()==negtrack1->Charge()) {
822 isLikeSign2Prong=kTRUE;
824 if(iTrkN1<iTrkP1)
continue;
826 isLikeSign2Prong=kFALSE;
827 if(postrack1->Charge()<0 || negtrack1->Charge()>0)
continue;
829 if(evtNumber[iTrkP1]==evtNumber[iTrkN1])
continue;
839 negtrack1->GetPxPyPz(momneg1);
842 dcap1n1 = postrack1->GetDCA(negtrack1,
fBzkG,xdummy,ydummy);
843 if(dcap1n1>dcaMax) { negtrack1=0;
continue; }
846 twoTrackArray1->AddAt(postrack1,0);
847 twoTrackArray1->AddAt(negtrack1,1);
850 twoTrackArray1->Clear();
857 io2Prong =
Make2Prong(twoTrackArray1,event,vertexp1n1,dcap1n1,okD0,okJPSI,okD0fromDstar);
859 if((
fD0toKpi && okD0) || (
fJPSItoEle && okJPSI) || (isLikeSign2Prong && (okD0 || okJPSI))) {
861 AliAODVertex *v2Prong =0x0;
862 if(!
fMakeReducedRHF)v2Prong =
new(verticesHFRef[iVerticesHF++])AliAODVertex(*vertexp1n1);
863 if(!isLikeSign2Prong) {
872 rd->SetSecondaryVtx(v2Prong);
873 v2Prong->SetParent(rd);
874 AddRefs(v2Prong,rd,event,twoTrackArray1);
883 if(!okD0) v2Prong->SetParent(rd);
884 AddRefs(v2Prong,rd,event,twoTrackArray1);
895 rd->SetSecondaryVtx(v2Prong);
896 v2Prong->SetParent(rd);
897 AddRefs(v2Prong,rd,event,twoTrackArray1);
902 if(
fDstar && okD0fromDstar && !isLikeSign2Prong) {
907 vertexp1n1->AddDaughter(postrack1);
908 vertexp1n1->AddDaughter(negtrack1);
910 io2Prong->SetSecondaryVtx(vertexp1n1);
913 AliNeutralTrackParam *trackD0 =
new AliNeutralTrackParam(io2Prong);
916 for(iTrkSoftPi=0; iTrkSoftPi<nSeleTrks; iTrkSoftPi++) {
918 if(iTrkSoftPi==iTrkP1 || iTrkSoftPi==iTrkN1)
continue;
920 if(!TESTBIT(seleFlags[iTrkSoftPi],
kBitSoftPi))
continue;
923 if(evtNumber[iTrkP1]==evtNumber[iTrkSoftPi] ||
924 evtNumber[iTrkN1]==evtNumber[iTrkSoftPi] ||
925 evtNumber[iTrkP1]==evtNumber[iTrkN1])
continue;
930 trackD0->PropagateToDCA(
fV1,
fBzkG,kVeryBig);
931 if(trackD0->GetSigmaY2()<0. || trackD0->GetSigmaZ2()<0.)
continue;
934 trackPi = (AliESDtrack*)seleTrksArray.UncheckedAt(iTrkSoftPi);
937 twoTrackArrayCasc->AddAt(trackPi,0);
938 twoTrackArrayCasc->AddAt(trackD0,1);
940 twoTrackArrayCasc->Clear();
945 AliAODVertex *vertexCasc = 0;
949 dcaCasc = trackPi->GetDCA(trackD0,
fBzkG,xdummy,ydummy);
954 Double_t pos[3],cov[6],chi2perNDF;
956 fV1->GetCovMatrix(cov);
957 chi2perNDF =
fV1->GetChi2toNDF();
958 vertexCasc =
new AliAODVertex(pos,cov,chi2perNDF,0x0,-1,AliAODVertex::kUndef,2);
962 twoTrackArrayCasc->Clear();
967 ioCascade =
MakeCascade(twoTrackArrayCasc,event,vertexCasc,io2Prong,dcaCasc,okDstar);
976 AliAODVertex *v2Prong =
new (verticesHFRef[iVerticesHF++])AliAODVertex(*vertexp1n1);
977 rd->SetSecondaryVtx(v2Prong);
978 v2Prong->SetParent(rd);
979 AddRefs(v2Prong,rd,event,twoTrackArray1);
987 AliAODVertex *vCasc = 0x0;
990 UShort_t idCasc[2]={(UShort_t)trackPi->GetID(),(UShort_t)(iD0toKpi-1)};
995 AliAODVertex *vCasc =
new(verticesHFRef[iVerticesHF++])AliAODVertex(*vertexCasc);
996 rc->SetSecondaryVtx(vCasc);
997 vCasc->SetParent(rc);
999 AddRefs(vCasc,rc,event,twoTrackArrayCasc);
1000 vCasc->AddDaughter(rd);
1003 twoTrackArrayCasc->Clear();
1005 if(ioCascade) {
delete ioCascade; ioCascade=NULL;}
1006 delete vertexCasc; vertexCasc=NULL;
1009 if(trackD0) {
delete trackD0; trackD0=NULL;}
1012 if(io2Prong) {
delete io2Prong; io2Prong=NULL;}
1015 twoTrackArray1->Clear();
1017 (isLikeSign2Prong && !
f3Prong) ) {
1025 for(iTrkP2=iTrkP1+1; iTrkP2<nSeleTrks; iTrkP2++) {
1027 if(iTrkP2==iTrkP1 || iTrkP2==iTrkN1)
continue;
1032 postrack2 = (AliESDtrack*)seleTrksArray.UncheckedAt(iTrkP2);
1034 if(postrack2->Charge()<0)
continue;
1036 if(!TESTBIT(seleFlags[iTrkP2],
kBitDispl))
continue;
1039 if(!TESTBIT(seleFlags[iTrkP2],
kBit3Prong))
continue;
1040 if(!TESTBIT(seleFlags[iTrkP1],
kBit3Prong))
continue;
1041 if(!TESTBIT(seleFlags[iTrkN1],
kBit3Prong))
continue;
1044 if(evtNumber[iTrkP1]==evtNumber[iTrkP2] ||
1045 evtNumber[iTrkN1]==evtNumber[iTrkP2] ||
1046 evtNumber[iTrkP1]==evtNumber[iTrkN1])
continue;
1049 if(isLikeSign2Prong) {
1051 if(postrack1->Charge()>0) {
1052 isLikeSign3Prong=kTRUE;
1057 isLikeSign3Prong=kFALSE;
1059 if(evtNumber[iTrkP1]==evtNumber[iTrkP2] ||
1060 evtNumber[iTrkN1]==evtNumber[iTrkP2] ||
1061 evtNumber[iTrkP1]==evtNumber[iTrkN1])
continue;
1068 Bool_t okForLcTopKpi=kTRUE;
1069 Int_t pidLcStatus=3;
1073 okForLcTopKpi=kFALSE;
1077 okForLcTopKpi=kFALSE;
1081 okForLcTopKpi=kTRUE;
1086 okForLcTopKpi=kTRUE;
1091 Bool_t okForDsToKKpi=kTRUE;
1094 !TESTBIT(seleFlags[iTrkP2],
kBitKaonCompat) ) okForDsToKKpi=kFALSE;
1106 dcap2n1 = postrack2->GetDCA(negtrack1,
fBzkG,xdummy,ydummy);
1107 if(dcap2n1>dcaMax) { postrack2=0;
continue; }
1108 dcap1p2 = postrack2->GetDCA(postrack1,
fBzkG,xdummy,ydummy);
1109 if(dcap1p2>dcaMax) { postrack2=0;
continue; }
1114 if(postrack2->Charge()>0) {
1115 threeTrackArray->AddAt(postrack1,0);
1116 threeTrackArray->AddAt(negtrack1,1);
1117 threeTrackArray->AddAt(postrack2,2);
1119 threeTrackArray->AddAt(negtrack1,0);
1120 threeTrackArray->AddAt(postrack1,1);
1121 threeTrackArray->AddAt(postrack2,2);
1124 postrack2->GetPxPyPz(mompos2);
1125 Double_t pxDau[3]={mompos1[0],momneg1[0],mompos2[0]};
1126 Double_t pyDau[3]={mompos1[1],momneg1[1],mompos2[1]};
1127 Double_t pzDau[3]={mompos1[2],momneg1[2],mompos2[2]};
1134 threeTrackArray->Clear();
1142 twoTrackArray2->AddAt(postrack2,0);
1143 twoTrackArray2->AddAt(negtrack1,1);
1146 twoTrackArray2->Clear();
1155 io3Prong =
Make3Prong(threeTrackArray,event,secVert3PrAOD,dispersion,vertexp1n1,vertexp2n1,dcap1n1,dcap2n1,dcap1p2,okForLcTopKpi,okForDsToKKpi,ok3Prong);
1157 AliAODVertex *v3Prong=0x0;
1158 if(!
fMakeReducedRHF)v3Prong =
new (verticesHFRef[iVerticesHF++])AliAODVertex(*secVert3PrAOD);
1159 if(!isLikeSign3Prong) {
1169 v3Prong =
new (verticesHFRef[iVerticesHF++])AliAODVertex(*secVert3PrAOD);
1170 rd->SetSecondaryVtx(v3Prong);
1171 v3Prong->SetParent(rd);
1172 AddRefs(v3Prong,rd,event,threeTrackArray);
1185 rd->SetSecondaryVtx(v3Prong);
1186 v3Prong->SetParent(rd);
1187 AddRefs(v3Prong,rd,event,threeTrackArray);
1193 if(io3Prong) {
delete io3Prong; io3Prong=NULL;}
1194 if(secVert3PrAOD) {
delete secVert3PrAOD; secVert3PrAOD=NULL;}
1200 && !isLikeSign2Prong && !isLikeSign3Prong
1202 && dcap1n1 < fCutsD0toKpipipi->GetDCACut()
1203 && dcap2n1 < fCutsD0toKpipipi->GetDCACut()) {
1213 threeTrackArray->AddAt(postrack1,0);
1214 threeTrackArray->AddAt(negtrack1,1);
1215 threeTrackArray->AddAt(postrack2,2);
1219 for(iTrkN2=iTrkN1+1; iTrkN2<nSeleTrks; iTrkN2++) {
1221 if(iTrkN2==iTrkP1 || iTrkN2==iTrkP2 || iTrkN2==iTrkN1)
continue;
1226 negtrack2 = (AliESDtrack*)seleTrksArray.UncheckedAt(iTrkN2);
1228 if(negtrack2->Charge()>0)
continue;
1230 if(!TESTBIT(seleFlags[iTrkN2],
kBitDispl))
continue;
1232 if(evtNumber[iTrkP1]==evtNumber[iTrkN2] ||
1233 evtNumber[iTrkN1]==evtNumber[iTrkN2] ||
1234 evtNumber[iTrkP2]==evtNumber[iTrkN2] ||
1235 evtNumber[iTrkP1]==evtNumber[iTrkN1] ||
1236 evtNumber[iTrkP1]==evtNumber[iTrkP2] ||
1237 evtNumber[iTrkN1]==evtNumber[iTrkP2])
continue;
1250 dcap1n2 = postrack1->GetDCA(negtrack2,
fBzkG,xdummy,ydummy);
1252 dcap2n2 = postrack2->GetDCA(negtrack2,
fBzkG,xdummy,ydummy);
1256 fourTrackArray->AddAt(postrack1,0);
1257 fourTrackArray->AddAt(negtrack1,1);
1258 fourTrackArray->AddAt(postrack2,2);
1259 fourTrackArray->AddAt(negtrack2,3);
1267 fourTrackArray->Clear();
1274 io4Prong =
Make4Prong(fourTrackArray,event,secVert4PrAOD,vertexp1n1,vertexp1n1p2,dcap1n1,dcap1n2,dcap2n1,dcap2n2,ok4Prong);
1281 AliAODVertex *v4Prong =
new(verticesHFRef[iVerticesHF++])AliAODVertex(*secVert4PrAOD);
1282 rd->SetSecondaryVtx(v4Prong);
1283 v4Prong->SetParent(rd);
1284 AddRefs(v4Prong,rd,event,fourTrackArray);
1288 if(io4Prong) {
delete io4Prong; io4Prong=NULL;}
1289 if(secVert4PrAOD) {
delete secVert4PrAOD; secVert4PrAOD=NULL;}
1290 fourTrackArray->Clear();
1295 threeTrackArray->Clear();
1296 delete vertexp1n1p2;
1305 twoTrackArray2->Clear();
1308 for(iTrkN2=iTrkN1+1; iTrkN2<nSeleTrks; iTrkN2++) {
1310 if(iTrkN2==iTrkP1 || iTrkN2==iTrkP2 || iTrkN2==iTrkN1)
continue;
1315 negtrack2 = (AliESDtrack*)seleTrksArray.UncheckedAt(iTrkN2);
1317 if(negtrack2->Charge()>0)
continue;
1319 if(!TESTBIT(seleFlags[iTrkN2],
kBitDispl))
continue;
1322 if(!TESTBIT(seleFlags[iTrkN2],
kBit3Prong))
continue;
1323 if(!TESTBIT(seleFlags[iTrkP1],
kBit3Prong))
continue;
1324 if(!TESTBIT(seleFlags[iTrkN1],
kBit3Prong))
continue;
1327 if(evtNumber[iTrkP1]==evtNumber[iTrkN2] ||
1328 evtNumber[iTrkN1]==evtNumber[iTrkN2] ||
1329 evtNumber[iTrkP1]==evtNumber[iTrkN1])
continue;
1332 if(isLikeSign2Prong) {
1334 if(postrack1->Charge()<0) {
1335 isLikeSign3Prong=kTRUE;
1340 isLikeSign3Prong=kFALSE;
1346 Bool_t okForLcTopKpi=kTRUE;
1347 Int_t pidLcStatus=3;
1351 okForLcTopKpi=kFALSE;
1355 okForLcTopKpi=kFALSE;
1359 okForLcTopKpi=kTRUE;
1364 okForLcTopKpi=kTRUE;
1369 Bool_t okForDsToKKpi=kTRUE;
1372 !TESTBIT(seleFlags[iTrkN2],
kBitKaonCompat) ) okForDsToKKpi=kFALSE;
1384 dcap1n2 = postrack1->GetDCA(negtrack2,
fBzkG,xdummy,ydummy);
1385 if(dcap1n2>dcaMax) { negtrack2=0;
continue; }
1386 dcan1n2 = negtrack1->GetDCA(negtrack2,
fBzkG,xdummy,ydummy);
1387 if(dcan1n2>dcaMax) { negtrack2=0;
continue; }
1389 threeTrackArray->AddAt(negtrack1,0);
1390 threeTrackArray->AddAt(postrack1,1);
1391 threeTrackArray->AddAt(negtrack2,2);
1396 negtrack2->GetPxPyPz(momneg2);
1397 Double_t pxDau[3]={momneg1[0],mompos1[0],momneg2[0]};
1398 Double_t pyDau[3]={momneg1[1],mompos1[1],momneg2[1]};
1399 Double_t pzDau[3]={momneg1[2],mompos1[2],momneg2[2]};
1404 threeTrackArray->Clear();
1410 twoTrackArray2->AddAt(postrack1,0);
1411 twoTrackArray2->AddAt(negtrack2,1);
1415 twoTrackArray2->Clear();
1422 io3Prong =
Make3Prong(threeTrackArray,event,secVert3PrAOD,dispersion,vertexp1n1,vertexp1n2,dcap1n1,dcap1n2,dcan1n2,okForLcTopKpi,okForDsToKKpi,ok3Prong);
1424 AliAODVertex *v3Prong = 0x0;
1425 if(!
fMakeReducedRHF) v3Prong =
new(verticesHFRef[iVerticesHF++])AliAODVertex(*secVert3PrAOD);
1426 if(!isLikeSign3Prong) {
1435 rd->SetSecondaryVtx(v3Prong);
1436 v3Prong->SetParent(rd);
1437 AddRefs(v3Prong,rd,event,threeTrackArray);
1449 rd->SetSecondaryVtx(v3Prong);
1450 v3Prong->SetParent(rd);
1451 AddRefs(v3Prong,rd,event,threeTrackArray);
1457 if(io3Prong) {
delete io3Prong; io3Prong=NULL;}
1458 if(secVert3PrAOD) {
delete secVert3PrAOD; secVert3PrAOD=NULL;}
1460 threeTrackArray->Clear();
1466 twoTrackArray2->Clear();
1479 AliDebug(1,Form(
" D0->Kpi in event = %d;",
1480 (Int_t)aodD0toKpiTClArr->GetEntriesFast()));
1483 AliDebug(1,Form(
" JPSI->ee in event = %d;",
1484 (Int_t)aodJPSItoEleTClArr->GetEntriesFast()));
1487 AliDebug(1,Form(
" Charm->3Prong in event = %d;",
1488 (Int_t)aodCharm3ProngTClArr->GetEntriesFast()));
1491 AliDebug(1,Form(
" Charm->4Prong in event = %d;\n",
1492 (Int_t)aodCharm4ProngTClArr->GetEntriesFast()));
1495 AliDebug(1,Form(
" D*->D0pi in event = %d;\n",
1496 (Int_t)aodDstarTClArr->GetEntriesFast()));
1499 AliDebug(1,Form(
" cascades -> v0 + track in event = %d;\n",
1500 (Int_t)aodCascadesTClArr->GetEntriesFast()));
1503 AliDebug(1,Form(
" Like-sign 2Prong in event = %d;\n",
1504 (Int_t)aodLikeSign2ProngTClArr->GetEntriesFast()));
1507 AliDebug(1,Form(
" Like-sign 3Prong in event = %d;\n",
1508 (Int_t)aodLikeSign3ProngTClArr->GetEntriesFast()));
1512 twoTrackArray1->Delete();
delete twoTrackArray1;
1513 twoTrackArray2->Delete();
delete twoTrackArray2;
1514 twoTrackArrayCasc->Delete();
delete twoTrackArrayCasc;
1515 twoTrackArrayV0->Delete();
delete twoTrackArrayV0;
1516 threeTrackArray->Clear();
1517 threeTrackArray->Delete();
delete threeTrackArray;
1518 fourTrackArray->Delete();
delete fourTrackArray;
1519 delete [] seleFlags; seleFlags=NULL;
1520 if(evtNumber) {
delete [] evtNumber; evtNumber=NULL;}
1521 tracksAtVertex.Delete();
1524 seleTrksArray.Delete();
1535 const AliVEvent *event,
1536 const TObjArray *trkArray)
const
1560 const AliVEvent *event,
1561 const TObjArray *trkArray)
const
1566 Int_t nDg = v->GetNDaughters();
1568 if(nDg) dg = v->GetDaughter(0);
1572 Int_t nTrks = trkArray->GetEntriesFast();
1574 AliExternalTrackParam *track = 0;
1575 AliAODTrack *aodTrack = 0;
1578 for(Int_t i=0; i<nTrks; i++) {
1579 track = (AliExternalTrackParam*)trkArray->UncheckedAt(i);
1580 id = (Int_t)track->GetID();
1583 aodTrack =
dynamic_cast<AliAODTrack*
>(
event->GetTrack(
fAODMap[
id]));
1584 if(!aodTrack) AliFatal(
"Not a standard AOD");
1585 v->AddDaughter(aodTrack);
1599 TClonesArray *inputArray=(TClonesArray*)aod->GetList()->FindObject(
"VerticesHF");
1600 if(!inputArray)
return;
1602 AliAODTrack *track = 0;
1603 AliAODVertex *vertex = 0;
1605 Bool_t needtofix=kFALSE;
1606 for(Int_t iv=0; iv<inputArray->GetEntriesFast(); iv++) {
1607 vertex = (AliAODVertex*)inputArray->UncheckedAt(iv);
1608 for(Int_t
id=0;
id<vertex->GetNDaughters();
id++) {
1609 track = (AliAODTrack*)vertex->GetDaughter(
id);
1610 if(!track->GetStatus()) needtofix=kTRUE;
1612 if(needtofix)
break;
1615 if(!needtofix)
return;
1618 printf(
"Fixing references\n");
1624 for(Int_t i=0; i<aod->GetNumberOfTracks(); i++) {
1625 track =
dynamic_cast<AliAODTrack*
>(aod->GetTrack(i));
1626 if(!track) AliFatal(
"Not a standard AOD");
1629 if(track->GetStatus()&AliESDtrack::kITSpureSA)
continue;
1632 if(!(track->GetStatus()&AliESDtrack::kITSin))
continue;
1635 Double_t covtest[21];
1636 if(!track->GetCovarianceXYZPxPyPz(covtest))
continue;
1639 Int_t ind = (Int_t)track->GetID();
1640 if (ind>-1 && ind < fAODMapSize)
fAODMap[ind] = i;
1644 Int_t ids[4]={-1,-1,-1,-1};
1645 for(Int_t iv=0; iv<inputArray->GetEntriesFast(); iv++) {
1646 Bool_t cascade=kFALSE;
1647 vertex = (AliAODVertex*)inputArray->UncheckedAt(iv);
1649 Int_t nDgs = vertex->GetNDaughters();
1650 for(
id=0;
id<nDgs;
id++) {
1651 track = (AliAODTrack*)vertex->GetDaughter(
id);
1652 if(track->Charge()==0) {cascade=kTRUE;
continue;}
1653 ids[id]=(Int_t)track->GetID();
1654 vertex->RemoveDaughter(track);
1656 if(cascade)
continue;
1657 for(
id=0;
id<nDgs;
id++) {
1658 if (ids[
id]>-1 && ids[
id] < fAODMapSize) {
1659 track =
dynamic_cast<AliAODTrack*
>(aod->GetTrack(
fAODMap[ids[
id]]));
1660 if(!track) AliFatal(
"Not a standard AOD");
1661 vertex->AddDaughter(track);
1677 TObjArray *threeTrackArray =
new TObjArray(3);
1680 if(!track1)
return kFALSE;
1682 if(!track2)
return kFALSE;
1683 AliESDtrack *postrack1 = 0;
1684 AliESDtrack *negtrack1 = 0;
1685 postrack1 =
new AliESDtrack(track1);
1686 negtrack1 =
new AliESDtrack(track2);
1689 Double_t xdummy, ydummy;
1690 fBzkG = (Double_t)event->GetMagneticField();
1691 Double_t dca12 = postrack1->GetDCA(negtrack1,
fBzkG,xdummy,ydummy);
1693 const AliVVertex *vprimary =
event->GetPrimaryVertex();
1696 vprimary->GetXYZ(pos);
1697 vprimary->GetCovarianceMatrix(cov);
1698 fV1 =
new AliESDVertex(pos,cov,100.,100,vprimary->GetName());
1699 fV1->GetCovMatrix(cov);
1703 if(!track3)
return kFALSE;
1704 AliESDtrack *esdt3 =
new AliESDtrack(track3);
1708 threeTrackArray->AddAt(postrack1,0);
1709 threeTrackArray->AddAt(negtrack1,1);
1710 threeTrackArray->AddAt(esdt3,2);
1711 dca2 = esdt3->GetDCA(negtrack1,
fBzkG,xdummy,ydummy);
1712 dca3 = esdt3->GetDCA(postrack1,
fBzkG,xdummy,ydummy);
1713 Double_t dispersion;
1716 if (!secVert3PrAOD) {
1717 threeTrackArray->Clear();
1718 threeTrackArray->Delete();
delete threeTrackArray;
1720 delete postrack1; postrack1=NULL;
1721 delete negtrack1; negtrack1=NULL;
1722 delete esdt3; esdt3=NULL;
1728 rd=
Make3Prong(threeTrackArray, event, secVert3PrAOD,dispersion, vtxRec, vertexp2n1, dca12, dca2, dca3, rd);
1731 threeTrackArray->Clear();
1732 threeTrackArray->Delete();
delete threeTrackArray;
1734 delete postrack1; postrack1=NULL;
1735 delete negtrack1; negtrack1=NULL;
1736 delete esdt3; esdt3=NULL;
1747 Double_t dispersion;
1748 TObjArray *twoTrackArray1 =
new TObjArray(2);
1751 if(!track1)
return kFALSE;
1753 if(!track2)
return kFALSE;
1755 AliESDtrack *esdt1 = 0;
1756 AliESDtrack *esdt2 = 0;
1757 esdt1 =
new AliESDtrack(track1);
1758 esdt2 =
new AliESDtrack(track2);
1760 twoTrackArray1->AddAt(esdt1,0);
1761 twoTrackArray1->AddAt(esdt2,1);
1763 Double_t xdummy, ydummy;
1764 fBzkG = (Double_t)event->GetMagneticField();
1765 Double_t dca12 = esdt1->GetDCA(esdt2,
fBzkG,xdummy,ydummy);
1766 const AliVVertex *vprimary =
event->GetPrimaryVertex();
1769 vprimary->GetXYZ(pos);
1770 vprimary->GetCovarianceMatrix(cov);
1771 fV1 =
new AliESDVertex(pos,cov,100.,100,vprimary->GetName());
1772 fV1->GetCovMatrix(cov);
1778 twoTrackArray1->Clear();
1779 twoTrackArray1->Delete();
delete twoTrackArray1;
1781 delete esdt1; esdt1=NULL;
1782 delete esdt2; esdt2=NULL;
1785 Bool_t okJPSI=kFALSE;
1786 Bool_t okD0FromDstar=kFALSE;
1787 Bool_t refill =kTRUE;
1788 rd=
Make2Prong(twoTrackArray1, event, vtxRec, dca12, okD0, okJPSI, okD0FromDstar,refill,rd);
1792 twoTrackArray1->Clear();
1793 twoTrackArray1->Delete();
delete twoTrackArray1;
1794 delete esdt1; esdt1=NULL;
1795 delete esdt2; esdt2=NULL;
1804 TObjArray *twoTrackArrayCasc =
new TObjArray(2);
1806 AliAODTrack *trackB =(AliAODTrack*)event->GetTrack(
fAODMap[rCasc->
GetProngID(0)]);
1807 if(!trackB)
return kFALSE;
1809 AliNeutralTrackParam *trackV0=NULL;
1814 TClonesArray *inputArrayD0=(TClonesArray*)event->GetList()->FindObject(
"D0toKpi");
1815 if(!inputArrayD0)
return kFALSE;
1817 if(!trackD0)
return kFALSE;
1820 trackV0 =
new AliNeutralTrackParam(trackD0);
1823 v0 = ((AliAODEvent*)event)->GetV0(rCasc->
GetProngID(1));
1824 if(!v0)
return kFALSE;
1826 const AliVTrack *trackVV0 =
dynamic_cast<const AliVTrack*
>(v0);
1827 if(trackVV0) trackV0 =
new AliNeutralTrackParam(trackVV0);
1830 AliESDtrack *esdB =
new AliESDtrack(trackB);
1832 twoTrackArrayCasc->AddAt(esdB,0);
1833 twoTrackArrayCasc->AddAt(trackV0,1);
1835 fBzkG = (Double_t)event->GetMagneticField();
1836 const AliVVertex *vprimary =
event->GetPrimaryVertex();
1840 vprimary->GetXYZ(pos);
1841 vprimary->GetCovarianceMatrix(cov);
1842 fV1 =
new AliESDVertex(pos,cov,100.,100,vprimary->GetName());
1843 fV1->GetCovMatrix(cov);
1846 AliAODVertex *vtxCasc = 0x0;
1847 Double_t chi2perNDF =
fV1->GetChi2toNDF();
1848 vtxCasc =
new AliAODVertex(pos,cov,chi2perNDF,0x0,-1,AliAODVertex::kUndef,2);
1850 twoTrackArrayCasc->Clear();
1851 twoTrackArrayCasc->Delete();
delete twoTrackArrayCasc;
1853 delete esdB; esdB=NULL;
1854 delete vtxCasc;vtxCasc=NULL;
1855 delete trackB; trackB=NULL;
1856 delete trackV0; trackV0=NULL;
1862 vtxCasc->SetParent(rCasc);
1863 rCasc->SetSecondaryVtx(vtxCasc);
1865 if(DStar)vtxCasc->AddDaughter(trackD0);
1866 else vtxCasc->AddDaughter(v0);
1869 Bool_t refill =kTRUE;
1870 Bool_t dummy1, dummy2, dummy3;
1872 Double_t px[2],py[2],pz[2],d0[2],d0err[2];
1874 esdB->PropagateToDCA(vtxCasc,
fBzkG,kVeryBig);
1875 trackV0->PropagateToDCA(vtxCasc,
fBzkG,kVeryBig);
1876 Double_t momentum[3];
1877 esdB->GetPxPyPz(momentum);
1878 px[0] = momentum[0]; py[0] = momentum[1]; pz[0] = momentum[2];
1879 trackV0->GetPxPyPz(momentum);
1880 px[1] = momentum[0]; py[1] = momentum[1]; pz[1] = momentum[2];
1882 AliAODVertex *primVertexAOD =
PrimaryVertex(twoTrackArrayCasc,event);
1885 delete vtxCasc; vtxCasc=NULL;
1886 twoTrackArrayCasc->Clear();
1887 twoTrackArrayCasc->Delete();
delete twoTrackArrayCasc;
1888 delete esdB; esdB=NULL;
1889 delete trackV0; trackV0=NULL;
1893 Double_t d0z0[2],covd0z0[3];
1894 esdB->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
1896 d0err[0] = TMath::Sqrt(covd0z0[0]);
1897 trackV0->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
1899 d0err[1] = TMath::Sqrt(covd0z0[0]);
1900 rCasc->SetPxPyPzProngs(2,px,py,pz);
1902 rCasc->Setd0Prongs(2,d0);
1904 rCasc->SetCharge(esdB->Charge());
1906 Double_t esdpid0[5]={0.,0.,0.,0.,0.};
1907 if(esdB->GetStatus()&AliESDtrack::kESDpid) esdB->GetESDpid(esdpid0);
1908 Double_t esdpid1[5]={0.,0.,0.,0.,0.};
1909 Double_t esdpid[10];
1910 for(Int_t i=0;i<5;i++) {
1911 esdpid[i] = esdpid0[i];
1912 esdpid[5+i] = esdpid1[i];
1914 rCasc->SetPID(2,esdpid);
1919 if(primVertexAOD) {
delete primVertexAOD; primVertexAOD=NULL;}
1920 twoTrackArrayCasc->Clear();
1921 twoTrackArrayCasc->Delete();
delete twoTrackArrayCasc;
1922 delete esdB; esdB=NULL;
1923 delete trackV0; trackV0=NULL;
1929 TObjArray *twoTrackArray,AliVEvent *event,
1930 AliAODVertex *secVert,
1938 UInt_t ntref=TProcessID::GetObjectCount();
1940 AliFatal(Form(
"Number of TRef created (=%d), close to limit (16777216)",ntref));
1945 Bool_t dummy1,dummy2,dummy3;
1951 dummy1,dummy2,dummy3);
1952 if(!theCascade)
return 0x0;
1955 AliESDtrack *trackPi = (AliESDtrack*)twoTrackArray->UncheckedAt(0);
1956 theCascade->SetCharge(trackPi->Charge());
1962 Int_t idSoftPi=(Int_t)trackPi->GetID();
1964 AliAODTrack* trackPiAOD=
dynamic_cast<AliAODTrack*
>(
event->GetTrack(
fAODMap[idSoftPi]));
1965 if(!trackPiAOD) AliFatal(
"Not a standard AOD");
1966 tmpCascade->GetSecondaryVtx()->AddDaughter(trackPiAOD);
1969 tmpCascade->GetSecondaryVtx()->AddDaughter(trackPi);
1971 tmpCascade->GetSecondaryVtx()->AddDaughter(rd2Prong);
1973 AliAODVertex *primVertexAOD=0;
1985 tmpCascade->GetSecondaryVtx()->RemoveDaughters();
1987 delete tmpCascade; tmpCascade=NULL;
1991 if(primVertexAOD) {
delete primVertexAOD; primVertexAOD=NULL;}
2001 TObjArray *twoTrackArray,AliVEvent *event,
2002 AliAODVertex *secVert,
2010 UInt_t ntref=TProcessID::GetObjectCount();
2012 AliFatal(Form(
"Number of TRef created (=%d), close to limit (16777216)",ntref));
2017 Bool_t dummy1,dummy2,dummy3;
2023 dummy1,dummy2,dummy3);
2024 if(!theCascade)
return 0x0;
2027 AliESDtrack *trackBachelor = (AliESDtrack*)twoTrackArray->UncheckedAt(0);
2028 theCascade->SetCharge(trackBachelor->Charge());
2035 Int_t idBachelor=(Int_t)trackBachelor->GetID();
2036 if (idBachelor > -1 && idBachelor <
fAODMapSize) {
2037 AliAODTrack* trackBachelorAOD=
dynamic_cast<AliAODTrack*
>(
event->GetTrack(
fAODMap[idBachelor]));
2038 if(!trackBachelorAOD) AliFatal(
"Not a standard AOD");
2039 tmpCascade->GetSecondaryVtx()->AddDaughter(trackBachelorAOD);
2042 tmpCascade->GetSecondaryVtx()->AddDaughter(trackBachelor);
2044 tmpCascade->GetSecondaryVtx()->AddDaughter(v0);
2046 AliAODVertex *primVertexAOD=0;
2050 if(!primVertexAOD) primVertexAOD = (AliAODVertex*)event->GetPrimaryVertex();
2062 tmpCascade->GetSecondaryVtx()->RemoveDaughters();
2064 delete tmpCascade; tmpCascade=NULL;
2065 if(primVertexAOD) {
delete primVertexAOD; primVertexAOD=NULL;}
2073 TObjArray *twoTrackArray,AliVEvent *event,
2074 AliAODVertex *secVert,Double_t dca,
2075 Bool_t &okD0,Bool_t &okJPSI,
2082 okD0=kFALSE; okJPSI=kFALSE; okD0fromDstar=kFALSE;
2084 UInt_t ntref=TProcessID::GetObjectCount();
2086 AliFatal(Form(
"Number of TRef created (=%d), close to limit (16777216)",ntref));
2089 Double_t px[2],py[2],pz[2],d0[2],d0err[2];
2090 AliESDtrack *postrack = (AliESDtrack*)twoTrackArray->UncheckedAt(0);
2091 AliESDtrack *negtrack = (AliESDtrack*)twoTrackArray->UncheckedAt(1);
2094 postrack->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2095 negtrack->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2097 Double_t momentum[3];
2098 postrack->GetPxPyPz(momentum);
2099 px[0] = momentum[0]; py[0] = momentum[1]; pz[0] = momentum[2];
2100 negtrack->GetPxPyPz(momentum);
2101 px[1] = momentum[0]; py[1] = momentum[1]; pz[1] = momentum[2];
2105 Bool_t okMassCut=kFALSE;
2116 AliAODVertex *primVertexAOD =
PrimaryVertex(twoTrackArray,event);
2117 if(!primVertexAOD)
return 0x0;
2119 Double_t d0z0[2],covd0z0[3];
2120 postrack->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2122 d0err[0] = TMath::Sqrt(covd0z0[0]);
2123 negtrack->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2125 d0err[1] = TMath::Sqrt(covd0z0[0]);
2131 UShort_t
id[2]={(UShort_t)postrack->GetID(),(UShort_t)negtrack->GetID()};
2133 if(postrack->Charge()!=0 && negtrack->Charge()!=0) {
2157 the2Prong->SetSecondaryVtx(secVert);
2158 secVert->SetParent(the2Prong);
2161 the2Prong->SetPxPyPzProngs(2,px,py,pz);
2162 the2Prong->SetDCA(dca);
2163 the2Prong->Setd0Prongs(2,d0);
2165 the2Prong->SetCharge(0);
2167 delete primVertexAOD; primVertexAOD=NULL;
2175 Double_t esdpid0[5]={0.,0.,0.,0.,0.};
2176 if(postrack->GetStatus()&AliESDtrack::kESDpid) postrack->GetESDpid(esdpid0);
2177 Double_t esdpid1[5]={0.,0.,0.,0.,0.};
2178 if(negtrack->GetStatus()&AliESDtrack::kESDpid) negtrack->GetESDpid(esdpid1);
2179 Double_t esdpid[10];
2180 for(Int_t i=0;i<5;i++) {
2181 esdpid[i] = esdpid0[i];
2182 esdpid[5+i] = esdpid1[i];
2184 the2Prong->SetPID(2,esdpid);
2189 TObjArray *threeTrackArray,AliVEvent *event,
2190 AliAODVertex *secVert,Double_t dispersion,
2191 const AliAODVertex *vertexp1n1,
const AliAODVertex *vertexp2n1,
2192 Double_t dcap1n1,Double_t dcap2n1,Double_t dcap1p2,
2193 Bool_t useForLc, Bool_t useForDs, Bool_t &ok3Prong)
2201 UInt_t ntref=TProcessID::GetObjectCount();
2203 AliFatal(Form(
"Number of TRef created (=%d), close to limit (16777216)",ntref));
2207 if(!secVert || !vertexp1n1 || !vertexp2n1)
return 0x0;
2209 Double_t px[3],py[3],pz[3],d0[3],d0err[3];
2210 Double_t momentum[3];
2213 AliESDtrack *postrack1 = (AliESDtrack*)threeTrackArray->UncheckedAt(0);
2214 AliESDtrack *negtrack = (AliESDtrack*)threeTrackArray->UncheckedAt(1);
2215 AliESDtrack *postrack2 = (AliESDtrack*)threeTrackArray->UncheckedAt(2);
2217 postrack1->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2218 negtrack->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2219 postrack2->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2220 postrack1->GetPxPyPz(momentum);
2221 px[0] = momentum[0]; py[0] = momentum[1]; pz[0] = momentum[2];
2222 negtrack->GetPxPyPz(momentum);
2223 px[1] = momentum[0]; py[1] = momentum[1]; pz[1] = momentum[2];
2224 postrack2->GetPxPyPz(momentum);
2225 px[2] = momentum[0]; py[2] = momentum[1]; pz[2] = momentum[2];
2228 Bool_t okMassCut=kFALSE;
2237 AliAODVertex *primVertexAOD =
PrimaryVertex(threeTrackArray,event);
2238 if(!primVertexAOD)
return 0x0;
2240 Double_t d0z0[2],covd0z0[3];
2241 postrack1->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2243 d0err[0] = TMath::Sqrt(covd0z0[0]);
2244 negtrack->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2246 d0err[1] = TMath::Sqrt(covd0z0[0]);
2247 postrack2->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2249 d0err[2] = TMath::Sqrt(covd0z0[0]);
2253 Double_t pos[3]; primVertexAOD->GetXYZ(pos);
2254 Double_t dca[3]={dcap1n1,dcap2n1,dcap1p2};
2255 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]));
2256 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]));
2257 Short_t
charge=(Short_t)(postrack1->Charge()+postrack2->Charge()+negtrack->Charge());
2258 AliAODRecoDecayHF3Prong *the3Prong =
new AliAODRecoDecayHF3Prong(secVert,px,py,pz,d0,d0err,dca,dispersion,dist12,dist23,charge);
2260 UShort_t
id[3]={(UShort_t)postrack1->GetID(),(UShort_t)negtrack->GetID(),(UShort_t)postrack2->GetID()};
2263 delete primVertexAOD; primVertexAOD=NULL;
2296 Double_t esdpid0[5]={0.,0.,0.,0.,0.};
2297 if(postrack1->GetStatus()&AliESDtrack::kESDpid) postrack1->GetESDpid(esdpid0);
2298 Double_t esdpid1[5]={0.,0.,0.,0.,0.};
2299 if(negtrack->GetStatus()&AliESDtrack::kESDpid) negtrack->GetESDpid(esdpid1);
2300 Double_t esdpid2[5]={0.,0.,0.,0.,0.};
2301 if(postrack2->GetStatus()&AliESDtrack::kESDpid) postrack2->GetESDpid(esdpid2);
2303 Double_t esdpid[15];
2304 for(Int_t i=0;i<5;i++) {
2305 esdpid[i] = esdpid0[i];
2306 esdpid[5+i] = esdpid1[i];
2307 esdpid[10+i] = esdpid2[i];
2309 the3Prong->SetPID(3,esdpid);
2315 TObjArray *threeTrackArray,AliVEvent *event,
2316 AliAODVertex *secVert,Double_t dispersion,
2317 Double32_t dist12, Double32_t dist23,
2318 Double_t dcap1n1,Double_t dcap2n1,Double_t dcap1p2,
2330 UInt_t ntref=TProcessID::GetObjectCount();
2332 AliFatal(Form(
"Number of TRef created (=%d), close to limit (16777216)",ntref));
2335 Double_t px[3],py[3],pz[3],d0[3],d0err[3];
2336 Double_t momentum[3];
2339 AliESDtrack *postrack1 = (AliESDtrack*)threeTrackArray->UncheckedAt(0);
2340 AliESDtrack *negtrack = (AliESDtrack*)threeTrackArray->UncheckedAt(1);
2341 AliESDtrack *postrack2 = (AliESDtrack*)threeTrackArray->UncheckedAt(2);
2343 postrack1->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2344 negtrack->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2345 postrack2->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2346 postrack1->GetPxPyPz(momentum);
2347 px[0] = momentum[0]; py[0] = momentum[1]; pz[0] = momentum[2];
2348 negtrack->GetPxPyPz(momentum);
2349 px[1] = momentum[0]; py[1] = momentum[1]; pz[1] = momentum[2];
2350 postrack2->GetPxPyPz(momentum);
2351 px[2] = momentum[0]; py[2] = momentum[1]; pz[2] = momentum[2];
2353 AliAODVertex *primVertexAOD =
PrimaryVertex(threeTrackArray,event);
2354 if(!primVertexAOD)
return 0x0;
2355 Double_t d0z0[2],covd0z0[3];
2356 postrack1->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2358 d0err[0] = TMath::Sqrt(covd0z0[0]);
2359 negtrack->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2361 d0err[1] = TMath::Sqrt(covd0z0[0]);
2362 postrack2->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2364 d0err[2] = TMath::Sqrt(covd0z0[0]);
2366 Double_t pos[3]; primVertexAOD->GetXYZ(pos);
2367 Double_t dca[3]={dcap1n1,dcap2n1,dcap1p2};
2368 Short_t
charge=(Short_t)(postrack1->Charge()+postrack2->Charge()+negtrack->Charge());
2370 rd->SetSecondaryVtx(secVert);
2371 secVert->SetParent(rd);
2374 rd->SetPxPyPzProngs(3,px,py,pz);
2376 rd->Setd0Prongs(3,d0);
2378 rd->SetCharge(charge);
2381 delete primVertexAOD; primVertexAOD=NULL;
2388 Double_t esdpid0[5]={0.,0.,0.,0.,0.};
2389 if(postrack1->GetStatus()&AliESDtrack::kESDpid) postrack1->GetESDpid(esdpid0);
2390 Double_t esdpid1[5]={0.,0.,0.,0.,0.};
2391 if(negtrack->GetStatus()&AliESDtrack::kESDpid) negtrack->GetESDpid(esdpid1);
2392 Double_t esdpid2[5]={0.,0.,0.,0.,0.};
2393 if(postrack2->GetStatus()&AliESDtrack::kESDpid) postrack2->GetESDpid(esdpid2);
2395 Double_t esdpid[15];
2396 for(Int_t i=0;i<5;i++) {
2397 esdpid[i] = esdpid0[i];
2398 esdpid[5+i] = esdpid1[i];
2399 esdpid[10+i] = esdpid2[i];
2401 rd->SetPID(3,esdpid);
2406 TObjArray *fourTrackArray,AliVEvent *event,
2407 AliAODVertex *secVert,
2408 const AliAODVertex *vertexp1n1,
2409 const AliAODVertex *vertexp1n1p2,
2410 Double_t dcap1n1,Double_t dcap1n2,
2411 Double_t dcap2n1,Double_t dcap2n2,
2419 UInt_t ntref=TProcessID::GetObjectCount();
2421 AliFatal(Form(
"Number of TRef created (=%d), close to limit (16777216)",ntref));
2425 if(!secVert || !vertexp1n1 || !vertexp1n1p2)
return 0x0;
2427 Double_t px[4],py[4],pz[4],d0[4],d0err[4];
2429 AliESDtrack *postrack1 = (AliESDtrack*)fourTrackArray->UncheckedAt(0);
2430 AliESDtrack *negtrack1 = (AliESDtrack*)fourTrackArray->UncheckedAt(1);
2431 AliESDtrack *postrack2 = (AliESDtrack*)fourTrackArray->UncheckedAt(2);
2432 AliESDtrack *negtrack2 = (AliESDtrack*)fourTrackArray->UncheckedAt(3);
2434 postrack1->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2435 negtrack1->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2436 postrack2->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2437 negtrack2->PropagateToDCA(secVert,
fBzkG,kVeryBig);
2439 Double_t momentum[3];
2440 postrack1->GetPxPyPz(momentum);
2441 px[0] = momentum[0]; py[0] = momentum[1]; pz[0] = momentum[2];
2442 negtrack1->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];
2446 negtrack2->GetPxPyPz(momentum);
2447 px[3] = momentum[0]; py[3] = momentum[1]; pz[3] = momentum[2];
2450 Bool_t okMassCut=kFALSE;
2462 AliAODVertex *primVertexAOD =
PrimaryVertex(fourTrackArray,event);
2463 if(!primVertexAOD)
return 0x0;
2465 Double_t d0z0[2],covd0z0[3];
2466 postrack1->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2468 d0err[0] = TMath::Sqrt(covd0z0[0]);
2469 negtrack1->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2471 d0err[1] = TMath::Sqrt(covd0z0[0]);
2472 postrack2->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2474 d0err[2] = TMath::Sqrt(covd0z0[0]);
2475 negtrack2->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2477 d0err[3] = TMath::Sqrt(covd0z0[0]);
2481 Double_t pos[3]; primVertexAOD->GetXYZ(pos);
2482 Double_t dca[6]={dcap1n1,0.,dcap1n2,dcap2n1,0.,dcap2n2};
2483 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]));
2484 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]));
2485 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]));
2487 AliAODRecoDecayHF4Prong *the4Prong =
new AliAODRecoDecayHF4Prong(secVert,px,py,pz,d0,d0err,dca,dist12,dist3,dist4,charge);
2489 UShort_t
id[4]={(UShort_t)postrack1->GetID(),(UShort_t)negtrack1->GetID(),(UShort_t)postrack2->GetID(),(UShort_t)negtrack2->GetID()};
2492 delete primVertexAOD; primVertexAOD=NULL;
2503 Double_t esdpid0[5]={0.,0.,0.,0.,0.};
2504 if(postrack1->GetStatus()&AliESDtrack::kESDpid) postrack1->GetESDpid(esdpid0);
2505 Double_t esdpid1[5]={0.,0.,0.,0.,0.};
2506 if(negtrack1->GetStatus()&AliESDtrack::kESDpid) negtrack1->GetESDpid(esdpid1);
2507 Double_t esdpid2[5]={0.,0.,0.,0.,0.};
2508 if(postrack2->GetStatus()&AliESDtrack::kESDpid) postrack2->GetESDpid(esdpid2);
2509 Double_t esdpid3[5]={0.,0.,0.,0.,0.};
2510 if(negtrack2->GetStatus()&AliESDtrack::kESDpid) negtrack2->GetESDpid(esdpid3);
2512 Double_t esdpid[20];
2513 for(Int_t i=0;i<5;i++) {
2514 esdpid[i] = esdpid0[i];
2515 esdpid[5+i] = esdpid1[i];
2516 esdpid[10+i] = esdpid2[i];
2517 esdpid[15+i] = esdpid3[i];
2519 the4Prong->SetPID(4,esdpid);
2530 AliAODTrack *track=0;
2532 for(Int_t i=0; i<aod->GetNumberOfTracks(); i++) {
2533 track =
dynamic_cast<AliAODTrack*
>(aod->GetTrack(i));
2534 if(!track) AliFatal(
"Not a standard AOD");
2536 if(track->GetStatus()&AliESDtrack::kITSpureSA)
continue;
2539 if(!(track->GetStatus()&AliESDtrack::kITSin))
continue;
2542 Double_t covtest[21];
2543 if(!track->GetCovarianceXYZPxPyPz(covtest))
continue;
2546 Int_t ind = (Int_t)track->GetID();
2547 if (ind>-1 && ind < fAODMapSize)
fAODMap[ind] = i;
2553 AliVEvent *event)
const
2558 AliESDVertex *vertexESD = 0;
2559 AliAODVertex *vertexAOD = 0;
2565 vertexESD =
new AliESDVertex(*
fV1);
2570 Int_t nTrks = trkArray->GetEntriesFast();
2571 AliVertexerTracks *vertexer =
new AliVertexerTracks(event->GetMagneticField());
2576 if(strstr(
fV1->GetTitle(),
"VertexerTracksWithConstraint")) {
2577 Float_t diamondcovxy[3];
2578 event->GetDiamondCovXY(diamondcovxy);
2579 Double_t pos[3]={
event->GetDiamondX(),
event->GetDiamondY(),0.};
2580 Double_t cov[6]={diamondcovxy[0],diamondcovxy[1],diamondcovxy[2],0.,0.,10.*10.};
2581 AliESDVertex *diamond =
new AliESDVertex(pos,cov,1.,1);
2582 vertexer->SetVtxStart(diamond);
2583 delete diamond; diamond=NULL;
2584 if(strstr(
fV1->GetTitle(),
"VertexerTracksWithConstraintOnlyFitter"))
2585 vertexer->SetOnlyFitter();
2587 Int_t skipped[1000];
2588 Int_t nTrksToSkip=0,id;
2589 AliExternalTrackParam *t = 0;
2590 for(Int_t i=0; i<nTrks; i++) {
2591 t = (AliExternalTrackParam*)trkArray->UncheckedAt(i);
2592 id = (Int_t)t->GetID();
2594 skipped[nTrksToSkip++] = id;
2599 Double_t covtest[21];
2600 for(Int_t j=0; j<
event->GetNumberOfTracks(); j++) {
2601 AliVTrack *vtrack = (AliVTrack*)event->GetTrack(j);
2602 if(!vtrack->GetCovarianceXYZPxPyPz(covtest)) {
2603 id = (Int_t)vtrack->GetID();
2605 skipped[nTrksToSkip++] = id;
2609 for(Int_t ijk=nTrksToSkip; ijk<1000; ijk++) skipped[ijk]=-1;
2611 vertexer->SetSkipTracks(nTrksToSkip,skipped);
2612 vertexESD = (AliESDVertex*)vertexer->FindPrimaryVertex(event);
2617 TObjArray rmArray(nTrks);
2618 UShort_t *rmId =
new UShort_t[nTrks];
2619 AliESDtrack *esdTrack = 0;
2621 for(Int_t i=0; i<nTrks; i++) {
2622 t = (AliESDtrack*)trkArray->UncheckedAt(i);
2623 esdTrack =
new AliESDtrack(*t);
2624 rmArray.AddLast(esdTrack);
2625 if(esdTrack->GetID()>=0) {
2626 rmId[i]=(UShort_t)esdTrack->GetID();
2631 Float_t diamondxy[2]={
static_cast<Float_t
>(
event->GetDiamondX()),static_cast<Float_t>(event->GetDiamondY())};
2632 vertexESD = vertexer->RemoveTracksFromVertex(
fV1,&rmArray,rmId,diamondxy);
2633 delete [] rmId; rmId=NULL;
2638 if(!vertexESD)
return vertexAOD;
2639 if(vertexESD->GetNContributors()<=0) {
2641 delete vertexESD; vertexESD=NULL;
2645 delete vertexer; vertexer=NULL;
2650 Double_t pos[3],cov[6],chi2perNDF;
2651 vertexESD->GetXYZ(pos);
2652 vertexESD->GetCovMatrix(cov);
2653 chi2perNDF = vertexESD->GetChi2toNDF();
2654 delete vertexESD; vertexESD=NULL;
2656 vertexAOD =
new AliAODVertex(pos,cov,chi2perNDF);
2667 printf(
"Secondary vertex with Kalman filter package (AliKFParticle)\n");
2669 printf(
"Secondary vertex with AliVertexerTracks\n");
2674 printf(
"Reconstruct D0->Kpi candidates with cuts:\n");
2678 printf(
"Reconstruct D*->D0pi candidates with cuts:\n");
2680 printf(
" Reconstruct a secondary vertex for the D*\n");
2682 printf(
" Assume the D* comes from the primary vertex\n");
2687 printf(
"Reconstruct J/psi from B candidates with cuts:\n");
2691 printf(
"Reconstruct 3 prong candidates.\n");
2692 printf(
" D+->Kpipi cuts:\n");
2694 printf(
" Ds->KKpi cuts:\n");
2696 printf(
" Lc->pKpi cuts:\n");
2700 printf(
"Reconstruct 4 prong candidates.\n");
2701 printf(
" D0->Kpipipi cuts:\n");
2705 printf(
"Reconstruct cascades candidates formed with v0s.\n");
2706 printf(
" Lc -> k0s P & Lc -> L Pi cuts:\n");
2714 Double_t &dispersion,Bool_t useTRefArray)
const
2719 AliESDVertex *vertexESD = 0;
2720 AliAODVertex *vertexAOD = 0;
2725 vertexESD = (AliESDVertex*)
fVertexerTracks->VertexForSelectedESDTracks(trkArray);
2727 if(!vertexESD)
return vertexAOD;
2729 if(vertexESD->GetNContributors()!=trkArray->GetEntriesFast()) {
2731 delete vertexESD; vertexESD=NULL;
2735 Double_t vertRadius2=vertexESD->GetX()*vertexESD->GetX()+vertexESD->GetY()*vertexESD->GetY();
2738 delete vertexESD; vertexESD=NULL;
2744 AliKFParticle::SetField(
fBzkG);
2746 AliKFVertex vertexKF;
2748 Int_t nTrks = trkArray->GetEntriesFast();
2749 for(Int_t i=0; i<nTrks; i++) {
2750 AliESDtrack *esdTrack = (AliESDtrack*)trkArray->At(i);
2751 AliKFParticle daughterKF(*esdTrack,211);
2752 vertexKF.AddDaughter(daughterKF);
2754 vertexESD =
new AliESDVertex(vertexKF.Parameters(),
2755 vertexKF.CovarianceMatrix(),
2757 vertexKF.GetNContributors());
2762 Double_t pos[3],cov[6],chi2perNDF;
2763 vertexESD->GetXYZ(pos);
2764 vertexESD->GetCovMatrix(cov);
2765 chi2perNDF = vertexESD->GetChi2toNDF();
2766 dispersion = vertexESD->GetDispersion();
2767 delete vertexESD; vertexESD=NULL;
2769 Int_t nprongs= (useTRefArray ? 0 : trkArray->GetEntriesFast());
2770 vertexAOD =
new AliAODVertex(pos,cov,chi2perNDF,0x0,-1,AliAODVertex::kUndef,nprongs);
2779 Int_t retval=kFALSE;
2780 Double_t momentum[3];
2781 Double_t px[3],py[3],pz[3];
2782 for(Int_t iTrack=0; iTrack<3; iTrack++){
2783 AliESDtrack *track = (AliESDtrack*)trkArray->UncheckedAt(iTrack);
2784 track->GetPxPyPz(momentum);
2785 px[iTrack] = momentum[0]; py[iTrack] = momentum[1]; pz[iTrack] = momentum[2];
2797 Int_t retval=kFALSE;
2798 Double_t momentum[3];
2799 Double_t px[4],py[4],pz[4];
2801 for(Int_t iTrack=0; iTrack<4; iTrack++){
2802 AliESDtrack *track = (AliESDtrack*)trkArray->UncheckedAt(iTrack);
2803 track->GetPxPyPz(momentum);
2804 px[iTrack] = momentum[0]; py[iTrack] = momentum[1]; pz[iTrack] = momentum[2];
2816 Int_t retval=kFALSE;
2817 Double_t momentum[3];
2818 Double_t px[2],py[2],pz[2];
2820 for(Int_t iTrack=0; iTrack<2; iTrack++){
2821 AliESDtrack *track = (AliESDtrack*)trkArray->UncheckedAt(iTrack);
2822 track->GetPxPyPz(momentum);
2823 px[iTrack] = momentum[0]; py[iTrack] = momentum[1]; pz[iTrack] = momentum[2];
2838 Double_t minv2,mrange;
2839 Double_t lolim,hilim;
2841 Bool_t retval=kFALSE;
2843 fMassCalc2->SetPxPyPzProngs(nprongs,px,py,pz);
2848 if(
fMassCalc2->Pt2() < minPt*minPt)
return retval;
2853 pdg2[0]=211; pdg2[1]=321;
2855 if(minv2>lolim*lolim && minv2<hilim*hilim ){
2859 pdg2[0]=321; pdg2[1]=211;
2861 if(minv2>lolim*lolim && minv2<hilim*hilim ){
2877 Double_t minv2,mrange;
2878 Double_t lolim,hilim;
2880 Bool_t retval=kFALSE;
2882 fMassCalc2->SetPxPyPzProngs(nprongs,px,py,pz);
2887 if(
fMassCalc2->Pt2() < minPt*minPt)
return retval;
2893 pdg2[0]=11; pdg2[1]=11;
2895 if(minv2>lolim*lolim && minv2<hilim*hilim ){
2912 Double_t minv2,mrange;
2913 Double_t lolim,hilim;
2915 Bool_t retval=kFALSE;
2918 fMassCalc3->SetPxPyPzProngs(nprongs,px,py,pz);
2926 if(
fMassCalc3->Pt2() < minPt*minPt)
return retval;
2931 pdg3[0]=211; pdg3[1]=321; pdg3[2]=211;
2933 if(minv2>lolim*lolim && minv2<hilim*hilim ){
2941 pdg3[0]=321; pdg3[1]=321; pdg3[2]=211;
2943 if(minv2>lolim*lolim && minv2<hilim*hilim ){
2947 pdg3[0]=211; pdg3[1]=321; pdg3[2]=321;
2949 if(minv2>lolim*lolim && minv2<hilim*hilim ){
2958 pdg3[0]=2212; pdg3[1]=321; pdg3[2]=211;
2960 if(minv2>lolim*lolim && minv2<hilim*hilim ){
2966 pdg3[0]=211; pdg3[1]=321; pdg3[2]=2212;
2968 if(minv2>lolim*lolim && minv2<hilim*hilim ){
2986 Double_t minv2,mrange;
2987 Double_t lolim,hilim;
2989 Bool_t retval=kFALSE;
2991 fMassCalc2->SetPxPyPzProngs(nprongs,px,py,pz);
2996 if(
fMassCalc2->Pt2() < minPt*minPt)
return retval;
2998 pdg2[0]=211; pdg2[1]=421;
3003 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3020 Double_t minv2,mrange;
3021 Double_t lolim,hilim;
3023 Bool_t retval=kFALSE;
3026 fMassCalc4->SetPxPyPzProngs(nprongs,px,py,pz);
3031 if(
fMassCalc4->Pt2() < minPt*minPt)
return retval;
3037 pdg4[0]=321; pdg4[1]=211; pdg4[2]=211; pdg4[3]=211;
3039 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3044 pdg4[0]=211; pdg4[1]=321; pdg4[2]=211; pdg4[3]=211;
3046 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3051 pdg4[0]=211; pdg4[1]=211; pdg4[2]=321; pdg4[3]=211;
3053 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3058 pdg4[0]=211; pdg4[1]=211; pdg4[2]=211; pdg4[3]=321;
3060 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3076 Double_t minv2,mrange;
3077 Double_t lolim,hilim;
3079 Bool_t retval=kFALSE;
3081 fMassCalc2->SetPxPyPzProngs(nprongs,px,py,pz);
3087 pdg2[0]=2212;pdg2[1]=310;
3089 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3093 pdg2[0]=211;pdg2[1]=3122;
3095 if(minv2>lolim*lolim && minv2<hilim*hilim ){
3105 TObjArray &seleTrksArray,
3106 TObjArray &tracksAtVertex,
3108 UChar_t *seleFlags,Int_t *evtNumber)
3117 const AliVVertex *vprimary =
event->GetPrimaryVertex();
3123 UShort_t *indices = 0;
3124 Double_t pos[3],cov[6];
3125 const Int_t entries =
event->GetNumberOfTracks();
3126 AliCentrality* cent;
3129 fV1 =
new AliESDVertex(*((AliESDVertex*)vprimary));
3130 cent=((AliESDEvent*)event)->GetCentrality();
3132 vprimary->GetXYZ(pos);
3133 vprimary->GetCovarianceMatrix(cov);
3134 fV1 =
new AliESDVertex(pos,cov,100.,100,vprimary->GetName());
3135 if(entries<=0)
return;
3136 indices =
new UShort_t[entries];
3137 memset(indices,0,
sizeof(UShort_t)*entries);
3141 cent=((AliAODEvent*)event)->GetCentrality();
3143 Float_t centperc=0.1;
3144 if(event->GetRunNumber()<244824){
3145 centperc=cent->GetCentralityPercentile(
"V0M");
3147 AliMultSelection *multSelection = (AliMultSelection * ) event->FindListObject(
"MultSelection");
3149 centperc=multSelection->GetMultiplicityPercentile(
"V0M");
3150 Int_t qual = multSelection->GetEvSelCode();
3151 if(qual == 199 ) centperc=0.1;
3154 Bool_t okDisplaced=kFALSE,okSoftPi=kFALSE,okFor3Prong=kFALSE;
3158 for(Int_t i=0; i<entries; i++) {
3160 track = (AliVTrack*)event->GetTrack(i);
3163 if(track->GetStatus()&AliESDtrack::kITSpureSA)
continue;
3166 if(!(track->GetStatus()&AliESDtrack::kITSin))
continue;
3170 if(track->GetID()<0)
continue;
3173 Double_t covtest[21];
3174 if(!track->GetCovarianceXYZPxPyPz(covtest))
continue;
3178 AliAODTrack *aodt = (AliAODTrack*)track;
3179 if(aodt->GetUsedForPrimVtxFit()) {
3180 indices[nindices]=aodt->GetID(); nindices++;
3182 Int_t ind = (Int_t)aodt->GetID();
3186 AliESDtrack *esdt = 0;
3189 esdt = (AliESDtrack*)track;
3191 esdt =
new AliESDtrack(track);
3195 okDisplaced=kFALSE; okSoftPi=kFALSE; okFor3Prong=kFALSE;
3197 evtNumber[i]=((AliMixedEvent*)event)->EventIndex(i);
3198 const AliVVertex* eventVtx=((AliMixedEvent*)event)->GetEventVertex(i);
3199 Double_t vtxPos[3],primPos[3],primCov[6],trasl[3];
3200 eventVtx->GetXYZ(vtxPos);
3201 vprimary->GetXYZ(primPos);
3202 eventVtx->GetCovarianceMatrix(primCov);
3203 for(Int_t ind=0;ind<3;ind++){
3204 trasl[ind]=vtxPos[ind]-primPos[ind];
3207 Bool_t isTransl=esdt->Translate(trasl,primCov);
3215 if(
SingleTrkCuts(esdt,centperc,okDisplaced,okSoftPi,okFor3Prong) && nSeleTrks<trkEntries) {
3216 esdt->PropagateToDCA(
fV1,
fBzkG,kVeryBig);
3217 seleTrksArray.AddLast(esdt);
3218 tracksAtVertex.AddLast(
new AliExternalTrackParam(*esdt));
3219 seleFlags[nSeleTrks]=0;
3220 if(okDisplaced) SETBIT(seleFlags[nSeleTrks],
kBitDispl);
3221 if(okFor3Prong) SETBIT(seleFlags[nSeleTrks],
kBit3Prong);
3222 if(okSoftPi) SETBIT(seleFlags[nSeleTrks],
kBitSoftPi);
3228 Bool_t useTPC=kTRUE;
3230 Double_t nsigmatofPi=
fPidResponse->NumberOfSigmasTOF(esdt,AliPID::kPion);
3231 if(nsigmatofPi>-990. && (nsigmatofPi<-fnSigmaTOFPionLow || nsigmatofPi>
fnSigmaTOFPionHi)){
3234 Double_t nsigmatofK=
fPidResponse->NumberOfSigmasTOF(esdt,AliPID::kKaon);
3235 if(nsigmatofK>-990. && (nsigmatofK<-fnSigmaTOFKaonLow || nsigmatofK>
fnSigmaTOFKaonHi)){
3238 Double_t nsigmatofP=
fPidResponse->NumberOfSigmasTOF(esdt,AliPID::kProton);
3239 if(nsigmatofP>-990. && (nsigmatofP<-fnSigmaTOFProtonLow || nsigmatofP>
fnSigmaTOFProtonHi)){
3245 Double_t nsigmatpcPi=
fPidResponse->NumberOfSigmasTPC(esdt,AliPID::kPion);
3246 if(nsigmatpcPi>-990. && (nsigmatpcPi<-fnSigmaTPCPionLow || nsigmatpcPi>
fnSigmaTPCPionHi)){
3249 Double_t nsigmatpcK=
fPidResponse->NumberOfSigmasTPC(esdt,AliPID::kKaon);
3250 if(nsigmatpcK>-990. && (nsigmatpcK<-fnSigmaTPCKaonLow || nsigmatpcK>
fnSigmaTPCKaonHi)){
3253 Double_t nsigmatpcP=
fPidResponse->NumberOfSigmasTPC(esdt,AliPID::kProton);
3254 if(nsigmatpcP>-990. && (nsigmatpcP<-fnSigmaTPCProtonLow || nsigmatpcP>
fnSigmaTPCProtonHi)){
3270 vprimary->GetXYZ(pos);
3271 vprimary->GetCovarianceMatrix(cov);
3272 Double_t chi2toNDF = vprimary->GetChi2perNDF();
3273 Int_t ncontr=nindices;
3274 if(!strcmp(vprimary->GetTitle(),
"VertexerTracksWithContraint")) ncontr += 1;
3275 Double_t chi2=chi2toNDF*(2.*(Double_t)ncontr-3.);
3276 fV1 =
new AliESDVertex(pos,cov,chi2,ncontr,vprimary->GetName());
3277 fV1->SetTitle(vprimary->GetTitle());
3278 fV1->SetIndices(nindices,indices);
3280 if(indices) {
delete [] indices; indices=NULL; }
3301 Float_t centralityperc,
3302 Bool_t &okDisplaced,
3304 Bool_t &okFor3Prong)
const
3311 trk->RelateToVertex(
fV1,
fBzkG,kVeryBig);
3327 if(selectInfo) okDisplaced=kTRUE;
3341 if(selectInfo) okFor3Prong=kTRUE;
3348 if(selectInfo) okSoftPi=kTRUE;
3350 if(okDisplaced || okSoftPi || okFor3Prong)
return kTRUE;
3365 Double_t vertex[3]; esdV0->GetXYZ(vertex[0],vertex[1],vertex[2]);
3366 AliAODVertex *vertexV0 =
new AliAODVertex(vertex,esdV0->GetChi2V0(),AliAODVertex::kV0,2);
3369 Double_t xyz[3], pxpypz[3];
3371 esdV0->PxPyPz(pxpypz);
3372 Double_t cv[21];
for(
int i=0; i<21; i++) cv[i]=0;
3373 AliNeutralTrackParam *trackesdV0 =
new AliNeutralTrackParam(xyz,pxpypz,cv,0);
3378 Double_t d0z0[2],covd0z0[3];
3380 trackesdV0->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
3381 Double_t dcaV0ToPrimVertex = TMath::Sqrt(covd0z0[0]);
3383 Double_t dcaV0DaughterToPrimVertex[2];
3384 AliExternalTrackParam *posV0track = (AliExternalTrackParam*)twoTrackArrayV0->UncheckedAt(0);
3385 AliExternalTrackParam *negV0track = (AliExternalTrackParam*)twoTrackArrayV0->UncheckedAt(1);
3386 if( !posV0track || !negV0track) {
3387 if(trackesdV0) {
delete trackesdV0; trackesdV0=NULL;}
3389 delete primVertexAOD;
3392 posV0track->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
3395 dcaV0DaughterToPrimVertex[0] = TMath::Sqrt(covd0z0[0]);
3396 negV0track->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
3399 dcaV0DaughterToPrimVertex[1] = TMath::Sqrt(covd0z0[0]);
3400 Double_t dcaV0Daughters = esdV0->GetDcaV0Daughters();
3401 Double_t pmom[3],nmom[3];
3402 esdV0->GetNPxPyPz(nmom[0],nmom[1],nmom[2]);
3403 esdV0->GetPPxPyPz(pmom[0],pmom[1],pmom[2]);
3405 AliAODv0 *aodV0 =
new AliAODv0(vertexV0,dcaV0Daughters,dcaV0ToPrimVertex,pmom,nmom,dcaV0DaughterToPrimVertex);
3406 aodV0->SetOnFlyStatus(esdV0->GetOnFlyStatus());
3409 delete primVertexAOD;
3418 const Double_t *par=extpar->GetParameter();
3419 const Double_t *cov=extpar->GetCovariance();
3420 Double_t alpha=extpar->GetAlpha();
3421 Double_t x=extpar->GetX();
3422 esdt->Set(x,alpha,par,cov);
3429 fMassDzero=TDatabasePDG::Instance()->GetParticle(421)->Mass();
3430 fMassDplus=TDatabasePDG::Instance()->GetParticle(411)->Mass();
3431 fMassDs=TDatabasePDG::Instance()->GetParticle(431)->Mass();
3432 fMassLambdaC=TDatabasePDG::Instance()->GetParticle(4122)->Mass();
3433 fMassDstar=TDatabasePDG::Instance()->GetParticle(413)->Mass();
3434 fMassJpsi=TDatabasePDG::Instance()->GetParticle(443)->Mass();
virtual Int_t IsSelected(TObject *obj, Int_t selectionLevel)
AliAODRecoDecay * fMassCalc4
for 3 prong
Bool_t fUsePidTag
upper momentum limit to apply TPC PID
ClassImp(AliAnalysisTaskTriggerRates) AliAnalysisTaskTriggerRates
void SetSelectionBit(Int_t i)
selection map
Bool_t CheckCutsConsistency()
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
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 Int_t IsSelected(TObject *obj, Int_t selectionLevel)
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)
AliRDHFCutsDstoKKpi * fCutsDstoKKpi
D+->Kpipi cuts.
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 FillRecoCand(AliVEvent *event, AliAODRecoDecayHF3Prong *rd3)
Bool_t fUseTPCPIDOnlyIfNoTOF
switch use/not use TOF PID
AliRDHFCutsD0toKpi * fCutsD0toKpi
Track Filter for D* soft pion.
Bool_t fMixEvent
Like-sign triplets.
virtual void DeleteRecoD()
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
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.
Bool_t FillRecoCasc(AliVEvent *event, AliAODRecoCascadeHF *rc, Bool_t isDStar)
AliRDHFCutsDplustoKpipi * fCutsDplustoKpipi
J/psi->ee cuts.
AliRDHFCutsD0toKpipipi * fCutsD0toKpipipi
Lc –> v0 + bachelor cuts.
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
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.
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)
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,.
virtual Int_t IsSelected(TObject *obj, Int_t selectionLevel)
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)
void AddDaughterRefs(AliAODVertex *v, const AliVEvent *event, const TObjArray *trkArray) const
Int_t fUsePIDforLc
Kaon PID usage for 3 prongs.
Bool_t IsEventSelected(AliVEvent *event)
Bool_t fLikeSign
cascades, Lc –> v0+track
virtual Int_t IsSelected(TObject *obj, Int_t selectionLevel)
Bool_t SingleTrkCuts(AliESDtrack *trk, Float_t centralityperc, Bool_t &okDisplaced, Bool_t &okSoftPi, Bool_t &ok3prong) const
void SetUsePID(Bool_t flag=kTRUE)
Bool_t fDstar
D0->Kpipipi.
virtual void PrintAll() const
Float_t GetDCACut(Int_t iPtBin=0) const
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.
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.
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
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)
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.