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#
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.
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
|
Monta os PNGs numa grade de publicação, com colorbar única (a.u., −/0/+). |
|
Eigenmodes geométricos (Laplace-Beltrami) na MALHA DE RENDER, via LaPy. |
|
Wavelength espacial de um modo: wavelength = 2*pi / sqrt(lambda). |
|
Pipeline completo: (computa ->) renderiza -> monta painel estilo Cao. |
|
Renderiza um PNG por modo (cada PNG já com as vistas pedidas). |
|
Escolhe quais colunas de autovetores renderizar (pula o modo constante). |
|
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/+).
- 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.
- spectralbrain.viz.eigenmodes.eigenmode_wavelength(eigenvalue)[source]#
Wavelength espacial de um modo: wavelength = 2*pi / sqrt(lambda).
- 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.
- 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.