29 #include "TDatabasePDG.h"
30 #include "TParticlePDG.h"
32 #include "FairRunAna.h"
33 #include "FairRunSim.h"
34 #include "FairField.h"
64 setP4(TLorentzVector(0.,0.,0.,0.));
75 for (
int i=0;
i<15;
i++)
79 for (
int i=0;
i<28;
i++)
83 PndFsmTrack::PndFsmTrack(TLorentzVector
const inP4, TVector3 start, TVector3 stop,
double inCharge,
int inPdt,
signed long trackId)
84 : fCov5(5,5), fCov7(7,7) {
103 double tandip=
p4().Pz()/
p4().Perp();
104 double pnt[3], Bf[3];
105 pnt[0]=fReference.X(); pnt[1]=fReference.Y(); pnt[2]=fReference.Z();
106 FairField* theField=0;
107 if(FairRun::Instance()->IsAna()){
108 theField=FairRunAna::Instance()->GetField();
111 theField=FairRunSim::Instance()->GetField();
114 if(theField==0) Fatal(
"PndFsmTrack::HelixRep()",
"Magnetic Field pointer missing. Set your field!");
115 theField->GetFieldValue(pnt, Bf);
118 double a=-2.99792458e-3*Bf[2]*
charge();
119 double omega=a/
p4().Perp();
121 TVector3 center = reference + (1/omega)*(TVector3( -
p4().
Y(),
p4().
X(), 0).Unit());
123 double delta = (center-reference).Phi() - center.Phi();
124 double cosrs=
cos(delta);
125 double sinrs=
sin(delta);
127 TVector3
p(
p4().Vect());
130 p.SetPhi(
p4().Phi() - delta );
132 reference.SetX( reference.X() - p.X()/a*sinrs + p.Y()/a*(1-cosrs) );
133 reference.SetY( reference.Y() - p.Y()/a*sinrs - p.X()/a*(1-cosrs) );
134 reference.SetZ( reference.Z() - tandip*delta/omega );
136 fPar5[0]=reference.Cross(p).Z()<0 ? reference.Perp() : -reference.Perp();
139 fPar5[3]=reference.Z();
153 double pnt[3], Bf[3];
155 FairField* theField=0;
156 if(FairRun::Instance()->IsAna()){
157 theField=FairRunAna::Instance()->GetField();
160 theField=FairRunSim::Instance()->GetField();
163 if(theField==0) Fatal(
"PndFsmTrack::HelixRep()",
"Magnetic Field pointer missing. Set your field!");
164 theField->GetFieldValue(pnt, Bf);
165 double a=2.99792458e-3*Bf[2];
173 fPar5[3]-=dz*floor((
fPar5[3]-origin.Z())/dz+0.5);
181 double distance2=1e150;
191 if (distance2<distance.Mag2()) {
195 distance2=distance.Mag2();
199 }
while (
fabs(ds)>1e-9);
203 TDatabasePDG::Instance()->GetParticle(
"pi-")->
Mass());
209 J_alpha(0,2)=-R*R*(s1-s0);
213 J_alpha(1,2)=+R*R*(c1-c0);
217 J_alpha(2,4)=+delta*
R;
219 J_alpha(3,1)=-
_p4.Y();
220 J_alpha(3,2)=-
_p4.X()*
R;
222 J_alpha(4,1)=+
_p4.X();
223 J_alpha(4,2)=-
_p4.Y()*
R;
225 J_alpha(5,2)=-
_p4.Z()*
R;
228 J_alpha(6,2)=-
_p4.Vect().Mag2()*R/
_p4.T();
231 if (deltaError>=0.001) {
234 deltaError*=3.1416/180;
235 double covDelta=deltaError*deltaError;
242 TMatrixD tmp2(J_delta, TMatrixD::kMultTranspose, J_delta);
250 fCov7.MultT(tmp1, J_alpha);
257 for (
int i=0;
i<7;
i++)
258 for (
int j=0;j<7;j++)
266 for (
int i=0;
i<4;
i++)
267 for (
int j=0;j<4;j++)
275 for (
int i=0;
i<3;
i++)
276 for (
int j=0;j<3;j++)
368 o<<
"PndFsmTrack printout"<<endl;
369 o<<
" P4 : < "<<
_p4.Px() <<
" / " <<
_p4.Py() <<
" / " <<
_p4.Pz() <<
" / "<<
_p4.E()<<
" >"<<endl;
376 else o <<
" 1/Omega: " <<
"inf";
Double_t GetHelixZ0() const
friend F32vec4 cos(const F32vec4 &a)
Double_t GetHelixPhi0() const
void setStopVtx(TVector3 v)
Double_t GetHelixOmega() const
friend F32vec4 sin(const F32vec4 &a)
void setDetResponse(PndFsmResponse *resp)
Double_t GetHelixD0() const
void setMvddEdX(double c)
void SetP7Cov(TMatrixD &p7cov)
PndFsmResponse * _detResponse
TString pt(TString pts, TString exts="px py pz")
void SetVCov(TMatrixD &vcov)
basic_ostream< char, char_traits< char > > ostream
void setP4(TLorentzVector l)
friend F32vec4 fabs(const F32vec4 &a)
void setSttdEdX(double c)
void setTpcdEdX(double c)
void SetP4Cov(TMatrixD &p4cov)
void setStartVtx(TVector3 v)
void HelixRep(TVector3 reference)
Double_t GetHelixTanDip() const
void setGTrackId(signed long id)
void Propagate(TVector3 origin, double deltaError=2.5)
void print(std::ostream &o)
TMatrixT< double > TMatrixD