Skip to content

ENH: Update PETsurfer interface #3602

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

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 @@ class GTMPVCOutputSpec(TraitedSpec):
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 @@ def _list_outputs(self):
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(
pvcdir, "aux", "tissue.fraction.nii.gz"
)
outputs["tissue_fraction_psf"] = os.path.join(
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")

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


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


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 @@ class MRTM2(GLMFit):
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 LoganRefInputSpec(GLMFitInputSpec):
)


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