bluecellulab 2.6.66__tar.gz → 2.6.67__tar.gz

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 bluecellulab might be problematic. Click here for more details.

Files changed (116) hide show
  1. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/PKG-INFO +3 -1
  2. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/cell/core.py +81 -9
  3. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/tools.py +105 -0
  4. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab.egg-info/PKG-INFO +3 -1
  5. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab.egg-info/requires.txt +3 -0
  6. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/pyproject.toml +5 -0
  7. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/tox.ini +1 -0
  8. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/.compile_mod.sh +0 -0
  9. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/.gitattributes +0 -0
  10. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/.github/dependabot.yml +0 -0
  11. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/.github/workflows/release.yml +0 -0
  12. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/.github/workflows/test.yml +0 -0
  13. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/.gitignore +0 -0
  14. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/.gitlab-ci.yml +0 -0
  15. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/.readthedocs.yml +0 -0
  16. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/.zenodo.json +0 -0
  17. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/AUTHORS.txt +0 -0
  18. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/CHANGELOG.rst +0 -0
  19. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/CITATION.cff +0 -0
  20. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/CONTRIBUTING.rst +0 -0
  21. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/LICENSE +0 -0
  22. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/MANIFEST.in +0 -0
  23. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/Makefile +0 -0
  24. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/README.rst +0 -0
  25. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/__init__.py +0 -0
  26. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/analysis/__init__.py +0 -0
  27. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/analysis/analysis.py +0 -0
  28. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/analysis/inject_sequence.py +0 -0
  29. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/analysis/plotting.py +0 -0
  30. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/analysis/utils.py +0 -0
  31. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/cell/__init__.py +0 -0
  32. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/cell/ballstick/__init__.py +0 -0
  33. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/cell/ballstick/emodel.hoc +0 -0
  34. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/cell/ballstick/morphology.asc +0 -0
  35. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/cell/cell_dict.py +0 -0
  36. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/cell/injector.py +0 -0
  37. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/cell/plotting.py +0 -0
  38. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/cell/random.py +0 -0
  39. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/cell/recording.py +0 -0
  40. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/cell/section_distance.py +0 -0
  41. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/cell/serialized_sections.py +0 -0
  42. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/cell/sonata_proxy.py +0 -0
  43. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/cell/stimuli_generator.py +0 -0
  44. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/cell/template.py +0 -0
  45. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/circuit/__init__.py +0 -0
  46. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/circuit/circuit_access/__init__.py +0 -0
  47. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/circuit/circuit_access/bluepy_circuit_access.py +0 -0
  48. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/circuit/circuit_access/definition.py +0 -0
  49. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/circuit/circuit_access/sonata_circuit_access.py +0 -0
  50. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/circuit/config/__init__.py +0 -0
  51. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/circuit/config/bluepy_simulation_config.py +0 -0
  52. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/circuit/config/definition.py +0 -0
  53. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/circuit/config/sections.py +0 -0
  54. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/circuit/config/sonata_simulation_config.py +0 -0
  55. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/circuit/format.py +0 -0
  56. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/circuit/iotools.py +0 -0
  57. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/circuit/node_id.py +0 -0
  58. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/circuit/simulation_access.py +0 -0
  59. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/circuit/synapse_properties.py +0 -0
  60. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/circuit/validate.py +0 -0
  61. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/circuit_simulation.py +0 -0
  62. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/connection.py +0 -0
  63. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/dendrogram.py +0 -0
  64. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/exceptions.py +0 -0
  65. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/graph.py +0 -0
  66. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/hoc/Cell.hoc +0 -0
  67. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/hoc/RNGSettings.hoc +0 -0
  68. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/hoc/TDistFunc.hoc +0 -0
  69. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/hoc/TStim.hoc +0 -0
  70. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/hoc/fileUtils.hoc +0 -0
  71. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/importer.py +0 -0
  72. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/neuron_interpreter.py +0 -0
  73. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/plotwindow.py +0 -0
  74. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/psection.py +0 -0
  75. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/psegment.py +0 -0
  76. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/reports/__init__.py +0 -0
  77. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/reports/manager.py +0 -0
  78. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/reports/utils.py +0 -0
  79. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/reports/writers/__init__.py +0 -0
  80. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/reports/writers/base_writer.py +0 -0
  81. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/reports/writers/compartment.py +0 -0
  82. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/reports/writers/spikes.py +0 -0
  83. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/rngsettings.py +0 -0
  84. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/simulation/__init__.py +0 -0
  85. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/simulation/neuron_globals.py +0 -0
  86. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/simulation/parallel.py +0 -0
  87. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/simulation/report.py +0 -0
  88. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/simulation/simulation.py +0 -0
  89. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/stimulus/__init__.py +0 -0
  90. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/stimulus/circuit_stimulus_definitions.py +0 -0
  91. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/stimulus/factory.py +0 -0
  92. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/stimulus/stimulus.py +0 -0
  93. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/synapse/__init__.py +0 -0
  94. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/synapse/synapse_factory.py +0 -0
  95. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/synapse/synapse_types.py +0 -0
  96. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/type_aliases.py +0 -0
  97. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/utils.py +0 -0
  98. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/validation/validation.py +0 -0
  99. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab/verbosity.py +0 -0
  100. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab.egg-info/SOURCES.txt +0 -0
  101. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab.egg-info/dependency_links.txt +0 -0
  102. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/bluecellulab.egg-info/top_level.txt +0 -0
  103. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/docs/Makefile +0 -0
  104. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/docs/images/voltage-readme.png +0 -0
  105. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/docs/make.bat +0 -0
  106. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/docs/requirements_docs.txt +0 -0
  107. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/docs/source/_static/.gitkeep +0 -0
  108. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/docs/source/api.rst +0 -0
  109. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/docs/source/changelog.rst +0 -0
  110. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/docs/source/compiling-mechanisms.rst +0 -0
  111. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/docs/source/conf.py +0 -0
  112. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/docs/source/contributing.rst +0 -0
  113. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/docs/source/index.rst +0 -0
  114. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/docs/source/list_of_stim.rst +0 -0
  115. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/docs/source/logo/BlueCelluLabBanner.jpg +0 -0
  116. {bluecellulab-2.6.66 → bluecellulab-2.6.67}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bluecellulab
3
- Version: 2.6.66
3
+ Version: 2.6.67
4
4
  Summary: Biologically detailed neural network simulations and analysis.
5
5
  Author: Blue Brain Project, EPFL
6
6
  License: Apache2.0
@@ -28,6 +28,8 @@ Requires-Dist: typing-extensions>=4.8.0
28
28
  Requires-Dist: networkx>=3.1
29
29
  Requires-Dist: h5py>=3.8.0
30
30
  Requires-Dist: seaborn
31
+ Provides-Extra: examples
32
+ Requires-Dist: ipywidgets; extra == "examples"
31
33
  Dynamic: license-file
32
34
 
33
35
  |banner|
@@ -316,6 +316,7 @@ class Cell(InjectableMixin, PlottableMixin):
316
316
  """Adds recording to AIS."""
317
317
  self.add_recording("self.axonal[1](0.5)._ref_v", dt=dt)
318
318
 
319
+ @deprecated("Use add_variable_recording('v', ...) instead.")
319
320
  def add_voltage_recording(
320
321
  self, section: Optional[NeuronSection] = None, segx: float = 0.5, dt: Optional[float] = None
321
322
  ) -> None:
@@ -334,6 +335,7 @@ class Cell(InjectableMixin, PlottableMixin):
334
335
  var_name = section_to_voltage_recording_str(section, segx)
335
336
  self.add_recording(var_name, dt)
336
337
 
338
+ @deprecated("Use get_variable_recording('v', ...) instead.")
337
339
  def get_voltage_recording(
338
340
  self, section: Optional[NeuronSection] = None, segx: float = 0.5
339
341
  ) -> np.ndarray:
@@ -760,17 +762,66 @@ class Cell(InjectableMixin, PlottableMixin):
760
762
  """Get a vector of AIS voltage."""
761
763
  return self.get_recording('self.axonal[1](0.5)._ref_v')
762
764
 
