9#include "VertexFit/KalmanVertexFit.h"
10#include "VertexFit/HTrackParameter.h"
11#include "VertexFit/WTrackParameter.h"
19 if ( m_pointer )
return m_pointer;
20 m_pointer =
new KalmanVertexFit();
26KalmanVertexFit::KalmanVertexFit() { ; }
29 m_x = HepVector( 3, 0 );
30 m_C0 = HepSymMatrix( 3, 0 );
31 m_C = HepSymMatrix( 3, 0 );
52 m_chisqCutforTrack = 50;
53 m_maxVertexIteration = 3;
54 m_maxTrackIteration = 5;
55 m_chisqCutforTrackIteration = 0.1;
61 m_C0 = (
vtx.Evx() ).inverse( ifail );
70 std::vector<int> trackid;
71 v.setEvx( m_C.inverse( ifail ) );
77 return m_C.inverse( ifail );
88 m_flag.push_back( 0 );
89 m_chiF.push_back( 999. );
91 HepMatrix A( 5, 3, 0 );
92 HepMatrix B( 5, 3, 0 );
93 HepSymMatrix G( 5, 0 );
95 G = ( htrk.
eHel() ).inverse( ifail );
97 m_hTrkOrigin.push_back( htrk );
100 m_hTrkInfit.push_back( htrk );
107 HepSymMatrix W( 3, 0 );
108 HepSymMatrix GB( 5, 0 );
112 m_GB.push_back( GB );
118 for (
int k = 0; k < m_hTrkOrigin.size(); k++ )
119 if ( m_flag[k] == 0 )
num =
num + 1;
125 std::vector<int> trackid;
126 for (
int k = 0; k < m_hTrkOrigin.size(); k++ )
127 if ( m_flag[k] == 0 ) trackid.push_back(
trackID( k ) );
138 HepVector pp( 3, 0 );
139 HepVector xp( 3, 0 );
140 HepSymMatrix CP( 3, 0 );
145 for (
int iter = 0;
iter < m_maxTrackIteration;
iter++ )
150 updateMatrices( k, pp, xp );
154 HepSymMatrix CK( 3, 0 );
155 CK = CP + ( m_GB[k].similarity( m_A[k].T() ) );
161 x = CK.inverse( ifail ) *
162 ( CP * xp + m_A[k].T() * m_GB[k] * ( m_hTrkOrigin[k].hel() - m_c[k] ) );
163 p = m_W[k] * m_B[k].T() * m_G[k] * ( m_hTrkOrigin[k].hel() - m_c[k] - m_A[k] *
x );
165 HepSymMatrix chif( 1, 0 );
167 CP.similarity( (
x - xp ).T() ) +
168 m_G[k].similarity( ( m_hTrkOrigin[k].hel() - m_c[k] - m_A[k] *
x - m_B[k] * p ).T() );
179 m_chiF[k] = chif[0][0];
184 if ( fabs( delchi ) < m_chisqCutforTrackIteration )
break;
188 if ( m_chiF[k] > m_chisqCutforTrack )
212 HepSymMatrix
C( 3, 0 );
213 C = m_C - m_GB[k].similarity( m_A[k].T() );
214 x =
C.inverse( ifail ) *
215 ( m_C * m_x - m_A[k].T() * m_GB[k] * ( m_hTrkOrigin[k].hel() - m_c[k] ) );
224 for (
int iter = 0;
iter < m_maxVertexIteration;
iter++ )
235 for (
int k = 0; k < m_hTrkOrigin.size(); k++ )
237 if ( m_flag[k] == 1 )
continue;
247 for (
int k = 0; k < m_hTrkOrigin.size(); k++ )
249 if ( m_flag[k] == 1 )
continue;
250 double chi2 =
chiS( k );
257 if ( chi2 > m_chisqCutforTrack )
268 if ( m_flag[k] == 1 )
return 999;
272 HepSymMatrix
C( 3, 0 );
273 C = m_C - m_GB[k].similarity( m_A[k].T() );
274 x =
C.inverse( ifail ) *
275 ( m_C * m_x - m_A[k].T() * m_GB[k] * ( m_hTrkOrigin[k].hel() - m_c[k] ) );
276 p = m_W[k] * m_B[k].T() * m_G[k] * ( m_hTrkOrigin[k].hel() - m_c[k] - m_A[k] * m_x );
277 HepSymMatrix chis( 1, 0 );
279 C.similarity( (
x - m_x ).T() ) +
280 m_G[k].similarity( ( m_hTrkOrigin[k].hel() - m_c[k] - m_A[k] * m_x - m_B[k] * p ).T() );
289 if ( m_flag[k] == 1 )
return;
292 HepVector pp( 3, 0 );
293 HepVector xp( 3, 0 );
294 HepSymMatrix CP( 3, 0 );
299 updateMatrices( k, pp, xp );
300 pp = m_W[k] * m_B[k].T() * m_G[k] * ( m_hTrkOrigin[k].hel() - m_c[k] - m_A[k] * xp );
302 updateMatrices( k, pp, xp );
304 HepVector helix( 5, 0 );
305 helix = m_c[k] + m_A[k] * xp + m_B[k] * pp;
306 HepMatrix E( 3, 3, 0 );
307 E = -CP.inverse( ifail ) * m_A[k].T() * m_G[k] * m_B[k] * m_W[k];
308 HepSymMatrix D( 3, 0 );
309 D = m_W[k] + CP.similarity( E.T() );
311 HepMatrix middle( 5, 5, 0 );
312 HepSymMatrix error( 5, 0 );
313 middle = ( CP.inverse( ifail ) ).similarity( m_A[k] ) + m_A[k] * E * m_B[k].T() +
314 ( m_A[k] * E * m_B[k].T() ).T() + D.similarity( m_B[k] );
315 error.assign( middle );
317 m_hTrkInfit[k].setHel( helix );
318 m_hTrkInfit[k].setEHel( error );
375 if ( m_flag[k] == 1 )
return;
387 return m_hTrkInfit[k];
391 if ( m_flag[k] == 1 )
return m_hTrkOrigin[k].wTrack();
394 HepVector pp( 3, 0 );
395 HepVector xp( 3, 0 );
396 HepSymMatrix CP( 3, 0 );
402 double Energy = sqrt( pp[0] * pp[0] + pp[1] * pp[1] + pp[2] * pp[2] +
mass *
mass );
404 HepMatrix Awtrk( 7, 3, 0 ), Bwtrk( 7, 3, 0 );
405 Awtrk[4][0] = Awtrk[5][1] = Awtrk[6][2] = 1;
406 Bwtrk[0][0] = Bwtrk[1][1] = Bwtrk[2][2] = 1;
407 Bwtrk[3][0] = pp[0] / Energy;
408 Bwtrk[3][1] = pp[1] / Energy;
409 Bwtrk[3][2] = pp[2] / Energy;
412 HepSymMatrix Ew( 7, 0 );
421 HepSymMatrix Gwtrk( 7, 0 );
422 Gwtrk = m_hTrkOrigin[k].wTrack().Ew().inverse( ifail );
423 HepSymMatrix Wwtrk( 3, 0 );
424 Wwtrk = Gwtrk.similarity( Bwtrk.T() ).inverse( ifail );
426 HepMatrix Ewtrk( 3, 3, 0 );
427 Ewtrk = -CP.inverse( ifail ) * Awtrk.T() * Gwtrk * Bwtrk * Wwtrk;
428 HepSymMatrix Dwtrk( 3, 0 );
429 Dwtrk = Wwtrk + CP.similarity( Ewtrk.T() );
431 HepMatrix Ewmiddle( 7, 7, 0 );
432 Ewmiddle = ( CP.inverse( ifail ) ).similarity( Awtrk ) + Awtrk * Ewtrk * Bwtrk.T() +
433 ( Awtrk * Ewtrk * Bwtrk.T() ).T() + Dwtrk.similarity( Bwtrk );
434 Ew.assign( Ewmiddle );
436 wtrk.
setCharge( m_hTrkOrigin[k].charge() );
446void KalmanVertexFit::updateMatrices(
const int k,
const HepVector p,
const HepVector x ) {
456 m_A[k] = he.dHdx( p, x );
457 m_B[k] = he.dHdp( p, x );
460 m_W[k] = ( m_G[k].similarity( m_B[k].T() ) ).inverse( ifail );
461 m_GB[k] = m_G[k] - ( m_W[k].similarity( m_B[k] ) ).similarity( m_G[k] );
462 m_c[k] = he.hel() - m_A[k] * x - m_B[k] * p;
465void KalmanVertexFit::updateMatrices(
const int k ) {
472 updateMatrices( k, p,
x );
476 HepVector n_pull( 5, 0 );
477 n_pull[0] = n_pull[1] = n_pull[2] = n_pull[3] = n_pull[4] = 999.;
478 if ( m_flag[k] == 1 )
return n_pull;
479 for (
int i = 0; i < 5; i++ )
481 double cov = m_hTrkOrigin[k].eHel()[i][i] - m_hTrkInfit[k].eHel()[i][i];
482 if ( cov == 0. )
continue;
483 n_pull[i] = ( m_hTrkOrigin[k].hel()[i] - m_hTrkInfit[k].hel()[i] ) / sqrt( cov );
490 if ( m_flag[k] == 1 )
return pull;
492 double kappa_origin = m_hTrkOrigin[k].kappa();
493 double kappa_infit = m_hTrkInfit[k].kappa();
494 double lamb_origin = m_hTrkOrigin[k].lambda();
495 double lamb_infit = m_hTrkInfit[k].lambda();
497 double Vkappa_origin = m_hTrkOrigin[k].eHel()[2][2];
498 double Vkappa_infit = m_hTrkInfit[k].eHel()[2][2];
499 double Vlamb_origin = m_hTrkOrigin[k].eHel()[4][4];
500 double Vlamb_infit = m_hTrkInfit[k].eHel()[4][4];
501 double V_kappa_lamb_origin = m_hTrkOrigin[k].eHel()[4][2];
502 double V_kappa_lamb_infit = m_hTrkInfit[k].eHel()[4][2];
504 double P_origin = calculationP( kappa_origin, lamb_origin );
510 double P_infit = calculationP( kappa_infit, lamb_infit );
512 double SigmaP_origin = calculationSigmaP( kappa_origin, lamb_origin, Vkappa_origin,
513 Vlamb_origin, V_kappa_lamb_origin );
514 double SigmaP_infit = calculationSigmaP( kappa_infit, lamb_infit, Vkappa_infit, Vlamb_infit,
515 V_kappa_lamb_infit );
516 if ( ( SigmaP_origin - SigmaP_infit ) <= 0. )
return pull;
517 pull = ( P_origin - P_infit ) / sqrt( SigmaP_origin - SigmaP_infit );
523double KalmanVertexFit::calculationP(
const double kappa,
const double lamb ) {
525 P = sqrt( 1 + lamb * lamb ) / kappa;
530double KalmanVertexFit::calculationSigmaP(
const double kappa,
const double lamb,
531 const double Vkappa,
const double Vlamb,
532 const double Vkappa_lamb ) {
534 double dp_dkappa = -sqrt( 1 + lamb * lamb ) / kappa / kappa;
535 double dp_dlamb = lamb / kappa / sqrt( 1 + lamb * lamb );
536 SigmaP = dp_dkappa * dp_dkappa * Vkappa + dp_dlamb * dp_dlamb * Vlamb +
537 2 * dp_dkappa * dp_dlamb * Vkappa_lamb;
double P(RecMdcKalTrack *trk)
**********Class see also m_nmax DOUBLE PRECISION m_amel DOUBLE PRECISION m_x2 DOUBLE PRECISION m_alfinv DOUBLE PRECISION m_Xenph INTEGER m_KeyWtm INTEGER m_idyfs DOUBLE PRECISION m_zini DOUBLE PRECISION m_q2 DOUBLE PRECISION m_Wt_KF DOUBLE PRECISION m_WtCut INTEGER m_KFfin *COMMON c_KarLud $ !Input CMS energy[GeV] $ !CMS energy after beam spread beam strahlung[GeV] $ !Beam energy spread[GeV] $ !z boost due to beam spread $ !electron beam mass *ff pair spectrum $ !minimum v
***************************************************************************************Pseudo Class RRes *****************************************************************************************Parameters and physical constants **Maarten sept ************************************************************************DOUBLE PRECISION xsmu **************************************************************************PARTICLE DATA all others are from PDG *Only resonances with known widths into electron pairs are sept ************************************************************************C Declarations C
HepSymMatrix eHel() const
double pullmomentum(const int k)
void addTrack(const HTrackParameter)
int trackID(const int k) const
HTrackParameter hTrack(const int k) const
WTrackParameter wTrack(const int k, const double mass) const
VertexParameter vtx() const
std::vector< int > trackIDList() const
double chiS(const int k) const
void initVertex(const VertexParameter vtx)
HepVector pull(const int k)
static KalmanVertexFit * instance()
void inverse(const int k)
void setEw(const HepSymMatrix &Ew)
void setCharge(const int charge)
void setW(const HepVector &w)