Skip to content

AFNI/NIfTI Server

Sections
Personal tools
You are here: Home » AFNI » Documentation

Doxygen Source Code Documentation


Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search  

thd_loaddblk.c File Reference

#include "mrilib.h"
#include "thd.h"

Go to the source code of this file.


Defines

#define PRINT_SIZE   66600000
#define PRINT_STEP   10

Functions

void THD_load_datablock_verbose (int v)
int THD_alloc_datablock (THD_datablock *blk)
int THD_datum_constant (THD_datablock *blk)
float THD_get_voxel (THD_3dim_dataset *dset, int ijk, int ival)
void THD_set_freeup (generic_func *ff)
Boolean THD_load_datablock (THD_datablock *blk)
void THD_zerofill_dataset (THD_3dim_dataset *dset)

Variables

int native_order = -1
int no_mmap = -1
int floatscan = -1
int verbose = 0
generic_funcfreeup = NULL

Define Documentation

#define PRINT_SIZE   66600000
 

Definition at line 14 of file thd_loaddblk.c.

Referenced by THD_load_datablock().

#define PRINT_STEP   10
 

Definition at line 15 of file thd_loaddblk.c.

Referenced by THD_load_datablock().


Function Documentation

int THD_alloc_datablock THD_datablock   blk
 

Allocate memory for the volumes in a datablock -- 02 May 2003. Return value is 1 if OK, 0 if not. ------------------------------------------------------------------------------

Definition at line 827 of file thd_loaddblk.c.

References AFMALL, THD_datablock::brick, DATABLOCK_MEM_MALLOC, DATABLOCK_MEM_SHARED, DBLK_ARRAY, DBLK_BRICK, DBLK_BRICK_BYTES, ENTRY, free, freeup, ISVALID_DATABLOCK, THD_datablock::malloc_type, MCW_MALLOC_status, mri_fix_data_pointer(), THD_datablock::nvals, offset, RETURN, shm_attach(), shm_create(), THD_datablock::shm_idcode, THD_datablock::shm_idint, STATUS, THD_count_databricks(), THD_datablock::total_bytes, and UNIQ_idcode_fill().

Referenced by THD_load_datablock().

00828 {
00829    int ii,nbad,ibr, nv  ;
00830    char *ptr ;
00831 
00832 ENTRY("THD_alloc_datablock") ;
00833 
00834    /*-- sanity checks --*/
00835 
00836    if( ! ISVALID_DATABLOCK(blk) || blk->brick == NULL ){
00837      STATUS("Illegal inputs"); RETURN(0);
00838    }
00839 
00840    nv = blk->nvals ;
00841    ii = THD_count_databricks( blk ) ;
00842    if( ii == nv ) RETURN(1);   /* already loaded! */
00843 
00844    switch( blk->malloc_type ){
00845 
00846      default: RETURN(0) ;         /* stupid datablock */
00847 
00848      /*-------------------------------------------*/
00849      /* malloc separate arrays for each sub-brick */
00850      /*-------------------------------------------*/
00851 
00852      case DATABLOCK_MEM_MALLOC:{
00853 
00854       /** malloc space for each brick separately **/
00855 
00856       STATUS("trying to malloc sub-bricks") ;
00857       for( nbad=ibr=0 ; ibr < nv ; ibr++ ){
00858         if( DBLK_ARRAY(blk,ibr) == NULL ){
00859           ptr = AFMALL(char, DBLK_BRICK_BYTES(blk,ibr) ) ;
00860           mri_fix_data_pointer( ptr ,  DBLK_BRICK(blk,ibr) ) ;
00861           if( ptr == NULL ) nbad++ ;
00862         }
00863       }
00864       if( nbad == 0 ) RETURN(1) ;   /* things are cool */
00865 
00866       /* at least one malloc() failed, so possibly try to free some space */
00867 
00868        fprintf(stderr,
00869                "\n** failed to malloc %d dataset bricks out of %d - is memory exhausted?\n",
00870                nbad,nv ) ;
00871 #ifdef USING_MCW_MALLOC
00872        { char *str = MCW_MALLOC_status ;
00873          if( str != NULL ) fprintf(stderr,"*** MCW_malloc summary: %s\n",str); }
00874 #endif
00875 
00876        if( freeup == NULL ){                     /* don't have a freeup() function? */
00877          for( ibr=0 ; ibr < nv ; ibr++ ){        /* then toss all data bricks and scram */
00878            if( DBLK_ARRAY(blk,ibr) != NULL ){
00879              free(DBLK_ARRAY(blk,ibr)) ;
00880              mri_fix_data_pointer( NULL , DBLK_BRICK(blk,ibr) ) ;
00881            }
00882          }
00883          STATUS("malloc failed, no freeup"); RETURN(0);  /* go away */
00884        }
00885 
00886        /* space freeing is done by caller-supplied function freeup() */
00887 
00888        fprintf(stderr,"** trying to free some memory\n") ;   /* 18 Oct 2001 */
00889        freeup() ;                          /* cf. AFNI_purge_unused_dsets() */
00890 
00891        /* now try to malloc() those that failed before */
00892 
00893        for( ibr=0 ; ibr < nv ; ibr++ ){
00894          if( DBLK_ARRAY(blk,ibr) == NULL ){
00895            ptr = AFMALL(char, DBLK_BRICK_BYTES(blk,ibr) ) ;
00896            mri_fix_data_pointer( ptr ,  DBLK_BRICK(blk,ibr) ) ;
00897          }
00898        }
00899 
00900        /* if it still failed, then free everything and go away */
00901 
00902        if( THD_count_databricks(blk) < nv ){
00903          fprintf(stderr,"** cannot free up enough memory\n") ;
00904 #ifdef USING_MCW_MALLOC
00905          { char *str = MCW_MALLOC_status ;
00906            if( str != NULL ) fprintf(stderr,"*** MCW_malloc summary: %s\n",str); }
00907 #endif
00908          for( ibr=0 ; ibr < nv ; ibr++ ){  /* 18 Oct 2001 */
00909            if( DBLK_ARRAY(blk,ibr) != NULL ){
00910              free(DBLK_ARRAY(blk,ibr)) ;
00911              mri_fix_data_pointer( NULL , DBLK_BRICK(blk,ibr) ) ;
00912            }
00913          }
00914          STATUS("malloc failed; freeup failed"); RETURN(0);  /* go away */
00915        }
00916 
00917        /* malloc() didn't fail this time! */
00918 
00919        STATUS("malloc failed; freeup worked") ;
00920        fprintf(stderr,"*** was able to free up enough memory\n") ;
00921 #ifdef USING_MCW_MALLOC
00922        { char *str = MCW_MALLOC_status ;
00923          if( str != NULL ) fprintf(stderr,"*** MCW_malloc summary: %s\n",str); }
00924 #endif
00925      }
00926      RETURN(1) ;   /* get to here is good */
00927 
00928      /*-------------------------------------------------------------------*/
00929      /* create a shared memory segment, then setup sub-bricks inside that */
00930      /*-------------------------------------------------------------------*/
00931 
00932      case DATABLOCK_MEM_SHARED:
00933 #if !defined(DONT_USE_SHM) && !defined(CYGWIN)
00934      { unsigned int offset ;
00935        if( blk->shm_idcode[0] == '\0' ){   /* new segment */
00936          UNIQ_idcode_fill( blk->shm_idcode ) ;
00937          blk->shm_idint = shm_create( blk->shm_idcode , (int)blk->total_bytes ) ;
00938          if( blk->shm_idint < 0 ){ blk->shm_idcode[0] = '\0'; RETURN(0); }
00939          ptr = shm_attach( blk->shm_idint ) ;
00940          if( ptr == NULL ){
00941            shmctl( blk->shm_idint , IPC_RMID , NULL ) ;
00942            blk->shm_idint = -1; blk->shm_idcode[0] = '\0'; RETURN(0);
00943          }
00944          offset = 0 ;
00945          for( ibr=0 ; ibr < nv ; ibr++ ){
00946            mri_fix_data_pointer( ptr , DBLK_BRICK(blk,ibr) ) ;
00947            ptr += DBLK_BRICK_BYTES(blk,ibr) ;
00948          }
00949        }
00950      }
00951      RETURN(1) ;
00952 #else
00953      RETURN(0) ;
00954 #endif
00955 
00956    }
00957 
00958    RETURN(0) ; /* should never get to here */
00959 }

