9 #include <analysis/modules/NeutralHadron4MomentumCalculator/NeutralHadron4MomentumCalculatorModule.h>
11 #include <framework/logging/Logger.h>
12 #include <analysis/dataobjects/Particle.h>
13 #include <analysis/DecayDescriptor/DecayDescriptorParticle.h>
14 #include <mdst/dataobjects/KLMCluster.h>
15 #include <analysis/utility/ParticleCopy.h>
16 #include <framework/geometry/B2Vector3.h>
17 #include <Math/Vector4D.h>
29 R
"DOC(Calculates 4-momentum of a neutral hadron in a given decay chain e.g. B0 -> J/Psi K_L0, or anti-B0 -> p+ K- anti-n0.)DOC");
32 addParam(
"decayString",
m_decayString,
"Decay string for which one wants to perform the calculation", std::string(
""));
39 B2DEBUG(17,
"Neutralhadron4MomentumCalculator: Use particle list: " <<
m_decayString);
42 B2ERROR(
"NeutralHadron4MomentumCalculatorModule::initialize Invalid Decay Descriptor " <<
m_decayString);
45 if (hierarchy.size() != 1)
46 B2ERROR(
"NeutralHadron4MomentumCalculatorModule::initialize Only one particle can be selected in " <<
m_decayString);
47 if (hierarchy[0].size() != 2)
48 B2ERROR(
"NeutralHadron4MomentumCalculatorModule::initialize The selected particle must be a direct daughter " <<
m_decayString);
50 std::string neutralHadronName = hierarchy[0][1].second;
51 if (neutralHadronName !=
"n0" and neutralHadronName !=
"K_L0") {
52 if (
m_allowGamma ==
true and hierarchy[0][1].second ==
"gamma")
53 B2WARNING(
"NeutralHadron4MomentumCalculatorModule::initialize The selected particle is gamma but you allowed so; be aware.");
55 B2ERROR(
"NeutralHadron4MomentumCalculatorModule::initialize The selected particle must be a long-lived neutral hadron "
56 "i.e. (anti-)n0 or K_L0, or at least a photon (gamma), in which case you need to set allowGamma as true."
63 m_plist.isRequired(motherFullName);
68 const unsigned int n =
m_plist->getListSize();
69 std::vector<unsigned int> toRemove;
70 for (
unsigned i = 0; i < n; i++) {
72 std::vector<Particle*> daughters = particle->
getDaughters();
73 ROOT::Math::PxPyPzEVector others4Momentum;
76 others4Momentum += daughters[j]->get4Vector();
84 if (neutral->
getParticleSource() == Particle::EParticleSourceObject::c_ECLCluster) {
86 }
else if (neutral->
getParticleSource() == Particle::EParticleSourceObject::c_KLMCluster) {
89 B2ERROR(
"Your neutral particle doesn't originate from ECLCluster nor KLMCluster.");
91 double a = others4Momentum.Vect().Dot(neutralDirection);
92 double b = (std::pow(particle->
getPDGMass(), 2) - std::pow(neutral->
getMass(), 2) - others4Momentum.mag2()) / 2.;
93 double c = others4Momentum.E();
94 double d = std::pow(neutral->
getMass(), 2);
95 double D = (a * a - c * c) * d + b * b;
97 double neutralP = (-1. * a * b - c * std::sqrt(D)) / (a * a - c * c);
98 double neutralPx = neutralP * neutralDirection.
x();
99 double neutralPy = neutralP * neutralDirection.
y();
100 double neutralPz = neutralP * neutralDirection.
z();
101 double neutralE = std::sqrt(neutralP * neutralP + d);
102 const ROOT::Math::PxPyPzEVector newNeutral4Momentum(neutralPx, neutralPy, neutralPz, neutralE);
104 double motherPx = newNeutral4Momentum.Px() + others4Momentum.Px();
105 double motherPy = newNeutral4Momentum.Py() + others4Momentum.Py();
106 double motherPz = newNeutral4Momentum.Pz() + others4Momentum.Pz();
107 double motherE = newNeutral4Momentum.E() + others4Momentum.E();
108 const ROOT::Math::PxPyPzEVector newMother4Momentum(motherPx, motherPy, motherPz, motherE);
116 m_plist->removeParticles(toRemove);
DataType y() const
access variable Y (= .at(1) without boundary check)
DataType z() const
access variable Z (= .at(2) without boundary check)
DataType x() const
access variable X (= .at(0) without boundary check)
std::string getFullName() const
returns the full name of the particle full_name = name:label
bool init(const std::string &str)
Initialise the DecayDescriptor from given string.
const DecayDescriptorParticle * getMother() const
return mother.
int getNDaughters() const
return number of direct daughters.
std::vector< std::vector< std::pair< int, std::string > > > getHierarchyOfSelected()
Function to get hierarchy of selected particles and their names (for python use)
TVector3 getClusterPosition() const
Return TVector3 on cluster position (x,y,z)
TVector3 getClusterPosition() const
Get global position (TVector3 version).
void setDescription(const std::string &description)
Sets the description of the module.
void initialize() override
Initialization.
void event() override
Action to perform for each event.
std::string m_decayString
Decay string for which one wants to perform the calculation.
int m_iNeutral
Index of the neutral hadron in the decay string.
NeutralHadron4MomentumCalculatorModule()
Constructor: Sets the description, the properties and the parameters of the module.
DecayDescriptor m_decayDescriptor
Decay Descriptor to be initialized with m_decayString.
bool m_allowGamma
Whether allow the selected particle to be gamma.
StoreObjPtr< ParticleList > m_plist
ParticleList that one wants to perform the calculation.
Class to store reconstructed particles.
const KLMCluster * getKLMCluster() const
Returns the pointer to the KLMCluster object that was used to create this Particle (ParticleType == c...
const ECLCluster * getECLCluster() const
Returns the pointer to the ECLCluster object that was used to create this Particle (if ParticleType =...
std::vector< Belle2::Particle * > getDaughters() const
Returns a vector of pointers to daughter particles.
double getPDGMass(void) const
Returns uncertainty on the invariant mass (requires valid momentum error matrix)
void set4Vector(const ROOT::Math::PxPyPzEVector &p4)
Sets Lorentz vector.
EParticleSourceObject getParticleSource() const
Returns particle source as defined with enum EParticleSourceObject.
void removeDaughter(const Particle *daughter, const bool updateType=true)
Removes index of daughter from daughters index array.
void appendDaughter(const Particle *daughter, const bool updateType=true)
Appends index of daughter to daughters index array.
double getMass() const
Returns invariant mass (= nominal for FS particles)
int getArrayIndex() const
Returns this object's array index (in StoreArray), or -1 if not found.
REG_MODULE(B2BIIConvertBeamParams)
Register the module.
void addParam(const std::string &name, T ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Particle * copyParticle(const Particle *original)
Function takes argument Particle and creates a copy of it and copies of all its (grand-)^n-daughters.
Abstract base class for different kinds of events.