Individualized single-subject networks from T1 mri features such as cortical thickness and gray matter density.
Project description
graynet
graynet builds single-subject morphometric brain networks from structural neuroimaging features such as cortical thickness, curvature, and volumetric gray-matter density.
It is designed for neuroscience workflows where you want to turn subject-level anatomical measurements into ROI-wise edge weights or ROI summary statistics that can then be used for visualization, statistical modeling, or machine learning.
Documentation: https://raamana.github.io/graynet/
Overview
graynet is useful when you want a subject-specific network representation of spatially distributed measurements over the brain.
Typical use cases:
- biomarker development
- disease classification or prognosis
- brain-behavior association studies
- aging and lifespan analyses
- network summaries derived from cortical or volumetric structural features
Supported feature families currently include:
- cortical Freesurfer features such as thickness and curvature
- volumetric CAT12/SPM-derived features such as gray-matter density
New In The Current Release
This release rewrites much of the library to make graynet more practical for larger datasets.
- faster and simpler processing flow
- run-level outputs instead of many small subject-level files
- Parquet as the canonical storage format for downstream analysis
- explicit metadata for reproducible reconstruction of graphs and matrices
- CLI organized around subcommands:
edges,multiedge,roi-stats, andexport
Important migration note:
- this version does not offer backward compatibility with the previous output layout
- if you need old-style GraphML or CSV, use the provided export utilities
- if you need exact continuity with previous downstream pipelines, reprocess the dataset with the new version and update the downstream workflow accordingly
Installation
pip install -U graynet
For development:
pip install -e ".[dev]"
Canonical Outputs
Each run writes a single run directory named from the run-level configuration. Depending on the mode, the run directory contains:
run_metadata.jsonedges_raw.parquetedges_summary.parquetroi_stats.parquet
Schema overview:
edges_raw.parquetsubject_idbase_featureweight_methoduvweight
edges_summary.parquetsubject_idweight_methodsummary_statuvweight
roi_stats.parquetsubject_idbase_featurestat_nameroivalue
run_metadata.json captures the node order and run settings needed to reconstruct graphs and matrices deterministically.
Working With Outputs In Python
The new outputs are meant to be easy to inspect directly in Python.
Read a run in one line:
from graynet import load_run, get_edge_values, export_to_nx
edge_data, metadata = load_run("/path/to/run_dir")
Inspect metadata:
print(metadata["atlas_name"])
print(metadata["base_features"])
print(metadata["weight_methods"])
print(len(metadata["node_labels"]))
Select one subject, one feature, one weight:
subj_rows = get_edge_values(
edge_data,
subject_id="subject12345",
base_feature="freesurfer_thickness",
weight_method="manhattan",
)
Build a NetworkX graph in one line:
graph = export_to_nx(subj_rows)
Iterate subject-wise:
for subject_id, subject_edges in edge_data.iter_subjects():
graph = export_to_nx(subject_edges)
print(subject_id, graph.number_of_edges())
There is also a demo notebook for the 2.0 output model at scripts/demo_graynet_v2_outputs.ipynb.
CLI Usage
Single-edge networks
graynet edges \
-i example_data/freesurfer \
-s example_data/freesurfer/list_subjects.txt \
-f freesurfer_thickness \
-w manhattan euclidean \
-a fsaverage \
-o /tmp/graynet_runs
Multi-edge networks
graynet multiedge \
-i example_data/freesurfer \
-s example_data/freesurfer/list_subjects.txt \
-f freesurfer_thickness freesurfer_curv \
-w manhattan cosine \
-t median prod \
-a fsaverage \
-o /tmp/graynet_runs
ROI summary statistics
graynet roi-stats \
-i example_data/freesurfer \
-s example_data/freesurfer/list_subjects.txt \
-f freesurfer_thickness \
-r median mean std \
-a fsaverage \
-o /tmp/graynet_runs
Export derived formats
graynet export graphml --run-dir /tmp/graynet_runs/<run_name>
graynet export csv --run-dir /tmp/graynet_runs/<run_name>
Python API
from graynet import extract, roiwise_stats_indiv, extract_multiedge
edges = extract(
["subject12345"],
"example_data/freesurfer",
base_feature="freesurfer_thickness",
weight_method_list=["manhattan"],
atlas="fsaverage",
return_results=True,
)
roi_stats = roiwise_stats_indiv(
["subject12345"],
"example_data/freesurfer",
base_feature="freesurfer_thickness",
chosen_roi_stats=["median", "mean"],
atlas="fsaverage",
return_results=True,
)
multiedge = extract_multiedge(
["subject12345"],
"example_data/freesurfer",
base_feature_list=["freesurfer_thickness", "freesurfer_curv"],
weight_method_list=["manhattan"],
summary_stats=["median"],
atlas="fsaverage",
return_results=True,
)
When return_results=False, the API writes canonical run outputs and returns the run directory path.
Domain Behavior Preserved
The 2.0 rewrite keeps the domain logic that made graynet useful in the first place:
- cortical and volumetric feature families remain distinct
- background/null ROI masking still happens before computation
- atlas-specific ROI semantics are preserved
- built-in and custom atlas inputs are still supported
- predefined feature-specific edge ranges are still honored
- cortical subdivision via
node_sizeremains available for supported fsaverage presets
Development Notes
The redesign rationale and target output contract are documented in docs/output_redesign.md.
Current tests:
pytest -q
Static checks:
python3 -m pyflakes graynet
Citation
If graynet is useful in your work, please cite the software paper first, followed by the methodological papers when relevant:
- Raamana et al., (2018). graynet: single-subject morphometric networks for neuroscience connectivity applications. Journal of Open Source Software, 3(30), 924. https://doi.org/10.21105/joss.00924
- Raamana, P. R., & Strother, S. C. (2020). Does size matter? Relationship between predictive power of single subject morphometric networks to spatial scale and edge weight. Brain Structure and Function, 225(8), 2475-2493. https://doi.org/10.1007/s00429-020-02136-0
- Raamana, P. R., Weiner, M. W., Wang, L., Beg, M. F., & Alzheimer's Disease Neuroimaging Initiative. (2015). Thickness network features for prognostic applications in dementia. Neurobiology of Aging, 36, S91-S102. https://www.sciencedirect.com/science/article/pii/S0197458014005521
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file graynet-2.0.0.tar.gz.
File metadata
- Download URL: graynet-2.0.0.tar.gz
- Upload date:
- Size: 44.0 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: Hatch/1.16.2 cpython/3.13.1 HTTPX/0.28.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b11dd901b683b2afe6864035f163f0846006a44b7d1972e4ec44c3d912f4ee48
|
|
| MD5 |
9468f91ccd73f63debafe0d0023a2312
|
|
| BLAKE2b-256 |
ff06a68b410c88338dbdc98aa0c2e9875ded76c97c7841f9c70be7c54f47c921
|
File details
Details for the file graynet-2.0.0-py3-none-any.whl.
File metadata
- Download URL: graynet-2.0.0-py3-none-any.whl
- Upload date:
- Size: 30.8 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: Hatch/1.16.2 cpython/3.13.1 HTTPX/0.28.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
24e08863c7fbda9c3584f5805dace271e3d3a9ee23c7216156971696b0f72b28
|
|
| MD5 |
3f9cfa82585f54416fa52635a4a96637
|
|
| BLAKE2b-256 |
a5875bcdb893b76c7388134bd30de66ebb97a3f049c48ad90c27e3e83d1f93df
|