lsst.jointcal
g29ae962dfc+4cfc7946bc
Toggle main menu visibility
Loading...
Searching...
No Matches
src
Histo4d.cc
Go to the documentation of this file.
1
// -*- LSST-C++ -*-
2
/*
3
* This file is part of jointcal.
4
*
5
* Developed for the LSST Data Management System.
6
* This product includes software developed by the LSST Project
7
* (https://www.lsst.org).
8
* See the COPYRIGHT file at the top-level directory of this distribution
9
* for details of code ownership.
10
*
11
* This program is free software: you can redistribute it and/or modify
12
* it under the terms of the GNU General Public License as published by
13
* the Free Software Foundation, either version 3 of the License, or
14
* (at your option) any later version.
15
*
16
* This program is distributed in the hope that it will be useful,
17
* but WITHOUT ANY WARRANTY; without even the implied warranty of
18
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
* GNU General Public License for more details.
20
*
21
* You should have received a copy of the GNU General Public License
22
* along with this program. If not, see <https://www.gnu.org/licenses/>.
23
*/
24
25
#include <algorithm>
/* for sort */
26
#include <climits>
27
#include <cmath>
28
#include <cstring>
/* for memset*/
29
#include <iostream>
30
31
#include "
lsst/log/Log.h
"
32
#include "
lsst/jointcal/Histo4d.h
"
33
34
namespace
{
35
LOG_LOGGER _log =
LOG_GET
(
"lsst.jointcal.Histo4d"
);
36
}
37
38
namespace
lsst
{
39
namespace
jointcal
{
40
41
SparseHisto4d::SparseHisto4d
(
const
int
n1,
double
min1,
double
max1,
const
int
n2,
double
min2,
double
max2,
42
const
int
n3,
double
min3,
double
max3,
const
int
n4,
double
min4,
double
max4,
43
const
int
nEntries)
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."
);
48
_n[0] = n1;
49
_n[1] = n2;
50
_n[2] = n3;
51
_n[3] = n4;
52
_minVal[0] = min1;
53
_minVal[1] = min2;
54
_minVal[2] = min3;
55
_minVal[3] = min4;
56
_maxVal[0] = max1;
57
_maxVal[1] = max2;
58
_maxVal[2] = max3;
59
_maxVal[3] = max4;
60
61
for
(
int
i = 0; i < 4; ++i) _scale[i] = _n[i] / (_maxVal[i] - _minVal[i]);
62
_dataSize = nEntries;
63
_ndata = 0;
64
_sorted =
false
;
65
}
66
67
int
SparseHisto4d::code_value
(
const
double
x[4])
const
{
68
int
index = 0;
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;
73
}
74
return
index;
75
}
76
77
void
SparseHisto4d::inverse_code
(
int
code,
double
x[4])
const
{
78
for
(
int
i = 3; i >= 0; --i) {
79
int
bin = code % _n[i];
80
code /= _n[i];
81
x[i] = _minVal[i] + ((double)bin + 0.5) / _scale[i];
82
}
83
}
84
85
void
SparseHisto4d::sort
() {
86
if
(!_sorted) {
87
std::sort
(_data.begin(), _data.end());
88
_sorted =
true
;
89
}
90
}
91
92
void
SparseHisto4d::fill
(
const
double
x[4])
93
94
{
95
int
code =
code_value
(x);
96
if
(code < 0)
return
;
97
if
(_ndata == _dataSize) {
98
_dataSize *= 2;
99
_data.resize(_dataSize);
100
}
101
_data[_ndata++] = code;
102
_sorted =
false
;
103
}
104
105
void
SparseHisto4d::fill
(
const
double
x1,
const
double
x2,
const
double
x3,
const
double
x4) {
106
static
double
x[4];
107
x[0] = x1;
108
x[1] = x2;
109
x[2] = x3;
110
x[3] = x4;
111
fill
(x);
112
}
113
114
int
SparseHisto4d::maxBin
(
double
x[4]) {
115
sort
();
116
if
(_ndata == 0)
return
0;
117
int
maxval = _data[0];
118
int
maxCount = 1;
119
int
oldval = _data[0];
120
int
currentCount = 1;
121
for
(
int
i = 1; i < _ndata; ++i) {
122
if
(_data[i] == oldval)
123
currentCount++;
124
else
125
currentCount = 1;
126
if
(currentCount > maxCount) {
127
maxCount = currentCount;
128
maxval = _data[i];
129
}
130
oldval = _data[i];
131
}
132
inverse_code
(maxval, x);
133
return
maxCount;
134
}
135
136
void
SparseHisto4d::zeroBin
(
double
x[4]) {
137
sort
();
138
int
code =
code_value
(x);
139
// inefficient locator...
140
int
start = 0;
141
while
((_data[start] < code) && start < _ndata) start++;
142
// find how many identical entries we have
143
int
end
=
std::min
(start + 1, _ndata);
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];
148
_ndata -= shift;
149
}
150
151
void
SparseHisto4d::binLimits
(
const
double
x[4],
const
int
iDim,
double
&xMin,
double
&xMax)
const
{
152
int
code =
code_value
(x);
153
double
xCenter[4];
154
inverse_code
(code, xCenter);
155
xMin = xCenter[iDim] - 0.5 / _scale[iDim];
156
xMax = xCenter[iDim] + 0.5 / _scale[iDim];
157
}
158
159
void
SparseHisto4d::print
()
const
{
160
for
(
int
i = 0; i < _ndata; ++i)
// DEBUG
161
std::cout
<< _data[i] <<
' '
;
162
std::cout
<<
std::endl
;
163
}
164
}
// namespace jointcal
165
}
// namespace lsst
Log.h
LOGLS_WARN
#define LOGLS_WARN(logger, message)
LOG_GET
#define LOG_GET(logger)
Histo4d.h
std::cout
lsst::jointcal::SparseHisto4d::SparseHisto4d
SparseHisto4d()=default
lsst::jointcal::SparseHisto4d::zeroBin
void zeroBin(double x[4])
Definition
Histo4d.cc:136
lsst::jointcal::SparseHisto4d::print
void print() const
Definition
Histo4d.cc:159
lsst::jointcal::SparseHisto4d::sort
void sort()
Definition
Histo4d.cc:85
lsst::jointcal::SparseHisto4d::maxBin
int maxBin(double x[4])
Definition
Histo4d.cc:114
lsst::jointcal::SparseHisto4d::inverse_code
void inverse_code(int code, double x[4]) const
Definition
Histo4d.cc:77
lsst::jointcal::SparseHisto4d::fill
void fill(const double x[4])
Definition
Histo4d.cc:92
lsst::jointcal::SparseHisto4d::binLimits
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.
Definition
Histo4d.cc:151
lsst::jointcal::SparseHisto4d::code_value
int code_value(const double x[4]) const
Definition
Histo4d.cc:67
std::end
T end(T... args)
std::endl
T endl(T... args)
std::floor
T floor(T... args)
std::min
T min(T... args)
lsst::jointcal
Definition
Associations.h:50
lsst
std::sort
T sort(T... args)
Generated on
for lsst.jointcal by
1.17.0