Doxygen Source Code Documentation
3dDTeig.c File Reference
#include "mrilib.h"
#include "thd_shear3d.h"
Go to the source code of this file.
Functions | |
void | EIG_tsfunc (double tzero, double tdelta, int npts, float ts[], double ts_mean, double ts_slope, void *ud, int nbriks, float *val) |
int | main (int argc, char *argv[]) |
Variables | |
char | prefix [THD_MAX_PREFIX] = "eig" |
int | datum = MRI_float |
Function Documentation
|
Definition at line 150 of file 3dDTeig.c. References a, ENTRY, i, and symeig_double(). Referenced by main().
00154 { 00155 /* THD_dmat33 inmat; 00156 THD_dvecmat eigvmat;*/ 00157 int i,j; 00158 static int nvox , ncall ; 00159 int maxindex, minindex, midindex; 00160 float temp, minvalue, maxvalue; 00161 int sortvector[3]; 00162 double a[9], e[3]; 00163 int astart, vstart; 00164 double ssq, dsq; 00165 double dv0, dv1, dv2; 00166 00167 ENTRY("EIG_tsfunc"); 00168 /* ts is input vector data of 6 floating point numbers. 00169 For each point in volume brik convert vector data to 00170 symmetric matrix */ 00171 /* ts should come from data sub-briks in form of Dxx,Dxy,Dxz,Dyy,Dyz,Dzz */ 00172 /* convert to matrix of form 00173 [ Dxx Dxy Dxz] 00174 [ Dxy Dyy Dyz] 00175 [ Dxz Dyz Dzz] */ 00176 00177 /** is this a "notification"? **/ 00178 if( val == NULL ){ 00179 00180 if( npts > 0 ){ /* the "start notification" */ 00181 00182 nvox = npts ; /* keep track of */ 00183 ncall = 0 ; /* number of calls */ 00184 00185 } else { /* the "end notification" */ 00186 00187 /* nothing to do here */ 00188 } 00189 return ; 00190 } 00191 00192 /* load the symmetric matrix vector from the "timeseries" subbrik vector values */ 00193 00194 a[0]=ts[0]; a[1]=ts[1]; a[2]=ts[2]; 00195 a[3]=ts[1]; a[4]=ts[3]; a[5]=ts[4]; 00196 a[6]=ts[2]; a[5]=ts[4]; a[8]=ts[5]; 00197 00198 symeig_double(3, a, e); /* compute eigenvalues in e, eigenvectors in a */ 00199 00200 maxindex=2; /* find the lowest, middle and highest eigenvalue */ 00201 maxvalue=e[2]; 00202 minindex=0; 00203 minvalue=e[0]; 00204 midindex = 1; 00205 00206 for(i=0;i<3;i++) { 00207 temp = e[i]; 00208 if(temp>maxvalue) { /* find the maximum */ 00209 maxindex = i; 00210 maxvalue = temp; 00211 } 00212 if(temp<minvalue) { /* find the minimum */ 00213 minindex = i; 00214 minvalue = temp; 00215 } 00216 } 00217 00218 for(i=0;i<3;i++){ /* find the middle */ 00219 if((i!=maxindex) && (i!=minindex)) 00220 { 00221 midindex = i; 00222 break; 00223 } 00224 } 00225 00226 sortvector[0] = maxindex; 00227 sortvector[1] = midindex; 00228 sortvector[2] = minindex; 00229 00230 /* put the eigenvalues at the beginning of the matrix */ 00231 for(i=0;i<3;i++) { 00232 val[i] = e[sortvector[i]]; /* copy sorted eigenvalues */ 00233 00234 /* start filling in eigenvector values */ 00235 astart=sortvector[i]*3; /* start index of double eigenvector */ 00236 vstart=(i+1)*3; /* start index of float val vector to copy eigenvector */ 00237 00238 for(j=0;j<3;j++){ 00239 val[vstart+j] = a[astart+j]; 00240 } 00241 } 00242 00243 /* calculate the Fractional Anisotropy, FA */ 00244 /* reference, Pierpaoli C, Basser PJ. Microstructural and physiological features 00245 of tissues elucidated by quantitative-diffusion tensor MRI,J Magn Reson B 1996; 111:209-19 */ 00246 if((val[0]<=0.0)||(val[1]<=0.0)||(val[2]<=0.0)) { /* any negative eigenvalues?*/ 00247 val[12]=0.0; /* set FA to 0 */ 00248 val[13]=0.0; /* set MD to 0 */ 00249 EXRETURN; 00250 } 00251 00252 ssq = (val[0]*val[0])+(val[1]*val[1])+(val[2]*val[2]); /* sum of squares of eigenvalues */ 00253 /* dsq = pow((val[0]-val[1]),2.0) + pow((val[1]-val[2]),2.0) + pow((val[2]-val[0]),2.0);*/ /* sum of differences squared */ 00254 00255 dv0 = val[0]-val[1]; 00256 dv0 *= dv0; 00257 dv1 = val[1]-val[2]; 00258 dv1 *= dv1; 00259 dv2 = val[2]-val[0]; 00260 dv2 *= dv2; 00261 dsq = dv0+dv1+dv2; /* sum of differences squared */ 00262 00263 if(ssq!=0.0) 00264 val[12] = sqrt(dsq/(2.0*ssq)); /* FA calculated here */ 00265 else 00266 val[12] = 0.0; 00267 val[13] = (val[0]+val[1]+val[2]) / 3; /* MD - mean diffusivity=average of eigenvalues */ 00268 00269 EXRETURN; 00270 } |
|
compute the overall minimum and maximum voxel values for a dataset Definition at line 12 of file 3dDTeig.c. References ADN_brick_label_one, ADN_none, ADN_ntt, ADN_ttdel, ADN_ttorg, ADN_tunits, AFNI_logger(), argc, datum, DSET_BRIKNAME, DSET_NVALS, DSET_write, EDIT_dset_items(), EIG_tsfunc(), ISVALID_DSET, machdep(), mainENTRY, MAKER_4D_to_typed_fbuc(), MASTER_SHORTHELP_STRING, MCW_strncpy, prefix, PRINT_VERSION, THD_filename_ok(), THD_MAX_PREFIX, THD_open_dataset(), tross_Copy_History(), tross_Make_History(), and UNITS_SEC_TYPE.
00013 { 00014 THD_3dim_dataset * old_dset , * new_dset ; /* input and output datasets */ 00015 int nopt, nbriks ; 00016 00017 /*----- Read command line -----*/ 00018 if( argc < 2 || strcmp(argv[1],"-help") == 0 ){ 00019 printf("Usage: 3dDTeig [options] dataset\n" 00020 "Computes eigenvalues and eigenvectors for an input dataset of\n" 00021 " 6 sub-bricks Dxx,Dxy,Dxz,Dyy,Dyz,Dzz.\n" 00022 " The results are stored in a 14-subbrick bucket dataset.\n" 00023 " The resulting 14-subbricks are\n" 00024 " lambda_1,lambda_2,lambda_3,\n" 00025 " eigvec_1[1-3],eigvec_2[1-3],eigvec_3[1-3],\n" 00026 " FA,MD.\n\n" 00027 "The output is a bucket dataset. The input dataset\n" 00028 "may use a sub-brick selection list, as in program 3dcalc.\n" 00029 " Mean diffusivity (MD) calculated as simple average of eigenvalues.\n" 00030 " Fractional Anisotropy (FA) calculated according to Pierpaoli C, Basser PJ.\n" 00031 " Microstructural and physiological features of tissues elucidated by\n" 00032 " quantitative-diffusion tensor MRI, J Magn Reson B 1996; 111:209-19\n" 00033 ) ; 00034 printf("\n" MASTER_SHORTHELP_STRING ) ; 00035 exit(0) ; 00036 } 00037 00038 mainENTRY("3dDTeig main"); machdep(); AFNI_logger("3dDTeig",argc,argv); 00039 PRINT_VERSION("3dDTeig") ; 00040 00041 nopt = 1 ; 00042 nbriks = 14 ; 00043 datum = MRI_float; 00044 while( nopt < argc && argv[nopt][0] == '-' ){ 00045 00046 /*-- prefix --*/ 00047 00048 if( strcmp(argv[nopt],"-prefix") == 0 ){ 00049 if( ++nopt >= argc ){ 00050 fprintf(stderr,"*** -prefix needs an argument!\n"); exit(1); 00051 } 00052 MCW_strncpy(prefix,argv[nopt],THD_MAX_PREFIX) ; 00053 if( !THD_filename_ok(prefix) ){ 00054 fprintf(stderr,"*** %s is not a valid prefix!\n",prefix); exit(1); 00055 } 00056 nopt++ ; continue ; 00057 } 00058 00059 /*-- datum --*/ 00060 00061 if( strcmp(argv[nopt],"-datum") == 0 ){ 00062 if( ++nopt >= argc ){ 00063 fprintf(stderr,"*** -datum needs an argument!\n"); exit(1); 00064 } 00065 if( strcmp(argv[nopt],"short") == 0 ){ 00066 datum = MRI_short ; 00067 } else if( strcmp(argv[nopt],"float") == 0 ){ 00068 datum = MRI_float ; 00069 } else if( strcmp(argv[nopt],"byte") == 0 ){ 00070 datum = MRI_byte ; 00071 } else { 00072 fprintf(stderr,"-datum of type '%s' is not supported!\n", 00073 argv[nopt] ) ; 00074 exit(1) ; 00075 } 00076 nopt++ ; continue ; 00077 } 00078 } 00079 00080 /*----- read input dataset -----*/ 00081 00082 if( nopt >= argc ){ 00083 fprintf(stderr,"*** No input dataset!?\n"); exit(1); 00084 } 00085 00086 old_dset = THD_open_dataset( argv[nopt] ) ; 00087 if( !ISVALID_DSET(old_dset) ){ 00088 fprintf(stderr,"*** Can't open dataset %s\n",argv[nopt]); exit(1); 00089 } 00090 00091 /* expect 6 values per voxel - 6 sub-briks as input dataset */ 00092 if( DSET_NVALS(old_dset) < 6 ){ /* allows 6 or greater sub-briks */ 00093 fprintf(stderr,"*** Can't use dataset that is not at least 6 values per voxel!\n") ; 00094 exit(1) ; 00095 } 00096 00097 EDIT_dset_items( old_dset , 00098 ADN_ntt , DSET_NVALS(old_dset) , 00099 ADN_ttorg , 0.0 , 00100 ADN_ttdel , 1.0 , 00101 ADN_tunits , UNITS_SEC_TYPE , 00102 NULL ) ; 00103 00104 00105 /*------------- ready to compute new dataset -----------*/ 00106 00107 new_dset = MAKER_4D_to_typed_fbuc( 00108 old_dset , /* input dataset */ 00109 prefix , /* output prefix */ 00110 datum , /* output datum */ 00111 0 , /* ignore count */ 00112 0 , /* can't detrend in maker function KRH 12/02*/ 00113 nbriks , /* number of briks */ 00114 EIG_tsfunc , /* timeseries processor */ 00115 NULL /* data for tsfunc */ 00116 ) ; 00117 00118 if( new_dset != NULL ){ 00119 tross_Copy_History( old_dset , new_dset ) ; 00120 EDIT_dset_items(new_dset, ADN_brick_label_one+0, "lambda_1", ADN_none); 00121 EDIT_dset_items(new_dset, ADN_brick_label_one+1, "lambda_2",ADN_none); 00122 EDIT_dset_items(new_dset, ADN_brick_label_one+2, "lambda_3",ADN_none); 00123 EDIT_dset_items(new_dset, ADN_brick_label_one+3, "eigvec_1[1]",ADN_none); 00124 EDIT_dset_items(new_dset, ADN_brick_label_one+4, "eigvec_1[2]",ADN_none); 00125 EDIT_dset_items(new_dset, ADN_brick_label_one+5, "eigvec_1[3]",ADN_none); 00126 EDIT_dset_items(new_dset, ADN_brick_label_one+6, "eigvec_2[1]",ADN_none); 00127 EDIT_dset_items(new_dset, ADN_brick_label_one+7, "eigvec_2[2]",ADN_none); 00128 EDIT_dset_items(new_dset, ADN_brick_label_one+8, "eigvec_2[3]",ADN_none); 00129 EDIT_dset_items(new_dset, ADN_brick_label_one+9, "eigvec_3[1]",ADN_none); 00130 EDIT_dset_items(new_dset, ADN_brick_label_one+10,"eigvec_3[2]",ADN_none); 00131 EDIT_dset_items(new_dset, ADN_brick_label_one+11,"eigvec_3[3]",ADN_none); 00132 EDIT_dset_items(new_dset, ADN_brick_label_one+12,"FA",ADN_none); 00133 EDIT_dset_items(new_dset, ADN_brick_label_one+13,"MD",ADN_none); 00134 00135 tross_Make_History( "3dDTeig" , argc,argv , new_dset ) ; 00136 DSET_write( new_dset ) ; 00137 fprintf(stderr,"--- Output dataset: %s\n",DSET_BRIKNAME(new_dset)) ; 00138 } else { 00139 fprintf(stderr,"*** Unable to compute output dataset!\n") ; 00140 exit(1) ; 00141 } 00142 00143 exit(0) ; 00144 } |
Variable Documentation
|
Definition at line 7 of file 3dDTeig.c. Referenced by main(). |
|
Definition at line 6 of file 3dDTeig.c. Referenced by main(). |