Skip to content

AFNI/NIfTI Server

Sections
Personal tools
You are here: Home » AFNI » Documentation

Doxygen Source Code Documentation


Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search  

thd_ctfread.c File Reference

#include "mrilib.h"
#include "thd.h"

Go to the source code of this file.


Data Structures

struct  HeadModel_Info
struct  Image_Info
struct  SAM_HDR
struct  Version_2_Header

Defines

#define LEFT_ON_LEFT   0
#define LEFT_ON_RIGHT   1
#define VERSION_1_STR   "CTF_MRI_FORMAT VER 1.0"
#define VERSION_2_STR   "CTF_MRI_FORMAT VER 2.0"
#define VERSION_21_STR   "CTF_MRI_FORMAT VER 2.1"
#define VERSION_22_STR   "CTF_MRI_FORMAT VER 2.2"
#define BADBAD(s)
#define COV_VERSION   1
#define SAM_VERSION   1
#define SAM_TYPE_IMAGE   0
#define SAM_TYPE_WT_ARRAY   1
#define SAM_TYPE_WT_LIST   2
#define SAM_UNIT_COEFF   0
#define SAM_UNIT_MOMENT   1
#define SAM_UNIT_POWER   2
#define SAM_UNIT_SPMZ   3
#define SAM_UNIT_SPMF   4
#define SAM_UNIT_SPMT   5
#define SAM_UNIT_SPMP   6
#define SAM_UNIT_MUSIC   7
#define BADBAD(s)

Typedefs

typedef HeadModel_Info HeadModel_Info
typedef Image_Info Image_Info
typedef Version_2_Header Version_2_Header

Enumerations

enum  { coronal = 0, sagittal, axial }
enum  {
  Modality_MRI = 0, Modality_CT, Modality_PET, Modality_SPECT,
  Modality_OTHER
}

Functions

void swap_4 (void *ppp)
void swap_8 (void *ppp)
void swap_2 (void *ppp)
int CTF_count (double start, double end, double delta)
THD_3dim_datasetTHD_open_ctfmri (char *fname)
void THD_load_ctfmri (THD_datablock *dblk)
THD_3dim_datasetTHD_open_ctfsam (char *fname)
void THD_load_ctfsam (THD_datablock *dblk)

Define Documentation

#define BADBAD  
 

Value:

do{ fprintf(stderr,"** THD_open_ctfsam(%s): %s\n",fname,s);    \
      RETURN(NULL);                                              \
  } while(0)
Macro for bad return.

Definition at line 713 of file thd_ctfread.c.

#define BADBAD  
 

Value:

do{ fprintf(stderr,"** THD_open_ctfmri(%s): %s\n",fname,s);    \
      RETURN(NULL);                                              \
  } while(0)
Macro for bad return.

Definition at line 713 of file thd_ctfread.c.

Referenced by THD_open_ctfmri(), and THD_open_ctfsam().

#define COV_VERSION   1
 

Definition at line 627 of file thd_ctfread.c.

#define LEFT_ON_LEFT   0
 

Definition at line 15 of file thd_ctfread.c.

#define LEFT_ON_RIGHT   1
 

Definition at line 16 of file thd_ctfread.c.

#define SAM_TYPE_IMAGE   0
 

SAM file types *

Definition at line 632 of file thd_ctfread.c.

#define SAM_TYPE_WT_ARRAY   1
 

Definition at line 633 of file thd_ctfread.c.

#define SAM_TYPE_WT_LIST   2
 

Definition at line 634 of file thd_ctfread.c.

#define SAM_UNIT_COEFF   0
 

define SAM unit types *

Definition at line 638 of file thd_ctfread.c.

#define SAM_UNIT_MOMENT   1
 

Definition at line 639 of file thd_ctfread.c.

#define SAM_UNIT_MUSIC   7
 

Definition at line 645 of file thd_ctfread.c.

#define SAM_UNIT_POWER   2
 

Definition at line 640 of file thd_ctfread.c.

#define SAM_UNIT_SPMF   4
 

Definition at line 642 of file thd_ctfread.c.

#define SAM_UNIT_SPMP   6
 

Definition at line 644 of file thd_ctfread.c.

#define SAM_UNIT_SPMT   5
 

Definition at line 643 of file thd_ctfread.c.

#define SAM_UNIT_SPMZ   3
 

Definition at line 641 of file thd_ctfread.c.

#define SAM_VERSION   1
 

Definition at line 628 of file thd_ctfread.c.

#define VERSION_1_STR   "CTF_MRI_FORMAT VER 1.0"
 

Definition at line 20 of file thd_ctfread.c.

#define VERSION_21_STR   "CTF_MRI_FORMAT VER 2.1"
 

Definition at line 22 of file thd_ctfread.c.

#define VERSION_22_STR   "CTF_MRI_FORMAT VER 2.2"
 

Definition at line 23 of file thd_ctfread.c.

Referenced by THD_open_ctfmri().

#define VERSION_2_STR   "CTF_MRI_FORMAT VER 2.0"
 

Definition at line 21 of file thd_ctfread.c.


Typedef Documentation

typedef struct HeadModel_Info HeadModel_Info
 

typedef struct Image_Info Image_Info
 

typedef struct Version_2_Header Version_2_Header
 


Enumeration Type Documentation

anonymous enum
 

Enumeration values:
coronal 
sagittal 
axial 

Definition at line 13 of file thd_ctfread.c.

00013 { coronal=0, sagittal, axial };

anonymous enum
 

Enumeration values:
Modality_MRI 
Modality_CT 
Modality_PET 
Modality_SPECT 
Modality_OTHER 

Definition at line 18 of file thd_ctfread.c.


Function Documentation

int CTF_count double    start,
double    end,
double    delta
 

Function to count slices like CTF does.

Definition at line 144 of file thd_ctfread.c.

Referenced by THD_open_ctfsam().

00145 {
00146    int nn=0 ; double cc ;
00147    for( cc=start ; cc <= (end+1.0e-6) ; cc += delta ) nn++ ;
00148    return nn ;
00149 }

void swap_2 void *    ppp [static]
 

Swap the 2 bytes pointed to by ppp: ab -> ba.

Definition at line 123 of file thd_ctfread.c.

Referenced by ART_send_volume(), disp_numeric_data(), ge4_swap_all_bytes(), main(), mri_read3D_analyze75(), mri_read_analyze75(), swap_analyze_hdr(), THD_open_analyze(), THD_open_ctfmri(), and write_data_to_file().

00124 {
00125    unsigned char *pntr = (unsigned char *) ppp ;
00126    unsigned char b0, b1;
00127 
00128    b0 = *pntr; b1 = *(pntr+1);
00129    *pntr = b1; *(pntr+1) = b0;
00130 }

void swap_4 void *    ppp [static]
 

Swap the 4 bytes pointed to by ppp: abcd -> dcba.

Definition at line 95 of file thd_ctfread.c.

Referenced by disp_numeric_data(), ge4_swap_all_bytes(), ge_header(), main(), mri_imcount_siemens(), mri_read(), mri_read_siemens(), read_ge_header(), read_ge_image(), read_socket(), swap_analyze_hdr(), THD_open_ctfmri(), THD_open_ctfsam(), and write_data_to_file().

