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  

3dpc.c File Reference

#include <string.h>
#include "mrilib.h"
#include <stdlib.h>
#include <ctype.h>
#include "cs.h"

Go to the source code of this file.


Defines

#define PC_lprin_calc   PC_brnum
#define XX(i, j)   PC_brickdata[(j)][(i)]
#define AA(i, j)   (aa[(i)+(j)*adim])
#define VV(i, j)   (zout[(i)+(j)*adim])

Functions

void PC_read_opts (int, char **)
void PC_syntax (char *)
void PC_read_opts (int argc, char *argv[])
int main (int argc, char *argv[])

Variables

int PC_dmean = 0
int PC_vmean = 0
int PC_vnorm = 0
int PC_normalize = 0
int PC_lprin_save = 0
int PC_be_quiet = 1
int PC_do_float = 0
char ** PC_dsname = NULL
int PC_dsnum = 0
int PC_brnum = 0
int PC_1ddum = 0
THD_3dim_dataset ** PC_dset = NULL
char PC_prefix [THD_MAX_PREFIX] = "pc"
float ** PC_brickdata
bytePC_mask = NULL
int PC_mask_nvox = 0
int PC_mask_hits = 0

Define Documentation

#define AA i,
j       (aa[(i)+(j)*adim])
 

i,j element of covariance matrix *

Definition at line 49 of file 3dpc.c.

Referenced by main().

#define PC_lprin_calc   PC_brnum
 

Definition at line 29 of file 3dpc.c.

Referenced by main().

#define VV i,
j       (zout[(i)+(j)*adim])
 

i'th element of j'th eigenvector *

Definition at line 53 of file 3dpc.c.

Referenced by apply_yshear(), apply_zshear(), flip_xy(), flip_xz(), flip_yz(), and main().

#define XX i,
j       PC_brickdata[(j)][(i)]
 

i'th element of j'th input brick *

Definition at line 45 of file 3dpc.c.

Referenced by huber_func(), linear_filter_extend(), linear_filter_trend(), linear_filter_zero(), and main().


Function Documentation

int main int    argc,
char *    argv[]
 

---------- Adapted from 3dZeropad.c by RWCox - 08 Aug 2001 ----------*

Definition at line 343 of file 3dpc.c.

References AA, addto_args(), ADN_func_type, ADN_none, ADN_ntt, ADN_nvals, ADN_prefix, AFNI_logger(), ANAT_BUCK_TYPE, argc, DSET_BRIKNAME, DSET_delete, DSET_HEADNAME, DSET_NX, DSET_NY, DSET_NZ, DSET_write, EDIT_BRICK_LABEL, EDIT_dset_items(), EDIT_empty_copy(), EDIT_substitute_brick(), fout, free, FUNC_BUCK_TYPE, ISANAT, machdep(), mainENTRY, malloc, MRI_FLOAT_PTR, mri_free(), mri_new(), mri_write_ascii(), nz, PC_1ddum, PC_be_quiet, PC_brickdata, PC_brnum, PC_dsnum, PC_lprin_calc, PC_lprin_save, PC_mask, PC_mask_hits, PC_prefix, PC_read_opts(), PC_syntax(), PRINT_VERSION, symeig_double(), THD_is_file(), THD_MAX_NAME, tross_Copy_History(), tross_Make_History(), VV, and XX.

00344 {
00345    int nx,ny,nz , nxyz , ii,jj,ll , nn,mm,mmmm , npos,nneg ;
00346    float fmax , ftem ;
00347    THD_3dim_dataset * dset , * new_dset ;
00348    double * dsdev = NULL ;
00349    float  * fout , * perc ;
00350    short  * bout  ;
00351    register float  sum ;
00352    register double dsum ;
00353    register int    kk ;
00354    int ifirst,ilast,idel ;
00355    int ierror;          /* number of errors in editing data */
00356    MRI_IMAGE * vecim ;
00357    char vname[THD_MAX_NAME] ;
00358 
00359    /** data for eigenvalue routine (some only used with LAPACK) **/
00360 
00361    double * aa , * wout , * zout , * work ;
00362    double abstol , atrace ;
00363    int adim , il , iu , mout , lwork , info ;
00364    int * iwork , * ifail ;
00365 
00366    /*-- read command line arguments --*/
00367 
00368    if( argc < 2 || strncmp(argv[1],"-help",5) == 0 ) PC_syntax(NULL) ;
00369 
00370    /*-- 20 Apr 2001: addto the arglist, if user wants to [RWCox] --*/
00371 
00372    mainENTRY("3dpc main"); machdep(); PRINT_VERSION("3dpc") ;
00373 
00374    { int new_argc ; char ** new_argv ;
00375      addto_args( argc , argv , &new_argc , &new_argv ) ;
00376      if( new_argv != NULL ){ argc = new_argc ; argv = new_argv ; }
00377    }
00378 
00379    AFNI_logger("3dpc",argc,argv) ;
00380 
00381    PC_read_opts( argc , argv ) ;
00382 
00383    /*-- get dimensions --*/
00384 
00385    dset = PC_dset[0]    ;
00386    nx   = DSET_NX(dset) ;
00387    ny   = DSET_NY(dset) ;
00388    nz   = DSET_NZ(dset) ;
00389    nxyz = nx * ny * nz  ;
00390 
00391    nn = nxyz ;           /* vector length */
00392    mm = PC_brnum ;       /* number of vectors */
00393 
00394    /*-- space for eigenvalue computations --*/
00395 
00396    adim   = mm ;
00397    aa     = (double *) malloc( sizeof(double) * adim * adim ) ; /* matrix */
00398    wout   = (double *) malloc( sizeof(double) * adim ) ;        /* evals  */
00399 
00400    if( aa == NULL || wout == NULL )
00401       PC_syntax("can't malloc space for covariance matrix") ;
00402 
00403 #ifdef USE_LAPACK
00404    il     = adim + 1 - PC_lprin_calc ;  /* lowest index */
00405    iu     = adim ;                      /* upper index */
00406    abstol = 0.0 ;
00407    zout   = (double *) malloc( sizeof(double) * adim * PC_lprin_calc ) ;
00408    lwork  = 32 * adim ;
00409    work   = (double *) malloc( sizeof(double) * lwork ) ;
00410    iwork  = (int *)    malloc( sizeof(int) * 6 * adim ) ;
00411    ifail  = (int *)    malloc( sizeof(int) * adim ) ;
00412 
00413    if( zout == NULL || work == NULL || iwork == NULL || ifail == NULL )
00414       PC_syntax("can't malloc eigen workspace") ;
00415 #endif
00416 
00417    /*-- remove means, if ordered --*/
00418 
00419    if( PC_vmean ){
00420       float * vxmean = (float *) malloc( sizeof(float) * nn ) ;  /* voxel means */
00421 
00422       if( !PC_be_quiet ){ printf("--- remove timeseries means"); fflush(stdout); }
00423 
00424       for( kk=0 ; kk < nn ; kk++ ) vxmean[kk] = 0.0 ;
00425 
00426       for( jj=0 ; jj < mm ; jj++ ){
00427          for( kk=0 ; kk < nn ; kk++ ) vxmean[kk] += XX(kk,jj) ;
00428          if( !PC_be_quiet ){ printf("+"); fflush(stdout); }
00429       }
00430 
00431       sum = 1.0 / mm ;
00432       for( kk=0 ; kk < nn ; kk++ ) vxmean[kk] *= sum ;
00433 
00434       for( jj=0 ; jj < mm ; jj++ ){
00435          for( kk=0 ; kk < nn ; kk++ ) XX(kk,jj) -= vxmean[kk] ;
00436          if( !PC_be_quiet ){ printf("-"); fflush(stdout); }
00437       }
00438 
00439       free(vxmean) ;
00440       if( !PC_be_quiet ){ printf("\n"); fflush(stdout); }
00441 
00442    } else if( PC_dmean ){
00443       if( !PC_be_quiet ){ printf("--- remove brick means"); fflush(stdout); }
00444 
00445       if( PC_mask == NULL ){
00446          for( jj=0 ; jj < mm ; jj++ ){
00447             sum = 0.0 ;
00448             for( kk=0 ; kk < nn ; kk++ ) sum += XX(kk,jj) ;
00449             if( !PC_be_quiet ){ printf("+"); fflush(stdout); }
00450             sum /= nn ;
00451             for( kk=0 ; kk < nn ; kk++ ) XX(kk,jj) -= sum ;
00452             if( !PC_be_quiet ){ printf("-"); fflush(stdout); }
00453          }
00454       } else {                           /* 15 Sep 1999 */
00455          for( jj=0 ; jj < mm ; jj++ ){
00456             sum = 0.0 ;
00457             for( kk=0 ; kk < nn ; kk++ ) if( PC_mask[kk] ) sum += XX(kk,jj) ;
00458             if( !PC_be_quiet ){ printf("+"); fflush(stdout); }
00459             sum /= PC_mask_hits ;
00460             for( kk=0 ; kk < nn ; kk++ ) if( PC_mask[kk] ) XX(kk,jj) -= sum ;
00461             if( !PC_be_quiet ){ printf("-"); fflush(stdout); }
00462          }
00463       }
00464       if( !PC_be_quiet ){ printf("\n"); fflush(stdout); }
00465    }
00466 
00467    /*-- 07 July 1999: vnorm --*/
00468 
00469    if( PC_vnorm ){
00470       float * vxnorm = (float *) malloc( sizeof(float) * nn ) ;  /* voxel norms */
00471 
00472       if( !PC_be_quiet ){ printf("--- normalize timeseries"); fflush(stdout); }
00473 
00474       for( kk=0 ; kk < nn ; kk++ ) vxnorm[kk] = 0.0 ;
00475 
00476       for( jj=0 ; jj < mm ; jj++ ){
00477          for( kk=0 ; kk < nn ; kk++ ) vxnorm[kk] += XX(kk,jj) * XX(kk,jj) ;
00478          if( !PC_be_quiet ){ printf("+"); fflush(stdout); }
00479       }
00480 
00481       for( kk=0 ; kk < nn ; kk++ )
00482          if( vxnorm[kk] > 0.0 ) vxnorm[kk] = 1.0 / sqrt(vxnorm[kk]) ;
00483 
00484       for( jj=0 ; jj < mm ; jj++ ){
00485          for( kk=0 ; kk < nn ; kk++ ) XX(kk,jj) *= vxnorm[kk] ;
00486          if( !PC_be_quiet ){ printf("*"); fflush(stdout); }
00487       }
00488 
00489       free(vxnorm) ;
00490       if( !PC_be_quiet ){ printf("\n"); fflush(stdout); }
00491    }
00492 
00493    /*-- load covariance matrix
00494         (very short code that takes a long time to run!) --*/
00495 
00496    if( !PC_be_quiet ){ printf("--- compute covariance matrix"); fflush(stdout); }
00497 
00498    idel = 1 ;                           /* ii goes forward */
00499    for( jj=0 ; jj < mm ; jj++ ){
00500 
00501       ifirst = (idel==1) ?    0 : jj ;  /* back and forth in ii to   */
00502       ilast  = (idel==1) ? jj+1 : -1 ;  /* maximize use of cache/RAM */
00503 
00504       for( ii=ifirst ; ii != ilast ; ii += idel ){
00505          dsum = 0.0 ;
00506          if( PC_mask == NULL ){
00507             for( kk=0 ; kk < nn ; kk++ ) dsum += XX(kk,ii) * XX(kk,jj)   ;
00508          } else {
00509             for( kk=0 ; kk < nn ; kk++ )
00510                        if( PC_mask[kk] ) dsum += XX(kk,ii) * XX(kk,jj)   ;
00511          }
00512          AA(ii,jj) = AA(jj,ii) = dsum ;
00513       }
00514 
00515       if( !PC_be_quiet ){ printf("+"); fflush(stdout); }
00516 
00517       idel = -idel ;                    /* reverse direction of ii */
00518    }
00519    if( !PC_be_quiet ){ printf("\n"); fflush(stdout); }
00520 
00521    /*-- check diagonal for OK-ness --**/
00522 
00523    atrace = 0.0 ;
00524    ii     = 0 ;
00525    for( jj=0 ; jj < mm ; jj++ ){
00526       if( AA(jj,jj) <= 0.0 ){
00527          fprintf(stderr,"*** covariance diagonal (%d,%d) = %g\n",
00528                  jj+1,jj+1,AA(jj,jj)) ;
00529          ii++ ;
00530       }
00531       atrace += AA(jj,jj) ;
00532    }
00533    if( ii > 0 ){ printf("*** program exiting right here and now!\n"); exit(1); }
00534 
00535    if( !PC_be_quiet ){ printf("--- covariance trace = %g\n",atrace); fflush(stdout); }
00536 
00537    /*-- normalize, if desired --*/
00538 
00539    if( PC_normalize ){
00540       if( !PC_be_quiet ){ printf("--- normalizing covariance"); fflush(stdout); }
00541 
00542       dsdev = (double *) malloc( sizeof(double) * mm ) ; /* brick stdev */
00543 
00544       for( jj=0 ; jj < mm ; jj++ ) dsdev[jj] = sqrt( AA(jj,jj) ) ;
00545 
00546       for( jj=0 ; jj < mm ; jj++ )
00547          for( ii=0 ; ii < mm ; ii++ ) AA(ii,jj) /= (dsdev[ii]*dsdev[jj]) ;
00548 
00549       atrace = mm ;
00550 
00551       if( !PC_be_quiet ){ printf("\n"); fflush(stdout); }
00552    }
00553 
00554    if( !PC_be_quiet ){ printf("--- compute eigensolution\n"); fflush(stdout); }
00555 
00556 #ifdef USE_LAPACK
00557    (void) dsyevx_( "V"     , /* eigenvalues and vectors */
00558                    "I"     , /* a subrange of eigenvalues */
00559                    "U"     , /* use upper triangle of A */
00560                    &adim   , /* dimension of A */
00561                    aa      , /* the matrix A */
00562                    &adim   , /* leading dimension of A */
00563                    NULL    , /* not used */
00564                    NULL    , /* not used */
00565                    &il     , /* lowest eigen-index */
00566                    &iu     , /* highest eigen-index */
00567                    &abstol , /* tolerance */
00568                    &mout   , /* output # of eigenvalues */
00569                    wout    , /* output eigenvalues */
00570                    zout    , /* output eigenvectors */
00571                    &adim   , /* leading dimension of zout */
00572                    work    , /* double work array */
00573                    &lwork  , /* size of work array */
00574                    iwork   , /* another work array */
00575                    ifail   , /* output failure list */
00576                    &info     /* results code */
00577                  ) ;
00578 
00579    free(aa) ; free(work) ; free(iwork) ; free(ifail) ;
00580 
00581    if( info != 0 ){
00582       fprintf(stderr,"*** DSYEVX returns error code info=%d\n",info);
00583       if( info < 0 ) exit(1) ;
00584    }
00585 #else
00586    symeig_double( mm , aa , wout ) ;  /* eigenvectors go over aa  */
00587    zout = aa ;                        /* eigenvalues go into wout */
00588 #endif
00589 
00590    if( !PC_be_quiet ) printf("\n") ;
00591 
00592    sum = 0.0 ;
00593 
00594    perc = (float *) malloc( sizeof(float) * PC_lprin_calc ) ;
00595 
00596    printf("Num.  --Eigenvalue--  -Var.Fraction-  -Cumul.Fract.-\n") ;
00597    for( jj=0 ; jj < PC_lprin_calc ; jj++ ){
00598       ll = PC_lprin_calc - 1-jj ;      /* reversed order of eigensolution! */
00599       perc[jj] = wout[ll]/atrace ;
00600       sum     += perc[jj] ;
00601       printf("%4d  %14.7g  %14.7g  %14.7g\n",
00602              jj+1 , wout[ll] , perc[jj] , sum ) ;
00603    }
00604    fflush(stdout) ;
00605 
00606    /*--- form and save output dataset ---*/
00607 
00608    dset = PC_dset[0] ;
00609    new_dset = EDIT_empty_copy( dset ) ;
00610 
00611    if( PC_dsnum == 1 ) tross_Copy_History( dset , new_dset ) ;
00612    tross_Make_History( "3dpc" , argc,argv , new_dset ) ;
00613 
00614    EDIT_dset_items( new_dset,
00615                        ADN_prefix    , PC_prefix ,
00616                        ADN_nvals     , PC_lprin_save ,
00617                        ADN_ntt       , 0 ,
00618                        ADN_func_type , ISANAT(dset) ? ANAT_BUCK_TYPE
00619                                                     : FUNC_BUCK_TYPE ,
00620                     ADN_none ) ;
00621 
00622    if( THD_is_file(DSET_HEADNAME(new_dset)) ){
00623       fprintf(stderr,
00624               "\n*** Output dataset %s already exists--will be destroyed!\n",
00625               DSET_HEADNAME(new_dset) ) ;
00626 
00627    } else if( !PC_be_quiet ){
00628       printf("--- output dataset %s" , DSET_BRIKNAME(new_dset) ) ;
00629       fflush(stdout) ;
00630    }
00631 
00632    fout = (float *) malloc( sizeof(float) * nn ) ; /* output buffer */
00633 
00634    for( jj=0 ; jj < PC_lprin_save ; jj++ ){
00635       ll = PC_lprin_calc - 1-jj ;
00636 
00637       /** output = weighted sum of input datasets,
00638                    with weights from the ll'th eigenvector **/
00639 
00640       for( kk=0 ; kk < nn ; kk++ ) fout[kk] = 0.0 ;
00641 
00642       for( ii=0 ; ii < mm ; ii++ ){
00643          sum = VV(ii,ll) ; if( PC_normalize ) sum /= dsdev[ii] ;
00644 
00645          for( kk=0 ; kk < nn ; kk++ ) fout[kk] += XX(kk,ii) * sum ;
00646       }
00647 
00648       fmax = 0.0 ; npos = nneg = 0 ;
00649       for( kk=0 ; kk < nn ; kk++ ){
00650          ftem = fabs(fout[kk]) ; if( fmax < ftem ) fmax = ftem ;
00651               if( fout[kk] > 0 ) npos++ ;
00652          else if( fout[kk] < 0 ) nneg++ ;
00653       }
00654 
00655       if( PC_do_float ){
00656          if( nneg > npos )
00657             for( kk=0 ; kk < nn ; kk++ ) fout[kk] = -fout[kk] ;
00658 
00659          EDIT_substitute_brick( new_dset , jj , MRI_float , fout ) ;
00660 
00661          fout = (float *) malloc( sizeof(float) * nn ) ;  /* new buffer */
00662       } else {
00663 
00664          bout = (short *) malloc( sizeof(short) * nn ) ; /* output buffer */
00665          if( fmax != 0.0 ){
00666             fmax = 10000.49/fmax ; if( nneg > npos ) fmax = -fmax ;
00667             for( kk=0 ; kk < nn ; kk++ ) bout[kk] = fmax * fout[kk] ;
00668          } else {
00669             for( kk=0 ; kk < nn ; kk++ ) bout[kk] = 0.0 ;
00670          }
00671          EDIT_substitute_brick( new_dset , jj , MRI_short , bout ) ;
00672       }
00673 
00674       sprintf(vname,"var=%6.3f%%" , 100.0*perc[jj]+0.499 ) ;
00675       EDIT_BRICK_LABEL( new_dset , jj , vname ) ;
00676 
00677       if( !PC_be_quiet ){ printf(".") ; fflush(stdout); }
00678    }
00679    free(fout) ;
00680 
00681    DSET_write(new_dset) ;
00682    fprintf(stderr,"++ output dataset: %s\n",DSET_BRIKNAME(new_dset)) ;
00683    DSET_delete(new_dset) ;
00684    if( !PC_be_quiet ){ printf("!\n") ; fflush(stdout); }
00685 
00686    /*-- write eigenvectors also --*/
00687 
00688    mmmm  = mm + PC_1ddum ;
00689    vecim = mri_new( PC_lprin_save , mmmm , MRI_float ) ;
00690    fout  = MRI_FLOAT_PTR(vecim) ;
00691    for( jj=0 ; jj < PC_lprin_save ; jj++ ){
00692       ll = PC_lprin_calc - 1-jj ;
00693       for( ii=0 ; ii < PC_1ddum ; ii++ )
00694          fout[jj + ii*PC_lprin_save] = 999999.0 ;
00695       for( ii=0 ; ii < mm ; ii++ )
00696          fout[jj + (ii+PC_1ddum)*PC_lprin_save] = VV(ii,ll) ;
00697    }
00698    sprintf(vname,"%s.1D",PC_prefix) ;
00699    mri_write_ascii( vname, vecim ) ;
00700    mri_free(vecim) ;
00701 
00702    for( jj=0 ; jj < PC_lprin_save ; jj++ ){
00703       ll = PC_lprin_calc - 1-jj ;
00704       vecim = mri_new( 1 , mmmm , MRI_float ) ;
00705       fout  = MRI_FLOAT_PTR(vecim) ;
00706       for( ii=0 ; ii < PC_1ddum ; ii++ ) fout[ii] = 999999.0 ;
00707       for( ii=0 ; ii < mm ; ii++ ) fout[ii+PC_1ddum] = VV(ii,ll) ;
00708       sprintf(vname,"%s%02d.1D",PC_prefix,jj) ;
00709       mri_write_ascii( vname, vecim ) ;
00710       mri_free(vecim) ;
00711    }
00712 
00713 #if 0
00714    free(PC_dset) ;
00715    for( ii=0 ; ii < mm ; ii++ ) free(PC_brickdata[ii]) ;
00716    free(PC_brickdata) ;
00717    free(aa) ; free(wout) ; free(perc) ; if( dsdev!=NULL ) free(dsdev) ;
00718 #endif
00719 
00720    exit(0) ;
00721 }

void PC_read_opts int    argc,
char *    argv[]
 

Use EISPACK instead

Definition at line 81 of file 3dpc.c.

References argc, DSET_ARRAY, DSET_BRICK_TYPE, DSET_delete, DSET_load, DSET_LOADED, DSET_NVALS, DSET_NVOX, DSET_NX, DSET_NY, DSET_NZ, DSET_unload, DSET_unload_one, EDIT_coerce_type(), free, ISVALID_3DIM_DATASET, malloc, mc, MCW_strncpy, nz, PC_1ddum, PC_be_quiet, PC_brickdata, PC_brnum, PC_dmean, PC_do_float, PC_dsname, PC_dsnum, PC_lprin_save, PC_mask, PC_mask_hits, PC_mask_nvox, PC_normalize, PC_prefix, PC_syntax(), PC_vmean, PC_vnorm, THD_makemask(), THD_MAX_PREFIX, and THD_open_dataset().

Referenced by main().

00082 {
00083    int nopt = 1 ;
00084    float val ;
00085    int  kk, nx, ny, nz, nxyz, mm,nn ;
00086    THD_3dim_dataset * dset ;
00087 
00088    while( nopt < argc && argv[nopt][0] == '-' ){
00089 
00090       /**** -verbose ****/
00091 
00092       if( strncmp(argv[nopt],"-verbose",5) == 0 ){
00093          PC_be_quiet = 0 ;
00094          nopt++ ; continue ;
00095       }
00096 
00097       /**** -float ****/
00098 
00099       if( strncmp(argv[nopt],"-float",6) == 0 ){
00100          PC_do_float = 1 ;
00101          nopt++ ; continue ;
00102       }
00103 
00104       /**** -prefix prefix ****/
00105 
00106       if( strncmp(argv[nopt],"-prefix",6) == 0 ){
00107          nopt++ ;
00108          if( nopt >= argc ) PC_syntax("need argument after -prefix!") ;
00109          MCW_strncpy( PC_prefix , argv[nopt++] , THD_MAX_PREFIX ) ;
00110          continue ;
00111       }
00112 
00113       /**** -dmean ****/
00114 
00115       if( strncmp(argv[nopt],"-dmean",6) == 0 ){
00116          PC_dmean = 1 ;
00117          nopt++ ; continue ;
00118       }
00119 
00120       /**** -vmean ****/
00121 
00122       if( strncmp(argv[nopt],"-vmean",6) == 0 ){
00123          PC_vmean = 1 ;
00124          nopt++ ; continue ;
00125       }
00126 
00127       /**** -vnorm ****/
00128 
00129       if( strncmp(argv[nopt],"-vnorm",6) == 0 ){
00130          PC_vnorm = 1 ;
00131          nopt++ ; continue ;
00132       }
00133 
00134       /**** -normalize ****/
00135 
00136       if( strncmp(argv[nopt],"-normalize",6) == 0 ){
00137          PC_normalize = 1 ;
00138          nopt++ ; continue ;
00139       }
00140 
00141       /**** -pcsave # ****/
00142 
00143       if( strncmp(argv[nopt],"-pcsave",6) == 0 ){
00144          nopt++ ;
00145          if( nopt >= argc ) PC_syntax("need argument after -pcsave!") ;
00146          PC_lprin_save = strtol( argv[nopt] , NULL , 10 ) ;
00147          if( PC_lprin_save <  0 ) PC_syntax("value after -pcsave is illegal!") ;
00148          nopt++ ; continue ;
00149       }
00150 
00151       /**** -1ddum # ****/
00152 
00153       if( strncmp(argv[nopt],"-1ddum",6) == 0 ){
00154          nopt++ ;
00155          if( nopt >= argc ) PC_syntax("need argument after -1ddum!") ;
00156          PC_1ddum = strtol( argv[nopt] , NULL , 10 ) ;
00157          if( PC_1ddum < 0 ) PC_syntax("value after -1ddum is illegal!") ;
00158          nopt++ ; continue ;
00159       }
00160 
00161       /**** -mask mset [15 Sep 1999] ****/
00162 
00163       if( strncmp(argv[nopt],"-mask",5) == 0 ){
00164          THD_3dim_dataset * mset ; int ii,mc ;
00165          nopt++ ;
00166          if( nopt >= argc ) PC_syntax("need argument after -mask!") ;
00167          mset = THD_open_dataset( argv[nopt] ) ;
00168          if( mset == NULL ) PC_syntax("can't open -mask dataset!") ;
00169          PC_mask = THD_makemask( mset , 0 , 1.0,0.0 ) ;
00170          PC_mask_nvox = DSET_NVOX(mset) ;
00171          DSET_delete(mset) ;
00172          if( PC_mask == NULL ) PC_syntax("can't use -mask dataset!") ;
00173          for( ii=mc=0 ; ii < PC_mask_nvox ; ii++ ) if( PC_mask[ii] ) mc++ ;
00174          if( mc == 0 ) PC_syntax("mask is all zeros!") ;
00175          printf("--- %d voxels in mask\n",mc) ;
00176          PC_mask_hits = mc ;
00177          nopt++ ; continue ;
00178       }
00179 
00180       /**** unknown switch ****/
00181 
00182       fprintf(stderr,"\n*** unrecognized option %s\n",argv[nopt]) ;
00183       exit(1) ;
00184 
00185    }  /* end of loop over options */
00186 
00187    /*--- a simple consistency check ---*/
00188 
00189    if( PC_vmean && PC_dmean )
00190       PC_syntax("can't have both -dmean and -vmean!") ;
00191 
00192    /*--- rest of inputs are dataset names ---*/
00193 
00194    PC_dsnum  = argc - nopt ;
00195    if( PC_dsnum < 1 ) PC_syntax("no input dataset names?") ;
00196 
00197    PC_dsname = (char **) malloc( sizeof(char *) * PC_dsnum ) ;
00198    for( kk=0 ; kk < PC_dsnum ; kk++ ) PC_dsname[kk] = argv[kk+nopt] ;
00199 
00200    PC_dset = (THD_3dim_dataset **) malloc( sizeof(THD_3dim_dataset *) * PC_dsnum ) ;
00201    for( kk=0 ; kk < PC_dsnum ; kk++ ){
00202       PC_dset[kk] = dset = THD_open_dataset( PC_dsname[kk] ) ;  /* allow for selector */
00203       if( !ISVALID_3DIM_DATASET(dset) ){
00204          fprintf(stderr,"\n*** can't open dataset file %s\n",PC_dsname[kk]) ;
00205          exit(1) ;
00206       }
00207       PC_brnum += DSET_NVALS(dset) ;
00208    }
00209    if( PC_brnum < 2 ) PC_syntax("need at least 2 input bricks!") ;
00210 
00211    /*--- another consistency check ---*/
00212 
00213    if( PC_lprin_save <= 0 )
00214       PC_lprin_save = PC_brnum ;
00215    else if( PC_lprin_save > PC_brnum )
00216       PC_syntax("can't save more components than input bricks!") ;
00217 
00218    /*--- load bricks for all input datasets ---*/
00219 
00220    nx = DSET_NX(PC_dset[0]) ;
00221    ny = DSET_NY(PC_dset[0]) ;
00222    nz = DSET_NZ(PC_dset[0]) ;
00223    nxyz = nx * ny * nz ;      /* Total number of voxels per brick */
00224 
00225    /* 15 Sep 1999: check if mask is right size */
00226 
00227    if( PC_mask_nvox > 0 && PC_mask_nvox != nxyz )
00228       PC_syntax("mask and input dataset bricks don't match in size!") ;
00229 
00230    PC_brickdata = (float **) malloc( sizeof(float *) * PC_brnum ) ;
00231 
00232    nn = 0 ; /* current brick index */
00233 
00234    if( !PC_be_quiet ){ printf("--- read dataset bricks"); fflush(stdout); }
00235 
00236    for( kk=0 ; kk < PC_dsnum ; kk++ ){
00237 
00238       if( DSET_NVOX(PC_dset[kk]) != nxyz ) {
00239          fprintf(stderr,
00240                  "\n*** dataset in file %s nonconformant with first dataset!\n"
00241                  "    nx1=%d ny1=%d nz1=%d nx=%d ny=%d nz=%d\n",
00242                  PC_dsname[kk], nx, ny, nz ,
00243                  DSET_NX(PC_dset[kk]), DSET_NY(PC_dset[kk]), DSET_NZ(PC_dset[kk]) ) ;
00244          exit(1) ;
00245       }
00246 
00247       DSET_load( PC_dset[kk] ) ;
00248       if( !DSET_LOADED( PC_dset[kk] ) ){
00249          fprintf(stderr,"\n*** Can't load dataset %s BRIK from disk!\n",PC_dsname[kk]) ;
00250          exit(1) ;
00251       }
00252       if( !PC_be_quiet ){ printf("+"); fflush(stdout); }
00253 
00254       /* copy brick data into float storage */
00255 
00256       for( mm=0 ; mm < DSET_NVALS(PC_dset[kk]) ; mm++,nn++ ){
00257 
00258          PC_brickdata[nn] = (float *) malloc( sizeof(float) * nxyz ) ;
00259 
00260          if( PC_brickdata[nn] == NULL )
00261             PC_syntax("*** can't malloc intermediate storage") ;
00262 
00263          EDIT_coerce_type( nxyz , DSET_BRICK_TYPE(PC_dset[kk],mm) ,
00264                                   DSET_ARRAY(PC_dset[kk],mm) ,
00265                            MRI_float , PC_brickdata[nn] ) ;
00266 
00267          DSET_unload_one( PC_dset[kk] , mm ) ;
00268 
00269          if( PC_mask != NULL ){             /* 15 Sep 1999 */
00270             int kk ;
00271             for( kk=0 ; kk < nxyz ; kk++ )
00272                if( !PC_mask[kk] ) PC_brickdata[nn][kk] = 0.0 ;
00273          }
00274 
00275          if( !PC_be_quiet ){ printf("."); fflush(stdout); }
00276       }
00277 
00278       if( kk == 0 ){
00279          DSET_unload( PC_dset[kk] ) ;  /* don't need dataset's data anymore */
00280       } else {
00281          DSET_delete( PC_dset[kk] ) ;  /* don't need this at all anymore */
00282          PC_dset[kk] = NULL ;
00283       }
00284 
00285    }
00286    if( !PC_be_quiet ){ printf("\n"); fflush(stdout); }
00287 
00288    free( PC_dsname ) ; PC_dsname = NULL ;
00289    return ;
00290 }

