35LOG_LOGGER _log =
LOG_GET(
"lsst.jointcal.Histo4d");
42 const int n3,
double min3,
double max3,
const int n4,
double min4,
double max4,
44 : _data(nEntries, 0) {
45 double indexMax = n1 * n2 * n3 * n4;
46 if (indexMax >
double(INT_MAX))
47 LOGLS_WARN(_log,
"Cannot hold a 4D histo with more than " << INT_MAX <<
" values.");
61 for (
int i = 0; i < 4; ++i) _scale[i] = _n[i] / (_maxVal[i] - _minVal[i]);
69 for (
int idim = 0; idim < 4; ++idim) {
70 int i = (int)
std::floor((
x[idim] - _minVal[idim]) * _scale[idim]);
71 if (i < 0 || i >= _n[idim])
return -1;
72 index = index * _n[idim] + i;
78 for (
int i = 3; i >= 0; --i) {
79 int bin = code % _n[i];
81 x[i] = _minVal[i] + ((double)bin + 0.5) / _scale[i];
97 if (_ndata == _dataSize) {
101 _data[_ndata++] = code;
116 if (_ndata == 0)
return 0;
117 int maxval = _data[0];
119 int oldval = _data[0];
120 int currentCount = 1;
121 for (
int i = 1; i < _ndata; ++i) {
122 if (_data[i] == oldval)
126 if (currentCount > maxCount) {
127 maxCount = currentCount;
141 while ((_data[start] < code) && start < _ndata) start++;
144 while (
end < _ndata && _data[start] == _data[
end])
end++;
145 int shift =
end - start;
146 int lastShift = _ndata - (
end - start);
147 for (
int i = start; i < lastShift; ++i) _data[i] = _data[i + shift];
155 xMin = xCenter[iDim] - 0.5 / _scale[iDim];
156 xMax = xCenter[iDim] + 0.5 / _scale[iDim];
160 for (
int i = 0; i < _ndata; ++i)
#define LOGLS_WARN(logger, message)
void zeroBin(double x[4])
void inverse_code(int code, double x[4]) const
void fill(const double x[4])
void binLimits(const double x[4], int idim, double &xMin, double &xMax) const
return the bin limits of dimension idim (0<=idim<4), around point X.
int code_value(const double x[4]) const
Class for a simple mapping implementing a generic AstrometryTransform.