Skip to content

AFNI/NIfTI Server

Sections
Personal tools
You are here: Home » AFNI » Documentation

Doxygen Source Code Documentation


Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search  

plug_realtime.c File Reference

#include "afni.h"
#include "parser.h"
#include "coxplot.h"
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <signal.h>
#include <ctype.h>

Go to the source code of this file.


Data Structures

struct  RT_input

Defines

#define VMCHECK
#define TCP_CONTROL   "tcp:*:7954"
#define INFO_SIZE   (32*1024)
#define SHM_CHILD   "shm:afnibahn:32K"
#define SHORT_DELAY   1
#define LONG_DELAY   10
#define ALLOW_REGISTRATION
#define DTYPE_2DZ   77
#define DTYPE_2DZT   78
#define DTYPE_3D   79
#define DTYPE_3DT   80
#define ZORDER_ALT   33
#define ZORDER_SEQ   34
#define ZORDER_EXP   39
#define NZMAX   1024
#define RT_MAX_EXPR   1024
#define RT_MAX_PREFIX   100
#define RT_MP_DEF_PORT   53214
#define DEFAULT_XYFOV   240.0
#define DEFAULT_XYMATRIX   64
#define DEFAULT_ZDELTA   5.0
#define DEFAULT_ZNUM   2
#define DEFAULT_TR   1.0
#define RT_NBUF   INFO_SIZE
#define NNAME   128
#define ORCODE(aa)
#define MAX_CHAN   32
#define SHOW_TIMES
#define NFUNC   2
#define FUNC_NONE   0
#define FUNC_RTFIM   1
#define INIT_MODE   -1
#define UPDATE_MODE   -2
#define FINAL_MODE   -3
#define NYESNO   2
#define NVERB   3
#define NGRAPH   3
#define NRESAM   5
#define NREG   6
#define REGMODE_NONE   0
#define REGMODE_2D_RTIME   1
#define REGMODE_2D_ATEND   2
#define REGMODE_3D_RTIME   3
#define REGMODE_3D_ATEND   4
#define REGMODE_3D_ESTIM   5
#define REG_IS_2D(mm)   ( (mm) == REGMODE_2D_RTIME || (mm) == REGMODE_2D_ATEND )
#define REG_IS_3D(mm)   ( (mm)==REGMODE_3D_RTIME || (mm)==REGMODE_3D_ATEND || (mm)==REGMODE_3D_ESTIM )
#define REG_MAKE_DSET(mm)
#define TELL_NORMAL   0
#define TELL_WRITE   1
#define TELL_FINAL   2
#define WRITE_INTERVAL   37.954
#define REAP_CHILDREN
#define GRIM_REAPER   waitpid(-1,NULL,WNOHANG)
#define USE_RT_STARTUP
#define CLEANUP(n)   cleanup_rtinp(n)
#define FREEUP(x)   do{ if( (x) != NULL ){free((x)); (x)=NULL;} } while(0)
#define CHILD_MAX_WAIT   66.6
#define MAX_NEV   6
#define EPR(s)   fprintf(stderr,"RT: HEADER DATA ERROR - %s\a\n",(s))
#define OR3OK(x, y, z)   ( ((x)&6) + ((y)&6) + ((z)&6) == 6 )
#define BADNEWS   fprintf(stderr,"RT: illegal header info=%s\a\n",buf)
#define STARTER(st)   (strncmp(buf,st,strlen(st)) == 0)
#define NBUF   1024
#define COMMAND_MARKER   "Et Earello Endorenna utulien!!"
#define COMMAND_MARKER_LENGTH   30
#define MIN_TO_GRAPH   2
#define D2RFAC   (PI/180.0)
#define R2DFAC   (180.0/PI)
#define VL_MIT   9
#define VL_DXY   0.05
#define VL_DPH   0.07
#define VL_DEL   0.70
#define MIN_UPDT   5
#define IFree(x)   do{ if( (x)!=NULL ){ free(x) ; (x)=NULL ; } } while(0)

Functions

int RT_fim_recurse (RT_input *, int)
DEFINE_PLUGIN_PROTOTYPE char * RT_main (PLUGIN_interface *)
Boolean RT_worker (XtPointer)
RT_inputnew_RT_input (IOCHAN *)
int RT_check_listen (void)
int RT_acquire_info (char *)
int RT_process_info (int, char *, RT_input *)
void RT_start_dataset (RT_input *)
void RT_read_image (RT_input *, char *)
int RT_process_data (RT_input *)
void RT_process_image (RT_input *)
void RT_finish_dataset (RT_input *)
void RT_tell_afni (RT_input *, int)
void RT_start_child (RT_input *)
void RT_check_info (RT_input *, int)
void RT_process_xevents (RT_input *)
void RT_tell_afni_one (RT_input *, int, int)
void RT_registration_2D_atend (RT_input *rtin)
void RT_registration_2D_setup (RT_input *rtin)
void RT_registration_2D_close (RT_input *rtin)
void RT_registration_2D_onevol (RT_input *rtin, int tt)
void RT_registration_2D_realtime (RT_input *rtin)
void RT_registration_3D_atend (RT_input *rtin)
void RT_registration_3D_setup (RT_input *rtin)
void RT_registration_3D_close (RT_input *rtin)
void RT_registration_3D_onevol (RT_input *rtin, int tt)
void RT_registration_3D_realtime (RT_input *rtin)
int RT_mp_comm_close (RT_input *rtin)
int RT_mp_comm_init (RT_input *rtin)
int RT_mp_comm_init_vars (RT_input *rtin)
int RT_mp_comm_send_data (RT_input *rtin, float *mp[6], int nt)
int RT_parser_init (RT_input *rtin)
void RT_set_grapher_pinnums (int pinnum)
void RT_startup (XtPointer junk)
PLUGIN_interface * PLUGIN_init (int ncall)
void cleanup_rtinp (int keep_ioc_data)
void RT_image_kfun (void *kdata)
void MTD_killfunc (MEM_topshell_data *mp)

Variables

int num_open_controllers
int open_controller_index [MAX_CONTROLLERS]
Three_D_Viewopen_controller [MAX_CONTROLLERS]
char helpstring []
char root [THD_MAX_PREFIX] = "rt."
int update = 1
char * FUNC_strings [NFUNC] = { "None" , "FIM" }
int func_code = 0
int image_mode = 0
int_funcFUNC_funcs [NFUNC] = { NULL , RT_fim_recurse }
char * VERB_strings [NVERB] = { "No" , "Yes" , "Very" }
int verbose = 1
int regtime = 3
int regmode = 0
int reggraph = 0
int reg_resam = 1
int reg_nr = 100
float reg_yr = 1.0
char * GRAPH_strings [NGRAPH] = { "No" , "Yes" , "Realtime" }
char * REG_resam_strings [NRESAM]
int REG_resam_ints [NRESAM]
char * REG_strings [NREG]
char * REG_strings_ENV [NREG]
IOCHANioc_control = NULL
RT_inputrtinp = NULL
PLUGIN_interface * plint = NULL

Define Documentation

#define ALLOW_REGISTRATION
 

Definition at line 27 of file plug_realtime.c.

#define BADNEWS   fprintf(stderr,"RT: illegal header info=%s\a\n",buf)
 

Definition at line 2022 of file plug_realtime.c.

Referenced by RT_process_info().

#define CHILD_MAX_WAIT   66.6
 

#define CLEANUP n       cleanup_rtinp(n)
 

macro to close down the realtime input stream *

Definition at line 808 of file plug_realtime.c.

Referenced by RT_worker().

#define COMMAND_MARKER   "Et Earello Endorenna utulien!!"
 

popup a message to keep the user occupied. *

Definition at line 2944 of file plug_realtime.c.

Referenced by RT_read_image().

#define COMMAND_MARKER_LENGTH   30
 

Definition at line 2945 of file plug_realtime.c.

Referenced by RT_read_image().

#define D2RFAC   (PI/180.0)
 

Definition at line 3961 of file plug_realtime.c.

#define DEFAULT_TR   1.0
 

Definition at line 102 of file plug_realtime.c.

Referenced by new_RT_input().

#define DEFAULT_XYFOV   240.0
 

Definition at line 98 of file plug_realtime.c.

Referenced by new_RT_input().

#define DEFAULT_XYMATRIX   64
 

Definition at line 99 of file plug_realtime.c.

Referenced by new_RT_input().

#define DEFAULT_ZDELTA   5.0
 

Definition at line 100 of file plug_realtime.c.

Referenced by new_RT_input().

#define DEFAULT_ZNUM   2
 

Definition at line 101 of file plug_realtime.c.

Referenced by new_RT_input().

#define DTYPE_2DZ   77
 

10 May 2005: added TPATTERN command to set timing pattern [rickr] *

Definition at line 83 of file plug_realtime.c.

Referenced by new_RT_input(), RT_process_image(), RT_process_info(), and RT_start_dataset().

#define DTYPE_2DZT   78
 

Definition at line 84 of file plug_realtime.c.

Referenced by new_RT_input(), RT_process_image(), RT_process_info(), and RT_start_dataset().

#define DTYPE_3D   79
 

Definition at line 85 of file plug_realtime.c.

Referenced by new_RT_input(), RT_process_image(), RT_process_info(), and RT_start_dataset().

#define DTYPE_3DT   80
 

Definition at line 86 of file plug_realtime.c.

Referenced by RT_process_image(), RT_process_info(), and RT_start_dataset().

#define EPR      fprintf(stderr,"RT: HEADER DATA ERROR - %s\a\n",(s))
 

END OF CHILD PROCESS *

Definition at line 1706 of file plug_realtime.c.

Referenced by read_mincdim(), RT_check_info(), THD_load_minc(), and THD_open_minc().

#define FINAL_MODE   -3
 

Definition at line 351 of file plug_realtime.c.

Referenced by RT_fim_recurse(), and RT_tell_afni_one().

#define FREEUP      do{ if( (x) != NULL ){free((x)); (x)=NULL;} } while(0)
 

------------ 01 Aug 1998: replace the macro with a function -----------*

Definition at line 813 of file plug_realtime.c.

#define FUNC_NONE   0
 

Definition at line 346 of file plug_realtime.c.

Referenced by new_RT_input(), and RT_process_info().

#define FUNC_RTFIM   1
 

Definition at line 347 of file plug_realtime.c.

#define GRIM_REAPER   waitpid(-1,NULL,WNOHANG)
 

Definition at line 463 of file plug_realtime.c.

Referenced by cleanup_rtinp().

#define IFree      do{ if( (x)!=NULL ){ free(x) ; (x)=NULL ; } } while(0)
 

Definition at line 4542 of file plug_realtime.c.

Referenced by RT_fim_recurse().

#define INFO_SIZE   (32*1024)
 

Definition at line 17 of file plug_realtime.c.

Referenced by new_RT_input(), RT_acquire_info(), and RT_worker().

#define INIT_MODE   -1
 

Definition at line 349 of file plug_realtime.c.

Referenced by RT_fim_recurse(), and RT_process_image().

#define LONG_DELAY   10
 

Definition at line 21 of file plug_realtime.c.

Referenced by RT_acquire_info().

#define MAX_CHAN   32
 

Definition at line 112 of file plug_realtime.c.

Referenced by cleanup_rtinp(), new_RT_input(), RT_process_info(), and RT_tell_afni().

#define MAX_NEV   6
 

At last -- process image data *

Definition at line 1226 of file plug_realtime.c.

Referenced by RT_process_xevents().

#define MIN_TO_GRAPH   2
 

Definition at line 3099 of file plug_realtime.c.

Referenced by RT_process_image().

#define MIN_UPDT   5
 

Definition at line 4525 of file plug_realtime.c.

Referenced by RT_fim_recurse().

#define NBUF   1024
 

Definition at line 2024 of file plug_realtime.c.

Referenced by RT_process_info().

#define NFUNC   2
 

Definition at line 340 of file plug_realtime.c.

Referenced by PLUGIN_init(), and RT_main().

#define NGRAPH   3
 

Definition at line 371 of file plug_realtime.c.

Referenced by PLUGIN_init(), and RT_main().

#define NNAME   128
 

Definition at line 105 of file plug_realtime.c.

Referenced by new_RT_input().

#define NREG   6
 

Definition at line 380 of file plug_realtime.c.

Referenced by PLUGIN_init(), and RT_main().

#define NRESAM   5
 

Definition at line 374 of file plug_realtime.c.

Referenced by PLUGIN_init(), and RT_main().

#define NVERB   3
 

Definition at line 358 of file plug_realtime.c.

Referenced by PLUGIN_init(), and RT_main().

#define NYESNO   2
 

Definition at line 357 of file plug_realtime.c.

Referenced by PLUGIN_init(), and RT_main().

#define NZMAX   1024
 

Definition at line 91 of file plug_realtime.c.

Referenced by RT_process_info().

#define OR3OK x,
y,
z       ( ((x)&6) + ((y)&6) + ((z)&6) == 6 )
 

Definition at line 1708 of file plug_realtime.c.

#define ORCODE aa   
 

Value:

( (aa)=='R' ? ORI_R2L_TYPE : (aa)=='L' ? ORI_L2R_TYPE : \
    (aa)=='P' ? ORI_P2A_TYPE : (aa)=='A' ? ORI_A2P_TYPE : \
    (aa)=='I' ? ORI_I2S_TYPE : (aa)=='S' ? ORI_S2I_TYPE : ILLEGAL_TYPE )

Definition at line 107 of file plug_realtime.c.

#define R2DFAC   (180.0/PI)
 

Definition at line 3962 of file plug_realtime.c.

Referenced by RT_registration_2D_onevol(), and RT_registration_3D_onevol().

#define REAP_CHILDREN
 

Definition at line 461 of file plug_realtime.c.

#define REG_IS_2D mm       ( (mm) == REGMODE_2D_RTIME || (mm) == REGMODE_2D_ATEND )
 

Definition at line 396 of file plug_realtime.c.

Referenced by RT_finish_dataset(), and RT_start_dataset().

#define REG_IS_3D mm       ( (mm)==REGMODE_3D_RTIME || (mm)==REGMODE_3D_ATEND || (mm)==REGMODE_3D_ESTIM )
 

Definition at line 398 of file plug_realtime.c.

Referenced by RT_finish_dataset(), RT_process_info(), and RT_start_dataset().

#define REG_MAKE_DSET mm   
 

Value:

( (mm) == REGMODE_2D_RTIME || (mm) == REGMODE_2D_ATEND ||  \
    (mm) == REGMODE_3D_RTIME || (mm) == REGMODE_3D_ATEND   )

Definition at line 401 of file plug_realtime.c.

Referenced by RT_start_dataset().

#define REGMODE_2D_ATEND   2
 

Definition at line 391 of file plug_realtime.c.

Referenced by RT_finish_dataset(), and RT_registration_2D_atend().

#define REGMODE_2D_RTIME   1
 

Definition at line 390 of file plug_realtime.c.

Referenced by RT_fim_recurse(), RT_process_image(), and RT_registration_2D_realtime().

#define REGMODE_3D_ATEND   4
 

Definition at line 393 of file plug_realtime.c.

Referenced by RT_finish_dataset(), and RT_registration_3D_setup().

#define REGMODE_3D_ESTIM   5
 

Definition at line 394 of file plug_realtime.c.

Referenced by new_RT_input(), RT_finish_dataset(), RT_process_image(), RT_registration_3D_realtime(), and RT_registration_3D_setup().

#define REGMODE_3D_RTIME   3
 

Definition at line 392 of file plug_realtime.c.

Referenced by RT_fim_recurse(), RT_process_image(), and RT_registration_3D_setup().

#define REGMODE_NONE   0
 

Definition at line 389 of file plug_realtime.c.

Referenced by RT_main(), RT_process_info(), RT_registration_2D_atend(), RT_registration_2D_onevol(), RT_registration_2D_realtime(), RT_registration_3D_atend(), RT_registration_3D_onevol(), and RT_registration_3D_realtime().

#define RT_MAX_EXPR   1024
 

Definition at line 93 of file plug_realtime.c.

Referenced by RT_process_info().

#define RT_MAX_PREFIX   100
 

Definition at line 94 of file plug_realtime.c.

Referenced by RT_start_dataset().

#define RT_MP_DEF_PORT   53214
 

Definition at line 96 of file plug_realtime.c.

Referenced by new_RT_input().

#define RT_NBUF   INFO_SIZE
 

Definition at line 104 of file plug_realtime.c.

Referenced by RT_worker().

#define SHM_CHILD   "shm:afnibahn:32K"
 

Definition at line 18 of file plug_realtime.c.

Referenced by RT_acquire_info(), and RT_start_child().

#define SHORT_DELAY   1
 

Definition at line 20 of file plug_realtime.c.

Referenced by new_RT_input(), RT_check_listen(), and RT_worker().

#define SHOW_TIMES
 

Value:

fprintf(stderr,"RT: cpu time = %.2f  elapsed time = %.2f\n" , \
          PLUTO_cpu_time()-rtin->cpu , PLUTO_elapsed_time()-rtin->elapsed )

Definition at line 244 of file plug_realtime.c.

Referenced by RT_finish_dataset(), RT_registration_2D_atend(), RT_registration_3D_atend(), and RT_tell_afni().

#define STARTER st       (strncmp(buf,st,strlen(st)) == 0)
 

Definition at line 2023 of file plug_realtime.c.

#define TCP_CONTROL   "tcp:*:7954"
 

Definition at line 16 of file plug_realtime.c.

Referenced by RT_check_listen().

#define TELL_FINAL   2
 

Definition at line 457 of file plug_realtime.c.

Referenced by RT_finish_dataset(), RT_tell_afni(), and RT_tell_afni_one().

#define TELL_NORMAL   0
 

Definition at line 455 of file plug_realtime.c.

Referenced by RT_process_image(), and RT_worker().

#define TELL_WRITE   1
 

Definition at line 456 of file plug_realtime.c.

#define UPDATE_MODE   -2
 

Definition at line 350 of file plug_realtime.c.

Referenced by RT_fim_recurse(), and RT_tell_afni_one().

#define USE_RT_STARTUP
 

Definition at line 468 of file plug_realtime.c.

#define VL_DEL   0.70
 

Definition at line 4286 of file plug_realtime.c.

Referenced by RT_registration_3D_setup().

#define VL_DPH   0.07
 

Definition at line 4285 of file plug_realtime.c.

Referenced by RT_registration_3D_setup().

#define VL_DXY   0.05
 

Definition at line 4284 of file plug_realtime.c.

Referenced by RT_registration_3D_setup().

#define VL_MIT   9
 

Definition at line 4283 of file plug_realtime.c.

Referenced by RT_registration_3D_setup().

#define VMCHECK
 

Definition at line 13 of file plug_realtime.c.

Referenced by new_RT_input(), RT_fim_recurse(), RT_process_data(), RT_process_image(), RT_process_info(), RT_start_child(), RT_start_dataset(), and RT_worker().

#define WRITE_INTERVAL   37.954
 

Definition at line 459 of file plug_realtime.c.

Referenced by RT_worker().

#define ZORDER_ALT   33
 

Definition at line 88 of file plug_realtime.c.

Referenced by new_RT_input(), RT_process_image(), RT_process_info(), and RT_start_dataset().

#define ZORDER_EXP   39
 

Definition at line 90 of file plug_realtime.c.

Referenced by RT_process_info(), and RT_start_dataset().

#define ZORDER_SEQ   34
 

Definition at line 89 of file plug_realtime.c.

Referenced by RT_process_image(), RT_process_info(), and RT_start_dataset().


Function Documentation

void cleanup_rtinp int    keep_ioc_data
 

Definition at line 819 of file plug_realtime.c.

References RT_input::bufar, RT_input::child_info, DESTROY_IMARR, free, FREEUP, GRIM_REAPER, RT_input::image_handle, RT_input::image_space, RT_input::ioc_data, RT_input::ioc_info, IOCHAN_CLOSENOW, MAX_CHAN, mri_2dalign_cleanup(), mri_3dalign_cleanup(), mri_clear_data_pointer, mri_free(), RT_input::note, RT_input::num_note, RT_input::nzz, PLUTO_imseq_rekill(), RT_input::reg_2dbasis, RT_input::reg_3dbasis, RT_input::reg_dx, RT_input::reg_dy, RT_input::reg_dz, RT_input::reg_eval, RT_input::reg_phi, RT_input::reg_psi, RT_input::reg_rep, RT_input::reg_theta, RT_input::reg_tim, and RT_input::sbr.

00820 {
00821    int cc ;
00822 
00823    if( !keep_ioc_data )
00824      IOCHAN_CLOSENOW(rtinp->ioc_data) ;    /* close open I/O channels */
00825 
00826    IOCHAN_CLOSENOW(rtinp->ioc_info) ;
00827 
00828    if( rtinp->child_info > 0 )             /* destroy child process */
00829       kill( rtinp->child_info , SIGTERM ) ;
00830 
00831    DESTROY_IMARR(rtinp->bufar) ;           /* destroy any buffered images */
00832 
00833    for( cc=0 ; cc < MAX_CHAN ; cc++ ){     /* 01 Aug 2002: loop over channels */
00834      if( rtinp->sbr[cc] != NULL )
00835        free( rtinp->sbr[cc] ) ;            /* destroy buffered data */
00836    }
00837 
00838 #ifdef ALLOW_REGISTRATION
00839    if( rtinp->reg_2dbasis != NULL ){       /* destroy registration setup */
00840       int kk ;
00841       for( kk=0 ; kk < rtinp->nzz ; kk++ )
00842          mri_2dalign_cleanup( rtinp->reg_2dbasis[kk] ) ;
00843       free( rtinp->reg_2dbasis ) ;
00844    }
00845 
00846    if( rtinp->reg_3dbasis != NULL ){
00847       mri_3dalign_cleanup( rtinp->reg_3dbasis ) ;
00848    }
00849 
00850    FREEUP( rtinp->reg_tim   ) ; FREEUP( rtinp->reg_dx    ) ;
00851    FREEUP( rtinp->reg_dy    ) ; FREEUP( rtinp->reg_dz    ) ;
00852    FREEUP( rtinp->reg_phi   ) ; FREEUP( rtinp->reg_psi   ) ;
00853    FREEUP( rtinp->reg_theta ) ; FREEUP( rtinp->reg_rep   ) ;
00854    FREEUP( rtinp->reg_eval  ) ;
00855 #endif
00856 
00857    if( rtinp->image_handle != NULL )
00858       PLUTO_imseq_rekill( rtinp->image_handle,NULL,NULL ) ;  /* 28 Apr 2000 */
00859 
00860    if( rtinp->image_space != NULL ){
00861       mri_clear_data_pointer(rtinp->image_space) ; mri_free(rtinp->image_space) ;
00862    }
00863 
00864    /* 01 Oct 2002: free stored notes */
00865 
00866    if( rtinp->num_note > 0 && rtinp->note != NULL ){
00867      int kk ;
00868      for( kk=0 ; kk < rtinp->num_note ; kk++ ) FREEUP( rtinp->note[kk] ) ;
00869      FREEUP(rtinp->note) ;
00870    }
00871 
00872    free(rtinp) ; rtinp = NULL ;            /* destroy data structure */
00873    ioc_control = NULL ;                    /* ready to listen again */
00874    GRIM_REAPER ;                           /* reap dead child, if any */
00875 }

void MTD_killfunc MEM_topshell_data   mp
 

Definition at line 4093 of file plug_realtime.c.

References free, RT_input::mp, mp, and MEM_topshell_data::userdata.

Referenced by RT_registration_3D_realtime().

04094 {
04095    /* if mp is for active input, then set the active one to nada */
04096 
04097    if( mp == NULL ) return ;
04098    if( rtinp != NULL && mp == rtinp->mp ){
04099       if( verbose ) fprintf(stderr,"RT: user killed active realtime graph\n") ;
04100       rtinp->mp = NULL ;
04101    } else {
04102       if( verbose ) fprintf(stderr,"RT: user killed inactive realtime graph\n") ;
04103    }
04104 
04105    if( mp->userdata != NULL ){ free(mp->userdata) ; mp->userdata = NULL ; }
04106    return ;
04107 }

RT_input * new_RT_input IOCHAN  
 

Definition at line 1267 of file plug_realtime.c.

References AFNI_find_open_controller(), RT_input::afni_status, RT_input::bufar, calloc, RT_input::child_info, RT_input::cpu, RT_input::cur_chan, RT_input::datum, DEFAULT_TR, DEFAULT_XYFOV, DEFAULT_XYMATRIX, DEFAULT_ZDELTA, DEFAULT_ZNUM, RT_input::dset, RT_input::dtype, DTYPE_2DZ, DTYPE_2DZT, DTYPE_3D, RT_input::dxx, RT_input::dyy, RT_input::dzz, RT_input::elapsed, EXIT, free, func_code, RT_input::func_code, RT_input::func_condit, RT_input::func_dset, RT_input::func_func, FUNC_funcs, FUNC_NONE, RT_input::func_status, GLOBAL_library, RT_input::im, RT_input::im3d, IM3D_OPEN, RT_input::image_handle, image_mode, RT_input::image_mode, RT_input::image_space, RT_input::imsize, RT_input::info_ok, INFO_SIZE, RT_input::ioc_data, RT_input::ioc_info, IOCHAN_CLOSENOW, iochan_goodcheck(), iochan_init(), iochan_readcheck(), iochan_recv(), iochan_sleep(), RT_input::last_elapsed, RT_input::last_nvol, malloc, RT_input::marked_for_death, MAX_CHAN, MCW_strncpy, MIN, RT_input::mp, RT_input::mp_host, RT_input::mp_nmsg, RT_input::mp_npsets, RT_input::mp_port, RT_input::mp_tcp_sd, RT_input::mp_tcp_use, MRI_FOURIER, MRI_HEPTIC, IOCHAN::name, RT_input::name_data, RT_input::name_info, RT_input::nbuf, NNAME, RT_input::no_data, RT_input::note, RT_input::nr, RT_input::nsl, RT_input::num_chan, RT_input::num_note, RT_input::nvol, RT_input::nxx, RT_input::nyy, RT_input::nzseq, RT_input::nzz, RT_input::orcxx, RT_input::orcyy, RT_input::orczz, ORI_A2P_TYPE, ORI_L2R_TYPE, ORI_S2I_TYPE, RT_input::p_code, plint, PLUTO_cpu_time(), PLUTO_elapsed_time(), RT_input::reg_2dbasis, RT_input::reg_3dbasis, RT_input::reg_base_index, RT_input::reg_dset, RT_input::reg_dx, RT_input::reg_dy, RT_input::reg_dz, RT_input::reg_eval, RT_input::reg_final_resam, RT_input::reg_graph, RT_input::reg_graph_xnew, RT_input::reg_graph_xr, RT_input::reg_graph_ynew, RT_input::reg_graph_yr, RT_input::reg_mode, RT_input::reg_nest, reg_nr, RT_input::reg_nvol, RT_input::reg_phi, RT_input::reg_psi, RT_input::reg_rep, reg_resam, RT_input::reg_resam, REG_resam_ints, RT_input::reg_status, RT_input::reg_theta, RT_input::reg_tim, reg_yr, reggraph, regmode, REGMODE_3D_ESTIM, regtime, root, RT_input::root_prefix, RT_MP_DEF_PORT, RT_input::sbr, RT_input::sess, RT_input::sess_num, AFNI_view_info::sess_num, SHORT_DELAY, THD_sessionlist::ssar, AFNI_library_type::sslist, RT_input::swap_on_read, RT_input::tpattern, RT_input::tr, verbose, Three_D_View::vinfo, VMCHECK, RT_input::xcen, RT_input::xxdcode, RT_input::xxfov, RT_input::xxoff, RT_input::xxorg, RT_input::ycen, RT_input::yydcode, RT_input::yyfov, RT_input::yyoff, RT_input::yyorg, RT_input::zcen, RT_input::zgap, RT_input::zorder, ZORDER_ALT, RT_input::zorder_lock, RT_input::zzdcode, RT_input::zzfov, RT_input::zzoff, and RT_input::zzorg.

Referenced by RT_worker().

01268 {
01269    RT_input *rtin ;
01270    int ii , cc ;
01271    Three_D_View *im3d ;
01272 
01273    if( ioc_data == NULL ){ /*** THE OLD WAY: get info from control channel ***/
01274 
01275      int ncon ;
01276      char *con , *ptr ;
01277 
01278      /** wait until data can be read, or something terrible happens **/
01279 
01280      if( iochan_readcheck(ioc_control,-1) <= 0 ){
01281         fprintf(stderr,"RT: control stream fails readcheck!\a\n") ;
01282         return NULL ;
01283      }
01284 
01285      /** make new structure **/
01286 
01287      rtin = (RT_input *) calloc( 1 , sizeof(RT_input) ) ;
01288      con  = (char *)     malloc( INFO_SIZE ) ;
01289 
01290      if( rtin == NULL || con == NULL ){
01291        fprintf(stderr,"RT: malloc fails in new_RT_input!\a\n") ; EXIT(1) ;
01292      }
01293 
01294      /** read all data possible from control channel **/
01295 
01296      ncon = 0 ;  /* read all data possible from the control channel */
01297      while(1){
01298         ii = iochan_recv( ioc_control , con+ncon , INFO_SIZE-ncon ) ;
01299         if( ii < 1 ) break ;
01300         ncon += ii ;
01301         if( ncon >= INFO_SIZE ){
01302            fprintf(stderr,"RT: control stream buffer overflow!\a\n") ;
01303            break ;
01304         }
01305         iochan_sleep( SHORT_DELAY ) ;
01306      }
01307 
01308      if( ncon < 1 ){
01309         fprintf(stderr,"RT: control stream sends no data!\a\n") ;
01310         free(rtin) ; free(con) ; return NULL ;
01311      }
01312 
01313      /** The data we now have in 'con' should be of the form
01314             image_channel_spec\n
01315             info_command\n\0
01316          where 'image_channel_spec' is an IOCHAN specifier saying
01317            how AFNI should read the image data
01318          and 'info_command' is the name of a command to run that
01319            will write the dataset control info to stdout (where
01320            a child of AFNI will get it using the 'popen' routine).
01321            If no 'info_command' is needed (all the dataset info will
01322            come thru on the image channel), then the info_command
01323            should just be skipped.
01324          Each string should be less than NNAME characters long!
01325      **/
01326 
01327      ncon = MIN( ncon , INFO_SIZE-2 ) ;
01328      con[ncon+1] = '\0' ;               /* make sure it is NUL terminated */
01329 
01330      /** copy first string -- this is image_channel_spec **/
01331 
01332      ii = 0 ;
01333      for( ptr=con ; ii < NNAME && *ptr != '\0' && *ptr != '\n' ; ptr++ ){
01334         rtin->name_data[ii++] = *ptr ;
01335      }
01336      if( ii >= NNAME ){
01337         fprintf(stderr,"RT: control image_channel_spec buffer overflow!\a\n") ;
01338         ii = NNAME - 1 ;
01339      }
01340      rtin->name_data[ii] = '\0' ;
01341 
01342      /** open data channel **/
01343 
01344      rtin->ioc_data = iochan_init( rtin->name_data , "accept" ) ;
01345      if( rtin->ioc_data == NULL ){
01346         fprintf(stderr,"RT: failure to open data IOCHAN %s\a\n",rtin->name_data) ;
01347         free(rtin) ; free(con) ; return NULL ;
01348      }
01349 
01350      if( verbose == 2 )
01351         fprintf(stderr,"RT: opened data stream %s\n",rtin->name_data) ;
01352      VMCHECK ;
01353 
01354      /** if more follows, that is a command for a child process
01355          (which will not be started until the first image data arrives) **/
01356 
01357      ii = 0 ;
01358      if( *ptr != '\0' ){
01359         for( ptr++ ; ii < NNAME && *ptr != '\0' && *ptr != '\n' ; ptr++ ){
01360            rtin->name_info[ii++] = *ptr ;
01361         }
01362         if( ii >= NNAME ){
01363            fprintf(stderr,"RT: control info_command buffer overflow!\a\n") ;
01364            ii = NNAME - 1 ;
01365         }
01366      }
01367      rtin->name_info[ii] = '\0' ;
01368 
01369      if( verbose == 2 ){
01370         if( strlen(rtin->name_info) > 0 )
01371            fprintf(stderr,"RT: info command for child will be '%s'\n",rtin->name_info) ;
01372         else
01373            fprintf(stderr,"RT: no info command given.\n") ;
01374      }
01375 
01376      free(con) ;
01377      VMCHECK ;
01378 
01379      /** the command (if any) will be run later **/
01380 
01381    } else {  /*** THE NEW WAY: directly connect to ioc_data channel [10 DEC 2002] ***/
01382 
01383      /** make new structure **/
01384 
01385      rtin = (RT_input *) calloc( 1 , sizeof(RT_input) ) ;
01386      if( rtin == NULL ){
01387        fprintf(stderr,"RT: malloc fails in new_RT_input!\a\n") ; EXIT(1) ;
01388      }
01389 
01390      MCW_strncpy( rtin->name_data , ioc_data->name , NNAME ) ;  /* not really needed */
01391      rtin->ioc_data     = ioc_data ;
01392      rtin->name_info[0] = '\0' ;                                /* no child */
01393 
01394    } /*** end of THE NEW WAY of starting up ***/
01395 
01396    rtin->ioc_info   = NULL ;
01397    rtin->child_info = 0 ;
01398 
01399    /** wait until the data channel is good **/
01400 
01401    if( verbose )
01402       fprintf(stderr,"RT: waiting for data stream to become good.\n") ;
01403    VMCHECK ;
01404 
01405    while(1){
01406       ii = iochan_goodcheck(rtin->ioc_data,1000) ;             /* wait up to 1000 msec */
01407            if( ii >  0 )                 break ;               /* is good! */
01408       else if( ii == 0 && verbose == 2 ) fprintf(stderr,".") ; /* not good yet */
01409       else {                                                   /* is bad! */
01410          fprintf(stderr,"RT: data stream fails to become good!\a\n") ;
01411          IOCHAN_CLOSENOW(rtin->ioc_data) ; free(rtin) ;
01412          return NULL ;
01413       }
01414    }
01415 
01416    if( verbose == 2 )
01417       fprintf(stderr,"RT: data stream is now bodaciously good.\n") ;
01418    VMCHECK ;
01419 
01420    /** initialize internal constants in the struct **/
01421 
01422    rtin->info_ok = 0 ; rtin->no_data = 1 ;
01423 
01424    rtin->image_mode   = image_mode ;  /* 28 Apr 2000 */
01425    rtin->image_handle = NULL ;
01426    rtin->image_space  = NULL ;
01427 
01428 #if 0                               /*** THE VERY OLD WAY to set things up ***/
01429    rtin->nxx = DEFAULT_XYMATRIX ;
01430    rtin->nyy = DEFAULT_XYMATRIX ;
01431    rtin->nzz = DEFAULT_ZNUM ;
01432 
01433    rtin->orcxx = ORI_S2I_TYPE ;
01434    rtin->orcyy = ORI_A2P_TYPE ;
01435    rtin->orczz = ORI_L2R_TYPE ;
01436 
01437    rtin->xxfov = DEFAULT_XYFOV ;
01438    rtin->yyfov = DEFAULT_XYFOV ;
01439    rtin->zzfov = -1.0 ;
01440    rtin->dxx   = DEFAULT_XYFOV / DEFAULT_XYMATRIX ;
01441    rtin->dyy   = DEFAULT_XYFOV / DEFAULT_XYMATRIX ;
01442    rtin->dzz   = DEFAULT_ZDELTA ;
01443 
01444    rtin->zgap  = 0.0 ;                  /* 18 Dec 2002 */
01445    rtin->xxoff = rtin->yyoff = rtin->zzoff = 0.0 ;
01446 
01447    rtin->xxorg = 0.5 * (rtin->nxx - 1) * rtin->dxx ; rtin->xcen = 1 ;
01448    rtin->yyorg = 0.5 * (rtin->nyy - 1) * rtin->dyy ; rtin->ycen = 1 ;
01449    rtin->zzorg = 0.5 * (rtin->nzz - 1) * rtin->dzz ; rtin->zcen = 1 ;
01450    rtin->xxdcode = ILLEGAL_TYPE ;
01451    rtin->yydcode = ILLEGAL_TYPE ;
01452    rtin->zzdcode = ILLEGAL_TYPE ;
01453 
01454    rtin->tr     = DEFAULT_TR ;
01455    rtin->nr     = 1 ;
01456    rtin->dtype  = DTYPE_2DZT ;
01457    rtin->datum  = MRI_short  ;
01458 
01459    rtin->zorder      = ZORDER_ALT ;
01460    rtin->zorder_lock = 0 ;              /* 22 Feb 1999 */
01461 #else
01462    rtin->nxx = -1 ;
01463    rtin->nyy = -1 ;
01464    rtin->nzz = -1 ;
01465 
01466    rtin->orcxx = -1 ;
01467    rtin->orcyy = -1 ;
01468    rtin->orczz = -1 ;
01469 
01470    rtin->xxfov = 0.0 ;
01471    rtin->yyfov = 0.0 ;
01472    rtin->zzfov = 0.0 ;
01473    rtin->dxx   = 0.0 ;
01474    rtin->dyy   = 0.0 ;
01475    rtin->dzz   = 0.0 ;
01476 
01477    rtin->zgap  = 0.0 ;                  /* 18 Dec 2002 */
01478    rtin->xxoff = rtin->yyoff = rtin->zzoff = 0.0 ;
01479 
01480    rtin->xxorg = 0.0 ; rtin->xcen = 1 ; rtin->xxdcode = ILLEGAL_TYPE ;
01481    rtin->yyorg = 0.0 ; rtin->ycen = 1 ; rtin->yydcode = ILLEGAL_TYPE ;
01482    rtin->zzorg = 0.0 ; rtin->zcen = 1 ; rtin->zzdcode = ILLEGAL_TYPE ;
01483 
01484    rtin->tr     = DEFAULT_TR ;
01485    rtin->nr     = 1 ;
01486    rtin->dtype  = DTYPE_2DZT ;
01487    rtin->datum  = MRI_short  ;
01488    rtin->nzseq  = 0 ;
01489 
01490    rtin->zorder      = ZORDER_ALT ;
01491    rtin->zorder_lock = 0 ;              /* 22 Feb 1999 */
01492    rtin->tpattern    = ZORDER_ALT ;     /* 10 May 2005 [rickr] */
01493 #endif
01494 
01495    rtin->swap_on_read = 0 ;  /* wait for BYTEORDER     26 Jun 2003 [rickr] */
01496 
01497    rtin->nbuf   = 0    ;     /* no input buffer data yet */
01498    rtin->imsize = 0 ;        /* don't know how many bytes/image yet */
01499    rtin->bufar  = NULL ;     /* no input image buffer yet */
01500 
01501    im3d = plint->im3d ;                           /* default controller */
01502    if( !IM3D_OPEN(im3d) )                         /* may not be open */
01503       im3d = AFNI_find_open_controller() ;
01504 
01505    /** 01 Aug 2002: initialize dataset dependent items */
01506 
01507    for( cc=0 ; cc < MAX_CHAN ; cc++ ){
01508       rtin->afni_status[cc] = 0 ;      /* AFNI is ignorant of the dataset */
01509       rtin->dset[cc]        = NULL ;   /* no dataset yet */
01510       rtin->sbr[cc]         = NULL ;   /* no brick space yet */
01511       rtin->im[cc]          = NULL ;
01512       rtin->nvol[cc]        = 0 ;
01513       rtin->nsl[cc]         = 0 ;
01514       rtin->im3d[cc]        = im3d ;
01515       rtin->sess[cc]        = GLOBAL_library.sslist->ssar[im3d->vinfo->sess_num] ;
01516       rtin->sess_num[cc]    = im3d->vinfo->sess_num ;
01517    }
01518 
01519    rtin->num_chan = 1 ;   /* default number of channels */
01520    rtin->cur_chan = 0 ;   /* current channel index */
01521 
01522    strcpy( rtin->root_prefix , root ) ;
01523 
01524    /** setup realtime function evaluation **/
01525 
01526    rtin->func_dset   = NULL ;  /* no function yet (if ever) */
01527    rtin->func_status = 0 ;     /* AFNI is ignorant */
01528    rtin->func_condit = 0 ;     /* no condition yet */
01529 
01530    /* function evaluation is not done on time-independent datasets */
01531 
01532    rtin->func_code   = (rtin->dtype == DTYPE_2DZ || rtin->dtype == DTYPE_3D)
01533                        ? FUNC_NONE : func_code ;
01534 
01535    rtin->func_func   = FUNC_funcs[rtin->func_code] ; /* where to evaluate */
01536 
01537 #ifdef ALLOW_REGISTRATION
01538    rtin->reg_base_index = regtime ;  /* save these now, in case the evil */
01539    rtin->reg_mode       = regmode ;  /* user changes them on the fly!    */
01540    rtin->reg_dset       = NULL ;
01541    rtin->reg_2dbasis    = NULL ;
01542    rtin->reg_status     = 0 ;        /* AFNI knows nothing. NOTHING.     */
01543    rtin->reg_nvol       = 0 ;        /* number volumes registered so far */
01544 
01545    rtin->reg_nest  = 0 ;
01546    rtin->reg_tim   = (float *) malloc( sizeof(float) ) ;
01547    rtin->reg_dx    = (float *) malloc( sizeof(float) ) ;
01548    rtin->reg_dy    = (float *) malloc( sizeof(float) ) ;
01549    rtin->reg_phi   = (float *) malloc( sizeof(float) ) ;
01550 
01551    rtin->reg_dz       = (float *) malloc( sizeof(float) ) ;
01552    rtin->reg_theta    = (float *) malloc( sizeof(float) ) ;
01553    rtin->reg_psi      = (float *) malloc( sizeof(float) ) ;
01554    rtin->reg_rep      = (float *) malloc( sizeof(float) ) ;
01555    rtin->reg_eval     = (float *) malloc( sizeof(float) ) ;
01556    rtin->reg_3dbasis  = NULL ;
01557    rtin->mp           = NULL ;    /* no plot yet */
01558 
01559    rtin->reg_graph_xnew = 0 ;     /* did the user update reg_graph_xr */
01560    rtin->reg_graph_ynew = 0 ;     /* did the user update reg_graph_yr */
01561    rtin->reg_graph_xr = reg_nr ;  /* will scale by TR when we know it */
01562    rtin->reg_graph_yr = reg_yr ;
01563 
01564    rtin->p_code = NULL ;          /* init parser code    12 Feb 2004 [rickr] */
01565 
01566    rtin->mp_tcp_use = 0 ;         /* tcp motion param    30 Mar 2004 [rickr] */
01567    rtin->mp_tcp_sd  = 0 ;
01568    rtin->mp_port    = RT_MP_DEF_PORT ;
01569    rtin->mp_nmsg    = 0 ;
01570    rtin->mp_npsets  = 0 ;
01571    strcpy(rtin->mp_host, "localhost") ;
01572 
01573    rtin->reg_resam = REG_resam_ints[reg_resam] ;
01574    if( rtin->reg_resam < 0 ){                    /* 20 Nov 1998: */
01575       rtin->reg_resam       = MRI_HEPTIC ;       /* special case */
01576       rtin->reg_final_resam = MRI_FOURIER ;
01577    } else {
01578       rtin->reg_final_resam = -1 ;
01579    }
01580 
01581    rtin->reg_graph = reggraph ;
01582    if( regmode==REGMODE_3D_ESTIM && reggraph==0 ) rtin->reg_graph = 1;
01583 #endif
01584 
01585    /** record the times for later reportage **/
01586 
01587    rtin->elapsed = PLUTO_elapsed_time() ; rtin->last_elapsed = rtin->elapsed ;
01588    rtin->cpu     = PLUTO_cpu_time() ;     rtin->last_nvol = 0 ;
01589 
01590    rtin->num_note = 0 ;      /* 01 Oct 2002: notes list */
01591    rtin->note     = NULL ;
01592 
01593    rtin->marked_for_death = 0 ;  /* 10 Dec 2002 */
01594 
01595    return rtin ;
01596 }

PLUGIN_interface* PLUGIN_init int    ncall
 

Definition at line 484 of file plug_realtime.c.

References ALLOW_real_time, func_code, FUNC_strings, getenv(), GRAPH_strings, helpstring, image_mode, malloc, MCW_strncpy, NFUNC, NGRAPH, NREG, NRESAM, NVERB, NYESNO, plint, PLUTO_add_hint(), PLUTO_register_timeout(), PLUTO_register_workproc(), PLUTO_set_butcolor(), PLUTO_set_runlabels(), PLUTO_set_sequence(), PLUTO_string_index(), reg_nr, reg_resam, REG_resam_strings, REG_strings, REG_strings_ENV, reg_yr, reggraph, regmode, regtime, root, RT_main(), RT_startup(), RT_worker(), strtod(), THD_filename_pure(), THD_MAX_PREFIX, update, VERB_strings, and verbose.

00485 {
00486    char * ept ; /* 09 Oct 2000 */
00487 
00488    if( ncall > 0 )         return NULL ;  /* only one interface */
00489    if( ! ALLOW_real_time ) return NULL ;  /* do nothing if not allowed */
00490 
00491    /*-- set titles and call point --*/
00492 
00493    plint = PLUTO_new_interface( "RT Options" , "Set Real-Time Acquisition Options" ,
00494                                 helpstring , PLUGIN_CALL_VIA_MENU , RT_main  ) ;
00495 
00496    PLUTO_add_hint( plint , "Set Real-Time Acquisition Options" ) ;
00497 
00498    PLUTO_set_sequence( plint , "A:AArealtime" ) ;
00499    PLUTO_set_butcolor( plint , "hot" ) ;
00500 
00501    PLUTO_set_runlabels( plint , "Set+Keep" , "Set+Close" ) ;  /* 04 Nov 2003 */
00502 
00503    /*-- 28 Apr 2000: Images Only mode --*/
00504 
00505    ept = getenv("AFNI_REALTIME_Images_Only") ;  /* 09 Oct 2000 */
00506    if( ept != NULL ){
00507       int ii = PLUTO_string_index( ept , NYESNO , VERB_strings ) ;
00508       if( ii >= 0 && ii < NYESNO ) image_mode = ii ;
00509    }
00510 
00511    PLUTO_add_option( plint , "" , "Mode" , FALSE ) ;
00512    PLUTO_add_string( plint , "Images Only" , NYESNO,VERB_strings,image_mode ) ;
00513 
00514    /*-- next line of input: Prefix for output dataset --*/
00515 
00516    ept = getenv("AFNI_REALTIME_Root") ;        /* 09 Oct 2000 */
00517    if( !THD_filename_pure(ept) ) ept = NULL ;
00518    if( ept != NULL ) MCW_strncpy(root,ept,THD_MAX_PREFIX) ;
00519 
00520    PLUTO_add_option( plint , "" , "Root" , FALSE ) ;
00521    PLUTO_add_string( plint , "Root" , 0, (ept!=NULL) ? &ept : NULL , 19 ) ;
00522 
00523    /*-- next line of input: Update frequency --*/
00524 
00525    ept = getenv("AFNI_REALTIME_Update") ;      /* 09 Oct 2000 */
00526    if( ept != NULL ){
00527       int ii = (int) rint(strtod(ept,NULL)) ;
00528       if( ii >= 0 && ii <= 19 ) update = ii ;
00529    }
00530 
00531    PLUTO_add_option( plint , "" , "Update" , FALSE ) ;
00532    PLUTO_add_number( plint , "Update" , 0,19,0 , update , FALSE ) ;
00533 
00534    /*-- next line of input: Function computation --*/
00535 
00536    ept = getenv("AFNI_REALTIME_Function") ;   /* 09 Oct 2000 */
00537    if( ept != NULL ){
00538       int ii = PLUTO_string_index( ept , NFUNC , FUNC_strings ) ;
00539       if( ii >= 0 && ii < NFUNC ) func_code = ii ;
00540    }
00541 
00542    PLUTO_add_option( plint , "" , "Function" , FALSE ) ;
00543    PLUTO_add_string( plint , "Function" , NFUNC , FUNC_strings , func_code ) ;
00544 
00545    /*-- next line of input: Verbosity flag --*/
00546 
00547    ept = getenv("AFNI_REALTIME_Verbose") ;   /* 09 Oct 2000 */
00548    if( ept != NULL ){
00549       int ii = PLUTO_string_index( ept , NVERB , VERB_strings ) ;
00550       if( ii >= 0 && ii < NVERB ) verbose = ii ;
00551    }
00552 
00553    PLUTO_add_option( plint , "" , "Verbose" , FALSE ) ;
00554    PLUTO_add_string( plint , "Verbose" , NVERB , VERB_strings , verbose ) ;
00555 
00556 #ifdef ALLOW_REGISTRATION
00557    /*-- next line of input: registration mode --*/
00558 
00559    ept = getenv("AFNI_REALTIME_Registration") ;  /* 09 Oct 2000 */
00560    if( ept != NULL ){
00561       int ii = PLUTO_string_index( ept , NREG , REG_strings ) ;
00562       /* on failure, try alternate forms               17 May 2005 [rickr] */
00563       if ( ii < 0 ) ii = PLUTO_string_index( ept , NREG , REG_strings_ENV ) ;
00564       if( ii >= 0 && ii < NREG ) regmode = ii ;
00565    }
00566 
00567    ept = getenv("AFNI_REALTIME_Base_Image") ;     /* 09 Oct 2000 */
00568    if( ept != NULL ){
00569       int ii = (int) rint(strtod(ept,NULL)) ;
00570       if( ii >= 0 && ii <= 59 ) regtime = ii ;
00571    }
00572 
00573    ept = getenv("AFNI_REALTIME_Resampling") ;    /* 09 Oct 2000 */
00574    if( ept != NULL ){
00575       int ii = PLUTO_string_index( ept , NRESAM , REG_resam_strings ) ;
00576       if( ii >= 0 && ii < NRESAM ) reg_resam = ii ;
00577    }
00578 
00579    PLUTO_add_option( plint , "" , "Registration" , FALSE ) ;
00580    PLUTO_add_string( plint , "Registration" , NREG , REG_strings , regmode ) ;
00581    PLUTO_add_number( plint , "Base Image" , 0,59,0 , regtime , FALSE ) ;
00582    PLUTO_add_string( plint , "Resampling" , NRESAM , REG_resam_strings , reg_resam ) ;
00583 
00584    /*-- next line of input: registration graphing --*/
00585 
00586    ept = getenv("AFNI_REALTIME_Graph")  ;  /* 09 Oct 2000 */
00587    if( ept != NULL ){
00588       int ii = PLUTO_string_index( ept , NGRAPH , GRAPH_strings ) ;
00589       if( ii >= 0 && ii < NGRAPH ) reggraph = ii ;
00590    }
00591 
00592    ept = getenv("AFNI_REALTIME_NR") ;     /* 09 Oct 2000 */
00593    if( ept != NULL ){
00594       int ii = (int) rint(strtod(ept,NULL)) ;
00595       if( ii >= 5 && ii <= 9999 ) reg_nr = ii ;
00596    }
00597 
00598    ept = getenv("AFNI_REALTIME_YR") ;     /* 09 Oct 2000 */
00599    if( ept != NULL ){
00600       float ff = strtod(ept,NULL) ;
00601       if( ff > 0.0 ) reg_yr = ff ;
00602    }
00603 
00604    PLUTO_add_option( plint , "" , "Graphing" , FALSE ) ;
00605    PLUTO_add_string( plint , "Graph" , NGRAPH , GRAPH_strings , reggraph ) ;
00606    PLUTO_add_number( plint , "NR [x-axis]" , 5,9999,0 , reg_nr , TRUE ) ;
00607    PLUTO_add_number( plint , "YR [y-axis]" , 1,100,1 , (int)(reg_yr*10.0) , TRUE ) ;
00608 #endif
00609 
00610    /***** Register a work process *****/
00611 
00612 #ifndef USE_RT_STARTUP
00613    PLUTO_register_workproc( RT_worker , NULL ) ;
00614 #else
00615    PLUTO_register_timeout( 1954 , RT_startup , NULL ) ;
00616 #endif
00617 
00618    /***** 12 Oct 2000: set the graphing geometry, if any *****/
00619 
00620    ept = getenv("AFNI_REALTIME_volreg_graphgeom") ;
00621    if( ept != NULL ){
00622       char *str = malloc(strlen(ept)+20) ;
00623       sprintf(str,"AFNI_tsplotgeom=%s",ept) ;
00624       putenv(str) ;
00625    }
00626 
00627    /***** go home to mama (i.e., AFNI) *****/
00628 
00629    ALLOW_real_time = 1 ;  /* flag to AFNI that realtime work is started */
00630    return plint ;
00631 }

int RT_acquire_info char *    command
 

I'm the child *

Definition at line 1652 of file plug_realtime.c.

References free, INFO_SIZE, iochan_clearcheck(), IOCHAN_CLOSENOW, iochan_init(), iochan_sendall(), iochan_sleep(), iochan_writecheck(), LONG_DELAY, malloc, pclose, popen, and SHM_CHILD.

Referenced by RT_start_child().

01653 {
01654    FILE * fp ;
01655    char * info = (char *) malloc( sizeof(char) * INFO_SIZE ) ; int ninfo = 0 ;
01656    IOCHAN * ioc ;
01657    int jj ;
01658 
01659    /** create channel back to parent **/
01660 
01661    ioc = iochan_init( SHM_CHILD , "create" ) ;
01662    if( ioc == NULL ){
01663       fprintf(stderr,"RT: child fails to open stream back to parent!\a\n") ;
01664       _exit(1) ;
01665    }
01666 
01667    /** run command, read its output into this pipe **/
01668 
01669    fp = popen( command , "r" ) ;
01670    if( fp == NULL ){
01671       fprintf(stderr,"RT: child fails to open pipe to command=%s\a\n",command) ;
01672       IOCHAN_CLOSENOW(ioc) ; _exit(1) ;
01673    }
01674 
01675    /** read pipe until nothing more **/
01676 
01677    while( fgets(info+ninfo,INFO_SIZE-ninfo,fp) != NULL ){
01678       ninfo = strlen(info) ;
01679    }
01680    pclose(fp) ;
01681 
01682    /** send output back to parent **/
01683 
01684    jj = iochan_writecheck(ioc,-1) ;  /* wait until ready */
01685    if( jj < 0 ){
01686       fprintf(stderr,"RT: child can't write IOCHAN to parent!\a\n") ;
01687       IOCHAN_CLOSENOW(ioc) ; _exit(1) ;
01688    }
01689 
01690    iochan_sendall( ioc , info , ninfo+1 ) ;        /* include the NUL character */
01691    iochan_sleep(LONG_DELAY) ;                      /* wait a bit */
01692    while( ! iochan_clearcheck(ioc,LONG_DELAY) )    /* loop until cleared */
01693       iochan_sleep(LONG_DELAY) ;
01694 
01695    iochan_sleep(LONG_DELAY) ;                      /* once more, just for luck */
01696 
01697                                                    /**************************/
01698    free(info); IOCHAN_CLOSENOW(ioc); _exit(0);     /** END OF CHILD PROCESS **/
01699 }                                                  /**************************/

void RT_check_info RT_input  ,
int   
 

Definition at line 1710 of file plug_realtime.c.

References AFNI_GOOD_DTYPE, RT_input::datum, RT_input::dtype, RT_input::dzz, EPR, RT_input::image_mode, RT_input::info_ok, RT_input::nxx, RT_input::nyy, RT_input::nzz, OR3OK, RT_input::orcxx, RT_input::orcyy, RT_input::orczz, RT_input::root_prefix, THD_filename_pure(), THD_MAX_PREFIX, RT_input::tpattern, RT_input::tr, RT_input::xxfov, RT_input::yyfov, RT_input::zorder, and RT_input::zzfov.

Referenced by RT_process_info(), and RT_worker().

01711 {
01712    if( rtin == NULL ) return ;
01713 
01714    /*-- 28 Apr 2000: if in Image Only mode, do fewer checks --*/
01715 
01716    if( rtin->image_mode ){
01717 
01718       rtin->info_ok = ( rtin->nxx > 1 )                         &&
01719                       ( rtin->nyy > 1 )                         &&
01720                       ( AFNI_GOOD_DTYPE(rtin->datum) ) ;
01721 
01722       if( rtin->info_ok || !prt ) return ;  /* if good, or if no print */
01723 
01724       if( !(rtin->nxx > 1)                ) EPR("Image x-dimen not > 1") ;
01725       if( !(rtin->nyy > 1)                ) EPR("Image y-dimen not > 1") ;
01726       if( !(AFNI_GOOD_DTYPE(rtin->datum)) ) EPR("Bad datum") ;
01727       return ;
01728    }
01729 
01730    /*-- below here: must construct dataset, so do all necessary checks --*/
01731 
01732    rtin->info_ok = ( rtin->dtype > 0 )                            &&
01733                    ( THD_filename_pure(rtin->root_prefix) )       &&
01734                    ( strlen(rtin->root_prefix) < THD_MAX_PREFIX ) &&
01735                    ( rtin->tr > 0 )                               &&
01736                    ( rtin->dzz > 0 || rtin->zzfov > 0 )           &&
01737                    ( rtin->xxfov > 0 )                            &&
01738                    ( rtin->yyfov > 0 )                            &&
01739                    ( rtin->nxx > 1 )                              &&
01740                    ( rtin->nyy > 1 )                              &&
01741                    ( rtin->nzz >= 1 )                             &&
01742                    ( AFNI_GOOD_DTYPE(rtin->datum) )               &&
01743                    ( rtin->zorder > 0 )                           &&
01744                    ( rtin->tpattern > 0 )                         &&
01745                    ( rtin->orcxx >= 0 )                           &&
01746                    ( rtin->orcyy >= 0 )                           &&
01747                    ( rtin->orczz >= 0 )                           &&
01748                    ( OR3OK(rtin->orcxx,rtin->orcyy,rtin->orczz) )    ;
01749 
01750    if( rtin->info_ok || !prt ) return ;  /* if good, or if no print */
01751 
01752    /* print error messages */
01753 
01754    if( !(rtin->dtype > 0)                            ) EPR("Bad acquisition type") ;
01755    if( !(THD_filename_pure(rtin->root_prefix))       ) EPR("Bad prefix") ;
01756    if( !(strlen(rtin->root_prefix) < THD_MAX_PREFIX) ) EPR("Overlong prefix") ;
01757    if( !(rtin->tr > 0)                               ) EPR("TR is not positive") ;
01758    if( !(rtin->dzz > 0 || rtin->zzfov > 0)           ) EPR("Slice thickness not positive") ;
01759    if( !(rtin->xxfov > 0)                            ) EPR("x-FOV not positive") ;
01760    if( !(rtin->yyfov > 0)                            ) EPR("y-FOV not positive") ;
01761    if( !(rtin->nxx > 1)                              ) EPR("Image x-dimen not > 1") ;
01762    if( !(rtin->nyy > 1)                              ) EPR("Image y-dimen not > 1") ;
01763    if( !(rtin->nzz >= 1)                             ) EPR("Slice count (z-dimen) not >= 1") ;
01764    if( !(AFNI_GOOD_DTYPE(rtin->datum))               ) EPR("Bad datum") ;
01765    if( !(rtin->zorder > 0)                           ) EPR("Slice ordering illegal") ;
01766    if( !(rtin->tpattern > 0)                         ) EPR("Timing pattern illegal") ;
01767    if( !(rtin->orcxx >= 0)                           ) EPR("x-orientation illegal") ;
01768    if( !(rtin->orcyy >= 0)                           ) EPR("y-orientation illegal") ;
01769    if( !(rtin->orczz >= 0)                           ) EPR("z-orientation illegal") ;
01770    if( !(OR3OK(rtin->orcxx,rtin->orcyy,rtin->orczz)) ) EPR("Inconsistent xyz-orientations") ;
01771 
01772    return ;
01773 }

int RT_check_listen void   
 

How the hell did this happen? *

Definition at line 748 of file plug_realtime.c.

References IOCHAN_CLOSENOW, iochan_goodcheck(), iochan_init(), iochan_readcheck(), IOCHAN::name, SHORT_DELAY, TCP_CONTROL, TRUST_host(), and verbose.

Referenced by RT_worker().

00749 {
00750    int jj ;
00751    static int newcon = 1 ;
00752 
00753    /** see if we need to start listening **/
00754 
00755    if( ioc_control == NULL ){
00756       if( verbose )
00757          fprintf(stderr,"RT: starting to listen for control stream.\n") ;
00758       ioc_control = iochan_init( TCP_CONTROL , "accept" ) ;
00759       newcon      = 1 ;
00760       if( ioc_control == NULL ){
00761          fprintf(stderr,"RT: can't listen for control stream\a\n") ;
00762          return -1 ;
00763       }
00764    }
00765 
00766    /** Check if the network channel is active **/
00767 
00768    jj = iochan_goodcheck(ioc_control,SHORT_DELAY) ;
00769 
00770    if( jj == 1 ){  /* external connection! */
00771 
00772       if( newcon ){
00773          fprintf(stderr,"RT:---------------------------------------\n") ;
00774          fprintf(stderr,"RT: connected to control stream %s\n",ioc_control->name) ;
00775          newcon = 0 ;
00776       } else {
00777 /**
00778          if( verbose == 2 )
00779             fprintf(stderr,"RT: still waiting for control data.\n") ;
00780 **/
00781       }
00782 
00783       if( ! TRUST_host(ioc_control->name) ){
00784          fprintf(stderr,"RT: untrusted host connection - closing!\a\n") ;
00785          IOCHAN_CLOSENOW(ioc_control) ;
00786          return 0 ;
00787       }
00788 
00789       jj = iochan_readcheck(ioc_control,0) ;  /* is something ready to read? */
00790 
00791       if( jj > 0 && verbose == 2 ) fprintf(stderr,"RT: control data is present!\n") ;
00792 
00793       return jj ;
00794 
00795    } else if( jj == -1 ){  /* something bad! */
00796 
00797       fprintf(stderr,"RT: failure while listening for control stream!\a\n") ;
00798       IOCHAN_CLOSENOW(ioc_control) ;
00799       return 0 ;
00800    }
00801 
00802    return 0 ;  /* no external connection yet */
00803 }

int RT_fim_recurse RT_input  ,
int   
 

Definition at line 4544 of file plug_realtime.c.

References abs, ADN_brick_fac, ADN_datum_all, ADN_func_type, ADN_malloc_type, ADN_none, ADN_ntt, ADN_nvals, ADN_prefix, ADN_stat_aux, ADN_type, AFNI_GOOD_FUNC_DTYPE, DATABLOCK_MEM_MALLOC, THD_3dim_dataset::dblk, THD_diskptr::dimsizes, THD_datablock::diskptr, RT_input::dset, DSET_ARRAY, DSET_BRICK, DSET_BRICK_BYTES, DSET_BRICK_TYPE, DSET_lock, DSET_NVALS, DSET_PREFIX, EDIT_BRICK_LABEL, EDIT_dset_items(), EDIT_empty_copy(), EXIT, Three_D_View::fimdata, AFNI_fimmer_type::fimort, AFNI_fimmer_type::fimref, FINAL_MODE, free_PCOR_references(), free_PCOR_voxel_corr(), RT_input::func_condit, FUNC_COR_SCALE_SHORT, RT_input::func_dset, GEN_FUNC_TYPE, HEAD_FUNC_TYPE, IFree, RT_input::im3d, AFNI_fimmer_type::init_ignore, INIT_MODE, ISHEAD, malloc, MAX, MAX_STAT_AUX, MCW_strncpy, MIN_UPDT, mri_fix_data_pointer(), MRI_FLOAT_PTR, new_PCOR_references(), new_PCOR_voxel_corr(), THD_datablock::nvals, MRI_IMAGE::nx, MRI_IMAGE::ny, PCOR_get_coef(), PCOR_get_pcor(), PCOR_update_float(), PLUTO_prefix_ok(), AFNI_fimmer_type::polort, RT_input::reg_dset, RT_input::reg_mode, REGMODE_2D_RTIME, REGMODE_3D_RTIME, THD_MAX_PREFIX, tross_Append_History(), UPDATE_MODE, update_PCOR_references(), verbose, VMCHECK, and XtRealloc.

04545 {
04546    static Three_D_View * im3d ;
04547    static THD_3dim_dataset * dset_time ;
04548    static MRI_IMAGE * ref_ts ;
04549    static MRI_IMAGE * ort_ts ;
04550 
04551    static THD_3dim_dataset * new_dset ;
04552    static int nvox , ngood_ref , it1 , dtyp , nxyz , nupdt ;
04553    static float * vval=NULL , * aval=NULL , * rbest=NULL , * abest=NULL ;
04554    static int   * indx=NULL ;
04555    static PCOR_references ** pc_ref=NULL ;
04556    static PCOR_voxel_corr ** pc_vc=NULL ;
04557    static int nx_ref , ny_ref ;
04558 
04559    static int fim_nref , nx_ort , ny_ort , internal_ort ;
04560    static float * ortar ;
04561    static float * ref_vec = NULL ;
04562    static int    nref_vec = -666 ;
04563 
04564    static int polort = 1 ;  /* 02 Jun 1999 */
04565 
04566    static char new_prefix[THD_MAX_PREFIX] ;
04567    static char old_prefix[THD_MAX_PREFIX] ;
04568 
04569    static int first_pass = 1;     /* flag for first FIM computation   30 Oct 2003 [rickr] */
04570    int        start_index;        /* in case of loop FIM computation  30 Oct 2003 [rickr] */
04571 
04572    int ifim, it, iv, ivec, nnow, itbot , ip ;
04573    float fthr , topval , stataux[MAX_STAT_AUX] ;
04574    float * tsar ;
04575    short * bar ;
04576    void  * ptr ;
04577 
04578    char strbuf[128] ;  /* 03 Jun 1999 */
04579 
04580    /******************/
04581    /** sanity check **/
04582 
04583    if( rtin == NULL ) return -1 ;
04584 
04585    /****************************/
04586    /***** initialize stuff *****/
04587 
04588    if( mode == INIT_MODE ){
04589 
04590       dset_time = rtin->dset[0] ;       /* assign dset_time first   30 Oct 2003 [rickr] */
04591 
04592 #ifdef ALLOW_REGISTRATION
04593       /* now check for use of registered dataset                    30 Oct 2003 [rickr] */
04594       if( (rtin->reg_mode == REGMODE_2D_RTIME) || (rtin->reg_mode == REGMODE_3D_RTIME) )
04595          dset_time = rtin->reg_dset;
04596 #endif /* ALLOW_REGISTRATION */
04597 
04598       if( dset_time == NULL ) return -1 ;
04599 
04600       im3d      = rtin->im3d[0] ;         if( im3d      == NULL ) return -1 ;
04601       ref_ts    = im3d->fimdata->fimref ; if( ref_ts    == NULL ) return -1 ;
04602       ort_ts    = im3d->fimdata->fimort ; /* NULL is legal here */
04603       nupdt     = 0 ;                     /* number of updates done yet */
04604 
04605       polort    = im3d->fimdata->polort ; /* 02 Jun 1999 */
04606 
04607       if( ort_ts != NULL ){               /* load some dimensions */
04608          nx_ort = ort_ts->nx ;
04609          ny_ort = ort_ts->ny ;
04610          ortar  = MRI_FLOAT_PTR(ort_ts) ;
04611          internal_ort = 0 ;
04612       } else {
04613          nx_ort = ny_ort = 0 ;
04614          ortar  = NULL ;
04615          internal_ort = 1 ;
04616       }
04617       fim_nref = (internal_ort) ? (polort+2) : (ny_ort+polort+2) ;
04618 
04619       if( nref_vec < fim_nref ){  /* allocate space for ref work vector */
04620           ref_vec = (float *) XtRealloc( (char *)ref_vec, sizeof(float)*fim_nref ) ;
04621          nref_vec = fim_nref ;
04622       }
04623 
04624       itbot     = im3d->fimdata->init_ignore ;  /* certainly don't use these points! */
04625       nx_ref    = ref_ts->nx ;                  /* load dimensions */
04626       ny_ref    = ref_ts->ny ;
04627       ngood_ref =  0 ;
04628       it1       = -1 ;
04629       for( ivec=0 ; ivec < ny_ref ; ivec++ ){           /* scan ref vectors */
04630          tsar = MRI_FLOAT_PTR(ref_ts) + (ivec*nx_ref) ; /* ptr to ivec-th vector */
04631          ifim = 0 ;                                     /* count # good entries */
04632          for( it=itbot ; it < nx_ref ; it++ ){
04633             if( tsar[it] < WAY_BIG ){ ifim++ ; if( it1 < 0 ) it1 = it ; }
04634          }
04635 
04636          if( ifim < MIN_UPDT ){
04637             fprintf(stderr,"RTfim: ideal timeseries has too few good entries!\a\n") ;
04638             return -1 ;
04639          }
04640 
04641          ngood_ref = MAX( ifim , ngood_ref ) ;
04642       }
04643 
04644       /** at this point, ngood_ref = max number of good reference points,
04645           and                  it1 = index of first point used in first reference **/
04646 
04647       dtyp = DSET_BRICK_TYPE(dset_time,0) ;  /* type of each voxel */
04648       if( ! AFNI_GOOD_FUNC_DTYPE(dtyp) ){
04649          fprintf(stderr,"RTfim: input dataset has unsupported datum %s!\a\n",
04650                  MRI_TYPE_name[dtyp] ) ;
04651          return -1 ;
04652       }
04653 
04654       if( nx_ort > 0 && nx_ort < nx_ref ){  /* check for compatibility */
04655          fprintf(stderr,
04656                  "RTfim: WARNING -- ort length=%d  ideal length=%d\n",
04657                  nx_ort , nx_ref ) ;
04658       }
04659 
04660       /*--- Create a new prefix ---*/
04661 
04662       MCW_strncpy( old_prefix , DSET_PREFIX(dset_time) , THD_MAX_PREFIX-3 ) ;
04663 
04664       for( ifim=1 ; ifim < 99 ; ifim++ ){
04665          sprintf( new_prefix , "%s@%d" , old_prefix , ifim ) ;
04666          if( PLUTO_prefix_ok(new_prefix) ) break ;
04667       }
04668       if( ifim == 99 ){
04669          fprintf(stderr,"RTfim: can't create new prefix!\a\n") ;
04670          return -1 ;
04671       }
04672 
04673       nxyz =  dset_time->dblk->diskptr->dimsizes[0]    /* total voxel count */
04674             * dset_time->dblk->diskptr->dimsizes[1]
04675             * dset_time->dblk->diskptr->dimsizes[2] ;
04676 
04677       return 1 ;
04678    }
04679 
04680    /**************************/
04681    /***** finalize stuff *****/
04682 
04683    if( mode == FINAL_MODE ){
04684 
04685       /*--- End of recursive updates; now free temporary workspaces ---*/
04686 
04687       if( pc_ref != NULL ){
04688          for( ivec=0 ; ivec < ny_ref ; ivec++ ){
04689             free_PCOR_references(pc_ref[ivec]) ;
04690             free_PCOR_voxel_corr(pc_vc[ivec]) ;
04691          }
04692       }
04693       IFree(vval) ; IFree(indx)  ; IFree(pc_ref) ; IFree(pc_vc)  ;
04694       IFree(aval) ; IFree(rbest) ; IFree(abest)  ;
04695 
04696       first_pass = 1;                /* reset for future datasets    30 Oct 2003 [rickr] */
04697 
04698       return 1 ;
04699    }
04700 
04701    /*********************************************/
04702    /***** update the dataset under creation *****/
04703 
04704    if( mode == UPDATE_MODE ){
04705 
04706       if( nupdt < MIN_UPDT ) return 1 ;  /* can't do anything yet */
04707 
04708       rtin->func_condit = 2 ;  /* updated at least once */
04709 
04710       /*--- set the statistical parameters ---*/
04711 
04712       stataux[0] = nupdt ;               /* number of points used */
04713       stataux[1] = (ny_ref==1) ? 1 : 2 ; /* number of references  */
04714       stataux[2] = fim_nref - 1 ;        /* number of orts        */
04715       for( iv=3 ; iv < MAX_STAT_AUX ; iv++ ) stataux[iv] = 0.0 ;
04716 
04717       (void) EDIT_dset_items( new_dset, ADN_stat_aux, stataux, ADN_none ) ;
04718 
04719       /*** Compute brick arrays for new dataset ***/
04720 
04721       if( ny_ref == 1 ){
04722 
04723       /*** Just 1 ref vector --> load values directly into dataset ***/
04724 
04725          /*--- get alpha (coef) into vval,
04726                find max value, scale into brick array ---*/
04727 
04728          PCOR_get_coef( pc_ref[0] , pc_vc[0] , vval ) ;
04729 
04730          topval = 0.0 ;
04731          for( iv=0 ; iv < nvox ; iv++ )
04732             if( fabs(vval[iv]) > topval ) topval = fabs(vval[iv]) ;
04733 
04734          bar = DSET_ARRAY( new_dset , FUNC_ival_fim[FUNC_COR_TYPE] ) ;
04735 
04736 #ifdef DONT_USE_MEMCPY
04737          for( iv=0 ; iv < nxyz ; iv++ ) bar[iv] = 0 ;
04738 #else
04739          memset( bar , 0 , sizeof(short)*nxyz ) ;
04740 #endif
04741 
04742          if( topval > 0.0 ){
04743             topval = MRI_TYPE_maxval[MRI_short] / topval ;
04744             for( iv=0 ; iv < nvox ; iv++ )
04745                bar[indx[iv]] = (short)(topval * vval[iv] + 0.499) ;
04746 
04747             stataux[0] = 1.0/topval ;
04748          } else {
04749             stataux[0] = 0.0 ;
04750          }
04751 
04752          /*--- get correlation coefficient (pcor) into vval,
04753                scale into brick array (with fixed scaling factor) ---*/
04754 
04755          PCOR_get_pcor( pc_ref[0] , pc_vc[0] , vval ) ;
04756 
04757          bar = DSET_ARRAY( new_dset , FUNC_ival_thr[FUNC_COR_TYPE] ) ;
04758 
04759 #ifdef DONT_USE_MEMCPY
04760          for( iv=0 ; iv < nxyz ; iv++ ) bar[iv] = 0 ;
04761 #else
04762          memset( bar , 0 , sizeof(short)*nxyz ) ;
04763 #endif
04764 
04765          for( iv=0 ; iv < nvox ; iv++ )
04766             bar[indx[iv]] = (short)(FUNC_COR_SCALE_SHORT * vval[iv] + 0.499) ;
04767 
04768          stataux[1] = 1.0 / FUNC_COR_SCALE_SHORT ;
04769 
04770       } else {
04771 
04772       /*** Multiple references --> find best correlation at each voxel ***/
04773 
04774          /*--- get first ref results into abest and rbest (best so far) ---*/
04775 
04776          PCOR_get_coef( pc_ref[0] , pc_vc[0] , abest ) ;
04777          PCOR_get_pcor( pc_ref[0] , pc_vc[0] , rbest ) ;
04778 
04779          /*--- for each succeeding ref vector,
04780                get results into aval and vval,
04781                if |vval| > |rbest|, then use that result instead ---*/
04782 
04783          for( ivec=1 ; ivec < ny_ref ; ivec++ ){
04784 
04785             PCOR_get_coef( pc_ref[ivec] , pc_vc[ivec] , aval ) ;
04786             PCOR_get_pcor( pc_ref[ivec] , pc_vc[ivec] , vval ) ;
04787 
04788             for( iv=0 ; iv < nvox ; iv++ ){
04789                if( fabs(vval[iv]) > fabs(rbest[iv]) ){
04790                   rbest[iv] = vval[iv] ;
04791                   abest[iv] = aval[iv] ;
04792                }
04793             }
04794          }
04795 
04796          /*--- at this point, abest and rbest are the best
04797                results, so scale them into the dataset bricks ---*/
04798 
04799          topval = 0.0 ;
04800          for( iv=0 ; iv < nvox ; iv++ )
04801             if( fabs(abest[iv]) > topval ) topval = fabs(abest[iv]) ;
04802 
04803          bar = DSET_ARRAY( new_dset , FUNC_ival_fim[FUNC_COR_TYPE] ) ;
04804 
04805 #ifdef DONT_USE_MEMCPY
04806          for( iv=0 ; iv < nxyz ; iv++ ) bar[iv] = 0 ;
04807 #else
04808          memset( bar , 0 , sizeof(short)*nxyz ) ;
04809 #endif
04810 
04811          if( topval > 0.0 ){
04812             topval = MRI_TYPE_maxval[MRI_short] / topval ;
04813             for( iv=0 ; iv < nvox ; iv++ )
04814                bar[indx[iv]] = (short)(topval * abest[iv] + 0.499) ;
04815 
04816             stataux[0] = 1.0/topval ;
04817          } else {
04818             stataux[0] = 0.0 ;
04819          }
04820 
04821          bar = DSET_ARRAY( new_dset , FUNC_ival_thr[FUNC_COR_TYPE] ) ;
04822 
04823 #ifdef DONT_USE_MEMCPY
04824          for( iv=0 ; iv < nxyz ; iv++ ) bar[iv] = 0 ;
04825 #else
04826          memset( bar , 0 , sizeof(short)*nxyz ) ;
04827 #endif
04828 
04829          for( iv=0 ; iv < nvox ; iv++ )
04830             bar[indx[iv]] = (short)(FUNC_COR_SCALE_SHORT * rbest[iv] + 0.499) ;
04831 
04832          stataux[1] = 1.0 / FUNC_COR_SCALE_SHORT ;
04833       }
04834 
04835       /* set scaling factors for each sub-brick */
04836 
04837       (void) EDIT_dset_items( new_dset, ADN_brick_fac, stataux, ADN_none ) ;
04838       return 1 ;
04839    }
04840 
04841    /*********************************************************/
04842    /***** at this point, must process time point # mode *****/
04843 
04844    if( mode < it1 ) return 1 ;  /* nothing to do before first time */
04845 
04846    /*---- at first time, find values above threshold to fim:
04847             find the mean of the first array,
04848             compute the threshold (fthr) from it,
04849             make indx[i] be the 3D index of the i-th voxel above threshold ----*/
04850 
04851    /* be sure dset_time has enough sub-bricks for this time point   30 Oct 2003 [rickr] */
04852    if ( (DSET_NVALS(dset_time) <= mode) || (DSET_ARRAY(dset_time,mode) == NULL) )
04853       return 1;
04854 
04855 #if 0                           /* change to first_pass test */
04856    if( mode == it1 )
04857 #endif
04858 
04859    /* check for first fim computation with this dataset            30 Oct 2003 [rickr] */
04860    if( first_pass == 1 ){
04861 
04862       switch( dtyp ){  /* process each datum type separately */
04863 
04864          case MRI_short:{
04865             short * dar = (short *) DSET_ARRAY(dset_time,it1) ;
04866             for( iv=0,fthr=0.0 ; iv < nxyz ; iv++ ) fthr += abs(dar[iv]) ;
04867             fthr = FIM_THR * fthr / nxyz ;
04868             for( iv=0,nvox=0 ; iv < nxyz ; iv++ )
04869                if( abs(dar[iv]) > fthr ) nvox++ ;
04870             indx = (int *) malloc( sizeof(int) * nvox ) ;
04871             if( indx == NULL ){
04872                fprintf(stderr,"RTfim: indx malloc failure!\a\n") ;
04873                EXIT(1) ;
04874             }
04875             for( iv=0,nvox=0 ; iv < nxyz ; iv++ )
04876                if( abs(dar[iv]) > fthr ) indx[nvox++] = iv ;
04877          }
04878          break ;
04879 
04880          case MRI_float:{
04881             float * dar = (float *) DSET_ARRAY(dset_time,it1) ;
04882             for( iv=0,fthr=0.0 ; iv < nxyz ; iv++ ) fthr += fabs(dar[iv]) ;
04883             fthr = FIM_THR * fthr / nxyz ;
04884             for( iv=0,nvox=0 ; iv < nxyz ; iv++ )
04885                if( fabs(dar[iv]) > fthr ) nvox++ ;
04886             indx = (int *) malloc( sizeof(int) * nvox ) ;
04887             if( indx == NULL ){
04888               fprintf(stderr,"RTfim: indx malloc failure!\a\n") ;
04889               EXIT(1) ;
04890             }
04891             for( iv=0,nvox=0 ; iv < nxyz ; iv++ )
04892                if( fabs(dar[iv]) > fthr ) indx[nvox++] = iv ;
04893          }
04894          break ;
04895 
04896          case MRI_byte:{
04897             byte * dar = (byte *) DSET_ARRAY(dset_time,it1) ;
04898             for( iv=0,fthr=0.0 ; iv < nxyz ; iv++ ) fthr += dar[iv] ;
04899             fthr = FIM_THR * fthr / nxyz ;
04900             for( iv=0,nvox=0 ; iv < nxyz ; iv++ )
04901                if( dar[iv] > fthr ) nvox++ ;
04902             indx = (int *) malloc( sizeof(int) * nvox ) ;
04903             if( indx == NULL ){
04904               fprintf(stderr,"RTfim: indx malloc failure!\a\n") ;
04905               EXIT(1) ;
04906             }
04907             for( iv=0,nvox=0 ; iv < nxyz ; iv++ )
04908                if( dar[iv] > fthr ) indx[nvox++] = iv ;
04909          }
04910          break ;
04911       }
04912 
04913       /** allocate space for voxel values that are above the threshold **/
04914       /** (nvox = # voxels above threshold;  nxyz = total # voxels)    **/
04915 
04916       if( verbose == 2 )
04917          fprintf(stderr,"RTfim: %d/%d voxels being FIMmed.\n",nvox,nxyz) ;
04918       VMCHECK ;
04919 
04920       vval = (float *) malloc( sizeof(float) * nvox) ;
04921       if( vval == NULL ){
04922         fprintf(stderr,"RTfim: vval malloc failure!\a\n") ;
04923         EXIT(1) ;
04924       }
04925 
04926       /** allocate extra space for comparing results from multiple ref vectors **/
04927 
04928       if( ny_ref > 1 ){
04929          aval  = (float *) malloc( sizeof(float) * nvox) ;
04930          rbest = (float *) malloc( sizeof(float) * nvox) ;
04931          abest = (float *) malloc( sizeof(float) * nvox) ;
04932          if( aval==NULL || rbest==NULL || abest==NULL ){
04933            fprintf(stderr,"RTfim: abest malloc failure!\a\n") ;
04934            EXIT(1) ;
04935          }
04936       } else {
04937          aval = rbest = abest = NULL ;
04938       }
04939 
04940       /*--- initialize recursive updates ---*/
04941 
04942       pc_ref = (PCOR_references **) malloc( sizeof(PCOR_references *) * ny_ref ) ;
04943       pc_vc  = (PCOR_voxel_corr **) malloc( sizeof(PCOR_voxel_corr *) * ny_ref ) ;
04944 
04945       if( pc_ref == NULL || pc_vc == NULL ){
04946         fprintf(stderr,"RTfim: can't malloc recursion space!\a\n") ;
04947         EXIT(1) ;
04948       }
04949 
04950       for( ivec=0 ; ivec < ny_ref ; ivec++ ){
04951          pc_ref[ivec] = new_PCOR_references( fim_nref ) ;
04952          pc_vc[ivec]  = new_PCOR_voxel_corr( nvox , fim_nref ) ;
04953          if( pc_ref[ivec] == NULL || pc_vc[ivec] == NULL ){
04954            fprintf(stderr,"RTfim: can't malloc refs and corr!\a\n") ;
04955            EXIT(1) ;
04956          }
04957       }
04958 
04959       /*--- Make a new dataset to hold the output ---*/
04960 
04961       rtin->func_dset = new_dset = EDIT_empty_copy( dset_time ) ;
04962       if( new_dset == NULL ){
04963         fprintf(stderr,"RTfim: can't create empty dataset!\a\n") ;
04964         EXIT(1) ;
04965       }
04966       tross_Append_History( new_dset , "plug_realtime: FIM" ) ;
04967 
04968       it = EDIT_dset_items( new_dset ,
04969                                ADN_prefix      , new_prefix ,
04970                                ADN_malloc_type , DATABLOCK_MEM_MALLOC ,
04971                                ADN_type        , ISHEAD(dset_time)
04972                                                  ? HEAD_FUNC_TYPE : GEN_FUNC_TYPE ,
04973                                ADN_func_type   , FUNC_COR_TYPE ,
04974                                ADN_nvals       , FUNC_nvals[FUNC_COR_TYPE] ,
04975                                ADN_datum_all   , MRI_short ,
04976                                ADN_ntt         , 0 ,
04977                             ADN_none ) ;
04978 
04979       if( it > 0 )
04980          fprintf(stderr,"RTfim: WARNING -- %d errors in dataset creation!\a\n",it) ;
04981 
04982       /** attach bricks to this dataset **/
04983 
04984       for( iv=0 ; iv < new_dset->dblk->nvals ; iv++ ){
04985          ptr = malloc( DSET_BRICK_BYTES(new_dset,iv) ) ;
04986          if( ptr == NULL ){
04987            fprintf(stderr,"RTfim: can't malloc dataset bricks!\a\n") ;
04988            EXIT(1) ;
04989          }
04990          mri_fix_data_pointer( ptr ,  DSET_BRICK(new_dset,iv) ) ;
04991 
04992          sprintf(strbuf,"#%d",iv) ;              /* 03 Jun 1999 */
04993          EDIT_BRICK_LABEL(new_dset,iv,strbuf) ;  /* add a label to each brick */
04994       }
04995 
04996       DSET_lock( rtin->func_dset ) ; /* 20 Mar 1998 */
04997 
04998    }  /*---- end of initializing at first important time point ----*/
04999 
05000    /*---- do recursive update for this time point ----*/
05001 
05002    /* process as loop, in case this is the first time (and we need to backtrack) */
05003    /*                                                        30 Oct 2003 [rickr] */
05004    if ( first_pass == 1 )
05005    {
05006       first_pass  = 0;
05007       start_index = it1;      /* start from timepoint of first FIM computation */
05008    }
05009    else
05010       start_index = mode;     /* if not first pass, the "loop" will be this one iteration */
05011 
05012    for ( it = start_index; it <= mode; it++ )
05013    {
05014       nnow = 0 ;     /* number of refs used this time */
05015 
05016       if( it >= nx_ref ) return 1 ;  /* can't update without references! */
05017 
05018       for( ivec=0 ; ivec < ny_ref ; ivec++ ){           /* for each ideal time series */
05019          tsar = MRI_FLOAT_PTR(ref_ts) + (ivec*nx_ref) ;
05020          if( tsar[it] >= WAY_BIG ) continue ;           /* skip this time series */
05021 
05022          ref_vec[0] = 1.0 ;         /* we always supply ort for constant */
05023          for( ip=1 ; ip <= polort ; ip++ )              /* 02 Jun 1999:    */
05024             ref_vec[ip] = ref_vec[ip-1] * ((float)it) ; /* and polynomials */
05025 
05026          if( internal_ort ){
05027             ref_vec[ip] = tsar[it] ;                    /* ideal */
05028          } else {
05029             for( iv=0 ; iv < ny_ort ; iv++ )            /* any other orts? */
05030                ref_vec[iv+ip] = (it < nx_ort) ? ortar[it+iv*nx_ort]
05031                                               : 0.0 ;
05032 
05033             ref_vec[ny_ort+ip] = tsar[it] ;             /* ideal */
05034          }
05035 
05036          update_PCOR_references( ref_vec , pc_ref[ivec] ) ;  /* Choleski refs */
05037 
05038          /* load data from dataset into local float array vval */
05039 
05040          switch( dtyp ){
05041             case MRI_short:{
05042                short * dar = (short *) DSET_ARRAY(dset_time,it) ;
05043                for( iv=0 ; iv < nvox ; iv++ ) vval[iv] = (float) dar[indx[iv]] ;
05044             }
05045             break ;
05046 
05047             case MRI_float:{
05048                float * dar = (float *) DSET_ARRAY(dset_time,it) ;
05049                for( iv=0 ; iv < nvox ; iv++ ) vval[iv] = (float) dar[indx[iv]] ;
05050             }
05051             break ;
05052 
05053             case MRI_byte:{
05054                byte * dar = (byte *) DSET_ARRAY(dset_time,it) ;
05055                for( iv=0 ; iv < nvox ; iv++ ) vval[iv] = (float) dar[indx[iv]] ;
05056             }
05057             break ;
05058          }
05059 
05060          PCOR_update_float( vval , pc_ref[ivec] , pc_vc[ivec] ) ;  /* Choleski data */
05061          nnow++ ;
05062 
05063       }
05064       if( nnow > 0 ) nupdt++ ;  /* at least one ideal vector was used */
05065    }
05066 
05067    return 1 ;
05068 }

void RT_finish_dataset RT_input   rtin
 

--- if this is the final call, do some cleanup stuff ---*

Definition at line 3630 of file plug_realtime.c.

References RT_input::dset, DSET_delete, DSET_FILECODE, free, RT_input::func_dset, RT_input::image_mode, ISVALID_3DIM_DATASET, malloc, RT_input::mp_tcp_use, RT_input::nsl, RT_input::num_chan, RT_input::nvol, RT_input::p_code, plot_ts_lab(), qsort_floatint(), RT_input::reg_dset, RT_input::reg_dx, RT_input::reg_dy, RT_input::reg_dz, RT_input::reg_eval, RT_input::reg_graph, RT_input::reg_graph_xnew, RT_input::reg_graph_ynew, REG_IS_2D, REG_IS_3D, RT_input::reg_mode, RT_input::reg_nest, RT_input::reg_phi, RT_input::reg_psi, RT_input::reg_rep, RT_input::reg_theta, RT_input::reg_tim, REGMODE_2D_ATEND, REGMODE_3D_ATEND, REGMODE_3D_ESTIM, RT_mp_comm_close(), RT_registration_2D_atend(), RT_registration_3D_atend(), RT_tell_afni(), SHOW_TIMES, TELL_FINAL, THE_DISPLAY, and verbose.

Referenced by RT_worker().

03631 {
03632    int ii , cc , nbad=0 ;
03633 
03634    if( rtin->image_mode ){
03635       if( verbose == 2 ) SHOW_TIMES ;
03636       return ;
03637    }
03638 
03639    for( cc=0 ; cc < rtin->num_chan ; cc++ ){
03640 
03641       if( ! ISVALID_3DIM_DATASET(rtin->dset[cc]) ){
03642         fprintf(stderr,"RT: attempt to finish channel %02d with incomplete dataset!\a\n",cc+1) ;
03643         nbad++ ; continue ;
03644       }
03645 
03646       if( rtin->nvol[cc] < 1 ){
03647         fprintf(stderr,"RT: attempt to finish channel %02d with 0 completed bricks!\a\n",cc+1) ;
03648         DSET_delete( rtin->dset[cc] ) ; rtin->dset[cc] = NULL ;
03649         if( rtin->func_dset != NULL ){
03650            DSET_delete( rtin->func_dset ) ; rtin->func_dset = NULL ;
03651         }
03652 #ifdef ALLOW_REGISTRATION
03653         if( rtin->reg_dset != NULL ){
03654            DSET_delete( rtin->reg_dset ) ; rtin->reg_dset = NULL ;
03655         }
03656 #endif
03657         nbad++ ;
03658       }
03659 
03660       if( rtin->nsl[cc] > 0 )
03661          fprintf(stderr,"RT: finish channel %02d with %d slices unused!\a\n",
03662                  cc+1,rtin->nsl[cc]);
03663 
03664       fprintf(stderr,"RT: finish channel %02d with %d bricks completed.\n",
03665               cc+1,rtin->nvol[cc]) ;
03666    }
03667 
03668    if( verbose ) SHOW_TIMES ;
03669    if( nbad    ) return ;
03670 
03671 #ifdef ALLOW_REGISTRATION
03672    /*--- Do the "at end" registration, if ordered and if possible ---*/
03673 
03674    switch( rtin->reg_mode ){
03675       case REGMODE_2D_ATEND: RT_registration_2D_atend( rtin ) ; break ;
03676       case REGMODE_3D_ATEND: RT_registration_3D_atend( rtin ) ; break ;
03677    }
03678 
03679    /*--- 17 Aug 1998: Graph the motion parameters, if desired ---*/
03680 
03681    if( rtin->reg_graph && rtin->reg_nest > 1 && REG_IS_2D(rtin->reg_mode) ){
03682       float * yar[4] ;  /* not Tasha */
03683       int * iar , ii , nn = rtin->reg_nest ;
03684       static char * nar[3] = { "\\Delta x [mm]" , "\\Delta y [mm]" , "\\phi   [\\degree]" } ;
03685 
03686       if( verbose == 2 )
03687          fprintf(stderr,"RT: graphing estimated 2D motion parameters\n") ;
03688 
03689       /* sort the arrays by time */
03690 
03691       iar    = (int *)   malloc( sizeof(int)   * nn ) ;  /* index */
03692       yar[0] = (float *) malloc( sizeof(float) * nn ) ;  /* time  */
03693       yar[1] = (float *) malloc( sizeof(float) * nn ) ;  /* dx    */
03694       yar[2] = (float *) malloc( sizeof(float) * nn ) ;  /* dy    */
03695       yar[3] = (float *) malloc( sizeof(float) * nn ) ;  /* phi   */
03696 
03697       for( ii=0 ; ii < nn ; ii++ ){
03698          iar[ii] = ii ; yar[0][ii] = rtin->reg_tim[ii] ;
03699       }
03700 
03701       qsort_floatint( nn , yar[0] , iar ) ;     /* sort by time, carry index */
03702 
03703       for( ii=0 ; ii < nn ; ii++ ){             /* use index to reorder params */
03704          yar[1][ii] = rtin->reg_dx [ iar[ii] ] ;
03705          yar[2][ii] = rtin->reg_dy [ iar[ii] ] ;
03706          yar[3][ii] = rtin->reg_phi[ iar[ii] ] ;
03707       }
03708 
03709       plot_ts_lab( THE_DISPLAY ,
03710                    nn , yar[0] , -3 , yar+1 ,
03711                    "time" , NULL , DSET_FILECODE(rtin->dset[0]) , nar , NULL ) ;
03712 
03713       free(iar) ; free(yar[0]) ; free(yar[1]) ; free(yar[2]) ; free(yar[3]) ;
03714    }
03715 
03716    /*--- Oct 1998: do 3D graphing ---*/
03717    /*--- Jan 2004: if both reg_graph_xnew and reg_graph_ynew, don't plot */
03718 
03719    if( rtin->reg_graph && rtin->reg_nest > 1 && REG_IS_3D(rtin->reg_mode) &&
03720        ( rtin->reg_graph_xnew == 0 || rtin->reg_graph_ynew == 0 ) ){
03721       float * yar[7] ;
03722       int     ycount = -6 ;
03723       int     nn = rtin->reg_nest ;
03724       static char * nar[6] = {
03725          "\\Delta I-S [mm]" , "\\Delta R-L [mm]" , "\\Delta A-P [mm]" ,
03726          "Roll [\\degree]" , "Pitch [\\degree]" , "Yaw [\\degree]"  } ;
03727 
03728       char *ttl = malloc( strlen(DSET_FILECODE(rtin->dset[0])) + 32 ) ;
03729       strcpy(ttl,"\\noesc ") ;
03730       strcat(ttl,DSET_FILECODE(rtin->dset[0])) ;
03731       if( rtin->reg_mode == REGMODE_3D_ESTIM ) strcat(ttl," [Estimate]") ;
03732 
03733       if( verbose == 2 )
03734          fprintf(stderr,"RT: graphing estimated 3D motion parameters\n") ;
03735 
03736       /* arrays are already sorted by time */
03737 
03738       yar[0] = rtin->reg_rep   ;  /* repetition numbers */
03739       yar[1] = rtin->reg_dx    ;  /* dx    */
03740       yar[2] = rtin->reg_dy    ;  /* dy    */
03741       yar[3] = rtin->reg_dz    ;  /* dz    */
03742       yar[4] = rtin->reg_phi   ;  /* roll  */
03743       yar[5] = rtin->reg_psi   ;  /* pitch */
03744       yar[6] = rtin->reg_theta ;  /* yaw   */
03745 
03746       if ( rtin->p_code )
03747       {
03748          ycount = 1;
03749          yar[1] = rtin->reg_eval;
03750       }
03751 
03752       plot_ts_lab( THE_DISPLAY ,
03753                    nn , yar[0] , ycount , yar+1 ,
03754                    "reps" , NULL , ttl , nar , NULL ) ;
03755 
03756       free(ttl) ;
03757    }
03758 
03759    /* close any open tcp connection */
03760    if ( rtin->mp_tcp_use )
03761       RT_mp_comm_close( rtin );
03762 
03763    /* if we have a parser expression, free it */
03764    if ( rtin->p_code )
03765    {
03766       free( rtin->p_code ) ;
03767       rtin->p_code = NULL ;
03768    }
03769 #endif
03770 
03771    /** tell afni about it one last time **/
03772 
03773    RT_tell_afni(rtin,TELL_FINAL) ;
03774 
03775    return ;
03776 }

void RT_image_kfun void *    kdata [static]
 

if( iochan_goodcheck(rtin->ioc_data,0) <= 0 ) return -1 ;

Definition at line 3086 of file plug_realtime.c.

References RT_input::image_handle.

Referenced by RT_process_image().

03087 {
03088    RT_input * rtin = (RT_input *) kdata ;
03089    if( rtin != NULL ) rtin->image_handle = NULL ;
03090    return ;
03091 }

char * RT_main PLUGIN_interface *   
 

Definition at line 637 of file plug_realtime.c.

References func_code, FUNC_strings, GRAPH_strings, IM3D_OPEN, image_mode, MAX_PIN, MIN_PIN, NFUNC, NGRAPH, NREG, NRESAM, NVERB, NYESNO, plint, PLUTO_string_index(), PLUTO_turnoff_options(), reg_nr, reg_resam, REG_resam_strings, REG_strings, reg_yr, reggraph, regmode, REGMODE_NONE, regtime, root, RT_set_grapher_pinnums(), THD_filename_pure(), update, VERB_strings, and verbose.

Referenced by PLUGIN_init().

00638 {
00639    char * tag , * str , * new_prefix ;
00640    static char buf[256] ;
00641 
00642    if( plint == NULL )
00643       return "*********************\n"
00644              "RT_main:  NULL input\n"
00645              "*********************"  ;
00646 
00647    /** loop over input from AFNI **/
00648 
00649 #if 0                         /* 09 Oct 2000: turn this "feature" off */
00650 #ifdef ALLOW_REGISTRATION
00651    regmode = REGMODE_NONE ;   /* no registration if not ordered explicitly */
00652 #endif
00653 #endif
00654 
00655    while( (tag=PLUTO_get_optiontag(plint)) != NULL ){
00656 
00657       /* 28 Apr 2000: added "Images Only" mode */
00658 
00659       if( strcmp(tag,"Mode") == 0 ){
00660          str        = PLUTO_get_string(plint) ;
00661          image_mode = PLUTO_string_index( str , NYESNO , VERB_strings ) ;
00662          continue ;
00663       }
00664 
00665       if( strcmp(tag,"Root") == 0 ){
00666          new_prefix = PLUTO_get_string(plint) ;
00667          if( ! THD_filename_pure(new_prefix) )
00668             return "**************************\n"
00669                    "RT_main:  bad root prefix\n"
00670                    "**************************"  ;
00671          strcpy(root,new_prefix) ;
00672          continue ;
00673       }
00674 
00675       if( strcmp(tag,"Update") == 0 ){
00676          update = PLUTO_get_number(plint) ;
00677          continue ;
00678       }
00679 
00680       if( strcmp(tag,"Function") == 0 ){
00681          str       = PLUTO_get_string(plint) ;
00682          func_code = PLUTO_string_index( str , NFUNC , FUNC_strings ) ;
00683          continue ;
00684       }
00685 
00686       if( strcmp(tag,"Verbose") == 0 ){
00687          str     = PLUTO_get_string(plint) ;
00688          verbose = PLUTO_string_index( str , NVERB , VERB_strings ) ;
00689          continue ;
00690       }
00691 
00692 #ifdef ALLOW_REGISTRATION
00693       if( strcmp(tag,"Registration") == 0 ){
00694          str       = PLUTO_get_string(plint) ;
00695          regmode   = PLUTO_string_index( str , NREG , REG_strings ) ;
00696 
00697          regtime   = PLUTO_get_number(plint) ;
00698 
00699          str       = PLUTO_get_string(plint) ;
00700          reg_resam = PLUTO_string_index( str , NRESAM , REG_resam_strings ) ;
00701          continue ;
00702       }
00703 
00704       if( strcmp(tag,"Graphing") == 0 ){
00705          str      = PLUTO_get_string(plint) ;
00706          reggraph = PLUTO_string_index( str , NGRAPH , GRAPH_strings ) ;
00707 
00708          reg_nr   = PLUTO_get_number(plint) ;
00709          reg_yr   = PLUTO_get_number(plint) ;
00710 
00711          /* 12 Oct 2000: set pin_num on all graphs now open */
00712 
00713          if( reg_nr >= MIN_PIN && reg_nr <= MAX_PIN && IM3D_OPEN(plint->im3d) )
00714              RT_set_grapher_pinnums(reg_nr);
00715 
00716          continue ;
00717       }
00718 #endif
00719 
00720       /** How the hell did this happen? **/
00721 
00722       sprintf(buf,"*****************\n"
00723                   "Illegal optiontag: %s\n"
00724                   "*****************"      , tag ) ;
00725       return buf ;
00726 
00727    }  /* end of loop over active input options */
00728 
00729    /*-- 28 Apr 2000: if in Image Only mode, turn some stuff off --*/
00730 
00731    if( image_mode ){
00732       func_code = 0 ;
00733       regmode   = 0 ;
00734       reggraph  = 0 ;
00735    }
00736 
00737    PLUTO_turnoff_options( plint ) ;  /* 21 Feb 2001 */
00738 
00739    return NULL ;  /* nothing bad happened */
00740 }

int RT_mp_comm_close RT_input   rtin
 

Definition at line 1782 of file plug_realtime.c.

References close(), RT_input::mp_nmsg, RT_input::mp_npsets, RT_input::mp_tcp_sd, RT_input::mp_tcp_use, send, and tcp_writecheck().

Referenced by RT_finish_dataset().

01783 {
01784     char magic_bye[] = { 0xde, 0xad, 0xde, 0xad, 0 };
01785 
01786     if ( rtin->mp_tcp_use != 1 || rtin->mp_tcp_sd <= 0 )
01787         return 0;
01788 
01789     if ( (tcp_writecheck(rtin->mp_tcp_sd, 1)   == -1) ||
01790          (send(rtin->mp_tcp_sd, magic_bye, 4, 0) == -1 ) )
01791         fprintf(stderr,"** closing: our MP socket has gone bad?\n");
01792 
01793     fprintf(stderr,"RT: MP: closing motion param socket, "
01794                    "sent %d param sets over %d messages\n",
01795                    rtin->mp_npsets, rtin->mp_nmsg);
01796 
01797     /* in any case, close the socket */
01798     close(rtin->mp_tcp_sd);
01799     rtin->mp_tcp_sd  = 0;
01800     rtin->mp_tcp_use = 0;
01801     rtin->mp_npsets  = 0;
01802     rtin->mp_nmsg    = 0;
01803 
01804     return 0;
01805 }

int RT_mp_comm_init RT_input   rtin
 

Definition at line 1873 of file plug_realtime.c.

References RT_input::mp_host, RT_input::mp_port, RT_input::mp_tcp_sd, RT_input::mp_tcp_use, send, and socket.

Referenced by RT_registration_3D_realtime().

01874 {
01875     struct sockaddr_in   sin;
01876     struct hostent     * hostp;
01877     char                 magic_hi[] = { 0xab, 0xcd, 0xef, 0xab };
01878     int                  sd;
01879 
01880     if ( rtin->mp_tcp_sd != 0 )
01881         fprintf(stderr,"** warning, did we not close the MP socket?\n");
01882 
01883     if ( (hostp = gethostbyname(rtin->mp_host)) == NULL )
01884     {
01885         fprintf(stderr,"** cannot lookup host '%s'\n", rtin->mp_host);
01886         rtin->mp_tcp_use = -1;
01887         return -1;
01888     }
01889 
01890     /* fill the sockaddr_in struct */
01891     memset(&sin, 0, sizeof(sin));
01892     sin.sin_family      = AF_INET;
01893     sin.sin_addr.s_addr = ((struct in_addr *)(hostp->h_addr))->s_addr;
01894     sin.sin_port        = htons(rtin->mp_port);
01895 
01896     /* get a socket */
01897     if ( (sd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
01898     {
01899         perror("pe: socket");
01900         rtin->mp_tcp_use = -1;   /* let us not try, try again */
01901         return -1;
01902     }
01903 
01904     if ( connect(sd, (struct sockaddr *)&sin, sizeof(sin)) == -1 )
01905     {
01906         perror("pe: connect");
01907         rtin->mp_tcp_use = -1;
01908         return -1;
01909     }
01910 
01911     /* send the hello message */
01912     if ( send(sd, magic_hi, 4*sizeof(char), 0) == -1 )
01913     {
01914         perror("pe: send hello");
01915         rtin->mp_tcp_use = -1;
01916         return -1;
01917     }
01918 
01919     fprintf(stderr,"RT: MP: opened motion param socket to %s:%d\n",
01920             rtin->mp_host, rtin->mp_port);
01921 
01922     /* everything worked out, we're good to van Gogh */
01923 
01924     rtin->mp_tcp_sd = sd;
01925 
01926     return 0;
01927 }

int RT_mp_comm_init_vars RT_input   rtin
 

Definition at line 1938 of file plug_realtime.c.

References getenv(), RT_input::mp_host, RT_input::mp_port, RT_input::mp_tcp_sd, and RT_input::mp_tcp_use.

Referenced by RT_registration_3D_realtime().

01939 {
01940     char * ept, * cp;
01941     int    len;
01942 
01943     if ( rtin->mp_tcp_use < 0 )     /* we've failed out, do not try again */
01944         return 0;
01945 
01946     if ( rtin->mp_tcp_sd != 0 )
01947         fprintf(stderr,"** warning, did we not close the MP socket?\n");
01948     rtin->mp_tcp_sd   = 0;
01949 
01950     /* for now, we will only init this if the HOST:PORT env var exists */
01951     ept = getenv("AFNI_REALTIME_MP_HOST_PORT") ;  /* 09 Oct 2000 */
01952     if( ept == NULL )
01953         return 0;
01954 
01955     cp = strchr(ept, ':');      /* find ':' seperator */
01956 
01957     if ( cp == NULL || !isdigit(*(cp+1)) )
01958     {
01959         fprintf(stderr,"** env var AFNI_REALTIME_MP_HOST_PORT must be in the "
01960                        "form hostname:port_num\n   (var is '%s')\n", ept);
01961         return -1;
01962     }
01963 
01964     len = cp - ept;     /* length of hostname */
01965     if ( len > 127 )
01966     {
01967         fprintf(stderr,"** motion param hostname restricted to 127 bytes,\n"
01968                        "   found %d from host in %s\n", len, ept);
01969         return -1;
01970     }
01971 
01972     fprintf(stderr,"RT: MP: found motion param env var '%s'\n", ept);
01973 
01974     rtin->mp_port = atoi(cp+1);
01975     strncpy(rtin->mp_host, ept, len);
01976     rtin->mp_host[len] = '\0';
01977     rtin->mp_tcp_use = 1;
01978 
01979     return 0;
01980 }

int RT_mp_comm_send_data RT_input   rtin,
float *    mp[6],
int    nt
 

Definition at line 1814 of file plug_realtime.c.

References c, close(), MIN, mp, RT_input::mp_nmsg, RT_input::mp_npsets, RT_input::mp_tcp_sd, RT_input::mp_tcp_use, send, and tcp_writecheck().

Referenced by RT_registration_3D_realtime().

01815 {
01816     float data[600];            /* max transfer is nt == 100 */
01817     int   rv, nvals, remain;
01818     int   c, c2;
01819 
01820     if ( rtin->mp_tcp_use != 1 || nt <= 0 )
01821         return 0;
01822 
01823     if ( rtin->mp_tcp_sd <= 0 )
01824         return -1;
01825 
01826     /* hmmmm, Bob has a good function to test the socket... */
01827     if ( (rv = tcp_writecheck(rtin->mp_tcp_sd, 1)) == -1 )
01828     {
01829         fprintf(stderr,"** our MP socket has gone bad?\n");
01830         close(rtin->mp_tcp_sd);
01831         rtin->mp_tcp_sd  = 0;
01832         rtin->mp_tcp_use = 0;   /* allow a later re-try... */
01833         return -1;
01834     }
01835 
01836     remain = nt;
01837     while ( remain > 0 )
01838     {
01839         nvals = MIN(remain, 100);
01840 
01841         /* copy floats to 'data' */
01842         for ( c = 0; c < nvals; c++ )
01843             for ( c2 = 0; c2 < 6; c2++ )
01844                 data[6*c+c2] = mp[c2][c];
01845 
01846         if ( send(rtin->mp_tcp_sd, data, 6*nvals*sizeof(float), 0) == -1 )
01847         {
01848             fprintf(stderr,"** failed to send %d floats, closing socket...\n",
01849                     6*nvals);
01850             close(rtin->mp_tcp_sd);
01851             rtin->mp_tcp_sd  = 0;
01852             rtin->mp_tcp_use = 0;  /* allow a later re-try... */
01853             return -1;
01854         }
01855 
01856         /* keep track of num messages and num param sets */
01857         rtin->mp_nmsg++;
01858         rtin->mp_npsets += nvals;
01859 
01860         remain -= nvals;
01861     }
01862 
01863     return 0;
01864 }

int RT_parser_init RT_input   rtin
 

Definition at line 1989 of file plug_realtime.c.

References RT_input::p_code, RT_input::p_expr, RT_input::p_has_sym, RT_input::p_max_sym, PARSER_generate_code(), PARSER_mark_symbols(), and PARSER_set_printout().

Referenced by RT_process_info().

01990 {
01991     PARSER_set_printout(1);
01992     rtin->p_code = PARSER_generate_code( rtin->p_expr );
01993 
01994     if ( ! rtin->p_code )
01995     {
01996         fprintf(stderr,"** cannot parse expression '%s'\n", rtin->p_expr);
01997         return -1;
01998     }
01999 
02000     /* p_max_sym will be 0 if nothing is marked, 26 if z is, etc. */
02001     PARSER_mark_symbols( rtin->p_code, rtin->p_has_sym );
02002     for ( rtin->p_max_sym = 26; rtin->p_max_sym > 0; rtin->p_max_sym-- )
02003         if ( rtin->p_has_sym[rtin->p_max_sym - 1] )
02004             break;
02005 
02006     if ( rtin->p_max_sym > 6 )
02007     {
02008         fprintf(stderr,"** parser expression may only contain symbols a-f\n");
02009         return -2;
02010     }
02011 
02012     return 0;
02013 }

int RT_process_data RT_input   rtin
 

at this point, nbuffed is the number of bytes read from the buffer. if we need to read more bytes from the I/O channel, then do so now. *

Definition at line 3019 of file plug_realtime.c.

References ADDTO_IMARR, RT_input::bufar, RT_input::cur_chan, EXIT, RT_input::im, RT_input::imsize, RT_input::info_ok, INIT_IMARR, RT_input::ioc_data, iochan_readcheck(), RT_input::marked_for_death, MRI_BYTE_PTR, mri_new(), RT_input::nbuf, MRI_IMARR::num, RT_process_image(), RT_process_xevents(), RT_read_image(), RT_start_dataset(), RT_input::sbr, verbose, and VMCHECK.

Referenced by RT_worker().

03020 {
03021    int vdone ;
03022 
03023    /** can we create a dataset yet? **/
03024 
03025    if( rtin->sbr[0] == NULL && rtin->info_ok ){
03026       if( verbose == 2 )
03027          fprintf(stderr,"RT: info complete --> creating dataset.\n") ;
03028       VMCHECK ;
03029       RT_start_dataset( rtin ) ;
03030    }
03031 
03032    /** read images as long as there is data to suck up **/
03033 
03034    while( rtin->nbuf > 0 || iochan_readcheck(rtin->ioc_data,0) > 0 ){
03035 
03036       if( rtin->im[0] != NULL ){  /** process data into dataset directly **/
03037 
03038          RT_read_image( rtin , rtin->im[rtin->cur_chan] ) ; /* read into dataset buffer */
03039 
03040          if( rtin->marked_for_death ) return 0 ;            /* 10 Dec 2002 */
03041 
03042          RT_process_image( rtin ) ;                         /* process it for the dataset */
03043 
03044       } else {                 /** read data into temporary buffer space **/
03045                                /** (will have to process it later, dude) **/
03046          MRI_IMAGE * newim ;
03047          char * newbuf ;
03048 
03049          if( rtin->imsize <= 0 ){
03050            fprintf(stderr,"RT: image data present, but don't know its size!\a\n") ;
03051            EXIT(1) ;
03052          }
03053 
03054          if( rtin->bufar == NULL )    /* initialize buffer for input images */
03055            INIT_IMARR(rtin->bufar) ;
03056 
03057          if( verbose == 2 && rtin->bufar->num % 10 == 0 ){
03058            fprintf(stderr,"RT: reading image into buffer[%d]\n",rtin->bufar->num) ;
03059            VMCHECK ;
03060          }
03061 
03062          newim  = mri_new( rtin->imsize , 1 , MRI_byte ) ; /* make space for next image */
03063          newbuf = (char *) MRI_BYTE_PTR(newim) ;           /* pointer to image data */
03064          ADDTO_IMARR( rtin->bufar , newim ) ;              /* add to saved image list */
03065          RT_read_image( rtin , newbuf ) ;                  /* read image data */
03066          if( rtin->marked_for_death ) return 0 ;           /* 10 Dec 2002 */
03067       }
03068 
03069       RT_process_xevents( rtinp ) ;
03070 
03071    }  /* end of loop over reading images as long as we can */
03072 
03073    /** return an error code if the input data channel has gone bad **/
03074 
03075 /**
03076    if( iochan_goodcheck(rtin->ioc_data,0) <= 0 ) return -1 ;
03077 **/
03078 
03079    return 1 ;
03080 }

void RT_process_image RT_input  
 

Definition at line 3101 of file plug_realtime.c.

References ADN_none, ADN_ntt, AFNI_CALL_VALU_2ARG, RT_input::cur_chan, RT_input::datum, RT_input::dset, RT_input::dtype, DTYPE_2DZ, DTYPE_2DZT, DTYPE_3D, DTYPE_3DT, EDIT_add_brick(), EDIT_dset_items(), EDIT_substitute_brick(), EXIT, RT_input::func_code, RT_input::func_condit, RT_input::func_func, RT_input::im, RT_input::image_handle, RT_input::image_mode, RT_input::image_space, RT_input::imsize, INIT_MODE, malloc, MIN_TO_GRAPH, RT_input::nsl, RT_input::num_chan, RT_input::nvol, RT_input::nzz, PLUTO_imseq_addto(), PLUTO_imseq_popim(), PLUTO_imseq_retitle(), RT_input::reg_mode, REGMODE_2D_RTIME, REGMODE_3D_ESTIM, REGMODE_3D_RTIME, RT_image_kfun(), RT_registration_2D_realtime(), RT_registration_3D_realtime(), RT_tell_afni(), RT_input::sbr, RT_input::sbr_size, TELL_NORMAL, update, verbose, VMCHECK, RT_input::zorder, ZORDER_ALT, and ZORDER_SEQ.

Referenced by RT_process_data(), and RT_start_dataset().

03102 {
03103    int vdone , cc = rtin->cur_chan ;
03104 
03105    /** 28 Apr 2000: Image Only mode stuff **/
03106 
03107    if( rtin->image_mode ){
03108       if( rtin->image_handle != NULL ){
03109          PLUTO_imseq_addto( rtin->image_handle , rtin->image_space ) ;
03110       } else {
03111          rtin->image_handle = PLUTO_imseq_popim( rtin->image_space, RT_image_kfun,rtin ) ;
03112          PLUTO_imseq_retitle( rtin->image_handle , "Realtime Images" ) ;
03113       }
03114       return ;
03115    }
03116 
03117    /** check if new image completes the current volume **/
03118 
03119    if( rtin->dtype == DTYPE_2DZT || rtin->dtype == DTYPE_2DZ ){
03120 
03121       if( verbose == 2 )
03122          fprintf(stderr,"RT: read image into dataset brick %d slice %d.\n",
03123                  rtin->nvol[cc],rtin->nsl[cc]) ;
03124 
03125       rtin->nsl[cc] ++ ;                     /* 1 more slice */
03126       vdone = (rtin->nsl[cc] == rtin->nzz) ; /* have all slices? */
03127 
03128    } else if( rtin->dtype == DTYPE_3DT || rtin->dtype == DTYPE_3D ){
03129 
03130 #if 0
03131       if( verbose == 2 )
03132         fprintf(stderr,"RT: read image into dataset brick %d\n",rtin->nvol[cc]) ;
03133 #endif
03134 
03135       vdone = 1 ;                        /* 3D gets all data at once */
03136    }
03137 
03138    /** if volume is done, add it to the dataset **/
03139 
03140    if( vdone ){
03141 
03142       rtin->nvol[cc] ++ ;        /* 1 more volume is acquired! */
03143 
03144       if( verbose == 2 )
03145          fprintf(stderr,"RT: now have %d complete sub-bricks in channel %02d.\n",
03146                  rtin->nvol[cc],cc+1) ;
03147       VMCHECK ;
03148 
03149       /* first time: put this volume in as "substitute" for empty 1st brick
03150          later:      add new volume at end of chain                         */
03151 
03152       if( rtin->nvol[cc] == 1 )
03153          EDIT_substitute_brick( rtin->dset[cc] , 0 , rtin->datum , rtin->sbr[cc] ) ;
03154       else
03155          EDIT_add_brick( rtin->dset[cc] , rtin->datum , 0.0 , rtin->sbr[cc] ) ;
03156 
03157       VMCHECK ;
03158       if( verbose == 2 )
03159          fprintf(stderr,"RT: added brick to dataset in channel %02d\n",cc+1) ;
03160       VMCHECK ;
03161 
03162       /* must also change the number of times recorded
03163          [EDIT_add_brick does 'nvals' correctly, but not 'ntt'] */
03164 
03165       if( rtin->dtype == DTYPE_3DT || rtin->dtype == DTYPE_2DZT ){
03166          EDIT_dset_items( rtin->dset[cc] , ADN_ntt , rtin->nvol[cc] , ADN_none ) ;
03167          if( verbose == 2 )
03168             fprintf(stderr,"RT: altered ntt in dataset header in channel %02d\n",cc+1) ;
03169          VMCHECK ;
03170       } else if( rtin->nvol[cc] > 1 ){
03171          fprintf(stderr,"RT: have %d bricks for time-independent dataset!\a\n",
03172                  rtin->nvol[cc]) ;
03173          VMCHECK ;
03174       }
03175 
03176 #ifdef ALLOW_REGISTRATION
03177       /* do registration before function computation   - 30 Oct 2003 [rickr] */
03178       switch( rtin->reg_mode ){
03179            case REGMODE_2D_RTIME: RT_registration_2D_realtime( rtin ) ;
03180            break ;
03181 
03182            case REGMODE_3D_RTIME:
03183            case REGMODE_3D_ESTIM: RT_registration_3D_realtime( rtin ) ;
03184            break ;
03185       }
03186 #endif /* ALLOW_REGISTRATION */
03187 
03188       /** compute function, maybe? **/
03189 
03190       if( rtin->func_code > 0 ){
03191          int jj ;
03192 
03193          /** if needed, initialize the function computations **/
03194 
03195          if( rtin->func_condit == 0 ){
03196 #if 0
03197             jj = rtin->func_func( rtin , INIT_MODE ) ;
03198 #else
03199             AFNI_CALL_VALU_2ARG( rtin->func_func , int,jj ,
03200                                  RT_input *,rtin , int,INIT_MODE ) ;
03201 #endif
03202             if( jj < 0 ){ rtin->func_code = 0 ; rtin->func_func = NULL ; }
03203             rtin->func_condit = 1 ;  /* initialized */
03204          }
03205 
03206          /** do the function computations for this volume **/
03207 
03208          if( rtin->func_code > 0 )
03209 #if 0
03210             jj = rtin->func_func( rtin , rtin->nvol[cc] - 1 ) ;
03211 #else
03212             AFNI_CALL_VALU_2ARG( rtin->func_func , int,jj ,
03213                                  RT_input *,rtin , int,rtin->nvol[cc]-1 ) ;
03214 #endif
03215       }
03216 
03217       /** make space for next sub-brick to arrive **/
03218 
03219       if( verbose == 2 )
03220          fprintf(stderr,"RT: malloc-ing %d bytes for next volume in channel %02d\n",
03221                  rtin->sbr_size,cc+1) ;
03222       VMCHECK ;
03223 
03224       rtin->sbr[cc] = malloc( rtin->sbr_size ) ;
03225       if( rtin->sbr[cc] == NULL ){
03226         fprintf(stderr,"RT: can't malloc real-time brick %d for channel %02d\a\n",
03227                 rtin->nvol[cc]+1,cc+1) ;
03228         EXIT(1) ;
03229       }
03230       if( verbose == 2 )
03231          fprintf(stderr,"RT: malloc succeeded\n") ;
03232       VMCHECK ;
03233 
03234       rtin->im[cc]  = rtin->sbr[cc] ;  /* location of slice #0 within sub-brick */
03235       rtin->nsl[cc] = 0 ;              /* number of slices gathered so far */
03236 
03237       /** tell AFNI about this dataset, maybe **/
03238 
03239       if( update > 0 ){  /* if we want updates every so often */
03240          int doit ;
03241 
03242          if( verbose == 2 )
03243             fprintf(stderr,"RT: checking for update status\n") ;
03244          VMCHECK ;
03245 
03246          doit = ( (rtin->dtype==DTYPE_3DT || rtin->dtype==DTYPE_2DZT) &&
03247                   (cc+1 == rtin->num_chan)                            && /* 01 Aug 2002 */
03248                   (rtin->nvol[cc] == MIN_TO_GRAPH ||
03249                    (rtin->nvol[cc] > MIN_TO_GRAPH && rtin->nvol[cc] % update == 0)) ) ;
03250 
03251          if( doit ){
03252             if( verbose == 2 )
03253                fprintf(stderr,"RT: about to tell AFNI about dataset.\n") ;
03254             VMCHECK ;
03255             RT_tell_afni(rtin,TELL_NORMAL) ;
03256          }
03257       }
03258 
03259    } else {  /** need to add more slices before volume is done **/
03260 
03261       int noff ;  /* slice position in output brick */
03262 
03263       if( rtin->zorder == ZORDER_SEQ ){  /* sequential:       */
03264                                          /* slice position is */
03265          noff = rtin->nsl[cc] ;          /* just slice number */
03266 
03267       } else if ( rtin->zorder == ZORDER_ALT ){  /* alternating: */
03268 
03269          int nhalf = (rtin->nzz + 1)/2 ;         /* number in first 1/2 */
03270 
03271          if( rtin->nsl[cc] < nhalf )
03272             noff = 2 * rtin->nsl[cc] ;               /* first half of slices */
03273          else
03274             noff = 1 + 2 * (rtin->nsl[cc] - nhalf) ; /* second half of slices */
03275       }
03276 
03277       rtin->im[cc] = rtin->sbr[cc] + (noff * rtin->imsize) ; /* where next slice goes */
03278 
03279    }
03280 
03281    /* 01 Aug 2002: update which channel gets the next image */
03282 
03283    if( rtin->num_chan > 1 )
03284      rtin->cur_chan = (cc+1) % rtin->num_chan ;
03285 
03286    return ;
03287 }

int RT_process_info int   ,
char *   ,
RT_input  
 

Definition at line 2026 of file plug_realtime.c.

References AFNI_driver(), AFNI_GOOD_DTYPE, BADNEWS, BYTE_ORDER_STRING, RT_input::datum, RT_input::dtype, DTYPE_2DZ, DTYPE_2DZT, DTYPE_3D, DTYPE_3DT, RT_input::dzz, RT_input::func_code, RT_input::func_func, FUNC_NONE, IM3D_OPEN, RT_input::image_mode, RT_input::imsize, MAX_CHAN, MAX_PIN, MCW_strncpy, MIN_PIN, mri_datum_size(), n1, NBUF, RT_input::note, RT_input::nr, RT_input::num_chan, RT_input::num_note, RT_input::nxx, RT_input::nyy, NZMAX, RT_input::nzseq, RT_input::nzz, OR3OK, ORCODE, RT_input::orcxx, RT_input::orcyy, RT_input::orczz, RT_input::p_expr, plint, plot_ts_xypush(), realloc, RT_input::reg_graph, RT_input::reg_graph_xnew, RT_input::reg_graph_xr, RT_input::reg_graph_ynew, RT_input::reg_graph_yr, REG_IS_3D, RT_input::reg_mode, REGMODE_NONE, RT_input::root_prefix, RT_check_info(), RT_MAX_EXPR, RT_parser_init(), RT_set_grapher_pinnums(), STARTER, RT_input::swap_on_read, THD_filename_pure(), THD_MAX_PREFIX, RT_input::tpattern, RT_input::tr, typ, verbose, VMCHECK, xc, RT_input::xcen, RT_input::xxdcode, RT_input::xxfov, RT_input::xxoff, RT_input::xxorg, yc, RT_input::ycen, RT_input::yydcode, RT_input::yyfov, RT_input::yyoff, RT_input::yyorg, RT_input::zcen, RT_input::zgap, RT_input::zorder, ZORDER_ALT, ZORDER_EXP, RT_input::zorder_lock, ZORDER_SEQ, RT_input::zseq, RT_input::zzdcode, RT_input::zzfov, RT_input::zzoff, and RT_input::zzorg.

Referenced by RT_worker().

02027 {
02028    int ii , jj , nstart,nend , nuse , nbuf ;
02029    char buf[NBUF] ;
02030 
02031    if( rtin == NULL || info == NULL || ninfo == 0 ) return -1 ;
02032 
02033    for( nend=0 ; nend < ninfo && info[nend] != '\0' ; nend++ ) ; /* nada */
02034    if( nend == ninfo ){
02035       fprintf(stderr,"RT: info string not NUL-terminated!\a\n") ;
02036       return -1 ;
02037    }
02038 
02039    /******************************************/
02040    /** Scan ahead until next command string **/
02041 
02042    nstart = 0 ;
02043    while( nstart < nend ){
02044 
02045       /** skip whitespace **/
02046 
02047       for( ; nstart < nend && isspace(info[nstart]) ; nstart++ ) ; /* nada */
02048       if( nstart >= nend ) break ;
02049 
02050       /** copy characters into buf until the next '\n' or '\0' **/
02051 
02052       for( nbuf=0,jj=nstart ; nbuf < NBUF && info[jj] != '\n' && info[jj] != '\0' ; ){
02053          buf[nbuf++] = info[jj++] ;
02054       }
02055       if( nbuf == NBUF ){
02056          fprintf(stderr,"RT: line buffer overflow in control information!\a\n") ;
02057          nbuf-- ;
02058       }
02059       buf[nbuf] = '\0' ; nstart = jj ;
02060 
02061       if( verbose == 2 )
02062          fprintf(stderr,"RT: info line buffer=%s\n",buf) ;
02063       VMCHECK ;
02064 
02065       /************************************/
02066       /*** Scan for legal input strings ***/
02067 
02068       if( STARTER("ACQUISITION_TYPE") ){
02069          char typ[32] ;
02070 
02071          sscanf( buf , "ACQUISITION_TYPE %31s" , typ ) ;
02072 
02073               if( strcmp(typ,"2D+z")  == 0 ) rtin->dtype = DTYPE_2DZ ;
02074          else if( strcmp(typ,"2D+zt") == 0 ) rtin->dtype = DTYPE_2DZT ;
02075          else if( strcmp(typ,"3D")    == 0 ) rtin->dtype = DTYPE_3D ;
02076          else if( strcmp(typ,"3D+t")  == 0 ) rtin->dtype = DTYPE_3DT ;
02077          else
02078               BADNEWS ;
02079 
02080 #ifdef ALLOW_REGISTRATION
02081 
02082       /* Some troublesome physicist, let's just call him "Tom" (possibly
02083        * named by his mother, Mrs. Ross), wants control over the ranges
02084        * in the motion correction graph window.
02085        *                                                29 Jan 2004 [rickr] */
02086 
02087       } else if( STARTER("GRAPH_XRANGE") ){
02088          float fval = 0.0 ;
02089          sscanf( buf , "GRAPH_XRANGE %f" , &fval ) ;
02090          if( fval >= MIN_PIN && fval <= MAX_PIN ) {
02091              rtin->reg_graph_xnew = 1;
02092              rtin->reg_graph_xr   = fval;
02093 
02094              if( rtin->reg_graph && REG_IS_3D(rtin->reg_mode) &&
02095                  IM3D_OPEN(plint->im3d) )
02096              {
02097                  plot_ts_xypush(1-rtin->reg_graph_xnew, 1-rtin->reg_graph_ynew);
02098                  RT_set_grapher_pinnums((int)(fval+0.5));
02099              }
02100 
02101          } else
02102               BADNEWS ;
02103 
02104       } else if( STARTER("GRAPH_YRANGE") ){
02105          float fval = 0.0 ;
02106          sscanf( buf , "GRAPH_YRANGE %f" , &fval ) ;
02107          if( fval > 0.0 ) {
02108             rtin->reg_graph_ynew = 1;
02109             rtin->reg_graph_yr   = fval ;
02110 
02111             /* if the user sets scales, don't 'push'    11 Feb 2004 [rickr] */
02112             if( rtin->reg_graph && REG_IS_3D(rtin->reg_mode) )
02113                 plot_ts_xypush(1-rtin->reg_graph_xnew, 1-rtin->reg_graph_ynew);
02114          } else
02115             BADNEWS ;
02116 
02117       /* Allow the user to specify an expression, to evalue the six motion
02118        * parameters into one.
02119        *                                                12 Feb 2004 [rickr] */
02120       } else if( STARTER("GRAPH_EXPR") ){
02121          sscanf( buf , "GRAPH_EXPR %1024s" , rtin->p_expr ) ;
02122          rtin->p_expr[RT_MAX_EXPR] = '\0';
02123          if ( RT_parser_init(rtin) != 0 )
02124             BADNEWS ;
02125 #endif
02126 
02127       } else if( STARTER("NAME") ){
02128          char npr[THD_MAX_PREFIX] = "\0" ;
02129          /* RT_MAX_PREFIX is used here, currently 100 */
02130          sscanf( buf , "NAME %100s" , npr ) ; /* 31->100  29 Jan 2004 [rickr] */
02131          if( THD_filename_pure(npr) ) strcpy( rtin->root_prefix , npr ) ;
02132          else
02133               BADNEWS ;
02134 
02135       } else if( STARTER("PREFIX") ){           /* 01 Aug 2002 */
02136          char npr[THD_MAX_PREFIX] = "\0" ;
02137          /* RT_MAX_PREFIX is used here, currently 100 */
02138          sscanf( buf , "PREFIX %100s" , npr ) ;
02139          if( THD_filename_pure(npr) ) strcpy( rtin->root_prefix , npr ) ;
02140          else
02141               BADNEWS ;
02142 
02143       } else if( STARTER("NOTE") ) {            /* 01 Oct 2002: notes list */
02144          int nn = rtin->num_note ;
02145          if( nbuf > 6 ){
02146            int ii ;
02147            rtin->note = realloc( rtin->note , sizeof(char *)*(nn+1) ); /* extend array */
02148            rtin->note[nn] = strdup(buf+5) ;                            /* skip "NOTE "  */
02149            for( ii=0 ; rtin->note[nn][ii] != '\0' ; ii++ )             /* '\n' insertion */
02150              if( rtin->note[nn][ii] == '\a' || rtin->note[nn][ii] == '\f' )
02151                rtin->note[nn][ii] = '\n';
02152            rtin->num_note ++ ;
02153          } else
02154            BADNEWS ;
02155 
02156       } else if( STARTER("NUMVOL") ){
02157          int val = 0 ;
02158          sscanf( buf , "NUMVOL %d" , &val ) ;
02159          if( val > 0 ) rtin->nr = val ;
02160          else
02161               BADNEWS ;
02162 
02163       } else if( STARTER("TR") ){          /* units are seconds */
02164          float val = 0.0 ;
02165          sscanf( buf , "TR %f" , &val ) ;
02166          if( val > 0.0 ) rtin->tr = val ;
02167          else
02168               BADNEWS ;
02169 
02170       } else if( STARTER("ZDELTA") ){
02171          float val = 0.0 ;
02172          sscanf( buf , "ZDELTA %f" , &val ) ;
02173          if( val > 0.0 ) rtin->dzz = val ;
02174          else
02175               BADNEWS ;
02176          if( verbose == 2 )
02177             fprintf(stderr,"RT: dzz = %g\n",rtin->dzz) ;
02178          VMCHECK ;
02179 
02180       } else if( STARTER("ZGAP") ){               /* 18 Dec 2002 */
02181          float val = 0.0 ;
02182          sscanf( buf , "ZGAP %f" , &val ) ;
02183          if( val >= 0.0 ) rtin->zgap = val ;
02184          else
02185               BADNEWS ;
02186          if( verbose == 2 )
02187             fprintf(stderr,"RT: zgap = %g\n",rtin->zgap) ;
02188          VMCHECK ;
02189 
02190       } else if( STARTER("XYZOFF") ){             /* 18 Dec 2002 */
02191          float xval = 0.0 , yval = 0.0 , zval = 0.0 ;
02192          sscanf( buf , "XYZOFF %f %f %f" , &xval , &yval , &zval ) ;
02193          rtin->xxoff = xval ; rtin->xcen = 1 ;
02194          rtin->yyoff = yval ; rtin->ycen = 1 ;
02195          rtin->zzoff = zval ; rtin->zcen = 1 ;
02196          if( verbose == 2 )
02197             fprintf(stderr,"RT: offset = %g %g %g\n",rtin->xxoff,rtin->yyoff,rtin->zzoff) ;
02198          VMCHECK ;
02199 
02200       } else if( STARTER("ZFIRST") ){   /* set z origin */
02201          float val = 0.0 ;
02202          char dcode = ' ' ;
02203          sscanf( buf , "ZFIRST %f%c" , &val,&dcode ) ;
02204          rtin->zzorg   = val ;
02205          rtin->zcen    = 0 ;
02206          rtin->zzdcode = ORCODE(dcode) ;
02207          if( verbose == 2 )
02208             fprintf(stderr,"RT: zzorg = %g%c\n" ,
02209                     rtin->zzorg ,
02210                     (rtin->zzdcode < 0) ? ' ' : ORIENT_first[rtin->zzdcode] ) ;
02211          VMCHECK ;
02212 
02213       } else if( STARTER("XYZFIRST") ){  /* 10 Dec 2002: set all origins */
02214          float xf=0.0,yf=0.0,zf=0.0 ;
02215          char  xc=' ',yc=' ',zc=' ' ;
02216          sscanf( buf , "XYZFIRST %f%c%f%c%f%c" , &xf,&xc,&yf,&yc,&zf,&zc ) ;
02217          rtin->xxorg = xf ; rtin->xcen = 0 ; rtin->xxdcode = ORCODE(xc) ;
02218          rtin->yyorg = yf ; rtin->ycen = 0 ; rtin->yydcode = ORCODE(yc) ;
02219          rtin->zzorg = zf ; rtin->zcen = 0 ; rtin->zzdcode = ORCODE(zc) ;
02220          if( verbose == 2 )
02221             fprintf(stderr,"RT: xxorg=%g%c yyorg=%g%c zzorg=%g%c\n" ,
02222                     rtin->xxorg ,
02223                     (rtin->xxdcode < 0) ? ' ' : ORIENT_first[rtin->xxdcode] ,
02224                     rtin->yyorg ,
02225                     (rtin->yydcode < 0) ? ' ' : ORIENT_first[rtin->yydcode] ,
02226                     rtin->zzorg ,
02227                     (rtin->zzdcode < 0) ? ' ' : ORIENT_first[rtin->zzdcode]
02228                    ) ;
02229          VMCHECK ;
02230 
02231       } else if( STARTER("XYFOV") ){
02232          float xval = 0.0 , yval = 0.0 , zval = 0.0 ;
02233          sscanf( buf , "XYFOV %f %f %f" , &xval , &yval , &zval ) ;
02234          if( xval > 0.0 ){
02235             rtin->xxfov = xval ;
02236             rtin->yyfov = (yval > 0.0) ? yval : xval ;
02237             if( zval > 0.0 ) rtin->zzfov = zval ;
02238          } else
02239                 BADNEWS ;
02240          if( verbose == 2 )
02241             fprintf(stderr,"RT: fov = %g %g %g\n",rtin->xxfov,rtin->yyfov,rtin->zzfov) ;
02242          VMCHECK ;
02243 
02244       } else if( STARTER("XYMATRIX") ){
02245          int xval = 0 , yval = 0 , zval = 0 ;
02246          sscanf( buf , "XYMATRIX %d %d %d" , &xval , &yval , &zval ) ;
02247          if( xval > 1 ){
02248             rtin->nxx = xval ;
02249             rtin->nyy = (yval > 1) ? yval : xval ;
02250             if( zval > 0 ){
02251                rtin->nzz = zval ;
02252                if( rtin->nzz < 1 ) fprintf(stderr,"RT: # slices = %d!\a\n",zval) ;
02253             }
02254          } else
02255                 BADNEWS ;
02256          if( verbose == 2 )
02257             fprintf(stderr,"RT: matrix = %d %d %d\n",rtin->nxx,rtin->nyy,rtin->nzz) ;
02258          VMCHECK ;
02259 
02260       } else if( STARTER("ZNUM") ){
02261          int zval = 0 ;
02262          sscanf( buf , "ZNUM %d" , &zval ) ;
02263          if( zval > 0 ){
02264              rtin->nzz = zval ;
02265              if( rtin->nzz < 1 ) fprintf(stderr,"RT: # slices = %d!\a\n",zval) ;
02266          }
02267          else
02268               BADNEWS ;
02269          if( verbose == 2 && rtin->nzz >= 1 )
02270             fprintf(stderr,"RT: # slices = %d\n",rtin->nzz) ;
02271          VMCHECK ;
02272 
02273       } else if( STARTER("DATUM") ){
02274          int ii ;
02275          char tstr[32] = "\0" ;
02276          sscanf( buf , "DATUM %31s" , tstr ) ;
02277          for( ii=0 ; ii <= LAST_MRI_TYPE ; ii++ )
02278             if( strcmp(tstr,MRI_TYPE_name[ii]) == 0 ) break ;
02279 
02280          if( AFNI_GOOD_DTYPE(ii) ) rtin->datum = ii ;
02281          else
02282               BADNEWS ;
02283          if( verbose == 2 )
02284             fprintf(stderr,"RT: datum code = %d\n",rtin->datum) ;
02285          VMCHECK ;
02286 
02287       } else if( STARTER("BYTEORDER") ){    /* 27 Jun 2003:           [rickr] */
02288          int bo = 0 ;
02289          char tstr[10] = "\0" ;
02290          sscanf( buf, "BYTEORDER %9s", tstr ) ;
02291 
02292          /* first, note the incoming endian */
02293          if      ( strncmp(tstr,"LSB_FIRST",9) == 0 ) bo = LSB_FIRST ;
02294          else if ( strncmp(tstr,"MSB_FIRST",9) == 0 ) bo = MSB_FIRST ;
02295          else
02296              BADNEWS ;
02297 
02298          /* if different from the local endian, we will swap bytes */
02299          if ( bo != 0 ) {
02300             int local_bo, one = 1;
02301             local_bo = (*(char *)&one == 1) ? LSB_FIRST : MSB_FIRST ;
02302 
02303             /* if we are informed, and the orders differ, we will swap */
02304             if ( bo != local_bo )
02305                 rtin->swap_on_read = 1 ;
02306          }
02307 
02308          if( verbose > 1 )
02309             fprintf(stderr,"RT: BYTEORDER string = '%s', swap_on_read = %d\n",
02310                     BYTE_ORDER_STRING(bo), rtin->swap_on_read) ;
02311       } else if( STARTER("LOCK_ZORDER") ){  /* 22 Feb 1999:                   */
02312          rtin->zorder_lock = 1 ;            /* allow program to 'lock' zorder,*/
02313                                             /* so that later changes are      */
02314       } else if( STARTER("ZORDER") ){       /* ineffective.                   */
02315          if( ! rtin->zorder_lock ){
02316            char str[32] = "\0" ; int nord=0 , nb = 0 , nq ;
02317            sscanf( buf , "ZORDER %31s%n" , str , &nb ) ;
02318                 if( strcmp(str,"alt") == 0 ) rtin->zorder = ZORDER_ALT ;
02319            else if( strcmp(str,"seq") == 0 ) rtin->zorder = ZORDER_SEQ ;
02320            else if( strcmp(str,"explicit") == 0 ){
02321               rtin->zorder = ZORDER_EXP ;
02322               do{                                  /* get all numbers */
02323                  rtin->zseq[nord] = -1 ; nq = -1 ;
02324                  sscanf(buf+nb , "%d%n" , &(rtin->zseq[nord]) , &nq) ;
02325                  if( nq < 1 ) break ;              /* failed to get */
02326                  nb += nq ; nord++ ;               /* otherwise, increment */
02327               } while( nb < nbuf ) ;               /* until end of buffer */
02328               rtin->nzseq = nord ;                 /* number found */
02329               if( nord < 1 || nord > NZMAX ) BADNEWS ;
02330            }
02331            else
02332                 BADNEWS ;
02333          }
02334 
02335       } else if( STARTER("TPATTERN") ){               /* get timing pattern  */
02336          if( ! rtin->zorder_lock ){                   /* 10 May 2005 [rickr] */
02337            char str[32] = "\0" ;
02338            sscanf( buf , "TPATTERN %31s" , str ) ;
02339                 if( strcmp(str,"alt+z") == 0 ) rtin->tpattern = ZORDER_ALT ;
02340            else if( strcmp(str,"seq+z") == 0 ) rtin->tpattern = ZORDER_SEQ ;
02341            else
02342                 BADNEWS ;
02343          }
02344 
02345       } else if( STARTER("XYZAXES") ){
02346          int ii , orx=-1,ory=-1,orz=-1 ;
02347          char xstr[32] = "\0" , ystr[32] = "\0" , zstr[32] = "\0" ;
02348 
02349          sscanf( buf , "XYZAXES %31s %31s %31s" , xstr,ystr,zstr ) ;
02350 
02351          for( ii=0 ; ii < 6 ; ii++ ){
02352             if( strcmp(xstr,ORIENT_shortstr[ii]) == 0 ||
02353                 strcmp(xstr,ORIENT_typestr[ii])  == 0 ||
02354                 strcmp(xstr,ORIENT_tinystr[ii])  == 0   ) orx = ii ;
02355 
02356             if( strcmp(ystr,ORIENT_shortstr[ii]) == 0 ||
02357                 strcmp(ystr,ORIENT_typestr[ii])  == 0 ||
02358                 strcmp(ystr,ORIENT_tinystr[ii])  == 0   ) ory = ii ;
02359 
02360             if( strcmp(zstr,ORIENT_shortstr[ii]) == 0 ||
02361                 strcmp(zstr,ORIENT_typestr[ii])  == 0 ||
02362                 strcmp(zstr,ORIENT_tinystr[ii])  == 0   ) orz = ii ;
02363          }
02364 
02365          if( orx >= 0 && ory >= 0 && orz >= 0 && OR3OK(orx,ory,orz) ){
02366             rtin->orcxx = orx ;
02367             rtin->orcyy = ory ;
02368             rtin->orczz = orz ;
02369          } else
02370                 BADNEWS ;
02371 
02372       } else if( STARTER("NUM_CHAN") ){     /* 01 Aug 2002 */
02373          int nn=0 ;
02374          sscanf( buf , "NUM_CHAN %d",&nn) ;
02375          if( nn >= 1 && nn <= MAX_CHAN )
02376            rtin->num_chan = nn ;
02377          else
02378                 BADNEWS ;
02379 
02380       } else if( STARTER("DRIVE_AFNI") ){   /* 30 Jul 2002 */
02381          char cmd[1024]="\0" ;
02382          int ii ;
02383          if( strlen(buf) < 11 ){
02384             fprintf(stderr,"RT: DRIVE_AFNI lacks command\n") ;
02385          } else {  /* the command is everything after "DRIVE_AFNI " */
02386             MCW_strncpy(cmd,buf+11,1024) ;
02387             if( verbose == 2 )
02388                fprintf(stderr,"RT: command DRIVE_AFNI %s\n",cmd) ;
02389             ii = AFNI_driver( cmd ) ;  /* just do it */
02390             if( ii < 0 )
02391                fprintf(stderr,"RT: command DRIVE_AFNI %s **FAILS**\n",cmd) ;
02392          }
02393 
02394       } else {                              /* this is bad news */
02395          BADNEWS ;
02396       }
02397    }  /* end of loop over command buffers */
02398 
02399    /** now, determine if enough information exists to create a dataset **/
02400 
02401    if( rtin->image_mode ){
02402       rtin->nzz      = 1 ;  /* 28 Apr 2000 */
02403       rtin->num_chan = 1 ;  /* 01 Aug 2002 */
02404    }
02405 
02406    /** 01 Aug 2002: turn some things off in multi-channel mode **/
02407 
02408    if( rtin->num_chan > 1 ){
02409 
02410      if( rtin->reg_mode > 0 && verbose )
02411        fprintf(stderr,"RT: %d channel acquisition => no registration!\n",rtin->num_chan) ;
02412 
02413      if( rtin->func_code > 0 && verbose )
02414        fprintf(stderr,"RT: %d channel acquisition => no function!\n"    ,rtin->num_chan) ;
02415 
02416      rtin->reg_mode  = REGMODE_NONE ;  /* no registration */
02417      rtin->func_code = FUNC_NONE ;     /* no function */
02418      rtin->func_func = NULL ;
02419      rtin->reg_graph = 0 ;
02420    }
02421 
02422    if( rtin->nzz == 1 ){                   /* 24 Jun 2002: 1 slice only? */
02423      rtin->zorder = ZORDER_SEQ ;
02424      rtin->tpattern = ZORDER_SEQ ;
02425      if( REG_IS_3D(rtin->reg_mode) ){
02426        rtin->reg_mode = REGMODE_NONE ;
02427        fprintf(stderr,"RT: can't do 3D registration on 2D dataset!\n") ;
02428      }
02429    }
02430 
02431    RT_check_info( rtin , 0 ) ;
02432 
02433    /** if possible, now compute the number of bytes in each input image **/
02434 
02435    if( AFNI_GOOD_DTYPE(rtin->datum) && rtin->nxx > 0 && rtin->nyy > 0 ){
02436       int n1 = mri_datum_size( rtin->datum ) ;
02437 
02438       if( rtin->dtype == DTYPE_2DZT || rtin->dtype == DTYPE_2DZ )
02439          rtin->imsize = rtin->nxx * rtin->nyy * n1 ;
02440       else if( rtin->nzz > 0 )
02441          rtin->imsize = rtin->nxx * rtin->nyy * rtin->nzz * n1 ;
02442    }
02443 
02444    /* validate data type when swapping */
02445    if ( rtin->swap_on_read == 1 ) {
02446 
02447       if( (rtin->datum != MRI_short) &&         /* if the type is not okay, */
02448           (rtin->datum != MRI_int)   &&         /* then turn off swapping   */
02449           (rtin->datum != MRI_float) &&
02450           (rtin->datum != MRI_complex) )
02451       {
02452          if( rtin->datum != MRI_byte )          /* don't complain about bytes */
02453              fprintf(stderr,"RT: BYTEORDER applies only to short, int, float "
02454                             "or complex\n");
02455          rtin->swap_on_read = 0;
02456       }
02457    }
02458 
02459    /** return the number of characters processed **/
02460 
02461    return (nend+1) ;
02462 }

void RT_process_xevents RT_input  
 

Definition at line 1228 of file plug_realtime.c.

References ev, MAX_NEV, THE_DISPLAY, THE_TOPSHELL, and verbose.

Referenced by RT_process_data().

01229 {
01230    Display * dis = THE_DISPLAY ;
01231    XEvent ev ; int nev=0 ;
01232 
01233    XSync( dis , False ) ;
01234    while( nev++ < MAX_NEV &&
01235           XCheckMaskEvent(dis ,
01236                           ButtonMotionMask   |PointerMotionMask|
01237                           ButtonPressMask    |ButtonReleaseMask|
01238                           KeyPressMask       |KeyReleaseMask   |
01239                           StructureNotifyMask|ExposureMask      ,&ev) ){
01240 
01241           XtDispatchEvent( &ev ) ;  /* do the actual work for this event */
01242    }
01243    XmUpdateDisplay(THE_TOPSHELL) ;
01244    if( verbose == 2 && nev > 1 )
01245       fprintf(stderr,"RT: processed %d events\n",nev-1);
01246    return ;
01247 }

void RT_read_image RT_input  ,
char *   
 

Definition at line 2947 of file plug_realtime.c.

References RT_input::buf, COMMAND_MARKER, COMMAND_MARKER_LENGTH, RT_input::datum, EXIT, RT_input::imsize, RT_input::ioc_data, iochan_recvall(), RT_input::marked_for_death, memcmp(), MIN, mri_swap2(), mri_swap4(), RT_input::nbuf, and RT_input::swap_on_read.

Referenced by RT_process_data().

02948 {
02949    int need , have , nbuffed ;
02950 
02951    /** sanity checks **/
02952 
02953    if( rtin == NULL || im == NULL ){
02954      fprintf(stderr,"RT: illegal inputs to RT_read_image!\a\n") ;
02955      EXIT(1) ;
02956    }
02957 
02958    if( rtin->imsize <= 0 ){
02959      fprintf(stderr,"RT: image data present, but don't know its size!\a\n") ;
02960      EXIT(1) ;
02961    }
02962 
02963    /** see if any data in buffer already **/
02964 
02965    have = rtin->nbuf ;
02966 
02967    /** if we have data already, use it first **/
02968 
02969    if( have > 0 ){
02970 
02971       nbuffed = MIN( have , rtin->imsize ) ;  /* how much to read from buffer */
02972       memcpy( im , rtin->buf , nbuffed ) ;    /* copy it into image */
02973 
02974       if( nbuffed < have ){                   /* didn't use up all of buffer */
02975          memmove( rtin->buf , rtin->buf + nbuffed , rtin->nbuf - nbuffed ) ;
02976          rtin->nbuf = rtin->nbuf - nbuffed ;
02977       } else {                                /* used up all of buffer */
02978          rtin->nbuf = 0 ;
02979       }
02980    } else {
02981       nbuffed = 0 ;
02982    }
02983 
02984    /** at this point, nbuffed is the number of bytes read from the buffer.
02985        if we need to read more bytes from the I/O channel, then do so now. **/
02986 
02987    need = rtin->imsize - nbuffed ;  /* number of bytes left to fill image */
02988 
02989    /* read this many bytes for sure (waiting if need be) */
02990 
02991    if( need > 0 )
02992       iochan_recvall( rtin->ioc_data , im + nbuffed , need ) ;
02993 
02994    /* 10 Dec 2002:
02995       Check if the command string is present at the start of im.
02996       If it is, then mark rtin for death.                       */
02997 
02998    if( memcmp(im,COMMAND_MARKER,COMMAND_MARKER_LENGTH) == 0 )
02999      rtin->marked_for_death = 1 ;
03000    else {
03001       /* we have a complete image, check for byte swapping */
03002       if ( rtin->swap_on_read != 0 ) {
03003          if( rtin->datum == MRI_short )
03004             mri_swap2( rtin->imsize / 2, (short *)im );
03005          else
03006             mri_swap4( rtin->imsize / 4, (int *)im );
03007       }
03008    }
03009 
03010 
03011    return ;
03012 }

void RT_registration_2D_atend RT_input   rtin
 

Definition at line 3853 of file plug_realtime.c.

References RT_input::dset, DSET_delete, DSET_NUM_TIMES, RT_input::nvol, RT_input::reg_2dbasis, RT_input::reg_base_index, RT_input::reg_dset, RT_input::reg_mode, REG_strings, REGMODE_2D_ATEND, REGMODE_NONE, RT_registration_2D_close(), RT_registration_2D_onevol(), RT_registration_2D_setup(), SHOW_AFNI_PAUSE, SHOW_AFNI_READY, SHOW_TIMES, THE_TOPSHELL, tt, and verbose.

Referenced by RT_finish_dataset().

03854 {
03855    int tt , ntt ;
03856 
03857    /* check if have enough data to register as ordered */
03858 
03859    if( rtin->reg_base_index >= rtin->nvol[0] ){
03860       fprintf(stderr,"RT: can't do %s registration: not enough 3D volumes!\a\n",
03861               REG_strings[REGMODE_2D_ATEND] ) ;
03862       DSET_delete( rtin->reg_dset ) ; rtin->reg_dset = NULL ;
03863       rtin->reg_mode = REGMODE_NONE ;
03864       return ;
03865    }
03866 
03867    /* set up the registration process */
03868 
03869    if( verbose )
03870       fprintf(stderr,"RT: starting 2D registration 'at end'\n") ;
03871 
03872    SHOW_AFNI_PAUSE ;
03873    RT_registration_2D_setup( rtin ) ;
03874 
03875    if( rtin->reg_2dbasis == NULL ){
03876       fprintf(stderr,"RT: can't setup %s registration!\a\n",
03877               REG_strings[REGMODE_2D_ATEND] ) ;
03878       DSET_delete( rtin->reg_dset ) ; rtin->reg_dset = NULL ;
03879       rtin->reg_mode = REGMODE_NONE ;
03880       SHOW_AFNI_READY ; return ;
03881    }
03882 
03883    /* register each volume into the new dataset */
03884 
03885    ntt = DSET_NUM_TIMES( rtin->dset[0] ) ;
03886    for( tt=0 ; tt < ntt ; tt++ ){
03887       XmUpdateDisplay( THE_TOPSHELL ) ;
03888       RT_registration_2D_onevol( rtin , tt ) ;
03889       if( verbose == 1 ) fprintf(stderr,"%d",tt%10) ;
03890    }
03891    if( verbose == 1 ) fprintf(stderr,"\n") ;
03892 
03893    /* un-setup the registration process */
03894 
03895    RT_registration_2D_close( rtin ) ;
03896    if( verbose ) SHOW_TIMES ;
03897    SHOW_AFNI_READY ; return ;
03898 }

void RT_registration_2D_close RT_input   rtin
 

Definition at line 3944 of file plug_realtime.c.

References RT_input::dset, DSET_NZ, free, mri_2dalign_cleanup(), nz, and RT_input::reg_2dbasis.

Referenced by RT_registration_2D_atend().

03945 {
03946    int kk , nz ;
03947 
03948    nz = DSET_NZ( rtin->dset[0] ) ;
03949    for( kk=0 ; kk < nz ; kk++ )
03950       mri_2dalign_cleanup( rtin->reg_2dbasis[kk] ) ;
03951 
03952    free( rtin->reg_2dbasis ) ; rtin->reg_2dbasis = NULL ;
03953    return ;
03954 }

void RT_registration_2D_onevol RT_input   rtin,
int    tt
 

Definition at line 3965 of file plug_realtime.c.

References ADN_none, ADN_ntt, RT_input::datum, RT_input::dset, DSET_BRICK_ARRAY, DSET_BRICK_TYPE, DSET_delete, DSET_DX, DSET_DY, DSET_NX, DSET_NY, DSET_NZ, EDIT_add_brick(), EDIT_dset_items(), EDIT_substitute_brick(), free, malloc, mri_2dalign_one(), MRI_BYTE_PTR, mri_fix_data_pointer(), MRI_FLOAT_PTR, mri_free(), mri_new_vol_empty(), MRI_SHORT_PTR, mri_to_byte(), mri_to_short(), MRI_IMAGE::nvox, nz, MRI_IMAGE::pixel_size, R2DFAC, realloc, RT_input::reg_2dbasis, RT_input::reg_dset, RT_input::reg_dx, RT_input::reg_dy, RT_input::reg_mode, RT_input::reg_nest, RT_input::reg_nvol, RT_input::reg_phi, RT_input::reg_tim, REGMODE_NONE, THD_timeof_vox(), tt, and verbose.

Referenced by RT_registration_2D_atend(), and RT_registration_2D_realtime().

03966 {
03967    int kk , nx,ny,nz , kind , nbar ;
03968    MRI_IMAGE * im , * rim , * qim ;
03969    char * bar , * rar , * qar ;
03970    float dx,dy,phi ;        /* 17 Aug 1998 */
03971    int   nest , nxy ;
03972 
03973    /*-- sanity check --*/
03974 
03975    if( rtin->dset[0] == NULL || rtin->reg_dset == NULL ) return ;
03976 
03977    nx   = DSET_NX( rtin->dset[0] ) ;
03978    ny   = DSET_NY( rtin->dset[0] ) ; nxy = nx * ny ;
03979    nz   = DSET_NZ( rtin->dset[0] ) ;
03980    kind = DSET_BRICK_TYPE( rtin->dset[0] , 0 ) ;
03981 
03982    im   = mri_new_vol_empty( nx,ny,1 , kind ) ;     /* fake image for slices */
03983    bar  = DSET_BRICK_ARRAY( rtin->dset[0] , tt ) ;  /* ptr to input volume   */
03984    nbar = im->nvox * im->pixel_size ;               /* offset for each slice */
03985 
03986    /* make space for new sub-brick in reg_dset */
03987 
03988    if( verbose == 2 )
03989       fprintf(stderr,"RT: 2D registering sub-brick %d",tt) ;
03990 
03991    rar = (char *) malloc( sizeof(char) * nx*ny*nz * im->pixel_size ) ;
03992 
03993    if( rar == NULL ){
03994       fprintf(stderr,"RT: can't malloc space for registered dataset!\a\n") ;
03995       DSET_delete( rtin->reg_dset ) ; rtin->reg_dset = NULL ;
03996       rtin->reg_mode = REGMODE_NONE ;
03997       return ;
03998    }
03999 
04000    /*-- loop over slices --*/
04001 
04002    for( kk=0 ; kk < nz ; kk++ ){
04003 
04004       if( verbose == 2 ) fprintf(stderr,".") ;
04005 
04006       mri_fix_data_pointer( bar + kk*nbar , im ) ;  /* image to register */
04007 
04008       /* registration! */
04009 
04010       rim = mri_2dalign_one( rtin->reg_2dbasis[kk] , im , &dx , &dy , &phi ) ;
04011 
04012       /* 17 Aug 1998: save estimated motion parameters */
04013 
04014       nest = rtin->reg_nest ;
04015       rtin->reg_tim = (float *) realloc( (void *) rtin->reg_tim ,
04016                                          sizeof(float) * (nest+1) ) ;
04017       rtin->reg_dx  = (float *) realloc( (void *) rtin->reg_dx  ,
04018                                          sizeof(float) * (nest+1) ) ;
04019       rtin->reg_dy  = (float *) realloc( (void *) rtin->reg_dy  ,
04020                                          sizeof(float) * (nest+1) ) ;
04021       rtin->reg_phi = (float *) realloc( (void *) rtin->reg_phi ,
04022                                          sizeof(float) * (nest+1) ) ;
04023 
04024       rtin->reg_tim[nest] = THD_timeof_vox( tt , kk*nxy , rtin->dset[0] ) ;
04025       rtin->reg_dx [nest] = dx * DSET_DX(rtin->dset[0]) ;
04026       rtin->reg_dy [nest] = dy * DSET_DY(rtin->dset[0]) ;
04027       rtin->reg_phi[nest] = phi * R2DFAC             ; rtin->reg_nest ++ ;
04028 
04029       /* convert output image to desired type;
04030          set qar to point to data in the converted registered image */
04031 
04032       switch( kind ){
04033          case MRI_float:                        /* rim is already floats */
04034             qar = (char *) MRI_FLOAT_PTR(rim) ;
04035          break ;
04036 
04037          case MRI_short:
04038             qim = mri_to_short(1.0,rim) ; mri_free(rim) ; rim = qim ;
04039             qar = (char *) MRI_SHORT_PTR(rim) ;
04040          break ;
04041 
04042          case MRI_byte:
04043             qim = mri_to_byte(rim) ; mri_free(rim) ; rim = qim ;
04044             qar = (char *) MRI_BYTE_PTR(rim) ;
04045          break ;
04046 
04047          default:
04048             fprintf(stderr,"RT: can't do registration on %s images!\a\n",
04049                     MRI_TYPE_name[kind] ) ;
04050             DSET_delete( rtin->reg_dset ) ; rtin->reg_dset = NULL ;
04051             rtin->reg_mode = REGMODE_NONE ;
04052             free(rar) ;
04053             mri_free(rim) ; mri_fix_data_pointer(NULL,im) ; mri_free(im) ;
04054          return ;
04055       }
04056 
04057       /* copy data from registered image into output sub-brick */
04058 
04059       memcpy( rar + kk*nbar , qar , nbar ) ;
04060 
04061       mri_free(rim) ; /* don't need this no more no how */
04062    }
04063 
04064    mri_fix_data_pointer(NULL,im) ; mri_free(im) ;   /* get rid of this */
04065 
04066    /*-- attach rar to reg_dset --*/
04067 
04068    if( tt == 0 )
04069       EDIT_substitute_brick( rtin->reg_dset , 0 , rtin->datum , rar ) ;
04070    else
04071       EDIT_add_brick( rtin->reg_dset , rtin->datum , 0.0 , rar ) ;
04072 
04073    rtin->reg_nvol = tt+1 ;
04074 
04075    EDIT_dset_items( rtin->reg_dset , ADN_ntt , rtin->reg_nvol ,  ADN_none ) ;
04076 
04077    if( verbose == 2 ) fprintf(stderr,"\n") ;
04078    return ;
04079 }

void RT_registration_2D_realtime RT_input   rtin
 

Definition at line 3805 of file plug_realtime.c.

References RT_input::dset, DSET_delete, DSET_NUM_TIMES, RT_input::nvol, RT_input::reg_2dbasis, RT_input::reg_base_index, RT_input::reg_dset, RT_input::reg_mode, RT_input::reg_nvol, REG_strings, REGMODE_2D_RTIME, REGMODE_NONE, RT_registration_2D_onevol(), RT_registration_2D_setup(), SHOW_AFNI_PAUSE, SHOW_AFNI_READY, THE_TOPSHELL, and tt.

Referenced by RT_process_image().

03806 {
03807    int tt , ntt ;
03808 
03809    if( rtin->reg_dset == NULL ) return ;
03810 
03811    /*-- check to see if we need to setup first --*/
03812 
03813    if( rtin->reg_2dbasis == NULL ){  /* need to setup */
03814 
03815       /* check if enough data to setup */
03816 
03817       if( rtin->reg_base_index >= rtin->nvol[0] ) return ;  /* can't setup */
03818 
03819       /* setup the registration process */
03820 
03821       if( verbose )
03822          fprintf(stderr,"RT: setting up 2D registration 'realtime'\n") ;
03823 
03824       SHOW_AFNI_PAUSE ;
03825       RT_registration_2D_setup( rtin ) ;  /* may take a little while */
03826 
03827       if( rtin->reg_2dbasis == NULL ){
03828          fprintf(stderr,"RT: can't setup %s registration!\a\n",
03829                  REG_strings[REGMODE_2D_RTIME] ) ;
03830          DSET_delete( rtin->reg_dset ) ; rtin->reg_dset = NULL ;
03831          rtin->reg_mode = REGMODE_NONE ;
03832          SHOW_AFNI_READY ; return ;
03833       }
03834    }
03835 
03836    /*-- register all sub-bricks that aren't done yet --*/
03837 
03838    ntt = DSET_NUM_TIMES( rtin->dset[0] ) ;
03839    for( tt=rtin->reg_nvol ; tt < ntt ; tt++ )
03840       RT_registration_2D_onevol( rtin , tt ) ;
03841 
03842    /*-- my work here is done --*/
03843 
03844    XmUpdateDisplay( THE_TOPSHELL ) ;
03845    SHOW_AFNI_READY ; return ;
03846 }

void RT_registration_2D_setup RT_input   rtin
 

Definition at line 3904 of file plug_realtime.c.

References RT_input::dset, DSET_BRICK_ARRAY, DSET_BRICK_TYPE, DSET_NX, DSET_NY, DSET_NZ, malloc, mri_2dalign_method(), mri_2dalign_setup(), MRI_BICUBIC, MRI_BILINEAR, mri_fix_data_pointer(), mri_free(), MRI_HEPTIC, mri_new_vol_empty(), MRI_QUINTIC, MRI_IMAGE::nvox, nz, MRI_IMAGE::pixel_size, RT_input::reg_2dbasis, RT_input::reg_base_index, RT_input::reg_nvol, and RT_input::reg_resam.

Referenced by RT_registration_2D_atend(), and RT_registration_2D_realtime().

03905 {
03906    int ibase = rtin->reg_base_index ;
03907    int kk , nx,ny,nz , kind , nbar ;
03908    MRI_IMAGE * im ;
03909    char * bar ;
03910 
03911    nx   = DSET_NX( rtin->dset[0] ) ;
03912    ny   = DSET_NY( rtin->dset[0] ) ;
03913    nz   = DSET_NZ( rtin->dset[0] ) ;
03914    kind = DSET_BRICK_TYPE( rtin->dset[0] , ibase ) ;
03915 
03916    rtin->reg_nvol  = 0 ;
03917 
03918    rtin->reg_2dbasis = (MRI_2dalign_basis **)
03919                          malloc( sizeof(MRI_2dalign_basis *) * nz ) ;
03920 
03921    im   = mri_new_vol_empty( nx,ny,1 , kind ) ;        /* fake image for slices */
03922    bar  = DSET_BRICK_ARRAY( rtin->dset[0] , ibase ) ;  /* ptr to base volume    */
03923    nbar = im->nvox * im->pixel_size ;               /* offset for each slice */
03924 
03925    for( kk=0 ; kk < nz ; kk++ ){                         /* loop over slices */
03926       mri_fix_data_pointer( bar + kk*nbar , im ) ;             /* base image */
03927       rtin->reg_2dbasis[kk] = mri_2dalign_setup( im , NULL ) ;
03928    }
03929 
03930    kk = rtin->reg_resam ;
03931    if( kk == MRI_QUINTIC || kk == MRI_HEPTIC )
03932       kk = MRI_BICUBIC ; /* quintic & heptic not available in 2D */
03933 
03934    mri_2dalign_method( MRI_BILINEAR, MRI_BICUBIC, kk ) ;
03935 
03936    mri_fix_data_pointer( NULL , im ) ; mri_free( im ) ;   /* get rid of this */
03937    return ;
03938 }

void RT_registration_3D_atend RT_input   rtin
 

Definition at line 4231 of file plug_realtime.c.

References RT_input::dset, DSET_delete, DSET_NUM_TIMES, RT_input::nvol, RT_input::reg_3dbasis, RT_input::reg_base_index, RT_input::reg_dset, RT_input::reg_mode, REG_strings, REGMODE_NONE, RT_registration_3D_close(), RT_registration_3D_onevol(), RT_registration_3D_setup(), SHOW_AFNI_PAUSE, SHOW_AFNI_READY, SHOW_TIMES, THE_TOPSHELL, tt, and verbose.

Referenced by RT_finish_dataset().

04232 {
04233    int tt , ntt ;
04234 
04235    /* check if have enough data to register as ordered */
04236 
04237    if( rtin->reg_base_index >= rtin->nvol[0] ){
04238       fprintf(stderr,"RT: can't do %s registration: not enough 3D volumes!\a\n",
04239               REG_strings[rtin->reg_mode] ) ;
04240       DSET_delete( rtin->reg_dset ) ; rtin->reg_dset = NULL ;
04241       rtin->reg_mode = REGMODE_NONE ;
04242       return ;
04243    }
04244 
04245    /* set up the registration process */
04246 
04247    if( verbose )
04248       fprintf(stderr,"RT: starting 3D registration 'at end'\n") ;
04249 
04250    SHOW_AFNI_PAUSE ;
04251    RT_registration_3D_setup( rtin ) ;
04252 
04253    if( rtin->reg_3dbasis == NULL ){
04254       fprintf(stderr,"RT: can't setup %s registration!\a\n",
04255               REG_strings[rtin->reg_mode] ) ;
04256       DSET_delete( rtin->reg_dset ) ; rtin->reg_dset = NULL ;
04257       rtin->reg_mode = REGMODE_NONE ;
04258       SHOW_AFNI_READY ; return ;
04259    }
04260 
04261    /* register each volume into the new dataset */
04262 
04263    ntt = DSET_NUM_TIMES( rtin->dset[0] ) ;
04264    if( verbose == 1 ) fprintf(stderr,"RT: ") ;
04265    for( tt=0 ; tt < ntt ; tt++ ){
04266       XmUpdateDisplay( THE_TOPSHELL ) ;
04267       RT_registration_3D_onevol( rtin , tt ) ;
04268       if( verbose == 1 ) fprintf(stderr,"%d",tt%10) ;
04269    }
04270    if( verbose == 1 ) fprintf(stderr,"\n") ;
04271 
04272    /* un-setup the registration process */
04273 
04274    RT_registration_3D_close( rtin ) ;
04275    if( verbose ) SHOW_TIMES ;
04276    SHOW_AFNI_READY ; return ;
04277 }

void RT_registration_3D_close RT_input   rtin
 

Definition at line 4364 of file plug_realtime.c.

References mri_3dalign_cleanup(), and RT_input::reg_3dbasis.

Referenced by RT_registration_3D_atend().

04365 {
04366    mri_3dalign_cleanup( rtin->reg_3dbasis ) ;
04367    rtin->reg_3dbasis = NULL ;
04368    return ;
04369 }

void RT_registration_3D_onevol RT_input   rtin,
int    tt
 

Definition at line 4380 of file plug_realtime.c.

References ADN_none, ADN_ntt, c, RT_input::datum, THD_3dim_dataset::daxes, RT_input::dset, DSET_BRICK, DSET_delete, DSET_DX, DSET_DY, DSET_DZ, MRI_IMAGE::dx, MRI_IMAGE::dy, MRI_IMAGE::dz, EDIT_add_brick(), EDIT_dset_items(), EDIT_substitute_brick(), RT_input::hax1, RT_input::hax2, RT_input::hax3, mri_3dalign_one(), MRI_BYTE_PTR, mri_fix_data_pointer(), MRI_FLOAT_PTR, mri_free(), MRI_SHORT_PTR, mri_to_byte(), mri_to_short(), ORI_A2P_TYPE, ORI_I2S_TYPE, ORI_L2R_TYPE, ORI_P2A_TYPE, ORI_R2L_TYPE, ORI_S2I_TYPE, RT_input::p_atoz, RT_input::p_code, PARSER_evaluate_one(), R2DFAC, realloc, RT_input::reg_3dbasis, RT_input::reg_dset, RT_input::reg_dx, RT_input::reg_dy, RT_input::reg_dz, RT_input::reg_eval, RT_input::reg_mode, RT_input::reg_nest, RT_input::reg_nvol, RT_input::reg_phi, RT_input::reg_psi, RT_input::reg_rep, RT_input::reg_theta, RT_input::reg_tim, REGMODE_NONE, roll(), THD_timeof_vox(), tt, verbose, THD_dataxes::xxorient, THD_dataxes::yyorient, and THD_dataxes::zzorient.

Referenced by RT_registration_3D_atend(), and RT_registration_3D_realtime().

04381 {
04382    MRI_IMAGE * rim , * qim ;
04383    char * qar ;
04384    float dx,dy,dz , roll,pitch,yaw , ddx,ddy,ddz ;
04385    int   nest ;
04386 
04387    /*-- sanity check --*/
04388 
04389    if( rtin->dset[0] == NULL ) return ;
04390 
04391    /*-- actual registration --*/
04392 
04393    if( verbose == 2 )
04394       fprintf(stderr,"RT: 3D registering sub-brick %d\n",tt) ;
04395 
04396    qim     = DSET_BRICK(rtin->dset[0],tt) ;
04397    qim->dx = fabs( DSET_DX(rtin->dset[0]) ) ;  /* must set voxel dimensions */
04398    qim->dy = fabs( DSET_DY(rtin->dset[0]) ) ;
04399    qim->dz = fabs( DSET_DZ(rtin->dset[0]) ) ;
04400 
04401    rim = mri_3dalign_one( rtin->reg_3dbasis , qim ,
04402                           &roll , &pitch , &yaw , &dx , &dy , &dz ) ;
04403 
04404    /*-- massage and store movement parameters --*/
04405 
04406    roll  *= R2DFAC ; if( rtin->hax1 < 0 ) roll  = -roll  ;
04407    pitch *= R2DFAC ; if( rtin->hax2 < 0 ) pitch = -pitch ;
04408    yaw   *= R2DFAC ; if( rtin->hax3 < 0 ) yaw   = -yaw   ;
04409 
04410    switch( rtin->dset[0]->daxes->xxorient ){
04411       case ORI_R2L_TYPE: ddy =  dx; break ; case ORI_L2R_TYPE: ddy = -dx; break ;
04412       case ORI_P2A_TYPE: ddz = -dx; break ; case ORI_A2P_TYPE: ddz =  dx; break ;
04413       case ORI_I2S_TYPE: ddx =  dx; break ; case ORI_S2I_TYPE: ddx = -dx; break ;
04414    }
04415 
04416    switch( rtin->dset[0]->daxes->yyorient ){
04417       case ORI_R2L_TYPE: ddy =  dy; break ; case ORI_L2R_TYPE: ddy = -dy; break ;
04418       case ORI_P2A_TYPE: ddz = -dy; break ; case ORI_A2P_TYPE: ddz =  dy; break ;
04419       case ORI_I2S_TYPE: ddx =  dy; break ; case ORI_S2I_TYPE: ddx = -dy; break ;
04420    }
04421 
04422    switch( rtin->dset[0]->daxes->zzorient ){
04423       case ORI_R2L_TYPE: ddy =  dz; break ; case ORI_L2R_TYPE: ddy = -dz; break ;
04424       case ORI_P2A_TYPE: ddz = -dz; break ; case ORI_A2P_TYPE: ddz =  dz; break ;
04425       case ORI_I2S_TYPE: ddx =  dz; break ; case ORI_S2I_TYPE: ddx = -dz; break ;
04426    }
04427 
04428    nest = rtin->reg_nest ;
04429    rtin->reg_tim = (float *) realloc( (void *) rtin->reg_tim ,
04430                                       sizeof(float) * (nest+1) ) ;
04431    rtin->reg_dx  = (float *) realloc( (void *) rtin->reg_dx  ,
04432                                       sizeof(float) * (nest+1) ) ;
04433    rtin->reg_dy  = (float *) realloc( (void *) rtin->reg_dy  ,
04434                                       sizeof(float) * (nest+1) ) ;
04435    rtin->reg_dz  = (float *) realloc( (void *) rtin->reg_dz  ,
04436                                       sizeof(float) * (nest+1) ) ;
04437    rtin->reg_phi = (float *) realloc( (void *) rtin->reg_phi ,
04438                                       sizeof(float) * (nest+1) ) ;
04439    rtin->reg_psi = (float *) realloc( (void *) rtin->reg_psi ,
04440                                       sizeof(float) * (nest+1) ) ;
04441    rtin->reg_theta = (float *) realloc( (void *) rtin->reg_theta ,
04442                                       sizeof(float) * (nest+1) ) ;
04443    rtin->reg_rep   = (float *) realloc( (void *) rtin->reg_rep ,
04444                                       sizeof(float) * (nest+1) ) ;
04445    rtin->reg_eval   = (float *) realloc( (void *) rtin->reg_eval ,
04446                                       sizeof(float) * (nest+1) ) ;
04447 
04448    rtin->reg_tim[nest]   = THD_timeof_vox( tt , 0 , rtin->dset[0] ) ;
04449    rtin->reg_dx [nest]   = ddx   ;
04450    rtin->reg_dy [nest]   = ddy   ;
04451    rtin->reg_dz [nest]   = ddz   ;
04452    rtin->reg_phi[nest]   = roll  ;
04453    rtin->reg_psi[nest]   = pitch ;
04454    rtin->reg_theta[nest] = yaw   ;
04455    rtin->reg_rep[nest]   = tt    ;
04456 
04457    /* evaluate parser expression, since all input values are assigned here */
04458    if ( rtin->p_code )
04459    {
04460        int c ;
04461 
04462        /* clear extras, just to be safe */
04463        for ( c = 6; c < 26; c++ ) rtin->p_atoz[c] = 0;
04464 
04465        rtin->p_atoz[0] = ddx ; rtin->p_atoz[1] = ddy  ; rtin->p_atoz[2] = ddz;
04466        rtin->p_atoz[3] = roll; rtin->p_atoz[4] = pitch; rtin->p_atoz[5] = yaw;
04467 
04468        /* actually set the value via parser evaluation */
04469        rtin->reg_eval[nest] = PARSER_evaluate_one(rtin->p_code, rtin->p_atoz);
04470    }
04471 
04472    rtin->reg_nest ++ ; rtin->reg_nvol = tt+1 ;
04473 
04474    /*-- convert output image to desired type;
04475         set qar to point to data in the converted registered image --*/
04476 
04477    if( rim != NULL && rtin->reg_dset != NULL ){
04478       switch( rtin->datum ){
04479          case MRI_float:                        /* rim is already floats */
04480             qar = (char *) MRI_FLOAT_PTR(rim) ;
04481          break ;
04482 
04483          case MRI_short:
04484             qim = mri_to_short(1.0,rim) ; mri_free(rim) ; rim = qim ;
04485             qar = (char *) MRI_SHORT_PTR(rim) ;
04486          break ;
04487 
04488          case MRI_byte:
04489             qim = mri_to_byte(rim) ; mri_free(rim) ; rim = qim ;
04490             qar = (char *) MRI_BYTE_PTR(rim) ;
04491          break ;
04492 
04493          /* this case should not occur: */
04494 
04495          default:
04496             fprintf(stderr,"RT: can't do registration on %s images!\a\n",
04497                     MRI_TYPE_name[rtin->datum] ) ;
04498             DSET_delete( rtin->reg_dset ) ; rtin->reg_dset = NULL ;
04499             rtin->reg_mode = REGMODE_NONE ;
04500             mri_free(rim) ;
04501          return ;
04502       }
04503 
04504       /* attach to reg_dset */
04505 
04506       if( tt == 0 )
04507          EDIT_substitute_brick( rtin->reg_dset , 0 , rtin->datum , qar ) ;
04508       else
04509          EDIT_add_brick( rtin->reg_dset , rtin->datum , 0.0 , qar ) ;
04510 
04511       EDIT_dset_items( rtin->reg_dset , ADN_ntt , rtin->reg_nvol ,  ADN_none ) ;
04512 
04513       mri_fix_data_pointer(NULL,rim) ; mri_free(rim) ;   /* get rid of this */
04514    }
04515 
04516    return ;
04517 }

void RT_registration_3D_realtime RT_input   rtin
 

Definition at line 4113 of file plug_realtime.c.

References c, AFNI_library_type::dc, MCW_DC::display, RT_input::dset, DSET_delete, DSET_FILECODE, DSET_NUM_TIMES, free, GLOBAL_library, MEM_topshell_data::killfunc, malloc, RT_input::mp, RT_input::mp_tcp_use, MTD_killfunc(), RT_input::nvol, RT_input::p_code, plot_ts_addto(), plot_ts_init(), RT_input::reg_3dbasis, RT_input::reg_base_index, RT_input::reg_dset, RT_input::reg_dx, RT_input::reg_dy, RT_input::reg_dz, RT_input::reg_eval, RT_input::reg_graph, RT_input::reg_graph_xr, RT_input::reg_graph_yr, RT_input::reg_mode, RT_input::reg_nvol, RT_input::reg_phi, RT_input::reg_psi, RT_input::reg_rep, REG_strings, RT_input::reg_theta, REGMODE_3D_ESTIM, REGMODE_NONE, RT_mp_comm_init(), RT_mp_comm_init_vars(), RT_mp_comm_send_data(), RT_registration_3D_onevol(), RT_registration_3D_setup(), SHOW_AFNI_PAUSE, SHOW_AFNI_READY, THE_TOPSHELL, and tt.

Referenced by RT_process_image().

04114 {
04115    int tt , ntt , ttbot ;
04116 
04117    /*-- check to see if we need to setup first --*/
04118 
04119    if( rtin->reg_3dbasis == NULL ){  /* need to setup */
04120 
04121       /* check if enough data to setup */
04122 
04123       if( rtin->reg_base_index >= rtin->nvol[0] ) return ;  /* can't setup */
04124 
04125       /* setup the registration process */
04126 
04127       if( verbose ){
04128          if( rtin->reg_mode == REGMODE_3D_ESTIM )
04129             fprintf(stderr,"RT: setting up 3D registration 'estimate'\n") ;
04130          else
04131             fprintf(stderr,"RT: setting up 3D registration 'realtime'\n") ;
04132       }
04133 
04134       SHOW_AFNI_PAUSE ;
04135       RT_registration_3D_setup( rtin ) ;  /* may take a while */
04136 
04137       if( rtin->reg_3dbasis == NULL ){
04138          fprintf(stderr,"RT: can't setup %s registration!\a\n",
04139                  REG_strings[rtin->reg_mode] ) ;
04140          if( rtin->reg_dset != NULL ){
04141             DSET_delete( rtin->reg_dset ) ; rtin->reg_dset = NULL ;
04142          }
04143          rtin->reg_mode = REGMODE_NONE ;
04144          SHOW_AFNI_READY ; return ;
04145       }
04146 
04147       /* realtime graphing? */
04148 
04149       if( rtin->reg_graph == 2 ){
04150          int    ycount = -6 ;  /* default number of graphs */
04151          static char * nar[6] = {
04152             "\\Delta I-S [mm]" , "\\Delta R-L [mm]" , "\\Delta A-P [mm]" ,
04153             "Roll [\\degree]" , "Pitch [\\degree]" , "Yaw [\\degree]"  } ;
04154 
04155          char *ttl = malloc( strlen(DSET_FILECODE(rtin->dset[0])) + 32 ) ;
04156          strcpy(ttl,"\\noesc ") ;
04157          strcat(ttl,DSET_FILECODE(rtin->dset[0])) ;
04158          if( rtin->reg_mode == REGMODE_3D_ESTIM ) strcat(ttl," [Estimate]") ;
04159 
04160          /* if p_code, only plot the reg_eval */
04161          if ( rtin->p_code )
04162             ycount = 1;
04163 
04164          rtin->mp = plot_ts_init( GLOBAL_library.dc->display ,
04165                                   0.0,rtin->reg_graph_xr-1 ,
04166                                   ycount,-rtin->reg_graph_yr,rtin->reg_graph_yr,
04167                                   "reps", NULL, ttl, nar , NULL ) ;
04168 
04169          if( rtin->mp != NULL ) rtin->mp->killfunc = MTD_killfunc ;
04170 
04171          free(ttl) ;
04172 
04173          /* set up comm for motion params    30 Mar 2004 [rickr] */
04174          RT_mp_comm_init_vars( rtin ) ;
04175          if ( rtin->mp_tcp_use ) RT_mp_comm_init( rtin ) ;
04176       }
04177    }
04178 
04179    /*-- register all sub-bricks that aren't done yet --*/
04180 
04181    ntt   = DSET_NUM_TIMES( rtin->dset[0] ) ;
04182    ttbot = rtin->reg_nvol ;
04183    for( tt=ttbot ; tt < ntt ; tt++ )
04184       RT_registration_3D_onevol( rtin , tt ) ;
04185 
04186    if( rtin->mp != NULL && ntt > ttbot ){
04187       float        * yar[7] ;
04188       int            ycount = -6 ;
04189 
04190       yar[0] = rtin->reg_rep   + ttbot ;
04191       yar[1] = rtin->reg_dx    + ttbot ;
04192       yar[2] = rtin->reg_dy    + ttbot ;
04193       yar[3] = rtin->reg_dz    + ttbot ;
04194       yar[4] = rtin->reg_phi   + ttbot ;
04195       yar[5] = rtin->reg_psi   + ttbot ;
04196       yar[6] = rtin->reg_theta + ttbot ;
04197 
04198       /* send the data off over tcp connection          30 Mar 2004 [rickr] */
04199       if ( rtin->mp_tcp_use )
04200           RT_mp_comm_send_data( rtin, yar+1, ntt-ttbot );
04201 
04202       if( ttbot > 0 )  /* modify yar after send_data, when ttbot > 0 */
04203       {
04204           int c;
04205           for ( c = 0; c < 7; c++ )  /* apply the old ttbot-- */
04206               yar[c]--;
04207           ttbot-- ;
04208       }
04209 
04210       /* if p_code, only plot the reg_eval */
04211       if ( rtin->p_code )
04212       {
04213          ycount = 1;
04214          yar[1] = rtin->reg_eval + ttbot;
04215       }
04216 
04217       plot_ts_addto( rtin->mp , ntt-ttbot , yar[0] , ycount , yar+1 ) ;
04218    }
04219 
04220    /*-- my work here is done --*/
04221 
04222    XmUpdateDisplay( THE_TOPSHELL ) ;
04223    SHOW_AFNI_READY ; return ;
04224 }

void RT_registration_3D_setup RT_input   rtin
 

Definition at line 4288 of file plug_realtime.c.

References abs, RT_input::ax1, RT_input::ax2, RT_input::ax3, RT_input::dset, DSET_BRICK, DSET_DX, DSET_DY, DSET_DZ, MRI_IMAGE::dx, MRI_IMAGE::dy, MRI_IMAGE::dz, getenv(), RT_input::hax1, RT_input::hax2, RT_input::hax3, RT_input::iha, mri_3dalign_final_regmode(), mri_3dalign_method(), mri_3dalign_params(), mri_3dalign_setup(), MRI_CUBIC, MRI_LINEAR, nz, RT_input::reg_3dbasis, RT_input::reg_base_index, RT_input::reg_final_resam, RT_input::reg_mode, RT_input::reg_nvol, RT_input::reg_resam, REGMODE_3D_ATEND, REGMODE_3D_ESTIM, REGMODE_3D_RTIME, THD_axcode(), THD_handedness(), verbose, VL_DEL, VL_DPH, VL_DXY, and VL_MIT.

Referenced by RT_registration_3D_atend(), and RT_registration_3D_realtime().

04289 {
04290    int ibase = rtin->reg_base_index ;
04291    int kk , nx,ny,nz , kind , nbar ;
04292    MRI_IMAGE * im ;
04293    char * bar , * ept ;
04294 
04295    /*-- extract info about coordinate axes of dataset --*/
04296 
04297    rtin->iha  = THD_handedness( rtin->dset[0] )   ;  /* LH or RH? */
04298 
04299    rtin->ax1  = THD_axcode( rtin->dset[0] , 'I' ) ;
04300    rtin->hax1 = rtin->ax1 * rtin->iha      ;      /* roll */
04301 
04302    rtin->ax2  = THD_axcode( rtin->dset[0] , 'R' ) ;
04303    rtin->hax2 = rtin->ax2 * rtin->iha      ;      /* pitch */
04304 
04305    rtin->ax3  = THD_axcode( rtin->dset[0] , 'A' ) ;
04306    rtin->hax3 = rtin->ax3 * rtin->iha      ;      /* yaw */
04307 
04308    im     = DSET_BRICK(rtin->dset[0],ibase) ;
04309    im->dx = fabs( DSET_DX(rtin->dset[0]) ) ;  /* must set voxel dimensions */
04310    im->dy = fabs( DSET_DY(rtin->dset[0]) ) ;
04311    im->dz = fabs( DSET_DZ(rtin->dset[0]) ) ;
04312 
04313    switch( rtin->reg_mode ){
04314       default: rtin->reg_3dbasis = NULL ;   /* should not occur */
04315       return ;
04316 
04317       case REGMODE_3D_RTIME:                /* actual registration */
04318       case REGMODE_3D_ATEND:
04319          ept = getenv("AFNI_REALTIME_volreg_maxite") ;
04320          kk  = VL_MIT ;
04321          if( ept != NULL ){
04322             kk = strtol(ept,NULL,10) ; if( kk <= 0 ) kk = VL_MIT ;
04323          }
04324          mri_3dalign_params( kk , VL_DXY , VL_DPH , VL_DEL ,
04325                              abs(rtin->ax1)-1 , abs(rtin->ax2)-1 , abs(rtin->ax3)-1 , -1 ) ;
04326 
04327                                                            /* noreg , clipit */
04328          mri_3dalign_method( rtin->reg_resam , verbose==2 ,   0     , 1        ) ;
04329 
04330          mri_3dalign_final_regmode( rtin->reg_final_resam ) ;
04331 
04332          rtin->reg_3dbasis = mri_3dalign_setup( im ,  NULL ) ;
04333       break ;
04334 
04335       case REGMODE_3D_ESTIM:               /* just estimate motion */
04336          ept = getenv("AFNI_REALTIME_volreg_maxite_est") ;
04337          kk  = 1 ;
04338          if( ept != NULL ){
04339             kk = strtol(ept,NULL,10) ; if( kk <= 0 ) kk = 1 ;
04340          }
04341 
04342          mri_3dalign_params( kk , VL_DXY , VL_DPH , 2.0*VL_DEL ,
04343                              abs(rtin->ax1)-1 , abs(rtin->ax2)-1 , abs(rtin->ax3)-1 , -1 ) ;
04344 
04345          kk = MRI_CUBIC ;                     /* noreg , clipit */
04346          mri_3dalign_method( kk , verbose==2 ,   1     , 0        ) ;
04347 
04348          rtin->reg_3dbasis = mri_3dalign_setup( im ,  NULL ) ;
04349 #if 0
04350          kk = MRI_LINEAR ;
04351          mri_3dalign_method( kk , verbose==2 ,   1     , 0        ) ;
04352 #endif
04353       break ;
04354    }
04355 
04356    rtin->reg_nvol  = 0 ;
04357    return ;
04358 }

void RT_set_grapher_pinnums int    pinnum
 

tell afni about it one last time *

Definition at line 3789 of file plug_realtime.c.

References drive_MCW_grapher(), graDR_setpinnum, IM3D_OPEN, MAX_PIN, and plint.

Referenced by RT_main(), and RT_process_info().

03790 {
03791     /* 12 Oct 2000: set pin_num on all graphs now open */
03792 
03793     if( pinnum < MIN_PIN || pinnum > MAX_PIN || !IM3D_OPEN(plint->im3d) )
03794         return;
03795 
03796     drive_MCW_grapher( plint->im3d->g123, graDR_setpinnum, (XtPointer) pinnum );
03797     drive_MCW_grapher( plint->im3d->g231, graDR_setpinnum, (XtPointer) pinnum );
03798     drive_MCW_grapher( plint->im3d->g312, graDR_setpinnum, (XtPointer) pinnum );
03799 }

void RT_start_child RT_input   rtin
 

record the times for later reportage *

Definition at line 1603 of file plug_realtime.c.

References RT_input::child_info, RT_input::child_start_time, EXIT, RT_input::ioc_info, iochan_init(), RT_input::name_info, PLUTO_elapsed_time(), RT_acquire_info(), SHM_CHILD, verbose, and VMCHECK.

Referenced by RT_worker().

01604 {
01605    pid_t child_pid ;
01606 
01607    if( rtin == NULL || strlen(rtin->name_info) == 0 ) return ;  /* sanity */
01608 
01609    child_pid = fork() ;             /* AKA bifurcation */
01610 
01611    if( child_pid == (pid_t)(-1) ){  /* real bad news */
01612      fprintf(stderr,"RT: can't fork child process!\a\n") ; EXIT(1) ;
01613    }
01614 
01615    if( child_pid > 0 ){              /** I'm the parent **/
01616 
01617       if( verbose == 2 )
01618          fprintf(stderr,"RT: forked a child process to execute '%s'\n",rtin->name_info) ;
01619       VMCHECK ;
01620 
01621       /** open a channel to communicate with the child **/
01622 
01623       rtin->child_info = child_pid ;
01624       rtin->ioc_info   = iochan_init( SHM_CHILD , "accept" ) ;
01625       if( rtinp->ioc_info == NULL ){
01626         kill( child_pid , SIGTERM ) ;
01627         fprintf(stderr,"RT: can't create read stream from child!\a\n") ;
01628         EXIT(1) ;
01629       }
01630 
01631       rtin->child_start_time = PLUTO_elapsed_time() ;  /* 10 Dec 1998 */
01632 
01633       /** next time thru RT_worker will try to read data from this channel **/
01634 
01635    } else {                          /** I'm the child **/
01636 
01637       RT_acquire_info( rtin->name_info ) ;  /* get info, send back to parent */
01638       _exit(0) ;
01639    }
01640 
01641    return ;
01642 }

void RT_start_dataset RT_input   rtin
 

return the number of characters processed *

Definition at line 2470 of file plug_realtime.c.

References ADN_datum_all, ADN_dz_sl, ADN_func_type, ADN_malloc_type, ADN_none, ADN_nsl, ADN_ntt, ADN_nvals, ADN_nxyz, ADN_prefix, ADN_toff_sl, ADN_ttdel, ADN_ttdur, ADN_ttorg, ADN_tunits, ADN_type, ADN_view_type, ADN_xyzdel, ADN_xyzorg, ADN_xyzorient, ADN_zorg_sl, AFNI_clone_controller_CB(), AFNI_count_controllers(), AFNI_find_open_controller(), RT_input::afni_status, ANAT_EPI_TYPE, RT_input::bufar, AFNI_library_type::controllers, RT_input::cur_chan, DATABLOCK_MEM_MALLOC, RT_input::datum, RT_input::dset, DSET_lock, RT_input::dtype, DTYPE_2DZ, DTYPE_2DZT, DTYPE_3D, DTYPE_3DT, RT_input::dxx, RT_input::dyy, RT_input::dzz, EDIT_dset_items(), EDIT_empty_copy(), EXIT, free, FREE_IMARR, GLOBAL_library, HEAD_ANAT_TYPE, THD_ivec3::ijk, RT_input::im, RT_input::im3d, IM3D_OPEN, RT_input::image_mode, RT_input::image_space, IMARR_COUNT, IMARR_SUBIMAGE, RT_input::imsize, malloc, MAX_CONTROLLERS, MIN, MRI_BYTE_PTR, mri_datum_size(), mri_fix_data_pointer(), mri_free(), mri_new_vol_empty(), n1, nc, RT_input::note, RT_input::nsl, RT_input::num_chan, RT_input::num_note, num_open_controllers, RT_input::nvol, RT_input::nxx, RT_input::nyy, RT_input::nzz, open_controller_index, RT_input::orcxx, RT_input::orcyy, RT_input::orczz, ORI_A2P_TYPE, ORI_I2S_TYPE, ORI_L2R_TYPE, ORI_P2A_TYPE, ORI_R2L_TYPE, ORI_S2I_TYPE, ORIENT_OPPOSITE, plint, PLUTO_prefix_ok(), RT_input::reg_dset, REG_IS_2D, REG_IS_3D, REG_MAKE_DSET, RT_input::reg_mode, RT_input::reg_nvol, RT_input::reg_status, RT_input::root_prefix, RT_MAX_PREFIX, RT_process_image(), RT_input::sbr, RT_input::sbr_size, RT_input::sess, RT_input::sess_num, AFNI_view_info::sess_num, THD_sessionlist::ssar, AFNI_library_type::sslist, THD_MAX_PREFIX, RT_input::tpattern, RT_input::tr, tross_Add_Note(), tross_Append_History(), UNITS_SEC_TYPE, update, verbose, VIEW_ORIGINAL_TYPE, Three_D_View::vinfo, VMCHECK, RT_input::xcen, RT_input::xxdcode, RT_input::xxfov, RT_input::xxoff, RT_input::xxorg, THD_fvec3::xyz, RT_input::ycen, RT_input::yydcode, RT_input::yyfov, RT_input::yyoff, RT_input::yyorg, RT_input::zcen, RT_input::zgap, RT_input::zorder, ZORDER_ALT, ZORDER_EXP, ZORDER_SEQ, RT_input::zzdcode, RT_input::zzfov, RT_input::zzoff, and RT_input::zzorg.

Referenced by RT_process_data(), and RT_worker().

02471 {
02472    THD_ivec3 nxyz , orixyz ;
02473    THD_fvec3 dxyz , orgxyz ;
02474    int nvox , npix , n1 , ii , cc ;
02475    char npr[THD_MAX_PREFIX] , ccpr[THD_MAX_PREFIX] ;
02476 
02477    /*********************************************/
02478    /** 28 Apr 2000: Image Only mode is simpler **/
02479 
02480    if( rtin->image_mode ){
02481       nvox = rtin->nxx * rtin->nyy ;
02482       n1   = mri_datum_size( rtin->datum ) ;
02483 
02484       rtin->sbr_size = nvox * n1 ;                /* size of image space */
02485       rtin->sbr[0]   = malloc( rtin->sbr_size ) ; /* image space */
02486       rtin->imsize   = rtin->sbr_size ;
02487       rtin->im[0]    = rtin->sbr[0] ;             /* image space again */
02488       rtin->nzz      = 1 ;
02489 
02490       rtin->image_space = mri_new_vol_empty( rtin->nxx, rtin->nyy, 1, rtin->datum ) ;
02491       mri_fix_data_pointer( rtin->sbr[0] , rtin->image_space ) ;
02492 
02493       return ;
02494    }
02495 
02496    /*******************************************/
02497    /** Must create a dataset and other stuff **/
02498 
02499    /*******************************************************************/
02500    /** 02 Aug 2002: in multi-channel mode, need multiple controllers **/
02501 
02502    if( rtin->num_chan > 1 ){
02503      int ic , tc , nc=AFNI_count_controllers() , sn ;
02504 
02505      Three_D_View *im3d = plint->im3d ;             /* default controller */
02506      if( !IM3D_OPEN(im3d) )                         /* may not be open */
02507        im3d = AFNI_find_open_controller() ;
02508 
02509      sn = im3d->vinfo->sess_num ;                   /* session for all channels */
02510 
02511      /* open new controllers if needed */
02512 
02513      if( nc < rtin->num_chan && nc < MAX_CONTROLLERS ){
02514        nc = MIN( rtin->num_chan , MAX_CONTROLLERS ) - nc ;  /* number to add */
02515 
02516        fprintf(stderr,
02517                "RT: %d channel data requires opening %d more AFNI controllers",
02518                rtin->num_chan , nc ) ;
02519 
02520        for( ic=0 ; ic < nc ; ic++ )                         /* add them */
02521          AFNI_clone_controller_CB(NULL,NULL,NULL) ;
02522      }
02523 
02524      /* make list of open controllers */
02525 
02526      num_open_controllers = AFNI_count_controllers() ;
02527      for( ic=nc=0 ; ic < MAX_CONTROLLERS ; ic++ ){
02528        if( IM3D_OPEN(GLOBAL_library.controllers[ic]) ){
02529          open_controller[nc]       = GLOBAL_library.controllers[ic] ;
02530          open_controller_index[nc] = ic ;
02531          nc++ ;
02532        }
02533      }
02534      nc = num_open_controllers ;  /* nugatory or moot */
02535 
02536      /* now assign channels to controllers */
02537 
02538      tc = MIN( nc , rtin->num_chan ) ;
02539      for( cc=0 ; cc < rtin->num_chan ; cc++ ){
02540        if( cc < tc ) rtin->im3d[cc] = open_controller[cc] ; /* next available */
02541        else          rtin->im3d[cc] = NULL ;                /* none available */
02542 
02543        /* all channels go to the 1st session directory */
02544 
02545        rtin->sess_num[cc] = sn ;
02546        rtin->sess[cc]     = GLOBAL_library.sslist->ssar[sn] ;
02547      }
02548 
02549    /* single channel mode: make sure calling controller is still open */
02550 
02551    } else {
02552      Three_D_View *im3d = plint->im3d ;             /* default controller */
02553      if( !IM3D_OPEN(im3d) )                         /* may not be open */
02554        im3d = AFNI_find_open_controller() ;
02555 
02556      rtin->im3d[0]     = im3d ;
02557      rtin->sess_num[0] = rtin->im3d[0]->vinfo->sess_num ;
02558      rtin->sess[0]     = GLOBAL_library.sslist->ssar[rtin->sess_num[0]] ;
02559    }
02560 
02561    /***************************/
02562    /** Let there be dataset! **/  /* 01 Aug 2002: or datasets */
02563 
02564    for( cc=0 ; cc < rtin->num_chan ; cc++ ){
02565      rtin->dset[cc] = EDIT_empty_copy(NULL) ;
02566      tross_Append_History( rtin->dset[cc] , "plug_realtime: creation" ) ;
02567 
02568      if( rtin->num_note > 0 && rtin->note != NULL ){  /* 01 Oct 2002 */
02569        for( ii=0 ; ii < rtin->num_note ; ii++ )
02570          tross_Add_Note( rtin->dset[cc] , rtin->note[ii] ) ;
02571      }
02572    }
02573 
02574    /********************************/
02575    /** make a good dataset prefix **/
02576 
02577    for( ii=1 ; ; ii++ ){
02578       sprintf( npr , "%.*s#%03d" , RT_MAX_PREFIX, rtin->root_prefix , ii ) ;
02579 
02580       if( rtin->num_chan == 1 ){                  /* the old way */
02581 
02582          if( PLUTO_prefix_ok(npr) ) break ;
02583 
02584       } else {                                    /* 02 Aug 2002: the multichannel way */
02585 
02586         for( cc=0 ; cc < rtin->num_chan ; cc++ ){ /* check each channel prefix */
02587           sprintf(ccpr, "%s_%02d", npr,cc+1 ) ;
02588           if( !PLUTO_prefix_ok(ccpr) ) break ;    /* not good? quit cc loop */
02589         }
02590         if( cc == rtin->num_chan ) break ;        /* all were good? we are done */
02591       }
02592    }
02593 
02594    /**********************************************************/
02595    /** correct the spatial information for axes orientation **/
02596 
02597    rtin->dxx = rtin->xxfov / rtin->nxx ;
02598    rtin->dyy = rtin->yyfov / rtin->nyy ;
02599 
02600    /* 18 Dec 2002: add zgap here, per UCSD request */
02601 
02602    if( rtin->zzfov > 0 ) rtin->dzz = rtin->zzfov / rtin->nzz + rtin->zgap ;
02603 
02604    /* 18 Dec 2002: add xxoff (etc.) here, per UCSD request */
02605 
02606    if( rtin->xcen ) rtin->xxorg = 0.5 * (rtin->nxx - 1) * rtin->dxx + rtin->xxoff ;
02607    if( rtin->ycen ) rtin->yyorg = 0.5 * (rtin->nyy - 1) * rtin->dyy + rtin->yyoff ;
02608    if( rtin->zcen ) rtin->zzorg = 0.5 * (rtin->nzz - 1) * rtin->dzz + rtin->zzoff ;
02609 
02610    /* if axis direction is a 'minus', voxel increments are negative */
02611 
02612    if( ORIENT_sign[rtin->orcxx] == '-' ) rtin->dxx = - rtin->dxx ;
02613    if( ORIENT_sign[rtin->orcyy] == '-' ) rtin->dyy = - rtin->dyy ;
02614    if( ORIENT_sign[rtin->orczz] == '-' ) rtin->dzz = - rtin->dzz ;
02615 
02616    /* 10 Dec 2002:
02617       We now allow direction codes input for x and y as well,
02618       so must duplicate the complicated zzorg logic for setting
02619       the xxorg and yyorg signs.  This duplicated logic follows
02620       the zzdcode stuff, below.                                 */
02621 
02622 #if 0
02623    /* if axis direction is a 'plus',
02624       then the origin is in a 'minus' direction,
02625       so the origin offset must have its sign changed */  /*** THE OLD WAY ***/
02626 
02627    if( ORIENT_sign[rtin->orcxx] == '+' ) rtin->xxorg = - rtin->xxorg ;
02628    if( ORIENT_sign[rtin->orcyy] == '+' ) rtin->yyorg = - rtin->yyorg ;
02629 #endif
02630 
02631    /* z-origin is complex, because the remote program might
02632       have given a direction code, or it might not have.
02633       We must set the sign of the z-origin based on the
02634       sign of the axis direction if no specific
02635       direction code is given, otherwise it should be
02636       based on the specific direction code (rtin->zzdcode). */
02637 
02638    if( rtin->zzdcode < 0 ){  /* no specific code */
02639 
02640       if( ORIENT_sign[rtin->orczz] == '+' ) rtin->zzorg = - rtin->zzorg ;
02641 
02642    } else {  /* have code */
02643 
02644       /* check if code matches the axis direction
02645          (or is the opposite, which is also OK).  */
02646 
02647       if( rtin->orczz != rtin->zzdcode                 &&
02648           rtin->orczz != ORIENT_OPPOSITE(rtin->zzdcode)  ){  /* this is bad */
02649 
02650          fprintf(stderr,"RT: ZFIRST direction code = %c but Z axis = %s!\a\n",
02651                  ORIENT_first[rtin->zzdcode] , ORIENT_shortstr[rtin->orczz] ) ;
02652 
02653          if( ORIENT_sign[rtin->orczz] == '+' ) rtin->zzorg = - rtin->zzorg ;
02654 
02655       } else {  /* things are OK */
02656 
02657          if( ORIENT_sign[rtin->zzdcode] == '+' ) rtin->zzorg = - rtin->zzorg ;
02658       }
02659    }
02660 
02661    /* 10 Dec 2002: duplicate logic for xxorg */
02662 
02663    if( rtin->xxdcode < 0 ){
02664       if( ORIENT_sign[rtin->orcxx] == '+' ) rtin->xxorg = - rtin->xxorg ;
02665    } else {
02666       if( rtin->orcxx != rtin->xxdcode                 &&
02667           rtin->orcxx != ORIENT_OPPOSITE(rtin->xxdcode)  ){
02668          fprintf(stderr,"RT: XFIRST direction code = %c but X axis = %s!\a\n",
02669                  ORIENT_first[rtin->xxdcode] , ORIENT_shortstr[rtin->orcxx] ) ;
02670          if( ORIENT_sign[rtin->orcxx] == '+' ) rtin->xxorg = - rtin->xxorg ;
02671       } else {  /* things are OK */
02672          if( ORIENT_sign[rtin->xxdcode] == '+' ) rtin->xxorg = - rtin->xxorg ;
02673       }
02674    }
02675 
02676    /* 10 Dec 2002: duplicate logic for yyorg */
02677 
02678    if( rtin->yydcode < 0 ){
02679       if( ORIENT_sign[rtin->orcyy] == '+' ) rtin->yyorg = - rtin->yyorg ;
02680    } else {
02681       if( rtin->orcyy != rtin->yydcode                 &&
02682           rtin->orcyy != ORIENT_OPPOSITE(rtin->yydcode)  ){
02683          fprintf(stderr,"RT: YFIRST direction code = %c but Y axis = %s!\a\n",
02684                  ORIENT_first[rtin->yydcode] , ORIENT_shortstr[rtin->orcyy] ) ;
02685          if( ORIENT_sign[rtin->orcyy] == '+' ) rtin->yyorg = - rtin->yyorg ;
02686       } else {  /* things are OK */
02687          if( ORIENT_sign[rtin->yydcode] == '+' ) rtin->yyorg = - rtin->yyorg ;
02688       }
02689    }
02690 
02691    /************************************************/
02692    /** add the spatial information to the dataset **/  /* 01 Aug 2002: datasets */
02693 
02694    nxyz.ijk[0]   = rtin->nxx   ; dxyz.xyz[0]   = rtin->dxx ;
02695    nxyz.ijk[1]   = rtin->nyy   ; dxyz.xyz[1]   = rtin->dyy ;
02696    nxyz.ijk[2]   = rtin->nzz   ; dxyz.xyz[2]   = rtin->dzz ;
02697 
02698    orixyz.ijk[0] = rtin->orcxx ; orgxyz.xyz[0] = rtin->xxorg ;
02699    orixyz.ijk[1] = rtin->orcyy ; orgxyz.xyz[1] = rtin->yyorg ;
02700    orixyz.ijk[2] = rtin->orczz ; orgxyz.xyz[2] = rtin->zzorg ;
02701 
02702    for( cc=0 ; cc < rtin->num_chan ; cc++ ){  /* 01 Aug 2002: loop over datasets */
02703 
02704      if( rtin->num_chan == 1 )
02705        strcpy( ccpr , npr ) ;                      /* 1 channel prefix */
02706      else
02707        sprintf( ccpr , "%s_%02d" , npr , cc+1 ) ;  /* new prefix for multi-channel */
02708 
02709      EDIT_dset_items( rtin->dset[cc] ,
02710                          ADN_prefix      , ccpr ,
02711                          ADN_datum_all   , rtin->datum ,
02712                          ADN_nxyz        , nxyz ,
02713                          ADN_xyzdel      , dxyz ,
02714                          ADN_xyzorg      , orgxyz ,
02715                          ADN_xyzorient   , orixyz ,
02716                          ADN_malloc_type , DATABLOCK_MEM_MALLOC ,
02717                          ADN_nvals       , 1 ,
02718                          ADN_type        , HEAD_ANAT_TYPE ,
02719                          ADN_view_type   , VIEW_ORIGINAL_TYPE ,
02720                          ADN_func_type   , ANAT_EPI_TYPE ,
02721                       ADN_none ) ;
02722 
02723       /******************************************/
02724       /** add time axis information, if needed **/
02725 
02726       if( rtin->dtype == DTYPE_3DT ||                      /* all slices   */
02727          (rtin->dtype == DTYPE_2DZT && rtin->nzz == 1) ){  /* simultaneous */
02728 
02729          EDIT_dset_items( rtin->dset[cc] ,
02730                              ADN_ntt      , 1 ,
02731                              ADN_ttorg    , 0.0 ,
02732                              ADN_ttdel    , rtin->tr ,
02733                              ADN_ttdur    , 0.0 ,
02734                              ADN_tunits   , UNITS_SEC_TYPE ,
02735                           ADN_none ) ;
02736 
02737       } else if( rtin->dtype == DTYPE_2DZT ){  /* slices at different times */
02738 
02739          float * tpattern  = (float *) malloc( sizeof(float) * rtin->nzz ) ;
02740          float   tframe    = rtin->tr / rtin->nzz ;
02741          float   tsl ;
02742          int     ii ;
02743 
02744          if( rtin->zorder == ZORDER_ALT || rtin->tpattern == ZORDER_ALT ){
02745             /* alternating +z direction */
02746             tsl = 0.0 ;
02747             for( ii=0 ; ii < rtin->nzz ; ii+=2 ){
02748                tpattern[ii] = tsl ; tsl += tframe ;
02749             }
02750             for( ii=1 ; ii < rtin->nzz ; ii+=2 ){
02751                tpattern[ii] = tsl ; tsl += tframe ;
02752             }
02753          }
02754          /* make sequential a terminating case     10 May 2005 [rickr] */
02755          /* else if( rtin->zorder == ZORDER_SEQ ){                     */
02756          /* ... more tpatterns may be added above here                 */
02757          else {
02758             tsl = 0.0 ;
02759             for( ii=0 ; ii < rtin->nzz ; ii++ ){
02760                tpattern[ii] = tsl ; tsl += tframe ;
02761             }
02762          }
02763 
02764          EDIT_dset_items( rtin->dset[cc] ,
02765                              ADN_ntt      , 1 ,
02766                              ADN_ttorg    , 0.0 ,
02767                              ADN_ttdel    , rtin->tr ,
02768                              ADN_ttdur    , 0.0 ,
02769                              ADN_tunits   , UNITS_SEC_TYPE ,
02770                              ADN_nsl      , rtin->nzz ,
02771                              ADN_zorg_sl  , rtin->zzorg ,
02772                              ADN_dz_sl    , rtin->dzz ,
02773                              ADN_toff_sl  , tpattern ,
02774                           ADN_none ) ;
02775 
02776          free( tpattern ) ;
02777       }
02778 
02779       rtin->afni_status[cc] = 0 ;  /* uninformed at this time */
02780       DSET_lock(rtin->dset[cc]) ;  /* 20 Mar 1998 */
02781    }
02782 
02783 #ifdef ALLOW_REGISTRATION
02784    /*---- Make a dataset for registration, if need be ----*/
02785 
02786    if( REG_MAKE_DSET(rtin->reg_mode) &&
02787        ((rtin->dtype==DTYPE_2DZT) || (rtin->dtype==DTYPE_3DT)) ){
02788 
02789       rtin->reg_dset = EDIT_empty_copy( rtin->dset[0] ) ;
02790       tross_Append_History( rtin->reg_dset , "plug_realtime: registration" ) ;
02791 
02792       strcpy(ccpr,npr) ;
02793            if( REG_IS_2D(rtin->reg_mode) ) strcat(ccpr,"%reg2D") ;
02794       else if( REG_IS_3D(rtin->reg_mode) ) strcat(ccpr,"%reg3D") ;
02795       else                                 strcat(ccpr,"%reg"  ) ;
02796 
02797       EDIT_dset_items( rtin->reg_dset , ADN_prefix , ccpr , ADN_none ) ;
02798       DSET_lock(rtin->reg_dset) ;
02799 
02800       if( rtin->num_note > 0 && rtin->note != NULL ){  /* 01 Oct 2002 */
02801         for( ii=0 ; ii < rtin->num_note ; ii++ )
02802           tross_Add_Note( rtin->reg_dset , rtin->note[ii] ) ;
02803       }
02804    }
02805 
02806    rtin->reg_status    = 0 ;
02807    rtin->reg_nvol      = 0 ;
02808 
02809    /* No longer scale to time units as x-axis is now in terms of reps.
02810     *                                      *** 29 Jan 2004 [rickr] ***
02811     *  rtin->reg_graph_xr *= rtin->tr ;    *** scale to time units ***
02812     */
02813 
02814 #endif
02815 
02816    /***********************************************/
02817    /** now prepare space for incoming image data **/
02818 
02819    nvox = rtin->nxx * rtin->nyy * rtin->nzz ;
02820    n1   = mri_datum_size( rtin->datum ) ;
02821 
02822    rtin->sbr_size = nvox * n1 ;                /* size of sub-brick */
02823    for( cc=0 ; cc < rtin->num_chan ; cc++ ){
02824      rtin->sbr[cc] = malloc( rtin->sbr_size ) ; /* space to hold sub-brick */
02825      if( rtin->sbr[cc] == NULL ){
02826        fprintf(stderr,
02827                "RT: can't malloc data space for real-time channel %02d!\a\n",
02828                cc+1) ;
02829        EXIT(1) ;
02830      }
02831    }
02832 
02833    if( rtin->dtype == DTYPE_2DZT || rtin->dtype == DTYPE_2DZ )
02834       rtin->imsize = rtin->nxx * rtin->nyy * n1 ;
02835    else
02836       rtin->imsize = nvox * n1 ;
02837 
02838    for( cc=0 ; cc < rtin->num_chan ; cc++ ){
02839      rtin->im[cc]   = rtin->sbr[cc] ;  /* place to put first image in sub-brick */
02840      rtin->nsl[cc]  = 0 ;              /* number of slices gathered so far */
02841      rtin->nvol[cc] = 0 ;              /* number of volumes gathered so far */
02842    }
02843 
02844    /** if there is already data stored in the temporary buffer
02845        (acquired before this routine was called), then we want
02846        to place it into the dataset now.                       **/
02847 
02848    if( rtin->bufar != NULL ){
02849       int ii , upsave ;
02850       MRI_IMAGE * ibb ;
02851       char * bbb ;
02852 
02853       if( verbose == 2 )
02854          fprintf(stderr,"RT: putting %d buffered images into dataset\n" ,
02855                         IMARR_COUNT(rtin->bufar) ) ;
02856       VMCHECK ;
02857 
02858       upsave = update ;  /* don't do updates to AFNI during this step */
02859       update = 0 ;
02860 
02861       for( ii=0 ; ii < IMARR_COUNT(rtin->bufar) ; ii++ ){
02862         ibb = IMARR_SUBIMAGE(rtin->bufar,ii) ;                    /* next buffered image */
02863         bbb = (char *) MRI_BYTE_PTR( ibb ) ;                      /* pointer to its data */
02864         memcpy( rtin->im[rtin->cur_chan] , bbb , rtin->imsize ) ; /* copy into sub-brick */
02865         mri_free( ibb ) ;                                         /* free buffered image */
02866         RT_process_image( rtin ) ;                                /* send into dataset   */
02867       }
02868       FREE_IMARR( rtin->bufar ) ;   /* throw this away like a used Kleenex */
02869 
02870       update = upsave ;
02871 
02872       if( verbose == 2 )
02873          fprintf(stderr,"RT: buffered images all placed into dataset\n") ;
02874       VMCHECK ;
02875    }
02876 
02877    /** dataset(s) now created and ready to boogie! **/
02878    /** popup a message to keep the user occupied.  **/
02879 
02880    { char str[1024] ;
02881      char acq[128] , *sli ;
02882 
02883      switch( rtin->dtype ){
02884        case DTYPE_2DZ:  strcpy(acq,"2D+z (1 volume, by slice")        ; break ;
02885        case DTYPE_2DZT: strcpy(acq,"2D+zt (multivolume, by slice")    ; break ;
02886        case DTYPE_3D:   strcpy(acq,"3D (1 volume, all at once)")      ; break ;
02887        case DTYPE_3DT:  strcpy(acq,"3D+t (multivolume, by 3D array)") ; break ;
02888        default:         strcpy(acq,"Bizarro world")                   ; break ;
02889      }
02890 
02891      if( rtin->dtype == DTYPE_2DZ || rtin->dtype == DTYPE_2DZT ){
02892        switch( rtin->zorder ){
02893          case ZORDER_ALT: strcat(acq," - interleaved order)") ; break ;
02894          case ZORDER_SEQ: strcat(acq," - sequential order)")  ; break ;
02895          case ZORDER_EXP: strcat(acq," - explicit order)")    ; break ;
02896        }
02897      }
02898 
02899      switch( rtin->orczz ){
02900        case ORI_I2S_TYPE:
02901        case ORI_S2I_TYPE: sli = "(Axial)"    ; break ;
02902 
02903        case ORI_R2L_TYPE:
02904        case ORI_L2R_TYPE: sli = "(Sagittal)" ; break ;
02905 
02906        case ORI_P2A_TYPE:
02907        case ORI_A2P_TYPE: sli = "(Coronal)"  ; break ;
02908 
02909        default:           sli = "\0"         ; break ;  /* say what? */
02910      }
02911 
02912      sprintf(str," \n"
02913                  " ** Realtime Header Information **\n"
02914                  "\n"
02915                  " Dataset prefix  : %s\n"
02916                  " Brick Dimensions: %d x %d x %d\n"
02917                  " Voxel Grid Size : %.4f x %.4f x %.4f (mm)\n"
02918                  " Grid Orientation: %s x %s x %s %s\n"
02919                  " Grid Offset     : %.1f x %.1f x %.1f (mm)\n"
02920                  " Datum Type      : %s\n"
02921                  " Number Channels : %d\n"
02922                  " Acquisition Type: %s\n" ,
02923              npr ,
02924              rtin->nxx , rtin->nyy , rtin->nzz ,
02925              fabs(rtin->dxx) , fabs(rtin->dyy) , fabs(rtin->dzz) ,
02926              ORIENT_shortstr[rtin->orcxx],ORIENT_shortstr[rtin->orcyy],
02927                ORIENT_shortstr[rtin->orczz] , sli ,
02928              rtin->xxorg , rtin->yyorg , rtin->zzorg ,
02929              MRI_TYPE_name[rtin->datum] ,
02930              rtin->num_chan ,
02931              acq
02932           ) ;
02933 
02934      PLUTO_popup_transient(plint,str);
02935    }
02936 
02937    return ;
02938 }

void RT_startup XtPointer    junk [static]
 

Definition at line 472 of file plug_realtime.c.

References PLUTO_register_workproc(), and RT_worker().

Referenced by PLUGIN_init().

00473 {
00474    PLUTO_register_workproc( RT_worker , NULL ) ;
00475    return ;
00476 }

void RT_tell_afni RT_input   rtin,
int    mode
 

need to add more slices before volume is done *

Definition at line 3293 of file plug_realtime.c.

References RT_input::datum, RT_input::dset, DSET_FILECODE, ISVALID_DSET, MAX_CHAN, RT_input::num_chan, RT_input::nvol, RT_input::nxx, RT_input::nyy, RT_input::nzz, plint, PLUTO_beep(), RT_tell_afni_one(), SHOW_TIMES, TELL_FINAL, and verbose.

Referenced by RT_finish_dataset(), RT_process_image(), and RT_worker().

03294 {
03295    int cc ;
03296 
03297    if( rtin == NULL ) return ;
03298 
03299    /*** tell separately for each one ***/
03300 
03301    for( cc=0 ; cc < rtin->num_chan ; cc++ )
03302      RT_tell_afni_one( rtin , mode , cc ) ;
03303 
03304    /*** at the end of acquisition, show messages ***/
03305 
03306    if( mode == TELL_FINAL && ISVALID_DSET(rtin->dset[0]) ){
03307      char qbuf[256*(MAX_CHAN+1)] , zbuf[256] ;
03308      sprintf( qbuf ,
03309                 " \n"
03310                 " Acquisition Terminated\n\n"
03311                 " Brick Dimensions: %d x %d x %d  Datum: %s\n\n" ,
03312                rtin->nxx,rtin->nyy,rtin->nzz , MRI_TYPE_name[rtin->datum] );
03313 
03314      for( cc=0 ; cc < rtin->num_chan ; cc++ ){
03315        if( ISVALID_DSET(rtin->dset[cc]) )
03316          sprintf( zbuf ,
03317                   " Channel %02d: dataset %s has %d sub-bricks\n",
03318                   cc+1 , DSET_FILECODE(rtin->dset[cc]) , rtin->nvol[cc] ) ;
03319        else
03320          sprintf( zbuf ,
03321                   " Channel %d: INVALID DATASET?!\n",cc) ;
03322        strcat( qbuf , zbuf ) ;
03323      }
03324      strcat(qbuf,"\n") ;
03325 
03326      PLUTO_beep(); PLUTO_popup_transient(plint,qbuf);
03327 
03328      if( verbose == 2 ) SHOW_TIMES ;
03329 
03330      sync() ;  /* 08 Mar 2000: sync disk */
03331    }
03332 
03333    return ;
03334 }

void RT_tell_afni_one RT_input  ,
int   ,
int   
 

Definition at line 3340 of file plug_realtime.c.

References ADN_directory_name, ADN_none, AFNI_CALL_VALU_2ARG, AFNI_controller_index(), AFNI_controller_label(), AFNI_force_adoption(), AFNI_initialize_view(), AFNI_make_descendants(), AFNI_modify_viewing(), AFNI_purge_unused_dsets(), AFNI_SETUP_FUNC_ON, AFNI_SETUP_VIEW, RT_input::afni_status, Three_D_View::anat_now, AFNI_view_info::anat_num, AV_assign_ival(), COMPRESS_NONE, AFNI_library_type::controllers, DATABLOCK_MEM_ANY, THD_3dim_dataset::dblk, RT_input::dset, DSET_FILECODE, DSET_NVALS, DSET_unlock, THD_session::dsset, EDIT_dset_items(), EQUIV_DSETS, EXIT, Three_D_View::fim_now, FINAL_MODE, MCW_arrowval::fmax, RT_input::func_condit, RT_input::func_dset, RT_input::func_func, AFNI_view_info::func_num, RT_input::func_status, AFNI_view_info::func_visible, GLOBAL_argopt, GLOBAL_library, AFNI_library_type::have_dummy_dataset, RT_input::im3d, IM3D_OPEN, AFNI_widget_set::imag, MCW_arrowval::imax, ISANAT, ISFUNC, ISVALID_DSET, MAX_CONTROLLERS, THD_session::num_dsset, RT_input::nvol, POPDOWN_strlist_chooser, RT_input::reg_dset, RT_input::reg_nvol, RT_input::reg_status, RT_input::sess, RT_input::sess_num, AFNI_view_info::sess_num, THD_session::sessname, SHOW_AFNI_PAUSE, SHOW_AFNI_READY, AFNI_library_type::sslist, TELL_FINAL, THD_force_malloc_type(), THD_get_write_compression(), THD_load_statistics(), THD_MAX_SESSION_SIZE, THD_set_write_compression(), THD_update_statistics(), THD_write_3dim_dataset(), THE_TOPSHELL, AFNI_view_info::time_index, AFNI_imaging_widgets::time_index_av, UNDUMMYIZE, UPDATE_MODE, verbose, VIEW_ORIGINAL_TYPE, Three_D_View::vinfo, Three_D_View::vwid, and AF_options::warp_4D.

Referenced by RT_tell_afni().

03341 {
03342    Three_D_View * im3d ;
03343    THD_session * sess ;
03344    THD_3dim_dataset * old_anat ;
03345    int ii , id , afni_init=0 ;
03346    char clll , *cstr ;
03347    MCW_arrowval * tav ;
03348 
03349    /** sanity check **/
03350 
03351    if( rtin == NULL || !ISVALID_DSET(rtin->dset[cc]) ) return ;
03352 
03353    im3d = rtin->im3d[cc] ;                      /* AFNI controller */
03354    sess = rtin->sess[cc] ;                      /* AFNI session */
03355 
03356    if( im3d != NULL ){   /* 05 Aug 2002: allow for NULL im3d controller */
03357 
03358      tav  = im3d->vwid->imag->time_index_av ;   /* time index widget */
03359      ii   = AFNI_controller_index( im3d ) ;
03360      cstr = AFNI_controller_label( im3d ) ; clll = cstr[1] ;
03361 
03362      old_anat = im3d->anat_now ;  /* the default */
03363    }
03364 
03365    /**--- deal with the input dataset ---**/
03366 
03367    if( rtin->afni_status[cc] == 0 ){  /** first time for this dataset **/
03368 
03369       EDIT_dset_items( rtin->dset[cc],
03370                          ADN_directory_name,sess->sessname,
03371                        ADN_none ) ;
03372 
03373       if( im3d != NULL ){
03374         if( verbose )
03375            fprintf(stderr , "RT: sending dataset %s with %d bricks\n"
03376                             "    to AFNI[%c], session %s\n" ,
03377                    DSET_FILECODE(rtin->dset[cc]) , rtin->nvol[cc] ,
03378                    clll , sess->sessname ) ;
03379 
03380       }
03381       THD_load_statistics( rtin->dset[cc] ) ;
03382 
03383       /** put it into the current session in the current controller **/
03384 
03385       if( GLOBAL_library.have_dummy_dataset ) UNDUMMYIZE ;
03386 
03387       id = sess->num_dsset ;
03388 
03389       if( id >= THD_MAX_SESSION_SIZE ){
03390         fprintf(stderr,"RT: max number of anat datasets exceeded!\a\n") ;
03391         EXIT(1) ;
03392       }
03393       sess->dsset[id][VIEW_ORIGINAL_TYPE] = rtin->dset[cc] ;
03394       sess->num_dsset = id+1 ;
03395       POPDOWN_strlist_chooser ;
03396 
03397       if( ISFUNC(rtin->dset[cc]) )
03398         AFNI_force_adoption( sess , False ) ;
03399 
03400       /** tell AFNI controller to jump to this dataset and session **/
03401 
03402       if( im3d != NULL ){
03403         if( ISANAT(rtin->dset[cc]) )
03404            im3d->vinfo->anat_num = sess->num_dsset - 1 ;
03405         else
03406            im3d->vinfo->func_num = sess->num_dsset - 1 ;
03407 
03408         im3d->vinfo->sess_num = rtin->sess_num[cc] ;
03409 
03410         im3d->vinfo->time_index = 0 ;
03411         AV_assign_ival( tav , 0 ) ;
03412       }
03413 
03414       afni_init             = 1 ; /* below: will initialize AFNI to see this dataset */
03415       rtin->afni_status[cc] = 1 ; /* mark dataset to show that AFNI knows about it now */
03416 
03417    } else {  /** 2nd or later call for this dataset **/
03418 
03419       THD_update_statistics( rtin->dset[cc] ) ;
03420 
03421       if( im3d != NULL ){
03422         if( mode != TELL_FINAL && verbose )
03423           fprintf(stderr,"RT: update with %d bricks in channel %02d to AFNI[%c]\n",
03424                   rtin->nvol[cc],cc+1,clll) ;
03425 
03426         tav->fmax = tav->imax = im3d->vinfo->time_index = rtin->nvol[cc] - 1  ;
03427         AV_assign_ival( tav , tav->imax ) ;
03428       }
03429 
03430    }
03431 
03432    /**--- Deal with the computed function, if any ---**/
03433 
03434    if( rtin->func_dset != NULL ){
03435       int jj ;
03436 
03437 #if 0
03438       jj = rtin->func_func( rtin , UPDATE_MODE ) ;  /* put data into dataset */
03439 #else
03440       AFNI_CALL_VALU_2ARG( rtin->func_func , int,jj ,
03441                            RT_input *,rtin , int,UPDATE_MODE ) ;
03442 #endif
03443 
03444       if( rtin->func_condit > 1 ){             /* data actually inside */
03445 
03446          THD_load_statistics( rtin->func_dset ) ; /* statistickizification */
03447 
03448          if( rtin->func_status == 0 ){  /** first time for this dataset **/
03449 
03450             if( im3d != NULL && verbose )
03451                fprintf(stderr , "RT: sending dataset %s with %d bricks\n"
03452                                 "    to AFNI controller [%c] session %s\n" ,
03453                        DSET_FILECODE(rtin->func_dset) , DSET_NVALS(rtin->func_dset) ,
03454                        clll , sess->sessname ) ;
03455 
03456             EDIT_dset_items( rtin->func_dset, ADN_directory_name,sess->sessname, ADN_none ) ;
03457             id = sess->num_dsset ;
03458             if( id >= THD_MAX_SESSION_SIZE ){
03459               fprintf(stderr,"RT: max number of datasets exceeded!\a\n") ;
03460               EXIT(1) ;
03461             }
03462             sess->dsset[id][VIEW_ORIGINAL_TYPE] = rtin->func_dset ; sess->num_dsset++ ;
03463             AFNI_force_adoption( sess , False ) ;
03464             POPDOWN_strlist_chooser ;
03465 
03466             if( im3d != NULL ){
03467               im3d->vinfo->func_num = sess->num_dsset - 1 ;
03468               AFNI_SETUP_FUNC_ON(im3d) ;
03469             }
03470 
03471             rtin->func_status = 1 ;   /* AFNI knows now */
03472             afni_init = 1 ;           /* below: tell AFNI to look at this function */
03473 
03474          } else {  /** 2nd or later call for this dataset **/
03475 
03476             /**--- actually, there's nothing to do here ---**/
03477 
03478          }
03479       }  /* end of if functional dataset actually has data */
03480    }  /* end of if functional dataset exists */
03481 
03482 #ifdef ALLOW_REGISTRATION
03483    /**--- Deal with the registered dataset, if any ---**/
03484 
03485    if( rtin->reg_dset != NULL && rtin->reg_nvol > 0 ){
03486 
03487       if( rtin->reg_status == 0 ){  /** first time for this dataset **/
03488 
03489          THD_load_statistics( rtin->reg_dset ) ;
03490 
03491          if( im3d != NULL ){
03492            if( verbose )
03493                  fprintf(stderr , "RT: sending dataset %s with %d bricks\n"
03494                                   "    to AFNI controller [%c] session %s\n" ,
03495                          DSET_FILECODE(rtin->reg_dset) , DSET_NVALS(rtin->reg_dset) ,
03496                          clll , sess->sessname ) ;
03497          }
03498 
03499          EDIT_dset_items( rtin->reg_dset, ADN_directory_name,sess->sessname, ADN_none ) ;
03500 
03501          id = sess->num_dsset ;
03502          if( id >= THD_MAX_SESSION_SIZE ){
03503            fprintf(stderr,"RT: max number of datasets exceeded!\a\n") ;
03504            EXIT(1) ;
03505          }
03506          sess->dsset[id][VIEW_ORIGINAL_TYPE] = rtin->reg_dset ; sess->num_dsset = id+1 ;
03507          POPDOWN_strlist_chooser ;
03508 
03509          rtin->reg_status = 1 ;   /* AFNI knows about this dataset now */
03510 
03511       } else {  /** 2nd or later call for this dataset **/
03512 
03513          THD_update_statistics( rtin->reg_dset ) ;
03514       }
03515    }
03516 #endif
03517 
03518    /**--- actually talk to AFNI now ---**/
03519 
03520    if( afni_init ){  /* tell AFNI to view new dataset(s) */
03521 
03522      if( im3d != NULL ){
03523        AFNI_SETUP_VIEW(im3d,VIEW_ORIGINAL_TYPE) ;
03524        if( EQUIV_DSETS(rtin->dset[cc],old_anat) ) THD_update_statistics( rtin->dset[cc] ) ;
03525        else                                       THD_load_statistics  ( rtin->dset[cc] ) ;
03526 
03527        AFNI_initialize_view( old_anat , im3d ) ;  /* Geronimo! */
03528      }
03529 
03530    } else {          /* just tell AFNI to refresh the images/graphs */
03531 
03532       Three_D_View * qq3d ;
03533       int review ;
03534 
03535       /* check all controllers to see if they are looking at the same datasets */
03536 
03537       for( ii=0 ; ii < MAX_CONTROLLERS ; ii++ ){
03538          qq3d = GLOBAL_library.controllers[ii] ;
03539          if( !IM3D_OPEN(qq3d) ) break ;  /* skip this one */
03540 
03541          review = (qq3d == im3d)                             ||   /* same viewer?  */
03542                   EQUIV_DSETS(rtin->dset[cc],qq3d->anat_now) ||   /* or same anat? */
03543                   ( rtin->func_dset != NULL   &&                  /* or same func? */
03544                     qq3d->vinfo->func_visible &&
03545                     EQUIV_DSETS(rtin->func_dset,qq3d->fim_now) ) ;
03546 
03547 #ifdef ALLOW_REGISTRATION
03548          review = review || ( rtin->reg_dset != NULL &&       /* or same reg?  */
03549                               rtin->reg_nvol > 0     &&
03550                               EQUIV_DSETS(rtin->reg_dset,qq3d->anat_now) ) ;
03551 #endif
03552 
03553          if( review ){
03554             AFNI_modify_viewing( qq3d , False ) ;  /* Crazy Horse! */
03555          }
03556       }
03557    }
03558 
03559    if( im3d != NULL ) XmUpdateDisplay( THE_TOPSHELL ) ;
03560 
03561    /**--- if this is the final call, do some cleanup stuff ---**/
03562 
03563    if( mode == TELL_FINAL ){
03564 
03565       int cmode ;
03566 
03567       if( verbose == 2 )
03568          fprintf(stderr,"RT: finalizing dataset to AFNI (including disk output).\n") ;
03569 
03570 #if 0
03571       if( im3d != NULL )
03572         fprintf(stderr , "RT: sending dataset %s with %d bricks\n"
03573                          "    to AFNI controller [%c] session %s\n" ,
03574                 DSET_FILECODE(rtin->dset[cc]) , rtin->nvol[cc] ,
03575                 clll , sess->sessname ) ;
03576 #endif
03577 
03578 #if 0
03579       THD_load_statistics( rtin->dset[cc] ) ;
03580 #endif
03581 
03582       /* 20 Mar 1998: write in uncompressed mode for speed */
03583 
03584       cmode = THD_get_write_compression() ;
03585       THD_set_write_compression(COMPRESS_NONE) ;
03586       SHOW_AFNI_PAUSE ;
03587 
03588       THD_write_3dim_dataset( NULL,NULL , rtin->dset[cc] , True ) ;
03589       DSET_unlock( rtin->dset[cc] ) ;  /* 20 Mar 1998 */
03590 
03591       if( rtin->func_dset != NULL ){
03592          int jj ;
03593 #if 0
03594          jj = rtin->func_func( rtin , FINAL_MODE ) ;
03595 #else
03596          AFNI_CALL_VALU_2ARG( rtin->func_func , int,jj ,
03597                               RT_input *,rtin , int,FINAL_MODE ) ;
03598 #endif
03599          THD_write_3dim_dataset( NULL,NULL , rtin->func_dset , True ) ;
03600          DSET_unlock( rtin->func_dset ) ;  /* 20 Mar 1998 */
03601          THD_force_malloc_type( rtin->func_dset->dblk , DATABLOCK_MEM_ANY ) ;
03602       }
03603 
03604 #ifdef ALLOW_REGISTRATION
03605       if( rtin->reg_dset != NULL && rtin->reg_nvol > 0 ){
03606          THD_write_3dim_dataset( NULL,NULL , rtin->reg_dset , True ) ;
03607          DSET_unlock( rtin->reg_dset ) ;
03608          THD_force_malloc_type( rtin->reg_dset->dblk , DATABLOCK_MEM_ANY ) ;
03609       }
03610 #endif
03611 
03612       THD_set_write_compression(cmode) ;  /* restore compression mode */
03613 
03614       AFNI_force_adoption( sess , GLOBAL_argopt.warp_4D ) ;
03615       AFNI_make_descendants( GLOBAL_library.sslist ) ;
03616       THD_force_malloc_type( rtin->dset[cc]->dblk , DATABLOCK_MEM_ANY ) ;
03617 
03618       AFNI_purge_unused_dsets() ;
03619       SHOW_AFNI_READY ;
03620    }
03621 
03622    return ;
03623 }

Boolean RT_worker XtPointer   
 

Definition at line 887 of file plug_realtime.c.

References RT_input::buf, RT_input::child_info, RT_input::child_start_time, CLEANUP, COMPRESS_NONE, RT_input::dset, free, RT_input::func_dset, getenv(), RT_input::image_mode, RT_input::info_ok, INFO_SIZE, RT_input::ioc_data, RT_input::ioc_info, IOCHAN_CLOSENOW, iochan_goodcheck(), iochan_readcheck(), iochan_recv(), iochan_sleep(), RT_input::last_elapsed, RT_input::last_nvol, malloc, RT_input::marked_for_death, RT_input::name_info, RT_input::nbuf, new_RT_input(), RT_input::no_data, RT_input::num_chan, RT_input::nvol, plint, PLUTO_beep(), PLUTO_elapsed_time(), RT_check_info(), RT_check_listen(), RT_finish_dataset(), RT_NBUF, RT_process_data(), RT_process_info(), RT_start_child(), RT_start_dataset(), RT_tell_afni(), RT_input::sbr, SHORT_DELAY, SHOW_AFNI_PAUSE, SHOW_AFNI_READY, strtod(), TELL_NORMAL, THD_get_write_compression(), THD_set_write_compression(), THD_write_3dim_dataset(), verbose, VMCHECK, and WRITE_INTERVAL.

Referenced by PLUGIN_init(), and RT_startup().

00888 {
00889    int jj ;
00890    static int first=1 ;
00891 
00892 #if 0
00893    if( first ){
00894       if( verbose ) fprintf(stderr,"RT: first call to RT_worker()\n") ;
00895       first = 0 ;
00896    }
00897 #endif
00898 
00899    /**--------------------------------------------------------------------**/
00900    /** if we are waiting for a connection, check to see if it is good yet **/
00901 
00902    if( rtinp == NULL ){         /* not doing real-time input at this time */
00903       static int nerr = 0 ;
00904       jj = RT_check_listen() ;             /* see if someone wants to talk */
00905       if( jj < 0 ){                        /* quit if there's an error */
00906          nerr++ ; iochan_sleep(1) ;
00907          return (nerr > 9) ? True : False; /* 12 Oct 2000: if a lot of errors */
00908       }
00909       nerr = 0 ;                           /* reset error count */
00910       if( jj == 0 ) return False ;         /* try later if no connection now */
00911       rtinp = new_RT_input(NULL) ;         /* try to make a new input struct */
00912       IOCHAN_CLOSENOW( ioc_control ) ;     /* not needed any more */
00913       if( rtinp == NULL ) return False ;   /* try later (?) */
00914    }
00915 
00916    /**---------------------------------------------------------------**/
00917    /**---- at this point, the rtinp struct is good,              ----**/
00918    /**---- meaning that we are in the business of acquiring data ----**/
00919    /**---------------------------------------------------------------**/
00920 
00921    /**-----------------------------------------------------------------------**/
00922    /** if input data stream has gone bad, close down the real-time operation **/
00923 
00924    if( iochan_goodcheck(rtinp->ioc_data,0) != 1 ){
00925 
00926       if( rtinp->sbr[0] != NULL ){     /* if we started acquisition */
00927          if( verbose == 2 )
00928             fprintf(stderr,"RT: data stream closed down.\n") ;
00929          VMCHECK ;
00930          RT_finish_dataset( rtinp ) ;  /* then we can finish it */
00931       } else {
00932          fprintf(stderr,"RT: data stream closed before dataset was fully defined!\a\n") ;
00933       }
00934 
00935       CLEANUP(0) ; return False ;
00936    }
00937 
00938    /**-----------------------------------------------------------------**/
00939    /**---- See if any data is waiting to be read from the child   ----**/
00940    /**---- process that is supposed to supply control information ----**/
00941 
00942 #define CHILD_MAX_WAIT 66.6  /* seconds */
00943 
00944    if( rtinp->child_info > 0 ){
00945 
00946       jj = iochan_readcheck( rtinp->ioc_info , SHORT_DELAY ) ;  /** data ready? **/
00947 
00948       if( jj == 0 ){       /** 10 Dec 1998: child not sending data? **/
00949          double et = PLUTO_elapsed_time() - rtinp->child_start_time ;
00950          double mw = CHILD_MAX_WAIT ;
00951          char *eee = getenv("AFNI_REALTIME_CHILDWAIT") ;
00952          if( eee != NULL ){
00953             double val=strtod(eee,NULL); if(val >= 1.0) mw = val;
00954          }
00955 
00956          if( et > mw ){  /* don't wait any more, give up */
00957             fprintf(stderr,
00958                     "RT: no data from child after %f seconds!  Giving up.\a\n",et) ;
00959             CLEANUP(0) ; return False ;
00960          }
00961 
00962       } else if( jj < 0 ){   /** something bad happened? **/
00963 
00964          fprintf(stderr,"RT: child info stream closed prematurely!\a\n") ;
00965          CLEANUP(0) ; return False ;
00966 
00967       } else if( jj > 0 ){   /** something good happened? **/
00968 
00969          char * info = (char *) malloc( sizeof(char) * INFO_SIZE ) ;
00970          int   ninfo , ii ;
00971 
00972          /* read all data possible from the info channel */
00973 
00974          if( verbose )
00975             fprintf(stderr,"RT: receiving data from child process\n") ;
00976          VMCHECK ;
00977 
00978          ninfo = 0 ;
00979          while(1){
00980             ii = iochan_recv( rtinp->ioc_info , info+ninfo , INFO_SIZE-ninfo ) ;
00981             if( ii < 1 ) break ;
00982             ninfo += ii ;
00983             if( ninfo >= INFO_SIZE ){
00984                fprintf(stderr,"RT: child process sent too much info!\a\n") ;
00985                break ;
00986             }
00987             ii = iochan_readcheck( rtinp->ioc_info , SHORT_DELAY ) ;
00988             if( ii < 1 ) break ;
00989          }
00990          IOCHAN_CLOSENOW( rtinp->ioc_info ) ; rtinp->child_info = 0 ;
00991 
00992          if( ninfo <= 0 ){
00993             fprintf(stderr,"RT: child info stream returned no data!\a\n") ;
00994             CLEANUP(0) ; return False ;
00995          }
00996 
00997          if( verbose == 2 )
00998             fprintf(stderr,"RT: child info stream returned %d bytes.\n",ninfo) ;
00999          VMCHECK ;
01000 
01001          /* process the info and store it in the real-time struct */
01002 
01003          jj = RT_process_info( ninfo , info , rtinp ) ; free(info) ;
01004 
01005          /* check if data was processed OK */
01006 
01007          if( jj <= 0 ){
01008             fprintf(stderr,"RT: child info was badly formatted!\a\n") ;
01009             CLEANUP(0) ; return False ;
01010          }
01011 
01012          /* if we already received the first image data,
01013             then all the setup info should be OK.  if not, quit */
01014 
01015          if( ! rtinp->no_data && ! rtinp->info_ok ){
01016             fprintf(stderr,"RT: child info was incomplete or erroneous!\a\n") ;
01017             RT_check_info( rtinp , 1 ) ;
01018             PLUTO_beep() ;
01019             PLUTO_popup_transient( plint , " \n"
01020                                            "      Heads down!\n"
01021                                            "Realtime header was bad!\n" ) ;
01022             CLEANUP(0) ; return FALSE ;
01023          }
01024 
01025          /* if all the setup info is OK, we can create the dataset now */
01026 
01027          if( rtinp->sbr[0] == NULL && rtinp->info_ok ){
01028             if( verbose == 2 )
01029                fprintf(stderr,"RT: info complete --> creating dataset.\n") ;
01030             VMCHECK ;
01031             RT_start_dataset( rtinp ) ;
01032          }
01033       }
01034 
01035       /** if nothing happened (good or bad),
01036           will try to read it again on the next time thru **/
01037    }
01038 
01039    /**---------------------------------------------**/
01040    /** See if any image data is waiting to be read **/
01041 
01042    jj = iochan_readcheck( rtinp->ioc_data , SHORT_DELAY ) ;
01043 
01044    if( jj == 0 ){     /** no data available now **/
01045 
01046 #ifdef WRITE_INTERVAL
01047       double delt ;
01048       double mw = WRITE_INTERVAL ;
01049       char *eee = getenv("AFNI_REALTIME_WRITEWAIT") ;
01050       if( eee != NULL ){
01051          double val=strtod(eee,NULL); if(val >= 1.0) mw = val;
01052       }
01053 
01054       /** if there is no image data for a long time,
01055           and there is something new to write out,
01056           then write the datasets out again.         **/
01057 
01058       if( !rtinp->no_data                    &&
01059           rtinp->nvol[0] > rtinp->last_nvol  &&
01060           !rtinp->image_mode                 &&  /* 28 Apr 2000 */
01061           (delt=PLUTO_elapsed_time()-rtinp->last_elapsed) > mw  ){
01062 
01063          int cmode , cc ;
01064 
01065          fprintf(stderr,"RT: no image data for %g seconds --> saving to disk.\n",delt) ;
01066 
01067          PLUTO_popup_transient( plint , " \n"
01068                                         " Pause in input data stream:\n"
01069                                         " Saving current dataset(s) to disk.\n" ) ;
01070 
01071          RT_tell_afni(rtinp,TELL_NORMAL) ;
01072 
01073          cmode = THD_get_write_compression() ;      /* 20 Mar 1998 */
01074          THD_set_write_compression(COMPRESS_NONE) ;
01075          SHOW_AFNI_PAUSE ;
01076 
01077          for( cc=0 ; cc < rtinp->num_chan ; cc++ )
01078            THD_write_3dim_dataset( NULL,NULL , rtinp->dset[cc] , True ) ;
01079 
01080          if( rtinp->func_dset != NULL )
01081             THD_write_3dim_dataset( NULL,NULL , rtinp->func_dset , True ) ;
01082 
01083          THD_set_write_compression(cmode) ;  sync() ; /* 08 Mar 2000: sync disk */
01084          SHOW_AFNI_READY ;
01085 
01086          rtinp->last_nvol    = rtinp->nvol[0] ;
01087          rtinp->last_elapsed = PLUTO_elapsed_time() ;
01088       }
01089 #endif
01090 
01091       return False ;
01092    }
01093 
01094    if( jj < 0 ){               /** something bad happened to data channel **/
01095       if( verbose == 2 )
01096          fprintf(stderr,"RT: data stream closed down.\n") ;
01097       VMCHECK ;
01098       if( rtinp->sbr[0] != NULL ) RT_finish_dataset( rtinp ) ;
01099       CLEANUP(0) ; return False ;
01100    }
01101 
01102    /************************************************/
01103    /** If here, data is ready on the data channel **/
01104 
01105    /**-----------------------------------------------------**/
01106    /** If this is the first time reading the data channel, **/
01107    /** read and process any header info present there.     **/
01108    /** (Will read the image data a little farther below.)  **/
01109 
01110    if( rtinp->no_data ){
01111       int ii , nb ;
01112 
01113       /** if so ordered, start a child process to get header info **/
01114 
01115       if( strlen(rtinp->name_info) > 0 ) RT_start_child( rtinp ) ;
01116 
01117       /** read initial stuff from the data channel **/
01118 
01119       fprintf(stderr,"RT: receiving image metadata") ; fflush(stderr) ;
01120 
01121       nb = iochan_recv( rtinp->ioc_data , rtinp->buf , RT_NBUF ) ;
01122 
01123       if( nb <= 0 ){
01124          fprintf(stderr,"\nRT: recv on data stream fails on first try!\a\n") ;
01125          CLEANUP(0) ; return False ;
01126       }
01127 
01128       /* read any more that comes available very quickly [06 Aug 2002] */
01129 
01130       while( nb < RT_NBUF-1 ){
01131         ii = iochan_readcheck( rtinp->ioc_data , SHORT_DELAY ) ;
01132         if( ii <= 0 ) break ;
01133         ii = iochan_recv( rtinp->ioc_data , rtinp->buf+nb , RT_NBUF-nb ) ;
01134         if( ii <= 0 ) break ;
01135         nb += ii ;
01136       }
01137       rtinp->nbuf = nb ;
01138 
01139       fprintf(stderr,"=%d bytes\n",rtinp->nbuf) ;
01140 
01141       PLUTO_beep() ;
01142       PLUTO_popup_transient( plint , " \n"
01143                                      "***************************\n"
01144                                      "*       Heads Up!         *\n"
01145                                      "* Incoming realtime data! *\n"
01146                                      "***************************\n" ) ;
01147 
01148       /** process header info in the data channel;
01149           note that there must be SOME header info this first time **/
01150 
01151       jj = RT_process_info( rtinp->nbuf , rtinp->buf , rtinp ) ;
01152 
01153       if( jj <= 0 ){                  /* header info not OK */
01154 
01155          fprintf(stderr,"RT: initial image metadata is badly formatted!\a\n") ;
01156          CLEANUP(0) ; return False ;
01157 
01158       } else if( jj < rtinp->nbuf ){  /* data bytes left after header info */
01159 
01160          memmove( rtinp->buf , rtinp->buf + jj , rtinp->nbuf - jj ) ;
01161          rtinp->nbuf = rtinp->nbuf - jj ;
01162 
01163       } else {                        /* no data left after header info */
01164          rtinp->nbuf = 0 ;
01165       }
01166 
01167       if( verbose == 2 )
01168          fprintf(stderr,
01169                  "RT: processed %d bytes of header info from data stream\n",jj) ;
01170       VMCHECK ;
01171 
01172       rtinp->no_data = 0 ;  /* can't say we never received data */
01173 
01174       /* if we have already received the child process info,
01175          or if there is no child process info, then all should be OK now */
01176 
01177       if( rtinp->child_info == 0 && ! rtinp->info_ok ){
01178          fprintf(stderr,"RT: image header info was incomplete!\a\n") ;
01179          RT_check_info( rtinp , 1 ) ;
01180          PLUTO_beep() ;
01181          PLUTO_popup_transient( plint , " \n"
01182                                         "      Heads down!\n"
01183                                         "Realtime header was bad!\n" ) ;
01184          CLEANUP(0) ; return FALSE ;
01185       }
01186    }
01187 
01188    /**-------------------------------**/
01189    /** At last -- process image data **/
01190 
01191    jj = RT_process_data( rtinp ) ;
01192 
01193    if( jj < 0 ){
01194       fprintf(stderr,"RT: data stream aborted during image read!\n") ;
01195       if( rtinp->sbr[0] != NULL ) RT_finish_dataset( rtinp ) ;
01196       CLEANUP(0) ; return False ;
01197    }
01198 
01199    /* 10 Dec 2002: if data stream marked itself for death,
01200                    then close down the dataset,
01201                    but don't close down the data stream itself;
01202                    instead, create a new RT_input context for
01203                    reading new metadata+image data from the
01204                    same data stream                          */
01205 
01206    if( rtinp->marked_for_death ){
01207       RT_input *new_rtinp ;
01208       fprintf(stderr,"RT: data stream says to close dataset.\n") ;
01209       if( rtinp->sbr[0] != NULL ) RT_finish_dataset( rtinp ) ;
01210       fprintf(stderr,"RT: starting to read from existing data stream.\n") ;
01211       new_rtinp = new_RT_input( rtinp->ioc_data ) ; /* new RT_input context */
01212       CLEANUP(1) ;                                 /* will delete old rtinp */
01213       rtinp = new_rtinp ; return False ;
01214    }
01215 
01216    /*** continue normally! ***/
01217 
01218    rtinp->last_elapsed = PLUTO_elapsed_time() ;  /* record this time */
01219    return False ;
01220 }

Variable Documentation

int func_code = 0 [static]
 

Definition at line 342 of file plug_realtime.c.

Referenced by new_RT_input(), PLUGIN_init(), and RT_main().

int_func* FUNC_funcs[NFUNC] = { NULL , RT_fim_recurse }
 

Definition at line 355 of file plug_realtime.c.

Referenced by new_RT_input().

char* FUNC_strings[NFUNC] = { "None" , "FIM" } [static]
 

Definition at line 341 of file plug_realtime.c.

Referenced by PLUGIN_init(), and RT_main().

char* GRAPH_strings[NGRAPH] = { "No" , "Yes" , "Realtime" } [static]
 

Definition at line 372 of file plug_realtime.c.

Referenced by PLUGIN_init(), and RT_main().

char helpstring[] [static]
 

Definition at line 250 of file plug_realtime.c.

Referenced by PLUGIN_init().

int image_mode = 0 [static]
 

Definition at line 344 of file plug_realtime.c.

Referenced by new_RT_input(), PLUGIN_init(), and RT_main().

IOCHAN* ioc_control = NULL [static]
 

Definition at line 408 of file plug_realtime.c.

int num_open_controllers [static]
 

Definition at line 114 of file plug_realtime.c.

Referenced by RT_start_dataset().

Three_D_View* open_controller[MAX_CONTROLLERS] [static]
 

Definition at line 116 of file plug_realtime.c.

int open_controller_index[MAX_CONTROLLERS] [static]
 

Definition at line 115 of file plug_realtime.c.

Referenced by RT_start_dataset().

PLUGIN_interface* plint = NULL [static]
 

Definition at line 410 of file plug_realtime.c.

Referenced by new_RT_input(), PLUGIN_init(), RT_main(), RT_process_info(), RT_set_grapher_pinnums(), RT_start_dataset(), RT_tell_afni(), and RT_worker().

int reg_nr = 100 [static]
 

Definition at line 368 of file plug_realtime.c.

Referenced by new_RT_input(), PLUGIN_init(), and RT_main().

int reg_resam = 1 [static]
 

Definition at line 367 of file plug_realtime.c.

Referenced by new_RT_input(), PLUGIN_init(), and RT_main().

int REG_resam_ints[NRESAM] [static]
 

Initial value:

Definition at line 377 of file plug_realtime.c.

Referenced by new_RT_input().

char* REG_resam_strings[NRESAM] [static]
 

Initial value:

 {
     "Cubic" , "Quintic" , "Heptic" , "Fourier" , "Hept+Four" }

Definition at line 375 of file plug_realtime.c.

Referenced by PLUGIN_init(), and RT_main().

char* REG_strings[NREG] [static]
 

Initial value:

 {
    "None" , "2D: realtime" , "2D: at end"
           , "3D: realtime" , "3D: at end" , "3D: estimate" }

Definition at line 381 of file plug_realtime.c.

Referenced by PLUGIN_init(), RT_main(), RT_registration_2D_atend(), RT_registration_2D_realtime(), RT_registration_3D_atend(), and RT_registration_3D_realtime().

char* REG_strings_ENV[NREG] [static]
 

Initial value:

 {  
    "None" , "2D:_realtime" , "2D:_at_end"
           , "3D:_realtime" , "3D:_at_end" , "3D:_estimate" }

Definition at line 385 of file plug_realtime.c.

Referenced by PLUGIN_init().

float reg_yr = 1.0 [static]
 

Definition at line 369 of file plug_realtime.c.

Referenced by new_RT_input(), PLUGIN_init(), and RT_main().

int reggraph = 0 [static]
 

Definition at line 365 of file plug_realtime.c.

Referenced by new_RT_input(), PLUGIN_init(), and RT_main().

int regmode = 0 [static]
 

Definition at line 364 of file plug_realtime.c.

Referenced by new_RT_input(), PLUGIN_init(), and RT_main().

int regtime = 3 [static]
 

Definition at line 363 of file plug_realtime.c.

Referenced by new_RT_input(), PLUGIN_init(), and RT_main().

char root[THD_MAX_PREFIX] = "rt." [static]
 

variables encoding the state of options from the plugin interface *

Definition at line 337 of file plug_realtime.c.

Referenced by new_RT_input(), PLUGIN_init(), and RT_main().

RT_input* rtinp = NULL [static]
 

Definition at line 409 of file plug_realtime.c.

int update = 1 [static]
 

Definition at line 338 of file plug_realtime.c.

Referenced by PLUGIN_init(), RT_main(), RT_process_image(), and RT_start_dataset().

char* VERB_strings[NVERB] = { "No" , "Yes" , "Very" } [static]
 

Definition at line 359 of file plug_realtime.c.

Referenced by PLUGIN_init(), and RT_main().

int verbose = 1 [static]
 

Definition at line 360 of file plug_realtime.c.

Referenced by new_RT_input(), PLUGIN_init(), RT_check_listen(), RT_fim_recurse(), RT_finish_dataset(), RT_main(), RT_process_data(), RT_process_image(), RT_process_info(), RT_process_xevents(), RT_registration_2D_atend(), RT_registration_2D_onevol(), RT_registration_3D_atend(), RT_registration_3D_onevol(), RT_registration_3D_setup(), RT_start_child(), RT_start_dataset(), RT_tell_afni(), RT_tell_afni_one(), and RT_worker().

 

Powered by Plone

This site conforms to the following standards: