00001 
00002 
00003 
00004 
00005 
00006 
00007 #include "to3d.h"
00008 
00009 #define LABEL_ARG(str) \
00010   XtVaTypedArg , XmNlabelString , XmRString , (str) , strlen(str)+1
00011 
00012 #define NZBOT 1 
00013 
00014 
00015 
00016 static to3d_widget_set wset ;
00017 static to3d_data       user_inputs ;
00018 
00019 static THD_3dim_dataset * dset    = NULL ;
00020 static THD_datablock    * dblk    = NULL ;
00021 static THD_dataxes      * daxes   = NULL ;
00022 static THD_diskptr      * dkptr   = NULL ;
00023 static THD_marker_set   * markers = NULL ;
00024 static THD_string_array * imnames = NULL ;  
00025 
00026 static int outliers_checked = 0 ;     
00027 static char * outliers_fname = NULL ; 
00028 
00029 static int     Argc , First_Image_Arg = 1 ;
00030 static char ** Argv ;
00031 static char *  dbrick = NULL ;  
00032 static int     geomparent_loaded = 0 ;
00033 static int     geometry_loaded   = 0 ;
00034 
00035 static int     negative_shorts   = 0 ;  
00036 static int     nvox_total        = 0 ;  
00037 static int     nfloat_err        = 0 ;  
00038 
00039 static float   imdx=0.0, imdy=0.0, imdz=0.0 ;  
00040 
00041 static float   zpad=0 ;                        
00042 static int     zpad_mm=0 ;
00043 
00044 static float   zoff ;                          
00045 static int     use_zoff=0 ;
00046 
00047 static int     af_type_set=0 ;                 
00048 
00049 
00050 
00051 #define FatalError(str) \
00052    ( fprintf(stderr,"\n*** %s\n\n try 'to3d -help'\n",(str)) , exit(1) )
00053 
00054 static struct {
00055    int ncolor ;       
00056    float gamma ;      
00057    Boolean xtwarns ;  
00058    float gsfac ;      
00059    int   datum_all ;  
00060 
00061 #ifdef USE_MRI_DELAY
00062    int delay_input ;  
00063 #endif
00064 
00065    int editing ;      
00066 
00067    int swap_two , swap_four ;  
00068 
00069    int nofloatscan ;           
00070 
00071    int swap_eight ;            
00072 
00073 } argopt  ;
00074 
00075 
00076 static char * FALLback[] =
00077   {   "AFNI*fontList:        9x15bold=charset1" ,
00078       "AFNI*background:      gray40"            ,
00079       "AFNI*menu*background: gray40"            ,
00080       "AFNI*borderColor:     gray40"            ,
00081       "AFNI*foreground:      yellow"            ,
00082       "AFNI*borderWidth:     0"                 ,
00083       "AFNI*troughColor:     green"             ,
00084       "AFNI*XmLabel.translations: #override<Btn2Down>:" ,
00085       "AFNI*help*background:      black"                ,
00086       "AFNI*help*foreground:      yellow"               ,
00087       "AFNI*cluefont:             9x15bold"             ,
00088       "AFNI*help*waitPeriod:      1066"                 ,
00089       "AFNI*help*cancelWaitPeriod: 50"                  ,
00090    NULL } ;
00091 
00092 
00093 
00094 
00095 
00096 
00097 
00098 void AFNI_handler(char * msg){}
00099 
00100 #define CURSOR_normalize                               \
00101   do{ NORMAL_cursorize(wset.topshell) ;                \
00102       XSync( XtDisplay(wset.topshell), False ) ;       \
00103       XmUpdateDisplay( wset.topshell ) ; } while(0)
00104 
00105 #define CURSOR_watchize                                \
00106   do{ WATCH_cursorize(wset.topshell) ;                 \
00107       XSync( XtDisplay(wset.topshell), False ) ;       \
00108       XmUpdateDisplay( wset.topshell ) ; } while(0)
00109 
00110 void AFNI_startup_timeout_CB( XtPointer client_data , XtIntervalId * id )
00111 {
00112    char msg[512] ;
00113 
00114    MCW_help_CB(NULL,NULL,NULL) ;
00115    CURSOR_normalize ;
00116 
00117    if( negative_shorts && !AFNI_yesenv("AFNI_NO_NEGATIVES_WARNING") ){ 
00118       float perc = (100.0*negative_shorts)/nvox_total ;
00119       sprintf(msg , " \n"
00120                     " to3d WARNING: %d negative voxels (%g%%)\n"
00121                     "               were read in images of shorts.\n"
00122                     "               It is possible the input\n"
00123                     "               images need byte-swapping.\n \n"
00124                     " ** I recommend that you View Images. **\n" ,
00125               negative_shorts , perc ) ;
00126 
00127       (void) MCW_popup_message( wset.anatomy_parent_label , msg ,
00128                                 MCW_USER_KILL | MCW_TIMER_KILL ) ;
00129    }
00130 
00131    if( nfloat_err ){ 
00132       sprintf(msg , " \n"
00133                     " to3d WARNING: %d errors in floating point images\n"
00134                     "               were detected.  It is possible that\n"
00135                     "               the inputs need to be 4swap-ed, or\n"
00136                     "               otherwise repaired.\n \n"
00137                     " ** Erroneous values have been replaced by   **\n"
00138                     " ** zeros. I recommend that you View Images. **\n" ,
00139               nfloat_err ) ;
00140 
00141       (void) MCW_popup_message( wset.geometry_parent_label , msg ,
00142                                 MCW_USER_KILL | MCW_TIMER_KILL ) ;
00143    }
00144 
00145    if( user_inputs.ntt > 5 ){                 
00146       dset->taxis = myXtNew( THD_timeaxis ) ;
00147       dset->taxis->ntt = user_inputs.ntt ;
00148       T3D_check_outliers(0) ; outliers_checked = 1 ;
00149       myXtFree(dset->taxis) ;
00150    }
00151 }
00152 
00153 
00154 
00155 static char * commandline = NULL ;  
00156 
00157 int main( int argc , char * argv[] )
00158 {
00159    XtAppContext   app ;
00160    XtErrorHandler old_handler ;
00161    Boolean        all_good ;
00162 
00163    mainENTRY("to3d:main") ;
00164    machdep() ; 
00165 
00166    if( DBG_trace ){                              
00167      fprintf(stderr,"Enabling mcw_malloc()\n") ;
00168      enable_mcw_malloc() ;
00169    }
00170 
00171    
00172 
00173    wset.topshell = NULL ;  
00174    wset.good     = 0 ;
00175 
00176    
00177 
00178 
00179    INIT_ngray       = NGRAY ;
00180    INIT_gamma       = GAMMA ;
00181    INIT_fov         = 240.0 ;
00182    argopt.ncolor    = -1 ;
00183    argopt.gamma     = -1.0 ;
00184    argopt.xtwarns   = False ;         
00185    argopt.gsfac     = 0.0 ;           
00186    argopt.datum_all = ILLEGAL_TYPE ;  
00187 #ifdef USE_MRI_DELAY
00188    argopt.delay_input = FALSE ;
00189 #endif
00190    argopt.editing     = FALSE ;
00191 
00192    argopt.swap_two = argopt.swap_four = 0 ;  
00193    argopt.swap_eight = 0 ;                   
00194 
00195    argopt.nofloatscan = 0 ;                  
00196 
00197    
00198 
00199    printf("to3d: 2D slices into 3D datasets for AFNI, by RW Cox\n") ;
00200 
00201    
00202 
00203    { int new_argc ; char ** new_argv ;
00204      addto_args( argc , argv , &new_argc , &new_argv ) ;
00205      if( new_argv != NULL ){ argc = new_argc ; argv = new_argv ; }
00206    }
00207 
00208    Argc = argc ; Argv = argv ;
00209 
00210    T3D_initialize_user_data() ;
00211 
00212    if( user_inputs.nosave ){
00213      printf("Opening X11 now") ; fflush(stdout) ;
00214      wset.topshell = XtVaAppInitialize( &app , "AFNI" , NULL , 0 ,
00215                                         &argc , argv , FALLback , NULL ) ;
00216      printf("..opened\n") ;
00217    }
00218 
00219    T3D_read_images() ;
00220 
00221    if( negative_shorts ){
00222       float perc = (100.0*negative_shorts)/nvox_total ;
00223       fprintf(stderr,
00224        "to3d WARNING: %d negative voxels (%g%%) were read in images of shorts.\n"
00225        "              It is possible the input images need byte-swapping.\n",
00226        negative_shorts , perc ) ;
00227    }
00228 
00229    if( strlen(user_inputs.geometry_parent_filename) > 0 )
00230       T3D_geometry_parent_CB( NULL , NULL , NULL ) ;
00231 
00232    if( strlen(user_inputs.anatomy_parent_filename) > 0 )
00233       T3D_anatomy_parent_CB( NULL , NULL , NULL ) ;
00234 
00235    
00236 
00237 
00238    if( ! (geomparent_loaded || geometry_loaded) ){
00239       if( imdx <= 0.0 || imdy <= 0.0 ){
00240 
00241 STATUS("setting default FOV") ;
00242 
00243          user_inputs.fov = INIT_fov ;    
00244 
00245       } else {                           
00246          float size ;
00247 
00248 STATUS("setting voxel size from imdx, etc.") ;
00249 
00250          user_inputs.xsize = imdx ;
00251          user_inputs.ysize = imdy ;
00252          if( imdz > 0.0 ) user_inputs.zsize = imdz ;
00253 
00254          
00255 
00256          size = 0.5 * (user_inputs.nx-1) * user_inputs.xsize ;
00257          user_inputs.xorigin = size ;
00258 
00259          size = 0.5 * (user_inputs.ny-1) * user_inputs.ysize ;
00260          user_inputs.yorigin = size ;
00261 
00262          size = 0.5 * (user_inputs.nz-1) * user_inputs.zsize ;
00263          user_inputs.zorigin = size ;
00264 
00265          user_inputs.xyz_centered = (XCENTERED|YCENTERED|ZCENTERED) ;
00266 
00267          
00268 
00269          if( user_inputs.xsize != user_inputs.ysize ){
00270             user_inputs.voxshape = VOXSHAPE_IRREGULAR ;
00271          } else {
00272             if( user_inputs.xsize != user_inputs.zsize ){
00273                user_inputs.voxshape = VOXSHAPE_SQUARE ;
00274             } else {
00275                user_inputs.voxshape = VOXSHAPE_CUBICAL ;
00276             }
00277          }
00278          user_inputs.fov = user_inputs.xsize * user_inputs.nx ;
00279       }
00280 
00281       
00282 
00283       if( MRILIB_orients[0] != '\0'                  &&
00284           user_inputs.xorient == user_inputs.yorient &&
00285           user_inputs.xorient == user_inputs.zorient   ){
00286 
00287          char acod ; int icod ;
00288 
00289 STATUS("setting orientation from MRILIB_orients") ;
00290 
00291          acod=toupper(MRILIB_orients[0]); icod=ORCODE(acod); if(icod >= 0) user_inputs.xorient=icod;
00292          acod=toupper(MRILIB_orients[2]); icod=ORCODE(acod); if(icod >= 0) user_inputs.yorient=icod;
00293          acod=toupper(MRILIB_orients[4]); icod=ORCODE(acod); if(icod >= 0) user_inputs.zorient=icod;
00294 
00295          if( use_MRILIB_zoff ){                     
00296             if( fabs(user_inputs.zorigin-MRILIB_zoff) > 0.01 ){
00297               user_inputs.zorigin = MRILIB_zoff ;
00298               user_inputs.xyz_centered &= ~ZCENTERED ;
00299             }
00300          }
00301 
00302          if( use_MRILIB_xoff ){                     
00303             if( fabs(user_inputs.xorigin-MRILIB_xoff) > 0.01 ){
00304               user_inputs.xorigin = MRILIB_xoff ;
00305               user_inputs.xyz_centered &= ~XCENTERED ;
00306             }
00307          }
00308 
00309          if( use_MRILIB_yoff ){                     
00310             if( fabs(user_inputs.yorigin-MRILIB_yoff) > 0.01 ){
00311               user_inputs.yorigin = MRILIB_yoff ;
00312               user_inputs.xyz_centered &= ~YCENTERED ;
00313             }
00314          }
00315       }
00316 
00317       
00318 
00319       if( use_zoff ){
00320          user_inputs.zorigin = zoff ;
00321          user_inputs.xyz_centered &= ~ZCENTERED ;
00322       }
00323    }
00324 
00325    all_good = T3D_check_data( False ) ;
00326 
00327 
00328 
00329 
00330    if( all_good ){
00331       int iii =  (user_inputs.xincode > 0)
00332                + (user_inputs.yincode > 0) + (user_inputs.zincode > 0) ;
00333 
00334       if( iii > 0 && iii < 3 ) all_good = False ;
00335    }
00336 
00337    
00338 
00339    if( user_inputs.ntt > 1 && MRILIB_tr > 0.0 ){
00340       if( user_inputs.TR <= 0.0 ){
00341          int ii ;
00342          user_inputs.TR     = MRILIB_tr ;
00343          user_inputs.tunits = UNITS_SEC_TYPE ;
00344          if( user_inputs.tpattern != NULL ){
00345            for( ii=0 ; ii < user_inputs.nzz ; ii++ ){
00346              user_inputs.tpattern[ii] *= MRILIB_tr ;
00347            }
00348          }
00349          printf("Setting TR=%gs from image header\n",MRILIB_tr) ;
00350 
00351       } else {
00352          printf("Command line TR=%g%s ; Images TR=%gs\n",
00353                 user_inputs.TR,UNITS_TYPE_LABEL(user_inputs.tunits),MRILIB_tr) ;
00354       }
00355    }
00356    if( user_inputs.ntt > 1 && user_inputs.TR <= 0.0 ){
00357       printf("Setting TR=1s by default\n") ;
00358       user_inputs.TR = 1.0 ; user_inputs.tunits = UNITS_SEC_TYPE ;
00359    }
00360 
00361    if( all_good && !user_inputs.nosave ){      
00362       T3D_save_file_CB( NULL , NULL , NULL ) ;
00363       printf("3D dataset written to disk\n") ;
00364       exit(0) ;
00365    }
00366 
00367    
00368 
00369    printf("Making widgets") ; fflush(stdout) ;
00370 
00371    if( wset.topshell == NULL )
00372      wset.topshell = XtVaAppInitialize( &app , "AFNI" , NULL , 0 ,
00373                                         &argc , argv , FALLback , NULL ) ;
00374 
00375    AFNI_load_defaults( wset.topshell ) ;
00376    if( argopt.ncolor <= 2   ) argopt.ncolor = INIT_ngray ;
00377    if( argopt.gamma  <= 0.0 ) argopt.gamma  = INIT_gamma ;
00378 
00379    if( argopt.xtwarns == False )
00380       old_handler = XtAppSetWarningHandler(app,AFNI_handler) ;  
00381 
00382    if( MCW_isitmwm(wset.topshell) ){
00383       XtVaSetValues( wset.topshell ,
00384                         XmNmwmDecorations ,
00385                         MWM_DECOR_ALL | MWM_DECOR_RESIZEH | MWM_DECOR_MAXIMIZE ,
00386                      NULL ) ;
00387 
00388       
00389 
00390       XtVaSetValues( XmGetXmDisplay(XtDisplay(wset.topshell)) ,
00391                         XmNdragInitiatorProtocolStyle , XmDRAG_NONE ,
00392                         XmNdragReceiverProtocolStyle  , XmDRAG_NONE ,
00393                      NULL ) ;
00394    }
00395 
00396    
00397 
00398    T3D_create_widgets() ;
00399    MCW_help_CB(wset.topshell,NULL,NULL) ;  
00400 
00401    printf("\n") ; fflush(stdout) ;
00402 
00403    if( AFNI_noenv("AFNI_HINTS") ) MCW_hint_toggle() ;
00404 
00405    
00406 
00407    (void) XtAppAddTimeOut( app , 999 , AFNI_startup_timeout_CB , NULL ) ;
00408    XtAppMainLoop(app) ;
00409    exit(0) ;
00410 }
00411 
00412 
00413 
00414 void T3D_create_widgets(void)
00415 {
00416 ENTRY("T3D_create_widgets") ;
00417    wset.dc  = MCW_new_DC( wset.topshell, argopt.ncolor,
00418                           NCOLOVR,FD_colovr,FD_colovr, argopt.gamma , 0 );
00419    wset.seq = NULL ;  
00420 
00421    
00422 
00423    wset.topform = XtVaCreateWidget(
00424                      "dialog" , xmFormWidgetClass , wset.topshell ,
00425                          XmNborderWidth , 0 ,
00426 #if 1
00427                          XmNtraversalOn , False ,
00428 #endif
00429                      NULL ) ;
00430 
00431    MCW_register_help( wset.topform ,
00432                       "I weep for Adonais--he is dead!\n"
00433                       "Oh, weep for Adonais! though our tears\n"
00434                       "Thaw not the frost which binds so dear a head!\n"
00435                       "And thou, sad Hour, selected from all years\n"
00436                       "To mourn our loss, rouse thy obscure compeers,\n"
00437                       "And teach them thine own sorrow, say: 'With me\n"
00438                       "Died Adonais; till the Future dares\n"
00439                       "Forget the Past, his fate and fame shall be\n"
00440                       "An echo and a light unto eternity!'"
00441                     ) ;
00442 
00443    
00444 
00445    wset.xorient_av = new_MCW_arrowval(
00446                       wset.topform ,                     
00447                       "x orientation\n(across screen)" , 
00448                       MCW_AV_downup ,                    
00449                       FIRST_ORIENT_TYPE ,                
00450                       LAST_ORIENT_TYPE ,                 
00451                       user_inputs.xorient ,              
00452                       MCW_AV_readtext ,                  
00453                       0 ,                                
00454                       T3D_orient_av_CB , NULL ,          
00455                       T3D_text_display ,                 
00456                       ORIENT_typestr                     
00457                      ) ;
00458 
00459    XtVaSetValues( wset.xorient_av->wrowcol ,
00460                      XmNleftAttachment , XmATTACH_FORM ,
00461                      XmNleftOffset     , T3D_FORM_SPACING ,
00462                      XmNtopAttachment  , XmATTACH_FORM ,
00463                      XmNtopOffset      , T3D_FORM_SPACING ,
00464                   NULL ) ;
00465 
00466    wset.yorient_av = new_MCW_arrowval(
00467                       wset.topform ,                     
00468                       "y orientation\n (down screen) " , 
00469                       MCW_AV_downup ,                    
00470                       FIRST_ORIENT_TYPE ,                
00471                       LAST_ORIENT_TYPE ,                 
00472                       user_inputs.yorient ,              
00473                       MCW_AV_readtext ,                  
00474                       0 ,                                
00475                       T3D_orient_av_CB , NULL ,          
00476                       T3D_text_display ,                 
00477                       ORIENT_typestr                     
00478                      ) ;
00479 
00480    XtVaSetValues( wset.yorient_av->wrowcol ,
00481                      XmNtopAttachment  , XmATTACH_WIDGET ,
00482                      XmNtopWidget      , wset.xorient_av->wrowcol ,
00483                      XmNtopOffset      , T3D_FORM_SPACING ,
00484                      XmNleftAttachment , XmATTACH_FORM ,
00485                      XmNleftOffset     , T3D_FORM_SPACING ,
00486                   NULL ) ;
00487 
00488    wset.zorient_av = new_MCW_arrowval(
00489                       wset.topform ,                     
00490                       "z orientation\n(slices 0,1,..)" , 
00491                       MCW_AV_downup ,                    
00492                       FIRST_ORIENT_TYPE ,                
00493                       LAST_ORIENT_TYPE ,                 
00494                       user_inputs.zorient ,              
00495                       MCW_AV_readtext ,                  
00496                       0 ,                                
00497                       T3D_orient_av_CB , NULL ,          
00498                       T3D_text_display ,                 
00499                       ORIENT_typestr                     
00500                      ) ;
00501 
00502    XtVaSetValues( wset.zorient_av->wrowcol ,
00503                      XmNtopAttachment  , XmATTACH_WIDGET ,
00504                      XmNtopWidget      , wset.yorient_av->wrowcol ,
00505                      XmNtopOffset      , T3D_FORM_SPACING ,
00506                      XmNleftAttachment , XmATTACH_FORM ,
00507                      XmNleftOffset     , T3D_FORM_SPACING ,
00508                   NULL ) ;
00509 
00510    XtVaSetValues( wset.xorient_av->wtext ,
00511                      XmNcolumns   , LONGEST_ORIENT_TYPESTR ,
00512                      XmNmaxLength , LONGEST_ORIENT_TYPESTR ,
00513                   NULL ) ;
00514 
00515    XtVaSetValues( wset.yorient_av->wtext ,
00516                      XmNcolumns   , LONGEST_ORIENT_TYPESTR ,
00517                      XmNmaxLength , LONGEST_ORIENT_TYPESTR ,
00518                   NULL ) ;
00519 
00520    XtVaSetValues( wset.zorient_av->wtext ,
00521                      XmNcolumns   , LONGEST_ORIENT_TYPESTR ,
00522                      XmNmaxLength , LONGEST_ORIENT_TYPESTR ,
00523                   NULL ) ;
00524 
00525    wset.xorient_av->allow_wrap = 1 ;
00526    wset.yorient_av->allow_wrap = 1 ;
00527    wset.zorient_av->allow_wrap = 1 ;
00528 
00529    MCW_reghelp_children( wset.xorient_av->wrowcol ,
00530       "Choose the anatomical orientation\n"
00531       "which fits the images when displayed\n"
00532       "in their ORIGINAL orientation:\n"
00533       "left->right, across the screen" ) ;
00534    MCW_reghint_children( wset.xorient_av->wrowcol ,
00535                          "Anatomical orientation across screen" ) ;
00536 
00537    MCW_reghelp_children( wset.yorient_av->wrowcol ,
00538       "Choose the anatomical orientation\n"
00539       "which fits the images when displayed\n"
00540       "in their ORIGINAL orientation:\n"
00541       "top->bottom, down the screen" ) ;
00542    MCW_reghint_children( wset.yorient_av->wrowcol ,
00543                          "Anatomical orientation down screen" ) ;
00544 
00545    MCW_reghelp_children( wset.zorient_av->wrowcol ,
00546       "Choose the anatomical orientation\n"
00547       "which fits the images when displayed\n"
00548       "in their ORIGINAL orientation:\n"
00549       "slice order, `thru' the screen" ) ;
00550    MCW_reghint_children( wset.zorient_av->wrowcol ,
00551                          "Anatomical orientation in slice direction" ) ;
00552 
00553    printf(".");fflush(stdout);
00554 
00555    
00556 
00557    wset.xsize_av = new_MCW_arrowval(
00558                       wset.topform ,                
00559                       "x voxel\nsize (mm)" ,        
00560                       MCW_AV_downup ,               
00561                       1 ,                           
00562                       9999 ,                        
00563                       (int)(100*user_inputs.xsize), 
00564                       MCW_AV_editext ,              
00565                       2 ,                           
00566                       T3D_size_av_CB , NULL ,       
00567                       NULL , NULL                   
00568                      ) ;
00569 
00570    XtVaSetValues( wset.xsize_av->wrowcol ,
00571                      XmNtopAttachment  , XmATTACH_FORM ,
00572                      XmNtopOffset      , T3D_FORM_SPACING ,
00573                      XmNleftAttachment , XmATTACH_WIDGET ,
00574                      XmNleftWidget     , wset.xorient_av->wrowcol ,
00575                      XmNleftOffset     , T3D_FORM_SPACING ,
00576                   NULL ) ;
00577 
00578 
00579 
00580 
00581 
00582    wset.ysize_av = new_MCW_arrowval(
00583                       wset.topform ,                
00584                       "y voxel\nsize (mm)" ,        
00585                       MCW_AV_downup ,               
00586                       1 ,                           
00587                       9999 ,                        
00588                       (int)(100*user_inputs.ysize), 
00589                       MCW_AV_editext ,              
00590                       2 ,                           
00591                       T3D_size_av_CB , NULL ,       
00592                       NULL , NULL                   
00593                      ) ;
00594 
00595    XtVaSetValues( wset.ysize_av->wrowcol ,
00596                      XmNtopAttachment  , XmATTACH_WIDGET ,
00597                      XmNtopWidget      , wset.xsize_av->wrowcol ,
00598                      XmNtopOffset      , T3D_FORM_SPACING ,
00599                      XmNleftAttachment , XmATTACH_WIDGET ,
00600                      XmNleftWidget     , wset.xorient_av->wrowcol ,
00601                      XmNleftOffset     , T3D_FORM_SPACING ,
00602                   NULL ) ;
00603 
00604    wset.zsize_av = new_MCW_arrowval(
00605                       wset.topform ,                
00606                       "z voxel\nsize (mm)" ,        
00607                       MCW_AV_downup ,               
00608                       1 ,                           
00609                       9999 ,                        
00610                       (int)(100*user_inputs.zsize), 
00611                       MCW_AV_editext ,              
00612                       2 ,                           
00613                       T3D_size_av_CB , NULL ,       
00614                       NULL , NULL                   
00615                      ) ;
00616 
00617    XtVaSetValues( wset.zsize_av->wrowcol ,
00618                      XmNtopAttachment  , XmATTACH_WIDGET ,
00619                      XmNtopWidget      , wset.ysize_av->wrowcol ,
00620                      XmNtopOffset      , T3D_FORM_SPACING ,
00621                      XmNleftAttachment , XmATTACH_WIDGET ,
00622                      XmNleftWidget     , wset.xorient_av->wrowcol ,
00623                      XmNleftOffset     , T3D_FORM_SPACING ,
00624                   NULL ) ;
00625 
00626 #ifdef ALLOW_NONCONTIG
00627    wset.zspacing_av = new_MCW_arrowval(
00628                         wset.topform ,                    
00629                         "z voxel\nspacing  " ,            
00630                         MCW_AV_downup ,                   
00631                         1 ,                               
00632                         9999 ,                            
00633                         (int)(100*user_inputs.zspacing),  
00634                         MCW_AV_editext ,                  
00635                         2 ,                               
00636                         T3D_size_av_CB , NULL ,           
00637                         NULL , NULL                       
00638                       ) ;
00639 
00640    XtVaSetValues( wset.zspacing_av->wrowcol ,
00641                      XmNtopAttachment  , XmATTACH_WIDGET ,
00642                      XmNtopWidget      , wset.zsize_av->wrowcol ,
00643                      XmNtopOffset      , T3D_FORM_SPACING ,
00644                      XmNleftAttachment , XmATTACH_WIDGET ,
00645                      XmNleftWidget     , wset.xorient_av->wrowcol ,
00646                      XmNleftOffset     , T3D_FORM_SPACING ,
00647                   NULL ) ;
00648 #endif 
00649 
00650    wset.fov_av = new_MCW_arrowval(
00651                       wset.topform ,             
00652                       "Field of\nview (mm)" ,    
00653                       MCW_AV_downup ,            
00654                       1 ,                        
00655                       99999 ,                    
00656                       (int)(10*user_inputs.fov), 
00657                       MCW_AV_editext ,           
00658                       1 ,                        
00659                       T3D_fov_av_CB , NULL ,     
00660                       NULL , NULL                
00661                      ) ;
00662 
00663    XtVaSetValues( wset.fov_av->wrowcol ,
00664                      XmNtopAttachment  , XmATTACH_WIDGET ,
00665 #ifdef ALLOW_NONCONTIG
00666                      XmNtopWidget      , wset.zspacing_av->wrowcol ,
00667 #else
00668                      XmNtopWidget      , wset.zsize_av->wrowcol ,
00669 #endif
00670                      XmNtopOffset      , T3D_FORM_SPACING ,
00671                      XmNleftAttachment , XmATTACH_WIDGET ,
00672                      XmNleftWidget     , wset.xorient_av->wrowcol ,
00673                      XmNleftOffset     , T3D_FORM_SPACING ,
00674                   NULL ) ;
00675 
00676    wset.voxshape_bbox = new_MCW_bbox(
00677                           wset.topform ,        
00678                           3 ,                   
00679                           T3D_voxshape_label ,  
00680                           MCW_BB_radio_one ,    
00681                           MCW_BB_frame ,        
00682                           T3D_voxshape_CB ,     
00683                           NULL                  
00684                         ) ;
00685 
00686    XtVaSetValues( wset.voxshape_bbox->wtop ,
00687                      XmNrightAttachment  , XmATTACH_WIDGET ,
00688                      XmNrightWidget      , wset.fov_av->wrowcol ,
00689                      XmNrightOffset      , T3D_FORM_SPACING ,
00690                      XmNtopAttachment    , XmATTACH_OPPOSITE_WIDGET ,
00691                      XmNtopWidget        , wset.fov_av->wrowcol ,
00692                      XmNtopOffset        , 0 ,
00693                   NULL ) ;
00694 
00695 #ifdef ALLOW_NONCONTIG
00696    wset.voxcontig_bbox = new_MCW_bbox(
00697                           wset.topform ,        
00698                           3 ,                   
00699                           T3D_voxcontig_label , 
00700                           MCW_BB_radio_one ,    
00701                           MCW_BB_frame ,        
00702                           T3D_voxcontig_CB ,    
00703                           NULL                  
00704                         ) ;
00705 
00706    XtSetSensitive( wset.voxcontig_bbox->wbut[1] , False ) ;
00707    XtSetSensitive( wset.voxcontig_bbox->wbut[2] , False ) ;
00708 
00709    XtVaSetValues( wset.voxcontig_bbox->wtop ,
00710                      XmNrightAttachment  , XmATTACH_WIDGET ,
00711                      XmNrightWidget      , wset.voxshape_bbox->wtop ,
00712                      XmNrightOffset      , T3D_FORM_SPACING ,
00713                      XmNtopAttachment    , XmATTACH_OPPOSITE_WIDGET ,
00714                      XmNtopWidget        , wset.voxshape_bbox->wtop ,
00715                      XmNtopOffset        , 0 ,
00716                   NULL ) ;
00717 #endif 
00718 
00719    MCW_reghelp_children( wset.xsize_av->wrowcol ,
00720     "If in-slice voxel dimensions are\n"
00721     "not square, use this to set the\n"
00722     "x axis (across screen) dimension" ) ;
00723    MCW_reghint_children( wset.xsize_av->wrowcol ,
00724                          "Across screen voxel size" ) ;
00725 
00726    MCW_reghelp_children( wset.ysize_av->wrowcol ,
00727     "If in-slice voxel dimensions are\n"
00728     "not square, use this to set the\n"
00729     "y axis (down screen) dimension" ) ;
00730    MCW_reghint_children( wset.ysize_av->wrowcol ,
00731                          "Down screen voxel size" ) ;
00732 
00733    MCW_reghelp_children( wset.zsize_av->wrowcol ,
00734     "If voxels are not cubical,\n"
00735     "use this to set the z axis\n"
00736     "(slice direction) thickness" ) ;
00737    MCW_reghint_children( wset.ysize_av->wrowcol ,
00738                          "Slice direction voxel size" ) ;
00739 
00740 #ifdef ALLOW_NONCONTIG
00741    MCW_reghelp_children( wset.zspacing_av->wrowcol ,
00742     "If the slices are not\n"
00743     "contiguous, use this to\n"
00744     "set the center-to-center\n"
00745     "slice spacing" ) ;
00746 #endif 
00747 
00748    MCW_reghelp_children( wset.fov_av->wrowcol ,
00749     "If the voxels are cubical,\n"
00750     "or at least square, use this\n"
00751     "to specify the sizes by giving\n"
00752     "the Field-Of-View dimension\n"
00753     "(the width across screen of images)" ) ;
00754    MCW_reghint_children( wset.fov_av->wrowcol ,
00755                          "In-slice width of entire image" ) ;
00756 
00757    MCW_reghelp_children( wset.voxshape_bbox->wrowcol ,
00758                          "Choose one button to\n"
00759                          "specify the voxel 'shape':\n"
00760                          " cubical  = all dimensions equal\n"
00761                          " square   = x & y dimensions\n"
00762                          "            equal, z different\n"
00763                          " irregular= all dimensions unequal" ) ;
00764    MCW_reghint_children( wset.voxshape_bbox->wrowcol ,
00765                          "Specify voxel shape" ) ;
00766 
00767 #ifdef ALLOW_NONCONTIG
00768    MCW_reghelp_children( wset.voxcontig_bbox->wrowcol ,
00769     "Pressed IN:  slices are contiguous\n"
00770     "Pressed OUT: slices are not contiguous\n"
00771     "(i.e., z size and z spacing differ)" ) ;
00772 #endif 
00773 
00774    
00775 
00776    if( user_inputs.xsize != user_inputs.ysize ){
00777       user_inputs.voxshape = VOXSHAPE_IRREGULAR ;
00778    } else {
00779       if( user_inputs.xsize != user_inputs.zsize ){
00780          user_inputs.voxshape = VOXSHAPE_SQUARE ;
00781       } else {
00782          user_inputs.voxshape = VOXSHAPE_CUBICAL ;
00783       }
00784    }
00785 
00786    printf(".");fflush(stdout);
00787 
00788    
00789 
00790    { char buf[96] ;
00791      XmString xstr ;
00792 
00793      sprintf( buf,"TR=%.3f%s Torg=%.3f\nNR=%d Nz=%d",
00794               user_inputs.TR  , UNITS_TYPE_LABEL(user_inputs.tunits) ,
00795               user_inputs.Torg,
00796               user_inputs.ntt , user_inputs.nzz ) ;
00797      xstr = XmStringCreateLtoR( buf , XmFONTLIST_DEFAULT_TAG ) ;
00798 
00799      wset.TR_label =
00800       XtVaCreateManagedWidget(
00801          "dialog" , xmLabelWidgetClass , wset.topform ,
00802             XmNlabelString      , xstr ,
00803             XmNrecomputeSize    , False ,
00804             XmNalignment        , XmALIGNMENT_BEGINNING ,
00805             XmNtopAttachment    , XmATTACH_WIDGET ,
00806             XmNtopWidget        , wset.fov_av->wrowcol ,
00807             XmNtopOffset        , T3D_FORM_SPACING ,
00808             XmNleftAttachment   , XmATTACH_WIDGET ,
00809             XmNleftWidget       , wset.voxshape_bbox->wtop ,
00810             XmNleftOffset       , T3D_FORM_SPACING ,
00811          NULL ) ;
00812 
00813       XmStringFree( xstr ) ;
00814 
00815       MCW_register_help( wset.TR_label ,
00816          "Shows the TR (inter-brick time), number\n"
00817          "of bricks NR, and number of slizes Nz,\n"
00818          "for time-dependent datasets.\n"
00819          "These CANNOT be changed interactively.\n"
00820          "They can only be set on the command line." ) ;
00821 
00822       MCW_register_hint( wset.TR_label , "3D+time parameters" ) ;
00823 
00824      if( user_inputs.ntt < 2 )
00825         XtUnmanageChild( wset.TR_label ) ;
00826    }
00827 
00828    
00829 
00830    wset.xorigin_av = new_MCW_arrowval(
00831                         wset.topform ,                  
00832                         "x origin (mm)\n[left edge]" ,  
00833                         MCW_AV_downup ,                 
00834                        -99999 ,                         
00835                         99999 ,                         
00836                         (int)(100*user_inputs.xorigin), 
00837                         MCW_AV_editext ,                
00838                         2 ,                             
00839                         T3D_origin_av_CB , NULL ,       
00840                         NULL , NULL                     
00841                      ) ;
00842 
00843    XtVaSetValues( wset.xorigin_av->wrowcol ,
00844                      XmNleftAttachment , XmATTACH_WIDGET ,
00845                      XmNleftWidget     , wset.xsize_av->wrowcol ,
00846                      XmNleftOffset     , T3D_FORM_SPACING ,
00847                      XmNtopAttachment  , XmATTACH_FORM ,
00848                      XmNtopOffset      , T3D_FORM_SPACING ,
00849                   NULL ) ;
00850 
00851    wset.xorigin_label =
00852       XtVaCreateManagedWidget(
00853          "dialog" , xmLabelWidgetClass , wset.topform ,
00854             LABEL_ARG("X") ,
00855             XmNrecomputeSize  , False ,
00856             XmNleftAttachment , XmATTACH_WIDGET ,
00857             XmNleftWidget     , wset.xorigin_av->wrowcol ,
00858             XmNleftOffset     , 1 ,
00859             XmNtopAttachment  , XmATTACH_OPPOSITE_WIDGET ,
00860             XmNtopWidget      , wset.xorigin_av->wrowcol ,
00861             XmNtopOffset      , 2 ,
00862          NULL ) ;
00863 
00864    wset.yorigin_av = new_MCW_arrowval(
00865                         wset.topform ,                  
00866                         "y origin (mm)\n[top edge]" ,   
00867                         MCW_AV_downup ,                 
00868                        -99999 ,                         
00869                         99999 ,                         
00870                         (int)(100*user_inputs.yorigin), 
00871                         MCW_AV_editext ,                
00872                         2 ,                             
00873                         T3D_origin_av_CB , NULL ,       
00874                         NULL , NULL                     
00875                      ) ;
00876 
00877    XtVaSetValues( wset.yorigin_av->wrowcol ,
00878                      XmNtopAttachment  , XmATTACH_WIDGET ,
00879                      XmNtopWidget      , wset.xorigin_av->wrowcol ,
00880                      XmNtopOffset      , T3D_FORM_SPACING ,
00881                      XmNleftAttachment , XmATTACH_WIDGET ,
00882                      XmNleftWidget     , wset.xsize_av->wrowcol ,
00883                      XmNleftOffset     , T3D_FORM_SPACING ,
00884                   NULL ) ;
00885 
00886    wset.yorigin_label =
00887       XtVaCreateManagedWidget(
00888          "dialog" , xmLabelWidgetClass , wset.topform ,
00889             LABEL_ARG("X") ,
00890             XmNrecomputeSize  , False ,
00891             XmNleftAttachment , XmATTACH_WIDGET ,
00892             XmNleftWidget     , wset.yorigin_av->wrowcol ,
00893             XmNleftOffset     , 1 ,
00894             XmNtopAttachment  , XmATTACH_OPPOSITE_WIDGET ,
00895             XmNtopWidget      , wset.yorigin_av->wrowcol ,
00896             XmNtopOffset      , 2 ,
00897          NULL ) ;
00898 
00899    wset.zorigin_av = new_MCW_arrowval(
00900                         wset.topform ,                  
00901                         "z origin (mm)\n[slice 0]" ,    
00902                         MCW_AV_downup ,                 
00903                        -99999 ,                         
00904                         99999 ,                         
00905                         (int)(100*user_inputs.zorigin), 
00906                         MCW_AV_editext ,                
00907                         2 ,                             
00908                         T3D_origin_av_CB , NULL ,       
00909                         NULL , NULL                     
00910                      ) ;
00911 
00912    XtVaSetValues( wset.zorigin_av->wrowcol ,
00913                      XmNtopAttachment  , XmATTACH_WIDGET ,
00914                      XmNtopWidget      , wset.yorigin_av->wrowcol ,
00915                      XmNtopOffset      , T3D_FORM_SPACING ,
00916                      XmNleftAttachment , XmATTACH_WIDGET ,
00917                      XmNleftWidget     , wset.xsize_av->wrowcol ,
00918                      XmNleftOffset     , T3D_FORM_SPACING ,
00919                   NULL ) ;
00920 
00921    wset.zorigin_label =
00922       XtVaCreateManagedWidget(
00923          "dialog" , xmLabelWidgetClass , wset.topform ,
00924             LABEL_ARG("X") ,
00925             XmNrecomputeSize  , False ,
00926             XmNleftAttachment , XmATTACH_WIDGET ,
00927             XmNleftWidget     , wset.zorigin_av->wrowcol ,
00928             XmNleftOffset     , 1 ,
00929             XmNtopAttachment  , XmATTACH_OPPOSITE_WIDGET ,
00930             XmNtopWidget      , wset.zorigin_av->wrowcol ,
00931             XmNtopOffset      , 2 ,
00932          NULL ) ;
00933 
00934    wset.centered_bbox = new_MCW_bbox(
00935                           wset.topform ,       
00936                           3 ,                  
00937                           T3D_centered_label , 
00938                           MCW_BB_check ,       
00939                           MCW_BB_frame ,       
00940                           T3D_centered_CB ,    
00941                           NULL                 
00942                         ) ;
00943 
00944    XtVaSetValues( wset.centered_bbox->wtop ,
00945 #if 0
00946                      XmNleftAttachment   , XmATTACH_WIDGET ,
00947                      XmNleftWidget       , wset.fov_av->wrowcol ,
00948                      XmNleftOffset       , T3D_FORM_SPACING ,
00949 #else
00950                      XmNrightAttachment  , XmATTACH_OPPOSITE_WIDGET ,
00951                      XmNrightWidget      , wset.zorigin_av->wrowcol ,
00952                      XmNrightOffset      , 0 ,
00953 #endif
00954                      XmNtopAttachment    , XmATTACH_OPPOSITE_WIDGET ,
00955                      XmNtopWidget        , wset.fov_av->wrowcol ,
00956                      XmNtopOffset        , 0 ,
00957                   NULL ) ;
00958 
00959    MCW_reghelp_children( wset.centered_bbox->wrowcol ,
00960     "Choose any combination of\n"
00961     "buttons to indicate whether\n"
00962     "each axis is centered\n"
00963     "in the gradient coil fields:\n"
00964     "Pressed IN means centered\n"
00965     "Pressed OUT means not centered" ) ;
00966    MCW_reghint_children( wset.centered_bbox->wrowcol ,
00967                          "Is data domain centered around 0?" ) ;
00968 
00969    MCW_reghelp_children( wset.xorigin_av->wrowcol ,
00970       "Use the arrows (or type) to enter\n"
00971       "the x-axis distance from the center of\n"
00972       "the first voxel to the\n"
00973       "gradient coil (0,0,0) point" ) ;
00974    MCW_reghint_children( wset.xorigin_av->wrowcol ,
00975                          "X-axis distance to 1st voxel center" ) ;
00976 
00977    MCW_reghelp_children( wset.yorigin_av->wrowcol ,
00978       "Use the arrows (or type) to enter\n"
00979       "the y-axis distance from the center of\n"
00980       "the first voxel to the\n"
00981       "gradient coil (0,0,0) point" ) ;
00982    MCW_reghint_children( wset.yorigin_av->wrowcol ,
00983                          "Y-axis distance to 1st voxel center" ) ;
00984 
00985    MCW_reghelp_children( wset.zorigin_av->wrowcol ,
00986       "Use the arrows (or type) to enter\n"
00987       "the z-axis distance from the center of\n"
00988       "the first voxel to the\n"
00989       "gradient coil (0,0,0) point" ) ;
00990    MCW_reghint_children( wset.zorigin_av->wrowcol ,
00991                          "Z-axis distance to 1st voxel center" ) ;
00992 
00993    MCW_register_help( wset.xorigin_label ,
00994                       "Shows the direction that the\n"
00995                       "x origin distance applies" ) ;
00996    MCW_register_hint( wset.xorigin_label ,
00997                       "Direction of x origin distance" ) ;
00998 
00999    MCW_register_help( wset.yorigin_label ,
01000                       "Shows the direction that the\n"
01001                       "y origin distance applies" ) ;
01002    MCW_register_hint( wset.yorigin_label ,
01003                       "Direction of y origin distance" ) ;
01004 
01005    MCW_register_help( wset.zorigin_label ,
01006                       "Shows the direction that the\n"
01007                       "z origin distance applies" ) ;
01008    MCW_register_hint( wset.zorigin_label ,
01009                       "Direction of z origin distance" ) ;
01010 
01011    printf(".");fflush(stdout);
01012 
01013    
01014 
01015    wset.region_separator =
01016       XtVaCreateManagedWidget(
01017          "dialog" , xmSeparatorGadgetClass , wset.topform ,
01018             XmNseparatorType   , XmDOUBLE_LINE ,
01019             XmNmargin          , 3             ,
01020             XmNleftAttachment  , XmATTACH_FORM ,
01021             XmNrightAttachment , XmATTACH_FORM ,
01022             XmNtopAttachment   , XmATTACH_WIDGET ,
01023             XmNtopOffset       , T3D_FORM_SPACING ,
01024             XmNtopWidget       , wset.voxshape_bbox->wtop ,
01025          NULL ) ;
01026 
01027    MCW_register_help( wset.region_separator ,
01028                         "Thou art indeed just, Lord, if I contend\n"
01029                         "With thee; but, sir, so what I plead is just.\n"
01030                         "Why do sinners' ways prosper? and why must\n"
01031                         "Disappointment all I endeavour end?\n"
01032                         "Wert thou my enemy, O thou my friend,\n"
01033                         "How wouldst thou worse, I wonder, than thou dost\n"
01034                         "Defeat, thwart me? Oh, the sots and thralls of lust\n"
01035                         "Do in spare hours more thrive than I that spend,\n"
01036                         "Sir, life upon thy cause. See, banks and brakes\n"
01037                         "Now, leav`ed how thick! lac`ed they are again\n"
01038                         "With fretty chervil, look, and fresh wind shakes\n"
01039                         "Them; birds build -- but not I build; no, but strain,\n"
01040                         "Time's eunuch, and not breed one work that wakes.\n"
01041                         "Mine, O thou lord of life, send my roots rain."
01042                     ) ;
01043 
01044    
01045 
01046    wset.view_type_av = new_MCW_arrowval(
01047                          wset.topform ,                   
01048                          "View:  " ,                      
01049                          MCW_AV_downup ,                  
01050                          FIRST_VIEW_TYPE ,                
01051                          LAST_VIEW_TYPE ,                 
01052                          user_inputs.view_type ,          
01053                          MCW_AV_readtext ,                
01054                          0 ,                              
01055                          T3D_orient_av_CB , NULL ,        
01056                          T3D_text_display ,               
01057                          VIEW_typestr                     
01058                        ) ;
01059 
01060    XtVaSetValues( wset.view_type_av->wrowcol ,
01061                      XmNbottomAttachment , XmATTACH_WIDGET ,
01062                      XmNbottomWidget     , wset.region_separator ,
01063                      XmNbottomOffset     , T3D_FORM_SPACING ,
01064                      XmNleftAttachment   , XmATTACH_FORM ,
01065                      XmNleftOffset       , T3D_FORM_SPACING ,
01066                   NULL ) ;
01067 
01068    XtVaSetValues( wset.view_type_av->wtext ,
01069                      XmNcolumns   , LONGEST_VIEW_TYPESTR ,
01070                      XmNmaxLength , LONGEST_VIEW_TYPESTR ,
01071                   NULL ) ;
01072 
01073    MCW_reghelp_children( wset.view_type_av->wrowcol ,
01074       "Sets the view type for the\n"
01075       "dataset being created.  Except\n"
01076       "under unusual circumstances,\n"
01077       "this should be " VIEW_ORIGINAL_STR ) ;
01078 
01079    
01080 
01081    { char buf[32] ;
01082      sprintf( buf , "Datum: %s [%dx%d]\n" ,
01083               MRI_TYPE_name[argopt.datum_all], user_inputs.nx,user_inputs.ny ) ;
01084      wset.datum_label =
01085         XtVaCreateManagedWidget(
01086            "dialog" , xmLabelWidgetClass , wset.topform ,
01087               LABEL_ARG(buf)   ,
01088               XmNbottomAttachment , XmATTACH_WIDGET ,
01089               XmNbottomWidget     , wset.view_type_av->wrowcol ,
01090               XmNbottomOffset     , 1 ,
01091               XmNleftAttachment   , XmATTACH_FORM ,
01092               XmNleftOffset       , T3D_FORM_SPACING ,
01093               XmNmarginHeight     , 0 ,
01094               XmNmarginWidth      , 0 ,
01095            NULL ) ;
01096 
01097    }
01098    MCW_register_help( wset.datum_label ,
01099      "This shows the type of data stored\n"
01100      "in the images as read into to3d.\n"
01101      "You can only alter this by exiting\n"
01102      "the program and using the -datum\n"
01103      "option when you run to3d again." ) ;
01104    MCW_register_hint( wset.datum_label , "Type of data stored in images" ) ;
01105 
01106    
01107 
01108 
01109 
01110 #ifndef NO_NAMES
01111    wset.dataset_name_label =
01112       XtVaCreateManagedWidget(
01113          "dialog" , xmLabelWidgetClass , wset.topform ,
01114             LABEL_ARG("Dataset name:  ") ,
01115             XmNtopAttachment   , XmATTACH_WIDGET ,
01116             XmNtopWidget       , wset.region_separator ,
01117             XmNtopOffset       , T3D_FORM_SPACING ,
01118             XmNleftAttachment  , XmATTACH_FORM ,
01119             XmNleftOffset      , T3D_FORM_SPACING ,
01120          NULL ) ;
01121 
01122    wset.dataset_name_textfield =
01123       XtVaCreateManagedWidget(
01124          "dialog" , xmTextFieldWidgetClass , wset.topform ,
01125             XmNcolumns         , 80 ,
01126             XmNeditable        , True ,
01127             XmNmaxLength       , THD_MAX_NAME-1 ,
01128             XmNresizeWidth     , False ,
01129             XmNcursorPositionVisible , True ,
01130             XmNblinkRate , 0 ,
01131 
01132 
01133 
01134 
01135             XmNvalue           , user_inputs.dataset_name ,
01136 
01137             XmNleftAttachment , XmATTACH_WIDGET ,
01138             XmNleftWidget     , wset.dataset_name_label ,
01139             XmNleftOffset     , T3D_FORM_SPACING ,
01140             XmNtopAttachment  , XmATTACH_OPPOSITE_WIDGET ,
01141             XmNtopWidget      , wset.dataset_name_label ,
01142             XmNtopOffset      , 0 ,
01143          NULL ) ;
01144 
01145    MCW_register_help( wset.dataset_name_label ,
01146     "Every 3D dataset needs a name;\n"
01147     "Type in what you need to remind\n"
01148     "you of the subject/experiment" ) ;
01149 
01150    MCW_register_help( wset.dataset_name_textfield ,
01151     "Every 3D dataset needs a label;\n"
01152     "Type in what you need to remind\n"
01153     "you of the subject/experiment" ) ;
01154 
01155    wset.short_label1_label =
01156       XtVaCreateManagedWidget(
01157          "dialog" , xmLabelWidgetClass , wset.topform ,
01158             LABEL_ARG("Short label:   ") ,
01159             XmNleftAttachment  , XmATTACH_FORM ,
01160             XmNleftOffset      , T3D_FORM_SPACING ,
01161             XmNtopAttachment   , XmATTACH_WIDGET ,
01162             XmNtopWidget       , wset.dataset_name_textfield ,
01163             XmNtopOffset       , T3D_FORM_SPACING ,
01164          NULL ) ;
01165 
01166    wset.short_label1_textfield =
01167       XtVaCreateManagedWidget(
01168          "dialog" , xmTextFieldWidgetClass , wset.topform ,
01169             XmNcolumns         , T3D_NAME_WIDTH ,
01170             XmNeditable        , True ,
01171             XmNmaxLength       , THD_MAX_LABEL-1 ,
01172             XmNresizeWidth     , False ,
01173             XmNcursorPositionVisible , True ,
01174             XmNblinkRate , 0 ,
01175 
01176 
01177 
01178 
01179             XmNvalue           , user_inputs.short_label1 ,
01180 
01181             XmNleftAttachment , XmATTACH_WIDGET ,
01182             XmNleftWidget     , wset.short_label1_label ,
01183             XmNleftOffset     , T3D_FORM_SPACING ,
01184             XmNtopAttachment  , XmATTACH_OPPOSITE_WIDGET ,
01185             XmNtopWidget      , wset.short_label1_label ,
01186             XmNtopOffset      , 0 ,
01187          NULL ) ;
01188 
01189    MCW_register_help( wset.short_label1_label ,
01190     "The short label is used\n"
01191     "for a compact reminder of\n"
01192     "the dataset contents;\n"
01193     "type your choice in" ) ;
01194 
01195    MCW_register_help( wset.short_label1_textfield ,
01196     "The short label is used\n"
01197     "for a compact reminder of\n"
01198     "the dataset contents;\n"
01199     "type your choice in" ) ;
01200 #endif  
01201 
01202    wset.geometry_parent_label =
01203       XtVaCreateManagedWidget(
01204          "dialog" , xmLabelWidgetClass , wset.topform ,
01205             LABEL_ARG("Copy geometry  \nof this dataset") ,
01206             XmNleftAttachment  , XmATTACH_FORM ,
01207             XmNleftOffset      , T3D_FORM_SPACING ,
01208             XmNtopAttachment   , XmATTACH_WIDGET ,
01209 #ifdef NO_NAMES
01210             XmNtopWidget       , wset.region_separator ,
01211 #else
01212             XmNtopWidget       , wset.short_label1_textfield ,
01213 #endif
01214             XmNtopOffset       , T3D_FORM_SPACING ,
01215          NULL ) ;
01216 
01217    wset.geometry_parent_textfield =
01218       XtVaCreateManagedWidget(
01219          "dialog" , xmTextFieldWidgetClass , wset.topform ,
01220             XmNcolumns         , T3D_NAME_WIDTH ,
01221             XmNeditable        , True ,
01222             XmNmaxLength       , THD_MAX_NAME-1 ,
01223             XmNresizeWidth     , False ,
01224             XmNcursorPositionVisible , True ,
01225             XmNblinkRate , 0 ,
01226 
01227 
01228 
01229 
01230             XmNvalue           , user_inputs.geometry_parent_filename ,
01231 
01232             XmNleftAttachment , XmATTACH_WIDGET ,
01233             XmNleftWidget     , wset.geometry_parent_label ,
01234             XmNleftOffset     , T3D_FORM_SPACING ,
01235             XmNtopAttachment  , XmATTACH_OPPOSITE_WIDGET ,
01236             XmNtopWidget      , wset.geometry_parent_label ,
01237             XmNtopOffset      , 0 ,
01238          NULL ) ;
01239 
01240    XtAddCallback( wset.geometry_parent_textfield ,
01241                   XmNactivateCallback ,
01242                   T3D_geometry_parent_CB , NULL ) ;    
01243 
01244    XtAddCallback( wset.geometry_parent_textfield ,
01245                   XmNlosingFocusCallback ,
01246                   T3D_geometry_parent_CB , NULL ) ;    
01247 
01248    XtInsertEventHandler( wset.geometry_parent_textfield ,
01249                          LeaveWindowMask ,             
01250                          FALSE ,
01251                          T3D_pointer_leave_EV , NULL ,
01252                          XtListTail ) ;                
01253 
01254    MCW_register_help( wset.geometry_parent_label ,
01255     "If a previously created 3D dataset\n"
01256     "has the same geometry (voxel sizes,\n"
01257     "etc.), enter its header filename\n"
01258     "and press the Enter key" ) ;
01259    MCW_register_hint( wset.geometry_parent_label ,
01260                       "Use the geometry of another dataset" ) ;
01261 
01262    MCW_register_help( wset.geometry_parent_textfield ,
01263     "If a previously created 3D dataset\n"
01264     "has the same geometry (voxel sizes,\n"
01265     "etc.), enter its header filename name\n"
01266     "here and press the Enter key" ) ;
01267    MCW_register_hint( wset.geometry_parent_textfield ,
01268                       "Use the geometry of another dataset" ) ;
01269 
01270    wset.anatomy_parent_label =
01271       XtVaCreateManagedWidget(
01272          "dialog" , xmLabelWidgetClass , wset.topform ,
01273             LABEL_ARG("Anatomy parent \nis this dataset") ,
01274             XmNleftAttachment  , XmATTACH_WIDGET ,
01275             XmNleftWidget      , wset.geometry_parent_textfield ,
01276             XmNleftOffset      , T3D_FORM_SPACING ,
01277             XmNtopAttachment   , XmATTACH_WIDGET ,
01278 #ifdef NO_NAMES
01279             XmNtopWidget       , wset.region_separator ,
01280 #else
01281             XmNtopWidget       , wset.short_label1_textfield ,
01282 #endif
01283             XmNtopOffset       , T3D_FORM_SPACING ,
01284          NULL ) ;
01285 
01286    wset.anatomy_parent_textfield =
01287       XtVaCreateManagedWidget(
01288          "dialog" , xmTextFieldWidgetClass , wset.topform ,
01289             XmNcolumns         , T3D_NAME_WIDTH ,
01290             XmNeditable        , True ,
01291             XmNmaxLength       , THD_MAX_NAME-1 ,
01292             XmNresizeWidth     , False ,
01293             XmNcursorPositionVisible , True ,
01294             XmNblinkRate , 0 ,
01295 
01296 
01297 
01298 
01299             XmNvalue           , user_inputs.anatomy_parent_filename ,
01300 
01301             XmNleftAttachment , XmATTACH_WIDGET ,
01302             XmNleftOffset     , T3D_FORM_SPACING ,
01303             XmNleftWidget     , wset.anatomy_parent_label ,
01304             XmNtopAttachment  , XmATTACH_OPPOSITE_WIDGET ,
01305             XmNtopWidget      , wset.anatomy_parent_label ,
01306             XmNtopOffset      , 0 ,
01307          NULL ) ;
01308 
01309    XtAddCallback( wset.anatomy_parent_textfield ,
01310                   XmNactivateCallback ,
01311                   T3D_anatomy_parent_CB , NULL ) ;    
01312 
01313    XtAddCallback( wset.anatomy_parent_textfield ,
01314                   XmNlosingFocusCallback ,
01315                   T3D_anatomy_parent_CB , NULL ) ;    
01316 
01317    XtInsertEventHandler( wset.anatomy_parent_textfield ,
01318                          LeaveWindowMask ,             
01319                          FALSE ,
01320                          T3D_pointer_leave_EV , NULL ,
01321                          XtListTail ) ;                
01322 
01323    MCW_register_help( wset.anatomy_parent_label ,
01324     "A dataset may optionally be attached\n"
01325     "to an 'anatomy parent' -- that is, an\n"
01326     "anatomical dataset which is aligned\n"
01327     "with the current dataset; usually, the\n"
01328     "anatomy parent should have been acquired\n"
01329     "during the same imaging session as the\n"
01330     "current dataset, so that this requisite\n"
01331     "alignment is assured.  If no anatomy parent\n"
01332     "is given, then at the time one is needed,\n"
01333     "an appropriate dataset will be chosen from\n"
01334     "the same session directory.\n"
01335     "\n"
01336 #ifdef REQUIRE_ANAT_PARENT
01337     "N.B.: Functional datasets require anatomy parents;\n"
01338     "      for anatomical datasets, anatomy parents are\n"
01339     "      optional."
01340 #else
01341     "N.B.: You only need specify an anatomy parent\n"
01342     "      here if a specific dataset is required."
01343 #endif
01344    ) ;
01345 
01346    MCW_register_help( wset.anatomy_parent_textfield ,
01347     "A dataset may optionally be attached\n"
01348     "to an 'anatomy parent' -- that is, an\n"
01349     "anatomical dataset which is aligned\n"
01350     "with the current dataset; usually, the\n"
01351     "anatomy parent should have been acquired\n"
01352     "during the same imaging session as the\n"
01353     "current dataset, so that this requisite\n"
01354     "alignment is assured.  If no anatomy parent\n"
01355     "is given, then at the time one is needed,\n"
01356     "an appropriate dataset will be chosen from\n"
01357     "the same session directory.\n"
01358     "\n"
01359 #ifdef REQUIRE_ANAT_PARENT
01360     "N.B.: functional datasets require anatomy parents;\n"
01361     "      for anatomical datasets, anatomy parents are\n"
01362     "      optional."
01363 #else
01364     "N.B.: You only need specify an anatomy parent\n"
01365     "      here if a specific dataset is required."
01366 #endif
01367    ) ;
01368 
01369 #ifndef NO_NAMES
01370    wset.geometry_dataname_label =
01371       XtVaCreateManagedWidget(
01372          "dialog" , xmLabelWidgetClass , wset.topform ,
01373             LABEL_ARG("Geometry parent\nDataset name   ") ,
01374             XmNleftAttachment  , XmATTACH_FORM ,
01375             XmNleftOffset      , T3D_FORM_SPACING ,
01376             XmNtopAttachment   , XmATTACH_WIDGET ,
01377             XmNtopWidget       , wset.geometry_parent_textfield ,
01378             XmNtopOffset       , T3D_FORM_SPACING ,
01379             XmNsensitive       , False ,
01380          NULL ) ;
01381 
01382    wset.geometry_dataname_textfield =
01383       XtVaCreateManagedWidget(
01384          "dialog" , xmTextFieldWidgetClass , wset.topform ,
01385             XmNcolumns         , T3D_NAME_WIDTH ,
01386             XmNeditable        , False ,
01387             XmNmaxLength       , THD_MAX_NAME-1 ,
01388             XmNresizeWidth     , False ,
01389 
01390             XmNcursorPositionVisible , False ,
01391             XmNsensitive       , False ,
01392 
01393 
01394 
01395 
01396             XmNvalue           , " " ,
01397 
01398             XmNleftAttachment , XmATTACH_WIDGET ,
01399             XmNleftWidget     , wset.geometry_dataname_label ,
01400             XmNleftOffset     , T3D_FORM_SPACING ,
01401             XmNtopAttachment  , XmATTACH_OPPOSITE_WIDGET ,
01402             XmNtopWidget      , wset.geometry_dataname_label ,
01403             XmNtopOffset      , 0 ,
01404          NULL ) ;
01405 
01406    MCW_register_help( wset.geometry_dataname_label ,
01407     "This item just shows the\n"
01408     "dataset name of the 'geometry\n"
01409     "parent' you selected (e.g., to\n"
01410     "let you decide if you've got\n"
01411     "the right one)." ) ;
01412 
01413    MCW_register_help( wset.geometry_dataname_textfield ,
01414     "This item just shows the\n"
01415     "dataset name of the 'geometry\n"
01416     "parent' you selected (e.g., to\n"
01417     "let you decide if you've got\n"
01418     "the right one)." ) ;
01419 
01420    wset.anatomy_dataname_label =
01421       XtVaCreateManagedWidget(
01422          "dialog" , xmLabelWidgetClass , wset.topform ,
01423             LABEL_ARG("Anatomy parent \nDataset name   ") ,
01424             XmNleftAttachment  , XmATTACH_WIDGET ,
01425             XmNleftWidget      , wset.geometry_dataname_textfield ,
01426             XmNleftOffset      , T3D_FORM_SPACING ,
01427             XmNtopAttachment   , XmATTACH_WIDGET ,
01428             XmNtopWidget       , wset.geometry_parent_textfield ,
01429             XmNtopOffset       , T3D_FORM_SPACING ,
01430             XmNsensitive       , False ,
01431          NULL ) ;
01432 
01433    wset.anatomy_dataname_textfield =
01434       XtVaCreateManagedWidget(
01435          "dialog" , xmTextFieldWidgetClass , wset.topform ,
01436             XmNcolumns         , T3D_NAME_WIDTH ,
01437             XmNeditable        , False ,
01438             XmNmaxLength       , THD_MAX_NAME-1 ,
01439             XmNresizeWidth     , False ,
01440 
01441             XmNcursorPositionVisible , False ,
01442             XmNsensitive       , False ,
01443 
01444 
01445 
01446 
01447             XmNvalue           , " " ,
01448 
01449             XmNleftAttachment , XmATTACH_WIDGET ,
01450             XmNleftWidget     , wset.anatomy_dataname_label ,
01451             XmNleftOffset     , T3D_FORM_SPACING ,
01452             XmNtopAttachment  , XmATTACH_OPPOSITE_WIDGET ,
01453             XmNtopWidget      , wset.anatomy_dataname_label ,
01454             XmNtopOffset      , 0 ,
01455          NULL ) ;
01456 
01457    MCW_register_help( wset.anatomy_dataname_label ,
01458     "This item just shows the\n"
01459     "dataset name of the 'anatomy\n"
01460     "parent' you selected" ) ;
01461 
01462    MCW_register_help( wset.anatomy_dataname_textfield ,
01463     "This item just shows the\n"
01464     "dataset name of the 'anatomy\n"
01465     "parent' you selected" ) ;
01466 
01467    printf(".");fflush(stdout);
01468 #endif  
01469 
01470    
01471 
01472    wset.dataset_type_av =
01473       new_MCW_arrowval(
01474              wset.topform ,                     
01475              "Type of data\nin the images    ", 
01476              MCW_AV_downup ,                    
01477              FIRST_3DIM_TYPE ,                  
01478              LAST_3DIM_TYPE ,                   
01479              user_inputs.dataset_type ,         
01480              MCW_AV_readtext ,                  
01481              0 ,                                
01482              T3D_type_av_CB , NULL ,            
01483              T3D_text_display ,                 
01484              DATASET_typestr                    
01485        ) ;
01486 
01487    wset.dataset_type_av->allow_wrap = 1 ;
01488 
01489    XtVaSetValues( wset.dataset_type_av->wtext ,
01490                      XmNcolumns   , LONGEST_3DIM_TYPESTR ,
01491                      XmNmaxLength , LONGEST_3DIM_TYPESTR ,
01492                   NULL ) ;
01493 
01494    XtVaSetValues( wset.dataset_type_av->wrowcol ,
01495                      XmNleftAttachment , XmATTACH_FORM ,
01496                      XmNleftOffset     , T3D_FORM_SPACING ,
01497                      XmNtopAttachment  , XmATTACH_WIDGET ,
01498 #ifndef NO_NAMES
01499                      XmNtopWidget      , wset.geometry_dataname_label ,
01500 #else
01501                      XmNtopWidget      , wset.geometry_parent_label ,
01502 #endif
01503                      XmNtopOffset      , T3D_FORM_SPACING ,
01504                   NULL ) ;
01505 
01506    MCW_reghelp_children( wset.dataset_type_av->wrowcol ,
01507                           "Use the arrows to specify\n"
01508                           "the type of data stored\n"
01509                           "in the image files.\n"
01510                           "N.B.: 3D+time datasets\n"
01511                           " must be anatomical."     ) ;
01512    MCW_reghint_children( wset.dataset_type_av->wrowcol ,
01513                          "Type of data you acquired" ) ;
01514 
01515    if( user_inputs.ntt > 0 )
01516       AV_SENSITIZE( wset.dataset_type_av , False ) ;
01517 
01518    wset.function_type_av =
01519       new_MCW_arrowval(
01520              wset.topform ,                      
01521              "Type of function \nin the images", 
01522              MCW_AV_downup ,                     
01523              FIRST_FUNC_TYPE ,                   
01524              LAST_FUNC_TYPE ,                    
01525              user_inputs.function_type ,         
01526              MCW_AV_readtext ,                   
01527              0 ,                                 
01528              T3D_type_av_CB , NULL ,             
01529              T3D_text_display ,                  
01530              FUNC_typestr                        
01531        ) ;
01532 
01533    wset.function_type_av->allow_wrap = 1 ;
01534 
01535    XtVaSetValues( wset.function_type_av->wtext ,
01536                      XmNcolumns   , LONGEST_FUNC_TYPESTR ,
01537                      XmNmaxLength , LONGEST_FUNC_TYPESTR ,
01538                   NULL ) ;
01539 
01540    XtVaSetValues( wset.function_type_av->wrowcol ,
01541                      XmNleftAttachment , XmATTACH_WIDGET ,
01542                      XmNleftOffset     , T3D_FORM_SPACING ,
01543                      XmNtopAttachment  , XmATTACH_WIDGET ,
01544                      XmNtopOffset      , T3D_FORM_SPACING ,
01545                      XmNleftWidget     , wset.geometry_parent_textfield ,
01546 #ifndef NO_NAMES
01547                      XmNtopWidget      , wset.geometry_dataname_textfield ,
01548 #else
01549                      XmNtopWidget      , wset.geometry_parent_textfield ,
01550 #endif
01551                      XtNmappedWhenManaged , False ,
01552                   NULL ) ;
01553 
01554    MCW_reghelp_children( wset.function_type_av->wrowcol ,
01555     "Use the arrows to specify\n"
01556     "the type of functional data\n"
01557     "stored in the image files" ) ;
01558    MCW_reghint_children( wset.function_type_av->wrowcol ,
01559                          "Type of functional data" ) ;
01560 
01561    wset.anatomy_type_av =
01562       new_MCW_arrowval(
01563              wset.topform ,                      
01564              "Type of anatomy  \nin the images", 
01565              MCW_AV_downup ,                     
01566              FIRST_ANAT_TYPE ,                   
01567              LAST_ANAT_TYPE ,                    
01568              user_inputs.anatomy_type ,          
01569              MCW_AV_readtext ,                   
01570              0 ,                                 
01571              T3D_type_av_CB , NULL ,             
01572              T3D_text_display ,                  
01573              ANAT_typestr                        
01574        ) ;
01575 
01576    wset.anatomy_type_av->allow_wrap = 1 ;
01577 
01578    XtVaSetValues( wset.anatomy_type_av->wtext ,
01579                      XmNcolumns   , LONGEST_ANAT_TYPESTR ,
01580                      XmNmaxLength , LONGEST_ANAT_TYPESTR ,
01581                   NULL ) ;
01582 
01583    XtVaSetValues( wset.anatomy_type_av->wrowcol ,
01584                      XmNleftAttachment , XmATTACH_WIDGET ,
01585                      XmNleftWidget     , wset.geometry_parent_textfield ,
01586 #ifndef NO_NAMES
01587                      XmNtopWidget      , wset.geometry_dataname_textfield ,
01588 #else
01589                      XmNtopWidget      , wset.geometry_parent_textfield ,
01590 #endif
01591                      XmNleftOffset     , T3D_FORM_SPACING ,
01592                      XmNtopAttachment  , XmATTACH_WIDGET ,
01593                      XmNtopOffset      , T3D_FORM_SPACING ,
01594                      XtNmappedWhenManaged , False ,
01595                   NULL ) ;
01596 
01597    MCW_reghelp_children( wset.anatomy_type_av->wrowcol ,
01598     "Use the arrows to specify\n"
01599     "the type of anatomical data\n"
01600     "stored in the image files" ) ;
01601    MCW_reghint_children( wset.anatomy_type_av->wrowcol ,
01602                          "Type of anatomical data" ) ;
01603 
01604    
01605 
01606    wset.stat_aux_label =
01607       XtVaCreateManagedWidget(
01608          "dialog" , xmLabelWidgetClass , wset.topform ,
01609             XmNleftAttachment , XmATTACH_FORM ,
01610             XmNleftOffset     , T3D_FORM_SPACING ,
01611             XmNtopAttachment  , XmATTACH_WIDGET ,
01612             XmNtopWidget      , wset.dataset_type_av->wrowcol ,
01613             XmNtopOffset      , T3D_FORM_SPACING ,
01614          NULL ) ;
01615 
01616    wset.stat_aux_textfield =
01617       XtVaCreateManagedWidget(
01618          "dialog" , xmTextFieldWidgetClass , wset.topform ,
01619             XmNcolumns        , 80 ,
01620             XmNeditable       , True ,
01621             XmNmaxLength      , THD_MAX_NAME-1 ,
01622             XmNresizeWidth    , False ,
01623             XmNcursorPositionVisible , True ,
01624             XmNblinkRate , 0 ,
01625             XmNleftAttachment , XmATTACH_FORM ,
01626             XmNleftOffset     , T3D_FORM_SPACING ,
01627             XmNtopAttachment  , XmATTACH_WIDGET ,
01628             XmNtopWidget      , wset.stat_aux_label ,
01629             XmNtopOffset      , 1 ,
01630          NULL ) ;
01631 
01632     MCW_register_help( wset.stat_aux_label ,
01633       "Some types of functional data require input\n"
01634       "of extra statistical parameters.  These\n"
01635       "values should be entered in the text field\n"
01636       "below, separated by spaces and/or commas.\n"
01637       "\n"
01638       " Inten+Cor requires the number of\n"
01639       "   samples (images) used, the number of\n"
01640       "   fitting parameters, and the number of\n"
01641       "   orthogonalization parameters.\n"
01642       "\n"
01643       " Inten+Ttest requires the number of\n"
01644       "   degrees-of-freedom in the t-test."
01645     ) ;
01646 
01647     MCW_register_help( wset.stat_aux_textfield ,
01648       "Some types of functional data require input\n"
01649       "of extra statistical parameters.  These\n"
01650       "values should be entered in this text field,\n"
01651       "separated by spaces and/or commas.\n"
01652       "\n"
01653       " Inten+Cor requires the number of\n"
01654       "   samples (images) used, the number of\n"
01655       "   fitting parameters, and the number of\n"
01656       "   orthogonalization parameters.\n"
01657       "\n"
01658       " Inten+Ttest requires the number of\n"
01659       "   degrees-of-freedom in the t-test."
01660     ) ;
01661 
01662     MCW_register_hint( wset.stat_aux_label , "Extra statistical parameters" ) ;
01663     MCW_register_hint( wset.stat_aux_textfield , "Extra statistical parameters" ) ;
01664 
01665 
01666 
01667 
01668 #if 0
01669    XtAddCallback( wset.stat_aux_textfield ,
01670                   XmNactivateCallback ,
01671                   T3D_stat_aux_CB , NULL ) ;    
01672 
01673    XtAddCallback( wset.stat_aux_textfield ,
01674                   XmNlosingFocusCallback ,
01675                   T3D_stat_aux_CB , NULL ) ;    
01676 
01677    XtInsertEventHandler( wset.stat_aux_textfield ,
01678                          LeaveWindowMask ,             
01679                          FALSE ,
01680                          T3D_pointer_leave_EV , NULL ,
01681                          XtListTail ) ;                
01682 #endif
01683 
01684    
01685 
01686    wset.output_file_label =
01687       XtVaCreateManagedWidget(
01688          "dialog" , xmLabelWidgetClass , wset.topform ,
01689             LABEL_ARG("Prefix for 3D  \nDataset file   ") ,
01690 
01691             XmNleftAttachment , XmATTACH_WIDGET ,
01692             XmNleftWidget     , wset.geometry_parent_textfield ,
01693             XmNleftOffset     , T3D_FORM_SPACING ,
01694             XmNtopAttachment  , XmATTACH_WIDGET ,
01695             XmNtopWidget      , wset.stat_aux_textfield ,
01696             XmNtopOffset      , T3D_FORM_SPACING ,
01697             XmNbottomAttachment , XmATTACH_FORM ,
01698             XmNbottomOffset     , T3D_FORM_SPACING ,
01699          NULL ) ;
01700 
01701    wset.output_file_textfield =
01702       XtVaCreateManagedWidget(
01703          "dialog" , xmTextFieldWidgetClass , wset.topform ,
01704             XmNcolumns         , T3D_NAME_WIDTH ,
01705             XmNeditable        , True ,
01706             XmNmaxLength       , THD_MAX_PREFIX-1 ,
01707             XmNresizeWidth     , False ,
01708             XmNcursorPositionVisible , True ,
01709             XmNblinkRate , 0 ,
01710 
01711 
01712 
01713 
01714             XmNvalue           , user_inputs.output_filename ,
01715 
01716             XmNleftAttachment , XmATTACH_WIDGET ,
01717             XmNleftOffset     , T3D_FORM_SPACING ,
01718             XmNleftWidget     , wset.output_file_label ,
01719             XmNtopAttachment  , XmATTACH_OPPOSITE_WIDGET ,
01720             XmNtopWidget      , wset.output_file_label ,
01721             XmNtopOffset      , 0 ,
01722 
01723          NULL ) ;
01724 
01725    MCW_register_help( wset.output_file_label ,
01726     "Type in the 'prefix' for the filenames\n"
01727     "that the 3D dataset will be saved in.\n"
01728     "[The actual filenames will be of the\n"
01729     " form prefix+orig.suff, where suff =\n"
01730     " " DATASET_HEADER_SUFFIX " and " DATASET_BRICK_SUFFIX "]" ) ;
01731 
01732    MCW_register_help( wset.output_file_textfield ,
01733     "Type in the 'prefix' for the filenames\n"
01734     "that the 3D dataset will be saved in.\n"
01735     "[The actual filenames will be of the\n"
01736     " form prefix+orig.suff, where suff =\n"
01737     " " DATASET_HEADER_SUFFIX " and " DATASET_BRICK_SUFFIX "]" ) ;
01738 
01739    MCW_register_hint( wset.output_file_label ,
01740                       "New dataset's 'prefix' for filenames" ) ;
01741    MCW_register_hint( wset.output_file_textfield ,
01742                       "New dataset's 'prefix' for filenames" ) ;
01743 
01744    wset.session_file_label =
01745       XtVaCreateManagedWidget(
01746          "dialog" , xmLabelWidgetClass , wset.topform ,
01747             LABEL_ARG("Session direct.\nfor 3D Datasets") ,
01748 
01749             XmNleftAttachment , XmATTACH_FORM ,
01750             XmNleftOffset     , T3D_FORM_SPACING ,
01751             XmNtopAttachment  , XmATTACH_WIDGET ,
01752             XmNtopWidget      , wset.stat_aux_textfield ,
01753             XmNtopOffset      , T3D_FORM_SPACING ,
01754          NULL ) ;
01755 
01756    wset.session_file_textfield =
01757       XtVaCreateManagedWidget(
01758          "dialog" , xmTextFieldWidgetClass , wset.topform ,
01759             XmNcolumns         , T3D_NAME_WIDTH ,
01760             XmNeditable        , True ,
01761             XmNmaxLength       , THD_MAX_NAME-1 ,
01762             XmNresizeWidth     , False ,
01763             XmNcursorPositionVisible , True ,
01764             XmNblinkRate , 0 ,
01765 
01766 
01767 
01768 
01769             XmNvalue           , user_inputs.session_filename ,
01770 
01771             XmNleftAttachment , XmATTACH_WIDGET ,
01772             XmNleftOffset     , T3D_FORM_SPACING ,
01773             XmNleftWidget     , wset.session_file_label ,
01774             XmNtopAttachment  , XmATTACH_OPPOSITE_WIDGET ,
01775             XmNtopWidget      , wset.session_file_label ,
01776             XmNtopOffset      , 0 ,
01777 
01778          NULL ) ;
01779 
01780    MCW_register_help( wset.session_file_label ,
01781     "Type in the name of the session\n"
01782     "directory in which to save this\n"
01783     "3D dataset, and in which to look\n"
01784     "for the 'parent' datasets" ) ;
01785 
01786    MCW_register_help( wset.session_file_textfield ,
01787     "Type in the name of the session\n"
01788     "directory in which to save this\n"
01789     "3D dataset, and in which to look\n"
01790     "for the 'parent' datasets" ) ;
01791 
01792    MCW_register_hint( wset.session_file_label , "New dataset's directory" ) ;
01793    MCW_register_hint( wset.session_file_textfield , "New dataset's directory" ) ;
01794 
01795    printf(".");fflush(stdout);
01796 
01797    
01798 
01799    wset.action_frame =
01800       XtVaCreateManagedWidget(
01801          "dialog" , xmFrameWidgetClass , wset.topform ,
01802             XmNshadowType       , XmSHADOW_ETCHED_IN ,
01803             XmNleftAttachment   , XmATTACH_WIDGET ,
01804             XmNleftWidget       , wset.anatomy_parent_textfield ,
01805             XmNleftOffset       , T3D_FORM_SPACING ,
01806             XmNbottomAttachment , XmATTACH_FORM ,
01807             XmNbottomOffset     , T3D_FORM_SPACING ,
01808          NULL ) ;
01809 
01810    wset.action_rowcol =
01811       XtVaCreateWidget(
01812          "dialog" , xmRowColumnWidgetClass , wset.action_frame ,
01813             XmNorientation , XmVERTICAL ,
01814             XmNpacking     , XmPACK_TIGHT ,
01815          NULL ) ;
01816 
01817    
01818 
01819    { int    dd = mri_datum_size((MRI_TYPE)argopt.datum_all) ;
01820      char * tt = "Byte Swap[2]" ;
01821      char * ff = "Byte Swap[4]" ;
01822      if( dd == 2 || dd == 4 ){
01823         if( dd == 2 )
01824            wset.swap_pb =
01825             XtVaCreateManagedWidget(
01826                "dialog" , xmPushButtonWidgetClass , wset.action_rowcol ,
01827                   LABEL_ARG(tt) , NULL ) ;
01828          else
01829            wset.swap_pb =
01830             XtVaCreateManagedWidget(
01831                "dialog" , xmPushButtonWidgetClass , wset.action_rowcol ,
01832                   LABEL_ARG(ff) , NULL ) ;
01833 
01834          XtAddCallback( wset.swap_pb , XmNactivateCallback ,
01835                         T3D_swap_CB , NULL ) ;
01836          MCW_register_hint( wset.swap_pb , "Use if images need this" ) ;
01837      } else {
01838         wset.swap_pb = NULL ;
01839      }
01840    }
01841 
01842    wset.button_help_pb =
01843       XtVaCreateManagedWidget(
01844          "dialog" , xmPushButtonWidgetClass , wset.action_rowcol ,
01845             LABEL_ARG("button help") ,
01846          NULL ) ;
01847    XtAddCallback( wset.button_help_pb , XmNactivateCallback ,
01848                   MCW_click_help_CB , NULL ) ;
01849    MCW_register_help( wset.button_help_pb ,
01850      "Click the hand\non any button to get\na little help" ) ;
01851    MCW_register_hint( wset.button_help_pb , "Get more help" ) ;
01852 
01853    wset.open_view_pb =
01854       XtVaCreateManagedWidget(
01855          "dialog" , xmPushButtonWidgetClass , wset.action_rowcol ,
01856             LABEL_ARG("View Images") ,
01857          NULL ) ;
01858    XtAddCallback( wset.open_view_pb , XmNactivateCallback ,
01859                   T3D_open_view_CB , NULL ) ;
01860    MCW_register_help( wset.open_view_pb ,
01861     "Use this to open a window to see the images;\n"
01862     "N.B.: If you use the viewing controls to change the\n"
01863     "      orientation of the images, then you must be\n"
01864     "      aware that 'x' and 'y' in the geometry controls\n"
01865     "      above refer to the images in their ORIGINAL\n"
01866     "      orientation on the screen, NOT in the rotated\n"
01867     "      and/or mirrored orientation you will be viewing." ) ;
01868    MCW_register_hint( wset.open_view_pb , "See the input images" ) ;
01869 
01870    wset.save_file_pb =
01871       XtVaCreateManagedWidget(
01872          "dialog" , xmPushButtonWidgetClass , wset.action_rowcol ,
01873             LABEL_ARG("Save Dataset") ,
01874          NULL ) ;
01875    XtAddCallback( wset.save_file_pb , XmNactivateCallback ,
01876                   T3D_save_file_CB , NULL ) ;
01877    MCW_register_help( wset.save_file_pb ,
01878     "Use this to save the volume data\n"
01879     "into 3D dataset files when you\n"
01880     "have set all the control data." ) ;
01881    MCW_register_hint( wset.save_file_pb , "Write new dataset to disk" ) ;
01882 
01883    wset.quit_pb =
01884       XtVaCreateManagedWidget(
01885          "dialog" , xmPushButtonWidgetClass , wset.action_rowcol ,
01886             XmNrecomputeSize , False ,
01887             LABEL_ARG("quit") ,
01888          NULL ) ;
01889    XtAddCallback( wset.quit_pb , XmNactivateCallback ,
01890                   T3D_quit_CB , NULL ) ;
01891    MCW_register_help( wset.quit_pb ,
01892     "Press this button TWICE\nto exit the program" ) ;
01893    MCW_register_hint( wset.quit_pb , "Press twice to exit program" ) ;
01894 
01895    MCW_set_widget_bg( wset.quit_pb , MCW_hotcolor(wset.quit_pb) , 0 ) ;
01896 
01897    XtManageChild( wset.action_rowcol ) ;
01898 
01899    printf(".");fflush(stdout);
01900 
01901    
01902 
01903    XtManageChild( wset.topform ) ;
01904 
01905    XtRealizeWidget( wset.topshell ) ;
01906 
01907    WAIT_for_window( wset.topshell ) ;  
01908    wset.good = 1 ;
01909 
01910    T3D_data_to_widgets() ;
01911    T3D_set_dependent_geometries() ;
01912 
01913    EXRETURN ;
01914 }
01915 
01916 
01917 
01918 
01919 
01920 
01921 static to3d_data default_user_inputs = {
01922    ORI_R2L_TYPE , ORI_R2L_TYPE , ORI_R2L_TYPE ,      
01923    VOXSHAPE_IRREGULAR ,                              
01924    VOXCONTIG_YES ,                                   
01925    (XCENTERED | YCENTERED | ZCENTERED) ,             
01926    VIEW_ORIGINAL_TYPE ,                              
01927    HEAD_ANAT_TYPE , ANAT_SPGR_TYPE , FUNC_FIM_TYPE , 
01928    0,0,0 ,                                           
01929 
01930    240.0 , 0.9375 , 0.9375 , 0.9375 , 0.9375 ,  
01931 
01932    120.0 , 120.0 , 120.0   
01933 } ;
01934 
01935 #define EMPTY_STRING(str) ((str)[0] = '\0')
01936 
01937 
01938 
01939 #define WarningError(str) \
01940   { fprintf(stderr,"\n***Warning: %s\n",(str)) ; nopt++ ; continue ; }
01941 
01942 void T3D_initialize_user_data(void)
01943 {
01944    int nopt , ii ;
01945 
01946 ENTRY("T3D_initialize_user_data") ;
01947 
01948    user_inputs = default_user_inputs ;  
01949    user_inputs.nosave = 0 ;
01950 
01951    
01952 
01953    EMPTY_STRING( user_inputs.dataset_name ) ;
01954    EMPTY_STRING( user_inputs.short_label1 ) ;
01955    EMPTY_STRING( user_inputs.short_label2 ) ;
01956    EMPTY_STRING( user_inputs.geometry_parent_filename ) ;
01957    EMPTY_STRING( user_inputs.anatomy_parent_filename ) ;
01958    EMPTY_STRING( user_inputs.anatomy_dataname ) ;
01959    EMPTY_STRING( user_inputs.geometry_dataname ) ;
01960    EMPTY_STRING( user_inputs.output_filename ) ;
01961    ZERO_IDCODE( user_inputs.anatomy_parent_idcode ) ;
01962 
01963    strcpy( user_inputs.session_filename , "./" ) ;
01964 
01965    strcpy( user_inputs.dataset_type_string ,
01966            DATASET_typestr[user_inputs.dataset_type] ) ;
01967 
01968    strcpy( user_inputs.function_type_string ,
01969            FUNC_typestr[user_inputs.function_type] ) ;
01970 
01971    user_inputs.view_type = VIEW_ORIGINAL_TYPE ;
01972 
01973    for( ii=0 ; ii < MAX_STAT_AUX ; ii++ )
01974       user_inputs.stat_aux[ii] = 0.0 ;
01975 
01976    user_inputs.xincode = user_inputs.yincode = user_inputs.zincode = INCODE_NONE ;
01977 
01978    user_inputs.ntt      = 0 ;
01979    user_inputs.TR       = 1.0 ;
01980    user_inputs.Torg     = 0.0 ;  
01981    user_inputs.nzz      = 0 ;
01982    user_inputs.t_then_z = 0 ;
01983    user_inputs.tpattern = NULL ;
01984    user_inputs.tunits   = UNITS_MSEC_TYPE ;
01985 
01986    
01987 
01988    { char *eee=my_getenv("AFNI_TO3D_ZPAD") , *fff ;
01989      if( eee != NULL ){
01990          zpad = strtod( eee , &fff ) ;
01991          if( zpad < 0.0 ) FatalError("AFNI_TO3D_ZPAD is negative") ;
01992          zpad_mm = (*fff == 'm') ;
01993      }
01994    }
01995 
01996    
01997 
01998    nopt = 1 ;
01999    while( nopt < Argc && Argv[nopt][0] == '-' ){
02000 
02001       if( strncmp(Argv[nopt],"-help",4) == 0 ){
02002          Syntax() ;
02003       }
02004 
02005       
02006 
02007       for( ii=FIRST_ANAT_TYPE ; ii <= LAST_ANAT_TYPE ; ii++ )
02008          if( strncmp( &(Argv[nopt][1]) ,
02009                       ANAT_prefixstr[ii] , THD_MAX_PREFIX ) == 0 ) break ;
02010 
02011       if( ii <= LAST_ANAT_TYPE ){
02012          user_inputs.anatomy_type = ii ;
02013          user_inputs.dataset_type = HEAD_ANAT_TYPE ;
02014          strcpy( user_inputs.dataset_type_string ,
02015                  DATASET_typestr[user_inputs.dataset_type] ) ;
02016          strcpy( user_inputs.anatomy_type_string ,
02017                  ANAT_typestr[user_inputs.anatomy_type] ) ;
02018 
02019          af_type_set = 1 ; nopt++ ; continue ;
02020       }
02021 
02022       
02023 
02024       for( ii=FIRST_FUNC_TYPE ; ii <= LAST_FUNC_TYPE ; ii++ )
02025          if( strncmp( &(Argv[nopt][1]) ,
02026                       FUNC_prefixstr[ii] , THD_MAX_PREFIX ) == 0 ) break ;
02027 
02028       if( ii <= LAST_FUNC_TYPE ){
02029          user_inputs.function_type = ii ;
02030          user_inputs.dataset_type = HEAD_FUNC_TYPE ;
02031          strcpy( user_inputs.dataset_type_string ,
02032                  DATASET_typestr[user_inputs.dataset_type] ) ;
02033          strcpy( user_inputs.function_type_string ,
02034                  FUNC_typestr[user_inputs.function_type] ) ;
02035 
02036          af_type_set = 1 ; nopt++ ; continue ;
02037       }
02038 
02039 #ifdef USE_MRI_DELAY
02040       
02041 
02042       if( strncmp(Argv[nopt],"-in:1",5) == 0 ){
02043          argopt.delay_input = TRUE ;
02044          nopt++ ; continue ;
02045       }
02046 #endif
02047 
02048       
02049 
02050       if( strncmp(Argv[nopt],"-view",4) == 0 ){
02051          char * str ;
02052 
02053          if( ++nopt >= Argc ) FatalError("-view needs a type") ;
02054 
02055          str = Argv[nopt] ; if( str[0] == '+' ) str++ ;
02056 
02057          for( ii=FIRST_VIEW_TYPE ; ii <= LAST_VIEW_TYPE ; ii++ )
02058             if( strcmp(str,VIEW_codestr[ii]) == 0 ) break ;
02059 
02060          if( ii <= LAST_VIEW_TYPE ){
02061             user_inputs.view_type = ii ;
02062          } else {
02063             WarningError("Unknown view type after -view!") ;
02064          }
02065          nopt++ ; continue ;
02066       }
02067 
02068       
02069 
02070       if( strncmp(Argv[nopt],"-zpad",5) == 0 ){
02071          char * eee ;
02072          if( ++nopt >= Argc ) FatalError("-zpad needs a count") ;
02073          if( zpad > 0.0 ) fprintf(stderr,"+++ WARNING: second -zpad option found!\n") ;
02074          zpad = strtod( Argv[nopt] , &eee ) ;
02075          if( zpad < 0.0 ) FatalError("-zpad is negative") ;
02076          zpad_mm = (*eee == 'm') ;
02077          nopt++ ; continue ;
02078       }
02079 
02080       
02081 
02082       if( strncmp(Argv[nopt],"-session",4) == 0 ){
02083          if( ++nopt >= Argc ) FatalError("-session needs a name") ;
02084          MCW_strncpy( user_inputs.session_filename, Argv[nopt], THD_MAX_NAME ) ;
02085          nopt++ ; continue ;
02086       }
02087 
02088       
02089 
02090       if( strncmp(Argv[nopt],"-prefix",4) == 0 ){
02091          if( ++nopt >= Argc ) FatalError("-prefix needs a name") ;
02092          MCW_strncpy( user_inputs.output_filename , Argv[nopt] , THD_MAX_NAME ) ;
02093          nopt++ ; continue ;
02094       }
02095 
02096 #ifndef NO_NAMES
02097       
02098 
02099       if( strncmp(Argv[nopt],"-dname",4) == 0 ){
02100          if( ++nopt >= Argc ) FatalError("-dname needs a name") ;
02101          MCW_strncpy( user_inputs.dataset_name , Argv[nopt] , THD_MAX_NAME ) ;
02102          nopt++ ; continue ;
02103       }
02104 
02105       
02106 
02107       if( strncmp(Argv[nopt],"-dlabel",4) == 0 ){
02108          if( ++nopt >= Argc ) FatalError("-dlabel needs a name") ;
02109          MCW_strncpy( user_inputs.short_label1 , Argv[nopt] , THD_MAX_LABEL ) ;
02110          nopt++ ; continue ;
02111       }
02112 #endif
02113 
02114       
02115 
02116       if( strncmp(Argv[nopt],"-geomparent",6) == 0 ){
02117          if( ++nopt >= Argc ) FatalError("-geomparent needs a headerfile" ) ;
02118          MCW_strncpy( user_inputs.geometry_parent_filename ,
02119                       Argv[nopt] , THD_MAX_NAME ) ;
02120          nopt++ ; continue ;
02121       }
02122 
02123       
02124 
02125       if( strncmp(Argv[nopt],"-anatparent",6) == 0 ){
02126          if( ++nopt >= Argc ) FatalError("-anatparent needs a headerfile" ) ;
02127          MCW_strncpy( user_inputs.anatomy_parent_filename ,
02128                       Argv[nopt] , THD_MAX_NAME ) ;
02129          nopt++ ; continue ;
02130       }
02131 
02132       
02133 
02134       if( strncmp(Argv[nopt],"-nosave",4) == 0 ){
02135          user_inputs.nosave = 1 ;
02136          nopt++ ; continue ;
02137       }
02138 
02139       
02140 
02141       if( strcmp(Argv[nopt],"-sinter") == 0 ){
02142          putenv("AFNI_SIEMENS_INTERLEAVE=Yes") ; nopt++ ; continue ;
02143       }
02144 
02145       
02146 
02147       if( strcmp(Argv[nopt],"-skip_outliers") == 0 ){
02148          putenv("AFNI_TO3D_OUTLIERS=No") ; nopt++ ; continue ;
02149       }
02150 
02151       if( strcmp(Argv[nopt],"-text_outliers") == 0 ){
02152          putenv("AFNI_TO3D_OUTLIERS=Text") ; nopt++ ; continue ;
02153       }
02154 
02155       
02156 
02157       if( strcmp(Argv[nopt],"-save_outliers") == 0 ){
02158          if(++nopt > Argc) FatalError("-save_outliers needs a filename") ;
02159          outliers_fname = Argv[nopt] ;
02160          if( !THD_filename_ok(outliers_fname) )
02161             FatalError("-save_outliers filename is illegal") ;
02162          nopt++ ; continue ;
02163       }
02164 
02165       
02166 
02167       if( strncmp(Argv[nopt],"-orient",4) == 0 ){
02168          char acod ;
02169 
02170          if( ++nopt >= Argc ) FatalError("-orient needs a code") ;
02171          if( strlen(Argv[nopt]) != 3 ) FatalError("Illegal -orient code") ;
02172          acod = toupper(Argv[nopt][0]) ; user_inputs.xorient = ORCODE(acod) ;
02173          acod = toupper(Argv[nopt][1]) ; user_inputs.yorient = ORCODE(acod) ;
02174          acod = toupper(Argv[nopt][2]) ; user_inputs.zorient = ORCODE(acod) ;
02175          nopt++ ; continue ;
02176       }
02177 
02178       if( strncmp(Argv[nopt],"-zorigin",7) == 0 ){
02179          if( ++nopt >= Argc ) FatalError("-zorigin needs a value") ;
02180          zoff = strtod( Argv[nopt] , NULL ) ;
02181          use_zoff = 1 ;
02182          nopt++ ; continue ;
02183       }
02184 
02185       
02186 
02187 
02188 #undef USE_OLD_DCODE
02189 
02190       
02191 
02192       if( strncmp(Argv[nopt],"-xFOV",5)==0 || strncmp(Argv[nopt],"-xSLAB",5)==0 ||
02193           strncmp(Argv[nopt],"-xfov",5)==0 || strncmp(Argv[nopt],"-xslab",5)==0   ){
02194          float val , xin_bot , xin_top ;
02195          char * ptr , * ptr2 , acod ;
02196          int dcod1 , dcod2 , xincode ;
02197 
02198          xincode = ( strncmp(Argv[nopt],"-xFOV",5)==0 ||
02199                      strncmp(Argv[nopt],"-xfov",5)==0   ) ? INCODE_FOV : INCODE_SLAB ;
02200 
02201          if( ++nopt >= Argc ) WarningError("need an argument after -xFOV/-xSLAB!") ;
02202 
02203          
02204 
02205 
02206 
02207 
02208 
02209 
02210 
02211 #ifdef USE_OLD_DCODE
02212          val = strtod( Argv[nopt] , &ptr ) ;
02213          if( val < 0.0 || (val == 0.0 && ptr == Argv[nopt]) )
02214             WarningError("a nonegative number should follow -xFOV/-xSLAB!") ;
02215 
02216          xin_bot = val ;
02217 
02218          
02219 
02220          acod = toupper( *ptr ) ; dcod1 = ORCODE(acod) ; ptr++ ;
02221          if( dcod1 < 0 )
02222             WarningError("orientation code should follow first dimension in -xFOV/-xSLAB!") ;
02223 #else
02224          { int nused ;
02225            nused = decode_location( Argv[nopt] , &xin_bot , &dcod1 ) ;
02226            if( xin_bot < 0.0 || xin_bot == WAY_BIG )
02227              WarningError("a nonegative number should follow -xFOV/-xSLAB!") ;
02228            if( dcod1 < 0 )
02229              WarningError("1st orientation code illegal after -xFOV/-xSLAB!") ;
02230            ptr = Argv[nopt] + nused ;
02231          }
02232 #endif
02233 
02234 
02235          
02236 
02237          if( *ptr != ':' && *ptr != '-' )
02238 #ifdef USE_OLD_DCODE
02239             WarningError(": or - should follow orientation code in -xFOV/-xSLAB!") ;
02240 #else
02241             WarningError(": or - should follow 1st dimension in -xFOV/-xSLAB!") ;
02242 #endif
02243          ptr++ ;
02244          if( *ptr == '\0' )
02245             WarningError("orientation code or dimension should follow : or - in -xFOV/-xSLAB!") ;
02246 
02247          
02248 
02249 
02250 
02251 
02252 #ifdef USE_OLD_DCODE
02253          acod = toupper( *ptr ) ; dcod2 = ORCODE(acod) ;
02254          if( dcod2 < 0 ){
02255             val = strtod( ptr , &ptr2 ) ;
02256             if( val < 0.0 || (val == 0.0 && ptr2 == ptr) )
02257               WarningError("orientation code or dimension should follow : or - in -xFOV/-xSLAB!") ;
02258             xin_top = val ;
02259             ptr = ptr2 ;
02260             acod = toupper( *ptr ) ; dcod2 = ORCODE(acod) ;
02261             if( dcod2 < 0 )
02262                WarningError("orientation code should follow second dimension in -xFOV/-xSLAB!") ;
02263          } else {
02264             xin_top = xin_bot ;
02265          }
02266 #else
02267          { int nused ;
02268            nused = decode_location( ptr , &xin_top , &dcod2 ) ;
02269            if( dcod2 < 0 )
02270              WarningError("need 2nd orientation code in -xFOV/-xSLAB!") ;
02271            if( xin_top < 0.0 )
02272              WarningError("need nonegative 2nd dimension in -xFOV/-xSLAB!") ;
02273            if( xin_top == WAY_BIG ) xin_top = xin_bot ;
02274          }
02275 #endif
02276 
02277          
02278 
02279 
02280 
02281 
02282 
02283          if( xin_top == xin_bot && dcod1 != ORIENT_OPPOSITE(dcod2) )
02284             WarningError("zero thickness slab specified in -xFOV/-xSLAB!") ;
02285 
02286          if( dcod1 != dcod2 && dcod1 != ORIENT_OPPOSITE(dcod2) )
02287             WarningError("inconsistent directions given in -xFOV/-xSLAB!") ;
02288 
02289          
02290 
02291 
02292 
02293 
02294 
02295 
02296 
02297 
02298          if( dcod1 == dcod2 ){
02299             if( xin_bot < xin_top ){
02300                dcod1   = ORIENT_OPPOSITE(dcod1) ;
02301                xin_bot = -xin_bot ;
02302             } else {
02303                dcod2   = ORIENT_OPPOSITE(dcod2) ;
02304                xin_top = -xin_top ;
02305             }
02306          }
02307 
02308          
02309 
02310          user_inputs.xincode = xincode + dcod1 ;
02311          user_inputs.xin_bot = xin_bot ;
02312          user_inputs.xin_top = xin_top ;
02313 
02314 #if 0
02315 printf("decoded %s to give xincode=%d bot=%f top=%f\n",Argv[nopt],
02316        user_inputs.xincode, user_inputs.xin_bot, user_inputs.xin_top ) ;
02317 #endif
02318 
02319          nopt++ ; continue ;
02320       }
02321 
02322       
02323 
02324       if( strncmp(Argv[nopt],"-yFOV",5)==0 || strncmp(Argv[nopt],"-ySLAB",5)==0 ||
02325           strncmp(Argv[nopt],"-yfov",5)==0 || strncmp(Argv[nopt],"-yslab",5)==0   ){
02326 
02327          float val , yin_bot , yin_top ;
02328          char * ptr , * ptr2 , acod ;
02329          int dcod1 , dcod2 , yincode ;
02330 
02331          yincode = ( strncmp(Argv[nopt],"-yFOV",5)==0 ||
02332                      strncmp(Argv[nopt],"-yfov",5)==0   ) ? INCODE_FOV : INCODE_SLAB ;
02333 
02334          if( ++nopt >= Argc ) WarningError("need an argument after -yFOV/-ySLAB!") ;
02335 
02336          
02337 
02338 
02339 
02340 
02341 
02342 
02343 
02344 #ifdef USE_OLD_DCODE
02345          val = strtod( Argv[nopt] , &ptr ) ;
02346          if( val < 0.0 || (val == 0.0 && ptr == Argv[nopt]) )
02347             WarningError("a nonegative number should follow -yFOV/-ySLAB!") ;
02348 
02349          yin_bot = val ;
02350 
02351          
02352 
02353          acod = toupper( *ptr ) ; dcod1 = ORCODE(acod) ; ptr++ ;
02354          if( dcod1 < 0 )
02355             WarningError("orientation code should follow first dimension in -yFOV/-ySLAB!") ;
02356 #else
02357          { int nused ;
02358            nused = decode_location( Argv[nopt] , &yin_bot , &dcod1 ) ;
02359            if( yin_bot < 0.0 || yin_bot == WAY_BIG )
02360              WarningError("a nonegative number should follow -yFOV/-ySLAB!") ;
02361            if( dcod1 < 0 )
02362              WarningError("1st orientation code illegal after -yFOV/-ySLAB!") ;
02363            ptr = Argv[nopt] + nused ;
02364          }
02365 #endif
02366 
02367          
02368 
02369          if( *ptr != ':' && *ptr != '-' )
02370 #ifdef USE_OLD_DCODE
02371             WarningError(": or - should follow orientation code in -yFOV/-ySLAB!") ;
02372 #else
02373             WarningError(": or - should follow 1st dimension in -yFOV/-ySLAB!") ;
02374 #endif
02375 
02376          ptr++ ;
02377          if( *ptr == '\0' )
02378             WarningError("orientation code or dimension should follow : or - in -yFOV/-ySLAB!") ;
02379 
02380          
02381 
02382 
02383 
02384 
02385 #ifdef USE_OLD_DCODE
02386          acod = toupper( *ptr ) ; dcod2 = ORCODE(acod) ;
02387          if( dcod2 < 0 ){
02388             val = strtod( ptr , &ptr2 ) ;
02389             if( val < 0.0 || (val == 0.0 && ptr2 == ptr) )
02390               WarningError("orientation code or dimension should follow : or - in -yFOV/-ySLAB!") ;
02391             yin_top = val ;
02392             ptr = ptr2 ;
02393             acod = toupper( *ptr ) ; dcod2 = ORCODE(acod) ;
02394             if( dcod2 < 0 )
02395                WarningError("orientation code should follow second dimension in -yFOV/-ySLAB!") ;
02396          } else {
02397             yin_top = yin_bot ;
02398          }
02399 #else
02400          { int nused ;
02401            nused = decode_location( ptr , &yin_top , &dcod2 ) ;
02402            if( dcod2 < 0 )
02403              WarningError("need 2nd orientation code in -yFOV/-ySLAB!") ;
02404            if( yin_top < 0.0 )
02405              WarningError("need nonegative 2nd dimension in -yFOV/-ySLAB!") ;
02406            if( yin_top == WAY_BIG ) yin_top = yin_bot ;
02407          }
02408 #endif
02409 
02410          
02411 
02412 
02413 
02414 
02415 
02416          if( yin_top == yin_bot && dcod1 != ORIENT_OPPOSITE(dcod2) )
02417             WarningError("zero thickness slab specified in -yFOV/-ySLAB!") ;
02418 
02419          if( dcod1 != dcod2 && dcod1 != ORIENT_OPPOSITE(dcod2) )
02420             WarningError("inconsistent directions given in -yFOV/-ySLAB!") ;
02421 
02422          
02423 
02424 
02425 
02426 
02427 
02428 
02429 
02430 
02431          if( dcod1 == dcod2 ){
02432             if( yin_bot < yin_top ){
02433                dcod1   = ORIENT_OPPOSITE(dcod1) ;
02434                yin_bot = -yin_bot ;
02435             } else {
02436                dcod2   = ORIENT_OPPOSITE(dcod2) ;
02437                yin_top = -yin_top ;
02438             }
02439          }
02440 
02441          
02442 
02443          user_inputs.yincode = yincode + dcod1 ;
02444          user_inputs.yin_bot = yin_bot ;
02445          user_inputs.yin_top = yin_top ;
02446 
02447 #if 0
02448 printf("decoded %s to give yincode=%d bot=%f top=%f\n",Argv[nopt],
02449        user_inputs.yincode, user_inputs.yin_bot, user_inputs.yin_top ) ;
02450 #endif
02451 
02452          nopt++ ; continue ;
02453       }
02454 
02455       
02456 
02457       if( strncmp(Argv[nopt],"-zFOV",5)==0 || strncmp(Argv[nopt],"-zSLAB",5)==0 ||
02458           strncmp(Argv[nopt],"-zfov",5)==0 || strncmp(Argv[nopt],"-zslab",5)==0   ){
02459 
02460          float val , zin_bot , zin_top ;
02461          char * ptr , * ptr2 , acod ;
02462          int dcod1 , dcod2 , zincode ;
02463 
02464          zincode = ( strncmp(Argv[nopt],"-zFOV",5)==0 ||
02465                      strncmp(Argv[nopt],"-zfov",5)==0   ) ? INCODE_FOV : INCODE_SLAB ;
02466 
02467          if( ++nopt >= Argc ) WarningError("need an argument after -zFOV/-zSLAB!") ;
02468 
02469          
02470 
02471 
02472 
02473 
02474 
02475 
02476 
02477 #ifdef USE_OLD_DCODE
02478          val = strtod( Argv[nopt] , &ptr ) ;
02479          if( val < 0.0 || (val == 0.0 && ptr == Argv[nopt]) )
02480             WarningError("a nonegative number should follow -zFOV/-zSLAB!") ;
02481 
02482          zin_bot = val ;
02483 
02484          
02485 
02486          acod = toupper( *ptr ) ; dcod1 = ORCODE(acod) ; ptr++ ;
02487          if( dcod1 < 0 )
02488             WarningError("orientation code should follow first dimension in -zFOV/-zSLAB!") ;
02489 #else
02490          { int nused ;
02491            nused = decode_location( Argv[nopt] , &zin_bot , &dcod1 ) ;
02492            if( zin_bot < 0.0 || zin_bot == WAY_BIG )
02493              WarningError("a nonegative number should follow -yFOV/-ySLAB!") ;
02494            if( dcod1 < 0 )
02495              WarningError("1st orientation code illegal after -yFOV/-ySLAB!") ;
02496            ptr = Argv[nopt] + nused ;
02497          }
02498 #endif
02499 
02500          
02501 
02502          if( *ptr != ':' && *ptr != '-' )
02503 #ifdef USE_OLD_DCODE
02504             WarningError(": or - should follow orientation code in -zFOV/-zSLAB!") ;
02505 #else
02506             WarningError(": or - should follow 1st dimension in -zFOV/-zSLAB!") ;
02507 #endif
02508 
02509          ptr++ ;
02510          if( *ptr == '\0' )
02511             WarningError("orientation code or dimension should follow : or - in -zFOV/-zSLAB!") ;
02512 
02513          
02514 
02515 
02516 
02517 
02518 #ifdef USE_OLD_DCODE
02519          acod = toupper( *ptr ) ; dcod2 = ORCODE(acod) ;
02520          if( dcod2 < 0 ){
02521             val = strtod( ptr , &ptr2 ) ;
02522             if( val < 0.0 || (val == 0.0 && ptr2 == ptr) )
02523               WarningError("orientation code or dimension should follow : or - in -zFOV/-zSLAB!") ;
02524             zin_top = val ;
02525             ptr = ptr2 ;
02526             acod = toupper( *ptr ) ; dcod2 = ORCODE(acod) ;
02527             if( dcod2 < 0 )
02528                WarningError("orientation code should follow second dimension in -zFOV/-zSLAB!") ;
02529          } else {
02530             zin_top = zin_bot ;
02531          }
02532 #else
02533          { int nused ;
02534            nused = decode_location( ptr , &zin_top , &dcod2 ) ;
02535            if( dcod2 < 0 )
02536              WarningError("need 2nd orientation code in -zFOV/-zSLAB!") ;
02537            if( zin_top < 0.0 )
02538              WarningError("need nonegative 2nd dimension in -zFOV/-zSLAB!") ;
02539            if( zin_top == WAY_BIG ) zin_top = zin_bot ;
02540          }
02541 #endif
02542 
02543          
02544 
02545 
02546 
02547 
02548 
02549          if( zin_top == zin_bot && dcod1 != ORIENT_OPPOSITE(dcod2) )
02550             WarningError("zero thickness slab specified in -zFOV/-zSLAB!") ;
02551 
02552          if( dcod1 != dcod2 && dcod1 != ORIENT_OPPOSITE(dcod2) )
02553             WarningError("inconsistent directions given in -zFOV/-zSLAB!") ;
02554 
02555          
02556 
02557 
02558 
02559 
02560 
02561 
02562 
02563 
02564          if( dcod1 == dcod2 ){
02565             if( zin_bot < zin_top ){
02566                dcod1   = ORIENT_OPPOSITE(dcod1) ;
02567                zin_bot = -zin_bot ;
02568             } else {
02569                dcod2   = ORIENT_OPPOSITE(dcod2) ;
02570                zin_top = -zin_top ;
02571             }
02572          }
02573 
02574          
02575 
02576          user_inputs.zincode = zincode + dcod1 ;
02577          user_inputs.zin_bot = zin_bot ;
02578          user_inputs.zin_top = zin_top ;
02579 
02580 #if 0
02581 printf("decoded %s to give zincode=%d bot=%f top=%f\n",Argv[nopt],
02582        user_inputs.zincode, user_inputs.zin_bot, user_inputs.zin_top ) ;
02583 #endif
02584 
02585          nopt++ ; continue ;
02586       }
02587 
02588       
02589 
02590       if( strncmp(Argv[nopt],"-statpar",5) == 0 ){
02591          float val ;
02592          char * ptr ;
02593 
02594          if( ++nopt >= Argc ) FatalError("need an argument after -statpar!") ;
02595 
02596          ii = 0 ;
02597          do{
02598             val = strtod( Argv[nopt] , &ptr ) ;
02599             if( *ptr != '\0' ) break ;
02600             user_inputs.stat_aux[ii++] = val ;
02601             nopt++ ;
02602          } while( nopt < Argc ) ;
02603 
02604          if( ii == 0 )
02605             WarningError("No numbers given after -statpar?") ;
02606          continue ;
02607       }
02608 
02609       
02610 
02611       if( strcmp(Argv[nopt],"-t=ms")==0 || strcmp(Argv[nopt],"-t=msec")==0 ){
02612          user_inputs.tunits = UNITS_MSEC_TYPE ;
02613          nopt++ ; continue ;
02614       }
02615 
02616       if( strcmp(Argv[nopt],"-t=s")==0 || strcmp(Argv[nopt],"-t=sec")==0 ){
02617          user_inputs.tunits = UNITS_SEC_TYPE ;
02618          nopt++ ; continue ;
02619       }
02620 
02621       if( strcmp(Argv[nopt],"-t=Hz")==0 || strcmp(Argv[nopt],"-t=Hertz")==0 ){
02622          user_inputs.tunits = UNITS_HZ_TYPE ;
02623          nopt++ ; continue ;
02624       }
02625 
02626       
02627 
02628       if( strncmp(Argv[nopt],"-Torg",5) == 0 ){
02629         if( nopt+1 >= Argc ) FatalError("need 1 argument after -Torg") ;
02630         user_inputs.Torg = strtod( Argv[++nopt] , NULL ) ;
02631         nopt++ ; continue ;
02632       }
02633 
02634       
02635 
02636       if( strncmp(Argv[nopt],"-time:zt",8)==0 || strncmp(Argv[nopt],"-time:tz",8)==0 ){
02637          int   t_then_z , ntt , nzz , nerr ;
02638          float TR , tframe , tsl ;
02639          char *tpattern , *eptr ;
02640 
02641          if( nopt+4 >= Argc ) FatalError("need 4 arguments after -time: options") ;
02642 
02643          t_then_z = ( strncmp(Argv[nopt],"-time:tz",8)==0 ) ;
02644 
02645          ntt = strtol( Argv[++nopt] , NULL , 10 ) ;
02646          nzz = strtol( Argv[++nopt] , NULL , 10 ) ;
02647          if( ! t_then_z ){ ii = ntt ; ntt = nzz ; nzz = ii ; }
02648 
02649          TR       = strtod( Argv[++nopt] , &eptr ) ;
02650          tpattern = Argv[++nopt] ;
02651 
02652 
02653 
02654          if( strcmp(eptr,"ms")==0 || strcmp(eptr,"msec")==0 ){
02655             user_inputs.tunits = UNITS_MSEC_TYPE ;
02656          } else if( strcmp(eptr,"s")==0 || strcmp(eptr,"sec")==0 ){
02657             user_inputs.tunits = UNITS_SEC_TYPE ;
02658          } else if( strcmp(eptr,"Hz")==0 || strcmp(eptr,"Hertz")==0 ){
02659             user_inputs.tunits = UNITS_HZ_TYPE ;
02660          }
02661 
02662 
02663 
02664          nerr = 0 ;
02665          if( ntt < 2 ){
02666             fprintf(stderr,"Illegal value of nt after -time: option\n") ; nerr++ ;
02667          }
02668          if( nzz < NZBOT ){
02669             fprintf(stderr,"Illegal value of nz after -time: option\n") ; nerr++ ;
02670          }
02671          if( TR < 0.0 ){
02672             fprintf(stderr,"Illegal value of TR after -time: option\n") ; nerr++ ;
02673          }
02674          if( nerr > 0 ){
02675             nopt++ ; continue ;  
02676          }
02677 
02678          user_inputs.tpattern = (float *) malloc( sizeof(float) * nzz ) ;
02679          for( ii=0 ; ii < nzz ; ii++ ) user_inputs.tpattern[ii] = 0.0 ;
02680 
02681          user_inputs.ntt      = ntt ;
02682          user_inputs.nzz      = nzz ;
02683          user_inputs.t_then_z = t_then_z ;
02684          user_inputs.TR       = TR ;
02685 
02686          if( TR == 0.0 ){ TR = 1.0; user_inputs.tunits = UNITS_SEC_TYPE; }
02687 
02688          tframe = TR / nzz ;  
02689 
02690          if( nzz > 1 && tpattern[0] == '@' ){
02691             FILE * fp ;
02692 
02693             
02694 
02695             fp = fopen( tpattern+1 , "r" ) ;
02696             if( fp == NULL ){
02697                fprintf(stderr,"Cannot open tpattern file %s\n",tpattern+1) ;
02698             } else {
02699                for( ii=0 ; ii < nzz ; ii++ )
02700                   fscanf( fp , "%f" , user_inputs.tpattern + ii ) ;
02701                fclose( fp ) ;
02702             }
02703          } else if( nzz > 1 &&
02704                    (strcmp(tpattern,"alt+z")==0 || strcmp(tpattern,"altplus")==0) ){
02705 
02706             
02707 
02708             tsl = 0.0 ;
02709             for( ii=0 ; ii < nzz ; ii+=2 ){
02710                user_inputs.tpattern[ii] = tsl ; tsl += tframe ;
02711             }
02712             for( ii=1 ; ii < nzz ; ii+=2 ){
02713                user_inputs.tpattern[ii] = tsl ; tsl += tframe ;
02714             }
02715          } else if( nzz > 1 && strcmp(tpattern,"alt+z2")==0 ){  
02716 
02717             
02718 
02719             tsl = 0.0 ;
02720             for( ii=1 ; ii < nzz ; ii+=2 ){
02721                user_inputs.tpattern[ii] = tsl ; tsl += tframe ;
02722             }
02723             for( ii=0 ; ii < nzz ; ii+=2 ){
02724                user_inputs.tpattern[ii] = tsl ; tsl += tframe ;
02725             }
02726          } else if( nzz > 1 &&
02727                    (strcmp(tpattern,"alt-z")==0 || strcmp(tpattern,"altminus")==0) ){
02728 
02729             
02730 
02731             tsl = 0.0 ;
02732             for( ii=nzz-1 ; ii >=0 ; ii-=2 ){
02733                user_inputs.tpattern[ii] = tsl ; tsl += tframe ;
02734             }
02735             for( ii=nzz-2 ; ii >=0 ; ii-=2 ){
02736                user_inputs.tpattern[ii] = tsl ; tsl += tframe ;
02737             }
02738          } else if( nzz > 1 && strcmp(tpattern,"alt-z2")==0 ){  
02739 
02740             
02741 
02742             tsl = 0.0 ;
02743             for( ii=nzz-2 ; ii >=0 ; ii-=2 ){
02744                user_inputs.tpattern[ii] = tsl ; tsl += tframe ;
02745             }
02746             for( ii=nzz-1 ; ii >=0 ; ii-=2 ){
02747                user_inputs.tpattern[ii] = tsl ; tsl += tframe ;
02748             }
02749          } else if( nzz > 1 &&
02750                    (strcmp(tpattern,"seq+z")==0 || strcmp(tpattern,"seqplus")==0) ){
02751 
02752             
02753 
02754             tsl = 0.0 ;
02755             for( ii=0 ; ii < nzz ; ii++ ){
02756                user_inputs.tpattern[ii] = tsl ; tsl += tframe ;
02757             }
02758          } else if( nzz > 1 &&
02759                    (strcmp(tpattern,"seq-z")==0 || strcmp(tpattern,"seqminus")==0) ){
02760 
02761             
02762 
02763             tsl = 0.0 ;
02764             for( ii=nzz-1 ; ii >=0 ; ii-- ){
02765                user_inputs.tpattern[ii] = tsl ; tsl += tframe ;
02766             }
02767          } else if( nzz == 1 ||
02768                    (strcmp(tpattern,"zero")==0 || strcmp(tpattern,"simult")==0) ){
02769 
02770             
02771 
02772             free(user_inputs.tpattern) ;
02773             user_inputs.tpattern = NULL ;
02774 
02775          } else {
02776             fprintf(stderr,"Unknown tpattern = %s\n",tpattern) ;
02777          }
02778 
02779          nopt++ ; continue ;
02780       }
02781 
02782       
02783 
02784       
02785 
02786       if( strncmp(Argv[nopt],"-gamma",4) == 0 ){
02787          float val ;
02788          if( nopt+1 >= Argc ) FatalError("need an argument after -gamma!");
02789 
02790          val = strtod( Argv[++nopt] , NULL ) ;
02791          if( val > 0 ) argopt.gamma = val ;
02792          else fprintf(stderr,
02793                 "\n*** warning: -gamma value %s illegal\n", Argv[nopt]);
02794 
02795          nopt++ ; continue ;  
02796       }
02797 
02798       
02799 
02800       if( strncmp(Argv[nopt],"-gsfac",4) == 0 ){
02801          float val ;
02802          if( nopt+1 >= Argc ) FatalError("need an argument after -gsfac!");
02803 
02804          val = strtod( Argv[++nopt] , NULL ) ;
02805          if( val != 0.0 ) argopt.gsfac = val ;
02806          else fprintf(stderr,
02807                 "\n*** warning: -gsfac value %s illegal\n", Argv[nopt]);
02808 
02809          nopt++ ; continue ;  
02810       }
02811 
02812       
02813 
02814       if( strncmp(Argv[nopt],"-datum",6) == 0 ){
02815          if( ++nopt >= Argc ) FatalError("need an argument after -datum!") ;
02816 
02817          if( strcmp(Argv[nopt],"short") == 0 ){
02818             argopt.datum_all = MRI_short ;
02819          } else if( strcmp(Argv[nopt],"float") == 0 ){
02820             argopt.datum_all = MRI_float ;
02821          } else if( strcmp(Argv[nopt],"complex") == 0 ){
02822             argopt.datum_all = MRI_complex ;
02823          } else if( strcmp(Argv[nopt],"byte") == 0 ){
02824             argopt.datum_all = MRI_byte ;
02825          } else if( strcmp(Argv[nopt],"rgb") == 0 ){
02826             argopt.datum_all = MRI_rgb ;
02827          } else {
02828             char buf[256] ;
02829             sprintf(buf,"-datum of type '%s' is not supported in AFNI!",
02830                     Argv[nopt] ) ;
02831             FatalError(buf) ;
02832          }
02833 
02834          nopt++ ; continue ;  
02835       }
02836 
02837       
02838 
02839       if( strncmp(Argv[nopt],"-ncolor",4) == 0 ){
02840          float val ;
02841          if( nopt+1 >= Argc ) FatalError("need an argument after -ncolor!");
02842 
02843          val = strtod( Argv[++nopt] , NULL ) ;
02844          if( val > 4 ) argopt.ncolor = val ;
02845          else fprintf(stderr,
02846                 "\n*** warning: -ncolor value %s illegal\n", Argv[nopt]);
02847 
02848          nopt++ ; continue ;  
02849       }
02850 
02851       
02852 
02853       if( strncmp(Argv[nopt],"-xtwarns",6) == 0 ){
02854          argopt.xtwarns = True ;
02855          nopt++ ; continue ;  
02856       }
02857 
02858       
02859 
02860       if( strncmp(Argv[nopt],"-2swap",4) == 0 ){
02861          argopt.swap_two = 1 ;
02862          nopt++ ; continue ;  
02863       }
02864 
02865       if( strncmp(Argv[nopt],"-4swap",4) == 0 ){
02866          argopt.swap_four = 1 ;
02867          nopt++ ; continue ;  
02868       }
02869 
02870       if( strncmp(Argv[nopt],"-8swap",4) == 0 ){    
02871          argopt.swap_eight = 1 ;
02872          nopt++ ; continue ;  
02873       }
02874 
02875       
02876 
02877       if( strncmp(Argv[nopt],"-nofloatscan",6) == 0 ){
02878          argopt.nofloatscan = 1 ;
02879          nopt++ ; continue ;  
02880       }
02881 
02882       
02883 
02884       printf("*** ILLEGAL OPTION: %s\n\n",Argv[nopt]) ;
02885       FatalError("cannot continue") ;
02886 
02887    }
02888 
02889    if( user_inputs.ntt > 1 && !af_type_set ){
02890       user_inputs.anatomy_type = ANAT_EPI_TYPE ; 
02891    }
02892 
02893    First_Image_Arg = nopt ;
02894 
02895    
02896 
02897 
02898    { int nim=Argc-First_Image_Arg , ii ;
02899      char ** qargv ;
02900 
02901      if( nim < 9 ){     
02902 
02903         qargv = Argv ;
02904 
02905      } else {           
02906 
02907         qargv = (char **) malloc( sizeof(char *) * Argc ) ;   
02908         for( ii=0 ; ii < Argc ; ii++ ) qargv[ii] = Argv[ii] ; 
02909 
02910         qargv[First_Image_Arg+3] = "..." ;   
02911 
02912         for( ii=First_Image_Arg+4 ; ii < Argc-2 ; ii++ ) 
02913            qargv[ii] = NULL ;                            
02914      }
02915 
02916      commandline = tross_commandline( "to3d" , Argc , qargv ) ;
02917      AFNI_log_string(commandline) ; 
02918 
02919      if( qargv != Argv ) free(qargv) ;
02920    }
02921 
02922    EXRETURN ;
02923 }
02924 
02925 
02926 
02927 void Syntax()
02928 {
02929    int ii ;
02930 
02931    printf(
02932     "Usage: to3d [options] image_files ...\n"
02933     "       Creates 3D datasets for use with AFNI from 2D image files\n"
02934     "\n"
02935     "The available options are\n"
02936     "  -help   show this message\n"
02937     "  -'type' declare images to contain data of a given type\n"
02938     "          where 'type' is chosen from the following options:\n" ) ;
02939 
02940    printf("       ANATOMICAL TYPES\n") ;
02941    for( ii=FIRST_ANAT_TYPE ; ii <= LAST_ANAT_TYPE ; ii++ )
02942       printf("     %8s == %s\n",ANAT_prefixstr[ii],ANAT_typestr[ii] ) ;
02943 
02944    printf("       FUNCTIONAL TYPES\n") ;
02945    for( ii=FIRST_FUNC_TYPE ; ii <= LAST_FUNC_TYPE ; ii++ )
02946       printf("     %8s == %s\n",FUNC_prefixstr[ii],FUNC_typestr[ii] ) ;
02947 
02948    printf(
02949     "                 [for paired (+) types above, images are fim first,]\n"
02950     "                 [then followed by the threshold (etc.) image files]\n" ) ;
02951 
02952    printf(
02953     "\n"
02954     "  -statpar value value ... value [* NEW IN 1996 *]\n"
02955     "     This option is used to supply the auxiliary statistical parameters\n"
02956     "     needed for certain dataset types (e.g., 'fico' and 'fitt').  For\n"
02957     "     example, a correlation coefficient computed using program 'fim2'\n"
02958     "     from 64 images, with 1 ideal, and with 2 orts could be specified with\n"
02959     "       -statpar 64 1 2\n"
02960    ) ;
02961 
02962    printf(
02963     "\n"
02964 #ifndef NO_NAMES
02965     "  -dname   name      will make 3D dataset's name = 'name'\n"
02966     "  -dlabel  name      will make 3D dataset's short label = 'name'\n"
02967 #endif
02968     "  -prefix  name      will write 3D dataset using prefix 'name'\n"
02969     "  -session name      will write 3D dataset into session directory 'name'\n"
02970     "  -geomparent fname  will read geometry data from dataset file 'fname'\n"
02971     "                       N.B.: geometry data does NOT include time-dependence\n"
02972     "  -anatparent fname  will take anatomy parent from dataset file 'fname'\n"
02973     "\n"
02974     "  -nosave  will suppress autosave of 3D dataset, which normally occurs\n"
02975     "           when the command line options supply all needed data correctly\n"
02976     "\n"
02977     "  -view type [* NEW IN 1996 *]\n"
02978     "    Will set the dataset's viewing coordinates to 'type', which\n"
02979     "    must be one of these strings:  "
02980             VIEW_ORIGINAL_CODE    " "
02981             VIEW_ACPCALIGNED_CODE " "
02982             VIEW_TALAIRACH_CODE   "\n"
02983    ) ;
02984 
02985    printf(
02986     "\n"
02987     "TIME DEPENDENT DATASETS [* NEW IN 1996 *]\n"
02988     "  -time:zt nz nt TR tpattern  OR  -time:tz nt nz TR tpattern\n"
02989     "\n"
02990     "    These options are used to specify a time dependent dataset.\n"
02991     "    '-time:zt' is used when the slices are input in the order\n"
02992     "               z-axis first, then t-axis.\n"
02993     "    '-time:tz' is used when the slices are input in the order\n"
02994     "               t-axis first, then z-axis.\n"
02995     "\n"
02996     "    nz  =  number of points in the z-direction (minimum %d)\n"
02997     "    nt  =  number of points in the t-direction\n"
02998     "            (thus exactly nt * nz slices must be read in)\n"
02999     "    TR  =  repetition interval between acquisitions of the\n"
03000     "            same slice, in milliseconds (or other units, as given below)\n"
03001     "\n"
03002     "    tpattern = Code word that identifies how the slices (z-direction)\n"
03003     "               were gathered in time.  The values that can be used:\n"
03004     "\n"
03005     "       alt+z = altplus   = alternating in the plus direction\n"
03006     "       alt+z2            = alternating, starting at slice #1\n"
03007     "       alt-z = altminus  = alternating in the minus direction\n"
03008     "       alt-z2            = alternating, starting at slice #nz-2\n"
03009     "       seq+z = seqplus   = sequential in the plus direction\n"
03010     "       seq-z = seqminus  = sequential in the minus direction\n"
03011     "       zero  = simult    = simultaneous acquisition\n"
03012     "               @filename = read temporal offsets from 'filename'\n"\
03013     "\n"
03014     "    For example if nz = 5 and TR = 1000, then the inter-slice\n"
03015     "    time is taken to be dt = TR/nz = 200.  In this case, the\n"
03016     "    slices are offset in time by the following amounts:\n"
03017     "\n"
03018     "                    S L I C E   N U M B E R\n"
03019     "      tpattern        0    1    2    3    4  Comment\n"
03020     "      ----------   ---- ---- ---- ---- ----  -------------------------------\n"
03021     "      altplus         0  600  200  800  400  Alternating in the +z direction\n"
03022     "      alt+z2        400    0  600  200  800  Alternating, but starting at #1\n"
03023     "      altminus      400  800  200  600    0  Alternating in the -z direction\n"
03024     "      alt-z2        800  200  600    0  400  Alternating, starting at #nz-2 \n"
03025     "      seqplus         0  200  400  600  800  Sequential  in the +z direction\n"
03026     "      seqminus      800  600  400  200    0  Sequential  in the -z direction\n"
03027     "      simult          0    0    0    0    0  All slices acquired at once\n"
03028     "\n"
03029     "    If @filename is used for tpattern, then nz ASCII-formatted numbers are\n"
03030     "    read from the file.  These are used to indicate the time offsets (in ms)\n"
03031     "    for each slice. For example, if 'filename' contains\n"
03032     "       0 600 200 800 400\n"
03033     "    then this is equivalent to 'altplus' in the above example.\n"
03034     "\n"
03035     "    Notes:\n"
03036     "      * Time-dependent functional datasets are not yet supported by\n"
03037     "          to3d or any other AFNI package software.  For many users,\n"
03038     "          the proper dataset type for these datasets is '-epan'.\n"
03039     "      * Time-dependent datasets with more than one value per time point\n"
03040     "          (e.g., 'fith', 'fico', 'fitt') are also not allowed by to3d.\n"
03041     "      * If you use 'abut' to fill in gaps in the data and/or to\n"
03042     "          subdivide the data slices, you will have to use the @filename\n"
03043     "          form for tpattern, unless 'simult' or 'zero' is acceptable.\n"
03044     "      * At this time, the value of 'tpattern' is not actually used in\n"
03045     "          any AFNI program.  The values are stored in the dataset\n"
03046     "          .HEAD files, and will be used in the future.\n"
03047     "      * The values set on the command line can't be altered interactively.\n"
03048     "      * The units of TR can be specified by the command line options below:\n"
03049     "            -t=ms or -t=msec  -->  milliseconds (the default)\n"
03050     "            -t=s  or -t=sec   -->  seconds\n"
03051     "            -t=Hz or -t=Hertz -->  Hertz (for chemical shift images?)\n"
03052     "          Alternatively, the units symbol ('ms', 'msec', 's', 'sec',\n"
03053     "            'Hz', or 'Hertz') may be attached to TR in the '-time:' option,\n"
03054     "            as in '-time:zt 16 64 4.0sec alt+z'\n"
03055 
03056     "\n"
03057     "  -Torg ttt = set time origin of dataset to 'ttt' [default=0.0]\n"
03058 
03059       , NZBOT
03060    ) ;
03061 
03062    printf(
03063      "\n"
03064      "COMMAND LINE GEOMETRY SPECIFICATION [* NEW IN 1996 *]\n"
03065      "   -xFOV   <dimen1><direc1>-<dimen2><direc2>\n"
03066      "     or       or\n"
03067      "   -xSLAB  <dimen1><direc1>-<direc2>\n"
03068      "\n"
03069      "   (Similar -yFOV, -ySLAB, -zFOV and -zSLAB option are also present.)\n"
03070      "\n"
03071      " These options specify the size and orientation of the x-axis extent\n"
03072      " of the dataset.  <dimen#> means a dimension (in mm); <direc> is\n"
03073      " an anatomical direction code, chosen from\n"
03074      "      A (Anterior)    P (Posterior)    L (Left)\n"
03075      "      I (Inferior)    S (Superior)     R (Right)\n"
03076      " Thus, 20A-30P means that the x-axis of the input images runs from\n"
03077      " 20 mm Anterior to 30 mm Posterior.  For convenience, 20A-20P can be\n"
03078      " abbreviated as 20A-P.\n"
03079      "\n"
03080      " -xFOV  is used to mean that the distances are from edge-to-edge of\n"
03081      "          the outermost voxels in the x-direction.\n"
03082      " -xSLAB is used to mean that the distances are from center-to-center\n"
03083      "          of the outermost voxels in the x-direction.\n"
03084      "\n"
03085      " Under most circumstance, -xFOV , -yFOV , and -zSLAB would be the\n"
03086      " correct combination of geometry specifiers to use.  For example,\n"
03087      " a common type of run at MCW would be entered as\n"
03088      "    -xFOV 120L-R -yFOV 120A-P -zSLAB 60S-50I\n"
03089    ) ;
03090 
03091    printf(
03092      "\n"
03093      "Z-AXIS SLICE OFFSET ONLY\n"
03094      " -zorigin distz  Puts the center of the 1st slice off at the\n"
03095      "                 given distance ('distz' in mm).  This distance\n"
03096      "                 is in the direction given by the corresponding\n"
03097      "                 letter in the -orient code.  For example,\n"
03098      "                   -orient RAI -zorigin 30\n"
03099      "                 would set the center of the first slice at\n"
03100      "                 30 mm Inferior.\n"
03101      "    N.B.: This option has no effect if the FOV or SLAB options\n"
03102      "          described above are used.\n"
03103    ) ;
03104 
03105    printf(
03106     "\n"
03107     "INPUT IMAGE FORMATS [* SIGNIFICANTLY CHANGED IN 1996 *]\n"
03108     "  Image files may be single images of unsigned bytes or signed shorts\n"
03109     "  (64x64, 128x128, 256x256, 512x512, or 1024x1024) or may be grouped\n"
03110     "  images (that is, 3- or 4-dimensional blocks of data).\n"
03111     "  In the grouped case, the string for the command line file spec is like\n"
03112     "\n"
03113     "    3D:hglobal:himage:nx:ny:nz:fname   [16 bit input]\n"
03114     "    3Ds:hglobal:himage:nx:ny:nz:fname  [16 bit input, swapped bytes]\n"
03115     "    3Db:hglobal:himage:nx:ny:nz:fname  [ 8 bit input]\n"
03116     "    3Di:hglobal:himage:nx:ny:nz:fname  [32 bit input]\n"
03117     "    3Df:hglobal:himage:nx:ny:nz:fname  [floating point input]\n"
03118     "    3Dc:hglobal:himage:nx:ny:nz:fname  [complex input]\n"
03119     "    3Dd:hglobal:himage:nx:ny:nz:fname  [double input]\n"
03120     "\n"
03121     "  where '3D:' or '3Ds': signals this is a 3D input file of signed shorts\n"
03122     "        '3Db:'          signals this is a 3D input file of unsigned bytes\n"
03123     "        '3Di:'          signals this is a 3D input file of signed ints\n"
03124     "        '3Df:'          signals this is a 3D input file of floats\n"
03125     "        '3Dc:'          signals this is a 3D input file of complex numbers\n"
03126     "                         (real and imaginary pairs of floats)\n"
03127     "        '3Dd:'          signals this is a 3D input file of double numbers\n"
03128     "                         (will be converted to floats)\n"
03129     "        hglobal = number of bytes to skip at start of whole file\n"
03130     "        himage  = number of bytes to skip at start of each 2D image\n"
03131     "        nx      = x dimension of each 2D image in the file\n"
03132     "        ny      = y dimension of each 2D image in the file\n"
03133     "        nz      = number of 2D images in the file\n"
03134     "        fname   = actual filename on disk to read\n"
03135     "\n"
03136     "  * The ':' separators are required.  The k-th image starts at\n"
03137     "      BYTE offset hglobal+(k+1)*himage+vs*k*nx*ny in file 'fname'\n"
03138     "      for k=0,1,...,nz-1.\n"
03139     "  * Here, vs=voxel length=1 for bytes, 2 for shorts, 4 for ints and floats,\n"
03140     "      and 8 for complex numbers.\n"
03141     "  * As a special case, hglobal = -1 means read data starting at\n"
03142     "      offset len-nz*(vs*nx*ny+himage), where len=file size in bytes.\n"
03143     "      (That is, to read the needed data from the END of the file.)\n"
03144     "  * Note that there is no provision for skips between data rows inside\n"
03145     "      a 2D slice, only for skips between 2D slice images.\n"
03146     "  * The int, float, and complex formats presume that the data in\n"
03147     "      the image file are in the 'native' format for this CPU; that is,\n"
03148     "      there is no provision for data conversion (unlike the 3Ds: format).\n"
03149     "  * Double input will be converted to floats (or whatever -datum is)\n"
03150     "      since AFNI doesn't support double precision datasets.\n"
03151     "  * Whether the 2D image data is interpreted as a 3D block or a 3D+time\n"
03152     "      block depends on the rest of the command line parameters.  The\n"
03153     "      various 3D: input formats are just ways of inputting multiple 2D\n"
03154     "      slices from a single file.\n"
03155     "  * SPECIAL CASE: If fname is ALLZERO, then this means not to read\n"
03156     "      data from disk, but instead to create nz nx*ny images filled\n"
03157     "      with zeros.  One application of this is to make it easy to create\n"
03158     "      a dataset of a specified geometry for use with other programs.\n"
03159     "\n"
03160     "The 'raw pgm' image format is also supported; it reads data into 'byte' images.\n"
03161     "\n"
03162     "* ANALYZE (TM) .hdr/.img files can now be read - give the .hdr filename on\n"
03163     "  the command line.  The program will detect if byte-swapping is needed on\n"
03164     "  these images, and can also set the voxel grid sizes from the first .hdr file.\n"
03165     "  If the 'funused1' field in the .hdr is positive, it will be used to scale the\n"
03166     "  input values.  If the environment variable AFNI_ANALYZE_FLOATIZE is YES, then\n"
03167     "  .img files will be converted to floats on input.\n"
03168     "\n"
03169     "* Siemens .ima image files can now be read.  The program will detect if\n"
03170     "  byte-swapping is needed on these images, and can also set voxel grid\n"
03171     "  sizes and orientations (correctly, I hope).\n"
03172     "* Some Siemens .ima files seems to have their EPI slices stored in\n"
03173     "  spatial order, and some in acquisition (interleaved) order.  This\n"
03174     "  program doesn't try to figure this out.  You can use the command\n"
03175     "  line option '-sinter' to tell the program to assume that the images\n"
03176     "  in a single .ima file are interleaved; for example, if there are\n"
03177     "  7 images in a file, then without -sinter, the program will assume\n"
03178     "  their order is '0 1 2 3 4 5 6'; with -sinter, the program will\n"
03179     "  assume their order is '0 2 4 6 1 3 5' (here, the number refers\n"
03180     "  to the slice location in space).\n"
03181     "\n"
03182     "* GEMS I.* (IMGF) 16-bit files can now be read. The program will detect\n"
03183     "  if byte-swapping is needed on these images, and can also set voxel\n"
03184     "  grid sizes and orientations.  It can also detect the TR in the\n"
03185     "  image header.  If you wish to rely on this TR, you can set TR=0\n"
03186     "  in the -time:zt or -time:tz option.\n"
03187     "* If you use the image header's TR and also use @filename for the\n"
03188     "  tpattern, then the values in the tpattern file should be fractions\n"
03189     "  of the true TR; they will be multiplied by the true TR once it is\n"
03190     "  read from the image header.\n"
03191     "\n"
03192     " NOTES:\n"
03193     "  * Not all AFNI programs support all datum types.  Shorts and\n"
03194     "      floats are safest. (See the '-datum' option below.)\n"
03195     "  * If '-datum short' is used or implied, then int, float, and complex\n"
03196     "      data will be scaled to fit into a 16 bit integer.  If the '-gsfac'\n"
03197     "      option below is NOT used, then each slice will be SEPARATELY\n"
03198     "      scaled according to the following choice:\n"
03199     "      (a) If the slice values all fall in the range -32767 .. 32767,\n"
03200     "          then no scaling is performed.\n"
03201     "      (b) Otherwise, the image values are scaled to lie in the range\n"
03202     "          0 .. 10000 (original slice min -> 0, original max -> 10000).\n"
03203     "      This latter option is almost surely not what you want!  Therefore,\n"
03204     "      if you use the 3Di:, 3Df:, or 3Dc: input methods and store the\n"
03205     "      data as shorts, I suggest you supply a global scaling factor.\n"
03206     "      Similar remarks apply to '-datum byte' scaling, with even more force.\n"
03207     "  * To3d now incoporates POSIX filename 'globbing', which means that\n"
03208     "      you can input filenames using 'escaped wildcards', and then to3d\n"
03209     "      will internally do the expansion to the list of files.  This is\n"
03210     "      only desirable because some systems limit the number of command-line\n"
03211     "      arguments to a program.  It is possible that you would wish to input\n"
03212     "      more slice files than your computer supports.  For example,\n"
03213     "          to3d exp.?.*\n"
03214     "      might overflow the system command line limitations.  The way to do\n"
03215     "      this using internal globbing would be\n"
03216     "          to3d exp.\\?.\\*\n"
03217     "      where the \\ characters indicate to pass the wildcards ? and *\n"
03218     "      through to the program, rather than expand them in the shell.\n"
03219     "      (a) Note that if you choose to use this feature, ALL wildcards in\n"
03220     "          a filename must be escaped with \\ or NONE must be escaped.\n"
03221     "      (b) Using the C shell, it is possible to turn off shell globbing\n"
03222     "          by using the command 'set noglob' -- if you do this, then you\n"
03223     "          do not need to use the \\ character to escape the wildcards.\n"
03224     "      (c) Internal globbing of 3D: file specifiers is supported in to3d.\n"
03225     "          For example, '3D:0:0:64:64:100:sl.\\*' could be used to input\n"
03226     "          a series of 64x64x100 files with names 'sl.01', 'sl.02' ....\n"
03227     "          This type of expansion is specific to to3d; the shell will not\n"
03228     "          properly expand such 3D: file specifications.\n"
03229     "      (d) In the C shell (csh or tcsh), you can use forward single 'quotes'\n"
03230     "          to prevent shell expansion of the wildcards, as in the command\n"
03231     "              to3d '3D:0:0:64:64:100:sl.*'\n"
03232     "    The globbing code is adapted from software developed by the\n"
03233     "    University of California, Berkeley, and is copyrighted by the\n"
03234     "    Regents of the University of California (see file mcw_glob.c).\n"
03235     "\n"
03236     "RGB datasets [Apr 2002]\n"
03237     "-----------------------\n"
03238     "You can now create RGB-valued datasets.  Each voxel contains 3 byte values\n"
03239     "ranging from 0..255.  RGB values may be input to to3d in one of two ways:\n"
03240     " * Using raw PPM formatted 2D image files.\n"
03241     " * Using JPEG formatted 2D files.\n"
03242     " * Using TIFF, BMP, GIF, PNG formatted 2D files [if netpbm is installed].\n"
03243     " * Using the 3Dr: input format, analogous to 3Df:, etc., described above.\n"
03244     "RGB datasets can be created as functional FIM datasets, or as anatomical\n"
03245     "datasets:\n"
03246     " * RGB fim overlays are transparent in AFNI only where all three\n"
03247     "    bytes are zero - that is, you can't overlay solid black.\n"
03248     " * At present, there is limited support for RGB datasets.\n"
03249     "    About the only thing you can do is display them in 2D slice\n"
03250     "    viewers in AFNI.\n"
03251     "You can also create RGB-valued datasets using program 3dThreetoRGB.\n"
03252     "\n"
03253     "Other Data Options\n"
03254     "------------------\n"
03255     "  -2swap\n"
03256     "     This option will force all input 2 byte images to be byte-swapped\n"
03257     "     after they are read in.\n"
03258     "  -4swap\n"
03259     "     This option will force all input 4 byte images to be byte-swapped\n"
03260     "     after they are read in.\n"
03261     "  -8swap\n"
03262     "     This option will force all input 8 byte images to be byte-swapped\n"
03263     "     after they are read in.\n"
03264     "  BUT PLEASE NOTE:\n"
03265     "     Input images that are auto-detected to need byte-swapping\n"
03266     "     (GEMS I.*, Siemens *.ima, ANALYZE *.img, and 3Ds: files)\n"
03267     "     will NOT be swapped again by one of the above options.\n"
03268     "     If you want to swap them again for some bizarre reason,\n"
03269     "     you'll have to use the 'Byte Swap' button on the GUI.\n"
03270     "     That is, -2swap/-4swap will swap bytes on input files only\n"
03271     "     if they haven't already been swapped by the image input\n"
03272     "     function.\n"
03273     "\n"
03274     "  -zpad N   OR\n"
03275     "  -zpad Nmm \n"
03276     "     This option tells to3d to write 'N' slices of all zeros on each side\n"
03277     "     in the z-direction.  This will make the dataset 'fatter', but make it\n"
03278     "     simpler to align with datasets from other scanning sessions.  This same\n"
03279     "     function can be accomplished later using program 3dZeropad.\n"
03280     "   N.B.: The zero slices will NOT be visible in the image viewer in to3d, but\n"
03281     "          will be visible when you use AFNI to look at the dataset.\n"
03282     "   N.B.: If 'mm' follows the integer N, then the padding is measured in mm.\n"
03283     "          The actual number of slices of padding will be rounded up.  So if\n"
03284     "          the slice thickness is 5 mm, then '-zpad 16mm' would be the equivalent\n"
03285     "          of '-zpad 4' -- that is, 4 slices on each z-face of the volume.\n"
03286     "   N.B.: If the geometry parent dataset was created with -zpad, the spatial\n"
03287     "          location (origin) of the slices is set using the geometry dataset's\n"
03288     "          origin BEFORE the padding slices were added.  This is correct, since\n"
03289     "          you need to set the origin on the current dataset as if the padding\n"
03290     "          slices were not present.\n"
03291     "   N.B.: Unlike the '-zpad' option to 3drotate and 3dvolreg, this adds slices\n"
03292     "          only in the z-direction.\n"
03293     "   N.B.: You can set the environment variable 'AFNI_TO3D_ZPAD' to provide a\n"
03294     "          default for this option.\n"
03295     "\n"
03296     "  -gsfac value\n"
03297     "     will scale each input slice by 'value'.  For example,\n"
03298     "     '-gsfac 0.31830989' will scale by 1/Pi (approximately).\n"
03299     "     This option only has meaning if one of '-datum short' or\n"
03300     "     '-datum byte' is used or implied.  Otherwise, it is ignored.\n"
03301     "\n"
03302     "  -datum type\n"
03303     "     will set the voxel data to be stored as 'type', which is currently\n"
03304     "     allowed to be short, float, byte, or complex.\n"
03305     "     If -datum is not used, then the datum type of the first input image\n"
03306     "     will determine what is used.  In that case, the first input image will\n"
03307     "     determine the type as follows:\n"
03308     "        byte       --> byte\n"
03309     "        short      --> short\n"
03310     "        int, float --> float\n"
03311     "        complex    --> complex\n"
03312     "     If -datum IS specified, then all input images will be converted\n"
03313     "     to the desired type.  Note that the list of allowed types may\n"
03314     "     grow in the future, so you should not rely on the automatic\n"
03315     "     conversion scheme.  Also note that floating point datasets may\n"
03316     "     not be portable between CPU architectures.\n"
03317     "\n"
03318     "  -nofloatscan\n"
03319     "     tells to3d NOT to scan input float and complex data files for\n"
03320     "     illegal values - the default is to scan and replace illegal\n"
03321     "     floating point values with zeros (cf. program float_scan).\n"
03322 #ifdef USE_MRI_DELAY
03323     "\n"
03324     "  -in:1\n"
03325     "     Input of huge 3D: files (with all the data from a 3D+time run, say)\n"
03326     "     can cause to3d to fail from lack of memory.  The reason is that\n"
03327     "     the images are from a file are all read into RAM at once, and then\n"
03328     "     are scaled, converted, etc., as needed, then put into the final\n"
03329     "     dataset brick.  This switch will cause the images from a 3D: file\n"
03330     "     to be read and processed one slice at a time, which will lower the\n"
03331     "     amount of memory needed.  The penalty is somewhat more I/O overhead.\n"
03332 #endif
03333    ) ;
03334 
03335    printf(
03336     "\n"
03337     "NEW IN 1997:\n"
03338     "  -orient code\n"
03339     "     Tells the orientation of the 3D volumes.  The code must be 3 letters,\n"
03340     "     one each from the pairs {R,L} {A,P} {I,S}.  The first letter gives\n"
03341     "     the orientation of the x-axis, the second the orientation of the\n"
03342     "     y-axis, the third the z-axis:\n"
03343     "        R = right-to-left         L = left-to-right\n"
03344     "        A = anterior-to-posterior P = posterior-to-anterior\n"
03345     "        I = inferior-to-superior  S = superior-to-inferior\n"
03346     "     Note that the -xFOV, -zSLAB constructions can convey this information.\n"
03347    ) ;
03348 
03349    printf(
03350     "\n"
03351     "NEW IN 2001:\n"
03352     "  -skip_outliers\n"
03353     "     If present, this tells the program to skip the outlier check that is\n"
03354     "     automatically performed for 3D+time datasets.  You can also turn this\n"
03355     "     feature off by setting the environment variable AFNI_TO3D_OUTLIERS\n"
03356     "     to \"No\".\n"
03357     "  -text_outliers\n"
03358     "    If present, tells the program to only print out the outlier check\n"
03359     "     results in text form, not graph them.  You can make this the default\n"
03360     "     by setting the environment variable AFNI_TO3D_OUTLIERS to \"Text\".\n"
03361     "    N.B.: If to3d is run in batch mode, then no graph can be produced.\n"
03362     "          Thus, this option only has meaning when to3d is run with the\n"
03363     "          interactive graphical user interface.\n"
03364     "  -save_outliers fname\n"
03365     "    Tells the program to save the outliers count into a 1D file with\n"
03366     "    name 'fname'.  You could graph this file later with the command\n"
03367     "       1dplot -one fname\n"
03368     "    If this option is used, the outlier count will be saved even if\n"
03369     "    nothing appears 'suspicious' (whatever that means).\n"
03370     "  NOTES on outliers:\n"
03371     "    * See '3dToutcount -help' for a description of how outliers are\n"
03372     "       defined.\n"
03373     "    * The outlier count is not done if the input images are shorts\n"
03374     "       and there is a significant (> 1%%) number of negative inputs.\n"
03375     "    * There must be at least 6 time points for the outlier count to\n"
03376     "       be carried out.\n"
03377    ) ;
03378 
03379    printf(
03380     "\n"
03381     "OPTIONS THAT AFFECT THE X11 IMAGE DISPLAY\n"
03382     "   -gamma gg    the gamma correction factor for the\n"
03383     "                  monitor is 'gg' (default gg is 1.0; greater than\n"
03384     "                  1.0 makes the image contrast larger -- this may\n"
03385     "                  also be adjusted interactively)\n"
03386     "   -ncolors nn  use 'nn' gray levels for the image\n"
03387     "                  displays (default is %d)\n"
03388     "   -xtwarns     turn on display of Xt warning messages\n" ,
03389     INIT_ngray
03390    ) ;
03391 
03392    exit(0) ;
03393 }
03394 
03395 
03396 
03397 
03398 
03399 void T3D_centered_CB( Widget w ,
03400                       XtPointer client_data , XtPointer call_data )
03401 {
03402    int val ;
03403    Boolean sens ;
03404 
03405 ENTRY("T3D_centered_CB") ;
03406 
03407    user_inputs.xyz_centered = val = MCW_val_bbox( wset.centered_bbox ) ;
03408 
03409    sens = (val & XCENTERED) == 0 ;
03410       AV_SENSITIZE( wset.xorigin_av , sens ) ;
03411       XtSetSensitive( wset.xorigin_label , sens ) ;
03412 
03413    sens = (val & YCENTERED) == 0 ;
03414       AV_SENSITIZE( wset.yorigin_av , sens ) ;
03415       XtSetSensitive( wset.yorigin_label , sens ) ;
03416 
03417    sens = (val & ZCENTERED) == 0 ;
03418       AV_SENSITIZE( wset.zorigin_av , sens ) ;
03419       XtSetSensitive( wset.zorigin_label , sens ) ;
03420 
03421    T3D_set_dependent_geometries() ;
03422    RESET_QUIT ;
03423    EXRETURN ;
03424 }
03425 
03426 #ifdef ALLOW_NONCONTIG
03427 
03428 
03429 
03430 
03431 void T3D_voxcontig_CB( Widget w ,
03432                        XtPointer client_data , XtPointer call_data )
03433 {
03434    int val ;
03435    Boolean sens ;
03436 
03437    user_inputs.voxcontig = val = MCW_val_bbox( wset.voxcontig_bbox ) ;
03438 
03439    sens = (val != VOXCONTIG_YES) ; AV_SENSITIZE( wset.zspacing_av , sens ) ;
03440    T3D_set_dependent_geometries() ;
03441    RESET_QUIT ;
03442 }
03443 #endif 
03444 
03445 
03446 
03447 
03448 
03449 void T3D_set_dependent_geometries(void)
03450 {
03451    float size ;
03452 
03453 ENTRY("T3D_set_dependent_geometries") ;
03454 
03455    if( ! XtIsRealized( wset.topshell ) ) EXRETURN ;
03456 
03457    
03458 
03459    if( user_inputs.voxshape != VOXSHAPE_IRREGULAR && user_inputs.nx > 0 ){
03460 
03461       size = user_inputs.fov / user_inputs.nx ;
03462 
03463       if( user_inputs.xsize != size ){
03464          AV_assign_fval( wset.xsize_av , size ) ;
03465          user_inputs.xsize = size ;
03466       }
03467 
03468       if( user_inputs.ysize != size ){
03469          AV_assign_fval( wset.ysize_av , size ) ;
03470          user_inputs.ysize = size ;
03471       }
03472 
03473       if( user_inputs.voxshape == VOXSHAPE_CUBICAL &&
03474           user_inputs.zsize    != size ){
03475          AV_assign_fval( wset.zsize_av , size ) ;
03476          user_inputs.zsize = size ;
03477       }
03478    }
03479 
03480 #ifdef ALLOW_NONCONTIG
03481    
03482 
03483    if( user_inputs.voxcontig == VOXCONTIG_YES &&
03484        user_inputs.zspacing  != user_inputs.zsize ){
03485       AV_assign_fval( wset.zspacing_av , user_inputs.zsize ) ;
03486       user_inputs.zspacing = user_inputs.zsize ;
03487    }
03488 #endif 
03489 
03490    
03491 
03492    if( (user_inputs.xyz_centered & XCENTERED) != 0 && user_inputs.nx != 0 ){
03493       size = 0.5 * (user_inputs.nx-1) * user_inputs.xsize ;
03494       if( size != user_inputs.xorigin ){
03495          AV_assign_fval( wset.xorigin_av , size ) ;
03496          user_inputs.xorigin = size ;
03497       }
03498    }
03499 
03500    if( (user_inputs.xyz_centered & YCENTERED) != 0 && user_inputs.ny != 0 ){
03501       size = 0.5 * (user_inputs.ny-1) * user_inputs.ysize ;
03502       if( size != user_inputs.yorigin ){
03503          AV_assign_fval( wset.yorigin_av , size ) ;
03504          user_inputs.yorigin = size ;
03505       }
03506    }
03507 
03508    if( (user_inputs.xyz_centered & ZCENTERED) != 0 && user_inputs.nz != 0 ){
03509 #ifdef ALLOW_NONCONTIG
03510       size = 0.5 * (user_inputs.nz-1) * user_inputs.zspacing ;
03511 #else
03512       size = 0.5 * (user_inputs.nz-1) * user_inputs.zsize ;
03513 #endif
03514       if( size != user_inputs.zorigin ){
03515          AV_assign_fval( wset.zorigin_av , size ) ;
03516          user_inputs.zorigin = size ;
03517       }
03518    }
03519 
03520    EXRETURN ;
03521 }
03522 
03523 
03524 
03525 
03526 
03527 
03528 void T3D_voxshape_CB( Widget w ,
03529                       XtPointer client_data , XtPointer call_data )
03530 {
03531    int val ;
03532    Boolean fov_sens , xsize_sens , ysize_sens , zsize_sens ;
03533 
03534 ENTRY("T3D_voxshape_CB") ;
03535 
03536    user_inputs.voxshape = val = MCW_val_bbox( wset.voxshape_bbox ) ;
03537 
03538    switch( val ){
03539 
03540       default:  XBell( XtDisplay(wset.topshell) , 100 ) ; return ;
03541 
03542       case VOXSHAPE_CUBICAL:
03543          fov_sens   = True ;
03544          xsize_sens = ysize_sens = zsize_sens = False ;
03545       break ;
03546 
03547       case VOXSHAPE_SQUARE:
03548          fov_sens   = True ;
03549          xsize_sens = ysize_sens = False ;
03550          zsize_sens = True ;
03551       break ;
03552 
03553       case VOXSHAPE_IRREGULAR:
03554          fov_sens   = False ;
03555          xsize_sens = ysize_sens = zsize_sens = True ;
03556       break ;
03557 
03558    }
03559    AV_SENSITIZE( wset.fov_av   , fov_sens   ) ;
03560    AV_SENSITIZE( wset.xsize_av , xsize_sens ) ;
03561    AV_SENSITIZE( wset.ysize_av , ysize_sens ) ;
03562    AV_SENSITIZE( wset.zsize_av , zsize_sens ) ;
03563 
03564    T3D_set_dependent_geometries() ;
03565    RESET_QUIT ;
03566    EXRETURN ;
03567 }
03568 
03569 
03570 
03571 
03572 
03573 char * T3D_text_display( MCW_arrowval * av , XtPointer cd )
03574 {
03575    char ** tar = (char **) cd ;
03576    int  ii = av->ival ;
03577 
03578 ENTRY("T3D_text_display") ;
03579 
03580    RETURN( tar[ii] ) ;
03581 }
03582 
03583 
03584 
03585 void T3D_quit_timeout_CB( XtPointer client_data , XtIntervalId * id )
03586 {
03587    ENTRY("T3D_quit_timeout_CB") ;
03588    RESET_QUIT ;
03589    EXRETURN ;
03590 }
03591 
03592 void T3D_quit_CB( Widget wcall ,
03593                   XtPointer client_data , XtPointer call_data )
03594 {
03595    static Boolean first = True ;
03596    static Widget wquit  = NULL ;
03597 
03598 ENTRY("T3D_quit_CB") ;
03599 
03600   if( wcall == NULL ){
03601     if( wquit == NULL ) return ;
03602     MCW_set_widget_label( wquit , "quit" ) ;
03603     first = True ;
03604     EXRETURN ;
03605   }
03606 
03607   if( first ){
03608      if( wquit == NULL ) wquit = wcall ;
03609      first = False ;
03610      MCW_set_widget_label( wquit , "QUIT" ) ;
03611 
03612      (void) XtAppAddTimeOut( XtWidgetToApplicationContext(wcall) ,
03613                              5000 , T3D_quit_timeout_CB , NULL ) ;
03614 
03615      EXRETURN ;
03616   }
03617   AFNI_speak("Done",0) ;
03618   exit(0) ;
03619 }
03620 
03621 
03622 
03623 void T3D_swap_CB( Widget w , XtPointer cd , XtPointer call_data )
03624 {
03625    int dd = mri_datum_size((MRI_TYPE)argopt.datum_all) ;
03626    int nx , ny , nz , nv , nvox ;
03627 
03628 ENTRY("T3D_swap_CB") ;
03629 
03630    nx = dset->daxes->nxx ; ny = dset->daxes->nyy ;
03631    nz = dset->daxes->nzz ; nv = dblk->nvals      ; nvox = nx*ny*nz*nv ;
03632 
03633    switch( dd ){
03634       case 2: swap_twobytes  ( nvox , dbrick ) ; break ;
03635       case 4: swap_fourbytes ( nvox , dbrick ) ; break ;
03636       case 8: swap_eightbytes( nvox , dbrick ) ; break ;
03637    }
03638 
03639    if( argopt.datum_all == MRI_short && !AFNI_yesenv("AFNI_NO_NEGATIVES_WARNING") ){ 
03640       short * sar = (short *) dbrick ; int ii ;
03641       negative_shorts = 0 ;
03642       for( ii=0 ; ii < nvox_total ; ii++ )
03643          if( sar[ii] < 0 ) negative_shorts++ ;
03644 
03645       if( negative_shorts ){
03646          float perc = (100.0*negative_shorts)/nvox_total ; char msg[512] ;
03647          sprintf(msg , " \n"
03648                        " to3d WARNING: %d negative voxels (%g%%)\n"
03649                        "               after byte-swapping.\n"     ,
03650                  negative_shorts , perc ) ;
03651 
03652          (void) MCW_popup_message( wset.anatomy_parent_label , msg ,
03653                                    MCW_USER_KILL | MCW_TIMER_KILL ) ;
03654       }
03655    }
03656 
03657    if( ISQ_REALZ(wset.seq) ){
03658       drive_MCW_imseq( wset.seq , isqDR_clearstat , NULL ) ;
03659       drive_MCW_imseq( wset.seq , isqDR_display   , (XtPointer)-1 ) ;
03660    }
03661 
03662    if( user_inputs.ntt > 5 ){                 
03663       dset->taxis = myXtNew( THD_timeaxis ) ;
03664       dset->taxis->ntt = user_inputs.ntt ;
03665       T3D_check_outliers(0) ; outliers_checked = 1 ;
03666       myXtFree(dset->taxis) ;
03667    }
03668 
03669    EXRETURN ;
03670 }
03671 
03672 
03673 
03674 void T3D_fov_av_CB( MCW_arrowval * av , XtPointer cd )
03675 {
03676    user_inputs.fov = wset.fov_av->fval ;
03677    T3D_set_dependent_geometries() ;
03678    RESET_QUIT ;
03679 }
03680 
03681 
03682 
03683 void T3D_orient_av_CB( MCW_arrowval * av , XtPointer cd )
03684 {
03685    int ior = av->ival ;
03686 
03687    if( av == wset.xorient_av ){
03688       user_inputs.xorient = ior ;
03689       SET_ORIGIN_LABEL(wset.xorigin_label,user_inputs.xorient) ;
03690    } else if( av == wset.yorient_av ){
03691       user_inputs.yorient = ior ;
03692       SET_ORIGIN_LABEL(wset.yorigin_label,user_inputs.yorient) ;
03693    } else if( av == wset.zorient_av ){
03694       user_inputs.zorient = ior ;
03695       SET_ORIGIN_LABEL(wset.zorigin_label,user_inputs.zorient) ;
03696    } else if( av == wset.view_type_av ){
03697       user_inputs.view_type = ior ;
03698    } else {
03699       XBell( XtDisplay(wset.topshell) , 100 ) ;
03700       fprintf(stderr,"\n*** illegal call to T3D_orient_av_CB!\n") ;
03701    }
03702    RESET_QUIT ;
03703 }
03704 
03705 
03706 
03707 void T3D_origin_av_CB( MCW_arrowval * av , XtPointer cd )
03708 {
03709    float size = av->fval ;
03710 
03711    if( av == wset.xorigin_av ){
03712       user_inputs.xorigin = size ;
03713    } else if( av == wset.yorigin_av ){
03714       user_inputs.yorigin = size ;
03715    } else if( av == wset.zorigin_av ){
03716       user_inputs.zorigin = size ;
03717    } else {
03718       XBell( XtDisplay(wset.topshell) , 100 ) ;
03719       fprintf(stderr,"\n*** illegal call to T3D_origin_av_CB!\n") ;
03720    }
03721    RESET_QUIT ;
03722 }
03723 
03724 
03725 
03726 void T3D_size_av_CB( MCW_arrowval * av , XtPointer cd )
03727 {
03728    float size = av->fval ;
03729 
03730    if( av == wset.xsize_av ){
03731       user_inputs.xsize = size ;
03732    } else if( av == wset.ysize_av ){
03733       user_inputs.ysize = size ;
03734    } else if( av == wset.zsize_av ){
03735       user_inputs.zsize = size ;
03736 #ifdef ALLOW_NONCONTIG
03737    } else if( av == wset.zspacing_av ){
03738       user_inputs.zspacing = size ;
03739 #endif
03740    } else {
03741       XBell( XtDisplay(wset.topshell) , 100 ) ;
03742       fprintf(stderr,"\n*** illegal call to T3D_size_av_CB!\n") ;
03743    }
03744    T3D_set_dependent_geometries() ;
03745    RESET_QUIT ;
03746 }
03747 
03748 
03749 
03750 void T3D_type_av_CB( MCW_arrowval * av , XtPointer cd )
03751 {
03752    int itype = av->ival ;
03753    Boolean isfunc ;
03754    int nvals_old , nvals_new ;
03755 
03756    isfunc    = ISFUNCTYPE(user_inputs.dataset_type) ;
03757    nvals_old = (isfunc) ? FUNC_nvals[user_inputs.function_type]
03758                         : ANAT_nvals[user_inputs.anatomy_type]  ;
03759 
03760    if( av == wset.dataset_type_av ){
03761       user_inputs.dataset_type = itype ;
03762 
03763       isfunc = ISFUNCTYPE(itype) ;
03764 
03765 #ifdef FUNCTION_ONLY_ANAT_PARENT
03766       SENSITIZE( wset.anatomy_parent_label     , isfunc ) ;
03767       SENSITIZE( wset.anatomy_parent_textfield , isfunc ) ;
03768 #endif
03769 
03770       if( isfunc ){
03771          XtUnmapWidget( wset.anatomy_type_av->wrowcol ) ;
03772          XtMapWidget  ( wset.function_type_av->wrowcol ) ;
03773       } else {
03774          XtUnmapWidget( wset.function_type_av->wrowcol ) ;
03775          XtMapWidget  ( wset.anatomy_type_av->wrowcol ) ;
03776       }
03777 
03778    } else if( av == wset.function_type_av ){
03779       user_inputs.function_type = itype ;
03780    } else if( av == wset.anatomy_type_av ){
03781       user_inputs.anatomy_type = itype ;
03782    } else {
03783       XBell( XtDisplay(wset.topshell) , 100 ) ;
03784       fprintf(stderr,"\n*** illegal call to T3D_type_av_CB!\n") ;
03785    }
03786 
03787    
03788 
03789    isfunc    = ISFUNCTYPE(user_inputs.dataset_type) ;
03790    nvals_new = (isfunc) ? FUNC_nvals[user_inputs.function_type]
03791                         : ANAT_nvals[user_inputs.anatomy_type]  ;
03792 
03793    
03794 
03795    if( user_inputs.ntt > 0 && nvals_new != 1 ){
03796       T3D_poperr("***** DATA TYPE WARNING *****\n",
03797                  "New data type is not allowed\n"
03798                  "with time-dependent datatset!" ) ;
03799       return ;
03800    }
03801 
03802    if( nvals_new != nvals_old ){
03803       int nz = user_inputs.nimage / nvals_new ;
03804       if( nz * nvals_new != user_inputs.nimage ){
03805          T3D_poperr("**** DATA TYPE WARNING *****\n",
03806                     "Number of images not an even\n"
03807                     "multiple of # of data values" ) ;
03808       }
03809 
03810       user_inputs.nz    = nz ;
03811       user_inputs.nvals = nvals_new ;
03812       T3D_set_dependent_geometries() ;
03813       T3D_fix_dataset_dimen() ;
03814    }
03815 
03816    T3D_setup_stat_aux() ;
03817 
03818    RESET_QUIT ;
03819 }
03820 
03821 
03822 
03823 
03824 
03825 void T3D_fix_dataset_dimen(void)
03826 {
03827    int nx , ny , nz , nv , ibr , bsize , nvold ;
03828 
03829 ENTRY("T3D_fix_dataset_dimen") ;
03830 
03831    nvold = dblk->nvals ;
03832 
03833    nv = dblk->nvals = dkptr->nvals  = user_inputs.nvals ;
03834    nx = user_inputs.nx ;
03835    ny = user_inputs.ny ;
03836    nz = daxes->nzz = dkptr->dimsizes[2]  = user_inputs.nz ;
03837 
03838    for( ibr=0 ; ibr < nvold ; ibr++ )
03839       mri_clear_data_pointer( DBLK_BRICK(dblk,ibr) ) ;
03840 
03841    myXtFree(dblk->brick_bytes) ; dblk->brick_bytes = NULL ;
03842    myXtFree(dblk->brick_fac  ) ; dblk->brick_fac   = NULL ;
03843 
03844    THD_init_datablock_brick( dblk , argopt.datum_all , NULL ) ;
03845 
03846    bsize = nx*ny*nz * mri_datum_size( argopt.datum_all ) ;
03847    for( ibr=0 ; ibr < nv ; ibr++ ){
03848       mri_fix_data_pointer( dbrick + ibr*bsize , DBLK_BRICK(dblk,ibr) ) ;
03849    }
03850 
03851    EXRETURN ;
03852 }
03853 
03854 
03855 
03856 
03857 
03858 
03859 void T3D_read_images(void)
03860 {
03861    MRI_IMAGE * im , * shim ;
03862    char * bar ;
03863    int npix , ii , bb , dsize ;
03864    int nx , ny , nz , nim , lf , isfunc , nvals , kz,kim , bsize,ibr ;
03865    MRI_IMARR * arr ;
03866    char iname[THD_MAX_NAME] ;
03867    float nonshort_min=1.E38 , nonshort_max=-1.E38 ;
03868    float nonbyte_min =1.E38 , nonbyte_max =-1.E38 ;
03869    int   nonshort_num=0 , nonfloat_num=0 , noncomplex_num=0 , nonbyte_num=0 ;
03870    int     gnim ;
03871    char ** gname ;
03872    int time_dep , ltt,kzz , ntt,nzz , nvoxt ;
03873    int kzmod ;  
03874 
03875 ENTRY("T3D_read_images") ;
03876 
03877    nim = Argc - First_Image_Arg ;  
03878 
03879    INIT_SARR( imnames ) ;  
03880 
03881    MCW_warn_expand(1) ;
03882    MCW_file_expand( nim , Argv+First_Image_Arg , &gnim , &gname ) ;
03883    MCW_warn_expand(0) ;
03884 #ifdef AFNI_DEBUG
03885 printf("T3D_read_images: input file count = %d; expanded = %d\n",nim,gnim) ;
03886 #endif
03887 
03888    if( gnim < 1 ){ FatalError("NO INPUT IMAGE FILES?") ; }
03889 
03890 
03891 
03892 #ifndef AFNI_DEBUG
03893    printf("Counting images: ");fflush(stdout);
03894 #endif
03895 
03896    nz = 0 ;
03897    for( lf=0 ; lf < gnim ; lf++ ){
03898       ii = mri_imcount( gname[lf] ) ;
03899       if( ii == 0 ){
03900          fprintf(stderr,"*** bad file specifier %s\n",gname[lf]) ;
03901          exit(1) ;
03902       }
03903       nz += ii ;
03904    }
03905 #ifdef AFNI_DEBUG
03906    printf("T3D_read_images: mri_imcount totals nz=%d\n",nz) ;
03907 #else
03908    printf(" total=%d 2D slices\n",nz) ;
03909 #endif
03910 
03911    if( nz < NZBOT ){
03912       fprintf(stderr,"*** Must have at least %d input images! ***\n",NZBOT) ;
03913       exit(1) ;
03914    }
03915 
03916 
03917 
03918 
03919    time_dep = (user_inputs.ntt > 0) ;
03920    if( time_dep ){ ntt = user_inputs.ntt ; nzz = user_inputs.nzz ; }
03921 
03922    if( time_dep && nz != ntt * nzz ){
03923       fprintf(stderr,"*** Number of slices on command line   = %d\n"
03924                      "*** Number of slices needed for -time: = %d\n"
03925                      "*** Something is wrong with your command line!\n" ,
03926               nz , ntt * nzz ) ;
03927       exit(1) ;
03928    }
03929 
03930    if( time_dep ){
03931       isfunc = ISFUNCTYPE(user_inputs.dataset_type) ;
03932       nvals  = (isfunc) ? FUNC_nvals[user_inputs.function_type]
03933                         : ANAT_nvals[user_inputs.anatomy_type]  ;
03934 
03935       if( nvals != 1 ){
03936          fprintf(stderr,"*** Sorry: time dependent datasets with more than one\n"
03937                         "***        value per time point are not yet supported!\n" ) ;
03938          exit(1) ;
03939       }
03940 
03941 #if 0
03942       if( isfunc ){
03943          fprintf(stderr,"*** Sorry: time dependent functional\n"
03944                         "***        datasets are not yet supported!\n" ) ;
03945          exit(1) ;
03946       }
03947 #endif
03948    }
03949 
03950    
03951 
03952    CLEAR_MRILIB_globals ;  
03953 
03954 #ifdef USE_MRI_DELAY
03955    if( argopt.delay_input )
03956       arr = mri_read_file_delay( gname[0] ) ;
03957    else
03958 #endif
03959       arr = mri_read_file( gname[0] ) ;
03960 
03961    if( arr == NULL || arr->num == 0 ){
03962       fprintf(stderr,"*** cannot read first file! ***\n") ; exit(1) ;
03963    }
03964    im = arr->imarr[0] ;
03965 
03966    nx = im->nx ;
03967    ny = im->ny ; npix = nx * ny ;
03968 
03969    
03970 
03971    if( im->dw > 0.0 ){
03972       imdx = im->dx ; imdy = im->dy ; imdz = im->dz ;  
03973    }
03974 
03975 
03976 
03977    if( argopt.datum_all < 0 ){
03978       switch( im->kind ){
03979          case MRI_byte:     argopt.datum_all = MRI_byte    ; break ;
03980 
03981          default:
03982          case MRI_short:    argopt.datum_all = MRI_short   ; break ;
03983 
03984          case MRI_int:
03985          case MRI_double:
03986          case MRI_float:    argopt.datum_all = MRI_float   ; break ;
03987 
03988          case MRI_complex:  argopt.datum_all = MRI_complex ; break ;
03989 
03990          case MRI_rgb:      argopt.datum_all = MRI_rgb     ; break ;
03991       }
03992    }
03993 
03994 
03995 
03996    dsize  = mri_datum_size( (MRI_TYPE) argopt.datum_all ) ;
03997    dbrick = bar = (char*)XtMalloc( dsize * nx * ny * nz ) ;
03998    nvoxt  = nx * ny * nz ;
03999 
04000 #if 0
04001 printf("T3D_read_images: first file (%s) has nx=%d ny=%d #im=%d\n",
04002        gname[0],nx,ny,arr->num) ;
04003 #endif
04004 
04005    
04006 
04007 #ifndef AFNI_DEBUG
04008    printf("Reading images: ");fflush(stdout);
04009    kzmod = (int)(0.0234567*nz)+1 ;                
04010 #endif
04011 
04012    kz = 0 ; if( time_dep ){ ltt = kzz = 0 ; }
04013 
04014    for( lf=0 ; lf < gnim ; lf++ ){  
04015 
04016       
04017 
04018       if( lf != 0 ){
04019 #ifdef USE_MRI_DELAY
04020          if( argopt.delay_input )
04021             arr = mri_read_file_delay( gname[0] ) ;
04022          else
04023 #endif
04024             arr = mri_read_file( gname[lf] ) ;
04025 
04026          if( arr == NULL || arr->num == 0 ){
04027             fprintf(stderr,"*** cannot read file %s\n",gname[lf]) ;
04028             exit(1) ;
04029          }
04030 #ifdef AFNI_DEBUG
04031 printf("T3D_read_images: file %d (%s) has #im=%d\n",lf,gname[lf],arr->num) ;
04032 #endif
04033       }
04034 
04035       for( kim=0 ; kim < arr->num ; kim++ ){  
04036 
04037          
04038 
04039          if( arr->num == 1 ){
04040             strcpy( iname , gname[lf] ) ;
04041          } else {
04042             sprintf( iname , "%s#%d" , gname[lf],kim) ;
04043          }
04044          ADDTO_SARR(imnames,iname) ;
04045 
04046          
04047 
04048          im = arr->imarr[kim] ;
04049          if( im->nx != nx || im->ny != ny ){
04050             fprintf(stderr,"*** file %s has nonconforming images: first=%dx%d this=%dx%d\n",
04051                    gname[lf] , nx,ny , im->nx,im->ny) ;
04052             exit(1) ;
04053          }
04054 
04055 #ifdef USE_MRI_DELAY
04056          if( argopt.delay_input )
04057             (void) mri_data_pointer( im ) ;  
04058 #endif
04059 
04060          
04061          
04062 
04063          if( im->pixel_size == 2 && argopt.swap_two ){
04064             if( im->was_swapped ){  
04065               static int first=1 ;
04066               if( first ){          
04067                 fprintf(stderr,"++ Ignoring -2swap on input image [%s...]\n",
04068                         (im->fname == NULL) ? "." : im->fname ) ;
04069                 first = 0 ;
04070               }
04071             } else {                
04072               static int first=1 ;
04073               if( first ){          
04074                 fprintf(stderr,"++ Executing -2swap on input image [%s...]\n",
04075                         (im->fname == NULL) ? "." : im->fname ) ;
04076                 first = 0 ;
04077               }
04078               swap_twobytes( im->nvox , mri_data_pointer(im) ) ;
04079             }
04080          } else if( im->pixel_size == 4 && argopt.swap_four ){
04081             if( im->was_swapped ){  
04082               static int first=1 ;
04083               if( first ){          
04084                 fprintf(stderr,"++ Ignoring -4swap on input image [%s...]\n",
04085                         (im->fname == NULL) ? "" : im->fname ) ;
04086                 first = 0 ;
04087               }
04088             } else {                
04089               static int first=1 ;
04090               if( first ){          
04091                 fprintf(stderr,"++ Executing -4swap on input image [%s...]\n",
04092                         (im->fname == NULL) ? "." : im->fname ) ;
04093                 first = 0 ;
04094               }
04095               swap_fourbytes( im->nvox , mri_data_pointer(im) ) ;
04096             }
04097          } else if( im->pixel_size == 8 && argopt.swap_eight ){   
04098             if( im->was_swapped ){  
04099               static int first=1 ;
04100               if( first ){          
04101                 fprintf(stderr,"++ Ignoring -8swap on input image [%s...]\n",
04102                         (im->fname == NULL) ? "" : im->fname ) ;
04103                 first = 0 ;
04104               }
04105             } else {                
04106               static int first=1 ;
04107               if( first ){          
04108                 fprintf(stderr,"++ Executing -8swap on input image [%s...]\n",
04109                         (im->fname == NULL) ? "." : im->fname ) ;
04110                 first = 0 ;
04111               }
04112               swap_eightbytes( im->nvox , mri_data_pointer(im) ) ;
04113             }
04114          }
04115 
04116          
04117 
04118          if( !argopt.nofloatscan && im->kind == MRI_float )
04119             nfloat_err += thd_floatscan( im->nvox , MRI_FLOAT_PTR(im) ) ;
04120          else if( !argopt.nofloatscan && im->kind == MRI_complex )
04121             nfloat_err += thd_complexscan( im->nvox , MRI_COMPLEX_PTR(im) ) ;
04122 
04123          
04124 
04125          if( im->kind == argopt.datum_all ){    
04126             shim = im ;
04127 
04128          } else {                               
04129             switch( argopt.datum_all ){
04130 
04131                default: FatalError("Illegal argopt.datum_all!") ;
04132 
04133                case MRI_short:{                 
04134                   short * shar ;
04135 
04136                   if( argopt.gsfac == 0.0 ){      
04137                      float immin , immax ;
04138                      immin = mri_min( im ) ; immax = mri_max( im ) ;
04139                      if( immin >= -32767.0 && immax <= 32767.0 )
04140                         shim = mri_to_short( 1.0 , im ) ;   
04141                      else
04142                         shim = mri_to_short_scl( 0.0 , 10000.0 , im ) ;  
04143 
04144                      nonshort_min = MIN(immin,nonshort_min) ;
04145                      nonshort_max = MAX(immax,nonshort_max) ; nonshort_num++ ;
04146                      KILL_1MRI(im) ;
04147                   } else {                         
04148                      float immin , immax ;
04149                      shim = mri_to_short( argopt.gsfac , im ) ;
04150                      immin = mri_min( im ) ; immax = mri_max( im ) ;
04151                      nonshort_min = MIN(immin,nonshort_min) ;
04152                      nonshort_max = MAX(immax,nonshort_max) ; nonshort_num++ ;
04153                      KILL_1MRI(im) ;
04154                   }
04155 
04156                   
04157 
04158                   shar = MRI_SHORT_PTR( shim ) ;  
04159                   if( shar[1] == -10000 && shar[2] == 10000 ) shar[1] = shar[2] = 0 ;
04160                }
04161                break ;  
04162 
04163                case MRI_byte:{                 
04164 
04165                   if( argopt.gsfac == 0.0 ){      
04166                      float immin , immax ;
04167                      immin = mri_min( im ) ; immax = mri_max( im ) ;
04168                      if( immin >= 0 && immax <= 255.0 )
04169                         shim = mri_to_byte_scl( 1.0 , 0.0 , im ) ; 
04170                      else
04171                         shim = mri_to_byte_scl( 0.0 , 255.0 , im ) ;  
04172 
04173                      nonbyte_min = MIN(immin,nonbyte_min) ;
04174                      nonbyte_max = MAX(immax,nonbyte_max) ; nonbyte_num++ ;
04175                      KILL_1MRI(im) ;
04176                   } else {                         
04177                      float immin , immax ;
04178                      shim = mri_to_byte_scl( argopt.gsfac , 0.0 , im ) ;
04179                      immin = mri_min( im ) ; immax = mri_max( im ) ;
04180                      nonbyte_min = MIN(immin,nonbyte_min) ;
04181                      nonbyte_max = MAX(immax,nonbyte_max) ; nonbyte_num++ ;
04182                      KILL_1MRI(im) ;
04183                   }
04184 
04185                }
04186                break ;  
04187 
04188                case MRI_float:{            
04189                   float * shar ;
04190 
04191                   shim = mri_to_float( im ) ;  nonfloat_num++ ;
04192                   KILL_1MRI(im) ;
04193 
04194                   shar = MRI_FLOAT_PTR( shim ) ;  
04195                   if( shar[1]==-10000.0 && shar[2]==10000.0 ) shar[1]=shar[2]=0.0 ;
04196                }
04197                break ;  
04198 
04199                case MRI_complex:{         
04200                   complex * shar ;
04201 
04202                   shim = mri_to_complex( im ) ;  noncomplex_num++ ;
04203                   KILL_1MRI(im) ;
04204 
04205                   shar = MRI_COMPLEX_PTR( shim ) ;  
04206                   if( shar[1].r == -10000.0 && shar[2].r == 10000.0 &&
04207                       shar[1].i ==      0.0 && shar[2].i ==     0.0   ){
04208 
04209                      shar[1].r=shar[2].r=0.0 ;
04210                   }
04211                }
04212                break ;  
04213 
04214                case MRI_rgb:{             
04215                   shim = mri_to_rgb( im ) ;
04216                   KILL_1MRI(im) ;
04217                }
04218                break ;
04219 
04220             }
04221          }  
04222 
04223 #ifdef AFNI_DEBUG
04224 printf("T3D_read_images: putting data into slice %d\n",kz) ;
04225 #endif
04226 
04227          if( ! time_dep ){
04228 
04229 
04230 
04231             bb = npix * dsize * kz ;
04232             memcpy( bar+bb , mri_data_pointer(shim) , npix*dsize ) ;
04233          } else {
04234 
04235 
04236 
04237             bb = npix * dsize * ( kzz + ltt * nzz ) ;
04238             memcpy( bar+bb , mri_data_pointer(shim) , npix*dsize ) ;
04239 
04240             
04241 
04242 
04243             if( user_inputs.t_then_z ){
04244               ltt++ ; if( ltt == ntt ){ ltt = 0 ; kzz++ ; }
04245             } else {
04246               kzz++ ; if( kzz == nzz ){ kzz = 0 ; ltt++ ; }
04247             }
04248          }
04249          kz++ ;
04250 
04251          KILL_1MRI(shim) ;
04252 #ifndef AFNI_DEBUG
04253          if( kz%kzmod == 0 ){ printf(".") ; fflush(stdout); }
04254 #endif
04255       }  
04256 
04257       FREE_IMARR(arr) ;
04258    }  
04259 #ifndef AFNI_DEBUG
04260    printf("\n");fflush(stdout);
04261 #endif
04262 
04263    if( nfloat_err > 0 )  
04264       printf("*** Found %d float errors in inputs - see program float_scan!\n",
04265              nfloat_err) ;
04266 
04267    MCW_free_expand( gnim , gname ) ;
04268 
04269 
04270 
04271    if( use_MRILIB_slicespacing && fabs(MRILIB_slicespacing-imdz) > 0.01l ){
04272      fprintf(stderr,"Using slice spacing=%g",MRILIB_slicespacing) ;
04273      if( imdz > 0.0 ) fprintf(stderr," instead of slice thickness=%g",imdz) ;
04274      fprintf(stderr,"\n") ;
04275      imdz = MRILIB_slicespacing ;
04276    }
04277 
04278 
04279 
04280    if( argopt.datum_all == MRI_short ){
04281       short * sar = (short *) dbrick ;
04282       for( ii=0 ; ii < nvoxt ; ii++ )
04283          if( sar[ii] < 0 ) negative_shorts++ ;
04284    }
04285    nvox_total = nvoxt ; 
04286 
04287 
04288 
04289    if( nonshort_num > 0 )
04290       printf( "Number of non-short slices converted to shorts = %d\n"
04291               "Smallest value in them                         = %f\n"
04292               "Largest value in them                          = %f\n" ,
04293              nonshort_num , nonshort_min , nonshort_max ) ;
04294 
04295    if( nonbyte_num > 0 )
04296       printf( "Number of non-byte slices converted to bytes = %d\n"
04297               "Smallest value in them                       = %f\n"
04298               "Largest value in them                        = %f\n" ,
04299              nonbyte_num , nonbyte_min , nonbyte_max ) ;
04300 
04301    if( nonfloat_num > 0 )
04302       printf( "Number of non-float slices converted to floats = %d\n",
04303              nonfloat_num ) ;
04304 
04305    if( noncomplex_num > 0 )
04306       printf( "Number of non-complex slices converted to complexes = %d\n",
04307              noncomplex_num ) ;
04308 
04309    
04310 
04311    isfunc = ISFUNCTYPE(user_inputs.dataset_type) ;
04312    nvals  = (isfunc) ? FUNC_nvals[user_inputs.function_type]
04313                      : ANAT_nvals[user_inputs.anatomy_type]  ;
04314 
04315    nim    = kz ;  
04316 
04317    if( time_dep ){
04318       nvals = ntt ;
04319       if( nim != ntt * nzz ){
04320          fprintf(stderr,
04321                   "\n"
04322                   "***** TIME-DEPENDENCE ERROR *****\n"
04323                   " Number of images input does not\n"
04324                   " match number specified in -time:\n"
04325                   " option on command line!\n" ) ;
04326          exit(1) ;
04327       }
04328    }
04329 
04330 #ifdef AFNI_DEBUG
04331 printf("T3D_read_images: nvals set to %d\n",nvals) ;
04332 #endif
04333 
04334    nz = nim / nvals ;           
04335    if( nz * nvals != nim ){
04336       fprintf(stderr,
04337                "\n"
04338                "***** DATA TYPE ERROR *****\n"
04339                " Number of images not an even\n"
04340                " multiple of number of values\n"
04341                " required for chosen data type\n" ) ;
04342       exit(1) ;
04343    }
04344 
04345    dset    =                 myXtNew( THD_3dim_dataset ) ;  
04346    dblk    = dset->dblk    = myXtNew( THD_datablock ) ;     
04347    daxes   = dset->daxes   = myXtNew( THD_dataxes ) ;
04348    markers = dset->markers = NULL ;                       
04349    dkptr   = dblk->diskptr = myXtNew( THD_diskptr ) ;
04350 
04351    dset->tagset = NULL ;  
04352 
04353    INIT_KILL(dset->kl) ; INIT_KILL(dblk->kl) ;
04354 
04355    dkptr->type         = DISKPTR_TYPE ;
04356    dkptr->rank         = 3 ;
04357    dkptr->nvals        = nvals ;
04358    dkptr->dimsizes[0]  = nx ;
04359    dkptr->dimsizes[1]  = ny ;
04360    dkptr->dimsizes[2]  = nz ;
04361    dkptr->storage_mode = STORAGE_BY_BRICK ;
04362    dkptr->byte_order   = THD_get_write_order() ;  
04363    EMPTY_STRING(dkptr->prefix) ;
04364    EMPTY_STRING(dkptr->viewcode) ;
04365    EMPTY_STRING(dkptr->filecode) ;
04366    EMPTY_STRING(dkptr->directory_name) ;
04367    EMPTY_STRING(dkptr->header_name) ;
04368    EMPTY_STRING(dkptr->brick_name) ;
04369 
04370    dblk->type        = DATABLOCK_TYPE ;
04371    dblk->nvals       = dkptr->nvals ;
04372    dblk->malloc_type = DATABLOCK_MEM_MALLOC ;
04373    dblk->natr        = 0 ;
04374    dblk->natr_alloc  = 0 ;
04375    dblk->atr         = NULL ;
04376    dblk->brick       = NULL ;
04377    dblk->brick_fac   = NULL ;
04378    dblk->brick_bytes = NULL ;
04379 
04380    THD_init_datablock_brick( dblk , argopt.datum_all , NULL ) ;
04381    THD_null_datablock_auxdata( dblk ) ;
04382 
04383    dblk->master_nvals = 0 ;     
04384    dblk->master_ival  = NULL ;
04385    dblk->master_bytes = NULL ;
04386 
04387    bsize = nx*ny*nz * mri_datum_size( argopt.datum_all ) ;
04388    for( ibr=0 ; ibr < nvals ; ibr++ ){
04389       mri_fix_data_pointer( dbrick + ibr*bsize , DBLK_BRICK(dblk,ibr) ) ;
04390    }
04391 
04392    daxes->type     = DATAXES_TYPE ;
04393    daxes->nxx      = nx ;
04394    daxes->nyy      = ny ;
04395    daxes->nzz      = nz ;
04396    daxes->xxorg    = - user_inputs.xorigin ;
04397    daxes->yyorg    = - user_inputs.yorigin ;
04398    daxes->zzorg    = - user_inputs.zorigin ;
04399    daxes->xxdel    =   user_inputs.xsize ;
04400    daxes->yydel    =   user_inputs.ysize ;
04401 #ifdef ALLOW_NONCONTIG
04402    daxes->zzdel    =   user_inputs.zspacing ;
04403 #else
04404    daxes->zzdel    =   user_inputs.zsize ;
04405 #endif
04406    daxes->xxorient = user_inputs.xorient ;
04407    daxes->yyorient = user_inputs.yorient ;
04408    daxes->zzorient = user_inputs.zorient ;
04409 
04410    dset->type      = user_inputs.dataset_type ;
04411    dset->view_type = user_inputs.view_type ;
04412    dset->func_type = ISANAT(dset) ? (user_inputs.anatomy_type)
04413                                   : (user_inputs.function_type) ;
04414 
04415    dset->wod_daxes   = NULL ;
04416    dset->wod_flag    = 0 ;
04417    dset->stats       = NULL ;
04418 #ifdef ALLOW_DATASET_VLIST
04419    dset->pts         = NULL ;
04420 #endif
04421    dset->death_mark  = 0 ;
04422    dset->tcat_list   = NULL ;
04423    dset->tcat_num    = 0 ;
04424    dset->tcat_len    = NULL ;
04425 
04426    ZERO_STAT_AUX( dset ) ;
04427 
04428    user_inputs.nx     = nx ;
04429    user_inputs.ny     = ny ;
04430    user_inputs.nz     = nz ;
04431    user_inputs.nimage = nim ;
04432    user_inputs.nvals  = nvals ;
04433 
04434 
04435 
04436    if( user_inputs.xincode > 0 ){
04437       int dcode , fov ;
04438       float dx , xorg , size ;
04439 
04440       fov   = 1 ;
04441       dcode = user_inputs.xincode - INCODE_FOV ;
04442 
04443       if( dcode < FIRST_ORIENT_TYPE || dcode > LAST_ORIENT_TYPE ){
04444          dcode = user_inputs.xincode - INCODE_SLAB ;
04445          fov   = 0 ;
04446       }
04447 
04448       if( fov ){
04449          dx   = (user_inputs.xin_bot + user_inputs.xin_top) / nx ;
04450          xorg =  user_inputs.xin_bot - 0.5*dx ;
04451       } else {
04452          dx   = (user_inputs.xin_bot + user_inputs.xin_top) / (nx-1) ;
04453          xorg =  user_inputs.xin_bot ;
04454       }
04455       user_inputs.xorient = dcode ;
04456       user_inputs.xsize   = dx ;
04457       user_inputs.xorigin = xorg ;
04458       user_inputs.fov     = nx * dx ; geometry_loaded = 1 ;
04459 
04460       size = 0.5 * (nx-1) * dx ;
04461       if( fabs(size-xorg) < 0.01 )
04462          user_inputs.xyz_centered |= XCENTERED ;
04463       else
04464          user_inputs.xyz_centered &= ~XCENTERED ;
04465    }
04466 
04467    if( user_inputs.yincode > 0 ){
04468       int dcode , fov ;
04469       float dy , yorg , size ;
04470 
04471       fov   = 1 ;
04472       dcode = user_inputs.yincode - INCODE_FOV ;
04473 
04474       if( dcode < FIRST_ORIENT_TYPE || dcode > LAST_ORIENT_TYPE ){
04475          dcode = user_inputs.yincode - INCODE_SLAB ;
04476          fov   = 0 ;
04477       }
04478 
04479       if( fov ){
04480          dy   = (user_inputs.yin_bot + user_inputs.yin_top) / ny ;
04481          yorg =  user_inputs.yin_bot - 0.5*dy ;
04482       } else {
04483          dy   = (user_inputs.yin_bot + user_inputs.yin_top) / (ny-1) ;
04484          yorg =  user_inputs.yin_bot ;
04485       }
04486       user_inputs.yorient = dcode ;
04487       user_inputs.ysize   = dy ;
04488       user_inputs.yorigin = yorg ;
04489       user_inputs.fov     = ny * dy ; geometry_loaded = 1 ;
04490 
04491       size = 0.5 * (ny-1) * dy ;
04492       if( fabs(size-yorg) < 0.01 )
04493          user_inputs.xyz_centered |= YCENTERED ;
04494       else
04495          user_inputs.xyz_centered &= ~YCENTERED ;
04496    }
04497 
04498    if( user_inputs.zincode > 0 ){
04499       int dcode , fov ;
04500       float dz , zorg , size ;
04501 
04502       fov   = 1 ;
04503       dcode = user_inputs.zincode - INCODE_FOV ;
04504 
04505       if( dcode < FIRST_ORIENT_TYPE || dcode > LAST_ORIENT_TYPE ){
04506          dcode = user_inputs.zincode - INCODE_SLAB ;
04507          fov   = 0 ;
04508       }
04509 
04510       if( fov ){
04511          dz   = (user_inputs.zin_bot + user_inputs.zin_top) / nz ;
04512          zorg =  user_inputs.zin_bot - 0.5*dz ;
04513       } else {
04514          if( nz == 1 ){
04515             fprintf(stderr,"*** -zSLAB illegal with only 1 slice! ***\n") ;
04516             exit(1) ;
04517          }
04518          dz   = (user_inputs.zin_bot + user_inputs.zin_top) / (nz-1) ;
04519          zorg =  user_inputs.zin_bot ;
04520       }
04521       user_inputs.zorient = dcode ;
04522       user_inputs.zsize   = dz ;
04523       user_inputs.zorigin = zorg ;
04524 
04525       size = 0.5 * (nz-1) * dz ;
04526       if( fabs(size-zorg) < 0.01 )
04527          user_inputs.xyz_centered |= ZCENTERED ;
04528       else
04529          user_inputs.xyz_centered &= ~ZCENTERED ;
04530    }
04531 
04532    dset->taxis = NULL ;  
04533 
04534    if( commandline != NULL ) tross_Append_History( dset , commandline ) ;
04535 
04536    
04537 
04538    EXRETURN ;
04539 }
04540 
04541 
04542 
04543 void T3D_open_view_CB( Widget w ,
04544                        XtPointer client_data , XtPointer call_data )
04545 {
04546    FD_brick * br ;
04547    char * title = "to3d" ;
04548    int nim ;
04549 
04550    if( wset.seq != NULL ){
04551       if( ISQ_REALZ(wset.seq) )
04552          XMapRaised( XtDisplay(wset.topshell) , XtWindow(wset.seq->wtop) ) ;
04553       else
04554          XBell( XtDisplay(wset.topshell) , 100 ) ; 
04555       return ;
04556    }
04557 
04558    daxes->xxdel = user_inputs.xsize ;  
04559    daxes->yydel = user_inputs.ysize ;  
04560 #ifdef ALLOW_NONCONTIG
04561    daxes->zzdel = user_inputs.zspacing ;
04562 #else
04563    daxes->zzdel = user_inputs.zsize ;
04564 #endif
04565 
04566    br = THD_3dim_dataset_to_brick( dset , 1,2,3 ) ;
04567 
04568    if( br == NULL ){
04569       XBell( XtDisplay(wset.topshell) , 100 ) ;
04570       fprintf(stderr,"\n*** bad data in THD_3dim_dataset_to_brick!\n");
04571       return ;
04572    }
04573 
04574    wset.seq = open_MCW_imseq( wset.dc , T3D_getim , br ) ;
04575    drive_MCW_imseq( wset.seq,isqDR_realize , NULL ) ;
04576    NORMAL_cursorize( wset.seq->wimage ) ;                       
04577 
04578    drive_MCW_imseq(wset.seq,isqDR_getimnr, (XtPointer) &nim ) ;
04579    drive_MCW_imseq(wset.seq,isqDR_title  , (XtPointer) imnames->ar[nim] ) ;
04580 
04581    drive_MCW_imseq(wset.seq,isqDR_opacitybut    ,(XtPointer)0); 
04582    drive_MCW_imseq(wset.seq,isqDR_record_disable,(XtPointer)0); 
04583    drive_MCW_imseq(wset.seq,isqDR_zoombut       ,(XtPointer)0); 
04584    drive_MCW_imseq(wset.seq,isqDR_penbbox       ,(XtPointer)0); 
04585 
04586    
04587 
04588    { static char * ws[4] = { "-x" , "-y" , "+x" , "+y" } ;
04589      drive_MCW_imseq( wset.seq, isqDR_winfosides, (XtPointer)ws ) ;
04590    }
04591 
04592    drive_MCW_imseq( wset.seq , isqDR_display , (XtPointer)-1 ) ;
04593 
04594    MCW_invert_widget( wset.open_view_pb ) ;
04595 
04596    RESET_QUIT ;
04597 }
04598 
04599 
04600 
04601 XtPointer T3D_getim( int n , int type , FD_brick * br )
04602 {
04603    MCW_imseq_status * stat ;
04604 
04605    if( n < 0 || n >= br->n3 || type == isqCR_getoverlay ) return NULL ;
04606 
04607    if( type == isqCR_getstatus ){
04608       stat = myXtNew( MCW_imseq_status ) ;
04609 
04610       stat->num_total  = br->n3 ;
04611       stat->num_series = br->n3 ;
04612       stat->send_CB    = T3D_imseq_CB ;
04613       stat->parent     = (XtPointer) br ;
04614       stat->aux        = NULL ;
04615 
04616       stat->transforms0D = NULL ;
04617       stat->transforms2D = NULL ;
04618       stat->slice_proj   = NULL ;
04619 
04620       return (XtPointer) stat ;
04621    }
04622 
04623    if( type == isqCR_getimage || type == isqCR_getqimage ){
04624       return (XtPointer) FD_brick_to_mri( n , 0 , br ) ;
04625    }
04626 
04627    return NULL ; 
04628 }
04629 
04630 
04631 
04632 void T3D_imseq_CB( MCW_imseq * seq , FD_brick * br , ISQ_cbs * cbs )
04633 {
04634    switch( cbs->reason ){
04635 
04636       case isqCR_destroy:
04637          myXtFree( seq ) ; wset.seq = NULL ;
04638          myXtFree( br ) ;
04639          MCW_invert_widget( wset.open_view_pb ) ;
04640       break ;
04641 
04642       case isqCR_newimage:
04643          drive_MCW_imseq( seq, isqDR_title, (XtPointer) imnames->ar[cbs->nim] ) ;
04644       break ;
04645 
04646       case isqCR_force_redisplay:{  
04647          drive_MCW_imseq( seq , isqDR_display , (XtPointer) seq->im_nr ) ;
04648          drive_MCW_imseq( seq , isqDR_rebar   , (XtPointer) seq->im_nr ) ;
04649       }
04650 
04651    }
04652    return ;
04653 }
04654 
04655 
04656 
04657 
04658 
04659 void T3D_save_file_CB( Widget w ,
04660                        XtPointer client_data , XtPointer call_data )
04661 {
04662    Boolean good , isfunc ;
04663    int ii , jj , bigfile ;
04664    Widget wmsg = NULL ;
04665    int npad ;
04666 
04667    
04668 
04669    if( wset.topshell != NULL && wset.good ) T3D_widgets_to_data() ;
04670 
04671    
04672 
04673    good = T3D_check_data( True ) ;
04674    if( !good ) return ;
04675 
04676    AFNI_speak("Saving",0) ;
04677 
04678    
04679 
04680    dset->type      = user_inputs.dataset_type ;
04681    dset->view_type = user_inputs.view_type ;
04682 
04683    isfunc = ISFUNC(dset) ;
04684 
04685    dset->func_type = (isfunc) ? (user_inputs.function_type)
04686                               : (user_inputs.anatomy_type) ;
04687 
04688    if( isfunc && FUNC_HAVE_THR(dset->func_type) ){
04689       int iv = FUNC_ival_thr[dset->func_type] ;
04690       switch( DBLK_BRICK_TYPE(dblk,iv) ){
04691          default:
04692             dblk->brick_fac[iv] = 0.0 ;
04693          break ;
04694 
04695          case MRI_short:
04696             dblk->brick_fac[iv] = 1.0 / FUNC_scale_short[dset->func_type] ;
04697          break ;
04698 
04699          case MRI_byte:
04700             dblk->brick_fac[iv] = 1.0 / FUNC_scale_byte[dset->func_type] ;
04701          break ;
04702       }
04703    }
04704 
04705    if( user_inputs.need_stat_aux ){
04706       INIT_STAT_AUX( dset ,
04707                      FUNC_need_stat_aux[user_inputs.function_type] ,
04708                      user_inputs.stat_aux ) ;
04709    }
04710 
04711    dset->warp = NULL ;
04712 
04713    MCW_strncpy( dset->label1 , user_inputs.short_label1 , THD_MAX_LABEL ) ;
04714    MCW_strncpy( dset->label2 , user_inputs.short_label2 , THD_MAX_LABEL ) ;
04715    dset->keywords = NULL ;
04716 
04717    if( strlen(dset->label1) == 0 ){
04718       MCW_strncpy( dset->label1 , user_inputs.output_filename , THD_MAX_LABEL ) ;
04719    }
04720 
04721    EMPTY_STRING( dset->warp_parent_name ) ;
04722    ZERO_IDCODE(dset->warp_parent_idcode) ;
04723 
04724    if( strlen(user_inputs.anatomy_dataname) > 0 ){
04725       MCW_strncpy( dset->anat_parent_name ,
04726                    user_inputs.anatomy_dataname , THD_MAX_NAME ) ;
04727       dset->anat_parent_idcode = user_inputs.anatomy_parent_idcode ;
04728    } else {
04729       EMPTY_STRING( dset->anat_parent_name ) ;
04730       ZERO_IDCODE(dset->anat_parent_idcode) ;
04731    }
04732 
04733    MCW_strncpy( dset->self_name, user_inputs.dataset_name, THD_MAX_NAME ) ;
04734 
04735    daxes->xxorient = user_inputs.xorient ;
04736    daxes->yyorient = user_inputs.yorient ;
04737    daxes->zzorient = user_inputs.zorient ;
04738 
04739    daxes->xxorg = (ORIENT_sign[user_inputs.xorient] == '+')
04740                   ? (-user_inputs.xorigin) : ( user_inputs.xorigin) ;
04741 
04742    daxes->yyorg = (ORIENT_sign[user_inputs.yorient] == '+')
04743                   ? (-user_inputs.yorigin) : ( user_inputs.yorigin) ;
04744 
04745    daxes->zzorg = (ORIENT_sign[user_inputs.zorient] == '+')
04746                   ? (-user_inputs.zorigin) : ( user_inputs.zorigin) ;
04747 
04748    daxes->xxdel = (ORIENT_sign[user_inputs.xorient] == '+')
04749                   ? ( user_inputs.xsize) : (-user_inputs.xsize) ;
04750 
04751    daxes->yydel = (ORIENT_sign[user_inputs.yorient] == '+')
04752                   ? ( user_inputs.ysize) : (-user_inputs.ysize) ;
04753 
04754 #ifdef ALLOW_NONCONTIG
04755    daxes->zzdel = (ORIENT_sign[user_inputs.zorient] == '+')
04756                   ? ( user_inputs.zspacing) : (-user_inputs.zspacing) ;
04757 #else
04758    daxes->zzdel = (ORIENT_sign[user_inputs.zorient] == '+')
04759                   ? ( user_inputs.zsize) : (-user_inputs.zsize) ;
04760 #endif
04761 
04762    
04763 
04764 #ifdef ALLOW_NONCONTIG
04765    daxes->xxskip = 0.0 ;
04766    daxes->yyskip = 0.0 ;
04767    daxes->zzskip = user_inputs.zspacing - user_inputs.zsize ;
04768 #endif
04769 
04770    dset->taxis = NULL ;
04771 
04772    if( user_inputs.ntt > 0 ){
04773       dset->taxis = myXtNew( THD_timeaxis ) ;
04774 
04775       dset->taxis->type       = TIMEAXIS_TYPE ;
04776       dset->taxis->ntt        = user_inputs.ntt ;
04777       dset->taxis->ttdel      = user_inputs.TR ;
04778       dset->taxis->ttdur      = 0.0 ;
04779       dset->taxis->units_type = user_inputs.tunits ;  
04780       dset->taxis->ttorg      = user_inputs.Torg ;    
04781 
04782       if( user_inputs.tpattern != NULL ){
04783          dset->taxis->nsl     = daxes->nzz ;
04784          dset->taxis->zorg_sl = daxes->zzorg ;
04785          dset->taxis->dz_sl   = daxes->zzdel ;
04786          dset->taxis->toff_sl = user_inputs.tpattern ;
04787       } else {
04788          dset->taxis->nsl     = 0 ;
04789          dset->taxis->zorg_sl = 0.0 ;
04790          dset->taxis->dz_sl   = 0.0 ;
04791          dset->taxis->toff_sl = NULL ;
04792       }
04793    }
04794 
04795    
04796 
04797    if( dset->taxis == NULL )
04798       bigfile = (daxes->nxx * daxes->nyy * daxes->nzz > 9999999) ;
04799    else
04800       bigfile = (daxes->nxx * daxes->nyy * daxes->nzz * dset->taxis->ntt > 9999999) ;
04801 
04802    if( wset.topshell != NULL && bigfile && wset.good ){
04803       wmsg = MCW_popup_message( wset.save_file_pb ,
04804                                    "***************\n"
04805                                    "*  Computing  *\n"
04806                                    "*  dataset    *\n"
04807                                    "*  statistics *\n"
04808                                    "***************" ,
04809                                 MCW_CALLER_KILL ) ;
04810       WATCH_cursorize( wmsg ) ;
04811       XFlush( XtDisplay(wmsg) ) ;
04812    } else {
04813       wmsg = NULL ;
04814    }
04815 
04816    THD_load_statistics( dset ) ;
04817 
04818    if( !outliers_checked ){    
04819       T3D_check_outliers(0) ; outliers_checked = 1 ;
04820    }
04821 
04822    if( wmsg != NULL ) XtDestroyWidget( wmsg ) ;
04823 
04824    
04825 
04826    if( dset->type      == HEAD_ANAT_TYPE     &&
04827        dset->view_type == VIEW_ORIGINAL_TYPE &&
04828        DSET_NUM_TIMES(dset) == 1                ){  
04829 
04830       markers = dset->markers = myXtNew( THD_marker_set ) ;
04831       markers->numdef = 0 ;
04832 
04833       for( ii=0 ; ii < MARKS_MAXNUM ; ii++ ){       
04834          markers->valid[ii] = 0 ;
04835          for( jj=0 ; jj < MARKS_MAXLAB  ; jj++ )
04836             markers->label[ii][jj] = '\0';
04837          for( jj=0 ; jj < MARKS_MAXHELP ; jj++ )
04838             markers->help[ii][jj]  = '\0';
04839       }
04840 
04841       for( ii=0 ; ii < NMARK_ALIGN ; ii++ ){       
04842          MCW_strncpy( &(markers->label[ii][0]) ,
04843                       THD_align_label[ii] , MARKS_MAXLAB ) ;
04844          MCW_strncpy( &(markers->help[ii][0]) ,
04845                       THD_align_help[ii] , MARKS_MAXHELP ) ;
04846       }
04847 
04848       for( ii=0 ; ii < MARKS_MAXFLAG ; ii++ )     
04849          markers->aflags[ii] = THD_align_aflags[ii] ;
04850 
04851    } 
04852 
04853    
04854 
04855    if( wset.topshell != NULL && bigfile && wset.good ){
04856       wmsg = MCW_popup_message( wset.save_file_pb ,
04857                                    "********************\n"
04858                                    "*  Please wait for *\n"
04859                                    "*  disk operation  *\n"
04860                                    "********************" ,
04861                                 MCW_CALLER_KILL ) ;
04862       WATCH_cursorize( wmsg ) ;
04863       XFlush( XtDisplay(wmsg) ) ;
04864    } else {
04865       wmsg = NULL ;
04866    }
04867 
04868 
04869 
04870    dset->idcode = MCW_new_idcode() ;
04871 
04872    npad = (int) zpad ;
04873    if( npad == 0 ){   
04874 
04875       good = THD_write_3dim_dataset( user_inputs.session_filename ,
04876                                      user_inputs.output_filename , dset , True ) ;
04877 
04878    } else {           
04879       THD_3dim_dataset * qset=NULL ;
04880       int flag=0 ;
04881 
04882       if( zpad_mm ) flag = ZPAD_MM ;
04883 
04884       switch( daxes->zzorient ){
04885          case ORI_R2L_TYPE:
04886          case ORI_L2R_TYPE:
04887             qset = THD_zeropad( dset, 0,0,0,0,npad,npad, user_inputs.output_filename,flag ) ;
04888          break ;
04889 
04890          case ORI_P2A_TYPE:
04891          case ORI_A2P_TYPE:
04892             qset = THD_zeropad( dset, 0,0,npad,npad,0,0, user_inputs.output_filename,flag ) ;
04893          break ;
04894 
04895          case ORI_I2S_TYPE:
04896          case ORI_S2I_TYPE:
04897             qset = THD_zeropad( dset, npad,npad,0,0,0,0, user_inputs.output_filename,flag ) ;
04898          break ;
04899 
04900          default:
04901             fprintf(stderr,"*** Can't zpad: zzorient=%d\n",daxes->zzorient) ;
04902          break ;
04903       }
04904 
04905       if( commandline != NULL ) tross_Append_History( qset , commandline ) ;
04906 
04907       { int ppad[3] ;
04908         ppad[0] = ppad[1] = 0 ; ppad[2] = npad ;
04909         THD_set_int_atr( qset->dblk , "TO3D_ZPAD" , 3 , ppad ) ;
04910       }
04911 
04912       THD_load_statistics( qset ) ;
04913       good = THD_write_3dim_dataset( user_inputs.session_filename ,
04914                                      user_inputs.output_filename , qset , True ) ;
04915       DSET_delete(qset) ;
04916    }
04917 
04918    if( wmsg != NULL ) XtDestroyWidget( wmsg ) ;
04919 
04920    if( !good ) T3D_poperr("*******************\n\n" ,
04921                           "Some error occurred\n"
04922                           "while trying to write file") ;
04923 
04924    else if( wset.topshell != NULL && wset.good )
04925       wmsg = MCW_popup_message( wset.save_file_pb ,
04926                                  "*********************\n"
04927                                  "*  Dataset written  *\n"
04928                                  "*  out to disk.     *\n"
04929                                  "*********************" ,
04930                                 MCW_USER_KILL | MCW_TIMER_KILL ) ;
04931 
04932    return ;
04933 }
04934 
04935 
04936 
04937 
04938 
04939 void T3D_widgets_to_data(void)
04940 {
04941    char * str ;
04942 
04943    if( wset.topshell == NULL || !wset.good ) return ;
04944 
04945    user_inputs.xorient = wset.xorient_av->ival ;
04946    user_inputs.yorient = wset.yorient_av->ival ;
04947    user_inputs.zorient = wset.zorient_av->ival ;
04948 
04949    user_inputs.voxshape     = MCW_val_bbox( wset.voxshape_bbox ) ;
04950 #ifdef ALLOW_NONCONTIG
04951    user_inputs.voxcontig    = MCW_val_bbox( wset.voxcontig_bbox ) ;
04952 #endif
04953    user_inputs.xyz_centered = MCW_val_bbox( wset.centered_bbox ) ;
04954 
04955    user_inputs.dataset_type  = wset.dataset_type_av->ival ;
04956    user_inputs.function_type = wset.function_type_av->ival ;
04957    user_inputs.anatomy_type  = wset.anatomy_type_av->ival ;
04958 
04959    MCW_strncpy( user_inputs.dataset_type_string ,
04960                 DATASET_typestr[user_inputs.dataset_type] ,
04961                 THD_MAX_NAME ) ;
04962 
04963    MCW_strncpy( user_inputs.function_type_string ,
04964                 FUNC_typestr[user_inputs.function_type] ,
04965                 THD_MAX_NAME ) ;
04966 
04967    MCW_strncpy( user_inputs.anatomy_type_string ,
04968                 ANAT_typestr[user_inputs.anatomy_type] ,
04969                 THD_MAX_NAME ) ;
04970 
04971    user_inputs.fov      = wset.fov_av->fval ;
04972    user_inputs.xsize    = wset.xsize_av->fval ;
04973    user_inputs.ysize    = wset.ysize_av->fval ;
04974    user_inputs.zsize    = wset.zsize_av->fval ;
04975 #ifdef ALLOW_NONCONTIG
04976    user_inputs.zspacing = wset.zspacing_av->fval ;
04977 #endif
04978    user_inputs.xorigin  = wset.xorigin_av->fval ;
04979    user_inputs.yorigin  = wset.yorigin_av->fval ;
04980    user_inputs.zorigin  = wset.zorigin_av->fval ;
04981 
04982 #ifndef NO_NAMES
04983    str = XmTextFieldGetString( wset.dataset_name_textfield ) ;
04984    MCW_strncpy( user_inputs.dataset_name, str, THD_MAX_NAME ) ;
04985    myXtFree(str) ;
04986 
04987    str = XmTextFieldGetString( wset.short_label1_textfield ) ;
04988    MCW_strncpy( user_inputs.short_label1, str, THD_MAX_LABEL ) ;
04989    myXtFree(str) ;
04990 #endif
04991 
04992    str = XmTextFieldGetString( wset.geometry_parent_textfield ) ;
04993    MCW_strncpy( user_inputs.geometry_parent_filename, str, THD_MAX_NAME ) ;
04994    myXtFree(str) ;
04995 
04996    str = XmTextFieldGetString( wset.anatomy_parent_textfield ) ;
04997    MCW_strncpy( user_inputs.anatomy_parent_filename, str, THD_MAX_NAME ) ;
04998    myXtFree(str) ;
04999 
05000    str = XmTextFieldGetString( wset.output_file_textfield ) ;
05001    MCW_strncpy( user_inputs.output_filename, str, THD_MAX_NAME ) ;
05002    myXtFree(str) ;
05003 
05004    str = XmTextFieldGetString( wset.session_file_textfield ) ;
05005    MCW_strncpy( user_inputs.session_filename, str, THD_MAX_NAME ) ;
05006    myXtFree(str) ;
05007 
05008 #ifndef NO_NAMES
05009    str = XmTextFieldGetString( wset.geometry_dataname_textfield ) ;
05010    MCW_strncpy( user_inputs.geometry_dataname , str, THD_MAX_NAME ) ;
05011    myXtFree(str) ;
05012 
05013    str = XmTextFieldGetString( wset.anatomy_dataname_textfield ) ;
05014    MCW_strncpy( user_inputs.anatomy_dataname , str, THD_MAX_NAME ) ;
05015    myXtFree(str) ;
05016 #endif
05017 
05018    if( user_inputs.need_stat_aux ){
05019       int ii ;
05020       char * endptr , * sstr ;
05021 
05022       for( ii=0 ; ii < MAX_STAT_AUX ; ii++ )
05023          user_inputs.stat_aux[ii] = 0.0 ;
05024 
05025       sstr = XmTextFieldGetString( wset.stat_aux_textfield ) ;
05026       if( sstr != NULL ){
05027 
05028 
05029 
05030          str = sstr ;
05031          ii  = 0 ;
05032          do{
05033             
05034 
05035             while( *str != '\0' && ( isspace(*str) || *str == ',' ) ) str++ ;
05036             if( *str == '\0' ) break ;  
05037 
05038             user_inputs.stat_aux[ii++] = strtod(str,&endptr) ;
05039 
05040             if( endptr == str || *endptr == '\0' ) break ; 
05041 
05042             str = endptr ; 
05043          } while ( ii < MAX_STAT_AUX ) ;
05044          myXtFree(sstr) ;
05045       }
05046    }
05047 
05048    return ;
05049 }
05050 
05051 
05052 
05053 
05054 
05055 void T3D_data_to_widgets(void)
05056 {
05057    if( wset.topshell == NULL || !wset.good ) return ;  
05058 
05059    AV_assign_ival( wset.xorient_av , user_inputs.xorient ) ;
05060    AV_assign_ival( wset.yorient_av , user_inputs.yorient ) ;
05061    AV_assign_ival( wset.zorient_av , user_inputs.zorient ) ;
05062 
05063    MCW_set_bbox( wset.voxshape_bbox  , user_inputs.voxshape     ) ;
05064 #ifdef ALLOW_NONCONTIG
05065    MCW_set_bbox( wset.voxcontig_bbox , user_inputs.voxcontig    ) ;
05066 #endif
05067    MCW_set_bbox( wset.centered_bbox  , user_inputs.xyz_centered ) ;
05068 
05069    AV_assign_ival( wset.dataset_type_av  , user_inputs.dataset_type ) ;
05070    AV_assign_ival( wset.function_type_av , user_inputs.function_type ) ;
05071    AV_assign_ival( wset.anatomy_type_av , user_inputs.anatomy_type ) ;
05072 
05073    AV_assign_fval( wset.fov_av       , user_inputs.fov ) ;
05074    AV_assign_fval( wset.xsize_av     , user_inputs.xsize ) ;
05075    AV_assign_fval( wset.ysize_av     , user_inputs.ysize ) ;
05076    AV_assign_fval( wset.zsize_av     , user_inputs.zsize ) ;
05077 #ifdef ALLOW_NONCONTIG
05078    AV_assign_fval( wset.zspacing_av  , user_inputs.zspacing ) ;
05079 #endif
05080    AV_assign_fval( wset.xorigin_av   , user_inputs.xorigin ) ;
05081    AV_assign_fval( wset.yorigin_av   , user_inputs.yorigin ) ;
05082    AV_assign_fval( wset.zorigin_av   , user_inputs.zorigin ) ;
05083 
05084    SET_ORIGIN_LABEL(wset.xorigin_label,user_inputs.xorient) ;
05085    SET_ORIGIN_LABEL(wset.yorigin_label,user_inputs.yorient) ;
05086    SET_ORIGIN_LABEL(wset.zorigin_label,user_inputs.zorient) ;
05087 
05088    T3D_voxshape_CB (NULL,NULL,NULL) ;  
05089 #ifdef ALLOW_NONCONTIG
05090    T3D_voxcontig_CB(NULL,NULL,NULL) ;  
05091 #endif
05092    T3D_centered_CB (NULL,NULL,NULL) ;
05093 
05094    T3D_type_av_CB( wset.dataset_type_av , NULL ) ;  
05095 
05096 #ifndef NO_NAMES
05097    XmTextFieldSetString( wset.dataset_name_textfield ,
05098                          user_inputs.dataset_name ) ;
05099 
05100    XmTextFieldSetString( wset.short_label1_textfield ,
05101                          user_inputs.short_label1 ) ;
05102 #endif
05103 
05104    XmTextFieldSetString( wset.geometry_parent_textfield ,
05105                          user_inputs.geometry_parent_filename ) ;
05106 
05107    XmTextFieldSetString( wset.anatomy_parent_textfield ,
05108                          user_inputs.anatomy_parent_filename ) ;
05109 
05110    XmTextFieldSetString( wset.output_file_textfield ,
05111                          user_inputs.output_filename ) ;
05112 
05113    XmTextFieldSetString( wset.session_file_textfield ,
05114                          user_inputs.session_filename ) ;
05115 
05116 #ifndef NO_NAMES
05117    XmTextFieldSetString( wset.geometry_dataname_textfield ,
05118                          user_inputs.geometry_dataname ) ;
05119 
05120    XmTextFieldSetString( wset.anatomy_dataname_textfield ,
05121                          user_inputs.anatomy_dataname ) ;
05122 #endif
05123 
05124    
05125 
05126    T3D_setup_stat_aux() ;
05127 
05128    { int ii,num,bl ; char buf[256] ;
05129 
05130      for( ii=MAX_STAT_AUX-1 ; ii>=0 && user_inputs.stat_aux[ii]==0.0 ; ii-- ) ; 
05131      num = ii+1 ;
05132 
05133      if( num > 0 ){
05134        buf[0] = '\0' ;
05135        for( ii=0 ; ii < num ; ii++ ){
05136           bl = strlen(buf) ; if( bl+12 > 256 ) break ;
05137           sprintf( buf+bl , "%g " , user_inputs.stat_aux[ii] ) ;
05138        }
05139        XmTextFieldSetString( wset.stat_aux_textfield , buf ) ;
05140      }
05141    }
05142 
05143    return ;
05144 }
05145 
05146 
05147 
05148 
05149 
05150 #define OUTERR "*** ILLEGAL INPUTS (cannot save) ***\n\n"
05151 
05152 Boolean T3D_check_data( Boolean perr )
05153 {
05154    char xlab,ylab,zlab ;
05155    int ii , ll , ll_out , ll_sess ;
05156    Boolean good = True , isfunc ;
05157    char new_name[THD_MAX_NAME] ;
05158 
05159 ENTRY("T3D_check_data") ;
05160 
05161    
05162 
05163    xlab = ORIENT_xyz[user_inputs.xorient] ;
05164    ylab = ORIENT_xyz[user_inputs.yorient] ;
05165    zlab = ORIENT_xyz[user_inputs.zorient] ;
05166 
05167    if( xlab == ylab || xlab == zlab || ylab == zlab ){
05168       if(perr)T3D_poperr( OUTERR , "Axes orientations are not consistent!" ) ;
05169       good = False ;
05170    }
05171 
05172    
05173 
05174 STATUS("check output filename") ;
05175 
05176    ll_out = ll = strlen( user_inputs.output_filename ) ;
05177    if( ll == 0 ){
05178       if(perr)T3D_poperr( OUTERR , "No output filename provided!" ) ;
05179       good = False ;
05180    } else {
05181       for( ii=0 ; ii < ll ; ii++ )
05182          if( iscntrl(user_inputs.output_filename[ii]) ||
05183              isspace(user_inputs.output_filename[ii]) ||
05184              user_inputs.output_filename[ii] == '/'     ) break ;
05185 
05186       if( ii < ll ){
05187          if(perr)T3D_poperr( OUTERR ,
05188                              "Output filename contains illegal character!" ) ;
05189          good = False ;
05190       }
05191    }
05192 
05193    
05194 
05195 STATUS("check session name") ;
05196 
05197    ll_sess = ll = strlen( user_inputs.session_filename ) ;
05198    if( ll == 0 ){
05199       if(perr)T3D_poperr( OUTERR , "No session directory name provided!" ) ;
05200       good = False ;
05201    } else {
05202       for( ii=0 ; ii < ll ; ii++ )
05203          if( iscntrl(user_inputs.session_filename[ii]) ||
05204              isspace(user_inputs.session_filename[ii])   ) break ;
05205 
05206       if( ii < ll ){
05207          if(perr)T3D_poperr( OUTERR ,
05208                              "Session filename contains illegal character!" ) ;
05209          good = False ;
05210       }
05211    }
05212 
05213    
05214 
05215 STATUS("check if file exists") ;
05216 
05217    if( ll_sess > 0 && ll_out > 0 ){
05218       PATH_CONCAT( new_name , user_inputs.session_filename ,
05219                               user_inputs.output_filename   ) ;
05220       strcat(new_name , "+orig." DATASET_HEADER_SUFFIX ) ;
05221       ll = THD_is_file( new_name ) || THD_is_directory( new_name ) ;
05222       if( ll ){
05223        if(perr) T3D_poperr( OUTERR , "Output file already exists!" ) ;
05224        good = False ;
05225       }
05226    }
05227 
05228    
05229 
05230 
05231    isfunc = ISFUNCTYPE(user_inputs.dataset_type) ;
05232 
05233 #ifdef REQUIRE_ANAT_PARENT
05234    if( isfunc && strlen(user_inputs.anatomy_dataname) == 0 ){
05235       if(perr)T3D_poperr( OUTERR , "Anatomy parent not properly set!" ) ;
05236       good = False ;
05237    }
05238 #endif
05239 
05240    
05241 
05242 STATUS("check data types") ;
05243 
05244    if( isfunc ){
05245       if( ! AFNI_GOOD_FUNC_DTYPE(argopt.datum_all) ){
05246          if(perr)T3D_poperr(OUTERR , "Illegal functional datum type!" ) ;
05247          good = False ;
05248       }
05249    } else {
05250       if( ! AFNI_GOOD_DTYPE(argopt.datum_all) ){
05251          if(perr)T3D_poperr(OUTERR , "Illegal anatomical datum type!" ) ;
05252          good = False ;
05253       }
05254    }
05255 
05256    
05257 
05258 #ifndef NO_NAMES
05259    if( strlen(user_inputs.dataset_name) == 0 ){
05260       if(perr)T3D_poperr( OUTERR,"You **MUST** supply a name for the dataset!" ) ;
05261       good = False ;
05262    }
05263 #endif
05264 
05265    
05266 
05267 STATUS("check stat aux") ;
05268 
05269    T3D_setup_stat_aux() ;
05270    if( user_inputs.need_stat_aux ){
05271 
05272       for( ii=0 ; ii < FUNC_need_stat_aux[user_inputs.function_type] ; ii++ )
05273          if( user_inputs.stat_aux[ii] <= 0.0 ) break ;
05274 
05275       if( ii < FUNC_need_stat_aux[user_inputs.function_type] ){
05276          if(perr)T3D_poperr(OUTERR , "Invalid statistical parameters!" ) ;
05277          good = False ;
05278       }
05279    }
05280 
05281    
05282 
05283    RETURN( good );
05284 }
05285 
05286 
05287 
05288 void T3D_poperr( char * prefix_msg , char * msg )
05289 {
05290    static char * total_msg = NULL ;
05291    static int    len_total = 0 ;
05292    int len_needed ;
05293 
05294 ENTRY("T3D_poperr") ;
05295 
05296    len_needed = strlen(prefix_msg) + strlen(msg) + 2 ;
05297    if( len_needed > len_total ){
05298       total_msg = (char*)XtRealloc( total_msg , len_needed ) ;
05299       len_total = len_needed ;
05300    }
05301    strcpy( total_msg , prefix_msg ) ;
05302    strcat( total_msg , msg ) ;
05303 
05304    if( wset.topshell != NULL && wset.good ){
05305       (void) MCW_popup_message( wset.action_frame,
05306                                 total_msg, MCW_USER_KILL | MCW_TIMER_KILL ) ;
05307       XFlush( XtDisplay(wset.topshell) ) ;
05308       sleep(1) ;
05309    } else {
05310       fprintf(stderr,"%s\n",total_msg) ;
05311    }
05312    EXRETURN ;
05313 }
05314 
05315 
05316 
05317 
05318 
05319 void T3D_pointer_leave_EV( Widget w , XtPointer client_data ,
05320                            XEvent * ev , Boolean * continue_to_dispatch )
05321 {
05322    XLeaveWindowEvent * lev = (XLeaveWindowEvent *) ev ;
05323    XmAnyCallbackStruct cbs ;
05324 
05325    if( lev->type != LeaveNotify || w == NULL ) return ;
05326 
05327    cbs.reason = XmCR_ACTIVATE ;  
05328    cbs.event  = ev ;
05329    XtCallCallbacks( w , XmNactivateCallback , &cbs ) ;
05330 }
05331 
05332 
05333 
05334 
05335 
05336 #define DEBLANK(str) \
05337    { int iq ;        \
05338      for( iq=strlen(str)-1; iq >= 0 && str[iq]==' '; iq-- )str[iq]='\0'; \
05339    }
05340 
05341 #define INERR "*** DATASET READ ERROR ***\n\n"
05342 
05343 void T3D_geometry_parent_CB( Widget w ,
05344                              XtPointer client_data , XtPointer call_data )
05345 {
05346    static char * old_name = NULL ;
05347    char * new_name ;
05348    float size ;
05349    char new_path[THD_MAX_NAME] , new_pref[THD_MAX_NAME] ;
05350    THD_3dim_dataset * geom_dset ;
05351    THD_dataxes      * geom_daxes ;
05352 
05353    int xpad=0,ypad=0,zpad=0 ;  
05354 
05355 ENTRY("T3D_geometry_parent_CB") ;
05356 
05357    if( old_name == NULL ) old_name = XtNewString("Elvis Lives!!!") ;
05358 
05359    if( w != NULL ){
05360       new_name = XmTextFieldGetString( w ) ;  
05361    } else {
05362       new_name = XtNewString( user_inputs.geometry_parent_filename ) ;
05363    }
05364    DEBLANK(new_name) ;
05365 
05366    if( strlen(new_name) == 0 )         { old_name = new_name ; geomparent_loaded = 0 ; EXRETURN ; }
05367    if( strcmp(new_name,old_name) == 0 ){ myXtFree(new_name) ; geomparent_loaded = 0 ; EXRETURN ; }
05368 
05369    
05370 
05371    myXtFree(old_name) ; old_name = new_name ;
05372 
05373    
05374 
05375    if( strstr(new_name,"/") == NULL ){
05376       char * sess ;
05377       if( w != NULL ) sess = XmTextFieldGetString(wset.session_file_textfield);
05378       else            sess = XtNewString( user_inputs.session_filename ) ;
05379       DEBLANK(sess) ;
05380       if( strlen(sess) > 0 ){
05381          PATH_CONCAT( new_path , sess , new_name ) ;
05382       } else {
05383          strcpy( new_path , new_name ) ;
05384       }
05385       myXtFree(sess) ;
05386    } else {
05387       strcpy( new_path , new_name ) ;
05388    }
05389 
05390    FILENAME_TO_PREFIX(new_path,new_pref) ;
05391    if( strlen(new_pref) == 0 ) strcat(new_path,"+orig") ;
05392 
05393    
05394 
05395    geom_dset = THD_open_one_dataset( new_path ) ;
05396    if( geom_dset == NULL ){
05397       T3D_poperr( INERR ,
05398                   "Cannot read 3D dataset\nin geometry parent file" ) ;
05399       geomparent_loaded = 0 ; EXRETURN ;
05400    }
05401 
05402    
05403 
05404    { ATR_int * atr ;
05405      atr = THD_find_int_atr( geom_dset->dblk , "TO3D_ZPAD" ) ;
05406      if( atr != NULL && atr->nin >= 3 ){
05407         xpad = atr->in[0] ;
05408         ypad = atr->in[1] ;
05409         zpad = atr->in[2] ;
05410      }
05411    }
05412 
05413    geom_daxes = geom_dset->daxes ;
05414 
05415    if( geom_daxes->nxx - 2*xpad != user_inputs.nx ||
05416        geom_daxes->nyy - 2*ypad != user_inputs.ny ||
05417        geom_daxes->nzz - 2*zpad != user_inputs.nz   ){
05418 
05419        char msg[256] ;
05420 
05421        sprintf(msg,
05422                  "*** Shape mismatch!! ***\n"
05423                  "file   nx=%d ny=%d nz=%d (zpad=%d)\n"
05424                  "images nx=%d ny=%d nz=%d",
05425                geom_daxes->nxx,geom_daxes->nyy,geom_daxes->nzz,zpad,
05426                user_inputs.nx ,user_inputs.ny ,user_inputs.nz  ) ;
05427 
05428        T3D_poperr( INERR , msg ) ;
05429        THD_delete_3dim_dataset( geom_dset , False ) ;
05430        geomparent_loaded = 0 ; EXRETURN ;
05431    }
05432 
05433 #ifdef ALLOW_NONCONTIG
05434    if( geom_daxes->xxskip != 0.0 || geom_daxes->yyskip != 0.0 ){
05435       T3D_poperr( INERR , "Nonzero skip factors for x and y!" ) ;
05436       THD_delete_3dim_dataset( geom_dset , False ) ;
05437       geomparent_loaded = 0 ; EXRETURN ;
05438    }
05439 #endif
05440 
05441    
05442 
05443    
05444 
05445 
05446 
05447    T3D_widgets_to_data() ;
05448 
05449 #ifdef REQUIRE_ANAT_PARENT
05450    if( strlen(geom_dset->anat_parent_name) > 0 ){
05451       MCW_strncpy( user_inputs.anatomy_dataname ,
05452                    geom_dset->anat_parent_name, THD_MAX_NAME ) ;
05453       user_inputs.anatomy_parent_idcode = geom_dset->anat_parent_idcode ;
05454    }
05455 #endif
05456 
05457    MCW_strncpy( user_inputs.geometry_dataname ,
05458                 geom_dset->self_name , THD_MAX_NAME ) ;
05459 
05460    MCW_strncpy( user_inputs.geometry_parent_filename ,
05461                 new_name , THD_MAX_NAME ) ;
05462 
05463    user_inputs.xorient = geom_daxes->xxorient ;
05464    user_inputs.yorient = geom_daxes->yyorient ;
05465    user_inputs.zorient = geom_daxes->zzorient ;
05466 
05467 #if 0  
05468 
05469    user_inputs.xorigin = fabs(geom_daxes->xxorg) ;
05470    user_inputs.yorigin = fabs(geom_daxes->yyorg) ;
05471    user_inputs.zorigin = fabs(geom_daxes->zzorg) ;
05472 
05473 #else  
05474 
05475    { float xorg = geom_daxes->xxorg + xpad * geom_daxes->xxdel ;
05476      float yorg = geom_daxes->yyorg + ypad * geom_daxes->yydel ;
05477      float zorg = geom_daxes->zzorg + zpad * geom_daxes->zzdel ;
05478 
05479      user_inputs.xorigin = (ORIENT_sign[user_inputs.xorient] == '+')
05480                            ? (-xorg) : (xorg) ;
05481      user_inputs.yorigin = (ORIENT_sign[user_inputs.yorient] == '+')
05482                            ? (-yorg) : (yorg) ;
05483      user_inputs.zorigin = (ORIENT_sign[user_inputs.zorient] == '+')
05484                            ? (-zorg) : (zorg) ;
05485    }
05486 #endif
05487 
05488    user_inputs.xsize    = fabs(geom_daxes->xxdel) ;
05489    user_inputs.ysize    = fabs(geom_daxes->yydel) ;
05490 #ifdef ALLOW_NONCONTIG
05491    user_inputs.zspacing = fabs(geom_daxes->zzdel) ;
05492    user_inputs.zsize    = user_inputs.zspacing - geom_daxes->zzskip ;
05493 #else
05494    user_inputs.zsize    = fabs(geom_daxes->zzdel) ;
05495 #endif
05496 
05497    
05498 
05499    if( user_inputs.xsize != user_inputs.ysize ){
05500       user_inputs.voxshape = VOXSHAPE_IRREGULAR ;
05501    } else {
05502       if( user_inputs.xsize != user_inputs.zsize ){
05503          user_inputs.voxshape = VOXSHAPE_SQUARE ;
05504       } else {
05505          user_inputs.voxshape = VOXSHAPE_CUBICAL ;
05506       }
05507    }
05508    user_inputs.fov = user_inputs.xsize * user_inputs.nx ;
05509 
05510 #ifdef ALLOW_NONCONTIG
05511    if( geom_daxes->zzskip == 0 ) user_inputs.voxcontig = VOXCONTIG_YES ;
05512    else                          user_inputs.voxcontig = VOXCONTIG_UNIF ;
05513 #endif
05514 
05515    user_inputs.xyz_centered = 0 ;
05516 
05517    size = 0.5 * (user_inputs.nx-1) * user_inputs.xsize ;
05518    if( fabs(size - user_inputs.xorigin) < 0.01 )
05519       user_inputs.xyz_centered |= XCENTERED ;
05520 
05521    size = 0.5 * (user_inputs.ny-1) * user_inputs.ysize ;
05522    if( fabs(size - user_inputs.yorigin) < 0.01 )
05523       user_inputs.xyz_centered |= YCENTERED ;
05524 
05525    size = 0.5 * (user_inputs.nz-1) * user_inputs.zsize ;
05526    if( fabs(size - user_inputs.zorigin) < 0.01 )
05527       user_inputs.xyz_centered |= ZCENTERED ;
05528 
05529    T3D_data_to_widgets() ;
05530 
05531    THD_delete_3dim_dataset( geom_dset , False ) ;
05532 
05533    geometry_loaded   = 1 ;
05534    geomparent_loaded = 1 ;  
05535 
05536    EXRETURN ;
05537 }
05538 
05539 
05540 
05541 
05542 
05543 void T3D_anatomy_parent_CB( Widget w ,
05544                             XtPointer client_data , XtPointer call_data )
05545 {
05546    static char * old_name = NULL ;
05547    char * new_name ;
05548    char new_path[THD_MAX_NAME] , new_pref[THD_MAX_NAME] ;
05549    Boolean isfunc ;
05550    THD_3dim_dataset * anat_dset ;
05551 
05552 ENTRY("T3D_anatomy_parent_CB") ;
05553 
05554    if( old_name == NULL ) old_name = XtNewString("Elvis Lives!!!") ;
05555 
05556    
05557 
05558    if( w != NULL ){
05559       new_name = XmTextFieldGetString( w ) ;  
05560    } else {
05561       new_name = XtNewString( user_inputs.anatomy_parent_filename ) ;
05562    }
05563    DEBLANK(new_name) ;
05564 
05565    if( strlen(new_name) == 0 )         { old_name = new_name ; EXRETURN ; }
05566    if( strcmp(new_name,old_name) == 0 ){ myXtFree(new_name) ; EXRETURN ; }
05567 
05568    
05569 
05570    myXtFree(old_name) ; old_name = new_name ;
05571 
05572    
05573 
05574    if( strstr(new_name,"/") == NULL ){
05575       char * sess ;
05576       if( w != NULL ) sess = XmTextFieldGetString(wset.session_file_textfield);
05577       else            sess = XtNewString( user_inputs.session_filename ) ;
05578       DEBLANK(sess) ;
05579       if( strlen(sess) > 0 ){
05580          PATH_CONCAT( new_path , sess , new_name ) ;
05581       } else {
05582          strcpy( new_path , new_name ) ;
05583       }
05584       myXtFree(sess) ;
05585    } else {
05586       strcpy( new_path , new_name ) ;
05587    }
05588 
05589    FILENAME_TO_PREFIX(new_path,new_pref) ;
05590    if( strlen(new_pref) == 0 ) strcat(new_path,"+orig") ;
05591 
05592    anat_dset = THD_open_one_dataset( new_path ) ;
05593    if( anat_dset == NULL ){
05594       T3D_poperr( INERR ,
05595                   "Cannot read 3D dataset\nin anatomy parent file" ) ;
05596       EXRETURN ;
05597    }
05598 
05599    isfunc = ISFUNC(anat_dset) ;
05600    if( isfunc ){
05601       T3D_poperr( INERR ,
05602                   "Anatomy parent dataset\nis actually Function data!" ) ;
05603       THD_delete_3dim_dataset( anat_dset , False ) ;
05604       EXRETURN ;
05605    }
05606 
05607    
05608 
05609    MCW_strncpy( user_inputs.anatomy_dataname ,
05610                 anat_dset->self_name , THD_MAX_NAME ) ;
05611    user_inputs.anatomy_parent_idcode = anat_dset->idcode ;
05612 
05613 #ifndef NO_NAMES
05614    if( w != NULL ) XmTextFieldSetString( wset.anatomy_dataname_textfield ,
05615                                          user_inputs.anatomy_dataname ) ;
05616 #endif
05617 
05618    MCW_strncpy( user_inputs.anatomy_parent_filename ,
05619                 new_name , THD_MAX_NAME ) ;
05620 
05621    THD_delete_3dim_dataset( anat_dset , False ) ;
05622 
05623    EXRETURN ;
05624 }
05625 
05626 
05627 
05628 
05629 #if 0
05630 # define NAME2INT(nnn,iii,bot,top)           \
05631   { xdef = XGetDefault(display,"AFNI",nnn) ; \
05632     if( xdef != NULL ){                      \
05633        ival = strtol( xdef , &cpt , 10 ) ;   \
05634        if( *cpt == '\0' && ival >= (bot) && ival <= (top) ) (iii) = ival ; } }
05635 
05636 # define NAME2FLOAT(nnn,fff,bot,top)         \
05637   { xdef = XGetDefault(display,"AFNI",nnn) ; \
05638     if( xdef != NULL ){                      \
05639        fval = strtod( xdef , &cpt ) ;        \
05640        if( *cpt == '\0' && fval >= (bot) && fval <= (top) ) (fff) = fval ; } }
05641 
05642 # define NAME2STRING(nnn,sss)                \
05643   { xdef = XGetDefault(display,"AFNI",nnn) ; \
05644     if( xdef != NULL ) sss  = XtNewString(xdef) ; }
05645 #else
05646 # define NAME2INT(nnn,iii,bot,top)           \
05647   { xdef = RWC_getname(display,nnn) ;        \
05648     if( xdef != NULL ){                      \
05649        ival = strtol( xdef , &cpt , 10 ) ;   \
05650        if( *cpt == '\0' && ival >= (bot) && ival <= (top) ) (iii) = ival ; } }
05651 
05652 # define NAME2FLOAT(nnn,fff,bot,top)         \
05653   { xdef = RWC_getname(display,nnn) ;        \
05654     if( xdef != NULL ){                      \
05655        fval = strtod( xdef , &cpt ) ;        \
05656        if( *cpt == '\0' && fval >= (bot) && fval <= (top) ) (fff) = fval ; } }
05657 
05658 # define NAME2STRING(nnn,sss)                \
05659   { xdef = RWC_getname(display,nnn) ;        \
05660     if( xdef != NULL ) sss  = XtNewString(xdef) ; }
05661 #endif
05662 
05663 #define BAD -999
05664 
05665 void AFNI_load_defaults( Widget w )
05666 {
05667    char    * xdef ;
05668    Display * display ;
05669    int       ival ;
05670    float     fval ;
05671    char *    cpt ;
05672 
05673 ENTRY("AFNI_load_defaults") ;
05674 
05675    if( w == NULL ) EXRETURN ;
05676    display = XtDisplay( w ) ;
05677 
05678 
05679 
05680    NAME2INT("ncolors",INIT_ngray,3,MAX_COLORS) ;
05681 
05682    NAME2FLOAT("gamma",INIT_gamma,0.1,9.9) ;
05683 
05684    NAME2FLOAT("init_fov",INIT_fov,1.0,1000.0) ;
05685    INIT_fov = 0.1 * ( (int)(10*INIT_fov) ) ;
05686 
05687    EXRETURN ;
05688 }
05689 
05690 
05691 
05692 void T3D_stat_aux_CB( Widget w ,
05693                       XtPointer client_data , XtPointer call_data )
05694 {
05695    return ;
05696 }
05697 
05698 void T3D_setup_stat_aux(void)
05699 {
05700    char lbuf[THD_MAX_NAME] ;
05701    Boolean needit ;
05702 
05703 ENTRY("T3D_setup_stat_aux") ;
05704 
05705    user_inputs.need_stat_aux =
05706        ( ISFUNCTYPE(user_inputs.dataset_type) &&
05707          FUNC_need_stat_aux[user_inputs.function_type] > 0 ) ;
05708 
05709    if( wset.topshell != NULL && wset.good ){
05710       needit = (Boolean) user_inputs.need_stat_aux ;
05711 
05712       if( needit ){
05713          sprintf( lbuf , "%s: statistical parameters for %s" ,
05714                   FUNC_label_stat_aux[user_inputs.function_type] ,
05715                   FUNC_typestr[user_inputs.function_type] ) ;
05716       } else {
05717          sprintf( lbuf , "Field below not applicable" ) ;
05718       }
05719       XtSetSensitive( wset.stat_aux_label , needit ) ;
05720       XtSetSensitive( wset.stat_aux_textfield , needit ) ;
05721       MCW_set_widget_label( wset.stat_aux_label , lbuf ) ;
05722    }
05723 
05724    EXRETURN ;
05725 }
05726 
05727 #ifndef USE_OLD_DCODE
05728 
05729 
05730 
05731 
05732 
05733 
05734 
05735 
05736 
05737 
05738 
05739 
05740 
05741 
05742 
05743 int decode_location( char * str , float * val , int * dcode )
05744 {
05745    char acod , * ptr , * sstr = str ;
05746 
05747    *val   = WAY_BIG ;
05748    *dcode = ILLEGAL_TYPE ;
05749    if( sstr == NULL || sstr[0] == '\0' ) return 0 ;
05750 
05751 
05752 
05753    acod = toupper(sstr[0]) ; *dcode = ORCODE(acod) ;
05754    if( *dcode >= 0 ) sstr++ ;
05755 
05756    if( sstr[0] == '\0' ) return ((*dcode < 0) ? 0 : 1) ;
05757 
05758 
05759 
05760    *val = strtod( sstr , &ptr ) ;
05761    if( *val == 0.0 && ptr == sstr ) return ((*dcode < 0) ? 0 : 1) ;
05762    sstr = ptr ;
05763 
05764    if( *dcode >= 0 || sstr[0] == '\0' ) return (sstr-str) ;
05765 
05766    acod = toupper(sstr[0]) ; *dcode = ORCODE(acod) ;
05767    if( *dcode >= 0 ) sstr++ ;
05768 
05769    return (sstr-str) ;
05770 }
05771 #endif 
05772 
05773 
05774 
05775 void T3D_check_outliers( int opcode )
05776 {
05777    char *eee = my_getenv("AFNI_TO3D_OUTLIERS") ;
05778    int skip = (eee != NULL && (*eee == 'N' || *eee == 'n')) ;
05779    int text = (eee != NULL && (*eee == 'T' || *eee == 't')) ;
05780 
05781 ENTRY("T3D_check_outliers") ;
05782 
05783    if( dset->taxis != NULL                  &&
05784        dset->taxis->ntt > 5                 &&
05785        !skip                                &&
05786        ISANATTYPE(user_inputs.dataset_type) &&
05787        negative_shorts < 0.01*nvox_total      ){
05788 
05789      int *out_count, out_ctop , cc=0 ;
05790      Widget wmsg ;
05791 
05792      if( wset.topshell != NULL && wset.good ){
05793         wmsg = MCW_popup_message( wset.save_file_pb ,
05794                                    "****************\n"
05795                                    "* Checking for *\n"
05796                                    "* time series  *\n"
05797                                    "*   outliers   *\n"
05798                                    "****************" ,
05799                                 MCW_CALLER_KILL ) ;
05800         CURSOR_watchize ;
05801      } else {
05802         fprintf(stderr,"Checking for time series outliers\n") ;
05803      }
05804 
05805      THD_outlier_count( dset , 0.01 , &out_count , &out_ctop ) ;
05806 
05807      if( out_count != NULL && out_ctop > 0 ){  
05808         int iv,nvals=dset->taxis->ntt ; char *msg = AFMALL(char,2048+8*nvals) ;
05809 
05810         strcpy(msg," \nto3d WARNING:\nSignificant outliers detected in these sub-bricks:\n") ;
05811 
05812         for( iv=0 ; iv < nvals ; iv++ ){
05813            if( out_count[iv] > out_ctop ){
05814               sprintf(msg+strlen(msg)," %3d",iv) ; cc++ ;
05815               if( cc%12 == 0 ) strcat(msg,"\n") ;
05816            }
05817         }
05818 
05819         if( outliers_fname != NULL ){                    
05820            FILE *fp = fopen( outliers_fname , "w" ) ;
05821            if( fp == NULL ){
05822              fprintf(stderr,"** Can't open -save_outliers %s\n",outliers_fname);
05823            } else {
05824              for( iv=0 ; iv < nvals ; iv++ )
05825                fprintf(fp,"%3d %3d\n",out_count[iv],out_ctop) ;
05826              fclose(fp) ;
05827            }
05828         }
05829 
05830         if( cc > 0 ){                             
05831            if( cc%12 > 0 ) strcat(msg,"\n") ;
05832            strcat(msg,"You should inspect the dataset for possible corruption.\n");
05833            strcat(msg," [Outliers are defined as in program 3dToutcount.     ]\n");
05834            strcat(msg," [Outliers early in an EPI time series may be due to  ]\n");
05835            strcat(msg," [the longitudinal magnetization equilibration effect.]\n");
05836            strcat(msg," [Other causes are subject movement, scanner problems,]\n");
05837            strcat(msg," [or anything that makes a time series look irregular.]\n");
05838            strcat(msg," [  3dToutcount -save outnam dataset | 1dplot -stdin  ]\n");
05839            strcat(msg," [can be used to make a dataset 'outnam' that marks   ]\n");
05840            strcat(msg," [outlier voxels; see 3dToutcount -help for details.  ]\n");
05841 
05842            fprintf(stderr,"%s\n",msg) ;                        
05843            if( wset.topshell != NULL && !text && wset.good ){  
05844               float *y[2] ;
05845               y[0] = AFMALL(float, sizeof(float)*nvals) ;
05846               y[1] = AFMALL(float, sizeof(float)*nvals) ;
05847               for( iv=0 ; iv < nvals ; iv++ ){
05848                  y[0][iv] = out_count[iv] ; y[1][iv] = out_ctop ;
05849               }
05850               plot_ts_lab( XtDisplay(wset.topshell) ,              
05851                            nvals , NULL , 2 , y ,
05852                            "Sub-brick Index" ,
05853                            "Outlier Count (and Threshold)" ,
05854                            user_inputs.output_filename , NULL , NULL ) ;
05855               free(y[0]); free(y[1]) ;
05856               (void) MCW_popup_message( wset.xsize_av->wrowcol , 
05857                                         msg , MCW_USER_KILL     ) ;
05858            }
05859         }
05860         free(msg) ;
05861      }
05862 
05863      if( out_count != NULL ) free(out_count) ;
05864 
05865      if( wset.topshell != NULL && wset.good ){
05866         XtDestroyWidget(wmsg); CURSOR_normalize;
05867         if( cc == 0 )
05868           (void) MCW_popup_message( wset.save_file_pb ,
05869                                     " \n"
05870                                     "** No unusual outlier  **\n"
05871                                     "** concentration found **\n" ,
05872                                     MCW_USER_KILL | MCW_TIMER_KILL ) ;
05873      } else {
05874         if( cc == 0 )
05875           fprintf(stderr,"No unusual outlier concentration found\n") ;
05876      }
05877    }
05878 
05879    EXRETURN ;
05880 }