McDowell Arc is an experimental scientific software tool for drag-aware trajectory fitting and uncertainty analysis from simplified webcast-style trajectory observations.
It estimates nominal perigee/apogee values, confidence intervals, and the probability that a fitted perigee remains above a selected atmospheric threshold.
The v0.2 architecture separates the project into two parts:
mcdowell-arc— Python CLI, CSV loading, reporting, validation, and scientific workflow.mcdowell-arc-core— Rust acceleration core exposed to Python through a native extension.
The goal is to keep the tool easy to use from Python while moving performance-sensitive trajectory calculations into a faster compiled backend.
Named in honor of Jonathan McDowell's challenge to improve near-orbital trajectory fitting. This project is not affiliated with or endorsed by Jonathan McDowell unless explicitly stated.
McDowell Arc is currently an engineering MVP moving toward production-quality scientific software.
It includes:
- Webcast-style CSV ingestion
- Weighted trajectory fitting
- Simplified drag-aware dynamics
- Earth-rotation-aware drag-relative velocity
- Monte Carlo uncertainty propagation
- Nominal perigee/apogee reporting
- Confidence interval reporting
- Probability estimate for perigee above an atmospheric threshold
- Python backend
- Rust acceleration backend through
mcdowell-arc-core - Backend selection with
--backend auto|python|rust - Environment diagnostics with
mcdowell-arc doctor - Test coverage for Python and Rust-backed behavior
Scientific caveat: the current model is still simplified. It is useful for development, experimentation, validation workflows, and early trajectory-analysis research, but it is not yet publication-grade orbital determination software.
mcdowell-arc/
├── mcdowell_arc/ # Python package and CLI
├── crates/
│ └── mcdowell-arc-core/ # Rust/PyO3 acceleration core
├── examples/ # Example CSV input data
├── tests/ # Python test suite
├── docs/ # Scientific and validation notes
├── pyproject.toml # Python package metadata
├── Cargo.toml # Rust workspace metadata
└── README.md
Python 3.10 or newer is recommended.
The project has been tested on Fedora with Python 3.14.
The Rust backend requires Rust and Cargo.
On Fedora:
sudo dnf install -y rust cargoYou can also install Rust through rustup.
Clone the repository:
git clone https://github.com/Bryforge/mcdowell-arc.git
cd mcdowell-arcCreate and activate a virtual environment:
python3 -m venv .venv
source .venv/bin/activateUpgrade packaging tools:
python -m pip install --upgrade pip setuptools wheelInstall the Python package in editable development mode:
python -m pip install -e ".[dev]"Run the tests:
python -m pytest -qRun diagnostics:
mcdowell-arc doctorAt this point, the Python backend should work.
Install maturin:
python -m pip install maturinBuild and install the Rust extension from inside the Rust crate directory:
cd crates/mcdowell-arc-core
maturin develop --release
cd ../..Verify that both packages are installed:
python -m pip list | grep mcdowellExpected result:
mcdowell-arc 0.2.0
mcdowell-arc-core 0.2.0
Verify that Python can import both modules:
python -c "import mcdowell_arc; print('Python package loaded')"
python -c "import mcdowell_arc_core; print('Rust core loaded')"Run the full test suite:
python -m pytest -qExpected result:
12 passed
Run a fit using automatic backend selection:
mcdowell-arc fit examples/sample_webcast.csv --monte-carlo 1000 --atmosphere-km 100 --backend autoForce the Python backend:
mcdowell-arc fit examples/sample_webcast.csv --monte-carlo 1000 --atmosphere-km 100 --backend pythonForce the Rust backend:
mcdowell-arc fit examples/sample_webcast.csv --monte-carlo 1000 --atmosphere-km 100 --backend rustIf the Rust backend is not installed and --backend rust is selected, the command will fail. If --backend auto is selected, the tool will use Rust when available and fall back to Python when needed.
The basic input CSV should contain:
t_s,altitude_km,speed_km_s
0,160.0,7.72
10,158.4,7.70
20,156.8,7.68Required columns:
t_s— time in secondsaltitude_km— observed altitude in kilometersspeed_km_s— observed speed in kilometers per second
Optional uncertainty columns may be added in future model expansions.
The CLI emits JSON output containing fields such as:
{
"optimizer_success": true,
"backend": "rust",
"samples_requested": 1000,
"samples_succeeded": 1000,
"samples_failed": 0,
"nominal": {
"perigee_km": 129.0,
"apogee_km": 2242.0
},
"probability_perigee_above_threshold": 1.0
}Exact values depend on the input data, random seed behavior, model settings, and backend.
Install development dependencies:
python -m pip install -e ".[dev]"
python -m pip install maturinBuild the Rust backend:
cd crates/mcdowell-arc-core
maturin develop --release
cd ../..Run tests:
python -m pytest -qRun diagnostics:
mcdowell-arc doctorRun the example fit:
mcdowell-arc fit examples/sample_webcast.csv --monte-carlo 1000 --atmosphere-km 100 --backend autoMajor next steps:
- Full 3-D trajectory state modeling.
- Observation geometry support: latitude, longitude, azimuth, range, range-rate, and launch-site assumptions.
- Improved atmosphere modeling.
- Better uncertainty modeling for webcast-derived measurements.
- Validation against synthetic truth cases.
- Validation against known historical trajectories where public data is available.
- Parallel Monte Carlo execution.
- Benchmarking Python backend versus Rust backend.
- Plotting and report generation.
- Formal model documentation.
McDowell Arc should evolve toward:
- Reproducible scientific runs
- Versioned model assumptions
- Clear input schemas
- Deterministic test cases
- Synthetic validation datasets
- Backend parity tests
- CI testing for Python and Rust
- Structured JSON output
- Scientific documentation
- Honest uncertainty reporting
Add a license before wider public release.