Belle II Software light-2607-kasei
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:
Collaboration diagram for MassFourCFitKFit:

Public Member Functions

 MassFourCFitKFit ()
 Construct an object with no argument.
 
 ~MassFourCFitKFit (void) override
 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.
 
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.
 
virtual enum KFitError::ECode setCorrelation (const CLHEP::HepMatrix &c)
 Set a correlation matrix.
 
virtual enum KFitError::ECode setZeroCorrelation (void)
 Indicate no correlation between tracks.
 
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

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.
 

Static Protected Member Functions

static CLHEP::HepSymMatrix makeError1 (const CLHEP::HepLorentzVector &p, const CLHEP::HepMatrix &e)
 Rebuild an error matrix from a Lorentz vector and an error matrix.
 
static CLHEP::HepMatrix makeError1 (const CLHEP::HepLorentzVector &p1, const CLHEP::HepLorentzVector &p2, const CLHEP::HepMatrix &e)
 Rebuild an error matrix from a pair of Lorentz vectors and an error matrix.
 
static CLHEP::HepMatrix makeError2 (const CLHEP::HepLorentzVector &p, const CLHEP::HepMatrix &e)
 Rebuild an error matrix from a Lorentz vector and an error matrix.
 
static CLHEP::HepSymMatrix makeError3 (const CLHEP::HepLorentzVector &p, const CLHEP::HepMatrix &e, const bool is_fix_mass)
 Rebuild an error matrix from a Lorentz vector and an error matrix.
 
static 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)
 Rebuild an error matrix from a pair of Lorentz vectors and an error matrix.
 
static CLHEP::HepMatrix makeError4 (const CLHEP::HepLorentzVector &p, const CLHEP::HepMatrix &e)
 Rebuild an error matrix from a Lorentz vector and an error matrix.
 
static bool isNonZeroEnergy (const CLHEP::HepLorentzVector &p)
 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 32 of file MassFourCFitKFit.h.

Constructor & Destructor Documentation

◆ MassFourCFitKFit()

Construct an object with no argument.

Definition at line 26 of file MassFourCFitKFit.cc.

26 : m_AfterVertexError(HepSymMatrix(3, 0)),
27 m_FourMomentum(PxPyPzEVector())
28{
29 m_FlagFitted = false;
32 m_FlagAtDecayPoint = true;
34 m_InvariantMass = -1.0;
38}
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.
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:40

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 44 of file MassFourCFitKFit.cc.

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

◆ 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}
ROOT::Math::XYZVector getVertex() const
Returns vertex position (POCA for charged, IP for neutral FS particles)
Definition Particle.h:651
double getCharge(void) const
Returns particle charge.
Definition Particle.cc:653
ROOT::Math::PxPyPzEVector get4Vector() const
Returns Lorentz vector.
Definition Particle.h:567
TMatrixFSym getMomentumVertexErrorMatrix() const
Returns 7x7 error matrix.
Definition Particle.cc:451
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:71
@ kBadMatrixSize
Wrong correlation matrix size.
Definition KFitError.h:48
static const int kNumber7
Constant 7 to check matrix size (internal use)
Definition KFitConst.h:30

◆ 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 736 of file MassFourCFitKFit.cc.

736 {
738
740}
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 287 of file MassFourCFitKFit.cc.

287 {
288 return KFitBase::doFit1();
289}
enum KFitError::ECode doFit1(void)
Perform a fit (used in MassFitKFit::doFit()).
Definition KFitBase.cc:504

◆ doFit1()

enum KFitError::ECode doFit1 ( void )
protectedinherited

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

Returns
error code (zero if success)

Definition at line 504 of file KFitBase.cc.

