Belle II Software  release-05-02-19
ClusterInfoExtractor.h
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2017 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Jonas Wagner *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 
11 #pragma once
12 #include <tracking/spacePointCreation/SpacePoint.h>
13 #include <svd/dataobjects/SVDCluster.h>
14 #include <tracking/trackFindingVXD/utilities/Named.h>
15 #include <tracking/trackFindingVXD/variableExtractors/VariableExtractor.h>
16 #include <numeric>
17 
18 
19 namespace Belle2 {
24  class ClusterInfoExtractor : public VariableExtractor {
26  public:
31  ClusterInfoExtractor(std::vector<Named<float*>>& variableSet, bool useTimingInfo) :
32  VariableExtractor(), m_UseTimingInfo(useTimingInfo)
33  {
34  initializeStats("charge", variableSet);
35  initializeStats("seedCharge", variableSet);
36  initializeStats("size", variableSet);
37  initializeStats("energyLoss", variableSet);
38  if (m_UseTimingInfo) {
39  initializeStats("time", variableSet);
40  initializeStats("timeSigma", variableSet);
41  }
42 
43  }
44 
46  void extractVariables(std::vector<SpacePoint const*> const& spacePoints)
47  {
48  std::vector<SVDCluster const*> clusters;
49  clusters.reserve(spacePoints.size() * 2);
50 
51  for (SpacePoint const* sp : spacePoints) {
52  RelationVector<SVDCluster> relatedClusters = sp->getRelationsTo<SVDCluster>("");
53  for (const SVDCluster& cluster : relatedClusters) {
54  clusters.push_back(&cluster);
55  }
56  }
57 
58  std::vector<float> values(clusters.size());
59  for (unsigned int i = 0; i < clusters.size(); ++i) {
60  values[i] = clusters[i]->getCharge();
61  }
62  setStats("charge", values);
63 
64  for (unsigned int i = 0; i < clusters.size(); ++i) {
65  values[i] = clusters[i]->getSeedCharge();
66  }
67  setStats("seedCharge", values);
68 
69 
70  for (unsigned int i = 0; i < clusters.size(); ++i) {
71  values[i] = clusters[i]->getSize();
72  }
73  setStats("size", values);
74 
75 
76  for (unsigned int i = 0; i < clusters.size(); ++i) {
77  values[i] = clusters[i]->getCharge() / clusters[i]->getSize();
78  }
79  setStats("energyLoss", values);
80 
81  if (m_UseTimingInfo) {
82  for (unsigned int i = 0; i < clusters.size(); ++i) {
83  values[i] = clusters[i]->getClsTime();
84  }
85  setStats("time", values);
86 
87  for (unsigned int i = 0; i < clusters.size(); ++i) {
88  values[i] = clusters[i]->getClsTimeSigma();
89  }
90  setStats("timeSigma", values);
91  }
92 
93  }
94 
95  protected:
97  bool m_UseTimingInfo;
98 
100  void initializeStats(const std::string& identifier, std::vector<Named<float*>>& variables)
101  {
102  addVariable(identifier + "_max", variables);
103  addVariable(identifier + "_min", variables);
104  addVariable(identifier + "_mean", variables);
105  addVariable(identifier + "_std", variables);
106  addVariable(identifier + "_sum", variables);
107  }
108 
110  void setStats(const std::string& identifier, std::vector<float>& values)
111  {
112  short size = values.size();
113  if (values.size() == 0) {
114  m_variables.at(identifier + "_max") = NAN;
115  m_variables.at(identifier + "_min") = NAN;
116  m_variables.at(identifier + "_mean") = NAN;
117  m_variables.at(identifier + "_std") = NAN;
118  m_variables.at(identifier + "_sum") = NAN;
119  return;
120  }
121  // mean
122  float sum = std::accumulate(values.begin(), values.end(), 0.0);
123  m_variables.at(identifier + "_sum") = sum;
124  float mean = sum / size;
125  m_variables.at(identifier + "_mean") = mean;
126  // variance and standard deviation
127  float variance = std::accumulate(values.begin(), values.end(), 0.0,
128  [mean, size](float x, float y) {return x + ((y - mean) * (y - mean)) / (size - 1);});
129  float stddev = std::sqrt(variance);
130  m_variables.at(identifier + "_std") = stddev;
131  //min and max
132  float min = *(std::min_element(values.begin(), values.end()));
133  float max = *(std::max_element(values.begin(), values.end()));
134  m_variables.at(identifier + "_min") = min;
135  m_variables.at(identifier + "_max") = max;
136  }
137 
138  };
140 }
Belle2::ClusterInfoExtractor::initializeStats
void initializeStats(const std::string &identifier, std::vector< Named< float * >> &variables)
initialize statistics subsets of variables from clusters that get combined for SPTC
Definition: ClusterInfoExtractor.h:108
Belle2::ClusterInfoExtractor::extractVariables
void extractVariables(std::vector< SpacePoint const * > const &spacePoints)
extract variables from SpacePoints
Definition: ClusterInfoExtractor.h:54
Belle2::ClusterInfoExtractor::setStats
void setStats(const std::string &identifier, std::vector< float > &values)
calculated statistics and saves them in variable set
Definition: ClusterInfoExtractor.h:118
Belle2::ClusterInfoExtractor::m_UseTimingInfo
bool m_UseTimingInfo
whether to use timing info from cluster
Definition: ClusterInfoExtractor.h:105
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::VariableExtractor::m_variables
std::unordered_map< std::string, float > m_variables
unordered_map to associate float value with a string name
Definition: VariableExtractor.h:45
Belle2::VariableExtractor::addVariable
void addVariable(const std::string &identifier, std::vector< Named< float * >> &variables)
add a variable to the variable set
Definition: VariableExtractor.h:37
Belle2::ClusterInfoExtractor::ClusterInfoExtractor
ClusterInfoExtractor(std::vector< Named< float * >> &variableSet, bool useTimingInfo)
Constructor fills variableSet with variables to be extracted.
Definition: ClusterInfoExtractor.h:39