Belle II Software development
RecoPhoton Class Reference

representation of the photon constraint More...

#include <RecoPhoton.h>

Inheritance diagram for RecoPhoton:
RecoParticle ParticleBase

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

 RecoPhoton (Belle2::Particle *bc, const ParticleBase *mother)
 constructor
 
virtual ~RecoPhoton ()
 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 photon 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 ? from momentum or from E ?

 
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 bool useEnergy (const Belle2::Particle &cand)
 has energy in fit params?
 
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*
 
bool m_useEnergy
 has energy ins statevector
 
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
 
int m_index
 index
 
std::string m_name
 name

 

Detailed Description

representation of the photon constraint

Definition at line 16 of file RecoPhoton.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

◆ RecoPhoton()

RecoPhoton ( Belle2::Particle bc,
const ParticleBase mother 
)

constructor

Definition at line 26 of file RecoPhoton.cc.

27 m_dim(3),
28 m_init(false),
33 {
34 initParams();
35 }
double getEffectiveMomentumScale() const
Returns effective momentum scale which is the product of the momentum scaling and smearing factors.
Definition: Particle.h:614
Belle2::Particle * particle() const
get basf2 particle
Definition: ParticleBase.h:92
const ParticleBase * mother() const
getMother() / hasMother()
Definition: ParticleBase.h:98
RecoParticle(Belle2::Particle *bc, const ParticleBase *mother)
constructor
Definition: RecoParticle.cc:15
bool m_useEnergy
has energy ins statevector
Definition: RecoPhoton.h:70
Eigen::Matrix< double, 4, 4 > m_covariance
covariance (x_c,y_c,z_c,E_c) of measured pars
Definition: RecoPhoton.h:76
ErrCode initParams()
update or init params
Definition: RecoPhoton.cc:92
const float m_momentumScalingFactor
scale the momentum / energy by this correction factor
Definition: RecoPhoton.h:86
const int m_dim
dimension of residuals and 'width' of H
Definition: RecoPhoton.h:64
static bool useEnergy(const Belle2::Particle &cand)
has energy in fit params?
Definition: RecoPhoton.cc:63
bool m_init
was initialized*
Definition: RecoPhoton.h:67
Eigen::Matrix< double, 1, 4 > m_clusterPars
constrains measured params (x_c, y_c, z_c, E_c)
Definition: RecoPhoton.h:73

◆ ~RecoPhoton()

virtual ~RecoPhoton ( )
inlinevirtual

destructor

Definition at line 23 of file RecoPhoton.h.

23{};

Member Function Documentation

◆ addDaughter()

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

add daughter

Definition at line 65 of file ParticleBase.cc.

66 {
67 auto newDaughter = ParticleBase::createParticle(cand, this, config, forceFitAll);
68 m_daughters.push_back(newDaughter);
69 return m_daughters.back();
70 }
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()

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

add to list

Implements ParticleBase.

Definition at line 53 of file RecoPhoton.h.

54 {
55 alist.push_back(Constraint(this, Constraint::photon, depth, dimM())) ;
56 }
virtual int dimM() const override
sets the size of the corresponding residual projection
Definition: RecoPhoton.h:41

◆ 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 }
int getPDGCode(void) const
Returns PDG code.
Definition: Particle.h:454
double getCharge(void) const
Returns particle charge.
Definition: Particle.cc:622
Belle2::Particle * m_particle
pointer to framework type
Definition: ParticleBase.h:192

◆ chiSquare()

double chiSquare ( const FitParams fitparams) const
virtualinherited

get chi2

Definition at line 231 of file ParticleBase.cc.

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

◆ collectVertexDaughters()

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

get vertex daughters

Definition at line 156 of file ParticleBase.cc.

157 {
158 if (mother() && mother()->posIndex() == posindex) {
159 particles.push_back(this);
160 }
161
162 for (auto* daughter : m_daughters) {
163 daughter->collectVertexDaughters(particles, posindex);
164 }
165 }
virtual int posIndex() const
get vertex index (in statevector!)
Definition: ParticleBase.h:122

◆ createOrigin()

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

create a custom origin particle or a beamspot