504 {
506
508 {
510 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
511 return m_ErrorCode;
512 }
513
516
517
518 double chisq = 0;
519 double tmp_chisq = KFitConst::kInitialCHIsq;
520 int err_inverse = 0;
521
522 HepMatrix tmp_al_1(m_al_1);
523 HepMatrix tmp_V_al_1(m_V_al_1);
524
525 m_al_a = m_al_0;
526 HepMatrix tmp_al_a(m_al_a);
527
528
529 for (int i = 0; i < KFitConst::kMaxIterationCount; i++)
530 {
532
533 m_V_D = (m_V_al_0.similarity(m_D)).inverse(err_inverse);
534 if (err_inverse != 0) {
536 return m_ErrorCode;
537 }
538
539 m_lam = m_V_D * (m_D * (m_al_0 - m_al_1) + m_d);
540 chisq = ((m_lam.T()) * (m_D * (m_al_0 - m_al_1) + m_d))(1, 1);
541 m_al_1 = m_al_0 - m_V_al_0 * (m_D.T()) * m_lam;
542 m_V_al_1 = m_V_al_0 - m_V_al_0 * (m_D.T()) * m_V_D * m_D * m_V_al_0;
543
544 if (tmp_chisq <= chisq) {
545 if (i == 0) {
547 return m_ErrorCode;
548 } else {
549 chisq = tmp_chisq;
550 m_al_1 = tmp_al_1;
551 m_al_a = tmp_al_a;
552 m_V_al_1 = tmp_V_al_1;
553 break;
554 }
555 } else {
556 tmp_chisq = chisq;
557 tmp_al_a = tmp_al_1;
558 tmp_al_1 = m_al_1;
559 tmp_V_al_1 = m_V_al_1;
560 if (i == KFitConst::kMaxIterationCount - 1) {
561 m_al_a = tmp_al_1;
562 m_FlagOverIteration = true;
563 }
564 }
565 }
566
568
570
571 m_CHIsq = chisq;
572
573 m_FlagFitted = true;
574
576}
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:57
@ kBadInitialCHIsq
Bad initial chi-square (internal error)
Definition KFitError.h:52
@ kBadTrackSize
Track count too small to perform fit.
Definition KFitError.h:46
static constexpr double kInitialCHIsq
Initial chi-square value (internal use)
Definition KFitConst.h:46
static const int kMaxIterationCount
Maximum iteration step (internal use)
Definition KFitConst.h:43

◆ 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 580 of file KFitBase.cc.