763
- def add_variable_recording(self, variable: str, section, segx):
764
- if variable == "v":
765
- self.add_voltage_recording(section, segx)
766
- else:
767
- raise ValueError(f"Unsupported variable for recording: {variable}")
765
+ def add_variable_recording(
766
+ self,
767
+ variable: str,
768
+ section: Optional[NeuronSection] = None,
769
+ segx: float = 0.5,
770
+ dt: Optional[float] = None
771
+ ) -> None:
772
+ """Add a recording of any NEURON RANGE variable (e.g., gna, gk, ina)
773
+ from a given section and segment.
768
774
 
769
- def get_variable_recording(self, variable: str, section, segx) -> np.ndarray:
770
- if variable == "v":
771
- return self.get_voltage_recording(section=section, segx=segx)
775
+ Args:
776
+ variable: The NEURON variable name to record (e.g., "gna").
777
+ section: The section to record from (defaults to soma).
778
+ segx: Segment position between 0 and 1.
779
+ dt: Optional recording time step.
780
+ """
781
+
782
+ if section is None:
783
+ section = self.soma
784
+
785
+ # Optional: validate before constructing the string
786
+ seg = section(segx)
787
+ if "." in variable:
788
+ mech, var = variable.split(".", 1)
789
+ mobj = getattr(seg, mech, None)
790
+ if mobj is None or not hasattr(mobj, f"_ref_{var}"):
791
+ raise ValueError(
792
+ f"'{variable}' not recordable at {section.name()}({segx}). "
793
+ f"Mechanisms here: {list(section.psection()['density_mechs'].keys())}"
794
+ )
772
795
  else:
773
- raise ValueError(f"Unsupported variable '{variable}'")
796
+ if not hasattr(seg, f"_ref_{variable}"):
797
+ raise ValueError(
798
+ f"'{variable}' not recordable at {section.name()}({segx}). "
799
+ f"(Top-level vars are typically v/ina/ik/ica)"
800
+ )
801
+
802
+ var_name = section_to_variable_recording_str(section, segx, variable)
803
+ self.add_recording(var_name, dt)
804
+
805
+ def get_variable_recording(
806
+ self, variable: str, section: Optional[NeuronSection], segx: float
807
+ ) -> np.ndarray:
808
+ """Get a recording of any variable recorded from a section and segment.
809
+
810
+ Args:
811
+ variable: The name of the recorded variable (e.g., 'v', 'gna').
812
+ section: The NEURON section object.
813
+ segx: Segment location from 0 to 1.
814
+
815
+ Returns:
816
+ NumPy array of recorded values.
817
+
818
+ Raises:
819
+ ValueError: If the recording is not found.
820
+ """
821
+ if section is None:
822
+ section = self.soma
823
+ recording_name = section_to_variable_recording_str(section, segx, variable)
824
+ return self.get_recording(recording_name)
774
825
 
775
826
  @property
776
827
  def n_segments(self) -> int:
@@ -843,3 +894,24 @@ class Cell(InjectableMixin, PlottableMixin):
843
894
 
844
895
  def __del__(self):
845
896
  self.delete()
897
+
898
+
899
+ def section_to_variable_recording_str(section, segx: float, variable: str) -> str:
900
+ """Build an evaluable NEURON pointer string for `add_recording`.
901
+
902
+ Accepts:
903
+ - top-level vars: "v", "ina", "ik", ...
904
+ - mechanism-scoped vars: "kca.gkca", "na3.m", "na3.h", ...
905
+
906
+ Returns examples:
907
+ neuron.h.soma[0](0.5)._ref_v
908
+ neuron.h.soma[0](0.5)._ref_ina
909
+ neuron.h.soma[0](0.5).kca._ref_gkca
910
+ neuron.h.dend[3](0.7).na3._ref_m
911
+ """
912
+ sec_name = section.name()
913
+ if "." in variable:
914
+ mech, var = variable.split(".", 1)
915
+ return f"neuron.h.{sec_name}({segx}).{mech}._ref_{var}"
916
+ else:
917
+ return f"neuron.h.{sec_name}({segx})._ref_{variable}"
@@ -632,3 +632,108 @@ def compute_memodel_properties(
632
632
  )
633
633
 
634
634
  return {"holding_current": holding_current, "rheobase": rheobase, "rin": rin}
635
+
636
+
637
+ def list_segment_ion_variables(cell, xs=(0.5,)):
638
+ """Enumerate top-level ionic variables (e.g. v, ina, ik, gna) available for
639
+ each section at specified segment locations.
640
+
641
+ Includes:
642
+ - Membrane potential (v)
643
+ - Standard ionic currents (ina, ik, ica, icl)
644
+ - Reversal potentials (ena, ek, eca, ecl)
645
+ - Conductances if exposed (gna, gk, gca, gcl)
646
+ """
647
+ out = {}
648
+ for sec in cell.sections.values():
649
+ xmap = {}
650
+ for x in xs:
651
+ seg = sec(x)
652
+
653
+ vars_ = []
654
+ # voltage always there
655
+ if hasattr(seg, "_ref_v"):
656
+ vars_.append("v")
657
+
658
+ # ionic currents (present if mechanisms with ions are inserted)
659
+ for ion in ("na", "k", "ca", "cl"):
660
+ if hasattr(seg, f"_ref_i{ion}"):
661
+ vars_.append(f"i{ion}")
662
+ if hasattr(seg, f"_ref_e{ion}"):
663
+ vars_.append(f"e{ion}")
664
+ if hasattr(seg, f"_ref_g{ion}"):
665
+ vars_.append(f"g{ion}")
666
+
667
+ xmap[float(x)] = sorted(set(vars_))
668
+
669
+ out[sec.name()] = xmap
670
+ return out
671
+
672
+
673
+ def list_segment_mechanism_variables(cell, xs=(0.5,), include_point_mechs=False):
674
+ """Enumerate mechanism-scoped recordables per section/segment.
675
+
676
+ Returns:
677
+ dict: A nested dictionary of the form::
678
+
679
+ {
680
+ "<secname>": {
681
+ x: {
682
+ "mech": {
683
+ "<density_mech>": [<vars>],
684
+ ...
685
+ },
686
+ "point": {
687
+ "<point_mech>": [<vars>],
688
+ ...
689
+ } # present only if include_point_mechs
690
+ },
691
+ ...
692
+ },
693
+ ...
694
+ }
695
+ """
696
+ out = {}
697
+ for sec in cell.sections.values():
698
+ dens = sec.psection().get("density_mechs", {}) or {}
699
+ points = sec.psection().get("point_mechs", {}) or {}
700
+ xmap = {}
701
+
702
+ for x in xs:
703
+ seg = sec(x)
704
+
705
+ # Density mechanisms
706
+ mech_map = {}
707
+ for mech, vardict in dens.items():
708
+ mobj = getattr(seg, mech, None)
709
+ if mobj is None:
710
+ continue
711
+ # take var names advertised by psection(), keep those that are actually _ref_-exposed
712
+ vars_found = sorted(
713
+ v for v in vardict.keys()
714
+ if hasattr(mobj, f"_ref_{v}")
715
+ )
716
+ if vars_found:
717
+ mech_map[mech] = vars_found
718
+
719
+ entry = {"mech": mech_map}
720
+
721
+ # Point processes
722
+ if include_point_mechs:
723
+ pp_map = {}
724
+ for pp, vardict in points.items():
725
+ pobj = getattr(seg, pp, None)
726
+ if pobj is None:
727
+ continue
728
+ vars_found = sorted(
729
+ v for v in vardict.keys()
730
+ if hasattr(pobj, f"_ref_{v}")
731
+ )
732
+ if vars_found:
733
+ pp_map[pp] = vars_found
734
+ entry["point"] = pp_map
735
+
736
+ xmap[float(x)] = entry
737
+
738
+ out[sec.name()] = xmap
739
+ return out
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bluecellulab
3
- Version: 2.6.66
3
+ Version: 2.6.67
4
4
  Summary: Biologically detailed neural network simulations and analysis.
5
5
  Author: Blue Brain Project, EPFL
6
6
  License: Apache2.0
@@ -28,6 +28,8 @@ Requires-Dist: typing-extensions>=4.8.0
28
28
  Requires-Dist: networkx>=3.1
29
29
  Requires-Dist: h5py>=3.8.0
30
30
  Requires-Dist: seaborn
31
+ Provides-Extra: examples
32
+ Requires-Dist: ipywidgets; extra == "examples"
31
33
  Dynamic: license-file
32
34
 
33
35
  |banner|
@@ -8,3 +8,6 @@ typing-extensions>=4.8.0
8
8
  networkx>=3.1
9
9
  h5py>=3.8.0
10
10
  seaborn
11
+
12
+ [examples]
13
+ ipywidgets
@@ -41,6 +41,11 @@ dependencies = [
41
41
  ]
42
42
  requires-python = ">=3.9"
43
43
 
44
+ [project.optional-dependencies]
45
+ examples = [
46
+ "ipywidgets",
47
+ ]
48
+
44
49
  [project.urls]
45
50
  Homepage = "https://github.com/openbraininstitute/BlueCelluLab"
46
51
  Documentation = "https://bluecellulab.readthedocs.io/"
@@ -50,6 +50,7 @@ commands =
50
50
 
51
51
  [testenv:examples]
52
52
  envdir={toxworkdir}/{envname}
53
+ extras = examples
53
54
  deps =
54
55
  pytest>=7.3.1,<9.0.0
55
56
  pytest-xdist>=3.3.1 # multiprocessing
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes