25 #include <TDatabasePDG.h>
28 #include "AliAODRecoDecay.h"
30 #include "AliAODEvent.h"
31 #include "AliVertexerTracks.h"
32 #include "AliExternalTrackParam.h"
33 #include "AliKFVertex.h"
34 #include "AliVVertex.h"
35 #include "AliESDVertex.h"
61 AliAODRecoDecay(vtx2,nprongs,charge,px,py,pz,d0),
75 for(
Int_t i=0; i<GetNProngs(); i++)
fd0err[i] = d0err[i];
80 AliAODRecoDecay(vtx2,nprongs,charge,d0),
94 for(
Int_t i=0; i<GetNProngs(); i++)
fd0err[i] = d0err[i];
101 AliAODRecoDecay(0x0,nprongs,charge,px,py,pz,d0),
117 AliAODVertex *vtx =
new AliAODVertex(vtx2);
118 SetOwnSecondaryVtx(vtx);
123 AliAODRecoDecay(source),
125 fEventPrimaryVtx(source.fEventPrimaryVtx),
126 fListOfCuts(source.fListOfCuts),
127 fNProngsHF(source.fNProngsHF),
130 fSelectionMap(source.fSelectionMap),
131 fIsFilled(source.fIsFilled)
138 if(source.GetNProngs()>0) {
153 if(&source ==
this)
return *
this;
155 AliAODRecoDecay::operator=(source);
169 if(source.GetNProngs()>0) {
203 AliKFParticle::SetField(bzkG);
204 AliKFParticle *vertexKF=0;
207 Int_t nt=0,ntcheck=0;
211 printf(
"AliAODRecoDecayHF::ApplyVertexingKF(): cannot apply because primary vertex is not found\n");
216 Double_t covmatrix[6]={0.,0.,0.,0.,0.,0.};
219 AliESDVertex primaryVtx2(pos,covmatrix,chi2,contr,
"Vertex");
223 copyKF=AliKFVertex(primaryVtx2);
224 nt=primaryVtx2.GetNContributors();
228 vertexKF =
new AliKFParticle();
229 for(
Int_t i= 0;i<nprongs;i++){
230 Int_t ipr=iprongs[i];
231 AliAODTrack *aodTrack = (AliAODTrack*)GetDaughter(ipr);
233 printf(
"AliAODRecoDecayHF::ApplyVertexingKF(): no daughters available\n");
234 delete vertexKF; vertexKF=NULL;
237 AliKFParticle daughterKF(*aodTrack,pdgs[i]);
238 vertexKF->AddDaughter(daughterKF);
240 if(topoCostraint && nt>0){
242 if(!aodTrack->GetUsedForPrimVtxFit())
continue;
243 copyKF -= daughterKF;
250 copyKF += (*vertexKF);
251 vertexKF->SetProductionVertex(copyKF);
256 vertexKF->SetMassConstraint(mass[0],mass[1]);
276 AliAODVertex *vtxAOD = aod->GetPrimaryVertex();
277 if(!vtxAOD)
return 0;
279 if(!title.Contains(
"VertexerTracks"))
return 0;
283 AliVertexerTracks *vertexer =
new AliVertexerTracks(aod->GetMagneticField());
285 Int_t ndg = GetNDaughters();
287 vertexer->SetITSMode();
288 vertexer->SetMinClusters(3);
289 vertexer->SetConstraintOff();
291 if(title.Contains(
"WithConstraint")) {
293 aod->GetDiamondCovXY(diamondcovxy);
294 Double_t pos[3]={aod->GetDiamondX(),aod->GetDiamondY(),0.};
295 Double_t cov[6]={diamondcovxy[0],diamondcovxy[1],diamondcovxy[2],0.,0.,10.*10.};
296 AliESDVertex *diamond =
new AliESDVertex(pos,cov,1.,1);
297 vertexer->SetVtxStart(diamond);
298 delete diamond; diamond=NULL;
301 Int_t skipped[10];
for(
Int_t i=0;i<10;i++) skipped[i]=-1;
302 Int_t nTrksToSkip=0,id;
304 for(
Int_t i=0; i<ndg; i++) {
305 t = (AliAODTrack*)GetDaughter(i);
306 id = (
Int_t)t->GetID();
308 skipped[nTrksToSkip++] = id;
311 vertexer->SetSkipTracks(nTrksToSkip,skipped);
312 AliESDVertex *vtxESDNew = vertexer->FindPrimaryVertex(aod);
314 delete vertexer; vertexer=NULL;
316 if(!vtxESDNew)
return 0;
317 if(vtxESDNew->GetNContributors()<=0) {
318 delete vtxESDNew; vtxESDNew=NULL;
324 vtxESDNew->GetXYZ(pos);
325 vtxESDNew->GetCovMatrix(cov);
326 chi2perNDF = vtxESDNew->GetChi2toNDF();
327 delete vtxESDNew; vtxESDNew=NULL;
329 AliAODVertex *vtxAODNew =
new AliAODVertex(pos,cov,chi2perNDF);
341 for(
Int_t i=0; i<GetNDaughters(); i++) {
342 AliAODTrack *t = (AliAODTrack*)GetDaughter(i);
343 AliExternalTrackParam etp; etp.CopyFromVTrack(t);
344 if(etp.PropagateToDCA(vtxAODNew,aod->GetMagneticField(),3.,dz,covdz)) {
346 fd0err[i] = TMath::Sqrt(covdz[0]);
362 if(misal==
"null")
return;
363 Double_t pard0rphiMC[3]={36.7,36.,1.25};
365 Double_t pard0zMC[3]={85.,130.,0.7};
369 pard0rphimisal[0]=37.;
370 pard0rphimisal[1]=37.5;
371 pard0rphimisal[2]=1.25;
376 else if(misal==
"resB") {
378 pard0rphimisal[0]=44.4;
379 pard0rphimisal[1]=37.5;
380 pard0rphimisal[2]=1.25;
381 pard0zmisal[0]=115.2;
385 else if(misal==
"resC") {
387 pard0rphimisal[0]=40.;
388 pard0rphimisal[1]=40.;
389 pard0rphimisal[2]=1.3;
394 else printf(
"AliAODRecoDecayHF::Misalign(): wrong misalign type specified \n");
397 AliAODVertex *evVtx=0x0,*secVtx=0x0;
398 Double_t evVtxPos[3]={-9999.,-9999.,-9999.},secVtxPos[3]={-9999.,9999.,9999.};
402 evVtx->GetXYZ(evVtxPos);
404 secVtx=(AliAODVertex*)GetSecondaryVtx();
405 secVtx->GetXYZ(secVtxPos);
407 TVector3 v2v1(secVtxPos[0]-evVtxPos[0],secVtxPos[1]-evVtxPos[1],0.);
409 Double_t sigmarphinull,sigmarphimisal,sigmarphiadd;
410 Double_t sigmaznull,sigmazmisal,sigmazadd;
411 Double_t deltad0rphi[10],deltad0z[10];
414 for(
Int_t i=0; i<fNProngs; i++) {
415 sigmarphinull = pard0rphiMC[0]+pard0rphiMC[1]/TMath::Power(PtProng(i),pard0rphiMC[2]);
416 sigmarphimisal = pard0rphimisal[0]+pard0rphimisal[1]/TMath::Power(PtProng(i),pard0rphimisal[2]);
417 if(sigmarphimisal>sigmarphinull) {
418 sigmarphiadd = TMath::Sqrt(sigmarphimisal*sigmarphimisal-
419 sigmarphinull*sigmarphinull);
420 deltad0rphi[i] =
gRandom->Gaus(0.,sigmarphiadd);
425 sigmaznull = pard0zMC[0]+pard0zMC[1]/TMath::Power(PtProng(i),pard0zMC[2]);
426 sigmazmisal = pard0zmisal[0]+pard0zmisal[1]/TMath::Power(PtProng(i),pard0zmisal[2]);
427 if(sigmazmisal>sigmaznull) {
428 sigmazadd = TMath::Sqrt(sigmazmisal*sigmazmisal-
429 sigmaznull*sigmaznull);
430 deltad0z[i] =
gRandom->Gaus(0.,sigmazadd);
435 TVector3 pxy(fPx[i],fPy[i],0.);
436 TVector3 pxycrossv2v1=pxy.Cross(v2v1);
437 if( pxycrossv2v1.Z()*fd0[i] > 0 ) {
438 secVtxPos[0]+=1.e-4*deltad0rphi[i]*(-fPy[i])/PtProng(i);
439 secVtxPos[1]+=1.e-4*deltad0rphi[i]*(+fPx[i])/PtProng(i);
441 secVtxPos[0]+=1.e-4*deltad0rphi[i]*(+fPy[i])/PtProng(i);
442 secVtxPos[1]+=1.e-4*deltad0rphi[i]*(-fPx[i])/PtProng(i);
446 fd0[i] += 1.e-4*deltad0rphi[i];
448 secVtxPos[2]+=0.5e-4*deltad0z[i];
450 secVtx->SetX(secVtxPos[0]);
451 secVtx->SetY(secVtxPos[1]);
452 secVtx->SetZ(secVtxPos[2]);
463 AliAODVertex* secVtx=(AliAODVertex*)GetSecondaryVtx();
466 AliAODTrack *trk = (AliAODTrack*)GetDaughter(ip);
467 AliExternalTrackParam etp;
468 etp.CopyFromVTrack(trk);
470 etp.PropagateToDCA(secVtx,magf,3.,dz,dtrkcovar);
473 Double_t sinThetap=(pxt*Py()-pyt*Px())/(Pt()*PtProng(ip));
474 diff=d0meas-lxy*sinThetap;
475 errdiff=TMath::Sqrt(errd0meas*errd0meas+errlxy2*sinThetap*sinThetap);
481 AliAODRecoDecay::DeleteRecoD();
Double_t * fd0err
error on prongs rphi impact param [cm]
AliAODRecoDecayHF & operator=(const AliAODRecoDecayHF &source)
void Getd0MeasMinusExpProng(Int_t ip, Double_t magf, Double_t &d0diff, Double_t &errd0diff) const
virtual ~AliAODRecoDecayHF()
AliAODVertex * fOwnPrimaryVtx
TPC+ITS tracks not passing the StandardCuts2010 with loose DCA.
Int_t fIsFilled
used to store outcome of selection in AliAnalysisVertexingHF
virtual void DeleteRecoD()
void RecalculateImpPars(AliAODVertex *vtxAODNew, AliAODEvent *aod)
AliAODVertex * GetOwnPrimaryVtx() const
Double_t Getd0errProng(Int_t ip) const
prongs
UShort_t * fProngID
track ID of daughters
AliAODVertex * RemoveDaughtersFromPrimaryVtx(AliAODEvent *aod)
void Misalign(TString misal="null")
misalign
Double_t DecayLengthXY() const
ClassImp(AliAnalysisTaskDeltaPt) AliAnalysisTaskDeltaPt
TRef fEventPrimaryVtx
primary vertex for this candidate
Int_t fNProngsHF
ref to the list of analysis cuts
TRef fListOfCuts
ref to primary vertex of the event
AliAODVertex * GetPrimaryVtx() const
AliKFParticle * ApplyVertexingKF(Int_t *iprongs, Int_t nprongs, Int_t *pdgs, Bool_t topoCostraint, Double_t bzkG, Double_t *mass) const
vertexing KF:
void SetIsFilled(Int_t filled)