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 int nifti_datatype_from_string(const char * name);
00210 char * nifti_datatype_to_string (int dtype);
00211
00212 void swap_nifti_header ( struct nifti_1_header *h , int is_nifti ) ;
00213 int nifti_get_filesize( const char *pathname ) ;
00214
00215
00216
00217 nifti_image *nifti_image_read_bricks(const char *hname , int nbricks,
00218 const int *blist, nifti_brick_list * NBL);
00219 int nifti_image_load_bricks(nifti_image *nim , int nbricks,
00220 const int *blist, nifti_brick_list * NBL);
00221 void nifti_free_NBL( nifti_brick_list * NBL );
00222
00223 nifti_image *nifti_image_read ( const char *hname , int read_data ) ;
00224 int nifti_image_load ( nifti_image *nim ) ;
00225 void nifti_image_unload ( nifti_image *nim ) ;
00226 void nifti_image_free ( nifti_image *nim ) ;
00227
00228 int nifti_read_collapsed_image( nifti_image * nim, const int dims [8],
00229 void ** data );
00230
00231 int nifti_read_subregion_image( nifti_image * nim,
00232 int *start_index, int *region_size,
00233 void ** data );
00234
00235 void nifti_image_write ( nifti_image * nim ) ;
00236 void nifti_image_write_bricks(nifti_image * nim,
00237 const nifti_brick_list * NBL);
00238 void nifti_image_infodump( const nifti_image * nim ) ;
00239
00240 void nifti_disp_lib_hist( void ) ;
00241 void nifti_disp_lib_version( void ) ;
00242 int nifti_disp_matrix_orient( const char * mesg, mat44 mat );
00243 int nifti_disp_type_list( int which );
00244
00245
00246 char * nifti_image_to_ascii ( const nifti_image * nim ) ;
00247 nifti_image *nifti_image_from_ascii( const char * str, int * bytes_read ) ;
00248
00249 size_t nifti_get_volsize(const nifti_image *nim) ;
00250
00251
00252 int nifti_set_filenames(nifti_image * nim, const char * prefix, int check,
00253 int set_byte_order);
00254 char * nifti_makehdrname (const char * prefix, int nifti_type, int check,
00255 int comp);
00256 char * nifti_makeimgname (const char * prefix, int nifti_type, int check,
00257 int comp);
00258 int is_nifti_file (const char *hname);
00259 char * nifti_find_file_extension(const char * name);
00260 int nifti_is_complete_filename(const char* fname);
00261 int nifti_validfilename(const char* fname);
00262
00263 int disp_nifti_1_header(const char * info, const nifti_1_header * hp ) ;
00264 void nifti_set_debug_level( int level ) ;
00265 void nifti_set_skip_blank_ext( int skip ) ;
00266
00267 int valid_nifti_brick_list(nifti_image * nim , int nbricks,
00268 const int * blist, int disp_error);
00269
00270
00271 znzFile nifti_image_open(const char * hname, char * opts, nifti_image ** nim);
00272 znzFile nifti_image_write_hdr_img(nifti_image *nim, int write_data,
00273 const char* opts);
00274 znzFile nifti_image_write_hdr_img2( nifti_image *nim , int write_opts ,
00275 const char* opts, znzFile imgfile, const nifti_brick_list * NBL);
00276 size_t nifti_read_buffer(znzFile fp, void* datatptr, size_t ntot,
00277 nifti_image *nim);
00278 int nifti_write_all_data(znzFile fp, nifti_image * nim,
00279 const nifti_brick_list * NBL);
00280 size_t nifti_write_buffer(znzFile fp, const void * buffer, size_t numbytes);
00281 nifti_image *nifti_read_ascii_image(znzFile fp, char *fname, int flen,
00282 int read_data);
00283 znzFile nifti_write_ascii_image(nifti_image *nim, const nifti_brick_list * NBL,
00284 const char * opts, int write_data, int leave_open);
00285
00286
00287 void nifti_datatype_sizes( int datatype , int *nbyper, int *swapsize ) ;
00288
00289 void nifti_mat44_to_quatern( mat44 R ,
00290 float *qb, float *qc, float *qd,
00291 float *qx, float *qy, float *qz,
00292 float *dx, float *dy, float *dz, float *qfac ) ;
00293
00294 mat44 nifti_quatern_to_mat44( float qb, float qc, float qd,
00295 float qx, float qy, float qz,
00296 float dx, float dy, float dz, float qfac );
00297
00298 mat44 nifti_make_orthog_mat44( float r11, float r12, float r13 ,
00299 float r21, float r22, float r23 ,
00300 float r31, float r32, float r33 ) ;
00301
00302 int nifti_short_order(void) ;
00303
00304
00305
00306
00307 #define NIFTI_L2R 1
00308 #define NIFTI_R2L 2
00309 #define NIFTI_P2A 3
00310 #define NIFTI_A2P 4
00311 #define NIFTI_I2S 5
00312 #define NIFTI_S2I 6
00313
00314 void nifti_mat44_to_orientation( mat44 R , int *icod, int *jcod, int *kcod ) ;
00315
00316
00317
00318 char * nifti_findhdrname (const char* fname);
00319 char * nifti_findimgname (const char* fname , int nifti_type);
00320 int nifti_is_gzfile (const char* fname);
00321
00322 char * nifti_makebasename(const char* fname);
00323
00324
00325
00326 struct nifti_1_header nifti_convert_nim2nhdr(const nifti_image* nim);
00327 nifti_1_header * nifti_make_new_header(const int arg_dims[], int arg_dtype);
00328 nifti_1_header * nifti_read_header(const char *hname, int *swapped, int check);
00329 nifti_image * nifti_copy_nim_info(const nifti_image * src);
00330 nifti_image * nifti_make_new_nim(const int dims[], int datatype,
00331 int data_fill);
00332 nifti_image * nifti_simple_init_nim(void);
00333 nifti_image * nifti_convert_nhdr2nim(struct nifti_1_header nhdr,
00334 const char * fname);
00335
00336 int nifti_hdr_looks_good (const nifti_1_header * hdr);
00337 int nifti_is_valid_datatype (int dtype);
00338 int nifti_is_valid_ecode (int ecode);
00339 int nifti_nim_is_valid (nifti_image * nim, int complain);
00340 int nifti_nim_has_valid_dims (nifti_image * nim, int complain);
00341 int is_valid_nifti_type (int nifti_type);
00342 int nifti_test_datatype_sizes (int verb);
00343 int nifti_type_and_names_match (nifti_image * nim, int show_warn);
00344 int nifti_update_dims_from_array(nifti_image * nim);
00345 void nifti_set_iname_offset (nifti_image *nim);
00346 int nifti_set_type_from_names (nifti_image * nim);
00347 int nifti_add_extension(nifti_image * nim, const char * data, int len,
00348 int ecode );
00349 int nifti_copy_extensions (nifti_image *nim_dest,const nifti_image *nim_src);
00350 int nifti_free_extensions (nifti_image *nim);
00351 int * nifti_get_intlist (int nvals , const char *str);
00352 char * nifti_strdup (const char *str);
00353 int valid_nifti_extensions(const nifti_image *nim);
00354
00355
00356
00357
00358
00359
00360
00361 #define NIFTI_ECODE_IGNORE 0
00362
00363 #define NIFTI_ECODE_DICOM 2
00364
00365 #define NIFTI_ECODE_AFNI 4
00366
00367
00368 #define NIFTI_ECODE_COMMENT 6
00369
00370 #define NIFTI_ECODE_XCEDE 8
00371
00372
00373
00374
00375 #define NIFTI_ECODE_JIMDIMINFO 10
00376
00377
00378
00379 #define NIFTI_ECODE_WORKFLOW_FWDS 12
00380
00381
00382
00383
00384 #define NIFTI_ECODE_FREESURFER 14
00385
00386 #define NIFTI_MAX_ECODE 14
00387
00388
00389 #define NIFTI_FTYPE_ANALYZE 0
00390 #define NIFTI_FTYPE_NIFTI1_1 1
00391 #define NIFTI_FTYPE_NIFTI1_2 2
00392 #define NIFTI_FTYPE_ASCII 3
00393 #define NIFTI_MAX_FTYPE 3
00394
00395
00396
00397
00398 #ifdef _NIFTI1_IO_C_
00399
00400 typedef struct {
00401 int debug;
00402 int skip_blank_ext;
00403 } nifti_global_options;
00404
00405 typedef struct {
00406 int type;
00407 int nbyper;
00408 int swapsize;
00409 char * name;
00410 } nifti_type_ele;
00411
00412 #undef LNI_FERR
00413 #define LNI_FERR(func,msg,file) \
00414 fprintf(stderr,"** ERROR (%s): %s '%s'\n",func,msg,file)
00415
00416 #undef swap_2
00417 #undef swap_4
00418 #define swap_2(s) nifti_swap_2bytes(1,&(s))
00419 #define swap_4(v) nifti_swap_4bytes(1,&(v))
00420
00421
00422
00423
00424 #undef IS_GOOD_FLOAT
00425 #undef FIXED_FLOAT
00426
00427 #ifdef isfinite
00428 # define IS_GOOD_FLOAT(x) isfinite(x)
00429 # define FIXED_FLOAT(x) (isfinite(x) ? (x) : 0)
00430 #else
00431 # define IS_GOOD_FLOAT(x) 1
00432 # define FIXED_FLOAT(x) (x)
00433 #endif
00434
00435 #undef ASSIF
00436 #define ASSIF(p,v) if( (p)!=NULL ) *(p) = (v)
00437
00438 #undef MSB_FIRST
00439 #undef LSB_FIRST
00440 #undef REVERSE_ORDER
00441 #define LSB_FIRST 1
00442 #define MSB_FIRST 2
00443 #define REVERSE_ORDER(x) (3-(x))
00444
00445 #define LNI_MAX_NIA_EXT_LEN 100000
00446
00447 #endif
00448
00449
00450
00451 #ifdef __cplusplus
00452 }
00453 #endif
00454
00455
00456 #endif