Belle II Software development
MassFourCFitKFit Class Reference

MassFourCFitKFit is a derived class from KFitBase to perform mass and 4 momentum-constraint kinematical fit. More...

#include <MassFourCFitKFit.h>

Inheritance diagram for MassFourCFitKFit:
KFitBase

Public Member Functions

 MassFourCFitKFit ()
 Construct an object with no argument.
 
 ~MassFourCFitKFit (void)
 Destruct the object.
 
enum KFitError::ECode addMassConstraint (const double m, std::vector< unsigned > &childTrackId)
 Set an invariant mass of daughter particle for the mass-four-momentum-constraint fit.
 
enum KFitError::ECode setVertex (const HepPoint3D &v)
 Set an initial vertex position for the mass-four-momentum-constraint fit.
 
enum KFitError::ECode setVertexError (const CLHEP::HepSymMatrix &e)
 Set an initial vertex error matrix for the mass-four-momentum-constraint fit.
 
enum KFitError::ECode setInvariantMass (const double m)
 Set an invariant mass for the mass-four-momentum-constraint fit.
 
enum KFitError::ECode setFourMomentum (const ROOT::Math::PxPyPzEVector &m)
 Set an 4 Momentum for the mass-four-constraint fit.
 
enum KFitError::ECode setFlagAtDecayPoint (const bool flag)
 Set a flag if to constraint at the decay point in the mass-four-momentum-constraint fit.
 
enum KFitError::ECode fixMass (void)
 Tell the object to fix the last added track property at the invariant mass.
 
enum KFitError::ECode unfixMass (void)
 Tell the object to unfix the last added track property at the invariant mass.
 
enum KFitError::ECode setTrackVertexError (const CLHEP::HepMatrix &e)
 Set a vertex error matrix of the child particle in the addTrack'ed order.
 
enum KFitError::ECode setTrackZeroVertexError (void)
 Indicate no vertex uncertainty in the child particle in the addTrack'ed order.
 
enum KFitError::ECode setCorrelation (const CLHEP::HepMatrix &m) override
 Set a correlation matrix.
 
enum KFitError::ECode setZeroCorrelation (void) override
 Indicate no correlation between tracks.
 
const HepPoint3D getVertex (const int flag=KFitConst::kAfterFit) const
 Get a vertex position.
 
const CLHEP::HepSymMatrix getVertexError (const int flag=KFitConst::kAfterFit) const
 Get a vertex error matrix.
 
double getInvariantMass (void) const
 Get an invariant mass.
 
bool getFlagAtDecayPoint (void) const
 Get a flag if to constraint at the decay point in the mass-four-momentum-constraint fit.
 
bool getFlagFitWithVertex (void) const
 Get a flag if the fit is allowed with moving the vertex position.
 
double getCHIsq (void) const override
 Get a chi-square of the fit.
 
const CLHEP::HepMatrix getTrackVertexError (const int id, const int flag=KFitConst::kAfterFit) const
 Get a vertex error matrix of the track.
 
double getTrackCHIsq (const int id) const override
 Get a chi-square of the track.
 
const CLHEP::HepMatrix getCorrelation (const int id1, const int id2, const int flag=KFitConst::kAfterFit) const override
 Get a correlation matrix between two tracks.
 
enum KFitError::ECode doFit (void)
 Perform a mass-four-momentum-constraint fit.
 
enum KFitError::ECode updateMother (Particle *mother)
 Update mother particle.
 
enum KFitError::ECode addTrack (const KFitTrack &kp)
 Add a track to the fitter object.
 
enum KFitError::ECode addTrack (const CLHEP::HepLorentzVector &p, const HepPoint3D &x, const CLHEP::HepSymMatrix &e, const double q)
 Add a track to the fitter object with specifying its momentum, position, error matrix, and charge.
 
enum KFitError::ECode addParticle (const Particle *particle)
 Add a particle to the fitter.
 
enum KFitError::ECode setMagneticField (const double mf)
 Change a magnetic field from the default value KFitConst::kDefaultMagneticField.
 
enum KFitError::ECode getErrorCode (void) const
 Get a code of the last error.
 
int getTrackCount (void) const
 Get the number of added tracks.
 
virtual int getNDF (void) const
 Get an NDF of the fit.
 
double getMagneticField (void) const
 Get a magnetic field.
 
const CLHEP::HepLorentzVector getTrackMomentum (const int id) const
 Get a Lorentz vector of the track.
 
const HepPoint3D getTrackPosition (const int id) const
 Get a position of the track.
 
const CLHEP::HepSymMatrix getTrackError (const int id) const
 Get an error matrix of the track.
 
const KFitTrack getTrack (const int id) const
 Get a specified track object.
 
bool isFitted (void) const
 Return false if fit is not performed yet or performed fit is failed; otherwise true.
 

Protected Member Functions

const CLHEP::HepSymMatrix makeError1 (const CLHEP::HepLorentzVector &p, const CLHEP::HepMatrix &e) const
 Rebuild an error matrix from a Lorentz vector and an error matrix.
 
const CLHEP::HepMatrix makeError1 (const CLHEP::HepLorentzVector &p1, const CLHEP::HepLorentzVector &p2, const CLHEP::HepMatrix &e) const
 Rebuild an error matrix from a pair of Lorentz vectors and an error matrix.
 
const CLHEP::HepMatrix makeError2 (const CLHEP::HepLorentzVector &p, const CLHEP::HepMatrix &e) const
 Rebuild an error matrix from a Lorentz vector and an error matrix.
 
const CLHEP::HepSymMatrix makeError3 (const CLHEP::HepLorentzVector &p, const CLHEP::HepMatrix &e, const bool is_fix_mass) const
 Rebuild an error matrix from a Lorentz vector and an error matrix.
 
const CLHEP::HepMatrix makeError3 (const CLHEP::HepLorentzVector &p1, const CLHEP::HepLorentzVector &p2, const CLHEP::HepMatrix &e, const bool is_fix_mass1, const bool is_fix_mass2) const
 Rebuild an error matrix from a pair of Lorentz vectors and an error matrix.
 
const CLHEP::HepMatrix makeError4 (const CLHEP::HepLorentzVector &p, const CLHEP::HepMatrix &e) const
 Rebuild an error matrix from a Lorentz vector and an error matrix.
 
enum KFitError::ECode doFit1 (void)
 Perform a fit (used in MassFitKFit::doFit()).
 
enum KFitError::ECode doFit2 (void)
 Perform a fit (used in VertexFitKFit::doFit() and MassVertexFitKFit::doFit()).
 
bool isTrackIDInRange (const int id) const
 Check if the id is in the range.
 
bool isNonZeroEnergy (const CLHEP::HepLorentzVector &p) const
 Check if the energy is non-zero.
 

Protected Attributes

enum KFitError::ECode m_ErrorCode
 Error code.
 
bool m_FlagFitted
 Flag to indicate if the fit is performed and succeeded.
 
std::vector< KFitTrackm_Tracks
 Container of input tracks.
 
std::vector< CLHEP::HepMatrix > m_BeforeCorrelation
 Container of input correlation matrices.
 
CLHEP::HepSymMatrix m_V_al_0
 See J.Tanaka Ph.D (2001) p137 for definition.
 
CLHEP::HepMatrix m_al_0
 See J.Tanaka Ph.D (2001) p136 for definition.
 
CLHEP::HepMatrix m_al_1
 See J.Tanaka Ph.D (2001) p136 for definition.
 
CLHEP::HepMatrix m_al_a
 See J.Tanaka Ph.D (2001) p137 for definition.
 
CLHEP::HepMatrix m_property
 Container of charges and masses.
 
CLHEP::HepMatrix m_D
 See J.Tanaka Ph.D (2001) p137 for definition.
 
CLHEP::HepMatrix m_d
 See J.Tanaka Ph.D (2001) p137 for definition.
 
CLHEP::HepMatrix m_V_D
 See J.Tanaka Ph.D (2001) p138 for definition.
 
CLHEP::HepMatrix m_V_al_1
 See J.Tanaka Ph.D (2001) p138 for definition.
 
CLHEP::HepMatrix m_lam
 See J.Tanaka Ph.D (2001) p137 for definition.
 
CLHEP::HepMatrix m_E
 See J.Tanaka Ph.D (2001) p137 for definition.
 
CLHEP::HepMatrix m_V_E
 See J.Tanaka Ph.D (2001) p138 for definition.
 
CLHEP::HepMatrix m_lam0
 See J.Tanaka Ph.D (2001) p138 for definition.
 
CLHEP::HepMatrix m_v
 See J.Tanaka Ph.D (2001) p137 for definition.
 
CLHEP::HepMatrix m_v_a
 See J.Tanaka Ph.D (2001) p137 for definition.
 
CLHEP::HepMatrix m_V_Dt
 See J.Tanaka Ph.D (2001) p138 for definition.
 
CLHEP::HepMatrix m_Cov_v_al_1
 See J.Tanaka Ph.D (2001) p137 for definition.
 
int m_NDF
 NDF of the fit.
 
double m_CHIsq
 chi-square of the fit.
 
int m_TrackCount
 Number of tracks.
 
int m_NecessaryTrackCount
 Number needed tracks to perform fit.
 
bool m_FlagCorrelation
 Flag whether a correlation among tracks exists.
 
bool m_FlagOverIteration
 Flag whether the iteration count exceeds the limit.
 
double m_MagneticField
 Magnetic field.
 

Private Member Functions

enum KFitError::ECode prepareInputMatrix (void) override
 Build grand matrices for minimum search from input-track properties.
 
enum KFitError::ECode prepareInputSubMatrix (void) override
 Build sub-matrices for minimum search from input-track properties.
 
enum KFitError::ECode prepareCorrelation (void) override
 Build a grand correlation matrix from input-track properties.
 
enum KFitError::ECode prepareOutputMatrix (void) override
 Build an output error matrix.
 
enum KFitError::ECode makeCoreMatrix (void) override
 Build matrices using the kinematical constraint.
 
enum KFitError::ECode calculateNDF (void) override
 Calculate an NDF of the fit.
 

Private Attributes

HepPoint3D m_BeforeVertex
 Vertex position before the fit.
 
CLHEP::HepSymMatrix m_BeforeVertexError
 Vertex error matrix before the fit.
 
std::vector< CLHEP::HepMatrix > m_BeforeTrackVertexError
 array of vertex error matrices before the fit.
 
HepPoint3D m_AfterVertex
 Vertex position after the fit.
 
CLHEP::HepSymMatrix m_AfterVertexError
 Vertex error matrix after the fit.
 
std::vector< CLHEP::HepMatrix > m_AfterTrackVertexError
 array of vertex error matrices after the fit.
 
bool m_FlagTrackVertexError
 Flag to indicate if the vertex error matrix of the child particle is preset.
 
bool m_FlagFitIncludingVertex
 Flag to indicate if the fit is allowed with moving the vertex position.
 
bool m_FlagAtDecayPoint
 Flag controlled by setFlagAtDecayPoint().
 
double m_InvariantMass
 Invariant mass.
 
ROOT::Math::PxPyPzEVector m_FourMomentum
 Four Momentum.
 
std::vector< int > m_IsFixMass
 Array of flags whether the track property is fixed at the mass.
 
int m_ConstraintMassCount
 
std::vector< double > m_ConstraintMassList
 constrained mass
 
std::vector< std::pair< int, int > > m_ConstraintMassChildLists
 Daughter track id of constrained particle.
 

Detailed Description

MassFourCFitKFit is a derived class from KFitBase to perform mass and 4 momentum-constraint kinematical fit.

Definition at line 30 of file MassFourCFitKFit.h.

Constructor & Destructor Documentation

◆ MassFourCFitKFit()

Construct an object with no argument.

Definition at line 25 of file MassFourCFitKFit.cc.

