Doxygen Source Code Documentation
fim2.c File Reference
#include <math.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include "mrilib.h"#include "pcor.h"#include "ts.h"Go to the source code of this file.
Data Structures | |
| struct | line_opt |
Defines | |
| #define | SCALE 10000 |
| #define | BLAST 33333.0 |
| #define | DFILT_NONE 0 |
| #define | DFILT_SPACE 1 |
| #define | DFILT_SPACE0 11 |
| #define | DFILT_TIME 2 |
| #define | DFILT_TIME0 21 |
| #define | DFILT_BOTH 3 |
| #define | DFILT_BOTH0 31 |
| #define | DFILT_SPACETIME 4 |
| #define | DFILT_SPACETIME0 41 |
| #define | CLIP_FRAC 0.10 |
| #define | DBOPT(str) |
| #define | OPENERS "[{/%" |
| #define | CLOSERS "]}/%" |
| #define | IS_OPENER(sss) (strlen((sss))==1 && strstr(OPENERS,(sss))!=NULL) |
| #define | IS_CLOSER(sss) (strlen((sss))==1 && strstr(CLOSERS,(sss))!=NULL) |
Functions | |
| void | get_line_opt (int argc, char *argv[], line_opt *opt) |
| void | Syntax (char *) |
| void | write_images (line_opt *, char *, MRI_IMAGE *, float, char *, MRI_IMAGE *) |
| time_series * | edit_weight (time_series *, time_series *) |
| int | main (int argc, char *argv[]) |
Define Documentation
|
|
Definition at line 29 of file fim2.c. Referenced by edit_weight(), get_line_opt(), and main(). |
|
|
Definition at line 45 of file fim2.c. Referenced by main(). |
|
|
|
|
|
Definition at line 702 of file fim2.c. Referenced by get_line_opt(). |
|
|
Definition at line 39 of file fim2.c. Referenced by get_line_opt(). |
|
|
Definition at line 40 of file fim2.c. Referenced by get_line_opt(). |
|
|
Definition at line 31 of file fim2.c. Referenced by get_line_opt(). |
|
|
Definition at line 33 of file fim2.c. Referenced by get_line_opt(). |
|
|
Definition at line 34 of file fim2.c. Referenced by get_line_opt(). |
|
|
Definition at line 42 of file fim2.c. Referenced by get_line_opt(). |
|
|
Definition at line 43 of file fim2.c. Referenced by get_line_opt(). |
|
|
Definition at line 36 of file fim2.c. Referenced by get_line_opt(). |
|
|
Definition at line 37 of file fim2.c. Referenced by get_line_opt(). |
|
|
|
|
|
|
|
|
|
|
|
Definition at line 28 of file fim2.c. Referenced by write_images(). |
Function Documentation
|
||||||||||||
|
Definition at line 1644 of file fim2.c. References BLAST, time_series::len, MIN, RWC_blank_time_series(), RWC_free_time_series(), RWC_norm_ts(), and time_series::ts. Referenced by main().
01645 {
01646 time_series * wtnew ;
01647 int ii , ntime ;
01648 float ftemp ;
01649
01650 ntime = MIN(wt->len,ideal->len) ;
01651 wtnew = RWC_blank_time_series( ntime ) ;
01652
01653 for( ii=0 ; ii < ntime ; ii++ )
01654 wtnew->ts[ii] = (ideal->ts[ii] >= BLAST) ? (0.0) : (wt->ts[ii]) ;
01655
01656 ftemp = RWC_norm_ts( ntime , wtnew ) ;
01657 if( ftemp < 1.e-9 ){
01658 fprintf(stderr,"** bad ideal: no times with nonzero weight!\n") ;
01659 RWC_free_time_series( wtnew ) ;
01660 return NULL ;
01661 }
01662
01663 return wtnew ;
01664 }
|
|
||||||||||||||||
|
Definition at line 705 of file fim2.c. References ADDTO_TSARR, AFNI_logger(), ALIGN_BILINEAR_CODE, ALIGN_DEBUG_CODE, ALIGN_NOITER_CODE, ALIGN_REGISTER_CODE, argc, BLAST, DBOPT, line_opt::debug, DESTROY_IMARR, DFILT_BOTH, DFILT_BOTH0, line_opt::dfilt_code, DFILT_NONE, DFILT_SPACE, DFILT_SPACE0, DFILT_SPACETIME, DFILT_SPACETIME0, DFILT_TIME, DFILT_TIME0, line_opt::do_clip, line_opt::dset, line_opt::first_flim, line_opt::first_im, line_opt::flim, time_series::fname, line_opt::fname_cnr, line_opt::fname_corr, line_opt::fname_fim, line_opt::fname_fit, line_opt::fname_sig, line_opt::fname_subort, line_opt::idts, MRI_IMARR::imarr, IMARR_COUNT, IMARR_SUBIMAGE, line_opt::ims, INIT_TSARR, IS_CLOSER, IS_OPENER, MRI_IMAGE::kind, time_series::len, malloc, MALLOC_ERR, line_opt::max_percent, MIN, mri_align_dfspace(), mri_free(), mri_read_just_one(), mri_read_many_files(), mri_to_float(), mri_write(), line_opt::norm_fim, line_opt::ntime, MRI_IMARR::num, time_series_array::num, MRI_IMAGE::nx, line_opt::nxim, MRI_IMAGE::ny, line_opt::nyim, line_opt::ortts, line_opt::prefix_name, PROGRAM_NAME, line_opt::quiet, line_opt::refts, line_opt::reg_bilinear, line_opt::rims, RWC_blank_time_series(), RWC_free_time_series(), RWC_norm_ts(), RWC_read_time_series(), line_opt::scale_fim, line_opt::scale_output, strtod(), Syntax(), THD_MAX_NAME, THD_open_one_dataset(), line_opt::thresh_pcorr, line_opt::thresh_report, time_series::ts, time_series_array::tsarr, vec, and line_opt::weight. Referenced by main().
00706 {
00707 int nopt , ii , pp , rr , bad ;
00708 int first_im , do_corr , num_im , num_time , polref ;
00709 float ftemp , fscal ;
00710 MRI_IMAGE *im ;
00711 time_series *ideal , *vec ;
00712 char err_note[128] , * regbase ;
00713
00714 /*** give help if needed ***/
00715
00716 if( argc < 2 || strncmp(argv[1],"-help",4) == 0 ) Syntax(NULL) ;
00717
00718 /*** setup opt with defaults ***/
00719
00720 opt->fname_corr = NULL ; /* no output names yet */
00721 opt->fname_fim = NULL ;
00722 opt->fname_cnr = NULL ;
00723 opt->fname_fit = NULL ;
00724 opt->fname_subort = NULL ;
00725 opt->fname_sig = NULL ;
00726 opt->thresh_pcorr = 0.70 ; /* default 70% threshold */
00727 opt->thresh_report = 10.0 ; /* not currently used */
00728 opt->nxim = 0 ;
00729 opt->nyim = 0 ;
00730 opt->ntime = 0 ;
00731 opt->weight = NULL ; /* no weight vector yet */
00732 opt->ims = NULL ;
00733 opt->rims = NULL ;
00734 opt->flim = FALSE ; /* default: don't write float images */
00735 opt->scale_fim = 1.0 ; /* scale factor for writing short images */
00736 /* (used only if norm_fim is FALSE) */
00737 opt->norm_fim = TRUE ; /* default: normalize alpha image */
00738 opt->scale_output = TRUE ; /* default: force scales into output corners */
00739
00740 opt->dfilt_code = DFILT_NONE ; /* default: do neither of these things */
00741 opt->reg_bilinear = 0 ; /* default: bicubic */
00742 opt->do_clip = 0 ;
00743 opt->debug = 0 ;
00744 opt->quiet = 0 ;
00745
00746 /*** initialize array of time series data ***/
00747
00748 INIT_TSARR(opt->refts) ;
00749 INIT_TSARR(opt->idts) ;
00750
00751 /*** set defaults in local variables ***/
00752
00753 polref = 0 ; /* maximum order of polynomial reference vectors */
00754 first_im = 1 ; /* first image to actually use */
00755 num_im = 999999 ; /* maximum number of images to use */
00756 do_corr = FALSE ; /* write correlation image out? */
00757 ideal = NULL ; /* time_series of ideal response vector */
00758 regbase = NULL ; /* pointer to name of registration image */
00759
00760 /*** read command line arguments and process them:
00761 coding technique is to examine each argv, and if it matches
00762 something we expect (e.g., -flim), process it, then skip to
00763 the next loop through ('continue' statements in each strncmp if).
00764 Note that the 'while' will increment the argument index (nopt) ***/
00765
00766 nopt = 1 ;
00767 do{ /* a while loop, continuing until we reach the MRI filenames */
00768
00769 /** clip option **/
00770
00771 if( strncmp(argv[nopt],"-clip",5) == 0 ){
00772 DBOPT("-clip") ;
00773 opt->do_clip = 1 ;
00774 continue ;
00775 }
00776
00777 /** quiet option **/
00778
00779 if( strncmp(argv[nopt],"-q",2) == 0 ){
00780 DBOPT("-q") ;
00781 opt->quiet = 1 ;
00782 continue ;
00783 }
00784
00785 /** debug option **/
00786
00787 if( strncmp(argv[nopt],"-debug",5) == 0 ){
00788 DBOPT("-debug") ;
00789 opt->debug = 1 ;
00790 continue ;
00791 }
00792
00793 /** anti-motion filtering options **/
00794
00795 if( strncmp(argv[nopt],"-bilinear",6) == 0 ){
00796 DBOPT("-bilinear") ;
00797 opt->reg_bilinear = 1 ;
00798 continue ;
00799 }
00800
00801 if( strncmp(argv[nopt],"-regbase",6) == 0 ){
00802 DBOPT("-regbase") ;
00803 if( ++nopt >= argc ) Syntax("-regbase needs a filename!") ;
00804 regbase = argv[nopt] ;
00805 continue ;
00806 }
00807
00808 #ifdef ALLOW_DFTIME
00809 if( strstr(argv[nopt],"-dftime") != NULL ){
00810 DBOPT("-dftime") ;
00811 opt->dfilt_code = DFILT_TIME ;
00812 if( strstr(argv[nopt],":0") != NULL ) opt->dfilt_code = DFILT_TIME0 ;
00813 continue ;
00814 }
00815 #endif
00816
00817 if( strstr(argv[nopt],"-dfspace") != NULL && strstr(argv[nopt],"-dfspacetime") == NULL ){
00818 DBOPT("-dfspace") ;
00819 opt->dfilt_code = DFILT_SPACE ;
00820 if( strstr(argv[nopt],":0") != NULL ) opt->dfilt_code = DFILT_SPACE0 ;
00821 continue ;
00822 }
00823
00824 #ifdef ALLOW_DFTIME
00825 if( strstr(argv[nopt],"-dfboth") != NULL ){
00826 DBOPT("-dfboth") ;
00827 opt->dfilt_code = DFILT_BOTH ;
00828 if( strstr(argv[nopt],":0") != NULL ) opt->dfilt_code = DFILT_BOTH0 ;
00829 continue ;
00830 }
00831 #endif
00832
00833 #ifdef ALLOW_DFTIME
00834 if( strstr(argv[nopt],"-dfspacetime") != NULL ){
00835 DBOPT("-dfspacetime") ;
00836 opt->dfilt_code = DFILT_SPACETIME ;
00837 if( strstr(argv[nopt],":0") != NULL ) opt->dfilt_code = DFILT_SPACETIME0 ;
00838 continue ;
00839 }
00840 #endif
00841
00842 /** -clean **/
00843
00844 if( strncmp(argv[nopt],"-clean",5) == 0 ){
00845 DBOPT("-clean") ;
00846 opt->scale_output = FALSE;
00847 continue ;
00848 }
00849
00850 /*** -flim ==> output floating point images (default is shorts) ***/
00851
00852 if( strncmp(argv[nopt],"-flim",5) == 0 ){
00853 DBOPT("-flim") ;
00854 opt->flim = TRUE ;
00855 continue ;
00856 }
00857
00858 /*** -non ==> don't normalize alpha image ***/
00859
00860 if( strncmp(argv[nopt],"-non",4) == 0 ){
00861 DBOPT("-non") ;
00862 opt->norm_fim = FALSE ;
00863 continue ;
00864 }
00865
00866 /*** -coef # ==> coefficient for normalizing alpha image ***/
00867
00868 if( strncmp(argv[nopt],"-coe",4) == 0 ){
00869 DBOPT("-coef") ;
00870 if( ++nopt >= argc ) Syntax("-coef needs an argument") ;
00871 ftemp = strtod( argv[nopt] , NULL ) ;
00872 if( ftemp <= 0 ){
00873 sprintf( err_note , "illegal -coef value: %f" , ftemp ) ;
00874 Syntax(err_note) ;
00875 }
00876 opt->scale_fim = ftemp ;
00877 continue ;
00878 }
00879
00880 /*** -list # ==> threshold for report listing (not used now) ***/
00881
00882 if( strncmp(argv[nopt],"-list",4) == 0 ){
00883 DBOPT("-list") ;
00884 if( ++nopt >= argc ) Syntax("-list needs an argument") ;
00885 ftemp = strtod( argv[nopt] , NULL ) ;
00886 #if 0
00887 if( ftemp <= 0 ){
00888 sprintf( err_note , "illegal -list value: %f" , ftemp ) ;
00889 Syntax(err_note) ;
00890 }
00891 #else
00892 fprintf(stderr,"WARNING: -list option is ignored in fim2!\n") ;
00893 #endif
00894 opt->thresh_report = ftemp ;
00895 continue ;
00896 }
00897
00898 /*** -polref # ==> order of polynomial reference functions ***/
00899
00900 if( strncmp(argv[nopt],"-polref",5) == 0 || strncmp(argv[nopt],"-polort",5) == 0 ){
00901 DBOPT("-polref") ;
00902 if( ++nopt >= argc ) Syntax("-polref needs an argument") ;
00903 ftemp = strtod( argv[nopt] , NULL ) ;
00904 if( ftemp > 3 ){
00905 fprintf( stderr , "WARNING: large -polref value %f\n" , ftemp ) ;
00906 }
00907 polref = (int) ftemp ;
00908 continue ;
00909 }
00910
00911 /*** -pcnt # ==> percent of deviation from perfect correlation ***/
00912
00913 if( strncmp(argv[nopt],"-pcnt",4) == 0 ){
00914 DBOPT("-pcnt") ;
00915 if( ++nopt >= argc ) Syntax("-pcnt needs an argument") ;
00916 ftemp = strtod( argv[nopt] , NULL ) ;
00917 if( ftemp < 0.0 || ftemp > 100.0 ){
00918 sprintf( err_note , "illegal -pcnt value: %f" , ftemp ) ;
00919 Syntax(err_note) ;
00920 }
00921 opt->thresh_pcorr = 1.0 - 0.01 * ftemp ;
00922 continue ;
00923 }
00924
00925 /*** -pcthresh # ==> actual threshold on \rho ***/
00926
00927 if( strncmp(argv[nopt],"-pcthresh",5) == 0 ){
00928 DBOPT("-pcthresh") ;
00929 if( ++nopt >= argc ) Syntax("-pcthresh needs an argument") ;
00930 ftemp = strtod( argv[nopt] , NULL ) ;
00931 if( ftemp < 0.0 || ftemp > 1.0 ){
00932 sprintf( err_note , "illegal -pcthresh value: %f" , ftemp ) ;
00933 Syntax(err_note) ;
00934 }
00935 opt->thresh_pcorr = ftemp ;
00936 continue ;
00937 }
00938
00939 /*** -im1 # ==> index (1...) of first image to actually use ***/
00940
00941 if( strncmp(argv[nopt],"-im1",4) == 0 ){
00942 DBOPT("-im1") ;
00943 if( ++nopt >= argc ) Syntax("-im1 needs an argument") ;
00944 ftemp = strtod( argv[nopt] , NULL ) ;
00945 if( ftemp < 1.0 ){
00946 sprintf( err_note , "illegal -im1 value: %f" , ftemp ) ;
00947 Syntax(err_note) ;
00948 }
00949 first_im = (int)(ftemp+0.499) ;
00950 continue ;
00951 }
00952
00953 /*** -num # ==> maximum number of images to use from command line ***/
00954
00955 if( strncmp(argv[nopt],"-num",4) == 0 ){
00956 DBOPT("-num") ;
00957 if( ++nopt >= argc ) Syntax("-num needs an argument") ;
00958 ftemp = strtod( argv[nopt] , NULL ) ;
00959 if( ftemp < 2 ){
00960 sprintf( err_note , "illegal -num value: %f" , ftemp ) ;
00961 Syntax(err_note) ;
00962 }
00963 num_im = (int)(ftemp+0.499) ;
00964 continue ;
00965 }
00966
00967 #define OPENERS "[{/%"
00968 #define CLOSERS "]}/%"
00969
00970 #define IS_OPENER(sss) (strlen((sss))==1 && strstr(OPENERS,(sss))!=NULL)
00971 #define IS_CLOSER(sss) (strlen((sss))==1 && strstr(CLOSERS,(sss))!=NULL)
00972
00973 /*** -ort file ==> reference time series ***/
00974
00975 if( strncmp(argv[nopt],"-ort",4) == 0 ){
00976 DBOPT("-ort") ;
00977 if( ++nopt >= argc ) Syntax("-ort needs a filename") ;
00978
00979 /** July 1995: read a bunch of orts using [ a b c ... ] format **/
00980
00981 if( ! IS_OPENER(argv[nopt]) ){ /* one file */
00982 vec = RWC_read_time_series( argv[nopt] ) ;
00983 if( vec == NULL ){ fprintf( stderr , "cannot continue\a\n" ) ; exit(1) ; }
00984 ADDTO_TSARR( opt->refts , vec ) ;
00985 } else { /* many */
00986 for( nopt++ ; !IS_CLOSER(argv[nopt]) && nopt<argc ; nopt++ ){
00987 vec = RWC_read_time_series( argv[nopt] ) ;
00988 if( vec == NULL ){ fprintf( stderr , "cannot continue\a\n" ); exit(1) ; }
00989 ADDTO_TSARR( opt->refts , vec ) ;
00990 }
00991 if( nopt == argc ) Syntax("-ort never finishes!") ;
00992 }
00993 continue ;
00994 }
00995
00996 /*** -ideal file ==> ideal response vector time series ***/
00997
00998 if( strncmp(argv[nopt],"-ideal",5) == 0 ){
00999 DBOPT("-ideal") ;
01000 if( ++nopt >= argc ) Syntax("-ideal needs a filename") ;
01001
01002 /** July 1995: read a bunch of ideals using [ a b c ... ] format **/
01003
01004 if( ! IS_OPENER(argv[nopt]) ){ /* one file */
01005 ideal = RWC_read_time_series( argv[nopt] ) ;
01006 if( ideal == NULL ){ fprintf( stderr , "cannot continue\a\n" ); exit(1) ; }
01007 ADDTO_TSARR( opt->idts , ideal ) ;
01008 } else { /* many */
01009 for( nopt++ ; !IS_CLOSER(argv[nopt]) && nopt<argc ; nopt++ ){
01010 ideal = RWC_read_time_series( argv[nopt] ) ;
01011 if( ideal == NULL ){ fprintf( stderr , "cannot continue\a\n" ); exit(1) ; }
01012 ADDTO_TSARR( opt->idts , ideal ) ;
01013 }
01014 if( nopt == argc ) Syntax("-ideal never finishes!") ;
01015 }
01016 continue ;
01017 }
01018
01019 /*** -weight file ==> weight vector time series ***/
01020
01021 if( strncmp(argv[nopt],"-weight",5) == 0 ){
01022 DBOPT("-weight") ;
01023 if( ++nopt >= argc ) Syntax("-weight needs a filename") ;
01024 if( opt->weight != NULL ){
01025 fprintf( stderr , "cannot have two weight vectors!\a\n" ) ;
01026 exit(1) ;
01027 }
01028 opt->weight = RWC_read_time_series( argv[nopt] ) ;
01029 if( opt->weight == NULL ){ fprintf( stderr , "cannot continue\a\n" ); exit(1) ; }
01030 DBOPT("read in OK") ;
01031 continue ;
01032 }
01033
01034 /*** -fimfile file ==> name of output file ***/
01035
01036 if( strncmp(argv[nopt],"-fimfile",5) == 0 ){
01037 DBOPT("-fimfile") ;
01038 if( ++nopt >= argc ) Syntax("-fimfile needs a filename") ;
01039 if( opt->fname_fim != NULL ){
01040 fprintf( stderr , "cannot have two fim output files!\a\n" ) ;
01041 exit(1) ;
01042 }
01043 opt->fname_fim = argv[nopt] ;
01044 DBOPT("stored as fimfile") ;
01045 continue ;
01046 }
01047
01048 /*** -corr ==> write correlation file as fimfile.CORR ***/
01049
01050 if( strncmp(argv[nopt],"-corr",5) == 0 ){
01051 DBOPT("-corr") ;
01052 do_corr = TRUE ;
01053 continue ;
01054 }
01055
01056 /*** -corfile file ==> write correlation file as this name ***/
01057
01058 if( strncmp(argv[nopt],"-corfile",5) == 0 ||
01059 strncmp(argv[nopt],"-corrfile",6) == 0 ){
01060
01061 DBOPT("-corfile") ;
01062 if( ++nopt >= argc ) Syntax("-corfile needs a filename") ;
01063 if( opt->fname_corr != NULL ){
01064 fprintf( stderr , "cannot have two corr output files!\a\n" ) ;
01065 exit(1) ;
01066 }
01067 opt->fname_corr = argv[nopt] ;
01068 do_corr = TRUE ;
01069 DBOPT("stored as corfile") ;
01070 continue ;
01071 }
01072
01073 /*** -cnrfile file ==> write cnr file as this name ***/
01074
01075 if( strncmp(argv[nopt],"-cnrfile",5) == 0 ){
01076
01077 DBOPT("-cnrfile") ;
01078 if( ++nopt >= argc ) Syntax("-cnrfile needs a filename") ;
01079 if( opt->fname_cnr != NULL ){
01080 fprintf( stderr , "cannot have two cnr output files!\a\n" ) ;
01081 exit(1) ;
01082 }
01083 opt->fname_cnr = argv[nopt] ;
01084 DBOPT("stored as cnrfile") ;
01085 continue ;
01086 }
01087
01088 /*** -sigfile file ==> write sig file as this name ***/
01089
01090 if( strncmp(argv[nopt],"-sigfile",5) == 0 ){
01091
01092 DBOPT("-sigfile") ;
01093 if( ++nopt >= argc ) Syntax("-sigfile needs a filename") ;
01094 if( opt->fname_sig != NULL ){
01095 fprintf( stderr , "cannot have two sig output files!\a\n" ) ;
01096 exit(1) ;
01097 }
01098 opt->fname_sig = argv[nopt] ;
01099 DBOPT("stored as sigfile") ;
01100 continue ;
01101 }
01102
01103 /*** -fitfile file ==> write fit files as this name ***/
01104
01105 if( strncmp(argv[nopt],"-fitfile",5) == 0 ){
01106
01107 DBOPT("-fitfile") ;
01108 if( ++nopt >= argc ) Syntax("-fitfile needs a filename") ;
01109 if( opt->fname_fit != NULL ){
01110 fprintf( stderr , "cannot have two fit output filenames!\a\n" ) ;
01111 exit(1) ;
01112 }
01113 opt->fname_fit = argv[nopt] ;
01114 DBOPT("stored as fitfile") ;
01115 continue ;
01116 }
01117
01118 /*** -subort file ==> compute time series with orts removed ***/
01119
01120 if( strncmp(argv[nopt],"-subort",5) == 0 ){
01121
01122 DBOPT("-subort") ;
01123 if( ++nopt >= argc ) Syntax("-subort needs a filename") ;
01124 if( opt->fname_subort != NULL ){
01125 fprintf( stderr , "cannot have two subort output filenames!\a\n" ) ;
01126 exit(1) ;
01127 }
01128 opt->fname_subort = argv[nopt] ;
01129 DBOPT("stored as subortfile") ;
01130 continue ;
01131 }
01132
01133 /*** get to here, and start with a '-' ==> bad news city, Arizona ***/
01134
01135 if( strncmp(argv[nopt],"-",1) == 0 ){
01136 sprintf( err_note , "unknown option %s" , argv[nopt] ) ;
01137 Syntax(err_note) ;
01138 }
01139
01140 /*** finished with switches. Anything that makes it here is a filename ***/
01141
01142 if( opt->idts->num == 0 ){ /* if ideal timeseries not given yet, is first */
01143 DBOPT("will be ideal") ;
01144 ideal = RWC_read_time_series( argv[nopt] ) ;
01145 if( ideal == NULL ){ fprintf( stderr , "cannot continue\a\n" ); exit(1) ; }
01146 ADDTO_TSARR( opt->idts , ideal ) ;
01147 continue ;
01148 }
01149
01150 /*** this point is the start of image filenames;
01151 break out of the loop and process them ***/
01152
01153 DBOPT("1st image file") ;
01154
01155 break ; /* time to leave */
01156
01157 } while( ++nopt < argc ) ; /* loop until all args are read, or we break */
01158
01159 /***** when this loop ends, nopt = index of first image filename in argv[] *****/
01160
01161 /*** check the situation for reasonabilityositiness ***/
01162
01163 if( opt->idts->num == 0 ) Syntax("no ideal response vector is defined!") ;
01164
01165 /*** compute the number of image files ***/
01166
01167 num_time = argc - nopt ; /* # of arguments left */
01168 if( opt->fname_fim == NULL ){
01169 num_time -- ; /* one less, if need be */
01170 opt->fname_fim = argv[argc-1] ; /* last name = output file */
01171 }
01172
01173 /*** July 1995: read all images in now! ***/
01174
01175 if( num_time < 1 ) Syntax("No input files given on command line?!") ;
01176
01177 opt->ims = mri_read_many_files( num_time , argv+nopt ) ;
01178 if( opt->ims == NULL ) Syntax("Cannot read all images!") ;
01179 num_time = MIN( opt->ims->num , num_im ) ;
01180 if( num_time < 2 ) Syntax("must have at least 2 images to correlate!") ;
01181 opt->ntime = num_time ;
01182 opt->nxim = opt->ims->imarr[0]->nx ;
01183 opt->nyim = opt->ims->imarr[0]->ny ;
01184
01185 #ifdef DEBUG
01186 fprintf(stderr,"num_time = %d nx = %d ny = %d\n",num_time,opt->nxim,opt->nyim) ;
01187 #endif
01188
01189 /** convert images to float format **/
01190
01191 for( ii=0 ; ii < num_time ; ii++ ){
01192 if( opt->ims->imarr[ii]->kind != MRI_float ){
01193 im = mri_to_float( opt->ims->imarr[ii] ) ;
01194 mri_free( opt->ims->imarr[ii] ) ;
01195 opt->ims->imarr[ii] = im ;
01196 }
01197 if( opt->ims->imarr[ii]->nx != opt->nxim ||
01198 opt->ims->imarr[ii]->ny != opt->nyim ){
01199
01200 fprintf(stderr,"** Image size mismatch at image # %d -- end of run!\a\n",ii+1) ;
01201 exit(1) ;
01202 }
01203 }
01204
01205 if( first_im < 1 || first_im >= num_time ){
01206 sprintf( err_note ,
01207 "-im1 was %d, but only have %d images" , first_im , num_time ) ;
01208 Syntax(err_note) ;
01209 }
01210
01211 /*** replace earliest images with copies of "first_im", if needed ***/
01212
01213 for( ii=0 ; ii < first_im-1 ; ii++ ){
01214 im = mri_to_float( opt->ims->imarr[first_im-1] ) ; /* copy data, not just pointer */
01215 mri_free( opt->ims->imarr[ii] ) ;
01216 opt->ims->imarr[ii] = im ;
01217 }
01218
01219 if( do_corr && opt->fname_corr == NULL ){
01220 #ifdef DEBUG
01221 fprintf(stderr,"creating .CORR filename\n");
01222 #endif
01223 ii = strlen( opt->fname_fim ) + 7 ;
01224 opt->fname_corr = (char *) malloc( sizeof(char) * ii ) ;
01225 if( opt->fname_corr == NULL ) MALLOC_ERR(".CORR filename") ;
01226 strcpy( opt->fname_corr , opt->fname_fim ) ;
01227 strcat( opt->fname_corr , ".CORR" ) ;
01228 }
01229
01230 /*** put the polynomial responses into opt->refts ***/
01231
01232 if( polref >= 0 ){
01233
01234 #ifdef DEBUG
01235 fprintf(stderr,"creating polynomial references; polref=%d\n",polref);
01236 #endif
01237
01238 for( pp=0 ; pp <= polref ; pp++ ){
01239 vec = RWC_blank_time_series( num_time ) ;
01240 #if 1
01241 if( pp == 0 ){
01242 for( ii=0 ; ii < num_time ; ii++ ) vec->ts[ii] = 1.0 ;
01243 } else {
01244 fscal = 1.0 / num_time ;
01245 for( ii=0 ; ii < num_time ; ii++ ) vec->ts[ii] = pow(fscal*ii,pp) ;
01246 }
01247 #else
01248 ftemp = 0.5 * num_time - 0.4321 ; /* 0.4321 ensures (ii-ftemp)!=0 */
01249 fscal = 2.0 / num_time ; /* range of arg to pow is -1..1 */
01250 for( ii=0 ; ii < num_time ; ii++ )
01251 vec->ts[ii] = pow( fscal*(ii-ftemp) , pp ) ;
01252 #endif
01253
01254 ADDTO_TSARR( opt->refts , vec ) ;
01255 }
01256 }
01257
01258 /*** if no weight vector input (via -weight filename), make one up ***/
01259
01260 if( opt->weight == NULL ){
01261
01262 #ifdef DEBUG
01263 fprintf(stderr,"creating default weight\n");
01264 #endif
01265
01266 vec = RWC_blank_time_series( num_time ) ;
01267
01268 for( ii=0 ; ii < num_time ; ii++ ) vec->ts[ii] = 1.0 ; /* weight = all ones */
01269
01270 opt->weight = vec ;
01271 }
01272 for( ii=0 ; ii < first_im-1 ; ii++ ) opt->weight->ts[ii] = 0.0 ; /* except skipped images */
01273
01274 /*** make space for the ideal vector in refts (but don't but it there yet) ***/
01275
01276 ADDTO_TSARR( opt->refts , NULL ) ;
01277
01278 /*** check all time series for being long enough ***/
01279
01280 bad = FALSE ;
01281
01282 for( ii=0 ; ii < opt->refts->num-1 ; ii++ ){ /* note not checking last one */
01283 #ifdef DEBUG
01284 fprintf(stderr,"checking ref %d for size\n",ii) ;
01285 #endif
01286 if( opt->refts->tsarr[ii]->len < num_time ){
01287 fprintf( stderr ,
01288 "reference vector %s has %d elements: too short!\a\n" ,
01289 opt->refts->tsarr[ii]->fname , opt->refts->tsarr[ii]->len ) ;
01290 bad = TRUE ;
01291 }
01292 }
01293
01294 for( ii=0 ; ii < opt->idts->num-1 ; ii++ ){
01295 #ifdef DEBUG
01296 fprintf(stderr,"checking ideal %d for size\n",ii) ;
01297 #endif
01298 if( opt->idts->tsarr[ii]->len < num_time ){
01299 fprintf( stderr ,
01300 "ideal vector %s has %d elements: too short!\a\n" ,
01301 opt->idts->tsarr[ii]->fname , opt->idts->tsarr[ii]->len ) ;
01302 bad = TRUE ;
01303 }
01304 }
01305
01306 if( opt->weight->len < num_time ){
01307 fprintf( stderr ,
01308 "weight vector %s has %d elements: too short!\a\n" ,
01309 opt->weight->fname , opt->weight->len ) ;
01310 bad = TRUE ;
01311 }
01312
01313 if( bad ) exit(1) ;
01314
01315 /*** zero out weight at any time where a refts time_series is blasted ***/
01316
01317 #ifdef DEBUG
01318 fprintf(stderr,"blasting away ... ") ;
01319 #endif
01320
01321 for( ii=0 ; ii < num_time ; ii++ ){
01322
01323 bad = (opt->weight->ts[ii] >= BLAST) || (opt->weight->ts[ii] < 0.0) ;
01324
01325 for( rr=0 ; !bad && rr < opt->refts->num-1 ; rr++ )
01326 bad = (opt->refts->tsarr[rr]->ts[ii] >= BLAST) ;
01327
01328 if( bad ){
01329 opt->weight->ts[ii] = 0 ;
01330 for( rr=0 ; rr < opt->refts->num-1 ; rr++ ) /* note not checking last one */
01331 opt->refts->tsarr[rr]->ts[ii] = 0 ;
01332 }
01333 }
01334
01335 #ifdef DEBUG
01336 fprintf(stderr,"\n") ;
01337 #endif
01338
01339 /*** check to see if the edited vectors are still nonzero enough ***/
01340
01341 bad = FALSE ;
01342
01343 #ifdef DEBUG
01344 fprintf(stderr,"checking weight for nonnegativity\n") ;
01345 #endif
01346
01347 ftemp = RWC_norm_ts( num_time , opt->weight ) ;
01348 if( ftemp < 1.e-9 ){
01349 fprintf( stderr , "there is no time with nonzero weighting!\n" ) ;
01350 bad = TRUE ;
01351 }
01352
01353 for( rr=0 ; rr < opt->refts->num-1 ; rr++ ){ /* note not checking last one */
01354 #ifdef DEBUG
01355 fprintf(stderr,"checking ref %d for nonzeroness\n",rr) ;
01356 #endif
01357 ftemp = RWC_norm_ts( num_time , opt->refts->tsarr[rr] ) ;
01358 if( ftemp < 1.e-9 ){
01359 fprintf( stderr , "reference vector %d is all zeroes\n" , rr+1 ) ;
01360 bad = TRUE ;
01361 }
01362 }
01363 if( bad ) exit(1) ;
01364
01365 /*** June 1995: get first image with nonzero weighting ***/
01366
01367 if( regbase == NULL ){
01368 for( ii=0 ; ii < num_time ; ii++ )
01369 if( opt->weight->ts[ii] != 0.0 && ideal->ts[ii] < BLAST ) break ;
01370
01371 if( ii == num_time ){ fprintf(stderr,"FIRST_IM: scan error!\a\n");exit(1); }
01372
01373 opt->first_flim = mri_to_float( opt->ims->imarr[ii] ) ; /* copy it */
01374 } else {
01375 MRI_IMAGE * qim ;
01376 qim = mri_read_just_one( regbase ) ;
01377 if( qim == NULL ) Syntax("Couldn't read -regbase image!") ;
01378 if( qim->kind == MRI_float ) opt->first_flim = qim ;
01379 else {
01380 opt->first_flim = mri_to_float( qim ) ;
01381 mri_free( qim ) ;
01382 }
01383 if( opt->first_flim->nx != opt->nxim || opt->first_flim->ny != opt->nyim ){
01384 fprintf(stderr,"-regbase: image size mismatch!\a\n") ; exit(1) ;
01385 }
01386 }
01387
01388 /*** Setup for differential filtering (registration) ***/
01389
01390 if( opt->dfilt_code != DFILT_NONE ){
01391 int alcode ;
01392 MRI_IMARR * tims ;
01393 time_series * dxts , * dyts , * phits ;
01394
01395 switch( opt->dfilt_code ){
01396 case DFILT_TIME: alcode = 0 ; break ;
01397
01398 case DFILT_TIME0: alcode = ALIGN_NOITER_CODE ; break ;
01399
01400 case DFILT_SPACETIME:
01401 case DFILT_BOTH:
01402 case DFILT_SPACE: alcode = ALIGN_REGISTER_CODE ; break ;
01403
01404 case DFILT_SPACETIME0:
01405 case DFILT_BOTH0:
01406 case DFILT_SPACE0: alcode = ALIGN_REGISTER_CODE | ALIGN_NOITER_CODE ; break ;
01407
01408 default:
01409 Syntax("Internal error: opt->dfilt_code illegal!") ;
01410 }
01411
01412 dxts = RWC_blank_time_series( num_time ) ; /* space for motion params */
01413 dyts = RWC_blank_time_series( num_time ) ;
01414 phits = RWC_blank_time_series( num_time ) ;
01415
01416 if( opt->reg_bilinear ) alcode |= ALIGN_BILINEAR_CODE ;
01417 if( opt->debug ) alcode |= ALIGN_DEBUG_CODE ;
01418
01419 tims = mri_align_dfspace( opt->first_flim , NULL , opt->ims ,
01420 alcode , dxts->ts , dyts->ts , phits->ts ) ;
01421
01422 switch( opt->dfilt_code ){
01423
01424 case DFILT_TIME:
01425 case DFILT_TIME0:
01426 ADDTO_TSARR( opt->refts , NULL ) ; /* make 3 blank spots at end */
01427 ADDTO_TSARR( opt->refts , NULL ) ;
01428 ADDTO_TSARR( opt->refts , NULL ) ;
01429
01430 /* move previously existing time series up by 3 */
01431
01432 for( ii=opt->refts->num-4 ; ii >=0 ; ii-- )
01433 opt->refts->tsarr[ii+3] = opt->refts->tsarr[ii] ;
01434
01435 /* put dx,dy,phi at beginning of list */
01436
01437 opt->refts->tsarr[0] = dxts ;
01438 opt->refts->tsarr[1] = dyts ;
01439 opt->refts->tsarr[2] = phits ;
01440 break ;
01441
01442 case DFILT_SPACE:
01443 case DFILT_SPACE0:
01444 DESTROY_IMARR( opt->ims ) ; /* put registered images in */
01445 opt->ims = tims ; /* place of the input images */
01446
01447 #if 0
01448 if( opt->debug ){
01449 char fff[64] ;
01450 for( ii=0 ; ii < IMARR_COUNT(opt->ims) ; ii++ ){
01451 sprintf(fff,"rrr.%04d",ii+1) ;
01452 mri_write( fff , IMARR_SUBIMAGE(opt->ims,ii) ) ;
01453 }
01454 }
01455 #endif
01456
01457 RWC_free_time_series( dxts ) ;
01458 RWC_free_time_series( dyts ) ;
01459 RWC_free_time_series( phits ) ;
01460 break ;
01461
01462 case DFILT_BOTH:
01463 case DFILT_BOTH0:
01464 ADDTO_TSARR( opt->refts , NULL ) ;
01465 ADDTO_TSARR( opt->refts , NULL ) ;
01466 ADDTO_TSARR( opt->refts , NULL ) ;
01467
01468 for( ii=opt->refts->num-4 ; ii >=0 ; ii-- )
01469 opt->refts->tsarr[ii+3] = opt->refts->tsarr[ii] ;
01470
01471 opt->refts->tsarr[0] = dxts ;
01472 opt->refts->tsarr[1] = dyts ;
01473 opt->refts->tsarr[2] = phits ;
01474
01475 opt->rims = tims ; /* keep registered images as a separate data set */
01476 break ;
01477
01478 case DFILT_SPACETIME:
01479 case DFILT_SPACETIME0:
01480 ADDTO_TSARR( opt->refts , NULL ) ;
01481 ADDTO_TSARR( opt->refts , NULL ) ;
01482 ADDTO_TSARR( opt->refts , NULL ) ;
01483
01484 for( ii=opt->refts->num-4 ; ii >=0 ; ii-- )
01485 opt->refts->tsarr[ii+3] = opt->refts->tsarr[ii] ;
01486
01487 opt->refts->tsarr[0] = dxts ;
01488 opt->refts->tsarr[1] = dyts ;
01489 opt->refts->tsarr[2] = phits ;
01490
01491 DESTROY_IMARR( opt->ims ) ; /* put registered images in */
01492 opt->ims = tims ; /* place of the input images */
01493 break ;
01494 }
01495 }
01496
01497 /*** Done! ***/
01498
01499 return ;
01500 }
|
|
||||||||||||
|
\** File : SUMA.c
Input paramters :
Definition at line 92 of file fim2.c. References ADDTO_IMARR, argc, BLAST, CLIP_FRAC, DESTROY_IMARR, DESTROY_TSARR, line_opt::do_clip, edit_weight(), far, line_opt::first_flim, line_opt::flim, line_opt::fname_cnr, line_opt::fname_corr, line_opt::fname_fim, line_opt::fname_fit, line_opt::fname_sig, line_opt::fname_subort, free, free_references(), free_voxel_corr(), get_coef(), get_line_opt(), get_lsqfit(), get_pcor(), line_opt::idts, MRI_IMARR::imarr, line_opt::ims, INIT_IMARR, machdep(), malloc, MALLOC_ERR, MAX, MIN, MRI_FLOAT_PTR, mri_free(), MRI_INT_PTR, mri_max(), mri_min(), mri_new(), mri_to_float(), mri_to_short(), mri_write(), new_references(), new_voxel_corr(), line_opt::ntime, time_series_array::num, line_opt::nxim, line_opt::nyim, line_opt::quiet, ref, line_opt::refts, line_opt::rims, RWC_free_time_series(), scale, line_opt::thresh_pcorr, time_series::ts, time_series_array::tsarr, update_references(), update_voxel_corr(), line_opt::weight, and write_images().
00093 {
00094 line_opt opt ; /* holds data constructed from command line */
00095 references *ref ; /* holds reference covariance computations */
00096 voxel_corr *voxcor ; /* holds voxel-specific covariances */
00097 float *pcorr ; /* holds partial correlation coefficients */
00098 float *alpha ; /* holds activation levels */
00099 float *refvec , /* values of reference vectors at given time */
00100 *voxvec ; /* values of voxel data at given time */
00101 MRI_IMAGE *voxim ; /* image data (contains voxvec) */
00102 MRI_IMAGE *imcor , /* correlation image (pcorr is part of this) */
00103 *imalp ; /* activation level image (alpha is in this ) */
00104 int nref , nideal ;
00105
00106 float wt ; /* weight factor at given time */
00107
00108 /* duplicates for rims */
00109
00110 references *ref_reg ;
00111 voxel_corr *voxcor_reg ;
00112 float *pcorr_reg , *alpha_reg ;
00113 MRI_IMAGE *imcor_reg , *imalp_reg ;
00114 int nref_reg ;
00115
00116 int itime , numvox , good , vox , ii , ii_idts ;
00117 int do_cnr , do_sig , do_fit , do_subort ;
00118
00119 time_series * wtnew ;
00120
00121 MRI_IMARR * cor_ims , * alp_ims , * cnr_ims , * sig_ims ;
00122 MRI_IMARR ** fit_ims ; /* a whole bunch of arrays of images! */
00123 MRI_IMAGE * best_im ;
00124 int * best ;
00125 float * cornew ;
00126 float cnew , cold ;
00127
00128 int npass_pos , npass_neg ; /* number of voxels that pass the test */
00129 float cormin , cormax , /* min and max correlations seen */
00130 alpmin , alpmax ; /* ditto for activations */
00131
00132 /*** read command line, and set up as it bids ***/
00133
00134 machdep() ;
00135
00136 get_line_opt( argc , argv , &opt ) ;
00137
00138 numvox = opt.nxim * opt.nyim ;
00139 nref = opt.refts->num ;
00140 nideal = opt.idts->num ;
00141
00142 do_cnr = opt.fname_cnr != NULL ;
00143 do_sig = opt.fname_sig != NULL ;
00144 do_fit = opt.fname_fit != NULL ;
00145 do_subort = opt.fname_subort != NULL ;
00146
00147 /** create place to put output images for each ideal **/
00148
00149 INIT_IMARR(cor_ims) ;
00150 INIT_IMARR(alp_ims) ;
00151 if( do_cnr ) INIT_IMARR(cnr_ims) ;
00152 if( do_sig ) INIT_IMARR(sig_ims) ;
00153 if( do_fit || do_subort )
00154 fit_ims = (MRI_IMARR **) malloc( sizeof(MRI_IMARR *) * nideal ) ;
00155
00156 /*** June 1995: set up to clip on intensities of first_flim ***/
00157
00158 if( CLIP_FRAC > 0.0 && opt.do_clip ){
00159 float ftop , fbot , clipper , val ;
00160 float * far ;
00161 int nclipper ;
00162
00163 ftop = mri_max( opt.first_flim ) ;
00164 fbot = mri_min( opt.first_flim ) ;
00165 ftop = (fabs(ftop) > fabs(fbot)) ? fabs(ftop) : fabs(fbot) ;
00166 ftop = CLIP_FRAC * ftop ;
00167 far = MRI_FLOAT_PTR( opt.first_flim ) ;
00168
00169 clipper = 0.0 ;
00170 nclipper = 0 ;
00171 for( vox=0 ; vox < numvox ; vox++ ){
00172 val = fabs(far[vox]) ;
00173 if( val >= ftop ){ clipper += val ; nclipper++ ; }
00174 }
00175 clipper = CLIP_FRAC * clipper / nclipper ;
00176 nclipper = 0 ;
00177 for( vox=0 ; vox < numvox ; vox++ ){
00178 val = fabs(far[vox]) ;
00179 if( val < clipper ){ far[vox] = 0.0 ; nclipper++ ; }
00180 }
00181 if( nclipper > 0 && !opt.quiet )
00182 printf("CLIPPING %d voxels to zero for low intensity in base image!\n",nclipper) ;
00183 }
00184
00185 refvec = (float *) malloc( sizeof(float) * nref ) ;
00186 if( refvec == NULL ) MALLOC_ERR("refvec") ;
00187
00188 /** July 1995: master loop over multiple ideals **/
00189
00190 for( ii_idts=0 ; ii_idts < nideal ; ii_idts++ ){
00191
00192 opt.refts->tsarr[nref-1] = opt.idts->tsarr[ii_idts] ; /* last ref = new ideal */
00193 wtnew = edit_weight( opt.weight , opt.idts->tsarr[ii_idts] ) ; /* make weight vector */
00194
00195 if( wtnew == NULL ){
00196 fprintf(stderr,"** bad weight at ideal # %d -- end of run!\a\n",ii_idts+1) ;
00197 exit(1) ;
00198 }
00199
00200 ref = new_references( nref ) ;
00201 voxcor = new_voxel_corr( numvox , nref ) ;
00202
00203 if( opt.rims != NULL ){
00204 nref_reg = nref - 3 ; /* don't use the 1st 3 refs */
00205 ref_reg = new_references( nref_reg ) ;
00206 voxcor_reg = new_voxel_corr( numvox , nref_reg ) ;
00207 }
00208
00209 /*** loop through time,
00210 getting new reference vector data, and
00211 new images to correlate with the references vectors ***/
00212
00213 itime = 0 ;
00214 do{
00215 int wt_not_one ;
00216
00217 /*** find weighting factor for this time ***/
00218
00219 wt = wtnew->ts[itime] ;
00220
00221 /*** process new image for this time (if any weight is given to it) ***/
00222
00223 if( wt != 0.0 ){
00224 wt_not_one = (wt != 1.0) ;
00225 voxim = (wt_not_one) ? mri_to_float( opt.ims->imarr[itime] ) /* copy */
00226 : opt.ims->imarr[itime] ; /* pointer */
00227 voxvec = MRI_FLOAT_PTR( voxim ) ;
00228 for( ii=0 ; ii < nref ; ii++ )
00229 refvec[ii] = opt.refts->tsarr[ii]->ts[itime] ;
00230 if( wt_not_one ){
00231 for( vox=0 ; vox < nref ; vox++ ) refvec[vox] *= wt ;
00232 for( vox=0 ; vox < numvox ; vox++ ) voxvec[vox] *= wt ;
00233 }
00234 update_references( refvec , ref ) ;
00235 update_voxel_corr( voxvec , ref , voxcor ) ;
00236 if( wt_not_one ) mri_free( voxim ) ;
00237
00238 /*** same for registered images, but don't use refs 0, 1, or 2 ***/
00239
00240 if( opt.rims != NULL ){
00241 voxim = (wt_not_one) ? mri_to_float( opt.rims->imarr[itime] ) /* copy */
00242 : opt.rims->imarr[itime] ; /* pointer */
00243 voxvec = MRI_FLOAT_PTR( voxim ) ;
00244 for( ii=0 ; ii < nref_reg ; ii++ )
00245 refvec[ii] = opt.refts->tsarr[ii+3]->ts[itime] ;
00246 if( wt_not_one ){
00247 for( vox=0 ; vox < nref_reg ; vox++ ) refvec[vox] *= wt ;
00248 for( vox=0 ; vox < numvox ; vox++ ) voxvec[vox] *= wt ;
00249 }
00250 update_references( refvec , ref_reg ) ;
00251 update_voxel_corr( voxvec , ref_reg , voxcor_reg ) ;
00252 if( wt_not_one ) mri_free( voxim ) ;
00253 }
00254 }
00255
00256 } while( ++itime < opt.ntime ) ;
00257
00258 /*** compute outputs ***/
00259
00260 imcor = mri_new( opt.nxim , opt.nyim , MRI_float ) ; /* output images */
00261 imalp = mri_new( opt.nxim , opt.nyim , MRI_float ) ;
00262 pcorr = MRI_FLOAT_PTR( imcor ) ; /* output arrays */
00263 alpha = MRI_FLOAT_PTR( imalp ) ;
00264
00265 get_pcor( ref , voxcor , pcorr ) ; /* compute partial correlation */
00266 get_coef( ref , voxcor , alpha ) ; /* compute activation levels */
00267
00268 /*** if have images AND registered images (DFBOTH), merge them ***/
00269
00270 if( opt.rims != NULL ){
00271 float pc , pcreg ;
00272
00273 imcor_reg = mri_new( opt.nxim , opt.nyim , MRI_float ) ; /* output images */
00274 imalp_reg = mri_new( opt.nxim , opt.nyim , MRI_float ) ;
00275 pcorr_reg = MRI_FLOAT_PTR( imcor ) ; /* output arrays */
00276 alpha_reg = MRI_FLOAT_PTR( imalp ) ;
00277
00278 get_pcor( ref_reg , voxcor_reg , pcorr_reg ) ;
00279 get_coef( ref_reg , voxcor_reg , alpha_reg ) ;
00280
00281 for( ii=0 ; ii < numvox ; ii++ ){
00282 pc = pcorr[ii] ; pcreg = pcorr_reg[ii] ;
00283 if( fabs(pc) > fabs(pcreg) ){
00284 pcorr[ii] = pcreg ; alpha[ii] = alpha_reg[ii] ;
00285 }
00286 }
00287
00288 mri_free( imalp_reg ) ; mri_free( imcor_reg ) ;
00289 free_references( ref_reg ) ; free_voxel_corr( voxcor_reg ) ;
00290 }
00291
00292 /*** June 1995: clip on intensities of first_flim ***/
00293
00294 if( CLIP_FRAC > 0.0 && opt.do_clip ){
00295 float * far = MRI_FLOAT_PTR( opt.first_flim ) ;
00296 for( vox=0 ; vox < numvox ; vox++ )
00297 if( far[vox] == 0.0 ){ pcorr[vox] = alpha[vox] = 0.0 ; }
00298 }
00299
00300 /*** store images for later processing ***/
00301
00302 ADDTO_IMARR( cor_ims , imcor ) ;
00303 ADDTO_IMARR( alp_ims , imalp ) ;
00304
00305 /*** compute CNR and SIG, if desired ***/
00306
00307 if( do_cnr || do_sig ){
00308 MRI_IMAGE * imcnr , * imsig ;
00309 float * cnr , * sig ;
00310 float rbot,rtop , scale , sbot ;
00311 int ii , first , its ;
00312
00313 first = 1 ;
00314 rbot = rtop = 0 ;
00315 its = nref - 1 ; /* index of ideal */
00316
00317 for( ii=0 ; ii < opt.ntime ; ii++ ){
00318 if( wtnew->ts[ii] > 0.0 ){
00319 if( first ){
00320 rtop = rbot = opt.refts->tsarr[its]->ts[ii] ;
00321 first = 0 ;
00322 } else {
00323 rbot = MIN( opt.refts->tsarr[its]->ts[ii] , rbot ) ;
00324 rtop = MAX( opt.refts->tsarr[its]->ts[ii] , rtop ) ;
00325 }
00326 }
00327 }
00328 scale = rtop-rbot ;
00329
00330 imsig = mri_new( opt.nxim , opt.nyim , MRI_float ) ;
00331 sig = MRI_FLOAT_PTR(imsig) ;
00332 get_variance( voxcor , sig ) ;
00333 sbot = 0.0 ;
00334 for( vox=0 ; vox < numvox ; vox++ )
00335 if( sig[vox] > 0.0 ){ sig[vox] = sqrt(sig[vox]) ; sbot += sig[vox] ; }
00336 else sig[vox] = 0.0 ;
00337 sbot = 0.001 * sbot / numvox ; /* for clipping cnr */
00338
00339 if( do_cnr ){
00340 imcnr = mri_new( opt.nxim , opt.nyim , MRI_float ) ;
00341 cnr = MRI_FLOAT_PTR(imcnr) ;
00342 for( vox=0 ; vox < numvox ; vox++ )
00343 if( sig[vox] > sbot ) cnr[vox] = scale * alpha[vox] / sig[vox] ;
00344 else cnr[vox] = 0.0 ;
00345 ADDTO_IMARR( cnr_ims , imcnr ) ;
00346
00347 #ifdef DEBUG
00348 { char buf[64] ;
00349 printf("ideal %d: sbot = %g\n",ii_idts,sbot) ;
00350 sprintf(buf,"cnr.%02d",ii_idts) ; mri_write(buf,imcnr) ;
00351 sprintf(buf,"sig.%02d",ii_idts) ; mri_write(buf,imsig) ;
00352 sprintf(buf,"alp.%02d",ii_idts) ; mri_write(buf,imalp) ;
00353 }
00354 #endif
00355 }
00356
00357 if( do_sig ) ADDTO_IMARR( sig_ims , imsig ) ;
00358 else mri_free(imsig) ;
00359 }
00360
00361 /** save fit coefficients for the -fitfile option **/
00362
00363 if( do_fit || do_subort ){
00364 MRI_IMARR * fitim ;
00365 MRI_IMAGE * tim ;
00366 float ** fitar ;
00367 int ir ;
00368
00369 INIT_IMARR(fitim) ; /* create array of fit coefficients */
00370 /* (one for each ref vector) */
00371
00372 fitar = (float **) malloc( sizeof(float *) * nref ) ;
00373 for( ir=0 ; ir < nref ; ir++ ){
00374 tim = mri_new( opt.nxim , opt.nyim , MRI_float ) ; /* ir-th fit image */
00375 fitar[ir] = MRI_FLOAT_PTR(tim) ; /* ir-th array */
00376 ADDTO_IMARR(fitim,tim) ;
00377 }
00378
00379 get_lsqfit( ref , voxcor , fitar ) ; /* compute all fit arrays at once */
00380 fit_ims[ii_idts] = fitim ; /* add a whole new image array */
00381
00382 free( fitar ) ; /* don't need these pointers, are stored in fit_ims */
00383 }
00384
00385 /*** cleanup for next ideal ***/
00386
00387 free_references( ref ) ; free_voxel_corr( voxcor ) ;
00388 RWC_free_time_series( wtnew ) ;
00389
00390 } /*** end of loop over ideals (ii_idts) ***/
00391
00392 /** release images and other data (unless they are needed below) **/
00393
00394 if( !do_subort ) DESTROY_IMARR(opt.ims) ;
00395 if( opt.rims != NULL ) DESTROY_IMARR(opt.rims) ;
00396
00397 opt.refts->tsarr[nref-1] = NULL ; /* this one is in opt.idts */
00398 if( !do_subort ) DESTROY_TSARR(opt.refts) ;
00399 DESTROY_TSARR(opt.idts) ;
00400
00401 mri_free( opt.first_flim ) ;
00402 free( refvec ) ;
00403 RWC_free_time_series( opt.weight ) ;
00404
00405 /*************** scan through all ideals and pick the "best" ***************/
00406
00407 if( nideal == 1 ){
00408 imcor = cor_ims->imarr[0] ;
00409 imalp = alp_ims->imarr[0] ;
00410 } else {
00411 imcor = mri_to_float( cor_ims->imarr[0] ) ; /* to be best correlation */
00412 pcorr = MRI_FLOAT_PTR( imcor ) ;
00413
00414 best_im = mri_new( opt.nxim , opt.nxim , MRI_int ) ; /* to be index of best */
00415 best = MRI_INT_PTR(best_im) ;
00416 for( vox=0 ; vox < numvox ; vox++ ) best[vox] = 0 ; /* start at first ideal */
00417
00418 /** find best correlation image **/
00419
00420 for( ii_idts=1 ; ii_idts < nideal ; ii_idts++ ){
00421 cornew = MRI_FLOAT_PTR( cor_ims->imarr[ii_idts] ) ; /* ii_idts'th correlation */
00422 for( vox=0 ; vox < numvox ; vox++ ){
00423 cnew = cornew[vox] ; cold = pcorr[vox] ;
00424 if( fabs(cnew) > fabs(cold) ){
00425 best[vox] = ii_idts ; pcorr[vox] = cnew ;
00426 }
00427 }
00428 }
00429
00430 /** load best alpha image **/
00431
00432 imalp = mri_new( opt.nxim , opt.nyim , MRI_float ) ;
00433 alpha = MRI_FLOAT_PTR( imalp ) ;
00434 for( vox=0 ; vox < numvox ; vox++ )
00435 alpha[vox] = MRI_FLOAT_PTR( alp_ims->imarr[best[vox]] )[vox] ;
00436 }
00437
00438 /*** write correlation and alpha out ***/
00439
00440 write_images( &opt , opt.fname_corr , imcor ,
00441 opt.thresh_pcorr, opt.fname_fim , imalp ) ;
00442
00443 /*** write a report to the screen ***/
00444
00445 npass_pos = npass_neg = 0 ;
00446
00447 for( vox=0 ; vox < numvox ; vox++ )
00448 if( fabs(pcorr[vox]) >= opt.thresh_pcorr ){
00449 if( pcorr[vox] > 0 ) npass_pos++ ;
00450 if( pcorr[vox] < 0 ) npass_neg++ ;
00451 }
00452
00453 cormin = mri_min( imcor ) ; cormax = mri_max( imcor ) ;
00454 alpmin = mri_min( imalp ) ; alpmax = mri_max( imalp ) ;
00455
00456 if( !opt.quiet ){
00457 printf( "minimum activation = %11.4g maximum = %11.4g\n", alpmin,alpmax);
00458 printf( "minimum correlation = %11.4g maximum = %11.4g\n", cormin,cormax);
00459 printf( "number of voxels with correlation >= %5.3f is %d\n",
00460 opt.thresh_pcorr , npass_pos ) ;
00461 printf( "number of voxels with correlation <= -%5.3f is %d\n",
00462 opt.thresh_pcorr , npass_neg ) ;
00463 }
00464
00465 DESTROY_IMARR( cor_ims ) ;
00466 DESTROY_IMARR( alp_ims ) ;
00467 if( nideal > 1 ){ mri_free(imcor) ; mri_free(imalp) ; }
00468
00469 /*** write CNR out ***/
00470
00471 if( do_cnr ){
00472 MRI_IMAGE * imcnr ;
00473 float * cnr ;
00474
00475 if( nideal == 1 ){
00476 imcnr = cnr_ims->imarr[0] ;
00477 } else {
00478 imcnr = mri_new( opt.nxim , opt.nyim , MRI_float ) ;
00479 cnr = MRI_FLOAT_PTR( imcnr ) ;
00480 for( vox=0 ; vox < numvox ; vox++ )
00481 cnr[vox] = MRI_FLOAT_PTR( cnr_ims->imarr[best[vox]] )[vox] ;
00482 }
00483
00484 if( opt.flim ){
00485 mri_write( opt.fname_cnr , imcnr ) ;
00486 } else {
00487 MRI_IMAGE * shim ;
00488 shim = mri_to_short( 100.0 , imcnr ) ;
00489 mri_write( opt.fname_cnr , shim ) ;
00490 mri_free( shim ) ;
00491 }
00492
00493 DESTROY_IMARR( cnr_ims ) ;
00494 if( nideal > 1 ) mri_free(imcnr) ;
00495 }
00496
00497 /*** write SIG out ***/
00498
00499 if( do_sig ){
00500 MRI_IMAGE * imsig ;
00501 float * sig ;
00502
00503 if( nideal == 1 ){
00504 imsig = sig_ims->imarr[0] ;
00505 } else {
00506 imsig = mri_new( opt.nxim , opt.nyim , MRI_float ) ;
00507 sig = MRI_FLOAT_PTR( imsig ) ;
00508 for( vox=0 ; vox < numvox ; vox++ )
00509 sig[vox] = MRI_FLOAT_PTR( sig_ims->imarr[best[vox]] )[vox] ;
00510 }
00511
00512 mri_write( opt.fname_sig , imsig ) ; /* always flim */
00513 DESTROY_IMARR( sig_ims ) ;
00514 if( nideal > 1 ) mri_free(imsig) ;
00515 }
00516
00517 /*** write FIT out ***/
00518
00519 if( do_fit || do_subort ){
00520 char root[128] , fname[128] ;
00521 int ir , ib ;
00522 MRI_IMAGE * tim ;
00523 float * tar , * qar ;
00524 float ortval ;
00525
00526 if( do_fit ){
00527 strcpy(root,opt.fname_fit) ; ir = strlen(root) ;
00528 if( root[ir-1] != '.' ){ root[ir] = '.' ; root[ir+1] = '\0' ; }
00529 }
00530
00531 /* if have more than 1 ideal, must pick best fit and put into new image */
00532
00533 if( nideal > 1 ){
00534 tim = mri_new( opt.nxim , opt.nyim , MRI_float ) ;
00535 tar = MRI_FLOAT_PTR( tim ) ;
00536 }
00537
00538 for( ir=0 ; ir < nref ; ir++ ){
00539 if( nideal == 1 ){
00540 tim = fit_ims[0]->imarr[ir] ; /* 1 ideal --> output the 1 fit */
00541 tar = MRI_FLOAT_PTR( tim ) ; /* ptr to coefficients */
00542 } else {
00543 for( vox=0 ; vox < numvox ; vox++ )
00544 tar[vox] = MRI_FLOAT_PTR( fit_ims[best[vox]]->imarr[ir] )[vox] ;
00545 }
00546
00547 if( do_fit ){
00548 sprintf(fname,"%s%02d",root,ir+1) ;
00549 mri_write( fname , tim ) ; /* always flim */
00550 }
00551
00552 if( do_subort && ir < nref-1 ){ /* subtract ort # ir from images */
00553
00554 for( itime=0 ; itime < opt.ntime ; itime++ ){ /* loop over time */
00555 ortval = opt.refts->tsarr[ir]->ts[itime] ;
00556 if( fabs(ortval) >= BLAST ) continue ; /* skip this one */
00557 qar = MRI_FLOAT_PTR(opt.ims->imarr[itime]) ; /* current image */
00558 for( vox=0 ; vox < numvox ; vox++ ) /* loop over space */
00559 qar[vox] -= ortval * tar[vox] ; /* subtract ort */
00560
00561 } /* end of loop over time */
00562 }
00563 } /* end of loop over ref vectors */
00564
00565 for( ii_idts=0 ; ii_idts < nideal ; ii_idts++ ) /* don't need fits no more */
00566 DESTROY_IMARR(fit_ims[ii_idts]) ;
00567 free(fit_ims) ;
00568
00569 if( nideal > 1 ) mri_free(tim) ; /* don't need best fit image no more */
00570
00571 if( do_subort ){
00572 strcpy(root,opt.fname_subort) ; ir = strlen(root) ;
00573 if( root[ir-1] != '.' ){ root[ir] = '.' ; root[ir+1] = '\0' ; }
00574
00575 for( itime=0 ; itime < opt.ntime ; itime++ ){
00576 sprintf(fname,"%s%04d",root,itime+1) ;
00577 mri_write( fname , opt.ims->imarr[itime] ) ; /* always flim */
00578 }
00579
00580 DESTROY_IMARR(opt.ims) ; /* no longer used */
00581 DESTROY_TSARR(opt.refts) ;
00582 }
00583 }
00584
00585 /******** all done ********/
00586
00587 if( nideal > 1 ) mri_free( best_im ) ;
00588 exit(0) ;
00589 }
|
|
|
convert images to float format * Definition at line 1506 of file fim2.c.
01507 {
01508 static char *mesg[] = {
01509 "Usage: fim2 [options] image_files ..." ,
01510 "where 'image_files ...' is a sequence of MRI filenames," ,
01511 " " ,
01512 "options are:",
01513 "-pcnt # correlation coeff. threshold will be 1 - 0.01 * #",
01514 "-pcthresh # correlation coeff. threshold will be #",
01515 "-im1 # index of image file to use as first in time series;",
01516 " default is 1; previous images are filled with this",
01517 " image to synchronize with the reference time series",
01518 "-num # number of images to actually use, if more than this",
01519 " many are specified on the command line; default is",
01520 " to use all images",
01521 "-non this option turns off the default normalization of",
01522 " the output activation image; the user should provide",
01523 " a scaling factor via '-coef #', or '1' will be used",
01524 "-coef # the scaling factor used to convert the activation output",
01525 " from floats to short ints (if -non is also present)",
01526 " ",
01527 "-ort fname fname = filename of a time series to which the image data",
01528 " will be orthogonalized before correlations are computed;",
01529 " any number of -ort options (from 0 on up) may be used",
01530 "-ideal fname fname = filename of a time series to which the image data",
01531 " is to be correlated; exactly one such time series is",
01532 " required; if the -ideal option is not used, then the",
01533 " first filename after all the options will be used",
01534 " N.B.: This version of fim2 allows the specification of more than",
01535 " one ideal time series file. Each one is separately correlated",
01536 " with the image time series and the one most highly correlated",
01537 " is selected for each pixel. Multiple ideals are specified",
01538 " using more than one '-ideal fname' option, or by using the",
01539 " form '-ideal [ fname1 fname2 ... ]' -- this latter method",
01540 " allows the use of wildcarded ideal filenames.",
01541 " The '[' character that indicates the start of a group of",
01542 " ideals can actually be any ONE of these: " OPENERS ,
01543 " and the ']' that ends the group can be: " CLOSERS ,
01544 " ",
01545 " [Format of ort and ideal time series files:",
01546 " ASCII; one number per line;",
01547 " Same number of lines as images in the time series;",
01548 " Value over 33333 --> don't use this image in the analysis]",
01549 " ",
01550 "-polref # use polynomials of order 0..# as extra 'orts';",
01551 "[or -polort #] default is 0 (yielding a constant vector).",
01552 " Use # = -1 to suppress this feature.",
01553 #if 0
01554 "-weight fname fname = filename of a times series to be used as weights",
01555 " in the correlation calculation; all time series",
01556 " (orts, ideal, and image) will be weighted at time i",
01557 " by the weight at that time; if not given, defaults to",
01558 " 1 at all times (but any ort or ideal >= 33333 gives 0)",
01559 #endif
01560 " ",
01561 "-fimfile fname fname = filename to save activation magnitudes in;",
01562 " if not given, the last name on the command line will",
01563 " be used",
01564 "-corr if present, indicates to write correlation output to",
01565 " image file 'fimfile.CORR' (next option is better)",
01566 "-corfile fname fname = filename to save correlation image in;",
01567 " if not present, and -corr is not present, correlation",
01568 " image is not saved.",
01569 "-cnrfile fname fname = filename to save contrast-to-noise image in;" ,
01570 " if not present, will not be computed or saved;" ,
01571 " CNR is scaled by 100 if images are output as shorts" ,
01572 " and is written 'as-is' if output as floats (see -flim)." ,
01573 " [CNR is defined here to be alpha/sigma, where" ,
01574 " alpha = amplitude of normalized ideal in a pixel" ,
01575 " sigma = standard deviation of pixel after removal" ,
01576 " of orts and ideal" ,
01577 " normalized ideal = ideal scaled so that trough-to-peak" ,
01578 " height is one.]" ,
01579 "-sigfile fname fname = filename to save standard deviation image in;" ,
01580 " the standard deviation is of what is left after the" ,
01581 " least squares removal of the -orts, -polrefs, and -ideal." ,
01582 " N.B.: This is always output in the -flim format!" ,
01583 "-fitfile fname Image files of the least squares fit coefficients of" ,
01584 " all the -ort and -polref time series that" ,
01585 " are projected out of the data time series before" ,
01586 " the -ideal is fit. The actual filenames will" ,
01587 " be fname.01 fname.02 ...." ,
01588 " Their order is -orts, then -polrefs, and last -ideal." ,
01589 " N.B.: These are always output in the -flim format!" ,
01590 "-subort fname A new timeseries of images is written to disk, with",
01591 " names of the form 'fname.0001', etc. These images",
01592 " have the orts and polrefs (but not ideals) subtracted out.",
01593 " N.B.: These are always output in the -flim format!" ,
01594 "-flim If present, write outputs in mrilib 'float' format,",
01595 " rather than scale+convert to integers",
01596 " [The 'ftosh' program can later convert to short integers]",
01597 "-clean if present, then output images won't have the +/- 10000",
01598 " values forced into their corners for scaling purposes.",
01599 "-clip if present, output correlations, etc., will be set to",
01600 " zero in regions of low intensity.",
01601 "-q if present, indicates 'quiet' operation.",
01602 "-dfspace[:0] Indicates to use the 'dfspace' filter (a la imreg) to",
01603 " register the images spatially before filtering." ,
01604 #ifdef ALLOW_DFTIME
01605 "-dftime[:0] Indicates to use the 'dftime' filter (a la imreg) to",
01606 " produce 3 additional orts, in an attempt to reduce",
01607 " motion artifacts.",
01608 "-dfboth[:0] Indicates to use both -dftime and -dfspace (separately)," ,
01609 " then take as the resulting correlation the smaller of the",
01610 " two results in each pixel (the conservative approach: " ,
01611 " to be above -pcthresh, both calculations must 'hit')." ,
01612 " The resulting fim is the one corresponding to the chosen" ,
01613 " correlation in each pixel." ,
01614 "-dfspacetime:[0] Indicates to use -dfspace and then -dftime together",
01615 " (not separately) on the time series of images." ,
01616 #endif
01617 "-regbase fname Indicates to read image in file 'fname' as the base",
01618 " image for registration. If not given, the first image",
01619 " in the time series that is used in the correlation",
01620 " computations will be used. This is also the image",
01621 " that is used to define 'low intensity' for the -clip option.",
01622 " "
01623 } ;
01624
01625 int nsize , ii ;
01626
01627 if( note != NULL && (nsize=strlen(note)) > 0 ){
01628 fprintf(stderr,"\n") ;
01629 for(ii=0;ii<nsize;ii++) fprintf(stderr,"*") ;
01630 fprintf(stderr,"\a\n%s\n", note ) ;
01631 for(ii=0;ii<nsize;ii++) fprintf(stderr,"*") ;
01632 fprintf(stderr,"\ntry fim2 -help for instructions\a\n") ;
01633 exit(-1) ;
01634 }
01635
01636 for( ii=0 ; ii < sizeof(mesg)/sizeof(char *) ; ii++ ){
01637 printf( " %s\n" , mesg[ii] );
01638 }
01639 exit(0) ;
01640 }
|
|
||||||||||||||||||||||||||||
|
load best alpha image * Definition at line 596 of file fim2.c. References line_opt::flim, MRI_DATA::float_data, MRI_IMAGE::im, mri_free(), mri_max(), mri_min(), MRI_SHORT_PTR, mri_to_short(), mri_write(), line_opt::norm_fim, MRI_IMAGE::nx, MRI_IMAGE::ny, SCALE, line_opt::scale_fim, and line_opt::scale_output. Referenced by main().
00598 {
00599 int vox ,
00600 numvox = imcor->nx * imcor->ny ;
00601
00602 float *pcorr = imcor->im.float_data ,
00603 *alpha = imalp->im.float_data ;
00604
00605 MRI_IMAGE *shim ; /* image of shorts to actually write */
00606 short *shar ; /* array inside shim */
00607
00608 float sfac , alpmin , alpmax ;
00609
00610 /*** threshold alpha on pcorr ***/
00611
00612 if( thresh_cor > 0.0 ){
00613 for( vox=0 ; vox < numvox ; vox++ )
00614 if( fabs(pcorr[vox]) < thresh_cor ) alpha[vox] = 0.0 ;
00615 }
00616
00617 /*** write output images ***/
00618
00619 if( opt->flim ){ /* write floating point images [an advanced user :-)] */
00620
00621 if( fname_imcor != NULL ){ /* write correlation image */
00622 mri_write( fname_imcor , imcor ) ;
00623 }
00624
00625 if( fname_imalp != NULL ){ /* write activation image */
00626 mri_write( fname_imalp , imalp ) ;
00627 }
00628
00629 } else { /* write short images [a primitive user :-(] */
00630
00631 /*** scale and write correlation image ***/
00632
00633 if( fname_imcor != NULL ){
00634
00635 sfac = SCALE ;
00636 shim = mri_to_short( sfac , imcor ) ; /* scale to shorts */
00637
00638 if( opt->scale_output ){
00639 shar = MRI_SHORT_PTR( shim ) ; /* access array in shim */
00640 shar[0] = 0 ; /* for display purposes */
00641 shar[1] = -SCALE ;
00642 shar[2] = SCALE ;
00643 }
00644
00645 mri_write( fname_imcor , shim ) ; /* write short image */
00646 mri_free( shim ) ; /* toss it away */
00647 }
00648
00649 /*** scale and write activation image ***/
00650
00651 if( fname_imalp != NULL ){
00652
00653 alpmin = mri_min( imalp ) ; alpmin = fabs(alpmin) ; /* find */
00654 alpmax = mri_max( imalp ) ; alpmax = fabs(alpmax) ; /* biggest */
00655 alpmax = (alpmin < alpmax) ? (alpmax) : (alpmin) ; /* alpha */
00656
00657 /*** default scaling (normalization) ***/
00658
00659 if( opt->norm_fim ){ /* normalize alpha to +/-SCALE range */
00660 if( alpmax==0.0 ){ /* no data range! */
00661 sfac = SCALE ;
00662 } else {
00663 sfac = SCALE / alpmax ;
00664 }
00665 } else {
00666
00667 /*** user input scale factor ***/
00668
00669 sfac = opt->scale_fim ;
00670 }
00671
00672 shim = mri_to_short( sfac , imalp ) ; /* do the scaling */
00673 shar = MRI_SHORT_PTR( shim ) ; /* get array of shorts */
00674
00675 for( vox=0 ; vox < numvox ; vox++ )
00676 if( shar[vox] > SCALE ) shar[vox] = SCALE ;
00677 else if( shar[vox] < -SCALE ) shar[vox] = -SCALE ;
00678
00679 if( opt->scale_output ){
00680 shar = MRI_SHORT_PTR( shim ) ; /* access array in shim */
00681 shar[0] = 0 ; /* for display purposes */
00682 shar[1] = -SCALE ;
00683 shar[2] = SCALE ;
00684 }
00685
00686 mri_write( fname_imalp , shim ) ; /* write short image */
00687 mri_free( shim ) ; /* and toss it */
00688 }
00689
00690 } /* endif (opt->flim) */
00691
00692 return ;
00693 }
|