/*-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
This software is Copyright 1994-1996 by
Medical College of Wisconsin
8701 Watertown Plank Road
Milwaukee, WI 53226
License is granted to use this program for nonprofit research purposes only.
It is specifically against the license to use this program for any clinical
application. The Medical College of Wisconsin makes no warranty of usefulness
of this program for any particular purpose. The redistribution of this
program for a fee, or the derivation of for-profit works from this program
is not allowed.
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/
#include "mrilib.h"
void Syntax(void)
{
printf(
"Copyright 1994-6 Medical College of Wisconsin\n\n"
"Prints out sort-of-useful information from a 3D dataset's header\n"
"Usage: 3dinfo [-v] dataset [dataset ...]\n"
" The -v option means print out verbose information. At present,\n"
" it just causes the printing of all the statistics for each time\n"
" in a time-dependent dataset.\n"
) ;
exit(0) ;
}
int main( int argc , char * argv[] )
{
THD_3dim_dataset * dset ;
THD_dataxes * daxes ;
THD_fvec3 fv1 , fv2 , fv3 ;
THD_ivec3 iv ;
int iarg , ival , ntimes , nval_per , n1,n2,n3 , verbose = 0 , kv,npar ;
float tf ;
static char * RR="[R]" , * LL="[L]" ,
* PP="[P]" , * AA="[A]" ,
* SS="[S]" , * II="[I]" , * ZZ=" " ;
char * xlbot , * xltop , * ylbot , * yltop , * zlbot , * zltop , * cpt ;
char str[256] ;
int nstr ;
#define XLAB(xl,xv) ((xl) = ((xv)==0.0) ? (ZZ) : ( ((xv)<0.0) ? (RR) : (LL) ))
#define YLAB(yl,yv) ((yl) = ((yv)==0.0) ? (ZZ) : ( ((yv)<0.0) ? (AA) : (PP) ))
#define ZLAB(zl,zv) ((zl) = ((zv)==0.0) ? (ZZ) : ( ((zv)<0.0) ? (II) : (SS) ))
#define FSWAP(x,y) (tf=(x),(x)=(y),(y)=tf)
if( argc < 2 || strncmp(argv[1],"-help",4) == 0 ) Syntax() ;
iarg = 1 ;
if( strcmp(argv[iarg],"-v") == 0 ){ verbose = 1 ; iarg++ ; }
for( ; iarg < argc ; iarg++ ){
dset = THD_open_one_dataset( argv[iarg] ) ;
if( dset == NULL ) continue ;
daxes = dset->daxes ;
printf("\n"
"Dataset File: %s\n"
#if 0
"Dataset Name: %s\n"
"Dataset Label: %s\n"
#endif
, argv[iarg]
#if 0
, dset->self_name , dset->label1
#endif
) ;
#ifndef OMIT_DATASET_IDCODES
printf("Identifier Code: %s Creation Date: %s\n" ,
dset->idcode.str , dset->idcode.date ) ;
#endif
if( ISANAT(dset) ){
printf("Dataset Type: %s (-%s)\n",
ANAT_typestr[dset->func_type] , ANAT_prefixstr[dset->func_type] ) ;
} else {
printf("Dataset Type: %s (-%s)\n",
FUNC_typestr[dset->func_type] , FUNC_prefixstr[dset->func_type] ) ;
}
cpt = DSET_KEYWORDS(dset) ;
if( cpt != NULL && cpt[0] != '\0' )
printf("Keywords: %s\n" , cpt ) ;
#ifdef OMIT_DATASET_IDCODES
if( strlen(dset->anat_parent_name) > 0 )
printf("Anatomy Parent: %s\n" , dset->anat_parent_name ) ;
if( strlen(dset->warp_parent_name) > 0 )
printf("Warp Parent: %s\n" , dset->warp_parent_name ) ;
#else
if( ! ISZERO_IDCODE(dset->anat_parent_idcode) )
printf("Anatomy Parent: %s [%s]\n" ,
dset->anat_parent_name , dset->anat_parent_idcode.str ) ;
else if( strlen(dset->anat_parent_name) > 0 )
printf("Anatomy Parent: %s\n" , dset->anat_parent_name ) ;
if( ! ISZERO_IDCODE(dset->warp_parent_idcode) )
printf("Warp Parent: %s [%s]\n" ,
dset->warp_parent_name , dset->warp_parent_idcode.str) ;
else if( strlen(dset->warp_parent_name) > 0 )
printf("Warp Parent: %s\n" , dset->warp_parent_name ) ;
#endif
printf(
"Data Axes Orientation:\n"
" first (x) = %s\n"
" second (y) = %s\n"
" third (z) = %s [-orient %c%c%c]\n" ,
ORIENT_typestr[daxes->xxorient] ,
ORIENT_typestr[daxes->yyorient] ,
ORIENT_typestr[daxes->zzorient] ,
ORIENT_typestr[daxes->xxorient][0] ,
ORIENT_typestr[daxes->yyorient][0] ,
ORIENT_typestr[daxes->zzorient][0] ) ;
LOAD_FVEC3(fv1 , daxes->xxorg , daxes->yyorg , daxes->zzorg) ;
fv1 = THD_3dmm_to_dicomm( dset , fv1 ) ;
LOAD_FVEC3(fv2 , daxes->xxorg + (daxes->nxx-1)*daxes->xxdel ,
daxes->yyorg + (daxes->nyy-1)*daxes->yydel ,
daxes->zzorg + (daxes->nzz-1)*daxes->zzdel ) ;
fv2 = THD_3dmm_to_dicomm( dset , fv2 ) ;
if( fv1.xyz[0] > fv2.xyz[0] ) FSWAP( fv1.xyz[0] , fv2.xyz[0] ) ;
if( fv1.xyz[1] > fv2.xyz[1] ) FSWAP( fv1.xyz[1] , fv2.xyz[1] ) ;
if( fv1.xyz[2] > fv2.xyz[2] ) FSWAP( fv1.xyz[2] , fv2.xyz[2] ) ;
LOAD_FVEC3(fv3 , daxes->xxdel , daxes->yydel , daxes->zzdel) ;
fv3 = THD_3dmm_to_dicomm( dset , fv3 ) ;
XLAB(xlbot,fv1.xyz[0]) ; YLAB(ylbot,fv1.xyz[1]) ; ZLAB(zlbot,fv1.xyz[2]) ;
XLAB(xltop,fv2.xyz[0]) ; YLAB(yltop,fv2.xyz[1]) ; ZLAB(zltop,fv2.xyz[2]) ;
n1 = DAXES_NUM(daxes,daxes->xxorient) ;
n2 = DAXES_NUM(daxes,daxes->yyorient) ;
n3 = DAXES_NUM(daxes,daxes->zzorient) ;
printf(
"R-to-L extent: %9.3f %s -to- %9.3f %s -step- %9.3f mm [%3d voxels]\n"
"A-to-P extent: %9.3f %s -to- %9.3f %s -step- %9.3f mm [%3d voxels]\n"
"I-to-S extent: %9.3f %s -to- %9.3f %s -step- %9.3f mm [%3d voxels]\n" ,
fv1.xyz[0],xlbot , fv2.xyz[0],xltop , fabs(fv3.xyz[0]) , n1 ,
fv1.xyz[1],ylbot , fv2.xyz[1],yltop , fabs(fv3.xyz[1]) , n2 ,
fv1.xyz[2],zlbot , fv2.xyz[2],zltop , fabs(fv3.xyz[2]) , n3 ) ;
ntimes = DSET_NUM_TIMES(dset) ;
nval_per = DSET_NVALS_PER_TIME(dset) ;
if( ntimes > 1 ){
printf(
"Number of time steps = %d Number of values at each pixel = %d\n",
ntimes , nval_per ) ;
printf( "Time step = %.3f (%s)" ,
dset->taxis->ttdel ,
UNITS_TYPE_LABEL(dset->taxis->units_type) ) ;
if( dset->taxis->nsl > 0 )
printf(" Number time-offset slices = %d Thickness = %.3f",
dset->taxis->nsl , fabs(dset->taxis->dz_sl) ) ;
printf("\n") ;
if( verbose && dset->taxis->nsl > 0 ){
printf("Time-offsets per slice:") ;
for( ival=0 ; ival < dset->taxis->nsl ; ival++ )
printf( " %.3f" , dset->taxis->toff_sl[ival] ) ;
printf("\n") ;
}
} else {
printf(
"Number of values stored at each pixel = %d\n" , nval_per ) ;
}
if( verbose && ntimes > 1 ) nval_per = dset->dblk->nvals ;
for( ival=0 ; ival < nval_per ; ival++ ){
sprintf( str ,
" -- At sub-brick #%d [%s] datum type is %s" ,
ival , dset->dblk->brick_lab[ival] ,
MRI_TYPE_name[DSET_BRICK_TYPE(dset,ival)] ) ;
nstr = strlen(str) ;
tf = DSET_BRICK_FACTOR(dset,ival) ;
if( ISVALID_STATISTIC(dset->stats) ){
if( tf != 0.0 )
sprintf( str+nstr ,
":%13.6g to %13.6g [internal]\n"
"%*s[*%13.6g] %13.6g to %13.6g [scaled]\n" ,
dset->stats->bstat[ival].min/tf ,
dset->stats->bstat[ival].max/tf ,
nstr-16," " , tf ,
dset->stats->bstat[ival].min , dset->stats->bstat[ival].max ) ;
else
sprintf( str+nstr , ":%13.6g to %13.6g\n" ,
dset->stats->bstat[ival].min , dset->stats->bstat[ival].max ) ;
} else if( tf != 0.0 ){
sprintf( str+nstr , " [*%g]\n",tf) ;
} else {
sprintf( str+nstr , "\n") ;
}
printf(str) ;
/** 30 Nov 1997: print sub-brick stat params **/
kv = DSET_BRICK_STATCODE(dset,ival) ;
if( FUNC_IS_STAT(kv) ){
printf(" statcode = %s",FUNC_prefixstr[kv] ) ;
npar = FUNC_need_stat_aux[kv] ;
if( npar > 0 ){
printf("; statpar =") ;
for( kv=0 ; kv < npar ; kv++ )
printf(" %g",DSET_BRICK_STATPAR(dset,ival,kv)) ;
}
printf("\n") ;
}
cpt = DSET_BRICK_KEYWORDS(dset,ival) ;
if( cpt != NULL && cpt[0] != '\0' )
printf(" keywords = %s\n",cpt) ;
}
/** print out dataset global statistical parameters **/
if( ISFUNC(dset) && FUNC_need_stat_aux[dset->func_type] > 0 ){
printf("Auxiliary functional statistical parameters:\n %s\n",
FUNC_label_stat_aux[dset->func_type] ) ;
for( ival=0 ; ival < FUNC_need_stat_aux[dset->func_type] ; ival++ )
printf(" %g",dset->stat_aux[ival]) ;
printf("\n") ;
}
THD_delete_3dim_dataset( dset , False ) ;
}
exit(0) ;
}
syntax highlighted by Code2HTML, v. 0.9.1