Belle II Software development
RecoNeutral Class Reference

representation of the neutral particle constraint More...

#include <RecoNeutral.h>

Inheritance diagram for RecoNeutral:
RecoParticle ParticleBase

Public Types

enum  TFParticleType {
  kInteractionPoint ,
  kOrigin ,
  kComposite ,
  kRecoResonance ,
  kInternalParticle ,
  kRecoTrack ,
  kResonance ,
  kRecoNeutral ,
  kMissingParticle
}
 particle types More...
 
typedef std::vector< Constraintconstraintlist
 alias
 
typedef std::vector< std::pair< const ParticleBase *, int > > indexmap
 alias
 

Public Member Functions

 RecoNeutral (Belle2::Particle *bc, const ParticleBase *mother)
 constructor
 
virtual ~RecoNeutral ()
 destructor
 
virtual ErrCode initParticleWithMother (FitParams &fitparams) override
 init particle with mother
 
virtual ErrCode initMotherlessParticle (FitParams &fitparams) override
 init particle without mother
 
ErrCode initCovariance (FitParams &fitparams) const override
 init covariance
 
ErrCode initParams ()
 update or init params
 
ErrCode projectRecoConstraint (const FitParams &fitparams, Projection &p) const override
 project neutral particle constraint
 
virtual int dimM () const override
 sets the size of the corresponding residual projection
 
virtual bool hasEnergy () const override
 how should the energy be calculated ?
 
virtual int dim () const override
 set the size of the particle in the statevector
 
virtual int type () const override
 type
 
virtual void addToConstraintList (constraintlist &alist, int depth) const override
 add to list
 
virtual std::string parname (int index) const override
 name
 
virtual int momIndex () const override
 get momentum index
 
virtual ErrCode projectConstraint (Constraint::Type, const FitParams &, Projection &) const override
 abstract abstract projection
 
virtual void updateIndex (int &offset)
 this sets the index for momentum, position, etc.
 
const ParticleBaselocate (Belle2::Particle *particle) const
 get particle base from basf2 particle
 
Belle2::Particleparticle () const
 get basf2 particle
 
int index () const
 get index
 
const ParticleBasemother () const
 getMother() / hasMother()
 
virtual ErrCode projectGeoConstraint (const FitParams &, Projection &) const
 project geometrical constraint
 
virtual ErrCode projectMassConstraintParticle (const FitParams &, Projection &) const
 project mass constraint using the particles parameters
 
virtual ErrCode projectMassConstraintDaughters (const FitParams &, Projection &) const
 project mass constraint using the parameters of the daughters
 
virtual ErrCode projectMassConstraint (const FitParams &, Projection &) const
 project mass constraint abstract
 
virtual void forceP4Sum (FitParams &) const
 force p4 sum conservation all along the tree
 
virtual int posIndex () const
 get vertex index (in statevector!)
 
virtual int tauIndex () const
 get tau index
 
virtual bool hasPosition () const
 get false
 
int eneIndex () const
 get energy index
 
virtual double chiSquare (const FitParams &) const
 get chi2
 
int charge () const
 get charge
 
virtual ParticleBaseaddDaughter (Belle2::Particle *, const ConstraintConfiguration &config, bool forceFitAll=false)
 add daughter
 
virtual void removeDaughter (const ParticleBase *pb)
 remove daughter
 
virtual void retrieveIndexMap (indexmap &anindexmap) const
 get index map
 
void setMother (const ParticleBase *m)
 set mother
 
void collectVertexDaughters (std::vector< ParticleBase * > &particles, int posindex)
 get vertex daughters
 
virtual int nFinalChargedCandidates () const
 number of charged candidates
 

Static Public Member Functions

static ParticleBasecreateParticle (Belle2::Particle *particle, const ParticleBase *mother, const ConstraintConfiguration &config, bool forceFitAll=false)
 create the according treeFitter particle obj for a basf2 particle type
 
static ParticleBasecreateOrigin (Belle2::Particle *daughter, const ConstraintConfiguration &config, bool forceFitAll)
 create a custom origin particle or a beamspot
 

Protected Types

typedef std::vector< ParticleBase * > ParticleContainer
 just an alias
 

Protected Member Functions

ErrCode initTau (FitParams &par) const
 initialises tau as a length
 
void setIndex (int i)
 set Index (in statevector)
 

Static Protected Member Functions

static bool isAResonance (Belle2::Particle *particle)
 controls if a particle is treated as a resonance(lifetime=0) or a particle that has a finite lifetime.
 

Protected Attributes

Belle2::Particlem_particle
 pointer to framework type
 
const ParticleBasem_mother
 motherparticle
 
std::vector< ParticleBase * > m_daughters
 daughter container
 
bool m_isStronglyDecayingResonance
 decay length less than 1 micron
 
const ConstraintConfigurationm_config
 has all the constraint config
 

Private Attributes

const int m_dim
 dimension of residuals and 'width' of H
 
bool m_init
 was initialized
 
Eigen::Matrix< double, 1, 4 > m_clusterPars
 constrains measured params (x_c, y_c, z_c, E_c)
 
Eigen::Matrix< double, 4, 4 > m_covariance
 covariance (x_c,y_c,z_c,E_c) of measured pars
 
int m_i1
 index with the highest momentum.
 
int m_i2
 random other index
 
int m_i3
 another random index
 
const float m_momentumScalingFactor
 scale the momentum / energy by this correction factor
 
const double m_mass
 invariant mass
 
const Belle2::Particle::EParticleSourceObject m_particleSource
 (mdst) source of particle
 
