Example of lsst.afw.math.Statistics¶
Demonstrate the use of Statistics
; the code’s in afw/examples/statistics.cc.
Start by including needed headers and declaring namespace aliases
#include <iostream>
#include <cmath>
#include "lsst/geom.h"
#include "lsst/afw/image/Image.h"
#include "lsst/afw/image/MaskedImage.h"
#include "lsst/afw/math/Statistics.h"
using namespace std;
namespace image = lsst::afw::image;
namespace math = lsst::afw::math;
Create an lsst.afw.image.Image
typedef image::Image<float> ImageF;
int main() {
// First we'll try a regular image
ImageF img(lsst::geom::Extent2I(10, 40));
img = 100000.0;
Create a Statistics
object from that Image
, requesting the number of points, the mean, and the standard deviation.
{
math::Statistics stats = math::makeStatistics(img, math::NPOINT | math::MEAN | math::STDEV);
And print the desired quantities.
Note that we didn’t request that the error in the mean be calculated, so a NaN
is returned.
cout << "Npixel: " << stats.getValue(math::NPOINT) << endl;
cout << "Mean: " << stats.getValue(math::MEAN) << endl;
cout << "Error in mean: " << stats.getError(math::MEAN) << " (expect NaN)" << endl;
cout << "Standard Deviation: " << stats.getValue(math::STDEV) << endl << endl;
}
Here’s another way to do the same thing.
We use makeStatistics
(cf. std::make_pair()
) to avoid having to specify what sort of Statistics
we’re creating (and in C++0X you’ll be able to say
auto stats = math::makeStatistics(img, math::STDEV | math::MEAN | math::ERRORS);
which means that we never have to provide information that the compiler has up its sleeve — very convenient for generic template programming)
{
math::Statistics stats = math::makeStatistics(img, math::STDEV | math::MEAN | math::ERRORS);
Print the answers again, but this time return that value and its error as a c std::pair
std::pair<double, double> mean = stats.getResult(math::MEAN);
cout << "Mean: " << mean.first << " error in mean: " << mean.second << endl << endl;
}
Don’t ask for things that you didn’t request.
{
math::Statistics stats = math::makeStatistics(img, math::NPOINT);
try {
stats.getValue(math::MEAN);
} catch (lsst::pex::exceptions::InvalidParameterError &e) {
cout << "You didn't ask for the mean, so we caught an exception: " << e.what() << endl;
}
}
be tidy and return success (unnecessary; unlike C, C++ will return this 0 for you automatically)
return 0;
}