void PC_read_opts int   ,
char **   
 

void PC_syntax char *   
 

Definition at line 294 of file 3dpc.c.

References MASTER_SHORTHELP_STRING.

Referenced by main(), and PC_read_opts().

00295 {
00296    if( msg != NULL ){ fprintf(stderr,"\n*** %s\n",msg) ; exit(1) ; }
00297 
00298    printf(
00299     "Principal Component Analysis of 3D Datasets\n"
00300     "Usage: 3dpc [options] dataset dataset ...\n"
00301     "\n"
00302     "Each input dataset may have a sub-brick selector list.\n"
00303     "Otherwise, all sub-bricks from a dataset will be used.\n"
00304     "\n"
00305     "OPTIONS:\n"
00306     "  -dmean        = remove the mean from each input brick (across space)\n"
00307     "  -vmean        = remove the mean from each input voxel (across bricks)\n"
00308     "                    [N.B.: -dmean and -vmean are mutually exclusive]\n"
00309     "                    [default: don't remove either mean]\n"
00310     "  -vnorm        = L2 normalize each input voxel time series\n"
00311     "                    [occurs after the de-mean operations above,]\n"
00312     "                    [and before the brick normalization below. ]\n"
00313     "  -normalize    = L2 normalize each input brick (after mean subtraction)\n"
00314     "                    [default: don't normalize]\n"
00315     "  -pcsave sss   = 'sss' is the number of components to save in the output;\n"
00316     "                    it can't be more than the number of input bricks\n"
00317     "                    [default = all of them = number of input bricks]\n"
00318     "  -prefix pname = Name for output dataset (will be a bucket type);\n"
00319     "                    also, the eigen-timeseries will be in 'pname'.1D\n"
00320     "                    (all of them) and in 'pnameNN.1D' for eigenvalue\n"
00321     "                    #NN individually (NN=00 .. 'sss'-1, corresponding\n"
00322     "                    to the brick index in the output dataset)\n"
00323     "                    [default value of pname = 'pc']\n"
00324     "  -1ddum ddd    = Add 'ddd' dummy lines to the top of each *.1D file.\n"
00325     "                    These lines will have the value 999999, and can\n"
00326     "                    be used to align the files appropriately.\n"
00327     "                    [default value of ddd = 0]\n"
00328     "  -verbose      = Print progress reports during the computations\n"
00329     "  -float        = Save eigen-bricks as floats\n"
00330     "                    [default = shorts, scaled so that |max|=10000]\n"
00331     "  -mask mset    = Use the 0 sub-brick of dataset 'mset' as a mask\n"
00332     "                    to indicate which voxels to analyze (a sub-brick\n"
00333     "                    selector is allowed) [default = use all voxels]\n"
00334    ) ;
00335 
00336    printf("\n" MASTER_SHORTHELP_STRING ) ;
00337 
00338    exit(0) ;
00339 }

