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  

dsetdup.c

Go to the documentation of this file.
00001 /*****************************************************************************
00002    Major portions of this software are copyrighted by the Medical College
00003    of Wisconsin, 1994-2000, and are released under the Gnu General Public
00004    License, Version 2.  See the file README.Copyright for details.
00005 ******************************************************************************/
00006 
00007 #include "mrilib.h"
00008 
00009 /***** This program makes a "duplicate" of a dataset, which is
00010        nothing more than something that is warped from the parent
00011        with the identity warp.
00012 
00013        Why is this useful?  Because you can then overwrite this
00014        warped-on-demand dataset in AFNI.
00015 
00016        RWCox, June 1995
00017 *****/
00018 
00019 static char DUP_session[THD_MAX_NAME]  = "./" ;
00020 static char DUP_prefix[THD_MAX_PREFIX] = "dup" ;
00021 static char DUP_label[THD_MAX_LABEL]   = "\0" ;
00022 static char DUP_dname[THD_MAX_NAME]    = "\0" ;
00023 
00024 static int anatomy_type  = ILLEGAL_TYPE ;
00025 static int function_type = ILLEGAL_TYPE ;
00026 static int dataset_type  = ILLEGAL_TYPE ;
00027 
00028 THD_3dim_dataset * duplicate_dataset( THD_3dim_dataset * parent ) ;
00029 
00030 int main( int argc , char * argv[] )
00031 {
00032    int nopt , ii ;
00033    THD_3dim_dataset * dset_in , * dset_out ;
00034 
00035    /** check for help **/
00036 
00037    if( argc < 2 || strncmp(argv[1],"-help",3) == 0 ){
00038       printf(
00039        "Usage: dsetdup [options] dataset\n"
00040        " 'Duplicates' a dataset by making a warp-on-demand copy.\n"
00041        " Applications:\n"
00042        "   - allows AFNI to resample a dataset to a new grid without\n"
00043        "       destroying an existing data .BRIK\n"
00044        "   - change a functional dataset to anatomical, or vice-versa\n"
00045        "\n"
00046        "OPTIONS:\n"
00047        "  -type             = convert to the given 'type', which must be\n"
00048        "                       chosen from the same list as in to3d\n"
00049        "  -session dirname  = write output into given directory (default=./)\n"
00050        "  -prefix  pname    = use 'pname' for the output directory prefix\n"
00051        "                       (default=dup)\n"
00052        "  -label   string   = use 'string' for the label in the output\n"
00053        "                       dataset (default = pname)\n"
00054        "  -dname   name     = will make 3D dataset's name = 'name'\n"
00055        "\n"
00056        "N.B.: Even if the new dataset is anatomical, it will not contain\n"
00057        "      any markers, duplicated from the original, or otherwise.\n"
00058      ) ;
00059      exit(0) ;
00060    }
00061 
00062    /** scan command line options **/
00063 
00064 #define DUPERR(str) \
00065    do{ fprintf(stderr,"ERROR: %s\n",(str)) ; exit(1) ; } while(1)
00066 
00067    nopt = 1 ;
00068    while( nopt < argc && argv[nopt][0] == '-' ){
00069 
00070       /*** the following code is borrowed from to3d ***/
00071 
00072       /* -type from the anatomy prefixes */
00073 
00074       for( ii=FIRST_ANAT_TYPE ; ii <= LAST_ANAT_TYPE ; ii++ )
00075          if( strncmp( &(argv[nopt][1]) ,
00076                       ANAT_prefixstr[ii] , THD_MAX_PREFIX ) == 0 ) break ;
00077 
00078       if( ii <= LAST_ANAT_TYPE ){
00079          anatomy_type = ii ;
00080          dataset_type = HEAD_ANAT_TYPE ;
00081          nopt++ ; continue ;
00082       }
00083 
00084       /* -type from the function prefixes */
00085 
00086       for( ii=FIRST_FUNC_TYPE ; ii <= LAST_FUNC_TYPE ; ii++ )
00087          if( strncmp( &(argv[nopt][1]) ,
00088                       FUNC_prefixstr[ii] , THD_MAX_PREFIX ) == 0 ) break ;
00089 
00090       if( ii <= LAST_FUNC_TYPE ){
00091          function_type = ii ;
00092          dataset_type  = HEAD_FUNC_TYPE ;
00093          nopt++ ; continue ;
00094       }
00095 
00096       /**** -session dirname ****/
00097 
00098       if( strncmp(argv[nopt],"-session",6) == 0 ){
00099          nopt++ ;
00100          if( nopt >= argc ) DUPERR("need argument after -session!") ;
00101          MCW_strncpy( DUP_session , argv[nopt++] , THD_MAX_NAME ) ;
00102          continue ;
00103       }
00104 
00105       /**** -prefix prefix ****/
00106 
00107       if( strncmp(argv[nopt],"-prefix",6) == 0 ){
00108          nopt++ ;
00109          if( nopt >= argc ) DUPERR("need argument after -prefix!") ;
00110          MCW_strncpy( DUP_prefix , argv[nopt++] , THD_MAX_PREFIX ) ;
00111          continue ;
00112       }
00113 
00114       /**** -label string ****/
00115 
00116       if( strncmp(argv[nopt],"-label",6) == 0 ){
00117          nopt++ ;
00118          if( nopt >= argc ) DUPERR("need argument after -label!") ;
00119          MCW_strncpy( DUP_label , argv[nopt++] , THD_MAX_LABEL ) ;
00120          continue ;
00121       }
00122 
00123       /**** -dname string ****/
00124 
00125       if( strncmp(argv[nopt],"-dname",6) == 0 ){
00126          nopt++ ;
00127          if( nopt >= argc ) DUPERR("need argument after -dname!") ;
00128          MCW_strncpy( DUP_dname , argv[nopt++] , THD_MAX_NAME ) ;
00129          continue ;
00130       }
00131 
00132       /**** unknown switch ****/
00133 
00134       fprintf(stderr,"*** unrecognized option %s\n",argv[nopt]) ;
00135       exit(1) ;
00136    }  /* end of loop over options */
00137 
00138    if( strlen(DUP_label) == 0 ){
00139       MCW_strncpy(DUP_label,DUP_prefix,THD_MAX_LABEL) ;
00140    }
00141 
00142    if( nopt >= argc ) DUPERR("no dataset name given!") ;
00143 
00144    /*** read input dataset ***/
00145 
00146    dset_in = THD_open_one_dataset( argv[nopt] ) ;
00147    if( ! ISVALID_3DIM_DATASET(dset_in) ) DUPERR("cannot read dataset!\n") ;
00148 
00149    /*** copy header info ***/
00150 
00151    dset_out = duplicate_dataset( dset_in ) ;
00152    if( ! ISVALID_3DIM_DATASET(dset_out) ) DUPERR("cannot make duplicate!\n") ;
00153 
00154    /*** rewrite some strings ***/
00155 
00156    strcpy( dset_out->label1 , DUP_label ) ;
00157    if( strlen(DUP_dname) > 0 ) strcpy( dset_out->self_name , DUP_dname ) ;
00158 
00159    /*** change of type? ***/
00160 
00161    if( dataset_type >= FIRST_3DIM_TYPE && dataset_type <= LAST_3DIM_TYPE ){
00162 
00163       int isfunc , new_nvals ;
00164 
00165       isfunc    = ISFUNCTYPE(dataset_type) ;
00166       new_nvals = (isfunc) ? FUNC_nvals[function_type]
00167                            : ANAT_nvals[anatomy_type]  ;
00168 
00169       if( new_nvals > dset_in->dblk->nvals ){
00170          fprintf(stderr,
00171                  "ERROR: new dataset type has %d values per voxel, but old has %d!\n"
00172                  "       ==> cannot make duplicate!\n" ,
00173                  new_nvals , dset_in->dblk->nvals ) ;
00174          exit(1) ;
00175 
00176       } else if( new_nvals < dset_in->dblk->nvals ){
00177          fprintf(stderr,
00178                  "WARNING: new dataset type has %d values per voxel, but old has %d!\n"
00179                  "         ==> new dataset will not access all data in old!\n",
00180                  new_nvals , dset_in->dblk->nvals ) ;
00181       }
00182 
00183       dset_out->type      = dataset_type ;
00184       dset_out->func_type = ISANAT(dset_out) ? (anatomy_type)
00185                                              : (function_type) ;
00186    }
00187 
00188    /*** done! ***/
00189 
00190    THD_write_3dim_dataset( DUP_session , DUP_prefix , dset_out , False ) ;
00191 
00192    exit(0) ;
00193 }
00194 
00195 /*---------------------------------------------------------------------
00196    Adapted from AFNI_follower_dataset:
00197      Make a warped dataset whose grid corresponds to the parent and
00198      whose warp is just the identity warp.
00199 -----------------------------------------------------------------------*/
00200 
00201 THD_3dim_dataset * duplicate_dataset( THD_3dim_dataset * parent )
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 }
 

Powered by Plone

This site conforms to the following standards: