151 lines
4.2 KiB
Python
151 lines
4.2 KiB
Python
# Authors: The MNE-Python contributors.
|
|
# License: BSD-3-Clause
|
|
# Copyright the MNE-Python contributors.
|
|
|
|
"""Create a BEM model for a subject.
|
|
|
|
Examples
|
|
--------
|
|
.. code-block:: console
|
|
|
|
$ mne setup_forward_model -s 'sample'
|
|
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
|
|
import mne
|
|
from mne.utils import get_subjects_dir, warn
|
|
|
|
|
|
def run():
|
|
"""Run command."""
|
|
from mne.commands.utils import _add_verbose_flag, get_optparser
|
|
|
|
parser = get_optparser(__file__)
|
|
|
|
parser.add_option(
|
|
"-s", "--subject", dest="subject", help="Subject name (required)", default=None
|
|
)
|
|
parser.add_option(
|
|
"--model",
|
|
dest="model",
|
|
help="Output file name. Use a name <dir>/<name>-bem.fif",
|
|
default=None,
|
|
type="string",
|
|
)
|
|
parser.add_option(
|
|
"--ico",
|
|
dest="ico",
|
|
help="The surface ico downsampling to use, e.g. "
|
|
" 5=20484, 4=5120, 3=1280. If None, no subsampling"
|
|
" is applied.",
|
|
default=None,
|
|
type="int",
|
|
)
|
|
parser.add_option(
|
|
"--brainc",
|
|
dest="brainc",
|
|
help="Defines the brain compartment conductivity. "
|
|
"The default value is 0.3 S/m.",
|
|
default=0.3,
|
|
type="float",
|
|
)
|
|
parser.add_option(
|
|
"--skullc",
|
|
dest="skullc",
|
|
help="Defines the skull compartment conductivity. "
|
|
"The default value is 0.006 S/m.",
|
|
default=None,
|
|
type="float",
|
|
)
|
|
parser.add_option(
|
|
"--scalpc",
|
|
dest="scalpc",
|
|
help="Defines the scalp compartment conductivity. "
|
|
"The default value is 0.3 S/m.",
|
|
default=None,
|
|
type="float",
|
|
)
|
|
parser.add_option(
|
|
"--homog",
|
|
dest="homog",
|
|
help="Use a single compartment model (brain only) "
|
|
"instead a three layer one (scalp, skull, and "
|
|
" brain). If this flag is specified, the options "
|
|
"--skullc and --scalpc are irrelevant.",
|
|
default=None,
|
|
action="store_true",
|
|
)
|
|
parser.add_option(
|
|
"-d",
|
|
"--subjects-dir",
|
|
dest="subjects_dir",
|
|
help="Subjects directory",
|
|
default=None,
|
|
)
|
|
_add_verbose_flag(parser)
|
|
options, args = parser.parse_args()
|
|
|
|
if options.subject is None:
|
|
parser.print_help()
|
|
sys.exit(1)
|
|
|
|
subject = options.subject
|
|
fname = options.model
|
|
subjects_dir = options.subjects_dir
|
|
ico = options.ico
|
|
brainc = options.brainc
|
|
skullc = options.skullc
|
|
scalpc = options.scalpc
|
|
homog = True if options.homog is not None else False
|
|
verbose = True if options.verbose is not None else False
|
|
# Parse conductivity option
|
|
if homog is True:
|
|
if skullc is not None:
|
|
warn(
|
|
"Trying to set the skull conductivity for a single layer "
|
|
"model. To use a 3 layer model, do not set the --homog flag."
|
|
)
|
|
if scalpc is not None:
|
|
warn(
|
|
"Trying to set the scalp conductivity for a single layer "
|
|
"model. To use a 3 layer model, do not set the --homog flag."
|
|
)
|
|
# Single layer
|
|
conductivity = [brainc]
|
|
else:
|
|
if skullc is None:
|
|
skullc = 0.006
|
|
if scalpc is None:
|
|
scalpc = 0.3
|
|
conductivity = [brainc, skullc, scalpc]
|
|
# Create source space
|
|
bem_model = mne.make_bem_model(
|
|
subject,
|
|
ico=ico,
|
|
conductivity=conductivity,
|
|
subjects_dir=subjects_dir,
|
|
verbose=verbose,
|
|
)
|
|
# Generate filename
|
|
if fname is None:
|
|
n_faces = list(str(len(surface["tris"])) for surface in bem_model)
|
|
fname = subject + "-" + "-".join(n_faces) + "-bem.fif"
|
|
else:
|
|
if not (fname.endswith("-bem.fif") or fname.endswith("_bem.fif")):
|
|
fname = fname + "-bem.fif"
|
|
# Save to subject's directory
|
|
subjects_dir = get_subjects_dir(subjects_dir, raise_error=True)
|
|
fname = subjects_dir / subject / "bem" / fname
|
|
# Save source space to file
|
|
mne.write_bem_surfaces(fname, bem_model)
|
|
# Compute the solution
|
|
sol_fname = os.path.splitext(str(fname))[0] + "-sol.fif"
|
|
bem_sol = mne.make_bem_solution(bem_model, verbose=verbose)
|
|
mne.write_bem_solution(sol_fname, bem_sol)
|
|
|
|
|
|
mne.utils.run_command_if_main()
|