Doxygen Source Code Documentation
3dFWHM.c File Reference
#include "mrilib.h"
Go to the source code of this file.
Data Structures | |
struct | input_options |
Defines | |
#define | PROGRAM_NAME "3dFWHM" |
#define | PROGRAM_AUTHOR "B. Douglas Ward" |
#define | PROGRAM_INITIAL "20 February 1997" |
#define | PROGRAM_LATEST "08 March 2004" |
#define | MAX_NAME_LENGTH THD_MAX_NAME |
#define | DOPEN(ds, name) |
#define | SUB_POINTER(ds, vv, ind, ptr) |
#define | DISP_SIG_RESULTS(c, val) |
Typedefs | |
typedef input_options | input_options |
Functions | |
void | display_help_menu () |
void | FWHM_error (char *message) |
void | get_dimensions (input_options *option_data) |
void | read_afni_data (input_options *option_data, char *filename, float *ffim) |
void | initialize_options (input_options *option_data) |
void | get_options (int argc, char **argv, input_options *option_data) |
void | check_for_valid_inputs (input_options *option_data) |
void | initialize (int argc, char **argv, input_options **option_data, float **fim, float **fmask) |
void | estimate_gfw (input_options *option_data, float *fim, float *fmask, float *sx, float *sy, float *sz) |
void | output_results (input_options *option_data, float sx, float sy, float sz) |
void | terminate (input_options **option_data, float **fim, float **fmask) |
int | main (int argc, char **argv) |
Define Documentation
|
Value: do { if ( val >= 0.0 ) \ fprintf (fout, "sigma%c = %5.2f FWHM%c = %5.2f \n", \ c, val, c, val * 2.0*sqrt(2.0*log(2.0))); \ else \ fprintf (fout, "sigma%c = NO_VALUE FWHM%c = NO_VALUE\n",c,c); \ } while (0) Definition at line 516 of file 3dFWHM.c. Referenced by output_results(). |
|
Value: do{ int pv ; (ds) = THD_open_dataset((name)) ; \ if( !ISVALID_3DIM_DATASET((ds)) ){ \ fprintf(stderr,"*** Can't open dataset: %s\n",(name)) ; exit(1) ; } \ if( (ds)->daxes->nxx!=nx || (ds)->daxes->nyy!=ny || (ds)->daxes->nzz!=nz ){ \ fprintf(stderr,"*** Axes mismatch: %s\n",(name)) ; exit(1) ; } \ if( DSET_NUM_TIMES((ds)) > 1 ){ \ fprintf(stderr,"*** Can't use time-dependent data: %s\n",(name));exit(1); } \ THD_load_datablock( (ds)->dblk ) ; \ pv = DSET_PRINCIPAL_VALUE((ds)) ; \ if( DSET_ARRAY((ds),pv) == NULL ){ \ fprintf(stderr,"*** Can't access data: %s\n",(name)) ; exit(1); } \ if( DSET_BRICK_TYPE((ds),pv) == MRI_complex ){ \ fprintf(stderr,"*** Can't use complex data: %s\n",(name)) ; exit(1); } \ break ; } while (0) |
|
Definition at line 43 of file 3dFWHM.c. Referenced by get_options(), and output_results(). |
|
Definition at line 35 of file 3dFWHM.c. Referenced by main(). |
|
Definition at line 36 of file 3dFWHM.c. Referenced by main(). |
|
Definition at line 37 of file 3dFWHM.c. Referenced by main(). |
|
Definition at line 34 of file 3dFWHM.c. Referenced by FWHM_error(), get_options(), and main(). |
|
Value: do{ switch( DSET_BRICK_TYPE((ds),(vv)) ){ \ default: fprintf(stderr,"\n*** Illegal datum! ***\n");exit(1); \ case MRI_short:{ short * fim = (short *) DSET_ARRAY((ds),(vv)) ; \ (ptr) = (void *)( fim + (ind) ) ; \ } break ; \ case MRI_byte:{ byte * fim = (byte *) DSET_ARRAY((ds),(vv)) ; \ (ptr) = (void *)( fim + (ind) ) ; \ } break ; \ case MRI_float:{ float * fim = (float *) DSET_ARRAY((ds),(vv)) ; \ (ptr) = (void *)( fim + (ind) ) ; \ } break ; } break ; } while(0) |
Typedef Documentation
|
|
Function Documentation
|
Definition at line 307 of file 3dFWHM.c.
00308 { 00309 } |
|
Definition at line 110 of file 3dFWHM.c. References MASTER_SHORTHELP_STRING.
00111 { 00112 printf 00113 ( 00114 "This program estimates the Filter Width Half Maximum (FWHM). \n\n" 00115 "Usage: \n" 00116 "3dFWHM \n" 00117 "-dset file file = name of input AFNI 3d dataset \n" 00118 "[-mask mname] mname = filename of 3d mask dataset \n" 00119 "[-quiet] suppress screen output \n" 00120 "[-out file] file = name of output file \n" 00121 ); 00122 00123 printf("\n" MASTER_SHORTHELP_STRING ) ; 00124 00125 exit(0); 00126 } |
|
Definition at line 366 of file 3dFWHM.c. References arg, input_options::dx, input_options::dy, input_options::dz, fim, fsq, IJK_TO_THREE, input_options::nx, input_options::nxyz, input_options::ny, input_options::nz, nz, putchar, input_options::quiet, THREE_TO_IJK, and var.
00368 { 00369 int nx; /* number of voxels along x-axis */ 00370 int ny; /* number of voxels along y-axis */ 00371 int nz; /* number of voxels along z-axis */ 00372 int nxy, nxyz; /* total number of voxels */ 00373 int ixyz; /* voxel index */ 00374 float dx; /* voxel size along x-axis */ 00375 float dy; /* voxel size along y-axis */ 00376 float dz; /* voxel size along z-axis */ 00377 int ix, jy, kz, ixyz2; 00378 float fsum, fsq, var; 00379 float dfdx, dfdxsum, dfdxsq, varxx; 00380 float dfdy, dfdysum, dfdysq, varyy; 00381 float dfdz, dfdzsum, dfdzsq, varzz; 00382 int count, countx, county, countz; 00383 float arg; 00384 00385 00386 /*----- initialize local variables -----*/ 00387 nx = option_data->nx; 00388 ny = option_data->ny; 00389 nz = option_data->nz; 00390 dx = option_data->dx; 00391 dy = option_data->dy; 00392 dz = option_data->dz; 00393 nxyz = option_data->nxyz; 00394 nxy = nx * ny; 00395 00396 00397 /*----- estimate the variance of the data -----*/ 00398 fsum = 0.0; 00399 fsq = 0.0; 00400 count = 0; 00401 for (ixyz = 0; ixyz < nxyz; ixyz++) 00402 { 00403 if (fmask != NULL) 00404 if (fmask[ixyz] == 0.0) continue; 00405 00406 count++; 00407 fsum += fim[ixyz]; 00408 fsq += fim[ixyz] * fim[ixyz]; 00409 } 00410 var = (fsq - (fsum * fsum)/count) / (count-1); 00411 00412 00413 /*----- estimate the partial derivatives -----*/ 00414 dfdxsum = 0.0; dfdysum = 0.0; dfdzsum = 0.0; 00415 dfdxsq = 0.0; dfdysq = 0.0; dfdzsq = 0.0; 00416 countx = 0; county = 0; countz = 0; 00417 for (ixyz = 0; ixyz < nxyz; ixyz++) 00418 { 00419 if (fmask != NULL) 00420 if (fmask[ixyz] == 0.0) continue; 00421 00422 IJK_TO_THREE (ixyz, ix, jy, kz, nx, nxy); 00423 00424 if (ix+1 < nx) 00425 { 00426 ixyz2 = THREE_TO_IJK (ix+1, jy, kz, nx, nxy); 00427 dfdx = (fim[ixyz2] - fim[ixyz]) / 1.0; 00428 dfdxsum += dfdx; 00429 dfdxsq += dfdx * dfdx; 00430 countx += 1; 00431 } 00432 00433 if (jy+1 < ny) 00434 { 00435 ixyz2 = THREE_TO_IJK (ix, jy+1, kz, nx, nxy); 00436 dfdy = (fim[ixyz2] - fim[ixyz]) / 1.0; 00437 dfdysum += dfdy; 00438 dfdysq += dfdy * dfdy; 00439 county += 1; 00440 } 00441 00442 if (kz+1 < nz) 00443 { 00444 ixyz2 = THREE_TO_IJK (ix, jy, kz+1, nx, nxy); 00445 dfdz = (fim[ixyz2] - fim[ixyz]) / 1.0; 00446 dfdzsum += dfdz; 00447 dfdzsq += dfdz * dfdz; 00448 countz += 1; 00449 } 00450 00451 } 00452 00453 /*----- estimate the variance of the partial derivatives -----*/ 00454 if (countx < 2) 00455 varxx = 0.0; 00456 else 00457 varxx = (dfdxsq - (dfdxsum * dfdxsum)/countx) / (countx-1); 00458 00459 if (county < 2) 00460 varyy = 0.0; 00461 else 00462 varyy = (dfdysq - (dfdysum * dfdysum)/county) / (county-1); 00463 00464 if (countz < 2) 00465 varzz = 0.0; 00466 else 00467 varzz = (dfdzsq - (dfdzsum * dfdzsum)/countz) / (countz-1); 00468 00469 /*----- now estimate the equivalent Gaussian filter width -----*/ 00470 if ( var == 0.0 ) 00471 { 00472 *sx = *sy = *sz = 0.0; /* do not compute 08 Mar 2004 [rickr] */ 00473 } 00474 else 00475 { 00476 arg = 1.0 - 0.5*(varxx/var); 00477 if ( (arg <= 0.0) || (varxx == 0.0) ) 00478 *sx = -1.0; /* flag value */ 00479 else 00480 *sx = sqrt( -1.0 / (4.0*log(arg)) ) * dx; 00481 00482 arg = 1.0 - 0.5*(varyy/var); 00483 if ( (arg <= 0.0) || (varyy == 0.0) ) 00484 *sy = -1.0; /* flag value */ 00485 else 00486 *sy = sqrt( -1.0 / (4.0*log(arg)) ) * dy; 00487 00488 arg = 1.0 - 0.5*(varzz/var); 00489 if ( (arg <= 0.0) || (varzz == 0.0) ) 00490 *sz = -1.0; /* flag value */ 00491 else 00492 *sz = sqrt( -1.0 / (4.0*log(arg)) ) * dz; 00493 } 00494 00495 if (!(option_data->quiet)) 00496 { 00497 printf ("count=%d \n", count); 00498 printf ("var =%f \n", var); 00499 printf ("varxx=%f varyy=%f varzz=%f \n", varxx, varyy, varzz); 00500 00501 /* check flags instead... 08 March 2004 [rickr] 00502 * printf (" sx=%f sy=%f sz=%f \n", *sx, *sy, *sz); 00503 */ 00504 00505 if ( *sx >= 0 ) printf(" sx=%f ", *sx); 00506 else printf(" sx=NO_VALUE "); 00507 if ( *sy >= 0 ) printf(" sy=%f ", *sy); 00508 else printf(" sy=NO_VALUE "); 00509 if ( *sz >= 0 ) printf(" sz=%f ", *sz); 00510 else printf(" sz=NO_VALUE "); 00511 putchar('\n'); 00512 } 00513 } |
|
Definition at line 133 of file 3dFWHM.c. References PROGRAM_NAME. Referenced by get_options(), initialize(), and output_results().
00134 { 00135 fprintf (stderr, "%s Error: %s \n", PROGRAM_NAME, message); 00136 exit(1); 00137 } |
|
Definition at line 145 of file 3dFWHM.c. References THD_3dim_dataset::daxes, input_options::dx, input_options::dy, input_options::dz, input_options::infilename, ISVALID_3DIM_DATASET, input_options::nx, THD_dataxes::nxx, input_options::nxyz, input_options::ny, THD_dataxes::nyy, input_options::nz, THD_dataxes::nzz, THD_delete_3dim_dataset(), THD_open_dataset(), THD_dataxes::xxdel, THD_dataxes::yydel, and THD_dataxes::zzdel.
00146 { 00147 00148 THD_3dim_dataset * dset=NULL; 00149 00150 /*----- read first dataset to get dimensions, etc. -----*/ 00151 00152 dset = THD_open_dataset( option_data->infilename) ; 00153 if( ! ISVALID_3DIM_DATASET(dset) ){ 00154 fprintf(stderr,"*** Unable to open dataset file %s\n", 00155 option_data->infilename); 00156 exit(1) ; 00157 } 00158 00159 /*----- voxel dimensions and data set dimensions -----*/ 00160 option_data->dx = fabs(dset->daxes->xxdel) ; 00161 option_data->dy = fabs(dset->daxes->yydel) ; 00162 option_data->dz = fabs(dset->daxes->zzdel) ; 00163 option_data->nx = dset->daxes->nxx ; 00164 option_data->ny = dset->daxes->nyy ; 00165 option_data->nz = dset->daxes->nzz ; 00166 option_data->nxyz = option_data->nx * option_data->ny * option_data->nz ; 00167 00168 THD_delete_3dim_dataset( dset , False ) ; dset = NULL ; 00169 00170 } |
|
Definition at line 226 of file 3dFWHM.c. References AFNI_logger(), argc, display_help_menu(), FWHM_error(), input_options::infilename, initialize_options(), malloc, input_options::maskfilename, MAX_NAME_LENGTH, input_options::outfilename, PROGRAM_NAME, and input_options::quiet.
00227 { 00228 int nopt = 1; /* input option argument counter */ 00229 int ival; /* integer input */ 00230 float fval; /* float input */ 00231 char message[MAX_NAME_LENGTH]; /* error message */ 00232 00233 00234 /*----- does user request help menu? -----*/ 00235 if (argc < 2 || strncmp(argv[1], "-help", 5) == 0) display_help_menu(); 00236 00237 00238 /*----- add to program log -----*/ 00239 AFNI_logger (PROGRAM_NAME,argc,argv); 00240 00241 00242 /*----- initialize the input options -----*/ 00243 initialize_options (option_data); 00244 00245 00246 /*----- main loop over input options -----*/ 00247 while (nopt < argc ) 00248 { 00249 00250 /*----- -dset filename -----*/ 00251 if (strncmp(argv[nopt], "-dset", 5) == 0) 00252 { 00253 nopt++; 00254 if (nopt >= argc) FWHM_error ("need argument after -dset "); 00255 option_data->infilename = malloc (sizeof(char) * MAX_NAME_LENGTH); 00256 strcpy (option_data->infilename, argv[nopt]); 00257 nopt++; 00258 continue; 00259 } 00260 00261 00262 /*----- -mask filename -----*/ 00263 if (strncmp(argv[nopt], "-mask", 5) == 0) 00264 { 00265 nopt++; 00266 if (nopt >= argc) FWHM_error ("need argument after -mask "); 00267 option_data->maskfilename = malloc (sizeof(char) * MAX_NAME_LENGTH); 00268 strcpy (option_data->maskfilename, argv[nopt]); 00269 nopt++; 00270 continue; 00271 } 00272 00273 00274 /*----- -quiet q -----*/ 00275 if (strncmp(argv[nopt], "-quiet", 6) == 0) 00276 { 00277 option_data->quiet = 1; 00278 nopt++; 00279 continue; 00280 } 00281 00282 00283 /*----- -out filename -----*/ 00284 if (strncmp(argv[nopt], "-out", 4) == 0) 00285 { 00286 nopt++; 00287 if (nopt >= argc) FWHM_error ("need argument after -out "); 00288 option_data->outfilename = malloc (sizeof(char) * MAX_NAME_LENGTH); 00289 strcpy (option_data->outfilename, argv[nopt]); 00290 nopt++; 00291 continue; 00292 } 00293 00294 00295 /*----- unknown command -----*/ 00296 FWHM_error ("unrecognized command line option "); 00297 } 00298 00299 } |
|
Definition at line 318 of file 3dFWHM.c. References argc, check_for_valid_inputs(), fim, FWHM_error(), get_dimensions(), get_options(), input_options::infilename, malloc, input_options::maskfilename, and read_afni_data().
00320 { 00321 00322 00323 /*----- allocate memory space for input options -----*/ 00324 *option_data = (input_options *) malloc(sizeof(input_options)); 00325 if (*option_data == NULL) 00326 FWHM_error ("memory allocation error"); 00327 00328 /*----- get command line inputs -----*/ 00329 get_options(argc, argv, *option_data); 00330 00331 /*----- check for valid inputs -----*/ 00332 check_for_valid_inputs (*option_data); 00333 00334 /*----- get data set dimensions -----*/ 00335 get_dimensions (*option_data); 00336 00337 /*----- allocate memory space for image data -----*/ 00338 *fim = (float *) malloc( (*option_data)->nxyz * sizeof(float) ); 00339 if (*fim == NULL) 00340 FWHM_error ("memory allocation error"); 00341 00342 /*----- read input data set -----*/ 00343 read_afni_data (*option_data, (*option_data)->infilename, *fim); 00344 00345 00346 /*----- check for mask file -----*/ 00347 if ((*option_data)->maskfilename != NULL) 00348 { 00349 /*----- allocate memory space for mask data -----*/ 00350 *fmask = (float *) malloc( (*option_data)->nxyz * sizeof(float) ); 00351 if (*fmask == NULL) FWHM_error ("memory allocation error"); 00352 00353 /*----- read mask data set -----*/ 00354 read_afni_data (*option_data, (*option_data)->maskfilename, *fmask); 00355 00356 } 00357 00358 } |
|
Definition at line 212 of file 3dFWHM.c. References input_options::infilename, input_options::maskfilename, input_options::outfilename, and input_options::quiet.
00213 { 00214 option_data->infilename = NULL; /* name of input file */ 00215 option_data->maskfilename = NULL; /* name of mask file */ 00216 option_data->quiet = 0; /* generate screen output (default) */ 00217 option_data->outfilename = NULL; /* name of output file */ 00218 } |
|
Definition at line 608 of file 3dFWHM.c. References argc, estimate_gfw(), fim, initialize(), output_results(), PROGRAM_AUTHOR, PROGRAM_INITIAL, PROGRAM_LATEST, PROGRAM_NAME, and terminate().
00609 { 00610 input_options * option_data = NULL; 00611 float * fim = NULL; 00612 float * fmask = NULL; 00613 float sx, sy, sz; 00614 00615 00616 /*----- Identify software -----*/ 00617 printf ("\n\n"); 00618 printf ("Program: %s \n", PROGRAM_NAME); 00619 printf ("Author: %s \n", PROGRAM_AUTHOR); 00620 printf ("Initial Release: %s \n", PROGRAM_INITIAL); 00621 printf ("Latest Revision: %s \n", PROGRAM_LATEST); 00622 printf ("\n"); 00623 00624 00625 /*----- program initialization -----*/ 00626 initialize (argc, argv, &option_data, &fim, &fmask); 00627 00628 00629 /*----- estimate equivalent gaussian filter width -----*/ 00630 estimate_gfw (option_data, fim, fmask, &sx, &sy, &sz ); 00631 00632 00633 /*----- generate requested output -----*/ 00634 output_results (option_data, sx, sy, sz); 00635 00636 /*----- terminate program -----*/ 00637 terminate (&option_data, &fim, &fmask); 00638 00639 exit(0); 00640 } |
|
Definition at line 530 of file 3dFWHM.c. References DISP_SIG_RESULTS, fout, FWHM_error(), MAX_NAME_LENGTH, and input_options::outfilename.
00531 { 00532 char message[MAX_NAME_LENGTH]; /* error message */ 00533 char filename[MAX_NAME_LENGTH]; /* output file name */ 00534 FILE * fout; 00535 00536 00537 /*----- if output file has not been specified, use stdout -----*/ 00538 if (option_data->outfilename == NULL) 00539 fout = stdout; 00540 else 00541 { 00542 /*----- see if output file already exists -----*/ 00543 strcpy (filename, option_data->outfilename); 00544 fout = fopen (filename, "r"); 00545 if (fout != NULL) 00546 { 00547 sprintf (message, "file %s already exists. ", filename); 00548 FWHM_error (message); 00549 } 00550 00551 /*----- open file for output -----*/ 00552 fout = fopen (filename, "w"); 00553 if (fout == NULL) 00554 { 00555 FWHM_error ("unable to write file "); 00556 } 00557 } 00558 00559 /*----- print out the results -----*/ 00560 fprintf (fout, "\n\n"); 00561 fprintf (fout, "Gaussian filter widths: \n"); 00562 00563 #if 0 00564 fprintf (fout, "sigmax = %5.2f FWHMx = %5.2f \n", 00565 sx, sx * 2.0*sqrt(2.0*log(2.0))); 00566 fprintf (fout, "sigmay = %5.2f FWHMy = %5.2f \n", 00567 sy, sy * 2.0*sqrt(2.0*log(2.0))); 00568 fprintf (fout, "sigmaz = %5.2f FWHMz = %5.2f \n\n", 00569 sz, sz * 2.0*sqrt(2.0*log(2.0))); 00570 #endif 00571 00572 /* check for flag value of -1.0 08 Mar 2004 [rickr] */ 00573 DISP_SIG_RESULTS('x', sx); 00574 DISP_SIG_RESULTS('y', sy); 00575 DISP_SIG_RESULTS('z', sz); 00576 00577 /* report any failures */ 00578 if ( sx < 0.0 || sy < 0.0 || sz < 0.0 ) 00579 fprintf(stderr, 00580 "\n" 00581 "** failure: some filter widths were not able to be estimated with\n" 00582 " this tool, such results were reported as 'NO_VALUE'\n"); 00583 00584 fclose(fout); 00585 00586 } |
|
Definition at line 179 of file 3dFWHM.c. References DOPEN, DSET_BRICK_FACTOR, DSET_BRICK_TYPE, DSET_PRINCIPAL_VALUE, EDIT_coerce_scale_type(), input_options::nx, input_options::nxyz, input_options::ny, input_options::nz, nz, SUB_POINTER, and THD_delete_3dim_dataset().
00181 { 00182 int iv; /* index number of intensity sub-brick */ 00183 THD_3dim_dataset * dset=NULL; /* data set pointer */ 00184 void * vfim = NULL; /* image data pointer */ 00185 int nx, ny, nz, nxyz; /* data set dimensions in voxels */ 00186 00187 nx = option_data->nx; 00188 ny = option_data->ny; 00189 nz = option_data->nz; 00190 nxyz = option_data->nxyz; 00191 00192 00193 /*----- read in the data -----*/ 00194 DOPEN(dset,filename) ; 00195 iv = DSET_PRINCIPAL_VALUE(dset) ; 00196 00197 /*----- convert it to floats (in ffim) -----*/ 00198 SUB_POINTER(dset,iv,0,vfim) ; 00199 EDIT_coerce_scale_type( nxyz , DSET_BRICK_FACTOR(dset,iv) , 00200 DSET_BRICK_TYPE(dset,iv),vfim , /* input */ 00201 MRI_float ,ffim ) ; /* output */ 00202 00203 THD_delete_3dim_dataset( dset , False ) ; dset = NULL ; 00204 } |
|
Definition at line 594 of file 3dFWHM.c.
|