/** @file CbmTofTracklet.cxx ** @author nh ** @date 17.05.2015 ** **/ #include "CbmTofTracklet.h" #include "CbmTofHit.h" #include "FairLogger.h" #include "Rtypes.h" // for Double_t, Double32_t, Int_t, etc #include "TMatrixFSymfwd.h" // for TMatrixFSym #include "TMatrixD.h" #include "TVectorD.h" #include "TDecompSVD.h" using std::vector; CbmTofTracklet::CbmTofTracklet() : fTrackLength(0.), fPidHypo(-1), fDistance(0.), fTime(0.), fTt(0.), fT0(0.), fChiSq(0.), fNDF(0), fTrackPar(), fParamFirst(), fParamLast(), fTofHit(0,-1), fTofDet(), fMatChi(), fhit() { } CbmTofTracklet::CbmTofTracklet( const CbmTofTracklet &t) : fTrackLength(t.fTrackLength), fPidHypo(t.fPidHypo), fDistance(t.fDistance), fTime(t.fTime), fTt(t.fTt), fT0(t.fT0), fChiSq(t.fChiSq), fNDF(t.fNDF), fTrackPar(CbmTofTrackletParam(t.fTrackPar)), fParamFirst(FairTrackParam(t.fParamFirst)), fParamLast(FairTrackParam(t.fParamLast)), fTofHit(t.fTofHit), fTofDet(t.fTofDet), fMatChi(t.fMatChi), fhit(t.fhit) { } CbmTofTracklet::~CbmTofTracklet() { } /* CbmTofTracklet::CbmTofTracklet(const CbmTofTracklet &fSource) : fTrackLength(0.), fPidHypo(-1), fDistance(0.), fTime(0.), fTt(0.), fT0(0.), fChiSq(0.), fNDF(0), fTrackPar(), fParamFirst(), fParamLast(), fTofHit(0,-1), fTofDet(), fMatChi(), fhit() { } CbmTofTracklet& CbmTofTracklet::operator=(const CbmTofTracklet &fSource){ // do something ! return *this; } */ void CbmTofTracklet::SetParamLast(const CbmTofTrackletParam* par){ fParamLast.SetX( par->GetX() ); fParamLast.SetY( par->GetY() ); fParamLast.SetZ( par->GetZ() ); fParamLast.SetTx( par->GetTx() ); fParamLast.SetTy( par->GetTy() ); fParamLast.SetQp( par->GetQp() ); for(int i=0, k=0;i<3;i++) for(int j=0; j<=i; j++,k++) fParamLast.SetCovariance(i,j,par->GetCovariance(k)); } void CbmTofTracklet::GetFairTrackParamLast(){ fTrackPar.SetX( fParamLast.GetX() ); fTrackPar.SetY( fParamLast.GetY() ); fTrackPar.SetZ( fParamLast.GetZ() ); fTrackPar.SetTx( fParamLast.GetTx() ); fTrackPar.SetTy( fParamLast.GetTy() ); fTrackPar.SetQp( fParamLast.GetQp() ); for(int i=0, k=0;i<3;i++) for(int j=0; j<=i; j++,k++) fTrackPar.SetCovariance(k,fParamLast.GetCovariance(i,j)); } Double_t CbmTofTracklet::GetMatChi2(Int_t iAddr){ for (UInt_t iHit=0; iHitGetX(),2); dR2 += TMath::Power(fTrackPar.GetY()-pHit->GetY(),2); dR2 += TMath::Power(fTrackPar.GetZ()-pHit->GetZ(),2); Double_t dR = TMath::Sqrt(dR2); */ /* Double_t dR = pHit->GetR(); LOG(DEBUG) < Tex %7.3f, ", fT0,dR,fTt,fT0 + dR*fTt) <GetZ(); Double_t dSign=1.; if( pHit->GetZ() < fhit[0].GetZ() ) dSign=-1; Double_t dTex = fhit[0].GetTime() + fTt*dSign*Dist3D(pHit,&fhit[0]); LOG(DEBUG) < Tex %7.3f, ", fhit[0].GetTime(),dZ,dZ-fhit[0].GetZ(),dSign, fTt, dTex) <2) UpdateTt(); // update Tt first for (UInt_t iHit=0; iHitToString()<0) { // exlude faked hits dT0 += fhit[iHit].GetTime() - fTt*fhit[iHit].GetR(); nValidHits++; } else iHit0=iHit; } dT0 /= nValidHits; fT0=dT0; */ // // follow tutorial solveLinear.C to solve the linear equation t=t0+tt*R // Double_t aR[fTofHit.size()]; Double_t at[fTofHit.size()]; Double_t ae[fTofHit.size()]; for (UInt_t iHit=0; iHit0) { // exclude faked hits if(nValidHits==0){ iHit1=iHit; //dDist1=fhit[iHit1].GetR(); dDist1=fhit[iHit1].GetZ()*TMath::Sqrt(1.+fTrackPar.GetTx()*fTrackPar.GetTx()+fTrackPar.GetTy()*fTrackPar.GetTy()); } //aR[nValidHits]=fhit[iHit].GetR(); Double_t dSign=1.; if(fhit[iHit].GetZ() < fhit[iHit1].GetZ()) dSign=-1.; aR[nValidHits]=dDist1+dSign*Dist3D(&fhit[iHit],&fhit[iHit1]); at[nValidHits]=fhit[iHit].GetTime(); ae[nValidHits]=0.1; // const timing error, FIXME nValidHits++; } else iHit0=iHit; } TVectorD R; R.Use(nValidHits,aR); TVectorD t; t.Use(nValidHits,at); TVectorD e; e.Use(nValidHits,ae); const Int_t nrVar = 2; TMatrixD A(nValidHits,nrVar); TMatrixDColumn(A,0) = 1.0; TMatrixDColumn(A,1) = R; // first bring the weights in place TMatrixD Aw = A; TVectorD yw = t; for (Int_t irow = 0; irow < A.GetNrows(); irow++) { TMatrixDRow(Aw,irow) *= 1/e(irow); yw(irow) /= e(irow); } TDecompSVD svd(Aw); Bool_t ok; const TVectorD c_svd = svd.Solve(yw,ok); // c_svd.Print(); fT0=c_svd[0]; fTt=c_svd[1]; if (iHit0>-1) fhit[iHit0].SetTime(fT0); LOG(DEBUG)<< Form("Trkl size %u, validHits %d, Tt = %6.4f T0 = %6.2f", (UInt_t)fTofHit.size(),nValidHits,fTt,fT0)<0 ) // exclude faked hits for (UInt_t iHH=iHL+1; iHH0) { // exclude faked hits dTt+=(fhit[iHH].GetTime()-fhit[iHL].GetTime())/(fhit[iHH].GetR()-fhit[iHL].GetR()); iNt++; } } } if (iNt==0) { LOG(WARNING) << "No valid hit pair "<GetR()); Double_t dSign=1.; if(fhit[iHit].GetZ()GetZ()) dSign=-1; dTref += fhit[iHit].GetTime() - dTt*dSign*Dist3D(&fhit[iHit],pHit); Nref++; } if(Nref == 0) { LOG(ERROR) << "DetId "<GetTime()-dTref; // LOG(DEBUG) << "iSt "<< iSt<<" DetId "<GetX(),fP[1],fhit[n]->GetY(),fP[2],fP[3]) << FairLogger::endl; */ return fP; } Double_t CbmTofTracklet::GetFitX(Double_t dZ){ return fTrackPar.GetX() + fTrackPar.GetTx()*(dZ-fTrackPar.GetZ()); } Double_t CbmTofTracklet::GetFitY(Double_t dZ){ return fTrackPar.GetY() + fTrackPar.GetTy()*(dZ-fTrackPar.GetZ()); } Double_t CbmTofTracklet::GetFitT(Double_t dZ){ // return fT0 + dR*fTt; //return fT0 + fTt*dZ*TMath::Sqrt(fTrackPar.GetTx()*fTrackPar.GetTx()+fTrackPar.GetTy()*fTrackPar.GetTy()); return fT0 + fTt*(dZ-fTrackPar.GetZ())*TMath::Sqrt(1.+fTrackPar.GetTx()*fTrackPar.GetTx()+fTrackPar.GetTy()*fTrackPar.GetTy()); } void CbmTofTracklet::Clear(Option_t* /*option*/){ // LOG(DEBUG) << "Clear TofTracklet with option "<<*option<GetX()-pHit1->GetX()),2) + TMath::Power((pHit0->GetY()-pHit1->GetY()),2) + TMath::Power((pHit0->GetZ()-pHit1->GetZ()),2) ); return dDist; } ClassImp(CbmTofTracklet)