25 : m_AfterVertexError(HepSymMatrix(3, 0)),
26 m_FourMomentum(PxPyPzEVector())
27{
28 m_FlagFitted = false;
31 m_FlagAtDecayPoint = true;
33 m_InvariantMass = -1.0;
37}
int m_NecessaryTrackCount
Number needed tracks to perform fit.
Definition: KFitBase.h:303
bool m_FlagFitted
Flag to indicate if the fit is performed and succeeded.
Definition: KFitBase.h:245
bool m_FlagTrackVertexError
Flag to indicate if the vertex error matrix of the child particle is preset.
bool m_FlagAtDecayPoint
Flag controlled by setFlagAtDecayPoint().
bool m_FlagFitIncludingVertex
Flag to indicate if the fit is allowed with moving the vertex position.
double m_InvariantMass
Invariant mass.
std::vector< std::pair< int, int > > m_ConstraintMassChildLists
Daughter track id of constrained particle.
std::vector< double > m_ConstraintMassList
constrained mass
CLHEP::HepSymMatrix m_AfterVertexError
Vertex error matrix after the fit.
ROOT::Math::PxPyPzEVector m_FourMomentum
Four Momentum.
static const int kMaxTrackCount2
Maximum track size (internal use)
Definition: KFitConst.h:42

Member Function Documentation

◆ addMassConstraint()

enum KFitError::ECode addMassConstraint ( const double  m,
std::vector< unsigned > &  childTrackId 
)

Set an invariant mass of daughter particle for the mass-four-momentum-constraint fit.

Parameters
minvariant mass
childTrackIdvector of daughter track ids
Returns
error code (zero if success)

Definition at line 43 of file MassFourCFitKFit.cc.

43 {
44 if ((childTrackId.back() - childTrackId.front()) != childTrackId.size() - 1)
45 {
47 }
48 m_ConstraintMassList.push_back(m);
49 m_ConstraintMassChildLists.push_back(std::make_pair(childTrackId.front(), childTrackId.back()));
51}
enum KFitError::ECode m_ErrorCode
Error code.
Definition: KFitBase.h:243
@ kOutOfRange
Specified track-id out of range.
Definition: KFitError.h:42

◆ addParticle()

enum KFitError::ECode addParticle ( const Particle particle)
inherited

Add a particle to the fitter.

The function gets track parameters from the Particle dataobject and calls addTrack().

Parameters
[in]particleParticle.
Returns
error code (zero if success)

Definition at line 59 of file KFitBase.cc.

60{
61 return addTrack(
62 ROOTToCLHEP::getHepLorentzVector(particle->get4Vector()),
63 ROOTToCLHEP::getPoint3D(particle->getVertex()),
64 ROOTToCLHEP::getHepSymMatrix(particle->getMomentumVertexErrorMatrix()),
65 particle->getCharge());
66}
enum KFitError::ECode addTrack(const KFitTrack &kp)
Add a track to the fitter object.
Definition: KFitBase.cc:38

◆ addTrack() [1/2]

enum KFitError::ECode addTrack ( const CLHEP::HepLorentzVector &  p,
const HepPoint3D x,
const CLHEP::HepSymMatrix &  e,
const double  q 
)
inherited

Add a track to the fitter object with specifying its momentum, position, error matrix, and charge.

This function internally calls addTrack(const KFitTrack &kp).

Parameters
pLorentz vector of the track
xposition of the track
e(7x7) error matrix of the track
qcharge of the track
Returns
error code (zero if success)

Definition at line 47 of file KFitBase.cc.

47 {
48 if (e.num_row() != KFitConst::kNumber7)
49 {
51 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
52 return m_ErrorCode;
53 }
54
55 return this->addTrack(KFitTrack(p, x, e, q));
56}
static void displayError(const char *file, const int line, const char *func, const enum ECode code)
Display a description of error and its location.
Definition: KFitError.h:72
@ kBadMatrixSize
Wrong correlation matrix size.
Definition: KFitError.h:49
KFitTrack is a container of the track information (Lorentz vector, position, and error matrix),...
Definition: KFitTrack.h:38
static const int kNumber7
Constant 7 to check matrix size (internal use)
Definition: KFitConst.h:32

◆ addTrack() [2/2]

enum KFitError::ECode addTrack ( const KFitTrack kp)
inherited

Add a track to the fitter object.

Parameters
kpobject of the track
Returns
error code (zero if success)

Definition at line 38 of file KFitBase.cc.

38 {
39 m_Tracks.push_back(p);
40 m_TrackCount = m_Tracks.size();
41
43}
std::vector< KFitTrack > m_Tracks
Container of input tracks.
Definition: KFitBase.h:249
int m_TrackCount
Number of tracks.
Definition: KFitBase.h:301

◆ calculateNDF()

enum KFitError::ECode calculateNDF ( void  )
overrideprivatevirtual

Calculate an NDF of the fit.

Returns
error code (zero if success)

Implements KFitBase.

Definition at line 747 of file MassFourCFitKFit.cc.

747 {
749
751}
int m_NDF
NDF of the fit.
Definition: KFitBase.h:295

◆ doFit()

enum KFitError::ECode doFit ( void  )

Perform a mass-four-momentum-constraint fit.

Returns
error code (zero if success)

Definition at line 298 of file MassFourCFitKFit.cc.

298 {
299 return KFitBase::doFit1();
300}
enum KFitError::ECode doFit1(void)
Perform a fit (used in MassFitKFit::doFit()).
Definition: KFitBase.cc:502

◆ doFit1()

enum KFitError::ECode doFit1 ( void  )
protectedinherited

Perform a fit (used in MassFitKFit::doFit()).

Returns
error code (zero if success)

Definition at line 502 of file KFitBase.cc.

502 {
504
506 {
508 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
509 return m_ErrorCode;
510 }
511
514
515
516 double chisq = 0;
517 double tmp_chisq = KFitConst::kInitialCHIsq;
518 int err_inverse = 0;
519
520 HepMatrix tmp_al_1(m_al_1);
521 HepMatrix tmp_V_al_1(m_V_al_1);
522
523 m_al_a = m_al_0;
524 HepMatrix tmp_al_a(m_al_a);
525
526
527 for (int i = 0; i < KFitConst::kMaxIterationCount; i++)
528 {
530
531 m_V_D = (m_V_al_0.similarity(m_D)).inverse(err_inverse);
532 if (err_inverse != 0) {
534 return m_ErrorCode;
535 }
536
537 m_lam = m_V_D * (m_D * (m_al_0 - m_al_1) + m_d);
538 chisq = ((m_lam.T()) * (m_D * (m_al_0 - m_al_1) + m_d))(1, 1);
539 m_al_1 = m_al_0 - m_V_al_0 * (m_D.T()) * m_lam;
540 m_V_al_1 = m_V_al_0 - m_V_al_0 * (m_D.T()) * m_V_D * m_D * m_V_al_0;
541
542 if (tmp_chisq <= chisq) {
543 if (i == 0) {
545 return m_ErrorCode;
546 } else {
547 chisq = tmp_chisq;
548 m_al_1 = tmp_al_1;
549 m_al_a = tmp_al_a;
550 m_V_al_1 = tmp_V_al_1;
551 break;
552 }
553 } else {
554 tmp_chisq = chisq;
555 tmp_al_a = tmp_al_1;
556 tmp_al_1 = m_al_1;
557 tmp_V_al_1 = m_V_al_1;
558 if (i == KFitConst::kMaxIterationCount - 1) {
559 m_al_a = tmp_al_1;
560 m_FlagOverIteration = true;
561 }
562 }
563 }
564
566
568
569 m_CHIsq = chisq;
570
571 m_FlagFitted = true;
572
574}
virtual enum KFitError::ECode prepareInputMatrix(void)=0
Build grand matrices for minimum search from input-track properties.
virtual enum KFitError::ECode prepareOutputMatrix(void)=0
Build an output error matrix.
CLHEP::HepMatrix m_al_1
See J.Tanaka Ph.D (2001) p136 for definition.
Definition: KFitBase.h:259
CLHEP::HepMatrix m_lam
See J.Tanaka Ph.D (2001) p137 for definition.
Definition: KFitBase.h:276
bool m_FlagOverIteration
Flag whether the iteration count exceeds the limit.
Definition: KFitBase.h:308
CLHEP::HepMatrix m_V_al_1
See J.Tanaka Ph.D (2001) p138 for definition.
Definition: KFitBase.h:274
CLHEP::HepMatrix m_d
See J.Tanaka Ph.D (2001) p137 for definition.
Definition: KFitBase.h:268
CLHEP::HepMatrix m_al_a
See J.Tanaka Ph.D (2001) p137 for definition.
Definition: KFitBase.h:261
CLHEP::HepMatrix m_D
See J.Tanaka Ph.D (2001) p137 for definition.
Definition: KFitBase.h:266
CLHEP::HepMatrix m_V_D
See J.Tanaka Ph.D (2001) p138 for definition.
Definition: KFitBase.h:271
CLHEP::HepSymMatrix m_V_al_0
See J.Tanaka Ph.D (2001) p137 for definition.
Definition: KFitBase.h:255
virtual enum KFitError::ECode makeCoreMatrix(void)=0
Build matrices using the kinematical constraint.
double m_CHIsq
chi-square of the fit.
Definition: KFitBase.h:297
virtual enum KFitError::ECode calculateNDF(void)=0
Calculate an NDF of the fit.
CLHEP::HepMatrix m_al_0
See J.Tanaka Ph.D (2001) p136 for definition.
Definition: KFitBase.h:257
@ kCannotGetMatrixInverse
Cannot calculate matrix inverse (bad track property or internal error)
Definition: KFitError.h:58
@ kBadInitialCHIsq
Bad initial chi-square (internal error)
Definition: KFitError.h:53
@ kBadTrackSize
Track count too small to perform fit.
Definition: KFitError.h:47
static constexpr double kInitialCHIsq
Initial chi-square value (internal use)
Definition: KFitConst.h:48
static const int kMaxIterationCount
Maximum iteration step (internal use)
Definition: KFitConst.h:45

◆ doFit2()

enum KFitError::ECode doFit2 ( void  )
protectedinherited

Perform a fit (used in VertexFitKFit::doFit() and MassVertexFitKFit::doFit()).

Returns
error code (zero if success)

Definition at line 578 of file KFitBase.cc.

