Doxygen Source Code Documentation
3dmerge.c File Reference
#include "mrilib.h"#include "parser.h"Go to the source code of this file.
Defines | |
| #define | PROGRAM_NAME "3dmerge" |
| #define | LAST_MOD_DATE "02 Nov 2001" |
| #define | MAIN |
| #define | MEGA 1048576 |
| #define | ALLOW_SUBV |
| #define | DSET_OPEN THD_open_dataset |
| #define | CFLAG_MEAN 1 |
| #define | CFLAG_NZMEAN 2 |
| #define | CFLAG_MMAX 3 |
| #define | CFLAG_COUNT 4 |
| #define | CFLAG_AMAX 5 |
| #define | CFLAG_SMAX 6 |
| #define | CFLAG_ORDER 7 |
| #define | CFLAG_FISHER 8 |
| #define | THFLAG_NONE 0 |
| #define | THFLAG_FICO 71 |
| #define | TANH(z) tanh(z) |
| #define | ATANH(z) atanh(z) |
| #define | DUMP1 |
| #define | DUMP2 |
| #define | DUMP3 |
| #define | MASK(x) (1 << (x-'a')) |
| #define | PREDEFINED_MASK |
Functions | |
| int | MRG_read_opts (int, char **) |
| void | MRG_Syntax (void) |
| int | MRG_read_opts (int argc, char *argv[]) |
| int | main (int argc, char *argv[]) |
Variables | |
| EDIT_options | MRG_edopt |
| int | MRG_have_edopt = 0 |
| int | MRG_hits_g = 0 |
| int | MRG_cflag_g = CFLAG_MEAN |
| int | MRG_keepthr = 0 |
| float | MRG_clust_rmm_g = 0.0 |
| float | MRG_clust_vmul_g = 0.0 |
| int | MRG_datum = ILLEGAL_TYPE |
| int | MRG_thdatum = ILLEGAL_TYPE |
| int | MRG_be_quiet = 0 |
| int | MRG_cflag_gthr = THFLAG_NONE |
| int | MRG_doall = 0 |
| int | MRG_verbose = 0 |
| char | MRG_output_session [THD_MAX_NAME] = "./" |
| char | MRG_output_prefix [THD_MAX_PREFIX] = "mrg" |
| int | MRG_ivfim = -1 |
| int | MRG_ivthr = -1 |
| int | MRG_nscale = 0 |
Define Documentation
|
|
Definition at line 44 of file 3dmerge.c. Referenced by MRG_Syntax(). |
|
|
Definition at line 69 of file 3dmerge.c. Referenced by main(). |
|
|
Definition at line 60 of file 3dmerge.c. Referenced by main(), and MRG_read_opts(). |
|
|
Definition at line 59 of file 3dmerge.c. Referenced by main(), and MRG_read_opts(). |
|
|
Definition at line 63 of file 3dmerge.c. Referenced by main(), and MRG_read_opts(). |
|
|
Definition at line 56 of file 3dmerge.c. Referenced by main(), and MRG_read_opts(). |
|
|
Definition at line 58 of file 3dmerge.c. Referenced by main(), and MRG_read_opts(). |
|
|
Definition at line 57 of file 3dmerge.c. Referenced by main(), and MRG_read_opts(). |
|
|
Definition at line 62 of file 3dmerge.c. Referenced by main(), and MRG_read_opts(). |
|
|
Definition at line 61 of file 3dmerge.c. Referenced by main(), and MRG_read_opts(). |
|
|
Definition at line 47 of file 3dmerge.c. Referenced by main(). |
|
|
Definition at line 114 of file 3dmerge.c. Referenced by MRG_read_opts(). |
|
|
Definition at line 115 of file 3dmerge.c. Referenced by MRG_read_opts(). |
|
|
Definition at line 116 of file 3dmerge.c. Referenced by MRG_read_opts(). |
|
|
Definition at line 32 of file 3dmerge.c. Referenced by main(). |
|
|
|
|
|
|
|
|
Definition at line 38 of file 3dmerge.c. Referenced by main(). |
|
|
Value: ( MASK('r') | MASK('x') | MASK('y') | MASK('z') \ | MASK('i') | MASK('j') | MASK('k') ) |
|
|
Definition at line 31 of file 3dmerge.c. Referenced by main(). |
|
|
Definition at line 68 of file 3dmerge.c. Referenced by main(). |
|
|
Definition at line 66 of file 3dmerge.c. Referenced by main(), and MRG_read_opts(). |
|
|
Definition at line 65 of file 3dmerge.c. Referenced by main(). |
Function Documentation
|
||||||||||||
|
---------- Adapted from 3dZeropad.c by RWCox - 08 Aug 2001 ----------* Definition at line 799 of file 3dmerge.c. References addto_args(), ADN_directory_name, ADN_func_type, ADN_label1, ADN_none, ADN_ntt, ADN_nvals, ADN_prefix, ADN_stat_aux, AFNI_GOOD_FUNC_DTYPE, AFNI_logger(), argc, ATANH, CFLAG_AMAX, CFLAG_COUNT, CFLAG_FISHER, CFLAG_MEAN, CFLAG_MMAX, CFLAG_NZMEAN, CFLAG_ORDER, CFLAG_SMAX, MCW_cluster_array::clar, THD_3dim_dataset::daxes, THD_3dim_dataset::dblk, THD_datablock::diskptr, DSET_ARRAY, DSET_BRICK, DSET_BRICK_FACTOR, DSET_BRICK_TYPE, DSET_BRIKNAME, DSET_LOADED, DSET_NUM_TIMES, DSET_NVALS, DSET_OPEN, DSET_PRINCIPAL_VALUE, DSET_THRESH_VALUE, DSET_unload, EDIT_coerce_autoscale(), EDIT_coerce_scale_type(), EDIT_coerce_type(), EDIT_dset_items(), EDIT_empty_copy(), EDIT_one_dataset(), EDIT_substitute_brick(), EDIT_options::fake_dxyz, EDIT_options::fmask, free, FUNC_BUCK_TYPE, FUNC_COR_SCALE_SHORT, FUNC_FIM_TYPE, FUNC_HAVE_THR, FUNC_THR_TYPE, THD_3dim_dataset::func_type, THD_diskptr::header_name, input_datum, ISFUNC, ISVALID_3DIM_DATASET, EDIT_options::iv_fim, KILL_CLUSTER, LAST_MOD_DATE, machdep(), mainENTRY, malloc, MAX_STAT_AUX, MCW_cluster_to_vol(), MCW_find_clusters(), MCW_vol_amax(), MEGA, MRG_be_quiet, MRG_cflag_g, MRG_cflag_gthr, MRG_clust_rmm_g, MRG_clust_vmul_g, MRG_datum, MRG_doall, MRG_hits_g, MRG_ivfim, MRG_ivthr, MRG_keepthr, MRG_nscale, MRG_output_prefix, MRG_output_session, MRG_read_opts(), MRG_Syntax(), MRG_thdatum, mri_datum_size(), mri_fix_data_pointer(), mri_free(), MRI_IS_INT_TYPE, myXtFree, EDIT_options::nfmask, MCW_cluster_array::num_clu, MCW_cluster::num_pt, THD_datablock::nvals, THD_dataxes::nxx, THD_dataxes::nyy, nz, THD_dataxes::nzz, PRINT_VERSION, PROGRAM_NAME, THD_3dim_dataset::self_name, THD_3dim_dataset::stat_aux, TANH, THD_delete_3dim_dataset(), THD_is_file(), THD_load_datablock(), THD_load_statistics(), THD_write_3dim_dataset(), THFLAG_FICO, THFLAG_NONE, EDIT_options::thrblur, EDIT_options::thresh, EDIT_options::thrfilter_opt, EDIT_options::thtoin, THD_datablock::total_bytes, tross_Copy_History(), tross_Make_History(), XtMalloc, THD_dataxes::xxdel, THD_dataxes::yydel, and THD_dataxes::zzdel.
00800 {
00801 int file_num , first_file , nx,ny,nz , nxyz , ii , num_dset ,
00802 file_count , ptmin , iclu,nclu , edit_type , ival,ivout , tval ;
00803 float dx,dy,dz , fac , dxyz , rmm,vmul ;
00804 THD_3dim_dataset * dset=NULL , * new_dset=NULL ;
00805 THD_3dim_dataset ** dsetar=NULL ; /* Nov 1998 */
00806 short * gnum=NULL ;
00807 float * gfim=NULL , * tfim=NULL , * ggfim=NULL , * ttfim=NULL ;
00808 int datum ;
00809 MCW_cluster_array * clar ;
00810 float fimfac , fimfacinv , first_fimfac , thrfac ;
00811 int output_datum , output_thdatum ;
00812 int input_datum , input_thdatum , first_datum ;
00813
00814 float thr_stataux[MAX_STAT_AUX] ;
00815 int num_fico ;
00816 int is_int=1 ; /* 08 Jan 1998 */
00817
00818 int iv, iv_bot, iv_top; /* dataset sub-brick indices 02 Feb 1998 */
00819
00820 /*----- identify program -----*/
00821 printf ("\n\nProgram %s \n", PROGRAM_NAME);
00822 printf ("Last revision: %s \n\n", LAST_MOD_DATE);
00823
00824 /*** read input options ***/
00825
00826 if( argc < 2 || strncmp(argv[1],"-help",4) == 0 ) MRG_Syntax() ;
00827
00828 /*-- 20 Apr 2001: addto the arglist, if user wants to [RWCox] --*/
00829
00830 mainENTRY("3dmerge main") ; machdep() ; PRINT_VERSION("3dmerge") ;
00831
00832 { int new_argc ; char ** new_argv ;
00833 addto_args( argc , argv , &new_argc , &new_argv ) ;
00834 if( new_argv != NULL ){ argc = new_argc ; argv = new_argv ; }
00835 }
00836
00837 AFNI_logger("3dmerge",argc,argv) ;
00838
00839 first_file = MRG_read_opts( argc , argv ) ;
00840 file_count = argc - first_file ; /* number of datasets input */
00841
00842 if( ! MRG_be_quiet )
00843 printf("3dmerge: edit and combine 3D datasets, by RW Cox\n") ;
00844
00845 if( first_file < 1 || first_file >= argc ){
00846 fprintf(stderr,"*** ILLEGAL COMMAND LINE ***\n") ; exit(1) ;
00847 }
00848
00849 /*----- check for compatibility of user options -----*/ /* 02 Feb 1998 */
00850 if (MRG_doall)
00851 { int nerr = 0 ;
00852
00853 if( MRG_ivfim >= 0 ){ /* Nov 1998 */
00854 fprintf(stderr,"-1dindex is not compatible with -doall option \n");
00855 nerr++ ; }
00856 if( MRG_ivthr >= 0 ){ /* Nov 1998 */
00857 fprintf(stderr,"-1dindex is not compatible with -doall option \n");
00858 nerr++ ; }
00859
00860 if (MRG_edopt.thtoin > 0) {
00861 fprintf (stderr, "-1thtoin is not compatible with -doall option \n");
00862 nerr++ ; }
00863 if (MRG_edopt.thresh > 0.0) {
00864 fprintf (stderr, "-1thresh is not compatible with -doall option \n");
00865 nerr++ ; }
00866 if (MRG_edopt.thrfilter_opt > 0) {
00867 fprintf (stderr, "-t1filter is not compatible with -doall option \n");
00868 nerr++ ; }
00869 if (MRG_edopt.thrblur > 0.0) {
00870 fprintf (stderr, "-t1blur is not compatible with -doall option \n");
00871 nerr++ ; }
00872 if (MRG_thdatum >= 0) {
00873 fprintf (stderr, "-thdatum is not compatible with -doall option \n");
00874 nerr++ ; }
00875 if (MRG_keepthr) {
00876 fprintf (stderr, "-keepthr is not compatible with -doall option \n");
00877 nerr++ ; }
00878 if (MRG_cflag_gthr > 0) {
00879 fprintf (stderr, "-tgfisher is not compatible with -doall option \n");
00880 nerr++ ; }
00881
00882 if( nerr > 0 ) exit(1) ;
00883 }
00884
00885 /* Nov 1998: other checks */
00886
00887 if( (MRG_ivfim >= 0 || MRG_ivthr >=0) && MRG_keepthr ){
00888 fprintf(stderr,"-keepthr is not compatible with -1dindex or -1tindex\n") ;
00889 exit(1) ;
00890 }
00891
00892 if( (MRG_ivfim >= 0 || MRG_ivthr >=0) && MRG_cflag_gthr ){
00893 fprintf(stderr,"-tgfisher is not compatible with -1dindex or -1tindex\n") ;
00894 exit(1) ;
00895 }
00896
00897 /* check for existence of each input data set. */ /* 09 December 1996 */
00898 for (file_num = first_file; file_num < argc; file_num++)
00899 {
00900 dset = DSET_OPEN( argv[file_num] ) ;
00901 if( ! ISVALID_3DIM_DATASET(dset) )
00902 {
00903 fprintf(stderr,"*** cannot open dataset %s\n",argv[file_num]) ;
00904 exit(1) ;
00905 }
00906
00907 /* Nov 1998: check user-controlled brick indexes */
00908
00909 if( MRG_ivfim >= DSET_NVALS(dset) ){
00910 fprintf(stderr,
00911 "*** Dataset %s does not have enough bricks for -1dindex %d\n" ,
00912 argv[file_num],MRG_ivfim) ;
00913 exit(1) ;
00914 }
00915 if( MRG_ivthr >= DSET_NVALS(dset) ){
00916 fprintf(stderr,
00917 "*** Dataset %s does not have enough bricks for -1tindex %d\n" ,
00918 argv[file_num],MRG_ivthr) ;
00919 exit(1) ;
00920 }
00921
00922 THD_delete_3dim_dataset( dset , False ) ; dset = NULL ;
00923 }
00924
00925 /* 02 Mar 2001: print a message about dataset indices */
00926
00927 if( MRG_ivfim < 0 ) fprintf(stderr,"++ default -1dindex = 0\n") ;
00928 if( MRG_ivthr < 0 ) fprintf(stderr,"++ default -1tindex = 1\n") ;
00929
00930 /* read first dataset */
00931
00932 dset = DSET_OPEN( argv[first_file] ) ;
00933 if( ! ISVALID_3DIM_DATASET(dset) ){
00934 fprintf(stderr,"*** Unable to open first dataset %s\n",argv[first_file]) ;
00935 exit(1) ;
00936 }
00937
00938 if( DSET_NUM_TIMES(dset) > 1 && (!MRG_doall && MRG_ivfim < 0) ){
00939 fprintf(stderr, "*** Unable to merge time-dependent datasets"
00940 " without -doall or -1dindex\n") ;
00941 exit(1) ;
00942 }
00943
00944 /* get the dimensions */
00945
00946 nx = dset->daxes->nxx ;
00947 ny = dset->daxes->nyy ;
00948 nz = dset->daxes->nzz ; nxyz = nx*ny*nz ;
00949
00950 dx = fabs(dset->daxes->xxdel) ;
00951 dy = fabs(dset->daxes->yydel) ;
00952 dz = fabs(dset->daxes->zzdel) ;
00953
00954 if( MRG_edopt.fake_dxyz ) dx = dy = dz = 1.0 ; /* 11 Sep 2000 */
00955
00956 nice(1) ; /* slow us down, a little */
00957
00958 if( MRG_edopt.nfmask > 0 && MRG_edopt.nfmask != nxyz ){
00959 fprintf(stderr,
00960 "*** -1fmask and 1st dataset don't have same number of voxels\n\a");
00961 exit(1) ;
00962 }
00963
00964 /*******************************************************************/
00965 /**** if only one file, edit it, modify its names ... ****/
00966 /**** then write the modified dataset to disk ****/
00967
00968 if( file_count == 1 ){
00969
00970 ival = DSET_PRINCIPAL_VALUE(dset) ;
00971 input_datum = DSET_BRICK_TYPE(dset,ival) ;
00972 if( MRG_datum >= 0 ) output_datum = MRG_datum ;
00973 else output_datum = input_datum ;
00974
00975 /** 17 Sep 1998: Move the creation of the new dataset
00976 to AFTER the editing operations, so that any
00977 dataset parameter changes in EDIT_one_dataset
00978 will properly be propagated to the new dataset.
00979 The creation shown here is just to check if the
00980 output dataset exists already. **/
00981
00982 new_dset = EDIT_empty_copy( dset ) ;
00983
00984 EDIT_dset_items( new_dset ,
00985 ADN_prefix , MRG_output_prefix ,
00986 ADN_directory_name , MRG_output_session ,
00987 ADN_none ) ;
00988
00989 if( THD_is_file(new_dset->dblk->diskptr->header_name) ){
00990 fprintf(stderr,
00991 "*** Output file %s already exists -- cannot continue!\n",
00992 new_dset->dblk->diskptr->header_name ) ;
00993 exit(1) ;
00994 }
00995
00996 THD_delete_3dim_dataset( new_dset , False ) ; /* toss this junk */
00997
00998 /* 05 Jul 2002: illegal uses of -keepthr? */
00999
01000 if( MRG_keepthr && !ISFUNC(dset) ){
01001 fprintf(stderr,"*** -keepthr can't be used on non-functional dataset!\n");
01002 exit(1) ;
01003 }
01004 if( MRG_keepthr && dset->func_type == FUNC_FIM_TYPE ){
01005 fprintf(stderr,"*** -keepthr can't be used on 'fim' type dataset!\n") ;
01006 exit(1) ;
01007 }
01008 if( MRG_keepthr && dset->func_type == FUNC_BUCK_TYPE ){
01009 fprintf(stderr,"*** -keepthr can't be used on 'fbuc' type dataset!\n"
01010 " You can use '3dbuc2fim' first, if needed.\n" );
01011 exit(1) ;
01012 }
01013
01014 /** get ready to go **/
01015
01016 if( ! MRG_be_quiet ){
01017 printf("-- editing input dataset in memory (%.1f MB)\n",
01018 ((double)dset->dblk->total_bytes) / MEGA ) ;
01019 fflush(stdout) ;
01020 }
01021
01022 /* 02 Feb 1998 */
01023 if (MRG_doall)
01024 { iv_bot = 0; iv_top = DSET_NVALS(dset); }
01025 else if( MRG_ivfim >= 0 ) /* Nov 1998 */
01026 { iv_bot = MRG_ivfim ; iv_top = iv_bot+1 ; }
01027 else
01028 { iv_bot = DSET_PRINCIPAL_VALUE(dset); iv_top = iv_bot + 1; }
01029
01030 /*----- Iterate over sub-bricks -----*/
01031 for (iv = iv_bot; iv < iv_top; iv++)
01032 {
01033 if ((!MRG_be_quiet) && MRG_doall) printf ("Editing sub-brick %d\n", iv);
01034
01035 MRG_edopt.iv_fim = iv;
01036
01037 EDIT_one_dataset( dset , &MRG_edopt ) ; /* all the real work */
01038
01039 if( !MRG_be_quiet && !MRG_doall ){ printf(".") ; fflush(stdout) ; }
01040 }
01041
01042 if( MRG_edopt.nfmask > 0 ){
01043 free(MRG_edopt.fmask) ; MRG_edopt.fmask = NULL ; MRG_edopt.nfmask = 0 ;
01044 }
01045
01046 if( !MRG_be_quiet && !MRG_doall ) printf("\n") ;
01047
01048 /** 17 Sep 1998: NOW create the new dataset **/
01049
01050 new_dset = EDIT_empty_copy( dset ) ;
01051
01052 tross_Copy_History( dset , new_dset ) ;
01053 tross_Make_History( "3dmerge" , argc , argv , new_dset ) ;
01054
01055 EDIT_dset_items( new_dset ,
01056 ADN_prefix , MRG_output_prefix ,
01057 ADN_label1 , MRG_output_prefix ,
01058 ADN_directory_name , MRG_output_session ,
01059 ADN_none ) ;
01060 strcat( new_dset->self_name , "(ED)" ) ;
01061 /* 02 Feb 1998 */
01062 if( (! MRG_keepthr) && (new_dset->dblk->nvals > 1) && (! MRG_doall) )
01063 EDIT_dset_items( new_dset ,
01064 ADN_nvals , 1 ,
01065 ADN_ntt , 0 , /* Nov 1998 */
01066 ADN_func_type , FUNC_FIM_TYPE ,
01067 ADN_none ) ;
01068
01069 if( MRG_keepthr && ISFUNC(new_dset) && FUNC_HAVE_THR(new_dset->func_type) ){
01070 ii = FUNC_ival_thr[dset->func_type] ;
01071 input_thdatum = DSET_BRICK_TYPE(dset,ii) ;
01072 if( MRG_thdatum >= 0 ) output_thdatum = MRG_thdatum ;
01073 else output_thdatum = input_thdatum ;
01074 } else {
01075 output_thdatum = input_thdatum = ILLEGAL_TYPE ;
01076 }
01077
01078 /** Coerce the output data type into a new brick, if needed **/
01079
01080 /*----- Iterate over sub-bricks [again] -----*/
01081 for (iv = iv_bot; iv < iv_top; iv++)
01082 {
01083 /* 02 Feb 1998 */
01084 if (MRG_doall)
01085 {
01086 ival = iv;
01087 ivout = iv;
01088 }
01089 else if( MRG_ivfim >= 0 )
01090 {
01091 ival = MRG_ivfim ;
01092 ivout = DSET_PRINCIPAL_VALUE(new_dset) ;
01093 }
01094 else
01095 {
01096 ival = DSET_PRINCIPAL_VALUE(dset) ;
01097 ivout = DSET_PRINCIPAL_VALUE(new_dset) ;
01098 }
01099
01100 if( input_datum == output_datum ){
01101
01102 /** Attach the brick of the input dataset to the brick of the output. **/
01103 /** (This isn't exactly kosher, but we are exiting almost immediately) **/
01104
01105 mri_fix_data_pointer( DSET_ARRAY(dset,ival) , DSET_BRICK(new_dset,ivout) ) ;
01106
01107 #if 1
01108 # if 0
01109 if( ivout != ival )
01110 # endif
01111 DSET_BRICK_FACTOR(new_dset,ivout) = DSET_BRICK_FACTOR(dset,ival) ;
01112 #endif
01113
01114 } else {
01115
01116 /** Must create a new brick and do the conversion **/
01117
01118 void * dfim , * efim ;
01119 float efac = DSET_BRICK_FACTOR(dset,ival) ;
01120
01121 if( ! MRG_be_quiet ){
01122 printf("-- coercing output datum to be %s\n",
01123 MRI_TYPE_name[output_datum]);
01124 }
01125
01126 efim = DSET_ARRAY(dset,ival) ;
01127 dfim = (void *) malloc( mri_datum_size(output_datum) * nxyz ) ;
01128 if( dfim == NULL ){
01129 fprintf(stderr,"*** Can't malloc output brick #%d\n",ivout); exit(1);
01130 }
01131
01132 /** 03 Dec 1998: scale to integer and float types separately **/
01133
01134 if( MRI_IS_INT_TYPE(output_datum) ){
01135 fimfac = EDIT_coerce_autoscale( nxyz , input_datum , efim ,
01136 output_datum , dfim ) ;
01137 if( fimfac == 0.0 ) fimfac = 1.0 ;
01138 if( efac != 0.0 ) fimfac /= efac ;
01139
01140 DSET_BRICK_FACTOR(new_dset,ivout) = (fimfac != 0.0 && fimfac != 1.0)
01141 ? 1.0/fimfac : 0.0 ;
01142 } else {
01143
01144 EDIT_coerce_scale_type( nxyz , efac , input_datum , efim ,
01145 output_datum , dfim ) ;
01146 DSET_BRICK_FACTOR(new_dset,ivout) = 0.0 ;
01147 }
01148
01149 mri_free( DSET_BRICK(dset,ival) ) ;
01150 EDIT_substitute_brick( new_dset , ivout , output_datum , dfim ) ;
01151 }
01152
01153 /** Now do the threshold data [won't happen if doall is also happening] **/
01154
01155 if( output_thdatum >= 0 ){
01156
01157 ival = FUNC_ival_thr[ dset->func_type] ;
01158 ivout = FUNC_ival_thr[new_dset->func_type] ;
01159
01160 if( input_thdatum == output_thdatum ){
01161
01162 mri_fix_data_pointer( DSET_ARRAY(dset,ival),DSET_BRICK(new_dset,ivout) ) ;
01163
01164 #if 0
01165 DSET_BRICK_FACTOR(new_dset,ivout) = DSET_BRICK_FACTOR(dset,ival) ;
01166 #endif
01167
01168 } else {
01169 void * dfim , * efim ;
01170
01171 if( ! MRG_be_quiet ){
01172 printf("-- coercing threshold datum to be %s\n",
01173 MRI_TYPE_name[output_thdatum]);
01174 }
01175
01176 efim = DSET_ARRAY(dset,ival) ;
01177 dfim = (void *) XtMalloc( mri_datum_size(output_thdatum) * nxyz ) ;
01178
01179 switch( output_thdatum ){
01180 default: fprintf(stderr,"** illegal output_thdatum = %d\n",
01181 output_thdatum);
01182 exit(1) ;
01183
01184 case MRI_float:
01185 fimfacinv = 0.0 ;
01186 fimfac = DSET_BRICK_FACTOR(dset,ival) ;
01187 if( fimfac == 0.0 ){
01188 fimfac = (input_thdatum == MRI_short)
01189 ? 1.0/FUNC_scale_short[dset->func_type]
01190 : (input_thdatum == MRI_byte)
01191 ? 1.0/FUNC_scale_byte[dset->func_type] : 0.0 ;
01192 }
01193 break ;
01194
01195 case MRI_short:
01196 if( input_datum == MRI_float ){
01197 fimfac = FUNC_scale_short[new_dset->func_type] ;
01198 fimfacinv = 1.0 / fimfac ;
01199 } else if( input_datum == MRI_byte ){
01200 fimfac = ((float)FUNC_scale_short[new_dset->func_type])
01201 / FUNC_scale_byte[new_dset->func_type] ;
01202 fimfacinv = 1.0 / FUNC_scale_short[new_dset->func_type] ;
01203 } else {
01204 fprintf(stderr,"** illegal input_thdatum = %d\n",input_thdatum);
01205 exit(1) ;
01206 }
01207 break ;
01208
01209 case MRI_byte:
01210 if( input_datum == MRI_float ){
01211 fimfac = FUNC_scale_byte[new_dset->func_type] ;
01212 fimfacinv = 1.0 / fimfac ;
01213 } else if( input_datum == MRI_short ){
01214 fimfac = ((float)FUNC_scale_byte[new_dset->func_type])
01215 / FUNC_scale_short[new_dset->func_type] ;
01216 fimfacinv = 1.0 / FUNC_scale_byte[new_dset->func_type] ;
01217 } else {
01218 fprintf(stderr,"** illegal input_thdatum = %d\n",input_thdatum);
01219 exit(1) ;
01220 }
01221 break ;
01222 }
01223
01224 EDIT_coerce_scale_type( nxyz , fimfac ,
01225 DSET_BRICK_TYPE(dset,ival),efim ,
01226 output_thdatum,dfim ) ;
01227
01228 DSET_BRICK_FACTOR(new_dset,ivout) = fimfacinv ;
01229 EDIT_substitute_brick( new_dset , ivout , output_thdatum , dfim ) ;
01230 mri_free( DSET_BRICK(dset,ival) ) ;
01231 }
01232 }
01233
01234 } /* iv End of iteration over sub-bricks */
01235
01236
01237 THD_load_statistics( new_dset ) ;
01238 THD_write_3dim_dataset( NULL,NULL , new_dset , True ) ;
01239 if( ! MRG_be_quiet )
01240 fprintf(stderr,"-- Wrote edited dataset: %s\n" , DSET_BRIKNAME(new_dset) ) ;
01241 exit(0) ;
01242 }
01243
01244 /************************************************************************/
01245 /******** more than one input dataset --> merger ********/
01246
01247 /* Nov 1998: make an array of input datasets, load 1st element */
01248
01249 dsetar = (THD_3dim_dataset **) malloc(sizeof(THD_3dim_dataset *)*file_count);
01250 for( ii=0 ; ii < file_count ; ii++ ) dsetar[ii] = NULL ;
01251 dsetar[0] = dset ;
01252
01253 /* make an empty copy of the first dataset, then modify it */
01254
01255 new_dset = EDIT_empty_copy( dset ) ;
01256 ival = DSET_PRINCIPAL_VALUE(dset) ;
01257
01258 if( MRG_datum >= 0 ) output_datum = MRG_datum ;
01259 else output_datum = DSET_BRICK_TYPE(dset,ival) ;
01260
01261 EDIT_dset_items( new_dset ,
01262 ADN_prefix , MRG_output_prefix ,
01263 ADN_label1 , MRG_output_prefix ,
01264 ADN_directory_name , MRG_output_session ,
01265 ADN_none ) ;
01266 strcat( new_dset->self_name , "(MG)" ) ;
01267
01268 /* 29 Aug 1996: change the dataset type, depending on the merger type */
01269
01270 if (! MRG_doall) /* 02 Feb 1998 */
01271 switch( MRG_cflag_gthr ){
01272 default:
01273 EDIT_dset_items( new_dset , ADN_nvals,1 , ADN_ntt,0 , ADN_none ) ;
01274 if( ISFUNC(dset) )
01275 EDIT_dset_items( new_dset , ADN_func_type,FUNC_FIM_TYPE , ADN_none ) ;
01276 break ;
01277
01278 case THFLAG_FICO: /* do nothing to the dataset now */
01279 num_fico = 0 ;
01280 break ;
01281 }
01282
01283 if( THD_is_file(new_dset->dblk->diskptr->header_name) ){
01284 fprintf(stderr,
01285 "*** Output file %s already exists -- cannot continue!\n",
01286 new_dset->dblk->diskptr->header_name ) ;
01287 exit(1) ;
01288 }
01289
01290 if( ! MRG_be_quiet && MRG_keepthr )
01291 printf("-- ignoring -keepthr option\n") ;
01292
01293
01294 /* 02 Feb 1998 */
01295 if (MRG_doall)
01296 { iv_bot = 0; iv_top = DSET_NVALS(dset); }
01297 else if( MRG_ivfim >= 0 ) /* Nov 1998 */
01298 { iv_bot = MRG_ivfim ; iv_top = iv_bot+1 ; }
01299 else
01300 { iv_bot = DSET_PRINCIPAL_VALUE(dset); iv_top = iv_bot + 1; }
01301
01302 /*----- Iterate over sub-bricks -----*/
01303
01304 ivout = 0 ; /* Nov 1998 */
01305
01306 for (iv = iv_bot; iv < iv_top; iv++)
01307 {
01308 if ((!MRG_be_quiet) ) printf ("-- Editing sub-brick %d \n", iv);
01309
01310 MRG_edopt.iv_fim = iv;
01311
01312 /* make space for the merger computations */
01313
01314 tfim = (float *) XtMalloc( sizeof(float) * nxyz ) ; /* dataset copy */
01315 gfim = (float *) XtMalloc( sizeof(float) * nxyz ) ; /* results */
01316 gnum = (short *) XtMalloc( sizeof(short) * nxyz ) ; /* counts */
01317 for( ii=0 ; ii < nxyz ; ii++ ) gfim[ii] = 0.0 ; /* initialize */
01318 for( ii=0 ; ii < nxyz ; ii++ ) gnum[ii] = 0 ;
01319
01320 /* 29 Aug 1996: make space for merger of thresholds, if desired */
01321
01322 if( MRG_cflag_gthr != THFLAG_NONE ){
01323 ttfim = (float *) XtMalloc( sizeof(float) * nxyz ) ; /* thresh copy */
01324 ggfim = (float *) XtMalloc( sizeof(float) * nxyz ) ; /* thresh results */
01325 for( ii=0 ; ii < nxyz ; ii++ ) ggfim[ii] = 0.0 ; /* initialize */
01326
01327 for( ii=0 ; ii < MAX_STAT_AUX ; ii++ ) thr_stataux[ii] = 0 ;
01328 }
01329
01330 if( ! MRG_be_quiet ){
01331 float nbytes = (2.0*sizeof(float)+sizeof(short))*nxyz ;
01332 if( MRG_cflag_gthr != THFLAG_NONE ) nbytes += 2.0*sizeof(float)*nxyz ;
01333 printf("-- allocated %.1f MB scratch memory\n", nbytes/MEGA ) ;
01334 }
01335
01336 /***--- read datasets, edit them, add them into gfim and gnum ---***/
01337
01338 num_dset = 0 ;
01339 for( file_num=first_file; file_num < argc ; file_num++ ){
01340
01341 /** read dataset header if not already input **/
01342
01343 dset = dsetar[ file_num - first_file ] ; /* Nov 1998 */
01344 if( dset == NULL ){
01345 dset = dsetar[ file_num - first_file ] = DSET_OPEN( argv[file_num] ) ;
01346 if( ! ISVALID_3DIM_DATASET(dset) ){
01347 fprintf(stderr,"*** cannot open dataset %s\n",argv[file_num]); exit(1);
01348 }
01349 }
01350
01351 /* check for dimensional mismatch */
01352
01353 if( dset->daxes->nxx != nx ||
01354 dset->daxes->nyy != ny || dset->daxes->nzz != nz ){
01355
01356 fprintf(stderr,"*** dataset brick size mismatch at file %s\n",
01357 argv[file_num] ) ;
01358 exit(1) ;
01359 }
01360
01361 /* 02 Feb 1998 */
01362 if ( (MRG_doall) && (DSET_NVALS(dset) != iv_top) )
01363 fprintf (stderr, "*** -doall dataset nvals mismatch at file %s\n",
01364 argv[file_num]);
01365
01366
01367 if( DSET_NUM_TIMES(dset) > 1 && (!MRG_doall && MRG_ivfim < 0) ){ /* no time */
01368 fprintf(stderr, /* dependence! */
01369 "*** cannot use time-dependent dataset %s"
01370 " without -doall or -1dindex\n",argv[file_num]) ;
01371 exit(1) ;
01372 }
01373
01374 /* check for dataset type, if needed for the merging operations ordered */
01375
01376 if( MRG_cflag_gthr == THFLAG_FICO ){
01377
01378 if( !ISFUNC(dset) ){
01379 fprintf(stderr,
01380 "*** dataset from file %s is anatomical using '-tgfisher'!\n",
01381 argv[file_num] ) ;
01382 exit(1) ;
01383 }
01384
01385 switch( dset->func_type ){
01386 default:
01387 fprintf(stderr,
01388 "*** dataset from file %s is illegal type using '-tgfisher'!\n",
01389 argv[file_num] ) ;
01390 exit(1) ;
01391
01392 case FUNC_COR_TYPE: /* add up degrees-of-freedom */
01393 num_fico ++ ;
01394 for( ii=0 ; ii < FUNC_need_stat_aux[FUNC_COR_TYPE] ; ii++ )
01395 thr_stataux[ii] += dset->stat_aux[ii] ;
01396 break ;
01397
01398 case FUNC_THR_TYPE: /* do nothing */
01399 break ;
01400 }
01401 }
01402
01403 /* get the control information about this dataset */
01404
01405 #if 1
01406 ival = iv ; /* Nov 1998 */
01407 #else
01408 if (MRG_doall) ival = iv; /* 02 Feb 1998 */
01409 else ival = DSET_PRINCIPAL_VALUE(dset) ;
01410 #endif
01411 datum = DSET_BRICK_TYPE(dset,ival) ;
01412
01413 if( ! AFNI_GOOD_FUNC_DTYPE(datum) ){
01414 fprintf(stderr,"*** Illegal datum for 3dmerge: %s in file %s ***\n" ,
01415 MRI_TYPE_name[datum] , argv[file_num] ) ;
01416 exit(1) ;
01417 }
01418
01419 if( ! MRG_be_quiet ){
01420 printf("-- processing file %s" , argv[file_num] ) ;
01421 fflush(stdout) ;
01422 }
01423
01424 /* mess with the input data, maybe */
01425
01426 if( MRG_have_edopt )
01427 EDIT_one_dataset( dset , &MRG_edopt ) ; /* some real work */
01428 else
01429 THD_load_datablock( dset->dblk ) ;
01430
01431 /* 02 Nov 2001: check for data that doesn't exist */
01432
01433 if( !DSET_LOADED(dset) ){
01434 fprintf(stderr,"** Can't get data from %s\n",DSET_BRIKNAME(dset)) ;
01435 exit(1) ;
01436 }
01437
01438 if( ! MRG_be_quiet ){ printf(".") ; fflush(stdout) ; }
01439
01440 /* copy it into tfim , scaling if needed */
01441
01442 fimfac = DSET_BRICK_FACTOR(dset,ival) ; /* normal case */
01443
01444 if( MRG_cflag_g == CFLAG_FISHER && /* special case */
01445 DSET_BRICK_TYPE(dset,ival) == MRI_short &&
01446 (fimfac==0.0 || fimfac==1.0) ){
01447
01448 fimfac = 1.0 / FUNC_COR_SCALE_SHORT ;
01449 }
01450
01451 if( num_dset == 0 ){
01452 first_fimfac = fimfac ; /* save for later */
01453 first_datum = datum ;
01454 }
01455
01456 /** 08 Jan 1998: check if all inputs are integer types **/
01457
01458 is_int = is_int && (MRI_IS_INT_TYPE(datum) && fimfac == 0.0) ;
01459
01460 /* the actual copy+scaling operation */
01461
01462 EDIT_coerce_scale_type( nxyz , fimfac ,
01463 DSET_BRICK_TYPE(dset,ival) , DSET_ARRAY(dset,ival) ,
01464 MRI_float , tfim ) ;
01465
01466 /* 29 Aug 1996: get the threshold data into ttfim , if needed */
01467
01468 if( MRG_cflag_gthr != THFLAG_NONE && (tval=DSET_THRESH_VALUE(dset)) >= 0 ){
01469
01470 int thdatum = DSET_BRICK_TYPE(dset,tval) ;
01471
01472 if( ! AFNI_GOOD_FUNC_DTYPE(thdatum) ){
01473 fprintf(stderr,"*** Illegal threshold for 3dmerge: %s in file %s ***\n" ,
01474 MRI_TYPE_name[thdatum] , argv[file_num] ) ;
01475 exit(1) ;
01476 }
01477
01478 thrfac = DSET_BRICK_FACTOR(dset,tval) ; /* normal case */
01479
01480 if( MRG_cflag_gthr == THFLAG_FICO && /* special case */
01481 DSET_BRICK_TYPE(dset,tval) == MRI_short &&
01482 (thrfac==0.0 || thrfac==1.0) ){
01483
01484 thrfac = 1.0 / FUNC_COR_SCALE_SHORT ;
01485 }
01486
01487 EDIT_coerce_scale_type( nxyz , thrfac ,
01488 thdatum , DSET_ARRAY(dset,tval) ,
01489 MRI_float , ttfim ) ;
01490 }
01491
01492 DSET_unload(dset) ; /* Nov 1998: don't need data bricks in memory any more */
01493
01494 /*** merge tfim into gfim and gnum ***/
01495
01496 if( MRG_cflag_g == CFLAG_MMAX ){
01497 for( ii=0 ; ii < nxyz ; ii++ ){
01498 if( tfim[ii] != 0 ){
01499 gnum[ii]++ ;
01500 if( tfim[ii] > gfim[ii] ) gfim[ii] = tfim[ii] ;
01501 }
01502 }
01503 } else if( MRG_cflag_g == CFLAG_AMAX ){
01504 float dab ;
01505 for( ii=0 ; ii < nxyz ; ii++ ){
01506 if( tfim[ii] != 0 ){
01507 gnum[ii]++ ;
01508 dab = fabs(tfim[ii]) ;
01509 if( dab > gfim[ii] ) gfim[ii] = dab ;
01510 }
01511 }
01512 } else if( MRG_cflag_g == CFLAG_SMAX ){
01513 float dab ;
01514 for( ii=0 ; ii < nxyz ; ii++ ){
01515 if( tfim[ii] != 0 ){
01516 gnum[ii]++ ;
01517 dab = fabs(tfim[ii]) ;
01518 if( dab > fabs(gfim[ii]) ) gfim[ii] = tfim[ii] ;
01519 }
01520 }
01521 } else if( MRG_cflag_g == CFLAG_ORDER ){
01522 for( ii=0 ; ii < nxyz ; ii++ ){
01523 if( tfim[ii] != 0 ){
01524 gnum[ii]++ ;
01525 if( gfim[ii] == 0 ) gfim[ii] = tfim[ii] ;
01526 }
01527 }
01528 } else if( MRG_cflag_g == CFLAG_FISHER ){
01529 for( ii=0 ; ii < nxyz ; ii++ ){
01530 if( tfim[ii] != 0 ){
01531 gnum[ii]++ ; gfim[ii] += ATANH(tfim[ii]) ;
01532 }
01533 }
01534 } else { /* default = sum up */
01535 for( ii=0 ; ii < nxyz ; ii++ ){
01536 if( tfim[ii] != 0 ){
01537 gnum[ii]++ ; gfim[ii] += tfim[ii] ;
01538 }
01539 }
01540 }
01541
01542 /* 29 Aug 1996: merge the threshold data, if any */
01543
01544 if( MRG_cflag_gthr == THFLAG_FICO ){
01545 for( ii=0 ; ii < nxyz ; ii++ ) ggfim[ii] += ATANH(ttfim[ii]) ;
01546 }
01547
01548 if( ! MRG_be_quiet ){ printf(".\n") ; fflush(stdout) ; }
01549
01550 num_dset++ ;
01551 } /* end of combiner loop over datasets */
01552
01553 myXtFree(tfim) ; /* not needed any more */
01554 if( ttfim != NULL ) myXtFree(ttfim) ;
01555
01556 if( MRG_edopt.nfmask > 0 ){
01557 free(MRG_edopt.fmask) ; MRG_edopt.fmask = NULL ; MRG_edopt.nfmask = 0 ;
01558 }
01559
01560 /*** if only one dset encountered, some error! ***/
01561
01562 if( num_dset <= 1 ){
01563 fprintf(stderr,"*** Only found 1 dataset -- computations aborted!\n") ;
01564 exit(1) ;
01565 }
01566
01567 if( ! MRG_be_quiet ) printf("-- merging results into sub-brick %d\n",ivout) ;
01568
01569 /*** now, edit the merged dataset:
01570 cast out voxels that weren't hit enough ***/
01571
01572 if( MRG_hits_g > 0 ){
01573 for( ii=0 ; ii < nxyz ; ii++ )
01574 if( gnum[ii] < MRG_hits_g ) { gfim[ii] = 0 ; gnum[ii] = 0 ; }
01575 }
01576
01577 /*** decide if the output is to be stored as integers ***/
01578 /* [at this point, is_int is true if all]
01579 inputs were integers and unscaled. ] 08 Jan 1998 */
01580
01581 switch( MRG_cflag_g ){
01582 default: is_int = 0 ; break ; /* not allowed */
01583
01584 case CFLAG_COUNT: is_int = 1 ; break ; /* it IS an integer */
01585
01586 case CFLAG_MMAX: /* if all inputs */
01587 case CFLAG_SMAX: /* are integers, */
01588 case CFLAG_AMAX: /* then one of these */
01589 case CFLAG_ORDER: break ; /* will be integer also */
01590 }
01591
01592 /*** do the averaging as ordered ***/
01593
01594 switch( MRG_cflag_g ){
01595 default: break ;
01596
01597 case CFLAG_COUNT:
01598 first_fimfac = 0.0 ;
01599 for( ii=0 ; ii < nxyz ; ii++ ) gfim[ii] = gnum[ii] ;
01600 break ;
01601
01602 case CFLAG_MEAN:
01603 fac = 1.0 / num_dset ;
01604 for( ii=0 ; ii < nxyz ; ii++ ) gfim[ii] *= fac ;
01605 break ;
01606
01607 case CFLAG_NZMEAN:
01608 for( ii=0 ; ii < nxyz ; ii++ )
01609 if( gnum[ii] > 0 ) gfim[ii] /= gnum[ii] ;
01610 break ;
01611
01612 case CFLAG_FISHER:
01613 fac = 1.0 / num_dset ;
01614 for( ii=0 ; ii < nxyz ; ii++ ) gfim[ii] = TANH( fac * gfim[ii] ) ;
01615 break ;
01616 }
01617
01618 /* 29 Aug 1996: clean up the merged threshold, too */
01619
01620 switch( MRG_cflag_gthr ){
01621 default: break ;
01622
01623 case THFLAG_FICO:
01624 fac = 1.0 / num_dset ;
01625 for( ii=0 ; ii < nxyz ; ii++ ) ggfim[ii] = TANH( fac * ggfim[ii] ) ;
01626 break ;
01627 }
01628
01629 /**** at this point, don't need the count brick "gnum" anymore;
01630 "gfim" contains the results we'll eventually write to disk ****/
01631
01632 myXtFree( gnum ) ;
01633
01634 /*** if desired, edit the result for cluster size ***/
01635
01636 rmm = MRG_clust_rmm_g ;
01637 vmul = MRG_clust_vmul_g ;
01638 dxyz = dx*dy*dz ;
01639 ptmin = vmul / dxyz + 0.99 ;
01640
01641 if( (rmm >= dx || rmm >= dy || rmm >= dz) && ptmin > 1 ){
01642 if( ! MRG_be_quiet ) printf("-- editing merger for cluster size\n") ;
01643
01644 clar = MCW_find_clusters( nx,ny,nz , dx,dy,dz , MRI_float,gfim , rmm ) ;
01645 nclu = 0 ;
01646 if( clar != NULL ){
01647 for( iclu=0 ; iclu < clar->num_clu ; iclu++ ){
01648 if( clar->clar[iclu] != NULL && clar->clar[iclu]->num_pt < ptmin ){
01649 KILL_CLUSTER(clar->clar[iclu]) ;
01650 } else if( clar->clar[iclu] != NULL ){
01651 nclu++ ;
01652 }
01653 }
01654 }
01655
01656 if( nclu > 0 ){
01657 for( iclu=0 ; iclu < clar->num_clu ; iclu++ ){
01658 if( clar->clar[iclu] != NULL && clar->clar[iclu]->num_pt > 0 )
01659 MCW_cluster_to_vol( nx,ny,nz , MRI_float,gfim , clar->clar[iclu] ) ;
01660 }
01661 }
01662 }
01663
01664 /*** scan results for non-zero-ositifulness ***/
01665
01666 if( !MRG_doall ){ /* Nov 1998 */
01667 for( ii=0 ; ii < nxyz ; ii++ ) if( gfim[ii] != 0 ) break ;
01668 if( ii == nxyz ){
01669 fprintf(stderr,
01670 "*** Merged dataset has no nonzero entries -- will not write\n" ) ;
01671 exit(0) ;
01672 }
01673 }
01674
01675 /*** attach new data to output brick ***/
01676 /* [Nov 1998: changed from ival to ivout] */
01677
01678 switch( output_datum ){
01679
01680 default:
01681 fprintf(stderr,
01682 "*** Fatal Error ***\n"
01683 "*** Somehow ended up with output_datum = %d\n",output_datum) ;
01684 exit(1) ;
01685
01686 case MRI_complex:{
01687 void * dfim ;
01688 dfim = (void *) XtMalloc( sizeof(complex) * nxyz ) ;
01689 EDIT_coerce_type( nxyz , MRI_float,gfim , MRI_complex,dfim ) ;
01690 myXtFree( gfim ) ;
01691 EDIT_substitute_brick( new_dset , ivout , MRI_complex , dfim ) ;
01692 DSET_BRICK_FACTOR(new_dset,ivout) = 0.0 ;
01693 }
01694 break ;
01695
01696 case MRI_float:
01697 EDIT_substitute_brick( new_dset , ivout , MRI_float , gfim ) ;
01698 DSET_BRICK_FACTOR(new_dset,ivout) = 0.0 ;
01699 break ;
01700
01701 case MRI_byte:
01702 case MRI_short:{
01703 void * dfim ;
01704 float gtop ;
01705
01706 gtop = MCW_vol_amax( nx,ny,nz , MRI_float,gfim ) ;
01707
01708 if( MRG_cflag_g == CFLAG_FISHER ){
01709 fimfac = FUNC_COR_SCALE_SHORT ;
01710 } else if( gtop == 0.0 || /* 08 Jan 1998 */
01711 MRG_nscale || /* 15 Sep 2000 */
01712 (is_int && gtop <= MRI_TYPE_maxval[output_datum]) ){
01713 fimfac = 0.0 ;
01714 } else {
01715 fimfac = MRI_TYPE_maxval[output_datum] / gtop ;
01716 }
01717
01718 dfim = (void *) XtMalloc( mri_datum_size(output_datum) * nxyz ) ;
01719 EDIT_coerce_scale_type( nxyz,fimfac , MRI_float,gfim , output_datum,dfim ) ;
01720 myXtFree( gfim ) ;
01721 EDIT_substitute_brick( new_dset , ivout , output_datum , dfim ) ;
01722 DSET_BRICK_FACTOR(new_dset,ivout) = (fimfac != 0.0) ? 1.0/fimfac : 0.0 ;
01723 }
01724 break ;
01725 }
01726
01727 /** 29 Aug 1996: attach output threshold, if any **/
01728
01729 if( MRG_cflag_gthr != THFLAG_NONE ){
01730 short * dfim ;
01731
01732 dfim = (short *) XtMalloc( sizeof(short) * nxyz ) ;
01733 thrfac = FUNC_COR_SCALE_SHORT ;
01734 EDIT_coerce_scale_type( nxyz,thrfac , MRI_float,ggfim , MRI_short,dfim ) ;
01735 myXtFree( ggfim ) ;
01736 EDIT_substitute_brick( new_dset , DSET_THRESH_VALUE(new_dset) ,
01737 MRI_short , dfim ) ;
01738 DSET_BRICK_FACTOR(new_dset,1) = 1.0/thrfac ;
01739
01740 /* if all datasets were fico, then output is fico,
01741 and needs to get the degrees-of-freedom parameters stataux */
01742
01743 if( num_fico == num_dset ){
01744 (void) EDIT_dset_items( new_dset , ADN_stat_aux,thr_stataux , ADN_none ) ;
01745
01746 /* some datasets were fith, so output is fith */
01747
01748 } else {
01749 EDIT_dset_items( new_dset , ADN_func_type,FUNC_THR_TYPE , ADN_none ) ;
01750 }
01751 }
01752
01753 ivout++ ;
01754
01755 } /* iv End of iteration over sub-bricks */
01756
01757
01758 /*** write to disk!!! ***/
01759
01760 tross_Make_History( "3dmerge" , argc , argv , new_dset ) ;
01761 THD_load_statistics( new_dset ) ;
01762 THD_write_3dim_dataset( NULL,NULL , new_dset , True ) ;
01763 if( ! MRG_be_quiet )
01764 fprintf(stderr,"-- Wrote merged dataset: %s\n" , DSET_BRIKNAME(new_dset) ) ;
01765 exit(0) ;
01766 }
|
|
||||||||||||
|
Definition at line 119 of file 3dmerge.c. References argc, CFLAG_AMAX, CFLAG_COUNT, CFLAG_FISHER, CFLAG_MEAN, CFLAG_MMAX, CFLAG_NZMEAN, CFLAG_ORDER, CFLAG_SMAX, DSET_BRICK_TYPE, DSET_delete, DSET_NVOX, DUMP1, DUMP2, DUMP3, EDIT_check_argv(), FCFLAG_AVER, FCFLAG_EXPR, FCFLAG_MEAN, FCFLAG_ONE_STEP, FCFLAG_WINSOR, EDIT_options::fexpr, EDIT_options::filter_opt, EDIT_options::filter_rmm, EDIT_options::fmask, free, INIT_EDOPT, EDIT_options::iv_fim, EDIT_options::iv_thr, MCW_strncpy, MRG_be_quiet, MRG_cflag_g, MRG_cflag_gthr, MRG_clust_rmm_g, MRG_clust_vmul_g, MRG_datum, MRG_doall, MRG_have_edopt, MRG_hits_g, MRG_ivfim, MRG_ivthr, MRG_keepthr, MRG_nscale, MRG_output_prefix, MRG_output_session, MRG_thdatum, MRG_verbose, EDIT_options::nfmask, PARSER_evaluate_one(), PARSER_generate_code(), PARSER_mark_symbols(), strtod(), THD_countmask(), THD_makemask(), THD_MAX_LABEL, THD_MAX_NAME, THD_MAX_PREFIX, THD_open_dataset(), THFLAG_FICO, EDIT_options::thrfilter_opt, and EDIT_options::verbose. Referenced by main().
00120 {
00121 int nopt = 1 ;
00122 float val ;
00123 int ival ;
00124
00125 INIT_EDOPT( &MRG_edopt ) ;
00126
00127 while( nopt < argc && argv[nopt][0] == '-' ){
00128
00129 /**** check editing options ****/
00130
00131 ival = EDIT_check_argv( argc , argv , nopt , &MRG_edopt ) ;
00132 if( ival > 0 ){
00133 nopt += ival ; MRG_have_edopt = 1 ;
00134 continue ;
00135 }
00136
00137 /*** 29 Jul 2003: -verbose ***/
00138
00139 if( strncmp(argv[nopt],"-verb",5) == 0 ){
00140 MRG_verbose = MRG_edopt.verbose = 1 ;
00141 nopt++ ; continue ;
00142 }
00143
00144 /**** Nov 1998: -1tindex and -1dindex ****/
00145
00146 if( strncmp(argv[nopt],"-1dindex",5) == 0 ){
00147 if( ++nopt >= argc ){
00148 fprintf(stderr,"need an argument after -1dindex!\n") ; exit(1) ;
00149 }
00150 MRG_ivfim = MRG_edopt.iv_fim = (int) strtod( argv[nopt++] , NULL ) ;
00151 continue ;
00152 }
00153
00154 if( strncmp(argv[nopt],"-1tindex",5) == 0 ){
00155 if( ++nopt >= argc ){
00156 fprintf(stderr,"need an argument after -1tindex!\n") ; exit(1) ;
00157 }
00158 MRG_ivthr = MRG_edopt.iv_thr = (int) strtod( argv[nopt++] , NULL ) ;
00159 continue ;
00160 }
00161
00162 /**** 09 Aug 2000: -1fmask dset ****/
00163
00164 if( strncmp(argv[nopt],"-1fmask",6) == 0 ){
00165 THD_3dim_dataset * mset ; int nn ;
00166
00167 if( MRG_edopt.nfmask > 0 ){
00168 fprintf(stderr,"Can't have 2 -fmask options!\n") ;
00169 exit(1) ;
00170 }
00171 if( ++nopt >= argc ){
00172 fprintf(stderr,"No argument after %s?\n",argv[nopt-1]) ;
00173 exit(1);
00174 }
00175
00176 mset = THD_open_dataset( argv[nopt++] ) ;
00177 if( mset == NULL ){
00178 fprintf(stderr,"*** Can't open -fmask dataset\n") ;
00179 exit(1) ;
00180 }
00181 if( DSET_BRICK_TYPE(mset,0) == MRI_complex ){
00182 fprintf(stderr,"*** Can't deal with complex-valued -fmask dataset\n");
00183 exit(1) ;
00184 }
00185
00186 MRG_edopt.fmask = THD_makemask( mset , 0 , 666.0,-666.0 ) ;
00187 MRG_edopt.nfmask = DSET_NVOX(mset) ;
00188
00189 nn = THD_countmask(MRG_edopt.nfmask,MRG_edopt.fmask) ;
00190 if( nn < 2 ){
00191 fprintf(stderr,"*** Too few (%d) nonzero voxels in -fmask!\n",nn) ;
00192 exit(1) ;
00193 }
00194
00195 DSET_delete(mset) ;
00196
00197 if( MRG_edopt.filter_opt == FCFLAG_AVER )
00198 MRG_edopt.filter_opt = FCFLAG_MEAN ;
00199
00200 if( MRG_edopt.thrfilter_opt == FCFLAG_AVER )
00201 MRG_edopt.thrfilter_opt = FCFLAG_MEAN ;
00202
00203 continue ;
00204 }
00205
00206 /**** 11 Sep 2000: -1filter_winsor rmm nw ****/
00207
00208 if( strcmp(argv[nopt],"-1filter_winsor") == 0 ){
00209 int nwin ;
00210
00211 nopt++ ;
00212 if( nopt+1 >= argc ){
00213 fprintf(stderr,"*** Need 2 arguments after -1filter_winsor\n") ;
00214 exit(1) ;
00215 }
00216 MRG_edopt.filter_rmm = strtod( argv[nopt++] , NULL ) ;
00217 if( MRG_edopt.filter_rmm <= 0.0 ){
00218 fprintf(stderr,"*** Illegal rmm value after -1filter_winsor\n");
00219 exit(1) ;
00220 }
00221 nwin = (int) strtod( argv[nopt++] , NULL ) ;
00222 if( nwin <= 0 || nwin >= FCFLAG_ONE_STEP ){
00223 fprintf(stderr,"*** Illegal nw value after -1filter_winsor\n");
00224 exit(1) ;
00225 }
00226 MRG_edopt.filter_opt = FCFLAG_WINSOR + nwin ;
00227 MRG_have_edopt = 1 ; continue ;
00228 }
00229
00230 /**** 09 Aug 2000: -1filter_expr rmm expr ****/
00231
00232 if( strncmp(argv[nopt],"-1filter_expr",13) == 0 ){
00233 PARSER_code * pcode ; int hsym[26] , aa , naa , nee ;
00234 double atoz[26] , val ;
00235
00236 nopt++ ;
00237 if( nopt+1 >= argc ){
00238 fprintf(stderr,"*** Need 2 arguments after -1filter_expr\n") ;
00239 exit(1) ;
00240 }
00241 MRG_edopt.filter_opt = FCFLAG_EXPR;
00242 MRG_edopt.filter_rmm = strtod( argv[nopt++] , NULL ) ;
00243 if( MRG_edopt.filter_rmm <= 0.0 ){
00244 fprintf(stderr,"*** Illegal rmm value after -1filter_expr\n");
00245 exit(1) ;
00246 }
00247
00248 MRG_edopt.fexpr = argv[nopt++] ;
00249 pcode = PARSER_generate_code( MRG_edopt.fexpr ) ; /* compile */
00250
00251 if( pcode == NULL ){
00252 fprintf(stderr,"*** Illegal expr after -1filter_expr\n");
00253 exit(1);
00254 }
00255
00256 #undef MASK
00257 #undef PREDEFINED_MASK
00258 #define MASK(x) (1 << (x-'a'))
00259 #define PREDEFINED_MASK ( MASK('r') | MASK('x') | MASK('y') | MASK('z') \
00260 | MASK('i') | MASK('j') | MASK('k') )
00261
00262 /* check if only legal symbols are used */
00263
00264 PARSER_mark_symbols( pcode , hsym ) ; /* find symbols used */
00265
00266 for( nee=naa=aa=0 ; aa < 26 ; aa++ ){
00267 if( hsym[aa] ){
00268 if( ((1<<aa) & PREDEFINED_MASK) == 0 ){
00269 nee++ ; /* count of illegal symbols */
00270 fprintf(stderr,"*** Symbol %c in -1filter_expr is illegal\n",'a'+aa) ;
00271 } else {
00272 naa++ ; /* count of legal symbols */
00273 }
00274 }
00275 }
00276 if( nee > 0 ) exit(1) ; /* can't use this expression! */
00277 if( naa == 0 ){ /* no symbols? check if identically 0 */
00278 double atoz[26] , val ;
00279 val = PARSER_evaluate_one( pcode , atoz ) ;
00280 if( val != 0.0 ){
00281 fprintf(stderr,"+++ Warning: -1filter_expr is constant = %g\n",val) ;
00282 } else {
00283 fprintf(stderr,"*** -1filter_expr is identically zero\n") ;
00284 exit(1) ;
00285 }
00286 }
00287
00288 free(pcode) ; /* will recompile when it is used */
00289
00290 MRG_have_edopt = 1 ; continue ;
00291 }
00292
00293 /**** -quiet ****/
00294
00295 if( strncmp(argv[nopt],"-quiet",6) == 0 ){
00296 MRG_be_quiet = 1 ;
00297 nopt++ ; continue ;
00298 }
00299
00300
00301 /**** -keepthr ****/
00302
00303 if( strncmp(argv[nopt],"-keepthr",6) == 0 ){
00304 MRG_keepthr = 1 ;
00305 nopt++ ; continue ;
00306 }
00307
00308 /**** -doall ****/ /* 02 Feb 1998 */
00309
00310 if( strncmp(argv[nopt],"-doall",6) == 0 ){
00311 MRG_doall = 1 ;
00312 nopt++ ; continue ;
00313 }
00314
00315 /**** -datum type ****/
00316
00317 if( strncmp(argv[nopt],"-datum",6) == 0 ){
00318 DUMP2 ;
00319 if( ++nopt >= argc ){
00320 fprintf(stderr,"need an argument after -datum!\n") ; exit(1) ;
00321 }
00322
00323 if( strcmp(argv[nopt],"short") == 0 ){
00324 MRG_datum = MRI_short ;
00325 } else if( strcmp(argv[nopt],"float") == 0 ){
00326 MRG_datum = MRI_float ;
00327 } else if( strcmp(argv[nopt],"byte") == 0 ){
00328 MRG_datum = MRI_byte ;
00329 } else if( strcmp(argv[nopt],"complex") == 0 ){ /* not listed help */
00330 MRG_datum = MRI_complex ;
00331 } else {
00332 fprintf(stderr,"-datum of type '%s' is not supported in 3dmerge!\n",
00333 argv[nopt] ) ;
00334 exit(1) ;
00335 }
00336 nopt++ ; continue ; /* go to next arg */
00337 }
00338
00339 /**** -thdatum type ****/
00340
00341 if( strncmp(argv[nopt],"-thdatum",6) == 0 ){
00342 DUMP2 ;
00343 if( ++nopt >= argc ){
00344 fprintf(stderr,"need an argument after -thdatum!\n") ; exit(1) ;
00345 }
00346
00347 if( strcmp(argv[nopt],"short") == 0 ){
00348 MRG_thdatum = MRI_short ;
00349 } else if( strcmp(argv[nopt],"float") == 0 ){
00350 MRG_thdatum = MRI_float ;
00351 } else if( strcmp(argv[nopt],"byte") == 0 ){
00352 MRG_thdatum = MRI_byte ;
00353 } else {
00354 fprintf(stderr,"-thdatum of type '%s' is not supported in 3dmerge!\n",
00355 argv[nopt] ) ;
00356 exit(1) ;
00357 }
00358 MRG_keepthr = 1 ; /* -thdatum is meaningless without this */
00359 nopt++ ; continue ; /* go to next arg */
00360 }
00361
00362 /**** -ghits count ****/
00363
00364 if( strncmp(argv[nopt],"-ghits",6) == 0 ){
00365 DUMP2 ;
00366 nopt++ ;
00367 if( nopt >= argc ){
00368 fprintf(stderr,"need argument after -ghits!\n") ; exit(1) ;
00369 }
00370 MRG_hits_g = strtod( argv[nopt++] , NULL ) ;
00371 if( MRG_hits_g <= 0 ){
00372 fprintf(stderr,"illegal value after -ghits\n") ;
00373 exit(1) ;
00374 }
00375 continue ;
00376 }
00377
00378 /**** -gclust rmm vmul ****/
00379
00380 if( strncmp(argv[nopt],"-gclust",6) == 0 ){
00381 DUMP3 ;
00382 nopt++ ;
00383 if( nopt+1 >= argc ){
00384 fprintf(stderr,"need 2 arguments after -gclust!\n") ;
00385 exit(1) ;
00386 }
00387 MRG_clust_rmm_g = strtod( argv[nopt++] , NULL ) ;
00388 MRG_clust_vmul_g = strtod( argv[nopt++] , NULL ) ;
00389 if( MRG_clust_rmm_g <= 0 || MRG_clust_vmul_g <= 0 ){
00390 fprintf(stderr,"illegal value after -gclust\n") ;
00391 exit(1) ;
00392 }
00393 continue ;
00394 }
00395
00396 /**** -session dirname ****/
00397
00398 if( strncmp(argv[nopt],"-session",6) == 0 ){
00399 DUMP2 ;
00400 nopt++ ;
00401 if( nopt >= argc ){
00402 fprintf(stderr,"need argument after -session!\n") ;
00403 exit(1) ;
00404 }
00405 MCW_strncpy( MRG_output_session , argv[nopt++] , THD_MAX_NAME ) ;
00406 continue ;
00407 }
00408
00409 /**** -prefix prefix ****/
00410
00411 if( strncmp(argv[nopt],"-prefix",6) == 0 ){
00412 DUMP2 ;
00413 nopt++ ;
00414 if( nopt >= argc ){
00415 fprintf(stderr,"need argument after -prefix!\n") ;
00416 exit(1) ;
00417 }
00418 MCW_strncpy( MRG_output_prefix , argv[nopt++] , THD_MAX_PREFIX ) ;
00419 continue ;
00420 }
00421
00422 #if 0
00423 /**** -label string ****/
00424
00425 if( strncmp(argv[nopt],"-label",6) == 0 ){
00426 DUMP2 ;
00427 nopt++ ;
00428 if( nopt >= argc ){
00429 fprintf(stderr,"need argument after -label!\n") ;
00430 exit(1) ;
00431 }
00432 MCW_strncpy( MRG_output_label , argv[nopt++] , THD_MAX_LABEL ) ;
00433 continue ;
00434 }
00435 #endif
00436
00437 /**** -nscale [15 Sep 2000] ****/
00438
00439 if( strcmp(argv[nopt],"-nscale") == 0 ){
00440 DUMP1 ;
00441 MRG_nscale = 1 ;
00442 nopt++ ; continue ;
00443 }
00444
00445
00446 /**** -gmean ****/
00447
00448 if( strncmp(argv[nopt],"-gmean",6) == 0 ){
00449 DUMP1 ;
00450 MRG_cflag_g = CFLAG_MEAN ;
00451 nopt++ ; continue ;
00452 }
00453
00454 /**** -gfisher ****/
00455
00456 if( strncmp(argv[nopt],"-gfisher",6) == 0 ){
00457 DUMP1 ;
00458 MRG_cflag_g = CFLAG_FISHER ;
00459 nopt++ ; continue ;
00460 }
00461
00462 /**** -tgfisher (29 Aug 1996) ****/
00463
00464 if( strncmp(argv[nopt],"-tgfisher",6) == 0 ){
00465 DUMP1 ;
00466 MRG_cflag_gthr = THFLAG_FICO ;
00467 nopt++ ; continue ;
00468 }
00469
00470 /**** -gnzmean ****/
00471
00472 if( strncmp(argv[nopt],"-gnzmean",6) == 0 ){
00473 DUMP1 ;
00474 MRG_cflag_g = CFLAG_NZMEAN ;
00475 nopt++ ; continue ;
00476 }
00477
00478 /**** -gmax ****/
00479
00480 if( strncmp(argv[nopt],"-gmax",6) == 0 ){
00481 DUMP1 ;
00482 MRG_cflag_g = CFLAG_MMAX ;
00483 nopt++ ; continue ;
00484 }
00485
00486 /**** -gamax ****/
00487
00488 if( strncmp(argv[nopt],"-gamax",6) == 0 ){
00489 DUMP1 ;
00490 MRG_cflag_g = CFLAG_AMAX ;
00491 nopt++ ; continue ;
00492 }
00493
00494 /**** -gsmax ****/
00495
00496 if( strncmp(argv[nopt],"-gsmax",6) == 0 ){
00497 DUMP1 ;
00498 MRG_cflag_g = CFLAG_SMAX ;
00499 nopt++ ; continue ;
00500 }
00501
00502 /*** -gcount ****/
00503
00504 if( strncmp(argv[nopt],"-gcount",6) == 0 ){
00505 DUMP1 ;
00506 MRG_cflag_g = CFLAG_COUNT ;
00507 nopt++ ; continue ;
00508 }
00509
00510 /*** -gorder ****/
00511
00512 if( strncmp(argv[nopt],"-gorder",6) == 0 ){
00513 DUMP1 ;
00514 MRG_cflag_g = CFLAG_ORDER ;
00515 nopt++ ; continue ;
00516 }
00517
00518 /**** unknown switch ****/
00519
00520 fprintf(stderr,"unrecognized option %s\n",argv[nopt]) ;
00521 exit(1) ;
00522
00523 } /* end of loop over options */
00524
00525 /*** cleanup ***/
00526
00527 #if 0
00528 if( strlen(MRG_output_label) == 0 ){
00529 MCW_strncpy( MRG_output_label , MRG_output_prefix , THD_MAX_LABEL ) ;
00530 }
00531 #endif
00532
00533 return( nopt );
00534 }
|
|
||||||||||||
|
|
|
|
Definition at line 538 of file 3dmerge.c. References ALLOW_SUBV, EDIT_options_help(), and MASTER_SHORTHELP_STRING. Referenced by main().
00539 {
00540 printf(
00541 "Edit and/or merge 3D datasets\n"
00542 "Usage: 3dmerge [options] datasets ...\n"
00543 "where the options are:\n"
00544 ) ;
00545
00546 printf( "%s\n" , EDIT_options_help() ) ;
00547
00548 printf(
00549 "OTHER OPTIONS:\n"
00550 " -datum type = Coerce the output data to be stored as the given type,\n"
00551 " which may be byte, short, or float.\n"
00552 " N.B.: Byte data cannot be negative. If this datum type is chosen,\n"
00553 " any negative values in the edited and/or merged dataset\n"
00554 " will be set to zero.\n"
00555 " -keepthr = When using 3dmerge to edit exactly one dataset of a\n"
00556 " functional type with a threshold statistic attached,\n"
00557 " normally the resulting dataset is of the 'fim'\n"
00558 " (intensity only) type. This option tells 3dmerge to\n"
00559 " copy the threshold data (unedited in any way) into\n"
00560 " the output dataset.\n"
00561 " N.B.: This option is ignored if 3dmerge is being used to\n"
00562 " combine 2 or more datasets.\n"
00563 " N.B.: The -datum option has no effect on the storage of the\n"
00564 " threshold data. Instead use '-thdatum type'.\n"
00565 "\n"
00566 " -doall = Apply editing and merging options to ALL sub-bricks \n"
00567 " uniformly in a dataset.\n"
00568 " N.B.: All input datasets must have the same number of sub-bricks\n"
00569 " when using the -doall option. \n"
00570 " N.B.: The threshold specific options (such as -1thresh, \n"
00571 " -keepthr, -tgfisher, etc.) are not compatible with \n"
00572 " the -doall command. Neither are the -1dindex or\n"
00573 " the -1tindex options.\n"
00574 " N.B.: All labels and statistical parameters for individual \n"
00575 " sub-bricks are copied from the first dataset. It is \n"
00576 " the responsibility of the user to verify that these \n"
00577 " are appropriate. Note that sub-brick auxiliary data \n"
00578 " can be modified using program 3drefit. \n"
00579 "\n"
00580 " -1dindex j = Uses sub-brick #j as the data source , and uses sub-brick\n"
00581 " -1tindex k = #k as the threshold source. With these, you can operate\n"
00582 " on any given sub-brick of the inputs dataset(s) to produce\n"
00583 " as output a 1 brick dataset. If desired, a collection\n"
00584 " of 1 brick datasets can later be assembled into a\n"
00585 " multi-brick bucket dataset using program '3dbucket'\n"
00586 " or into a 3D+time dataset using program '3dTcat'.\n"
00587 " N.B.: If these options aren't used, j=0 and k=1 are the defaults\n"
00588 "\n"
00589 " The following option allows you to specify a mask dataset that\n"
00590 " limits the action of the 'filter' options to voxels that are\n"
00591 " nonzero in the mask:\n"
00592 "\n"
00593 " -1fmask mset = Read dataset 'mset' (which can include a\n"
00594 " sub-brick specifier) and use the nonzero\n"
00595 " voxels as a mask for the filter options.\n"
00596 " Filtering calculations will not use voxels\n"
00597 " that are outside the mask. If an output\n"
00598 " voxel does not have ANY masked voxels inside\n"
00599 " the rmm radius, then that output voxel will\n"
00600 " be set to 0.\n"
00601 " N.B.: * Only the -1filter_* and -t1filter_* options are\n"
00602 " affected by -1fmask.\n"
00603 " * In the linear averaging filters (_mean, _nzmean,\n"
00604 " and _expr), voxels not in the mask will not be used\n"
00605 " or counted in either the numerator or denominator.\n"
00606 " This can give unexpected results. If the mask is\n"
00607 " designed to exclude the volume outside the brain,\n"
00608 " then voxels exterior to the brain, but within 'rmm',\n"
00609 " will have a few voxels inside the brain included\n"
00610 " in the filtering. Since the sum of weights (the\n"
00611 " denominator) is only over those few intra-brain\n"
00612 " voxels, the effect will be to extend the significant\n"
00613 " part of the result outward by rmm from the surface\n"
00614 " of the brain. In contrast, without the mask, the\n"
00615 " many small-valued voxels outside the brain would\n"
00616 " be included in the numerator and denominator sums,\n"
00617 " which would barely change the numerator (since the\n"
00618 " voxel values are small outside the brain), but would\n"
00619 " increase the denominator greatly (by including many\n"
00620 " more weights). The effect in this case (no -1fmask)\n"
00621 " is to make the filtering taper off gradually in the\n"
00622 " rmm-thickness shell around the brain.\n"
00623 " * Thus, if the -1fmask is intended to clip off non-brain\n"
00624 " data from the filtering, its use should be followed by\n"
00625 " masking operation using 3dcalc:\n"
00626 " 3dmerge -1filter_aver 12 -1fmask mask+orig -prefix x input+orig\n"
00627 " 3dcalc -a x -b mask+orig -prefix y -expr 'a*step(b)'\n"
00628 " rm -f x+orig.*\n"
00629 " The desired result is y+orig - filtered using only\n"
00630 " brain voxels (as defined by mask+orig), and with\n"
00631 " the output confined to the brain voxels as well.\n"
00632 "\n"
00633 " The following option allows you to specify an almost arbitrary\n"
00634 " weighting function for 3D linear filtering:\n"
00635 "\n"
00636 " -1filter_expr rmm expr\n"
00637 " Defines a linear filter about each voxel of radius 'rmm' mm.\n"
00638 " The filter weights are proportional to the expression evaluated\n"
00639 " at each voxel offset in the rmm neighborhood. You can use only\n"
00640 " these symbols in the expression:\n"
00641 " r = radius from center\n"
00642 " x = dataset x-axis offset from center\n"
00643 " y = dataset y-axis offset from center\n"
00644 " z = dataset z-axis offset from center\n"
00645 " i = x-axis index offset from center\n"
00646 " j = y-axis index offset from center\n"
00647 " k = z-axis index offset from center\n"
00648 " Example:\n"
00649 " -1filter_expr 12.0 'exp(-r*r/36.067)'\n"
00650 " This does a Gaussian filter over a radius of 12 mm. In this\n"
00651 " example, the FWHM of the filter is 10 mm. [in general, the\n"
00652 " denominator in the exponent would be 0.36067 * FWHM * FWHM.\n"
00653 " This is the only way to get a Gaussian blur combined with the\n"
00654 " -1fmask option. The radius rmm=12 is chosen where the weights\n"
00655 " get smallish.] Another example:\n"
00656 " -1filter_expr 20.0 'exp(-(x*x+16*y*y+z*z)/36.067)'\n"
00657 " which is a non-spherical Gaussian filter.\n"
00658 "\n"
00659 " The following option lets you apply a 'Winsor' filter to the data:\n"
00660 "\n"
00661 " -1filter_winsor rmm nw\n"
00662 " The data values within the radius rmm of each voxel are sorted.\n"
00663 " Suppose there are 'N' voxels in this group. We index the\n"
00664 " sorted voxels as s[0] <= s[1] <= ... <= s[N-1], and we call the\n"
00665 " value of the central voxel 'v' (which is also in array s[]).\n"
00666 " If v < s[nw] , then v is replaced by s[nw]\n"
00667 " otherwise If v > s[N-1-nw], then v is replace by s[N-1-nw]\n"
00668 " otherwise v is unchanged\n"
00669 " The effect is to increase 'too small' values up to some\n"
00670 " middling range, and to decrease 'too large' values.\n"
00671 " If N is odd, and nw=(N-1)/2, this would be a median filter.\n"
00672 " In practice, I recommend that nw be about N/4; for example,\n"
00673 " -dxyz=1 -1filter_winsor 2.5 19\n"
00674 " is a filter with N=81 that gives nice results.\n"
00675 " N.B.: This option is NOT affected by -1fmask\n"
00676 " N.B.: This option is slow!\n"
00677 "\n"
00678 "MERGING OPTIONS APPLIED TO FORM THE OUTPUT DATASET:\n"
00679 " [That is, different ways to combine results. The]\n"
00680 " [following '-g' options are mutually exclusive! ]\n"
00681 " -gmean = Combine datasets by averaging intensities\n"
00682 " (including zeros) -- this is the default\n"
00683 " -gnzmean = Combine datasets by averaging intensities\n"
00684 " (not counting zeros)\n"
00685 " -gmax = Combine datasets by taking max intensity\n"
00686 " (e.g., -7 and 2 combine to 2)\n"
00687 " -gamax = Combine datasets by taking max absolute intensity\n"
00688 " (e.g., -7 and 2 combine to 7)\n"
00689 " -gsmax = Combine datasets by taking max signed intensity\n"
00690 " (e.g., -7 and 2 combine to -7)\n"
00691 " -gcount = Combine datasets by counting number of 'hits' in\n"
00692 " each voxel (see below for defintion of 'hit')\n"
00693 " -gorder = Combine datasets in order of input:\n"
00694 " * If a voxel is nonzero in dataset #1, then\n"
00695 " that value goes into the voxel.\n"
00696 " * If a voxel is zero in dataset #1 but nonzero\n"
00697 " in dataset #2, then the value from #2 is used.\n"
00698 " * And so forth: the first dataset with a nonzero\n"
00699 " entry in a given voxel 'wins'\n"
00700 " -gfisher = Takes the arctanh of each input, averages these,\n"
00701 " and outputs the tanh of the average. If the input\n"
00702 " datum is 'short', then input values are scaled by\n"
00703 " 0.0001 and output values by 10000. This option\n"
00704 " is for merging bricks of correlation coefficients.\n"
00705 "\n"
00706 " -nscale = If the output datum is shorts, don't do the scaling\n"
00707 " to the max range [similar to 3dcalc's -nscale option]\n"
00708 "\n"
00709 "MERGING OPERATIONS APPLIED TO THE THRESHOLD DATA:\n"
00710 " [That is, different ways to combine the thresholds. If none of these ]\n"
00711 " [are given, the thresholds will not be merged and the output dataset ]\n"
00712 " [will not have threshold data attached. Note that the following '-tg']\n"
00713 " [command line options are mutually exclusive, but are independent of ]\n"
00714 " [the '-g' options given above for merging the intensity data values. ]\n"
00715 " -tgfisher = This option is only applicable if each input dataset\n"
00716 " is of the 'fico' or 'fith' types -- functional\n"
00717 " intensity plus correlation or plus threshold.\n"
00718 " (In the latter case, the threshold values are\n"
00719 " interpreted as correlation coefficients.)\n"
00720 " The correlation coefficients are averaged as\n"
00721 " described by -gfisher above, and the output\n"
00722 " dataset will be of the fico type if all inputs\n"
00723 " are fico type; otherwise, the output datasets\n"
00724 " will be of the fith type.\n"
00725 " N.B.: The difference between the -tgfisher and -gfisher\n"
00726 " methods is that -tgfisher applies to the threshold\n"
00727 " data stored with a dataset, while -gfisher\n"
00728 " applies to the intensity data. Thus, -gfisher\n"
00729 " would normally be applied to a dataset created\n"
00730 " from correlation coefficients directly, or from\n"
00731 " the application of the -1thtoin option to a fico\n"
00732 " or fith dataset.\n"
00733 "\n"
00734 "OPTIONAL WAYS TO POSTPROCESS THE COMBINED RESULTS:\n"
00735 " [May be combined with the above methods.]\n"
00736 " [Any combination of these options may be used.]\n"
00737 " -ghits count = Delete voxels that aren't !=0 in at least\n"
00738 " count datasets (!=0 is a 'hit')\n"
00739 " -gclust rmm vmul = Form clusters with connection distance rmm\n"
00740 " and clip off data not in clusters of\n"
00741 " volume at least vmul microliters\n"
00742 "\n"
00743 "The '-g' and '-tg' options apply to the entire group of input datasets.\n"
00744 "\n"
00745
00746 "OPTIONS THAT CONTROL THE NAMES OF THE OUTPUT DATASET:\n"
00747 " -session dirname = write output into given directory (default=./)\n"
00748 " -prefix pname = use 'pname' for the output directory prefix\n"
00749 " (default=mrg)\n"
00750 #if 0
00751 " -label string = use 'string' for the label in the output\n"
00752 " dataset (the label is used for switching\n"
00753 " between datasets in AFNI)\n"
00754 #endif
00755 "\n"
00756
00757 "NOTES:\n"
00758 " ** If only one dataset is read into this program, then the '-g'\n"
00759 " options do not apply, and the output dataset is simply the\n"
00760 " '-1' options applied to the input dataset (i.e., edited).\n"
00761 " ** A merged output dataset is ALWAYS of the intensity-only variety.\n"
00762 " ** You can combine the outputs of 3dmerge with other sub-bricks\n"
00763 " using the program 3dbucket.\n"
00764 " ** Complex-valued datasets cannot be merged.\n"
00765 " ** This program cannot handle time-dependent datasets without -doall.\n"
00766 " ** Note that the input datasets are specified by their .HEAD files,\n"
00767 " but that their .BRIK files must exist also!\n"
00768
00769 #ifdef ALLOW_SUBV
00770 "\n"
00771 MASTER_SHORTHELP_STRING
00772 "\n"
00773 " ** Input datasets using sub-brick selectors are treated as follows:\n"
00774 " - 3D+time if the dataset is 3D+time and more than 1 brick is chosen\n"
00775 " - otherwise, as bucket datasets (-abuc or -fbuc)\n"
00776 " (in particular, fico, fitt, etc. datasets are converted to fbuc)\n"
00777 " ** If you are NOT using -doall, and choose more than one sub-brick\n"
00778 " with the selector, then you may need to use -1dindex to further\n"
00779 " pick out the sub-brick on which to operate (why you would do this\n"
00780 " I cannot fathom). If you are also using a thresholding operation\n"
00781 " (e.g., -1thresh), then you also MUST use -1tindex to choose which\n"
00782 " sub-brick counts as the 'threshold' value. When used with sub-brick\n"
00783 " selection, 'index' refers the dataset AFTER it has been read in:\n"
00784 " -1dindex 1 -1tindex 3 'dset+orig[4..7]'\n"
00785 " means to use the #5 sub-brick of dset+orig as the data for merging\n"
00786 " and the #7 sub-brick of dset+orig as the threshold values.\n"
00787 " ** The above example would better be done with\n"
00788 " -1tindex 1 'dset+orig[5,7]'\n"
00789 " since the default data index is 0. (You would only use -1tindex if\n"
00790 " you are actually using a thresholding operation.)\n"
00791 " ** -1dindex and -1tindex apply to all input datasets.\n"
00792 #endif
00793 ) ;
00794 exit(0) ;
00795 }
|
Variable Documentation
|
|
Definition at line 83 of file 3dmerge.c. Referenced by main(), and MRG_read_opts(). |
|
|
Definition at line 77 of file 3dmerge.c. Referenced by main(), and MRG_read_opts(). |
|
|
Definition at line 84 of file 3dmerge.c. Referenced by main(), and MRG_read_opts(). |
|
|
Definition at line 79 of file 3dmerge.c. Referenced by main(), and MRG_read_opts(). |
|
|
Definition at line 80 of file 3dmerge.c. Referenced by main(), and MRG_read_opts(). |
|
|
Definition at line 81 of file 3dmerge.c. Referenced by main(), and MRG_read_opts(). |
|
|
Definition at line 85 of file 3dmerge.c. Referenced by main(), and MRG_read_opts(). |
|
|
|
|
|
Definition at line 74 of file 3dmerge.c. Referenced by MRG_read_opts(). |
|
|
Definition at line 76 of file 3dmerge.c. Referenced by main(), and MRG_read_opts(). |
|
|
Definition at line 94 of file 3dmerge.c. Referenced by main(), and MRG_read_opts(). |
|
|
Definition at line 95 of file 3dmerge.c. Referenced by main(), and MRG_read_opts(). |
|
|
Definition at line 78 of file 3dmerge.c. Referenced by main(), and MRG_read_opts(). |
|
|
Definition at line 97 of file 3dmerge.c. Referenced by main(), and MRG_read_opts(). |
|
|
Definition at line 89 of file 3dmerge.c. Referenced by main(), and MRG_read_opts(). |
|
|
Definition at line 88 of file 3dmerge.c. Referenced by main(), and MRG_read_opts(). |
|
|
Definition at line 82 of file 3dmerge.c. Referenced by main(), and MRG_read_opts(). |
|
|
Definition at line 86 of file 3dmerge.c. Referenced by MRG_read_opts(). |