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  

edt_addbrick.c

Go to the documentation of this file.
00001 /*****************************************************************************
00002    Major portions of this software are copyrighted by the Medical College
00003    of Wisconsin, 1994-2000, and are released under the Gnu General Public
00004    License, Version 2.  See the file README.Copyright for details.
00005 ******************************************************************************/
00006 
00007 #include "mrilib.h"
00008 
00009 /*---------------------------------------------------------------------------
00010   Routine to attach sub-bricks to the end of an already existing 3D dataset.
00011     nbr = number of extra bricks
00012     tbr = array of data types in each brick (defaults to MRI_short)
00013     fbr = array of new brick_fac factors in each brick
00014            if NULL, new factors will be set to zero
00015     sbr = array of pointers to data in each brick
00016            if sbr[i]==NULL, then the i'th extra brick will not have data
00017            if sbr==NULL, then all new extra bricks will not have data
00018              (in which case you will have to use mri_fix_data_pointer to
00019               attach data at a later time, if you plan to use the data)
00020 
00021   Note that this can only be done on a brick that is malloc-ed, not mmap-ed!
00022 -----------------------------------------------------------------------------*/
00023 
00024 void EDIT_add_bricklist( THD_3dim_dataset * dset ,
00025                          int nbr, int * tbr, float * fbr , void *sbr[] )
00026 {
00027    int ibr , typ , nx,ny,nz , nvals,new_nvals ;
00028    THD_datablock * dblk ;
00029    MRI_IMAGE * qim ;
00030    char str[32] ;
00031 
00032 ENTRY("EDIT_add_bricklist") ;
00033 
00034    /**-- Sanity Checks --**/
00035 
00036    if( ! ISVALID_3DIM_DATASET(dset) || nbr <= 0 )       EXRETURN; /* error! */
00037    if( dset->dblk->brick == NULL )                      EXRETURN; /* error! */
00038    if( dset->dblk->malloc_type != DATABLOCK_MEM_MALLOC )EXRETURN; /* error! */
00039 
00040    dblk  = dset->dblk ;
00041    nvals = dblk->nvals ;
00042    nx    = dblk->diskptr->dimsizes[0] ;
00043    ny    = dblk->diskptr->dimsizes[1] ;
00044    nz    = dblk->diskptr->dimsizes[2] ;
00045 
00046    /**-- reallocate the brick control information --**/
00047 
00048    new_nvals = nvals + nbr ;
00049    dblk->brick_bytes = (int *) XtRealloc( (char *) dblk->brick_bytes ,
00050                                           sizeof(int) * new_nvals ) ;
00051 
00052    dblk->brick_fac = (float *) XtRealloc( (char *) dblk->brick_fac ,
00053                                           sizeof(float) * new_nvals ) ;
00054 
00055    dblk->nvals = dblk->diskptr->nvals = new_nvals ;
00056 
00057    /** allocate new sub-brick images **/
00058 
00059    for( ibr=0 ; ibr < nbr ; ibr++ ){
00060       typ = (tbr != NULL ) ? tbr[ibr] : MRI_short ;
00061       qim = mri_new_vol_empty( nx,ny,nz , typ ) ;  /* image with no data */
00062 
00063       if( sbr != NULL && sbr[ibr] != NULL )        /* attach data to image */
00064          mri_fix_data_pointer( sbr[ibr] , qim ) ;
00065 
00066       ADDTO_IMARR( dblk->brick , qim ) ;           /* attach image to dset */
00067 
00068       dblk->brick_fac[nvals+ibr]   = (fbr != NULL) ? fbr[ibr] : 0.0 ;
00069       dblk->brick_bytes[nvals+ibr] = qim->pixel_size * qim->nvox ;
00070       dblk->total_bytes           += dblk->brick_bytes[ibr] ;
00071    }
00072 
00073    /** allocate new sub-brick auxiliary data: labels **/
00074 
00075    if( dblk->brick_lab == NULL )
00076       THD_init_datablock_labels( dblk ) ;
00077    else
00078       dblk->brick_lab = (char **) XtRealloc( (char *) dblk->brick_lab ,
00079                                              sizeof(char *) * new_nvals ) ;
00080    for( ibr=0 ; ibr < nbr ; ibr++ ){
00081       sprintf( str , "#%d" , nvals+ibr ) ;
00082       dblk->brick_lab[nvals+ibr] = NULL ;
00083       THD_store_datablock_label( dblk , nvals+ibr , str ) ;
00084    }
00085 
00086    /** keywords **/
00087 
00088    if( dblk->brick_keywords == NULL )
00089       THD_init_datablock_keywords( dblk ) ;
00090    else
00091       dblk->brick_keywords = (char **) XtRealloc( (char *) dblk->brick_keywords ,
00092                                                   sizeof(char *) * new_nvals ) ;
00093    for( ibr=0 ; ibr < nbr ; ibr++ ){
00094       dblk->brick_keywords[nvals+ibr] = NULL ;
00095       THD_store_datablock_keywords( dblk , nvals+ibr , NULL ) ;
00096    }
00097 
00098    /** stataux **/
00099 
00100    if( dblk->brick_statcode != NULL ){
00101       dblk->brick_statcode = (int *) XtRealloc( (char *) dblk->brick_statcode ,
00102                                                 sizeof(int) * new_nvals        ) ;
00103       dblk->brick_stataux  = (float **) XtRealloc( (char *) dblk->brick_stataux ,
00104                                                    sizeof(float *) * new_nvals ) ;
00105 
00106       for( ibr=0 ; ibr < nbr ; ibr++ ){
00107          dblk->brick_statcode[nvals+ibr] = 0 ;
00108          dblk->brick_stataux[nvals+ibr]  = NULL ;
00109       }
00110    }
00111 
00112   EXRETURN;
00113 }
00114 
00115 void EDIT_add_brick( THD_3dim_dataset * dset, int typ , float fac , void * br )
00116 {
00117    int    ttt = typ ;
00118    float  fff = fac ;
00119    void * bbb = br ;
00120 
00121    EDIT_add_bricklist( dset , 1 , &ttt , &fff , &bbb ) ;
00122    return ;
00123 }
 

Powered by Plone

This site conforms to the following standards: