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;
}