int THD_datum_constant THD_datablock   blk
 

Check if all sub-bricks have the same datum type. [14 Mar 2002] -------------------------------------------------------------------

Definition at line 26 of file thd_loaddblk.c.

References DBLK_BRICK_TYPE, and THD_datablock::nvals.

Referenced by main(), THD_datablock_from_atr(), and THD_load_datablock().

00027 {
00028    int ibr , dzero , nv=blk->nvals ;
00029    if( nv == 1 ) return 1 ;                /* of course */
00030    dzero = DBLK_BRICK_TYPE(blk,0) ;        /* #0 type */
00031    for( ibr=1 ; ibr < nv ; ibr++ )
00032       if( dzero != DBLK_BRICK_TYPE(blk,ibr) ) return 0 ;
00033    return 1 ;
00034 }

float THD_get_voxel THD_3dim_dataset   dset,
int    ijk,
int    ival
 

Return a float representation of a given voxel. [15 Sep 2004] -----------------------------------------------------------------

Definition at line 40 of file thd_loaddblk.c.

References rgba::a, rgba::b, rgbyte::b, c, DSET_ARRAY, DSET_BRICK_FACTOR, DSET_BRICK_TYPE, DSET_load, DSET_NVALS, DSET_NVOX, rgba::g, rgbyte::g, complex::i, rgba::r, rgbyte::r, and complex::r.

Referenced by FD_brick_to_series().

00041 {
00042    void *ar ;
00043    float val , fac ;
00044 
00045    if( ival < 0 || ival >= DSET_NVALS(dset) ) return 0.0f ;
00046    if( ijk < 0  || ijk  >= DSET_NVOX(dset)  ) return 0.0f ;
00047 
00048    ar = DSET_ARRAY(dset,ival) ;
00049    if( ar == NULL ){ DSET_load(dset) ; ar = DSET_ARRAY(dset,ival) ; }
00050    if( ar == NULL ) return 0.0f ;
00051 
00052    switch( DSET_BRICK_TYPE(dset,ival) ){
00053 
00054      default: return 0.0f ;
00055 
00056      case MRI_byte:
00057        val = (float)(((byte *)ar)[ijk])   ; break ;
00058      case MRI_short:
00059        val = (float)(((short *)ar)[ijk])  ; break ;
00060      case MRI_int:
00061        val = (float)(((int *)ar)[ijk])    ; break ;
00062      case MRI_float:
00063        val = (float)(((float *)ar)[ijk])  ; break ;
00064      case MRI_double:
00065        val = (float)(((double *)ar)[ijk]) ; break ;
00066 
00067      case MRI_complex:{
00068        complex c = (((complex *)ar)[ijk]) ;
00069        val = sqrt(c.r*c.r+c.i*c.i) ;
00070        break ;
00071      }
00072 
00073      case MRI_rgb:{
00074        rgbyte c = (((rgbyte *)ar)[ijk]) ;
00075        val = 0.299f*(float)(c.r) + 0.587f*(float)(c.g) + 0.114f*(float)(c.b) ;
00076        break ;
00077      }
00078 
00079      case MRI_rgba:{
00080        rgba c = (((rgba *)ar)[ijk]) ;
00081        val = 0.299f*(float)(c.r) + 0.587f*(float)(c.g) + 0.114f*(float)(c.b) ;
00082        val *= 0.00392157f*(float)(c.a) ;
00083        break ;
00084      }
00085    }
00086 
00087    fac = DSET_BRICK_FACTOR(dset,ival) ;
00088    if( fac > 0.0f ) val *= fac ;
00089    return val ;
00090 }

Boolean THD_load_datablock THD_datablock   blk
 

Definition at line 104 of file thd_loaddblk.c.

