Skip to content

0.3.2

Compare
Choose a tag to compare
@andrewrosss andrewrosss released this 23 Jan 03:40
· 6 commits to master since this release
  • 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 by lark. However, lark is only a development dependency. The parser grammar is written in src/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.
  • ~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 the v0.4 release, PhysioLog.from_string is intended to be the replacement for directly calling the init method.
    • 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 than PhysioLog 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" by PhysioLog.

    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]