Doxygen Source Code Documentation
3dclust.c File Reference
#include <stdio.h>
#include <stdlib.h>
#include "mrilib.h"
Go to the source code of this file.
Defines | |
#define | PROGRAM_NAME "3dclust" |
#define | PROGRAM_AUTHOR "RW Cox et al" |
#define | PROGRAM_DATE "21 Jul 2005" |
#define | CL_syntax(str) do{ fprintf(stderr,"\n*** %s\a\n",str) ; exit(1) ; } while(0) |
#define | DUMP1 |
#define | DUMP2 |
#define | DUMP3 |
#define | BSTRIP for( il=6 ; il>1 && lbuf[il]=='0' ; il-- ) lbuf[il] = '\0' |
Functions | |
int | compare_cluster (void *, void *) |
void | CL_read_opts (int, char **) |
void | MCW_fc7 (float qval, char *buf) |
int | main (int argc, char *argv[]) |
void | CL_read_opts (int argc, char *argv[]) |
Variables | |
EDIT_options | CL_edopt |
int | CL_ivfim = -1 |
int | CL_ivthr = -1 |
int | CL_nopt |
int | CL_summarize = 0 |
int | CL_noabs = 0 |
int | CL_verbose = 0 |
int | CL_quiet = 0 |
char * | CL_prefix = NULL |
int | CL_do_mni = 0 |
int | CL_isomode = 0 |
THD_coorder | CL_cord |
Define Documentation
|
|
|
|
|
sort clusters by size, to make a nice report * |
|
|
|
|
|
Definition at line 15 of file 3dclust.c. Referenced by main(). |
|
Definition at line 16 of file 3dclust.c. Referenced by main(). |
|
Definition at line 14 of file 3dclust.c. Referenced by main(). |
Function Documentation
|
Definition at line 771 of file 3dclust.c. References argc, CL_do_mni, CL_isomode, CL_ivfim, CL_ivthr, CL_noabs, CL_nopt, CL_prefix, CL_quiet, CL_summarize, CL_verbose, EDIT_check_argv(), INIT_EDOPT, ISOMERGE_MODE, ISOVALUE_MODE, EDIT_options::iv_fim, EDIT_options::iv_thr, strtod(), THD_coorder_fill(), THD_filename_ok(), and EDIT_options::verbose. Referenced by main().
00772 { 00773 int nopt = 1 ; 00774 int ival ; 00775 00776 INIT_EDOPT( &CL_edopt ) ; 00777 00778 while( nopt < argc && argv[nopt][0] == '-' ){ 00779 00780 /**** check for editing options ****/ 00781 00782 ival = EDIT_check_argv( argc , argv , nopt , &CL_edopt ) ; 00783 if( ival > 0 ){ 00784 nopt += ival ; 00785 continue ; 00786 } 00787 00788 /**** 30 Apr 2002: -isovalue and -isomerge ****/ 00789 00790 if( strcmp(argv[nopt],"-isovalue") == 0 ){ 00791 CL_isomode = ISOVALUE_MODE ; 00792 nopt++ ; continue ; 00793 } 00794 00795 if( strcmp(argv[nopt],"-isomerge") == 0 ){ 00796 CL_isomode = ISOMERGE_MODE ; 00797 nopt++ ; continue ; 00798 } 00799 00800 /**** 30 Apr 2002: -mni ****/ 00801 00802 if( strcmp(argv[nopt],"-mni") == 0 ){ 00803 CL_do_mni = 1 ; 00804 nopt++ ; continue ; 00805 } 00806 00807 /**** 29 Nov 2001: -prefix ****/ 00808 00809 if( strcmp(argv[nopt],"-prefix") == 0 ){ 00810 if( ++nopt >= argc ){ 00811 fprintf(stderr,"need an argument after -prefix!\n") ; exit(1) ; 00812 } 00813 CL_prefix = argv[nopt] ; 00814 if( !THD_filename_ok(CL_prefix) ){ 00815 fprintf(stderr,"-prefix string is illegal: %s\n",CL_prefix); exit(1); 00816 } 00817 nopt++ ; continue ; 00818 } 00819 00820 /**** Sep 16 1999: -1tindex and -1dindex ****/ 00821 00822 if( strncmp(argv[nopt],"-1dindex",5) == 0 ){ 00823 if( ++nopt >= argc ){ 00824 fprintf(stderr,"need an argument after -1dindex!\n") ; exit(1) ; 00825 } 00826 CL_ivfim = CL_edopt.iv_fim = (int) strtod( argv[nopt++] , NULL ) ; 00827 continue ; 00828 } 00829 00830 if( strncmp(argv[nopt],"-1tindex",5) == 0 ){ 00831 if( ++nopt >= argc ){ 00832 fprintf(stderr,"need an argument after -1tindex!\n") ; exit(1) ; 00833 } 00834 CL_ivthr = CL_edopt.iv_thr = (int) strtod( argv[nopt++] , NULL ) ; 00835 continue ; 00836 } 00837 00838 /**** -summarize ****/ 00839 00840 if( strncmp(argv[nopt],"-summarize",5) == 0 ){ 00841 CL_summarize = 1 ; 00842 nopt++ ; continue ; 00843 } 00844 00845 /**** -nosum [05 Jul 2001] ****/ 00846 00847 if( strncmp(argv[nopt],"-nosum",6) == 0 ){ 00848 CL_summarize = -1 ; 00849 nopt++ ; continue ; 00850 } 00851 00852 /**** -verbose ****/ 00853 00854 if( strncmp(argv[nopt],"-verbose",5) == 0 ){ 00855 CL_verbose = CL_edopt.verbose = 1 ; 00856 nopt++ ; continue ; 00857 } 00858 00859 /**** -quiet ****/ 00860 00861 if( strncmp(argv[nopt],"-quiet",5) == 0 ){ 00862 CL_quiet = 1 ; 00863 nopt++ ; continue ; 00864 } 00865 00866 /**** -orient code ****/ 00867 00868 if( strncmp(argv[nopt],"-orient",5) == 0 ){ 00869 THD_coorder_fill( argv[++nopt] , &CL_cord ) ; /* July 1997 */ 00870 nopt++ ; continue ; 00871 } 00872 00873 /**** -noabs ****/ /* BDW 19 Jan 1999 */ 00874 00875 if( strncmp(argv[nopt],"-noabs",6) == 0 ){ 00876 CL_noabs = 1 ; 00877 nopt++ ; continue ; 00878 } 00879 00880 /**** unknown switch ****/ 00881 00882 fprintf(stderr,"** Unrecognized option %s\a\n",argv[nopt]) ; 00883 exit(1) ; 00884 00885 } /* end of loop over options */ 00886 00887 #ifdef CLDEBUG 00888 printf("** Finished with options\n") ; 00889 #endif 00890 00891 CL_nopt = nopt ; 00892 return ; 00893 } |
|
|
|
|
|
compute the overall minimum and maximum voxel values for a dataset Definition at line 100 of file 3dclust.c. References ADDTO_CLARR, ADN_none, ADN_prefix, AFNI_GOOD_FUNC_DTYPE, AFNI_logger(), argc, calloc, CL_do_mni, CL_isomode, CL_ivfim, CL_nopt, CL_prefix, CL_quiet, CL_read_opts(), CL_summarize, MCW_cluster_array::clar, EDIT_options::clust_rmm, DATABLOCK_MEM_MALLOC, THD_3dim_dataset::daxes, THD_3dim_dataset::dblk, DESTROY_CLARR, DSET_ARRAY, DSET_BRICK_FACTOR, DSET_BRICK_TYPE, DSET_BRIKNAME, DSET_load, DSET_NUM_TIMES, DSET_NVALS, DSET_PRINCIPAL_VALUE, DSET_write, EDIT_dset_items(), EDIT_one_dataset(), EDIT_options::fake_dxyz, free, complex::i, MCW_cluster::i, IJK_TO_THREE, INIT_CLARR, EDIT_options::iv_fim, EDIT_options::iv_thr, MCW_cluster::j, MCW_cluster::k, THD_3dim_dataset::label1, machdep(), MCW_cluster::mag, mainENTRY, MCW_fc7(), mmm, my_getenv(), NIH_find_clusters(), MCW_cluster_array::num_clu, MCW_cluster::num_pt, THD_dataxes::nxx, THD_dataxes::nyy, nz, THD_dataxes::nzz, PRINT_VERSION, PROGRAM_AUTHOR, PROGRAM_DATE, PROGRAM_NAME, PURGE_DSET, complex::r, THD_3dim_dataset::self_name, SORT_CLARR, strtod(), TEMP_IVEC3, THD_3dind_to_3dmm(), THD_3dmm_to_dicomm(), THD_3tta_to_3mni(), THD_coorder_fill(), THD_delete_3dim_dataset(), THD_dicom_to_coorder(), THD_force_malloc_type(), THD_load_datablock(), THD_open_dataset(), tross_Make_History(), VIEW_TALAIRACH_TYPE, THD_3dim_dataset::view_type, THD_dataxes::xxdel, xxmax, THD_coorder::xxor, THD_fvec3::xyz, THD_dataxes::yydel, yymax, THD_coorder::yyor, THD_dataxes::zzdel, zzmax, and THD_coorder::zzor.
00101 { 00102 float rmm , vmul ; 00103 int iarg ; 00104 THD_3dim_dataset *dset=NULL ; 00105 void * vfim ; 00106 int nx,ny,nz , nxy,nxyz , ivfim , 00107 iclu , ptmin , ipt , ii,jj,kk , ndet , nopt ; 00108 float dx,dy,dz , xx,yy,zz,mm , xxsum,yysum,zzsum,mmsum , volsum , fimfac , 00109 xxmax,yymax,zzmax,mmmax , ms, mssum , msmax , 00110 RLmax, RLmin, APmax, APmin, ISmax, ISmin; 00111 double mean, sem, sqsum, glmmsum, glsqsum, glmssum, glmean, glxxsum, glyysum, glzzsum; 00112 MCW_cluster_array * clar , * clbig ; 00113 MCW_cluster * cl ; 00114 THD_fvec3 fv ; 00115 int nvox_total ; 00116 float vol_total ; 00117 char buf1[16],buf2[16],buf3[16] ; 00118 float dxf,dyf,dzf ; /* 24 Jan 2001: for -dxyz=1 option */ 00119 int do_mni ; /* 30 Apr 2002 */ 00120 00121 if( argc < 4 || strncmp(argv[1],"-help",4) == 0 ){ 00122 printf ("\n\n"); 00123 printf ("Program: %s \n", PROGRAM_NAME); 00124 printf ("Author: %s \n", PROGRAM_AUTHOR); 00125 printf ("Date: %s \n", PROGRAM_DATE); 00126 printf ("\n"); 00127 printf( 00128 "3dclust - performs simple-minded cluster detection in 3D datasets \n" 00129 " \n" 00130 " This program can be used to find clusters of 'active' voxels and \n" 00131 " print out a report about them. \n" 00132 " * 'Active' refers to nonzero voxels that survive the threshold \n" 00133 " that you (the user) have specified \n" 00134 " * Clusters are defined by a connectivity radius parameter 'rmm' \n" 00135 " \n" 00136 " Note: by default, this program clusters on the absolute values \n" 00137 " of the voxels \n" 00138 "----------------------------------------------------------------------- \n" 00139 "Usage: 3dclust [editing options] [other options] rmm vmul dset ... \n" 00140 "----- \n" 00141 " \n" 00142 "Examples: \n" 00143 "-------- \n" 00144 " \n" 00145 " 3dclust -1clip 0.3 5 2000 func+orig'[1]' \n" 00146 " 3dclust -1noneg -1thresh 0.3 5 2000 func+orig'[1]' \n" 00147 " 3dclust -1noneg -1thresh 0.3 5 2000 func+orig'[1]' func+orig'[3] \n" 00148 " \n" 00149 " 3dclust -noabs -1clip 0.5 -dxyz=1 1 10 func+orig'[1]' \n" 00150 " 3dclust -noabs -1clip 0.5 5 700 func+orig'[1]' \n" 00151 " \n" 00152 " 3dclust -noabs -2clip 0 999 -dxyz=1 1 10 func+orig'[1]' \n" 00153 " \n" 00154 " 3dclust -1clip 0.3 5 3000 func+orig'[1]' \n" 00155 " 3dclust -quiet -1clip 0.3 5 3000 func+orig'[1]' \n" 00156 " 3dclust -summarize -quiet -1clip 0.3 5 3000 func+orig'[1]' \n" 00157 "----------------------------------------------------------------------- \n" 00158 " \n" 00159 "Arguments (must be included on command line): \n" 00160 "--------- \n" 00161 " \n" 00162 " rmm : cluster connection radius (in millimeters). \n" 00163 " All nonzero voxels closer than rmm millimeters \n" 00164 " (center-to-center distance) to the given voxel are \n" 00165 " included in the cluster. \n" 00166 " * If rmm = 0, then clusters are defined by nearest-\n" 00167 " neighbor connectivity \n" 00168 " \n" 00169 " vmul : minimum cluster volume (micro-liters) \n" 00170 " i.e., determines the size of the volume cluster. \n" 00171 " * If vmul = 0, then all clusters are kept. \n" 00172 " * If vmul < 0, then the absolute vmul is the minimum\n" 00173 " number of voxels allowed in a cluster. \n" 00174 " \n" 00175 " dset : input dataset (more than one allowed, but only the \n" 00176 " first sub-brick of the dataset) \n" 00177 " \n" 00178 " The results are sent to standard output (i.e., the screen) \n" 00179 " \n" 00180 "----------------------------------------------------------------------- \n" 00181 " \n" 00182 "Options: \n" 00183 "------- \n" 00184 " \n" 00185 "* Editing options are as in 3dmerge (see 3dmerge -help) \n" 00186 " (including -1thresh, -1dindex, -1tindex, -dxyz=1 options) \n" 00187 " \n" 00188 "* -noabs => Use the signed voxel intensities (not the absolute \n" 00189 " value) for calculation of the mean and Standard \n" 00190 " Error of the Mean (SEM) \n" 00191 " \n" 00192 "* -summarize => Write out only the total nonzero voxel \n" 00193 " count and volume for each dataset \n" 00194 " \n" 00195 "* -nosum => Suppress printout of the totals \n" 00196 " \n" 00197 "* -verb => Print out a progress report (to stderr) \n" 00198 " as the computations proceed \n" 00199 " \n" 00200 "* -quiet => Suppress all non-essential output \n" 00201 " \n" 00202 "* -mni => If the input dataset is in +tlrc coordinates, this \n" 00203 " option will stretch the output xyz-coordinates to the \n" 00204 " MNI template brain. \n" 00205 " \n" 00206 " N.B.1: The MNI template brain is about 5 mm higher (in S), \n" 00207 " 10 mm lower (in I), 5 mm longer (in PA), and tilted \n" 00208 " about 3 degrees backwards, relative to the Talairach- \n" 00209 " Tournoux Atlas brain. For more details, see \n" 00210 " http://www.mrc-cbu.cam.ac.uk/Imaging/mnispace.html \n" 00211 " N.B.2: If the input dataset is not in +tlrc coordinates, \n" 00212 " then the only effect is to flip the output coordinates\n" 00213 " to the 'LPI' (neuroscience) orientation, as if you \n" 00214 " gave the '-orient LPI' option.) \n" 00215 " \n" 00216 "* -isovalue => Clusters will be formed only from contiguous (in the \n" 00217 " rmm sense) voxels that also have the same value. \n" 00218 " \n" 00219 " N.B.: The normal method is to cluster all contiguous \n" 00220 " nonzero voxels together. \n" 00221 " \n" 00222 "* -isomerge => Clusters will be formed from each distinct value \n" 00223 " in the dataset; spatial contiguity will not be \n" 00224 " used (but you still have to supply rmm and vmul \n" 00225 " on the command line). \n" 00226 " \n" 00227 " N.B.: 'Clusters' formed this way may well have components \n" 00228 " that are widely separated! \n" 00229 " \n" 00230 "* -prefix ppp => Write a new dataset that is a copy of the \n" 00231 " input, but with all voxels not in a cluster \n" 00232 " set to zero; the new dataset's prefix is 'ppp' \n" 00233 " \n" 00234 " N.B.: Use of the -prefix option only affects the \n" 00235 " first input dataset \n" 00236 "----------------------------------------------------------------------- \n" 00237 " \n" 00238 "E.g., 3dclust -1clip 0.3 5 3000 func+orig'[1]' \n" 00239 " \n" 00240 " The above command tells 3dclust to find potential cluster volumes for \n" 00241 " dataset func+orig, sub-brick #1, where the threshold has been set \n" 00242 " to 0.3 (i.e., ignore voxels with an activation threshold of >0.3 or \n" 00243 " <-0.3. Voxels must be no more than 5 mm apart, and the cluster volume\n" 00244 " must be at least 3000 micro-liters in size. \n" 00245 " \n" 00246 "Explanation of 3dclust Output: \n" 00247 "----------------------------- \n" 00248 " \n" 00249 " Volume : Number of voxels that make up the volume cluster \n" 00250 " \n" 00251 " CM RL : Center of mass (CM) for the cluster in the Right-Left \n" 00252 " direction (i.e., the coordinates for the CM) \n" 00253 " \n" 00254 " CM AP : Center of mass for the cluster in the \n" 00255 " Anterior-Posterior direction \n" 00256 " \n" 00257 " CM IS : Center of mass for the cluster in the \n" 00258 " Inferior-Superior direction \n" 00259 " \n" 00260 " minRL, maxRL : Bounding box for the cluster, min and max \n" 00261 " coordinates in the Right-Left direction \n" 00262 " \n" 00263 " minAP, maxAP : Min and max coordinates in the Anterior-Posterior \n" 00264 " direction of the volume cluster \n" 00265 " \n" 00266 " minIS, max IS: Min and max coordinates in the Inferior-Superior \n" 00267 " direction of the volume cluster \n" 00268 " \n" 00269 " Mean : Mean value for the volume cluster \n" 00270 " \n" 00271 " SEM : Standard Error of the Mean for the volume cluster \n" 00272 " \n" 00273 " Max Int : Maximum Intensity value for the volume cluster \n" 00274 " \n" 00275 " MI RL : Maximum Intensity value in the Right-Left \n" 00276 " direction of the volume cluster \n" 00277 " \n" 00278 " MI AP : Maximum Intensity value in the Anterior-Posterior \n" 00279 " direction of the volume cluster \n" 00280 " \n" 00281 " MI IS : Maximum Intensity value in the Inferior-Superior \n" 00282 " direction of the volume cluster \n" 00283 "----------------------------------------------------------------------- \n" 00284 " \n" 00285 "Nota Bene: \n" 00286 " \n" 00287 " * The program does not work on complex- or rgb-valued datasets! \n" 00288 " \n" 00289 " * Using the -1noneg option is strongly recommended! \n" 00290 " \n" 00291 " * 3D+time datasets are allowed, but only if you use the \n" 00292 " -1tindex and -1dindex options. \n" 00293 " \n" 00294 " * Bucket datasets are allowed, but you will almost certainly \n" 00295 " want to use the -1tindex and -1dindex options with these. \n" 00296 " \n" 00297 " * SEM values are not realistic for interpolated data sets! \n" 00298 " A ROUGH correction is to multiply the SEM of the interpolated \n" 00299 " data set by the square root of the number of interpolated \n" 00300 " voxels per original voxel. \n" 00301 " \n" 00302 " * If you use -dxyz=1, then rmm should be given in terms of \n" 00303 " voxel edges (not mm) and vmul should be given in terms of \n" 00304 " voxel counts (not microliters). Thus, to connect to only \n" 00305 " 3D nearest neighbors and keep clusters of 10 voxels or more, \n" 00306 " use something like '3dclust -dxyz=1 1.01 10 dset+orig'. \n" 00307 " In the report, 'Volume' will be voxel count, but the rest of \n" 00308 " the coordinate dependent information will be in actual xyz \n" 00309 " millimeters. \n" 00310 " \n" 00311 " * The default coordinate output order is DICOM. If you prefer \n" 00312 " the SPM coordinate order, use the option '-orient LPI' or \n" 00313 " set the environment variable AFNI_ORIENT to 'LPI'. For more \n" 00314 " information, see file README.environment. \n" 00315 ) ; 00316 exit(0) ; 00317 } 00318 00319 mainENTRY("3dclust main"); machdep(); AFNI_logger("3dclust",argc,argv); 00320 PRINT_VERSION("3dclust") ; 00321 00322 THD_coorder_fill( my_getenv("AFNI_ORIENT") , &CL_cord ) ; /* July 1997 */ 00323 CL_read_opts( argc , argv ) ; 00324 nopt = CL_nopt ; 00325 00326 if( CL_do_mni ) 00327 THD_coorder_fill( "LPI" , &CL_cord ) ; /* 30 Apr 2002 */ 00328 00329 /*----- Identify software -----*/ 00330 if( !CL_quiet ){ 00331 printf ("\n\n"); 00332 printf ("Program: %s \n", PROGRAM_NAME); 00333 printf ("Author: %s \n", PROGRAM_AUTHOR); 00334 printf ("Date: %s \n", PROGRAM_DATE); 00335 printf ("\n"); 00336 } 00337 00338 if( nopt+3 > argc ){ 00339 fprintf(stderr,"\n*** No rmm or vmul arguments?\a\n") ; 00340 exit(1) ; 00341 } 00342 00343 rmm = strtod( argv[nopt++] , NULL ) ; 00344 vmul = strtod( argv[nopt++] , NULL ) ; 00345 if( rmm < 0.0 ){ 00346 fprintf(stderr,"\n*** Illegal rmm=%f \a\n",rmm) ; 00347 exit(1) ; 00348 } 00349 00350 /* BDW 26 March 1999 */ 00351 00352 if( CL_edopt.clust_rmm >= 0.0 ){ /* 01 Nov 1999 */ 00353 fprintf(stderr,"** Warning: -1clust can't be used in 3dclust!\n") ; 00354 CL_edopt.clust_rmm = -1.0 ; 00355 } 00356 00357 /**-- loop over datasets --**/ 00358 00359 dset = NULL ; 00360 for( iarg=nopt ; iarg < argc ; iarg++ ){ 00361 if( dset != NULL ) THD_delete_3dim_dataset( dset , False ) ; /* flush old */ 00362 dset = THD_open_dataset( argv[iarg] ) ; /* open new */ 00363 if( dset == NULL ){ /* failed? */ 00364 fprintf(stderr,"** Warning: skipping dataset %s\n",argv[iarg]) ; 00365 continue ; 00366 } 00367 if( DSET_NUM_TIMES(dset) > 1 && 00368 ( CL_edopt.iv_fim < 0 || CL_edopt.iv_thr < 0 ) ){ /* no time */ 00369 00370 fprintf(stderr, /* dependence! */ 00371 "** Cannot use time-dependent dataset %s\n",argv[iarg]) ; 00372 continue ; 00373 } 00374 THD_force_malloc_type( dset->dblk , DATABLOCK_MEM_MALLOC ) ; /* don't mmap */ 00375 if( CL_verbose ) 00376 fprintf(stderr,"+++ Loading dataset %s\n",argv[iarg]) ; 00377 THD_load_datablock( dset->dblk ) ; /* read in */ 00378 EDIT_one_dataset( dset , &CL_edopt ) ; /* editing? */ 00379 00380 /* 30 Apr 2002: check if -mni should be used here */ 00381 00382 do_mni = (CL_do_mni && dset->view_type == VIEW_TALAIRACH_TYPE) ; 00383 00384 if( CL_ivfim < 0 ) 00385 ivfim = DSET_PRINCIPAL_VALUE(dset) ; /* useful data */ 00386 else 00387 ivfim = CL_ivfim ; /* 16 Sep 1999 */ 00388 00389 vfim = DSET_ARRAY(dset,ivfim) ; /* ptr to data */ 00390 fimfac = DSET_BRICK_FACTOR(dset,ivfim) ; /* scl factor */ 00391 if( vfim == NULL ){ 00392 fprintf(stderr,"** Cannot access data in dataset %s\a\n",argv[iarg]) ; 00393 continue ; 00394 } 00395 00396 if( !AFNI_GOOD_FUNC_DTYPE( DSET_BRICK_TYPE(dset,ivfim) ) || 00397 DSET_BRICK_TYPE(dset,ivfim) == MRI_rgb ){ 00398 00399 fprintf(stderr,"** Illegal datum type in dataset %s\a\n",argv[iarg]) ; 00400 continue ; 00401 } 00402 00403 nx = dset->daxes->nxx ; dx = fabs(dset->daxes->xxdel) ; 00404 ny = dset->daxes->nyy ; dy = fabs(dset->daxes->yydel) ; 00405 nz = dset->daxes->nzz ; dz = fabs(dset->daxes->zzdel) ; 00406 nxy = nx * ny ; nxyz = nxy * nz ; 00407 00408 if( CL_edopt.fake_dxyz ){ dxf = dyf = dzf = 1.0 ; } /* 24 Jan 2001 */ 00409 else { dxf = dx ; dyf = dy ; dzf = dz ; } 00410 00411 if( vmul >= 0.0 ) 00412 ptmin = (int) (vmul / (dxf*dyf*dzf) + 0.99) ; 00413 else 00414 ptmin = (int) fabs(vmul) ; /* 30 Apr 2002 */ 00415 00416 /*-- print report header --*/ 00417 if( !CL_quiet ){ 00418 00419 if( CL_summarize != 1 ){ 00420 printf( "\n" 00421 "Cluster report for file %s %s\n" 00422 #if 0 00423 "[3D Dataset Name: %s ]\n" 00424 "[ Short Label: %s ]\n" 00425 #endif 00426 "[Connectivity radius = %.2f mm Volume threshold = %.2f ]\n" 00427 "[Single voxel volume = %.1f (microliters) ]\n" 00428 "[Voxel datum type = %s ]\n" 00429 "[Voxel dimensions = %.3f mm X %.3f mm X %.3f mm ]\n", 00430 argv[iarg] , 00431 do_mni ? "[MNI coords]" : "" , /* 30 Apr 2002 */ 00432 #if 0 00433 dset->self_name , dset->label1 , 00434 #endif 00435 rmm , ptmin*dx*dy*dz , dx*dy*dz , 00436 MRI_TYPE_name[ DSET_BRICK_TYPE(dset,ivfim) ] , 00437 dx,dy,dz ); 00438 00439 if( CL_edopt.fake_dxyz ) /* 24 Jan 2001 */ 00440 printf("[Fake voxel dimen = %.3f mm X %.3f mm X %.3f mm ]\n", 00441 dxf,dyf,dzf) ; 00442 00443 if (CL_noabs) /* BDW 19 Jan 1999 */ 00444 printf ("Mean and SEM based on Signed voxel intensities: \n\n"); 00445 else 00446 printf ("Mean and SEM based on Absolute Value " 00447 "of voxel intensities: \n\n"); 00448 00449 printf ( 00450 "Volume CM %s CM %s CM %s min%s max%s min%s max%s min%s max%s Mean SEM Max Int MI %s MI %s MI %s\n" 00451 "------ ----- ----- ----- ----- ----- ----- ----- ----- ----- ------- ------- ------- ----- ----- -----\n", 00452 00453 ORIENT_tinystr[ CL_cord.xxor ] , 00454 ORIENT_tinystr[ CL_cord.yyor ] , 00455 ORIENT_tinystr[ CL_cord.zzor ] , 00456 ORIENT_tinystr[ CL_cord.xxor ] , ORIENT_tinystr[ CL_cord.xxor ] , 00457 ORIENT_tinystr[ CL_cord.yyor ] , ORIENT_tinystr[ CL_cord.yyor ] , 00458 ORIENT_tinystr[ CL_cord.zzor ] , ORIENT_tinystr[ CL_cord.zzor ] , 00459 ORIENT_tinystr[ CL_cord.xxor ] , 00460 ORIENT_tinystr[ CL_cord.yyor ] , 00461 ORIENT_tinystr[ CL_cord.zzor ] 00462 ) ; 00463 00464 } else { 00465 if (CL_noabs) /* BDW 19 Jan 1999 */ 00466 printf ("Mean and SEM based on Signed voxel intensities: \n"); 00467 else 00468 printf ("Mean and SEM based on Absolute Value " 00469 "of voxel intensities: \n"); 00470 printf("Cluster summary for file %s %s\n" , 00471 argv[iarg] , do_mni ? "[MNI coords]" : ""); 00472 printf("Volume CM %s CM %s CM %s Mean SEM \n",ORIENT_tinystr[ CL_cord.xxor ],ORIENT_tinystr[ CL_cord.yyor ] ,ORIENT_tinystr[ CL_cord.zzor ]); 00473 } 00474 } /* end of report header */ 00475 00476 /*-- actually find the clusters in the dataset */ 00477 00478 clar = NIH_find_clusters( nx,ny,nz , dxf,dyf,dzf , 00479 DSET_BRICK_TYPE(dset,ivfim) , vfim , rmm , CL_isomode ) ; 00480 00481 /*-- don't need dataset data any more --*/ 00482 00483 PURGE_DSET( dset ) ; 00484 00485 if( clar == NULL || clar->num_clu == 0 ){ 00486 printf("** NO CLUSTERS FOUND ***\n") ; 00487 if( clar != NULL ) DESTROY_CLARR(clar) ; 00488 continue ; /* next dataset */ 00489 } 00490 00491 /** edit for volume (June 1995) **/ 00492 00493 INIT_CLARR(clbig) ; 00494 for( iclu=0 ; iclu < clar->num_clu ; iclu++ ){ 00495 cl = clar->clar[iclu] ; 00496 if( cl != NULL && cl->num_pt >= ptmin ){ /* big enough */ 00497 ADDTO_CLARR(clbig,cl) ; /* copy pointer */ 00498 clar->clar[iclu] = NULL ; /* null out original */ 00499 } 00500 } 00501 DESTROY_CLARR(clar) ; 00502 clar = clbig ; 00503 if( clar == NULL || clar->num_clu == 0 ){ 00504 printf("** NO CLUSTERS FOUND ***\n") ; 00505 if( clar != NULL ) DESTROY_CLARR(clar) ; 00506 continue ; 00507 } 00508 00509 /** end of June 1995 addition **/ 00510 00511 /*-- 29 Nov 2001: write out an edited dataset? --*/ 00512 00513 if( iarg == nopt && CL_prefix != NULL ){ 00514 int qv ; byte *mmm ; 00515 00516 /* make a mask of voxels to keep */ 00517 00518 mmm = (byte *) calloc(sizeof(byte),nxyz) ; 00519 for( iclu=0 ; iclu < clar->num_clu ; iclu++ ){ 00520 cl = clar->clar[iclu] ; if( cl == NULL ) continue ; 00521 for( ipt=0 ; ipt < cl->num_pt ; ipt++ ){ 00522 ii = cl->i[ipt] ; jj = cl->j[ipt] ; kk = cl->k[ipt] ; 00523 mmm[ii+jj*nx+kk*nxy] = 1 ; 00524 } 00525 } 00526 00527 DSET_load( dset ) ; /* reload data from disk */ 00528 00529 EDIT_dset_items( dset , /* rename dataset internally */ 00530 ADN_prefix , CL_prefix , 00531 ADN_none ) ; 00532 00533 tross_Make_History( "3dclust" , argc , argv , dset ) ; 00534 00535 /* mask out each sub-brick */ 00536 00537 for( qv=0 ; qv < DSET_NVALS(dset) ; qv++ ){ 00538 00539 switch( DSET_BRICK_TYPE(dset,qv) ){ 00540 00541 case MRI_short:{ 00542 short *bar = (short *) DSET_ARRAY(dset,qv) ; 00543 for( ii=0 ; ii < nxyz ; ii++ ) 00544 if( mmm[ii] == 0 ) bar[ii] = 0 ; 00545 } 00546 break ; 00547 00548 case MRI_byte:{ 00549 byte *bar = (byte *) DSET_ARRAY(dset,qv) ; 00550 for( ii=0 ; ii < nxyz ; ii++ ) 00551 if( mmm[ii] == 0 ) bar[ii] = 0 ; 00552 } 00553 break ; 00554 00555 case MRI_int:{ 00556 int *bar = (int *) DSET_ARRAY(dset,qv) ; 00557 for( ii=0 ; ii < nxyz ; ii++ ) 00558 if( mmm[ii] == 0 ) bar[ii] = 0 ; 00559 } 00560 break ; 00561 00562 case MRI_float:{ 00563 float *bar = (float *) DSET_ARRAY(dset,qv) ; 00564 for( ii=0 ; ii < nxyz ; ii++ ) 00565 if( mmm[ii] == 0 ) bar[ii] = 0.0 ; 00566 } 00567 break ; 00568 00569 case MRI_double:{ 00570 double *bar = (double *) DSET_ARRAY(dset,qv) ; 00571 for( ii=0 ; ii < nxyz ; ii++ ) 00572 if( mmm[ii] == 0 ) bar[ii] = 0.0 ; 00573 } 00574 break ; 00575 00576 case MRI_complex:{ 00577 complex *bar = (complex *) DSET_ARRAY(dset,qv) ; 00578 for( ii=0 ; ii < nxyz ; ii++ ) 00579 if( mmm[ii] == 0 ) bar[ii].r = bar[ii].i = 0.0 ; 00580 } 00581 break ; 00582 00583 case MRI_rgb:{ 00584 byte *bar = (byte *) DSET_ARRAY(dset,qv) ; 00585 for( ii=0 ; ii < nxyz ; ii++ ) 00586 if( mmm[ii] == 0 ) bar[3*ii] = bar[3*ii+1] = bar[3*ii+2] = 0 ; 00587 } 00588 break ; 00589 } /* end of switch over sub-brick type */ 00590 } /* end of loop over sub-bricks */ 00591 00592 /* write dataset out */ 00593 00594 DSET_write(dset) ; 00595 fprintf(stderr,"++ Wrote dataset %s\n",DSET_BRIKNAME(dset)) ; 00596 PURGE_DSET(dset) ; free(mmm) ; 00597 } 00598 00599 /** sort clusters by size, to make a nice report **/ 00600 00601 if( clar->num_clu < 1000 ){ 00602 SORT_CLARR(clar) ; 00603 } else if( CL_summarize != 1 ){ 00604 printf("** TOO MANY CLUSTERS TO SORT BY VOLUME ***\n") ; 00605 } 00606 ndet = 0 ; 00607 00608 vol_total = nvox_total = 0 ; 00609 glmmsum = glmssum = glsqsum = glxxsum = glyysum = glzzsum = 0; 00610 00611 for( iclu=0 ; iclu < clar->num_clu ; iclu++ ){ 00612 cl = clar->clar[iclu] ; 00613 if( cl == NULL || cl->num_pt < ptmin ) continue ; /* no good */ 00614 00615 volsum = cl->num_pt * dxf*dyf*dzf ; 00616 xxsum = yysum = zzsum = mmsum = mssum = 0.0 ; 00617 xxmax = yymax = zzmax = mmmax = msmax = 0.0 ; 00618 sqsum = sem = 0; 00619 00620 /* These should be pegged at whatever actual max/min values are */ 00621 RLmax = APmax = ISmax = -1000; 00622 RLmin = APmin = ISmin = 1000; 00623 00624 for( ipt=0 ; ipt < cl->num_pt ; ipt++ ){ 00625 00626 #if 0 00627 /** this is obsolete and nonfunctional code **/ 00628 IJK_TO_THREE( cl->ijk[ipt] , ii,jj,kk , nx,nxy ) ; 00629 #endif 00630 ii = cl->i[ipt] ; jj = cl->j[ipt] ; kk = cl->k[ipt] ; 00631 00632 fv = THD_3dind_to_3dmm( dset , TEMP_IVEC3(ii,jj,kk) ) ; 00633 fv = THD_3dmm_to_dicomm( dset , fv ) ; 00634 xx = fv.xyz[0] ; yy = fv.xyz[1] ; zz = fv.xyz[2] ; 00635 if( !do_mni ) 00636 THD_dicom_to_coorder( &CL_cord , &xx,&yy,&zz ) ; /* July 1997 */ 00637 else 00638 THD_3tta_to_3mni( &xx , &yy , &zz ) ; /* 30 Apr 2002 */ 00639 00640 ms = cl->mag[ipt]; /* BDW 18 Jan 1999 */ 00641 mm = fabs(ms); 00642 00643 mssum += ms; 00644 mmsum += mm; 00645 sqsum += mm * mm; 00646 xxsum += mm * xx ; yysum += mm * yy ; zzsum += mm * zz ; 00647 if( mm > mmmax ){ 00648 xxmax = xx ; yymax = yy ; zzmax = zz ; 00649 mmmax = mm ; msmax = ms ; 00650 } 00651 00652 /* Dimensions: */ 00653 if ( xx > RLmax ) 00654 RLmax = xx; 00655 if ( xx < RLmin ) 00656 RLmin = xx; 00657 if ( yy > APmax ) 00658 APmax = yy; 00659 if ( yy < APmin ) 00660 APmin = yy; 00661 if ( zz > ISmax ) 00662 ISmax = zz; 00663 if ( zz < ISmin ) 00664 ISmin = zz; 00665 00666 } 00667 if( mmsum == 0.0 ) continue ; 00668 00669 glmssum += mssum; 00670 glmmsum += mmsum; 00671 glsqsum += sqsum ; 00672 glxxsum += xxsum; 00673 glyysum += yysum; 00674 glzzsum += zzsum; 00675 00676 ndet++ ; 00677 xxsum /= mmsum ; yysum /= mmsum ; zzsum /= mmsum ; 00678 00679 if (CL_noabs) mean = mssum / cl->num_pt; /* BDW 19 Jan 1999 */ 00680 else mean = mmsum / cl->num_pt; 00681 00682 if( fimfac != 0.0 ) 00683 { mean *= fimfac; msmax *= fimfac; 00684 sqsum *= fimfac*fimfac; } /* BDW 12/27/96 */ 00685 00686 /* MSB 11/1/96 Calculate SEM using SEM^2=s^2/N, 00687 where s^2 = (SUM Y^2)/N - (Ymean)^2 00688 where sqsum = (SUM Y^2 ) */ 00689 00690 if (cl->num_pt > 1) 00691 { 00692 sem = (sqsum - (cl->num_pt * mean * mean)) / (cl->num_pt - 1); 00693 if (sem > 0.0) sem = sqrt( sem / cl->num_pt ); else sem = 0.0; 00694 } 00695 else 00696 sem = 0.0; 00697 00698 if( CL_summarize != 1 ){ 00699 MCW_fc7(mean, buf1) ; 00700 MCW_fc7(msmax,buf2) ; 00701 MCW_fc7(sem ,buf3) ; 00702 00703 printf("%6.0f %5.1f %5.1f %5.1f %5.1f %5.1f %5.1f %5.1f %5.1f %5.1f %7s %7s %7s %5.1f %5.1f %5.1f \n", 00704 volsum, xxsum, yysum, zzsum, RLmin, RLmax, APmin, APmax, ISmin, ISmax, buf1, buf3, buf2, xxmax, yymax, zzmax ) ; 00705 } 00706 00707 nvox_total += cl->num_pt ; 00708 vol_total += volsum ; 00709 00710 } 00711 00712 DESTROY_CLARR(clar) ; 00713 if( ndet == 0 ) 00714 printf("** NO CLUSTERS FOUND ABOVE THRESHOLD VOLUME ***\n") ; 00715 00716 00717 /* MSB 11/1/96 Calculate global SEM */ 00718 00719 if (CL_noabs) glmean = glmssum / nvox_total; /* BDW 19 Jan 1999 */ 00720 else glmean = glmmsum / nvox_total; 00721 00722 /* BDW 12/27/96 */ 00723 if( fimfac != 0.0 ){ glsqsum *= fimfac*fimfac ; glmean *= fimfac ; } 00724 if (nvox_total > 1) 00725 { 00726 sem = (glsqsum - (nvox_total*glmean*glmean)) / (nvox_total - 1); 00727 if (sem > 0.0) sem = sqrt( sem / nvox_total ); else sem = 0.0; 00728 } 00729 else 00730 sem = 0.0; 00731 00732 glxxsum /= glmmsum ; glyysum /= glmmsum ; glzzsum /= glmmsum ; 00733 00734 /* MSB 11/1/96 Modified so that mean and SEM would print in correct column */ 00735 if( CL_summarize == 1 ) 00736 { if( !CL_quiet ) 00737 printf( "------ ----- ----- ----- -------- -------- \n"); 00738 printf("%6.0f %5.1f %5.1f %5.1f %8.1f %6.3f\n" , vol_total, glxxsum, glyysum, glzzsum, glmean, sem ) ; 00739 } 00740 else if( ndet > 1 && CL_summarize != -1 ) 00741 { 00742 MCW_fc7(glmean ,buf1) ; 00743 MCW_fc7(sem ,buf3) ; 00744 if( !CL_quiet ) 00745 printf ("------ ----- ----- ----- ----- ----- ----- ----- ----- ----- ------- ------- ------- ----- ----- -----\n"); 00746 printf ("%6.0f %5.1f %5.1f %5.1f %7s %7s \n", 00747 vol_total, glxxsum, glyysum, glzzsum, buf1, buf3 ) ; 00748 } 00749 00750 } 00751 00752 exit(0) ; 00753 } |
|
Definition at line 897 of file 3dclust.c. References abs. Referenced by main().
00898 { 00899 float aval = fabs(qval) ; 00900 int lv , il ; 00901 char lbuf[16] ; 00902 00903 /* special case if the value is an integer */ 00904 00905 lv = (int) qval ; 00906 00907 if( qval == lv && abs(lv) < 100000 ){ 00908 if( lv >= 0 ) sprintf( buf , " %d" , lv ) ; 00909 else sprintf( buf , "%d" , lv ) ; 00910 return ; 00911 } 00912 00913 /* macro to strip trailing zeros from output */ 00914 00915 #define BSTRIP \ 00916 for( il=6 ; il>1 && lbuf[il]=='0' ; il-- ) lbuf[il] = '\0' 00917 00918 /* noninteger: choose floating format based on magnitude */ 00919 00920 lv = (int) (10.0001 + log10(aval)) ; 00921 00922 switch( lv ){ 00923 00924 default: 00925 if( qval > 0.0 ) sprintf( lbuf , "%7.1e" , qval ) ; 00926 else sprintf( lbuf , "%7.0e" , qval ) ; 00927 break ; 00928 00929 case 7: /* 0.001 -0.01 */ 00930 case 8: /* 0.01 -0.1 */ 00931 case 9: /* 0.1 -1 */ 00932 case 10: /* 1 -9.99 */ 00933 sprintf( lbuf , "%7.4f" , qval ) ; BSTRIP ; break ; 00934 00935 case 11: /* 10-99.9 */ 00936 sprintf( lbuf , "%7.3f" , qval ) ; BSTRIP ; break ; 00937 00938 case 12: /* 100-999.9 */ 00939 sprintf( lbuf , "%7.2f" , qval ) ; BSTRIP ; break ; 00940 00941 case 13: /* 1000-9999.9 */ 00942 sprintf( lbuf , "%7.1f" , qval ) ; BSTRIP ; break ; 00943 00944 case 14: /* 10000-99999.9 */ 00945 sprintf( lbuf , "%7.0f" , qval ) ; break ; 00946 00947 } 00948 strcpy(buf,lbuf) ; 00949 return ; 00950 } |
Variable Documentation
|
-- RWCox: July 1997 Report directions based on AFNI_ORIENT environment --* |
|
Definition at line 83 of file 3dclust.c. Referenced by CL_read_opts(), and main(). |
|
|
|
Definition at line 84 of file 3dclust.c. Referenced by CL_read_opts(), and main(). |
|
Definition at line 69 of file 3dclust.c. Referenced by CL_read_opts(), and main(). |
|
Definition at line 69 of file 3dclust.c. Referenced by CL_read_opts(). |
|
Definition at line 75 of file 3dclust.c. Referenced by CL_read_opts(). |
|
Definition at line 71 of file 3dclust.c. Referenced by CL_read_opts(), and main(). |
|
Definition at line 81 of file 3dclust.c. Referenced by CL_read_opts(), and main(). |
|
Definition at line 79 of file 3dclust.c. Referenced by CL_read_opts(), and main(). |
|
Definition at line 73 of file 3dclust.c. Referenced by CL_read_opts(), and main(). |
|
Definition at line 77 of file 3dclust.c. Referenced by CL_read_opts(). |