siibra 1.0a19__py3-none-any.whl → 1.0.1a0__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.

Files changed (38) hide show
  1. siibra/VERSION +1 -1
  2. siibra/__init__.py +3 -3
  3. siibra/commons.py +0 -46
  4. siibra/configuration/factory.py +10 -20
  5. siibra/core/atlas.py +20 -14
  6. siibra/core/parcellation.py +67 -52
  7. siibra/core/region.py +133 -123
  8. siibra/exceptions.py +8 -0
  9. siibra/experimental/contour.py +6 -6
  10. siibra/experimental/patch.py +2 -2
  11. siibra/experimental/plane3d.py +8 -8
  12. siibra/features/anchor.py +12 -13
  13. siibra/features/connectivity/regional_connectivity.py +2 -2
  14. siibra/features/feature.py +14 -16
  15. siibra/features/tabular/bigbrain_intensity_profile.py +1 -1
  16. siibra/features/tabular/cell_density_profile.py +97 -63
  17. siibra/features/tabular/layerwise_cell_density.py +3 -22
  18. siibra/features/tabular/regional_timeseries_activity.py +2 -2
  19. siibra/livequeries/allen.py +39 -16
  20. siibra/livequeries/bigbrain.py +8 -8
  21. siibra/livequeries/query.py +0 -1
  22. siibra/locations/__init__.py +9 -9
  23. siibra/locations/boundingbox.py +29 -24
  24. siibra/locations/point.py +4 -4
  25. siibra/locations/{pointset.py → pointcloud.py} +30 -22
  26. siibra/retrieval/repositories.py +9 -26
  27. siibra/retrieval/requests.py +19 -2
  28. siibra/volumes/__init__.py +1 -1
  29. siibra/volumes/parcellationmap.py +88 -81
  30. siibra/volumes/providers/neuroglancer.py +62 -36
  31. siibra/volumes/providers/nifti.py +11 -25
  32. siibra/volumes/sparsemap.py +124 -245
  33. siibra/volumes/volume.py +141 -52
  34. {siibra-1.0a19.dist-info → siibra-1.0.1a0.dist-info}/METADATA +16 -3
  35. {siibra-1.0a19.dist-info → siibra-1.0.1a0.dist-info}/RECORD +38 -38
  36. {siibra-1.0a19.dist-info → siibra-1.0.1a0.dist-info}/WHEEL +1 -1
  37. {siibra-1.0a19.dist-info → siibra-1.0.1a0.dist-info}/LICENSE +0 -0
  38. {siibra-1.0a19.dist-info → siibra-1.0.1a0.dist-info}/top_level.txt +0 -0
siibra/volumes/volume.py CHANGED
@@ -19,9 +19,9 @@ from .providers import provider as _provider
19
19
  from .. import logger
20
20
  from ..retrieval import requests
21
21
  from ..core import space as _space, structure
22
- from ..locations import location, point, pointset, boundingbox
22
+ from ..locations import point, pointcloud, boundingbox
23
23
  from ..commons import resample_img_to_img, siibra_tqdm, affine_scaling, connected_components
24
- from ..exceptions import NoMapAvailableError, SpaceWarpingFailedError
24
+ from ..exceptions import NoMapAvailableError, SpaceWarpingFailedError, EmptyPointCloudError
25
25
 
26
26
  from dataclasses import dataclass
27
27
  from nibabel import Nifti1Image
@@ -92,7 +92,7 @@ class ComponentSpatialProperties:
92
92
  return spatial_props
93
93
 
94
94
 
