Doxygen Source Code Documentation
        
Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search   
thd_bstats.c
Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 #include "mrilib.h"
00008 #include "thd.h"
00009 
00010 
00011 
00012 
00013 
00014 void THD_load_statistics( THD_3dim_dataset *dset )
00015 {
00016    int ii , mmin , mmax , ibr , nbr ;
00017    short *brkk ;
00018    THD_brick_stats *bsold ;
00019 
00020    
00021 
00022    if( ! ISVALID_3DIM_DATASET(dset) ) return ;
00023 
00024    nbr = THD_count_databricks( dset->dblk ) ;
00025 
00026    
00027 
00028    if( nbr == 0 ){
00029 
00030      if( ! ISVALID_3DIM_DATASET(dset->warp_parent) ) return ;     
00031      if( dset->warp_parent == dset )                 return ;
00032 
00033      RELOAD_STATS( dset->warp_parent ) ;                       
00034      if( ! ISVALID_STATISTIC(dset->warp_parent->stats) ) return ; 
00035 
00036      if( dset->stats == NULL ){                     
00037        dset->stats = myXtNew( THD_statistics ) ;
00038        ADDTO_KILL( dset->kl , dset->stats ) ;
00039        dset->stats->type   = STATISTICS_TYPE ;
00040        dset->stats->parent = (XtPointer) dset ;
00041        dset->stats->bstat  = NULL ;
00042      }
00043 
00044      bsold               = dset->stats->bstat ;
00045      dset->stats->nbstat = dset->dblk->nvals ;
00046      dset->stats->bstat  = (THD_brick_stats *)
00047                             XtRealloc( (char *) bsold ,
00048                                 sizeof(THD_brick_stats) * dset->dblk->nvals ) ;
00049      if( bsold != dset->stats->bstat )
00050         REPLACE_KILL( dset->kl , bsold , dset->stats->bstat ) ;
00051 
00052 
00053 
00054      for( ibr=0 ; ibr < dset->dblk->nvals ; ibr++ ){
00055        if( ibr < dset->warp_parent->stats->nbstat )
00056          dset->stats->bstat[ibr] = dset->warp_parent->stats->bstat[ibr] ;
00057        else
00058          INVALIDATE_BSTAT( dset->stats->bstat[ibr] ) ;
00059      }
00060 
00061      return ;
00062    }
00063 
00064    
00065 
00066    if( dset->stats == NULL ){                  
00067      dset->stats = myXtNew( THD_statistics ) ;
00068      ADDTO_KILL( dset->kl , dset->stats ) ;
00069      dset->stats->type   = STATISTICS_TYPE ;
00070      dset->stats->parent = (XtPointer) dset ;
00071      dset->stats->bstat  = NULL ;
00072    }
00073 
00074    bsold               = dset->stats->bstat ;
00075    dset->stats->nbstat = dset->dblk->nvals ;
00076    dset->stats->bstat  = (THD_brick_stats *)
00077                           XtRealloc( (char *) bsold ,
00078                               sizeof(THD_brick_stats) * dset->dblk->nvals ) ;
00079    if( bsold != dset->stats->bstat )
00080      REPLACE_KILL( dset->kl , bsold , dset->stats->bstat ) ;
00081 
00082    
00083 
00084    for( ibr=0 ; ibr < dset->dblk->nvals ; ibr++ ){  
00085      dset->stats->bstat[ibr] = THD_get_brick_stats( DSET_BRICK(dset,ibr) ) ;
00086 
00087      
00088 
00089      if( DSET_BRICK_FACTOR(dset,ibr) > 0.0 ){
00090        dset->stats->bstat[ibr].min *= DSET_BRICK_FACTOR(dset,ibr) ;
00091        dset->stats->bstat[ibr].max *= DSET_BRICK_FACTOR(dset,ibr) ;
00092      }
00093    }
00094    return ;
00095 }
00096 
00097 
00098 
00099 
00100 
00101 THD_brick_stats THD_get_brick_stats( MRI_IMAGE *im )
00102 {
00103    register int ii , nvox ;
00104    register float bot , top ;
00105    void *br ;
00106    THD_brick_stats bst ;
00107 
00108    bst.min = bst.max = 0 ;  
00109 
00110    if( im == NULL ) return bst ;
00111    br   = mri_data_pointer( im ) ; if( br == NULL ) return bst ;
00112    nvox = im->nvox ;
00113 
00114    switch( im->kind ){
00115 
00116      default:
00117         INVALIDATE_BSTAT(bst) ;
00118      break ;
00119 
00120      case MRI_rgb:{
00121        register byte *ar = (byte *) br ; register float val ;
00122        bot = top = 0 ;
00123        for( ii=0 ; ii < nvox ; ii++ ){      
00124          val =  0.299 * ar[3*ii]           
00125               + 0.587 * ar[3*ii+1]
00126               + 0.114 * ar[3*ii+2] ;
00127               if( bot > val ) bot = val ;
00128          else if( top < val ) top = val ;
00129        }
00130      }
00131      break ;
00132 
00133      case MRI_byte:{
00134        register byte *ar = (byte *) br ;
00135        bot = top = ar[0] ;
00136        for( ii=1 ; ii < nvox ; ii++ ){
00137               if( bot > ar[ii] ) bot = ar[ii] ;
00138          else if( top < ar[ii] ) top = ar[ii] ;
00139        }
00140      }
00141      break ;
00142 
00143      case MRI_short:{
00144        register short *ar = (short *) br ;
00145        bot = top = ar[0] ;
00146        for( ii=1 ; ii < nvox ; ii++ ){
00147               if( bot > ar[ii] ) bot = ar[ii] ;
00148          else if( top < ar[ii] ) top = ar[ii] ;
00149        }
00150      }
00151      break ;
00152 
00153 #if 0
00154      case MRI_int:{
00155        register int *ar = (int *) br ;
00156        bot = top = ar[0] ;
00157        for( ii=1 ; ii < nvox ; ii++ ){
00158               if( bot > ar[ii] ) bot = ar[ii] ;
00159          else if( top < ar[ii] ) top = ar[ii] ;
00160        }
00161      }
00162      break ;
00163 #endif
00164 
00165      case MRI_float:{
00166        register float *ar = (float *) br ;
00167        bot = top = ar[0] ;
00168        for( ii=1 ; ii < nvox ; ii++ ){
00169               if( bot > ar[ii] ) bot = ar[ii] ;
00170          else if( top < ar[ii] ) top = ar[ii] ;
00171        }
00172      }
00173      break ;
00174 
00175 #if 0
00176      case MRI_double:{
00177        register double *ar = (double *) br ;
00178        bot = top = ar[0] ;
00179        for( ii=1 ; ii < nvox ; ii++ ){
00180               if( bot > ar[ii] ) bot = ar[ii] ;
00181          else if( top < ar[ii] ) top = ar[ii] ;
00182        }
00183      }
00184      break ;
00185 #endif
00186 
00187      case MRI_complex:{
00188        register complex *ar = (complex *) br ;
00189        register float zz ;
00190        bot = top = CSQR(ar[0]) ;
00191        for( ii=1 ; ii < nvox ; ii++ ){
00192           zz = CSQR(ar[ii]) ;
00193                if( bot > zz ) bot = zz ;
00194           else if( top < zz ) top = zz ;
00195        }
00196        bot = sqrt(bot) ; top = sqrt(top) ;
00197      }
00198      break ;
00199 
00200    } 
00201 
00202    bst.min = bot ; bst.max = top ;
00203    return bst ;
00204 }
00205 
00206 
00207 
00208 
00209 
00210 
00211 void THD_update_statistics( THD_3dim_dataset *dset )
00212 {
00213    Boolean good ;
00214    int ii , mmin , mmax , ibr , nbsold , nbr ;
00215    THD_brick_stats *bsold ;
00216    short *brkk ;
00217 
00218    
00219 
00220    if( ! ISVALID_3DIM_DATASET(dset) ) return ;
00221 
00222    nbr = THD_count_databricks( dset->dblk ) ;
00223 
00224    if( nbr == 0 ) return ;
00225 
00226    
00227 
00228    if( dset->stats == NULL ){                  
00229      dset->stats = myXtNew( THD_statistics ) ;
00230      ADDTO_KILL( dset->kl , dset->stats ) ;
00231      dset->stats->type   = STATISTICS_TYPE ;
00232      dset->stats->parent = (XtPointer) dset ;
00233      dset->stats->bstat  = NULL ;
00234      dset->stats->nbstat = 0 ;
00235      nbsold              = 0 ;
00236    } else {
00237      nbsold              = dset->stats->nbstat ;
00238    }
00239 
00240    if( dset->dblk->nvals > nbsold ){
00241      bsold               = dset->stats->bstat ;
00242      dset->stats->nbstat = dset->dblk->nvals ;
00243      dset->stats->bstat  = (THD_brick_stats *)
00244                            XtRealloc( (char *) bsold ,
00245                                 sizeof(THD_brick_stats) * dset->dblk->nvals ) ;
00246      if( bsold != dset->stats->bstat )
00247        REPLACE_KILL( dset->kl , bsold , dset->stats->bstat ) ;
00248 
00249      for( ibr=nbsold ; ibr < dset->dblk->nvals ; ibr++ )  
00250        INVALIDATE_BSTAT( dset->stats->bstat[ibr] ) ;
00251    }
00252 
00253    
00254 
00255    for( ibr=0 ; ibr < dset->dblk->nvals ; ibr++ ){
00256 
00257      if( ibr >= nbsold || ! ISVALID_BSTAT(dset->stats->bstat[ibr]) ){
00258         dset->stats->bstat[ibr] = THD_get_brick_stats( DSET_BRICK(dset,ibr) ) ;
00259 
00260         if( DSET_BRICK_FACTOR(dset,ibr) > 0.0 ){
00261           dset->stats->bstat[ibr].min *= DSET_BRICK_FACTOR(dset,ibr) ;
00262           dset->stats->bstat[ibr].max *= DSET_BRICK_FACTOR(dset,ibr) ;
00263         }
00264      }
00265    }
00266    return ;
00267 }
00268 
00269 
00270 
00271 
00272 
00273 void THD_update_one_bstat( THD_3dim_dataset *dset , int iv )
00274 {
00275    Boolean good ;
00276    int ii , mmin , mmax , ibr , nbsold , nbr ;
00277    THD_brick_stats *bsold ;
00278    short *brkk ;
00279 
00280    
00281 
00282    if( ! ISVALID_3DIM_DATASET(dset)     ) return ;
00283    if( iv < 0 || iv >= DSET_NVALS(dset) ) return ;
00284 
00285    
00286 
00287    if( dset->stats == NULL ){                  
00288      dset->stats = myXtNew( THD_statistics ) ;
00289      ADDTO_KILL( dset->kl , dset->stats ) ;
00290      dset->stats->type   = STATISTICS_TYPE ;
00291      dset->stats->parent = (XtPointer) dset ;
00292      dset->stats->bstat  = NULL ;
00293      dset->stats->nbstat = 0 ;
00294      nbsold              = 0 ;
00295    } else {
00296      nbsold              = dset->stats->nbstat ;
00297    }
00298 
00299    if( dset->dblk->nvals > nbsold ){
00300      bsold               = dset->stats->bstat ;
00301      dset->stats->nbstat = dset->dblk->nvals ;
00302      dset->stats->bstat  = (THD_brick_stats *)
00303                            XtRealloc( (char *) bsold ,
00304                                 sizeof(THD_brick_stats) * dset->dblk->nvals ) ;
00305      if( bsold != dset->stats->bstat )
00306        REPLACE_KILL( dset->kl , bsold , dset->stats->bstat ) ;
00307 
00308      for( ibr=nbsold ; ibr < dset->dblk->nvals ; ibr++ )  
00309        INVALIDATE_BSTAT( dset->stats->bstat[ibr] ) ;
00310    }
00311 
00312    if( iv >= nbsold || ! ISVALID_BSTAT(dset->stats->bstat[iv]) ){
00313      dset->stats->bstat[iv] = THD_get_brick_stats( DSET_BRICK(dset,iv) ) ;
00314 
00315      if( DSET_BRICK_FACTOR(dset,iv) > 0.0 ){
00316        dset->stats->bstat[iv].min *= DSET_BRICK_FACTOR(dset,iv) ;
00317        dset->stats->bstat[iv].max *= DSET_BRICK_FACTOR(dset,iv) ;
00318      }
00319    }
00320 
00321    return ;
00322 }