References AFMALL, AFNI_yesenv(), THD_datablock::brick, THD_diskptr::brick_name, THD_diskptr::byte_order, BYTEIZE, ATR_string::ch, close(), COMPRESS_fclose(), COMPRESS_fopen_read(), CSQR, DATABLOCK_MEM_MALLOC, DATABLOCK_MEM_MMAP, DATABLOCK_MEM_SHARED, DATABLOCK_MEM_UNDEFINED, DBLK_ARRAY, DBLK_BRICK, DBLK_BRICK_BYTES, DBLK_BRICK_FACTOR, DBLK_BRICK_NVOX, DBLK_BRICK_TYPE, DBLK_IS_MASTERED, DBLK_mmapfix, THD_diskptr::dimsizes, THD_diskptr::directory_name, THD_datablock::diskptr, DSET_BRIKNAME, DSET_IS_TCAT, ENTRY, far, fd, THD_diskptr::filecode, floatscan, free, freeup, getenv(), complex::i, ISVALID_DATABLOCK, ISVALID_DISKPTR, ISVALID_DSET, malloc, THD_datablock::malloc_type, THD_datablock::master_bot, THD_datablock::master_bytes, THD_datablock::master_ival, THD_datablock::master_nvals, THD_datablock::master_top, mri_clear_data_pointer, mri_fix_data_pointer(), mri_short_order(), mri_swap2(), mri_swap4(), native_order, ATR_string::nch, no_mmap, THD_diskptr::nvals, THD_datablock::nvals, nz, offset, THD_datablock::parent, PRINT_SIZE, PRINT_STEP, complex::r, THD_diskptr::rank, RETURN, SHORTIZE, STATUS, STORAGE_BY_1D, STORAGE_BY_3D, STORAGE_BY_ANALYZE, STORAGE_BY_BRICK, STORAGE_BY_CTFMRI, STORAGE_BY_CTFSAM, STORAGE_BY_MINC, STORAGE_BY_MPEG, STORAGE_BY_NIFTI, STORAGE_BY_VOLUMES, THD_diskptr::storage_mode, STORAGE_UNDEFINED, THD_alloc_datablock(), thd_complexscan(), THD_count_databricks(), THD_datum_constant(), THD_filesize(), THD_find_string_atr(), thd_floatscan(), THD_load_1D(), THD_load_3D(), THD_load_analyze(), THD_load_ctfmri(), THD_load_ctfsam(), THD_load_minc(), THD_load_mpeg(), THD_load_nifti(), THD_load_tcat(), THD_MMAP_FLAG, THD_purge_datablock(), THD_update_statistics(), top, THD_datablock::total_bytes, and verbose.

Referenced by AFNI_dataset_slice(), AFNI_fimmer_compute(), CALC_read_opts(), copy_dset(), DSET_cor(), EDIT_full_copy(), EDIT_one_dataset(), FD_brick_to_mri(), FD_brick_to_series(), fim3d_fimmer_compute(), get_options(), main(), read_input_data(), and THD_extract_many_series().

00105 {
00106    THD_diskptr *dkptr ;
00107    int id , offset ;
00108    int nx,ny,nz , nxy,nxyz , nv,vv , ii , ibr , nbad ;
00109    char *ptr ;
00110    MRI_IMAGE *im ;
00111    int verb=verbose ;
00112    int64_t idone , print_size=PRINT_SIZE ;
00113 
00114 ENTRY("THD_load_datablock") ; /* 29 Aug 2001 */
00115 
00116    if( native_order < 0 ) native_order = mri_short_order() ; /* 1st time in */
00117 
00118    floatscan = AFNI_yesenv("AFNI_FLOATSCAN") ;  /* check float bricks? */
00119 
00120    if( floatscan ) no_mmap = 1 ;                          /* perhaps disable */
00121    else            no_mmap = AFNI_yesenv("AFNI_NOMMAP") ; /* use of mmap()  */
00122 
00123    /*-- sanity checks --*/
00124 
00125    if( ! ISVALID_DATABLOCK(blk) || blk->brick == NULL ){
00126      STATUS("Illegal inputs"); RETURN( False );
00127    }
00128 
00129    ii = THD_count_databricks( blk ) ;
00130    if( ii == blk->nvals ) RETURN( True );   /* already loaded! */
00131 
00132    if( blk->malloc_type == DATABLOCK_MEM_UNDEFINED ){
00133      STATUS("malloc_type forced to DATABLOCK_MEM_MALLOC") ;
00134      blk->malloc_type = DATABLOCK_MEM_MALLOC ;
00135    }
00136 
00137    /* these next 2 conditions should never happen */
00138 
00139    dkptr = blk->diskptr ;
00140    if( ! ISVALID_DISKPTR(dkptr) ){
00141      STATUS("invalid dkptr!!!"); RETURN( False );
00142    }
00143    if( dkptr->storage_mode == STORAGE_UNDEFINED ){
00144      if( PRINT_TRACING ){
00145        char str[512] ; THD_3dim_dataset *dset=(THD_3dim_dataset *)(blk->parent) ;
00146        sprintf(str,"dataset %s == STORAGE_UNDEFINED",DSET_BRIKNAME(dset)) ;
00147        STATUS(str) ;
00148      }
00149      RETURN(False) ;
00150    }
00151 
00152    if( dkptr->rank != 3 ){
00153      fprintf(stderr,"\n*** Cannot read non 3D datablocks ***\n"); RETURN(False);
00154    }
00155 
00156    if( dkptr->storage_mode == STORAGE_BY_VOLUMES ) no_mmap = 1 ;  /* 20 Jun 2002 */
00157 
00158    /*-- 29 Oct 2001: MINC input (etc.) --*/
00159 
00160    if( dkptr->storage_mode == STORAGE_BY_MINC ){
00161      THD_load_minc( blk ) ;
00162      ii = THD_count_databricks( blk ) ;
00163      if( ii == blk->nvals ){
00164        THD_update_statistics( (THD_3dim_dataset *)blk->parent ) ;
00165        RETURN( True ) ;
00166      }
00167      STATUS("can't read MINC file?!") ;
00168      RETURN( False ) ;
00169    }
00170 
00171    { THD_3dim_dataset *ds = (THD_3dim_dataset *)blk->parent ;  /* 04 Aug 2004 */
00172      if( ISVALID_DSET(ds) && DSET_IS_TCAT(ds) ){
00173        THD_load_tcat( blk ) ;
00174        ii = THD_count_databricks( blk ) ;
00175        if( ii == blk->nvals ){
00176          THD_update_statistics( (THD_3dim_dataset *)blk->parent ) ;
00177          RETURN( True ) ;
00178        }
00179        STATUS("can't read tcat-ed file?!") ;
00180        RETURN( False ) ;
00181      }
00182    }
00183 
00184    if( dkptr->storage_mode == STORAGE_BY_ANALYZE ){
00185      THD_load_analyze( blk ) ;
00186      ii = THD_count_databricks( blk ) ;
00187      if( ii == blk->nvals ){
00188        THD_update_statistics( (THD_3dim_dataset *)blk->parent ) ;
00189        RETURN( True ) ;
00190      }
00191      STATUS("can't read ANALYZE file?!") ;
00192      RETURN( False ) ;
00193    }
00194 
00195    if( dkptr->storage_mode == STORAGE_BY_CTFMRI ){  /* 04 Dec 2002 */
00196      THD_load_ctfmri( blk ) ;
00197      ii = THD_count_databricks( blk ) ;
00198      if( ii == blk->nvals ){
00199        THD_update_statistics( (THD_3dim_dataset *)blk->parent ) ;
00200        RETURN( True ) ;
00201      }
00202      STATUS("can't read CTF MRI file?!") ;
00203      RETURN( False ) ;
00204    }
00205 
00206    if( dkptr->storage_mode == STORAGE_BY_CTFSAM ){  /* 04 Dec 2002 */
00207      THD_load_ctfsam( blk ) ;
00208      ii = THD_count_databricks( blk ) ;
00209      if( ii == blk->nvals ){
00210        THD_update_statistics( (THD_3dim_dataset *)blk->parent ) ;
00211        RETURN( True ) ;
00212      }
00213      STATUS("can't read CTF SAM file?!") ;
00214      RETURN( False ) ;
00215    }
00216 
00217    if( dkptr->storage_mode == STORAGE_BY_1D ){      /* 04 Mar 2003 */
00218      THD_load_1D( blk ) ;
00219      ii = THD_count_databricks( blk ) ;
00220      if( ii == blk->nvals ){
00221        THD_update_statistics( (THD_3dim_dataset *)blk->parent ) ;
00222        RETURN( True ) ;
00223      }
00224      STATUS("can't read 1D dataset file?!") ;
00225      RETURN( False ) ;
00226    }
00227 
00228    if( dkptr->storage_mode == STORAGE_BY_3D ){      /* 21 Mar 2003 */
00229      THD_load_3D( blk ) ;
00230      ii = THD_count_databricks( blk ) ;
00231      if( ii == blk->nvals ){
00232        THD_update_statistics( (THD_3dim_dataset *)blk->parent ) ;
00233        RETURN( True ) ;
00234      }
00235      STATUS("can't read 3D dataset file?!") ;
00236      RETURN( False ) ;
00237    }
00238 
00239    if( dkptr->storage_mode == STORAGE_BY_NIFTI ){   /* 28 Aug 2003 */
00240      THD_load_nifti( blk ) ;
00241      ii = THD_count_databricks( blk ) ;
00242      if( ii == blk->nvals ){
00243        THD_update_statistics( (THD_3dim_dataset *)blk->parent ) ;
00244        RETURN( True ) ;
00245      }
00246      STATUS("can't read NIFTI dataset file?!") ;
00247      RETURN( False ) ;
00248    }
00249 
00250    if( dkptr->storage_mode == STORAGE_BY_MPEG ){   /* 03 Dec 2003 */
00251      THD_load_mpeg( blk ) ;
00252      ii = THD_count_databricks( blk ) ;
00253      if( ii == blk->nvals ){
00254        THD_update_statistics( (THD_3dim_dataset *)blk->parent ) ;
00255        RETURN( True ) ;
00256      }
00257      STATUS("can't read MPEG dataset file?!") ;
00258      RETURN( False ) ;
00259    }
00260 
00261    /*** END OF SPECIAL CASES ABOVE; NOW FOR THE AFNI FORMAT! ***/
00262 
00263    /*-- allocate data space --*/
00264 
00265    nx = dkptr->dimsizes[0] ;
00266    ny = dkptr->dimsizes[1] ;  nxy   = nx * ny   ;
00267    nz = dkptr->dimsizes[2] ;  nxyz  = nxy * nz  ;
00268    nv = dkptr->nvals       ;
00269 
00270    if( DBLK_IS_MASTERED(blk) && blk->malloc_type == DATABLOCK_MEM_MMAP ) /* 11 Jan 1999 */
00271       blk->malloc_type = DATABLOCK_MEM_MALLOC ;
00272 
00273    /* the following code is due to Mike Beauchamp's idiocy */
00274 
00275    if( !THD_datum_constant(blk) && blk->malloc_type != DATABLOCK_MEM_MALLOC ){
00276      fprintf(stderr,"++ WARNING: dataset %s: non-uniform sub-brick types\n",
00277              blk->diskptr->filecode) ;
00278      blk->malloc_type = DATABLOCK_MEM_MALLOC ;
00279    }
00280 
00281    /* 25 April 1998: byte order issues */
00282 
00283    if( dkptr->byte_order <= 0 ) dkptr->byte_order = native_order ;
00284 
00285    /* 05 Jul 2001: if all sub-bricks are bytes,
00286                    mark dataset as being in native order
00287       20 Jun 2002: also don't have to swap RGB datasets */
00288 
00289    if( dkptr->byte_order != native_order ){
00290       for( ii=0 ; ii < nv ; ii++ )
00291          if( DBLK_BRICK_TYPE(blk,ii) != MRI_byte &&
00292              DBLK_BRICK_TYPE(blk,ii) != MRI_rgb     ) break ;
00293       if( ii == nv ) dkptr->byte_order = native_order ;
00294    }
00295 
00296    /* under some circumstances, we must force use of malloc() */
00297 
00298    if( dkptr->byte_order != native_order || no_mmap ){
00299      if( blk->malloc_type == DATABLOCK_MEM_MMAP )
00300        blk->malloc_type = DATABLOCK_MEM_MALLOC ;
00301    }
00302 
00303    DBLK_mmapfix(blk) ;  /* 18 Mar 2005 */
00304 
00305    /** set up space for bricks via malloc, if so ordered **/
00306 
00307    if( blk->malloc_type == DATABLOCK_MEM_MALLOC ||
00308        blk->malloc_type == DATABLOCK_MEM_SHARED   ){
00309 
00310      ii = THD_alloc_datablock( blk ) ;   /* 02 May 2003 */
00311      if( ii == 0 ) RETURN(False) ;
00312 
00313    /** mmap whole file (makes space and reads it all at once) **/
00314    /** [if this route is followed, then we will finish here]  **/
00315 
00316    } else if( blk->malloc_type == DATABLOCK_MEM_MMAP ){
00317 
00318       int fd , fsize ;
00319       fd = open( dkptr->brick_name , O_RDONLY ) ;  /* N.B.: readonly mode */
00320       if( fd < 0 ){
00321          fprintf( stderr , "\n*** cannot open brick file %s for mmap\n"
00322                            "   - do you have permission? does file exist?\n" ,
00323                   dkptr->brick_name ) ;
00324          perror("*** Unix error message") ;
00325          STATUS("open failed") ;
00326          RETURN( False );
00327       }
00328 
00329       /* 04 May 2001: check file size (the Katie Lee bug) */
00330 
00331       fsize = THD_filesize( dkptr->brick_name ) ;
00332       if( fsize < blk->total_bytes )
00333         fprintf(stderr ,
00334                 "\n*** WARNING: file %s size is %d, but should be at least %lld!\n" ,
00335                 dkptr->brick_name , fsize , blk->total_bytes ) ;
00336 
00337       /* clear the sub-brick pointers */
00338 
00339       for( ibr=0 ; ibr < nv ; ibr++ )
00340         mri_clear_data_pointer( DBLK_BRICK(blk,ibr) ) ;
00341 
00342       /* map the file into memory */
00343 
00344       ptr = (char *) mmap( 0 , (size_t)blk->total_bytes ,
00345                                PROT_READ , THD_MMAP_FLAG , fd , 0 ) ;
00346 
00347       /* if that fails, maybe try again (via freeup) */
00348 
00349       if( ptr == (char *)(-1) ){
00350          fprintf(stderr ,
00351                  "\n*** cannot mmap brick file %s - maybe hit a system limit?\n" ,
00352                  dkptr->brick_name ) ;
00353          perror("*** Unix error message") ;
00354          if( freeup != NULL ){
00355             fprintf(stderr,"*** trying to fix problem\n") ; /* 18 Oct 2001 */
00356             freeup() ;                          /* AFNI_purge_unused_dsets */
00357             ptr = (char *) mmap( 0 , (size_t)blk->total_bytes ,
00358                                      PROT_READ , THD_MMAP_FLAG , fd , 0 ) ;
00359             if( ptr == (char *)(-1) ){
00360                fprintf(stderr,"*** cannot fix problem!\n") ;
00361                close(fd) ;
00362                STATUS("freeup failed") ; RETURN( False );
00363             } else {
00364                fprintf(stderr,"*** was able to fix problem!\n") ;
00365             }
00366          } else {       /* no freeup function to try */
00367             close(fd) ;
00368             STATUS("mmap failed") ; RETURN( False );
00369          }
00370       }
00371 
00372       close(fd) ;  /* can close file after mmap-ing it */
00373 
00374       /* (re)create pointers to all sub-bricks */
00375 
00376       offset = 0 ;
00377       for( ibr=0 ; ibr < nv ; ibr++ ){
00378          mri_fix_data_pointer( ptr , DBLK_BRICK(blk,ibr) ) ;
00379          ptr += DBLK_BRICK_BYTES(blk,ibr) ;
00380       }
00381 
00382       STATUS("mmap succeeded") ;
00383       RETURN( True );  /* finito */
00384 
00385    } else {
00386       STATUS("unknown malloc_type code?!") ;
00387       RETURN( False ) ;  /* should never happen */
00388    }
00389 
00390    /*** Below here, space for brick images was malloc()-ed,
00391         and now we have to read data into them, somehow    ***/
00392 
00393    ptr = getenv("AFNI_LOAD_PRINTSIZE") ;   /* 23 Aug 2002 */
00394    if( verb && ptr != NULL ){
00395      char *ept ;
00396      idone = strtol( ptr , &ept , 10 ) ;
00397      if( idone > 0 ){
00398             if( *ept == 'K' || *ept == 'k' ) id *= 1024 ;
00399        else if( *ept == 'M' || *ept == 'm' ) id *= 1024*1024 ;
00400        print_size = id ;
00401      } else {
00402        print_size = 666000000 ;
00403      }
00404    }
00405 
00406    if( verb ) verb = (blk->total_bytes > print_size) ;
00407    if( verb ) fprintf(stderr,"reading dataset %s",dkptr->filecode) ;
00408 
00409    switch( dkptr->storage_mode ){
00410 
00411       /*-- should never ever happen --*/
00412 
00413       default:
00414          fprintf(stderr,"\n*** illegal storage mode in read ***\n") ;
00415          RETURN( False );
00416       break ;
00417 
00418       /*-- read everything from .BRIK file --*/
00419 
00420       case STORAGE_BY_BRICK:{
00421          FILE *far ;
00422 
00423          STATUS("reading from BRIK file") ;
00424 
00425          far = COMPRESS_fopen_read( dkptr->brick_name ) ;
00426 
00427          if( far == NULL ){
00428             THD_purge_datablock( blk , blk->malloc_type ) ;
00429             fprintf(stderr,
00430                     "\n*** failure while opening brick file %s "
00431                     "- do you have permission?\n" ,
00432                     dkptr->brick_name ) ;
00433             perror("*** Unix error message") ;
00434             RETURN( False );
00435          }
00436 
00437          /* read each sub-brick all at once */
00438 
00439          idone = 0 ;
00440          if( ! DBLK_IS_MASTERED(blk) ){      /* read each brick */
00441 
00442             for( ibr=0 ; ibr < nv ; ibr++ ){
00443               idone += fread( DBLK_ARRAY(blk,ibr), 1,
00444                               DBLK_BRICK_BYTES(blk,ibr), far ) ;
00445 
00446               if( verb && ibr%PRINT_STEP == 0 ) fprintf(stderr,".") ;
00447             }
00448 
00449          } else {  /* 11 Jan 1999: read brick from master, put into place(s) */
00450 
00451             int nfilled = 0 , nbuf=0 , jbr, nbr ;
00452             char *buf=NULL ;  /* temp buffer for master sub-brick */
00453 
00454             /* loop over master sub-bricks until dataset is filled */
00455             /* [because dataset might be compressed, must read them in
00456                 sequence, even if some intermediate ones aren't used. ] */
00457 
00458             for( ibr=0 ; nfilled < nv && ibr < blk->master_nvals ; ibr++ ){
00459 
00460                if( nbuf < blk->master_bytes[ibr] ){  /* make more space for it */
00461                  if( buf != NULL ) free(buf) ;
00462                  nbuf = blk->master_bytes[ibr] ;
00463                  buf  = AFMALL(char, sizeof(char) * nbuf ) ;
00464                  if( buf == NULL ) break ;
00465                }
00466 
00467                /* read the master sub-brick #ibr */
00468 
00469                nbr = fread( buf , 1 , blk->master_bytes[ibr] , far ) ;
00470                if( verb && ibr%PRINT_STEP == 0 ) fprintf(stderr,".") ;
00471                if( nbr < blk->master_bytes[ibr] ) break ;
00472 
00473                /* find all the dataset sub-bricks that are copies of this */
00474 
00475                for( jbr=0 ; jbr < nv ; jbr++ ){
00476                  if( blk->master_ival[jbr] == ibr ){  /* copy it in */
00477                    memcpy( DBLK_ARRAY(blk,jbr) , buf , blk->master_bytes[ibr] ) ;
00478                    nfilled++ ;  /* number of bricks filled */
00479                    idone += nbr ;  /* number of bytes read into dataset */
00480                  }
00481                }
00482             }  /* end of loop over master sub-bricks */
00483 
00484             if( buf != NULL ) free(buf) ;  /* free temp sub-brick */
00485          }
00486 
00487          /* close input file */
00488 
00489          COMPRESS_fclose(far) ;
00490 
00491          /* check if total amount of data read is correct */
00492 
00493          if( idone != blk->total_bytes ){
00494             THD_purge_datablock( blk , blk->malloc_type ) ;
00495             fprintf(stderr ,
00496                     "\n*** failure while reading from brick file %s\n"
00497                       "*** desired %lld bytes but only got %lld\n" ,
00498                     dkptr->brick_name , blk->total_bytes , idone ) ;
00499             perror("*** Unix error message") ;
00500             RETURN( False );
00501          }
00502       }
00503       break ;  /* end of STORAGE_BY_BRICK */
00504 
00505       /*** Read from a sequence of volume files (1 per sub-brick) [20 Jun 2002] ***/
00506 
00507       case STORAGE_BY_VOLUMES:{
00508         ATR_string *atr ;
00509         char **fnam , *ptr , *flist ;
00510         FILE *far ;
00511 
00512         STATUS("reading from volume files") ;
00513 
00514         /* get list of filenames */
00515 
00516         atr = THD_find_string_atr(blk,"VOLUME_FILENAMES") ;
00517 
00518         /* the following should never happen */
00519 
00520         if( atr == NULL || atr->nch < 2*nv ){
00521           THD_purge_datablock( blk , blk->malloc_type ) ;
00522           fprintf(stderr,
00523                   "Dataset %s does not have legal VOLUME_FILENAMES attribute!\n",
00524                   blk->diskptr->filecode) ;
00525           RETURN( False );
00526         }
00527 
00528         /* copy filename list into NUL terminated local string */
00529 
00530         flist = AFMALL(char, atr->nch+1) ;
00531         memcpy( flist , atr->ch , atr->nch ) ;
00532         flist[atr->nch] = '\0' ;
00533 
00534 #if 0
00535 fprintf(stderr,"VOL: flist:\n%s\n",flist) ;
00536 #endif
00537 
00538         /* break filename list into component filenames (1 per sub-brick) */
00539 
00540         fnam = (char **) malloc(sizeof(char *)*nv) ;
00541         for( ibr=0 ; ibr < nv ; ibr++ ){
00542 
00543           /* find sub-string with next filename */
00544 
00545           ptr = strtok( (ibr==0)?flist:NULL , " \t\n\r\f\v" ) ;
00546 
00547           /* didn't get one => bad news */
00548 
00549           if( ptr == NULL ){
00550             fprintf(stderr,
00551                     "Dataset %s has illegal VOLUME_FILENAMES attribute!\n",
00552                     blk->diskptr->filecode) ;
00553             for( ii=0 ; ii < nv ; ii++ ){
00554               free( DBLK_ARRAY(blk,ii) ) ;
00555               mri_clear_data_pointer( DBLK_BRICK(blk,ii) ) ;
00556             }
00557             for( ii=0 ; ii < ibr ; ii++ ) free(fnam[ii]) ;
00558             free(flist) ; free(fnam) ;
00559             RETURN( False );
00560           }
00561 
00562           /* make fnam[ibr] = name ibr-th volume file */
00563 
00564 #if 0
00565 fprintf(stderr,"VOL[%d]: ptr=%s\n",ibr,ptr) ;
00566 #endif
00567 
00568           if( *ptr == '/' ){          /* if filename is absolute, duplicate it */
00569             fnam[ibr] = strdup(ptr) ;
00570           } else {                    /* otherwise, put directory name in front */
00571             ii = strlen(blk->diskptr->directory_name) + strlen(ptr) ;
00572             fnam[ibr] = AFMALL(char,ii+1) ; fnam[ibr][0] = '\0' ;
00573             strcat(fnam[ibr],blk->diskptr->directory_name) ;
00574             strcat(fnam[ibr],ptr) ;
00575           }
00576 #if 0
00577 fprintf(stderr,"VOL[%d]: fnam=%s\n",ibr,fnam[ibr]) ;
00578 #endif
00579         }
00580         free(flist) ;  /* done with unparsed filename list copy */
00581 
00582         /*** loop over sub-bricks and read them in ***/
00583 
00584         if( ! DBLK_IS_MASTERED(blk) ){      /* read each brick */
00585 
00586           for( ibr=0 ; ibr < nv ; ibr++ ){
00587 
00588 #if 0
00589 fprintf(stderr,"VOL[%d]: opening %s\n",ibr,fnam[ibr]) ;
00590 #endif
00591 
00592             far = COMPRESS_fopen_read( fnam[ibr] ) ;  /* open file */
00593 
00594             if( far == NULL ){                   /* can't open it? */
00595               fprintf(stderr,
00596                       "\n*** Failure while opening volume file %s "
00597                       "- do you have permission?\n" ,
00598                     fnam[ibr] ) ;
00599               perror("*** Unix error message") ;
00600               THD_purge_datablock( blk , blk->malloc_type ) ;
00601               for( ii=0 ; ii < nv ; ii++ ) free(fnam[ii]) ;
00602               free(fnam); RETURN( False );
00603             }
00604 
00605             /* read all of file at once */
00606 
00607             id = fread( DBLK_ARRAY(blk,ibr), 1,
00608                         DBLK_BRICK_BYTES(blk,ibr), far ) ;
00609             if( verb && ibr%PRINT_STEP==0 ) fprintf(stderr,".") ;
00610 
00611 #if 0
00612 fprintf(stderr,"VOL[%d]: id=%d\n",ibr,id) ;
00613 #endif
00614 
00615             COMPRESS_fclose(far) ;
00616 
00617             if( id < DBLK_BRICK_BYTES(blk,ibr) ){
00618               fprintf(stderr,
00619                       "\n*** Volume file %s only gave %d out of %d bytes needed!\n",
00620                      fnam[ibr] , id , DBLK_BRICK_BYTES(blk,ibr) ) ;
00621               THD_purge_datablock( blk , blk->malloc_type ) ;
00622               for( ii=0 ; ii < nv ; ii++ ) free(fnam[ii]) ;
00623               free(fnam); RETURN( False );
00624             }
00625 
00626           } /* end of loop over sub-bricks */
00627 
00628         } else {  /*** Mastered dataset ==> must read only selected sub-bricks ***/
00629 
00630           int jbr ;
00631 
00632           /** loop over output sub-bricks **/
00633 
00634           for( jbr=0 ; jbr < nv ; jbr++ ){
00635             ibr = blk->master_ival[jbr] ;             /* master sub-brick index */
00636             far = COMPRESS_fopen_read( fnam[ibr] ) ;  /* open file */
00637 
00638             if( far == NULL ){                   /* can't open it? */
00639               fprintf(stderr,
00640                       "\n*** Failure while opening volume file %s "
00641                       "- do you have permission?\n" ,
00642                     fnam[ibr] ) ;
00643               perror("*** Unix error message") ;
00644               THD_purge_datablock( blk , blk->malloc_type ) ;
00645               for( ii=0 ; ii < nv ; ii++ ) free(fnam[ii]) ;
00646               free(fnam); RETURN( False );
00647             }
00648 
00649             /* read all of file at once */
00650 
00651             id = fread( DBLK_ARRAY(blk,jbr), 1,
00652                         DBLK_BRICK_BYTES(blk,jbr), far ) ;
00653             if( verb && jbr%PRINT_STEP == 0 ) fprintf(stderr,".") ;
00654 
00655             COMPRESS_fclose(far) ;
00656 
00657             if( id < DBLK_BRICK_BYTES(blk,jbr) ){
00658               fprintf(stderr,
00659                       "\n*** Volume file %s only gave %d out of %d bytes needed!\n",
00660                      fnam[ibr] , id , DBLK_BRICK_BYTES(blk,jbr) ) ;
00661               THD_purge_datablock( blk , blk->malloc_type ) ;
00662               for( ii=0 ; ii < nv ; ii++ ) free(fnam[ii]) ;
00663               free(fnam); RETURN( False );
00664             }
00665 
00666           } /* end of loop over sub-bricks */
00667 
00668         } /* end of mastered vs. unmastered dataset */
00669 
00670         /*** at this point, all the data has been read in ***/
00671 
00672         /* volume filenames no longer needed */
00673 
00674         for( ii=0 ; ii < nv ; ii++ ) free(fnam[ii]) ;
00675         free(fnam) ;
00676 
00677       }
00678       break ; /* end of STORAGE_BY_VOLUMES */
00679 
00680    } /* end of switch on storage modes */
00681 
00682    /************* At this point, data is all in bricks;
00683                   now do any post-processing before exiting *************/
00684 
00685    STATUS("data has been read in") ;
00686 
00687    /* 25 April 1998: check and fix byte ordering */
00688 
00689    if( dkptr->byte_order != native_order ){
00690       STATUS("byte swapping") ;
00691       if( verb ) fprintf(stderr,".byte swap") ;
00692 
00693       for( ibr=0 ; ibr < nv ; ibr++ ){
00694          switch( DBLK_BRICK_TYPE(blk,ibr) ){
00695             case MRI_short:
00696                mri_swap2( DBLK_BRICK_NVOX(blk,ibr) , DBLK_ARRAY(blk,ibr) ) ;
00697             break ;
00698 
00699             case MRI_complex:  /* 14 Sep 1999: swap complex also! */
00700                mri_swap4( 2*DBLK_BRICK_NVOX(blk,ibr), DBLK_ARRAY(blk,ibr)) ;
00701             break ;
00702 
00703             case MRI_float:
00704             case MRI_int:
00705                mri_swap4( DBLK_BRICK_NVOX(blk,ibr) , DBLK_ARRAY(blk,ibr) ) ;
00706             break ;
00707          }
00708       }
00709    }
00710 
00711    /* 30 July 1999: check float sub-brick for errors? */
00712    /* 14 Sep  1999: also check complex sub-bricks!    */
00713 
00714    if( floatscan ){
00715       int nerr=0 ;
00716       STATUS("float scanning") ;
00717       if( verb ) fprintf(stderr,".float scan") ;
00718 
00719       for( ibr=0 ; ibr < nv ; ibr++ ){
00720          if( DBLK_BRICK_TYPE(blk,ibr) == MRI_float ){
00721             nerr += thd_floatscan( DBLK_BRICK_NVOX(blk,ibr) ,
00722                                    DBLK_ARRAY(blk,ibr)        ) ;
00723 
00724          } else if( DBLK_BRICK_TYPE(blk,ibr) == MRI_complex ) {  /* 14 Sep 1999 */
00725             nerr += thd_complexscan( DBLK_BRICK_NVOX(blk,ibr) ,
00726                                      DBLK_ARRAY(blk,ibr)        ) ;
00727          }
00728       }
00729       if( nerr > 0 )
00730          fprintf(stderr ,
00731                  "*** %s: found %d float errors -- see program float_scan\n" ,
00732                  dkptr->brick_name , nerr ) ;
00733    }
00734 
00735    /* 21 Feb 2001: if sub-ranging also used, clip values in brick */
00736 
00737 #if 0
00738 fprintf(stderr,"master_bot=%g master_top=%g\n",blk->master_bot,blk->master_top) ;
00739 #endif
00740    if( DBLK_IS_MASTERED(blk) && blk->master_bot <= blk->master_top ){
00741       float bot = blk->master_bot , top = blk->master_top , fac ;
00742       int jbr ;
00743 
00744       STATUS("sub-ranging") ;
00745       if( verb ) fprintf(stderr,".sub-range") ;
00746 
00747       for( jbr=0 ; jbr < nv ; jbr++ ){
00748          switch( DBLK_BRICK_TYPE(blk,jbr) ){
00749 
00750             default:
00751                fprintf(stderr,
00752                        "** Can't sub-range datum type %s!\n",
00753                        MRI_TYPE_name[DBLK_BRICK_TYPE(blk,jbr)]) ;
00754             break ;
00755 
00756             case MRI_short:{
00757                short mbot, mtop, *mar = (short *) DBLK_ARRAY(blk,jbr) ;
00758                float mfac = DBLK_BRICK_FACTOR(blk,jbr) ;
00759                if( mfac == 0.0 ) mfac = 1.0 ;
00760                mbot = SHORTIZE(bot/mfac) ; mtop = SHORTIZE(top/mfac) ;
00761 #if 0
00762 fprintf(stderr,"mbot=%d mtop=%d\n",(int)mbot,(int)mtop) ;
00763 #endif
00764                for( ii=0 ; ii < nxyz ; ii++ )
00765                   if( mar[ii] < mbot || mar[ii] > mtop ) mar[ii] = 0 ;
00766             }
00767             break ;
00768 
00769             case MRI_int:{
00770                int mbot, mtop, *mar = (int *) DBLK_ARRAY(blk,jbr) ;
00771                float mfac = DBLK_BRICK_FACTOR(blk,jbr) ;
00772                if( mfac == 0.0 ) mfac = 1.0 ;
00773                mbot = rint(bot/mfac) ; mtop = rint(top/mfac) ;
00774                for( ii=0 ; ii < nxyz ; ii++ )
00775                   if( mar[ii] < mbot || mar[ii] > mtop ) mar[ii] = 0 ;
00776             }
00777             break ;
00778 
00779             case MRI_byte:{
00780                byte mbot, mtop, *mar = (byte *) DBLK_ARRAY(blk,jbr) ;
00781                float mfac = DBLK_BRICK_FACTOR(blk,jbr) ;
00782                if( mfac == 0.0 ) mfac = 1.0 ;
00783                mbot = BYTEIZE(bot/mfac) ; mtop = BYTEIZE(top/mfac) ;
00784                for( ii=0 ; ii < nxyz ; ii++ )
00785                   if( mar[ii] < mbot || mar[ii] > mtop ) mar[ii] = 0 ;
00786             }
00787             break ;
00788 
00789             case MRI_float:{
00790                float mbot, mtop, *mar = (float *) DBLK_ARRAY(blk,jbr) ;
00791                float mfac = DBLK_BRICK_FACTOR(blk,jbr) ;
00792                if( mfac == 0.0 ) mfac = 1.0 ;
00793                mbot = (bot/mfac) ; mtop = (top/mfac) ;
00794                for( ii=0 ; ii < nxyz ; ii++ )
00795                   if( mar[ii] < mbot || mar[ii] > mtop ) mar[ii] = 0 ;
00796             }
00797             break ;
00798 
00799             case MRI_complex:{
00800                float mbot, mtop , val ;
00801                complex *mar = (complex *) DBLK_ARRAY(blk,jbr) ;
00802                float mfac = DBLK_BRICK_FACTOR(blk,jbr) ;
00803                if( mfac == 0.0 ) mfac = 1.0 ;
00804                mbot = (bot/mfac) ; mtop = (top/mfac) ;
00805                mbot = (mbot > 0) ? mbot*mbot : 0 ;
00806                mtop = (mtop > 0) ? mtop*mtop : 0 ;
00807                for( ii=0 ; ii < nxyz ; ii++ ){
00808                   val = CSQR(mar[ii]) ;
00809                   if( val < mbot || val > mtop ) mar[ii].r = mar[ii].i = 0 ;
00810                }
00811             }
00812             break ;
00813          }
00814       }
00815    }
00816 
00817    if( verb ) fprintf(stderr,".done\n") ;
00818 
00819    RETURN( True ) ;  /* things are now cool */
00820 }

