1 #include "mrilib.h"
2 
main(int argc,char * argv[])3 int main( int argc , char * argv[] )
4 {
5    float mfrac=0.50 ;
6    double dsum ;
7    int nvox , iarg=1 , hist[32768] , ii,npos=0 , ncut,nmed,kk,ib , qq,nold ;
8    THD_3dim_dataset * dset ;
9    short * sar ;
10 
11    if( argc < 2 || strcmp(argv[1],"-help") == 0 ){
12       printf("Usage: mcrawl [-mfrac x] dataset\n"); exit(0);
13    }
14 
15    if( strcmp(argv[iarg],"-mfrac") == 0 ){
16       mfrac = strtod( argv[++iarg] , NULL ) ;
17       if( mfrac <= 0.0 ){ fprintf(stderr,"ILLEGAL -mfrac\n");exit(1);}
18       if( mfrac >= 1.0 ) mfrac *= 0.01 ;
19       iarg++ ;
20    }
21 
22    dset = THD_open_dataset(argv[iarg]) ;
23    if( !ISVALID_DSET(dset) ){ fprintf(stderr,"CAN'T open dataset\n");exit(1);}
24    if( DSET_BRICK_TYPE(dset,0) != MRI_short ){ fprintf(stderr,"ILLEGAL dataset type\n");exit(1); }
25    DSET_load(dset) ;
26    if( !DSET_LOADED(dset) ){ fprintf(stderr,"CAN'T load dataset\n");exit(1);}
27    sar = DSET_ARRAY(dset,0) ;
28 
29    nvox = DSET_NVOX(dset) ;
30    memset( hist , 0 , sizeof(int)*32768 ) ;
31 
32    dsum = 0.0 ;
33    for( ii=0 ; ii < nvox ; ii++ ){
34       if( sar[ii] > 0 ){
35          hist[sar[ii]]++ ; dsum += (double)(sar[ii])*(double)(sar[ii]) ; npos++ ;
36       }
37    }
38 
39    DSET_unload(dset) ;
40 
41    printf("npos = %d\n",npos) ; if( npos <= 99 ) exit(1) ;
42 
43    qq = 0.65 * npos ; ib = rint(0.5*sqrt(dsum/npos)) ;
44    for( kk=0,ii=32767 ; ii >= ib && kk < qq ; ii-- ) kk += hist[ii] ;
45 
46    ncut = ii ; qq = 0 ;
47    do{
48       for( npos=0,ii=ncut ; ii < 32768 ; ii++ ) npos += hist[ii] ;
49       npos /= 2 ;  /* find median */
50       for( kk=0,ii=ncut ; ii < 32768 && kk < npos ; ii++ ) kk += hist[ii] ;
51       printf("ncut=%d ii=%d kk=%d\n",ncut,ii,kk) ;
52       nold = ncut ;
53       ncut = mfrac * ii ;
54       qq++ ;
55    } while( qq < 20 && ncut != nold ) ;
56 
57    exit(0) ;
58 }
59