1 #include "AliD0Trigger.h"
3 #include "AliITStrackV2.h"
4 #include "AliL3Transform.h"
10 AliD0Trigger::AliD0Trigger()
15 AliD0Trigger::AliD0Trigger(double c[6],double b,double pv[3])
27 primaryVertex[0]=pv[0];
28 primaryVertex[1]=pv[1];
29 primaryVertex[2]=pv[2];
31 AliD0Trigger::AliD0Trigger(AliITStrackV2 * posT, AliITStrackV2 * negT)
38 AliD0Trigger::~AliD0Trigger()
43 void AliD0Trigger::SetTracks(AliITStrackV2 * posT, AliITStrackV2 * negT){
47 bool AliD0Trigger::FindInvMass() {
53 double mom2[2],momTot2,energy[2];
55 mom2[0]=pow(momenta[0],2)+pow(momenta[1],2)+pow(momenta[2],2);
56 mom2[1]=pow(momenta[3],2)+pow(momenta[4],2)+pow(momenta[5],2);
58 momTot2 = pow(momenta[0]+momenta[3],2)+pow(momenta[1]+momenta[4],2)+pow(momenta[2]+momenta[5],2);
61 energy[1] = sqrt(pow(mKa,2)+mom2[1]);
62 energy[0] = sqrt(pow(mPi,2)+mom2[0]);
64 double minvD0 = sqrt((energy[0]+energy[1])*(energy[0]+energy[1])-momTot2);
67 energy[0] = sqrt(mKa*mKa+mom2[0]);
68 energy[1] = sqrt(mPi*mPi+mom2[1]);
70 double minvD0bar = sqrt((energy[0]+energy[1])*(energy[0]+energy[1])-momTot2);
72 if(fabs(minvD0-mD0) < cutInvMass) return true;
73 if(fabs(minvD0bar-mD0) < cutInvMass) return true;
77 bool AliD0Trigger::FindV0(){
81 double Gxpos=0,Gypos=0,Gxneg=0,Gyneg=0;
82 double r1=0,r2=0,a1=0,a2=0,b1=0,b2=0;
83 double q=0,p=0,t=0,Fa=0,Fb=0,Fc=0;
84 double y1=0,y2=0,x1=0,x2=0,x3=0,x4=0;
85 double V01=0,V02=0,V03=0,V04=0;
86 double V0[4]={0,0,0,0};
87 bestV0[0]=0; bestV0[1]=0; bestV0[2]=0;
89 Gxpos=posTrack->GetX()*cos(posTrack->GetAlpha())-posTrack->GetY()*sin(posTrack->GetAlpha());
90 Gypos=posTrack->GetX()*sin(posTrack->GetAlpha())+posTrack->GetY()*cos(posTrack->GetAlpha());
91 Gxneg=negTrack->GetX()*cos(negTrack->GetAlpha())-negTrack->GetY()*sin(negTrack->GetAlpha());
92 Gyneg=negTrack->GetX()*sin(negTrack->GetAlpha())+negTrack->GetY()*cos(negTrack->GetAlpha());
94 r1=fabs(1/(AliL3Transform::GetBFact()*Bfield*posTrack->Get1Pt()));
95 r2=fabs(1/(AliL3Transform::GetBFact()*Bfield*negTrack->Get1Pt()));
97 a1=Gxpos-(r1*cos(posTrack->GetAlpha()+asin(posTrack->GetSnp())+TMath::PiOver2()));
98 a2=Gxneg-(r2*cos(negTrack->GetAlpha()+asin(negTrack->GetSnp())-TMath::PiOver2()));
99 b1=Gypos-(r1*sin(posTrack->GetAlpha()+asin(posTrack->GetSnp())+TMath::PiOver2()));
100 b2=Gyneg-(r2*sin(negTrack->GetAlpha()+asin(negTrack->GetSnp())-TMath::PiOver2()));
104 //double r3=sqrt(pow(a3,2)+pow(b3,2));
109 t=pow(r2,2)-pow(r2,2)+pow(b1,2)-pow(b2,2)-pow(q,2);
111 Fa=pow(p,2)+(4*pow(q,2));
112 Fb=-(2*t*p+8*pow(q,2)*b1);
113 Fc=pow(t,2)-(4*pow(q,2)*pow(r1,2))+(4*pow(q,2)*pow(b1,2));
115 if(pow(Fb,2)-(4*Fa*Fc)>=0){
116 y1=(-Fb+(sqrt(pow(Fb,2)-(4*Fa*Fc))))/(2*Fa); //noe feil her. floating point
117 y2=(-Fb-(sqrt(pow(Fb,2)-(4*Fa*Fc))))/(2*Fa); //trolig negativ under rot
119 x1=sqrt(pow(r1,2)-pow((y1-b1),2))+a1;
120 x2=sqrt(pow(r1,2)-pow((y2-b1),2))+a1;
121 x3=-sqrt(pow(r1,2)-pow((y1-b1),2))+a1;
122 x4=-sqrt(pow(r1,2)-pow((y2-b1),2))+a1;
124 V01=sqrt(pow(x1-primaryVertex[0],2)+pow(y1-primaryVertex[1],2));
125 V02=sqrt(pow(x2-primaryVertex[0],2)+pow(y2-primaryVertex[1],2));
126 V03=sqrt(pow(x3-primaryVertex[0],2)+pow(y1-primaryVertex[1],2));
127 V04=sqrt(pow(x4-primaryVertex[0],2)+pow(y2-primaryVertex[1],2));
129 V0[0]=V01;V0[1]=V02;V0[2]=V03;V0[3]=V04;
133 double nearestV0=V0[0];
135 for(int i=0;i<4;i++){
141 cout<<"index: "<<index<<endl;
142 if(nearestV0<cutV0high){
143 if(nearestV0>cutV0low){
146 bestV0[0]=x1; bestV0[1]=y1; bestV0[2]=0.;
149 bestV0[0]=x2; bestV0[1]=y2; bestV0[2]=0.;
152 bestV0[0]=x3; bestV0[1]=y1; bestV0[2]=0.;
155 bestV0[0]=x4; bestV0[1]=y2; bestV0[2]=0.;
162 cout<<"My V0: x: "<<bestV0[0]<<" y: "<<bestV0[1]<<" z: "<<bestV0[2]<<endl;
166 void AliD0Trigger::FindMomentaAtVertex(){
168 double r1=fabs(1/(AliL3Transform::GetBFact()*Bfield*posTrack->Get1Pt()));
169 double r2=fabs(1/(AliL3Transform::GetBFact()*Bfield*negTrack->Get1Pt()));
171 double Gx1=posTrack->GetX()*cos(posTrack->GetAlpha())-posTrack->GetY()*sin(posTrack->GetAlpha());
172 double Gy1=posTrack->GetX()*sin(posTrack->GetAlpha())+posTrack->GetY()*cos(posTrack->GetAlpha());
173 double Gx2=negTrack->GetX()*cos(negTrack->GetAlpha())-negTrack->GetY()*sin(negTrack->GetAlpha());
174 double Gy2=negTrack->GetX()*sin(negTrack->GetAlpha())+negTrack->GetY()*cos(negTrack->GetAlpha());
176 double centerx1=Gx1-(r1*cos(posTrack->GetAlpha()+asin(posTrack->GetSnp())+TMath::PiOver2()));
177 double centerx2=Gx2-(r2*cos(negTrack->GetAlpha()+asin(negTrack->GetSnp())-TMath::PiOver2()));
178 double centery1=Gy1-(r1*sin(posTrack->GetAlpha()+asin(posTrack->GetSnp())+TMath::PiOver2()));
179 double centery2=Gy2-(r2*sin(negTrack->GetAlpha()+asin(negTrack->GetSnp())-TMath::PiOver2()));
181 double a1=sqrt(pow(Gx1-bestV0[0],2)+pow(Gy1-bestV0[1],2));
182 double b1=sqrt(pow(bestV0[0]-centerx1,2)+pow(bestV0[1]-centery1,2));
183 double c1=sqrt(pow(Gx1-centerx1,2)+pow(Gy1-centery1,2));
184 double a2=sqrt(pow(Gx2-bestV0[0],2)+pow(Gy2-bestV0[1],2));
185 double b2=sqrt(pow(bestV0[0]-centerx2,2)+pow(bestV0[1]-centery2,2));
186 double c2=sqrt(pow(Gx2-centerx2,2)+pow(Gy2-centery2,2));
188 double alpha1=acos((pow(b1,2)+pow(c1,2)-pow(a1,2))/(2*b1*c1));
189 double alpha2=acos((pow(b2,2)+pow(c2,2)-pow(a2,2))/(2*b2*c2));
194 if((sqrt(pow(Gx1,2)+pow(Gy1,2)))>(sqrt(pow(bestV0[0],2)+pow(bestV0[1],2))))
198 if((sqrt(pow(Gx2,2)+pow(Gy2,2)))>(sqrt(pow(bestV0[0],2)+pow(bestV0[1],2))))
203 double psi1=(posTrack->GetAlpha()+asin(posTrack->GetSnp()))+(sign1*alpha1);
204 double psi2=(negTrack->GetAlpha()+asin(negTrack->GetSnp()))+(sign2*alpha2);
206 double ptP = 1./fabs(posTrack->Get1Pt());
207 momenta[0] = ptP*cos(psi1);
208 momenta[1] = ptP*sin(psi1);
209 momenta[2] = ptP*posTrack->GetTgl();
211 double ptN = 1./fabs(negTrack->Get1Pt());
212 momenta[3] = ptN*cos(psi2);
213 momenta[4] = ptN*sin(psi2);
214 momenta[5] = ptN*negTrack->GetTgl();
217 Bool_t AliD0Trigger::PointingAngle(){
219 TVector3 mom(momenta[0]+momenta[3],momenta[1]+momenta[4],momenta[2]+momenta[5]);
220 TVector3 flight(bestV0[0]-primaryVertex[0],bestV0[1]-primaryVertex[1],bestV0[2]-primaryVertex[2]);
222 double pta = mom.Angle(flight);
224 if(cos(pta)<cutPointAngle)
229 void AliD0Trigger::SetMomenta(double m[6])
238 void AliD0Trigger::FindMomentaOffline()
240 double ptP,alphaP,phiP,ptN,alphaN,phiN;
241 // momenta of the tracks at the vertex
242 ptP = 1./TMath::Abs(posTrack->Get1Pt());
243 alphaP = posTrack->GetAlpha();
244 phiP = alphaP+TMath::ASin(posTrack->GetSnp());
245 momenta[0] = ptP*TMath::Cos(phiP);
246 momenta[1] = ptP*TMath::Sin(phiP);
247 momenta[2] = ptP*posTrack->GetTgl();
249 ptN = 1./TMath::Abs(negTrack->Get1Pt());
250 alphaN = negTrack->GetAlpha();
251 phiN = alphaN+TMath::ASin(negTrack->GetSnp());
252 momenta[3] = ptN*TMath::Cos(phiN);
253 momenta[4] = ptN*TMath::Sin(phiN);
254 momenta[5] = ptN*negTrack->GetTgl();
256 bool AliD0Trigger::FindV0offline(double v[3])
266 r=sqrt(pow(bestV0[0]-primaryVertex[0],2)+pow(bestV0[1]-primaryVertex[1],2)+pow(bestV0[2]-primaryVertex[2],2));
277 bool AliD0Trigger::d0d0()
282 d00 = 10000.*posTrack->GetD(primaryVertex[0],primaryVertex[1]);
283 d01 = -10000.*negTrack->GetD(primaryVertex[0],primaryVertex[1]);
291 double AliD0Trigger::Energy()
293 double kMD0 = 1.8645; // D0 mass
294 return sqrt(P()*P()+kMD0*kMD0);
296 bool AliD0Trigger::CosThetaStar()
298 bool goodtheta=false;
299 double kMD0 = 1.8645; // D0 mass
300 double kMK = 0.49368; // K+ mass
301 double kMPi = 0.13957; // Pi+ mass
302 double qL=0,qL2=0,ctsD0=0,ctsD0bar=0;
304 Double_t pStar = TMath::Sqrt(TMath::Power(kMD0*kMD0-kMK*kMK-kMPi*kMPi,2.)-4.*kMK*kMK*kMPi*kMPi)/(2.*kMD0);
306 Double_t beta = P()/Energy();
307 Double_t gamma = Energy()/kMD0;
309 TVector3 mom(momenta[0],momenta[1],momenta[2]);
310 TVector3 mom2(momenta[3],momenta[4],momenta[5]);
311 TVector3 momD(Px(),Py(),Pz());
313 qL = mom.Dot(momD)/momD.Mag();
315 ctsD0 = (qL/gamma-beta*TMath::Sqrt(pStar*pStar+kMK*kMK))/pStar;
317 qL2 = mom.Dot(momD)/momD.Mag();
319 ctsD0bar = (qL2/gamma-beta*TMath::Sqrt(pStar*pStar+kMK*kMK))/pStar;
321 if(TMath::Abs(ctsD0) > cutCosThetaStar){
322 if(TMath::Abs(ctsD0bar) > cutCosThetaStar){
328 bool AliD0Trigger::pTchild()
333 pT1=sqrt(pow(momenta[0],2)+pow(momenta[1],2));
334 pT2=sqrt(pow(momenta[3],2)+pow(momenta[4],2));