nifti 0.17.0

Rust implementation of the NIfTI file format
Documentation
extern crate nifti;
#[macro_use]
extern crate pretty_assertions;

use nifti::{Endianness, Intent, NiftiHeader, NiftiType, SliceOrder, Unit, XForm};
use std::fs::File;

mod util;

use util::{minimal_header_hdr_gt, minimal_header_nii_gt};

#[test]
fn minimal_hdr() {
    let minimal_hdr = minimal_header_hdr_gt();

    const FILE_NAME: &str = "resources/minimal.hdr";
    let header = NiftiHeader::from_file(FILE_NAME).unwrap();

    assert_eq!(header, minimal_hdr);

    assert_eq!(header.intent().unwrap(), Intent::None);
    assert_eq!(header.data_type().unwrap(), NiftiType::Uint8);
    assert_eq!(header.xyzt_units().unwrap(), (Unit::Unknown, Unit::Unknown));
    assert_eq!(header.slice_order().unwrap(), SliceOrder::Unknown);
    assert_eq!(header.qform().unwrap(), XForm::Unknown);
    assert_eq!(header.sform().unwrap(), XForm::Unknown);
}

#[test]
fn minimal_hdr_gz() {
    let minimal_hdr = minimal_header_hdr_gt();

    const FILE_NAME: &str = "resources/minimal.hdr.gz";
    let header = NiftiHeader::from_file(FILE_NAME).unwrap();

    assert_eq!(header, minimal_hdr);

    assert_eq!(header.intent().unwrap(), Intent::None);
    assert_eq!(header.data_type().unwrap(), NiftiType::Uint8);
    assert_eq!(header.xyzt_units().unwrap(), (Unit::Unknown, Unit::Unknown));
    assert_eq!(header.slice_order().unwrap(), SliceOrder::Unknown);
    assert_eq!(header.qform().unwrap(), XForm::Unknown);
    assert_eq!(header.sform().unwrap(), XForm::Unknown);
}

#[test]
fn minimal_nii() {
    let minimal_hdr = minimal_header_nii_gt();

    const FILE_NAME: &str = "resources/minimal.nii";
    let file = File::open(FILE_NAME).unwrap();
    let header = NiftiHeader::from_reader(file).unwrap();

    assert_eq!(header, minimal_hdr);
    assert_eq!(header.endianness, Endianness::Big);

    assert_eq!(header.intent().unwrap(), Intent::None);
    assert_eq!(header.data_type().unwrap(), NiftiType::Uint8);
    assert_eq!(header.xyzt_units().unwrap(), (Unit::Unknown, Unit::Unknown));
    assert_eq!(header.slice_order().unwrap(), SliceOrder::Unknown);
    assert_eq!(header.qform().unwrap(), XForm::Unknown);
    assert_eq!(header.sform().unwrap(), XForm::Unknown);
}

#[test]
#[allow(non_snake_case)]
fn avg152T1_LR_hdr_gz() {
    let mut descrip = Vec::with_capacity(80);
    descrip.extend(b"FSL3.2beta");
    descrip.resize(80, 0);
    let avg152t1_lr_hdr = NiftiHeader {
        sizeof_hdr: 348,
        regular: b'r',
        dim: [3, 91, 109, 91, 1, 1, 1, 1],
        datatype: 2,
        bitpix: 8,
        pixdim: [0., 2., 2., 2., 1., 1., 1., 1.],
        vox_offset: 0.,
        scl_slope: 0.,
        scl_inter: 0.,
        xyzt_units: 10,
        cal_max: 255.,
        cal_min: 0.,
        descrip,
        aux_file: *b"none                   \0",
        qform_code: 0,
        sform_code: 4,
        srow_x: [-2., 0., 0., 90.],
        srow_y: [0., 2., 0., -126.],
        srow_z: [0., 0., 2., -72.],
        magic: *b"ni1\0",
        endianness: Endianness::Big,
        ..Default::default()
    };

    const FILE_NAME: &str = "resources/avg152T1_LR_nifti.hdr.gz";
    let header = NiftiHeader::from_file(FILE_NAME).unwrap();

    assert_eq!(header, avg152t1_lr_hdr);
    assert_eq!(header.endianness, Endianness::Big);

    assert_eq!(header.intent().unwrap(), Intent::None);
    assert_eq!(header.data_type().unwrap(), NiftiType::Uint8);
    assert_eq!(header.xyzt_units().unwrap(), (Unit::Mm, Unit::Sec));
    assert_eq!(header.slice_order().unwrap(), SliceOrder::Unknown);
    assert_eq!(header.qform().unwrap(), XForm::Unknown);
    assert_eq!(header.sform().unwrap(), XForm::Mni152);
}

#[test]
#[allow(non_snake_case)]
fn avg152T1_LR_nii_gz() {
    let mut descrip = Vec::with_capacity(80);
    descrip.extend(b"FSL3.2beta");
    descrip.resize(80, 0);
    let avg152t1_lr_hdr = NiftiHeader {
        sizeof_hdr: 348,
        regular: b'r',
        dim: [3, 91, 109, 91, 1, 1, 1, 1],
        datatype: 2,
        bitpix: 8,
        pixdim: [0., 2., 2., 2., 1., 1., 1., 1.],
        vox_offset: 352.,
        scl_slope: 0.,
        scl_inter: 0.,
        xyzt_units: 10,
        cal_max: 255.,
        cal_min: 0.,
        descrip,
        aux_file: *b"none                   \0",
        qform_code: 0,
        sform_code: 4,
        srow_x: [-2., 0., 0., 90.],
        srow_y: [0., 2., 0., -126.],
        srow_z: [0., 0., 2., -72.],
        magic: *b"n+1\0",
        endianness: Endianness::Big,
        ..Default::default()
    };

    const FILE_NAME: &str = "resources/avg152T1_LR_nifti.nii.gz";
    let header = NiftiHeader::from_file(FILE_NAME).unwrap();

    assert_eq!(header, avg152t1_lr_hdr);

    assert_eq!(header.intent().unwrap(), Intent::None);
    assert_eq!(header.data_type().unwrap(), NiftiType::Uint8);
    assert_eq!(header.xyzt_units().unwrap(), (Unit::Mm, Unit::Sec));
    assert_eq!(header.slice_order().unwrap(), SliceOrder::Unknown);
    assert_eq!(header.qform().unwrap(), XForm::Unknown);
    assert_eq!(header.sform().unwrap(), XForm::Mni152);
}

#[test]
fn zstat1_nii_gz() {
    let mut descrip = Vec::with_capacity(80);
    descrip.extend(b"FSL3.2beta");
    descrip.resize(80, 0);
    let zstat1_hdr = NiftiHeader {
        sizeof_hdr: 348,
        regular: b'r',
        dim: [3, 64, 64, 21, 1, 1, 1, 1],
        intent_code: 5,
        datatype: 16,
        bitpix: 32,
        pixdim: [-1., 4., 4., 6., 1., 1., 1., 1.],
        srow_x: [0.; 4],
        srow_y: [0.; 4],
        srow_z: [0.; 4],
        vox_offset: 352.,
        scl_slope: 0.,
        scl_inter: 0.,
        xyzt_units: 10,
        cal_max: 25500.,
        cal_min: 3.,
        descrip,
        qform_code: 1,
        sform_code: 0,
        quatern_b: 0.,
        quatern_c: 1.,
        magic: *b"n+1\0",
        endianness: Endianness::Big,
        ..Default::default()
    };

    const FILE_NAME: &str = "resources/zstat1.nii.gz";
    let header = NiftiHeader::from_file(FILE_NAME).unwrap();

    assert_eq!(header, zstat1_hdr);

    assert_eq!(header.data_type().unwrap(), NiftiType::Float32);
    assert_eq!(header.intent().unwrap(), Intent::Zscore);
    assert_eq!(header.xyzt_units().unwrap(), (Unit::Mm, Unit::Sec));
    assert_eq!(header.slice_order().unwrap(), SliceOrder::Unknown);
    assert_eq!(header.qform().unwrap(), XForm::ScannerAnat);
    assert_eq!(header.sform().unwrap(), XForm::Unknown);
}