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_scatplot.c File Reference

#include "afni.h"

Go to the source code of this file.


Functions

char * SCAT_main (PLUGIN_interface *)
DEFINE_PLUGIN_PROTOTYPE PLUGIN_interface * PLUGIN_init (int ncall)

Variables

char helpstring []

Function Documentation

DEFINE_PLUGIN_PROTOTYPE PLUGIN_interface* PLUGIN_init int    ncall
 

Definition at line 55 of file plug_scatplot.c.

References ANAT_ALL_MASK, FUNC_ALL_MASK, helpstring, PLUTO_add_hint(), PLUTO_set_runlabels(), PLUTO_set_sequence(), and SCAT_main().

00056 {
00057    PLUGIN_interface * plint ;
00058 
00059    if( ncall > 0 ) return NULL ;  /* only one interface */
00060 
00061    /*-- set titles and call point --*/
00062 
00063    plint = PLUTO_new_interface( "ScatterPlot" ,
00064                                 "ScatterPlot of 2 Bricks" ,
00065                                 helpstring ,
00066                                 PLUGIN_CALL_VIA_MENU , SCAT_main  ) ;
00067 
00068    PLUTO_add_hint( plint , "Of 2 Bricks" ) ;
00069 
00070    PLUTO_set_sequence( plint , "A:afniinfo:dset" ) ;
00071 
00072    PLUTO_set_runlabels( plint , "Plot+Keep" , "Plot+Close" ) ;  /* 04 Nov 2003 */
00073 
00074    /*-- first line of input --*/
00075 
00076    PLUTO_add_option( plint , "Source x" , "Source x" , TRUE ) ;
00077    PLUTO_add_dataset(plint , "Dataset" ,
00078                                     ANAT_ALL_MASK , FUNC_ALL_MASK ,
00079                                     DIMEN_ALL_MASK | BRICK_ALLREAL_MASK ) ;
00080    PLUTO_add_number( plint , "Sub-brick" , 0,9999,0 , 0,1 ) ;
00081    PLUTO_add_number( plint , "Bottom" , -99999,99999, 0,  1,1 ) ;
00082    PLUTO_add_number( plint , "Top"    , -99999,99999, 0, -1,1 ) ;
00083 
00084    /*-- second line of input --*/
00085 
00086    PLUTO_add_option( plint , "Source y" , "Source y" , TRUE ) ;
00087    PLUTO_add_dataset(plint , "Dataset" ,
00088                                     ANAT_ALL_MASK , FUNC_ALL_MASK ,
00089                                     DIMEN_ALL_MASK | BRICK_ALLREAL_MASK ) ;
00090    PLUTO_add_number( plint , "Sub-brick" , 0,9999,0 , 0,1 ) ;
00091    PLUTO_add_number( plint , "Bottom" , -99999,99999, 0,  1,1 ) ;
00092    PLUTO_add_number( plint , "Top"    , -99999,99999, 0, -1,1 ) ;
00093 
00094    /*-- third line of input --*/
00095 
00096    PLUTO_add_option( plint , "Mask" , "Mask" , FALSE ) ;
00097    PLUTO_add_dataset( plint , "Dataset" ,
00098                                     ANAT_ALL_MASK , FUNC_ALL_MASK ,
00099                                     DIMEN_ALL_MASK | BRICK_ALLREAL_MASK ) ;
00100    PLUTO_add_number( plint , "Sub-brick" , 0,9999,0 , 0,1 ) ;
00101    PLUTO_add_number( plint , "Bottom" , -99999,99999, 0,  1,1 ) ;
00102    PLUTO_add_number( plint , "Top"    , -99999,99999, 0, -1,1 ) ;
00103 
00104    return plint ;
00105 }

char * SCAT_main PLUGIN_interface *   
 

Definition at line 111 of file plug_scatplot.c.

References a, AV_fval_to_char(), DSET_ARRAY, DSET_BRICK_FACTOR, DSET_BRICK_TYPE, DSET_FILECODE, DSET_load, DSET_NVALS, DSET_NVOX, DSET_unload, EQUIV_DSETS, free, malloc, mmm, pcor, PLUTO_find_dset(), PLUTO_scatterplot(), THD_countmask(), THD_makemask(), and THD_MAX_NAME.

Referenced by PLUGIN_init().

00112 {
00113    MCW_idcode *idc ;
00114    THD_3dim_dataset *xdset, *ydset , *mask_dset=NULL ;
00115    int ivx,ivy , mcount , nvox , ii,jj , nbin=-1 ;
00116    float mask_bot=666.0 , mask_top=-666.0 ;
00117    float xbot,xtop , ybot,ytop , pcor=0 , a=0,b=0 ;
00118    char *tag , *str ;
00119    char xlab[THD_MAX_NAME],ylab[THD_MAX_NAME],tlab[THD_MAX_NAME] ;
00120    char ab[16] , bb[16] , *pab,*pbb ;
00121    byte *mmm ;
00122    float *xar , *yar ;
00123 
00124    char *cname=NULL ;  /* 06 Aug 1998 */
00125    int miv=0 ;
00126 
00127    /*--------------------------------------------------------------------*/
00128    /*----- Check inputs from AFNI to see if they are reasonable-ish -----*/
00129 
00130    if( plint == NULL )
00131       return "**********************\n"
00132              "SCAT_main:  NULL input\n"
00133              "**********************"  ;
00134 
00135    /*-- read x dataset line --*/
00136 
00137    PLUTO_next_option(plint) ;
00138    idc   = PLUTO_get_idcode(plint) ;
00139    xdset = PLUTO_find_dset(idc) ;
00140    if( xdset == NULL )
00141       return "*************************\n"
00142              "SCAT_main:  bad x dataset\n"
00143              "*************************"  ;
00144 
00145    ivx = (int) PLUTO_get_number(plint) ;
00146    if( ivx >= DSET_NVALS(xdset) || ivx < 0 )
00147       return "***************************\n"
00148              "SCAT_main:  bad x sub-brick\n"
00149              "***************************" ;
00150 
00151    DSET_load(xdset) ;
00152    if( DSET_ARRAY(xdset,ivx) == NULL )
00153       return "********************************\n"
00154              "SCAT_main:  can't load x dataset\n"
00155              "********************************"  ;
00156    nvox = DSET_NVOX(xdset) ;
00157 
00158    xbot = PLUTO_get_number(plint) ;
00159    xtop = PLUTO_get_number(plint) ;
00160 
00161    /*-- read y dataset line --*/
00162 
00163    PLUTO_next_option(plint) ;
00164    idc   = PLUTO_get_idcode(plint) ;
00165    ydset = PLUTO_find_dset(idc) ;
00166    if( ydset == NULL )
00167       return "*************************\n"
00168              "SCAT_main:  bad y dataset\n"
00169              "*************************"  ;
00170 
00171    ivy = (int) PLUTO_get_number(plint) ;
00172    if( ivy >= DSET_NVALS(ydset) || ivy < 0 )
00173       return "***************************\n"
00174              "SCAT_main:  bad y sub-brick\n"
00175              "***************************" ;
00176 
00177    if( DSET_NVOX(ydset) != nvox )
00178       return "************************************************\n"
00179              "SCAT_main:  x and y datasets don't match in size\n"
00180              "************************************************" ;
00181 
00182    DSET_load(ydset) ;
00183    if( DSET_ARRAY(ydset,ivy) == NULL )
00184       return "********************************\n"
00185              "SCAT_main:  can't load y dataset\n"
00186              "********************************"  ;
00187 
00188    ybot = PLUTO_get_number(plint) ;
00189    ytop = PLUTO_get_number(plint) ;
00190 
00191    /*-- read optional line(s) --*/
00192 
00193    while( (tag=PLUTO_get_optiontag(plint)) != NULL ){
00194 
00195       /*-- Mask dataset --*/
00196 
00197       if( strcmp(tag,"Mask") == 0 ){
00198 
00199          idc       = PLUTO_get_idcode(plint) ;
00200          mask_dset = PLUTO_find_dset(idc) ;
00201 
00202          if( mask_dset == NULL )
00203             return "****************************\n"
00204                    "SCAT_main:  bad mask dataset\n"
00205                    "****************************"  ;
00206 
00207          if( DSET_NVOX(mask_dset) != nvox )
00208            return "**********************************************************\n"
00209                   "SCAT_main: mask input dataset doesn't match source dataset\n"
00210                   "**********************************************************" ;
00211 
00212          miv = (int) PLUTO_get_number(plint) ;  /* 06 Aug 1998 */
00213          if( miv >= DSET_NVALS(mask_dset) || miv < 0 )
00214             return "**************************************************\n"
00215                    "SCAT_main: mask dataset sub-brick index is illegal\n"
00216                    "**************************************************"  ;
00217 
00218          DSET_load(mask_dset) ;
00219          if( DSET_ARRAY(mask_dset,miv) == NULL )
00220             return "***********************************\n"
00221                    "SCAT_main:  can't load mask dataset\n"
00222                    "***********************************"  ;
00223 
00224          mask_bot = PLUTO_get_number(plint) ;
00225          mask_top = PLUTO_get_number(plint) ;
00226          continue ;
00227       }
00228    }
00229 
00230    /*------------------------------------------------------*/
00231    /*---------- At this point, the inputs are OK ----------*/
00232 
00233    /*-- build the byte mask array --*/
00234 
00235    if( mask_dset == NULL ){
00236       mmm = (byte *) malloc( sizeof(byte) * nvox ) ;
00237       if( mmm == NULL )
00238          return " \n*** Can't malloc workspace for mask! ***\n" ;
00239       memset( mmm , 1, nvox ) ; mcount = nvox ;
00240    } else {
00241 
00242       mmm = THD_makemask( mask_dset , miv , mask_bot , mask_top ) ;
00243       if( mmm == NULL )
00244          return " \n*** Can't make mask for some reason! ***\n" ;
00245       mcount = THD_countmask( nvox , mmm ) ;
00246 
00247       if( !EQUIV_DSETS(mask_dset,xdset) &&
00248           !EQUIV_DSETS(mask_dset,ydset)   ) DSET_unload(mask_dset) ;
00249 
00250       if( mcount < 3 ){
00251          free(mmm) ;
00252          return " \n*** Less than 3 voxels survive the mask! ***\n" ;
00253       }
00254    }
00255 
00256    /*-- allocate the space for the data to be plotted --*/
00257 
00258    xar = (float *) malloc(sizeof(float)*mcount) ;
00259    yar = (float *) malloc(sizeof(float)*mcount) ;
00260 
00261    /*-- load values into x array --*/
00262 
00263    switch( DSET_BRICK_TYPE(xdset,ivx) ){
00264       case MRI_short:{
00265          short *bar = (short *) DSET_ARRAY(xdset,ivx) ;
00266          float mfac = DSET_BRICK_FACTOR(xdset,ivx) ;
00267          if( mfac == 0.0 ) mfac = 1.0 ;
00268          for( ii=jj=0 ; ii < nvox ; ii++ )
00269             if( mmm[ii] ) xar[jj++] = mfac*bar[ii] ;
00270       }
00271       break ;
00272 
00273       case MRI_byte:{
00274          byte *bar = (byte *) DSET_ARRAY(xdset,ivx) ;
00275          float mfac = DSET_BRICK_FACTOR(xdset,ivx) ;
00276          if( mfac == 0.0 ) mfac = 1.0 ;
00277          for( ii=jj=0 ; ii < nvox ; ii++ )
00278             if( mmm[ii] ) xar[jj++] = mfac*bar[ii] ;
00279       }
00280       break ;
00281 
00282       case MRI_float:{
00283          float *bar = (float *) DSET_ARRAY(xdset,ivx) ;
00284          float mfac = DSET_BRICK_FACTOR(xdset,ivx) ;
00285          if( mfac == 0.0 ) mfac = 1.0 ;
00286          for( ii=jj=0 ; ii < nvox ; ii++ )
00287             if( mmm[ii] ) xar[jj++] = mfac*bar[ii] ;
00288       }
00289       break ;
00290    }
00291 
00292    /*-- load values into y array --*/
00293 
00294    switch( DSET_BRICK_TYPE(ydset,ivy) ){
00295       case MRI_short:{
00296          short *bar = (short *) DSET_ARRAY(ydset,ivy) ;
00297          float mfac = DSET_BRICK_FACTOR(ydset,ivy) ;
00298          if( mfac == 0.0 ) mfac = 1.0 ;
00299          for( ii=jj=0 ; ii < nvox ; ii++ )
00300             if( mmm[ii] ) yar[jj++] = mfac*bar[ii] ;
00301       }
00302       break ;
00303 
00304       case MRI_byte:{
00305          byte *bar = (byte *) DSET_ARRAY(ydset,ivy) ;
00306          float mfac = DSET_BRICK_FACTOR(ydset,ivy) ;
00307          if( mfac == 0.0 ) mfac = 1.0 ;
00308          for( ii=jj=0 ; ii < nvox ; ii++ )
00309             if( mmm[ii] ) yar[jj++] = mfac*bar[ii] ;
00310       }
00311       break ;
00312 
00313       case MRI_float:{
00314          float *bar = (float *) DSET_ARRAY(ydset,ivy) ;
00315          float mfac = DSET_BRICK_FACTOR(ydset,ivy) ;
00316          if( mfac == 0.0 ) mfac = 1.0 ;
00317          for( ii=jj=0 ; ii < nvox ; ii++ )
00318             if( mmm[ii] ) yar[jj++] = mfac*bar[ii] ;
00319       }
00320       break ;
00321    }
00322 
00323    /* remove those voxels that aren't in the data ranges for both datasets */
00324 
00325    if( xbot < xtop || ybot < ytop ){
00326       int nm ; float *tar ;
00327 
00328       /* make the mask of those that survive the x range */
00329 
00330       if( xbot < xtop ){
00331          for( jj=0 ; jj < mcount ; jj++ )
00332             mmm[jj] = ( xar[jj] >= xbot && xar[jj] <= xtop ) ;
00333       } else {
00334          memset( mmm , 1 , mcount ) ;
00335       }
00336 
00337       /* and hit that mask with the y range */
00338 
00339       if( ybot < ytop ){
00340          for( jj=0 ; jj < mcount ; jj++ )
00341             if( mmm[jj] )
00342                mmm[jj] = ( yar[jj] >= ybot && yar[jj] <= ytop ) ;
00343       }
00344 
00345       nm = THD_countmask( mcount , mmm ) ;  /* how many are left */
00346 
00347       if( nm < 1 ){
00348          free(mmm) ; free(xar) ; free(yar) ;
00349          return " \n*** No values survive to be plotted! ***\n" ;
00350       }
00351 
00352       /* copy survivors into new lists and free old lists */
00353 
00354       if( nm < mcount ){  /* we actually lost some points */
00355          tar = (float *) malloc(sizeof(float)*nm) ;
00356          for( ii=jj=0 ; ii < mcount ; ii++ )
00357             if( mmm[ii] ) tar[jj++] = xar[ii] ;
00358          free(xar) ; xar = tar ;
00359 
00360          tar = (float *) malloc(sizeof(float)*nm) ;
00361          for( ii=jj=0 ; ii < mcount ; ii++ )
00362             if( mmm[ii] ) tar[jj++] = yar[ii] ;
00363          free(yar) ; yar = tar ;
00364 
00365          mcount = nm ;
00366       }
00367    }
00368 
00369    free(mmm) ;  /* don't need this no more */
00370 
00371    if( mcount > 4000000 ){
00372       static char msg[128] ;
00373       free(xar) ; free(yar) ;
00374       sprintf(msg," \n*** Attempt to scatterplot %d points!\n"
00375                      "*** Maximum allowed is     4000000.\n" , mcount ) ;
00376       return msg ;
00377    }
00378 
00379    /* compute the labels for the plot */
00380 
00381    if( xbot >= xtop ){
00382       sprintf( xlab , "\\noesc %s[%d]" , DSET_FILECODE(xdset),ivx ) ;
00383    } else {
00384       AV_fval_to_char(xbot,ab) ; AV_fval_to_char(xtop,bb) ;
00385       pab = ab ; if( *pab == ' ' ) pab++ ;
00386       pbb = bb ; if( *pbb == ' ' ) pbb++ ;
00387       sprintf( xlab , "\\noesc %s[%d]<%s..%s>" , DSET_FILECODE(xdset),ivx,pab,pbb ) ;
00388    }
00389 
00390    if( ybot >= ytop ){
00391       sprintf( ylab , "%s[%d]" , DSET_FILECODE(ydset),ivy ) ;
00392    } else {
00393       AV_fval_to_char(ybot,ab) ; AV_fval_to_char(ytop,bb) ;
00394       pab = ab ; if( *pab == ' ' ) pab++ ;
00395       pbb = bb ; if( *pbb == ' ' ) pbb++ ;
00396       sprintf( ylab , "\\noesc %s[%d]<%s..%s>" , DSET_FILECODE(ydset),ivy,pab,pbb ) ;
00397    }
00398 
00399    /*- 11 Aug 2001: compute correlation coefficient -*/
00400 
00401    if( mcount > 1 ){
00402      float xbar=0,ybar=0 , xq=0,yq=0,xyq=0 ;
00403      for( ii=0 ; ii < mcount ; ii++ ){ xbar += xar[ii]; ybar += yar[ii]; }
00404      xbar /= mcount ; ybar /= mcount ;
00405      for( ii=0 ; ii < mcount ; ii++ ){
00406         xq  += (xar[ii]-xbar)*(xar[ii]-xbar) ;
00407         yq  += (yar[ii]-ybar)*(yar[ii]-ybar) ;
00408         xyq += (xar[ii]-xbar)*(yar[ii]-ybar) ;
00409      }
00410      if( xq > 0.0 && yq > 0.0 ){
00411        pcor = xyq/sqrt(xq*yq); a = xyq/xq; b = (xq*ybar-xbar*xyq)/xq; }
00412    }
00413 
00414    if( mask_dset == NULL ){
00415       sprintf(tlab,"Scatter Plot: %d Voxels",mcount) ;
00416    } else {
00417       sprintf(tlab,"\\noesc Scatter Plot: %d Voxels (%s)",
00418               mcount , DSET_FILECODE(mask_dset)   ) ;
00419    }
00420    if( pcor != 0.0 ){
00421      char abuf[16] ; AV_fval_to_char(a,abuf) ;
00422      sprintf(tlab+strlen(tlab)," R=%.3f a=%s",pcor,abuf) ;
00423    }
00424 
00425    /*-- actually plot data --*/
00426 
00427    PLUTO_scatterplot( mcount , xar,yar , xlab,ylab,tlab , a,b ) ;
00428 
00429    /*-- go home to papa --*/
00430 
00431    free(xar) ; free(yar) ; return NULL ;
00432 }

