fix(bandopen): the moon is not a band opening
A 2 m opening was announced at 9650 km towards Japan. The callsigns gave it away — 7M4RRM, JA7RPC, JF1AWC — all working EME, which is routine on 2 m and reported to PSK Reporter like anything else. Real contacts, real grids, and no evidence whatsoever about the band: an operator turning a beam on that bearing would hear nothing. Removing the flat 2400 km ceiling was right; it threw away genuine multi-hop Es on 6 m. "No limit anywhere" was the overcorrection. The limit is per band now, and it is physics rather than a threshold: 2 m reaches a few thousand kilometres by tropospheric duct or a chain of Es clouds and no further, so 3500 km, and 4 m 4000. Six and ten metres keep no ceiling — multi-hop Es and F2 genuinely do go round the world, which is the case that started all this. Pinned from both sides: the 9650 km Japanese burst produces nothing, and a 2000 km 2 m burst in one sector still counts.
This commit is contained in:
@@ -81,6 +81,28 @@ var watched = map[string]bool{"10m": true, "6m": true, "4m": true, "2m": true}
|
||||
// Watched reports whether a band is one the detector looks at.
|
||||
func Watched(band string) bool { return watched[strings.ToLower(strings.TrimSpace(band))] }
|
||||
|
||||
// maxTerrestrialKm is the longest path a band can carry through the atmosphere.
|
||||
// Zero means no limit.
|
||||
//
|
||||
// The flat 2400 km ceiling was removed because it threw away real multi-hop Es
|
||||
// on 6 m, and that was right — but "no limit anywhere" then let something else
|
||||
// through. A 2 m opening was announced at 9650 km towards Japan, on stations
|
||||
// that were unmistakably working EME: the moon is not an opening, and pointing
|
||||
// an antenna at that bearing would find nothing.
|
||||
//
|
||||
// So the limit is per band, and it is physics rather than a threshold. Two
|
||||
// metres reaches a few thousand kilometres by tropospheric duct or a chain of Es
|
||||
// clouds and no further; beyond that the path went via the moon or a satellite,
|
||||
// neither of which says anything about the band. Six and ten metres have no
|
||||
// ceiling at all — multi-hop Es and F2 genuinely go round the world.
|
||||
var maxTerrestrialKm = map[string]int{
|
||||
"2m": 3500,
|
||||
"4m": 4000,
|
||||
}
|
||||
|
||||
// MaxKmFor returns the plausibility ceiling for a band, 0 for none.
|
||||
func MaxKmFor(band string) int { return maxTerrestrialKm[strings.ToLower(strings.TrimSpace(band))] }
|
||||
|
||||
// Opening is a detected opening, ready to be announced.
|
||||
type Opening struct {
|
||||
Band string `json:"band"`
|
||||
@@ -130,6 +152,12 @@ func (d *Detector) Add(s Spot, lat float64) *Opening {
|
||||
if s.DistKm < d.cfg.MinKm || (d.cfg.MaxKm > 0 && s.DistKm > d.cfg.MaxKm) {
|
||||
return nil
|
||||
}
|
||||
// Past what the atmosphere can carry on this band, the path went via the moon
|
||||
// or a satellite. Those are real contacts and real reports; they are simply
|
||||
// not evidence about the band.
|
||||
if m := MaxKmFor(band); m > 0 && s.DistKm > m {
|
||||
return nil
|
||||
}
|
||||
d.recent = append(d.recent, s)
|
||||
d.prune(s.At)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user