tests/testthat/test-vecseq.R

library(purrr)
library(testthat)
library(assertthat)

gmask5 <- system.file("extdata", "global_mask_v4.nii", package="neuroim2")
mask <- system.file("extdata", "global_mask2.nii.gz", package="neuroim2")

context("neurovecseq")

test_that("can construct a NeuroVecSeq", {
  vec <- read_vec(gmask5)
  cvec <- concat(vec,vec,vec)

  vs <- NeuroVecSeq(vec,vec,vec)
  expect_equal(dim(cvec), dim(vs))
  expect_equal(space(cvec), space(vs))

})

test_that("can linearly index a NeuroVecSeq", {
  vec <- read_vec(gmask5)
  cvec <- concat(vec,vec,vec)

  vs <- NeuroVecSeq(vec,vec,vec)
  expect_equal(vs[1], cvec[1])
  for (i in 1:20) {
    idx <- sample(1:prod(dim(cvec)), 50)
    expect_equal(vs[idx], cvec[idx])
  }
})

test_that("can array index a NeuroVecSeq", {
  vec <- read_vec(gmask5)
  cvec <- concat(vec,vec,vec)

  vs <- NeuroVecSeq(vec,vec,vec)
  expect_equal(vs[1], cvec[1])

  expect_equal(vs[1,,,], cvec[1,,,])
  expect_equal(vs[1,2,,], cvec[1,2,,])
  expect_equal(vs[1,2,3,], cvec[1,2,3,])
  expect_equal(vs[1,2,3,4], cvec[1,2,3,4])
  expect_equal(vs[1:2,2,3,4], cvec[1:2,2,3,4])
  expect_equal(vs[1:2,2,3,3:4], cvec[1:2,2,3,3:4])
  expect_equal(vs[1:2,2,,3:4], cvec[1:2,2,,3:4])
  expect_equal(vs[1:2,,,3:4], cvec[1:2,,,3:4])
  expect_equal(vs[,,,3:4], cvec[,,,3:4])

})

test_that("can extract vectors from NeuroVecSeq", {
  vec <- read_vec(gmask5)
  cvec <- concat(vec,vec,vec)

  vs <- NeuroVecSeq(vec,vec,vec)
  v1 <- vs %>% vectors()
  v2 <- cvec %>% vectors()
  checkind <- sample(1:length(v1), 100)
  for (i in checkind) {
    expect_equal(v1[[i]], v2[[i]])
  }

})

test_that("can extract vols from NeuroVecSeq", {
  vec <- read_vec(gmask5)
  cvec <- concat(vec,vec,vec)

  vs <- NeuroVecSeq(vec,vec,vec)
  v1 <- vs %>% vols()
  v2 <- cvec %>% vols()
  for (i in length(v1)) {
    expect_equal(v1[[i]], v2[[i]])
  }

})


test_that("can map over vols from NeuroVecSeq", {
  vec <- read_vec(gmask5)
  cvec <- concat(vec,vec,vec)

  vs <- NeuroVecSeq(vec,vec,vec)
  out <- do.call(concat, vs %>% vols() %>% purrr::map( ~ .))
  #out <- do.call(concat, vlist)
  expect_true(all(as.vector(cvec) == as.vector(out)))
})

test_that("can subset a NeuroVecSeq", {
  vec <- read_vec(c(gmask5, gmask5, gmask5))
  vec5 <- sub_vector(vec, 1:4)
  vec2 <- read_vec(gmask5)
  expect_true(all(vec5[] == vec2[]))
})

test_that("can read a sparse NeuroVecSeq", {
  m <- read_vol(mask)
  vec <- read_vec(c(gmask5, gmask5, gmask5), mask=as.logical(m))
  vec5 <- sub_vector(vec, 1:4)
  vec2 <- read_vec(gmask5, mask=as.logical(m))

  ## TODO check that values are same
  expect_true(all(dim(vec5) == dim(vec2)))
})

test_that("can use a MappedNeuroVec as elements in a NeuroVecSeq", {
  vec <- read_vec(gmask5)
  vs <- NeuroVecSeq(vec,vec,vec)

  mvecs <- replicate(3, MappedNeuroVec(gmask5), simplify=FALSE)
  vs2 <- do.call(NeuroVecSeq, mvecs)


  v1 <- vs %>% vols()
  v2 <- vs2 %>% vols()

  for (i in 1:length(v1)) {
    expect_equal(v1[[i]], v2[[i]])
  }

  v1 <- vs %>% vectors()
  v2 <- vs2 %>% vectors()
  checkind <- sample(1:length(v1), 100)
  for (i in checkind) {
    expect_equal(v1[[i]], v2[[i]])
  }

})

test_that("series() works when NeuroVecSeq has SparseNeuroVec", {
  # 1) Read a reference dense vec
  dense_vec <- read_vec(gmask5)  # this is your 4D reference data

  # 2) Create a mask and re-read the same data => yields SparseNeuroVec
  mvol <- read_vol(mask)
  sparse_vec <- read_vec(gmask5, mask = as.logical(mvol))  # now a SparseNeuroVec

  # 3) Build a NeuroVecSeq from repeated sparse vectors
  s1 <- sparse_vec
  s2 <- sparse_vec
  s3 <- sparse_vec
  seq_sparse <- NeuroVecSeq(s1, s2, s3)

  # 4) Build a single 'concat' version as reference
  concat_sparse <- concat(s1, s2, s3)

  # Basic dimension checks
  expect_equal(dim(seq_sparse), dim(concat_sparse))
  expect_equal(space(seq_sparse), space(concat_sparse))

  # 5) Test random voxel indices in 'series'
  set.seed(123)
  idx <- sample(seq_len(prod(dim(concat_sparse)[1:3])), 25)  # 25 random voxel indices

  mat_seq <- series(seq_sparse, idx)
  mat_con <- series(concat_sparse, idx)
  expect_equal(dim(mat_seq), dim(mat_con))
  expect_equal(mat_seq, mat_con)

  # 6) Check single-voxel extraction with drop=TRUE => should yield a time vector
  vox <- idx[1]  # pick one voxel
  vec_seq <- series(seq_sparse, vox, drop=TRUE)
  vec_con <- series(concat_sparse, vox, drop=TRUE)

  expect_true(is.numeric(vec_seq) && is.vector(vec_seq))
  expect_equal(length(vec_seq), dim(concat_sparse)[4])
  expect_equal(vec_seq, vec_con)
})

Try the neuroim2 package in your browser

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

neuroim2 documentation built on April 11, 2025, 5:46 p.m.