Doxygen Source Code Documentation
thd_3Ddset.c File Reference
#include "mrilib.h"#include "thd.h"Go to the source code of this file.
Functions | |
| THD_3dim_dataset * | THD_open_3D (char *pathname) |
| void | THD_set_storage_mode (THD_3dim_dataset *dset, int mm) |
| void | THD_load_3D (THD_datablock *dblk) |
| void | THD_write_3D (char *sname, char *pname, THD_3dim_dataset *dset) |
Function Documentation
|
|
Load a 3D dataset's data into memory. Called from THD_load_datablock() in thd_loaddblk.c. ------------------------------------------------------------------- Definition at line 243 of file thd_3Ddset.c. References AFMALL, THD_datablock::brick, THD_diskptr::brick_name, calloc, DATABLOCK_MEM_MALLOC, DBLK_ARRAY, DBLK_BRICK, DBLK_BRICK_BYTES, THD_diskptr::dimsizes, THD_datablock::diskptr, ENTRY, free, ISVALID_DATABLOCK, THD_datablock::malloc_type, mri_fix_data_pointer(), NI_free, NI_free_element(), NI_read_element(), NI_skip_procins(), NI_stream_close(), NI_stream_open(), THD_diskptr::nvals, STORAGE_BY_3D, THD_diskptr::storage_mode, NI_element::vec, NI_element::vec_len, and NI_element::vec_num. Referenced by THD_load_datablock().
00244 {
00245 THD_diskptr *dkptr ;
00246 NI_element *nel ;
00247 NI_stream ns ;
00248 int nxyz , iv,nv ;
00249 char *ppp ;
00250
00251 ENTRY("THD_load_3D") ;
00252
00253 /*-- open input [these errors should never occur] --*/
00254
00255 if( !ISVALID_DATABLOCK(dblk) ||
00256 dblk->diskptr->storage_mode != STORAGE_BY_3D ||
00257 dblk->brick == NULL ) EXRETURN ;
00258
00259 dkptr = dblk->diskptr ;
00260 nxyz = dkptr->dimsizes[0] * dkptr->dimsizes[1] * dkptr->dimsizes[2] ;
00261 nv = dkptr->nvals ;
00262
00263 if( nxyz*nv > 1000000 ) fprintf(stderr,"++ Reading %s\n",dkptr->brick_name) ;
00264
00265 ppp = (char*)calloc( sizeof(char) , strlen(dkptr->brick_name)+16 ) ;
00266
00267 strcpy(ppp,"file:") ; strcat(ppp,dkptr->brick_name) ;
00268 ns = NI_stream_open( ppp , "r" ) ; free(ppp) ;
00269 if( ns == NULL ) EXRETURN ;
00270
00271 NI_skip_procins(1) ;
00272 nel = NI_read_element(ns,333); NI_stream_close(ns);
00273 NI_skip_procins(0) ;
00274 if( nel == NULL ) EXRETURN ;
00275
00276 /*-- allocate space for data --*/
00277
00278 if( nxyz != nel->vec_len || nv != nel->vec_num ){
00279 fprintf(stderr,"THD_load_3D(%s): nxyz or nv mismatch!\n",dkptr->brick_name) ;
00280 fprintf(stderr," expect nxyz=%d; got %d\n",nxyz, nel->vec_len);
00281 fprintf(stderr," expect nv =%d; got %d\n",nv , nel->vec_num);
00282 NI_free_element(nel) ; EXRETURN ;
00283 }
00284
00285 dblk->malloc_type = DATABLOCK_MEM_MALLOC ;
00286
00287 /** malloc space for each brick separately,
00288 and copy data from element into place **/
00289
00290 for( iv=0 ; iv < nv ; iv++ ){
00291 if( DBLK_ARRAY(dblk,iv) == NULL ){ /* needs data */
00292 ppp = AFMALL(char, DBLK_BRICK_BYTES(dblk,iv) ); /* make space */
00293 if( ppp == NULL ) break ; /* bad bad bad */
00294 mri_fix_data_pointer( ppp, DBLK_BRICK(dblk,iv) ) ;
00295 memcpy( ppp, nel->vec[iv], DBLK_BRICK_BYTES(dblk,iv) ) ;
00296 NI_free(nel->vec[iv]) ; nel->vec[iv] = NULL ;
00297 }
00298 }
00299
00300 NI_free_element(nel) ;
00301
00302 /* if malloc failed, then delete all bricks */
00303
00304 if( iv < nv ){
00305 fprintf(stderr,"\n** malloc failed for 3D dataset input!\n");
00306 for( iv=0 ; iv < nv ; iv++ ){
00307 if( DBLK_ARRAY(dblk,iv) != NULL ){
00308 free( DBLK_ARRAY(dblk,iv) ) ;
00309 mri_fix_data_pointer( NULL, DBLK_BRICK(dblk,iv) ) ;
00310 }
00311 }
00312 }
00313
00314 EXRETURN ;
00315 }
|
|
|
Open a NIML 3D file as an AFNI dataset. Each column is a separate sub-brick. Dataset returned is empty (no data). ------------------------------------------------------------------- Definition at line 13 of file thd_3Ddset.c. References ADN_datum_array, ADN_func_type, ADN_malloc_type, ADN_none, ADN_ntt, ADN_nvals, ADN_nxyz, ADN_prefix, ADN_ttdel, ADN_tunits, ADN_type, ADN_xyzdel, ADN_xyzorg, ADN_xyzorient, AFNI_FIRST_STATCODE, AFNI_LAST_STATCODE, ANAT_BUCK_TYPE, ANAT_EPI_TYPE, THD_diskptr::brick_name, calloc, DATABLOCK_MEM_MALLOC, THD_3dim_dataset::dblk, THD_datablock::diskptr, dt, EDIT_dset_items(), EDIT_empty_copy(), EDIT_STATAUX4, ENTRY, free, HEAD_ANAT_TYPE, THD_3dim_dataset::idcode, THD_ivec3::ijk, MCW_hash_idcode(), MCW_IDSIZE, MIN, NI_element::name, NI_decode_string_list(), NI_delete_str_array, NI_ELEMENT_TYPE, NI_element_type(), NI_free_element(), NI_get_attribute(), NI_IS_NUMERIC_TYPE, NI_read_element(), NI_read_header_only(), NI_skip_procins(), NI_stat_distname(), NI_STAT_FIRSTCODE, NI_STAT_LASTCODE, NI_stat_numparam(), NI_stream_close(), NI_stream_open(), NI_strncpy(), NI_str_array::num, OR3OK, ORCODE, ORI_A2P_TYPE, ORI_I2S_TYPE, ORI_R2L_TYPE, RETURN, STATUS, STORAGE_BY_3D, THD_diskptr::storage_mode, NI_str_array::str, MCW_idcode::str, strtod(), THD_MAX_NAME, THD_MAX_PREFIX, THD_trailname(), UNITS_SEC_TYPE, NI_element::vec_axis_delta, NI_element::vec_axis_label, NI_element::vec_axis_len, NI_element::vec_axis_origin, NI_element::vec_len, NI_element::vec_num, NI_element::vec_rank, NI_element::vec_typ, and THD_fvec3::xyz. Referenced by THD_open_1D(), and THD_open_one_dataset().
00014 {
00015 THD_3dim_dataset *dset=NULL ;
00016 char prefix[1024] , *ppp ;
00017 THD_ivec3 nxyz , orixyz ;
00018 THD_fvec3 dxyz , orgxyz ;
00019 int nvals , ii ;
00020 NI_element *nel ;
00021 NI_stream ns ;
00022
00023 ENTRY("THD_open_3D") ;
00024
00025 /*-- read input file into NI_element --*/
00026
00027 if( pathname == NULL || *pathname == '\0' ) RETURN(NULL) ;
00028
00029 ppp = (char*)calloc( sizeof(char) , strlen(pathname)+16 ) ;
00030
00031 strcpy(ppp,"file:") ; strcat(ppp,pathname) ;
00032 ns = NI_stream_open( ppp , "r" ) ; free(ppp) ;
00033 if( ns == NULL ) RETURN(NULL) ;
00034
00035 STATUS("reading header") ;
00036
00037 NI_skip_procins(1) ; NI_read_header_only(1) ;
00038 nel = NI_read_element(ns,333); NI_stream_close(ns);
00039 NI_skip_procins(0) ; NI_read_header_only(0) ;
00040
00041 /*-- check data element for reasonability --*/
00042
00043 if( nel == NULL || /* bad read */
00044 NI_element_type(nel) != NI_ELEMENT_TYPE || /* bad element */
00045 nel->vec_num <= 0 || /* no data */
00046 nel->vec_len <= 0 || /* no data */
00047 strcmp(nel->name,"AFNI_3D_dataset") != 0 || /* incorrect data */
00048 nel->vec_rank > 3 ){ /* weird header */
00049
00050 fprintf(stderr,"** Can't read 3D head from %s\n",pathname) ;
00051 NI_free_element(nel) ; RETURN(NULL) ;
00052 }
00053
00054 STATUS("checking header") ;
00055
00056 /*-- check column types to make sure they are all numeric --*/
00057 /* [AFNI doesn't like String or compound type datasets] */
00058
00059 for( ii=0 ; ii < nel->vec_num ; ii++ ){
00060
00061 if( !NI_IS_NUMERIC_TYPE(nel->vec_typ[ii]) ){
00062 fprintf(stderr,"** 3D file %s isn't numeric!\n",pathname) ;
00063 NI_free_element(nel) ; RETURN(NULL) ;
00064 }
00065 }
00066
00067 /*-- now have good data element ==> make a dataset --*/
00068
00069 STATUS("making dataset") ;
00070
00071 dset = EDIT_empty_copy(NULL) ; /* default dataset */
00072
00073 /* set prefix from input filename */
00074
00075 STATUS("setting prefix") ;
00076
00077 ppp = THD_trailname(pathname,0) ; /* strip directory */
00078 NI_strncpy( prefix , ppp , THD_MAX_PREFIX ) ; /* to make prefix */
00079
00080 /* set grid sizes from element header */
00081
00082 STATUS("setting grid sizes") ;
00083
00084 nxyz.ijk[0] = nel->vec_len ; nxyz.ijk[1] = nxyz.ijk[2] = 1 ;
00085 if( nel->vec_axis_len != NULL ){
00086 if( nel->vec_rank >= 1 ) nxyz.ijk[0] = nel->vec_axis_len[0] ;
00087 if( nel->vec_rank >= 2 ) nxyz.ijk[1] = nel->vec_axis_len[1] ;
00088 if( nel->vec_rank >= 3 ) nxyz.ijk[2] = nel->vec_axis_len[2] ;
00089 }
00090
00091 /* set grid spacings */
00092
00093 STATUS("setting grid spacings") ;
00094
00095 dxyz.xyz[0] = dxyz.xyz[1] = dxyz.xyz[2] = 1.0 ;
00096 if( nel->vec_axis_delta != NULL ){
00097 if( nel->vec_rank >= 1) dxyz.xyz[0] = nel->vec_axis_delta[0] ;
00098 if( nel->vec_rank >= 2) dxyz.xyz[1] = nel->vec_axis_delta[1] ;
00099 if( nel->vec_rank >= 3) dxyz.xyz[2] = nel->vec_axis_delta[2] ;
00100 }
00101
00102 /* set grid origins */
00103
00104 STATUS("setting grid origins") ;
00105
00106 orgxyz.xyz[0] = orgxyz.xyz[1] = orgxyz.xyz[2] = 0.0 ;
00107 if( nel->vec_axis_origin != NULL ){
00108 if( nel->vec_rank >= 1) orgxyz.xyz[0] = nel->vec_axis_origin[0] ;
00109 if( nel->vec_rank >= 2) orgxyz.xyz[1] = nel->vec_axis_origin[1] ;
00110 if( nel->vec_rank >= 3) orgxyz.xyz[2] = nel->vec_axis_origin[2] ;
00111 }
00112
00113 /* set grid orientations (default is RAI) */
00114
00115 STATUS("setting grid orientation") ;
00116
00117 { char orcx='R', orcy='A', orcz='I' ;
00118 int oxx,oyy,ozz ;
00119 if( nel->vec_rank == 3 && nel->vec_axis_label != NULL ){
00120 orcx = toupper(nel->vec_axis_label[0][0]) ;
00121 orcy = toupper(nel->vec_axis_label[1][0]) ;
00122 orcz = toupper(nel->vec_axis_label[2][0]) ;
00123 }
00124 oxx = ORCODE(orcx); oyy = ORCODE(orcy); ozz = ORCODE(orcz);
00125 if( !OR3OK(oxx,oyy,ozz) ){
00126 oxx = ORI_R2L_TYPE; oyy = ORI_A2P_TYPE; ozz = ORI_I2S_TYPE;
00127 }
00128
00129 orixyz.ijk[0] = oxx ; orixyz.ijk[1] = oyy ; orixyz.ijk[2] = ozz ;
00130 }
00131
00132 /* number of sub-bricks (one per vector/column) */
00133
00134 nvals = nel->vec_num ;
00135
00136 /* set idcode from element, or take random default one */
00137
00138 STATUS("setting idcode") ;
00139
00140 ppp = NI_get_attribute( nel , "self_idcode" ) ;
00141 if( ppp == NULL )
00142 ppp = NI_get_attribute( nel , "ni_idcode" ) ;
00143 if( ppp != NULL && *ppp != '\0' ){
00144 NI_strncpy( dset->idcode.str , ppp , MCW_IDSIZE ) ;
00145 } else {
00146 MCW_hash_idcode( pathname , dset ) ; /* 06 May 2005 */
00147 dset->idcode.str[0] = 'A' ; /* overwrite 1st 3 bytes of idcode */
00148 dset->idcode.str[1] = '3' ;
00149 dset->idcode.str[2] = 'D' ;
00150 }
00151
00152 /*-- now modify the default dataset --*/
00153
00154 STATUS("Editing dataset") ;
00155
00156 EDIT_dset_items( dset ,
00157 ADN_prefix , prefix ,
00158 ADN_datum_array , nel->vec_typ ,
00159 ADN_nxyz , nxyz ,
00160 ADN_xyzdel , dxyz ,
00161 ADN_xyzorg , orgxyz ,
00162 ADN_xyzorient , orixyz ,
00163 ADN_malloc_type , DATABLOCK_MEM_MALLOC ,
00164 ADN_nvals , nvals ,
00165 ADN_type , HEAD_ANAT_TYPE ,
00166 ADN_func_type , ANAT_BUCK_TYPE ,
00167 ADN_none ) ;
00168
00169 dset->dblk->diskptr->storage_mode = STORAGE_BY_3D ;
00170 NI_strncpy( dset->dblk->diskptr->brick_name , pathname , THD_MAX_NAME ) ;
00171
00172 /*-- time axis? [03 Jun 2005] --*/
00173
00174 ppp = NI_get_attribute( nel , "ni_timestep" ) ;
00175 if( ppp != NULL && nvals > 1 ){
00176 float dt = strtod(ppp,NULL) ; if( dt <= 0.0 ) dt = 1.0 ;
00177 EDIT_dset_items( dset ,
00178 ADN_func_type , ANAT_EPI_TYPE ,
00179 ADN_ntt , nvals ,
00180 ADN_ttdel , dt ,
00181 ADN_tunits , UNITS_SEC_TYPE ,
00182 ADN_none ) ;
00183 }
00184
00185 STATUS("checking for statistics") ;
00186
00187 /*-- see if we have any statistics bricks --*/
00188
00189 ppp = NI_get_attribute( nel , "ni_stat" ) ;
00190 if( ppp != NULL ){
00191 NI_str_array *sar = NI_decode_string_list( ppp , ";" ) ;
00192 if( sar != NULL ){
00193 int itop=MIN(sar->num,nvals) , jj,ll ;
00194 char *dnam , qnam[64] ;
00195 for( ii=0 ; ii < itop ; ii++ ){
00196 if( strcmp(sar->str[ii],"none") == 0 ) continue ;
00197 for( jj=NI_STAT_FIRSTCODE ; jj <= NI_STAT_LASTCODE ; jj++ ){
00198 dnam = NI_stat_distname(jj) ;
00199 strcpy(qnam,dnam); strcat(qnam,"("); ll = strlen(qnam);
00200 if( strncmp(sar->str[ii],qnam,ll) == 0 ) break ;
00201 }
00202 if( jj >= AFNI_FIRST_STATCODE && jj <= AFNI_LAST_STATCODE ){
00203 float parm[4]={1,1,1,1} ; int np,kk,mm , sp ;
00204 np = NI_stat_numparam(jj) ; sp = ll ;
00205 for( kk=0 ; kk < np ; kk++ ){
00206 mm = 0 ; sscanf(sar->str[ii]+sp,"%f%n",parm+kk,&mm) ; sp += mm+1 ;
00207 }
00208 EDIT_STATAUX4( dset , ii , jj , parm[0],parm[1],parm[2],parm[3] ) ;
00209 }
00210 }
00211 NI_delete_str_array(sar) ;
00212 }
00213 }
00214
00215 /*-- purge the NIML data element and return the new dataset --*/
00216
00217 STATUS("freeing element") ;
00218
00219 NI_free_element( nel ) ;
00220 RETURN(dset) ;
00221 }
|
|
||||||||||||
|
Mark a dataset's storage mode. ------------------------------------------------------------------- Definition at line 227 of file thd_3Ddset.c. References THD_3dim_dataset::dblk, THD_datablock::diskptr, ISVALID_DSET, LAST_STORAGE_MODE, and THD_diskptr::storage_mode.
00228 {
00229 if( !ISVALID_DSET(dset) ||
00230 mm < 0 ||
00231 mm > LAST_STORAGE_MODE ||
00232 dset->dblk == NULL ||
00233 dset->dblk->diskptr == NULL ) return ;
00234
00235 dset->dblk->diskptr->storage_mode = mm ;
00236 }
|
|
||||||||||||||||
|
Write a dataset to disk as a 3D file. Called from THD_write_3dim_dataset(). This is kind of cheating, since we just call THD_write_1D() instead. -------------------------------------------------------------------- Definition at line 324 of file thd_3Ddset.c. References THD_write_1D(). Referenced by THD_write_3dim_dataset().
00325 {
00326 THD_write_1D( sname,pname,dset ) ;
00327 }
|