Belle II Software  release-05-01-25
Origin.cc
1 /**************************************************************************
2  *
3  * BASF2 (Belle Analysis Framework 2) *
4  * Copyright(C) 2018 - Belle II Collaboration *
5  * *
6  * Author: The Belle II Collaboration *
7  * Contributor: Wouter Hulsbergen, Jo-Frederik Krohn *
8  * *
9  * This software is provided "as is" without any warranty. *
10  **************************************************************************/
11 
12 
13 #include <analysis/VertexFitting/TreeFitter/Origin.h>
14 #include <analysis/VertexFitting/TreeFitter/FitParams.h>
15 #include <analysis/dataobjects/Particle.h>
16 #include <framework/logging/Logger.h>
17 namespace TreeFitter {
18 
20  const ConstraintConfiguration& config,
21  bool forceFitAll
22  ) :
23  ParticleBase("Origin"),
24  m_constraintDimension(config.m_originDimension), //this also affects the geometric constraint
25  m_customOriginVertex(config.m_customOriginVertex),
26  m_customOriginCovariance(config.m_customOriginCovariance),
27  m_posVec(config.m_originDimension),
28  m_covariance(config.m_originDimension, config.m_originDimension),
29  m_isBeamSpot(config.m_ipConstraint),
30  m_inflationFactorCovZ(config.m_inflationFactorCovZ)
31  {
32  addDaughter(daughter, config, forceFitAll);
33  initOrigin();
34  }
35 
36  ErrCode Origin::initParticleWithMother([[gnu::unused]] FitParams& fitparams)
37  {
38  return ErrCode(ErrCode::Status::success);
39  }
40 
41  ErrCode Origin::initMotherlessParticle(FitParams& fitparams)
42  {
43  ErrCode status;
44  const int posindex = posIndex();
45  fitparams.getStateVector().segment(posindex, m_constraintDimension) = m_posVec.segment(0, m_constraintDimension);
46 
47  for (auto daughter : m_daughters) {
48  status |= daughter->initMotherlessParticle(fitparams);
49  status |= daughter->initParticleWithMother(fitparams);
50  }
51 
52  return status;
53  }
54 
55  ErrCode Origin::initOrigin()
56  {
57  ErrCode status;
59  m_covariance = Eigen::Matrix<double, 3, 3>::Zero(3, 3);
60  const TVector3& vertexVector = m_beamSpot->getIPPosition();
61  const TMatrixDSym& covVertex = m_beamSpot->getCovVertex();
62  m_posVec(0) = vertexVector.x();
63  m_posVec(1) = vertexVector.y();
64  m_posVec(2) = vertexVector.z();
65  m_covariance(0, 0) = covVertex(0 , 0);
66  m_covariance(1, 1) = covVertex(1 , 1);
67  m_covariance(2, 2) = covVertex(2 , 2);
68  m_covariance(1, 0) = covVertex(1 , 0);
69  m_covariance(2, 0) = covVertex(2 , 0);
70  m_covariance(2, 1) = covVertex(2 , 1);
71 
72  } else if (m_beamSpot && m_isBeamSpot && m_constraintDimension == 2) {
73  m_covariance = Eigen::Matrix<double, 2, 2>::Zero(2, 2);
74  const TVector3& vertexVector = m_beamSpot->getIPPosition();
75  const TMatrixDSym& covVertex = m_beamSpot->getCovVertex();
76  m_posVec(0) = vertexVector.x();
77  m_posVec(1) = vertexVector.y();
78  m_covariance(0, 0) = covVertex(0 , 0);
79  m_covariance(1, 1) = covVertex(1 , 1);
80  m_covariance(1, 0) = covVertex(1 , 0);
81 
82  } else if (!m_isBeamSpot && m_constraintDimension == 3) {
83 
84  if (!(m_customOriginVertex.size() == 3) || !(m_customOriginCovariance.size() == 9)) {
85  B2FATAL("Incorrect dimension of customOriginVertex or customOriginCovariance. customOriginVertex dim = "
86  << m_customOriginVertex.size() << " customOriginCovariance dim = " << m_customOriginCovariance.size());
87  } else if ((m_customOriginCovariance.at(0) < 0) || (m_customOriginCovariance.at(4) < 0) || (m_customOriginCovariance.at(8) < 0)) {
88  B2WARNING("An element of customOriginCovariance diagonal is smaller than 0.");
89  return ErrCode(ErrCode::Status::badsetup);
90  }
98 
99  // all with z
105  } else {
106  B2FATAL("The Origin is nether beamspot nor custom. This is ether a configuration error or no beam parameters were found to build the beam spot.");
107  }
108 
109  return ErrCode(ErrCode::Status::success);
110  }
111 
112  ErrCode Origin::initCovariance(FitParams& fitpar) const
113  {
114  ErrCode status;
115  const int posindex = posIndex();
116  for (int row = 0; row < m_constraintDimension; ++row) {
117  fitpar.getCovariance()(posindex + row, posindex + row) = 1000 * m_covariance(row, row);
118  }
119  for (auto daughter : m_daughters) {
120  status |= daughter->initCovariance(fitpar);
121  }
122  return status;
123  }
124 
125  ErrCode Origin::projectOriginConstraint(const FitParams& fitparams, Projection& p) const
126  {
127  const int posindex = posIndex();
128 
129  p.getResiduals().segment(0, m_constraintDimension) =
130  m_posVec.segment(0, m_constraintDimension) -
131  fitparams.getStateVector().segment(posindex, m_constraintDimension);
132 
133  for (int row = 0; row < m_constraintDimension; ++row) {
134  p.getH()(row, posindex + row) = -1;
135 
136  for (int col = 0; col <= row; ++col) {
137  p.getV()(row, col) = m_covariance(row, col);
138  }
139  }
140 
141  return ErrCode(ErrCode::Status::success);
142  }
143 
144  ErrCode Origin::projectConstraint(Constraint::Type type, const FitParams& fitparams, Projection& p) const
145  {
146  ErrCode status;
147  switch (type) {
148  case Constraint::origin:
149  status |= projectOriginConstraint(fitparams, p);
150  break;
151  default:
152  status |= ParticleBase::projectConstraint(type, fitparams, p);
153  }
154  return status;
155  }
156 
157  void Origin::addToConstraintList(constraintlist& list, int depth) const
158  {
159  for (auto daughter : m_daughters) {
160  daughter->addToConstraintList(list, depth - 1);
161  }
162  list.push_back(Constraint(this, Constraint::origin, depth, m_constraintDimension)) ;
163  }
164 }
TreeFitter::Origin::m_posVec
Eigen::Matrix< double, Eigen::Dynamic, 1, Eigen::ColMajor, 3, 1 > m_posVec
vertex position of the origin
Definition: Origin.h:109
TreeFitter::Origin::m_constraintDimension
const int m_constraintDimension
dimension of the constraint
Definition: Origin.h:100
TreeFitter::ParticleBase::projectConstraint
virtual ErrCode projectConstraint(Constraint::Type, const FitParams &, Projection &) const
project constraint.
Definition: ParticleBase.cc:537
TreeFitter::Origin::projectConstraint
virtual ErrCode projectConstraint(Constraint::Type, const FitParams &, Projection &) const override
the abstract projection
Definition: Origin.cc:153
TreeFitter::Origin::initCovariance
virtual ErrCode initCovariance(FitParams &fitpar) const override
init covariance matrix of the constraint
Definition: Origin.cc:121
TreeFitter::Origin::m_customOriginVertex
const std::vector< double > m_customOriginVertex
vertex coordinates
Definition: Origin.h:103
TreeFitter::ErrCode
abstract errorocode be aware that the default is succes
Definition: ErrCode.h:23
TreeFitter::Origin::m_isBeamSpot
const bool m_isBeamSpot
is this the beam constraint?
Definition: Origin.h:117
TreeFitter::FitParams
Class to store and manage fitparams (statevector)
Definition: FitParams.h:29
TreeFitter::Origin::type
virtual int type() const override
get particle type
Definition: Origin.h:71
TreeFitter::Origin::initOrigin
ErrCode initOrigin()
init the origin "particle"
Definition: Origin.cc:64
TreeFitter::Origin::initMotherlessParticle
virtual ErrCode initMotherlessParticle(FitParams &fitparams) override
init particle, used if it has no mother
Definition: Origin.cc:50
TreeFitter::Origin::m_covariance
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor, 3, 3 > m_covariance
covariance of the origin dont know size but I know the max size
Definition: Origin.h:114
TreeFitter::Origin::projectOriginConstraint
ErrCode projectOriginConstraint(const FitParams &fitpar, Projection &) const
the actuall constraint projection
Definition: Origin.cc:134
TreeFitter::Constraint::Type
Type
type of constraints the order of these constraints is important: it is the order in which they are ap...
Definition: Constraint.h:36
TreeFitter::Origin::posIndex
virtual int posIndex() const override
vertex position index in the statevector
Definition: Origin.h:83
TreeFitter::Origin::addToConstraintList
virtual void addToConstraintList(constraintlist &list, int depth) const override
adds the origin as a particle to the constraint list
Definition: Origin.cc:166
TreeFitter::Origin::m_inflationFactorCovZ
const int m_inflationFactorCovZ
inflated the covariance matrix in z by this number
Definition: Origin.h:123
Belle2::Particle
Class to store reconstructed particles.
Definition: Particle.h:77
TreeFitter::Origin::Origin
Origin(Belle2::Particle *particle, const ConstraintConfiguration &config, const bool forceFitAll)
Constructor.
Definition: Origin.cc:28
TreeFitter::Origin::m_customOriginCovariance
const std::vector< double > m_customOriginCovariance
vertex covariance
Definition: Origin.h:106
TreeFitter::ParticleBase::m_daughters
std::vector< ParticleBase * > m_daughters
daughter container
Definition: ParticleBase.h:231
TreeFitter::Origin::initParticleWithMother
virtual ErrCode initParticleWithMother(FitParams &fitparams) override
init particle, used if it has a mother
Definition: Origin.cc:45
TreeFitter::Origin::m_beamSpot
Belle2::DBObjPtr< Belle2::BeamSpot > m_beamSpot
the parameters are initialize elsewhere this is just a pointer to that
Definition: Origin.h:120