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

#include "afni.h"

Go to the source code of this file.


Defines

#define MAKE_SURF_ROW(ii)

Functions

int AFNI_vnlist_func_overlay (Three_D_View *im3d, int ks, SUMA_irgba **map, int *nvused)
int AFNI_find_closest_node (int num_ixyz, SUMA_ixyz *ixyz, float xtarg, float ytarg, float ztarg, float xbot, float xtop, float ybot, float ytop, float zbot, float ztop)
void AFNI_surf_done_CB (Widget, XtPointer, XtPointer)
void AFNI_surf_redraw_CB (MCW_arrowval *, XtPointer)
 AFNI_make_surface_widgets (Three_D_View *, int)
void AFNI_surf_bbox_CB (Widget, XtPointer, XtPointer)
void AFNI_update_surface_widgets (Three_D_View *im3d)
void AFNI_update_all_surface_widgets (THD_session *sess)
void AFNI_choose_surface_CB (Widget w, XtPointer cd, XtPointer cbs)

Define Documentation

#define MAKE_SURF_ROW ii   
 

Make the widgets for one row of the surface control panel. The row itself will not be managed at this time; that comes later.

Definition at line 454 of file afni_sumafunc.c.

Referenced by AFNI_make_surface_widgets(), and AFNI_update_surface_widgets().


Function Documentation

void AFNI_choose_surface_CB Widget    w,
XtPointer    cd,
XtPointer    cbs
 

Callback for Switch Surface pushbutton [19 Aug 2002]. --------------------------------------------------------------------------

Definition at line 775 of file afni_sumafunc.c.

References AFNI_make_surface_widgets(), AFNI_update_surface_widgets(), ENTRY, IM3D_OPEN, AFNI_surface_widgets::rowcol, Three_D_View::ss_now, THD_session::su_num, AFNI_viewing_widgets::swid, AFNI_widget_set::view, Three_D_View::vwid, WAIT_for_window, and AFNI_surface_widgets::wtop.

00776 {
00777    Three_D_View *im3d = (Three_D_View *) cd ;
00778    AFNI_surface_widgets *swid ;
00779    int num , ii , nwid,nall ;
00780 
00781 ENTRY("AFNI_choose_surface_CB") ;
00782 
00783    if( !IM3D_OPEN(im3d) || im3d->ss_now == NULL ) EXRETURN ;  /* bad */
00784 
00785    num  = im3d->ss_now->su_num ;
00786    swid = im3d->vwid->view->swid ;
00787 
00788    /* no surfaces ==> nothing to do */
00789 
00790    if( num == 0 ) EXRETURN ;
00791 
00792    /* make widgets? */
00793 
00794    if( swid == NULL ){
00795      AFNI_make_surface_widgets(im3d,num) ;
00796      swid = im3d->vwid->view->swid ;
00797    }
00798 
00799    /* make control panel visible, if it isn't already */
00800 
00801    XtMapWidget( swid->wtop ) ;
00802    XRaiseWindow( XtDisplay(swid->wtop), XtWindow(swid->wtop) ) ;
00803 
00804    /* put proper labels on widgets, etc. */
00805 
00806    AFNI_update_surface_widgets(im3d) ;
00807 
00808    /* Mac OS X mangles up the widgets on first display,
00809       so unmanage and remanage them -- this solves that problem */
00810 
00811    WAIT_for_window( swid->rowcol ) ;
00812    XtUnmanageChild( swid->rowcol ) ;
00813    WAIT_for_window( swid->rowcol ) ;
00814    XtManageChild  ( swid->rowcol ) ;
00815 
00816    /* wait for user to press some button */
00817 
00818    EXRETURN ;
00819 }

int AFNI_find_closest_node int    num_ixyz,
SUMA_ixyz   ixyz,
float    xtarg,
float    ytarg,
float    ztarg,
float    xbot,
float    xtop,
float    ybot,
float    ytop,
float    zbot,
float    ztop
 

Find node in surface closest to given DICOM vector, with limitation that node's x is in range xbot..xtop, etc. Return value is node index into ixyz array (not necessarily node ID), -1 if none is found. -------------------------------------------------------------------------

Definition at line 409 of file afni_sumafunc.c.

References ENTRY, RETURN, SUMA_ixyz::x, SUMA_ixyz::y, and SUMA_ixyz::z.

Referenced by AFNI_get_xhair_node().

00414 {
00415    int ii ,      ibest=-1 ;
00416    float x,y,z , dbest, d ;
00417 
00418 ENTRY("AFNI_find_closest_node") ;
00419 
00420    if( num_ixyz <= 0 || ixyz == NULL ) RETURN(-1) ;  /* bad inputs */
00421 
00422    /* if search ranges are incoherent, make them very wide */
00423 
00424    if( xbot >= xtop ){ xbot = -WAY_BIG; xtop = WAY_BIG; }
00425    if( ybot >= ytop ){ ybot = -WAY_BIG; ytop = WAY_BIG; }
00426    if( zbot >= ztop ){ zbot = -WAY_BIG; ztop = WAY_BIG; }
00427 
00428    for( ii=0 ; ii < num_ixyz ; ii++ ){
00429      x = ixyz[ii].x; y = ixyz[ii].y; z = ixyz[ii].z;
00430      if( x < xbot || x > xtop ||
00431          y < ybot || y > ytop ||
00432          z < zbot || z > ztop   ) continue ;  /* outside box */
00433 
00434      d = (xtarg-x)*(xtarg-x) + (ytarg-y)*(ytarg-y) + (ztarg-z)*(ztarg-z) ;
00435      if( ibest < 0 || d < dbest ){ ibest = ii; dbest = d; }
00436    }
00437 
00438    RETURN(ibest) ;
00439 }

AFNI_make_surface_widgets Three_D_View   im3d,
int    num
[static]
 

Make surface widgets for an AFNI controller [19 Aug 2002]. Called only once to create the initial set of widgets. AFNI_update_surface_widgets() is used to update the list when something changes. --------------------------------------------------------------------------

Definition at line 513 of file afni_sumafunc.c.

