Mrtrix package in R


#1

Just an FYI - I have been adapting MRTrix for a port in R https://github.com/muschellij2/mrtrix.

We have been adapting neuroimaging packages to our Neuroconductor platform (https://neuroconductor.org/).

I have a working installation on Mac OSX and Linux, but the compile time is a bit high.

Let me know if this would be useful. I’m starting to adapt function from the initial tutorial (http://mrtrix.readthedocs.io/en/latest/getting_started/beginner_dwi_tutorial.html), such as dwi2mask, dwi2response, dwi2fod, and tckgen, and then moving to the other, lower-level functions. Let me know if have any feedback on an issue/PR


#2

Thanks - always nice to see people using MRtrix3 in different ways.

Just a couple of questions though:

  • Quite a few years ago, I’d added support for compiling MRtrix3 as an R module, together with Sascha Frydman from University of Queensland. All it takes is to run configure with the -R switch, and then run build. Have you looked into that? This was ~5 years ago, mind you, so the chances of it still working out of the box are probably quite low… And I’m not aware of anyone currently using that. But I reckon it wouldn’t take an enormous amount of effort to bring it up to date if you were interested.

  • How is your port implemented exactly? You mention that you need to port each command one by one? I think the support we’d added covered all commands directly, without needing to manually port each one… But my recollection of this are very hazy.


#3

I see that in https://github.com/MRtrix3/mrtrix3/blob/master/configure#L1226 the configuration, but it looks like it’s hard coded to a Linux build (using /usr/include/R).

I am building with .configure -R now to see what this produces for OS X.

Configuring OS-dependent flags

I think the code: include_dir=`Rscript -e "cat(R.home('include'))"` would produce a system-dependent includes. You may need to use Rscript.exe for Windows, but for Linux/OSX this should get the flags set:

export R_CFLAGS="-isystem `Rscript -e "cat(R.home('include'))"`"
export R_LDFLAGS="-L`Rscript -e "cat(R.home('lib'))"` -lR"

But you get the following error when running ./build:

ERROR: (  2/366) [CC] tmp/src/dwi/directions/file.o

clang++ -c -std=c++11 -DMRTRIX_MACOSX -fPIC -mmacosx-version-min=10.12 -DMRTRIX_WORD64 -isystem /usr/local/include -DMRTRIX_TIFF_SUPPORT -isystem /Library/Frameworks/GTK+.framework/Versions/2.24.X11/Resources/include -DEIGEN_FFTW_DEFAULT -isystem /usr/local/Cellar/fftw/3.3.6-pl2/include -isystem /Library/Frameworks/R.framework/Resources/include -DMRTRIX_AS_R_LIBRARY -Wall -O3 -DNDEBUG -Isrc -I./core -Icmd -isystem /usr/local/Cellar/eigen/3.3.4/include/eigen3 -DEIGEN_DONT_PARALLELIZE src/dwi/directions/file.cpp -o tmp/src/dwi/directions/file.o

failed with output

In file included from src/dwi/directions/file.cpp:15:
In file included from src/dwi/directions/file.h:18:
In file included from ./core/math/sphere.h:24:
In file included from ./core/math/math.h:24:
In file included from ./core/file/ofstream.h:19:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/fstream:869:34: error: no member named 'Rf_error' in 'std::__1::codecvt_base'
        if (__r == codecvt_base::error)
                   ~~~~~~~~~~~~~~^
/Library/Frameworks/R.framework/Resources/include/R_ext/Error.h:52:15: note: expanded from macro 'error'
#define error Rf_error
              ^
1 error generated.

ERROR: (  1/366) [CC] tmp/cmd/labelconvert.o

clang++ -c -std=c++11 -DMRTRIX_MACOSX -fPIC -mmacosx-version-min=10.12 -DMRTRIX_WORD64 -isystem /usr/local/include -DMRTRIX_TIFF_SUPPORT -isystem /Library/Frameworks/GTK+.framework/Versions/2.24.X11/Resources/include -DEIGEN_FFTW_DEFAULT -isystem /usr/local/Cellar/fftw/3.3.6-pl2/include -isystem /Library/Frameworks/R.framework/Resources/include -DMRTRIX_AS_R_LIBRARY -Wall -O3 -DNDEBUG -Isrc -I./core -Icmd -isystem /usr/local/Cellar/eigen/3.3.4/include/eigen3 -DEIGEN_DONT_PARALLELIZE cmd/labelconvert.cpp -o tmp/cmd/labelconvert.o

failed with output

In file included from cmd/labelconvert.cpp:15:
./core/command.h:33:3: error: use of undeclared identifier 'SET_MRTRIX_PROJECT_VERSION'
  SET_MRTRIX_PROJECT_VERSION 
  ^
In file included from cmd/labelconvert.cpp:16:
In file included from ./core/image.h:23:
In file included from ./core/header.h:26:

Note, though, that './configure && ./build` works just fine without the R flag.

As an R Package

I don’t know what the output would be, but I’d want components of an R package (such as a DESCRIPTION file, a NAMESPACE file, etc.) so that someone could install MRTrix3 using install.packages("mrtrix") in R. The goal is to have all the options coded into R functions so that you’d be able to run dwi2response("/path/to/diffusion.nii.gz", bvals, bvecs,...) and then R would call the corresponding function (either at the command line or from a .Call to C/C++ code.

Does ./configure -R produce something like that?


#4

Does ./configure -R produce an actual R package?


#5

Sorry, forgot to follow up…

As far as i can tell, it produces a series of shared libaries (*so) in the bin/ folder. I’ve no idea how that relates to an actual R package - this was all a very long time ago, and I don’t use R regularly.

I’ve had a go at updating the code so it compiles successfully, at least on my Arch Linux system - see this branch. I haven’t tested it in any way though, but maybe you’ll be in a better position than me to figure this out…?