siibra 0.4a77__py3-none-any.whl → 0.4a80__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of siibra might be problematic. Click here for more details.
- siibra/VERSION +1 -1
- siibra/commons.py +1 -1
- siibra/explorer/__init__.py +1 -0
- siibra/explorer/url.py +162 -0
- siibra/explorer/util.py +65 -0
- siibra/features/tabular/bigbrain_intensity_profile.py +3 -2
- siibra/features/tabular/layerwise_bigbrain_intensities.py +3 -2
- siibra/livequeries/bigbrain.py +11 -22
- siibra/retrieval/cache.py +5 -6
- {siibra-0.4a77.dist-info → siibra-0.4a80.dist-info}/METADATA +7 -25
- {siibra-0.4a77.dist-info → siibra-0.4a80.dist-info}/RECORD +14 -11
- {siibra-0.4a77.dist-info → siibra-0.4a80.dist-info}/WHEEL +1 -1
- {siibra-0.4a77.dist-info → siibra-0.4a80.dist-info}/LICENSE +0 -0
- {siibra-0.4a77.dist-info → siibra-0.4a80.dist-info}/top_level.txt +0 -0
siibra/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.4a80
|
siibra/commons.py
CHANGED
|
@@ -46,7 +46,7 @@ SIIBRA_CACHEDIR = os.getenv("SIIBRA_CACHEDIR")
|
|
|
46
46
|
SIIBRA_LOG_LEVEL = os.getenv("SIIBRA_LOG_LEVEL", "INFO")
|
|
47
47
|
SIIBRA_USE_CONFIGURATION = os.getenv("SIIBRA_USE_CONFIGURATION")
|
|
48
48
|
SIIBRA_USE_LOCAL_SNAPSPOT = os.getenv("SIIBRA_USE_LOCAL_SNAPSPOT")
|
|
49
|
-
|
|
49
|
+
SKIP_CACHEINIT_MAINTENANCE = os.getenv("SKIP_CACHEINIT_MAINTENANCE")
|
|
50
50
|
NEUROGLANCER_MAX_GIB = os.getenv("NEUROGLANCER_MAX_GIB", 0.2)
|
|
51
51
|
|
|
52
52
|
with open(os.path.join(ROOT_DIR, "VERSION"), "r") as fp:
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .url import encode_url, decode_url
|
siibra/explorer/url.py
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
from typing import Optional, TYPE_CHECKING
|
|
2
|
+
from urllib.parse import quote_plus
|
|
3
|
+
from numpy import int32
|
|
4
|
+
import numpy as np
|
|
5
|
+
import re
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
import math
|
|
8
|
+
|
|
9
|
+
from .util import encode_number, separator, cipher, neg, decode_number, post_process
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from siibra.core.atlas import Atlas
|
|
13
|
+
from siibra.core.space import Space
|
|
14
|
+
from siibra.locations import BoundingBox, Point
|
|
15
|
+
from siibra.core.parcellation import Parcellation
|
|
16
|
+
from siibra.core.region import Region
|
|
17
|
+
from siibra.features.feature import Feature
|
|
18
|
+
|
|
19
|
+
class DecodeNavigationException(Exception): pass
|
|
20
|
+
|
|
21
|
+
min_int32=-2_147_483_648
|
|
22
|
+
max_int32=2_147_483_647
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
default_root_url='https://atlases.ebrains.eu/viewer/'
|
|
26
|
+
|
|
27
|
+
def sanitize_id(id: str):
|
|
28
|
+
return id.replace('/', ':')
|
|
29
|
+
|
|
30
|
+
def get_perspective_zoom(atlas: "Atlas", space: "Space", parc: "Parcellation", region: Optional["Region"]):
|
|
31
|
+
import siibra
|
|
32
|
+
if atlas is siibra.atlases['rat'] or atlas is siibra.atlases['mouse']:
|
|
33
|
+
return 200000
|
|
34
|
+
return 2000000
|
|
35
|
+
|
|
36
|
+
def get_zoom(atlas: "Atlas", space: "Space", parc: "Parcellation", region: Optional["Region"]):
|
|
37
|
+
import siibra
|
|
38
|
+
if atlas is siibra.atlases['rat'] or atlas is siibra.atlases['mouse']:
|
|
39
|
+
return 35000
|
|
40
|
+
return 350000
|
|
41
|
+
|
|
42
|
+
supported_prefix = (
|
|
43
|
+
"nifti://",
|
|
44
|
+
"swc://",
|
|
45
|
+
"precomputed://",
|
|
46
|
+
"deepzoom://"
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
def append_query_params(url: str, *args, query_params={}, **kwargs):
|
|
50
|
+
query_str = "&".join([f"{key}={quote_plus(value)}" for key, value in query_params.items()])
|
|
51
|
+
if len(query_str) > 0:
|
|
52
|
+
query_str = "?" + query_str
|
|
53
|
+
return url + query_str
|
|
54
|
+
|
|
55
|
+
@post_process(append_query_params)
|
|
56
|
+
def encode_url(atlas: "Atlas", space: "Space", parc: "Parcellation", region: Optional["Region"]=None, *, root_url=default_root_url, external_url:str=None, feature: "Feature"=None, ignore_warning=False, query_params={}):
|
|
57
|
+
|
|
58
|
+
overlay_url = None
|
|
59
|
+
if external_url:
|
|
60
|
+
assert any([external_url.startswith(prefix) for prefix in supported_prefix]), f"url needs to start with {(' , '.join(supported_prefix))}"
|
|
61
|
+
overlay_url = '/x-overlay-layer:{url}'.format(
|
|
62
|
+
url=external_url.replace("/", "%2F")
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
zoom = get_zoom(atlas, space, parc, region)
|
|
66
|
+
pzoom = get_perspective_zoom(atlas, space, parc, region)
|
|
67
|
+
|
|
68
|
+
zoom_kwargs = {
|
|
69
|
+
"encoded_pzoom": encode_number(pzoom, False),
|
|
70
|
+
"encoded_zoom": encode_number(zoom, False)
|
|
71
|
+
}
|
|
72
|
+
nav_string='/@:0.0.0.-W000.._eCwg.2-FUe3._-s_W.2_evlu..{encoded_pzoom}..{encoded_nav}..{encoded_zoom}'
|
|
73
|
+
|
|
74
|
+
return_url='{root_url}#/a:{atlas_id}/t:{template_id}/p:{parc_id}{overlay_url}'.format(
|
|
75
|
+
root_url = root_url,
|
|
76
|
+
atlas_id = sanitize_id(atlas.id),
|
|
77
|
+
template_id = sanitize_id(space.id),
|
|
78
|
+
parc_id = sanitize_id(parc.id),
|
|
79
|
+
overlay_url = overlay_url if overlay_url else "",
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
if feature is not None:
|
|
83
|
+
return_url = return_url + f"/f:{sanitize_id(feature.id)}"
|
|
84
|
+
|
|
85
|
+
if region is None:
|
|
86
|
+
return return_url + nav_string.format(encoded_nav='0.0.0', **zoom_kwargs)
|
|
87
|
+
|
|
88
|
+
return_url=f'{return_url}/rn:{get_hash(region.name)}'
|
|
89
|
+
|
|
90
|
+
try:
|
|
91
|
+
result_props=region.spatial_props(space, maptype='labelled')
|
|
92
|
+
if len(result_props.components) == 0:
|
|
93
|
+
return return_url + nav_string.format(encoded_nav='0.0.0', **zoom_kwargs)
|
|
94
|
+
except Exception as e:
|
|
95
|
+
print(f'Cannot get_spatial_props {str(e)}')
|
|
96
|
+
if not ignore_warning:
|
|
97
|
+
raise e
|
|
98
|
+
return return_url + nav_string.format(encoded_nav='0.0.0', **zoom_kwargs)
|
|
99
|
+
|
|
100
|
+
centroid=result_props.components[0].centroid
|
|
101
|
+
|
|
102
|
+
encoded_centroid=separator.join([ encode_number(math.floor(val * 1e6)) for val in centroid ])
|
|
103
|
+
return_url=return_url + nav_string.format(encoded_nav=encoded_centroid, **zoom_kwargs)
|
|
104
|
+
return return_url
|
|
105
|
+
|
|
106
|
+
@dataclass
|
|
107
|
+
class DecodedUrl:
|
|
108
|
+
bounding_box: "BoundingBox"
|
|
109
|
+
|
|
110
|
+
def decode_url(url: str, vp_length=1000):
|
|
111
|
+
import siibra
|
|
112
|
+
try:
|
|
113
|
+
space_match = re.search(r'/t:(?P<space_id>[^/]+)', url)
|
|
114
|
+
space_id = space_match.group("space_id")
|
|
115
|
+
space_id = space_id.replace(":", "/")
|
|
116
|
+
space = siibra.spaces[space_id]
|
|
117
|
+
except Exception as e:
|
|
118
|
+
raise DecodeNavigationException from e
|
|
119
|
+
|
|
120
|
+
nav_match = re.search(r'/@:(?P<navigation_str>.+)/?', url)
|
|
121
|
+
navigation_str = nav_match.group("navigation_str")
|
|
122
|
+
for char in navigation_str:
|
|
123
|
+
assert char in cipher or char in [neg, separator], f"char {char} not in cipher, nor separator/neg"
|
|
124
|
+
|
|
125
|
+
try:
|
|
126
|
+
ori_enc, pers_ori_enc, pers_zoom_enc, pos_enc, zoomm_enc = navigation_str.split(f"{separator}{separator}")
|
|
127
|
+
except Exception as e:
|
|
128
|
+
raise DecodeNavigationException from e
|
|
129
|
+
|
|
130
|
+
try:
|
|
131
|
+
x_enc, y_enc, z_enc = pos_enc.split(separator)
|
|
132
|
+
pos = [decode_number(val) for val in [x_enc, y_enc, z_enc]]
|
|
133
|
+
zoom = decode_number(zoomm_enc)
|
|
134
|
+
|
|
135
|
+
# zoom = nm/pixel
|
|
136
|
+
pt1 = [(coord - (zoom * vp_length / 2)) / 1e6 for coord in pos]
|
|
137
|
+
pt1 = Point(pt1, space)
|
|
138
|
+
|
|
139
|
+
pt2 = [(coord + (zoom * vp_length / 2)) / 1e6 for coord in pos]
|
|
140
|
+
pt2 = Point(pt2, space)
|
|
141
|
+
|
|
142
|
+
except Exception as e:
|
|
143
|
+
raise DecodeNavigationException from e
|
|
144
|
+
|
|
145
|
+
bbx = BoundingBox(pt1, pt2, space)
|
|
146
|
+
return DecodedUrl(bounding_box=bbx)
|
|
147
|
+
|
|
148
|
+
def get_hash(full_string: str):
|
|
149
|
+
return_val=0
|
|
150
|
+
with np.errstate(over="ignore"):
|
|
151
|
+
for char in full_string:
|
|
152
|
+
# overflowing is expected and in fact the whole reason why convert number to int32
|
|
153
|
+
|
|
154
|
+
# in windows, int32((0 - min_int32) << 5), rather than overflow to wraper around, raises OverflowError
|
|
155
|
+
shifted_5 = int32(
|
|
156
|
+
(return_val - min_int32) if return_val > max_int32 else return_val
|
|
157
|
+
<< 5)
|
|
158
|
+
|
|
159
|
+
return_val = int32(shifted_5 - return_val + ord(char))
|
|
160
|
+
return_val = return_val & return_val
|
|
161
|
+
hex_val = hex(return_val)
|
|
162
|
+
return hex_val[3:]
|
siibra/explorer/util.py
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import math
|
|
2
|
+
import struct
|
|
3
|
+
from functools import wraps
|
|
4
|
+
from typing import Callable
|
|
5
|
+
|
|
6
|
+
cipher = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_-'
|
|
7
|
+
separator = '.'
|
|
8
|
+
neg = '~'
|
|
9
|
+
def encode_number(n, float_flag=False):
|
|
10
|
+
if float_flag:
|
|
11
|
+
b=struct.pack('f', n)
|
|
12
|
+
new_n=struct.unpack('i',b)
|
|
13
|
+
return encode_int(new_n[0])
|
|
14
|
+
else:
|
|
15
|
+
return encode_int(n)
|
|
16
|
+
|
|
17
|
+
def encode_int(n):
|
|
18
|
+
if not isinstance(n, int):
|
|
19
|
+
raise ValueError('Cannot encode int')
|
|
20
|
+
|
|
21
|
+
residual=None
|
|
22
|
+
result=''
|
|
23
|
+
if n < 0:
|
|
24
|
+
result += neg
|
|
25
|
+
residual = n * -1
|
|
26
|
+
else:
|
|
27
|
+
residual = n
|
|
28
|
+
|
|
29
|
+
while True:
|
|
30
|
+
result = cipher[residual % 64] + result
|
|
31
|
+
residual = math.floor(residual / 64)
|
|
32
|
+
|
|
33
|
+
if residual == 0:
|
|
34
|
+
break
|
|
35
|
+
return result
|
|
36
|
+
|
|
37
|
+
def decode_int(n):
|
|
38
|
+
neg_flag = False
|
|
39
|
+
if n[-1] == neg:
|
|
40
|
+
neg_flag = True
|
|
41
|
+
n = n[:-1]
|
|
42
|
+
|
|
43
|
+
result = 0
|
|
44
|
+
for char in n:
|
|
45
|
+
val = cipher.index(char)
|
|
46
|
+
result = result * 64 + val
|
|
47
|
+
|
|
48
|
+
if neg_flag:
|
|
49
|
+
result = result * -1
|
|
50
|
+
return result
|
|
51
|
+
|
|
52
|
+
def decode_number(n, float_flag=False):
|
|
53
|
+
if float_flag:
|
|
54
|
+
raise NotImplementedError
|
|
55
|
+
return decode_int(n)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def post_process(post_process: Callable):
|
|
59
|
+
def outer(fn):
|
|
60
|
+
@wraps(fn)
|
|
61
|
+
def inner(*args, **kwargs):
|
|
62
|
+
val = fn(*args, **kwargs)
|
|
63
|
+
return post_process(val, *args, **kwargs)
|
|
64
|
+
return inner
|
|
65
|
+
return outer
|
|
@@ -29,8 +29,9 @@ class BigBrainIntensityProfile(
|
|
|
29
29
|
"cortical layers: Cortical and laminar thickness gradients diverge in sensory and "
|
|
30
30
|
"motor cortices. PLoS Biology, 18(4), e3000678. "
|
|
31
31
|
"http://dx.doi.org/10.1371/journal.pbio.3000678'."
|
|
32
|
-
"
|
|
33
|
-
"
|
|
32
|
+
"The data is taken from the tutorial at "
|
|
33
|
+
"https://github.com/kwagstyl/cortical_layers_tutorial. Each vertex is "
|
|
34
|
+
"assigned to the regional map when queried."
|
|
34
35
|
)
|
|
35
36
|
|
|
36
37
|
def __init__(
|
|
@@ -32,8 +32,9 @@ class LayerwiseBigBrainIntensities(
|
|
|
32
32
|
"cortical layers: Cortical and laminar thickness gradients diverge in sensory and "
|
|
33
33
|
"motor cortices. PLoS Biology, 18(4), e3000678. "
|
|
34
34
|
"http://dx.doi.org/10.1371/journal.pbio.3000678'."
|
|
35
|
-
"
|
|
36
|
-
"
|
|
35
|
+
"The data is taken from the tutorial at "
|
|
36
|
+
"https://github.com/kwagstyl/cortical_layers_tutorial. Each vertex is "
|
|
37
|
+
"assigned to the regional map when queried."
|
|
37
38
|
)
|
|
38
39
|
|
|
39
40
|
def __init__(
|
siibra/livequeries/bigbrain.py
CHANGED
|
@@ -29,15 +29,10 @@ from os import path
|
|
|
29
29
|
|
|
30
30
|
class WagstylProfileLoader:
|
|
31
31
|
|
|
32
|
-
REPO = "https://github.com/kwagstyl/cortical_layers_tutorial"
|
|
33
|
-
|
|
34
|
-
PROFILES_FILE_LEFT = "https://data-proxy.ebrains.eu/api/v1/public/buckets/d-26d25994-634c-40af-b88f-2a36e8e1d508/profiles/profiles_left.txt"
|
|
35
|
-
PROFILES_FILE_RIGHT = "https://data-proxy.ebrains.eu/api/v1/public/buckets/d-26d25994-634c-40af-b88f-2a36e8e1d508/profiles/profiles_right.txt"
|
|
32
|
+
REPO = "https://github.com/kwagstyl/cortical_layers_tutorial/raw/main"
|
|
33
|
+
PROFILES_FILE_LEFT = "data/profiles_left.npy"
|
|
36
34
|
THICKNESSES_FILE_LEFT = "data/thicknesses_left.npy"
|
|
37
|
-
|
|
38
|
-
MESH_FILE_LEFT = "gray_left_327680.surf.gii"
|
|
39
|
-
MESH_FILE_RIGHT = "gray_right_327680.surf.gii"
|
|
40
|
-
BASEURL = "https://ftp.bigbrainproject.org/bigbrain-ftp/BigBrainRelease.2015/3D_Surfaces/Apr7_2016/gii/"
|
|
35
|
+
MESH_FILE_LEFT = "data/gray_left_327680.surf.gii"
|
|
41
36
|
_profiles = None
|
|
42
37
|
_vertices = None
|
|
43
38
|
_boundary_depths = None
|
|
@@ -53,31 +48,25 @@ class WagstylProfileLoader:
|
|
|
53
48
|
@classmethod
|
|
54
49
|
def _load(cls):
|
|
55
50
|
# read thicknesses, in mm, and normalize by their last column which is the total thickness
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
thickness = np.concatenate((thickness_left[:, :-1], thickness_right[:, :-1])) # last column is the computed total thickness
|
|
59
|
-
total_thickness = thickness.sum(1)
|
|
51
|
+
thickness = requests.HttpRequest(f"{cls.REPO}/{cls.THICKNESSES_FILE_LEFT}").data.T
|
|
52
|
+
total_thickness = thickness[:, :-1].sum(1) # last column is the computed total thickness
|
|
60
53
|
valid = np.where(total_thickness > 0)[0]
|
|
61
54
|
cls._boundary_depths = np.c_[np.zeros_like(valid), (thickness[valid, :] / total_thickness[valid, None]).cumsum(1)]
|
|
62
55
|
cls._boundary_depths[:, -1] = 1 # account for float calculation errors
|
|
63
56
|
|
|
64
57
|
# find profiles with valid thickness
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
for url in [cls.PROFILES_FILE_LEFT, cls.PROFILES_FILE_RIGHT]
|
|
68
|
-
):
|
|
58
|
+
profile_l_url = f"{cls.REPO}/{cls.PROFILES_FILE_LEFT}"
|
|
59
|
+
if not path.exists(cache.CACHE.build_filename(profile_l_url)):
|
|
69
60
|
logger.info(
|
|
70
61
|
"First request to BigBrain profiles. Preprocessing the data "
|
|
71
62
|
"now. This may take a little."
|
|
72
63
|
)
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
cls._profiles = np.concatenate((profiles_l, profiles_r))[valid, :]
|
|
64
|
+
profiles_l_all = requests.HttpRequest(profile_l_url).data
|
|
65
|
+
cls._profiles = profiles_l_all[valid, :]
|
|
76
66
|
|
|
77
67
|
# read mesh vertices
|
|
78
|
-
mesh_left = requests.HttpRequest(f"{cls.
|
|
79
|
-
|
|
80
|
-
mesh_vertices = np.concatenate((mesh_left.darrays[0].data, mesh_right.darrays[0].data))
|
|
68
|
+
mesh_left = requests.HttpRequest(f"{cls.REPO}/{cls.MESH_FILE_LEFT}").data
|
|
69
|
+
mesh_vertices = mesh_left.darrays[0].data
|
|
81
70
|
cls._vertices = mesh_vertices[valid, :]
|
|
82
71
|
|
|
83
72
|
logger.debug(f"{cls._profiles.shape[0]} BigBrain intensity profiles.")
|
siibra/retrieval/cache.py
CHANGED
|
@@ -19,7 +19,7 @@ import os
|
|
|
19
19
|
from appdirs import user_cache_dir
|
|
20
20
|
import tempfile
|
|
21
21
|
|
|
22
|
-
from ..commons import logger, SIIBRA_CACHEDIR,
|
|
22
|
+
from ..commons import logger, SIIBRA_CACHEDIR, SKIP_CACHEINIT_MAINTENANCE
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
def assert_folder(folder):
|
|
@@ -64,7 +64,10 @@ class Cache:
|
|
|
64
64
|
cls.folder = SIIBRA_CACHEDIR
|
|
65
65
|
cls.folder = assert_folder(cls.folder)
|
|
66
66
|
cls._instance = cls.__new__(cls)
|
|
67
|
-
|
|
67
|
+
if SKIP_CACHEINIT_MAINTENANCE:
|
|
68
|
+
logger.debug("Will not run maintenance on cache as SKIP_CACHE_MAINTENANCE is set to True.")
|
|
69
|
+
else:
|
|
70
|
+
cls._instance.run_maintenance()
|
|
68
71
|
return cls._instance
|
|
69
72
|
|
|
70
73
|
def clear(self):
|
|
@@ -77,10 +80,6 @@ class Cache:
|
|
|
77
80
|
def run_maintenance(self):
|
|
78
81
|
""" Shrinks the cache by deleting oldest files first until the total size
|
|
79
82
|
is below cache size (Cache.SIZE) given in GiB."""
|
|
80
|
-
if SKIP_CACHE_MAINTENANCE:
|
|
81
|
-
logger.debug("Will not run maintenance on cache as SKIP_CACHE_MAINTENANCE is set to True.")
|
|
82
|
-
return
|
|
83
|
-
|
|
84
83
|
# build sorted list of cache files and their os attributes
|
|
85
84
|
files = [os.path.join(self.folder, fname) for fname in os.listdir(self.folder)]
|
|
86
85
|
sfiles = sorted([(fn, os.stat(fn)) for fn in files], key=lambda t: t[1].st_atime)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: siibra
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4a80
|
|
4
4
|
Summary: siibra - Software interfaces for interacting with brain atlases
|
|
5
5
|
Home-page: https://github.com/FZJ-INM1-BDA/siibra-python
|
|
6
6
|
Author: Big Data Analytics Group, Forschungszentrum Juelich, Institute of Neuroscience and Medicine (INM-1)
|
|
@@ -28,6 +28,7 @@ Requires-Dist: typing-extensions ; python_version < "3.8"
|
|
|
28
28
|
|
|
29
29
|
|License| |PyPI version| |doi| |Python versions| |Documentation Status|
|
|
30
30
|
|
|
31
|
+
==============================================================
|
|
31
32
|
siibra - Software interface for interacting with brain atlases
|
|
32
33
|
==============================================================
|
|
33
34
|
|
|
@@ -64,7 +65,7 @@ It aims to provide a safe way of using maps defined across multiple spatial scal
|
|
|
64
65
|
.. getting-started-start
|
|
65
66
|
|
|
66
67
|
Installation
|
|
67
|
-
|
|
68
|
+
============
|
|
68
69
|
|
|
69
70
|
``siibra`` is available on pypi.
|
|
70
71
|
To install the latest released version, simply run ``pip install siibra``.
|
|
@@ -80,27 +81,9 @@ There is also an image based on jupyter:scipy-notebook, which already includes `
|
|
|
80
81
|
--name siibra \
|
|
81
82
|
docker-registry.ebrains.eu/siibra/siibra-python:latest
|
|
82
83
|
|
|
83
|
-
Access to EBRAINS
|
|
84
|
-
-----------------
|
|
85
|
-
|
|
86
|
-
While the core features in ``siibra`` can be accessed without any authentication, siibra can perform dynamic queries to regional datasets stored in the `EBRAINS Knowledge Graph <https://kg.ebrains.eu>`__.
|
|
87
|
-
To use this functionality, you need to obtain an EBRAINS authentication token with a valid EBRAINS user account.
|
|
88
|
-
`Registering to EBRAINS <https://ebrains.eu/register/>`__ is easy and free of charge, so we strongly recommend to sign up.
|
|
89
|
-
To use your EBRAINS access token in siibra:
|
|
90
|
-
|
|
91
|
-
1. If you do not yet have an EBRAINS account, register `here <https://ebrains.eu/register>`__.
|
|
92
|
-
2. When using siibra, fetch an authentication token by using `siibra.fetch_ebrains_token()`. You will be asked to visit an ebrains login website. Login, and accept the requested detail.
|
|
93
|
-
|
|
94
|
-
Since tokens are temporary, step 2. needs to be repeated regularly.
|
|
95
|
-
If you prefer, you can also create your token by visiting `the EBRAINS authorization endpoint <https://nexus-iam.humanbrainproject.org/v0/oauth2/authorize>`__.
|
|
96
|
-
Copy the token, and either store it in the environment variable ``$HBP_AUTH_TOKEN`` or pass it explicitly to ``siibra`` using `siibra.set_ebrains_token()`.
|
|
97
|
-
The token is a string sequence with more than 1000 characters, usually starting with with “ey”.
|
|
98
|
-
|
|
99
|
-
Note that as of now, you need to to step 2 approximately every day to perform EBRAINS data queries.
|
|
100
|
-
However, ``siibra`` maintains a local cache on disk, so once retrieved, data features become usable and accessible without refreshing the token.
|
|
101
84
|
|
|
102
85
|
Documentation & Help
|
|
103
|
-
|
|
86
|
+
====================
|
|
104
87
|
|
|
105
88
|
``siibra-python``\ ’s documentation is hosted on https://siibra-python.readthedocs.io.
|
|
106
89
|
The documentation includes a catalogue of documented code examples that walk you through the different concepts and functionalities.
|
|
@@ -117,9 +100,8 @@ While care is taken to make everything work reliably, the API of the library is
|
|
|
117
100
|
|
|
118
101
|
.. contribute-start
|
|
119
102
|
|
|
120
|
-
|
|
121
103
|
How to contribute
|
|
122
|
-
|
|
104
|
+
=================
|
|
123
105
|
|
|
124
106
|
If you want to contribute to ``siibra``, feel free to fork it and open a pull request with your changes.
|
|
125
107
|
You are also welcome to contribute to discussions in the issue tracker and of course to report issues you are facing.
|
|
@@ -131,7 +113,7 @@ You can also star the project to show us that you are using it.
|
|
|
131
113
|
.. acknowledgments-start
|
|
132
114
|
|
|
133
115
|
Acknowledgements
|
|
134
|
-
|
|
116
|
+
================
|
|
135
117
|
|
|
136
118
|
This software code is funded from the European Union’s Horizon 2020 Framework Programme for Research and Innovation under the Specific Grant Agreement No. 945539 (Human Brain Project SGA3).
|
|
137
119
|
|
|
@@ -140,7 +122,7 @@ This software code is funded from the European Union’s Horizon 2020 Framework
|
|
|
140
122
|
.. howtocite-start
|
|
141
123
|
|
|
142
124
|
How to cite
|
|
143
|
-
|
|
125
|
+
===========
|
|
144
126
|
Please cite the version used according to the citation file
|
|
145
127
|
or all versions by
|
|
146
128
|
`Timo Dickscheid, Xiayun Gui, Ahmet Nihat Simsek, Vadim Marcenko,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
siibra/VERSION,sha256=
|
|
1
|
+
siibra/VERSION,sha256=UvxZTYcrSQPfssrvEnQndS8jJ6PCcMlUfASeSYXZ3Zg,7
|
|
2
2
|
siibra/__init__.py,sha256=qBxxMRyl9RojNt0twQr2LDk1Nyk5eNsPHFxxoIwnpx4,4540
|
|
3
|
-
siibra/commons.py,sha256=
|
|
3
|
+
siibra/commons.py,sha256=PImsqrZBp2Mn_9ZEJOxEOd4i-w_HPMv4sUcHCtN9cPw,25868
|
|
4
4
|
siibra/configuration/__init__.py,sha256=-_Kuf0TfMEdFXiSCTAdcHUL_krA8-cxhJypSNNay53Q,752
|
|
5
5
|
siibra/configuration/configuration.py,sha256=x06QsaqGQbce1d9TuFCCYEgMWJBlLbkt8B3zTfYz5RE,6887
|
|
6
6
|
siibra/configuration/factory.py,sha256=O5_IwvLNahOOcuAPGmBfO9Ag0lnCaHCGAd2koYYD8dg,19923
|
|
@@ -11,6 +11,9 @@ siibra/core/parcellation.py,sha256=Eob_rMtxQTOcFFbWuE0dbRXfHM8ALaeDsNpoyD7tVOc,1
|
|
|
11
11
|
siibra/core/region.py,sha256=P_WIC_TWAZmzrr1i4ZrKlj4y9IwHbXkdSSsRKF4W3Bw,32817
|
|
12
12
|
siibra/core/relation_qualification.py,sha256=EUU9EPkV0mdCjGUU2hki1rQ5R5U4X2YoFmvwOirO2_E,3641
|
|
13
13
|
siibra/core/space.py,sha256=dC225jhRFt0KlPtjKEEVre6X8HoDupsymEOrc7AdmmI,5774
|
|
14
|
+
siibra/explorer/__init__.py,sha256=_9gCCp7P8AniGlztulrRyleIOEKcNZlBFVurtnI8GBM,40
|
|
15
|
+
siibra/explorer/url.py,sha256=mUAFN7OHfLELfdqqJmSdAkmXJjKCv6Qh5RHtyxNQjfo,5868
|
|
16
|
+
siibra/explorer/util.py,sha256=Z2ruicDL3S_qcxhHHW0GF1q5-r963tJpzgtQmAn8YSM,1424
|
|
14
17
|
siibra/features/__init__.py,sha256=Y5q2M7HoToTcfAdO50jmnPGZybJOi5GyEcbxQRscJjo,1518
|
|
15
18
|
siibra/features/anchor.py,sha256=1w9VuSEWC3oapph8GtbsW26kvMcE7_9ik7281oRMjlE,14245
|
|
16
19
|
siibra/features/feature.py,sha256=DrRp1WwnwSAkj9cocexnA-m9TTi_ltlBmgo4IB2kAOc,19863
|
|
@@ -27,11 +30,11 @@ siibra/features/image/image.py,sha256=Mo3ca3MkCi1zq0T6jNmr-Pr-x1Xq_Cl3y8SALOslOF
|
|
|
27
30
|
siibra/features/image/sections.py,sha256=d4TQSs6nIKQ5vgi89htERfWOMgnvOA9k4LhaXBMWNbE,961
|
|
28
31
|
siibra/features/image/volume_of_interest.py,sha256=DIv9GNOptfungLddA_CfrrCfY8p36rbWCT9xkE6K66w,2654
|
|
29
32
|
siibra/features/tabular/__init__.py,sha256=3DBwa8JtGd-npeOyyw6kJzcveKXadbqSATyJtTnY3-w,1176
|
|
30
|
-
siibra/features/tabular/bigbrain_intensity_profile.py,sha256
|
|
33
|
+
siibra/features/tabular/bigbrain_intensity_profile.py,sha256=-dXzznb6r1BhMjE8jOeugbZ3MjXo0AJkTtOw25SehYs,2238
|
|
31
34
|
siibra/features/tabular/cell_density_profile.py,sha256=hPGE-lW36QCJrfLWHk9W4DmAow6HxSJG18onBcOicK8,9096
|
|
32
35
|
siibra/features/tabular/cortical_profile.py,sha256=eXHj9egU5A52G5oMGxQ4IO_VrG1w3tp3QbIv-sOhhsI,9549
|
|
33
36
|
siibra/features/tabular/gene_expression.py,sha256=YqUicjGC0rkPXSWZwJtUjgxCIcfekeGk9nkWT0EZceE,4965
|
|
34
|
-
siibra/features/tabular/layerwise_bigbrain_intensities.py,sha256=
|
|
37
|
+
siibra/features/tabular/layerwise_bigbrain_intensities.py,sha256=w6AxLPyUxHBOQlkNPgr4O4xARTzmmXenEHA0nbUDgbo,2161
|
|
35
38
|
siibra/features/tabular/layerwise_cell_density.py,sha256=CJMcUeN_aawfCzZTLq4xKq-Kas5sHFNVNVL6bqhCOEc,4167
|
|
36
39
|
siibra/features/tabular/receptor_density_fingerprint.py,sha256=aah1PE3W4_tWSKmjTlGVsBp7DEGfAI6Xtt3yQHBOwPE,7164
|
|
37
40
|
siibra/features/tabular/receptor_density_profile.py,sha256=6JO14y9WB40PbDDcxu8KvC_0HGi3l3rnUiGJWjgsk4w,3577
|
|
@@ -39,7 +42,7 @@ siibra/features/tabular/regional_timeseries_activity.py,sha256=mLMlbyrNMjB5azeVX
|
|
|
39
42
|
siibra/features/tabular/tabular.py,sha256=-HM6VfmNXXmWpGrixmkKFHgNmj5T0xNRqd6JBbIqbvc,5001
|
|
40
43
|
siibra/livequeries/__init__.py,sha256=rpJKroYqtujIkvAUlavOIHUlP4Yg73U27Se44aZms2Q,1013
|
|
41
44
|
siibra/livequeries/allen.py,sha256=a0-F1Wk8ocJcJBm1pZLv9BvHjdv2iPeM56xmkN-g-r4,12252
|
|
42
|
-
siibra/livequeries/bigbrain.py,sha256=
|
|
45
|
+
siibra/livequeries/bigbrain.py,sha256=GzyrtMD31O-S6J-FMi5754fzfIexovOHmdDFF3mcvvs,8464
|
|
43
46
|
siibra/livequeries/ebrains.py,sha256=6Ra-5Wjn-GOR5ybZp_zDqsIxwGJBS0mF-H8JXNCLeJI,5724
|
|
44
47
|
siibra/livequeries/query.py,sha256=8npNqiovJpWioVe_vYof10y128E7sH0LJh62d7OJTSQ,1862
|
|
45
48
|
siibra/locations/__init__.py,sha256=8NCOAo4hU0nUeLxGGaWYM3GfHORuoxUoLQ8QBVli9-I,855
|
|
@@ -48,7 +51,7 @@ siibra/locations/location.py,sha256=B2mdopHa_zIY_-lfeBzosdkKnIklG-BuWF7fXWq1dQk,
|
|
|
48
51
|
siibra/locations/point.py,sha256=ZPfjcGgxBvZrXNJ7HA4qLk9xr-0ZlA2Nj_5z8w4IZzw,12662
|
|
49
52
|
siibra/locations/pointset.py,sha256=Wp-qlU3hdlLlEc3WU-QodpL_70It7GQf9FctnYLXsQI,7159
|
|
50
53
|
siibra/retrieval/__init__.py,sha256=pAJ2WsNk9tVY1RddmXzya1iFgJXJarO4TVCJTob1Ej0,1062
|
|
51
|
-
siibra/retrieval/cache.py,sha256=
|
|
54
|
+
siibra/retrieval/cache.py,sha256=9Wssws2YHiI_OW4EZp72OzYV9nw8h5cAEAakSxtRMts,5143
|
|
52
55
|
siibra/retrieval/datasets.py,sha256=hmzTIAJ50fK302crWXlNjA27NrVNBdks8xTx8tb2uvM,11174
|
|
53
56
|
siibra/retrieval/repositories.py,sha256=wYE3oYcIBgD3WOqIerS3darsg_TSrfpdDJ72l2uytak,25961
|
|
54
57
|
siibra/retrieval/requests.py,sha256=tRmgocvob7619e_4Vw-dVd8R3JJ95UGkVyESXF2EBE0,22013
|
|
@@ -64,8 +67,8 @@ siibra/volumes/nifti.py,sha256=nGSCedjpsiy43XIiHQ2SRy9rPRK8Ci9QDq4AHKclCck,9030
|
|
|
64
67
|
siibra/volumes/parcellationmap.py,sha256=nSxkVRbIhyrE6dXzVkrtGk1uoZlPQE1Mcgn1s2vjbZo,44173
|
|
65
68
|
siibra/volumes/sparsemap.py,sha256=_vM14wKn-7PHBIbT9rBKGGN4XQXijdKtT6BnyKxWXeE,21682
|
|
66
69
|
siibra/volumes/volume.py,sha256=Er8w5c76ZEKmoWyvEU-HHmZ6bbh8YM51j3jT-XRYDtU,10889
|
|
67
|
-
siibra-0.
|
|
68
|
-
siibra-0.
|
|
69
|
-
siibra-0.
|
|
70
|
-
siibra-0.
|
|
71
|
-
siibra-0.
|
|
70
|
+
siibra-0.4a80.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
71
|
+
siibra-0.4a80.dist-info/METADATA,sha256=iY0tgirvyb94NczZv6eCSH4QbCpR4r0qfbhs2UCoPU4,8330
|
|
72
|
+
siibra-0.4a80.dist-info/WHEEL,sha256=mguMlWGMX-VHnMpKOjjQidIo1ssRlCFu4a4mBpz1s2M,91
|
|
73
|
+
siibra-0.4a80.dist-info/top_level.txt,sha256=NF0OSGLL0li2qyC7MaU0iBB5Y9S09_euPpvisD0-8Hg,7
|
|
74
|
+
siibra-0.4a80.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|