7 #include "lsst/log/Log.h"
11 LOG_LOGGER _log = LOG_GET(
"jointcal.Histo4d");
18 const int n3,
double min3,
double max3,
const int n4,
double min4,
double max4,
20 double indexMax = n1 * n2 * n3 * n4;
22 if (indexMax >
double(INT_MAX))
23 LOGLS_WARN(_log,
"Cannot hold a 4D histo with more than " << INT_MAX <<
" values.");
37 for (
int i = 0; i < 4; ++i) _scale[i] = _n[i] / (_maxVal[i] - _minVal[i]);
38 _data.reset(
new int[nEntries]);
46 for (
int idim = 0; idim < 4; ++idim) {
47 int i = (int)floor((x[idim] - _minVal[idim]) * _scale[idim]);
48 if (i < 0 || i >= _n[idim])
return -1;
49 index = index * _n[idim] + i;
55 for (
int i = 3; i >= 0; --i) {
56 int bin = code % _n[i];
58 x[i] = _minVal[i] + ((double)bin + 0.5) / _scale[i];
64 std::sort(_data.get(), _data.get() + _ndata);
74 if (_ndata == _dataSize) {
75 std::unique_ptr<int[]> newData(
new int[_dataSize * 2]);
76 memcpy(newData.get(), _data.get(), _dataSize *
sizeof(_data[0]));
80 _data[_ndata++] = code;
95 if (_ndata == 0)
return 0;
96 int maxval = _data[0];
98 int oldval = _data[0];
100 for (
int i = 1; i < _ndata; ++i) {
101 if (_data[i] == oldval)
105 if (currentCount > maxCount) {
106 maxCount = currentCount;
120 while ((_data[start] < code) && start < _ndata) start++;
122 int end = std::min(start + 1, _ndata);
123 while (end < _ndata && _data[start] == _data[end]) end++;
124 int shift = end - start;
125 int lastShift = _ndata - (end - start);
126 for (
int i = start; i < lastShift; ++i) _data[i] = _data[i + shift];
134 xMin = xCenter[iDim] - 0.5 / _scale[iDim];
135 xMax = xCenter[iDim] + 0.5 / _scale[iDim];
139 for (
int i = 0; i < _ndata; ++i)
140 std::cout << _data[i] <<
' ';
141 std::cout << std::endl;
void fill(const double x[4])
int code_value(const double x[4]) const
void inverse_code(const int code, double x[4]) const
void binLimits(const double x[4], const int idim, double &xMin, double &xMax) const
return the bin limits of dimension idim (0<=idim<4), around point X.
void zeroBin(double x[4])