Skip to content

Commit 489a193

Browse files
committed
FIX: Mapping
1 parent f0404c5 commit 489a193

3 files changed

Lines changed: 49 additions & 61 deletions

File tree

mne/_fiff/meas_info.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2780,10 +2780,10 @@ def read_meas_info(fid, tree, clean_bads=False, verbose=None):
27802780
info["hpi_subsystem"] = hs
27812781

27822782
# Read cross-talk and fine cal
2783-
cross_talk = _read_mf_data(fid, tree, kind="cross_talk")
2783+
cross_talk = _read_mf_data(fid, tree, kind="sss_ctc")
27842784
if len(cross_talk):
27852785
info["cross_talk"] = cross_talk
2786-
fine_calibration = _read_mf_data(fid, tree, kind="fine_calibration")
2786+
fine_calibration = _read_mf_data(fid, tree, kind="sss_cal")
27872787
if len(fine_calibration):
27882788
info["fine_calibration"] = fine_calibration
27892789

@@ -3123,8 +3123,8 @@ def write_meas_info(fid, info, data_type=None, reset_range=True):
31233123
# Channel information
31243124
_write_ch_infos(fid, info["chs"], reset_range, ch_names_mapping)
31253125

3126-
_write_mf_data(fid, info, kind="cross_talk")
3127-
_write_mf_data(fid, info, kind="fine_calibration")
3126+
_write_mf_data(fid, info, kind="sss_ctc", key="cross_talk")
3127+
_write_mf_data(fid, info, kind="sss_cal", key="fine_calibration")
31283128

31293129
if info.get("device_info") is not None:
31303130
start_block(fid, FIFF.FIFFB_DEVICE)

mne/_fiff/proc_history.py

Lines changed: 43 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -254,34 +254,46 @@ def _sss_ctc_ch_name_clean(tag_data):
254254
_sss_cal_writers = (write_int_matrix, write_float_matrix)
255255
_sss_cal_casters = (np.array, np.array)
256256

257+
_io_map = dict(
258+
sss_ctc=dict(
259+
keys=_sss_ctc_keys,
260+
ids=_sss_ctc_ids,
261+
casters=_sss_ctc_casters,
262+
writers=_sss_ctc_writers,
263+
block=FIFF.FIFFB_CHANNEL_DECOUPLER,
264+
),
265+
sss_cal=dict(
266+
keys=_sss_cal_keys,
267+
ids=_sss_cal_ids,
268+
casters=_sss_cal_casters,
269+
writers=_sss_cal_writers,
270+
block=FIFF.FIFFB_SSS_CAL,
271+
),
272+
sss_info=dict(
273+
keys=_sss_info_keys,
274+
ids=_sss_info_ids,
275+
casters=_sss_info_casters,
276+
writers=_sss_info_writers,
277+
block=FIFF.FIFFB_SSS_INFO,
278+
),
279+
max_st=dict(
280+
keys=_max_st_keys,
281+
ids=_max_st_ids,
282+
casters=_max_st_casters,
283+
writers=_max_st_writers,
284+
block=FIFF.FIFFB_SSS_ST_INFO,
285+
),
286+
)
287+
257288

258-
def _write_mf_data(fid, info, *, kind):
259-
this_data = info.get(kind, None)
289+
def _write_mf_data(fid, info, *, kind, key=None):
290+
key = kind if key is None else key
291+
this_data = info.get(key, dict())
260292
if not this_data: # empty or None
261293
return
294+
del info, key
262295
logger.debug("Writing %s info with keys: %s", kind, list(this_data))
263-
del info
264-
if kind == "cross_talk":
265-
keys = _sss_ctc_keys
266-
ids = _sss_ctc_ids
267-
writers = _sss_ctc_writers
268-
block = FIFF.FIFFB_CHANNEL_DECOUPLER
269-
elif kind == "fine_calibration":
270-
keys = _sss_cal_keys
271-
ids = _sss_cal_ids
272-
writers = _sss_cal_writers
273-
block = FIFF.FIFFB_SSS_CAL
274-
elif kind == "max_st":
275-
keys = _max_st_keys
276-
ids = _max_st_ids
277-
writers = _max_st_writers
278-
block = FIFF.FIFFB_SSS_ST_INFO
279-
else:
280-
assert kind == "sss_info"
281-
keys = _sss_info_keys
282-
ids = _sss_info_ids
283-
writers = _sss_info_writers
284-
block = FIFF.FIFFB_SSS_INFO
296+
keys, ids, _, writers, block = _io_map[kind].values()
285297
start_block(fid, block)
286298
for key, id_, writer in zip(keys, ids, writers):
287299
if key in this_data:
@@ -294,7 +306,7 @@ def _read_ctc(fname):
294306
fname = _check_fname(fname, overwrite="read", must_exist=True)
295307
f, tree, _ = fiff_open(fname)
296308
with f as fid:
297-
sss_ctc = _read_mf_data(fid, tree, kind="cross_talk")
309+
sss_ctc = _read_mf_data(fid, tree, kind="sss_ctc")
298310
bad_str = f"Invalid cross-talk FIF: {fname}"
299311
if len(sss_ctc) == 0:
300312
raise ValueError(bad_str)
@@ -310,40 +322,14 @@ def _read_ctc(fname):
310322
def _read_maxfilter_record(fid, tree):
311323
"""Read maxfilter processing record from file."""
312324
max_info = dict()
313-
for key, kind in (
314-
("sss_info", "sss_info"),
315-
("sss_ctc", "cross_talk"),
316-
("sss_cal", "fine_calibration"),
317-
("max_st", "max_st"),
318-
):
319-
this_data = _read_mf_data(fid, tree, kind=kind)
320-
if this_data:
321-
max_info[key] = this_data
325+
for key in _io_map:
326+
this_data = _read_mf_data(fid, tree, kind=key)
327+
max_info[key] = this_data or dict() # always add, even if empty
322328
return max_info
323329

324330

325331
def _read_mf_data(fid, tree, *, kind):
326-
if kind == "cross_talk":
327-
block = FIFF.FIFFB_CHANNEL_DECOUPLER # 501
328-
keys = _sss_ctc_keys
329-
ids = _sss_ctc_ids
330-
casters = _sss_ctc_casters
331-
elif kind == "fine_calibration":
332-
block = FIFF.FIFFB_SSS_CAL # 503
333-
keys = _sss_cal_keys
334-
ids = _sss_cal_ids
335-
casters = _sss_cal_casters
336-
elif kind == "max_st":
337-
block = FIFF.FIFFB_SSS_ST_INFO # 504
338-
keys = _max_st_keys
339-
ids = _max_st_ids
340-
casters = _max_st_casters
341-
else:
342-
assert kind == "sss_info"
343-
block = FIFF.FIFFB_SSS_INFO # 502
344-
keys = _sss_info_keys
345-
ids = _sss_info_ids
346-
casters = _sss_info_casters
332+
keys, ids, casters, _, block = _io_map[kind].values()
347333
sss_kind_block = dir_tree_find(tree, block)
348334
sss_out = dict()
349335
if len(sss_kind_block) > 0:
@@ -364,5 +350,5 @@ def _write_maxfilter_record(fid, record):
364350
"""Write maxfilter processing record to file."""
365351
_write_mf_data(fid, record, kind="sss_info")
366352
_write_mf_data(fid, record, kind="max_st")
367-
_write_mf_data(fid, record, kind="cross_talk")
368-
_write_mf_data(fid, record, kind="fine_calibration")
353+
_write_mf_data(fid, record, kind="sss_ctc")
354+
_write_mf_data(fid, record, kind="sss_cal")

mne/_fiff/tests/test_meas_info.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1112,6 +1112,8 @@ def test_csr_csc(tmp_path):
11121112
fname = tmp_path / "test.fif"
11131113
write_info(fname, info, verbose="debug")
11141114
info_read = read_info(fname, verbose="debug")
1115+
assert "max_info" in info_read["proc_history"][0]
1116+
assert "sss_ctc" in info_read["proc_history"][0]["max_info"]
11151117
assert "decoupler" in info_read["proc_history"][0]["max_info"]["sss_ctc"]
11161118
ct_read = info_read["proc_history"][0]["max_info"]["sss_ctc"]["decoupler"]
11171119
assert isinstance(ct_read, sparse.csc_array)

0 commit comments

Comments
 (0)