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  

3ddup.c File Reference

#include "mrilib.h"

Go to the source code of this file.


Defines

#define DUPERR(str)   do{ fprintf(stderr,"ERROR: %s\n",(str)) ; exit(1) ; } while(0)

Functions

THD_3dim_datasetduplicate_dataset (THD_3dim_dataset *parent)
int main (int argc, char *argv[])

Variables

char DUP_session [THD_MAX_NAME] = "./"
char DUP_prefix [THD_MAX_PREFIX] = "dup"
int anatomy_type = ILLEGAL_TYPE
int function_type = ILLEGAL_TYPE
int dataset_type = ILLEGAL_TYPE

Define Documentation

#define DUPERR str       do{ fprintf(stderr,"ERROR: %s\n",(str)) ; exit(1) ; } while(0)
 


Function Documentation

THD_3dim_dataset * duplicate_dataset THD_3dim_dataset   parent
 

scan command line options *

Definition at line 201 of file dsetdup.c.

00202 {
00203    THD_3dim_dataset * new_dset ;
00204    int ii ;
00205 
00206    /* sanity checks */
00207 
00208    if( ! ISVALID_3DIM_DATASET(parent) ) return NULL ;
00209 
00210    /* make new dataset, copying appropriate fields from its various parents */
00211 
00212    new_dset = myXtNew( THD_3dim_dataset ) ; INIT_KILL( new_dset->kl ) ;
00213 
00214    new_dset->type      = parent->type ;
00215    new_dset->func_type = parent->func_type ;
00216    new_dset->view_type = parent->view_type ;
00217 
00218    new_dset->anat_parent         = NULL ;   /* no anat parent */
00219    new_dset->anat_parent_name[0] = '\0' ;
00220 
00221    new_dset->warp_parent =  parent ;        /* yes warp parent */
00222    MCW_strncpy( new_dset->warp_parent_name , parent->self_name , THD_MAX_NAME ) ;
00223 
00224    /* make the actual warp from the warp_parent to this dataset */
00225 
00226    new_dset->vox_warp       = myXtNew( THD_warp ) ;
00227    new_dset->vox_warp->type = ILLEGAL_TYPE ;        /* created when needed */
00228    new_dset->warp           = myXtNew( THD_warp ) ;
00229    *(new_dset->warp)        = IDENTITY_WARP ;
00230 
00231    /* make up some names for this new dataset */
00232 
00233    MCW_strncpy( new_dset->self_name  , parent->self_name , THD_MAX_NAME-5 ) ;
00234    ii = strlen( new_dset->self_name ) ;
00235    MCW_strncpy( &(new_dset->self_name[ii]) , "%duplicate" , THD_MAX_NAME-ii ) ;
00236 
00237    MCW_strncpy( new_dset->label1 , parent->label1 , THD_MAX_LABEL ) ;
00238    MCW_strncpy( new_dset->label2 , parent->label2 , THD_MAX_LABEL ) ;
00239 
00240    /* set the axes for this new dataset
00241       (same as parent, since that's the meaning of this routine) */
00242 
00243    new_dset->daxes         = myXtNew( THD_dataxes ) ;  /* copy data axes of */
00244    *(new_dset->daxes)      = *(parent->daxes) ;      /* parent */
00245    new_dset->daxes->parent = (XtPointer) new_dset ;  /* reset parent */
00246 
00247    new_dset->wod_daxes     = myXtNew( THD_dataxes ) ;  /* warp-on-demand */
00248    *(new_dset->wod_daxes)  = *(new_dset->daxes) ;
00249    new_dset->wod_flag      = True ;
00250 
00251    /* create a datablock and diskptr, in case the data is ever
00252       filled into memory (instead of wod) and written to disk */
00253 
00254    new_dset->dblk = myXtNew( THD_datablock ) ; INIT_KILL( new_dset->dblk->kl ) ;
00255 
00256    new_dset->dblk->type        = DATABLOCK_TYPE ;
00257    new_dset->dblk->nvals       = parent->dblk->nvals ;
00258    new_dset->dblk->brick       = NULL ;
00259    new_dset->dblk->malloc_type = DATABLOCK_MEM_UNDEFINED ;
00260    new_dset->dblk->total_bytes = 0 ;
00261    new_dset->dblk->brick_bytes = 0 ;
00262    new_dset->dblk->natr        = new_dset->dblk->natr_alloc  = 0 ;
00263    new_dset->dblk->atr         = NULL ;
00264    new_dset->dblk->parent      = (XtPointer) new_dset ;
00265 
00266    DBLK_unlock(new_dset->dblk) ;
00267 
00268    new_dset->dblk->diskptr               = myXtNew( THD_diskptr ) ;
00269    new_dset->dblk->diskptr->type         = DISKPTR_TYPE ;
00270    new_dset->dblk->diskptr->nvals        = parent->dblk->nvals ;
00271    new_dset->dblk->diskptr->rank         = 3 ;
00272    new_dset->dblk->diskptr->storage_mode = STORAGE_UNDEFINED ;
00273    new_dset->dblk->diskptr->byte_order   = THD_get_write_order() ;  /* 25 April 1998 */
00274    new_dset->dblk->diskptr->dimsizes[0]  = new_dset->daxes->nxx ;
00275    new_dset->dblk->diskptr->dimsizes[1]  = new_dset->daxes->nyy ;
00276    new_dset->dblk->diskptr->dimsizes[2]  = new_dset->daxes->nzz ;
00277 
00278    /* create the names for storage on disk (if ever)
00279       -- note we put it in the same directory as the parent */
00280 
00281    THD_init_diskptr_names( new_dset->dblk->diskptr ,
00282                            parent->dblk->diskptr->directory_name , NULL ,
00283                            parent->dblk->diskptr->prefix ,
00284                            new_dset->view_type , True ) ;
00285 
00286    ADDTO_KILL( new_dset->dblk->kl , new_dset->dblk->diskptr ) ;
00287 
00288    /* oh yeah, set the new_dset kill list,
00289       copy statistics if available, and NULL out any unused stuff */
00290 
00291    ADDTO_KILL( new_dset->kl , new_dset->warp ) ;
00292    ADDTO_KILL( new_dset->kl , new_dset->vox_warp ) ;
00293    ADDTO_KILL( new_dset->kl , new_dset->daxes ) ;
00294    ADDTO_KILL( new_dset->kl , new_dset->wod_daxes ) ;
00295    ADDTO_KILL( new_dset->kl , new_dset->dblk ) ;
00296 
00297    new_dset->self_warp = NULL ;  /* 26 Aug 2002 */
00298 
00299    if( parent->stats != NULL ){
00300       new_dset->stats         = myXtNew( THD_statistics ) ;  /* copy statistics */
00301       *(new_dset->stats)      = *(parent->stats) ;         /* of parent */
00302       new_dset->stats->parent = (XtPointer) new_dset ;
00303       ADDTO_KILL( new_dset->kl , new_dset->stats ) ;
00304    } else {
00305       new_dset->stats = NULL ;
00306    }
00307 
00308    new_dset->markers     = NULL ;  /* no markers */
00309    new_dset->death_mark  = 0 ;     /* don't kill me! */
00310    new_dset->tcat_list   = 0 ;
00311    new_dset->tcat_num    = 0 ;
00312    new_dset->tcat_len    = NULL ;
00313 
00314    return(new_dset) ;
00315 }

