Doxygen Source Code Documentation
afni_fimfunc.c File Reference
#include "afni.h"Go to the source code of this file.
Functions | |
| void | AFNI_register_fimfunc (char *menu_name, int nbrik, generic_func *user_func, void *user_data) |
| void | rank_order_float (int n, float *a) |
| float | spearman_rank_prepare (int n, float *a) |
| float | quadrant_corr_prepare (int n, float *a) |
| float | spearman_rank_corr (int n, float *x, float rv, float *r) |
| float | spearman_rank_manycorr (int n, float *x, int nr, float *rv, float **r) |
| float | quadrant_corr (int n, float *x, float rv, float *r) |
| float | quadrant_manycorr (int n, float *x, int nr, float *rv, float **r) |
| void | spearman_fimfunc (int n, float *ts, void *ud, int nb, void *val) |
| void | quadrant_fimfunc (int n, float *ts, void *ud, int nb, void *val) |
Function Documentation
|
||||||||||||||||||||
|
Definition at line 75 of file afni_fimfunc.c. References ENTRY, MCW_function_list::flags, MCW_function_list::func_code, MCW_function_list::func_data, FUNC_FIM, MCW_function_list::func_init, MCW_function_list::funcs, generic_func, GLOBAL_library, MCW_function_list::labels, MCW_function_list::num, AFNI_library_type::registered_fim, user_data, and XtRealloc. Referenced by MAIN_workprocess().
00077 {
00078 MCW_function_list *rlist = &(GLOBAL_library.registered_fim) ;
00079 int num = rlist->num ;
00080
00081 ENTRY("AFNI_register_fimfunc") ;
00082
00083 if( menu_name == NULL || menu_name[0] == '\0' ||
00084 nbrik <= 0 || user_func == NULL ) EXRETURN ; /* bad inputs! */
00085
00086 if( num == sizeof(int) ) EXRETURN ; /* too many already! */
00087
00088 if( num == 0 ){
00089 rlist->flags=NULL; rlist->labels=NULL; rlist->funcs=NULL;
00090 rlist->func_data=NULL; rlist->func_code=NULL; rlist->func_init=NULL;
00091 }
00092
00093 rlist->flags = (int *) XtRealloc( (char *)rlist->flags, sizeof(int)*(num+1) ) ;
00094
00095 rlist->labels = (char **) XtRealloc( (char *)rlist->labels ,
00096 sizeof(char *)*(num+1) ) ;
00097
00098 rlist->funcs = (generic_func **) XtRealloc( (char *)rlist->funcs ,
00099 sizeof(generic_func *)*(num+1) ) ;
00100
00101 rlist->func_data = (void **) XtRealloc( (char *)rlist->func_data ,
00102 sizeof(void *)*(num+1) ) ;
00103
00104 rlist->func_code = (int *) XtRealloc( (char *)rlist->func_code, sizeof(int)*(num+1) ) ;
00105
00106 rlist->func_init = (generic_func **) XtRealloc( (char *)rlist->func_init ,
00107 sizeof(generic_func *)*(num+1) ) ;
00108
00109 rlist->flags[num] = nbrik ;
00110 rlist->labels[num] = XtNewString(menu_name) ;
00111 rlist->funcs[num] = user_func ;
00112 rlist->func_data[num] = user_data ;
00113 rlist->func_code[num] = FUNC_FIM ;
00114 rlist->func_init[num] = NULL ;
00115
00116 rlist->num = num+1 ;
00117 EXRETURN ;
00118 }
|
|
||||||||||||||||||||
|
Definition at line 256 of file afni_fimfunc.c. References quadrant_corr_prepare(), and r.
00257 {
00258 register int ii ;
00259 register float ss ; float xv ;
00260
00261 xv = quadrant_corr_prepare( n , x ) ; if( xv <= 0.0 ) return 0.0 ;
00262
00263 for( ii=0,ss=0.0 ; ii < n ; ii++ ) ss += x[ii] * r[ii] ;
00264
00265 return ( ss/sqrt(rv*xv) ) ;
00266 }
|
|
||||||||||||
|
Definition at line 198 of file afni_fimfunc.c. References a, and rank_order_float().
00199 {
00200 register int ii ;
00201 register float rb , rs ;
00202
00203 rank_order_float( n , a ) ;
00204
00205 rb = 0.5*(n-1) ; rs=0.0 ;
00206 for( ii=0 ; ii < n ; ii++ ){
00207 a[ii] = (a[ii] > rb) ? 1.0
00208 : (a[ii] < rb) ? -1.0 : 0.0 ;
00209 rs += a[ii]*a[ii] ;
00210 }
00211
00212 return rs ;
00213 }
|
|
||||||||||||||||||||||||
|
Definition at line 423 of file afni_fimfunc.c. References EDIT_BRICK_LABEL, EDIT_BRICK_TO_FICO, fd, free, FIMdata::ignore, malloc, MRI_FLOAT_PTR, MRI_IMAGE::nx, MRI_IMAGE::ny, FIMdata::polort, quadrant_corr_prepare(), quadrant_manycorr(), rank_order_float(), FIMdata::ref_ts, and v.
00424 {
00425 static float *tsc=NULL , *refc=NULL , *refv=NULL , **rr ;
00426 static int *keep=NULL ;
00427 static int ntsc , nref , nkeep , polort,ignore , ncall;
00428
00429 int ii , kk ;
00430 float *v ;
00431
00432 /*--- handle special cases ---*/
00433
00434 if( ts == NULL ){
00435
00436 /*--- the initialization call ---*/
00437
00438 if( n > 0 ){
00439
00440 FIMdata *fd = (FIMdata *) val ;
00441
00442 polort = fd->polort ; /* not used here */
00443 ignore = fd->ignore ;
00444 ncall = 0 ; /* how many times we have been called */
00445
00446 /* make workspace for copy of ts data when it arrives */
00447
00448 ntsc = n ;
00449 if( tsc != NULL ) free(tsc) ;
00450 tsc = (float *) malloc(sizeof(float)*ntsc) ;
00451
00452 /* make copy of ref data */
00453
00454 nref = fd->ref_ts->ny ;
00455 if( refc != NULL ) free(refc) ;
00456 if( refv != NULL ) free(refv) ;
00457 if( keep != NULL ) free(keep) ;
00458 if( rr != NULL ) free(rr) ;
00459 refc = (float *) malloc(sizeof(float)*ntsc*nref) ; /* copy of ref */
00460 refv = (float *) malloc(sizeof(float)*nref) ; /* rank variances */
00461 keep = (int *) malloc(sizeof(int)*ntsc) ; /* keeper indices */
00462 rr = (float **)malloc(sizeof(float *)*nref) ; /* convenience ptrs */
00463
00464 for( kk=0 ; kk < nref ; kk++ ){
00465 rr[kk] = refc+kk*ntsc ; /* compute ptr */
00466 memcpy( rr[kk] , /* copy data */
00467 MRI_FLOAT_PTR(fd->ref_ts) + kk*fd->ref_ts->nx ,
00468 sizeof(float)*ntsc ) ;
00469 }
00470
00471 /* mark those places we will keep (where ref is OK) */
00472
00473 for( nkeep=0,ii=ignore ; ii < ntsc ; ii++ ){ /* for each time point */
00474 for( kk=0 ; kk < nref ; kk++ ) /* check each ref */
00475 if( rr[kk][ii] >= WAY_BIG ) break ;
00476
00477 if( kk == nref ) keep[nkeep++] = ii ; /* mark if all are OK */
00478 }
00479
00480 /* compress ref, eliminating non-keepers */
00481
00482 if( nkeep < ntsc ){
00483 for( ii=0 ; ii < nkeep ; ii++ ){
00484 for( kk=0 ; kk < nref ; kk++ )
00485 rr[kk][ii] = rr[kk][keep[ii]] ; /* copy backwards */
00486 }
00487 }
00488
00489 /* prepare each ref vector for rank processing */
00490
00491 for( kk=0 ; kk < nref ; kk++ )
00492 refv[kk] = quadrant_corr_prepare( nkeep , rr[kk] ) ;
00493
00494 #if 0
00495 fprintf(stderr,"quadrant_fimfunc: initialize ntsc=%d nkeep=%d nref=%d\n",
00496 ntsc,nkeep,nref);
00497 #endif
00498
00499 return ;
00500
00501 /*--- the ending call ---*/
00502
00503 } else {
00504 THD_3dim_dataset *dset = (THD_3dim_dataset *) val ;
00505 int kb = -n ;
00506
00507 free(tsc) ; tsc = NULL ; /* free workspaces */
00508 free(refc) ; refc = NULL ;
00509 free(refv) ; refv = NULL ;
00510 free(keep) ; keep = NULL ;
00511 free(rr) ; rr = NULL ;
00512 rank_order_float(0,NULL) ;
00513
00514 /* edit sub-brick statistical parameters and name */
00515
00516 EDIT_BRICK_TO_FICO( dset , kb , nkeep , (nref==1)?1:2 , 1 ) ;
00517 EDIT_BRICK_LABEL( dset , kb , "Quadrant CC" ) ;
00518
00519 #if 0
00520 fprintf(stderr,"quadrant_fimfunc: finalize with kb=%d\n",kb);
00521 #endif
00522
00523 return ;
00524 }
00525 }
00526
00527 /*--- the normal case [with data] ---*/
00528
00529 ncall++ ;
00530 #if 0
00531 if(ncall%1000==0) fprintf(stderr,"quadrant_fimfunc: ncall=%d\n",ncall);
00532 #endif
00533
00534 /* copy input timeseries data (since we will mangle it) */
00535
00536 if( nkeep < ntsc )
00537 for( ii=0 ; ii < nkeep ; ii++ ) tsc[ii] = ts[keep[ii]]; /* the hard way */
00538 else
00539 memcpy(tsc,ts,sizeof(float)*ntsc) ; /* the easy way */
00540
00541 /* compute our single result */
00542
00543 v = (float *) val ;
00544 v[0] = quadrant_manycorr( nkeep , tsc , nref , refv , rr ) ;
00545
00546 return ;
00547 }
|
|
||||||||||||||||||||||||
|
Definition at line 268 of file afni_fimfunc.c. References nr, quadrant_corr(), quadrant_corr_prepare(), and r. Referenced by quadrant_fimfunc().
00270 {
00271 register int ii ;
00272 register float ss ;
00273 int jj ;
00274 float bb , xv ;
00275
00276 if( nr == 1 ) return quadrant_corr( n,x,rv[0],r[0] ) ;
00277
00278 xv = quadrant_corr_prepare( n , x ) ; if( xv <= 0.0 ) return 0.0 ;
00279
00280 for( jj=0,bb=0.0 ; jj < nr ; jj++ ){
00281 for( ii=0,ss=0.0 ; ii < n ; ii++ ) ss += x[ii] * r[jj][ii] ;
00282 ss /= sqrt(rv[jj]*xv) ;
00283 if( fabs(ss) > fabs(bb) ) bb = ss ;
00284 }
00285
00286 return bb ;
00287 }
|
|
||||||||||||
|
Definition at line 129 of file afni_fimfunc.c. References a, c, free, malloc, n1, and qsort_floatint().
00130 {
00131 register int ii , ns , n1 , ib ;
00132 static int nb = 0 ;
00133 static int *b = NULL ; /* workspaces */
00134 static float *c = NULL ;
00135 float cs ;
00136
00137 /*- handle special cases -*/
00138
00139 if( a == NULL ){
00140 if( b != NULL ){ free(b); free(c); b=NULL ; c=NULL; nb=0; } /* free workspaces */
00141 return ;
00142 }
00143
00144 if( n < 1 ) return ; /* meaningless input */
00145 if( n == 1 ){ a[0] = 0.0 ; return ; } /* only one point!? */
00146
00147 /*- make workspaces, if needed -*/
00148
00149 if( nb < n ){
00150 if( b != NULL ){ free(b); free(c); }
00151 b = (int *) malloc(sizeof(int )*n) ;
00152 c = (float *) malloc(sizeof(float)*n) ;
00153 nb = n ;
00154 }
00155
00156 for( ii=0 ; ii < n ; ii++ ) c[ii] = b[ii] = ii ;
00157
00158 /*- sort input, carrying b along -*/
00159
00160 qsort_floatint( n , a , b ) ; /* see cs_sort_fi.c */
00161
00162 /* compute ranks into c[] */
00163
00164 n1 = n-1 ;
00165 for( ii=0 ; ii < n1 ; ii++ ){
00166 if( a[ii] == a[ii+1] ){ /* handle ties */
00167 cs = 2*ii+1 ; ns = 2 ; ib=ii ; ii++ ;
00168 while( ii < n1 && a[ii] == a[ii+1] ){ ii++ ; ns++ ; cs += ii ; }
00169 for( cs/=ns ; ib <= ii ; ib++ ) c[ib] = cs ;
00170 }
00171 }
00172
00173 for( ii=0 ; ii < n ; ii++ ) a[b[ii]] = c[ii] ;
00174
00175 return ;
00176 }
|
|
||||||||||||||||||||||||
|
Definition at line 293 of file afni_fimfunc.c. References EDIT_BRICK_LABEL, EDIT_BRICK_TO_FICO, fd, free, FIMdata::ignore, malloc, MRI_FLOAT_PTR, MRI_IMAGE::nx, MRI_IMAGE::ny, FIMdata::polort, rank_order_float(), FIMdata::ref_ts, spearman_rank_manycorr(), spearman_rank_prepare(), and v.
00294 {
00295 static float *tsc=NULL , *refc=NULL , *refv=NULL , **rr ;
00296 static int *keep=NULL ;
00297 static int ntsc , nref , nkeep , polort,ignore , ncall;
00298
00299 int ii , kk ;
00300 float *v ;
00301
00302 /*--- handle special cases ---*/
00303
00304 if( ts == NULL ){
00305
00306 /*--- the initialization call ---*/
00307
00308 if( n > 0 ){
00309
00310 FIMdata *fd = (FIMdata *) val ;
00311
00312 polort = fd->polort ; /* not used here */
00313 ignore = fd->ignore ;
00314 ncall = 0 ; /* how many times we have been called */
00315
00316 /* make workspace for copy of ts data when it arrives */
00317
00318 ntsc = n ;
00319 if( tsc != NULL ) free(tsc) ;
00320 tsc = (float *) malloc(sizeof(float)*ntsc) ;
00321
00322 /* make copy of ref data */
00323
00324 nref = fd->ref_ts->ny ;
00325 if( refc != NULL ) free(refc) ;
00326 if( refv != NULL ) free(refv) ;
00327 if( keep != NULL ) free(keep) ;
00328 if( rr != NULL ) free(rr) ;
00329 refc = (float *) malloc(sizeof(float)*ntsc*nref) ; /* copy of ref */
00330 refv = (float *) malloc(sizeof(float)*nref) ; /* rank variances */
00331 keep = (int *) malloc(sizeof(int)*ntsc) ; /* keeper indices */
00332 rr = (float **)malloc(sizeof(float *)*nref) ; /* convenience ptrs */
00333
00334 for( kk=0 ; kk < nref ; kk++ ){
00335 rr[kk] = refc+kk*ntsc ; /* compute ptr */
00336 memcpy( rr[kk] , /* copy data */
00337 MRI_FLOAT_PTR(fd->ref_ts) + kk*fd->ref_ts->nx ,
00338 sizeof(float)*ntsc ) ;
00339 }
00340
00341 /* mark those places we will keep (where ref is OK) */
00342
00343 for( nkeep=0,ii=ignore ; ii < ntsc ; ii++ ){ /* for each time point */
00344 for( kk=0 ; kk < nref ; kk++ ) /* check each ref */
00345 if( rr[kk][ii] >= WAY_BIG ) break ;
00346
00347 if( kk == nref ) keep[nkeep++] = ii ; /* mark if all are OK */
00348 }
00349
00350 /* compress ref, eliminating non-keepers */
00351
00352 if( nkeep < ntsc ){
00353 for( ii=0 ; ii < nkeep ; ii++ ){
00354 for( kk=0 ; kk < nref ; kk++ )
00355 rr[kk][ii] = rr[kk][keep[ii]] ; /* copy backwards */
00356 }
00357 }
00358
00359 /* prepare each ref vector for rank processing */
00360
00361 for( kk=0 ; kk < nref ; kk++ )
00362 refv[kk] = spearman_rank_prepare( nkeep , rr[kk] ) ;
00363
00364 #if 0
00365 fprintf(stderr,"spearman_fimfunc: initialize ntsc=%d nkeep=%d nref=%d\n",
00366 ntsc,nkeep,nref);
00367 #endif
00368
00369 return ;
00370
00371 /*--- the ending call ---*/
00372
00373 } else {
00374 THD_3dim_dataset *dset = (THD_3dim_dataset *) val ;
00375 int kb = -n ;
00376
00377 free(tsc) ; tsc = NULL ; /* free workspaces */
00378 free(refc) ; refc = NULL ;
00379 free(refv) ; refv = NULL ;
00380 free(keep) ; keep = NULL ;
00381 free(rr) ; rr = NULL ;
00382 rank_order_float(0,NULL) ;
00383
00384 /* edit sub-brick statistical parameters and name */
00385
00386 EDIT_BRICK_TO_FICO( dset , kb , nkeep , (nref==1)?1:2 , 1 ) ;
00387 EDIT_BRICK_LABEL( dset , kb , "Spearman CC" ) ;
00388
00389 #if 0
00390 fprintf(stderr,"spearman_fimfunc: finalize with kb=%d\n",kb);
00391 #endif
00392
00393 return ;
00394 }
00395 }
00396
00397 /*--- the normal case [with data] ---*/
00398
00399 ncall++ ;
00400 #if 0
00401 if(ncall%1000==0) fprintf(stderr,"spearman_fimfunc: ncall=%d\n",ncall);
00402 #endif
00403
00404 /* copy input timeseries data (since we will mangle it) */
00405
00406 if( nkeep < ntsc )
00407 for( ii=0 ; ii < nkeep ; ii++ ) tsc[ii] = ts[keep[ii]]; /* the hard way */
00408 else
00409 memcpy(tsc,ts,sizeof(float)*ntsc) ; /* the easy way */
00410
00411 /* compute our single result */
00412
00413 v = (float *) val ;
00414 v[0] = spearman_rank_manycorr( nkeep , tsc , nref , refv , rr ) ;
00415
00416 return ;
00417 }
|
|
||||||||||||||||||||
|
Definition at line 223 of file afni_fimfunc.c. References r, and spearman_rank_prepare().
00224 {
00225 register int ii ;
00226 register float ss ; float xv ;
00227
00228 xv = spearman_rank_prepare( n , x ) ; if( xv <= 0.0 ) return 0.0 ;
00229
00230 for( ii=0,ss=0.0 ; ii < n ; ii++ ) ss += x[ii] * r[ii] ;
00231
00232 return ( ss/sqrt(rv*xv) ) ;
00233 }
|
|
||||||||||||||||||||||||
|
Definition at line 235 of file afni_fimfunc.c. References nr, r, spearman_rank_corr(), and spearman_rank_prepare(). Referenced by spearman_fimfunc().
00237 {
00238 register int ii ;
00239 register float ss ;
00240 int jj ;
00241 float bb , xv ;
00242
00243 if( nr == 1 ) return spearman_rank_corr( n,x,rv[0],r[0] ) ;
00244
00245 xv = spearman_rank_prepare( n , x ) ; if( xv <= 0.0 ) return 0.0 ;
00246
00247 for( jj=0,bb=0.0 ; jj < nr ; jj++ ){
00248 for( ii=0,ss=0.0 ; ii < n ; ii++ ) ss += x[ii] * r[jj][ii] ;
00249 ss /= sqrt(rv[jj]*xv) ;
00250 if( fabs(ss) > fabs(bb) ) bb = ss ;
00251 }
00252
00253 return bb ;
00254 }
|
|
||||||||||||
|
Definition at line 182 of file afni_fimfunc.c. References a, and rank_order_float().
00183 {
00184 register int ii ;
00185 register float rb , rs ;
00186
00187 rank_order_float( n , a ) ;
00188
00189 rb = 0.5*(n-1) ; rs=0.0 ;
00190 for( ii=0 ; ii < n ; ii++ ){
00191 a[ii] -= rb ;
00192 rs += a[ii]*a[ii] ;
00193 }
00194
00195 return rs ;
00196 }
|