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  

r_new_resam_dset.c File Reference

#include "mrilib.h"
#include "r_misc.h"
#include "r_new_resam_dset.h"

Go to the source code of this file.


Defines

#define LR_RESAM_IN_FAIL   -1
#define LR_RESAM_IN_NONE   0
#define LR_RESAM_IN_REORIENT   1
#define LR_RESAM_IN_RESAM   2

Functions

int apply_dataxes (THD_3dim_dataset *dset, THD_dataxes *dax)
int apply_orientation (THD_3dim_dataset *dset, FD_brick *fdb, char orient[])
int valid_resam_inputs (THD_3dim_dataset *, THD_3dim_dataset *, double, double, double, char[], int)
THD_3dim_datasetr_new_resam_dset (THD_3dim_dataset *din, THD_3dim_dataset *min, double dx, double dy, double dz, char orient[], int resam, int *sublist)
int r_fill_resampled_data_brick (THD_3dim_dataset *dset, int resam)
int r_dxyz_mod_dataxes (double dx, double dy, double dz, THD_dataxes *daxin, THD_dataxes *daxout)
Boolean r_is_valid_orient_str (char ostr[])
int r_orient_str2vec (char ostr[], THD_ivec3 *ovec)

Variables

char * this_file = "r_new_resam_dset.c"

Define Documentation

#define LR_RESAM_IN_FAIL   -1
 

Definition at line 45 of file r_new_resam_dset.c.

Referenced by r_new_resam_dset(), and valid_resam_inputs().

#define LR_RESAM_IN_NONE   0
 

Definition at line 46 of file r_new_resam_dset.c.

Referenced by valid_resam_inputs().

#define LR_RESAM_IN_REORIENT   1
 

Definition at line 47 of file r_new_resam_dset.c.

Referenced by r_new_resam_dset(), and valid_resam_inputs().

#define LR_RESAM_IN_RESAM   2
 

Definition at line 48 of file r_new_resam_dset.c.

Referenced by r_new_resam_dset(), and valid_resam_inputs().


Function Documentation

int apply_dataxes THD_3dim_dataset   dset,
THD_dataxes   dax
[static]
 

Definition at line 597 of file r_new_resam_dset.c.

References ADN_none, ADN_nxyz, ADN_xyzdel, ADN_xyzorg, THD_3dim_dataset::daxes, EDIT_dset_items(), LOAD_FVEC3, LOAD_IVEC3, THD_dataxes::nxx, THD_dataxes::nyy, THD_dataxes::nzz, THD_3dim_dataset::wod_daxes, THD_dataxes::xxdel, THD_dataxes::xxorg, THD_dataxes::yydel, THD_dataxes::yyorg, THD_dataxes::zzdel, and THD_dataxes::zzorg.

Referenced by r_new_resam_dset().

00598 {
00599     THD_ivec3     ivnxyz;
00600     THD_fvec3     fvdel, fvorg;
00601 
00602     LOAD_IVEC3( ivnxyz, dax->nxx, dax->nyy, dax->nzz );
00603     LOAD_FVEC3( fvorg, dax->xxorg, dax->yyorg, dax->zzorg );
00604     LOAD_FVEC3( fvdel, dax->xxdel, dax->yydel, dax->zzdel );
00605 
00606     EDIT_dset_items( dset,
00607                         ADN_nxyz,   ivnxyz,
00608                         ADN_xyzdel, fvdel,
00609                         ADN_xyzorg, fvorg,
00610                      ADN_none );
00611 
00612     /* prepare the dataset for warping */
00613     *dset->wod_daxes         = *dax;            /* used for actual warp  */
00614     *dset->daxes             = *dax;
00615 
00616     return 0;
00617 }

int apply_orientation THD_3dim_dataset   dset,
FD_brick   fdb,
char    orient[]
[static]
 

Definition at line 547 of file r_new_resam_dset.c.

References FD_brick::a123, a2, abs, ADN_none, ADN_nxyz, ADN_xyzdel, ADN_xyzorg, ADN_xyzorient, THD_3dim_dataset::daxes, FD_brick::del1, FD_brick::del2, FD_brick::del3, EDIT_dset_items(), THD_ivec3::ijk, LOAD_FVEC3, LOAD_IVEC3, FD_brick::n1, FD_brick::n2, FD_brick::n3, r_orient_str2vec(), THD_dataxes::xxdel, THD_dataxes::xxorg, THD_dataxes::yydel, THD_dataxes::yyorg, THD_dataxes::zzdel, and THD_dataxes::zzorg.

Referenced by r_new_resam_dset().

00549 {
00550     THD_dataxes * daxp = dset->daxes;
00551     THD_ivec3     ivnxyz, ivorient;
00552     THD_fvec3     fvdel, fvorg;
00553     float         org4[4], del4[4];
00554     int           aa1, aa2, aa3;
00555     int           a1, a2, a3;
00556     int           ret_val;
00557 
00558     LOAD_IVEC3(ivnxyz, fdb->n1, fdb->n2, fdb->n3);
00559 
00560     if ( (ret_val = r_orient_str2vec(orient, &ivorient)) != 0 )
00561         return ret_val;
00562 
00563     LOAD_FVEC3( fvdel,
00564         ORIENT_sign[ivorient.ijk[0]]=='+' ? fdb->del1 : -fdb->del1,
00565         ORIENT_sign[ivorient.ijk[1]]=='+' ? fdb->del2 : -fdb->del2,
00566         ORIENT_sign[ivorient.ijk[2]]=='+' ? fdb->del3 : -fdb->del3 );
00567 
00568     /* use original org and delta with permuted index to get new orgs */
00569     org4[1] = daxp->xxorg;  org4[2] = daxp->yyorg;  org4[3] = daxp->zzorg;
00570     del4[1] = daxp->xxdel;  del4[2] = daxp->yydel;  del4[3] = daxp->zzdel;
00571 
00572     a1  = fdb->a123.ijk[0];  a2 = fdb->a123.ijk[1];  a3 = fdb->a123.ijk[2];
00573     aa1 = abs(a1);          aa2 = abs(a2);          aa3 = abs(a3);
00574 
00575     LOAD_FVEC3( fvorg,
00576                 (a1 > 0) ? org4[aa1] : org4[aa1]+(fdb->n1-1)*del4[aa1],
00577                 (a2 > 0) ? org4[aa2] : org4[aa2]+(fdb->n2-1)*del4[aa2],
00578                 (a3 > 0) ? org4[aa3] : org4[aa3]+(fdb->n3-1)*del4[aa3] );
00579 
00580     /* now update the current brick with our new orientation data */
00581     EDIT_dset_items( dset,
00582                         ADN_nxyz,      ivnxyz,
00583                         ADN_xyzdel,    fvdel,
00584                         ADN_xyzorg,    fvorg,
00585                         ADN_xyzorient, ivorient,
00586                      ADN_none );
00587     return 0;
00588 }

int r_dxyz_mod_dataxes double    dx,
double    dy,
double    dz,
THD_dataxes   daxin,
THD_dataxes   daxout
 

Definition at line 298 of file r_new_resam_dset.c.

References ISVALID_DATAXES, THD_dataxes::nxx, THD_dataxes::nyy, THD_dataxes::nzz, THD_dataxes::xxdel, THD_dataxes::xxmax, THD_dataxes::xxmin, THD_dataxes::xxorg, THD_dataxes::yydel, THD_dataxes::yymax, THD_dataxes::yymin, THD_dataxes::yyorg, THD_dataxes::zzdel, THD_dataxes::zzmax, THD_dataxes::zzmin, and THD_dataxes::zzorg.

Referenced by r_new_resam_dset().

00301 {
00302     double    rex, rey, rez;
00303     double    lxx, lyy, lzz;
00304     int       ret_val;
00305 
00306     if ( ! ISVALID_DATAXES( daxin ) || ! ISVALID_DATAXES( daxout ) )
00307         return -1;
00308 
00309     *daxout = *daxin;    /* start with a copy */
00310 
00311     if ( dx <= 0.0 || dy <= 0.0 || dz <= 0.0 )
00312         return -1;       /* having duplicated the structures */
00313 
00314     rex = (daxout->xxdel > 0) ? dx : -dx;   /* signed voxel sizes */
00315     rey = (daxout->yydel > 0) ? dy : -dy;
00316     rez = (daxout->zzdel > 0) ? dz : -dz;
00317 
00318     lxx = daxin->nxx * daxin->xxdel;          /* signed lengths of data box */
00319     lyy = daxin->nyy * daxin->yydel;
00320     lzz = daxin->nzz * daxin->zzdel;
00321 
00322     daxout->nxx = (int)( lxx/rex + 0.499 );     /* so this is > 0 */
00323     daxout->nyy = (int)( lyy/rey + 0.499 );
00324     daxout->nzz = (int)( lzz/rez + 0.499 );
00325 
00326     /* go from old edge to old center, then back out to new edge */
00327     daxout->xxorg = daxin->xxorg + 0.5*(lxx - daxin->xxdel)
00328                                  - 0.5*(daxout->nxx - 1)*rex;
00329 
00330     daxout->yyorg = daxin->yyorg + 0.5*(lyy - daxin->yydel)
00331                                  - 0.5*(daxout->nyy - 1)*rey;
00332 
00333     daxout->zzorg = daxin->zzorg + 0.5*(lzz - daxin->zzdel)
00334                                  - 0.5*(daxout->nzz - 1)*rez;
00335 
00336     /* dave new dimensions */
00337     daxout->xxdel = rex;
00338     daxout->yydel = rey;
00339     daxout->zzdel = rez;
00340 
00341     /* create a new bounding box                        */
00342     /* (note that xxdel<0 implies we must swap min/max) */
00343     daxout->xxmin = daxout->xxorg;
00344     daxout->xxmax = daxout->xxorg + (daxout->nxx-1)*daxout->xxdel;
00345     if ( daxout->xxmin > daxout->xxmax )
00346     {
00347         double tmp    = daxout->xxmin;
00348         daxout->xxmin = daxout->xxmax;
00349         daxout->xxmax = tmp;
00350     }
00351 
00352     daxout->yymin = daxout->yyorg;
00353     daxout->yymax = daxout->yyorg + (daxout->nyy-1)*daxout->yydel;
00354     if ( daxout->yymin > daxout->yymax )
00355     {
00356         double tmp    = daxout->yymin;
00357         daxout->yymin = daxout->yymax;
00358         daxout->yymax = tmp;
00359     }
00360 
00361     daxout->zzmin = daxout->zzorg;
00362     daxout->zzmax = daxout->zzorg + (daxout->nzz-1)*daxout->zzdel;
00363     if ( daxout->zzmin > daxout->zzmax )
00364     {
00365         double tmp    = daxout->zzmin;
00366         daxout->zzmin = daxout->zzmax;
00367         daxout->zzmax = tmp;
00368     }
00369 
00370 #ifdef EXTEND_BBOX
00371     daxout->xxmin -= 0.5 * daxout->xxdel;
00372     daxout->xxmax += 0.5 * daxout->xxdel;
00373     daxout->yymin -= 0.5 * daxout->yydel;
00374     daxout->yymax += 0.5 * daxout->yydel;
00375     daxout->zzmin -= 0.5 * daxout->zzdel;
00376     daxout->zzmax += 0.5 * daxout->zzdel;
00377 #endif
00378 
00379     return ret_val = 0;
00380 }

int r_fill_resampled_data_brick THD_3dim_dataset   dset,
int    resam
 

Definition at line 205 of file r_new_resam_dset.c.

References ADDTO_KILL, AFNI_dataset_slice(), THD_diskptr::byte_order, DATABLOCK_MEM_MALLOC, THD_3dim_dataset::daxes, THD_3dim_dataset::dblk, DBLK_BRICK_FACTOR, THD_datablock::diskptr, dptr, DSET_BRICK_TYPE, DSET_LOADED, DSET_lock, EDIT_substitute_brick(), FAIL, free, IDENTITY_WARP, THD_3dim_dataset::kl, malloc, THD_datablock::malloc_type, mri_data_pointer(), mri_datum_size(), mri_free(), mri_short_order(), myXtNew, THD_diskptr::nvals, THD_dataxes::nxx, THD_dataxes::nyy, nz, THD_dataxes::nzz, STORAGE_BY_BRICK, THD_diskptr::storage_mode, THD_load_statistics(), this_file, THD_3dim_dataset::warp, and THD_3dim_dataset::wod_flag.

Referenced by r_new_resam_dset().

00206 {
00207     THD_diskptr * diskptr = dset->dblk->diskptr;
00208     MRI_IMAGE   * im;
00209     char        * newdata, * dptr;
00210     float         bfac;
00211     int           ival, dsize;
00212     int           nx, ny, nz, nxy, nxyz, nv;
00213     int           slice;
00214 
00215     if ( DSET_LOADED(dset) )
00216     {
00217         fprintf( stderr, "error <%s>: trying to fill pre-loaded dataset\n",
00218                  this_file );
00219         return FAIL;
00220     }
00221 
00222     DSET_lock(dset);          /* since it will just sit in memory for now */
00223 
00224     /* a basic warp is needed if header is written out - PLUTO_add_dset() */
00225     dset->warp  = myXtNew( THD_warp );
00226     *dset->warp = IDENTITY_WARP;
00227     ADDTO_KILL( dset->kl, dset->warp );
00228 
00229     diskptr->byte_order   = mri_short_order();
00230     diskptr->storage_mode = STORAGE_BY_BRICK;
00231 
00232     /* note new dimensions */
00233     nx = dset->daxes->nxx;  ny = dset->daxes->nyy;  nz = dset->daxes->nzz;
00234     nv = diskptr->nvals;
00235 
00236     nxy  = nx * ny;
00237     nxyz = nx * ny * nz;
00238 
00239     /* recompute sub-bricks */
00240     for ( ival = 0; ival < nv; ival++ )            /* for each sub-brick */
00241     {
00242         /* first create memory to deposit the slices into */
00243         dsize = mri_datum_size( DSET_BRICK_TYPE(dset, ival) );
00244 
00245         if ( (newdata = (char *)malloc( nxyz * dsize )) == NULL )
00246         {
00247             fprintf( stderr, "r frdb: alloc failure: %d bytes!\n",
00248                      nxyz * dsize );
00249             return FAIL;
00250         }
00251 
00252         dptr = newdata;                   /* we will copy images at dptr */
00253 
00254         /* force return of unscaled slices for output - reset fac at end */
00255         bfac = DBLK_BRICK_FACTOR(dset->dblk,ival);
00256         DBLK_BRICK_FACTOR(dset->dblk,ival) = 0.0;
00257 
00258         /* for each slice, insert it into memory */
00259         for ( slice = 0; slice < nz; slice++)
00260         {
00261             im = AFNI_dataset_slice( dset, 3, slice, ival, resam );
00262             if ( im == NULL )
00263             {
00264                 fprintf( stderr, "r_fill_resampled_data_brick: failure to "
00265                          "compute dataset slice %d\n", slice );
00266                 free( newdata );
00267                 return FAIL;
00268             }
00269 
00270             memcpy( (void *)dptr, mri_data_pointer(im), nxy*dsize );
00271             mri_free( im );
00272             dptr += nxy*dsize;
00273         }
00274 
00275         DBLK_BRICK_FACTOR(dset->dblk,ival) = bfac;
00276         /* we now have the raw brick data, so insert it into the brick */
00277         EDIT_substitute_brick(dset, ival, DSET_BRICK_TYPE(dset,ival),
00278                               (void *)newdata);
00279     }
00280 
00281     dset->dblk->malloc_type = DATABLOCK_MEM_MALLOC;
00282     dset->wod_flag = False;             /* since data is now in memory */
00283 
00284     /* recompute statistics */
00285     THD_load_statistics( dset );
00286 
00287     return 0;   /* OK */
00288 }

Boolean r_is_valid_orient_str char    ostr[]
 

Definition at line 389 of file r_new_resam_dset.c.

References OR3OK, and ORCODE.

Referenced by valid_resam_inputs().

