00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 #define MAIN
00032 
00033 #include "afni.h"
00034 #include <X11/keysym.h>  
00035 #include "afni_plugout.h"
00036 
00037 
00038 #ifdef SHOWOFF
00039 # undef  SHSH
00040 # undef  SHSHSH
00041 # undef  SHSTRING
00042 # define SHSH(x)   #x
00043 # define SHSHSH(x) SHSH(x)
00044 # define SHSTRING  SHSHSH(SHOWOFF)   
00045 #else
00046 # undef  SHSTRING
00047 #endif
00048 
00049 
00050 #ifdef SHSTRING
00051 #define ANNOUNCEMENT                                                           \
00052  "GPL AFNI: Analysis of Functional NeuroImages, by RW Cox (" COXEMAIL ")\n"    \
00053  "This is Version " VERSION               "\n"                                 \
00054  "[[Precompiled binary " SHSTRING ": " __DATE__ "]]\n\n"                       \
00055  " ** This software was designed to be used only for research purposes. **\n"  \
00056  " ** Clinical uses are not recommended, and have never been evaluated. **\n"  \
00057  " ** This software comes with no warranties of any kind whatsoever,    **\n"  \
00058  " ** and may not be useful for anything.  Use it at your own risk!     **\n"  \
00059  " ** If these terms are not acceptable, you aren't allowed to use AFNI.**\n"  \
00060  " ** See 'Define Datamode->Misc->License Info' for more details.       **\n\n"
00061 #else
00062 #define ANNOUNCEMENT                                                           \
00063  "GPL AFNI: Analysis of Functional NeuroImages, by RW Cox (" COXEMAIL ")\n"    \
00064  "This is Version " VERSION               "\n\n"                               \
00065  " ** This software was designed to be used only for research purposes. **\n"  \
00066  " ** Clinical uses are not recommended, and have never been evaluated. **\n"  \
00067  " ** This software comes with no warranties of any kind whatsoever,    **\n"  \
00068  " ** and may not be useful for anything.  Use it at your own risk!     **\n"  \
00069  " ** If these terms are not acceptable, you aren't allowed to use AFNI.**\n"  \
00070  " ** See 'Define Datamode->Misc->License Info' for more details.       **\n\n"
00071 #endif
00072 
00073 #define USE_FRIENDS
00074 
00075 #ifdef AFNI_DEBUG
00076 #  define REPORT_PROGRESS(str)  
00077 #else
00078 #  define REPORT_PROGRESS(str)  \
00079     do{ if(AFNI_VERBOSE){printf(str);fflush(stdout);} } while(0)
00080 #endif
00081 
00082 #define EMPTY_STRING(str) ((str)[0] = '\0')
00083 
00084 #ifdef AFNI_DEBUG
00085 #  define USE_TRACING
00086 #endif
00087 
00088 
00089 
00090 
00091 
00092 static XtAppContext   MAIN_app ;
00093 static XtErrorHandler MAIN_old_handler ;   
00094 static Three_D_View * MAIN_im3d ;
00095 static MCW_DC *       MAIN_dc ;
00096 static Widget         MAIN_shell=NULL ;
00097 static int            MAIN_argc ;
00098 static char **        MAIN_argv ;
00099 static Boolean        MAIN_workprocess( XtPointer ) ;
00100 
00101 #define USE_SIDES  
00102                    
00103 
00104 
00105 
00106 static int   COM_num = 0 ;
00107 static char *COM_com[1024] ;  
00108 
00109 
00110 
00111 
00112 
00113 void AFNI_syntax(void)
00114 {
00115    printf(
00116      ANNOUNCEMENT
00117 
00118      "----------------------------------------------------------------\n"
00119      "USAGE 1: read in sessions of 3D datasets (created by to3d, etc.)\n"
00120      "----------------------------------------------------------------\n"
00121      "   afni [options] [session_directory ...]\n"
00122      "\n"
00123 #if MMAP_THRESHOLD > 0
00124      "   -purge       Conserve memory by purging data to disk.\n"
00125      "                  [Use this if you run out of memory when running AFNI.]\n"
00126      "                  [This will slow the code down, so use only if needed.]\n"
00127 #endif
00128      "   -posfunc     Set up the color 'pbar' to use only positive function values.\n"
00129      "   -R           Recursively search each session_directory for more session\n"
00130      "                  subdirectories.\n"
00131      "       WARNING: This will descend the entire filesystem hierarchy from\n"
00132      "                  each session_directory given on the command line.  On a\n"
00133      "                  large disk, this may take a long time.  To limit the\n"
00134      "                  recursion to 5 levels (for example), use -R5.\n"
00135      "   -ignore N    Tells the program to 'ignore' the first N points in\n"
00136      "                  time series for graphs and FIM calculations.\n"
00137      "   -im1 N       Tells the program to use image N as the first one for\n"
00138      "                  graphs and FIM calculations (same as '-ignore N-1')\n"
00139      "   -tlrc_small  These options set whether to use the 'small' or 'big'\n"
00140      "   -tlrc_big      Talairach brick size.  The compiled in default for\n"
00141      "                  the program is now 'big', unlike AFNI 1.0x.\n"
00142 #ifndef WARP_4D
00143      "   -warp_4D     Allows the program to Talairach transform and write\n"
00144      "                  to disk 3D+time datasets.  Note that the resulting\n"
00145      "                  disk files will be gigantic (100s of Megabytes).\n"
00146 #endif
00147      "   -no1D        Tells AFNI not to read *.1D timeseries files from\n"
00148      "                  the dataset directories.  The *.1D files in the\n"
00149      "                  directories listed in the AFNI_TSPATH environment\n"
00150      "                  variable will still be read (if this variable is\n"
00151      "                  not set, then './' will be scanned for *.1D files.)\n"
00152      "\n"
00153      "   -noqual      Tells AFNI not to enforce the 'quality' checks when\n"
00154      "                  making the transformations to +acpc and +tlrc.\n"
00155      "   -unique      Tells the program to create a unique set of colors\n"
00156      "                  for each AFNI controller window.  This allows\n"
00157      "                  different datasets to be viewed with different\n"
00158      "                  grayscales or colorscales.  Note that -unique\n"
00159      "                  will only work on displays that support 12 bit\n"
00160      "                  PseudoColor (e.g., SGI workstations) or TrueColor.\n"
00161      "   -orient code Tells afni the orientation in which to display\n"
00162      "                  x-y-z coordinates (upper left of control window).\n"
00163      "                  The code must be 3 letters, one each from the\n"
00164      "                  pairs {R,L} {A,P} {I,S}.  The first letter gives\n"
00165      "                  the orientation of the x-axis, the second the\n"
00166      "                  orientation of the y-axis, the third the z-axis:\n"
00167      "                   R = right-to-left         L = left-to-right\n"
00168      "                   A = anterior-to-posterior P = posterior-to-anterior\n"
00169      "                   I = inferior-to-superior  S = superior-to-inferior\n"
00170      "                  The default code is RAI ==> DICOM order.  This can\n"
00171      "                  be set with the environment variable AFNI_ORIENT.\n"
00172      "                  As a special case, using the code 'flipped' is\n"
00173      "                  equivalent to 'LPI' (this is for Steve Rao).\n"
00174 #ifdef ALLOW_PLUGINS
00175      "   -noplugins   Tells the program not to load plugins.\n"
00176      "                  (Plugins can also be disabled by setting the\n"
00177      "                   environment variable AFNI_NOPLUGINS.)\n"
00178      "   -yesplugouts Tells the program to listen for plugouts.\n"
00179      "                  (Plugouts can also be enabled by setting the\n"
00180      "                   environment variable AFNI_YESPLUGOUTS.)\n"
00181      "   -YESplugouts Makes the plugout code print out lots of messages\n"
00182      "                  (useful for debugging a new plugout).\n"
00183      "   -noplugouts  Tells the program NOT to listen for plugouts.\n"
00184      "                  (This option is available to override\n"
00185      "                   the AFNI_YESPLUGOUTS environment variable.)\n"
00186 #endif
00187      "   -skip_afnirc Tells the program NOT to read the file .afnirc\n"
00188      "                  in the home directory.  See README.setup for\n"
00189      "                  details on the use of .afnirc for initialization.\n"
00190      "   -layout fn   Tells AFNI to read the initial windows layout from\n"
00191      "                  file 'fn'.  If this option is not given, then\n"
00192      "                  environment variable AFNI_LAYOUT_FILE is used.\n"
00193      "                  If neither is present, then AFNI will do whatever\n"
00194      "                  it feels like.\n"
00195      "\n"
00196      "   -niml        If present, turns on listening for NIML-formatted\n"
00197      "                  data from SUMA.  Can also be turned on by setting\n"
00198      "                  environment variable AFNI_NIML_START to YES.\n"
00199      "   -np port     If present, sets the NIML socket port number to 'port'.\n"
00200      "                  This must be an integer between 1024 and 65535,\n"
00201      "                  and must be the same as the '-np port' number given\n"
00202      "                  to SUMA.  [default = 53211]\n"
00203      "\n"
00204      "   -com ccc     This option lets you specify 'command strings' to\n"
00205      "                  drive AFNI after the program startup is completed.\n"
00206      "                  Legal command strings are described in the file\n"
00207      "                  README.driver.  More than one '-com' option can\n"
00208      "                  be used, and the commands will be executed in\n"
00209      "                  the order they are given on the command line.\n"
00210      "            N.B.: Most commands to AFNI contain spaces, so the 'ccc'\n"
00211      "                  command strings will need to be enclosed in quotes.\n"
00212      "\n"
00213      " * If no session_directories are given, then the program will use\n"
00214      "    the current working directory (i.e., './').\n"
00215      " * The maximum number of sessions is now set to  %d.\n"
00216      " * The maximum number of datasets per session is %d.\n"
00217      " * To change these maximums, you must edit file '3ddata.h' and then\n"
00218      "    recompile this program.\n"
00219 
00220      , THD_MAX_NUM_SESSION , THD_MAX_SESSION_SIZE
00221    ) ;
00222 
00223    printf(
00224      "\n"
00225      "-----------------------------------------------------\n"
00226      "USAGE 2: read in images for 'quick and dirty' viewing\n"
00227      "-----------------------------------------------------\n"
00228      "(Most advanced features of AFNI will be disabled.)\n"
00229      "\n"
00230      "   afni -im [options] im1 im2 im3 ...\n"
00231      "\n"
00232      "   -im          Flag to read in images instead of 3D datasets\n"
00233      "                  (Talaraich and functional stuff won't work)\n"
00234      "   -dy yratio   Tells afni the downscreen pixel size is 'yratio' times\n"
00235      "                  the across-screen (x) pixel dimension (default=1.0)\n"
00236      "   -dz zratio   Tells afni the slice thickness is 'zratio' times\n"
00237      "                  the x pixel dimension (default=1.0)\n"
00238      "   -orient code Tells afni the orientation of the input images.\n"
00239      "                  The code must be 3 letters, one each from the\n"
00240      "                  pairs {R,L} {A,P} {I,S}.  The first letter gives\n"
00241      "                  the orientation of the x-axis, the second the\n"
00242      "                  orientation of the y-axis, the third the z-axis:\n"
00243      "                   R = right-to-left         L = left-to-right\n"
00244      "                   A = anterior-to-posterior P = posterior-to-anterior\n"
00245      "                   I = inferior-to-superior  S = superior-to-inferior\n"
00246      "                  (the default code is ASL ==> sagittal images).\n"
00247      "                  Note that this use of '-orient' is different from\n"
00248      "                  the use when viewing datasets.\n"
00249      "   -resize      Tells afni that all images should be resized to fit\n"
00250      "                  the size of the first one, if they don't already fit\n"
00251      "                  (by default, images must all 'fit' or afni will stop)\n"
00252      "   -datum type  Tells afni to convert input images into the type given:\n"
00253      "                  byte, short, float, complex are the legal types.\n"
00254      " The image files (im1 ...) are the same formats as accepted by to3d.\n"
00255      "\n"
00256      " New image display options (alternatives to -im) [19 Oct 1999]:\n"
00257      "   -tim         These options tell AFNI to arrange the input images\n"
00258      "   -tim:<nt>    into a internal time-dependent dataset.  Suppose that\n"
00259      "   -zim:<nz>    there are N input 2D slices on the command line.\n"
00260      "              * -tim alone means these are N points in time (1 slice).\n"
00261      "              * -tim:<nt> means there are nt points in time (nt is\n"
00262      "                  an integer > 1), so there are N/nt slices in space,\n"
00263      "                  and the images on the command line are input in\n"
00264      "                  time order first (like -time:tz in to3d).\n"
00265      "              * -zim:<nz> means there are nz slices in space (nz is\n"
00266      "                  an integer > 1), so there are N/nz points in time,\n"
00267      "                  and the images on the command line are input in\n"
00268      "                  slice order first (like -time:zt in to3d).\n"
00269      "\n"
00270      " N.B.: You may wish to use the -ignore option to set the number of\n"
00271      "        initial points to ignore in the time series graph if you use\n"
00272      "        -tim or -zim, since there is no way to change this from\n"
00273      "        within an AFNI run (the FIM menus are disabled).\n"
00274      " N.B.: The program 'aiv' (AFNI image viewer) can also be used to\n"
00275      "        look at images.\n"
00276    ) ;
00277 
00278    printf(
00279      "\n"
00280      "-------------------------------------------------------\n"
00281      "USAGE 3: read in datasets specified on the command line\n"
00282      "-------------------------------------------------------\n"
00283      "\n"
00284      "  afni -dset [options] dname1 dname2 ...\n"
00285      "\n"
00286      "where 'dname1' is the name of a dataset, etc.  With this option, only\n"
00287      "the chosen datasets are read in, and they are all put in the same\n"
00288      "'session'.  Follower datasets are not created.\n"
00289      "\n"
00290     MASTER_HELP_STRING
00291      "\n"
00292     CALC_HELP_STRING
00293    ) ;
00294 
00295    printf(
00296      "\n"
00297      "-------------------------------\n"
00298      "GENERAL OPTIONS (for any usage)\n"
00299      "-------------------------------\n"
00300      "\n"
00301      "   -q           Tells afni to be 'quiet' on startup\n"
00302      "   -Dname=val   Sets environment variable 'name' to 'val' inside AFNI;\n"
00303      "                  will supersede any value set in .afnirc.\n"
00304      "   -gamma gg    Tells afni that the gamma correction factor for the\n"
00305      "                  monitor is 'gg' (default gg is 1.0; greater than\n"
00306      "                  1.0 makes the image contrast larger -- this may\n"
00307      "                  also be adjusted interactively)\n"
00308      "   -install     Tells afni to install a new X11 Colormap.  This only\n"
00309      "                  means something for PseudoColor displays.  Also, it\n"
00310      "                  usually cause the notorious 'technicolor' effect.\n"
00311      "   -ncolors nn  Tells afni to use 'nn' gray levels for the image\n"
00312      "                  displays (default is %d)\n"
00313      "   -xtwarns     Tells afni to show any Xt warning messages that may\n"
00314      "                  occur; the default is to suppress these messages.\n"
00315      "   -tbar name   Uses 'name' instead of 'AFNI' in window titlebars.\n"
00316      "   -flipim and  The '-flipim' option tells afni to display images in the\n"
00317      "   -noflipim      'flipped' radiology convention (left on the right).\n"
00318      "                  The '-noflipim' option tells afni to display left on\n"
00319      "                  the left, as neuroscientists generally prefer.  This\n"
00320      "                  latter mode can also be set by the Unix environment\n"
00321      "                  variable 'AFNI_LEFT_IS_LEFT'.  The '-flipim' mode is\n"
00322      "                  the default.\n"
00323 #ifdef USE_TRACING
00324      "   -trace       Turns routine call tracing on, for debugging purposes.\n"
00325      "   -TRACE       Turns even more verbose tracing on, for more debugging.\n"
00326 #endif
00327 #ifdef USING_MCW_MALLOC
00328      "   -nomall      Disables use of the mcw_malloc() library routines.\n"
00329 #endif
00330      "\n"
00331      "N.B.: Many of these options, as well as the initial color set up,\n"
00332      "      can be controlled by appropriate X11 resources.  See the\n"
00333      "      file AFNI.Xdefaults for instructions and examples.\n"
00334 
00335      , DEFAULT_NGRAY
00336    ) ;
00337 
00338    printf(
00339     "\n"
00340     "----------\n"
00341     "REFERENCES\n"
00342     "----------\n"
00343     "The following papers describe some of the components of the AFNI package.\n"
00344     "\n"
00345     "RW Cox.  AFNI: Software for analysis and visualization of functional\n"
00346     "  magnetic resonance neuroimages.  Computers and Biomedical Research,\n"
00347     "  29: 162-173, 1996.\n"
00348     "\n"
00349     "  * The first AFNI paper, and the one I prefer you cite if you want to\n"
00350     "    refer to the AFNI package as a whole.\n"
00351     "\n"
00352     "RW Cox, A Jesmanowicz, and JS Hyde.  Real-time functional magnetic\n"
00353     "  resonance imaging.  Magnetic Resonance in Medicine, 33: 230-236, 1995.\n"
00354     "\n"
00355     "  * The first paper on realtime FMRI; describes the algorithm used in\n"
00356     "    3dfim+, the interactive FIM calculations, and in the realtime plugin.\n"
00357     "\n"
00358     "RW Cox and JS Hyde.  Software tools for analysis and visualization of\n"
00359     "  FMRI Data.  NMR in Biomedicine, 10: 171-178, 1997.\n"
00360     "\n"
00361     "  * A second paper about AFNI and design issues for FMRI software tools.\n"
00362     "\n"
00363     "RW Cox and A Jesmanowicz.  Real-time 3D image registration for\n"
00364     "  functional MRI.  Magnetic Resonance in Medicine, 42: 1014-1018, 1999.\n"
00365     "\n"
00366     "  * Describes the algorithm used for image registration in 3dvolreg\n"
00367     "    and in the realtime plugin.\n"
00368     "\n"
00369     "ZS Saad, KM Ropella, RW Cox, and EA DeYoe.  Analysis and use of FMRI\n"
00370     "  response delays.  Human Brain Mapping, 13: 74-93, 2001.\n"
00371     "\n"
00372     "  * Describes the algorithm used in 3ddelay (cf. '3ddelay -help').\n"
00373    ) ;
00374 
00375    printf("\n") ; exit(0) ;
00376 }
00377 
00378 
00379 
00380 
00381 
00382 void AFNI_parse_args( int in_argc , char * in_argv[] )
00383 {
00384    int narg = 1 ;
00385    char * env_orient , * env ;
00386    int     argc=in_argc ,    new_argc      ; 
00387    char ** argv=in_argv , ** new_argv=NULL ;
00388 
00389 ENTRY("AFNI_parse_args") ;
00390 
00391    if( argc > 1 && strncmp(argv[1],"-help",2) == 0 ) AFNI_syntax() ;
00392 
00393    GLOBAL_argopt.dz       = 1.0 ;          
00394    GLOBAL_argopt.dy       = 1.0 ;
00395    GLOBAL_argopt.ignore   = INIT_ignore ;
00396    GLOBAL_argopt.elide_quality  = 0 ;      
00397    GLOBAL_argopt.no_frivolities = 0 ;      
00398    GLOBAL_argopt.install_cmap   = 0 ;      
00399    GLOBAL_argopt.read_1D        = 1 ;      
00400 
00401    GLOBAL_argopt.enable_suma    = 1 ;      
00402 
00403    GLOBAL_argopt.yes_niml       = AFNI_yesenv("AFNI_NIML_START") ;
00404    GLOBAL_argopt.port_niml      = 0 ;      
00405 
00406 #if 0
00407    GLOBAL_argopt.allow_rt = 0 ;            
00408 #else                                      
00409    GLOBAL_argopt.allow_rt = AFNI_yesenv("AFNI_REALTIME_Activate") ;
00410    GLOBAL_argopt.no_frivolities = (GLOBAL_argopt.allow_rt != 0) ;
00411 #endif
00412 
00413    SESSTRAIL = 1 ;
00414    env = getenv( "AFNI_SESSTRAIL" ) ;
00415    if( env != NULL ){
00416      SESSTRAIL = strtol(env,NULL,10) ;
00417      if( SESSTRAIL < 0 ) SESSTRAIL = 0 ;  
00418    }
00419 
00420    GLOBAL_argopt.elide_quality = AFNI_yesenv("AFNI_MARKERS_NOQUAL") ;
00421 
00422    
00423 
00424    { char * lf = getenv("AFNI_LAYOUT_FILE") ;
00425      if( lf != NULL ){
00426         char * eh = getenv("HOME") , * ff ;
00427         int ll = strlen(lf) + 8 ;
00428         if( eh != NULL ) ll += strlen(eh) ;
00429         ff = AFMALL(char, ll) ;
00430         if( eh != NULL && lf[0] != '/' ){ strcpy(ff,eh) ; strcat(ff,"/") ; }
00431         else                            { ff[0] = '\0' ; }
00432         strcat(ff,lf) ;
00433         GLOBAL_argopt.layout_fname = ff ;
00434      }
00435    }
00436 
00437    
00438 
00439    { char *lf = getenv("AFNI_STARTUP_SCRIPT") ;
00440      if( lf == NULL ) lf = ".afni.startup_script" ;
00441      if( lf != NULL ){
00442        char *eh = NULL , *ff ;
00443        int ll = strlen(lf) + 8 ;
00444        if( !THD_is_file(lf) && lf[0] != '/' ) eh = getenv("HOME") ;
00445        if( eh != NULL ) ll += strlen(eh) ;
00446        ff = AFMALL(char, ll) ;
00447        if( eh != NULL ){ strcpy(ff,eh) ; strcat(ff,"/") ; }
00448        else            { ff[0] = '\0' ; }
00449        strcat(ff,lf) ;
00450        GLOBAL_argopt.script_fname = ff ;
00451      }
00452    }
00453 
00454    
00455 
00456    env = getenv( "AFNI_OPTIONS" ) ;
00457    if( env != NULL )
00458      prepend_string_to_args( env, in_argc, in_argv, &new_argc, &new_argv ) ;
00459    if( new_argv != NULL ){
00460       MAIN_argc = argc = new_argc ;
00461       MAIN_argv = argv = new_argv ;
00462    }
00463 
00464 #ifdef ALLOW_PLUGINS
00465    GLOBAL_argopt.noplugins  =  AFNI_yesenv( "AFNI_NOPLUGINS" ) ;
00466    GLOBAL_argopt.noplugouts = !AFNI_yesenv( "AFNI_YESPLUGOUTS" ) ;
00467 #endif
00468 
00469    env_orient = getenv( "AFNI_ORIENT" ) ;
00470 
00471    GLOBAL_argopt.read_sessions = True ;        
00472    GLOBAL_argopt.read_images   = False ;
00473    GLOBAL_argopt.read_dsets    = False ;       
00474 
00475    GLOBAL_argopt.datum         = ILLEGAL_TYPE ;
00476 
00477    GLOBAL_argopt.gamma         = INIT_gamma ;
00478    GLOBAL_argopt.gsfac         = 0.0 ;
00479    GLOBAL_argopt.ncolor        = INIT_ngray ;
00480 #if MMAP_THRESHOLD > 0
00481    GLOBAL_argopt.auto_purge    = INIT_purge ;
00482 #else
00483    GLOBAL_argopt.auto_purge    = True ;
00484 #endif
00485    GLOBAL_argopt.resize_images = False ;       
00486    GLOBAL_argopt.keep_logo     = False ;       
00487    GLOBAL_argopt.pos_func      = INIT_posfunc ;
00488    GLOBAL_argopt.recurse       = 0 ;           
00489    GLOBAL_argopt.xtwarns       = False ;       
00490    GLOBAL_argopt.destruct      = False ;       
00491                                                
00492 
00493    GLOBAL_argopt.tlrc_big      = INIT_tlrc_big ; 
00494 #ifndef WARP_4D
00495    GLOBAL_argopt.warp_4D       = False ;
00496 #else
00497    GLOBAL_argopt.warp_4D       = True ;
00498 #endif
00499 
00500    GLOBAL_argopt.unique_dcs    = False ;  
00501 
00502    strcpy(GLOBAL_argopt.orient_code,"---") ;
00503 
00504    strcpy(GLOBAL_argopt.title_name,"AFNI") ;           
00505 
00506    GLOBAL_argopt.left_is_left = AFNI_yesenv( "AFNI_LEFT_IS_LEFT" ) ;
00507 
00508    GLOBAL_argopt.read_tim = 0 ;   
00509 
00510    while( narg < argc ){
00511 
00512       if( argv[narg][0] != '-' ) break ;   
00513 
00514 #ifdef USE_TRACING
00515       if( strncmp(argv[narg],"-trace",5) == 0 ){
00516          DBG_trace = 1 ;
00517          narg++ ; continue ;
00518       }
00519       if( strncmp(argv[narg],"-TRACE",5) == 0 ){  
00520          DBG_trace = 2 ;
00521          if( MAIN_shell != NULL )
00522             XSynchronize(XtDisplay(MAIN_shell),TRUE) ; 
00523          narg++ ; continue ;
00524       }
00525 #endif
00526 
00527       
00528 
00529       if( strncmp(argv[narg],"-D",2) == 0 && strchr(argv[narg],'=') != NULL ){
00530         (void) AFNI_setenv( argv[narg]+2 ) ;
00531         narg++ ; continue ;                 
00532       }
00533 
00534       
00535 
00536       if( strcmp(argv[narg],"-layout") == 0 ){
00537          if( narg+1 >= argc ) FatalError("need an argument after -layout!") ;
00538          GLOBAL_argopt.layout_fname = argv[++narg] ;  
00539          narg++ ; continue ;  
00540       }
00541 
00542       
00543 
00544       if( strncmp(argv[narg],"-no1D",5) == 0 ){
00545          GLOBAL_argopt.read_1D = 0 ;
00546          narg++ ; continue ;  
00547       }
00548 
00549       
00550 
00551       if( strncmp(argv[narg],"-skip_afnirc",12) == 0 ){
00552          GLOBAL_argopt.skip_afnirc  = 1 ;
00553          narg++ ; continue ;  
00554       }
00555 
00556       
00557 
00558       if( strncmp(argv[narg],"-rt",3) == 0 ){
00559          GLOBAL_argopt.allow_rt       = -1 ;
00560          GLOBAL_argopt.no_frivolities =  1 ;
00561 #if 0
00562 #ifdef USE_TRACING
00563          DBG_trace                    =  0 ;  
00564 #endif
00565 #endif
00566          narg++ ; continue ;  
00567       }
00568 
00569       if( strncmp(argv[narg],"-nort",5) == 0 ){  
00570          GLOBAL_argopt.allow_rt       = 0 ;
00571          GLOBAL_argopt.no_frivolities = 0 ;
00572          narg++ ; continue ;  
00573       }
00574 
00575       
00576 
00577       if( strncmp(argv[narg],"-noqual",6) == 0 ){
00578          GLOBAL_argopt.elide_quality = 1 ;
00579          narg++ ; continue ;  
00580       }
00581 
00582       
00583 
00584       if( strcmp(argv[narg],"-agni")==0 || strcmp(argv[narg],"-suma")==0 ){
00585          fprintf(stderr,"\n-agni/-suma are now turned on by default\n") ;
00586          GLOBAL_argopt.enable_suma = 1 ;
00587          narg++ ; continue ;  
00588       }
00589 
00590       
00591 
00592       if( strcmp(argv[narg],"-com") == 0 ){
00593         int ll ;
00594         if( ++narg >= argc ) FatalError("need an argument after -com!");
00595         ll = strlen(argv[narg]) ;
00596              if( ll > 255 ) ERROR_message("argument after -com is too long!" );
00597         else if( ll <   3 ) ERROR_message("argument after -com is too short!");
00598         else                COM_com[ COM_num++ ] = argv[narg] ;
00599 
00600         narg++ ; continue ;  
00601       }
00602 
00603       
00604 
00605       if( strcmp(argv[narg],"-niml") == 0 ){
00606          if( GLOBAL_argopt.yes_niml )
00607            fprintf(stderr,"\n-niml is already turned on\n") ;
00608          GLOBAL_argopt.yes_niml++ ;
00609          narg++ ; continue ;  
00610       }
00611 
00612       
00613 
00614       if( strcmp(argv[narg],"-np") == 0 ){
00615          float val ;
00616          if( narg+1 >= argc ) FatalError("need an argument after -np!");
00617 
00618          val = strtod( argv[++narg] , NULL ) ;
00619          if( val >= 1024 && val <= 65535 ) GLOBAL_argopt.port_niml = (int)val ;
00620          else fprintf(stderr,
00621                 "\n*** WARNING: -np %s is illegal!\n", argv[narg]);
00622          narg++ ; continue ;  
00623       }
00624 
00625       if( strcmp(argv[narg],"-noniml") == 0 ){
00626          GLOBAL_argopt.yes_niml-- ;
00627          if( GLOBAL_argopt.yes_niml < 0 ) GLOBAL_argopt.yes_niml = 0 ;
00628          narg++ ; continue ;  
00629       }
00630 
00631       
00632 
00633       if( strncmp(argv[narg],"-tbar",5) == 0 ){
00634          if( narg+1 >= argc ) FatalError("need an argument after -tbar!");
00635          MCW_strncpy(GLOBAL_argopt.title_name,argv[++narg],32) ;
00636          narg++ ; continue ;  
00637       }
00638 
00639       
00640 
00641       if( strncmp(argv[narg],"-xtwarns",6) == 0 ){
00642          GLOBAL_argopt.xtwarns = True ;
00643          narg++ ; continue ;  
00644       }
00645 
00646       
00647 
00648       if( strncmp(argv[narg],"-destruct",6) == 0 ){   
00649          fprintf(stderr,"\n*** -destruct option not implemented at present! ***\n") ;
00650          GLOBAL_argopt.destruct = False ;
00651          narg++ ; continue ;  
00652       }
00653 
00654       
00655 
00656       if( strncmp(argv[narg],"-posfunc",6) == 0 ){
00657          GLOBAL_argopt.pos_func = True ;
00658          narg++ ; continue ;  
00659       }
00660 
00661       
00662 
00663       if( strncmp(argv[narg],"-R",2) == 0 ){
00664          int ll = strlen(argv[narg]) ;
00665          if( ll == 2 ) GLOBAL_argopt.recurse = 999 ;
00666          else {
00667             ll = strtol( argv[narg]+2 , NULL , 10 ) ;
00668             if( ll > 0 ) GLOBAL_argopt.recurse = ll ;
00669             else FatalError("illegal -R option!") ;
00670          }
00671          narg++ ; continue ;  
00672       }
00673 
00674       
00675 
00676       if( strncmp(argv[narg],"-tlrc_big",7) == 0 ){
00677          GLOBAL_argopt.tlrc_big = True ;
00678          narg++ ; continue ;  
00679       }
00680 
00681       
00682 
00683       if( strncmp(argv[narg],"-unique",5) == 0 ){
00684          GLOBAL_argopt.unique_dcs = True ;
00685          narg++ ; continue ;  
00686       }
00687 
00688       
00689 
00690       if( strncmp(argv[narg],"-install",5) == 0 ){
00691          GLOBAL_argopt.install_cmap = True ;
00692          narg++ ; continue ;  
00693       }
00694 
00695 #ifndef WARP_4D
00696       
00697 
00698       if( strncmp(argv[narg],"-warp_4D",7) == 0 ){
00699          GLOBAL_argopt.warp_4D = True ;
00700          narg++ ; continue ;  
00701       }
00702 #endif
00703 
00704       
00705 
00706       if( strncmp(argv[narg],"-tlrc_small",7) == 0 ){
00707          GLOBAL_argopt.tlrc_big = False ;
00708          narg++ ; continue ;  
00709       }
00710 
00711       
00712 
00713       if( strncmp(argv[narg],"-logo",4) == 0 ){
00714          GLOBAL_argopt.keep_logo = True ;
00715          narg++ ; continue ;  
00716       }
00717 
00718       
00719 
00720       if( strncmp(argv[narg],"-resize",4) == 0 ){
00721          GLOBAL_argopt.resize_images = True ;
00722          narg++ ; continue ;  
00723       }
00724 
00725       
00726 
00727       if( strncmp(argv[narg],"-purge",4) == 0 ){
00728          GLOBAL_argopt.auto_purge = True ;
00729          narg++ ; continue ;  
00730       }
00731 
00732 #ifdef ALLOW_PLUGINS
00733       
00734 
00735       if( strncmp(argv[narg],"-noplugins",10) == 0 ){
00736          GLOBAL_argopt.noplugins = 1 ;
00737          narg++ ; continue ;  
00738       }
00739 
00740       
00741 
00742       if( strncmp(argv[narg],"-noplugouts",10) == 0 ){
00743          GLOBAL_argopt.noplugouts = 1 ;
00744          narg++ ; continue ;  
00745       }
00746 
00747       
00748 
00749       if( strncmp(argv[narg],"-yesplugouts",10) == 0 ){
00750          GLOBAL_argopt.noplugouts   = 0 ;
00751          GLOBAL_argopt.plugout_code = 0 ;
00752          narg++ ; continue ;  
00753       }
00754 
00755       
00756 
00757       if( strncmp(argv[narg],"-YESplugouts",10) == 0 ){
00758          GLOBAL_argopt.noplugouts   = 0 ;
00759          GLOBAL_argopt.plugout_code = 1 ;
00760          narg++ ; continue ;  
00761       }
00762 #endif
00763 
00764       
00765 
00766       if( strncmp(argv[narg],"-flipim",5) == 0 ){
00767          GLOBAL_argopt.left_is_left = 0 ;
00768          narg++ ; continue ;  
00769       }
00770 
00771       
00772 
00773       if( strncmp(argv[narg],"-noflipim",5) == 0 ){
00774          GLOBAL_argopt.left_is_left = 1 ;
00775          narg++ ; continue ;  
00776       }
00777 
00778       
00779 
00780       if( strncmp(argv[narg],"-orient",4) == 0 ){
00781          if( narg+1 >= argc ) FatalError("need an argument after -orient!");
00782 
00783          MCW_strncpy(GLOBAL_argopt.orient_code,argv[++narg],4) ;
00784          narg++ ; continue ;  
00785       }
00786 
00787       
00788 
00789       if( strncmp(argv[narg],"-ignore",4) == 0 ){
00790          float val ;
00791          if( narg+1 >= argc ) FatalError("need an argument after -ignore!");
00792 
00793          val = strtod( argv[++narg] , NULL ) ;
00794          if( val >= 0 ) GLOBAL_argopt.ignore = (int) val ;
00795          else fprintf(stderr,
00796                 "\n*** WARNING: -ignore value %s illegal\n", argv[narg]);
00797 
00798          narg++ ; continue ;  
00799       }
00800 
00801       
00802 
00803       if( strncmp(argv[narg],"-im1",4) == 0 ){
00804          float val ;
00805          if( narg+1 >= argc ) FatalError("need an argument after -im1!");
00806 
00807          val = strtod( argv[++narg] , NULL ) ;
00808          if( val >= 1 ) GLOBAL_argopt.ignore = (int) (val-1.0) ;
00809          else fprintf(stderr,
00810                 "\n*** WARNING: -ignore value %s illegal\n", argv[narg]);
00811 
00812          narg++ ; continue ;  
00813       }
00814 
00815 
00816       
00817 
00818       if( strncmp(argv[narg],"-dy",3) == 0 ){
00819          float val ;
00820          if( narg+1 >= argc ) FatalError("need an argument after -dy!");
00821 
00822          val = strtod( argv[++narg] , NULL ) ;
00823          if( val > 0 ) GLOBAL_argopt.dy = val ;
00824          else fprintf(stderr,
00825                 "\n*** WARNING: -dy value %s illegal\n", argv[narg]);
00826 
00827          narg++ ; continue ;  
00828       }
00829 
00830       
00831 
00832       if( strncmp(argv[narg],"-dz",3) == 0 ){
00833          float val ;
00834          if( narg+1 >= argc ) FatalError("need an argument after -dz!");
00835 
00836          val = strtod( argv[++narg] , NULL ) ;
00837          if( val > 0 ) GLOBAL_argopt.dz = val ;
00838          else fprintf(stderr,
00839                 "\n*** WARNING: -dz value %s illegal\n", argv[narg]);
00840 
00841          narg++ ; continue ;  
00842       }
00843 
00844       
00845 
00846       if( strncmp(argv[narg],"-gamma",4) == 0 ){
00847          float val ;
00848          if( narg+1 >= argc ) FatalError("need an argument after -gamma!");
00849 
00850          val = strtod( argv[++narg] , NULL ) ;
00851          if( val > 0 ) GLOBAL_argopt.gamma = val ;
00852          else fprintf(stderr,
00853                 "\n*** WARNING: -gamma value %s illegal\n", argv[narg]);
00854 
00855          narg++ ; continue ;  
00856       }
00857 
00858 #ifdef USE_GSFAC
00859       
00860 
00861       if( strncmp(argv[narg],"-gsfac",4) == 0 ){
00862          float val ;
00863          if( narg+1 >= argc ) FatalError("need an argument after -gsfac!");
00864 
00865          val = strtod( argv[++narg] , NULL ) ;
00866          if( val != 0 ) GLOBAL_argopt.gsfac = val ;
00867          else fprintf(stderr,
00868                 "\n*** WARNING: -gsfac value %s illegal\n", argv[narg]);
00869 
00870          narg++ ; continue ;  
00871       }
00872 #endif
00873 
00874       
00875 
00876       if( strncmp(argv[narg],"-datum",6) == 0 ){
00877          if( ++narg >= argc ) FatalError("need an argument after -datum!") ;
00878 
00879          if( strcmp(argv[narg],"short") == 0 ){
00880             GLOBAL_argopt.datum= MRI_short ;
00881          } else if( strcmp(argv[narg],"float") == 0 ){
00882             GLOBAL_argopt.datum= MRI_float ;
00883          } else if( strcmp(argv[narg],"complex") == 0 ){
00884             GLOBAL_argopt.datum= MRI_complex ;
00885          } else if( strcmp(argv[narg],"byte") == 0 ){
00886             GLOBAL_argopt.datum= MRI_byte ;
00887          } else {
00888             char buf[256] ;
00889             sprintf(buf,"-datum of type '%s' is not supported in AFNI!",
00890                    argv[narg] ) ;
00891             FatalError(buf) ;
00892          }
00893          narg++ ; continue ;  
00894       }
00895 
00896       
00897 
00898       if( strncmp(argv[narg],"-ncolor",3) == 0 ){
00899          float val ;
00900          if( narg+1 >= argc ) FatalError("need an argument after -ncolor!");
00901 
00902          val = strtod( argv[++narg] , NULL ) ;
00903          if( val > 2 ) GLOBAL_argopt.ncolor = val ;
00904          else fprintf(stderr,
00905                 "\n*** WARNING: -ncolor value %s illegal\n", argv[narg]);
00906 
00907          narg++ ; continue ;  
00908       }
00909 
00910       
00911 
00912       if( strncmp(argv[narg],"-dset",5) == 0 ){
00913          GLOBAL_argopt.read_images   = False ;
00914          GLOBAL_argopt.read_sessions = False ;
00915          GLOBAL_argopt.read_dsets    = True  ;
00916          narg++ ; continue ;  
00917       }
00918 
00919       
00920 
00921       if( strncmp(argv[narg],"-im",3) == 0 ){
00922          GLOBAL_argopt.read_images   = True ;
00923          GLOBAL_argopt.read_sessions = False ;
00924          GLOBAL_argopt.read_dsets    = False ;       
00925          narg++ ; continue ;  
00926       }
00927 
00928       
00929 
00930       if( strncmp(argv[narg],"-tim",4)==0 || strncmp(argv[narg],"-zim",4)==0 ){
00931          int ll=strlen(argv[narg]) , nn ;
00932 
00933          GLOBAL_argopt.read_images   = True ;
00934          GLOBAL_argopt.read_sessions = False ;
00935          GLOBAL_argopt.read_dsets    = False ;  
00936          GLOBAL_argopt.read_tim      = 1 ;
00937 
00938          if( ll > 5 && argv[narg][4] == ':' ){         
00939             nn = strtol( argv[narg]+5 , NULL , 10 ) ;
00940             if( nn > 1 ){
00941                GLOBAL_argopt.read_tim = nn ; 
00942             } else {
00943                fprintf(stderr,"** Error: illegal value in %s\n",argv[narg]);
00944                exit(1) ;
00945             }
00946          }
00947 
00948          
00949 
00950          if( strncmp(argv[narg],"-tim",4)==0 && GLOBAL_argopt.read_tim > 1 )
00951             GLOBAL_argopt.read_tim = - GLOBAL_argopt.read_tim ;
00952 
00953          narg++ ; continue ;  
00954       }
00955 
00956       
00957 
00958       if( strncmp(argv[narg],"-nomall",5) == 0 ){    
00959          narg++ ; continue ;  
00960       }
00961 
00962       
00963 
00964       if( strcmp(argv[narg],"-q") == 0 ){            
00965          narg++ ; continue ;  
00966       }
00967 
00968       
00969 
00970       if( strcmp(argv[narg],"--") == 0 ){
00971          narg++ ; break ;  
00972       }
00973 
00974       
00975 
00976       fprintf(stderr,"\n*** Unknown option %s ***",argv[narg]) ;
00977       fprintf(stderr,"\n*** Try 'afni -help' for a list of command line options.\n") ;
00978       exit(1) ;
00979 
00980    } 
00981 
00982 #if 0
00983 #ifdef USE_TRACING
00984    if( ALLOW_real_time ) DBG_trace = 0 ; 
00985 #endif
00986 #endif
00987 
00988 
00989 
00990    if( GLOBAL_argopt.orient_code[0] == '-' ){
00991       if( GLOBAL_argopt.read_images )
00992          strcpy(GLOBAL_argopt.orient_code,"ASL") ;
00993       else if( env_orient != NULL )
00994          MCW_strncpy(GLOBAL_argopt.orient_code,env_orient,4) ;
00995       else
00996          strcpy(GLOBAL_argopt.orient_code,"RAI") ;
00997    }
00998 
00999    THD_coorder_fill( GLOBAL_argopt.orient_code , &GLOBAL_library.cord ) ;
01000 
01001 #if 0
01002 fprintf(stderr,"\ncoorder: signs = %d %d %d  order = %d %d %d\n" ,
01003         GLOBAL_library.cord.xxsign ,
01004         GLOBAL_library.cord.yysign ,
01005         GLOBAL_library.cord.zzsign ,
01006         GLOBAL_library.cord.first ,
01007         GLOBAL_library.cord.second ,
01008         GLOBAL_library.cord.third   ) ;
01009 #endif
01010 
01011    GLOBAL_argopt.first_file_arg = narg ;  
01012 
01013    EXRETURN ;
01014 }
01015 
01016 
01017 
01018 
01019 
01020 
01021 void AFNI_handler(char * msg){ return ; }
01022 
01023 
01024 
01025 int AFNI_xerrhandler( Display *d , XErrorEvent *x ){ return 0; }
01026 
01027 
01028 
01029 
01030 
01031 
01032 
01033 static char * FALLback[] =
01034   {   "AFNI*fontList:              9x15bold=charset1"    ,
01035       "AFNI*pbar*fontList:         6x10=charset1"        ,
01036       "AFNI*imseq*fontList:        7x13=charset1"        ,
01037       "AFNI*background:            gray25"               ,
01038       "AFNI*menu*background:       gray15"               ,
01039       "AFNI*borderColor:           gray25"               ,
01040       "AFNI*foreground:            yellow"               ,
01041       "AFNI*borderWidth:           0"                    ,
01042       "AFNI*troughColor:           blue3"                ,
01043       "AFNI*XmLabel.translations:  #override<Btn2Down>:" , 
01044       "AFNI*help*background:       black"                ,
01045       "AFNI*help*foreground:       #ffff88"              ,
01046       "AFNI*help*helpborder:       False"                ,
01047       "AFNI*help*waitPeriod:       1066"                 ,
01048       "AFNI*help*fontList:         9x15bold=charset1"    ,
01049       "AFNI*cluefont:              9x15bold"             ,
01050       "AFNI*help*cancelWaitPeriod: 333"                  ,
01051    NULL } ;
01052 
01053 
01054 
01055 #define CATCH_SIGNALS
01056 #ifdef CATCH_SIGNALS
01057 #include <signal.h>
01058 void AFNI_sigfunc(int sig)   
01059 {
01060    char * sname ;
01061    static volatile int fff=0 ;
01062    if( fff ) _exit(1) ; else fff = 1 ;
01063    switch(sig){
01064       default:      sname = "unknown" ; break ;
01065       case SIGINT:  sname = "SIGINT"  ; break ;
01066       case SIGPIPE: sname = "SIGPIPE" ; break ;
01067       case SIGSEGV: sname = "SIGSEGV" ; break ;
01068       case SIGBUS:  sname = "SIGBUS"  ; break ;
01069       case SIGTERM: sname = "SIGTERM" ; break ;
01070    }
01071    fprintf(stderr,"\nFatal Signal %d (%s) received\n",sig,sname); fflush(stderr);
01072    TRACEBACK ;
01073    fprintf(stderr,"*** Program Abort ***\n") ; fflush(stderr) ;
01074    exit(1) ;
01075 }
01076 #endif
01077 
01078 
01079 
01080 
01081 
01082 static int check_string( char *targ , int ns , char *ss[] )
01083 {
01084    int ii , lt ;
01085    if( targ == NULL || *targ == '\0' || ns <= 0 || ss == NULL ) return 0 ;
01086    lt = strlen(targ) ;
01087    for( ii=0 ; ii < ns ; ii++ )
01088      if( ss[ii] != NULL && strncmp(ss[ii],targ,lt) == 0 ) return 1 ;
01089    return 0 ;
01090 }
01091 
01092 
01093 
01094 
01095 
01096 
01097 int main( int argc , char * argv[] )
01098 {
01099    int ii ;
01100 
01101    
01102 
01103    if( argc > 1 && strncmp(argv[1],"-help",2) == 0 ) AFNI_syntax() ;
01104 
01105 
01106 
01107    GLOBAL_argopt.skip_afnirc = check_string("-skip_afnirc",argc,argv) ;
01108    if( GLOBAL_argopt.skip_afnirc ) AFNI_mark_environ_done() ;
01109 
01110    
01111 
01112    machdep() ;                      
01113    THD_load_datablock_verbose(1) ;  
01114 
01115 #ifdef CATCH_SIGNALS
01116    signal(SIGINT ,AFNI_sigfunc) ;   
01117    signal(SIGBUS ,AFNI_sigfunc) ;
01118    signal(SIGSEGV,AFNI_sigfunc) ;
01119    signal(SIGTERM,AFNI_sigfunc) ;
01120 #endif
01121 
01122 
01123 
01124    if( check_string("-ver",argc,argv) || check_string("--ver",argc,argv) ){
01125      printf("Version " VERSION  "\n") ;
01126 #ifdef SHSTRING
01127        printf( "[[Precompiled binary " SHSTRING ": " __DATE__ "]]\n" ) ;
01128 #endif
01129      exit(0) ;
01130    }
01131 
01132 
01133 
01134    if( check_string("-show",argc,argv) || check_string("--show",argc,argv) ){
01135 #ifdef SHSTRING
01136       printf( SHSTRING "\n" ) ;
01137 #else
01138       printf("Unknown\n") ;
01139 #endif
01140       exit(0) ;
01141    }
01142 
01143 
01144 
01145 #ifdef USING_MCW_MALLOC
01146    if( !check_string("-nomall",argc,argv) && !check_string("-rt",argc,argv) )
01147      enable_mcw_malloc() ;
01148 #endif
01149 
01150 #ifdef USE_TRACING
01151    if( check_string("-trace",argc,argv) ) DBG_trace = 1 ;
01152    if( check_string("-TRACE",argc,argv) ) DBG_trace = 2 ;
01153 #endif
01154 
01155 #if 0
01156 #ifdef USE_TRACING
01157    if( ALLOW_real_time ) DBG_trace = 0 ; 
01158 #endif
01159 #endif
01160 
01161 
01162 
01163    GLOBAL_argopt.quiet = AFNI_yesenv("AFNI_QUIET") ;
01164    if( AFNI_VERBOSE && check_string("-q",argc,argv) ) GLOBAL_argopt.quiet = 1;
01165 
01166 
01167 
01168 
01169    GLOBAL_argopt.allow_rt = check_string("-rt",argc,argv) ;
01170 
01171    if( !GLOBAL_argopt.quiet && !ALLOW_real_time )
01172      AFNI_start_version_check() ;               
01173 
01174 
01175 
01176    { char **ed , *eqn ;
01177      static char *edef[] = {
01178          "AFNI_SUMA_LINECOLOR"       , "blue3"  ,
01179          "AFNI_CROSSHAIR_LINES"      , "YES"    ,
01180          "AFNI_ALWAYS_LOCK"          , "YES"    ,
01181          "AFNI_IMAGE_SAVESQUARE"     , "YES"    ,
01182 #ifdef DARWIN
01183          "AFNI_X11_REDECORATE"       , "NO"     ,  
01184 #endif
01185 
01186 #if 0
01187          "AFNI_IMAGE_LABEL_MODE"     , "1"      ,
01188          "AFNI_IMAGE_LABEL_SIZE"     , "2"      ,
01189          "AFNI_IMAGE_LABEL_SETBACK"  , "01"     ,
01190          "AFNI_IMAGE_LABEL_COLOR"    , "yellow" ,
01191 #endif
01192        NULL } ;
01193 
01194      for( ed=edef ; *ed != NULL && *(ed+1) != NULL ; ed+=2 ){
01195        if( getenv(*ed) == NULL ){
01196          eqn = (char *)malloc(128) ;
01197          sprintf(eqn,"%s=%s",*ed,*(ed+1)) ; putenv(eqn) ;
01198        }
01199      }
01200    }
01201 
01202 
01203 
01204    mainENTRY("AFNI:main") ; 
01205 
01206 
01207 
01208    THD_set_freeup( AFNI_purge_unused_dsets ) ;  
01209 
01210 #if 0
01211    if( argc > 1 ) AFNI_logger("afni",argc,argv) ; 
01212 #endif
01213 
01214    srand48((long)time(NULL)) ;  
01215 
01216    REPORT_PROGRESS( "\n" ) ;         
01217    REPORT_PROGRESS( ANNOUNCEMENT ) ;
01218 
01219    
01220 
01221 #ifdef USE_FRIENDS
01222    { char * sf = AFNI_get_friend() ;
01223      REPORT_PROGRESS( sf ) ;
01224      REPORT_PROGRESS( "\n\n" ) ;
01225      if( check_string("-friend",argc,argv) ) exit(0) ;
01226    }
01227 #endif
01228 
01229    
01230    
01231 
01232    for( ii=0 ; ii < MAX_CONTROLLERS ; ii++ )
01233      GLOBAL_library.controllers[ii] = NULL ;
01234    GLOBAL_library.dc = NULL ;
01235 
01236    GLOBAL_library.controller_lock = 0 ; ENABLE_LOCK ;
01237    GLOBAL_library.time_lock = 0 ;                      
01238    GLOBAL_library.ijk_lock  = 0 ;                      
01239    SET_FIM_bkthr(10.0) ;                               
01240 
01241    GLOBAL_library.hints_on  = 0 ;                      
01242 
01243 #ifdef ALLOW_PLUGINS
01244    GLOBAL_library.plugins   = NULL ;
01245 #endif
01246 
01247    GLOBAL_library.session   = NULL ;                   
01248    GLOBAL_library.warptable = NULL ;                   
01249 
01250    
01251    
01252 
01253    REPORT_PROGRESS("Initializing: X11");
01254 
01255    MAIN_shell = XtVaAppInitialize( &MAIN_app , "AFNI" , NULL , 0 ,
01256                                    &argc , argv , FALLback , NULL ) ;
01257 
01258    if( MAIN_shell == NULL ){
01259      fprintf(stderr,"\n*** Cannot initialize X11 ***\n") ; exit(1) ;
01260    }
01261    if( DBG_trace == 2 ){                           
01262      XSynchronize(XtDisplay(MAIN_shell),TRUE) ;
01263      STATUS("XSynchronize is enabled") ;
01264    }
01265 
01266    MAIN_argc = argc ; MAIN_argv = argv ;  
01267 
01268    REPORT_PROGRESS(".") ;
01269 
01270    
01271 
01272    if( ! GLOBAL_argopt.skip_afnirc ){
01273      char *sysenv = getenv("AFNI_SYSTEM_AFNIRC") ;        
01274      if( sysenv != NULL ) AFNI_process_environ(sysenv) ;  
01275 
01276      AFNI_process_environ(NULL) ;                         
01277    } else {
01278      AFNI_mark_environ_done() ;                           
01279    }
01280 
01281    AFNI_load_defaults( MAIN_shell ) ;
01282 
01283    if( ! GLOBAL_argopt.skip_afnirc ){          
01284       char * home = getenv("HOME") ; char fname[256] ;
01285       char * sysenv = getenv("AFNI_SYSTEM_AFNIRC") ;       
01286 
01287       GPT = NULL ;  
01288 
01289       if( sysenv != NULL )                                 
01290         AFNI_process_setup( sysenv , SETUP_INIT_MODE , NULL ) ;
01291 
01292       if( home != NULL ){ strcpy(fname,home) ; strcat(fname,"/.afnirc") ; }
01293       else              { strcpy(fname,".afnirc") ; }
01294       AFNI_process_setup( fname , SETUP_INIT_MODE , NULL ) ;
01295 
01296 #ifdef AFNI_DEBUG
01297       home = dump_PBAR_palette_table(0) ;
01298       if( home != NULL ){ puts(home) ; free(home) ; }
01299 #endif
01300 
01301    } else {                                    
01302       REPORT_PROGRESS( "[skip .afnirc]" ) ;
01303    }
01304 
01305    AFNI_parse_args( argc , argv ) ;  
01306 
01307    
01308 
01309    (void) XSetErrorHandler( AFNI_xerrhandler ) ;      
01310    (void) XtAppSetErrorHandler(MAIN_app,AFNI_handler) ;
01311 
01312    if( GLOBAL_argopt.xtwarns == False )
01313      (void) XtAppSetWarningHandler(MAIN_app,AFNI_handler) ;  
01314 
01315    
01316 
01317    { char * lenv = getenv("AFNI_FIM_BKTHR") ;          
01318      if( lenv != NULL ){
01319        float bk = strtod(lenv,NULL) ;
01320        if( bk >= 0.0 && bk < 100.0 ) SET_FIM_bkthr(bk) ;
01321      }
01322    }
01323 
01324    
01325 
01326    if( AFNI_yesenv("AFNI_ALWAYS_LOCK") ){
01327      for( ii=0 ; ii < MAX_CONTROLLERS ; ii++ )
01328        GLOBAL_library.controller_lock |= (1<<ii) ;
01329    }
01330 
01331    
01332 
01333    GLOBAL_library.dc = MAIN_dc =
01334         MCW_new_DC( MAIN_shell , GLOBAL_argopt.ncolor ,
01335                     INIT_ncolovr , INIT_colovr , INIT_labovr ,
01336                     GLOBAL_argopt.gamma , GLOBAL_argopt.install_cmap ) ;
01337 
01338    if( MAIN_dc->depth < 9 && MAIN_dc->visual_class != TrueColor && GLOBAL_argopt.unique_dcs ){
01339      GLOBAL_argopt.unique_dcs = False ;
01340      REPORT_PROGRESS("[-unique off]") ;
01341    }
01342 
01343    
01344    
01345    
01346 
01347 #if 0
01348    (void) XtAppAddWorkProc( MAIN_app, MAIN_workprocess, NULL ) ;
01349 #else
01350    PLUTO_register_workproc( MAIN_workprocess , NULL ) ;
01351 #endif
01352 
01353    MCW_disable_help() ;
01354 
01355 STATUS("start XtAppMainLoop") ;
01356 
01357    XtAppMainLoop(MAIN_app) ;
01358    exit(0) ;
01359 }
01360 
01361 #undef HUBERIZE
01362 #ifdef HUBERIZE
01363 #include "huber.c"
01364 #endif
01365 
01366 
01367 
01368 
01369 
01370 
01371 #define REFRESH XmUpdateDisplay(MAIN_im3d->vwid->top_shell)
01372 
01373 static Boolean MAIN_workprocess( XtPointer fred )
01374 {
01375    static int MAIN_calls = 0 ;  
01376    static int nosplash = 0 , nodown = 0 ;
01377    static double eltime=0.0 , max_splash=2.0 ;
01378    int ii ;
01379 
01380 ENTRY("MAIN_workprocess") ;  
01381 
01382 if(PRINT_TRACING){ char str[256]; sprintf(str,"MAIN_calls=%d",MAIN_calls); STATUS(str); }
01383 
01384    switch( MAIN_calls ){
01385 
01386       
01387 
01388 
01389 
01390       default:{
01391 STATUS("default call") ;
01392 
01393          if( nosplash || nodown ) RETURN(True) ;
01394          if( !nodown &&
01395              COX_clock_time()-eltime >= max_splash ){ AFNI_splashdown(); RETURN(True); }
01396       }
01397       break ;
01398 
01399       
01400 
01401 
01402 
01403       case 0:{
01404 STATUS("call 0") ;
01405 
01406 #ifdef NO_FRIVOLITIES
01407         nosplash = 1 ;
01408 #else
01409         nosplash = AFNI_yesenv("AFNI_NOSPLASH") ;
01410 #endif
01411         if( !nosplash ){
01412           char * hh ;
01413           AFNI_splashup() ; eltime = COX_clock_time() ;
01414           hh = getenv("AFNI_SPLASHTIME") ;
01415           if( hh != NULL ) max_splash = strtod(hh,NULL) ;
01416         }
01417       }
01418       break ;
01419 
01420       
01421 
01422       case 1:
01423         AFNI_speak("[[volm 0.65; inpt PHON; rate -10; pbas +5]]1AEf=nnnIY",0) ;  
01424 
01425       case 2:
01426       case 3:
01427       case 4:
01428       case 5:
01429       case 6:
01430       case 7:
01431       case 8:
01432       case 9:
01433       case 10:
01434 STATUS("sleep call") ;
01435         if( !nosplash) iochan_sleep(1) ; 
01436       break ;
01437 
01438       
01439 
01440 
01441 
01442       case 11:{
01443 
01444         int do_images ;                           
01445 
01446 STATUS("call 11") ;
01447 
01448         REPORT_PROGRESS(". Widgets") ;
01449 
01450         MCW_enable_help() ;
01451 
01452         do_images = GLOBAL_argopt.read_images ;
01453 
01454         MAIN_im3d = new_AFNI_controller( MAIN_shell , MAIN_dc ,
01455                                          do_images ? AFNI_IMAGES_VIEW
01456                                                    : AFNI_3DDATA_VIEW ) ;
01457 
01458         GLOBAL_library.controllers[0] = MAIN_im3d ;
01459 
01460         REPORT_PROGRESS(".") ;
01461 
01462         
01463 
01464         XtVaSetValues( XmGetXmDisplay(XtDisplay(MAIN_im3d->vwid->top_shell)) ,
01465                           XmNdragInitiatorProtocolStyle , XmDRAG_NONE ,
01466                           XmNdragReceiverProtocolStyle  , XmDRAG_NONE ,
01467                        NULL ) ;
01468       }
01469       break ;
01470 
01471       
01472 
01473 
01474 
01475       case 12:{
01476 
01477 STATUS("call 12") ;
01478 
01479         REPORT_PROGRESS(". Input files:") ;
01480 
01481         AFNI_read_inputs( MAIN_argc , MAIN_argv ) ;
01482 
01483         if( GLOBAL_library.have_dummy_dataset && MAIN_im3d->type == AFNI_3DDATA_VIEW ){
01484           XtSetSensitive( MAIN_im3d->vwid->prog->clone_pb , False ) ;
01485           MAIN_im3d->dummied = 1 ;  
01486         }
01487       }
01488       break ;
01489 
01490       
01491 
01492 
01493 
01494       case 13:{
01495 
01496 STATUS("call 13") ;
01497 
01498         GLOBAL_library.registered_0D.num = 0 ;               
01499         GLOBAL_library.registered_1D.num = 0 ;               
01500         GLOBAL_library.registered_2D.num = 0 ;               
01501 
01502         GLOBAL_library.registered_fim.num = 0 ;              
01503 
01504         GLOBAL_library.registered_slice_proj.num = 0 ;       
01505 
01506         
01507 
01508         AFNI_register_0D_function( "Log10" , log10_func ) ;
01509         AFNI_register_0D_function( "SSqrt" , ssqrt_func ) ;
01510 
01511         AFNI_register_1D_function( "Median3" , median3_func) ;
01512         AFNI_register_1D_function( "OSfilt3" , osfilt3_func) ;
01513         AFNI_register_1D_function( "|FFT()|" , absfft_func ) ;
01514 
01515         AFNI_register_2D_function( "Median9" , median9_box_func ) ;
01516         AFNI_register_2D_function( "Winsor9" , winsor9_box_func ) ;
01517         AFNI_register_2D_function( "OSfilt9" , osfilt9_box_func ) ;
01518 
01519         AFNI_register_2D_function( "Median21", median21_box_func );
01520         AFNI_register_2D_function( "Winsor21", winsor21_box_func );
01521 
01522         AFNI_register_2D_function( "|FFT2D|", fft2D_func );
01523 
01524         
01525 
01526         AFNI_register_fimfunc("Spearman CC",1,(generic_func *)spearman_fimfunc,NULL);
01527         AFNI_register_fimfunc("Quadrant CC",1,(generic_func *)quadrant_fimfunc,NULL);
01528 
01529         
01530 
01531         AFNI_register_slice_proj( "Minimum" , min_proj   ) ;
01532         AFNI_register_slice_proj( "Maximum" , max_proj   ) ;
01533         AFNI_register_slice_proj( "Mean"    , mean_proj  ) ;
01534 
01535         AFNI_register_slice_proj( "Median"  , qmed_float ) ; 
01536 
01537         AFNI_register_slice_proj( "Extreme" , extreme_proj ) ; 
01538 
01539 #ifdef HUBERIZE
01540         AFNI_register_1D_funcstr( "Huber Fit" , huber_func ) ;
01541 #endif
01542 
01543 
01544 
01545 #ifdef ALLOW_PLUGINS
01546         if( MAIN_im3d->type == AFNI_3DDATA_VIEW ){
01547           int nplug = 0 ;
01548           char str[128] ;
01549 
01550           if( ! GLOBAL_argopt.noplugins ){
01551 STATUS("initialize plugins") ;
01552             GLOBAL_library.plugins = PLUG_get_many_plugins( MAIN_argv[0] ) ;
01553             AFNI_plugin_button( MAIN_im3d ) ;
01554           }
01555 
01556           if( GLOBAL_library.plugins != NULL ) nplug = GLOBAL_library.plugins->num ;
01557           sprintf(str,"\n Plugins       = %d libraries read",nplug) ;
01558           REPORT_PROGRESS(str) ;
01559           if( nplug == 0 && ! GLOBAL_argopt.noplugins )  
01560             REPORT_PROGRESS(
01561                       "\n ** Your Unix path must include the AFNI binary directory"
01562                       "\n ** OR you must setenv AFNI_PLUGINPATH to that directory!");
01563 
01564 
01565 
01566           if( !GLOBAL_argopt.noplugouts ){  
01567             AFNI_init_plugouts() ;
01568             if( MAIN_im3d->vwid->dmode->misc_plugout_pb != NULL ) 
01569               XtSetSensitive(MAIN_im3d->vwid->dmode->misc_plugout_pb,False) ;
01570             REPORT_PROGRESS("\n Plugouts      = listening for connections") ;
01571           }
01572         }
01573 #endif
01574 
01575       }
01576       break ;
01577 
01578       
01579 
01580 
01581 
01582       case 14:{
01583 
01584 STATUS("call 14") ;
01585 
01586         OPEN_CONTROLLER( MAIN_im3d ) ;
01587 
01588         AFNI_initialize_controller( MAIN_im3d ) ;  
01589         AFNI_initialize_view( NULL , MAIN_im3d ) ; 
01590 
01591         
01592 
01593         MCW_help_CB( MAIN_im3d->vwid->top_shell,NULL,NULL ); 
01594 
01595         { char str[64] ;
01596           sprintf(str,"\n -orient       = %s", GLOBAL_library.cord.orcode ) ;
01597           REPORT_PROGRESS(str) ;
01598         }
01599 
01600         
01601 
01602         GLOBAL_library.hints_on = !AFNI_noenv("AFNI_HINTS") ;
01603         if( !GLOBAL_library.hints_on ) MCW_hint_toggle() ;
01604 
01605         if( MAIN_im3d->vwid->dmode->misc_hints_pb != NULL )
01606            MCW_set_bbox( MAIN_im3d->vwid->dmode->misc_hints_bbox ,
01607                          GLOBAL_library.hints_on ) ;
01608 
01609         
01610         
01611 
01612         ii = THD_enviro_write_compression() ;
01613         if( ii >= 0 && ii <= COMPRESS_LASTCODE ){
01614            char str[64] ;
01615            sprintf(str,"\n write compress= %s", COMPRESS_enviro[ii]) ;
01616            REPORT_PROGRESS(str) ;
01617         }
01618 
01619         if( ALLOW_real_time > 0 )
01620            REPORT_PROGRESS("\nRT: realtime plugin is active") ;
01621 
01622         
01623 
01624 
01625         if( GLOBAL_argopt.layout_fname != NULL &&
01626             MAIN_im3d->type == AFNI_3DDATA_VIEW   ){
01627 
01628           (void) XtAppAddTimeOut( MAIN_app , 123 ,
01629                                   AFNI_startup_layout_CB , GLOBAL_argopt.layout_fname ) ;
01630 
01631           nodown = 1 ;  
01632         }
01633 
01634         
01635 
01636 
01637         if( GLOBAL_argopt.script_fname != NULL &&
01638             MAIN_im3d->type == AFNI_3DDATA_VIEW   ){
01639 
01640           (void) XtAppAddTimeOut( MAIN_app , 246 ,
01641                                   AFNI_startup_script_CB , GLOBAL_argopt.script_fname ) ;
01642         }
01643 
01644         
01645 
01646 
01647         PICTURE_ON(MAIN_im3d) ;
01648         (void) XtAppAddTimeOut( MAIN_app, 1234, AFNI_startup_timeout_CB, MAIN_im3d ) ;
01649 
01650         (void) TRUST_host(NULL) ; 
01651 
01652         
01653 
01654         { char *eee = getenv( "AFNI_FIM_IDEAL" ) ;
01655           static MRI_IMAGE *tsim ;
01656           tsim = mri_read_1D( eee ) ;
01657           if( tsim != NULL ){
01658             float *far = MRI_FLOAT_PTR(tsim) ; int ii ; char *tname ;
01659             for( ii=0 ; ii < tsim->nvox ; ii++ )
01660                if( fabs(far[ii]) >= 33333.0 ) far[ii] = WAY_BIG ;
01661             tname = THD_trailname(eee,1) ;
01662             mri_add_name( tname , tsim ) ;
01663             AFNI_fimmer_setref( MAIN_im3d , tsim ) ;
01664           }
01665         }
01666 
01667         REPORT_PROGRESS("\n") ;
01668       }
01669       break ;
01670 
01671       
01672 #if 0
01673       case 15:{  
01674 STATUS("call 15") ;
01675       }
01676       break ;
01677 #endif
01678    }
01679 
01680    MAIN_calls++ ; RETURN(False) ;
01681 }
01682 
01683 
01684 
01685 void FatalError(char * str)
01686 {
01687    fprintf(stderr,"\n**** Fatal Error ****\n %s\n",str) ;
01688    sleep(1) ; exit(1) ;
01689 }
01690 
01691 
01692 
01693 static char * random_goodbye(void)
01694 {
01695    static char *bye[] = { "[[volm 0.64]] Farewell",
01696                           "[[volm 0.64]] Goodbye" ,
01697                           "[[volm 0.64]] Until next time" } ;
01698    int nn = sizeof(bye)/sizeof(char *) ;
01699    return bye[ lrand48() % nn ] ;
01700 }
01701 
01702 
01703 
01704 
01705 
01706 
01707 void AFNI_quit_CB( Widget wcall , XtPointer cd , XtPointer cbs )
01708 {
01709    Three_D_View * im3d = (Three_D_View *) cd ;
01710    XmPushButtonCallbackStruct * pbcbs = (XmPushButtonCallbackStruct *) cbs ;
01711 
01712 ENTRY("AFNI_quit_CB") ;
01713 
01714    if( ! IM3D_OPEN(im3d) ) EXRETURN ;
01715 
01716    
01717 
01718    if( wcall == NULL ){
01719       if( im3d->vwid->prog->quit_first == False ){
01720          MCW_set_widget_label( im3d->vwid->prog->quit_pb , "done " ) ;
01721          im3d->vwid->prog->quit_first = True ;
01722          if( im3d->vwid->picture != NULL && !GLOBAL_argopt.keep_logo )
01723            PICTURE_OFF( im3d ) ;
01724       }
01725       EXRETURN ;
01726    }
01727 
01728    
01729 
01730    if( pbcbs != NULL                       &&
01731        pbcbs->event != NULL                &&
01732        pbcbs->event->type == ButtonRelease &&
01733        ((XButtonEvent *)(pbcbs->event))->state &  
01734        (ShiftMask|ControlMask|Button2Mask|Button3Mask) ){
01735 
01736       XtCloseDisplay( XtDisplay(im3d->vwid->top_shell) ) ;
01737       AFNI_speak(random_goodbye(),0) ;
01738       exit(0) ;
01739    }
01740 
01741    
01742 
01743    if( wcall == im3d->vwid->prog->quit_pb && im3d->vwid->prog->quit_first ){
01744       MCW_set_widget_label( im3d->vwid->prog->quit_pb , "DONE " ) ;
01745       im3d->vwid->prog->quit_first = False ;
01746       if( im3d->vwid->picture != NULL ) PICTURE_ON( im3d ) ;
01747 
01748       
01749 
01750       (void) XtAppAddTimeOut(
01751                XtWidgetToApplicationContext(im3d->vwid->prog->quit_pb) ,
01752                5000 , AFNI_quit_timeout_CB , im3d ) ;
01753 
01754       EXRETURN ;
01755    }
01756 
01757    
01758 
01759    
01760 
01761    if( AFNI_count_controllers() <= 1 ){
01762       XtCloseDisplay( XtDisplay(im3d->vwid->top_shell) ) ;
01763       AFNI_speak(random_goodbye(),0) ;
01764       STATUS("calling exit(0) -- farewell cruel world!") ;
01765       exit(0) ;
01766 
01767    } else {  
01768 
01769       CLOSE_CONTROLLER(im3d) ;     
01770       AFNI_controller_clonify() ;  
01771    }
01772    EXRETURN ;
01773 }
01774 
01775 
01776 
01777 
01778 
01779 
01780 void AFNI_quit_timeout_CB( XtPointer client_data , XtIntervalId * id )
01781 {
01782    Three_D_View * im3d = (Three_D_View *) client_data ;
01783 ENTRY("AFNI_quit_timeout_CB") ;
01784    RESET_AFNI_QUIT(im3d) ;
01785    EXRETURN ;
01786 }
01787 
01788 
01789 
01790 
01791 
01792 
01793 
01794 
01795 
01796 void AFNI_startup_timeout_CB( XtPointer client_data , XtIntervalId * id )
01797 {
01798    Three_D_View * im3d = (Three_D_View *) client_data ;
01799    int vv ;
01800 
01801 ENTRY("AFNI_startup_timeout_CB") ;
01802 
01803    
01804 
01805    MCW_help_CB(NULL,NULL,NULL) ;
01806 
01807    
01808 
01809    if( MAIN_im3d->type == AFNI_3DDATA_VIEW && GLOBAL_argopt.yes_niml ){
01810      AFNI_init_niml() ;
01811      XtSetSensitive(MAIN_im3d->vwid->dmode->misc_niml_pb,False) ;
01812    } else if( GLOBAL_argopt.port_niml > 0 ){  
01813      fprintf(stderr,"*** WARNING: -np was given, but NIML is turned off.\n") ;
01814    }
01815 
01816    if( !AFNI_noenv("AFNI_STARTUP_WARNINGS") ){  
01817 
01818 #ifdef LESSTIF_VERSION 
01819 
01820     (void) MCW_popup_message( MAIN_im3d->vwid->picture ,
01821                                  " \n"
01822                                  "*** WARNING:                ***\n"
01823                                  "*** This  copy of AFNI  was ***\n"
01824                                  "*** built using the LessTif ***\n"
01825                                  "*** library.  You will find ***\n"
01826                                  "*** problems;  AFNI is best ***\n"
01827                                  "*** when built using  Motif ***\n"
01828                                  "*** or OpenMotif!           ***\n" ,
01829                               MCW_USER_KILL | MCW_TIMER_KILL ) ;
01830 #endif
01831 
01832 #ifdef BAD_BUTTON3_POPUPS 
01833 
01834     (void) MCW_popup_message( MAIN_im3d->vwid->imag->topper,
01835                               " \n"
01836                               "*** WARNING:                  ***\n"
01837                               "*** This computer system has  ***\n"
01838                               "*** a bug with Button-3 popup ***\n"
01839                               "*** menus -- to use a button  ***\n"
01840                               "*** on such a menu, you have  ***\n"
01841                               "*** to keep Button-3 pressed  ***\n"
01842                               "*** down and then click the   ***\n"
01843                               "*** menu button with Button-1 ***\n"
01844                               "*** at the same time.         ***\n" ,
01845                               MCW_USER_KILL | MCW_TIMER_KILL ) ;
01846 #endif
01847    }
01848 
01849    
01850 
01851    vv = AFNI_version_check() ; 
01852 
01853    if( vv && vers_pixmap != XmUNSPECIFIED_PIXMAP ){     
01854      int pp ;
01855      for( pp=0 ; pp < 19 ; pp++ ){   
01856        PICTURE_SET(im3d,vers_pixmap) ;
01857          XmUpdateDisplay(im3d->vwid->top_shell); iochan_sleep(166);
01858        PICTURE_OFF(im3d) ;
01859          XmUpdateDisplay(im3d->vwid->top_shell); iochan_sleep(166);
01860      }
01861      logo_pixmap = vers_pixmap ;     
01862    }
01863 
01864 #ifdef SHSTRING
01865    if( vv ){  
01866      char *sname = AFNI_make_update_script() ;
01867 
01868      if( sname != NULL ){
01869        char *cpt , *ddd ; int nn ;
01870        ddd = strdup(sname) ; cpt = THD_trailname(ddd,0) ; *cpt = '\0' ;
01871        cpt = THD_trailname(sname,0) ;
01872        fprintf(stderr,
01873                "\n"
01874                "*===================================================\n"
01875                "* A script to update AFNI binaries has been created.\n"
01876                "* To use it, quit AFNI now, then try the commands\n"
01877                "pushd %s\n"
01878                "source %s\n"
01879                "popd\n"
01880                "*===================================================\n" ,
01881                ddd , cpt ) ;
01882        free((void *)ddd) ;
01883        nn = THD_freemegabytes(sname) ;
01884        if( nn >= 0 && nn <= 300 ){
01885          fprintf(stderr,
01886                "* HOWEVER: you only have %d Mbytes free, which won't\n"
01887                "*          won't be enough to download and install\n"
01888                "*          the updated set of AFNI binaries!\n"
01889                "*===================================================\n" ,
01890                nn ) ;
01891        }
01892      } else {
01893        fprintf(stderr,
01894                "\n"
01895                "*==================================================\n"
01896                "* Can't create script for updating AFNI\n"
01897                "*   binaries in your AFNI directory.\n"
01898                "* You'll have to get your sysadmin to help, or\n"
01899                "*   do it yourself.  AFNI can be downloaded from\n"
01900                "*     http://afni.nimh.nih.gov/afni/download   *OR*\n"
01901                "*     ftp://afni.nimh.nih.gov/tgz\n"
01902                "*   You want file " SHSTRING ".tgz\n"
01903                "*==================================================\n" ) ;
01904      }
01905    }
01906 #endif
01907 
01908    
01909 
01910    SHOW_AFNI_READY ;
01911    RESET_AFNI_QUIT(im3d) ;
01912    PICTURE_OFF(im3d) ;
01913 
01914    
01915 
01916    for( vv=0 ; vv < COM_num ; vv++ ) AFNI_driver( COM_com[vv] ) ;
01917 
01918    MPROBE ;                       
01919    EXRETURN ;
01920 }
01921 
01922 
01923 
01924 
01925 
01926 
01927 XtPointer AFNI_brick_to_mri( int n , int type , FD_brick * br )
01928 {
01929    MRI_IMAGE * im ;
01930    MCW_imseq_status * stat ;
01931    int i1,i2,jb,bb , dd1,dd2,tt1,tt2 ;
01932 
01933 ENTRY("AFNI_brick_to_mri") ;
01934 
01935 if(PRINT_TRACING){ char str[256] ; sprintf(str,"n=%d type=%d",n,type) ; STATUS(str) ; }
01936 
01937    
01938    
01939 
01940    if( type == graCR_getstatus ){
01941       MCW_grapher_status * grstat = myXtNew( MCW_grapher_status ) ;
01942 
01943       grstat->num_total  = grstat->num_series = br->dset->dblk->nvals ;
01944       grstat->nx         = br->n1 ;
01945       grstat->ny         = br->n2 ;
01946       grstat->nz         = br->n3 ;
01947 
01948       grstat->send_CB    = AFNI_gra_send_CB ;
01949       grstat->parent     = (XtPointer) br ;
01950       grstat->aux        = NULL ;
01951 
01952       grstat->transforms0D = & (GLOBAL_library.registered_0D) ;
01953       grstat->transforms1D = & (GLOBAL_library.registered_1D) ;
01954 
01955       strcpy( grstat->namecode , br->namecode ) ;
01956 
01957       RETURN( (XtPointer) grstat ) ;
01958    }
01959 
01960    if( type == graCR_getseries ){
01961       im = FD_brick_to_series( n , br ) ;
01962       RETURN( (XtPointer) im ) ;
01963    }
01964 
01965    
01966    
01967 
01968    if( n < 0 || n >= br->n3 ) RETURN(NULL) ;
01969 
01970    
01971 
01972    if( type == isqCR_getoverlay  ){
01973       Three_D_View * im3d = (Three_D_View *) br->parent ;
01974 
01975 STATUS("get overlay") ;
01976 
01977       im = AFNI_overlay( n , br ) ;
01978       if( !AFNI_noenv("AFNI_VALUE_LABEL") ) AFNI_do_bkgd_lab( im3d ) ;
01979       RETURN( (XtPointer) im ) ;
01980    }
01981 
01982    
01983 
01984    if( type == isqCR_getstatus ){
01985 
01986 STATUS("get status") ;
01987 
01988       stat = myXtNew( MCW_imseq_status ) ;
01989 
01990       stat->num_total  = br->n3 ;
01991       stat->num_series = br->n3 ;
01992       stat->send_CB    = AFNI_seq_send_CB ;
01993       stat->parent     = (XtPointer) br ;
01994       stat->aux        = NULL ;
01995 
01996       stat->transforms0D = & (GLOBAL_library.registered_0D) ;
01997       stat->transforms2D = & (GLOBAL_library.registered_2D) ;
01998       stat->slice_proj   = & (GLOBAL_library.registered_slice_proj) ;
01999 
02000       RETURN( (XtPointer) stat ) ;
02001    }
02002 
02003    
02004    
02005 
02006 #define RX 0.2
02007    if( type == isqCR_getmemplot ){
02008      Three_D_View *im3d = (Three_D_View *) br->parent ;
02009      int do_xhar=(im3d->vinfo->crosshair_visible && AFNI_yesenv("AFNI_CROSSHAIR_LINES"));
02010      int do_surf;
02011      MEM_plotdata *mp ;
02012      AFNI_surface_widgets *swid = im3d->vwid->view->swid ;  
02013      THD_session *suss=im3d->ss_now ;                       
02014      THD_dataxes *daxes=CURRENT_DAXES(br->dset) ;
02015 
02016      if( !IM3D_OPEN(im3d) )     RETURN(NULL) ;
02017 
02018      
02019 
02020      do_surf = SUMA_ENABLED && SESSION_HAS_SUMA(suss) ;
02021      if( !do_surf && !do_xhar ) RETURN(NULL) ;  
02022 
02023      
02024 
02025 STATUS("creating memplot for image overlay") ;
02026      create_memplot_surely( "SUMA_plot" , 1.0 ) ;
02027      mp = get_active_memplot() ;
02028 
02029      
02030 
02031     if( do_surf ){
02032      int ks ;
02033      int kbest=-1 , ibest=-1 ;          
02034 
02035      AFNI_get_xhair_node( im3d , &kbest , &ibest ) ;   
02036 
02037      for( ks=0 ; ks < suss->su_num ; ks++ ){  
02038       SUMA_surface *ag = suss->su_surf[ks] ;
02039       int nn , ii,jj ;
02040       SUMA_ixyz *nod ;
02041       THD_ivec3 iv,ivp,ivm ;
02042       THD_fvec3 fv,fvp,fvm ;
02043       float s1=1.0/br->n1 , s2=1.0/br->n2 , dxyz ;
02044       float rr_box=1.0,gg_box=0.0,bb_box=0.0 ;   
02045       float rr_lin=0.4,gg_lin=0.0,bb_lin=0.7 ;   
02046       float rr_led=1.0,gg_led=0.0,bb_led=0.0 ;
02047       char str[32] , *eee ;
02048       float rx=RX ;         
02049       int   kkk=0 ;
02050       float xyz=0.0,xyzp,xyzm , rxm,rxp ;
02051       int skip_boxes=1 , skip_lines=0 , skip_lcen=0, skip_ledg=1 ;
02052       float boxsize=RX , linewidth=0.0 ;      
02053       int firstb ;                            
02054 
02055       if( ag == NULL ) continue ;             
02056       nn = ag->num_ixyz ; nod = ag->ixyz ;
02057       if( nn < 1 || nod == NULL ) continue ;  
02058 
02059       
02060 
02061 STATUS("defining surface drawing parameters") ;
02062       if( swid != NULL && ks < swid->nrow ){     
02063         int cc, dd ;                             
02064                                                  
02065 
02066         cc = MCW_val_bbox(swid->surf_bbox[ks]) ; 
02067         if( cc == 0 ){
02068           skip_boxes = skip_lines = 1 ;
02069         } else {                                 
02070           cc = swid->surf_node_av[ks]->ival ;
02071           skip_boxes = (cc == 0) ;
02072           if( !skip_boxes ){
02073             rr_box = DCOV_REDBYTE(im3d->dc,cc)   / 255.0 ;
02074             gg_box = DCOV_GREENBYTE(im3d->dc,cc) / 255.0 ;
02075             bb_box = DCOV_BLUEBYTE(im3d->dc,cc)  / 255.0 ;
02076           }
02077           cc = swid->surf_line_av[ks]->ival ;
02078           dd = swid->surf_ledg_av[ks]->ival ;             
02079           skip_lcen  = (cc == 0) ;
02080           skip_ledg  = (dd == 0) ;
02081           skip_lines = (skip_lcen && skip_ledg) ;
02082           if( cc > 0 ){
02083             rr_lin = DCOV_REDBYTE(im3d->dc,cc)   / 255.0 ;
02084             gg_lin = DCOV_GREENBYTE(im3d->dc,cc) / 255.0 ;
02085             bb_lin = DCOV_BLUEBYTE(im3d->dc,cc)  / 255.0 ;
02086           }
02087           if( dd > 0 ){                                   
02088             rr_led = DCOV_REDBYTE(im3d->dc,dd)   / 255.0 ;
02089             gg_led = DCOV_GREENBYTE(im3d->dc,dd) / 255.0 ;
02090             bb_led = DCOV_BLUEBYTE(im3d->dc,dd)  / 255.0 ;
02091           }
02092           boxsize   = swid->boxsize_av->ival   * 0.1   ;  
02093           linewidth = swid->linewidth_av->ival * 0.002 ;
02094         }
02095 
02096       } else {                                   
02097                                                  
02098         eee = getenv("AFNI_SUMA_BOXCOLOR") ;     
02099         if( eee != NULL ){
02100           if( strcmp(eee,"none") == 0 || strcmp(eee,"skip") == 0 )
02101             skip_boxes = 1 ;                  
02102           else
02103             DC_parse_color( im3d->dc , eee , &rr_box,&gg_box,&bb_box ) ;
02104         }
02105 
02106         eee = getenv("AFNI_SUMA_LINECOLOR") ;
02107         if( eee != NULL ){
02108           if( (strcmp(eee,"none")==0 || strcmp(eee,"skip")==0) )
02109             skip_lines = 1 ;
02110           else
02111             DC_parse_color( im3d->dc , eee , &rr_lin,&gg_lin,&bb_lin ) ;
02112         }
02113 
02114         eee = getenv("AFNI_SUMA_BOXSIZE") ;  
02115         if( eee != NULL ){
02116           float val=strtod(eee,NULL) ;
02117           if( val > 0.0 ) boxsize = val ;
02118         } else if( swid != NULL ){
02119           boxsize = swid->boxsize_av->ival * 0.1 ;
02120         }
02121 
02122         eee = getenv( "AFNI_SUMA_LINESIZE" ) ; 
02123         if( eee != NULL ){
02124           float val = strtod(eee,NULL) ;
02125           if( val < 0.0 || val > 0.1 ) val = 0.0 ;
02126           linewidth = val ;
02127         } else if( swid != NULL ){
02128           linewidth = swid->linewidth_av->ival * 0.002 ;
02129         }
02130       }
02131 
02132       if( skip_boxes && skip_lines ) continue ; 
02133 
02134 
02135 
02136 
02137 
02138 
02139 
02140 
02141 
02142 
02143 
02144 
02145 
02146 
02147 
02148 
02149 
02150 
02151       rx  = boxsize ;                
02152       rxm = rx-0.5 ; rxp = rx+0.5 ;  
02153 
02154       
02155 
02156       LOAD_IVEC3(iv,0,0,n+1) ;                     
02157       ivp = THD_fdind_to_3dind( br , iv ) ;
02158       fvp = THD_3dind_to_3dmm ( br->dset , ivp ) ;
02159       fvp = THD_3dmm_to_dicomm( br->dset , fvp ) ;
02160       LOAD_IVEC3(iv,0,0,n-1) ;                     
02161       ivm = THD_fdind_to_3dind( br , iv ) ;
02162       fvm = THD_3dind_to_3dmm ( br->dset , ivm ) ;
02163       fvm = THD_3dmm_to_dicomm( br->dset , fvm ) ;
02164 
02165       
02166 
02167       dxyz = MIN(br->del1,br->del2) ;
02168       dxyz = MIN(dxyz    ,br->del3) ; dxyz *= 0.1 ;
02169 
02170       set_color_memplot(rr_box,gg_box,bb_box) ;  
02171       set_thick_memplot(0.0) ;
02172       firstb = 1 ;                               
02173 
02174       
02175 
02176       if( skip_boxes ) STATUS("finding slice planes") ;
02177       else             STATUS("drawing node boxes") ;
02178 
02179       if( fabs(fvm.xyz[0]-fvp.xyz[0]) > dxyz ){               
02180          float xb=fvm.xyz[0] , xt=fvp.xyz[0] , xm,xw ;        
02181          if( xb > xt ){ float t=xb ; xb=xt ; xt=t ; }         
02182          xm = 0.5*(xb+xt); xw = 0.25*(xt-xb); xb = xm-xw; xt = xm+xw;
02183 STATUS(" - x plane") ;
02184          if( !skip_boxes ){
02185           for( ii=0 ; ii < nn ; ii++ ){
02186             if( nod[ii].x >= xb && nod[ii].x <= xt ){         
02187                LOAD_FVEC3(fv,nod[ii].x,nod[ii].y,nod[ii].z) ; 
02188                fv = THD_dicomm_to_3dmm( br->dset , fv ) ;     
02189                fv = THD_3dmm_to_3dfind( br->dset , fv ) ;     
02190                fv = THD_3dfind_to_fdfind( br , fv ) ;         
02191 
02192                if( firstb ){
02193                  plotline_memplot( s1*(fv.xyz[0]-rxm), 1.0-s2*(fv.xyz[1]-rxm),
02194                                    s1*(fv.xyz[0]+rxp), 1.0-s2*(fv.xyz[1]+rxp)  );
02195                  firstb = 0 ;
02196                }
02197 
02198                plotrect_memplot( s1*(fv.xyz[0]-rxm), 1.0-s2*(fv.xyz[1]-rxm),
02199                                  s1*(fv.xyz[0]+rxp), 1.0-s2*(fv.xyz[1]+rxp)  ) ;
02200 
02201                if( ks == kbest && nod[ii].id == ibest ){   
02202                  plotline_memplot( s1*(fv.xyz[0]-rxm), 1.0-s2*(fv.xyz[1]-rxm),
02203                                    s1*(fv.xyz[0]+rxp), 1.0-s2*(fv.xyz[1]+rxp)  );
02204                  plotline_memplot( s1*(fv.xyz[0]-rxm), 1.0-s2*(fv.xyz[1]+rxp),
02205                                    s1*(fv.xyz[0]+rxp), 1.0-s2*(fv.xyz[1]-rxm)  );
02206                  plotline_memplot( s1*(fv.xyz[0]-rxm), 1.0-s2*(fv.xyz[1]+0.5),
02207                                    s1*(fv.xyz[0]+rxp), 1.0-s2*(fv.xyz[1]+0.5)  );
02208                  plotline_memplot( s1*(fv.xyz[0]+0.5), 1.0-s2*(fv.xyz[1]-rxm),
02209                                    s1*(fv.xyz[0]+0.5), 1.0-s2*(fv.xyz[1]+rxp)  );
02210                }
02211             }
02212           }
02213          }
02214          kkk = 0; xyz = xm; xyzp = xt; xyzm = xb;  
02215       }
02216       else if( fabs(fvm.xyz[1]-fvp.xyz[1]) > dxyz ){          
02217          float yb=fvm.xyz[1] , yt=fvp.xyz[1] , ym,yw ;
02218          if( yb > yt ){ float t=yb ; yb=yt ; yt=t ; }
02219          ym = 0.5*(yb+yt); yw = 0.25*(yt-yb); yb = ym-yw; yt = ym+yw;
02220 STATUS(" - y plane") ;
02221          if( !skip_boxes ){
02222           for( ii=0 ; ii < nn ; ii++ ){
02223             if( nod[ii].y >= yb && nod[ii].y <= yt ){
02224                LOAD_FVEC3(fv,nod[ii].x,nod[ii].y,nod[ii].z) ;
02225                fv = THD_dicomm_to_3dmm( br->dset , fv ) ;
02226                fv = THD_3dmm_to_3dfind( br->dset , fv ) ;
02227                fv = THD_3dfind_to_fdfind( br , fv ) ;
02228 
02229                if( firstb ){
02230                  plotline_memplot( s1*(fv.xyz[0]-rxm), 1.0-s2*(fv.xyz[1]-rxm),
02231                                    s1*(fv.xyz[0]+rxp), 1.0-s2*(fv.xyz[1]+rxp)  );
02232                  firstb = 0 ;
02233                }
02234 
02235                plotrect_memplot( s1*(fv.xyz[0]-rxm), 1.0-s2*(fv.xyz[1]-rxm),
02236                                  s1*(fv.xyz[0]+rxp), 1.0-s2*(fv.xyz[1]+rxp)  ) ;
02237 
02238                if( ks == kbest && nod[ii].id == ibest ){   
02239                  plotline_memplot( s1*(fv.xyz[0]-rxm), 1.0-s2*(fv.xyz[1]-rxm),
02240                                    s1*(fv.xyz[0]+rxp), 1.0-s2*(fv.xyz[1]+rxp)  );
02241                  plotline_memplot( s1*(fv.xyz[0]-rxm), 1.0-s2*(fv.xyz[1]+rxp),
02242                                    s1*(fv.xyz[0]+rxp), 1.0-s2*(fv.xyz[1]-rxm)  );
02243                  plotline_memplot( s1*(fv.xyz[0]-rxm), 1.0-s2*(fv.xyz[1]+0.5),
02244                                    s1*(fv.xyz[0]+rxp), 1.0-s2*(fv.xyz[1]+0.5)  );
02245                  plotline_memplot( s1*(fv.xyz[0]+0.5), 1.0-s2*(fv.xyz[1]-rxm),
02246                                    s1*(fv.xyz[0]+0.5), 1.0-s2*(fv.xyz[1]+rxp)  );
02247                }
02248             }
02249           }
02250          }
02251          kkk = 1; xyz = ym; xyzp = yt; xyzm = yb;  
02252       }
02253       else if( fabs(fvm.xyz[2]-fvp.xyz[2]) > dxyz ){          
02254          float zb=fvm.xyz[2] , zt=fvp.xyz[2] , zm,zw ;
02255          if( zb > zt ){ float t=zb ; zb=zt ; zt=t ; }
02256          zm = 0.5*(zb+zt); zw = 0.25*(zt-zb); zb = zm-zw; zt = zm+zw;
02257 STATUS(" - z plane") ;
02258          if( !skip_boxes ){
02259           for( ii=0 ; ii < nn ; ii++ ){
02260             if( nod[ii].z >= zb && nod[ii].z <= zt ){
02261                LOAD_FVEC3(fv,nod[ii].x,nod[ii].y,nod[ii].z) ;
02262                fv = THD_dicomm_to_3dmm( br->dset , fv ) ;
02263                fv = THD_3dmm_to_3dfind( br->dset , fv ) ;
02264                fv = THD_3dfind_to_fdfind( br , fv ) ;
02265 
02266                if( firstb ){
02267                  plotline_memplot( s1*(fv.xyz[0]-rxm), 1.0-s2*(fv.xyz[1]-rxm),
02268                                    s1*(fv.xyz[0]+rxp), 1.0-s2*(fv.xyz[1]+rxp)  );
02269                  firstb = 0 ;
02270                }
02271 
02272                plotrect_memplot( s1*(fv.xyz[0]-rxm), 1.0-s2*(fv.xyz[1]-rxm),
02273                                  s1*(fv.xyz[0]+rxp), 1.0-s2*(fv.xyz[1]+rxp)  ) ;
02274 
02275                if( ks == kbest && nod[ii].id == ibest ){   
02276                  plotline_memplot( s1*(fv.xyz[0]-rxm), 1.0-s2*(fv.xyz[1]-rxm),
02277                                    s1*(fv.xyz[0]+rxp), 1.0-s2*(fv.xyz[1]+rxp)  );
02278                  plotline_memplot( s1*(fv.xyz[0]-rxm), 1.0-s2*(fv.xyz[1]+rxp),
02279                                    s1*(fv.xyz[0]+rxp), 1.0-s2*(fv.xyz[1]-rxm)  );
02280                  plotline_memplot( s1*(fv.xyz[0]-rxm), 1.0-s2*(fv.xyz[1]+0.5),
02281                                    s1*(fv.xyz[0]+rxp), 1.0-s2*(fv.xyz[1]+0.5)  );
02282                  plotline_memplot( s1*(fv.xyz[0]+0.5), 1.0-s2*(fv.xyz[1]-rxm),
02283                                    s1*(fv.xyz[0]+0.5), 1.0-s2*(fv.xyz[1]+rxp)  );
02284                }
02285             }
02286           }
02287          }
02288          kkk = 2; xyz = zm; xyzp = zt; xyzm = zb;  
02289       }
02290 
02291       
02292 
02293 
02294 
02295 
02296 
02297       if( !skip_lines && ag->num_ijk > 0 && ag->ijk != NULL ){
02298         SUMA_ijk *tr = ag->ijk ;        
02299         int      ntr = ag->num_ijk ;    
02300         int id,jd,kd ;
02301         THD_fvec3 fvijk[3] ;
02302         float ci,cj,ck , xlev ;
02303         int ilev ;
02304 
02305         for( ilev=0 ; ilev <= 2 ; ilev++ ){  
02306                                              
02307           if( ilev == 0 ){
02308             if( skip_lcen ) continue ;  
02309             xlev = xyz ;
02310             set_color_memplot(rr_lin,gg_lin,bb_lin) ;  
02311             set_thick_memplot(linewidth) ;
02312           } else {
02313             if( skip_ledg ) continue ;  
02314             xlev = (ilev == 1) ? xyzp : xyzm ;
02315             set_color_memplot(rr_led,gg_led,bb_led) ;
02316             set_thick_memplot(0.0) ;
02317           }
02318 
02319 STATUS("drawing triangle lines") ;
02320 
02321           
02322 
02323           for( ii=0 ; ii < ntr ; ii++ ){
02324 
02325             
02326 
02327             id = SUMA_find_node_id(ag,tr[ii].id); if( id < 0 ) continue;
02328             jd = SUMA_find_node_id(ag,tr[ii].jd); if( jd < 0 ) continue;
02329             kd = SUMA_find_node_id(ag,tr[ii].kd); if( kd < 0 ) continue;
02330 
02331             
02332 
02333             LOAD_FVEC3(fvijk[0], nod[id].x, nod[id].y, nod[id].z) ;
02334             LOAD_FVEC3(fvijk[1], nod[jd].x, nod[jd].y, nod[jd].z) ;
02335             LOAD_FVEC3(fvijk[2], nod[kd].x, nod[kd].y, nod[kd].z) ;
02336 
02337             
02338 
02339             ci = fvijk[0].xyz[kkk] - xlev;      
02340             cj = fvijk[1].xyz[kkk] - xlev;      
02341             ck = fvijk[2].xyz[kkk] - xlev;
02342             jj = 4*(ci > 0.0) + 2*(cj > 0.0) + (ck > 0.0) ;
02343             if( jj == 0 || jj == 7 ) continue ; 
02344 
02345             
02346 
02347 
02348             switch( jj ){
02349                case 6:
02350                case 1: id = 2 ; jd = 0 ; kd = 1 ; break ;  
02351                case 5:
02352                case 2: id = 1 ; jd = 0 ; kd = 2 ; break ;  
02353                case 4:
02354                case 3: id = 0 ; jd = 1 ; kd = 2 ; break ;  
02355             }
02356 
02357             
02358 
02359 
02360             ci = fvijk[id].xyz[kkk] - xlev;
02361             cj = fvijk[id].xyz[kkk] - fvijk[jd].xyz[kkk] ;
02362             if( cj == 0.0 ) continue ;            
02363             ck = ci / cj ;
02364             if( ck < 0.0 || ck > 1.0 ) continue ; 
02365             cj = 1.0 - ck ;
02366             fvp = SCLADD_FVEC3(cj,fvijk[id],ck,fvijk[jd]) ;
02367 
02368             
02369 
02370             cj = fvijk[id].xyz[kkk] - fvijk[kd].xyz[kkk] ;
02371             if( cj == 0.0 ) continue ;
02372             ck = ci / cj ;
02373             if( ck < 0.0 || ck > 1.0 ) continue ;
02374             cj = 1.0 - ck ;
02375             fvm = SCLADD_FVEC3(cj,fvijk[id],ck,fvijk[kd]) ;
02376 
02377             
02378 
02379             fvp = THD_dicomm_to_3dmm( br->dset , fvp ) ;
02380             if( fvp.xyz[0] < daxes->xxmin ||
02381                 fvp.xyz[0] > daxes->xxmax ||
02382                 fvp.xyz[1] < daxes->yymin ||
02383                 fvp.xyz[1] > daxes->yymax ||
02384                 fvp.xyz[2] < daxes->zzmin ||
02385                 fvp.xyz[2] > daxes->zzmax   ) continue ;  
02386             fvp = THD_3dmm_to_3dfind( br->dset , fvp ) ;
02387             fvp = THD_3dfind_to_fdfind( br , fvp ) ;
02388 
02389             fvm = THD_dicomm_to_3dmm( br->dset , fvm ) ;
02390             if( fvm.xyz[0] < daxes->xxmin ||
02391                 fvm.xyz[0] > daxes->xxmax ||
02392                 fvm.xyz[1] < daxes->yymin ||
02393                 fvm.xyz[1] > daxes->yymax ||
02394                 fvm.xyz[2] < daxes->zzmin ||
02395                 fvm.xyz[2] > daxes->zzmax   ) continue ;  
02396             fvm = THD_3dmm_to_3dfind( br->dset , fvm ) ;
02397             fvm = THD_3dfind_to_fdfind( br , fvm ) ;
02398 
02399             
02400             
02401 
02402             plotline_memplot( s1*(fvp.xyz[0]+0.5) , 1.0-s2*(fvp.xyz[1]+0.5) ,
02403                               s1*(fvm.xyz[0]+0.5) , 1.0-s2*(fvm.xyz[1]+0.5)  ) ;
02404 
02405           } 
02406           set_thick_memplot(0.0) ;              
02407         } 
02408       } 
02409      } 
02410     } 
02411 
02412      
02413      
02414 
02415      if( do_xhar ){
02416       MCW_grapher * grapher = UNDERLAY_TO_GRAPHER(im3d,br) ;
02417 
02418       THD_ivec3 ib = THD_3dind_to_fdind( br ,
02419                                          TEMP_IVEC3( im3d->vinfo->i1 ,
02420                                                      im3d->vinfo->j2 ,
02421                                                      im3d->vinfo->k3  ) ) ;
02422 STATUS("drawing crosshairs") ;
02423       set_thick_memplot(0.0) ;
02424 
02425       if( n == ib.ijk[2] || im3d->vinfo->xhairs_all ){
02426          int jp,ip , jcen,icen , gappp , jj,ii ;
02427          int idown,iup,iskip , jdown,jup,jskip , imon,jmon ;
02428          int a1 = br->a123.ijk[0] ,   
02429              ax = abs(a1) - 1       ; 
02430          int a2 = br->a123.ijk[1] ,   
02431              ay = abs(a2) - 1       ; 
02432          int a3 = br->a123.ijk[2] ,   
02433              az = abs(a3) - 1       ; 
02434 
02435          int gap,icr,jcr , nx=br->n1 , ny=br->n2 ;
02436 
02437          float rr,gg,bb ;             
02438          float s1=1.0/br->n1 , s2=1.0/br->n2 ;  
02439 #define PSX(i) (s1*((i)+0.5))
02440 #define PSY(j) (1.0-s2*((j)+0.5))
02441 
02442          
02443 
02444          int ox = (ax==0) ? br->dset->daxes->xxorient :
02445                   (ax==1) ? br->dset->daxes->yyorient : br->dset->daxes->zzorient ;
02446 
02447          int oy = (ay==0) ? br->dset->daxes->xxorient :
02448                   (ay==1) ? br->dset->daxes->yyorient : br->dset->daxes->zzorient ;
02449 
02450          jp = im3d->vinfo->crosshair_ovcolor ;
02451          rr = DCOV_REDBYTE  (im3d->dc,jp) / 255.0 ;
02452          gg = DCOV_GREENBYTE(im3d->dc,jp) / 255.0 ;
02453          bb = DCOV_BLUEBYTE (im3d->dc,jp) / 255.0 ;
02454          set_color_memplot(rr,gg,bb) ;
02455 
02456          gap  = (grapher==NULL) ? im3d->vinfo->crosshair_gap : (grapher->mat+1)/2 ;
02457 
02458          icen = ib.ijk[0] ;  
02459          jcen = ib.ijk[1] ;  
02460 
02461 
02462 
02463          if( im3d->vinfo->xhairs_show_montage ){           
02464             iskip = im3d->vinfo->xhairs_nskip.ijk[ax] + 1 ;
02465             jskip = im3d->vinfo->xhairs_nskip.ijk[ay] + 1 ;
02466             if( a1 > 0 ){
02467                idown = im3d->vinfo->xhairs_ndown.ijk[ax] ;
02468                iup   = im3d->vinfo->xhairs_nup.ijk[ax] ;
02469             } else {
02470                iup   = im3d->vinfo->xhairs_ndown.ijk[ax] ;
02471                idown = im3d->vinfo->xhairs_nup.ijk[ax] ;
02472             }
02473             if( a2 > 0 ){
02474                jdown = im3d->vinfo->xhairs_ndown.ijk[ay] ;
02475                jup   = im3d->vinfo->xhairs_nup.ijk[ay] ;
02476             } else {
02477                jup   = im3d->vinfo->xhairs_ndown.ijk[ay] ;
02478                jdown = im3d->vinfo->xhairs_nup.ijk[ay] ;
02479             }
02480 
02481          } else {                                          
02482            idown = iup = jdown = jup = iskip = jskip = 0 ;
02483            if( grapher != NULL ){ idown=-(iup+1); jdown=-(jup+1); } 
02484          }
02485 
02486          
02487 
02488          if( (im3d->vinfo->xhairs_orimask & (1<<oy)) != 0 ){
02489            for( imon=-idown ; imon <= iup ; imon++ ){
02490              icr = icen + imon * iskip ;
02491 
02492              if( im3d->vinfo->xhairs_periodic ){
02493                 while( icr < 0 )   icr += nx ;
02494                 while( icr >= nx ) icr -= nx ;
02495              } else {
02496                 if( icr < 0 || icr >= nx ) continue ;
02497              }
02498 
02499              gappp = (abs(icr-icen) <= gap) ? gap : -1 ; 
02500 
02501              if( gappp < 0 ){  
02502 
02503                 plotline_memplot( PSX(icr) , 0.0 , PSX(icr) , 1.0 ) ;
02504 
02505              } else {          
02506 
02507                 jj = jcen-gappp-1 ;
02508                 if( jj >= 0 )
02509                   plotline_memplot( PSX(icr) , 1.0 , PSX(icr) , PSY(jj+0.5) ) ;
02510 
02511                 jj = jcen+gappp+1 ;
02512                 if( jj < ny )
02513                   plotline_memplot( PSX(icr) , PSY(jj-0.5) , PSX(icr) , 0.0 ) ;
02514              }
02515 
02516            }
02517          }
02518 
02519          
02520 
02521          if( (im3d->vinfo->xhairs_orimask & (1<<ox)) != 0 ){  
02522            for( jmon=-jdown ; jmon <= jup ; jmon++ ){
02523              jcr = jcen + jmon * jskip ;
02524              if( im3d->vinfo->xhairs_periodic ){
02525                 while( jcr < 0 )   jcr += ny ;
02526                 while( jcr >= ny ) jcr -= ny ;
02527              } else {
02528                 if( jcr < 0 || jcr >= ny ) continue ;
02529              }
02530 
02531              gappp = (abs(jcr-jcen) <= gap) ? gap : -1 ; 
02532 
02533              if( gappp < 0 ){  
02534 
02535                 plotline_memplot( 0.0 , PSY(jcr) , 1.0 , PSY(jcr) ) ;
02536 
02537              } else {          
02538 
02539                 ii = icen-gappp-1 ;
02540                 if( ii >= 0 )
02541                   plotline_memplot( 0.0 , PSY(jcr) , PSX(ii+0.5) , PSY(jcr) ) ;
02542 
02543                 ii = icen+gappp+1 ;
02544                 if( ii < nx )
02545                   plotline_memplot( PSX(ii-0.5) , PSY(jcr) , 1.0 , PSY(jcr) ) ;
02546              }
02547            }
02548          }
02549 
02550          
02551 
02552          if( grapher != NULL ){
02553             int gs = gap , gb = (grapher->mat +2)/2 ;
02554 
02555             jcr = jcen ; icr = icen ;
02556 
02557             ip = icr - gb ; if( ip < 0   ) ip = 0 ;
02558             ii = icr + gs ; if( ii >= nx ) ii = nx-1 ;
02559 
02560             jp = jcr - gb ; if( jp <  0  ) jp = 0 ;
02561             jj = jcr + gs ; if( jj >= ny ) jj = ny-1 ;
02562 
02563             plotline_memplot( PSX(ip+0.5),PSY(jp+0.5) , PSX(ii-0.5),PSY(jp+0.5) ) ;
02564             plotline_memplot( PSX(ii-0.5),PSY(jp+0.5) , PSX(ii-0.5),PSY(jj-0.5) ) ;
02565             plotline_memplot( PSX(ii-0.5),PSY(jj-0.5) , PSX(ip+0.5),PSY(jj-0.5) ) ;
02566             plotline_memplot( PSX(ip+0.5),PSY(jj-0.5) , PSX(ip+0.5),PSY(jp+0.5) ) ;
02567 
02568          } 
02569 
02570       } 
02571      } 
02572 
02573      
02574 
02575      if( MEMPLOT_NLINE(mp) < 1 ) DESTROY_MEMPLOT(mp) ;
02576 
02577      RETURN(mp) ; 
02578    }
02579 
02580    
02581 
02582    if( type == isqCR_getlabel ){
02583       Three_D_View * im3d = (Three_D_View *) br->parent ;
02584       char *lab , str[32] , *dd ;
02585       THD_ivec3 iv,ivp,ivm ;
02586       THD_fvec3 fv,fvp,fvm ;
02587       float dxyz , cc ;
02588       int ii ;
02589 
02590       if( im3d->type != AFNI_3DDATA_VIEW ) RETURN(NULL) ;
02591 
02592       LOAD_IVEC3(iv,0,0,n) ;
02593       ivp = THD_fdind_to_3dind( br , iv ) ;
02594       fvp = THD_3dind_to_3dmm ( br->dset , ivp ) ;
02595       fvp = THD_3dmm_to_dicomm( br->dset , fvp ) ;
02596 
02597       if( n == 0 ) LOAD_IVEC3(iv,0,0,1) ;
02598       else         LOAD_IVEC3(iv,0,0,n-1) ;
02599       ivm = THD_fdind_to_3dind( br , iv ) ;
02600       fvm = THD_3dind_to_3dmm ( br->dset , ivm ) ;
02601       fvm = THD_3dmm_to_dicomm( br->dset , fvm ) ;
02602 
02603       dxyz = MIN(br->del1,br->del2) ;
02604       dxyz = MIN(dxyz    ,br->del3) ; dxyz *= 0.1 ;
02605 
02606       if( fabs(fvm.xyz[0]-fvp.xyz[0]) > dxyz ){ 
02607          cc = fvp.xyz[0] ;
02608          dd = ( cc >= 0.0 ) ? "L" : "R" ;
02609       } else if( fabs(fvm.xyz[1]-fvp.xyz[1]) > dxyz ){ 
02610          cc = fvp.xyz[1] ;
02611          dd = ( cc >= 0.0 ) ? "P" : "A" ;
02612       } else if( fabs(fvm.xyz[2]-fvp.xyz[2]) > dxyz ){ 
02613          cc = fvp.xyz[2] ;
02614          dd = ( cc >= 0.0 ) ? "S" : "I" ;
02615       } else {
02616         RETURN(NULL) ;   
02617       }
02618 
02619       sprintf(str,"%6.2f",fabs(cc)) ;
02620       for( ii=strlen(str)-1 ; ii > 0 && str[ii] == '0' ; ii-- ) str[ii] = '\0' ;
02621       if( str[ii] == '.' ) str[ii] = '\0' ;
02622       strcat(str,dd) ; lab = strdup(str) ; RETURN(lab) ;
02623    }
02624 
02625    
02626 
02627    if( type == isqCR_getimage || type == isqCR_getqimage ){
02628       Three_D_View * im3d = (Three_D_View *) br->parent ;
02629       int ival ;
02630 
02631       
02632 
02633       if( EQUIV_DSETS(br->dset,im3d->anat_now) )      
02634         ival = im3d->vinfo->anat_index ;
02635       else if( EQUIV_DSETS(br->dset,im3d->fim_now) )  
02636         ival = im3d->vinfo->fim_index ;
02637       else
02638         ival = 0 ;                                    
02639 
02640            if( type == isqCR_getqimage      ) ival = -1 ; 
02641       else if( ival >= DSET_NVALS(br->dset) ) ival = br->dset->dblk->nvals -1 ;
02642 
02643 if(PRINT_TRACING)
02644 { char str[256] ;
02645   sprintf(str,"getting image n1=%d n2=%d ival=%d",br->n1,br->n2,ival) ;
02646   STATUS(str) ; }
02647 
02648       LOAD_DSET_VIEWS(im3d) ;  
02649 
02650       im = FD_warp_to_mri( n , ival , br ) ; 
02651 
02652       if( ival < 0 ) RETURN( (XtPointer) im ) ;  
02653 
02654       
02655       
02656 
02657       { char buf[64] = "\0" ; int ibest=-1 ;
02658         AFNI_set_valabel( br , n , im , buf ) ;
02659         if( buf[0] != '\0' ){
02660           if( im3d->vinfo->underlay_type == UNDERLAY_ANAT )
02661             strcpy( im3d->vinfo->anat_val , buf ) ;
02662           else
02663             im3d->vinfo->anat_val[0] = '\0' ;
02664 
02665           if( !AFNI_noenv("AFNI_VALUE_LABEL") ) AFNI_do_bkgd_lab( im3d ) ;
02666 
02667           if( im->kind != MRI_complex && im->kind != MRI_rgb ){
02668             char qbuf[64] = "bg =" ;
02669             strcat(qbuf,buf) ; strcpy(buf,qbuf) ;
02670           }
02671           AFNI_get_xhair_node( im3d , NULL , &ibest ) ;   
02672           if( ibest >= 0 ){
02673             char qbuf[64]; sprintf(qbuf,"\nxh = #%d",ibest); strcat(buf,qbuf);
02674           }
02675           MCW_set_widget_label( im3d->vwid->imag->pop_bkgd_lab , buf ) ;
02676           XtManageChild( im3d->vwid->imag->pop_bkgd_lab ) ;
02677         }
02678       }
02679 
02680       RETURN( (XtPointer) im ) ;
02681    }
02682 
02683 STATUS("get something else, but I don't care!") ;
02684 
02685    RETURN( NULL ) ;
02686 }
02687 
02688 
02689 
02690 
02691 
02692 void AFNI_set_valabel( FD_brick * br , int nsl , MRI_IMAGE * im , char * blab )
02693 {
02694    Three_D_View * im3d = (Three_D_View *) br->parent ;
02695    THD_ivec3 ib ;
02696 
02697 ENTRY("AFNI_set_valabel") ;
02698 
02699    if( ! IM3D_VALID(im3d) || ! im3d->vwid->imag->do_bkgd_lab ||
02700        im == NULL         || blab == NULL                      ) EXRETURN ;
02701 
02702    
02703 
02704    ib = THD_3dind_to_fdind( br , TEMP_IVEC3( im3d->vinfo->i1 ,
02705                                              im3d->vinfo->j2 ,
02706                                              im3d->vinfo->k3  ) ) ;
02707 
02708    
02709 
02710 
02711    if( nsl != ib.ijk[2] ) EXRETURN ;
02712 
02713    
02714 
02715    switch( im->kind ){
02716 
02717       case MRI_byte:{
02718          int val = MRI_BYTE_2D(im , ib.ijk[0],ib.ijk[1]) ;
02719          sprintf( blab , "%6d" , val ) ;
02720       }
02721       break ;
02722 
02723       case MRI_short:{
02724          int val = MRI_SHORT_2D(im , ib.ijk[0],ib.ijk[1]) ;
02725          sprintf( blab , "%6d" , val ) ;
02726       }
02727       break ;
02728 
02729       case MRI_int:{
02730          int val = MRI_INT_2D(im , ib.ijk[0],ib.ijk[1]) ;
02731          sprintf( blab , "%6d" , val ) ;
02732       }
02733       break ;
02734 
02735       case MRI_float:{
02736          float val = MRI_FLOAT_2D(im , ib.ijk[0],ib.ijk[1]) ;
02737          AV_fval_to_char(val,blab) ;
02738       }
02739       break ;
02740 
02741       case MRI_complex:{
02742          int iblab ;
02743          complex val ;
02744          val = MRI_COMPLEX_2D(im , ib.ijk[0],ib.ijk[1]) ;
02745          AV_fval_to_char(val.r,blab) ; iblab = strlen(blab) ;
02746          if( val.i >= 0.0 ) blab[iblab++] = '+' ;
02747          AV_fval_to_char(val.i,blab+iblab) ; iblab = strlen(blab) ;
02748          blab[iblab++] = 'I' ; blab[iblab++] = '\0' ;
02749       }
02750       break ;
02751 
02752       case MRI_rgb:{
02753          byte *rgb = MRI_RGB_PTR(im) ;
02754          int ii = ib.ijk[0] + im->nx * ib.ijk[1] ;
02755          sprintf(blab,"(%d,%d,%d)",(int)rgb[3*ii],(int)rgb[3*ii+1],(int)rgb[3*ii+2]) ;
02756       }
02757       break ;
02758 
02759    }
02760    EXRETURN ;
02761 }
02762 
02763 
02764 
02765 
02766 
02767 
02768 THD_3dim_dataset * AFNI_read_images( int nf , char * fname[] )
02769 {
02770    MRI_IMAGE * im , * shim ;
02771    char * bar ;
02772    register int     npix , ii ;
02773    int nx , ny , nz , lf , kz , kim ;
02774    MRI_IMARR * arr ;
02775    char str[256] ;
02776    THD_3dim_dataset * dset ;
02777    int datum = GLOBAL_argopt.datum , dsize ;
02778 
02779    int nvals , nzz , nzin=0 ;  
02780    float dx=0.0, dy=0.0 , dz=0.0 ;  
02781 
02782 ENTRY("AFNI_read_images") ;
02783 
02784    
02785 
02786    if( nf < 1 ) FatalError("*** No images on command line!? ***") ;
02787 
02788    
02789 
02790    nz = 0 ;
02791    for( lf=0 ; lf < nf ; lf++ ){
02792       ii = mri_imcount( fname[lf] ) ;
02793       if( ii == 0 ){
02794          sprintf(str,"*** Illegal image file specifier: %s",fname[lf]) ;
02795          FatalError(str) ;
02796       }
02797       nz += ii ;
02798    }
02799    if( nz == 1 ) nz = 2 ;  
02800 
02801    
02802 
02803    arr = mri_read_file( fname[0] ) ;
02804    if( arr == NULL || arr->num == 0 ){
02805       sprintf(str,"*** cannot read first image file: %s",fname[0]) ;
02806       FatalError(str) ;
02807    }
02808 
02809    im = arr->imarr[0] ;
02810    nx = im->nx ;
02811    ny = im->ny ; npix = nx * ny ;
02812 
02813    if( im->dw > 0.0 ){
02814      dx = fabs(im->dx); dy = fabs(im->dy); dz = fabs(im->dz);  
02815    }
02816 
02817    if( datum < 0 ) datum = im->kind ;
02818    if( ! AFNI_GOOD_DTYPE(datum) )
02819       FatalError("*** Illegal datum type found ***") ;
02820 
02821    dsize = mri_datum_size( (MRI_TYPE) datum ) ;
02822    bar   = (char *) malloc( dsize * nx*ny*nz ) ;
02823    if( bar == NULL ){
02824       fprintf(stderr,"\n** Can't malloc memory for image input!\a\n") ;
02825       exit(1) ;
02826    }
02827 
02828    
02829 
02830    kz = 0 ;
02831    for( lf=0 ; lf < nf ; lf++ ){
02832 
02833 
02834 
02835       if( lf != 0 ){
02836          arr = mri_read_file( fname[lf] ) ;
02837          if( arr == NULL || arr->num == 0 ){
02838            sprintf(str,"*** cannot read image file: %s",fname[lf]) ;
02839            FatalError(str) ;
02840          }
02841       }
02842 
02843 
02844 
02845       for( kim=0 ; kim < arr->num ; kim++ ){
02846          im = arr->imarr[kim] ;
02847 
02848 
02849 
02850          if( im->nx != nx || im->ny != ny ){
02851             if( ! GLOBAL_argopt.resize_images ){
02852                sprintf(str, "*** image size mismatch:\n"
02853                            " *** expected nx=%d ny=%d but got nx=%d ny=%d in file %s" ,
02854                            nx,ny,im->nx,im->ny , fname[lf] ) ;
02855                FatalError(str) ;
02856             } else {
02857                MRI_IMAGE * rim ;
02858                rim = mri_resize( im , nx , ny ) ;
02859                mri_free( im ) ;
02860                im = rim ;
02861             }
02862          }
02863 
02864 
02865 
02866          if( im->kind == datum ){
02867             shim = im ;
02868          } else {
02869             shim = mri_to_mri( datum , im ) ;
02870             if( shim == NULL ) FatalError("*** Illegal convert! ***") ;
02871             mri_free( im ) ;
02872          }
02873 
02874 
02875 
02876          memcpy( bar + dsize*npix*kz , mri_data_pointer(shim) , dsize*npix ) ;
02877          kz++ ;
02878 
02879          KILL_1MRI(shim) ;
02880          if( kz%10 == 5 ) REPORT_PROGRESS(".") ;
02881       }
02882       FREE_IMARR(arr) ;  
02883    }
02884 
02885    
02886 
02887    if( kz == 1 && nz == 2 ){
02888       memcpy( bar + dsize*npix , bar , dsize*npix ) ;
02889    }
02890 
02891    
02892 
02893    sprintf(str,": nx=%d ny=%d nslice=%d (%s)",nx,ny,nz,MRI_TYPE_name[datum]) ;
02894    REPORT_PROGRESS(str) ;
02895 
02896    
02897 
02898 
02899    if( GLOBAL_argopt.read_tim != 0 ){
02900 
02901       if( GLOBAL_argopt.read_tim > 0 ){          
02902          nzin  = nzz = GLOBAL_argopt.read_tim ;  
02903          nvals = nz / nzz ;
02904 
02905          if( nvals*nzz != nz )
02906             fprintf(stderr,
02907                     "\n** Warning: -zim:%d does not evenly divide"
02908                     "number of 2D slices read=%d\n",
02909                     nzz , nz ) ;
02910 
02911       } else {
02912          nvals = - GLOBAL_argopt.read_tim ;      
02913          nzin  = nzz = nz / nvals ;
02914 
02915          if( nvals*nzz != nz )
02916             fprintf(stderr,
02917                     "\n** Warning: -tim:%d does not evenly divide"
02918                     "number of 2D slices read=%d\n",
02919                     nvals , nz ) ;
02920       }
02921 
02922       if( nvals == 1 ){
02923          fprintf(stderr,
02924                  "\n** Error: -tim or -zim has only 1 point in time!\n") ;
02925          exit(1) ;
02926       }
02927 
02928       if( nzz == 1 ) nzz = 2 ;  
02929 
02930    } else {   
02931       nvals = 1 ;
02932       nzz   = nz ;
02933    }
02934 
02935    
02936 
02937    dset                = myXtNew( THD_3dim_dataset ) ;
02938    dset->dblk          = myXtNew( THD_datablock ) ;
02939    dset->daxes         = myXtNew( THD_dataxes ) ;
02940    dset->dblk->diskptr = myXtNew( THD_diskptr ) ;
02941    dset->markers       = NULL ;
02942    dset->warp          = NULL ;
02943    dset->vox_warp      = NULL ;
02944    dset->self_warp     = NULL ;  
02945    dset->warp_parent   = NULL ;
02946    dset->anat_parent   = NULL ;
02947    dset->stats         = NULL ;
02948    dset->death_mark    = 0 ;
02949    dset->tcat_list     = NULL ;  
02950    dset->tcat_num      = 0 ;
02951    dset->tcat_len      = NULL ;
02952    dset->taxis         = NULL ;
02953    dset->tagset        = NULL ;  
02954    ZERO_STAT_AUX( dset ) ;
02955 #ifdef ALLOW_DATASET_VLIST
02956    dset->pts           = NULL ;
02957 #endif
02958 
02959    INIT_KILL(dset->kl) ;
02960    INIT_KILL(dset->dblk->kl) ;
02961 
02962    dset->dblk->diskptr->type         = DISKPTR_TYPE ;
02963    dset->dblk->diskptr->rank         = 3 ;
02964    dset->dblk->diskptr->nvals        = nvals ;  
02965    dset->dblk->diskptr->dimsizes[0]  = nx ;
02966    dset->dblk->diskptr->dimsizes[1]  = ny ;
02967    dset->dblk->diskptr->dimsizes[2]  = nzz ;    
02968    dset->dblk->diskptr->storage_mode = STORAGE_UNDEFINED ;
02969    dset->dblk->diskptr->byte_order   = THD_get_write_order() ;  
02970 
02971    EMPTY_STRING(dset->dblk->diskptr->prefix) ;
02972    EMPTY_STRING(dset->dblk->diskptr->viewcode) ;
02973    EMPTY_STRING(dset->dblk->diskptr->filecode) ;
02974    EMPTY_STRING(dset->dblk->diskptr->directory_name) ;
02975    EMPTY_STRING(dset->dblk->diskptr->header_name) ;
02976    EMPTY_STRING(dset->dblk->diskptr->brick_name) ;
02977 
02978    dset->dblk->type        = DATABLOCK_TYPE ;
02979    dset->dblk->nvals       = nvals ;            
02980 
02981 
02982 
02983    dset->dblk->malloc_type  = DATABLOCK_MEM_MALLOC ;
02984    dset->dblk->brick_fac    = NULL ; 
02985    dset->dblk->brick_bytes  = NULL ;
02986    dset->dblk->brick        = NULL ;
02987 
02988    DSET_lock(dset) ;  
02989 
02990    dset->dblk->brick_lab      = NULL ; 
02991    dset->dblk->brick_keywords = NULL ;
02992    dset->dblk->brick_statcode = NULL ;
02993    dset->dblk->brick_stataux  = NULL ;
02994    dset->keywords             = NULL ;
02995 
02996    THD_init_datablock_brick( dset->dblk , datum , NULL ) ;
02997 
02998    if( nvals == 1 ){
02999 
03000       mri_fix_data_pointer( bar , DSET_BRICK(dset,0) ) ;  
03001 
03002    } else {   
03003               
03004 
03005       int iv , jj , kk ;
03006       char * qbar ;
03007 
03008       for( iv=0 ; iv < nvals ; iv++ ){
03009          qbar = (char *) malloc( dsize*npix*nzz ) ;  
03010 
03011          if( GLOBAL_argopt.read_tim > 0 ){
03012             for( jj=0 ; jj < nzz ; jj++ ){              
03013                kk = MIN(jj,nzin-1) ;
03014                memcpy( qbar + jj*dsize*npix ,
03015                        bar + (iv*nzin+kk)*dsize*npix , dsize*npix ) ;
03016             }
03017          } else {
03018             for( jj=0 ; jj < nzz ; jj++ ){              
03019                kk = MIN(jj,nzin-1) ;
03020                memcpy( qbar + jj*dsize*npix ,
03021                        bar + (kk*nvals+iv)*dsize*npix , dsize*npix ) ;
03022             }
03023          }
03024 
03025          mri_fix_data_pointer( qbar , DSET_BRICK(dset,iv) ) ;
03026       }
03027 
03028       free(bar) ;  
03029 
03030       EDIT_dset_items( dset , ADN_ntt,nvals , ADN_ttdel,1.0 , ADN_none ) ;
03031    }
03032 
03033    dset->dblk->natr   = dset->dblk->natr_alloc = 0 ;
03034    dset->dblk->atr    = NULL ;
03035    dset->dblk->parent = (XtPointer) dset ;
03036 
03037    dset->daxes->type  = DATAXES_TYPE ;
03038    dset->daxes->nxx   = nx ;
03039    dset->daxes->nyy   = ny ;
03040    dset->daxes->nzz   = nzz ;        
03041    dset->daxes->xxdel = 1.0 ;        
03042    dset->daxes->yydel = GLOBAL_argopt.dy ;  
03043    dset->daxes->zzdel = GLOBAL_argopt.dz ;  
03044    dset->daxes->xxorg = dset->daxes->yyorg = dset->daxes->zzorg = 0.0 ;
03045    dset->daxes->parent= (XtPointer) dset ;
03046 
03047    if( dx > 0.0 ) dset->daxes->xxdel = dx ;  
03048    if( dy > 0.0 ) dset->daxes->yydel = dy ;
03049    if( dz > 0.0 ) dset->daxes->zzdel = dz ;
03050 
03051    dset->idcode = MCW_new_idcode() ;
03052    ZERO_IDCODE(dset->anat_parent_idcode) ;
03053    ZERO_IDCODE(dset->warp_parent_idcode) ;
03054 
03055    
03056 
03057 #define ORCODE(aa) \
03058   ( (aa)=='R' ? ORI_R2L_TYPE : (aa)=='L' ? ORI_L2R_TYPE : \
03059     (aa)=='P' ? ORI_P2A_TYPE : (aa)=='A' ? ORI_A2P_TYPE : \
03060     (aa)=='I' ? ORI_I2S_TYPE : (aa)=='S' ? ORI_S2I_TYPE : ILLEGAL_TYPE )
03061 
03062 #define OR3OK(x,y,z) ( ((x)&6) + ((y)&6) + ((z)&6) == 6 )
03063 
03064    { char acod ;
03065      int xx,yy,zz ;
03066 
03067      acod = toupper(GLOBAL_argopt.orient_code[0]) ; xx = ORCODE(acod) ;
03068      acod = toupper(GLOBAL_argopt.orient_code[1]) ; yy = ORCODE(acod) ;
03069      acod = toupper(GLOBAL_argopt.orient_code[2]) ; zz = ORCODE(acod) ;
03070 
03071      if( xx < 0 || yy < 0 || zz < 0 || ! OR3OK(xx,yy,zz) )
03072         FatalError("Unusable -orient code!") ;
03073 
03074      dset->daxes->xxorient = xx ;
03075      dset->daxes->yyorient = yy ;
03076      dset->daxes->zzorient = zz ;
03077    }
03078 
03079    dset->wod_flag  = False ;  
03080    dset->wod_daxes = NULL ;   
03081 
03082    dset->type      = GEN_ANAT_TYPE ;
03083    dset->view_type = dset->func_type = 0 ;
03084 
03085    MCW_strncpy(  dset->self_name , fname[0]             , THD_MAX_NAME  ) ;
03086    MCW_strncpy(  dset->label1    , "Image Display Mode" , THD_MAX_LABEL ) ;
03087    EMPTY_STRING( dset->label2 ) ;
03088    EMPTY_STRING( dset->warp_parent_name ) ;
03089    EMPTY_STRING( dset->anat_parent_name ) ;
03090 
03091    RETURN( dset ) ;
03092 }
03093 
03094 
03095 
03096 
03097 
03098 void AFNI_seq_send_CB( MCW_imseq * seq , FD_brick * br , ISQ_cbs * cbs )
03099 {
03100    Three_D_View * im3d = (Three_D_View *) seq->parent ;
03101 
03102 ENTRY("AFNI_seq_send_CB") ;
03103 
03104 if(PRINT_TRACING)
03105 { char str[256] ; sprintf(str,"reason=%d",cbs->reason) ; STATUS(str) ; }
03106 
03107    if( ! IM3D_VALID(im3d) ||
03108        (   im3d->ignore_seq_callbacks == AFNI_IGNORE_EVERYTHING
03109         && cbs->reason                != isqCR_getxynim        ) ) EXRETURN ;
03110 
03111    switch( cbs->reason ){
03112 
03113       default: break ;
03114 
03115       case isqCR_destroy:{
03116          MCW_imseq * sxyz = im3d->s123 ,
03117                    * syzx = im3d->s231 ,
03118                    * szxy = im3d->s312  ;
03119          Widget w ;
03120          int a3 = br->a123.ijk[2] ,   
03121              az = abs(a3) - 1       ; 
03122 
03123               if( seq == sxyz ){
03124                  w = im3d->vwid->imag->image_xyz_pb ; im3d->s123 = NULL ; }
03125          else if( seq == syzx ){
03126                  w = im3d->vwid->imag->image_yzx_pb ; im3d->s231 = NULL ; }
03127          else if( seq == szxy ){
03128                  w = im3d->vwid->imag->image_zxy_pb ; im3d->s312 = NULL ; }
03129          else
03130                  EXRETURN ;  
03131 
03132 #if 1
03133          myXtFree( seq->status ) ; 
03134 #endif
03135          myXtFree( seq ) ;
03136          MCW_invert_widget(w) ;  
03137          NORMAL_cursorize(w) ;   
03138          INIT_BKGD_LAB(im3d) ;
03139          AFNI_view_setter(im3d,NULL) ;
03140 
03141          
03142 
03143 
03144          if( im3d->vinfo->xhairs_ndown.ijk[az] > 0 ||
03145              im3d->vinfo->xhairs_nup.ijk[az]   > 0   ){
03146 
03147 if(PRINT_TRACING)
03148 { char str[256] ;
03149   sprintf(str,"imseq close on axis %d --> lost xhairs in that direction",az) ;
03150   STATUS(str) ; }
03151 
03152             CLEAR_MONTAGE(im3d,br) ;
03153 
03154             if( im3d->vinfo->xhairs_show_montage &&
03155                 im3d->ignore_seq_callbacks == AFNI_IGNORE_NOTHING ){
03156 
03157                AFNI_set_viewpoint( im3d , -1,-1,-1 , REDISPLAY_OVERLAY ) ;
03158             }
03159          }
03160       }
03161       MPROBE ;
03162       break ;  
03163 
03164       case isqCR_buttonpress:{
03165          XButtonEvent *xev = (XButtonEvent *) cbs->event ;
03166 
03167 if(PRINT_TRACING){
03168  char str[256] ;
03169  sprintf(str,"isqCR_buttonpress: button=%d state=%x",xev->button,xev->state) ;
03170  STATUS(str) ; }
03171 
03172          im3d->vwid->butx = xev->x_root ;  
03173          im3d->vwid->buty = xev->y_root ;
03174          switch( xev->button ){
03175 
03176             default: EXRETURN ;  
03177 
03178             case Button3:{  
03179                XtVaSetValues( im3d->vwid->imag->popmenu ,
03180                                  XmNuserData , (XtPointer) seq ,   
03181                               NULL ) ;
03182                XmMenuPosition( im3d->vwid->imag->popmenu , xev ) ; 
03183                XtManageChild ( im3d->vwid->imag->popmenu ) ;       
03184             }
03185             break ;
03186 
03187             case Button1:{
03188                THD_ivec3 id ;
03189 
03190                
03191 
03192 
03193 if(PRINT_TRACING)
03194 { char str[256] ;
03195   sprintf(str,"Button1 at %d %d %d",
03196           cbs->xim,cbs->yim,cbs->nim) ; STATUS(str) ; }
03197 
03198                if( cbs->xim >= 0 && cbs->xim < br->n1 &&
03199                    cbs->yim >= 0 && cbs->yim < br->n2 &&
03200                    cbs->nim >= 0 && cbs->nim < br->n3   ){
03201 
03202                   id = THD_fdind_to_3dind(
03203                           br , TEMP_IVEC3(cbs->xim,cbs->yim,cbs->nim) );
03204 
03205 if(PRINT_TRACING)
03206 { char str[256] ;
03207   sprintf(str," 3D dataset coordinates %d %d %d",
03208           id.ijk[0],id.ijk[1],id.ijk[2] ) ; STATUS(str) ; }
03209 
03210                   SAVE_VPT(im3d) ;  
03211 
03212                   if( im3d->ignore_seq_callbacks == AFNI_IGNORE_NOTHING ){
03213 
03214                     
03215 
03216                     AFNI_view_setter(im3d,seq) ;
03217                     AFNI_set_viewpoint(
03218                        im3d , id.ijk[0] , id.ijk[1] , id.ijk[2] ,
03219                        (im3d->vinfo->crosshair_visible==True) ?
03220                        REDISPLAY_OVERLAY : REDISPLAY_OPTIONAL ) ;
03221                   }
03222                }
03223             } 
03224             break ;
03225          } 
03226       }
03227       break ;  
03228 
03229       case isqCR_newimage:{
03230          THD_ivec3 id ;
03231 
03232          id = THD_fdind_to_3dind( br, TEMP_IVEC3(-99999,-99999,cbs->nim) );
03233 
03234 if(PRINT_TRACING)
03235 { char str[256] ;
03236   sprintf(str,"newimage input %d -> %d %d %d",
03237           cbs->nim , id.ijk[0],id.ijk[1],id.ijk[2] ) ;
03238   STATUS(str) ; }
03239 
03240          if( im3d->ignore_seq_callbacks == AFNI_IGNORE_NOTHING ){
03241 
03242             
03243 
03244             AFNI_view_setter(im3d,seq) ;
03245             AFNI_set_viewpoint(
03246                im3d , id.ijk[0] , id.ijk[1] , id.ijk[2] ,
03247                (im3d->vinfo->crosshair_visible==True) ?
03248                REDISPLAY_OVERLAY : REDISPLAY_OPTIONAL ) ;
03249          }
03250       }
03251       break ;  
03252 
03253 
03254 
03255       case isqCR_newmontage:{
03256          THD_ivec3 * minf = (THD_ivec3 *) cbs->userdata ;
03257          int ndown = minf->ijk[0], nup = minf->ijk[1], nskip = minf->ijk[2] ;
03258          int a3 = br->a123.ijk[2] ,   
03259              az = abs(a3) - 1       ; 
03260 
03261 if(PRINT_TRACING)
03262 { char str[256] ;
03263   sprintf(str,"newmontage: ndown=%d nup=%d nskip=%d a3=%d (on axis az=%d)",
03264           ndown,nup,nskip,a3,az) ; STATUS(str) ; }
03265 
03266          im3d->vinfo->xhairs_nskip.ijk[az] = nskip ;
03267 
03268          if( a3 > 0 ){
03269             im3d->vinfo->xhairs_ndown.ijk[az] = ndown ;
03270             im3d->vinfo->xhairs_nup.ijk[az]   = nup ;
03271          } else {
03272             im3d->vinfo->xhairs_ndown.ijk[az] = nup ;
03273             im3d->vinfo->xhairs_nup.ijk[az]   = ndown ;
03274          }
03275 
03276          if( im3d->ignore_seq_callbacks == AFNI_IGNORE_NOTHING )
03277             AFNI_set_viewpoint( im3d , -1,-1,-1 , REDISPLAY_OVERLAY ) ;
03278       }
03279       break ;
03280 
03281       
03282 
03283       case isqCR_getxynim:{
03284          THD_ivec3 ib ;
03285 
03286          ib = THD_3dind_to_fdind( br , TEMP_IVEC3( im3d->vinfo->i1 ,
03287                                                    im3d->vinfo->j2 ,
03288                                                    im3d->vinfo->k3  ) ) ;
03289 
03290          cbs->xim = ib.ijk[0] ; cbs->yim = ib.ijk[1] ; cbs->nim = ib.ijk[2] ;
03291       }
03292       break ;  
03293 
03294       
03295 
03296       case isqCR_appress:{
03297          if( im3d->ignore_seq_callbacks == AFNI_IGNORE_NOTHING ){
03298             AFNI_view_setter(im3d,seq) ;
03299             AFNI_crosshair_gap_CB( NULL , (XtPointer) im3d ) ;
03300          }
03301       }
03302       break ;  
03303 
03304       case isqCR_dxplus:
03305       case isqCR_dxminus:
03306       case isqCR_dyplus:
03307       case isqCR_dyminus:{
03308          THD_ivec3 ib , id ;
03309          XButtonEvent * xev = (XButtonEvent *) cbs->event ;
03310          int step = 1 ;
03311          THD_dataxes *daxes ;
03312 
03313          if( xev != NULL &&
03314              ( xev->type == ButtonPress ||
03315                xev->type == ButtonRelease ) &&
03316              (xev->state & (ShiftMask | ControlMask)) ) step = INIT_bigscroll ;
03317 
03318          ib = THD_3dind_to_fdind( br , TEMP_IVEC3( im3d->vinfo->i1 ,
03319                                                    im3d->vinfo->j2 ,
03320                                                    im3d->vinfo->k3  ) ) ;
03321          switch( cbs->reason ){
03322             case isqCR_dxplus:   ib.ijk[0] += step ; break ;
03323             case isqCR_dxminus:  ib.ijk[0] -= step ; break ;
03324             case isqCR_dyplus:   ib.ijk[1] += step ; break ;
03325             case isqCR_dyminus:  ib.ijk[1] -= step ; break ;
03326          }
03327 
03328          id = THD_fdind_to_3dind( br , ib ) ;
03329 
03330          
03331 
03332          LOAD_DSET_VIEWS(im3d) ;  
03333          daxes = CURRENT_DAXES(im3d->anat_now) ;
03334               if( id.ijk[0] <  0          ) id.ijk[0] += daxes->nxx ;
03335          else if( id.ijk[0] >= daxes->nxx ) id.ijk[0] -= daxes->nxx ;
03336               if( id.ijk[1] <  0          ) id.ijk[1] += daxes->nyy ;
03337          else if( id.ijk[1] >= daxes->nyy ) id.ijk[1] -= daxes->nyy ;
03338               if( id.ijk[2] <  0          ) id.ijk[2] += daxes->nzz ;
03339          else if( id.ijk[2] >= daxes->nzz ) id.ijk[2] -= daxes->nzz ;
03340 
03341          if( im3d->ignore_seq_callbacks == AFNI_IGNORE_NOTHING ){
03342 
03343             
03344 
03345             AFNI_view_setter(im3d,seq) ;
03346             AFNI_set_viewpoint(
03347                im3d , id.ijk[0] , id.ijk[1] , id.ijk[2] ,
03348                (im3d->vinfo->crosshair_visible==True) ?
03349                REDISPLAY_OVERLAY : REDISPLAY_OPTIONAL ) ;
03350          }
03351       }
03352       break ;  
03353 
03354       case isqCR_keypress:{
03355 #if 0
03356          MCW_grapher * grapher = VIEWER_TO_GRAPHER(im3d,seq) ;
03357          if( grapher != NULL ){
03358             char buf[2] ;
03359             buf[0] = cbs->key ; buf[1] = '\0' ;
03360             GRA_handle_keypress( grapher , buf , cbs->event ) ;
03361          }
03362 #endif
03363       }
03364       break ; 
03365 
03366       
03367 
03368       case isqCR_button2_key:{
03369         KeySym ks = (KeySym) cbs->key ;
03370 
03371         switch( ks ){
03372           case XK_Delete:
03373             AFNI_process_drawing( im3d , UNDO_MODE , 0,NULL,NULL,NULL ) ;
03374           break ;
03375         }
03376       }
03377       break ; 
03378 
03379       
03380 
03381       case isqCR_button2_points:{
03382          int npts = cbs->key , zim = cbs->nim ;
03383          int * xyout = (int *) cbs->userdata ;
03384          THD_ivec3 id ;
03385          int nvec , ii , xim,yim , fixed_plane ;
03386          int * xdset , * ydset , * zdset ;
03387 
03388          if( zim >= 0 && zim < br->n3 && npts > 0 ){  
03389 
03390             
03391 
03392             xdset = (int *) malloc( npts * sizeof(int) ) ;
03393             ydset = (int *) malloc( npts * sizeof(int) ) ;
03394             zdset = (int *) malloc( npts * sizeof(int) ) ;
03395 
03396             
03397 
03398 
03399             nvec = 0 ;
03400             for( ii=0 ; ii < npts ; ii++ ){
03401                xim = xyout[2*ii] ; yim = xyout[2*ii+1] ;
03402 
03403                
03404 
03405                if( xim >= 0 && xim < br->n1 && yim >= 0 && yim < br->n2 ){
03406 
03407                   id = THD_fdind_to_3dind( br , TEMP_IVEC3(xim,yim,zim) );
03408                   xdset[nvec] = id.ijk[0] ;
03409                   ydset[nvec] = id.ijk[1] ;
03410                   zdset[nvec] = id.ijk[2] ;
03411 
03412                   
03413 
03414                   if( nvec == 0                    ||
03415                       xdset[nvec] != xdset[nvec-1] ||
03416                       ydset[nvec] != ydset[nvec-1] ||
03417                       zdset[nvec] != zdset[nvec-1]   ) nvec++ ;
03418                }
03419             }
03420 
03421             
03422 
03423             fixed_plane = abs(br->a123.ijk[2]) ;
03424 
03425             if( nvec > 0 ) AFNI_process_drawing( im3d ,
03426                                                  PLANAR_MODE+fixed_plane ,
03427                                                  nvec,xdset,ydset,zdset ) ;
03428 
03429             
03430 
03431             free(xdset) ; free(ydset) ; free(zdset) ;
03432          }
03433       }
03434       break ; 
03435 
03436       
03437 
03438       case isqCR_force_redisplay:{
03439          AFNI_view_setter(im3d,seq) ;
03440          PLUTO_force_redisplay() ;  
03441          PLUTO_force_rebar() ;      
03442       }
03443       break ; 
03444 
03445    }  
03446 
03447    EXRETURN ;
03448 }
03449 
03450 
03451 
03452 
03453 
03454 void AFNI_gra_send_CB( MCW_grapher *grapher , FD_brick *br , GRA_cbs *cbs )
03455 {
03456    Three_D_View *im3d = (Three_D_View *)grapher->parent ;
03457 
03458 ENTRY("AFNI_gra_send_CB") ;
03459 
03460 if(PRINT_TRACING)
03461 { char str[256] ; sprintf(str,"reason=%d",cbs->reason) ; STATUS(str) ; }
03462 
03463    if( ! IM3D_VALID(im3d) ||
03464        (im3d->ignore_seq_callbacks==AFNI_IGNORE_EVERYTHING) ) EXRETURN ;
03465 
03466    switch( cbs->reason ){
03467 
03468       default: break ;  
03469 
03470       
03471 
03472       case graCR_destroy:{
03473          MCW_grapher * gxyz = im3d->g123 ,
03474                      * gyzx = im3d->g231 ,
03475                      * gzxy = im3d->g312  ;
03476          MCW_imseq * seq = GRAPHER_TO_VIEWER(im3d,grapher) ;
03477          Widget w ;
03478 
03479               if( grapher == gxyz ){
03480                  w = im3d->vwid->imag->graph_xyz_pb ; im3d->g123 = NULL ;
03481                  STATUS("destruction of g123") ;
03482          }
03483          else if( grapher == gyzx ){
03484                  w = im3d->vwid->imag->graph_yzx_pb ; im3d->g231 = NULL ;
03485                  STATUS("destruction of g231") ;
03486          }
03487          else if( grapher == gzxy ){
03488                  w = im3d->vwid->imag->graph_zxy_pb ; im3d->g312 = NULL ;
03489                  STATUS("destruction of g312") ;
03490          }
03491          else
03492                  EXRETURN ;  
03493 
03494          myXtFree( grapher->status ) ;  
03495          myXtFree( grapher ) ;          
03496          MCW_invert_widget(w) ;         
03497          NORMAL_cursorize(w) ;          
03498 
03499          
03500 
03501          if( seq != NULL && im3d->vinfo->crosshair_visible==True &&
03502              im3d->ignore_seq_callbacks == AFNI_IGNORE_NOTHING     )
03503 
03504             drive_MCW_imseq( seq , isqDR_overlay , (XtPointer) -1 ) ;
03505       }
03506       MPROBE ;
03507       break ;  
03508 
03509       
03510 
03511       case graCR_newxyzm:{
03512          THD_ivec3 id ;
03513 
03514          if( cbs->xcen >= 0 && cbs->xcen < br->n1 &&
03515              cbs->ycen >= 0 && cbs->ycen < br->n2 &&
03516              cbs->zcen >= 0 && cbs->zcen < br->n3   ){
03517 
03518             id = THD_fdind_to_3dind(
03519                     br , TEMP_IVEC3(cbs->xcen,cbs->ycen,cbs->zcen) );
03520 
03521 if(PRINT_TRACING)
03522 { char str[256] ;
03523   sprintf(str," 3D dataset coordinates %d %d %d",
03524           id.ijk[0],id.ijk[1],id.ijk[2] ) ; STATUS(str) ; }
03525 
03526             if( im3d->ignore_seq_callbacks == AFNI_IGNORE_NOTHING ){
03527                AFNI_view_setter(im3d,NULL) ;
03528                AFNI_set_viewpoint(
03529                   im3d ,
03530                   id.ijk[0] , id.ijk[1] , id.ijk[2] ,
03531                   (im3d->vinfo->crosshair_visible==True) ?
03532                   REDISPLAY_OVERLAY : REDISPLAY_OPTIONAL ) ;
03533             }
03534          }
03535       }
03536       break ; 
03537 
03538       
03539 
03540       case graCR_pickref:{
03541 
03542 STATUS("graCR_pickref") ;
03543 
03544          if( IMARR_COUNT(GLOBAL_library.timeseries) > 0 ){
03545             int init_ts = AFNI_ts_in_library( im3d->fimdata->fimref ) ;
03546 
03547             MCW_choose_timeseries( grapher->fdw_graph , "FIM Reference Vector" ,
03548                                    GLOBAL_library.timeseries , init_ts ,
03549                                    AFNI_fimmer_pickref_CB , (XtPointer) im3d ) ;
03550          } else {
03551             (void) MCW_popup_message(
03552                       grapher->option_rowcol ,
03553                       "No timeseries library\nexists to pick from!" ,
03554                       MCW_USER_KILL | MCW_TIMER_KILL ) ;
03555          }
03556       }
03557       break ; 
03558 
03559       
03560 
03561       case graCR_pickort:{
03562 
03563 STATUS("graCR_pickort") ;
03564 
03565          if( IMARR_COUNT(GLOBAL_library.timeseries) > 0 ){
03566             int init_ts = AFNI_ts_in_library( im3d->fimdata->fimort ) ;
03567 
03568             MCW_choose_timeseries( grapher->fdw_graph , "FIM Ort Vector" ,
03569                                    GLOBAL_library.timeseries , init_ts ,
03570                                    AFNI_fimmer_pickort_CB , (XtPointer) im3d ) ;
03571          } else {
03572             (void) MCW_popup_message(
03573                       grapher->option_rowcol ,
03574                       "No timeseries library\nexists to pick from!" ,
03575                       MCW_USER_KILL | MCW_TIMER_KILL ) ;
03576          }
03577       }
03578       break ; 
03579 
03580 
03581       
03582 
03583       case graCR_clearfim:{
03584          AFNI_fimmer_setref( im3d , NULL ) ;
03585          im3d->fimdata->refadd_count = 0 ;
03586       }
03587       break ; 
03588 
03589       
03590 
03591       case graCR_clearort:{
03592          AFNI_fimmer_setort( im3d , NULL ) ;
03593       }
03594       break ; 
03595 
03596       
03597 
03598 
03599 
03600       case graCR_winaver:{
03601         if( im3d->g123 != NULL && im3d->g123 != grapher )
03602           drive_MCW_grapher( im3d->g123 , graDR_winaver , 0 ) ;
03603         if( im3d->g231 != NULL && im3d->g231 != grapher )
03604           drive_MCW_grapher( im3d->g231 , graDR_winaver , 0 ) ;
03605         if( im3d->g312 != NULL && im3d->g312 != grapher )
03606           drive_MCW_grapher( im3d->g312 , graDR_winaver , 0 ) ;
03607       }
03608       break ; 
03609 
03610       
03611 
03612 
03613       case graCR_timeseries_library:{
03614          MRI_IMAGE * tsim = (MRI_IMAGE *) cbs->userdata ;
03615 
03616          AFNI_add_timeseries( tsim ) ;
03617       }
03618       break ; 
03619 
03620       
03621 
03622       case graCR_refadd:
03623       case graCR_refequals:{
03624          MRI_IMAGE * tsim = (MRI_IMAGE *) cbs->userdata ;
03625          MRI_IMAGE * qim , * sim ;
03626          float * sar , * qar ;
03627 
03628          if( tsim != NULL ){
03629             qim = mri_to_float( tsim ) ;        
03630             if( im3d->fimdata->fimref == NULL   ||
03631                 cbs->reason == graCR_refequals  ||
03632                 im3d->fimdata->refadd_count < 1   ){
03633 
03634 
03635 
03636                AFNI_fimmer_setref( im3d , qim ) ;
03637                im3d->fimdata->refadd_count = 1 ;
03638 
03639             } else {
03640                int jj,ii , nxs , nyy , nxq , nxx , npix ;
03641                float fs , fq ;
03642 
03643 
03644 
03645                sim  = mri_to_float( im3d->fimdata->fimref ) ; 
03646                sar  = MRI_FLOAT_PTR(sim) ;
03647                qar  = MRI_FLOAT_PTR(qim) ;
03648                nxs  = sim->nx ; nxq = qim->nx ; nxx = MIN(nxs,nxq) ;
03649                nyy  = MIN( sim->ny , qim->ny ) ;
03650                npix = MIN( sim->nvox , qim->nvox ) ;
03651 
03652                fq = 1.0/( im3d->fimdata->refadd_count + 1.0 ) ;
03653                fs = 1.0 - fq ;
03654 
03655                for( jj=0 ; jj < nyy ; jj++ ){
03656                   for( ii=0 ; ii < nxx ; ii++ ){
03657                      if( sar[ii+jj*nxs] >= WAY_BIG || qar[ii+jj*nxq] >= WAY_BIG )
03658                         sar[ii+jj*nxs] = WAY_BIG ;
03659                      else
03660                         sar[ii+jj*nxs] = fs * sar[ii+jj*nxs] + fq * qar[ii+jj*nxq] ;
03661                   }
03662                }
03663                mri_free( qim ) ;
03664 
03665                AFNI_fimmer_setref( im3d , sim ) ;  
03666                im3d->fimdata->refadd_count++ ;
03667             }
03668          }
03669       }
03670       break ;
03671 
03672       
03673 
03674       case graCR_refsmooth:{
03675          if( im3d->fimdata->fimref != NULL ){
03676             MRI_IMAGE * sim = mri_to_float(im3d->fimdata->fimref) ; 
03677             float * sar = MRI_FLOAT_PTR(sim) ;
03678             float aa,bb,cc ;
03679             int ii,jj , nx=sim->nx , ny=sim->ny ;
03680 
03681             for( jj=0 ; jj < ny ; jj++ ){
03682                bb = sar[jj*nx] ; cc = sar[1+jj*nx] ;
03683                for( ii=1 ; ii < nx-1 ; ii++ ){
03684                   aa = bb ; bb = cc ; cc = sar[ii+1+jj*nx] ;
03685                   if( aa < WAY_BIG && bb < WAY_BIG &&
03686                       cc < WAY_BIG && ii > im3d->fimdata->init_ignore )
03687                      sar[ii+jj*nx] = OSFILT(aa,bb,cc) ;
03688                }
03689             }
03690             AFNI_fimmer_setref( im3d , sim ) ;
03691          }
03692       }
03693       break ;
03694 
03695       
03696 
03697       case graCR_dofim:{
03698          AFNI_fimmer_execute( im3d , cbs->key , cbs->mat ) ;
03699       }
03700       break ; 
03701 
03702       
03703 
03704       case graCR_setignore:{
03705          AFNI_fimmer_setignore( im3d , cbs->key ) ;
03706       }
03707       break ;
03708 
03709       
03710 
03711       case graCR_polort:{
03712          AFNI_fimmer_setpolort( im3d , cbs->key ) ;
03713       }
03714       break ;
03715 
03716       
03717       
03718       
03719 
03720       case graCR_setindex:{
03721          MCW_arrowval *tav = im3d->vwid->imag->time_index_av ;
03722          MCW_arrowval *aav = im3d->vwid->func->anat_buck_av ;
03723          int new_index = cbs->key ;
03724 
03725          if( new_index != im3d->vinfo->anat_index ){
03726            if( im3d->vinfo->time_on ){
03727              AV_assign_ival( tav , new_index ) ;               
03728              AFNI_time_index_CB( tav, (XtPointer) im3d ); 
03729            } else {
03730              AV_assign_ival( aav, new_index ) ;       
03731              AFNI_bucket_CB( aav, im3d ) ;
03732            }
03733          }
03734       }
03735       break ;
03736 
03737       
03738 
03739       case graCR_button2_points:{
03740          THD_ivec3 id ;
03741          int fixed_plane ;
03742 
03743          if( cbs->xcen >= 0 && cbs->xcen < br->n1 &&
03744              cbs->ycen >= 0 && cbs->ycen < br->n2 &&
03745              cbs->zcen >= 0 && cbs->zcen < br->n3   ){
03746 
03747             
03748 
03749             id = THD_fdind_to_3dind(
03750                     br , TEMP_IVEC3(cbs->xcen,cbs->ycen,cbs->zcen) );
03751 
03752             
03753 
03754             fixed_plane = abs(br->a123.ijk[2]) ;
03755 
03756             AFNI_process_drawing( im3d , SINGLE_MODE + fixed_plane ,
03757                                   1, &id.ijk[0], &id.ijk[1], &id.ijk[2] ) ;
03758          }
03759       }
03760       break ;
03761 
03762    } 
03763 
03764   EXRETURN ;
03765 }
03766 
03767 
03768 
03769 
03770 
03771 
03772 void AFNI_read_inputs( int argc , char *argv[] )
03773 {
03774    int id , last_color ;
03775    Boolean isfunc ;
03776 
03777 ENTRY("AFNI_read_inputs") ;
03778 
03779    
03780 
03781    GLOBAL_library.sslist = myXtNew( THD_sessionlist ) ;
03782    GLOBAL_library.sslist->type = SESSIONLIST_TYPE ;
03783    BLANK_SESSIONLIST(GLOBAL_library.sslist) ;
03784    GLOBAL_library.sslist->parent = NULL ;
03785 
03786    
03787 
03788    if( GLOBAL_argopt.first_file_arg >= argc && GLOBAL_argopt.read_images ){
03789       FatalError("No image files on command line!!") ;
03790    }
03791 
03792    
03793 
03794    if( GLOBAL_argopt.read_images ){
03795       THD_3dim_dataset *dset ;
03796       THD_session *new_ss ;
03797       int vv ;
03798       int gnim ;  
03799       char **gname ;
03800 
03801       MCW_warn_expand(1) ;  
03802 
03803       MCW_file_expand( argc - GLOBAL_argopt.first_file_arg ,
03804                        &(argv[GLOBAL_argopt.first_file_arg]) ,
03805                        &gnim , &gname ) ;
03806 
03807       MCW_warn_expand(0) ;  
03808 
03809       if( gnim < 1 )
03810         FatalError("No valid filenames on command line?!" ) ;
03811 
03812       dset = AFNI_read_images( gnim , gname ) ;
03813 
03814       if( dset == NULL )
03815         FatalError("Could not form 3D dataset from images!" ) ;
03816 
03817       MCW_free_expand( gnim , gname ) ;
03818 
03819       
03820 
03821       new_ss              = myXtNew( THD_session ) ;
03822       new_ss->type        = SESSION_TYPE ;
03823       BLANK_SESSION(new_ss) ;
03824       new_ss->num_dsset   = 1 ;
03825       new_ss->dsset[0][0] = dset ;
03826       new_ss->parent      = NULL ;
03827 
03828       MCW_strncpy( new_ss->sessname ,
03829                    argv[GLOBAL_argopt.first_file_arg] , THD_MAX_NAME ) ;
03830       MCW_strncpy( new_ss->lastname ,
03831                    argv[GLOBAL_argopt.first_file_arg] , THD_MAX_NAME ) ;
03832 
03833       GLOBAL_library.sslist->num_sess   = 1 ;
03834       GLOBAL_library.sslist->ssar[0]    = new_ss ;
03835       GLOBAL_library.have_dummy_dataset = 1 ;
03836 
03837    } 
03838 
03839    
03840 
03841    else if( GLOBAL_argopt.read_sessions ){
03842 
03843       char str[256] ;
03844       Boolean good ;
03845       int num_ss , qd , qs , vv=0 , no_args , jj , nskip_noanat=0 ;
03846       THD_string_array *flist , *dlist=NULL ;
03847       char *dname , *eee ;
03848       THD_session *new_ss ;
03849       int num_dsets=0 ;       
03850       THD_session *gss=NULL ; 
03851       THD_session *dss ;      
03852 
03853       
03854       
03855 
03856       eee = getenv( "AFNI_GLOBAL_SESSION" ) ;   
03857       if( eee != NULL ){
03858          gss =
03859           GLOBAL_library.session = THD_init_session( eee ); 
03860 
03861          if( gss != NULL ){                               
03862             gss->parent = NULL ;                          
03863             for( qd=0 ; qd < gss->num_dsset ; qd++ )
03864               for( vv=0 ; vv <= LAST_VIEW_TYPE ; vv++ ){
03865                 PARENTIZE( gss->dsset[qd][vv] , NULL ) ;
03866                 DSET_MARK_FOR_IMMORTALITY( gss->dsset[qd][vv] ) ;
03867               }
03868          } else {
03869            sprintf(str,"\n*** No datasets in AFNI_GLOBAL_SESSION=%s",eee) ;
03870            REPORT_PROGRESS(str) ;
03871          }
03872       }
03873 
03874       
03875 
03876 
03877       dss         = myXtNew( THD_session ) ;
03878       dss->type   = SESSION_TYPE ;
03879       dss->parent = NULL ;
03880       BLANK_SESSION(dss) ;
03881       MCW_strncpy( dss->sessname , "from CLI" , THD_MAX_NAME ) ;
03882       MCW_strncpy( dss->lastname , "from CLI" , THD_MAX_NAME ) ;
03883 
03884       
03885 
03886       num_ss  = argc - GLOBAL_argopt.first_file_arg ;
03887       no_args = (num_ss < 1) ;
03888 
03889       INIT_SARR(dlist) ;
03890       if( no_args ){
03891          if( GLOBAL_argopt.recurse > 0 ){
03892 STATUS("no args: recursion on ./") ;
03893             flist = THD_get_all_subdirs( GLOBAL_argopt.recurse , "./" ) ;
03894             if( flist != NULL ){
03895                for( jj=0 ; jj < flist->num ; jj++ ){
03896                  ADDTO_SARR(dlist,flist->ar[jj]) ;
03897                }
03898                DESTROY_SARR(flist) ;
03899             }
03900          } else {
03901 STATUS("no args: using ./") ;
03902            ADDTO_SARR(dlist,"./") ;
03903          }
03904       } else {
03905          for( id=0 ; id < num_ss ; id++ ){
03906             if( GLOBAL_argopt.recurse > 0 ){
03907                flist = THD_get_all_subdirs( GLOBAL_argopt.recurse ,
03908                                             argv[GLOBAL_argopt.first_file_arg+id] ) ;
03909                if( flist != NULL ){
03910                   for( jj=0 ; jj < flist->num ; jj++ ){
03911                     ADDTO_SARR(dlist,flist->ar[jj]) ;
03912                   }
03913                   DESTROY_SARR(flist) ;
03914                }
03915             } else {
03916               ADDTO_SARR(dlist,argv[GLOBAL_argopt.first_file_arg+id]) ;
03917             }
03918          }
03919       }
03920 
03921       if( dlist->num < 1 ) ADDTO_SARR(dlist,"./") ;  
03922 
03923 
03924 
03925       { THD_string_array * qlist ;
03926 STATUS("normalizing directory list") ;
03927         qlist = THD_normalize_flist( dlist ) ;
03928         if( qlist != NULL ){ DESTROY_SARR(dlist) ; dlist = qlist ; }
03929       }
03930 
03931       REFRESH ;
03932 
03933       
03934 
03935       num_ss = dlist->num ;
03936       for( id=0 ; id < num_ss ; id++ ){
03937 
03938 if(PRINT_TRACING)
03939 { char str[256] ;
03940   sprintf(str,"try to read directory %s",dlist->ar[id]) ; STATUS(str) ; }
03941 
03942          dname  = dlist->ar[id] ;                
03943          new_ss = THD_init_session( dname ) ;    
03944 
03945          REFRESH ;
03946 
03947          if( new_ss == NULL ){ 
03948            qd = dss->num_dsset ;
03949            if( qd < THD_MAX_SESSION_SIZE ){
03950              THD_3dim_dataset *dset = THD_open_dataset( dname ) ;
03951              if( dset != NULL ){
03952                dss->dsset[qd][dset->view_type] = dset ;
03953                dss->num_dsset ++ ;
03954              } else {
03955                fprintf(stderr,
03956                        "\n** Couldn't open %s as session OR as dataset!" ,
03957                        dname ) ;
03958              }
03959            }
03960          }
03961 
03962          if( new_ss != NULL && new_ss->num_dsset > 0 ){ 
03963 
03964             
03965 
03966             new_ss->parent = NULL ;
03967             for( qd=0 ; qd < new_ss->num_dsset ; qd++ )
03968               for( vv=0 ; vv <= LAST_VIEW_TYPE ; vv++ )
03969                 PARENTIZE( new_ss->dsset[qd][vv] , NULL ) ;
03970 
03971             
03972 
03973             GLOBAL_library.sslist->ssar[(GLOBAL_library.sslist->num_sess)++] = new_ss ;
03974 
03975             sprintf(str,"\n session #%3d  = %s ==> %d dataset%s" ,
03976                     GLOBAL_library.sslist->num_sess ,
03977                     new_ss->sessname , new_ss->num_dsset ,
03978                     (new_ss->num_dsset > 1) ? "s" : " " ) ;
03979             REPORT_PROGRESS(str) ;
03980 
03981             num_dsets += new_ss->num_dsset ;
03982 
03983             
03984 
03985             if( new_ss->warptable != NULL ){
03986               if( GLOBAL_library.warptable == NULL ) 
03987                 GLOBAL_library.warptable = new_Htable(101) ;
03988               subsume_Htable( new_ss->warptable , GLOBAL_library.warptable ) ;
03989               destroy_Htable( new_ss->warptable ) ;
03990               new_ss->warptable = NULL ;
03991             }
03992 
03993             
03994 
03995             if( new_ss != NULL && gss != NULL )
03996               AFNI_append_sessions( new_ss , gss ) ;
03997 
03998             
03999 
04000 
04001             if( GLOBAL_library.sslist->num_sess == THD_MAX_NUM_SESSION &&
04002                 id < num_ss-1 ){
04003                sprintf(str,"\n *** reached max no. sessions (%d) ***",
04004                        THD_MAX_NUM_SESSION) ;
04005                REPORT_PROGRESS(str) ;
04006                break ;                            
04007             }
04008          }
04009 
04010       }  
04011 
04012       
04013 
04014       if( dss->num_dsset > 0 ){
04015         if( GLOBAL_library.sslist->num_sess < THD_MAX_NUM_SESSION ){
04016           GLOBAL_library.sslist->ssar[(GLOBAL_library.sslist->num_sess)++] = dss ;
04017           num_dsets += dss->num_dsset ;
04018           sprintf(str,"\n session #%3d  = %s ==> %d dataset%s" ,
04019                   GLOBAL_library.sslist->num_sess, dss->sessname, dss->num_dsset,
04020                   (dss->num_dsset > 1) ? "s" : " " ) ;
04021           REPORT_PROGRESS(str) ;
04022           if( gss != NULL ) AFNI_append_sessions( dss , gss ) ;
04023         } else {
04024           fprintf(stderr,"\n** Can't use command line datasets: session overflow!\n") ;
04025           free(dss) ;
04026         }
04027       } else {
04028         free(dss) ;
04029       }
04030 
04031       
04032 
04033       if( gss != NULL && GLOBAL_library.sslist->num_sess == 0 ){
04034 
04035         GLOBAL_library.sslist->ssar[(GLOBAL_library.sslist->num_sess)++] = gss ;
04036 
04037         sprintf(str,"\n AFNI_GLOBAL_SESSION = %s %d datasets" ,
04038             gss->sessname , gss->num_dsset ) ;
04039 
04040         num_dsets += gss->num_dsset ;
04041 
04042         REPORT_PROGRESS(str) ;
04043       }
04044 
04045 
04046 
04047       GLOBAL_library.have_dummy_dataset = 0 ;
04048 
04049 #define QQ_NXYZ 16
04050 #define QQ_NT   12
04051 #define QQ_FOV  240.0
04052 
04053       if( GLOBAL_library.sslist->num_sess <= 0 ){
04054          byte * bar ;  
04055          int ii , nbar , jj ;
04056          THD_ivec3 nxyz ;
04057          THD_fvec3 fxyz , oxyz ;
04058          char *snam = dlist->ar[0] ; 
04059 
04060          if( !THD_is_directory(snam) ) snam = "./" ;
04061 
04062          REPORT_PROGRESS("\n*** No datasets or sessions input -- Dummy dataset created.") ;
04063 
04064 
04065 
04066          new_ss         = myXtNew( THD_session ) ;
04067          new_ss->type   = SESSION_TYPE ;
04068          new_ss->parent = NULL ;
04069          BLANK_SESSION(new_ss) ;
04070          MCW_strncpy( new_ss->sessname , snam , THD_MAX_NAME ) ; 
04071          MCW_strncpy( new_ss->lastname , snam , THD_MAX_NAME ) ; 
04072          GLOBAL_library.sslist->num_sess   = 1 ;
04073          GLOBAL_library.sslist->ssar[0]    = new_ss ;
04074          GLOBAL_library.have_dummy_dataset = 1 ;
04075 
04076 
04077 
04078          new_ss->num_dsset   = 1 ;
04079          new_ss->dsset[0][0] = EDIT_empty_copy(NULL) ;
04080          nxyz.ijk[0] = nxyz.ijk[1] = nxyz.ijk[2] = QQ_NXYZ ;
04081          fxyz.xyz[0] = fxyz.xyz[1] = fxyz.xyz[2] = QQ_FOV / QQ_NXYZ ;
04082          oxyz.xyz[0] = oxyz.xyz[1] = oxyz.xyz[2] = -0.5 * QQ_FOV ;
04083          ii = EDIT_dset_items( new_ss->dsset[0][0] ,
04084                                  ADN_datum_all     , MRI_byte            ,
04085                                  ADN_nxyz          , nxyz                ,
04086                                  ADN_xyzdel        , fxyz                ,
04087                                  ADN_xyzorg        , oxyz                ,
04088                                  ADN_directory_name, snam                ,
04089                                  ADN_prefix        , "Dummy"             ,
04090                                  ADN_nvals         , QQ_NT               ,
04091                                  ADN_malloc_type   , DATABLOCK_MEM_MALLOC,
04092                                  ADN_type          , HEAD_ANAT_TYPE      ,
04093                                  ADN_view_type     , VIEW_ORIGINAL_TYPE  ,
04094                                  ADN_func_type     , ANAT_EPI_TYPE       ,
04095 #if QQ_NT > 1
04096                                  ADN_ntt            , QQ_NT                ,
04097                                  ADN_ttdel          , 1.0                  ,
04098                                  ADN_ttorg          , 0.0                  ,
04099                                  ADN_ttdur          , 0.0                  ,
04100                                  ADN_tunits         , UNITS_SEC_TYPE       ,
04101 #endif
04102                               ADN_none ) ;
04103          if( ii > 0 ){
04104            fprintf(stderr,"\n%d errors creating dummy dataset!\a\n",ii) ;
04105            exit(1) ;
04106          }
04107          DSET_lock(new_ss->dsset[0][0]) ; 
04108 
04109          nbar = DSET_BRICK_BYTES(new_ss->dsset[0][0],0) ;
04110 
04111 #ifdef NO_FRIVOLITIES
04112          for( jj=0 ; jj < QQ_NT ; jj++ ){
04113             bar    = (byte *) malloc( nbar ) ;
04114             bar[0] = (byte) (lrand48()%127) ;
04115             for( ii=1 ; ii < nbar ; ii++ )
04116                bar[ii] = bar[ii-1] + lrand48()%(jj+2) ;
04117             EDIT_substitute_brick( new_ss->dsset[0][0] , jj , MRI_byte , bar ) ;
04118          }
04119 #else
04120         { 
04121           static byte rrr[QQ_NXYZ*QQ_NXYZ] = {
04122             0,0,0,0,10,94,135,135,135,135,135,135,135,135,135,135,
04123             0,0,0,32,216,255,255,255,255,255,255,255,255,255,255,255,
04124             0,0,4,171,255,255,255,255,255,255,255,255,255,255,255,255,
04125             0,0,22,255,255,255,255,241,162,75,75,140,255,255,255,255,
04126             0,0,22,255,255,255,255,100,0,0,0,92,255,255,255,255,
04127             0,0,22,255,255,255,255,71,0,0,0,92,255,255,255,255,
04128             0,0,13,213,255,255,255,234,193,105,105,160,255,255,255,255,
04129             0,0,0,95,255,255,255,255,255,255,255,255,255,255,255,255,
04130             0,0,0,0,75,209,255,255,255,250,239,245,255,255,255,255,
04131             0,0,0,0,22,220,255,255,255,105,0,92,255,255,255,255,
04132             0,0,0,0,118,255,255,255,243,45,0,92,255,255,255,255,
04133             0,0,0,21,228,255,255,255,157,0,0,92,255,255,255,255,
04134             0,0,0,124,255,255,255,255,63,0,0,92,255,255,255,255,
04135             0,0,18,237,255,255,255,205,11,0,0,92,255,255,255,255,
04136             0,0,73,255,255,255,255,85,0,0,0,92,255,255,255,255,
04137             0,6,128,134,134,134,134,37,0,0,0,48,134,134,134,134 } ;
04138 
04139           static byte www[QQ_NXYZ*QQ_NXYZ] = {
04140             0,45,135,135,0,0,0,135,135,95,0,0,5,135,135,135,
04141             0,74,255,255,11,0,10,255,255,255,0,0,85,255,255,205,
04142             0,0,254,255,86,0,84,255,255,255,15,0,100,255,255,155,
04143             0,0,234,255,106,0,105,255,255,255,85,0,170,255,255,85,
04144             0,0,169,255,171,0,169,255,255,255,110,0,195,255,255,60,
04145             0,0,99,255,201,0,200,255,255,255,170,0,255,255,255,0,
04146             0,0,84,255,255,1,254,255,255,255,205,35,255,255,180,0,
04147             0,0,5,254,255,81,255,255,135,255,255,85,255,255,170,0,
04148             0,0,0,249,255,170,255,255,85,249,255,135,255,255,85,0,
04149             0,0,0,169,255,220,255,255,35,170,255,255,255,255,75,0,
04150             0,0,0,114,255,255,255,240,0,154,255,255,255,255,0,0,
04151             0,0,0,84,255,255,255,171,0,85,255,255,255,195,0,0,
04152             0,0,0,20,254,255,255,145,0,59,255,255,255,170,0,0,
04153             0,0,0,0,254,255,255,86,0,0,255,255,255,100,0,0,
04154             0,0,0,0,179,255,255,50,0,0,179,255,255,50,0,0,
04155             0,0,0,0,89,134,134,0,0,0,89,134,134,0,0,0 } ;
04156 
04157           static byte ccc[QQ_NXYZ*QQ_NXYZ] = {
04158             0,0,0,0,2,94,160,255,255,219,135,92,9,0,0,0,
04159             0,0,0,17,165,255,255,255,255,255,255,255,214,41,2,0,
04160             0,0,4,128,255,255,255,255,255,255,255,255,255,255,38,0,
04161             0,0,22,255,255,255,242,108,75,111,244,255,255,255,167,2,
04162             0,0,116,255,255,255,202,0,0,0,113,255,255,255,255,44,
04163             0,0,94,165,165,165,72,0,0,0,15,223,255,255,255,131,
04164             0,0,0,0,0,0,0,0,0,0,0,216,255,255,255,183,
04165             0,0,0,0,0,0,0,0,0,0,0,216,255,255,255,255,
04166             0,0,0,0,0,0,0,0,0,0,0,216,255,255,255,247,
04167             0,0,0,0,0,0,0,0,0,0,0,216,255,255,255,131,
04168             0,0,94,166,166,136,0,0,0,0,55,241,255,255,255,131,
04169             0,0,116,255,255,242,85,0,0,0,114,255,255,255,255,44,
04170             0,0,15,225,255,255,243,109,76,112,244,255,255,255,166,2,
04171             0,0,0,109,255,255,255,255,255,255,255,255,255,217,31,0,
04172             0,0,0,3,105,219,255,255,255,255,255,255,162,28,0,0,
04173             0,0,0,0,0,9,97,134,225,160,134,91,2,0,0,0 } ;
04174 
04175           static byte ooo[QQ_NXYZ*QQ_NXYZ] = {
04176             0,0,0,0,0,12,121,135,255,255,234,107,11,0,0,0,
04177             0,0,0,0,58,236,255,255,255,255,255,255,224,108,4,0,
04178             0,0,0,60,234,255,255,255,255,255,255,255,255,255,51,0,
04179             0,0,10,197,255,255,255,171,75,75,163,255,255,255,224,11,
04180             0,0,80,255,255,255,224,39,0,0,31,233,255,255,255,107,
04181             0,0,164,255,255,255,151,0,0,0,0,180,255,255,255,135,
04182             0,12,202,255,255,255,151,0,0,0,0,180,255,255,255,185,
04183             0,29,255,255,255,255,151,0,0,0,0,180,255,255,255,255,
04184             0,27,249,255,255,255,151,0,0,0,0,180,255,255,255,248,
04185             0,0,164,255,255,255,151,0,0,0,0,180,255,255,255,135,
04186             0,0,164,255,255,255,169,3,0,0,0,180,255,255,255,135,
04187             0,0,79,255,255,255,255,44,0,0,60,233,255,255,255,50,
04188             0,0,10,197,255,255,255,171,76,90,234,255,255,255,174,3,
04189             0,0,0,59,233,255,255,255,255,255,255,255,255,223,40,0,
04190             0,0,0,0,57,186,255,255,255,255,255,255,139,19,0,0,
04191             0,0,0,0,0,5,119,134,191,134,134,49,3,0,0,0 } ;
04192 
04193           static byte xxx[QQ_NXYZ*QQ_NXYZ] = {
04194             0,0,21,131,135,135,135,8,0,0,3,100,135,135,135,128,
04195             0,0,0,108,255,255,255,86,0,0,115,255,255,255,255,121,
04196             0,0,0,21,216,255,255,213,0,19,223,255,255,255,187,5,
04197             0,0,0,0,92,244,255,255,114,114,255,255,255,234,58,0,
04198             0,0,0,0,0,174,255,255,252,230,255,255,255,130,0,0,
04199             0,0,0,0,0,58,244,255,255,255,255,255,228,29,0,0,
04200             0,0,0,0,0,0,118,255,255,255,255,255,74,0,0,0,
04201             0,0,0,0,0,0,55,248,255,255,255,199,3,0,0,0,
04202             0,0,0,0,0,5,170,255,255,255,255,227,32,0,0,0,
04203             0,0,0,0,0,104,255,255,255,255,255,255,140,5,0,0,
04204             0,0,0,0,13,217,255,255,252,215,255,255,255,67,0,0,
04205             0,0,0,0,159,255,255,255,212,23,233,255,255,187,7,0,
04206             0,0,0,81,241,255,255,255,85,0,72,255,255,255,66,0,
04207             0,0,16,206,255,255,255,212,0,0,8,193,255,255,237,12,
04208             0,0,94,255,255,255,255,86,0,0,0,73,255,255,255,121,
04209             0,14,129,134,134,134,85,1,0,0,0,3,106,134,134,127 } ;
04210 
04211           static byte bob[QQ_NXYZ*QQ_NXYZ] = {
04212                0,0,0,60,101,133,155,165,173,161,112,54,0,0,0,0,
04213                0,48,104,139,141,144,154,164,162,183,195,162,76,0,0,0,
04214                0,111,126,119,120,132,146,174,172,194,222,226,195,88,0,0,
04215                70,112,100,90,108,123,175,222,229,242,247,249,246,195,50,0,
04216                54,53,75,87,110,129,161,219,247,249,250,250,250,241,76,0,
04217                53,55,93,112,116,124,151,212,243,249,250,250,249,228,103,0,
04218                52,62,97,134,131,125,126,154,213,242,250,250,248,200,121,0,
04219                50,66,89,140,130,120,125,130,151,172,187,209,242,221,174,99,
04220                46,71,106,150,132,79,77,111,145,133,108,159,231,247,203,174,
04221                110,124,134,140,114,95,78,104,211,232,205,231,250,250,221,167,
04222                103,115,150,146,126,104,102,120,170,215,209,202,245,250,245,103,
04223                62,115,140,151,136,116,102,108,110,172,225,138,184,243,123,0,
04224                0,56,94,122,143,128,106,106,91,122,166,113,146,197,50,0,
04225                0,0,0,60,140,139,119,120,117,124,164,160,152,71,0,0,
04226                0,0,0,0,69,124,138,131,120,168,227,194,81,0,0,0,
04227                0,0,0,0,0,49,69,103,131,153,141,54,0,0,0,0 } ;
04228 
04229           static byte * rwcox[6] = { rrr,www,ccc,ooo,xxx,bob } ;
04230           int kk ;
04231 
04232             for( jj=0 ; jj < QQ_NT ; jj++ ){
04233                bar = (byte *) malloc( nbar ) ;
04234                for( kk=0 ; kk < QQ_NXYZ ; kk++ )
04235                   memcpy( bar + kk*QQ_NXYZ*QQ_NXYZ , rwcox[jj%6] , QQ_NXYZ*QQ_NXYZ ) ;
04236                EDIT_substitute_brick( new_ss->dsset[0][0] , jj , MRI_byte , bar ) ;
04237             }
04238           } 
04239 #endif
04240 
04241          PARENTIZE( new_ss->dsset[0][0] , NULL ) ;
04242 
04243       } else {  
04244 
04245          sprintf(str,"\n dataset count = %d" , num_dsets ) ;
04246          GLOBAL_num_dsets = num_dsets ;
04247          REPORT_PROGRESS(str) ;
04248       }
04249 
04250       
04251 
04252 STATUS("reading timeseries files") ;
04253 
04254       
04255 
04256       GLOBAL_library.timeseries =
04257            THD_get_many_timeseries( (GLOBAL_argopt.read_1D) ? dlist : NULL ) ;
04258 
04259       REFRESH ;
04260 
04261       if( GLOBAL_library.timeseries == NULL )
04262          INIT_IMARR(GLOBAL_library.timeseries) ;
04263 
04264       sprintf( str , "\n Time series   = %d files read" ,
04265                IMARR_COUNT(GLOBAL_library.timeseries) ) ;
04266       REPORT_PROGRESS(str) ;
04267 
04268       
04269 
04270       DESTROY_SARR(dlist) ;
04271 
04272       
04273 
04274 
04275 
04276       if( !GLOBAL_library.have_dummy_dataset ){
04277 
04278         STATUS("checking idcodes for duplicates") ;
04279         THD_check_idcodes( GLOBAL_library.sslist ) ;     
04280 
04281         STATUS("reconciling parent pointers") ;
04282         THD_reconcile_parents( GLOBAL_library.sslist ) ;
04283 
04284         STATUS("forcible adoption of unparented datasets") ;
04285         for( id=0 ; id < GLOBAL_library.sslist->num_sess ; id++ ){ 
04286           new_ss = GLOBAL_library.sslist->ssar[id] ;               
04287           AFNI_force_adoption( new_ss , GLOBAL_argopt.warp_4D ) ;
04288        }
04289 
04290       } 
04291 
04292       if( GLOBAL_library.session != NULL )
04293          AFNI_force_adoption( GLOBAL_library.session , GLOBAL_argopt.warp_4D ) ;
04294 
04295 STATUS("making descendant datasets") ;
04296 
04297       AFNI_make_descendants( GLOBAL_library.sslist ) ;
04298 
04299    } 
04300 
04301    else if( GLOBAL_argopt.read_dsets ){  
04302 
04303       int nds = argc - GLOBAL_argopt.first_file_arg ;
04304       char str[256] ;
04305       THD_3dim_dataset * dset ;
04306       XtPointer_array * dsar ;
04307       MRI_IMARR * webtsar ;        
04308       THD_session * new_ss ;
04309       int ii,nerr=0,vv,nn , dd ;
04310 
04311       if( nds <= 0 ){
04312          fprintf(stderr,"\a\n*** No datasets on command line?!\n"); exit(1);
04313       }
04314       nds = 0 ;
04315 
04316       
04317 
04318       new_ss             = myXtNew( THD_session ) ;
04319       new_ss->type       = SESSION_TYPE ;
04320       BLANK_SESSION(new_ss) ;
04321       new_ss->parent     = NULL ;
04322 
04323       strcpy( new_ss->sessname , "." ) ;
04324       strcpy( new_ss->lastname , "." ) ;
04325 
04326       GLOBAL_library.sslist->num_sess   = 1 ;
04327       GLOBAL_library.sslist->ssar[0]    = new_ss ;
04328       GLOBAL_library.have_dummy_dataset = 0 ;
04329 
04330       
04331 
04332 STATUS("reading commandline dsets") ;
04333 
04334       INIT_IMARR(webtsar) ; 
04335 
04336       for( ii=GLOBAL_argopt.first_file_arg ; ii < argc ; ii++ ){
04337 
04338 
04339 
04340 
04341          if( strstr(argv[ii],"://")      != NULL &&
04342              strstr(argv[ii],"AFNILIST") != NULL   ){ 
04343 
04344             dsar = THD_fetch_many_datasets( argv[ii] ) ;
04345             if( dsar == NULL || dsar->num == 0 ){
04346                fprintf(stderr,"\a\n*** Can't read datasets from %s\n",argv[ii]) ;
04347                nerr++ ; continue ; 
04348             }
04349 
04350          } else { 
04351 
04352             dset = THD_open_dataset( argv[ii] ) ;
04353             if( dset == NULL ){
04354                fprintf(stderr,"\a\n*** Can't read dataset %s\n",argv[ii]) ;
04355                nerr++ ; continue ; 
04356             }
04357             INIT_XTARR(dsar) ; ADDTO_XTARR(dsar,dset) ; XTARR_IC(dsar,0) = IC_DSET ;
04358          }
04359 
04360          for( dd=0 ; dd < dsar->num ; dd++ ){  
04361 
04362             
04363 
04364             if( XTARR_IC(dsar,dd) == IC_FLIM ){  
04365                MRI_IMAGE *im = (MRI_IMAGE *) XTARR_XT(dsar,dd) ;
04366                ADDTO_IMARR(webtsar,im) ;
04367                continue ;              
04368             }
04369             if( XTARR_IC(dsar,dd) != IC_DSET ){
04370                fprintf(stderr,"\n** Unknown filetype returned from %s\n",argv[ii]) ;
04371                nerr++ ; continue ;   
04372             }
04373 
04374             
04375 
04376             dset = (THD_3dim_dataset *) XTARR_XT(dsar,dd) ;
04377             if( !ISVALID_DSET(dset) ) continue ;            
04378             nds++ ;   
04379             REFRESH ;
04380             vv = dset->view_type ;
04381             nn = new_ss->num_dsset ;
04382             if( nn >= THD_MAX_SESSION_SIZE ){
04383               fprintf(stderr,"\a\n*** too many datasets!\n") ;
04384               nerr++ ;
04385             } else {
04386               new_ss->dsset[nn][vv] = dset ;
04387               new_ss->num_dsset ++ ;
04388             }
04389          } 
04390 
04391          FREE_XTARR(dsar) ;  
04392 
04393       } 
04394 
04395       if( nerr > 0 ){
04396          fprintf(stderr,"** FATAL ERRORS on input\n") ; exit(1) ;  
04397       }
04398 
04399       sprintf(str,"\n dataset count = %d" , nds ) ;
04400       if( new_ss->num_dsset == 0 ){
04401          fprintf(stderr,"\n*** No datasets read from the list!\n") ;
04402          exit(1) ;
04403       }
04404       REPORT_PROGRESS(str) ;
04405 
04406 STATUS("reading timeseries files") ;
04407 
04408       GLOBAL_library.timeseries = THD_get_many_timeseries( NULL ) ;
04409 
04410       REFRESH ;
04411 
04412       if( GLOBAL_library.timeseries == NULL )
04413          INIT_IMARR(GLOBAL_library.timeseries) ;
04414 
04415       
04416 
04417       for( dd=0 ; dd < IMARR_COUNT(webtsar) ; dd++ )
04418          AFNI_add_timeseries( IMARR_SUBIMAGE(webtsar,dd) ) ;
04419 
04420       FREE_IMARR(webtsar) ;
04421 
04422       sprintf( str , "\n Time series   = %d files read" ,
04423                IMARR_COUNT(GLOBAL_library.timeseries) ) ;
04424       REPORT_PROGRESS(str) ;
04425 
04426       
04427 
04428 
04429 
04430 STATUS("checking idcodes for duplicates") ;
04431 
04432       THD_check_idcodes( GLOBAL_library.sslist ) ;
04433 
04434 #if 0
04435 STATUS("reconciling parent pointers") ;
04436 
04437       THD_reconcile_parents( GLOBAL_library.sslist ) ; 
04438 
04439 STATUS("forcible adoption of unparented datasets") ;
04440 
04441       for( id=0 ; id < GLOBAL_library.sslist->num_sess ; id++ ){  
04442          new_ss = GLOBAL_library.sslist->ssar[id] ;               
04443          AFNI_force_adoption( new_ss , GLOBAL_argopt.warp_4D ) ;
04444       }
04445 #endif
04446 
04447    }  
04448 
04449    else {  
04450 
04451      fprintf(stderr,"\a\n*** Illegal Usage configuration detected!\n"); exit(1);
04452    }
04453 
04454 
04455 
04456    MPROBE ; EXRETURN ;
04457 }
04458 
04459 
04460 
04461 
04462 
04463 void AFNI_startup_3dview( Three_D_View * im3d )
04464 {
04465    static int old_0D_num=0 , old_2D_num=0 ;
04466 
04467 ENTRY("AFNI_startup_3dview") ;
04468 
04469    if( ! IM3D_VALID(im3d) ) EXRETURN ;
04470 
04471    
04472 
04473    if( GLOBAL_library.registered_0D.num != old_0D_num ){
04474       old_0D_num = GLOBAL_library.registered_0D.num ;
04475       refit_MCW_optmenu( im3d->vwid->func->pbar_transform0D_av ,
04476                            0 ,                                 
04477                            GLOBAL_library.registered_0D.num ,  
04478                            0 ,                                 
04479                            0 ,                                 
04480                            ISQ_transform_label ,               
04481                            &(GLOBAL_library.registered_0D)     
04482                         ) ;
04483       XtManageChild( im3d->vwid->func->pbar_transform0D_av->wrowcol ) ;
04484    } else {
04485       if( old_0D_num == 0 )
04486         XtUnmanageChild( im3d->vwid->func->pbar_transform0D_av->wrowcol ) ;
04487    }
04488 
04489    im3d->vwid->func->pbar_transform0D_index = 0 ;
04490    im3d->vwid->func->pbar_transform0D_func  = NULL ;
04491 
04492    
04493 
04494    if( GLOBAL_library.registered_2D.num != old_2D_num ){
04495       old_2D_num = GLOBAL_library.registered_2D.num ;
04496       refit_MCW_optmenu( im3d->vwid->func->pbar_transform2D_av ,
04497                            0 ,                                 
04498                            GLOBAL_library.registered_2D.num ,  
04499                            0 ,                                 
04500                            0 ,                                 
04501                            ISQ_transform_label ,               
04502                            &(GLOBAL_library.registered_2D)     
04503                         ) ;
04504       XtManageChild( im3d->vwid->func->pbar_transform2D_av->wrowcol ) ;
04505    } else {
04506       if( old_2D_num == 0 )
04507         XtUnmanageChild( im3d->vwid->func->pbar_transform2D_av->wrowcol ) ;
04508    }
04509 
04510    im3d->vwid->func->pbar_transform2D_index = 0 ;
04511    im3d->vwid->func->pbar_transform2D_func  = NULL ;
04512 
04513    
04514 
04515    if( im3d->vwid->func->inten_pbar->bigmode )
04516      POPUP_cursorize( im3d->vwid->func->inten_pbar->panew ) ;
04517 
04518    
04519 
04520    EXRETURN ;
04521 }
04522 
04523 
04524 
04525 
04526 
04527 void AFNI_closedown_3dview( Three_D_View * im3d )
04528 {
04529 ENTRY("AFNI_closedown_3dview") ;
04530 
04531    if( ! IM3D_VALID(im3d) ) EXRETURN ;
04532 
04533    
04534 
04535    AFNI_receive_destroy( im3d ) ;
04536 
04537    
04538 
04539    drive_MCW_imseq( im3d->s123 , isqDR_destroy , NULL ) ;
04540    drive_MCW_imseq( im3d->s231 , isqDR_destroy , NULL ) ;
04541    drive_MCW_imseq( im3d->s312 , isqDR_destroy , NULL ) ;
04542 
04543    drive_MCW_grapher( im3d->g123 , graDR_destroy , NULL ) ;
04544    drive_MCW_grapher( im3d->g231 , graDR_destroy , NULL ) ;
04545    drive_MCW_grapher( im3d->g312 , graDR_destroy , NULL ) ;
04546 
04547    
04548 
04549    myXtFree(im3d->b123_anat) ;
04550    myXtFree(im3d->b231_anat) ;
04551    myXtFree(im3d->b312_anat) ;
04552 
04553    myXtFree(im3d->b123_fim)  ;
04554    myXtFree(im3d->b231_fim)  ;
04555    myXtFree(im3d->b312_fim)  ;
04556 
04557    im3d->b123_ulay = im3d->b231_ulay = im3d->b312_ulay = NULL ;
04558 
04559    if( XtIsManaged(im3d->vwid->view->frame) == True )
04560       AFNI_controller_panel_CB( NULL , im3d , NULL ) ;
04561 
04562    
04563 
04564    LOAD_IVEC3(im3d->vinfo->xhairs_ndown,0,0,0) ;
04565    LOAD_IVEC3(im3d->vinfo->xhairs_nup  ,0,0,0) ;
04566    LOAD_IVEC3(im3d->vinfo->xhairs_nskip,0,0,0) ;
04567 
04568    
04569 
04570    AFNI_fimmer_setref(im3d,NULL) ; CLEAR_FIMDATA(im3d) ;
04571 
04572    RESET_AFNI_QUIT(im3d) ;
04573 
04574    im3d->anat_now = im3d->fim_now = NULL ;
04575 
04576    AFNI_purge_unused_dsets() ;
04577 
04578    
04579 
04580    if( im3d->vwid->view->swid != NULL )
04581      XtUnmapWidget( im3d->vwid->view->swid->wtop ) ;
04582 
04583    MPROBE ;
04584    EXRETURN ;
04585 }
04586 
04587 
04588 
04589 
04590 void AFNI_controller_panel_CB( Widget wcall , XtPointer cd , XtPointer cbs )
04591 {
04592    Three_D_View * im3d = (Three_D_View *) cd ;
04593 
04594 ENTRY("AFNI_controller_panel_CB") ;
04595 
04596    if( ! IM3D_OPEN(im3d) || im3d->vwid->prog->panel_pb == NULL ) EXRETURN ;
04597 
04598 
04599 
04600    if( XtIsManaged(im3d->vwid->view->frame) == True ){
04601 
04602       if( XtIsManaged(im3d->vwid->marks->frame) == True ){
04603          AFNI_marks_action_CB( NULL , (XtPointer) im3d , NULL ) ;
04604       }
04605 
04606       if( XtIsManaged(im3d->vwid->func->frame) ){
04607          CLOSE_PANEL(im3d,func) ;
04608       }
04609 
04610       if( XtIsManaged(im3d->vwid->dmode->frame) ){
04611          CLOSE_PANEL(im3d,dmode) ;
04612       }
04613 
04614       XtUnmanageChild(im3d->vwid->view->frame) ;
04615       if( im3d->vwid->prog->panel_pb_inverted ){
04616          MCW_invert_widget(im3d->vwid->prog->panel_pb) ;
04617          im3d->vwid->prog->panel_pb_inverted = False ;
04618       }
04619 
04620    } else {  
04621 
04622       XtManageChild(im3d->vwid->view->frame) ;
04623       if( ! im3d->vwid->prog->panel_pb_inverted ){
04624          MCW_invert_widget(im3d->vwid->prog->panel_pb) ;
04625          im3d->vwid->prog->panel_pb_inverted = True ;
04626       }
04627    }
04628 
04629    RESET_AFNI_QUIT(im3d) ;
04630    EXRETURN ;
04631 }
04632 
04633 
04634 
04635 
04636 
04637 void AFNI_crosshair_visible_CB( MCW_arrowval * av , XtPointer client_data )
04638 {
04639    Three_D_View * im3d = (Three_D_View *) client_data ;
04640    int val , omold ;
04641 
04642 ENTRY("AFNI_crosshair_visible_CB") ;
04643 
04644    if( ! IM3D_VALID(im3d) ) EXRETURN ;
04645 
04646    if( av->ival == av->old_ival ) EXRETURN ;
04647 
04648    switch( av->ival ){
04649       case AFNI_XHAIRS_OFF:
04650          im3d->vinfo->crosshair_visible   = False ;
04651          im3d->vinfo->xhairs_show_montage = False ;
04652       break ;
04653 
04654       case AFNI_XHAIRS_SINGLE:
04655          im3d->vinfo->crosshair_visible   = True ;
04656          im3d->vinfo->xhairs_show_montage = False ;
04657       break ;
04658 
04659       default:                                     
04660       case AFNI_XHAIRS_MULTI:                      
04661          im3d->vinfo->crosshair_visible   = True ; 
04662          im3d->vinfo->xhairs_show_montage = True ;
04663       break ;
04664    }
04665 
04666    
04667 
04668    omold = im3d->vinfo->xhairs_orimask ;  
04669 
04670    switch( av->ival ){
04671       default:                im3d->vinfo->xhairs_orimask = ORIMASK_ALL  ; break;
04672       case AFNI_XHAIRS_LR_AP: im3d->vinfo->xhairs_orimask = ORIMASK_LR_AP; break;
04673       case AFNI_XHAIRS_LR_IS: im3d->vinfo->xhairs_orimask = ORIMASK_LR_IS; break;
04674       case AFNI_XHAIRS_AP_IS: im3d->vinfo->xhairs_orimask = ORIMASK_AP_IS; break;
04675       case AFNI_XHAIRS_LR:    im3d->vinfo->xhairs_orimask = ORIMASK_LR   ; break;
04676       case AFNI_XHAIRS_AP:    im3d->vinfo->xhairs_orimask = ORIMASK_AP   ; break;
04677       case AFNI_XHAIRS_IS:    im3d->vinfo->xhairs_orimask = ORIMASK_IS   ; break;
04678    }
04679 
04680    AFNI_set_viewpoint( im3d , -1,-1,-1 , REDISPLAY_OVERLAY ) ;
04681 
04682    
04683 
04684    if( omold != im3d->vinfo->xhairs_orimask ) AFNI_process_viewpoint( im3d ) ;
04685 
04686    RESET_AFNI_QUIT(im3d) ;
04687    EXRETURN ;
04688 }
04689 
04690 
04691 
04692 void AFNI_wrap_bbox_CB( Widget w ,
04693                         XtPointer client_data , XtPointer call_data )
04694 {
04695    Three_D_View * im3d = (Three_D_View *) client_data ;
04696    int bval ;
04697 
04698 ENTRY("AFNI_wrap_bbox_CB") ;
04699 
04700    if( ! IM3D_VALID(im3d) ) EXRETURN ;
04701 
04702    bval = MCW_val_bbox( im3d->vwid->imag->wrap_bbox ) ;
04703 
04704    if( (Boolean) bval == im3d->vinfo->xhairs_periodic ) EXRETURN ;
04705 
04706    im3d->vinfo->xhairs_periodic = (Boolean) bval ;
04707 
04708    if( w != NULL ){
04709       drive_MCW_imseq( im3d->s123, isqDR_periodicmont, (XtPointer) bval );
04710       drive_MCW_imseq( im3d->s231, isqDR_periodicmont, (XtPointer) bval );
04711       drive_MCW_imseq( im3d->s312, isqDR_periodicmont, (XtPointer) bval );
04712    }
04713 
04714    RESET_AFNI_QUIT(im3d) ;
04715    EXRETURN ;
04716 }
04717 
04718 
04719 
04720 void AFNI_xhall_bbox_CB( Widget w ,
04721                          XtPointer client_data , XtPointer call_data )
04722 {
04723    Three_D_View * im3d = (Three_D_View *) client_data ;
04724    int bval ;
04725 
04726 ENTRY("AFNI_xhall_bbox_CB") ;
04727 
04728    if( ! IM3D_VALID(im3d) ) EXRETURN ;
04729 
04730    bval = MCW_val_bbox( im3d->vwid->imag->xhall_bbox ) ;
04731 
04732    if( (Boolean) bval == im3d->vinfo->xhairs_all ) EXRETURN ;
04733 
04734    im3d->vinfo->xhairs_all = (Boolean) bval ;
04735 
04736    if( im3d->vinfo->crosshair_visible ){
04737       AFNI_set_viewpoint( im3d , -1,-1,-1 , REDISPLAY_OVERLAY ) ;
04738    }
04739 
04740    RESET_AFNI_QUIT(im3d) ;
04741    EXRETURN ;
04742 }
04743 
04744 
04745 
04746 void AFNI_crosshair_color_CB( MCW_arrowval * av , XtPointer client_data )
04747 {
04748    Three_D_View * im3d = (Three_D_View *) client_data ;
04749    int ipx = av->ival ;
04750 
04751 ENTRY("AFNI_crosshair_color_CB") ;
04752 
04753    if( ! IM3D_VALID(im3d) ) EXRETURN ;
04754 
04755    im3d->vinfo->crosshair_ovcolor = ipx ;
04756    if( im3d->vinfo->crosshair_visible ){
04757       AFNI_set_viewpoint( im3d , -1,-1,-1 , REDISPLAY_OVERLAY ) ;
04758    }
04759 
04760    RESET_AFNI_QUIT(im3d) ;
04761    EXRETURN ;
04762 }
04763 
04764 
04765 
04766 void AFNI_crosshair_gap_CB( MCW_arrowval * av ,  XtPointer client_data )
04767 {
04768    Three_D_View * im3d = (Three_D_View *) client_data ;
04769    int ipx ;
04770 
04771 ENTRY("AFNI_crosshair_gap_CB") ;
04772 
04773    if( ! IM3D_VALID(im3d) ) EXRETURN ;
04774 
04775    if( av != NULL ){
04776       ipx = av->ival ;
04777    } else {
04778       if( im3d->vinfo->crosshair_gap_old > 0 ){
04779          ipx = im3d->vinfo->crosshair_gap_old ;
04780          im3d->vinfo->crosshair_gap_old = 0 ;
04781       } else {
04782          im3d->vinfo->crosshair_gap_old = im3d->vinfo->crosshair_gap ;
04783          ipx = 0 ;
04784       }
04785    }
04786 
04787    im3d->vinfo->crosshair_gap = ipx ;
04788    if( im3d->vinfo->crosshair_visible ){
04789       AFNI_set_viewpoint( im3d , -1,-1,-1 , REDISPLAY_OVERLAY ) ;
04790    }
04791 
04792    RESET_AFNI_QUIT(im3d) ;
04793    EXRETURN ;
04794 }
04795 
04796 
04797 
04798 void AFNI_time_index_CB( MCW_arrowval *av ,  XtPointer client_data )
04799 {
04800    Three_D_View *im3d = (Three_D_View *) client_data ;
04801    int ipx ;
04802 
04803 ENTRY("AFNI_time_index_CB") ;
04804 
04805    if( ! IM3D_VALID(im3d) ) EXRETURN ;
04806 
04807    ipx = av->ival ;
04808    if( ipx >= im3d->vinfo->top_index )    
04809       ipx = im3d->vinfo->top_index - 1 ;
04810 
04811    im3d->vinfo->time_index = ipx ;        
04812 
04813    
04814 
04815    im3d->vinfo->anat_index = ipx ;
04816    if( im3d->vinfo->anat_index >= DSET_NVALS(im3d->anat_now) )
04817      im3d->vinfo->anat_index = DSET_NVALS(im3d->anat_now) - 1 ;
04818    AV_assign_ival( im3d->vwid->func->anat_buck_av , im3d->vinfo->anat_index ) ;
04819 
04820    if( ISVALID_DSET(im3d->fim_now) &&
04821        HAS_TIMEAXIS(im3d->fim_now) && !AFNI_noenv("AFNI_SLAVE_FUNCTIME") ){
04822 
04823      im3d->vinfo->fim_index = ipx ;
04824      if( im3d->vinfo->fim_index >= DSET_NVALS(im3d->fim_now) )
04825        im3d->vinfo->fim_index = DSET_NVALS(im3d->fim_now) - 1 ;
04826      AV_assign_ival( im3d->vwid->func->fim_buck_av , im3d->vinfo->fim_index ) ;
04827 
04828      if( AFNI_yesenv("AFNI_SLAVE_THRTIME") ){   
04829        im3d->vinfo->thr_index = ipx ;
04830        if( im3d->vinfo->thr_index >= DSET_NVALS(im3d->fim_now) )
04831          im3d->vinfo->thr_index = DSET_NVALS(im3d->fim_now) - 1 ;
04832        AV_assign_ival( im3d->vwid->func->thr_buck_av , im3d->vinfo->thr_index ) ;
04833      }
04834    }
04835 
04836    im3d->vinfo->tempflag = 1 ;
04837    AFNI_modify_viewing( im3d , False ) ;  
04838 
04839    if( ISVALID_DSET(im3d->fim_now)       &&   
04840        DSET_NUM_TIMES(im3d->fim_now) > 1   )  
04841      AFNI_process_funcdisplay( im3d ) ;       
04842 
04843    AFNI_time_lock_carryout( im3d ) ;  
04844    AFNI_process_timeindex ( im3d ) ;  
04845 
04846    RESET_AFNI_QUIT(im3d) ;
04847    EXRETURN ;
04848 }
04849 
04850 
04851 
04852 
04853 
04854 static char * AFNI_image_help =
04855  "Button 1: Set crosshair location\n"
04856  "Button 3: Pop up image menu\n\n"
04857  "Shift/Ctrl/Alt + Button 3\n"
04858  "will open up the Disp/Mont/Save\n"
04859  "control panels, respectively.\n\n"
04860  "Shift+Button2: drag crop region\n\n"
04861  "q = close window (=Done)\n"
04862  "z = zoom out  Z = zoom in\n"
04863  "p = panning mode on & off\n"
04864  "> = Page Up   = forward 1 image\n"
04865  "< = Page Down = backward 1 image\n"
04866  "v/V = Video up/down\n"
04867  "r/R = Ricochet up/down\n"
04868  "Left/Right/Up/Down arrow keys\n"
04869  "  move crosshairs OR pan image\n" ;
04870 
04871 static char * AFNI_arrowpad_help =
04872    "Click arrows to scroll crosshair position\n"
04873    "Click button to open/close crosshair gap " ;
04874 
04875 static char * AFNI_arrowpad_hint[] = {
04876   "Scroll crosshairs down" ,
04877   "Scroll crosshairs up" ,
04878   "Scroll crosshairs left" ,
04879   "Scroll crosshairs right" ,
04880   "Close/open crosshairs gap"
04881 } ;
04882 
04883 
04884 
04885 void AFNI_view_xyz_CB( Widget w ,
04886                        XtPointer client_data , XtPointer call_data )
04887 {
04888    Three_D_View * im3d = (Three_D_View *) client_data ;
04889    MCW_imseq   * sxyz , * syzx , * szxy , ** snew = NULL ;
04890    MCW_grapher * gxyz , * gyzx , * gzxy , ** gnew = NULL ;
04891    Widget        pboff , pb_xyz , pb_yzx , pb_zxy ;
04892    Widget        groff , gr_xyz , gr_yzx , gr_zxy ;
04893    FD_brick    * brnew ;
04894    int mirror=0 ;
04895    int m2m=0 ;     
04896 
04897 ENTRY("AFNI_view_xyz_CB") ;
04898 
04899    if( ! IM3D_VALID(im3d) ) EXRETURN ;
04900 
04901     sxyz = im3d->s123 ; gxyz = im3d->g123 ;
04902     syzx = im3d->s231 ; gyzx = im3d->g231 ;
04903     szxy = im3d->s312 ; gzxy = im3d->g312 ;
04904 
04905     pb_xyz = im3d->vwid->imag->image_xyz_pb ;
04906     pb_yzx = im3d->vwid->imag->image_yzx_pb ;
04907     pb_zxy = im3d->vwid->imag->image_zxy_pb ;
04908 
04909     gr_xyz = im3d->vwid->imag->graph_xyz_pb ;
04910     gr_yzx = im3d->vwid->imag->graph_yzx_pb ;
04911     gr_zxy = im3d->vwid->imag->graph_zxy_pb ;
04912 
04913     
04914 
04915 
04916     if( w == pb_xyz && sxyz != NULL ){
04917        if( ISQ_REALZ(sxyz) )
04918           XMapRaised( XtDisplay(sxyz->wtop) , XtWindow(sxyz->wtop) ) ;
04919        EXRETURN ;
04920     } else if( w == pb_yzx && syzx != NULL ){
04921        if( ISQ_REALZ(syzx) )
04922           XMapRaised( XtDisplay(syzx->wtop) , XtWindow(syzx->wtop) ) ;
04923        EXRETURN ;
04924     } else if( w == pb_zxy && szxy != NULL ){
04925        if( ISQ_REALZ(szxy) )
04926           XMapRaised( XtDisplay(szxy->wtop) , XtWindow(szxy->wtop) ) ;
04927        EXRETURN ;
04928     } else if( w == gr_xyz && gxyz != NULL ){
04929        if( GRA_REALZ(gxyz) )
04930           XMapRaised( XtDisplay(gxyz->fdw_graph) , XtWindow(gxyz->fdw_graph) ) ;
04931        EXRETURN ;
04932     } else if( w == gr_yzx && gyzx != NULL ){
04933        if( GRA_REALZ(gyzx) )
04934           XMapRaised( XtDisplay(gyzx->fdw_graph) , XtWindow(gyzx->fdw_graph) ) ;
04935        EXRETURN ;
04936     } else if( w == gr_zxy && gzxy != NULL ){
04937        if( GRA_REALZ(gzxy) )
04938           XMapRaised( XtDisplay(gzxy->fdw_graph) , XtWindow(gzxy->fdw_graph) ) ;
04939        EXRETURN ;
04940     }
04941 
04942     
04943 
04944     m2m = AFNI_yesenv("AFNI_IMAGE_MINTOMAX") ;
04945 
04946     if( w == pb_xyz && sxyz == NULL ){         
04947        snew  = &(im3d->s123) ;
04948        brnew = im3d->b123_ulay ;
04949        pboff = pb_xyz ;
04950        mirror= GLOBAL_argopt.left_is_left ;
04951 
04952     } else if( w == pb_yzx && syzx == NULL ){  
04953        snew  = &(im3d->s231) ;
04954        brnew = im3d->b231_ulay ;
04955        pboff = pb_yzx ;
04956 
04957     } else if( w == pb_zxy && szxy == NULL ){  
04958        snew  = &(im3d->s312) ;
04959        brnew = im3d->b312_ulay ;
04960        pboff = pb_zxy ;
04961        mirror= GLOBAL_argopt.left_is_left ;
04962 
04963     } else if( w == gr_xyz && gxyz == NULL ){  
04964        gnew  = &(im3d->g123) ;
04965        brnew = im3d->b123_ulay ;
04966        pboff = gr_xyz ;
04967        mirror= GLOBAL_argopt.left_is_left ;
04968 
04969     } else if( w == gr_yzx && gyzx == NULL ){  
04970        gnew  = &(im3d->g231) ;
04971        brnew = im3d->b231_ulay ;
04972        pboff = gr_yzx ;
04973 
04974     } else if( w == gr_zxy && gzxy == NULL ){  
04975        gnew  = &(im3d->g312) ;
04976        brnew = im3d->b312_ulay ;
04977        pboff = gr_zxy ;
04978        mirror= GLOBAL_argopt.left_is_left ;
04979 
04980     } else
04981        EXRETURN ;  
04982 
04983 
04984 
04985     if( snew != NULL && (brnew->n1 < 2 || brnew->n2 < 2) ) EXRETURN  ;
04986 
04987     SHOW_AFNI_PAUSE ;
04988 
04989     if( snew != NULL ){
04990 STATUS("opening an image window") ;
04991       MCW_invert_widget(pboff) ;
04992       POPUP_cursorize(pboff) ;   
04993       *snew = open_MCW_imseq( im3d->dc, AFNI_brick_to_mri, (XtPointer) brnew ) ;
04994 
04995       (*snew)->parent = (XtPointer) im3d ;
04996 
04997       INIT_BKGD_LAB(im3d) ;
04998 
04999       drive_MCW_imseq( *snew, isqDR_imhelptext, (XtPointer) AFNI_image_help ) ;
05000       drive_MCW_imseq( *snew, isqDR_arrowpadon, (XtPointer) AFNI_arrowpad_help ) ;
05001       drive_MCW_imseq( *snew, isqDR_arrowpadhint , (XtPointer) AFNI_arrowpad_hint );
05002 STATUS("realizing new image viewer") ;
05003       drive_MCW_imseq( *snew, isqDR_ignore_redraws, (XtPointer) 1 ) ; 
05004       drive_MCW_imseq( *snew, isqDR_realize, NULL ) ;
05005       drive_MCW_imseq( *snew, isqDR_title, (XtPointer) im3d->window_title ) ;
05006       drive_MCW_imseq( *snew, isqDR_periodicmont,
05007                       (XtPointer)(int) im3d->vinfo->xhairs_periodic );
05008 
05009       
05010       
05011 
05012       if( mirror | m2m ){
05013          ISQ_options opt ;
05014 
05015 STATUS("setting image view to be L-R mirrored") ;
05016 
05017          ISQ_DEFAULT_OPT(opt) ;
05018          if( mirror ) opt.mirror = TRUE ;
05019          if( m2m    ) opt.scale_range = ISQ_RNG_MINTOMAX ;
05020          drive_MCW_imseq( *snew,isqDR_options  ,(XtPointer) &opt ) ;
05021       }
05022 
05023 #if 0
05024       
05025 
05026       { char *eee = getenv("AFNI_DEFAULT_OPACITY") ;
05027         if( eee != NULL ){
05028           int opval = (int) strtod( eee , NULL ) ;
05029           if( opval > 0 && opval <= 9 )
05030             drive_MCW_imseq( *snew , isqDR_setopacity , (XtPointer)opval ) ;
05031         }
05032       }
05033 
05034       
05035 
05036       drive_MCW_imseq( *snew , isqDR_setimsave ,
05037                        (XtPointer)getenv("AFNI_DEFAULT_IMSAVE") ) ;
05038 #endif
05039 
05040 #ifdef USE_SIDES
05041 #define LL 0
05042 #define RR 1
05043 #define AA 2
05044 #define PP 3
05045 #define SS 4
05046 #define II 5
05047       if( !AFNI_yesenv("AFNI_NO_SIDES_LABELS") ){
05048          static char * ssix[6] = { "Left"     , "Right"     ,
05049                                    "Anterior" , "Posterior" ,
05050                                    "Superior" , "Inferior"   } ;
05051          char * ws[4] ;
05052 
05053          if( *snew == im3d->s123 ){
05054            ws[0] = ssix[RR]; ws[1] = ssix[AA]; ws[2] = ssix[LL]; ws[3] = ssix[PP];
05055          } else if( *snew == im3d->s231 ){
05056            ws[0] = ssix[AA]; ws[1] = ssix[SS]; ws[2] = ssix[PP]; ws[3] = ssix[II];
05057          } else if( *snew == im3d->s312 ){
05058            ws[0] = ssix[RR]; ws[1] = ssix[SS]; ws[2] = ssix[LL]; ws[3] = ssix[II];
05059          } else {
05060            ws[0] = ws[1] = ws[2] = ws[3] = NULL ;
05061          }
05062 
05063 STATUS("setting image viewer 'sides'") ;
05064 
05065          drive_MCW_imseq( *snew,isqDR_winfosides,(XtPointer)ws ) ;
05066       }
05067 #undef LL
05068 #undef RR
05069 #undef AA
05070 #undef PP
05071 #undef SS
05072 #undef II
05073 #endif
05074 
05075       AFNI_toggle_drawing( im3d ) ;
05076 
05077 #ifndef DONT_INSTALL_ICONS
05078       if( afni48_good ){
05079          Pixmap pm = XmUNSPECIFIED_PIXMAP ;
05080 
05081               if( w == pb_xyz ) pm = afni48axi_pixmap ;
05082          else if( w == pb_yzx ) pm = afni48sag_pixmap ;
05083          else if( w == pb_zxy ) pm = afni48cor_pixmap ;
05084 
05085          drive_MCW_imseq( *snew, isqDR_icon , (XtPointer) pm ) ;
05086       }
05087 #endif
05088       { int ii=AFNI_controller_index(im3d) ;
05089         if( ii >= 0 )
05090          drive_MCW_imseq( *snew, isqDR_bgicon, (XtPointer)afni16_pixmap[ii] ) ;
05091       }
05092 
05093       drive_MCW_imseq( *snew, isqDR_ignore_redraws, (XtPointer) 0 ) ; 
05094 
05095       AFNI_view_setter ( im3d , *snew ) ;
05096       AFNI_range_setter( im3d , *snew ) ;  
05097 
05098     } 
05099 
05100 
05101 
05102     if( gnew != NULL && DSET_GRAPHABLE(brnew->dset) ){
05103        MCW_grapher * gr ;
05104 
05105 STATUS("opening a graph window") ;
05106 
05107        MCW_invert_widget(pboff) ;
05108        POPUP_cursorize(pboff) ;   
05109        gr = new_MCW_grapher( im3d->dc , AFNI_brick_to_mri , (XtPointer) brnew ) ;
05110        drive_MCW_grapher( gr, graDR_title, (XtPointer) im3d->window_title );
05111        drive_MCW_grapher( gr, graDR_addref_ts, (XtPointer) im3d->fimdata->fimref );
05112        drive_MCW_grapher( gr, graDR_setignore, (XtPointer) im3d->fimdata->init_ignore );
05113        drive_MCW_grapher( gr, graDR_polort, (XtPointer) im3d->fimdata->polort );
05114        drive_MCW_grapher( gr, graDR_setindex , (XtPointer) im3d->vinfo->time_index );
05115 
05116        if( im3d->type == AFNI_IMAGES_VIEW )
05117           drive_MCW_grapher( gr , graDR_fim_disable , NULL ) ; 
05118 
05119        if( mirror )                                            
05120           drive_MCW_grapher( gr , graDR_mirror , (XtPointer) 1 ) ;
05121 
05122        
05123 
05124        if( ISVALID_STATISTIC(brnew->dset->stats) ){
05125          char *eee = getenv( "AFNI_GRAPH_GLOBALBASE" ) ;  
05126          if( eee == NULL ){                               
05127            float vbot=WAY_BIG ; int ii ;
05128            for( ii=0 ; ii < brnew->dset->stats->nbstat ; ii++ )
05129              if( ISVALID_BSTAT(brnew->dset->stats->bstat[ii]) )
05130                vbot = MIN( vbot , brnew->dset->stats->bstat[ii].min ) ;
05131 
05132            if( vbot < WAY_BIG )
05133              drive_MCW_grapher( gr, graDR_setglobalbaseline, (XtPointer)&vbot );
05134          }
05135        }
05136 
05137 STATUS("realizing new grapher") ;
05138 
05139        drive_MCW_grapher( gr , graDR_realize , NULL ) ;
05140 
05141        *gnew = gr ;
05142        (*gnew)->parent = (XtPointer) im3d ;
05143 
05144 #ifndef DONT_INSTALL_ICONS
05145       if( afni48_good ){
05146          Pixmap pm = XmUNSPECIFIED_PIXMAP ;
05147 
05148               if( w == gr_xyz ) pm = afni48graaxi_pixmap ;
05149          else if( w == gr_yzx ) pm = afni48grasag_pixmap ;
05150          else if( w == gr_zxy ) pm = afni48gracor_pixmap ;
05151 
05152          drive_MCW_grapher( gr , graDR_icon , (XtPointer) pm ) ;
05153       }
05154 #endif
05155     } 
05156 
05157    
05158 
05159    AFNI_set_viewpoint( im3d , -1,-1,-1 , REDISPLAY_ALL ) ;
05160 
05161    SHOW_AFNI_READY ;
05162    RESET_AFNI_QUIT(im3d) ;
05163 
05164    MPROBE ;
05165    EXRETURN ;
05166 }
05167 
05168 
05169 
05170 
05171 
05172 
05173 #undef  GETWIN
05174 #define GETWIN(w)                                             \
05175   do{ XtVaSetValues( (w) , XmNx,(int)(event->x_root),         \
05176                            XmNy,(int)(event->y_root), NULL ); \
05177       XMapRaised( XtDisplay(w) , XtWindow(w) ) ;              \
05178   } while(0)
05179 
05180 void AFNI_viewbut_EV( Widget w , XtPointer cd ,
05181                       XEvent *ev , Boolean *continue_to_dispatch )
05182 {
05183    Three_D_View *im3d = (Three_D_View *)cd ;
05184    XButtonEvent *event=(XButtonEvent *)ev ;
05185 
05186    MCW_imseq   *sxyz , *syzx , *szxy ;
05187    MCW_grapher *gxyz , *gyzx , *gzxy ;
05188    Widget      pb_xyz , pb_yzx , pb_zxy ;
05189    Widget      gr_xyz , gr_yzx , gr_zxy ;
05190 
05191 ENTRY("AFNI_viewbut_EV") ;
05192 
05193    if( ev->type != ButtonPress || !IM3D_VALID(im3d) ) EXRETURN ;
05194    if( event->button != Button3 ) EXRETURN ;
05195 
05196    sxyz = im3d->s123 ; gxyz = im3d->g123 ;  
05197    syzx = im3d->s231 ; gyzx = im3d->g231 ;
05198    szxy = im3d->s312 ; gzxy = im3d->g312 ;
05199 
05200    pb_xyz = im3d->vwid->imag->image_xyz_pb ;  
05201    pb_yzx = im3d->vwid->imag->image_yzx_pb ;
05202    pb_zxy = im3d->vwid->imag->image_zxy_pb ;
05203 
05204    gr_xyz = im3d->vwid->imag->graph_xyz_pb ;
05205    gr_yzx = im3d->vwid->imag->graph_yzx_pb ;
05206    gr_zxy = im3d->vwid->imag->graph_zxy_pb ;
05207 
05208    
05209 
05210         if( w == pb_xyz && ISQ_REALZ(sxyz) ) GETWIN(sxyz->wtop) ;
05211    else if( w == pb_yzx && ISQ_REALZ(syzx) ) GETWIN(syzx->wtop) ;
05212    else if( w == pb_zxy && ISQ_REALZ(szxy) ) GETWIN(szxy->wtop) ;
05213    else if( w == gr_xyz && GRA_REALZ(gxyz) ) GETWIN(gxyz->fdw_graph) ;
05214    else if( w == gr_yzx && GRA_REALZ(gyzx) ) GETWIN(gyzx->fdw_graph) ;
05215    else if( w == gr_zxy && GRA_REALZ(gzxy) ) GETWIN(gzxy->fdw_graph) ;
05216 
05217    EXRETURN ;
05218 }
05219 
05220 
05221 
05222 void AFNI_redisplay_func( Three_D_View * im3d )  
05223 {
05224    AFNI_set_viewpoint( im3d , -1,-1,-1 , REDISPLAY_OVERLAY ) ;
05225    AFNI_process_funcdisplay( im3d ) ;
05226 }
05227 
05228 
05229 
05230 void AFNI_do_bkgd_lab( Three_D_View * im3d )
05231 {
05232    char str[256] ;
05233 
05234    if( !IM3D_OPEN(im3d) || !im3d->vwid->imag->do_bkgd_lab ) return ;
05235 
05236 #define VSTR(x) ( ((x)[0] == '\0') ? ("?") : (x) )
05237 
05238    sprintf(str,"ULay = %s\n"
05239                "OLay = %s\n"
05240                "Thr  = %s" ,
05241            VSTR(im3d->vinfo->anat_val),
05242            VSTR(im3d->vinfo->func_val),
05243            VSTR(im3d->vinfo->thr_val ) ) ;
05244 
05245 #undef VSTR
05246 
05247    MCW_set_widget_label( im3d->vwid->func->bkgd_lab , str ) ;
05248    XtManageChild( im3d->vwid->func->bkgd_lab ) ;
05249    FIX_SCALE_SIZE(im3d) ;
05250 }
05251 
05252 
05253 
05254 
05255 
05256 void AFNI_range_setter( Three_D_View *im3d , MCW_imseq *seq )
05257 {
05258    float rng[3] = { 0.0f, 0.0f, 0.0f } ;
05259    int ival ;
05260    FD_brick *br ;
05261    THD_3dim_dataset *ds ;
05262 
05263    if( !IM3D_OPEN(im3d) || !ISQ_VALID(seq)    ) return ;
05264    if( !AFNI_yesenv("AFNI_IMAGE_GLOBALRANGE") ) return ;
05265 
05266    br = (FD_brick *)im3d->b123_ulay ; if( br == NULL ) return ;
05267    ds = br->dset ;                    if( ds == NULL ) return ;
05268 
05269    if( EQUIV_DSETS(ds,im3d->anat_now) )      
05270      ival = im3d->vinfo->anat_index ;
05271    else if( EQUIV_DSETS(ds,im3d->fim_now) )  
05272      ival = im3d->vinfo->fim_index ;
05273    else
05274      ival = 0 ;                              
05275 
05276    if( ISVALID_STATISTIC(ds->stats) && ISVALID_BSTAT(ds->stats->bstat[ival]) ){
05277      rng[0] = ds->stats->bstat[ival].min ;
05278      rng[1] = ds->stats->bstat[ival].max ;
05279    }
05280 
05281    drive_MCW_imseq( seq , isqDR_setrange , (XtPointer) rng ) ;
05282    return ;
05283 }
05284 
05285 
05286 
05287 
05288 
05289 
05290 void AFNI_view_setter( Three_D_View *im3d , MCW_imseq *seq )
05291 {
05292    MCW_imseq *sxyz, *syzx, *szxy ;
05293    int val=-1 ;
05294 
05295    if( !IM3D_OPEN(im3d) ) return ;
05296 
05297    sxyz = im3d->s123 ; syzx = im3d->s231 ; szxy = im3d->s312 ;
05298 
05299    if( !ISQ_REALZ(seq) ){
05300      int code = 4*(sxyz!=NULL) + 2*(syzx!=NULL) + (szxy!=NULL) ;
05301      switch(code){
05302        case 4: val = AXIAL   ; break ;
05303        case 2: val = SAGITTAL; break ;
05304        case 1: val = CORONAL ; break ;
05305      }
05306    } else {
05307           if( seq == sxyz ) val = AXIAL   ;
05308      else if( seq == syzx ) val = SAGITTAL;
05309      else if( seq == szxy ) val = CORONAL ;
05310    }
05311 
05312    im3d->vinfo->view_setter = val ;
05313    return ;
05314 }
05315 
05316 
05317 
05318 void AFNI_set_viewpoint( Three_D_View * im3d ,
05319                          int xx,int yy,int zz , int redisplay_option )
05320 {
05321    int old_i1 , old_j2 , old_k3 , i1,j2,k3 ;
05322    int dim1,dim2,dim3 , isq_driver , do_lock , new_xyz ;
05323    int newti ; 
05324 
05325    THD_dataxes * daxes ;
05326    THD_fvec3 fv ;
05327    THD_ivec3 old_ib , new_ib , old_id , new_id ;
05328 
05329 ENTRY("AFNI_set_viewpoint") ;
05330 
05331 if(PRINT_TRACING)
05332 { char str[256] ;
05333   sprintf(str,"input xx=%d yy=%d zz=%d",xx,yy,zz) ;
05334   STATUS(str) ; }
05335 
05336    if( ! IM3D_OPEN(im3d) || ! ISVALID_3DIM_DATASET(im3d->anat_now) ) EXRETURN ;
05337 
05338 
05339 
05340 
05341    LOAD_DSET_VIEWS(im3d) ;
05342 
05343 
05344 
05345    daxes = CURRENT_DAXES(im3d->anat_now) ;
05346    dim1  = daxes->nxx ; dim2 = daxes->nyy ; dim3 = daxes->nzz ;
05347 
05348    old_i1 = im3d->vinfo->i1 ;
05349    old_j2 = im3d->vinfo->j2 ;
05350    old_k3 = im3d->vinfo->k3 ;
05351 
05352    i1 = im3d->vinfo->i1 = (xx < 0 || xx >= dim1) ? (old_i1) : xx ;
05353    j2 = im3d->vinfo->j2 = (yy < 0 || yy >= dim2) ? (old_j2) : yy ;
05354    k3 = im3d->vinfo->k3 = (zz < 0 || zz >= dim3) ? (old_k3) : zz ;
05355 
05356 
05357 
05358    new_xyz =
05359     do_lock = !( i1 == old_i1 && j2 == old_j2 && k3 == old_k3 ) ;  
05360 
05361    if( !redisplay_option && !new_xyz ) EXRETURN;
05362 
05363    isq_driver = (redisplay_option == REDISPLAY_ALL) ? isqDR_display
05364                                                     : isqDR_overlay ;
05365 
05366    if( !AFNI_noenv("AFNI_VALUE_LABEL") && new_xyz &&
05367        (im3d->s123 == NULL || im3d->s231 == NULL || im3d->s312 == NULL) )
05368      isq_driver = isqDR_display ;         
05369 
05370    LOAD_IVEC3(old_id,old_i1,old_j2,old_k3) ;
05371    LOAD_IVEC3(new_id,    i1,    j2,    k3) ;
05372 
05373 #ifdef AFNI_DEBUG
05374 STATUS(" ") ;
05375 DUMP_IVEC3("  old_id",old_id) ;
05376 DUMP_IVEC3("  new_id",new_id) ;
05377 #endif
05378 
05379    if( im3d->type == AFNI_3DDATA_VIEW ){
05380       fv = THD_3dind_to_3dmm( im3d->anat_now , new_id ) ;
05381       fv = THD_3dmm_to_dicomm( im3d->anat_now , fv ) ;
05382       im3d->vinfo->xi = fv.xyz[0] ;  
05383       im3d->vinfo->yj = fv.xyz[1] ;  
05384       im3d->vinfo->zk = fv.xyz[2] ;
05385    }
05386 
05387    
05388 
05389    im3d->vinfo->func_val[0] = im3d->vinfo->thr_val[0] = '\0' ;
05390    if( do_lock || isq_driver==isqDR_display )
05391       im3d->vinfo->anat_val[0] = '\0';
05392    if( !AFNI_noenv( "AFNI_VALUE_LABEL") ) AFNI_do_bkgd_lab( im3d ) ;
05393 
05394    
05395 
05396    im3d->ignore_seq_callbacks = AFNI_IGNORE_EVERYTHING ;
05397 
05398    if( im3d->s123 != NULL || im3d->g123 != NULL ){
05399       int xyzm[4] ;
05400 
05401       old_ib = THD_3dind_to_fdind( im3d->b123_ulay , old_id ) ;
05402       new_ib = THD_3dind_to_fdind( im3d->b123_ulay , new_id ) ;
05403 
05404 #ifdef AFNI_DEBUG
05405 STATUS(" ") ;
05406 DUMP_IVEC3(" redraw s123 old_ib",old_ib) ;
05407 DUMP_IVEC3("             new_ib",new_ib) ;
05408 #endif
05409 
05410       if( redisplay_option || old_ib.ijk[2] != new_ib.ijk[2] )
05411          drive_MCW_imseq( im3d->s123 ,
05412                           isq_driver , (XtPointer) new_ib.ijk[2] ) ;
05413 
05414 
05415       xyzm[0] = new_ib.ijk[0] ; xyzm[1] = new_ib.ijk[1] ;
05416       xyzm[2] = new_ib.ijk[2] ; xyzm[3] = 0 ;
05417 
05418       if( im3d->g123 != NULL && ( im3d->g123->never_drawn ||
05419                                   redisplay_option == REDISPLAY_ALL || new_xyz ) )
05420          drive_MCW_grapher( im3d->g123 , graDR_redraw , (XtPointer) xyzm ) ;
05421    }
05422 
05423    if( im3d->s231 != NULL || im3d->g231 != NULL ){
05424       int xyzm[4] ;
05425 
05426       old_ib = THD_3dind_to_fdind( im3d->b231_ulay , old_id ) ;
05427       new_ib = THD_3dind_to_fdind( im3d->b231_ulay , new_id ) ;
05428 
05429 #ifdef AFNI_DEBUG
05430 STATUS(" ") ;
05431 DUMP_IVEC3(" redraw s231 old_ib",old_ib) ;
05432 DUMP_IVEC3("             new_ib",new_ib) ;
05433 #endif
05434 
05435       if( redisplay_option || old_ib.ijk[2] != new_ib.ijk[2] )
05436          drive_MCW_imseq( im3d->s231 ,
05437                           isq_driver , (XtPointer) new_ib.ijk[2] ) ;
05438 
05439       xyzm[0] = new_ib.ijk[0] ; xyzm[1] = new_ib.ijk[1] ;
05440       xyzm[2] = new_ib.ijk[2] ; xyzm[3] = 0 ;
05441 
05442       if( im3d->g231 != NULL && ( im3d->g231->never_drawn ||
05443                                   redisplay_option == REDISPLAY_ALL || new_xyz ) )
05444          drive_MCW_grapher( im3d->g231 , graDR_redraw , (XtPointer) xyzm ) ;
05445    }
05446 
05447    if( im3d->s312 != NULL || im3d->g312 != NULL ){
05448       int xyzm[4] ;
05449 
05450       old_ib = THD_3dind_to_fdind( im3d->b312_ulay , old_id ) ;
05451       new_ib = THD_3dind_to_fdind( im3d->b312_ulay , new_id ) ;
05452 
05453 #ifdef AFNI_DEBUG
05454 STATUS(" ") ;
05455 DUMP_IVEC3(" redraw s312 old_ib",old_ib) ;
05456 DUMP_IVEC3("             new_ib",new_ib) ;
05457 #endif
05458 
05459       if( redisplay_option || old_ib.ijk[2] != new_ib.ijk[2] )
05460          drive_MCW_imseq( im3d->s312 ,
05461                           isq_driver , (XtPointer) new_ib.ijk[2] ) ;
05462 
05463       xyzm[0] = new_ib.ijk[0] ; xyzm[1] = new_ib.ijk[1] ;
05464       xyzm[2] = new_ib.ijk[2] ; xyzm[3] = 0 ;
05465 
05466       if( im3d->g312 != NULL && ( im3d->g312->never_drawn ||
05467                                   redisplay_option == REDISPLAY_ALL || new_xyz ) )
05468          drive_MCW_grapher( im3d->g312 , graDR_redraw , (XtPointer) xyzm ) ;
05469    }
05470 
05471    im3d->ignore_seq_callbacks = AFNI_IGNORE_NOTHING ;
05472 
05473    
05474 
05475    if( redisplay_option || new_xyz ){
05476       AFNI_crosshair_relabel( im3d ) ;  
05477       AFNI_do_bkgd_lab( im3d ) ;        
05478    }
05479 
05480    
05481 
05482 #if 0
05483    if( DSET_NUM_TIMES(im3d->anat_now) > 1 )
05484       newti = im3d->vinfo->time_index ;
05485    else
05486 #endif
05487       newti = im3d->vinfo->anat_index ;
05488 
05489    if( newti >= 0 ){
05490      drive_MCW_grapher( im3d->g123, graDR_setindex, (XtPointer)newti );
05491      drive_MCW_grapher( im3d->g231, graDR_setindex, (XtPointer)newti );
05492      drive_MCW_grapher( im3d->g312, graDR_setindex, (XtPointer)newti );
05493    }
05494 
05495    if( do_lock )                    
05496       AFNI_lock_carryout( im3d ) ;  
05497 
05498 
05499 
05500 
05501    if( new_xyz ) AFNI_process_viewpoint( im3d ) ;
05502    else          AFNI_process_redisplay( im3d ) ;
05503 
05504    if( new_xyz && im3d->vwid->imag->pop_whereami_twin != NULL ){
05505 
05506       char * tlab = AFNI_ttatlas_query( im3d ) ;
05507 
05508       if( tlab == NULL ){
05509          MCW_textwin_alter( im3d->vwid->imag->pop_whereami_twin ,
05510                            "\n*** Can't compute Talairach coordinates now ***\n");
05511       } else {
05512          MCW_textwin_alter( im3d->vwid->imag->pop_whereami_twin , tlab ) ;
05513          free(tlab) ;
05514       }
05515    }
05516 
05517    EXRETURN ;
05518 }
05519 
05520 
05521 
05522 
05523 
05524 
05525 MRI_IMAGE * AFNI_overlay( int n , FD_brick * br )
05526 {
05527    Three_D_View * im3d = (Three_D_View *) br->parent ;
05528    MRI_IMAGE * im = NULL , * fov = NULL ;
05529    register short * oar ;
05530    int ii,jj , npix , xx,yy,zz , nx,ny , gap,ovc , icr,jcr,kcr ;
05531    Boolean ovgood ;
05532    THD_ivec3 ib ;
05533    THD_3dim_dataset * dset ;
05534    FD_brick * br_fim ;
05535    int do_xhar ;              
05536    MRI_IMAGE *rgbov = NULL ;  
05537 
05538 ENTRY("AFNI_overlay") ;
05539 
05540    if( ! IM3D_VALID(im3d) ) RETURN(NULL) ;
05541 
05542    
05543 
05544    do_xhar = (im3d->vinfo->crosshair_visible && !AFNI_yesenv("AFNI_CROSSHAIR_LINES")) ;
05545 
05546    dset = im3d->anat_now ;
05547 
05548    ovgood =  do_xhar                                                  ||
05549 
05550             (  dset->markers != NULL       &&
05551               (dset->markers->numset > 0)  &&
05552               (im3d->vwid->marks->ov_visible == True) )               ||
05553 
05554             (  dset->tagset != NULL  &&
05555                dset->tagset->num > 0 &&
05556                (im3d->vwid->marks->tag_visible == True) )             ||
05557 
05558 #ifdef ALLOW_DATASET_VLIST
05559             ( dset->pts != NULL && im3d->vinfo->pts_visible == True ) ||
05560 #endif
05561 
05562             ( im3d->vinfo->func_visible == True )                     ||
05563 
05564             ( im3d->vinfo->see_ttatlas &&
05565               im3d->anat_now->view_type == VIEW_TALAIRACH_TYPE ) ;
05566 
05567    if( ! ovgood ) RETURN(NULL) ;
05568 
05569    
05570 
05571 if(PRINT_TRACING)
05572 { char str[256] ; sprintf(str,"n1=%d n2=%d",br->n1,br->n2) ; STATUS(str) ; }
05573 
05574    LOAD_DSET_VIEWS(im3d) ;  
05575 
05576    
05577 
05578    if( im3d->vinfo->func_visible ){
05579       br_fim = UNDERLAY_TO_OVERLAY(im3d,br) ;
05580       fov    = AFNI_func_overlay( n , br_fim ) ;
05581       if( fov != NULL && fov->kind == MRI_rgb ){ 
05582         rgbov = fov ; fov = NULL ;               
05583       }
05584    }
05585 
05586    
05587 
05588    if( im3d->vinfo->see_ttatlas &&
05589        im3d->anat_now->view_type == VIEW_TALAIRACH_TYPE ){
05590 
05591       MRI_IMAGE * tov ;
05592 
05593       int ax_1 = br->a123.ijk[0] ;
05594       int ax_2 = br->a123.ijk[1] ;
05595       int ax_3 = br->a123.ijk[2] ;
05596 
05597       tov = AFNI_ttatlas_overlay( im3d , n , ax_1 , ax_2 , ax_3 , fov ) ;
05598       if( tov != NULL && tov != fov ){
05599          if( fov != NULL ) mri_free(fov) ;  
05600          fov = tov ;
05601       }
05602    }
05603 
05604    
05605 
05606 
05607    if( fov != NULL ){
05608 
05609 if(PRINT_TRACING)
05610 { char str[256] ;
05611 sprintf(str,"new overlay from AFNI_func_overlay: nx=%d ny=%d\n",fov->nx,fov->ny) ;
05612 STATUS(str) ; }
05613 
05614       im  = fov ; ovgood = True ;
05615       oar = MRI_SHORT_PTR(im) ;
05616    } else {
05617 STATUS("new overlay is created de novo") ;
05618       im  = mri_new( br->n1 , br->n2 , MRI_short ) ; ovgood = False ;
05619       oar = MRI_SHORT_PTR(im) ;
05620    }
05621 
05622    nx     = im->nx ;
05623    ny     = im->ny ;
05624    npix   = nx * ny ;
05625    im->dx = br->del1 ;  
05626    im->dy = br->del2 ;
05627    im->dz = br->del3 ;
05628 
05629    
05630 
05631    if( do_xhar ){
05632       MCW_grapher * grapher = UNDERLAY_TO_GRAPHER(im3d,br) ;
05633 
05634       ib = THD_3dind_to_fdind( br ,
05635                               TEMP_IVEC3( im3d->vinfo->i1 ,
05636                                           im3d->vinfo->j2 ,
05637                                           im3d->vinfo->k3  ) ) ;
05638 
05639 
05640 
05641 
05642 
05643 
05644 
05645 
05646 
05647 
05648 
05649 
05650 
05651 
05652       if( n == ib.ijk[2] || im3d->vinfo->xhairs_all ){
05653          int jp,ip , jcen,icen , gappp ;
05654          int idown,iup,iskip , jdown,jup,jskip , imon,jmon ;
05655          int a1 = br->a123.ijk[0] ,   
05656              ax = abs(a1) - 1       ; 
05657          int a2 = br->a123.ijk[1] ,   
05658              ay = abs(a2) - 1       ; 
05659          int a3 = br->a123.ijk[2] ,   
05660              az = abs(a3) - 1       ; 
05661 
05662          
05663 
05664          int ox = (ax==0) ? br->dset->daxes->xxorient :
05665                   (ax==1) ? br->dset->daxes->yyorient : br->dset->daxes->zzorient ;
05666 
05667          int oy = (ay==0) ? br->dset->daxes->xxorient :
05668                   (ay==1) ? br->dset->daxes->yyorient : br->dset->daxes->zzorient ;
05669 
05670          ovc  = im3d->vinfo->crosshair_ovcolor ;
05671          gap  = (grapher==NULL) ? im3d->vinfo->crosshair_gap : (grapher->mat+1)/2 ;
05672          icen = ib.ijk[0] ;
05673          jcen = ib.ijk[1] ;
05674 
05675 
05676 
05677          if( im3d->vinfo->xhairs_show_montage ){           
05678             iskip = im3d->vinfo->xhairs_nskip.ijk[ax] + 1 ;
05679             jskip = im3d->vinfo->xhairs_nskip.ijk[ay] + 1 ;
05680             if( a1 > 0 ){
05681                idown = im3d->vinfo->xhairs_ndown.ijk[ax] ;
05682                iup   = im3d->vinfo->xhairs_nup.ijk[ax] ;
05683             } else {
05684                iup   = im3d->vinfo->xhairs_ndown.ijk[ax] ;
05685                idown = im3d->vinfo->xhairs_nup.ijk[ax] ;
05686             }
05687             if( a2 > 0 ){
05688                jdown = im3d->vinfo->xhairs_ndown.ijk[ay] ;
05689                jup   = im3d->vinfo->xhairs_nup.ijk[ay] ;
05690             } else {
05691                jup   = im3d->vinfo->xhairs_ndown.ijk[ay] ;
05692                jdown = im3d->vinfo->xhairs_nup.ijk[ay] ;
05693             }
05694 
05695 if(PRINT_TRACING)
05696 { char str[256] ;
05697   sprintf(str,"montage xhairs: ax   =%d ay   =%d az =%d",ax,ay,az)       ; STATUS(str);
05698   sprintf(str,"                iskip=%d idown=%d iup=%d",iskip,idown,iup); STATUS(str);
05699   sprintf(str,"                jskip=%d jdown=%d jup=%d",jskip,jdown,jup); STATUS(str);
05700   sprintf(str,"orimask=%d ox=%d oy=%d",im3d->vinfo->xhairs_orimask,ox,oy); STATUS(str);
05701 }
05702 
05703          } else {                                          
05704            idown = iup = jdown = jup = iskip = jskip = 0 ;
05705            if( grapher != NULL ){ idown=-(iup+1); jdown=-(jup+1); } 
05706          }
05707 
05708          
05709 
05710          if( (im3d->vinfo->xhairs_orimask & (1<<oy)) != 0 ){  
05711             for( imon=-idown ; imon <= iup ; imon++ ){
05712                icr = icen + imon * iskip ;
05713 
05714                if( im3d->vinfo->xhairs_periodic ){
05715                   while( icr < 0 )   icr += nx ;
05716                   while( icr >= nx ) icr -= nx ;
05717                } else {
05718                   if( icr < 0 || icr >= nx ) continue ;
05719                }
05720 
05721                gappp = (abs(icr-icen) <= gap) ? gap : -1 ; 
05722 
05723                
05724 
05725                if( idown+iup > 0 && iskip == 1 && icr != icen ){
05726                   for( jj=(imon+idown)%2 ; jj < ny ; jj+=2 )
05727                      if( abs(jj-jcen) > gappp ) oar[icr+nx*jj] = ovc ;
05728                } else {
05729                   for( jj=0 ; jj < ny ; jj++ )
05730                      if( abs(jj-jcen) > gappp ) oar[icr+nx*jj] = ovc ;
05731                }
05732             }
05733          }
05734 
05735          
05736 
05737          if( (im3d->vinfo->xhairs_orimask & (1<<ox)) != 0 ){  
05738             for( jmon=-jdown ; jmon <= jup ; jmon++ ){
05739                jcr = jcen + jmon * jskip ;
05740                if( im3d->vinfo->xhairs_periodic ){
05741                   while( jcr < 0 )   jcr += ny ;
05742                   while( jcr >= ny ) jcr -= ny ;
05743                } else {
05744                   if( jcr < 0 || jcr >= ny ) continue ;
05745                }
05746 
05747                gappp = (abs(jcr-jcen) <= gap) ? gap : -1 ;  
05748 
05749                
05750 
05751                if( jdown+jup > 0 && jskip == 1 && jcr != jcen ){
05752                   for( ii=(jmon+jdown)%2 ; ii < nx ; ii+=2 )
05753                      if( abs(ii-icen) > gappp ) oar[ii+nx*jcr] = ovc ;
05754                } else {
05755                   for( ii=0 ; ii < nx ; ii++ )
05756                      if( abs(ii-icen) > gappp ) oar[ii+nx*jcr] = ovc ;
05757                }
05758             }
05759          }
05760 
05761          
05762 
05763          if( grapher != NULL ){
05764             int gs = gap , gb = (grapher->mat +2)/2 ;
05765 
05766             jcr = jcen ; icr = icen ;
05767 
05768             ip = icr - gb ; if( ip <  0  ) ip += nx ;
05769             ii = icr + gs ; if( ii >= nx ) ii -= nx ;
05770             for( jj=jcr-gb ; jj <= jcr+gs ; jj++ ){
05771                jp = jj ; if( jp <  0  ) jp += ny ;
05772                     else if( jp >= ny ) jp -= ny ;
05773                oar[ip+nx*jp] = ovc ;
05774                oar[ii+nx*jp] = ovc ;
05775             }
05776 
05777             jp = jcr - gb ; if( jp <  0  ) jp += ny ;
05778             jj = jcr + gs ; if( jj >= ny ) jj -= ny ;
05779             for( ii=icr-gb ; ii <= icr+gs ; ii++ ){
05780               ip = ii ; if( ip <  0  ) ip += nx ;
05781                    else if( ip >= nx ) ip -= nx ;
05782               oar[ip+nx*jp] = ovc ;
05783               oar[ip+nx*jj] = ovc ;
05784             }
05785          } 
05786 
05787          ovgood = True ;
05788       } 
05789 
05790    } 
05791 
05792    
05793 
05794    if( im3d->anat_now->markers != NULL &&
05795        im3d->anat_now->markers->numset > 0 &&
05796        (im3d->vwid->marks->ov_visible == True) ){
05797 
05798       THD_marker_set     * markers = im3d->anat_now->markers ;
05799       AFNI_marks_widgets * marks   = im3d->vwid->marks ;
05800       AFNI_ovtemplate    * tem     = &(marks->ov_mask) ;
05801       int xbase , ybase , zbase , color ;
05802       THD_ivec3 ib ;
05803 
05804       
05805 
05806       color = marks->ov_scolor ;
05807 
05808       for( jj=0 ; jj < MARKS_MAXNUM ; jj++ ){
05809          if( markers->valid[jj] &&     
05810              color > 0          &&     
05811              !marks->isprimary[jj] ){  
05812 
05813             ib = THD_3dmm_to_3dind( br->dset ,
05814                                     TEMP_FVEC3( markers->xyz[jj][0] ,
05815                                                 markers->xyz[jj][1] ,
05816                                                 markers->xyz[jj][2]  ) ) ;
05817             ib = THD_3dind_to_fdind( br , ib ) ;
05818 
05819             xbase = ib.ijk[0] ;  
05820             ybase = ib.ijk[1] ;  
05821             zbase = ib.ijk[2] ;  
05822 
05823             if( zbase == n ){  
05824                ovgood = True ;
05825                for( ii=0 ; ii < tem->numpix ; ii++ ){
05826                   xx = xbase + tem->dx[ii] ;
05827                   yy = ybase + tem->dy[ii] ;
05828                   if( xx >= 0 && xx < nx && yy >=0 && yy < ny )
05829                                               oar[xx+nx*yy] = color ;
05830                }
05831             }
05832          } 
05833       } 
05834 
05835       
05836 
05837       color = marks->ov_pcolor ;
05838 
05839       for( jj=0 ; jj < MARKS_MAXNUM ; jj++ ){
05840          if( markers->valid[jj] &&     
05841              color > 0          &&     
05842              marks->isprimary[jj]  ){  
05843 
05844             ib = THD_3dmm_to_3dind( br->dset ,
05845                                     TEMP_FVEC3( markers->xyz[jj][0] ,
05846                                                 markers->xyz[jj][1] ,
05847                                                 markers->xyz[jj][2]  ) ) ;
05848             ib = THD_3dind_to_fdind( br , ib ) ;
05849 
05850             xbase = ib.ijk[0] ;  
05851             ybase = ib.ijk[1] ;  
05852             zbase = ib.ijk[2] ;  
05853 
05854             if( zbase == n ){  
05855                ovgood = True ;
05856                for( ii=0 ; ii < tem->numpix ; ii++ ){
05857                   xx = xbase + tem->dx[ii] ;
05858                   yy = ybase + tem->dy[ii] ;
05859                   if( xx >= 0 && xx < nx && yy >=0 && yy < ny )
05860                                               oar[xx+nx*yy] = color ;
05861                }
05862             }
05863          } 
05864       } 
05865 
05866    } 
05867 
05868    
05869 
05870    if( im3d->anat_now->tagset != NULL  &&
05871        im3d->anat_now->tagset->num > 0 &&
05872        (im3d->vwid->marks->tag_visible == True) ){
05873 
05874       static AFNI_ovtemplate * tem = NULL ;
05875       static int             npold = -1 ;
05876 
05877       THD_usertaglist * tl = im3d->anat_now->tagset ;
05878       int xbase , ybase , zbase , color , np ;
05879       THD_ivec3 ib ;
05880       THD_fvec3 fb ;
05881 
05882       if( tem == NULL ) tem = myXtNew(AFNI_ovtemplate) ; 
05883       np = MAX(nx,ny)/64 ; np = MAX(np,2) ;
05884       if( np != npold ){ npold = np ; AFNI_make_tagmask(np,0,tem) ; }
05885 
05886       color = im3d->vwid->marks->ov_pcolor ;  
05887 
05888       for( jj=0 ; jj < tl->num ; jj++ ){
05889          if( tl->tag[jj].set && color > 0 ){
05890 
05891             fb = THD_dicomm_to_3dmm( br->dset, TEMP_FVEC3( tl->tag[jj].x ,
05892                                                            tl->tag[jj].y ,
05893                                                            tl->tag[jj].z  ) );
05894             ib = THD_3dmm_to_3dind( br->dset , fb ) ;
05895             ib = THD_3dind_to_fdind( br , ib ) ;
05896 
05897             xbase = ib.ijk[0] ;  
05898             ybase = ib.ijk[1] ;  
05899             zbase = ib.ijk[2] ;  
05900 
05901             if( zbase == n ){  
05902                ovgood = True ;
05903                for( ii=0 ; ii < tem->numpix ; ii++ ){
05904                   xx = xbase + tem->dx[ii] ;
05905                   yy = ybase + tem->dy[ii] ;
05906                   if( xx >= 0 && xx < nx && yy >=0 && yy < ny )
05907                                               oar[xx+nx*yy] = color ;
05908                }
05909             }
05910          }
05911       }
05912    } 
05913 
05914 #ifdef ALLOW_DATASET_VLIST
05915    
05916 
05917    if( im3d->vinfo->pts_visible   &&
05918        dset->pts != NULL          &&
05919        im3d->vinfo->pts_color > 0   ){
05920 
05921       int color , jj ;
05922       THD_ivec3 ib ;
05923 
05924       color = im3d->vinfo->pts_color ;
05925 
05926       for( jj=0 ; jj < dset->pts->num ; jj++ ){
05927          ib = THD_3dind_to_fdind( br , dset->pts->ijk[jj] ) ;
05928          if( ib.ijk[2] == n ){
05929             oar[ ib.ijk[0] + nx * ib.ijk[1] ] = color ;
05930             ovgood = True ;
05931          }
05932       }
05933    }
05934 #endif
05935 
05936    
05937 
05938    if( !ovgood ) KILL_1MRI(im) ;
05939 
05940    
05941 
05942 
05943 
05944    if( rgbov != NULL ){
05945      if( im != NULL ){
05946        MRI_IMAGE *qim ;
05947        qim = ISQ_overlay( im3d->dc , rgbov , im , 1.0 ) ;
05948        mri_free(rgbov); mri_free(im); rgbov = qim;
05949      }
05950      im = rgbov ;
05951    }
05952 
05953    RETURN( im ) ;
05954 }
05955 
05956 
05957 
05958 XmString AFNI_crosshair_label( Three_D_View * im3d )
05959 {
05960    char buf[128] ;
05961    XmString xstr ;
05962    static char * RR="[R]" , * LL="[L]" ,
05963                * PP="[P]" , * AA="[A]" ,
05964                * SS="[S]" , * II="[I]" , * ZZ="   " ;
05965    char * xx , * yy , * zz ;
05966    float xval,yval,zval ;
05967 
05968 ENTRY("AFNI_crosshair_label") ;
05969 
05970    if( ! IM3D_VALID(im3d) ) RETURN( NULL );
05971 
05972    if( ! IM3D_OPEN(im3d) ){
05973 
05974       buf[0] = '\0' ;
05975       if( im3d->type != AFNI_IMAGES_VIEW ) strcat(buf," \n") ;
05976       strcat(buf, "1234567890123456789\n"
05977                   "1234567890123456789\n"
05978                   "1234567890123456789"  ) ;
05979 
05980    } else if( im3d->type == AFNI_IMAGES_VIEW || im3d->vinfo->show_voxind ){
05981 
05982 STATUS("voxel indexes") ;
05983 
05984       if( ISVALID_3DIM_DATASET(im3d->fim_now) &&
05985           im3d->vinfo->func_visible && DSET_INMEMORY(im3d->fim_now) ){
05986          THD_fvec3 fv ;
05987          THD_ivec3 iv ;
05988          int flag ;
05989 
05990          flag = im3d->fim_now->wod_flag ;
05991          im3d->fim_now->wod_flag = False ;
05992 
05993          fv = THD_dicomm_to_3dmm( im3d->fim_now ,
05994                                   TEMP_FVEC3(im3d->vinfo->xi,im3d->vinfo->yj,im3d->vinfo->zk) ) ;
05995          iv = THD_3dmm_to_3dind( im3d->fim_now , fv ) ;
05996 
05997          im3d->fim_now->wod_flag = flag ;
05998 
05999          sprintf( buf , "x: an=%4d fun=%4d\ny: an=%4d fun=%4d\nz: an=%4d fun=%4d" ,
06000                   im3d->vinfo->i1,iv.ijk[0] ,
06001                   im3d->vinfo->j2,iv.ijk[1] ,
06002                   im3d->vinfo->k3,iv.ijk[2]  ) ;
06003       } else {
06004          sprintf( buf , "voxel x = %4d\nvoxel y = %4d\nvoxel z = %4d" ,
06005                   im3d->vinfo->i1 , im3d->vinfo->j2 , im3d->vinfo->k3  ) ;
06006       }
06007    } else {
06008       char bxyz[3][32] , *cname ;
06009 
06010 STATUS("voxel coordinates") ;
06011 
06012       xval = im3d->vinfo->xi ;
06013       yval = im3d->vinfo->yj ;
06014       zval = im3d->vinfo->zk ;
06015 
06016       xx = (xval==0.0) ? (ZZ) : ( (xval<0.0) ? (RR) : (LL) ) ;
06017       yy = (yval==0.0) ? (ZZ) : ( (yval<0.0) ? (AA) : (PP) ) ;
06018       zz = (zval==0.0) ? (ZZ) : ( (zval<0.0) ? (II) : (SS) ) ;
06019 
06020 
06021 #if 1
06022       sprintf( bxyz[0] , "=%9.3f mm %s" ,
06023                GLOBAL_library.cord.xxsign * xval , xx ) ;
06024 
06025       sprintf( bxyz[1] , "=%9.3f mm %s" ,
06026                GLOBAL_library.cord.yysign * yval , yy ) ;
06027 
06028       sprintf( bxyz[2] , "=%9.3f mm %s" ,
06029                GLOBAL_library.cord.zzsign * zval , zz ) ;
06030 
06031       if( strcmp(GLOBAL_library.cord.orcode,"RAI") == 0 )
06032         cname = "=DICOM" ;
06033       else if( strcmp(GLOBAL_library.cord.orcode,"LPI") == 0 )
06034         cname = "=SPM  " ;
06035       else
06036         cname = "      " ;
06037 
06038       sprintf( buf , "[order: %s%s]\nx %17s\ny %17s\nz %17s"   ,
06039                GLOBAL_library.cord.orcode       , cname ,
06040                bxyz[GLOBAL_library.cord.first]  ,
06041                bxyz[GLOBAL_library.cord.second] ,
06042                bxyz[GLOBAL_library.cord.third]   ) ;
06043 #else
06044       sprintf( buf , "x =%9.3f mm %s\ny =%9.3f mm %s\nz =%9.3f mm %s" ,
06045                xval,xx , yval,yy , zval,zz ) ;
06046 #endif
06047    }
06048 
06049    xstr = XmStringCreateLtoR( buf , XmFONTLIST_DEFAULT_TAG ) ;
06050 
06051    RETURN( xstr ) ;
06052 }
06053 
06054 
06055 
06056 
06057 
06058 
06059 void AFNI_marktog_CB( Widget w ,
06060                       XtPointer client_data , XtPointer call_data )
06061 {
06062    Three_D_View * im3d = (Three_D_View *) client_data ;
06063    XmToggleButtonCallbackStruct * cbs =
06064          (XmToggleButtonCallbackStruct *) call_data ;
06065 
06066    int bval , ip , xx=-1 , yy=-1 , zz=-1 ;
06067    Widget * other_tog ;
06068 
06069 ENTRY("AFNI_marktog_CB") ;
06070 
06071    if( ! IM3D_VALID(im3d) || im3d->anat_now->markers == NULL ) EXRETURN ;
06072 
06073    switch( cbs->reason ){
06074 
06075       default:  XBell(XtDisplay(w),100) ; EXRETURN ;  
06076 
06077       case XmCR_DISARM:   
06078          bval      = AFNI_first_tog( MARKS_MAXNUM ,
06079                                      im3d->vwid->marks->tog ) ;
06080          other_tog = im3d->vwid->marks->poptog ;
06081       break ;
06082 
06083       case XmCR_VALUE_CHANGED:  
06084          bval = AFNI_first_tog( MARKS_MAXNUM ,
06085                                 im3d->vwid->marks->poptog ) ;
06086          other_tog = im3d->vwid->marks->tog ;
06087       break ;
06088    }
06089 
06090    
06091 
06092 
06093 
06094    AFNI_set_tog( bval , MARKS_MAXNUM , other_tog ) ;
06095 
06096    
06097 
06098    for( ip=0 ; ip < MARKS_MAXNUM ; ip++ )
06099       im3d->vwid->marks->isprimary[ip] = False ;
06100 
06101    if( bval >= 0 ){
06102       im3d->vwid->marks->isprimary[bval] = True ;
06103 
06104       if( im3d->anat_now->markers->valid[bval] ){  
06105          THD_ivec3 ib ;
06106 
06107          LOAD_ANAT_VIEW(im3d) ;  
06108          ib = THD_3dmm_to_3dind(
06109                  im3d->anat_now ,
06110                  TEMP_FVEC3( im3d->anat_now->markers->xyz[bval][0] ,
06111                              im3d->anat_now->markers->xyz[bval][1] ,
06112                              im3d->anat_now->markers->xyz[bval][2]  )) ;
06113 
06114          xx = ib.ijk[0] ; yy = ib.ijk[1] ; zz = ib.ijk[2] ;  
06115          SAVE_VPT(im3d) ;  
06116       }
06117    }
06118 
06119    if( im3d->anat_now->markers->numset > 0 ){
06120       AFNI_set_viewpoint( im3d , xx,yy,zz , REDISPLAY_OVERLAY ) ;  
06121    }
06122 
06123    RESET_AFNI_QUIT(im3d) ;
06124    EXRETURN ;
06125 }
06126 
06127 void AFNI_set_tog( int nset , int ntog , Widget * tog )
06128 {
06129    int ib ;
06130 
06131 ENTRY("AFNI_set_tog") ;
06132 
06133    for( ib=0 ; ib < ntog ; ib++ )
06134       XmToggleButtonSetState( tog[ib] , ib==nset , False ) ;
06135 
06136    EXRETURN ;
06137 }
06138 
06139 int AFNI_first_tog( int ntog , Widget * tog )
06140 {
06141    int ib ;
06142 
06143 ENTRY("AFNI_first_tog") ;
06144 
06145    for( ib=0 ; ib < ntog ; ib++ )
06146       if( XmToggleButtonGetState(tog[ib]) ) break ;
06147 
06148    if( ib >= ntog ) ib = -1 ;
06149    RETURN(ib) ;
06150 }
06151 
06152 #if 0
06153 int AFNI_all_tog( int ntog , Widget * tog )
06154 {
06155    int ib , val = 0 ;
06156 
06157    for( ib=0 ; ib < ntog ; ib++ )
06158       if( XmToggleButtonGetState(tog[ib]) ) val |= (1<<ib) ;
06159    return val ;
06160 }
06161 #endif
06162 
06163 
06164 
06165 
06166 
06167 void AFNI_marks_action_CB( Widget w ,
06168                            XtPointer client_data , XtPointer call_data )
06169 {
06170    Three_D_View * im3d = (Three_D_View *) client_data ;
06171    int itog , ipt , setmask , vwarp ;
06172    Boolean sens , transformable ;
06173    THD_marker_set * markers ;
06174    AFNI_marks_widgets * marks ;
06175    THD_fvec3 fv ;
06176 
06177 ENTRY("AFNI_marks_action_CB") ;
06178 
06179    
06180 
06181    if( ! IM3D_VALID(im3d) ) EXRETURN ;
06182 
06183    marks = im3d->vwid->marks ;
06184 
06185    
06186 
06187    if( w == NULL ){  
06188 
06189       Boolean redisplay ;
06190 
06191       MCW_set_bbox( marks->edits_bbox , 0 ) ;
06192       AFNI_marks_edits_CB( NULL , (XtPointer) im3d , NULL ) ;
06193 
06194       MCW_set_bbox( im3d->vwid->view->see_marks_bbox ,
06195                     marks->old_visible ? 1 : 0 ) ;
06196       AFNI_see_marks_CB( NULL , (XtPointer) im3d , NULL ) ;
06197 
06198       redisplay = ! marks->old_visible ;
06199 
06200       for( ipt=0 ; ipt < MARKS_MAXNUM ; ipt++ ){  
06201          redisplay = ( redisplay ||  marks->isprimary[ipt] == True ) ;
06202          marks->isprimary[ipt] = False ;          
06203       }
06204 
06205       CLOSE_PANEL(im3d,marks) ;  
06206 
06207       if( redisplay )
06208          AFNI_set_viewpoint( im3d , -1,-1,-1 , REDISPLAY_OVERLAY ) ;  
06209 
06210       
06211 
06212       if( im3d->anat_now->markers != NULL && marks->changed ){
06213 #if 0
06214          (void) MCW_popup_message(
06215                    im3d->vwid->view->define_marks_pb ,
06216                    "Saved changed markers\nto dataset disk file." ,
06217                    MCW_USER_KILL | MCW_TIMER_KILL ) ;
06218 #endif
06219 
06220          tross_Append_History( im3d->anat_now , "AFNI: markers were edited" ) ;
06221          (void) THD_write_3dim_dataset( NULL,NULL , im3d->anat_now , False ) ;
06222       }
06223 
06224       EXRETURN ;
06225    }
06226 
06227    
06228 
06229    if( w == marks->action_quality_pb ){
06230       transformable = AFNI_marks_quality_check(True,im3d) ;
06231       SENSITIZE( marks->transform_pb , transformable ) ;
06232       EXRETURN ;
06233    }
06234 
06235    
06236 
06237    markers = im3d->anat_now->markers ;
06238    if( markers == NULL ) EXRETURN ;  
06239 
06240    
06241 
06242    itog = AFNI_first_tog( MARKS_MAXNUM , marks->tog ) ;
06243 
06244    if( itog < 0 || ! marks->editable ){
06245       XBell(XtDisplay(w),100) ;  
06246       EXRETURN ;
06247    }
06248 
06249    ipt = itog ;  
06250 
06251    
06252 
06253    if( w == marks->action_set_pb || w == marks->pop_set_pb ){
06254 
06255       if( ! markers->valid[ipt] ) (markers->numset) ++ ;  
06256 
06257 if(PRINT_TRACING)
06258 { char str[256] ;
06259   sprintf(str,"set #%d numset=%d",ipt,markers->numset) ;
06260   STATUS(str) ; }
06261 
06262       markers->valid[ipt] = True ;
06263 
06264       LOAD_ANAT_VIEW(im3d) ;  
06265 
06266       fv = THD_3dind_to_3dmm( im3d->anat_now ,    
06267                               TEMP_IVEC3( im3d->vinfo->i1 ,
06268                                           im3d->vinfo->j2 ,
06269                                           im3d->vinfo->k3  ) ) ;
06270 
06271       markers->xyz[ipt][0] = fv.xyz[0] ;  
06272       markers->xyz[ipt][1] = fv.xyz[1] ;
06273       markers->xyz[ipt][2] = fv.xyz[2] ;
06274 
06275       
06276 
06277       if( ! marks->inverted[itog] ){
06278          MCW_invert_widget( marks->tog[itog] ) ;
06279          MCW_invert_widget( marks->poptog[itog] ) ;
06280          marks->inverted[itog] = True ;
06281       }
06282 
06283       marks->changed = True ;  
06284    }
06285 
06286    
06287 
06288    else if( w == marks->action_clear_pb || w == marks->pop_clear_pb ){
06289 
06290       if( ! markers->valid[ipt] ){
06291          XBell(XtDisplay(w),100) ;  
06292          EXRETURN ;
06293       } else {
06294          (markers->numset) -- ;   
06295          marks->changed = True ;  
06296       }
06297 
06298 if(PRINT_TRACING)
06299 { char str[256] ;
06300   sprintf(str,"clr #%d numset=%d",ipt,markers->numset) ;
06301   STATUS(str) ; }
06302 
06303       markers->valid[ipt] = False ;
06304 
06305       
06306 
06307       if( marks->inverted[itog] ){
06308          MCW_invert_widget( marks->tog[itog] ) ;
06309          MCW_invert_widget( marks->poptog[itog] ) ;
06310          marks->inverted[itog] = False ;
06311       }
06312    }
06313 
06314    
06315 
06316    vwarp         = WARPED_VIEW(im3d->vinfo->view_type) ;
06317    transformable = marks->editable                         &&
06318                    (markers->aflags[1] != MARKACTION_NONE) &&
06319                    (markers->numdef == markers->numset)    &&
06320                    ISVALID_VIEW(vwarp)                       ;
06321 
06322    SENSITIZE( marks->action_quality_pb , transformable ) ;
06323    SENSITIZE( marks->transform_pb      , False ) ;  
06324 
06325    
06326 
06327    AFNI_set_viewpoint( im3d , -1,-1,-1 , REDISPLAY_OVERLAY ) ;
06328    RESET_AFNI_QUIT(im3d) ;
06329    EXRETURN ;
06330 }
06331 
06332 
06333 
06334 
06335 
06336 void AFNI_resam_vox_av_CB( MCW_arrowval * av , XtPointer cd )
06337 {
06338    Three_D_View * im3d = (Three_D_View *) cd ;
06339 
06340 ENTRY("AFNI_resam_vox_av_CB") ;
06341 
06342    if( ! IM3D_VALID(im3d) ) EXRETURN ;
06343 
06344    if( av == im3d->vwid->dmode->resam_vox_av ){
06345       im3d->vinfo->resam_vox = av->fval ;
06346       SHOW_AFNI_PAUSE ;
06347       im3d->vinfo->tempflag = 1 ;
06348       AFNI_modify_viewing( im3d , True ) ;  
06349       SHOW_AFNI_READY ;
06350    }
06351    RESET_AFNI_QUIT(im3d) ;
06352    EXRETURN ;
06353 }
06354 
06355 
06356 
06357 
06358 
06359 
06360 void AFNI_marks_disp_av_CB( MCW_arrowval * av , XtPointer client_data )
06361 {
06362    Three_D_View * im3d = (Three_D_View *) client_data ;
06363    int ipx = av->ival ;
06364 
06365 ENTRY("AFNI_marks_disp_av_CB") ;
06366 
06367    if( ! IM3D_VALID(im3d) ) EXRETURN ;
06368 
06369           if( av == im3d->vwid->marks->disp_pcolor_av ){
06370 
06371             im3d->vwid->marks->ov_pcolor = ipx ;
06372 
06373    } else if( av == im3d->vwid->marks->disp_scolor_av ){
06374 
06375             im3d->vwid->marks->ov_scolor = ipx ;
06376 
06377    } else if( av == im3d->vwid->marks->disp_size_av ){
06378 
06379             im3d->vwid->marks->ov_size = ipx ;
06380 
06381             AFNI_make_ptmask( im3d->vwid->marks->ov_size ,
06382                               im3d->vwid->marks->ov_gap ,
06383                                &(im3d->vwid->marks->ov_mask) ) ;
06384 
06385    } else if( av == im3d->vwid->marks->disp_gap_av ){
06386 
06387             im3d->vwid->marks->ov_gap = ipx ;
06388 
06389             AFNI_make_ptmask( im3d->vwid->marks->ov_size ,
06390                               im3d->vwid->marks->ov_gap ,
06391                                &(im3d->vwid->marks->ov_mask) ) ;
06392 
06393    } else
06394       EXRETURN ;  
06395 
06396    
06397 
06398    if( im3d->anat_now->tagset != NULL ||
06399       (im3d->anat_now->markers != NULL && im3d->anat_now->markers->numset > 0) ){
06400 
06401       AFNI_set_viewpoint( im3d , -1,-1,-1 , REDISPLAY_OVERLAY ) ;
06402    }
06403 
06404    RESET_AFNI_QUIT(im3d) ;
06405    EXRETURN ;
06406 }
06407 
06408 
06409 
06410 #define PUTPIX(x,y) (tem->dx[npix] = (x) , tem->dy[npix++] = (y))
06411 #define CHKPIX      if( npix >= MAXOVPIX ) break
06412 
06413 void AFNI_make_ptmask( int size , int gap , AFNI_ovtemplate * tem )
06414 {
06415    register int ix , npix=0 , ax ;
06416 
06417 ENTRY("AFNI_make_ptmask") ;
06418 
06419    for( ix=-size ; ix <= size ; ix++ ){
06420       PUTPIX(ix,-size) ; CHKPIX ;
06421       PUTPIX(ix, size) ; CHKPIX ;
06422       ax = abs(ix) ;
06423       if( ax != size ){ PUTPIX( size,ix); CHKPIX; PUTPIX(-size,ix); CHKPIX; }
06424       if( ax >  gap  ){ PUTPIX(ix,0)    ; CHKPIX; PUTPIX(0,ix)    ; CHKPIX; }
06425    }
06426 
06427    tem->numpix = npix ;
06428    EXRETURN ;
06429 }
06430 
06431 
06432 
06433 void AFNI_make_tagmask( int size , int gap , AFNI_ovtemplate * tem )
06434 {
06435    register int ix , npix=0 , ax ;
06436 
06437 ENTRY("AFNI_make_tagmask") ;
06438 
06439    PUTPIX(-size,0) ; PUTPIX(size,0) ;
06440    for( ix=-size+1 ; ix < size ; ix++ ){
06441       ax = abs(ix) ;
06442       PUTPIX(ix,ax-size) ; CHKPIX ;
06443       PUTPIX(ix,size-ax) ; CHKPIX ;
06444 
06445       if( ax > gap ){ PUTPIX(ix,0); CHKPIX; PUTPIX(0,ix); CHKPIX; }
06446    }
06447 
06448    tem->numpix = npix ;
06449    EXRETURN ;
06450 }
06451 
06452 
06453 
06454 
06455 
06456 
06457 void AFNI_switchview_CB( Widget w ,
06458                          XtPointer client_data , XtPointer call_data )
06459 {
06460    Three_D_View * im3d = (Three_D_View *) client_data ;
06461    int bval ;
06462 
06463 ENTRY("AFNI_switchview_CB") ;
06464 
06465    if( ! IM3D_VALID(im3d) ) EXRETURN ;
06466 
06467    bval = AFNI_first_tog( LAST_VIEW_TYPE+1 ,
06468                           im3d->vwid->view->view_bbox->wbut ) ;
06469 
06470    if( bval < 0 || bval == im3d->vinfo->view_type ) EXRETURN ;
06471    if( im3d->anat_dset[bval] == NULL ) EXRETURN ;
06472 
06473    SHOW_AFNI_PAUSE ;
06474 
06475    POPDOWN_strlist_chooser ;                        
06476 
06477    im3d->vinfo->view_type = bval ;                  
06478    AFNI_initialize_view( im3d->anat_now , im3d ) ;  
06479 
06480    SHOW_AFNI_READY ;
06481    RESET_AFNI_QUIT(im3d) ;
06482    EXRETURN ;
06483 }
06484 
06485 
06486 
06487 
06488 
06489 void AFNI_purge_unused_dsets(void)
06490 {
06491    AFNI_purge_dsets( 0 ) ;
06492 }
06493 
06494 void AFNI_purge_dsets( int doall )
06495 {
06496    int icc , iss , idd , ivv ;
06497    Three_D_View * im3d ;
06498    THD_session  * sess ;
06499    THD_sessionlist * ssl = GLOBAL_library.sslist ;
06500    THD_3dim_dataset * dset ;
06501 
06502 ENTRY("AFNI_purge_dsets") ;
06503 
06504    
06505 
06506    if( ! ISVALID_SESSIONLIST(ssl) || ssl->num_sess <= 0 ) EXRETURN ;
06507 
06508    
06509 
06510    for( iss=0 ; iss < ssl->num_sess ; iss++ ){
06511       sess = ssl->ssar[iss] ;
06512 
06513       
06514 
06515       for( idd=0 ; idd < sess->num_dsset ; idd++ ){
06516          for( ivv=FIRST_VIEW_TYPE ; ivv <= LAST_VIEW_TYPE ; ivv++ ){
06517 
06518             dset = sess->dsset[idd][ivv] ;
06519             if( dset == NULL ) continue ;
06520             if( doall ){ PURGE_DSET(dset) ; continue ; }
06521 
06522             
06523 
06524             for( icc=0 ; icc < MAX_CONTROLLERS ; icc++ ){
06525                im3d = GLOBAL_library.controllers[icc] ;
06526                if( IM3D_VALID(im3d) &&
06527                    ((dset==im3d->anat_now) ||
06528                     (dset==im3d->fim_now)  ||
06529                     (dset==im3d->fimdata->fimdset)) ) break ;
06530             }
06531 
06532             
06533             if( icc == MAX_CONTROLLERS ){ PURGE_DSET(dset) ; }
06534          }
06535       }
06536 
06537    } 
06538    EXRETURN ;
06539 }
06540 
06541 
06542 
06543 
06544 
06545 
06546 void AFNI_initialize_view( THD_3dim_dataset *old_anat, Three_D_View *im3d )
06547 {
06548    int vvv , itog , lll , sss , aaa , fff , id ;
06549    THD_3dim_dataset     * dset , * new_anat , * new_func ;
06550    THD_marker_set       * markers ;
06551    AFNI_viewing_widgets * view ;
06552    AFNI_marks_widgets   * marks ;
06553    THD_fvec3 fv ;
06554    THD_ivec3 iv ;
06555 
06556 ENTRY("AFNI_initialize_view") ;
06557 
06558    if( ! IM3D_VALID(im3d) ) EXRETURN ;
06559 
06560    vvv = im3d->vinfo->view_type ;  
06561    sss = im3d->vinfo->sess_num ;
06562    aaa = im3d->vinfo->anat_num ;
06563    fff = im3d->vinfo->func_num ;
06564 
06565 if(PRINT_TRACING)
06566 { char str[256] ;
06567   sprintf(str,"view=%d session=%d anat=%d func=%d",vvv,sss,aaa,fff);
06568   STATUS(str) ; }
06569 
06570    new_anat = GLOBAL_library.sslist->ssar[sss]->dsset[aaa][vvv] ;
06571    new_func = GLOBAL_library.sslist->ssar[sss]->dsset[fff][vvv] ;
06572 
06573    
06574    
06575 
06576 
06577    if( old_anat != NULL     && 
06578        old_anat != new_anat && XtIsManaged(im3d->vwid->marks->frame) ){
06579 
06580       AFNI_marks_action_CB( NULL, (XtPointer) im3d, NULL) ; 
06581    }
06582 
06583    if( GLOBAL_argopt.auto_purge == True ){ 
06584 
06585 STATUS("purging old datasets from memory (maybe)") ;
06586 
06587       im3d->anat_now = new_anat ;
06588       im3d->fim_now  = new_func ;
06589       AFNI_purge_unused_dsets() ;
06590    }
06591 
06592    
06593    
06594 
06595    for( id=0 ; id <= LAST_VIEW_TYPE ; id++ ){
06596       im3d->anat_dset[id] = GLOBAL_library.sslist->ssar[sss]->dsset[aaa][id] ;
06597       im3d->fim_dset[id]  = GLOBAL_library.sslist->ssar[sss]->dsset[fff][id] ;
06598 
06599       if( ISVALID_3DIM_DATASET(im3d->anat_dset[id]) )
06600          SENSITIZE( im3d->vwid->view->view_bbox->wbut[id], True ) ;
06601       else
06602          SENSITIZE( im3d->vwid->view->view_bbox->wbut[id], False) ;
06603    }
06604 
06605    im3d->anat_now = im3d->anat_dset[vvv] ;
06606    im3d->fim_now  = im3d->fim_dset[vvv] ;
06607    im3d->ss_now   = GLOBAL_library.sslist->ssar[sss] ;
06608 
06609    
06610    
06611 
06612    dset    = im3d->anat_now ;
06613    markers = dset->markers ;
06614    view    = im3d->vwid->view ;
06615    marks   = im3d->vwid->marks ;
06616 
06617    if( markers == NULL ){   
06618 
06619 STATUS("turning markers off") ;
06620 
06621       
06622 
06623 #if 0
06624       SENSITIZE(  view->define_marks_pb , False ) ;
06625       SENSITIZE(  view->see_marks_bbox->wrowcol , False ) ;
06626 #endif
06627 
06628       marks->editable = False ;
06629 
06630       vvv = MCW_val_bbox( view->see_marks_bbox ) ;
06631       marks->tag_visible = marks->ov_visible = (vvv) ? True : False ;
06632 
06633       XtUnmanageChildren( marks->always_popup    , marks->num_always_popup    ) ;
06634       XtUnmanageChildren( marks->sometimes_popup , marks->num_sometimes_popup ) ;
06635 
06636    } else {   
06637 
06638 STATUS("turning markers on") ;
06639 
06640       
06641 
06642       SENSITIZE( view->define_marks_pb , True ) ;
06643       SENSITIZE( view->see_marks_bbox->wrowcol , True ) ;
06644 
06645       vvv = MCW_val_bbox( view->see_marks_bbox ) ;
06646       marks->tag_visible = marks->ov_visible = (vvv) ? True : False ;
06647 
06648       marks->editable = False ;
06649       MCW_set_bbox( marks->edits_bbox , 0 ) ;
06650 
06651       SENSITIZE( marks->pop_set_pb   , marks->editable ) ;
06652       SENSITIZE( marks->pop_clear_pb , marks->editable ) ;
06653 
06654       
06655 
06656       for( itog=0 ; itog < MARKS_MAXNUM ; itog++ ){
06657          MCW_strncpy( &(marks->tog_help[itog][0]) ,
06658                       &(markers->help[itog][0]) , MARKS_MAXHELP ) ;
06659       }
06660 
06661       
06662 
06663 
06664       XtManageChildren( marks->always_popup ,
06665                         marks->num_always_popup ) ;
06666 
06667       for( itog=0 ; itog < MARKS_MAXNUM ; itog++ ){
06668          lll = strlen( &(markers->label[itog][0]) ) ;
06669 
06670          if( lll == 0 ){
06671             XtUnmanageChild( marks->tog[itog] ) ;   
06672             XtUnmanageChild( marks->poptog[itog] ) ;
06673          } else {
06674             MCW_set_widget_label( marks->tog[itog] ,
06675                                   &(markers->label[itog][0]) ) ;
06676             SENSITIZE( marks->tog[itog] , True ) ;
06677             XtManageChild( marks->tog[itog] ) ;
06678 
06679             MCW_set_widget_label( marks->poptog[itog] ,
06680                                   &(markers->label[itog][0]) ) ;
06681             SENSITIZE( marks->poptog[itog] , True ) ;
06682             XtManageChild( marks->poptog[itog] ) ;
06683 
06684             if( markers->valid[itog] && ! marks->inverted[itog] ){
06685                MCW_invert_widget( marks->tog[itog] ) ;
06686                MCW_invert_widget( marks->poptog[itog] ) ;
06687                marks->inverted[itog] = True ;
06688             }
06689 
06690             if( ! markers->valid[itog] && marks->inverted[itog] ){
06691                MCW_invert_widget( marks->tog[itog] ) ;
06692                MCW_invert_widget( marks->poptog[itog] ) ;
06693                marks->inverted[itog] = False ;
06694             }
06695          }
06696       } 
06697 
06698    } 
06699 
06700    
06701    
06702 
06703    AFNI_setup_viewing( im3d , True ) ;
06704 
06705    
06706    
06707 
06708    if( im3d->type == AFNI_3DDATA_VIEW ){
06709       fv = AFNI_transform_vector(
06710               old_anat ,
06711               TEMP_FVEC3( im3d->vinfo->xi, im3d->vinfo->yj, im3d->vinfo->zk ),
06712               dset ) ;
06713 
06714       LOAD_ANAT_VIEW(im3d) ;  
06715 
06716       fv = THD_dicomm_to_3dmm( dset , fv ) ;
06717       iv = THD_3dmm_to_3dind( dset , fv ) ;
06718    } else {
06719       LOAD_IVEC3( iv, im3d->vinfo->i1, im3d->vinfo->j2, im3d->vinfo->k3 ) ;
06720    }
06721 
06722    
06723 
06724 
06725    if( im3d->dummied && !GLOBAL_library.have_dummy_dataset ){
06726      im3d->dummied = 0 ;
06727      LOAD_IVEC3( iv , im3d->anat_now->daxes->nxx/2 ,
06728                       im3d->anat_now->daxes->nyy/2 ,
06729                       im3d->anat_now->daxes->nzz/2  ) ;
06730    }
06731 
06732    DISABLE_LOCK ;  
06733 
06734    AFNI_view_setter(im3d,NULL) ;
06735    AFNI_set_viewpoint( im3d, iv.ijk[0],iv.ijk[1],iv.ijk[2] , REDISPLAY_ALL ) ;
06736 
06737    ENABLE_LOCK ;   
06738 
06739    SAVE_VPT(im3d) ;  
06740 
06741    EXRETURN ;
06742 }
06743 
06744 
06745 
06746 
06747 
06748 
06749 THD_warp * AFNI_find_warp( THD_3dim_dataset *dset_to , THD_3dim_dataset *dset_from )
06750 {
06751    THD_warp *swarp = NULL ;
06752    char idkey[256] ;
06753 
06754    if( GLOBAL_library.warptable == NULL ||
06755        dset_to   == NULL                ||
06756        dset_from == NULL                  ) return NULL ;
06757 
06758    sprintf(idkey,"%s,%s",dset_to->idcode.str,dset_from->idcode.str) ;
06759    swarp = (THD_warp *) findin_Htable( idkey , GLOBAL_library.warptable ) ;
06760    return swarp ;
06761 }
06762 
06763 
06764 
06765 
06766 
06767 
06768 
06769 
06770 
06771 
06772 
06773 
06774 
06775 
06776 
06777 
06778 void AFNI_setup_viewing( Three_D_View * im3d , Boolean rescaled )
06779 {
06780    FD_brick ** fbr ;
06781    XmString xstr ;
06782    Boolean  same , dont_fix_pts , writer ,
06783             anat_brick_possible , func_brick_possible ;
06784    int      val , top ;
06785 
06786    static THD_3dim_dataset *old_fim  = NULL ; 
06787    static Three_D_View     *old_im3d = NULL ; 
06788    static THD_3dim_dataset *old_anat = NULL ; 
06789 
06790 ENTRY("AFNI_setup_viewing") ;
06791 
06792    if( ! IM3D_VALID(im3d) ) EXRETURN ;
06793 
06794    
06795    
06796 
06797    anat_brick_possible = DSET_INMEMORY(im3d->anat_now) ;
06798 
06799    
06800 
06801    if( anat_brick_possible         &&
06802        im3d->vinfo->force_anat_wod &&
06803        im3d->vinfo->tempflag == 0  &&
06804        !AFNI_noenv("AFNI_VIEW_ANAT_BRICK") ){
06805 
06806 STATUS("setting anatmode_bbox back to 'View ULay Data Brick'") ;
06807       im3d->vinfo->force_anat_wod = 0 ;
06808       MCW_set_bbox( im3d->vwid->dmode->anatmode_bbox , DMODE_BRICK_BVAL ) ;
06809    }
06810 
06811    im3d->anat_wod_flag = ( im3d->vinfo->force_anat_wod ||       
06812                            !anat_brick_possible          ) ;
06813 
06814    if( im3d->anat_wod_flag )                                    
06815       THD_edit_dataxes( im3d->vinfo->resam_vox ,
06816                         im3d->anat_now->daxes , im3d->wod_daxes ) ;
06817    else
06818       *(im3d->wod_daxes) = *(im3d->anat_now->daxes) ;
06819 
06820    im3d->anat_voxwarp->type =
06821       im3d->fim_voxwarp->type = ILLEGAL_TYPE ;                  
06822 
06823    LOAD_ANAT_VIEW(im3d) ;                                       
06824 
06825    fbr = THD_setup_bricks( im3d->anat_now ) ;
06826    if( fbr == NULL ){
06827       fprintf(stderr,"THD_setup_bricks of anat_now fails!\n") ; EXRETURN ;
06828    }
06829    myXtFree(im3d->b123_anat) ; im3d->b123_anat = fbr[0] ;
06830    myXtFree(im3d->b231_anat) ; im3d->b231_anat = fbr[1] ;
06831    myXtFree(im3d->b312_anat) ; im3d->b312_anat = fbr[2] ;
06832    myXtFree(fbr) ;
06833 
06834    im3d->b123_anat->parent =
06835      im3d->b231_anat->parent =
06836        im3d->b312_anat->parent = (XtPointer) im3d ;
06837 
06838    im3d->b123_anat->resam_code =
06839      im3d->b231_anat->resam_code =
06840        im3d->b312_anat->resam_code = im3d->vinfo->anat_resam_mode ;
06841 
06842    im3d->b123_anat->thr_resam_code =     
06843      im3d->b231_anat->thr_resam_code =
06844        im3d->b312_anat->thr_resam_code = im3d->vinfo->anat_resam_mode ;
06845 
06846    
06847 
06848    if( im3d->vinfo->anat_index >= DSET_NVALS(im3d->anat_now) )
06849      im3d->vinfo->anat_index = DSET_NVALS(im3d->anat_now) - 1 ;
06850 
06851    
06852    
06853 
06854    if( ISVALID_3DIM_DATASET(im3d->fim_now) ){  
06855 
06856 STATUS("function brick setup") ;
06857 
06858       
06859 
06860 
06861 
06862 
06863 
06864 
06865 STATUS("deciding whether to use function WOD") ;
06866 
06867       func_brick_possible =
06868          EQUIV_DATAXES( im3d->fim_now->daxes , im3d->wod_daxes ) &&   
06869          DSET_INMEMORY( im3d->fim_now ) ;
06870 
06871       
06872 
06873 
06874 
06875 
06876       { THD_warp *swarp = AFNI_find_warp( im3d->anat_now , im3d->fim_now ) ;
06877         im3d->fim_selfwarp = swarp ;  
06878         if( swarp != NULL ) func_brick_possible = 0 ;   
06879       }
06880 
06881       
06882 
06883 
06884       if( func_brick_possible                          &&
06885           ( ( im3d->vinfo->force_func_wod  &&
06886               im3d->vinfo->tempflag == 0   &&
06887               !AFNI_noenv("AFNI_VIEW_FUNC_BRICK") ) ||
06888             ( !im3d->anat_wod_flag         &&              
06889               im3d->anat_now == im3d->fim_now     )   ) ){
06890 
06891 STATUS("setting funcmode_bbox back to 'View Func Data Brick'") ;
06892          im3d->vinfo->force_func_wod = 0 ;
06893          MCW_set_bbox( im3d->vwid->dmode->funcmode_bbox , DMODE_BRICK_BVAL ) ;
06894       }
06895 
06896       if( func_brick_possible && ! im3d->vinfo->force_func_wod ){
06897 STATUS("not forcing function WOD") ;
06898         im3d->fim_wod_flag = False ;   
06899       } else {
06900 STATUS("forcing function WOD") ;
06901         im3d->fim_wod_flag = True ;    
06902       }
06903 
06904       LOAD_FUNC_VIEW(im3d) ;  
06905 
06906       fbr = THD_setup_bricks( im3d->fim_now ) ;
06907       if( fbr == NULL ){
06908          fprintf(stderr,"THD_setup_bricks of fim_now fails!\n") ; EXRETURN ;
06909       }
06910       myXtFree(im3d->b123_fim) ; im3d->b123_fim = fbr[0] ;
06911       myXtFree(im3d->b231_fim) ; im3d->b231_fim = fbr[1] ;
06912       myXtFree(im3d->b312_fim) ; im3d->b312_fim = fbr[2] ;
06913       myXtFree(fbr) ;
06914 
06915       im3d->b123_fim->parent =
06916         im3d->b231_fim->parent =
06917           im3d->b312_fim->parent = (XtPointer) im3d ;
06918 
06919       im3d->b123_fim->resam_code =
06920         im3d->b231_fim->resam_code =
06921           im3d->b312_fim->resam_code = im3d->vinfo->func_resam_mode ;
06922 
06923       im3d->b123_fim->thr_resam_code =     
06924         im3d->b231_fim->thr_resam_code =
06925           im3d->b312_fim->thr_resam_code = im3d->vinfo->thr_resam_mode ;
06926 
06927       
06928 
06929       if( im3d->vinfo->fim_index >= DSET_NVALS(im3d->fim_now) )
06930           im3d->vinfo->fim_index = DSET_NVALS(im3d->fim_now) - 1 ;
06931 
06932       if( im3d->vinfo->thr_index >= DSET_NVALS(im3d->fim_now) )
06933           im3d->vinfo->thr_index = DSET_NVALS(im3d->fim_now) - 1 ;
06934 
06935       
06936 
06937 
06938       { static int first=1, ffim[MAX_CONTROLLERS] ; int qq ;
06939         if( first ){
06940           first=0; for( qq=0; qq < MAX_CONTROLLERS; qq++ ) ffim[qq]=1;
06941         }
06942         qq = AFNI_controller_index(im3d) ;
06943         if( ffim[qq] && im3d->vinfo->thr_index == 0 && DSET_NVALS(im3d->fim_now) > 1 ){
06944           im3d->vinfo->thr_index = 1 ; ffim[qq] = 0 ;
06945         }
06946       }
06947 
06948    } else {   
06949 
06950 STATUS("no function dataset") ;
06951 
06952       myXtFree(im3d->b123_fim) ; im3d->b123_fim = NULL ;
06953       myXtFree(im3d->b231_fim) ; im3d->b231_fim = NULL ;
06954       myXtFree(im3d->b312_fim) ; im3d->b312_fim = NULL ;
06955 
06956       func_brick_possible = False ;
06957    }
06958 
06959    
06960    
06961 
06962 STATUS("turning widgets on and/or off:") ;
06963 
06964    
06965 
06966 STATUS(" -- datamode widgets") ;
06967 
06968    if( anat_brick_possible ){
06969      SENSITIZE( im3d->vwid->dmode->anatmode_bbox->wbut[DMODE_BRICK] , True ) ;
06970    } else {
06971      SENSITIZE( im3d->vwid->dmode->anatmode_bbox->wbut[DMODE_BRICK] , False ) ;
06972      MCW_set_bbox( im3d->vwid->dmode->anatmode_bbox , DMODE_WOD_BVAL ) ;
06973      im3d->vinfo->force_anat_wod = 1 ;
06974    }
06975 
06976    if( func_brick_possible ){
06977      SENSITIZE( im3d->vwid->dmode->funcmode_bbox->wbut[DMODE_BRICK] , True ) ;
06978    } else {
06979      SENSITIZE( im3d->vwid->dmode->funcmode_bbox->wbut[DMODE_BRICK] , False ) ;
06980      MCW_set_bbox( im3d->vwid->dmode->funcmode_bbox , DMODE_WOD_BVAL ) ;
06981      im3d->vinfo->force_func_wod = 1 ;
06982    }
06983 
06984    AV_SENSITIZE( im3d->vwid->dmode->anat_resam_av , im3d->anat_wod_flag ) ;
06985 
06986    AV_SENSITIZE( im3d->vwid->dmode->resam_vox_av , im3d->anat_wod_flag ) ;
06987 
06988    
06989    
06990 
06991    if( GLOBAL_argopt.destruct ){  
06992      writer = True ;
06993    } else {
06994      writer = (Boolean) DSET_WRITEABLE(im3d->anat_now) ;  
06995    }
06996 
06997    SENSITIZE( im3d->vwid->dmode->write_anat_pb , writer ) ;
06998 
06999    if( GLOBAL_argopt.destruct ){  
07000      writer = (Boolean) ISVALID_3DIM_DATASET(im3d->fim_now) ;
07001    } else {
07002      writer = (Boolean) DSET_WRITEABLE(im3d->fim_now) ;  
07003    }
07004 
07005    SENSITIZE( im3d->vwid->dmode->write_func_pb , writer ) ;
07006 
07007    
07008 
07009    {  Boolean have_fim = ISVALID_3DIM_DATASET(im3d->fim_now) ;
07010       Boolean have_thr = have_fim ;
07011 
07012       static int first=1, zfim[MAX_CONTROLLERS] ; int qq ;
07013       if( first ){
07014         first=0; for( qq=0; qq < MAX_CONTROLLERS; qq++ ) zfim[qq]=1;
07015       }
07016 
07017 STATUS(" -- function widgets ON") ;
07018 
07019       SENSITIZE( im3d->vwid->view->define_func_pb      , True ) ;  
07020       SENSITIZE( im3d->vwid->view->see_func_bbox->wtop , True ) ;
07021 
07022       
07023 
07024       XtManageChild( im3d->vwid->func->thr_rowcol ) ;
07025       qq = AFNI_controller_index(im3d) ;
07026       if( zfim[qq] && im3d->fim_now != NULL && im3d->fim_now->func_type == FUNC_FIM_TYPE ){
07027 STATUS(" -- set threshold to zero for FIM (once only)") ;
07028         XmScaleSetValue( im3d->vwid->func->thr_scale , 0 ) ;
07029         im3d->vinfo->func_threshold = 0.0 ; zfim[qq] = 0 ;
07030       }
07031       FIX_SCALE_SIZE(im3d) ; FIX_SCALE_VALUE(im3d) ;
07032 
07033       
07034 
07035       SENSITIZE( im3d->vwid->func->underlay_bbox->wbut[UNDERLAY_ALLFUNC],
07036                       have_fim ) ;
07037 
07038       
07039 
07040       if( ! have_fim ) im3d->vinfo->underlay_type = UNDERLAY_ANAT ;
07041 
07042       
07043 
07044       AV_SENSITIZE( im3d->vwid->dmode->func_resam_av,
07045                     have_fim && im3d->fim_wod_flag ) ;
07046 
07047       AV_SENSITIZE( im3d->vwid->dmode->thr_resam_av,    
07048                     have_fim && im3d->fim_wod_flag ) ;
07049 
07050 
07051 
07052 
07053 
07054 
07055 
07056       if( have_thr ){
07057         int iv = im3d->vinfo->thr_index , jj ;
07058 
07059         jj = DSET_BRICK_STATCODE(im3d->fim_now,iv) ;
07060         if( jj > 0 )
07061           MCW_set_widget_label( im3d->vwid->func->thr_label ,
07062                                 FUNC_label[jj] ) ;
07063         else
07064           MCW_set_widget_label( im3d->vwid->func->thr_label ,
07065                                 DSET_BRICK_LABEL(im3d->fim_now,iv) ) ;
07066       }
07067 
07068       
07069 
07070       AFNI_set_thr_pval( im3d ) ;
07071 
07072       
07073 
07074       XtManageChild( im3d->vwid->func->anat_buck_av->wrowcol ) ;
07075       XtManageChild( im3d->vwid->func->fim_buck_av->wrowcol  ) ;
07076       XtManageChild( im3d->vwid->func->thr_buck_av->wrowcol  ) ;
07077 
07078 
07079 
07080       if( have_fim && (im3d->fim_now != old_fim || im3d != old_im3d) ){
07081         refit_MCW_optmenu( im3d->vwid->func->fim_buck_av ,
07082                            0 ,                            
07083                            DSET_NVALS(im3d->fim_now)-1 ,  
07084                            im3d->vinfo->fim_index ,       
07085                            0 ,                            
07086                            AFNI_bucket_label_CB ,         
07087                            im3d->fim_now                  
07088                          ) ;
07089         refit_MCW_optmenu( im3d->vwid->func->thr_buck_av ,
07090                            0 ,                            
07091                            DSET_NVALS(im3d->fim_now)-1 ,  
07092                            im3d->vinfo->thr_index ,       
07093                            0 ,                            
07094                            AFNI_bucket_label_CB ,         
07095                            im3d->fim_now                  
07096                          ) ;
07097       }
07098 
07099       if( im3d->anat_now != old_anat || im3d != old_im3d ){
07100         refit_MCW_optmenu( im3d->vwid->func->anat_buck_av ,
07101                            0 ,                             
07102                            DSET_NVALS(im3d->anat_now)-1 ,  
07103                            im3d->vinfo->anat_index ,       
07104                            0 ,                             
07105                            AFNI_bucket_label_CB ,          
07106                            im3d->anat_now                  
07107                          ) ;
07108       }
07109 
07110       XtManageChild( im3d->vwid->func->buck_rowcol ) ;  
07111       XtManageChild( im3d->vwid->func->buck_frame ) ;
07112    }
07113 
07114    
07115 
07116 
07117 STATUS(" -- function underlay widgets") ;
07118 
07119    MCW_set_bbox( im3d->vwid->func->underlay_bbox ,
07120                  1 << im3d->vinfo->underlay_type ) ;
07121 
07122    
07123    
07124 
07125    AFNI_reset_func_range( im3d ) ;
07126 
07127 #ifdef ALLOW_DATASET_VLIST
07128    
07129    
07130    
07131    
07132 
07133    dont_fix_pts = ! rescaled ;  
07134 
07135    if( im3d->anat_now->pts == NULL ){
07136       int ii ;
07137       THD_3dim_dataset * dset_orig = NULL ;
07138       THD_fvec3 fv ;
07139 
07140 STATUS(" -- scanning for points in other datasets") ;
07141       for( ii=0 ; ii <= LAST_VIEW_TYPE ; ii++ ){
07142          if( ISVALID_3DIM_DATASET(im3d->anat_dset[ii]) &&
07143              im3d->anat_dset[ii]->pts != NULL &&
07144              im3d->anat_dset[ii]->pts_original == True ){
07145 
07146             dset_orig = im3d->anat_dset[ii] ;
07147             break ;
07148          }
07149       }
07150 
07151       if( dset_orig != NULL ){
07152 STATUS(" -- processing points in other dataset") ;
07153 
07154          dont_fix_pts                 = True ;   
07155          im3d->anat_now->pts_original = False ;
07156          INIT_VLIST( im3d->anat_now->pts , im3d->anat_now ) ;
07157 
07158          for( ii=0 ; ii < dset_orig->pts->num ; ii++ ){
07159             fv = THD_3dmm_to_dicomm( dset_orig , dset_orig->pts->xyz[ii] ) ;
07160             fv = AFNI_transform_vector( dset_orig , fv  , im3d->anat_now ) ;
07161             fv = THD_dicomm_to_3dmm( im3d->anat_now , fv ) ;
07162             ADD_FVEC_TO_VLIST( im3d->anat_now->pts , fv ) ;
07163          }
07164       }
07165    }
07166 
07167    
07168    
07169    
07170 
07171    if( im3d->anat_now->pts != NULL && ! dont_fix_pts ){
07172       int ii ;
07173 STATUS(" -- processing points in this dataset") ;
07174 
07175       for( ii=0 ; ii < im3d->anat_now->pts->num ; ii++ )
07176          im3d->anat_now->pts->ijk[ii] =
07177             THD_3dmm_to_3dind( im3d->anat_now , im3d->anat_now->pts->xyz[ii] ) ;
07178    }
07179 #endif 
07180 
07181    
07182 
07183    if( im3d->vwid->imag->pop_sumato_pb != NULL ){
07184      if( SESSION_HAS_SUMA(im3d->ss_now) )
07185        XtManageChild( im3d->vwid->imag->pop_sumato_pb ) ;
07186      else
07187        XtUnmanageChild( im3d->vwid->imag->pop_sumato_pb ) ;
07188    }
07189 
07190    
07191 
07192    if( im3d->vwid->imag->pop_mnito_pb != NULL ){
07193      if( CAN_TALTO(im3d) )
07194        XtManageChild( im3d->vwid->imag->pop_mnito_pb ) ;
07195      else
07196        XtUnmanageChild( im3d->vwid->imag->pop_mnito_pb ) ;
07197    }
07198 
07199    
07200    
07201 
07202 STATUS(" -- managing talairach_to button") ;
07203 
07204    if( im3d->vwid->imag->pop_talto_pb != NULL ){
07205      if( CAN_TALTO(im3d) ){
07206        XtSetSensitive( im3d->vwid->imag->pop_talto_pb , True ) ;
07207        if( im3d->vwid->imag->pop_whereami_pb != NULL )
07208          XtSetSensitive( im3d->vwid->imag->pop_whereami_pb , True ); 
07209        if( im3d->vwid->imag->pop_ttren_pb != NULL )
07210          XtSetSensitive( im3d->vwid->imag->pop_ttren_pb ,              
07211                          im3d->vinfo->view_type==VIEW_TALAIRACH_TYPE); 
07212      } else {
07213        XtSetSensitive( im3d->vwid->imag->pop_talto_pb, False ) ;
07214        if( im3d->vwid->imag->pop_whereami_pb != NULL )
07215          XtSetSensitive( im3d->vwid->imag->pop_whereami_pb, False ); 
07216        if( im3d->vwid->imag->pop_ttren_pb != NULL )
07217          XtSetSensitive( im3d->vwid->imag->pop_ttren_pb , False ); 
07218      }
07219    }
07220 
07221    
07222 
07223 #if 1
07224    XtSetSensitive( im3d->vwid->func->see_ttatlas_bbox->wrowcol ,
07225                    (Boolean)( im3d->anat_now->view_type == VIEW_TALAIRACH_TYPE &&
07226                               TT_retrieve_atlas()       != NULL                  ) ) ;
07227 #else
07228    XtSetSensitive( im3d->vwid->func->see_ttatlas_bbox->wrowcol , False ) ;
07229 #endif
07230 
07231    
07232    
07233    
07234 
07235    top = DSET_NUM_TIMES(im3d->anat_now) ;
07236    if( ISVALID_3DIM_DATASET(im3d->fim_now) )
07237       top = MAX( top , DSET_NUM_TIMES(im3d->fim_now) ) ;
07238 
07239    if( top > 1 ){
07240      MCW_arrowval *tav = im3d->vwid->imag->time_index_av ;
07241 STATUS(" -- turning time index control on") ;
07242 
07243      AV_SENSITIZE( tav , True ) ; im3d->vinfo->time_on = 1 ;
07244      tav->fmax = tav->imax = top - 1 ; im3d->vinfo->top_index = top ;
07245      if( im3d->vinfo->time_index > tav->imax ){
07246        im3d->vinfo->time_index = tav->imax ;
07247        AV_assign_ival( tav , tav->imax ) ;
07248        AFNI_process_timeindex(im3d) ;       
07249      }
07250    } else {
07251 STATUS(" -- turning time index control off") ;
07252      AV_SENSITIZE( im3d->vwid->imag->time_index_av , False ) ;
07253      im3d->vinfo->time_on = 0 ;
07254    }
07255 
07256    
07257    
07258 
07259    if( DSET_GRAPHABLE(im3d->anat_now) )
07260      im3d->fimdata->fimdset = im3d->anat_now ;
07261 
07262    ALLOW_COMPUTE_FIM(im3d) ;
07263 
07264    
07265    
07266 
07267    AFNI_update_surface_widgets( im3d ) ;
07268 
07269    
07270    
07271 
07272    AFNI_underlay_CB( NULL , (XtPointer) im3d , NULL ) ;
07273 
07274    
07275 
07276    AFNI_range_setter( im3d , im3d->s123 ) ;
07277    AFNI_range_setter( im3d , im3d->s231 ) ;
07278    AFNI_range_setter( im3d , im3d->s312 ) ;
07279 
07280    im3d->vinfo->tempflag = 0 ;
07281 
07282    old_im3d = im3d ;
07283    old_fim  = im3d->fim_now ;   
07284    old_anat = im3d->anat_now ;
07285 
07286    EXRETURN ;
07287 }
07288 
07289 
07290 
07291 
07292 
07293 
07294 int AFNI_can_transform_vector( THD_3dim_dataset * old_dset ,
07295                                THD_3dim_dataset * new_dset  )
07296 {
07297    if( old_dset==NULL || new_dset==NULL  ) return 0 ;
07298 
07299    if( old_dset == new_dset->warp_parent ) return 1 ;
07300 
07301    if( old_dset->warp_parent == new_dset ) return 1 ;
07302 
07303    if( old_dset->warp_parent == new_dset->warp_parent &&
07304        old_dset->warp_parent != NULL                   ) return 1 ;
07305 
07306    if( new_dset->view_type   == VIEW_ORIGINAL_TYPE &&
07307        old_dset->view_type   != VIEW_ORIGINAL_TYPE &&
07308        old_dset->anat_parent != NULL               &&
07309        old_dset->anat_parent->warp_parent != NULL      ) return 1 ;
07310 
07311    if( old_dset->view_type   == VIEW_ORIGINAL_TYPE &&
07312        new_dset->view_type   != VIEW_ORIGINAL_TYPE &&
07313        new_dset->anat_parent != NULL               &&
07314        new_dset->anat_parent->warp_parent != NULL      ) return 1 ;
07315 
07316    return 0 ;
07317 }
07318 
07319 
07320 
07321 
07322 
07323 THD_fvec3 AFNI_transform_vector( THD_3dim_dataset * old_dset ,
07324                                  THD_fvec3 old_fv ,
07325                                  THD_3dim_dataset * new_dset  )
07326 {
07327    if( old_dset==NULL || new_dset==NULL || old_dset==new_dset ) return old_fv ;
07328 
07329    if( old_dset == new_dset->warp_parent ){
07330 
07331       return AFNI_forward_warp_vector( new_dset->warp , old_fv ) ;
07332 
07333    } else if( old_dset->warp_parent == new_dset ){
07334 
07335       return AFNI_backward_warp_vector( old_dset->warp , old_fv ) ;
07336 
07337    } else if( old_dset->warp_parent == new_dset->warp_parent &&
07338               old_dset->warp_parent != NULL ){
07339 
07340       THD_fvec3 par_fv ;
07341       par_fv = AFNI_backward_warp_vector( old_dset->warp , old_fv ) ;
07342       return   AFNI_forward_warp_vector ( new_dset->warp , par_fv ) ;
07343    }
07344 
07345    
07346 
07347 
07348 
07349    if( new_dset->view_type   == VIEW_ORIGINAL_TYPE &&
07350        old_dset->view_type   != VIEW_ORIGINAL_TYPE &&
07351        old_dset->anat_parent != NULL               &&
07352        old_dset->anat_parent->warp_parent != NULL      ){
07353 
07354       return AFNI_backward_warp_vector( old_dset->anat_parent->warp , old_fv ) ;
07355    }
07356 
07357    
07358 
07359    if( old_dset->view_type   == VIEW_ORIGINAL_TYPE &&
07360        new_dset->view_type   != VIEW_ORIGINAL_TYPE &&
07361        new_dset->anat_parent != NULL               &&
07362        new_dset->anat_parent->warp_parent != NULL      ){
07363 
07364       return AFNI_forward_warp_vector( new_dset->anat_parent->warp , old_fv ) ;
07365    }
07366 
07367    
07368 
07369    { THD_warp *swarp = AFNI_find_warp(new_dset,old_dset) ;
07370      if( swarp != NULL ) return AFNI_forward_warp_vector( swarp , old_fv ) ;
07371      swarp = AFNI_find_warp(old_dset,new_dset) ;
07372      if( swarp != NULL ) return AFNI_backward_warp_vector( swarp, old_fv ) ;
07373    }
07374 
07375    
07376 
07377    return old_fv ;
07378 }
07379 
07380 
07381 
07382 
07383 
07384 THD_fvec3 AFNI_forward_warp_vector( THD_warp * warp , THD_fvec3 old_fv )
07385 {
07386    THD_fvec3 new_fv ;
07387 
07388    if( warp == NULL ) return old_fv ;
07389 
07390    switch( warp->type ){
07391 
07392       default: new_fv = old_fv ; break ;
07393 
07394       case WARP_TALAIRACH_12_TYPE:{
07395          THD_linear_mapping map ;
07396          int iw ;
07397 
07398          
07399 
07400 
07401          for( iw=0 ; iw < 12 ; iw++ ){
07402             map    = warp->tal_12.warp[iw] ;
07403             new_fv = MATVEC_SUB(map.mfor,old_fv,map.bvec) ;
07404 
07405             if( new_fv.xyz[0] >= map.bot.xyz[0] &&
07406                 new_fv.xyz[1] >= map.bot.xyz[1] &&
07407                 new_fv.xyz[2] >= map.bot.xyz[2] &&
07408                 new_fv.xyz[0] <= map.top.xyz[0] &&
07409                 new_fv.xyz[1] <= map.top.xyz[1] &&
07410                 new_fv.xyz[2] <= map.top.xyz[2]   ) break ;  
07411          }
07412       }
07413       break ;
07414 
07415       case WARP_AFFINE_TYPE:{
07416          THD_linear_mapping map = warp->rig_bod.warp ;
07417          new_fv = MATVEC_SUB(map.mfor,old_fv,map.bvec) ;
07418       }
07419       break ;
07420 
07421    }
07422    return new_fv ;
07423 }
07424 
07425 
07426 
07427 
07428 
07429 THD_fvec3 AFNI_backward_warp_vector( THD_warp * warp , THD_fvec3 old_fv )
07430 {
07431    THD_fvec3 new_fv ;
07432 
07433    if( warp == NULL ) return old_fv ;
07434 
07435    switch( warp->type ){
07436 
07437       default: new_fv = old_fv ; break ;
07438 
07439       case WARP_TALAIRACH_12_TYPE:{
07440          THD_linear_mapping map ;
07441          int iw ;
07442 
07443          
07444 
07445          for( iw=0 ; iw < 12 ; iw++ ){
07446             map = warp->tal_12.warp[iw] ;
07447 
07448             if( old_fv.xyz[0] >= map.bot.xyz[0] &&
07449                 old_fv.xyz[1] >= map.bot.xyz[1] &&
07450                 old_fv.xyz[2] >= map.bot.xyz[2] &&
07451                 old_fv.xyz[0] <= map.top.xyz[0] &&
07452                 old_fv.xyz[1] <= map.top.xyz[1] &&
07453                 old_fv.xyz[2] <= map.top.xyz[2]   ) break ;  
07454          }
07455          new_fv = MATVEC_SUB(map.mbac,old_fv,map.svec) ;
07456       }
07457       break ;
07458 
07459       case WARP_AFFINE_TYPE:{
07460          THD_linear_mapping map = warp->rig_bod.warp ;
07461          new_fv = MATVEC_SUB(map.mbac,old_fv,map.svec) ;
07462       }
07463       break ;
07464 
07465    }
07466    return new_fv ;
07467 }
07468 
07469 
07470 
07471 
07472 
07473 
07474 #ifdef FIX_SCALE_SIZE_LATER
07475 static void fixscale( XtPointer client_data , XtIntervalId * id )
07476 {
07477    Three_D_View * im3d = (Three_D_View *) client_data ;
07478    FIX_SCALE_SIZE(im3d) ;
07479 
07480 #if 0
07481    XtVaSetValues( im3d->vwid->func->thr_scale , XmNscaleWidth,24 , NULL ) ;
07482 #endif
07483 }
07484 #endif
07485 
07486 
07487 
07488 void AFNI_define_CB( Widget w , XtPointer client_data , XtPointer call_data )
07489 {
07490    Three_D_View * im3d = (Three_D_View *) client_data ;
07491    int vwarp ;
07492 
07493 ENTRY("AFNI_define_CB") ;
07494 
07495    if( ! IM3D_VALID(im3d) ) EXRETURN ;
07496 
07497    
07498 
07499    if( w == im3d->vwid->view->define_marks_pb ){
07500 
07501       AFNI_viewing_widgets  * view  = im3d->vwid->view  ;
07502       AFNI_marks_widgets    * marks = im3d->vwid->marks ;
07503 
07504       if( XtIsManaged(marks->frame) == True ){  
07505 
07506 STATUS("closing marks") ;
07507 
07508          AFNI_marks_action_CB( NULL , (XtPointer) im3d , NULL ) ;
07509 
07510       } else {                                  
07511 
07512 STATUS("opening marks") ;
07513 
07514          marks->old_visible = marks->ov_visible ;
07515          marks->ov_visible  = True ;
07516          marks->changed     = False ;  
07517 
07518          MCW_set_bbox( marks->edits_bbox , 0 ) ;
07519          AFNI_marks_edits_CB( NULL , (XtPointer) im3d , NULL ) ;
07520 
07521          MCW_set_bbox( view->see_marks_bbox , 1 ) ;
07522          if( marks->old_visible != marks->ov_visible )
07523             AFNI_see_marks_CB( NULL , (XtPointer) im3d , NULL ) ;
07524 
07525          
07526 
07527          if( im3d->anat_now->markers == NULL ){
07528             SENSITIZE( marks->edits_bbox->wrowcol , False ) ;
07529             SENSITIZE( marks->tlrc_big_bbox->wrowcol , False ) ;
07530             AV_SENSITIZE( marks->disp_scolor_av , False ) ;
07531             AV_SENSITIZE( marks->disp_size_av   , False ) ;
07532             AV_SENSITIZE( marks->disp_gap_av    , False ) ;
07533             SENSITIZE( marks->action_rowcol , False ) ;
07534             SENSITIZE( marks->transform_pb , False ) ;
07535          } else {
07536             vwarp = WARPED_VIEW(im3d->vinfo->view_type) ;
07537             SENSITIZE( marks->edits_bbox->wrowcol ,
07538                             (Boolean) ISVALID_VIEW(vwarp) ) ;
07539             SENSITIZE( marks->tlrc_big_bbox->wrowcol ,
07540                        (Boolean) (vwarp==VIEW_TALAIRACH_TYPE) ) ;
07541             AV_SENSITIZE( marks->disp_scolor_av , True ) ;
07542             AV_SENSITIZE( marks->disp_size_av   , True ) ;
07543             AV_SENSITIZE( marks->disp_gap_av    , True ) ;
07544             SENSITIZE( marks->action_rowcol , True ) ;
07545          }
07546 
07547    
07548 
07549 
07550 #ifndef USING_LESSTIF
07551 #define REMANAGE_MARKS 1
07552 #else
07553 #define REMANAGE_MARKS 0
07554 #endif
07555 
07556 #if 1
07557        { static int first=1 ;
07558          if( REMANAGE_MARKS || first ){               
07559            XtUnmanageChild( marks->rowcol ) ;         
07560            XtUnmanageChild( marks->tog_rowcol ) ;     
07561            XtUnmanageChild( marks->control_rowcol ) ;
07562            XtUnmanageChild( marks->control_frame ) ;
07563            XtUnmanageChild( marks->tog_frame ) ;
07564            first = 0 ;
07565          }
07566        }
07567 #endif
07568 
07569          OPEN_PANEL(im3d,marks) ;
07570 
07571 #if 1
07572 #if 0
07573          XFlush( XtDisplay(marks->rowcol) ) ; XSync( XtDisplay(marks->rowcol),False ) ;
07574 #endif
07575          if( im3d->anat_now->markers != NULL ){  
07576             XtManageChild( marks->tog_rowcol ) ;
07577             XtManageChild( marks->tog_frame ) ;
07578          }
07579          XtManageChild( marks->control_rowcol ) ;
07580          XtManageChild( marks->control_frame ) ;
07581          XtManageChild( marks->rowcol ) ;
07582 #endif
07583 
07584       
07585 
07586          if( marks->old_visible != True &&
07587              im3d->anat_now->markers != NULL &&
07588              im3d->anat_now->markers->numset > 0 )
07589 
07590             AFNI_set_viewpoint( im3d , -1,-1,-1 , REDISPLAY_OVERLAY ) ;
07591       }
07592 
07593       EXRETURN ;
07594    }
07595 
07596    
07597 
07598    if( w == im3d->vwid->view->define_func_pb ){
07599       AFNI_viewing_widgets  * view  = im3d->vwid->view  ;
07600       AFNI_function_widgets * func  = im3d->vwid->func ;
07601 
07602       if( XtIsManaged(func->frame) ){
07603 
07604 STATUS("closing function") ;
07605 
07606          CLOSE_PANEL(im3d,func) ;
07607       } else {
07608 
07609 STATUS("opening function" ) ;
07610 
07611 #ifndef USING_LESSTIF
07612 #define REMANAGE_FUNC
07613 #endif
07614 
07615 #ifdef REMANAGE_FUNC
07616 STATUS("unmanaging children") ;
07617          XtUnmanageChild( im3d->vwid->func->rowcol ) ;
07618          XtUnmanageChild( im3d->vwid->func->thr_rowcol ) ;
07619          XtUnmanageChild( im3d->vwid->func->inten_rowcol ) ;
07620          XtUnmanageChild( im3d->vwid->func->options_rowcol ) ;
07621 #endif
07622 
07623 STATUS("opening panel") ;
07624          OPEN_PANEL(im3d,func) ;
07625 
07626 #ifdef REMANAGE_FUNC
07627 STATUS("remanaging children") ;
07628          XtManageChild( im3d->vwid->func->thr_rowcol ) ;
07629          XtManageChild( im3d->vwid->func->inten_rowcol ) ;
07630          XtManageChild( im3d->vwid->func->options_rowcol ) ;
07631          XtManageChild( im3d->vwid->func->rowcol ) ;
07632 #endif
07633          HIDE_SCALE(im3d) ;
07634          update_MCW_pbar( im3d->vwid->func->inten_pbar ) ;
07635          FIX_SCALE_SIZE(im3d) ; FIX_SCALE_VALUE(im3d) ;
07636 
07637 #ifdef FIX_SCALE_SIZE_LATER
07638         (void) XtAppAddTimeOut( MAIN_app,50,fixscale,im3d ) ; 
07639 #endif
07640 
07641 
07642       }
07643 
07644       EXRETURN ;
07645    }
07646 
07647    
07648 
07649    if( w == im3d->vwid->view->define_dmode_pb ){
07650       AFNI_viewing_widgets  * view  = im3d->vwid->view  ;
07651       AFNI_datamode_widgets * dmode = im3d->vwid->dmode ;
07652 
07653       if( XtIsManaged(dmode->frame) ){
07654 
07655 STATUS("closing dmode") ;
07656 
07657          CLOSE_PANEL(im3d,dmode) ;
07658       } else {
07659 
07660 STATUS("opening dmode" ) ;
07661 
07662          OPEN_PANEL(im3d,dmode) ;
07663       }
07664 
07665       EXRETURN ;
07666    }
07667 
07668    RESET_AFNI_QUIT(im3d) ;
07669    EXRETURN ;
07670 }
07671 
07672 
07673 
07674 void AFNI_marks_edits_CB( Widget w ,
07675                           XtPointer client_data , XtPointer call_data )
07676 {
07677    Three_D_View * im3d = (Three_D_View *) client_data ;
07678    AFNI_marks_widgets * marks ;
07679    int bval , vwarp ;
07680    Boolean transformable ;
07681 
07682 ENTRY("AFNI_marks_edits_CB") ;
07683 
07684    if( ! IM3D_VALID(im3d) ) EXRETURN ;
07685 
07686    marks = im3d->vwid->marks ;
07687    bval  = MCW_val_bbox( marks->edits_bbox ) ;
07688 
07689    marks->editable = (bval == 0) ? (False) : (True) ;
07690 
07691    if( im3d->anat_now->markers == NULL ) EXRETURN ;
07692 
07693    
07694 
07695 
07696 
07697 
07698    vwarp = WARPED_VIEW(im3d->vinfo->view_type) ;
07699 
07700    transformable =
07701       marks->editable                                         &&
07702       (im3d->anat_now->markers->aflags[1] != MARKACTION_NONE) &&
07703       (im3d->anat_now->markers->numdef == im3d->anat_now->markers->numset) &&
07704       ISVALID_VIEW(vwarp) ;
07705 
07706    
07707 
07708    SENSITIZE( marks->tog_frame         , True ) ;
07709    SENSITIZE( marks->action_set_pb     , marks->editable ) ;
07710    SENSITIZE( marks->action_clear_pb   , marks->editable ) ;
07711    SENSITIZE( marks->pop_set_pb        , marks->editable ) ;
07712    SENSITIZE( marks->pop_clear_pb      , marks->editable ) ;
07713    SENSITIZE( marks->action_quality_pb , transformable ) ;
07714    SENSITIZE( marks->transform_pb      , False ) ;  
07715 
07716    if( ! marks->editable ){
07717       AFNI_set_tog( -1 , MARKS_MAXNUM , marks->tog ) ;    
07718       AFNI_set_tog( -1 , MARKS_MAXNUM , marks->poptog ) ; 
07719    }
07720 
07721    RESET_AFNI_QUIT(im3d) ;
07722    EXRETURN ;
07723 }
07724 
07725 
07726 
07727 void AFNI_see_marks_CB( Widget w ,
07728                         XtPointer client_data , XtPointer call_data )
07729 {
07730    Three_D_View * im3d = (Three_D_View *) client_data ;
07731    AFNI_marks_widgets * marks ;
07732    AFNI_viewing_widgets * view ;
07733    int bval ;
07734 
07735 ENTRY("AFNI_see_marks_CB") ;
07736 
07737    if( ! IM3D_VALID(im3d) ) EXRETURN ;
07738 
07739    view  = im3d->vwid->view ;
07740    marks = im3d->vwid->marks ;
07741    bval  = MCW_val_bbox( view->see_marks_bbox ) ;
07742 
07743    marks->tag_visible = marks->ov_visible = (bval == 0) ? (False) : (True) ;
07744 
07745    if( w != NULL )
07746       AFNI_set_viewpoint( im3d , -1,-1,-1 , REDISPLAY_OVERLAY ) ;
07747 
07748    RESET_AFNI_QUIT(im3d) ;
07749    EXRETURN ;
07750 }
07751 
07752 
07753 
07754 
07755 
07756 void AFNI_crosshair_EV( Widget w , XtPointer cd ,
07757                         XEvent *ev , Boolean *continue_to_dispatch )
07758 {
07759    Three_D_View *im3d = (Three_D_View *)cd ;
07760 
07761 ENTRY("AFNI_crosshair_EV") ;
07762 
07763    if( ! IM3D_OPEN(im3d) ) EXRETURN ;
07764 
07765    
07766 
07767    switch( ev->type ){
07768 
07769      
07770 
07771      case ButtonPress:{
07772        XButtonEvent *event = (XButtonEvent *)ev ;
07773 
07774        if( event->button == Button3 ||
07775            (event->button == Button1 &&
07776             (event->state & (ShiftMask|ControlMask))) ){
07777 
07778          im3d->vwid->butx = event->x_root ;  
07779          im3d->vwid->buty = event->y_root ;
07780          event->button    = Button3 ;                                
07781          XmMenuPosition( im3d->vwid->imag->crosshair_menu , event ); 
07782          XtManageChild ( im3d->vwid->imag->crosshair_menu ) ;        
07783        }
07784 
07785        else {
07786          (void) MCW_popup_message( im3d->vwid->imag->crosshair_label ,
07787                                    " The road goes ever on and on\n"
07788                                    " Out from the door from where it began.\n"
07789                                    " Now, far ahead the road has gone\n"
07790                                    " And I must follow if I can.\n"
07791                                    " Pursuing it with eager feet\n"
07792                                    " Until it meets some other way\n"
07793                                    " Where many paths and errands meet\n"
07794                                    " And whither then I cannot say." ,
07795                                 MCW_USER_KILL | MCW_TIMER_KILL ) ;
07796        }
07797      }
07798      break ;
07799 
07800      
07801 
07802 #if 0
07803      case KeyPress:{
07804        XKeyEvent * event = (XKeyEvent *) ev ;
07805        char           buf[32] ;
07806        KeySym         ks ;
07807        int            nbuf ;
07808 
07809        buf[0] = '\0' ;
07810        nbuf = XLookupString( event , buf , 32 , &ks , NULL ) ;
07811 
07812        switch( buf[0] ){
07813          default: break ;
07814        }
07815      }
07816      break ;
07817 #endif
07818    }
07819 
07820    EXRETURN ;
07821 }
07822 
07823 
07824 
07825 
07826 
07827 void AFNI_crosshair_relabel( Three_D_View *im3d )
07828 {
07829    XmString xstr ;
07830    Boolean same ;
07831 
07832 ENTRY("AFNI_crosshair_relabel") ;
07833 
07834    if( !IM3D_OPEN(im3d) ) EXRETURN ;
07835    xstr = AFNI_crosshair_label( im3d ) ; if( xstr == NULL ) EXRETURN ;
07836    if( im3d->vinfo->old_crosshair_label == (XmString)NULL ) 
07837      same = False ;                                         
07838    else
07839      same = XmStringCompare( xstr , im3d->vinfo->old_crosshair_label ) ;
07840 
07841    if( same == False ){
07842       XtVaSetValues( im3d->vwid->imag->crosshair_label ,       
07843                         XmNlabelString , xstr ,                
07844                      NULL ) ;
07845       MCW_expose_widget( im3d->vwid->imag->crosshair_label ) ; 
07846       if( im3d->vinfo->old_crosshair_label != (XmString)NULL )
07847         XmStringFree(im3d->vinfo->old_crosshair_label) ;       
07848       im3d->vinfo->old_crosshair_label = xstr ;                
07849    } else {
07850       XmStringFree( xstr ) ;  
07851    }
07852 
07853    EXRETURN ;
07854 }
07855 
07856 
07857 
07858 
07859 
07860 
07861 void AFNI_crosshair_pop_CB( Widget w ,
07862                             XtPointer client_data , XtPointer call_data )
07863 {
07864    Three_D_View *im3d = (Three_D_View *)client_data ;
07865    static char *cord_dicom="RAI" , *cord_spm="LPI" ;
07866    char *val=NULL ;
07867    int ii ;
07868 
07869 ENTRY("AFNI_crosshair_pop_CB") ;
07870 
07871         if( w == im3d->vwid->imag->crosshair_dicom_pb ) val = cord_dicom ;
07872    else if ( w == im3d->vwid->imag->crosshair_spm_pb  ) val = cord_spm   ;
07873 
07874    if( val != NULL && strcmp(GLOBAL_argopt.orient_code,val) != 0 ){
07875      POPDOWN_string_chooser ;   
07876      MCW_strncpy(GLOBAL_argopt.orient_code,val,4) ;
07877      THD_coorder_fill( GLOBAL_argopt.orient_code , &GLOBAL_library.cord ) ;
07878      for( ii=0 ; ii < MAX_CONTROLLERS ; ii++ )
07879        AFNI_crosshair_relabel( GLOBAL_library.controllers[ii] ) ;
07880    }
07881    EXRETURN ;
07882 }
07883 
07884 
07885 
07886 
07887 
07888 void AFNI_imag_pop_CB( Widget w ,
07889                        XtPointer client_data , XtPointer call_data )
07890 {
07891    Three_D_View *im3d = (Three_D_View *) client_data ;
07892    MCW_imseq *seq ;
07893 
07894 ENTRY("AFNI_imag_pop_CB") ;
07895 
07896    if( ! IM3D_VALID(im3d) ) EXRETURN ;
07897 
07898    XtVaGetValues( im3d->vwid->imag->popmenu, XmNuserData, &seq, NULL ) ;
07899    AFNI_view_setter(im3d,seq) ;
07900 
07901    
07902 
07903    if( w == im3d->vwid->imag->pop_jumpback_pb ){
07904      int ij,jj,kk ;
07905 
07906      ij = im3d->vinfo->i1_old ;  
07907      jj = im3d->vinfo->j2_old ;
07908      kk = im3d->vinfo->k3_old ;
07909 
07910      SAVE_VPT(im3d) ;  
07911      AFNI_set_viewpoint( im3d , ij,jj,kk , REDISPLAY_OVERLAY ) ; 
07912    }
07913 
07914    
07915 
07916    else if( w == im3d->vwid->imag->pop_imageonly_pb ){
07917       if( ISQ_REALZ(seq) )
07918          drive_MCW_imseq( seq , isqDR_onoffwid , (XtPointer) isqDR_togwid ) ;
07919    }
07920 
07921    
07922 
07923    else if( w == im3d->vwid->imag->pop_jumpto_pb &&
07924             im3d->type == AFNI_3DDATA_VIEW         ){
07925 
07926       char tbuf[128] ;
07927 
07928       if( ISQ_REALZ(seq) ){
07929         sprintf(tbuf , "Enter new x y z (%s mm):" , GLOBAL_library.cord.orcode ) ;
07930         MCW_choose_string( seq->wbar , tbuf , NULL ,
07931                            AFNI_jumpto_CB , (XtPointer) im3d ) ;
07932       }
07933    }
07934 
07935    else if( w == im3d->vwid->imag->pop_jumpto_ijk_pb &&
07936             im3d->type == AFNI_3DDATA_VIEW             ){
07937 
07938       if( ISQ_REALZ(seq) ){
07939          MCW_choose_string( seq->wbar , "Enter new i j k:" , NULL ,
07940                             AFNI_jumpto_ijk_CB , (XtPointer) im3d ) ;
07941       }
07942    }
07943 
07944    
07945 
07946    else if( w == im3d->vwid->imag->pop_mnito_pb &&
07947             im3d->type == AFNI_3DDATA_VIEW        ){
07948 
07949       if( ISQ_REALZ(seq) && CAN_TALTO(im3d) ){
07950          MCW_choose_string( seq->wbar , "Enter MNI x,y,z:" , NULL ,
07951                             AFNI_mnito_CB , (XtPointer) im3d ) ;
07952       } else {
07953          XBell(XtDisplay(w),100) ; 
07954       }
07955    }
07956 
07957    
07958 
07959    else if( w == im3d->vwid->imag->pop_sumato_pb &&
07960             SESSION_HAS_SUMA(im3d->ss_now)       &&
07961             im3d->type == AFNI_3DDATA_VIEW         ){
07962 
07963       if( ISQ_REALZ(seq) ){
07964          MCW_choose_string( seq->wbar , "Enter SUMA node ID:" , NULL ,
07965                             AFNI_sumato_CB , (XtPointer) im3d ) ;
07966       }
07967    }
07968 
07969    
07970 
07971    else if( w == im3d->vwid->imag->pop_talto_pb &&
07972             im3d->type == AFNI_3DDATA_VIEW      &&
07973             CAN_TALTO(im3d)                       ){
07974 
07975       if( ! TTO_labeled ){  
07976          int ii ;
07977          for( ii=0 ; ii < TTO_COUNT ; ii++ ){
07978             TTO_labels[ii] = (char *) malloc( sizeof(char) * TTO_LMAX ) ;
07979             sprintf( TTO_labels[ii] , TTO_FORMAT , TTO_list[ii].name ,
07980                      TTO_list[ii].xx , TTO_list[ii].yy , TTO_list[ii].zz ) ;
07981          }
07982          TTO_labeled = 1 ;
07983       }
07984       if( ISQ_REALZ(seq) ){
07985          MCW_choose_strlist( seq->wbar ,
07986                              "Brain Structure (from San Antonio Talairach Daemon)" ,
07987                              TTO_COUNT , TTO_current , TTO_labels ,
07988                              AFNI_talto_CB , (XtPointer) im3d ) ;
07989       }
07990    }
07991 
07992    
07993 
07994    else if( w == im3d->vwid->imag->pop_whereami_pb &&
07995             w != NULL                              &&
07996             im3d->type == AFNI_3DDATA_VIEW         &&
07997             CAN_TALTO(im3d)                          ){
07998 
07999       char *tlab ;
08000 
08001       
08002 
08003       if( im3d->vwid->imag->pop_whereami_twin != NULL ){
08004          MCW_textwinkill_CB(NULL,
08005                             (XtPointer)im3d->vwid->imag->pop_whereami_twin,NULL);
08006          im3d->vwid->imag->pop_whereami_twin = NULL ;
08007       }
08008 
08009       
08010 
08011       tlab = AFNI_ttatlas_query( im3d ) ;
08012 
08013       
08014 
08015       if( tlab != NULL ){
08016 
08017          im3d->vwid->imag->pop_whereami_twin =
08018            new_MCW_textwin_2001( seq->wbar , tlab , TEXT_READONLY ,
08019                                  AFNI_pop_whereami_kill , im3d     ) ;
08020 
08021 #if 0
08022          
08023 
08024          NULLIFY_ON_DESTROY( im3d->vwid->imag->pop_whereami_twin ,
08025                              im3d->vwid->imag->pop_whereami_twin->wshell ) ;
08026 #endif
08027 
08028          XtVaSetValues( im3d->vwid->imag->pop_whereami_twin->wtext ,
08029                           XmNresizeHeight , True ,
08030                           XmNresizeWidth  , True ,
08031                         NULL ) ;
08032 
08033          MCW_register_hint( im3d->vwid->imag->pop_whereami_twin->wtext ,
08034                             "Use BHelp for documentation" ) ;
08035 
08036          MCW_register_help( im3d->vwid->imag->pop_whereami_twin->wtext ,
08037           "Lists the brain structures near the crosshair focus point\n"
08038           "according to the Talairach Daemon database (kindly provided\n"
08039           "by Jack Lancaster and Peter Fox of RIC UTHSCSA).\n"
08040           "\n"
08041           "The search is conducted outwards from the focus point, until\n"
08042           "9 different structures are found, or a 7 mm radius is reached,\n"
08043           "whichever occurs first. (Distances are rounded to nearest 1 mm,\n"
08044           "the grid spacing on which the database is constructed.) Labels\n"
08045           "reported on different output lines came from different voxels.\n"
08046           "\n"
08047           "In the database, some voxels have 2 labels - a larger scale\n"
08048           "'gyral' name and a finer scale 'area' name.  Locations that\n"
08049           "are doubly labeled will appear with a listing like\n"
08050           "    Within 2 mm: Right Precuneus -AND- Right Brodmann area 31\n"
08051           "In the database there are\n"
08052           "    1,205,737 voxels with at least one label\n"
08053           "      709,953 voxels with only a 'gyral' label\n"
08054           "       15,898 voxels with only a 'area' label\n"
08055           "      479,886 voxels with both types of labels\n"
08056           "A list of all the labels (of either type) is presented by the\n"
08057           "'Talairach to' control.  In the database, there are\n"
08058           "           50 'gyral' labels (times 2 for Left and Right)\n"
08059           "           68 'area' labels\n"
08060           "          355 distinct combinations of labels\n"
08061           "Note Very Well:\n"
08062           "* This feature of AFNI is experimental, and is subject to change.\n"
08063           "* The Atlas is only useful as a ROUGH guide to determining where\n"
08064           "    you are in any individual brain.  Do not rely exclusively on\n"
08065           "    the Atlas for brain region identification: you must use your\n"
08066           "    knowledge, skills, and abilities as well.\n"
08067           "* Do NOT use this feature for surgical or therapeutic planning!!!"
08068          ) ;
08069 
08070          free(tlab) ;
08071       }
08072    }
08073 
08074    
08075 
08076    else if( w == im3d->vwid->imag->pop_ttren_pb           &&
08077             w != NULL                                     &&
08078             im3d->type == AFNI_3DDATA_VIEW                &&
08079             im3d->vinfo->view_type == VIEW_TALAIRACH_TYPE && 
08080             CAN_TALTO(im3d)                                 ){
08081 
08082       TTRR_popup( im3d ) ;
08083    }
08084 
08085    
08086 
08087    else if( w == im3d->vwid->imag->pop_environment_pb &&
08088             w != NULL                                   ){
08089 
08090      AFNI_misc_CB( im3d->vwid->dmode->misc_environ_pb ,
08091                    (XtPointer) im3d , (XtPointer) NULL ) ;
08092    }
08093 
08094    
08095 
08096    else if( w == im3d->vwid->imag->pop_drawdataset_pb &&
08097             w != NULL                                   ){
08098 
08099      char cmd[128] , cc='A'+AFNI_controller_index(im3d) ;
08100      int xx,yy ;
08101 
08102 #if 0
08103      MCW_widget_geom(im3d->vwid->top_shell,NULL,NULL,&xx,&yy); xx+=29; yy+=19;
08104 #else
08105      xx = im3d->vwid->butx ; yy = im3d->vwid->buty ;
08106 #endif
08107      sprintf(cmd,"OPEN_WINDOW %c.plugin.Draw_Dataset geom=+%d+%d",cc,xx,yy) ;
08108      (void) AFNI_driver(cmd) ;
08109    }
08110 
08111    
08112 
08113    
08114 
08115    RESET_AFNI_QUIT(im3d) ;
08116    EXRETURN ;
08117 }
08118 
08119 
08120 
08121 
08122 
08123 void AFNI_talto_CB( Widget w , XtPointer cd , MCW_choose_cbs * cbs )
08124 {
08125    Three_D_View * im3d = (Three_D_View *) cd ;
08126    THD_dataxes  * daxes ;
08127    float xx,yy,zz ;
08128    int nn , ii,jj,kk ;
08129    THD_fvec3 fv,tv ; THD_ivec3 iv ;
08130 
08131 ENTRY("AFNI_talto_CB") ;
08132 
08133    
08134 
08135    if( ! IM3D_VALID(im3d) || im3d->type != AFNI_3DDATA_VIEW ) EXRETURN ;
08136 
08137    if( !CAN_TALTO(im3d)             ||
08138        cbs->reason != mcwCR_integer   ){
08139 
08140       POPDOWN_strlist_chooser ;
08141       XBell( im3d->dc->display , 100 ) ;
08142       EXRETURN ;
08143    }
08144 
08145    nn = cbs->ival ;
08146    if( nn < 0 || nn >= TTO_COUNT ) EXRETURN ;
08147    TTO_current = nn ;
08148 
08149    
08150 
08151    xx = TTO_list[nn].xx ; yy = TTO_list[nn].yy ; zz = TTO_list[nn].zz ;
08152 
08153    LOAD_ANAT_VIEW(im3d) ;  
08154 
08155    LOAD_FVEC3(tv,xx,yy,zz) ; 
08156 
08157    
08158 
08159 
08160    if( im3d->anat_now->view_type != VIEW_TALAIRACH_TYPE )
08161       tv = AFNI_transform_vector( im3d->anat_dset[VIEW_TALAIRACH_TYPE] ,
08162                                   tv , im3d->anat_now ) ;
08163 
08164    fv = THD_dicomm_to_3dmm( im3d->anat_now , tv ) ;
08165    iv = THD_3dmm_to_3dind ( im3d->anat_now , fv ) ;
08166    ii = iv.ijk[0] ; jj = iv.ijk[1] ; kk = iv.ijk[2] ;
08167 
08168    daxes = CURRENT_DAXES(im3d->anat_now) ;
08169    if( ii >= 0 && ii < daxes->nxx &&
08170        jj >= 0 && jj < daxes->nyy && kk >= 0 && kk < daxes->nzz   ){
08171 
08172       SAVE_VPT(im3d) ;
08173       AFNI_set_viewpoint( im3d , ii,jj,kk , REDISPLAY_ALL ) ; 
08174    } else {
08175       XBell( im3d->dc->display , 100 ) ;
08176    }
08177    EXRETURN ;
08178 }
08179 
08180 
08181 
08182 
08183 
08184 void AFNI_pop_whereami_kill( Three_D_View * im3d )
08185 {
08186    if( im3d == NULL ) return ;
08187 
08188    MCW_unregister_hint( im3d->vwid->imag->pop_whereami_twin->wtext ) ;
08189    MCW_unregister_help( im3d->vwid->imag->pop_whereami_twin->wtext ) ;
08190 
08191    im3d->vwid->imag->pop_whereami_twin = NULL ;
08192    return ;
08193 }
08194 
08195 
08196 
08197 char * AFNI_ttatlas_query( Three_D_View * im3d )
08198 {
08199    static int have_TT = -1 ;
08200 
08201    if( !IM3D_OPEN(im3d) || !CAN_TALTO(im3d) ) return NULL ;
08202 
08203    
08204 
08205    if( have_TT == -1 ){
08206       have_TT = TT_load_atlas() ;
08207       if( !have_TT ) return NULL ;
08208    }
08209 
08210    if( have_TT ){
08211      THD_fvec3 tv ; char *tlab ;
08212 
08213      
08214 
08215      LOAD_FVEC3(tv,im3d->vinfo->xi,im3d->vinfo->yj,im3d->vinfo->zk) ;
08216 
08217      
08218 
08219      if( im3d->anat_now->view_type != VIEW_TALAIRACH_TYPE )
08220         tv = AFNI_transform_vector( im3d->anat_now , tv ,
08221                                     im3d->anat_dset[VIEW_TALAIRACH_TYPE] ) ;
08222 
08223      
08224 
08225      tlab = TT_whereami( tv.xyz[0] , tv.xyz[1] , tv.xyz[2] ) ;
08226      return tlab ;
08227    }
08228 
08229    return NULL ;
08230 }
08231 
08232 
08233 
08234 
08235 
08236 void AFNI_see_ttatlas_CB( Widget w, XtPointer cd, XtPointer cb)
08237 {
08238    Three_D_View * im3d = (Three_D_View *) cd ;
08239    int newsee = MCW_val_bbox(im3d->vwid->func->see_ttatlas_bbox) ;
08240 
08241    if( newsee == im3d->vinfo->see_ttatlas ) return ;
08242 
08243    im3d->vinfo->see_ttatlas = newsee ;
08244 
08245    if( im3d->anat_now->view_type == VIEW_TALAIRACH_TYPE )
08246       AFNI_set_viewpoint( im3d , -1,-1,-1 , REDISPLAY_OVERLAY ) ;  
08247 
08248    return ;
08249 }
08250 
08251 
08252 
08253 
08254 
08255 void AFNI_mnito_CB( Widget w , XtPointer cd , MCW_choose_cbs * cbs )
08256 {
08257    Three_D_View * im3d = (Three_D_View *) cd ;
08258    float xx,yy,zz ;
08259    char dum1[32],dum2[32];
08260    int nn ;
08261    THD_fvec3 tv ;
08262 
08263 ENTRY("AFNI_mnito_CB") ;
08264 
08265    if( ! IM3D_VALID(im3d) || im3d->type != AFNI_3DDATA_VIEW ) EXRETURN ;
08266 
08267    if( !CAN_TALTO(im3d) || cbs->reason != mcwCR_string  ){   
08268       POPDOWN_string_chooser ;
08269       XBell( im3d->dc->display , 100 ) ;
08270       EXRETURN ;
08271    }
08272 
08273    nn = sscanf( cbs->cval , "%f%[ ,]%f%[ ,]%f" , &xx,dum1,&yy,dum2,&zz ) ;
08274    if( nn != 5 ){ XBell( im3d->dc->display , 100 ) ; EXRETURN ; }
08275 
08276    LOAD_ANAT_VIEW(im3d) ;
08277 
08278    LOAD_FVEC3(tv,xx,yy,zz) ;    
08279    tv = THD_mni_to_tta( tv ) ;  
08280 
08281    
08282 
08283    if( im3d->anat_now->view_type != VIEW_TALAIRACH_TYPE )
08284       tv = AFNI_transform_vector( im3d->anat_dset[VIEW_TALAIRACH_TYPE] ,
08285                                   tv , im3d->anat_now ) ;
08286 
08287    nn = AFNI_jumpto_dicom( im3d , tv.xyz[0], tv.xyz[1], tv.xyz[2] ) ;
08288    if( nn < 0 ) XBell( im3d->dc->display , 100 ) ;
08289 
08290    RESET_AFNI_QUIT(im3d) ;
08291    EXRETURN ;
08292 }
08293 
08294 
08295 
08296 
08297 
08298 void AFNI_jumpto_CB( Widget w , XtPointer cd , MCW_choose_cbs * cbs )
08299 {
08300    Three_D_View * im3d = (Three_D_View *) cd ;
08301    float xx,yy,zz ;
08302    char dum1[32],dum2[32];
08303    int nn ;
08304 
08305 ENTRY("AFNI_jumpto_CB") ;
08306 
08307    if( ! IM3D_VALID(im3d) || im3d->type != AFNI_3DDATA_VIEW ) EXRETURN ;
08308    if( cbs->reason != mcwCR_string ) EXRETURN ;  
08309 
08310    nn = sscanf( cbs->cval , "%f%[ ,]%f%[ ,]%f" , &xx,dum1,&yy,dum2,&zz ) ;
08311    if( nn != 5 ){ XBell( im3d->dc->display , 100 ) ; EXRETURN ; }
08312 
08313    THD_coorder_to_dicom( &GLOBAL_library.cord , &xx,&yy,&zz ) ;
08314 
08315    nn = AFNI_jumpto_dicom( im3d , xx,yy,zz ) ;
08316    if( nn < 0 ) XBell( im3d->dc->display , 100 ) ;
08317 
08318    RESET_AFNI_QUIT(im3d) ;
08319    EXRETURN ;
08320 }
08321 
08322 
08323 
08324 int AFNI_jumpto_dicom( Three_D_View * im3d , float xx, float yy, float zz )
08325 {
08326    THD_dataxes  * daxes ;
08327    THD_fvec3 fv ; THD_ivec3 iv ;
08328    int ii,jj,kk ;
08329 
08330 ENTRY("AFNI_jumpto_dicom") ;
08331 
08332    LOAD_ANAT_VIEW(im3d) ;  
08333 
08334    fv = THD_dicomm_to_3dmm( im3d->anat_now , TEMP_FVEC3(xx,yy,zz) ) ;
08335    iv = THD_3dmm_to_3dind ( im3d->anat_now , fv ) ;
08336    ii = iv.ijk[0] ; jj = iv.ijk[1] ; kk = iv.ijk[2] ;
08337 
08338    daxes = CURRENT_DAXES(im3d->anat_now) ;
08339    if( ii >= 0 && ii < daxes->nxx &&
08340        jj >= 0 && jj < daxes->nyy && kk >= 0 && kk < daxes->nzz ){
08341 
08342       SAVE_VPT(im3d) ;
08343       AFNI_set_viewpoint( im3d , ii,jj,kk , REDISPLAY_ALL ) ; 
08344       RETURN(1) ;
08345    } else {
08346       XBell( im3d->dc->display , 100 ) ;
08347       RETURN(-1) ;
08348    }
08349 }
08350 
08351 
08352 
08353 int AFNI_jumpto_ijk( Three_D_View * im3d , int ii, int jj, int kk )
08354 {
08355    THD_dataxes * daxes ;
08356 
08357 ENTRY("AFNI_jumpto_ijk") ;
08358 
08359    LOAD_ANAT_VIEW(im3d) ;
08360 
08361    daxes = CURRENT_DAXES(im3d->anat_now) ;
08362    if( ii >= 0 && ii < daxes->nxx &&
08363        jj >= 0 && jj < daxes->nyy && kk >= 0 && kk < daxes->nzz ){
08364 
08365       SAVE_VPT(im3d) ;
08366       AFNI_set_viewpoint( im3d , ii,jj,kk , REDISPLAY_ALL ) ; 
08367       RETURN(1) ;
08368    } else {
08369       XBell( im3d->dc->display , 100 ) ;
08370       RETURN(-1) ;
08371    }
08372 }
08373 
08374 
08375 
08376 void AFNI_jumpto_ijk_CB( Widget w , XtPointer cd , MCW_choose_cbs * cbs )
08377 {
08378    Three_D_View * im3d = (Three_D_View *) cd ;
08379    int ii,jj,kk ;
08380    int nn ;
08381    char dum1[32],dum2[32];
08382 
08383 ENTRY("AFNI_jumpto_CB") ;
08384 
08385    if( ! IM3D_VALID(im3d) || im3d->type != AFNI_3DDATA_VIEW ) EXRETURN ;
08386    if( cbs->reason != mcwCR_string ) EXRETURN ;  
08387 
08388    nn = sscanf( cbs->cval , "%d%[ ,]%d%[ ,]%d" , &ii,dum1,&jj,dum2,&kk ) ;
08389    if( nn != 5 ){ XBell( im3d->dc->display , 100 ) ; EXRETURN ; }
08390 
08391    nn = AFNI_jumpto_ijk( im3d , ii,jj,kk ) ;
08392    if( nn < 0 ) XBell( im3d->dc->display , 100 ) ;
08393 
08394    RESET_AFNI_QUIT(im3d) ;
08395    EXRETURN ;
08396 }
08397 
08398 
08399 
08400 
08401 
08402 void AFNI_sumato_CB( Widget w , XtPointer cd , MCW_choose_cbs * cbs )
08403 {
08404    Three_D_View * im3d = (Three_D_View *) cd ;
08405    int nn , ii ;
08406 
08407 ENTRY("AFNI_sumato_CB") ;
08408 
08409    if( !IM3D_VALID(im3d) || im3d->type != AFNI_3DDATA_VIEW ) EXRETURN ;
08410    if( cbs->reason != mcwCR_string )                         EXRETURN ;
08411    if( !SESSION_HAS_SUMA(im3d->ss_now) )                     EXRETURN ;
08412 
08413    nn = -1 ;
08414    sscanf( cbs->cval , "%d" , &nn ) ;
08415    ii = SUMA_find_node_id( im3d->ss_now->su_surf[0] , nn ) ;
08416    if( ii < 0 ){ XBell(im3d->dc->display,100); EXRETURN; }
08417 
08418    (void) AFNI_jumpto_dicom( im3d ,
08419                              im3d->ss_now->su_surf[0]->ixyz[ii].x ,
08420                              im3d->ss_now->su_surf[0]->ixyz[ii].y ,
08421                              im3d->ss_now->su_surf[0]->ixyz[ii].z  ) ;
08422 
08423    RESET_AFNI_QUIT(im3d) ;
08424    EXRETURN ;
08425 }
08426 
08427 
08428 
08429 
08430 
08431 #define BEEP_AND_RETURN { XBell(XtDisplay(w),100); EXRETURN ; }
08432 
08433 void AFNI_marks_transform_CB( Widget w ,
08434                               XtPointer client_data , XtPointer call_data )
08435 {
08436    Three_D_View     * im3d = (Three_D_View *) client_data ;
08437    THD_marker_set   * markers ;
08438    THD_warp         * warp ;
08439    THD_3dim_dataset * new_dset ;
08440    THD_session      * ss ;
08441    int                vnew , vvv , sss , aaa , fff , id ;
08442    float              resam_size ;
08443    Widget             wmsg ;
08444 
08445 ENTRY("AFNI_marks_transform_CB") ;
08446 
08447    
08448 
08449    if( ! IM3D_VALID(im3d) ) EXRETURN ;
08450 
08451    markers = im3d->anat_now->markers ;
08452    if(markers == NULL || markers->aflags[1] != MARKACTION_WARP) BEEP_AND_RETURN ;
08453 
08454    vnew = WARPED_VIEW(im3d->vinfo->view_type) ; 
08455    if( !ISVALID_VIEW(vnew) ) BEEP_AND_RETURN ;
08456 
08457    
08458 
08459    warp = AFNI_make_warp( im3d ) ;
08460    if( warp == NULL ) BEEP_AND_RETURN ;
08461 
08462    
08463 
08464    resam_size = im3d->vinfo->resam_vox ;
08465    new_dset   = AFNI_init_warp( im3d , im3d->anat_now , warp , resam_size ) ;
08466    if( new_dset == NULL ) BEEP_AND_RETURN ;
08467 
08468    { char his[128] ;
08469      tross_Copy_History( im3d->anat_now , new_dset ) ;
08470      sprintf(his,"afni: transformed to %s",VIEW_typestr[vnew]) ;
08471      tross_Append_History( new_dset , his ) ;
08472    }
08473 
08474    
08475 
08476 
08477 
08478 
08479    vvv = vnew ;
08480    while( ISVALID_VIEW(vvv) && ISVALID_3DIM_DATASET(im3d->anat_dset[vvv]) ){
08481       DSET_MARK_FOR_DEATH( im3d->anat_dset[vvv] ) ;
08482       vvv = WARPED_VIEW(vvv) ;
08483    }
08484 
08485    AFNI_mark_for_death(GLOBAL_library.sslist ) ;        
08486    AFNI_andersonville (GLOBAL_library.sslist , True ) ; 
08487 
08488    
08489 
08490    sss = im3d->vinfo->sess_num ;
08491    aaa = im3d->vinfo->anat_num ;
08492    fff = im3d->vinfo->func_num ;
08493    GLOBAL_library.sslist->ssar[sss]->dsset[aaa][vnew] = new_dset ;
08494 
08495    
08496 
08497 
08498    for( id=0 ; id <= LAST_VIEW_TYPE ; id++ ){
08499       im3d->anat_dset[id] = GLOBAL_library.sslist->ssar[sss]->dsset[aaa][id] ;
08500       im3d->fim_dset[id]  = GLOBAL_library.sslist->ssar[sss]->dsset[fff][id] ;
08501 
08502       if( ISVALID_3DIM_DATASET(im3d->anat_dset[id]) )
08503         SENSITIZE( im3d->vwid->view->view_bbox->wbut[id], True ) ;
08504       else
08505         SENSITIZE( im3d->vwid->view->view_bbox->wbut[id], False) ;
08506    }
08507 
08508 STATUS("writing new dataset") ;
08509 
08510    (void) THD_write_3dim_dataset( NULL,NULL , new_dset , False ) ; 
08511 
08512    
08513 
08514 
08515 
08516 
08517    if( im3d->vinfo->view_type == VIEW_ORIGINAL_TYPE ){
08518       int id ;
08519       THD_3dim_dataset * dss ;
08520 
08521       
08522 
08523 STATUS("re-anat_parenting anatomical datasets in this session") ;
08524 
08525       for( id=0 ; id < im3d->ss_now->num_dsset ; id++ ){
08526          dss = im3d->ss_now->dsset[id][0] ;
08527 
08528          if( ! ISVALID_3DIM_DATASET(dss) || dss == im3d->anat_now ) continue ;
08529 
08530          if( dss->markers != NULL ) SINGLE_KILL(dss->kl,dss->markers) ;
08531          dss->markers = NULL ;
08532 
08533          if( dss->anat_parent == NULL ){
08534            dss->anat_parent = im3d->anat_now ;
08535            MCW_strncpy( dss->anat_parent_name ,
08536                         im3d->anat_now->self_name , THD_MAX_NAME ) ;
08537            dss->anat_parent_idcode = im3d->anat_now->idcode ;
08538          }
08539       }
08540    }
08541 
08542    
08543 
08544 
08545 
08546    AFNI_make_descendants( GLOBAL_library.sslist ) ;
08547 
08548    
08549 
08550    if( GLOBAL_argopt.auto_purge == True ) AFNI_purge_unused_dsets() ;
08551 
08552    
08553 
08554 
08555    for( sss=0 ; sss < GLOBAL_library.sslist->num_sess ; sss++ ){
08556       ss = GLOBAL_library.sslist->ssar[sss] ;
08557       if( ISVALID_SESSION(ss) ) AFNI_force_adoption( ss , GLOBAL_argopt.warp_4D ) ;
08558    }
08559 
08560    
08561 
08562 #if 0
08563    XtSetSensitive( im3d->vwid->top_shell , True ) ;
08564    SHOW_AFNI_READY ;
08565 #endif
08566 
08567    AFNI_marks_action_CB( NULL , (XtPointer) im3d , NULL ) ;
08568 
08569    MPROBE ;
08570    EXRETURN ;
08571 }
08572 
08573 
08574 
08575 
08576 
08577 
08578 
08579 
08580 
08581 
08582 
08583 
08584 
08585 
08586 
08587 
08588 
08589 #define MVEC(im) \
08590  TEMP_FVEC3(markers->xyz[im][0],markers->xyz[im][1],markers->xyz[im][2])
08591 
08592 THD_warp * AFNI_make_warp( Three_D_View * im3d )
08593 {
08594    THD_3dim_dataset * anat    = im3d->anat_now ;
08595    THD_marker_set   * markers = im3d->anat_now->markers ;
08596    THD_warp         * warp ;
08597    Boolean good ;
08598 
08599 ENTRY("AFNI_make_warp") ;
08600 
08601    
08602 
08603    good = AFNI_marks_quality_check( False , im3d ) ;
08604    if( !good ) RETURN(NULL) ;
08605 
08606    
08607 
08608 
08609    warp = myXtNew( THD_warp ) ;
08610 
08611    switch( markers->type ){  
08612 
08613       default: RETURN(NULL) ;      
08614 
08615       
08616 
08617       case MARKSET_BOUNDING:{
08618          THD_talairach_12_warp * twarp = (THD_talairach_12_warp *) warp ;
08619          THD_fvec3 mant,mpos,msup,minf,mrig,mlef , pcie ;
08620          float dist_sup , dist_inf , dist_ant , dist_med , dist_pos ,
08621                dist_lef , dist_rig ;
08622          float scale_S , scale_I , scale_A , scale_M , scale_P ,
08623                scale_L , scale_R , shift_P ;
08624          float bot_S   , bot_I   , bot_A   , bot_M   , bot_P ,
08625                bot_L   , bot_R ;
08626          float top_S   , top_I   , top_A   , top_M   , top_P ,
08627                top_L   , top_R ;
08628          THD_fvec3 bv_A , bv_M , bv_P , sv_A , sv_M , sv_P ;
08629 
08630          
08631 
08632          twarp->type = WARP_TALAIRACH_12_TYPE ;
08633 
08634          
08635 
08636          mant = THD_3dmm_to_dicomm( anat , MVEC(IMARK_MANT) ) ;
08637          mpos = THD_3dmm_to_dicomm( anat , MVEC(IMARK_MPOS) ) ;
08638          msup = THD_3dmm_to_dicomm( anat , MVEC(IMARK_MSUP) ) ;
08639          minf = THD_3dmm_to_dicomm( anat , MVEC(IMARK_MINF) ) ;
08640          mrig = THD_3dmm_to_dicomm( anat , MVEC(IMARK_MRIG) ) ;
08641          mlef = THD_3dmm_to_dicomm( anat , MVEC(IMARK_MLEF) ) ;
08642 
08643          
08644 
08645          LOAD_FVEC3( pcie ,
08646                      anat->warp_parent->markers->xyz[IMARK_PCIE][0] ,
08647                      anat->warp_parent->markers->xyz[IMARK_PCIE][1] ,
08648                      anat->warp_parent->markers->xyz[IMARK_PCIE][2]  ) ;
08649 
08650          pcie = THD_3dmm_to_dicomm( anat->warp_parent , pcie ) ;
08651          pcie = AFNI_transform_vector( anat->warp_parent , pcie , anat ) ;
08652 
08653          
08654 
08655          dist_ant = -mant.xyz[1] ;
08656          dist_med =  pcie.xyz[1] ;
08657          dist_pos =  mpos.xyz[1] - pcie.xyz[1] ;
08658 
08659          dist_sup =  msup.xyz[2] ;
08660          dist_inf = -minf.xyz[2] ;
08661          dist_lef =  mlef.xyz[0] ;
08662          dist_rig = -mrig.xyz[0] ;
08663 
08664          
08665 
08666 
08667          scale_A = ATLAS_FRONT_TO_AC / dist_ant ;
08668          scale_M = ATLAS_AC_TO_PC    / dist_med ;
08669          scale_P = ATLAS_PC_TO_BACK  / dist_pos ;
08670          scale_S = ATLAS_AC_TO_TOP   / dist_sup ;
08671          scale_I = ATLAS_BOT_TO_AC   / dist_inf ;
08672          scale_L = ATLAS_AC_TO_LAT   / dist_lef ;
08673          scale_R = ATLAS_AC_TO_LAT   / dist_rig ;
08674 
08675          shift_P = scale_P * dist_med - ATLAS_AC_TO_PC ;
08676 
08677          
08678 
08679          LOAD_FVEC3( bv_A , 0,0,0 ) ; bv_M = sv_A = sv_M = bv_A ;
08680 
08681          LOAD_FVEC3( bv_P , 0 , shift_P , 0 ) ;
08682          LOAD_FVEC3( sv_P , 0 , -shift_P / scale_P , 0 ) ;
08683 
08684          
08685 
08686          bot_A = -9999.0        ; top_A = 0.0 ;
08687          bot_M =     0.0        ; top_M = ATLAS_AC_TO_PC ;
08688          bot_P = ATLAS_AC_TO_PC ; top_P = 9999.0 ;
08689 
08690          bot_R = -9999.0        ; top_R =    0.0 ;
08691          bot_L =     0.0        ; top_L = 9999.9 ;
08692 
08693          bot_I = -9999.0        ; top_I =    0.0 ;
08694          bot_S =     0.0        ; top_S = 9999.9 ;
08695 
08696          
08697 
08698 
08699 
08700 
08701 
08702 
08703 
08704 
08705    
08706 
08707 
08708 #define MAKE_MAP(xx,yy,zz) \
08709 (\
08710    LOAD_DIAG_MAT( twarp->warp[W_ ## xx ## yy ## zz].mfor ,      \
08711                   scale_ ## xx , scale_ ## yy , scale_ ## zz ) ,\
08712 \
08713    LOAD_DIAG_MAT( twarp->warp[W_ ## xx ## yy ## zz].mbac ,                 \
08714            1.0 / scale_ ## xx , 1.0 / scale_ ## yy , 1.0 / scale_ ## zz ) ,\
08715 \
08716    twarp->warp[W_ ## xx ## yy ## zz].bvec = bv_ ## yy , \
08717 \
08718    twarp->warp[W_ ## xx ## yy ## zz].svec = sv_ ## yy , \
08719 \
08720    LOAD_FVEC3( twarp->warp[W_ ## xx ## yy ## zz].bot ,   \
08721                bot_ ## xx , bot_ ## yy , bot_ ## zz   ) ,\
08722 \
08723    LOAD_FVEC3( twarp->warp[W_ ## xx ## yy ## zz].top ,   \
08724                top_ ## xx , top_ ## yy , top_ ## zz   )  \
08725 )
08726 
08727    
08728 
08729          MAKE_MAP(R,A,S) ;   
08730          MAKE_MAP(L,A,S) ;   
08731          MAKE_MAP(R,M,S) ;   
08732          MAKE_MAP(L,M,S) ;   
08733          MAKE_MAP(R,P,S) ;   
08734          MAKE_MAP(L,P,S) ;   
08735          MAKE_MAP(R,A,I) ;   
08736          MAKE_MAP(L,A,I) ;   
08737          MAKE_MAP(R,M,I) ;   
08738          MAKE_MAP(L,M,I) ;   
08739          MAKE_MAP(R,P,I) ;   
08740          MAKE_MAP(L,P,I) ;   
08741 
08742 #undef MAKE_MAP
08743 
08744       }
08745       break ; 
08746 
08747       
08748 
08749       case MARKSET_ALIGN:{
08750          THD_affine_warp * awarp = (THD_affine_warp *) warp ;
08751 
08752          THD_fvec3 acsup , acpos , pcinf , msag1 , msag2 ,
08753                    alpha1,alpha2,alpha,beta,gamma,rr1,rr2,rr , dif ;
08754          THD_mat33 to_al ;
08755          float size ;
08756 
08757          
08758 
08759          awarp->type = WARP_AFFINE_TYPE ;
08760 
08761          
08762 
08763          acsup = THD_3dmm_to_dicomm( anat , MVEC(IMARK_ACSE) ) ;
08764          acpos = THD_3dmm_to_dicomm( anat , MVEC(IMARK_ACPM) ) ;
08765          pcinf = THD_3dmm_to_dicomm( anat , MVEC(IMARK_PCIE) ) ;
08766          msag1 = THD_3dmm_to_dicomm( anat , MVEC(IMARK_MSA1) ) ;
08767          msag2 = THD_3dmm_to_dicomm( anat , MVEC(IMARK_MSA2) ) ;
08768 
08769          
08770 
08771          beta = SUB_FVEC3(pcinf,acsup) ;  beta = NORMALIZE_FVEC3(beta) ;
08772 
08773          
08774 
08775          rr     = SUB_FVEC3(msag1,acsup) ;
08776          alpha1 = CROSS_FVEC3(beta,rr) ; alpha1 = NORMALIZE_FVEC3(alpha1) ;
08777 
08778          rr     = SUB_FVEC3(msag2,acsup) ;
08779          alpha2 = CROSS_FVEC3(beta,rr) ; alpha2 = NORMALIZE_FVEC3(alpha2) ;
08780 
08781          alpha  = SCLADD_FVEC3(0.5,alpha1,0.5,alpha2) ;
08782          alpha  = NORMALIZE_FVEC3(alpha) ;
08783 
08784          
08785 
08786          gamma = CROSS_FVEC3(alpha,beta) ; gamma = NORMALIZE_FVEC3(gamma) ;
08787 
08788          
08789 
08790          dif  = SUB_FVEC3(acsup,acpos) ;
08791          size = DOT_FVEC3(dif,gamma) ;
08792          rr1  = SCLADD_FVEC3(1.0,acpos,size,gamma) ;
08793 
08794          size = DOT_FVEC3(dif,beta) ;
08795          rr2  = SCLADD_FVEC3(1.0,acsup,-size,beta) ;
08796 
08797          rr   = SCLADD_FVEC3(0.5,rr1,0.5,rr2) ;
08798 
08799          
08800 
08801 
08802 
08803 
08804 
08805          to_al.mat[0][0] = alpha.xyz[0] ;  
08806          to_al.mat[0][1] = alpha.xyz[1] ;
08807          to_al.mat[0][2] = alpha.xyz[2] ;
08808 
08809          to_al.mat[1][0] = beta.xyz[0] ;   
08810          to_al.mat[1][1] = beta.xyz[1] ;
08811          to_al.mat[1][2] = beta.xyz[2] ;
08812 
08813          to_al.mat[2][0] = gamma.xyz[0] ;  
08814          to_al.mat[2][1] = gamma.xyz[1] ;
08815          to_al.mat[2][2] = gamma.xyz[2] ;
08816 
08817          
08818 
08819          awarp->warp.type = MAPPING_LINEAR_TYPE ;
08820          awarp->warp.mfor = to_al ;
08821          awarp->warp.mbac = TRANSPOSE_MAT(to_al) ;  
08822          awarp->warp.bvec = MATVEC(to_al,rr) ;
08823          awarp->warp.svec = rr ;  NEGATE_FVEC3(awarp->warp.svec) ;
08824 
08825          
08826 
08827 
08828          LOAD_FVEC3(awarp->warp.bot,
08829                     -ATLAS_ALIGNBOX_LAT,-ATLAS_ALIGNBOX_ANT,-ATLAS_ALIGNBOX_INF);
08830          LOAD_FVEC3(awarp->warp.top,
08831                      ATLAS_ALIGNBOX_LAT, ATLAS_ALIGNBOX_POS, ATLAS_ALIGNBOX_SUP);
08832 
08833 #ifdef AFNI_DEBUG
08834 STATUS("Original -> Aligned Map::") ;
08835 DUMP_LMAP(awarp->warp) ;
08836 #endif
08837 
08838       }  
08839       break ;
08840 
08841    } 
08842 
08843    RETURN(warp) ;
08844 }
08845 
08846 
08847 
08848 #define ADD_ERROR(str)                                \
08849    { int ll = strlen(str) + strlen(error_list) + 16 ; \
08850      STATUS(str) ;                                    \
08851      error_list = (char*) XtRealloc( error_list , ll ) ;      \
08852      strcat( error_list , "*** ERROR:  ") ;           \
08853      strcat( error_list , str ) ; num_error++ ; }
08854 
08855 #define ADD_REPORT(str)                               \
08856    { int ll = strlen(str) + strlen(error_list) + 16 ; \
08857      STATUS(str) ;                                    \
08858      error_list = (char*)XtRealloc( error_list , ll ) ;      \
08859      strcat( error_list , str ) ; num_report++ ; }
08860 
08861 Boolean AFNI_marks_quality_check( Boolean make_report, Three_D_View * im3d )
08862 {
08863    THD_3dim_dataset * anat    = im3d->anat_now ;
08864    THD_marker_set   * markers = im3d->anat_now->markers ;
08865 
08866    char *  error_list ;
08867    int     num_error , num_report ;
08868    char    msg[128] ;
08869    Boolean good ;
08870 
08871 ENTRY("AFNI_marks_quality_check") ;
08872 
08873    
08874 
08875    if( markers == NULL ){ BEEPIT ; RETURN(False) ; }  
08876 
08877    error_list = XtNewString(
08878                 "             *** MARKERS QUALITY REPORT ***           \n\n") ;
08879    num_error  = 0 ;
08880    num_report = 0 ;
08881 
08882    
08883 
08884    switch( markers->type ){
08885 
08886       default: RETURN(False) ;      
08887 
08888       
08889 
08890       case MARKSET_BOUNDING:{
08891          THD_fvec3 mant,mpos,msup,minf,mrig,mlef , pcie ;
08892          float dist_sup , dist_inf , dist_ant , dist_med , dist_pos ,
08893                dist_lef , dist_rig ;
08894 
08895          
08896 
08897          mant = THD_3dmm_to_dicomm( anat , MVEC(IMARK_MANT) ) ;
08898          mpos = THD_3dmm_to_dicomm( anat , MVEC(IMARK_MPOS) ) ;
08899          msup = THD_3dmm_to_dicomm( anat , MVEC(IMARK_MSUP) ) ;
08900          minf = THD_3dmm_to_dicomm( anat , MVEC(IMARK_MINF) ) ;
08901          mrig = THD_3dmm_to_dicomm( anat , MVEC(IMARK_MRIG) ) ;
08902          mlef = THD_3dmm_to_dicomm( anat , MVEC(IMARK_MLEF) ) ;
08903 
08904          
08905 
08906          LOAD_FVEC3( pcie ,
08907                      anat->warp_parent->markers->xyz[IMARK_PCIE][0] ,
08908                      anat->warp_parent->markers->xyz[IMARK_PCIE][1] ,
08909                      anat->warp_parent->markers->xyz[IMARK_PCIE][2]  ) ;
08910 
08911          pcie = THD_3dmm_to_dicomm( anat->warp_parent , pcie ) ;
08912          pcie = AFNI_transform_vector( anat->warp_parent , pcie , anat ) ;
08913 
08914          
08915 
08916          dist_ant = -mant.xyz[1] ;
08917          dist_med =  pcie.xyz[1] ;
08918          dist_pos =  mpos.xyz[1] - pcie.xyz[1] ;
08919 
08920          dist_sup =  msup.xyz[2] ;
08921          dist_inf = -minf.xyz[2] ;
08922 
08923          dist_lef =  mlef.xyz[0] ;
08924          dist_rig = -mrig.xyz[0] ;
08925 
08926          
08927 
08928          if( dist_ant/ATLAS_FRONT_TO_AC < MIN_ALLOWED_DEVIATION ||
08929              dist_ant/ATLAS_FRONT_TO_AC > MAX_ALLOWED_DEVIATION   )
08930          ADD_ERROR("The following measurement is outside the allowed range!\n");
08931 
08932          sprintf(msg,"Front to Anterior commissure: %5.1f mm (Atlas:%5.1f)\n",
08933                  dist_ant,ATLAS_FRONT_TO_AC) ;
08934          ADD_REPORT(msg) ;
08935 
08936          
08937 
08938 #if 0
08939          if( dist_med/ATLAS_AC_TO_PC < MIN_ALLOWED_DEVIATION ||
08940              dist_med/ATLAS_AC_TO_PC > MAX_ALLOWED_DEVIATION   )
08941          ADD_ERROR("The following measurement is outside the allowed range!\n");
08942 #endif
08943          sprintf(msg,"Intercommissural distance:    %5.1f mm (Atlas:%5.1f)\n",
08944                  dist_med,ATLAS_AC_TO_PC) ;
08945          ADD_REPORT(msg) ;
08946 
08947 
08948          
08949 
08950          if( dist_pos/ATLAS_PC_TO_BACK < MIN_ALLOWED_DEVIATION ||
08951              dist_pos/ATLAS_PC_TO_BACK > MAX_ALLOWED_DEVIATION   )
08952          ADD_ERROR("The following measurement is outside the allowed range!\n");
08953 
08954          sprintf(msg,"Posterior commissure to back: %5.1f mm (Atlas:%5.1f)\n",
08955                  dist_pos,ATLAS_PC_TO_BACK) ;
08956          ADD_REPORT(msg) ;
08957 
08958          
08959 
08960          if( dist_inf/ATLAS_BOT_TO_AC < MIN_ALLOWED_DEVIATION ||
08961              dist_inf/ATLAS_BOT_TO_AC > MAX_ALLOWED_DEVIATION   )
08962          ADD_ERROR("The following measurement is outside the allowed range!\n");
08963 
08964          sprintf(msg,"Bottom to Anterior commissure:%5.1f mm (Atlas:%5.1f)\n",
08965                  dist_inf,ATLAS_BOT_TO_AC) ;
08966          ADD_REPORT(msg) ;
08967 
08968          
08969 
08970          if( dist_sup/ATLAS_AC_TO_TOP < MIN_ALLOWED_DEVIATION ||
08971              dist_sup/ATLAS_AC_TO_TOP > MAX_ALLOWED_DEVIATION   )
08972          ADD_ERROR("The following measurement is outside the allowed range!\n");
08973 
08974          sprintf(msg,"Anterior commissure to top:   %5.1f mm (Atlas:%5.1f)\n",
08975                  dist_sup,ATLAS_AC_TO_TOP) ;
08976          ADD_REPORT(msg) ;
08977 
08978          
08979 
08980          if( dist_lef/ATLAS_AC_TO_LAT < MIN_ALLOWED_DEVIATION ||
08981              dist_lef/ATLAS_AC_TO_LAT > MAX_ALLOWED_DEVIATION   )
08982          ADD_ERROR("The following measurement is outside the allowed range!\n");
08983 
08984          sprintf(msg,"Anterior commissure to left:  %5.1f mm (Atlas:%5.1f)\n",
08985                  dist_lef,ATLAS_AC_TO_LAT) ;
08986          ADD_REPORT(msg) ;
08987 
08988          
08989 
08990          if( dist_rig/ATLAS_AC_TO_LAT < MIN_ALLOWED_DEVIATION ||
08991              dist_rig/ATLAS_AC_TO_LAT > MAX_ALLOWED_DEVIATION   )
08992          ADD_ERROR("The following measurement is outside the allowed range!\n");
08993 
08994          sprintf(msg,"Anterior commissure to right: %5.1f mm (Atlas:%5.1f)\n",
08995                  dist_rig,ATLAS_AC_TO_LAT) ;
08996          ADD_REPORT(msg) ;
08997       }
08998       break ;  
08999 
09000       
09001 
09002       case MARKSET_ALIGN:{
09003          THD_fvec3 acsup , acpos , pcinf , msag1 , msag2 ,
09004                    alpha1,alpha2,alpha,beta,gamma,rr1,rr2,rr , dif ;
09005          float size , slim ;
09006 
09007          
09008 
09009          acsup = THD_3dmm_to_dicomm( anat , MVEC(IMARK_ACSE) ) ;
09010          acpos = THD_3dmm_to_dicomm( anat , MVEC(IMARK_ACPM) ) ;
09011          pcinf = THD_3dmm_to_dicomm( anat , MVEC(IMARK_PCIE) ) ;
09012          msag1 = THD_3dmm_to_dicomm( anat , MVEC(IMARK_MSA1) ) ;
09013          msag2 = THD_3dmm_to_dicomm( anat , MVEC(IMARK_MSA2) ) ;
09014 
09015          
09016 
09017          rr = SUB_FVEC3(acsup,acpos) ; size = SIZE_FVEC3(rr) ;
09018          if( size > 4.0 )
09019          ADD_ERROR("The two AC points are more than 4 mm apart.\n") ;
09020 
09021          slim = MIN_ALLOWED_DEVIATION * ATLAS_AC_TO_PC ;
09022          rr = SUB_FVEC3(acsup,pcinf) ; size = SIZE_FVEC3(rr) ;
09023          if( size <= slim ){
09024             sprintf(msg, "The AC & PC points are separated by %5.2f mm\n"
09025                          "which is closer than the minimum %5.2f mm!\n" ,
09026                     size,slim ) ;
09027             ADD_ERROR(msg) ;
09028          }
09029 
09030          rr = SUB_FVEC3(acsup,msag1) ; size = SIZE_FVEC3(rr) ;
09031          if( size < 20.0 )
09032          ADD_ERROR("The AC and 1st mid-sag points are closer than 20 mm.\n");
09033 
09034          rr = SUB_FVEC3(acsup,msag2) ; size = SIZE_FVEC3(rr) ;
09035          if( size < 20.0 )
09036          ADD_ERROR("The AC and 2nd mid-sag points are closer than 20 mm.\n");
09037 
09038          rr = SUB_FVEC3(msag1,msag2) ; size = SIZE_FVEC3(rr) ;
09039          if( size < 20.0 )
09040          ADD_ERROR("The two mid-sag points are closer than 20 mm.\n");
09041 
09042          rr = SUB_FVEC3(pcinf,msag1) ; size = SIZE_FVEC3(rr) ;
09043          if( size < 20.0 )
09044          ADD_ERROR("The PC and 1st mid-sag points are closer than 20 mm.\n");
09045 
09046          rr = SUB_FVEC3(pcinf,msag2) ; size = SIZE_FVEC3(rr) ;
09047          if( size < 20.0 )
09048          ADD_ERROR("The PC and 2nd mid-sag points are closer than 20 mm.\n");
09049 
09050          
09051 
09052          beta = SUB_FVEC3(pcinf,acsup) ;  beta = NORMALIZE_FVEC3(beta) ;
09053 
09054          
09055 
09056          rr     = SUB_FVEC3(msag1,acsup) ;
09057          alpha1 = CROSS_FVEC3(beta,rr) ; alpha1 = NORMALIZE_FVEC3(alpha1) ;
09058 
09059          rr     = SUB_FVEC3(msag2,acsup) ;
09060          alpha2 = CROSS_FVEC3(beta,rr) ; alpha2 = NORMALIZE_FVEC3(alpha2) ;
09061 
09062          size = DOT_FVEC3(alpha1,alpha2) ;  
09063          if( size < 0.99939 )               
09064          ADD_ERROR("The AC + PC + mid-sag pts do not form a good plane.\n");
09065 
09066          size = acos((double)size) * 180/3.14159265 ;  
09067          sprintf(msg,
09068          "Angular deviation between AC+PC+mid-sag pts: %6.2f degrees\n",size);
09069          ADD_REPORT(msg) ;
09070 
09071          alpha = SCLADD_FVEC3(0.5,alpha1,0.5,alpha2) ;
09072          alpha = NORMALIZE_FVEC3(alpha) ;
09073 
09074          
09075 
09076          gamma = CROSS_FVEC3(alpha,beta) ; gamma = NORMALIZE_FVEC3(gamma) ;
09077 
09078          
09079 
09080 
09081 
09082 
09083 
09084 
09085          dif  = SUB_FVEC3(acsup,acpos) ;
09086          size = DOT_FVEC3(dif,gamma) ;
09087          rr1  = SCLADD_FVEC3(1.0,acpos,size,gamma) ;
09088 
09089          size = DOT_FVEC3(dif,beta) ;
09090          rr2  = SCLADD_FVEC3(1.0,acsup,-size,beta) ;
09091 
09092          dif = SUB_FVEC3(rr1,rr2) ; size = SIZE_FVEC3(dif) ;
09093          if( size > 2.0 )
09094          ADD_ERROR("AC Talairach origin mismatch more than 2 mm!\n") ;
09095 
09096          sprintf(msg,
09097          "Mismatch between AC-PC line and Talairach origin: %6.2f mm\n",size);
09098          ADD_REPORT(msg) ;
09099 
09100          rr = SCLADD_FVEC3(0.5,rr1,0.5,rr2) ;
09101 
09102          
09103 
09104 
09105          { float theta, costheta ;
09106 
09107             costheta = 0.5 * sqrt(1.0+alpha.xyz[0]+beta.xyz[1]+gamma.xyz[2]) ;
09108             theta    = 2.0 * acos(costheta) * 180/3.14159265 ;
09109             sprintf(msg,
09110             "Total rotation to align AC-PC and mid-sag:   %6.2f degrees\n",theta) ;
09111             ADD_REPORT(msg) ;
09112          }
09113 
09114 #ifdef AFNI_DEBUG
09115 STATUS("AC-PC alignment markers computation:") ;
09116 DUMP_FVEC3("   acsup ",acsup ) ;
09117 DUMP_FVEC3("   acpos ",acpos ) ;
09118 DUMP_FVEC3("   pcinf ",pcinf ) ;
09119 DUMP_FVEC3("   msag1 ",msag1 ) ;
09120 DUMP_FVEC3("   msag2 ",msag2 ) ;
09121 DUMP_FVEC3("   beta  ",beta  ) ;
09122 DUMP_FVEC3("   alpha1",alpha1) ;
09123 DUMP_FVEC3("   alpha2",alpha2) ;
09124 DUMP_FVEC3("   alpha ",alpha ) ;
09125 DUMP_FVEC3("   gamma ",gamma ) ;
09126 DUMP_FVEC3("   rr1   ",rr1   ) ;
09127 DUMP_FVEC3("   rr2   ",rr2   ) ;
09128 DUMP_FVEC3("   rr    ",rr    ) ;
09129 printf("\n") ;
09130 #endif
09131 
09132       }  
09133       break ;
09134 
09135    } 
09136 
09137    if( num_error > 0 || (make_report && num_report > 0) ){
09138       (void) MCW_popup_message( im3d->vwid->marks->frame ,
09139                                 error_list ,
09140                                 MCW_USER_KILL | MCW_TIMER_KILL ) ;
09141    }
09142 
09143    myXtFree( error_list ) ;
09144 
09145    if( num_error > 0 && ! ELIDE_quality ) RETURN(False) ;
09146    RETURN(True) ;
09147 }
09148 
09149 
09150 
09151 
09152 
09153 
09154 THD_3dim_dataset * AFNI_init_warp( Three_D_View * im3d ,
09155                                    THD_3dim_dataset * parent_dset ,
09156                                    THD_warp * warp_init , float resam_vox )
09157 {
09158    THD_3dim_dataset * adam_dset ;  
09159    THD_warp         * warp_total ; 
09160    THD_fvec3          xnew_bot , xnew_top ;
09161 
09162    THD_3dim_dataset * new_dset ;
09163    THD_datablock    * new_dblk  , * adam_dblk  , * parent_dblk ;
09164    THD_dataxes      * new_daxes , * adam_daxes , * parent_daxes ;
09165    THD_diskptr      * new_dkptr , * adam_dkptr , * parent_dkptr ;
09166    THD_marker_set   * new_markers ;
09167 
09168    int new_nx , new_ny , new_nz , ii ;
09169    THD_ivec3 ivbot , ivtop ;
09170 
09171 ENTRY("AFNI_init_warp") ;
09172 
09173    
09174 
09175 
09176 
09177 
09178 
09179 
09180 
09181    adam_dset   = parent_dset ;
09182    warp_total  = myXtNew( THD_warp ) ;  
09183    *warp_total = *warp_init ;
09184 
09185    while( adam_dset->warp != NULL ){
09186       AFNI_concatenate_warp( warp_total , adam_dset->warp ) ;
09187       adam_dset = adam_dset->warp_parent ;
09188    }
09189 
09190    if( warp_total->type < FIRST_WARP_TYPE ||
09191        warp_total->type > LAST_WARP_TYPE    ) RETURN(NULL) ;  
09192 
09193 #ifdef AFNI_DEBUG
09194 { char str[256] ;
09195   sprintf(str,"parent = %s ; adam = %s",
09196           parent_dset->self_name , adam_dset->self_name ) ;
09197   STATUS(str) ;
09198 
09199   STATUS("warp_total dump:") ;
09200   if( warp_total->type == WARP_AFFINE_TYPE ){
09201      DUMP_LMAP(warp_total->rig_bod.warp) ;
09202   } else {
09203      DUMP_T12_WARP(warp_total->tal_12) ;
09204   }
09205 }
09206 #endif
09207 
09208    adam_dblk  = adam_dset->dblk ;
09209    adam_daxes = adam_dset->daxes ;
09210    adam_dkptr = adam_dblk->diskptr ;
09211 
09212    parent_dblk  = parent_dset->dblk ;
09213    parent_daxes = parent_dset->daxes ;
09214    parent_dkptr = parent_dblk->diskptr ;
09215 
09216    
09217 
09218 
09219 
09220 
09221 
09222    switch( warp_total->type ){
09223 
09224       default:  RETURN(NULL) ;  
09225 
09226       
09227 
09228 
09229       case WARP_TALAIRACH_12_TYPE:{
09230          int   use_tlrc_big=MCW_val_bbox( im3d->vwid->marks->tlrc_big_bbox ) ;
09231          float xtop=ATLAS_BBOX_LAT ,
09232                ybot=ATLAS_BBOX_ANT ,
09233                ytop=ATLAS_BBOX_POS ,
09234                zbot=(use_tlrc_big) ? ATLAS_BBOX_INF_NEW : ATLAS_BBOX_INF ,
09235                ztop=ATLAS_BBOX_SUP ;
09236 
09237 #define GETVAL(vvv,nnn) do{ char *eee = getenv(nnn) ;                            \
09238                             if( eee != NULL ){                                   \
09239                               float val=strtod(eee,NULL); if(val>0.0) vvv = val; \
09240                             } } while(0)
09241 
09242          GETVAL(xtop,"AFNI_TLRC_BBOX_LAT") ;  
09243          GETVAL(ybot,"AFNI_TLRC_BBOX_ANT") ;  
09244          GETVAL(ytop,"AFNI_TLRC_BBOX_POS") ;
09245          GETVAL(zbot,"AFNI_TLRC_BBOX_INF") ;
09246          GETVAL(ztop,"AFNI_TLRC_BBOX_SUP") ;
09247 
09248 #undef GETVAL
09249 
09250          LOAD_FVEC3( xnew_bot ,-xtop,-ybot,-zbot ) ;
09251          LOAD_FVEC3( xnew_top , xtop, ytop, ztop ) ;
09252       }
09253       break ;
09254 
09255       
09256 
09257       case WARP_AFFINE_TYPE:{
09258          THD_fvec3 corner , base , xnew , aff_bot , aff_top ;
09259          THD_mat33 to_new ;
09260 
09261          to_new  = warp_total->rig_bod.warp.mfor ;
09262          base    = warp_total->rig_bod.warp.bvec ;
09263 
09264          
09265 
09266 
09267 
09268          LOAD_FVEC3(corner,adam_daxes->xxmin,
09269                            adam_daxes->yymin,adam_daxes->zzmin) ;  
09270          corner   = THD_3dmm_to_dicomm( adam_dset , corner ) ;
09271          xnew_bot = xnew_top = MATVEC_SUB(to_new,corner,base) ;
09272 
09273          LOAD_FVEC3(corner,adam_daxes->xxmax,
09274                            adam_daxes->yymin,adam_daxes->zzmin) ;  
09275          corner   = THD_3dmm_to_dicomm( adam_dset , corner ) ;
09276          xnew     = MATVEC_SUB(to_new,corner,base) ;
09277          xnew_bot = MIN_FVEC3(xnew_bot,xnew) ;
09278          xnew_top = MAX_FVEC3(xnew_top ,xnew ) ;
09279 
09280          LOAD_FVEC3(corner,adam_daxes->xxmin,
09281                            adam_daxes->yymax,adam_daxes->zzmin) ;  
09282          corner   = THD_3dmm_to_dicomm( adam_dset , corner ) ;
09283          xnew     = MATVEC_SUB(to_new,corner,base) ;
09284          xnew_bot = MIN_FVEC3(xnew_bot,xnew) ;
09285          xnew_top = MAX_FVEC3(xnew_top ,xnew ) ;
09286 
09287          LOAD_FVEC3(corner,adam_daxes->xxmax,
09288                            adam_daxes->yymax,adam_daxes->zzmin) ;  
09289          corner   = THD_3dmm_to_dicomm( adam_dset , corner ) ;
09290          xnew     = MATVEC_SUB(to_new,corner,base) ;
09291          xnew_bot = MIN_FVEC3(xnew_bot,xnew) ;
09292          xnew_top = MAX_FVEC3(xnew_top ,xnew ) ;
09293 
09294          LOAD_FVEC3(corner,adam_daxes->xxmin,
09295                            adam_daxes->yymin,adam_daxes->zzmax) ;  
09296          corner   = THD_3dmm_to_dicomm( adam_dset , corner ) ;
09297          xnew     = MATVEC_SUB(to_new,corner,base) ;
09298          xnew_bot = MIN_FVEC3(xnew_bot,xnew) ;
09299          xnew_top = MAX_FVEC3(xnew_top ,xnew ) ;
09300 
09301          LOAD_FVEC3(corner,adam_daxes->xxmax,
09302                            adam_daxes->yymin,adam_daxes->zzmax) ;  
09303          corner   = THD_3dmm_to_dicomm( adam_dset , corner ) ;
09304          xnew     = MATVEC_SUB(to_new,corner,base) ;
09305          xnew_bot = MIN_FVEC3(xnew_bot,xnew) ;
09306          xnew_top = MAX_FVEC3(xnew_top ,xnew ) ;
09307 
09308          LOAD_FVEC3(corner,adam_daxes->xxmin,
09309                            adam_daxes->yymax,adam_daxes->zzmax) ;  
09310          corner   = THD_3dmm_to_dicomm( adam_dset , corner ) ;
09311          xnew     = MATVEC_SUB(to_new,corner,base) ;
09312          xnew_bot = MIN_FVEC3(xnew_bot,xnew) ;
09313          xnew_top = MAX_FVEC3(xnew_top ,xnew ) ;
09314 
09315          LOAD_FVEC3(corner,adam_daxes->xxmax,
09316                            adam_daxes->yymax,adam_daxes->zzmax) ;  
09317          corner   = THD_3dmm_to_dicomm( adam_dset , corner ) ;
09318          xnew     = MATVEC_SUB(to_new,corner,base) ;
09319          xnew_bot = MIN_FVEC3(xnew_bot,xnew) ;
09320          xnew_top = MAX_FVEC3(xnew_top ,xnew ) ;
09321 
09322          
09323 
09324 
09325          aff_bot = warp_total->rig_bod.warp.bot  ;
09326          aff_top = warp_total->rig_bod.warp.top  ;
09327 
09328          if( (aff_bot.xyz[0] < aff_top.xyz[0]) &&
09329              (aff_bot.xyz[1] < aff_top.xyz[1]) &&
09330              (aff_bot.xyz[2] < aff_top.xyz[2])   ){
09331 
09332    
09333 
09334 
09335 #if 0
09336             xnew_bot = MIN_FVEC3(xnew_bot,aff_bot) ;
09337             xnew_top = MAX_FVEC3(xnew_top,aff_top) ;
09338 #else
09339             xnew_bot = aff_bot ;
09340             xnew_top = aff_top ;
09341 #endif
09342          }
09343 
09344       }  
09345       break ;
09346 
09347    } 
09348 
09349    
09350 
09351 #define FLOOR(qq) ( ((qq) >= 0) ? ((int)(qq)) : (-1+(int)(qq)) )
09352 
09353    ivbot.ijk[0] = FLOOR( 0.01 + xnew_bot.xyz[0] / resam_vox ) ;
09354    ivbot.ijk[1] = FLOOR( 0.01 + xnew_bot.xyz[1] / resam_vox ) ;
09355    ivbot.ijk[2] = FLOOR( 0.01 + xnew_bot.xyz[2] / resam_vox ) ;
09356 
09357    ivtop.ijk[0] = FLOOR( 0.99 + xnew_top.xyz[0] / resam_vox ) ;
09358    ivtop.ijk[1] = FLOOR( 0.99 + xnew_top.xyz[1] / resam_vox ) ;
09359    ivtop.ijk[2] = FLOOR( 0.99 + xnew_top.xyz[2] / resam_vox ) ;
09360 
09361 #undef FLOOR
09362 
09363    xnew_bot.xyz[0] = ivbot.ijk[0] * resam_vox ;
09364    xnew_bot.xyz[1] = ivbot.ijk[1] * resam_vox ;
09365    xnew_bot.xyz[2] = ivbot.ijk[2] * resam_vox ;
09366 
09367    xnew_top.xyz[0] = ivtop.ijk[0] * resam_vox ;
09368    xnew_top.xyz[1] = ivtop.ijk[1] * resam_vox ;
09369    xnew_top.xyz[2] = ivtop.ijk[2] * resam_vox ;
09370 
09371    
09372 
09373    new_nx = (xnew_top.xyz[0] - xnew_bot.xyz[0])/resam_vox + 1.5 ;
09374    new_ny = (xnew_top.xyz[1] - xnew_bot.xyz[1])/resam_vox + 1.5 ;
09375    new_nz = (xnew_top.xyz[2] - xnew_bot.xyz[2])/resam_vox + 1.5 ;
09376 
09377    xnew_top.xyz[0] = xnew_bot.xyz[0] + (new_nx-1) * resam_vox ;
09378    xnew_top.xyz[1] = xnew_bot.xyz[1] + (new_ny-1) * resam_vox ;
09379    xnew_top.xyz[2] = xnew_bot.xyz[2] + (new_nz-1) * resam_vox ;
09380 
09381 #ifdef AFNI_DEBUG
09382 DUMP_FVEC3("  -- xnew_bot",xnew_bot) ;
09383 DUMP_FVEC3("  -- xnew_top",xnew_top) ;
09384 printf("  ==> new nx=%d ny=%d nz=%d\n",new_nx,new_ny,new_nz) ;
09385 #endif
09386 
09387    
09388 
09389    new_dset    =                     myXtNew( THD_3dim_dataset ) ;
09390    new_dblk    = new_dset->dblk    = myXtNew( THD_datablock ) ;
09391    new_daxes   = new_dset->daxes   = myXtNew( THD_dataxes ) ;
09392    new_markers = new_dset->markers = NULL ;                 
09393    new_dkptr   = new_dblk->diskptr = myXtNew( THD_diskptr ) ;
09394 
09395    INIT_KILL(new_dset->kl) ; INIT_KILL(new_dblk->kl) ;
09396 
09397    ADDTO_KILL(new_dset->kl,new_dblk)  ;
09398    ADDTO_KILL(new_dset->kl,new_daxes) ;
09399    ADDTO_KILL(new_dset->kl,new_dkptr) ;
09400 
09401    ADDTO_KILL(new_dset->kl,warp_total) ;
09402 
09403    new_dset->wod_daxes = NULL ;
09404    new_dset->wod_flag  = True ;
09405 
09406    new_dset->taxis = NULL ;
09407    new_dset->tagset = NULL ;  
09408 
09409    INIT_STAT_AUX( new_dset , MAX_STAT_AUX , parent_dset->stat_aux ) ;
09410 
09411 #define PARENT_MYSELF  
09412 
09413    new_dset->idcode             = MCW_new_idcode() ;
09414    new_dset->warp_parent_idcode = adam_dset->idcode ;
09415 #ifndef PARENT_MYSELF
09416    ZERO_IDCODE(new_dset->anat_parent_idcode) ;
09417    new_dset->anat_parent = NULL ;
09418 #else
09419    new_dset->anat_parent_idcode = new_dset->idcode ; 
09420    new_dset->anat_parent        = new_dset ;         
09421 #endif
09422 
09423    EMPTY_STRING(new_dset->anat_parent_name) ;
09424 
09425    
09426    
09427 
09428 STATUS("init new_dset") ;
09429 
09430    new_dset->type      = parent_dset->type;                    
09431    new_dset->func_type = parent_dset->func_type;
09432    new_dset->view_type = WARPED_VIEW(parent_dset->view_type) ; 
09433 
09434    new_dset->warp      = warp_total ;                          
09435    new_dset->vox_warp  = NULL ;
09436    new_dset->self_warp = NULL ;    
09437 
09438    new_dset->warp_parent = adam_dset ;
09439    MCW_strncpy( new_dset->warp_parent_name ,
09440                 adam_dset->self_name       , THD_MAX_NAME ) ;
09441 
09442    MCW_strncpy( new_dset->label1 , parent_dset->label1 , THD_MAX_LABEL ) ;
09443    MCW_strncpy( new_dset->label2 , parent_dset->label2 , THD_MAX_LABEL ) ;
09444 
09445    MCW_strncpy( new_dset->self_name  ,
09446                 parent_dset->self_name , THD_MAX_NAME ) ;  
09447    ii = strlen( new_dset->self_name ) ;                    
09448    new_dset->self_name[ii++] = '+' ;
09449    MCW_strncpy( &(new_dset->self_name[ii]) ,
09450                 VIEW_typestr[new_dset->view_type] ,
09451                 THD_MAX_NAME-ii ) ;
09452 
09453    new_dset->death_mark  = 0 ;
09454    new_dset->tcat_list   = 0 ;
09455    new_dset->tcat_num    = 0 ;
09456    new_dset->tcat_len    = NULL ;
09457 
09458    
09459 
09460 STATUS("init new_dkptr") ;
09461 
09462    new_dkptr->type         = DISKPTR_TYPE ;
09463    new_dkptr->rank         = 3 ;
09464    new_dkptr->nvals        = adam_dkptr->nvals ;
09465    new_dkptr->dimsizes[0]  = new_nx ;
09466    new_dkptr->dimsizes[1]  = new_ny ;
09467    new_dkptr->dimsizes[2]  = new_nz ;
09468    new_dkptr->storage_mode = STORAGE_UNDEFINED ;
09469    new_dkptr->byte_order   = THD_get_write_order() ;  
09470 
09471    THD_init_diskptr_names( new_dkptr ,
09472                            parent_dkptr->directory_name, NULL, parent_dkptr->prefix ,
09473                            new_dset->view_type , True ) ;
09474 
09475    
09476 
09477 STATUS("init new_dblk") ;
09478 
09479    new_dblk->type        = DATABLOCK_TYPE ;
09480    new_dblk->nvals       = adam_dblk->nvals ;
09481    new_dblk->malloc_type = DATABLOCK_MEM_UNDEFINED ;
09482    new_dblk->natr        = new_dblk->natr_alloc = 0 ;
09483    new_dblk->atr         = NULL ;
09484    new_dblk->parent      = (XtPointer) new_dset ;
09485 
09486    new_dblk->brick_fac   = NULL ;  
09487    new_dblk->brick_bytes = NULL ;  
09488    new_dblk->brick       = NULL ;
09489    THD_init_datablock_brick( new_dblk , -1 , adam_dblk ) ;
09490 
09491    new_dblk->master_nvals = 0 ;     
09492    new_dblk->master_ival  = NULL ;
09493    new_dblk->master_bytes = NULL ;
09494 
09495    DSET_unlock(new_dset) ;
09496 
09497    THD_null_datablock_auxdata( new_dblk ) ;
09498    THD_copy_datablock_auxdata( adam_dblk , new_dblk ) ; 
09499 
09500    
09501 
09502 STATUS("init new_daxes") ;
09503 
09504    new_daxes->type     = DATAXES_TYPE ;
09505    new_daxes->nxx      = new_nx ;
09506    new_daxes->nyy      = new_ny ;
09507    new_daxes->nzz      = new_nz ;
09508    new_daxes->xxorg    = xnew_bot.xyz[0] ;
09509    new_daxes->yyorg    = xnew_bot.xyz[1] ;
09510    new_daxes->zzorg    = xnew_bot.xyz[2] ;
09511    new_daxes->xxdel    = resam_vox ;       
09512    new_daxes->yydel    = resam_vox ;
09513    new_daxes->zzdel    = resam_vox ;
09514    new_daxes->xxmin    = xnew_bot.xyz[0] ; 
09515    new_daxes->yymin    = xnew_bot.xyz[1] ;
09516    new_daxes->zzmin    = xnew_bot.xyz[2] ;
09517    new_daxes->xxmax    = xnew_top.xyz[0] ;
09518    new_daxes->yymax    = xnew_top.xyz[1] ;
09519    new_daxes->zzmax    = xnew_top.xyz[2] ;
09520    new_daxes->parent   = (XtPointer) new_dset ;
09521 
09522    new_daxes->xxorient = ORI_R2L_TYPE ;    
09523    new_daxes->yyorient = ORI_A2P_TYPE ;
09524    new_daxes->zzorient = ORI_I2S_TYPE ;
09525    LOAD_DIAG_MAT(new_daxes->to_dicomm,1,1,1) ;  
09526 
09527    
09528 
09529    switch( new_dset->view_type ){
09530 
09531       default:
09532 STATUS("no new_markers") ;
09533       break ;   
09534 
09535       
09536 
09537       case VIEW_ACPCALIGNED_TYPE:
09538       if( new_dset->type == HEAD_ANAT_TYPE ){
09539          int ii , jj ;
09540 
09541 STATUS("init new_markers") ;
09542 
09543          new_markers = new_dset->markers = myXtNew( THD_marker_set ) ;
09544          ADDTO_KILL(new_dset->kl,new_markers) ;
09545 
09546          new_markers->numdef = NMARK_BOUNDING ;
09547          new_markers->numset = 0 ;                
09548          for( ii=0 ; ii < MARKS_MAXNUM ; ii++ ){
09549 
09550             new_markers->xyz[ii][0] =
09551               new_markers->xyz[ii][1] =
09552                 new_markers->xyz[ii][2] = -99999999.99 ;
09553 
09554             for( jj=0 ; jj < MARKS_MAXLAB ; jj++ )
09555                new_markers->label[ii][jj] = '\0' ;
09556 
09557             for( jj=0 ; jj < MARKS_MAXHELP ; jj++ )
09558                new_markers->help[ii][jj] = '\0' ;
09559 
09560             new_markers->valid[ii]   = False ;
09561             new_markers->ovcolor[ii] = -1 ;    
09562          }
09563 
09564          for( ii=0 ; ii < NMARK_BOUNDING ; ii++ ){       
09565             MCW_strncpy( &(new_markers->label[ii][0]) ,
09566                          THD_bounding_label[ii] , MARKS_MAXLAB ) ;
09567             MCW_strncpy( &(new_markers->help[ii][0]) ,
09568                          THD_bounding_help[ii] , MARKS_MAXHELP ) ;
09569          }
09570 
09571          for( ii=0 ; ii < MARKS_MAXFLAG ; ii++ )     
09572             new_markers->aflags[ii] = THD_bounding_aflags[ii] ;
09573          new_markers->type = new_markers->aflags[0] ;
09574       }
09575       break ;  
09576 
09577    }  
09578 
09579    
09580 
09581    new_dset->stats = NULL ;
09582    AFNI_copy_statistics( adam_dset , new_dset ) ;
09583 
09584 #ifdef ALLOW_DATASET_VLIST
09585    new_dset->pts = NULL ;
09586 #endif
09587 
09588    
09589 
09590    PARENTIZE(new_dset,adam_dset->parent) ;
09591 
09592 STATUS("initialization complete") ;
09593 
09594    RETURN( new_dset ) ;
09595 }
09596 
09597 
09598 
09599 void AFNI_copy_statistics( THD_3dim_dataset * dsold , THD_3dim_dataset * dsnew )
09600 {
09601    int ibr , nvold , nvnew ;
09602    THD_statistics * stold , * stnew ;
09603 
09604 ENTRY("AFNI_copy_statistics") ;
09605 
09606    if( !ISVALID_3DIM_DATASET(dsold) || !ISVALID_3DIM_DATASET(dsnew) ) EXRETURN ;
09607 
09608    nvold = dsold->dblk->nvals ;
09609    nvnew = dsnew->dblk->nvals ;
09610    stold = dsold->stats ;
09611    stnew = dsnew->stats ;
09612    if( !ISVALID_STATISTIC(stold) ) EXRETURN ;
09613 
09614    if( stnew == NULL ){
09615       dsnew->stats  = stnew = myXtNew( THD_statistics ) ;
09616       stnew->type   = STATISTICS_TYPE ;
09617       stnew->nbstat = nvnew ;
09618       stnew->bstat  = (THD_brick_stats *)
09619                         XtMalloc( sizeof(THD_brick_stats) * nvnew ) ;
09620       ADDTO_KILL(dsnew->kl,stnew) ;
09621       stnew->parent = (XtPointer) dsnew ;
09622    } else {
09623       stnew->nbstat = nvnew ;
09624       stnew->bstat  = (THD_brick_stats *)
09625                         XtRealloc( (char *) stnew->bstat ,
09626                                    sizeof(THD_brick_stats) * nvnew ) ;
09627    }
09628 
09629    for( ibr=0 ; ibr < nvnew ; ibr++ ){
09630       if( ibr < nvold )
09631          stnew->bstat[ibr] = stold->bstat[ibr] ;
09632       else
09633          INVALIDATE_BSTAT(stnew->bstat[ibr]) ;
09634    }
09635 
09636    EXRETURN ;
09637 }
09638 
09639 
09640 
09641 void AFNI_set_cursor( int cursor_code )
09642 {
09643    Three_D_View * im3d ;
09644    int id ;
09645 
09646 ENTRY("AFNI_set_cursor") ;
09647 
09648    for( id=0 ; id < MAX_CONTROLLERS ; id++ ){
09649       im3d = GLOBAL_library.controllers[id] ;
09650       if( IM3D_OPEN(im3d) ){
09651          switch( cursor_code ){
09652 
09653             default:
09654             case AFNI_DEFAULT_CURSOR:
09655                NORMAL_cursorize( im3d->vwid->top_shell ) ;
09656 
09657                if( ISQ_REALZ(im3d->s123) )
09658                   NORMAL_cursorize( im3d->s123->wtop ) ;
09659 
09660                if( ISQ_REALZ(im3d->s231) )
09661                   NORMAL_cursorize( im3d->s231->wtop ) ;
09662 
09663                if( ISQ_REALZ(im3d->s312) )
09664                   NORMAL_cursorize( im3d->s312->wtop ) ;
09665 
09666                if( GRA_REALZ(im3d->g123) )
09667                   NORMAL_cursorize( im3d->g123->fdw_graph ) ;
09668 
09669                if( GRA_REALZ(im3d->g231) )
09670                   NORMAL_cursorize( im3d->g231->fdw_graph ) ;
09671 
09672                if( GRA_REALZ(im3d->g312) )
09673                   NORMAL_cursorize( im3d->g312->fdw_graph ) ;
09674 
09675                if( im3d->vinfo->inverted_pause ){
09676                   im3d->vinfo->inverted_pause = False ;
09677                   if( im3d->vwid->picture != NULL ){
09678                      if( !GLOBAL_argopt.keep_logo ) PICTURE_OFF(im3d) ;
09679                   } else
09680                      MCW_invert_widget( im3d->vwid->top_form ) ;
09681                }
09682 
09683                break ;
09684 
09685             case AFNI_WAITING_CURSOR:
09686                WATCH_cursorize( im3d->vwid->top_shell ) ;
09687 
09688                if( ISQ_REALZ(im3d->s123) )
09689                   WATCH_cursorize( im3d->s123->wtop ) ;
09690 
09691                if( ISQ_REALZ(im3d->s231) )
09692                   WATCH_cursorize( im3d->s231->wtop ) ;
09693 
09694                if( ISQ_REALZ(im3d->s312) )
09695                   WATCH_cursorize( im3d->s312->wtop ) ;
09696 
09697                if( GRA_REALZ(im3d->g123) )
09698                   WATCH_cursorize( im3d->g123->fdw_graph ) ;
09699 
09700                if( GRA_REALZ(im3d->g231) )
09701                   WATCH_cursorize( im3d->g231->fdw_graph ) ;
09702 
09703                if( GRA_REALZ(im3d->g312) )
09704                   WATCH_cursorize( im3d->g312->fdw_graph ) ;
09705 
09706                if( ! im3d->vinfo->inverted_pause ){
09707                   im3d->vinfo->inverted_pause = True ;
09708                   if( im3d->vwid->picture != NULL )
09709                      PICTURE_ON(im3d) ;
09710                   else
09711                      MCW_invert_widget( im3d->vwid->top_form ) ;
09712                }
09713 
09714                break ;
09715          }
09716 
09717          XSync( XtDisplay(im3d->vwid->top_shell) , False ) ;
09718          XmUpdateDisplay( im3d->vwid->top_shell ) ;
09719       }
09720    }
09721 
09722    EXRETURN ;
09723 }
09724 
09725 
09726 
09727 
09728 
09729 #if 0
09730 # define NAME2INT(nnn,iii,bot,top)           \
09731   { xdef = XGetDefault(display,"AFNI",nnn) ; \
09732     if( xdef != NULL ){                      \
09733        ival = strtol( xdef , &cpt , 10 ) ;   \
09734        if( *cpt == '\0' && ival >= (bot) && ival <= (top) ) (iii) = ival ; } }
09735 
09736 # define NAME2FLOAT(nnn,fff,bot,top)         \
09737   { xdef = XGetDefault(display,"AFNI",nnn) ; \
09738     if( xdef != NULL ){                      \
09739        fval = strtod( xdef , &cpt ) ;        \
09740        if( *cpt == '\0' && fval >= (bot) && fval <= (top) ) (fff) = fval ; } }
09741 
09742 # define NAME2STRING(nnn,sss)                \
09743   { xdef = XGetDefault(display,"AFNI",nnn) ; \
09744     if( xdef != NULL ) sss  = XtNewString(xdef) ; }
09745 #else
09746 # define NAME2INT(nnn,iii,bot,top)           \
09747   { xdef = RWC_getname(display,nnn) ;        \
09748     if( xdef != NULL ){                      \
09749        ival = strtol( xdef , &cpt , 10 ) ;   \
09750        if( *cpt == '\0' && ival >= (bot) && ival <= (top) ) (iii) = ival ; } }
09751 
09752 # define NAME2FLOAT(nnn,fff,bot,top)         \
09753   { xdef = RWC_getname(display,nnn) ;        \
09754     if( xdef != NULL ){                      \
09755        fval = strtod( xdef , &cpt ) ;        \
09756        if( *cpt == '\0' && fval >= (bot) && fval <= (top) ) (fff) = fval ; } }
09757 
09758 # define NAME2STRING(nnn,sss)                \
09759   { xdef = RWC_getname(display,nnn) ;        \
09760     if( xdef != NULL ) sss  = XtNewString(xdef) ; }
09761 #endif
09762 
09763 #define BAD -999
09764 
09765 void AFNI_load_defaults( Widget w )
09766 {
09767    char    * xdef ;
09768    Display * display ;
09769    int       ival , ii,jj ;
09770    float     fval ;
09771    char *    cpt ;
09772    char      buf[64] ;
09773    float     pthr[NPANE_MAX+1] ;
09774    int       pov[NPANE_MAX+1] ;
09775 
09776 ENTRY("AFNI_load_defaults") ;
09777 
09778    if( w == NULL ){
09779       fprintf(stderr,"\n*** AFNI_load_defaults: NULL input widget ***\n") ;
09780       EXRETURN ;
09781    }
09782 
09783    display = XtDisplay( w ) ;
09784 
09785 
09786 
09787    for( ii=0 ; ii < DEFAULT_NCOLOVR ; ii++ ){
09788       INIT_colovr[ii] = XtNewString(INIT_def_colovr[ii]) ;
09789       INIT_labovr[ii] = XtNewString(INIT_def_labovr[ii]) ;
09790    }
09791    for( ; ii < MAX_NCOLOVR ; ii++ ){
09792       INIT_colovr[ii] = INIT_labovr[ii] = NULL ;
09793    }
09794 
09795 
09796 
09797    NAME2INT("ncolors",INIT_ngray,3,MAX_COLORS) ;
09798 
09799    NAME2INT("ncolovr",INIT_ncolovr,2,MAX_NCOLOVR) ;
09800 
09801    NAME2FLOAT("gamma",INIT_gamma,0.1,9.9) ;
09802 
09803    for( ii=0 ; ii < INIT_ncolovr ; ii++ ){
09804       sprintf( buf , "ovdef%02d" , ii+1 ) ;
09805       NAME2STRING(buf,INIT_colovr[ii] ) ;
09806 
09807       sprintf( buf , "ovlab%02d" , ii+1 ) ;
09808       NAME2STRING(buf,INIT_labovr[ii] ) ;
09809    }
09810 
09811    NAME2INT("ovcrosshair"      , INIT_crosshair_color,0,INIT_ncolovr) ;
09812    NAME2INT("ovmarksprimary"   , INIT_marks1_color   ,0,INIT_ncolovr) ;
09813    NAME2INT("ovmarkssecondary" , INIT_marks2_color   ,0,INIT_ncolovr) ;
09814    NAME2INT("markssize"        , INIT_marks_size     ,2,MAXOVSIZE   ) ;
09815    NAME2INT("marksgap"         , INIT_marks_gap      ,0,MAXOVSIZE-1 ) ;
09816    NAME2INT("crosshairgap"     , INIT_crosshair_gap  ,0,MAXOVSIZE   ) ;
09817    NAME2INT("bigscroll"        , INIT_bigscroll      ,1,MAXOVSIZE   ) ;
09818 
09819    NAME2INT("graph_boxes_color" ,INIT_GR_boxes_color ,BLUEST_COLOR,INIT_ncolovr) ;
09820    NAME2INT("graph_backg_color" ,INIT_GR_backg_color ,BLUEST_COLOR,INIT_ncolovr) ;
09821    NAME2INT("graph_grid_color"  ,INIT_GR_grid_color  ,BLUEST_COLOR,INIT_ncolovr) ;
09822    NAME2INT("graph_text_color"  ,INIT_GR_text_color  ,BLUEST_COLOR,INIT_ncolovr) ;
09823    NAME2INT("graph_data_color"  ,INIT_GR_data_color  ,BLUEST_COLOR,INIT_ncolovr) ;
09824    NAME2INT("graph_ideal_color" ,INIT_GR_ideal_color ,BLUEST_COLOR,INIT_ncolovr) ;
09825    NAME2INT("graph_ort_color"   ,INIT_GR_ort_color   ,BLUEST_COLOR,INIT_ncolovr) ;
09826    NAME2INT("graph_ignore_color",INIT_GR_ignore_color,BLUEST_COLOR,INIT_ncolovr) ;
09827    NAME2INT("graph_dplot_color" ,INIT_GR_dplot_color ,BLUEST_COLOR,INIT_ncolovr) ;
09828 
09829    NAME2INT("graph_boxes_thick" ,INIT_GR_boxes_thick ,0,1) ;
09830    NAME2INT("graph_grid_thick"  ,INIT_GR_grid_thick  ,0,1) ;
09831    NAME2INT("graph_data_thick"  ,INIT_GR_data_thick  ,0,1) ;
09832    NAME2INT("graph_ideal_thick" ,INIT_GR_ideal_thick ,0,1) ;
09833    NAME2INT("graph_ort_thick"   ,INIT_GR_ort_thick   ,0,1) ;
09834    NAME2INT("graph_dplot_thick" ,INIT_GR_dplot_thick ,0,1) ;
09835 
09836    NAME2INT("graph_ggap"        ,INIT_GR_ggap        ,0,19);         
09837    NAME2INT("fim_polort"        ,INIT_fim_polort     ,0,MAX_POLORT); 
09838    NAME2INT("graph_matrix"      ,INIT_GR_gmat        ,1,MAT_MAX);    
09839    NAME2INT("graph_gthick"      ,INIT_GR_gthick      ,2,10);         
09840 
09841 
09842 
09843    cpt = NULL ;
09844    NAME2STRING( "tlrc_big" , cpt ) ;
09845    if( cpt != NULL ){
09846       INIT_tlrc_big = (strcmp(cpt,"True")==0) ? 1 : 0 ;
09847       XtFree(cpt) ;
09848    }
09849 
09850    cpt = NULL ;
09851    NAME2STRING( "montage_periodic" , cpt ) ;
09852    if( cpt != NULL ){
09853       INIT_montage_periodic = (strcmp(cpt,"True")==0) ? 1 : 0 ;
09854       XtFree(cpt) ;
09855    }
09856 
09857    NAME2INT("fim_ignore",INIT_ignore,0,999) ;
09858 
09859    cpt = NULL ;
09860    NAME2STRING( "purge" , cpt ) ;
09861    if( cpt != NULL ){
09862       INIT_purge = (strcmp(cpt,"True")==0) ? 1 : 0 ;
09863       myXtFree(cpt) ;
09864    }
09865 
09866    NAME2FLOAT("resam_vox",INIT_resam_vox,0.1,4.0) ;
09867    INIT_resam_vox = 0.1 * ( (int)(10*INIT_resam_vox) ) ;
09868 
09869    cpt = NULL ;
09870    NAME2STRING( "resam_anat" , cpt ) ;
09871    if( cpt != NULL ){
09872       for( ii=FIRST_RESAM_TYPE ; ii <= LAST_RESAM_TYPE ; ii++ ){
09873          if( strcmp(cpt,RESAM_shortstr[ii]) == 0 ) break ;
09874       }
09875       if( ii <= LAST_RESAM_TYPE ) INIT_resam_anat = ii ;
09876       myXtFree(cpt) ;
09877    }
09878 
09879    cpt = NULL ;
09880    NAME2STRING( "resam_func" , cpt ) ;
09881    if( cpt != NULL ){
09882       for( ii=FIRST_RESAM_TYPE ; ii <= LAST_RESAM_TYPE ; ii++ ){
09883          if( strcmp(cpt,RESAM_shortstr[ii]) == 0 ) break ;
09884       }
09885       if( ii <= LAST_RESAM_TYPE ) INIT_resam_func = ii ;
09886       (char*)myXtFree(cpt) ;
09887    }
09888 
09889    cpt = NULL ;
09890    NAME2STRING( "resam_thr" , cpt ) ;
09891    if( cpt != NULL ){
09892       for( ii=FIRST_RESAM_TYPE ; ii <= LAST_RESAM_TYPE ; ii++ ){
09893          if( strcmp(cpt,RESAM_shortstr[ii]) == 0 ) break ;
09894       }
09895       if( ii <= LAST_RESAM_TYPE ) INIT_resam_thr = ii ;
09896       myXtFree(cpt) ;
09897    }
09898 
09899 
09900 
09901    cpt = NULL ;
09902    NAME2STRING( "pbar_posfunc" , cpt ) ;
09903    if( cpt != NULL ){
09904       INIT_posfunc = (strcmp(cpt,"True")==0) ? 1 : 0 ;
09905       myXtFree(cpt) ;
09906    }
09907 
09908    cpt = NULL ;
09909    NAME2STRING( "pbar_hide" , cpt ) ;
09910    if( cpt != NULL ){
09911       INIT_panes_hide = (strcmp(cpt,"True")==0) ? 1 : 0 ;
09912       myXtFree(cpt) ;
09913    }
09914 
09915    NAME2INT("pbar_pos_pane_count" , INIT_panes_pos , NPANE_MIN , NPANE_MAX ) ;
09916    NAME2INT("pbar_sgn_pane_count" , INIT_panes_sgn , NPANE_MIN , NPANE_MAX ) ;
09917 
09918    
09919 
09920    for( ii=NPANE_INIT+1 ; ii <= NPANE_MAX ; ii++ ){
09921       fval     = 1.0 / ii ;
09922       pthr[0]  = 1.0 ;
09923       pthr[ii] = 0.0 ;
09924       for( jj=1 ; jj < ii ; jj++ ) pthr[jj] = fval * (ii-jj) ;
09925       for( jj=0 ; jj < ii ; jj++ ) pov[jj]  = (jj % INIT_ncolovr) + 1 ;
09926 
09927       for( jj=0 ; jj <= ii ; jj++ ) INIT_pval_pos[ii][jj] = pthr[jj] ;
09928       for( jj=0 ; jj <  ii ; jj++ ) INIT_ovin_pos[ii][jj] = pov[jj] ;
09929    }
09930 
09931    for( ii=NPANE_MIN ; ii <= NPANE_MAX ; ii++ ){
09932 
09933       for( jj=0 ; jj <= ii ; jj++ ){
09934          sprintf( buf , "pbar_pos_pane%02d_thr%02d" , ii,jj ) ;
09935          pthr[jj] = BAD ;
09936          NAME2FLOAT(buf,pthr[jj],0.0,1.0) ;
09937       }
09938 
09939       for( jj=0 ; jj < ii ; jj++ ){
09940          sprintf( buf , "pbar_pos_pane%02d_ov%02d" , ii,jj ) ;
09941          pov[jj] = BAD ;
09942          NAME2INT(buf,pov[jj],0,INIT_ncolovr) ;
09943       }
09944 
09945       
09946 
09947       if( pthr[0] != 1.0 || pthr[jj] != 0.0 ) continue ;
09948       for( jj=1 ; jj <= ii ; jj++ ){
09949          if( pthr[jj] == BAD || pthr[jj] >= pthr[jj-1] ) break ;
09950       }
09951       if( jj <= ii ) continue ;
09952 
09953       
09954 
09955       for( jj=0 ; jj < ii ; jj++ ) if( pov[jj] == BAD ) break ;
09956       if( jj < ii ) continue ;
09957 
09958       
09959 
09960       for( jj=0 ; jj <= ii ; jj++ ) INIT_pval_pos[ii][jj] = pthr[jj] ;
09961       for( jj=0 ; jj <  ii ; jj++ ) INIT_ovin_pos[ii][jj] = pov[jj] ;
09962 
09963    }
09964 
09965 
09966 
09967    for( ii=NPANE_INIT+1 ; ii <= NPANE_MAX ; ii++ ){
09968       fval     =  1.0 / ii ;
09969       pthr[0]  =  1.0 ;
09970       pthr[ii] = -1.0 ;
09971       for( jj=1 ; jj < ii ; jj++ ) pthr[jj] = fval * (ii-2*jj) ;
09972       for( jj=0 ; jj < ii ; jj++ ) pov[jj]  = (jj % INIT_ncolovr) + 1 ;
09973 
09974       for( jj=0 ; jj <= ii ; jj++ ) INIT_pval_sgn[ii][jj] = pthr[jj] ;
09975       for( jj=0 ; jj <  ii ; jj++ ) INIT_ovin_sgn[ii][jj] = pov[jj] ;
09976    }
09977 
09978    for( ii=NPANE_MIN ; ii <= NPANE_MAX ; ii++ ){
09979 
09980       for( jj=0 ; jj <= ii ; jj++ ){
09981          sprintf( buf , "pbar_sgn_pane%02d_thr%02d" , ii,jj ) ;
09982          pthr[jj] = BAD ;
09983          NAME2FLOAT(buf,pthr[jj],-1.0,1.0) ; 
09984       }
09985 
09986       for( jj=0 ; jj < ii ; jj++ ){
09987          sprintf( buf , "pbar_sgn_pane%02d_ov%02d" , ii,jj ) ;
09988          pov[jj] = BAD ;
09989          NAME2INT(buf,pov[jj],0,INIT_ncolovr) ;
09990       }
09991 
09992       
09993 
09994       if( pthr[0] != 1.0 || pthr[jj] != -1.0 ) continue ;
09995       for( jj=1 ; jj <= ii ; jj++ ){
09996          if( pthr[jj] == BAD || pthr[jj] >= pthr[jj-1] ) break ;
09997       }
09998       if( jj <= ii ) continue ;
09999 
10000       
10001 
10002       for( jj=0 ; jj < ii ; jj++ ) if( pov[jj] == BAD ) break ;
10003       if( jj < ii ) continue ;
10004 
10005       
10006 
10007       for( jj=0 ; jj <= ii ; jj++ ) INIT_pval_sgn[ii][jj] = pthr[jj] ;
10008       for( jj=0 ; jj <  ii ; jj++ ) INIT_ovin_sgn[ii][jj] = pov[jj] ;
10009 
10010    }
10011 
10012    
10013 
10014 #if defined(RGBCYC_COUNT) && RGBCYC_COUNT <= NPANE_MAX
10015    ii = RGBCYC_COUNT ;
10016    for( jj=0 ; jj < ii ; jj++ ) INIT_ovin_pos[ii][jj] = RGBCYC_FIRST+jj+1 ;
10017    for( jj=0 ; jj < ii ; jj++ ) INIT_ovin_sgn[ii][jj] = RGBCYC_FIRST+jj+1 ;
10018 #endif
10019 
10020    EXRETURN ;
10021 }
10022 
10023 
10024 #ifdef USE_SONNETS
10025 
10026 void AFNI_popup_sonnet( Widget w , int ii )  
10027 {
10028    char buf[2048] ; int jj=MCW_USER_KILL ;
10029 
10030    if( w == NULL ) return ;
10031 
10032    if( ii < 1 || ii > NUM_SONNETS ){
10033       ii  = (lrand48()&NUM_SONNETS) + 1 ;
10034       jj |= MCW_TIMER_KILL ;
10035    }
10036 
10037    sprintf( buf , "                    * %d *\n" , ii ) ;
10038    strcat( buf , sonnets[ii-1] ) ;
10039    (void) MCW_popup_message( w , buf , jj ) ;
10040    return ;
10041 }
10042 
10043 
10044 
10045 void AFNI_sonnet_CB( Widget w , XtPointer client_data , XtPointer call_data )
10046 {
10047    Three_D_View * im3d = (Three_D_View *) client_data ;
10048    MCW_choose_cbs * cbs ;
10049 
10050    if( NO_frivolities || !IM3D_VALID(im3d) ) return ;
10051 
10052    if( w == im3d->vwid->prog->hidden_sonnet_pb ){  
10053 
10054       MCW_choose_integer( im3d->vwid->picture ,
10055                           "Sonnet " ,
10056                           1 , NUM_SONNETS , sonnet_index+1 ,
10057                           AFNI_sonnet_CB , (XtPointer) im3d ) ;
10058       return ;
10059    }
10060 
10061 
10062 
10063    cbs = (MCW_choose_cbs *) call_data ;
10064    if( cbs->reason != mcwCR_integer ){  
10065       XBell( XtDisplay(w) , 100 ) ; return ;
10066    }
10067 
10068    AFNI_popup_sonnet( im3d->vwid->picture , cbs->ival ) ;
10069    return ;
10070 }
10071 #endif 
10072 
10073 
10074 
10075 
10076 
10077 
10078 
10079 
10080 
10081 
10082 void AFNI_register_nD_function( int nd, char * name,
10083                                 generic_func * func, int flags )
10084 {
10085    MCW_function_list * rlist ;
10086    int num ;
10087 
10088    if( name == NULL || strlen(name) == 0 || func == NULL ) return ;
10089 
10090    switch( nd ){
10091       default: return ;
10092 
10093       case 0: rlist = &(GLOBAL_library.registered_0D) ; break ;
10094       case 1: rlist = &(GLOBAL_library.registered_1D) ; break ;
10095       case 2: rlist = &(GLOBAL_library.registered_2D) ; break ;
10096 
10097       case -1: rlist= &(GLOBAL_library.registered_slice_proj) ; break ;
10098    }
10099 
10100    num = rlist->num ;
10101 
10102    if( num == 0 ){
10103      rlist->flags=NULL; rlist->labels=NULL; rlist->funcs=NULL;
10104      rlist->func_data=NULL; rlist->func_code=NULL; rlist->func_init=NULL;
10105    }
10106 
10107    rlist->flags = (int *) XtRealloc( (char *)rlist->flags, sizeof(int)*(num+1) ) ;
10108 
10109    rlist->labels = (char **) XtRealloc( (char *)rlist->labels ,
10110                                         sizeof(char *)*(num+1) ) ;
10111 
10112    rlist->funcs = (generic_func **) XtRealloc( (char *)rlist->funcs ,
10113                                                sizeof(generic_func *)*(num+1) ) ;
10114 
10115    rlist->func_data = (void **) XtRealloc( (char *)rlist->func_data ,
10116                                            sizeof(void *)*(num+1) ) ;
10117 
10118    rlist->func_code = (int *) XtRealloc( (char *)rlist->func_code, sizeof(int)*(num+1) ) ;
10119 
10120    rlist->func_init = (generic_func **) XtRealloc( (char *)rlist->func_init ,
10121                                                    sizeof(generic_func *)*(num+1) ) ;
10122 
10123    rlist->flags[num]     = flags ;
10124    rlist->labels[num]    = XtNewString(name) ;
10125    rlist->funcs[num]     = func ;
10126    rlist->func_data[num] = NULL ;
10127    rlist->func_code[num] = nd ;
10128    rlist->func_init[num] = NULL ;
10129 
10130    rlist->num = num+1 ;
10131    return ;
10132 }
10133 
10134 
10135 
10136 
10137 
10138 void AFNI_register_nD_func_init( int nd , generic_func *fin )
10139 {
10140    MCW_function_list * rlist ;
10141    int num ;
10142 
10143    if( fin == NULL ) return ;
10144 
10145    switch( nd ){
10146       default: return ;
10147 
10148       case 0: rlist = &(GLOBAL_library.registered_0D) ; break ;
10149       case 1: rlist = &(GLOBAL_library.registered_1D) ; break ;
10150       case 2: rlist = &(GLOBAL_library.registered_2D) ; break ;
10151 
10152       case -1: rlist= &(GLOBAL_library.registered_slice_proj) ; break ;
10153    }
10154 
10155    num = rlist->num ; if( num <= 0 ) return ;
10156    rlist->func_init[num-1] = fin ;
10157    return ;
10158 }
10159 
10160 
10161 
10162 static int dset_ijk=-1 , dset_tin=-1 ;
10163 
10164 void AFNI_store_dset_index( int ijk , int tin )
10165 {
10166    dset_ijk = ijk ; dset_tin = tin ; return ;
10167 }
10168 
10169 int AFNI_needs_dset_ijk(void){ return dset_ijk ; }
10170 int AFNI_needs_dset_tin(void){ return dset_tin ; }
10171 
10172 
10173 
10174 
10175 
10176 void AFNI_add_timeseries( MRI_IMAGE * tsim )
10177 {
10178 ENTRY("AFNI_add_timeseries") ;
10179 
10180    if( tsim != NULL ){
10181       POPDOWN_timeseries_chooser ;
10182       ADDTO_IMARR(GLOBAL_library.timeseries,tsim) ;
10183    }
10184    EXRETURN ;
10185 }