bluecellulab 2.6.21__py3-none-any.whl → 2.6.23__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 bluecellulab might be problematic. Click here for more details.

bluecellulab/__init__.py CHANGED
@@ -18,7 +18,7 @@ from .psection import PSection # NOQA
18
18
  from .psegment import PSegment # NOQA
19
19
  from .simulation import Simulation # NOQA
20
20
  from .rngsettings import RNGSettings # NOQA
21
- from .circuit_simulation import CircuitSimulation, CircuitSimulation # NOQA
21
+ from .circuit_simulation import CircuitSimulation # NOQA
22
22
  import neuron
23
23
 
24
24
  from .simulation.neuron_globals import NeuronGlobals
@@ -360,17 +360,15 @@ class InjectableMixin:
360
360
  stimulus: RelativeShotNoise,
361
361
  shotnoise_stim_count=0):
362
362
  """Add a replay relative shot noise stimulus."""
363
- cv_square = stimulus.amp_cv**2
364
363
 
365
364
  stim_mode = stimulus.mode
366
365
  rel_prop = self.relativity_proportion(stim_mode)
367
366
 
368
367
  mean = stimulus.mean_percent / 100 * rel_prop
369
368
  sd = stimulus.sd_percent / 100 * rel_prop
370
- var = sd * sd
371
369
 
372
370
  rate, amp_mean, amp_var = get_relative_shotnoise_params(
373
- mean, var, stimulus.decay_time, stimulus.rise_time, cv_square)
371
+ mean, sd, stimulus.decay_time, stimulus.rise_time, stimulus.relative_skew)
374
372
 
375
373
  rng = self._get_shotnoise_step_rand(shotnoise_stim_count, stimulus.seed)