578 {
580
582 {
584 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
585 return m_ErrorCode;
586 }
587
590
591
592 double chisq = 0;
593 double tmp2_chisq = KFitConst::kInitialCHIsq;
594 int err_inverse = 0;
595
596 m_al_a = m_al_0;
597 HepMatrix tmp_al_a(m_al_a);
598
599 HepMatrix tmp_D(m_D), tmp_E(m_E);
600 HepMatrix tmp_V_D(m_V_D), tmp_V_E(m_V_E);
601 HepMatrix tmp_lam0(m_lam0), tmp_v_a(m_v_a);
602
603 HepMatrix tmp2_D(m_D), tmp2_E(m_E);
604 HepMatrix tmp2_V_D(m_V_D), tmp2_V_E(m_V_E);
605 HepMatrix tmp2_lam0(m_lam0), tmp2_v_a(m_v_a), tmp2_v(m_v_a);
606
607
608 for (int j = 0; j < KFitConst::kMaxIterationCount; j++) // j'th loop start
609 {
610
611 double tmp_chisq = KFitConst::kInitialCHIsq;
612
613 for (int i = 0; i < KFitConst::kMaxIterationCount; i++) { // i'th loop start
614
617
618 m_V_D = (m_V_al_0.similarity(m_D)).inverse(err_inverse);
619 if (err_inverse) {
621 return m_ErrorCode;
622 }
623
624 m_V_E = ((m_E.T()) * m_V_D * m_E).inverse(err_inverse);
625 if (err_inverse) {
627 return m_ErrorCode;
628 }
629 m_lam0 = m_V_D * (m_D * (m_al_0 - m_al_1) + m_d);
630 chisq = ((m_lam0.T()) * (m_D * (m_al_0 - m_al_1) + m_E * (m_v - m_v_a) + m_d))(1, 1);
631 m_v_a = m_v_a - m_V_E * (m_E.T()) * m_lam0;
632
633 if (tmp_chisq <= chisq) {
634 if (i == 0) {
636 return m_ErrorCode;
637 } else {
638 chisq = tmp_chisq;
639 m_v_a = tmp_v_a;
640 m_V_E = tmp_V_E;
641 m_V_D = tmp_V_D;
642 m_lam0 = tmp_lam0;
643 m_E = tmp_E;
644 m_D = tmp_D;
645 break;
646 }
647 } else {
648 tmp_chisq = chisq;
649 tmp_v_a = m_v_a;
650 tmp_V_E = m_V_E;
651 tmp_V_D = m_V_D;
652 tmp_lam0 = m_lam0;
653 tmp_E = m_E;
654 tmp_D = m_D;
655 if (i == KFitConst::kMaxIterationCount - 1) {
656 m_FlagOverIteration = true;
657 }
658 }
659 } // i'th loop over
660
661
662 m_al_a = m_al_1;
663 m_lam = m_lam0 - m_V_D * m_E * m_V_E * (m_E.T()) * m_lam0;
664 m_al_1 = m_al_0 - m_V_al_0 * (m_D.T()) * m_lam;
665
666 if (j == 0) {
667
668 tmp2_chisq = chisq;
669 tmp2_v_a = m_v_a;
670 tmp2_v = m_v;
671 tmp2_V_E = m_V_E;
672 tmp2_V_D = m_V_D;
673 tmp2_lam0 = m_lam0;
674 tmp2_E = m_E;
675 tmp2_D = m_D;
676 tmp_al_a = m_al_a;
677
678 } else {
679
680 if (tmp2_chisq <= chisq) {
681 chisq = tmp2_chisq;
682 m_v_a = tmp2_v_a;
683 m_v = tmp2_v;
684 m_V_E = tmp2_V_E;
685 m_V_D = tmp2_V_D;
686 m_lam0 = tmp2_lam0;
687 m_E = tmp2_E;
688 m_D = tmp2_D;
689 m_al_a = tmp_al_a;
690 break;
691 } else {
692 tmp2_chisq = chisq;
693 tmp2_v_a = m_v_a;
694 tmp2_v = m_v;
695 tmp2_V_E = m_V_E;
696 tmp2_V_D = m_V_D;
697 tmp2_lam0 = m_lam0;
698 tmp2_E = m_E;
699 tmp2_D = m_D;
700 tmp_al_a = m_al_a;
701 if (j == KFitConst::kMaxIterationCount - 1) {
702 m_FlagOverIteration = true;
703 }
704 }
705 }
706 } // j'th loop over
707
708
710
711 m_lam = m_lam0 - m_V_D * m_E * m_V_E * (m_E.T()) * m_lam0;
712 m_al_1 = m_al_0 - m_V_al_0 * (m_D.T()) * m_lam;
713 m_V_Dt = m_V_D - m_V_D * m_E * m_V_E * (m_E.T()) * m_V_D;
714 m_V_al_1 = m_V_al_0 - m_V_al_0 * (m_D.T()) * m_V_Dt * m_D * m_V_al_0;
715 m_Cov_v_al_1 = -m_V_E * (m_E.T()) * m_V_D * m_D * m_V_al_0;
716
718
719 m_CHIsq = chisq;
720
721 m_FlagFitted = true;
722
724}
CLHEP::HepMatrix m_V_Dt
See J.Tanaka Ph.D (2001) p138 for definition.
Definition: KFitBase.h:289
CLHEP::HepMatrix m_E
See J.Tanaka Ph.D (2001) p137 for definition.
Definition: KFitBase.h:279
virtual enum KFitError::ECode prepareInputSubMatrix(void)=0
Build sub-matrices for minimum search from input-track properties.
CLHEP::HepMatrix m_lam0
See J.Tanaka Ph.D (2001) p138 for definition.
Definition: KFitBase.h:283
CLHEP::HepMatrix m_v_a
See J.Tanaka Ph.D (2001) p137 for definition.
Definition: KFitBase.h:287
CLHEP::HepMatrix m_V_E
See J.Tanaka Ph.D (2001) p138 for definition.
Definition: KFitBase.h:281
CLHEP::HepMatrix m_Cov_v_al_1
See J.Tanaka Ph.D (2001) p137 for definition.
Definition: KFitBase.h:291
CLHEP::HepMatrix m_v
See J.Tanaka Ph.D (2001) p137 for definition.
Definition: KFitBase.h:285

◆ fixMass()

enum KFitError::ECode fixMass ( void  )

Tell the object to fix the last added track property at the invariant mass.

Not intended for end user's use.

Returns
error code (zero if success)

Definition at line 102 of file MassFourCFitKFit.cc.

102 {
103 m_IsFixMass.push_back(true);
104
106}
std::vector< int > m_IsFixMass
Array of flags whether the track property is fixed at the mass.

◆ getCHIsq()

double getCHIsq ( void  ) const
overridevirtual

Get a chi-square of the fit.

Returns
chi-square of the fit

Reimplemented from KFitBase.

Definition at line 211 of file MassFourCFitKFit.cc.

212{
213 return m_CHIsq;
214}

◆ getCorrelation()

const HepMatrix getCorrelation ( const int  id1,
const int  id2,
const int  flag = KFitConst::kAfterFit 
) const
overridevirtual

Get a correlation matrix between two tracks.

Parameters
id1first track id
id2second track id
flagKFitConst::kBeforeFit or KFitConst::kAfterFit
Returns
(7x7) correlation matrix

Reimplemented from KFitBase.

Definition at line 271 of file MassFourCFitKFit.cc.

272{
273 if (flag == KFitConst::kAfterFit && !isFitted()) return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
274 if (!isTrackIDInRange(id1)) return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
275 if (!isTrackIDInRange(id2)) return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
276
277 switch (flag) {
279 return KFitBase::getCorrelation(id1, id2, flag);
280
282 return makeError3(
283 this->getTrackMomentum(id1),
284 this->getTrackMomentum(id2),
285 m_V_al_1.sub(KFitConst::kNumber7 * id1 + 1, KFitConst::kNumber7 * (id1 + 1), KFitConst::kNumber7 * id2 + 1,
286 KFitConst::kNumber7 * (id2 + 1)),
287 m_IsFixMass[id1],
288 m_IsFixMass[id2]);
289
290 default:
291 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kOutOfRange);
292 return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
293 }
294}
const CLHEP::HepSymMatrix makeError3(const CLHEP::HepLorentzVector &p, const CLHEP::HepMatrix &e, const bool is_fix_mass) const
Rebuild an error matrix from a Lorentz vector and an error matrix.
Definition: KFitBase.cc:320
const CLHEP::HepLorentzVector getTrackMomentum(const int id) const
Get a Lorentz vector of the track.
Definition: KFitBase.cc:154
bool isFitted(void) const
Return false if fit is not performed yet or performed fit is failed; otherwise true.
Definition: KFitBase.cc:728
bool isTrackIDInRange(const int id) const
Check if the id is in the range.
Definition: KFitBase.cc:739
virtual const CLHEP::HepMatrix getCorrelation(const int id1, const int id2, const int flag=KFitConst::kAfterFit) const
Get a correlation matrix between two tracks.
Definition: KFitBase.cc:183
static const int kAfterFit
Input parameter to specify after-fit when setting/getting a track attribute.
Definition: KFitConst.h:37
static const int kBeforeFit
Input parameter to specify before-fit when setting/getting a track attribute.
Definition: KFitConst.h:35

◆ getErrorCode()

enum KFitError::ECode getErrorCode ( void  ) const
inherited

Get a code of the last error.

Returns
the last error code

Definition at line 101 of file KFitBase.cc.

101 {
102 return m_ErrorCode;
103}

◆ getFlagAtDecayPoint()

bool getFlagAtDecayPoint ( void  ) const

Get a flag if to constraint at the decay point in the mass-four-momentum-constraint fit.

Returns
flag value

Definition at line 197 of file MassFourCFitKFit.cc.

198{
199 return m_FlagAtDecayPoint;
200}

◆ getFlagFitWithVertex()

bool getFlagFitWithVertex ( void  ) const

Get a flag if the fit is allowed with moving the vertex position.

Returns
flag value

Definition at line 204 of file MassFourCFitKFit.cc.

205{
207}

◆ getInvariantMass()

double getInvariantMass ( void  ) const

Get an invariant mass.

Returns
invariant mass

Definition at line 190 of file MassFourCFitKFit.cc.

191{
192 return m_InvariantMass;
193}

◆ getMagneticField()

double getMagneticField ( void  ) const
inherited

Get a magnetic field.

Returns
magnetic field

Definition at line 128 of file KFitBase.cc.

129{
130 return m_MagneticField;
131}
double m_MagneticField
Magnetic field.
Definition: KFitBase.h:311

◆ getNDF()

int getNDF ( void  ) const
virtualinherited

Get an NDF of the fit.

Returns
NDF of the fit

Definition at line 114 of file KFitBase.cc.

115{
116 return m_NDF;
117}

◆ getTrack()

const KFitTrack getTrack ( const int  id) const
inherited

Get a specified track object.

Parameters
idtrack id
Returns
specified track object

Definition at line 175 of file KFitBase.cc.

176{
177 if (!isTrackIDInRange(id)) return KFitTrack();
178 return m_Tracks[id];
179}

◆ getTrackCHIsq()

double getTrackCHIsq ( const int  id) const
overridevirtual

Get a chi-square of the track.

Parameters
idtrack id
Returns
chi-square of the track

Reimplemented from KFitBase.

Definition at line 235 of file MassFourCFitKFit.cc.

236{
237 if (!isFitted()) return -1;
238 if (!isTrackIDInRange(id)) return -1;
239
240 if (m_IsFixMass[id]) {
241
242 HepMatrix da(m_Tracks[id].getFitParameter(KFitConst::kBeforeFit) - m_Tracks[id].getFitParameter(KFitConst::kAfterFit));
243 int err_inverse = 0;
244 const double chisq = (da.T() * (m_Tracks[id].getFitError(KFitConst::kBeforeFit).inverse(err_inverse)) * da)[0][0];
245
246 if (err_inverse) {
247 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kCannotGetMatrixInverse);
248 return -1;
249 }
250
251 return chisq;
252
253 } else {
254
255 HepMatrix da(m_Tracks[id].getMomPos(KFitConst::kBeforeFit) - m_Tracks[id].getMomPos(KFitConst::kAfterFit));
256 int err_inverse = 0;
257 const double chisq = (da.T() * (m_Tracks[id].getError(KFitConst::kBeforeFit).inverse(err_inverse)) * da)[0][0];
258
259 if (err_inverse) {
260 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kCannotGetMatrixInverse);
261 return -1;
262 }
263
264 return chisq;
265
266 }
267}

◆ getTrackCount()

int getTrackCount ( void  ) const
inherited

Get the number of added tracks.

Returns
the number of added tracks

Definition at line 107 of file KFitBase.cc.

108{
109 return m_TrackCount;
110}

◆ getTrackError()

const HepSymMatrix getTrackError ( const int  id) const
inherited

Get an error matrix of the track.

Parameters
idtrack id
Returns
error matrix of the track

Definition at line 168 of file KFitBase.cc.

169{
170 if (!isTrackIDInRange(id)) return HepSymMatrix(KFitConst::kNumber7, 0);
171 return m_Tracks[id].getError();
172}

◆ getTrackMomentum()

const HepLorentzVector getTrackMomentum ( const int  id) const
inherited

Get a Lorentz vector of the track.

Parameters
idtrack id
Returns
Lorentz vector of the track

Definition at line 154 of file KFitBase.cc.

155{
156 if (!isTrackIDInRange(id)) return HepLorentzVector();
157 return m_Tracks[id].getMomentum();
158}

◆ getTrackPosition()

const HepPoint3D getTrackPosition ( const int  id) const
inherited

Get a position of the track.

Parameters
idtrack id
Returns
position of the track

Definition at line 161 of file KFitBase.cc.

162{
163 if (!isTrackIDInRange(id)) return HepPoint3D();
164 return m_Tracks[id].getPosition();
165}

◆ getTrackVertexError()

const HepMatrix getTrackVertexError ( const int  id,
const int  flag = KFitConst::kAfterFit 
) const

Get a vertex error matrix of the track.

Parameters
idtrack id
flagKFitConst::kBeforeFit or KFitConst::kAfterFit
Returns
vertex error matrix

Definition at line 218 of file MassFourCFitKFit.cc.

219{
220 if (flag == KFitConst::kAfterFit && !isFitted()) return HepMatrix(3, KFitConst::kNumber7, 0);
221 if (!isTrackIDInRange(id)) return HepMatrix(3, KFitConst::kNumber7, 0);
222
223 if (flag == KFitConst::kBeforeFit)
224 return m_BeforeTrackVertexError[id];
226 return m_AfterTrackVertexError[id];
227 else {
228 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kOutOfRange);
229 return HepMatrix(3, KFitConst::kNumber7, 0);
230 }
231}
std::vector< CLHEP::HepMatrix > m_BeforeTrackVertexError
array of vertex error matrices before the fit.
std::vector< CLHEP::HepMatrix > m_AfterTrackVertexError
array of vertex error matrices after the fit.

◆ getVertex()

const HepPoint3D getVertex ( const int  flag = KFitConst::kAfterFit) const

Get a vertex position.

Parameters
flagKFitConst::kBeforeFit or KFitConst::kAfterFit
Returns
vertex position

Definition at line 155 of file MassFourCFitKFit.cc.

156{
157 if (flag == KFitConst::kAfterFit && !isFitted()) return HepPoint3D();
158
159 switch (flag) {
161 return m_BeforeVertex;
162
164 return m_AfterVertex;
165
166 default:
167 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kOutOfRange);
168 return HepPoint3D();
169 }
170}
HepPoint3D m_AfterVertex
Vertex position after the fit.
HepPoint3D m_BeforeVertex
Vertex position before the fit.

◆ getVertexError()

const HepSymMatrix getVertexError ( const int  flag = KFitConst::kAfterFit) const

Get a vertex error matrix.

Parameters
flagKFitConst::kBeforeFit or KFitConst::kAfterFit
Returns
vertex error matrix

Definition at line 174 of file MassFourCFitKFit.cc.

175{
176 if (flag == KFitConst::kAfterFit && !isFitted()) return HepSymMatrix(3, 0);
177
178 if (flag == KFitConst::kBeforeFit)
179 return m_BeforeVertexError;
181 return m_AfterVertexError;
182 else {
183 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kOutOfRange);
184 return HepSymMatrix(3, 0);
185 }
186}
CLHEP::HepSymMatrix m_BeforeVertexError
Vertex error matrix before the fit.

◆ isFitted()

bool isFitted ( void  ) const
inherited

Return false if fit is not performed yet or performed fit is failed; otherwise true.

Returns
see description

Definition at line 728 of file KFitBase.cc.

729{
730 if (m_FlagFitted) return true;
731
732 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kNotFittedYet);
733
734 return false;
735}
@ kNotFittedYet
Not fitted yet.
Definition: KFitError.h:39

◆ isNonZeroEnergy()

bool isNonZeroEnergy ( const CLHEP::HepLorentzVector &  p) const
protectedinherited

Check if the energy is non-zero.

Parameters
pLorentz vector
Returns
true for non-zero energy, false for otherwise

Definition at line 750 of file KFitBase.cc.

751{
752 if (p.t() != 0) return true;
753
754 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kDivisionByZero);
755
756 return false;
757}
@ kDivisionByZero
Division by zero (bad track property or internal error)
Definition: KFitError.h:56

◆ isTrackIDInRange()

bool isTrackIDInRange ( const int  id) const
protectedinherited

Check if the id is in the range.

Parameters
idtrack id
Returns
true if the id is in the range, false otherwise

Definition at line 739 of file KFitBase.cc.

740{
741 if (0 <= id && id < m_TrackCount) return true;
742
743 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kOutOfRange);
744
745 return false;
746}

◆ makeCoreMatrix()

enum KFitError::ECode makeCoreMatrix ( void  )
overrideprivatevirtual

Build matrices using the kinematical constraint.

Returns
error code (zero if success)

Implements KFitBase.

Definition at line 565 of file MassFourCFitKFit.cc.

565 {
567 {
568
569 HepMatrix al_1_prime(m_al_1);
570 HepMatrix Sum_al_1(4, 1, 0);
571 HepMatrix Sum_child_al_1(4 * m_ConstraintMassCount, 1, 0);
572 std::vector<double> energy(m_TrackCount);
573 double a;
574
575 for (int i = 0; i < m_TrackCount; i++) {
576 a = m_property[i][2];
577 if (!m_FlagAtDecayPoint) a = 0.;
578 al_1_prime[i * KFitConst::kNumber7 + 0][0] -= a * (m_BeforeVertex.y() - al_1_prime[i * KFitConst::kNumber7 + 5][0]);
579 al_1_prime[i * KFitConst::kNumber7 + 1][0] += a * (m_BeforeVertex.x() - al_1_prime[i * KFitConst::kNumber7 + 4][0]);
580 energy[i] = sqrt(al_1_prime[i * KFitConst::kNumber7 + 0][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] +
581 al_1_prime[i * KFitConst::kNumber7 + 1][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] +
582 al_1_prime[i * KFitConst::kNumber7 + 2][0] * al_1_prime[i * KFitConst::kNumber7 + 2][0] +
583 m_property[i][1] * m_property[i][1]);
584 if (m_IsFixMass[i])
585 Sum_al_1[3][0] += energy[i];
586 else
587 Sum_al_1[3][0] += al_1_prime[i * KFitConst::kNumber7 + 3][0];
588 }
589
590 for (int i = 0; i < m_TrackCount; i++) {
591 for (int j = 0; j < 3; j++) Sum_al_1[j][0] += al_1_prime[i * KFitConst::kNumber7 + j][0];
592 }
593
594 for (int i = 0; i < m_ConstraintMassCount; i++) {
595 for (int k = m_ConstraintMassChildLists[i].first; k <= m_ConstraintMassChildLists[i].second; k++) {
596 if (m_IsFixMass[k])
597 Sum_child_al_1[i * 4 + 3][0] += energy[k];
598 else
599 Sum_child_al_1[i * 4 + 3][0] += al_1_prime[k * KFitConst::kNumber7 + 3][0];
600 for (int j = 0; j < 3; j++) Sum_child_al_1[i * 4 + j][0] += al_1_prime[k * KFitConst::kNumber7 + j][0];
601 }
602 }
603
604 m_d[0][0] = Sum_al_1[0][0] - m_FourMomentum.Px();
605 m_d[1][0] = Sum_al_1[1][0] - m_FourMomentum.Py();
606 m_d[2][0] = Sum_al_1[2][0] - m_FourMomentum.Pz();
607 m_d[3][0] = Sum_al_1[3][0] - m_FourMomentum.E();
608
609 for (int i = 0; i < m_ConstraintMassCount; i++) {
610 m_d[4 + i][0] =
611 + Sum_child_al_1[i * 4 + 3][0] * Sum_child_al_1[i * 4 + 3][0] - Sum_child_al_1[i * 4 + 0][0] * Sum_child_al_1[i * 4 + 0][0]
612 - Sum_child_al_1[i * 4 + 1][0] * Sum_child_al_1[i * 4 + 1][0] - Sum_child_al_1[i * 4 + 2][0] * Sum_child_al_1[i * 4 + 2][0]
614 }
615
616 for (int i = 0; i < m_TrackCount; i++) {
617 if (energy[i] == 0) {
619 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
620 break;
621 }
622
623 a = m_property[i][2];
624 if (!m_FlagAtDecayPoint) a = 0.;
625
626 // four-momentum conservation constraint
627 for (int l = 0; l < 4; l++) {
628 for (int n = 0; n < 6; n++) {
629 m_D[l][i * KFitConst::kNumber7 + n] = 0;
630 }
631 }
632 if (m_IsFixMass[i]) {
633 double invE = 1. / energy[i];
634 m_D[0][i * KFitConst::kNumber7 + 0] = 1;
635 m_D[0][i * KFitConst::kNumber7 + 5] = -a;
636 m_D[1][i * KFitConst::kNumber7 + 1] = 1;
637 m_D[1][i * KFitConst::kNumber7 + 4] = a;
638 m_D[2][i * KFitConst::kNumber7 + 2] = 1;
639 m_D[3][i * KFitConst::kNumber7 + 0] = al_1_prime[i * KFitConst::kNumber7 + 0][0] * invE;
640 m_D[3][i * KFitConst::kNumber7 + 1] = al_1_prime[i * KFitConst::kNumber7 + 1][0] * invE;
641 m_D[3][i * KFitConst::kNumber7 + 2] = al_1_prime[i * KFitConst::kNumber7 + 2][0] * invE;
642 m_D[3][i * KFitConst::kNumber7 + 4] = -al_1_prime[i * KFitConst::kNumber7 + 1][0] * invE * a;
643 m_D[3][i * KFitConst::kNumber7 + 5] = al_1_prime[i * KFitConst::kNumber7 + 0][0] * invE * a;
644 } else {
645 m_D[0][i * KFitConst::kNumber7 + 0] = 1;
646 m_D[1][i * KFitConst::kNumber7 + 1] = 1;
647 m_D[2][i * KFitConst::kNumber7 + 2] = 1;
648 m_D[3][i * KFitConst::kNumber7 + 3] = 1;
649 }
650
651 // invariant mass constraint
652 for (int l = 0; l < m_ConstraintMassCount; l++) {
653 if (i >= m_ConstraintMassChildLists[l].first && i <= m_ConstraintMassChildLists[l].second) {
654 double invE = 1. / energy[i];
655 m_D[4 + l][i * KFitConst::kNumber7 + 0] = 2.*(Sum_child_al_1[l * 4 + 3][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] * invE -
656 Sum_child_al_1[l * 4 + 0][0]);
657 m_D[4 + l][i * KFitConst::kNumber7 + 1] = 2.*(Sum_child_al_1[l * 4 + 3][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] * invE -
658 Sum_child_al_1[l * 4 + 1][0]);
659 m_D[4 + l][i * KFitConst::kNumber7 + 2] = 2.*(Sum_child_al_1[l * 4 + 3][0] * al_1_prime[i * KFitConst::kNumber7 + 2][0] * invE -
660 Sum_child_al_1[l * 4 + 2][0]);
661 m_D[4 + l][i * KFitConst::kNumber7 + 3] = 0.;
662 m_D[4 + l][i * KFitConst::kNumber7 + 4] = -2.*(Sum_child_al_1[l * 4 + 3][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] * invE -
663 Sum_child_al_1[l * 4 + 1][0]) * a;
664 m_D[4 + l][i * KFitConst::kNumber7 + 5] = 2.*(Sum_child_al_1[l * 4 + 3][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] * invE -
665 Sum_child_al_1[l * 4 + 0][0]) * a;
666 m_D[4 + l][i * KFitConst::kNumber7 + 6] = 0.;
667 } else {
668 for (int n = 0; n < 6; n++) {
669 m_D[4 + l][i * KFitConst::kNumber7 + n] = 0;
670 }
671 }
672 }
673 }
674
675 } else
676 {
677 //TODO: Not Implemented
679
680 // m_FlagFitIncludingVertex == true
681 HepMatrix al_1_prime(m_al_1);
682 HepMatrix Sum_al_1(7, 1, 0);
683 double energy[KFitConst::kMaxTrackCount2];
684
685 for (int i = 0; i < m_TrackCount; i++) {
686 const double a = m_property[i][2];
687 al_1_prime[i * KFitConst::kNumber7 + 0][0] -= a * (al_1_prime[KFitConst::kNumber7 * m_TrackCount + 1][0] - al_1_prime[i *
688 KFitConst::kNumber7 + 5][0]);
689 al_1_prime[i * KFitConst::kNumber7 + 1][0] += a * (al_1_prime[KFitConst::kNumber7 * m_TrackCount + 0][0] - al_1_prime[i *
690 KFitConst::kNumber7 + 4][0]);
691 energy[i] = sqrt(al_1_prime[i * KFitConst::kNumber7 + 0][0] * al_1_prime[i * KFitConst::kNumber7 + 0][0] +
692 al_1_prime[i * KFitConst::kNumber7 + 1][0] * al_1_prime[i * KFitConst::kNumber7 + 1][0] +
693 al_1_prime[i * KFitConst::kNumber7 + 2][0] * al_1_prime[i * KFitConst::kNumber7 + 2][0] +
694 m_property[i][1] * m_property[i][1]);
695 Sum_al_1[6][0] = + a;
696 }
697
698 for (int i = 0; i < m_TrackCount; i++) {
699 if (energy[i] == 0) {
701 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
702 break;
703 }
704
705 if (m_IsFixMass[i]) {
706 double invE = 1. / energy[i];
707 Sum_al_1[3][0] += energy[i];
708 Sum_al_1[4][0] += al_1_prime[i * KFitConst::kNumber7 + 1][0] * m_property[i][2] * invE;
709 Sum_al_1[5][0] += al_1_prime[i * KFitConst::kNumber7 + 0][0] * m_property[i][2] * invE;
710 } else {
711 Sum_al_1[3][0] += al_1_prime[i * KFitConst::kNumber7 + 3][0];
712 }
713
714 for (int j = 0; j < 3; j++) Sum_al_1[j][0] += al_1_prime[i * KFitConst::kNumber7 + j][0];
715 }
716
717 m_d[0][0] = Sum_al_1[0][0] - m_FourMomentum.Px();
718 m_d[1][0] = Sum_al_1[1][0] - m_FourMomentum.Py();
719 m_d[2][0] = Sum_al_1[2][0] - m_FourMomentum.Pz();
720 m_d[3][0] = Sum_al_1[3][0] - m_FourMomentum.E();
721
722 for (int i = 0; i < m_TrackCount; i++) {
723 if (energy[i] == 0) {
725 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
726 break;
727 }
728
729 for (int l = 0; l < 4; l++) {
730 for (int n = 0; n < 6; n++) {
731 if (l == n) m_D[l][i * KFitConst::kNumber7 + n] = 1;
732 else m_D[l][i * KFitConst::kNumber7 + n] = 0;
733 }
734 }
735 }
736
737 m_D[0][KFitConst::kNumber7 * m_TrackCount + 0] = 2.*(Sum_al_1[3][0] * Sum_al_1[4][0] - Sum_al_1[1][0] * Sum_al_1[6][0]);
738 m_D[0][KFitConst::kNumber7 * m_TrackCount + 1] = -2.*(Sum_al_1[3][0] * Sum_al_1[5][0] - Sum_al_1[0][0] * Sum_al_1[6][0]);
739 m_D[0][KFitConst::kNumber7 * m_TrackCount + 2] = 0.;
740 }
741
743}
CLHEP::HepMatrix m_property
Container of charges and masses.
Definition: KFitBase.h:263
@ kUnimplemented
Unprepared.
Definition: KFitError.h:44
double sqrt(double a)
sqrt for double
Definition: beamHelpers.h:28

◆ makeError1() [1/2]

const HepSymMatrix makeError1 ( const CLHEP::HepLorentzVector &  p,
const CLHEP::HepMatrix &  e 
) const
protectedinherited

Rebuild an error matrix from a Lorentz vector and an error matrix.

Parameters
pLorentz vector
e(6x6) error matrix
Returns
(7x7) error matrix

Definition at line 221 of file KFitBase.cc.

222{
223 // self track
224 // Error(6x6,e) ==> Error(7x7,output(hsm)) using Momentum(p).
225
226 if (!isNonZeroEnergy(p)) return HepSymMatrix(KFitConst::kNumber7, 0);
227
228 HepSymMatrix hsm(KFitConst::kNumber7, 0);
229
230 for (int i = 0; i < 3; i++) for (int j = i; j < 3; j++) {
231 hsm[i][j] = e[i][j];
232 hsm[4 + i][4 + j] = e[3 + i][3 + j];
233 }
234 for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) {
235 hsm[i][4 + j] = e[i][3 + j];
236 }
237
238 const double invE = 1 / p.t();
239 hsm[0][3] = (p.x() * hsm[0][0] + p.y() * hsm[0][1] + p.z() * hsm[0][2]) * invE;
240 hsm[1][3] = (p.x() * hsm[0][1] + p.y() * hsm[1][1] + p.z() * hsm[1][2]) * invE;
241 hsm[2][3] = (p.x() * hsm[0][2] + p.y() * hsm[1][2] + p.z() * hsm[2][2]) * invE;
242 hsm[3][3] = (p.x() * p.x() * hsm[0][0] + p.y() * p.y() * hsm[1][1] + p.z() * p.z() * hsm[2][2]
243 + 2.0 * p.x() * p.y() * hsm[0][1]
244 + 2.0 * p.x() * p.z() * hsm[0][2]
245 + 2.0 * p.y() * p.z() * hsm[1][2]) * invE * invE;
246 hsm[3][4] = (p.x() * hsm[0][4] + p.y() * hsm[1][4] + p.z() * hsm[2][4]) * invE;
247 hsm[3][5] = (p.x() * hsm[0][5] + p.y() * hsm[1][5] + p.z() * hsm[2][5]) * invE;
248 hsm[3][6] = (p.x() * hsm[0][6] + p.y() * hsm[1][6] + p.z() * hsm[2][6]) * invE;
249
250 return hsm;
251}
bool isNonZeroEnergy(const CLHEP::HepLorentzVector &p) const
Check if the energy is non-zero.
Definition: KFitBase.cc:750

◆ makeError1() [2/2]

const HepMatrix makeError1 ( const CLHEP::HepLorentzVector &  p1,
const CLHEP::HepLorentzVector &  p2,
const CLHEP::HepMatrix &  e 
) const
protectedinherited

Rebuild an error matrix from a pair of Lorentz vectors and an error matrix.

Parameters
p1first Lorentz vector
p2second Lorentz vector
e(6x6) error matrix
Returns
(7x7) error matrix

Definition at line 255 of file KFitBase.cc.

256{
257 // track and track
258 // Error(6x6,e) ==> Error(7x7,output(hm)) using Momentum(p1&p2).
259
260 if (!isNonZeroEnergy(p1)) return HepSymMatrix(KFitConst::kNumber7, 0);
261 if (!isNonZeroEnergy(p2)) return HepSymMatrix(KFitConst::kNumber7, 0);
262
264
265 for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) {
266 hm[i][j] = e[i][j];
267 hm[4 + i][4 + j] = e[3 + i][3 + j];
268 hm[4 + i][j] = e[3 + i][j];
269 hm[i][4 + j] = e[i][3 + j];
270 }
271
272 const double invE1 = 1 / p1.t();
273 const double invE2 = 1 / p2.t();
274 hm[0][3] = (p2.x() * hm[0][0] + p2.y() * hm[0][1] + p2.z() * hm[0][2]) * invE2;
275 hm[1][3] = (p2.x() * hm[1][0] + p2.y() * hm[1][1] + p2.z() * hm[1][2]) * invE2;
276 hm[2][3] = (p2.x() * hm[2][0] + p2.y() * hm[2][1] + p2.z() * hm[2][2]) * invE2;
277 hm[4][3] = (p2.x() * hm[4][0] + p2.y() * hm[4][1] + p2.z() * hm[4][2]) * invE2;
278 hm[5][3] = (p2.x() * hm[5][0] + p2.y() * hm[5][1] + p2.z() * hm[5][2]) * invE2;
279 hm[6][3] = (p2.x() * hm[6][0] + p2.y() * hm[6][1] + p2.z() * hm[6][2]) * invE2;
280 hm[3][3] = (p1.x() * p2.x() * hm[0][0] + p1.y() * p2.y() * hm[1][1] + p1.z() * p2.z() * hm[2][2] +
281 p1.x() * p2.y() * hm[0][1] + p2.x() * p1.y() * hm[1][0] +
282 p1.x() * p2.z() * hm[0][2] + p2.x() * p1.z() * hm[2][0] +
283 p1.y() * p2.z() * hm[1][2] + p2.y() * p1.z() * hm[2][1]) * invE1 * invE2;
284 hm[3][0] = (p1.x() * hm[0][0] + p1.y() * hm[1][0] + p1.z() * hm[2][0]) * invE1;
285 hm[3][1] = (p1.x() * hm[0][1] + p1.y() * hm[1][1] + p1.z() * hm[2][1]) * invE1;
286 hm[3][2] = (p1.x() * hm[0][2] + p1.y() * hm[1][2] + p1.z() * hm[2][2]) * invE1;
287 hm[3][4] = (p1.x() * hm[0][4] + p1.y() * hm[1][4] + p1.z() * hm[2][4]) * invE1;
288 hm[3][5] = (p1.x() * hm[0][5] + p1.y() * hm[1][5] + p1.z() * hm[2][5]) * invE1;
289 hm[3][6] = (p1.x() * hm[0][6] + p1.y() * hm[1][6] + p1.z() * hm[2][6]) * invE1;
290
291 return hm;
292}

◆ makeError2()

const HepMatrix makeError2 ( const CLHEP::HepLorentzVector &  p,
const CLHEP::HepMatrix &  e 
) const
protectedinherited

Rebuild an error matrix from a Lorentz vector and an error matrix.

Parameters
pLorentz vector
e(3x6) error matrix
Returns
(3x7) error matrix

Definition at line 296 of file KFitBase.cc.

297{
298 // vertex and track
299 // Error(3x6,e) ==> Error(3x7,output(hm)) using Momentum(p).
300
301 if (!isNonZeroEnergy(p)) return HepSymMatrix(KFitConst::kNumber7, 0);
302
303 HepMatrix hm(3, KFitConst::kNumber7, 0);
304
305 for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) {
306 hm[i][j] = e[i][j];
307 hm[i][4 + j] = e[i][3 + j];
308 }
309
310 const double invE = 1 / p.t();
311 hm[0][3] = (p.x() * hm[0][0] + p.y() * hm[0][1] + p.z() * hm[0][2]) * invE;
312 hm[1][3] = (p.x() * hm[1][0] + p.y() * hm[1][1] + p.z() * hm[1][2]) * invE;
313 hm[2][3] = (p.x() * hm[2][0] + p.y() * hm[2][1] + p.z() * hm[2][2]) * invE;
314
315 return hm;
316}

◆ makeError3() [1/2]

const HepSymMatrix makeError3 ( const CLHEP::HepLorentzVector &  p,
const CLHEP::HepMatrix &  e,
const bool  is_fix_mass 
) const
protectedinherited

Rebuild an error matrix from a Lorentz vector and an error matrix.

Parameters
pLorentz vector
e(7x7) error matrix
is_fix_masstrue to recalculate energy term from other parameters, false to do nothing
Returns
(7x7) error matrix

Definition at line 320 of file KFitBase.cc.

321{
322 // self track
323 // Error(7x7,e) ==> Error(7x7,output(hsm)) using Momentum(p).
324 // is_fix_mass = 1 : Energy term is recalculated from the other parameters.
325 // is_fix_mass = 0 : hsm = e.
326
327 if (!isNonZeroEnergy(p)) return HepSymMatrix(KFitConst::kNumber7, 0);
328
329 if (!is_fix_mass) {
330 HepSymMatrix hsm(KFitConst::kNumber7, 0);
331 for (int i = 0; i < 7; i++) for (int j = i; j < 7; j++) {
332 hsm[i][j] = e[i][j];
333 }
334 return hsm;
335 }
336
337 HepSymMatrix hsm(KFitConst::kNumber7, 0);
338
339 for (int i = 0; i < 7; i++) {
340 if (i != 3)
341 for (int j = i; j < 7; j++) hsm[i][j] = e[i][j];
342 }
343
344 double invE = 1 / p.t();
345 hsm[0][3] = (p.x() * hsm[0][0] + p.y() * hsm[0][1] + p.z() * hsm[0][2]) * invE;
346 hsm[1][3] = (p.x() * hsm[0][1] + p.y() * hsm[1][1] + p.z() * hsm[1][2]) * invE;
347 hsm[2][3] = (p.x() * hsm[0][2] + p.y() * hsm[1][2] + p.z() * hsm[2][2]) * invE;
348 hsm[3][3] = (p.x() * p.x() * hsm[0][0] + p.y() * p.y() * hsm[1][1] + p.z() * p.z() * hsm[2][2]
349 + 2.0 * p.x() * p.y() * hsm[0][1]
350 + 2.0 * p.x() * p.z() * hsm[0][2]
351 + 2.0 * p.y() * p.z() * hsm[1][2]) * invE * invE;
352 hsm[3][4] = (p.x() * hsm[0][4] + p.y() * hsm[1][4] + p.z() * hsm[2][4]) * invE;
353 hsm[3][5] = (p.x() * hsm[0][5] + p.y() * hsm[1][5] + p.z() * hsm[2][5]) * invE;
354 hsm[3][6] = (p.x() * hsm[0][6] + p.y() * hsm[1][6] + p.z() * hsm[2][6]) * invE;
355
356 return hsm;
357}

◆ makeError3() [2/2]

const HepMatrix makeError3 ( const CLHEP::HepLorentzVector &  p1,
const CLHEP::HepLorentzVector &  p2,
const CLHEP::HepMatrix &  e,
const bool  is_fix_mass1,
const bool  is_fix_mass2 
) const
protectedinherited

Rebuild an error matrix from a pair of Lorentz vectors and an error matrix.

Parameters
p1first Lorentz vector
p2second Lorentz vector
e(7x7) error matrix
is_fix_mass1true to recalculate energy term from other parameters, false to do nothing
is_fix_mass2true to recalculate energy term from other parameters, false to do nothing
Returns
(7x7) error matrix

Definition at line 361 of file KFitBase.cc.

364{
365 // track and track
366 // Error(7x7,e) ==> Error(7x7,output(hm)) using Momentum(p1&p2).
367 // is_fix_mass = 1 : Energy term is recalculated from the other parameters.
368 // is_fix_mass = 0 : not.
369
370 if (is_fix_mass1 && is_fix_mass2) {
371 if (!isNonZeroEnergy(p1)) return HepSymMatrix(KFitConst::kNumber7, 0);
372 if (!isNonZeroEnergy(p2)) return HepSymMatrix(KFitConst::kNumber7, 0);
373
374 HepMatrix hm(e);
375
376 const double invE1 = 1 / p1.t();
377 const double invE2 = 1 / p2.t();
378 hm[0][3] = (p2.x() * hm[0][0] + p2.y() * hm[0][1] + p2.z() * hm[0][2]) * invE2;
379 hm[1][3] = (p2.x() * hm[1][0] + p2.y() * hm[1][1] + p2.z() * hm[1][2]) * invE2;
380 hm[2][3] = (p2.x() * hm[2][0] + p2.y() * hm[2][1] + p2.z() * hm[2][2]) * invE2;
381 hm[4][3] = (p2.x() * hm[4][0] + p2.y() * hm[4][1] + p2.z() * hm[4][2]) * invE2;
382 hm[5][3] = (p2.x() * hm[5][0] + p2.y() * hm[5][1] + p2.z() * hm[5][2]) * invE2;
383 hm[6][3] = (p2.x() * hm[6][0] + p2.y() * hm[6][1] + p2.z() * hm[6][2]) * invE2;
384 hm[3][0] = (p1.x() * hm[0][0] + p1.y() * hm[1][0] + p1.z() * hm[2][0]) * invE1;
385 hm[3][1] = (p1.x() * hm[0][1] + p1.y() * hm[1][1] + p1.z() * hm[2][1]) * invE1;
386 hm[3][2] = (p1.x() * hm[0][2] + p1.y() * hm[1][2] + p1.z() * hm[2][2]) * invE1;
387 hm[3][3] = (p1.x() * p2.x() * hm[0][0] + p1.y() * p2.y() * hm[1][1] + p1.z() * p2.z() * hm[2][2] +
388 p1.x() * p2.y() * hm[0][1] + p2.x() * p1.y() * hm[1][0] +
389 p1.x() * p2.z() * hm[0][2] + p2.x() * p1.z() * hm[2][0] +
390 p1.y() * p2.z() * hm[1][2] + p2.y() * p1.z() * hm[2][1]) * invE1 * invE2;
391 hm[3][4] = (p1.x() * hm[0][4] + p1.y() * hm[1][4] + p1.z() * hm[2][4]) * invE1;
392 hm[3][5] = (p1.x() * hm[0][5] + p1.y() * hm[1][5] + p1.z() * hm[2][5]) * invE1;
393 hm[3][6] = (p1.x() * hm[0][6] + p1.y() * hm[1][6] + p1.z() * hm[2][6]) * invE1;
394
395 return hm;
396 }
397
398
399 if (is_fix_mass1 && !is_fix_mass2) {
400 if (!isNonZeroEnergy(p1)) return HepSymMatrix(KFitConst::kNumber7, 0);
401
402 HepMatrix hm(e);
403
404 const double invE1 = 1 / p1.t();
405 hm[3][0] = (p1.x() * hm[0][0] + p1.y() * hm[1][0] + p1.z() * hm[2][0]) * invE1;
406 hm[3][1] = (p1.x() * hm[0][1] + p1.y() * hm[1][1] + p1.z() * hm[2][1]) * invE1;
407 hm[3][2] = (p1.x() * hm[0][2] + p1.y() * hm[1][2] + p1.z() * hm[2][2]) * invE1;
408 hm[3][3] = (p1.x() * hm[0][3] + p1.y() * hm[1][3] + p1.z() * hm[2][3]) * invE1;
409 hm[3][4] = (p1.x() * hm[0][4] + p1.y() * hm[1][4] + p1.z() * hm[2][4]) * invE1;
410 hm[3][5] = (p1.x() * hm[0][5] + p1.y() * hm[1][5] + p1.z() * hm[2][5]) * invE1;
411 hm[3][6] = (p1.x() * hm[0][6] + p1.y() * hm[1][6] + p1.z() * hm[2][6]) * invE1;
412
413 return hm;
414 }
415
416
417 if (!is_fix_mass1 && is_fix_mass2) {
418 if (!isNonZeroEnergy(p2)) return HepSymMatrix(KFitConst::kNumber7, 0);
419
420 HepMatrix hm(e);
421
422 const double invE2 = 1 / p2.t();
423 hm[0][3] = (p2.x() * hm[0][0] + p2.y() * hm[0][1] + p2.z() * hm[0][2]) * invE2;
424 hm[1][3] = (p2.x() * hm[1][0] + p2.y() * hm[1][1] + p2.z() * hm[1][2]) * invE2;
425 hm[2][3] = (p2.x() * hm[2][0] + p2.y() * hm[2][1] + p2.z() * hm[2][2]) * invE2;
426 hm[3][3] = (p2.x() * hm[3][0] + p2.y() * hm[3][1] + p2.z() * hm[3][2]) * invE2;
427 hm[4][3] = (p2.x() * hm[4][0] + p2.y() * hm[4][1] + p2.z() * hm[4][2]) * invE2;
428 hm[5][3] = (p2.x() * hm[5][0] + p2.y() * hm[5][1] + p2.z() * hm[5][2]) * invE2;
429 hm[6][3] = (p2.x() * hm[6][0] + p2.y() * hm[6][1] + p2.z() * hm[6][2]) * invE2;
430
431 return hm;
432 }
433
434 return e;
435}

◆ makeError4()

const HepMatrix makeError4 ( const CLHEP::HepLorentzVector &  p,
const CLHEP::HepMatrix &  e 
) const
protectedinherited

Rebuild an error matrix from a Lorentz vector and an error matrix.

Parameters
pLorentz vector
e(3x7) error matrix
Returns
(7x7) error matrix

Definition at line 439 of file KFitBase.cc.

440{
441 // vertex and track
442 // Error(3x7,e) ==> Error(3x7,output(hm)) using Momentum(p).
443 // Energy term is recalculated from the other parameters.
444
445 if (!isNonZeroEnergy(p)) return HepSymMatrix(KFitConst::kNumber7, 0);
446
447 HepMatrix hm(e);
448
449 const double invE = 1 / p.t();
450 hm[0][3] = (p.x() * hm[0][0] + p.y() * hm[0][1] + p.z() * hm[0][2]) * invE;
451 hm[1][3] = (p.x() * hm[1][0] + p.y() * hm[1][1] + p.z() * hm[1][2]) * invE;
452 hm[2][3] = (p.x() * hm[2][0] + p.y() * hm[2][1] + p.z() * hm[2][2]) * invE;
453
454 return hm;
455}

◆ prepareCorrelation()

enum KFitError::ECode prepareCorrelation ( void  )
overrideprivatevirtual

Build a grand correlation matrix from input-track properties.

Returns
error code (zero if success)

Reimplemented from KFitBase.

Definition at line 439 of file MassFourCFitKFit.cc.

439 {
440 if (m_BeforeCorrelation.size() != static_cast<unsigned int>(m_TrackCount * (m_TrackCount - 1) / 2))
441 {
443 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
444 return m_ErrorCode;
445 }
446
447 int row = 0, col = 0;
448
449 for (auto& hm : m_BeforeCorrelation)
450 {
451 // counter
452 row++;
453 if (row == m_TrackCount) {
454 col++;
455 row = col + 1;
456 }
457
458 int ii = 0, jj = 0;
459 for (int i = KFitConst::kNumber7 * row; i < KFitConst::kNumber7 * (row + 1); i++) {
460 for (int j = KFitConst::kNumber7 * col; j < KFitConst::kNumber7 * (col + 1); j++) {
461 m_V_al_0[i][j] = hm[ii][jj];
462 jj++;
463 }
464 jj = 0;
465 ii++;
466 }
467 }
468
470 {
471 //TODO: Not Implemented
473
474 // ...error of vertex
476
477 // ...error matrix between vertex and tracks
479 if (m_BeforeTrackVertexError.size() != (unsigned int)m_TrackCount) {
481 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
482 return m_ErrorCode;
483 }
484
485 int i = 0;
486 for (auto& hm : m_BeforeTrackVertexError) {
487 for (int j = 0; j < 3; j++) for (int k = 0; k < KFitConst::kNumber7; k++) {
489 }
490 i++;
491 }
492 }
493 }
494
496}
std::vector< CLHEP::HepMatrix > m_BeforeCorrelation
Container of input correlation matrices.
Definition: KFitBase.h:251
@ kBadCorrelationSize
Wrong correlation matrix size (internal error)
Definition: KFitError.h:51

◆ prepareInputMatrix()

enum KFitError::ECode prepareInputMatrix ( void  )
overrideprivatevirtual

Build grand matrices for minimum search from input-track properties.

Returns
error code (zero if success)

Implements KFitBase.

Definition at line 304 of file MassFourCFitKFit.cc.