int main int    argc,
char *    argv[]
 

compute the overall minimum and maximum voxel values for a dataset

Definition at line 28 of file 3ddup.c.

References ADN_directory_name, ADN_func_type, ADN_label1, ADN_none, ADN_prefix, ADN_self_name, ADN_type, ADN_warp, ADN_warp_parent, ANAT_BUCK_TYPE, anatomy_type, argc, dataset_type, THD_3dim_dataset::dblk, DSET_NUM_TIMES, DSET_NVALS_PER_TIME, DUP_prefix, DUP_session, EDIT_dset_items(), EDIT_empty_copy(), FIRST_3DIM_TYPE, FIRST_ANAT_TYPE, FIRST_FUNC_TYPE, FUNC_BUCK_TYPE, function_type, HEAD_ANAT_TYPE, HEAD_FUNC_TYPE, IDENTITY_WARP, ISANATTYPE, ISFUNCTYPE, ISVALID_3DIM_DATASET, LAST_3DIM_TYPE, LAST_ANAT_TYPE, LAST_FUNC_TYPE, MCW_strncpy, myXtNew, THD_datablock::nvals, THD_MAX_NAME, THD_MAX_PREFIX, THD_open_one_dataset(), THD_write_3dim_dataset(), tross_Copy_History(), and tross_Make_History().

00029 {
00030    int nopt , ii ;
00031    THD_3dim_dataset * dset_in , * dset_out ;
00032    THD_warp * warp , * twarp ;
00033 
00034    /** check for help **/
00035 
00036    if( argc < 2 || strncmp(argv[1],"-help",3) == 0 ){
00037       printf(
00038        "Usage: 3ddup [options] dataset\n"
00039        " 'Duplicates' a 3D dataset by making a warp-on-demand copy.\n"
00040        " Applications:\n"
00041        "   - allows AFNI to resample a dataset to a new grid without\n"
00042        "       destroying an existing data .BRIK\n"
00043        "   - change a functional dataset to anatomical, or vice-versa\n"
00044        "\n"
00045        "OPTIONS:\n"
00046        "  -'type'           = Convert to the given 'type', which must be\n"
00047        "                       chosen from the same list as in to3d\n"
00048        "  -session dirname  = Write output into given directory (default=./)\n"
00049        "  -prefix  pname    = Use 'pname' for the output directory prefix\n"
00050        "                       (default=dup)\n"
00051        "N.B.: Even if the new dataset is anatomical, it will not contain\n"
00052        "      any markers, duplicated from the original, or otherwise.\n"
00053      ) ;
00054      exit(0) ;
00055    }
00056 
00057    /** scan command line options **/
00058 
00059 #define DUPERR(str) \
00060    do{ fprintf(stderr,"ERROR: %s\n",(str)) ; exit(1) ; } while(0)
00061 
00062    nopt = 1 ;
00063    while( nopt < argc && argv[nopt][0] == '-' ){
00064 
00065       /*** the following code is stolen from to3d ***/
00066 
00067       /* -type from the anatomy prefixes */
00068 
00069       for( ii=FIRST_ANAT_TYPE ; ii <= LAST_ANAT_TYPE ; ii++ )
00070          if( strncmp( &(argv[nopt][1]) ,
00071                       ANAT_prefixstr[ii] , THD_MAX_PREFIX ) == 0 ) break ;
00072 
00073       if( ii <= LAST_ANAT_TYPE ){
00074          anatomy_type = ii ;
00075          dataset_type = HEAD_ANAT_TYPE ;
00076          nopt++ ; continue ;
00077       }
00078 
00079       /* -type from the function prefixes */
00080 
00081       for( ii=FIRST_FUNC_TYPE ; ii <= LAST_FUNC_TYPE ; ii++ )
00082          if( strncmp( &(argv[nopt][1]) ,
00083                       FUNC_prefixstr[ii] , THD_MAX_PREFIX ) == 0 ) break ;
00084 
00085       if( ii <= LAST_FUNC_TYPE ){
00086          function_type = ii ;
00087          dataset_type  = HEAD_FUNC_TYPE ;
00088          nopt++ ; continue ;
00089       }
00090 
00091       /**** -session dirname ****/
00092 
00093       if( strncmp(argv[nopt],"-session",6) == 0 ){
00094          nopt++ ;
00095          if( nopt >= argc ) DUPERR("need argument after -session!") ;
00096          MCW_strncpy( DUP_session , argv[nopt++] , THD_MAX_NAME ) ;
00097          continue ;
00098       }
00099 
00100       /**** -prefix prefix ****/
00101 
00102       if( strncmp(argv[nopt],"-prefix",6) == 0 ){
00103          nopt++ ;
00104          if( nopt >= argc ) DUPERR("need argument after -prefix!") ;
00105          MCW_strncpy( DUP_prefix , argv[nopt++] , THD_MAX_PREFIX ) ;
00106          continue ;
00107       }
00108 
00109       /**** unknown switch ****/
00110 
00111       fprintf(stderr,"*** unrecognized option %s\n",argv[nopt]) ;
00112       exit(1) ;
00113    }  /* end of loop over options */
00114 
00115    if( nopt >= argc ) DUPERR("no input dataset name given!") ;
00116 
00117    /*** read input dataset ***/
00118 
00119    dset_in = THD_open_one_dataset( argv[nopt] ) ;
00120    if( ! ISVALID_3DIM_DATASET(dset_in) ) DUPERR("cannot read dataset!\n") ;
00121 
00122    /*** copy header info ***/
00123 
00124    dset_out = EDIT_empty_copy( dset_in ) ;
00125    if( !ISVALID_3DIM_DATASET(dset_out) ) DUPERR("duplication fails!\n");
00126 
00127    EDIT_dset_items( dset_out ,
00128                       ADN_prefix         , DUP_prefix ,
00129                       ADN_label1         , DUP_prefix ,   /* label = prefix */
00130                       ADN_directory_name , DUP_session ,
00131                       ADN_self_name      , DUP_prefix ,
00132                     ADN_none ) ;
00133 
00134    tross_Copy_History( dset_in , dset_out ) ;
00135    tross_Make_History( "3ddup" , argc , argv , dset_out ) ;
00136 
00137    /*** change of type? ***/
00138 
00139    if( dataset_type>=FIRST_3DIM_TYPE && dataset_type<=LAST_3DIM_TYPE ){
00140 
00141       int isfunc , new_nvals , old_ntimes ;
00142 
00143       old_ntimes = DSET_NUM_TIMES(dset_in) ;
00144 
00145       isfunc    = ISFUNCTYPE(dataset_type) ;
00146       new_nvals = (isfunc) ? FUNC_nvals[function_type]
00147                            : ANAT_nvals[anatomy_type]  ;
00148 
00149       if( ( isfunc && function_type == FUNC_BUCK_TYPE) ||
00150           (!isfunc && anatomy_type  == ANAT_BUCK_TYPE)   )  /* 30 Nov 1997 */
00151          new_nvals = dset_in->dblk->nvals ;
00152       
00153 
00154       if( new_nvals > dset_in->dblk->nvals ){
00155          fprintf(stderr,
00156                  "ERROR: new dataset type has %d values per voxel,"
00157                  " but old has %d!\n"
00158                  "  ==> cannot make duplicate!\n" ,
00159                  new_nvals , dset_in->dblk->nvals ) ;
00160          exit(1) ;
00161 
00162       } else if( new_nvals < dset_in->dblk->nvals ){
00163          if( old_ntimes == 1 )
00164             fprintf(stderr,
00165                  "WARNING: new dataset type has %d values per voxel,"
00166                  " but old has %d!\n"
00167                  "  ==> new dataset will not access all data in old!\n",
00168                  new_nvals , dset_in->dblk->nvals ) ;
00169          else if( new_nvals > 1){
00170             fprintf(stderr,
00171                  "ERROR: new dataset type has %d values per voxel per time,"
00172                  " but old has %d!\n"
00173                  "  *** this conversion is not legal for time-dependent data!\n",
00174                  new_nvals , DSET_NVALS_PER_TIME(dset_in) ) ;
00175             exit(1) ;
00176          }
00177       }
00178 
00179       EDIT_dset_items( dset_out ,
00180                           ADN_type , dataset_type ,
00181                           ADN_func_type ,
00182                           ISANATTYPE(dataset_type) ? (anatomy_type)
00183                                                    : (function_type) ,
00184                        ADN_none ) ;
00185    }
00186 
00187    warp = myXtNew( THD_warp ) ; *warp = IDENTITY_WARP ;
00188 
00189    EDIT_dset_items( dset_out ,
00190                        ADN_warp        , warp    ,
00191                        ADN_warp_parent , dset_in ,
00192                     ADN_none ) ;
00193 
00194    /*** done! ***/
00195 
00196    THD_write_3dim_dataset( NULL , NULL , dset_out , False ) ;
00197 
00198    exit(0) ;
00199 }

Variable Documentation

int anatomy_type = ILLEGAL_TYPE [static]
 

Definition at line 22 of file 3ddup.c.

Referenced by main().

int dataset_type = ILLEGAL_TYPE [static]
 

Definition at line 24 of file 3ddup.c.

Referenced by main().

char DUP_prefix[THD_MAX_PREFIX] = "dup" [static]
 

Definition at line 20 of file 3ddup.c.

Referenced by main().

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

Definition at line 19 of file 3ddup.c.

Referenced by main().

int function_type = ILLEGAL_TYPE [static]
 

Definition at line 23 of file 3ddup.c.

Referenced by main().

 

Powered by Plone

This site conforms to the following standards: