Belle II Software development
InternalParticle Class Reference

another unnecessary layer of abstraction More...

#include <InternalParticle.h>

Inheritance diagram for InternalParticle:
ParticleBase Resonance

Public Types

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

Public Member Functions

 InternalParticle (Belle2::Particle *particle, const ParticleBase *mother, const ConstraintConfiguration &config, bool forceFitAll)
 constructor
 
virtual ~InternalParticle ()
 destructor
 
virtual ErrCode initCovariance (FitParams &) const override
 init covariance
 
ErrCode projectKineConstraint (const FitParams &, Projection &) const
 project kinematical constraint
 
ErrCode projectBeamConstraint (const FitParams &, Projection &) const
 project beam four momentum constraint
 
virtual void forceP4Sum (FitParams &) const override
 enforce conservation of momentum sum
 
virtual ErrCode initParticleWithMother (FitParams &fitparams) override
 init particle in case it has a mother
 
virtual ErrCode initMotherlessParticle (FitParams &fitparams) override
 init particle in case it has no mother
 
ErrCode projectConstraint (const Constraint::Type type, const FitParams &fitparams, Projection &p) const override
 find out which constraint it is and project
 
virtual int dim () const override
 space reserved in fit params, if has mother then it has tau
 
virtual int type () const override
 type
 
virtual int posIndex () const override
 position index in fit params
 
virtual int tauIndex () const override
 tau index in fit params only if it has a mother
 
virtual int momIndex () const override
 momentum index in fit params depending on whether it has a mother

 
virtual bool hasEnergy () const override
 has energy in fitparams

 
virtual bool hasPosition () const override
 has position index

 
virtual std::string parname (int index) const override
 name

 
virtual void addToConstraintList (constraintlist &list, int depth) const override
 add to constraint list

 
void setMassConstraint (bool b)
 set mass constraint flag
 
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
 
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 initMomentum (FitParams &fitparams) const
 init momentum of *this and daughters
 
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
 

Static Private Member Functions

static bool compTrkTransverseMomentum (const RecoTrack *lhs, const RecoTrack *rhs)
 compare transverse track momentum
 

Private Attributes

bool m_massconstraint
 has mass constraint
 
bool m_beamconstraint
 has beam constraint
 
bool m_shares_vertex_with_mother
 shares vertex with mother, that means decay vertex = productionvertex
 
bool m_geo_constraint
 use a geo metric constraint
 
bool m_lifetimeconstraint
 has lifetime constraint

 
bool m_isconversion
 is conversion

 
bool m_automatic_vertex_constraining
 automatically figure out if mother and particle vertex should be the same and also add geometric constraints
 
int m_index
 index
 
std::string m_name
 name

 

Detailed Description

another unnecessary layer of abstraction

Definition at line 17 of file InternalParticle.h.

Member Typedef Documentation

◆ constraintlist

typedef std::vector<Constraint> constraintlist
inherited

alias

Definition at line 52 of file ParticleBase.h.

◆ indexmap

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

alias

Definition at line 55 of file ParticleBase.h.

◆ ParticleContainer

typedef std::vector<ParticleBase*> ParticleContainer
protectedinherited

just an alias

Definition at line 178 of file ParticleBase.h.

Member Enumeration Documentation

◆ TFParticleType

enum TFParticleType
inherited

particle types

Definition at line 30 of file ParticleBase.h.

30 {kInteractionPoint,
31 kOrigin,
32 kComposite,
33 kRecoResonance,
34 kInternalParticle,
35 kRecoTrack,
36 kResonance,
37 kRecoPhoton,
38 kRecoKlong,
39 kMissingParticle
40 };

Constructor & Destructor Documentation

◆ InternalParticle()

InternalParticle ( Belle2::Particle particle,
const ParticleBase mother,
const ConstraintConfiguration config,
bool  forceFitAll 
)

constructor

Definition at line 40 of file InternalParticle.cc.

44 :
45 ParticleBase(particle, mother, &config),// config pointer here to allow final states not to have it
46 m_massconstraint(false),
47 m_beamconstraint(false),
49 m_isconversion(false),
50 m_automatic_vertex_constraining(config.m_automatic_vertex_constraining)
51 {
52 if (particle) {
53 for (auto daughter : particle->getDaughters()) {
54 addDaughter(daughter, config, forceFitAll);
55 }
56 } else {
57 B2ERROR("Trying to create an InternalParticle from NULL. This should never happen.");
58 }
59
60 m_massconstraint = std::find(config.m_massConstraintListPDG.begin(), config.m_massConstraintListPDG.end(),
61 std::abs(m_particle->getPDGCode())) != config.m_massConstraintListPDG.end()
62 or m_particle->hasExtraInfo("treeFitterMassConstraint");
63
64 m_beamconstraint = (std::abs(m_particle->getPDGCode()) == config.m_beamConstraintPDG);
65
67 // if this is a hadronically decaying resonance it is useful to constrain the decay vertex to its mother's decay vertex.
68 //
69 m_shares_vertex_with_mother = std::find(config.m_fixedToMotherVertexListPDG.begin(),
70 config.m_fixedToMotherVertexListPDG.end(),
71 std::abs(m_particle->getPDGCode())) != config.m_fixedToMotherVertexListPDG.end() && this->mother();
72
73 // use geo constraint if this particle is in the list to constrain
74 m_geo_constraint = std::find(config.m_geoConstraintListPDG.begin(),
75 config.m_geoConstraintListPDG.end(),
76 std::abs(m_particle->getPDGCode())) != config.m_geoConstraintListPDG.end() && this->mother() && !m_shares_vertex_with_mother;
77 } else {
80 }
81 }
bool hasExtraInfo(const std::string &name) const
Return whether the extra info with the given name is set.
Definition: Particle.cc:1351
int getPDGCode(void) const
Returns PDG code.
Definition: Particle.h:465
std::vector< Belle2::Particle * > getDaughters() const
Returns a vector of pointers to daughter particles.
Definition: Particle.cc:668
bool m_isconversion
is conversion
bool m_beamconstraint
has beam constraint
bool m_massconstraint
has mass constraint
bool m_automatic_vertex_constraining
automatically figure out if mother and particle vertex should be the same and also add geometric cons...
bool m_lifetimeconstraint
has lifetime constraint
bool m_geo_constraint
use a geo metric constraint
bool m_shares_vertex_with_mother
shares vertex with mother, that means decay vertex = productionvertex
Belle2::Particle * particle() const
get basf2 particle
Definition: ParticleBase.h:92
virtual ParticleBase * addDaughter(Belle2::Particle *, const ConstraintConfiguration &config, bool forceFitAll=false)
add daughter
Definition: ParticleBase.cc:63
bool m_isStronglyDecayingResonance
decay length less than 1 micron
Definition: ParticleBase.h:201
Belle2::Particle * m_particle
pointer to framework type
Definition: ParticleBase.h:192
ParticleBase(Belle2::Particle *particle, const ParticleBase *mother, const ConstraintConfiguration *config=nullptr)
default constructor
Definition: ParticleBase.cc:28
const ParticleBase * mother() const
getMother() / hasMother()
Definition: ParticleBase.h:98

◆ ~InternalParticle()

virtual ~InternalParticle ( )
inlinevirtual

destructor

Definition at line 29 of file InternalParticle.h.

29{};

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 }
static ParticleBase * createParticle(Belle2::Particle *particle, const ParticleBase *mother, const ConstraintConfiguration &config, bool forceFitAll=false)
create the according treeFitter particle obj for a basf2 particle type
std::vector< ParticleBase * > m_daughters
daughter container
Definition: ParticleBase.h:198

◆ addToConstraintList()

void addToConstraintList ( constraintlist list,
int  depth 
) const
overridevirtual

add to constraint list

Implements ParticleBase.

Definition at line 382 of file InternalParticle.cc.

384 {
385
386 for (auto daughter : m_daughters) {
387 daughter->addToConstraintList(list, depth - 1);
388 }
389 if (tauIndex() >= 0 && m_lifetimeconstraint) {
390 list.push_back(Constraint(this, Constraint::lifetime, depth, 1));
391 }
392 if (momIndex() >= 0) {
393 list.push_back(Constraint(this, Constraint::kinematic, depth, 4, 3));
394 }
395 if (m_geo_constraint) {
396 assert(m_config);
397 const int dim = m_config->m_originDimension == 2 && std::abs(m_particle->getPDGCode()) == m_config->m_headOfTreePDG ? 2 : 3;
398 list.push_back(Constraint(this, Constraint::geometric, depth, dim, 3));
399 }
400 if (m_massconstraint) {
401 list.push_back(Constraint(this, Constraint::mass, depth, 1, 3));
402 }
403 if (m_beamconstraint) {
404 assert(m_config);
405 list.push_back(Constraint(this, Constraint::beam, depth, 4, 3));
406 }
407
408 }
const int m_originDimension
dimension of the origin constraint and ALL geometric gcosntraints
int m_headOfTreePDG
PDG code of the head particle.
virtual int tauIndex() const override
tau index in fit params only if it has a mother
virtual int dim() const override
space reserved in fit params, if has mother then it has tau
virtual int momIndex() const override
momentum index in fit params depending on whether it has a mother
const ConstraintConfiguration * m_config
has all the constraint config
Definition: ParticleBase.h:204

