spectralbrain.viz.eigenmodes#

viz/eigenmodes.py — SpectralBrain#

Painel de eigenmodes geométricos no estilo Mode-Based Morphometry (Cao et al., 2024, HBM; Figura 1b), porém agnóstico ao operador: você pode renderizar a base de QUALQUER operador da SB (LBO, Helmholtz, anisotrópico, Hodge, polyharmonic…), não só o Helmholtz do MBM.

Cada eigenmode psi_k é um campo escalar por-vértice. Renderizamos cada um na superfície midthickness fsLR-32k (Conte69) com um divergente azul-branco-vermelho (negativo-zero-positivo) e clim simétrico, ordenados por frequência espacial crescente (lambda crescente <=> wavelength decrescente). O painel final é montado em qualidade de publicação (PDF/PNG 300 dpi).

Dois caminhos de uso#

  1. RECOMENDADO (fiel ao Cao, mesh-match garantido): computar os modos na própria malha de render via LaPy — a mesma biblioteca usada no MBM e no laboratório do Reuter — com compute_geometric_eigenmodes.

  2. AVANÇADO: passar autovetores já calculados pela SB. Nesse caso a malha dos autovetores TEM de ser a mesma do render (Conte69 fsLR-32k). Se vierem de malha nativa, faça o resample antes.

Filosofia “topology over magnitude”: o SINAL de um autovetor é arbitrário. O que carrega significado são as nodal lines (onde psi_k = 0), não se um lobo é azul ou vermelho. Por isso padronizamos o sinal apenas por consistência visual e a barra de cor é rotulada em unidades arbitrárias.

Dependências pesadas (yabplot, lapy) são importadas de forma PREGUIÇOSA dentro das funções — o módulo importa limpo mesmo sem elas instaladas.

Autor: Rodrigo Debona (Velho Mago) — com Claudinho.

Functions

assemble_eigenmode_panel(png_paths, ...[, ...])

Monta os PNGs numa grade de publicação, com colorbar única (a.u., −/0/+).

compute_geometric_eigenmodes(surf_path[, ...])

Eigenmodes geométricos (Laplace-Beltrami) na MALHA DE RENDER, via LaPy.

eigenmode_wavelength(eigenvalue)

Wavelength espacial de um modo: wavelength = 2*pi / sqrt(lambda).

plot_eigenmode_panel(lh_surf_path, rh_surf_path)

Pipeline completo: (computa ->) renderiza -> monta painel estilo Cao.

render_eigenmodes(evecs_lh, evecs_rh, ...[, ...])

Renderiza um PNG por modo (cada PNG já com as vistas pedidas).

select_mode_indices(evals[, n_show, ...])

Escolhe quais colunas de autovetores renderizar (pula o modo constante).

standardize_sign(field[, method])

Padroniza o sinal (arbitrário) de um autovetor por convenção visual.

spectralbrain.viz.eigenmodes.assemble_eigenmode_panel(png_paths, mode_indices, evals, out_path='eigenmode_panel.pdf', ncols=3, cmap='RdBu_r', annotate='wavelength', dpi=300, panel_title=None, label_fontsize=7.0)[source]#

Monta os PNGs numa grade de publicação, com colorbar única (a.u., −/0/+).

Parameters:
Return type:

str

spectralbrain.viz.eigenmodes.compute_geometric_eigenmodes(surf_path, n_modes=50, use_lumped_mass=True)[source]#

Eigenmodes geométricos (Laplace-Beltrami) na MALHA DE RENDER, via LaPy.

Resolve Delta psi = -lambda psi (forma fraca FEM) na superfície. Garante mesh-match: os modos são resolvidos na mesma malha em que serão plotados.

Parameters:
Return type:

Tuple[ndarray, ndarray, ndarray, ndarray]

spectralbrain.viz.eigenmodes.eigenmode_wavelength(eigenvalue)[source]#

Wavelength espacial de um modo: wavelength = 2*pi / sqrt(lambda).

Parameters:

eigenvalue (float)

Return type:

float

spectralbrain.viz.eigenmodes.plot_eigenmode_panel(lh_surf_path, rh_surf_path, n_modes=50, n_show=12, ncols=3, out_path='eigenmode_panel.pdf', out_dir='eigenmode_pngs', views_per_mode=None, evecs_lh=None, evecs_rh=None, evals=None, cmap='RdBu_r', annotate='wavelength', skip_constant=True, medial_mask_lh=None, medial_mask_rh=None, panel_title=None)[source]#

Pipeline completo: (computa ->) renderiza -> monta painel estilo Cao.

Parameters:
Return type:

str

spectralbrain.viz.eigenmodes.render_eigenmodes(evecs_lh, evecs_rh, lh_surf_path, rh_surf_path, mode_indices, out_dir='eigenmode_pngs', views=None, cmap='RdBu_r', style='matte', percentile_clim=99.0, sign_method='max_abs', medial_mask_lh=None, medial_mask_rh=None, figsize=(1600, 400), zoom=1.25)[source]#

Renderiza um PNG por modo (cada PNG já com as vistas pedidas).

Clim simétrico por modo (valores de eigenmode são arbitrários), por percentil.

Parameters:
Return type:

list

spectralbrain.viz.eigenmodes.select_mode_indices(evals, n_show=12, skip_constant=True)[source]#

Escolhe quais colunas de autovetores renderizar (pula o modo constante).

Parameters:
Return type:

ndarray

spectralbrain.viz.eigenmodes.standardize_sign(field, method='max_abs')[source]#

Padroniza o sinal (arbitrário) de um autovetor por convenção visual.

Parameters:
Return type:

ndarray