Belle II Software  release-06-02-00
TagUniqueSignalModule.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 #include <analysis/modules/TagUniqueSignal/TagUniqueSignalModule.h>
9 
10 #include <analysis/dataobjects/Particle.h>
11 #include <mdst/dataobjects/MCParticle.h>
12 #include <analysis/dataobjects/ParticleList.h>
13 
14 #include <framework/datastore/StoreObjPtr.h>
15 #include <framework/logging/Logger.h>
16 
17 #include <set>
18 
19 using namespace std;
20 using namespace Belle2;
21 
22 
23 //-----------------------------------------------------------------
24 // Register module
25 //-----------------------------------------------------------------
26 
27 REG_MODULE(TagUniqueSignal)
28 
30 {
31  setDescription("Mark true (target=1) candidates from input list via extra-info field. Only the first true candidate associated with an MCParticle is marked.");
32  setPropertyFlags(c_ParallelProcessingCertified);
33 
34  // Add parameters
35  addParam("particleList", m_particleList, "Input ParticleList name");
36  addParam("target", m_targetVariable, "Variable which defines signal and background.", std::string("isSignal"));
37  addParam("extraInfoName", m_extraInfoName,
38  "Extra-info field added to all particles in the input list. 1 for unique signal, 0 for background or duplicates.",
39  string("uniqueSignal"));
40 }
41 
42 void TagUniqueSignalModule::initialize()
43 {
44  StoreObjPtr<ParticleList>().isRequired(m_particleList);
45 
46  Variable::Manager& manager = Variable::Manager::Instance();
47 
48  m_targetVar = manager.getVariable(m_targetVariable);
49  if (m_targetVar == nullptr) {
50  B2ERROR("TagUniqueSignal: Variable::Manager doesn't have variable" << m_targetVariable);
51  }
52 }
53 
54 void TagUniqueSignalModule::event()
55 {
56  const StoreObjPtr<ParticleList> inPList(m_particleList);
57  if (!inPList)
58  return;
59 
60 
61  const int size = inPList->getListSize();
62  std::set<const MCParticle*> foundMCParticles;
63  for (int i = 0; i < size; i++) {
64  Particle* part = inPList->getParticle(i);
65  const MCParticle* mcp = part->getRelated<MCParticle>();
66  float extraInfoValue = 0.0;
67  if (mcp and m_targetVar->function(part)) {
68  const bool was_inserted = foundMCParticles.insert(mcp).second;
69  if (was_inserted)
70  extraInfoValue = 1.0;
71  }
72  if (part->hasExtraInfo(m_extraInfoName)) {
73  B2WARNING("Extra Info with given name is already set! This module can only be used once per particle.");
74  } else {
75  part->addExtraInfo(m_extraInfoName, extraInfoValue);
76  }
77  }
78 }
A Class to store the Monte Carlo particle information.
Definition: MCParticle.h:32
Base class for Modules.
Definition: Module.h:72
Class to store reconstructed particles.
Definition: Particle.h:74
bool isRequired(const std::string &name="")
Ensure this array/object has been registered previously.
Type-safe access to single objects in the data store.
Definition: StoreObjPtr.h:95
Loops through the particle list finds a unique signal candidate for each event.
Global list of available variables.
Definition: Manager.h:98
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:650
Abstract base class for different kinds of events.