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 <
50 class AccumType, class DataIterator, class MaskIterator=const Bool *,
51 class WeightsIterator=DataIterator
52>
54 : public ConstrainedRangeStatistics<CASA_STATP> {
55public:
56
57 // If <src>f</src> is negative, the full dataset is used; ie the object has
58 // the same behavior as a ClassicalStatistics object
60
61 // copy semantics
63
65
66 // copy semantics
69 );
70
71 // Clone this instance. Caller is responsible for deleting the returned
72 // pointer.
74
75 // get the algorithm that this object uses for computing stats
79
80 // reset object to initial state. Clears all private fields including data,
81 // accumulators, global range. It does not affect the fence factor (_f),
82 // which was set at object construction.
83 virtual void reset();
84
85 // This class does not allow statistics to be calculated as datasets are
86 // added, so an exception will be thrown if <src>c</src> is True.
88
89protected:
90 // <group>
91 // scan through the data set to determine the number of good (unmasked,
92 // weight > 0, within range) points. The first with no mask, no ranges, and
93 // no weights is trivial with npts = nr in this class, but is implemented
94 // here so that derived classes may override it.
95 virtual void _accumNpts(
96 uInt64& npts, const DataIterator& dataStart, uInt64 nr, uInt dataStride
97 ) const;
98
99 virtual void _accumNpts(
100 uInt64& npts, const DataIterator& dataStart, uInt64 nr, uInt dataStride,
101 const DataRanges& ranges, Bool isInclude
102 ) const;
103
104 virtual void _accumNpts(
105 uInt64& npts, const DataIterator& dataBegin, uInt64 nr, uInt dataStride,
106 const MaskIterator& maskBegin, uInt maskStride
107 ) const;
108
109 virtual void _accumNpts(
110 uInt64& npts, const DataIterator& dataBegin, uInt64 nr, uInt dataStride,
111 const MaskIterator& maskBegin, uInt maskStride,
112 const DataRanges& ranges, Bool isInclude
113 ) const;
114
115 virtual void _accumNpts(
116 uInt64& npts, const DataIterator& dataBegin,
117 const WeightsIterator& weightsBegin, uInt64 nr, uInt dataStride
118 ) const;
119
120 virtual void _accumNpts(
121 uInt64& npts,
122 const DataIterator& dataBegin, const WeightsIterator& weightsBegin,
123 uInt64 nr, uInt dataStride, const DataRanges& ranges, Bool isInclude
124 ) const;
125
126 virtual void _accumNpts(
127 uInt64& npts,
128 const DataIterator& dataBegin, const WeightsIterator& weightsBegin,
129 uInt64 nr, uInt dataStride, const MaskIterator& maskBegin,
130 uInt maskStride, const DataRanges& ranges, Bool isInclude
131 ) const;
132
133 virtual void _accumNpts(
134 uInt64& npts, const DataIterator& dataBegin,
135 const WeightsIterator& weightBegin, uInt64 nr, uInt dataStride,
136 const MaskIterator& maskBegin, uInt maskStride
137 ) const;
138 // </group>
139
140 // <group>
141 virtual void _minMax(
142 std::shared_ptr<AccumType>& mymin, std::shared_ptr<AccumType>& mymax,
143 const DataIterator& dataBegin, uInt64 nr, uInt dataStride
144 ) const;
145
146 virtual void _minMax(
147 std::shared_ptr<AccumType>& mymin, std::shared_ptr<AccumType>& mymax,
148 const DataIterator& dataBegin, uInt64 nr, uInt dataStride,
149 const DataRanges& ranges, Bool isInclude
150 ) const;
151
152 virtual void _minMax(
153 std::shared_ptr<AccumType>& mymin, std::shared_ptr<AccumType>& mymax,
154 const DataIterator& dataBegin, uInt64 nr, uInt dataStride,
155 const MaskIterator& maskBegin, uInt maskStride
156 ) const;
157
158 virtual void _minMax(
159 std::shared_ptr<AccumType>& mymin, std::shared_ptr<AccumType>& mymax,
160 const DataIterator& dataBegin, uInt64 nr, uInt dataStride,
161 const MaskIterator& maskBegin,
162 uInt maskStride, const DataRanges& ranges, Bool isInclude
163 ) const;
164
165 virtual void _minMax(
166 std::shared_ptr<AccumType>& mymin, std::shared_ptr<AccumType>& mymax,
167 const DataIterator& dataBegin, const WeightsIterator& weightsBegin,
168 uInt64 nr, uInt dataStride
169 ) const;
170
171 virtual void _minMax(
172 std::shared_ptr<AccumType>& mymin, std::shared_ptr<AccumType>& mymax,
173 const DataIterator& dataBegin, const WeightsIterator& weightsBegin,
174 uInt64 nr, uInt dataStride, const DataRanges& ranges, Bool isInclude
175 ) const;
176
177 virtual void _minMax(
178 std::shared_ptr<AccumType>& mymin, std::shared_ptr<AccumType>& mymax,
179 const DataIterator& dataBegin, const WeightsIterator& weightsBegin,
180 uInt64 nr, uInt dataStride, const MaskIterator& maskBegin,
181 uInt maskStride, const DataRanges& ranges, Bool isInclude
182 ) const;
183
184 virtual void _minMax(
185 std::shared_ptr<AccumType>& mymin, std::shared_ptr<AccumType>& mymax,
186 const DataIterator& dataBegin, const WeightsIterator& weightBegin,
187 uInt64 nr, uInt dataStride, const MaskIterator& maskBegin,
188 uInt maskStride
189 ) const;
190
191 // <group>
192 // Sometimes we want the min, max, and npts all in one scan.
193 virtual void _minMaxNpts(
194 uInt64& npts, std::shared_ptr<AccumType>& mymin,
195 std::shared_ptr<AccumType>& mymax, const DataIterator& dataBegin,
196 uInt64 nr, uInt dataStride
197 ) const;
198
199 virtual void _minMaxNpts(
200 uInt64& npts, std::shared_ptr<AccumType>& mymin,
201 std::shared_ptr<AccumType>& mymax, const DataIterator& dataBegin, uInt64 nr,
202 uInt dataStride, const DataRanges& ranges, Bool isInclude
203 ) const;
204
205 virtual void _minMaxNpts(
206 uInt64& npts, std::shared_ptr<AccumType>& mymin,
207 std::shared_ptr<AccumType>& mymax, const DataIterator& dataBegin, uInt64 nr,
208 uInt dataStride, const MaskIterator& maskBegin, uInt maskStride
209 ) const;
210
211 virtual void _minMaxNpts(
212 uInt64& npts, std::shared_ptr<AccumType>& mymin,
213 std::shared_ptr<AccumType>& mymax, const DataIterator& dataBegin, uInt64 nr,
214 uInt dataStride, const MaskIterator& maskBegin, uInt maskStride,
215 const DataRanges& ranges, Bool isInclude
216 ) const;
217
218 virtual void _minMaxNpts(
219 uInt64& npts, std::shared_ptr<AccumType>& mymin,
220 std::shared_ptr<AccumType>& mymax, const DataIterator& dataBegin,
221 const WeightsIterator& weightsBegin, uInt64 nr, uInt dataStride
222 ) const;
223
224 virtual void _minMaxNpts(
225 uInt64& npts, std::shared_ptr<AccumType>& mymin,
226 std::shared_ptr<AccumType>& mymax, const DataIterator& dataBegin,
227 const WeightsIterator& weightsBegin, uInt64 nr, uInt dataStride,
228 const DataRanges& ranges, Bool isInclude
229 ) const;
230
231 virtual void _minMaxNpts(
232 uInt64& npts, std::shared_ptr<AccumType>& mymin,
233 std::shared_ptr<AccumType>& mymax, const DataIterator& dataBegin,
234 const WeightsIterator& weightsBegin, uInt64 nr, uInt dataStride,
235 const MaskIterator& maskBegin, uInt maskStride,
236 const DataRanges& ranges, Bool isInclude
237 ) const;
238
239 virtual void _minMaxNpts(
240 uInt64& npts, std::shared_ptr<AccumType>& mymin,
241 std::shared_ptr<AccumType>& mymax, const DataIterator& dataBegin,
242 const WeightsIterator& weightBegin, uInt64 nr, uInt dataStride,
243 const MaskIterator& maskBegin, uInt maskStride
244 ) const;
245 // </group>
246
247 // <group>
248 // no weights, no mask, no ranges
249 virtual void _unweightedStats(
250 StatsData<AccumType>& stats, uInt64& ngood, LocationType& location,
251 const DataIterator& dataBegin, uInt64 nr, uInt dataStride
252 );
253
254 // no weights, no mask
255 virtual void _unweightedStats(
256 StatsData<AccumType>& stats, uInt64& ngood, LocationType& location,
257 const DataIterator& dataBegin, uInt64 nr, uInt dataStride,
258 const DataRanges& ranges, Bool isInclude
259 );
260
261 virtual void _unweightedStats(
262 StatsData<AccumType>& stats, uInt64& ngood, LocationType& location,
263 const DataIterator& dataBegin, uInt64 nr, uInt dataStride,
264 const MaskIterator& maskBegin, uInt maskStride
265 );
266
267 virtual void _unweightedStats(
268 StatsData<AccumType>& stats, uInt64& ngood, LocationType& location,
269 const DataIterator& dataBegin, uInt64 nr, uInt dataStride,
270 const MaskIterator& maskBegin, uInt maskStride,
271 const DataRanges& ranges, Bool isInclude
272 );
273 // </group>
274
275 // <group>
276 // has weights, but no mask, no ranges
277 virtual void _weightedStats(
278 StatsData<AccumType>& stats, LocationType& location,
279 const DataIterator& dataBegin, const WeightsIterator& weightsBegin,
280 uInt64 nr, uInt dataStride
281 );
282
283 virtual void _weightedStats(
284 StatsData<AccumType>& stats, LocationType& location,
285 const DataIterator& dataBegin, const WeightsIterator& weightsBegin,
286 uInt64 nr, uInt dataStride, const DataRanges& ranges, Bool isInclude
287 );
288
289 virtual void _weightedStats(
290 StatsData<AccumType>& stats, LocationType& location,
291 const DataIterator& dataBegin, const WeightsIterator& weightBegin,
292 uInt64 nr, uInt dataStride, const MaskIterator& maskBegin,
293 uInt maskStride
294 );
295
296 virtual void _weightedStats(
297 StatsData<AccumType>& stats, LocationType& location,
298 const DataIterator& dataBegin, const WeightsIterator& weightBegin,
299 uInt64 nr, uInt dataStride, const MaskIterator& maskBegin,
300 uInt maskStride, const DataRanges& ranges, Bool isInclude
301 );
302 // </group>
303
304private:
305
306 // _f defined in inclusion range between Q1 - _f*D and Q3 + _f*D, where
307 // D = Q3 - Q1 and Q1 and Q3 are the first and third quartiles, respectively
310
311 void _setRange();
312
313};
314
315}
316
317#ifndef CASACORE_NO_AUTO_TEMPLATES
318#include <casacore/scimath/StatsFramework/HingesFencesStatistics.tcc>
319#endif //# CASACORE_NO_AUTO_TEMPLATES
320
321#endif
#define DataRanges
Abstract base class for statistics algorithms which are characterized by a range of good values.
Class to calculate statistics using the so-called hinges and fences algorithm.
HingesFencesStatistics< CASA_STATP > & operator=(const HingesFencesStatistics< CASA_STATP > &other)
copy semantics
void _setRange()
derived classes need to implement how to set their respective range
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
this file contains all the compiler specific defines
Definition mainpage.dox:28
const Bool False
Definition aipstype.h:42
unsigned int uInt
Definition aipstype.h:49
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
std::pair< Int64, Int64 > LocationType