00390 {
00391     int o1, o2, o3;
00392 
00393     if ( ostr == NULL )
00394         return False;
00395 
00396     o1 = ORCODE(toupper(ostr[0]));
00397     o2 = ORCODE(toupper(ostr[1]));
00398     o3 = ORCODE(toupper(ostr[2]));
00399 
00400     if ( ( o1 != ILLEGAL_TYPE ) &&
00401          ( o2 != ILLEGAL_TYPE ) &&
00402          ( o3 != ILLEGAL_TYPE ) &&
00403            OR3OK(o1,o2,o3) )
00404         return True;
00405     else
00406         return False;
00407 }

THD_3dim_dataset* r_new_resam_dset THD_3dim_dataset   din,
THD_3dim_dataset   min,
double    dx,
double    dy,
double    dz,
char    orient[],
int    resam,
int *    sublist
 

Definition at line 74 of file r_new_resam_dset.c.

References ADN_none, ADN_prefix, apply_dataxes(), apply_orientation(), DATAXES_TYPE, THD_3dim_dataset::daxes, THD_3dim_dataset::dblk, THD_datablock::diskptr, DSET_delete, EDIT_dset_items(), EDIT_empty_copy(), THD_3dim_dataset::idcode, ISVALID_3DIM_DATASET, LR_RESAM_IN_FAIL, LR_RESAM_IN_REORIENT, LR_RESAM_IN_RESAM, THD_dataxes::parent, r_dxyz_mod_dataxes(), r_fill_resampled_data_brick(), THD_copy_dset_subs(), THD_delete_3dim_dataset(), THD_init_diskptr_names(), THD_oriented_brick(), this_file, THD_dataxes::type, THD_warp::type, valid_resam_inputs(), THD_3dim_dataset::view_type, THD_3dim_dataset::vox_warp, THD_3dim_dataset::warp_parent, THD_3dim_dataset::warp_parent_idcode, THD_3dim_dataset::wod_daxes, and THD_3dim_dataset::wod_flag.

Referenced by main(), RCREND_reload_dataset(), and RCREND_reload_func_dset().

