chore: junifer.data.parcellations cleanup #238

Merged
synchon merged 8 commits from chore/parcellation-cleanup into main 2023-07-07 14:08:24 +00:00
4 changed files with 105 additions and 106 deletions

View file

@ -269,7 +269,7 @@ Available
| A spatially unbiased atlas template of the human cerebellum. | A spatially unbiased atlas template of the human cerebellum.
| NeuroImage, Volume 33(1), Pages 127–138 (2006). | NeuroImage, Volume 33(1), Pages 127–138 (2006).
| https://doi.org/10.1016/j.neuroimage.2006.05.056 | https://doi.org/10.1016/j.neuroimage.2006.05.056
* - TIAN * - Tian
- ``scale``, ``space``, ``magneticfield`` - ``scale``, ``space``, ``magneticfield``
- | ``TianxS1x3TxMNI6thgeneration``, ``TianxS1x7TxMNI6thgeneration``, - | ``TianxS1x3TxMNI6thgeneration``, ``TianxS1x7TxMNI6thgeneration``,
| ``TianxS2x3TxMNI6thgeneration``, ``TianxS2x7TxMNI6thgeneration``, | ``TianxS2x3TxMNI6thgeneration``, ``TianxS2x7TxMNI6thgeneration``,
@ -301,7 +301,7 @@ Available
- | Shen, X., Tokoglu, F., Papademetris, X., Constable, R.T. - | Shen, X., Tokoglu, F., Papademetris, X., Constable, R.T.
| Groupwise whole-brain parcellation from resting-state fMRI data | Groupwise whole-brain parcellation from resting-state fMRI data
| for network node identification. | for network node identification.
| Neuroimage, Volume 82 (2013). | NeuroImage, Volume 82 (2013).
| https://doi.org/10.1016/j.neuroimage.2013.05.081. | https://doi.org/10.1016/j.neuroimage.2013.05.081.
| Finn, E.S., Shen, X., Scheinost, D., et al. | Finn, E.S., Shen, X., Scheinost, D., et al.
| Functional connectome fingerprinting: identifying individuals using | Functional connectome fingerprinting: identifying individuals using
@ -353,7 +353,7 @@ Planned
* - 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.
| Neuroimage, Volume 206 (2020). | NeuroImage, Volume 206 (2020).
| https://doi.org/10.1016/j.neuroimage.2019.116189 | https://doi.org/10.1016/j.neuroimage.2019.116189
* - Mindboggle 101 * - Mindboggle 101
- | Klein, A., & Tourville, J. - | Klein, A., & Tourville, J.

View file

@ -0,0 +1 @@
Improve docstrings and code style and parametrize remaining tests for ``junifer.data.parcellations`` by `Synchon Mandal`_

View file

@ -308,7 +308,7 @@ def _retrieve_parcellation(
``n_rois`` : {100, 200, 300, 400, 500, 600, 700, 800, 900, 1000} ``n_rois`` : {100, 200, 300, 400, 500, 600, 700, 800, 900, 1000}
Granularity of parcellation to be used. Granularity of parcellation to be used.
``yeo_network`` : {7, 17}, optional ``yeo_network`` : {7, 17}, optional
Number of yeo networks to use (default 7). Number of Yeo networks to use (default 7).
* Tian : * Tian :
``scale`` : {1, 2, 3, 4} ``scale`` : {1, 2, 3, 4}
Scale of parcellation (defines granularity). Scale of parcellation (defines granularity).
@ -430,7 +430,7 @@ def _retrieve_schaefer(
n_rois : {100, 200, 300, 400, 500, 600, 700, 800, 900, 1000}, optional n_rois : {100, 200, 300, 400, 500, 600, 700, 800, 900, 1000}, optional
Granularity of the parceallation to be used (default None). Granularity of the parceallation to be used (default None).
yeo_networks : {7, 17}, optional yeo_networks : {7, 17}, optional
Number of yeo networks to use (default 7). Number of Yeo networks to use (default 7).
Returns Returns
------- -------
@ -447,9 +447,9 @@ def _retrieve_schaefer(
""" """
logger.info("Parcellation parameters:") logger.info("Parcellation parameters:")
logger.info(f"\tresolution: {resolution}")
logger.info(f"\tn_rois: {n_rois}") logger.info(f"\tn_rois: {n_rois}")
logger.info(f"\tyeo_networks: {yeo_networks}") logger.info(f"\tyeo_networks: {yeo_networks}")
logger.info(f"\tresolution: {resolution}")
_valid_n_rois = [100, 200, 300, 400, 500, 600, 700, 800, 900, 1000] _valid_n_rois = [100, 200, 300, 400, 500, 600, 700, 800, 900, 1000]
_valid_networks = [7, 17] _valid_networks = [7, 17]
@ -555,10 +555,11 @@ def _retrieve_tian(
""" """
# show parameters to user # show parameters to user
logger.info("Parcellation parameters:") logger.info("Parcellation parameters:")
logger.info(f"\tresolution: {resolution}")
logger.info(f"\tscale: {scale}") logger.info(f"\tscale: {scale}")
logger.info(f"\tspace: {space}") logger.info(f"\tspace: {space}")
logger.info(f"\tmagneticfield: {magneticfield}") logger.info(f"\tmagneticfield: {magneticfield}")
logger.info(f"\tresolution: {resolution}")
# check validity of parameters # check validity of parameters
_valid_scales = [1, 2, 3, 4] _valid_scales = [1, 2, 3, 4]
if scale not in _valid_scales: if scale not in _valid_scales:
@ -714,6 +715,7 @@ def _retrieve_suit(
""" """
logger.info("Parcellation parameters:") logger.info("Parcellation parameters:")
logger.info(f"\tresolution: {resolution}")
logger.info(f"\tspace: {space}") logger.info(f"\tspace: {space}")
_valid_spaces = ["MNI", "SUIT"] _valid_spaces = ["MNI", "SUIT"]
@ -825,6 +827,7 @@ def _retrieve_aicha(
""" """
# show parameters to user # show parameters to user
logger.info("Parcellation parameters:") logger.info("Parcellation parameters:")
logger.info(f"\tresolution: {resolution}")
logger.info(f"\tversion: {version}") logger.info(f"\tversion: {version}")
# Check version value # Check version value
@ -963,6 +966,7 @@ def _retrieve_shen( # noqa: C901
""" """
# show parameters to user # show parameters to user
logger.info("Parcellation parameters:") logger.info("Parcellation parameters:")
logger.info(f"\tresolution: {resolution}")
logger.info(f"\tyear: {year}") logger.info(f"\tyear: {year}")
logger.info(f"\tn_rois: {n_rois}") logger.info(f"\tn_rois: {n_rois}")

View file

@ -207,88 +207,95 @@ def test_retrieve_parcellation_incorrect() -> None:
_retrieve_parcellation("wrongparcellation") _retrieve_parcellation("wrongparcellation")
# TODO: paramdtrize test @pytest.mark.parametrize(
def test_schaefer_parcellation(tmp_path: Path) -> None: "resolution, n_rois, yeo_networks",
[
(1.0, 100, 7),
(1.0, 200, 7),
(1.0, 300, 7),
(1.0, 400, 7),
(1.0, 500, 7),
(1.0, 600, 7),
(1.0, 700, 7),
(1.0, 800, 7),
(1.0, 900, 7),
(1.0, 1000, 7),
(2.0, 100, 7),
(2.0, 200, 7),
(2.0, 300, 7),
(2.0, 400, 7),
(2.0, 500, 7),
(2.0, 600, 7),
(2.0, 700, 7),
(2.0, 800, 7),
(2.0, 900, 7),
(2.0, 1000, 7),
(1.0, 100, 17),
(1.0, 200, 17),
(1.0, 300, 17),
(1.0, 400, 17),
(1.0, 500, 17),
(1.0, 600, 17),
(1.0, 700, 17),
(1.0, 800, 17),
(1.0, 900, 17),
(1.0, 1000, 17),
(2.0, 100, 17),
(2.0, 200, 17),
(2.0, 300, 17),
(2.0, 400, 17),
(2.0, 500, 17),
(2.0, 600, 17),
(2.0, 700, 17),
(2.0, 800, 17),
(2.0, 900, 17),
(2.0, 1000, 17),
],
)
def test_schaefer(
tmp_path: Path,
resolution: float,
n_rois: int,
yeo_networks: int,
) -> None:
"""Test Schaefer parcellation. """Test Schaefer parcellation.
Parameters Parameters
---------- ----------
tmp_path : pathlib.Path tmp_path : pathlib.Path
The path to the test directory. The path to the test directory.
resolution : float
The parametrized resolution values.
n_rois : int
The parametrized ROI count values.
yeo_networks : int
The parametrized Yeo networks values.
""" """
parcellations = list_parcellations() parcellations = list_parcellations()
for n_rois in range(100, 1001, 100): parcellation_name = f"Schaefer{n_rois}x{yeo_networks}"
for t_net in [7, 17]: assert parcellation_name in parcellations
t_name = f"Schaefer{n_rois}x{t_net}"
assert t_name in parcellations
# Define parcellation file names parcellation_file = (
fname1 = "Schaefer2018_100Parcels_7Networks_order_FSLMNI152_1mm.nii.gz" f"Schaefer2018_{n_rois}Parcels_{yeo_networks}Networks_order_FSLMNI152_"
fname2 = "Schaefer2018_100Parcels_7Networks_order_FSLMNI152_2mm.nii.gz" f"{int(resolution)}mm.nii.gz"
)
# Load parcellation # Load parcellation
img, lbl, fname = load_parcellation( img, label, img_path = load_parcellation(
name="Schaefer100x7", parcellations_dir=str(tmp_path.absolute()) name=parcellation_name,
parcellations_dir=tmp_path,
resolution=resolution,
) )
# Check parcellation values
assert img is not None assert img is not None
assert fname.name == fname1 assert img_path.name == parcellation_file
assert len(lbl) == 100 assert len(label) == n_rois
assert_array_equal(img.header["pixdim"][1:4], [1, 1, 1]) # type: ignore assert_array_equal(
img.header["pixdim"][1:4], 3 * [resolution] # type: ignore
# Test with Path
img, lbl, fname = load_parcellation(
name="Schaefer100x7", parcellations_dir=tmp_path
) )
# Load parcellation
img2, lbl, fname = load_parcellation(
name="Schaefer100x7", parcellations_dir=tmp_path, resolution=3
)
# Check parcellation values
assert fname.name == fname2
assert len(lbl) == 100
assert img2 is not None
assert_array_equal(img2.header["pixdim"][1:4], [2, 2, 2]) # type: ignore
# Load parcellation
img2, lbl, fname = load_parcellation(
"Schaefer100x7", parcellations_dir=tmp_path, resolution=2.1
)
# Check parcellation values
assert fname.name == fname2
assert len(lbl) == 100
assert img2 is not None
assert_array_equal(img2.header["pixdim"][1:4], [2, 2, 2]) # type: ignore
# Load parcellation
img2, lbl, fname = load_parcellation(
"Schaefer100x7", parcellations_dir=tmp_path, resolution=1.99
)
# Check parcellation values
assert fname.name == fname1
assert len(lbl) == 100
assert img2 is not None
assert_array_equal(img2.header["pixdim"][1:4], [1, 1, 1]) # type: ignore
# Load parcellation
img2, lbl, fname = load_parcellation(
"Schaefer100x7", parcellations_dir=tmp_path, resolution=0.5
)
# Check parcellation values
assert fname.name == fname1
assert len(lbl) == 100
assert img2 is not None
assert_array_equal(img2.header["pixdim"][1:4], [1, 1, 1]) # type: ignore
def test_load_parcellation_schaefer() -> None:
"""Test Schaefer parcellation loading."""
img, lbl, fname = load_parcellation(name="Schaefer100x7")
assert img is not None
home_dir = Path().home() / "junifer" / "data" / "parcellations"
assert home_dir in fname.parents
def test_retrieve_schaefer_incorrect_n_rois(tmp_path: Path) -> None: def test_retrieve_schaefer_incorrect_n_rois(tmp_path: Path) -> None:
"""Test retrieve schaefer with incorrect n_rois. """Test retrieve Schaefer with incorrect ROIs.
Parameters Parameters
---------- ----------
@ -306,7 +313,7 @@ def test_retrieve_schaefer_incorrect_n_rois(tmp_path: Path) -> None:
def test_retrieve_schaefer_incorrect_yeo_networks(tmp_path: Path) -> None: def test_retrieve_schaefer_incorrect_yeo_networks(tmp_path: Path) -> None:
"""Test retrieve schaefer with incorrect yeo_networks. """Test retrieve Schaefer with incorrect Yeo networks.
Parameters Parameters
---------- ----------
@ -323,53 +330,36 @@ def test_retrieve_schaefer_incorrect_yeo_networks(tmp_path: Path) -> None:
) )
# TODO: parametrize test @pytest.mark.parametrize(
def test_suit(tmp_path: Path) -> None: "space",
["SUIT", "MNI"],
)
def test_suit(tmp_path: Path, space: str) -> None:
"""Test SUIT parcellation. """Test SUIT parcellation.
Parameters Parameters
---------- ----------
tmp_path : pathlib.Path tmp_path : pathlib.Path
The path to the test directory. The path to the test directory.
space : str
The parametrized space values.
""" """
parcellations = list_parcellations() parcellations = list_parcellations()
assert "SUITxSUIT" in parcellations assert f"SUITx{space}" in parcellations
assert "SUITxMNI" in parcellations
# Load parcellation # Load parcellation
img, lbl, fname = load_parcellation( img, label, img_path = load_parcellation(
name="SUITxSUIT", parcellations_dir=tmp_path name=f"SUITx{space}",
parcellations_dir=tmp_path,
) )
fname1 = "SUIT_SUITSpace_1mm.nii"
assert img is not None assert img is not None
assert fname.name == fname1 assert img_path.name == f"SUIT_{space}Space_1mm.nii"
assert len(lbl) == 34 assert len(label) == 34
assert_array_equal(img.header["pixdim"][1:4], [1, 1, 1]) # type: ignore
# Load parcellation
img, lbl, fname = load_parcellation(
name="SUITxSUIT", parcellations_dir=tmp_path
)
fname1 = "SUIT_SUITSpace_1mm.nii"
assert img is not None
assert fname.name == fname1
assert len(lbl) == 34
assert_array_equal(img.header["pixdim"][1:4], [1, 1, 1]) # type: ignore
# Load parcellation
img, lbl, fname = load_parcellation(
name="SUITxMNI", parcellations_dir=tmp_path
)
fname1 = "SUIT_MNISpace_1mm.nii"
assert img is not None
assert fname.name == fname1
assert len(lbl) == 34
assert_array_equal(img.header["pixdim"][1:4], [1, 1, 1]) # type: ignore assert_array_equal(img.header["pixdim"][1:4], [1, 1, 1]) # type: ignore
def test_retrieve_suit_incorrect_space(tmp_path: Path) -> None: def test_retrieve_suit_incorrect_space(tmp_path: Path) -> None:
"""Test retrieve suit with incorrect space. """Test retrieve SUIT with incorrect space.
Parameters Parameters
---------- ----------
@ -378,7 +368,9 @@ def test_retrieve_suit_incorrect_space(tmp_path: Path) -> None:
""" """
with pytest.raises(ValueError, match=r"The parameter `space`"): with pytest.raises(ValueError, match=r"The parameter `space`"):
_retrieve_suit(parcellations_dir=tmp_path, resolution=1, space="wrong") _retrieve_suit(
parcellations_dir=tmp_path, resolution=1.0, space="wrong"
)
@pytest.mark.parametrize( @pytest.mark.parametrize(
@ -641,7 +633,9 @@ def test_shen(
assert f"Shen_{year}_{n_rois}" in parcellations assert f"Shen_{year}_{n_rois}" in parcellations
# Load parcellation # Load parcellation
img, label, img_path = load_parcellation( img, label, img_path = load_parcellation(
name=f"Shen_{year}_{n_rois}", parcellations_dir=tmp_path name=f"Shen_{year}_{n_rois}",
parcellations_dir=tmp_path,
resolution=resolution,
) )
assert img is not None assert img is not None
assert img_name in img_path.name assert img_name in img_path.name