Feat/coordinates #71
18 changed files with 483 additions and 0 deletions
|
|
@ -31,6 +31,8 @@ Enhancements
|
|||
|
||||
- Implement matrix storage in SQliteFeatureStorage (:gh:`42` by `Fede Raimondo`_).
|
||||
|
||||
- Implement coordinate register, list and load (:gh:`11` by `Fede Raimondo`_).
|
||||
|
||||
Bugs
|
||||
~~~~
|
||||
|
||||
|
|
|
|||
19
junifer/data/VOIs/meta/CogAC_VOIs.txt
Normal file
19
junifer/data/VOIs/meta/CogAC_VOIs.txt
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
36.0 22.0 -4.0 RaIns
|
||||
2.0 16.0 48.0 preSMA
|
||||
48.0 12.0 30.0 rIFGp
|
||||
36.0 2.0 54.0 rdPMC
|
||||
48.0 30.0 24.0 rIFGa
|
||||
-38.0 -44.0 46.0 lIPS
|
||||
-24.0 -66.0 48.0 lSPL
|
||||
40.0 -46.0 46.0 rIPS
|
||||
60.0 -44.0 24.0 rIPC
|
||||
30.0 -62.0 52.0 rSPL
|
||||
-44.0 10.0 30.0 lIFG
|
||||
-34.0 20.0 -4.0 LaIns
|
||||
-26.0 2.0 52.0 ldPMC
|
||||
6.0 -18.0 -2.0 rThal
|
||||
-40.0 -66.0 -10.0 lIOG
|
||||
48.0 19.0 6.0 rIFG
|
||||
8.0 29.0 30.0 aMCC
|
||||
-45.0 27.0 30.0 lIFG
|
||||
11.0 7.0 7.0 rNcaud
|
||||
9
junifer/data/VOIs/meta/CogAR_VOIs.txt
Normal file
9
junifer/data/VOIs/meta/CogAR_VOIs.txt
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
-40 -64 -12 Fusiform_L
|
||||
36 22 -4 Insula_R
|
||||
-44 10 32 Precentral_L
|
||||
60 -44 24 Temporal_Sup_R
|
||||
0 18 48 Supp_Motor_Area_L
|
||||
-36 -46 46 Parietal_Inf_L
|
||||
38 -46 44 Parietal_Inf_R
|
||||
-26 0 54 Frontal_Mid_L
|
||||
|
||||
7
junifer/data/VOIs/meta/DMNBuckner_VOIs.txt
Normal file
7
junifer/data/VOIs/meta/DMNBuckner_VOIs.txt
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
0 -53 26 PCC
|
||||
0 52 -6 MPFC
|
||||
-48 -62 36 lAG
|
||||
46 -62 32 rAG
|
||||
-24 -22 -20 lHF
|
||||
24 -22 -20 rHF
|
||||
|
||||
22
junifer/data/VOIs/meta/Empathy_VOIs.txt
Normal file
22
junifer/data/VOIs/meta/Empathy_VOIs.txt
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
2.0 56.0 18.0 dmPFC
|
||||
-8.0 54.0 34.0 dmPFC
|
||||
36.0 22.0 -8.0 raI
|
||||
-30.0 20.0 4.0 laI
|
||||
50.0 12.0 -8.0 rIFG
|
||||
54.0 16.0 20.0 rIFG/Area44
|
||||
50.0 30.0 4.0 rIFG/Area45
|
||||
-44.0 24.0 -6.0 lIFG
|
||||
-4.0 18.0 50.0 SMA
|
||||
-2.0 28.0 20.0 aMCC
|
||||
-4.0 42.0 18.0 rACC
|
||||
-2.0 -32.0 28.0 PCC
|
||||
52.0 -58.0 22.0 rTPJ
|
||||
-56.0 -58.0 22.0 lTPJ
|
||||
22.0 -2.0 -16.0 rAm
|
||||
54.0 -8.0 -16.0 rMTG
|
||||
52.0 -36.0 2.0 rpSTS
|
||||
-12.0 -4.0 12.0 laTh
|
||||
6.0 -32.0 2.0 rpTh
|
||||
26.0 -26.0 -12.0 rHippo
|
||||
2.0 -20.0 -12.0 Midbrain
|
||||
14.0 4.0 0.0 rGP
|
||||
10
junifer/data/VOIs/meta/Motor_VOIs.txt
Normal file
10
junifer/data/VOIs/meta/Motor_VOIs.txt
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
-39.0 -21.0 54.0 lSMC*
|
||||
41.0 -16.0 57.0 rSMC*
|
||||
-3.0 -2.0 54.0 SMA
|
||||
-57.0 2.0 32.0 lPMCv
|
||||
-53.0 -24.0 21.0 lIPC
|
||||
45.0 -38.0 48.0 rIPC
|
||||
-23.0 -7.0 1.0 lBG
|
||||
25.0 -8.0 3.0 rBG
|
||||
-22.0 -52.0 26.0 lCba
|
||||
18.0 -54.0 -22.0 rCba
|
||||
10
junifer/data/VOIs/meta/MultiTask_VOIs.txt
Normal file
10
junifer/data/VOIs/meta/MultiTask_VOIs.txt
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
-34 22 -4 leftInsula
|
||||
34 24 0 rightInsula
|
||||
-26 0 52 Frontal_Mid_L
|
||||
44 38 28 Frontal_Inf_Tri_R
|
||||
46 10 28 Frontal_Inf_Oper_R
|
||||
-6 18 50 Supp_Motor_Area_L
|
||||
-34 -52 56 Parietal_Inf_L
|
||||
32 -52 50 Parietal_Inf_R
|
||||
32 6 58 Frontal_Mid_R
|
||||
|
||||
18
junifer/data/VOIs/meta/PhysioStress_VOIs.txt
Normal file
18
junifer/data/VOIs/meta/PhysioStress_VOIs.txt
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
38.0 18.0 0.0 rIns
|
||||
52.0 12.0 -4.0 rSTG
|
||||
60.0 6.0 2.0 rTP
|
||||
22.0 0.0 -4.0 rPall
|
||||
-38.0 14.0 4.0 lIns
|
||||
-58.0 0.0 6.0 lOP4
|
||||
-20.0 6.0 2.0 lPut
|
||||
4.0 6.0 46.0 rSMA
|
||||
0.0 14.0 36.0 lMCC
|
||||
-42.0 -18.0 18.0 lOP3
|
||||
-54.0 -24.0 24.0 lSMG
|
||||
-36.0 -20.0 2.0 lIns
|
||||
-14.0 -12.0 10.0 lTh
|
||||
10.0 -18.0 4.0 rTh
|
||||
56.0 -24.0 24.0 lSMG
|
||||
44.0 -14.0 16.0 rOP3
|
||||
38.0 50.0 12.0 rMFG
|
||||
-24.0 -66.0 -26.0 lCb
|
||||
25
junifer/data/VOIs/meta/Rew_VOIs.txt
Normal file
25
junifer/data/VOIs/meta/Rew_VOIs.txt
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
12.0 10.0 -6.0 rNAc
|
||||
-10.0 8.0 -4.0 lPall
|
||||
36.0 20.0 -6.0 rIns
|
||||
-32.0 20.0 -4.0 lIns
|
||||
0.0 24.0 40.0 dmPFC
|
||||
0.0 54.0 -8.0 medOFC
|
||||
24.0 -2.0 -16.0 rAm
|
||||
6.0 -14.0 8.0 rTh
|
||||
-6.0 -16.0 8.0 lTh
|
||||
0.0 8.0 48.0 SMA
|
||||
8.0 -18.0 -10.0 rBrainStem
|
||||
-6.0 -18.0 -10.0 lBrainStem
|
||||
2.0 44.0 20.0 ACC
|
||||
-24.0 2.0 52.0 lMFG
|
||||
-38.0 -4.0 6.0 lIns(Id3)
|
||||
24.0 40.0 -14.0 rMidOFC(Fo3)
|
||||
-16.0 42.0 -14.0 lMidOFC(Fo3)
|
||||
40.0 32.0 32.0 raMFG
|
||||
-28.0 -56.0 48.0 lIPL(IPS)
|
||||
28.0 -58.0 50.0 rAG
|
||||
0.0 -32.0 32.0 PCC
|
||||
-36.0 50.0 10.0 lFP
|
||||
-46.0 42.0 -4.0 lLOFC
|
||||
30.0 4.0 50.0 rpMFG
|
||||
-22.0 30.0 48.0 lSFG
|
||||
10
junifer/data/VOIs/meta/Somatosensory_VOIs.txt
Normal file
10
junifer/data/VOIs/meta/Somatosensory_VOIs.txt
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
-48.0 -20.0 20.0 S1_L
|
||||
-54.0 -20.0 48.0 postcentralG_S1_L
|
||||
-44.0 -26.0 58.0 postcentralG_S1_L
|
||||
-38.0 -12.0 4.0 Ins_claustrum_L
|
||||
-40.0 4.0 10.0 pars_opercularis_Ins_L
|
||||
56.0 -22.0 20.0 SMG_R
|
||||
56.0 -34.0 18.0 pSTG_R
|
||||
56.0 -38.0 28.0 IPL_SMG_R
|
||||
60.0 -20.0 32.0 postcentralG_R
|
||||
-4.0 14.0 36.0 MCC_L
|
||||
15
junifer/data/VOIs/meta/ToM_VOIs.txt
Normal file
15
junifer/data/VOIs/meta/ToM_VOIs.txt
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
0.0 52.0 -12.0 vmPFC
|
||||
2.0 58.0 12.0 FP
|
||||
-8.0 56.0 30.0 dmPFC
|
||||
2.0 -56.0 30.0 Prc
|
||||
56.0 -50.0 18.0 rTPJ
|
||||
-48.0 -56.0 24.0 lTPJ
|
||||
54.0 -2.0 -20.0 rTP
|
||||
-54.0 -2.0 -24.0 lTP
|
||||
52.0 -18.0 -12.0 rMTG
|
||||
-54.0 -28.0 -4.0 lMTG
|
||||
50.0 -34.0 0.0 rpSTS
|
||||
-58.0 -44.0 4.0 lpSTS
|
||||
54.0 28.0 6.0 rIFG
|
||||
-48.0 30.0 -12.0 lIFG
|
||||
48.0 -72.0 8.0 rV5
|
||||
16
junifer/data/VOIs/meta/VigAtt_VOIs.txt
Normal file
16
junifer/data/VOIs/meta/VigAtt_VOIs.txt
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
-2.0 8.0 50.0 aParacentralL
|
||||
8.0 32.0 46.0 rmpSFG
|
||||
0.0 26.0 34.0 dMCC
|
||||
50.0 8.0 32.0 rIFJ
|
||||
40.0 22.0 -4.0 raI
|
||||
46.0 36.0 20.0 rIFS
|
||||
-40.0 -12.0 60.0 lPrecentralG
|
||||
-46.0 -68.0 -6.0 lIOG
|
||||
-48.0 8.0 30.0 lIFJ
|
||||
62.0 -38.0 17.0 rTPJ
|
||||
8.0 -12.0 6.0 rTh
|
||||
32.0 -90.0 4.0 rMOG
|
||||
-42.0 12.0 -2.0 laI
|
||||
-10.0 -14.0 6.0 lTh
|
||||
6.0 -58.0 -18.0 Cb
|
||||
44.0 -44.0 46.0 rIPL
|
||||
23
junifer/data/VOIs/meta/WM_VOIs.txt
Normal file
23
junifer/data/VOIs/meta/WM_VOIs.txt
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
-32.0 22.0 -2.0 aIns_l
|
||||
-48.0 10.0 26.0 IFG_l
|
||||
-46.0 26.0 24.0 lPFCc_l
|
||||
-38.0 50.0 10.0 lPFCr_l
|
||||
36.0 22.0 -6.0 aIns_r
|
||||
50.0 14.0 24.0 IFG_r
|
||||
44.0 34.0 32.0 lPFCc_r
|
||||
38.0 54.0 6.0 lPFCr_l
|
||||
2.0 18.0 48.0 pmFC
|
||||
-28.0 0.0 56.0 psFC
|
||||
30.0 2.0 56.0 psFC
|
||||
-42.0 -42.0 46.0 IPS_l
|
||||
-34.0 -52.0 48.0 SPL_l
|
||||
-24.0 -66.0 54.0 SPLp_l
|
||||
42.0 -44.0 44.0 IPSa_r
|
||||
32.0 -58.0 48.0 IPSp_r
|
||||
16.0 -66.0 56.0 SPLp_r
|
||||
-12.0 -12.0 12.0 Thal_l
|
||||
-16.0 2.0 14.0 Ncaud_l
|
||||
-16.0 0.0 2.0 GP_l
|
||||
12.0 -10.0 10.0 Thal_r
|
||||
-34.0 -66.0 -20.0 Cb_FG_l
|
||||
32.0 -64.0 -18.0 Cb_FG_r
|
||||
17
junifer/data/VOIs/meta/eMDN_VOIs.txt
Normal file
17
junifer/data/VOIs/meta/eMDN_VOIs.txt
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
-46.0 6.0 30.0 IFG_l
|
||||
50.0 12.0 28.0 IFG_r
|
||||
-32.0 20.0 2.0 aIns_l
|
||||
36.0 22.0 0.0 aIns_r
|
||||
-4.0 14.0 44.0 SMA_l
|
||||
6.0 18.0 46.0 SMA_r
|
||||
-32.0 -52.0 46.0 IPS_l
|
||||
32.0 -58.0 48.0 IPS_r
|
||||
44.0 36.0 20.0 MFG_r
|
||||
-28.0 -4.0 52.0 dPMC_l
|
||||
-44.0 32.0 22.0 MFG_l
|
||||
32.0 0.0 52.0 dPMC_r
|
||||
-20.0 6.0 4.0 Put_l
|
||||
10.0 -12.0 8.0 Thal_r
|
||||
-46.0 -60.0 -10.0 ITG_l
|
||||
22.0 6.0 4.0 Put_r
|
||||
-10.0 -16.0 6.0 Thal_l
|
||||
12
junifer/data/VOIs/meta/eSAD_VOIs.txt
Normal file
12
junifer/data/VOIs/meta/eSAD_VOIs.txt
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
0.0 38.0 10.0 ACC
|
||||
-24.0 -10.0 -20.0 AmyHipp_L
|
||||
24.0 -8.0 -22.0 AmyHipp_R
|
||||
-2.0 -52.0 26.0 PrC
|
||||
-2.0 32.0 -8.0 SGC
|
||||
-46.0 -66.0 18.0 TPJ_L
|
||||
50.0 -60.0 18.0 TPJ_R
|
||||
-2.0 52.0 14.0 dmPFC
|
||||
-6.0 10.0 -8.0 vBG_L
|
||||
6.0 10.0 -8.0 vBG_R
|
||||
-2.0 50.0 -10.0 vmPFC
|
||||
-54.0 -10.0 -20.0 aMTS/aMTG
|
||||
16
junifer/data/VOIs/meta/extDMN_VOIs.txt
Normal file
16
junifer/data/VOIs/meta/extDMN_VOIs.txt
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
0 -53 6 PCC
|
||||
0 52 -6 MPFC
|
||||
-48 -62 36 lAG
|
||||
46 -62 32 rAG
|
||||
-24 -22 -20 lHF
|
||||
24 -22 -20 rHF
|
||||
10 -22 42 Middlecingulate
|
||||
-48 -20 38 lIPG
|
||||
0 -48 -30 cerebellum
|
||||
34 -80 -34 rCerebellum
|
||||
56 30 8 rdlPFC
|
||||
-42 -82 10 lateraloccipital
|
||||
-54 24 10 rdrPFC
|
||||
22 34 54 RSFG
|
||||
-50 14 -40 lTempP
|
||||
-38 14 54 leftmiddlefrontalgyrus(BA6)
|
||||
150
junifer/data/coordinates.py
Normal file
150
junifer/data/coordinates.py
Normal file
|
|
@ -0,0 +1,150 @@
|
|||
"""Provide functions for list of coordinates."""
|
||||
|
||||
# Authors: Federico Raimondo <f.raimondo@fz-juelich.de>
|
||||
# License: AGPL
|
||||
|
||||
from pathlib import Path
|
||||
from typing import Dict, List, Union, Optional, Tuple
|
||||
import typing
|
||||
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
from numpy.typing import ArrayLike
|
||||
|
||||
from ..utils.logging import logger, raise_error
|
||||
|
||||
|
||||
# Path to the VOIs
|
||||
_vois_path = Path(__file__).parent / "VOIs"
|
||||
|
||||
# Path to the metadata of the VOIs
|
||||
_vois_meta_path = _vois_path / "meta"
|
||||
|
||||
"""
|
||||
A dictionary containing all supported coordinates and their respective file or
|
||||
data.
|
||||
|
||||
The built-in coordinates are files that are shipped with the package in the
|
||||
data/VOIs directory. The user can also register their own coordinates, which
|
||||
will be stored as numpy arrays in the dictionary.
|
||||
"""
|
||||
_available_coordinates: Dict[
|
||||
str, Union[Path, Dict[str, Union[ArrayLike, List[str]]]]
|
||||
] = {
|
||||
"CogAC": _vois_meta_path / "CogAC_VOIs.txt",
|
||||
"CogAR": _vois_meta_path / "CogAR_VOIs.txt",
|
||||
"DMNBuckner": _vois_meta_path / "DMNBuckner_VOIs.txt",
|
||||
"eMDN": _vois_meta_path / "eMDN_VOIs.txt",
|
||||
"Empathy": _vois_meta_path / "Empathy_VOIs.txt",
|
||||
"eSAD": _vois_meta_path / "eSAD_VOIs.txt",
|
||||
"extDMN": _vois_meta_path / "extDMN_VOIs.txt",
|
||||
"Motor": _vois_meta_path / "Motor_VOIs.txt",
|
||||
"MultiTask": _vois_meta_path / "MultiTask_VOIs.txt",
|
||||
"PhysioStress": _vois_meta_path / "PhysioStress_VOIs.txt",
|
||||
"Rew": _vois_meta_path / "Rew_VOIs.txt",
|
||||
"Somatosensory": _vois_meta_path / "Somatosensory_VOIs.txt",
|
||||
"ToM": _vois_meta_path / "ToM_VOIs.txt",
|
||||
"VigAtt": _vois_meta_path / "VigAtt_VOIs.txt",
|
||||
"WM": _vois_meta_path / "WM_VOIs.txt",
|
||||
}
|
||||
|
||||
|
||||
def register_coordinates(
|
||||
name: str,
|
||||
coordinates: ArrayLike,
|
||||
voi_names: List[str],
|
||||
overwrite: Optional[bool] = False,
|
||||
) -> None:
|
||||
"""Register coordinates.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
name : str
|
||||
The name of the coordinates.
|
||||
coordinates : numpy.ndarray
|
||||
The coordinates.
|
||||
voi_names : list of str
|
||||
The names of the VOIs.
|
||||
overwrite : bool, optional
|
||||
If True, overwrite an existing list of coordinates with the same name.
|
||||
Does not apply to built-in coordinates (default False).
|
||||
|
||||
"""
|
||||
if name in _available_coordinates:
|
||||
if isinstance(_available_coordinates[name], Path):
|
||||
raise_error(
|
||||
f"Coordinates {name} already registered as built-in "
|
||||
"coordinates."
|
||||
)
|
||||
if overwrite is True:
|
||||
logger.info(f"Overwriting coordinates {name}")
|
||||
else:
|
||||
raise_error(
|
||||
f"Coordinates {name} already registered. "
|
||||
"Set `overwrite=True` to update its value."
|
||||
)
|
||||
|
||||
if not isinstance(coordinates, np.ndarray):
|
||||
raise_error(
|
||||
f"Coordinates must be a numpy.ndarray, not {type(coordinates)}."
|
||||
)
|
||||
if coordinates.ndim != 2:
|
||||
raise_error(
|
||||
f"Coordinates must be a 2D array, not {coordinates.ndim}D."
|
||||
)
|
||||
if coordinates.shape[1] != 3:
|
||||
raise_error(
|
||||
f"Each coordinate must have 3 values, not {coordinates.shape[1]} "
|
||||
)
|
||||
if len(voi_names) != coordinates.shape[0]:
|
||||
raise_error(
|
||||
f"Length of voi_names ({len(voi_names)}) does not match the "
|
||||
f"number of coordinates ({coordinates.shape[0]})."
|
||||
)
|
||||
_available_coordinates[name] = {
|
||||
"coords": coordinates,
|
||||
"voi_names": voi_names,
|
||||
}
|
||||
|
||||
|
||||
def list_coordinates() -> List[str]:
|
||||
"""List all the available coordinates lists (VOIs).
|
||||
|
||||
Returns
|
||||
-------
|
||||
list of str
|
||||
A list with all available coordinates names.
|
||||
|
||||
"""
|
||||
return sorted(_available_coordinates.keys())
|
||||
|
||||
|
||||
def load_coordinates(name: str) -> Tuple[ArrayLike, List[str]]:
|
||||
"""Load coordinates.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
name : str
|
||||
The name of the coordinates.
|
||||
|
||||
Returns
|
||||
-------
|
||||
numpy.ndarray
|
||||
The coordinates.
|
||||
list of str
|
||||
The names of the VOIs.
|
||||
|
||||
"""
|
||||
if name not in _available_coordinates:
|
||||
raise_error(f"Coordinates {name} not found.")
|
||||
t_coord = _available_coordinates[name]
|
||||
if isinstance(t_coord, Path):
|
||||
df_coords = pd.read_csv(t_coord, sep="\t", header=None)
|
||||
coords = df_coords.iloc[:, [0, 1, 2]].to_numpy()
|
||||
names = [x for x in df_coords.iloc[:, [3]].values[:, 0]]
|
||||
else:
|
||||
coords = t_coord["coords"]
|
||||
coords = typing.cast(ArrayLike, coords)
|
||||
names = t_coord["voi_names"]
|
||||
names = typing.cast(List[str], names)
|
||||
return coords, names
|
||||
102
junifer/data/tests/test_coordinates.py
Normal file
102
junifer/data/tests/test_coordinates.py
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
"""Provide tests for coordinates."""
|
||||
|
||||
# Authors: Federico Raimondo <f.raimondo@fz-juelich.de>
|
||||
# License: AGPL
|
||||
|
||||
import pytest
|
||||
|
||||
import numpy as np
|
||||
from numpy.testing import assert_array_equal
|
||||
|
||||
from junifer.data.coordinates import (
|
||||
list_coordinates,
|
||||
load_coordinates,
|
||||
register_coordinates,
|
||||
)
|
||||
|
||||
|
||||
def test_register_coordinates_built_in_check() -> None:
|
||||
"""Test coordinates registration check for built-in atlas."""
|
||||
with pytest.raises(ValueError, match=r"built-in"):
|
||||
register_coordinates(
|
||||
name="DMNBuckner",
|
||||
coordinates=np.zeros(2),
|
||||
voi_names=["1", "2"],
|
||||
overwrite=True,
|
||||
)
|
||||
|
||||
|
||||
def test_register_coordinates_overwrite() -> None:
|
||||
"""Test coordinates registration check for overwriting."""
|
||||
register_coordinates(
|
||||
name="MyList",
|
||||
coordinates=np.zeros((2, 3)),
|
||||
voi_names=["roi1", "roi2"],
|
||||
overwrite=True,
|
||||
)
|
||||
with pytest.raises(ValueError, match=r"already registered"):
|
||||
register_coordinates(
|
||||
name="MyList",
|
||||
coordinates=np.ones((2, 3)),
|
||||
voi_names=["roi2", "roi3"],
|
||||
)
|
||||
|
||||
register_coordinates(
|
||||
name="MyList",
|
||||
coordinates=np.ones((2, 3)),
|
||||
voi_names=["roi2", "roi3"],
|
||||
overwrite=True,
|
||||
)
|
||||
|
||||
coord, names = load_coordinates("MyList")
|
||||
assert_array_equal(coord, np.ones((2, 3)))
|
||||
assert names == ["roi2", "roi3"]
|
||||
|
||||
|
||||
def test_register_coordinates_valid_input() -> None:
|
||||
"""Test coordinates registration check for valid input."""
|
||||
with pytest.raises(ValueError, match=r"numpy.ndarray"):
|
||||
register_coordinates(
|
||||
name="MyList",
|
||||
coordinates=[1, 2],
|
||||
voi_names=["roi1", "roi2"],
|
||||
overwrite=True,
|
||||
)
|
||||
with pytest.raises(ValueError, match=r"2D array"):
|
||||
register_coordinates(
|
||||
name="MyList",
|
||||
coordinates=np.zeros((2, 3, 4)),
|
||||
voi_names=["roi1", "roi2"],
|
||||
overwrite=True,
|
||||
)
|
||||
|
||||
with pytest.raises(ValueError, match=r"3 values"):
|
||||
register_coordinates(
|
||||
name="MyList",
|
||||
coordinates=np.zeros((2, 4)),
|
||||
voi_names=["roi1", "roi2"],
|
||||
overwrite=True,
|
||||
)
|
||||
with pytest.raises(ValueError, match=r"voi_names"):
|
||||
register_coordinates(
|
||||
name="MyList",
|
||||
coordinates=np.zeros((2, 3)),
|
||||
voi_names=["roi1", "roi2", "roi3"],
|
||||
overwrite=True,
|
||||
)
|
||||
|
||||
|
||||
def test_list_coordinates() -> None:
|
||||
"""Test listing of available coordinates."""
|
||||
available_coordinates = list_coordinates()
|
||||
assert "DMNBuckner" in available_coordinates
|
||||
assert "MultiTask" in available_coordinates
|
||||
assert "VigAtt" in available_coordinates
|
||||
assert "WM" in available_coordinates
|
||||
|
||||
|
||||
def test_load_coordinates() -> None:
|
||||
"""Test loading coordinates from file."""
|
||||
coord, names = load_coordinates("DMNBuckner")
|
||||
assert coord.shape == (6, 3) # type: ignore
|
||||
assert names == ["PCC", "MPFC", "lAG", "rAG", "lHF", "rHF"]
|
||||
Loading…
Reference in a new issue