References AFNI_controller_label(), AFNI_surf_done_CB(), AFNI_surf_redraw_CB(), AFNI_surface_widgets::boxsize_av, Three_D_View::dc, DC_find_closest_overlay_color(), DC_yokify(), MCW_DC::display, AFNI_surface_widgets::done_pb, getenv(), AFNI_surface_widgets::linewidth_av, MAKE_SURF_ROW, MCW_reghelp_children(), MCW_reghint_children(), MCW_register_hint(), MCW_set_widget_bg(), MIN, myXtNew, AFNI_surface_widgets::nall, MCW_DCOV::ncol_ov, new_MCW_optmenu(), AFNI_surface_widgets::nrow, MCW_DC::ovc, AFNI_surface_widgets::rowcol, AFNI_surface_widgets::surf_bbox, AFNI_surface_widgets::surf_ledg_av, AFNI_surface_widgets::surf_line_av, AFNI_surface_widgets::surf_node_av, AFNI_surface_widgets::surf_rc, AFNI_viewing_widgets::swid, AFNI_surface_widgets::top_lab, AFNI_widget_set::view, Three_D_View::vwid, MCW_arrowval::wrowcol, AFNI_surface_widgets::wtop, and XtCalloc.

Referenced by AFNI_choose_surface_CB().

00514 {
00515    AFNI_surface_widgets *swid ;
00516    Widget ww , rc ;
00517    XmString xstr ;
00518    char str[32] , *eee ;
00519    int ii , line_col, box_col ;
00520 
00521    im3d->vwid->view->swid = swid = myXtNew( AFNI_surface_widgets ) ;
00522 
00523    /* shell to hold it all */
00524 
00525    sprintf(str,"AFNI Surface Controls %s",AFNI_controller_label(im3d)) ;
00526 
00527    swid->wtop = XtVaAppCreateShell(
00528                   "AFNI" , "AFNI" ,
00529                    topLevelShellWidgetClass , im3d->dc->display ,
00530                    XmNallowShellResize   , True ,
00531                    XmNtitle              , str ,
00532                    XmNmappedWhenManaged  , False ,              /* manage manually */
00533                    XmNdeleteResponse     , XmDO_NOTHING ,       /* deletion handled below */
00534                 NULL ) ;
00535    DC_yokify( swid->wtop , im3d->dc ) ;
00536 
00537    XtVaSetValues( swid->wtop ,
00538                      XmNmwmDecorations , MWM_DECOR_ALL | MWM_DECOR_MAXIMIZE ,
00539                   NULL ) ;
00540 
00541    XmAddWMProtocolCallback(           /* make "Close" window menu work */
00542            swid->wtop ,
00543            XmInternAtom( im3d->dc->display , "WM_DELETE_WINDOW" , False ) ,
00544            AFNI_surf_done_CB , im3d ) ;
00545 
00546    /* vertical rowcol to hold it all */
00547 
00548    swid->rowcol =
00549       XtVaCreateWidget(
00550          "dialog" , xmRowColumnWidgetClass , swid->wtop ,
00551             XmNpacking      , XmPACK_TIGHT ,
00552             XmNorientation  , XmVERTICAL   ,
00553             XmNtraversalOn , False ,
00554          NULL ) ;
00555 
00556    /* top label to say what session we are dealing with */
00557 
00558    xstr = XmStringCreateLtoR( "xxxxxxxxxAxxxxxxxxxAxxxxxxxxxAxxxxxxxxxAxxxxxxxxxA [x] " ,
00559                               XmFONTLIST_DEFAULT_TAG ) ;
00560    swid->top_lab = XtVaCreateManagedWidget(
00561                     "dialog" , xmLabelWidgetClass , swid->rowcol ,
00562                        XmNrecomputeSize , False ,
00563                        XmNlabelString , xstr ,
00564                        XmNtraversalOn , False ,
00565                     NULL ) ;
00566    XmStringFree(xstr) ;
00567 
00568    /* Separator from other widgets */
00569 
00570    (void) XtVaCreateManagedWidget( "dialog", xmSeparatorWidgetClass,swid->rowcol,
00571                                       XmNseparatorType   , XmSHADOW_ETCHED_IN ,
00572                                       XmNshadowThickness , 5 ,
00573                                    NULL ) ;
00574 
00575    /* horiz rowcol for top controls [23 Feb 2003] */
00576 
00577    rc = XtVaCreateWidget(
00578           "dialog" , xmRowColumnWidgetClass , swid->rowcol ,
00579              XmNpacking      , XmPACK_TIGHT ,
00580              XmNorientation  , XmHORIZONTAL   ,
00581              XmNtraversalOn , False ,
00582           NULL ) ;
00583 
00584    /* boxsize control [23 Feb 2003] */
00585 
00586    swid->boxsize_av = new_MCW_optmenu( rc , "BoxSize" ,
00587                                        1,19,2,0 ,
00588                                        AFNI_surf_redraw_CB , im3d ,
00589                                        NULL , NULL ) ;
00590    MCW_reghint_children( swid->boxsize_av->wrowcol ,
00591                          "Size of boxes drawn at nodes" ) ;
00592    MCW_reghelp_children( swid->boxsize_av->wrowcol ,
00593                          "This sets the size of the\n"
00594                          "boxes used to draw the\n"
00595                          "surface nodes that are\n"
00596                          "in the current slice volume." ) ;
00597 
00598    /* linewidth control [23 Feb 2003] */
00599 
00600    (void) XtVaCreateManagedWidget( "dialog", xmSeparatorWidgetClass, rc ,
00601                                       XmNorientation   , XmVERTICAL    ,
00602                                       XmNseparatorType , XmDOUBLE_LINE ,
00603                                    NULL ) ;
00604 
00605    swid->linewidth_av = new_MCW_optmenu( rc , "LineWidth" ,
00606                                          0,19,0,0 ,
00607                                          AFNI_surf_redraw_CB , im3d ,
00608                                          NULL , NULL ) ;
00609    MCW_reghint_children( swid->linewidth_av->wrowcol ,
00610                          "Width of lines drawn for surface" ) ;
00611    MCW_reghelp_children( swid->linewidth_av->wrowcol ,
00612                          "This sets the thickness of\n"
00613                          "the lines used to draw the\n"
00614                          "intersection of the surface\n"
00615                          "with the slice plane."         ) ;
00616 
00617 
00618    /* Done button */
00619 
00620    (void) XtVaCreateManagedWidget( "dialog", xmSeparatorWidgetClass, rc ,
00621                                       XmNorientation   , XmVERTICAL    ,
00622                                       XmNseparatorType , XmDOUBLE_LINE ,
00623                                    NULL ) ;
00624 
00625    xstr = XmStringCreateLtoR( "Done" , XmFONTLIST_DEFAULT_TAG ) ;
00626    swid->done_pb =
00627      XtVaCreateManagedWidget(
00628            "dialog" , xmPushButtonWidgetClass , rc ,
00629             XmNlabelString , xstr ,
00630             XmNtraversalOn , False ,
00631          NULL ) ;
00632    XmStringFree(xstr) ;
00633    XtAddCallback( swid->done_pb, XmNactivateCallback, AFNI_surf_done_CB, im3d );
00634    MCW_set_widget_bg( swid->done_pb, MCW_hotcolor(swid->done_pb), 0 ) ;
00635    MCW_register_hint( swid->done_pb, "Close window" ) ;
00636 
00637    XtManageChild(rc) ;
00638 
00639    /* Separator from other widgets */
00640 
00641    (void) XtVaCreateManagedWidget( "dialog", xmSeparatorWidgetClass,swid->rowcol,
00642                                       XmNseparatorType   , XmSHADOW_ETCHED_IN ,
00643                                       XmNshadowThickness , 5 ,
00644                                    NULL ) ;
00645 
00646    /* Now create rows of widgets to control the surfaces */
00647 
00648    swid->nall = num ;
00649    swid->nrow = 0 ;     /* none are managed at this time */
00650 
00651    swid->surf_rc      = (Widget *)        XtCalloc( num , sizeof(Widget)         ) ;
00652    swid->surf_bbox    = (MCW_bbox **)     XtCalloc( num , sizeof(MCW_bbox *)     ) ;
00653    swid->surf_node_av = (MCW_arrowval **) XtCalloc( num , sizeof(MCW_arrowval *) ) ;
00654    swid->surf_line_av = (MCW_arrowval **) XtCalloc( num , sizeof(MCW_arrowval *) ) ;
00655    swid->surf_ledg_av = (MCW_arrowval **) XtCalloc( num , sizeof(MCW_arrowval *) ) ;
00656 
00657    eee = getenv( "AFNI_SUMA_LINECOLOR" ) ;
00658    line_col = DC_find_closest_overlay_color( im3d->dc, eee ) ;
00659    if( line_col < 0 ) line_col = MIN(6,im3d->dc->ovc->ncol_ov-1) ;
00660 
00661    eee = getenv( "AFNI_SUMA_BOXCOLOR" ) ;
00662    box_col = DC_find_closest_overlay_color( im3d->dc, eee ) ;
00663    if( box_col < 0 ) box_col = 0 ;
00664 
00665    for( ii=0 ; ii < num ; ii++ ){
00666      MAKE_SURF_ROW(ii) ;
00667    }
00668 
00669    XtManageChild(swid->rowcol) ;
00670    XtRealizeWidget(swid->wtop) ;
00671    EXRETURN ;
00672 }

