Doxygen Source Code Documentation
3dTcat.c File Reference
#include "mrilib.h"Go to the source code of this file.
Defines | |
| #define | DSUB(id) DSET_IN_3DARR(TCAT_dsar,(id)) |
| #define | NSUBV(id) ( ((int *)TCAT_subv->ar[(id)])[0] ) |
| #define | SUBV(id, jj) ( ((int *)TCAT_subv->ar[(id)])[(jj)+1] ) |
| #define | BACKASS |
| #define | ROUND(qq) ((short)rint((qq))) |
Functions | |
| void | TCAT_read_opts (int, char **) |
| void | TCAT_Syntax (void) |
| int * | TCAT_get_subv (int, char *) |
| void | TCAT_read_opts (int argc, char *argv[]) |
| int | main (int argc, char *argv[]) |
Variables | |
| THD_3dim_dataset_array * | TCAT_dsar = NULL |
| XtPointer_array * | TCAT_subv = NULL |
| int | TCAT_nvox = -1 |
| int | TCAT_dry = 0 |
| int | TCAT_verb = 0 |
| int | TCAT_type = -1 |
| int | TCAT_glue = 0 |
| int | TCAT_rlt = 0 |
| int | TCAT_rqt = 0 |
| int | TCAT_rct = 0 |
| char | TCAT_output_prefix [THD_MAX_PREFIX] = "tcat" |
| char | TCAT_session [THD_MAX_NAME] = "./" |
Define Documentation
|
|
|
|
|
Definition at line 40 of file 3dTcat.c. Referenced by main(). |
|
|
|
|
|
|
|
|
|
Function Documentation
|
||||||||||||
|
---------- Adapted from 3dZeropad.c by RWCox - 08 Aug 2001 ----------* Definition at line 513 of file 3dTcat.c. References a2, addto_args(), ADN_brick_fac_one, ADN_brick_keywords_append_one, ADN_brick_keywords_replace_one, ADN_brick_label_one, ADN_brick_stataux_one, ADN_directory_name, ADN_func_type, ADN_none, ADN_ntt, ADN_nvals, ADN_prefix, ADN_ttdel, ADN_ttdur, ADN_ttorg, ADN_tunits, ADN_type, AFNI_logger(), ANAT_EPI_TYPE, argc, DATABLOCK_MEM_MALLOC, THD_3dim_dataset::daxes, THD_3dim_dataset::dblk, DSET_ARRAY, DSET_BRICK, DSET_BRICK_FACTOR, DSET_BRICK_KEYWORDS, DSET_BRICK_LABEL, DSET_BRICK_STATAUX, DSET_BRICK_STATCODE, DSET_BRICK_TYPE, DSET_BRIKNAME, DSET_FILECODE, DSET_HEADNAME, DSET_load, DSET_LOADED, DSET_NVALS, DSET_PREFIX, DSET_TIMEDURATION, DSET_TIMEORIGIN, DSET_TIMESTEP, DSET_TIMEUNITS, DSUB, EDIT_dset_items(), EDIT_empty_copy(), EDIT_substitute_brick(), EQUIV_DATAXES, free, FUNC_FIM_TYPE, FUNC_IS_STAT, THD_3dim_dataset::func_type, THD_3dim_dataset::idcode, ISANATTYPE, ISBUCKET, ISFUNC, THD_3dim_dataset::keywords, machdep(), mainENTRY, malloc, mri_free(), myXtFree, NSUBV, THD_3dim_dataset_array::num, PRINT_VERSION, THD_3dim_dataset::stat_aux, SUBV, TCAT_dry, TCAT_glue, TCAT_nvox, TCAT_output_prefix, TCAT_read_opts(), TCAT_rlt, TCAT_session, TCAT_Syntax(), TCAT_type, TCAT_verb, THD_force_malloc_type(), THD_is_file(), THD_load_statistics(), THD_write_3dim_dataset(), TR, tross_Make_History(), and UNITS_SEC_TYPE.
00514 {
00515 int ninp , ids , nv , iv,jv,kv , ivout , new_nvals , ivbot,ivtop ;
00516 THD_3dim_dataset * new_dset=NULL , * dset ;
00517 char buf[256] ;
00518 float * rlt0=NULL , *rlt1=NULL ;
00519 float *rltsum=NULL ; /* 16 Sep 1999 */
00520 int nrltsum ;
00521
00522 /*** read input options ***/
00523
00524 if( argc < 2 || strncmp(argv[1],"-help",4) == 0 ) TCAT_Syntax() ;
00525
00526 /*-- 20 Apr 2001: addto the arglist, if user wants to [RWCox] --*/
00527
00528 mainENTRY("3dTcat main"); machdep() ; PRINT_VERSION("3dTcat") ;
00529
00530 { int new_argc ; char ** new_argv ;
00531 addto_args( argc , argv , &new_argc , &new_argv ) ;
00532 if( new_argv != NULL ){ argc = new_argc ; argv = new_argv ; }
00533 }
00534
00535 AFNI_logger("3dTcat",argc,argv) ;
00536
00537 TCAT_read_opts( argc , argv ) ;
00538
00539 /*** create new dataset (empty) ***/
00540
00541 ninp = TCAT_dsar->num ;
00542 if( ninp < 1 ){
00543 fprintf(stderr,"*** No input datasets?\n") ; exit(1) ;
00544 }
00545
00546 new_nvals = 0 ;
00547 for( ids=0 ; ids < ninp ; ids++ ) new_nvals += NSUBV(ids) ;
00548
00549 if( new_nvals < 2 ){
00550 fprintf(stderr,
00551 "*** Can't create 3D+time dataset with only %d sub-bricks!\n",
00552 new_nvals) ;
00553 exit(1) ;
00554 }
00555
00556 if( TCAT_verb ) printf("-verb: output will have %d sub-bricks\n",new_nvals) ;
00557
00558 /** find 1st dataset that is time dependent **/
00559
00560 for( ids=0 ; ids < ninp ; ids++ ){
00561 dset = DSUB(ids) ;
00562 if( DSET_TIMESTEP(dset) > 0.0 ) break ;
00563 }
00564 if( ids == ninp ){ ids = 0 ; dset = DSUB(0) ; }
00565
00566 new_dset = EDIT_empty_copy( dset ) ; /* make a copy of its header */
00567
00568 /* 23 May 2005: check for axis consistency */
00569
00570 for( iv=0 ; iv < ninp ; iv++ ){
00571 if( iv != ids && !EQUIV_DATAXES(new_dset->daxes,DSUB(iv)->daxes) )
00572 fprintf(stderr,"++ WARNING: %s grid mismatch with %s\n",
00573 DSET_BRIKNAME(dset) , DSET_BRIKNAME(DSUB(iv)) ) ;
00574 }
00575
00576 tross_Make_History( "3dTcat" , argc,argv , new_dset ) ;
00577
00578 /* modify its header */
00579
00580 EDIT_dset_items( new_dset ,
00581 ADN_prefix , TCAT_output_prefix ,
00582 ADN_directory_name, TCAT_session ,
00583 ADN_type , TCAT_type ,
00584 ADN_func_type , ISANATTYPE(TCAT_type) ? ANAT_EPI_TYPE
00585 : FUNC_FIM_TYPE ,
00586 ADN_ntt , new_nvals , /* both ntt and nvals */
00587 ADN_nvals , new_nvals , /* must be altered */
00588 ADN_none ) ;
00589
00590 /* check if we have a valid time axis; if not, make one up */
00591
00592 if( DSET_TIMESTEP(new_dset) <= 0.0 ){
00593 float TR = 1.0 ;
00594 float torg = 0.0 , tdur = 0.0 ;
00595 int tunits = UNITS_SEC_TYPE ;
00596
00597 #if 0
00598 for( ids=0 ; ids < ninp ; ids++ ){
00599 dset = DSUB(ids) ;
00600 if( DSET_TIMESTEP(dset) > 0.0 ){
00601 TR = DSET_TIMESTEP(dset) ; tunits = DSET_TIMEUNITS(dset) ;
00602 torg = DSET_TIMEORIGIN(dset) ; tdur = DSET_TIMEDURATION(dset) ;
00603 break ;
00604 }
00605 }
00606 #endif
00607
00608 EDIT_dset_items( new_dset ,
00609 ADN_tunits , tunits ,
00610 ADN_ttdel , TR ,
00611 ADN_ttorg , torg ,
00612 ADN_ttdur , tdur ,
00613 ADN_none ) ;
00614 }
00615
00616 /* can't re-write existing dataset, unless glueing is used */
00617
00618 if (! TCAT_glue){
00619 if( THD_is_file(DSET_HEADNAME(new_dset)) ){
00620 fprintf(stderr,"*** Fatal error: file %s already exists!\n",
00621 DSET_HEADNAME(new_dset) ) ;
00622 exit(1) ;
00623 }
00624 } else { /* if glueing is used, make the 'new'
00625 dataset have the same idcode as the old one */
00626
00627 new_dset->idcode = DSUB(0) -> idcode ; /* copy the struct */
00628 }
00629
00630 THD_force_malloc_type( new_dset->dblk , DATABLOCK_MEM_MALLOC ) ;
00631
00632 /*** if needed, create space for detrending ***/
00633
00634 if( TCAT_rlt ){
00635 rlt0 = (float *) malloc( sizeof(float) * TCAT_nvox ) ;
00636 rlt1 = (float *) malloc( sizeof(float) * TCAT_nvox ) ;
00637 if( rlt0 == NULL || rlt1 == NULL ){
00638 fprintf(stderr,"*** Error: can't malloc memory for detrending!\n") ;
00639 exit(1) ;
00640 }
00641
00642 if( TCAT_rlt == 3 ){
00643 rltsum = (float *) malloc( sizeof(float) * TCAT_nvox ) ;
00644 if( rltsum == NULL ){
00645 fprintf(stderr,"*** Error: can't malloc memory for detrending!\n") ;
00646 exit(1) ;
00647 }
00648 for( iv=0 ; iv < TCAT_nvox ; iv++ ) rltsum[iv] = 0.0 ;
00649 nrltsum = 0 ;
00650 }
00651 }
00652
00653 /*** loop over input datasets ***/
00654
00655 if( ninp > 1 ) myXtFree( new_dset->keywords ) ;
00656
00657 ivout = 0 ;
00658 for( ids=0 ; ids < ninp ; ids++ ){
00659 dset = DSUB(ids) ;
00660 nv = NSUBV(ids) ;
00661
00662 if( ! TCAT_dry ){
00663 if( TCAT_verb ) printf("-verb: loading %s\n",DSET_FILECODE(dset)) ;
00664 DSET_load(dset) ;
00665 if( ! DSET_LOADED(dset) ){
00666 fprintf(stderr,"*** Fatal error: can't load data from %s\n",
00667 DSET_FILECODE(dset)) ;
00668 exit(1) ;
00669 }
00670 }
00671
00672 /** loop over sub-bricks to output **/
00673
00674 ivbot = ivout ; /* save this for later */
00675 for( iv=0 ; iv < nv ; iv++ ){
00676 jv = SUBV(ids,iv) ; /* which sub-brick to use */
00677
00678 if( ! TCAT_dry ){
00679 EDIT_substitute_brick( new_dset , ivout ,
00680 DSET_BRICK_TYPE(dset,jv) , DSET_ARRAY(dset,jv) ) ;
00681
00682 /*----- If this sub-brick is from a bucket dataset,
00683 preserve the label for this sub-brick -----*/
00684
00685 if( ISBUCKET(dset) )
00686 sprintf (buf, "%s", DSET_BRICK_LABEL(dset,jv));
00687 else
00688 sprintf(buf,"%.12s[%d]",DSET_PREFIX(dset),jv) ;
00689 EDIT_dset_items( new_dset, ADN_brick_label_one+ivout, buf, ADN_none );
00690
00691 sprintf(buf,"%s[%d]",DSET_FILECODE(dset),jv) ;
00692 EDIT_dset_items(
00693 new_dset, ADN_brick_keywords_replace_one+ivout, buf, ADN_none ) ;
00694
00695 EDIT_dset_items(
00696 new_dset ,
00697 ADN_brick_fac_one +ivout, DSET_BRICK_FACTOR(dset,jv),
00698 ADN_brick_keywords_append_one+ivout, DSET_BRICK_KEYWORDS(dset,jv),
00699 ADN_none ) ;
00700
00701 /** possibly write statistical parameters for this sub-brick **/
00702
00703 kv = DSET_BRICK_STATCODE(dset,jv) ;
00704
00705 if( FUNC_IS_STAT(kv) ){ /* input sub-brick has stat params */
00706
00707 int npar = FUNC_need_stat_aux[kv] , lv ;
00708 float * par = (float *) malloc( sizeof(float) * (npar+2) ) ;
00709 float * sax = DSET_BRICK_STATAUX(dset,jv) ;
00710 par[0] = kv ;
00711 par[1] = npar ;
00712 for( lv=0 ; lv < npar ; lv++ )
00713 par[lv+2] = (sax != NULL) ? sax[lv] : 0.0 ;
00714
00715 EDIT_dset_items(new_dset ,
00716 ADN_brick_stataux_one+ivout , par ,
00717 ADN_none ) ;
00718 free(par) ;
00719 #if 0
00720 /* 2: if the input dataset has statistical parameters */
00721
00722 } else if( ISFUNC(dset) && /* dset has stat */
00723 FUNC_IS_STAT(dset->func_type) && /* params */
00724 jv == FUNC_ival_thr[dset->func_type] ){ /* thr sub-brick */
00725
00726 int npar , lv ;
00727 float * par , * sax ;
00728 kv = dset->func_type ;
00729 npar = FUNC_need_stat_aux[kv] ;
00730 par = (float *) malloc( sizeof(float) * (npar+2) ) ;
00731 sax = dset->stat_aux ;
00732 par[0] = kv ;
00733 par[1] = npar ;
00734 for( lv=0 ; lv < npar ; lv++ )
00735 par[lv+2] = (sax != NULL) ? sax[lv] : 0.0 ;
00736
00737 EDIT_dset_items(new_dset ,
00738 ADN_brick_stataux_one+ivout , par ,
00739 ADN_none ) ;
00740 free(par) ;
00741 #endif
00742 }
00743
00744 /** print a message? **/
00745
00746 if( TCAT_verb > 1 ) printf("-verb: copied %s[%d] into %s[%d]\n" ,
00747 DSET_FILECODE(dset) , jv ,
00748 DSET_FILECODE(new_dset) , ivout ) ;
00749 } else {
00750 printf("-dry: would copy %s[%d] into %s[%d]\n" ,
00751 DSET_FILECODE(dset) , jv ,
00752 DSET_FILECODE(new_dset) , ivout ) ;
00753 }
00754
00755 ivout++ ;
00756 }
00757 ivtop = ivout ; /* new_dset[ivbot..ivtop-1] are from the current dataset */
00758
00759 /** loop over all bricks in input dataset and
00760 unload them if they aren't going into the output
00761 (not required, but is done to economize on memory) **/
00762
00763 if( ! TCAT_dry && nv < DSET_NVALS(dset) ){
00764
00765 for( kv=0 ; kv < DSET_NVALS(dset) ; kv++ ){ /* all input sub-bricks */
00766 for( iv=0 ; iv < nv ; iv++ ){ /* all output sub-bricks */
00767 jv = SUBV(ids,iv) ;
00768 if( jv == kv ) break ; /* input matches output */
00769 }
00770 if( iv == nv ){
00771 mri_free( DSET_BRICK(dset,kv) ) ;
00772 #if 0
00773 if( TCAT_verb ) printf("-verb: unloaded unused %s[%d]\n" ,
00774 DSET_FILECODE(dset) , kv ) ;
00775 #endif
00776 }
00777 }
00778 }
00779
00780 /*** remove linear trend? ***/
00781
00782 if( TCAT_rlt ){
00783
00784 /* have enough data? */
00785
00786 if( ivtop-ivbot < 3 ){
00787 if( TCAT_verb )
00788 printf("-verb: skipping -rlt for %s\n",DSET_FILECODE(dset)) ;
00789
00790 } else {
00791 float c0,c1,c2 , det , a0,a1,a2 , qq ;
00792 int iv , ns , kk , err=0 ;
00793
00794 if( TCAT_verb )
00795 printf("-verb: applying -rlt to data from %s\n",DSET_FILECODE(dset)) ;
00796
00797 /* compute weighting coefficients */
00798
00799 ns = ivtop - ivbot ; /* number of sub-bricks */
00800 c0 = ns ; /* sum[ 1 ] */
00801 c1 = 0.5 * ns * (ns-1) ; /* sum[ qq ] */
00802 c2 = 0.16666667 * ns * (ns-1) * (2*ns-1) ; /* sum[ qq*qq ] */
00803 det = c0*c2 - c1*c1 ;
00804 a0 = c2 / det ; /* -1 */
00805 a1 = -c1 / det ; /* [ c0 c1 ] */
00806 a2 = c0 / det ; /* [ c1 c2 ] */
00807
00808 /* set voxel sums to 0 */
00809
00810 for( iv=0 ; iv < TCAT_nvox ; iv++ ) rlt0[iv] = rlt1[iv] = 0.0 ;
00811
00812 /* compute voxel sums */
00813
00814 for( kk=ivbot ; kk < ivtop ; kk++ ){
00815 qq = kk - ivbot ;
00816 switch( DSET_BRICK_TYPE(new_dset,kk) ){
00817 default:
00818 err = 1 ;
00819 fprintf(stderr,
00820 "*** Warning: -rlt can't use datum type %s from %s\n",
00821 MRI_TYPE_name[DSET_BRICK_TYPE(new_dset,kk)] ,
00822 DSET_FILECODE(dset) ) ;
00823 break ;
00824
00825 case MRI_short:{
00826 short * bar = (short *) DSET_ARRAY(new_dset,kk) ;
00827 float fac = DSET_BRICK_FACTOR(new_dset,kk) ;
00828
00829 if( fac == 0.0 ) fac = 1.0 ;
00830 for( iv=0 ; iv < TCAT_nvox ; iv++ ){
00831 rlt0[iv] += (fac * bar[iv]) ; /* sum of voxel */
00832 rlt1[iv] += (fac * bar[iv]) * qq ; /* sum of voxel*qq */
00833 }
00834 }
00835 break ;
00836
00837 case MRI_float:{
00838 float * bar = (float *) DSET_ARRAY(new_dset,kk) ;
00839 float fac = DSET_BRICK_FACTOR(new_dset,kk) ;
00840
00841 if( fac == 0.0 ) fac = 1.0 ;
00842 for( iv=0 ; iv < TCAT_nvox ; iv++ ){
00843 rlt0[iv] += (fac * bar[iv]) ;
00844 rlt1[iv] += (fac * bar[iv]) * qq ;
00845 }
00846 }
00847 break ;
00848 }
00849 if( err ) break ;
00850 } /* end of loop over sub-bricks */
00851
00852 /* only do the detrending if no errors happened */
00853
00854 if( !err ){
00855 float qmid = 0.0 ; /* 16 Sep 1999 */
00856
00857 for( iv=0 ; iv < TCAT_nvox ; iv++ ){ /* transform voxel sums */
00858 c0 = a0 * rlt0[iv] + a1 * rlt1[iv] ;
00859 c1 = a1 * rlt0[iv] + a2 * rlt1[iv] ;
00860 rlt0[iv] = c0 ; rlt1[iv] = c1 ;
00861 }
00862
00863 if( TCAT_rlt == 2 ){ /* 16 Sep 1999 */
00864 qmid = 0.5 * (ns-1) ;
00865 for( iv=0 ; iv < TCAT_nvox ; iv++ ) rlt0[iv] = 0.0 ;
00866 } else if( TCAT_rlt == 3 ){
00867 nrltsum += ns ;
00868 for( iv=0 ; iv < TCAT_nvox ; iv++ )
00869 rltsum[iv] += (rlt0[iv] + (0.5*ns)*rlt1[iv])*ns ;
00870 }
00871
00872 for( kk=ivbot ; kk < ivtop ; kk++ ){ /* detrend */
00873 qq = kk - ivbot ;
00874 switch( DSET_BRICK_TYPE(new_dset,kk) ){
00875
00876 #undef ROUND
00877 #define ROUND(qq) ((short)rint((qq)))
00878
00879 case MRI_short:{
00880 short * bar = (short *) DSET_ARRAY(new_dset,kk) ;
00881 float fac = DSET_BRICK_FACTOR(new_dset,kk) , val,finv ;
00882
00883 if( fac == 0.0 ) fac = 1.0 ;
00884 finv = 1.0 / fac ;
00885 for( iv=0 ; iv < TCAT_nvox ; iv++ ){
00886 val = fac*bar[iv] - rlt0[iv] - rlt1[iv]*(qq-qmid) ;
00887 bar[iv] = ROUND(finv*val) ;
00888 }
00889 }
00890 break ;
00891
00892 case MRI_float:{
00893 float * bar = (float *) DSET_ARRAY(new_dset,kk) ;
00894 float fac = DSET_BRICK_FACTOR(new_dset,kk) , val,finv ;
00895
00896 if( fac == 0.0 ) fac = 1.0 ;
00897 finv = 1.0 / fac ;
00898 for( iv=0 ; iv < TCAT_nvox ; iv++ ){
00899 val = fac*bar[iv] - rlt0[iv] - rlt1[iv]*(qq-qmid) ;
00900 bar[iv] = (finv*val) ;
00901 #if 0
00902 fprintf(stderr,"kk=%d iv=%d bar=%g rlt0=%g rlt1=%g qq=%g qmid=%g val=%g\n",
00903 kk,iv,bar[iv],rlt0[iv],rlt1[iv],qq,qmid,val) ;
00904 #endif
00905 }
00906 }
00907 break ;
00908 }
00909 }
00910 }
00911 }
00912 } /* end of -rlt */
00913
00914 } /* end of loop over input datasets */
00915
00916 /* 16 Sep 1999: add overall average back in */
00917
00918 if( TCAT_rlt == 3 && rltsum != NULL && nrltsum > 0 ){
00919 float scl = 1.0/nrltsum ; int kk ;
00920
00921 for( iv=0 ; iv < TCAT_nvox ; iv++ ) rltsum[iv] *= scl ;
00922
00923 for( kk=0 ; kk < new_nvals ; kk++ ){
00924 switch( DSET_BRICK_TYPE(new_dset,kk) ){
00925 case MRI_short:{
00926 short * bar = (short *) DSET_ARRAY(new_dset,kk) ;
00927 float fac = DSET_BRICK_FACTOR(new_dset,kk) , val,finv ;
00928
00929 if( fac == 0.0 ) fac = 1.0 ;
00930 finv = 1.0 / fac ;
00931 for( iv=0 ; iv < TCAT_nvox ; iv++ ){
00932 val = fac*bar[iv] + rltsum[iv] ; bar[iv] = ROUND(finv*val) ;
00933 }
00934 }
00935 break ;
00936
00937 case MRI_float:{
00938 float * bar = (float *) DSET_ARRAY(new_dset,kk) ;
00939 float fac = DSET_BRICK_FACTOR(new_dset,kk) , val,finv ;
00940
00941 if( fac == 0.0 ) fac = 1.0 ;
00942 finv = 1.0 / fac ;
00943 for( iv=0 ; iv < TCAT_nvox ; iv++ ){
00944 val = fac*bar[iv] + rltsum[iv] ; bar[iv] = (finv*val) ;
00945 }
00946 }
00947 break ;
00948 }
00949 }
00950 }
00951
00952 if( TCAT_rlt ){ free(rlt0); free(rlt1); if(rltsum!=NULL)free(rltsum); }
00953
00954 if( ! TCAT_dry ){
00955 if( TCAT_verb ) fprintf(stderr,"-verb: computing sub-brick statistics\n") ;
00956 THD_load_statistics( new_dset ) ;
00957
00958 THD_write_3dim_dataset( NULL,NULL , new_dset , True ) ;
00959 if( TCAT_verb ) fprintf(stderr,"-verb: Wrote output to %s\n",
00960 DSET_BRIKNAME(new_dset) ) ;
00961 }
00962
00963 exit(0) ;
00964 }
|
|
||||||||||||
|
Definition at line 299 of file 3dTcat.c. References myXtFree, XtMalloc, and XtRealloc. Referenced by TCAT_read_opts().
00300 {
00301 int * subv = NULL ;
00302 int ii , ipos , nout , slen ;
00303 int ibot,itop,istep , nused ;
00304 char * cpt ;
00305
00306 /* Meaningless input? */
00307
00308 if( nvals < 1 ) return NULL ;
00309
00310 /* No selection list ==> select it all */
00311
00312 if( str == NULL || str[0] == '\0' ){
00313 subv = (int *) XtMalloc( sizeof(int) * (nvals+1) ) ;
00314 subv[0] = nvals ;
00315 for( ii=0 ; ii < nvals ; ii++ ) subv[ii+1] = ii ;
00316 return subv ;
00317 }
00318
00319 /* skip initial '[' */
00320
00321 subv = (int *) XtMalloc( sizeof(int) * 2 ) ;
00322 subv[0] = nout = 0 ;
00323
00324 ipos = 0 ;
00325 if( str[ipos] == '[' ) ipos++ ;
00326
00327 /*** loop through each sub-selector until end of input ***/
00328
00329 slen = strlen(str) ;
00330 while( ipos < slen && str[ipos] != ']' ){
00331
00332 /** get starting value **/
00333
00334 if( str[ipos] == '$' ){ /* special case */
00335 ibot = nvals-1 ; ipos++ ;
00336 } else { /* decode an integer */
00337 ibot = strtol( str+ipos , &cpt , 10 ) ;
00338 if( ibot < 0 ){ myXtFree(subv) ; return NULL ; }
00339 if( ibot >= nvals ) ibot = nvals-1 ;
00340 nused = (cpt-(str+ipos)) ;
00341 if( ibot == 0 && nused == 0 ){ myXtFree(subv) ; return NULL ; }
00342 ipos += nused ;
00343 }
00344
00345 /** if that's it for this sub-selector, add one value to list **/
00346
00347 if( str[ipos] == ',' || str[ipos] == '\0' || str[ipos] == ']' ){
00348 nout++ ;
00349 subv = (int *) XtRealloc( (char *)subv , sizeof(int) * (nout+1) ) ;
00350 subv[0] = nout ;
00351 subv[nout] = ibot ;
00352 ipos++ ; continue ; /* re-start loop at next sub-selector */
00353 }
00354
00355 /** otherwise, must have '..' or '-' as next inputs **/
00356
00357 if( str[ipos] == '-' ){
00358 ipos++ ;
00359 } else if( str[ipos] == '.' && str[ipos+1] == '.' ){
00360 ipos++ ; ipos++ ;
00361 } else {
00362 myXtFree(subv) ; return NULL ;
00363 }
00364
00365 /** get ending value for loop now **/
00366
00367 if( str[ipos] == '$' ){ /* special case */
00368 itop = nvals-1 ; ipos++ ;
00369 } else { /* decode an integer */
00370 itop = strtol( str+ipos , &cpt , 10 ) ;
00371 if( itop < 0 ){ myXtFree(subv) ; return NULL ; }
00372 if( itop >= nvals ) itop = nvals-1 ;
00373 nused = (cpt-(str+ipos)) ;
00374 if( itop == 0 && nused == 0 ){ myXtFree(subv) ; return NULL ; }
00375 ipos += nused ;
00376 }
00377
00378 /** set default loop step **/
00379
00380 istep = (ibot <= itop) ? 1 : -1 ;
00381
00382 /** check if we have a non-default loop step **/
00383
00384 if( str[ipos] == '(' ){ /* decode an integer */
00385 ipos++ ;
00386 istep = strtol( str+ipos , &cpt , 10 ) ;
00387 if( istep == 0 ){ myXtFree(subv) ; return NULL ; }
00388 nused = (cpt-(str+ipos)) ;
00389 ipos += nused ;
00390 if( str[ipos] == ')' ) ipos++ ;
00391 }
00392
00393 /** add values to output **/
00394
00395 for( ii=ibot ; (ii-itop)*istep <= 0 ; ii += istep ){
00396 nout++ ;
00397 subv = (int *) XtRealloc( (char *)subv , sizeof(int) * (nout+1) ) ;
00398 subv[0] = nout ;
00399 subv[nout] = ii ;
00400 }
00401
00402 /** check if we have a comma to skip over **/
00403
00404 if( str[ipos] == ',' ) ipos++ ;
00405
00406 } /* end of loop through selector string */
00407
00408 return subv ;
00409 }
|
|
||||||||||||
|
Definition at line 54 of file 3dTcat.c. References ADDTO_3DARR, ADDTO_XTARR, argc, DATABLOCK_MEM_MALLOC, THD_3dim_dataset::daxes, THD_3dim_dataset::dblk, DSET_NVALS, FIRST_VIEW_TYPE, ilen, INIT_3DARR, INIT_XTARR, LAST_VIEW_TYPE, MAX, MCW_strncpy, THD_dataxes::nxx, THD_dataxes::nyy, THD_dataxes::nzz, TCAT_dry, TCAT_get_subv(), TCAT_glue, TCAT_nvox, TCAT_output_prefix, TCAT_rct, TCAT_rlt, TCAT_rqt, TCAT_session, TCAT_type, TCAT_verb, THD_force_malloc_type(), THD_MAX_NAME, THD_MAX_PREFIX, THD_open_one_dataset(), and THD_3dim_dataset::type. Referenced by main().
00055 {
00056 int nopt = 1 , ii ;
00057 char dname[THD_MAX_NAME] ;
00058 char subv[THD_MAX_NAME] ;
00059 char * cpt ;
00060 THD_3dim_dataset * dset ;
00061 int * svar ;
00062 char * str;
00063 int ok, ilen, nlen , max_nsub=0 ;
00064
00065 INIT_3DARR(TCAT_dsar) ; /* array of datasets */
00066 INIT_XTARR(TCAT_subv) ; /* array of sub-brick selector arrays */
00067
00068 while( nopt < argc ){
00069
00070 /**** -prefix prefix ****/
00071
00072 if( strncmp(argv[nopt],"-prefix",6) == 0 ||
00073 strncmp(argv[nopt],"-output",6) == 0 ){
00074 if(TCAT_glue){
00075 fprintf(stderr,"*** -prefix and -glueto options are not compatible\n");
00076 exit(1) ;
00077 }
00078 nopt++ ;
00079 if( nopt >= argc ){
00080 fprintf(stderr,"*** need argument after -prefix!\n") ; exit(1) ;
00081 }
00082 MCW_strncpy( TCAT_output_prefix , argv[nopt++] , THD_MAX_PREFIX ) ;
00083 continue ;
00084 }
00085
00086 /**** -session directory ****/
00087
00088 if( strncmp(argv[nopt],"-session",6) == 0 ){
00089 if(TCAT_glue){
00090 fprintf(stderr,
00091 "*** -session and -glueto options are not compatible\n");
00092 exit(1) ;
00093 }
00094 nopt++ ;
00095 if( nopt >= argc ){
00096 fprintf(stderr,"*** need argument after -session!\n") ; exit(1) ;
00097 }
00098 MCW_strncpy( TCAT_session , argv[nopt++] , THD_MAX_NAME ) ;
00099 continue ;
00100 }
00101
00102 /**** -dry ****/
00103
00104 if( strncmp(argv[nopt],"-dry",3) == 0 ){
00105 TCAT_dry = 1 ; TCAT_verb++ ;
00106 nopt++ ; continue ;
00107 }
00108
00109 /**** -verb ****/
00110
00111 if( strncmp(argv[nopt],"-verb",5) == 0 ){
00112 TCAT_verb++ ;
00113 nopt++ ; continue ;
00114 }
00115
00116 /**** -rlt ****/
00117
00118 if( strcmp(argv[nopt],"-rlt") == 0 ){
00119 TCAT_rlt = 1 ;
00120 nopt++ ; continue ;
00121 }
00122
00123 /**** -rlt+ [16 Sep 1999] ****/
00124
00125 if( strcmp(argv[nopt],"-rlt+") == 0 ){ /* 16 Sep 1999 */
00126 TCAT_rlt = 2 ;
00127 nopt++ ; continue ;
00128 }
00129
00130 /**** -rlt++ [16 Sep 1999] ****/
00131
00132 if( strcmp(argv[nopt],"-rlt++") == 0 ){ /* 16 Sep 1999 */
00133 TCAT_rlt = 3 ;
00134 nopt++ ; continue ;
00135 }
00136
00137 /**** -rqt [15 Nov 1999] ****/
00138
00139 if( strcmp(argv[nopt],"-rqt") == 0 ){
00140 TCAT_rqt = 1 ;
00141 nopt++ ; continue ;
00142 }
00143
00144 /**** -rct [15 Nov 1999] ****/
00145
00146 if( strcmp(argv[nopt],"-rct") == 0 ){
00147 TCAT_rct = 1 ;
00148 nopt++ ; continue ;
00149 }
00150
00151 /**** -glueto fname ****/
00152
00153 if( strncmp(argv[nopt],"-glueto",5) == 0 ){
00154 if( strncmp(TCAT_output_prefix, "tcat", 5) != 0 ){
00155 fprintf(stderr,"*** -prefix and -glueto options are not compatible\n");
00156 exit(1) ;
00157 }
00158 if( strncmp(TCAT_session, "./", 5) != 0 ){
00159 fprintf(stderr,
00160 "*** -session and -glueto options are not compatible\n");
00161 exit(1) ;
00162 }
00163 TCAT_glue = 1 ;
00164 nopt++ ;
00165 if( nopt >= argc ){
00166 fprintf(stderr,"*** need argument after -glueto!\n") ; exit(1) ;
00167 }
00168
00169 /*----- Verify that file name ends in View Type -----*/
00170 ok = 1;
00171 nlen = strlen(argv[nopt]);
00172 if (nlen <= 5) ok = 0;
00173
00174 #define BACKASS /* 03 Oct 2002 -- RWCox */
00175
00176 if (ok)
00177 {
00178 #ifndef BACKASS
00179 for (ilen = 0; ilen < nlen; ilen++) /* BDW: scan forward */
00180 #else
00181 for( ilen=nlen-3 ; ilen >= 0 ; ilen-- ) /* RWC: scan backward */
00182 #endif
00183 {
00184 str = argv[nopt] + ilen;
00185 if (str[0] == '+') break;
00186 }
00187 #ifndef BACKASS
00188 if (ilen == nlen) ok = 0;
00189 #else
00190 if (ilen <= 0 ) ok = 0;
00191 #endif
00192 }
00193
00194 if (ok)
00195 {
00196 str = argv[nopt] + ilen + 1;
00197
00198 for (ii=FIRST_VIEW_TYPE ; ii <= LAST_VIEW_TYPE ; ii++)
00199 if (! strncmp(str,VIEW_codestr[ii],4)) break ;
00200
00201 if( ii > LAST_VIEW_TYPE ) ok = 0;
00202 }
00203
00204 if (! ok)
00205 {
00206 fprintf(stderr,
00207 "*** File name must end in +orig, +acpc, or +tlrc after -glueto\n");
00208 exit(1);
00209 }
00210
00211 /*----- Remove View Type from string to make output prefix -----*/
00212 MCW_strncpy( TCAT_output_prefix , argv[nopt] , ilen+1) ;
00213
00214 /*----- Note: no "continue" statement here. File name will now
00215 be processed as an input dataset -----*/
00216 }
00217
00218 if( argv[nopt][0] == '-' ){
00219 fprintf(stderr,"*** Unknown option: %s\n",argv[nopt]) ; exit(1) ;
00220 }
00221
00222 /**** read dataset ****/
00223
00224 cpt = strstr(argv[nopt],"[") ; /* look for the sub-brick selector */
00225
00226 if( cpt == NULL ){ /* no selector */
00227 strcpy(dname,argv[nopt]) ;
00228 subv[0] = '\0' ;
00229 } else if( cpt == argv[nopt] ){ /* can't be at start!*/
00230 fprintf(stderr,"*** Illegal dataset specifier: %s\n",argv[nopt]) ;
00231 exit(1) ;
00232 } else { /* found selector */
00233 ii = cpt - argv[nopt] ;
00234 memcpy(dname,argv[nopt],ii) ; dname[ii] = '\0' ;
00235 strcpy(subv,cpt) ;
00236 }
00237 nopt++ ;
00238
00239 dset = THD_open_one_dataset( dname ) ;
00240 if( dset == NULL ){
00241 fprintf(stderr,"*** Can't open dataset %s\n",dname) ; exit(1) ;
00242 }
00243 THD_force_malloc_type( dset->dblk , DATABLOCK_MEM_MALLOC ) ;
00244
00245 if( TCAT_type < 0 ) TCAT_type = dset->type ;
00246
00247 /* check if voxel counts match */
00248
00249 ii = dset->daxes->nxx * dset->daxes->nyy * dset->daxes->nzz ;
00250 if( TCAT_nvox < 0 ){
00251 TCAT_nvox = ii ;
00252 } else if( ii != TCAT_nvox ){
00253 fprintf(stderr,"*** Dataset %s differs in size from others\n",dname);
00254 exit(1) ;
00255 }
00256 ADDTO_3DARR(TCAT_dsar,dset) ; /* list of datasets */
00257
00258 /* process the sub-brick selector string,
00259 returning an array of int with
00260 svar[0] = # of sub-bricks,
00261 svar[j+1] = index of sub-brick #j for j=0..svar[0] */
00262
00263 svar = TCAT_get_subv( DSET_NVALS(dset) , subv ) ;
00264 if( svar == NULL || svar[0] <= 0 ){
00265 fprintf(stderr,"*** Can't decipher index codes from %s%s\n",dname,subv) ;
00266 exit(1) ;
00267 }
00268 ADDTO_XTARR(TCAT_subv,svar) ; /* list of sub-brick selectors */
00269
00270 max_nsub = MAX( max_nsub , svar[0] ) ;
00271
00272 if( TCAT_rlt == 3 && svar[0] < 3 ) /* 16 Sep 1999 */
00273 fprintf(stderr,
00274 "*** Warning: -rlt++ option won't work properly with\n"
00275 " less than 3 sub-bricks per input dataset!\n") ;
00276
00277 } /* end of loop over command line arguments */
00278
00279 /*--- final sanity checks ---*/
00280
00281 if( max_nsub < 3 && TCAT_rlt ){
00282 fprintf(stderr,"*** Warning: can't apply -rlt option -- "
00283 "Not enough points per input dataset.\n" ) ;
00284 TCAT_rlt = 0 ;
00285 }
00286
00287 if( TCAT_rlt && TCAT_dry ){
00288 fprintf(stderr,"*** Warning: -rlt option does nothing with -dry!\n") ;
00289 TCAT_rlt = 0 ;
00290 }
00291
00292 return ;
00293 }
|
|
||||||||||||
|
|
|
|
check if we have a comma to skip over * Definition at line 413 of file 3dTcat.c. Referenced by main().
00414 {
00415 printf(
00416 "Concatenate sub-bricks from input datasets into one big 3D+time dataset.\n"
00417 "Usage: 3dTcat options\n"
00418 "where the options are:\n"
00419 ) ;
00420
00421 printf(
00422 " -prefix pname = Use 'pname' for the output dataset prefix name.\n"
00423 " OR -output pname [default='tcat']\n"
00424 "\n"
00425 " -session dir = Use 'dir' for the output dataset session directory.\n"
00426 " [default='./'=current working directory]\n"
00427 " -glueto fname = Append bricks to the end of the 'fname' dataset.\n"
00428 " This command is an alternative to the -prefix \n"
00429 " and -session commands. \n"
00430 " -dry = Execute a 'dry run'; that is, only print out\n"
00431 " what would be done. This is useful when\n"
00432 " combining sub-bricks from multiple inputs.\n"
00433 " -verb = Print out some verbose output as the program\n"
00434 " proceeds (-dry implies -verb).\n"
00435 " Using -verb twice results in quite lengthy output.\n"
00436 " -rlt = Remove linear trends in each voxel time series loaded\n"
00437 " from each input dataset, SEPARATELY. That is, the\n"
00438 " data from each dataset is detrended separately.\n"
00439 " At least 3 sub-bricks from a dataset must be input\n"
00440 " for this option to apply.\n"
00441 " Notes: (1) -rlt removes the least squares fit of 'a+b*t'\n"
00442 " to each voxel time series; this means that\n"
00443 " the mean is removed as well as the trend.\n"
00444 " This effect makes it impractical to compute\n"
00445 " the %% Change using AFNI's internal FIM.\n"
00446 " (2) To have the mean of each dataset time series added\n"
00447 " back in, use this option in the form '-rlt+'.\n"
00448 " In this case, only the slope 'b*t' is removed.\n"
00449 " (3) To have the overall mean of all dataset time\n"
00450 " series added back in, use this option in the\n"
00451 " form '-rlt++'. In this case, 'a+b*t' is removed\n"
00452 " from each input dataset separately, and the\n"
00453 " mean of all input datasets is added back in at\n"
00454 " the end. (This option will work properly only\n"
00455 " if all input datasets use at least 3 sub-bricks!)\n"
00456 " (4) -rlt can be used on datasets that contain shorts\n"
00457 " or floats, but not on complex- or byte-valued\n"
00458 " datasets.\n"
00459 "\n"
00460 "Command line arguments after the above are taken as input datasets.\n"
00461 "A dataset is specified using one of these forms:\n"
00462 " 'prefix+view', 'prefix+view.HEAD', or 'prefix+view.BRIK'.\n"
00463 "\n"
00464 "SUB-BRICK SELECTION:\n"
00465 "You can also add a sub-brick selection list after the end of the\n"
00466 "dataset name. This allows only a subset of the sub-bricks to be\n"
00467 "included into the output (by default, all of the input dataset\n"
00468 "is copied into the output). A sub-brick selection list looks like\n"
00469 "one of the following forms:\n"
00470 " fred+orig[5] ==> use only sub-brick #5\n"
00471 " fred+orig[5,9,17] ==> use #5, #9, and #12\n"
00472 " fred+orig[5..8] or [5-8] ==> use #5, #6, #7, and #8\n"
00473 " fred+orig[5..13(2)] or [5-13(2)] ==> use #5, #7, #9, #11, and #13\n"
00474 "Sub-brick indexes start at 0. You can use the character '$'\n"
00475 "to indicate the last sub-brick in a dataset; for example, you\n"
00476 "can select every third sub-brick by using the selection list\n"
00477 " fred+orig[0..$(3)]\n"
00478 "\n"
00479 "NOTES:\n"
00480 "* The TR and other time-axis properties are taken from the\n"
00481 " first input dataset that is itself 3D+time. If no input\n"
00482 " datasets contain such information, then TR is set to 1.0.\n"
00483 " This can be altered using the 3drefit program.\n"
00484 "\n"
00485 "* The sub-bricks are output in the order specified, which may\n"
00486 " not be the order in the original datasets. For example, using\n"
00487 " fred+orig[0..$(2),1..$(2)]\n"
00488 " will cause the sub-bricks in fred+orig to be output into the\n"
00489 " new dataset in an interleaved fashion. Using\n"
00490 " fred+orig[$..0]\n"
00491 " will reverse the order of the sub-bricks in the output.\n"
00492 " If the -rlt option is used, the sub-bricks selected from each\n"
00493 " input dataset will be re-ordered into the output dataset, and\n"
00494 " then this sequence will be detrended.\n"
00495 "\n"
00496 "* You can use the '3dinfo' program to see how many sub-bricks\n"
00497 " a 3D+time or a bucket dataset contains.\n"
00498 "\n"
00499 "* The '$', '(', ')', '[', and ']' characters are special to\n"
00500 " the shell, so you will have to escape them. This is most easily\n"
00501 " done by putting the entire dataset plus selection list inside\n"
00502 " single quotes, as in 'fred+orig[5..7,9]'.\n"
00503 "\n"
00504 "* You may wish to use the 3drefit program on the output dataset\n"
00505 " to modify some of the .HEAD file parameters.\n"
00506 ) ;
00507
00508 exit(0) ;
00509 }
|
Variable Documentation
|
|
Definition at line 23 of file 3dTcat.c. Referenced by main(), and TCAT_read_opts(). |
|
|
|
|
|
Definition at line 26 of file 3dTcat.c. Referenced by main(), and TCAT_read_opts(). |
|
|
Definition at line 22 of file 3dTcat.c. Referenced by main(), and TCAT_read_opts(). |
|
|
Definition at line 32 of file 3dTcat.c. Referenced by main(), and TCAT_read_opts(). |
|
|
Definition at line 30 of file 3dTcat.c. Referenced by TCAT_read_opts(). |
|
|
Definition at line 27 of file 3dTcat.c. Referenced by main(), and TCAT_read_opts(). |
|
|
Definition at line 29 of file 3dTcat.c. Referenced by TCAT_read_opts(). |
|
|
Definition at line 33 of file 3dTcat.c. Referenced by main(), and TCAT_read_opts(). |
|
|
|
|
|
Definition at line 25 of file 3dTcat.c. Referenced by main(), and TCAT_read_opts(). |
|
|
Definition at line 24 of file 3dTcat.c. Referenced by main(), and TCAT_read_opts(). |