All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog.
1.4.1 — 2026-04-28
processor.py:ChannelSensitivityCorrectionFactortag now accessed with a safe fallback (1.0) instead of a bare attribute access that would crash on non-standard DICOM filesprocessor.py:ChannelSensitivityUnitsSequencenow handled with a fallback to'uV'when the sequence is absentplotter.py:ChannelSourceSequencenow accessed safely; missing sequence falls back to a generic label (Ch{n})plotter.py:PatientNametag now read viadicom.get()to avoidAttributeErroron files where the tag is absentplotter.py: invalid layout ID now raises a clearValueErrorinstead of a crypticKeyErrorreader.py: WADO requests now include a 30 s timeout and callraise_for_status(), with a readable error message on failureecg.py: added publicclose()method and context manager support (with ECG(...) as ecg:)dicom-ecg-plot: removed Python 2 stdout fallback (project is Python 3 only)i18n.py: locale path is now absolute and relative to the module file, independent of the working directory
- Rewrote README in English: added About section, Features list, options table, layout table, configuration section, and authors
1.4.0 — 2026-03-14
Major refactor: the monolithic ECG class has been split into focused modules and the scipy dependency has been removed.
ecg/reader.py— DICOM reading and metadata extractionecg/processor.py— waveform signal extraction and scalingecg/plotter.py— Matplotlib rendering logicecg/dsp.py— pure-Python DSP (Butterworth lowpass filter), replacingscipy--paper letteroption in the CLI- Graceful error handling in the CLI (invalid files, missing tags)
- Lead labels now resolved via DICOM
CodeValuelookup instead of text manipulation - DICOM date and patient age parsing made more robust (handles missing or malformed tags)
- All internal comments and docstrings translated from Italian to English
scipydependency
1.3.5 — 2025-07-25
- Plot area height calculation was incorrect in some layouts
- 6×2 layout was rendering lead V1 twice instead of the correct lead pair
1.3.3 — 2022-01-28
- Unknown or missing
VRatetag no longer raises an unhandled exception
1.3.2 — 2021-04-13
- Acquisition date/time missing or malformed in DICOM no longer causes a crash
1.3.1 — 2020-11-11
papertypeargument removed fromsavefigcall (deprecated in Matplotlib)MaxNLocator/AutoMinorLocatornumticksargument coerced toint- WADO response decoded as binary string correctly
- Broken pip package from previous release
1.3.0 — 2020-05-11
- Ventricular rate read from the
VRateDICOM tag
1.2.0 — 2019-09-06
- Project renamed from
dicomecg_converttodicom-ecg-plotand published on PyPI - Migrated to
pydicom(dropped the legacydicomimport) - Binary output to stdout handled correctly on Python 3
1.1.0 — 2018-02-26
- Full Python 2 → Python 3 migration
1.0.0 — 2016-07-18
- WADO
contentTypeset toapplication/dicom
- 2015 — Strip microseconds from acquisition date; handle invalid DICOM gracefully
- 2014 — Optional automated interpretation text (
--interpretation); i18n/l10n support - 2013 — Initial release: DICOM waveform decoding, 3×4+1 / 3×4 / 6×2 layouts, WADO retrieval, Butterworth lowpass filter, configurable institution name, multiple output formats