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"
58 Double_t *px,Double_t *py,Double_t *pz,
59 Double_t *d0,Double_t *d0err) :
60 AliAODRecoDecay(vtx2,nprongs,charge,px,py,pz,d0),
72 fd0err =
new Double_t[GetNProngs()];
73 for(Int_t i=0; i<GetNProngs(); i++)
fd0err[i] = d0err[i];
77 Double_t *d0,Double_t *d0err) :
78 AliAODRecoDecay(vtx2,nprongs,charge,d0),
90 fd0err =
new Double_t[GetNProngs()];
91 for(Int_t i=0; i<GetNProngs(); i++)
fd0err[i] = d0err[i];
95 Int_t nprongs,Short_t
charge,
96 Double_t *px,Double_t *py,Double_t *pz,
98 AliAODRecoDecay(0x0,nprongs,charge,px,py,pz,d0),
113 AliAODVertex *vtx =
new AliAODVertex(vtx2);
114 SetOwnSecondaryVtx(vtx);
119 AliAODRecoDecay(source),
121 fEventPrimaryVtx(source.fEventPrimaryVtx),
122 fListOfCuts(source.fListOfCuts),
125 fSelectionMap(source.fSelectionMap),
126 fIsFilled(source.fIsFilled)
133 if(source.GetNProngs()>0) {
134 fd0err =
new Double_t[GetNProngs()];
135 memcpy(
fd0err,source.
fd0err,GetNProngs()*
sizeof(Double_t));
137 fProngID =
new UShort_t[GetNProngs()];
148 if(&source ==
this)
return *
this;
150 AliAODRecoDecay::operator=(source);
162 if(source.GetNProngs()>0) {
165 fd0err =
new Double_t[GetNProngs()];
166 memcpy(
fd0err,source.
fd0err,GetNProngs()*
sizeof(Double_t));
170 fProngID =
new UShort_t[GetNProngs()];
196 AliKFParticle::SetField(bzkG);
197 AliKFParticle *vertexKF=0;
200 Int_t nt=0,ntcheck=0;
202 Double_t pos[3]={0.,0.,0.};
204 printf(
"AliAODRecoDecayHF::ApplyVertexingKF(): cannot apply because primary vertex is not found\n");
209 Double_t covmatrix[6]={0.,0.,0.,0.,0.,0.};
212 AliESDVertex primaryVtx2(pos,covmatrix,chi2,contr,
"Vertex");
216 copyKF=AliKFVertex(primaryVtx2);
217 nt=primaryVtx2.GetNContributors();
221 vertexKF =
new AliKFParticle();
222 for(Int_t i= 0;i<nprongs;i++){
223 Int_t ipr=iprongs[i];
224 AliAODTrack *aodTrack = (AliAODTrack*)GetDaughter(ipr);
226 printf(
"AliAODRecoDecayHF::ApplyVertexingKF(): no daughters available\n");
227 delete vertexKF; vertexKF=NULL;
230 AliKFParticle daughterKF(*aodTrack,pdgs[i]);
231 vertexKF->AddDaughter(daughterKF);
233 if(topoCostraint && nt>0){
235 if(!aodTrack->GetUsedForPrimVtxFit())
continue;
236 copyKF -= daughterKF;
243 copyKF += (*vertexKF);
244 vertexKF->SetProductionVertex(copyKF);
249 vertexKF->SetMassConstraint(mass[0],mass[1]);
269 AliAODVertex *vtxAOD = aod->GetPrimaryVertex();
270 if(!vtxAOD)
return 0;
271 TString
title=vtxAOD->GetTitle();
272 if(!title.Contains(
"VertexerTracks"))
return 0;
276 AliVertexerTracks *vertexer =
new AliVertexerTracks(aod->GetMagneticField());
278 Int_t ndg = GetNDaughters();
280 vertexer->SetITSMode();
281 vertexer->SetMinClusters(3);
282 vertexer->SetConstraintOff();
284 if(title.Contains(
"WithConstraint")) {
285 Float_t diamondcovxy[3];
286 aod->GetDiamondCovXY(diamondcovxy);
287 Double_t pos[3]={aod->GetDiamondX(),aod->GetDiamondY(),0.};
288 Double_t cov[6]={diamondcovxy[0],diamondcovxy[1],diamondcovxy[2],0.,0.,10.*10.};
289 AliESDVertex *diamond =
new AliESDVertex(pos,cov,1.,1);
290 vertexer->SetVtxStart(diamond);
291 delete diamond; diamond=NULL;
294 Int_t skipped[10];
for(Int_t i=0;i<10;i++) skipped[i]=-1;
295 Int_t nTrksToSkip=0,id;
297 for(Int_t i=0; i<ndg; i++) {
298 t = (AliAODTrack*)GetDaughter(i);
299 id = (Int_t)t->GetID();
301 skipped[nTrksToSkip++] = id;
304 vertexer->SetSkipTracks(nTrksToSkip,skipped);
305 AliESDVertex *vtxESDNew = vertexer->FindPrimaryVertex(aod);
307 delete vertexer; vertexer=NULL;
309 if(!vtxESDNew)
return 0;
310 if(vtxESDNew->GetNContributors()<=0) {
311 delete vtxESDNew; vtxESDNew=NULL;
316 Double_t pos[3],cov[6],chi2perNDF;
317 vtxESDNew->GetXYZ(pos);
318 vtxESDNew->GetCovMatrix(cov);
319 chi2perNDF = vtxESDNew->GetChi2toNDF();
320 delete vtxESDNew; vtxESDNew=NULL;
322 AliAODVertex *vtxAODNew =
new AliAODVertex(pos,cov,chi2perNDF);
333 Double_t dz[2],covdz[3];
334 for(Int_t i=0; i<GetNDaughters(); i++) {
335 AliAODTrack *t = (AliAODTrack*)GetDaughter(i);
336 AliExternalTrackParam etp; etp.CopyFromVTrack(t);
337 if(etp.PropagateToDCA(vtxAODNew,aod->GetMagneticField(),3.,dz,covdz)) {
339 fd0err[i] = TMath::Sqrt(covdz[0]);
355 if(misal==
"null")
return;
356 Double_t pard0rphiMC[3]={36.7,36.,1.25};
357 Double_t pard0rphimisal[3]={0,0,0};
358 Double_t pard0zMC[3]={85.,130.,0.7};
359 Double_t pard0zmisal[3]={0,0,0};
362 pard0rphimisal[0]=37.;
363 pard0rphimisal[1]=37.5;
364 pard0rphimisal[2]=1.25;
369 else if(misal==
"resB") {
371 pard0rphimisal[0]=44.4;
372 pard0rphimisal[1]=37.5;
373 pard0rphimisal[2]=1.25;
374 pard0zmisal[0]=115.2;
378 else if(misal==
"resC") {
380 pard0rphimisal[0]=40.;
381 pard0rphimisal[1]=40.;
382 pard0rphimisal[2]=1.3;
387 else printf(
"AliAODRecoDecayHF::Misalign(): wrong misalign type specified \n");
390 AliAODVertex *evVtx=0x0,*secVtx=0x0;
391 Double_t evVtxPos[3]={-9999.,-9999.,-9999.},secVtxPos[3]={-9999.,9999.,9999.};
395 evVtx->GetXYZ(evVtxPos);
397 secVtx=(AliAODVertex*)GetSecondaryVtx();
398 secVtx->GetXYZ(secVtxPos);
400 TVector3 v2v1(secVtxPos[0]-evVtxPos[0],secVtxPos[1]-evVtxPos[1],0.);
402 Double_t sigmarphinull,sigmarphimisal,sigmarphiadd;
403 Double_t sigmaznull,sigmazmisal,sigmazadd;
404 Double_t deltad0rphi[10],deltad0z[10];
407 for(Int_t i=0; i<fNProngs; i++) {
408 sigmarphinull = pard0rphiMC[0]+pard0rphiMC[1]/TMath::Power(PtProng(i),pard0rphiMC[2]);
409 sigmarphimisal = pard0rphimisal[0]+pard0rphimisal[1]/TMath::Power(PtProng(i),pard0rphimisal[2]);
410 if(sigmarphimisal>sigmarphinull) {
411 sigmarphiadd = TMath::Sqrt(sigmarphimisal*sigmarphimisal-
412 sigmarphinull*sigmarphinull);
413 deltad0rphi[i] =
gRandom->Gaus(0.,sigmarphiadd);
418 sigmaznull = pard0zMC[0]+pard0zMC[1]/TMath::Power(PtProng(i),pard0zMC[2]);
419 sigmazmisal = pard0zmisal[0]+pard0zmisal[1]/TMath::Power(PtProng(i),pard0zmisal[2]);
420 if(sigmazmisal>sigmaznull) {
421 sigmazadd = TMath::Sqrt(sigmazmisal*sigmazmisal-
422 sigmaznull*sigmaznull);
423 deltad0z[i] =
gRandom->Gaus(0.,sigmazadd);
428 TVector3 pxy(fPx[i],fPy[i],0.);
429 TVector3 pxycrossv2v1=pxy.Cross(v2v1);
430 if( pxycrossv2v1.Z()*fd0[i] > 0 ) {
431 secVtxPos[0]+=1.e-4*deltad0rphi[i]*(-fPy[i])/PtProng(i);
432 secVtxPos[1]+=1.e-4*deltad0rphi[i]*(+fPx[i])/PtProng(i);
434 secVtxPos[0]+=1.e-4*deltad0rphi[i]*(+fPy[i])/PtProng(i);
435 secVtxPos[1]+=1.e-4*deltad0rphi[i]*(-fPx[i])/PtProng(i);
439 fd0[i] += 1.e-4*deltad0rphi[i];
441 secVtxPos[2]+=0.5e-4*deltad0z[i];
443 secVtx->SetX(secVtxPos[0]);
444 secVtx->SetY(secVtxPos[1]);
445 secVtx->SetZ(secVtxPos[2]);
453 Double_t d0meas=Getd0Prong(ip);
456 AliAODVertex* secVtx=(AliAODVertex*)GetSecondaryVtx();
457 Double_t errlxy2=secVtx->Error2DistanceXYToVertex(
GetPrimaryVtx());
459 AliAODTrack *trk = (AliAODTrack*)GetDaughter(ip);
460 AliExternalTrackParam etp;
461 etp.CopyFromVTrack(trk);
462 Double_t dz[2],dtrkcovar[3];
463 etp.PropagateToDCA(secVtx,magf,3.,dz,dtrkcovar);
464 Double_t pxt=etp.Px();
465 Double_t pyt=etp.Py();
466 Double_t sinThetap=(pxt*Py()-pyt*Px())/(Pt()*PtProng(ip));
467 diff=d0meas-lxy*sinThetap;
468 errdiff=TMath::Sqrt(errd0meas*errd0meas+errlxy2*sinThetap*sinThetap);
474 AliAODRecoDecay::DeleteRecoD();
Double_t * fd0err
error on prongs rphi impact param [cm]
ClassImp(AliAnalysisTaskTriggerRates) AliAnalysisTaskTriggerRates
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
TRef fEventPrimaryVtx
primary vertex for this candidate
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)