115 lines
3.1 KiB
Python
115 lines
3.1 KiB
Python
"""View the 3-Layers BEM model using Freeview.
|
|
|
|
Examples
|
|
--------
|
|
.. code-block:: console
|
|
|
|
$ mne freeview_bem_surfaces -s sample
|
|
|
|
"""
|
|
|
|
# Authors: The MNE-Python contributors.
|
|
# License: BSD-3-Clause
|
|
# Copyright the MNE-Python contributors.
|
|
|
|
import os
|
|
import os.path as op
|
|
import sys
|
|
|
|
import mne
|
|
from mne.utils import get_subjects_dir, run_subprocess
|
|
|
|
|
|
def freeview_bem_surfaces(subject, subjects_dir, method=None):
|
|
"""View 3-Layers BEM model with Freeview.
|
|
|
|
Parameters
|
|
----------
|
|
subject : str
|
|
Subject name
|
|
subjects_dir : path-like
|
|
Directory containing subjects data (Freesurfer SUBJECTS_DIR)
|
|
method : str | None
|
|
Can be ``'flash'`` or ``'watershed'``, or None to use the ``bem/`` directory
|
|
files.
|
|
"""
|
|
subjects_dir = str(get_subjects_dir(subjects_dir, raise_error=True))
|
|
|
|
if subject is None:
|
|
raise ValueError("subject argument is None.")
|
|
|
|
subject_dir = op.join(subjects_dir, subject)
|
|
|
|
if not op.isdir(subject_dir):
|
|
raise ValueError(
|
|
f"Wrong path: '{subject_dir}'. Check subjects-dir or subject argument."
|
|
)
|
|
|
|
env = os.environ.copy()
|
|
env["SUBJECT"] = subject
|
|
env["SUBJECTS_DIR"] = subjects_dir
|
|
|
|
if "FREESURFER_HOME" not in env:
|
|
raise RuntimeError("The FreeSurfer environment needs to be set up.")
|
|
|
|
mri_dir = op.join(subject_dir, "mri")
|
|
bem_dir = op.join(subject_dir, "bem")
|
|
mri = op.join(mri_dir, "T1.mgz")
|
|
|
|
if method == "watershed":
|
|
bem_dir = op.join(bem_dir, "watershed")
|
|
outer_skin = op.join(bem_dir, f"{subject}_outer_skin_surface")
|
|
outer_skull = op.join(bem_dir, f"{subject}_outer_skull_surface")
|
|
inner_skull = op.join(bem_dir, f"{subject}_inner_skull_surface")
|
|
else:
|
|
if method == "flash":
|
|
bem_dir = op.join(bem_dir, "flash")
|
|
outer_skin = op.join(bem_dir, "outer_skin.surf")
|
|
outer_skull = op.join(bem_dir, "outer_skull.surf")
|
|
inner_skull = op.join(bem_dir, "inner_skull.surf")
|
|
|
|
# put together the command
|
|
cmd = ["freeview"]
|
|
cmd += ["--volume", mri]
|
|
cmd += ["--surface", f"{inner_skull}:color=red:edgecolor=red"]
|
|
cmd += ["--surface", f"{outer_skull}:color=yellow:edgecolor=yellow"]
|
|
cmd += ["--surface", f"{outer_skin}:color=255,170,127:edgecolor=255,170,127"]
|
|
|
|
run_subprocess(cmd, env=env, stdout=sys.stdout)
|
|
print("[done]")
|
|
|
|
|
|
def run():
|
|
"""Run command."""
|
|
from mne.commands.utils import get_optparser
|
|
|
|
parser = get_optparser(__file__)
|
|
|
|
subject = os.environ.get("SUBJECT")
|
|
parser.add_option(
|
|
"-s", "--subject", dest="subject", help="Subject name", default=subject
|
|
)
|
|
parser.add_option(
|
|
"-d",
|
|
"--subjects-dir",
|
|
dest="subjects_dir",
|
|
help="Subjects directory",
|
|
)
|
|
parser.add_option(
|
|
"-m",
|
|
"--method",
|
|
dest="method",
|
|
help="Method used to generate the BEM model. Can be flash or watershed.",
|
|
)
|
|
|
|
options, args = parser.parse_args()
|
|
|
|
subject = options.subject
|
|
subjects_dir = options.subjects_dir
|
|
method = options.method
|
|
|
|
freeview_bem_surfaces(subject, subjects_dir, method)
|
|
|
|
|
|
mne.utils.run_command_if_main()
|