diff --git a/doc/devel/matlab_example1.py b/doc/devel/matlab_example1.py index aaf6c4cb3a..9f15389669 100644 --- a/doc/devel/matlab_example1.py +++ b/doc/devel/matlab_example1.py @@ -1,13 +1,17 @@ from nipype.interfaces.matlab import MatlabCommand -from nipype.interfaces.base import TraitedSpec, \ - BaseInterface, BaseInterfaceInputSpec, File +from nipype.interfaces.base import ( + TraitedSpec, + BaseInterface, + BaseInterfaceInputSpec, + File, +) import os from string import Template class ConmapTxt2MatInputSpec(BaseInterfaceInputSpec): in_file = File(exists=True, mandatory=True) - out_file = File('cmatrix.mat', usedefault=True) + out_file = File("cmatrix.mat", usedefault=True) class ConmapTxt2MatOutputSpec(TraitedSpec): @@ -19,14 +23,15 @@ class ConmapTxt2Mat(BaseInterface): output_spec = ConmapTxt2MatOutputSpec def _run_interface(self, runtime): - d = dict(in_file=self.inputs.in_file, - out_file=self.inputs.out_file) + d = dict(in_file=self.inputs.in_file, out_file=self.inputs.out_file) # This is your MATLAB code template - script = Template("""in_file = '$in_file'; + script = Template( + """in_file = '$in_file'; out_file = '$out_file'; ConmapTxt2Mat(in_file, out_file); exit; - """).substitute(d) + """ + ).substitute(d) # mfile = True will create an .m file with your script and executed. # Alternatively @@ -43,5 +48,5 @@ def _run_interface(self, runtime): def _list_outputs(self): outputs = self._outputs().get() - outputs['out_file'] = os.path.abspath(self.inputs.out_file) + outputs["out_file"] = os.path.abspath(self.inputs.out_file) return outputs diff --git a/doc/devel/matlab_example2.py b/doc/devel/matlab_example2.py index 8d683ea45f..7d75e307b1 100644 --- a/doc/devel/matlab_example2.py +++ b/doc/devel/matlab_example2.py @@ -4,8 +4,7 @@ class HelloWorldInputSpec(MatlabInputSpec): - name = traits.Str(mandatory=True, - desc='Name of person to say hello to') + name = traits.Str(mandatory=True, desc="Name of person to say hello to") class HelloWorldOutputSpec(TraitedSpec): @@ -29,6 +28,7 @@ class HelloWorld(MatlabCommand): >>> out = hello.run() >>> print out.outputs.matlab_output """ + input_spec = HelloWorldInputSpec output_spec = HelloWorldOutputSpec @@ -37,7 +37,9 @@ def _my_script(self): script = """ disp('Hello %s Python') two = 1 + 1 - """ % (self.inputs.name) + """ % ( + self.inputs.name + ) return script def run(self, **inputs): diff --git a/nipype/interfaces/mrtrix3/__init__.py b/nipype/interfaces/mrtrix3/__init__.py index 9ea9850b1b..126192030f 100644 --- a/nipype/interfaces/mrtrix3/__init__.py +++ b/nipype/interfaces/mrtrix3/__init__.py @@ -15,6 +15,7 @@ DWIExtract, SHConv, SH2Amp, + MRCat, ) from .preprocess import ( ResponseSD, diff --git a/nipype/interfaces/mrtrix3/tests/test_auto_MRCat.py b/nipype/interfaces/mrtrix3/tests/test_auto_MRCat.py new file mode 100644 index 0000000000..5659da4507 --- /dev/null +++ b/nipype/interfaces/mrtrix3/tests/test_auto_MRCat.py @@ -0,0 +1,73 @@ +# AUTO-GENERATED by tools/checkspecs.py - DO NOT EDIT +from ..utils import MRCat + + +def test_MRCat_inputs(): + input_map = dict( + args=dict( + argstr="%s", + ), + axis=dict( + argstr="-axis %s", + ), + bval_scale=dict( + argstr="-bvalue_scaling %s", + ), + datatype=dict( + argstr="-datatype %s", + ), + environ=dict( + nohash=True, + usedefault=True, + ), + grad_file=dict( + argstr="-grad %s", + extensions=None, + xor=["grad_fsl"], + ), + grad_fsl=dict( + argstr="-fslgrad %s %s", + xor=["grad_file"], + ), + in_bval=dict( + extensions=None, + ), + in_bvec=dict( + argstr="-fslgrad %s %s", + extensions=None, + ), + in_files=dict( + argstr="%s", + mandatory=True, + position=-2, + ), + nthreads=dict( + argstr="-nthreads %d", + nohash=True, + ), + out_file=dict( + argstr="%s", + extensions=None, + mandatory=True, + position=-1, + usedefault=True, + ), + ) + inputs = MRCat.input_spec() + + for key, metadata in list(input_map.items()): + for metakey, value in list(metadata.items()): + assert getattr(inputs.traits()[key], metakey) == value + + +def test_MRCat_outputs(): + output_map = dict( + out_file=dict( + extensions=None, + ), + ) + outputs = MRCat.output_spec() + + for key, metadata in list(output_map.items()): + for metakey, value in list(metadata.items()): + assert getattr(outputs.traits()[key], metakey) == value diff --git a/nipype/interfaces/mrtrix3/utils.py b/nipype/interfaces/mrtrix3/utils.py index 77c3047f20..fa624fa79c 100644 --- a/nipype/interfaces/mrtrix3/utils.py +++ b/nipype/interfaces/mrtrix3/utils.py @@ -64,9 +64,108 @@ def _list_outputs(self): return outputs +class MRCatInputSpec(MRTrix3BaseInputSpec): + in_files = traits.List( + File(exists=True), + argstr="%s", + position=-2, + mandatory=True, + desc="files to concatenate", + ) + + out_file = File( + "concatenated.mif", + argstr="%s", + mandatory=True, + position=-1, + usedefault=True, + desc="output concatenated image", + ) + + axis = traits.Int( + argstr="-axis %s", + desc="""specify axis along which concatenation should be performed. By default, + the program will use the last non-singleton, non-spatial axis of any of + the input images - in other words axis 3 or whichever axis (greater than + 3) of the input images has size greater than one""", + ) + + datatype = traits.Enum( + "float32", + "float32le", + "float32be", + "float64", + "float64le", + "float64be", + "int64", + "uint64", + "int64le", + "uint64le", + "int64be", + "uint64be", + "int32", + "uint32", + "int32le", + "uint32le", + "int32be", + "uint32be", + "int16", + "uint16", + "int16le", + "uint16le", + "int16be", + "uint16be", + "cfloat32", + "cfloat32le", + "cfloat32be", + "cfloat64", + "cfloat64le", + "cfloat64be", + "int8", + "uint8", + "bit", + argstr="-datatype %s", + desc="specify output image data type", + ) + + +class MRCatOutputSpec(TraitedSpec): + out_file = File(exists=True, desc="the output concatenated image") + + +class MRCat(CommandLine): + """ + Concatenate several images into one + + + Example + ------- + + >>> import nipype.interfaces.mrtrix3 as mrt + >>> mrcat = mrt.MRCat() + >>> mrcat.inputs.in_files = ['image1.mif','image2.mif'] + >>> mrcat.cmdline # doctest: +ELLIPSIS + 'mrcat image1.mif image2.mif concatenated.mif' + >>> mrcat.run() # doctest: +SKIP + """ + + _cmd = "mrcat" + input_spec = MRCatInputSpec + output_spec = MRCatOutputSpec + + def _list_outputs(self): + outputs = self.output_spec().get() + outputs["out_file"] = op.abspath(self.inputs.out_file) + return outputs + + class Mesh2PVEInputSpec(CommandLineInputSpec): in_file = File( - exists=True, argstr="%s", mandatory=True, position=-3, desc="input mesh" + exists=True, + argstr="%s", + mandatory=True, + position=-3, + desc="input mesh", ) reference = File( exists=True, @@ -134,7 +233,11 @@ class Generate5ttInputSpec(MRTrix3BaseInputSpec): desc="tissue segmentation algorithm", ) in_file = File( - exists=True, argstr="%s", mandatory=True, position=-2, desc="input image" + exists=True, + argstr="%s", + mandatory=True, + position=-2, + desc="input image", ) out_file = File(argstr="%s", mandatory=True, position=-1, desc="output image") @@ -173,7 +276,11 @@ def _list_outputs(self): class TensorMetricsInputSpec(CommandLineInputSpec): in_file = File( - exists=True, argstr="%s", mandatory=True, position=-1, desc="input DTI image" + exists=True, + argstr="%s", + mandatory=True, + position=-1, + desc="input DTI image", ) out_fa = File(argstr="-fa %s", desc="output FA file") @@ -246,10 +353,18 @@ def _list_outputs(self): class ComputeTDIInputSpec(CommandLineInputSpec): in_file = File( - exists=True, argstr="%s", mandatory=True, position=-2, desc="input tractography" + exists=True, + argstr="%s", + mandatory=True, + position=-2, + desc="input tractography", ) out_file = File( - "tdi.mif", argstr="%s", usedefault=True, position=-1, desc="output TDI file" + "tdi.mif", + argstr="%s", + usedefault=True, + position=-1, + desc="output TDI file", ) reference = File( exists=True, @@ -353,7 +468,8 @@ class ComputeTDIInputSpec(CommandLineInputSpec): "(these lengths are then taken into account during TWI calculation)", ) ends_only = traits.Bool( - argstr="-ends_only", desc="only map the streamline" " endpoints to the image" + argstr="-ends_only", + desc="only map the streamline" " endpoints to the image", ) tck_weights = File( @@ -438,10 +554,18 @@ def _list_outputs(self): class TCK2VTKInputSpec(CommandLineInputSpec): in_file = File( - exists=True, argstr="%s", mandatory=True, position=-2, desc="input tractography" + exists=True, + argstr="%s", + mandatory=True, + position=-2, + desc="input tractography", ) out_file = File( - "tracks.vtk", argstr="%s", usedefault=True, position=-1, desc="output VTK file" + "tracks.vtk", + argstr="%s", + usedefault=True, + position=-1, + desc="output VTK file", ) reference = File( exists=True, @@ -498,7 +622,11 @@ def _list_outputs(self): class DWIExtractInputSpec(MRTrix3BaseInputSpec): in_file = File( - exists=True, argstr="%s", mandatory=True, position=-2, desc="input image" + exists=True, + argstr="%s", + mandatory=True, + position=-2, + desc="input image", ) out_file = File(argstr="%s", mandatory=True, position=-1, desc="output image") bzero = traits.Bool(argstr="-bzero", desc="extract b=0 volumes") @@ -549,7 +677,11 @@ def _list_outputs(self): class MRConvertInputSpec(MRTrix3BaseInputSpec): in_file = File( - exists=True, argstr="%s", mandatory=True, position=-2, desc="input image" + exists=True, + argstr="%s", + mandatory=True, + position=-2, + desc="input image", ) out_file = File( "dwi.mif", @@ -566,7 +698,10 @@ class MRConvertInputSpec(MRTrix3BaseInputSpec): desc="extract data at the specified coordinates", ) vox = traits.List( - traits.Float, sep=",", argstr="-vox %s", desc="change the voxel dimensions" + traits.Float, + sep=",", + argstr="-vox %s", + desc="change the voxel dimensions", ) axes = traits.List( traits.Int, @@ -615,7 +750,11 @@ def _list_outputs(self): class MRMathInputSpec(MRTrix3BaseInputSpec): in_file = File( - exists=True, argstr="%s", mandatory=True, position=-3, desc="input image" + exists=True, + argstr="%s", + mandatory=True, + position=-3, + desc="input image", ) out_file = File(argstr="%s", mandatory=True, position=-1, desc="output image") operation = traits.Enum( @@ -637,7 +776,9 @@ class MRMathInputSpec(MRTrix3BaseInputSpec): desc="operation to computer along a specified axis", ) axis = traits.Int( - 0, argstr="-axis %d", desc="specfied axis to perform the operation along" + 0, + argstr="-axis %d", + desc="specfied axis to perform the operation along", ) @@ -677,7 +818,11 @@ def _list_outputs(self): class MRResizeInputSpec(MRTrix3BaseInputSpec): in_file = File( - exists=True, argstr="%s", position=-2, mandatory=True, desc="input DWI image" + exists=True, + argstr="%s", + position=-2, + mandatory=True, + desc="input DWI image", ) image_size = traits.Tuple( (traits.Int, traits.Int, traits.Int), diff --git a/tools/checkspecs.py b/tools/checkspecs.py index 032fd122cc..7aaac0d107 100644 --- a/tools/checkspecs.py +++ b/tools/checkspecs.py @@ -13,8 +13,7 @@ # Functions and classes class InterfaceChecker(object): - """Class for checking all interface specifications - """ + """Class for checking all interface specifications""" def __init__( self, @@ -23,7 +22,7 @@ def __init__( module_skip_patterns=None, class_skip_patterns=None, ): - r""" Initialize package for parsing + r"""Initialize package for parsing Parameters ---------- @@ -113,14 +112,14 @@ def _uri2path(self, uri): return path def _path2uri(self, dirpath): - """ Convert directory path to uri """ + """Convert directory path to uri""" relpath = dirpath.replace(self.root_path, self.package_name) if relpath.startswith(os.path.sep): relpath = relpath[1:] return relpath.replace(os.path.sep, ".") def _parse_module(self, uri): - """ Parse module defined in *uri* """ + """Parse module defined in *uri*""" filename = self._uri2path(uri) if filename is None: # nothing that we could handle here. @@ -131,7 +130,7 @@ def _parse_module(self, uri): return functions, classes def _parse_lines(self, linesource, module): - """ Parse lines of text for functions and classes """ + """Parse lines of text for functions and classes""" functions = [] classes = [] for line in linesource: @@ -387,7 +386,7 @@ def test_specs(self, uri): return bad_specs def _survives_exclude(self, matchstr, match_type): - """ Returns True if *matchstr* does not match patterns + """Returns True if *matchstr* does not match patterns ``self.package_name`` removed from front of string if present @@ -429,7 +428,7 @@ def _survives_exclude(self, matchstr, match_type): return True def discover_modules(self): - """ Return module sequence discovered from ``self.package_name`` + """Return module sequence discovered from ``self.package_name`` Parameters diff --git a/tools/gitwash_dumper.py b/tools/gitwash_dumper.py index 36efd7f83e..2c08547bac 100755 --- a/tools/gitwash_dumper.py +++ b/tools/gitwash_dumper.py @@ -50,9 +50,7 @@ def cp_files(in_path, globs, out_path): def filename_search_replace(sr_pairs, filename, backup=False): - """ Search and replace for expressions in files - - """ + """Search and replace for expressions in files""" in_txt = open(filename, "rt").read(-1) out_txt = in_txt[:] for in_exp, out_exp in sr_pairs: @@ -94,7 +92,7 @@ def make_link_targets( url=None, ml_url=None, ): - """ Check and make link targets + """Check and make link targets If url is None or ml_url is None, check if there are links present for these in `known_link_fname`. If not, raise error. The check is: diff --git a/tools/run_examples.py b/tools/run_examples.py index 20382ef74d..bd77f1a0a4 100644 --- a/tools/run_examples.py +++ b/tools/run_examples.py @@ -4,9 +4,15 @@ if __name__ == "__main__": - print(dedent("""Nipype examples have been moved to niflow-nipype1-examples. + print( + dedent( + """Nipype examples have been moved to niflow-nipype1-examples. -Install with: pip install niflow-nipype1-examples""")) +Install with: pip install niflow-nipype1-examples""" + ) + ) if sys.argv[1:]: - print("Run this command with: niflow-nipype1-examples " + " ".join(sys.argv[1:])) + print( + "Run this command with: niflow-nipype1-examples " + " ".join(sys.argv[1:]) + ) sys.exit(1) diff --git a/tools/toollib.py b/tools/toollib.py index 77d864f142..e740787575 100644 --- a/tools/toollib.py +++ b/tools/toollib.py @@ -31,7 +31,9 @@ def sh(cmd): def compile_tree(): """Compile all Python files below current directory.""" vstr = ".".join(map(str, sys.version_info[:2])) - stat = os.system("%s %s/lib/python%s/compileall.py ." % (sys.executable, sys.prefix, vstr)) + stat = os.system( + "%s %s/lib/python%s/compileall.py ." % (sys.executable, sys.prefix, vstr) + ) if stat: msg = "*** ERROR: Some Python files in tree do NOT compile! ***\n" msg += "See messages above for the actual file that produced it.\n"