Skip to content
Snippets Groups Projects
histogram.h 2.01 KiB
Newer Older
Christian Beckmann's avatar
Christian Beckmann committed
/*  histogram.h

    Mark Woolrich, FMRIB Image Analysis Group

    Copyright (C) 1999-2000 University of Oxford  */

/*  CCOPYRIGHT  */

#if !defined(__histogram_h)
#define __histogram_h

#include <iostream>
#include <fstream>
Christian Beckmann's avatar
Christian Beckmann committed
#define WANT_STREAM
#define WANT_MATH

#include "newmatap.h"
#include "newmatio.h"
Christian Beckmann's avatar
Christian Beckmann committed
#include "miscmaths.h"

using namespace NEWMAT;

namespace MISCMATHS {
 
  class Histogram
    {
    public:
      Histogram(const ColumnVector& psourceData, int numBins)
	: sourceData(psourceData), calcRange(true), bins(numBins){}

      Histogram(const ColumnVector& psourceData, float phistMin, float phistMax, int numBins) 
	: sourceData(psourceData), calcRange(false), histMin(phistMin), histMax(phistMax), bins(numBins){}
      
      void generate();
      
      float getHistMin() const {return histMin;}
      float getHistMax() const {return histMax;}
      void setHistMax(float phistMax) {histMax = phistMax;}
      void setHistMin(float phistMin) {histMin = phistMin;}

      int integrateAll() {return sourceData.Nrows();}

      const ColumnVector& getData() {return histogram;}

      int integrateToInf(float value) const { return integrate(value, histMax); }
      int integrateFromInf(float value) const { return integrate(histMin, value); }
      int integrate(float value1, float value2) const;

      float mode() const;

      int getBin(float value) const;
      float getValue(int bin) const;

    protected:

    private:
      Histogram();
      const Histogram& operator=(Histogram&);
      Histogram(Histogram&);

      const ColumnVector& sourceData;
      ColumnVector histogram;

      bool calcRange;

      float histMin;
      float histMax;

      int bins; // number of bins in histogram
    };

  inline int Histogram::getBin(float value) const
    {
      return Max(1, Min((int)((((float)bins)*((float)(value-histMin)))/((float)(histMax-histMin))),bins));
    }
  
  inline float Histogram::getValue(int bin) const
    {
      return (bin*(histMax-histMin))/(float)bins + histMin;
    }

}

#endif