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

Matthew Webster's avatar
Matthew Webster committed
    Mark Woolrich, Matthew Webster and Emma Robinson, FMRIB Image Analysis Group
Christian Beckmann's avatar
Christian Beckmann committed

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

Matthew Webster's avatar
Matthew Webster committed
/*  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:
Mark Woolrich's avatar
Mark Woolrich committed
      Histogram(){};
      const Histogram& operator=(const Histogram& in){
	sourceData=in.sourceData; calcRange=in.calcRange; histMin=in.histMin; histMax=in.histMax; bins=in.bins; histogram=in.histogram; CDF=in.CDF; datapoints=in.datapoints; exclusion=in.exclusion;
Mark Woolrich's avatar
Mark Woolrich committed
	return *this;
      }

      Histogram(const Histogram& in){ *this=in;}
Christian Beckmann's avatar
Christian Beckmann committed
      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){}
      
Mark Woolrich's avatar
Mark Woolrich committed
      void set(const ColumnVector& psourceData, int numBins) {	
	sourceData=psourceData; calcRange=true; bins=numBins;
      }

      void set(const ColumnVector& psourceData, float phistMin, float phistMax, int numBins) {	
	sourceData=psourceData; calcRange=false; histMin=phistMin; histMax=phistMax; bins=numBins;
      }

Christian Beckmann's avatar
Christian Beckmann committed
      void generate();
      void generate(ColumnVector exclusion_values);
      ColumnVector generateCDF();

Christian Beckmann's avatar
Christian Beckmann committed
      float getHistMin() const {return histMin;}
      float getHistMax() const {return histMax;}
      void setHistMax(float phistMax) {histMax = phistMax;}
      void setHistMin(float phistMin) {histMin = phistMin;}
      void setexclusion(ColumnVector exclusion_values) {exclusion =exclusion_values;}
Mark Woolrich's avatar
Mark Woolrich committed
      void smooth();
Christian Beckmann's avatar
Christian Beckmann committed

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

      const ColumnVector& getData() {return histogram;}
Mark Woolrich's avatar
Mark Woolrich committed
      void setData(const ColumnVector& phist) { histogram=phist;}
Christian Beckmann's avatar
Christian Beckmann committed

      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;
    
      void match(Histogram &);
      
Christian Beckmann's avatar
Christian Beckmann committed
      float mode() const;

      int getBin(float value) const;
      float getValue(int bin) const;
Matthew Webster's avatar
Matthew Webster committed
      float getPercentile(float perc);

      inline int getNumBins() const {return bins;}
      inline ColumnVector getCDF() const {return CDF;}
      inline ColumnVector getsourceData()const {return sourceData;}
Christian Beckmann's avatar
Christian Beckmann committed
    protected:

    private:

Mark Woolrich's avatar
Mark Woolrich committed
      ColumnVector sourceData;
Christian Beckmann's avatar
Christian Beckmann committed
      ColumnVector histogram;
      ColumnVector exclusion;
      ColumnVector CDF;
Christian Beckmann's avatar
Christian Beckmann committed

      bool calcRange;

      float histMin;
      float histMax;

      int bins; // number of bins in histogram
      int datapoints;
Christian Beckmann's avatar
Christian Beckmann committed
    };

  inline int Histogram::getBin(float value) const
    {
Mark Woolrich's avatar
Mark Woolrich committed
      float binwidth=(histMax-histMin)/bins;
      return Max(1, Min((int)((((float)bins)*((float)(value-(histMin-binwidth))))/((float)(histMax-histMin))),bins));
Christian Beckmann's avatar
Christian Beckmann committed
    }
  
  inline float Histogram::getValue(int bin) const
    {
      return (bin*(histMax-histMin))/(float)bins + histMin;
    }

  inline ColumnVector Histogram::generateCDF() 
    { 
     
     
      CDF.ReSize(bins);
      
      
      CDF(1)=histogram(1)/datapoints;
  
      for (int i=2;i<=bins;i++)
	CDF(i)=CDF(i-1)+ histogram(i)/datapoints;

     
      return CDF;
    }