9#include <mdst/dataobjects/MCParticle.h>
10#include <framework/logging/Logger.h>
11#include <framework/datastore/DataStore.h>
12#include <framework/datastore/StoreArray.h>
13#include <framework/utilities/HTML.h>
14#include <framework/utilities/Conversion.h>
16#include <TDatabasePDG.h>
20#include <boost/algorithm/string.hpp>
30 if (TDatabasePDG::Instance()->GetParticle(
m_pdg) ==
nullptr)
31 throw(ParticlePDGNotKnownError() <<
m_pdg);
32 m_mass = TDatabasePDG::Instance()->GetParticle(
m_pdg)->Mass();
43 if (TDatabasePDG::Instance()->GetParticle(
m_pdg) ==
nullptr) {
44 B2ERROR(
"PDG=" <<
m_pdg <<
" ***code unknown to TDatabasePDG");
48 return TDatabasePDG::Instance()->GetParticle(
m_pdg)->Charge() / 3.0;
54 vector<MCParticle*> result;
61 result.push_back(
static_cast<MCParticle*
>(plist[i]));
86 TClonesArray* plist(0);
91 if (MCParticles && MCParticles.
getPtr()->IndexOf(
this) >= 0) {
92 plist = MCParticles.
getPtr();
97 TClonesArray* value =
dynamic_cast<TClonesArray*
>(iter->second.ptr);
98 if (value && value->GetClass() == Class() && value->IndexOf(
this) >= 0) {
106 B2ERROR(
"Could not determine StoreArray the MCParticle belongs to !");
107 throw NoParticleListSetError();
111 for (
int i = 0; i < plist->GetEntriesFast(); i++) {
119 const TParticlePDG* p = TDatabasePDG::Instance()->GetParticle(
m_pdg);
123 return std::to_string(
m_pdg);
127 std::stringstream out;
128 out <<
"<b>Charge</b>=" << (int)
getCharge();
129 out <<
", <b>PDG</b>=" <<
getPDG();
130 out <<
" (" <<
getName() <<
")";
133 out <<
",<b>isInitial</b>=" <<
isInitial();
134 out <<
",<b>isVirtual</b>=" <<
isVirtual();
155 std::vector<std::string> generalizedIndexes;
156 boost::split(generalizedIndexes, generalizedIndex, boost::is_any_of(
":"));
158 if (generalizedIndexes.empty()) {
159 B2WARNING(
"Generalized index of MC daughter particle is empty. Skipping.");
170 for (
auto& indexString : generalizedIndexes) {
174 dauIndex = Belle2::convertString<int>(indexString);
175 }
catch (std::invalid_argument&) {
176 B2WARNING(
"Found the string " << indexString <<
"instead of a daughter index.");
181 if (dauIndex >=
int(currentPart->
getNDaughters()) or dauIndex < 0) {
182 B2WARNING(
"Daughter index out of range" <<
LogVar(
"daughter index", dauIndex));
183 B2WARNING(
"Trying to access non-existing particle.");
187 currentPart = dauPart;
StoreEntryMap::const_iterator StoreEntryConstIter
const_iterator for a StoreEntry map.
StoreEntryMap & getStoreEntryMap(EDurability durability)
Get a reference to the object/array map.
@ c_Event
Different object in each event, all objects/arrays are invalidated after event() function has been ca...
static DataStore & Instance()
Instance of singleton Store.
std::map< std::string, StoreEntry > StoreEntryMap
Map for StoreEntries.
A Class to store the Monte Carlo particle information.
int m_lastDaughter
1-based index of last daughter particle in collection, 0 if no daughters
int m_firstDaughter
1-based index of first daughter particle in collection, 0 if no daughters
float m_mass
mass of the particle
virtual std::string getName() const override
Return name of this particle.
const MCParticle * getParticleFromGeneralizedIndexString(const std::string &generalizedIndex) const
Explores the decay tree of the MC particle and returns the (grand^n)daughter identified by a generali...
std::vector< Belle2::MCParticle * > getDaughters() const
Get vector of all daughter particles, empty vector if none.
static const double c_epsilon
limit of precision for two doubles to be the same.
int getArrayIndex() const
Get 0-based index of the particle in the corresponding MCParticle list.
ROOT::Math::XYZVector getProductionVertex() const
Return production vertex position.
virtual std::string getInfoHTML() const override
Return a short summary of this object's contents in HTML format.
int m_pdg
PDG-Code of the particle.
const MCParticle * getDaughter(int i) const
Return i-th daughter.
int getNDaughters() const
Return number of daughter MCParticles.
int getLastDaughter() const
Get 1-based index of last daughter, 0 if no daughters.
float getCharge() const
Return the particle charge defined in TDatabasePDG.
float m_momentum_z
momentum of particle, z component
void fixParticleList() const
Search the DataStore for the corresponding MCParticle array.
int getPDG() const
Return PDG code of particle.
ROOT::Math::XYZVector getMomentum() const
Return momentum.
TClonesArray * m_plist
Internal pointer to DataStore Array containing particles belonging to this collection.
int getFirstDaughter() const
Get 1-based index of first daughter, 0 if no daughters.
void setMassFromPDG()
Sets the mass for the particle from the particle's PDG code.
std::string getArrayName() const
Get name of array this object is stored in, or "" if not found.
Accessor to arrays stored in the data store.
TClonesArray * getPtr() const
Raw access to the underlying TClonesArray.
Class to store variables with their name which were sent to the logging service.
bool isInitial() const
Check if particle is an initial particle such as ISR.
MCParticle * getMother() const
Returns a pointer to the mother particle.
bool isPrimaryParticle() const
Check if particle is a primary particle which was created by the generator (and not,...
bool isVirtual() const
Check if particle is virtual.
std::string getStringConvertToUnit(const ROOT::Math::XYZVector &vec, int precision=2, const std::string &unitType="cm")
get a string with vector coordinates: (x, y, z).
std::string chooseUnitOfLength(const ROOT::Math::XYZVector &vec)
get a string with a unit type to convert a vector, so that it is easily readable.
Abstract base class for different kinds of events.