Variable Documentation

int PC_1ddum = 0 [static]
 

Definition at line 27 of file 3dpc.c.

Referenced by main(), and PC_read_opts().

int PC_be_quiet = 1 [static]
 

Definition at line 21 of file 3dpc.c.

Referenced by main(), and PC_read_opts().

float** PC_brickdata [static]
 

Definition at line 35 of file 3dpc.c.

Referenced by main(), and PC_read_opts().

int PC_brnum = 0 [static]
 

Definition at line 26 of file 3dpc.c.

Referenced by main(), and PC_read_opts().

int PC_dmean = 0 [static]
 

inputs *

Definition at line 16 of file 3dpc.c.

Referenced by PC_read_opts().

int PC_do_float = 0 [static]
 

Definition at line 22 of file 3dpc.c.

Referenced by PC_read_opts().

THD_3dim_dataset** PC_dset = NULL [static]
 

Definition at line 31 of file 3dpc.c.

char** PC_dsname = NULL [static]
 

Definition at line 24 of file 3dpc.c.

Referenced by PC_read_opts().

int PC_dsnum = 0 [static]
 

Definition at line 25 of file 3dpc.c.

Referenced by main(), and PC_read_opts().

int PC_lprin_save = 0 [static]
 

Definition at line 20 of file 3dpc.c.

Referenced by main(), and PC_read_opts().

byte* PC_mask = NULL [static]
 

Definition at line 37 of file 3dpc.c.

Referenced by main(), and PC_read_opts().

int PC_mask_hits = 0 [static]
 

Definition at line 39 of file 3dpc.c.

Referenced by main(), and PC_read_opts().

int PC_mask_nvox = 0 [static]
 

Definition at line 38 of file 3dpc.c.

Referenced by PC_read_opts().

int PC_normalize = 0 [static]
 

Definition at line 19 of file 3dpc.c.

Referenced by PC_read_opts().

char PC_prefix[THD_MAX_PREFIX] = "pc" [static]
 

Definition at line 33 of file 3dpc.c.

Referenced by main(), and PC_read_opts().

int PC_vmean = 0 [static]
 

Definition at line 17 of file 3dpc.c.

Referenced by PC_read_opts().

int PC_vnorm = 0 [static]
 

Definition at line 18 of file 3dpc.c.

Referenced by PC_read_opts().

 

Powered by Plone

This site conforms to the following standards: