0.3.2
-
Remove external dependency for parsing.
- The dependency on
pyparsing
has been removed. Parsing is now done by a codegen'd parser. In particular, the parsing is handled bylark
. However,lark
is only a development dependency. The parser grammar is written insrc/grammar.lark
from which a generated file is produced (src/fmri_physio_log/_generated.py
) and committed as part of the package. Thus, there is no production dependency on any external parsing library.
- The dependency on
-
~2x performance boost. The change to the generated parser has resulted in small perf win:
v0.3.1 (Previously):
$ git checkout 0.3.1 # + setup venv with pyparsing $ python -m timeit -v -n 10 -s "from fmri_physio_log import PhysioLog; from pathlib import Path; content = Path('samples/full/example_02.puls').read_text()" -- "PhysioLog(content)" raw times: 21.8 sec, 21.9 sec, 22.5 sec, 22.4 sec, 22.3 sec 10 loops, best of 5: 2.18 sec per loop
v0.3.2 (This release):
$ git checkout 0.3.2 # + setup venv with lark $ python -m timeit -v -n 10 -s "from fmri_physio_log import PhysioLog; from pathlib import Path; content = Path('samples/full/example_02.puls').read_text()" -- "PhysioLog(content)" raw times: 9.73 sec, 9.6 sec, 9.59 sec, 9.58 sec, 9.6 sec 10 loops, best of 5: 958 msec per loop
-
More ergonomic
PhysioLog
class.-
Introduced a new
.from_string
classmethod. (Example below)- The plan is to turn
PhysioLog
in to a dataclass in thev0.4
release,PhysioLog.from_string
is intended to be the replacement for directly calling the init method.
- The plan is to turn
-
Introduced a new
n_params
kw-only argument to__init__
(and related classmethods). (Example below)PhysioLog
will try to heuristically deduce the number acquisition parameters at the beginning of the string/file, however previous this was the only behaviour. If you know better thanPhysioLog
you can now directly specify the number of parameters expected at the beginning of the file.
-
Introduced a new
.data
attribute. (Example below)- Similar to the previous point, related to flexibility of the
PhysioLog
class related to which values are "acquisition params" and which values are "data", this attribute will make the parsed "raw" data available to you (i.e. it's as list of the params + the data; no "splitting" byPhysioLog
.
- Similar to the previous point, related to flexibility of the
Example:
>>> from pathlib import Path >>> from fmri_physio_log import PhysioLog >>> content_str = Path('samples/short/example_01.ecg').read_text() >>> print(content_str) 1 1 2 40 280 5002 LOGVERSION 102 6002 5002 TRIGGERMETHOD 10 6002 5002 MSGTYPE 103 6002 5002 MSGTYPE 220 eTriggerMethod: 10, minLimitCh1: 0, maxLimitCh1: 0, minLimitAVF: 0, maxLimitAVF: 0 6002 5002 MSGTYPE 210 6002 2048 10240 2048 10240 2048 5003 ECG Freq Per: 0 0 PULS Freq Per: 148 405 RESP Freq Per: 12 4660 EXT Freq Per: 0 0 ECG Min Max Avg StdDiff: 0 0 0 0 PULS Min Max Avg StdDiff: 180 1142 498 17 RESP Min Max Avg StdDiff: 4400 5740 4973 44 EXT Min Max Avg StdDiff: 0 0 0 0 NrTrig NrMP NrArr AcqWin: 0 0 0 0 LogStartMDHTime: 45927805 LogStopMDHTime: 46228520 LogStartMPCUTime: 45927897 LogStopMPCUTime: 46227375 6003 >>> log = PhysioLog.from_string(content_str, n_params=7) >>> log.params (1, 1, 2, 40, 280, 2048, 10240) >>> log.ts [2048, 10240, 2048] >>> log.data [1, 1, 2, 40, 280, 2048, 10240, 2048, 10240, 2048]
-