580 {
582
584 {
586 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
587 return m_ErrorCode;
588 }
589
592
593
594 double chisq = 0;
595 double tmp2_chisq = KFitConst::kInitialCHIsq;
596 int err_inverse = 0;
597
598 m_al_a = m_al_0;
599 HepMatrix tmp_al_a(m_al_a);
600
601 HepMatrix tmp_D(m_D), tmp_E(m_E);
602 HepMatrix tmp_V_D(m_V_D), tmp_V_E(m_V_E);
603 HepMatrix tmp_lam0(m_lam0), tmp_v_a(m_v_a);
604
605 HepMatrix tmp2_D(m_D), tmp2_E(m_E);
606 HepMatrix tmp2_V_D(m_V_D), tmp2_V_E(m_V_E);
607 HepMatrix tmp2_lam0(m_lam0), tmp2_v_a(m_v_a), tmp2_v(m_v_a);
608
609
610 for (int j = 0; j < KFitConst::kMaxIterationCount; j++) // j'th loop start
611 {
612
613 double tmp_chisq = KFitConst::kInitialCHIsq;
614
615 for (int i = 0; i < KFitConst::kMaxIterationCount; i++) { // i'th loop start
616
619
620 m_V_D = (m_V_al_0.similarity(m_D)).inverse(err_inverse);
621 if (err_inverse) {
623 return m_ErrorCode;
624 }
625
626 m_V_E = ((m_E.T()) * m_V_D * m_E).inverse(err_inverse);
627 if (err_inverse) {
629 return m_ErrorCode;
630 }
631 m_lam0 = m_V_D * (m_D * (m_al_0 - m_al_1) + m_d);
632 chisq = ((m_lam0.T()) * (m_D * (m_al_0 - m_al_1) + m_E * (m_v - m_v_a) + m_d))(1, 1);
633 m_v_a = m_v_a - m_V_E * (m_E.T()) * m_lam0;
634
635 if (tmp_chisq <= chisq) {
636 if (i == 0) {
638 return m_ErrorCode;
639 } else {
640 chisq = tmp_chisq;
641 m_v_a = tmp_v_a;
642 m_V_E = tmp_V_E;
643 m_V_D = tmp_V_D;
644 m_lam0 = tmp_lam0;
645 m_E = tmp_E;
646 m_D = tmp_D;
647 break;
648 }
649 } else {
650 tmp_chisq = chisq;
651 tmp_v_a = m_v_a;
652 tmp_V_E = m_V_E;
653 tmp_V_D = m_V_D;
654 tmp_lam0 = m_lam0;
655 tmp_E = m_E;
656 tmp_D = m_D;
657 if (i == KFitConst::kMaxIterationCount - 1) {
658 m_FlagOverIteration = true;
659 }
660 }
661 } // i'th loop over
662
663
664 m_al_a = m_al_1;
665 m_lam = m_lam0 - m_V_D * m_E * m_V_E * (m_E.T()) * m_lam0;
666 m_al_1 = m_al_0 - m_V_al_0 * (m_D.T()) * m_lam;
667
668 if (j == 0) {
669
670 tmp2_chisq = chisq;
671 tmp2_v_a = m_v_a;
672 tmp2_v = m_v;
673 tmp2_V_E = m_V_E;
674 tmp2_V_D = m_V_D;
675 tmp2_lam0 = m_lam0;
676 tmp2_E = m_E;
677 tmp2_D = m_D;
678 tmp_al_a = m_al_a;
679
680 } else {
681
682 if (tmp2_chisq <= chisq) {
683 chisq = tmp2_chisq;
684 m_v_a = tmp2_v_a;
685 m_v = tmp2_v;
686 m_V_E = tmp2_V_E;
687 m_V_D = tmp2_V_D;
688 m_lam0 = tmp2_lam0;
689 m_E = tmp2_E;
690 m_D = tmp2_D;
691 m_al_a = tmp_al_a;
692 break;
693 } else {
694 tmp2_chisq = chisq;
695 tmp2_v_a = m_v_a;
696 tmp2_v = m_v;
697 tmp2_V_E = m_V_E;
698 tmp2_V_D = m_V_D;
699 tmp2_lam0 = m_lam0;
700 tmp2_E = m_E;
701 tmp2_D = m_D;
702 tmp_al_a = m_al_a;
703 if (j == KFitConst::kMaxIterationCount - 1) {
704 m_FlagOverIteration = true;
705 }
706 }
707 }
708 } // j'th loop over
709
710
712
713 m_lam = m_lam0 - m_V_D * m_E * m_V_E * (m_E.T()) * m_lam0;
714 m_al_1 = m_al_0 - m_V_al_0 * (m_D.T()) * m_lam;
715 m_V_Dt = m_V_D - m_V_D * m_E * m_V_E * (m_E.T()) * m_V_D;
716 m_V_al_1 = m_V_al_0 - m_V_al_0 * (m_D.T()) * m_V_Dt * m_D * m_V_al_0;
717 m_Cov_v_al_1 = -m_V_E * (m_E.T()) * m_V_D * m_D * m_V_al_0;
718
720
721 m_CHIsq = chisq;
722
723 m_FlagFitted = true;
724
726}
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 103 of file MassFourCFitKFit.cc.

103 {
104 m_IsFixMass.push_back(true);
105
107}
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 200 of file MassFourCFitKFit.cc.

201{
202 return m_CHIsq;
203}

◆ 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 260 of file MassFourCFitKFit.cc.

