Belle II Software  release-05-01-25
test_Binning.cc
1 /* BASF2 (Belle Analysis Framework 2) *
2  * Copyright(C) 2016 - Belle II Collaboration *
3  * *
4  * Author: The Belle II Collaboration *
5  * Contributors: Thomas Keck *
6  * *
7  * This software is provided "as is" without any warranty. *
8  **************************************************************************/
9 
10 #include <mva/utility/Binning.h>
11 #include <framework/utilities/FileSystem.h>
12 #include <framework/utilities/TestHelpers.h>
13 
14 #include <gtest/gtest.h>
15 
16 using namespace Belle2;
17 
18 namespace {
19 
20  TEST(BinningTest, Binning)
21  {
22  MVA::Binning binning(3);
23 
24  EXPECT_EQ(binning.m_signal_pdf.size(), 3);
25  EXPECT_EQ(binning.m_signal_cdf.size(), 3);
26  EXPECT_EQ(binning.m_bckgrd_pdf.size(), 3);
27  EXPECT_EQ(binning.m_bckgrd_cdf.size(), 3);
28  EXPECT_EQ(binning.m_boundaries.size(), 4);
29 
30  EXPECT_FLOAT_EQ(binning.m_signal_yield, 0.0);
31  EXPECT_FLOAT_EQ(binning.m_bckgrd_yield, 0.0);
32 
33  binning.m_signal_pdf[0] = 1.0;
34  binning.m_signal_pdf[1] = 2.0;
35  binning.m_signal_pdf[2] = 3.0;
36 
37  binning.m_bckgrd_pdf[0] = 3.0;
38  binning.m_bckgrd_pdf[1] = 2.0;
39  binning.m_bckgrd_pdf[2] = 1.0;
40 
41  binning.m_boundaries = {1.0, 2.0, 3.0, 4.0};
42 
43  binning.normalizePDFs();
44 
45  EXPECT_FLOAT_EQ(binning.m_signal_pdf[0], 1.0 / 6.0 * 3.0);
46  EXPECT_FLOAT_EQ(binning.m_signal_pdf[1], 2.0 / 6.0 * 3.0);
47  EXPECT_FLOAT_EQ(binning.m_signal_pdf[2], 3.0 / 6.0 * 3.0);
48 
49  EXPECT_FLOAT_EQ(binning.m_bckgrd_pdf[0], 3.0 / 6.0 * 3.0);
50  EXPECT_FLOAT_EQ(binning.m_bckgrd_pdf[1], 2.0 / 6.0 * 3.0);
51  EXPECT_FLOAT_EQ(binning.m_bckgrd_pdf[2], 1.0 / 6.0 * 3.0);
52 
53  EXPECT_FLOAT_EQ(binning.m_signal_yield, 6.0);
54  EXPECT_FLOAT_EQ(binning.m_bckgrd_yield, 6.0);
55 
56  binning.calculateCDFsFromPDFs();
57 
58  EXPECT_FLOAT_EQ(binning.m_signal_pdf[0], 1.0 / 6.0 * 3.0);
59  EXPECT_FLOAT_EQ(binning.m_signal_pdf[1], 2.0 / 6.0 * 3.0);
60  EXPECT_FLOAT_EQ(binning.m_signal_pdf[2], 3.0 / 6.0 * 3.0);
61 
62  EXPECT_FLOAT_EQ(binning.m_bckgrd_pdf[0], 3.0 / 6.0 * 3.0);
63  EXPECT_FLOAT_EQ(binning.m_bckgrd_pdf[1], 2.0 / 6.0 * 3.0);
64  EXPECT_FLOAT_EQ(binning.m_bckgrd_pdf[2], 1.0 / 6.0 * 3.0);
65 
66  EXPECT_FLOAT_EQ(binning.m_signal_yield, 6.0);
67  EXPECT_FLOAT_EQ(binning.m_bckgrd_yield, 6.0);
68 
69  EXPECT_FLOAT_EQ(binning.m_signal_cdf[0], 1.0 / 6.0);
70  EXPECT_FLOAT_EQ(binning.m_signal_cdf[1], 3.0 / 6.0);
71  EXPECT_FLOAT_EQ(binning.m_signal_cdf[2], 6.0 / 6.0);
72 
73  EXPECT_FLOAT_EQ(binning.m_bckgrd_cdf[0], 3.0 / 6.0);
74  EXPECT_FLOAT_EQ(binning.m_bckgrd_cdf[1], 5.0 / 6.0);
75  EXPECT_FLOAT_EQ(binning.m_bckgrd_cdf[2], 6.0 / 6.0);
76 
77  binning.m_boundaries[0] = 1.0;
78  binning.m_boundaries[1] = 2.0;
79  binning.m_boundaries[2] = 3.0;
80  binning.m_boundaries[3] = 4.0;
81 
82  EXPECT_EQ(binning.getBin(0.0), 0);
83  EXPECT_EQ(binning.getBin(1.0), 0);
84  EXPECT_EQ(binning.getBin(1.5), 0);
85  EXPECT_EQ(binning.getBin(2.0), 1);
86  EXPECT_EQ(binning.getBin(2.5), 1);
87  EXPECT_EQ(binning.getBin(3.0), 2);
88  EXPECT_EQ(binning.getBin(3.5), 2);
89  EXPECT_EQ(binning.getBin(4.5), 2);
90 
91  }
92 
93  TEST(BinningTest, EqualFrequencyBinning)
94  {
95  std::vector<float> data(100);
96  std::vector<float> weights(100);
97  std::vector<bool> isSignal(100);
98 
99  for (unsigned int i = 0; i < 100; ++i) {
100  data[i] = i;
101  weights[i] = static_cast<int>(i / 10) + 1;
102  isSignal[i] = (i % 2) == 1;
103  }
104 
105  MVA::Binning binning = MVA::Binning::CreateEqualFrequency(data, weights, isSignal, 3);
106 
107  EXPECT_FLOAT_EQ(binning.m_boundaries.size(), 4);
108  EXPECT_FLOAT_EQ(binning.m_boundaries[0], 0.0);
109  EXPECT_FLOAT_EQ(binning.m_boundaries[1], 55.0);
110  EXPECT_FLOAT_EQ(binning.m_boundaries[2], 80.0);
111  EXPECT_FLOAT_EQ(binning.m_boundaries[3], 99.0);
112 
113  EXPECT_FLOAT_EQ(binning.m_signal_pdf.size(), 3);
114  EXPECT_FLOAT_EQ(binning.m_signal_pdf[0] * binning.m_signal_yield * 55.0 / 99.0, 87.0);
115  EXPECT_FLOAT_EQ(binning.m_signal_pdf[1] * binning.m_signal_yield * 25.0 / 99.0, 93.0);
116  EXPECT_FLOAT_EQ(binning.m_signal_pdf[2] * binning.m_signal_yield * 19.0 / 99.0, 95.0);
117 
118  EXPECT_FLOAT_EQ(binning.m_bckgrd_pdf.size(), 3);
119  EXPECT_FLOAT_EQ(binning.m_bckgrd_pdf[0] * binning.m_bckgrd_yield * 55.0 / 99.0, 93.0);
120  EXPECT_FLOAT_EQ(binning.m_bckgrd_pdf[1] * binning.m_bckgrd_yield * 25.0 / 99.0, 87.0);
121  EXPECT_FLOAT_EQ(binning.m_bckgrd_pdf[2] * binning.m_bckgrd_yield * 19.0 / 99.0, 95.0);
122 
123  EXPECT_FLOAT_EQ(binning.m_signal_cdf.size(), 3);
124  EXPECT_FLOAT_EQ(binning.m_signal_cdf[0] * binning.m_signal_yield, 87.0);
125  EXPECT_FLOAT_EQ(binning.m_signal_cdf[1] * binning.m_signal_yield, 180.0);
126  EXPECT_FLOAT_EQ(binning.m_signal_cdf[2] * binning.m_signal_yield, 275.0);
127 
128  EXPECT_FLOAT_EQ(binning.m_bckgrd_cdf.size(), 3);
129  EXPECT_FLOAT_EQ(binning.m_bckgrd_cdf[0] * binning.m_bckgrd_yield, 93.0);
130  EXPECT_FLOAT_EQ(binning.m_bckgrd_cdf[1] * binning.m_bckgrd_yield, 180.0);
131  EXPECT_FLOAT_EQ(binning.m_bckgrd_cdf[2] * binning.m_bckgrd_yield, 275.0);
132 
133  }
134 
135  TEST(BinningTest, EquidistantBinning)
136  {
137  std::vector<float> data(100);
138  std::vector<float> weights(100);
139  std::vector<bool> isSignal(100);
140 
141  for (unsigned int i = 0; i < 100; ++i) {
142  data[i] = i;
143  weights[i] = static_cast<int>(i / 10) + 1;
144  isSignal[i] = (i % 2) == 1;
145  }
146 
147  MVA::Binning binning = MVA::Binning::CreateEquidistant(data, weights, isSignal, 3);
148 
149  EXPECT_FLOAT_EQ(binning.m_boundaries.size(), 4);
150  EXPECT_FLOAT_EQ(binning.m_boundaries[0], 0.0);
151  EXPECT_FLOAT_EQ(binning.m_boundaries[1], 33.0);
152  EXPECT_FLOAT_EQ(binning.m_boundaries[2], 66.0);
153  EXPECT_FLOAT_EQ(binning.m_boundaries[3], 99.0);
154 
155  EXPECT_FLOAT_EQ(binning.m_signal_pdf.size(), 3);
156  EXPECT_FLOAT_EQ(binning.m_signal_pdf[0] * binning.m_signal_yield / 3.0, 34.0);
157  EXPECT_FLOAT_EQ(binning.m_signal_pdf[1] * binning.m_signal_yield / 3.0, 92.0);
158  EXPECT_FLOAT_EQ(binning.m_signal_pdf[2] * binning.m_signal_yield / 3.0, 149.0);
159 
160  EXPECT_FLOAT_EQ(binning.m_bckgrd_pdf.size(), 3);
161  EXPECT_FLOAT_EQ(binning.m_bckgrd_pdf[0] * binning.m_bckgrd_yield / 3.0, 38.0);
162  EXPECT_FLOAT_EQ(binning.m_bckgrd_pdf[1] * binning.m_bckgrd_yield / 3.0, 88.0);
163  EXPECT_FLOAT_EQ(binning.m_bckgrd_pdf[2] * binning.m_bckgrd_yield / 3.0, 149.0);
164 
165  EXPECT_FLOAT_EQ(binning.m_signal_cdf.size(), 3);
166  EXPECT_FLOAT_EQ(binning.m_signal_cdf[0] * binning.m_signal_yield, 34.0);
167  EXPECT_FLOAT_EQ(binning.m_signal_cdf[1] * binning.m_signal_yield, 126.0);
168  EXPECT_FLOAT_EQ(binning.m_signal_cdf[2] * binning.m_signal_yield, 275.0);
169 
170  EXPECT_FLOAT_EQ(binning.m_bckgrd_cdf.size(), 3);
171  EXPECT_FLOAT_EQ(binning.m_bckgrd_cdf[0] * binning.m_bckgrd_yield, 38.0);
172  EXPECT_FLOAT_EQ(binning.m_bckgrd_cdf[1] * binning.m_bckgrd_yield, 126.0);
173  EXPECT_FLOAT_EQ(binning.m_bckgrd_cdf[2] * binning.m_bckgrd_yield, 275.0);
174 
175  }
176 
177 }
Belle2::MVA::Binning::m_bckgrd_yield
double m_bckgrd_yield
Background yield in data distribution.
Definition: Binning.h:56
Belle2::MVA::Binning::m_boundaries
std::vector< float > m_boundaries
Boundaries of data distribution, including minimum and maximum value as first and last boundary.
Definition: Binning.h:63
Belle2::MVA::Binning::CreateEqualFrequency
static Binning CreateEqualFrequency(const std::vector< float > &data, const std::vector< float > &weights, const std::vector< bool > &isSignal, unsigned int nBins)
Create an equal frequency (aka equal-statistics) binning.
Definition: Binning.cc:103
Belle2::MVA::Binning::m_bckgrd_pdf
std::vector< float > m_bckgrd_pdf
Background pdf of data distribution per bin.
Definition: Binning.h:60
Belle2::MVA::Binning::CreateEquidistant
static Binning CreateEquidistant(const std::vector< float > &data, const std::vector< float > &weights, const std::vector< bool > &isSignal, unsigned int nBins)
Create an equidistant binning.
Definition: Binning.cc:149
Belle2::MVA::Binning::m_signal_cdf
std::vector< float > m_signal_cdf
Signal cdf of data distribution per bin.
Definition: Binning.h:59
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::TEST
TEST(TestgetDetectorRegion, TestgetDetectorRegion)
Test Constructors.
Definition: utilityFunctions.cc:18
Belle2::MVA::Binning::m_bckgrd_cdf
std::vector< float > m_bckgrd_cdf
Background cdf of data distribution per bin.
Definition: Binning.h:61
Belle2::MVA::Binning
Binning of a data distribution Provides PDF and CDF values of the distribution per bin.
Definition: Binning.h:29
Belle2::MVA::Binning::m_signal_pdf
std::vector< float > m_signal_pdf
Signal pdf of data distribution per bin.
Definition: Binning.h:58
Belle2::MVA::Binning::m_signal_yield
double m_signal_yield
Signal yield in data distribution.
Definition: Binning.h:55