Doxygen Source Code Documentation
plug_hemisub.c File Reference
#include "afni.h"Go to the source code of this file.
Data Structures | |
| struct | hemi_s |
Defines | |
| #define | NUM_T_OPTS 3 |
Functions | |
| char * | process_data (THD_3dim_dataset *, hemi_s *) |
| char * | process_as_floats (THD_3dim_dataset *, hemi_s *) |
| char * | HEMISUB_main (PLUGIN_interface *) |
| DEFINE_PLUGIN_PROTOTYPE PLUGIN_interface * | PLUGIN_init (int ncall) |
Variables | |
| char * | thresh_opts [NUM_T_OPTS] |
| char | helpstring [] |
Define Documentation
|
|
Definition at line 53 of file plug_hemisub.c. Referenced by HEMISUB_main(), and PLUGIN_init(). |
Function Documentation
|
|
Definition at line 114 of file plug_hemisub.c. References DSET_load, NUM_T_OPTS, PLUTO_add_dset(), PLUTO_copy_dset(), PLUTO_find_dset(), PLUTO_prefix_ok(), PLUTO_string_index(), process_data(), THD_delete_3dim_dataset(), thresh_opts, and hemi_s::thresh_type. Referenced by PLUGIN_init().
00115 {
00116 THD_3dim_dataset * dset, * new_dset;
00117 MCW_idcode * idc;
00118 hemi_s hs = { 0 };
00119 char * new_prefix;
00120 char * ret_string = NULL;
00121 char * tag;
00122
00123
00124 if ( plint == NULL )
00125 return "------------------------\n"
00126 "HEMISUB_main: NULL input\n"
00127 "------------------------\n";
00128
00129 PLUTO_next_option( plint );
00130 idc = PLUTO_get_idcode( plint );
00131 dset = PLUTO_find_dset( idc );
00132
00133 if( dset == NULL )
00134 return "-------------------------------\n"
00135 "HEMISUB_main: bad input dataset\n"
00136 "-------------------------------";
00137
00138 DSET_load( dset );
00139
00140 PLUTO_next_option( plint );
00141 new_prefix = PLUTO_get_string( plint );
00142 if ( ! PLUTO_prefix_ok( new_prefix ) )
00143 return "------------------------\n"
00144 "HEMISUB_main: bad prefix\n"
00145 "------------------------\n";
00146
00147 if ( ( new_dset = PLUTO_copy_dset( dset, new_prefix ) ) == NULL )
00148 return "------------------------------------------\n"
00149 "HEMISUB_main: failed to copy input dataset\n"
00150 "------------------------------------------\n";
00151
00152 tag = PLUTO_get_optiontag( plint );
00153 if ( tag && ! strcmp( tag, "Thresh Type" ) )
00154 {
00155 tag = PLUTO_get_string( plint );
00156 if ( tag != NULL )
00157 hs.thresh_type = PLUTO_string_index( tag, NUM_T_OPTS, thresh_opts );
00158 }
00159
00160 if ( ret_string = process_data( new_dset, &hs ) )
00161 return ret_string;
00162
00163 if ( PLUTO_add_dset( plint, new_dset, DSET_ACTION_MAKE_CURRENT ) )
00164 {
00165 THD_delete_3dim_dataset( new_dset, False );
00166
00167 return "---------------------------------------\n"
00168 "HEMISUB_main: failed to add new dataset\n"
00169 "---------------------------------------\n";
00170 }
00171
00172 return NULL;
00173 }
|
|
|
Definition at line 70 of file plug_hemisub.c. References ANAT_ALL_MASK, FUNC_ALL_MASK, helpstring, HEMISUB_main(), NUM_T_OPTS, PLUTO_add_hint(), PLUTO_set_sequence(), and thresh_opts.
00071 {
00072 PLUGIN_interface * plint ;
00073
00074 if( ncall > 0 ) return NULL ; /* only one interface */
00075
00076 /* create the new interface */
00077
00078 plint = PLUTO_new_interface( "Hemi-subtract", "hemisphere subtraction",
00079 helpstring, PLUGIN_CALL_VIA_MENU , HEMISUB_main );
00080
00081 PLUTO_add_hint( plint,
00082 "from each voxel's value, subtract that of the reflected voxel" );
00083
00084 PLUTO_set_sequence( plint , "z:Reynolds" ) ;
00085
00086 /*-- first line of input: input dataset --*/
00087
00088 PLUTO_add_option( plint, "Input" , "Input" , TRUE );
00089 PLUTO_add_hint( plint, "choose dataset for input" );
00090 PLUTO_add_dataset(plint, "Dataset" , ANAT_ALL_MASK , FUNC_ALL_MASK,
00091 DIMEN_3D_MASK | BRICK_SHORT_MASK );
00092
00093 /*-- second line of input: prefix for output dataset --*/
00094
00095 PLUTO_add_option( plint, "Output" , "prefix" , TRUE );
00096 PLUTO_add_hint( plint, "option: choose dataset prefix for output" );
00097 PLUTO_add_string( plint, "Prefix", 0, NULL, 19 );
00098
00099 /*-- third line of input: threshold type option --*/
00100
00101 PLUTO_add_option( plint, "Thresh Type", "Thresh Type", FALSE );
00102 PLUTO_add_string( plint, "Type", NUM_T_OPTS, thresh_opts, 0 );
00103
00104 return plint;
00105 }
|
|
||||||||||||
|
Definition at line 251 of file plug_hemisub.c. References THD_3dim_dataset::daxes, DSET_ARRAY, DSET_BRICK_FACTOR, EDIT_coerce_scale_type(), free, malloc, MCW_vol_amax(), THD_dataxes::nxx, THD_dataxes::nyy, nz, THD_dataxes::nzz, THD_load_statistics(), and hemi_s::thresh_type. Referenced by process_data().
00252 {
00253 int count, cx, type = hs->thresh_type;
00254 int nx, ny, nz, nvox;
00255 short * sp, * sdata;
00256 float * fdata, * fp, * fp2;
00257 float factor, maxabs;
00258
00259 nx = dset->daxes->nxx;
00260 ny = dset->daxes->nyy;
00261 nz = dset->daxes->nzz;
00262 nvox = nx * ny * nz;
00263
00264 sdata = (short *)DSET_ARRAY( dset, 0 );
00265
00266 factor = DSET_BRICK_FACTOR( dset, 0 );
00267 factor = factor == 0.0 ? 1.0 : factor;
00268
00269 /* first get the data into a float array */
00270
00271 if ( ( fdata = (float *)malloc( nvox * sizeof( float ) ) ) == NULL )
00272 return "------------------------------\n"
00273 "paf: failed allocation of floats"
00274 "------------------------------\n";
00275
00276 fp = fdata;
00277 sp = sdata;
00278 for ( count = 0; count < nvox; count++ )
00279 {
00280 *fp = *sdata * factor;
00281
00282 if ( ( type == 1 ) && ( *fp < 0 ) )
00283 *fp = 0;
00284 else if ( ( type == 2 ) && ( *fp > 0 ) )
00285 *fp = 0;
00286
00287 fp++;
00288 sp++;
00289 }
00290
00291 /* now make the subtraction as floats */
00292
00293 for ( count = 0; count < ny*nz; count++ )
00294 {
00295 fp = fdata + count * nx;
00296 fp2 = fp + nx - 1;
00297
00298 for ( cx = 0; cx < (nx+1)/2; cx++ )
00299 {
00300 *fp = *fp - *fp2;
00301 *fp2 = -*fp;
00302
00303 fp++;
00304 fp2--;
00305 }
00306 }
00307
00308 /* now make a new factor */
00309
00310 maxabs = MCW_vol_amax( nvox, 1, 1, MRI_float, fdata );
00311
00312 /* result is all zero, let the user worry */
00313 if ( maxabs != 0.0 )
00314 {
00315 factor = MRI_TYPE_maxval[MRI_short] /maxabs; /* 32767? / maxabs */
00316
00317 EDIT_coerce_scale_type( nvox, factor, MRI_float, fdata, MRI_short, sdata );
00318
00319 DSET_BRICK_FACTOR( dset, 0 ) = factor == 0.0 ? 0.0 : 1.0 / factor;
00320
00321 THD_load_statistics( dset );
00322 }
00323 free(fdata);
00324 return NULL; /* success */
00325 }
|
|
||||||||||||
|
Definition at line 185 of file plug_hemisub.c. References THD_3dim_dataset::daxes, DSET_ARRAY, DSET_BRICK_FACTOR, THD_dataxes::nxx, THD_dataxes::nyy, nz, THD_dataxes::nzz, process_as_floats(), and hemi_s::thresh_type.
00186 {
00187 int count, nx, ny, nz, cx, cx2;
00188 int type, diff, floats = ( DSET_BRICK_FACTOR( dset, 0 ) != 0.0 );
00189 short * data, * sp, * sp2;
00190
00191 nx = dset->daxes->nxx;
00192 ny = dset->daxes->nyy;
00193 nz = dset->daxes->nzz;
00194
00195 type = hs->thresh_type;
00196
00197 data = (short *)DSET_ARRAY( dset, 0 );
00198 for ( count = 0; ! floats && count < ny*nz; count++ )
00199 {
00200 sp = data;
00201 sp2 = data + nx - 1;
00202
00203 for ( cx = 0; cx < (nx+1)/2; cx++ )
00204 {
00205 if ( type == 1 ) /* positives only */
00206 {
00207 if ( *sp < 0 )
00208 *sp = 0;
00209 if ( *sp2 < 0 )
00210 *sp2 = 0;
00211 }
00212 else if ( type == 2 ) /* negatives only */
00213 {
00214 if ( *sp > 0 )
00215 *sp = 0;
00216 if ( *sp2 > 0 )
00217 *sp2 = 0;
00218 }
00219
00220 diff = *sp - *sp2;
00221 /* if out of short range */
00222 if ( ( diff > 32767 ) || ( diff < -32768 ) )
00223 floats = 1;
00224 else
00225 {
00226 *sp = diff;
00227 *sp2 = -diff;
00228 }
00229
00230 sp++;
00231 sp2--;
00232 }
00233
00234 data += nx;
00235 }
00236
00237 if ( floats )
00238 return process_as_floats( dset, hs );
00239
00240 return NULL; /* success */
00241 }
|
Variable Documentation
|
|
Initial value:
"Hemisubtract - used to subtract one hemisphere from the other\n"Definition at line 57 of file plug_hemisub.c. Referenced by PLUGIN_init(). |
|
|
Initial value:
{ "any", "positives only", "negatives only" }Definition at line 55 of file plug_hemisub.c. Referenced by HEMISUB_main(), and PLUGIN_init(). |