forked from AmbaPant/mantid
-
Notifications
You must be signed in to change notification settings - Fork 1
/
HistogramItem.h
146 lines (123 loc) · 3.84 KB
/
HistogramItem.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
// Mantid Repository : https://github.com/mantidproject/mantid
//
// Copyright © 2016 ISIS Rutherford Appleton Laboratory UKRI,
// NScD Oak Ridge National Laboratory, European Spallation Source,
// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS
// SPDX - License - Identifier: GPL - 3.0 +
#pragma once
#include "MantidHistogramData/BinEdges.h"
#include "MantidHistogramData/DllConfig.h"
#include "MantidHistogramData/Histogram.h"
#include "MantidHistogramData/Points.h"
#include <utility>
namespace Mantid {
namespace HistogramData {
/** HistogramItem
HistogramItem represents a single index in a Histogram object.
HistogramItem is the type that is returned when iterating over a
Histogram using the foreach loop syntax. HistogramItem provides
efficient access to a single point in the Histogram.
HistogramItem will only perform conversions between counts and
frequencies or points and bins when explicitly told to. Code that
requires only a few values from a large Histogram may find this faster
than converting the whole X, Y or E value.
@author Samuel Jackson
@date 2017
*/
class MANTID_HISTOGRAMDATA_DLL HistogramItem {
public:
double center() const {
const auto &x = m_histogram.x();
if (xModeIsPoints()) {
return x[m_index];
} else {
return 0.5 * (x[m_index + 1] + x[m_index]);
}
}
double centerError() const {
const auto &dx = m_histogram.dx();
return dx[m_index];
}
double binWidth() const {
const auto &x = m_histogram.x();
if (xModeIsPoints()) {
auto numPoints = m_histogram.size();
if (m_index == 0) {
// first point
return x[1] - x[0];
} else if (m_index == numPoints - 1) {
// last point
return x[m_index] - x[m_index - 1];
} else {
// everything inbetween
return 0.5 * (x[m_index + 1] - x[m_index - 1]);
}
} else {
return x[m_index + 1] - x[m_index];
}
}
double counts() const {
const auto &y = m_histogram.y();
if (yModeIsCounts()) {
return y[m_index];
} else {
return y[m_index] * binWidth();
}
}
double countVariance() const {
const auto &e = m_histogram.e();
if (yModeIsCounts()) {
return e[m_index] * e[m_index];
} else {
const auto width = binWidth();
return e[m_index] * e[m_index] * width * width;
}
}
double countStandardDeviation() const {
const auto &e = m_histogram.e();
if (yModeIsCounts()) {
return e[m_index];
} else {
const auto width = binWidth();
return e[m_index] * width;
}
}
double frequency() const {
const auto &y = m_histogram.y();
if (yModeIsCounts()) {
return y[m_index] / binWidth();
} else {
return y[m_index];
}
}
double frequencyVariance() const {
const auto &e = m_histogram.e();
if (!yModeIsCounts()) {
return e[m_index] * e[m_index];
} else {
const auto width = binWidth();
return (e[m_index] * e[m_index]) / (width * width);
}
}
double frequencyStandardDeviation() const {
const auto &e = m_histogram.e();
if (!yModeIsCounts()) {
return e[m_index];
} else {
const auto width = binWidth();
return e[m_index] / width;
}
}
private:
friend class HistogramIterator;
/// Private constructor, can only be created by HistogramIterator
HistogramItem(const Histogram &histogram, const size_t index) : m_histogram(histogram), m_index(index) {}
bool xModeIsPoints() const { return Histogram::XMode::Points == m_histogram.xMode(); }
bool yModeIsCounts() const { return Histogram::YMode::Counts == m_histogram.yMode(); }
// Deleted assignment operator as a HistogramItem is not copyable
HistogramItem operator=(const HistogramItem &) = delete;
const Histogram &m_histogram;
size_t m_index;
};
} // namespace HistogramData
} // namespace Mantid