Skip to content
Snippets Groups Projects
probtrackxOptions.h 10.77 KiB
/*  probtrackxOptions.h

    Tim Behrens, FMRIB Image Analysis Group

    Copyright (C) 2004 University of Oxford  */

/*  CCOPYRIGHT  */

#if !defined(probtrackxOptions_h)
#define probtrackxOptions_h

#include <string> 
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <stdio.h>
#include "utils/options.h"
#include "utils/log.h"
#include "commonopts.h"

//#include "newmatall.h"
using namespace Utilities;

namespace TRACT {

class probtrackxOptions {
 public:
  static probtrackxOptions& getInstance();
  ~probtrackxOptions() { delete gopt; }
  
  Option<int> verbose;
  Option<bool> help;
  Option<string> basename;
  Option<string> maskfile;
  Option<string> seedfile; 
  Option<string> mode;
  Option<string> targetfile;
  Option<bool> simpleout;
  Option<bool> pathdist;
  Option<bool> s2tout;
  FmribOption<bool> matrix1out;
  FmribOption<bool> matrix2out;
  FmribOption<bool> matrix3out;
  FmribOption<string> maskmatrix3;
  FmribOption<bool> maskmatrixout;
  Option<string> outfile;
  Option<string> rubbishfile;
  Option<string> stopfile;
  FmribOption<string> prefdirfile;
  Option<string> seeds_to_dti;
  Option<string> dti_to_seeds;
  FmribOption<string> skipmask;
  Option<string> seedref;
  Option<string> mask2;
  Option<string> waypoints;
  Option<bool> network;
  Option<string> meshfile;
  FmribOption<string> meshspace;
  FmribOption<string> lrmask;
  Option<string> logdir; 
  Option<bool> forcedir;
  Option<int> nparticles;
  Option<int> nsteps;
  Option<float> distthresh;
  FmribOption<float> distthresh3;
  Option<float> c_thr;
  Option<float> fibthresh;
  Option<bool> sampvox;
  Option<float> steplength;
  Option<bool> loopcheck;
  Option<bool> usef;
  Option<int> randfib;
  Option<int> fibst;
  Option<bool> modeuler;
  Option<int> rseed;
  Option<bool> seedcountastext;
  FmribOption<bool> splitmatrix2;


  void parse_command_line(int argc, char** argv,Log& logger);
  void modecheck();
  void modehelp();
  void matrixmodehelp();
  void status();
 private:
  probtrackxOptions();  
  const probtrackxOptions& operator=(probtrackxOptions&);
  probtrackxOptions(probtrackxOptions&);

  OptionParser options; 
      
  static probtrackxOptions* gopt;
  
};


 inline probtrackxOptions& probtrackxOptions::getInstance(){
   if(gopt == NULL)
     gopt = new probtrackxOptions();
   
   return *gopt;
 }