void AFNI_surf_bbox_CB Widget    w,
XtPointer    cd,
XtPointer    qd
[static]
 

Callback for press of a toggle button on the surface controls. All this does is to force a redraw of the images.

Definition at line 867 of file afni_sumafunc.c.

References AFNI_set_viewpoint(), ENTRY, IM3D_OPEN, REDISPLAY_OVERLAY, AFNI_viewing_widgets::swid, AFNI_widget_set::view, Three_D_View::vwid, and AFNI_surface_widgets::wtop.

00868 {
00869    Three_D_View *im3d = (Three_D_View *) cd ;
00870    AFNI_surface_widgets *swid ;
00871 
00872 ENTRY("AFNI_surf_bbox_CB") ;
00873 
00874    if( im3d == NULL ) EXRETURN ;
00875    swid = im3d->vwid->view->swid ;
00876    if( swid == NULL ) EXRETURN ;  /* should be impossible */
00877 
00878    if( !IM3D_OPEN(im3d) ){        /* bad user! */
00879      XtUnmapWidget( swid->wtop ) ;
00880      EXRETURN ;
00881    }
00882 
00883    AFNI_set_viewpoint( im3d , -1,-1,-1 , REDISPLAY_OVERLAY ) ;
00884 
00885    EXRETURN ;
00886 }

void AFNI_surf_done_CB Widget    w,
XtPointer    cd,
XtPointer    cbs
[static]
 

Callback for "Done" button for surface control panel.

Definition at line 824 of file afni_sumafunc.c.

References ENTRY, IM3D_OPEN, AFNI_viewing_widgets::swid, AFNI_widget_set::view, Three_D_View::vwid, and AFNI_surface_widgets::wtop.

Referenced by AFNI_make_surface_widgets().

00825 {
00826    Three_D_View *im3d = (Three_D_View *) cd ;
00827    AFNI_surface_widgets *swid ;
00828 
00829 ENTRY("AFNI_surf_done_CB") ;
00830 
00831    if( !IM3D_OPEN(im3d) ) EXRETURN ;
00832    swid = im3d->vwid->view->swid ;
00833    if( swid != NULL ) XtUnmapWidget( swid->wtop ) ;
00834    EXRETURN ;
00835 }

void AFNI_surf_redraw_CB MCW_arrowval  ,
XtPointer   
[static]
 

Definition at line 842 of file afni_sumafunc.c.

References AFNI_set_viewpoint(), ENTRY, IM3D_OPEN, REDISPLAY_OVERLAY, AFNI_viewing_widgets::swid, AFNI_widget_set::view, Three_D_View::vwid, and AFNI_surface_widgets::wtop.

Referenced by AFNI_make_surface_widgets().

