tests/testthat/test-10-xform.R

test_that("NIfTI sform/qform operations work", {
    imagePath <- system.file("extdata", "example.nii.gz", package="RNifti")
    image <- readNifti(imagePath)
    
    expect_equal(diag(xform(image)), c(-2.5,2.5,2.5,1))
    expect_equal(diag(xform(image,useQuaternionFirst=FALSE)), c(-2.5,2.5,2.5,1))
    expect_equal(round(origin(image)), c(50,39,23))
    expect_equal(rotation(image), diag(c(-1,1,1)))
    
    xform <- xform(image)
    expect_equal(round(origin(xform)), c(50,39,23))
    expect_equal(rotation(xform), diag(c(-1,1,1)))
    expect_equal(orientation(xform), "LAS")
    rotationPIR <- matrix(0,3,3)
    rotationPIR[c(2,6,7)] <- c(-1,-1,1)
    orientation(xform) <- "PIR"
    expect_equal(rotation(xform), rotationPIR)
    expect_equal(orientation(xform), "PIR")
    
    point <- c(40, 40, 20)
    expect_equal(round(voxelToWorld(point,image)), c(25,2,-8))
    expect_equal(voxelToWorld(point,image,simple=TRUE), c(97.5,97.5,47.5))
    expect_equal(worldToVoxel(voxelToWorld(point,image),image), point)
    expect_equal(worldToVoxel(voxelToWorld(point,image,simple=TRUE),image,simple=TRUE), point)
    
    # NB: indexing into the image currently discards the metadata, including the xforms
    expect_equal(voxelToWorld(point[1:2],image[,,20L]), c(39,39))
    
    # Create a rotation-only affine: 5 degrees about the x-axis
    theta <- 5 / 180 * pi
    affine <- diag(4)
    affine[c(6,7,10,11)] <- c(cos(theta), sin(theta), -sin(theta), cos(theta))
    
    # Copy image object to check copy semantics
    originalImage <- image
    xform <- structure(affine %*% xform(image), code=4)
    qform(image) <- xform
    sform(image) <- xform
    expect_equal(image$qform_code, 4L)
    expect_equal(image$sform_code, 4L)
    expect_equal(round(image$srow_z,1), c(0,0.2,2.5,-63.1))
    expect_equal(originalImage$qform_code, 2L)
    
    # Header-only xform replacement
    header <- niftiHeader(image)
    qform(header) <- xform
    sform(header) <- xform
    expect_equal(round(header$quatern_d,2), 0.04)
    expect_equal(round(header$srow_z,1), c(0,0.2,2.5,-63.1))
})

test_that("image data and metadata can be reoriented", {
    imagePath <- system.file("extdata", "example.nii.gz", package="RNifti")
    image <- readNifti(imagePath, internal=FALSE)
    reorientedImage <- image
    
    orientation(reorientedImage) <- "PIR"
    expect_equal(orientation(image), "LAS")
    expect_equal(orientation(reorientedImage), "PIR")
    expect_equal(origin(reorientedImage), (dim(image)-origin(image)+1)[c(2,3,1)], tolerance=1e-4)
    expect_equal(image[40,40,30], reorientedImage[57,31,57])
    orientation(reorientedImage) <- "RAS"
    expect_equal(image[40,40,30], reorientedImage[57,40,30])
    orientation(reorientedImage) <- "LAS"
    expect_equal(xform(image), xform(reorientedImage), tolerance=1e-4)
})

Try the RNifti package in your browser

Any scripts or data that you put into this service are public.

RNifti documentation built on May 31, 2023, 5:59 p.m.