# 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 /-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()