11 #include <mva/utility/Binning.h>
40 unsigned int bin = std::distance(
m_boundaries.begin(), it);
58 for (
unsigned int iBin = 0; iBin < nBins; ++iBin) {
65 for (
unsigned int iBin = 0; iBin < nBins; ++iBin) {
83 for (
unsigned int iBin = 0; iBin < nBins; ++iBin) {
88 for (
unsigned int iBin = 1; iBin < nBins; ++iBin) {
96 const std::vector<bool>& isSignal,
unsigned int nBins)
101 unsigned int nEvents = data.size();
103 std::vector<unsigned int> indices(nEvents);
104 std::iota(indices.begin(), indices.end(), 0);
105 std::sort(indices.begin(), indices.end(), [&](
unsigned int i,
unsigned int j) {return data[i] < data[j]; });
107 double sum_weights = 0;
108 for (
auto& w : weights)
110 double weight_per_bin = sum_weights / nBins;
112 unsigned int bin = 1;
113 double current_weight = 0;
114 binning.m_boundaries[0] = data[indices[0]];
115 binning.m_boundaries[nBins] = data[indices[nEvents - 1]];
117 for (
unsigned int iEvent = 0; iEvent < nEvents; ++iEvent) {
118 unsigned int index = indices[iEvent];
119 current_weight += weights[index];
120 if (current_weight >= weight_per_bin and bin < nBins and binning.m_boundaries[bin - 1] < data[index]) {
121 auto number_of_bins =
static_cast<unsigned int>(current_weight / weight_per_bin);
122 current_weight -= weight_per_bin * number_of_bins;
123 for (
unsigned int i = 0; i < number_of_bins; ++i) {
124 binning.m_boundaries[bin] = data[index];
128 if (isSignal[index]) {
129 binning.m_signal_pdf[bin - 1] += weights[index];
131 binning.m_bckgrd_pdf[bin - 1] += weights[index];
135 binning.normalizePDFs();
136 binning.calculateCDFsFromPDFs();
142 const std::vector<bool>& isSignal,
unsigned int nBins)
147 auto minmax = std::minmax_element(data.begin(), data.end());
148 float min = *(minmax.first);
149 float max = *(minmax.second);
150 float step = (max - min) / nBins;
152 for (
unsigned int iBin = 0; iBin <= nBins; ++iBin) {
153 binning.m_boundaries[iBin] = min + step * iBin;
156 for (
unsigned int iEvent = 0; iEvent < data.size(); ++iEvent) {
157 unsigned int bin = binning.getBin(data[iEvent]);
159 if (isSignal[iEvent])
160 binning.m_signal_pdf[bin] += weights[iEvent];
162 binning.m_bckgrd_pdf[bin] += weights[iEvent];
166 binning.normalizePDFs();
167 binning.calculateCDFsFromPDFs();