37
37
invert_transform ,
38
38
transform_surface_to ,
39
39
)
40
- from ..utils import _check_fname , _pl , _validate_type , logger , verbose , warn
40
+ from ..utils import (
41
+ _check_fname ,
42
+ _on_missing ,
43
+ _pl ,
44
+ _validate_type ,
45
+ logger ,
46
+ verbose ,
47
+ warn ,
48
+ )
41
49
from ._compute_forward import _compute_forwards
42
50
from .forward import _FWD_ORDER , Forward , _merge_fwds , convert_forward_solution
43
51
@@ -433,13 +441,15 @@ def _prepare_for_forward(
433
441
bem ,
434
442
mindist ,
435
443
n_jobs ,
444
+ * ,
436
445
bem_extra = "" ,
437
446
trans = "" ,
438
447
info_extra = "" ,
439
448
meg = True ,
440
449
eeg = True ,
441
450
ignore_ref = False ,
442
451
allow_bem_none = False ,
452
+ on_inside = "raise" ,
443
453
verbose = None ,
444
454
):
445
455
"""Prepare for forward computation.
@@ -563,11 +573,12 @@ def check_inside(x):
563
573
)
564
574
n_inside = check_inside (meg_loc ).sum ()
565
575
if n_inside :
566
- raise RuntimeError (
576
+ msg = (
567
577
f"Found { n_inside } MEG sensor{ _pl (n_inside )} inside the "
568
578
f"{ check_surface } , perhaps coordinate frames and/or "
569
- "coregistration must be incorrect"
579
+ "coregistration are incorrect"
570
580
)
581
+ _on_missing (on_inside , msg , name = "on_inside" , error_klass = RuntimeError )
571
582
572
583
rr = np .concatenate ([s ["rr" ][s ["vertno" ]] for s in src ])
573
584
if len (rr ) < 1 :
@@ -603,6 +614,7 @@ def make_forward_solution(
603
614
mindist = 0.0 ,
604
615
ignore_ref = False ,
605
616
n_jobs = None ,
617
+ on_inside = "raise" ,
606
618
verbose = None ,
607
619
):
608
620
"""Calculate a forward solution for a subject.
@@ -633,6 +645,13 @@ def make_forward_solution(
633
645
option should be True for KIT files, since forward computation
634
646
with reference channels is not currently supported.
635
647
%(n_jobs)s
648
+ on_inside : 'raise' | 'warn' | 'ignore'
649
+ What to do if MEG sensors are inside the outer skin surface. If 'raise'
650
+ (default), an error is raised. If 'warn' or 'ignore', the forward
651
+ solution is computed anyway and a warning is or isn't emitted,
652
+ respectively.
653
+
654
+ .. versionadded:: 1.10
636
655
%(verbose)s
637
656
638
657
Returns
@@ -703,12 +722,13 @@ def make_forward_solution(
703
722
bem ,
704
723
mindist ,
705
724
n_jobs ,
706
- bem_extra ,
707
- trans ,
708
- info_extra ,
709
- meg ,
710
- eeg ,
711
- ignore_ref ,
725
+ bem_extra = bem_extra ,
726
+ trans = trans ,
727
+ info_extra = info_extra ,
728
+ meg = meg ,
729
+ eeg = eeg ,
730
+ ignore_ref = ignore_ref ,
731
+ on_inside = on_inside ,
712
732
)
713
733
del (src , mri_head_t , trans , info_extra , bem_extra , mindist , meg , eeg , ignore_ref )
714
734
@@ -734,7 +754,9 @@ def make_forward_solution(
734
754
735
755
736
756
@verbose
737
- def make_forward_dipole (dipole , bem , info , trans = None , n_jobs = None , * , verbose = None ):
757
+ def make_forward_dipole (
758
+ dipole , bem , info , trans = None , n_jobs = None , * , on_inside = "raise" , verbose = None
759
+ ):
738
760
"""Convert dipole object to source estimate and calculate forward operator.
739
761
740
762
The instance of Dipole is converted to a discrete source space,
@@ -760,6 +782,13 @@ def make_forward_dipole(dipole, bem, info, trans=None, n_jobs=None, *, verbose=N
760
782
The head<->MRI transform filename. Must be provided unless BEM
761
783
is a sphere model.
762
784
%(n_jobs)s
785
+ on_inside : 'raise' | 'warn' | 'ignore'
786
+ What to do if MEG sensors are inside the outer skin surface. If 'raise'
787
+ (default), an error is raised. If 'warn' or 'ignore', the forward
788
+ solution is computed anyway and a warning is or isn't emitted,
789
+ respectively.
790
+
791
+ .. versionadded:: 1.10
763
792
%(verbose)s
764
793
765
794
Returns
@@ -798,7 +827,9 @@ def make_forward_dipole(dipole, bem, info, trans=None, n_jobs=None, *, verbose=N
798
827
799
828
# Forward operator created for channels in info (use pick_info to restrict)
800
829
# Use defaults for most params, including min_dist
801
- fwd = make_forward_solution (info , trans , src , bem , n_jobs = n_jobs , verbose = verbose )
830
+ fwd = make_forward_solution (
831
+ info , trans , src , bem , n_jobs = n_jobs , on_inside = on_inside , verbose = verbose
832
+ )
802
833
# Convert from free orientations to fixed (in-place)
803
834
convert_forward_solution (
804
835
fwd , surf_ori = False , force_fixed = True , copy = False , use_cps = False , verbose = None
0 commit comments