void THD_load_datablock_verbose int    v
 

Definition at line 19 of file thd_loaddblk.c.

References v, and verbose.

Referenced by main().

00019 { verbose = v; }

void THD_set_freeup generic_func   ff
 

Definition at line 100 of file thd_loaddblk.c.

References freeup, and generic_func.

Referenced by main().

00100 { freeup = ff; }

void THD_zerofill_dataset THD_3dim_dataset   dset
 

Fill up a dataset with zero-ed out sub-bricks, if needed. ------------------------------------------------------------------------------

Definition at line 965 of file thd_loaddblk.c.

References calloc, THD_3dim_dataset::dblk, DSET_ARRAY, DSET_BRICK, DSET_BRICK_BYTES, DSET_NVALS, ENTRY, ISVALID_DATABLOCK, ISVALID_DSET, and mri_fix_data_pointer().

Referenced by THD_niml_to_dataset().

00966 {
00967    int ii ;
00968    void *vpt ;
00969 
00970 ENTRY("THD_zerofill_dataset") ;
00971 
00972    if( !ISVALID_DSET(dset) || !ISVALID_DATABLOCK(dset->dblk) ) EXRETURN ;
00973 
00974    for( ii=0 ; ii < DSET_NVALS(dset) ; ii++ ){
00975      if( DSET_ARRAY(dset,ii) == NULL ){
00976        vpt = calloc(1,DSET_BRICK_BYTES(dset,ii)) ;
00977        mri_fix_data_pointer( vpt , DSET_BRICK(dset,ii) ) ;
00978      }
00979    }
00980    EXRETURN ;
00981 }

Variable Documentation

int floatscan = -1 [static]
 

Definition at line 12 of file thd_loaddblk.c.

Referenced by THD_load_datablock().

generic_func* freeup = NULL [static]
 

Definition at line 98 of file thd_loaddblk.c.

Referenced by THD_alloc_datablock(), THD_load_datablock(), and THD_set_freeup().

int native_order = -1 [static]
 

Definition at line 10 of file thd_loaddblk.c.

Referenced by THD_load_datablock().

int no_mmap = -1 [static]
 

Definition at line 11 of file thd_loaddblk.c.

Referenced by THD_load_datablock().

int verbose = 0 [static]
 

Definition at line 17 of file thd_loaddblk.c.

Referenced by THD_load_datablock(), and THD_load_datablock_verbose().

 

Powered by Plone

This site conforms to the following standards: