casacore
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: aips2-request@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
78 };
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(
143 const DataIterator& dataBegin, uInt64 nr, uInt dataStride
144 ) const;
145
146 virtual void _minMax(
148 const DataIterator& dataBegin, uInt64 nr, uInt dataStride,
149 const DataRanges& ranges, Bool isInclude
150 ) const;
151
152 virtual void _minMax(
154 const DataIterator& dataBegin, uInt64 nr, uInt dataStride,
155 const MaskIterator& maskBegin, uInt maskStride
156 ) const;
157
158 virtual void _minMax(
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(
167 const DataIterator& dataBegin, const WeightsIterator& weightsBegin,
168 uInt64 nr, uInt dataStride
169 ) const;
170
171 virtual void _minMax(
173 const DataIterator& dataBegin, const WeightsIterator& weightsBegin,
174 uInt64 nr, uInt dataStride, const DataRanges& ranges, Bool isInclude
175 ) const;
176
177 virtual void _minMax(
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(
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, CountedPtr<AccumType>& mymin,
195 CountedPtr<AccumType>& mymax, const DataIterator& dataBegin,
196 uInt64 nr, uInt dataStride
197 ) const;
198
199 virtual void _minMaxNpts(
200 uInt64& npts, CountedPtr<AccumType>& mymin,
201 CountedPtr<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, CountedPtr<AccumType>& mymin,
207 CountedPtr<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, CountedPtr<AccumType>& mymin,
213 CountedPtr<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, CountedPtr<AccumType>& mymin,
220 CountedPtr<AccumType>& mymax, const DataIterator& dataBegin,
221 const WeightsIterator& weightsBegin, uInt64 nr, uInt dataStride
222 ) const;
223
224 virtual void _minMaxNpts(
225 uInt64& npts, CountedPtr<AccumType>& mymin,
226 CountedPtr<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, CountedPtr<AccumType>& mymin,
233 CountedPtr<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, CountedPtr<AccumType>& mymin,
241 CountedPtr<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 _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 _minMaxNpts(uInt64 &npts, CountedPtr< AccumType > &mymin, CountedPtr< AccumType > &mymax, const DataIterator &dataBegin, const WeightsIterator &weightBegin, uInt64 nr, uInt dataStride, const MaskIterator &maskBegin, uInt maskStride) const
virtual void _minMaxNpts(uInt64 &npts, CountedPtr< AccumType > &mymin, CountedPtr< 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 &weightsBegin, uInt64 nr, uInt dataStride, const DataRanges &ranges, Bool isInclude)
virtual void _minMaxNpts(uInt64 &npts, CountedPtr< AccumType > &mymin, CountedPtr< 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 _minMax(CountedPtr< AccumType > &mymin, CountedPtr< AccumType > &mymax, const DataIterator &dataBegin, const WeightsIterator &weightsBegin, uInt64 nr, uInt dataStride) const
virtual void _minMaxNpts(uInt64 &npts, CountedPtr< AccumType > &mymin, CountedPtr< AccumType > &mymax, const DataIterator &dataBegin, uInt64 nr, uInt dataStride, const MaskIterator &maskBegin, uInt maskStride) 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 _minMax(CountedPtr< AccumType > &mymin, CountedPtr< AccumType > &mymax, const DataIterator &dataBegin, uInt64 nr, uInt dataStride, const MaskIterator &maskBegin, uInt maskStride) const
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 _weightedStats(StatsData< AccumType > &stats, LocationType &location, const DataIterator &dataBegin, const WeightsIterator &weightBegin, uInt64 nr, uInt dataStride, const MaskIterator &maskBegin, uInt maskStride)
virtual void _minMaxNpts(uInt64 &npts, CountedPtr< AccumType > &mymin, CountedPtr< AccumType > &mymax, const DataIterator &dataBegin, const WeightsIterator &weightsBegin, uInt64 nr, uInt dataStride) 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 _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 _minMax(CountedPtr< AccumType > &mymin, CountedPtr< AccumType > &mymax, const DataIterator &dataBegin, const WeightsIterator &weightBegin, uInt64 nr, uInt dataStride, const MaskIterator &maskBegin, uInt maskStride) const
virtual void _minMaxNpts(uInt64 &npts, CountedPtr< AccumType > &mymin, CountedPtr< AccumType > &mymax, const DataIterator &dataBegin, 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(CountedPtr< AccumType > &mymin, CountedPtr< 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 _minMax(CountedPtr< AccumType > &mymin, CountedPtr< 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(CountedPtr< AccumType > &mymin, CountedPtr< AccumType > &mymax, const DataIterator &dataBegin, const WeightsIterator &weightsBegin, uInt64 nr, uInt dataStride, const DataRanges &ranges, Bool isInclude) const
virtual void _minMax(CountedPtr< AccumType > &mymin, CountedPtr< AccumType > &mymax, const DataIterator &dataBegin, uInt64 nr, uInt dataStride, const MaskIterator &maskBegin, uInt maskStride, const DataRanges &ranges, Bool isInclude) 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...
virtual void _minMaxNpts(uInt64 &npts, CountedPtr< AccumType > &mymin, CountedPtr< AccumType > &mymax, const DataIterator &dataBegin, const WeightsIterator &weightsBegin, uInt64 nr, uInt dataStride, const DataRanges &ranges, Bool isInclude) const
virtual void _minMaxNpts(uInt64 &npts, CountedPtr< AccumType > &mymin, CountedPtr< AccumType > &mymax, const DataIterator &dataBegin, const WeightsIterator &weightsBegin, uInt64 nr, uInt dataStride, const MaskIterator &maskBegin, uInt maskStride, const DataRanges &ranges, Bool isInclude) const
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 _minMax(CountedPtr< AccumType > &mymin, CountedPtr< AccumType > &mymax, const DataIterator &dataBegin, uInt64 nr, uInt dataStride) const
virtual void _accumNpts(uInt64 &npts, const DataIterator &dataStart, 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 DataRanges &ranges, Bool isInclude) const
virtual void reset()
reset object to initial state.
ALGORITHM
implemented algorithms
const Double c
Fundamental physical constants (SI units):
this file contains all the compiler specific defines
Definition: mainpage.dox:28
const Bool False
Definition: aipstype.h:44
unsigned int uInt
Definition: aipstype.h:51
bool Bool
Define the standard types used by Casacore.
Definition: aipstype.h:42
double Double
Definition: aipstype.h:55
unsigned long long uInt64
Definition: aipsxtype.h:39
std::pair< Int64, Int64 > LocationType