261{
262 if (flag == KFitConst::kAfterFit && !isFitted()) return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
263 if (!isTrackIDInRange(id1)) return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
264 if (!isTrackIDInRange(id2)) return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
265
266 switch (flag) {
268 return KFitBase::getCorrelation(id1, id2, flag);
269
271 return makeError3(
272 this->getTrackMomentum(id1),
273 this->getTrackMomentum(id2),
274 m_V_al_1.sub(KFitConst::kNumber7 * id1 + 1, KFitConst::kNumber7 * (id1 + 1), KFitConst::kNumber7 * id2 + 1,
275 KFitConst::kNumber7 * (id2 + 1)),
276 m_IsFixMass[id1],
277 m_IsFixMass[id2]);
278
279 default:
280 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kOutOfRange);
281 return HepMatrix(KFitConst::kNumber7, KFitConst::kNumber7, 0);
282 }
283}
static CLHEP::HepSymMatrix makeError3(const CLHEP::HepLorentzVector &p, const CLHEP::HepMatrix &e, const bool is_fix_mass)
Rebuild an error matrix from a Lorentz vector and an error matrix.
Definition KFitBase.cc:322
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:730
bool isTrackIDInRange(const int id) const
Check if the id is in the range.
Definition KFitBase.cc:741
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:35
static const int kBeforeFit
Input parameter to specify before-fit when setting/getting a track attribute.
Definition KFitConst.h:33

◆ 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 186 of file MassFourCFitKFit.cc.

187{
188 return m_FlagAtDecayPoint;
189}

◆ getFlagFitWithVertex()

bool getFlagFitWithVertex ( void ) const

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

Returns
flag value

Definition at line 193 of file MassFourCFitKFit.cc.

194{
196}

◆ getInvariantMass()

double getInvariantMass ( void ) const

Get an invariant mass.

Returns
invariant mass

Definition at line 179 of file MassFourCFitKFit.cc.

180{
181 return m_InvariantMass;
182}

◆ 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 224 of file MassFourCFitKFit.cc.

225{
226 if (!isFitted()) return -1;
227 if (!isTrackIDInRange(id)) return -1;
228
229 if (m_IsFixMass[id]) {
230
231 HepMatrix da(m_Tracks[id].getFitParameter(KFitConst::kBeforeFit) - m_Tracks[id].getFitParameter(KFitConst::kAfterFit));
232 int err_inverse = 0;
233 const double chisq = (da.T() * (m_Tracks[id].getFitError(KFitConst::kBeforeFit).inverse(err_inverse)) * da)[0][0];
234
235 if (err_inverse) {
236 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kCannotGetMatrixInverse);
237 return -1;
238 }
239
240 return chisq;
241
242 } else {
243
244 HepMatrix da(m_Tracks[id].getMomPos(KFitConst::kBeforeFit) - m_Tracks[id].getMomPos(KFitConst::kAfterFit));
245 int err_inverse = 0;
246 const double chisq = (da.T() * (m_Tracks[id].getError(KFitConst::kBeforeFit).inverse(err_inverse)) * da)[0][0];
247
248 if (err_inverse) {
249 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kCannotGetMatrixInverse);
250 return -1;
251 }
252
253 return chisq;
254
255 }
256}

◆ 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 207 of file MassFourCFitKFit.cc.

208{
209 if (flag == KFitConst::kAfterFit && !isFitted()) return HepMatrix(3, KFitConst::kNumber7, 0);
210 if (!isTrackIDInRange(id)) return HepMatrix(3, KFitConst::kNumber7, 0);
211
212 if (flag == KFitConst::kBeforeFit)
213 return m_BeforeTrackVertexError[id];
215 return m_AfterTrackVertexError[id];
216 else {
217 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kOutOfRange);
218 return HepMatrix(3, KFitConst::kNumber7, 0);
219 }
220}
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 144 of file MassFourCFitKFit.cc.

145{
146 if (flag == KFitConst::kAfterFit && !isFitted()) return HepPoint3D();
147
148 switch (flag) {
150 return m_BeforeVertex;
151
153 return m_AfterVertex;
154
155 default:
156 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kOutOfRange);
157 return HepPoint3D();
158 }
159}
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 163 of file MassFourCFitKFit.cc.

164{
165 if (flag == KFitConst::kAfterFit && !isFitted()) return HepSymMatrix(3, 0);
166
167 if (flag == KFitConst::kBeforeFit)
168 return m_BeforeVertexError;
170 return m_AfterVertexError;
171 else {
172 KFitError::displayError(__FILE__, __LINE__, __func__, KFitError::kOutOfRange);
173 return HepSymMatrix(3, 0);
174 }
175}
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 730 of file KFitBase.cc.

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

◆ isNonZeroEnergy()

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

Check if the energy is non-zero.

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

Definition at line 752 of file KFitBase.cc.

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

◆ 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 741 of file KFitBase.cc.

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

◆ makeCoreMatrix()

enum KFitError::ECode makeCoreMatrix ( void )
overrideprivatevirtual

Build matrices using the kinematical constraint.

Returns
error code (zero if success)

Implements KFitBase.

Definition at line 554 of file MassFourCFitKFit.cc.

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

◆ makeError1() [1/2]

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

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 223 of file KFitBase.cc.

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

◆ makeError1() [2/2]

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

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 257 of file KFitBase.cc.

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

◆ makeError2()

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

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 298 of file KFitBase.cc.

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

◆ makeError3() [1/2]

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

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 322 of file KFitBase.cc.

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

◆ makeError3() [2/2]

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

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 363 of file KFitBase.cc.

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

◆ makeError4()

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

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 441 of file KFitBase.cc.

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

◆ 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 428 of file MassFourCFitKFit.cc.

428 {
429 if (m_BeforeCorrelation.size() != static_cast<unsigned int>(m_TrackCount * (m_TrackCount - 1) / 2))
430 {
432 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
433 return m_ErrorCode;
434 }
435
436 int row = 0, col = 0;
437
438 for (const auto& hm : m_BeforeCorrelation)
439 {
440 // counter
441 row++;
442 if (row == m_TrackCount) {
443 col++;
444 row = col + 1;
445 }
446
447 int ii = 0, jj = 0;
448 for (int i = KFitConst::kNumber7 * row; i < KFitConst::kNumber7 * (row + 1); i++) {
449 for (int j = KFitConst::kNumber7 * col; j < KFitConst::kNumber7 * (col + 1); j++) {
450 m_V_al_0[i][j] = hm[ii][jj];
451 jj++;
452 }
453 jj = 0;
454 ii++;
455 }
456 }
457
459 {
460 //TODO: Not Implemented
462
463 // ...error of vertex
465
466 // ...error matrix between vertex and tracks
468 if (m_BeforeTrackVertexError.size() != (unsigned int)m_TrackCount) {
470 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
471 return m_ErrorCode;
472 }
473
474 int i = 0;
475 for (const auto& hm : m_BeforeTrackVertexError) {
476 for (int j = 0; j < 3; j++) for (int k = 0; k < KFitConst::kNumber7; k++) {
478 }
479 i++;
480 }
481 }
482 }
483
485}
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:50

◆ 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 293 of file MassFourCFitKFit.cc.

293 {
295 m_d = HepMatrix(4 + m_ConstraintMassCount, 1, 0);
296 m_V_D = HepMatrix(4 + m_ConstraintMassCount, 4 + m_ConstraintMassCount, 0);
297 m_lam = HepMatrix(4 + m_ConstraintMassCount, 1, 0);
298
300 {
302 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
303 return m_ErrorCode;
304 }
305
306 if (m_IsFixMass.size() == 0)
307 {
308 // If no fix_mass flag at all,
309 // all tracks are considered to be fixed at mass.
310 for (int i = 0; i < m_TrackCount; i++) this->fixMass();
311 } else if (m_IsFixMass.size() != (unsigned int)m_TrackCount)
312 {
314 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
315 return m_ErrorCode;
316 }
317
319 {
320 int index = 0;
321 m_al_0 = HepMatrix(KFitConst::kNumber7 * m_TrackCount, 1, 0);
322 m_property = HepMatrix(m_TrackCount, 3, 0);
323 m_V_al_0 = HepSymMatrix(KFitConst::kNumber7 * m_TrackCount, 0);
324
325 for (const auto& track : m_Tracks) {
326 // momentum x,y,z and position x,y,z
327 m_al_0[index * KFitConst::kNumber7 + 0][0] = track.getMomentum(KFitConst::kBeforeFit).x();
328 m_al_0[index * KFitConst::kNumber7 + 1][0] = track.getMomentum(KFitConst::kBeforeFit).y();
329 m_al_0[index * KFitConst::kNumber7 + 2][0] = track.getMomentum(KFitConst::kBeforeFit).z();
330 m_al_0[index * KFitConst::kNumber7 + 3][0] = track.getMomentum(KFitConst::kBeforeFit).t();
331 m_al_0[index * KFitConst::kNumber7 + 4][0] = track.getPosition(KFitConst::kBeforeFit).x();
332 m_al_0[index * KFitConst::kNumber7 + 5][0] = track.getPosition(KFitConst::kBeforeFit).y();
333 m_al_0[index * KFitConst::kNumber7 + 6][0] = track.getPosition(KFitConst::kBeforeFit).z();
334 // these error
335 m_V_al_0.sub(index * KFitConst::kNumber7 + 1, track.getError(KFitConst::kBeforeFit));
336 // charge, mass, a
337 m_property[index][0] = track.getCharge();
338 m_property[index][1] = track.getMass();
339 const double c = Const::speedOfLight * 1e-4;
340 m_property[index][2] = -c * m_MagneticField * track.getCharge();
341 index++;
342 }
343
344 // error between track and track
345 if (m_FlagCorrelation) {
346 this->prepareCorrelation();
348 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
349 return m_ErrorCode;
350 }
351 }
352
353 // set member matrix
354 m_al_1 = m_al_0;
355
356 // define size of matrix
359
360 } else
361 {
362 //TODO: Not Implemented
364 // m_FlagFitIncludingVertex == true
365 int index = 0;
366 m_al_0 = HepMatrix(KFitConst::kNumber7 * m_TrackCount + 3, 1, 0);
367 m_property = HepMatrix(m_TrackCount, 3, 0);
368 m_V_al_0 = HepSymMatrix(KFitConst::kNumber7 * m_TrackCount + 3, 0);
369
370 for (const auto& track : m_Tracks) {
371 // momentum x,y,z and position x,y,z
372 m_al_0[index * KFitConst::kNumber7 + 0][0] = track.getMomentum(KFitConst::kBeforeFit).x();
373 m_al_0[index * KFitConst::kNumber7 + 1][0] = track.getMomentum(KFitConst::kBeforeFit).y();
374 m_al_0[index * KFitConst::kNumber7 + 2][0] = track.getMomentum(KFitConst::kBeforeFit).z();
375 m_al_0[index * KFitConst::kNumber7 + 3][0] = track.getMomentum(KFitConst::kBeforeFit).t();
376 m_al_0[index * KFitConst::kNumber7 + 4][0] = track.getPosition(KFitConst::kBeforeFit).x();
377 m_al_0[index * KFitConst::kNumber7 + 5][0] = track.getPosition(KFitConst::kBeforeFit).y();
378 m_al_0[index * KFitConst::kNumber7 + 6][0] = track.getPosition(KFitConst::kBeforeFit).z();
379 // these error
380 m_V_al_0.sub(index * KFitConst::kNumber7 + 1, track.getError(KFitConst::kBeforeFit));
381 // charge, mass, a
382 m_property[index][0] = track.getCharge();
383 m_property[index][1] = track.getMass();
384 const double c = Const::speedOfLight * 1e-4;
385 m_property[index][2] = -c * m_MagneticField * track.getCharge();
386 index++;
387 }
388
389 // vertex
394
395 // error between track and track
396 if (m_FlagCorrelation) {
397 this->prepareCorrelation();
399 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
400 return m_ErrorCode;
401 }
402 }
403
404 // set member matrix
405 m_al_1 = m_al_0;
406
407 // define size of matrix
409 m_D = m_V_al_1.sub(1, 4, 1, KFitConst::kNumber7 * m_TrackCount + 3);
410 }
411
413}
static const double speedOfLight
[cm/ns]
Definition Const.h:696
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:38

◆ 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 417 of file MassFourCFitKFit.cc.

417 { // unused
418 char buf[1024];
419 sprintf(buf, "%s:%s(): internal error; this function should never be called", __FILE__, __func__);
420 B2FATAL(buf);
421
422 /* NEVER REACHEd HERE */
424}

