#include "mrilib.h"
int main( int argc , char *argv[] )
{
MRI_IMAGE *outim , *rim ;
MRI_IMARR *imar ;
int dcode=0 , ii=0,jj=0,kk=0 , ival,nval , nopt=1 , nrow ;
THD_3dim_dataset *dset=NULL ;
char *fname="-" ;
if( argc < 2 || strcmp(argv[1],"-help") == 0 ){
printf(
"Program to extract 1 row from a dataset and write it as a .1D file\n"
"Usage: 3dGetrow [options] dataset\n"
"\n"
"OPTIONS:\n"
"-------\n"
"Exactly ONE of the following three options is required:\n"
" -xrow j k = extract row along the x-direction at fixed y-index of j\n"
" and fixed z-index of k.\n"
" -yrow i k = similar for a row along the y-direction\n"
" -zrow i j = similar for a row along the z-direction\n"
" -input ddd = read input from dataset 'ddd'\n"
" (instead of putting dataset name at end of command line)\n"
" -output ff = filename for output .1D ASCII file will be 'ff'\n"
" (if 'ff' is '-', then output is to stdout, the default)\n"
"\n"
"N.B.: if the input dataset has more than one sub-brick, each\n"
" sub-brick will appear as a separate column in the output file.\n"
) ;
exit(0) ;
}
/*---- scan command line args ----*/
mainENTRY("3dGetrow main") ; machdep() ; PRINT_VERSION("3dGetrow") ;
while( nopt < argc && argv[nopt][0] == '-' ){
if( strcmp(argv[nopt],"-input") == 0 ){
if( dset != NULL )
ERROR_exit("Can't have 2 -input options") ;
if( ++nopt >= argc )
ERROR_exit("Need argument after '-input'") ;
dset = THD_open_dataset(argv[nopt]) ; CHECK_OPEN_ERROR(dset,argv[nopt]) ;
DSET_load(dset) ; CHECK_LOAD_ERROR(dset) ;
nopt++ ; continue ;
}
if( strcmp(argv[nopt],"-output") == 0 ){
if( ++nopt >= argc )
ERROR_exit("Need argument after '-output'") ;
fname = argv[nopt] ;
if( !THD_filename_ok(fname) )
ERROR_exit("Illegal output filename '%s'",fname) ;
nopt++ ; continue ;
}
if( strcmp(argv[nopt],"-xrow") == 0 || strcmp(argv[nopt],"--xrow") == 0 ){
if( nopt+2 >= argc )
ERROR_exit("Need 2 arguments after '-xrow'") ;
dcode = (argv[nopt][1] == '-') ? -1 : 1 ;
jj = (int)strtod(argv[++nopt],NULL) ;
kk = (int)strtod(argv[++nopt],NULL) ;
nopt++ ; continue ;
}
if( strcmp(argv[nopt],"-yrow") == 0 || strcmp(argv[nopt],"--yrow") == 0 ){
if( nopt+2 >= argc )
ERROR_exit("Need 2 arguments after '-yrow'") ;
dcode = (argv[nopt][1] == '-') ? -2 : 2 ;
ii = (int)strtod(argv[++nopt],NULL) ;
kk = (int)strtod(argv[++nopt],NULL) ;
nopt++ ; continue ;
}
if( strcmp(argv[nopt],"-zrow") == 0 || strcmp(argv[nopt],"--zrow") == 0 ){
if( nopt+2 >= argc )
ERROR_exit("Need 2 arguments after '-zrow'") ;
dcode = (argv[nopt][1] == '-') ? -3 : 3 ;
ii = (int)strtod(argv[++nopt],NULL) ;
jj = (int)strtod(argv[++nopt],NULL) ;
nopt++ ; continue ;
}
ERROR_exit("Unknown option '%s'",argv[nopt]) ;
}
/* must have had a -?row option */
if( dcode == 0 ) ERROR_exit("Need one of -xrow, -yrow, or -zrow!") ;
/* dataset needed still? */
if( dset == NULL ){
if( nopt >= argc )
ERROR_exit("No dataset on command line!?") ;
dset = THD_open_dataset(argv[nopt]) ; CHECK_OPEN_ERROR(dset,argv[nopt]) ;
DSET_load(dset) ; CHECK_LOAD_ERROR(dset) ;
}
/* get first sub-brick's row */
nval = DSET_NVALS(dset) ;
rim = mri_get_dset_row( dset , 0 , dcode , ii,jj,kk ) ;
if( rim == NULL )
ERROR_exit("Can't extract row from (ii,jj,kk)=(%d,%d,%d) !?",ii,jj,kk) ;
/* if only 1 sub-brick, am done! */
if( nval == 1 ){
mri_write_1D(fname,rim) ; exit(0) ;
}
/* multiple sub-bricks ==> get more rows, paste together */
INIT_IMARR(imar) ;
ADDTO_IMARR(imar,rim) ;
for( ival=1 ; ival < nval ; ival++ ){
rim = mri_get_dset_row( dset , ival , dcode , ii,jj,kk ) ;
if( rim == NULL )
ERROR_exit("Can't extract row from (ii,jj,kk,vv)=(%d,%d,%d,%d) !?",
ii,jj,kk,ival) ;
ADDTO_IMARR(imar,rim) ;
}
DSET_unload(dset) ;
/* paste images together into one big happy family */
outim = mri_cat2D(1,nval,0,NULL,imar) ; DESTROY_IMARR(imar) ;
if( outim == NULL )
ERROR_exit("Can't glue multiple output rows together?!") ;
mri_write_1D(fname,outim) ; exit(0) ;
}
syntax highlighted by Code2HTML, v. 0.9.1