myokit 1.37.4__py3-none-any.whl → 1.37.5__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.
myokit/_datablock.py CHANGED
@@ -2169,8 +2169,7 @@ class ColorMapViridis(ColorMap):
2169
2169
  https://github.com/BIDS/colormap/blob/master/colormaps.py
2170
2170
  and were distributed under a CC0 license.
2171
2171
 
2172
- Viridis was designed by Eric Firing, Nathaniel J. Smith, and Stefan van der
2173
- Walt.
2172
+ Viridis was designed by Nathaniel J. Smith and Stefan van der Walt.
2174
2173
  """
2175
2174
  _VALUES = np.array((
2176
2175
  (68, 1, 84),
@@ -2456,14 +2455,13 @@ class ColorMapViridis(ColorMap):
2456
2455
 
2457
2456
  class ColorMapInferno(ColorMap):
2458
2457
  """
2459
- A colormap using "Viridis".
2458
+ A colormap using "Inferno".
2460
2459
 
2461
- The values used by this color map are taken from
2460
+ The values used by this color map are adapted from
2462
2461
  https://github.com/BIDS/colormap/blob/master/colormaps.py
2463
2462
  and were distributed under a CC0 license.
2464
2463
 
2465
- Viridis was designed by Eric Firing, Nathaniel J. Smith, and Stefan van der
2466
- Walt.
2464
+ Inferno was designed by Nathaniel J. Smith and Stefan van der Walt.
2467
2465
  """
2468
2466
  _VALUES = np.array((
2469
2467
  (0, 0, 4),
myokit/_myokit_version.py CHANGED
@@ -14,7 +14,7 @@ __release__ = True
14
14
  # incompatibility
15
15
  # - Changes to revision indicate bugfixes, tiny new features
16
16
  # - There is no significance to odd/even numbers
17
- __version_tuple__ = 1, 37, 4
17
+ __version_tuple__ = 1, 37, 5
18
18
 
19
19
  # String version of the version number
20
20
  __version__ = '.'.join([str(x) for x in __version_tuple__])
myokit/_parsing.py CHANGED
@@ -949,6 +949,10 @@ def parse_protocol_from_stream(stream):
949
949
  'Expecting [[protocol]]')
950
950
  expect(next(stream), EOL)
951
951
 
952
+ # Handling "next" accuracy: after summing, times set using "next" will be
953
+ # rounded to 9 digits precision.
954
+ round_next = lambda x: round(x, 9)
955
+
952
956
  # Create protocol
953
957
  protocol = myokit.Protocol()
954
958
 
@@ -971,7 +975,7 @@ def parse_protocol_from_stream(stream):
971
975
  'Unable to determine end of previous event, "next" cannot'
972
976
  ' be used here.')
973
977
  else:
974
- t = t_next
978
+ t = round_next(t_next)
975
979
  else:
976
980
  t = parse_number(stream)
977
981
  if t_last is None:
myokit/_sim/cable.c CHANGED
@@ -272,7 +272,7 @@ sim_clean()
272
272
  return 0;
273
273
  }
274
274
  static PyObject*
275
- py_sim_clean()
275
+ py_sim_clean(PyObject *self, PyObject *args)
276
276
  {
277
277
  sim_clean();
278
278
  Py_RETURN_NONE;
@@ -291,7 +291,7 @@ sim_clean()
291
291
  return 0;
292
292
  }
293
293
  static PyObject*
294
- py_sim_clean()
294
+ py_sim_clean(PyObject *self, PyObject *args)
295
295
  {
296
296
  #ifdef MYOKIT_DEBUG_MESSAGES
297
297
  printf("Python py_sim_clean called.\n");
myokit/_unit.py CHANGED
@@ -186,7 +186,7 @@ class Unit:
186
186
  ``unit2``.
187
187
 
188
188
  Exponents are stored internally as floating point numbers, and the
189
- check for closeness if made with a relative tolerance of ``reltol`` and
189
+ check for closeness is made with a relative tolerance of ``reltol`` and
190
190
  absolute tolerance of ``abstol``, using::
191
191
 
192
192
  abs(a - b) < max(reltol * max(abs(a), abs(b)), abstol)
@@ -254,7 +254,6 @@ class AbfFile(myokit.formats.SweepSource):
254
254
  # Read the protocol information
255
255
  self._n_adc = None
256
256
  self._n_dac = None
257
-
258
257
  self._rate = None
259
258
  self._mode = None
260
259
 
@@ -264,6 +263,7 @@ class AbfFile(myokit.formats.SweepSource):
264
263
  self._run_start_to_start = None
265
264
  self._sweeps_per_run = None
266
265
  self._sweep_start_to_start = None
266
+ self._equal_length_sweeps = None
267
267
  self._samples_per_channel = None
268
268
 
269
269
  # To be able to treat v1 and v2 slightly more easily, we define 3
@@ -281,7 +281,6 @@ class AbfFile(myokit.formats.SweepSource):
281
281
  # will have A/D but no (or no supported) D/A. Conversely protocol files
282
282
  # will have D/A only. So all in one sweep is easiest.
283
283
  self._sweeps = None
284
-
285
284
  self._read_3_protocol_information()
286
285
 
287
286
  # Read and calculate conversion factors for integer data in ADC
@@ -553,7 +552,10 @@ class AbfFile(myokit.formats.SweepSource):
553
552
  # 1.x versions only seem to have 1 DAC channel, but this is not
554
553
  # supported here.
555
554
  self._n_adc = int(h['nADCNumChannels'])
556
- self._n_dac = min(len(h['sDACChannelName']), 2)
555
+ if h['sDACChannelName'] is None: # pragma: no cover
556
+ self._n_dac = 2
557
+ else:
558
+ self._n_dac = min(len(h['sDACChannelName']), 2)
557
559
  self._rate = 1e6 / (h['fADCSampleInterval'] * self._n_adc)
558
560
  self._mode = h['nOperationMode']
559
561
  else:
@@ -577,11 +579,7 @@ class AbfFile(myokit.formats.SweepSource):
577
579
  'Unsupported acquisition method'
578
580
  f' {acquisition_modes[self._mode]}; unable to read D/A'
579
581
  ' channels.')
580
-
581
- # Remaining code is all about reading D/A info for episodic
582
- # stimulation, so return
583
582
  self._n_dac = 0
584
- return
585
583
 
586
584
  # Gather protocol information
587
585
  if self._version < 2:
@@ -668,9 +666,16 @@ class AbfFile(myokit.formats.SweepSource):
668
666
  self._sweep_start_to_start = self._samples_per_channel / self._rate
669
667
 
670
668
  # Create empty sweeps
671
- n = h['lActualSweeps']
672
- if self._is_protocol_file:
669
+ if self._mode == ACMODE_GAP_FREE: # pragma: no cover
670
+ # In gap-free mode, treat the data as a single sweep
671
+ n = 1
672
+ elif self._is_protocol_file:
673
+ # In protocol file, there is no number of recorded sweeps, so use
674
+ # intended number of sweeps instead
673
675
  n = self._sweeps_per_run
676
+ else:
677
+ # Use number of recorded sweeps
678
+ n = h['lActualSweeps']
674
679
  self._sweeps = [Sweep() for i in range(n)]
675
680
 
676
681
  # User lists are not supported for D/A reconstruction
@@ -811,7 +816,8 @@ class AbfFile(myokit.formats.SweepSource):
811
816
  # Get binary integer format
812
817
  dt = np.dtype('i2') if h['nDataFormat'] == 0 else np.dtype('f4')
813
818
 
814
- # Get number of channels, create a numpy memory map
819
+ # Get number of channels, create a numpy memory map of all data
820
+ # The map has size n and starts at offset o
815
821
  if self._version < 2:
816
822
  # Old files, get info from fields stored directly in header
817
823
  o = h['lDataSectionPtr'] * BLOCKSIZE \
@@ -823,37 +829,57 @@ class AbfFile(myokit.formats.SweepSource):
823
829
  n = h['sections']['Data']['length']
824
830
  data = np.memmap(self._filepath, dt, 'r', shape=(n,), offset=o)
825
831
 
826
- # Load list of sweeps (Sweeps are called 'episodes' in ABF < 2)
832
+ # Load information about sweep sizes from "SynchArray".
833
+ # The number of sweep information structs will be n, and information
834
+ # starts at an offset o
827
835
  if self._version < 2:
828
836
  n = h['lSynchArraySize']
829
837
  o = h['lSynchArrayPtr'] * BLOCKSIZE
830
838
  else:
831
839
  n = h['sections']['SynchArray']['length']
832
840
  o = h['sections']['SynchArray']['index'] * BLOCKSIZE
833
- if n > 0:
834
- dt = [(str('offset'), str('i4')), (str('len'), str('i4'))]
835
- sweep_data = np.memmap(
836
- self._filepath, dt, 'r', shape=(n,), offset=o)
837
- else: # pragma: no cover
838
- # Cover pragma: Don't have appropriate test file
839
- sweep_data = np.empty((1), dt)
840
- sweep_data[0]['len'] = data.size
841
- sweep_data[0]['offset'] = 0
842
841
 
843
- # Number of sweeps must equal n
844
- if n != h['lActualSweeps']:
845
- raise NotImplementedError(
846
- 'Unable to read file with different sizes per sweep.')
847
-
848
- # Time-offset at start of first sweep
849
- start = sweep_data[0]['offset'] / rate
842
+ # Get sweep start times (real times, not array offsets) and sizes
843
+ # (as number of points in an array)
844
+ if self._mode != ACMODE_GAP_FREE:
845
+ # This will be read in as an array of numpy.Void objects, which are
846
+ # similar to structs. In ``dt`` we name the entries offset and len.
847
+ sweep_starts_sizes = np.memmap(
848
+ self._filepath, [('offset', 'i4'), ('len', 'i4')], 'r',
849
+ shape=(n,), offset=o)
850
+ else: # pragma: no cover
851
+ # In gap-free model, all data is a single sweep
852
+ sweep_starts_sizes = [(0, len(data))]
853
+
854
+ # Sanity check
855
+ if len(sweep_starts_sizes) != len(self._sweeps): # pragma: no cover
856
+ raise RuntimeError(
857
+ 'Unexpected situation: number of sweeps is'
858
+ f' {len(self._sweeps)} but found list of'
859
+ f' {len(sweep_starts_sizes)} sweep sizes.')
860
+
861
+ # Check if sweep sizes are all the same
862
+ self._equal_length_sweeps = True
863
+ if len(sweep_starts_sizes) > 0:
864
+ size = sweep_starts_sizes[0][1]
865
+ for o, s in sweep_starts_sizes[1:]:
866
+ if s != size: # pragma: no cover
867
+ self._equal_length_sweeps = False
868
+ break
869
+ del size
870
+
871
+ # Episodic stimulation? Then increment start time using sweep interval
872
+ # First time is time listed in first sweep
873
+ if self._mode == ACMODE_EPISODIC_STIMULATION:
874
+ tstart = sweep_starts_sizes[0][0] / rate
850
875
 
851
876
  # Get data
852
877
  pos = 0
853
- for i_sweep, sdat in enumerate(sweep_data):
878
+ for i_sweep, (start, size) in enumerate(sweep_starts_sizes):
854
879
 
855
- # Get the number of data points
856
- size = sdat['len']
880
+ # Not episodic: Then use listed start time
881
+ if self._mode != ACMODE_EPISODIC_STIMULATION: # pragma: no cover
882
+ tstart = start / rate
857
883
 
858
884
  # Calculate the correct size for variable-length event mode
859
885
  if self._mode == ACMODE_VARIABLE_LENGTH_EVENTS: # pragma: no cover
@@ -874,25 +900,20 @@ class AbfFile(myokit.formats.SweepSource):
874
900
  # If needed, reformat the integers
875
901
  if h['nDataFormat'] == 0:
876
902
  # Data given as integers? Convert to floating point
877
-
878
903
  for i in range(self._n_adc):
879
904
  part[:, i] *= self._adc_factors[i]
880
905
  part[:, i] += self._adc_offsets[i]
881
906
 
882
- # Get start in other modes
883
- if self._mode != ACMODE_EPISODIC_STIMULATION: # pragma: no cover
884
- # All modes except episodic stimulation
885
- start = data['offset'] / rate
886
-
887
- # Create and populate sweep
907
+ # Create and populate sweep object
888
908
  sweep = self._sweeps[i_sweep]
889
909
  for i in range(self._n_adc):
890
910
  c = Channel(self)
891
911
  c._data = part[:, i] # Actually store the data
892
912
  c._rate = rate
893
- c._start = start
913
+ c._start = tstart
894
914
  c._is_reconstruction = False
895
915
 
916
+ # Add meta data
896
917
  if self._version < 2:
897
918
  j = h['nADCSamplingSeq'][i]
898
919
 
@@ -947,9 +968,9 @@ class AbfFile(myokit.formats.SweepSource):
947
968
 
948
969
  sweep._channels.append(c)
949
970
 
971
+ # In episodic mode, increase time according to sweep interval
950
972
  if self._mode == ACMODE_EPISODIC_STIMULATION:
951
- # Increase time according to sweeps in episodic stim. mode
952
- start += self._sweep_start_to_start
973
+ tstart += self._sweep_start_to_start
953
974
 
954
975
  def _read_6_da_reconstructions(self):
955
976
  """
@@ -1034,6 +1055,12 @@ class AbfFile(myokit.formats.SweepSource):
1034
1055
 
1035
1056
  return int_id
1036
1057
 
1058
+ def acquisition_mode_str(self):
1059
+ """
1060
+ Returns the acquisition mode, as a string.
1061
+ """
1062
+ return acquisition_modes[self._mode]
1063
+
1037
1064
  def channel(self, channel_id, join_sweeps=False):
1038
1065
  # Docstring in SweepSource
1039
1066
  channel_id = self._channel_id(channel_id)
@@ -1193,8 +1220,7 @@ class AbfFile(myokit.formats.SweepSource):
1193
1220
  return self._da_units[index]
1194
1221
 
1195
1222
  def equal_length_sweeps(self):
1196
- # Always true for ABF
1197
- return True
1223
+ return self._equal_length_sweeps
1198
1224
 
1199
1225
  def filename(self):
1200
1226
  """ Returns this ABF file's filename. """
@@ -1530,13 +1556,13 @@ HEADER_FIELDS = {
1530
1556
  # Note that a lot of the groups in the version 1 header start with obsolete
1531
1557
  # fields, followed later by their newer equivalents.
1532
1558
  1: [
1533
- ('fFileSignature', 0, '4s'), # Coarse file version indication
1559
+ ('fFileSignature', 0, '4s'), # Coarse file version indication
1534
1560
  # Group 1, File info and sizes
1535
- ('fFileVersionNumber', 4, 'f'), # Version number as float
1536
- ('nOperationMode', 8, 'h'), # Acquisition mode
1561
+ ('fFileVersionNumber', 4, 'f'), # Version number as float
1562
+ ('nOperationMode', 8, 'h'), # Acquisition mode
1537
1563
  ('lActualAcqLength', 10, 'i'),
1538
1564
  ('nNumPointsIgnored', 14, 'h'),
1539
- ('lActualSweeps', 16, 'i'),
1565
+ ('lActualSweeps', 16, 'i'), # AKA lActualEpisodes
1540
1566
  ('lFileStartDate', 20, 'i'),
1541
1567
  ('lFileStartTime', 24, 'i'),
1542
1568
  ('lStopWatchTime', 28, 'i'),
@@ -23,8 +23,9 @@
23
23
  # numbers of steps are given; the manual mentions two types of log
24
24
  # interpretation but there is no obvious field to select one; a "toggle"
25
25
  # mode is mentioned in the manual but again is not easy to find in the file.
26
- # - Series resistance prediction percentage is not stored in the Patchmaster
27
- # file.
26
+ # - Series resistance prediction percentage is not stored separately in the
27
+ # Patchmaster file. In addition, the value stored seems to be either
28
+ # percentage compensation or prediction, without much consistency.
28
29
  #
29
30
  # This file is part of Myokit.
30
31
  # See http://myokit.org for copyright, sharing, and licensing details.
@@ -78,7 +79,8 @@ class PatchMasterFile:
78
79
  represent a single cell, and each "series" will be a protocol (called a
79
80
  "stimulus") run on that cell. Groups are named by the user. Series are
80
81
  named after the "stimulus" they run. Sweeps are usually unnamed (although
81
- they do have a ``label`` property), and channels are named by the user.
82
+ they do have a ``label`` property), and traces (channels) are named by the
83
+ user.
82
84
 
83
85
  To access groups, index them by integer, or use the :meth:`group` method to
84
86
  find the first group with a given label::
@@ -294,8 +296,6 @@ class EndianAwareReader:
294
296
 
295
297
  def read(self, form):
296
298
  """ Read and unpack using the struct format ``form``. """
297
- #if offset is not None:
298
- # f.seek(offset)
299
299
  return struct.unpack(
300
300
  self._e + form, self._f.read(struct.calcsize(form)))
301
301
 
@@ -1209,7 +1209,6 @@ class Sweep(TreeNode):
1209
1209
  # Seconds since first sweep, based on self._time, set by parent series
1210
1210
  self._time_since_first = None
1211
1211
 
1212
- #self._data_offset = None
1213
1212
  self._stimulus_id = None
1214
1213
 
1215
1214
  def _read_properties(self, handle, reader):
@@ -1217,7 +1216,6 @@ class Sweep(TreeNode):
1217
1216
  i = handle.tell()
1218
1217
  handle.seek(i + 4) # SwLabel = 4; (* String32Type *)
1219
1218
  self._label = reader.str(32)
1220
- #self._data_offset = reader.read1('i')
1221
1219
  handle.seek(i + 40) # SwStimCount = 40; (* INT32 *)
1222
1220
  self._stimulus_id = reader.read1('i') - 1
1223
1221
  handle.seek(i + 48) # SwTime = 48; (* LONGREAL *)
@@ -1364,6 +1362,7 @@ class Trace(TreeNode):
1364
1362
  handle.seek(i + 40) # TrData
1365
1363
  self._data_pos = reader.read1('i')
1366
1364
  self._n = reader.read1('i')
1365
+ handle.seek(i + 70) # TrDataFormat
1367
1366
  dtype = int(reader.read1('b'))
1368
1367
  self._data_type = _data_types[dtype]
1369
1368
  self._data_size = _data_sizes[dtype]
@@ -1649,15 +1648,18 @@ class AmplifierState:
1649
1648
  Describes the state of an amplifier used by PatchMaster.
1650
1649
 
1651
1650
  This "state" contains lots of valuable meta data about the fast and slow
1652
- capacitance correction, the series resistance compensation (but not
1653
- prediction! see below), the filtering, the gain, and voltage offset
1651
+ capacitance correction, the series resistance compensation (and/or
1652
+ prediction, but see below!), the filtering, the gain, and voltage offset
1654
1653
  corrections (zeroing and online LJP).
1655
1654
 
1656
- A notable omission is information about the series compensation
1657
- _prediction_ feature. This should have an on/off statement, and a
1658
- percentage (which can be set separately from the _correction_ percentage in
1659
- Patchmaster). Unfortunately this is not stored in the format yet (20 feb
1660
- 2025).
1655
+ A notable issue is information omission is information about the series
1656
+ compensation _prediction_ feature. By default, the level of prediction is
1657
+ the same as the level of correction. A checkbox in the software (which the
1658
+ manual erroneously described as an on/off switch) can be used to set both
1659
+ values independently. If this is done, it becomes unclear what the value in
1660
+ the file represents, as only one value is stored. For this reason, if
1661
+ prediction is set seperately from correction, both values must be noted
1662
+ down by the experimenter and the value from the file should be ignored.
1661
1663
  """
1662
1664
  def __init__(self, handle, reader):
1663
1665
 
@@ -1686,10 +1688,6 @@ class AmplifierState:
1686
1688
  handle.seek(i + 304) # sRsTau = 304; (* LONGREAL *)
1687
1689
  self._rs_tau = reader.read1('d')
1688
1690
 
1689
- # Prediction is not recorded!
1690
- self._rs_prediction = PredictionSetting.UNKNOWN if self._rs_enabled \
1691
- else PredictionSetting.OFF
1692
-
1693
1691
  # Fast capacitance correction
1694
1692
  handle.seek(i + 56) # sCFastAmp1 = 56; (* LONGREAL *)
1695
1693
  self._cf_amp1 = reader.read1('d')
@@ -1921,19 +1919,6 @@ class AmplifierState:
1921
1919
  """
1922
1920
  return self._rs_tau * 1e6 if self._rs_enabled else 0
1923
1921
 
1924
- def r_series_prediction(self):
1925
- """
1926
- The percentage "prediction" is not recorded in the file: this method
1927
- returns ``PredictionSetting.OFF`` if compensation (and therefore
1928
- prediction) was disabled, and ``UNKNOWN`` if compensation was enabled
1929
- (so prediction may have been active).
1930
-
1931
- This serves as a placeholder in case future changes to the format
1932
- incorporate it, and as a place to document that this feature is missing
1933
- by design.
1934
- """
1935
- return self._rs_prediction
1936
-
1937
1922
  def stimulus_filter(self):
1938
1923
  """
1939
1924
  Returns a :class:`StimulusFilterSetting` descibing the stimulus filter
@@ -2076,24 +2061,6 @@ class StimulusFilterSetting(enum.Enum):
2076
2061
  return 'Bessel 20 us (on)'
2077
2062
 
2078
2063
 
2079
- class PredictionSetting(enum.Enum):
2080
- """
2081
- Very limited information about the series resistance compensation
2082
- prediction.
2083
-
2084
- Series resistance compensation includes a "prediction" pathway,
2085
- configurable via a percentage prediction in Patchmaster. Unfortunately this
2086
- is not stored in the file format, so that knowledge of this parameters is
2087
- limited to "off" (when series resistance compensation is disabled) or
2088
- "unknown" (when series resistance compensation is enabled).
2089
- """
2090
- OFF = 0
2091
- UNKNOWN = 1
2092
-
2093
- def __str__(self):
2094
- return 'Off' if self is PredictionSetting.OFF else 'Unknown'
2095
-
2096
-
2097
2064
  #
2098
2065
  # From StimFile_v9.txt
2099
2066
  # (* RootRecord = RECORD *)
@@ -208,6 +208,8 @@ class AbfTest(unittest.TestCase):
208
208
  self.assertIn('version 1.65', abf.meta_str())
209
209
  self.maxDiff = None
210
210
  self.assertEqual(abf.meta_str(), V1_INFO)
211
+ self.assertEqual(abf.acquisition_mode_str(),
212
+ 'Episodic stimulation mode')
211
213
 
212
214
  # Test getting full header runs without crashing
213
215
  abf.meta_str(True)
@@ -445,6 +447,8 @@ class AbfTest(unittest.TestCase):
445
447
  self.assertIn('version 2.0', abf.meta_str())
446
448
  self.maxDiff = None
447
449
  self.assertEqual(abf.meta_str(), V2_INFO)
450
+ self.assertEqual(abf.acquisition_mode_str(),
451
+ 'Episodic stimulation mode')
448
452
 
449
453
  # Test getting full header runs without crashing
450
454
  abf.meta_str(True)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: myokit
3
- Version: 1.37.4
3
+ Version: 1.37.5
4
4
  Summary: A modeling and simulation tool for cardiac cellular electrophysiology
5
5
  Home-page: http://myokit.org
6
6
  Author: Michael Clerx
@@ -2,18 +2,18 @@ myokit/__init__.py,sha256=6Df0drToZtBEqsRWTDtedcU_OMMn8d0oNxRtJaFAkww,13644
2
2
  myokit/__main__.py,sha256=VXyt8m2GG62pz32H-qATT4tw988p-LlIKih0mkVYlJk,53688
3
3
  myokit/_aux.py,sha256=x8VgBbdKF9yY7bBwi2mbuITyIzN3K7fj-ylCZrJQCJs,23948
4
4
  myokit/_config.py,sha256=WoUMTcHOO9oerqtad7AnQgXAND41YO-WfqlSSyCuHgU,11989
5
- myokit/_datablock.py,sha256=3fWSvnhJAoEUXsauOn8Qc3mC3qNAM2CGvsuBJ2ZCOzA,88717
5
+ myokit/_datablock.py,sha256=kz9oqggFhQ2ovyqTOEeOSgm8GdosPpHgDBKxNXFVPgE,88683
6
6
  myokit/_datalog.py,sha256=eWMpgyLa5Nx98RQZO3fK2PZKp2vLsBCddq6nB-9aVK4,77749
7
7
  myokit/_err.py,sha256=n8Ggy2VKnyx_h_ySuNe77tIFXzh1yO7sWBvc7YPC2cM,11974
8
8
  myokit/_expressions.py,sha256=VpxJAax0OHAWj0AnIH5xkGVWLrmVxBP9tykaccV86BU,109246
9
9
  myokit/_io.py,sha256=2ll5Yb-sbP4tvc3pPmzhNuv_PaRMPJlNRWb1TzXfELg,8948
10
10
  myokit/_model_api.py,sha256=LRHT-RcqyB2UTNrvg7iMXN0D_lpParrks5YKcVZPJJY,194650
11
- myokit/_myokit_version.py,sha256=CliDuAYisoyaQJwfrfDpsCshWwcUx9UYSf6wGYD2np8,726
12
- myokit/_parsing.py,sha256=GTVUwJvqjkQ3rc6BiwMFnzanLivbSUzW796gHCTJrNg,74065
11
+ myokit/_myokit_version.py,sha256=-XbOLRR_wIl6x4Vx_YsS-NvGU4aExjqMDkoe_gdCDoQ,726
12
+ myokit/_parsing.py,sha256=o7O39o50QWCKIPbadhxluv7lDdJbTfnYbV3kzfWOG78,74232
13
13
  myokit/_progress.py,sha256=Mi2QU6Vqj4qudhXc76amXM31iID2Mo8Gljw5OH2COZ4,4410
14
14
  myokit/_protocol.py,sha256=_N16LGHppIv4yCSPjy0q2f-Oed0yG1wMk0ipTtXnMck,30756
15
15
  myokit/_system.py,sha256=IX3Q7_7f9X9aYsxSL2CXJc9bTcFJsJbfq_e2w-OkhOI,4602
16
- myokit/_unit.py,sha256=prEupTNDeoqf2suN_i9ffBDGfVkid49gUDBTWTVzTww,30102
16
+ myokit/_unit.py,sha256=scKgDxN8bBab1jlYYMt3MkkJLC_DUUl5BbocjWYsop8,30102
17
17
  myokit/float.py,sha256=7-BqdABN5Vm4HIgRMHSgcZ4O4Vd085-5hMB6z8zJZtg,3066
18
18
  myokit/pacing.py,sha256=_My0GwIPJh4DuUiK_kYDNBcacUaOKsffjbK5LvgK6z8,4552
19
19
  myokit/pype.py,sha256=JTKuoiwxGui6iqBXK4gxNlCdtH_IGY0FiZLtmaJ580c,8230
@@ -79,7 +79,7 @@ myokit/_bin/sundials-win-vs/lib/sundials_cvodes.lib,sha256=FEmPq4BcmyOZReaM68pMD
79
79
  myokit/_bin/sundials-win-vs/lib/sundials_nvecserial.dll,sha256=QwCosLqDBV0YIYvxfTGm0h5rM6iDNNXt5apu3hMZDiY,160768
80
80
  myokit/_bin/sundials-win-vs/lib/sundials_nvecserial.lib,sha256=UmH8HCEFT_A8hsIw9Mj-ZgXeqNJJNadHnvQj9RJsfQg,59576
81
81
  myokit/_sim/__init__.py,sha256=CuO1se4k-kpyh0muzBjdTrVfm31ZjXRLAZYhBg8P0I4,13488
82
- myokit/_sim/cable.c,sha256=57FecqBgVnYTnqcH0F5ocA8O4zO2iwpkHBYBV7qW5Qg,19156
82
+ myokit/_sim/cable.c,sha256=mOWdKhx0tNwPVNItJd3-IzG8W_-fizaREqlrEZrrzK8,19186
83
83
  myokit/_sim/cable.py,sha256=GF1LJhoR9iSjVi16n7PhKYvSn1bDJVzSws1i8nJwM4c,18908
84
84
  myokit/_sim/cmodel.h,sha256=PlXRNDWV5JDsl28G-k3UlzwFCF5_crkAeWpRgPO8a0s,38795
85
85
  myokit/_sim/cmodel.py,sha256=9amSihccWepI1SGI98b5tvvSq2cmAMLX-ecgHoXnc0Y,15775
@@ -88,7 +88,7 @@ myokit/_sim/compiler.py,sha256=80Qwk7_LOjbu0jt9_aeMLQMEvYj3H4xIoE525zUUEK8,2664
88
88
  myokit/_sim/cvodessim.c,sha256=iWXHVSNTN2VqGGu24N8QFRWwpUUxDo17fTIP0Fv0Ikg,78062
89
89
  myokit/_sim/cvodessim.py,sha256=T2vwuSJFtHWTdzJv7xhFRC9l2OJY-7r4L6VVEpnIZI8,46158
90
90
  myokit/_sim/differential.hpp,sha256=LiaFNQks_4RkWeNEnUc48XjbdYyGSsxfWo35leygM68,15446
91
- myokit/_sim/fiber_tissue.c,sha256=mKtNy3Qs2Tg917hgCryaftwJGHqFn7WZAOuJWG3VVpY,47444
91
+ myokit/_sim/fiber_tissue.c,sha256=P9AJZlq9C3DNFxpzvseBbqozxMg6oMiolitWr-cQtv4,47474
92
92
  myokit/_sim/fiber_tissue.py,sha256=A3zyGPGHNjFdGgbIzCiKYN8o4L2nq7W_ZjO996jF9Kc,50780
93
93
  myokit/_sim/jacobian.cpp,sha256=mvuxHnxiyg4GW-ik1qOgOGbaj-sb-DbtidsRDXfRIjc,8012
94
94
  myokit/_sim/jacobian.py,sha256=-PWjGRqr8VygrqnITtju8aWDkPvt9srATcrenOShR1s,12927
@@ -111,7 +111,7 @@ myokit/formats/ansic/template/cable.c,sha256=e7V4CVeoIN0N8MSVenPmtst31HkiZb5Jfx1
111
111
  myokit/formats/ansic/template/euler.c,sha256=_ENsjDV-J0P7JEIeZBRO3L_kjyWZWiORyH5uFJXmB0Q,6044
112
112
  myokit/formats/ansic/template/sim.c,sha256=wf8aFpzyoEopZIG6vITfSkFdPPGkRX53hL8Lujjo5qs,14244
113
113
  myokit/formats/axon/__init__.py,sha256=qgo7UvLOYP_IZDYijkJhdGtwLc40Q80UpksivXaVojg,538
114
- myokit/formats/axon/_abf.py,sha256=MxaW18eJQpJ8ECHHPTAnRq1iGJ1vODTG6y-PYpfFSKw,76263
114
+ myokit/formats/axon/_abf.py,sha256=7SZPVeS43W8i-p6gGFX45_Zh3eIkYcQr5ceP24mBSUY,77759
115
115
  myokit/formats/axon/_atf.py,sha256=B0DQ_SiYv_izygBFCe8QXewsmxjPpq-7M2rqXcSFND4,10543
116
116
  myokit/formats/axon/_importer.py,sha256=WaPkQ7CCFOIQnEkOiXXd1ICHPiXPicv9YFyJB5yLt2k,826
117
117
  myokit/formats/cellml/__init__.py,sha256=Iz5kYXkjx0_mypcR0h5mV0sfVkVwaUWzUH8z4Goetq8,1466
@@ -142,7 +142,7 @@ myokit/formats/easyml/_ewriter.py,sha256=5T1GoiMtotlKMY3ZaYKcoWUeUZtWIbh3Xii8x0v
142
142
  myokit/formats/easyml/_exporter.py,sha256=lGUJBO3ZAJfVcbTBQUEkGqUqdmtMXDzfGGtVda54Bx0,15771
143
143
  myokit/formats/heka/__init__.py,sha256=JsHFKPdtzlYDgtCwA4ENODMAhOen9ygl-RwtrPXz-wU,927
144
144
  myokit/formats/heka/_importer.py,sha256=4HaxswB8Uvngahsh34eEXaQnE9SYakpugFo3jc6VNrA,1154
145
- myokit/formats/heka/_patchmaster.py,sha256=PYXBst7_eYJPsRd4o1GSdEr-KAJvdMDV-au4O4l_bm4,119623
145
+ myokit/formats/heka/_patchmaster.py,sha256=QxNSxT2pFpjqRfzHXFerUexDVhQTJJ-7dX0YwAEFVxk,118662
146
146
  myokit/formats/html/__init__.py,sha256=pFJtVdw_SIaZZO0dfYUH9XyqPO46CuxSTL4iwvcC-4U,457
147
147
  myokit/formats/html/_exporter.py,sha256=kWTB_6peG1MoxWPnGjm35Axkmw1tONSX1dCwWt0_arE,2343
148
148
  myokit/formats/html/_flatten.py,sha256=kosDcmr6KKrZbaIsXewGNiIAlpVq4N9POdPrKygcvQs,6606
@@ -227,7 +227,7 @@ myokit/tests/test_expressions.py,sha256=o7dQV95Gx4diX2vdJbVQ-bEN5ROa14SUAb4EFSGK
227
227
  myokit/tests/test_float.py,sha256=s4GpsSHDSmmstPTpXCFCLE-44lvZqM71OtVTooZBDSA,4882
228
228
  myokit/tests/test_formats.py,sha256=UfxN8d2SkEip9SLZ4aBIE95WnY1LaGvnxd2xh8RWIA4,8085
229
229
  myokit/tests/test_formats_ansic.py,sha256=3qnqOU-xvIPp-NSBno_IRVVgwBC8p59LprxYMFusD3E,12712
230
- myokit/tests/test_formats_axon.py,sha256=PMn7waANp-k7vXKgEOgwyGfgn89aUFy56gg0RmBipH0,33181
230
+ myokit/tests/test_formats_axon.py,sha256=vbc0_G4b7etzazyz0uFMSX9SveIExR8WXY41MdNGJ3k,33395
231
231
  myokit/tests/test_formats_cellml.py,sha256=WeNecMsTWubIBq6C0QMU4-cR-ZpNk69dJ7aHldb22zE,19078
232
232
  myokit/tests/test_formats_channelml.py,sha256=BS90euUpWN1DgkShTYK7fdwuP8qIt3CzUAXoiY5YZYc,6703
233
233
  myokit/tests/test_formats_cpp.py,sha256=giVwKzbHmjqx6VZHQBI1OV4oZrBnaKmquBmWlt9igx0,3537
@@ -401,9 +401,9 @@ myokit/tests/data/multi/beeler-no-name.mmt,sha256=tBeWcTVag1gAQAvxWlUqH6GQhF1D4D
401
401
  myokit/tests/data/multi/lr-1991.mmt,sha256=9jzHRAy1nLiBOPioiEpXmsRvIqwEezRY_ve2eHMDbTQ,6013
402
402
  myokit/tests/data/multi/not-a-model.csv,sha256=7ek3pQXr2fpjNjFTs-B-T_kEehx8IQ-evdcg24dtMEs,109
403
403
  myokit/tests/data/multi/subdir/beeler-no-name.mmt,sha256=tBeWcTVag1gAQAvxWlUqH6GQhF1D4DMnlmuePQn1vBY,3008
404
- myokit-1.37.4.dist-info/LICENSE.txt,sha256=0WNshB_he7HnJ4ROvVAaX95yz9760DE9ps8PbyvrGvw,1833
405
- myokit-1.37.4.dist-info/METADATA,sha256=6vqscmZArbXnCP_PwwnHli7e4vqASZp7O6_xtjmDm28,6260
406
- myokit-1.37.4.dist-info/WHEEL,sha256=pL8R0wFFS65tNSRnaOVrsw9EOkOqxLrlUPenUYnJKNo,91
407
- myokit-1.37.4.dist-info/entry_points.txt,sha256=yP9wy3w0YAAYUD5PYGliYKhnKvEp5l6p4S_XvXsqreM,48
408
- myokit-1.37.4.dist-info/top_level.txt,sha256=vopnhGEticqud7tKy6L6dvi_n_AMXoiYBEiboRTnsWY,7
409
- myokit-1.37.4.dist-info/RECORD,,
404
+ myokit-1.37.5.dist-info/LICENSE.txt,sha256=0WNshB_he7HnJ4ROvVAaX95yz9760DE9ps8PbyvrGvw,1833
405
+ myokit-1.37.5.dist-info/METADATA,sha256=dZnApEbm1uvpK324S7j7bY4ZrPOJQ4KjPxD-Ovfl03s,6260
406
+ myokit-1.37.5.dist-info/WHEEL,sha256=pL8R0wFFS65tNSRnaOVrsw9EOkOqxLrlUPenUYnJKNo,91
407
+ myokit-1.37.5.dist-info/entry_points.txt,sha256=yP9wy3w0YAAYUD5PYGliYKhnKvEp5l6p4S_XvXsqreM,48
408
+ myokit-1.37.5.dist-info/top_level.txt,sha256=vopnhGEticqud7tKy6L6dvi_n_AMXoiYBEiboRTnsWY,7
409
+ myokit-1.37.5.dist-info/RECORD,,