Doxygen Source Code Documentation
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_input * | new_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_View * | open_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_func * | FUNC_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] |
IOCHAN * | ioc_control = NULL |
RT_input * | rtinp = NULL |
PLUGIN_interface * | plint = NULL |
Define Documentation
|
Definition at line 27 of file plug_realtime.c. |
|
Definition at line 2022 of file plug_realtime.c. Referenced by RT_process_info(). |
|
|
|
macro to close down the realtime input stream * Definition at line 808 of file plug_realtime.c. Referenced by RT_worker(). |
|
popup a message to keep the user occupied. * Definition at line 2944 of file plug_realtime.c. Referenced by RT_read_image(). |
|
Definition at line 2945 of file plug_realtime.c. Referenced by RT_read_image(). |
|
Definition at line 3961 of file plug_realtime.c. |
|
Definition at line 102 of file plug_realtime.c. Referenced by new_RT_input(). |
|
Definition at line 98 of file plug_realtime.c. Referenced by new_RT_input(). |
|
Definition at line 99 of file plug_realtime.c. Referenced by new_RT_input(). |
|
Definition at line 100 of file plug_realtime.c. Referenced by new_RT_input(). |
|
Definition at line 101 of file plug_realtime.c. Referenced by new_RT_input(). |
|
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(). |
|
Definition at line 84 of file plug_realtime.c. Referenced by new_RT_input(), RT_process_image(), RT_process_info(), and RT_start_dataset(). |
|
Definition at line 85 of file plug_realtime.c. Referenced by new_RT_input(), RT_process_image(), RT_process_info(), and RT_start_dataset(). |
|
Definition at line 86 of file plug_realtime.c. Referenced by RT_process_image(), RT_process_info(), and RT_start_dataset(). |
|
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(). |
|
Definition at line 351 of file plug_realtime.c. Referenced by RT_fim_recurse(), and RT_tell_afni_one(). |
|
------------ 01 Aug 1998: replace the macro with a function -----------* Definition at line 813 of file plug_realtime.c. |
|
Definition at line 346 of file plug_realtime.c. Referenced by new_RT_input(), and RT_process_info(). |
|
Definition at line 347 of file plug_realtime.c. |
|
Definition at line 463 of file plug_realtime.c. Referenced by cleanup_rtinp(). |
|
Definition at line 4542 of file plug_realtime.c. Referenced by RT_fim_recurse(). |
|
Definition at line 17 of file plug_realtime.c. Referenced by new_RT_input(), RT_acquire_info(), and RT_worker(). |
|
Definition at line 349 of file plug_realtime.c. Referenced by RT_fim_recurse(), and RT_process_image(). |
|
Definition at line 21 of file plug_realtime.c. Referenced by RT_acquire_info(). |
|
Definition at line 112 of file plug_realtime.c. Referenced by cleanup_rtinp(), new_RT_input(), RT_process_info(), and RT_tell_afni(). |
|
At last -- process image data * Definition at line 1226 of file plug_realtime.c. Referenced by RT_process_xevents(). |
|
Definition at line 3099 of file plug_realtime.c. Referenced by RT_process_image(). |
|
Definition at line 4525 of file plug_realtime.c. Referenced by RT_fim_recurse(). |
|
Definition at line 2024 of file plug_realtime.c. Referenced by RT_process_info(). |
|
Definition at line 340 of file plug_realtime.c. Referenced by PLUGIN_init(), and RT_main(). |
|
Definition at line 371 of file plug_realtime.c. Referenced by PLUGIN_init(), and RT_main(). |
|
Definition at line 105 of file plug_realtime.c. Referenced by new_RT_input(). |
|
Definition at line 380 of file plug_realtime.c. Referenced by PLUGIN_init(), and RT_main(). |
|
Definition at line 374 of file plug_realtime.c. Referenced by PLUGIN_init(), and RT_main(). |
|
Definition at line 358 of file plug_realtime.c. Referenced by PLUGIN_init(), and RT_main(). |
|
Definition at line 357 of file plug_realtime.c. Referenced by PLUGIN_init(), and RT_main(). |
|
Definition at line 91 of file plug_realtime.c. Referenced by RT_process_info(). |
|
Definition at line 1708 of file plug_realtime.c. |
|
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. |
|
Definition at line 3962 of file plug_realtime.c. Referenced by RT_registration_2D_onevol(), and RT_registration_3D_onevol(). |
|
Definition at line 461 of file plug_realtime.c. |
|
Definition at line 396 of file plug_realtime.c. Referenced by RT_finish_dataset(), and RT_start_dataset(). |
|
Definition at line 398 of file plug_realtime.c. Referenced by RT_finish_dataset(), RT_process_info(), and RT_start_dataset(). |
|
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(). |
|
Definition at line 391 of file plug_realtime.c. Referenced by RT_finish_dataset(), and RT_registration_2D_atend(). |
|
Definition at line 390 of file plug_realtime.c. Referenced by RT_fim_recurse(), RT_process_image(), and RT_registration_2D_realtime(). |
|
Definition at line 393 of file plug_realtime.c. Referenced by RT_finish_dataset(), and RT_registration_3D_setup(). |
|
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(). |
|
Definition at line 392 of file plug_realtime.c. Referenced by RT_fim_recurse(), RT_process_image(), and RT_registration_3D_setup(). |
|
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(). |
|
Definition at line 93 of file plug_realtime.c. Referenced by RT_process_info(). |
|
Definition at line 94 of file plug_realtime.c. Referenced by RT_start_dataset(). |
|
Definition at line 96 of file plug_realtime.c. Referenced by new_RT_input(). |
|
Definition at line 104 of file plug_realtime.c. Referenced by RT_worker(). |
|
Definition at line 18 of file plug_realtime.c. Referenced by RT_acquire_info(), and RT_start_child(). |
|
Definition at line 20 of file plug_realtime.c. Referenced by new_RT_input(), RT_check_listen(), and RT_worker(). |
|
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(). |
|
Definition at line 2023 of file plug_realtime.c. |
|
Definition at line 16 of file plug_realtime.c. Referenced by RT_check_listen(). |
|
Definition at line 457 of file plug_realtime.c. Referenced by RT_finish_dataset(), RT_tell_afni(), and RT_tell_afni_one(). |
|
Definition at line 455 of file plug_realtime.c. Referenced by RT_process_image(), and RT_worker(). |
|
Definition at line 456 of file plug_realtime.c. |
|
Definition at line 350 of file plug_realtime.c. Referenced by RT_fim_recurse(), and RT_tell_afni_one(). |
|
Definition at line 468 of file plug_realtime.c. |
|
Definition at line 4286 of file plug_realtime.c. Referenced by RT_registration_3D_setup(). |
|
Definition at line 4285 of file plug_realtime.c. Referenced by RT_registration_3D_setup(). |
|
Definition at line 4284 of file plug_realtime.c. Referenced by RT_registration_3D_setup(). |
|
Definition at line 4283 of file plug_realtime.c. Referenced by RT_registration_3D_setup(). |
|
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(). |
|
Definition at line 459 of file plug_realtime.c. Referenced by RT_worker(). |
|
Definition at line 88 of file plug_realtime.c. Referenced by new_RT_input(), RT_process_image(), RT_process_info(), and RT_start_dataset(). |
|
Definition at line 90 of file plug_realtime.c. Referenced by RT_process_info(), and RT_start_dataset(). |
|
Definition at line 89 of file plug_realtime.c. Referenced by RT_process_image(), RT_process_info(), and RT_start_dataset(). |
Function Documentation
|
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 } |
|
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 } |
|
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 } |
|
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 } |
|
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 } /**************************/ |
|
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 } |
|
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 } |
|
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 } |
|
--- 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 } |
|
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 } |
|
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 } |
|
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 } |
|
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 } |
|
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 } |
|
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 } |
|
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 } |
|
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 } |
|
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 } |
|
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 } |
|
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 } |
|
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 } |
|
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 } |
|
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 } |
|
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 } |
|
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 } |
|
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 } |
|
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 } |
|
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 } |
|
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 } |
|
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 } |
|
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 } |
|
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 } |
|
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 } |
|
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 } |
|
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 } |
|
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 } |
|
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 } |
|
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
|
Definition at line 342 of file plug_realtime.c. Referenced by new_RT_input(), PLUGIN_init(), and RT_main(). |
|
Definition at line 355 of file plug_realtime.c. Referenced by new_RT_input(). |
|
Definition at line 341 of file plug_realtime.c. Referenced by PLUGIN_init(), and RT_main(). |
|
Definition at line 372 of file plug_realtime.c. Referenced by PLUGIN_init(), and RT_main(). |
|
Definition at line 250 of file plug_realtime.c. Referenced by PLUGIN_init(). |
|
Definition at line 344 of file plug_realtime.c. Referenced by new_RT_input(), PLUGIN_init(), and RT_main(). |
|
Definition at line 408 of file plug_realtime.c. |
|
Definition at line 114 of file plug_realtime.c. Referenced by RT_start_dataset(). |
|
Definition at line 116 of file plug_realtime.c. |
|
Definition at line 115 of file plug_realtime.c. Referenced by RT_start_dataset(). |
|
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(). |
|
Definition at line 368 of file plug_realtime.c. Referenced by new_RT_input(), PLUGIN_init(), and RT_main(). |
|
Definition at line 367 of file plug_realtime.c. Referenced by new_RT_input(), PLUGIN_init(), and RT_main(). |
|
Initial value: { MRI_CUBIC , MRI_QUINTIC , MRI_HEPTIC , MRI_FOURIER , -666 } Definition at line 377 of file plug_realtime.c. Referenced by new_RT_input(). |
|
Initial value: { "Cubic" , "Quintic" , "Heptic" , "Fourier" , "Hept+Four" } Definition at line 375 of file plug_realtime.c. Referenced by PLUGIN_init(), and RT_main(). |
|
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(). |
|
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(). |
|
Definition at line 369 of file plug_realtime.c. Referenced by new_RT_input(), PLUGIN_init(), and RT_main(). |
|
Definition at line 365 of file plug_realtime.c. Referenced by new_RT_input(), PLUGIN_init(), and RT_main(). |
|
Definition at line 364 of file plug_realtime.c. Referenced by new_RT_input(), PLUGIN_init(), and RT_main(). |
|
Definition at line 363 of file plug_realtime.c. Referenced by new_RT_input(), PLUGIN_init(), and RT_main(). |
|
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(). |
|
Definition at line 409 of file plug_realtime.c. |
|
Definition at line 338 of file plug_realtime.c. Referenced by PLUGIN_init(), RT_main(), RT_process_image(), and RT_start_dataset(). |
|
Definition at line 359 of file plug_realtime.c. Referenced by PLUGIN_init(), and RT_main(). |
|