ANTsX / ANTsR

R interface to the ANTs biomedical image processing library
https://antsx.github.io/ANTsR
Apache License 2.0
127 stars 35 forks source link

How to save output of antsrMotionCalculation as one file #272

Open ptsii opened 5 years ago

ptsii commented 5 years ago

My apologies if this is posted in the wrong place... I'm running antsrMotionCalculation on a large file and want to save the output to disk for use separately, later, to be called by a different script. Right now I save everything in different files, e.g.,:

bold4D_motionCalc$moco_img bold4D_motionCalc$moco_params bold4D_motionCalc$fd bold4D_motionCalc$dvars bold4D_motionCalc$moco_mask bold4D_motionCalc$moco_avg_img

...but is there a way to save the whole complex bold4D_motionCalc object as one file?

-Tom

muschellij2 commented 5 years ago

There are a few options. You can save the whole object as the list it already is using save or saveRDS. The biggest issue with this is that the antsImage objects will have external pointers, which will be invalid the next time you open R. You can convert these to nifti objects, or something without an external pointer. Here I use the extrantsr package: https://github.com/muschellij2/extrantsr

library(extrantsr)
bold4D_motionCalc = lapply(bold4D_motionCalc, function(x) {
  if (is.antsImage(x)) {
    x = ants2oro(x)
  } 
  x
})

You may want to change this when you read it back in. See below.

Working Example

library(ANTsRCore)
#> 
#> Attaching package: 'ANTsRCore'
#> The following object is masked from 'package:stats':
#> 
#>     var
#> The following objects are masked from 'package:base':
#> 
#>     all, any, apply, max, min, prod, range, sum
library(ANTsR)
library(extrantsr)
#> 
#> Attaching package: 'extrantsr'
#> The following objects are masked from 'package:ANTsRCore':
#> 
#>     origin, origin<-
Sys.setenv(ITK_GLOBAL_DEFAULT_NUMBER_OF_THREADS = 1)
Sys.setenv(ANTS_RANDOM_SEED = 1)
set.seed(120)
simimg<-makeImage(rep(5,4), rnorm(5^4))
testthat::expect_equal(mean(simimg), 0.0427369860965759)
bold4D_motionCalc = antsrMotionCalculation( simimg , seed = 1234)

bold4D_motionCalc = lapply(bold4D_motionCalc, function(x) {
  if (is.antsImage(x)) {
    x = ants2oro(x)
  } 
  x
})
tfile = tempfile(fileext = ".rds")
saveRDS(bold4D_motionCalc, file = tfile)
rm(bold4D_motionCalc); 
for (i in 10) gc();

bold4D_motionCalc = readRDS(file = tfile)
bold4D_motionCalc = lapply(bold4D_motionCalc, function(x) {
  if (oro.nifti::is.nifti(x)) {
    x = oro2ants(x)
  } 
  x
})

bold4D_motionCalc
#> $moco_img
#> antsImage
#>   Pixel Type          : float 
#>   Components Per Pixel: 1 
#>   Dimensions          : 5x5x5x5 
#>   Voxel Spacing       : 1x1x1x1 
#>   Origin              : 0 0 0 0 
#>   Direction           : 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 
#>   Filename           : /private/var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T/Rtmps21mcq/file130527f735643.nii.gz 
#> 
#> 
#> $moco_params
#>      MOCOparam1 MOCOparam2 MOCOparam3 MOCOparam4 MOCOparam5 MOCOparam6
#> [1,]  0.8070312 -2.7196524  -7.722021          0          0          0
#> [2,]  0.6403608  0.7210882   0.331462          0          0          0
#> [3,] -3.5773988  0.7025864  -1.792493          0          0          0
#> [4,]  3.4404235 -2.8812182   2.718754          0          0          0
#> [5,]  2.5139089  0.2271850   2.987108          0          0          0
#> 
#> $moco_avg_img
#> antsImage
#>   Pixel Type          : float 
#>   Components Per Pixel: 1 
#>   Dimensions          : 5x5x5 
#>   Voxel Spacing       : 1x1x1 
#>   Origin              : 0 0 0 
#>   Direction           : 1 0 0 0 1 0 0 0 1 
#>   Filename           : /private/var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T/Rtmps21mcq/file130526d248a13.nii.gz 
#> 
#> 
#> $moco_mask
#> antsImage
#>   Pixel Type          : float 
#>   Components Per Pixel: 1 
#>   Dimensions          : 5x5x5 
#>   Voxel Spacing       : 1x1x1 
#>   Origin              : 0 0 0 
#>   Direction           : 1 0 0 0 1 0 0 0 1 
#>   Filename           : /private/var/folders/1s/wrtqcpxn685_zk570bnx9_rr0000gr/T/Rtmps21mcq/file1305279e51d5f.nii.gz 
#> 
#> 
#> $fd
#>   MeanDisplacement MaxDisplacement
#> 1         8.759284        8.759284
#> 2         4.722396        4.722396
#> 3         9.079914        9.079914
#> 4         3.254630        3.254630
#> 5         0.000000        0.000000
#> 
#> $dvars
#> [1] 1.271681 1.421977 1.572031 1.651933 1.712464

Created on 2019-06-10 by the reprex package (v0.2.1)

Hope that helps.