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
00186
00187 typedef struct {
00188
00189
00190 int sizeof_hdr;
00191 char data_type[10];
00192 char db_name[18];
00193 int extents;
00194 short int session_error;
00195 char regular;
00196 char hkey_un0;
00197
00198
00199 short int dim[8];
00200 short int unused8;
00201 short int unused9;
00202 short int unused10;
00203 short int unused11;
00204 short int unused12;
00205 short int unused13;
00206 short int unused14;
00207 short int datatype;
00208 short int bitpix;
00209 short int dim_un0;
00210 float pixdim[8];
00211
00212 float vox_offset;
00213 float funused1;
00214 float funused2;
00215 float funused3;
00216
00217
00218 float cal_max;
00219 float cal_min;
00220 float compressed;
00221 float verified;
00222 int glmax,glmin;
00223
00224
00225 char descrip[80];
00226 char aux_file[24];
00227 char orient;
00228 char originator[10];
00229 char generated[10];
00230 char scannum[10];
00231 char patient_id[10];
00232 char exp_date[10];
00233 char exp_time[10];
00234 char hist_un0[3];
00235 int views;
00236 int vols_added;
00237 int start_field;
00238 int field_skip;
00239 int omax, omin;
00240 int smax, smin;
00241 } nifti_analyze75;
00242
00243
00244
00245
00246
00247 char *nifti_datatype_string ( int dt ) ;
00248 char *nifti_units_string ( int uu ) ;
00249 char *nifti_intent_string ( int ii ) ;
00250 char *nifti_xform_string ( int xx ) ;
00251 char *nifti_slice_string ( int ss ) ;
00252 char *nifti_orientation_string( int ii ) ;
00253
00254 int nifti_is_inttype( int dt ) ;
00255
00256 mat44 nifti_mat44_inverse( mat44 R ) ;
00257
00258 mat33 nifti_mat33_inverse( mat33 R ) ;
00259 mat33 nifti_mat33_polar ( mat33 A ) ;
00260 float nifti_mat33_rownorm( mat33 A ) ;
00261 float nifti_mat33_colnorm( mat33 A ) ;
00262 float nifti_mat33_determ ( mat33 R ) ;
00263 mat33 nifti_mat33_mul ( mat33 A , mat33 B ) ;
00264
00265 void nifti_swap_2bytes ( int n , void *ar ) ;
00266 void nifti_swap_4bytes ( int n , void *ar ) ;
00267 void nifti_swap_8bytes ( int n , void *ar ) ;
00268 void nifti_swap_16bytes( int n , void *ar ) ;
00269 void nifti_swap_Nbytes ( int n , int siz , void *ar ) ;
00270
00271 int nifti_datatype_is_valid (int dtype, int for_nifti);
00272 int nifti_datatype_from_string(const char * name);
00273 char * nifti_datatype_to_string (int dtype);
00274
00275 int nifti_get_filesize( const char *pathname ) ;
00276 void swap_nifti_header ( struct nifti_1_header *h , int is_nifti ) ;
00277 void old_swap_nifti_header( struct nifti_1_header *h , int is_nifti );
00278 int nifti_swap_as_analyze( nifti_analyze75 *h );
00279
00280
00281
00282
00283 nifti_image *nifti_image_read_bricks(const char *hname , int nbricks,
00284 const int *blist, nifti_brick_list * NBL);
00285 int nifti_image_load_bricks(nifti_image *nim , int nbricks,
00286 const int *blist, nifti_brick_list * NBL);
00287 void nifti_free_NBL( nifti_brick_list * NBL );
00288
00289 nifti_image *nifti_image_read ( const char *hname , int read_data ) ;
00290 int nifti_image_load ( nifti_image *nim ) ;
00291 void nifti_image_unload ( nifti_image *nim ) ;
00292 void nifti_image_free ( nifti_image *nim ) ;
00293
00294 int nifti_read_collapsed_image( nifti_image * nim, const int dims [8],
00295 void ** data );
00296
00297 int nifti_read_subregion_image( nifti_image * nim,
00298 int *start_index, int *region_size,
00299 void ** data );
00300
00301 void nifti_image_write ( nifti_image * nim ) ;
00302 void nifti_image_write_bricks(nifti_image * nim,
00303 const nifti_brick_list * NBL);
00304 void nifti_image_infodump( const nifti_image * nim ) ;
00305
00306 void nifti_disp_lib_hist( void ) ;
00307 void nifti_disp_lib_version( void ) ;
00308 int nifti_disp_matrix_orient( const char * mesg, mat44 mat );
00309 int nifti_disp_type_list( int which );
00310
00311
00312 char * nifti_image_to_ascii ( const nifti_image * nim ) ;
00313 nifti_image *nifti_image_from_ascii( const char * str, int * bytes_read ) ;
00314
00315 size_t nifti_get_volsize(const nifti_image *nim) ;
00316
00317
00318 int nifti_set_filenames(nifti_image * nim, const char * prefix, int check,
00319 int set_byte_order);
00320 char * nifti_makehdrname (const char * prefix, int nifti_type, int check,
00321 int comp);
00322 char * nifti_makeimgname (const char * prefix, int nifti_type, int check,
00323 int comp);
00324 int is_nifti_file (const char *hname);
00325 char * nifti_find_file_extension(const char * name);
00326 int nifti_is_complete_filename(const char* fname);
00327 int nifti_validfilename(const char* fname);
00328
00329 int disp_nifti_1_header(const char * info, const nifti_1_header * hp ) ;
00330 void nifti_set_debug_level( int level ) ;
00331 void nifti_set_skip_blank_ext( int skip ) ;
00332
00333 int valid_nifti_brick_list(nifti_image * nim , int nbricks,
00334 const int * blist, int disp_error);
00335
00336
00337 znzFile nifti_image_open(const char * hname, char * opts, nifti_image ** nim);
00338 znzFile nifti_image_write_hdr_img(nifti_image *nim, int write_data,
00339 const char* opts);
00340 znzFile nifti_image_write_hdr_img2( nifti_image *nim , int write_opts ,
00341 const char* opts, znzFile imgfile, const nifti_brick_list * NBL);
00342 size_t nifti_read_buffer(znzFile fp, void* datatptr, size_t ntot,
00343 nifti_image *nim);
00344 int nifti_write_all_data(znzFile fp, nifti_image * nim,
00345 const nifti_brick_list * NBL);
00346 size_t nifti_write_buffer(znzFile fp, const void * buffer, size_t numbytes);
00347 nifti_image *nifti_read_ascii_image(znzFile fp, char *fname, int flen,
00348 int read_data);
00349 znzFile nifti_write_ascii_image(nifti_image *nim, const nifti_brick_list * NBL,
00350 const char * opts, int write_data, int leave_open);
00351
00352
00353 void nifti_datatype_sizes( int datatype , int *nbyper, int *swapsize ) ;
00354
00355 void nifti_mat44_to_quatern( mat44 R ,
00356 float *qb, float *qc, float *qd,
00357 float *qx, float *qy, float *qz,
00358 float *dx, float *dy, float *dz, float *qfac ) ;
00359
00360 mat44 nifti_quatern_to_mat44( float qb, float qc, float qd,
00361 float qx, float qy, float qz,
00362 float dx, float dy, float dz, float qfac );
00363
00364 mat44 nifti_make_orthog_mat44( float r11, float r12, float r13 ,
00365 float r21, float r22, float r23 ,
00366 float r31, float r32, float r33 ) ;
00367
00368 int nifti_short_order(void) ;
00369
00370
00371
00372
00373 #define NIFTI_L2R 1
00374 #define NIFTI_R2L 2
00375 #define NIFTI_P2A 3
00376 #define NIFTI_A2P 4
00377 #define NIFTI_I2S 5
00378 #define NIFTI_S2I 6
00379
00380 void nifti_mat44_to_orientation( mat44 R , int *icod, int *jcod, int *kcod ) ;
00381
00382
00383
00384 char * nifti_findhdrname (const char* fname);
00385 char * nifti_findimgname (const char* fname , int nifti_type);
00386 int nifti_is_gzfile (const char* fname);
00387
00388 char * nifti_makebasename(const char* fname);
00389
00390
00391
00392 struct nifti_1_header nifti_convert_nim2nhdr(const nifti_image* nim);
00393 nifti_1_header * nifti_make_new_header(const int arg_dims[], int arg_dtype);
00394 nifti_1_header * nifti_read_header(const char *hname, int *swapped, int check);
00395 nifti_image * nifti_copy_nim_info(const nifti_image * src);
00396 nifti_image * nifti_make_new_nim(const int dims[], int datatype,
00397 int data_fill);
00398 nifti_image * nifti_simple_init_nim(void);
00399 nifti_image * nifti_convert_nhdr2nim(struct nifti_1_header nhdr,
00400 const char * fname);
00401
00402 int nifti_hdr_looks_good (const nifti_1_header * hdr);
00403 int nifti_is_valid_datatype (int dtype);
00404 int nifti_is_valid_ecode (int ecode);
00405 int nifti_nim_is_valid (nifti_image * nim, int complain);
00406 int nifti_nim_has_valid_dims (nifti_image * nim, int complain);
00407 int is_valid_nifti_type (int nifti_type);
00408 int nifti_test_datatype_sizes (int verb);
00409 int nifti_type_and_names_match (nifti_image * nim, int show_warn);
00410 int nifti_update_dims_from_array(nifti_image * nim);
00411 void nifti_set_iname_offset (nifti_image *nim);
00412 int nifti_set_type_from_names (nifti_image * nim);
00413 int nifti_add_extension(nifti_image * nim, const char * data, int len,
00414 int ecode );
00415 int nifti_compiled_with_zlib (void);
00416 int nifti_copy_extensions (nifti_image *nim_dest,const nifti_image *nim_src);
00417 int nifti_free_extensions (nifti_image *nim);
00418 int * nifti_get_intlist (int nvals , const char *str);
00419 char * nifti_strdup (const char *str);
00420 int valid_nifti_extensions(const nifti_image *nim);
00421
00422
00423
00424
00425
00426
00427
00428 #define NIFTI_ECODE_IGNORE 0
00429
00430 #define NIFTI_ECODE_DICOM 2
00431
00432 #define NIFTI_ECODE_AFNI 4
00433
00434
00435 #define NIFTI_ECODE_COMMENT 6
00436
00437 #define NIFTI_ECODE_XCEDE 8
00438
00439
00440
00441
00442 #define NIFTI_ECODE_JIMDIMINFO 10
00443
00444
00445
00446 #define NIFTI_ECODE_WORKFLOW_FWDS 12
00447
00448
00449
00450
00451 #define NIFTI_ECODE_FREESURFER 14
00452
00453 #define NIFTI_MAX_ECODE 14
00454
00455
00456 #define NIFTI_FTYPE_ANALYZE 0
00457 #define NIFTI_FTYPE_NIFTI1_1 1
00458 #define NIFTI_FTYPE_NIFTI1_2 2
00459 #define NIFTI_FTYPE_ASCII 3
00460 #define NIFTI_MAX_FTYPE 3
00461
00462
00463
00464
00465 #ifdef _NIFTI1_IO_C_
00466
00467 typedef struct {
00468 int debug;
00469 int skip_blank_ext;
00470 } nifti_global_options;
00471
00472 typedef struct {
00473 int type;
00474 int nbyper;
00475 int swapsize;
00476 char * name;
00477 } nifti_type_ele;
00478
00479 #undef LNI_FERR
00480 #define LNI_FERR(func,msg,file) \
00481 fprintf(stderr,"** ERROR (%s): %s '%s'\n",func,msg,file)
00482
00483 #undef swap_2
00484 #undef swap_4
00485 #define swap_2(s) nifti_swap_2bytes(1,&(s))
00486 #define swap_4(v) nifti_swap_4bytes(1,&(v))
00487
00488
00489
00490
00491 #undef IS_GOOD_FLOAT
00492 #undef FIXED_FLOAT
00493
00494 #ifdef isfinite
00495 # define IS_GOOD_FLOAT(x) isfinite(x)
00496 # define FIXED_FLOAT(x) (isfinite(x) ? (x) : 0)
00497 #else
00498 # define IS_GOOD_FLOAT(x) 1
00499 # define FIXED_FLOAT(x) (x)
00500 #endif
00501
00502 #undef ASSIF
00503 #define ASSIF(p,v) if( (p)!=NULL ) *(p) = (v)
00504
00505 #undef MSB_FIRST
00506 #undef LSB_FIRST
00507 #undef REVERSE_ORDER
00508 #define LSB_FIRST 1
00509 #define MSB_FIRST 2
00510 #define REVERSE_ORDER(x) (3-(x))
00511
00512 #define LNI_MAX_NIA_EXT_LEN 100000
00513
00514 #endif
00515
00516
00517
00518 #ifdef __cplusplus
00519 }
00520 #endif
00521
00522
00523 #endif