00096 {
00097    unsigned char *pntr = (unsigned char *) ppp ;
00098    unsigned char b0, b1, b2, b3;
00099 
00100    b0 = *pntr; b1 = *(pntr+1); b2 = *(pntr+2); b3 = *(pntr+3);
00101    *pntr = b3; *(pntr+1) = b2; *(pntr+2) = b1; *(pntr+3) = b0;
00102 }

void swap_8 void *    ppp [static]
 

Swap the 8 bytes pointed to by ppp: abcdefgh -> hgfedcba.

Definition at line 107 of file thd_ctfread.c.

Referenced by mri_read_siemens(), THD_load_ctfsam(), and THD_open_ctfsam().

00108 {
00109    unsigned char *pntr = (unsigned char *) ppp ;
00110    unsigned char b0, b1, b2, b3;
00111    unsigned char b4, b5, b6, b7;
00112 
00113    b0 = *pntr    ; b1 = *(pntr+1); b2 = *(pntr+2); b3 = *(pntr+3);
00114    b4 = *(pntr+4); b5 = *(pntr+5); b6 = *(pntr+6); b7 = *(pntr+7);
00115 
00116    *pntr     = b7; *(pntr+1) = b6; *(pntr+2) = b5; *(pntr+3) = b4;
00117    *(pntr+4) = b3; *(pntr+5) = b2; *(pntr+6) = b1; *(pntr+7) = b0;
00118 }

void THD_load_ctfmri THD_datablock   dblk
 

Actually load data from a CTF MRI file into a dataset. Adapted from THD_load_analyze(). --------------------------------------------------------------------

Definition at line 514 of file thd_ctfread.c.

References AFMALL, THD_datablock::brick, THD_diskptr::brick_name, THD_diskptr::byte_order, DATABLOCK_MEM_MALLOC, DBLK_ARRAY, DBLK_BRICK, DBLK_BRICK_BYTES, DBLK_BRICK_NVOX, DBLK_BRICK_TYPE, THD_diskptr::dimsizes, THD_datablock::diskptr, ENTRY, free, ISVALID_DATABLOCK, THD_datablock::malloc_type, mri_fix_data_pointer(), mri_short_order(), mri_swap2(), THD_diskptr::nvals, nz, STORAGE_BY_CTFMRI, and THD_diskptr::storage_mode.

Referenced by THD_load_datablock().

00515 {
00516    THD_diskptr *dkptr ;
00517    int nx,ny,nz,nv , nxy,nxyz,nxyzv , ibr,nbad ;
00518    FILE *fp ;
00519    void *ptr ;
00520 
00521 ENTRY("THD_load_ctfmri") ;
00522 
00523    /*-- check inputs --*/
00524 
00525    if( !ISVALID_DATABLOCK(dblk)                         ||
00526        dblk->diskptr->storage_mode != STORAGE_BY_CTFMRI ||
00527        dblk->brick == NULL                                ) EXRETURN ;
00528 
00529    dkptr = dblk->diskptr ;
00530 
00531    /* open and position file at start of data (after header) */
00532 
00533    fp = fopen( dkptr->brick_name , "rb" ) ;  /* .mri file */
00534    if( fp == NULL ) EXRETURN ;
00535 
00536    /*-- allocate space for data --*/
00537 
00538    nx = dkptr->dimsizes[0] ;
00539    ny = dkptr->dimsizes[1] ; nxy   = nx * ny   ;
00540    nz = dkptr->dimsizes[2] ; nxyz  = nxy * nz  ;
00541    nv = dkptr->nvals       ; nxyzv = nxyz * nv ;
00542 
00543    /* 26 Feb 2005: seek backwards from end,
00544                    instead of forwards from start */
00545 
00546 #if 0
00547    fseek( fp , sizeof(Version_2_Header) , SEEK_SET ) ;  /* old */
00548 #else
00549    switch( DBLK_BRICK_TYPE(dblk,0) ){
00550      case MRI_float: ibr = sizeof(float) ; break ;   /* illegal */
00551      case MRI_short: ibr = sizeof(short) ; break ;
00552      case MRI_byte:  ibr = sizeof(byte)  ; break ;
00553    }
00554    fseek( fp , -ibr*nxyzv , SEEK_END ) ;                /* new */
00555 #endif
00556 
00557    dblk->malloc_type = DATABLOCK_MEM_MALLOC ;
00558 
00559    /*-- malloc space for each brick separately --*/
00560 
00561    for( nbad=ibr=0 ; ibr < nv ; ibr++ ){
00562      if( DBLK_ARRAY(dblk,ibr) == NULL ){
00563        ptr = AFMALL(void, DBLK_BRICK_BYTES(dblk,ibr) ) ;
00564        mri_fix_data_pointer( ptr ,  DBLK_BRICK(dblk,ibr) ) ;
00565        if( ptr == NULL ) nbad++ ;
00566      }
00567    }
00568 
00569    /*-- if couldn't get them all, take our ball and go home in a snit --*/
00570 
00571    if( nbad > 0 ){
00572      fprintf(stderr,
00573              "\n** failed to malloc %d CTR MRI bricks out of %d\n\a",nbad,nv);
00574      for( ibr=0 ; ibr < nv ; ibr++ ){
00575        if( DBLK_ARRAY(dblk,ibr) != NULL ){
00576          free(DBLK_ARRAY(dblk,ibr)) ;
00577          mri_fix_data_pointer( NULL , DBLK_BRICK(dblk,ibr) ) ;
00578        }
00579      }
00580      fclose(fp) ; EXRETURN ;
00581    }
00582 
00583 
00584    /*-- read data from .img file into sub-brick arrays! --*/
00585 
00586    for( ibr=0 ; ibr < nv ; ibr++ )
00587      fread( DBLK_ARRAY(dblk,ibr), 1, DBLK_BRICK_BYTES(dblk,ibr), fp ) ;
00588 
00589    fclose(fp) ;
00590 
00591    /*-- swap bytes? --*/
00592 
00593    if( dkptr->byte_order != mri_short_order() ){
00594      for( ibr=0 ; ibr < nv ; ibr++ ){
00595        switch( DBLK_BRICK_TYPE(dblk,ibr) ){
00596          case MRI_short:
00597            mri_swap2( DBLK_BRICK_NVOX(dblk,ibr) , DBLK_ARRAY(dblk,ibr) ) ;
00598          break ;
00599        }
00600      }
00601    }
00602 
00603    EXRETURN ;
00604 }

void THD_load_ctfsam THD_datablock   dblk
 

Actually load data from a CTF SAM file into a dataset. --------------------------------------------------------------------

Definition at line 953 of file thd_ctfread.c.

References AFMALL, THD_datablock::brick, THD_diskptr::brick_name, THD_diskptr::byte_order, calloc, DATABLOCK_MEM_MALLOC, DBLK_ARRAY, DBLK_BRICK, DBLK_BRICK_BYTES, THD_diskptr::dimsizes, THD_datablock::diskptr, ENTRY, free, ISVALID_DATABLOCK, THD_datablock::malloc_type, mri_fix_data_pointer(), mri_short_order(), THD_diskptr::nvals, nz, STORAGE_BY_CTFSAM, THD_diskptr::storage_mode, swap, and swap_8().

Referenced by THD_load_datablock().

00954 {
00955    THD_diskptr *dkptr ;
00956    int nx,ny,nz,nv , nxy,nxyz,nxyzv , ibr,nbad , ii,swap ;
00957    FILE *fp ;
00958    void *ptr ;
00959    double *dbar ;
00960    float  *ftar ;
00961 
00962 ENTRY("THD_load_ctfsam") ;
00963 
00964    /*-- check inputs --*/
00965 
00966    if( !ISVALID_DATABLOCK(dblk)                         ||
00967        dblk->diskptr->storage_mode != STORAGE_BY_CTFSAM ||
00968        dblk->brick == NULL                                ) EXRETURN ;
00969 
00970    dkptr = dblk->diskptr ;
00971 
00972    /*-- allocate space for data --*/
00973 
00974    nx = dkptr->dimsizes[0] ;
00975    ny = dkptr->dimsizes[1] ; nxy   = nx * ny   ;
00976    nz = dkptr->dimsizes[2] ; nxyz  = nxy * nz  ;
00977    nv = dkptr->nvals       ; nxyzv = nxyz * nv ;
00978 
00979    /* position file 8*nxyzv bytes before end of file */
00980 
00981    fp = fopen( dkptr->brick_name , "rb" ) ;  /* .svl file */
00982    if( fp == NULL ) EXRETURN ;
00983 
00984    /* 26 Feb 2005: instead of skipping the header,
00985                    whose size varies with the SAM version number,
00986                    just seek backwards from the end to the correct size */
00987 
00988    fseek( fp , -sizeof(double)*nxyzv , SEEK_END ) ;
00989 
00990    dblk->malloc_type = DATABLOCK_MEM_MALLOC ;
00991 
00992    /*-- malloc space for each brick separately --*/
00993 
00994    for( nbad=ibr=0 ; ibr < nv ; ibr++ ){
00995      if( DBLK_ARRAY(dblk,ibr) == NULL ){
00996        ptr = AFMALL(void, DBLK_BRICK_BYTES(dblk,ibr) ) ;
00997        mri_fix_data_pointer( ptr ,  DBLK_BRICK(dblk,ibr) ) ;
00998        if( ptr == NULL ) nbad++ ;
00999      }
01000    }
01001 
01002    /*-- if couldn't get them all, take our ball and go home in a snit --*/
01003 
01004    if( nbad > 0 ){
01005      fprintf(stderr,
01006              "\n** failed to malloc %d CTR MRI bricks out of %d\n\a",nbad,nv);
01007      for( ibr=0 ; ibr < nv ; ibr++ ){
01008        if( DBLK_ARRAY(dblk,ibr) != NULL ){
01009          free(DBLK_ARRAY(dblk,ibr)) ;
01010          mri_fix_data_pointer( NULL , DBLK_BRICK(dblk,ibr) ) ;
01011        }
01012      }
01013      fclose(fp) ; EXRETURN ;
01014    }
01015 
01016    /*-- SAM data is stored as doubles,
01017         but we have to store it in AFNI as floats --*/
01018 
01019    dbar = (double *) calloc(sizeof(double),nxyz) ;     /* workspace */
01020    swap = ( dkptr->byte_order != mri_short_order() ) ;
01021 
01022    for( ibr=0 ; ibr < nv ; ibr++ ){            /* loop over sub-bricks */
01023      fread( dbar, 1, sizeof(double)*nxyz, fp ) ; /* read data to workspace */
01024      ftar = DBLK_ARRAY(dblk,ibr) ;               /* float array in dataset */
01025      for( ii=0 ; ii < nxyz ; ii++ ){             /* loop over voxels */
01026        if( swap ) swap_8(dbar+ii) ;                /* swap it */
01027        ftar[ii] = dbar[ii] ;                       /* save it as a float */
01028      }
01029    }
01030 
01031    fclose(fp) ; free(dbar) ;  /* toss out the trash */
01032    EXRETURN ;
01033 }

THD_3dim_dataset* THD_open_ctfmri char *    fname
 

Open a CTF .mri file as an unpopulated AFNI dataset. It will be populated later, in THD_load_ctfmri(). -------------------------------------------------------------------

Definition at line 156 of file thd_ctfread.c.

References ADN_datum_all, ADN_func_type, ADN_malloc_type, ADN_none, ADN_nvals, ADN_nxyz, ADN_prefix, ADN_type, ADN_view_type, ADN_xyzdel, ADN_xyzorg, ADN_xyzorient, ANAT_MRAN_TYPE, BADBAD, THD_diskptr::brick_name, THD_diskptr::byte_order, Version_2_Header::clippingRange, DATABLOCK_MEM_MALLOC, Version_2_Header::dataSize, THD_3dim_dataset::dblk, THD_datablock::diskptr, EDIT_dset_items(), EDIT_empty_copy(), ENTRY, HEAD_ANAT_TYPE, Version_2_Header::headModel, Version_2_Header::headOrigin_axial, Version_2_Header::headOrigin_coronal, Version_2_Header::headOrigin_sagittal, THD_3dim_dataset::idcode, Version_2_Header::identifierString, THD_ivec3::ijk, Version_2_Header::imageOrientation, Version_2_Header::imageSize, Version_2_Header::interpolatedFlag, HeadModel_Info::LeftEar_Axi, HeadModel_Info::LeftEar_Cor, HeadModel_Info::LeftEar_Sag, LOAD_IVEC3, MCW_hash_idcode(), MCW_strncpy, Version_2_Header::mmPerPixel_axial, Version_2_Header::mmPerPixel_coronal, Version_2_Header::mmPerPixel_sagittal, mri_short_order(), myXtNew, HeadModel_Info::Nasion_Axi, HeadModel_Info::Nasion_Cor, HeadModel_Info::Nasion_Sag, THD_usertaglist::num, nz, OR3OK, ORCODE, ORI_A2P_TYPE, ORI_L2R_TYPE, ORI_S2I_TYPE, Version_2_Header::originalSliceThickness, Version_2_Header::orthogonalFlag, RETURN, REVERSE_ORDER, HeadModel_Info::RightEar_Axi, HeadModel_Info::RightEar_Cor, HeadModel_Info::RightEar_Sag, Version_2_Header::rotate_axial, Version_2_Header::rotate_coronal, Version_2_Header::rotate_sagittal, THD_usertag::set, STORAGE_BY_CTFMRI, THD_diskptr::storage_mode, MCW_idcode::str, swap, swap_2(), swap_4(), THD_usertaglist::tag, TAG_SETLABEL, TAGLIST_SETLABEL, THD_3dim_dataset::tagset, THD_3dind_to_3dmm(), THD_3dmm_to_dicomm(), THD_filesize(), THD_MAX_PREFIX, THD_trailname(), THD_usertag::ti, Version_2_Header::transformMatrix, UNLOAD_FVEC3, THD_usertag::val, VERSION_22_STR, VIEW_ORIGINAL_TYPE, THD_usertag::x, THD_fvec3::xyz, THD_usertag::y, and THD_usertag::z.

Referenced by THD_init_session(), and THD_open_one_dataset().

00157 {
00158    FILE *fp ;
00159    Version_2_Header hh ;
00160    int ii,nn , swap ;
00161    THD_3dim_dataset *dset=NULL ;
00162    char prefix[THD_MAX_PREFIX] , *ppp , tname[12] , ori[4] ;
00163    THD_ivec3 nxyz , orixyz ;
00164    THD_fvec3 dxyz , orgxyz ;
00165    int iview ;
00166    int ngood , length , datum_type , datum_len , oxx,oyy,ozz ;
00167    int   nx,ny,nz ;
00168    float dx,dy,dz , xorg,yorg,zorg ;
00169 
00170 ENTRY("THD_open_ctfmri") ;
00171 
00172    /* open input file */
00173 
00174    if( fname == NULL || *fname == '\0' ) BADBAD("bad input filename");
00175    fp = fopen( fname , "rb" ) ;
00176    if( fp == NULL )                      BADBAD("can't open input file");
00177 
00178    /* read 1028 byte header */
00179 
00180    nn = fread( &hh , sizeof(hh) , 1 , fp ) ;
00181    fclose(fp) ;
00182    if( nn <= 0 )                         BADBAD("can't read input file");
00183 
00184    /* check if header string matches what we want */
00185 
00186    hh.identifierString[31] = '\0' ;  /* make sure is terminated */
00187    if( strcmp(hh.identifierString,VERSION_22_STR) != 0 ) BADBAD("bad version string");
00188    if( hh.imageSize == 0 )                               BADBAD("bad imageSize") ;
00189 
00190    /* determine if must swap header */
00191 
00192    swap = (hh.imageSize != 256) ;
00193 
00194    if( swap ){                          /* swap bytes in various header fields */
00195      swap_2(&hh.imageSize              ) ;
00196      swap_2(&hh.dataSize               ) ;
00197      swap_2(&hh.clippingRange          ) ;
00198      swap_2(&hh.imageOrientation       ) ;
00199      swap_4(&hh.mmPerPixel_sagittal    ) ;
00200      swap_4(&hh.mmPerPixel_coronal     ) ;
00201      swap_4(&hh.mmPerPixel_axial       ) ;
00202      swap_4(&hh.headOrigin_sagittal    ) ;
00203      swap_4(&hh.headOrigin_coronal     ) ;
00204      swap_4(&hh.headOrigin_axial       ) ;
00205      swap_4(&hh.rotate_coronal         ) ;
00206      swap_4(&hh.rotate_sagittal        ) ;
00207      swap_4(&hh.rotate_axial           ) ;
00208      swap_2(&hh.orthogonalFlag         ) ;
00209      swap_2(&hh.interpolatedFlag       ) ;
00210      swap_4(&hh.originalSliceThickness ) ;
00211      swap_2(&hh.headModel.Nasion_Sag   ) ;
00212      swap_2(&hh.headModel.Nasion_Cor   ) ;
00213      swap_2(&hh.headModel.Nasion_Axi   ) ;
00214      swap_2(&hh.headModel.LeftEar_Sag  ) ;
00215      swap_2(&hh.headModel.LeftEar_Cor  ) ;
00216      swap_2(&hh.headModel.LeftEar_Axi  ) ;
00217      swap_2(&hh.headModel.RightEar_Sag ) ;
00218      swap_2(&hh.headModel.RightEar_Cor ) ;
00219      swap_2(&hh.headModel.RightEar_Axi ) ;
00220 
00221      swap_4(&hh.transformMatrix[0][0]  ) ;   /* this stuff not used yet */
00222      swap_4(&hh.transformMatrix[0][1]  ) ;
00223      swap_4(&hh.transformMatrix[0][2]  ) ;
00224      swap_4(&hh.transformMatrix[0][3]  ) ;
00225      swap_4(&hh.transformMatrix[1][0]  ) ;
00226      swap_4(&hh.transformMatrix[1][1]  ) ;
00227      swap_4(&hh.transformMatrix[1][2]  ) ;
00228      swap_4(&hh.transformMatrix[1][3]  ) ;
00229      swap_4(&hh.transformMatrix[2][0]  ) ;
00230      swap_4(&hh.transformMatrix[2][1]  ) ;
00231      swap_4(&hh.transformMatrix[2][2]  ) ;
00232      swap_4(&hh.transformMatrix[2][3]  ) ;
00233      swap_4(&hh.transformMatrix[3][0]  ) ;
00234      swap_4(&hh.transformMatrix[3][1]  ) ;
00235      swap_4(&hh.transformMatrix[3][2]  ) ;
00236      swap_4(&hh.transformMatrix[3][3]  ) ;
00237    }
00238 
00239    /* simple checks on header stuff */
00240 
00241    if( hh.imageSize != 256           ||
00242        hh.dataSize  <  1             ||
00243        hh.dataSize  >  2             ||
00244        hh.mmPerPixel_sagittal <= 0.0 ||
00245        hh.mmPerPixel_coronal  <= 0.0 ||
00246        hh.mmPerPixel_axial    <= 0.0   ) BADBAD("bad header data") ;
00247 
00248    /*- 16 Mar 2005: instead of complaining about negative Origins,
00249                     just reset them to something semi-reasonable;
00250        I just get by with a little help from my friends
00251        - Zuxiang Li in this case.                                -*/
00252 
00253    if( hh.headOrigin_sagittal <= 0.0 ) hh.headOrigin_sagittal = hh.imageSize/2.;
00254    if( hh.headOrigin_coronal  <= 0.0 ) hh.headOrigin_coronal  = hh.imageSize/2.;
00255    if( hh.headOrigin_axial    <= 0.0 ) hh.headOrigin_axial    = hh.imageSize/2.;
00256 
00257    /* debugging code to print header information */
00258 #if 0
00259    printf("\n") ;
00260    printf("*** CTF MRI filename   = %s\n",fname                 ) ;
00261    printf("identifierString       = %s\n",hh.identifierString   ) ;
00262    printf("imageSize              = %d\n",hh.imageSize          ) ;
00263    printf("dataSize               = %d\n",hh.dataSize           ) ;
00264    printf("clippingRange          = %d\n",hh.clippingRange      ) ;
00265    printf("imageOrientation       = %d\n",hh.imageOrientation   ) ;
00266    printf("mmPerPixel_sagittal    = %f\n",hh.mmPerPixel_sagittal) ;
00267    printf("mmPerPixel_coronal     = %f\n",hh.mmPerPixel_coronal ) ;
00268    printf("mmPerPixel_axial       = %f\n",hh.mmPerPixel_axial   ) ;
00269    printf("headOrigin_sagittal    = %f\n",hh.headOrigin_sagittal) ;
00270    printf("headOrigin_coronal     = %f\n",hh.headOrigin_coronal ) ;
00271    printf("headOrigin_axial       = %f\n",hh.headOrigin_axial   ) ;
00272    printf("rotate_coronal         = %f\n",hh.rotate_coronal     ) ;
00273    printf("rotate_sagittal        = %f\n",hh.rotate_sagittal    ) ;
00274    printf("rotate_axial           = %f\n",hh.rotate_axial       ) ;
00275    printf("orthogonalFlag         = %d\n",hh.orthogonalFlag     ) ;
00276    printf("interpolatedFlag       = %d\n",hh.interpolatedFlag   ) ;
00277    printf("originalSliceThickness = %f\n",hh.originalSliceThickness ) ;
00278    printf("\n") ;
00279    printf("headModel.Nasion_Sag   = %d\n",hh.headModel.Nasion_Sag  ) ;
00280    printf("headModel.Nasion_Cor   = %d\n",hh.headModel.Nasion_Cor  ) ;
00281    printf("headModel.Nasion_Axi   = %d\n",hh.headModel.Nasion_Axi  ) ;
00282    printf("headModel.LeftEar_Sag  = %d\n",hh.headModel.LeftEar_Sag ) ;
00283    printf("headModel.LeftEar_Cor  = %d\n",hh.headModel.LeftEar_Cor ) ;
00284    printf("headModel.LeftEar_Axi  = %d\n",hh.headModel.LeftEar_Axi ) ;
00285    printf("headModel.RightEar_Sag = %d\n",hh.headModel.RightEar_Sag) ;
00286    printf("headModel.RightEar_Cor = %d\n",hh.headModel.RightEar_Cor) ;
00287    printf("headModel.RightEar_Axi = %d\n",hh.headModel.RightEar_Axi) ;
00288    printf("\n") ;
00289    printf("transformMatrix:\n"
00290           "  [ %9.4f %9.4f %9.4f %9.4f ]\n"
00291           "  [ %9.4f %9.4f %9.4f %9.4f ]\n"
00292           "  [ %9.4f %9.4f %9.4f %9.4f ]\n"
00293           "  [ %9.4f %9.4f %9.4f %9.4f ]\n" ,
00294       hh.transformMatrix[0][0] , hh.transformMatrix[0][1] ,
00295         hh.transformMatrix[0][2] , hh.transformMatrix[0][3] ,
00296       hh.transformMatrix[1][0] , hh.transformMatrix[1][1] ,
00297         hh.transformMatrix[1][2] , hh.transformMatrix[1][3] ,
00298       hh.transformMatrix[2][0] , hh.transformMatrix[2][1] ,
00299         hh.transformMatrix[2][2] , hh.transformMatrix[2][3] ,
00300       hh.transformMatrix[3][0] , hh.transformMatrix[3][1] ,
00301         hh.transformMatrix[3][2] , hh.transformMatrix[3][3]  ) ;
00302 #endif
00303 
00304    /* determine if file is big enough to hold all data it claims */
00305 
00306    nn = THD_filesize(fname) ;
00307    if( nn < hh.dataSize*hh.imageSize*hh.imageSize*hh.imageSize )
00308      BADBAD("input file too small") ;
00309 
00310    /*** from here, a lot of code is adapted from thd_analyzeread.c ***/
00311 
00312    datum_len = hh.dataSize ;
00313    switch( datum_len ){                         /* the only 2 cases */
00314      case 1:  datum_type = MRI_byte ; break ;
00315      case 2:  datum_type = MRI_short; break ;
00316    }
00317    nx = ny = nz = hh.imageSize ;              /* volumes are cubes! */
00318 
00319    /* set orientation:
00320       for now, assume (based on 1 sample) that data is stored in ASL or ASR order */
00321 
00322    ori[0] = 'A' ;          /* x is A-P */
00323    ori[1] = 'S' ;          /* y is S-I */
00324 
00325    /* determine if z is L-R or R-L from position of markers */
00326 
00327    ori[2] = (hh.headModel.LeftEar_Sag <= hh.headModel.RightEar_Sag) ? 'L' : 'R' ;
00328 
00329    oxx = ORCODE(ori[0]); oyy = ORCODE(ori[1]); ozz = ORCODE(ori[2]);
00330    if( !OR3OK(oxx,oyy,ozz) ){
00331      oxx = ORI_A2P_TYPE; oyy = ORI_S2I_TYPE; ozz = ORI_L2R_TYPE;   /** ASL? **/
00332    }
00333 
00334    /* now set grid size, keeping in mind that
00335        A-P is positive and P-A is negative,
00336        R-L is positive and L-R is negative,
00337        I-S is positive and S-I is negative.   */
00338 
00339    switch( ori[0] ){
00340      case 'A':  dx =  hh.mmPerPixel_coronal ; xorg = hh.headOrigin_coronal ; break ;
00341      case 'P':  dx = -hh.mmPerPixel_coronal ; xorg = hh.headOrigin_coronal ; break ;
00342      case 'R':  dx =  hh.mmPerPixel_sagittal; xorg = hh.headOrigin_sagittal; break ;
00343      case 'L':  dx = -hh.mmPerPixel_sagittal; xorg = hh.headOrigin_sagittal; break ;
00344      case 'I':  dx =  hh.mmPerPixel_axial   ; xorg = hh.headOrigin_axial   ; break ;
00345      case 'S':  dx = -hh.mmPerPixel_axial   ; xorg = hh.headOrigin_axial   ; break ;
00346    }
00347    switch( ori[1] ){
00348      case 'A':  dy =  hh.mmPerPixel_coronal ; yorg = hh.headOrigin_coronal ; break ;
00349      case 'P':  dy = -hh.mmPerPixel_coronal ; yorg = hh.headOrigin_coronal ; break ;
00350      case 'R':  dy =  hh.mmPerPixel_sagittal; yorg = hh.headOrigin_sagittal; break ;
00351      case 'L':  dy = -hh.mmPerPixel_sagittal; yorg = hh.headOrigin_sagittal; break ;
00352      case 'I':  dy =  hh.mmPerPixel_axial   ; yorg = hh.headOrigin_axial   ; break ;
00353      case 'S':  dy = -hh.mmPerPixel_axial   ; yorg = hh.headOrigin_axial   ; break ;
00354    }
00355    switch( ori[2] ){
00356      case 'A':  dz =  hh.mmPerPixel_coronal ; zorg = hh.headOrigin_coronal ; break ;
00357      case 'P':  dz = -hh.mmPerPixel_coronal ; zorg = hh.headOrigin_coronal ; break ;
00358      case 'R':  dz =  hh.mmPerPixel_sagittal; zorg = hh.headOrigin_sagittal; break ;
00359      case 'L':  dz = -hh.mmPerPixel_sagittal; zorg = hh.headOrigin_sagittal; break ;
00360      case 'I':  dz =  hh.mmPerPixel_axial   ; zorg = hh.headOrigin_axial   ; break ;
00361      case 'S':  dz = -hh.mmPerPixel_axial   ; zorg = hh.headOrigin_axial   ; break ;
00362    }
00363 
00364    /* At this point, (xorg,yorg,zorg) are voxel indices;
00365       now, translate them into shifts such that if voxel
00366       index ii is the location of x=0, then xorg+ii*dx=0. */
00367 
00368    xorg = -dx*xorg ; yorg = -dy*yorg ; zorg = -dz*zorg ;
00369 
00370    /*-- make a dataset --*/
00371 
00372    dset = EDIT_empty_copy(NULL) ;
00373 
00374    dset->idcode.str[0] = 'C' ;  /* overwrite 1st 3 bytes */
00375    dset->idcode.str[1] = 'T' ;
00376    dset->idcode.str[2] = 'F' ;
00377 
00378    MCW_hash_idcode( fname , dset ) ;  /* 06 May 2005 */
00379 
00380    ppp = THD_trailname(fname,0) ;                   /* strip directory */
00381    MCW_strncpy( prefix , ppp , THD_MAX_PREFIX ) ;   /* to make prefix */
00382 
00383    nxyz.ijk[0] = nx ; dxyz.xyz[0] = dx ;  /* setup axes lengths and voxel sizes */
00384    nxyz.ijk[1] = ny ; dxyz.xyz[1] = dy ;
00385    nxyz.ijk[2] = nz ; dxyz.xyz[2] = dz ;
00386 
00387    orixyz.ijk[0] = oxx ; orgxyz.xyz[0] = xorg ;
00388    orixyz.ijk[1] = oyy ; orgxyz.xyz[1] = yorg ;
00389    orixyz.ijk[2] = ozz ; orgxyz.xyz[2] = zorg ;
00390 
00391    iview = VIEW_ORIGINAL_TYPE ;
00392 
00393    /*-- actually send the values above into the dataset header --*/
00394 
00395    EDIT_dset_items( dset ,
00396                       ADN_prefix      , prefix ,
00397                       ADN_datum_all   , datum_type ,
00398                       ADN_nxyz        , nxyz ,
00399                       ADN_xyzdel      , dxyz ,
00400                       ADN_xyzorg      , orgxyz ,
00401                       ADN_xyzorient   , orixyz ,
00402                       ADN_malloc_type , DATABLOCK_MEM_MALLOC ,
00403                       ADN_nvals       , 1 ,
00404                       ADN_type        , HEAD_ANAT_TYPE ,
00405                       ADN_view_type   , iview ,
00406                       ADN_func_type   , ANAT_MRAN_TYPE ,
00407                     ADN_none ) ;
00408 
00409    /*-- set byte order (for reading from disk) --*/
00410 
00411    ii = mri_short_order() ;
00412    if( swap ) ii = REVERSE_ORDER(ii) ;
00413    dset->dblk->diskptr->byte_order = ii ;
00414 
00415    /*-- flag to read data from disk using CTF MRI mode --*/
00416 
00417    dset->dblk->diskptr->storage_mode = STORAGE_BY_CTFMRI ;
00418    strcpy( dset->dblk->diskptr->brick_name , fname ) ;
00419 
00420    /*-- for fun, add a set of tags for MEG fiducial points, if present --*/
00421 
00422    if( hh.headModel.LeftEar_Sag != hh.headModel.RightEar_Sag ){
00423      THD_usertaglist *tagset = myXtNew(THD_usertaglist) ;
00424      int nas_ii,nas_jj,nas_kk , lft_ii,lft_jj,lft_kk , rgt_ii,rgt_jj,rgt_kk ;
00425      THD_fvec3 fv ; THD_ivec3 iv ;
00426 
00427      tagset->num = 3 ;
00428      TAGLIST_SETLABEL( tagset , "CTF MEG Fiducials" ) ;
00429 
00430      /* load voxel indexes into dataset of the 3 tag points;
00431         note we have to permute these into the dataset axes order */
00432 
00433      switch( ori[0] ){
00434        case 'P':
00435        case 'A':  nas_ii = hh.headModel.Nasion_Cor ;
00436                   lft_ii = hh.headModel.LeftEar_Cor ;
00437                   rgt_ii = hh.headModel.RightEar_Cor ; break ;
00438        case 'R':
00439        case 'L':  nas_ii = hh.headModel.Nasion_Sag ;
00440                   lft_ii = hh.headModel.LeftEar_Sag ;
00441                   rgt_ii = hh.headModel.RightEar_Sag ; break ;
00442        case 'I':
00443        case 'S':  nas_ii = hh.headModel.Nasion_Axi ;
00444                   lft_ii = hh.headModel.LeftEar_Axi ;
00445                   rgt_ii = hh.headModel.RightEar_Axi ; break ;
00446      }
00447      switch( ori[1] ){
00448        case 'P':
00449        case 'A':  nas_jj = hh.headModel.Nasion_Cor ;
00450                   lft_jj = hh.headModel.LeftEar_Cor ;
00451                   rgt_jj = hh.headModel.RightEar_Cor ; break ;
00452        case 'R':
00453        case 'L':  nas_jj = hh.headModel.Nasion_Sag ;
00454                   lft_jj = hh.headModel.LeftEar_Sag ;
00455                   rgt_jj = hh.headModel.RightEar_Sag ; break ;
00456        case 'I':
00457        case 'S':  nas_jj = hh.headModel.Nasion_Axi ;
00458                   lft_jj = hh.headModel.LeftEar_Axi ;
00459                   rgt_jj = hh.headModel.RightEar_Axi ; break ;
00460      }
00461      switch( ori[2] ){
00462        case 'P':
00463        case 'A':  nas_kk = hh.headModel.Nasion_Cor ;
00464                   lft_kk = hh.headModel.LeftEar_Cor ;
00465                   rgt_kk = hh.headModel.RightEar_Cor ; break ;
00466        case 'R':
00467        case 'L':  nas_kk = hh.headModel.Nasion_Sag ;
00468                   lft_kk = hh.headModel.LeftEar_Sag ;
00469                   rgt_kk = hh.headModel.RightEar_Sag ; break ;
00470        case 'I':
00471        case 'S':  nas_kk = hh.headModel.Nasion_Axi ;
00472                   lft_kk = hh.headModel.LeftEar_Axi ;
00473                   rgt_kk = hh.headModel.RightEar_Axi ; break ;
00474      }
00475 
00476      TAG_SETLABEL( tagset->tag[0] , "Nasion" ) ;
00477      LOAD_IVEC3( iv , nas_ii,nas_jj,nas_kk ) ;  /* compute DICOM  */
00478      fv = THD_3dind_to_3dmm( dset , iv ) ;      /* coordinates of */
00479      fv = THD_3dmm_to_dicomm( dset , fv ) ;     /* this point     */
00480      UNLOAD_FVEC3( fv , tagset->tag[0].x , tagset->tag[0].y , tagset->tag[0].z ) ;
00481      tagset->tag[0].val = 0.0 ;
00482      tagset->tag[0].ti  = 0 ;
00483      tagset->tag[0].set = 1 ;
00484 
00485      TAG_SETLABEL( tagset->tag[1] , "Left Ear" ) ;
00486      LOAD_IVEC3( iv , lft_ii,lft_jj,lft_kk ) ;
00487      fv = THD_3dind_to_3dmm( dset , iv ) ;
00488      fv = THD_3dmm_to_dicomm( dset , fv ) ;
00489      UNLOAD_FVEC3( fv , tagset->tag[1].x , tagset->tag[1].y , tagset->tag[1].z ) ;
00490      tagset->tag[1].val = 0.0 ;
00491      tagset->tag[1].ti  = 0 ;
00492      tagset->tag[1].set = 1 ;
00493 
00494      TAG_SETLABEL( tagset->tag[2] , "Right Ear" ) ;
00495      LOAD_IVEC3( iv , rgt_ii,rgt_jj,rgt_kk ) ;
00496      fv = THD_3dind_to_3dmm( dset , iv ) ;
00497      fv = THD_3dmm_to_dicomm( dset , fv ) ;
00498      UNLOAD_FVEC3( fv , tagset->tag[2].x , tagset->tag[2].y , tagset->tag[2].z ) ;
00499      tagset->tag[2].val = 0.0 ;
00500      tagset->tag[2].ti  = 0 ;
00501      tagset->tag[2].set = 1 ;
00502 
00503      dset->tagset = tagset ;
00504    }
00505 
00506    RETURN(dset) ;
00507 }

THD_3dim_dataset* THD_open_ctfsam char *    fname
 

Open a CTF .svl (SAM) file as an unpopulated AFNI dataset. It will be populated later, in THD_load_ctfsam(). -------------------------------------------------------------------

Definition at line 723 of file thd_ctfread.c.

References ADN_datum_all, ADN_func_type, ADN_malloc_type, ADN_none, ADN_nvals, ADN_nxyz, ADN_prefix, ADN_type, ADN_view_type, ADN_xyzdel, ADN_xyzorg, ADN_xyzorient, BADBAD, THD_diskptr::brick_name, SAM_HDR::BWFreq, THD_diskptr::byte_order, CTF_count(), DATABLOCK_MEM_MALLOC, THD_3dim_dataset::dblk, THD_datablock::diskptr, EDIT_dset_items(), EDIT_empty_copy(), ENTRY, FUNC_FIM_TYPE, HEAD_FUNC_TYPE, SAM_HDR::HPFreq, THD_3dim_dataset::idcode, THD_ivec3::ijk, SAM_HDR::LeftPA, SAM_HDR::LPFreq, MCW_hash_idcode(), MCW_strncpy, SAM_HDR::MeanNoise, mri_short_order(), SAM_HDR::MriName, SAM_HDR::Nasion, SAM_HDR::NumChans, SAM_HDR::NumWeights, nz, OR3OK, ORCODE, ORI_I2S_TYPE, ORI_P2A_TYPE, ORI_R2L_TYPE, RETURN, REVERSE_ORDER, SAM_HDR::RightPA, SAM_HDR::SAMType, SAM_HDR::SAMUnit, SAM_HDR::SetName, SAM_HDR::StepSize, STORAGE_BY_CTFSAM, THD_diskptr::storage_mode, MCW_idcode::str, swap, swap_4(), swap_8(), THD_filesize(), THD_MAX_PREFIX, THD_trailname(), SAM_HDR::Version, VIEW_ORIGINAL_TYPE, SAM_HDR::XEnd, SAM_HDR::XStart, THD_fvec3::xyz, SAM_HDR::YEnd, SAM_HDR::YStart, SAM_HDR::ZEnd, and SAM_HDR::ZStart.

Referenced by THD_init_session(), and THD_open_one_dataset().

00724 {
00725    FILE *fp ;
00726    SAM_HDR hh ;
00727    char Identity[9] ;
00728    int ii,nn , swap ;
00729    THD_3dim_dataset *dset=NULL ;
00730    char prefix[THD_MAX_PREFIX] , *ppp , tname[12] , ori[4] ;
00731    THD_ivec3 nxyz , orixyz ;
00732    THD_fvec3 dxyz , orgxyz ;
00733    int iview ;
00734    int ngood , length , datum_type , datum_len , oxx,oyy,ozz ;
00735    int   nx,ny,nz ;
00736    float dx,dy,dz , xorg,yorg,zorg ;
00737 
00738 ENTRY("THD_open_ctfsam") ;
00739 
00740    /* open input file */
00741 
00742    if( fname == NULL || *fname == '\0' ) BADBAD("bad input filename");
00743    fp = fopen( fname , "rb" ) ;
00744    if( fp == NULL )                      BADBAD("can't open input file");
00745 
00746    /* read header [1st 8 bytes are "SAMIMAGE"] */
00747 
00748    fread( Identity , 1,8 , fp ) ; Identity[8] = '\0' ;
00749    fread( &hh , sizeof(hh) , 1 , fp ) ;
00750    fclose(fp) ;
00751 
00752    if( strcmp(Identity,"SAMIMAGE") != 0 ) BADBAD("Identity != SAMIMAGE") ;
00753    if( hh.Version                  == 0 ) BADBAD("bad header Version") ;
00754 
00755    swap = (hh.Version < 0) || (hh.Version > 3) ;    /* byte swap? */
00756 
00757    if( swap ){                   /* swap various header fields */
00758      swap_4( &hh.Version    ) ;
00759      swap_4( &hh.NumChans   ) ;
00760      swap_4( &hh.NumWeights ) ;
00761      swap_8( &hh.XStart     ) ;
00762      swap_8( &hh.XEnd       ) ;
00763      swap_8( &hh.YStart     ) ;
00764      swap_8( &hh.YEnd       ) ;
00765      swap_8( &hh.ZStart     ) ;
00766      swap_8( &hh.ZEnd       ) ;
00767      swap_8( &hh.StepSize   ) ;
00768      swap_8( &hh.HPFreq     ) ;
00769      swap_8( &hh.LPFreq     ) ;
00770      swap_8( &hh.BWFreq     ) ;
00771      swap_8( &hh.MeanNoise  ) ;
00772      swap_4( &hh.Nasion[0]  ) ;
00773      swap_4( &hh.RightPA[0] ) ;
00774      swap_4( &hh.LeftPA[0]  ) ;
00775      swap_4( &hh.Nasion[1]  ) ;
00776      swap_4( &hh.RightPA[1] ) ;
00777      swap_4( &hh.LeftPA[1]  ) ;
00778      swap_4( &hh.Nasion[2]  ) ;
00779      swap_4( &hh.RightPA[2] ) ;
00780      swap_4( &hh.LeftPA[2]  ) ;
00781      swap_4( &hh.SAMType    ) ;
00782      swap_4( &hh.SAMUnit    ) ;
00783    }
00784 
00785    /* simple checks on header values */
00786 
00787    if( hh.Version  < 0        ||
00788        hh.Version  > 3        ||  /* 26 Feb 2005 */
00789        hh.XStart   >= hh.XEnd ||
00790        hh.YStart   >= hh.YEnd ||
00791        hh.ZStart   >= hh.ZEnd ||
00792        hh.StepSize <= 0.0       ) BADBAD("bad header data") ;
00793 
00794 #if 0
00795    printf("\n") ;
00796    printf("**CTF SAM : %s\n",fname) ;
00797    printf("Version   = %d\n",hh.Version) ;
00798    printf("NumChans  = %d\n",hh.NumChans) ;
00799    printf("NumWeights= %d\n",hh.NumWeights) ;
00800    printf("XStart    = %g\n",hh.XStart) ;
00801    printf("Xend      = %g\n",hh.XEnd) ;
00802    printf("YStart    = %g\n",hh.YStart) ;
00803    printf("YEnd      = %g\n",hh.YEnd) ;
00804    printf("ZStart    = %g\n",hh.ZStart) ;
00805    printf("Zend      = %g\n",hh.ZEnd) ;
00806    printf("StepSize  = %g\n",hh.StepSize) ;
00807    printf("HPFreq    = %g\n",hh.HPFreq) ;
00808    printf("LPFreq    = %g\n",hh.LPFreq) ;
00809    printf("BWFreq    = %g\n",hh.BWFreq) ;
00810    printf("MeanNoise = %g\n",hh.MeanNoise) ;
00811    printf("Nasion[0] = %d\n",hh.Nasion[0]) ;
00812    printf("Nasion[1] = %d\n",hh.Nasion[1]) ;
00813    printf("Nasion[2] = %d\n",hh.Nasion[2]) ;
00814    printf("RightPA[0]= %d\n",hh.RightPA[0]) ;
00815    printf("RightPA[1]= %d\n",hh.RightPA[1]) ;
00816    printf("RightPA[2]= %d\n",hh.RightPA[2]) ;
00817    printf("LeftPA[0] = %d\n",hh.LeftPA[0]) ;
00818    printf("LeftPA[1] = %d\n",hh.LeftPA[1]) ;
00819    printf("LeftPA[2] = %d\n",hh.LeftPA[2]) ;
00820    printf("SAMtype   = %d\n",hh.SAMType) ;
00821    printf("SAMunit   = %d\n",hh.SAMUnit) ;
00822    printf("SetName   = %s\n",hh.SetName) ;
00823    printf("MriName   = %s\n",hh.MriName) ;
00824    printf("headersize= %d\n",sizeof(hh)+8) ;
00825 #endif
00826 
00827    hh.StepSize *= 1000.0 ;   /* convert distances from m to mm */
00828    hh.XStart   *= 1000.0 ;   /* (who the hell uses meters for brain imaging?) */
00829    hh.YStart   *= 1000.0 ;   /* (blue whales?  elephants?) */
00830    hh.ZStart   *= 1000.0 ;
00831    hh.XEnd     *= 1000.0 ;
00832    hh.YEnd     *= 1000.0 ;
00833    hh.ZEnd     *= 1000.0 ;
00834 
00835    dx = dy = dz = hh.StepSize ;  /* will be altered below */
00836 
00837 #if 0
00838    nx = (int)((hh.ZEnd - hh.ZStart)/dz + 0.99999); /* dataset is stored in Z,Y,X order */
00839    ny = (int)((hh.YEnd - hh.YStart)/dy + 0.99999); /* but AFNI calls these x,y,z       */
00840    nz = (int)((hh.XEnd - hh.XStart)/dx + 0.99999);
00841 #else
00842    nx = CTF_count( hh.ZStart , hh.ZEnd , hh.StepSize ) ;
00843    ny = CTF_count( hh.YStart , hh.YEnd , hh.StepSize ) ;
00844    nz = CTF_count( hh.XStart , hh.XEnd , hh.StepSize ) ;
00845 #endif
00846 
00847    /* determine if file is big enough to hold all data it claims */
00848 
00849    nn = THD_filesize(fname) ;
00850    if( nn < sizeof(double)*nx*ny*nz ) BADBAD("input file too small") ;
00851 
00852    datum_type = MRI_float ;  /* actually is double, but AFNI doesn't grok that */
00853                              /* will be converted to floats when reading data */
00854 
00855    /* set orientation = IRP = xyz ordering */
00856 
00857    ori[0] = 'I'; ori[1] = 'R'; ori[2] = 'P';
00858 
00859    oxx = ORCODE(ori[0]); oyy = ORCODE(ori[1]); ozz = ORCODE(ori[2]);
00860    if( !OR3OK(oxx,oyy,ozz) ){
00861      oxx = ORI_I2S_TYPE; oyy = ORI_R2L_TYPE; ozz = ORI_P2A_TYPE;   /** IRP? **/
00862    }
00863 
00864    orixyz.ijk[0] = oxx ; orixyz.ijk[1] = oyy ; orixyz.ijk[2] = ozz ;
00865 
00866    /* now set grid size, keeping in mind that
00867       A-P is positive and P-A is negative,
00868       R-L is positive and L-R is negative,
00869       I-S is positive and S-I is negative.       */
00870 
00871    switch( ori[0] ){
00872      case 'A':  dx =  hh.StepSize ; xorg = -hh.XStart ; break ;
00873      case 'P':  dx = -hh.StepSize ; xorg = -hh.XStart ; break ;
00874      case 'R':  dx =  hh.StepSize ; xorg =  hh.YStart ; break ;
00875      case 'L':  dx = -hh.StepSize ; xorg =  hh.YStart ; break ;
00876      case 'I':  dx =  hh.StepSize ; xorg =  hh.ZStart ; break ;
00877      case 'S':  dx = -hh.StepSize ; xorg =  hh.ZStart ; break ;
00878    }
00879    switch( ori[1] ){
00880      case 'A':  dy =  hh.StepSize ; yorg = -hh.XStart ; break ;
00881      case 'P':  dy = -hh.StepSize ; yorg = -hh.XStart ; break ;
00882      case 'R':  dy =  hh.StepSize ; yorg =  hh.YStart ; break ;
00883      case 'L':  dy = -hh.StepSize ; yorg =  hh.YStart ; break ;
00884      case 'I':  dy =  hh.StepSize ; yorg =  hh.ZStart ; break ;
00885      case 'S':  dy = -hh.StepSize ; yorg =  hh.ZStart ; break ;
00886    }
00887    switch( ori[2] ){
00888      case 'A':  dz =  hh.StepSize ; zorg = -hh.XStart ; break ;
00889      case 'P':  dz = -hh.StepSize ; zorg = -hh.XStart ; break ;
00890      case 'R':  dz =  hh.StepSize ; zorg =  hh.YStart ; break ;
00891      case 'L':  dz = -hh.StepSize ; zorg =  hh.YStart ; break ;
00892      case 'I':  dz =  hh.StepSize ; zorg =  hh.ZStart ; break ;
00893      case 'S':  dz = -hh.StepSize ; zorg =  hh.ZStart ; break ;
00894    }
00895 
00896    /*-- make a dataset --*/
00897 
00898    dset = EDIT_empty_copy(NULL) ;
00899 
00900    dset->idcode.str[0] = 'C' ;  /* overwrite 1st 3 bytes */
00901    dset->idcode.str[1] = 'T' ;
00902    dset->idcode.str[2] = 'F' ;
00903 
00904    MCW_hash_idcode( fname , dset ) ;  /* 06 May 2005 */
00905 
00906    ppp = THD_trailname(fname,0) ;                   /* strip directory */
00907    MCW_strncpy( prefix , ppp , THD_MAX_PREFIX ) ;   /* to make prefix */
00908 
00909    nxyz.ijk[0] = nx ; dxyz.xyz[0] = dx ;  /* setup axes lengths and voxel sizes */
00910    nxyz.ijk[1] = ny ; dxyz.xyz[1] = dy ;
00911    nxyz.ijk[2] = nz ; dxyz.xyz[2] = dz ;
00912 
00913    orixyz.ijk[0] = oxx ; orgxyz.xyz[0] = xorg ;
00914    orixyz.ijk[1] = oyy ; orgxyz.xyz[1] = yorg ;
00915    orixyz.ijk[2] = ozz ; orgxyz.xyz[2] = zorg ;
00916 
00917    iview = VIEW_ORIGINAL_TYPE ;
00918 
00919    /*-- actually send the values above into the dataset header --*/
00920 
00921    EDIT_dset_items( dset ,
00922                       ADN_prefix      , prefix ,
00923                       ADN_datum_all   , datum_type ,
00924                       ADN_nxyz        , nxyz ,
00925                       ADN_xyzdel      , dxyz ,
00926                       ADN_xyzorg      , orgxyz ,
00927                       ADN_xyzorient   , orixyz ,
00928                       ADN_malloc_type , DATABLOCK_MEM_MALLOC ,
00929                       ADN_nvals       , 1 ,
00930                       ADN_type        , HEAD_FUNC_TYPE ,
00931                       ADN_view_type   , iview ,
00932                       ADN_func_type   , FUNC_FIM_TYPE ,
00933                     ADN_none ) ;
00934 
00935    /*-- set byte order (for reading from disk) --*/
00936 
00937    ii = mri_short_order() ;
00938    if( swap ) ii = REVERSE_ORDER(ii) ;
00939    dset->dblk->diskptr->byte_order = ii ;
00940 
00941    /*-- flag to read data from disk using CTF SAM mode --*/
00942 
00943    dset->dblk->diskptr->storage_mode = STORAGE_BY_CTFSAM ;
00944    strcpy( dset->dblk->diskptr->brick_name , fname ) ;
00945 
00946    RETURN(dset) ;
00947 }
 

Powered by Plone

This site conforms to the following standards: