From 5060f70567f2ec8f6449299431c9f90bc1387155 Mon Sep 17 00:00:00 2001 From: Marijn van Vliet Date: Thu, 11 Sep 2025 14:27:48 +0300 Subject: [PATCH 1/5] Make _ForwardModeler fill out the complete forward object --- mne/forward/_make_forward.py | 21 ++++++++++++++++++--- mne/forward/tests/test_make_forward.py | 2 ++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/mne/forward/_make_forward.py b/mne/forward/_make_forward.py index 02eb6cc1c6a..2175213b1d8 100644 --- a/mne/forward/_make_forward.py +++ b/mne/forward/_make_forward.py @@ -961,7 +961,7 @@ def __init__( self.mindist = mindist self.n_jobs = n_jobs src = SourceSpaces([]) - self.sensors, _, _, _, self.bem = _prepare_for_forward( + self.sensors, _, _, self.update_kwargs, self.bem = _prepare_for_forward( src, self.mri_head_t, info, @@ -988,8 +988,13 @@ def __init__( def compute(self, src): src = _ensure_src(src).copy() src._transform_to("head", self.mri_head_t) - kwargs = dict(limit=self.mindist, mri_head_t=self.mri_head_t, src=src) - _filter_source_spaces(self.check_inside, n_jobs=self.n_jobs, **kwargs) + _filter_source_spaces( + self.check_inside, + n_jobs=self.n_jobs, + limit=self.mindist, + mri_head_t=self.mri_head_t, + src=src, + ) rr = np.concatenate([s["rr"][s["vertno"]] for s in src]) if len(rr) < 1: raise RuntimeError( @@ -1012,4 +1017,14 @@ def compute(self, src): } fwd = _merge_fwds(fwds, verbose=False) del fwds + + fwd.update(**self.update_kwargs) + # Delete some keys to clean up the source space: + for key in ["working_dir", "command_line"]: + if key in src.info: + del src.info[key] + fwd["src"] = src + fwd["nsource"] = sum(s["nuse"] for s in src) + fwd["source_rr"] = np.vstack([s["rr"][s["inuse"] == 1] for s in src]) + fwd["source_nn"] = np.tile(np.eye(3), (fwd["nsource"], 1)) return fwd diff --git a/mne/forward/tests/test_make_forward.py b/mne/forward/tests/test_make_forward.py index 34494c57fde..268dd263af9 100644 --- a/mne/forward/tests/test_make_forward.py +++ b/mne/forward/tests/test_make_forward.py @@ -926,6 +926,8 @@ def test_make_forward_iterative(): fwd = make_forward_solution(raw.info, trans, src, bem, mindist=0, verbose=True) # check against iterative version fm = _ForwardModeler(raw.info, trans, bem) + fwd_iterative = fm.compute(src) + _compare_forwards(fwd, fwd_iterative, fwd["nchan"], 3 * fwd["nsource"]) midpt = fwd["nsource"] // 2 assert fwd["coord_frame"] == FIFF.FIFFV_COORD_HEAD fwd_data = list() From 3d8c114ea9a9e6795b989a43f26aa67b6c1adc3f Mon Sep 17 00:00:00 2001 From: Eric Larson Date: Thu, 11 Sep 2025 09:24:20 -0400 Subject: [PATCH 2/5] FIX: Comment --- mne/conftest.py | 2 ++ mne/forward/_make_forward.py | 1 + 2 files changed, 3 insertions(+) diff --git a/mne/conftest.py b/mne/conftest.py index 334f1cbe801..ce854d6b3f1 100644 --- a/mne/conftest.py +++ b/mne/conftest.py @@ -197,6 +197,8 @@ def pytest_configure(config: pytest.Config): # sklearn ignore:Python binding for RankQuantileOptions.*:RuntimeWarning ignore:.*The `disp` and `iprint` options of the L-BFGS-B solver.*:DeprecationWarning + # matplotlib<->nilearn + ignore:.*You are using the 'agg' matplotlib backend[\S\s]*:UserWarning """ # noqa: E501 for warning_line in warning_lines.split("\n"): warning_line = warning_line.strip() diff --git a/mne/forward/_make_forward.py b/mne/forward/_make_forward.py index 2175213b1d8..de87b20f8a3 100644 --- a/mne/forward/_make_forward.py +++ b/mne/forward/_make_forward.py @@ -1023,6 +1023,7 @@ def compute(self, src): for key in ["working_dir", "command_line"]: if key in src.info: del src.info[key] + # update_kwargs sets these but they need to be updated for the new src fwd["src"] = src fwd["nsource"] = sum(s["nuse"] for s in src) fwd["source_rr"] = np.vstack([s["rr"][s["inuse"] == 1] for s in src]) From 51ca3a0c2e29e191ee780ecd9a3fab7e45411bf4 Mon Sep 17 00:00:00 2001 From: Eric Larson Date: Thu, 11 Sep 2025 10:10:19 -0400 Subject: [PATCH 3/5] FIX: Leading newline --- mne/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mne/conftest.py b/mne/conftest.py index ce854d6b3f1..f83f6e8bf78 100644 --- a/mne/conftest.py +++ b/mne/conftest.py @@ -198,7 +198,7 @@ def pytest_configure(config: pytest.Config): ignore:Python binding for RankQuantileOptions.*:RuntimeWarning ignore:.*The `disp` and `iprint` options of the L-BFGS-B solver.*:DeprecationWarning # matplotlib<->nilearn - ignore:.*You are using the 'agg' matplotlib backend[\S\s]*:UserWarning + ignore:[\S\s]*You are using the 'agg' matplotlib backend[\S\s]*:UserWarning """ # noqa: E501 for warning_line in warning_lines.split("\n"): warning_line = warning_line.strip() From 91dbec15c276c85c7edae739093fe77c6e4576a3 Mon Sep 17 00:00:00 2001 From: Marijn van Vliet Date: Thu, 11 Sep 2025 17:16:23 +0300 Subject: [PATCH 4/5] Update mne/forward/_make_forward.py Co-authored-by: Eric Larson --- mne/forward/_make_forward.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mne/forward/_make_forward.py b/mne/forward/_make_forward.py index de87b20f8a3..6029df639dc 100644 --- a/mne/forward/_make_forward.py +++ b/mne/forward/_make_forward.py @@ -1025,6 +1025,7 @@ def compute(self, src): del src.info[key] # update_kwargs sets these but they need to be updated for the new src fwd["src"] = src + # our `update_kwargs` set these, but they need to be updated for this src fwd["nsource"] = sum(s["nuse"] for s in src) fwd["source_rr"] = np.vstack([s["rr"][s["inuse"] == 1] for s in src]) fwd["source_nn"] = np.tile(np.eye(3), (fwd["nsource"], 1)) From d3541f290cbac3030d4fd8568dbb296ce62e81ef Mon Sep 17 00:00:00 2001 From: Marijn van Vliet Date: Thu, 11 Sep 2025 17:20:05 +0300 Subject: [PATCH 5/5] remove double comment --- mne/forward/_make_forward.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mne/forward/_make_forward.py b/mne/forward/_make_forward.py index 6029df639dc..d9447078d29 100644 --- a/mne/forward/_make_forward.py +++ b/mne/forward/_make_forward.py @@ -1023,9 +1023,8 @@ def compute(self, src): for key in ["working_dir", "command_line"]: if key in src.info: del src.info[key] - # update_kwargs sets these but they need to be updated for the new src - fwd["src"] = src # our `update_kwargs` set these, but they need to be updated for this src + fwd["src"] = src fwd["nsource"] = sum(s["nuse"] for s in src) fwd["source_rr"] = np.vstack([s["rr"][s["inuse"] == 1] for s in src]) fwd["source_nn"] = np.tile(np.eye(3), (fwd["nsource"], 1))