376
374
  tvec, svec = gen_shotnoise_signal(stimulus.decay_time, stimulus.rise_time, rate, amp_mean,
@@ -114,17 +114,35 @@ def gen_shotnoise_signal(tau_D, tau_R, rate, amp_mean, amp_var,
114
114
  return tvec, P
115
115
 
116
116
 
117
- def get_relative_shotnoise_params(mean, var, tau_D, tau_R, cv_square):
117
+ def get_relative_shotnoise_params(mean, sd, tau_D, tau_R, relative_skew):
118
118
  """Returns Rate, amp_mean and amp_var parameters."""
119
119
  # bi-exponential time to peak [ms]
120
120
  t_peak = math.log(tau_D / tau_R) / (1 / tau_R - 1 / tau_D)
121
121
  # bi-exponential peak height [1]
122
- x_peak = math.exp(-t_peak / tau_D) - math.exp(-t_peak / tau_R)
123
-
124
- rate_ms = (1 + cv_square) / 2 * (mean ** 2 / var) / (tau_D + tau_R)
125
- rate = rate_ms * 1000 # rate in 1 / s [Hz]
126
- amp_mean = mean * x_peak / rate_ms / (tau_D - tau_R)
127
- amp_var = cv_square * amp_mean ** 2
122
+ F_peak = math.exp(-t_peak / tau_D) - math.exp(-t_peak / tau_R)
123
+
124
+ # utility constants
125
+ Xi = (tau_D - tau_R) / F_peak
126
+ A = 1 / (tau_D + tau_R)
127
+ B = 1 / ((tau_D + 2 * tau_R) * (2 * tau_D + tau_R))
128
+
129
+ # skewness
130
+ skew_bnd_min = (8 / 3) * (B / A ** 2) * (sd / mean)
131
+ skew = (1 + relative_skew) * skew_bnd_min
132
+ if skew < skew_bnd_min or skew > 2 * skew_bnd_min:
133
+ raise ValueError("skewness out of bounds")
134
+
135
+ # cumulants
136
+ lambda2_1 = sd ** 2 / mean # lambda2 over lambda1
137
+ lambda3_2 = sd * skew # lambda3 over lambda2
138
+ theta1pk = 2 / (A * Xi) * lambda2_1 # = (1 + k) * theta
139
+ theta2pk = (3 * A) / (4 * B * Xi) * lambda3_2 # = (2 + k) * theta
140
+
141
+ # derived parameters
142
+ amp_mean = 2 * theta1pk - theta2pk # mean amplitude [nA or uS]
143
+ amp_var = amp_mean * (theta2pk - theta1pk) # variance of amplitude [nA^2 or uS^2]
144
+ rate_ms = mean / (amp_mean * Xi) # event rate in 1 / ms
145
+ rate = rate_ms * 1000 # event rate in 1 / s [Hz]
128
146
 
129
147
  return rate, amp_mean, amp_var
130
148
 
@@ -170,7 +170,7 @@ class Stimulus:
170
170
  decay_time=stimulus_entry["DecayTime"],
171
171
  mean_percent=stimulus_entry["MeanPercent"],
172
172
  sd_percent=stimulus_entry["SDPercent"],
173
- amp_cv=stimulus_entry["AmpCV"],
173
+ relative_skew=stimulus_entry.get("RelativeSkew", 0.5),
174
174
  seed=stimulus_entry.get("Seed", None),
175
175
  mode=mode,
176
176
  reversal=stimulus_entry.get("Reversal", 0.0)
@@ -269,7 +269,7 @@ class Stimulus:
269
269
  decay_time=stimulus_entry["decay_time"],
270
270
  mean_percent=stimulus_entry["mean_percent"],
271
271
  sd_percent=stimulus_entry["sd_percent"],
272
- amp_cv=stimulus_entry["amp_cv"],
272
+ relative_skew=stimulus_entry.get("RelativeSkew", 0.5),
273
273
  seed=stimulus_entry.get("random_seed", None),
274
274
  mode=ClampMode(stimulus_entry.get("input_type", "current_clamp").lower()),
275
275
  reversal=stimulus_entry.get("reversal", 0.0)
@@ -365,7 +365,7 @@ class RelativeShotNoise(Stimulus):
365
365
  decay_time: float
366
366
  mean_percent: float
367
367
  sd_percent: float
368
- amp_cv: float
368
+ relative_skew: float = 0.5
369
369
  dt: float = 0.25
370
370
  seed: Optional[int] = None
371
371
  mode: ClampMode = ClampMode.CURRENT
@@ -378,6 +378,13 @@ class RelativeShotNoise(Stimulus):
378
378
  raise ValueError("decay_time must be greater than rise_time")
379
379
  return v
380
380
 
381
+ @field_validator("relative_skew")
382
+ @classmethod
383
+ def relative_skew_in_range(cls, v):
384
+ if v < 0.0 or v > 1.0:
385
+ raise ValueError("relative skewness must be in [0,1]")
386
+ return v
387
+
381
388
 
382
389
  @dataclass(frozen=True, config=dict(extra="forbid"))
383
390
  class OrnsteinUhlenbeck(Stimulus):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: bluecellulab
3
- Version: 2.6.21
3
+ Version: 2.6.23
4
4
  Summary: Biologically detailed neural network simulations and analysis.
5
5
  Author: Blue Brain Project, EPFL
6
6
  License: Apache2.0
@@ -1,4 +1,4 @@
1
- bluecellulab/__init__.py,sha256=JvigOm_7WDjVAodm4R_TyRzj7vd9hmEbvLJDUVtgeqo,899
1
+ bluecellulab/__init__.py,sha256=1d_CKIJLIpon7o13h3lBnV_-33obZEPwa9KDTjlFPD8,880
2
2
  bluecellulab/circuit_simulation.py,sha256=cLCA97WKjhlEitD4CUad9n4pH4KF7Iw68w1bZH512yw,33587
3
3
  bluecellulab/connection.py,sha256=volV2YKtmqAF7MOEJar5ldF1ARAo7k2vF9MB1NXybUY,4640
4
4
  bluecellulab/dendrogram.py,sha256=w0vvv0Q169DolTX1j9dAZIvHIl4H258gAjQ1xQaNiGk,6427
@@ -19,14 +19,14 @@ bluecellulab/analysis/inject_sequence.py,sha256=Ih3wdNRn0-lM-NW8agrMUGS862CEgzn_
19
19
  bluecellulab/cell/__init__.py,sha256=Sbc0QOsJ8E7tSwf3q7fsXuE_SevBN6ZmoCVyyU5zfII,208
20
20
  bluecellulab/cell/cell_dict.py,sha256=PVmZsjhZ9jp3HC-8QmdFqp-crAcVMSVeLWujcOPLlpo,1346
21
21
  bluecellulab/cell/core.py,sha256=2UtXXd4FA2X5A_7ljjbN4yobpMWD2FWfux67ZFND2rI,31315
22
- bluecellulab/cell/injector.py,sha256=XC49VSHw78xCHzLJKO_-unnnVZAZXsYg5qbmZPx01AA,18091
22
+ bluecellulab/cell/injector.py,sha256=u6Jvf_14rNOy5azK_mIUU8C2WioiGZd-7YGKoSnbR6Y,18042
23
23
  bluecellulab/cell/plotting.py,sha256=hW5KAmaSonJ1tgR6xRrnfVe33I5mBsBUrKJQwGvAbUc,4032
24
24
  bluecellulab/cell/random.py,sha256=FDby9BN4eJT27COwHP59bhDE2v-c6rdOKNFj3cYZTVY,1773
25
25
  bluecellulab/cell/recording.py,sha256=dekJspPb_5yrS6WR3aXtvZ6KWwMNbyhe5aIOVtNDHpY,342
26
26
  bluecellulab/cell/section_distance.py,sha256=J8-oqgCHzRaJkpfjPUR6NFtXDhwbrXad9nDaTCKNkTU,3908
27
27
  bluecellulab/cell/serialized_sections.py,sha256=sH9mV2CJU_DlhfJhwtuMs1gGnNEnKUvB_Bxx3AEmLHQ,1543
28
28
  bluecellulab/cell/sonata_proxy.py,sha256=dLT9mLlGVpXxj2O2lXN0g7Sq4BwroPLVdPikR2yNMv4,1529
29
- bluecellulab/cell/stimuli_generator.py,sha256=cJwjNwsQeEBHLjuJIFv6VBSqd9IpmbR7CuSMyotCiWc,6320
29
+ bluecellulab/cell/stimuli_generator.py,sha256=01CjXToBYtz24QP_h_LkZnSKhmEpDFIQOk4TU-ueeXg,7129
30
30
  bluecellulab/cell/template.py,sha256=K8Vp1-yE6-9wxjmhkLBhnjBhgciUixoMk8LU-GioTgM,7562
31
31
  bluecellulab/cell/ballstick/__init__.py,sha256=v1Z8tHFfbpWShxOBdShCUaE0utoz-7rZumuNBQtNOFI,439
32
32
  bluecellulab/cell/ballstick/emodel.hoc,sha256=7WcuepK-wB9bASRvNdCwO9Woc9-SpBCFqBqCXKgjsV8,1517
@@ -57,14 +57,14 @@ bluecellulab/simulation/neuron_globals.py,sha256=_8xmJPQMfCyhVn6KppK7i3jaUZaALML
57
57
  bluecellulab/simulation/parallel.py,sha256=oQ_oV2EKr8gP4yF2Dq8q9MiblDyi89_wBgLzQkLV_U0,1514
58
58
  bluecellulab/simulation/simulation.py,sha256=I__cZwV_A8I7XSefn6aJDBA_jXCI3E35-pCNCLUsnvo,6206
59
59
  bluecellulab/stimulus/__init__.py,sha256=DgIgVaSyR-URf3JZzvO6j-tjCerzvktuK-ep8pjMRPQ,37
60
- bluecellulab/stimulus/circuit_stimulus_definitions.py,sha256=QztVteUUeMZolPMVjx-S-KgpahnQlbfTziJsJ_wCmaw,15621
60
+ bluecellulab/stimulus/circuit_stimulus_definitions.py,sha256=Vt95dfvkSFAKl53wSv7CEECgYUVbkVAh1uZrD5ial1Y,15890
61
61
  bluecellulab/stimulus/factory.py,sha256=XDbnqCuMCh1RdZLKvlRucMj3wkXDqy6mEda_Oh6Yqo4,19955
62
62
  bluecellulab/synapse/__init__.py,sha256=RW8XoAMXOvK7OG1nHl_q8jSEKLj9ZN4oWf2nY9HAwuk,192
63
63
  bluecellulab/synapse/synapse_factory.py,sha256=3y15LlaBoNJiU2KUeTkh70pyU5OYf6xQIMSBmmMPMak,6987
64
64
  bluecellulab/synapse/synapse_types.py,sha256=4gne-hve2vq1Lau-LAVPsfLjffVYqAYBW3kCfC7_600,16871
65
- bluecellulab-2.6.21.dist-info/AUTHORS.txt,sha256=EDs3H-2HXBojbma10psixk3C2rFiOCTIREi2ZAbXYNQ,179
66
- bluecellulab-2.6.21.dist-info/LICENSE,sha256=xOouu1gC1GGklDxkITlaVl60I9Ab860O-nZsFbWydvU,11749
67
- bluecellulab-2.6.21.dist-info/METADATA,sha256=LKVNoBDRhEGl3HqRRq3YDgfkJ3nFDzoP6I5mZ0A2yo8,7267
68
- bluecellulab-2.6.21.dist-info/WHEEL,sha256=Z4pYXqR_rTB7OWNDYFOm1qRk0RX6GFP2o8LgvP453Hk,91
69
- bluecellulab-2.6.21.dist-info/top_level.txt,sha256=VSyEP8w9l3pXdRkyP_goeMwiNA8KWwitfAqUkveJkdQ,13
70
- bluecellulab-2.6.21.dist-info/RECORD,,
65
+ bluecellulab-2.6.23.dist-info/AUTHORS.txt,sha256=EDs3H-2HXBojbma10psixk3C2rFiOCTIREi2ZAbXYNQ,179
66
+ bluecellulab-2.6.23.dist-info/LICENSE,sha256=xOouu1gC1GGklDxkITlaVl60I9Ab860O-nZsFbWydvU,11749
67
+ bluecellulab-2.6.23.dist-info/METADATA,sha256=Yizrto13DoMEm7O3ac9WrtHo_JuTOgNdmetsmNN42c0,7267
68
+ bluecellulab-2.6.23.dist-info/WHEEL,sha256=Z4pYXqR_rTB7OWNDYFOm1qRk0RX6GFP2o8LgvP453Hk,91
69
+ bluecellulab-2.6.23.dist-info/top_level.txt,sha256=VSyEP8w9l3pXdRkyP_goeMwiNA8KWwitfAqUkveJkdQ,13
70
+ bluecellulab-2.6.23.dist-info/RECORD,,