int m_index
 index
 
std::string m_name
 name
 

Detailed Description

representation of the neutral particle constraint

Definition at line 18 of file RecoNeutral.h.

Member Typedef Documentation

◆ constraintlist

typedef std::vector<Constraint> constraintlist
inherited

alias

Definition at line 48 of file ParticleBase.h.

◆ indexmap

typedef std::vector< std::pair<const ParticleBase*, int> > indexmap
inherited

alias

Definition at line 51 of file ParticleBase.h.

◆ ParticleContainer

typedef std::vector<ParticleBase*> ParticleContainer
protectedinherited

just an alias

Definition at line 174 of file ParticleBase.h.

Member Enumeration Documentation

◆ TFParticleType

enum TFParticleType
inherited

particle types

Definition at line 27 of file ParticleBase.h.

27 {kInteractionPoint,
28 kOrigin,
29 kComposite,
30 kRecoResonance,
31 kInternalParticle,
32 kRecoTrack,
33 kResonance,
34 kRecoNeutral,
35 kMissingParticle
36 };

Constructor & Destructor Documentation

◆ RecoNeutral()

RecoNeutral ( Belle2::Particle * bc,
const ParticleBase * mother )

constructor

Definition at line 27 of file RecoNeutral.cc.

27 : RecoParticle(particle, mother),
28 m_dim(3),
29 m_init(false),
30 m_clusterPars(),
31 m_covariance(),
32 m_momentumScalingFactor(particle->getEffectiveMomentumScale()),
33 m_mass(particle->getPDGMass()),
34 m_particleSource(particle->getParticleSource())
35 {
36 initParams();
37 }

◆ ~RecoNeutral()

virtual ~RecoNeutral ( )
inlinevirtual

destructor

Definition at line 25 of file RecoNeutral.h.

25{};

Member Function Documentation

◆ addDaughter()

ParticleBase * addDaughter ( Belle2::Particle * cand,
const ConstraintConfiguration & config,
bool forceFitAll = false )
virtualinherited

add daughter

Definition at line 63 of file ParticleBase.cc.

64 {
65 auto newDaughter = ParticleBase::createParticle(cand, this, config, forceFitAll);
66 m_daughters.push_back(newDaughter);
67 return m_daughters.back();
68 }

◆ addToConstraintList()

virtual void addToConstraintList ( constraintlist & alist,
int depth ) const
inlineoverridevirtual

add to list

Implements ParticleBase.

Definition at line 55 of file RecoNeutral.h.

56 {
57 alist.push_back(Constraint(this, Constraint::neutralHadron, depth, dimM())) ;
58 }

◆ charge()

int charge ( ) const
inlineinherited

get charge

Definition at line 140 of file ParticleBase.h.

141 {
142 if (m_particle->getPDGCode()) {
143 double fltcharge = m_particle->getCharge();
144 return fltcharge < 0 ? int(fltcharge - 0.5) : int(fltcharge + 0.5);
145 } else {
146 return m_particle->getCharge() > 0 ? 1 : (m_particle->getCharge() < 0 ? -1 : 0);
147 }
148 }

◆ chiSquare()

double chiSquare ( const FitParams & fitparams) const
virtualinherited

get chi2

Definition at line 229 of file ParticleBase.cc.

230 {
231 double rc = 0;
232 for (auto* daughter : m_daughters) {
233 rc += daughter->chiSquare(fitparams);
234 }
235 return rc;
236 }

◆ collectVertexDaughters()

void collectVertexDaughters ( std::vector< ParticleBase * > & particles,
int posindex )
inherited

get vertex daughters

Definition at line 154 of file ParticleBase.cc.

155 {
156 if (mother() && mother()->posIndex() == posindex) {
157 particles.push_back(this);
158 }
159
160 for (auto* daughter : m_daughters) {
161 daughter->collectVertexDaughters(particles, posindex);
162 }
163 }

◆ createOrigin()

ParticleBase * createOrigin ( Belle2::Particle * daughter,
const ConstraintConfiguration & config,
bool forceFitAll )
staticinherited

create a custom origin particle or a beamspot

Definition at line 91 of file ParticleBase.cc.

96 {
97 return new Origin(daughter, config, forceFitAll);
98 }

◆ createParticle()

ParticleBase * createParticle ( Belle2::Particle * particle,
const ParticleBase * mother,
const ConstraintConfiguration & config,
bool forceFitAll = false )
staticinherited

create the according treeFitter particle obj for a basf2 particle type

Definition at line 100 of file ParticleBase.cc.

102 {
103 ParticleBase* rc = nullptr;
104
105 if (!mother) { // If there is no mother, this is the 'head of tree' particle (is never a resonance)
106 rc = new InternalParticle(particle, nullptr, config, forceFitAll);
107 } else if (particle->hasExtraInfo("bremsCorrected") // Has Bremsstrahlungs-recovery
108 && particle->getExtraInfo("bremsCorrected") != 0) { // and gammas are attached
109 rc = new Composite(particle, mother, config, true);
110 // if no gamma is attached, it is treated as a RecoTrack
111 } else if (particle->hasExtraInfo("treeFitterTreatMeAsInvisible")
112 && particle->getExtraInfo("treeFitterTreatMeAsInvisible") == 1) { // dummy particles with invisible flag
113 rc = new RecoResonance(particle, mother, config);
114 } else if (particle->getTrack()) { // external reconstructed track
115 rc = new RecoTrack(particle, mother);
116 } else if (particle->getParticleSource() == Belle2::Particle::EParticleSourceObject::c_ECLCluster
117 or particle->getParticleSource() == Belle2::Particle::EParticleSourceObject::c_KLMCluster) {
118 // external reconstructed neutral final-state particle
119 rc = new RecoNeutral(particle, mother);
120 } else if (particle->getMdstArrayIndex()) { // external composite e.g. V0
121 rc = new InternalParticle(particle, mother, config, forceFitAll);
122 } else { // 'internal' particles
123 if (isAResonance(particle)) {
124 rc = new Resonance(particle, mother, config, forceFitAll);
125 } else {
126 rc = new InternalParticle(particle, mother, config, forceFitAll);
127 }
128 }
129 return rc;
130 }

