11 #include <mdst/dataobjects/MCParticle.h>
12 #include <framework/logging/Logger.h>
13 #include <framework/datastore/DataStore.h>
14 #include <framework/datastore/StoreArray.h>
15 #include <framework/utilities/HTML.h>
17 #include <TDatabasePDG.h>
25 const double MCParticle::c_epsilon = 10
e-7;
28 void MCParticle::setMassFromPDG()
30 if (TDatabasePDG::Instance()->GetParticle(m_pdg) == NULL)
throw(ParticlePDGNotKnownError() << m_pdg);
31 m_mass = TDatabasePDG::Instance()->GetParticle(m_pdg)->Mass();
35 float MCParticle::getCharge()
const
42 if (TDatabasePDG::Instance()->GetParticle(m_pdg) == NULL) {
43 B2ERROR(
"PDG=" << m_pdg <<
" ***code unknown to TDatabasePDG");
47 return TDatabasePDG::Instance()->GetParticle(m_pdg)->Charge() / 3.0;
51 vector<MCParticle*> MCParticle::getDaughters()
const
53 vector<MCParticle*> result;
54 if (m_firstDaughter > 0) {
56 if (m_lastDaughter > m_plist->GetEntriesFast())
throw LastChildIndexOutOfRangError();
57 TClonesArray& plist = *m_plist;
58 result.reserve(m_lastDaughter - m_firstDaughter + 1);
59 for (
int i = m_firstDaughter - 1; i < m_lastDaughter; i++) {
60 result.push_back(
static_cast<MCParticle*
>(plist[i]));
66 int MCParticle::getNDaughters()
const
68 if (getFirstDaughter() == 0)
70 return getLastDaughter() - getFirstDaughter() + 1;
73 void MCParticle::fixParticleList()
const
75 if (m_plist != 0)
return;
77 TClonesArray* plist(0);
82 if (MCParticles && MCParticles.
getPtr()->IndexOf(
this) >= 0) {
83 plist = MCParticles.
getPtr();
88 TClonesArray* value =
dynamic_cast<TClonesArray*
>(iter->second.ptr);
89 if (value && value->GetClass() == Class() && value->IndexOf(
this) >= 0) {
97 B2ERROR(
"Could not determine StoreArray the MCParticle belongs to !");
98 throw NoParticleListSetError();
102 for (
int i = 0; i < plist->GetEntriesFast(); i++) {
108 std::string MCParticle::getName()
const
110 const TParticlePDG* p = TDatabasePDG::Instance()->GetParticle(m_pdg);
114 return std::to_string(m_pdg);
116 std::string MCParticle::getInfoHTML()
const
118 std::stringstream out;
119 out <<
"<b>Charge</b>=" << (int)getCharge();
120 out <<
", <b>PDG</b>=" << getPDG();
121 out <<
" (" << getName() <<
")";
123 out <<
"<b>isPrimaryParticle</b>=" << isPrimaryParticle();
124 out <<
",<b>isInitial</b>=" << isInitial();
125 out <<
",<b>isVirtual</b>=" << isVirtual();
128 out <<
"<b>pT</b>=" << getMomentum().Pt();
129 out <<
", <b>pZ</b>=" << m_momentum_z;
131 std::string unitType = HTML::chooseUnitOfLength(getProductionVertex());
133 out <<
"<b>V</b>=" << HTML::getStringConvertToUnit(getProductionVertex(), precision, unitType);