11 #include <analysis/modules/InclusiveBtagReconstruction/InclusiveBtagReconstructionModule.h>
13 #include <framework/datastore/StoreObjPtr.h>
14 #include <framework/datastore/StoreArray.h>
16 #include <analysis/dataobjects/Particle.h>
17 #include <analysis/dataobjects/ParticleList.h>
18 #include <analysis/DecayDescriptor/ParticleListName.h>
20 #include <unordered_set>
23 #include <TLorentzVector.h>
39 setDescription(
"Inclusive Btag reconstruction");
42 addParam(
"upsilonListName", m_upsilonListName,
"Name of the ParticleList to be filled with Upsilon(4S) -> B:sig anti-B:tag",
43 std::string(
"Upsilon(4S)"));
44 addParam(
"bsigListName", m_bsigListName,
"Name of the Bsig ParticleList", std::string(
""));
45 addParam(
"btagListName", m_btagListName,
"Name of the Btag ParticleList", std::string(
""));
46 addParam(
"inputListsNames", m_inputListsNames,
"List of names of the ParticleLists which are used to reconstruct Btag from");
54 bsigList.isRequired();
57 inputList.isRequired();
61 btagList.registerInDataStore();
64 antiBtagList.registerInDataStore();
67 upsilonList.registerInDataStore();
79 int pdgCode = mother->getPDGCode();
83 btagList->initialize(-pdgCode, btagList.getName());
86 antiBtagList.create();
87 antiBtagList->initialize(pdgCode, antiBtagList.getName());
88 btagList->bindAntiParticleList(*antiBtagList);
92 upsilonList->initialize(300553, upsilonList.getName());
94 const unsigned int n = bsigList->getListSize();
95 for (
unsigned i = 0; i < n; i++) {
96 const Particle* bsig = bsigList->getParticle(i);
98 std::unordered_set<int> mdstSourcesOfBsigFinalStateDaughters;
99 std::map<int, std::vector<int>> btagDaughtersMap;
101 for (
const Particle* daughter : bsigFinalStateDaughters) {
102 mdstSourcesOfBsigFinalStateDaughters.insert(daughter->getMdstSource());
104 auto mdstSourcesEnd = mdstSourcesOfBsigFinalStateDaughters.end();
109 const unsigned int m = inputList->getListSize();
110 for (
unsigned j = 0; j < m; j++) {
111 const Particle* particle = inputList->getParticle(j);
112 const std::vector<const Particle*>& particleFinalStateDaughters = particle->getFinalStateDaughters();
116 for (
const Particle* daughter : particleFinalStateDaughters) {
117 int mdstSource = daughter->getMdstSource();
118 if (mdstSourcesOfBsigFinalStateDaughters.find(mdstSource) != mdstSourcesEnd) {
123 auto it = btagDaughtersMap.find(mdstSource);
124 if (it != btagDaughtersMap.end()) {
125 it->second.push_back(particle->getArrayIndex());
127 btagDaughtersMap[mdstSource] = {particle->getArrayIndex()};
136 std::vector<std::vector<int>> btagCandidates;
137 map2vector.
convert(btagDaughtersMap, btagCandidates);
141 for (std::vector<int> daughterIndices : btagCandidates) {
142 std::map<int, size_t> nonFinalStateIndicesCount;
143 TLorentzVector momentum;
144 for (
int index : daughterIndices) {
146 if ((particles[index]->getFinalStateDaughters()).size() > 1) {
147 auto it = nonFinalStateIndicesCount.find(index);
148 if (it != nonFinalStateIndicesCount.end()) {
149 nonFinalStateIndicesCount[index]++;
152 nonFinalStateIndicesCount[index] = 1;
155 momentum += particles[index]->get4Vector();
158 bool rightDaughtersCount =
true;
159 for (
auto& it : nonFinalStateIndicesCount) {
160 if (it.second != (particles[(it.first)]->getFinalStateDaughters()).size()) {
161 rightDaughtersCount =
false;
165 if (rightDaughtersCount ==
false) {
170 std::vector<int>::iterator it;
171 std::sort(daughterIndices.begin(), daughterIndices.end());
172 it = std::unique(daughterIndices.begin(), daughterIndices.end());
173 daughterIndices.resize(std::distance(daughterIndices.begin(), it));
176 Particle* btag = particles.appendNew(btagCandidate);
177 btagList->addParticle(btag);
181 upsilonList->addParticle(particles.appendNew(upsilon));
188 makeEntries(input.begin(), input.end(), 0, output);
192 const std::map<
int, std::vector<int>>::const_iterator& end,
193 unsigned i, std::vector<std::vector<int>>& output)
195 if (positionOnTheMap == end) {
198 std::vector<int>& v = positionOnTheMap->second;