Doxygen Source Code Documentation
thd_1Ddset.c File Reference
#include "mrilib.h"Go to the source code of this file.
Functions | |
| THD_3dim_dataset * | THD_open_1D (char *pathname) |
| void | THD_load_1D (THD_datablock *dblk) |
| void | THD_write_1D (char *sname, char *pname, THD_3dim_dataset *dset) |
Function Documentation
|
|
Load a 1D dataset's data into memory. Called from THD_load_datablock() in thd_loaddblk.c. ------------------------------------------------------------------- Definition at line 139 of file thd_1Ddset.c. References AFMALL, THD_datablock::brick, THD_diskptr::brick_name, DATABLOCK_MEM_MALLOC, DBLK_ARRAY, DBLK_BRICK, DBLK_BRICK_BYTES, THD_diskptr::dimsizes, THD_datablock::diskptr, ENTRY, flip(), free, ISVALID_DATABLOCK, THD_datablock::malloc_type, mri_fix_data_pointer(), MRI_FLOAT_PTR, mri_free(), mri_read_1D(), mri_transpose(), THD_diskptr::nvals, MRI_IMAGE::nx, MRI_IMAGE::ny, STORAGE_BY_1D, and THD_diskptr::storage_mode. Referenced by THD_load_datablock().
00140 {
00141 THD_diskptr *dkptr ;
00142 MRI_IMAGE *flim ;
00143 int nxyz , nbad,iv,nv ;
00144 float *bar , *flar ;
00145 char *pn ; int lpn , flip=0 ;
00146
00147 ENTRY("THD_load_1D") ;
00148
00149 /*-- open input [these errors should never occur] --*/
00150
00151 if( !ISVALID_DATABLOCK(dblk) ||
00152 dblk->diskptr->storage_mode != STORAGE_BY_1D ||
00153 dblk->brick == NULL ) EXRETURN ;
00154
00155 dkptr = dblk->diskptr ;
00156 nxyz = dkptr->dimsizes[0] ;
00157 nv = dkptr->nvals ;
00158
00159 if( nxyz*nv > 1000000 ) fprintf(stderr,"++ Reading %s\n",dkptr->brick_name) ;
00160
00161 pn = strdup(dkptr->brick_name) ; lpn = strlen(pn) ;
00162 flip = (pn[lpn-1] == '\'') ; /* 12 Jul 2005: allow for tranposing input */
00163 if( flip ) pn[lpn-1] = '\0' ;
00164
00165 flim = mri_read_1D(pn) ; free(pn) ;
00166
00167 if( flim == NULL ){
00168 fprintf(stderr,"** THD_load_1D(%s): can't read file!\n",dkptr->brick_name) ;
00169 EXRETURN ;
00170 }
00171 if( flip ){
00172 MRI_IMAGE *qim = mri_transpose(flim); mri_free(flim); flim = qim;
00173 }
00174
00175 /*-- allocate space for data --*/
00176
00177 if( nxyz != flim->nx || nv != flim->ny ){
00178 fprintf(stderr,"** THD_load_1D(%s): nx or ny mismatch!\n",dkptr->brick_name) ;
00179 fprintf(stderr,"** expect nx=%d; got nx=%d\n",nxyz,flim->nx) ;
00180 fprintf(stderr,"** expect ny=%d; got ny=%d\n",nv ,flim->ny) ;
00181 mri_free(flim) ; EXRETURN ;
00182 }
00183
00184 dblk->malloc_type = DATABLOCK_MEM_MALLOC ;
00185
00186 /** malloc space for each brick separately **/
00187
00188 for( nbad=iv=0 ; iv < nv ; iv++ ){
00189 if( DBLK_ARRAY(dblk,iv) == NULL ){
00190 bar = AFMALL( float, DBLK_BRICK_BYTES(dblk,iv) ) ;
00191 mri_fix_data_pointer( bar , DBLK_BRICK(dblk,iv) ) ;
00192 if( bar == NULL ) nbad++ ;
00193 }
00194 }
00195
00196 /** if couldn't get them all, take our ball and go home in a snit **/
00197
00198 if( nbad > 0 ){
00199 fprintf(stderr,"\n** failed to malloc %d 1D bricks out of %d\n\a",nbad,nv) ;
00200 for( iv=0 ; iv < nv ; iv++ ){
00201 if( DBLK_ARRAY(dblk,iv) != NULL ){
00202 free(DBLK_ARRAY(dblk,iv)) ;
00203 mri_fix_data_pointer( NULL , DBLK_BRICK(dblk,iv) ) ;
00204 }
00205 }
00206 mri_free(flim) ; EXRETURN ;
00207 }
00208
00209 /** copy data from image to bricks **/
00210
00211 flar = MRI_FLOAT_PTR(flim) ;
00212
00213 for( iv=0 ; iv < nv ; iv++ ){
00214 bar = DBLK_ARRAY(dblk,iv) ;
00215 memcpy( bar , flar + iv*nxyz , sizeof(float)*nxyz ) ;
00216 }
00217
00218 mri_free(flim) ; EXRETURN ;
00219 }
|
|
|
Open a 1D file as an AFNI dataset. Each column is a separate sub-brick. Ignore comments at this time. Data is not loaded into bricks. ------------------------------------------------------------------- Definition at line 13 of file thd_1Ddset.c. References ADN_datum_all, ADN_func_type, ADN_malloc_type, ADN_none, ADN_ntt, ADN_nvals, ADN_nxyz, ADN_prefix, ADN_ttdel, ADN_ttdur, ADN_ttorg, ADN_tunits, ADN_type, ADN_xyzdel, ADN_xyzorg, AFNI_yesenv(), ANAT_BUCK_TYPE, ANAT_EPI_TYPE, THD_diskptr::brick_name, DATABLOCK_MEM_MALLOC, THD_3dim_dataset::dblk, THD_datablock::diskptr, dt, EDIT_dset_items(), EDIT_empty_copy(), ENTRY, flip(), free, getenv(), HEAD_ANAT_TYPE, THD_3dim_dataset::idcode, THD_ivec3::ijk, MCW_hash_idcode(), MCW_strncpy, mri_free(), mri_read_1D(), mri_transpose(), MRI_IMAGE::nx, MRI_IMAGE::ny, RETURN, STORAGE_BY_1D, THD_diskptr::storage_mode, MCW_idcode::str, strtod(), THD_MAX_PREFIX, THD_open_3D(), THD_trailname(), UNITS_SEC_TYPE, and THD_fvec3::xyz. Referenced by THD_open_dataset(), and THD_open_one_dataset().
00014 {
00015 THD_3dim_dataset *dset=NULL ;
00016 MRI_IMAGE *flim ;
00017 char prefix[1024] , *ppp , tname[12] , *pn ;
00018 THD_ivec3 nxyz ;
00019 THD_fvec3 dxyz , orgxyz ;
00020 int nvals , lpn , flip=0 ;
00021 FILE *fp ;
00022
00023 ENTRY("THD_open_1D") ;
00024
00025 /*-- open input file --*/
00026
00027 if( pathname == NULL || pathname[0] == '\0' ) RETURN(NULL);
00028
00029 /*-- check if it is a NIML-ish AFNI dataset;
00030 if so, read it in that way instead of the 1D way [21 Mar 2003] --*/
00031
00032 if( strchr(pathname,'[') == NULL &&
00033 strchr(pathname,'{') == NULL && strchr(pathname,'\'') == NULL ){
00034
00035 pn = strdup(pathname) ; fp = fopen(pn,"r") ;
00036
00037 if( fp == NULL ){
00038 char *p1 = strstr(pn,"1D") ; /* if can't open .1D, try .3D */
00039 if( p1 != NULL ){
00040 *p1 = '3' ; fp = fopen(pn,"r") ;
00041 }
00042 if( fp == NULL ){
00043 fprintf(stderr,"** THD_open_1D(%s): can't open file\n",pathname);
00044 free(pn); RETURN(NULL);
00045 }
00046 }
00047 memset(prefix,0,133) ; fread(prefix,1,128,fp) ; fclose(fp) ;
00048 if( strstr(prefix,"<AFNI_") != NULL && strstr(prefix,"dataset") != NULL ){
00049 dset = THD_open_3D(pn) ;
00050 if( dset != NULL && strcmp(pathname,pn) != 0 )
00051 fprintf(stderr,"** THD_open_1D(%s): substituted %s\n",pathname,pn) ;
00052 free(pn) ; return dset ;
00053 }
00054 }
00055
00056 /*-- otherwise, read it into an MRI_IMAGE, then mangle image into dataset --*/
00057
00058 lpn = strlen(pathname) ; pn = strdup(pathname) ;
00059
00060 flip = (pn[lpn-1] == '\'') ; /* 12 Jul 2005: allow for tranposing input */
00061 if( flip ) pn[lpn-1] = '\0' ;
00062
00063 flim = mri_read_1D(pn) ;
00064 if( flim == NULL ){
00065 fprintf(stderr,"** Can't read 1D dataset file %s\n",pn); free(pn); RETURN(NULL);
00066 }
00067 if( flip ){
00068 MRI_IMAGE *qim = mri_transpose(flim); mri_free(flim); flim = qim;
00069 }
00070
00071 /*-- make a dataset --*/
00072
00073 dset = EDIT_empty_copy(NULL) ; /* default (useless) dataset */
00074
00075 ppp = THD_trailname(pn,0) ; /* strip directory */
00076 MCW_strncpy( prefix , ppp , THD_MAX_PREFIX ) ; /* to make prefix */
00077 ppp = strchr( prefix , '[' ) ;
00078 if( ppp != NULL ) *ppp = '\0' ;
00079
00080 nxyz.ijk[0] = flim->nx ; dxyz.xyz[0] = 1.0 ; /* setup axes */
00081 nxyz.ijk[1] = 1 ; dxyz.xyz[1] = 1.0 ;
00082 nxyz.ijk[2] = 1 ; dxyz.xyz[2] = 1.0 ;
00083
00084 orgxyz.xyz[0] = 0.0 ; /* arbitrary origin */
00085 orgxyz.xyz[1] = 0.0 ;
00086 orgxyz.xyz[2] = 0.0 ;
00087
00088 nvals = flim->ny ; /* number of sub-bricks */
00089
00090 MCW_hash_idcode( pathname , dset ) ; /* 06 May 2005 */
00091 dset->idcode.str[0] = 'A' ; /* overwrite 1st 3 bytes of IDcode */
00092 dset->idcode.str[1] = '1' ;
00093 dset->idcode.str[2] = 'D' ;
00094
00095 /* note we accept default orientation (RAI) here
00096 (no use of ADN_xyzorient), since we actually
00097 don't have any spatial structure to speak of */
00098
00099 EDIT_dset_items( dset ,
00100 ADN_prefix , prefix ,
00101 ADN_datum_all , MRI_float ,
00102 ADN_nxyz , nxyz ,
00103 ADN_xyzdel , dxyz ,
00104 ADN_xyzorg , orgxyz ,
00105 ADN_malloc_type , DATABLOCK_MEM_MALLOC ,
00106 ADN_nvals , nvals ,
00107 ADN_type , HEAD_ANAT_TYPE ,
00108 ADN_func_type , ANAT_BUCK_TYPE ,
00109 ADN_none ) ;
00110
00111 if( nvals > 1 && AFNI_yesenv("AFNI_1D_TIME") ){ /* pretend it is 3D+time */
00112 char *eee = getenv("AFNI_1D_TIME_TR") ;
00113 float dt = 0.0 ;
00114 if( eee != NULL ) dt = strtod(eee,NULL) ;
00115 if( dt <= 0.0 ) dt = 1.0 ;
00116 EDIT_dset_items( dset ,
00117 ADN_func_type, ANAT_EPI_TYPE ,
00118 ADN_ntt , nvals ,
00119 ADN_ttorg , 0.0 ,
00120 ADN_ttdel , dt , /* TR */
00121 ADN_ttdur , 0.0 ,
00122 ADN_tunits , UNITS_SEC_TYPE ,
00123 ADN_none ) ;
00124 }
00125
00126 dset->dblk->diskptr->storage_mode = STORAGE_BY_1D ;
00127 strcpy( dset->dblk->diskptr->brick_name , pathname ) ;
00128
00129 /*-- purge image data and return the empty dataset */
00130
00131 mri_free(flim) ; free(pn) ; RETURN(dset) ;
00132 }
|
|
||||||||||||||||
|
Write a dataset to disk as a 1D file. Called from THD_write_3dim_dataset(). -------------------------------------------------------------------- Definition at line 226 of file thd_1Ddset.c. References AFNI_yesenv(), THD_diskptr::brick_name, CABS, THD_3dim_dataset::daxes, THD_3dim_dataset::dblk, THD_datablock::diskptr, DSET_ARRAY, DSET_BRICK_FACTOR, DSET_BRICK_STATCODE, DSET_BRICK_STATPAR, DSET_BRICK_TYPE, DSET_BRIKNAME, DSET_DX, DSET_DY, DSET_DZ, DSET_IS_1D, DSET_LOADED, DSET_NVALS, DSET_NX, DSET_NY, DSET_NZ, DSET_PREFIX, DSET_TIMEUNITS, DSET_TR, DSET_XORG, DSET_YORG, DSET_ZORG, dt, ENTRY, rgbyte::g, HAS_TIMEAXIS, THD_3dim_dataset::idcode, ISVALID_DSET, NI_byteorder(), NI_LSB_FIRST, NI_stat_distname(), NI_stat_numparam(), nz, rgbyte::r, MCW_idcode::str, STRING_HAS_SUFFIX, THD_MAX_NAME, UNITS_MSEC_TYPE, THD_dataxes::xxorient, THD_dataxes::yyorient, and THD_dataxes::zzorient. Referenced by THD_write_3D(), and THD_write_3dim_dataset().
00227 {
00228 char fname[THD_MAX_NAME] , *cpt ;
00229 int iv,nv , nx,ny,nz,nxyz,ii,jj,kk ;
00230 FILE *fp=NULL ;
00231 int binflag ; char shp ; float val[1] ;
00232
00233 ENTRY("THD_write_1D") ;
00234
00235 if( !ISVALID_DSET(dset) || !DSET_LOADED(dset) ) EXRETURN ;
00236
00237 nv = DSET_NVALS(dset) ; /* number of columns */
00238 nx = DSET_NX(dset) ;
00239 ny = DSET_NY(dset) ;
00240 nz = DSET_NZ(dset) ; nxyz = nx*ny*nz ; /* number of rows */
00241
00242 /* make up a filename for output (into fname) */
00243
00244 cpt = DSET_PREFIX(dset) ;
00245 if( (pname != NULL && *pname == '-') ||
00246 (pname == NULL && *cpt == '-') ){ /* 12 Jul 2005: to stdout */
00247 fp = stdout ; strcpy(fname,"stdout") ; binflag = 0 ;
00248 }
00249
00250 if( fp == NULL ){
00251 if( pname != NULL ){ /* have input prefix */
00252 if( sname != NULL ){ /* and input session (directory) */
00253 strcpy(fname,sname) ;
00254 ii = strlen(fname) ; if( fname[ii-1] != '/' ) strcat(fname,"/") ;
00255 } else {
00256 strcpy(fname,"./") ; /* don't have input session */
00257 }
00258 strcat(fname,pname) ;
00259 } else { /* don't have input prefix */
00260 cpt = DSET_PREFIX(dset) ;
00261 if( STRING_HAS_SUFFIX(cpt,".3D") || STRING_HAS_SUFFIX(cpt,".1D") )
00262 strcpy(fname,cpt) ;
00263 else
00264 strcpy(fname,DSET_BRIKNAME(dset)) ;
00265
00266 cpt = strchr(fname,'[') ;
00267 if( cpt != NULL ) *cpt = '\0' ; /* without subscripts! */
00268 }
00269 ii = strlen(fname) ;
00270 if( ii > 10 && strstr(fname,".BRIK") != NULL ){ /* delete .BRIK! */
00271 fname[ii-10] = '\0' ;
00272 if( DSET_IS_1D(dset) || (ny==1 && nz==1) )
00273 strcat(fname,".1D");
00274 else
00275 strcat(fname,".3D"); /* 21 Mar 2003 */
00276 }
00277
00278 fp = fopen( fname , "w" ) ; if( fp == NULL ) EXRETURN ;
00279 binflag = STRING_HAS_SUFFIX(fname,".3D") && AFNI_yesenv("AFNI_3D_BINARY") ;
00280 }
00281
00282 strcpy( dset->dblk->diskptr->brick_name , fname ); /* 12 Jul 2005 */
00283
00284 /* are we going to write in binary? [03 Jun 2005] */
00285
00286 shp = (binflag) ? ' ' : '#' ;
00287
00288 /* write some dataset info as NIML-style header/comments */
00289
00290 if( fp != stdout )
00291 fprintf(fp,
00292 "%c <AFNI_3D_dataset\n"
00293 "%c self_idcode = \"%s\"\n"
00294 "%c ni_type = \"%d*float\"\n" /* all columns are floats! */
00295 "%c ni_dimen = \"%d,%d,%d\"\n"
00296 "%c ni_delta = \"%g,%g,%g\"\n"
00297 "%c ni_origin = \"%g,%g,%g\"\n"
00298 "%c ni_axes = \"%s,%s,%s\"\n"
00299 ,
00300 shp ,
00301 shp , dset->idcode.str ,
00302 shp , nv ,
00303 shp , nx,ny,nz ,
00304 shp , DSET_DX(dset) , DSET_DY(dset) , DSET_DZ(dset) ,
00305 shp , DSET_XORG(dset), DSET_YORG(dset), DSET_ZORG(dset),
00306 shp , ORIENT_shortstr[dset->daxes->xxorient] ,
00307 ORIENT_shortstr[dset->daxes->yyorient] ,
00308 ORIENT_shortstr[dset->daxes->zzorient]
00309 ) ;
00310
00311 if( fp != stdout && HAS_TIMEAXIS(dset) ){
00312 float dt = DSET_TR(dset) ;
00313 if( DSET_TIMEUNITS(dset) == UNITS_MSEC_TYPE ) dt *= 0.001 ;
00314 fprintf(fp , "%c ni_timestep = \"%g\"\n" , shp,dt ) ;
00315 }
00316
00317 if( fp != stdout && binflag )
00318 fprintf(fp , " ni_form = \"binary.%s\"\n" ,
00319 (NI_byteorder()==NI_LSB_FIRST) ? "lsbfirst" : "msbfirst" ) ;
00320
00321 /* do stataux for bricks, if any are present */
00322
00323 for( ii=iv=0 ; iv < nv ; iv++ )
00324 if( DSET_BRICK_STATCODE(dset,iv) > 0 ) ii++ ;
00325
00326 if( fp != stdout && ii > 0 ){
00327 fprintf(fp, "%c ni_stat = \"",shp) ;
00328 for( iv=0 ; iv < nv ; iv++ ){
00329 ii = DSET_BRICK_STATCODE(dset,iv) ;
00330 if( ii <=0 ){
00331 fprintf(fp,"none") ;
00332 } else {
00333 fprintf(fp,"%s(",NI_stat_distname(ii)) ;
00334 kk = NI_stat_numparam(ii) ;
00335 for( jj=0 ; jj < kk ; jj++ ){
00336 fprintf(fp,"%g",DSET_BRICK_STATPAR(dset,iv,jj)) ;
00337 if( jj < kk-1 ) fprintf(fp,",") ;
00338 }
00339 fprintf(fp,")") ;
00340 }
00341 if( ii < nv-1 ) fprintf(fp,";") ;
00342 }
00343 fprintf(fp,"\"\n") ;
00344 }
00345
00346 /* close NIML-style header */
00347
00348 if( fp != stdout ){
00349 if( binflag ) fprintf(fp," >") ;
00350 else fprintf(fp,"# >\n") ;
00351 fflush(fp) ;
00352 }
00353
00354 /* now write data */
00355
00356 for( ii=0 ; ii < nxyz ; ii++ ){ /* loop over voxels */
00357
00358 for( iv=0 ; iv < nv ; iv++ ){ /* loop over sub-bricks = columns */
00359 switch( DSET_BRICK_TYPE(dset,iv) ){
00360 default:
00361 val[0] = 0.0f ;
00362 break ;
00363
00364 case MRI_float:{
00365 float *bar = DSET_ARRAY(dset,iv) ; val[0] = bar[ii] ;
00366 }
00367 break ;
00368
00369 case MRI_short:{
00370 short *bar = DSET_ARRAY(dset,iv) ;
00371 float fac = DSET_BRICK_FACTOR(dset,iv) ; if( fac == 0.0 ) fac = 1.0 ;
00372 val[0] = fac*bar[ii] ;
00373 }
00374 break ;
00375
00376 case MRI_byte:{
00377 byte *bar = DSET_ARRAY(dset,iv) ;
00378 float fac = DSET_BRICK_FACTOR(dset,iv) ; if( fac == 0.0 ) fac = 1.0 ;
00379 val[0] = fac*bar[ii] ;
00380 }
00381 break ;
00382
00383 /* below here, we convert complicated types to floats, losing data! */
00384
00385 case MRI_complex:{
00386 complex *bar = DSET_ARRAY(dset,iv) ;
00387 val[0] = CABS(bar[ii]) ;
00388 }
00389 break ;
00390
00391 case MRI_rgb:{
00392 rgbyte *bar = DSET_ARRAY(dset,iv) ;
00393 val[0] = (0.299*bar[ii].r+0.587*bar[ii].g+0.114*bar[ii].g) ;
00394 }
00395 break ;
00396 } /* end of switch on sub-brick data type */
00397
00398 if( binflag ) fwrite( val , sizeof(float) , 1 , fp ) ;
00399 else fprintf( fp , " %g" , val[0] ) ;
00400
00401 } /* end of loop over sub-bricks */
00402
00403 if( !binflag ) fprintf(fp,"\n") ;
00404
00405 } /* end of loop over voxels */
00406
00407 /* NIML-style trailer */
00408
00409 fflush(fp) ;
00410
00411 if( fp != stdout ){
00412 fprintf(fp,"%c </AFNI_3D_dataset>\n",shp) ;
00413 fclose(fp) ;
00414 }
00415
00416 EXRETURN ;
00417 }
|