diff options
Diffstat (limited to 'tests/test_simple.py')
| -rw-r--r-- | tests/test_simple.py | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/tests/test_simple.py b/tests/test_simple.py new file mode 100644 index 0000000..e86dbd6 --- /dev/null +++ b/tests/test_simple.py @@ -0,0 +1,185 @@ +#!/usr/bin/env python3 +"""Simple test to verify the event_processor module works.""" + +import sys +sys.path.insert(0, '/home/samsc/me/rsc/transivent/src') + +import numpy as np + +# Test the event_processor module +try: + from transivent import ( + extract_event_waveforms, + calculate_msd_parallel, + calculate_acf, + fit_diffusion_linear, + process_events_for_diffusion, + ) + print("✓ Successfully imported event_processor functions") +except ImportError as e: + print(f"✗ Import error: {e}") + sys.exit(1) + +def test_extract_event_waveforms(): + """Test event waveform extraction.""" + print("\nTesting extract_event_waveforms...") + + # Create test data + t = np.linspace(0, 1, 1000) + x = np.random.normal(0, 0.1, 1000) + + # Add some events + x[200:300] += 1.0 # Event 1 + x[500:600] += 0.5 # Event 2 + + # Define events + events = np.array([[0.2, 0.3], [0.5, 0.6]]) + + # Extract waveforms + waveforms = extract_event_waveforms(t, x, events) + + assert len(waveforms) == 2, f"Expected 2 waveforms, got {len(waveforms)}" + assert len(waveforms[0]) == 100, f"Expected 100 points in first event, got {len(waveforms[0])}" + assert len(waveforms[1]) == 100, f"Expected 100 points in second event, got {len(waveforms[1])}" + + # Check that events have been extracted correctly + assert np.mean(waveforms[0]) > 0.5, "First event should have positive mean" + assert np.mean(waveforms[1]) > 0.2, "Second event should have positive mean" + + print("✓ extract_event_waveforms test passed") + +def test_calculate_msd(): + """Test MSD calculation.""" + print("\nTesting calculate_msd_parallel...") + + # Create a simple Brownian motion trajectory + n_points = 1000 + dt = 1e-6 + D_true = 1e-12 # True diffusion coefficient + + # Generate random walk + np.random.seed(42) + steps = np.random.normal(0, np.sqrt(2 * D_true * dt), n_points) + x = np.cumsum(steps) + + # Calculate MSD + taus, msds, counts = calculate_msd_parallel(x, dt=dt, max_lag=100, n_jobs=1) + + assert len(taus) == 100, f"Expected 100 lag times, got {len(taus)}" + assert len(msds) == 100, f"Expected 100 MSD values, got {len(msds)}" + assert len(counts) == 100, f"Expected 100 counts, got {len(counts)}" + + # Check that MSD increases with time (for diffusive motion) + assert msds[50] > msds[10], "MSD should increase with lag time" + + print("✓ calculate_msd_parallel test passed") + +def test_calculate_acf(): + """Test ACF calculation.""" + print("\nTesting calculate_acf...") + + # Create a simple signal + n_points = 1000 + dt = 1e-6 + x = np.random.normal(0, 1, n_points) + + # Add some correlation + for i in range(1, n_points): + x[i] += 0.5 * x[i-1] + + # Calculate ACF + lags, acf = calculate_acf(x, dt=dt, max_lag=100) + + assert len(lags) == 101, f"Expected 101 lag values (0 to 100), got {len(lags)}" + assert len(acf) == 101, f"Expected 101 ACF values, got {len(acf)}" + + # Check that ACF at lag 0 is variance + assert np.abs(acf[0] - np.var(x)) < 0.1, f"ACF(0) should be variance, got {acf[0]}" + + # Check that ACF decreases with lag (for correlated signal) + assert acf[50] < acf[10], "ACF should decrease with lag time" + + print("✓ calculate_acf test passed") + +def test_fit_diffusion(): + """Test diffusion coefficient fitting.""" + print("\nTesting fit_diffusion_linear...") + + # Create synthetic MSD data + taus = np.linspace(0, 1e-5, 100) + D_true = 1e-12 + msds = 2 * D_true * taus + 0.1 * np.random.normal(0, 1e-24, 100) # Add noise + + # Fit diffusion + D_fit = fit_diffusion_linear(taus, msds, time_limit=3e-5) + + assert not np.isnan(D_fit), "Diffusion coefficient should not be NaN" + assert D_fit > 0, "Diffusion coefficient should be positive" + + # Check that fitted value is close to true value (within 50% due to noise) + assert np.abs(D_fit - D_true) / D_true < 0.5, f"Fitted D ({D_fit}) too far from true D ({D_true})" + + print("✓ fit_diffusion_linear test passed") + +def test_process_events_for_diffusion(): + """Test the high-level wrapper function.""" + print("\nTesting process_events_for_diffusion...") + + # Create test data + t = np.linspace(0, 1, 1000) + x = np.random.normal(0, 0.1, 1000) + + # Add some events + x[200:300] += 1.0 # Event 1 + x[500:600] += 0.5 # Event 2 + + # Define events + events = np.array([[0.2, 0.3], [0.5, 0.6]]) + + # Process events + results = process_events_for_diffusion( + name="test", + sampling_interval=1e-3, # 1 ms + data_path="", + t=t, + x=x, + events=events, + max_lag=50, + n_jobs=1, + ) + + assert "diffusion_coeffs" in results, "Results should contain diffusion_coeffs" + assert "acf_values" in results, "Results should contain acf_values" + assert "event_count" in results, "Results should contain event_count" + assert "statistics" in results, "Results should contain statistics" + + assert len(results["diffusion_coeffs"]) == 2, f"Expected 2 diffusion coeffs, got {len(results['diffusion_coeffs'])}" + assert len(results["acf_values"]) == 2, f"Expected 2 ACF values, got {len(results['acf_values'])}" + assert results["event_count"] == 2, f"Expected event_count=2, got {results['event_count']}" + + print("✓ process_events_for_diffusion test passed") + +def main(): + """Run all tests.""" + print("Running event_processor module tests...") + + try: + test_extract_event_waveforms() + test_calculate_msd() + test_calculate_acf() + test_fit_diffusion() + test_process_events_for_diffusion() + + print("\n✅ All tests passed!") + return 0 + except AssertionError as e: + print(f"\n❌ Test failed: {e}") + return 1 + except Exception as e: + print(f"\n❌ Unexpected error: {e}") + import traceback + traceback.print_exc() + return 1 + +if __name__ == "__main__": + sys.exit(main())
\ No newline at end of file |
