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"
57 Double_t *px,Double_t *py,Double_t *pz,
58 Double_t *d0,Double_t *d0err) :
59 AliAODRecoDecay(vtx2,nprongs,charge,px,py,pz,d0),
70 fd0err =
new Double_t[GetNProngs()];
71 for(Int_t i=0; i<GetNProngs(); i++)
fd0err[i] = d0err[i];
75 Double_t *d0,Double_t *d0err) :
76 AliAODRecoDecay(vtx2,nprongs,charge,d0),
87 fd0err =
new Double_t[GetNProngs()];
88 for(Int_t i=0; i<GetNProngs(); i++)
fd0err[i] = d0err[i];
92 Int_t nprongs,Short_t
charge,
93 Double_t *px,Double_t *py,Double_t *pz,
95 AliAODRecoDecay(0x0,nprongs,charge,px,py,pz,d0),
109 AliAODVertex *vtx =
new AliAODVertex(vtx2);
110 SetOwnSecondaryVtx(vtx);
115 AliAODRecoDecay(source),
117 fEventPrimaryVtx(source.fEventPrimaryVtx),
118 fListOfCuts(source.fListOfCuts),
121 fSelectionMap(source.fSelectionMap)
128 if(source.GetNProngs()>0) {
129 fd0err =
new Double_t[GetNProngs()];
130 memcpy(
fd0err,source.
fd0err,GetNProngs()*
sizeof(Double_t));
132 fProngID =
new UShort_t[GetNProngs()];
143 if(&source ==
this)
return *
this;
145 AliAODRecoDecay::operator=(source);
156 if(source.GetNProngs()>0) {
159 fd0err =
new Double_t[GetNProngs()];
160 memcpy(
fd0err,source.
fd0err,GetNProngs()*
sizeof(Double_t));
164 fProngID =
new UShort_t[GetNProngs()];
190 AliKFParticle::SetField(bzkG);
191 AliKFParticle *vertexKF=0;
194 Int_t nt=0,ntcheck=0;
196 Double_t pos[3]={0.,0.,0.};
198 printf(
"AliAODRecoDecayHF::ApplyVertexingKF(): cannot apply because primary vertex is not found\n");
203 Double_t covmatrix[6]={0.,0.,0.,0.,0.,0.};
206 AliESDVertex primaryVtx2(pos,covmatrix,chi2,contr,
"Vertex");
210 copyKF=AliKFVertex(primaryVtx2);
211 nt=primaryVtx2.GetNContributors();
215 vertexKF =
new AliKFParticle();
216 for(Int_t i= 0;i<nprongs;i++){
217 Int_t ipr=iprongs[i];
218 AliAODTrack *aodTrack = (AliAODTrack*)GetDaughter(ipr);
220 printf(
"AliAODRecoDecayHF::ApplyVertexingKF(): no daughters available\n");
221 delete vertexKF; vertexKF=NULL;
224 AliKFParticle daughterKF(*aodTrack,pdgs[i]);
225 vertexKF->AddDaughter(daughterKF);
227 if(topoCostraint && nt>0){
229 if(!aodTrack->GetUsedForPrimVtxFit())
continue;
230 copyKF -= daughterKF;
237 copyKF += (*vertexKF);
238 vertexKF->SetProductionVertex(copyKF);
243 vertexKF->SetMassConstraint(mass[0],mass[1]);
263 AliAODVertex *vtxAOD = aod->GetPrimaryVertex();
264 if(!vtxAOD)
return 0;
265 TString
title=vtxAOD->GetTitle();
266 if(!title.Contains(
"VertexerTracks"))
return 0;
270 AliVertexerTracks *vertexer =
new AliVertexerTracks(aod->GetMagneticField());
272 Int_t ndg = GetNDaughters();
274 vertexer->SetITSMode();
275 vertexer->SetMinClusters(3);
276 vertexer->SetConstraintOff();
278 if(title.Contains(
"WithConstraint")) {
279 Float_t diamondcovxy[3];
280 aod->GetDiamondCovXY(diamondcovxy);
281 Double_t pos[3]={aod->GetDiamondX(),aod->GetDiamondY(),0.};
282 Double_t cov[6]={diamondcovxy[0],diamondcovxy[1],diamondcovxy[2],0.,0.,10.*10.};
283 AliESDVertex *diamond =
new AliESDVertex(pos,cov,1.,1);
284 vertexer->SetVtxStart(diamond);
285 delete diamond; diamond=NULL;
288 Int_t skipped[10];
for(Int_t i=0;i<10;i++) skipped[i]=-1;
289 Int_t nTrksToSkip=0,id;
291 for(Int_t i=0; i<ndg; i++) {
292 t = (AliAODTrack*)GetDaughter(i);
293 id = (Int_t)t->GetID();
295 skipped[nTrksToSkip++] = id;
298 vertexer->SetSkipTracks(nTrksToSkip,skipped);
299 AliESDVertex *vtxESDNew = vertexer->FindPrimaryVertex(aod);
301 delete vertexer; vertexer=NULL;
303 if(!vtxESDNew)
return 0;
304 if(vtxESDNew->GetNContributors()<=0) {
305 delete vtxESDNew; vtxESDNew=NULL;
310 Double_t pos[3],cov[6],chi2perNDF;
311 vtxESDNew->GetXYZ(pos);
312 vtxESDNew->GetCovMatrix(cov);
313 chi2perNDF = vtxESDNew->GetChi2toNDF();
314 delete vtxESDNew; vtxESDNew=NULL;
316 AliAODVertex *vtxAODNew =
new AliAODVertex(pos,cov,chi2perNDF);
327 Double_t dz[2],covdz[3];
328 for(Int_t i=0; i<GetNDaughters(); i++) {
329 AliAODTrack *t = (AliAODTrack*)GetDaughter(i);
330 AliExternalTrackParam etp; etp.CopyFromVTrack(t);
331 if(etp.PropagateToDCA(vtxAODNew,aod->GetMagneticField(),3.,dz,covdz)) {
333 fd0err[i] = TMath::Sqrt(covdz[0]);
349 if(misal==
"null")
return;
350 Double_t pard0rphiMC[3]={36.7,36.,1.25};
351 Double_t pard0rphimisal[3]={0,0,0};
352 Double_t pard0zMC[3]={85.,130.,0.7};
353 Double_t pard0zmisal[3]={0,0,0};
356 pard0rphimisal[0]=37.;
357 pard0rphimisal[1]=37.5;
358 pard0rphimisal[2]=1.25;
363 else if(misal==
"resB") {
365 pard0rphimisal[0]=44.4;
366 pard0rphimisal[1]=37.5;
367 pard0rphimisal[2]=1.25;
368 pard0zmisal[0]=115.2;
372 else if(misal==
"resC") {
374 pard0rphimisal[0]=40.;
375 pard0rphimisal[1]=40.;
376 pard0rphimisal[2]=1.3;
381 else printf(
"AliAODRecoDecayHF::Misalign(): wrong misalign type specified \n");
384 AliAODVertex *evVtx=0x0,*secVtx=0x0;
385 Double_t evVtxPos[3]={-9999.,-9999.,-9999.},secVtxPos[3]={-9999.,9999.,9999.};
389 evVtx->GetXYZ(evVtxPos);
391 secVtx=(AliAODVertex*)GetSecondaryVtx();
392 secVtx->GetXYZ(secVtxPos);
394 TVector3 v2v1(secVtxPos[0]-evVtxPos[0],secVtxPos[1]-evVtxPos[1],0.);
396 Double_t sigmarphinull,sigmarphimisal,sigmarphiadd;
397 Double_t sigmaznull,sigmazmisal,sigmazadd;
398 Double_t deltad0rphi[10],deltad0z[10];
401 for(Int_t i=0; i<fNProngs; i++) {
402 sigmarphinull = pard0rphiMC[0]+pard0rphiMC[1]/TMath::Power(PtProng(i),pard0rphiMC[2]);
403 sigmarphimisal = pard0rphimisal[0]+pard0rphimisal[1]/TMath::Power(PtProng(i),pard0rphimisal[2]);
404 if(sigmarphimisal>sigmarphinull) {
405 sigmarphiadd = TMath::Sqrt(sigmarphimisal*sigmarphimisal-
406 sigmarphinull*sigmarphinull);
407 deltad0rphi[i] =
gRandom->Gaus(0.,sigmarphiadd);
412 sigmaznull = pard0zMC[0]+pard0zMC[1]/TMath::Power(PtProng(i),pard0zMC[2]);
413 sigmazmisal = pard0zmisal[0]+pard0zmisal[1]/TMath::Power(PtProng(i),pard0zmisal[2]);
414 if(sigmazmisal>sigmaznull) {
415 sigmazadd = TMath::Sqrt(sigmazmisal*sigmazmisal-
416 sigmaznull*sigmaznull);
417 deltad0z[i] =
gRandom->Gaus(0.,sigmazadd);
422 TVector3 pxy(fPx[i],fPy[i],0.);
423 TVector3 pxycrossv2v1=pxy.Cross(v2v1);
424 if( pxycrossv2v1.Z()*fd0[i] > 0 ) {
425 secVtxPos[0]+=1.e-4*deltad0rphi[i]*(-fPy[i])/PtProng(i);
426 secVtxPos[1]+=1.e-4*deltad0rphi[i]*(+fPx[i])/PtProng(i);
428 secVtxPos[0]+=1.e-4*deltad0rphi[i]*(+fPy[i])/PtProng(i);
429 secVtxPos[1]+=1.e-4*deltad0rphi[i]*(-fPx[i])/PtProng(i);
433 fd0[i] += 1.e-4*deltad0rphi[i];
435 secVtxPos[2]+=0.5e-4*deltad0z[i];
437 secVtx->SetX(secVtxPos[0]);
438 secVtx->SetY(secVtxPos[1]);
439 secVtx->SetZ(secVtxPos[2]);
Double_t * fd0err
error on prongs rphi impact param [cm]
ClassImp(AliAnalysisTaskTriggerRates) AliAnalysisTaskTriggerRates
AliAODRecoDecayHF & operator=(const AliAODRecoDecayHF &source)
virtual ~AliAODRecoDecayHF()
AliAODVertex * fOwnPrimaryVtx
TPC+ITS tracks not passing the StandardCuts2010 with loose DCA.
void RecalculateImpPars(AliAODVertex *vtxAODNew, AliAODEvent *aod)
AliAODVertex * GetOwnPrimaryVtx() const
UShort_t * fProngID
track ID of daughters
AliAODVertex * RemoveDaughtersFromPrimaryVtx(AliAODEvent *aod)
void Misalign(TString misal="null")
misalign
TRef fEventPrimaryVtx
primary vertex for this candidate
TRef fListOfCuts
ref to primary vertex of the event
AliKFParticle * ApplyVertexingKF(Int_t *iprongs, Int_t nprongs, Int_t *pdgs, Bool_t topoCostraint, Double_t bzkG, Double_t *mass) const
vertexing KF: