Doxygen Source Code Documentation
Main Page Alphabetical List Data Structures File List Data Fields Globals Search
3dOverlap.c
Go to the documentation of this file.00001 #include "mrilib.h"
00002
00003 int main( int argc , char * argv[] )
00004 {
00005 int narg , nvox=0 , iv,ii,cnum ;
00006 THD_3dim_dataset * xset , * oset=NULL ;
00007 byte *mmm=NULL ;
00008 short *ccc=NULL , ctop ;
00009 char *psave=NULL ;
00010
00011
00012
00013 if( argc < 2 || strncmp(argv[1],"-help",5) == 0 ){
00014 printf("Usage: 3dOverlap [options] dset1 dset2 ...\n"
00015 "Output = count of number of voxels that are nonzero in ALL\n"
00016 " of the input dataset sub-bricks\n"
00017 "The result is simply a number printed to stdout. (If a single\n"
00018 "brick was input, this is just the count of the number of nonzero\n"
00019 "voxels in that brick.)\n"
00020 "Options:\n"
00021 " -save ppp = Save the count of overlaps at each voxel into a\n"
00022 " dataset with prefix 'ppp' (properly thresholded,\n"
00023 " this could be used as a mask dataset).\n"
00024 "Example:\n"
00025 " 3dOverlap -save abcnum a+orig b+orig c+orig\n"
00026 " 3dmaskave -mask 'abcnum+orig<3..3>' a+orig\n"
00027 ) ;
00028 exit(0) ;
00029 }
00030
00031 narg = 1 ;
00032
00033
00034
00035 mainENTRY("3dOverlap main") ; machdep() ; PRINT_VERSION("3dOverlap") ;
00036
00037 { int new_argc ; char ** new_argv ;
00038 addto_args( argc , argv , &new_argc , &new_argv ) ;
00039 if( new_argv != NULL ){ argc = new_argc ; argv = new_argv ; }
00040 }
00041
00042 AFNI_logger("3dOverlap",argc,argv) ;
00043
00044
00045
00046 while( narg < argc && argv[narg][0] == '-' ){
00047
00048 if( strcmp(argv[narg],"-save") == 0 ){
00049 psave = argv[++narg] ;
00050 if( !THD_filename_ok(psave) ){
00051 fprintf(stderr,"** Illegal -save prefix!\n") ; exit(1) ;
00052 }
00053 narg++ ; continue ;
00054 }
00055
00056 fprintf(stderr,"** Illegal option: %s\n",argv[narg]) ; exit(1) ;
00057 }
00058
00059
00060
00061 ctop = 0 ;
00062 for( ; narg < argc ; narg++ ){
00063
00064 xset = THD_open_dataset( argv[narg] ) ;
00065 if( xset == NULL ){
00066 fprintf(stderr,"*** Can't open dataset %s\n",argv[narg]); exit(1);
00067 }
00068 DSET_load(xset) ;
00069 if( !DSET_LOADED(xset) ){
00070 fprintf(stderr,"*** Can't load dataset %s\n",argv[narg]); exit(1);
00071 }
00072
00073 if( nvox == 0 ){
00074 nvox = DSET_NVOX(xset) ; ccc = calloc(sizeof(short),nvox) ;
00075 } else if( DSET_NVOX(xset) != nvox ){
00076 fprintf(stderr,"*** Dataset %s doesn't match in size!\n",argv[narg]); exit(1);
00077 }
00078
00079 for( iv=0 ; iv < DSET_NVALS(xset) ; iv++ ){
00080 mmm = THD_makemask( xset , iv , 1.0,-1.0 ) ;
00081 if( mmm == NULL ){
00082 fprintf(stderr,"*** %s[%d] counting fails!\n",argv[narg],iv); exit(1);
00083 }
00084 for( ii=0 ; ii < nvox ; ii++ ) if( mmm[ii] ) ccc[ii]++ ;
00085 free(mmm) ; ctop++ ;
00086 }
00087
00088 if( psave != NULL && oset == NULL ){
00089 oset = EDIT_empty_copy(xset) ;
00090 EDIT_dset_items( oset ,
00091 ADN_prefix , psave ,
00092 ADN_nvals , 1 ,
00093 ADN_ntt , 0 ,
00094 ADN_brick_fac , NULL ,
00095 ADN_datum_all , MRI_short ,
00096 ADN_none ) ;
00097
00098 if( ISFUNC(oset) )
00099 EDIT_dset_items( oset , ADN_func_type,FUNC_FIM_TYPE , ADN_none ) ;
00100
00101 tross_Copy_History( xset , oset ) ;
00102 tross_Make_History( "3dOverlap" , argc,argv , oset ) ;
00103
00104 if( THD_is_file(DSET_HEADNAME(oset)) ){
00105 fprintf(stderr,
00106 "** Output file %s already exists -- will not overwrite!\n",
00107 DSET_HEADNAME(oset) ) ;
00108 DSET_delete(oset) ; oset = NULL ; psave = NULL ;
00109 }
00110 }
00111
00112 DSET_delete(xset) ;
00113 }
00114
00115
00116
00117 cnum = 0 ;
00118 for( ii=0 ; ii < nvox ; ii++ ) if( ccc[ii] == ctop ) cnum++ ;
00119 printf("%d\n",cnum) ;
00120
00121 if( oset != NULL ){
00122 EDIT_substitute_brick( oset , 0 , MRI_short , ccc ) ;
00123 DSET_write(oset) ;
00124 }
00125
00126 exit(0) ;
00127 }