10#include <analysis/variables/FEIVariables.h>
13#include <analysis/VariableManager/Manager.h>
15#include <analysis/dataobjects/Particle.h>
16#include <mdst/dataobjects/MCParticle.h>
17#include <framework/datastore/StoreArray.h>
29 int mostcommonBTagIndex(
const Particle* part)
31 std::map <int, int> tag_candidates;
32 const std::vector<const Particle*>& fsp_tag = part->getFinalStateDaughters();
33 for (
const Particle* fsp : fsp_tag) {
34 const MCParticle* mc_fsp = fsp->getMCParticle();
36 int tag_index = finddescendant(mc_fsp);
37 if (tag_candidates.find(tag_index) == tag_candidates.end()) {
38 tag_candidates[tag_index] = 1;
40 tag_candidates[tag_index]++;
47 for (
const auto& [key, value] : tag_candidates) {
55 int finddescendant(
const MCParticle* mcpart)
57 const MCParticle* i_mcpart = mcpart;
59 auto* i_mcpart_mother = i_mcpart->getMother();
60 if (i_mcpart_mother) {
61 std::vector<int> B_PDG = {511, 521};
62 auto result = std::find(std::begin(B_PDG), std::end(B_PDG), abs(i_mcpart_mother->getPDG()));
63 if (result != std::end(B_PDG)) {
64 return i_mcpart_mother->getArrayIndex();
66 i_mcpart = i_mcpart_mother;
73 std::vector<int> truthFSPTag(
int BTag_index)
75 StoreArray<MCParticle> MC_Particle_list;
76 std::vector<int> fsp_truth_index;
77 for (
const MCParticle& iMCParticle : MC_Particle_list) {
81 fsp_truth_index.push_back(iMCParticle.getArrayIndex());
84 return fsp_truth_index;
86 double percentageMissingParticlesBTag(
const Particle* part)
88 int index = mostcommonBTagIndex(part);
92 std::vector<int> fsp_FEI_index;
93 const std::vector<const Particle*>& fsp_tag = part->getFinalStateDaughters();
94 for (
const Particle* fsp : fsp_tag) {
95 const MCParticle* mc_fsp = fsp->getMCParticle();
97 int tag_index = finddescendant(mc_fsp);
98 if (tag_index == index) {
99 fsp_FEI_index.push_back(mc_fsp->getArrayIndex());
103 std::vector<int> diff;
104 std::vector<int> fsp_truth_index = truthFSPTag(index);
105 std::sort(fsp_truth_index.begin(), fsp_truth_index.end());
106 std::sort(fsp_FEI_index.begin(), fsp_FEI_index.end());
107 std::set_difference(fsp_truth_index.begin(), fsp_truth_index.end(), fsp_FEI_index.begin(), fsp_FEI_index.end(), std::inserter(diff,
109 return double(diff.size()) / double(fsp_truth_index.size());
112 double percentageWrongParticlesBTag(
const Particle* part)
114 int index = mostcommonBTagIndex(part);
118 const std::vector<const Particle*>& fsp_tag = part->getFinalStateDaughters();
120 for (
const Particle* fsp : fsp_tag) {
121 const MCParticle* mc_fsp = fsp->getMCParticle();
123 int tag_index = finddescendant(mc_fsp);
124 if (tag_index != index) {
129 return double(wrong_FEI) / double(truthFSPTag(index).size());
132 VARIABLE_GROUP(
"FEIVariables");
133 REGISTER_VARIABLE(
"mostcommonBTagIndex", mostcommonBTagIndex,
134 "By giving e.g. a FEI B meson candidate the B meson index on generator level is determined, where most reconstructed particles can be assigned to. If no B meson found on generator level -1 is returned.");
135 REGISTER_VARIABLE(
"percentageMissingParticlesBTag", percentageMissingParticlesBTag,
136 "Get the percentage of missing particles by using the mostcommonBTagIndex. So the number of particles not reconstructed by e.g. the FEI are determined and divided by the number of generated particles using the given index of the B meson. If no B meson found on generator level -1 is returned.");
137 REGISTER_VARIABLE(
"percentageWrongParticlesBTag", percentageWrongParticlesBTag,
138 "Get the percentage of wrong particles by using the mostcommonBTagIndex. In this context wrong means that the reconstructed particles originated from the other B meson. The absolute number is divided by the total number of generated FSP from the given B meson index. If no B meson found on generator level -1 is returned.");
@ c_IsFSRPhoton
bit 7: Particle is from final state radiation
@ c_IsPHOTOSPhoton
bit 8: Particle is an radiative photon from PHOTOS
@ c_StableInGenerator
bit 1: Particle is stable, i.e., not decaying in the generator.
@ c_IsISRPhoton
bit 6: Particle is from initial state radiation
Abstract base class for different kinds of events.