]> git.uio.no Git - u/mrichter/AliRoot.git/blob - HLT/trigger/AliHLTD0toKpi.cxx
added more options to run D0 finder from offline or online data (Gaute)
[u/mrichter/AliRoot.git] / HLT / trigger / AliHLTD0toKpi.cxx
1 // $Id$
2 #include "AliHLTD0toKpi.h"
3 #include "TDatabasePDG.h"
4 #include "TMath.h"
5 #include "AliESDtrack.h"
6 #include "TVector3.h"
7 #include "AliAODVertex.h"
8 #include "AliESDVertex.h"
9 #include "TObjArray.h"
10 #include "AliVertexerTracks.h"
11
12
13 ClassImp(AliHLTD0toKpi)
14
15 AliHLTD0toKpi::AliHLTD0toKpi() 
16 {
17 }
18
19 Double_t AliHLTD0toKpi::InvMass(AliESDtrack* d1, AliESDtrack* d2)
20 {
21   Double_t mpi=TDatabasePDG::Instance()->GetParticle(211)->Mass();
22   Double_t mK=TDatabasePDG::Instance()->GetParticle(321)->Mass();
23
24   Double_t energy[2]; 
25   energy[1] = TMath::Sqrt(mK*mK+d1->GetP()*d1->GetP());
26   energy[0] = TMath::Sqrt(mpi*mpi+d2->GetP()*d2->GetP());
27
28   Double_t p1[3],p2[3];
29   d1->GetPxPyPz(p1);
30   d2->GetPxPyPz(p2);
31   
32   Double_t momTot2 = (p1[0]+p2[0])*(p1[0]+p2[0])+
33                      (p1[1]+p2[1])*(p1[1]+p2[1])+
34                      (p1[2]+p2[2])*(p1[2]+p2[2]);
35
36   return TMath::Sqrt((energy[0]+energy[1])*(energy[0]+energy[1])-momTot2);
37
38 }
39 void AliHLTD0toKpi::cosThetaStar(AliESDtrack* d1, AliESDtrack* d2,Double_t &D0,Double_t &D0bar)
40 {
41   Double_t mD0 = TDatabasePDG::Instance()->GetParticle(421)->Mass();
42   Double_t mpi=TDatabasePDG::Instance()->GetParticle(211)->Mass();
43   Double_t mK=TDatabasePDG::Instance()->GetParticle(321)->Mass();
44
45   Double_t pStar = TMath::Sqrt(TMath::Power(mD0*mD0-mK*mK-mpi*mpi,2.)-4.*mK*mK*mpi*mpi)/(2.*mD0);
46  
47   Double_t px = d1->Px()+d2->Px();
48   Double_t py = d1->Py()+d2->Py();
49   Double_t pz = d1->Pz()+d2->Pz();
50   Double_t p = TMath::Sqrt(px*px+py*py+pz*pz);
51   Double_t energy = TMath::Sqrt(p*p+mD0*mD0);
52
53   Double_t beta = p/energy;
54   Double_t gamma = energy/mD0;
55   
56   Double_t qL;
57   TVector3 mom(d1->Px(),d1->Py(),d1->Pz());
58   TVector3 momD(px,py,pz);
59   qL = mom.Dot(momD)/momD.Mag();
60
61   D0 = (qL/gamma-beta*TMath::Sqrt(pStar*pStar+mK*mK))/pStar;
62   
63   TVector3 mom2(d2->Px(),d2->Py(),d2->Pz());
64   TVector3 momD2(px,py,pz);
65   qL = mom2.Dot(momD2)/momD2.Mag();
66
67   D0bar = (qL/gamma-beta*TMath::Sqrt(pStar*pStar+mK*mK))/pStar;
68
69 }
70 Double_t AliHLTD0toKpi::pointingAngle(AliESDtrack* n, AliESDtrack* p, Double_t *pv, Double_t *sv)
71 {
72
73   TVector3 mom(n->Px()+p->Px(),n->Py()+p->Py(),n->Pz()+p->Pz());
74   TVector3 flight(sv[0]-pv[0],sv[1]-pv[1],sv[2]-pv[2]);
75   
76   double pta = mom.Angle(flight);
77
78   return TMath::Cos(pta); 
79 }
80
81 AliAODVertex* AliHLTD0toKpi::ReconstructSecondaryVertex(TObjArray *trkArray, Double_t b, const AliESDVertex *v)
82 {
83   
84   AliESDVertex *vertexESD = 0;
85   AliAODVertex *vertexAOD = 0;
86   
87   AliVertexerTracks *vertexer = new AliVertexerTracks(b);
88   AliESDVertex* fV1 = new AliESDVertex(*v);
89   vertexer->SetVtxStart(fV1);
90   vertexESD = (AliESDVertex*)vertexer->VertexForSelectedESDTracks(trkArray);
91   delete vertexer; vertexer=NULL;
92   
93   if(!vertexESD) return vertexAOD;
94   
95   if(vertexESD->GetNContributors()!=trkArray->GetEntriesFast()) { 
96     //AliDebug(2,"vertexing failed"); 
97     delete vertexESD; vertexESD=NULL;
98     return vertexAOD;
99   }
100
101   // convert to AliAODVertex
102   Double_t pos[3],cov[6],chi2perNDF;
103   vertexESD->GetXYZ(pos); // position
104   vertexESD->GetCovMatrix(cov); //covariance matrix
105   chi2perNDF = vertexESD->GetChi2toNDF();
106   //dispersion = vertexESD->GetDispersion();
107   delete vertexESD; vertexESD=NULL;
108
109   Int_t nprongs= trkArray->GetEntriesFast();
110   vertexAOD = new AliAODVertex(pos,cov,chi2perNDF,0x0,-1,AliAODVertex::kUndef,nprongs);
111
112   return vertexAOD;
113
114 }