Skip to content
Snippets Groups Projects
ggmix.h 4.68 KiB
/*  MELODIC - Multivariate exploratory linear optimized decomposition into 
              independent components
    
    ggmix.h - class for Gaussian/Gamma Mixture Model

    Christian F. Beckmann, FMRIB Image Analysis Group
    
    Copyright (C) 1999-2008 University of Oxford */

/*  CCOPYRIGHT */

#ifndef __GGMIX_h
#define __GGMIX_h

#include "newimage/newimageall.h"
/*#include "utils/log.h"
#include "melodic.h"
#include "utils/options.h"
#include "meloptions.h"
*/

//using namespace Utilities;
using namespace NEWIMAGE;

namespace GGMIX{
  
  class ggmix
    {
    public:
    
      ggmix(){}
      //MelodicOptions &popts, Log &plogger):
      //	opts(popts),
      //	logger(plogger)
      //	{
      //	}

      ~ggmix() { 
	  }

      void save();

      void setup(const RowVector& dat, const string dirname,
		 int here, volume<float> themask, 
		 volume<float> themean, int num_mix = 3, 
		 float eps = 0.0, bool fixdim = false);
      
      void gmmfit();
      void ggmfit();

      inline void fit(string mtype = string("GGM"))
	{
	  mmtype = mtype;
	  if(mmtype==string("GGM")) 
	    this->ggmfit(); 
	  else 
	    this->gmmfit();

	  //re-insert mean and stdev

	  data = data*datastdev + datamean;
	  //threshmaps = threshmaps*datastdev + datamean;
	  means = means*datastdev + datamean;
	  vars = vars*datastdev*datastdev;
	}

      inline Matrix threshold(string levels)
	{return this->threshold(data, levels);}
      inline Matrix threshold(RowVector& levels) 
	{return this->threshold(data, levels);}
      Matrix threshold(const RowVector& dat, Matrix& levels);
      Matrix threshold(const RowVector& dat, string levels);

      void status(const string &txt);
 
      inline RowVector& get_means() {return means;}
      inline void set_means(RowVector& Arg) {means = Arg;}
    
      inline RowVector& get_vars() {return vars;}
      inline void set_vars(RowVector& Arg) {vars = Arg;}
      
      inline RowVector& get_pi() {return props;}
      inline void set_pi(RowVector& Arg) {props = Arg;}
      
      inline RowVector& get_data() {return data;}
      inline void set_data(RowVector& Arg) {data = Arg;}

      inline RowVector& get_prob() {return probmap;}

      inline float get_eps() {return epsilon;}
      inline void set_eps(float Arg) {epsilon = Arg;}

      inline Matrix& get_threshmaps() {return threshmaps;}
      inline void set_threshmaps(Matrix& Arg) {threshmaps = Arg;}

      inline bool isfitted(){return fitted;}

      inline int mixtures(){return nummix;}
     
      inline string get_type() { return mmtype;}
      inline void set_type(string Arg) { mmtype = Arg;}
      
      inline string get_prefix() { return prefix;}
      inline void  set_prefix(string Arg) { prefix = Arg;}

      inline RowVector get_probmap() {return probmap;}

      inline float get_offset() {return offset;}
      inline void set_offset(float Arg) {offset = Arg;}

      inline void flipres(int num){
	means = -means;
	data = -data;
	threshmaps = -threshmaps;
	if(mmtype=="GGM"){
	  float tmp;
	  tmp= means(2);means(2)=means(3);means(3)=tmp;
	  tmp=vars(2);vars(2)=vars(3);vars(3)=tmp;
	  tmp=props(2);props(2)=props(3);props(3)=tmp;
	}
      }      

      inline void add_infstr(string what){
	threshinfo.push_back(what);
      }

      inline string get_infstr(int num){
	if((threshinfo.size()<(unsigned int)(num-1))||(num<1))
	  return string("");
	else
	  return threshinfo[num-1];
      }

      inline int size_infstr(){
      return threshinfo.size();
      }

      inline void clear_infstr(){
	threshinfo.clear();
      }

      inline void smooth_probs(float howmuch){
	volume4D<float> tempVol;
	tempVol.setmatrix(probmap,Mask);
        tempVol[0]= smooth(tempVol[0],howmuch);
        probmap = tempVol.matrix(Mask);
      }



      double datamean;
      double datastdev;

    private:
      //    MelodicOptions &opts;     
      // Log &logger; //global log file

      //Log mainhtml;

      void gmmupdate();
      float gmmevidence();
      void gmmreducemm();
      void add_params(Matrix& mu, Matrix& sig, Matrix& pi, 
		      float logLH, float MDL, float Evi, bool advance = false);
      void get_params(int index, Matrix& mu, Matrix& sig, Matrix& pi, 
		      float logLH, float MDL, float Evi);

      Matrix Params;
      Matrix threshmaps;

      RowVector means;
      RowVector vars;
      RowVector props;
      RowVector data;
      RowVector probmap;

      volume<float> Mean;
      volume<float> Mask;

      float epsilon;
      float logprobY;
      float MDL;
      float Evi;
      float offset;

      int nummix;
      int numdata;
      int cnumber;

      bool fitted;
      bool fixdim;

      string prefix;
      string mmtype;
      string dirname;

      vector<string> threshinfo;

    };
}

#endif