Skip to content

AFNI/NIfTI Server

Sections
Personal tools
You are here: Home » AFNI » Documentation

Doxygen Source Code Documentation


Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search  

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

#define ALLOW_SUBV
 

Definition at line 44 of file 3dmerge.c.

Referenced by MRG_Syntax().

#define ATANH z       atanh(z)
 

Definition at line 69 of file 3dmerge.c.

Referenced by main().

#define CFLAG_AMAX   5
 

Definition at line 60 of file 3dmerge.c.

Referenced by main(), and MRG_read_opts().

#define CFLAG_COUNT   4
 

Definition at line 59 of file 3dmerge.c.

Referenced by main(), and MRG_read_opts().

#define CFLAG_FISHER   8
 

Definition at line 63 of file 3dmerge.c.

Referenced by main(), and MRG_read_opts().

#define CFLAG_MEAN   1
 

Definition at line 56 of file 3dmerge.c.

Referenced by main(), and MRG_read_opts().

#define CFLAG_MMAX   3
 

Definition at line 58 of file 3dmerge.c.

Referenced by main(), and MRG_read_opts().

#define CFLAG_NZMEAN   2
 

Definition at line 57 of file 3dmerge.c.

Referenced by main(), and MRG_read_opts().

#define CFLAG_ORDER   7
 

Definition at line 62 of file 3dmerge.c.

Referenced by main(), and MRG_read_opts().

#define CFLAG_SMAX   6
 

Definition at line 61 of file 3dmerge.c.

Referenced by main(), and MRG_read_opts().

#define DSET_OPEN   THD_open_dataset
 

Definition at line 47 of file 3dmerge.c.

Referenced by main().

#define DUMP1
 

Definition at line 114 of file 3dmerge.c.

Referenced by MRG_read_opts().

#define DUMP2
 

Definition at line 115 of file 3dmerge.c.

Referenced by MRG_read_opts().

#define DUMP3
 

Definition at line 116 of file 3dmerge.c.

Referenced by MRG_read_opts().

#define LAST_MOD_DATE   "02 Nov 2001"
 

Definition at line 32 of file 3dmerge.c.

Referenced by main().

#define MAIN
 

Definition at line 37 of file 3dmerge.c.

#define MASK      (1 << (x-'a'))
 

#define MEGA   1048576
 

Definition at line 38 of file 3dmerge.c.

Referenced by main().

#define PREDEFINED_MASK
 

Value:

( MASK('r') | MASK('x') | MASK('y') | MASK('z')   \
                                      | MASK('i') | MASK('j') | MASK('k') )

#define PROGRAM_NAME   "3dmerge"
 

Definition at line 31 of file 3dmerge.c.

Referenced by main().

#define TANH z       tanh(z)
 

Definition at line 68 of file 3dmerge.c.

Referenced by main().

#define THFLAG_FICO   71
 

Definition at line 66 of file 3dmerge.c.

Referenced by main(), and MRG_read_opts().

#define THFLAG_NONE   0
 

Definition at line 65 of file 3dmerge.c.

Referenced by main().


Function Documentation

int main int    argc,
char *    argv[]
 

---------- 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 }

int MRG_read_opts int    argc,
char *    argv[]
 

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 }

int MRG_read_opts int   ,
char **   
 

void MRG_Syntax void   
 

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

int MRG_be_quiet = 0 [static]
 

Definition at line 83 of file 3dmerge.c.

Referenced by main(), and MRG_read_opts().

int MRG_cflag_g = CFLAG_MEAN [static]
 

Definition at line 77 of file 3dmerge.c.

Referenced by main(), and MRG_read_opts().

int MRG_cflag_gthr = THFLAG_NONE [static]
 

Definition at line 84 of file 3dmerge.c.

Referenced by main(), and MRG_read_opts().

float MRG_clust_rmm_g = 0.0 [static]
 

Definition at line 79 of file 3dmerge.c.

Referenced by main(), and MRG_read_opts().

float MRG_clust_vmul_g = 0.0 [static]
 

Definition at line 80 of file 3dmerge.c.

Referenced by main(), and MRG_read_opts().

int MRG_datum = ILLEGAL_TYPE [static]
 

Definition at line 81 of file 3dmerge.c.

Referenced by main(), and MRG_read_opts().

int MRG_doall = 0 [static]
 

Definition at line 85 of file 3dmerge.c.

Referenced by main(), and MRG_read_opts().

EDIT_options MRG_edopt [static]
 

Definition at line 73 of file 3dmerge.c.

int MRG_have_edopt = 0 [static]
 

Definition at line 74 of file 3dmerge.c.

Referenced by MRG_read_opts().

int MRG_hits_g = 0 [static]
 

Definition at line 76 of file 3dmerge.c.

Referenced by main(), and MRG_read_opts().

int MRG_ivfim = -1 [static]
 

Definition at line 94 of file 3dmerge.c.

Referenced by main(), and MRG_read_opts().

int MRG_ivthr = -1 [static]
 

Definition at line 95 of file 3dmerge.c.

Referenced by main(), and MRG_read_opts().

int MRG_keepthr = 0 [static]
 

Definition at line 78 of file 3dmerge.c.

Referenced by main(), and MRG_read_opts().

int MRG_nscale = 0 [static]
 

Definition at line 97 of file 3dmerge.c.

Referenced by main(), and MRG_read_opts().

char MRG_output_prefix[THD_MAX_PREFIX] = "mrg" [static]
 

Definition at line 89 of file 3dmerge.c.

Referenced by main(), and MRG_read_opts().

char MRG_output_session[THD_MAX_NAME] = "./" [static]
 

Definition at line 88 of file 3dmerge.c.

Referenced by main(), and MRG_read_opts().

int MRG_thdatum = ILLEGAL_TYPE [static]
 

Definition at line 82 of file 3dmerge.c.

Referenced by main(), and MRG_read_opts().

int MRG_verbose = 0 [static]
 

Definition at line 86 of file 3dmerge.c.

Referenced by MRG_read_opts().

 

Powered by Plone

This site conforms to the following standards: