Skip to content

Commit

Permalink
Merge pull request #3602 from mnoergaard/update_petsurfer
Browse files Browse the repository at this point in the history
ENH: Update PETsurfer interface
  • Loading branch information
effigies committed Mar 20, 2024
2 parents d2f4953 + 6b7bda4 commit 1b5793a
Show file tree
Hide file tree
Showing 8 changed files with 97 additions and 20 deletions.
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

0 comments on commit 1b5793a

Please sign in to comment.