95
- class Volume(location.Location):
95
+ class Volume(structure.BrainStructure):
96
96
  """
97
97
  A volume is a specific mesh or 3D array,
98
98
  which can be accessible via multiple providers in different formats.
@@ -203,6 +203,19 @@ class Volume(location.Location):
203
203
  if self._boundingbox is not None and len(fetch_kwargs) == 0:
204
204
  return self._boundingbox
205
205
 
206
+ if not self.provides_image:
207
+ raise NotImplementedError("Bounding box calculation of meshes is not implemented yet.")
208
+
209
+ if clip: # clippin requires fetching the image
210
+ img = self.fetch(**fetch_kwargs)
211
+ assert isinstance(img, Nifti1Image)
212
+ return boundingbox.from_array(
213
+ array=np.asanyarray(img.dataobj),
214
+ background=background,
215
+ ).transform(img.affine, space=self.space)
216
+
217
+ # if clipping is not required, providers migth have methods of creating
218
+ # bounding boxes without fetching the image
206
219
  fmt = fetch_kwargs.get("format")
207
220
  if (fmt is not None) and (fmt not in self.formats):
208
221
  raise ValueError(
@@ -212,15 +225,15 @@ class Volume(location.Location):
212
225
  providers = [self._providers[fmt]] if fmt else self._providers.values()
213
226
  for provider in providers:
214
227
  try:
228
+ assert clip is False
215
229
  bbox = provider.get_boundingbox(
216
- clip=clip, background=background, **fetch_kwargs
230
+ background=background, **fetch_kwargs
217
231
  )
218
- if bbox.space is None: # provider does usually not know the space!
232
+ if bbox.space is None: # provider do not know the space!
219
233
  bbox._space_cached = self.space
220
234
  bbox.minpoint._space_cached = self.space
221
235
  bbox.maxpoint._space_cached = self.space
222
- except NotImplementedError as e:
223
- logger.info(e)
236
+ except NotImplementedError:
224
237
  continue
225
238
  return bbox
226
239
  raise RuntimeError(f"No bounding box specified by any volume provider of {str(self)}")
@@ -275,7 +288,7 @@ class Volume(location.Location):
275
288
 
276
289
  def evaluate_points(
277
290
  self,
278
- points: Union['point.Point', 'pointset.PointSet'],
291
+ points: Union['point.Point', 'pointcloud.PointCloud'],
279
292
  outside_value: Union[int, float] = 0,
280
293
  **fetch_kwargs
281
294
  ) -> np.ndarray:
@@ -294,7 +307,7 @@ class Volume(location.Location):
294
307
 
295
308
  Parameters
296
309
  ----------
297
- points: PointSet
310
+ points: PointCloud
298
311
  outside_value: int, float. Default: 0
299
312
  fetch_kwargs: dict
300
313
  Any additional arguments are passed to the `fetch()` call for
@@ -314,8 +327,8 @@ class Volume(location.Location):
314
327
  raise NotImplementedError("Filtering of points by pure mesh volumes not yet implemented.")
315
328
 
316
329
  # make sure the points are in the same physical space as this volume
317
- as_pointset = pointset.from_points([points]) if isinstance(points, point.Point) else points
318
- warped = as_pointset.warp(self.space)
330
+ as_pointcloud = pointcloud.from_points([points]) if isinstance(points, point.Point) else points
331
+ warped = as_pointcloud.warp(self.space)
319
332
  assert warped is not None, SpaceWarpingFailedError
320
333
 
321
334
  # get the voxel array of this volume
@@ -342,57 +355,50 @@ class Volume(location.Location):
342
355
 
343
356
  def _points_inside(
344
357
  self,
345
- points: Union['point.Point', 'pointset.PointSet'],
358
+ points: Union['point.Point', 'pointcloud.PointCloud'],
346
359
  keep_labels: bool = True,
347
360
  outside_value: Union[int, float] = 0,
348
361
  **fetch_kwargs
349
- ) -> 'pointset.PointSet':
362
+ ) -> 'pointcloud.PointCloud':
350
363
  """
351
- Reduce a pointset to the points which fall inside nonzero pixels of
364
+ Reduce a pointcloud to the points which fall inside nonzero pixels of
352
365
  this map.
353
366
 
354
367
 
355
368
  Paramaters
356
369
  ----------
357
- points: PointSet
370
+ points: PointCloud
358
371
  keep_labels: bool
359
- If False, the returned PointSet will be labeled with their indices
360
- in the original PointSet.
372
+ If False, the returned PointCloud will be labeled with their indices
373
+ in the original PointCloud.
361
374
  fetch_kwargs: dict
362
375
  Any additional arguments are passed to the `fetch()` call for
363
376
  retrieving the image data.
364
377
 
365
378
  Returns
366
379
  -------
367
- PointSet
368
- A new PointSet containing only the points inside the volume.
380
+ PointCloud
381
+ A new PointCloud containing only the points inside the volume.
369
382
  Labels reflect the indices of the original points if `keep_labels`
370
383
  is False.
371
384
  """
372
- ptset = pointset.from_points([points]) if isinstance(points, point.Point) else points
385
+ ptset = pointcloud.from_points([points]) if isinstance(points, point.Point) else points
373
386
  values = self.evaluate_points(ptset, outside_value=outside_value, **fetch_kwargs)
374
387
  inside = list(np.where(values != outside_value)[0])
375
- return pointset.from_points(
388
+ return pointcloud.from_points(
376
389
  [ptset[i] for i in inside],
377
390
  newlabels=None if keep_labels else inside
378
391
  )
379
392
 
380
- def union(self, other: location.Location):
381
- if isinstance(other, Volume):
382
- return merge([self, other])
383
- else:
384
- raise NotImplementedError(
385
- f"There are no union method for {(self.__class__.__name__, other.__class__.__name__)}"
386
- )
387
-
388
393
  def intersection(self, other: structure.BrainStructure, **fetch_kwargs) -> structure.BrainStructure:
389
394
  """
390
395
  Compute the intersection of a location with this volume. This will
391
396
  fetch actual image data. Any additional arguments are passed to fetch.