00843 {
00844    Three_D_View *im3d = (Three_D_View *) cd ;
00845    AFNI_surface_widgets *swid ;
00846 
00847 ENTRY("AFNI_surf_redraw_CB") ;
00848 
00849    if( im3d == NULL ) EXRETURN ;
00850    swid = im3d->vwid->view->swid ;
00851    if( swid == NULL ) EXRETURN ;    /* should be impossible */
00852 
00853    if( !IM3D_OPEN(im3d) ){          /* bad user, bad bad bad! */
00854      XtUnmapWidget( swid->wtop ) ;
00855      EXRETURN ;
00856    }
00857 
00858    AFNI_set_viewpoint( im3d , -1,-1,-1 , REDISPLAY_OVERLAY ) ;
00859 
00860    EXRETURN ;
00861 }

void AFNI_update_all_surface_widgets THD_session   sess
 

Update all surface widgets everywhere that touch this session.

Definition at line 758 of file afni_sumafunc.c.

References AFNI_update_surface_widgets(), AFNI_library_type::controllers, ENTRY, GLOBAL_library, IM3D_OPEN, MAX_CONTROLLERS, and Three_D_View::ss_now.

Referenced by process_NIML_Node_ROI(), and process_NIML_SUMA_ixyz().

00759 {
00760    int ii ;
00761    Three_D_View *im3d ;
00762 ENTRY("AFNI_update_all_surface_widgets") ;
00763    for( ii=0 ; ii < MAX_CONTROLLERS ; ii++ ){
00764      im3d = GLOBAL_library.controllers[ii] ;
00765      if( IM3D_OPEN(im3d) && im3d->ss_now == sess )
00766        AFNI_update_surface_widgets( im3d ) ;
00767    }
00768    EXRETURN ;
00769 }

void AFNI_update_surface_widgets Three_D_View   im3d
 

Update surface widgets for this controller; that is, set labels, manage/unmanage widget rows, et cetera.

Definition at line 678 of file afni_sumafunc.c.

References AFNI_controller_label(), AFNI_viewing_widgets::choose_surf_pb, Three_D_View::dc, DC_find_closest_overlay_color(), ENTRY, getenv(), IM3D_OPEN, SUMA_surface::label, MAKE_SURF_ROW, MCW_register_hint(), MCW_set_widget_label(), MIN, AFNI_surface_widgets::nall, MCW_DCOV::ncol_ov, AFNI_surface_widgets::nrow, SUMA_surface::num_ijk, SUMA_surface::num_ixyz, MCW_DC::ovc, SENSITIZE, THD_session::sessname, SESSTRAIL, Three_D_View::ss_now, THD_session::su_num, THD_session::su_surf, AFNI_surface_widgets::surf_bbox, AFNI_surface_widgets::surf_ledg_av, AFNI_surface_widgets::surf_line_av, AFNI_surface_widgets::surf_node_av, AFNI_surface_widgets::surf_rc, AFNI_viewing_widgets::swid, THD_MAX_NAME, THD_trailname(), AFNI_surface_widgets::top_lab, AFNI_widget_set::view, Three_D_View::vwid, MCW_bbox::wbut, and XtRealloc.

Referenced by AFNI_choose_surface_CB(), AFNI_setup_viewing(), and AFNI_update_all_surface_widgets().

00679 {
00680    AFNI_surface_widgets *swid ;
00681    int num , ii , nwid,nall ;
00682    char str[64] , nam[THD_MAX_NAME] , *tnam ;
00683 
00684 ENTRY("AFNI_update_surface_widgets") ;
00685 
00686    if( !IM3D_OPEN(im3d) || im3d->ss_now == NULL ) EXRETURN ;  /* bad */
00687 
00688    num  = im3d->ss_now->su_num ;   /* # of surfaces in current session */
00689    swid = im3d->vwid->view->swid ; /* pointer to surface widget struct */
00690 
00691    SENSITIZE( im3d->vwid->view->choose_surf_pb , (Boolean)(num > 0) ) ;
00692 
00693    if( swid == NULL ) EXRETURN ;  /* nothing to update */
00694 
00695    /* put session label in top of panel */
00696 
00697    strcpy( nam , im3d->ss_now->sessname ) ;
00698    tnam = THD_trailname(nam,SESSTRAIL+1) ;
00699    ii = strlen(tnam) ; if( ii > 50 ) tnam += (ii-50) ;
00700    sprintf(str ,"%-.50s %s" , tnam, AFNI_controller_label(im3d) ) ;
00701    MCW_set_widget_label( swid->top_lab , str ) ;
00702 
00703    /* make more widget rows? (1 per surface is needed) */
00704 
00705    if( swid->nall < num ){
00706      char *eee ; int line_col,box_col ;
00707 
00708      swid->surf_rc      = (Widget *)        XtRealloc( (char *)swid->surf_rc     ,num*sizeof(Widget)         );
00709      swid->surf_bbox    = (MCW_bbox **)     XtRealloc( (char *)swid->surf_bbox   ,num*sizeof(MCW_bbox *)     );
00710      swid->surf_node_av = (MCW_arrowval **) XtRealloc( (char *)swid->surf_node_av,num*sizeof(MCW_arrowval *) );
00711      swid->surf_line_av = (MCW_arrowval **) XtRealloc( (char *)swid->surf_line_av,num*sizeof(MCW_arrowval *) );
00712      swid->surf_ledg_av = (MCW_arrowval **) XtRealloc( (char *)swid->surf_line_av,num*sizeof(MCW_arrowval *) );
00713 
00714 
00715      eee = getenv( "AFNI_SUMA_LINECOLOR" ) ;
00716      line_col = DC_find_closest_overlay_color( im3d->dc, eee ) ;
00717      if( line_col < 0 ) line_col = MIN(6,im3d->dc->ovc->ncol_ov-1) ;
00718 
00719      eee = getenv( "AFNI_SUMA_BOXCOLOR" ) ;
00720      box_col = DC_find_closest_overlay_color( im3d->dc, eee ) ;
00721      if( box_col < 0 ) box_col = 0 ;
00722 
00723      for( ii=swid->nall ; ii < num ; ii++ ){
00724        MAKE_SURF_ROW(ii) ;
00725      }
00726      swid->nall = num ;
00727    }
00728 
00729    /* map or unmap widget rows? (1 per surface is needed) */
00730 
00731    if( swid->nrow < num ){
00732      for( ii=swid->nrow ; ii < num ; ii++ )
00733        XtManageChild( swid->surf_rc[ii] ) ;
00734    } else if( swid->nrow > num ){
00735       for( ii=num ; ii < swid->nrow ; ii++ )
00736        XtUnmanageChild( swid->surf_rc[ii] ) ;
00737    }
00738    swid->nrow = num ;  /* # of managed rows */
00739 
00740    /* change labels for each row */
00741 
00742    for( ii=0 ; ii < num ; ii++ ){
00743      sprintf(str,"%-14.14s: ",im3d->ss_now->su_surf[ii]->label) ;
00744      MCW_set_widget_label( swid->surf_bbox[ii]->wbut[0] , str ) ;
00745 
00746      sprintf(str,"%d Nodes; %d Triangles",             /* 20 Aug 2002:  */
00747              im3d->ss_now->su_surf[ii]->num_ixyz ,     /* put a hint    */
00748              im3d->ss_now->su_surf[ii]->num_ijk   ) ;  /* on each label */
00749      MCW_register_hint( swid->surf_bbox[ii]->wbut[0] , str ) ;
00750    }
00751 
00752    EXRETURN ;
00753 }

