Skip to content

AFNI/NIfTI Server

Sections
Personal tools
You are here: Home » AFNI » Documentation

Doxygen Source Code Documentation


Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search  

afni_pplug_2dfunc.c File Reference

#include "afni.h"
#include "parser.h"

Go to the source code of this file.


Defines

#define NUM_CHAIN   8
#define RR   17
#define SS   18
#define TT   19
#define UU   20
#define VV   21
#define WW   22
#define XX   23
#define YY   24
#define ZZ   25

Functions

char * F2D_main (PLUGIN_interface *)
void F2D_chainfunc (int, int, double, double, float *)
PLUGIN_interface * F2D_init (void)

Variables

char helpstring []
char alpha [27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
int num0D
int num2D
generic_func ** func0D
generic_func ** func2D
int numfunc
char ** funcname
int chain_do [NUM_CHAIN]
PARSER_codechain_pc [NUM_CHAIN]
int chain_dd [NUM_CHAIN]
generic_funcchain_ff [NUM_CHAIN]

Define Documentation

#define NUM_CHAIN   8
 

Definition at line 61 of file afni_pplug_2dfunc.c.

Referenced by F2D_chainfunc(), F2D_init(), and F2D_main().

#define RR   17
 

Definition at line 64 of file afni_pplug_2dfunc.c.

Referenced by F2D_chainfunc(), and F2D_main().

#define SS   18
 

Definition at line 65 of file afni_pplug_2dfunc.c.

Referenced by F2D_chainfunc().

#define TT   19
 

Definition at line 66 of file afni_pplug_2dfunc.c.

Referenced by F2D_chainfunc().

#define UU   20
 

Definition at line 67 of file afni_pplug_2dfunc.c.

Referenced by F2D_chainfunc().

#define VV   21
 

Definition at line 68 of file afni_pplug_2dfunc.c.

Referenced by F2D_chainfunc().

#define WW   22
 

Definition at line 69 of file afni_pplug_2dfunc.c.

Referenced by F2D_chainfunc().

#define XX   23
 

Definition at line 70 of file afni_pplug_2dfunc.c.

Referenced by F2D_chainfunc().

#define YY   24
 

Definition at line 71 of file afni_pplug_2dfunc.c.

Referenced by F2D_chainfunc().

#define ZZ   25
 

Definition at line 72 of file afni_pplug_2dfunc.c.

Referenced by F2D_chainfunc(), and F2D_main().


Function Documentation

void F2D_chainfunc int   ,
int   ,
double   ,
double   ,
float *   
[static]
 

Definition at line 293 of file afni_pplug_2dfunc.c.

References AFNI_CALL_0D_function, AFNI_CALL_2D_function, chain_dd, chain_do, chain_ff, free, malloc, NUM_CHAIN, PARSER_evaluate_vector(), PARSER_mark_symbols(), RR, SS, TT, UU, VV, WW, XX, YY, and ZZ.

Referenced by F2D_init().

00294 {
00295    int kk,ii,pp , ndo,nexp , nxy=nx*ny ;
00296    float * abc[NUM_CHAIN] , *aprev=ar , *rst,*uvw,*xyz ;
00297    double * atoz[26] , *tmp ;
00298 
00299    /* allocate image workspace */
00300 
00301    for( nexp=ndo=kk=0 ; kk < NUM_CHAIN ; kk++ ){
00302       if( chain_do[kk] ){
00303          abc[kk] = (float *) malloc(sizeof(float)*nxy) ;
00304          ndo++ ;
00305          if( chain_pc[kk] != NULL ) nexp++ ;
00306       } else {
00307          abc[kk] = NULL ;
00308       }
00309    }
00310 
00311    if( ndo == 0 ) return ;  /* nothing to do */
00312 
00313    /* expression workspace */
00314 
00315    if( nexp > 0 ){
00316       tmp = (double *) malloc(sizeof(double)*nx) ;
00317       for( ii=0 ; ii < 26 ; ii++)
00318          atoz[ii] = (double *) malloc(sizeof(double)*nx) ;
00319    }
00320 
00321    /* loop over chain links */
00322 
00323    for( kk=0 ; kk < NUM_CHAIN ; kk++ ){
00324      if( !chain_do[kk] ) continue ;     /* skip this link */
00325 
00326      switch( chain_dd[kk] ){
00327 
00328        case 0:                                      /* 0D func */
00329          memcpy( abc[kk] , aprev , sizeof(float)*nxy ) ;
00330 #if 0
00331          chain_ff[kk]( nxy , abc[kk] ) ;
00332 #else
00333          AFNI_CALL_0D_function( chain_ff[kk] , nxy,abc[kk] ) ;
00334 #endif
00335        break ;
00336 
00337        case 2:                                      /* 2D func */
00338          memcpy( abc[kk] , aprev , sizeof(float)*nxy ) ;
00339 #if 0
00340          chain_ff[kk]( nx,ny , dx,dy , abc[kk] ) ;
00341 #else
00342          AFNI_CALL_2D_function( chain_ff[kk] , nx,ny,dx,dy,abc[kk] ) ;
00343 #endif
00344        break ;
00345 
00346       case -1:{                                    /* Expr 3x3 */
00347         int hasym[26] , jj ;
00348 
00349         PARSER_mark_symbols( chain_pc[kk] , hasym ) ;  /* which symbols to load? */
00350 
00351         for( jj=0 ; jj < ny ; jj++ ){  /* loop over rows */
00352 
00353            uvw = aprev + jj*nx ;                     /* row containing u,v,w */
00354 
00355            rst = (jj == 0) ? uvw                     /* row containing r,s,t */
00356                            : aprev + (jj-1)*nx ;
00357 
00358            xyz = (jj == ny-1 ) ? uvw                 /* row containing x,y,z */
00359                                : aprev + (jj+1)*nx ;
00360 
00361            /* initialize all variables to 0 */
00362 
00363            for( pp=0 ; pp < 26 ; pp++){
00364              for( ii=0 ; ii < nx ; ii++ ) atoz[pp][ii] = 0.0 ;
00365            }
00366 
00367            /* load previous images */
00368 
00369            for( pp=0 ; pp < kk ; pp++ ){
00370              if( hasym[pp] ){
00371                for( ii=0 ; ii < nx ; ii++ )
00372                  atoz[pp][ii] = (double) abc[pp][ii+jj*nx] ;
00373              }
00374            }
00375 
00376            if( hasym[RR] ){                         /* load R */
00377              atoz[RR][0] = (double) rst[0] ;
00378              for( ii=1 ; ii < nx ; ii++ )
00379                atoz[RR][ii] = (double) rst[ii-1] ;
00380            }
00381 
00382            if( hasym[SS] ){                         /* load S */
00383              for( ii=0 ; ii < nx ; ii++ )
00384                atoz[SS][ii] = (double) rst[ii] ;
00385            }
00386 
00387            if( hasym[TT] ){                         /* load T */
00388              for( ii=0 ; ii < nx-1 ; ii++ )
00389                atoz[TT][ii] = (double) rst[ii+1] ;
00390              atoz[TT][nx-1] = (double) rst[nx-1] ;
00391            }
00392 
00393            if( hasym[UU] ){                         /* load U */
00394              atoz[UU][0] = (double) uvw[0] ;
00395              for( ii=1 ; ii < nx ; ii++ )
00396                atoz[UU][ii] = (double) uvw[ii-1] ;
00397            }
00398 
00399            if( hasym[VV] ){                         /* load V */
00400              for( ii=0 ; ii < nx ; ii++ )
00401                atoz[VV][ii] = (double) uvw[ii] ;
00402            }
00403 
00404            if( hasym[WW] ){                         /* load W */
00405              for( ii=0 ; ii < nx-1 ; ii++ )
00406                atoz[WW][ii] = (double) uvw[ii+1] ;
00407              atoz[WW][nx-1] = (double) uvw[nx-1] ;
00408            }
00409 
00410            if( hasym[XX] ){                         /* load X */
00411              atoz[XX][0] = (double) xyz[0] ;
00412              for( ii=1 ; ii < nx ; ii++ )
00413                atoz[XX][ii] = (double) xyz[ii-1] ;
00414            }
00415 
00416            if( hasym[YY] ){                         /* load Y */
00417              for( ii=0 ; ii < nx ; ii++ )
00418                atoz[YY][ii] = (double) xyz[ii] ;
00419            }
00420 
00421            if( hasym[ZZ] ){                         /* load Z */
00422              for( ii=0 ; ii < nx-1 ; ii++ )
00423                atoz[ZZ][ii] = (double) xyz[ii+1] ;
00424              atoz[ZZ][nx-1] = (double) xyz[nx-1] ;
00425            }
00426 
00427            /* compute this row! */
00428 
00429            PARSER_evaluate_vector( chain_pc[kk] , atoz , nx , tmp ) ;
00430 
00431            /* store back in output row */
00432 
00433            uvw = abc[kk] + jj*nx ;
00434            for( ii=0 ; ii < nx ; ii++ ) uvw[ii] = (float) tmp[ii] ;
00435 
00436         } /* end of loop over rows */
00437        }
00438        break ;
00439      }
00440 
00441      aprev = abc[kk] ;  /* for next time, this is previous image */
00442    }
00443 
00444    /* copy last result into input array: this is the result */
00445 
00446    memcpy( ar , aprev , sizeof(float)*nxy ) ;
00447 
00448    /* take out the trash */
00449 
00450    for( kk=0 ; kk < NUM_CHAIN ; kk++ )       /* images */
00451      if( abc[kk] != NULL ) free(abc[kk]) ;
00452 
00453    if( nexp > 0 ){
00454      for( ii=0 ; ii < 26 ; ii++ ) free(atoz[ii]) ;  /* expression variables */
00455      free(tmp) ;
00456    }
00457 
00458    return ;
00459 }

PLUGIN_interface* F2D_init void   
 

Definition at line 85 of file afni_pplug_2dfunc.c.

References AFMALL, AFNI_register_2D_function, alpha, chain_do, chain_ff, F2D_chainfunc(), F2D_main(), MCW_function_list::flags, func0D, func2D, funcname, MCW_function_list::funcs, generic_func, GLOBAL_library, helpstring, MCW_function_list::labels, malloc, n0, n2, MCW_function_list::num, num0D, num2D, NUM_CHAIN, numfunc, PLUTO_add_hint(), PLUTO_set_runlabels(), realloc, AFNI_library_type::registered_0D, and AFNI_library_type::registered_2D.

Referenced by AFNI_misc_CB().

00086 {
00087    PLUGIN_interface * plint ;     /* will be the output of this routine */
00088    int ii , num , ll ;
00089    char str[16] ;
00090    MCW_function_list * rlist ;
00091 
00092    /*---------------- set titles and call point ----------------*/
00093 
00094    plint = PLUTO_new_interface( "2D Chain Func" ,
00095                                 "Control 2DChain function" ,
00096                                 helpstring ,
00097                                 PLUGIN_CALL_VIA_MENU ,
00098                                 (char *(*)())F2D_main  ) ;
00099 
00100    PLUTO_add_hint( plint , "Control 2DChain function" ) ;
00101 
00102    PLUTO_set_runlabels( plint , "Set+Keep" , "Set+Close" ) ;  /* 04 Nov 2003 */
00103 
00104    /*-------- Initialize list of all functions that can be chained -----*/
00105 
00106    numfunc     = 1 ;
00107    funcname    = (char **) malloc(sizeof(char **)) ;
00108    funcname[0] = "Expr 3x3 -->" ;
00109 
00110    /*-------- Get list of pre-registered functions --------*/
00111 
00112    rlist = &(GLOBAL_library.registered_0D) ;
00113    num0D = rlist->num ;
00114    if( num0D > 0 ){
00115      int n0 = 0 ;
00116      funcname = (char **) realloc( funcname, sizeof(char **)*(numfunc+num0D) );
00117      func0D   = (generic_func **) malloc( sizeof(generic_func *)*num0D ) ;
00118      for( ii=0 ; ii < num0D ; ii++ ){
00119        if( rlist->flags[ii] == 0 ){            /* 18 Dec 2003: only allow "normal" funcs */
00120          ll = strlen(rlist->labels[ii]) ;
00121          funcname[numfunc] = AFMALL(char,ll+8) ;
00122          strcpy(funcname[numfunc],"0D: ") ;
00123          strcat(funcname[numfunc],rlist->labels[ii]) ;
00124          func0D[n0++] = rlist->funcs[ii] ;
00125          numfunc++ ;
00126        }
00127      }
00128      num0D = n0 ;
00129    }
00130 
00131    rlist = &(GLOBAL_library.registered_2D) ;
00132    num2D = rlist->num ;
00133    if( num2D > 0 ){
00134      int n2 = 0 ;
00135      funcname = (char **) realloc( funcname, sizeof(char **)*(numfunc+num2D) );
00136      func2D   = (generic_func **) malloc( sizeof(generic_func *)*num2D ) ;
00137      for( ii=0 ; ii < num2D ; ii++ ){
00138        if( rlist->flags[ii] == 0 ){            /* 18 Dec 2003: only allow "normal" funcs */
00139          ll = strlen(rlist->labels[ii]) ;
00140          funcname[numfunc] = AFMALL(char, ll+8) ;
00141          strcpy(funcname[numfunc],"2D: ") ;
00142          strcat(funcname[numfunc],rlist->labels[ii]) ;
00143          func2D[n2++] = rlist->funcs[ii] ;
00144          numfunc++ ;
00145        }
00146      }
00147      num2D = n2 ;
00148    }
00149 
00150    AFNI_register_2D_function( "2DChain" , F2D_chainfunc ) ;  /* add this only now */
00151 
00152    /*--------- make interface lines -----------*/
00153 
00154    for( ii=0 ; ii < NUM_CHAIN ; ii++ ){
00155 
00156       chain_do[ii] = 0 ;     /* off */
00157       chain_pc[ii] = NULL ;
00158       chain_ff[ii] = NULL ;
00159 
00160       str[0] = alpha[ii] ; str[1] = '\0' ;
00161 
00162       PLUTO_add_option( plint ,
00163                         str ,  /* label at left of input line */
00164                         str ,  /* tag to return to plugin */
00165                         FALSE  /* is this mandatory? */
00166                       ) ;
00167 
00168       PLUTO_add_string( plint , "Function"  ,
00169                         numfunc , funcname , 0 ) ;
00170 
00171       PLUTO_add_string( plint , "Expr 3x3" , 0,NULL,32 ) ;
00172    }
00173 
00174    /*--------- done with interface setup ---------*/
00175 
00176    return plint ;
00177 }

char * F2D_main PLUGIN_interface *    [static]
 

Definition at line 185 of file afni_pplug_2dfunc.c.

References alpha, chain_dd, chain_do, chain_ff, free, func0D, func2D, funcname, num0D, NUM_CHAIN, numfunc, PARSER_generate_code(), PARSER_mark_symbols(), PLUTO_string_index(), RR, and ZZ.

Referenced by F2D_init().

00186 {
00187    char *tag , *str ;
00188    int ii,kk,jj , ndone=0 ;
00189 
00190    /*-- turn off all rows --*/
00191 
00192    for( ii=0 ; ii < NUM_CHAIN ; ii++ ){
00193       chain_do[ii] = 0 ;
00194       chain_ff[ii] = NULL ;
00195       if( chain_pc[ii] != NULL ){ free(chain_pc[ii]); chain_pc[ii]=NULL; }
00196    }
00197 
00198    /*--------- loop over input lines ---------*/
00199 
00200    while(1){
00201       tag = PLUTO_get_optiontag(plint) ;  /* "A", "B", etc */
00202       if( tag == NULL ) break ;
00203 
00204       /* find which variable */
00205 
00206       for( kk=0 ; kk < NUM_CHAIN ; kk++ )
00207          if( tag[0] == alpha[kk] ) break ;
00208 
00209       if( kk >= NUM_CHAIN ) break ;       /* should not happen */
00210 
00211       chain_do[kk] = 1 ; ndone++ ;        /* mark to do this chain link */
00212 
00213       str = PLUTO_get_string(plint) ;                       /* function name */
00214       jj  = PLUTO_string_index( str , numfunc,funcname ) ;  /* index of function */
00215 
00216       if( jj < 0 || jj >= numfunc ){ /* should not happen */
00217 
00218          for( jj=0 ; jj < NUM_CHAIN ; jj++ ) chain_do[jj] = 0 ;
00219          return "** Internal Error **" ;
00220 
00221       } else if( jj == 0 ){          /* Expr 3x3 */
00222          int hasym[26] , ns ;
00223 
00224          str = PLUTO_get_string(plint) ;             /* get expression */
00225          chain_pc[kk] = PARSER_generate_code(str) ;  /* parse it */
00226          chain_dd[kk] = -1 ;                         /* code for this case */
00227 
00228          if( chain_pc[kk] == NULL ){
00229             for( jj=0 ; jj < NUM_CHAIN ; jj++ ) chain_do[jj] = 0 ;
00230             return "** Expr 3x3 parser error **" ;
00231          }
00232 
00233          /* check symbol usage */
00234 
00235          PARSER_mark_symbols( chain_pc[kk] , hasym ) ;
00236 
00237          for( ii=0 ; ii < kk ; ii++ ){                 /* previous */
00238            if( hasym[ii] && chain_do[ii] == 0 ){
00239                for( jj=0 ; jj < NUM_CHAIN ; jj++ ) chain_do[jj] = 0 ;
00240                return "** Expr 3x3 uses inactive symbol **" ;
00241             }
00242          }
00243 
00244          if( hasym[kk] ){                              /* current */
00245             for( jj=0 ; jj < NUM_CHAIN ; jj++ ) chain_do[jj] = 0 ;
00246             return "** Expr 3x3 uses current symbol **" ;
00247          }
00248 
00249          for( ii=kk+1 ; ii < NUM_CHAIN  ; ii++ ){      /* subsequent */
00250             if( hasym[ii] ){
00251                for( jj=0 ; jj < NUM_CHAIN ; jj++ ) chain_do[jj] = 0 ;
00252                return "** Expr 3x3 uses subsequent symbol **" ;
00253             }
00254          }
00255 
00256          for( ii=NUM_CHAIN ; ii < RR ; ii++ ){         /* undefined */
00257             if( hasym[ii] ){
00258                for( jj=0 ; jj < NUM_CHAIN ; jj++ ) chain_do[jj] = 0 ;
00259                return "** Expr 3x3 uses undefined symbol **" ;
00260             }
00261          }
00262 
00263          for( ns=ii=0 ; ii < kk ; ii++ ) if( hasym[ii] ) ns++ ;
00264          for( ii=RR   ; ii <=ZZ ; ii++ ) if( hasym[ii] ) ns++ ;
00265 
00266          if( ns == 0 ){
00267             for( jj=0 ; jj < NUM_CHAIN ; jj++ ) chain_do[jj] = 0 ;
00268             return "** Expr 3x3 doesn't use any symbols **" ;
00269          }
00270 
00271       } else if( jj >= 1 && jj <= num0D ){   /* 0D function */
00272 
00273          chain_dd[kk] = 0 ;            /* code for 0D */
00274          chain_ff[kk] = func0D[jj-1] ;
00275 
00276       } else {                               /* 2D function */
00277 
00278          chain_dd[kk] = 2 ;            /* code for 2D */
00279          chain_ff[kk] = func2D[jj-num0D-1] ;
00280       }
00281 
00282    } /* end of while(1) loop over option lines */
00283 
00284    /*--------- finished -------*/
00285 
00286    if( ndone == 0 ) return " \n** Don't you want to do anything? **\n " ;
00287 
00288    return NULL ;
00289 }

Variable Documentation

char alpha[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" [static]
 

Definition at line 62 of file afni_pplug_2dfunc.c.

Referenced by F2D_init(), and F2D_main().

int chain_dd[NUM_CHAIN] [static]
 

Definition at line 82 of file afni_pplug_2dfunc.c.

Referenced by F2D_chainfunc(), and F2D_main().

int chain_do[NUM_CHAIN] [static]
 

Definition at line 80 of file afni_pplug_2dfunc.c.

Referenced by F2D_chainfunc(), F2D_init(), and F2D_main().

generic_func* chain_ff[NUM_CHAIN] [static]
 

Definition at line 83 of file afni_pplug_2dfunc.c.

Referenced by F2D_chainfunc(), F2D_init(), and F2D_main().

PARSER_code* chain_pc[NUM_CHAIN] [static]
 

Definition at line 81 of file afni_pplug_2dfunc.c.

generic_func** func0D [static]
 

Definition at line 75 of file afni_pplug_2dfunc.c.

Referenced by F2D_init(), and F2D_main().

generic_func ** func2D [static]
 

Definition at line 75 of file afni_pplug_2dfunc.c.

Referenced by F2D_init(), and F2D_main().

char** funcname [static]
 

Definition at line 78 of file afni_pplug_2dfunc.c.

Referenced by F2D_init(), and F2D_main().

char helpstring[] [static]
 

Initial value:

  "Purpose: control the 2DChain function\n"
  "\n"
  "The 2DChain transformation allows you to chain together a sequence\n"
  "of up to 8 other 0D or 2D transformation functions.  Each row of\n"
  "the input form controls one transformation.  If it is toggled ON,\n"
  "then you can choose from a menu of functions.  Each ON function is\n"
  "applied in turn.\n"
  "\n"
  "The special 'Expr 3x3' function lets you compute any expression\n"
  "that depends on the local 3x3 neighborhood of each pixel, where\n"
  "the expression is entered (a la 3dcalc) in the string field at\n"
  "the right of the form.  The variable names that may be used in\n"
  "the expresssion are:\n"
  "                        r s t\n"
  "                        u v w\n"
  "                        x y z\n"
  "\n"
  "where 'v' is the center pixel.  You may also use as a variable\n"
  "any name from previous active chain links (e.g., A,B,C, ...).\n"
  "For example, on line C, if you select 'Expr 3x3' as the function\n"
  "and enter\n"
  "             (r+s+t+u+v+w+x+y+z)/9-A\n"
  "\n"
  "for the expression, this will evaluate the average of the 9\n"
  "local pixels and subtract the output of chain link A.\n"
  "On line C, you cannot use variables C or higher, since they\n"
  "won't have been calculated at the time C is being computed.\n"
  "\n"
  "Author -- RW Cox -- July 2000"

Definition at line 20 of file afni_pplug_2dfunc.c.

Referenced by F2D_init().

int num0D [static]
 

Definition at line 74 of file afni_pplug_2dfunc.c.

Referenced by F2D_init(), and F2D_main().

int num2D [static]
 

Definition at line 74 of file afni_pplug_2dfunc.c.

Referenced by F2D_init().

int numfunc [static]
 

Definition at line 77 of file afni_pplug_2dfunc.c.

Referenced by F2D_init(), and F2D_main().

 

Powered by Plone

This site conforms to the following standards: