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 CHANGED
@@ -1 +1 @@
1
- 0.4a77
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
- SKIP_CACHE_MAINTENANCE = os.getenv("SKIP_CACHE_MAINTENANCE")
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:]
@@ -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
- "Taken from the tutorial at https://github.com/kwagstyl/cortical_layers_tutorial "
33
- "and assigned to cytoarchitectonic regions of Julich-Brain."
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
- "Taken from the tutorial at https://github.com/kwagstyl/cortical_layers_tutorial "
36
- "and assigned to cytoarchitectonic regions of Julich-Brain."
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__(
@@ -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
- BRANCH = "main"
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
- THICKNESSES_FILE_RIGHT = ""
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
- thickness_left = requests.HttpRequest(f"{cls.REPO}/raw/{cls.BRANCH}/{cls.THICKNESSES_FILE_LEFT}").data.T
57
- thickness_right = np.zeros(shape=thickness_left.shape) # TODO: replace with thickness data for te right hemisphere
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
- if not all(
66
- path.exists(cache.CACHE.build_filename(url))
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
- profiles_l = requests.HttpRequest(cls.PROFILES_FILE_LEFT).data.to_numpy()
74
- profiles_r = requests.HttpRequest(cls.PROFILES_FILE_RIGHT).data.to_numpy()
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.BASEURL}/{cls.MESH_FILE_LEFT}").data
79
- mesh_right = requests.HttpRequest(f"{cls.BASEURL}/{cls.MESH_FILE_RIGHT}").data
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, SKIP_CACHE_MAINTENANCE
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
- cls._instance.run_maintenance()
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.4a77
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=KWEXkCXSgPcsOE_dNH6LbVzyHYnODXDZY8CXl0Egx2Y,7
1
+ siibra/VERSION,sha256=UvxZTYcrSQPfssrvEnQndS8jJ6PCcMlUfASeSYXZ3Zg,7
2
2
  siibra/__init__.py,sha256=qBxxMRyl9RojNt0twQr2LDk1Nyk5eNsPHFxxoIwnpx4,4540
3
- siibra/commons.py,sha256=dlVKwREQnoJhYcfNqc3xeFiXTxE20MMk4ysiKDqW-rE,25860
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=JWG4KC9DlmsXazSn9tLdWkx7F8AlCtpwrBQcYZ0tRw0,2215
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=qbuOcV2EBuUFJDVrHBzDVLY3emV_xFslgESniOxl6cg,2138
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=kb-4K512s9Hrn3y0MNYhT7Mqc8Qq-BXFOO-aU65pHyI,9416
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=rukHHurC8fBWT7E8pd1q5L3Yhc4uWdDC4emXrqAHl9E,5125
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.4a77.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
68
- siibra-0.4a77.dist-info/METADATA,sha256=JHLNILZoMFgEMjiuLgikBQpQXlZAMChN0wrOUgcQLEU,9804
69
- siibra-0.4a77.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92
70
- siibra-0.4a77.dist-info/top_level.txt,sha256=NF0OSGLL0li2qyC7MaU0iBB5Y9S09_euPpvisD0-8Hg,7
71
- siibra-0.4a77.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.41.3)
2
+ Generator: setuptools (70.1.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5