◆ dim()

virtual int dim ( ) const
inlineoverridevirtual

set the size of the particle in the statevector

Reimplemented from RecoParticle.

Definition at line 49 of file RecoNeutral.h.

49{ return m_dim; }

◆ dimM()

virtual int dimM ( ) const
inlineoverridevirtual

sets the size of the corresponding residual projection

Implements RecoParticle.

Definition at line 43 of file RecoNeutral.h.

43{ return dim(); }

◆ eneIndex()

int eneIndex ( ) const
inlineinherited

get energy index

Definition at line 134 of file ParticleBase.h.

134{ return hasEnergy() ? momIndex() + 3 : -1 ; }

◆ forceP4Sum()

virtual void forceP4Sum ( FitParams & ) const
inlinevirtualinherited

force p4 sum conservation all along the tree

Reimplemented in InternalParticle.

Definition at line 112 of file ParticleBase.h.

112{} ;

◆ hasEnergy()

virtual bool hasEnergy ( ) const
inlineoverridevirtual

how should the energy be calculated ?

from momentum or from E ?

Reimplemented from RecoParticle.

Definition at line 46 of file RecoNeutral.h.

46{ return false; }

◆ hasPosition()

virtual bool hasPosition ( ) const
inlinevirtualinherited

get false

Reimplemented in Composite, InternalParticle, and Resonance.

Definition at line 131 of file ParticleBase.h.

131{ return false ; }

◆ index()

int index ( ) const
inlineinherited

get index

Definition at line 91 of file ParticleBase.h.

91{ return m_index ; }

◆ initCovariance()

ErrCode initCovariance ( FitParams & fitparams) const
overridevirtual

init covariance

Reimplemented from ParticleBase.

Definition at line 66 of file RecoNeutral.cc.

67 {
68 const int momindex = momIndex();
69 const int posindex = mother()->posIndex();
70
71 const double factorE = 1000 * m_covariance(3, 3);
72 const double factorX = 1000; // ~ 10cm error on initial vertex
73
74 fitparams.getCovariance().block<4, 4>(momindex, momindex) =
75 Eigen::Matrix<double, 4, 4>::Identity(4, 4) * factorE;
76
77 fitparams.getCovariance().block<3, 3>(posindex, posindex) =
78 Eigen::Matrix<double, 3, 3>::Identity(3, 3) * factorX;
79
80 return ErrCode(ErrCode::Status::success);
81 }

◆ initMotherlessParticle()

ErrCode initMotherlessParticle ( FitParams & fitparams)
overridevirtual

init particle without mother

Reimplemented from RecoParticle.

Definition at line 61 of file RecoNeutral.cc.

62 {
63 return ErrCode(ErrCode::Status::success);
64 }

◆ initParams()

ErrCode initParams ( )

update or init params

currently the energy in KLM is calculated as n2dHits in cluster times 0.214 GeV at time of writing - 8.3.18 - the KLMCluster returns 0 for the E covariance

Definition at line 83 of file RecoNeutral.cc.

