Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ENH: Add three new workbench command interfaces #3306

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion nipype/interfaces/workbench/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@
# vi: set ft=python sts=4 ts=4 sw=4 et:
"""Connectome Workbench is a visualization for neuroimaging data, esp. derived from HCP data."""
from .metric import MetricResample
from .cifti import CiftiSmooth
from .cifti import CiftiSmooth, CiftiCorrelation, CiftiParcellate, CiftiSeparateMetric
275 changes: 275 additions & 0 deletions nipype/interfaces/workbench/cifti.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,3 +154,278 @@ class CiftiSmooth(WBCommand):
input_spec = CiftiSmoothInputSpec
output_spec = CiftiSmoothOutputSpec
_cmd = "wb_command -cifti-smoothing"


class CiftiCorrelationInputSpec(CommandLineInputSpec):
in_file = File(
exists=True,
mandatory=True,
argstr="%s ",
position=0,
desc="The input ptseries or dense series",
)
out_file = File(
name_source=["in_file"],
name_template="correlation_matrix_%s.nii",
keep_extension=True,
argstr=" %s",
position=1,
desc="The output CIFTI",
)

roi_override = traits.Bool(
exists=True,
argstr="-roi-override %s ",
position=2,
desc=" perform correlation from a subset of rows to all rows",
)

left_roi = File(
exists=True,
position=3,
argstr="-left-roi %s",
desc="Specify the left roi metric to use",
)

right_roi = File(
exists=True,
position=5,
argstr="-right-roi %s",
desc="Specify the right roi metric to use",
)
cerebellum_roi = File(
exists=True,
position=6,
argstr="-cerebellum-roi %s",
desc="specify the cerebellum meytric to use",
)

vol_roi = File(
exists=True,
position=7,
argstr="-vol-roi %s",
desc="volume roi to use",
)

cifti_roi = File(
exists=True,
position=8,
argstr="-cifti-roi %s",
desc="cifti roi to use",
)
weights_file = File(
exists=True,
position=9,
argstr="-weights %s",
desc="specify the cerebellum surface metricto use",
)

fisher_ztrans = traits.Bool(
position=10,
argstr="-fisher-z",
desc=" fisherz transfrom",
)
no_demean = traits.Bool(
position=11,
argstr="-fisher-z",
desc=" fisherz transfrom",
)
compute_covariance = traits.Bool(
position=12,
argstr="-covariance ",
desc=" compute covariance instead of correlation",
)


class CiftiCorrelationOutputSpec(TraitedSpec):
out_file = File(exists=True, desc="output CIFTI file")


class CiftiCorrelation(WBCommand):
r"""
Compute correlation from CIFTI file
The input cifti file must have a brain models mapping on the chosen
dimension, columns for .ptseries or .dtseries,
>>> cifticorr = CiftiCorrelation()
>>> cifticorr.inputs.in_file = 'sub-01XX_task-rest.ptseries.nii'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This file needs to exist (but should be empty) in https://github.com/nipy/nipype/tree/master/nipype/testing/data to allow the doctests to work.

>>> cifticorr.inputs.out_file = 'sub_01XX_task-rest.pconn.nii'
>>> cifticorr.cmdline
wb_command -cifti-correlation sub-01XX_task-rest.ptseries.nii \
'sub_01XX_task-rest.pconn.nii'
"""

input_spec = CiftiCorrelationInputSpec
output_spec = CiftiCorrelationOutputSpec
_cmd = "wb_command -cifti-correlation"


class CiftiParcellateInputSpec(CommandLineInputSpec):
in_file = File(
exists=True,
mandatory=True,
argstr="%s ",
position=0,
desc="The input CIFTI file",
)
atlas_label = traits.File(
mandatory=True,
argstr="%s ",
position=1,
desc="atlas label, in mm",
)
direction = traits.Enum(
"ROW",
"COLUMN",
mandatory=True,
argstr="%s ",
position=2,
desc="which dimension to smooth along, ROW or COLUMN",
)
out_file = File(
name_source=["in_file"],
name_template="parcelated_%s.nii",
keep_extension=True,
argstr=" %s",
position=3,
desc="The output CIFTI",
)

spatial_weights = traits.Str(
argstr="-spatial-weights ",
position=4,
desc=" spatial weight file",
)

left_area_surf = File(
exists=True,
position=5,
argstr="-left-area-surface %s",
desc="Specify the left surface to use",
)

right_area_surf = File(
exists=True,
position=6,
argstr="-right-area-surface %s",
desc="Specify the right surface to use",
)
cerebellum_area_surf = File(
exists=True,
position=7,
argstr="-cerebellum-area-surf %s",
desc="specify the cerebellum surface to use",
)

left_area_metric = File(
exists=True,
position=8,
argstr="-left-area-metric %s",
desc="Specify the left surface metric to use",
)

right_area_metric = File(
exists=True,
position=9,
argstr="-right-area-metric %s",
desc="Specify the right surface metric to use",
)
cerebellum_area_metric = File(
exists=True,
position=10,
argstr="-cerebellum-area-metric %s",
desc="specify the cerebellum surface metricto use",
)

cifti_weights = File(
exists=True,
position=11,
argstr="-cifti-weights %s",
desc="cifti file containing weights",
)
cor_method = traits.Str(
position=12,
default="MEAN ",
argstr="-method %s",
desc=" correlation method, option inlcude MODE",
)


class CiftiParcellateOutputSpec(TraitedSpec):
out_file = File(exists=True, desc="output CIFTI file")


class CiftiParcellate(WBCommand):
r"""
Extract timeseries from CIFTI file
The input cifti file must have a brain models mapping on the chosen
dimension, columns for .dtseries,
>>> ciftiparcel = CiftiParcellate()
>>> ciftiparcel.inputs.in_file = 'sub-01XX_task-rest.dtseries.nii'
>>> ciftiparcel.inputs.out_file = 'sub_01XX_task-rest.ptseries.nii'
>>> ciftiparcel.inputs.atlas_label = 'schaefer_space-fsLR_den-32k_desc-400_atlas.dlabel.nii'
>>> ciftiparcel.inputs.direction = 'COLUMN'
>>> ciftiparcel.cmdline
wb_command -cifti-parcellate sub-01XX_task-rest.dtseries.nii \
schaefer_space-fsLR_den-32k_desc-400_atlas.dlabel.nii COLUMN \
sub_01XX_task-rest.ptseries.nii
"""
input_spec = CiftiParcellateInputSpec
output_spec = CiftiParcellateOutputSpec
_cmd = "wb_command -cifti-parcellate"


class CiftiSeparateMetricInputSpec(CommandLineInputSpec):
in_file = File(
exists=True,
mandatory=True,
argstr="%s ",
position=0,
desc="The input dense series",
)
direction = traits.Enum(
"ROW",
"COLUMN",
mandatory=True,
argstr="%s ",
position=1,
desc="which dimension to smooth along, ROW or COLUMN",
)
metric = traits.Str(
mandatory=True,
argstr=" -metric %s ",
position=2,
desc="which of the structure eg CORTEX_LEFT CORTEX_RIGHT"
"check https://www.humanconnectome.org/software/workbench-command/-cifti-separate ",
)
out_file = File(
name_source=["in_file"],
name_template="correlation_matrix_%s.func.gii",
keep_extension=True,
argstr=" %s",
position=3,
desc="The gifti output, iether left and right",
)


class CiftiSeparateMetricOutputSpec(TraitedSpec):
out_file = File(exists=True, desc="output CIFTI file")


class CiftiSeparateMetric(WBCommand):
r"""
Extract left or right hemisphere surface from CIFTI file (.dtseries)
other structure can also be extracted
The input cifti file must have a brain models mapping on the chosen
dimension, columns for .dtseries,
>>> ciftiseparate = CiftiSeparateMetric()
>>> ciftiseparate.inputs.in_file = 'sub-01XX_task-rest.dtseries.nii'
>>> ciftiseparate.inputs.metric = "CORTEX_LEFT" # extract left hemisphere
>>> ciftiseparate.inputs.out_file = 'sub_01XX_task-rest_hemi-L.func.gii'
>>> ciftiseparate.inputs.direction = 'COLUMN'
>>> ciftiseparate.cmdline
wb_command -cifti-separate 'sub-01XX_task-rest.dtseries.nii' COLUMN \
-metric CORTEX_LEFT 'sub_01XX_task-rest_hemi-L.func.gii'
"""
input_spec = CiftiSeparateMetricInputSpec
output_spec = CiftiSeparateMetricOutputSpec
_cmd = "wb_command -cifti-separate "
93 changes: 93 additions & 0 deletions nipype/interfaces/workbench/tests/test_auto_CiftiCorrelation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
# AUTO-GENERATED by tools/checkspecs.py - DO NOT EDIT
from ..cifti import CiftiCorrelation


def test_CiftiCorrelation_inputs():
input_map = dict(
args=dict(
argstr="%s",
),
cerebellum_roi=dict(
argstr="-cerebellum-roi %s",
extensions=None,
position=6,
),
cifti_roi=dict(
argstr="-cifti-roi %s",
extensions=None,
position=8,
),
compute_covariance=dict(
argstr="-covariance ",
position=12,
),
environ=dict(
nohash=True,
usedefault=True,
),
fisher_ztrans=dict(
argstr="-fisher-z",
position=10,
),
in_file=dict(
argstr="%s ",
extensions=None,
mandatory=True,
position=0,
),
left_roi=dict(
argstr="-left-roi %s",
extensions=None,
position=3,
),
no_demean=dict(
argstr="-fisher-z",
position=11,
),
out_file=dict(
argstr=" %s",
extensions=None,
keep_extension=True,
name_source=["in_file"],
name_template="correlation_matrix_%s.nii",
position=1,
),
right_roi=dict(
argstr="-right-roi %s",
extensions=None,
position=5,
),
roi_override=dict(
argstr="-roi-override %s ",
exists=True,
position=2,
),
vol_roi=dict(
argstr="-vol-roi %s",
extensions=None,
position=7,
),
weights_file=dict(
argstr="-weights %s",
extensions=None,
position=9,
),
)
inputs = CiftiCorrelation.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_CiftiCorrelation_outputs():
output_map = dict(
out_file=dict(
extensions=None,
),
)
outputs = CiftiCorrelation.output_spec()

for key, metadata in list(output_map.items()):
for metakey, value in list(metadata.items()):
assert getattr(outputs.traits()[key], metakey) == value
Loading