392
397
  """
393
- if isinstance(other, (pointset.PointSet, point.Point)):
394
- points_inside = self._points_inside(other, keep_labels=False, **fetch_kwargs)
395
- if len(points_inside) == 0:
398
+ if isinstance(other, (pointcloud.PointCloud, point.Point)):
399
+ try:
400
+ points_inside = self._points_inside(other, keep_labels=False, **fetch_kwargs)
401
+ except EmptyPointCloudError:
396
402
  return None # BrainStructure.intersects checks for not None
397
403
  if isinstance(other, point.Point): # preserve the type
398
404
  return points_inside[0]
@@ -423,15 +429,6 @@ class Volume(location.Location):
423
429
  except NoMapAvailableError:
424
430
  return None
425
431
 
426
- def transform(self, affine: np.ndarray, space=None):
427
- raise NotImplementedError("Volume transformation is not yet implemented.")
428
-
429
- def warp(self, space):
430
- if self.space.matches(space):
431
- return self
432
- else:
433
- raise SpaceWarpingFailedError('Warping of full volumes is not yet supported.')
434
-
435
432
  def fetch(
436
433
  self,
437
434
  format: str = None,
@@ -562,7 +559,7 @@ class Volume(location.Location):
562
559
  found by skimage.measure.label.
563
560
  """
564
561
  assert self.provides_image, NotImplementedError("Spatial properties can currently on be calculated for images.")
