File: StatsHistogram.h

package info (click to toggle)
casacore 3.8.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 51,912 kB
  • sloc: cpp: 471,569; fortran: 16,372; ansic: 7,416; yacc: 4,714; lex: 2,346; sh: 1,865; python: 629; perl: 531; sed: 499; csh: 201; makefile: 32
file content (139 lines) | stat: -rw-r--r-- 4,527 bytes parent folder | download | duplicates (2)
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
//# Copyright (C) 2000,2001
//# Associated Universities, Inc. Washington DC, USA.
//#
//# This library is free software; you can redistribute it and/or modify it
//# under the terms of the GNU Library General Public License as published by
//# the Free Software Foundation; either version 2 of the License, or (at your
//# option) any later version.
//#
//# This library is distributed in the hope that it will be useful, but WITHOUT
//# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
//# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
//# License for more details.
//#
//# You should have received a copy of the GNU Library General Public License
//# along with this library; if not, write to the Free Software Foundation,
//# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
//#
//# Correspondence concerning AIPS++ should be addressed as follows:
//#        Internet email: casa-feedback@nrao.edu.
//#        Postal address: AIPS++ Project Office
//#                        National Radio Astronomy Observatory
//#                        520 Edgemont Road
//#                        Charlottesville, VA 22903-2475 USA
//#

#ifndef SCIMATH_STATSHISTOGRAM_H
#define SCIMATH_STATSHISTOGRAM_H

#include <casacore/casa/Utilities/DataType.h>
#include <casacore/casa/aips.h>
#include <casacore/casa/Exceptions/Error.h>

#include <iostream>
#include <casacore/casa/iosfwd.h>

#include <vector>

namespace casacore {

// Represents an unfilled histogram with equal width bins for binning used for
// quantile computations. It is necessary to store the min/max values of the bin
// limits, because machine precision issues when the bin width is sufficiently
// small can cause slightly different results for these when different methods
// are used to compute them, leading to accounting errors when the histogram is
// filled with data.

template <class AccumType> class StatsHistogram {
public:

    StatsHistogram() = delete;

    // Construct a histogram by specifying its minimum and maximum values and
    // the number of desired bins. No padding of the min/max values is done
    // internally, so the caller should do that prior to construction if
    // necessary.
    StatsHistogram(AccumType minLimit, AccumType maxLimit, uInt nBins);

    ~StatsHistogram();

    // get the binWidth.
    AccumType getBinWidth() const;

    // get the index of the bin containing the specified value
    uInt getIndex(AccumType value) const;

    // max limit values for all bins
    const std::vector<AccumType>& getMaxBinLimits() const;

    // max limit value of entire histogram (ie max limit value of last bin)
    AccumType getMaxHistLimit() const;

    // min limit value of entire histogram (ie min limit value of first bin)
    AccumType getMinHistLimit() const;

    // get the number of bins
    uInt getNBins() const;

private:

    AccumType _binWidth{0}, _minHistLimit{0}, _maxHistLimit{0};
    uInt _nBins{0};
    // maximum values for all bins
    std::vector<AccumType> _maxBinLimits{};

    // This does the obvious conversions. The Complex and DComplex
    // specializations (implemented below after the close of the class
    // definition) are used solely to permit compilation. In general, those
    // versions should never actually be called
    inline static uInt _getUInt(const AccumType& v) {
        return (uInt)v;
    }

    void _minMaxIdxRange(
        Int& minIdx, Int& maxIdx, AccumType value, Bool higher
    ) const;

};

// <group>
// The Complex and DComplex versions are used solely to permit compilation. In
// general, these versions should never actually be called

template<>
inline uInt StatsHistogram<casacore::Complex>::_getUInt(
    const casacore::Complex&
) {
    ThrowCc(
        "Logic Error: This version for complex "
        "data types should never be called"
    );
}

template<>
inline uInt StatsHistogram<casacore::DComplex>::_getUInt(
    const casacore::DComplex&
) {
    ThrowCc(
        "Logic Error: This version for complex "
        "data types should never be called"
    );
}
// </group>

// for use in debugging
template <class AccumType>
ostream &operator<<(ostream &os, const StatsHistogram<AccumType> &hist) {
	os << "min limit " << hist.getMinHistLimit() << " max limit "
        << hist.getMaxHistLimit() << "  bin width "
	    << hist.getBinWidth() << " nbins " << hist.getNBins();
	return os;
}

}

#ifndef CASACORE_NO_AUTO_TEMPLATES
#include "StatsHistogram.tcc"
#endif //# CASACORE_NO_AUTO_TEMPLATES

#endif