35 LOG_LOGGER _log =
LOG_GET(
"jointcal.Histo4d");
42 const int n3,
double min3,
double max3,
const int n4,
double min4,
double max4,
43 const int nEntries) : _data(nEntries,0) {
44 double indexMax = n1 * n2 * n3 * n4;
45 if (indexMax >
double(INT_MAX))
46 LOGLS_WARN(_log,
"Cannot hold a 4D histo with more than " << INT_MAX <<
" values.");
60 for (
int i = 0; i < 4; ++i) _scale[i] = _n[i] / (_maxVal[i] - _minVal[i]);
68 for (
int idim = 0; idim < 4; ++idim) {
69 int i = (int)
std::floor((
x[idim] - _minVal[idim]) * _scale[idim]);
70 if (i < 0 || i >= _n[idim])
return -1;
71 index = index * _n[idim] + i;
77 for (
int i = 3; i >= 0; --i) {
78 int bin = code % _n[i];
80 x[i] = _minVal[i] + ((double)bin + 0.5) / _scale[i];
96 if (_ndata == _dataSize) {
100 _data[_ndata++] = code;
115 if (_ndata == 0)
return 0;
116 int maxval = _data[0];
118 int oldval = _data[0];
119 int currentCount = 1;
120 for (
int i = 1; i < _ndata; ++i) {
121 if (_data[i] == oldval)
125 if (currentCount > maxCount) {
126 maxCount = currentCount;
140 while ((_data[start] < code) && start < _ndata) start++;
143 while (
end < _ndata && _data[start] == _data[
end])
end++;
144 int shift =
end - start;
145 int lastShift = _ndata - (
end - start);
146 for (
int i = start; i < lastShift; ++i) _data[i] = _data[i + shift];
154 xMin = xCenter[iDim] - 0.5 / _scale[iDim];
155 xMax = xCenter[iDim] + 0.5 / _scale[iDim];
159 for (
int i = 0; i < _ndata; ++i)
#define LOGLS_WARN(logger, message)
void zeroBin(double x[4])
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 fill(const double x[4])
int code_value(const double x[4]) const
Class for a simple mapping implementing a generic AstrometryTransform.