| 1021 | self.check_inside = _CheckInside(_bem_find_surface(self.bem, "inner_skull")) |
| 1022 | |
| 1023 | def compute(self, src): |
| 1024 | src = _ensure_src(src).copy() |
| 1025 | src._transform_to("head", self.mri_head_t) |
| 1026 | _filter_source_spaces( |
| 1027 | self.check_inside, |
| 1028 | n_jobs=self.n_jobs, |
| 1029 | limit=self.mindist, |
| 1030 | mri_head_t=self.mri_head_t, |
| 1031 | src=src, |
| 1032 | ) |
| 1033 | rr = np.concatenate([s["rr"][s["vertno"]] for s in src]) |
| 1034 | if len(rr) < 1: |
| 1035 | raise RuntimeError( |
| 1036 | "No points left in source space after excluding " |
| 1037 | "points close to inner skull." |
| 1038 | ) |
| 1039 | |
| 1040 | sensors = deepcopy(self.sensors) |
| 1041 | fwd_data = deepcopy(self.fwd_data) |
| 1042 | fwds = _compute_forwards_meeg( |
| 1043 | rr, |
| 1044 | sensors=sensors, |
| 1045 | fwd_data=fwd_data, |
| 1046 | n_jobs=self.n_jobs, |
| 1047 | ) |
| 1048 | fwds = { |
| 1049 | key: _to_forward_dict(fwds[key], sensors[key]["ch_names"]) |
| 1050 | for key in _FWD_ORDER |
| 1051 | if key in fwds |
| 1052 | } |
| 1053 | fwd = _merge_fwds(fwds, verbose=False) |
| 1054 | del fwds |
| 1055 | |
| 1056 | fwd.update(**self.update_kwargs) |
| 1057 | # Delete some keys to clean up the source space: |
| 1058 | for key in ["working_dir", "command_line"]: |
| 1059 | if key in src.info: |
| 1060 | del src.info[key] |
| 1061 | # our `update_kwargs` set these, but they need to be updated for this src |
| 1062 | fwd["src"] = src |
| 1063 | fwd["nsource"] = sum(s["nuse"] for s in src) |
| 1064 | fwd["source_rr"] = np.vstack([s["rr"][s["inuse"] == 1] for s in src]) |
| 1065 | fwd["source_nn"] = np.tile(np.eye(3), (fwd["nsource"], 1)) |
| 1066 | return fwd |