◆ prepareOutputMatrix()

enum KFitError::ECode prepareOutputMatrix ( void )
overrideprivatevirtual

Build an output error matrix.

Returns
error code (zero if success)

Implements KFitBase.

Definition at line 489 of file MassFourCFitKFit.cc.

489 {
490 Hep3Vector h3v;
491 int index = 0;
492 for (auto& pdata : m_Tracks)
493 {
494 // tracks
495 // momentum
496 h3v.setX(m_al_1[index * KFitConst::kNumber7 + 0][0]);
497 h3v.setY(m_al_1[index * KFitConst::kNumber7 + 1][0]);
498 h3v.setZ(m_al_1[index * KFitConst::kNumber7 + 2][0]);
499 if (m_IsFixMass[index])
500 pdata.setMomentum(HepLorentzVector(h3v, sqrt(h3v.mag2() + pdata.getMass()*pdata.getMass())), KFitConst::kAfterFit);
501 else
502 pdata.setMomentum(HepLorentzVector(h3v, m_al_1[index * KFitConst::kNumber7 + 3][0]), KFitConst::kAfterFit);
503 // position
504 pdata.setPosition(HepPoint3D(
505 m_al_1[index * KFitConst::kNumber7 + 4][0],
506 m_al_1[index * KFitConst::kNumber7 + 5][0],
508 // error of the tracks
509 pdata.setError(this->makeError3(pdata.getMomentum(),
510 m_V_al_1.sub(
511 index * KFitConst::kNumber7 + 1,
512 (index + 1)*KFitConst::kNumber7,
513 index * KFitConst::kNumber7 + 1,
514 (index + 1)*KFitConst::kNumber7), m_IsFixMass[index]),
516 if (m_ErrorCode != KFitError::kNoError) break;
517 index++;
518 }
519
521 {
522 //TODO: Not Implemented
524 // vertex
528 // error of the vertex
529 for (int i = 0; i < 3; i++) for (int j = i; j < 3; j++) {
531 }
532 // error between vertex and tracks
533 for (int i = 0; i < m_TrackCount; i++) {
534 HepMatrix hm(3, KFitConst::kNumber7, 0);
535 for (int j = 0; j < 3; j++) for (int k = 0; k < KFitConst::kNumber7; k++) {
537 }
538 if (m_IsFixMass[i])
539 m_AfterTrackVertexError.push_back(this->makeError4(m_Tracks[i].getMomentum(), hm));
540 else
541 m_AfterTrackVertexError.push_back(hm);
542 }
543 } else
544 {
545 // not fit
547 }
548
550}
static CLHEP::HepMatrix makeError4(const CLHEP::HepLorentzVector &p, const CLHEP::HepMatrix &e)
Rebuild an error matrix from a Lorentz vector and an error matrix.
Definition KFitBase.cc:441

◆ setCorrelation()

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

Set a correlation matrix.

Not intended for end user's use.

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

Definition at line 70 of file KFitBase.cc.

70 {
71 if (e.num_row() != KFitConst::kNumber7)
72 {
74 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
75 return m_ErrorCode;
76 }
77 m_BeforeCorrelation.push_back(e);
78 m_FlagCorrelation = true;
79
81}

◆ 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 95 of file MassFourCFitKFit.cc.

95 {
96 m_FlagAtDecayPoint = flag;
97
99}

◆ 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 87 of file MassFourCFitKFit.cc.

87 {
89
91}

◆ 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 79 of file MassFourCFitKFit.cc.

79 {
81
83}

◆ 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 119 of file MassFourCFitKFit.cc.

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

◆ 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 136 of file MassFourCFitKFit.cc.

136 {
137 HepMatrix zero(3, KFitConst::kNumber7, 0);
138
139 return this->setTrackVertexError(zero);
140}
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 55 of file MassFourCFitKFit.cc.

55 {
57
59}

◆ 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 63 of file MassFourCFitKFit.cc.

63 {
64 if (e.num_row() != 3)
65 {
67 KFitError::displayError(__FILE__, __LINE__, __func__, m_ErrorCode);
68 return m_ErrorCode;
69 }
70
73
75}

◆ setZeroCorrelation()

enum KFitError::ECode setZeroCorrelation ( void )
virtualinherited

Indicate no correlation between tracks.

Not intended for end user's use.

Returns
error code (zero if success)

Definition at line 85 of file KFitBase.cc.

85 {
86 HepMatrix zero(KFitConst::kNumber7, KFitConst::kNumber7, 0);
87
88 return this->setCorrelation(zero);
89}
virtual enum KFitError::ECode setCorrelation(const CLHEP::HepMatrix &c)
Set a correlation matrix.
Definition KFitBase.cc:70

◆ 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 111 of file MassFourCFitKFit.cc.

111 {
112 m_IsFixMass.push_back(false);
113
115}

◆ updateMother()

enum KFitError::ECode updateMother ( Particle * mother)

Update mother particle.

Parameters
[in]motherMother particle.

Definition at line 742 of file MassFourCFitKFit.cc.

743{
744 MakeMotherKFit kmm;
746 unsigned n = getTrackCount();
747 for (unsigned i = 0; i < n; ++i) {
749 getTrack(i).getCharge());
752 for (unsigned j = i + 1; j < n; ++j) {
754 }
755 }
756 kmm.setVertex(getVertex());
759 m_ErrorCode = kmm.doMake();
761 return m_ErrorCode;
762 double chi2 = getCHIsq();
763 int ndf = getNDF();
764 double prob = TMath::Prob(chi2, ndf);
765 //
766 bool haschi2 = mother->hasExtraInfo("chiSquared");
767 if (haschi2) {
768 mother->setExtraInfo("chiSquared", chi2);
769 mother->setExtraInfo("ndf", ndf);
770 } else {
771 mother->addExtraInfo("chiSquared", chi2);
772 mother->addExtraInfo("ndf", ndf);
773 }
774
775 mother->updateMomentum(
776 CLHEPToROOT::getLorentzVector(kmm.getMotherMomentum()),
777 CLHEPToROOT::getXYZVector(kmm.getMotherPosition()),
778 CLHEPToROOT::getTMatrixFSym(kmm.getMotherError()),
779 prob);
781 return m_ErrorCode;
782}
void setExtraInfo(const std::string &name, double value)
Sets the user-defined data of given name to the given value.
Definition Particle.cc:1402
bool hasExtraInfo(const std::string &name) const
Return whether the extra info with the given name is set.
Definition Particle.cc:1351
void addExtraInfo(const std::string &name, double value)
Sets the user-defined data of given name to the given value.
Definition Particle.cc:1421
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:397
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
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 162 of file MassFourCFitKFit.h.

◆ m_AfterVertex

HepPoint3D m_AfterVertex
private

Vertex position after the fit.

Definition at line 158 of file MassFourCFitKFit.h.

◆ m_AfterVertexError

CLHEP::HepSymMatrix m_AfterVertexError
private

Vertex error matrix after the fit.

Definition at line 160 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 155 of file MassFourCFitKFit.h.

◆ m_BeforeVertex

HepPoint3D m_BeforeVertex
private

Vertex position before the fit.

Definition at line 151 of file MassFourCFitKFit.h.

◆ m_BeforeVertexError

CLHEP::HepSymMatrix m_BeforeVertexError
private

Vertex error matrix before the fit.

Definition at line 153 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 187 of file MassFourCFitKFit.h.

◆ m_ConstraintMassCount

int m_ConstraintMassCount
private

of constrained mass .

Definition at line 181 of file MassFourCFitKFit.h.

◆ m_ConstraintMassList

std::vector<double> m_ConstraintMassList
private

constrained mass

Definition at line 184 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 169 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 167 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 165 of file MassFourCFitKFit.h.

◆ m_FourMomentum

ROOT::Math::PxPyPzEVector m_FourMomentum
private

Four Momentum.

Definition at line 175 of file MassFourCFitKFit.h.

◆ m_InvariantMass

double m_InvariantMass
private

Invariant mass.

Definition at line 172 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 178 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: