Doxygen Source Code Documentation
3dDetrend.c File Reference
#include "mrilib.h"
#include "parser.h"
Go to the source code of this file.
Defines | |
#define | ALLOW_BYSLICE |
Functions | |
void | DT_read_opts (int, char **) |
void | DT_Syntax (void) |
void | DT_read_opts (int argc, char *argv[]) |
int | main (int argc, char *argv[]) |
Variables | |
THD_3dim_dataset * | DT_dset = NULL |
MRI_IMARR * | DT_imar = NULL |
char ** | DT_expr = NULL |
PARSER_code ** | DT_excode = NULL |
float * | DT_exdel = NULL |
int * | DT_exvar = NULL |
int | DT_exnum = 0 |
int | DT_verb = 0 |
int | DT_replace = 0 |
int | DT_norm = 0 |
int | DT_byslice = 0 |
int | DT_nvector = 0 |
float | DT_current_del = -1.0 |
char | DT_output_prefix [THD_MAX_PREFIX] = "detrend" |
char | DT_session [THD_MAX_NAME] = "./" |
Define Documentation
|
Definition at line 16 of file 3dDetrend.c. Referenced by DT_Syntax(). |
Function Documentation
|
Definition at line 45 of file 3dDetrend.c. References ADDTO_IMARR, argc, DSET_NVALS, DSET_NZ, DSET_TR, DT_byslice, DT_current_del, DT_exdel, DT_exnum, DT_expr, DT_exvar, DT_norm, DT_nvector, DT_output_prefix, DT_replace, DT_session, DT_verb, IMARR_COUNT, IMARR_SUBIMAGE, INIT_IMARR, malloc, MCW_strncpy, MRI_FLOAT_PTR, mri_new(), mri_read_1D(), MRI_IMAGE::nx, MRI_IMAGE::ny, PARSER_evaluate_one(), PARSER_generate_code(), PARSER_has_symbol(), realloc, strtod(), THD_MAX_NAME, THD_MAX_PREFIX, and THD_open_dataset(). Referenced by main().
00046 { 00047 int nopt = 1 , nvals , ii , nvcheck ; 00048 00049 INIT_IMARR(DT_imar) ; 00050 00051 while( nopt < argc && argv[nopt][0] == '-' ){ 00052 00053 /**** -prefix prefix ****/ 00054 00055 if( strncmp(argv[nopt],"-prefix",6) == 0 ){ 00056 nopt++ ; 00057 if( nopt >= argc ){ 00058 fprintf(stderr,"*** need argument after -prefix!\n") ; exit(1) ; 00059 } 00060 MCW_strncpy( DT_output_prefix , argv[nopt++] , THD_MAX_PREFIX ) ; 00061 continue ; 00062 } 00063 00064 /**** -session directory ****/ 00065 00066 if( strncmp(argv[nopt],"-session",6) == 0 ){ 00067 nopt++ ; 00068 if( nopt >= argc ){ 00069 fprintf(stderr,"*** need argument after -session!\n") ; exit(1) ; 00070 } 00071 MCW_strncpy( DT_session , argv[nopt++] , THD_MAX_NAME ) ; 00072 continue ; 00073 } 00074 00075 /**** -verb ****/ 00076 00077 if( strncmp(argv[nopt],"-verb",5) == 0 ){ 00078 DT_verb++ ; 00079 nopt++ ; continue ; 00080 } 00081 00082 /**** -replace ****/ 00083 00084 if( strncmp(argv[nopt],"-replace",5) == 0 ){ 00085 DT_replace++ ; 00086 nopt++ ; continue ; 00087 } 00088 00089 #ifdef ALLOW_BYSLICE 00090 /**** -byslice [08 Dec 1999] ****/ 00091 00092 if( strncmp(argv[nopt],"-byslice",5) == 0 ){ 00093 DT_byslice++ ; 00094 nopt++ ; continue ; 00095 } 00096 #endif 00097 00098 /**** -normalize [23 Nov 1999] ****/ 00099 00100 if( strncmp(argv[nopt],"-normalize",5) == 0 ){ 00101 DT_norm++ ; 00102 nopt++ ; continue ; 00103 } 00104 00105 /**** -vector ****/ 00106 00107 if( strncmp(argv[nopt],"-vector",4) == 0 ){ 00108 MRI_IMAGE * flim ; 00109 nopt++ ; 00110 if( nopt >= argc ){ 00111 fprintf(stderr,"*** need argument after -vector!\n"); exit(1); 00112 } 00113 flim = mri_read_1D( argv[nopt++] ) ; 00114 if( flim == NULL ){ 00115 fprintf(stderr,"*** can't read -vector %s\n",argv[nopt-1]); exit(1); 00116 } 00117 ADDTO_IMARR(DT_imar,flim) ; 00118 if( DT_verb ) 00119 fprintf(stderr,"+++ Read in %s: rows=%d cols=%d\n", 00120 argv[nopt-1],flim->ny,flim->nx ) ; 00121 continue ; 00122 } 00123 00124 /**** -del ****/ 00125 00126 if( strncmp(argv[nopt],"-del",4) == 0 ){ 00127 nopt++ ; 00128 if( nopt >= argc ){ 00129 fprintf(stderr,"*** need argument after -del!\n"); exit(1); 00130 } 00131 DT_current_del = strtod( argv[nopt++] , NULL ) ; 00132 if( DT_verb ) 00133 fprintf(stderr,"+++ Set expression stepsize = %g\n",DT_current_del) ; 00134 continue ; 00135 } 00136 00137 /**** -expr ****/ 00138 00139 if( strncmp(argv[nopt],"-expr",4) == 0 ){ 00140 int nexp , qvar , kvar ; 00141 char sym[4] ; 00142 00143 nopt++ ; 00144 if( nopt >= argc ){ 00145 fprintf(stderr,"*** need argument after -expr!\n"); exit(1); 00146 } 00147 00148 nexp = DT_exnum + 1 ; 00149 if( DT_exnum == 0 ){ /* initialize storage */ 00150 DT_expr = (char **) malloc( sizeof(char *) ) ; 00151 DT_excode = (PARSER_code **) malloc( sizeof(PARSER_code *) ) ; 00152 DT_exdel = (float *) malloc( sizeof(float) ) ; 00153 DT_exvar = (int *) malloc( sizeof(int) ) ; 00154 } else { 00155 DT_expr = (char **) realloc( DT_expr , 00156 sizeof(char *)*nexp ) ; 00157 DT_excode = (PARSER_code **) realloc( DT_excode , 00158 sizeof(PARSER_code *)*nexp ) ; 00159 DT_exdel = (float *) realloc( DT_exdel , 00160 sizeof(float)*nexp) ; 00161 DT_exvar = (int *) realloc( DT_exvar , 00162 sizeof(int)*nexp) ; 00163 } 00164 DT_expr[DT_exnum] = argv[nopt] ; /* string */ 00165 DT_exdel[DT_exnum] = DT_current_del ; /* delta */ 00166 DT_excode[DT_exnum] = PARSER_generate_code( argv[nopt] ) ; /* compile */ 00167 if( DT_excode[DT_exnum] == NULL ){ 00168 fprintf(stderr,"*** Illegal expression: %s\n",argv[nopt]); exit(1); 00169 } 00170 00171 qvar = 0 ; kvar = -1 ; /* find symbol */ 00172 for( ii=0 ; ii < 26 ; ii++ ){ 00173 sym[0] = 'A' + ii ; sym[1] = '\0' ; 00174 if( PARSER_has_symbol(sym,DT_excode[DT_exnum]) ){ 00175 qvar++ ; if( kvar < 0 ) kvar = ii ; 00176 if( DT_verb ) 00177 fprintf(stderr,"+++ Found expression symbol %s\n",sym) ; 00178 } 00179 } 00180 if( qvar > 1 ){ 00181 fprintf(stderr,"*** Expression %s should have just one symbol!\n", 00182 DT_expr[DT_exnum] ) ; 00183 exit(1) ; 00184 } 00185 DT_exvar[DT_exnum] = kvar ; 00186 00187 DT_exnum = nexp ; nopt++ ; continue ; 00188 } 00189 00190 /**** ERROR ****/ 00191 00192 fprintf(stderr,"*** Unknown option: %s\n",argv[nopt]) ; exit(1) ; 00193 00194 } /* end of scan over options */ 00195 00196 /*-- check for errors --*/ 00197 00198 if( nopt >= argc ){ 00199 fprintf(stderr,"*** No input dataset!?\n") ; exit(1) ; 00200 } 00201 00202 DT_nvector = IMARR_COUNT(DT_imar) ; 00203 if( DT_nvector + DT_exnum == 0 ){ 00204 fprintf(stderr,"*** No -vector or -expr options!?\n") ; exit(1) ; 00205 } 00206 #ifdef ALLOW_BYSLICE 00207 if( DT_nvector == 0 && DT_byslice ){ 00208 fprintf(stderr,"*** No -vector option supplied with -byslice!?\n"); exit(1); 00209 } 00210 #endif 00211 00212 /*--- read input dataset ---*/ 00213 00214 DT_dset = THD_open_dataset( argv[nopt] ) ; 00215 if( DT_dset == NULL ){ 00216 fprintf(stderr,"*** Can't open dataset %s\n",argv[nopt]) ; exit(1) ; 00217 } 00218 00219 DT_current_del = DSET_TR(DT_dset) ; 00220 if( DT_current_del <= 0.0 ){ 00221 DT_current_del = 1.0 ; 00222 if( DT_verb ) 00223 fprintf(stderr,"+++ Input has no TR value; setting TR=1.0\n") ; 00224 } else if( DT_verb ){ 00225 fprintf(stderr,"+++ Input has TR=%g\n",DT_current_del) ; 00226 } 00227 00228 /*-- check vectors for good size --*/ 00229 00230 nvcheck = nvals = DSET_NVALS(DT_dset) ; 00231 #ifdef ALLOW_BYSLICE 00232 if( DT_byslice ) nvcheck *= DSET_NZ(DT_dset) ; 00233 #endif 00234 for( ii=0 ; ii < DT_nvector ; ii++ ){ 00235 if( IMARR_SUBIMAGE(DT_imar,ii)->nx < nvcheck ){ 00236 fprintf(stderr,"*** %d-th -vector is shorter than dataset!\n",ii+1) ; 00237 exit(1) ; 00238 } 00239 } 00240 00241 /*--- create time series from expressions */ 00242 00243 if( DT_exnum > 0 ){ 00244 double atoz[26] , del ; 00245 int kvar , jj ; 00246 MRI_IMAGE * flim ; 00247 float * flar ; 00248 00249 for( jj=0 ; jj < DT_exnum ; jj++ ){ 00250 if( DT_verb ) fprintf(stderr,"+++ Evaluating %d-th -expr\n",jj+1) ; 00251 kvar = DT_exvar[jj] ; 00252 del = DT_exdel[jj] ; 00253 if( del <= 0.0 ) del = DT_current_del ; 00254 flim = mri_new( nvals , 1 , MRI_float ) ; 00255 flar = MRI_FLOAT_PTR(flim) ; 00256 for( ii=0 ; ii < 26 ; ii++ ) atoz[ii] = 0.0 ; 00257 for( ii=0 ; ii < nvals ; ii++ ){ 00258 if( kvar >= 0 ) atoz[kvar] = ii * del ; 00259 flar[ii] = PARSER_evaluate_one( DT_excode[jj] , atoz ) ; 00260 } 00261 ADDTO_IMARR( DT_imar , flim ) ; 00262 } 00263 } 00264 00265 return ; 00266 } |
|
|
|
Definition at line 270 of file 3dDetrend.c. References ALLOW_BYSLICE, and MASTER_SHORTHELP_STRING. Referenced by main().
00271 { 00272 printf( 00273 "Usage: 3dDetrend [options] dataset\n" 00274 "This program removes components from voxel time series using\n" 00275 "linear least squares. Each voxel is treated independently.\n" 00276 "The input dataset may have a sub-brick selector string; otherwise,\n" 00277 "all sub-bricks will be used.\n\n" 00278 ) ; 00279 00280 printf( 00281 "General Options:\n" 00282 " -prefix pname = Use 'pname' for the output dataset prefix name.\n" 00283 " [default='detrend']\n" 00284 " -session dir = Use 'dir' for the output dataset session directory.\n" 00285 " [default='./'=current working directory]\n" 00286 " -verb = Print out some verbose output as the program runs.\n" 00287 " -replace = Instead of subtracting the fit from each voxel,\n" 00288 " replace the voxel data with the time series fit.\n" 00289 " -normalize = Normalize each output voxel time series; that is,\n" 00290 " make the sum-of-squares equal to 1.\n" 00291 " N.B.: This option is only valid if the input dataset is\n" 00292 " stored as floats!\n" 00293 #ifdef ALLOW_BYSLICE 00294 " -byslice = Treat each input vector (infra) as describing a set of\n" 00295 " time series interlaced across slices. If NZ is the\n" 00296 " number of slices and NT is the number of time points,\n" 00297 " then each input vector should have NZ*NT values when\n" 00298 " this option is used (usually, they only need NT values).\n" 00299 " The values must be arranged in slice order, then time\n" 00300 " order, in each vector column, as shown here:\n" 00301 " f(z=0,t=0) // first slice, first time\n" 00302 " f(z=1,t=0) // second slice, first time\n" 00303 " ...\n" 00304 " f(z=NZ-1,t=0) // last slice, first time\n" 00305 " f(z=0,t=1) // first slice, second time\n" 00306 " f(z=1,t=1) // second slice, second time\n" 00307 " ...\n" 00308 " f(z=NZ-1,t=NT-1) // last slice, last time\n" 00309 #endif 00310 "\n" 00311 "Component Options:\n" 00312 "These options determine the components that will be removed from\n" 00313 "each dataset voxel time series. They may be repeated to specify\n" 00314 "multiple regression. At least one component must be specified.\n" 00315 "\n" 00316 " -vector vvv = Remove components proportional to the columns vectors\n" 00317 " of the ASCII *.1D file 'vvv'. You may use a\n" 00318 " sub-vector selector string to specify which columns\n" 00319 " to use; otherwise, all columns will be used.\n" 00320 " For example:\n" 00321 " -vector 'xyzzy.1D[3,5]'\n" 00322 " will remove the 4th and 6th columns of file xyzzy.1D\n" 00323 " from the dataset (sub-vector indexes start at 0).\n" 00324 "\n" 00325 " -expr eee = Remove components proportional to the function\n" 00326 " specified in the expression string 'eee'.\n" 00327 " Any single letter from a-z may be used as the\n" 00328 " independent variable in 'eee'. For example:\n" 00329 " -expr 'cos(2*PI*t/40)' -expr 'sin(2*PI*t/40)'\n" 00330 " will remove sine and cosine waves of period 40\n" 00331 " from the dataset. Another example:\n" 00332 " -expr '1' -expr 't' -expr 't*t'\n" 00333 " will remove a quadratic trend from the data.\n" 00334 "\n" 00335 " -del ddd = Use the numerical value 'ddd' for the stepsize\n" 00336 " in subsequent -expr options. If no -del option\n" 00337 " is ever given, then the TR given in the dataset\n" 00338 " header is used for 'ddd'; if that isn't available,\n" 00339 " then 'ddd'=1.0 is assumed. The j-th time point\n" 00340 " will have independent variable = j * ddd, starting\n" 00341 " at j=0. For example:\n" 00342 " -expr 'sin(x)' -del 2.0 -expr 'z**3'\n" 00343 " means that the stepsize in 'sin(x)' is delta-x=TR,\n" 00344 " but the stepsize in 'z**3' is delta-z = 2.\n" 00345 #ifdef ALLOW_BYSLICE 00346 "\n" 00347 " N.B.: expressions are NOT calculated on a per-slice basis when the\n" 00348 " -byslice option is used. If you want to do this, you could\n" 00349 " compute vectors with the required time series using 1devel.\n" 00350 #endif 00351 ) ; 00352 00353 printf("\n" MASTER_SHORTHELP_STRING ) ; 00354 00355 exit(0) ; 00356 } |
|
compute the overall minimum and maximum voxel values for a dataset Definition at line 360 of file 3dDetrend.c. References addto_args(), ADN_directory_name, ADN_none, ADN_prefix, argc, delayed_lsqfit(), DSET_ARRAY, DSET_BRICK_TYPE, DSET_BRIKNAME, DSET_HEADNAME, DSET_load, DSET_LOADED, DSET_mallocize, DSET_NVALS, DSET_NVOX, DSET_NX, DSET_NY, DSET_NZ, DSET_write, DT_byslice, DT_norm, DT_nvector, DT_output_prefix, DT_read_opts(), DT_replace, DT_session, DT_Syntax(), EDIT_dset_items(), EDIT_empty_copy(), EDIT_substitute_brick(), fit, free, IMARR_COUNT, IMARR_SUBIMAGE, machdep(), mainENTRY, malloc, MRI_FLOAT_PTR, mri_free(), MRI_IMAGE::nx, MRI_IMAGE::ny, PRINT_VERSION, startup_lsqfit(), THD_extract_series(), THD_insert_series(), THD_is_file(), THD_normalize(), tross_Copy_History(), tross_Make_History(), and tt.
00361 { 00362 int iv,nvals , nvec , ii,jj,kk , nvox ; 00363 THD_3dim_dataset * new_dset=NULL ; 00364 double * choleski ; 00365 float ** refvec , * fv , * fc , * fit ; 00366 MRI_IMAGE * flim ; 00367 00368 /*** read input options ***/ 00369 00370 if( argc < 2 || strncmp(argv[1],"-help",4) == 0 ) DT_Syntax() ; 00371 00372 /*-- 20 Apr 2001: addto the arglist, if user wants to [RWCox] --*/ 00373 00374 mainENTRY("3dDetrend main"); machdep() ; PRINT_VERSION("3dDetrend"); 00375 { int new_argc ; char ** new_argv ; 00376 addto_args( argc , argv , &new_argc , &new_argv ) ; 00377 if( new_argv != NULL ){ argc = new_argc ; argv = new_argv ; } 00378 } 00379 00380 DT_read_opts( argc , argv ) ; 00381 00382 /*** create new dataset (empty) ***/ 00383 00384 new_dset = EDIT_empty_copy( DT_dset ) ; /* make a copy of its header */ 00385 00386 /* modify its header */ 00387 00388 tross_Copy_History( DT_dset , new_dset ) ; 00389 tross_Make_History( "3dDetrend" , argc,argv , new_dset ) ; 00390 00391 EDIT_dset_items( new_dset , 00392 ADN_prefix , DT_output_prefix , 00393 ADN_directory_name, DT_session , 00394 ADN_none ) ; 00395 00396 /* can't re-write existing dataset */ 00397 00398 if( THD_is_file(DSET_HEADNAME(new_dset)) ){ 00399 fprintf(stderr,"*** Fatal error: file %s already exists!\n", 00400 DSET_HEADNAME(new_dset) ) ; 00401 exit(1) ; 00402 } 00403 00404 /* read input in, and attach its bricks to the output dataset */ 00405 /* (not good in a plugin, but OK in a standalone program!) */ 00406 00407 if( DT_verb ) fprintf(stderr,"+++ Loading input dataset .BRIK\n") ; 00408 00409 DSET_mallocize( new_dset ) ; 00410 DSET_mallocize( DT_dset ) ; 00411 DSET_load( DT_dset ) ; 00412 if( !DSET_LOADED(DT_dset) ){ 00413 fprintf(stderr,"*** Can't read input dataset .BRIK!\n") ; 00414 exit(1) ; 00415 } 00416 00417 nvals = DSET_NVALS(new_dset) ; 00418 for( iv=0 ; iv < nvals ; iv++ ) 00419 EDIT_substitute_brick( new_dset , iv , 00420 DSET_BRICK_TYPE(DT_dset,iv) , 00421 DSET_ARRAY(DT_dset,iv) ) ; 00422 00423 if( DT_norm && DSET_BRICK_TYPE(new_dset,0) != MRI_float ){ 00424 fprintf(stderr,"+++ Warning: turning -normalize option off since\n" 00425 " input dataset is not in float format!\n"); 00426 DT_norm = 0 ; 00427 } 00428 00429 /* load reference (detrending) vectors; 00430 setup to do least squares fitting of each voxel */ 00431 00432 nvec = 0 ; 00433 for( ii=0 ; ii < IMARR_COUNT(DT_imar) ; ii++ ) /* number of detrending vectors */ 00434 nvec += IMARR_SUBIMAGE(DT_imar,ii)->ny ; 00435 00436 refvec = (float **) malloc( sizeof(float *)*nvec ) ; 00437 for( kk=ii=0 ; ii < IMARR_COUNT(DT_imar) ; ii++ ){ 00438 fv = MRI_FLOAT_PTR( IMARR_SUBIMAGE(DT_imar,ii) ) ; 00439 for( jj=0 ; jj < IMARR_SUBIMAGE(DT_imar,ii)->ny ; jj++ ) /* compute ptr */ 00440 refvec[kk++] = fv + ( jj * IMARR_SUBIMAGE(DT_imar,ii)->nx ) ; /* to vectors */ 00441 } 00442 00443 fit = (float *) malloc( sizeof(float) * nvals ) ; /* will get fit to voxel data */ 00444 00445 /*--- do the all-voxels-together case ---*/ 00446 00447 if( !DT_byslice ){ 00448 choleski = startup_lsqfit( nvals , NULL , nvec , refvec ) ; 00449 if( choleski == NULL ){ 00450 fprintf(stderr,"*** Linearly dependent vectors can't be used!\n") ; 00451 exit(1) ; 00452 } 00453 00454 /* loop over voxels, fitting and detrending (or replacing) */ 00455 00456 nvox = DSET_NVOX(new_dset) ; 00457 00458 if( DT_verb ) fprintf(stderr,"+++ Computing voxel fits\n") ; 00459 00460 for( kk=0 ; kk < nvox ; kk++ ){ 00461 00462 flim = THD_extract_series( kk , new_dset , 0 ) ; /* data */ 00463 fv = MRI_FLOAT_PTR(flim) ; 00464 fc = delayed_lsqfit( nvals, fv, nvec, refvec, choleski ) ; /* coef */ 00465 00466 for( ii=0 ; ii < nvals ; ii++ ) fit[ii] = 0.0 ; 00467 00468 for( jj=0 ; jj < nvec ; jj++ ) 00469 for( ii=0 ; ii < nvals ; ii++ ) 00470 fit[ii] += fc[jj] * refvec[jj][ii] ; /* fit */ 00471 00472 if( !DT_replace ) /* remove */ 00473 for( ii=0 ; ii < nvals ; ii++ ) fit[ii] = fv[ii] - fit[ii] ; 00474 00475 if( DT_norm ) THD_normalize( nvals , fit ) ; /* 23 Nov 1999 */ 00476 00477 THD_insert_series( kk, new_dset, nvals, MRI_float, fit, 0 ) ; 00478 00479 free(fc) ; mri_free(flim) ; 00480 } 00481 00482 free(choleski) ; 00483 00484 /*- end of all-voxels-together case -*/ 00485 00486 } 00487 #ifdef ALLOW_BYSLICE 00488 else { /*- start of slice case [08 Dec 1999] -*/ 00489 int ksl , nslice , tt , nx,ny , nxy , kxy ; 00490 MRI_IMAGE * vim ; 00491 00492 /* make separate space for the slice-wise detrending vectors */ 00493 00494 for( kk=ii=0 ; ii < DT_nvector ; ii++ ){ 00495 for( jj=0 ; jj < IMARR_SUBIMAGE(DT_imar,ii)->ny ; jj++ ) /* replace ptrs */ 00496 refvec[kk++] = (float *) malloc( sizeof(float) * nvals ) ; /* to vectors */ 00497 } 00498 00499 nslice = DSET_NZ(new_dset) ; 00500 nxy = DSET_NX(new_dset) * DSET_NY(new_dset) ; 00501 00502 /* loop over slices */ 00503 00504 for( ksl=0 ; ksl < nslice ; ksl++ ){ 00505 00506 if( DT_verb ) fprintf(stderr,"+++ Computing voxel fits for slice %d\n",ksl) ; 00507 00508 /* extract slice vectors from input interlaced vectors */ 00509 00510 for( kk=ii=0 ; ii < DT_nvector ; ii++ ){ /* loop over vectors */ 00511 vim = IMARR_SUBIMAGE(DT_imar,ii) ; /* ii-th vector image */ 00512 nx = vim->nx ; ny = vim->ny ; /* dimensions */ 00513 for( jj=0 ; jj < ny ; jj++ ){ /* loop over columns */ 00514 fv = MRI_FLOAT_PTR(vim) + (jj*nx) ; /* ptr to column */ 00515 for( tt=0 ; tt < nvals ; tt++ ) /* loop over time */ 00516 refvec[kk][tt] = fv[ksl+tt*nslice] ; /* data point */ 00517 } 00518 } 00519 00520 /* initialize fitting for this slice */ 00521 00522 choleski = startup_lsqfit( nvals , NULL , nvec , refvec ) ; 00523 if( choleski == NULL ){ 00524 fprintf(stderr,"*** Linearly dependent vectors found at slice %d\n",ksl) ; 00525 exit(1) ; 00526 } 00527 00528 /* loop over voxels in this slice */ 00529 00530 for( kxy=0 ; kxy < nxy ; kxy++ ){ 00531 00532 kk = kxy + ksl*nxy ; /* 3D index */ 00533 flim = THD_extract_series( kk , new_dset , 0 ) ; /* data */ 00534 fv = MRI_FLOAT_PTR(flim) ; 00535 fc = delayed_lsqfit( nvals, fv, nvec, refvec, choleski ) ; /* coef */ 00536 00537 for( ii=0 ; ii < nvals ; ii++ ) fit[ii] = 0.0 ; 00538 00539 for( jj=0 ; jj < nvec ; jj++ ) 00540 for( ii=0 ; ii < nvals ; ii++ ) 00541 fit[ii] += fc[jj] * refvec[jj][ii] ; /* fit */ 00542 00543 if( !DT_replace ) /* remove */ 00544 for( ii=0 ; ii < nvals ; ii++ ) fit[ii] = fv[ii] - fit[ii] ; 00545 00546 if( DT_norm ) THD_normalize( nvals , fit ) ; /* 23 Nov 1999 */ 00547 00548 THD_insert_series( kk, new_dset, nvals, MRI_float, fit, 0 ) ; 00549 00550 free(fc) ; mri_free(flim) ; 00551 } 00552 00553 free(choleski) ; 00554 00555 } /* end of loop over slices */ 00556 00557 } /*- end of -byslice case -*/ 00558 #endif 00559 00560 /*-- done done done done --*/ 00561 00562 DSET_write(new_dset) ; 00563 if( DT_verb ) fprintf(stderr,"+++ Wrote output dataset: %s\n",DSET_BRIKNAME(new_dset)) ; 00564 exit(0) ; 00565 } |
Variable Documentation
|
Definition at line 28 of file 3dDetrend.c. Referenced by DT_read_opts(), and main(). |
|
Definition at line 31 of file 3dDetrend.c. Referenced by DT_read_opts(). |
|
Definition at line 18 of file 3dDetrend.c. |
|
Definition at line 21 of file 3dDetrend.c. |
|
Definition at line 22 of file 3dDetrend.c. Referenced by DT_read_opts(). |
|
Definition at line 24 of file 3dDetrend.c. Referenced by DT_read_opts(). |
|
Definition at line 20 of file 3dDetrend.c. Referenced by DT_read_opts(). |
|
Definition at line 23 of file 3dDetrend.c. Referenced by DT_read_opts(). |
|
Definition at line 19 of file 3dDetrend.c. |
|
Definition at line 27 of file 3dDetrend.c. Referenced by DT_read_opts(), and main(). |
|
Definition at line 29 of file 3dDetrend.c. Referenced by DT_read_opts(), and main(). |
|
Definition at line 33 of file 3dDetrend.c. Referenced by DT_read_opts(), and main(). |
|
Definition at line 26 of file 3dDetrend.c. Referenced by DT_read_opts(), and main(). |
|
Definition at line 34 of file 3dDetrend.c. Referenced by DT_read_opts(), and main(). |
|
Definition at line 25 of file 3dDetrend.c. Referenced by DT_read_opts(). |