◆ charge()

int charge ( ) const
inlineinherited

get charge

Definition at line 144 of file ParticleBase.h.

145 {
146 if (m_particle->getPDGCode()) {
147 double fltcharge = m_particle->getCharge();
148 return fltcharge < 0 ? int(fltcharge - 0.5) : int(fltcharge + 0.5);
149 } else {
150 return m_particle->getCharge() > 0 ? 1 : (m_particle->getCharge() < 0 ? -1 : 0);
151 }
152 }
double getCharge(void) const
Returns particle charge.
Definition: Particle.cc:653

◆ 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 }
virtual int posIndex() const
get vertex index (in statevector!)
Definition: ParticleBase.h:122

◆ compTrkTransverseMomentum()

bool compTrkTransverseMomentum ( const RecoTrack lhs,
const RecoTrack rhs 
)
staticprivate

compare transverse track momentum

Definition at line 83 of file InternalParticle.cc.

84 {
85
86 return lhs->particle()->getMomentum().Rho() > rhs->particle()->getMomentum().Rho();
87 }

◆ 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->getECLCluster()) { // external reconstructed photon
117 rc = new RecoPhoton(particle, mother);
118 } else if (particle->getKLMCluster()) { // external reconstructed klong
119 rc = new RecoKlong(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 }
const KLMCluster * getKLMCluster() const
Returns the pointer to the KLMCluster object that was used to create this Particle (ParticleType == c...
Definition: Particle.cc:1011
const Track * getTrack() const
Returns the pointer to the Track object that was used to create this Particle (ParticleType == c_Trac...
Definition: Particle.cc:916
const ECLCluster * getECLCluster() const
Returns the pointer to the ECLCluster object that was used to create this Particle (if ParticleType =...
Definition: Particle.cc:976
unsigned getMdstArrayIndex(void) const
Returns 0-based index of MDST store array object (0 for composite particles)
Definition: Particle.h:498
double getExtraInfo(const std::string &name) const
Return given value if set.
Definition: Particle.cc:1374
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...

◆ dim()

int dim ( ) const
overridevirtual

space reserved in fit params, if has mother then it has tau

Implements ParticleBase.

Reimplemented in Resonance.

Definition at line 342 of file InternalParticle.cc.

343 {
344 // { x, y, z, tau, px, py, pz, E }
345 // the last 4 always exists for composite particles
346 // tau index only exist with a vertex and geo constraint
347 //
348 if (m_shares_vertex_with_mother) { return 4; }
349 else if (!m_geo_constraint) { return 7; }
350 else { return 8; }
351 }

◆ eneIndex()

int eneIndex ( ) const
inlineinherited

get energy index

Definition at line 138 of file ParticleBase.h.

138{ return hasEnergy() ? momIndex() + 3 : -1 ; }
virtual int momIndex() const
get momentum index
Definition: ParticleBase.h:128
virtual bool hasEnergy() const
get momentum dimension
Definition: ParticleBase.h:132

◆ forceP4Sum()

void forceP4Sum ( FitParams fitparams) const
overridevirtual

enforce conservation of momentum sum

Reimplemented from ParticleBase.

Definition at line 417 of file InternalParticle.cc.

418 {
419 for (const auto daughter : m_daughters) {
420 daughter->forceP4Sum(fitparams);
421 }
422 const int momindex = momIndex();
423 if (momindex > 0) {
424 const int dim = hasEnergy() ? 4 : 3;
425 Projection p(fitparams.getDimensionOfState(), dim);
426 projectKineConstraint(fitparams, p);
427 fitparams.getStateVector().segment(momindex, dim) -= p.getResiduals().segment(0, dim);
428 }
429 }
ErrCode projectKineConstraint(const FitParams &, Projection &) const
project kinematical constraint
virtual bool hasEnergy() const override
has energy in fitparams

◆ hasEnergy()

virtual bool hasEnergy ( ) const
inlineoverridevirtual

has energy in fitparams

Reimplemented from ParticleBase.

Definition at line 68 of file InternalParticle.h.

68{ return true ; }

◆ hasPosition()

bool hasPosition ( ) const
overridevirtual

has position index

Reimplemented from ParticleBase.

Reimplemented in Resonance.

Definition at line 375 of file InternalParticle.cc.

376 {
377 // does this particle have a position index (decayvertex)
378 // true in any case
379 return true;
380 }

◆ index()

int index ( ) const
inlineinherited

get index

Definition at line 95 of file ParticleBase.h.

95{ return m_index ; }

◆ initCovariance()

ErrCode initCovariance ( FitParams fitparams) const
overridevirtual

init covariance

Reimplemented from ParticleBase.

Definition at line 229 of file InternalParticle.cc.

230 {
231 ErrCode status;
233 for (auto daughter : m_daughters) {
234 status |= daughter->initCovariance(fitparams);
235 }
236 return status;
237 }
virtual ErrCode initCovariance(FitParams &) const
init covariance matrix

◆ initMomentum()

ErrCode initMomentum ( FitParams fitparams) const
protected

init momentum of *this and daughters

Definition at line 206 of file InternalParticle.cc.

207 {
208 int momindex = momIndex();
209 fitparams.getStateVector().segment(momindex, 4) = Eigen::Matrix<double, 4, 1>::Zero(4);
210
211 for (auto daughter : m_daughters) {
212 int daumomindex = daughter->momIndex();
213 int maxrow = daughter->hasEnergy() ? 4 : 3;
214
215 double e2 = fitparams.getStateVector().segment(daumomindex, maxrow).squaredNorm();
216 fitparams.getStateVector().segment(momindex, maxrow) += fitparams.getStateVector().segment(daumomindex, maxrow);
217
218 if (maxrow == 3) {
219 double mass = 0;
220 if (daughter->particle()->hasExtraInfo("treeFitterMassConstraintValue")) {
221 mass = daughter->particle()->getExtraInfo("treeFitterMassConstraintValue");
222 } else mass = daughter->particle()->getPDGMass();
223 fitparams.getStateVector()(momindex + 3) += std::sqrt(e2 + mass * mass);
224 }
225 }
226 return ErrCode(ErrCode::Status::success);
227 }

◆ initMotherlessParticle()

ErrCode initMotherlessParticle ( FitParams fitparams)
overridevirtual

init particle in case it has no mother

(0,0,0) is the best guess in any other case

Implements ParticleBase.

Reimplemented in Resonance.

Definition at line 89 of file InternalParticle.cc.

90 {
91 ErrCode status ;
92 for (auto daughter : m_daughters) {
93 status |= daughter->initMotherlessParticle(fitparams);
94 }
95
96 int posindex = posIndex();
97 // FIXME update this and check if this position is already initialised
98 // lower stream vertices might be better
99 if (hasPosition()) {
100 fitparams.getStateVector().segment(posindex, 3) = Eigen::Matrix<double, 3, 1>::Zero(3);
101
102 std::vector<ParticleBase*> alldaughters;
103 ParticleBase::collectVertexDaughters(alldaughters, posindex);
104
105 std::vector<ParticleBase*> vtxdaughters;
106
107 vector<RecoTrack*> trkdaughters;
108 for (auto daughter : alldaughters) {
109 if (daughter->type() == ParticleBase::TFParticleType::kRecoTrack) {
110 trkdaughters.push_back(static_cast<RecoTrack*>(daughter));
111 } else if (daughter->hasPosition()
112 && fitparams.getStateVector()(daughter->posIndex()) != 0) {
113 vtxdaughters.push_back(daughter);
114 }
115 }
116
117 if (trkdaughters.size() >= 2) {
118
119 auto v0 = particle()->getV0();
120 auto dummy_vertex = ROOT::Math::XYZVector(0, 0, 0);
121
122 bool initWithV0 = false;
123 if (v0 && v0->getFittedVertexPosition() != dummy_vertex) {
124 auto part_dau1 = particle()->getDaughter(0);
125 auto part_dau2 = particle()->getDaughter(1);
126
127 auto recotrack_dau1 = std::find_if(trkdaughters.begin(), trkdaughters.end(),
128 [&part_dau1](RecoTrack * rt) { return rt->particle()->getMdstSource() == part_dau1->getMdstSource(); });
129 auto recotrack_dau2 = std::find_if(trkdaughters.begin(), trkdaughters.end(),
130 [&part_dau2](RecoTrack * rt) { return rt->particle()->getMdstSource() == part_dau2->getMdstSource(); });
131
132 if (recotrack_dau1 == trkdaughters.end() || recotrack_dau2 == trkdaughters.end()) {
133 B2WARNING("V0 daughter particles do not match with RecoTracks.");
134 } else {
135 double X_V0(v0->getFittedVertexX()), Y_V0(v0->getFittedVertexY()), Z_V0(v0->getFittedVertexZ());
136 fitparams.getStateVector()(posindex) = X_V0;
137 fitparams.getStateVector()(posindex + 1) = Y_V0;
138 fitparams.getStateVector()(posindex + 2) = Z_V0;
139
140 Belle2::Helix helix1 = v0->getTrackFitResults().first->getHelix();
141 Belle2::Helix helix2 = v0->getTrackFitResults().second->getHelix();
142
143 (*recotrack_dau1)->setFlightLength(helix1.getArcLength2DAtXY(X_V0, Y_V0));
144 (*recotrack_dau2)->setFlightLength(helix2.getArcLength2DAtXY(X_V0, Y_V0));
145
146 initWithV0 = true;
147 }
148 }
149
150 if (!initWithV0) {
151 std::sort(trkdaughters.begin(), trkdaughters.end(), compTrkTransverseMomentum);
152
153 RecoTrack* dau1 = trkdaughters[0];
154 RecoTrack* dau2 = trkdaughters[1];
155
156 Belle2::Helix helix1 = dau1->particle()->getTrackFitResult()->getHelix();
157 Belle2::Helix helix2 = dau2->particle()->getTrackFitResult()->getHelix();
158
159 double flt1(0), flt2(0);
161 HelixUtils::helixPoca(helix1, helix2, flt1, flt2, v, m_isconversion);
162
163 fitparams.getStateVector()(posindex) = v.X();
164 fitparams.getStateVector()(posindex + 1) = v.Y();
165 fitparams.getStateVector()(posindex + 2) = v.Z();
166
167 dau1->setFlightLength(flt1);
168 dau2->setFlightLength(flt2);
169 }
170
171 } else if (false && trkdaughters.size() + vtxdaughters.size() >= 2) {
172 // TODO switched off waiting for refactoring of init1 and init2 functions (does not affect performance)
173 } else if (mother() && mother()->posIndex() >= 0) {
174 const int posindexmother = mother()->posIndex();
175 const int dim = m_config->m_originDimension; //TODO access mother
176 fitparams.getStateVector().segment(posindex, dim) = fitparams.getStateVector().segment(posindexmother, dim);
177 } else {
179 fitparams.getStateVector().segment(posindex, 3) = Eigen::Matrix<double, 1, 3>::Zero(3);
180 }
181 }
182
183 for (auto daughter : m_daughters) {
184 daughter->initParticleWithMother(fitparams);
185 }
186
187 initMomentum(fitparams);
188 return status;
189 }
DataType Z() const
access variable Z (= .at(2) without boundary check)
Definition: B2Vector3.h:435
DataType X() const
access variable X (= .at(0) without boundary check)
Definition: B2Vector3.h:431
DataType Y() const
access variable Y (= .at(1) without boundary check)
Definition: B2Vector3.h:433
Helix parameter class.
Definition: Helix.h:48
const V0 * getV0() const
Returns the pointer to the V0 object that was used to create this Particle (if ParticleType == c_V0).
Definition: Particle.cc:956
const Particle * getDaughter(unsigned i) const
Returns a pointer to the i-th daughter particle.
Definition: Particle.cc:662
static double helixPoca(const Belle2::Helix &helix1, const Belle2::Helix &helix2, double &flt1, double &flt2, Belle2::B2Vector3D &vertex, bool parallel=false)
POCA between two tracks.
Definition: HelixUtils.cc:214
virtual bool hasPosition() const override
has position index
ErrCode initMomentum(FitParams &fitparams) const
init momentum of *this and daughters
static bool compTrkTransverseMomentum(const RecoTrack *lhs, const RecoTrack *rhs)
compare transverse track momentum
virtual int posIndex() const override
position index in fit params
void collectVertexDaughters(std::vector< ParticleBase * > &particles, int posindex)
get vertex daughters

◆ initParticleWithMother()

ErrCode initParticleWithMother ( FitParams fitparams)
overridevirtual

init particle in case it has a mother

Implements ParticleBase.

Reimplemented in Resonance.

Definition at line 191 of file InternalParticle.cc.

192 {
193 int posindex = posIndex();
194 if (hasPosition() &&
195 mother() &&
196 fitparams.getStateVector()(posindex) == 0 &&
197 fitparams.getStateVector()(posindex + 1) == 0 && \
198 fitparams.getStateVector()(posindex + 2) == 0) {
199 const int posindexmom = mother()->posIndex();
200 const int dim = m_config->m_originDimension; //TODO access mother?
201 fitparams.getStateVector().segment(posindex, dim) = fitparams.getStateVector().segment(posindexmom, dim);
202 }
203 return initTau(fitparams);
204 }
ErrCode initTau(FitParams &par) const
initialises tau as a length

◆ initTau()

ErrCode initTau ( FitParams par) const
protectedinherited

initialises tau as a length

Definition at line 435 of file ParticleBase.cc.

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

◆ 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()

int momIndex ( ) const
overridevirtual

momentum index in fit params depending on whether it has a mother

indexing in { x, y, z, tau, px, py, pz, E } but tau is not existing for all InternalParticles

Reimplemented from ParticleBase.

Reimplemented in Resonance.

Definition at line 359 of file InternalParticle.cc.

360 {
365 if (m_geo_constraint && !m_shares_vertex_with_mother) { return this->index() + 4; }
366
367 if (m_shares_vertex_with_mother) { return this->index(); }
368
369 if (!m_geo_constraint) {return index() + 3 ;}
370
371 // this will crash the initialisation
372 return -1;
373 }
int index() const
get index
Definition: ParticleBase.h:95

◆ mother()

const ParticleBase * mother ( ) const
inlineinherited

getMother() / hasMother()

Definition at line 98 of file ParticleBase.h.

98{ return m_mother; };
const ParticleBase * m_mother
motherparticle
Definition: ParticleBase.h:195

◆ 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
overridevirtual

name

Reimplemented from ParticleBase.

Reimplemented in Resonance.

Definition at line 410 of file InternalParticle.cc.

411 {
412 int id = thisindex;
413 if (!mother() && id >= 3) {++id;}
414 return ParticleBase::parname(id);
415 }
virtual std::string parname(int index) const
get name of parameter i

◆ particle()

Belle2::Particle * particle ( ) const
inlineinherited

get basf2 particle

Definition at line 92 of file ParticleBase.h.

92{ return m_particle ; }

◆ posIndex()

int posIndex ( ) const
overridevirtual

position index in fit params

Reimplemented from ParticleBase.

Reimplemented in Resonance.

Definition at line 336 of file InternalParticle.cc.

337 {
338 // for example B0 and D* can share the same vertex
339 return m_shares_vertex_with_mother ? this->mother()->posIndex() : index();
340 }

◆ projectBeamConstraint()

ErrCode projectBeamConstraint ( const FitParams fitparams,
Projection p 
) const

project beam four momentum constraint

Definition at line 291 of file InternalParticle.cc.

293 {
294
295 const int momindex = momIndex() ;
296
297 const Eigen::Matrix<double, 4, 1> fitMomE = fitparams.getStateVector().segment(momindex, 4);
298
299 p.getResiduals() = m_config->m_beamMomE - fitMomE;
300
301 for (int row = 0; row < 4; ++row) {
302 p.getH()(row, momindex + row) = -1;
303 }
304
305 p.getV() = m_config->m_beamCovariance;
306
307 return ErrCode(ErrCode::Status::success) ;
308 }
Eigen::Matrix< double, 4, 1 > m_beamMomE
Beam four-momentum.
Eigen::Matrix< double, 4, 4 > m_beamCovariance
Beam Covariance.

◆ projectConstraint()

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

find out which constraint it is and project

Reimplemented from ParticleBase.

Definition at line 311 of file InternalParticle.cc.

314 {
315 ErrCode status;
316 switch (type) {
317 case Constraint::mass:
318 status |= projectMassConstraint(fitparams, p);
319 break;
320 case Constraint::geometric:
321 status |= projectGeoConstraint(fitparams, p);
322 break;
323 case Constraint::kinematic:
324 status |= projectKineConstraint(fitparams, p);
325 break;
326 case Constraint::beam:
327 status |= projectBeamConstraint(fitparams, p);
328 break;
329 default:
330 status |= ParticleBase::projectConstraint(type, fitparams, p);
331 }
332
333 return status;
334 }
ErrCode projectBeamConstraint(const FitParams &, Projection &) const
project beam four momentum constraint
virtual int type() const override
type
virtual ErrCode projectMassConstraint(const FitParams &, Projection &) const
project mass constraint abstract
virtual ErrCode projectConstraint(Constraint::Type, const FitParams &, Projection &) const
project constraint.
virtual ErrCode projectGeoConstraint(const FitParams &, Projection &) const
project geometrical constraint

◆ 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::Matrix < double, 1, -1, 1, 1, 3 > x_vec = fitparams.getStateVector().segment(posindex, dim);
259 Eigen::Matrix < double, 1, -1, 1, 1, 3 > x_m = fitparams.getStateVector().segment(posindexmother, dim);
260 Eigen::Matrix < double, 1, -1, 1, 1, 3 > 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 for (int row = 0; row < dim; ++row) {
295
296 double posxmother = x_m(row);
297 double posx = x_vec(row);
298 double momx = p_vec(row);
299
303 p.getResiduals()(row) = posxmother + tau * momx / mom - posx ;
304 p.getH()(row, posindexmother + row) = 1;
305 p.getH()(row, posindex + row) = -1;
306 p.getH()(row, tauindex) = momx / mom;
307 }
308
309 return ErrCode(ErrCode::Status::success);
310 }

◆ projectKineConstraint()

ErrCode projectKineConstraint ( const FitParams fitparams,
Projection p 
) const

project kinematical constraint

Definition at line 240 of file InternalParticle.cc.

242 {
243 const int momindex = momIndex();
244
245 // `this` always has an energy row
246 p.getResiduals().segment(0, 4) = fitparams.getStateVector().segment(momindex, 4);
247
248 for (int imom = 0; imom < 4; ++imom) {
249 p.getH()(imom, momindex + imom) = 1;
250 }
251
252 for (const auto daughter : m_daughters) {
253 const int daumomindex = daughter->momIndex();
254 const Eigen::Matrix<double, 1, 3> p3_vec = fitparams.getStateVector().segment(daumomindex, 3);
255
256 // three momentum is easy just subtract the vectors
257 p.getResiduals().segment(0, 3) -= p3_vec;
258
259 // energy depends on the parametrisation!
260 if (daughter->hasEnergy()) {
261 p.getResiduals()(3) -= fitparams.getStateVector()(daumomindex + 3);
262 p.getH()(3, daumomindex + 3) = -1; // d/dE -E
263 } else {
264 // m^2 + p^2 = E^2
265 // so
266 // E = sqrt(m^2 + p^2)
267 double mass = 0;
268 if (daughter->particle()->hasExtraInfo("treeFitterMassConstraintValue")) {
269 mass = daughter->particle()->getExtraInfo("treeFitterMassConstraintValue");
270 } else mass = daughter->particle()->getPDGMass();
271 const double p2 = p3_vec.squaredNorm();
272 const double energy = std::sqrt(mass * mass + p2);
273 p.getResiduals()(3) -= energy;
274
275 for (unsigned i = 0; i < 3; ++i) {
276 // d/dpx_i sqrt(m^2 + p^2)
277 p.getH()(3, daumomindex + i) = -1 * p3_vec(i) / energy;
278 }
279 }
280
281 // this has to be in any case
282 // d/dp_i p_i
283 for (unsigned i = 0; i < 3; ++i) {
284 p.getH()(i, daumomindex + i) = -1;
285 }
286 }
287 return ErrCode(ErrCode::Status::success);
288 }

◆ projectMassConstraint()

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

project mass constraint abstract

Definition at line 414 of file ParticleBase.cc.

416 {
417 assert(m_config);
418 if (m_config->m_massConstraintType == 0) {
419 return projectMassConstraintParticle(fitparams, p);
420 } else {
421 return projectMassConstraintDaughters(fitparams, p);
422 }
423 }
const bool m_massConstraintType
const flag for the type of the mass 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

◆ 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 312 of file ParticleBase.cc.

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

384 {
385 double mass = 0;
386 if (particle()->hasExtraInfo("treeFitterMassConstraintValue")) mass = particle()->getExtraInfo("treeFitterMassConstraintValue");
387 else mass = particle()->getPDGMass();
388 const double mass2 = mass * mass;
389 const int momindex = momIndex();
390 const double px = fitparams.getStateVector()(momindex);
391 const double py = fitparams.getStateVector()(momindex + 1);
392 const double pz = fitparams.getStateVector()(momindex + 2);
393 const double E = fitparams.getStateVector()(momindex + 3);
394
398 p.getResiduals()(0) = mass2 - E * E + px * px + py * py + pz * pz;
399
400 p.getH()(0, momindex) = 2.0 * px;
401 p.getH()(0, momindex + 1) = 2.0 * py;
402 p.getH()(0, momindex + 2) = 2.0 * pz;
403 p.getH()(0, momindex + 3) = -2.0 * E;
404
405 // TODO 0 in most cases -> needs special treatment if width=0 to not crash chi2 calculation
406 // const double width = TDatabasePDG::Instance()->GetParticle(particle()->getPDGCode())->Width();
407 // transport measurement uncertainty into residual system
408 // f' = sigma_x^2 * (df/dx)^2
409 // p.getV()(0) = width * width * 4 * mass2;
410
411 return ErrCode(ErrCode::Status::success);
412 }

◆ 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 189 of file ParticleBase.h.

189{ m_index = i ; }

◆ setMassConstraint()

void setMassConstraint ( bool  b)
inline

set mass constraint flag

Definition at line 80 of file InternalParticle.h.

80{ m_massconstraint = b ; }

◆ setMother()

void setMother ( const ParticleBase m)
inlineinherited

set mother

Definition at line 164 of file ParticleBase.h.

164{ m_mother = m ; }

◆ tauIndex()

int tauIndex ( ) const
overridevirtual

tau index in fit params only if it has a mother

only exists if particle is geo constraint and has a mother

Reimplemented from ParticleBase.

Reimplemented in Resonance.

Definition at line 353 of file InternalParticle.cc.

354 {
356 return m_geo_constraint ? index() + 3 : -1;
357 }

◆ type()

virtual int type ( ) const
inlineoverridevirtual

type

Implements ParticleBase.

Reimplemented in Resonance.

Definition at line 56 of file InternalParticle.h.

56{ return kInternalParticle ; }

◆ 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_automatic_vertex_constraining

bool m_automatic_vertex_constraining
private

automatically figure out if mother and particle vertex should be the same and also add geometric constraints

Definition at line 112 of file InternalParticle.h.

◆ m_beamconstraint

bool m_beamconstraint
private

has beam constraint

Definition at line 96 of file InternalParticle.h.

◆ m_config

const ConstraintConfiguration* m_config
protectedinherited

has all the constraint config

Definition at line 204 of file ParticleBase.h.

◆ m_daughters

std::vector<ParticleBase*> m_daughters
protectedinherited

daughter container

Definition at line 198 of file ParticleBase.h.

◆ m_geo_constraint

bool m_geo_constraint
private

use a geo metric constraint

Definition at line 102 of file InternalParticle.h.

◆ m_index

int m_index
privateinherited

index

Definition at line 208 of file ParticleBase.h.

◆ m_isconversion

bool m_isconversion
private

is conversion

Definition at line 108 of file InternalParticle.h.

◆ m_isStronglyDecayingResonance

bool m_isStronglyDecayingResonance
protectedinherited

decay length less than 1 micron

Definition at line 201 of file ParticleBase.h.

◆ m_lifetimeconstraint

bool m_lifetimeconstraint
private

has lifetime constraint

Definition at line 105 of file InternalParticle.h.

◆ m_massconstraint

bool m_massconstraint
private

has mass constraint

Definition at line 93 of file InternalParticle.h.

◆ m_mother

const ParticleBase* m_mother
protectedinherited

motherparticle

Definition at line 195 of file ParticleBase.h.

◆ m_name

std::string m_name
privateinherited

name

Definition at line 211 of file ParticleBase.h.

◆ m_particle

Belle2::Particle* m_particle
protectedinherited

pointer to framework type

Definition at line 192 of file ParticleBase.h.

◆ m_shares_vertex_with_mother

bool m_shares_vertex_with_mother
private

shares vertex with mother, that means decay vertex = productionvertex

Definition at line 99 of file InternalParticle.h.


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