4#include "VertexFit/BField.h"
5#include "VertexFit/HTrackParameter.h"
6#include "VertexFit/VertexConstraints.h"
7#include "VertexFit/VertexFit.h"
9const int VertexFit::NTRKPAR = 6;
10const int VertexFit::NVTXPAR = 3;
11const int VertexFit::NCONSTR = 2;
16 if ( m_pointer )
return m_pointer;
17 m_pointer =
new VertexFit();
25VertexFit::VertexFit() { ; }
40 m_vpar_origin.clear();
45 m_virtual_wtrk.clear();
50 m_TRA = HepMatrix( 6, 7, 0 );
57 m_TRB = HepMatrix( 7, 6, 0 );
72 std::vector<int> tlis =
AddList(
n );
76 m_vpar_origin.push_back(
vpar );
77 m_vpar_infit.push_back(
vpar );
78 if ( (
unsigned int)number != m_vc.size() - 1 )
79 std::cout <<
"wrong kinematic constraints index" << std::endl;
90 for (
unsigned int i = 0; i < tlis.size(); i++ )
vx +=
wTrackOrigin( tlis[i] ).X();
91 vx =
vx / tlis.size();
94 m_vpar_origin.push_back( n_vpar );
95 m_vpar_infit.push_back( n_vpar );
97 m_virtual_wtrk.push_back( vwtrk );
98 if ( (
unsigned int)number != m_vc.size() - 1 )
99 std::cout <<
"wrong kinematic constraints index" << std::endl;
119 std::vector<int> tlis =
AddList(
n1,
n2, n3, n4, n5 );
125 std::vector<int> tlis =
AddList(
n1,
n2, n3, n4, n5, n6 );
130 int n5,
int n6,
int n7 ) {
131 std::vector<int> tlis =
AddList(
n1,
n2, n3, n4, n5, n6, n7 );
136 int n5,
int n6,
int n7,
int n8 ) {
137 std::vector<int> tlis =
AddList(
n1,
n2, n3, n4, n5, n6, n7, n8 );
142 int n5,
int n6,
int n7,
int n8,
int n9 ) {
143 std::vector<int> tlis =
AddList(
n1,
n2, n3, n4, n5, n6, n7, n8, n9 );
148 int n5,
int n6,
int n7,
int n8,
int n9,
int n10 ) {
149 std::vector<int> tlis =
AddList(
n1,
n2, n3, n4, n5, n6, n7, n8, n9, n10 );
154 int n5,
int n6,
int n7,
int n8,
int n9,
int n10,
int n11 ) {
155 std::vector<int> tlis =
AddList(
n1,
n2, n3, n4, n5, n6, n7, n8, n9, n10, n11 );
160 int n5,
int n6,
int n7,
int n8,
int n9,
int n10,
int n11,
162 std::vector<int> tlis =
AddList(
n1,
n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12 );
169 m_cpu = HepVector( 10, 0 );
170 if (
n < 0 || (
unsigned int)
n >= m_vc.size() )
return okfit;
176 m_pOrigin = HepVector( m_nvtrk * NTRKPAR, 0 );
177 m_pInfit = HepVector( m_nvtrk * NTRKPAR, 0 );
178 m_pcovOrigin = HepSymMatrix( m_nvtrk * NTRKPAR, 0 );
179 m_pcovInfit = HepSymMatrix( m_nvtrk * NTRKPAR, 0 );
182 for (
unsigned int itk = 0; itk < ntrk; itk++ )
186 setPCovOrigin( itk,
wTrackOrigin( itk ).
Ew().similarity( m_TRA ) );
188 m_pInfit = m_pOrigin;
190 m_xOrigin = HepVector( NVTXPAR, 0 );
191 m_xInfit = HepVector( NVTXPAR, 0 );
192 m_xcovOrigin = HepSymMatrix( NVTXPAR, 0 );
193 m_xcovInfit = HepSymMatrix( NVTXPAR, 0 );
194 m_xcovOriginInversed = HepSymMatrix( NVTXPAR, 0 );
195 m_xcovInfitInversed = HepSymMatrix( NVTXPAR, 0 );
197 m_xOrigin = m_vpar_origin[
n].Vx();
198 m_xcovOrigin = m_vpar_origin[
n].Evx();
199 m_xcovOriginInversed = m_xcovOrigin.inverse( ifail );
200 m_xInfit = m_xOrigin;
202 m_vpar_infit[
n] = m_vpar_origin[
n];
204 m_B = HepMatrix( NCONSTR * m_nvtrk, NVTXPAR, 0 );
205 m_A = HepMatrix( NCONSTR * m_nvtrk, NTRKPAR * m_nvtrk, 0 );
206 m_BT = HepMatrix( NVTXPAR, NCONSTR * m_nvtrk, 0 );
207 m_AT = HepMatrix( NTRKPAR * m_nvtrk, NCONSTR * m_nvtrk, 0 );
208 m_G = HepVector( NCONSTR * m_nvtrk, 0 );
209 m_W = HepSymMatrix( NCONSTR * m_nvtrk, 0 );
210 m_E = HepMatrix( NTRKPAR * m_nvtrk, NVTXPAR, 0 );
213 m_cpu[0] += timer.CpuTime();
216 std::vector<double>
chisq;
218 for (
int it = 0; it < m_niter; it++ )
221 UpdateConstraints( m_vc[
n] );
223 m_cpu[1] += timer.CpuTime();
227 m_cpu[2] += timer.CpuTime();
228 chisq.push_back( m_chisq[
n] );
232 if ( fabs( delchi ) < m_chiter )
break;
239 if ( m_chisq[
n] >= m_chicut )
return okfit;
242 m_vpar_infit[
n].setVx( m_xInfit );
243 m_vpar_infit[
n].setEvx( m_xcovInfit );
251 if (
n < 0 || (
unsigned int)
n >= m_vc.size() )
return okfit;
252 for (
unsigned int i = 0; i < ( m_vc[
n].Ltrk() ).size(); i++ )
254 int itk = ( m_vc[
n].Ltrk() )[i];
257 m_vpar_infit[
n] = m_vpar_origin[
n];
260 std::vector<double>
chisq;
262 for (
int it = 0; it < m_niter; it++ )
264 std::vector<WTrackParameter> wlis;
266 for (
unsigned int i = 0; i < ( m_vc[
n].Ltrk() ).size(); i++ )
268 int itk = ( m_vc[
n].Ltrk() )[i];
272 m_vc[
n].UpdateConstraints(
vpar, wlis );
275 chisq.push_back( m_chisq[
n] );
279 if ( fabs( delchi ) < m_chiter )
break;
282 if ( m_chisq[
n] >= m_chicut )
return okfit;
291 for (
unsigned int n = 0;
n < (int)( m_vc.size() );
n++ )
294 if ( m_chisq[
n] >= m_chicut )
return okfit;
296 mychi = mychi + m_chisq[
n];
303void VertexFit::fitVertex(
int n ) {
304 if ( m_chisq.size() == 0 )
306 for (
unsigned int i = 0; i < m_vc.size(); i++ ) m_chisq.push_back( 9999.0 );
309 VertexConstraints vc = m_vc[
n];
312 int NSIZE = ( vc.
Ltrk() ).size();
316 m_xcovInfitInversed = m_xcovOriginInversed;
318 for (
unsigned int i = 0; i < NSIZE; i++ )
320 int itk = ( vc.
Ltrk() )[i];
321 m_xcovInfitInversed += vfW( itk ).similarity( vfBT( itk ) );
323 m_xcovInfit = m_xcovInfitInversed.inverse( ifail );
326 m_KQ = HepMatrix( NVTXPAR, m_nvtrk * NCONSTR, 0 );
327 m_E = HepMatrix( m_nvtrk * NTRKPAR, NVTXPAR, 0 );
328 for (
unsigned int i = 0; i < NSIZE; i++ )
330 int itk = ( vc.
Ltrk() )[i];
331 setKQ( itk, ( m_xcovInfit * vfBT( itk ) * vfW( itk ) ) );
332 setE( itk, ( -pcovOrigin( itk ) * vfAT( itk ) * vfKQ( itk ).T() ) );
335 m_xInfit = m_xOrigin;
336 for (
unsigned int i = 0; i < NSIZE; i++ )
338 int itk = ( vc.
Ltrk() )[i];
339 m_xInfit -= vfKQ( itk ) * vfG( itk );
342 HepVector dq0q( NVTXPAR, 0 );
343 dq0q = m_xcovInfitInversed * ( m_xOrigin - m_xInfit );
344 for (
unsigned int i = 0; i < NSIZE; i++ )
346 int itk = ( vc.
Ltrk() )[i];
347 HepVector
alpha( NTRKPAR, 0 );
348 alpha = pOrigin( itk ) - pcovOrigin( itk ) * vfAT( itk ) *
349 ( vfW( itk ) * vfG( itk ) - vfKQ( itk ).T() * dq0q );
350 setPInfit( itk,
alpha );
353 m_chisq[
n] = ( m_W.similarity( m_G.T() ) -
354 m_xcovInfitInversed.similarity( ( m_xInfit - m_xOrigin ).T() ) )[0][0];
357void VertexFit::vertexCovMatrix(
int n ) {
361 VertexConstraints vc = m_vc[
n];
363 unsigned int NSIZE = vc.
Ltrk().size();
365 m_pcovInfit = HepSymMatrix( NTRKPAR * m_nvtrk, 0 );
366 for (
unsigned int i = 0; i < NSIZE; i++ )
368 int itk = vc.
Ltrk()[i];
369 setPCovInfit( itk, pcovOrigin( itk ) -
370 vfW( itk ).similarity( pcovOrigin( itk ) * vfAT( itk ) ) );
372 m_pcovInfit = m_pcovInfit + m_xcovInfitInversed.similarity( m_E );
375 m_cpu[3] += timer.CpuTime();
378void VertexFit::swimVertex(
int n ) {
393 VertexConstraints vc = m_vc[
n];
394 unsigned int NSIZE = vc.
Ltrk().size();
396 HepMatrix
A( 6, 6, 0 );
400 HepMatrix
B( 6, 3, 0 );
404 HepVector w1( 6, 0 );
405 HepVector w2( 7, 0 );
406 HepSymMatrix
Ew( 7, 0 );
407 HepMatrix ew1( 6, 6, 0 );
408 HepMatrix ew2( 7, 7, 0 );
410 for (
unsigned int i = 0; i < NSIZE; i++ )
412 int itk = vc.
Ltrk()[i];
423 w1 =
A * pInfit( itk ) +
B * m_xInfit;
424 ew1 = pcovInfit( itk ).similarity( A ) + m_xcovInfit.similarity( B ) +
425 A * vfE( itk ) *
B.T() +
B * ( vfE( itk ).T() ) *
A.T();
428 w2 = Convert67(
wtrk.mass(), w1 );
431 m_TRB[3][0] = w2[0] / w2[3];
432 m_TRB[3][1] = w2[1] / w2[3];
433 m_TRB[3][2] = w2[2] / w2[3];
435 ew2 = m_TRB * ew1 * m_TRB.T();
442 m_cpu[4] += timer.CpuTime();
446 assert( p.num_row() == 5 );
447 vertexCovMatrix(
n );
450 HepVector w1( 6, 0 );
451 HepVector w2( 7, 0 );
452 HepSymMatrix ew1( 6, 0 );
453 HepSymMatrix ew2( 7, 0 );
456 ew1 = pcovInfit( itk );
457 w2 = Convert67( wtrk0.
mass(), w1 );
458 m_TRB[3][0] = w2[0] / w2[3];
459 m_TRB[3][1] = w2[1] / w2[3];
460 m_TRB[3][2] = w2[2] / w2[3];
461 ew2 = ew1.similarity( m_TRB );
468 for (
int i = 0; i < 5; i++ )
470 double del = htrk0.
eHel()[i][i] - htrk1.
eHel()[i][i];
471 if ( del == 0.0 ) {
return false; }
472 p[i] = ( htrk0.
helix()[i] - htrk1.
helix()[i] ) / sqrt(
abs( del ) );
477void VertexFit::fitBeam(
int n ) {
537void VertexFit::swimBeam(
int n ) {
602 vertexCovMatrix(
n );
606 HepMatrix A( NTRKPAR, NTRKPAR * m_nvtrk, 0 );
607 HepMatrix B( NTRKPAR, NVTXPAR, 0 );
609 unsigned int NSIZE = vc.
Ltrk().size();
612 HepMatrix Ai( 6, 6, 0 );
616 HepMatrix Bi( 6, 3, 0 );
620 HepVector w1( 6, 0 );
621 HepVector w2( 7, 0 );
622 HepSymMatrix
Ew( 7, 0 );
623 HepMatrix ew1( 6, 6, 0 );
624 HepMatrix ew2( 7, 7, 0 );
627 for (
unsigned int i = 0; i < NSIZE; i++ )
629 int itk = vc.
Ltrk()[i];
644 A.sub( 1, NTRKPAR * itk + 1, Ai );
651 w1 = A * m_pInfit + B * m_xInfit;
652 ew1 = m_pcovInfit.similarity( A ) + m_xcovInfit.similarity( B ) + A * m_E * B.T() +
653 B * ( m_E.T() ) * A.T();
664 m_TRB[3][0] = w1[0] / totalE;
665 m_TRB[3][1] = w1[1] / totalE;
666 m_TRB[3][2] = w1[2] / totalE;
667 ew2 = m_TRB * ew1 * m_TRB.T();
674 m_virtual_wtrk[
n] = vwtrk;
676 m_cpu[5] += timer.CpuTime();
680 int ntrk = ( vc.
Ltrk() ).size();
685 for (
unsigned int i = 0; i < ntrk; i++ )
687 int itk = ( vc.
Ltrk() )[i];
688 HepVector
alpha( 6, 0 );
692 alpha = pInfit( itk );
700 vx =
HepPoint3D( m_xInfit[0], m_xInfit[1], m_xInfit[2] );
707 double a = afield * ( 0.0 +
wTrackOrigin( itk ).charge() );
709 double J = a * ( delx.x() * p.px() + delx.y() * p.py() ) / p.perp2();
710 J = std::min( J, 1 - 1e-4 );
711 J = std::max( J, -1 + 1e-4 );
713 delx.x() - 2 * p.px() * ( delx.x() * p.px() + delx.y() * p.py() ) / p.perp2();
715 delx.y() - 2 * p.py() * ( delx.x() * p.px() + delx.y() * p.py() ) / p.perp2();
716 double S = 1.0 / sqrt( 1 - J * J ) / p.perp2();
718 HepVector
dc( 2, 0 );
719 dc[0] = delx.y() * p.px() - delx.x() * p.py() -
720 0.5 * a * ( delx.x() * delx.x() + delx.y() * delx.y() );
721 dc[1] = delx.z() - p.pz() / a * asin( J );
724 HepMatrix Ec( 2, 3, 0 );
727 HepMatrix Dc( 2, 6, 0 );
729 Dc[0][1] = -delx.x();
731 Dc[0][3] = p.py() + a * delx.x();
732 Dc[0][4] = -p.px() + a * delx.y();
734 Dc[1][0] = -p.pz() * S * Rx;
735 Dc[1][1] = -p.pz() * S * Ry;
736 Dc[1][2] = -asin( J ) / a;
737 Dc[1][3] = p.px() * p.pz() * S;
738 Dc[1][4] = p.py() * p.pz() * S;
743 HepSymMatrix vd( 2, 0 );
745 vd = pcovOrigin( itk ).similarity( Dc );
753 for (
unsigned int i = 0; i < ntrk; i++ )
755 int itk = ( vc.
Ltrk() )[i];
756 HepVector
alpha( 6, 0 );
760 alpha = pInfit( itk );
770 vx =
HepPoint3D( m_xInfit[0], m_xInfit[1], m_xInfit[2] );
776 HepVector
dc( 2, 0 );
777 dc[0] = p.pz() * delx.x() - p.px() * delx.z();
778 dc[1] = p.pz() * delx.y() - p.py() * delx.z();
780 HepMatrix Ec( 2, 3, 0 );
788 setBT( itk, Ec.T() );
790 HepMatrix Dc( 2, 6, 0 );
791 Dc[0][0] = -delx.z();
798 Dc[1][1] = -delx.z();
804 setAT( itk, Dc.T() );
807 HepSymMatrix vd( 2, 0 );
810 vd = pcovOrigin( itk ).similarity( Dc );
815 HepVector gc( 2, 0 );
816 gc = Dc * ( pOrigin( itk ) - pInfit( itk ) ) + Ec * ( m_xOrigin - m_xInfit ) +
dc;
825 double a = afield * ( 0.0 +
wTrackOrigin( itk ).charge() );
826 double J = a * ( delx.x() * p.px() + delx.y() * p.py() ) / p.perp2();
827 J = std::min( J, 1 - 1e-4 );
828 J = std::max( J, -1 + 1e-4 );
830 delx.x() - 2 * p.px() * ( delx.x() * p.px() + delx.y() * p.py() ) / p.perp2();
832 delx.y() - 2 * p.py() * ( delx.x() * p.px() + delx.y() * p.py() ) / p.perp2();
833 double S = 1.0 / sqrt( 1 - J * J ) / p.perp2();
836 HepVector
dc( 2, 0 );
837 dc[0] = delx.y() * p.px() - delx.x() * p.py() -
838 0.5 * a * ( delx.x() * delx.x() + delx.y() * delx.y() );
839 dc[1] = delx.z() - p.pz() / a * asin( J );
841 HepMatrix Ec( 2, 3, 0 );
842 Ec[0][0] = -p.py() - a * delx.x();
843 Ec[0][1] = p.px() - a * delx.y();
845 Ec[1][0] = -p.px() * p.pz() * S;
846 Ec[1][1] = -p.py() * p.pz() * S;
849 setBT( itk, Ec.T() );
852 HepMatrix Dc( 2, 6, 0 );
854 Dc[0][1] = -delx.x();
856 Dc[0][3] = p.py() + a * delx.x();
857 Dc[0][4] = -p.px() + a * delx.y();
860 Dc[1][0] = -p.pz() * S * Rx;
861 Dc[1][1] = -p.pz() * S * Ry;
862 Dc[1][2] = -asin( J ) / a;
863 Dc[1][3] = p.px() * p.pz() * S;
864 Dc[1][4] = p.py() * p.pz() * S;
867 setAT( itk, Dc.T() );
869 HepSymMatrix vd( 2, 0 );
871 vd = pcovOrigin( itk ).similarity( Dc );
875 HepVector gc( 2, 0 );
876 gc = Dc * ( pOrigin( itk ) - pInfit( itk ) ) + Ec * ( m_xOrigin - m_xInfit ) +
dc;
885HepVector VertexFit::Convert67(
const double&
mass,
const HepVector& p ) {
888 m.sub( 1, p.sub( 1, 3 ) );
889 m.sub( 5, p.sub( 4, 6 ) );
890 m[3] = sqrt(
mass *
mass + p[0] * p[0] + p[1] * p[1] + p[2] * p[2] );
894HepVector VertexFit::Convert76(
const HepVector& p ) {
897 m.sub( 1, p.sub( 1, 3 ) );
898 m.sub( 4, p.sub( 5, 7 ) );
HepGeom::Point3D< double > HepPoint3D
HepSymMatrix eHel() const
std::vector< int > AddList(int n1)
std::vector< WTrackParameter > wTrackInfit() const
void clearGammaShapeList()
std::vector< WTrackParameter > wTrackOrigin() const
void setWTrackInfit(const int n, const WTrackParameter wtrk)
std::vector< int > Ltrk() const
void FixedVertexConstraints(std::vector< int > tlis)
void CommonVertexConstraints(std::vector< int > tlis)
double getCBz(const HepVector &vtx, const HepVector &trackPosition)
static VertexFitBField * instance()
WTrackParameter wtrk(int n) const
HepSymMatrix Ew(int n) const
void AddBeamFit(int number, VertexParameter vpar, int n)
void AddVertex(int number, VertexParameter vpar, std::vector< int > lis)
bool pull(int n, int itk, HepVector &p)
HepPoint3D vx(int n) const
static VertexFit * instance()
VertexParameter vpar(int n) const
void BuildVirtualParticle(int number)
void setVx(const HepPoint3D &vx)
void setEw(const HepSymMatrix &Ew)
void setCharge(const int charge)
void setW(const HepVector &w)