Doxygen Source Code Documentation
thd_bstats.c File Reference
#include "mrilib.h"
#include "thd.h"
Go to the source code of this file.
Functions | |
void | THD_load_statistics (THD_3dim_dataset *dset) |
THD_brick_stats | THD_get_brick_stats (MRI_IMAGE *im) |
void | THD_update_statistics (THD_3dim_dataset *dset) |
void | THD_update_one_bstat (THD_3dim_dataset *dset, int iv) |
Function Documentation
|
Compute statistics for a 3D brick of varying data type ---------------------------------------------------------------- Definition at line 101 of file thd_bstats.c. References CSQR, INVALIDATE_BSTAT, MRI_IMAGE::kind, THD_brick_stats::max, THD_brick_stats::min, mri_data_pointer(), MRI_IMAGE::nvox, and top. Referenced by THD_load_statistics(), THD_update_one_bstat(), and THD_update_statistics().
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 ; /* got to give them something */ 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++ ){ /* scale to brightness */ 00124 val = 0.299 * ar[3*ii] /* between 0 and 255 */ 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 } /* end of switch on sub-brick type */ 00201 00202 bst.min = bot ; bst.max = top ; 00203 return bst ; 00204 } |
|
Load the statistics of a dataset (modified Nov 15 1995) ------------------------------------------------------------------------ Definition at line 14 of file thd_bstats.c. References ADDTO_KILL, THD_statistics::bstat, THD_3dim_dataset::dblk, DSET_BRICK, DSET_BRICK_FACTOR, INVALIDATE_BSTAT, ISVALID_3DIM_DATASET, ISVALID_STATISTIC, THD_3dim_dataset::kl, THD_brick_stats::max, THD_brick_stats::min, myXtNew, THD_statistics::nbstat, THD_datablock::nvals, THD_statistics::parent, RELOAD_STATS, REPLACE_KILL, STATISTICS_TYPE, THD_3dim_dataset::stats, THD_count_databricks(), THD_get_brick_stats(), THD_statistics::type, THD_3dim_dataset::warp_parent, and XtRealloc. Referenced by adwarp_refashion_dataset(), AFNI_fimmer_redisplay(), AFNI_refashion_dataset(), DRAW_into_dataset(), DRAW_quit_CB(), DRAW_receiver(), fim3d_fimmer_compute(), IMREG_main(), main(), NUD_quit_CB(), output_results(), output_ts_array(), PLUTO_add_dset(), process_as_floats(), r_any_cb_apply(), r_any_cb_undo(), r_any_cb_unfill(), r_fill_resampled_data_brick(), r_gr_cb_fill(), r_HL_cb_fill(), r_INT_cb_fill(), r_wt_cb_fill(), RT_tell_afni_one(), T3D_save_file_CB(), THD_warp3D(), write_3dtime(), write_afni_data(), write_afni_fict(), write_afni_fizt(), write_bucket(), write_bucket_data(), and write_ts_array().
00015 { 00016 int ii , mmin , mmax , ibr , nbr ; 00017 short *brkk ; 00018 THD_brick_stats *bsold ; 00019 00020 /*-- sanity checks --*/ 00021 00022 if( ! ISVALID_3DIM_DATASET(dset) ) return ; 00023 00024 nbr = THD_count_databricks( dset->dblk ) ; 00025 00026 /*-- 3/24/95: if don't get data, try for the warp parent --*/ 00027 00028 if( nbr == 0 ){ 00029 00030 if( ! ISVALID_3DIM_DATASET(dset->warp_parent) ) return ; /* nothing */ 00031 if( dset->warp_parent == dset ) return ; 00032 00033 RELOAD_STATS( dset->warp_parent ) ; /* recursion! */ 00034 if( ! ISVALID_STATISTIC(dset->warp_parent->stats) ) return ; /* nothing */ 00035 00036 if( dset->stats == NULL ){ /* create if not present */ 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 /** copy stats from warp parent for each brick **/ 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 /*-- if here, have good data in this dataset --*/ 00065 00066 if( dset->stats == NULL ){ /* create if not present */ 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 /* 3/24/95: load stats for each sub-brick, not just the first */ 00083 00084 for( ibr=0 ; ibr < dset->dblk->nvals ; ibr++ ){ /* for each sub-brick */ 00085 dset->stats->bstat[ibr] = THD_get_brick_stats( DSET_BRICK(dset,ibr) ) ; 00086 00087 /* 11/21/95: allow for scaling factor that may be applied to data */ 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 } |
|
Update the statistics of one sub-brick in a dataset. [29 Mar 2005] ------------------------------------------------------------------------ Definition at line 273 of file thd_bstats.c. References ADDTO_KILL, THD_statistics::bstat, THD_3dim_dataset::dblk, DSET_BRICK, DSET_BRICK_FACTOR, DSET_NVALS, INVALIDATE_BSTAT, ISVALID_3DIM_DATASET, ISVALID_BSTAT, THD_3dim_dataset::kl, THD_brick_stats::max, THD_brick_stats::min, myXtNew, THD_statistics::nbstat, THD_datablock::nvals, THD_statistics::parent, REPLACE_KILL, STATISTICS_TYPE, THD_3dim_dataset::stats, THD_get_brick_stats(), THD_statistics::type, and XtRealloc.
00274 { 00275 Boolean good ; 00276 int ii , mmin , mmax , ibr , nbsold , nbr ; 00277 THD_brick_stats *bsold ; 00278 short *brkk ; 00279 00280 /*-- sanity checks --*/ 00281 00282 if( ! ISVALID_3DIM_DATASET(dset) ) return ; 00283 if( iv < 0 || iv >= DSET_NVALS(dset) ) return ; 00284 00285 /*-- if here, have good data in this dataset --*/ 00286 00287 if( dset->stats == NULL ){ /* create if not present */ 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++ ) /* 11 Mar 2005 */ 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 } |
|
Update the statistics of a dataset (use only if new bricks are added -- see EDIT_add_bricklist) ------------------------------------------------------------------------ Definition at line 211 of file thd_bstats.c. References ADDTO_KILL, THD_statistics::bstat, THD_3dim_dataset::dblk, DSET_BRICK, DSET_BRICK_FACTOR, INVALIDATE_BSTAT, ISVALID_3DIM_DATASET, ISVALID_BSTAT, THD_3dim_dataset::kl, THD_brick_stats::max, THD_brick_stats::min, myXtNew, THD_statistics::nbstat, THD_datablock::nvals, THD_statistics::parent, REPLACE_KILL, STATISTICS_TYPE, THD_3dim_dataset::stats, THD_count_databricks(), THD_get_brick_stats(), THD_statistics::type, and XtRealloc. Referenced by NUD_update_base(), process_NIML_AFNI_dataset(), process_NIML_AFNI_volumedata(), RT_tell_afni_one(), THD_load_datablock(), and THD_niml_to_dataset().
00212 { 00213 Boolean good ; 00214 int ii , mmin , mmax , ibr , nbsold , nbr ; 00215 THD_brick_stats *bsold ; 00216 short *brkk ; 00217 00218 /*-- sanity checks --*/ 00219 00220 if( ! ISVALID_3DIM_DATASET(dset) ) return ; 00221 00222 nbr = THD_count_databricks( dset->dblk ) ; 00223 00224 if( nbr == 0 ) return ; 00225 00226 /*-- if here, have good data in this dataset --*/ 00227 00228 if( dset->stats == NULL ){ /* create if not present */ 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++ ) /* 11 Mar 2005 */ 00250 INVALIDATE_BSTAT( dset->stats->bstat[ibr] ) ; 00251 } 00252 00253 /* 28 Apr 1997: load stats for new sub-bricks, not all */ 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 } |