File: test_montage.py

package info (click to toggle)
python-mne 1.9.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 131,492 kB
  • sloc: python: 213,302; javascript: 12,910; sh: 447; makefile: 144
file content (88 lines) | stat: -rw-r--r-- 2,606 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# Authors: The MNE-Python contributors.
# License: BSD-3-Clause
# Copyright the MNE-Python contributors.

# Set our plotters to test mode

from pathlib import Path

import matplotlib.pyplot as plt
import numpy as np
import pytest

from mne.channels import make_dig_montage, make_standard_montage, read_dig_fif

p_dir = Path(__file__).parents[2] / "io" / "kit" / "tests" / "data"
elp = p_dir / "test_elp.txt"
hsp = p_dir / "test_hsp.txt"
hpi = p_dir / "test_mrk.sqd"
io_dir = Path(__file__).parents[2] / "io" / "tests" / "data"
fif_fname = io_dir / "test_raw.fif"


def test_plot_montage():
    """Test plotting montages."""
    m = make_standard_montage("easycap-M1")
    m.plot()
    plt.close("all")
    m.plot(kind="3d")
    plt.close("all")
    m.plot(kind="3d", show_names=True)
    plt.close("all")
    m.plot(kind="topomap")
    plt.close("all")
    m.plot(kind="topomap", show_names=True)
    plt.close("all")
    m.plot(sphere="eeglab")
    plt.close("all")

    N_HSP, N_HPI = 2, 1
    montage = make_dig_montage(
        nasion=[1, 1, 1],
        lpa=[2, 2, 2],
        rpa=[3, 3, 3],
        hsp=np.full((N_HSP, 3), 4),
        hpi=np.full((N_HPI, 3), 4),
        coord_frame="head",
    )
    assert "0 channels" in repr(montage)
    with pytest.raises(RuntimeError, match="No valid channel positions"):
        montage.plot()
    d = read_dig_fif(fname=fif_fname, verbose="error")
    assert "61 channels" in repr(d)
    # XXX this is broken; dm.point_names is used. Sometimes we say this should
    # Just contain the HPI coils, other times that it's all channels (e.g.,
    # EEG channels). But there is redundancy with this and dm.dig_ch_pos.
    # This should be addressed in the pending big refactoring.
    # d.plot()
    # plt.close('all')


@pytest.mark.parametrize(
    "name, n",
    [
        ("standard_1005", 342),
        ("standard_postfixed", 85),
        ("standard_primed", 85),
        ("standard_1020", 93),
    ],
)
def test_plot_defect_montage(name, n):
    """Test plotting defect montages (i.e. with duplicate labels)."""
    # montage name and number of unique labels
    m = make_standard_montage(name)
    n -= 3  # new montage does not have fiducials
    fig = m.plot()
    collection = fig.axes[0].collections[0]
    assert collection._edgecolors.shape[0] == n
    assert collection._facecolors.shape[0] == n
    assert collection._offsets.shape[0] == n


def test_plot_digmontage():
    """Test plot DigMontage."""
    montage = make_dig_montage(
        ch_pos=dict(zip(list("abc"), np.eye(3))), coord_frame="head"
    )
    montage.plot()
    plt.close("all")