Variable Documentation

char helpstring[] [static]
 

Initial value:

   " \n"
   " Purpose:  Scatterplot data from 2 bricks.\n"
   "\n"
   " Source x: Dataset   = dataset for x-axis values\n"
   "           Sub-brick = which one to use\n"
   "           Bottom    = minimum value to include\n"
   "           Top       = maximum value to include\n"
   "\n"
   " Source y: Dataset   = dataset for y-axis values\n"
   "           Sub-brick = which one to use\n"
   "           Bottom    = minimum value to include\n"
   "           Top       = maximum value to include\n"
   "\n"
   " Mask:     Dataset   = masking dataset\n"
   "           Sub-brick = which one to use\n"
   "           Bottom    = min value from mask dataset to use\n"
   "           Top       = max value from mask dataset to use\n"
   "\n"
   "In the above definitions:\n"
   "  if Bottom >  Top, then all voxels will be used\n"
   "  if Bottom <= Top, then only voxels in this range will be used\n"
   "\n"
   "Note: A maximum of 4,000,000 (four million) points can be plotted.\n\n"
   " Author -- RW Cox - 13 January 2000\n"

Definition at line 21 of file plug_scatplot.c.

Referenced by PLUGIN_init().

 

Powered by Plone

This site conforms to the following standards: