12 #include <analysis/variables/InclusiveVariables.h>
13 #include <analysis/VariableManager/Manager.h>
15 #include <framework/gearbox/Const.h>
16 #include <framework/logging/Logger.h>
17 #include <framework/utilities/Conversion.h>
28 double nDaughterPhotons(
const Particle* particle)
31 auto fspDaughters = particle->getFinalStateDaughters();
32 for (
auto* daughter : fspDaughters) {
33 if (abs(daughter->getPDGCode()) == Const::photon.getPDGCode()) {
40 double nDaughterNeutralHadrons(
const Particle* particle)
43 auto fspDaughters = particle->getFinalStateDaughters();
44 for (
auto* daughter : fspDaughters) {
45 if (abs(daughter->getPDGCode()) == Const::neutron.getPDGCode()
46 or abs(daughter->getPDGCode()) == Const::Klong.getPDGCode()) {
53 Manager::FunctionPtr nDaughterCharged(
const std::vector<std::string>& arguments)
57 if (arguments.size() == 1) {
59 pdgCode = Belle2::convertString<int>(arguments[0]);
60 }
catch (std::invalid_argument&) {
61 B2ERROR(
"If an argument is provided to the meta variable nDaughterCharged it has to be an integer!");
65 auto func = [pdgCode](
const Particle * particle) ->
double {
67 auto fspDaughters = particle->getFinalStateDaughters();
68 for (
auto* daughter : fspDaughters)
71 if (abs(daughter->getPDGCode()) == pdgCode) {
74 }
else if (abs(daughter->getCharge()) > 0) {
83 double nCompositeDaughters(
const Particle* particle)
86 auto fspDaughters = particle->getDaughters();
87 for (
auto* daughter : fspDaughters) {
88 if (daughter->getParticleSource() == Particle::EParticleSourceObject::c_Composite or
89 daughter->getParticleSource() == Particle::EParticleSourceObject::c_V0) {
96 Manager::FunctionPtr daughterAverageOf(
const std::vector<std::string>& arguments)
98 if (arguments.size() == 1) {
99 const Variable::Manager::Var* var = Manager::Instance().getVariable(arguments[0]);
100 auto func = [var](
const Particle * particle) ->
double {
102 if (particle->getNDaughters() == 0)
104 return std::numeric_limits<double>::quiet_NaN();
106 for (
unsigned j = 0; j < particle->getNDaughters(); ++j)
108 sum += var->function(particle->getDaughter(j));
110 return sum / particle->getNDaughters();
114 B2FATAL(
"The meta variable daughterAverageOf requires only one argument!");
122 VARIABLE_GROUP(
"For fully-inclusive particles");
124 REGISTER_VARIABLE(
"nDaughterPhotons", nDaughterPhotons,
125 "Returns the number of final state daughter photons.");
126 REGISTER_VARIABLE(
"nDaughterNeutralHadrons", nDaughterNeutralHadrons,
127 "Returns the number of K_L0 or neutrons among the final state daughters.");
128 REGISTER_VARIABLE(
"nDaughterCharged(pdg)", nDaughterCharged,
129 "Returns the number of charged daughters with the provided PDG code or the number "
130 "of all charged daughters if no argument has been provided.");
131 REGISTER_VARIABLE(
"nCompositeDaughters", nCompositeDaughters,
132 "Returns the number of final state composite daughters.");
133 REGISTER_VARIABLE(
"daughterAverageOf(variable)", daughterAverageOf,
134 "Returns the mean value of a variable over all daughters.")