项目作者: datsyl

项目描述 :
Parse Siemens PMU files
高级语言: Python
项目地址: git://github.com/datsyl/fmri-physio-log.git
创建时间: 2020-09-13T02:21:44Z
项目社区:https://github.com/datsyl/fmri-physio-log

开源协议:MIT License

下载


fmri-physio-log

Parse Siemens PMU files

PyPI Version

Installation

  1. pip install fmri-physio-log

Overview

This small library parses and loads Siemens PMU files into python. These are *.puls, *.resp, *.ecg and *.ext files produced by the Siemens Physiological Monitoring Unit (PMU) which look something like:

  1. 1 8 20 2 367 508 520 532 638 708 790 5000 1037 1108 1072 1190 1413 5003
  2. ECG Freq Per: 0 0
  3. PULS Freq Per: 72 823
  4. RESP Freq Per: 0 0
  5. EXT Freq Per: 0 0
  6. ECG Min Max Avg StdDiff: 0 0 0 0
  7. PULS Min Max Avg StdDiff: 355 1646 795 5
  8. RESP Min Max Avg StdDiff: 0 0 0 0
  9. EXT Min Max Avg StdDiff: 0 0 0 0
  10. NrTrig NrMP NrArr AcqWin: 0 0 0 0
  11. LogStartMDHTime: 36632877
  12. LogStopMDHTime: 39805825
  13. LogStartMPCUTime: 36632400
  14. LogStopMPCUTime: 39804637
  15. 6003

Usage

By default, PhysioLog takes a string as the only parameter:

  1. import fmri_physio_log as fpl
  2. CONTENT = """\
  3. 1 8 20 2 5002 LOGVERSION 102 6002 5002 TRIGGERMETHOD 10 6002 367 508 520 532 638 708 790 5000 1037 1108 5002
  4. data that spans multiple lines ...
  5. 6002 1072 1190 1413 5003
  6. ECG Freq Per: 0 0
  7. PULS Freq Per: 72 823
  8. RESP Freq Per: 0 0
  9. EXT Freq Per: 0 0
  10. ECG Min Max Avg StdDiff: 0 0 0 0
  11. PULS Min Max Avg StdDiff: 355 1646 795 5
  12. RESP Min Max Avg StdDiff: 0 0 0 0
  13. EXT Min Max Avg StdDiff: 0 0 0 0
  14. NrTrig NrMP NrArr AcqWin: 0 0 0 0
  15. LogStartMDHTime: 36632877
  16. LogStopMDHTime: 39805825
  17. LogStartMPCUTime: 36632400
  18. LogStopMPCUTime: 39804637
  19. 6003
  20. """
  21. log = fpl.PhysioLog.from_string(CONTENT)
  22. log.ts # [367, 508, 520, 532, 638, 708, 790, 1037, 1108, 1072, 1190, 1413]
  23. log.rate # 20
  24. log.params # (1, 8, 20, 2)
  25. log.info # ['LOGVERSION 102', 'TRIGGERMETHOD 10', 'data that spans multiple lines ...']
  26. log.ecg # MeasurementSummary(freq=0, per=0, min=0, max=0, avg=0, std_diff=0)
  27. log.puls # MeasurementSummary(freq=72, per=823, min=355, max=1646, avg=795, std_diff=5)
  28. log.resp # MeasurementSummary(freq=0, per=0, min=0, max=0, avg=0, std_diff=0)
  29. log.ext # MeasurementSummary(freq=0, per=0, min=0, max=0, avg=0, std_diff=0)
  30. log.ext2 # None - since no EXT2 data in this file; otherwise MeasurementSummary
  31. log.nr # NrSummary(nr_trig=0, nr_m_p=0, nr_arr=0, acq_win=0)
  32. log.mdh # LogTime(start=36632877, stop=39805825)
  33. log.mpcu # LogTime(start=36632400, stop=39804637)
  34. # For convenience the start and stop times are available
  35. # as python datetime.time objects as well
  36. log.mdh.start_time # datetime.time(10, 10, 32, 877000)
  37. log.mdh.stop_time # datetime.time(11, 3, 25, 825000)
  38. log.mpcu.start_time # datetime.time(10, 10, 32, 400000)
  39. log.mpcu.stop_time # datetime.time(11, 3, 24, 637000)

From an open file

A PhysioLog object can also be instantiated from an open file

  1. import fmri_physio_log as fpl
  2. with open("sample.puls", "r") as f:
  3. log = fpl.PhysioLog.from_file(f)

From a path

A PhysioLog object can also be instantiated from a file path (either as a string or a pathlib.Path object)

  1. from pathlib import Path
  2. import fmri_physio_log as fpl
  3. # path as string
  4. path_s = "/path/to/my/file.resp"
  5. log = fpl.PhysioLog.from_filename(path_s)
  6. # path as pathlib.Path object
  7. path = Path(path_s)
  8. log = fpl.PhysioLog.from_filename(path)

Implementation References

The following sources were referenced in constructing the grammar:

Contributing

  1. Have or install a recent version of poetry (version >= 1.8)
  2. Fork the repo
  3. Setup a virtual environment (however you prefer)
  4. Run poetry install
  5. Run pre-commit install
  6. Add your changes (adding/updating tests is always nice too)
  7. Commit your changes + push to your fork
  8. Open a PR

[!IMPORTANT]
If you are marking changes to the grammar (src/grammar.lark), you will need to regenerate the parser (src/fmri_physio_log/_generated.py) which can be done by running lark, for example:

  1. python -m lark.tools.standalone src/grammar.lark > src/fmri_physio_log/_generated.py