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  

plug_second_dataset.c

Go to the documentation of this file.
00001 /*****************************************************************************
00002    Major portions of this software are copyrighted by the Medical College
00003    of Wisconsin, 1994-2000, and are released under the Gnu General Public
00004    License, Version 2.  See the file README.Copyright for details.
00005 ******************************************************************************/
00006    
00007 #include "afni.h"
00008 
00009 #ifndef ALLOW_PLUGINS
00010 #  error "Plugins not properly set up -- see machdep.h"
00011 #endif
00012 
00013 #define DSET2_VERSION   "Version 1.1 <October, 2002>"
00014 
00015 /***********************************************************************
00016   Plugin to provide a 2nd dataset's timeseries in place of first
00017 ************************************************************************/
00018 
00019 /*----------------------------------------------------------------------
00020  * history:
00021  *
00022  * 1.1  October 25, 2002  - rickr
00023  * - register for RECEIVE_DSETCHANGE messages
00024  * - update global dset from global g_id (upon message reception)
00025  *----------------------------------------------------------------------
00026 */
00027 
00028 char * DSET2_main( PLUGIN_interface *) ;
00029 void   DSET2_func( int num , double to,double dt, float * vec ) ;
00030 void   DSET2_dset_recv( int why, int np, int * ijk, void * aux ) ;
00031 
00032 static char helpstring[] =
00033    " Purpose: Control the 'Dataset#2' 1D timeseries function\n"
00034    "\n"
00035    " Dataset = a 3D+time dataset from which to extract data\n"
00036    "\n"
00037    " Justify = Left  means to put timeseries data at start of output array\n"
00038    "           Right means to put timeseries data at end of output array\n"
00039    "\n"
00040    " Fill    = Extend means to copy the last value\n"
00041    "           Zero   means to fill with zeros\n"
00042    "\n"
00043    " Justify and Fill are only used when the number of points in the input\n"
00044    " dataset doesn't match the number of points in the timeseries being replaced.\n"
00045    " Let M = length of dataset, N = length of timeseries,\n"
00046    " ts[] = timeseries array, ds[] = dataset array.\n"
00047    "\n"
00048    " Case: M < N (too little data to fill timeseries)\n"
00049    "    Left: ts[i] = ds[i]    i=0..M-1                        Data goes to left\n"
00050    "                = ds[M-1]  i=M..N-1 if Extend              edge of timeseries\n"
00051    "                = 0.0      i=M..N-1 if Zero\n"
00052    "   Right: ts[i] = ds[0]    i=0..J-1 if Extend (with J=N-M) Data goes to right\n"
00053    "                = 0.0      i=0..J-1 if Zero                edge of timeseries\n"
00054    "                = ds[i-J]  i=J..N-1\n"
00055    " Case: M > N (too much data for timeseries)\n"
00056    "    Left: ts[i] = ds[i]    i=0..N-1                        Left data to ts[]\n"
00057    "   Right: ts[i] = ds[i+J]  i=0..N-1 (with J=M-N)           Right data to ts[]\n"
00058    "\n"
00059    " -- RWCox - 18 May 2000\n"
00060 ;
00061 
00062 static THD_3dim_dataset * dset = NULL ;
00063 static MCW_idcode         g_id;
00064 static int                g_dset_recv = -1 ;
00065 static int                justify     =  0 ;
00066 static int                fill        =  0 ;
00067 
00068 /***********************************************************************
00069    Set up the interface to the user
00070 ************************************************************************/
00071 
00072 static char *lr[2] = { "Left" , "Right" } ;
00073 static char *ez[2] = { "Extend" , "Zero" } ;
00074 
00075 static PLUGIN_interface * plint=NULL ;
00076 
00077 static void DSET2_func_init(void)   /* 21 Jul 2003 */
00078 {
00079    PLUG_startup_plugin_CB( NULL , (XtPointer)plint , NULL ) ;
00080 }
00081 
00082 
00083 DEFINE_PLUGIN_PROTOTYPE
00084 
00085 PLUGIN_interface * PLUGIN_init( int ncall )
00086 {
00087 
00088 ENTRY("PLUGIN_init - Dataset#2") ;
00089 
00090    if( ncall > 0 ) RETURN( NULL ) ;  /* only one interface */
00091 
00092    AFNI_register_nD_function ( 1 , "Dataset#2" , (generic_func *)DSET2_func ,
00093                                NEEDS_DSET_INDEX ) ;
00094    AFNI_register_nD_func_init( 1 , (generic_func *)DSET2_func_init ) ;  /* 21 Jul 2003 */
00095 
00096    plint = PLUTO_new_interface( "Dataset#2" , "Controls 1D function Dataset#2" , helpstring ,
00097                                  PLUGIN_CALL_VIA_MENU , DSET2_main  ) ;
00098 
00099    PLUTO_add_hint( plint , "Controls 1D function Dataset#2" ) ;
00100 
00101    PLUTO_set_runlabels( plint , "Set+Keep" , "Set+Close" ) ;  /* 04 Nov 2003 */
00102 
00103    PLUTO_set_sequence( plint , "A:funcs:dataset#2" ) ;
00104 
00105    PLUTO_add_option( plint , "Input" , "Input" , TRUE ) ;
00106    PLUTO_add_dataset(plint , "Dataset" ,
00107                                     ANAT_ALL_MASK , FUNC_ALL_MASK ,
00108                                     DIMEN_4D_MASK | BRICK_ALLREAL_MASK ) ;
00109 
00110    PLUTO_add_option( plint , "Where" , "Where" , TRUE ) ;
00111    PLUTO_add_string( plint, "Justify", 2, lr, justify ) ;
00112 
00113    PLUTO_add_option( plint , "How" , "How" , TRUE ) ;
00114    PLUTO_add_string( plint, "Fill", 2, ez, fill ) ;
00115 
00116    RETURN( plint ) ;
00117 }
00118 
00119 /***************************************************************************
00120   Main routine for this plugin (will be called from AFNI).
00121 ****************************************************************************/
00122 
00123 char * DSET2_main( PLUGIN_interface * plint )
00124 {
00125    MCW_idcode * idc ;
00126    char       * str ;
00127 
00128 ENTRY("DSET2_main") ;
00129 
00130    if( plint == NULL )
00131       RETURN("***********************\n"
00132              "DSET2_main:  NULL input\n"
00133              "***********************") ;
00134 
00135    PLUTO_next_option(plint) ;
00136    idc  = PLUTO_get_idcode(plint) ;
00137    dset = PLUTO_find_dset(idc) ;
00138    if( dset == NULL )
00139       RETURN("******************************\n"
00140              "DSET2_main:  bad input dataset\n"
00141              "******************************") ;
00142 
00143    g_id = *idc ;                        /* make a copy of the MCW_idcode */
00144 
00145    PLUTO_next_option(plint) ;
00146    str = PLUTO_get_string(plint) ;
00147    justify = (strcmp(str,lr[0]) != 0) ;
00148 
00149    PLUTO_next_option(plint) ;
00150    str = PLUTO_get_string(plint) ;
00151    fill = (strcmp(str,ez[0]) != 0) ;
00152 
00153    if ( g_dset_recv < 0 )       /* only initialize once */
00154        g_dset_recv = AFNI_receive_init( plint->im3d, RECEIVE_DSETCHANGE_MASK,
00155                                         DSET2_dset_recv, (void *)plint ,
00156                                        "DSET2_dset_recv" ) ;
00157 
00158    if ( g_dset_recv < 0 )
00159       RETURN("*************************************\n"
00160              "DSET2_main:  failed AFNI_receive_init\n"
00161              "*************************************") ;
00162 
00163    RETURN(NULL) ;
00164 }
00165 
00166 /*----------------------------------------------------------------------------*/
00167 
00168 void DSET2_dset_recv( int why, int np, int * ijk, void * aux )
00169 {
00170     PLUGIN_interface * plint = (PLUGIN_interface *)aux;
00171 
00172 ENTRY( "DSET2_dset_recv" );
00173 
00174     switch ( why )
00175     {
00176         default:
00177         {
00178             fprintf( stderr, "warning: DSET2_dset_recv() called with invalid "
00179                              "why code, %d\n", why );
00180             EXRETURN;
00181         }
00182 
00183         case RECEIVE_ALTERATION:    /* may take effect before DSETCHANGE */
00184         case RECEIVE_DSETCHANGE:
00185         {
00186             /* update global dset with idcode */
00187             if ( ! ISZERO_IDCODE( g_id ) )
00188             {
00189                 dset = PLUTO_find_dset( &g_id );
00190 
00191                 if( !ISVALID_DSET(dset) )       /* dset has disappeared */
00192                 {
00193                     ZERO_IDCODE( g_id );
00194                     dset = NULL;
00195                 }
00196             }
00197             else
00198                 dset = NULL;
00199 
00200             if ( dset == NULL ) /* shutdown messaging, must re-run plugin */
00201             {
00202                 AFNI_receive_control( plint->im3d, g_dset_recv,
00203                                       EVERYTHING_SHUTDOWN, NULL );
00204                 g_dset_recv = -1;
00205                 PLUTO_popup_worker( plint,
00206                                         "Warning: plugin 'Dataset#2'\n"
00207                                         "has lost its dataset link.\n"
00208                                         "To plot a 1-D overlay, please\n"
00209                                         "re-run the plugin.",
00210                                     MCW_USER_KILL | MCW_TIMER_KILL ) ;
00211             }
00212         }
00213     }
00214 
00215     EXRETURN;
00216 }
00217 
00218 /*----------------------------------------------------------------------------*/
00219 
00220 void DSET2_func( int num , double to,double dt, float * vec )
00221 {
00222    int ii , ijk , jj ;
00223    MRI_IMAGE * tsim ;
00224    float val ;
00225 
00226 ENTRY("DSET2_func") ;
00227 
00228    if( !ISVALID_DSET(dset) ) EXRETURN ;              /* nothing to do */
00229 
00230    DSET_load(dset) ;                                 /* if needed */
00231 
00232    ijk = AFNI_needs_dset_ijk() ;                     /* voxel index from AFNI */
00233 
00234    tsim = THD_extract_series( ijk , dset , 0 ) ;     /* get data */
00235 
00236    if( tsim == NULL ) EXRETURN ;                     /* bad news */
00237 
00238    if( tsim->nx == num ){                            /* exact fit */
00239 
00240       memcpy(vec,MRI_FLOAT_PTR(tsim),sizeof(float)*num) ;  /* copy data */
00241 
00242    } else if( tsim->nx < num ){                      /* too little data */
00243 
00244       if( justify == 0 ){                            /* left justify */
00245          memcpy(vec,MRI_FLOAT_PTR(tsim),sizeof(float)*tsim->nx) ;
00246 
00247          val = (fill == 0) ? vec[tsim->nx-1]         /* extend fill */
00248                            : 0.0             ;       /* zero fill   */
00249 
00250          for( ii=tsim->nx ; ii < num ; ii++ ) vec[ii] = val ;
00251 
00252       } else {                                       /* right justify */
00253          jj = num - tsim->nx ;
00254          memcpy(vec+jj,MRI_FLOAT_PTR(tsim),sizeof(float)*tsim->nx) ;
00255 
00256          val = (fill == 0) ? vec[jj]                 /* extend fill */
00257                            : 0.0     ;               /* zero fill   */
00258 
00259          for( ii=0 ; ii < jj ; ii++ ) vec[ii] = val ;
00260       }
00261 
00262    } else {                                          /* too much data */
00263 
00264       if( justify == 0 ){                            /* left justify */
00265          memcpy(vec,MRI_FLOAT_PTR(tsim),sizeof(float)*num) ;
00266       } else {
00267          jj = tsim->nx - num ;
00268          memcpy(vec,MRI_FLOAT_PTR(tsim)+jj,sizeof(float)*num) ;
00269       }
00270    }
00271 
00272    mri_free(tsim) ;                                  /* toss the trash */
00273    EXRETURN ;
00274 }
 

Powered by Plone

This site conforms to the following standards: