Repository navigation
feat: derive the box download window from a published acoustic envelope - #23
Merged
Merged
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
track_to_box_windowspadded every box window withpost_pad_minutes=13and bounded it withcorridor_km=100. Both were unexplained constants. The post-pad is 82.8% of every byte the pipeline downloads (a typical box window is 120 s pre-pad + ~42 s of actual transit + 780 s post-pad), so the dominant cost term in the whole pipeline had no stated basis, and neither did the corridor that determines how many stations get queried.Neidhart et al. (2021), PASA 38, e016 supplies both, from a survey of 1,410 fireballs against the Australian National Seismograph Network.
What changes
The post-pad is now derived:
All three constants are cited:
Resulting window by corridor width:
corridor_kmAbove ~190 km the envelope binds and the pad stops growing, since no signal has ever been observed from farther away.
Changed default behaviour
corridor_kmdefaults to 200 km, up from 100. Roughly twice the stations queried per box, so expect download volume to roughly double. This is deliberate: it buys coverage to the edge of the published detectability envelope.corridor_km=100, post_pad_minutes=13restores the previous behaviour exactly.No API is broken by this: no signature is incompatible, no call site needs editing, and nothing raises. Existing code runs unchanged and produces valid output, it just downloads more of it.
The derived pad at the new default is 12.94 min against the previous fixed 13, so the window length itself barely moves. What changes is that it now responds to
corridor_km, which it previously did not.Also
celerity_km_s(0.30) andmargin_seconds(60) totrack_to_box_windowsandrun_pipeline. Celerity is the largest lever here: the paper's ±60 m/s spans 10.95 to 15.93 minutes of pad at the default corridor.post_pad_minutesshorter than the corridor requires, and acorridor_kmabove 210 km (the widest ground offset consistent with a 215 km slant envelope, since the object is always at altitude).derive_post_pad_minutesandmax_corridor_kmare exported so a caller can check what window a configuration implies before running.derive_post_pad_minutesraisesValueErroron non-positive celerity. It previously returned a negative pad, which would placet_download_endbeforet_exit— an inverted window indistinguishable from a short download.Verification
All eight onsets reported in two independent papers (Eickhoff et al. 2026 for Starlink-2382, Hupe et al. 2026 for the Falcon 9 R/B) still fall inside the download window under the new defaults, at both 100 km and 200 km corridors. The largest pad any of them needed was 2.27 minutes.
222 tests pass. Each of the five commits is green independently.
tests/test_regression_shenzhou15.pyis untouched — it pins every parameter explicitly, so its passing is the check that the override path still works.Caveats worth knowing
margin_seconds = 60is smaller than the 100-200 s of measured SGP4 along-track error. It works because the acoustic term carries ~400 s of unused headroom at a 200 km corridor. That slack shrinks as the corridor narrows and should be revisited if narrow corridors become routine.