00001 #include "mrilib.h"
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 THD_3dim_dataset * THD_open_1D( char *pathname )
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
00026
00027 if( pathname == NULL || pathname[0] == '\0' ) RETURN(NULL);
00028
00029
00030
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") ;
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
00057
00058 lpn = strlen(pathname) ; pn = strdup(pathname) ;
00059
00060 flip = (pn[lpn-1] == '\'') ;
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
00072
00073 dset = EDIT_empty_copy(NULL) ;
00074
00075 ppp = THD_trailname(pn,0) ;
00076 MCW_strncpy( prefix , ppp , THD_MAX_PREFIX ) ;
00077 ppp = strchr( prefix , '[' ) ;
00078 if( ppp != NULL ) *ppp = '\0' ;
00079
00080 nxyz.ijk[0] = flim->nx ; dxyz.xyz[0] = 1.0 ;
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 ;
00085 orgxyz.xyz[1] = 0.0 ;
00086 orgxyz.xyz[2] = 0.0 ;
00087
00088 nvals = flim->ny ;
00089
00090 MCW_hash_idcode( pathname , dset ) ;
00091 dset->idcode.str[0] = 'A' ;
00092 dset->idcode.str[1] = '1' ;
00093 dset->idcode.str[2] = 'D' ;
00094
00095
00096
00097
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") ){
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 ,
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
00130
00131 mri_free(flim) ; free(pn) ; RETURN(dset) ;
00132 }
00133
00134
00135
00136
00137
00138
00139 void THD_load_1D( THD_datablock *dblk )
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
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] == '\'') ;
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
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
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
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
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 }
00220
00221
00222
00223
00224
00225
00226 void THD_write_1D( char *sname, char *pname , THD_3dim_dataset *dset )
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) ;
00238 nx = DSET_NX(dset) ;
00239 ny = DSET_NY(dset) ;
00240 nz = DSET_NZ(dset) ; nxyz = nx*ny*nz ;
00241
00242
00243
00244 cpt = DSET_PREFIX(dset) ;
00245 if( (pname != NULL && *pname == '-') ||
00246 (pname == NULL && *cpt == '-') ){
00247 fp = stdout ; strcpy(fname,"stdout") ; binflag = 0 ;
00248 }
00249
00250 if( fp == NULL ){
00251 if( pname != NULL ){
00252 if( sname != NULL ){
00253 strcpy(fname,sname) ;
00254 ii = strlen(fname) ; if( fname[ii-1] != '/' ) strcat(fname,"/") ;
00255 } else {
00256 strcpy(fname,"./") ;
00257 }
00258 strcat(fname,pname) ;
00259 } else {
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' ;
00268 }
00269 ii = strlen(fname) ;
00270 if( ii > 10 && strstr(fname,".BRIK") != NULL ){
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");
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 );
00283
00284
00285
00286 shp = (binflag) ? ' ' : '#' ;
00287
00288
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"
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
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
00347
00348 if( fp != stdout ){
00349 if( binflag ) fprintf(fp," >") ;
00350 else fprintf(fp,"# >\n") ;
00351 fflush(fp) ;
00352 }
00353
00354
00355
00356 for( ii=0 ; ii < nxyz ; ii++ ){
00357
00358 for( iv=0 ; iv < nv ; iv++ ){
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
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 }
00397
00398 if( binflag ) fwrite( val , sizeof(float) , 1 , fp ) ;
00399 else fprintf( fp , " %g" , val[0] ) ;
00400
00401 }
00402
00403 if( !binflag ) fprintf(fp,"\n") ;
00404
00405 }
00406
00407
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 }