bmtool 0.6.1__py3-none-any.whl → 0.6.2__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.
bmtool/bmplot.py CHANGED
@@ -21,7 +21,6 @@ import os
21
21
  import sys
22
22
  import re
23
23
  from typing import Optional, Dict
24
- from .analysis.spikes import load_spikes_to_df
25
24
 
26
25
  from .util.util import CellVarsFile,load_nodes_from_config #, missing_units
27
26
  from bmtk.analyzer.utils import listify
bmtool/synapses.py CHANGED
@@ -46,13 +46,14 @@ class SynapseTuner:
46
46
  self.conn_type_settings = conn_type_settings
47
47
  if json_folder_path:
48
48
  print(f"updating settings from json path {json_folder_path}")
49
- self.update_spec_syn_param(json_folder_path)
49
+ self._update_spec_syn_param(json_folder_path)
50
50
  self.general_settings = general_settings
51
51
  self.conn = self.conn_type_settings[connection]
52
52
  self.synaptic_props = self.conn['spec_syn_param']
53
53
  self.vclamp = general_settings['vclamp']
54
54
  self.current_name = current_name
55
55
  self.other_vars_to_record = other_vars_to_record
56
+ self.ispk = None
56
57
 
57
58
  if slider_vars:
58
59
  # Start by filtering based on keys in slider_vars
@@ -63,10 +64,10 @@ class SynapseTuner:
63
64
  if key not in self.synaptic_props:
64
65
  try:
65
66
  # Get the alternative value from getattr dynamically
66
- self.set_up_cell()
67
- self.set_up_synapse()
67
+ self._set_up_cell()
68
+ self._set_up_synapse()
68
69
  value = getattr(self.syn,key)
69
- print(value)
70
+ #print(value)
70
71
  self.slider_vars[key] = value
71
72
  except AttributeError as e:
72
73
  print(f"Error accessing '{key}' in syn {self.syn}: {e}")
@@ -80,7 +81,7 @@ class SynapseTuner:
80
81
  h.steps_per_ms = 1 / h.dt
81
82
  h.celsius = general_settings['celsius']
82
83
 
83
- def update_spec_syn_param(self, json_folder_path):
84
+ def _update_spec_syn_param(self, json_folder_path):
84
85
  """
85
86
  Update specific synaptic parameters using JSON files located in the specified folder.
86
87
 
@@ -99,20 +100,20 @@ class SynapseTuner:
99
100
  print(f"JSON file for {conn_type} not found.")
100
101
 
101
102
 
102
- def set_up_cell(self):
103
+ def _set_up_cell(self):
103
104
  """
104
105
  Set up the neuron cell based on the specified connection settings.
105
106
  """
106
107
  self.cell = getattr(h, self.conn['spec_settings']['post_cell'])()
107
108
 
108
109
 
109
- def set_up_synapse(self):
110
+ def _set_up_synapse(self):
110
111
  """
111
112
  Set up the synapse on the target cell according to the synaptic parameters in `conn_type_settings`.
112
113
 
113
114
  Notes:
114
115
  ------
115
- - `set_up_cell()` should be called before setting up the synapse.
116
+ - `_set_up_cell()` should be called before setting up the synapse.
116
117
  - Synapse location, type, and properties are specified within `spec_syn_param` and `spec_settings`.
117
118
  """
118
119
  self.syn = getattr(h, self.conn['spec_settings']['level_of_detail'])(list(self.cell.all)[self.conn['spec_settings']['sec_id']](self.conn['spec_settings']['sec_x']))
@@ -124,7 +125,7 @@ class SynapseTuner:
124
125
  print(f"Warning: {key} cannot be assigned as it does not exist in the synapse. Check your mod file or spec_syn_param.")
125
126
 
126
127
 
127
- def set_up_recorders(self):
128
+ def _set_up_recorders(self):
128
129
  """
129
130
  Set up recording vectors to capture simulation data.
130
131
 
@@ -171,8 +172,8 @@ class SynapseTuner:
171
172
  and then runs the NEURON simulation for a single event. The single synaptic event will occur at general_settings['tstart']
172
173
  Will display graphs and synaptic properies works best with a jupyter notebook
173
174
  """
174
- self.set_up_cell()
175
- self.set_up_synapse()
175
+ self._set_up_cell()
176
+ self._set_up_synapse()
176
177
 
177
178
  # Set up the stimulus
178
179
  self.nstim = h.NetStim()
@@ -191,7 +192,7 @@ class SynapseTuner:
191
192
  self.vcl.amp[i] = self.conn['spec_settings']['vclamp_amp']
192
193
  self.vcl.dur[i] = vcldur[1][i]
193
194
 
194
- self.set_up_recorders()
195
+ self._set_up_recorders()
195
196
 
196
197
  # Run simulation
197
198
  h.tstop = self.general_settings['tstart'] + self.general_settings['tdur']
@@ -199,13 +200,13 @@ class SynapseTuner:
199
200
  self.nstim.number = 1
200
201
  self.nstim2.start = h.tstop
201
202
  h.run()
202
- self.plot_model([self.general_settings['tstart'] - 5, self.general_settings['tstart'] + self.general_settings['tdur']])
203
- syn_props = self.get_syn_prop(rise_interval=self.general_settings['rise_interval'])
203
+ self._plot_model([self.general_settings['tstart'] - 5, self.general_settings['tstart'] + self.general_settings['tdur']])
204
+ syn_props = self._get_syn_prop(rise_interval=self.general_settings['rise_interval'])
204
205
  for prop in syn_props.items():
205
206
  print(prop)
206
207
 
207
208
 
208
- def find_first(self, x):
209
+ def _find_first(self, x):
209
210
  """
210
211
  Find the index of the first non-zero element in a given array.
211
212
 
@@ -224,7 +225,7 @@ class SynapseTuner:
224
225
  return idx[0] if idx.size else None
225
226
 
226
227
 
227
- def get_syn_prop(self, rise_interval=(0.2, 0.8), dt=h.dt, short=False):
228
+ def _get_syn_prop(self, rise_interval=(0.2, 0.8), dt=h.dt, short=False):
228
229
  """
229
230
  Calculate synaptic properties such as peak amplitude, latency, rise time, decay time, and half-width.
230
231
 
@@ -269,22 +270,22 @@ class SynapseTuner:
269
270
  ipk = ipk[0]
270
271
  peak = isyn[ipk]
271
272
  # latency
272
- istart = self.find_first(np.diff(isyn[:ipk + 1]) > 0)
273
+ istart = self._find_first(np.diff(isyn[:ipk + 1]) > 0)
273
274
  latency = dt * (istart + 1)
274
275
  # rise time
275
- rt1 = self.find_first(isyn[istart:ipk + 1] > rise_interval[0] * peak)
276
- rt2 = self.find_first(isyn[istart:ipk + 1] > rise_interval[1] * peak)
276
+ rt1 = self._find_first(isyn[istart:ipk + 1] > rise_interval[0] * peak)
277
+ rt2 = self._find_first(isyn[istart:ipk + 1] > rise_interval[1] * peak)
277
278
  rise_time = (rt2 - rt1) * dt
278
279
  # decay time
279
- iend = self.find_first(np.diff(isyn[ipk:]) > 0)
280
+ iend = self._find_first(np.diff(isyn[ipk:]) > 0)
280
281
  iend = isyn.size - 1 if iend is None else iend + ipk
281
282
  decay_len = iend - ipk + 1
282
283
  popt, _ = curve_fit(lambda t, a, tau: a * np.exp(-t / tau), dt * np.arange(decay_len),
283
284
  isyn[ipk:iend + 1], p0=(peak, dt * decay_len / 2))
284
285
  decay_time = popt[1]
285
286
  # half-width
286
- hw1 = self.find_first(isyn[istart:ipk + 1] > 0.5 * peak)
287
- hw2 = self.find_first(isyn[ipk:] < 0.5 * peak)
287
+ hw1 = self._find_first(isyn[istart:ipk + 1] > 0.5 * peak)
288
+ hw2 = self._find_first(isyn[ipk:] < 0.5 * peak)
288
289
  hw2 = isyn.size if hw2 is None else hw2 + ipk
289
290
  half_width = dt * (hw2 - hw1)
290
291
  output = {'baseline': baseline, 'sign': sign, 'latency': latency,
@@ -292,7 +293,7 @@ class SynapseTuner:
292
293
  return output
293
294
 
294
295
 
295
- def plot_model(self, xlim):
296
+ def _plot_model(self, xlim):
296
297
  """
297
298
  Plots the results of the simulation, including synaptic current, soma voltage,
298
299
  and any additional recorded variables.
@@ -319,6 +320,11 @@ class SynapseTuner:
319
320
 
320
321
  # Plot synaptic current (always included)
321
322
  axs[0].plot(self.t, 1000 * self.rec_vectors[self.current_name])
