Skip to content

Commit d65688c

Browse files
authored
Merge pull request #2560 from effigies/enh/rci
ENH: ReportCapableInterface mix-in/base interface
2 parents 5a96ea5 + 25c98b7 commit d65688c

File tree

3 files changed

+91
-0
lines changed

3 files changed

+91
-0
lines changed

nipype/interfaces/base/core.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,9 @@ def run(self, cwd=None, ignore_exception=None, **inputs):
517517
outputs = None
518518

519519
try:
520+
runtime = self._pre_run_hook(runtime)
520521
runtime = self._run_interface(runtime)
522+
runtime = self._post_run_hook(runtime)
521523
outputs = self.aggregate_outputs(runtime)
522524
except Exception as e:
523525
import traceback
@@ -653,6 +655,28 @@ def save_inputs_to_json(self, json_file):
653655
with open(json_file, 'w' if PY3 else 'wb') as fhandle:
654656
json.dump(inputs, fhandle, indent=4, ensure_ascii=False)
655657

658+
def _pre_run_hook(self, runtime):
659+
"""
660+
Perform any pre-_run_interface() processing
661+
662+
Subclasses may override this function to modify ``runtime`` object or
663+
interface state
664+
665+
MUST return runtime object
666+
"""
667+
return runtime
668+
669+
def _post_run_hook(self, runtime):
670+
"""
671+
Perform any post-_run_interface() processing
672+
673+
Subclasses may override this function to modify ``runtime`` object or
674+
interface state
675+
676+
MUST return runtime object
677+
"""
678+
return runtime
679+
656680

657681
class SimpleInterface(BaseInterface):
658682
""" An interface pattern that allows outputs to be set in a dictionary

nipype/interfaces/mixins/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
from .reporting import (
2+
ReportCapableInterface, ReportCapableInputSpec, ReportCapableOutputSpec)

nipype/interfaces/mixins/reporting.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
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+
""" class mixin and utilities for enabling reports for nipype interfaces """
5+
from __future__ import (print_function, division, unicode_literals,
6+
absolute_import)
7+
8+
import os
9+
from abc import abstractmethod
10+
11+
from ... import logging
12+
from ..base import (
13+
File, BaseInterface, BaseInterfaceInputSpec, TraitedSpec)
14+
15+
iflogger = logging.getLogger('interface')
16+
17+
18+
class ReportCapableInputSpec(BaseInterfaceInputSpec):
19+
out_report = File('report', usedefault=True, hash_files=False,
20+
desc='filename for the visual report')
21+
22+
23+
class ReportCapableOutputSpec(TraitedSpec):
24+
out_report = File(desc='filename for the visual report')
25+
26+
27+
class ReportCapableInterface(BaseInterface):
28+
"""Mixin to enable reporting for Nipype interfaces"""
29+
_out_report = None
30+
31+
def __init__(self, generate_report=False, **kwargs):
32+
super(ReportCapableInterface, self).__init__(**kwargs)
33+
self.generate_report = generate_report
34+
35+
def _post_run_hook(self, runtime):
36+
runtime = super(ReportCapableInterface, self)._post_run_hook(runtime)
37+
38+
# leave early if there's nothing to do
39+
if not self.generate_report:
40+
return runtime
41+
42+
self._out_report = self.inputs.out_report
43+
if not os.path.isabs(self._out_report):
44+
self._out_report = os.path.abspath(os.path.join(runtime.cwd,
45+
self._out_report))
46+
47+
self._generate_report()
48+
49+
return runtime
50+
51+
def _list_outputs(self):
52+
try:
53+
outputs = super(ReportCapableInterface, self)._list_outputs()
54+
except NotImplementedError:
55+
outputs = {}
56+
if self._out_report is not None:
57+
outputs['out_report'] = self._out_report
58+
return outputs
59+
60+
@abstractmethod
61+
def _generate_report(self):
62+
"""
63+
Saves report to file identified by _out_report instance variable
64+
"""
65+
raise NotImplementedError

0 commit comments

Comments
 (0)