565
- img = self.fetch(format="image", **fetch_kwargs)
562
+ img = self.fetch(format=fetch_kwargs.pop("format", "image"), **fetch_kwargs)
566
563
  return ComponentSpatialProperties.compute_from_image(
567
564
  img=img,
568
565
  space=self.space,
@@ -596,7 +593,7 @@ class Volume(location.Location):
596
593
  samples.extend(list(pts[inside, :][choice, :]))
597
594
  if len(samples) > N:
598
595
  break
599
- voxels = pointset.PointSet(
596
+ voxels = pointcloud.PointCloud(
600
597
  np.random.permutation(samples)[:N, :],
601
598
  space=None
602
599
  )
@@ -617,11 +614,96 @@ class Volume(location.Location):
617
614
  img = self.fetch(**kwargs)
618
615
  array = np.asanyarray(img.dataobj)
619
616
  voxels = skimage_feature.peak_local_max(array, min_distance=mindist)
620
- points = pointset.PointSet(voxels, space=None, labels=list(range(len(voxels)))).transform(img.affine, space=self.space)
617
+ points = pointcloud.PointCloud(voxels, space=None, labels=list(range(len(voxels)))).transform(img.affine, space=self.space)
621
618
  points.sigma_mm = [sigma_mm for _ in points]
622
619
  return points
623
620
 
624
621
 
622
+ class FilteredVolume(Volume):
623
+
624
+ def __init__(
625
+ self,
626
+ parent_volume: Volume,
627
+ label: int = None,
628
+ fragment: str = None,
629
+ threshold: float = None,
630
+ ):
631
+ """
632
+ A prescribed Volume to fetch specified label and fragment.
633
+ If threshold is defined, a mask of the values above the threshold.
634
+
635
+ Parameters
636
+ ----------
637
+ parent_volume : Volume
638
+ label : int, default: None
639
+ Get the mask of value equal to label.
640
+ fragment : str, default None
641
+ If a volume is fragmented, get a specified one.
642
+ threshold : float, default None
643
+ Provide a float value to threshold the image.
644
+ """
645
+ name = parent_volume.name
646
+ if label:
647
+ name += f" - label: {label}"
648
+ if fragment:
649
+ name += f" - fragment: {fragment}"
650
+ if threshold:
651
+ name += f" - threshold: {threshold}"
652
+ Volume.__init__(
653
+ self,
654
+ space_spec=parent_volume._space_spec,
655
+ providers=list(parent_volume._providers.values()),
656
+ name=name
657
+ )
658
+ self.fragment = fragment
659
+ self.label = label
660
+ self.threshold = threshold
661
+
662
+ def fetch(
663
+ self,
664
+ format: str = None,
665
+ **kwargs
666
+ ):
667
+ if "fragment" in kwargs:
668
+ assert kwargs.get("fragment") == self.fragment, f"This is a filtered volume that can only fetch fragment '{self.fragment}'."
669
+ else:
670
+ kwargs["fragment"] = self.fragment
671
+ if "label" in kwargs:
672
+ assert kwargs.get("label") == self.label, f"This is a filtered volume that can only fetch label '{self.label}' only."
673
+ else:
674
+ kwargs["label"] = self.label
675
+
676
+ result = super().fetch(format=format, **kwargs)
677
+
678
+ if self.threshold is not None:
679
+ assert self.label is None
680
+ if not isinstance(result, Nifti1Image):
681
+ raise NotImplementedError("Cannot threshold meshes.")
682
+ imgdata = np.asanyarray(result.dataobj)
683
+ return Nifti1Image(
684
+ dataobj=(imgdata > self.threshold).astype("uint8"),
685
+ affine=result.affine,
686
+ dtype="uint8"
687
+ )
688
+
689
+ return result
690
+
691
+ def get_boundingbox(
692
+ self,
693
+ clip: bool = True,
694
+ background: float = 0.0,
695
+ **fetch_kwargs
696
+ ) -> "boundingbox.BoundingBox":
697
+ # NOTE: since some providers enable different simpllified ways to create a
698
+ # bounding box without fetching the image, the correct kwargs must be
699
+ # forwarded since FilteredVolumes enforce their specs to be fetched.
700
+ return super().get_boundingbox(
701
+ clip=clip,
702
+ background=background,
703
+ **fetch_kwargs
704
+ )
705
+
706
+
625
707
  class Subvolume(Volume):
626
708
  """
627
709
  Wrapper class for exposing a z level of a 4D volume to be used like a 3D volume.
@@ -634,7 +716,8 @@ class Subvolume(Volume):
634
716
  providers=[
635
717
  _provider.SubvolumeProvider(p, z=z)
636
718
  for p in parent_volume._providers.values()
637
- ]
719
+ ],
720
+ name=parent_volume.name + f" - z: {z}"
638
721
  )
639
722
 
640
723
 
@@ -682,8 +765,8 @@ def from_array(
682
765
  )
683
766
 
684
767
 
685
- def from_pointset(
686
- points: pointset.PointSet,
768
+ def from_pointcloud(
769
+ points: pointcloud.PointCloud,
687
770
  label: int = None,
688
771
  target: Volume = None,
689
772
  normalize=True,
@@ -695,7 +778,7 @@ def from_pointset(
695
778
 
696
779
  Parameters
697
780
  ----------
698
- points: pointset.PointSet
781
+ points: pointcloud.PointCloud
699
782
  label: int, default: None
700
783
  If None, finds the KDE for all points. Otherwise, selects the points
701
784
  labelled with this integer value.
@@ -727,11 +810,11 @@ def from_pointset(
727
810
  )
728
811
  voxelcount_img[tuple(unique_coords.T)] = counts
729
812
 
730
- # TODO: consider how to handle pointsets with varied sigma_mm
813
+ # TODO: consider how to handle pointclouds with varied sigma_mm
731
814
  sigmas = np.array(points.sigma_mm)[selection]
732
815
  bandwidth = np.mean(sigmas)
733
816
  if len(np.unique(sigmas)) > 1:
734
- logger.warning(f"KDE of pointset uses average bandwith {bandwidth} instead of the points' individual sigmas.")
817
+ logger.warning(f"KDE of pointcloud uses average bandwith {bandwidth} instead of the points' individual sigmas.")
735
818
 
736
819
  filtered_arr = filters.gaussian(voxelcount_img, bandwidth)
737
820
  if normalize:
@@ -747,7 +830,7 @@ def from_pointset(
747
830
 
748
831
  def merge(volumes: List[Volume], labels: List[int] = [], **fetch_kwargs) -> Volume:
749
832
  """
750
- Merge a list of volumes in the same space into a single volume.
833
+ Merge a list of nifti volumes in the same space into a single volume.
751
834
 
752
835
  Note
753
836
  ----
@@ -775,8 +858,14 @@ def merge(volumes: List[Volume], labels: List[int] = [], **fetch_kwargs) -> Volu
775
858
  space = volumes[0].space
776
859
  assert all(v.space == space for v in volumes), "Cannot merge volumes from different spaces."
777
860
 
861
+ if len(labels) > 0:
862
+ dtype = 'int32'
863
+ elif FilteredVolume in {type(v) for v in volumes}:
864
+ dtype = 'uint8'
865
+ else:
866
+ dtype = volumes[0].fetch().dataobj.dtype
778
867
  template_img = space.get_template().fetch(**fetch_kwargs)
779
- merged_array = np.zeros(template_img.shape, dtype='uint8')
868
+ merged_array = np.zeros(template_img.shape, dtype=dtype)
780
869
 
781
870
  for i, vol in siibra_tqdm(
782
871
  enumerate(volumes),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: siibra
3
- Version: 1.0a19
3
+ Version: 1.0.1a0
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)
@@ -24,9 +24,9 @@ Requires-Dist: scikit-image
24
24
  Requires-Dist: requests
25
25
  Requires-Dist: neuroglancer-scripts
26
26
  Requires-Dist: nilearn
27
+ Requires-Dist: typing-extensions; python_version < "3.8"
27
28
  Requires-Dist: filelock
28
29
  Requires-Dist: ebrains-drive>=0.6.0
29
- Requires-Dist: typing-extensions; python_version < "3.8"
30
30
 
31
31
  |License| |PyPI version| |doi| |Python versions| |Documentation Status|
32
32
 
@@ -34,7 +34,7 @@ Requires-Dist: typing-extensions; python_version < "3.8"
34
34
  siibra - Software interface for interacting with brain atlases
35
35
  ==============================================================
36
36
 
37
- Copyright 2020-2023, Forschungszentrum Jülich GmbH
37
+ Copyright 2020-2024, Forschungszentrum Jülich GmbH
38
38
 
39
39
  *Authors: Big Data Analytics Group, Institute of Neuroscience and
40
40
  Medicine (INM-1), Forschungszentrum Jülich GmbH*
@@ -145,3 +145,16 @@ https://doi.org/10.5281/zenodo.7885728`.
145
145
  :target: https://siibra-python.readthedocs.io/en/latest/?badge=latest
146
146
  .. |doi| image:: https://zenodo.org/badge/DOI/10.5281/zenodo.7885728.svg
147
147
  :target: https://doi.org/10.5281/zenodo.7885728
148
+
149
+
150
+ Versioning
151
+ ==========
152
+ Given a version number MAJOR.MINOR.PATCH, increments imply:
153
+ - MAJOR: incompatible API changes
154
+ - MINOR: a functionality in a backward compatible manner is added
155
+ - PATCH: backward compatible bug fixes and new configuration added such as new maps or features
156
+
157
+ Pre-release
158
+ -----------
159
+ For x.y.z, a full release,
160
+ - `x.y.z-alpha.t` is the development prerelease. By changing `t`, different siibra-configurations are targeted.
@@ -1,32 +1,32 @@
1
- siibra/VERSION,sha256=Cdi0wzpL8NlKlp0VzB6oQx8xWmnEYrmKnDfIy1W6r5g,7
2
- siibra/__init__.py,sha256=78LtIsJ1EzoYT-yIRednOec9JpC99g9orUqvhyHrztE,4724
3
- siibra/commons.py,sha256=Hp4_5Ri2Ze9CqEKpuIeqPmC74RFlkJcK8jmMGOHGZoU,28880
4
- siibra/exceptions.py,sha256=rpXOjNapL4RHx97XmERwlTMgCpB8YCL08snOi700Jgg,1218
1
+ siibra/VERSION,sha256=obkBMWS4uPgy0Q8o6UWN0GqfjWFwM9_DzViNq5cAX98,14
2
+ siibra/__init__.py,sha256=odym0KtWXn55LqBXZDRgXCzSd5daKXrC0D6lSeYi3po,4715
3
+ siibra/commons.py,sha256=L0tEiZycG0GyDo-KxTeEs8abfTZC98VR_xsDRDdWWNQ,27561
4
+ siibra/exceptions.py,sha256=ruU9IGFBqD52mXUryBF41uE6mDV3kabfSAzUunhCWR8,1319
5
5
  siibra/configuration/__init__.py,sha256=Kp00hs44rVSU5OPuZ26KFJpd6HXtMocEiLiZihdvav4,752
6
6
  siibra/configuration/configuration.py,sha256=um31WGN0Ozl-3v5bUYECkJEJ5GMrEnrJO3_syUXgzFc,7263
7
- siibra/configuration/factory.py,sha256=2DVqEg5WB4tEZYWN6xoQXjw41ipmiPQ8zNeeR35Rysw,23044
7
+ siibra/configuration/factory.py,sha256=8PoPydqc_4csKF8f-E7Un1QnQ0yKDRgYyO1jbVhKeQU,22627
8
8
  siibra/core/__init__.py,sha256=907tEZ3HxZSZqqhv0md3Sk8t9iy0-aWtbuo1G1oxN_w,735
9
9
  siibra/core/assignment.py,sha256=9g2lLOj_ftuS623ZlVauTTLtJGAvDfE10wknJXJA7m4,3819
10
- siibra/core/atlas.py,sha256=mYV1MaBBk-zQuUNWvXHfK5bseD7CT9kxSFMODeKAeUg,8331
10
+ siibra/core/atlas.py,sha256=BNp96YZ3s6f5MrnuEWL8OktFtM528Dj9Zv6e9FbOAyg,8549
11
11
  siibra/core/concept.py,sha256=cmWR2PFdWR3pdVa0NSOiPC-EWl0i_WBjyF3JjKt74gc,10889
12
- siibra/core/parcellation.py,sha256=k_n-yCf0Bo7Zw-xrqtZevpZvWEz8Day1Kg2cCXJrFvk,14005
13
- siibra/core/region.py,sha256=k4vk1Zc1phyR-iGN1Z7Y8GcuWQdHWP17oyWs61Mt3AE,43575
12
+ siibra/core/parcellation.py,sha256=AF7yODxdhZZymFNzQdaL2qzSDwkgsogPs74e603Zl_Q,14506
13
+ siibra/core/region.py,sha256=6UDx31FmFYtFQJs5Z0fbpQ2yT9MCh4QCCANIa5GxTXQ,43423
14
14
  siibra/core/space.py,sha256=0v_7aERZcVNPJmbr_LbeLRkbJj8TGaTrbqnXzr-I5Jg,4586
15
15
  siibra/core/structure.py,sha256=eHvCRBZEDjTI8xc2UmSgt26ujgDxHTLai8NoGmeUU64,4497
16
16
  siibra/experimental/__init__.py,sha256=s4bEYpMO4Ox-Xlx3FdnRUNKYs0mTHz5Hu4VnfNXpgxU,791
17
- siibra/experimental/contour.py,sha256=z4-gVvTLcoB-faozy42u3Y-gI9q_rZ0F6qdFJmIbqbQ,2436
17
+ siibra/experimental/contour.py,sha256=uZOltesITk5t7EbohZtqA8gJRc3UuiqpJdJQhFP1gXo,2454
18
18
  siibra/experimental/cortical_profile_sampler.py,sha256=JsX0FCJqvozdhWuayYJ-r3kHNsgSUfA00O9D0X6D7Rg,2086
19
- siibra/experimental/patch.py,sha256=Gp9qm1ToSdv8pTmCYuiPfjcWxo1G675QGAINQH0iCCQ,3803
20
- siibra/experimental/plane3d.py,sha256=Z1MnK3qjGvYLGgNcAimgCejBhAOzcwfF8cYyajTLrAo,10827
19
+ siibra/experimental/patch.py,sha256=0VKVU7F7xMBr1hwtL-Z4K-_1XKw88WImPG4fWaiH5bw,3809
20
+ siibra/experimental/plane3d.py,sha256=XgmNemO9peDRDtHE_8joqroGpjCKI5H_vzyIFXDh434,10853
21
21
  siibra/explorer/__init__.py,sha256=ZEBJlKs3r5tFWWoKvfrASb1M031FPwSVeysaktUnhbQ,781
22
22
  siibra/explorer/url.py,sha256=1UWJyt18gMKTXuixfO8P1Xa5SJDUUagollow67VYT20,7068
23
23
  siibra/explorer/util.py,sha256=lAy1pd-ym90H-BZx2X8GMT3qJIsRTgGCz6tW3t1duig,2083
24
24
  siibra/features/__init__.py,sha256=NMmDmfrzscV-RHHZMoyjlH_bYfjNhGDX72dQ6-JCYXg,3970
25
- siibra/features/anchor.py,sha256=5a7eaUXi2yLfIW7cgpsgDCw7Oa2hD6f_cF2Qy4l-lFw,9068
26
- siibra/features/feature.py,sha256=zrMEYBT4RTYSKIOj4uWXRryqAbJbA5PDtsLXe8lVoyw,35395
25
+ siibra/features/anchor.py,sha256=FfeMfJxwApFE0iWo2RJj5_XFr0L5gF76V4ZxaPL2VUc,9130
26
+ siibra/features/feature.py,sha256=ls1E7BjRdPOkbtwzU-d01lwTRA_33IlzB44-tL0tg2g,35194
27
27
  siibra/features/connectivity/__init__.py,sha256=A7fcXqlAtfFmuymfyOl7A7ecaP8nqIBPFaM76qwh4HA,1161
28
28
  siibra/features/connectivity/functional_connectivity.py,sha256=3UiPpHfbYAOBwMn7TI79wy1fR9lWwI3ePMSRVziJONw,2122
29
- siibra/features/connectivity/regional_connectivity.py,sha256=6_5MUfhGDrTDvPgDcvyVQjU1hML6mEp3LqcY_HtxrYw,18281
29
+ siibra/features/connectivity/regional_connectivity.py,sha256=13uZ-TJBv_J3J-6KuJcKmJMKf7yWy21pzdsyvcWkWXg,18287
30
30
  siibra/features/connectivity/streamline_counts.py,sha256=OBOQblhsqnfsvf2kdySRAoWxGsFi4Ulr2PNT9wOu1Ls,1064
31
31
  siibra/features/connectivity/streamline_lengths.py,sha256=B9D6Y7szMRCuHRwisAorgTJfkq-1aTNB08H_HVZHpJs,1067
32
32
  siibra/features/connectivity/tracing_connectivity.py,sha256=JehDrEEeYl_i-T81AE_AnamlKfzHkZ3nbheRAybFn24,1083
@@ -37,48 +37,48 @@ siibra/features/image/image.py,sha256=QtFtXBt4rRkFq6AHeUOaQSCOjgBygIJ7lhz1gjsQ4c
37
37
  siibra/features/image/sections.py,sha256=oQparLp7Nj5dLBvUAs09rgnSgAxH86wN1SMmwkit0S0,961
38
38
  siibra/features/image/volume_of_interest.py,sha256=FuYxt-r6YOWN4tLaaZPL3_GAvX_WcZz3jRHxEnWySnQ,2654
39
39
  siibra/features/tabular/__init__.py,sha256=sldsgKiwpGOk5PvntIO16lJlWiTy68qVI_pLhepqbdI,1176
40
- siibra/features/tabular/bigbrain_intensity_profile.py,sha256=h4f78waLed4SfqipIvRUtW7sbZmSVw9VG1DzYopzR-o,2706
41
- siibra/features/tabular/cell_density_profile.py,sha256=AGNIrHsmwPMQ0yRM6hsMhieS7T9fAKaZI5DHGsmff9M,9360
40
+ siibra/features/tabular/bigbrain_intensity_profile.py,sha256=noXtsmQjW75epnpfHex0VAbvz7QLwvlkTn_PLSwASIQ,2708
41
+ siibra/features/tabular/cell_density_profile.py,sha256=W1GtrOCacankczxpkz2V3n9zJyf2WCW3W_BpYrEc6yk,10820
42
42
  siibra/features/tabular/cortical_profile.py,sha256=I3MFsytAjvi6A2GaMhgXnF9-94LnAScIo_GR-HMEAv0,12540
43
43
  siibra/features/tabular/gene_expression.py,sha256=GbXmsdHCz8eFErTLUd6DXhQaeObftrwl9aIEgzlEdXA,9827
44
44
  siibra/features/tabular/layerwise_bigbrain_intensities.py,sha256=GIYjX7_Bfs7ywhJBkXd878BZGSiaKUV0BhILr-6D4zc,2117
45
- siibra/features/tabular/layerwise_cell_density.py,sha256=IiGM1D9YPxwEu-bCgi-voDjyjXt4jdQKnOSHCxjHt7E,4280
45
+ siibra/features/tabular/layerwise_cell_density.py,sha256=V8c16KdBACUYFxMYh1T9tdlXs_V67iFAZqlYx7y_4RY,3783
46
46
  siibra/features/tabular/receptor_density_fingerprint.py,sha256=GudVpZ2wWF1yGsDFKz4AEU761qA45rItLOwHYpY4Zcs,7299
47
47
  siibra/features/tabular/receptor_density_profile.py,sha256=ZYgL-3WxevVFtmEQSbR8Ot24VCMg5xzfXYEPBH1oM6k,3725
48
- siibra/features/tabular/regional_timeseries_activity.py,sha256=Y1R6w8ddHqzNEUISqcSZmhvwWssndIyiFnjI7MmDrcI,10020
48
+ siibra/features/tabular/regional_timeseries_activity.py,sha256=vfoEIu92l3wVdUbdnNqZ5nr9oBuahOrIGS5xhA8cW7s,10026
49
49
  siibra/features/tabular/tabular.py,sha256=NoNexdPJ3nhSsztWdWnnIHcX6PakcjEAOV-f9azqa-s,5323
50
50
  siibra/livequeries/__init__.py,sha256=yZ2bFYizwF_Z3F9VLNI95IrHcmSO5lqfFML_juifVHs,875
51
- siibra/livequeries/allen.py,sha256=p1dMBpR_NHpQmR8eP5k_YBnxdaJi11cyoocFRDYiyDo,13733
52
- siibra/livequeries/bigbrain.py,sha256=jisDJwfMhyO_JvE3ZHV__zZY_Ap9snhximF5-N3S7G8,8339
51
+ siibra/livequeries/allen.py,sha256=2jj1gMr9mZFaOfRSf9lPzrcRLAoAMuWjvT_N3_KUkHI,14809
52
+ siibra/livequeries/bigbrain.py,sha256=V7yRQIx6VLIkA9fwW6PfEw7kSkrwp3oE_-WYXe3bjMk,8365
53
53
  siibra/livequeries/ebrains.py,sha256=nAIhyPlVeRPNmmMKkGATUSDRoGK7aAg8zOGEKuS-z_w,5820
54
- siibra/livequeries/query.py,sha256=Nn-uzizbr_7qecy08n2pyH4i5VvfMKnsYfLT0BHGzoE,1862
55
- siibra/locations/__init__.py,sha256=TPbjufNb7DhCdEnFVo9X8h1paPOTRhTj1hVqn1g9QZM,3316
56
- siibra/locations/boundingbox.py,sha256=eacbu1sftD7QH4rhbwYMimaFaFNLyH0niB77eTnk7B4,16265
54
+ siibra/livequeries/query.py,sha256=Yh24vRdcSYBTNx61sMoRCyXyNZ7TX1iqoiJ8fxOJ3V8,1849
55
+ siibra/locations/__init__.py,sha256=q97HYl9mdBWNuQKvgh1Wi0eAz1TlG_dLSIxpyJuHCZo,3342
56
+ siibra/locations/boundingbox.py,sha256=pdLZNyxUD-WvGHNYOvuqZtputCd5tPOxLYTvH6oBBNg,16492
57
57
  siibra/locations/location.py,sha256=Taw7oUIFBdXTE8C3b2vbGicPusJlad_KI1wW6iLL324,4361
58
- siibra/locations/point.py,sha256=fRmWD2_-AKkTX5xR0Z3RyxCN8hCYod_VhlUVcTepZ1U,12851
59
- siibra/locations/pointset.py,sha256=jqqOGuazc5KJqmU4GKfWAEIQomm2ZhvbJHbBMZVVuyM,12023
58
+ siibra/locations/point.py,sha256=wmtH0Isx1-bsk3TfNxXHFcYUmbsQXBt34l8LpFWxhHU,12863
59
+ siibra/locations/pointcloud.py,sha256=61sUvXw5dtKouNKinQNwgGOFd7iwgJLf4D4zYNWo7Js,12474
60
60
  siibra/retrieval/__init__.py,sha256=bgoasCN6LFDlKVFCJC0q4kfGMZCsxt_NVCcJ5qy0sIo,1062
61
61
  siibra/retrieval/cache.py,sha256=kVB-hYtvQIQmlCozKlYJPaQxgtCKWOS3jB2qqefCVNc,7832
62
62
  siibra/retrieval/datasets.py,sha256=Hjai2cSFK1WoMgXp4uMJWBUqlO_APLQ_iDQ__8EpKEI,11031
63
- siibra/retrieval/repositories.py,sha256=Mv49X9qdZ3fg0fN2wKiDhpES4VWH9-rXD7G01O8D5Sk,30443
64
- siibra/retrieval/requests.py,sha256=08HdVMRuWwQsyqs8XslMBdSLZTLDNQlBQDxy3JCHJcU,22540
63
+ siibra/retrieval/repositories.py,sha256=L-JrEuKF6Xq7sEIdJ3iPFQPWaf5CiHMt96X1zi-gOVM,29936
64
+ siibra/retrieval/requests.py,sha256=oup12LGw-MnSc7c3IwlX9Z5TrVXzCCRfGZFLLLR4jAs,23069
65
65
  siibra/retrieval/exceptions/__init__.py,sha256=CEY_n-Eh0_EBXYHDPxmIXzO6C_Km0WQFvENAMvRXmYg,875
66
66
  siibra/vocabularies/__init__.py,sha256=Qn_xBKrFhla7d_PjDgN6gX4gxroeSRP3ntBZ6gNnvtE,1288
67
67
  siibra/vocabularies/gene_names.json,sha256=i-gnh753GyZtQfX_dWibNYr_d5ccDPHooOwsdeKUYqE,1647972
68
68
  siibra/vocabularies/receptor_symbols.json,sha256=F6DZIArPCBmJV_lWGV-zDpBBH_GOJOZm67LBE4qzMa4,5722
69
69
  siibra/vocabularies/region_aliases.json,sha256=T2w1wRlxPNTsPppXn0bzC70tNsb8mOjLsoHuxDSYm2w,8563
70
- siibra/volumes/__init__.py,sha256=pxykhkXig_D8Co_3zy6CiXt3hE5hUKdX8Oxxr61dhbE,933
71
- siibra/volumes/parcellationmap.py,sha256=ZW166ftPB5RrqJ5ewa7EXoCFMIKfbccGtLiWEW9SxV4,49418
72
- siibra/volumes/sparsemap.py,sha256=IVAmqOrYoaEz7sRZ3tXJMq-afCW7CmIcATeALg22wtw,22394
73
- siibra/volumes/volume.py,sha256=Lmk9sy6XGtsT9FxMShMn11E1vlRbElwXmp4kxOHJEhs,29493
70
+ siibra/volumes/__init__.py,sha256=j7h6WNQk2juIyxs2OlruWj5VcKxsy1g-wD2Q05rM-wM,935
71
+ siibra/volumes/parcellationmap.py,sha256=lgqVjwHdmjmKj_2PguAH4jda3dc-L0p0QzfQ9emPJRg,49774
72
+ siibra/volumes/sparsemap.py,sha256=ZHkHh7NNEPZzRE2-XGWWPRaVVL2V4voYYzYdZ7RCxRg,17437
73
+ siibra/volumes/volume.py,sha256=-ULibtP5MCy0a3tHqbeFweIUP7sLZGuhj6eW558BRlM,32619
74
74
  siibra/volumes/providers/__init__.py,sha256=0uDbnsjlAHnxoSdFghzYfhtjVki9721hi7Sp1P6GjNY,934
75
75
  siibra/volumes/providers/freesurfer.py,sha256=LxPHbfVJLXkP4WVXCYhsildRUZUvzgv6jJOWeNLavw8,4893
76
76
  siibra/volumes/providers/gifti.py,sha256=mPVFkBFnwbCbMks_ysuNbhe0Pj5ndxONPmq-Xr-ir3w,6231
77
- siibra/volumes/providers/neuroglancer.py,sha256=sfFwOALQ2w3bizYhmMLAic21JEmE7CdObIuOiBxGYW0,27919
78
- siibra/volumes/providers/nifti.py,sha256=xxm09bLowhDzPSUjg5FbXNLNh7QoVKEEEWfVDbKtuuQ,10749
77
+ siibra/volumes/providers/neuroglancer.py,sha256=JH8z6jb7u6nkqtNR3ZFYPrtwexAS6z68pesrLA2lYrk,28712
78
+ siibra/volumes/providers/nifti.py,sha256=AXhWvbt78uEvIT6Z8ABWZ6k0zYUEWZKniSxfLAqDE3k,10135
79
79
  siibra/volumes/providers/provider.py,sha256=jxhOGHrSEeBgN0tAi7p8ju3twtUkhkjrk-e-3-chtxI,3695
80
- siibra-1.0a19.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
81
- siibra-1.0a19.dist-info/METADATA,sha256=TJwoEzv1-eVN1-C254lHcW8T4dasmnGkEkmmZROeO-c,8430
82
- siibra-1.0a19.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
83
- siibra-1.0a19.dist-info/top_level.txt,sha256=NF0OSGLL0li2qyC7MaU0iBB5Y9S09_euPpvisD0-8Hg,7
84
- siibra-1.0a19.dist-info/RECORD,,
80
+ siibra-1.0.1a0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
81
+ siibra-1.0.1a0.dist-info/METADATA,sha256=jY1qR1aP2er68Kb1URFJ-bE4i8ZXYj8wlLviXdlkxlI,8884
82
+ siibra-1.0.1a0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
83
+ siibra-1.0.1a0.dist-info/top_level.txt,sha256=NF0OSGLL0li2qyC7MaU0iBB5Y9S09_euPpvisD0-8Hg,7
84
+ siibra-1.0.1a0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.5.0)
2
+ Generator: setuptools (75.6.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5