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: Update PETsurfer interface #3602

Merged
merged 9 commits into from
Mar 20, 2024
8 changes: 8 additions & 0 deletions nipype/interfaces/freesurfer/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -420,6 +420,14 @@ class GLMFitInputSpec(FSTraitedSpec):
argstr="--logan %s %s %f",
desc="RefTac TimeSec tstar : perform Logan kinetic modeling",
)
bp_clip_neg = traits.Bool(
argstr="--bp-clip-neg",
desc="set negative BP voxels to zero",
)
bp_clip_max = traits.Float(
argstr="--bp-clip-max %f",
desc="set BP voxels above max to max",
)
force_perm = traits.Bool(
argstr="--perm-force",
desc="force perumtation test, even when design matrix is not orthog",
Expand Down
44 changes: 34 additions & 10 deletions nipype/interfaces/freesurfer/petsurfer.py
Original file line number Diff line number Diff line change
Expand Up @@ -458,10 +458,25 @@
yhat_with_noise = File(
desc="4D PET file with full FOV of signal estimate (yhat) with noise after PVC (smoothed with PSF)",
)
eres = File(
desc="4D PET file of residual error after PVC (smoothed with PSF)",
)
tissue_fraction = File(
desc="4D PET file of tissue fraction before PVC",
)
tissue_fraction_psf = File(
desc="4D PET file of tissue fraction after PVC (smoothed with PSF)",
)
seg = File(
desc="Segmentation file of regions used for PVC",
)
seg_ctab = File(
desc="Color table file for segmentation file",
)


class GTMPVC(FSCommand):
"""create an anatomical segmentation for the geometric transfer matrix (GTM).
"""Perform Partial Volume Correction (PVC) to PET Data.

Examples
--------
Expand Down Expand Up @@ -536,6 +551,15 @@
outputs["gtm_stats"] = os.path.join(pvcdir, "gtm.stats.dat")
outputs["reg_pet2anat"] = os.path.join(pvcdir, "aux", "bbpet2anat.lta")
outputs["reg_anat2pet"] = os.path.join(pvcdir, "aux", "anat2bbpet.lta")
outputs["eres"] = os.path.join(pvcdir, "eres.nii.gz")
outputs["tissue_fraction"] = os.path.join(

Check warning on line 555 in nipype/interfaces/freesurfer/petsurfer.py

View check run for this annotation

Codecov / codecov/patch

nipype/interfaces/freesurfer/petsurfer.py#L554-L555

Added lines #L554 - L555 were not covered by tests
pvcdir, "aux", "tissue.fraction.nii.gz"
)
outputs["tissue_fraction_psf"] = os.path.join(

Check warning on line 558 in nipype/interfaces/freesurfer/petsurfer.py

View check run for this annotation

Codecov / codecov/patch

nipype/interfaces/freesurfer/petsurfer.py#L558

Added line #L558 was not covered by tests
pvcdir, "aux", "tissue.fraction.psf.nii.gz"
)
outputs["seg"] = os.path.join(pvcdir, "aux", "seg.nii.gz")
outputs["seg_ctab"] = os.path.join(pvcdir, "aux", "seg.ctab")

Check warning on line 562 in nipype/interfaces/freesurfer/petsurfer.py

View check run for this annotation

Codecov / codecov/patch

nipype/interfaces/freesurfer/petsurfer.py#L561-L562

Added lines #L561 - L562 were not covered by tests

# Assign the conditional outputs
if self.inputs.save_input:
Expand All @@ -562,7 +586,7 @@
return outputs


class MRTMInputSpec(GLMFitInputSpec):
class MRTM1InputSpec(GLMFitInputSpec):
mrtm1 = traits.Tuple(
File(exists=True),
File(exists=True),
Expand All @@ -572,20 +596,20 @@
)


class MRTM(GLMFit):
class MRTM1(GLMFit):
"""Perform MRTM1 kinetic modeling.

Examples
--------
>>> mrtm = MRTM()
>>> mrtm = MRTM1()
>>> mrtm.inputs.in_file = 'tac.nii'
>>> mrtm.inputs.mrtm1 = ('ref_tac.dat', 'timing.dat')
>>> mrtm.inputs.glm_dir = 'mrtm'
>>> mrtm.cmdline
'mri_glmfit --glmdir mrtm --y tac.nii --mrtm1 ref_tac.dat timing.dat'
"""

input_spec = MRTMInputSpec
input_spec = MRTM1InputSpec


class MRTM2InputSpec(GLMFitInputSpec):
Expand Down Expand Up @@ -614,7 +638,7 @@
input_spec = MRTM2InputSpec


class LoganRefInputSpec(GLMFitInputSpec):
class LoganInputSpec(GLMFitInputSpec):
logan = traits.Tuple(
File(exists=True),
File(exists=True),
Expand All @@ -625,16 +649,16 @@
)


class LoganRef(GLMFit):
"""Perform Logan reference kinetic modeling.
class Logan(GLMFit):
"""Perform Logan kinetic modeling.
Examples
--------
>>> logan = LoganRef()
>>> logan = Logan()
>>> logan.inputs.in_file = 'tac.nii'
>>> logan.inputs.logan = ('ref_tac.dat', 'timing.dat', 2600)
>>> logan.inputs.glm_dir = 'logan'
>>> logan.cmdline
'mri_glmfit --glmdir logan --y tac.nii --logan ref_tac.dat timing.dat 2600'
"""

input_spec = LoganRefInputSpec
input_spec = LoganInputSpec
6 changes: 6 additions & 0 deletions nipype/interfaces/freesurfer/tests/test_auto_GLMFit.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,12 @@ def test_GLMFit_inputs():
args=dict(
argstr="%s",
),
bp_clip_max=dict(
argstr="--bp-clip-max %f",
),
bp_clip_neg=dict(
argstr="--bp-clip-neg",
),
calc_AR1=dict(
argstr="--tar1",
),
Expand Down
15 changes: 15 additions & 0 deletions nipype/interfaces/freesurfer/tests/test_auto_GTMPVC.py
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,9 @@ def test_GTMPVC_inputs():

def test_GTMPVC_outputs():
output_map = dict(
eres=dict(
extensions=None,
),
gtm_file=dict(
extensions=None,
),
Expand Down Expand Up @@ -256,6 +259,18 @@ def test_GTMPVC_outputs():
reg_rbvpet2anat=dict(
extensions=None,
),
seg=dict(
extensions=None,
),
seg_ctab=dict(
extensions=None,
),
tissue_fraction=dict(
extensions=None,
),
tissue_fraction_psf=dict(
extensions=None,
),
yhat=dict(
extensions=None,
),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# AUTO-GENERATED by tools/checkspecs.py - DO NOT EDIT
from ..petsurfer import LoganRef
from ..petsurfer import Logan


def test_LoganRef_inputs():
def test_Logan_inputs():
input_map = dict(
allow_ill_cond=dict(
argstr="--illcond",
Expand All @@ -13,6 +13,12 @@ def test_LoganRef_inputs():
args=dict(
argstr="%s",
),
bp_clip_max=dict(
argstr="--bp-clip-max %f",
),
bp_clip_neg=dict(
argstr="--bp-clip-neg",
),
calc_AR1=dict(
argstr="--tar1",
),
Expand Down Expand Up @@ -214,14 +220,14 @@ def test_LoganRef_inputs():
xor=("weight_file", "weight_inv", "weight_sqrt"),
),
)
inputs = LoganRef.input_spec()
inputs = Logan.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_LoganRef_outputs():
def test_Logan_outputs():
output_map = dict(
beta_file=dict(
extensions=None,
Expand Down Expand Up @@ -271,7 +277,7 @@ def test_LoganRef_outputs():
extensions=None,
),
)
outputs = LoganRef.output_spec()
outputs = Logan.output_spec()

for key, metadata in list(output_map.items()):
for metakey, value in list(metadata.items()):
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# AUTO-GENERATED by tools/checkspecs.py - DO NOT EDIT
from ..petsurfer import MRTM
from ..petsurfer import MRTM1


def test_MRTM_inputs():
def test_MRTM1_inputs():
input_map = dict(
allow_ill_cond=dict(
argstr="--illcond",
Expand All @@ -13,6 +13,12 @@ def test_MRTM_inputs():
args=dict(
argstr="%s",
),
bp_clip_max=dict(
argstr="--bp-clip-max %f",
),
bp_clip_neg=dict(
argstr="--bp-clip-neg",
),
calc_AR1=dict(
argstr="--tar1",
),
Expand Down Expand Up @@ -214,14 +220,14 @@ def test_MRTM_inputs():
xor=("weight_file", "weight_inv", "weight_sqrt"),
),
)
inputs = MRTM.input_spec()
inputs = MRTM1.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_MRTM_outputs():
def test_MRTM1_outputs():
output_map = dict(
beta_file=dict(
extensions=None,
Expand Down Expand Up @@ -271,7 +277,7 @@ def test_MRTM_outputs():
extensions=None,
),
)
outputs = MRTM.output_spec()
outputs = MRTM1.output_spec()

for key, metadata in list(output_map.items()):
for metakey, value in list(metadata.items()):
Expand Down
6 changes: 6 additions & 0 deletions nipype/interfaces/freesurfer/tests/test_auto_MRTM2.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,12 @@ def test_MRTM2_inputs():
args=dict(
argstr="%s",
),
bp_clip_max=dict(
argstr="--bp-clip-max %f",
),
bp_clip_neg=dict(
argstr="--bp-clip-neg",
),
calc_AR1=dict(
argstr="--tar1",
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,12 @@ def test_OneSampleTTest_inputs():
args=dict(
argstr="%s",
),
bp_clip_max=dict(
argstr="--bp-clip-max %f",
),
bp_clip_neg=dict(
argstr="--bp-clip-neg",
),
calc_AR1=dict(
argstr="--tar1",
),
Expand Down