10 #include <analysis/variables/InclusiveVariables.h>
11 #include <analysis/VariableManager/Manager.h>
13 #include <framework/gearbox/Const.h>
14 #include <framework/logging/Logger.h>
15 #include <framework/utilities/Conversion.h>
26 double nDaughterPhotons(
const Particle* particle)
29 auto fspDaughters = particle->getFinalStateDaughters();
30 for (
auto* daughter : fspDaughters) {
31 if (abs(daughter->getPDGCode()) == Const::photon.getPDGCode()) {
38 double nDaughterNeutralHadrons(
const Particle* particle)
41 auto fspDaughters = particle->getFinalStateDaughters();
42 for (
auto* daughter : fspDaughters) {
43 if (abs(daughter->getPDGCode()) == Const::neutron.getPDGCode()
44 or abs(daughter->getPDGCode()) == Const::Klong.getPDGCode()) {
51 Manager::FunctionPtr nDaughterCharged(
const std::vector<std::string>& arguments)
55 if (arguments.size() == 1) {
57 pdgCode = Belle2::convertString<int>(arguments[0]);
58 }
catch (std::invalid_argument&) {
59 B2ERROR(
"If an argument is provided to the meta variable nDaughterCharged it has to be an integer!");
63 auto func = [pdgCode](
const Particle * particle) ->
double {
65 auto fspDaughters = particle->getFinalStateDaughters();
66 for (
auto* daughter : fspDaughters)
69 if (abs(daughter->getPDGCode()) == pdgCode) {
72 }
else if (abs(daughter->getCharge()) > 0) {
81 double nCompositeDaughters(
const Particle* particle)
84 auto fspDaughters = particle->getDaughters();
85 for (
auto* daughter : fspDaughters) {
86 if (daughter->getParticleSource() == Particle::EParticleSourceObject::c_Composite or
87 daughter->getParticleSource() == Particle::EParticleSourceObject::c_V0) {
94 Manager::FunctionPtr daughterAverageOf(
const std::vector<std::string>& arguments)
96 if (arguments.size() == 1) {
97 const Variable::Manager::Var* var = Manager::Instance().getVariable(arguments[0]);
98 auto func = [var](
const Particle * particle) ->
double {
100 if (particle->getNDaughters() == 0)
102 return std::numeric_limits<double>::quiet_NaN();
104 for (
unsigned j = 0; j < particle->getNDaughters(); ++j)
106 sum += var->function(particle->getDaughter(j));
108 return sum / particle->getNDaughters();
112 B2FATAL(
"The meta variable daughterAverageOf requires only one argument!");
120 VARIABLE_GROUP(
"For fully-inclusive particles");
122 REGISTER_VARIABLE(
"nDaughterPhotons", nDaughterPhotons,
123 "Returns the number of final state daughter photons.");
124 REGISTER_VARIABLE(
"nDaughterNeutralHadrons", nDaughterNeutralHadrons,
125 "Returns the number of K_L0 or neutrons among the final state daughters.");
126 REGISTER_VARIABLE(
"nDaughterCharged(pdg)", nDaughterCharged,
127 "Returns the number of charged daughters with the provided PDG code or the number "
128 "of all charged daughters if no argument has been provided.");
129 REGISTER_VARIABLE(
"nCompositeDaughters", nCompositeDaughters,
130 "Returns the number of final state composite daughters.");
131 REGISTER_VARIABLE(
"daughterAverageOf(variable)", daughterAverageOf,
132 "Returns the mean value of a variable over all daughters.")
Abstract base class for different kinds of events.