Skip to content

Commit ec6643a

Browse files
authored
Merge pull request #1913 from mmodat/adding_niftyreg
Adding niftyreg
2 parents a17af6b + 215f5f0 commit ec6643a

20 files changed

+2867
-3
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# -*- coding: utf-8 -*-
2+
# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-
3+
# vi: set ft=python sts=4 ts=4 sw=4 et:
4+
5+
"""
6+
The niftyreg module provides classes for interfacing with the `NiftyReg
7+
<http://sourceforge.net/projects/niftyreg/>`_ command line tools.
8+
9+
Top-level namespace for niftyreg.
10+
"""
11+
12+
from .base import no_niftyreg, get_custom_path
13+
from .reg import RegAladin, RegF3D
14+
from .regutils import (RegResample, RegJacobian, RegAverage, RegTools,
15+
RegTransform, RegMeasure)

nipype/interfaces/niftyreg/base.py

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
# -*- coding: utf-8 -*-
2+
# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-
3+
# vi: set ft=python sts=4 ts=4 sw=4 et:
4+
5+
"""
6+
The niftyreg module provides classes for interfacing with `niftyreg
7+
<http://sourceforge.net/projects/niftyreg/>`_ command line tools.
8+
9+
These are the base tools for working with niftyreg.
10+
11+
Registration tools are found in niftyreg/reg.py
12+
Every other tool is found in niftyreg/regutils.py
13+
14+
Examples
15+
--------
16+
See the docstrings of the individual classes for examples.
17+
18+
"""
19+
20+
from __future__ import (print_function, division, unicode_literals,
21+
absolute_import)
22+
from builtins import property, super
23+
from distutils.version import StrictVersion
24+
import os
25+
import shutil
26+
import subprocess
27+
from warnings import warn
28+
29+
from ..base import CommandLine, isdefined, CommandLineInputSpec, traits
30+
from ...utils.filemanip import split_filename
31+
32+
33+
def get_custom_path(command):
34+
return os.path.join(os.getenv('NIFTYREGDIR', ''), command)
35+
36+
37+
def no_niftyreg(cmd='reg_f3d'):
38+
try:
39+
return shutil.which(cmd) is None
40+
except AttributeError: # Python < 3.3
41+
return not any(
42+
[os.path.isfile(os.path.join(path, cmd)) and
43+
os.access(os.path.join(path, cmd), os.X_OK)
44+
for path in os.environ["PATH"].split(os.pathsep)])
45+
46+
47+
class NiftyRegCommandInputSpec(CommandLineInputSpec):
48+
"""Input Spec for niftyreg interfaces."""
49+
# Set the number of omp thread to use
50+
omp_core_val = traits.Int(desc='Number of openmp thread to use',
51+
argstr='-omp %i')
52+
53+
54+
class NiftyRegCommand(CommandLine):
55+
"""
56+
Base support interface for NiftyReg commands.
57+
"""
58+
_suffix = '_nr'
59+
_min_version = '1.5.30'
60+
61+
def __init__(self, required_version=None, **inputs):
62+
super(NiftyRegCommand, self).__init__(**inputs)
63+
self.required_version = required_version
64+
_version = self.get_version()
65+
if _version:
66+
_version = _version.decode("utf-8")
67+
if StrictVersion(_version) < StrictVersion(self._min_version):
68+
msg = 'A later version of Niftyreg is required (%s < %s)'
69+
warn(msg % (_version, self._min_version))
70+
if required_version is not None:
71+
if StrictVersion(_version) != StrictVersion(required_version):
72+
msg = 'The version of NiftyReg differs from the required'
73+
msg += '(%s != %s)'
74+
warn(msg % (_version, self.required_version))
75+
76+
def check_version(self):
77+
_version = self.get_version()
78+
if not _version:
79+
raise Exception('Niftyreg not found')
80+
# Decoding to string:
81+
_version = _version.decode("utf-8")
82+
if StrictVersion(_version) < StrictVersion(self._min_version):
83+
err = 'A later version of Niftyreg is required (%s < %s)'
84+
raise ValueError(err % (_version, self._min_version))
85+
if self.required_version:
86+
if StrictVersion(_version) != StrictVersion(self.required_version):
87+
err = 'The version of NiftyReg differs from the required'
88+
err += '(%s != %s)'
89+
raise ValueError(err % (_version, self.required_version))
90+
91+
def get_version(self):
92+
if no_niftyreg(cmd=self.cmd):
93+
return None
94+
exec_cmd = ''.join((self.cmd, ' -v'))
95+
return subprocess.check_output(exec_cmd, shell=True).strip()
96+
97+
@property
98+
def version(self):
99+
return self.get_version()
100+
101+
def exists(self):
102+
return self.get_version() is not None
103+
104+
def _run_interface(self, runtime):
105+
# Update num threads estimate from OMP_NUM_THREADS env var
106+
# Default to 1 if not set
107+
if not isdefined(self.inputs.environ['OMP_NUM_THREADS']):
108+
self.inputs.environ['OMP_NUM_THREADS'] = self.num_threads
109+
return super(NiftyRegCommand, self)._run_interface(runtime)
110+
111+
def _format_arg(self, name, spec, value):
112+
if name == 'omp_core_val':
113+
self.numthreads = value
114+
return super(NiftyRegCommand, self)._format_arg(name, spec, value)
115+
116+
def _gen_fname(self, basename, out_dir=None, suffix=None, ext=None):
117+
if basename == '':
118+
msg = 'Unable to generate filename for command %s. ' % self.cmd
119+
msg += 'basename is not set!'
120+
raise ValueError(msg)
121+
_, final_bn, final_ext = split_filename(basename)
122+
if out_dir is None:
123+
out_dir = os.getcwd()
124+
if ext is not None:
125+
final_ext = ext
126+
if suffix is not None:
127+
final_bn = ''.join((final_bn, suffix))
128+
return os.path.abspath(os.path.join(out_dir, final_bn + final_ext))

0 commit comments

Comments
 (0)