//----------------------------------------------------------- // File and Version Information: // $Id$ // // Description: // Implementation of class PndTpcRiemannTrack // see PndTpcRiemannTrack.hh for details // // Environment: // Software developed for the PANDA Detector at FAIR. // // Author List: // Sebastian Neubert TUM (original author) // // //----------------------------------------------------------- // Panda Headers ---------------------- // This Class' Header ------------------ #include "PndTpcRiemannTrack.h" // C/C++ Headers ---------------------- #include #include // Collaborating Class Headers -------- #include "PndTpcRiemannHit.h" #include "PndTpcCluster.h" #include "TMatrixD.h" #include "TVectorD.h" #include "TGraph.h" #include "TMath.h" // Class Member definitions ----------- ClassImp(PndTpcRiemannTrack) PndTpcRiemannTrack::PndTpcRiemannTrack() : _n(3),_av(3) {} void PndTpcRiemannTrack::addHit(PndTpcRiemannHit* hit){ int nbefore=_hits.size(); _hits.push_back(hit); _av*=(double)nbefore; _av[0]+=hit->x().X(); _av[1]+=hit->x().Y(); _av[2]+=hit->x().Z(); _av*=1./(double)(nbefore+1); } double PndTpcRiemannTrack::dist(PndTpcRiemannHit* hit){ double d2=_c; d2+=hit->x().X()*_n[0]; d2+=hit->x().Y()*_n[1]; d2+=hit->x().Z()*_n[2]; return d2; } void PndTpcRiemannTrack::refit() { TMatrixT av(3,1); av[0][0]=_av[0]; av[1][0]=_av[1]; av[2][0]=_av[2]; TMatrixD sampleCov(3,3); int nh=_hits.size(); for(int i=0;ix().X(); h[1][0]=_hits[i]->x().Y(); h[2][0]=_hits[i]->x().Z(); TMatrixD d(3,1); d=h-av; TMatrixD dt(TMatrixD::kTransposed,d); TMatrixD ddt(d,TMatrixD::kMult,dt); sampleCov+=ddt; } sampleCov*=1./(double)nh; TVectorD eigenValues(3); TMatrixD eigenVec=sampleCov.EigenVectors(eigenValues); // find smallest eigenvalue double val=eigenValues[0]; int g=0; for(int k=1;k<3;++k){ if(eigenValues[k]100)return 0; double a=2.*(_c+_n[2]); //if(a==0){ // std::cout<<"PndTpcRiemannTrack:: a==0 cannot calc r! set r=1E4"<calcPosOnTrk(this); g.SetPoint(i,_hits[i]->s(),_hits[i]->z()); //std::cout<<_hits[i]->z()<<"|"<<_hits[i]->s()<calcPosOnTrk(this); double hits=hit->s(); double predz=hits*_m+_t; return predz-hit->z(); } // only after szFit! double PndTpcRiemannTrack::dip() const { return cos(atan(_m)); } // Todo: check for backward going tracks!!! double PndTpcRiemannTrack::sign() const { double s=_hits[3]->s(); return s<0 ? -1. : 1; }