 inline probtrackxOptions::probtrackxOptions() :
  verbose(string("-V,--verbose"), 0, 
	  string("Verbose level, [0-2]"), 
	  false, requires_argument),
   help(string("-h,--help"), false,
	string("Display this message"),
	false, no_argument),
   basename(string("-s,--samples"), string("merged"),
	       string("Basename for samples files"),
	       true, requires_argument),  
   maskfile(string("-m,--mask"), string("mask"),
	    string("Bet binary mask file in diffusion space"),
	    true, requires_argument),
   seedfile(string("-x,--seed"), string("Seed"),
	    string("Seed volume, or voxel, or ascii file with multiple volumes, or freesurfer label file"),
	    true, requires_argument),
   mode(string("--mode"), string(""),
	string("\tUse --mode=simple for single seed voxel"),
	    false, requires_argument),
  targetfile(string("--targetmasks"), string("cmasks"),
	    string("File containing a list of target masks - required for seeds_to_targets classification"),
	    false, requires_argument),
  simpleout(string("--opd"), false,
	    string("\tOutput path distribution"),
	    false, no_argument), 
  pathdist(string("--pd"), false,
	   string("\tCorrect path distribution for the length of the pathways"),
	   false, no_argument), 
  s2tout(string("--os2t"), false,
	 string("\tOutput seeds to targets"),
	 false, no_argument),
  matrix1out(string("--omatrix1"), false,
	  string("Output matrix1"),
	  false, no_argument), 
  matrix2out(string("--omatrix2"), false,
	  string("Output matrix2"),
	  false, no_argument), 
  matrix3out(string("--omatrix3"), false,
	  string("Output matrix3 (NxN connectivity matrix)"),
	  false, no_argument), 
  maskmatrix3(string("--mask3"), "",
	  string("Mask used for NxN connectivity matrix"),
	  false, requires_argument), 
  maskmatrixout(string("--omaskmatrix"), false,
		string("Output maskmatrix"),
		false, no_argument), 
   outfile(string("-o,--out"), string("fdt_paths"),
	   string("Output file (default='fdt_paths')"),
	   false, requires_argument),
   rubbishfile(string("--avoid"), string(""),
	       string("\tReject pathways passing through locations given by this mask"),
	       false, requires_argument),
   stopfile(string("--stop"), string(""),
	       string("\tStop tracking at locations given by this mask file"),
	       false, requires_argument),
   prefdirfile(string("--prefdir"), string(""),
	       string("Prefered orientation preset in a 4D mask"),
	       false, requires_argument),
   seeds_to_dti(string("--xfm"), string(""),
		string("\tTransform taking seed space to DTI space (either FLIRT matrix or FNIRT warpfield) - default is identity"),
		false, requires_argument),
   dti_to_seeds(string("--invxfm"), string(""),
		string("Transform taking DTI space to seed space (compulsory when using a warpfield for seeds_to_dti)"),
		false, requires_argument),
   skipmask(string("--no_integrity"), string(""),
	   string("no explanation needed"),
	   false, requires_argument),
  seedref(string("--seedref"), string(""),
	 string("Reference vol to define seed space in simple mode - diffusion space assumed if absent"),
	 false, requires_argument),
  mask2(string("--mask2"), string(""),
	 string("\tSecond mask in twomask_symm mode."),
       false, requires_argument),
 waypoints(string("--waypoints"), string(""),
	 string("Waypoint mask or ascii list of waypoint masks - only keep paths going through ALL the masks"),
       false, requires_argument),
 network(string("--network"), false,
	 string("Activate network mode - only keep paths going through at least one seed mask (required if multiple seed masks)"),
       false, no_argument),
   meshfile(string("--mesh"), string(""),
	 string("\tFreesurfer-type surface descriptor (in ascii format)"),
       false, requires_argument),
   meshspace(string("--meshspace"), string("freesurfer"),
	 string("Mesh reference space - either 'freesurfer' (default) or 'caret' or 'first'"),
       false, requires_argument),
  lrmask(string("--lrmask"), string(""),
	 string("Low resolution binary brain mask for storing connectivity distribution in matrix2 mode"),
       false, requires_argument),
  logdir(string("--dir"), string("logdir"),
	    string("\tDirectory to put the final volumes in - code makes this directory - default='logdir'"),
	    false, requires_argument),
  forcedir(string("--forcedir"), false,
	 string("Use the actual directory name given - i.e. don't add + to make a new directory"),
	 false, no_argument),
  nparticles(string("-P,--nsamples"), 5000,
	 string("Number of samples - default=5000"),
	 false, requires_argument),
   nsteps(string("-S,--nsteps"), 2000,
	    string("Number of steps per sample - default=2000"),
	    false, requires_argument),
   distthresh(string("--distthresh"), 0,
	    string("Discards samples shorter than this threshold (in mm - default=0)"),
	    false, requires_argument),
   distthresh3(string("--distthresh3"), 0,
	    string("Discards samples (in matrix3) shorter than this threshold (in voxels - default=0)"),
	    false, requires_argument),
   c_thr(string("-c,--cthr"), 0.2, 
	 string("Curvature threshold - default=0.2"), 
	 false, requires_argument),
  fibthresh(string("--fibthresh"), 0.01, 
	    string("Volume fraction before subsidary fibre orientations are considered - default=0.01"), 
	 false, requires_argument),
  sampvox(string("--sampvox"), false, 
	    string("Sample random points within seed voxels"), 
	 false, no_argument),
   steplength(string("--steplength"), 0.5, 
	 string("Steplength in mm - default=0.5"), 
	 false, requires_argument),
   loopcheck(string("-l,--loopcheck"), false, 
	 string("Perform loopchecks on paths - slower, but allows lower curvature threshold"), 
	 false, no_argument),
   usef(string("-f,--usef"), false, 
	 string("Use anisotropy to constrain tracking"), 
	 false, no_argument),
  randfib(string("--randfib"), 0, 
	 string("Default 0. Set to 1 to randomly sample initial fibres (with f > fibthresh). \n                        Set to 2 to sample in proportion fibres (with f>fibthresh) to f. \n                        Set to 3 to sample ALL populations at random (even if f<fibthresh)"), 
	 false, requires_argument),
  fibst(string("--fibst"),1, 
	 string("\tForce a starting fibre for tracking - default=1, i.e. first fibre orientation. Only works if randfib==0"), 
	 false, requires_argument),
  modeuler(string("--modeuler"), false, 
	   string("Use modified euler streamlining"), 
	   false, no_argument),
  rseed(string("--rseed"), 12345,
	string("\tRandom seed"),
	false, requires_argument), 
  seedcountastext(string("--s2tastext"), false,
		  string("Output seed-to-target counts as a text file (useful when seeding from a mesh)"),
		  false, no_argument), 
  splitmatrix2(string("--splitmatrix2"), false,
		  string("Split matrix 2 along seed dimension (in case it is too large)"),
		  false, no_argument), 
   options("probtrackx","probtrackx -s <basename> -m <maskname> -x <seedfile> -o <output> --targetmasks=<textfile>\n probtrackx --help\n")
   {
     
    
     try {
       options.add(verbose);
       options.add(help);
       options.add(basename);
       options.add(maskfile);
       options.add(seedfile); 
       options.add(mode);
       options.add(targetfile);
       options.add(skipmask);
       options.add(mask2);
       options.add(waypoints);
       options.add(network);
       options.add(meshfile);
       options.add(meshspace);
       options.add(lrmask);
       options.add(seedref);
       options.add(logdir); 
       options.add(forcedir); 
       options.add(simpleout);
       options.add(pathdist);
       options.add(s2tout);
       options.add(matrix1out);
       options.add(matrix2out);
       options.add(matrix3out);
       options.add(maskmatrix3);
       options.add(maskmatrixout);
       options.add(outfile);
       options.add(rubbishfile);
       options.add(stopfile);
       options.add(prefdirfile);
       options.add(seeds_to_dti);
       options.add(dti_to_seeds);
       options.add(nparticles);
       options.add(nsteps);
       options.add(distthresh);
       options.add(distthresh3);
       options.add(c_thr);
       options.add(fibthresh);
       options.add(sampvox);
       options.add(steplength);
       options.add(loopcheck);
       options.add(usef);
       options.add(randfib);
       options.add(fibst);
       options.add(modeuler);
       options.add(rseed);
       options.add(seedcountastext);
       options.add(splitmatrix2);
     }
     catch(X_OptionError& e) {
       options.usage();
       cerr << endl << e.what() << endl;
     } 
     catch(std::exception &e) {
       cerr << e.what() << endl;
     }    
     
   }
}

#endif