int AFNI_vnlist_func_overlay Three_D_View   im3d,
int    ks,
SUMA_irgba **    map,
int *    nvused
 

Create a nodal color overlay from a voxel map.

  • Input ks is surface index to use from im3d->ss_now session
  • Return value is number of nodes overlaid:
    • 0 return ==> no overlay was computed
    • -1 return ==> some error (e.g., no surface nodes on this dataset) = positive ==> can use *map and *nvused
  • *map is set to a newly malloc()-ed array (if return > 0)
  • *nvused is set to the number of functional dataset voxels used to make the map (e.g., those that got some color)
  • im3d->ss_now[ks]->vn->nvox will have the total number of functional dataset voxels that intersected the surface
Sample usage:
  • SUMA_irgba *map ;
  • int nmap , nvox ;
  • nmap = AFNI_vnlist_func_overlay( im3d , 0 , &map , &nvox ) ;
  • if( nmap < 0 ){ ** error ** }
  • else if( nmap == 0 ){ ** nothing to show ** }
  • else { ** show map[0..nmap-1] ** }
Much of this function is a 3D-ification of AFNI_func_overlay(). -------------------------------------------------------------------------

Definition at line 29 of file afni_sumafunc.c.

References SUMA_irgba::a, AFNI_GOOD_FUNC_DTYPE, rgbyte::b, SUMA_irgba::b, MCW_pbar::bigbot, MCW_pbar::bigcolor, MCW_pbar::bigmode, MCW_pbar::bigtop, cmap, THD_3dim_dataset::daxes, Three_D_View::dc, DCOV_BLUEBYTE, DCOV_GREENBYTE, DCOV_REDBYTE, SUMA_vnlist::dset, DSET_BRICK, DSET_BRICK_FACTOR, DSET_load, DSET_LOADED, DSET_NVALS, ENTRY, EQUIV_DATAXES, AFNI_view_info::fim_autorange, AFNI_view_info::fim_index, Three_D_View::fim_now, AFNI_view_info::fim_range, free, AFNI_widget_set::func, AFNI_view_info::func_thresh_top, AFNI_view_info::func_threshold, rgbyte::g, SUMA_irgba::g, SUMA_ixyz::id, SUMA_irgba::id, IM3D_VALID, ind, AFNI_function_widgets::inten_pbar, SUMA_surface::ixyz, MRI_IMAGE::kind, malloc, mmm, MRI_BYTE_PTR, MRI_FLOAT_PTR, MRI_RGB_PTR, MRI_SHORT_PTR, SUMA_vnlist::nlist, NPANE_BIG, NPANE_MAX, SUMA_surface::num_ixyz, MCW_pbar::num_panes, SUMA_vnlist::numnod, SUMA_vnlist::nvox, MCW_pbar::ov_index, MCW_pbar::pval, rgbyte::r, SUMA_irgba::r, r, realloc, RETURN, Three_D_View::ss_now, THD_session::su_num, THD_session::su_surf, SUMA_destroy_vnlist(), SUMA_make_vnlist(), AFNI_view_info::thr_index, AFNI_view_info::use_posfunc, Three_D_View::vinfo, SUMA_surface::vn, SUMA_vnlist::voxijk, and Three_D_View::vwid.

