Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Interpolation of physio objects after peak detection does not interpolate peaks/troughs #3

Open
smoia opened this issue Apr 19, 2024 · 0 comments
Labels
Bug Something isn't working Urgent If you don't know where to start, start here!

Comments

@smoia
Copy link
Member

smoia commented Apr 19, 2024

Quick check inspired by PR#5 in physioqc.
When resampling a physio object post peak detection, the indexes of peaks and troughs are not interpolated.

Expected Behavior

Say p is a physio object with fs=4, on which peak detection was performed. g is the downsampled version of p to fs=2, h is the upsampled version of p to fs=8.

Either:

In [25]: len(p)
Out[25]: 100

In [26]: p.peaks
Out[26]: array([14, 17, 29, 31, 38, 40, 53, 56, 58, 65, 81, 87, 91, 96])

In [27]: len(g)
Out[27]: 50

In [28]: g.peaks
Out[28]: array([7, 9, 15, 16, 19, 20, 27, 28, 29, 33, 41, 44, 46, 48])
# Eventually, cases like that 15-16, 19-20, 27-28-29 should be solved by running a quick local maxima detection - in fact the maxima detection should be run on all neighbours of the index, especially when the modulo of the partition is not 0.

In [29]: len(h)
Out[29]: 200

In [30]: h.peaks
Out[30]: array([28,  34,  58,  62,  76,  80, 106, 112, 116, 130, 162, 174, 182, 192])

Or raise a warning on resampling (specifically downsampling) that peak data will be removed.

Actual Behavior

In [25]: len(p)
Out[25]: 100

In [26]: p.peaks
Out[26]: array([14, 17, 29, 31, 38, 40, 53, 56, 58, 65, 81, 87, 91, 96])

In [27]: len(g)
Out[27]: 50

In [28]: g.peaks
Out[28]: array([14, 17, 29, 31, 38, 40, 53, 56, 58, 65, 81, 87, 91, 96])

In [29]: len(h)
Out[29]: 200

In [30]: h.peaks
Out[30]: array([14, 17, 29, 31, 38, 40, 53, 56, 58, 65, 81, 87, 91, 96])

(same for troughs btw).

Steps to Reproduce the Problem

import numpy as np
import peakdet as pk
import matplotlib.pyplot as plt
a = np.random.randn(100)
p = pk.Physio(a, fs=4)
pk.plot_physio(p)
plt.show()
p = pk.peakfind_physio(p)
pk.plot_physio(p)
plt.show()
g = pk.interpolate_physio(p, 2)
h = pk.interpolate_physio(p, 8)
plt.show(g)
pk.plot_physio(g)
len(p)
p.peaks
len(g)
g.peaks
len(h)
h.peaks

Specifications

- Python version: 3.8.10
- peakdet version: 0.3.0
- Platform: Ubuntu

Possible solution

Best:

  1. compute the new indexes of peaks and troughs based on the resampling ratio (target fs / current fs)
  2. understand if rounding the computed indexes (up/down/both) constantly hits the new true peaks after resampling
  3. on downsampling, run local maxima detection (two neighbouring indexes, for a total of 2-3) especially when peak indexes are clustered together (see expected behaviour output)
  4. on upsampling, if (2) does not hit the right index all the time, implement a maxima detection on neighbouring indexes (5 adjacent or based on resampling ratio)

Less good but fair: remove peak and trough metadata on down-/re-sampling, raise a warning, invite to run peak detection again (and remind that the history can help repeat steps so far).

@smoia smoia added Bug Something isn't working Urgent If you don't know where to start, start here! labels Apr 19, 2024
@maestroque maestroque self-assigned this Jun 1, 2024
@m-miedema m-miedema transferred this issue from physiopy/peakdet Jul 25, 2024
@maestroque maestroque removed their assignment Sep 21, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Bug Something isn't working Urgent If you don't know where to start, start here!
Projects
Status: Priority to-dos
Development

No branches or pull requests

2 participants