/*****************************************************************************
Major portions of this software are copyrighted by the Medical College
of Wisconsin, 1994-2000, and are released under the Gnu General Public
License, Version 2. See the file README.Copyright for details.
******************************************************************************/
/*---------------------------------------------------------------------------*/
/*
Program to estimate the PDF for a dataset.
File: 3destpdf.c
Author: B. Douglas Ward
Date: 20 January 2000
*/
/*---------------------------------------------------------------------------*/
#define PROGRAM_NAME "3destpdf" /* name of this program */
#define PROGRAM_AUTHOR "B. D. Ward" /* program author */
#define PROGRAM_DATE "20 January 2000" /* date of last program mod */
/*---------------------------------------------------------------------------*/
/*
Include header files.
*/
#include "mrilib.h"
/*---------------------------------------------------------------------------*/
/*
Global variables and constants.
*/
static char * anat_filename = NULL; /* file name for input anat dataset */
static THD_3dim_dataset * anat; /* input anatomical dataset */
static float min_val_float; /* minimum voxel intensity limit */
static float max_val_float; /* maximum voxel intensity limit */
static Boolean quiet = FALSE; /* flag for suppress screen output */
#define MAX_STRING_LENGTH 80
/*---------------------------------------------------------------------------*/
/*
Print error message and stop.
*/
void estPDF_error (char * message)
{
fprintf (stderr, "\n");
fprintf (stderr, "%s Error: %s \n", PROGRAM_NAME, message);
exit(1);
}
/*---------------------------------------------------------------------------*/
/** macro to test a malloc-ed pointer for validity **/
#define MTEST(ptr) \
if((ptr)==NULL) \
( estPDF_error ("Cannot allocate memory") )
/*---------------------------------------------------------------------------*/
/*
Include source code.
*/
#include "estpdf3.c" /* code for PDF estimation */
/*---------------------------------------------------------------------------*/
/*
Routine to display 3destpdf help menu.
*/
void display_help_menu()
{
printf
(
"This program estimates the PDF for a dataset.\n\n"
"Usage: \n"
"3destpdf \n"
"-anat filename Filename of anat dataset to be segmented \n"
);
exit(0);
}
/*---------------------------------------------------------------------------*/
/*
Routine to get user specified input options.
*/
void get_options
(
int argc, /* number of input arguments */
char ** argv /* array of input arguments */
)
{
int nopt = 1; /* input option argument counter */
int ival, index; /* integer input */
float fval; /* float input */
char message[MAX_STRING_LENGTH]; /* error message */
/*----- does user request help menu? -----*/
if (argc < 2 || strncmp(argv[1], "-help", 5) == 0) display_help_menu();
/*----- main loop over input options -----*/
while (nopt < argc )
{
/*----- -anat filename -----*/
if (strncmp(argv[nopt], "-anat", 5) == 0)
{
nopt++;
if (nopt >= argc) estPDF_error ("need argument after -anat ");
anat_filename = malloc (sizeof(char) * MAX_STRING_LENGTH);
MTEST (anat_filename);
strcpy (anat_filename, argv[nopt]);
anat = THD_open_one_dataset (anat_filename);
if (!ISVALID_3DIM_DATASET (anat))
{
sprintf (message, "Can't open dataset: %s\n", anat_filename);
estPDF_error (message);
}
DSET_load(anat); CHECK_LOAD_ERROR(anat);
nopt++;
continue;
}
/*----- unknown command -----*/
sprintf(message,"Unrecognized command line option: %s\n", argv[nopt]);
estPDF_error (message);
}
}
/*---------------------------------------------------------------------------*/
/*
Program initialization.
*/
void initialize_program
(
int argc, /* number of input arguments */
char ** argv /* array of input arguments */
)
{
float parameters [DIMENSION]; /* parameters for PDF estimation */
Boolean ok = TRUE; /* flag for successful PDF estimation */
int nx, ny, nz, nxy, nxyz, ixyz; /* voxel counters */
int n; /* histogram bin index */
short * sfim = NULL; /* pointer to anat data */
short * rfim = NULL; /* truncated data */
int icount;
int lower_cutoff = 25;
/*----- Get operator inputs -----*/
get_options (argc, argv);
/*----- Initialize local variables -----*/
if (anat == NULL) estPDF_error ("Unable to read anat dataset");
nx = DSET_NX(anat); ny = DSET_NY(anat); nz = DSET_NZ(anat);
nxy = nx*ny; nxyz = nxy*nz;
sfim = (short *) DSET_BRICK_ARRAY(anat,0) ;
if (sfim == NULL) estPDF_error ("Unable to read anat dataset");
rfim = (short *) malloc (sizeof(short) * nxyz); MTEST (rfim);
/*----- Just use voxels whose intensity is above the lower cutoff -----*/
icount = 0;
for (ixyz = 0; ixyz < nxyz; ixyz++)
if (sfim[ixyz] > lower_cutoff)
{
rfim[icount] = sfim[ixyz];
icount++;
}
printf ("%d voxels above lower cutoff = %d \n", icount, lower_cutoff);
/*----- Get PDF estimate and set voxel intensity limits -----*/
estpdf_short (icount, rfim, parameters);
min_val_float = parameters[4] - 2.0*parameters[5];
max_val_float = parameters[7] + 2.0*parameters[8];
if (! quiet)
{
printf ("\n");
printf ("Control inputs: \n");
printf ("anat filename = %s \n", anat_filename);
printf ("min value = %f \n", min_val_float);
printf ("max value = %f \n", max_val_float);
}
}
/*---------------------------------------------------------------------------*/
/*
This is the main routine for program 3destpdf.
*/
int main
(
int argc, /* number of input arguments */
char ** argv /* array of input arguments */
)
{
/*----- Identify software -----*/
#if 0
printf ("\n\n");
printf ("Program: %s \n", PROGRAM_NAME);
printf ("Author: %s \n", PROGRAM_AUTHOR);
printf ("Date: %s \n", PROGRAM_DATE);
printf ("\n");
#endif
PRINT_VERSION("3destpdf") ; AUTHOR(PROGRAM_AUTHOR) ;mainENTRY("3destpdf main") ; machdep() ;
/*----- Program initialization -----*/
initialize_program (argc, argv);
}
/*---------------------------------------------------------------------------*/
syntax highlighted by Code2HTML, v. 0.9.1