00084 {
00085     THD_3dim_dataset * dout;
00086     THD_3dim_dataset * dtmp;
00087     THD_dataxes        new_daxes;
00088     FD_brick         * fdb = NULL;
00089     int                work;
00090     char             * l_orient, l_orient_s[4] = "";
00091 
00092     /* if we have a master, do not rely on orient - use local memory */
00093     if ( min ) l_orient = l_orient_s;
00094     else       l_orient = orient;
00095 
00096     work = valid_resam_inputs( din, min, dx, dy, dz, l_orient, resam );
00097 
00098     if ( work == LR_RESAM_IN_FAIL )
00099         return NULL;
00100 
00101     if ( sublist )
00102         dtmp = THD_copy_dset_subs(din, sublist);
00103     else
00104         dtmp = din;
00105 
00106     dout = EDIT_empty_copy( dtmp );             /* create new brick */
00107     if( ! ISVALID_3DIM_DATASET( dout ) )
00108     {
00109         fprintf( stderr, "ERROR: <%s> - failed to duplicate datset at %p\n",
00110                  this_file, din );
00111         return NULL;
00112     }
00113 
00114     /* give junk name */
00115     EDIT_dset_items(dout, ADN_prefix, "junk_resample", ADN_none );
00116 
00117     /* possibly update view type to that of the master */
00118     if ( min                                  &&
00119          (dout->view_type != min->view_type)  &&
00120          (dout->dblk && dout->dblk->diskptr) )
00121     {
00122         dout->view_type = min->view_type;
00123         THD_init_diskptr_names( dout->dblk->diskptr, NULL, NULL, NULL,
00124                                 min->view_type, True );
00125     }
00126 
00127 
00128     /* re-orient the brick? */
00129     if ( work & LR_RESAM_IN_REORIENT )
00130     {
00131         if ( ( fdb = THD_oriented_brick( dout, l_orient ) ) == NULL )
00132         {
00133             fprintf( stderr, "<%s>: failed to create THD_brick with orient "
00134                      "string <%.6s>\n", this_file, l_orient );
00135             THD_delete_3dim_dataset( dout, FALSE );
00136             return NULL;
00137         }
00138 
00139         if ( apply_orientation( dout, fdb, l_orient ) != 0 )
00140         {
00141             THD_delete_3dim_dataset( dout, FALSE );
00142             return NULL;
00143         }
00144     }
00145 
00146     new_daxes = *dout->daxes;                /* in case we don't resample */
00147 
00148     /* resample the brick? */
00149     if ( work & LR_RESAM_IN_RESAM )
00150     {
00151         /*-- given dx, dy and dz, create a new THD_dataxes structure ---- */
00152         new_daxes.type = DATAXES_TYPE;
00153 
00154         /* fill new_daxes, from the master, new dxyz, or both */
00155         if ( min && dx == 0.0 ) new_daxes = *min->daxes;
00156         else
00157         {
00158             /* possibly start with master (must have master's orient) */
00159             if ( min ) *dout->daxes = *min->daxes;
00160 
00161             if ( r_dxyz_mod_dataxes(dx, dy, dz, dout->daxes, &new_daxes) != 0 )
00162             {
00163                 THD_delete_3dim_dataset( dout, FALSE );
00164                 return NULL;
00165             }
00166         }
00167 
00168         if ( apply_dataxes( dout, &new_daxes ) != 0 )
00169         {
00170             THD_delete_3dim_dataset( dout, FALSE );
00171             return NULL;
00172         }
00173     }
00174 
00175     /* needed by THD_load_datablock() */
00176     dout->warp_parent        = dtmp;
00177     dout->warp_parent_idcode = dtmp->idcode;    /* needed for HEAD write */
00178 
00179     /* needed to warp from parent */
00180     dout->wod_flag        = True;               /* mark for WOD          */
00181     dout->vox_warp->type  = ILLEGAL_TYPE;       /* mark fo recomputation */
00182     *dout->wod_daxes      = new_daxes;          /* used for actual warp  */
00183 
00184     dout->daxes->parent   = (XtPointer)dout;    /* parent is new dset    */
00185 
00186     if ( r_fill_resampled_data_brick( dout, resam ) != 0 )
00187     {
00188         THD_delete_3dim_dataset( dout, FALSE );
00189         dout = NULL;
00190     }
00191 
00192     if ( sublist ) DSET_delete(dtmp);
00193 
00194     return dout;
00195 }

int r_orient_str2vec char    ostr[],
THD_ivec3   ovec
 

Definition at line 416 of file r_new_resam_dset.c.

References THD_ivec3::ijk, OR3OK, ORCODE, and this_file.

Referenced by apply_orientation().

00417 {
00418     int o1, o2, o3;
00419 
00420     if ( !ostr || !ovec )
00421     {
00422         fprintf( stderr, "%s: r_orient_str2vec - invalid parameter pair "
00423                  "(%p,%p)\n", this_file, ostr, ovec );
00424         return -1;
00425     }
00426 
00427     ovec->ijk[0] = o1 = ORCODE(toupper(ostr[0]));
00428     ovec->ijk[1] = o2 = ORCODE(toupper(ostr[1]));
00429     ovec->ijk[2] = o3 = ORCODE(toupper(ostr[2]));
00430 
00431     if ( ( o1 == ILLEGAL_TYPE ) ||
00432          ( o2 == ILLEGAL_TYPE ) ||
00433          ( o3 == ILLEGAL_TYPE ) ||
00434          ( !OR3OK(o1,o2,o3) ) )
00435     {
00436         fprintf( stderr, "%s: r_orient_str2vec - bad ostr <%.4s>\n",
00437                  this_file, ostr );
00438         return -2;
00439     }
00440 
00441     return 0;
00442 }

int valid_resam_inputs THD_3dim_dataset  ,
THD_3dim_dataset  ,
double   ,
double   ,
double   ,
char   [],
int   
[static]
 

Definition at line 456 of file r_new_resam_dset.c.

References THD_3dim_dataset::daxes, ISVALID_3DIM_DATASET, ISVALID_DATAXES, LAST_RESAM_TYPE, LR_RESAM_IN_FAIL, LR_RESAM_IN_NONE, LR_RESAM_IN_REORIENT, LR_RESAM_IN_RESAM, r_is_valid_orient_str(), this_file, THD_dataxes::xxorient, THD_dataxes::yyorient, and THD_dataxes::zzorient.

