29 #include <TDatabasePDG.h> 30 #include <TParticlePDG.h> 49 fEffMass(TDatabasePDG::Instance()->GetParticle(kK0Short)->Mass()),
71 for (Int_t i=0; i<3; i++) {
77 for (Int_t i=0; i<6; i++) {
81 for (Int_t i=0;i<6;i++){fClusters[0][i]=0; fClusters[1][i]=0;}
82 fNormDCAPrim[0]=fNormDCAPrim[1]=0;
83 for (Int_t i=0;i<3;i++){fAngle[i]=0;}
84 for (Int_t i=0;i<4;i++){fCausality[i]=0;}
91 fEffMass(v0.fEffMass),
92 fDcaV0Daughters(v0.fDcaV0Daughters),
95 fDistSigma(v0.fDistSigma),
96 fChi2Before(v0.fChi2Before),
97 fChi2After(v0.fChi2After),
98 fPointAngleFi(v0.fPointAngleFi),
99 fPointAngleTh(v0.fPointAngleTh),
100 fPointAngle(v0.fPointAngle),
101 fPdgCode(v0.fPdgCode),
105 fNBefore(v0.fNBefore),
107 fOnFlyStatus(v0.fOnFlyStatus)
114 Bool_t swp = cN>0 && (cN != cP);
122 for (
int i=0; i<3; i++) {
127 for (
int i=0; i<6; i++) {
131 for (Int_t i=0; i<2; i++) {
135 for (Int_t i=0;i<6;i++){
141 for (Int_t i=0;i<6;i++){
146 for (Int_t i=0;i<3;i++){
158 fEffMass(TDatabasePDG::Instance()->GetParticle(kK0Short)->Mass()),
182 Bool_t swp = cN>0 && (cN != cP);
190 for (Int_t i=0; i<6; i++) {
195 Double_t alpha=
fParamN.
GetAlpha(), cs=TMath::Cos(alpha), sn=TMath::Sin(alpha);
198 Double_t px1=tmp[0], py1=tmp[1], pz1=tmp[2];
200 Double_t x1=tmp[0], y1=tmp[1], z1=tmp[2];
201 const Double_t ss=0.0005*0.0005;
207 Double_t px2=tmp[0], py2=tmp[1], pz2=tmp[2];
209 Double_t x2=tmp[0], y2=tmp[1], z2=tmp[2];
213 Double_t wx1=sx2/(sx1+sx2), wx2=1.- wx1;
214 Double_t wy1=sy2/(sy1+sy2), wy2=1.- wy1;
215 Double_t wz1=sz2/(sz1+sz2), wz2=1.- wz1;
216 fPos[0]=wx1*x1 + wx2*x2;
fPos[1]=wy1*y1 + wy2*y2;
fPos[2]=wz1*z1 + wz2*z2;
224 for (Int_t i=0;i<3;i++){
fAngle[i]=0;}
236 Double_t sp=TMath::Sin(phi);
237 Double_t cp=TMath::Cos(phi);
240 Double_t cl=1/TMath::Sqrt(1.+ tgl*tgl);
244 g2p(0,0)= cp*cl; g2p(0,1)= sp*cl; g2p(0,2)=sl;
245 g2p(1,0)=-sp; g2p(1,1)= cp; g2p(1,2)=0.;
246 g2p(2,0)=-sl*cp; g2p(2,1)=-sl*sp; g2p(2,2)=cl;
249 Double_t c=TMath::Cos(alpha), s=TMath::Sin(alpha);
251 l2g(0,0)= c; l2g(0,1)=-s; l2g(0,2)= 0;
252 l2g(1,0)= s; l2g(1,1)= c; l2g(1,2)= 0;
253 l2g(2,0)= 0; l2g(2,1)= 0; l2g(2,2)= 1;
257 cvl(0,0)=0; cvl(0,1)=0; cvl(0,2)=0;
258 cvl(1,0)=0; cvl(1,1)=sy2; cvl(1,2)=syz;
259 cvl(2,0)=0; cvl(2,1)=syz; cvl(2,2)=sz2;
261 TMatrixD l2p(g2p, TMatrixD::kMult, l2g);
263 cvp=l2p*cvl*TMatrixD(TMatrixD::kTransposed,l2p);
265 Double_t det=cvp(1,1)*cvp(2,2) - cvp(1,2)*cvp(2,1);
266 if (TMath::Abs(det)<
kAlmost0)
return kFALSE;
268 const Double_t m=100*100;
269 const Double_t eps=1/m;
271 u(0,0)=eps; u(0,1)=0; u(0,2)=0;
272 u(1,0)=0; u(1,1)= cvp(2,2)/det; u(1,2)=-cvp(2,1)/det;
273 u(2,0)=0; u(2,1)=-cvp(1,2)/det; u(2,2)= cvp(1,1)/det;
275 w=TMatrixD(TMatrixD::kTransposed,g2p)*u*g2p;
293 for (Int_t i=0; i<3; i++)
fPos[i]=0.5*(r1[i]+r2[i]);
306 TMatrixD cv(w1); cv+=w2;
308 if (!cv.IsValid())
return fStatus;
316 TMatrixD cw1(cv,TMatrixD::kMult,w1);
317 for (Int_t i=0; i<3; i++) {
319 for (Int_t j=0; j<3; j++)
fPos[i] += cw1(i,j)*(r1[j] - r2[j]);
324 Double_t res1[3]={r1[0]-
fPos[0],r1[1]-fPos[1],r1[2]-fPos[2]};
325 Double_t res2[3]={r2[0]-fPos[0],r2[1]-fPos[1],r2[2]-fPos[2]};
326 for (Int_t i=0; i<3; i++)
327 for (Int_t j=0; j<3; j++)
328 fChi2V0 += res1[i]*res1[j]*w1(i,j) + res2[i]*res2[j]*w2(i,j);
342 if(
this==&v0)
return *
this;
364 for (
int i=0; i<3; i++) {
369 for (
int i=0; i<6; i++) {
372 for (Int_t i=0; i<2; i++) {
375 for (Int_t i=0;i<6;i++){
379 for (Int_t i=0;i<3;i++){
393 if(
this==&obj)
return;
425 Double_t mass = TDatabasePDG::Instance()->GetParticle(pdg)->Mass();
426 return TMath::Sqrt(mass*mass+
P()*
P());
433 return 0.5*TMath::Log((
E(pdg)+
Pz())/(
E(pdg)-
Pz()+1.e-13));
457 TVector3 momTot(
Px(),
Py(),
Pz());
459 Double_t lQlNeg = momNeg.Dot(momTot)/momTot.Mag();
460 Double_t lQlPos = momPos.Dot(momTot)/momTot.Mag();
463 return (lQlPos - lQlNeg)/(lQlPos + lQlNeg);
471 TVector3 momTot(
Px(),
Py(),
Pz());
473 return momNeg.Perp(momTot);
483 Double_t piMass=TDatabasePDG::Instance()->GetParticle(kPiPlus)->Mass();
485 Double_t prMass=TDatabasePDG::Instance()->GetParticle(kProton)->Mass();
487 Double_t k0Mass=TDatabasePDG::Instance()->GetParticle(kK0Short)->Mass();
489 Double_t l0Mass=TDatabasePDG::Instance()->GetParticle(kLambda0)->Mass();
491 Double_t nmass=piMass, pmass=piMass, mass=k0Mass, ps=0.206;
497 nmass=piMass; pmass=prMass; mass=l0Mass; ps=0.101;
break;
499 pmass=piMass; nmass=prMass; mass=l0Mass; ps=0.101;
break;
503 AliError(
"invalide PDG code ! Assuming K0s...");
511 Double_t en=TMath::Sqrt(nmass*nmass + pxn*pxn + pyn*pyn + pzn*pzn);
512 Double_t ep=TMath::Sqrt(pmass*pmass + pxp*pxp + pyp*pyp + pzp*pzp);
513 Double_t pxl=pxn+pxp, pyl=pyn+pyp, pzl=pzn+pzp;
514 Double_t pl=TMath::Sqrt(pxl*pxl + pyl*pyl + pzl*pzl);
516 fEffMass=TMath::Sqrt((en+ep)*(en+ep)-pl*pl);
518 Double_t beta=pl/(en+ep);
519 Double_t pln=(pxn*pxl + pyn*pyl + pzn*pzl)/pl;
520 Double_t plp=(pxp*pxl + pyp*pyl + pzp*pzl)/pl;
522 Double_t pt2=pxp*pxp + pyp*pyp + pzp*pzp - plp*plp;
524 Double_t a=(plp-pln)/(plp+pln);
525 a -= (pmass*pmass-nmass*nmass)/(mass*mass);
526 a = 0.25*beta*beta*mass*mass*a*a + pt2;
537 py=
fNmom[1]+fPmom[1];
538 pz=
fNmom[2]+fPmom[2];
556 Double_t py=
fNmom[1]+fPmom[1];
558 Double_t dz=(x0-x)*py - (y0-y)*px;
559 Double_t d=TMath::Sqrt(dz*dz/(px*px+py*py));
569 Double_t py=
fNmom[1]+fPmom[1];
570 Double_t pz=
fNmom[2]+fPmom[2];
572 Double_t dx=(y0-y)*pz - (z0-z)*py;
573 Double_t dy=(x0-x)*pz - (z0-z)*px;
574 Double_t dz=(x0-x)*py - (y0-y)*px;
575 Double_t d=TMath::Sqrt((dx*dx+dy*dy+dz*dz)/(px*px+py*py+pz*pz));
585 Double_t deltaPos[3];
586 deltaPos[0] =
fPos[0] - refPointX;
587 deltaPos[1] =
fPos[1] - refPointY;
588 deltaPos[2] =
fPos[2] - refPointZ;
590 Double_t momV02 = momV0[0]*momV0[0] + momV0[1]*momV0[1] + momV0[2]*momV0[2];
591 Double_t deltaPos2 = deltaPos[0]*deltaPos[0] + deltaPos[1]*deltaPos[1] + deltaPos[2]*deltaPos[2];
593 Double_t cosinePointingAngle = (deltaPos[0]*momV0[0] +
594 deltaPos[1]*momV0[1] +
595 deltaPos[2]*momV0[2] ) /
596 TMath::Sqrt(momV02 * deltaPos2);
598 return cosinePointingAngle;
606 for (Int_t i=0; i<6; ++i) cov[i] =
fPosCov[i];
617 return (sigmay>0) ? TMath::Sqrt(sigmay):100;
627 return (sigmaz>0) ? TMath::Sqrt(sigmaz):100;
644 return (sigmaD0>0)? TMath::Sqrt(sigmaD0):100;
660 sigmaAP0 += (cp[5]+cp[9])*(normp*normp)+(cm[5]+cm[9])*(normm*normm);
662 sigmaAP0 += 0.5*sigmaAP1*sigmaAP1;
663 return (sigmaAP0>0)? TMath::Sqrt(sigmaAP0):100;
701 Double_t sigmaMMAP = 0.5*(
GetSigmaAP0()+effectiveSigma);
712 Double_t sigmaMMD0 = 0.5*(
GetSigmaD0()+effectiveSigma);
723 Double_t sigmaAP = 0.007;
735 Double_t apNorm = TMath::Min(TMath::ACos(
fPointAngle)/sigmaAP,50.);
737 Double_t likelihood = 0;
740 likelihood = TMath::Exp(-0.5*apNorm*apNorm);
744 likelihood = (TMath::Exp(-0.5*apNorm*apNorm)+0.5* TMath::Exp(-0.25*apNorm*apNorm))/1.5;
748 likelihood = (TMath::Exp(-0.5*apNorm*apNorm)+0.5* TMath::Exp(-0.25*apNorm*apNorm)+0.25*TMath::Exp(-0.125*apNorm*apNorm))/1.75;
759 Double_t sigmaD = 0.03;
775 Double_t likelihood = 0;
778 likelihood = TMath::Exp(-2.*dNorm);
782 likelihood = (TMath::Exp(-2.*dNorm)+0.5* TMath::Exp(-dNorm))/1.5;
786 likelihood = (TMath::Exp(-2.*dNorm)+0.5* TMath::Exp(-dNorm)+0.25*TMath::Exp(-0.5*dNorm))/1.75;
800 Double_t likelihood = 0.5;
809 likelihood = TMath::Power((1.05-2*(0.8-TMath::Exp(-maxCausal))),4.);
812 likelihood = TMath::Power(1.05-(2*(0.8-TMath::Exp(-maxCausal))+(2*(0.8-TMath::Exp(-minCausal))))*0.5,4.);
834 for (Int_t i=0;i<6;i++)
fClusters[0][i] = clp[i];
835 for (Int_t i=0;i<6;i++)
fClusters[1][i] = clm[i];
842 const Double_t kpmass[5] = {TDatabasePDG::Instance()->GetParticle(kElectron)->Mass(),
843 TDatabasePDG::Instance()->GetParticle(kMuonMinus)->Mass(),
844 TDatabasePDG::Instance()->GetParticle(kPiPlus)->Mass(),
845 TDatabasePDG::Instance()->GetParticle(kKPlus)->Mass(),
846 TDatabasePDG::Instance()->GetParticle(kProton)->Mass()};
877 if(p1>4 || p2>4)
return -1;
891 Double_t pmom[3]={0}, nmom[3]={0};
894 Double_t e12 = m1*m1+pmom[0]*pmom[0]+pmom[1]*pmom[1]+pmom[2]*pmom[2];
895 Double_t e22 = m2*m2+nmom[0]*nmom[0]+nmom[1]*nmom[1]+nmom[2]*nmom[2];
896 Double_t cmass = TMath::Sqrt(TMath::Max(m1*m1+m2*m2
897 +2.*(TMath::Sqrt(e12*e22)-pmom[0]*nmom[0]-pmom[1]*nmom[1]-pmom[2]*nmom[2]),0.));
911 const Int_t spdg[5]={kPositron,kMuonPlus,kPiPlus, kKPlus, kProton};
918 AliKFParticle kfp1( *(paramP), spdg[p1] *TMath::Sign(1,p1) );
919 AliKFParticle kfp2( *(paramN), spdg[p2] *TMath::Sign(1,p2) );
923 if (type==0)
return v0KF.
GetMass();
925 if (type==2)
return v0KF.
GetChi2();
926 if (type==3)
return v0KF.
GetPt();
940 Double_t
AliESDv0::GetKFInfoScale(UInt_t p1, UInt_t p2, Int_t type, Double_t d1pt, Double_t s1pt, Double_t eLoss, Int_t flag)
const{
969 const Int_t spdg[5]={kPositron,kMuonPlus,kPiPlus, kKPlus, kProton};
970 if (p1>4 || p2>4)
return 0;
981 Double_t bg1=paramP.
P() /TDatabasePDG::Instance()->GetParticle(spdg[p1])->Mass();
982 Double_t bg2=paramN.
P() /TDatabasePDG::Instance()->GetParticle(spdg[p2])->Mass();
988 if (flag&0x1) pparam1[4]+=d1pt;
989 if (flag&0x2) pparam2[4]+=d1pt;
990 if (flag&0x1) pparam1[4]*=(1+s1pt)*(1.+eLoss*dP1/paramP.
P());
991 if (flag&0x2) pparam2[4]*=(1+s1pt)*(1.+eLoss*dP2/paramN.
P());
999 if (type==0)
return v0KF->
GetMass();
1001 if (type==2)
return v0KF->
GetChi2();
1002 if (type==3)
return v0KF->
GetPt();
Double_t GetSigmaZY() const
Int_t fNidx
its clusters CKBrev
Double32_t fNormDCAPrim[2]
Double_t GetSigmaZ2() const
Double_t GetLikelihoodD(Int_t mode0, Int_t mode1)
Double_t fPSigmaOffsetAP0
virtual Double_t E() const
Double_t fPMaxFractionAP0
virtual Double_t Y() const
Double_t GetErrMass() const
Double32_t fDcaV0Daughters
void SetCausality(Float_t pb0, Float_t pb1, Float_t pa0, Float_t pa1)
Bool_t GetXYZ(Double_t *p) const
AliVParticle & operator=(const AliVParticle &vPart)
static Double_t BetheBlochGeant(Double_t bg, Double_t kp0=2.33, Double_t kp1=0.20, Double_t kp2=3.00, Double_t kp3=173e-9, Double_t kp4=0.49848)
Double_t fPMinFractionAP0
Double_t GetKFInfoScale(UInt_t p1, UInt_t p2, Int_t type, Double_t d1pt, Double_t s1pt, Double_t eLoss=0, Int_t flag=0x3) const
AliExternalTrackParam fParamN
virtual void Copy(TObject &obj) const
void GetXYZ(Double_t &x, Double_t &y, Double_t &z) const
Double_t GetAlpha() const
virtual Double_t GetTgl() const
const Double_t * GetParameter() const
Double_t GetLikelihoodAP(Int_t mode0, Int_t mode1)
Double_t GetEffMass() const
Double_t RapK0Short() const
const AliExternalTrackParam * GetParamP() const
virtual Short_t Charge() const
Double_t GetMinimaxSigmaD0()
Double_t GetSigmaY2() const
Double_t GetV0CosineOfPointingAngle() const
AliESDVertex GetVertex() const
Double_t ChangeMassHypothesis(Int_t code=kK0Short)
const Double_t * GetCovariance() const
AliExternalTrackParam fParamP
Bool_t GetPxPyPz(Double_t *p) const
void SetClusters(const Int_t *clp, const Int_t *clm)
void GetPxPyPz(Double_t &px, Double_t &py, Double_t &pz) const
AliESDv0 & operator=(const AliESDv0 &v0)
Double_t GetEffMassExplicit(Double_t m1, Double_t m2) const
void GetPosCov(Double_t cov[6]) const
Double_t GetKFInfo(UInt_t p1, UInt_t p2, Int_t type) const
static const AliESDV0Params fgkParams
Double_t GetMinimaxSigmaAP0()
virtual Double_t Px() const
Double_t GetEffectiveSigmaAP0()
#define AliError(message)
virtual Double_t Py() const
static Bool_t GetWeight(TMatrixD &w, const AliExternalTrackParam &t)
virtual Double_t P() const
Float_t GetD(Double_t x0, Double_t y0) const
Double_t GetEffectiveSigmaD0()
virtual Double_t Pz() const
Double_t GetLikelihoodC(Int_t mode0, Int_t mode1) const
const AliExternalTrackParam * GetParamN() const
Double_t RapLambda() const