Definition at line 93 of file ParticleBase.cc.

98 {
99 return new Origin(daughter, config, forceFitAll);
100 }

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

104 {
105 ParticleBase* rc = nullptr;
106
107 if (!mother) { // If there is no mother, this is the 'head of tree' particle (is never a resonance)
108 rc = new InternalParticle(particle, nullptr, config, forceFitAll);
109 } else if (particle->hasExtraInfo("bremsCorrected") // Has Bremsstrahlungs-recovery
110 && particle->getExtraInfo("bremsCorrected") != 0) { // and gammas are attached
111 rc = new Composite(particle, mother, config, true);
112 // if no gamma is attached, it is treated as a RecoTrack
113 } else if (particle->hasExtraInfo("treeFitterTreatMeAsInvisible")
114 && particle->getExtraInfo("treeFitterTreatMeAsInvisible") == 1) { // dummy particles with invisible flag
115 rc = new RecoResonance(particle, mother, config);
116 } else if (particle->getTrack()) { // external reconstructed track
117 rc = new RecoTrack(particle, mother);
118 } else if (particle->getECLCluster()) { // external reconstructed photon
119 rc = new RecoPhoton(particle, mother);
120 } else if (particle->getKLMCluster()) { // external reconstructed klong
121 rc = new RecoKlong(particle, mother);
122 } else if (particle->getMdstArrayIndex()) { // external composite e.g. V0
123 rc = new InternalParticle(particle, mother, config, forceFitAll);
124 } else { // 'internal' particles
125 if (isAResonance(particle)) {
126 rc = new Resonance(particle, mother, config, forceFitAll);
127 } else {
128 rc = new InternalParticle(particle, mother, config, forceFitAll);
129 }
130 }
131 return rc;
132 }
const KLMCluster * getKLMCluster() const
Returns the pointer to the KLMCluster object that was used to create this Particle (ParticleType == c...
Definition: Particle.cc:926
const Track * getTrack() const
Returns the pointer to the Track object that was used to create this Particle (ParticleType == c_Trac...
Definition: Particle.cc:845
const ECLCluster * getECLCluster() const
Returns the pointer to the ECLCluster object that was used to create this Particle (if ParticleType =...
Definition: Particle.cc:891
bool hasExtraInfo(const std::string &name) const
Return whether the extra info with the given name is set.
Definition: Particle.cc:1266
unsigned getMdstArrayIndex(void) const
Returns 0-based index of MDST store array object (0 for composite particles)
Definition: Particle.h:487
double getExtraInfo(const std::string &name) const
Return given value if set.
Definition: Particle.cc:1289
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...
ParticleBase(Belle2::Particle *particle, const ParticleBase *mother, const ConstraintConfiguration *config=nullptr)
default constructor
Definition: ParticleBase.cc:30

◆ dim()

virtual int dim ( ) const
inlineoverridevirtual

set the size of the particle in the statevector

Reimplemented from RecoParticle.

Definition at line 47 of file RecoPhoton.h.

47{ return m_dim; }

◆ dimM()

virtual int dimM ( ) const
inlineoverridevirtual

sets the size of the corresponding residual projection

Implements RecoParticle.

Definition at line 41 of file RecoPhoton.h.

41{ return dim(); }
virtual int dim() const override
set the size of the particle in the statevector
Definition: RecoPhoton.h:47

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

virtual void forceP4Sum ( FitParams ) const
inlinevirtualinherited

force p4 sum conservation all along the tree

Reimplemented in InternalParticle.

Definition at line 116 of file ParticleBase.h.

116{} ;

◆ hasEnergy()

virtual bool hasEnergy ( ) const
inlineoverridevirtual

how should the energy be calculated ? from momentum or from E ?

Reimplemented from RecoParticle.

Definition at line 44 of file RecoPhoton.h.

44{ return false; }

◆ hasPosition()

virtual bool hasPosition ( ) const
inlinevirtualinherited

get false

Reimplemented in Composite, InternalParticle, and Resonance.

Definition at line 135 of file ParticleBase.h.

135{ return false ; }

◆ 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 75 of file RecoPhoton.cc.

76 {
77 const int momindex = momIndex();
78 const int posindex = mother()->posIndex();
79
80 const double factorE = 1000 * m_covariance(3, 3);
81 const double factorX = 1000; // ~ 10cm error on initial vertex
82
83 fitparams.getCovariance().block<4, 4>(momindex, momindex) =
84 Eigen::Matrix<double, 4, 4>::Identity(4, 4) * factorE;
85
86 fitparams.getCovariance().block<3, 3>(posindex, posindex) =
87 Eigen::Matrix<double, 3, 3>::Identity(3, 3) * factorX;
88
89 return ErrCode(ErrCode::Status::success);
90 }
virtual int momIndex() const override
get momentum index
Definition: RecoParticle.h:42

◆ initMotherlessParticle()

ErrCode initMotherlessParticle ( FitParams fitparams)
overridevirtual

init particle without mother

Reimplemented from RecoParticle.

Definition at line 58 of file RecoPhoton.cc.

59 {
60 return ErrCode(ErrCode::Status::success);
61 }

◆ initParams()

ErrCode initParams ( )

update or init params

Definition at line 92 of file RecoPhoton.cc.

93 {
94 const Belle2::ECLCluster* cluster = particle()->getECLCluster();
96 const Belle2::B2Vector3D centroid = cluster->getClusterPosition();
97 const double energy = cluster->getEnergy(clusterhypo);
98
99 m_init = true;
100 m_covariance = Eigen::Matrix<double, 4, 4>::Zero(4, 4);
102
103 TMatrixDSym cov_EPhiTheta = C.GetCovarianceMatrix3x3FromCluster(cluster);
104
105 Eigen::Matrix<double, 2, 2> covPhiTheta = Eigen::Matrix<double, 2, 2>::Zero(2, 2);
106
107 for (int row = 0; row < 2; ++row) {
108 // we go through all elements here instead of selfadjoint view later
109 for (int col = 0; col < 2; ++col) {
110 covPhiTheta(row, col) = cov_EPhiTheta[row + 1][col + 1];
111 }
112 }
113
114 // the in going x-E correlations are 0 so we don't fill them
115 const double R = cluster->getR();
116 const double theta = cluster->getPhi();
117 const double phi = cluster->getTheta();
118
119 const double st = std::sin(theta);
120 const double ct = std::cos(theta);
121 const double sp = std::sin(phi);
122 const double cp = std::cos(phi);
123
124 Eigen::Matrix<double, 2, 3> polarToCartesian = Eigen::Matrix<double, 2, 3>::Zero(2, 3);
125
126 // polarToCartesian({phi,theta} -> {x,y,z} )
127 polarToCartesian(0, 0) = -1. * R * st * sp; // dx/dphi
128 polarToCartesian(0, 1) = R * st * cp; // dy/dphi
129 polarToCartesian(0, 2) = 0; // dz/dphi
130
131 polarToCartesian(1, 0) = R * ct * cp; // dx/dtheta
132 polarToCartesian(1, 1) = R * ct * sp; // dy/dtheta
133 polarToCartesian(1, 2) = -1. * R * st; // dz/dtheta
134
135 m_covariance.block<3, 3>(0, 0) = polarToCartesian.transpose() * covPhiTheta * polarToCartesian;
136
137 m_covariance(3, 3) = cov_EPhiTheta[0][0];
138 m_clusterPars(0) = centroid.X();
139 m_clusterPars(1) = centroid.Y();
140 m_clusterPars(2) = centroid.Z();
141 m_clusterPars(3) = energy;
142
143 auto p_vec = particle()->getMomentum();
144 // find highest momentum, eliminate dim with highest mom
145 if ((std::abs(p_vec.X()) >= std::abs(p_vec.Y())) && (std::abs(p_vec.X()) >= std::abs(p_vec.Z()))) {
146 m_i1 = 0;
147 m_i2 = 1;
148 m_i3 = 2;
149 } else if ((std::abs(p_vec.Y()) >= std::abs(p_vec.X())) && (std::abs(p_vec.Y()) >= std::abs(p_vec.Z()))) {
150 m_i1 = 1;
151 m_i2 = 0;
152 m_i3 = 2;
153 } else if ((std::abs(p_vec.Z()) >= std::abs(p_vec.Y())) && (std::abs(p_vec.Z()) >= std::abs(p_vec.X()))) {
154 m_i1 = 2;
155 m_i2 = 1;
156 m_i3 = 0;
157 } else {
158 B2ERROR("Could not estimate highest momentum for photon constraint. Aborting this fit.\n px: "
159 << p_vec.X() << " py: " << p_vec.Y() << " pz: " << p_vec.Z() << " calculated from Ec: " << m_clusterPars(3));
160 return ErrCode(ErrCode::Status::photondimerror);
161 }
162
163 return ErrCode(ErrCode::Status::success);
164 }
double R
typedef autogenerated by FFTW
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
Class to provide momentum-related information from ECLClusters.
Definition: ClusterUtils.h:36
const TMatrixDSym GetCovarianceMatrix3x3FromCluster(const ECLCluster *cluster)
Returns 3x3 covariance matrix (E, theta, phi)
ECL cluster data.
Definition: ECLCluster.h:27
EHypothesisBit
The hypothesis bits for this ECLCluster (Connected region (CR) is split using this hypothesis.
Definition: ECLCluster.h:31
ROOT::Math::XYZVector getMomentum() const
Returns momentum vector.
Definition: Particle.h:560
ECLCluster::EHypothesisBit getECLClusterEHypothesisBit() const
Returns the ECLCluster EHypothesisBit for this Particle.
Definition: Particle.h:1001
int m_i3
another random index
Definition: RecoPhoton.h:83
int m_i1
index with the highest momentum.
Definition: RecoPhoton.h:79
int m_i2
random other index
Definition: RecoPhoton.h:81

◆ initParticleWithMother()

ErrCode initParticleWithMother ( FitParams fitparams)
overridevirtual

init particle with mother

Implements ParticleBase.

Definition at line 37 of file RecoPhoton.cc.

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

◆ initTau()

ErrCode initTau ( FitParams par) const
protectedinherited

initialises tau as a length

Definition at line 426 of file ParticleBase.cc.

427 {
428 const int tauindex = tauIndex();
429 if (tauindex >= 0 && hasPosition()) {
430
431 const int posindex = posIndex();
432 const int mother_ps_index = mother()->posIndex();
433 const int dim = m_config->m_originDimension; // TODO can we configure this to be particle specific?
434
435 // tau has different meaning depending on the dimension of the constraint
436 // 2-> use x-y projection
437 const Eigen::Matrix < double, 1, -1, 1, 1, 3 > vertex_dist =
438 fitparams.getStateVector().segment(posindex, dim) - fitparams.getStateVector().segment(mother_ps_index, dim);
439 const Eigen::Matrix < double, 1, -1, 1, 1, 3 >
440 mom = fitparams.getStateVector().segment(posindex, dim) - fitparams.getStateVector().segment(mother_ps_index, dim);
441
442 // if an intermediate vertex is not well defined by a track or so it will be initialised with 0
443 // same for the momentum of for example B0, it might be initialised with 0
444 // in those cases use pdg value
445 const double mom_norm = mom.norm();
446 const double dot = std::abs(vertex_dist.dot(mom));
447 const double tau = dot / mom_norm;
448 if (0 == mom_norm || 0 == dot) {
449 const double mass = m_particle->getPDGMass();
450 if (mass > 0)
451 fitparams.getStateVector()(tauindex) = m_particle->getPDGLifetime() * 1e9 * Belle2::Const::speedOfLight / mass;
452 else
453 fitparams.getStateVector()(tauindex) = 0;
454 } else {
455 fitparams.getStateVector()(tauindex) = tau;
456 }
457 }
458
459 return ErrCode(ErrCode::Status::success);
460 }
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:604
double getPDGLifetime() const
Returns particle nominal lifetime.
Definition: Particle.cc:613
const int m_originDimension
dimension of the origin constraint and ALL geometric gcosntraints
virtual int dim() const =0
get dimension of constraint
const ConstraintConfiguration * m_config
has all the constraint config
Definition: ParticleBase.h:204
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 134 of file ParticleBase.cc.

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

◆ locate()

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

get particle base from basf2 particle

Definition at line 211 of file ParticleBase.cc.

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

◆ momIndex()

virtual int momIndex ( ) const
inlineoverridevirtualinherited

get momentum index

Reimplemented from ParticleBase.

Definition at line 42 of file RecoParticle.h.

42{ return index(); }
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 240 of file ParticleBase.cc.

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

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

virtual int posIndex ( ) const
inlinevirtualinherited

get vertex index (in statevector!)

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

Definition at line 122 of file ParticleBase.h.

122{ 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::photon :
34 case Constraint::klong :
35 status |= projectRecoConstraint(fitparams, p);
36 break ;
37 default:
38 status |= ParticleBase::projectConstraint(type, fitparams, p);
39 }
40 return status;
41 }
virtual ErrCode projectConstraint(Constraint::Type, const FitParams &, Projection &) const
project constraint.
virtual int type() const =0
get particle type
virtual ErrCode projectRecoConstraint(const FitParams &fitparams, Projection &p) const =0
abstract projection

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

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

◆ projectMassConstraint()

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

project mass constraint abstract

Definition at line 405 of file ParticleBase.cc.

407 {
408 assert(m_config);
409 if (m_config->m_massConstraintType == 0) {
410 return projectMassConstraintParticle(fitparams, p);
411 } else {
412 return projectMassConstraintDaughters(fitparams, p);
413 }
414 }
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 314 of file ParticleBase.cc.

316 {
317 const double mass = particle()->getPDGMass();
318 const double mass2 = mass * mass;
319 double px = 0;
320 double py = 0;
321 double pz = 0;
322 double E = 0;
323
324 // the parameters of the daughters must be used otherwise the mass constraint does not have an effect on the extracted daughter momenta
325 for (const auto* daughter : m_daughters) {
326 const int momindex = daughter->momIndex();
327 // in most cases the daughters will be final states so we cache the value to use it in the energy column
328 const double px_daughter = fitparams.getStateVector()(momindex);
329 const double py_daughter = fitparams.getStateVector()(momindex + 1);
330 const double pz_daughter = fitparams.getStateVector()(momindex + 2);
331
332 px += px_daughter;
333 py += py_daughter;
334 pz += pz_daughter;
335 if (daughter->hasEnergy()) {
336 E += fitparams.getStateVector()(momindex + 3);
337 } else {
338 // final states dont have an energy index
339 const double m = daughter->particle()->getPDGMass();
340 E += std::sqrt(m * m + px_daughter * px_daughter + py_daughter * py_daughter + pz_daughter * pz_daughter);
341 }
342 }
343
347 p.getResiduals()(0) = mass2 - E * E + px * px + py * py + pz * pz;
348
349 for (const auto* daughter : m_daughters) {
350 //dr/dx = d/dx m2-{E1+E2+...}^2+{p1+p2+...}^2 = 2*x (x= E or p)
351 const int momindex = daughter->momIndex();
352 p.getH()(0, momindex) = 2.0 * px;
353 p.getH()(0, momindex + 1) = 2.0 * py;
354 p.getH()(0, momindex + 2) = 2.0 * pz;
355
356 if (daughter->hasEnergy()) {
357 p.getH()(0, momindex + 3) = -2.0 * E;
358 } else {
359 const double px_daughter = fitparams.getStateVector()(momindex);
360 const double py_daughter = fitparams.getStateVector()(momindex + 1);
361 const double pz_daughter = fitparams.getStateVector()(momindex + 2);
362 const double m = daughter->particle()->getPDGMass();
363
364 const double E_daughter = std::sqrt(m * m + px_daughter * px_daughter + py_daughter * py_daughter + pz_daughter * pz_daughter);
365 const double E_by_E_daughter = E / E_daughter;
366 p.getH()(0, momindex) -= 2.0 * E_by_E_daughter * px_daughter;
367 p.getH()(0, momindex + 1) -= 2.0 * E_by_E_daughter * py_daughter;
368 p.getH()(0, momindex + 2) -= 2.0 * E_by_E_daughter * pz_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 const double mass = particle()->getPDGMass();
379 const double mass2 = mass * mass;
380 const int momindex = momIndex();
381 const double px = fitparams.getStateVector()(momindex);
382 const double py = fitparams.getStateVector()(momindex + 1);
383 const double pz = fitparams.getStateVector()(momindex + 2);
384 const double E = fitparams.getStateVector()(momindex + 3);
385
389 p.getResiduals()(0) = mass2 - E * E + px * px + py * py + pz * pz;
390
391 p.getH()(0, momindex) = 2.0 * px;
392 p.getH()(0, momindex + 1) = 2.0 * py;
393 p.getH()(0, momindex + 2) = 2.0 * pz;
394 p.getH()(0, momindex + 3) = -2.0 * E;
395
396 // TODO 0 in most cases -> needs special treatment if width=0 to not crash chi2 calculation
397 // const double width = TDatabasePDG::Instance()->GetParticle(particle()->getPDGCode())->Width();
398 // transport measurement uncertainty into residual system
399 // f' = sigma_x^2 * (df/dx)^2
400 // p.getV()(0) = width * width * 4 * mass2;
401
402 return ErrCode(ErrCode::Status::success);
403 }

◆ projectRecoConstraint()

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

project photon constraint

m : decay vertex mother p : momentum photon 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| just to be sure, essentially this is always zero because p is build from E

Implements RecoParticle.

Definition at line 166 of file RecoPhoton.cc.

167 {
168 const int momindex = momIndex();
169 const int posindex = mother()->posIndex();
186 const Eigen::Matrix<double, 1, 3> x_vertex = fitparams.getStateVector().segment(posindex, 3);
187 const Eigen::Matrix<double, 1, 3> p_vec = fitparams.getStateVector().segment(momindex, 3);
188
189 if (0 == p_vec[m_i1]) {
190 return ErrCode(ErrCode::photondimerror);
191 }
192
193 // p_vec[m_i1] must not be 0
194 const double elim = (m_clusterPars[m_i1] - x_vertex[m_i1]) / p_vec[m_i1];
195 const double mom = p_vec.norm();
196
197 // r'
198 Eigen::Matrix<double, 3, 1> residual3 = Eigen::Matrix<double, 3, 1>::Zero(3, 1);
199 residual3(0) = m_clusterPars[m_i2] - x_vertex[m_i2] - p_vec[m_i2] * elim;
200 residual3(1) = m_clusterPars[m_i3] - x_vertex[m_i3] - p_vec[m_i3] * elim;
201 residual3(2) = m_momentumScalingFactor * m_clusterPars[3] - mom; // scale measured energy by scaling factor
202
203 // dr'/dm | m:={xc,yc,zc,Ec} the measured quantities
204 Eigen::Matrix<double, 3, 4> P = Eigen::Matrix<double, 3, 4>::Zero(3, 4);
205 // deriving by the cluster pars
206 P(0, m_i2) = 1;
207 P(0, m_i1) = -p_vec[m_i2] / p_vec[m_i1];
208
209 P(1, m_i3) = 1;
210 P(1, m_i1) = -p_vec[m_i3] / p_vec[m_i1];
211 P(2, 3) = 1; // dE/dEc
212
213 p.getResiduals().segment(0, 3) = residual3;
214
215 p.getV() = P * m_covariance.selfadjointView<Eigen::Lower>() * P.transpose();
216
217 // dr'/dm | m:={x,y,z,px,py,pz,E}
218 // x := x_vertex (decay vertex of mother)
219 p.getH()(0, posindex + m_i1) = p_vec[m_i2] / p_vec[m_i1];
220 p.getH()(0, posindex + m_i2) = -1.0;
221 p.getH()(0, posindex + m_i3) = 0;
222
223 p.getH()(1, posindex + m_i1) = p_vec[m_i3] / p_vec[m_i1];
224 p.getH()(1, posindex + m_i2) = 0;
225 p.getH()(1, posindex + m_i3) = -1.0;
226
227 // elim already divided by p_vec[m_i1]
228 p.getH()(0, momindex + m_i1) = p_vec[m_i2] * elim / p_vec[m_i1];
229 p.getH()(0, momindex + m_i2) = -1. * elim;
230 p.getH()(0, momindex + m_i3) = 0;
231
232 p.getH()(1, momindex + m_i1) = p_vec[m_i3] * elim / p_vec[m_i1];
233 p.getH()(1, momindex + m_i2) = 0;
234 p.getH()(1, momindex + m_i3) = -1. * elim;
235
236 p.getH()(2, momindex + m_i1) = -1. * p_vec[m_i1] / mom;
237 p.getH()(2, momindex + m_i2) = -1. * p_vec[m_i2] / mom;
238 p.getH()(2, momindex + m_i3) = -1. * p_vec[m_i3] / mom;
239 // the photon does not store an energy in the state vector
240 // so no p.getH()(2, momindex + 3) here
241
242 return ErrCode(ErrCode::Status::success);
243 }

◆ removeDaughter()

void removeDaughter ( const ParticleBase pb)
virtualinherited

remove daughter

Definition at line 73 of file ParticleBase.cc.

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

◆ retrieveIndexMap()

void retrieveIndexMap ( indexmap anindexmap) const
virtualinherited

get index map

Definition at line 223 of file ParticleBase.cc.

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

◆ setIndex()

void setIndex ( int  i)
inlineprotectedinherited

set Index (in statevector)

Definition at line 189 of file ParticleBase.h.

189{ m_index = i ; }

◆ setMother()

void setMother ( const ParticleBase m)
inlineinherited

set mother

Definition at line 164 of file ParticleBase.h.

164{ m_mother = m ; }

◆ tauIndex()

virtual int tauIndex ( ) const
inlinevirtualinherited

get tau index

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

Definition at line 125 of file ParticleBase.h.

125{ return -1 ; }

◆ type()

virtual int type ( ) const
inlineoverridevirtual

type

Implements ParticleBase.

Definition at line 50 of file RecoPhoton.h.

50{ return kRecoPhoton ; }

◆ updateIndex()

void updateIndex ( int &  offset)
virtualinherited

this sets the index for momentum, position, etc.

in the statevector

Definition at line 84 of file ParticleBase.cc.

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

◆ useEnergy()

bool useEnergy ( const Belle2::Particle cand)
static

has energy in fit params?

Definition at line 63 of file RecoPhoton.cc.

64 {
65 bool rc = true;
66 const int pdg = particle.getPDGCode();
67 if (pdg &&
70 rc = false;
71 }
72 return rc;
73 }
The ParticleType class for identifying different particle types.
Definition: Const.h:408
static const ParticleType pi0
neutral pion particle
Definition: Const.h:674
static const ParticleType photon
photon particle
Definition: Const.h:673

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 73 of file RecoPhoton.h.

◆ m_config

const ConstraintConfiguration* m_config
protectedinherited

has all the constraint config

Definition at line 204 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 76 of file RecoPhoton.h.

◆ m_daughters

std::vector<ParticleBase*> m_daughters
protectedinherited

daughter container

Definition at line 198 of file ParticleBase.h.

◆ m_dim

const int m_dim
private

dimension of residuals and 'width' of H

Definition at line 64 of file RecoPhoton.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 79 of file RecoPhoton.h.

◆ m_i2

int m_i2
private

random other index

Definition at line 81 of file RecoPhoton.h.

◆ m_i3

int m_i3
private

another random index

Definition at line 83 of file RecoPhoton.h.

◆ m_index

int m_index
privateinherited

index

Definition at line 208 of file ParticleBase.h.

◆ m_init

bool m_init
private

was initialized*

Definition at line 67 of file RecoPhoton.h.

◆ m_isStronglyDecayingResonance

bool m_isStronglyDecayingResonance
protectedinherited

decay length less than 1 micron

Definition at line 201 of file ParticleBase.h.

◆ m_momentumScalingFactor

const float m_momentumScalingFactor
private

scale the momentum / energy by this correction factor

Definition at line 86 of file RecoPhoton.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_useEnergy

bool m_useEnergy
private

has energy ins statevector

Definition at line 70 of file RecoPhoton.h.


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