Doxygen Source Code Documentation
plug_histog.c File Reference
#include "afni.h"#include "uuu.c"Go to the source code of this file.
Defines | |
| #define | FIT_FISHER |
Functions | |
| char * | HISTO_main (PLUGIN_interface *) |
| PLUGIN_interface * | CORREL_init (void) |
| DEFINE_PLUGIN_PROTOTYPE PLUGIN_interface * | PLUGIN_init (int ncall) |
| char * | CORREL_main (PLUGIN_interface *) |
Variables | |
| char | helpstring [] |
| char | c_helpstring [] |
Define Documentation
|
|
Definition at line 550 of file plug_histog.c. |
Function Documentation
|
|
Definition at line 589 of file plug_histog.c. References ANAT_ALL_MASK, c_helpstring, CORREL_main(), FUNC_ALL_MASK, FUNC_FIM_MASK, PLUTO_add_hint(), and PLUTO_set_sequence(). Referenced by PLUGIN_init().
00590 {
00591 PLUGIN_interface * plint ;
00592
00593 /*-- set titles and call point --*/
00594
00595 plint = PLUTO_new_interface( "Histogram: CC" ,
00596 "Histogram of Correlation Coefficient" ,
00597 c_helpstring ,
00598 PLUGIN_CALL_VIA_MENU , CORREL_main ) ;
00599
00600 PLUTO_add_hint( plint , "Histogram: Correlation Coefficient" ) ;
00601
00602 PLUTO_set_sequence( plint , "A:afniinfo:dset" ) ;
00603
00604 /*-- first line of input --*/
00605
00606 PLUTO_add_option( plint , "Source" , "Source" , TRUE ) ;
00607
00608 PLUTO_add_dataset( plint ,
00609 "Dataset" , /* label next to button */
00610 ANAT_ALL_MASK , /* take any anat datasets */
00611 FUNC_FIM_MASK , /* only allow fim funcs */
00612 DIMEN_4D_MASK | /* need 3D+time datasets */
00613 BRICK_ALLREAL_MASK /* need real-valued datasets */
00614 ) ;
00615
00616 PLUTO_add_number( plint ,
00617 "Ignore" , /* label next to chooser */
00618 0 , /* smallest possible value */
00619 999 , /* largest possible value */
00620 0 , /* decimal shift (none in this case) */
00621 4 , /* default value */
00622 TRUE /* allow user to edit value? */
00623 ) ;
00624
00625 /*-- second line of input --*/
00626
00627 PLUTO_add_option( plint , "Vector" , "Vector" , TRUE ) ;
00628
00629 PLUTO_add_timeseries( plint , "1D File" ) ;
00630
00631 PLUTO_add_number( plint , "Polort" , 0,MAX_POLORT,0,1,FALSE ) ;
00632
00633 /*-- (optional) third line of input --*/
00634
00635 PLUTO_add_option( plint , "Mask" , "Mask" , FALSE ) ;
00636 PLUTO_add_dataset( plint , "Dataset" ,
00637 ANAT_ALL_MASK , FUNC_ALL_MASK ,
00638 DIMEN_ALL_MASK | BRICK_ALLREAL_MASK ) ;
00639 PLUTO_add_number( plint , "Sub-brick" , 0,9999,0 , 0,1 ) ;
00640
00641 /*-- (optional) fourth line of input --*/
00642
00643 PLUTO_add_option( plint , "Range" , "Range" , FALSE ) ;
00644 PLUTO_add_number( plint , "Bottom" , -99999,99999, 1, 0,1 ) ;
00645 PLUTO_add_number( plint , "Top" , -99999,99999,-1, 0,1 ) ;
00646
00647
00648 return plint ;
00649 }
|
|
|
Definition at line 655 of file plug_histog.c. References calloc, correl_t2p(), DSET_ARRAY, DSET_BRICK_FACTOR, DSET_BRICK_TYPE, DSET_FILECODE, DSET_load, DSET_NUM_TIMES, DSET_NVALS, DSET_NVOX, DSET_unload, EQUIV_DSETS, free, free_PCOR_references(), free_PCOR_voxel_corr(), malloc, mmm, mri_clear_data_pointer, mri_fix_data_pointer(), MRI_FLOAT_PTR, mri_free(), mri_histogram(), mri_new_vol_empty(), mri_to_float(), my_getenv(), MRI_IMAGE::name, new_PCOR_references(), new_PCOR_voxel_corr(), MRI_IMAGE::nx, PCOR_get_pcor(), PCOR_update_float(), PLUTO_find_dset(), PLUTO_histoplot(), qsort_float(), set_unusuality_tail(), strtod(), THD_countmask(), THD_makemask(), THD_MAX_NAME, unusuality(), and update_PCOR_references(). Referenced by CORREL_init().
00656 {
00657 MCW_idcode * idc ;
00658 THD_3dim_dataset * input_dset , * mask_dset = NULL ;
00659 MRI_IMAGE * tsim , * flim ;
00660 int ignore , nvox , ntim , polort , miv , it , ip , nupdt , nbin ;
00661 int mcount , ii , jj ;
00662 float * tsar ;
00663 float mask_bot=666.0 , mask_top=-666.0 , hbot,htop ;
00664 byte * mmm ;
00665 char buf[THD_MAX_NAME+16] , * tag ;
00666
00667 PCOR_references * pc_ref ;
00668 PCOR_voxel_corr * pc_vc ;
00669 int fim_nref ;
00670 float * ref_vec , * vval , * zval , * aval ;
00671 int * hbin , * jbin , * kbin , *jist[2] ;
00672 float sum , sumq , dbin , gval,rval,gg , sqp , zmid,zmed,zsig ;
00673 float pstar,zstar,zplus,zminus,psum,msum ;
00674
00675 /*--------------------------------------------------------------------*/
00676 /*----- Check inputs from AFNI to see if they are reasonable-ish -----*/
00677
00678 if( plint == NULL )
00679 return "************************\n"
00680 "CORREL_main: NULL input\n"
00681 "************************" ;
00682
00683 /*-- read 1st line --*/
00684
00685 PLUTO_next_option(plint) ;
00686 idc = PLUTO_get_idcode(plint) ;
00687 input_dset = PLUTO_find_dset(idc) ;
00688 if( input_dset == NULL )
00689 return "*******************************\n"
00690 "CORREL_main: bad input dataset\n"
00691 "*******************************" ;
00692
00693 nvox = DSET_NVOX(input_dset) ;
00694 ntim = DSET_NUM_TIMES(input_dset) ;
00695
00696 ignore = (int) PLUTO_get_number(plint) ;
00697 if( ignore >= ntim-5 || ignore < 0 )
00698 return "******************************\n"
00699 "CORREL_main: bad ignore count\n"
00700 "******************************" ;
00701
00702 DSET_load(input_dset) ;
00703 if( DSET_ARRAY(input_dset,0) == NULL )
00704 return "********************************\n"
00705 "CORREL_main: can't load dataset\n"
00706 "********************************" ;
00707
00708 /*-- read 2nd line --*/
00709
00710 PLUTO_next_option(plint) ;
00711 tsim = PLUTO_get_timeseries(plint) ;
00712 if( tsim == NULL || tsim->nx < ntim )
00713 return "*****************************\n"
00714 "CORREL_main: bad input vector\n"
00715 "*****************************" ;
00716
00717 flim = mri_to_float(tsim) ; tsar = MRI_FLOAT_PTR(flim) ;
00718
00719 polort = (int) PLUTO_get_number(plint) ;
00720
00721 /*-- read optional lines --*/
00722
00723 while( (tag=PLUTO_get_optiontag(plint)) != NULL ){
00724
00725 /*-- Mask range of values --*/
00726
00727 if( strcmp(tag,"Range") == 0 ){
00728 if( mask_dset == NULL ){
00729 mri_free(flim) ;
00730 return "******************************************\n"
00731 "CORREL_main: Can't use Range without Mask\n"
00732 "******************************************" ;
00733 }
00734
00735 mask_bot = PLUTO_get_number(plint) ;
00736 mask_top = PLUTO_get_number(plint) ;
00737 continue ;
00738 }
00739
00740 /*-- Mask itself --*/
00741
00742 if( strcmp(tag,"Mask") == 0 ){
00743
00744 idc = PLUTO_get_idcode(plint) ;
00745 mask_dset = PLUTO_find_dset(idc) ;
00746
00747 if( mask_dset == NULL ){
00748 mri_free(flim) ;
00749 return "******************************\n"
00750 "CORREL_main: bad mask dataset\n"
00751 "******************************" ;
00752 }
00753
00754 if( DSET_NVOX(mask_dset) != nvox ){
00755 mri_free(flim) ;
00756 return "************************************************************\n"
00757 "CORREL_main: mask input dataset doesn't match source dataset\n"
00758 "************************************************************" ;
00759 }
00760
00761 miv = (int) PLUTO_get_number(plint) ;
00762 if( miv >= DSET_NVALS(mask_dset) || miv < 0 ){
00763 mri_free(flim) ;
00764 return "****************************************************\n"
00765 "CORREL_main: mask dataset sub-brick index is illegal\n"
00766 "****************************************************" ;
00767 }
00768
00769 DSET_load(mask_dset) ;
00770 if( DSET_ARRAY(mask_dset,miv) == NULL ){
00771 mri_free(flim) ;
00772 return "*************************************\n"
00773 "CORREL_main: can't load mask dataset\n"
00774 "*************************************" ;
00775 }
00776 continue ;
00777 }
00778 }
00779
00780 /*------------------------------------------------------*/
00781 /*---------- At this point, the inputs are OK ----------*/
00782
00783 /*-- build a byte mask array --*/
00784
00785 if( mask_dset == NULL ){
00786 mmm = (byte *) malloc( sizeof(byte) * nvox ) ;
00787 if( mmm == NULL )
00788 return " \n*** Can't malloc workspace! ***\n" ;
00789 memset( mmm , 1, nvox ) ; mcount = nvox ;
00790 } else {
00791
00792 mmm = THD_makemask( mask_dset , miv , mask_bot , mask_top ) ;
00793 if( mmm == NULL )
00794 return " \n*** Can't make mask for some reason! ***\n" ;
00795 mcount = THD_countmask( nvox , mmm ) ;
00796
00797 if( !EQUIV_DSETS(mask_dset,input_dset) ) DSET_unload(mask_dset) ;
00798 if( mcount < 3 ){
00799 free(mmm) ;
00800 return " \n*** Less than 3 voxels survive the mask! ***\n" ;
00801 }
00802 sprintf(buf," \n"
00803 " %d voxels in the mask\n"
00804 " out of %d dataset voxels\n ",mcount,nvox) ;
00805 PLUTO_popup_transient(plint,buf) ;
00806 }
00807
00808 /*-- setup to do the FIM calculation --*/
00809
00810 fim_nref = polort+2 ;
00811 ref_vec = (float *) malloc( sizeof(float) * fim_nref ) ;
00812 vval = (float *) malloc( sizeof(float) * mcount ) ;
00813
00814 pc_ref = new_PCOR_references( fim_nref ) ;
00815 pc_vc = new_PCOR_voxel_corr( mcount , fim_nref ) ;
00816
00817 /*-- do FIM --*/
00818
00819 for( nupdt=0,it=ignore ; it < ntim ; it++ ){
00820 if( tsar[it] >= WAY_BIG ) continue ; /* skip this */
00821
00822 ref_vec[0] = 1.0 ;
00823 for( ip=1 ; ip <= polort ; ip++ )
00824 ref_vec[ip] = ref_vec[ip-1] * ((float)it) ;
00825
00826 ref_vec[ip] = tsar[it] ; /* vector value */
00827
00828 update_PCOR_references( ref_vec , pc_ref ) ;
00829
00830 /*-- load values into vval --*/
00831
00832 switch( DSET_BRICK_TYPE(input_dset,it) ){
00833
00834 case MRI_short:{
00835 short * bar = (short *) DSET_ARRAY(input_dset,it) ;
00836 float mfac = DSET_BRICK_FACTOR(input_dset,it) ;
00837 if( mfac == 0.0 ) mfac = 1.0 ;
00838 for( ii=jj=0 ; ii < nvox ; ii++ )
00839 if( mmm[ii] ) vval[jj++] = mfac*bar[ii] ;
00840 }
00841 break ;
00842
00843 case MRI_byte:{
00844 byte * bar = (byte *) DSET_ARRAY(input_dset,it) ;
00845 float mfac = DSET_BRICK_FACTOR(input_dset,it) ;
00846 if( mfac == 0.0 ) mfac = 1.0 ;
00847 for( ii=jj=0 ; ii < nvox ; ii++ )
00848 if( mmm[ii] ) vval[jj++] = mfac*bar[ii] ;
00849 }
00850 break ;
00851
00852 case MRI_float:{
00853 float * bar = (float *) DSET_ARRAY(input_dset,it) ;
00854 float mfac = DSET_BRICK_FACTOR(input_dset,it) ;
00855 if( mfac == 0.0 ) mfac = 1.0 ;
00856 for( ii=jj=0 ; ii < nvox ; ii++ )
00857 if( mmm[ii] ) vval[jj++] = mfac*bar[ii] ;
00858 }
00859 break ;
00860 }
00861
00862 PCOR_update_float( vval , pc_ref , pc_vc ) ;
00863 nupdt++ ;
00864 }
00865
00866 free(ref_vec) ; mri_free(flim) ; free(mmm) ;
00867
00868 /*-- get correlation coefficient --*/
00869
00870 PCOR_get_pcor( pc_ref , pc_vc , vval ) ;
00871
00872 free_PCOR_references(pc_ref) ; free_PCOR_voxel_corr(pc_vc) ;
00873
00874 /*-- compute statistics --*/
00875
00876 sum = 0.0 ;
00877 for( ii=0 ; ii < mcount ; ii++ ) sum += vval[ii] ;
00878 sum /= mcount ; sumq = 0.0 ;
00879 for( ii=0 ; ii < mcount ; ii++ )
00880 sumq += (vval[ii]-sum)*(vval[ii]-sum) ;
00881 sumq = sqrt(sumq/mcount) ;
00882
00883 /*-- get robust statistics of Fisher z-transform --*/
00884
00885 zval = (float *) malloc( sizeof(float) * mcount ) ;
00886 aval = (float *) malloc( sizeof(float) * mcount ) ;
00887 for( ii=0 ; ii < mcount ; ii++ ) zval[ii] = atanh(vval[ii]) ;
00888 qsort_float( mcount , zval ) ;
00889 if( mcount%2 == 1 ) /* median */
00890 zmid = zval[mcount/2] ;
00891 else
00892 zmid = 0.5 * ( zval[mcount/2] + zval[mcount/2-1] ) ;
00893
00894 for( ii=0 ; ii < mcount ; ii++ ) aval[ii] = fabs(zval[ii]-zmid) ;
00895 qsort_float( mcount , aval ) ;
00896 if( mcount%2 == 1 ) /* MAD = median absolute deviation */
00897 zmed = aval[mcount/2] ;
00898 else
00899 zmed = 0.5 * ( aval[mcount/2] + aval[mcount/2-1] ) ;
00900 zsig = 1.4826 * zmed ; /* estimate st.dev. */
00901 /* 1/1.4826 = sqrt(2)*erfinv(0.5) */
00902 free(aval) ;
00903 free(zval) ;
00904
00905 /*-- do histogram --*/
00906
00907 hbot = -1.0 ; htop = 1.0 ; nbin = 100 ; dbin = (htop-hbot)/nbin ;
00908
00909 hbin = (int *) calloc((nbin+1),sizeof(int)) ;
00910 jbin = (int *) calloc((nbin+1),sizeof(int)) ; /* 04 Oct 1999 */
00911
00912 #ifndef FIT_FISHER
00913 sqp = 1.0/(sqrt(2.0*PI)*sumq) ; /* Gaussian fit */
00914 for( ii=0 ; ii < nbin ; ii++ ){ /* to rho data */
00915 gval = hbot + (ii+0.5)*dbin - sum ;
00916 gval = sqp * exp( -0.5*gval*gval/(sumq*sumq) ) ;
00917 jbin[ii] = (int)( mcount * dbin * gval + 0.5 ) ;
00918 }
00919 #else
00920 sqp = 1.0/(sqrt(2.0*PI)*zsig) ; /* Gaussian fit */
00921 for( ii=0 ; ii < nbin ; ii++ ){ /* to z(rho) */
00922 rval = hbot + (ii+0.5)*dbin ;
00923 gval = atanh(rval) - zmid ;
00924 gval = sqp * exp( -0.5*gval*gval/(zsig*zsig) )/sqrt(1.0-rval*rval) ;
00925 jbin[ii] = (int)( mcount * dbin * gval + 0.5 ) ;
00926 }
00927 sum = tanh(zmid) ;
00928 sumq = 0.5*( tanh(zmid+zmed) - tanh(zmid-zmed) ) ;
00929 #endif
00930
00931 kbin = (int *) calloc((nbin+1),sizeof(int)) ;
00932 for( ii=0 ; ii < nbin ; ii++ ){
00933 gval = correl_t2p( fabs(hbot+ii*dbin) ,
00934 (double)nupdt , (double)1 , (double)(polort+1) ) ;
00935 sqp = correl_t2p( fabs(hbot+(ii+1)*dbin) ,
00936 (double)nupdt , (double)1 , (double)(polort+1) ) ;
00937 kbin[ii] = (int)( 0.5*mcount*fabs(gval-sqp) ) ;
00938 }
00939 jist[0] = jbin ; jist[1] = kbin ;
00940
00941 flim = mri_new_vol_empty( mcount,1,1 , MRI_float ) ;
00942 mri_fix_data_pointer( vval , flim ) ;
00943 mri_histogram( flim , hbot,htop , TRUE , nbin,hbin ) ;
00944
00945 { char * ps = my_getenv("PTAIL") ;
00946 float pp=0.0 ;
00947 if( ps != NULL ) pp = strtod(ps,NULL) ;
00948 set_unusuality_tail(pp) ;
00949 }
00950
00951 for( ii=0 ; ii < mcount ; ii++ ) vval[ii] = -vval[ii] ;
00952 msum = unusuality( mcount , vval ) ;
00953 for( ii=0 ; ii < mcount ; ii++ ) vval[ii] = -vval[ii] ;
00954 psum = unusuality( mcount , vval ) ;
00955
00956 sprintf(buf,"%s^.%s:\\rho_{mid}=%.2f\\pm%.2f,u=%.1f,%.1f",
00957 DSET_FILECODE(input_dset),
00958 (tsim->name != NULL) ? THD_trailname(tsim->name,0) : " " ,
00959 sum,sumq , psum,msum ) ;
00960 #ifdef DO_GREEN
00961 PLUTO_histoplot( nbin,hbot,htop,hbin ,
00962 "Correlation Coefficient",NULL,buf , 2,jist ) ;
00963 #else
00964 PLUTO_histoplot( nbin,hbot,htop,hbin ,
00965 "Correlation Coefficient",NULL,buf , 1,jist ) ;
00966 #endif
00967
00968 mri_clear_data_pointer(flim) ; mri_free(flim) ;
00969 free(vval) ; free(hbin) ; free(jbin) ; free(kbin) ;
00970 return NULL ;
00971 }
|
|
|
Definition at line 132 of file plug_histog.c. References abs, ADDTO_CLUSTER, calloc, DSET_ARRAY, DSET_BRICK_FACTOR, DSET_BRICK_TYPE, DSET_DX, DSET_DY, DSET_DZ, DSET_FILECODE, DSET_load, DSET_NVALS, DSET_NVOX, DSET_NX, DSET_NY, DSET_NZ, DSET_PREFIX, DSET_unload, EQUIV_DSETS, free, MCW_cluster::i, MCW_cluster::j, MCW_cluster::k, KILL_CLUSTER, malloc, MCW_build_mask(), MIN, mmm, MRI_FLOAT_PTR, mri_free(), mri_histogram(), mri_max(), mri_min(), mri_new(), MCW_cluster::num_pt, MRI_IMAGE::nvox, MRI_IMAGE::nx, nz, PLUTO_find_dset(), PLUTO_histoplot(), THD_countmask(), THD_is_file(), THD_makemask(), and THD_MAX_NAME. Referenced by PLUGIN_init().
00133 {
00134 MCW_idcode * idc ;
00135 THD_3dim_dataset * input_dset , * mask_dset=NULL ;
00136 int iv , mcount , nvox , ii,jj , nbin=-1 , do_mval=0,mval ;
00137 float mask_bot=666.0 , mask_top=-666.0 , hbot,htop ;
00138 float val_bot=666.0 , val_top=-666.0 ;
00139 char * tag , * str , buf[THD_MAX_NAME+16] ;
00140 byte * mmm ;
00141 MRI_IMAGE * flim ;
00142 float * flar ;
00143 int * hbin ;
00144 int smooth=0 ; /* 03 Dec 2004 */
00145
00146 int miv=0 ;
00147
00148 int maxcount=0 ; /* 01 Mar 2001 */
00149 float hrad=0.0 ; /* 20 Mar 2001 */
00150
00151 char * histout=NULL ; /* 05 Feb 2002 - VR */
00152 FILE * HISTOUT=NULL ; /* 05 Feb 2002 - VR */
00153 int writehist=0 ; /* 05 Feb 2002 - VR */
00154 float dx ; /* 05 Feb 2002 - VR */
00155
00156 /*--------------------------------------------------------------------*/
00157 /*----- Check inputs from AFNI to see if they are reasonable-ish -----*/
00158
00159 if( plint == NULL )
00160 return "***********************\n"
00161 "HISTO_main: NULL input\n"
00162 "***********************" ;
00163
00164 /*-- read 1st line --*/
00165
00166 PLUTO_next_option(plint) ;
00167 idc = PLUTO_get_idcode(plint) ;
00168 input_dset = PLUTO_find_dset(idc) ;
00169 if( input_dset == NULL )
00170 return "******************************\n"
00171 "HISTO_main: bad input dataset\n"
00172 "******************************" ;
00173
00174 iv = (int) PLUTO_get_number(plint) ;
00175 if( iv >= DSET_NVALS(input_dset) || iv < 0 )
00176 return "********************************\n"
00177 "HISTO_main: bad input sub-brick\n"
00178 "********************************" ;
00179
00180 DSET_load(input_dset) ;
00181 if( DSET_ARRAY(input_dset,iv) == NULL )
00182 return "*******************************\n"
00183 "HISTO_main: can't load dataset\n"
00184 "*******************************" ;
00185 nvox = DSET_NVOX(input_dset) ;
00186
00187 /*-- read optional lines --*/
00188
00189 while( (tag=PLUTO_get_optiontag(plint)) != NULL ){
00190
00191 /*-- Dataset range of values --*/
00192
00193 if( strcmp(tag,"Values") == 0 ){
00194 val_bot = PLUTO_get_number(plint) ;
00195 val_top = PLUTO_get_number(plint) ;
00196 do_mval = (val_bot < val_top) ;
00197 continue ;
00198 }
00199
00200 /*-- Number of bins --*/
00201
00202 if( strcmp(tag,"Bins") == 0 ){
00203 nbin = PLUTO_get_number(plint) ;
00204 maxcount = PLUTO_get_number(plint) ;
00205 smooth = PLUTO_get_number(plint) ; /* 03 Dec 2004 */
00206 continue ;
00207 }
00208
00209 /*-- Mask range of values --*/
00210
00211 if( strcmp(tag,"Range") == 0 ){
00212 if( mask_dset == NULL )
00213 return "*****************************************\n"
00214 "HISTO_main: Can't use Range without Mask\n"
00215 "*****************************************" ;
00216
00217 mask_bot = PLUTO_get_number(plint) ;
00218 mask_top = PLUTO_get_number(plint) ;
00219 continue ;
00220 }
00221
00222 /*-- Mask itself --*/
00223
00224 if( strcmp(tag,"Mask") == 0 ){
00225
00226 idc = PLUTO_get_idcode(plint) ;
00227 mask_dset = PLUTO_find_dset(idc) ;
00228
00229 if( mask_dset == NULL )
00230 return "*****************************\n"
00231 "HISTO_main: bad mask dataset\n"
00232 "*****************************" ;
00233
00234 if( DSET_NVOX(mask_dset) != nvox )
00235 return "***********************************************************\n"
00236 "HISTO_main: mask input dataset doesn't match source dataset\n"
00237 "***********************************************************" ;
00238
00239 miv = (int) PLUTO_get_number(plint) ; /* 06 Aug 1998 */
00240 if( miv >= DSET_NVALS(mask_dset) || miv < 0 )
00241 return "***************************************************\n"
00242 "HISTO_main: mask dataset sub-brick index is illegal\n"
00243 "***************************************************" ;
00244
00245 DSET_load(mask_dset) ;
00246 if( DSET_ARRAY(mask_dset,miv) == NULL )
00247 return "************************************\n"
00248 "HISTO_main: can't load mask dataset\n"
00249 "************************************" ;
00250 continue ;
00251 }
00252
00253 /*-- 20 Mar 2001: Aboot --*/
00254
00255 if( strcmp(tag,"Aboot") == 0 ){
00256 hrad = PLUTO_get_number(plint) ;
00257 continue ;
00258 }
00259
00260 /*-- 05 Feb 2002: Output - VR --*/
00261
00262 if( strcmp(tag,"Output") == 0 ){
00263 histout = PLUTO_get_string(plint) ;
00264 writehist = 1 ;
00265 continue ;
00266 }
00267 }
00268
00269 /*------------------------------------------------------*/
00270 /*---------- At this point, the inputs are OK ----------*/
00271
00272 /*-- build a byte mask array --*/
00273
00274 if( mask_dset == NULL ){
00275 mmm = (byte *) malloc( sizeof(byte) * nvox ) ;
00276 if( mmm == NULL )
00277 return " \n*** Can't malloc workspace! ***\n" ;
00278 memset( mmm , 1, nvox ) ; mcount = nvox ;
00279 } else {
00280
00281 mmm = THD_makemask( mask_dset , miv , mask_bot , mask_top ) ;
00282 if( mmm == NULL )
00283 return " \n*** Can't make mask for some reason! ***\n" ;
00284 mcount = THD_countmask( nvox , mmm ) ;
00285
00286 if( !EQUIV_DSETS(mask_dset,input_dset) ) DSET_unload(mask_dset) ;
00287 if( mcount < 3 ){
00288 free(mmm) ;
00289 return " \n*** Less than 3 voxels survive the mask! ***\n" ;
00290 }
00291 sprintf(buf," \n"
00292 " %d voxels in the mask\n"
00293 " out of %d dataset voxels\n ",mcount,nvox) ;
00294 PLUTO_popup_transient(plint,buf) ;
00295 }
00296
00297 /*-- 20 Mar 2001: modify mask via Aboot Radius, if present --*/
00298
00299 if( hrad > 0.0 ){
00300 MCW_cluster * cl ;
00301 short *di,*dj,*dk ;
00302 int nd , xx,yy,zz , dd , nx,ny,nz,nxy, nx1,ny1,nz1 , ip,jp,kp ;
00303
00304 cl = MCW_build_mask( 0,0,0 , fabs(DSET_DX(input_dset)) ,
00305 fabs(DSET_DY(input_dset)) ,
00306 fabs(DSET_DZ(input_dset)) , hrad ) ;
00307
00308 if( cl == NULL || cl->num_pt < 6 ){
00309 KILL_CLUSTER(cl);
00310 PLUTO_popup_transient(plint, " \n"
00311 " Aboot Radius too small\n"
00312 " for this dataset!\n" ) ;
00313 } else {
00314 ADDTO_CLUSTER(cl,0,0,0,0) ;
00315 di = cl->i ; dj = cl->j ; dk = cl->k ; nd = cl->num_pt ;
00316 nx = DSET_NX(input_dset) ; nx1 = nx-1 ;
00317 ny = DSET_NY(input_dset) ; ny1 = ny-1 ; nxy = nx*ny ;
00318 nz = DSET_NZ(input_dset) ; nz1 = nz-1 ;
00319 xx = plint->im3d->vinfo->i1 ;
00320 yy = plint->im3d->vinfo->j2 ;
00321 zz = plint->im3d->vinfo->k3 ;
00322 for( dd=0 ; dd < nd ; dd++ ){
00323 ip = xx+di[dd] ; if( ip < 0 || ip > nx1 ) continue ;
00324 jp = yy+dj[dd] ; if( jp < 0 || jp > ny1 ) continue ;
00325 kp = zz+dk[dd] ; if( kp < 0 || kp > nz1 ) continue ;
00326 mmm[ip+jp*nx+kp*nxy]++ ;
00327 }
00328 KILL_CLUSTER(cl) ;
00329 for( dd=0 ; dd < nvox ; dd++ ) if( mmm[dd] == 1 ) mmm[dd] = 0 ;
00330 mcount = THD_countmask( nvox , mmm ) ;
00331
00332 if( mcount < 3 ){
00333 free(mmm) ;
00334 return " \n*** Less than 3 voxels survive the mask+radius! ***\n" ;
00335 }
00336 sprintf(buf," \n"
00337 " %d voxels in the mask+radius\n"
00338 " out of %d dataset voxels\n ",mcount,nvox) ;
00339 PLUTO_popup_transient(plint,buf) ;
00340 }
00341 }
00342
00343 /*-- check for text output of histogram - 05 Feb 2002 - VR --*/
00344
00345 if ( writehist )
00346 {
00347 static char hbuf[1024] ;
00348 if ( ( histout == NULL ) || ( strlen (histout) == 0 ) ){
00349 sprintf( hbuf , "%s.histog" , DSET_PREFIX(input_dset) ) ;
00350 } else {
00351 strcpy( hbuf , histout ) ;
00352 if( strstr(hbuf,".hist") == NULL ) strcat( hbuf , ".histog" ) ;
00353 }
00354 histout = hbuf ;
00355
00356 if (THD_is_file(histout))
00357 {
00358 free(mmm) ;
00359
00360 return "*******************************\n"
00361 "Outfile exists, won't overwrite\n"
00362 "*******************************\n" ;
00363 }
00364 else {
00365 HISTOUT = fopen (histout, "w") ;
00366 if( HISTOUT == NULL ){
00367 free(mmm) ;
00368 return "**********************************\n"
00369 "Can't open Outfile for some reason\n"
00370 "**********************************\n" ;
00371 }
00372 }
00373 }
00374
00375 /*-- allocate an array to histogrammatize --*/
00376
00377 flim = mri_new( mcount , 1 , MRI_float ) ;
00378 flar = MRI_FLOAT_PTR(flim) ;
00379
00380 /*-- load values into this array --*/
00381
00382 switch( DSET_BRICK_TYPE(input_dset,iv) ){
00383 default:
00384 free(mmm) ; mri_free(flim) ;
00385 return "*** Can't use source dataset -- illegal data type! ***" ;
00386
00387 case MRI_short:{
00388 short * bar = (short *) DSET_ARRAY(input_dset,iv) ;
00389 float mfac = DSET_BRICK_FACTOR(input_dset,iv) ;
00390 if( mfac == 0.0 ) mfac = 1.0 ;
00391 if( do_mval ){
00392 float val ;
00393 for( ii=jj=0 ; ii < nvox ; ii++ ){
00394 if( mmm[ii] ){
00395 val = mfac*bar[ii] ;
00396 if( val >= val_bot && val <= val_top ) flar[jj++] = val ;
00397 }
00398 }
00399 mval = jj ;
00400 } else {
00401 for( ii=jj=0 ; ii < nvox ; ii++ )
00402 if( mmm[ii] ) flar[jj++] = mfac*bar[ii] ;
00403 }
00404 }
00405 break ;
00406
00407 case MRI_byte:{
00408 byte * bar = (byte *) DSET_ARRAY(input_dset,iv) ;
00409 float mfac = DSET_BRICK_FACTOR(input_dset,iv) ;
00410 if( mfac == 0.0 ) mfac = 1.0 ;
00411 if( do_mval ){
00412 float val ;
00413 for( ii=jj=0 ; ii < nvox ; ii++ ){
00414 if( mmm[ii] ){
00415 val = mfac*bar[ii] ;
00416 if( val >= val_bot && val <= val_top ) flar[jj++] = val ;
00417 }
00418 }
00419 mval = jj ;
00420 } else {
00421 for( ii=jj=0 ; ii < nvox ; ii++ )
00422 if( mmm[ii] ) flar[jj++] = mfac*bar[ii] ;
00423 }
00424 }
00425 break ;
00426
00427 case MRI_float:{
00428 float * bar = (float *) DSET_ARRAY(input_dset,iv) ;
00429 float mfac = DSET_BRICK_FACTOR(input_dset,iv) ;
00430 if( mfac == 0.0 ) mfac = 1.0 ;
00431 if( do_mval ){
00432 float val ;
00433 for( ii=jj=0 ; ii < nvox ; ii++ ){
00434 if( mmm[ii] ){
00435 val = mfac*bar[ii] ;
00436 if( val >= val_bot && val <= val_top ) flar[jj++] = val ;
00437 }
00438 }
00439 mval = jj ;
00440 } else {
00441 for( ii=jj=0 ; ii < nvox ; ii++ )
00442 if( mmm[ii] ) flar[jj++] = mfac*bar[ii] ;
00443 }
00444 }
00445 break ;
00446 }
00447
00448 if( do_mval ){
00449 if( mval == 0 ){
00450 free(mmm) ; mri_free(flim) ;
00451 return "*** Can't use source dataset -- no data in Values range ***" ;
00452 }
00453 flim->nx = flim->nvox = mcount = mval ;
00454 }
00455
00456 /*-- set range and size of histogram --*/
00457
00458 if( val_bot > val_top ){
00459 hbot = mri_min(flim) ; htop = mri_max(flim) ;
00460 if( hbot >= htop ){
00461 free(mmm) ; mri_free(flim) ;
00462 return "***********************************\n"
00463 "Selected voxels have no data range!\n"
00464 "***********************************" ;
00465 }
00466 } else {
00467 hbot = val_bot ; htop = val_top ;
00468 }
00469
00470 if( nbin < 10 || nbin > 1000 ){
00471 switch( DSET_BRICK_TYPE(input_dset,iv) ){
00472 case MRI_float:
00473 nbin = (int) sqrt((double)mcount) ;
00474 break ;
00475
00476 case MRI_short:
00477 case MRI_byte:{
00478 float mfac = DSET_BRICK_FACTOR(input_dset,iv) ;
00479 if( mfac == 0.0 || mfac == 1.0 )
00480 nbin = (int)( htop - hbot ) ;
00481 else
00482 nbin = (int) sqrt((double)mcount) ;
00483 }
00484 break ;
00485
00486 }
00487 if( nbin < 10 ) nbin = 10 ; else if( nbin > 1000 ) nbin = 1000 ;
00488 }
00489
00490 /*-- actually compute and plot histogram --*/
00491
00492 hbin = (int *) calloc((nbin+1),sizeof(int)) ;
00493
00494 mri_histogram( flim , hbot,htop , TRUE , nbin,hbin ) ;
00495
00496 if( smooth > 0 ){ /* 03 Dec 2004 */
00497 int nwid=smooth , *gbin=(int *)calloc((nbin+1),sizeof(int)) , ibot,itop ;
00498 float ws,wss , *wt ;
00499
00500 ws = 0.0 ;
00501 wt = (float *)malloc(sizeof(float)*(2*nwid+1)) ;
00502 for( ii=0 ; ii <= 2*nwid ; ii++ ){
00503 wt[ii] = nwid-abs(nwid-ii) + 0.5f ;
00504 ws += wt[ii] ;
00505 }
00506 for( ii=0 ; ii <= 2*nwid ; ii++ ) wt[ii] /= ws ;
00507
00508 for( jj=0 ; jj <= nbin ; jj++ ){
00509 ibot = jj-nwid ; if( ibot < 0 ) ibot = 0 ;
00510 itop = jj+nwid ; if( itop > nbin ) itop = nbin ;
00511 ws = wss = 0.0 ;
00512 for( ii=ibot ; ii <= itop ; ii++ ){
00513 ws += wt[nwid-jj+ii] * hbin[ii] ; wss += wt[nwid-jj+ii] ;
00514 }
00515 gbin[jj] = rint(ws/wss) ;
00516 }
00517 memcpy(hbin,gbin,sizeof(int)*(nbin+1)) ;
00518 free((void *)wt) ; free((void *)gbin) ;
00519 }
00520
00521 if( maxcount > 0 ){
00522 for( ii=0 ; ii <= nbin ; ii++ ) hbin[ii] = MIN( hbin[ii] , maxcount ) ;
00523 }
00524 sprintf(buf,"\\noesc %s[%d] %d voxels",DSET_FILECODE(input_dset),iv,mcount);
00525 PLUTO_histoplot( nbin,hbot,htop,hbin , NULL , NULL , buf , 0,NULL ) ;
00526
00527 /*-- 05 Feb 2002: Output - VR --*/
00528
00529 if ( HISTOUT != NULL )
00530 {
00531 if( hbot >= htop ){ hbot = 0.0 ; htop = nbin ;}
00532
00533 dx = (htop-hbot)/nbin ;
00534
00535 for( ii=0 ; ii <= nbin ; ii++ )
00536 fprintf (HISTOUT, "%12.6f %13d \n", hbot+ii*dx, hbin[ii]) ;
00537
00538 fclose (HISTOUT) ;
00539
00540 fprintf (stderr, "%s written to disk \n", histout) ;
00541 }
00542
00543 /*-- go home to mama --*/
00544
00545 free(hbin) ; free(mmm) ; mri_free(flim) ; return NULL ;
00546 }
|
|
|
Definition at line 55 of file plug_histog.c. References ANAT_ALL_MASK, CORREL_init(), FUNC_ALL_MASK, helpstring, HISTO_main(), PLUTO_add_hint(), PLUTO_set_runlabels(), and PLUTO_set_sequence().
00056 {
00057 PLUGIN_interface * plint ;
00058
00059 #if 0
00060 if( ncall > 0 ) return NULL ; /* only one interface */
00061 #else
00062 if( ncall == 1 ) return CORREL_init() ;
00063 if( ncall > 1 ) return NULL ;
00064 #endif
00065
00066 /*-- set titles and call point --*/
00067
00068 plint = PLUTO_new_interface( "Histogram" ,
00069 "Histogram of Dataset Brick" ,
00070 helpstring ,
00071 PLUGIN_CALL_VIA_MENU , HISTO_main ) ;
00072
00073 PLUTO_add_hint( plint , "Histogram of Dataset Brick" ) ;
00074
00075 PLUTO_set_sequence( plint , "A:afniinfo:dsethistog" ) ;
00076
00077 PLUTO_set_runlabels( plint , "Plot+Keep" , "Plot+Close" ) ; /* 04 Nov 2003 */
00078
00079 /*-- first line of input --*/
00080
00081 PLUTO_add_option( plint , "Source" , "Source" , TRUE ) ;
00082 PLUTO_add_dataset(plint , "Dataset" ,
00083 ANAT_ALL_MASK , FUNC_ALL_MASK ,
00084 DIMEN_ALL_MASK | BRICK_ALLREAL_MASK ) ;
00085
00086 PLUTO_add_number( plint , "Sub-brick" , 0,9999,0 , 0,1 ) ;
00087
00088 /*-- second line of input --*/
00089
00090 PLUTO_add_option( plint , "Values" , "Values" , FALSE ) ;
00091 PLUTO_add_number( plint , "Bottom" , -99999,99999, 0, 1,1 ) ;
00092 PLUTO_add_number( plint , "Top" , -99999,99999, 0, -1,1 ) ;
00093
00094 /*-- third line of input --*/
00095
00096 PLUTO_add_option( plint , "Bins" , "Bins" , FALSE ) ;
00097 PLUTO_add_number( plint , "Number" , 10,1000,0, 100,1 ) ;
00098 PLUTO_add_number( plint , "Max Count" , 0,999999999,0 , 0,1 ) ;
00099 PLUTO_add_number( plint , "Smooth" , 0,99,0 , 0,1 ) ; /* 03 Dec 2004 */
00100
00101 /*-- fourth line of input --*/
00102
00103 PLUTO_add_option( plint , "Mask" , "Mask" , FALSE ) ;
00104 PLUTO_add_dataset( plint , "Dataset" ,
00105 ANAT_ALL_MASK , FUNC_ALL_MASK ,
00106 DIMEN_ALL_MASK | BRICK_ALLREAL_MASK ) ;
00107 PLUTO_add_number( plint , "Sub-brick" , 0,9999,0 , 0,1 ) ;
00108
00109 /*-- fifth line of input --*/
00110
00111 PLUTO_add_option( plint , "Range" , "Range" , FALSE ) ;
00112 PLUTO_add_number( plint , "Bottom" , -99999,99999, 0, 1,1 ) ;
00113 PLUTO_add_number( plint , "Top" , -99999,99999, 0, -1,1 ) ;
00114
00115 /*-- sixth line of input [20 Mar 2001] --*/
00116
00117 PLUTO_add_option( plint , "Aboot" , "Aboot" , FALSE ) ;
00118 PLUTO_add_number( plint , "Radius" , 2,100,0,10,1 ) ;
00119
00120 /*-- seventh line of input [05 Feb 2002 - VR] --*/
00121
00122 PLUTO_add_option( plint , "Output", "Output", FALSE ) ;
00123 PLUTO_add_string( plint , "Filename", 0 , NULL , 20 ) ;
00124
00125 return plint ;
00126 }
|
Variable Documentation
|
|
Definition at line 553 of file plug_histog.c. Referenced by CORREL_init(). |
|
|
Initial value: " Purpose: Plot a histogram of data from a dataset brick.\n" "\n" " Source: Dataset = data to be processed\n" " Sub-brick = which one to use\n\n" " Values: Bottom = minimum value from dataset to include\n" " Top = maximum value from dataset to include\n\n" " Bins: Number = number of bins to use\n" " Max Count = maximum count per bin\n\n" " Smooth = +/- bin range to smooth histogram\n" " Mask: Dataset = masking dataset\n" " Sub-brick = which one to use\n\n" " Range: Bottom = min value from mask dataset to use\n" " Top = max value from mask dataset to use\n" " [if Bottom > Top, then all nonzero mask voxels will be used; ]\n" " [if Bottom <= Top, then only nonzero mask voxels in this range]\n" " [ will be used in computing the statistics. ]\n" " Aboot: If activated, then only voxels within a distance of Radius mm\n" " of the current crosshairs will be used in the histogram.\n" " Output: Name of the ascii file to which histogram values are written.\n" "\n" " Author -- RW Cox - 30 September 1999\n" " Output feature added by V Roopchansingh, Feb 2002\n" Definition at line 23 of file plug_histog.c. Referenced by PLUGIN_init(). |