[MAINT]: Bump junifer-data version to v7 #486

Merged
synchon merged 8 commits from chore/junifer-data-v7 into main 2026-02-06 12:16:27 +00:00
9 changed files with 236 additions and 13 deletions

View file

@ -54,8 +54,8 @@ jobs:
jq jq
- name: Copy junifer-data directory - name: Copy junifer-data directory
run: | run: |
mkdir -p $HOME/junifer_data/v4 mkdir -p $HOME/junifer_data/v7
cp -ar /root/junifer_data/v4/. $HOME/junifer_data/v4/ cp -ar /root/junifer_data/v7/. $HOME/junifer_data/v7/
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v5 uses: actions/checkout@v5
with: with:

View file

@ -40,8 +40,8 @@ jobs:
jq jq
- name: Copy junifer-data directory - name: Copy junifer-data directory
run: | run: |
mkdir -p $HOME/junifer_data/v4 mkdir -p $HOME/junifer_data/v7
cp -ar /root/junifer_data/v4/. $HOME/junifer_data/v4/ cp -ar /root/junifer_data/v7/. $HOME/junifer_data/v7/
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v5 uses: actions/checkout@v5
with: with:

View file

@ -31,8 +31,8 @@ jobs:
jq jq
- name: Copy junifer-data directory - name: Copy junifer-data directory
run: | run: |
mkdir -p $HOME/junifer_data/v4 mkdir -p $HOME/junifer_data/v7
cp -ar /root/junifer_data/v4/. $HOME/junifer_data/v4/ cp -ar /root/junifer_data/v7/. $HOME/junifer_data/v7/
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v5 uses: actions/checkout@v5
with: with:

View file

@ -463,6 +463,24 @@ Available
| structures in the human brain. | structures in the human brain.
| Neuron., Volume 33(3), Pages 341-355 (2002). | Neuron., Volume 33(3), Pages 341-355 (2002).
| https://doi:10.1016/s0896-6273(02)00569-x | https://doi:10.1016/s0896-6273(02)00569-x
* - Glasser
- None
- ``Glasser``
- ``MNI152NLin2009cAsym``
- 0.0.7
- | Glasser, M.F., Coalson, T.S., Robinson, E.C. et al.
| A multi-modal parcellation of human cerebral cortex.
| Nature (2016).
| http://doi.org/10.1038/nature18933
* - Julich-Brain
- ``version``
- ``Julich-Brain_V1_18``, ``Julich-Brain_V2_9``, ``Julich-Brain_V3_0_3``, ``Julich-Brain_V3_1``
- ``MNI152NLin2009cAsym``
- 0.0.7
- | Amunts, K. et al.
| Julich-Brain: A 3D probabilistic atlas of the human brain’s cytoarchitecture.
| Science, 369, 988-992 (2020)
| https://doi.org/10.1126/science.abb4588
Planned Planned
@ -480,11 +498,6 @@ Planned
| on MRI scans into gyral based regions of interest. | on MRI scans into gyral based regions of interest.
| NeuroImage, Volume 31(3), Pages 968-980 (2006). | NeuroImage, Volume 31(3), Pages 968-980 (2006).
| http://doi.org/10.1016/j.neuroimage.2006.01.021 | http://doi.org/10.1016/j.neuroimage.2006.01.021
* - Glasser
- | Glasser, M.F., Coalson, T.S., Robinson, E.C. et al.
| A multi-modal parcellation of human cerebral cortex.
| Nature (2016).
| http://doi.org/10.1038/nature18933
* - AAL * - AAL
- | Rolls, E.T., Huang, C.C., Lin, C.P., et al. - | Rolls, E.T., Huang, C.C., Lin, C.P., et al.
| Automated anatomical labelling atlas 3. | Automated anatomical labelling atlas 3.

View file

@ -0,0 +1 @@
Add Glasser and Julich-Brain parcellations to :class:`.ParcellationRegistry` by `Synchon Mandal`_

View file

@ -0,0 +1 @@
Bump ``junifer-data`` to ``v7`` by `Synchon Mandal`_

View file

@ -199,6 +199,26 @@ class ParcellationRegistry(BasePipelineDataRegistry):
} }
} }
) )
# Add Glasser
self._builtin.update(
{
"Glasser": {
"family": "Glasser",
"space": "MNI152NLin2009cAsym",
}
}
)
# Add Julich-Brain
for v in ["V1_18", "V2_9", "V3_0_3", "V3_1"]:
self._builtin.update(
{
f"Julich-Brain_{v}": {
"family": "Julich-Brain",
"version": v,
"space": "MNI152NLin2009cAsym",
}
}
)
# Update registry with built-in ones # Update registry with built-in ones
self._registry.update(self._builtin) self._registry.update(self._builtin)
@ -365,6 +385,8 @@ class ParcellationRegistry(BasePipelineDataRegistry):
"Yan2023", "Yan2023",
"Brainnetome", "Brainnetome",
"FreeSurfer", "FreeSurfer",
"Glasser",
"Julich-Brain",
]: ]:
# Load parcellation and labels # Load parcellation and labels
if t_family == "Schaefer2018": if t_family == "Schaefer2018":
@ -408,6 +430,17 @@ class ParcellationRegistry(BasePipelineDataRegistry):
parcellation_fname, parcellation_labels = _retrieve_aseg( parcellation_fname, parcellation_labels = _retrieve_aseg(
resolution=resolution, resolution=resolution,
) )
elif t_family == "Glasser":
parcellation_fname, parcellation_labels = _retrieve_glasser(
resolution=resolution,
)
elif t_family == "Julich-Brain":
parcellation_fname, parcellation_labels = (
_retrieve_julich_brain(
resolution=resolution,
**parcellation_definition,
)
)
else: else:
raise_error(f"Unknown parcellation family: {t_family}") raise_error(f"Unknown parcellation family: {t_family}")
@ -1421,6 +1454,111 @@ def _retrieve_aseg(
return parcellation_img_path, labels return parcellation_img_path, labels
def _retrieve_glasser(
resolution: Optional[float] = None,
) -> tuple[Path, list[str]]:
"""Retrieve Glasser v1.0 .
Parameters
----------
resolution : 1.0, optional
The desired resolution of the parcellation to load. If it is not
available, the closest resolution will be loaded. Preferably, use a
resolution higher than the desired one. By default, will load the
highest one (default None). Available resolution for this
parcellation is 1mm.
Returns
-------
pathlib.Path
File path to the parcellation image.
list of str
Parcellation labels.
"""
logger.info("Parcellation parameters:")
logger.info(f"\tresolution: {resolution}")
_valid_resolutions = [1.0]
_ = closest_resolution(resolution, _valid_resolutions)
path_prefix = Path("parcellations/Glasser/2021")
parcellation_img_path = get(
file_path=path_prefix / "MNI_Glasser_HCP_v1.0.nii.gz",
dataset_path=get_dataset_path(),
**JUNIFER_DATA_PARAMS,
)
parcellation_label_path = get(
file_path=path_prefix / "labels.csv",
dataset_path=get_dataset_path(),
**JUNIFER_DATA_PARAMS,
)
labels = pd.read_csv(parcellation_label_path, sep=",")["label"].to_list()
return parcellation_img_path, labels
def _retrieve_julich_brain(
resolution: Optional[float] = None,
version: str = "v3_1",
) -> tuple[Path, list[str]]:
"""Retrieve Julich-Brain labelled parcellations.
Parameters
----------
resolution : 1.0, optional
The desired resolution of the parcellation to load. If it is not
available, the closest resolution will be loaded. Preferably, use a
resolution higher than the desired one. By default, will load the
highest one (default None). Available resolution for this
parcellation is 1mm.
version : {"V1_18", "V2_9", "V3_0_3", "V3_1"}, optional
The version of the parcellation to use (default "V3_1").
Returns
-------
pathlib.Path
File path to the parcellation image.
list of str
Parcellation labels.
Raises
------
ValueError
If invalid value is provided for ``version``.
"""
logger.info("Parcellation parameters:")
logger.info(f"\tresolution: {resolution}")
logger.info(f"\tversion: {version}")
# Check version
_valid_version = ["V1_18", "V2_9", "V3_0_3", "V3_1"]
if version not in _valid_version:
raise_error(
f"The parameter `version` ({version}) needs to be one of the "
f"following: {_valid_version}"
)
_valid_resolutions = [1.0]
_ = closest_resolution(resolution, _valid_resolutions)
path_prefix = Path(f"parcellations/Julich-Brain/{version}")
parcellation_img_path = get(
file_path=path_prefix / "labelled.nii.gz",
dataset_path=get_dataset_path(),
**JUNIFER_DATA_PARAMS,
)
parcellation_label_path = get(
file_path=path_prefix / "labels.csv",
dataset_path=get_dataset_path(),
**JUNIFER_DATA_PARAMS,
)
labels = pd.read_csv(parcellation_label_path, sep=",")["label"].to_list()
return parcellation_img_path, labels
def merge_parcellations( def merge_parcellations(
parcellations_list: list["Nifti1Image"], parcellations_list: list["Nifti1Image"],
parcellations_names: list[str], parcellations_names: list[str],

View file

@ -23,6 +23,7 @@ from junifer.data.parcellations import merge_parcellations
from junifer.data.parcellations._parcellations import ( from junifer.data.parcellations._parcellations import (
_retrieve_aicha, _retrieve_aicha,
_retrieve_brainnetome, _retrieve_brainnetome,
_retrieve_julich_brain,
_retrieve_schaefer, _retrieve_schaefer,
_retrieve_shen, _retrieve_shen,
_retrieve_suit, _retrieve_suit,
@ -962,6 +963,75 @@ def test_aseg() -> None:
) )
def test_glasser() -> None:
"""Test Glasser parcellation."""
parcellations = list_data(kind="parcellation")
assert "Glasser" in parcellations
# Load parcellation
img, label, img_path, space = load_data(
kind="parcellation",
name="Glasser",
target_space="MNI152NLin2009cAsym",
)
assert img is not None
assert img_path.name == "MNI_Glasser_HCP_v1.0.nii.gz"
assert space == "MNI152NLin2009cAsym"
assert len(label) == 360
assert_array_equal(
img.header["pixdim"][1:4],
3 * [1],
)
@pytest.mark.parametrize(
"version, rois",
[
("V1_18", 202),
("V2_9", 294),
("V3_0_3", 314),
("V3_1", 414),
],
)
def test_julich_brain(version: str, rois: int) -> None:
"""Test Julich-Brain parcellation.
Parameters
----------
version : str
The parametrized version.
rois : int
The parametrized # of ROIs.
"""
parcellations = list_data(kind="parcellation")
n = f"Julich-Brain_{version}"
assert n in parcellations
# Load parcellation
img, label, img_path, space = load_data(
kind="parcellation",
name=n,
target_space="MNI152NLin2009cAsym",
)
assert img is not None
assert img_path.name == "labelled.nii.gz"
assert space == "MNI152NLin2009cAsym"
assert len(label) == rois
assert_array_equal(
img.header["pixdim"][1:4],
3 * [1],
)
def test_retrieve_julich_brain_incorrect_version() -> None:
"""Test retrieve Julich-Brain with incorrect version."""
with pytest.raises(ValueError, match=r"The parameter `version`"):
_retrieve_julich_brain(
version="v0",
)
def test_merge_parcellations() -> None: def test_merge_parcellations() -> None:
"""Test merging parcellations.""" """Test merging parcellations."""
# load some parcellations for testing # load some parcellations for testing

View file

@ -24,10 +24,10 @@ __all__ = [
# junifer-data version constant # junifer-data version constant
JUNIFER_DATA_VERSION = "5" JUNIFER_DATA_VERSION = "7"
# junifer-data hexsha constant # junifer-data hexsha constant
JUNIFER_DATA_HEXSHA = "62a0e3d187259a3c3ba7be638ee39cfb40df0a61" JUNIFER_DATA_HEXSHA = "f5144e6fef7d6f4f26508c3653d94a622f10207c"
JUNIFER_DATA_PARAMS = { JUNIFER_DATA_PARAMS = {
"tag": JUNIFER_DATA_VERSION, "tag": JUNIFER_DATA_VERSION,