10 #include <analysis/variables/ParticleDaughterVariables.h>
12 #include <analysis/VariableManager/Manager.h>
13 #include <analysis/variables/MCTruthVariables.h>
16 #include <analysis/dataobjects/Particle.h>
17 #include <mdst/dataobjects/MCParticle.h>
20 #include <framework/logging/Logger.h>
21 #include <framework/gearbox/Const.h>
35 double hasCharmedDaughter(
const Particle* particle,
const std::vector<double>& transition)
40 if (abs(transition[0]) != 1) {
41 B2ERROR(
"The parameter variable hasCharmedDaughter() only accepts 1 or -1 as an argument.");
42 return std::numeric_limits<float>::quiet_NaN();
47 B2ERROR(
"This particle does not exist!");
48 return std::numeric_limits<float>::quiet_NaN();
52 const MCParticle* mcp = particle->getMCParticle();
54 return std::numeric_limits<float>::quiet_NaN();
57 if (abs(mcp->getPDG()) != 511 and abs(mcp->getPDG()) != 521)
58 return std::numeric_limits<float>::quiet_NaN();
61 int nDaughters = int(mcp->getNDaughters());
63 B2ERROR(
"This particle does not have any daughters!");
64 return std::numeric_limits<float>::quiet_NaN();
68 int motherPDGSign = (particle->getPDGCode()) / (abs(particle->getPDGCode()));
69 std::vector<MCParticle*> mcDaughters = mcp->getDaughters();
71 for (
int iDaughter = 0; iDaughter < nDaughters; iDaughter++) {
72 int daughterPDG = mcDaughters[iDaughter]->getPDG();
73 int daughterPDGSign = daughterPDG / (abs(daughterPDG));
75 if (transition[0] == 1) {
76 if (((abs(daughterPDG) / 100) % 10 == 4 || (abs(daughterPDG) / 1000) % 10 == 4)
77 && motherPDGSign == daughterPDGSign)
79 }
else if (transition[0] == -1) {
80 if (((abs(daughterPDG) / 100) % 10 == 4 || (abs(daughterPDG) / 1000) % 10 == 4)
81 && motherPDGSign == -daughterPDGSign)
89 double hasCharmoniumDaughter(
const Particle* particle)
95 B2ERROR(
"This particle does not exist!");
96 return std::numeric_limits<float>::quiet_NaN();
100 const MCParticle* mcp = particle->getMCParticle();
102 return std::numeric_limits<float>::quiet_NaN();
105 if (abs(mcp->getPDG()) != 511 and abs(mcp->getPDG()) != 521)
106 return std::numeric_limits<float>::quiet_NaN();
109 int nDaughters = int(mcp->getNDaughters());
110 if (nDaughters < 1) {
111 B2ERROR(
"This particle does not have any daughters!");
112 return std::numeric_limits<float>::quiet_NaN();
116 std::vector<MCParticle*> mcDaughters = mcp->getDaughters();
118 for (
int iDaughter = 0; iDaughter < nDaughters; iDaughter++) {
119 int daughterPDG = mcDaughters[iDaughter]->getPDG();
120 if ((abs(daughterPDG) / 10) % 10 == 4 && (abs(daughterPDG) / 100) % 10 == 4)
127 double hasRealPhotonDaughter(
const Particle* particle)
133 B2ERROR(
"This particle does not exist!");
134 return std::numeric_limits<float>::quiet_NaN();
138 int nDaughters = int(particle->getNDaughters());
139 if (nDaughters < 1) {
140 B2ERROR(
"This particle does not have any daughters!");
141 return std::numeric_limits<float>::quiet_NaN();
145 const std::vector<Particle*> daughters = particle->getDaughters();
147 for (
int iDaughter = 0; iDaughter < nDaughters; iDaughter++) {
148 double photosFlag = particleMCPhotosParticle(daughters[iDaughter]);
149 int PDGcode = daughters[iDaughter]->getPDGCode();
152 if (PDGcode == Const::photon.getPDGCode() && photosFlag > -0.5 && photosFlag < 0.5) {
160 VARIABLE_GROUP(
"DirectDaughterInfo");
161 REGISTER_VARIABLE(
"hasCharmedDaughter(i)", hasCharmedDaughter,
162 "Returns information regarding the charm quark presence in the decay.");
163 REGISTER_VARIABLE(
"hasCharmoniumDaughter", hasCharmoniumDaughter,
164 "Returns information regarding the charmonium state presence in the decay.");
165 REGISTER_VARIABLE(
"hasRealPhotonDaughter", hasRealPhotonDaughter,
166 "Returns information regarding photon daughter origin for a particle.");
Abstract base class for different kinds of events.