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  

3dresample.c

Go to the documentation of this file.
00001 #include "mrilib.h"
00002 #include "r_new_resam_dset.h"
00003 #include "r_idisp.h"
00004 
00005 #define MAIN
00006 
00007 #define VERSION "Version 1.8 <August 3, 2005>"
00008 
00009 /*----------------------------------------------------------------------
00010  * 3dresample - create a new dataset by reorienting and resampling
00011  *              an existing one 
00012  *
00013  * This program can be used to 
00014  *    - change the orientation of a dataset to one that is specified
00015  *    - change the dx, dy, dz spacing, to one that is specified
00016  *    - master a dataset, so that its orientation and spacing matches
00017  *
00018  * usage:  3dresample  [options]  -prefix OUTPUT_DSET  -inset INPUT_DSET
00019  *
00020  *    options:
00021  *              -help             : detailed program info
00022  *              -debug LEVEL      : spit out info
00023  *              -version          : print version info
00024  *
00025  *              -dxyz DX DY DZ    : resample to a new grid
00026  *                                      (DX, DY, DZ are real numbers in mm)
00027  *              -orient OR_CODE   : reorient to new orientation code
00028  *                                      (a three character string, each
00029  *                                       from the set {A,P, I,S, L,R})
00030  *
00031  *              -master MAST_DSET : apply orient/dxyz from MAST_DSET
00032  *
00033  *              -rmode RESAM      : one of {"NN", "Li", "Cu", "Bk"}
00034  *
00035  *    examples:
00036  *      3dresample -orient "asl" -rmode NN -prefix asl.dset -inset inset+orig
00037  *      3dresample -dxyz 1.0 1.0 0.9 -prefix 119.dset -inset some.input+tlrc
00038  *      3dresample -master master+orig -prefix new.copy -inset old.copy+orig
00039  *----------------------------------------------------------------------
00040 */
00041 
00042 static char g_history[] =
00043  "----------------------------------------------------------------------\n"
00044  " history:\n"
00045  "\n"
00046  " 1.0  May 23, 2002 - initial release\n"
00047  " 1.1  Jul 02, 2002 - modified to fully align new data set grid to master\n"
00048  " 1.2  Jul 29, 2002\n"
00049  "   - no change here, but updated r_new_resam_dset() for view type\n"
00050  " 1.3  January 14, 2003\n"
00051  "   - clear warp information before writing to disk (fix uncommon problem)\n"
00052  " 1.4  Jul 27, 2003 - wrap unknown printed strings in NULL check\n"
00053  " 1.5  Jan 07, 2004\n"
00054  "   - added suggestion of 3dfractionize to -help output\n"
00055  "   - added '-hist' option\n"
00056  " 1.6  Mar 04, 2004\n"
00057  "   - added check for RESAM_shortstr[] (to catch NN and Bk modes)\n"
00058  "   - reversed order of history: recent at the bottom\n"
00059  " 1.7  Jul 26, 2004 - passed NULL sublist to r_new_resam_dset()\n"
00060  " 1.7a Mar 22, 2005 - removed tabs\n"
00061  " 1.8  Aug 02, 2005 - allow dxyz to override those from master\n"
00062  "----------------------------------------------------------------------\n";
00063 
00064 
00065 /*--- local stuff ------------------------------------------------------*/
00066 
00067 #define USE_LONG        1
00068 #define USE_SHORT       2
00069 #define USE_VERSION     3
00070 #define USE_HISTORY     4
00071 
00072 #define DELTA_MIN        0.1
00073 #define DELTA_MAX       99.9
00074 
00075 #define RL_DEBUG_OFF    0
00076 #define RL_DEBUG_LOW    1
00077 #define RL_DEBUG_HIGH   2
00078 
00079 typedef struct
00080 {
00081     THD_3dim_dataset * dset;
00082     THD_3dim_dataset * mset;
00083     double             dx, dy, dz;
00084     char             * orient;
00085     char             * prefix;
00086     int                resam;
00087     int                debug;
00088 } options_t;
00089 
00090 int disp_opts_data   ( char * info, options_t * opts );
00091 int init_options     ( options_t * opts, int argc, char * argv [] );
00092 int resam_str2mode   ( char * mode );
00093 int sync_master_opts ( options_t * opts );
00094 int usage            ( char * prog, int level );
00095 int write_results    ( THD_3dim_dataset * dout, options_t * opts,
00096                        int argc, char * argv [] );
00097 
00098 /*----------------------------------------------------------------------*/
00099 
00100 int main( int argc , char * argv[] )
00101 {
00102     THD_3dim_dataset * dout;
00103     options_t          opts;
00104     int                ret_val;
00105 
00106     mainENTRY("3dresample"); machdep(); AFNI_logger("3dresample",argc,argv);
00107 
00108     /* validate inputs and init options structure */
00109     if ( (ret_val = init_options(&opts, argc, argv)) != 0 )
00110         return ret_val;
00111 
00112     /* actually resample and/or reorient the dataset */
00113     dout = r_new_resam_dset( opts.dset, opts.mset, opts.dx, opts.dy, opts.dz,
00114                              opts.orient, opts.resam, NULL);
00115     if ( dout == NULL )
00116     {
00117         fprintf( stderr, "failure to resample dataset, exiting...\n" );
00118         return FAIL;
00119     }
00120 
00121     return write_results( dout, &opts, argc, argv );
00122 }
00123 
00124 
00125 /*----------------------------------------------------------------------
00126  * init_options - validate inputs, give help, init options struct
00127  *----------------------------------------------------------------------
00128 */
00129 int init_options ( options_t * opts, int argc, char * argv [] )
00130 {
00131     int ac;
00132 
00133     /* clear out the options structure, and explicitly set pointers */
00134     memset( opts, 0, sizeof(options_t) );
00135     opts->orient = opts->prefix = NULL; /* laziness with proper conversions */
00136     opts->dset   = opts->mset   = NULL;  
00137 
00138     for ( ac = 1; ac < argc; ac++ )
00139     {
00140         if ( ! strncmp(argv[ac], "-help", 5) )
00141         {
00142             usage( argv[0], USE_LONG );
00143             return FAIL;
00144         }
00145         else if ( ! strncmp(argv[ac], "-hist", 5) )
00146         {
00147             usage( argv[0], USE_HISTORY );
00148             return FAIL;
00149         }
00150         else if ( ! strncmp(argv[ac], "-version", 2) )
00151         {
00152             usage( argv[0], USE_VERSION );
00153             return FAIL;
00154         }
00155         else if ( ! strncmp(argv[ac], "-debug", 6) )
00156         {
00157             if ( (ac+1) >= argc )
00158             {
00159                 fputs( "option usage: -debug LEVEL\n", stderr );
00160                 usage( argv[0], USE_SHORT );
00161                 return FAIL;
00162             }
00163 
00164             opts->debug = atoi(argv[++ac]);
00165             if ( opts->debug < 0 || opts->debug > RL_DEBUG_HIGH )
00166             {
00167                 fprintf( stderr, "bad debug level <%d>, should be in [%d,%d]\n",
00168                         opts->debug, RL_DEBUG_OFF, RL_DEBUG_HIGH );
00169                 usage( argv[0], USE_SHORT );
00170                 return FAIL;
00171             }
00172         }
00173         else if ( ! strncmp(argv[ac], "-dxyz", 3) )     /* dxyz */
00174         {
00175             if ( (ac+3) >= argc )
00176             {
00177                 fputs( "option usage: -dxyz DX DY DZ\n", stderr );
00178                 usage( argv[0], USE_SHORT );
00179                 return FAIL;
00180             }
00181 
00182             opts->dx = atof(argv[++ac]);
00183             opts->dy = atof(argv[++ac]);
00184             opts->dz = atof(argv[++ac]);
00185 
00186             if ( (opts->dx < DELTA_MIN || opts->dx > DELTA_MAX) ||
00187                  (opts->dy < DELTA_MIN || opts->dy > DELTA_MAX) ||
00188                  (opts->dz < DELTA_MIN || opts->dz > DELTA_MAX) )
00189             {
00190                 fprintf( stderr, "dxyz must be in [%.1f,%.1f]\n",
00191                          DELTA_MIN, DELTA_MAX );
00192                 return FAIL;
00193             }
00194         }
00195         else if ( ! strncmp(argv[ac], "-or", 3) )       /* orientation */
00196         {
00197             if ( (ac+1) >= argc )
00198             {
00199                 fputs( "option usage: -orient OR_STRING\n", stderr );
00200                 usage( argv[0], USE_SHORT );
00201                 return FAIL;
00202             }
00203 
00204             opts->orient = argv[++ac];
00205         }
00206         else if ( ! strncmp(argv[ac], "-master", 5) )   /* master */
00207         {
00208             if ( (ac+1) >= argc )
00209             {
00210                 fputs( "option usage: -master MAST_DSET\n", stderr );
00211                 usage( argv[0], USE_SHORT );
00212                 return FAIL;
00213             }
00214 
00215             opts->mset = THD_open_dataset( argv[++ac] );
00216             if ( ! ISVALID_DSET(opts->mset) )
00217             {
00218                 fprintf( stderr, "invalid master dataset <%s>\n", argv[ac] );
00219                 return FAIL;
00220             }
00221         }
00222         else if ( ! strncmp(argv[ac], "-zeropad", 5) )  /* zeropad */
00223         {
00224             fputs("warning: '-zeropad' is no longer a valid option\n", stderr);
00225             /* but still move on... */
00226         }
00227         else if ( ! strncmp(argv[ac], "-rmode", 6) )    /* resample mode */
00228         {
00229             if ( (ac+1) >= argc )
00230             {
00231                 fputs( "option usage: -rmode RESAMPLE_MODE\n", stderr );
00232                 usage( argv[0], USE_SHORT );
00233                 return FAIL;
00234             }
00235 
00236             if ( ( (opts->resam = resam_str2mode(argv[++ac]) ) < 0 ) ||
00237                  (  opts->resam > LAST_RESAM_TYPE ) )
00238             {
00239                 fprintf( stderr, "invalid resample mode <%s>\n", argv[ac] );
00240                 return FAIL;
00241             }
00242         }
00243         else if ( ! strncmp(argv[ac], "-prefix", 4) )   /* new dset prefix */
00244         {
00245             if ( (ac+1) >= argc )
00246             {
00247                 fputs( "option usage: -prefix OUTPUT_PREFIX\n", stderr );
00248                 usage( argv[0], USE_SHORT );
00249                 return FAIL;
00250             }
00251 
00252             opts->prefix = argv[++ac];
00253             if ( !THD_filename_ok(opts->prefix) )
00254             {
00255                 fprintf( stderr, "invalid output prefix <%s>\n", opts->prefix );
00256                 return usage( argv[0], USE_SHORT );
00257             }
00258         }
00259         else if ( ! strncmp(argv[ac], "-inset", 3) ||
00260                   ! strncmp(argv[ac], "-input", 6) )    /* input dset */
00261         {
00262             if ( (ac+1) >= argc )
00263             {
00264                 fputs( "option usage: -inset INPUT_DSET\n", stderr );
00265                 usage( argv[0], USE_SHORT );
00266                 return FAIL;
00267             }
00268 
00269             opts->dset = THD_open_dataset( argv[++ac] );
00270             if ( ! ISVALID_DSET(opts->dset) )
00271             {
00272                 fprintf( stderr, "invalid input dataset <%s>\n", argv[ac] );
00273                 return FAIL;
00274             }
00275         }
00276         else     /* invalid option */
00277         {
00278             fprintf( stderr, "invalid option <%s>\n", argv[ac] );
00279             usage( argv[0], USE_SHORT );
00280             return FAIL;
00281         }
00282     }
00283 
00284     if ( !ISVALID_DSET(opts->dset) || (opts->prefix == NULL) )
00285     {
00286         fprintf( stderr, "missing prefix or input dset, exiting...\n" );
00287         usage( argv[0], USE_SHORT );
00288         return FAIL;
00289     }
00290 
00291     if ( opts->debug >= RL_DEBUG_LOW )
00292     {
00293         disp_opts_data( "++ options initialized: ", opts );
00294 
00295         if ( opts->debug >= RL_DEBUG_HIGH )     /* dset is valid by now */
00296         {
00297             r_idisp_thd_3dim_dataset( "inset : ", opts->dset );
00298             r_idisp_thd_dataxes     ( "inset : ", opts->dset->daxes );
00299             r_idisp_thd_datablock   ( "inset : ", opts->dset->dblk  );
00300             if ( opts->dset->dblk )
00301                 r_idisp_thd_diskptr ( "inset : ", opts->dset->dblk->diskptr );
00302         }
00303     }
00304 
00305     if ( sync_master_opts( opts ) )
00306         return FAIL;
00307 
00308     return 0;
00309 }
00310 
00311 #if 0  /* lose new_zeropad_dset */
00312 /*----------------------------------------------------------------------
00313  * new_zeropad_dset - create a new zeropadded dataset
00314  *
00315  * Replace dout with a new padded one.
00316  *
00317  * This function copies the master part of 3dZeropad.c.
00318  *----------------------------------------------------------------------
00319 */
00320 int new_zeropad_dset ( options_t * opts, THD_3dim_dataset ** dout )
00321 {
00322     THD_3dim_dataset * tmp_dset;
00323     THD_dataxes      * max = opts->mset->daxes, * iax = (*dout)->daxes;
00324     int                nerr = 0;
00325     float              mxbot,mybot,mzbot, mxtop,mytop,mztop, mdx,mdy,mdz;
00326     float              ixbot,iybot,izbot, ixtop,iytop,iztop, idx,idy,idz;
00327     int                mnx,mny,mnz, inx,iny,inz;
00328     int                add_xb,add_xt, add_yb,add_yt, add_zb,add_zt;
00329     int                add_I=0, add_S=0, add_A=0, add_P=0, add_L=0, add_R=0;
00330 
00331     /* check if datasets are oriented the same */
00332     if( max->xxorient != iax->xxorient ||
00333         max->yyorient != iax->yyorient ||
00334         max->zzorient != iax->zzorient )
00335     {
00336         fputs("error: orientation mismatch!\n", stderr );
00337         nerr++;
00338     }
00339 
00340     /* check if datasets have same voxel dimensions */
00341     mdx = max->xxdel;  mdy = max->yydel; mdz = max->zzdel;
00342     idx = iax->xxdel;  idy = iax->yydel; idz = iax->zzdel;
00343     mnx = max->nxx;    mny = max->nyy;   mnz = max->nzz;
00344     inx = iax->nxx;    iny = iax->nyy;   inz = iax->nzz;
00345 
00346     if( fabs(mdx-idx) > 0.01*fabs(mdx) ||
00347         fabs(mdy-idy) > 0.01*fabs(mdy) ||
00348         fabs(mdz-idz) > 0.01*fabs(mdz) )
00349     {
00350        fputs("error: voxel size mismatch!\n", stderr);
00351        nerr++;
00352     }
00353 
00354     if ( nerr > 0 )
00355         return FAIL;    /* we have already printed the failure cause(s) */
00356 
00357     /* the data looks okay */
00358 
00359     /* calculate coords at top and bottom of each dataset */
00360     mxbot = max->xxorg; mxtop = mxbot + mnx*mdx;
00361     mybot = max->yyorg; mytop = mybot + mny*mdy;
00362     mzbot = max->zzorg; mztop = mzbot + mnz*mdz;
00363 
00364     ixbot = iax->xxorg; ixtop = ixbot + inx*idx;
00365     iybot = iax->yyorg; iytop = iybot + iny*idy;
00366     izbot = iax->zzorg; iztop = izbot + inz*idz;
00367 
00368     /* calculate amount to add/trim at each face */
00369     add_xb = (int) rint((ixbot-mxbot)/idx);
00370     add_xt = (int) rint((mxtop-ixtop)/idx);
00371     add_yb = (int) rint((iybot-mybot)/idy);
00372     add_yt = (int) rint((mytop-iytop)/idy);
00373     add_zb = (int) rint((izbot-mzbot)/idz);
00374     add_zt = (int) rint((mztop-iztop)/idz);
00375 
00376     /* map trims from x,y,z to RL,AP,IS coords */
00377 
00378     switch( iax->xxorient ){
00379         case ORI_R2L_TYPE: add_R = add_xb; add_L = add_xt; break;
00380         case ORI_L2R_TYPE: add_L = add_xb; add_R = add_xt; break;
00381         case ORI_I2S_TYPE: add_I = add_xb; add_S = add_xt; break;
00382         case ORI_S2I_TYPE: add_S = add_xb; add_I = add_xt; break;
00383         case ORI_A2P_TYPE: add_A = add_xb; add_P = add_xt; break;
00384         case ORI_P2A_TYPE: add_P = add_xb; add_A = add_xt; break;
00385         default          : fputs("bad xxorient!\n", stderr); return FAIL;
00386     }
00387 
00388     switch( iax->yyorient ){
00389         case ORI_R2L_TYPE: add_R = add_yb; add_L = add_yt; break;
00390         case ORI_L2R_TYPE: add_L = add_yb; add_R = add_yt; break;
00391         case ORI_I2S_TYPE: add_I = add_yb; add_S = add_yt; break;
00392         case ORI_S2I_TYPE: add_S = add_yb; add_I = add_yt; break;
00393         case ORI_A2P_TYPE: add_A = add_yb; add_P = add_yt; break;
00394         case ORI_P2A_TYPE: add_P = add_yb; add_A = add_yt; break;
00395         default          : fputs("bad yyorient!\n", stderr); return FAIL;
00396     }
00397 
00398     switch( iax->zzorient ){
00399         case ORI_R2L_TYPE: add_R = add_zb; add_L = add_zt; break;
00400         case ORI_L2R_TYPE: add_L = add_zb; add_R = add_zt; break;
00401         case ORI_I2S_TYPE: add_I = add_zb; add_S = add_zt; break;
00402         case ORI_S2I_TYPE: add_S = add_zb; add_I = add_zt; break;
00403         case ORI_A2P_TYPE: add_A = add_zb; add_P = add_zt; break;
00404         case ORI_P2A_TYPE: add_P = add_zb; add_A = add_zt; break;
00405         default          : fputs("bad zzorient!\n", stderr); return FAIL;
00406     }
00407 
00408     if ( opts->debug >= RL_DEBUG_LOW )
00409     {
00410         printf( "++ zeropad: (I,S,A,P,L,R) = (%d,%d,%d,%d,%d,%d)\n",
00411                 add_I, add_S, add_A, add_P, add_L, add_R );
00412     }
00413 
00414     /* pad if we need to */
00415     if ( add_I || add_S || add_A || add_P || add_L || add_R )
00416     {
00417         tmp_dset = THD_zeropad( *dout,
00418                                 add_I, add_S, add_A, add_P, add_L, add_R,
00419                                 opts->prefix, ZPAD_PURGE );
00420 
00421         if ( !ISVALID_DSET( tmp_dset ) )
00422         {
00423             fputs( "THD_zeropad failed!\n", stderr );
00424             return FAIL;
00425         }
00426 
00427         DSET_delete( *dout );
00428         *dout = tmp_dset;
00429     }
00430 
00431     return 0;
00432 }
00433 #endif   /* end chop of new_zeropad_dset() */
00434 
00435 /*----------------------------------------------------------------------*/
00436 int usage ( char * prog, int level )
00437 {
00438     if ( level == USE_SHORT )
00439     {
00440         fprintf( stderr,
00441                  "usage: %s [options] -prefix OUT_DSET -inset IN_DSET\n"
00442                  "usage: %s -help\n",
00443                  prog, prog );
00444         return 0;
00445     }
00446     else if ( level == USE_LONG )
00447     {
00448         printf(
00449             "\n"
00450             "%s - reorient and/or resample a dataset\n"
00451             "\n"
00452             "    This program can be used to change the orientation of a\n"
00453             "    dataset (via the -orient option), or the dx,dy,dz\n"
00454             "    grid spacing (via the -dxyz option), or change them\n"
00455             "    both to match that of a master dataset (via the -master\n"
00456             "    option).\n"
00457             "\n"
00458             "    Note: if both -master and -dxyz are used, the dxyz values\n"
00459             "          will override those from the master dataset.\n"
00460             "\n"
00461             " ** Warning: this program is not meant to transform datasets\n"
00462             "             between view types (such as '+orig' and '+tlrc').\n"
00463             "\n"
00464             "             For that purpose, please see '3dfractionize -help'.\n"
00465             "\n"
00466             "------------------------------------------------------------\n"
00467             "\n"
00468             "  usage: %s [options] -prefix OUT_DSET -inset IN_DSET\n"
00469             "\n"
00470             "  examples:\n"
00471             "\n"
00472             "    %s -orient asl -rmode NN -prefix asl.dset -inset in+orig\n"
00473             "    %s -dxyz 1.0 1.0 0.9 -prefix 119.dset -inset in+tlrc\n"
00474             "    %s -master master+orig -prefix new.dset -inset old+orig\n"
00475             "\n"
00476             "  note:\n"
00477             "\n"
00478             "    Information about a dataset's voxel size and orientation\n"
00479             "    can be found in the output of program 3dinfo\n"
00480             "\n"
00481             "------------------------------------------------------------\n"
00482             "\n"
00483             "  options: \n"
00484             "\n"
00485             "    -help            : show this help information\n"
00486             "\n"
00487             "    -hist            : output the history of program changes\n"
00488             "\n"
00489             "    -debug LEVEL     : print debug info along the way\n"
00490             "          e.g.  -debug 1\n"
00491             "          default level is 0, max is 2\n"
00492             "\n"
00493             "    -version         : show version information\n"
00494             "\n"
00495             "    -dxyz DX DY DZ   : resample to new dx, dy and dz\n"
00496             "          e.g.  -dxyz 1.0 1.0 0.9\n"
00497             "          default is to leave unchanged\n"
00498             "\n"
00499             "          Each of DX,DY,DZ must be a positive real number,\n"
00500             "          and will be used for a voxel delta in the new\n"
00501             "          dataset (according to any new orientation).\n"
00502             "\n"
00503             "    -orient OR_CODE  : reorient to new axis order.\n"
00504             "          e.g.  -orient asl\n"
00505             "          default is to leave unchanged\n"
00506             "\n"
00507             "          The orientation code is a 3 character string,\n"
00508             "          where the characters come from the respective\n"
00509             "          sets {A,P}, {I,S}, {L,R}.\n"
00510             "\n"
00511             "          For example OR_CODE = LPI is the standard\n"
00512             "          'neuroscience' orientation, where the x-axis is\n"
00513             "          Left-to-Right, the y-axis is Posterior-to-Anterior,\n"
00514             "          and the z-axis is Inferior-to-Superior.\n"
00515             "\n"
00516             "    -rmode RESAM     : use this resampling method\n"
00517             "          e.g.  -rmode Linear\n"
00518             "          default is NN (nearest neighbor)\n"
00519             "\n"
00520             "          The resampling method string RESAM should come\n"
00521             "          from the set {'NN', 'Li', 'Cu', 'Bk'}.  These\n"
00522             "          are for 'Nearest Neighbor', 'Linear', 'Cubic'\n"
00523             "          and 'Blocky' interpolation, respectively.\n"
00524             "          See 'Anat resam mode' under the 'Define Markers'\n"
00525             "          window in afni.\n"
00526             "\n"
00527             "    -master MAST_DSET: align dataset grid to that of MAST_DSET\n"
00528             "          e.g.  -master master.dset+orig\n"
00529             "\n"
00530             "          Get dxyz and orient from a master dataset.  The\n"
00531             "          resulting grid will match that of the master.  This\n"
00532             "          option can be used with -dxyz, but not with -orient.\n"
00533             "\n"
00534             "    -prefix OUT_DSET : required prefix for output dataset\n"
00535             "          e.g.  -prefix reori.asl.pickle\n"
00536             "\n"
00537             "    -inset IN_DSET   : required input dataset to reorient\n"
00538             "          e.g.  -inset old.dset+orig\n"
00539             "\n"
00540             "------------------------------------------------------------\n"
00541             "\n"
00542             "  Author: R. Reynolds - %s\n"
00543             "\n",
00544             prog, prog, prog, prog, prog, VERSION );
00545 
00546         return 0;
00547     }
00548     else if ( level == USE_HISTORY )
00549     {
00550         fputs( g_history, stdout );
00551         return 0;
00552     }
00553     else if ( level == USE_VERSION )
00554     {
00555         printf( "%s %s, compile date: %s\n", prog, VERSION, __DATE__ );
00556         return 0;
00557     }
00558 
00559     fprintf( stderr, "usage called with illegal level <%d>\n", level );
00560 
00561     return FAIL;
00562 }
00563 
00564 /*----------------------------------------------------------------------*/
00565 int resam_str2mode ( char * modestr )
00566 {
00567     int mode;
00568 
00569     for (mode = FIRST_RESAM_TYPE; mode <= LAST_RESAM_TYPE; mode++ )
00570     {
00571         if ( ! strncmp( modestr, RESAM_typestr[mode], 2 ) )
00572             return mode;
00573         else if ( ! strncmp( modestr, RESAM_shortstr[mode], 2 ) )
00574             return mode;
00575     }
00576 
00577     return FAIL;
00578 }
00579 
00580 
00581 /*----------------------------------------------------------------------*/
00582 int write_results ( THD_3dim_dataset * dout, options_t * opts,
00583                     int argc, char * argv [] )
00584 {
00585     /* set filename */
00586     EDIT_dset_items( dout, ADN_prefix, opts->prefix, ADN_none );
00587 
00588     if ( THD_is_file(DSET_HEADNAME(dout)) )
00589     {
00590         fprintf( stderr, "error: cannot overwrite existing dataset <%s>\n",
00591                  DSET_HEADNAME(dout) );
00592         return FAIL;
00593     }
00594 
00595     /* set number of time-axis slices to 0 */
00596     if( DSET_NUM_TTOFF(dout) > 0 )
00597         EDIT_dset_items( dout, ADN_nsl, 0, ADN_none );
00598 
00599     /* since we are writing data to disk, clear warp info */
00600     ZERO_IDCODE( dout->warp_parent_idcode );
00601     dout->warp_parent_name[0] = '\0';
00602     dout->warp = NULL;
00603 
00604     /* add to old history */
00605     tross_Copy_History( opts->dset , dout );
00606     tross_Make_History( "3dresample", argc, argv, dout );
00607 
00608     /* write the output files */
00609     if ( DSET_write( dout ) != True )
00610     {
00611         fputs( "failure: cannot write dataset, exiting...\n", stderr );
00612         return FAIL;
00613     }
00614 
00615     if ( opts->debug >= RL_DEBUG_LOW )
00616     {
00617         printf( "dset <%s> has been written to disk\n", opts->prefix );
00618 
00619         if ( opts->debug >= RL_DEBUG_HIGH )
00620         {
00621             r_idisp_thd_3dim_dataset( "final dset  : ", dout );
00622             r_idisp_thd_dataxes     ( "final daxes : ", dout->daxes );
00623             r_idisp_thd_datablock   ( "final dblk  : ", dout->dblk  );
00624             if ( dout->dblk )
00625                 r_idisp_thd_diskptr ( "final diskp : ", dout->dblk->diskptr );
00626         }
00627     }
00628 
00629     return 0;
00630 }
00631 
00632 
00633 /*----------------------------------------------------------------------*/
00634 int sync_master_opts ( options_t * opts )
00635 {
00636     THD_dataxes * dax;
00637 
00638     if ( !opts->mset )
00639         return 0;       /* OK */
00640 
00641     if ( ! ISVALID_DSET(opts->mset) ||
00642          ! ISVALID_DATAXES(opts->mset->daxes ) )
00643     {
00644         fputs( "error: master dset or daxes not valid, exiting...\n", stderr );
00645         return FAIL;                    /* non-NULL but invalid is bad */
00646     }
00647 
00648     /* allow dxyz override of master data           03 Aug 2005 [rickr] */
00649     if ( opts->orient != NULL )
00650     {
00651         fputs( "error: -orient is not valid with -master option, exiting...\n",
00652                 stderr );
00653         return FAIL;
00654     }
00655 
00656     /* all is okay, so fill dxyz and orientation code from master */
00657     dax = opts->mset->daxes;
00658 
00659     if ( opts->debug >= RL_DEBUG_LOW )
00660     {
00661         if (opts->dx == 0.0) fprintf(stderr,"-d using dxyz from master\n");
00662         else                 fprintf(stderr,"-d overriding dxyz from master\n");
00663     }
00664 
00665     if ( opts->dx == 0.0 ) /* then get the values from the master */
00666     {
00667         opts->dx = fabs(dax->xxdel);
00668         opts->dy = fabs(dax->yydel);
00669         opts->dz = fabs(dax->zzdel);
00670     }
00671 
00672     if ( opts->debug >= RL_DEBUG_LOW )
00673     {
00674         if (!opts->orient) fprintf(stderr,"-d using orient from master\n");
00675         else               fprintf(stderr,"-d overriding orient from master\n");
00676     }
00677 
00678     if ( opts->orient == NULL ) /* then get values from the master */
00679     {
00680         /* make space for orient string */
00681         if ( (opts->orient = (char *)malloc(4 * sizeof(char)) ) == NULL )
00682         {
00683             fputs( "failure: malloc failure for orient, exiting...\n", stderr );
00684             return FAIL;
00685         }
00686 
00687         opts->orient[0] = ORIENT_typestr[dax->xxorient][0];
00688         opts->orient[1] = ORIENT_typestr[dax->yyorient][0];
00689         opts->orient[2] = ORIENT_typestr[dax->zzorient][0];
00690         opts->orient[3] = '\0';
00691     }
00692 
00693     if ( opts->debug >= RL_DEBUG_LOW )
00694     {
00695         disp_opts_data( "++ mastered options : ", opts );
00696 
00697         if ( opts->debug >= RL_DEBUG_HIGH )
00698         {
00699             r_idisp_thd_3dim_dataset("sync mset : ", opts->mset );
00700             r_idisp_thd_dataxes     ("sync mset : ", opts->mset->daxes );
00701             r_idisp_thd_datablock   ("sync mset : ", opts->mset->dblk  );
00702             if ( opts->mset->dblk )
00703                 r_idisp_thd_diskptr ("sync mset : ", opts->mset->dblk->diskptr);
00704         }
00705     }
00706 
00707     return 0;
00708 }
00709 
00710 /*----------------------------------------------------------------------*/
00711 int disp_opts_data ( char * info, options_t * opts )
00712 {
00713     if ( info )
00714         fputs( info, stdout );
00715 
00716     if ( opts == NULL )
00717     {
00718         printf( "disp_opts_data: opts == NULL\n" );
00719         return FAIL;
00720     }
00721 
00722     printf( "options struct at %p :\n"
00723             "    dset        = %p (%s)\n"
00724             "    mset        = %p (%s)\n"
00725             "    (dx,dy,dz)  = (%6.3f, %6.3f, %6.3f)\n"
00726             "    orient      = %.6s\n"
00727             "    prefix      = %.60s\n"
00728             "    resam       = %d\n"
00729             "    debug       = %d\n",
00730             opts,
00731             opts->dset, ISVALID_DSET(opts->dset) ? "valid" : "invalid",
00732             opts->mset, ISVALID_DSET(opts->mset) ? "valid" : "invalid",
00733             opts->dx, opts->dy, opts->dz,
00734             CHECK_NULL_STR(opts->orient), CHECK_NULL_STR(opts->prefix),
00735             opts->resam, opts->debug );
00736 
00737     return 0;
00738 }
00739 
 

Powered by Plone

This site conforms to the following standards: