Skip to content

Commit fa11865

Browse files
BUG: Fix dev_head_t for EEG data (#13112)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
1 parent 043c8be commit fa11865

File tree

13 files changed

+23
-9
lines changed

13 files changed

+23
-9
lines changed

doc/changes/devel/13112.bugfix.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix bug with :func:`mne.io.read_raw_egi` where ``info["dev_head_t"]`` was an identity matrix instead of ``None``, by `Eric Larson`_.

mne/_fiff/meas_info.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3326,13 +3326,12 @@ def create_info(ch_names, sfreq, ch_types="misc", verbose=None):
33263326

33273327
def _empty_info(sfreq):
33283328
"""Create an empty info dictionary."""
3329-
from ..transforms import Transform
3330-
33313329
_none_keys = (
33323330
"acq_pars",
33333331
"acq_stim",
33343332
"ctf_head_t",
33353333
"description",
3334+
"dev_head_t",
33363335
"dev_ctf_t",
33373336
"dig",
33383337
"experimenter",
@@ -3373,7 +3372,6 @@ def _empty_info(sfreq):
33733372
info["highpass"] = 0.0
33743373
info["sfreq"] = float(sfreq)
33753374
info["lowpass"] = info["sfreq"] / 2.0
3376-
info["dev_head_t"] = Transform("meg", "head")
33773375
info._update_redundant()
33783376
info._check_consistency()
33793377
return info

mne/chpi.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
_sss_basis,
5656
)
5757
from .transforms import (
58+
Transform,
5859
_angle_between_quats,
5960
_fit_matched_points,
6061
_quat_to_affine,
@@ -1274,6 +1275,7 @@ def compute_chpi_locs(
12741275
t_step_max=1.0,
12751276
too_close="raise",
12761277
adjust_dig=False,
1278+
*,
12771279
verbose=None,
12781280
):
12791281
"""Compute locations of each cHPI coils over time.
@@ -1323,6 +1325,7 @@ def compute_chpi_locs(
13231325
_check_option("too_close", too_close, ["raise", "warning", "info"])
13241326
_check_chpi_param(chpi_amplitudes, "chpi_amplitudes")
13251327
_validate_type(info, Info, "info")
1328+
_validate_type(info["dev_head_t"], Transform, "info['dev_head_t']")
13261329
sin_fits = chpi_amplitudes # use the old name below
13271330
del chpi_amplitudes
13281331
proj = sin_fits["proj"]

mne/forward/_make_forward.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,8 @@ def _prepare_for_forward(
485485
info = Info(
486486
chs=info["chs"],
487487
comps=info["comps"],
488-
dev_head_t=info["dev_head_t"],
488+
# The forward-writing code always wants a dev_head_t, so give an identity one
489+
dev_head_t=info["dev_head_t"] or Transform("meg", "head"),
489490
mri_file=info_trans,
490491
mri_id=mri_id,
491492
meas_file=info_extra,

mne/forward/forward.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,6 @@ def _get_tag_int(fid, node, name, id_):
318318
"""Check we have an appropriate tag."""
319319
tag = find_tag(fid, node, id_)
320320
if tag is None:
321-
fid.close()
322321
raise ValueError(name + " tag not found")
323322
return int(tag.data.item())
324323

@@ -649,7 +648,6 @@ def read_forward_solution(fname, include=(), exclude=(), *, ordered=True, verbos
649648
mri_head_t["from"] != FIFF.FIFFV_COORD_MRI
650649
or mri_head_t["to"] != FIFF.FIFFV_COORD_HEAD
651650
):
652-
fid.close()
653651
raise ValueError("MRI/head coordinate transformation not found")
654652
fwd["mri_head_t"] = mri_head_t
655653

@@ -1124,7 +1122,6 @@ def write_forward_meas_info(fid, info):
11241122
# get transformation from CTF and DEVICE to HEAD coordinate frame
11251123
meg_head_t = info.get("dev_head_t", info.get("ctf_head_t"))
11261124
if meg_head_t is None:
1127-
fid.close()
11281125
raise ValueError("Head<-->sensor transform not found")
11291126
write_coord_trans(fid, meg_head_t)
11301127

mne/forward/tests/test_make_forward.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -791,6 +791,7 @@ def test_use_coil_def(tmp_path):
791791
info = create_info(1, 1000.0, "mag")
792792
info["chs"][0]["coil_type"] = 9999
793793
info["chs"][0]["loc"][:] = [0, 0, 0.02, 1, 0, 0, 0, 1, 0, 0, 0, 1]
794+
info["dev_head_t"] = Transform("meg", "head")
794795
sphere = make_sphere_model((0.0, 0.0, 0.0), 0.01)
795796
src = setup_volume_source_space(pos=5, sphere=sphere)
796797
trans = Transform("head", "mri", None)

mne/io/artemis123/artemis123.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,8 @@ def __init__(
398398
self, tmin=0, tmax=0.25, t_window=0.25, t_step_min=0.25
399399
)
400400
assert len(coil_amplitudes["times"]) == 1
401+
# Need an ititial dev_head_t to compute coil locations
402+
self.info["dev_head_t"] = Transform("meg", "head")
401403
coil_locs = compute_chpi_locs(self.info, coil_amplitudes)
402404
with info._unlock():
403405
info["hpi_results"] = None

mne/io/artemis123/tests/test_artemis123.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ def test_dev_head_t():
5959
"""Test dev_head_t computation for Artemis123."""
6060
# test a random selected point
6161
raw = read_raw_artemis123(short_hpi_1kz_fname, preload=True, add_head_trans=False)
62+
assert raw.info["dev_head_t"] is None
6263
meg_picks = pick_types(raw.info, meg=True, eeg=False)
6364

6465
# checked against matlab reader.

mne/io/egi/tests/test_egi.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ def test_egi_mff_pause(fname, skip_times, event_times):
8383
events_as_annotations=False,
8484
)
8585
assert raw.info["sfreq"] == 250.0 # true for all of these files
86+
assert raw.info["dev_head_t"] is None # no MEG data
8687
assert len(raw.annotations) == len(skip_times)
8788

8889
# assert event onsets match expected times

mne/io/fiff/tests/test_raw_fiff.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
from mne.filter import filter_data
3838
from mne.io import RawArray, base, concatenate_raws, match_channel_orders, read_raw_fif
3939
from mne.io.tests.test_raw import _test_concat, _test_raw_reader
40+
from mne.transforms import Transform
4041
from mne.utils import (
4142
_dt_to_stamp,
4243
_record_warnings,
@@ -1642,7 +1643,8 @@ def test_add_channels():
16421643

16431644
# Testing force updates
16441645
raw_arr_info = create_info(["1", "2"], raw_meg.info["sfreq"], "eeg")
1645-
orig_head_t = raw_arr_info["dev_head_t"]
1646+
assert raw_arr_info["dev_head_t"] is None
1647+
orig_head_t = Transform("meg", "head")
16461648
raw_arr = rng.randn(2, raw_eeg.n_times)
16471649
raw_arr = RawArray(raw_arr, raw_arr_info)
16481650
# This should error because of conflicts in Info

0 commit comments

Comments
 (0)