Doxygen Source Code Documentation
thd_mincread.c File Reference
#include "mrilib.h"
#include "netcdf.h"
Go to the source code of this file.
Data Structures | |
struct | mincdim |
Defines | |
#define | EPR(x, s1, s2) |
Functions | |
mincdim | read_mincdim (int ncid, char *dname) |
THD_3dim_dataset * | THD_open_minc (char *pathname) |
void | THD_load_minc (THD_datablock *dblk) |
Variables | |
int | first_err = 1 |
char * | fname_err |
Define Documentation
|
Value: do{ if( first_err ){ fprintf(stderr,"\n"); first_err=0; } \ fprintf(stderr,"** NetCDF error [%s,%s]: %s\n",s1,s2,nc_strerror(x)); \ } while(0) Definition at line 11 of file thd_mincread.c. |
Function Documentation
|
Definition at line 27 of file thd_mincread.c. References AFREALL, mincdim::dimid, EPR, first_err, fname_err, mincdim::good, mincdim::len, nc_get_att_float(), nc_get_att_text(), nc_inq_attlen(), nc_inq_dimid(), nc_inq_dimlen(), nc_inq_varid(), mincdim::spacetype, mincdim::start, mincdim::step, mincdim::varid, mincdim::xcos, mincdim::ycos, and mincdim::zcos. Referenced by THD_open_minc().
00028 { 00029 mincdim ddd ; 00030 int code ; 00031 float ccc[3] ; 00032 size_t lll ; 00033 static char *ename=NULL ; 00034 00035 ddd.good = 0 ; /* flag for bad result */ 00036 00037 ddd.step = 1.0 ; /* defaults */ 00038 ddd.xcos = ddd.ycos = ddd.zcos = 0.0 ; 00039 ddd.spacetype[0] = '\0' ; 00040 00041 lll = strlen(fname_err) + strlen(dname) + 4 ; 00042 ename = AFREALL(ename, char, lll) ; 00043 sprintf(ename,"%s:%s",fname_err,dname) ; 00044 00045 /* get ID of this dimension name */ 00046 00047 code = nc_inq_dimid( ncid , dname , &ddd.dimid ) ; 00048 if( code != NC_NOERR ){ EPR(code,ename,"dimid"); return ddd; } 00049 00050 /* get length of this dimension */ 00051 00052 code = nc_inq_dimlen( ncid , ddd.dimid , &ddd.len ) ; 00053 if( code != NC_NOERR ){ EPR(code,ename,"dimlen"); return ddd; } 00054 00055 /* get ID of corresponding variable */ 00056 00057 code = nc_inq_varid( ncid , dname , &ddd.varid ) ; 00058 if( code != NC_NOERR ){ /* this is bad: try to fake it */ 00059 if( first_err ){ fprintf(stderr,"\n"); first_err=0; } 00060 fprintf(stderr,"** MINC warning: %s variable missing\n",ename); 00061 ddd.start = -0.5*ddd.step*ddd.len ; 00062 ddd.good = 1 ; return ddd ; 00063 } 00064 00065 /* get step attribute of this variable */ 00066 00067 code = nc_get_att_float( ncid , ddd.varid , "step" , &ddd.step ) ; 00068 if( code != NC_NOERR ){ 00069 if( first_err ){ fprintf(stderr,"\n"); first_err=0; } 00070 fprintf(stderr,"** MINC warning: %s:step missing\n",ename); 00071 } else if( ddd.step == 0.0 ){ 00072 if( first_err ){ fprintf(stderr,"\n"); first_err=0; } 00073 fprintf(stderr,"** MINC warning: %s:step=0\n",ename); 00074 ddd.step = 1.0 ; 00075 } 00076 00077 /* get start attribute of this variable */ 00078 00079 code = nc_get_att_float( ncid , ddd.varid , "start" , &ddd.start ) ; 00080 if( code != NC_NOERR ){ 00081 if( first_err ){ fprintf(stderr,"\n"); first_err=0; } 00082 fprintf(stderr,"** MINC warning: %s:start missing\n",ename) ; 00083 ddd.start = -0.5*ddd.step*ddd.len ; 00084 } 00085 00086 /* get direction_cosines attribute of this variable [not used yet] */ 00087 00088 code = nc_get_att_float( ncid,ddd.varid , "direction_cosines" , ccc ) ; 00089 if( code == NC_NOERR ){ 00090 ddd.xcos = ccc[0] ; ddd.ycos = ccc[1] ; ddd.zcos = ccc[2] ; 00091 } 00092 00093 /* get spacetype attribute of this variable [Talairach or not?] */ 00094 00095 lll = 0 ; 00096 code = nc_inq_attlen( ncid , ddd.varid , "spacetype" , &lll ) ; 00097 if( code == NC_NOERR && lll > 0 && lll < 32 ){ 00098 code = nc_get_att_text( ncid,ddd.varid , "spacetype" , ddd.spacetype ) ; 00099 if( code == NC_NOERR ){ 00100 ddd.spacetype[lll] = '\0' ; /* make sure ends in NUL */ 00101 } else { 00102 ddd.spacetype[0] = '\0' ; /* make sure is empty */ 00103 } 00104 } 00105 00106 ddd.good = 1 ; return ddd ; 00107 } |
|
Definition at line 350 of file thd_mincread.c. References AFMALL, AFNI_noenv(), THD_datablock::brick, THD_diskptr::brick_name, calloc, DATABLOCK_MEM_MALLOC, DBLK_ARRAY, DBLK_BRICK, DBLK_BRICK_BYTES, DBLK_BRICK_TYPE, THD_diskptr::dimsizes, THD_datablock::diskptr, ENTRY, EPR, free, ISVALID_DATABLOCK, THD_datablock::malloc_type, MAX, mri_fix_data_pointer(), MRI_IS_INT_TYPE, nc_close(), nc_get_att_float(), nc_get_var_float(), nc_get_var_short(), nc_get_var_uchar(), nc_get_vara_float(), nc_get_vara_short(), nc_get_vara_uchar(), nc_inq_varid(), nc_inq_vartype(), nc_open(), THD_diskptr::nvals, nz, STORAGE_BY_MINC, and THD_diskptr::storage_mode. Referenced by THD_load_datablock().
00351 { 00352 THD_diskptr *dkptr ; 00353 int im_varid , code , ncid ; 00354 int nx,ny,nz,nxy,nxyz,nxyzv , nbad,ibr,nv, nslice ; 00355 void *ptr ; 00356 nc_type im_type=NC_SHORT ; 00357 float im_valid_range[2], fac,denom , intop,inbot , outbot,outtop , sfac=1.0; 00358 float *im_min=NULL , *im_max=NULL ; 00359 int im_min_varid , im_max_varid , do_scale ; 00360 00361 ENTRY("THD_load_minc") ; 00362 00363 /*-- open input [these errors should never occur] --*/ 00364 00365 if( !ISVALID_DATABLOCK(dblk) || 00366 dblk->diskptr->storage_mode != STORAGE_BY_MINC || 00367 dblk->brick == NULL ) EXRETURN ; 00368 00369 dkptr = dblk->diskptr ; 00370 00371 code = nc_open( dkptr->brick_name , NC_NOWRITE , &ncid ) ; 00372 if( code != NC_NOERR ){ EPR(code,dkptr->brick_name,"open"); EXRETURN; } 00373 00374 code = nc_inq_varid( ncid , "image" , &im_varid ) ; 00375 if( code != NC_NOERR ){ EPR(code,dkptr->brick_name,"image varid"); nc_close(ncid); EXRETURN; } 00376 00377 /*-- allocate space for data --*/ 00378 00379 nx = dkptr->dimsizes[0] ; 00380 ny = dkptr->dimsizes[1] ; nxy = nx * ny ; 00381 nz = dkptr->dimsizes[2] ; nxyz = nxy * nz ; 00382 nv = dkptr->nvals ; nxyzv = nxyz * nv ; nslice = nz*nv ; 00383 00384 dblk->malloc_type = DATABLOCK_MEM_MALLOC ; 00385 00386 /** malloc space for each brick separately **/ 00387 00388 for( nbad=ibr=0 ; ibr < nv ; ibr++ ){ 00389 if( DBLK_ARRAY(dblk,ibr) == NULL ){ 00390 ptr = AFMALL(void, DBLK_BRICK_BYTES(dblk,ibr) ) ; 00391 mri_fix_data_pointer( ptr , DBLK_BRICK(dblk,ibr) ) ; 00392 if( ptr == NULL ) nbad++ ; 00393 } 00394 } 00395 00396 /** if couldn't get them all, take our ball and go home in a snit **/ 00397 00398 if( nbad > 0 ){ 00399 fprintf(stderr,"\n** failed to malloc %d MINC bricks out of %d\n\a",nbad,nv) ; 00400 for( ibr=0 ; ibr < nv ; ibr++ ){ 00401 if( DBLK_ARRAY(dblk,ibr) != NULL ){ 00402 free(DBLK_ARRAY(dblk,ibr)) ; 00403 mri_fix_data_pointer( NULL , DBLK_BRICK(dblk,ibr) ) ; 00404 } 00405 } 00406 nc_close(ncid) ; EXRETURN ; 00407 } 00408 00409 /** get scaling attributes/variables **/ 00410 00411 (void) nc_inq_vartype( ncid , im_varid , &im_type ) ; 00412 00413 /* N.B.: we don't scale if input data is stored as floats */ 00414 00415 do_scale = (im_type==NC_BYTE || im_type==NC_SHORT || im_type==NC_INT) ; 00416 00417 if( do_scale && AFNI_noenv("AFNI_MINC_SLICESCALE") ) do_scale = 0 ; 00418 00419 code = nc_get_att_float( ncid,im_varid , "valid_range" , im_valid_range ) ; 00420 00421 /** if can't get valid_range, make something up **/ 00422 00423 if( code != NC_NOERR || im_valid_range[0] >= im_valid_range[1] ){ 00424 00425 im_valid_range[0] = 0.0 ; 00426 00427 switch( im_type ){ 00428 case NC_BYTE: im_valid_range[1] = 255.0 ; break ; 00429 case NC_SHORT: im_valid_range[1] = 32767.0 ; break ; 00430 case NC_INT: im_valid_range[1] = 2147483647.0 ; break ; 00431 case NC_FLOAT: 00432 case NC_DOUBLE: im_valid_range[1] = 1.0 ; break ; 00433 break ; 00434 } 00435 } 00436 inbot = im_valid_range[0] ; 00437 intop = im_valid_range[1] ; 00438 denom = intop - inbot ; /* always positive */ 00439 00440 /** Get range of image (per 2D slice) to which valid_range will be scaled **/ 00441 /** Scaling will only be done if we get both image-min and image-max **/ 00442 00443 if( do_scale ){ 00444 00445 code = nc_inq_varid( ncid , "image-min" , &im_min_varid ) ; 00446 if( code == NC_NOERR ){ 00447 im_min = (float *) calloc(sizeof(float),nslice) ; 00448 code = nc_get_var_float( ncid , im_min_varid , im_min ) ; 00449 if( code != NC_NOERR ){ free(im_min); im_min = NULL; } 00450 } 00451 00452 /* got im_min ==> try for im_max */ 00453 00454 if( im_min != NULL ){ 00455 code = nc_inq_varid( ncid , "image-max" , &im_max_varid ) ; 00456 if( code == NC_NOERR ){ 00457 im_max = (float *) calloc(sizeof(float),nslice) ; 00458 code = nc_get_var_float( ncid , im_max_varid , im_max ) ; 00459 if( code != NC_NOERR ){ 00460 free(im_min); im_min = NULL; free(im_max); im_max = NULL; 00461 } 00462 } 00463 } 00464 00465 /* 19 Mar 2003: make sure we don't scale out of range! */ 00466 00467 if( im_max != NULL && MRI_IS_INT_TYPE(DBLK_BRICK_TYPE(dblk,0)) ){ 00468 float stop=0.0 , vbot,vtop ; 00469 int ii ; 00470 for( ii=0 ; ii < nslice ; ii++ ){ 00471 if( im_min[ii] < im_max[ii] ){ 00472 vbot = fabs(im_min[ii]) ; vtop = fabs(im_max[ii]) ; 00473 vtop = MAX(vtop,vbot) ; stop = MAX(vtop,stop) ; 00474 } 00475 } 00476 if( stop > MRI_TYPE_maxval[DBLK_BRICK_TYPE(dblk,0)] ){ 00477 sfac = MRI_TYPE_maxval[DBLK_BRICK_TYPE(dblk,0)] / stop ; 00478 fprintf(stderr,"++ Scaling %s by %g to avoid overflow to %g of %s data!\n", 00479 dkptr->brick_name, sfac, stop, MRI_TYPE_name[DBLK_BRICK_TYPE(dblk,0)] ) ; 00480 } else if( stop == 0.0 ){ 00481 free(im_min); im_min = NULL; free(im_max); im_max = NULL; 00482 } 00483 } 00484 00485 } /* end of do_scale */ 00486 00487 /** read data! **/ 00488 00489 switch( DBLK_BRICK_TYPE(dblk,0) ){ /* output datum */ 00490 00491 /* this case should never happen */ 00492 00493 default: 00494 fprintf(stderr,"\n** MINC illegal datum %d found\n", 00495 DBLK_BRICK_TYPE(dblk,0) ) ; 00496 for( ibr=0 ; ibr < nv ; ibr++ ){ 00497 if( DBLK_ARRAY(dblk,ibr) != NULL ){ 00498 free(DBLK_ARRAY(dblk,ibr)) ; 00499 mri_fix_data_pointer( NULL , DBLK_BRICK(dblk,ibr) ) ; 00500 } 00501 } 00502 break ; 00503 00504 /* data is stored as bytes in AFNI */ 00505 00506 case MRI_byte:{ 00507 int kk,ii,qq ; byte *br ; 00508 00509 if( nv == 1 ){ 00510 code = nc_get_var_uchar( ncid , im_varid , DBLK_ARRAY(dblk,0) ) ; 00511 } else { 00512 size_t start[4] , count[4] ; 00513 start[1] = start[2] = start[3] = 0 ; 00514 count[0] = 1 ; count[1] = nz ; count[2] = ny ; count[3] = nx ; 00515 for( ibr=0 ; ibr < nv ; ibr++ ){ 00516 start[0] = ibr ; 00517 code = nc_get_vara_uchar( ncid,im_varid , 00518 start,count , DBLK_ARRAY(dblk,ibr) ) ; 00519 } 00520 } 00521 if( code != NC_NOERR ) EPR(code,dkptr->brick_name,"image get_var_uchar") ; 00522 00523 if( im_max != NULL ){ /* must scale values */ 00524 for( ibr=0 ; ibr < nv ; ibr++ ){ /* loop over bricks */ 00525 br = DBLK_ARRAY(dblk,ibr) ; 00526 for( kk=0 ; kk < nz ; kk++ ){ /* loop over slices */ 00527 outbot = im_min[kk+ibr*nz] ; 00528 outtop = im_max[kk+ibr*nz] ; 00529 if( outbot >= outtop) continue ; /* skip */ 00530 fac = (outtop-outbot) / denom ; 00531 qq = kk*nxy ; outbot += 0.499 ; 00532 for( ii=0 ; ii < nxy ; ii++ ) /* scale slice */ 00533 br[ii+qq] = (byte) ((fac*(br[ii+qq]-inbot) + outbot)*sfac) ; 00534 } 00535 } 00536 } 00537 } 00538 break ; 00539 00540 /* data is stored as shorts in AFNI */ 00541 00542 case MRI_short:{ 00543 int kk,ii,qq ; short *br ; 00544 00545 if( nv == 1 ){ 00546 code = nc_get_var_short( ncid , im_varid , DBLK_ARRAY(dblk,0) ) ; 00547 } else { 00548 size_t start[4] , count[4] ; 00549 start[1] = start[2] = start[3] = 0 ; 00550 count[0] = 1 ; count[1] = nz ; count[2] = ny ; count[3] = nx ; 00551 for( ibr=0 ; ibr < nv ; ibr++ ){ 00552 start[0] = ibr ; 00553 code = nc_get_vara_short( ncid,im_varid , 00554 start,count , DBLK_ARRAY(dblk,ibr) ) ; 00555 } 00556 } 00557 if( code != NC_NOERR ) EPR(code,dkptr->brick_name,"image get_var_short") ; 00558 00559 if( im_max != NULL ){ /* must scale values */ 00560 for( ibr=0 ; ibr < nv ; ibr++ ){ /* loop over bricks */ 00561 br = DBLK_ARRAY(dblk,ibr) ; 00562 for( kk=0 ; kk < nz ; kk++ ){ /* loop over slices */ 00563 outbot = im_min[kk+ibr*nz] ; 00564 outtop = im_max[kk+ibr*nz] ; 00565 if( outbot >= outtop) continue ; /* skip */ 00566 fac = (outtop-outbot) / denom ; 00567 qq = kk*nxy ; outbot += 0.499 ; 00568 for( ii=0 ; ii < nxy ; ii++ ) /* scale slice */ 00569 br[ii+qq] = (short) ((fac*(br[ii+qq]-inbot) + outbot)*sfac) ; 00570 } 00571 } 00572 } 00573 } 00574 break ; 00575 00576 /* data is stored as floats in AFNI */ 00577 00578 case MRI_float:{ 00579 int kk,ii,qq ; float *br ; 00580 00581 if( nv == 1 ){ 00582 code = nc_get_var_float( ncid , im_varid , DBLK_ARRAY(dblk,0) ) ; 00583 } else { 00584 size_t start[4] , count[4] ; 00585 start[1] = start[2] = start[3] = 0 ; 00586 count[0] = 1 ; count[1] = nz ; count[2] = ny ; count[3] = nx ; 00587 for( ibr=0 ; ibr < nv ; ibr++ ){ 00588 start[0] = ibr ; 00589 code = nc_get_vara_float( ncid,im_varid , 00590 start,count , DBLK_ARRAY(dblk,ibr) ) ; 00591 } 00592 } 00593 if( code != NC_NOERR ) EPR(code,dkptr->brick_name,"image get_var_float") ; 00594 00595 if( im_type == NC_BYTE ){ /* fix sign of bytes */ 00596 for( ibr=0 ; ibr < nv ; ibr++ ){ /* loop over bricks */ 00597 br = DBLK_ARRAY(dblk,ibr) ; 00598 for( ii=0 ; ii < nxyz ; ii++ ) 00599 if( br[ii] < 0.0 ) br[ii] += 256.0 ; 00600 } 00601 } 00602 00603 if( im_max != NULL ){ /* must scale values */ 00604 for( ibr=0 ; ibr < nv ; ibr++ ){ /* loop over bricks */ 00605 br = DBLK_ARRAY(dblk,ibr) ; 00606 for( kk=0 ; kk < nz ; kk++ ){ /* loop over slices */ 00607 outbot = im_min[kk+ibr*nz] ; 00608 outtop = im_max[kk+ibr*nz] ; 00609 if( outbot >= outtop) continue ; /* skip */ 00610 fac = (outtop-outbot) / denom ; 00611 qq = kk*nxy ; 00612 for( ii=0 ; ii < nxy ; ii++ ) /* scale slice */ 00613 br[ii+qq] = (fac*(br[ii+qq]-inbot) + outbot) ; 00614 } 00615 } 00616 } 00617 } 00618 break ; 00619 00620 } /* end of switch on output datum */ 00621 00622 /*-- throw away the trash and return --*/ 00623 00624 if( im_min != NULL ) free(im_min) ; 00625 if( im_max != NULL ) free(im_max) ; 00626 nc_close(ncid) ; EXRETURN ; 00627 } |
|
Definition at line 113 of file thd_mincread.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_view_type, ADN_xyzdel, ADN_xyzorg, ADN_xyzorient, AFMALL, mincdim::afni_orient, AFNI_yesenv(), ANAT_BUCK_TYPE, ANAT_EPI_TYPE, ANAT_MRAN_TYPE, THD_diskptr::brick_name, DATABLOCK_MEM_MALLOC, THD_3dim_dataset::dblk, mincdim::dimid, THD_datablock::diskptr, EDIT_BRICK_LABEL, EDIT_dset_items(), EDIT_empty_copy(), ENTRY, EPR, first_err, fname_err, free, mincdim::good, HEAD_ANAT_TYPE, THD_3dim_dataset::idcode, THD_ivec3::ijk, mincdim::len, MCW_hash_idcode(), MCW_strncpy, nc_close(), nc_get_att_float(), nc_get_att_text(), nc_inq_attlen(), nc_inq_dimlen(), nc_inq_dimname(), nc_inq_vardimid(), nc_inq_varid(), nc_inq_varndims(), nc_inq_vartype(), nc_open(), ORI_A2P_TYPE, ORI_I2S_TYPE, ORI_L2R_TYPE, ORI_P2A_TYPE, ORI_R2L_TYPE, ORI_S2I_TYPE, read_mincdim(), RETURN, mincdim::start, mincdim::step, STORAGE_BY_MINC, THD_diskptr::storage_mode, MCW_idcode::str, THD_MAX_PREFIX, THD_trailname(), tross_Append_History(), UNITS_SEC_TYPE, VIEW_ORIGINAL_TYPE, VIEW_TALAIRACH_TYPE, xspace, THD_fvec3::xyz, and yspace. Referenced by main(), THD_init_session(), and THD_open_one_dataset().
00114 { 00115 THD_3dim_dataset *dset=NULL ; 00116 int ncid , code ; 00117 mincdim xspace , yspace , zspace , *xyz[3] ; 00118 int im_varid , im_rank , im_dimid[4] ; 00119 nc_type im_type ; 00120 00121 char prefix[1024] , *ppp , tname[12] ; 00122 THD_ivec3 nxyz , orixyz ; 00123 THD_fvec3 dxyz , orgxyz ; 00124 int datum , nvals=1 , ibr , iview ; 00125 size_t len ; 00126 float dtime=1.0 ; 00127 00128 ENTRY("THD_open_minc") ; 00129 00130 /*-- open input file --*/ 00131 00132 if( pathname == NULL || pathname[0] == '\0' ) RETURN(NULL); 00133 00134 first_err = 1 ; /* put a newline before 1st error message */ 00135 fname_err = pathname ; /* filename for errors in read_mincdim() */ 00136 00137 code = nc_open( pathname , NC_NOWRITE , &ncid ) ; 00138 if( code != NC_NOERR ){ EPR(code,pathname,"open"); RETURN(NULL); } 00139 00140 /*---------- get info about spatial axes ---------*/ 00141 /*[[ MINC x and y are reversed relative to AFNI ]]*/ 00142 /*[[ MINC x=L-R y=P-A; AFNI x=R-L y=A-P; z=I-S ]]*/ 00143 00144 xspace = read_mincdim( ncid , "xspace" ) ; 00145 xspace.step = -xspace.step ; xspace.start = -xspace.start ; 00146 xspace.afni_orient = (xspace.step < 0.0) ? ORI_L2R_TYPE : ORI_R2L_TYPE ; 00147 00148 yspace = read_mincdim( ncid , "yspace" ) ; 00149 yspace.step = -yspace.step ; yspace.start = -yspace.start ; 00150 yspace.afni_orient = (yspace.step < 0.0) ? ORI_P2A_TYPE : ORI_A2P_TYPE ; 00151 00152 zspace = read_mincdim( ncid , "zspace" ) ; 00153 zspace.afni_orient = (zspace.step > 0.0) ? ORI_I2S_TYPE : ORI_S2I_TYPE ; 00154 00155 /*-- if don't have all 3 named dimensions, quit --*/ 00156 00157 if( !xspace.good || !yspace.good || !zspace.good ){ 00158 nc_close(ncid) ; RETURN(NULL) ; 00159 } 00160 00161 /*-- get info about the image data --*/ 00162 00163 code = nc_inq_varid( ncid , "image" , &im_varid ) ; 00164 if( code != NC_NOERR ){ EPR(code,pathname,"image varid"); nc_close(ncid); RETURN(NULL); } 00165 00166 if( !AFNI_yesenv("AFNI_MINC_FLOATIZE") ){ /* determine type of dataset values */ 00167 code = nc_inq_vartype( ncid , im_varid , &im_type ) ; 00168 if( code != NC_NOERR ){ EPR(code,pathname,"image vartype"); nc_close(ncid); RETURN(NULL); } 00169 switch( im_type ){ 00170 default: 00171 if( first_err ){ fprintf(stderr,"\n"); first_err=0; } 00172 fprintf(stderr,"** MINC error: can't handle image type code %d\n",im_type); 00173 nc_close(ncid); RETURN(NULL); 00174 break ; 00175 00176 case NC_BYTE: datum = MRI_byte ; break ; 00177 00178 case NC_SHORT: datum = MRI_short ; break ; 00179 00180 case NC_FLOAT: 00181 case NC_DOUBLE: 00182 case NC_INT: datum = MRI_float ; break ; 00183 } 00184 } else { /* always read in as floats if */ 00185 datum = MRI_float ; /* AFNI_MINC_FLOATIZE is Yes */ 00186 } 00187 00188 /* we allow nD mages only for n=3 or n=4 */ 00189 00190 code = nc_inq_varndims( ncid , im_varid , &im_rank ) ; 00191 if( code != NC_NOERR ){ EPR(code,pathname,"image varndims"); nc_close(ncid); RETURN(NULL); } 00192 if( im_rank < 3 || im_rank > 4 ){ 00193 if( first_err ){ fprintf(stderr,"\n"); first_err=0; } 00194 fprintf(stderr,"** MINC error: image rank=%d\n",im_rank) ; 00195 nc_close(ncid); RETURN(NULL); 00196 } 00197 00198 code = nc_inq_vardimid( ncid , im_varid , im_dimid ) ; 00199 if( code != NC_NOERR ){ EPR(code,pathname,"image vardimid"); nc_close(ncid); RETURN(NULL); } 00200 00201 /*-- find axes order --*/ 00202 00203 /* fastest variation */ 00204 00205 if( im_dimid[im_rank-1] == xspace.dimid ) xyz[0] = &xspace ; 00206 else if( im_dimid[im_rank-1] == yspace.dimid ) xyz[0] = &yspace ; 00207 else if( im_dimid[im_rank-1] == zspace.dimid ) xyz[0] = &zspace ; 00208 else { 00209 if( first_err ){ fprintf(stderr,"\n"); first_err=0; } 00210 fprintf(stderr,"** MINC error: image dim[2] illegal\n") ; 00211 nc_close(ncid) ; RETURN(NULL) ; 00212 } 00213 00214 /* next fastest variation */ 00215 00216 if( im_dimid[im_rank-2] == xspace.dimid ) xyz[1] = &xspace ; 00217 else if( im_dimid[im_rank-2] == yspace.dimid ) xyz[1] = &yspace ; 00218 else if( im_dimid[im_rank-2] == zspace.dimid ) xyz[1] = &zspace ; 00219 else { 00220 if( first_err ){ fprintf(stderr,"\n"); first_err=0; } 00221 fprintf(stderr,"** MINC error: image dim[1] illegal\n") ; 00222 nc_close(ncid) ; RETURN(NULL) ; 00223 } 00224 00225 /* slowest variation */ 00226 00227 if( im_dimid[im_rank-3] == xspace.dimid ) xyz[2] = &xspace ; 00228 else if( im_dimid[im_rank-3] == yspace.dimid ) xyz[2] = &yspace ; 00229 else if( im_dimid[im_rank-3] == zspace.dimid ) xyz[2] = &zspace ; 00230 else { 00231 if( first_err ){ fprintf(stderr,"\n"); first_err=0; } 00232 fprintf(stderr,"** MINC error: image dim[0] illegal\n") ; 00233 nc_close(ncid) ; RETURN(NULL) ; 00234 } 00235 00236 /*-- determine the length of the 4th dimension, if any --*/ 00237 00238 strcpy(tname,"MINC") ; /* default name for 4th dimension */ 00239 00240 if( im_rank == 4 ){ 00241 char fname[NC_MAX_NAME+4] ; 00242 code = nc_inq_dimlen( ncid , im_dimid[0] , &len ) ; 00243 if( code != NC_NOERR ){ EPR(code,pathname,"dimid[0] dimlen"); nc_close(ncid); RETURN(NULL); } 00244 00245 nvals = len ; /* number of volumes in this file */ 00246 00247 /* get the name of this dimension */ 00248 00249 code = nc_inq_dimname( ncid , im_dimid[0] , fname ) ; 00250 if( code == NC_NOERR ){ 00251 MCW_strncpy(tname,fname,10) ; 00252 } 00253 00254 /* get the stepsize of this dimension */ 00255 00256 code = nc_get_att_float( ncid , im_dimid[0] , "step" , &dtime ) ; 00257 if( code != NC_NOERR || dtime <= 0.0 ) dtime = 1.0 ; 00258 } 00259 00260 /*-- make a dataset --*/ 00261 00262 dset = EDIT_empty_copy(NULL) ; 00263 00264 ppp = THD_trailname(pathname,0) ; /* strip directory */ 00265 MCW_strncpy( prefix , ppp , THD_MAX_PREFIX ) ; /* to make prefix */ 00266 00267 nxyz.ijk[0] = xyz[0]->len ; dxyz.xyz[0] = xyz[0]->step ; /* setup axes */ 00268 nxyz.ijk[1] = xyz[1]->len ; dxyz.xyz[1] = xyz[1]->step ; 00269 nxyz.ijk[2] = xyz[2]->len ; dxyz.xyz[2] = xyz[2]->step ; 00270 00271 orixyz.ijk[0] = xyz[0]->afni_orient ; orgxyz.xyz[0] = xyz[0]->start ; 00272 orixyz.ijk[1] = xyz[1]->afni_orient ; orgxyz.xyz[1] = xyz[1]->start ; 00273 orixyz.ijk[2] = xyz[2]->afni_orient ; orgxyz.xyz[2] = xyz[2]->start ; 00274 00275 if( strstr(xyz[0]->spacetype,"alairach") != NULL ){ /* coord system */ 00276 iview = VIEW_TALAIRACH_TYPE ; 00277 } else { 00278 iview = VIEW_ORIGINAL_TYPE ; 00279 } 00280 00281 dset->idcode.str[0] = 'M' ; /* overwrite 1st 3 bytes with something special */ 00282 dset->idcode.str[1] = 'N' ; 00283 dset->idcode.str[2] = 'C' ; 00284 00285 MCW_hash_idcode( pathname , dset ) ; /* 06 May 2005 */ 00286 00287 EDIT_dset_items( dset , 00288 ADN_prefix , prefix , 00289 ADN_datum_all , datum , 00290 ADN_nxyz , nxyz , 00291 ADN_xyzdel , dxyz , 00292 ADN_xyzorg , orgxyz , 00293 ADN_xyzorient , orixyz , 00294 ADN_malloc_type , DATABLOCK_MEM_MALLOC , 00295 ADN_nvals , nvals , 00296 ADN_type , HEAD_ANAT_TYPE , 00297 ADN_view_type , iview , 00298 ADN_func_type , (nvals==1) ? ANAT_MRAN_TYPE 00299 : ANAT_BUCK_TYPE , 00300 ADN_none ) ; 00301 00302 if( nvals > 9 ) /* pretend it is 3D+time */ 00303 EDIT_dset_items( dset , 00304 ADN_func_type, ANAT_EPI_TYPE , 00305 ADN_ntt , nvals , 00306 ADN_ttorg , 0.0 , 00307 ADN_ttdel , dtime , 00308 ADN_ttdur , 0.0 , 00309 ADN_tunits , UNITS_SEC_TYPE , 00310 ADN_none ) ; 00311 00312 /*-- flag to read data from disk using MINC/netCDF functions --*/ 00313 00314 dset->dblk->diskptr->storage_mode = STORAGE_BY_MINC ; 00315 strcpy( dset->dblk->diskptr->brick_name , pathname ) ; 00316 00317 for( ibr=0 ; ibr < nvals ; ibr++ ){ /* make sub-brick labels */ 00318 sprintf(prefix,"%s[%d]",tname,ibr) ; 00319 EDIT_BRICK_LABEL( dset , ibr , prefix ) ; 00320 } 00321 00322 /*-- read and save the global:history attribute --*/ 00323 00324 #if 0 00325 sprintf(prefix,"THD_open_minc(%s)",pathname) ; 00326 tross_Append_History( dset , prefix ) ; 00327 #endif 00328 00329 code = nc_inq_attlen( ncid , NC_GLOBAL , "history" , &len ) ; 00330 if( code == NC_NOERR && len > 0 ){ 00331 ppp = AFMALL(char,len+4) ; 00332 code = nc_get_att_text( ncid , NC_GLOBAL , "history" , ppp ) ; 00333 if( code == NC_NOERR ){ /* should always happen */ 00334 ppp[len] = '\0' ; 00335 tross_Append_History( dset , ppp ) ; 00336 } 00337 free(ppp) ; 00338 } 00339 00340 /*-- close file and return the empty dataset */ 00341 00342 nc_close(ncid) ; RETURN(dset) ; 00343 } |
Variable Documentation
|
Definition at line 8 of file thd_mincread.c. Referenced by read_mincdim(), and THD_open_minc(). |
|
Definition at line 9 of file thd_mincread.c. Referenced by read_mincdim(), and THD_open_minc(). |