# Recalibration Analysis Report — 2026-04-13 > Auto-generated by `scripts/recalibrate_algo.py`. This report is the > input for `algo.md` updates — diff against the prior dated section to > see what's actually moved. Connection: `postgres://prop:***@10.0.15.24:5432/prop` Statement timeout: 20min ## Row counts and date ranges | tbl | n | lo | hi | |:---------------------|---------:|:-----------|:-----------| | contacts | 58560 | 1991-05-04 | 2026-03-07 | | era5_profiles | 0 | | | | hrrr_native_profiles | 11472 | 2019-03-09 | 2025-09-21 | | hrrr_profiles | 76151193 | 2016-09-17 | 2026-04-13 | | iemre_observations | 15745 | | | | nexrad_observations | 7286 | 2019-08-17 | 2024-09-22 | | propagation_scores | 10543632 | 2026-04-13 | 2026-04-13 | | rtma_observations | 0 | | | | soundings | 16864 | 1990-06-07 | 2026-03-07 | | surface_observations | 392444 | 1991-05-03 | 2026-04-13 | | terrain_profiles | 58554 | | | ## Data gaps (these should NOT be zero in a healthy prod) - **era5_rows**: 0 - **hrrr_climatology_rows**: 0 - **rtma_rows**: 0 - **metar5_rows**: 0 - **hrrr_complete_contacts**: 44147 - **hrrr_pending_contacts**: 14413 ## Contacts by band (≥902 MHz) | band_mhz | contacts | avg_km | max_km | |-----------:|-----------:|---------:|---------:| | 902 | 36 | 172.000 | 915.000 | | 1296 | 74 | 259.000 | 1497.000 | | 2304 | 15 | 91.000 | 348.000 | | 3456 | 5 | 79.000 | 157.000 | | 5760 | 4 | 97.000 | 148.000 | | 10000 | 53698 | 213.000 | 2393.000 | | 24000 | 3786 | 96.000 | 710.000 | | 47000 | 764 | 66.000 | 343.000 | | 75000 | 108 | 62.000 | 289.000 | | 122000 | 35 | 27.000 | 139.000 | | 134000 | 5 | 65.000 | 157.000 | | 142000 | 4 | 47.000 | 79.700 | | 145000 | 2 | 40.000 | 79.600 | | 241000 | 15 | 29.000 | 114.400 | | 288000 | 1 | 1.000 | 1.246 | | 322000 | 1 | 1.000 | 1.400 | | 403000 | 1 | 1.000 | 1.400 | | 411000 | 1 | 0.000 | 0.050 | ## Monthly sounding ducting | month | soundings | ducting_pct | avg_min_grad | avg_pwat | |--------:|------------:|--------------:|---------------:|-----------:| | 1 | 95 | 28.400 | -171.400 | 10.900 | | 2 | 131 | 29.000 | -163.100 | 7.900 | | 3 | 81 | 17.300 | -148.100 | 9.400 | | 4 | 107 | 38.300 | -190.100 | 15.700 | | 5 | 311 | 51.800 | -286.400 | 25.600 | | 6 | 380 | 69.500 | -355.900 | 32.000 | | 7 | 292 | 67.800 | -296.000 | 29.300 | | 8 | 2572 | 54.900 | -261.200 | 34.600 | | 9 | 2335 | 56.200 | -279.800 | 27.200 | | 10 | 155 | 57.400 | -307.100 | 19.300 | | 11 | 158 | 50.000 | -256.700 | 12.000 | | 12 | 140 | 25.700 | -185.200 | 10.800 | ## HRRR native-profile duct distribution (best supportable band) | band_bin | profiles | avg_inv_top_m | avg_theta_e_jump | avg_richardson | |:-----------|-----------:|----------------:|-------------------:|-----------------:| | 15-30 GHz | 10 | 2091.000 | 5.900 | 8.690 | | 30-75 GHz | 4 | 3860.000 | 5.000 | 12.120 | | 5-15 GHz | 98 | 4408.000 | 25.700 | 12.550 | | <5 GHz | 1432 | 2097.000 | 5.400 | 18.420 | | none | 9928 | 11497.000 | 80.500 | 38.270 | ## Contact ↔ HRRR per-band Pearson correlations (matched n=1020) | band_mhz | n | rho_pr | rho_dpc | rho_pwat | rho_sref | rho_grad | rho_tc | rho_hpbl | |-----------:|--------:|---------:|----------:|-----------:|-----------:|-----------:|---------:|-----------:| | 1296.000 | 63.000 | -0.446 | 0.150 | -0.004 | 0.321 | -0.308 | -0.313 | -0.383 | | 10000.000 | 680.000 | -0.101 | 0.043 | 0.004 | 0.179 | -0.136 | -0.109 | -0.206 | | 24000.000 | 147.000 | -0.291 | -0.180 | -0.221 | 0.094 | -0.032 | -0.299 | -0.218 | | 47000.000 | 75.000 | -0.111 | 0.016 | 0.007 | 0.217 | -0.175 | 0.089 | -0.154 | ## 10 GHz: HPBL bin distance distribution | bin | n | avg_km | p50_km | |:----------|----:|---------:|---------:| | <200 | 56 | 221.800 | 176.000 | | 200-500 | 177 | 193.700 | 160.000 | | 500-1000 | 178 | 153.200 | 126.000 | | 1000-1500 | 100 | 158.400 | 132.500 | | 1500-2000 | 95 | 142.900 | 134.000 | | >=2000 | 74 | 100.300 | 90.000 | ## 10 GHz: pressure bin distance distribution | bin | n | avg_km | p50_km | |:----------|----:|---------:|---------:| | <990 | 101 | 212.100 | 134.000 | | 990-1000 | 538 | 155.400 | 128.000 | | 1000-1010 | 28 | 164.600 | 115.000 | | 1010-1020 | 2 | 23.000 | 23.000 | | >=1020 | 11 | 103.100 | 23.000 | ## NEXRAD composite reflectivity vs distance (matched n=102) Sanity check for the rain-attenuation direction: at rain-sensitive bands higher `max_dbz` should map to shorter contacts. At 10 GHz the effect should be barely detectable. **10 GHz:** | bin | n | avg_km | p50_km | |:-----------------|----:|---------:|---------:| | none (<5) | 59 | 155.700 | 143.000 | | drizzle (5-20) | 7 | 56.400 | 49.000 | | light (20-30) | 13 | 95.200 | 40.000 | | moderate (30-45) | 4 | 97.200 | 92.000 | | heavy (>=45) | 1 | 213.000 | 213.000 | **24 GHz:** | bin | n | avg_km | p50_km | |:-----------------|----:|---------:|---------:| | none (<5) | 5 | 29.800 | 23.000 | | drizzle (5-20) | 1 | 49.000 | 49.000 | | light (20-30) | 5 | 34.000 | 40.000 | | moderate (30-45) | 1 | 60.000 | 60.000 | ## hrrr_native_profiles.best_duct_band_ghz vs distance (matched n=619) Validates the 1.15× boost in `Scorer.score_refractivity/4`: contacts where the native duct supports the target band should run longer than those where it does not. **10 GHz:** | bin | n | avg_km | p50_km | |:-------|--------:|---------:|---------:| | none | 447.000 | 140.800 | 128.000 | | <5 GHz | 38.000 | 150.000 | 114.500 | **24 GHz:** | bin | n | avg_km | p50_km | |:-------|-------:|---------:|---------:| | none | 97.000 | 47.600 | 32.000 | | <5 GHz | 3.000 | 56.300 | 60.000 | **47 GHz:** | bin | n | avg_km | p50_km | |:------|-------:|---------:|---------:| | none | 16.000 | 54.700 | 42.000 | ## Commercial-link rx_power degradation vs contemporaneous DFW contacts (matched n=0) _No DFW-zone contacts fall inside the commercial_samples date window yet. Expected to stay empty until the Aug/Sep contest season produces contacts that overlap with live SNMP polling._