323
+ if self.ispk !=None:
324
+ for num in range(len(self.ispk)):
325
+ current = 1000 * np.array(self.rec_vectors[self.current_name].to_python())
326
+ axs[0].text(self.t[self.ispk[num]],current[self.ispk[num]],f"{str(num+1)}")
327
+
322
328
  axs[0].set_ylabel('Synaptic Current (pA)')
323
329
 
324
330
  # Plot voltage clamp or soma voltage (always included)
@@ -332,6 +338,7 @@ class SynapseTuner:
332
338
  else:
333
339
  soma_v_plt = np.array(self.soma_v)
334
340
  soma_v_plt[:ispk] = soma_v_plt[ispk]
341
+
335
342
  axs[1].plot(self.t, soma_v_plt)
336
343
  axs[1].set_ylabel('Soma Voltage (mV)')
337
344
 
@@ -353,11 +360,11 @@ class SynapseTuner:
353
360
  for j in range(num_vars_to_plot, len(axs)):
354
361
  fig.delaxes(axs[j])
355
362
 
356
- plt.tight_layout()
363
+ #plt.tight_layout()
357
364
  plt.show()
358
365
 
359
366
 
360
- def set_drive_train(self,freq=50., delay=250.):
367
+ def _set_drive_train(self,freq=50., delay=250.):
361
368
  """
362
369
  Configures trains of 12 action potentials at a specified frequency and delay period
363
370
  between pulses 8 and 9.
@@ -390,7 +397,7 @@ class SynapseTuner:
390
397
  return tstop
391
398
 
392
399
 
393
- def response_amplitude(self):
400
+ def _response_amplitude(self):
394
401
  """
395
402
  Calculates the amplitude of the synaptic response by analyzing the recorded synaptic current.
396
403
 
@@ -402,17 +409,25 @@ class SynapseTuner:
402
409
  """
403
410
  isyn = np.asarray(self.rec_vectors['i'])
404
411
  tspk = np.append(np.asarray(self.tspk), h.tstop)
405
- syn_prop = self.get_syn_prop(short=True)
412
+ syn_prop = self._get_syn_prop(short=True)
406
413
  # print("syn_prp[sign] = " + str(syn_prop['sign']))
407
414
  isyn = (isyn - syn_prop['baseline'])
408
415
  isyn *= syn_prop['sign']
409
- # print(isyn)
410
416
  ispk = np.floor((tspk + self.general_settings['delay']) / h.dt).astype(int)
411
- amp = [isyn[ispk[i]:ispk[i + 1]].max() for i in range(ispk.size - 1)]
417
+
418
+ try:
419
+ amp = [isyn[ispk[i]:ispk[i + 1]].max() for i in range(ispk.size - 1)]
420
+ # indexs of where the max of the synaptic current is at. This is then plotted
421
+ self.ispk = [np.argmax(isyn[ispk[i]:ispk[i + 1]]) + ispk[i] for i in range(ispk.size - 1)]
422
+ # Sometimes the sim can cutoff at the peak of synaptic activity. So we just reduce the range by 1 and ingore that point
423
+ except:
424
+ amp = [isyn[ispk[i]:ispk[i + 1]].max() for i in range(ispk.size - 2)]
425
+ self.ispk = [np.argmax(isyn[ispk[i]:ispk[i + 1]]) + ispk[i] for i in range(ispk.size - 2)]
426
+
412
427
  return amp
413
428
 
414
429
 
415
- def find_max_amp(self, amp, normalize_by_trial=True):
430
+ def _find_max_amp(self, amp, normalize_by_trial=True):
416
431
  """
417
432
  Determines the maximum amplitude from the response data.
418
433
 
@@ -435,7 +450,7 @@ class SynapseTuner:
435
450
  return max_amp
436
451
 
437
452
 
438
- def induction_recovery(self,amp, normalize_by_trial=True):
453
+ def _print_ppr_induction_recovery(self,amp, normalize_by_trial=True):
439
454
  """
440
455
  Calculates induction and recovery metrics from the synaptic response amplitudes.
441
456
 
@@ -457,54 +472,48 @@ class SynapseTuner:
457
472
  """
458
473
  amp = np.array(amp)
459
474
  amp = amp.reshape(-1, amp.shape[-1])
475
+ maxamp = amp.max(axis=1 if normalize_by_trial else None)
476
+
477
+ # functions used to round array to 2 sig figs
478
+ def format_value(x):
479
+ return f"{x:.2g}"
480
+
481
+ # Function to apply format_value to an entire array
482
+ def format_array(arr):
483
+ # Flatten the array and format each element
484
+ return ' '.join([format_value(x) for x in arr.flatten()])
460
485
 
