Doxygen Source Code Documentation
plug_clust.c File Reference
#include "afni.h"
Go to the source code of this file.
Functions | |
char * | CLUST_main (PLUGIN_interface *) |
DEFINE_PLUGIN_PROTOTYPE PLUGIN_interface * | PLUGIN_init (int ncall) |
Variables | |
char | helpstring [] |
Function Documentation
|
Definition at line 130 of file plug_clust.c. References EDIT_options::clust_rmm, EDIT_options::clust_vmul, EDIT_options::dilate, DSET_load, DSET_THRESH_INDEX, DSET_unload, DSET_write, ECFLAG_AMAX, ECFLAG_MAX, ECFLAG_MEAN, ECFLAG_ORDER, ECFLAG_SAME, ECFLAG_SIZE, ECFLAG_SMAX, EDIT_options::edit_clust, EDIT_one_dataset(), EDIT_options::erode_pv, INIT_EDOPT, PLUTO_add_dset(), PLUTO_copy_dset(), PLUTO_find_dset(), PLUTO_force_redisplay(), PLUTO_prefix_ok(), THD_delete_3dim_dataset(), and EDIT_options::thresh. Referenced by PLUGIN_init().
00131 { 00132 char * tag , * new_prefix ; 00133 float rmm , vmul , thresh ; 00134 MCW_idcode * idc ; 00135 THD_3dim_dataset * dset , * new_dset ; 00136 int ival , ityp , nbytes , nvals ; 00137 EDIT_options edopt ; 00138 void * new_brick , * old_brick ; 00139 00140 int clust_type; /* input cluster type option */ /* 19 June 1998 */ 00141 char * str; /* input string */ 00142 float pv; /* pv % voxels within rmm must be active */ 00143 int dilate; /* boolean for perform dilation of cluster voxels */ 00144 00145 00146 /*--------------------------------------------------------------------*/ 00147 /*----- Check inputs from AFNI to see if they are reasonable-ish -----*/ 00148 00149 if( plint == NULL ) 00150 return "**********************\n" 00151 "CLUST_main: NULL input\n" 00152 "**********************" ; 00153 00154 tag = PLUTO_get_optiontag(plint) ; 00155 if( tag==NULL || strcmp(tag,"Dataset") != 0 ) 00156 return "**********************************\n" 00157 "CLUST_main: bad Dataset option tag\n" 00158 "**********************************" ; 00159 00160 idc = PLUTO_get_idcode(plint) ; 00161 dset = PLUTO_find_dset(idc) ; 00162 if( dset == NULL ) 00163 return "*****************************\n" 00164 "CLUST_main: bad input dataset\n" 00165 "*****************************" ; 00166 00167 tag = PLUTO_get_optiontag(plint) ; 00168 if( tag==NULL || strcmp(tag,"Params") != 0 ) 00169 return "*********************************\n" 00170 "CLUST_main: bad Params option tag\n" 00171 "*********************************" ; 00172 00173 str = PLUTO_get_string(plint); /* 19 June 1998 */ 00174 if (strcmp(str,"Keep") == 0) clust_type = ECFLAG_SAME; 00175 else if (strcmp(str,"Mean") == 0) clust_type = ECFLAG_MEAN; 00176 else if (strcmp(str,"Max") == 0) clust_type = ECFLAG_MAX; 00177 else if (strcmp(str,"AMax") == 0) clust_type = ECFLAG_AMAX; 00178 else if (strcmp(str,"SMax") == 0) clust_type = ECFLAG_SMAX; 00179 else if (strcmp(str,"Size") == 0) clust_type = ECFLAG_SIZE; 00180 else if (strcmp(str,"Order") == 0) clust_type = ECFLAG_ORDER; 00181 else 00182 return 00183 "**********************************\n" 00184 "CLUST_main: Illegal Cluster option\n" 00185 "**********************************"; 00186 00187 rmm = PLUTO_get_number(plint) ; 00188 vmul = PLUTO_get_number(plint) ; 00189 if( rmm <= 0 || vmul <= 0 ) 00190 return "****************************\n" 00191 "CLUST_main: bad Params input\n" 00192 "****************************" ; 00193 00194 00195 /* 19 June 1998 */ 00196 tag = PLUTO_peek_optiontag(plint) ; 00197 if( tag != NULL && strcmp(tag,"Erode/Dilate") == 0 ) 00198 { 00199 PLUTO_next_option(plint) ; 00200 pv = PLUTO_get_number(plint); 00201 if ((pv > 0.0) && (rmm <= 0.0)) 00202 return 00203 "*******************************************************\n" 00204 "CLUST_main: Erode/Dilate requires use of Cluster option\n" 00205 "*******************************************************"; 00206 else 00207 pv = pv / 100.0; 00208 00209 str = PLUTO_get_string(plint); 00210 if (strcmp (str, "True") == 0) 00211 { 00212 if (pv <= 0.0) 00213 return 00214 "***********************************************\n" 00215 "CLUST_main: Dilate requires use of Erode option\n" 00216 "***********************************************"; 00217 else 00218 dilate = 1; 00219 } 00220 else 00221 dilate = 0; 00222 } 00223 else 00224 { 00225 pv = 0.0; 00226 dilate = 0; 00227 } 00228 00229 00230 tag = PLUTO_peek_optiontag(plint) ; 00231 if( tag != NULL && strcmp(tag,"Threshold") == 0 ){ 00232 PLUTO_next_option(plint) ; 00233 thresh = PLUTO_get_number(plint) ; 00234 if( thresh < 0.0 ) 00235 return "*******************************\n" 00236 "CLUST_main: bad Threshold input\n" 00237 "*******************************" ; 00238 00239 if( thresh > 0.0 && DSET_THRESH_INDEX(dset) < 0 ) 00240 return "**********************************************\n" 00241 "CLUST_main: Dataset has no threshold sub-brick\n" 00242 "**********************************************" ; 00243 } else { 00244 thresh = 0.0 ; 00245 } 00246 00247 tag = PLUTO_peek_optiontag(plint) ; 00248 if( tag != NULL && strcmp(tag,"Output") == 0 ){ 00249 PLUTO_next_option(plint) ; 00250 new_prefix = PLUTO_get_string(plint) ; 00251 if( ! PLUTO_prefix_ok(new_prefix) ) 00252 return "**********************\n" 00253 "CLUST_main: bad prefix\n" 00254 "**********************" ; 00255 } else { 00256 new_prefix = NULL ; 00257 } 00258 00259 /*------------------------------------------------------*/ 00260 /*---------- At this point, the inputs are OK ----------*/ 00261 00262 /*-- maybe, make a new dataset --*/ 00263 00264 if( new_prefix == NULL ){ /* no prefix => edit input in place */ 00265 00266 new_dset = dset ; 00267 DSET_load( dset ) ; /* load into memory */ 00268 00269 } else { /* OK, make a copy first */ 00270 new_dset = PLUTO_copy_dset( dset , new_prefix ) ; 00271 00272 if( new_dset == NULL ) 00273 return "****************************************\n" 00274 "CLUST_main: failed to copy input dataset\n" 00275 "****************************************" ; 00276 00277 DSET_unload( dset ) ; /* unload from memory */ 00278 } 00279 00280 /*-- set up for dataset editing --*/ 00281 00282 INIT_EDOPT( &edopt ) ; 00283 00284 edopt.edit_clust = clust_type; /* 19 June 1998 */ 00285 00286 edopt.clust_rmm = rmm ; 00287 edopt.clust_vmul = vmul ; 00288 00289 edopt.erode_pv = pv; 00290 edopt.dilate = dilate; 00291 00292 if( thresh > 0.0 ) edopt.thresh = thresh ; 00293 00294 /*-- edit the new dataset --*/ 00295 00296 EDIT_one_dataset( new_dset , &edopt ) ; 00297 00298 /*-- if we made a completely new dataset, give it to AFNI --*/ 00299 00300 if( new_dset != dset ){ 00301 ival = PLUTO_add_dset( plint , new_dset , DSET_ACTION_MAKE_CURRENT ) ; 00302 00303 if( ival ){ 00304 THD_delete_3dim_dataset( new_dset , False ) ; 00305 return "**********************************************\n" 00306 "CLUST_main: failure to add new dataset to AFNI\n" 00307 "**********************************************" ; 00308 } 00309 } else { 00310 DSET_write( new_dset ) ; /* otherwise, re-write to disk */ 00311 PLUTO_force_redisplay() ; /* and force a redisplay of images */ 00312 } 00313 00314 /*-- done successfully!!! --*/ 00315 00316 return NULL ; 00317 } |
|
Definition at line 60 of file plug_clust.c. References ANAT_ALL_MASK, CLUST_main(), FUNC_ALL_MASK, helpstring, PLUTO_add_hint(), and PLUTO_set_sequence().
00061 { 00062 PLUGIN_interface * plint ; 00063 00064 /*----- plugin option labels -----*/ /* 19 June 1998 */ 00065 char * boolean_types[2] = {"False", "True"}; 00066 char * cluster_types[7] = {"Keep", "Mean", "Max", "AMax", "SMax", "Size", 00067 "Order"}; 00068 00069 if( ncall > 0 ) return NULL ; /* only one interface */ 00070 00071 /*-- set titles and call point --*/ 00072 00073 plint = PLUTO_new_interface( "3D Cluster" , "Dataset Clustering" , helpstring , 00074 PLUGIN_CALL_VIA_MENU , CLUST_main ) ; 00075 00076 PLUTO_add_hint( plint , "Dataset Clustering" ) ; 00077 00078 PLUTO_set_sequence( plint , "A:afniinfo:dsetcluster" ) ; 00079 00080 /*-- first line of input: Dataset --*/ 00081 00082 PLUTO_add_option( plint , "Dataset" , "Dataset" , TRUE ) ; 00083 PLUTO_add_dataset(plint , "Function" , 00084 ANAT_ALL_MASK , FUNC_ALL_MASK , 00085 DIMEN_3D_MASK | BRICK_ALLREAL_MASK ) ; 00086 PLUTO_add_hint( plint , "Choose input dataset" ) ; 00087 00088 /*-- second line of input: Cluster Parameters --*/ 00089 00090 PLUTO_add_option( plint , "Params" , "Params" , TRUE ) ; 00091 PLUTO_add_hint( plint , "Find and reject small clusters" ) ; 00092 PLUTO_add_string (plint, "Type", 7, cluster_types, 0); /* 19 June 1998 */ 00093 PLUTO_add_hint( plint , "How to process data inside clusters" ) ; 00094 PLUTO_add_number( plint , "Radius(mm)" , 0, 100,1 , 20,TRUE ) ; 00095 PLUTO_add_hint( plint , "Max distance between 'neighbors'" ) ; 00096 PLUTO_add_number( plint , "MinVol(ul)" , 0,1000,-1,100,TRUE ) ; 00097 PLUTO_add_hint( plint , "Min size for cluster to survive" ) ; 00098 00099 00100 /*---- 3rd line of input: Erosion/Dilation option ----*/ /* 19 June 1998 */ 00101 PLUTO_add_option (plint, "Erode/Dilate", "Erode/Dilate", FALSE); 00102 PLUTO_add_hint (plint , "Sever narrow connecting paths between clusters"); 00103 PLUTO_add_number (plint, "% Voxels", 0, 100, 0, 50, TRUE); 00104 PLUTO_add_hint (plint , 00105 "Min % of active 'neighbors' for a voxel to survive"); 00106 PLUTO_add_string (plint, "Dilate?", 2, boolean_types, 0); 00107 PLUTO_add_hint (plint , "Restore voxels near main body of cluster"); 00108 00109 00110 /*-- fourth line of input: Threshold (optional) --*/ 00111 00112 PLUTO_add_option( plint , "Threshold" , "Threshold" , FALSE ) ; 00113 PLUTO_add_hint( plint , "Zero out if threshold brick too small" ) ; 00114 PLUTO_add_number( plint , "Cutoff" , 0,1000,2 , 50,TRUE ) ; 00115 PLUTO_add_hint( plint , "Threshold values < this => 0" ) ; 00116 00117 /*-- fifth line of input: Prefix for output dataset --*/ 00118 00119 PLUTO_add_option( plint , "Output" , "Output" , FALSE ) ; 00120 PLUTO_add_string( plint , "Prefix" , 0,NULL , 19 ) ; 00121 PLUTO_add_hint( plint , "Name output dataset" ) ; 00122 00123 return plint ; 00124 } |
Variable Documentation
|
Initial value: " Purpose: Apply the clustering algorithm to a functional dataset.\n" " Inputs:\n" " Dataset = Functional dataset that must already be in memory\n" " (not warp-on-demand) -- this is required.\n" " Params = Type determines method for setting voxel intensities \n" " within a cluster. \n" " Radius controls the maximum distance between two nonzero\n" " voxels for them to be considered neighbors in a cluster.\n" " MinVol controls the minimum volume of a cluster that will\n" " be accepted.\n" " Erode/Dilate = Sever narrow connecting paths between clusters. \n" " % Voxels Min. % of active 'neighbors' for a voxel to survive. \n" " Dilate Restore voxels near main body of cluster. \n" " Threshold = If the input dataset has a threshold sub-brick attached,\n" " this option can be used to set its level.\n" " Output = If this option is used, then a new dataset will be made\n" " from the clusters. In that case, a prefix for the\n" " new dataset filename must be provided. If this option\n" " is not used, then the clustering results will overwrite \n" " the existing dataset in memory and on disk.\n" "Author -- RW Cox" Definition at line 29 of file plug_clust.c. Referenced by PLUGIN_init(). |