304 {
306 m_d = HepMatrix(4 + m_ConstraintMassCount, 1, 0);
307 m_V_D = HepMatrix(4 + m_ConstraintMassCount, 4 + m_ConstraintMassCount, 0);
308 m_lam = HepMatrix(4 + m_ConstraintMassCount, 1, 0);
309
311 {
313 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
314 return m_ErrorCode;
315 }
316
317 if (m_IsFixMass.size() == 0)
318 {
319 // If no fix_mass flag at all,
320 // all tracks are considered to be fixed at mass.
321 for (int i = 0; i < m_TrackCount; i++) this->fixMass();
322 } else if (m_IsFixMass.size() != (unsigned int)m_TrackCount)
323 {
325 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
326 return m_ErrorCode;
327 }
328
330 {
331 int index = 0;
332 m_al_0 = HepMatrix(KFitConst::kNumber7 * m_TrackCount, 1, 0);
333 m_property = HepMatrix(m_TrackCount, 3, 0);
334 m_V_al_0 = HepSymMatrix(KFitConst::kNumber7 * m_TrackCount, 0);
335
336 for (auto& track : m_Tracks) {
337 // momentum x,y,z and position x,y,z
338 m_al_0[index * KFitConst::kNumber7 + 0][0] = track.getMomentum(KFitConst::kBeforeFit).x();
339 m_al_0[index * KFitConst::kNumber7 + 1][0] = track.getMomentum(KFitConst::kBeforeFit).y();
340 m_al_0[index * KFitConst::kNumber7 + 2][0] = track.getMomentum(KFitConst::kBeforeFit).z();
341 m_al_0[index * KFitConst::kNumber7 + 3][0] = track.getMomentum(KFitConst::kBeforeFit).t();
342 m_al_0[index * KFitConst::kNumber7 + 4][0] = track.getPosition(KFitConst::kBeforeFit).x();
343 m_al_0[index * KFitConst::kNumber7 + 5][0] = track.getPosition(KFitConst::kBeforeFit).y();
344 m_al_0[index * KFitConst::kNumber7 + 6][0] = track.getPosition(KFitConst::kBeforeFit).z();
345 // these error
346 m_V_al_0.sub(index * KFitConst::kNumber7 + 1, track.getError(KFitConst::kBeforeFit));
347 // charge, mass, a
348 m_property[index][0] = track.getCharge();
349 m_property[index][1] = track.getMass();
350 const double c = Belle2::Const::speedOfLight * 1e-4;
351 m_property[index][2] = -c * m_MagneticField * track.getCharge();
352 index++;
353 }
354
355 // error between track and track
356 if (m_FlagCorrelation) {
357 this->prepareCorrelation();
359 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
360 return m_ErrorCode;
361 }
362 }
363
364 // set member matrix
365 m_al_1 = m_al_0;
366
367 // define size of matrix
370
371 } else
372 {
373 //TODO: Not Implemented
375 // m_FlagFitIncludingVertex == true
376 int index = 0;
377 m_al_0 = HepMatrix(KFitConst::kNumber7 * m_TrackCount + 3, 1, 0);
378 m_property = HepMatrix(m_TrackCount, 3, 0);
379 m_V_al_0 = HepSymMatrix(KFitConst::kNumber7 * m_TrackCount + 3, 0);
380
381 for (auto& track : m_Tracks) {
382 // momentum x,y,z and position x,y,z
383 m_al_0[index * KFitConst::kNumber7 + 0][0] = track.getMomentum(KFitConst::kBeforeFit).x();
384 m_al_0[index * KFitConst::kNumber7 + 1][0] = track.getMomentum(KFitConst::kBeforeFit).y();
385 m_al_0[index * KFitConst::kNumber7 + 2][0] = track.getMomentum(KFitConst::kBeforeFit).z();
386 m_al_0[index * KFitConst::kNumber7 + 3][0] = track.getMomentum(KFitConst::kBeforeFit).t();
387 m_al_0[index * KFitConst::kNumber7 + 4][0] = track.getPosition(KFitConst::kBeforeFit).x();
388 m_al_0[index * KFitConst::kNumber7 + 5][0] = track.getPosition(KFitConst::kBeforeFit).y();
389 m_al_0[index * KFitConst::kNumber7 + 6][0] = track.getPosition(KFitConst::kBeforeFit).z();
390 // these error
391 m_V_al_0.sub(index * KFitConst::kNumber7 + 1, track.getError(KFitConst::kBeforeFit));
392 // charge, mass, a
393 m_property[index][0] = track.getCharge();
394 m_property[index][1] = track.getMass();
395 const double c = Belle2::Const::speedOfLight * 1e-4;
396 m_property[index][2] = -c * m_MagneticField * track.getCharge();
397 index++;
398 }
399
400 // vertex
405
406 // error between track and track
407 if (m_FlagCorrelation) {
408 this->prepareCorrelation();
410 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
411 return m_ErrorCode;
412 }
413 }
414
415 // set member matrix
416 m_al_1 = m_al_0;
417
418 // define size of matrix
420 m_D = m_V_al_1.sub(1, 4, 1, KFitConst::kNumber7 * m_TrackCount + 3);
421 }
422
424}
static const double speedOfLight
[cm/ns]
Definition: Const.h:695
bool m_FlagCorrelation
Flag whether a correlation among tracks exists.
Definition: KFitBase.h:306
enum KFitError::ECode prepareCorrelation(void) override
Build a grand correlation matrix from input-track properties.
enum KFitError::ECode fixMass(void)
Tell the object to fix the last added track property at the invariant mass.
static const int kMaxTrackCount
Maximum track size.
Definition: KFitConst.h:40

◆ prepareInputSubMatrix()

enum KFitError::ECode prepareInputSubMatrix ( void  )
overrideprivatevirtual

Build sub-matrices for minimum search from input-track properties.

Returns
error code (zero if success)

Implements KFitBase.

Definition at line 428 of file MassFourCFitKFit.cc.

428 { // unused
429 char buf[1024];
430 sprintf(buf, "%s:%s(): internal error; this function should never be called", __FILE__, __func__);
431 B2FATAL(buf);
432
433 /* NEVER REACHEd HERE */
435}

◆ prepareOutputMatrix()

enum KFitError::ECode prepareOutputMatrix ( void  )
overrideprivatevirtual

Build an output error matrix.

Returns
error code (zero if success)

Implements KFitBase.

Definition at line 500 of file MassFourCFitKFit.cc.

