casacore
Loading...
Searching...
No Matches
HingesFencesStatistics.h
Go to the documentation of this file.
1// # Copyright (C) 2000,2001
2// # Associated Universities, Inc. Washington DC, USA.
3// #
4// # This library is free software; you can redistribute it and/or modify it
5// # under the terms of the GNU Library General Public License as published by
6// # the Free Software Foundation; either version 2 of the License, or (at your
7// # option) any later version.
8// #
9// # This library is distributed in the hope that it will be useful, but WITHOUT
10// # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11// # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
12// # License for more details.
13// #
14// # You should have received a copy of the GNU Library General Public License
15// # along with this library; if not, write to the Free Software Foundation,
16// # Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
17// #
18// # Correspondence concerning AIPS++ should be addressed as follows:
19// # Internet email: casa-feedback@nrao.edu.
20// # Postal address: AIPS++ Project Office
21// # National Radio Astronomy Observatory
22// # 520 Edgemont Road
23// # Charlottesville, VA 22903-2475 USA
24// #
25
26#ifndef SCIMATH_HINGESFENCESSTATISTICS_H
27#define SCIMATH_HINGESFENCESSTATISTICS_H
28
29#include <casacore/casa/aips.h>
30
31#include <casacore/scimath/StatsFramework/ConstrainedRangeStatistics.h>
32
33#include <set>
34#include <vector>
35#include <utility>
36
37namespace casacore {
38
39// Class to calculate statistics using the so-called hinges and fences
40// algorithm. In this algorithm, the data on which the statistics are computed
41// from is limited to the range of values between Q1 - f*D and Q3 + f*D,
42// inclusive, where D = Q3 - Q1 and Q1 and Q3 are the first and third quartiles,
43// respectively.
44//
45// This class uses a HingesFencesQuantileComputer object for computing quantile-
46// like statistics. See class documentation for StatisticsAlgorithm for details
47// regarding QuantileComputer classes.
48
49template <class AccumType, class DataIterator, class MaskIterator = const Bool*,
50 class WeightsIterator = DataIterator>
52 public:
53 // If <src>f</src> is negative, the full dataset is used; ie the object has
54 // the same behavior as a ClassicalStatistics object
56
57 // copy semantics
59
61
62 // copy semantics
64
65 // Clone this instance. Caller is responsible for deleting the returned
66 // pointer.
68
69 // get the algorithm that this object uses for computing stats
71
72 // reset object to initial state. Clears all private fields including data,
73 // accumulators, global range. It does not affect the fence factor (_f),
74 // which was set at object construction.
75 virtual void reset();
76
77 // This class does not allow statistics to be calculated as datasets are
78 // added, so an exception will be thrown if <src>c</src> is True.
80
81 protected:
82 // <group>
83 // scan through the data set to determine the number of good (unmasked,
84 // weight > 0, within range) points. The first with no mask, no ranges, and
85 // no weights is trivial with npts = nr in this class, but is implemented
86 // here so that derived classes may override it.
87 virtual void _accumNpts(uInt64& npts, const DataIterator& dataStart, uInt64 nr,
88 uInt dataStride) const;
89
90 virtual void _accumNpts(uInt64& npts, const DataIterator& dataStart, uInt64 nr, uInt dataStride,
91 const DataRanges& ranges, Bool isInclude) const;
92
93 virtual void _accumNpts(uInt64& npts, const DataIterator& dataBegin, uInt64 nr, uInt dataStride,
94 const MaskIterator& maskBegin, uInt maskStride) const;
95
96 virtual void _accumNpts(uInt64& npts, const DataIterator& dataBegin, uInt64 nr, uInt dataStride,
97 const MaskIterator& maskBegin, uInt maskStride, const DataRanges& ranges,
98 Bool isInclude) const;
99
100 virtual void _accumNpts(uInt64& npts, const DataIterator& dataBegin,
101 const WeightsIterator& weightsBegin, uInt64 nr, uInt dataStride) const;
102
103 virtual void _accumNpts(uInt64& npts, const DataIterator& dataBegin,
104 const WeightsIterator& weightsBegin, uInt64 nr, uInt dataStride,
105 const DataRanges& ranges, Bool isInclude) const;
106
107 virtual void _accumNpts(uInt64& npts, const DataIterator& dataBegin,
108 const WeightsIterator& weightsBegin, uInt64 nr, uInt dataStride,
109 const MaskIterator& maskBegin, uInt maskStride, const DataRanges& ranges,
110 Bool isInclude) const;
111
112 virtual void _accumNpts(uInt64& npts, const DataIterator& dataBegin,
113 const WeightsIterator& weightBegin, uInt64 nr, uInt dataStride,
114 const MaskIterator& maskBegin, uInt maskStride) const;
115 // </group>
116
117 // <group>
118 virtual void _minMax(std::shared_ptr<AccumType>& mymin, std::shared_ptr<AccumType>& mymax,
119 const DataIterator& dataBegin, uInt64 nr, uInt dataStride) const;
120
121 virtual void _minMax(std::shared_ptr<AccumType>& mymin, std::shared_ptr<AccumType>& mymax,
122 const DataIterator& dataBegin, uInt64 nr, uInt dataStride,
123 const DataRanges& ranges, Bool isInclude) const;
124
125 virtual void _minMax(std::shared_ptr<AccumType>& mymin, std::shared_ptr<AccumType>& mymax,
126 const DataIterator& dataBegin, uInt64 nr, uInt dataStride,
127 const MaskIterator& maskBegin, uInt maskStride) const;
128
129 virtual void _minMax(std::shared_ptr<AccumType>& mymin, std::shared_ptr<AccumType>& mymax,
130 const DataIterator& dataBegin, uInt64 nr, uInt dataStride,
131 const MaskIterator& maskBegin, uInt maskStride, const DataRanges& ranges,
132 Bool isInclude) const;
133
134 virtual void _minMax(std::shared_ptr<AccumType>& mymin, std::shared_ptr<AccumType>& mymax,
135 const DataIterator& dataBegin, const WeightsIterator& weightsBegin,
136 uInt64 nr, uInt dataStride) const;
137
138 virtual void _minMax(std::shared_ptr<AccumType>& mymin, std::shared_ptr<AccumType>& mymax,
139 const DataIterator& dataBegin, const WeightsIterator& weightsBegin,
140 uInt64 nr, uInt dataStride, const DataRanges& ranges, Bool isInclude) const;
141
142 virtual void _minMax(std::shared_ptr<AccumType>& mymin, std::shared_ptr<AccumType>& mymax,
143 const DataIterator& dataBegin, const WeightsIterator& weightsBegin,
144 uInt64 nr, uInt dataStride, const MaskIterator& maskBegin, uInt maskStride,
145 const DataRanges& ranges, Bool isInclude) const;
146
147 virtual void _minMax(std::shared_ptr<AccumType>& mymin, std::shared_ptr<AccumType>& mymax,
148 const DataIterator& dataBegin, const WeightsIterator& weightBegin, uInt64 nr,
149 uInt dataStride, const MaskIterator& maskBegin, uInt maskStride) const;
150
151 // <group>
152 // Sometimes we want the min, max, and npts all in one scan.
153 virtual void _minMaxNpts(uInt64& npts, std::shared_ptr<AccumType>& mymin,
154 std::shared_ptr<AccumType>& mymax, const DataIterator& dataBegin,
155 uInt64 nr, uInt dataStride) const;
156
157 virtual void _minMaxNpts(uInt64& npts, std::shared_ptr<AccumType>& mymin,
158 std::shared_ptr<AccumType>& mymax, const DataIterator& dataBegin,
159 uInt64 nr, uInt dataStride, const DataRanges& ranges,
160 Bool isInclude) const;
161
162 virtual void _minMaxNpts(uInt64& npts, std::shared_ptr<AccumType>& mymin,
163 std::shared_ptr<AccumType>& mymax, const DataIterator& dataBegin,
164 uInt64 nr, uInt dataStride, const MaskIterator& maskBegin,
165 uInt maskStride) const;
166
167 virtual void _minMaxNpts(uInt64& npts, std::shared_ptr<AccumType>& mymin,
168 std::shared_ptr<AccumType>& mymax, const DataIterator& dataBegin,
169 uInt64 nr, uInt dataStride, const MaskIterator& maskBegin,
170 uInt maskStride, const DataRanges& ranges, Bool isInclude) const;
171
172 virtual void _minMaxNpts(uInt64& npts, std::shared_ptr<AccumType>& mymin,
173 std::shared_ptr<AccumType>& mymax, const DataIterator& dataBegin,
174 const WeightsIterator& weightsBegin, uInt64 nr, uInt dataStride) const;
175
176 virtual void _minMaxNpts(uInt64& npts, std::shared_ptr<AccumType>& mymin,
177 std::shared_ptr<AccumType>& mymax, const DataIterator& dataBegin,
178 const WeightsIterator& weightsBegin, uInt64 nr, uInt dataStride,
179 const DataRanges& ranges, Bool isInclude) const;
180
181 virtual void _minMaxNpts(uInt64& npts, std::shared_ptr<AccumType>& mymin,
182 std::shared_ptr<AccumType>& mymax, const DataIterator& dataBegin,
183 const WeightsIterator& weightsBegin, uInt64 nr, uInt dataStride,
184 const MaskIterator& maskBegin, uInt maskStride, const DataRanges& ranges,
185 Bool isInclude) const;
186
187 virtual void _minMaxNpts(uInt64& npts, std::shared_ptr<AccumType>& mymin,
188 std::shared_ptr<AccumType>& mymax, const DataIterator& dataBegin,
189 const WeightsIterator& weightBegin, uInt64 nr, uInt dataStride,
190 const MaskIterator& maskBegin, uInt maskStride) const;
191 // </group>
192
193 // <group>
194 // no weights, no mask, no ranges
195 virtual void _unweightedStats(StatsData<AccumType>& stats, uInt64& ngood, LocationType& location,
196 const DataIterator& dataBegin, uInt64 nr, uInt dataStride);
197
198 // no weights, no mask
199 virtual void _unweightedStats(StatsData<AccumType>& stats, uInt64& ngood, LocationType& location,
200 const DataIterator& dataBegin, uInt64 nr, uInt dataStride,
201 const DataRanges& ranges, Bool isInclude);
202
203 virtual void _unweightedStats(StatsData<AccumType>& stats, uInt64& ngood, LocationType& location,
204 const DataIterator& dataBegin, uInt64 nr, uInt dataStride,
205 const MaskIterator& maskBegin, uInt maskStride);
206
207 virtual void _unweightedStats(StatsData<AccumType>& stats, uInt64& ngood, LocationType& location,
208 const DataIterator& dataBegin, uInt64 nr, uInt dataStride,
209 const MaskIterator& maskBegin, uInt maskStride,
210 const DataRanges& ranges, Bool isInclude);
211 // </group>
212
213 // <group>
214 // has weights, but no mask, no ranges
215 virtual void _weightedStats(StatsData<AccumType>& stats, LocationType& location,
216 const DataIterator& dataBegin, const WeightsIterator& weightsBegin,
217 uInt64 nr, uInt dataStride);
218
219 virtual void _weightedStats(StatsData<AccumType>& stats, LocationType& location,
220 const DataIterator& dataBegin, const WeightsIterator& weightsBegin,
221 uInt64 nr, uInt dataStride, const DataRanges& ranges, Bool isInclude);
222
223 virtual void _weightedStats(StatsData<AccumType>& stats, LocationType& location,
224 const DataIterator& dataBegin, const WeightsIterator& weightBegin,
225 uInt64 nr, uInt dataStride, const MaskIterator& maskBegin,
226 uInt maskStride);
227
228 virtual void _weightedStats(StatsData<AccumType>& stats, LocationType& location,
229 const DataIterator& dataBegin, const WeightsIterator& weightBegin,
230 uInt64 nr, uInt dataStride, const MaskIterator& maskBegin,
231 uInt maskStride, const DataRanges& ranges, Bool isInclude);
232 // </group>
233
234 private:
235 // _f defined in inclusion range between Q1 - _f*D and Q3 + _f*D, where
236 // D = Q3 - Q1 and Q1 and Q3 are the first and third quartiles, respectively
239
240 void _setRange();
241};
242
243} // namespace casacore
244
245#ifndef CASACORE_NO_AUTO_TEMPLATES
246#include <casacore/scimath/StatsFramework/HingesFencesStatistics.tcc>
247#endif // # CASACORE_NO_AUTO_TEMPLATES
248
249#endif
#define DataRanges
HingesFencesStatistics< CASA_STATP > & operator=(const HingesFencesStatistics< CASA_STATP > &other)
copy semantics
virtual void _minMaxNpts(uInt64 &npts, std::shared_ptr< AccumType > &mymin, std::shared_ptr< AccumType > &mymax, const DataIterator &dataBegin, const WeightsIterator &weightsBegin, uInt64 nr, uInt dataStride) const
virtual void _accumNpts(uInt64 &npts, const DataIterator &dataBegin, const WeightsIterator &weightsBegin, uInt64 nr, uInt dataStride, const MaskIterator &maskBegin, uInt maskStride, const DataRanges &ranges, Bool isInclude) const
virtual void _weightedStats(StatsData< AccumType > &stats, LocationType &location, const DataIterator &dataBegin, const WeightsIterator &weightsBegin, uInt64 nr, uInt dataStride, const DataRanges &ranges, Bool isInclude)
virtual void _minMax(std::shared_ptr< AccumType > &mymin, std::shared_ptr< AccumType > &mymax, const DataIterator &dataBegin, uInt64 nr, uInt dataStride, const DataRanges &ranges, Bool isInclude) const
virtual void _unweightedStats(StatsData< AccumType > &stats, uInt64 &ngood, LocationType &location, const DataIterator &dataBegin, uInt64 nr, uInt dataStride, const MaskIterator &maskBegin, uInt maskStride, const DataRanges &ranges, Bool isInclude)
virtual void _minMaxNpts(uInt64 &npts, std::shared_ptr< AccumType > &mymin, std::shared_ptr< AccumType > &mymax, const DataIterator &dataBegin, const WeightsIterator &weightsBegin, uInt64 nr, uInt dataStride, const DataRanges &ranges, Bool isInclude) const
virtual void _accumNpts(uInt64 &npts, const DataIterator &dataBegin, const WeightsIterator &weightsBegin, uInt64 nr, uInt dataStride) const
Double _f
_f defined in inclusion range between Q1 - _f*D and Q3 + _f*D, where D = Q3 - Q1 and Q1 and Q3 are th...
virtual void _accumNpts(uInt64 &npts, const DataIterator &dataBegin, uInt64 nr, uInt dataStride, const MaskIterator &maskBegin, uInt maskStride, const DataRanges &ranges, Bool isInclude) const
void setCalculateAsAdded(Bool c)
This class does not allow statistics to be calculated as datasets are added, so an exception will be ...
virtual void _accumNpts(uInt64 &npts, const DataIterator &dataBegin, const WeightsIterator &weightBegin, uInt64 nr, uInt dataStride, const MaskIterator &maskBegin, uInt maskStride) const
virtual void _weightedStats(StatsData< AccumType > &stats, LocationType &location, const DataIterator &dataBegin, const WeightsIterator &weightsBegin, uInt64 nr, uInt dataStride)
has weights, but no mask, no ranges
HingesFencesStatistics(const HingesFencesStatistics< CASA_STATP > &other)
copy semantics
virtual void _minMax(std::shared_ptr< AccumType > &mymin, std::shared_ptr< AccumType > &mymax, const DataIterator &dataBegin, uInt64 nr, uInt dataStride) const
virtual void _weightedStats(StatsData< AccumType > &stats, LocationType &location, const DataIterator &dataBegin, const WeightsIterator &weightBegin, uInt64 nr, uInt dataStride, const MaskIterator &maskBegin, uInt maskStride)
virtual void _minMax(std::shared_ptr< AccumType > &mymin, std::shared_ptr< AccumType > &mymax, const DataIterator &dataBegin, const WeightsIterator &weightsBegin, uInt64 nr, uInt dataStride, const DataRanges &ranges, Bool isInclude) const
virtual StatisticsAlgorithm< CASA_STATP > * clone() const
Clone this instance.
virtual void _unweightedStats(StatsData< AccumType > &stats, uInt64 &ngood, LocationType &location, const DataIterator &dataBegin, uInt64 nr, uInt dataStride, const MaskIterator &maskBegin, uInt maskStride)
virtual void _unweightedStats(StatsData< AccumType > &stats, uInt64 &ngood, LocationType &location, const DataIterator &dataBegin, uInt64 nr, uInt dataStride)
no weights, no mask, no ranges
virtual void _minMax(std::shared_ptr< AccumType > &mymin, std::shared_ptr< AccumType > &mymax, const DataIterator &dataBegin, const WeightsIterator &weightBegin, uInt64 nr, uInt dataStride, const MaskIterator &maskBegin, uInt maskStride) const
virtual void _minMaxNpts(uInt64 &npts, std::shared_ptr< AccumType > &mymin, std::shared_ptr< AccumType > &mymax, const DataIterator &dataBegin, uInt64 nr, uInt dataStride) const
Sometimes we want the min, max, and npts all in one scan.
virtual void _weightedStats(StatsData< AccumType > &stats, LocationType &location, const DataIterator &dataBegin, const WeightsIterator &weightBegin, uInt64 nr, uInt dataStride, const MaskIterator &maskBegin, uInt maskStride, const DataRanges &ranges, Bool isInclude)
virtual void _accumNpts(uInt64 &npts, const DataIterator &dataBegin, uInt64 nr, uInt dataStride, const MaskIterator &maskBegin, uInt maskStride) const
virtual void _minMaxNpts(uInt64 &npts, std::shared_ptr< AccumType > &mymin, std::shared_ptr< AccumType > &mymax, const DataIterator &dataBegin, uInt64 nr, uInt dataStride, const MaskIterator &maskBegin, uInt maskStride, const DataRanges &ranges, Bool isInclude) const
virtual void _minMaxNpts(uInt64 &npts, std::shared_ptr< AccumType > &mymin, std::shared_ptr< AccumType > &mymax, const DataIterator &dataBegin, const WeightsIterator &weightBegin, uInt64 nr, uInt dataStride, const MaskIterator &maskBegin, uInt maskStride) const
virtual void _minMax(std::shared_ptr< AccumType > &mymin, std::shared_ptr< AccumType > &mymax, const DataIterator &dataBegin, const WeightsIterator &weightsBegin, uInt64 nr, uInt dataStride, const MaskIterator &maskBegin, uInt maskStride, const DataRanges &ranges, Bool isInclude) const
virtual StatisticsData::ALGORITHM algorithm() const
get the algorithm that this object uses for computing stats
virtual void _minMax(std::shared_ptr< AccumType > &mymin, std::shared_ptr< AccumType > &mymax, const DataIterator &dataBegin, uInt64 nr, uInt dataStride, const MaskIterator &maskBegin, uInt maskStride, const DataRanges &ranges, Bool isInclude) const
virtual void _minMaxNpts(uInt64 &npts, std::shared_ptr< AccumType > &mymin, std::shared_ptr< AccumType > &mymax, const DataIterator &dataBegin, uInt64 nr, uInt dataStride, const MaskIterator &maskBegin, uInt maskStride) const
virtual void _minMaxNpts(uInt64 &npts, std::shared_ptr< AccumType > &mymin, std::shared_ptr< AccumType > &mymax, const DataIterator &dataBegin, uInt64 nr, uInt dataStride, const DataRanges &ranges, Bool isInclude) const
virtual void _unweightedStats(StatsData< AccumType > &stats, uInt64 &ngood, LocationType &location, const DataIterator &dataBegin, uInt64 nr, uInt dataStride, const DataRanges &ranges, Bool isInclude)
no weights, no mask
virtual void _minMax(std::shared_ptr< AccumType > &mymin, std::shared_ptr< AccumType > &mymax, const DataIterator &dataBegin, const WeightsIterator &weightsBegin, uInt64 nr, uInt dataStride) const
virtual void _accumNpts(uInt64 &npts, const DataIterator &dataStart, uInt64 nr, uInt dataStride) const
scan through the data set to determine the number of good (unmasked, weight > 0, within range) points...
HingesFencesStatistics(Double f=-1.0)
If f is negative, the full dataset is used; ie the object has the same behavior as a ClassicalStatist...
virtual void _accumNpts(uInt64 &npts, const DataIterator &dataStart, uInt64 nr, uInt dataStride, const DataRanges &ranges, Bool isInclude) const
virtual void _minMax(std::shared_ptr< AccumType > &mymin, std::shared_ptr< AccumType > &mymax, const DataIterator &dataBegin, uInt64 nr, uInt dataStride, const MaskIterator &maskBegin, uInt maskStride) const
virtual void _minMaxNpts(uInt64 &npts, std::shared_ptr< AccumType > &mymin, std::shared_ptr< AccumType > &mymax, const DataIterator &dataBegin, const WeightsIterator &weightsBegin, uInt64 nr, uInt dataStride, const MaskIterator &maskBegin, uInt maskStride, const DataRanges &ranges, Bool isInclude) const
virtual void _accumNpts(uInt64 &npts, const DataIterator &dataBegin, const WeightsIterator &weightsBegin, uInt64 nr, uInt dataStride, const DataRanges &ranges, Bool isInclude) const
virtual void reset()
reset object to initial state.
Base class of statistics algorithm class hierarchy.
ALGORITHM
implemented algorithms
For temporary backward namespace compatibility, use casa as alias for casacore.
Definition mainpage.dox:28
const Bool False
Definition aipstype.h:42
unsigned int uInt
Definition aipstype.h:49
std::pair< Int64, Int64 > LocationType
bool Bool
Define the standard types used by Casacore.
Definition aipstype.h:40
double Double
Definition aipstype.h:53
unsigned long long uInt64
Definition aipsxtype.h:37