29 #include <Riostream.h>
31 #include <TDatabasePDG.h>
35 #include "AliVEvent.h"
36 #include "AliVVertex.h"
37 #include "AliVTrack.h"
38 #include "AliVertexerTracks.h"
39 #include "AliKFVertex.h"
40 #include "AliESDEvent.h"
41 #include "AliESDVertex.h"
42 #include "AliExternalTrackParam.h"
43 #include "AliNeutralTrackParam.h"
44 #include "AliESDtrack.h"
45 #include "AliESDtrackCuts.h"
46 #include "AliAODEvent.h"
47 #include "AliPIDResponse.h"
48 #include "AliAODRecoDecay.h"
62 #include "AliAnalysisFilter.h"
64 #include "AliMixedEvent.h"
67 #include "AliCodeTimer.h"
81 fSecVtxWithKF(kFALSE),
82 fRecoPrimVtxSkippingTrks(kFALSE),
83 fRmTrksFromPrimVtx(kFALSE),
92 fLikeSign3prong(kFALSE),
95 fUseKaonPIDfor3Prong(kFALSE),
98 fUseKaonPIDforDs(kFALSE),
101 fUseTPCPIDOnlyIfNoTOF(kFALSE),
102 fMaxMomForTPCPid(1.),
103 fnSigmaTPCPionLow(5.),
104 fnSigmaTPCPionHi(5.),
105 fnSigmaTOFPionLow(5.),
106 fnSigmaTOFPionHi(5.),
107 fnSigmaTPCKaonLow(5.),
108 fnSigmaTPCKaonHi(5.),
109 fnSigmaTOFKaonLow(5.),
110 fnSigmaTOFKaonHi(5.),
111 fnSigmaTPCProtonLow(5.),
112 fnSigmaTPCProtonHi(5.),
113 fnSigmaTOFProtonLow(5.),
114 fnSigmaTOFProtonHi(5.),
115 fMaxCentPercentileForTightCuts(-9999),
117 fTrackFilter2prongCentral(0x0),
118 fTrackFilter3prongCentral(0x0),
119 fTrackFilterSoftPi(0x0),
122 fCutsDplustoKpipi(0x0),
126 fCutsD0toKpipipi(0x0),
127 fCutsDStartoKpipi(0x0),
129 fFindVertexForDstar(kTRUE),
130 fFindVertexForCascades(kTRUE),
131 fV0TypeForCascadeVertex(0),
132 fMassCutBeforeVertexing(kFALSE),
136 fOKInvMassD0(kFALSE),
137 fOKInvMassJpsi(kFALSE),
138 fOKInvMassDplus(kFALSE),
139 fOKInvMassDs(kFALSE),
140 fOKInvMassLc(kFALSE),
141 fOKInvMassDstar(kFALSE),
142 fOKInvMassD0to4p(kFALSE),
143 fOKInvMassLctoV0(kFALSE),
155 Double_t d02[2]={0.,0.};
156 Double_t d03[3]={0.,0.,0.};
157 Double_t d04[4]={0.,0.,0.,0.};
158 fMassCalc2 =
new AliAODRecoDecay(0x0,2,0,d02);
159 fMassCalc3 =
new AliAODRecoDecay(0x0,3,1,d03);
160 fMassCalc4 =
new AliAODRecoDecay(0x0,4,0,d04);
166 fInputAOD(source.fInputAOD),
167 fAODMapSize(source.fAODMapSize),
168 fAODMap(source.fAODMap),
169 fVertexerTracks(source.fVertexerTracks),
171 fSecVtxWithKF(source.fSecVtxWithKF),
172 fRecoPrimVtxSkippingTrks(source.fRecoPrimVtxSkippingTrks),
173 fRmTrksFromPrimVtx(source.fRmTrksFromPrimVtx),
175 fD0toKpi(source.fD0toKpi),
176 fJPSItoEle(source.fJPSItoEle),
177 f3Prong(source.f3Prong),
178 f4Prong(source.f4Prong),
179 fDstar(source.fDstar),
180 fCascades(source.fCascades),
181 fLikeSign(source.fLikeSign),
182 fLikeSign3prong(source.fLikeSign3prong),
183 fMixEvent(source.fMixEvent),
184 fPidResponse(source.fPidResponse),
185 fUseKaonPIDfor3Prong(source.fUseKaonPIDfor3Prong),
186 fUsePIDforLc(source.fUsePIDforLc),
187 fUsePIDforLc2V0(source.fUsePIDforLc2V0),
188 fUseKaonPIDforDs(source.fUseKaonPIDforDs),
189 fUseTPCPID(source.fUseTPCPID),
190 fUseTOFPID(source.fUseTOFPID),
191 fUseTPCPIDOnlyIfNoTOF(source.fUseTPCPIDOnlyIfNoTOF),
192 fMaxMomForTPCPid(source.fMaxMomForTPCPid),
193 fnSigmaTPCPionLow(source.fnSigmaTPCPionLow),
194 fnSigmaTPCPionHi(source.fnSigmaTPCPionHi),
195 fnSigmaTOFPionLow(source.fnSigmaTOFPionLow),
196 fnSigmaTOFPionHi(source.fnSigmaTOFPionHi),
197 fnSigmaTPCKaonLow(source.fnSigmaTPCKaonLow),
198 fnSigmaTPCKaonHi(source.fnSigmaTPCKaonHi),
199 fnSigmaTOFKaonLow(source.fnSigmaTOFKaonLow),
200 fnSigmaTOFKaonHi(source.fnSigmaTOFKaonHi),
201 fnSigmaTPCProtonLow(source.fnSigmaTPCProtonLow),
202 fnSigmaTPCProtonHi(source.fnSigmaTPCProtonHi),
203 fnSigmaTOFProtonLow(source.fnSigmaTOFProtonLow),
204 fnSigmaTOFProtonHi(source.fnSigmaTOFProtonHi),
205 fMaxCentPercentileForTightCuts(source.fMaxCentPercentileForTightCuts),
206 fTrackFilter(source.fTrackFilter),
207 fTrackFilter2prongCentral(source.fTrackFilter2prongCentral),
208 fTrackFilter3prongCentral(source.fTrackFilter3prongCentral),
209 fTrackFilterSoftPi(source.fTrackFilterSoftPi),
210 fCutsD0toKpi(source.fCutsD0toKpi),
211 fCutsJpsitoee(source.fCutsJpsitoee),
212 fCutsDplustoKpipi(source.fCutsDplustoKpipi),
213 fCutsDstoKKpi(source.fCutsDstoKKpi),
214 fCutsLctopKpi(source.fCutsLctopKpi),
215 fCutsLctoV0(source.fCutsLctoV0),
216 fCutsD0toKpipipi(source.fCutsD0toKpipipi),
217 fCutsDStartoKpipi(source.fCutsDStartoKpipi),
218 fListOfCuts(source.fListOfCuts),
219 fFindVertexForDstar(source.fFindVertexForDstar),
220 fFindVertexForCascades(source.fFindVertexForCascades),
221 fV0TypeForCascadeVertex(source.fV0TypeForCascadeVertex),
222 fMassCutBeforeVertexing(source.fMassCutBeforeVertexing),
223 fMassCalc2(source.fMassCalc2),
224 fMassCalc3(source.fMassCalc3),
225 fMassCalc4(source.fMassCalc4),
226 fOKInvMassD0(source.fOKInvMassD0),
227 fOKInvMassJpsi(source.fOKInvMassJpsi),
228 fOKInvMassDplus(source.fOKInvMassDplus),
229 fOKInvMassDs(source.fOKInvMassDs),
230 fOKInvMassLc(source.fOKInvMassLc),
231 fOKInvMassDstar(source.fOKInvMassDstar),
232 fOKInvMassD0to4p(source.fOKInvMassD0to4p),
233 fOKInvMassLctoV0(source.fOKInvMassLctoV0),
236 fMassDzero(source.fMassDzero),
237 fMassDplus(source.fMassDplus),
238 fMassDs(source.fMassDs),
239 fMassLambdaC(source.fMassLambdaC),
240 fMassDstar(source.fMassDstar),
241 fMassJpsi(source.fMassJpsi)
253 if(&source ==
this)
return *
this;
358 TList *
list =
new TList();
360 list->SetName(
"ListOfCuts");
364 list->Add(cutsD0toKpi);
368 list->Add(cutsJpsitoee);
372 list->Add(cutsDplustoKpipi);
376 list->Add(cutsDstoKKpi);
380 list->Add(cutsLctopKpi);
384 list->Add(cutsLctoV0);
388 list->Add(cutsD0toKpipipi);
392 list->Add(cutsDStartoKpipi);
397 if (bCutsOk == kFALSE) {AliFatal(
"AliAnalysisVertexingHF::FillListOfCuts vertexing and the analysis task cuts are not consistent!");}
406 TClonesArray *aodVerticesHFTClArr,
407 TClonesArray *aodD0toKpiTClArr,
408 TClonesArray *aodJPSItoEleTClArr,
409 TClonesArray *aodCharm3ProngTClArr,
410 TClonesArray *aodCharm4ProngTClArr,
411 TClonesArray *aodDstarTClArr,
412 TClonesArray *aodCascadesTClArr,
413 TClonesArray *aodLikeSign2ProngTClArr,
414 TClonesArray *aodLikeSign3ProngTClArr)
422 TString evtype =
event->IsA()->GetName();
423 fInputAOD = ((evtype==
"AliAODEvent") ? kTRUE : kFALSE);
427 AliDebug(2,
"Creating HF candidates from AOD");
429 AliDebug(2,
"Creating HF candidates from ESD");
432 if(!aodVerticesHFTClArr) {
433 printf(
"ERROR: no aodVerticesHFTClArr");
437 printf(
"ERROR: no aodD0toKpiTClArr");
441 printf(
"ERROR: no aodJPSItoEleTClArr");
444 if(
f3Prong && !aodCharm3ProngTClArr) {
445 printf(
"ERROR: no aodCharm3ProngTClArr");
448 if(
f4Prong && !aodCharm4ProngTClArr) {
449 printf(
"ERROR: no aodCharm4ProngTClArr");
452 if(
fDstar && !aodDstarTClArr) {
453 printf(
"ERROR: no aodDstarTClArr");
457 printf(
"ERROR: no aodCascadesTClArr ");
460 if(
fLikeSign && !aodLikeSign2ProngTClArr) {
461 printf(
"ERROR: no aodLikeSign2ProngTClArr");
465 printf(
"ERROR: no aodLikeSign3ProngTClArr");
470 Int_t iVerticesHF=0,iD0toKpi=0,iJPSItoEle=0,i3Prong=0,i4Prong=0,iDstar=0,iCascades=0,iLikeSign2Prong=0,iLikeSign3Prong=0;
471 aodVerticesHFTClArr->Delete();
472 iVerticesHF = aodVerticesHFTClArr->GetEntriesFast();
473 TClonesArray &verticesHFRef = *aodVerticesHFTClArr;
475 aodD0toKpiTClArr->Delete();
476 iD0toKpi = aodD0toKpiTClArr->GetEntriesFast();
479 aodJPSItoEleTClArr->Delete();
480 iJPSItoEle = aodJPSItoEleTClArr->GetEntriesFast();
483 aodCharm3ProngTClArr->Delete();
484 i3Prong = aodCharm3ProngTClArr->GetEntriesFast();
487 aodCharm4ProngTClArr->Delete();
488 i4Prong = aodCharm4ProngTClArr->GetEntriesFast();
491 aodDstarTClArr->Delete();
492 iDstar = aodDstarTClArr->GetEntriesFast();
495 aodCascadesTClArr->Delete();
496 iCascades = aodCascadesTClArr->GetEntriesFast();
499 aodLikeSign2ProngTClArr->Delete();
500 iLikeSign2Prong = aodLikeSign2ProngTClArr->GetEntriesFast();
503 aodLikeSign3ProngTClArr->Delete();
504 iLikeSign3Prong = aodLikeSign3ProngTClArr->GetEntriesFast();
507 TClonesArray &aodD0toKpiRef = *aodD0toKpiTClArr;
508 TClonesArray &aodJPSItoEleRef = *aodJPSItoEleTClArr;
509 TClonesArray &aodCharm3ProngRef = *aodCharm3ProngTClArr;
510 TClonesArray &aodCharm4ProngRef = *aodCharm4ProngTClArr;
511 TClonesArray &aodDstarRef = *aodDstarTClArr;
512 TClonesArray &aodCascadesRef = *aodCascadesTClArr;
513 TClonesArray &aodLikeSign2ProngRef = *aodLikeSign2ProngTClArr;
514 TClonesArray &aodLikeSign3ProngRef = *aodLikeSign3ProngTClArr;
522 Int_t iTrkP1,iTrkP2,iTrkN1,iTrkN2,iTrkSoftPi,trkEntries,iv0,nv0;
523 Double_t xdummy,ydummy,dcap1n1,dcap1n2,dcap2n1,dcap1p2,dcan1n2,dcap2n2,dcaV0,dcaCasc;
524 Bool_t okD0=kFALSE,okJPSI=kFALSE,ok3Prong=kFALSE,ok4Prong=kFALSE;
525 Bool_t okDstar=kFALSE,okD0fromDstar=kFALSE;
526 Bool_t okCascades=kFALSE;
527 AliESDtrack *postrack1 = 0;
528 AliESDtrack *postrack2 = 0;
529 AliESDtrack *negtrack1 = 0;
530 AliESDtrack *negtrack2 = 0;
531 AliESDtrack *trackPi = 0;
532 Double_t mompos1[3],mompos2[3],momneg1[3],momneg2[3];
543 AliDebug(2,Form(
" dca cut set to %f cm",dcaMax));
547 fBzkG = (Double_t)event->GetMagneticField();
555 trkEntries = (Int_t)event->GetNumberOfTracks();
556 AliDebug(1,Form(
" Number of tracks: %d",trkEntries));
559 nv0 = (Int_t)event->GetNumberOfV0s();
560 AliDebug(1,Form(
" Number of V0s: %d",nv0));
562 if( trkEntries<2 && (trkEntries<1 || nv0<1) ) {
563 AliDebug(1,Form(
" Not enough tracks: %d",trkEntries));
580 TObjArray seleTrksArray(trkEntries);
581 TObjArray tracksAtVertex(trkEntries);
582 UChar_t *seleFlags =
new UChar_t[trkEntries];
584 Int_t *evtNumber =
new Int_t[trkEntries];
587 AliDebug(1,Form(
" Selected tracks: %d",nSeleTrks));
591 TObjArray *twoTrackArray1 =
new TObjArray(2);
592 TObjArray *twoTrackArray2 =
new TObjArray(2);
593 TObjArray *twoTrackArrayV0 =
new TObjArray(2);
594 TObjArray *twoTrackArrayCasc =
new TObjArray(2);
595 TObjArray *threeTrackArray =
new TObjArray(3);
596 TObjArray *fourTrackArray =
new TObjArray(4);
599 Bool_t isLikeSign2Prong=kFALSE,isLikeSign3Prong=kFALSE;
606 Bool_t massCutOK=kTRUE;
609 for(iTrkP1=0; iTrkP1<nSeleTrks; iTrkP1++) {
615 postrack1 = (AliESDtrack*)seleTrksArray.UncheckedAt(iTrkP1);
616 if(!TESTBIT(seleFlags[iTrkP1],
kBitDispl))
continue;
617 postrack1->GetPxPyPz(mompos1);
623 for(iv0=0; iv0<nv0; iv0++){
631 v0 = ((AliAODEvent*)event)->GetV0(iv0);
633 esdV0 = ((AliESDEvent*)event)->GetV0(iv0);
635 if ( (!v0 || !v0->IsA()->InheritsFrom(
"AliAODv0") ) &&
636 (!esdV0 || !esdV0->IsA()->InheritsFrom(
"AliESDv0") ) )
continue;
647 AliExternalTrackParam * posV0track;
648 AliExternalTrackParam * negV0track;
651 AliAODTrack *posVV0track = (AliAODTrack*)(v0->GetDaughter(0));
652 AliAODTrack *negVV0track = (AliAODTrack*)(v0->GetDaughter(1));
653 if( !posVV0track || !negVV0track )
continue;
658 if (posVV0track->GetID() == postrack1->GetID() ||
659 negVV0track->GetID() == postrack1->GetID())
continue;
661 if ( posVV0track->Charge() == negVV0track->Charge() )
continue;
663 if(!(posVV0track->GetStatus() & AliESDtrack::kTPCrefit) ||
664 !(negVV0track->GetStatus() & AliESDtrack::kTPCrefit))
continue;
666 Double_t xyz[3], pxpypz[3], cv[21]; Short_t sign;
667 posVV0track->PxPyPz(pxpypz); posVV0track->XvYvZv(xyz);
668 posVV0track->GetCovarianceXYZPxPyPz(cv); sign=posVV0track->Charge();
669 posV0track =
new AliExternalTrackParam(xyz,pxpypz,cv,sign);
670 negVV0track->PxPyPz(pxpypz); negVV0track->XvYvZv(xyz);
671 negVV0track->GetCovarianceXYZPxPyPz(cv); sign=negVV0track->Charge();
672 negV0track =
new AliExternalTrackParam(xyz,pxpypz,cv,sign);
674 AliESDtrack *posVV0track = (AliESDtrack*)(event->GetTrack( esdV0->GetPindex() ));
675 AliESDtrack *negVV0track = (AliESDtrack*)(event->GetTrack( esdV0->GetNindex() ));
676 if( !posVV0track || !negVV0track )
continue;
681 if (posVV0track->GetID() == postrack1->GetID() ||
682 negVV0track->GetID() == postrack1->GetID())
continue;
684 if ( posVV0track->Charge() == negVV0track->Charge() )
continue;
686 if(!(posVV0track->GetStatus() & AliESDtrack::kTPCrefit) ||
687 !(negVV0track->GetStatus() & AliESDtrack::kTPCrefit))
continue;
689 if (posVV0track->GetKinkIndex(0)>0 || negVV0track->GetKinkIndex(0)>0)
continue;
691 posV0track =
new AliExternalTrackParam(*posVV0track);
692 negV0track =
new AliExternalTrackParam(*negVV0track);
697 if( !posV0track || !negV0track ){
698 AliDebug(1,Form(
" Couldn't get the V0 daughters"));
703 twoTrackArrayV0->AddAt(posV0track,0);
704 twoTrackArrayV0->AddAt(negV0track,1);
707 dcaV0 = v0->DcaV0Daughters();
710 AliNeutralTrackParam *trackV0=NULL;
712 const AliVTrack *trackVV0 =
dynamic_cast<const AliVTrack*
>(v0);
713 if(trackVV0) trackV0 =
new AliNeutralTrackParam(trackVV0);
715 Double_t xyz[3], pxpypz[3];
717 esdV0->PxPyPz(pxpypz);
718 Double_t cv[21];
for(
int i=0; i<21; i++) cv[i]=0;
719 trackV0 =
new AliNeutralTrackParam(xyz,pxpypz,cv,0);
724 twoTrackArrayCasc->AddAt(postrack1,0);
725 twoTrackArrayCasc->AddAt(trackV0,1);
727 AliAODVertex *vertexCasc = 0;
730 dcaCasc = postrack1->GetDCA(trackV0,
fBzkG,xdummy,ydummy);
735 Double_t pos[3],cov[6],chi2perNDF;
737 fV1->GetCovMatrix(cov);
738 chi2perNDF =
fV1->GetChi2toNDF();
739 vertexCasc =
new AliAODVertex(pos,cov,chi2perNDF,0x0,-1,AliAODVertex::kUndef,2);
743 delete posV0track; posV0track=NULL;
744 delete negV0track; negV0track=NULL;
745 delete trackV0; trackV0=NULL;
747 twoTrackArrayV0->Clear();
748 twoTrackArrayCasc->Clear();
753 ioCascade =
MakeCascade(twoTrackArrayCasc,event,vertexCasc,v0,dcaCasc,okCascades);
754 if(okCascades && ioCascade) {
757 AliAODVertex *vCasc =
new(verticesHFRef[iVerticesHF++])AliAODVertex(*vertexCasc);
759 rc->SetSecondaryVtx(vCasc);
760 vCasc->SetParent(rc);
763 AddRefs(vCasc,rc,event,twoTrackArrayCasc);
764 vCasc->AddDaughter(v0);
768 delete posV0track; posV0track=NULL;
769 delete negV0track; negV0track=NULL;
770 delete trackV0; trackV0=NULL;
771 twoTrackArrayV0->Clear();
772 twoTrackArrayCasc->Clear();
773 if(ioCascade) {
delete ioCascade; ioCascade=NULL; }
774 if(vertexCasc) {
delete vertexCasc; vertexCasc=NULL; }
782 AliDebug(1,Form(
" Not enough tracks: %d",trkEntries));
786 if(postrack1->Charge()<0 && !
fLikeSign)
continue;
789 for(iTrkN1=0; iTrkN1<nSeleTrks; iTrkN1++) {
794 if(iTrkN1==iTrkP1)
continue;
797 negtrack1 = (AliESDtrack*)seleTrksArray.UncheckedAt(iTrkN1);
799 if(negtrack1->Charge()>0 && !
fLikeSign)
continue;
801 if(!TESTBIT(seleFlags[iTrkN1],
kBitDispl))
continue;
804 if(evtNumber[iTrkP1]==evtNumber[iTrkN1])
continue;
807 if(postrack1->Charge()==negtrack1->Charge()) {
808 isLikeSign2Prong=kTRUE;
810 if(iTrkN1<iTrkP1)
continue;
812 isLikeSign2Prong=kFALSE;
813 if(postrack1->Charge()<0 || negtrack1->Charge()>0)
continue;
815 if(evtNumber[iTrkP1]==evtNumber[iTrkN1])
continue;
825 negtrack1->GetPxPyPz(momneg1);
828 dcap1n1 = postrack1->GetDCA(negtrack1,
fBzkG,xdummy,ydummy);
829 if(dcap1n1>dcaMax) { negtrack1=0;
continue; }
832 twoTrackArray1->AddAt(postrack1,0);
833 twoTrackArray1->AddAt(negtrack1,1);
836 twoTrackArray1->Clear();
844 io2Prong =
Make2Prong(twoTrackArray1,event,vertexp1n1,dcap1n1,okD0,okJPSI,okD0fromDstar);
846 if((
fD0toKpi && okD0) || (
fJPSItoEle && okJPSI) || (isLikeSign2Prong && (okD0 || okJPSI))) {
848 AliAODVertex *v2Prong =
new(verticesHFRef[iVerticesHF++])AliAODVertex(*vertexp1n1);
849 if(!isLikeSign2Prong) {
852 rd->SetSecondaryVtx(v2Prong);
853 v2Prong->SetParent(rd);
854 AddRefs(v2Prong,rd,event,twoTrackArray1);
858 rd->SetSecondaryVtx(v2Prong);
859 if(!okD0) v2Prong->SetParent(rd);
860 AddRefs(v2Prong,rd,event,twoTrackArray1);
864 rd->SetSecondaryVtx(v2Prong);
865 v2Prong->SetParent(rd);
866 AddRefs(v2Prong,rd,event,twoTrackArray1);
872 if(
fDstar && okD0fromDstar && !isLikeSign2Prong) {
877 vertexp1n1->AddDaughter(postrack1);
878 vertexp1n1->AddDaughter(negtrack1);
880 io2Prong->SetSecondaryVtx(vertexp1n1);
883 AliNeutralTrackParam *trackD0 =
new AliNeutralTrackParam(io2Prong);
886 for(iTrkSoftPi=0; iTrkSoftPi<nSeleTrks; iTrkSoftPi++) {
888 if(iTrkSoftPi==iTrkP1 || iTrkSoftPi==iTrkN1)
continue;
890 if(!TESTBIT(seleFlags[iTrkSoftPi],
kBitSoftPi))
continue;
893 if(evtNumber[iTrkP1]==evtNumber[iTrkSoftPi] ||
894 evtNumber[iTrkN1]==evtNumber[iTrkSoftPi] ||
895 evtNumber[iTrkP1]==evtNumber[iTrkN1])
continue;
900 trackD0->PropagateToDCA(
fV1,
fBzkG,kVeryBig);
901 if(trackD0->GetSigmaY2()<0. || trackD0->GetSigmaZ2()<0.)
continue;
904 trackPi = (AliESDtrack*)seleTrksArray.UncheckedAt(iTrkSoftPi);
907 twoTrackArrayCasc->AddAt(trackPi,0);
908 twoTrackArrayCasc->AddAt(trackD0,1);
910 twoTrackArrayCasc->Clear();
915 AliAODVertex *vertexCasc = 0;
919 dcaCasc = trackPi->GetDCA(trackD0,
fBzkG,xdummy,ydummy);
924 Double_t pos[3],cov[6],chi2perNDF;
926 fV1->GetCovMatrix(cov);
927 chi2perNDF =
fV1->GetChi2toNDF();
928 vertexCasc =
new AliAODVertex(pos,cov,chi2perNDF,0x0,-1,AliAODVertex::kUndef,2);
932 twoTrackArrayCasc->Clear();
937 ioCascade =
MakeCascade(twoTrackArrayCasc,event,vertexCasc,io2Prong,dcaCasc,okDstar);
941 AliAODVertex *v2Prong =
new(verticesHFRef[iVerticesHF++])AliAODVertex(*vertexp1n1);
943 rd->SetSecondaryVtx(v2Prong);
944 v2Prong->SetParent(rd);
945 AddRefs(v2Prong,rd,event,twoTrackArray1);
949 AliAODVertex *vCasc =
new(verticesHFRef[iVerticesHF++])AliAODVertex(*vertexCasc);
951 rc->SetSecondaryVtx(vCasc);
952 vCasc->SetParent(rc);
954 AddRefs(vCasc,rc,event,twoTrackArrayCasc);
955 vCasc->AddDaughter(rd);
959 twoTrackArrayCasc->Clear();
961 if(ioCascade) {
delete ioCascade; ioCascade=NULL;}
962 delete vertexCasc; vertexCasc=NULL;
965 if(trackD0) {
delete trackD0; trackD0=NULL;}
968 if(io2Prong) {
delete io2Prong; io2Prong=NULL;}
971 twoTrackArray1->Clear();
973 (isLikeSign2Prong && !
f3Prong) ) {
981 for(iTrkP2=iTrkP1+1; iTrkP2<nSeleTrks; iTrkP2++) {
983 if(iTrkP2==iTrkP1 || iTrkP2==iTrkN1)
continue;
988 postrack2 = (AliESDtrack*)seleTrksArray.UncheckedAt(iTrkP2);
990 if(postrack2->Charge()<0)
continue;
992 if(!TESTBIT(seleFlags[iTrkP2],
kBitDispl))
continue;
995 if(!TESTBIT(seleFlags[iTrkP2],
kBit3Prong))
continue;
996 if(!TESTBIT(seleFlags[iTrkP1],
kBit3Prong))
continue;
997 if(!TESTBIT(seleFlags[iTrkN1],
kBit3Prong))
continue;
1000 if(evtNumber[iTrkP1]==evtNumber[iTrkP2] ||
1001 evtNumber[iTrkN1]==evtNumber[iTrkP2] ||
1002 evtNumber[iTrkP1]==evtNumber[iTrkN1])
continue;
1005 if(isLikeSign2Prong) {
1007 if(postrack1->Charge()>0) {
1008 isLikeSign3Prong=kTRUE;
1013 isLikeSign3Prong=kFALSE;
1015 if(evtNumber[iTrkP1]==evtNumber[iTrkP2] ||
1016 evtNumber[iTrkN1]==evtNumber[iTrkP2] ||
1017 evtNumber[iTrkP1]==evtNumber[iTrkN1])
continue;
1024 Bool_t okForLcTopKpi=kTRUE;
1025 Int_t pidLcStatus=3;
1029 okForLcTopKpi=kFALSE;
1033 okForLcTopKpi=kFALSE;
1037 okForLcTopKpi=kTRUE;
1042 okForLcTopKpi=kTRUE;
1047 Bool_t okForDsToKKpi=kTRUE;
1050 !TESTBIT(seleFlags[iTrkP2],
kBitKaonCompat) ) okForDsToKKpi=kFALSE;
1062 dcap2n1 = postrack2->GetDCA(negtrack1,
fBzkG,xdummy,ydummy);
1063 if(dcap2n1>dcaMax) { postrack2=0;
continue; }
1064 dcap1p2 = postrack2->GetDCA(postrack1,
fBzkG,xdummy,ydummy);
1065 if(dcap1p2>dcaMax) { postrack2=0;
continue; }
1070 if(postrack2->Charge()>0) {
1071 threeTrackArray->AddAt(postrack1,0);
1072 threeTrackArray->AddAt(negtrack1,1);
1073 threeTrackArray->AddAt(postrack2,2);
1075 threeTrackArray->AddAt(negtrack1,0);
1076 threeTrackArray->AddAt(postrack1,1);
1077 threeTrackArray->AddAt(postrack2,2);
1080 postrack2->GetPxPyPz(mompos2);
1081 Double_t pxDau[3]={mompos1[0],momneg1[0],mompos2[0]};
1082 Double_t pyDau[3]={mompos1[1],momneg1[1],mompos2[1]};
1083 Double_t pzDau[3]={mompos1[2],momneg1[2],mompos2[2]};
1090 threeTrackArray->Clear();
1098 twoTrackArray2->AddAt(postrack2,0);
1099 twoTrackArray2->AddAt(negtrack1,1);
1102 twoTrackArray2->Clear();
1111 io3Prong =
Make3Prong(threeTrackArray,event,secVert3PrAOD,dispersion,vertexp1n1,vertexp2n1,dcap1n1,dcap2n1,dcap1p2,okForLcTopKpi,okForDsToKKpi,ok3Prong);
1113 AliAODVertex *v3Prong =
new(verticesHFRef[iVerticesHF++])AliAODVertex(*secVert3PrAOD);
1114 if(!isLikeSign3Prong) {
1116 rd->SetSecondaryVtx(v3Prong);
1117 v3Prong->SetParent(rd);
1118 AddRefs(v3Prong,rd,event,threeTrackArray);
1122 rd->SetSecondaryVtx(v3Prong);
1123 v3Prong->SetParent(rd);
1124 AddRefs(v3Prong,rd,event,threeTrackArray);
1132 if(io3Prong) {
delete io3Prong; io3Prong=NULL;}
1133 if(secVert3PrAOD) {
delete secVert3PrAOD; secVert3PrAOD=NULL;}
1139 && !isLikeSign2Prong && !isLikeSign3Prong
1141 && dcap1n1 < fCutsD0toKpipipi->GetDCACut()
1142 && dcap2n1 < fCutsD0toKpipipi->GetDCACut()) {
1153 threeTrackArray->AddAt(postrack1,0);
1154 threeTrackArray->AddAt(negtrack1,1);
1155 threeTrackArray->AddAt(postrack2,2);
1159 for(iTrkN2=iTrkN1+1; iTrkN2<nSeleTrks; iTrkN2++) {
1161 if(iTrkN2==iTrkP1 || iTrkN2==iTrkP2 || iTrkN2==iTrkN1)
continue;
1166 negtrack2 = (AliESDtrack*)seleTrksArray.UncheckedAt(iTrkN2);
1168 if(negtrack2->Charge()>0)
continue;
1170 if(!TESTBIT(seleFlags[iTrkN2],
kBitDispl))
continue;
1172 if(evtNumber[iTrkP1]==evtNumber[iTrkN2] ||
1173 evtNumber[iTrkN1]==evtNumber[iTrkN2] ||
1174 evtNumber[iTrkP2]==evtNumber[iTrkN2] ||
1175 evtNumber[iTrkP1]==evtNumber[iTrkN1] ||
1176 evtNumber[iTrkP1]==evtNumber[iTrkP2] ||
1177 evtNumber[iTrkN1]==evtNumber[iTrkP2])
continue;
1190 dcap1n2 = postrack1->GetDCA(negtrack2,
fBzkG,xdummy,ydummy);
1192 dcap2n2 = postrack2->GetDCA(negtrack2,
fBzkG,xdummy,ydummy);
1196 fourTrackArray->AddAt(postrack1,0);
1197 fourTrackArray->AddAt(negtrack1,1);
1198 fourTrackArray->AddAt(postrack2,2);
1199 fourTrackArray->AddAt(negtrack2,3);
1207 fourTrackArray->Clear();
1214 io4Prong =
Make4Prong(fourTrackArray,event,secVert4PrAOD,vertexp1n1,vertexp1n1p2,dcap1n1,dcap1n2,dcap2n1,dcap2n2,ok4Prong);
1216 AliAODVertex *v4Prong =
new(verticesHFRef[iVerticesHF++])AliAODVertex(*secVert4PrAOD);
1218 rd->SetSecondaryVtx(v4Prong);
1219 v4Prong->SetParent(rd);
1220 AddRefs(v4Prong,rd,event,fourTrackArray);
1223 if(io4Prong) {
delete io4Prong; io4Prong=NULL;}
1224 if(secVert4PrAOD) {
delete secVert4PrAOD; secVert4PrAOD=NULL;}
1225 fourTrackArray->Clear();
1230 threeTrackArray->Clear();
1231 delete vertexp1n1p2;
1240 twoTrackArray2->Clear();
1243 for(iTrkN2=iTrkN1+1; iTrkN2<nSeleTrks; iTrkN2++) {
1245 if(iTrkN2==iTrkP1 || iTrkN2==iTrkP2 || iTrkN2==iTrkN1)
continue;
1250 negtrack2 = (AliESDtrack*)seleTrksArray.UncheckedAt(iTrkN2);
1252 if(negtrack2->Charge()>0)
continue;
1254 if(!TESTBIT(seleFlags[iTrkN2],
kBitDispl))
continue;
1257 if(!TESTBIT(seleFlags[iTrkN2],
kBit3Prong))
continue;
1258 if(!TESTBIT(seleFlags[iTrkP1],
kBit3Prong))
continue;
1259 if(!TESTBIT(seleFlags[iTrkN1],
kBit3Prong))
continue;
1262 if(evtNumber[iTrkP1]==evtNumber[iTrkN2] ||
1263 evtNumber[iTrkN1]==evtNumber[iTrkN2] ||
1264 evtNumber[iTrkP1]==evtNumber[iTrkN1])
continue;
1267 if(isLikeSign2Prong) {
1269 if(postrack1->Charge()<0) {
1270 isLikeSign3Prong=kTRUE;
1275 isLikeSign3Prong=kFALSE;
1281 Bool_t okForLcTopKpi=kTRUE;
1282 Int_t pidLcStatus=3;
1286 okForLcTopKpi=kFALSE;
1290 okForLcTopKpi=kFALSE;
1294 okForLcTopKpi=kTRUE;
1299 okForLcTopKpi=kTRUE;
1304 Bool_t okForDsToKKpi=kTRUE;
1307 !TESTBIT(seleFlags[iTrkN2],
kBitKaonCompat) ) okForDsToKKpi=kFALSE;
1319 dcap1n2 = postrack1->GetDCA(negtrack2,
fBzkG,xdummy,ydummy);
1320 if(dcap1n2>dcaMax) { negtrack2=0;
continue; }
1321 dcan1n2 = negtrack1->GetDCA(negtrack2,
fBzkG,xdummy,ydummy);
1322 if(dcan1n2>dcaMax) { negtrack2=0;
continue; }
1324 threeTrackArray->AddAt(negtrack1,0);
1325 threeTrackArray->AddAt(postrack1,1);
1326 threeTrackArray->AddAt(negtrack2,2);
1331 negtrack2->GetPxPyPz(momneg2);
1332 Double_t pxDau[3]={momneg1[0],mompos1[0],momneg2[0]};
1333 Double_t pyDau[3]={momneg1[1],mompos1[1],momneg2[1]};
1334 Double_t pzDau[3]={momneg1[2],mompos1[2],momneg2[2]};
1339 threeTrackArray->Clear();
1345 twoTrackArray2->AddAt(postrack1,0);
1346 twoTrackArray2->AddAt(negtrack2,1);
1350 twoTrackArray2->Clear();
1357 io3Prong =
Make3Prong(threeTrackArray,event,secVert3PrAOD,dispersion,vertexp1n1,vertexp1n2,dcap1n1,dcap1n2,dcan1n2,okForLcTopKpi,okForDsToKKpi,ok3Prong);
1359 AliAODVertex *v3Prong =
new(verticesHFRef[iVerticesHF++])AliAODVertex(*secVert3PrAOD);
1360 if(!isLikeSign3Prong) {
1362 rd->SetSecondaryVtx(v3Prong);
1363 v3Prong->SetParent(rd);
1364 AddRefs(v3Prong,rd,event,threeTrackArray);
1368 rd->SetSecondaryVtx(v3Prong);
1369 v3Prong->SetParent(rd);
1370 AddRefs(v3Prong,rd,event,threeTrackArray);
1378 if(io3Prong) {
delete io3Prong; io3Prong=NULL;}
1379 if(secVert3PrAOD) {
delete secVert3PrAOD; secVert3PrAOD=NULL;}
1381 threeTrackArray->Clear();
1387 twoTrackArray2->Clear();
1397 AliDebug(1,Form(
" Total HF vertices in event = %d;",
1398 (Int_t)aodVerticesHFTClArr->GetEntriesFast()));
1400 AliDebug(1,Form(
" D0->Kpi in event = %d;",
1401 (Int_t)aodD0toKpiTClArr->GetEntriesFast()));
1404 AliDebug(1,Form(
" JPSI->ee in event = %d;",
1405 (Int_t)aodJPSItoEleTClArr->GetEntriesFast()));
1408 AliDebug(1,Form(
" Charm->3Prong in event = %d;",
1409 (Int_t)aodCharm3ProngTClArr->GetEntriesFast()));
1412 AliDebug(1,Form(
" Charm->4Prong in event = %d;\n",
1413 (Int_t)aodCharm4ProngTClArr->GetEntriesFast()));
1416 AliDebug(1,Form(
" D*->D0pi in event = %d;\n",
1417 (Int_t)aodDstarTClArr->GetEntriesFast()));
1420 AliDebug(1,Form(
" cascades -> v0 + track in event = %d;\n",
1421 (Int_t)aodCascadesTClArr->GetEntriesFast()));
1424 AliDebug(1,Form(
" Like-sign 2Prong in event = %d;\n",
1425 (Int_t)aodLikeSign2ProngTClArr->GetEntriesFast()));
1428 AliDebug(1,Form(
" Like-sign 3Prong in event = %d;\n",
1429 (Int_t)aodLikeSign3ProngTClArr->GetEntriesFast()));
1433 twoTrackArray1->Delete();
delete twoTrackArray1;
1434 twoTrackArray2->Delete();
delete twoTrackArray2;
1435 twoTrackArrayCasc->Delete();
delete twoTrackArrayCasc;
1436 twoTrackArrayV0->Delete();
delete twoTrackArrayV0;
1437 threeTrackArray->Clear();
1438 threeTrackArray->Delete();
delete threeTrackArray;
1439 fourTrackArray->Delete();
delete fourTrackArray;
1440 delete [] seleFlags; seleFlags=NULL;
1441 if(evtNumber) {
delete [] evtNumber; evtNumber=NULL;}
1442 tracksAtVertex.Delete();
1445 seleTrksArray.Delete();
1456 const AliVEvent *event,
1457 const TObjArray *trkArray)
const
1481 const AliVEvent *event,
1482 const TObjArray *trkArray)
const
1487 Int_t nDg = v->GetNDaughters();
1489 if(nDg) dg = v->GetDaughter(0);
1493 Int_t nTrks = trkArray->GetEntriesFast();
1495 AliExternalTrackParam *track = 0;
1496 AliAODTrack *aodTrack = 0;
1499 for(Int_t i=0; i<nTrks; i++) {
1500 track = (AliExternalTrackParam*)trkArray->UncheckedAt(i);
1501 id = (Int_t)track->GetID();
1504 aodTrack =
dynamic_cast<AliAODTrack*
>(
event->GetTrack(
fAODMap[
id]));
1505 if(!aodTrack) AliFatal(
"Not a standard AOD");
1506 v->AddDaughter(aodTrack);
1520 TClonesArray *inputArray=(TClonesArray*)aod->GetList()->FindObject(
"VerticesHF");
1521 if(!inputArray)
return;
1523 AliAODTrack *track = 0;
1524 AliAODVertex *vertex = 0;
1526 Bool_t needtofix=kFALSE;
1527 for(Int_t iv=0; iv<inputArray->GetEntriesFast(); iv++) {
1528 vertex = (AliAODVertex*)inputArray->UncheckedAt(iv);
1529 for(Int_t
id=0;
id<vertex->GetNDaughters();
id++) {
1530 track = (AliAODTrack*)vertex->GetDaughter(
id);
1531 if(!track->GetStatus()) needtofix=kTRUE;
1533 if(needtofix)
break;
1536 if(!needtofix)
return;
1539 printf(
"Fixing references\n");
1545 for(Int_t i=0; i<aod->GetNumberOfTracks(); i++) {
1546 track =
dynamic_cast<AliAODTrack*
>(aod->GetTrack(i));
1547 if(!track) AliFatal(
"Not a standard AOD");
1550 if(track->GetStatus()&AliESDtrack::kITSpureSA)
continue;
1553 if(!(track->GetStatus()&AliESDtrack::kITSin))
continue;
1556 Double_t covtest[21];
1557 if(!track->GetCovarianceXYZPxPyPz(covtest))
continue;
1560 Int_t ind = (Int_t)track->GetID();
1561 if (ind>-1 && ind < fAODMapSize)
fAODMap[ind] = i;
1565 Int_t ids[4]={-1,-1,-1,-1};
1566 for(Int_t iv=0; iv<inputArray->GetEntriesFast(); iv++) {
1567 Bool_t cascade=kFALSE;
1568 vertex = (AliAODVertex*)inputArray->UncheckedAt(iv);
1570 Int_t nDgs = vertex->GetNDaughters();
1571 for(
id=0;
id<nDgs;
id++) {
1572 track = (AliAODTrack*)vertex->GetDaughter(
id);
1573 if(track->Charge()==0) {cascade=kTRUE;
continue;}
1574 ids[id]=(Int_t)track->GetID();
1575 vertex->RemoveDaughter(track);
1577 if(cascade)
continue;
1578 for(
id=0;
id<nDgs;
id++) {
1579 if (ids[
id]>-1 && ids[
id] < fAODMapSize) {
1580 track =
dynamic_cast<AliAODTrack*
>(aod->GetTrack(
fAODMap[ids[
id]]));
1581 if(!track) AliFatal(
"Not a standard AOD");
1582 vertex->AddDaughter(track);
1592 TObjArray *twoTrackArray,AliVEvent *event,
1593 AliAODVertex *secVert,
1604 Bool_t dummy1,dummy2,dummy3;
1610 dummy1,dummy2,dummy3);
1611 if(!theCascade)
return 0x0;
1614 AliESDtrack *trackPi = (AliESDtrack*)twoTrackArray->UncheckedAt(0);
1615 theCascade->SetCharge(trackPi->Charge());
1621 Int_t idSoftPi=(Int_t)trackPi->GetID();
1623 AliAODTrack* trackPiAOD=
dynamic_cast<AliAODTrack*
>(
event->GetTrack(
fAODMap[idSoftPi]));
1624 if(!trackPiAOD) AliFatal(
"Not a standard AOD");
1625 tmpCascade->GetSecondaryVtx()->AddDaughter(trackPiAOD);
1628 tmpCascade->GetSecondaryVtx()->AddDaughter(trackPi);
1630 tmpCascade->GetSecondaryVtx()->AddDaughter(rd2Prong);
1632 AliAODVertex *primVertexAOD=0;
1644 tmpCascade->GetSecondaryVtx()->RemoveDaughters();
1646 delete tmpCascade; tmpCascade=NULL;
1650 if(primVertexAOD) {
delete primVertexAOD; primVertexAOD=NULL;}
1660 TObjArray *twoTrackArray,AliVEvent *event,
1661 AliAODVertex *secVert,
1673 Bool_t dummy1,dummy2,dummy3;
1679 dummy1,dummy2,dummy3);
1680 if(!theCascade)
return 0x0;
1683 AliESDtrack *trackBachelor = (AliESDtrack*)twoTrackArray->UncheckedAt(0);
1684 theCascade->SetCharge(trackBachelor->Charge());
1691 Int_t idBachelor=(Int_t)trackBachelor->GetID();
1692 if (idBachelor > -1 && idBachelor <
fAODMapSize) {
1693 AliAODTrack* trackBachelorAOD=
dynamic_cast<AliAODTrack*
>(
event->GetTrack(
fAODMap[idBachelor]));
1694 if(!trackBachelorAOD) AliFatal(
"Not a standard AOD");
1695 tmpCascade->GetSecondaryVtx()->AddDaughter(trackBachelorAOD);
1698 tmpCascade->GetSecondaryVtx()->AddDaughter(trackBachelor);
1700 tmpCascade->GetSecondaryVtx()->AddDaughter(v0);
1702 AliAODVertex *primVertexAOD=0;
1706 if(!primVertexAOD) primVertexAOD = (AliAODVertex*)event->GetPrimaryVertex();
1718 tmpCascade->GetSecondaryVtx()->RemoveDaughters();
1720 delete tmpCascade; tmpCascade=NULL;
1721 if(primVertexAOD) {
delete primVertexAOD; primVertexAOD=NULL;}
1729 TObjArray *twoTrackArray,AliVEvent *event,
1730 AliAODVertex *secVert,Double_t dca,
1731 Bool_t &okD0,Bool_t &okJPSI,
1732 Bool_t &okD0fromDstar)
1739 okD0=kFALSE; okJPSI=kFALSE; okD0fromDstar=kFALSE;
1741 Double_t px[2],py[2],pz[2],d0[2],d0err[2];
1742 AliESDtrack *postrack = (AliESDtrack*)twoTrackArray->UncheckedAt(0);
1743 AliESDtrack *negtrack = (AliESDtrack*)twoTrackArray->UncheckedAt(1);
1746 postrack->PropagateToDCA(secVert,
fBzkG,kVeryBig);
1747 negtrack->PropagateToDCA(secVert,
fBzkG,kVeryBig);
1749 Double_t momentum[3];
1750 postrack->GetPxPyPz(momentum);
1751 px[0] = momentum[0]; py[0] = momentum[1]; pz[0] = momentum[2];
1752 negtrack->GetPxPyPz(momentum);
1753 px[1] = momentum[0]; py[1] = momentum[1]; pz[1] = momentum[2];
1757 Bool_t okMassCut=kFALSE;
1767 AliAODVertex *primVertexAOD =
PrimaryVertex(twoTrackArray,event);
1768 if(!primVertexAOD)
return 0x0;
1771 Double_t d0z0[2],covd0z0[3];
1772 postrack->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
1774 d0err[0] = TMath::Sqrt(covd0z0[0]);
1775 negtrack->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
1777 d0err[1] = TMath::Sqrt(covd0z0[0]);
1782 UShort_t
id[2]={(UShort_t)postrack->GetID(),(UShort_t)negtrack->GetID()};
1784 delete primVertexAOD; primVertexAOD=NULL;
1787 if(postrack->Charge()!=0 && negtrack->Charge()!=0) {
1818 Double_t esdpid0[5]={0.,0.,0.,0.,0.};
1819 if(postrack->GetStatus()&AliESDtrack::kESDpid) postrack->GetESDpid(esdpid0);
1820 Double_t esdpid1[5]={0.,0.,0.,0.,0.};
1821 if(negtrack->GetStatus()&AliESDtrack::kESDpid) negtrack->GetESDpid(esdpid1);
1822 Double_t esdpid[10];
1823 for(Int_t i=0;i<5;i++) {
1824 esdpid[i] = esdpid0[i];
1825 esdpid[5+i] = esdpid1[i];
1827 the2Prong->SetPID(2,esdpid);
1833 TObjArray *threeTrackArray,AliVEvent *event,
1834 AliAODVertex *secVert,Double_t dispersion,
1835 const AliAODVertex *vertexp1n1,
const AliAODVertex *vertexp2n1,
1836 Double_t dcap1n1,Double_t dcap2n1,Double_t dcap1p2,
1837 Bool_t useForLc, Bool_t useForDs, Bool_t &ok3Prong)
1846 if(!secVert || !vertexp1n1 || !vertexp2n1)
return 0x0;
1848 Double_t px[3],py[3],pz[3],d0[3],d0err[3];
1849 Double_t momentum[3];
1852 AliESDtrack *postrack1 = (AliESDtrack*)threeTrackArray->UncheckedAt(0);
1853 AliESDtrack *negtrack = (AliESDtrack*)threeTrackArray->UncheckedAt(1);
1854 AliESDtrack *postrack2 = (AliESDtrack*)threeTrackArray->UncheckedAt(2);
1856 postrack1->PropagateToDCA(secVert,
fBzkG,kVeryBig);
1857 negtrack->PropagateToDCA(secVert,
fBzkG,kVeryBig);
1858 postrack2->PropagateToDCA(secVert,
fBzkG,kVeryBig);
1859 postrack1->GetPxPyPz(momentum);
1860 px[0] = momentum[0]; py[0] = momentum[1]; pz[0] = momentum[2];
1861 negtrack->GetPxPyPz(momentum);
1862 px[1] = momentum[0]; py[1] = momentum[1]; pz[1] = momentum[2];
1863 postrack2->GetPxPyPz(momentum);
1864 px[2] = momentum[0]; py[2] = momentum[1]; pz[2] = momentum[2];
1867 Bool_t okMassCut=kFALSE;
1876 AliAODVertex *primVertexAOD =
PrimaryVertex(threeTrackArray,event);
1877 if(!primVertexAOD)
return 0x0;
1879 Double_t d0z0[2],covd0z0[3];
1880 postrack1->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
1882 d0err[0] = TMath::Sqrt(covd0z0[0]);
1883 negtrack->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
1885 d0err[1] = TMath::Sqrt(covd0z0[0]);
1886 postrack2->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
1888 d0err[2] = TMath::Sqrt(covd0z0[0]);
1892 Double_t pos[3]; primVertexAOD->GetXYZ(pos);
1893 Double_t dca[3]={dcap1n1,dcap2n1,dcap1p2};
1894 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]));
1895 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]));
1896 Short_t
charge=(Short_t)(postrack1->Charge()+postrack2->Charge()+negtrack->Charge());
1897 AliAODRecoDecayHF3Prong *the3Prong =
new AliAODRecoDecayHF3Prong(secVert,px,py,pz,d0,d0err,dca,dispersion,dist12,dist23,charge);
1899 UShort_t
id[3]={(UShort_t)postrack1->GetID(),(UShort_t)negtrack->GetID(),(UShort_t)postrack2->GetID()};
1902 delete primVertexAOD; primVertexAOD=NULL;
1935 Double_t esdpid0[5]={0.,0.,0.,0.,0.};
1936 if(postrack1->GetStatus()&AliESDtrack::kESDpid) postrack1->GetESDpid(esdpid0);
1937 Double_t esdpid1[5]={0.,0.,0.,0.,0.};
1938 if(negtrack->GetStatus()&AliESDtrack::kESDpid) negtrack->GetESDpid(esdpid1);
1939 Double_t esdpid2[5]={0.,0.,0.,0.,0.};
1940 if(postrack2->GetStatus()&AliESDtrack::kESDpid) postrack2->GetESDpid(esdpid2);
1942 Double_t esdpid[15];
1943 for(Int_t i=0;i<5;i++) {
1944 esdpid[i] = esdpid0[i];
1945 esdpid[5+i] = esdpid1[i];
1946 esdpid[10+i] = esdpid2[i];
1948 the3Prong->SetPID(3,esdpid);
1954 TObjArray *fourTrackArray,AliVEvent *event,
1955 AliAODVertex *secVert,
1956 const AliAODVertex *vertexp1n1,
1957 const AliAODVertex *vertexp1n1p2,
1958 Double_t dcap1n1,Double_t dcap1n2,
1959 Double_t dcap2n1,Double_t dcap2n2,
1968 if(!secVert || !vertexp1n1 || !vertexp1n1p2)
return 0x0;
1970 Double_t px[4],py[4],pz[4],d0[4],d0err[4];
1972 AliESDtrack *postrack1 = (AliESDtrack*)fourTrackArray->UncheckedAt(0);
1973 AliESDtrack *negtrack1 = (AliESDtrack*)fourTrackArray->UncheckedAt(1);
1974 AliESDtrack *postrack2 = (AliESDtrack*)fourTrackArray->UncheckedAt(2);
1975 AliESDtrack *negtrack2 = (AliESDtrack*)fourTrackArray->UncheckedAt(3);
1977 postrack1->PropagateToDCA(secVert,
fBzkG,kVeryBig);
1978 negtrack1->PropagateToDCA(secVert,
fBzkG,kVeryBig);
1979 postrack2->PropagateToDCA(secVert,
fBzkG,kVeryBig);
1980 negtrack2->PropagateToDCA(secVert,
fBzkG,kVeryBig);
1982 Double_t momentum[3];
1983 postrack1->GetPxPyPz(momentum);
1984 px[0] = momentum[0]; py[0] = momentum[1]; pz[0] = momentum[2];
1985 negtrack1->GetPxPyPz(momentum);
1986 px[1] = momentum[0]; py[1] = momentum[1]; pz[1] = momentum[2];
1987 postrack2->GetPxPyPz(momentum);
1988 px[2] = momentum[0]; py[2] = momentum[1]; pz[2] = momentum[2];
1989 negtrack2->GetPxPyPz(momentum);
1990 px[3] = momentum[0]; py[3] = momentum[1]; pz[3] = momentum[2];
1993 Bool_t okMassCut=kFALSE;
2005 AliAODVertex *primVertexAOD =
PrimaryVertex(fourTrackArray,event);
2006 if(!primVertexAOD)
return 0x0;
2008 Double_t d0z0[2],covd0z0[3];
2009 postrack1->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2011 d0err[0] = TMath::Sqrt(covd0z0[0]);
2012 negtrack1->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2014 d0err[1] = TMath::Sqrt(covd0z0[0]);
2015 postrack2->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2017 d0err[2] = TMath::Sqrt(covd0z0[0]);
2018 negtrack2->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2020 d0err[3] = TMath::Sqrt(covd0z0[0]);
2024 Double_t pos[3]; primVertexAOD->GetXYZ(pos);
2025 Double_t dca[6]={dcap1n1,0.,dcap1n2,dcap2n1,0.,dcap2n2};
2026 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]));
2027 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]));
2028 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]));
2030 AliAODRecoDecayHF4Prong *the4Prong =
new AliAODRecoDecayHF4Prong(secVert,px,py,pz,d0,d0err,dca,dist12,dist3,dist4,charge);
2032 UShort_t
id[4]={(UShort_t)postrack1->GetID(),(UShort_t)negtrack1->GetID(),(UShort_t)postrack2->GetID(),(UShort_t)negtrack2->GetID()};
2035 delete primVertexAOD; primVertexAOD=NULL;
2046 Double_t esdpid0[5]={0.,0.,0.,0.,0.};
2047 if(postrack1->GetStatus()&AliESDtrack::kESDpid) postrack1->GetESDpid(esdpid0);
2048 Double_t esdpid1[5]={0.,0.,0.,0.,0.};
2049 if(negtrack1->GetStatus()&AliESDtrack::kESDpid) negtrack1->GetESDpid(esdpid1);
2050 Double_t esdpid2[5]={0.,0.,0.,0.,0.};
2051 if(postrack2->GetStatus()&AliESDtrack::kESDpid) postrack2->GetESDpid(esdpid2);
2052 Double_t esdpid3[5]={0.,0.,0.,0.,0.};
2053 if(negtrack2->GetStatus()&AliESDtrack::kESDpid) negtrack2->GetESDpid(esdpid3);
2055 Double_t esdpid[20];
2056 for(Int_t i=0;i<5;i++) {
2057 esdpid[i] = esdpid0[i];
2058 esdpid[5+i] = esdpid1[i];
2059 esdpid[10+i] = esdpid2[i];
2060 esdpid[15+i] = esdpid3[i];
2062 the4Prong->SetPID(4,esdpid);
2068 AliVEvent *event)
const
2073 AliESDVertex *vertexESD = 0;
2074 AliAODVertex *vertexAOD = 0;
2080 vertexESD =
new AliESDVertex(*
fV1);
2085 Int_t nTrks = trkArray->GetEntriesFast();
2086 AliVertexerTracks *vertexer =
new AliVertexerTracks(event->GetMagneticField());
2091 if(strstr(
fV1->GetTitle(),
"VertexerTracksWithConstraint")) {
2092 Float_t diamondcovxy[3];
2093 event->GetDiamondCovXY(diamondcovxy);
2094 Double_t pos[3]={
event->GetDiamondX(),
event->GetDiamondY(),0.};
2095 Double_t cov[6]={diamondcovxy[0],diamondcovxy[1],diamondcovxy[2],0.,0.,10.*10.};
2096 AliESDVertex *diamond =
new AliESDVertex(pos,cov,1.,1);
2097 vertexer->SetVtxStart(diamond);
2098 delete diamond; diamond=NULL;
2099 if(strstr(
fV1->GetTitle(),
"VertexerTracksWithConstraintOnlyFitter"))
2100 vertexer->SetOnlyFitter();
2102 Int_t skipped[1000];
2103 Int_t nTrksToSkip=0,id;
2104 AliExternalTrackParam *t = 0;
2105 for(Int_t i=0; i<nTrks; i++) {
2106 t = (AliExternalTrackParam*)trkArray->UncheckedAt(i);
2107 id = (Int_t)t->GetID();
2109 skipped[nTrksToSkip++] = id;
2114 Double_t covtest[21];
2115 for(Int_t j=0; j<
event->GetNumberOfTracks(); j++) {
2116 AliVTrack *vtrack = (AliVTrack*)event->GetTrack(j);
2117 if(!vtrack->GetCovarianceXYZPxPyPz(covtest)) {
2118 id = (Int_t)vtrack->GetID();
2120 skipped[nTrksToSkip++] = id;
2124 for(Int_t ijk=nTrksToSkip; ijk<1000; ijk++) skipped[ijk]=-1;
2126 vertexer->SetSkipTracks(nTrksToSkip,skipped);
2127 vertexESD = (AliESDVertex*)vertexer->FindPrimaryVertex(event);
2132 TObjArray rmArray(nTrks);
2133 UShort_t *rmId =
new UShort_t[nTrks];
2134 AliESDtrack *esdTrack = 0;
2136 for(Int_t i=0; i<nTrks; i++) {
2137 t = (AliESDtrack*)trkArray->UncheckedAt(i);
2138 esdTrack =
new AliESDtrack(*t);
2139 rmArray.AddLast(esdTrack);
2140 if(esdTrack->GetID()>=0) {
2141 rmId[i]=(UShort_t)esdTrack->GetID();
2146 Float_t diamondxy[2]={
static_cast<Float_t
>(
event->GetDiamondX()),static_cast<Float_t>(event->GetDiamondY())};
2147 vertexESD = vertexer->RemoveTracksFromVertex(
fV1,&rmArray,rmId,diamondxy);
2148 delete [] rmId; rmId=NULL;
2153 if(!vertexESD)
return vertexAOD;
2154 if(vertexESD->GetNContributors()<=0) {
2156 delete vertexESD; vertexESD=NULL;
2160 delete vertexer; vertexer=NULL;
2165 Double_t pos[3],cov[6],chi2perNDF;
2166 vertexESD->GetXYZ(pos);
2167 vertexESD->GetCovMatrix(cov);
2168 chi2perNDF = vertexESD->GetChi2toNDF();
2169 delete vertexESD; vertexESD=NULL;
2171 vertexAOD =
new AliAODVertex(pos,cov,chi2perNDF);
2182 printf(
"Secondary vertex with Kalman filter package (AliKFParticle)\n");
2184 printf(
"Secondary vertex with AliVertexerTracks\n");
2189 printf(
"Reconstruct D0->Kpi candidates with cuts:\n");
2193 printf(
"Reconstruct D*->D0pi candidates with cuts:\n");
2195 printf(
" Reconstruct a secondary vertex for the D*\n");
2197 printf(
" Assume the D* comes from the primary vertex\n");
2202 printf(
"Reconstruct J/psi from B candidates with cuts:\n");
2206 printf(
"Reconstruct 3 prong candidates.\n");
2207 printf(
" D+->Kpipi cuts:\n");
2209 printf(
" Ds->KKpi cuts:\n");
2211 printf(
" Lc->pKpi cuts:\n");
2215 printf(
"Reconstruct 4 prong candidates.\n");
2216 printf(
" D0->Kpipipi cuts:\n");
2220 printf(
"Reconstruct cascades candidates formed with v0s.\n");
2221 printf(
" Lc -> k0s P & Lc -> L Pi cuts:\n");
2229 Double_t &dispersion,Bool_t useTRefArray)
const
2234 AliESDVertex *vertexESD = 0;
2235 AliAODVertex *vertexAOD = 0;
2240 vertexESD = (AliESDVertex*)
fVertexerTracks->VertexForSelectedESDTracks(trkArray);
2242 if(!vertexESD)
return vertexAOD;
2244 if(vertexESD->GetNContributors()!=trkArray->GetEntriesFast()) {
2246 delete vertexESD; vertexESD=NULL;
2250 Double_t vertRadius2=vertexESD->GetX()*vertexESD->GetX()+vertexESD->GetY()*vertexESD->GetY();
2253 delete vertexESD; vertexESD=NULL;
2259 AliKFParticle::SetField(
fBzkG);
2261 AliKFVertex vertexKF;
2263 Int_t nTrks = trkArray->GetEntriesFast();
2264 for(Int_t i=0; i<nTrks; i++) {
2265 AliESDtrack *esdTrack = (AliESDtrack*)trkArray->At(i);
2266 AliKFParticle daughterKF(*esdTrack,211);
2267 vertexKF.AddDaughter(daughterKF);
2269 vertexESD =
new AliESDVertex(vertexKF.Parameters(),
2270 vertexKF.CovarianceMatrix(),
2272 vertexKF.GetNContributors());
2277 Double_t pos[3],cov[6],chi2perNDF;
2278 vertexESD->GetXYZ(pos);
2279 vertexESD->GetCovMatrix(cov);
2280 chi2perNDF = vertexESD->GetChi2toNDF();
2281 dispersion = vertexESD->GetDispersion();
2282 delete vertexESD; vertexESD=NULL;
2284 Int_t nprongs= (useTRefArray ? 0 : trkArray->GetEntriesFast());
2285 vertexAOD =
new AliAODVertex(pos,cov,chi2perNDF,0x0,-1,AliAODVertex::kUndef,nprongs);
2294 Int_t retval=kFALSE;
2295 Double_t momentum[3];
2296 Double_t px[3],py[3],pz[3];
2297 for(Int_t iTrack=0; iTrack<3; iTrack++){
2298 AliESDtrack *track = (AliESDtrack*)trkArray->UncheckedAt(iTrack);
2299 track->GetPxPyPz(momentum);
2300 px[iTrack] = momentum[0]; py[iTrack] = momentum[1]; pz[iTrack] = momentum[2];
2312 Int_t retval=kFALSE;
2313 Double_t momentum[3];
2314 Double_t px[4],py[4],pz[4];
2316 for(Int_t iTrack=0; iTrack<4; iTrack++){
2317 AliESDtrack *track = (AliESDtrack*)trkArray->UncheckedAt(iTrack);
2318 track->GetPxPyPz(momentum);
2319 px[iTrack] = momentum[0]; py[iTrack] = momentum[1]; pz[iTrack] = momentum[2];
2331 Int_t retval=kFALSE;
2332 Double_t momentum[3];
2333 Double_t px[2],py[2],pz[2];
2335 for(Int_t iTrack=0; iTrack<2; iTrack++){
2336 AliESDtrack *track = (AliESDtrack*)trkArray->UncheckedAt(iTrack);
2337 track->GetPxPyPz(momentum);
2338 px[iTrack] = momentum[0]; py[iTrack] = momentum[1]; pz[iTrack] = momentum[2];
2353 Double_t minv2,mrange;
2354 Double_t lolim,hilim;
2356 Bool_t retval=kFALSE;
2358 fMassCalc2->SetPxPyPzProngs(nprongs,px,py,pz);
2363 if(
fMassCalc2->Pt2() < minPt*minPt)
return retval;
2368 pdg2[0]=211; pdg2[1]=321;
2370 if(minv2>lolim*lolim && minv2<hilim*hilim ){
2374 pdg2[0]=321; pdg2[1]=211;
2376 if(minv2>lolim*lolim && minv2<hilim*hilim ){
2392 Double_t minv2,mrange;
2393 Double_t lolim,hilim;
2395 Bool_t retval=kFALSE;
2397 fMassCalc2->SetPxPyPzProngs(nprongs,px,py,pz);
2402 if(
fMassCalc2->Pt2() < minPt*minPt)
return retval;
2408 pdg2[0]=11; pdg2[1]=11;
2410 if(minv2>lolim*lolim && minv2<hilim*hilim ){
2427 Double_t minv2,mrange;
2428 Double_t lolim,hilim;
2430 Bool_t retval=kFALSE;
2433 fMassCalc3->SetPxPyPzProngs(nprongs,px,py,pz);
2441 if(
fMassCalc3->Pt2() < minPt*minPt)
return retval;
2446 pdg3[0]=211; pdg3[1]=321; pdg3[2]=211;
2448 if(minv2>lolim*lolim && minv2<hilim*hilim ){
2456 pdg3[0]=321; pdg3[1]=321; pdg3[2]=211;
2458 if(minv2>lolim*lolim && minv2<hilim*hilim ){
2462 pdg3[0]=211; pdg3[1]=321; pdg3[2]=321;
2464 if(minv2>lolim*lolim && minv2<hilim*hilim ){
2473 pdg3[0]=2212; pdg3[1]=321; pdg3[2]=211;
2475 if(minv2>lolim*lolim && minv2<hilim*hilim ){
2481 pdg3[0]=211; pdg3[1]=321; pdg3[2]=2212;
2483 if(minv2>lolim*lolim && minv2<hilim*hilim ){
2501 Double_t minv2,mrange;
2502 Double_t lolim,hilim;
2504 Bool_t retval=kFALSE;
2506 fMassCalc2->SetPxPyPzProngs(nprongs,px,py,pz);
2511 if(
fMassCalc2->Pt2() < minPt*minPt)
return retval;
2513 pdg2[0]=211; pdg2[1]=421;
2518 if(minv2>lolim*lolim && minv2<hilim*hilim ){
2535 Double_t minv2,mrange;
2536 Double_t lolim,hilim;
2538 Bool_t retval=kFALSE;
2541 fMassCalc4->SetPxPyPzProngs(nprongs,px,py,pz);
2546 if(
fMassCalc4->Pt2() < minPt*minPt)
return retval;
2552 pdg4[0]=321; pdg4[1]=211; pdg4[2]=211; pdg4[3]=211;
2554 if(minv2>lolim*lolim && minv2<hilim*hilim ){
2559 pdg4[0]=211; pdg4[1]=321; pdg4[2]=211; pdg4[3]=211;
2561 if(minv2>lolim*lolim && minv2<hilim*hilim ){
2566 pdg4[0]=211; pdg4[1]=211; pdg4[2]=321; pdg4[3]=211;
2568 if(minv2>lolim*lolim && minv2<hilim*hilim ){
2573 pdg4[0]=211; pdg4[1]=211; pdg4[2]=211; pdg4[3]=321;
2575 if(minv2>lolim*lolim && minv2<hilim*hilim ){
2591 Double_t minv2,mrange;
2592 Double_t lolim,hilim;
2594 Bool_t retval=kFALSE;
2596 fMassCalc2->SetPxPyPzProngs(nprongs,px,py,pz);
2602 pdg2[0]=2212;pdg2[1]=310;
2604 if(minv2>lolim*lolim && minv2<hilim*hilim ){
2608 pdg2[0]=211;pdg2[1]=3122;
2610 if(minv2>lolim*lolim && minv2<hilim*hilim ){
2620 TObjArray &seleTrksArray,
2621 TObjArray &tracksAtVertex,
2623 UChar_t *seleFlags,Int_t *evtNumber)
2632 const AliVVertex *vprimary =
event->GetPrimaryVertex();
2638 UShort_t *indices = 0;
2639 Double_t pos[3],cov[6];
2640 const Int_t entries =
event->GetNumberOfTracks();
2641 AliCentrality* cent;
2644 fV1 =
new AliESDVertex(*((AliESDVertex*)vprimary));
2645 cent=((AliESDEvent*)event)->GetCentrality();
2647 vprimary->GetXYZ(pos);
2648 vprimary->GetCovarianceMatrix(cov);
2649 fV1 =
new AliESDVertex(pos,cov,100.,100,vprimary->GetName());
2650 if(entries<=0)
return;
2651 indices =
new UShort_t[entries];
2652 memset(indices,0,
sizeof(UShort_t)*entries);
2656 cent=((AliAODEvent*)event)->GetCentrality();
2658 Float_t centperc=cent->GetCentralityPercentile(
"V0M");
2660 Bool_t okDisplaced=kFALSE,okSoftPi=kFALSE,okFor3Prong=kFALSE;
2664 for(Int_t i=0; i<entries; i++) {
2666 track = (AliVTrack*)event->GetTrack(i);
2669 if(track->GetStatus()&AliESDtrack::kITSpureSA)
continue;
2672 if(!(track->GetStatus()&AliESDtrack::kITSin))
continue;
2676 if(track->GetID()<0)
continue;
2679 Double_t covtest[21];
2680 if(!track->GetCovarianceXYZPxPyPz(covtest))
continue;
2684 AliAODTrack *aodt = (AliAODTrack*)track;
2685 if(aodt->GetUsedForPrimVtxFit()) {
2686 indices[nindices]=aodt->GetID(); nindices++;
2688 Int_t ind = (Int_t)aodt->GetID();
2692 AliESDtrack *esdt = 0;
2695 esdt = (AliESDtrack*)track;
2697 esdt =
new AliESDtrack(track);
2701 okDisplaced=kFALSE; okSoftPi=kFALSE; okFor3Prong=kFALSE;
2703 evtNumber[i]=((AliMixedEvent*)event)->EventIndex(i);
2704 const AliVVertex* eventVtx=((AliMixedEvent*)event)->GetEventVertex(i);
2705 Double_t vtxPos[3],primPos[3],primCov[6],trasl[3];
2706 eventVtx->GetXYZ(vtxPos);
2707 vprimary->GetXYZ(primPos);
2708 eventVtx->GetCovarianceMatrix(primCov);
2709 for(Int_t ind=0;ind<3;ind++){
2710 trasl[ind]=vtxPos[ind]-primPos[ind];
2713 Bool_t isTransl=esdt->Translate(trasl,primCov);
2721 if(
SingleTrkCuts(esdt,centperc,okDisplaced,okSoftPi,okFor3Prong) && nSeleTrks<trkEntries) {
2722 esdt->PropagateToDCA(
fV1,
fBzkG,kVeryBig);
2723 seleTrksArray.AddLast(esdt);
2724 tracksAtVertex.AddLast(
new AliExternalTrackParam(*esdt));
2725 seleFlags[nSeleTrks]=0;
2726 if(okDisplaced) SETBIT(seleFlags[nSeleTrks],
kBitDispl);
2727 if(okFor3Prong) SETBIT(seleFlags[nSeleTrks],
kBit3Prong);
2728 if(okSoftPi) SETBIT(seleFlags[nSeleTrks],
kBitSoftPi);
2734 Bool_t useTPC=kTRUE;
2736 Double_t nsigmatofPi=
fPidResponse->NumberOfSigmasTOF(esdt,AliPID::kPion);
2737 if(nsigmatofPi>-990. && (nsigmatofPi<-fnSigmaTOFPionLow || nsigmatofPi>
fnSigmaTOFPionHi)){
2740 Double_t nsigmatofK=
fPidResponse->NumberOfSigmasTOF(esdt,AliPID::kKaon);
2741 if(nsigmatofK>-990. && (nsigmatofK<-fnSigmaTOFKaonLow || nsigmatofK>
fnSigmaTOFKaonHi)){
2744 Double_t nsigmatofP=
fPidResponse->NumberOfSigmasTOF(esdt,AliPID::kProton);
2745 if(nsigmatofP>-990. && (nsigmatofP<-fnSigmaTOFProtonLow || nsigmatofP>
fnSigmaTOFProtonHi)){
2751 Double_t nsigmatpcPi=
fPidResponse->NumberOfSigmasTPC(esdt,AliPID::kPion);
2752 if(nsigmatpcPi>-990. && (nsigmatpcPi<-fnSigmaTPCPionLow || nsigmatpcPi>
fnSigmaTPCPionHi)){
2755 Double_t nsigmatpcK=
fPidResponse->NumberOfSigmasTPC(esdt,AliPID::kKaon);
2756 if(nsigmatpcK>-990. && (nsigmatpcK<-fnSigmaTPCKaonLow || nsigmatpcK>
fnSigmaTPCKaonHi)){
2759 Double_t nsigmatpcP=
fPidResponse->NumberOfSigmasTPC(esdt,AliPID::kProton);
2760 if(nsigmatpcP>-990. && (nsigmatpcP<-fnSigmaTPCProtonLow || nsigmatpcP>
fnSigmaTPCProtonHi)){
2776 vprimary->GetXYZ(pos);
2777 vprimary->GetCovarianceMatrix(cov);
2778 Double_t chi2toNDF = vprimary->GetChi2perNDF();
2779 Int_t ncontr=nindices;
2780 if(!strcmp(vprimary->GetTitle(),
"VertexerTracksWithContraint")) ncontr += 1;
2781 Double_t chi2=chi2toNDF*(2.*(Double_t)ncontr-3.);
2782 fV1 =
new AliESDVertex(pos,cov,chi2,ncontr,vprimary->GetName());
2783 fV1->SetTitle(vprimary->GetTitle());
2784 fV1->SetIndices(nindices,indices);
2786 if(indices) {
delete [] indices; indices=NULL; }
2808 Float_t centralityperc,
2809 Bool_t &okDisplaced,
2811 Bool_t &okFor3Prong)
const
2818 trk->RelateToVertex(
fV1,
fBzkG,kVeryBig);
2834 if(selectInfo) okDisplaced=kTRUE;
2848 if(selectInfo) okFor3Prong=kTRUE;
2855 if(selectInfo) okSoftPi=kTRUE;
2857 if(okDisplaced || okSoftPi || okFor3Prong)
return kTRUE;
2872 Double_t vertex[3]; esdV0->GetXYZ(vertex[0],vertex[1],vertex[2]);
2873 AliAODVertex *vertexV0 =
new AliAODVertex(vertex,esdV0->GetChi2V0(),AliAODVertex::kV0,2);
2876 Double_t xyz[3], pxpypz[3];
2878 esdV0->PxPyPz(pxpypz);
2879 Double_t cv[21];
for(
int i=0; i<21; i++) cv[i]=0;
2880 AliNeutralTrackParam *trackesdV0 =
new AliNeutralTrackParam(xyz,pxpypz,cv,0);
2885 Double_t d0z0[2],covd0z0[3];
2887 trackesdV0->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2888 Double_t dcaV0ToPrimVertex = TMath::Sqrt(covd0z0[0]);
2890 Double_t dcaV0DaughterToPrimVertex[2];
2891 AliExternalTrackParam *posV0track = (AliExternalTrackParam*)twoTrackArrayV0->UncheckedAt(0);
2892 AliExternalTrackParam *negV0track = (AliExternalTrackParam*)twoTrackArrayV0->UncheckedAt(1);
2893 if( !posV0track || !negV0track) {
2894 if(trackesdV0) {
delete trackesdV0; trackesdV0=NULL;}
2896 delete primVertexAOD;
2899 posV0track->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2902 dcaV0DaughterToPrimVertex[0] = TMath::Sqrt(covd0z0[0]);
2903 negV0track->PropagateToDCA(primVertexAOD,
fBzkG,kVeryBig,d0z0,covd0z0);
2906 dcaV0DaughterToPrimVertex[1] = TMath::Sqrt(covd0z0[0]);
2907 Double_t dcaV0Daughters = esdV0->GetDcaV0Daughters();
2908 Double_t pmom[3],nmom[3];
2909 esdV0->GetNPxPyPz(nmom[0],nmom[1],nmom[2]);
2910 esdV0->GetPPxPyPz(pmom[0],pmom[1],pmom[2]);
2912 AliAODv0 *aodV0 =
new AliAODv0(vertexV0,dcaV0Daughters,dcaV0ToPrimVertex,pmom,nmom,dcaV0DaughterToPrimVertex);
2913 aodV0->SetOnFlyStatus(esdV0->GetOnFlyStatus());
2916 delete primVertexAOD;
2925 const Double_t *par=extpar->GetParameter();
2926 const Double_t *cov=extpar->GetCovariance();
2927 Double_t alpha=extpar->GetAlpha();
2928 Double_t x=extpar->GetX();
2929 esdt->Set(x,alpha,par,cov);
2936 fMassDzero=TDatabasePDG::Instance()->GetParticle(421)->Mass();
2937 fMassDplus=TDatabasePDG::Instance()->GetParticle(411)->Mass();
2938 fMassDs=TDatabasePDG::Instance()->GetParticle(431)->Mass();
2939 fMassLambdaC=TDatabasePDG::Instance()->GetParticle(4122)->Mass();
2940 fMassDstar=TDatabasePDG::Instance()->GetParticle(413)->Mass();
2941 fMassJpsi=TDatabasePDG::Instance()->GetParticle(443)->Mass();
virtual Int_t IsSelected(TObject *obj, Int_t selectionLevel)
AliAODRecoDecay * fMassCalc4
for 3 prong
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
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 fUseTPCPIDOnlyIfNoTOF
switch use/not use TOF PID
AliRDHFCutsD0toKpi * fCutsD0toKpi
Track Filter for D* soft pion.
Bool_t fMixEvent
Like-sign triplets.
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
upper momentum limit to apply TPC PID
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.
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)
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
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
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
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
AliAODRecoDecayHF2Prong * Make2Prong(TObjArray *twoTrackArray1, AliVEvent *event, AliAODVertex *secVert, Double_t dcap1n1, Bool_t &okD0, Bool_t &okJPSI, Bool_t &okD0fromDstar)
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)
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
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 AddRefs(AliAODVertex *v, AliAODRecoDecayHF *rd, const AliVEvent *event, const TObjArray *trkArray) const
Double_t fnSigmaTOFPionLow
High cut value on n. of sigmas for pi TPC PID.