diff --git a/nipype/interfaces/workbench/__init__.py b/nipype/interfaces/workbench/__init__.py index fb68624c88..d33263fafe 100644 --- a/nipype/interfaces/workbench/__init__.py +++ b/nipype/interfaces/workbench/__init__.py @@ -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 diff --git a/nipype/interfaces/workbench/cifti.py b/nipype/interfaces/workbench/cifti.py index 272aec1a3e..12728c0af6 100644 --- a/nipype/interfaces/workbench/cifti.py +++ b/nipype/interfaces/workbench/cifti.py @@ -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' + >>> 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 " diff --git a/nipype/interfaces/workbench/tests/test_auto_CiftiCorrelation.py b/nipype/interfaces/workbench/tests/test_auto_CiftiCorrelation.py new file mode 100644 index 0000000000..164d6ad5a4 --- /dev/null +++ b/nipype/interfaces/workbench/tests/test_auto_CiftiCorrelation.py @@ -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 diff --git a/nipype/interfaces/workbench/tests/test_auto_CiftiParcellate.py b/nipype/interfaces/workbench/tests/test_auto_CiftiParcellate.py new file mode 100644 index 0000000000..cd6fcfcc4a --- /dev/null +++ b/nipype/interfaces/workbench/tests/test_auto_CiftiParcellate.py @@ -0,0 +1,99 @@ +# AUTO-GENERATED by tools/checkspecs.py - DO NOT EDIT +from ..cifti import CiftiParcellate + + +def test_CiftiParcellate_inputs(): + input_map = dict( + args=dict( + argstr="%s", + ), + atlas_label=dict( + argstr="%s ", + mandatory=True, + position=1, + ), + cerebellum_area_metric=dict( + argstr="-cerebellum-area-metric %s", + extensions=None, + position=10, + ), + cerebellum_area_surf=dict( + argstr="-cerebellum-area-surf %s", + extensions=None, + position=7, + ), + cifti_weights=dict( + argstr="-cifti-weights %s", + extensions=None, + position=11, + ), + cor_method=dict( + argstr="-method %s", + position=12, + ), + direction=dict( + argstr="%s ", + mandatory=True, + position=2, + ), + environ=dict( + nohash=True, + usedefault=True, + ), + in_file=dict( + argstr="%s ", + extensions=None, + mandatory=True, + position=0, + ), + left_area_metric=dict( + argstr="-left-area-metric %s", + extensions=None, + position=8, + ), + left_area_surf=dict( + argstr="-left-area-surface %s", + extensions=None, + position=5, + ), + out_file=dict( + argstr=" %s", + extensions=None, + keep_extension=True, + name_source=["in_file"], + name_template="parcelated_%s.nii", + position=3, + ), + right_area_metric=dict( + argstr="-right-area-metric %s", + extensions=None, + position=9, + ), + right_area_surf=dict( + argstr="-right-area-surface %s", + extensions=None, + position=6, + ), + spatial_weights=dict( + argstr="-spatial-weights ", + position=4, + ), + ) + inputs = CiftiParcellate.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_CiftiParcellate_outputs(): + output_map = dict( + out_file=dict( + extensions=None, + ), + ) + outputs = CiftiParcellate.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/workbench/tests/test_auto_CiftiSeparateMetric.py b/nipype/interfaces/workbench/tests/test_auto_CiftiSeparateMetric.py new file mode 100644 index 0000000000..adc8af76d0 --- /dev/null +++ b/nipype/interfaces/workbench/tests/test_auto_CiftiSeparateMetric.py @@ -0,0 +1,56 @@ +# AUTO-GENERATED by tools/checkspecs.py - DO NOT EDIT +from ..cifti import CiftiSeparateMetric + + +def test_CiftiSeparateMetric_inputs(): + input_map = dict( + args=dict( + argstr="%s", + ), + direction=dict( + argstr="%s ", + mandatory=True, + position=1, + ), + environ=dict( + nohash=True, + usedefault=True, + ), + in_file=dict( + argstr="%s ", + extensions=None, + mandatory=True, + position=0, + ), + metric=dict( + argstr=" -metric %s ", + mandatory=True, + position=2, + ), + out_file=dict( + argstr=" %s", + extensions=None, + keep_extension=True, + name_source=["in_file"], + name_template="correlation_matrix_%s.func.gii", + position=3, + ), + ) + inputs = CiftiSeparateMetric.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_CiftiSeparateMetric_outputs(): + output_map = dict( + out_file=dict( + extensions=None, + ), + ) + outputs = CiftiSeparateMetric.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/testing/data/sub-01XX_task-rest.ptseries.nii b/nipype/testing/data/sub-01XX_task-rest.ptseries.nii new file mode 100644 index 0000000000..ed5de6dce8 Binary files /dev/null and b/nipype/testing/data/sub-01XX_task-rest.ptseries.nii differ