486
+ print("Short Term Plasticity")
487
+ print("PPR: above 1 is facilitating below 1 is depressing")
488
+ print("Induction: above 0 is facilitating below 0 is depressing")
489
+ print("Recovery: measure of how fast STP decays")
490
+ print("")
461
491
 
462
- maxamp = amp.max(axis=1 if normalize_by_trial else None)
492
+ ppr = amp[:,1:2] / amp[:,0:1]
493
+ print(f"Paired Pulse Response Calculation: 2nd pulse / 1st pulse ")
494
+ print(f"{format_array(amp[:,1:2])} - {format_array(amp[:,0:1])} = {format_array(ppr)}")
495
+ print("")
496
+
463
497
  induction = np.mean((amp[:, 5:8].mean(axis=1) - amp[:, :1].mean(axis=1)) / maxamp)
498
+ print(f"Induction Calculation: (avg(6,7,8 pulses) - 1 pulse) / max amps")
499
+ # Format and print arrays with 2 significant figures
500
+ print(f"{format_array(amp[:, 5:8])} - {format_array(amp[:, :1])} / {format_array(maxamp)}")
501
+ print(f"{format_array(amp[:, 5:8].mean(axis=1))} - {format_array(amp[:, :1].mean(axis=1))} / {format_array(maxamp)} = {format_array(induction)}")
502
+ print("")
503
+
464
504
  recovery = np.mean((amp[:, 8:12].mean(axis=1) - amp[:, :4].mean(axis=1)) / maxamp)
505
+ print("Recovery Calculation: avg(9,10,11,12 pulses) - avg(1,2,3,4 pulses) / max amps")
506
+ print(f"{format_array(amp[:, 8:12])} - {format_array(amp[:, :4])} / {format_array(maxamp)}")
507
+ print(f"{format_array(amp[:, 8:12].mean(axis=1))} - {format_array(amp[:, :4].mean(axis=1))} / {format_array(maxamp)} = {format_array(recovery)}")
508
+ print("")
465
509
 
510
+
466
511
  # maxamp = max(amp, key=lambda x: abs(x[0]))
467
512
  maxamp = maxamp.max()
468
- return induction, recovery, maxamp
469
-
470
-
471
- def paired_pulse_ratio(self, dt=h.dt):
472
- """
473
- Computes the paired-pulse ratio (PPR) based on the recorded synaptic current or voltage.
474
-
475
- Parameters:
476
- -----------
477
- dt : float, optional
478
- Time step in milliseconds. Default is the NEURON simulation time step.
513
+ #return induction, recovery, maxamp
479
514
 
480
- Returns:
481
- --------
482
- ppr : float
483
- The ratio between the second and first pulse amplitudes.
484
515
 
485
- Notes:
486
- ------
487
- - The function handles both voltage-clamp and current-clamp conditions.
488
- - A minimum of two spikes is required to calculate PPR.
489
- """
490
- if self.vclamp:
491
- isyn = self.ivcl
492
- else:
493
- isyn = self.rec_vectors['i']
494
- isyn = np.asarray(isyn)
495
- tspk = np.asarray(self.tspk)
496
- if tspk.size < 2:
497
- raise ValueError("Need at least two spikes.")
498
- syn_prop = self.get_syn_prop()
499
- isyn = (isyn - syn_prop['baseline']) * syn_prop['sign']
500
- ispk2 = int(np.floor(tspk[1] / dt))
501
- ipk, _ = find_peaks(isyn[ispk2:])
502
- ipk2 = ipk[0] + ispk2
503
- peak2 = isyn[ipk2]
504
- return peak2 / syn_prop['amp']
505
-
506
-
507
- def set_syn_prop(self, **kwargs):
516
+ def _set_syn_prop(self, **kwargs):
508
517
  """
509
518
  Sets the synaptic parameters based on user inputs from sliders.
510
519
 
@@ -517,7 +526,7 @@ class SynapseTuner:
517
526
  setattr(self.syn, key, value)
518
527
 
519
528
 
520
- def simulate_model(self,input_frequency, delay, vclamp=None):
529
+ def _simulate_model(self,input_frequency, delay, vclamp=None):
521
530
  """
522
531
  Runs the simulation with the specified input frequency, delay, and voltage clamp settings.
523
532
 