Referenced by r_new_resam_dset().

00459 {
00460     int ret_val = LR_RESAM_IN_NONE;
00461 
00462     if( ! ISVALID_3DIM_DATASET(dset) )
00463     {
00464         fprintf( stderr, "ERROR: <%s> - invalid input dataset\n", this_file );
00465         return LR_RESAM_IN_FAIL;
00466     }
00467 
00468     /* validate the resampling mode - this is required in any case */
00469     if ( resam < 0 || resam > LAST_RESAM_TYPE )
00470     {
00471         fprintf( stderr, "ERROR: <%s> - invalid resample mode of %d\n",
00472                  this_file, resam );
00473         return LR_RESAM_IN_FAIL;
00474     }
00475 
00476     if( mset ) /* behold, the master! */
00477     {
00478         /* validate mset and its thd_dataxes structure */
00479         if ( ! ISVALID_3DIM_DATASET(mset) || !ISVALID_DATAXES(mset->daxes) )
00480         {
00481             fprintf( stderr, "ERROR: <%s> - invalid master dataset\n",
00482                      this_file );
00483             return LR_RESAM_IN_FAIL;
00484         }
00485 
00486         /* we should have orientation memory with a master */
00487         if ( ! orient )
00488         {
00489             fprintf( stderr, "ERROR: <%s> - orientation memory should "
00490                      "come with master\n", this_file );
00491             return LR_RESAM_IN_FAIL;
00492         }
00493 
00494         /* we have a master - get orientation now, dxyz will come later */
00495         orient[0] = ORIENT_typestr[mset->daxes->xxorient][0];
00496         orient[1] = ORIENT_typestr[mset->daxes->yyorient][0];
00497         orient[2] = ORIENT_typestr[mset->daxes->zzorient][0];
00498         orient[3] = '\0';
00499 
00500         /* validate any new dxyz */
00501         if ( dx != 0.0 && (dx < 0.0 || dy <= 0.0 || dz <= 0.0) )
00502         {
00503             fprintf( stderr, "ERROR: <%s> - invalid (dx,dy,dz) = (%f,%f,%f)\n",
00504                      this_file, dx, dy, dz );
00505             return LR_RESAM_IN_FAIL;
00506         }
00507 
00508         return LR_RESAM_IN_RESAM | LR_RESAM_IN_REORIENT; /* we're good to go */
00509     }
00510 
00511     /* so no master dataset, validate dxyz and orientation */
00512 
00513     /* validate resampling */
00514     if ( dx == 0.0 && dy == 0.0 && dz == 0.0 )        /* no resampling */
00515         ret_val &= ~LR_RESAM_IN_RESAM;
00516     else if ( dx <= 0.0 || dy <= 0.0 || dz <= 0.0 )
00517     {
00518         fprintf( stderr, "ERROR: <%s> - invalid (dx,dy,dz) = (%f,%f,%f)\n",
00519                  this_file, dx, dy, dz );
00520         return LR_RESAM_IN_FAIL;
00521     }
00522     else
00523         ret_val |= LR_RESAM_IN_RESAM;
00524 
00525     /* validate orientation */
00526     if ( orient == NULL )
00527           ret_val &= ~LR_RESAM_IN_REORIENT;
00528     else if ( r_is_valid_orient_str ( orient ) == False )
00529     {
00530         fprintf( stderr, "ERROR: <%s> - invalid orientation string <%.6s>\n",
00531                  this_file, orient );
00532         return LR_RESAM_IN_FAIL;
00533     }
00534     else
00535         ret_val |= LR_RESAM_IN_REORIENT;
00536 
00537     return ret_val;
00538 }

Variable Documentation

char* this_file = "r_new_resam_dset.c" [static]
 

Definition at line 50 of file r_new_resam_dset.c.

Referenced by r_fill_resampled_data_brick(), r_new_resam_dset(), r_orient_str2vec(), and valid_resam_inputs().

 

Powered by Plone

This site conforms to the following standards: