Skip to main content

SOPP is an open-source tool for calculating satellite interference to radio astronomy observations.

Project description

SOPP - Satellite Orbit Prediction Processor

CI/CD CI - Test CD - Build
Docs Docs
Package PyPI - Version PyPI - Downloads PyPI - Python Version

SOPP is a high-performance Python library and CLI tool designed to predict satellite interference for radio astronomy observations.

It uses vectorized orbital mechanics (via Skyfield/SGP4) to simulate thousands of satellites against observation schedules, identifying when a satellite crosses a telescope's main beam or rises above the horizon.

Installation

Install via pip:

# Core library only
pip install sopp

# With CLI tools
pip install "sopp[cli]"

CLI Usage

SOPP provides a command-line interface for running simulations and managing data.

1. Download Data

First, download the latest TLE (Two-Line Element) data. By default, this pulls active satellites from Celestrak.

sopp download-tles

2. Run a Simulation

Run a simulation using a configuration file (see below).

sopp run --config my_config.json

3. Ad-Hoc Analysis

You can override configuration parameters directly from the CLI without editing the file.

# Check for Starlink interference in the next 30 minutes
sopp run --config my_config.json \
    --search STARLINK \
    --orbit leo \
    --start 2025-01-01T12:00:00 \
    --duration 30

Common Options:

  • --mode [all|horizon|interference]: Choose what to calculate.
  • --limit 10: Only show the first 10 results.
  • --local-time: Display timestamps in your system's local timezone.
  • --format json: Output machine-readable JSON.

Configuration

SOPP uses a JSON configuration file to define the observation parameters.

Example config.json

{
  "facility": {
    "name": "HCRO",
    "latitude": 40.8178049,
    "longitude": -121.4695413,
    "elevation": 986,
    "beamwidth": 3.0
  },
  "frequencyRange": {
    "frequency": 135.0,
    "bandwidth": 10.0
  },
  "reservationWindow": {
    "startTimeUtc": "2026-01-13T12:00:00",
    "endTimeUtc": "2026-01-13T13:00:00"
  },
  "observationTarget": {
    "declination": "-38d6m50.8s",
    "rightAscension": "4h42m"
  },
  "runtimeSettings": {
    "concurrency_level": 4,
    "time_resolution_seconds": 1.0,
    "min_altitude": 0.0
  }
}

Configuration Sections

Section Description
facility Defines the ground station location (Lat/Lon/Elev) and antenna beamwidth (degrees).
frequencyRange Defines the observation frequency (MHz). Satellites transmitting outside this range are ignored.
reservationWindow The start and end time of the observation.
runtimeSettings Controls simulation fidelity. time_resolution_seconds determines the step size (default 1.0s).

Antenna Pointing Modes

You must provide one of the following sections to define where the antenna is pointing:

  1. observationTarget: Tracks a celestial object (RA/Dec).
    "observationTarget": { "declination": "...", "rightAscension": "..." }
    
  2. staticAntennaPosition: Points at a fixed Azimuth/Elevation.
    "staticAntennaPosition": { "azimuth": 180.0, "altitude": 45.0 }
    
  3. antennaPositionTimes: A custom trajectory (list of time/az/el points).

Python Library Usage

SOPP is designed to be imported and used directly in Python scripts/projects.

from sopp.config.builder import ConfigurationBuilder
from sopp.filtering.presets import filter_name_does_not_contain
from sopp.models.ground.receiver import Receiver
from sopp.sopp import Sopp

# Build Configuration
config = (
    ConfigurationBuilder()
    .set_facility(
        latitude=40.8, longitude=-121.4, elevation=986, name="HCRO",
        receiver=Receiver(beamwidth=3),
    )
    .set_runtime_settings(concurrency_level=4)
    .set_time_window(begin="2026-01-13T19:00:00", end="2026-01-13T20:00:00")
    .set_frequency_range(bandwidth=10, frequency=135)
    # Cygnus A
    .set_observation_target(declination="40d44m", right_ascension="19h59m")
    .load_satellites(tle_file="satellites.tle")
    .add_filter(filter_name_does_not_contain("STARLINK"))
    .build()
)

print(f"Running interference simulation for {len(config.satellites)} satellites:")

# Run Engine
engine = Sopp(config)
interference_events = engine.get_satellites_crossing_main_beam()

# Analyze Results
print(f"Found {len(interference_events)} interference events:")

for event in interference_events:
    print(f"--- {event.satellite.name} ---")
    print(f"  Window:   {event.overhead_time.begin} -> {event.overhead_time.end}")
    print(f"  Duration: {event.duration_seconds:.1f} seconds")
    print(f"  Peak Elev: {event.peak_elevation:.1f} deg")

Data Sources

  • TLE Data: Sourced from Celestrak (public) or Space-Track.org (requires account/env vars).
  • Frequency Data: Optional CSV file to populate satellite transmission frequency. SSDB Format: ID, Name, Frequency, Bandwidth.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sopp-0.9.2.tar.gz (94.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sopp-0.9.2-py3-none-any.whl (69.8 kB view details)

Uploaded Python 3

File details

Details for the file sopp-0.9.2.tar.gz.

File metadata

  • Download URL: sopp-0.9.2.tar.gz
  • Upload date:
  • Size: 94.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for sopp-0.9.2.tar.gz
Algorithm Hash digest
SHA256 fac2fd5ebcbfcb35674a3b0c238498a95b01300c7611b347e993d3dfdaf8a2c3
MD5 3620f4ce7990caa9f7bea1ec68eb8a74
BLAKE2b-256 a219032e7724c80f4ebff767ab0d4d85d0fbc723f06f60f513906d982d3acaeb

See more details on using hashes here.

Provenance

The following attestation bundles were made for sopp-0.9.2.tar.gz:

Publisher: cd.yml on NSF-Swift/satellite-overhead

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sopp-0.9.2-py3-none-any.whl.

File metadata

  • Download URL: sopp-0.9.2-py3-none-any.whl
  • Upload date:
  • Size: 69.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for sopp-0.9.2-py3-none-any.whl
Algorithm Hash digest
SHA256 fe407670301a5a529b4890023acbee88edcc5becd33d0dfbcab9834ed40cfe5b
MD5 d82953f6b772411f7d093a2b8d8150ea
BLAKE2b-256 b9ca9d8090d82d1f4282a8313d996302298915cfdf470854dee8232cbc99e694

See more details on using hashes here.

Provenance

The following attestation bundles were made for sopp-0.9.2-py3-none-any.whl:

Publisher: cd.yml on NSF-Swift/satellite-overhead

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page