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  

3dAnatNudge.c File Reference

#include "mrilib.h"

Go to the source code of this file.


Functions

int main (int argc, char *argv[])

Function Documentation

int main int    argc,
char *    argv[]
 

compute the overall minimum and maximum voxel values for a dataset

Definition at line 3 of file 3dAnatNudge.c.

References ADD_FVEC3, ADN_none, ADN_prefix, ADN_xyzorg, AFNI_logger(), argc, THD_3dim_dataset::daxes, THD_3dim_dataset::dblk, THD_datablock::diskptr, DSET_BRIKNAME, DSET_HEADNAME, DSET_load, DSET_write, DSET_XORG, DSET_YORG, DSET_ZORG, EDIT_dset_items(), THD_3dim_dataset::idcode, ISVALID_DSET, LOAD_FVEC3, machdep(), mainENTRY, MCW_new_idcode, nz, PRINT_VERSION, STORAGE_BY_BRICK, THD_diskptr::storage_mode, strtod(), THD_autonudge(), THD_filename_ok(), THD_is_file(), THD_open_dataset(), tross_Make_History(), THD_dataxes::xxorient, THD_fvec3::xyz, THD_dataxes::yyorient, and THD_dataxes::zzorient.

00004 {
00005    THD_3dim_dataset *dsepi=NULL , *dsant=NULL ;
00006    int nopt=1 ;
00007    char *prefix=NULL , str[1024] ;
00008    int nx=1 , ny=5 , nz=0 , ii ;
00009    float step=1.0 ;
00010    int verb=0 ;
00011    THD_fvec3 fv ;
00012 
00013    if( argc < 2 || strcmp(argv[1],"-help") == 0 ){
00014       printf("Usage: 3dAnatNudge [options]\n"
00015              "Moves the anat dataset around to best overlap the epi dataset.\n"
00016              "\n"
00017              "OPTIONS:\n"
00018              " -anat aaa   = aaa is an 'scalped' (3dIntracranial) high-resolution\n"
00019              "                anatomical dataset [a mandatory option]\n"
00020              " -epi eee    = eee is an EPI dataset [a mandatory option]\n"
00021              "                The first [0] sub-brick from each dataset is used,\n"
00022              "                unless otherwise specified on the command line.\n"
00023              " -prefix ppp = ppp is the prefix of the output dataset;\n"
00024              "                this dataset will differ from the input only\n"
00025              "                in its name and its xyz-axes origin\n"
00026              "                [default=don't write new dataset]\n"
00027              " -step sss   = set the step size to be sss times the voxel size\n"
00028              "                in the anat dataset [default=1.0]\n"
00029              " -x nx       = search plus and minus nx steps along the EPI\n"
00030              " -y ny          dataset's x-axis; similarly for ny and the\n"
00031              " -z nz          y-axis, and for nz and the z-axis\n"
00032              "                [default: nx=1 ny=5 nz=0]\n"
00033              " -verb       = print progress reports (this is a slow program)\n"
00034              "\n"
00035              "NOTES\n"
00036              "*Systematically moves the anat dataset around and find the shift\n"
00037              "  that maximizes overlap between the anat dataset and the EPI\n"
00038              "  dataset.  No rotations are done.\n"
00039              "*Note that if you use -prefix, a new dataset will be created that\n"
00040              "  is a copy of the anat, except that it's origin will be shifted\n"
00041              "  and it will have a different ID code than the anat.  If you want\n"
00042              "  to use this new dataset as the anatomy parent for the EPI\n"
00043              "  datasets, you'll have to use\n"
00044              "    3drefit -apar ppp+orig eee1+orig eee2+orig ...\n"
00045              "*If no new dataset is written (no -prefix option), then you\n"
00046              "  can use the 3drefit command emitted at the end to modify\n"
00047              "  the origin of the anat dataset.  (Assuming you trust the\n"
00048              "  results - visual inspection is recommended!)\n"
00049              "*The reason the default search grid is mostly along the EPI y-axis\n"
00050              "  is that axis is usually the phase-encoding direction, which is\n"
00051              "  most subject to displacement due to off-resonance effects.\n"
00052              "*Note that the time this program takes will be proportional to\n"
00053              "  (2*nx+1)*(2*ny+1)*(2*nz+1), so using a very large search grid\n"
00054              "  will result in a very large usage of CPU time.\n"
00055              "*Recommended usage:\n"
00056              " + Make a 1-brick function volume from a typical EPI dataset:\n"
00057              "     3dbucket -fbuc -prefix epi_fb epi+orig\n"
00058              " + Use 3dIntracranial to scalp a T1-weighted volume:\n"
00059              "     3dIntracranial -anat spgr+orig -prefix spgr_st\n"
00060              " + Use 3dAnatNudge to produce a shifted anat dataset\n"
00061              "     3dAnatNudge -anat spgr_st+orig -epi epi_fb+orig -prefix spgr_nudge\n"
00062              " + Start AFNI and look at epi_fb overlaid in color on the\n"
00063              "    anat datasets spgr_st+orig and spgr_nudge+orig, to see if the\n"
00064              "    nudged dataset seems like a better fit.\n"
00065              " + Delete the nudged dataset spgr_nudge.\n"
00066              " + If the nudged dataset DOES look better, then apply the\n"
00067              "    3drefit command output by 3dAnatNudge to spgr+orig.\n"
00068              "*Note that the x-, y-, and z-axes for the epi and anat datasets\n"
00069              "  may point in different directions (e.g., axial SPGR and\n"
00070              "  coronal EPI).  The 3drefit command applies to the anat\n"
00071              "  dataset, NOT to the EPI dataset.\n"
00072              "*If the program runs successfully, the only thing set to stdout\n"
00073              "  will be the 3drefit command string; all other messages go to\n"
00074              "  stderr.  This can be useful if you want to capture the command\n"
00075              "  to a shell variable and then execute it, as in the following\n"
00076              "  csh fragment:\n"
00077              "     set cvar = `3dAnatNudge ...`\n"
00078              "     if( $cvar[1] == \"3drefit\" ) $cvar\n"
00079              "  The test on the first sub-string in cvar allows for the\n"
00080              "  possibility that the program fails, or that the optimal\n"
00081              "  nudge is zero.\n"
00082            ) ;
00083       exit(0) ;
00084    }
00085 
00086    mainENTRY("3dAnatNudge"); machdep(); AFNI_logger("3dAnatNudge",argc,argv);
00087    PRINT_VERSION("3dAnatNudge");
00088 
00089    while( nopt < argc ){
00090 
00091       /*-- -anat --*/
00092 
00093       if( strcmp(argv[nopt],"-anat") == 0 ){
00094          if( dsant != NULL ){
00095            fprintf(stderr,"** Can't have 2 -anat options!\n"); exit(1);
00096          }
00097          dsant = THD_open_dataset( argv[++nopt] ) ;
00098          if( !ISVALID_DSET(dsant) ){
00099            fprintf(stderr,"** Can't open dataset %s\n",argv[nopt]); exit(1);
00100          }
00101          nopt++ ; continue ;
00102       }
00103 
00104       /*-- -epi --*/
00105 
00106       if( strcmp(argv[nopt],"-epi") == 0 ){
00107          if( dsepi != NULL ){
00108            fprintf(stderr,"** Can't have 2 -epi options!\n"); exit(1);
00109          }
00110          dsepi = THD_open_dataset( argv[++nopt] ) ;
00111          if( !ISVALID_DSET(dsepi) ){
00112            fprintf(stderr,"** Can't open dataset %s\n",argv[nopt]); exit(1);
00113          }
00114          nopt++ ; continue ;
00115       }
00116 
00117       /*-- -prefix --*/
00118 
00119       if( strcmp(argv[nopt],"-prefix") == 0 ){
00120          prefix = argv[++nopt] ;
00121          if( !THD_filename_ok(prefix) ){
00122            fprintf(stderr,"** Illegal prefix\n"); exit(1);
00123          }
00124          nopt++ ; continue ;
00125       }
00126 
00127       /*-- -verb --*/
00128 
00129       if( strcmp(argv[nopt],"-verb") == 0 ){
00130         verb = 1 ; nopt++ ; continue ;
00131       }
00132 
00133       /*-- -step --*/
00134 
00135       if( strcmp(argv[nopt],"-step") == 0 ){
00136          step = strtod( argv[++nopt] , NULL ) ;
00137          if( step <= 0.0 || step > 2.0 ){
00138            fprintf(stderr,"** Illegal value of -step\n"); exit(1);
00139          }
00140          nopt++ ; continue ;
00141       }
00142 
00143       /*-- -x or -y or -z --*/
00144 
00145       if( strcmp(argv[nopt],"-x") == 0 ){
00146          nx = strtol( argv[++nopt] , NULL , 10 ) ;
00147          if( nx < 0 || nx > 10 ){
00148            fprintf(stderr,"** Illegal value of -x\n"); exit(1);
00149          }
00150          nopt++ ; continue ;
00151       }
00152 
00153       if( strcmp(argv[nopt],"-y") == 0 ){
00154          ny = strtol( argv[++nopt] , NULL , 10 ) ;
00155          if( ny < 0 || ny > 10 ){
00156            fprintf(stderr,"** Illegal value of -y\n"); exit(1);
00157          }
00158          nopt++ ; continue ;
00159       }
00160 
00161       if( strcmp(argv[nopt],"-z") == 0 ){
00162          nz = strtol( argv[++nopt] , NULL , 10 ) ;
00163          if( nz < 0 || nz > 10 ){
00164            fprintf(stderr,"** Illegal value of -z\n"); exit(1);
00165          }
00166          nopt++ ; continue ;
00167       }
00168 
00169       /*-- bad news --*/
00170 
00171       fprintf(stderr,"** Illegal option: %s\n",argv[nopt]); exit(1);
00172    }
00173 
00174    if( dsant == NULL || dsepi == NULL ){
00175       fprintf(stderr,"** Must use both -anat and -epi options!\n"); exit(1);
00176    }
00177 
00178    /* do the actual work! */
00179 
00180    fv = THD_autonudge( dsepi,0 , dsant,0 , step , nx,ny,nz , verb ) ;
00181 
00182    /* see if we got anything back */
00183 
00184    if( fv.xyz[0] == 0.0 && fv.xyz[1] == 0.0 && fv.xyz[2] == 0.0 ){
00185       fprintf(stderr,"# Best nudge is nothing.\n") ; exit(0) ;
00186    }
00187 
00188    fprintf(stderr,"++ Best nudge is %.4f%c %.4f%c %.4f%c\n" ,
00189            -fv.xyz[0] , ORIENT_typestr[dsant->daxes->xxorient][0] ,
00190            -fv.xyz[1] , ORIENT_typestr[dsant->daxes->yyorient][0] ,
00191            -fv.xyz[2] , ORIENT_typestr[dsant->daxes->zzorient][0]  ) ;
00192 
00193    /* print 3drefit command */
00194 
00195    strcpy(str,"3drefit") ; ii = strlen(str) ;
00196    if( fv.xyz[0] != 0.0 ){
00197       sprintf(str+ii," -dxorigin %.4f",fv.xyz[0]); ii = strlen(str);
00198    }
00199    if( fv.xyz[1] != 0.0 ){
00200       sprintf(str+ii," -dyorigin %.4f",fv.xyz[1]); ii = strlen(str);
00201    }
00202    if( fv.xyz[2] != 0.0 ){
00203       sprintf(str+ii," -dzorigin %.4f",fv.xyz[2]); ii = strlen(str);
00204    }
00205    sprintf(str+ii," %s",DSET_HEADNAME(dsant)) ;
00206    printf("%s\n",str) ;
00207 
00208    /* produce new dataset */
00209 
00210    if( prefix != NULL ){
00211       THD_fvec3 ov , nv ;
00212       LOAD_FVEC3(ov,DSET_XORG(dsant),DSET_YORG(dsant),DSET_ZORG(dsant)) ;
00213       nv = ADD_FVEC3(ov,fv) ;
00214       DSET_load(dsant) ;
00215       dsant->dblk->diskptr->storage_mode = STORAGE_BY_BRICK ; /* 14 Jan 2004 */
00216       dsant->idcode = MCW_new_idcode() ;
00217       EDIT_dset_items( dsant ,
00218                          ADN_prefix , prefix ,
00219                          ADN_xyzorg , nv ,
00220                        ADN_none ) ;
00221       if( THD_is_file(DSET_HEADNAME(dsant)) ){
00222          fprintf(stderr,"** Can't overwrite existing dataset %s\n",
00223                  DSET_HEADNAME(dsant) ) ;
00224          exit(1) ;
00225       }
00226       tross_Make_History( "3dAnatNudge" , argc,argv , dsant ) ;
00227       DSET_write(dsant) ;
00228       fprintf(stderr,"++ Wrote new dataset %s\n",DSET_BRIKNAME(dsant)) ;
00229    }
00230 
00231    exit(0) ;
00232 }
 

Powered by Plone

This site conforms to the following standards: