aboutsummaryrefslogtreecommitdiff
path: root/tests/test_resample_integration.py
blob: 930da2ee402f26d8989e3e4dfe63ad14e9a18f10 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
"""Test integration of resampling with detect_from_wfm."""

import numpy as np
import pytest

from transivent import detect
from transivent.resample import average_downsample, downsample_to_interval


def test_detect_with_resampled_data():
    """Test that detect works correctly with resampled data."""
    # Create synthetic 20 MHz data with known events
    fs = 20e6  # 20 MHz sampling
    fs_target = 2e6  # 2 MHz target
    duration = 0.001  # 1 ms (smaller for faster test)
    t_orig = np.arange(int(duration * fs)) / fs
    x_orig = np.random.randn(len(t_orig)) * 0.01  # Noise
    
    # Add a few events
    event_times = [0.0002, 0.0005, 0.0008]
    for t_event in event_times:
        idx = int(t_event * fs)
        width = int(5e-4 * fs)  # 500 µs event (longer for better detection)
        x_orig[idx:idx+width] -= 1.0  # Stronger negative spike
    
    # Resample data (downsample by factor of 10)
    t_down, x_down = average_downsample(t_orig, x_orig, q=10)
    
    # Lower noise after resampling
    noise_level = np.std(x_down[:1000])  # Using quiet portion
    print(f"Noise level: {noise_level:.4f}")
    
    # Detect on resampled data
    results = detect(
        t_down,
        x_down,
        sampling_interval=10 / fs,
        detection_snr=3.0,  # Higher threshold
        min_event_keep_snr=5.0,
        smooth_win_t=100e-6,  # Shorter smoothing for test data
        save_plots=False,
    )
    
    # Check events were detected
    print(f"Found {len(results['events'])} events")
    assert len(results['events']) >= 1
    
    # Check the time array is uniform
    dt = t_down[1] - t_down[0]
    assert np.allclose(np.diff(t_down), dt, rtol=1e-6)
    
    # Check the resampled time interval
    assert np.isclose(dt, 1/fs_target, rtol=1e-6)


def test_resample_preserves_events():
    """Test that resampling preserves event detection."""
    # Create simple test case
    fs = 1e6  # 1 MHz
    t = np.arange(10000) / fs
    x = np.zeros(10000)
    
    # Add a clear event
    event_start = 2000
    event_width = 100
    x[event_start:event_start + event_width] = -1.0
    
    # Resample by factor of 10
    t_down, x_down = average_downsample(t, x, q=10)
    
    # Event should still be detectable after resampling
    # The negative area should be preserved (averaging)
    assert np.min(x_down) < -0.5  # Event should still be negative
    
    # Check the time array is proper
    assert len(t_down) == len(x_down) == 1000
    assert np.allclose(t_down[1] - t_down[0], 10 * (t[1] - t[0]))


if __name__ == "__main__":
    pytest.main([__file__, "-v"])