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