NetNeuroTools Guide
Purpose
This skill encodes the complete API and recommended workflows for netneurotools, a Python toolbox for network neuroscience developed by the Network Neuroscience Lab (netneurolab). It covers dataset fetching, brain connectivity metrics, network randomization and null models, community detection, spatial autocorrelation statistics, parcellation interface utilities, and cortical/subcortical surface visualization.
When to Use This Skill
Activate when the user:
- Works with brain connectivity matrices (structural or functional)
- Needs network communication metrics (shortest path, navigation, communicability, search information, diffusion efficiency)
- Wants to generate null/surrogate networks preserving degree, strength, or distance distributions
- Performs community detection or consensus clustering on brain networks
- Computes spatial autocorrelation (Moran's I, Geary's C, Lee's L) on parcellated brain data
- Fetches standard neuroimaging templates (fsaverage, fsLR, CIVET, Conte69) or atlases (Schaefer, Cammoun, Pauli)
- Needs to convert between vertex-level and parcel-level brain data
- Visualizes data on cortical surfaces using PyVista or PySurfer
- Mentions netneurotools, netneurolab, or any function from this toolbox
- Performs structure-function coupling, assortativity analysis, or dominance analysis
- Simulates atrophy spreading on brain networks (SIR model)
Reference Files (Progressive Disclosure)
| Topic | File | When to Read |
|---|---|---|
| Datasets | references/datasets.md | User fetches templates, atlases, or project datasets |
| Network Metrics | references/metrics.md | User computes communication, assortativity, spreading, or statistical network metrics |
| Networks | references/networks.md | User builds consensus connectivity, randomizes networks, or thresholds graphs |
| Statistics | references/stats.md | User runs permutation tests, correlations, residualization, or dominance analysis |
| Spatial & Modularity | references/spatial-modularity.md | User computes spatial autocorrelation or performs community detection |
| Interface & Plotting | references/interface-plotting.md | User converts parcels/vertices, handles CIFTI/GIFTI files, or plots on cortical surfaces |
Installation
bashpip install netneurotools # For PyVista surface plotting (recommended) pip install netneurotools[pyvista] # For PySurfer surface plotting (legacy) pip install netneurotools[pysurfer] # For numba acceleration pip install netneurotools[numba]
Core dependencies: numpy>=1.16, scipy>=1.4.0, scikit-learn, matplotlib, nibabel>=3.0.0, nilearn, bctpy, tqdm, neuromaps
Overview Pipeline
1. Fetch data --> netneurotools.datasets (templates, atlases, connectomes) 2. Build networks --> netneurotools.networks (consensus, thresholding) 3. Analyze metrics --> netneurotools.metrics (communication, assortativity) 4. Null models --> netneurotools.networks (randomization, surrogates) 5. Statistics --> netneurotools.stats (permutation tests, dominance) 6. Spatial stats --> netneurotools.spatial (Moran's I, Geary's C, Lee's L) 7. Modularity --> netneurotools.modularity (consensus clustering) 8. Visualize --> netneurotools.plotting (cortical surfaces, heatmaps)
Quick Start
Fetch Atlas and Template
pythonfrom netneurotools.datasets import fetch_schaefer2018, fetch_fsaverage_curated # Fetch Schaefer 400-parcel atlas in fsaverage space parc = fetch_schaefer2018('fsaverage')['400Parcels7Networks'] # parc is a SURFACE namedtuple with fields .L and .R # Fetch curated fsaverage surfaces surfaces = fetch_fsaverage_curated('fsaverage5') # surfaces has keys: 'white', 'pial', 'inflated', 'sphere', 'medial', 'sulc', 'vaavg' # Each value is a SURFACE namedtuple with fields .L and .R
Consensus Functional Connectivity
pythonfrom netneurotools.networks import func_consensus import numpy as np # data: (N_nodes, T_timepoints, S_subjects) array consensus = func_consensus(data, n_boot=1000, ci=95, seed=42)
Community Detection
pythonfrom netneurotools.modularity import consensus_modularity import numpy as np # adjacency: (N, N) non-negative connectivity matrix consensus, Q_all, zrand_all = consensus_modularity( adjacency, gamma=1.5, repeats=100, seed=1234 )
Generate Distance-Preserving Surrogates
pythonfrom netneurotools.networks import match_length_degree_distribution newB, newW, nr = match_length_degree_distribution( W, D, nbins=10, nswap=1000, seed=42 )
Permutation Test for Correlation
pythonfrom netneurotools.stats import permtest_pearsonr, make_correlated_xy x, y = make_correlated_xy(corr=0.3, size=100, seed=42) r, p = permtest_pearsonr(x, y, n_perm=5000, seed=42)
Spatial Autocorrelation
pythonfrom netneurotools.spatial import morans_i I = morans_i(annotation_vector, spatial_weight_matrix)
Plot on Cortical Surface (PyVista)
pythonfrom netneurotools.plotting import pv_plot_surface import numpy as np data_L = np.random.random((10242,)) data_R = np.random.random((10242,)) pl = pv_plot_surface( (data_L, data_R), template="fsaverage5", surf="inflated", cmap="viridis", lighting_style="plastic", jupyter_backend="static", )
Plot Parcellated Data (Shortcut)
pythonfrom netneurotools.plotting import pv_plot_parcellated_data import numpy as np data = np.random.rand(400) pl = pv_plot_parcellated_data(data, 'schaefer400x7', template='fsaverage')
Key Data Structures
| Structure | Description | Fields |
|---|---|---|
SURFACE | namedtuple for hemisphere file pairs | .L, .R (left/right hemisphere paths) |
sklearn.utils.Bunch | Dict-like object returned by fetch functions | Varies per function |
FREESURFER_IGNORE | Labels to ignore in FreeSurfer parcellations | ["unknown", "corpuscallosum", "Background+FreeSurfer_Defined_Medial_Wall"] |
PARCIGNORE | Labels to ignore in parcellation operations | ["unknown", "corpuscallosum", "Background+FreeSurfer_Defined_Medial_Wall", "???", "Unknown", "Medial_wall", "Medial wall", "medial_wall"] |
Core Modules Quick Reference
| Module | Key Functions | Purpose |
|---|---|---|
datasets | fetch_fsaverage, fetch_schaefer2018, fetch_cammoun2012, fetch_conte69, fetch_famous_gmat | Fetch templates, atlases, connectomes |
metrics | distance_wei_floyd, navigation_wu, communicability_wei, search_information, mean_first_passage_time, assortativity_und, simulate_atrophy | Network communication and properties |
networks | func_consensus, struct_consensus, match_length_degree_distribution, strength_preserving_rand_sa | Build consensus, generate null models |
stats | permtest_pearsonr, efficient_pearsonr, residualize, get_dominance_stats | Statistical testing and regression |
spatial | morans_i, gearys_c, lees_l, local_morans_i, local_gearys_c, local_lees_l | Spatial autocorrelation |
modularity | consensus_modularity, find_consensus, zrand, get_modularity | Community detection and evaluation |
interface | vertices_to_parcels, parcels_to_vertices, load_surf_parc_file, deconstruct_cifti | Format conversion |
plotting | pv_plot_surface, pv_plot_parcellated_data, pv_plot_subcortex, plot_mod_heatmap | Visualization |
Common Pitfalls
-
SURFACE fields are
.Land.R, not.lhand.rh. Usesurface.Landsurface.Rto access hemisphere paths. -
Weight-to-distance conversion must be done before calling
distance_wei_floydorsearch_information. Common transform:D = -np.log(W / (np.max(W) + 1)). -
Minimum permutation p-value is
1 / (n_perm + 1). Withn_perm=1000, the smallest p-value is ~0.001. -
consensus_modularityrequires non-negative input. Louvain cannot handle negative weights. Set negatives to zero:A[A < 0] = 0. -
struct_consensushemiid encoding: 0 = right hemisphere, 1 = left hemisphere. -
pv_plot_surfacedata format: Whenhemi='both',vertex_datacan be a tuple(left, right)or a single concatenated array. Data length must match template vertex count. -
Data directory: All fetch functions default to
~/nnt-data. Override withdata_dir=parameter or setNNT_DATAenvironment variable. -
match_length_degree_distributionrecommended nswap: Usenswap = nnodes * 20for adequate randomization. -
strength_preserving_rand_safrac parameter must be between 0 and 1. It controls temperature decrease per annealing stage. -
parcels_to_verticesandvertices_to_parcelssupport.annot,.gii, and.dlabel.niiparcellation files. For.dlabel.nii, pass a single file path; for.annotor.gii, pass a tuple of(left, right)paths. -
Numba acceleration is available for spatial stats, weighted correlation, and some metrics. Install numba for significant speedups on large datasets.
-
Headless rendering with PyVista: set
os.environ["VTK_DEFAULT_OPENGL_WINDOW"] = "vtkOSOpenGLRenderWindow"before importing pyvista.