500 {
501 Hep3Vector h3v;
502 int index = 0;
503 for (auto& pdata : m_Tracks)
504 {
505 // tracks
506 // momentum
507 h3v.setX(m_al_1[index * KFitConst::kNumber7 + 0][0]);
508 h3v.setY(m_al_1[index * KFitConst::kNumber7 + 1][0]);
509 h3v.setZ(m_al_1[index * KFitConst::kNumber7 + 2][0]);
510 if (m_IsFixMass[index])
511 pdata.setMomentum(HepLorentzVector(h3v, sqrt(h3v.mag2() + pdata.getMass()*pdata.getMass())), KFitConst::kAfterFit);
512 else
513 pdata.setMomentum(HepLorentzVector(h3v, m_al_1[index * KFitConst::kNumber7 + 3][0]), KFitConst::kAfterFit);
514 // position
515 pdata.setPosition(HepPoint3D(
516 m_al_1[index * KFitConst::kNumber7 + 4][0],
517 m_al_1[index * KFitConst::kNumber7 + 5][0],
519 // error of the tracks
520 pdata.setError(this->makeError3(pdata.getMomentum(),
521 m_V_al_1.sub(
522 index * KFitConst::kNumber7 + 1,
523 (index + 1)*KFitConst::kNumber7,
524 index * KFitConst::kNumber7 + 1,
525 (index + 1)*KFitConst::kNumber7), m_IsFixMass[index]),
527 if (m_ErrorCode != KFitError::kNoError) break;
528 index++;
529 }
530
532 {
533 //TODO: Not Implemented
535 // vertex
539 // error of the vertex
540 for (int i = 0; i < 3; i++) for (int j = i; j < 3; j++) {
542 }
543 // error between vertex and tracks
544 for (int i = 0; i < m_TrackCount; i++) {
545 HepMatrix hm(3, KFitConst::kNumber7, 0);
546 for (int j = 0; j < 3; j++) for (int k = 0; k < KFitConst::kNumber7; k++) {
548 }
549 if (m_IsFixMass[i])
550 m_AfterTrackVertexError.push_back(this->makeError4(m_Tracks[i].getMomentum(), hm));
551 else
552 m_AfterTrackVertexError.push_back(hm);
553 }
554 } else
555 {
556 // not fit
558 }
559
561}
const CLHEP::HepMatrix makeError4(const CLHEP::HepLorentzVector &p, const CLHEP::HepMatrix &e) const
Rebuild an error matrix from a Lorentz vector and an error matrix.
Definition: KFitBase.cc:439

◆ setCorrelation()

enum KFitError::ECode setCorrelation ( const CLHEP::HepMatrix &  c)
overridevirtual

Set a correlation matrix.

Not intended for end user's use.

Parameters
c(7x7) correlation matrix
Returns
error code (zero if success)

Reimplemented from KFitBase.

Definition at line 143 of file MassFourCFitKFit.cc.

143 {
144 return KFitBase::setCorrelation(m);
145}
virtual enum KFitError::ECode setCorrelation(const CLHEP::HepMatrix &c)
Set a correlation matrix.
Definition: KFitBase.cc:70

◆ setFlagAtDecayPoint()

enum KFitError::ECode setFlagAtDecayPoint ( const bool  flag)

Set a flag if to constraint at the decay point in the mass-four-momentum-constraint fit.

Parameters
flagtrue for constraint, false for not
Returns
error code (zero if success)

Definition at line 94 of file MassFourCFitKFit.cc.

94 {
95 m_FlagAtDecayPoint = flag;
96
98}

◆ setFourMomentum()

enum KFitError::ECode setFourMomentum ( const ROOT::Math::PxPyPzEVector &  m)

Set an 4 Momentum for the mass-four-constraint fit.

Parameters
mfour momentum
Returns
error code (zero if success)

Definition at line 86 of file MassFourCFitKFit.cc.

86 {
88
90}

◆ setInvariantMass()

enum KFitError::ECode setInvariantMass ( const double  m)

Set an invariant mass for the mass-four-momentum-constraint fit.

Parameters
minvariant mass
Returns
error code (zero if success)

Definition at line 78 of file MassFourCFitKFit.cc.

78 {
80
82}

◆ setMagneticField()

enum KFitError::ECode setMagneticField ( const double  mf)
inherited

Change a magnetic field from the default value KFitConst::kDefaultMagneticField.

Parameters
mfmagnetic field to set
Returns
error code (zero if success)

Definition at line 93 of file KFitBase.cc.

93 {
94 m_MagneticField = mf;
95
97}

◆ setTrackVertexError()

enum KFitError::ECode setTrackVertexError ( const CLHEP::HepMatrix &  e)

Set a vertex error matrix of the child particle in the addTrack'ed order.

Parameters
e(3x7) vertex error matrix
Returns
error code (zero if success)

Definition at line 118 of file MassFourCFitKFit.cc.

118 {
119 if (e.num_row() != 3 || e.num_col() != KFitConst::kNumber7)
120 {
122 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
123 return m_ErrorCode;
124 }
125
126 m_BeforeTrackVertexError.push_back(e);
129
131}

◆ setTrackZeroVertexError()

enum KFitError::ECode setTrackZeroVertexError ( void  )

Indicate no vertex uncertainty in the child particle in the addTrack'ed order.

Returns
error code (zero if success)

Definition at line 135 of file MassFourCFitKFit.cc.

135 {
136 HepMatrix zero(3, KFitConst::kNumber7, 0);
137
138 return this->setTrackVertexError(zero);
139}
enum KFitError::ECode setTrackVertexError(const CLHEP::HepMatrix &e)
Set a vertex error matrix of the child particle in the addTrack'ed order.

◆ setVertex()

enum KFitError::ECode setVertex ( const HepPoint3D v)

Set an initial vertex position for the mass-four-momentum-constraint fit.

Parameters
vvertex position
Returns
error code (zero if success)

Definition at line 54 of file MassFourCFitKFit.cc.

54 {
56
58}

◆ setVertexError()

enum KFitError::ECode setVertexError ( const CLHEP::HepSymMatrix &  e)

Set an initial vertex error matrix for the mass-four-momentum-constraint fit.

Parameters
evertex error matrix
Returns
error code (zero if success)

Definition at line 62 of file MassFourCFitKFit.cc.

62 {
63 if (e.num_row() != 3)
64 {
66 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
67 return m_ErrorCode;
68 }
69
72
74}

◆ setZeroCorrelation()

enum KFitError::ECode setZeroCorrelation ( void  )
overridevirtual

Indicate no correlation between tracks.

Not intended for end user's use.

Returns
error code (zero if success)

Reimplemented from KFitBase.

Definition at line 149 of file MassFourCFitKFit.cc.

149 {
151}
virtual enum KFitError::ECode setZeroCorrelation(void)
Indicate no correlation between tracks.
Definition: KFitBase.cc:85

◆ unfixMass()

enum KFitError::ECode unfixMass ( void  )

Tell the object to unfix the last added track property at the invariant mass.

Not intended for end user's use.

Returns
error code (zero if success)

Definition at line 110 of file MassFourCFitKFit.cc.

110 {
111 m_IsFixMass.push_back(false);
112
114}

◆ updateMother()

enum KFitError::ECode updateMother ( Particle mother)

Update mother particle.

Parameters
[in]motherMother particle.

Definition at line 753 of file MassFourCFitKFit.cc.

754{
755 MakeMotherKFit kmm;
757 unsigned n = getTrackCount();
758 for (unsigned i = 0; i < n; ++i) {
760 getTrack(i).getCharge());
763 for (unsigned j = i + 1; j < n; ++j) {
765 }
766 }
767 kmm.setVertex(getVertex());
770 m_ErrorCode = kmm.doMake();
772 return m_ErrorCode;
773 double chi2 = getCHIsq();
774 int ndf = getNDF();
775 double prob = TMath::Prob(chi2, ndf);
776 //
777 bool haschi2 = mother->hasExtraInfo("chiSquared");
778 if (haschi2) {
779 mother->setExtraInfo("chiSquared", chi2);
780 mother->setExtraInfo("ndf", ndf);
781 } else {
782 mother->addExtraInfo("chiSquared", chi2);
783 mother->addExtraInfo("ndf", ndf);
784 }
785
786 mother->updateMomentum(
787 CLHEPToROOT::getLorentzVector(kmm.getMotherMomentum()),
788 CLHEPToROOT::getXYZVector(kmm.getMotherPosition()),
789 CLHEPToROOT::getTMatrixFSym(kmm.getMotherError()),
790 prob);
792 return m_ErrorCode;
793}
void setExtraInfo(const std::string &name, double value)
Sets the user-defined data of given name to the given value.
Definition: Particle.cc:1317
bool hasExtraInfo(const std::string &name) const
Return whether the extra info with the given name is set.
Definition: Particle.cc:1266
void addExtraInfo(const std::string &name, double value)
Sets the user-defined data of given name to the given value.
Definition: Particle.cc:1336
void updateMomentum(const ROOT::Math::PxPyPzEVector &p4, const ROOT::Math::XYZVector &vertex, const TMatrixFSym &errMatrix, double pValue)
Sets Lorentz vector, position, 7x7 error matrix and p-value.
Definition: Particle.h:386
const CLHEP::HepSymMatrix getTrackError(const int id) const
Get an error matrix of the track.
Definition: KFitBase.cc:168
const HepPoint3D getTrackPosition(const int id) const
Get a position of the track.
Definition: KFitBase.cc:161
virtual int getNDF(void) const
Get an NDF of the fit.
Definition: KFitBase.cc:114
const KFitTrack getTrack(const int id) const
Get a specified track object.
Definition: KFitBase.cc:175
int getTrackCount(void) const
Get the number of added tracks.
Definition: KFitBase.cc:107
MakeMotherKFit is a class to build mother particle from kinematically fitted daughters.
enum KFitError::ECode setVertex(const HepPoint3D &v)
Set a vertex position of the mother particle.
enum KFitError::ECode addTrack(const KFitTrack &kp)
Add a track to the make-mother object.
enum KFitError::ECode doMake(void)
Perform a reconstruction of mother particle.
const CLHEP::HepSymMatrix getMotherError(void) const
Get an error matrix of the mother particle.
enum KFitError::ECode setCorrelation(const CLHEP::HepMatrix &e)
Set a correlation matrix.
const HepPoint3D getMotherPosition(void) const
Get a position of the mother particle.
enum KFitError::ECode setVertexError(const CLHEP::HepSymMatrix &e)
Set a vertex error matrix of the mother particle.
enum KFitError::ECode setTrackVertexError(const CLHEP::HepMatrix &e)
Set a vertex error matrix of the child particle in the addTrack'ed order.
const CLHEP::HepLorentzVector getMotherMomentum(void) const
Get a Lorentz vector of the mother particle.
enum KFitError::ECode setMagneticField(const double mf)
Change a magnetic field from the default value KFitConst::kDefaultMagneticField.
bool getFlagFitWithVertex(void) const
Get a flag if the fit is allowed with moving the vertex position.
double getCHIsq(void) const override
Get a chi-square of the fit.
const CLHEP::HepMatrix getCorrelation(const int id1, const int id2, const int flag=KFitConst::kAfterFit) const override
Get a correlation matrix between two tracks.
const CLHEP::HepSymMatrix getVertexError(const int flag=KFitConst::kAfterFit) const
Get a vertex error matrix.
const HepPoint3D getVertex(const int flag=KFitConst::kAfterFit) const
Get a vertex position.
const CLHEP::HepMatrix getTrackVertexError(const int id, const int flag=KFitConst::kAfterFit) const
Get a vertex error matrix of the track.

Member Data Documentation

◆ m_AfterTrackVertexError

std::vector<CLHEP::HepMatrix> m_AfterTrackVertexError
private

array of vertex error matrices after the fit.

Definition at line 164 of file MassFourCFitKFit.h.

◆ m_AfterVertex

HepPoint3D m_AfterVertex
private

Vertex position after the fit.

Definition at line 160 of file MassFourCFitKFit.h.

◆ m_AfterVertexError

CLHEP::HepSymMatrix m_AfterVertexError
private

Vertex error matrix after the fit.

Definition at line 162 of file MassFourCFitKFit.h.

◆ m_al_0

CLHEP::HepMatrix m_al_0
protectedinherited

See J.Tanaka Ph.D (2001) p136 for definition.

Definition at line 257 of file KFitBase.h.

◆ m_al_1

CLHEP::HepMatrix m_al_1
protectedinherited

See J.Tanaka Ph.D (2001) p136 for definition.

Definition at line 259 of file KFitBase.h.

◆ m_al_a

CLHEP::HepMatrix m_al_a
protectedinherited

See J.Tanaka Ph.D (2001) p137 for definition.

Definition at line 261 of file KFitBase.h.

◆ m_BeforeCorrelation

std::vector<CLHEP::HepMatrix> m_BeforeCorrelation
protectedinherited

Container of input correlation matrices.

Definition at line 251 of file KFitBase.h.

◆ m_BeforeTrackVertexError

std::vector<CLHEP::HepMatrix> m_BeforeTrackVertexError
private

array of vertex error matrices before the fit.

Definition at line 157 of file MassFourCFitKFit.h.

◆ m_BeforeVertex

HepPoint3D m_BeforeVertex
private

Vertex position before the fit.

Definition at line 153 of file MassFourCFitKFit.h.

◆ m_BeforeVertexError

CLHEP::HepSymMatrix m_BeforeVertexError
private

Vertex error matrix before the fit.

Definition at line 155 of file MassFourCFitKFit.h.

◆ m_CHIsq

double m_CHIsq
protectedinherited

chi-square of the fit.

Definition at line 297 of file KFitBase.h.

◆ m_ConstraintMassChildLists

std::vector<std::pair<int, int> > m_ConstraintMassChildLists
private

Daughter track id of constrained particle.

Definition at line 189 of file MassFourCFitKFit.h.

◆ m_ConstraintMassCount

int m_ConstraintMassCount
private

of constrained mass .

Definition at line 183 of file MassFourCFitKFit.h.

◆ m_ConstraintMassList

std::vector<double> m_ConstraintMassList
private

constrained mass

Definition at line 186 of file MassFourCFitKFit.h.

◆ m_Cov_v_al_1

CLHEP::HepMatrix m_Cov_v_al_1
protectedinherited

See J.Tanaka Ph.D (2001) p137 for definition.

Definition at line 291 of file KFitBase.h.

◆ m_D

CLHEP::HepMatrix m_D
protectedinherited

See J.Tanaka Ph.D (2001) p137 for definition.

Definition at line 266 of file KFitBase.h.

◆ m_d

CLHEP::HepMatrix m_d
protectedinherited

See J.Tanaka Ph.D (2001) p137 for definition.

Definition at line 268 of file KFitBase.h.

◆ m_E

CLHEP::HepMatrix m_E
protectedinherited

See J.Tanaka Ph.D (2001) p137 for definition.

Definition at line 279 of file KFitBase.h.

◆ m_ErrorCode

enum KFitError::ECode m_ErrorCode
protectedinherited

Error code.

Definition at line 243 of file KFitBase.h.

◆ m_FlagAtDecayPoint

bool m_FlagAtDecayPoint
private

Flag controlled by setFlagAtDecayPoint().

Definition at line 171 of file MassFourCFitKFit.h.

◆ m_FlagCorrelation

bool m_FlagCorrelation
protectedinherited

Flag whether a correlation among tracks exists.

Definition at line 306 of file KFitBase.h.

◆ m_FlagFitIncludingVertex

bool m_FlagFitIncludingVertex
private

Flag to indicate if the fit is allowed with moving the vertex position.

Definition at line 169 of file MassFourCFitKFit.h.

◆ m_FlagFitted

bool m_FlagFitted
protectedinherited

Flag to indicate if the fit is performed and succeeded.

Definition at line 245 of file KFitBase.h.

◆ m_FlagOverIteration

bool m_FlagOverIteration
protectedinherited

Flag whether the iteration count exceeds the limit.

Definition at line 308 of file KFitBase.h.

◆ m_FlagTrackVertexError

bool m_FlagTrackVertexError
private

Flag to indicate if the vertex error matrix of the child particle is preset.

Definition at line 167 of file MassFourCFitKFit.h.

◆ m_FourMomentum

ROOT::Math::PxPyPzEVector m_FourMomentum
private

Four Momentum.

Definition at line 177 of file MassFourCFitKFit.h.

◆ m_InvariantMass

double m_InvariantMass
private

Invariant mass.

Definition at line 174 of file MassFourCFitKFit.h.

◆ m_IsFixMass

std::vector<int> m_IsFixMass
private

Array of flags whether the track property is fixed at the mass.

Definition at line 180 of file MassFourCFitKFit.h.

◆ m_lam

CLHEP::HepMatrix m_lam
protectedinherited

See J.Tanaka Ph.D (2001) p137 for definition.

Definition at line 276 of file KFitBase.h.

◆ m_lam0

CLHEP::HepMatrix m_lam0
protectedinherited

See J.Tanaka Ph.D (2001) p138 for definition.

Definition at line 283 of file KFitBase.h.

◆ m_MagneticField

double m_MagneticField
protectedinherited

Magnetic field.

Definition at line 311 of file KFitBase.h.

◆ m_NDF

int m_NDF
protectedinherited

NDF of the fit.

Definition at line 295 of file KFitBase.h.

◆ m_NecessaryTrackCount

int m_NecessaryTrackCount
protectedinherited

Number needed tracks to perform fit.

Definition at line 303 of file KFitBase.h.

◆ m_property

CLHEP::HepMatrix m_property
protectedinherited

Container of charges and masses.

Definition at line 263 of file KFitBase.h.

◆ m_TrackCount

int m_TrackCount
protectedinherited

Number of tracks.

Definition at line 301 of file KFitBase.h.

◆ m_Tracks

std::vector<KFitTrack> m_Tracks
protectedinherited

Container of input tracks.

Definition at line 249 of file KFitBase.h.

◆ m_v

CLHEP::HepMatrix m_v
protectedinherited

See J.Tanaka Ph.D (2001) p137 for definition.

Definition at line 285 of file KFitBase.h.

◆ m_v_a

CLHEP::HepMatrix m_v_a
protectedinherited

See J.Tanaka Ph.D (2001) p137 for definition.

Definition at line 287 of file KFitBase.h.

◆ m_V_al_0

CLHEP::HepSymMatrix m_V_al_0
protectedinherited

See J.Tanaka Ph.D (2001) p137 for definition.

Definition at line 255 of file KFitBase.h.

◆ m_V_al_1

CLHEP::HepMatrix m_V_al_1
protectedinherited

See J.Tanaka Ph.D (2001) p138 for definition.

Definition at line 274 of file KFitBase.h.

◆ m_V_D

CLHEP::HepMatrix m_V_D
protectedinherited

See J.Tanaka Ph.D (2001) p138 for definition.

Definition at line 271 of file KFitBase.h.

◆ m_V_Dt

CLHEP::HepMatrix m_V_Dt
protectedinherited

See J.Tanaka Ph.D (2001) p138 for definition.

Definition at line 289 of file KFitBase.h.

◆ m_V_E

CLHEP::HepMatrix m_V_E
protectedinherited

See J.Tanaka Ph.D (2001) p138 for definition.

Definition at line 281 of file KFitBase.h.


The documentation for this class was generated from the following files: