Belle II Software  release-08-01-10
LowEnergyPi0VetoExpertModule.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 
9 /* Own header. */
10 #include <analysis/modules/LowEnergyPi0VetoExpert/LowEnergyPi0VetoExpertModule.h>
11 
12 /* Analysis headers. */
13 #include <analysis/variables/ECLVariables.h>
14 #include <analysis/variables/HelicityVariables.h>
15 
16 /* Basf2 headers. */
17 #include <mva/interface/Interface.h>
18 
19 /* Boost headers. */
20 #include <boost/algorithm/string/predicate.hpp>
21 
22 /* ROOT headers. */
23 #include <Math/Vector3D.h>
24 #include <Math/Vector4D.h>
25 #include <Math/VectorUtil.h>
26 
27 using namespace Belle2;
28 
29 REG_MODULE(LowEnergyPi0VetoExpert);
30 
32 {
33  setDescription("Low-energy pi0 veto.");
34  addParam(
35  "VetoPi0Daughters", m_VetoPi0Daughters,
36  "Veto for pi0 daughters (maximum over all pairs excluding this pi0).",
37  false);
38  addParam("GammaListName", m_GammaListName, "Gamma particle list name.",
39  std::string("gamma"));
40  addParam("Pi0ListName", m_Pi0ListName, "Pi0 particle list name.",
41  std::string("pi0"));
42  addParam("Belle1", m_Belle1, "Belle 1 data analysis.", false);
43  addParam("identifier", m_identifier,
44  "Database identifier or file used to load the weights.",
45  m_identifier);
47 }
48 
50 {
51 }
52 
54 {
55  m_ListGamma.isRequired(m_GammaListName);
57  m_ListPi0.isRequired(m_Pi0ListName);
58  if (not(boost::ends_with(m_identifier, ".root") or boost::ends_with(m_identifier, ".xml"))) {
59  m_weightfile_representation = std::unique_ptr<DBObjPtr<DatabaseRepresentationOfWeightfile>>(new
61  }
63 }
64 
66 {
67  m_expert.reset();
68  m_dataset.reset();
69 }
70 
72 {
74  if (m_weightfile_representation->hasChanged()) {
75  std::stringstream ss((*m_weightfile_representation)->m_data);
76  auto weightfile = MVA::Weightfile::loadFromStream(ss);
77  init_mva(weightfile);
78  }
79  } else {
81  init_mva(weightfile);
82  }
83 }
84 
86 {
87 }
88 
90 {
91  auto supported_interfaces = MVA::AbstractInterface::getSupportedInterfaces();
92  MVA::GeneralOptions general_options;
93  weightfile.getOptions(general_options);
94  weightfile.addSignalFraction(0.5);
95  m_expert = supported_interfaces[general_options.m_method]->getExpert();
96  m_expert->load(weightfile);
97  std::vector<float> dummy;
98  /* The number of input variables depends on the experiment. */
99  int nInputVariables;
100  if (m_Belle1)
101  nInputVariables = 7;
102  else
103  nInputVariables = 11;
104  dummy.resize(nInputVariables, 0);
105  m_dataset = std::unique_ptr<MVA::SingleDataset>(new MVA::SingleDataset(general_options, std::move(dummy), 0));
106 }
107 
109  const Particle* pi0Gamma)
110 {
111  float maxVeto = 0;
112  int n = m_ListGamma->getListSize();
113  for (int i = 0; i < n; ++i) {
114  Particle* gamma2 = m_ListGamma->getParticle(i);
115  if (gamma1 == gamma2)
116  continue;
117  if (pi0Gamma != nullptr) {
118  if (pi0Gamma == gamma2)
119  continue;
120  }
121  double pi0Mass = (gamma1->get4Vector() + gamma2->get4Vector()).M();
122  if (pi0Mass < 0.07 || pi0Mass > 0.20)
123  continue;
124  const Particle* gammaLowEnergy, *gammaHighEnergy;
125  if (gamma1->getEnergy() > gamma2->getEnergy()) {
126  gammaLowEnergy = gamma2;
127  gammaHighEnergy = gamma1;
128  } else {
129  gammaLowEnergy = gamma1;
130  gammaHighEnergy = gamma2;
131  }
132  double gammaLowEnergyEnergy, gammaHighEnergyEnergy;
133  double gammaLowEnergyE9E21, gammaHighEnergyE9E21;
134  double gammaLowEnergyClusterTheta, gammaHighEnergyClusterTheta;
135  double gammaLowEnergyZernikeMVA, gammaHighEnergyZernikeMVA;
136  double gammaLowEnergyIsolation, gammaHighEnergyIsolation;
137  double cosHelicityAngleMomentum;
138  gammaLowEnergyEnergy = gammaLowEnergy->getEnergy();
139  gammaHighEnergyEnergy = gammaHighEnergy->getEnergy();
140  ROOT::Math::PxPyPzEVector gammaHighEnergyMomentum(
141  gammaHighEnergy->getPx(), gammaHighEnergy->getPy(),
142  gammaHighEnergy->getPz(), gammaHighEnergyEnergy);
143  ROOT::Math::PxPyPzEVector gammaLowEnergyMomentum(
144  gammaLowEnergy->getPx(), gammaLowEnergy->getPy(),
145  gammaLowEnergy->getPz(), gammaLowEnergyEnergy);
146  ROOT::Math::PxPyPzEVector momentum = gammaHighEnergyMomentum +
147  gammaLowEnergyMomentum;
148  ROOT::Math::XYZVector boost = momentum.BoostToCM();
149  gammaHighEnergyMomentum =
150  ROOT::Math::VectorUtil::boost(gammaHighEnergyMomentum, boost);
151  cosHelicityAngleMomentum =
152  fabs(ROOT::Math::VectorUtil::CosTheta(momentum.Vect(),
153  gammaHighEnergyMomentum.Vect()));
154  gammaLowEnergyE9E21 = Variable::eclClusterE9E21(gammaLowEnergy);
155  gammaHighEnergyE9E21 = Variable::eclClusterE9E21(gammaHighEnergy);
156  gammaLowEnergyClusterTheta = Variable::eclClusterTheta(gammaLowEnergy);
157  gammaHighEnergyClusterTheta = Variable::eclClusterTheta(gammaHighEnergy);
158  if (!m_Belle1) {
159  gammaLowEnergyZernikeMVA =
160  Variable::eclClusterZernikeMVA(gammaLowEnergy);
161  gammaHighEnergyZernikeMVA =
162  Variable::eclClusterZernikeMVA(gammaHighEnergy);
163  gammaLowEnergyIsolation = Variable::eclClusterIsolation(gammaLowEnergy);
164  gammaHighEnergyIsolation =
165  Variable::eclClusterIsolation(gammaHighEnergy);
166  }
167  m_dataset->m_input[0] = gammaLowEnergyEnergy;
168  m_dataset->m_input[1] = pi0Mass;
169  m_dataset->m_input[2] = cosHelicityAngleMomentum;
170  m_dataset->m_input[3] = gammaLowEnergyE9E21;
171  m_dataset->m_input[4] = gammaHighEnergyE9E21;
172  m_dataset->m_input[5] = gammaLowEnergyClusterTheta;
173  m_dataset->m_input[6] = gammaHighEnergyClusterTheta;
174  if (!m_Belle1) {
175  m_dataset->m_input[7] = gammaLowEnergyZernikeMVA;
176  m_dataset->m_input[8] = gammaHighEnergyZernikeMVA;
177  m_dataset->m_input[9] = gammaLowEnergyIsolation;
178  m_dataset->m_input[10] = gammaHighEnergyIsolation;
179  }
180  float veto = m_expert->apply(*m_dataset)[0];
181  if (veto > maxVeto)
182  maxVeto = veto;
183  }
184  return maxVeto;
185 }
186 
188 {
189  if (m_VetoPi0Daughters) {
190  int n = m_ListPi0->getListSize();
191  for (int i = 0; i < n; ++i) {
192  Particle* pi0 = m_ListPi0->getParticle(i);
193  const Particle* gamma1 = pi0->getDaughter(0);
194  const Particle* gamma2 = pi0->getDaughter(1);
195  const Particle* gammaLowEnergy, *gammaHighEnergy;
196  if (gamma1->getEnergy() > gamma2->getEnergy()) {
197  gammaLowEnergy = gamma2;
198  gammaHighEnergy = gamma1;
199  } else {
200  gammaLowEnergy = gamma1;
201  gammaHighEnergy = gamma2;
202  }
203  float maxVeto = getMaximumVeto(gammaLowEnergy, gammaHighEnergy);
204  pi0->addExtraInfo("lowEnergyPi0VetoGammaLowEnergy", maxVeto);
205  maxVeto = getMaximumVeto(gammaHighEnergy, gammaLowEnergy);
206  pi0->addExtraInfo("lowEnergyPi0VetoGammaHighEnergy", maxVeto);
207  }
208  } else {
209  int n = m_ListGamma->getListSize();
210  for (int i = 0; i < n; ++i) {
211  Particle* gamma = m_ListGamma->getParticle(i);
212  float maxVeto = getMaximumVeto(gamma, nullptr);
213  gamma->addExtraInfo("lowEnergyPi0Veto", maxVeto);
214  }
215  }
216 }
Class for accessing objects in the database.
Definition: DBObjPtr.h:21
std::unique_ptr< MVA::SingleDataset > m_dataset
Pointer to the current dataset.
StoreObjPtr< ParticleList > m_ListGamma
Gamma candidates.
void event() override
This method is called for each event.
void endRun() override
This method is called if the current run ends.
void terminate() override
This method is called at the end of the event processing.
std::unique_ptr< MVA::Expert > m_expert
Pointer to the current MVA expert.
std::unique_ptr< DBObjPtr< DatabaseRepresentationOfWeightfile > > m_weightfile_representation
Database pointer to the database representation of the weightfile.
void beginRun() override
Called when entering a new run.
bool m_VetoPi0Daughters
Calculate veto for pi0 daughter photons (maximum over all pairs excluding this pi0).
StoreObjPtr< ParticleList > m_ListPi0
Pi0 candidates.
void init_mva(MVA::Weightfile &weightfile)
Initialize mva expert, dataset and features Called everytime the weightfile in the database changes i...
std::string m_GammaListName
Gamma particle list name.
std::string m_Pi0ListName
Pi0 particle list name.
float getMaximumVeto(const Particle *gamma1, const Particle *pi0Gamma)
Get maximum veto value over all gamma pairs including the photon gamma1.
std::string m_identifier
Database identifier or file used to load the weights.
static std::map< std::string, AbstractInterface * > getSupportedInterfaces()
Returns interfaces supported by the MVA Interface.
Definition: Interface.h:53
static void initSupportedInterfaces()
Static function which initliazes all supported interfaces, has to be called once before getSupportedI...
Definition: Interface.cc:45
General options which are shared by all MVA trainings.
Definition: Options.h:62
Wraps the data of a single event into a Dataset.
Definition: Dataset.h:135
The Weightfile class serializes all information about a training into an xml tree.
Definition: Weightfile.h:38
static Weightfile loadFromStream(std::istream &stream)
Static function which deserializes a Weightfile from a stream.
Definition: Weightfile.cc:251
void getOptions(Options &options) const
Fills an Option object from the xml tree.
Definition: Weightfile.cc:67
static Weightfile loadFromFile(const std::string &filename)
Static function which loads a Weightfile from a file.
Definition: Weightfile.cc:206
void addSignalFraction(float signal_fraction)
Saves the signal fraction in the xml tree.
Definition: Weightfile.cc:95
Base class for Modules.
Definition: Module.h:72
void setDescription(const std::string &description)
Sets the description of the module.
Definition: Module.cc:214
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
Definition: Module.cc:208
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Definition: Module.h:80
Class to store reconstructed particles.
Definition: Particle.h:75
double getPx() const
Returns x component of momentum.
Definition: Particle.h:553
double getPz() const
Returns z component of momentum.
Definition: Particle.h:571
double getEnergy() const
Returns total energy.
Definition: Particle.h:507
double getPy() const
Returns y component of momentum.
Definition: Particle.h:562
ROOT::Math::PxPyPzEVector get4Vector() const
Returns Lorentz vector.
Definition: Particle.h:517
void addExtraInfo(const std::string &name, double value)
Sets the user-defined data of given name to the given value.
Definition: Particle.cc:1337
const Particle * getDaughter(unsigned i) const
Returns a pointer to the i-th daughter particle.
Definition: Particle.cc:635
REG_MODULE(arichBtest)
Register the Module.
void addParam(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Definition: Module.h:560
Abstract base class for different kinds of events.