00001
00006 #ifndef _NIFTI_IO_HEADER_
00007 #define _NIFTI_IO_HEADER_
00008
00009 #include <stdio.h>
00010 #include <stdlib.h>
00011 #include <string.h>
00012 #include <math.h>
00013 #include <ctype.h>
00014
00015 #ifndef DONT_INCLUDE_ANALYZE_STRUCT
00016 #define DONT_INCLUDE_ANALYZE_STRUCT
00017 #endif
00018 #include "nifti1.h"
00019
00020 #include <znzlib.h>
00021
00022
00023 #ifdef __cplusplus
00024 extern "C" {
00025 #endif
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 typedef struct {
00059 float m[4][4] ;
00060 } mat44 ;
00061
00062 typedef struct {
00063 float m[3][3] ;
00064 } mat33 ;
00065
00066
00067
00072 typedef enum _analyze75_orient_code {
00073 a75_transverse_unflipped = 0,
00074 a75_coronal_unflipped = 1,
00075 a75_sagittal_unflipped = 2,
00076 a75_transverse_flipped = 3,
00077 a75_coronal_flipped = 4,
00078 a75_sagittal_flipped = 5,
00079 a75_orient_unknown = 6
00080 } analyze_75_orient_code;
00081
00088 typedef struct {
00090 int ndim ;
00091 int nx ;
00092 int ny ;
00093 int nz ;
00094 int nt ;
00095 int nu ;
00096 int nv ;
00097 int nw ;
00098 int dim[8] ;
00099 size_t nvox ;
00100 int nbyper ;
00101 int datatype ;
00103 float dx ;
00104 float dy ;
00105 float dz ;
00106 float dt ;
00107 float du ;
00108 float dv ;
00109 float dw ;
00110 float pixdim[8] ;
00112 float scl_slope ;
00113 float scl_inter ;
00115 float cal_min ;
00116 float cal_max ;
00118 int qform_code ;
00119 int sform_code ;
00121 int freq_dim ;
00122 int phase_dim ;
00123 int slice_dim ;
00125 int slice_code ;
00126 int slice_start ;
00127 int slice_end ;
00128 float slice_duration ;
00132 float quatern_b , quatern_c , quatern_d ,
00133 qoffset_x , qoffset_y , qoffset_z ,
00134 qfac ;
00135
00136 mat44 qto_xyz ;
00137 mat44 qto_ijk ;
00139 mat44 sto_xyz ;
00140 mat44 sto_ijk ;
00142 float toffset ;
00144 int xyz_units ;
00145 int time_units ;
00147 int nifti_type ;
00150 int intent_code ;
00151 float intent_p1 ;
00152 float intent_p2 ;
00153 float intent_p3 ;
00154 char intent_name[16] ;
00156 char descrip[80] ;
00157 char aux_file[24] ;
00159 char *fname ;
00160 char *iname ;
00161 int iname_offset ;
00162 int swapsize ;
00163 int byteorder ;
00164 void *data ;
00166 int num_ext ;
00167 nifti1_extension * ext_list ;
00168 analyze_75_orient_code analyze75_orient;
00170 } nifti_image ;
00171
00172
00173
00174
00175 typedef struct {
00176 int nbricks;
00177 size_t bsize;
00178 void ** bricks;
00179 } nifti_brick_list;
00180
00181
00182
00183
00184
00185 char *nifti_datatype_string ( int dt ) ;
00186 char *nifti_units_string ( int uu ) ;
00187 char *nifti_intent_string ( int ii ) ;
00188 char *nifti_xform_string ( int xx ) ;
00189 char *nifti_slice_string ( int ss ) ;
00190 char *nifti_orientation_string( int ii ) ;
00191
00192 int nifti_is_inttype( int dt ) ;
00193
00194 mat44 nifti_mat44_inverse( mat44 R ) ;
00195
00196 mat33 nifti_mat33_inverse( mat33 R ) ;
00197 mat33 nifti_mat33_polar ( mat33 A ) ;
00198 float nifti_mat33_rownorm( mat33 A ) ;
00199 float nifti_mat33_colnorm( mat33 A ) ;
00200 float nifti_mat33_determ ( mat33 R ) ;
00201 mat33 nifti_mat33_mul ( mat33 A , mat33 B ) ;
00202
00203 void nifti_swap_2bytes ( int n , void *ar ) ;
00204 void nifti_swap_4bytes ( int n , void *ar ) ;
00205 void nifti_swap_8bytes ( int n , void *ar ) ;
00206 void nifti_swap_16bytes( int n , void *ar ) ;
00207 void nifti_swap_Nbytes ( int n , int siz , void *ar ) ;
00208
00209 void swap_nifti_header ( struct nifti_1_header *h , int is_nifti ) ;
00210 int nifti_get_filesize( const char *pathname ) ;
00211
00212
00213
00214 nifti_image *nifti_image_read_bricks(const char *hname , int nbricks,
00215 const int *blist, nifti_brick_list * NBL);
00216 int nifti_image_load_bricks(nifti_image *nim , int nbricks,
00217 const int *blist, nifti_brick_list * NBL);
00218 void nifti_free_NBL( nifti_brick_list * NBL );
00219
00220 nifti_image *nifti_image_read ( const char *hname , int read_data ) ;
00221 int nifti_image_load ( nifti_image *nim ) ;
00222 void nifti_image_unload ( nifti_image *nim ) ;
00223 void nifti_image_free ( nifti_image *nim ) ;
00224
00225 int nifti_read_collapsed_image( nifti_image * nim, const int dims [8],
00226 void ** data );
00227
00228 int nifti_read_subregion_image( nifti_image * nim,
00229 int *start_index, int *region_size,
00230 void ** data );
00231
00232 void nifti_image_write ( nifti_image * nim ) ;
00233 void nifti_image_write_bricks(nifti_image * nim,
00234 const nifti_brick_list * NBL);
00235 void nifti_image_infodump( const nifti_image * nim ) ;
00236
00237 void nifti_disp_lib_hist( void ) ;
00238 void nifti_disp_lib_version( void ) ;
00239 int nifti_disp_matrix_orient( const char * mesg, mat44 mat );
00240
00241 char * nifti_image_to_ascii ( const nifti_image * nim ) ;
00242 nifti_image *nifti_image_from_ascii( const char * str, int * bytes_read ) ;
00243
00244 size_t nifti_get_volsize(const nifti_image *nim) ;
00245
00246
00247 int nifti_set_filenames(nifti_image * nim, const char * prefix, int check,
00248 int set_byte_order);
00249 char * nifti_makehdrname (const char * prefix, int nifti_type, int check,
00250 int comp);
00251 char * nifti_makeimgname (const char * prefix, int nifti_type, int check,
00252 int comp);
00253 int is_nifti_file (const char *hname);
00254 char * nifti_find_file_extension(const char * name);
00255 int nifti_is_complete_filename(const char* fname);
00256 int nifti_validfilename(const char* fname);
00257
00258 int disp_nifti_1_header(const char * info, const nifti_1_header * hp ) ;
00259 void nifti_set_debug_level( int level ) ;
00260 void nifti_set_skip_blank_ext( int skip ) ;
00261
00262 int valid_nifti_brick_list(nifti_image * nim , int nbricks,
00263 const int * blist, int disp_error);
00264
00265
00266 znzFile nifti_image_open(const char * hname, char * opts, nifti_image ** nim);
00267 znzFile nifti_image_write_hdr_img(nifti_image *nim, int write_data,
00268 const char* opts);
00269 znzFile nifti_image_write_hdr_img2( nifti_image *nim , int write_opts ,
00270 const char* opts, znzFile imgfile, const nifti_brick_list * NBL);
00271 size_t nifti_read_buffer(znzFile fp, void* datatptr, size_t ntot,
00272 nifti_image *nim);
00273 int nifti_write_all_data(znzFile fp, nifti_image * nim,
00274 const nifti_brick_list * NBL);
00275 size_t nifti_write_buffer(znzFile fp, const void * buffer, size_t numbytes);
00276 nifti_image *nifti_read_ascii_image(znzFile fp, char *fname, int flen,
00277 int read_data);
00278 znzFile nifti_write_ascii_image(nifti_image *nim, const nifti_brick_list * NBL,
00279 const char * opts, int write_data, int leave_open);
00280
00281
00282 void nifti_datatype_sizes( int datatype , int *nbyper, int *swapsize ) ;
00283
00284 void nifti_mat44_to_quatern( mat44 R ,
00285 float *qb, float *qc, float *qd,
00286 float *qx, float *qy, float *qz,
00287 float *dx, float *dy, float *dz, float *qfac ) ;
00288
00289 mat44 nifti_quatern_to_mat44( float qb, float qc, float qd,
00290 float qx, float qy, float qz,
00291 float dx, float dy, float dz, float qfac );
00292
00293 mat44 nifti_make_orthog_mat44( float r11, float r12, float r13 ,
00294 float r21, float r22, float r23 ,
00295 float r31, float r32, float r33 ) ;
00296
00297 int nifti_short_order(void) ;
00298
00299
00300
00301
00302 #define NIFTI_L2R 1
00303 #define NIFTI_R2L 2
00304 #define NIFTI_P2A 3
00305 #define NIFTI_A2P 4
00306 #define NIFTI_I2S 5
00307 #define NIFTI_S2I 6
00308
00309 void nifti_mat44_to_orientation( mat44 R , int *icod, int *jcod, int *kcod ) ;
00310
00311
00312
00313 char * nifti_findhdrname (const char* fname);
00314 char * nifti_findimgname (const char* fname , int nifti_type);
00315 int nifti_is_gzfile (const char* fname);
00316
00317 char * nifti_makebasename(const char* fname);
00318
00319
00320
00321 struct nifti_1_header nifti_convert_nim2nhdr(const nifti_image* nim);
00322 nifti_1_header * nifti_make_new_header(const int arg_dims[], int arg_dtype);
00323 nifti_1_header * nifti_read_header(const char *hname, int *swapped, int check);
00324 nifti_image * nifti_copy_nim_info(const nifti_image * src);
00325 nifti_image * nifti_make_new_nim(const int dims[], int datatype,
00326 int data_fill);
00327 nifti_image * nifti_simple_init_nim(void);
00328 nifti_image * nifti_convert_nhdr2nim(struct nifti_1_header nhdr,
00329 const char * fname);
00330
00331 int nifti_hdr_looks_good (const nifti_1_header * hdr);
00332 int nifti_is_valid_datatype (int dtype);
00333 int nifti_is_valid_ecode (int ecode);
00334 int nifti_nim_is_valid (nifti_image * nim, int complain);
00335 int nifti_nim_has_valid_dims (nifti_image * nim, int complain);
00336 int is_valid_nifti_type (int nifti_type);
00337 int nifti_type_and_names_match (nifti_image * nim, int show_warn);
00338 int nifti_update_dims_from_array(nifti_image * nim);
00339 void nifti_set_iname_offset (nifti_image *nim);
00340 int nifti_set_type_from_names (nifti_image * nim);
00341 int nifti_add_extension(nifti_image * nim, const char * data, int len,
00342 int ecode );
00343 int nifti_copy_extensions (nifti_image *nim_dest,const nifti_image *nim_src);
00344 int nifti_free_extensions (nifti_image *nim);
00345 int * nifti_get_intlist (int nvals , const char *str);
00346 char * nifti_strdup (const char *str);
00347 int valid_nifti_extensions(const nifti_image *nim);
00348
00349
00350
00351
00352
00353
00354
00355 #define NIFTI_ECODE_IGNORE 0
00356
00357 #define NIFTI_ECODE_DICOM 2
00358
00359 #define NIFTI_ECODE_AFNI 4
00360
00361
00362 #define NIFTI_ECODE_COMMENT 6
00363
00364 #define NIFTI_ECODE_XCEDE 8
00365
00366
00367
00368
00369 #define NIFTI_ECODE_JIMDIMINFO 10
00370
00371
00372
00373 #define NIFTI_ECODE_WORKFLOW_FWDS 12
00374
00375
00376
00377
00378 #define NIFTI_MAX_ECODE 12
00379
00380
00381 #define NIFTI_FTYPE_ANALYZE 0
00382 #define NIFTI_FTYPE_NIFTI1_1 1
00383 #define NIFTI_FTYPE_NIFTI1_2 2
00384 #define NIFTI_FTYPE_ASCII 3
00385 #define NIFTI_MAX_FTYPE 3
00386
00387
00388
00389
00390 #ifdef _NIFTI1_IO_C_
00391
00392 typedef struct {
00393 int debug;
00394 int skip_blank_ext;
00395 } nifti_global_options;
00396
00397 #undef LNI_FERR
00398 #define LNI_FERR(func,msg,file) \
00399 fprintf(stderr,"** ERROR (%s): %s '%s'\n",func,msg,file)
00400
00401 #undef swap_2
00402 #undef swap_4
00403 #define swap_2(s) nifti_swap_2bytes(1,&(s))
00404 #define swap_4(v) nifti_swap_4bytes(1,&(v))
00405
00406
00407
00408
00409 #undef IS_GOOD_FLOAT
00410 #undef FIXED_FLOAT
00411
00412 #ifdef isfinite
00413 # define IS_GOOD_FLOAT(x) isfinite(x)
00414 # define FIXED_FLOAT(x) (isfinite(x) ? (x) : 0)
00415 #else
00416 # define IS_GOOD_FLOAT(x) 1
00417 # define FIXED_FLOAT(x) (x)
00418 #endif
00419
00420 #undef ASSIF
00421 #define ASSIF(p,v) if( (p)!=NULL ) *(p) = (v)
00422
00423 #undef MSB_FIRST
00424 #undef LSB_FIRST
00425 #undef REVERSE_ORDER
00426 #define LSB_FIRST 1
00427 #define MSB_FIRST 2
00428 #define REVERSE_ORDER(x) (3-(x))
00429
00430 #define LNI_MAX_NIA_EXT_LEN 100000
00431
00432 #endif
00433
00434
00435
00436 #ifdef __cplusplus
00437 }
00438 #endif
00439
00440
00441 #endif