@@ -532,7 +541,7 @@ class SynapseTuner:
532
541
 
533
542
  """
534
543
  if self.input_mode == False:
535
- self.tstop = self.set_drive_train(input_frequency, delay)
544
+ self.tstop = self._set_drive_train(input_frequency, delay)
536
545
  h.tstop = self.tstop
537
546
 
538
547
  vcldur = [[0, 0, 0], [self.general_settings['tstart'], self.tstop, 1e9]]
@@ -556,13 +565,9 @@ class SynapseTuner:
556
565
  """
557
566
  Sets up interactive sliders for short-term plasticity (STP) experiments in a Jupyter Notebook.
558
567
 
559
- Notes:
560
- ------
561
- - The sliders allow control over synaptic properties dynamically based on slider_vars.
562
- - Additional buttons allow running the simulation and configuring voltage clamp settings.
563
568
  """
564
569
  # Widgets setup (Sliders)
565
- freqs = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 50, 100, 200]
570
+ freqs = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 35, 50, 100, 200]
566
571
  delays = [125, 250, 500, 1000, 2000, 4000]
567
572
  durations = [300, 500, 1000, 2000, 5000, 10000]
568
573
  freq0 = 50
@@ -602,19 +607,17 @@ class SynapseTuner:
602
607
  self.input_mode = w_input_mode.value
603
608
  # Update synaptic properties based on slider values
604
609
  syn_props = {var: slider.value for var, slider in dynamic_sliders.items()}
605
- self.set_syn_prop(**syn_props)
610
+ self._set_syn_prop(**syn_props)
606
611
  if self.input_mode == False:
607
- self.simulate_model(w_input_freq.value, self.w_delay.value, w_vclamp.value)
612
+ self._simulate_model(w_input_freq.value, self.w_delay.value, w_vclamp.value)
608
613
  else:
609
- self.simulate_model(w_input_freq.value, self.w_duration.value, w_vclamp.value)
610
- self.plot_model([self.general_settings['tstart'] - self.nstim.interval / 3, self.tstop])
611
- amp = self.response_amplitude()
612
- induction_single, recovery, maxamp = self.induction_recovery(amp)
613
- ppr = self.paired_pulse_ratio()
614
- print('Paired Pulse Ratio using ' + ('PSC' if self.vclamp else 'PSP') + f': {ppr:.3f}')
615
- print('Single trial ' + ('PSC' if self.vclamp else 'PSP'))
616
- print(f'Induction: {induction_single:.2f}; Recovery: {recovery:.2f}')
617
- print(f'Rest Amp: {amp[0]:.2f}; Maximum Amp: {maxamp:.2f}')
614
+ self._simulate_model(w_input_freq.value, self.w_duration.value, w_vclamp.value)
615
+ amp = self._response_amplitude()
616
+ self._plot_model([self.general_settings['tstart'] - self.nstim.interval / 3, self.tstop])
617
+ self._print_ppr_induction_recovery(amp)
618
+ # print('Single trial ' + ('PSC' if self.vclamp else 'PSP'))
619
+ # print(f'Induction: {induction_single:.2f}; Recovery: {recovery:.2f}')
620
+ #print(f'Rest Amp: {amp[0]:.2f}; Maximum Amp: {maxamp:.2f}')
618
621
 
619
622
  # Function to switch between delay and duration sliders
620
623
  def switch_slider(*args):
@@ -628,7 +631,7 @@ class SynapseTuner:
628
631
  # Link input mode to slider switch
629
632
  w_input_mode.observe(switch_slider, names='value')
630
633
 
631
- # Hide the duration slider initially
634
+ # Hide the duration slider initially until the user selects it
632
635
  self.w_duration.layout.display = 'none' # Hide duration slider
633
636
 
634
637
  w_run.on_click(update_ui)
@@ -647,6 +650,8 @@ class SynapseTuner:
647
650
  ui = VBox([HBox([w_run, w_vclamp, w_input_mode]), HBox([w_input_freq, self.w_delay, self.w_duration]), slider_columns])
648
651
 
649
652
  display(ui)
653
+ # run model with default parameters
654
+ update_ui()
650
655
 
651
656
 
652
657
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: bmtool
3
- Version: 0.6.1
3
+ Version: 0.6.2
4
4
  Summary: BMTool
5
5
  Home-page: https://github.com/cyneuro/bmtool
6
6
  Download-URL:
@@ -1,13 +1,13 @@
1
1
  bmtool/SLURM.py,sha256=woANwh6ToP5nsEkVX1qlINvkfGMp3P7Roq4O8X611M8,16371
2
2
  bmtool/__init__.py,sha256=ZStTNkAJHJxG7Pwiy5UgCzC4KlhMS5pUNPtUJZVwL_Y,136
3
3
  bmtool/__main__.py,sha256=TmFkmDxjZ6250nYD4cgGhn-tbJeEm0u-EMz2ajAN9vE,650
4
- bmtool/bmplot.py,sha256=HuzBRrVsD6xFM-siWdT_t6XqffFhK6LFcGF7RttR6pQ,54013
4
+ bmtool/bmplot.py,sha256=Im-Jrv8TK3CmTtksFzHrVogAve0l9ZwRrCW4q2MFRiA,53966
5
5
  bmtool/connectors.py,sha256=2vVUsqYMaCuWZ-4C5eUzqwsFItFM9vm0ytZdRQdWgoc,72243
6
6
  bmtool/graphs.py,sha256=K8BiughRUeXFVvAgo8UzrwpSClIVg7UfmIcvtEsEsk0,6020
7
7
  bmtool/manage.py,sha256=_lCU0qBQZ4jSxjzAJUd09JEetb--cud7KZgxQFbLGSY,657
8
8
  bmtool/plot_commands.py,sha256=Tqujyf0c0u8olhiHOMwgUSJXIIE1hgjv6otb25G9cA0,12298
9
9
  bmtool/singlecell.py,sha256=Q4poQvG9fw0jlyMmHFzbRPrpcEkPz5MKS8Guuo73Bzs,26849
10
- bmtool/synapses.py,sha256=cBa4NAYob8BxCFi04FfVcqDs_LNYJrP4vscgnT8Rk1c,27498
10
+ bmtool/synapses.py,sha256=dXUnPa9-8bmeSrJqD3tnRuXEZFqv6WD0oZtIgNqUt04,28535
11
11
  bmtool/debug/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
12
  bmtool/debug/commands.py,sha256=AwtcR7BUUheM0NxvU1Nu234zCdpobhJv5noX8x5K2vY,583
13
13
  bmtool/debug/debug.py,sha256=xqnkzLiH3s-tS26Y5lZZL62qR2evJdi46Gud-HzxEN4,207
@@ -16,9 +16,9 @@ bmtool/util/commands.py,sha256=zJF-fiLk0b8LyzHDfvewUyS7iumOxVnj33IkJDzux4M,64396
16
16
  bmtool/util/util.py,sha256=00vOAwTVIifCqouBoFoT0lBashl4fCalrk8fhg_Uq4c,56654
17
17
  bmtool/util/neuron/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
18
  bmtool/util/neuron/celltuner.py,sha256=xSRpRN6DhPFz4q5buq_W8UmsD7BbUrkzYBEbKVloYss,87194
19
- bmtool-0.6.1.dist-info/LICENSE,sha256=qrXg2jj6kz5d0EnN11hllcQt2fcWVNumx0xNbV05nyM,1068
20
- bmtool-0.6.1.dist-info/METADATA,sha256=Ir2-vUb_0qfRxIJlj5iDuKVbnp5gFe6SOsqgCBWRdU4,19113
21
- bmtool-0.6.1.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
22
- bmtool-0.6.1.dist-info/entry_points.txt,sha256=0-BHZ6nUnh0twWw9SXNTiRmKjDnb1VO2DfG_-oprhAc,45
23
- bmtool-0.6.1.dist-info/top_level.txt,sha256=gpd2Sj-L9tWbuJEd5E8C8S8XkNm5yUE76klUYcM-eWM,7
24
- bmtool-0.6.1.dist-info/RECORD,,
19
+ bmtool-0.6.2.dist-info/LICENSE,sha256=qrXg2jj6kz5d0EnN11hllcQt2fcWVNumx0xNbV05nyM,1068
20
+ bmtool-0.6.2.dist-info/METADATA,sha256=cgrIq8s8qxEYPsLKcr_iqgmQy1hk8B_n_dsMyCLnw2w,19113
21
+ bmtool-0.6.2.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
22
+ bmtool-0.6.2.dist-info/entry_points.txt,sha256=0-BHZ6nUnh0twWw9SXNTiRmKjDnb1VO2DfG_-oprhAc,45
23
+ bmtool-0.6.2.dist-info/top_level.txt,sha256=gpd2Sj-L9tWbuJEd5E8C8S8XkNm5yUE76klUYcM-eWM,7
24
+ bmtool-0.6.2.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