Doxygen Source Code Documentation
jp_afni.c File Reference
#include "def_epi.h"
#include "jp_afni.h"
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <sys/wait.h>
Go to the source code of this file.
Defines | |
#define | USE_FORK |
Functions | |
void | AFNI_sigfunc (int sig) |
void | AFNI_exit (void) |
void | AFNI_start_io (int nim) |
void | AFNI_send_image (int nim) |
Variables | |
EXT struct im_info | imX [] |
int | AJxres |
int | AJreps |
int | AJovs |
int | AJtopovs |
int | AJyres |
int | epramp |
int | opentry |
int | oppos |
int | opspf |
int | opplane |
int | opobplane |
int | AJopte |
int | opte2 |
int | opti |
int | optr |
int | opslquant |
float | opfov |
float | opslthick |
float | opslspace |
float | opnex |
float | filt_band |
float | sl_pos [] |
int | Signa_info |
char | AFNI_infobuf [1024] = "\0" |
int | use_fork = 0 |
pid_t | pid_fork = 0 |
Define Documentation
|
|
Function Documentation
|
Definition at line 54 of file jp_afni.c. References iochan_close(), iochan_sleep(), pid_fork, and use_fork.
00055 { /* the AFNI data channels get closed. */ 00056 iochan_close(AFNI_ioc) ; 00057 00058 #ifdef USE_FORK 00059 if( use_fork && pid_fork != 0 && pid_fork != (pid_t)(-1) ){ 00060 int kk = kill( pid_fork , SIGTERM ) ; 00061 if( kk == 0 ){ 00062 pid_t qpid=0 ; 00063 for( kk=0 ; kk < 10 && qpid == 0 ; kk++ ){ 00064 iochan_sleep(5) ; 00065 qpid = waitpid( pid_fork , NULL , WNOHANG ) ; 00066 } 00067 } 00068 } 00069 #endif 00070 00071 return ; 00072 } |
|
send image in imX[nim] to AFNI * Definition at line 377 of file jp_afni.c. References AFNI_infobuf, imX, IOCHAN_CLOSE, iochan_sendall(), iochan_sleep(), iochan_writecheck(), SHM_IOCHAN, and use_fork. Referenced by AFNI_start_io().
00378 { 00379 int lx = imX[nim].x , ly = imX[nim].y , nbytes = 2*lx*ly , soff , jj ; 00380 00381 if( AFNI_mode != AFNI_CONTINUE_MODE ) return ; 00382 00383 if ( (lx*ly) == 65536 ) soff = OFFSET; /* for Signa */ 00384 else soff = 0; 00385 00386 /** before very 1st image, send data type and matrix size **/ 00387 00388 if( nim == 0 ){ 00389 00390 if( AFNI_verbose ) fprintf(stderr,"Sending 1st info+image to AFNI.\n") ; 00391 00392 if( AFNI_infobuf[0] == '\0' ) 00393 sprintf( AFNI_buf , "DATUM short\nXYMATRIX %d %d\n" , lx,ly ) ; 00394 else 00395 sprintf( AFNI_buf , "%s\nDATUM short\nXYMATRIX %d %d\n" , 00396 AFNI_infobuf , lx,ly ) ; 00397 00398 iochan_sendall( AFNI_ioc , AFNI_buf , strlen(AFNI_buf)+1 ) ; 00399 00400 } else if( AFNI_verbose ){ 00401 00402 fprintf(stderr,"Sending image %d to AFNI.\n",nim+1) ; 00403 00404 } 00405 00406 jj = iochan_writecheck( AFNI_ioc , 1 ) ; 00407 if( jj <= 0 ){ 00408 fprintf(stderr,"Image transmission to AFNI impossible at #%d.\a\n",nim) ; 00409 if( AFNI_ioc->type == SHM_IOCHAN ) 00410 fprintf(stderr," shm: bstart=%d bend=%d\n", 00411 *(AFNI_ioc->bstart),*(AFNI_ioc->bend) ) ; 00412 iochan_sleep(1) ; 00413 IOCHAN_CLOSE(AFNI_ioc) ; 00414 use_fork = 0 ; AFNI_mode = 0 ; 00415 fprintf(stderr,"Closed connection to AFNI\n") ; 00416 return ; 00417 } 00418 if( AFNI_ioc->type == SHM_IOCHAN && jj < nbytes ){ 00419 fprintf(stderr,"Image transmission to AFNI incomplete at #%d.\a\n",nim) ; 00420 if( AFNI_ioc->type == SHM_IOCHAN ) 00421 fprintf(stderr," shm: bstart=%d bend=%d\n", 00422 *(AFNI_ioc->bstart),*(AFNI_ioc->bend) ) ; 00423 iochan_sleep(1) ; 00424 IOCHAN_CLOSE(AFNI_ioc) ; 00425 use_fork = 0 ; AFNI_mode = 0 ; 00426 fprintf(stderr,"Closed connection to AFNI\n") ; 00427 return ; 00428 } 00429 00430 jj = iochan_sendall( AFNI_ioc , imX[nim].arr + soff , nbytes ) ; 00431 00432 /** if the data channel failed, stop **/ 00433 00434 if( jj < 0 ){ 00435 fprintf(stderr,"Image transmission to AFNI fails at #%d.\a\n",nim) ; 00436 if( AFNI_ioc->type == SHM_IOCHAN ) 00437 fprintf(stderr," shm: bstart=%d bend=%d\n", 00438 *(AFNI_ioc->bstart),*(AFNI_ioc->bend) ) ; 00439 iochan_sleep(1) ; 00440 IOCHAN_CLOSE(AFNI_ioc) ; 00441 use_fork = 0 ; AFNI_mode = 0 ; 00442 fprintf(stderr,"Closed connection to AFNI\n") ; 00443 return ; 00444 } 00445 00446 return ; 00447 } |
|
signal handler for fatal errors * Definition at line 36 of file jp_afni.c. Referenced by AFNI_start_io().
00037 { 00038 char * sname ; 00039 switch(sig){ 00040 default: sname = "unknown" ; break ; 00041 case SIGINT: sname = "SIGINT" ; break ; 00042 case SIGPIPE: sname = "SIGPIPE" ; break ; 00043 case SIGSEGV: sname = "SIGSEGV" ; break ; 00044 case SIGBUS: sname = "SIGBUS" ; break ; 00045 case SIGTERM: sname = "SIGTERM" ; break ; 00046 } 00047 fprintf(stderr,"\nFatal Signal %d (%s) received\n",sig,sname) ; 00048 fprintf(stderr,"*** Program Abort ***\n") ; fflush(stderr) ; 00049 exit(1) ; 00050 } |
|
Definition at line 95 of file jp_afni.c. References AFNI_infobuf, AFNI_send_image(), AFNI_sigfunc(), COX_clock_time(), iochan_clearcheck(), IOCHAN_CLOSE, iochan_fork_relay(), iochan_init(), iochan_sendall(), iochan_sleep(), iochan_writecheck(), opfov, opobplane, opplane, opslquant, opslspace, opslthick, opspf, optr, pid_fork, read_Signa_cvs(), Signa_info, sl_pos, tt, and use_fork.
00096 { 00097 int ii ; 00098 00099 /***** Check for illegal conditions *****/ 00100 00101 if( AFNI_mode <= 0 || AFNI_mode == AFNI_CONTINUE_MODE ) return ; 00102 00103 /***** If we are at the first time in, 00104 try to open a control socket to talk to AFNI *****/ 00105 00106 if( AFNI_mode == AFNI_OPEN_CONTROL_MODE ){ 00107 00108 sprintf( AFNI_iochan , "tcp:%s:%d" , AFNI_host , AFNI_CONTROL_PORT ) ; 00109 00110 if( AFNI_verbose ) 00111 fprintf(stderr,"Opening control channel %s to AFNI.\n",AFNI_iochan) ; 00112 00113 AFNI_ioc = iochan_init( AFNI_iochan , "w" ) ; 00114 00115 if( AFNI_ioc == NULL ){ 00116 fprintf(stderr,"Can't open control channel %s to AFNI!\a\n",AFNI_iochan) ; 00117 AFNI_mode = 0 ; return ; 00118 } else { 00119 if( AFNI_verbose ) fprintf(stderr,"Entering AFNI_WAIT_CONTROL_MODE.\n") ; 00120 AFNI_mode = AFNI_WAIT_CONTROL_MODE ; /* begin waiting for AFNI connection */ 00121 } 00122 00123 signal( SIGTERM , AFNI_sigfunc ) ; /* 23 May 2001 */ 00124 signal( SIGSEGV , AFNI_sigfunc ) ; 00125 signal( SIGINT , AFNI_sigfunc ) ; 00126 } 00127 00128 /***** Check if the control socket is connected to AFNI *****/ 00129 00130 if( AFNI_mode == AFNI_WAIT_CONTROL_MODE ){ 00131 00132 ii = iochan_writecheck( AFNI_ioc , 1 ) ; /* Check; wait at most 1 msec */ 00133 00134 /** if ii == 0, then the channel is still pending, 00135 so do nothing; otherwise, take some action. **/ 00136 00137 if( ii < 0 ){ 00138 fprintf(stderr,"Control channel to AFNI failed!\a\n") ; 00139 IOCHAN_CLOSE(AFNI_ioc) ; 00140 AFNI_mode = 0 ; return ; 00141 } else if( ii > 0 ){ 00142 if( AFNI_verbose ) fprintf(stderr,"Control channel connected to AFNI." 00143 " Entering AFNI_OPEN_DATA_MODE.\n") ; 00144 AFNI_mode = AFNI_OPEN_DATA_MODE ; /* prepare to send data to AFNI */ 00145 } 00146 } 00147 00148 /***** Send the control information, which says 00149 how we will talk to AFNI in the future (shmem or TCP/IP), 00150 then close the control channel and open this new data channel *****/ 00151 00152 if( AFNI_mode == AFNI_OPEN_DATA_MODE ){ 00153 00154 /** decide name of data channel: it can be TCP/IP or shared memory **/ 00155 00156 if( AFNI_use_tcp ) sprintf(AFNI_iochan,"tcp:%s:%d",AFNI_host,AFNI_TCP_PORT) ; 00157 else strcpy(AFNI_iochan,"shm:eps:8M") ; 00158 00159 strcpy(AFNI_buf,AFNI_iochan) ; /* tell AFNI where to read data */ 00160 if( AFNI_infocom[0] != '\0' ){ 00161 strcat(AFNI_buf,"\n") ; 00162 strcat(AFNI_buf,AFNI_infocom) ; /* tell it where to get 3T info */ 00163 } 00164 00165 if( AFNI_verbose ) 00166 fprintf(stderr,"Sending control information to AFNI:\n%s\n",AFNI_buf) ; 00167 00168 ii = iochan_sendall( AFNI_ioc , AFNI_buf , strlen(AFNI_buf)+1 ) ; 00169 00170 /** A negative return is bad news **/ 00171 00172 if( ii < 0 ){ 00173 fprintf(stderr,"Transmission of control data to AFNI failed!\a\n") ; 00174 IOCHAN_CLOSE(AFNI_ioc) ; 00175 AFNI_mode = 0 ; return ; 00176 } else { 00177 while( ! iochan_clearcheck(AFNI_ioc,2) ) /* wait for control data to clear */ 00178 iochan_sleep(2) ; 00179 IOCHAN_CLOSE(AFNI_ioc) ; /* close control channel */ 00180 00181 if( AFNI_verbose ) 00182 fprintf(stderr,"Opening data channel %s to AFNI.\n",AFNI_iochan) ; 00183 00184 #ifdef USE_FORK 00185 use_fork = AFNI_use_tcp ; 00186 #endif 00187 00188 if( use_fork ){ /* fork a relay process to talk to AFNI */ 00189 00190 AFNI_ioc = iochan_init( "shm:forkage:8M" , "create" ) ; 00191 if( AFNI_ioc == NULL ){ 00192 fprintf(stderr,"Can't open shm:forkage:8M for relay to AFNI!\n"); 00193 use_fork = 0 ; AFNI_mode = 0 ; return ; 00194 } 00195 pid_fork = iochan_fork_relay( "shm:forkage:8M" , AFNI_iochan ) ; 00196 if( pid_fork == (pid_t)(-1) || pid_fork == 0 ){ 00197 fprintf(stderr,"Can't fork for relay to AFNI!\n") ; 00198 IOCHAN_CLOSE(AFNI_ioc) ; pid_fork = 0 ; use_fork = 0 ; 00199 AFNI_mode = 0 ; return ; 00200 } 00201 00202 } else { /* directly handle I/O to AFNI ourselves */ 00203 00204 AFNI_ioc = iochan_init( AFNI_iochan , "w" ) ; /* open data channel */ 00205 if( AFNI_ioc == NULL ){ 00206 fprintf(stderr,"Can't open data channel %s to AFNI!\a\n",AFNI_iochan) ; 00207 AFNI_mode = 0 ; return ; 00208 } 00209 } 00210 00211 if( AFNI_verbose ) fprintf(stderr,"Entering AFNI_CATCHUP_MODE.\n") ; 00212 AFNI_mode = AFNI_CATCHUP_MODE ; 00213 } 00214 } 00215 00216 /***** Wait for the data channel to be connected to AFNI, 00217 and then send any images that are reconstructed and ready to go *****/ 00218 00219 if( AFNI_mode == AFNI_CATCHUP_MODE ){ 00220 00221 ii = iochan_writecheck( AFNI_ioc , 1 ) ; /* wait at most 1 msec */ 00222 if( ii < 0 ){ 00223 fprintf(stderr,"AFNI data channel aborted before any data was sent!\a\n") ; 00224 IOCHAN_CLOSE( AFNI_ioc ) ; 00225 use_fork = 0 ; AFNI_mode = 0 ; return ; 00226 } else if( ii > 0 ){ /* can now send data to AFNI! */ 00227 if( AFNI_verbose ) 00228 fprintf(stderr,"AFNI data channel %s is connected.\n",AFNI_iochan) ; 00229 00230 /*** final preparation code depends on which scanner we are using ***/ 00231 00232 #if defined(AFNI_BRUKER_BRI) 00233 00234 /*-- for the Bruker, don't need to check anything else 00235 (external information comes from program 3T_toafni) --*/ 00236 00237 if( AFNI_verbose ) 00238 fprintf(stderr,"Entering AFNI_CONTINUE_MODE.\n") ; 00239 AFNI_mode = AFNI_CONTINUE_MODE ; 00240 00241 #elif defined(AFNI_SIGNA_KECK) 00242 00243 /*-- for the Keck Signa, we must have the external information now --*/ 00244 00245 if( !Signa_info ){ 00246 double tt = COX_clock_time() ; 00247 00248 fprintf(stderr, 00249 "\n\a" 00250 "*** WARNING: Reading Signa info for AFNI ('load')\n"); 00251 00252 read_Signa_cvs() ; 00253 00254 if( !Signa_info ){ /* failed! */ 00255 fprintf(stderr, 00256 "\n\a" 00257 "*** ERROR: Signa info is not 'load'-ed!\n" 00258 "*** Closing connection to AFNI.\n") ; 00259 00260 IOCHAN_CLOSE( AFNI_ioc ) ; 00261 use_fork = 0 ; AFNI_mode = 0 ; return ; 00262 } 00263 00264 tt = COX_clock_time() - tt ; 00265 fprintf(stderr, 00266 "*** Signa info transferred in %.1f s\n",tt) ; 00267 } 00268 00269 /*-- have external info, so compose it into the AFNI format --*/ 00270 00271 /* info that never changes (at least yet) */ 00272 00273 ii = strlen(AFNI_infobuf) ; 00274 sprintf( AFNI_infobuf+ii , "ZORDER alt\n" 00275 "ACQUISITION_TYPE 2D+zt\n" ) ; 00276 00277 /* field of view */ 00278 00279 ii = strlen(AFNI_infobuf) ; 00280 sprintf( AFNI_infobuf+ii , "XYFOV %.2f 0 0\n" , opfov ) ; 00281 00282 /* number of slices */ 00283 00284 ii = strlen(AFNI_infobuf) ; 00285 sprintf( AFNI_infobuf+ii , "ZNUM %d\n" , opslquant ) ; 00286 00287 /* slice thickness */ 00288 00289 ii = strlen(AFNI_infobuf) ; 00290 sprintf( AFNI_infobuf+ii , "ZDELTA %.2f\n" , opslthick+opslspace ) ; 00291 00292 /* slice orientation and offset */ 00293 00294 { static char *zzz[3]={"S","R","A"} ; /* positive z-axis for each orientation */ 00295 char *axx , *ayy , *azz ; /* strings for each axis orientation */ 00296 int jj = opplane ; /* orientation code from Signa */ 00297 00298 if( jj < 1 || jj > 3 ){ 00299 static char * pn[3] = { "Axial" , "Sagittal" , "Coronal" } ; 00300 jj = opobplane ; if( jj < 1 || jj > 3 ) jj = 1 ; 00301 fprintf(stderr, 00302 "\n\a" 00303 "*** WARNING: oblique slices; AFNI orientation=%s\n",pn[jj-1]) ; 00304 } 00305 00306 /* 07 Mar 2000: modified some of these codes, per Lloyd Estkowski */ 00307 00308 axx = ayy = azz = "???" ; /* just to keep the compiler happy */ 00309 switch( jj ){ 00310 case 1: /* Axial */ 00311 if( opspf == 0 ){ axx = "A-P" ; ayy = "R-L" ; } 00312 else { axx = "L-R" ; ayy = "A-P" ; } 00313 00314 if( sl_pos[0] < sl_pos[1] ) azz = "I-S" ; 00315 else azz = "S-I" ; 00316 break ; 00317 00318 case 2: /* Sagittal */ 00319 if( opspf == 0 ){ axx = "S-I" ; ayy = "A-P" ; } 00320 else { axx = "P-A" ; ayy = "S-I" ; } 00321 00322 if( sl_pos[0] < sl_pos[1] ) azz = "L-R" ; 00323 else azz = "R-L" ; 00324 break ; 00325 00326 case 3: /* Coronal */ 00327 if( opspf == 0 ){ axx = "I-S" ; ayy = "R-L" ; } 00328 else { axx = "R-L" ; ayy = "S-I" ; } 00329 00330 if( sl_pos[0] < sl_pos[1] ) azz = "P-A" ; 00331 else azz = "A-P" ; 00332 break ; 00333 } 00334 00335 ii = strlen(AFNI_infobuf) ; 00336 sprintf( AFNI_infobuf+ii , "XYZAXES %s %s %s\n" , axx,ayy,azz ) ; 00337 00338 fprintf(stderr,"AFNI Signa info: plane=%d spf=%d\n" ,jj,opspf) ; /* debugging */ 00339 fprintf(stderr," => XYZAXES %s %s %s\n",axx,ayy,azz) ; 00340 fprintf(stderr," => ZFIRST %.2f%s\n" ,sl_pos[0],zzz[jj-1] ) ; 00341 00342 ii = strlen(AFNI_infobuf) ; 00343 sprintf( AFNI_infobuf+ii , "ZFIRST %.2f%s\n" , sl_pos[0],zzz[jj-1] ) ; 00344 } 00345 00346 /* repetition time */ 00347 00348 ii = strlen(AFNI_infobuf) ; 00349 sprintf( AFNI_infobuf+ii , "TR %.3f\n" , 1.e-6*optr ) ; 00350 00351 /* ready to rock-n-roll */ 00352 00353 if( AFNI_verbose ) 00354 fprintf(stderr,"Entering AFNI_CONTINUE_MODE.\n") ; 00355 AFNI_mode = AFNI_CONTINUE_MODE ; 00356 00357 #endif /*** end of scanner dependent preparation code ***/ 00358 00359 /*** if there are any images already accumulated, send them now! ***/ 00360 00361 if( AFNI_mode == AFNI_CONTINUE_MODE ){ 00362 if( nim > 0 && AFNI_verbose ) 00363 fprintf(stderr,"Playing AFNI catchup with %d images.\n",nim) ; 00364 00365 for( ii=0 ; ii < nim ; ii++ ) AFNI_send_image( ii ) ; 00366 } 00367 } 00368 } 00369 00370 return ; 00371 } |
Variable Documentation
|
Definition at line 19 of file jp_afni.c. Referenced by AFNI_send_image(), and AFNI_start_io(). |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Definition at line 10 of file jp_afni.c. Referenced by AFNI_send_image(). |
|
|
|
Definition at line 15 of file jp_afni.c. Referenced by AFNI_start_io(). |
|
|
|
Definition at line 14 of file jp_afni.c. Referenced by AFNI_start_io(). |
|
Definition at line 14 of file jp_afni.c. Referenced by AFNI_start_io(). |
|
|
|
Definition at line 14 of file jp_afni.c. Referenced by AFNI_start_io(). |
|
Definition at line 15 of file jp_afni.c. Referenced by AFNI_start_io(). |
|
Definition at line 15 of file jp_afni.c. Referenced by AFNI_start_io(). |
|
Definition at line 14 of file jp_afni.c. Referenced by AFNI_start_io(). |
|
|
|
|
|
Definition at line 14 of file jp_afni.c. Referenced by AFNI_start_io(), clear_around_point(), display_coords(), and radial_fill(). |
|
Definition at line 30 of file jp_afni.c. Referenced by AFNI_exit(), and AFNI_start_io(). |
|
Definition at line 16 of file jp_afni.c. Referenced by AFNI_start_io(). |
|
Definition at line 15 of file jp_afni.c. Referenced by AFNI_start_io(). |
|
Definition at line 29 of file jp_afni.c. Referenced by AFNI_exit(), AFNI_send_image(), and AFNI_start_io(). |