Exemplo n.º 1
0
def test_brain_timeviewer(renderer_interactive, pixel_ratio):
    """Test _TimeViewer primitives."""
    if renderer_interactive._get_3d_backend() != 'pyvista':
        pytest.skip('TimeViewer tests only supported on PyVista')
    brain_data = _create_testing_brain(hemi='both', show_traces=False)

    with pytest.raises(RuntimeError, match='already'):
        _TimeViewer(brain_data)
    time_viewer = brain_data.time_viewer
    time_viewer.time_call(value=0)
    time_viewer.orientation_call(value='lat', update_widget=True)
    time_viewer.orientation_call(value='medial', update_widget=True)
    time_viewer.smoothing_call(value=1)
    time_viewer.fmin_call(value=12.0)
    time_viewer.fmax_call(value=4.0)
    time_viewer.fmid_call(value=6.0)
    time_viewer.fmid_call(value=4.0)
    time_viewer.fscale_call(value=1.1)
    time_viewer.toggle_interface()
    time_viewer.playback_speed_call(value=0.1)
    time_viewer.toggle_playback()
    time_viewer.apply_auto_scaling()
    time_viewer.restore_user_scaling()
    time_viewer.reset()
    plt.close('all')
    time_viewer.help()
    assert len(plt.get_fignums()) == 1
    plt.close('all')

    # screenshot
    brain_data.show_view(view=dict(azimuth=180., elevation=90.))
    img = brain_data.screenshot(mode='rgb')
    want_shape = np.array([300 * pixel_ratio, 300 * pixel_ratio, 3])
    assert_allclose(img.shape, want_shape)
Exemplo n.º 2
0
def test_brain_linkviewer(renderer_interactive):
    """Test _LinkViewer primitives."""
    brain_data = _create_testing_brain(hemi='split')
    _TimeViewer(brain_data)

    link_viewer = _LinkViewer([brain_data])
    link_viewer.set_time_point(value=0)
    link_viewer.set_playback_speed(value=0.1)
    link_viewer.toggle_playback()
Exemplo n.º 3
0
def test_brain_linkviewer(renderer_interactive):
    """Test _LinkViewer primitives."""
    if renderer_interactive._get_3d_backend() != 'pyvista':
        pytest.skip()
    brain_data = _create_testing_brain(hemi='split')
    _TimeViewer(brain_data)

    link_viewer = _LinkViewer([brain_data])
    link_viewer.set_time_point(value=0)
    link_viewer.set_playback_speed(value=0.1)
    link_viewer.toggle_playback()
Exemplo n.º 4
0
def test_brain_linkviewer(renderer_interactive, travis_macos):
    """Test _LinkViewer primitives."""
    if renderer_interactive._get_3d_backend() != 'pyvista':
        pytest.skip('Linkviewer only supported on PyVista')
    if travis_macos:
        pytest.skip('Linkviewer tests unstable on Travis macOS')
    brain_data = _create_testing_brain(hemi='split')
    _TimeViewer(brain_data)

    link_viewer = _LinkViewer([brain_data])
    link_viewer.set_time_point(value=0)
    link_viewer.set_playback_speed(value=0.1)
    link_viewer.toggle_playback()
Exemplo n.º 5
0
def test_brain_timeviewer(renderer_interactive):
    """Test _TimeViewer primitives."""
    if renderer_interactive._get_3d_backend() != 'pyvista':
        pytest.skip()
    brain_data = _create_testing_brain(hemi='both')

    time_viewer = _TimeViewer(brain_data)
    time_viewer.time_call(value=0)
    time_viewer.orientation_call(value='lat', update_widget=True)
    time_viewer.orientation_call(value='medial', update_widget=True)
    time_viewer.smoothing_call(value=1)
    time_viewer.fmin_call(value=12.0)
    time_viewer.fmax_call(value=4.0)
    time_viewer.fmid_call(value=6.0)
    time_viewer.fmid_call(value=4.0)
    time_viewer.fscale_call(value=1.1)
    time_viewer.toggle_interface()
    time_viewer.playback_speed_call(value=0.1)
    time_viewer.toggle_playback()
    time_viewer.apply_auto_scaling()
    time_viewer.restore_user_scaling()

    # screenshot
    brain_data.show_view(view=dict(azimuth=180., elevation=90.))
    img = brain_data.screenshot(mode='rgb')
    assert (img.shape == (300, 300, 3))
Exemplo n.º 6
0
def test_brain_timeviewer(renderer):
    """Test _TimeViewer primitives."""
    if renderer.get_3d_backend() == "mayavi":
        pytest.skip()  # Skip PySurfer.TimeViewer
    else:
        # Disable testing to allow interactive window
        renderer.MNE_3D_BACKEND_TESTING = False

    sample_src = read_source_spaces(src_fname)

    # dense version
    vertices = [s['vertno'] for s in sample_src]
    n_time = 5
    n_verts = sum(len(v) for v in vertices)
    stc_data = np.zeros((n_verts * n_time))
    stc_size = stc_data.size
    stc_data[(np.random.rand(stc_size // 20) * stc_size).astype(int)] = \
        np.random.RandomState(0).rand(stc_data.size // 20)
    stc_data.shape = (n_verts, n_time)
    stc = SourceEstimate(stc_data, vertices, 1, 1)

    fmin = stc.data.min()
    fmax = stc.data.max()
    brain_data = _Brain(subject_id,
                        'split',
                        surf,
                        size=300,
                        subjects_dir=subjects_dir)
    for hemi in ['lh', 'rh']:
        hemi_idx = 0 if hemi == 'lh' else 1
        data = getattr(stc, hemi + '_data')
        vertices = stc.vertices[hemi_idx]
        brain_data.add_data(data,
                            fmin=fmin,
                            hemi=hemi,
                            fmax=fmax,
                            colormap='hot',
                            vertices=vertices,
                            colorbar=True)

    time_viewer = _TimeViewer(brain_data)
    time_viewer.time_call(value=0)
    time_viewer.orientation_call(value='lat', update_widget=True)
    time_viewer.orientation_call(value='medial', update_widget=True)
    time_viewer.smoothing_call(value=1)
    time_viewer.fmin_call(value=12.0)
    time_viewer.fmax_call(value=4.0)
    time_viewer.fmid_call(value=6.0)
    time_viewer.fmid_call(value=4.0)
    time_viewer.fscale_call(value=1.1)
    time_viewer.toggle_interface()
    time_viewer.playback_speed_call(value=0.1)
    time_viewer.toggle_playback()
    time_viewer.apply_auto_scaling()
    time_viewer.restore_user_scaling()

    link_viewer = _LinkViewer([brain_data])
    link_viewer.set_time_point(value=0)
    link_viewer.set_playback_speed(value=0.1)
    link_viewer.toggle_playback()
Exemplo n.º 7
0
def test_brain_timeviewer_traces(renderer_interactive, hemi):
    """Test _TimeViewer traces."""
    if renderer_interactive._get_3d_backend() != 'pyvista':
        pytest.skip()
    brain_data = _create_testing_brain(hemi=hemi)
    time_viewer = _TimeViewer(brain_data, show_traces=True)
    assert hasattr(time_viewer, "picked_points")
    assert hasattr(time_viewer, "_spheres")

    # test points picked by default
    picked_points = brain_data.get_picked_points()
    spheres = time_viewer._spheres
    hemi_str = [hemi] if hemi in ('lh', 'rh') else ['lh', 'rh']
    for current_hemi in hemi_str:
        assert len(picked_points[current_hemi]) == 1
    assert len(spheres) == len(hemi_str)

    # test removing points
    time_viewer.clear_points()
    assert len(picked_points['lh']) == 0
    assert len(picked_points['rh']) == 0

    # test picking a cell at random
    for idx, current_hemi in enumerate(hemi_str):
        current_mesh = brain_data._hemi_meshes[current_hemi]
        cell_id = np.random.randint(0, current_mesh.n_cells)
        test_picker = TstVTKPicker(current_mesh, cell_id)
        assert cell_id == test_picker.cell_id
        assert test_picker.point_id is None
        time_viewer.on_pick(test_picker, None)
        assert test_picker.point_id is not None
        assert len(picked_points[current_hemi]) == 1
        assert picked_points[current_hemi][0] == test_picker.point_id
        sphere = spheres[idx]
        vertex_id = sphere._vertex_id
        assert vertex_id == test_picker.point_id
        line = sphere._line

        hemi_prefix = 'L' if current_hemi == 'lh' else 'R'
        hemi_int = 0 if current_hemi == 'lh' else 1
        mni = vertex_to_mni(vertices=vertex_id,
                            hemis=hemi_int,
                            subject=brain_data._subject_id,
                            subjects_dir=brain_data._subjects_dir)
        label = "{}:{} MNI: {}".format(hemi_prefix,
                                       str(vertex_id).ljust(6),
                                       ', '.join('%5.1f' % m for m in mni))

        assert line.get_label() == label
    assert len(spheres) == len(hemi_str)
Exemplo n.º 8
0
def test_brain_timeviewer(renderer_interactive):
    """Test _TimeViewer primitives."""
    brain_data = _create_testing_brain(hemi='both')

    time_viewer = _TimeViewer(brain_data)
    time_viewer.time_call(value=0)
    time_viewer.orientation_call(value='lat', update_widget=True)
    time_viewer.orientation_call(value='medial', update_widget=True)
    time_viewer.smoothing_call(value=1)
    time_viewer.fmin_call(value=12.0)
    time_viewer.fmax_call(value=4.0)
    time_viewer.fmid_call(value=6.0)
    time_viewer.fmid_call(value=4.0)
    time_viewer.fscale_call(value=1.1)
    time_viewer.toggle_interface()
    time_viewer.playback_speed_call(value=0.1)
    time_viewer.toggle_playback()
    time_viewer.apply_auto_scaling()
    time_viewer.restore_user_scaling()
Exemplo n.º 9
0
def test_brain_timeviewer_traces(renderer_interactive, hemi, src, tmpdir):
    """Test _TimeViewer traces."""
    if renderer_interactive._get_3d_backend() != 'pyvista':
        pytest.skip('Only PyVista supports traces')
    brain_data = _create_testing_brain(
        hemi=hemi,
        surf='white',
        src=src,
        show_traces=0.5,
        initial_time=0,
        volume_options=None,  # for speed, don't upsample
    )
    with pytest.raises(RuntimeError, match='already'):
        _TimeViewer(brain_data)
    time_viewer = brain_data.time_viewer
    assert time_viewer.show_traces
    assert hasattr(time_viewer, "picked_points")
    assert hasattr(time_viewer, "_spheres")

    # test points picked by default
    picked_points = brain_data.get_picked_points()
    spheres = time_viewer._spheres
    hemi_str = list()
    if src in ('surface', 'mixed'):
        hemi_str.extend([hemi] if hemi in ('lh', 'rh') else ['lh', 'rh'])
    if src in ('mixed', 'volume'):
        hemi_str.extend(['vol'])
    for current_hemi in hemi_str:
        assert len(picked_points[current_hemi]) == 1
    n_spheres = len(hemi_str)
    if hemi == 'split' and src in ('mixed', 'volume'):
        n_spheres += 1
    assert len(spheres) == n_spheres

    # test removing points
    time_viewer.clear_points()
    assert len(spheres) == 0
    for key in ('lh', 'rh', 'vol'):
        assert len(picked_points[key]) == 0

    # test picking a cell at random
    rng = np.random.RandomState(0)
    for idx, current_hemi in enumerate(hemi_str):
        assert len(spheres) == 0
        if current_hemi == 'vol':
            current_mesh = brain_data._data['vol']['grid']
            vertices = brain_data._data['vol']['vertices']
            values = current_mesh.cell_arrays['values'][vertices]
            cell_id = vertices[np.argmax(np.abs(values))]
        else:
            current_mesh = brain_data._hemi_meshes[current_hemi]
            cell_id = rng.randint(0, current_mesh.n_cells)
        test_picker = TstVTKPicker(None, None, current_hemi, brain_data)
        assert time_viewer.on_pick(test_picker, None) is None
        test_picker = TstVTKPicker(current_mesh, cell_id, current_hemi,
                                   brain_data)
        assert cell_id == test_picker.cell_id
        assert test_picker.point_id is None
        time_viewer.on_pick(test_picker, None)
        assert test_picker.point_id is not None
        assert len(picked_points[current_hemi]) == 1
        assert picked_points[current_hemi][0] == test_picker.point_id
        assert len(spheres) > 0
        sphere = spheres[-1]
        vertex_id = sphere._vertex_id
        assert vertex_id == test_picker.point_id
        line = sphere._line

        hemi_prefix = current_hemi[0].upper()
        if current_hemi == 'vol':
            assert hemi_prefix + ':' in line.get_label()
            assert 'MNI' in line.get_label()
            continue  # the MNI conversion is more complex
        hemi_int = 0 if current_hemi == 'lh' else 1
        mni = vertex_to_mni(vertices=vertex_id,
                            hemis=hemi_int,
                            subject=brain_data._subject_id,
                            subjects_dir=brain_data._subjects_dir)
        label = "{}:{} MNI: {}".format(hemi_prefix,
                                       str(vertex_id).ljust(6),
                                       ', '.join('%5.1f' % m for m in mni))

        assert line.get_label() == label

        # remove the sphere by clicking in its vicinity
        old_len = len(spheres)
        test_picker._actors = sum((s._actors for s in spheres), [])
        time_viewer.on_pick(test_picker, None)
        assert len(spheres) < old_len

    # and the scraper for it (will close the instance)
    if not check_version('sphinx_gallery'):
        return
    screenshot = brain_data.screenshot()
    fnames = [str(tmpdir.join('temp.png'))]
    block_vars = dict(image_path_iterator=iter(fnames),
                      example_globals=dict(brain=brain_data))
    gallery_conf = dict(src_dir=str(tmpdir))
    scraper = _BrainScraper()
    rst = scraper(None, block_vars, gallery_conf)
    assert 'temp.png' in rst
    assert path.isfile(fnames[0])
    img = image.imread(fnames[0])
    assert img.shape[1] == screenshot.shape[1]  # same width
    assert img.shape[0] > screenshot.shape[0]  # larger height
Exemplo n.º 10
0
def test_brain_timeviewer_traces(renderer_interactive, hemi, tmpdir):
    """Test _TimeViewer traces."""
    if renderer_interactive._get_3d_backend() != 'pyvista':
        pytest.skip('Only PyVista supports traces')
    brain_data = _create_testing_brain(hemi=hemi)
    time_viewer = _TimeViewer(brain_data, show_traces=True)
    assert hasattr(time_viewer, "picked_points")
    assert hasattr(time_viewer, "_spheres")

    # test points picked by default
    picked_points = brain_data.get_picked_points()
    spheres = time_viewer._spheres
    hemi_str = [hemi] if hemi in ('lh', 'rh') else ['lh', 'rh']
    for current_hemi in hemi_str:
        assert len(picked_points[current_hemi]) == 1
    assert len(spheres) == len(hemi_str)

    # test removing points
    time_viewer.clear_points()
    assert len(picked_points['lh']) == 0
    assert len(picked_points['rh']) == 0

    # test picking a cell at random
    for idx, current_hemi in enumerate(hemi_str):
        current_mesh = brain_data._hemi_meshes[current_hemi]
        cell_id = np.random.randint(0, current_mesh.n_cells)
        test_picker = TstVTKPicker(current_mesh, cell_id)
        assert cell_id == test_picker.cell_id
        assert test_picker.point_id is None
        time_viewer.on_pick(test_picker, None)
        assert test_picker.point_id is not None
        assert len(picked_points[current_hemi]) == 1
        assert picked_points[current_hemi][0] == test_picker.point_id
        sphere = spheres[idx]
        vertex_id = sphere._vertex_id
        assert vertex_id == test_picker.point_id
        line = sphere._line

        hemi_prefix = 'L' if current_hemi == 'lh' else 'R'
        hemi_int = 0 if current_hemi == 'lh' else 1
        mni = vertex_to_mni(vertices=vertex_id,
                            hemis=hemi_int,
                            subject=brain_data._subject_id,
                            subjects_dir=brain_data._subjects_dir)
        label = "{}:{} MNI: {}".format(hemi_prefix,
                                       str(vertex_id).ljust(6),
                                       ', '.join('%5.1f' % m for m in mni))

        assert line.get_label() == label
    assert len(spheres) == len(hemi_str)

    # and the scraper for it (will close the instance)
    if not check_version('sphinx_gallery'):
        return
    screenshot = brain_data.screenshot()
    fnames = [str(tmpdir.join('temp.png'))]
    block_vars = dict(image_path_iterator=iter(fnames),
                      example_globals=dict(brain=brain_data))
    gallery_conf = dict(src_dir=str(tmpdir))
    scraper = _BrainScraper()
    rst = scraper(None, block_vars, gallery_conf)
    assert 'temp.png' in rst
    assert path.isfile(fnames[0])
    img = image.imread(fnames[0])
    assert img.shape[1] == screenshot.shape[1]  # same width
    assert img.shape[0] > screenshot.shape[0]  # larger height