38 using namespace DecayTreeFitter;
50 m_stateprovider( config.stateProvider() ),
51 m_useTrackTraj( config.useTrackTraj() ),
92 if(
vtxverbose>5){std::cout<<
"RecoTrack::initPar2: - updcache"<<std::endl;}
93 ErrCode rc = updCache(fitparams) ;
94 const TVector3& recoP =
particle()->P3() ;
95 int momindex = momIndex() ;
96 if(
vtxverbose>5){std::cout<<
"RecoTrack::initPar2: - write p3 to fitparams at momindex "<<momindex<<std::endl;}
97 fitparams->
par(momindex+0) = recoP.x() ;
98 fitparams->
par(momindex+1) = recoP.y() ;
99 fitparams->
par(momindex+2) = recoP.z() ;
109 int momindex = momIndex() ;
111 fitparams->
cov()(momindex+
row,momindex+
row) = 1000*covP(row,row) ;
132 const double ztolerance = m_stateprovider->ToleranceZ();
134 const double maxR = 0.05;
141 if(
vtxverbose>5){std::cout<<
"RecoTrack::updCache() - ask for fitparam z at posindex+2 = "<<mother()->posIndex()+2<<std::endl;}
142 double vx = fitparams->
par()(mother()->posIndex()+0) ;
143 double vy = fitparams->
par()(mother()->posIndex()+1) ;
144 double vz = fitparams->
par()(mother()->posIndex()+2) ;
145 double dz = vz - m_state.z() ;
146 double x = m_state.x() + dz * m_state.tx() ;
147 double y = m_state.y() + dz * m_state.ty() ;
149 if(
vtxverbose>5){std::cout<<
"RecoTrack::updCache() - fitpar z="<<vz<<
" current state z="<<m_state.z()<<
" dz="<<dz<<
" ztolerance="<<ztolerance<<std::endl;}
151 if( std::abs( dz ) > ztolerance )
154 if(
vtxverbose>5){std::cout<<
"RecoTrack::updCache() - find cached state"<<std::endl;}
156 if( std::abs( aState.
z() - vz ) < std::abs( dz ) )
158 if(
vtxverbose>5)std::cout <<
"RecoTrack::updCache(): Found a closer state! " <<
name() <<
" fitpar z=" << vz <<
" current state z=" << m_state.z() <<
" better state z=" << aState.
z() << std::endl ;
160 dz = vz - m_state.
z() ;
164 if( std::abs( dz ) > ztolerance || r > maxR )
166 if(
vtxverbose>5)std::cout <<
"RecoTrack::updCache(): calculate a new state."<< std::endl ;
168 if( !m_stateprovider ) {
169 std::cerr<<
"ERROR: DecayTreeFitter::RecoTrack::updCache() has no StateProvider"<<std::endl;
174 if(
vtxverbose>5){std::cout<<
"RecoTrack::updCache() - call stateprovider"<<std::endl;}
175 m_stateprovider->state(m_state,const_cast<RhoCandidate*>(m_candidate),vx,vy,vz) ;
176 m_StateCache.push_back(m_state);
179 if(
vtxverbose>5){std::cout<<
"RecoTrack::updCache() - done"<<std::endl;}
259 for (
unsigned int i=0;
i<m_StateCache.size();
i++){
260 double dz=std::abs(m_StateCache[
i].
z() - z);
267 if(beststate>=0)
return m_StateCache[beststate];
274 TVectorD rc(m.GetNrows()) ;
275 for(
int i=0;
i<m.GetNrows();
i++)
285 if(
vtxverbose>=5)std::cout<<
"RecoTrack::projectRecoConstraint()"<<std::endl;
286 (
const_cast<RecoTrack*
>(
this))->updCache(fitparams) ;
287 if(
vtxverbose>=5)std::cout<<
"RecoTrack::projectRecoConstraint() cache updated"<<std::endl;
289 int posindex = mother()->posIndex() ;
290 TVector3 motherpos(fitparams->
par()(posindex+0),
291 fitparams->
par()(posindex+1),
292 fitparams->
par()(posindex+2)) ;
294 int momindex = momIndex() ;
295 double px = fitparams->
par()(momindex+0) ;
296 double py = fitparams->
par()(momindex+1) ;
297 double pz = fitparams->
par()(momindex+2) ;
298 double mom2 = px*px+py*py+pz*
pz ;
302 double qop = charge() /
mom ;
304 double dtxdpx = 1./
pz ;
305 double dtxdpz = -tx/
pz ;
306 double dtydpy = 1./
pz ;
307 double dtydpz = -ty/
pz ;
309 double dqopdpx = - qop * px/mom2 ;
310 double dqopdpy = - qop * py/mom2 ;
311 double dqopdpz = - qop * pz/mom2 ;
313 if(
vtxverbose>=5)std::cout<<
"RecoTrack::projectRecoConstraint() residual"<<std::endl;
315 const TVectorD& m_m = m_state.stateVector() ;
316 const TMatrixD& m_V = m_state.covariance() ;
317 double dz = m_state.z() - motherpos.z() ;
320 std::cout<<
"RecoTrack::projectRecoConstraint() "<<std::endl;
321 std::cout<<
"----------------------"<<std::endl;
322 std::cout<<
" state position: (" <<m_state.x()<<
","<<m_state.y()<<
","<<m_state.z()<<
")"<<std::endl;
323 std::cout<<
" mother pos: (" <<motherpos.x()<<
","<<motherpos.y()<<
","<<motherpos.z()<<
")"<<std::endl;
324 std::cout<<
" state tx,ty,q/p: (" <<m_state.tx()<<
","<<m_state.ty()<<
","<<m_state.qOverP()<<
")"<<std::endl;
325 std::cout<<
" fitpar tx, ty, q/p: (" <<tx<<
","<<ty<<
","<<qop<<
")"<<std::endl;
326 std::cout<<
" drift dz*(tx,ty,1): (" <<dz*tx<<
","<<dz*ty<<
","<<dz<<
")" <<std::endl;
327 std::cout<<
" fitpar mom: (" <<px<<
","<<py<<
","<<pz<<
")"<<std::endl;
328 std::cout<<
" q, mom: (" <<charge()<<
","<<mom<<
")"<<std::endl;
329 std::cout<<
"----------------------"<<std::endl;
332 p.
r(0) = m_m(0) - motherpos.x() - dz*tx ;
333 p.
r(1) = m_m(1) - motherpos.y() - dz*ty ;
334 p.
r(2) = m_m(2) - tx ;
335 p.
r(3) = m_m(3) - ty ;
336 p.
r(4) = m_m(4) - qop ;
338 if(
vtxverbose>=5)std::cout<<
"RecoTrack::projectRecoConstraint() projection"<<std::endl;
341 p.
H(0,posindex+0) = -1 ;
342 p.
H(1,posindex+1) = -1 ;
343 p.
H(0,posindex+2) = tx ;
344 p.
H(1,posindex+2) = ty ;
347 p.
H(0,momindex+0) = -dz * dtxdpx ;
348 p.
H(0,momindex+2) = -dz * dtxdpz ;
349 p.
H(1,momindex+1) = -dz * dtydpy ;
350 p.
H(1,momindex+2) = -dz * dtydpz ;
353 p.
H(2,momindex+0) = -dtxdpx ;
354 p.
H(2,momindex+2) = -dtxdpz ;
355 p.
H(3,momindex+1) = -dtydpy ;
356 p.
H(3,momindex+2) = -dtydpz ;
357 p.
H(4,momindex+0) = -dqopdpx ;
358 p.
H(4,momindex+1) = -dqopdpy ;
359 p.
H(4,momindex+2) = -dqopdpz ;
361 if(
vtxverbose>=5)std::cout<<
"RecoTrack::projectRecoConstraint() covariance"<<std::endl;
368 std::cout<<
"RecoTrack::projectRecoConstraint(): projection is:"<<posindex<<std::endl;
369 std::cout<<
"r "; p.
r().Print();
370 std::cout<<
"V "; p.
V().Print();
373 if(
vtxverbose>=5)std::cout<<
"RecoTrack::projectRecoConstraint() finished"<<std::endl;
const TVectorD & r() const
const RhoCandidate * m_candidate
ErrCode updCache(const FitParams *fitparams)
friend F32vec4 sqrt(const F32vec4 &a)
RecoTrack(RhoCandidate *bc, const ParticleBase *mother, const Configuration &config)
virtual ErrCode projectRecoConstraint(const FitParams *, Projection &) const
const TMatrixD & H() const
TVectorD symdiag(const TMatrixDSym &m)
const DecayTreeFitter::State & closestCachedState(double z)
const TMatrixDSym & V() const
DecayTreeFitter::State m_state
virtual ErrCode initPar2(FitParams *)
virtual ErrCode initCov(FitParams *)
void state(DecayTreeFitter::State &aState, RhoCandidate *track) const
TMatrixT< double > TMatrixD
const RecoTrackStateProvider * m_stateprovider
double & Vfast(int row, int col)