"""The event-report PDF must draw the three geo channels on ONE shared Y scale (max |sample| across Long/Vert/Tran, floored), not each trace auto-zoomed to its own peak — so relative amplitudes are honest and a small channel doesn't fill its lane looking as big as a large one. Mirrors the event-modal waveform behaviour. """ import matplotlib matplotlib.use("Agg") import matplotlib.pyplot as plt import pytest from sfm.report_pdf import ReportData, _draw_waveform_subplot def _draw(channels): rd = ReportData( channels=channels, sample_rate_sps=1024, dt_ms=1000.0 / 1024, t0_ms=0.0, ) fig = plt.figure() cell = fig.add_gridspec(1, 1)[0, 0] _draw_waveform_subplot(fig, cell, rd) by_label = {ax.get_ylabel(): ax for ax in fig.axes} try: yield_ = {k: by_label[k].get_ylim() for k in ("Long", "Vert", "Tran", "MicL")} finally: plt.close(fig) return yield_ def test_geo_traces_share_one_y_scale(): # Tran is the biggest geo channel (0.35); Long 0.10, Vert 0.02. ylims = _draw({ "Long": [0.10, -0.10, 0.0], "Vert": [0.02, -0.02, 0.0], "Tran": [0.35, -0.35, 0.0], "MicL": [0.0005, -0.0005, 0.0], }) # Shared scale = max(0.35 * 1.10, floor 0.05) = 0.385, symmetric. expected = pytest.approx(0.385, rel=1e-6) for ch in ("Long", "Vert", "Tran"): lo, hi = ylims[ch] assert hi == expected, f"{ch} top ylim {hi} != shared 0.385" assert lo == pytest.approx(-0.385, rel=1e-6), f"{ch} bottom ylim {lo}" # All three geo lanes identical. assert ylims["Long"] == ylims["Vert"] == ylims["Tran"] # Mic keeps its own (much smaller) scale — not lumped into the geo max. assert ylims["MicL"][1] < 0.01 def test_geo_shared_scale_has_floor(): # A tiny event (all geo well under the floor) clamps to the 0.05 floor. ylims = _draw({ "Long": [0.008, -0.008, 0.0], "Vert": [0.006, -0.006, 0.0], "Tran": [0.010, -0.010, 0.0], "MicL": [0.0001, -0.0001, 0.0], }) for ch in ("Long", "Vert", "Tran"): assert ylims[ch][1] == pytest.approx(0.05, rel=1e-6), f"{ch} not floored"