00031 {
00032    MRI_IMAGE *im_thr , *im_fim ;
00033    short fim_ovc[NPANE_MAX+1] ;
00034    byte  ovc_r[NPANE_MAX+1], ovc_g[NPANE_MAX+1], ovc_b[NPANE_MAX+1] ;
00035    int ii,jj,nn , lp , num_lp , ival ;
00036    float scale_factor , scale_thr=1.0 , scale_fim=1.0 ;
00037    MCW_pbar * pbar ;
00038    int     simult_thr , need_thr ;
00039    THD_3dim_dataset *fdset ;
00040    SUMA_irgba *mmm ;
00041    SUMA_ixyz  *ixyz ;
00042    int nvox,nnod,nout , *numnod , *voxijk , *nlist ;
00043    int *vlist ;
00044    int nvout ;   /* 13 Mar 2002 */
00045 
00046    int bm , zbot=0 , kk ;        /* 02 Feb 2003: colorscale stuff */
00047    float fbot=0.0,ftop=0.0,ffac=0.0 , val ;
00048    rgbyte *cmap=NULL ;
00049 
00050    THD_session *ss ;             /* 22 Jan 2004 */
00051    SUMA_surface *surf ;
00052    SUMA_vnlist *vn ;
00053 
00054 ENTRY("AFNI_vnlist_func_overlay") ;
00055 
00056    /* check inputs for goodness sakes */
00057 
00058    if( map == NULL || !IM3D_VALID(im3d) ) RETURN(-1) ; /* that was easy */
00059 
00060    if( nvused != NULL ) *nvused = 0 ;  /* set default return value here */
00061 
00062    /* check datasets for goodness */
00063    /* 12 Dec 2002: ks is now input (we used to compute it) */
00064 
00065    ss = im3d->ss_now ;              /* session must     */
00066    if( ss              == NULL ||   /* have surface #ks */
00067        ss->su_num      == 0    ||
00068        ks              <  0    ||
00069        ss->su_num      <= ks   ||
00070        ss->su_surf[ks] == NULL   ) RETURN(-1) ;
00071 
00072    surf = ss->su_surf[ks] ;    /* the surface in question */
00073 
00074    fdset = im3d->fim_now ; if( fdset == NULL ) RETURN(-1) ;
00075 
00076    ival = im3d->vinfo->thr_index ;  /* threshold sub-brick index */
00077 
00078    /* get the component images */
00079 
00080    need_thr = im3d->vinfo->func_threshold > 0.0 ;
00081 
00082    if( need_thr ) im_thr = DSET_BRICK(fdset,ival) ;
00083    else           im_thr = NULL ;
00084 
00085    if( im_thr != NULL && !AFNI_GOOD_FUNC_DTYPE(im_thr->kind) ) im_thr = NULL ;
00086 
00087    if( im_thr != NULL ){
00088      scale_thr = DSET_BRICK_FACTOR(fdset,ival) ;
00089      if( scale_thr == 0.0 || im_thr->kind == MRI_float ) scale_thr = 1.0 ;
00090    }
00091 
00092    { int ind ;
00093 
00094      ind = im3d->vinfo->fim_index ;
00095      if( ind >= DSET_NVALS(fdset) )
00096        ind = DSET_NVALS(fdset) - 1 ;
00097 
00098      im_fim       = DSET_BRICK(fdset,ind) ;  /* the sub-brick to show */
00099      scale_factor = im3d->vinfo->fim_range ;
00100      if( scale_factor == 0.0 ) scale_factor = im3d->vinfo->fim_autorange ;
00101      if( scale_factor == 0.0 ) scale_factor = 1.0 ;
00102 
00103      scale_fim = DSET_BRICK_FACTOR(fdset,ind) ;
00104      if( scale_fim == 0.0 ) scale_fim = 1.0 ;
00105 
00106    }
00107 
00108    /* if component images not good, quit now */
00109 
00110    if( im_fim == NULL ) RETURN(-1) ;  /* no function!? */
00111 
00112    if( !AFNI_GOOD_FUNC_DTYPE(im_fim->kind) ){
00113       RETURN(-1) ;  /* bad function - no soup for you */
00114    }
00115 
00116    /* maybe need to build a voxel-to-node list for func dataset  */
00117    /* (this is where the 3D-to-2D mapping is encapsulated, Ziad) */
00118 
00119    if( surf->vn == NULL ||
00120        !EQUIV_DATAXES(surf->vn->dset->daxes,fdset->daxes) ){
00121 
00122      /* if have an old one
00123         (that doesn't match current dataset grid),
00124         then delete it from the Universe           */
00125 
00126      if( surf->vn != NULL ) SUMA_destroy_vnlist( surf->vn ) ;
00127 
00128      /* make the new list */
00129 
00130      surf->vn = SUMA_make_vnlist( surf , fdset ) ;
00131      if( surf->vn == NULL ) RETURN(-1) ;
00132    }
00133 
00134    vn = surf->vn ;   /* voxel-to-node list for this surface */
00135 
00136    /* create array of voxel indexes (vlist);
00137       will put in there the voxels that are above threshold */
00138 
00139    nvox   = vn->nvox     ; if( nvox < 1 ) RETURN(0);
00140    voxijk = vn->voxijk   ;      /* list of voxels with surface nodes */
00141    numnod = vn->numnod   ;      /* number of nodes in each voxel */
00142 
00143    nnod = surf->num_ixyz ; if( nnod < 1 ) RETURN(0);
00144    ixyz = surf->ixyz     ;      /* array of surface nodes */
00145 
00146    DSET_load(fdset) ;                     /* if isn't in memory now */
00147    if( !DSET_LOADED(fdset) ) RETURN(-1) ; /* what the hell?         */
00148 
00149    /** if don't have threshold, will process all voxels for color **/
00150 
00151    if( im_thr == NULL ){
00152 
00153      vlist = voxijk ;  /* list of voxels to process = all voxels */
00154      nout  = nnod   ;  /* number of output nodes */
00155 
00156    /** if have threshold, cut out voxels below threshold (set vlist[]=-1) **/
00157 
00158    } else {
00159 
00160      vlist = (int *) malloc(sizeof(int)*nvox) ;    /* copy voxel list */
00161      memcpy( vlist , voxijk , sizeof(int)*nvox ) ; /* then prune it */
00162 
00163      switch( im_thr->kind ){
00164        case MRI_short:{
00165          float thresh = im3d->vinfo->func_threshold
00166                       * im3d->vinfo->func_thresh_top / scale_thr ;
00167          short *ar_thr = MRI_SHORT_PTR(im_thr) ;
00168          for( ii=0 ; ii < nvox ; ii++ ){  /* voxel cutting time */
00169            jj = vlist[ii] ;               /* actual voxel index in func brick */
00170            if( ar_thr[jj] > -thresh && ar_thr[jj] < thresh ) vlist[ii] = -1 ;
00171          }
00172        }
00173        break ;
00174 
00175        case MRI_byte:{
00176          float thresh = im3d->vinfo->func_threshold
00177                       * im3d->vinfo->func_thresh_top / scale_thr ;
00178          byte *ar_thr = MRI_BYTE_PTR(im_thr) ;
00179          for( ii=0 ; ii < nvox ; ii++ ){
00180            jj = vlist[ii] ;
00181            if( ar_thr[jj] < thresh ) vlist[ii] = -1 ;
00182          }
00183        }
00184        break ;
00185 
00186        case MRI_float:{
00187          float thresh = im3d->vinfo->func_threshold
00188                       * im3d->vinfo->func_thresh_top / scale_thr ;
00189          float *ar_thr = MRI_FLOAT_PTR(im_thr) ;
00190          for( ii=0 ; ii < nvox ; ii++ ){
00191            jj = vlist[ii] ;
00192            if( ar_thr[jj] > -thresh && ar_thr[jj] < thresh ) vlist[ii] = -1 ;
00193          }
00194        }
00195        break ;
00196      } /* end of switch on threshold sub-brick type */
00197 
00198      /* count surviving voxels; exit if there aren't any */
00199 
00200      for( jj=ii=0 ; ii < nvox ; ii++ )
00201        if( vlist[ii] >= 0 ) jj++ ;
00202      if( jj == 0 ){ free(vlist) ; RETURN(0) ; }
00203 
00204      /* count output nodes inside each surviving voxel */
00205 
00206      for( nout=ii=0 ; ii < nvox ; ii++ )
00207        if( vlist[ii] >= 0 ) nout += numnod[ii] ;
00208 
00209    } /* end of if on existence of threshold sub-brick */
00210 
00211    /** allocate output structure (maybe too big, but will clip it later) **/
00212 
00213    mmm = (SUMA_irgba *) malloc( sizeof(SUMA_irgba) * nout ) ;
00214 
00215    /** set overlay colors **/
00216 
00217    pbar   = im3d->vwid->func->inten_pbar ;
00218    num_lp = pbar->num_panes ;
00219    bm     = pbar->bigmode ;              /* 02 Feb 2003 */
00220 
00221    if( !bm ){                              /* indexed colors */
00222      for( lp=0 ; lp < num_lp ; lp++ )      /* overlay color indexes */
00223        fim_ovc[lp] = pbar->ov_index[lp] ;  /* run from top of pbar down */
00224 
00225      /* overlay color index for values below bottom of pbar */
00226 
00227      fim_ovc[num_lp] = (im3d->vinfo->use_posfunc) ? (0) : (fim_ovc[num_lp-1]) ;
00228 
00229      /* get the actual RGB colors of each pane on the pbar */
00230 
00231      for( lp=0 ; lp <= num_lp ; lp++ ){
00232        ovc_r[lp] = DCOV_REDBYTE  (im3d->dc,fim_ovc[lp]) ;
00233        ovc_g[lp] = DCOV_GREENBYTE(im3d->dc,fim_ovc[lp]) ;
00234        ovc_b[lp] = DCOV_BLUEBYTE (im3d->dc,fim_ovc[lp]) ;
00235      }
00236 
00237    } else {                                /* colorscale colors - 02 Feb 2003 */
00238      fbot = (scale_factor/scale_fim)*pbar->bigbot ;
00239      ftop = (scale_factor/scale_fim)*pbar->bigtop ;
00240      ffac = NPANE_BIG / (ftop-fbot) ;
00241      cmap = pbar->bigcolor ;
00242      zbot = (fbot == 0.0) ;
00243    }
00244 
00245    /** process im_fim into overlay, depending on data type **/
00246 
00247    switch( im_fim->kind ){
00248 
00249       default: nvout = nout = 0 ; break ;   /* should never happen! */
00250 
00251       case MRI_rgb:{                        /* 17 Apr 2002 */
00252         byte *ar_fim = MRI_RGB_PTR(im_fim); /* colors direct from fim */
00253         byte r,g,b ;
00254 
00255         nvout = nout = 0 ;                  /* num output nodes & voxels */
00256         for( ii=0 ; ii < nvox ; ii++ ){
00257           jj = vlist[ii] ; if( jj < 0 ) continue ;   /* skip voxel? */
00258           r = ar_fim[3*jj]; g = ar_fim[3*jj+1]; b = ar_fim[3*jj+2];
00259           if( r == 0 && g ==0 && b == 0 ) continue ; /* uncolored */
00260           nlist = vn->nlist[ii] ;  /* list of nodes */
00261           for( nn=0 ; nn < numnod[ii] ; nn++ ){      /* loop over nodes */
00262             mmm[nout].id = ixyz[nlist[nn]].id ;
00263             mmm[nout].r  = r ; mmm[nout].g = g ;
00264             mmm[nout].b  = b ; mmm[nout].a = 255 ; nout++ ;
00265           }
00266           nvout++ ;                           /* number of voxels used */
00267         }
00268       }
00269       break ;
00270 
00271       case MRI_short:{
00272         short * ar_fim = MRI_SHORT_PTR(im_fim) ;
00273         float fim_thr[NPANE_MAX] ;
00274         byte r,g,b ;
00275 
00276         if( !bm ){                         /* indexed colors from panes */
00277           for( lp=0 ; lp < num_lp ; lp++ ) /* thresholds for each pane */
00278             fim_thr[lp] = (scale_factor/scale_fim) * pbar->pval[lp+1] ;
00279         }
00280 
00281         nvout = nout = 0 ;                   /* num output nodes & voxels */
00282         for( ii=0 ; ii < nvox ; ii++ ){
00283           jj = vlist[ii] ; if( jj < 0 ) continue ;  /* skip voxel? */
00284           if( ar_fim[jj] == 0 )         continue ;  /* no func? */
00285           if( !bm ){              /* find pane this voxel is in */
00286             for( lp=0; lp < num_lp && ar_fim[jj] < fim_thr[lp]; lp++ ) ; /*nada*/
00287             if( fim_ovc[lp] == 0 ) continue ;         /* uncolored pane */
00288             r = ovc_r[lp]; g = ovc_g[lp]; b = ovc_b[lp];
00289           } else {                /* colorscale - 02 Feb 2003 */
00290             if( zbot && ar_fim[jj] < 0 ) continue ;
00291             val = ffac*(ftop-ar_fim[jj]) ;
00292             if( val < 0.0 ) val = 0.0;
00293             kk = (int)(val+0.49); if( kk >= NPANE_BIG ) kk = NPANE_BIG-1;
00294             r = cmap[kk].r; g = cmap[kk].g; b = cmap[kk].b;
00295             if( r == 0 && g ==0 && b == 0 ) continue ; /* black == uncolored */
00296           }
00297           nlist = vn->nlist[ii] ; /* list of nodes */
00298           for( nn=0 ; nn < numnod[ii] ; nn++ ){     /* loop over nodes */
00299             mmm[nout].id = ixyz[nlist[nn]].id ;
00300             mmm[nout].r  = r ; mmm[nout].g = g ;
00301             mmm[nout].b  = b ; mmm[nout].a = 255 ; nout++ ;
00302           }
00303           nvout++ ;                           /* number of voxels used */
00304         }
00305       }
00306       break ;
00307 
00308       case MRI_byte:{
00309         byte * ar_fim = MRI_BYTE_PTR(im_fim) ;
00310         float fim_thr[NPANE_MAX] ;
00311         byte r,g,b ;
00312 
00313         if( !bm ){                         /* indexed colors from panes */
00314           for( lp=0 ; lp < num_lp ; lp++ )
00315             if( pbar->pval[lp+1] <= 0.0 )
00316               fim_thr[lp] = 0 ;
00317             else
00318               fim_thr[lp] = (scale_factor/scale_fim) * pbar->pval[lp+1] ;
00319         }
00320 
00321         nvout = nout = 0 ;                          /* num output nodes */
00322         for( ii=0 ; ii < nvox ; ii++ ){
00323           jj = vlist[ii] ; if( jj < 0 ) continue ;  /* skip voxel? */
00324           if( ar_fim[jj] == 0 )         continue ;  /* no func? */
00325           if( !bm ){              /* find pane this voxel is in */
00326             for( lp=0; lp < num_lp && ar_fim[jj] < fim_thr[lp]; lp++ ) ; /*nada*/
00327             if( fim_ovc[lp] == 0 ) continue ;         /* uncolored pane */
00328             r = ovc_r[lp]; g = ovc_g[lp]; b = ovc_b[lp];
00329           } else {                /* colorscale - 02 Feb 2003 */
00330             val = ffac*(ftop-ar_fim[jj]) ;
00331             if( val < 0.0 ) val = 0.0;
00332             kk = (int)(val+0.49); if( kk >= NPANE_BIG ) kk = NPANE_BIG-1;
00333             r = cmap[kk].r; g = cmap[kk].g; b = cmap[kk].b;
00334             if( r == 0 && g ==0 && b == 0 ) continue ; /* black == uncolored */
00335           }
00336           nlist = vn->nlist[ii] ; /* list of nodes */
00337           for( nn=0 ; nn < numnod[ii] ; nn++ ){     /* loop over nodes */
00338             mmm[nout].id = ixyz[nlist[nn]].id ;
00339             mmm[nout].r  = r ; mmm[nout].g = g ;
00340             mmm[nout].b  = b ; mmm[nout].a = 255 ; nout++ ;
00341           }
00342           nvout++ ;                           /* number of voxels used */
00343         }
00344       }
00345       break ;
00346 
00347       case MRI_float:{
00348         float * ar_fim = MRI_FLOAT_PTR(im_fim) ;
00349         float fim_thr[NPANE_MAX] ;
00350         byte r,g,b ;
00351 
00352         if( !bm ){                         /* indexed colors from panes */
00353           for( lp=0 ; lp < num_lp ; lp++ )
00354             fim_thr[lp] = (scale_factor/scale_fim) * pbar->pval[lp+1] ;
00355         }
00356 
00357         nvout = nout = 0 ;                          /* num output nodes */
00358         for( ii=0 ; ii < nvox ; ii++ ){
00359           jj = vlist[ii] ; if( jj < 0 ) continue ;  /* skip voxel? */
00360           if( ar_fim[jj] == 0.0 )       continue ;  /* no func? */
00361           if( !bm ){              /* find pane this voxel is in */
00362             for( lp=0; lp < num_lp && ar_fim[jj] < fim_thr[lp]; lp++ ) ; /*nada*/
00363             if( fim_ovc[lp] == 0 ) continue ;         /* uncolored pane */
00364             r = ovc_r[lp]; g = ovc_g[lp]; b = ovc_b[lp];
00365           } else {                /* colorscale - 02 Feb 2003 */
00366             if( zbot && ar_fim[jj] < 0.0 ) continue ;
00367             val = ffac*(ftop-ar_fim[jj]) ;
00368             if( val < 0.0 ) val = 0.0;
00369             kk = (int)(val+0.49); if( kk >= NPANE_BIG ) kk = NPANE_BIG-1;
00370             r = cmap[kk].r; g = cmap[kk].g; b = cmap[kk].b;
00371             if( r == 0 && g ==0 && b == 0 ) continue ; /* black == uncolored */
00372           }
00373           nlist = vn->nlist[ii] ; /* list of nodes */
00374           for( nn=0 ; nn < numnod[ii] ; nn++ ){     /* loop over nodes */
00375             mmm[nout].id = ixyz[nlist[nn]].id ;
00376             mmm[nout].r  = r ; mmm[nout].g = g ;
00377             mmm[nout].b  = b ; mmm[nout].a = 255 ; nout++ ;
00378           }
00379           nvout++ ;                           /* number of voxels used */
00380         }
00381       }
00382       break ;
00383 
00384    } /* end of switch on fim data type */
00385 
00386    /** finished: clean up and exit **/
00387 
00388    if( vlist != voxijk ) free(vlist) ;  /* toss trash, if it is trash */
00389 
00390    if( nout == 0 ){ free(mmm); RETURN(0); }  /* no overlay? */
00391 
00392    /* map gets the array of node IDs + colors */
00393 
00394    *map = (SUMA_irgba *) realloc( mmm , sizeof(SUMA_irgba)*nout ) ;
00395 
00396    /* nvused gets the number of voxels used */
00397 
00398    if( nvused != NULL ) *nvused = nvout ;    /* 13 Mar 2002 */
00399 
00400    RETURN(nout) ;  /* number of entries in map */
00401 }
 

Powered by Plone

This site conforms to the following standards: