"""Create 3-layer BEM model from Flash MRI images. Examples -------- .. code-block:: console $ mne flash_bem --subject=sample $ mne flash_bem -s sample -n --registered -5 sample/mri/mef05.mgz -3 sample/mri/mef30.mgz $ mne flash_bem -s sample -n --registered -5 sample/mri/flash/mef05_*.mgz -3 sample/mri/flash/mef30_*.mgz Notes ----- This program assumes that FreeSurfer and MNE are installed and sourced properly. This function extracts the BEM surfaces (outer skull, inner skull, and outer skin) from multiecho FLASH MRI data with spin angles of 5 and 30 degrees. The multiecho FLASH data can be input as .mgz or .nii files. This function assumes that the Freesurfer segmentation of the subject has been completed. In particular, the T1.mgz and brain.mgz MRI volumes should be, as usual, in the subject's mri directory. """ # noqa E501 # Authors: The MNE-Python contributors. # License: BSD-3-Clause # Copyright the MNE-Python contributors. import mne from mne.bem import convert_flash_mris, make_flash_bem def _vararg_callback(option, opt_str, value, parser): assert value is None del opt_str # required for input but not used value = [] for arg in parser.rargs: # stop on --foo like options if arg[:2] == "--" and len(arg) > 2: break if arg[:1] == "-" and len(arg) > 1: break value.append(arg) del parser.rargs[: len(value)] setattr(parser.values, option.dest, value) def run(): """Run command.""" from mne.commands.utils import get_optparser parser = get_optparser(__file__) parser.add_option( "-s", "--subject", dest="subject", help="Subject name", default=None ) parser.add_option( "-d", "--subjects-dir", dest="subjects_dir", help="Subjects directory", default=None, ) parser.add_option( "-3", "--flash30", "--noflash30", dest="flash30", action="callback", callback=_vararg_callback, help=( "The 30-degree flip angle data. If no argument do " "not use flash30. If arguments are given, them as " "file names." ), ) parser.add_option( "-5", "--flash5", dest="flash5", action="callback", callback=_vararg_callback, help=("Path to the multiecho flash 5 images. Can be one file or one per echo."), ) parser.add_option( "-r", "--registered", dest="registered", action="store_true", default=False, help=( "Set if the Flash MRI images have already " "been registered with the T1.mgz file." ), ) parser.add_option( "-n", "--noconvert", dest="noconvert", action="store_true", default=False, help=( "[DEPRECATED] Assume that the Flash MRI images " "have already been converted to mgz files" ), ) parser.add_option( "-u", "--unwarp", dest="unwarp", action="store_true", default=False, help=( "Run grad_unwarp with -unwarp " "option on each of the converted data sets" ), ) parser.add_option( "-o", "--overwrite", dest="overwrite", action="store_true", default=False, help="Write over existing .surf files in bem folder", ) parser.add_option( "-v", "--view", dest="show", action="store_true", help="Show BEM model in 3D for visual inspection", default=False, ) parser.add_option( "--copy", dest="copy", help="Use copies instead of symlinks for surfaces", action="store_true", ) parser.add_option( "-p", "--flash-path", dest="flash_path", default=None, help="[DEPRECATED] The directory containing flash5.mgz " "files (defaults to " "$SUBJECTS_DIR/$SUBJECT/mri/flash/parameter_maps", ) options, _ = parser.parse_args() subject = options.subject subjects_dir = options.subjects_dir flash5 = options.flash5 if flash5 is None or len(flash5) == 0: flash5 = True flash30 = options.flash30 if flash30 is None: flash30 = True elif len(flash30) == 0: flash30 = False register = not options.registered unwarp = options.unwarp overwrite = options.overwrite show = options.show copy = options.copy if options.subject is None: parser.print_help() raise RuntimeError("The subject argument must be set") flash5_img = convert_flash_mris( subject=subject, subjects_dir=subjects_dir, flash5=flash5, flash30=flash30, unwarp=unwarp, verbose=True, ) make_flash_bem( subject=subject, subjects_dir=subjects_dir, overwrite=overwrite, show=show, copy=copy, register=register, flash5_img=flash5_img, verbose=True, ) mne.utils.run_command_if_main()