#include"TCcluster.h" #include"Pedestals.h" #include #include"PndTpcDigiMapper.h" #include"TMath.h" #include"TMatrixD.h" class padRow_t{ private: double pos; public: padRow_t(double d){pos=d;}; bool isSame(double d){return (fabs(d-pos)<1.E-6);} }; TCcluster cogTCcluster(std::vector& _raw){ TCcluster rclust; int rdetId = -1; TVector3 rpos(0.,0.,0.); TVector3 rerr(0.,0.,0.); double ramp=0.; unsigned int firstId=_raw.at(0).getId(); unsigned int nraw=_raw.size(); for(unsigned int i=0;imap(&_d,pos); amp=_d.amp(); McId dummyID(1,1); McIdCollection dummyColl; dummyColl.AddID(dummyID); static float dx(0.62); static float dy(0.1); //this block is to define the z jitter TVector3 zDiff1,zDiff2; PndTpcDigi zDiffDigi1(1,1,1,dummyColl),zDiffDigi2(1,2,1,dummyColl); PndTpcDigiMapper::getInstance()->map(&zDiffDigi1,zDiff1); PndTpcDigiMapper::getInstance()->map(&zDiffDigi2,zDiff2); double zDiff = zDiff2.z() - zDiff1.z(); //end of z jitter double Dl = PndTpcDigiMapper::getInstance()->getGas()->Dl(); double Dt = PndTpcDigiMapper::getInstance()->getGas()->Dt(); double diffSigmaL = Dl * sqrt(pos.z()); double diffSigmaT = Dt * sqrt(pos.z()); err.SetX(TMath::Sqrt(dx*dx/12. + diffSigmaT*diffSigmaT)); err.SetY(TMath::Sqrt(dy*dy/12. + diffSigmaT*diffSigmaT)); err.SetZ(TMath::Sqrt(zDiff*zDiff/12. + diffSigmaL*diffSigmaL)); double dummy; Pedestals::getPedestal(_d.padId(),dummy,pedestalRMS); } void TCcluster::print(){ std::cout << "========== TCcluster::print()" << std::endl; std::cout << "detector id: "<abort" << std::endl; throw; } else if(detId<100) return 1; else if(detId<200) { std::cerr << "TCcluster::getNDF(...) Pixel detectors (id=100-199) currently not implemented ->abort" << std::endl; throw; } else if(detId<300) return 3; else { std::cerr << "TCcluster::getNDF(...) detId>=300 currently not implemented ->abort" << std::endl; throw; } } void TCcluster::setResid(double *par){ TVector3 p,d; convertPar(par,p,d); if(detId<0) { std::cerr << "TCcluster::getResid(...) detId<0 not implemented ->abort" << std::endl; throw; } else if(detId<100) res = residStrip(p,d); else if(detId<200) res = residPixel(p,d); else if(detId<300) res = residPoint(p,d); else { std::cerr << "TCcluster::getResid(...) detId>=300 currently not implemented ->abort" << std::endl; throw; } } TVector3 TCcluster::residPoint(const TVector3& p,const TVector3& d){//these track parameters are in detector coordinates /* residual vector R=pos-Q; Q is POCA R*d=0 in POCA Q=p+t*d R=pos-p-t*d pos*d-p*d=t*d^2 t=1/d^2 * (pos*d-p*d) */ double t = 1/pow(d.Mag(),2.) * (pos*d-p*d); TVector3 ret = pos-p-t*d; return ret;//points from track to pos } TVector3 TCcluster::residPixel(const TVector3& p,const TVector3& d){//these track parameters are in detector coordinates std::cerr << "TCcluster::residPixel not yet implemented ->abort" << std::endl; throw; } TVector3 TCcluster::residStrip(const TVector3& p,const TVector3& d){//these track parameters are in detector coordinates /* in strip detectors, the coordinate sysytem is such that the detector plane is w=0 The strips always run along the u coordinate. This means that the residual vector is just: (b_u-pos_u,0,0) The calculation of bu is based on:(bu,bv,0)=p+t*d */ //double t = -1.*p.Z()/d.Z(); //double b_u = p.X()+t*d.X(); TVector3 ret((p.X()-(p.Z()/d.Z())*d.X()) - pos.X() ,0.,0.); return ret; } void TCcluster::convertPar(double *par,TVector3& p,TVector3& d){ //extract point and direction vector from par TVector3 dir(par[0],par[2],1.); dir.SetMag(1.); TVector3 point(par[1],par[3],0.); //convert them to detector coordinates d = TCalign::getInstance()->notranslXYZtoUVW(detId,dir); p = TCalign::getInstance()->XYZtoUVW(detId,point); } unsigned int TCcluster::nPadX(){ std::vector padRows; for(int iraw=0;iraw padRows; for(int iraw=0;iraw padRows; for(int iraw=0;iraw