84 {
85 ROOT::Math::XYZVector clusterCenter;
86 double energy = 0.;
87 m_covariance = Eigen::Matrix<double, 4, 4>::Zero(4, 4);
88 if (m_particleSource == Belle2::Particle::EParticleSourceObject::c_KLMCluster) {
89 const Belle2::KLMCluster* cluster = particle()->getKLMCluster();
90 clusterCenter = cluster->getClusterPosition();
91 const double momentum = cluster->getMomentumMag();
92 energy = sqrt(m_mass * m_mass + momentum * momentum);
93
94 TMatrixDSym cov7 = cluster->getError7x7();
95 for (int row = 0; row < 3; ++row) {
96 for (int col = 0; col < 3; ++col) {
97 m_covariance(row, col) = cov7[row + 4][col + 4] ;
98 }
99 }
100
104 if (0 == m_covariance(3, 3)) { m_covariance(3, 3) = .214; }
105 } else if (m_particleSource == Belle2::Particle::EParticleSourceObject::c_ECLCluster) {
106 const Belle2::ECLCluster* cluster = particle()->getECLCluster();
107 clusterCenter = cluster->getClusterPosition();
108 const Belle2::ECLCluster::EHypothesisBit clusterhypo = particle()->getECLClusterEHypothesisBit();
109 energy = cluster->getEnergy(clusterhypo);
110
111 Belle2::ClusterUtils C;
112 TMatrixDSym cov_EPhiTheta = C.GetCovarianceMatrix3x3FromCluster(cluster);
113
114 Eigen::Matrix<double, 2, 2> covPhiTheta = Eigen::Matrix<double, 2, 2>::Zero(2, 2);
115
116 for (int row = 0; row < 2; ++row) {
117 // we go through all elements here instead of selfadjoint view later
118 for (int col = 0; col < 2; ++col) {
119 covPhiTheta(row, col) = cov_EPhiTheta[row + 1][col + 1];
120 }
121 }
122
123 // the in going x-E correlations are 0 so we don't fill them
124 const double R = cluster->getR();
125 const double theta = cluster->getPhi();
126 const double phi = cluster->getTheta();
127
128 const double st = std::sin(theta);
129 const double ct = std::cos(theta);
130 const double sp = std::sin(phi);
131 const double cp = std::cos(phi);
132
133 Eigen::Matrix<double, 2, 3> polarToCartesian = Eigen::Matrix<double, 2, 3>::Zero(2, 3);
134
135 // polarToCartesian({phi,theta} -> {x,y,z} )
136 polarToCartesian(0, 0) = -1. * R * st * sp; // dx/dphi
137 polarToCartesian(0, 1) = R * st * cp; // dy/dphi
138 polarToCartesian(0, 2) = 0; // dz/dphi
139
140 polarToCartesian(1, 0) = R * ct * cp; // dx/dtheta
141 polarToCartesian(1, 1) = R * ct * sp; // dy/dtheta
142 polarToCartesian(1, 2) = -1. * R * st; // dz/dtheta
143
144 m_covariance.block<3, 3>(0, 0) = polarToCartesian.transpose() * covPhiTheta * polarToCartesian;
145
146 m_covariance(3, 3) = cov_EPhiTheta[0][0];
147 }
148
149 m_init = true;
150
151 m_clusterPars(0) = clusterCenter.X();
152 m_clusterPars(1) = clusterCenter.Y();
153 m_clusterPars(2) = clusterCenter.Z();
154 m_clusterPars(3) = energy;
155
156 auto p_vec = particle()->getMomentum();
157 // find highest momentum, eliminate dim with highest mom
158 if ((std::abs(p_vec.X()) >= std::abs(p_vec.Y())) && (std::abs(p_vec.X()) >= std::abs(p_vec.Z()))) {
159 m_i1 = 0;
160 m_i2 = 1;
161 m_i3 = 2;
162 } else if ((std::abs(p_vec.Y()) >= std::abs(p_vec.X())) && (std::abs(p_vec.Y()) >= std::abs(p_vec.Z()))) {
163 m_i1 = 1;
164 m_i2 = 0;
165 m_i3 = 2;
166 } else if ((std::abs(p_vec.Z()) >= std::abs(p_vec.Y())) && (std::abs(p_vec.Z()) >= std::abs(p_vec.X()))) {
167 m_i1 = 2;
168 m_i2 = 1;
169 m_i3 = 0;
170 } else {
171 B2ERROR("Could not estimate highest momentum for neutral particle constraint. Aborting this fit.\n px: "
172 << p_vec.X() << " py: " << p_vec.Y() << " pz: " << p_vec.Z() << " calculated from Ec: " << m_clusterPars(3));
173 return ErrCode(ErrCode::Status::photondimerror);
174 }
175
176 return ErrCode(ErrCode::Status::success);
177 }
double R
typedef autogenerated by FFTW
const TMatrixDSym GetCovarianceMatrix3x3FromCluster(const ECLCluster *cluster, int particleHypo=Const::photon.getPDGCode())
Returns 3x3 covariance matrix (E, theta, phi)
EHypothesisBit
The hypothesis bits for this ECLCluster (Connected region (CR) is split using this hypothesis.
Definition ECLCluster.h:31
double sqrt(double a)
sqrt for double
Definition beamHelpers.h:28

◆ initParticleWithMother()

ErrCode initParticleWithMother ( FitParams & fitparams)
overridevirtual

init particle with mother

Implements ParticleBase.

Definition at line 39 of file RecoNeutral.cc.

40 {
41 const int posindexmother = mother()->posIndex();
42
43 Eigen::Matrix<double, 1, 3> vertexToCluster = Eigen::Matrix<double, 1, 3>::Zero(1, 3);
44 for (unsigned int i = 0; i < 3; ++i) {
45 vertexToCluster(i) = m_clusterPars(i) - fitparams.getStateVector()(posindexmother + i);
46 }
47
48 const double distanceToMother = vertexToCluster.norm();
49 const double energy = m_momentumScalingFactor * m_clusterPars(3); // apply scaling factor to correct energy bias
50 const double absMom = std::sqrt(energy * energy - m_mass * m_mass);
51
52 const int momindex = momIndex();
53
54 for (unsigned int i = 0; i < 3; ++i) {
55 fitparams.getStateVector()(momindex + i) = absMom * vertexToCluster(i) / distanceToMother;
56 }
57
58 return ErrCode(ErrCode::Status::success);
59 }

◆ initTau()

ErrCode initTau ( FitParams & par) const
protectedinherited

initialises tau as a length

Definition at line 428 of file ParticleBase.cc.

429 {
430 const int tauindex = tauIndex();
431 if (tauindex >= 0 && hasPosition()) {
432
433 const int posindex = posIndex();
434 const int mother_ps_index = mother()->posIndex();
435 const int dim = m_config->m_originDimension; // TODO can we configure this to be particle specific?
436
437 // tau has different meaning depending on the dimension of the constraint
438 // 2-> use x-y projection
439 const Eigen::Matrix < double, 1, -1, 1, 1, 3 > vertex_dist =
440 fitparams.getStateVector().segment(posindex, dim) - fitparams.getStateVector().segment(mother_ps_index, dim);
441 const Eigen::Matrix < double, 1, -1, 1, 1, 3 >
442 mom = fitparams.getStateVector().segment(posindex, dim);
443
444 // if an intermediate vertex is not well defined by a track or so it will be initialised with 0
445 // same for the momentum of for example B0, it might be initialised with 0
446 // in those cases use pdg value
447 const double mom_norm = mom.norm();
448 const double dot = std::abs(vertex_dist.dot(mom));
449 const double tau = dot / mom_norm;
450 if (0 == mom_norm || 0 == dot) {
451 const double mass = m_particle->getPDGMass();
452 if (mass > 0)
453 fitparams.getStateVector()(tauindex) = m_particle->getPDGLifetime() * 1e9 * Belle2::Const::speedOfLight / mass;
454 else
455 fitparams.getStateVector()(tauindex) = 0;
456 } else {
457 fitparams.getStateVector()(tauindex) = tau;
458 }
459 }
460
461 return ErrCode(ErrCode::Status::success);
462 }
static const double speedOfLight
[cm/ns]
Definition Const.h:695
T dot(GeneralVector< T > a, GeneralVector< T > b)
dot product of two general vectors

◆ isAResonance()

bool isAResonance ( Belle2::Particle * particle)
staticprotectedinherited

controls if a particle is treated as a resonance(lifetime=0) or a particle that has a finite lifetime.

A finite life time means it will register a geo constraint for this particle

Definition at line 132 of file ParticleBase.cc.

133 {
134 bool rc = false ;
135 const int pdgcode = std::abs(particle->getPDGCode());
136
137 if (pdgcode && !(particle->getMdstArrayIndex())) {
138 switch (pdgcode) {
139 case 22: //photon conversion
140 rc = false;
141 break ;
142
143 case -11: //bremsstrahlung
144 case 11:
145 rc = true ;
146 break ;
147 default: //everything with boosted flight length less than 1 micrometer
148 rc = (pdgcode && particle->getPDGLifetime() < 1e-14);
149 }
150 }
151 return rc ;
152 }

◆ locate()

const ParticleBase * locate ( Belle2::Particle * particle) const
inherited

get particle base from basf2 particle

Definition at line 209 of file ParticleBase.cc.

210 {
211 const ParticleBase* rc = (m_particle == particle) ? this : nullptr;
212 if (!rc) {
213 for (auto* daughter : m_daughters) {
214 rc = daughter->locate(particle);
215 if (rc) {break;}
216 }
217 }
218 return rc;
219 }

◆ momIndex()

virtual int momIndex ( ) const
inlineoverridevirtualinherited

get momentum index

Reimplemented from ParticleBase.

Definition at line 42 of file RecoParticle.h.

42{ return index(); }

◆ mother()

const ParticleBase * mother ( ) const
inlineinherited

getMother() / hasMother()

Definition at line 94 of file ParticleBase.h.

94{ return m_mother; };

◆ nFinalChargedCandidates()

int nFinalChargedCandidates ( ) const
virtualinherited

number of charged candidates

Reimplemented in RecoTrack.

Definition at line 238 of file ParticleBase.cc.

239 {
240 int rc = 0;
241 for (auto* daughter : m_daughters) {
242 rc += daughter->nFinalChargedCandidates();
243 }
244 return rc;
245 }

◆ parname()

std::string parname ( int index) const
overridevirtualinherited

name

Reimplemented from ParticleBase.

Definition at line 23 of file RecoParticle.cc.

24 {
25 return ParticleBase::parname(index + 4);
26 }

◆ particle()

Belle2::Particle * particle ( ) const
inlineinherited

get basf2 particle

Definition at line 88 of file ParticleBase.h.

88{ return m_particle ; }

◆ posIndex()

virtual int posIndex ( ) const
inlinevirtualinherited

get vertex index (in statevector!)

Reimplemented in Composite, InternalParticle, Origin, RecoResonance, and Resonance.

Definition at line 118 of file ParticleBase.h.

118{ return -1 ; }

◆ projectConstraint()

ErrCode projectConstraint ( Constraint::Type type,
const FitParams & fitparams,
Projection & p ) const
overridevirtualinherited

abstract abstract projection

Reimplemented from ParticleBase.

Definition at line 28 of file RecoParticle.cc.

29 {
30 ErrCode status ;
31 switch (type) {
32 case Constraint::track :
33 case Constraint::neutralHadron :
34 status |= projectRecoConstraint(fitparams, p);
35 break ;
36 default:
37 status |= ParticleBase::projectConstraint(type, fitparams, p);
38 }
39 return status;
40 }

◆ projectGeoConstraint()

ErrCode projectGeoConstraint ( const FitParams & fitparams,
Projection & p ) const
virtualinherited

project geometrical constraint

the direction of the momentum is very well known from the kinematic constraints that is why we do not extract the distance as a vector here

Definition at line 247 of file ParticleBase.cc.

248 {
249 assert(m_config);
250 // only allow 2d for head of tree particles that are beam constrained
251 const int dim = m_config->m_originDimension == 2 && std::abs(m_particle->getPDGCode()) == m_config->m_headOfTreePDG ? 2 : 3;
252 const int posindexmother = mother()->posIndex();
253 const int posindex = posIndex();
254 const int tauindex = tauIndex();
255 const int momindex = momIndex();
256
257 const double tau = fitparams.getStateVector()(tauindex);
258 Eigen::VectorXd x_vec = fitparams.getStateVector().segment(posindex, dim);
259 Eigen::VectorXd x_m = fitparams.getStateVector().segment(posindexmother, dim);
260 Eigen::VectorXd p_vec = fitparams.getStateVector().segment(momindex, dim);
261 const double mom = p_vec.norm();
262 const double mom3 = mom * mom * mom;
263
264 if (3 == dim) {
265 // we can already set these
266 //diagonal momentum
267 p.getH()(0, momindex) = tau * (p_vec(1) * p_vec(1) + p_vec(2) * p_vec(2)) / mom3 ;
268 p.getH()(1, momindex + 1) = tau * (p_vec(0) * p_vec(0) + p_vec(2) * p_vec(2)) / mom3 ;
269 p.getH()(2, momindex + 2) = tau * (p_vec(0) * p_vec(0) + p_vec(1) * p_vec(1)) / mom3 ;
270
271 //offdiagonal momentum
272 p.getH()(0, momindex + 1) = - tau * p_vec(0) * p_vec(1) / mom3 ;
273 p.getH()(0, momindex + 2) = - tau * p_vec(0) * p_vec(2) / mom3 ;
274
275 p.getH()(1, momindex + 0) = - tau * p_vec(1) * p_vec(0) / mom3 ;
276 p.getH()(1, momindex + 2) = - tau * p_vec(1) * p_vec(2) / mom3 ;
277
278 p.getH()(2, momindex + 0) = - tau * p_vec(2) * p_vec(0) / mom3 ;
279 p.getH()(2, momindex + 1) = - tau * p_vec(2) * p_vec(1) / mom3 ;
280
281 } else if (2 == dim) {
282
283 // NOTE THAT THESE ARE DIFFERENT IN 2d
284 p.getH()(0, momindex) = tau * (p_vec(1) * p_vec(1)) / mom3 ;
285 p.getH()(1, momindex + 1) = tau * (p_vec(0) * p_vec(0)) / mom3 ;
286
287 //offdiagonal momentum
288 p.getH()(0, momindex + 1) = - tau * p_vec(0) * p_vec(1) / mom3 ;
289 p.getH()(1, momindex + 0) = - tau * p_vec(1) * p_vec(0) / mom3 ;
290 } else {
291 B2FATAL("Dimension of Geometric constraint is not 2 or 3. This will crash many things. You should feel bad.");
292 }
293
294 // --- Fill residuals and remaining Jacobian entries ---
298 Eigen::VectorXd residuals = x_m + tau * p_vec / mom - x_vec;
299 p.getResiduals().segment(0, dim) = residuals;
300
301 for (int row = 0; row < dim; ++row) {
302 p.getH()(row, posindexmother + row) = 1;
303 p.getH()(row, posindex + row) = -1;
304 p.getH()(row, tauindex) = p_vec(row) / mom;
305 }
306
307 return ErrCode(ErrCode::Status::success);
308 }

◆ projectMassConstraint()

ErrCode projectMassConstraint ( const FitParams & fitparams,
Projection & p ) const
virtualinherited

project mass constraint abstract

Definition at line 407 of file ParticleBase.cc.

409 {
410 assert(m_config);
411 if (m_config->m_massConstraintType == 0) {
412 return projectMassConstraintParticle(fitparams, p);
413 } else {
414 return projectMassConstraintDaughters(fitparams, p);
415 }
416 }

◆ projectMassConstraintDaughters()

ErrCode projectMassConstraintDaughters ( const FitParams & fitparams,
Projection & p ) const
virtualinherited

project mass constraint using the parameters of the daughters

be aware that the signs here are important E-|p|-m extracts a negative mass and messes with the momentum !

Definition at line 310 of file ParticleBase.cc.

312 {
313 double mass = 0;
314 if (particle()->hasExtraInfo("treeFitterMassConstraintValue")) {
315 mass = particle()->getExtraInfo("treeFitterMassConstraintValue");
316 } else mass = particle()->getPDGMass();
317 const double mass2 = mass * mass;
318 double px = 0;
319 double py = 0;
320 double pz = 0;
321 double E = 0;
322
323 // the parameters of the daughters must be used otherwise the mass constraint does not have an effect on the extracted daughter momenta
324 for (const auto* daughter : m_daughters) {
325 const int momindex = daughter->momIndex();
326 // in most cases the daughters will be final states so we cache the value to use it in the energy column
327 const double px_daughter = fitparams.getStateVector()(momindex);
328 const double py_daughter = fitparams.getStateVector()(momindex + 1);
329 const double pz_daughter = fitparams.getStateVector()(momindex + 2);
330
331 px += px_daughter;
332 py += py_daughter;
333 pz += pz_daughter;
334 if (daughter->hasEnergy()) {
335 E += fitparams.getStateVector()(momindex + 3);
336 } else {
337 // final states dont have an energy index
338 double m = 0;
339 if (daughter->particle()->hasExtraInfo("treeFitterMassConstraintValue")) {
340 m = daughter->particle()->getExtraInfo("treeFitterMassConstraintValue");
341 } else m = daughter->particle()->getPDGMass();
342 E += std::sqrt(m * m + px_daughter * px_daughter + py_daughter * py_daughter + pz_daughter * pz_daughter);
343 }
344 }
345
349 p.getResiduals()(0) = mass2 - E * E + px * px + py * py + pz * pz;
350
351 for (const auto* daughter : m_daughters) {
352 //dr/dx = d/dx m2-{E1+E2+...}^2+{p1+p2+...}^2 = 2*x (x= E or p)
353 const int momindex = daughter->momIndex();
354 Eigen::Vector3d mom(px, py, pz);
355 p.getH().block<1, 3>(0, momindex) = 2.0 * mom;
356
357 if (daughter->hasEnergy()) {
358 p.getH()(0, momindex + 3) = -2.0 * E;
359 } else {
360 Eigen::Vector3d mom_daughter = fitparams.getStateVector().segment<3>(momindex);
361 double m = 0;
362 if (daughter->particle()->hasExtraInfo("treeFitterMassConstraintValue")) {
363 m = daughter->particle()->getExtraInfo("treeFitterMassConstraintValue");
364 } else m = daughter->particle()->getPDGMass();
365
366 const double E_daughter = std::sqrt(m * m + mom_daughter.squaredNorm());
367 const double E_by_E_daughter = E / E_daughter;
368 p.getH().block<1, 3>(0, momindex) -= 2.0 * E_by_E_daughter * mom_daughter;
369 }
370
371 }
372 return ErrCode(ErrCode::Status::success);
373 }
R E
internal precision of FFTW codelets

◆ projectMassConstraintParticle()

ErrCode projectMassConstraintParticle ( const FitParams & fitparams,
Projection & p ) const
virtualinherited

project mass constraint using the particles parameters

be aware that the signs here are important E-|p|-m extracts a negative mass and messes with the momentum !

Definition at line 375 of file ParticleBase.cc.

377 {
378 double mass = 0;
379 if (particle()->hasExtraInfo("treeFitterMassConstraintValue")) mass = particle()->getExtraInfo("treeFitterMassConstraintValue");
380 else mass = particle()->getPDGMass();
381 const double mass2 = mass * mass;
382 const int momindex = momIndex();
383 Eigen::Vector4d state = fitparams.getStateVector().segment<4>(momindex);
384 Eigen::Vector3d p3 = state.head<3>();
385 const double px = state(0);
386 const double py = state(1);
387 const double pz = state(2);
388 const double E = state(3);
389
393 p.getResiduals()(0) = mass2 - E * E + px * px + py * py + pz * pz;
394
395 p.getH().block<1, 3>(0, momindex) = 2.0 * p3;
396 p.getH()(0, momindex + 3) = -2.0 * E;
397
398 // TODO 0 in most cases -> needs special treatment if width=0 to not crash chi2 calculation
399 // const double width = TDatabasePDG::Instance()->GetParticle(particle()->getPDGCode())->Width();
400 // transport measurement uncertainty into residual system
401 // f' = sigma_x^2 * (df/dx)^2
402 // p.getV()(0) = width * width * 4 * mass2;
403
404 return ErrCode(ErrCode::Status::success);
405 }

◆ projectRecoConstraint()

ErrCode projectRecoConstraint ( const FitParams & fitparams,
Projection & p ) const
overridevirtual

project neutral particle constraint

m : decay vertex mother p : momentum vector c : position cluster so: m + p = c thus (tau converts p to the correct units): 0 = c - m - tau * p we have 3 geometric equations and eliminate tau using the dimension with the highest momentum (because we have to divide by that momentum) only downside is we have to figure out which dimension this is the 4th equation is the energy which we keep as: 0 = E - |p|

Implements RecoParticle.

Definition at line 179 of file RecoNeutral.cc.

180 {
181 const int momindex = momIndex();
182 const int posindex = mother()->posIndex();
197
198 const Eigen::Matrix<double, 1, 3> x_vertex = fitparams.getStateVector().segment(posindex, 3);
199 const Eigen::Matrix<double, 1, 3> p_vec = fitparams.getStateVector().segment(momindex, 3);
200
201 if (0 == p_vec[m_i1]) { return ErrCode(ErrCode::photondimerror); }
202
203 // p_vec[m_i1] must not be 0
204 const double elim = (m_clusterPars[m_i1] - x_vertex[m_i1]) / p_vec[m_i1];
205 const double mom = p_vec.norm();
206 const double energy = std::sqrt(mom * mom + m_mass * m_mass);
207
208 // r'
209 Eigen::Matrix<double, 3, 1> residual3 = Eigen::Matrix<double, 3, 1>::Zero(3, 1);
210 residual3(0) = m_clusterPars[m_i2] - x_vertex[m_i2] - p_vec[m_i2] * elim;
211 residual3(1) = m_clusterPars[m_i3] - x_vertex[m_i3] - p_vec[m_i3] * elim;
212 residual3(2) = m_momentumScalingFactor * m_clusterPars[3] - energy; // scale measured energy by scaling factor
213
214 // dr'/dm | m:={xc,yc,zc,Ec} the measured quantities
215 Eigen::Matrix<double, 3, 4> P = Eigen::Matrix<double, 3, 4>::Zero(3, 4);
216 // deriving by the cluster pars
217 P(0, m_i2) = 1;
218 P(0, m_i1) = -p_vec[m_i2] / p_vec[m_i1];
219
220 P(1, m_i3) = 1;
221 P(1, m_i1) = -p_vec[m_i3] / p_vec[m_i1];
222 P(2, 3) = 1; // dE/dEc
223
224 p.getResiduals().segment(0, 3) = residual3;
225
226 p.getV() = P * m_covariance.selfadjointView<Eigen::Lower>() * P.transpose();
227
228 // dr'/dm | m:={x,y,z,px,py,pz,E}
229 // x := x_vertex (decay vertex of mother)
230 p.getH()(0, posindex + m_i1) = p_vec[m_i2] / p_vec[m_i1];
231 p.getH()(0, posindex + m_i2) = -1.0;
232 p.getH()(0, posindex + m_i3) = 0;
233
234 p.getH()(1, posindex + m_i1) = p_vec[m_i3] / p_vec[m_i1];
235 p.getH()(1, posindex + m_i2) = 0;
236 p.getH()(1, posindex + m_i3) = -1.0;
237
238 // elim already divided by p_vec[m_i1]
239 p.getH()(0, momindex + m_i1) = p_vec[m_i2] * elim / p_vec[m_i1];
240 p.getH()(0, momindex + m_i2) = -1. * elim;
241 p.getH()(0, momindex + m_i3) = 0;
242
243 p.getH()(1, momindex + m_i1) = p_vec[m_i3] * elim / p_vec[m_i1];
244 p.getH()(1, momindex + m_i2) = 0;
245 p.getH()(1, momindex + m_i3) = -1. * elim;
246
247 p.getH()(2, momindex + m_i1) = -1. * p_vec[m_i1] / mom;
248 p.getH()(2, momindex + m_i2) = -1. * p_vec[m_i2] / mom;
249 p.getH()(2, momindex + m_i3) = -1. * p_vec[m_i3] / mom;
250
251 return ErrCode(ErrCode::Status::success);
252 }

◆ removeDaughter()

void removeDaughter ( const ParticleBase * pb)
virtualinherited

remove daughter

Definition at line 71 of file ParticleBase.cc.

72 {
73 auto iter = std::find(m_daughters.begin(), m_daughters.end(), pb);
74 if (iter != m_daughters.end()) {
75 delete *iter;
76 m_daughters.erase(iter);
77 } else {
78 B2ERROR("Cannot remove particle, because not found ...");
79 }
80 }

◆ retrieveIndexMap()

void retrieveIndexMap ( indexmap & anindexmap) const
virtualinherited

get index map

Definition at line 221 of file ParticleBase.cc.

222 {
223 map.push_back(std::pair<const ParticleBase*, int>(this, index()));
224 for (auto* daughter : m_daughters) {
225 daughter->retrieveIndexMap(map);
226 }
227 }

◆ setIndex()

void setIndex ( int i)
inlineprotectedinherited

set Index (in statevector)

Definition at line 185 of file ParticleBase.h.

185{ m_index = i ; }

◆ setMother()

void setMother ( const ParticleBase * m)
inlineinherited

set mother

Definition at line 160 of file ParticleBase.h.

160{ m_mother = m ; }

◆ tauIndex()

virtual int tauIndex ( ) const
inlinevirtualinherited

get tau index

Reimplemented in Composite, InternalParticle, Origin, RecoResonance, and Resonance.

Definition at line 121 of file ParticleBase.h.

121{ return -1 ; }

◆ type()

virtual int type ( ) const
inlineoverridevirtual

type

Implements ParticleBase.

Definition at line 52 of file RecoNeutral.h.

52{ return kRecoNeutral ; }

◆ updateIndex()

void updateIndex ( int & offset)
virtualinherited

this sets the index for momentum, position, etc.

in the statevector

Definition at line 82 of file ParticleBase.cc.

83 {
84 for (auto* daughter : m_daughters) {
85 daughter->updateIndex(offset);
86 }
87 m_index = offset;
88 offset += dim();
89 }

Member Data Documentation

◆ m_clusterPars

Eigen::Matrix<double, 1, 4> m_clusterPars
private

constrains measured params (x_c, y_c, z_c, E_c)

Definition at line 69 of file RecoNeutral.h.

◆ m_config

const ConstraintConfiguration* m_config
protectedinherited

has all the constraint config

Definition at line 200 of file ParticleBase.h.

◆ m_covariance

Eigen::Matrix<double, 4, 4> m_covariance
private

covariance (x_c,y_c,z_c,E_c) of measured pars

Definition at line 72 of file RecoNeutral.h.

◆ m_daughters

std::vector<ParticleBase*> m_daughters
protectedinherited

daughter container

Definition at line 194 of file ParticleBase.h.

◆ m_dim

const int m_dim
private

dimension of residuals and 'width' of H

Definition at line 63 of file RecoNeutral.h.

◆ m_i1

int m_i1
private

index with the highest momentum.

We have to make sure this does not change during the fit.

Definition at line 75 of file RecoNeutral.h.

◆ m_i2

int m_i2
private

random other index

Definition at line 77 of file RecoNeutral.h.

◆ m_i3

int m_i3
private

another random index

Definition at line 79 of file RecoNeutral.h.

◆ m_index

int m_index
privateinherited

index

Definition at line 204 of file ParticleBase.h.

◆ m_init

bool m_init
private

was initialized

Definition at line 66 of file RecoNeutral.h.

◆ m_isStronglyDecayingResonance

bool m_isStronglyDecayingResonance
protectedinherited

decay length less than 1 micron

Definition at line 197 of file ParticleBase.h.

◆ m_mass

const double m_mass
private

invariant mass

Definition at line 85 of file RecoNeutral.h.

◆ m_momentumScalingFactor

const float m_momentumScalingFactor
private

scale the momentum / energy by this correction factor

Definition at line 82 of file RecoNeutral.h.

◆ m_mother

const ParticleBase* m_mother
protectedinherited

motherparticle

Definition at line 191 of file ParticleBase.h.

◆ m_name

std::string m_name
privateinherited

name

Definition at line 207 of file ParticleBase.h.

◆ m_particle

Belle2::Particle* m_particle
protectedinherited

pointer to framework type

Definition at line 188 of file ParticleBase.h.

◆ m_particleSource

const Belle2::Particle::EParticleSourceObject m_particleSource
private

(mdst) source of particle

Definition at line 88 of file RecoNeutral.h.


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