orblet 
Atoms for Keplerian orbit analysis. Forward models, likelihoods, design matrices and linear solves, period search, element conversion, plotting — each a function that takes arrays and returns a result, with its units, frames and assumptions stated in its docstring.
orblet is not a solver. It does not know what a Gaia epoch is, does not read files, and does not contact the network. You build the pipeline; orblet supplies the pieces.
from orblet import ti_design_matrix, linear_solve_ti, ti_to_kepler
X = ti_design_matrix(t_mjd, psi_rad, parallax_factor_al, P_days, e, tau, epoch_ref_mjd)
fit = linear_solve_ti(along_scan_mas, sigma_mas, X)
elements = ti_to_kepler({"A": fit.beta[0], "B": fit.beta[1], "F": fit.beta[2], "G": fit.beta[3]})
Install
orblet is not on PyPI yet. Install it from the repository:
pip install "orblet[all] @ git+https://github.com/saharsh1/orblet.git"
or from a local clone, which is the right choice while you are editing it:
git clone https://github.com/saharsh1/orblet.git
pip install -e "./orblet[all]"
Drop [all] for the four core dependencies only — numpy, scipy, astropy,
matplotlib — which is all a fresh install needs to run the atoms and the
quickstarts. The extras (emcee, corner, pandas, tqdm; also available
one at a time as [sampling], [plots], [tables], [progress]) are each
imported inside the one function that uses them, so a missing extra fails
that call with a message naming it and leaves everything else working.
What is here
orblet.model |
forward models: RV curve, along-scan astrometry, Thiele-Innes and Campbell photocentre orbits |
orblet.likelihood |
Gaussian log-likelihoods with jitter, per channel |
orblet.kepler |
the Kepler-equation solver |
orblet.design / orblet.solve |
design-matrix builders and the generalised-least-squares linear solves for RV and astrometry |
orblet.search / orblet.periodogram |
the Thiele-Innes frequency scan; Lomb-Scargle and phase-distance-correlation periodograms |
orblet.elements |
Thiele-Innes → Campbell, NSS convention, element extraction from chains |
orblet.priors |
prior classes and the log-prior composer |
orblet.sampling / orblet.chain_stats |
emcee helpers; quantiles and circular summaries of chains |
orblet.interpret |
companion mass and the astrometric mass-ratio function |
orblet.simulate |
a synthetic-orbit simulator and a parallax-consistent cadence, for tests and tutorials |
orblet.parallax |
per-direction parallax factors from a DE432s ephemeris |
orblet.plotting |
orbit, residual, sky-overlay and corner plots |
The front door — from orblet import <name> — exposes 35 names and imports
nothing heavy: import orblet pulls in no scipy, no matplotlib, no astropy.
Each name resolves on first use.
Conventions
Every public function states them in its docstring. The ones that bite:
- radial velocity: positive is receding;
omegais the primary's argument of periastron - period in days at the public surface (Keplerian years only inside the Kepler solver)
tauis the periastron phase in[0, 1);tp = tau * P + epoch_ref_mjd- astrometric amplitudes
A, B, F, Gare photocentre amplitudes in mas, positive-amplitude convention; the parallax term enters asparallax_mas * parallax_factor_al, additive - Gaia's
pmrais alreadymu_alpha*— never applycos(dec)again - a seed is initialisation, never a prior: a starting point for a sampler carries no evidence
Four laws, each a test
- A public name is the object it claims to be — no silent wrappers.
- The numerical core does not move: byte-identity baselines pin the forward models, the likelihoods and the design columns.
- Conventions hold: RV sign, primary-frame ω, τ → tp, time scales.
- orblet imports nothing outside itself, the four dependencies and the standard library.
Status
Grew inside the gaia-orbits repository until 2026-09-24; developed here
since, and consumed there as an installed dependency.
Three simulator presets ship. OrbitSimulator.bh1_like() is the one the
quickstarts use, through load_simulated_inputs(scenario="bh1"): an
illustrative orbit on an invented sky position, with a cadence whose parallax
factor is coupled to that position, so injecting and removing the parallax
signal use the same array and closure is exact. toy_orbit() is a compact
short-period orbit for quick smoke tests. bh3_like() carries orbital numbers
rounded from a published system and is useful for a realistic-looking truth;
pair it with DemoParallaxConsistentCadence for anything closure-grade. The
scenario= parameter and the bh1/toy naming are slated to be simplified.
Licence
MIT.
Release files for orblet 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| orblet-0.1.0.tar.gz | 280.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| orblet-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 502.7 kB
Release files / orblet-0.1.0.tar.gz
| Download URL | orblet-0.1.0.tar.gz |
|---|---|
| Size | 280.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
72ad27549fcb4e86933ac867dfdacac221456a20850e7cb441b41f06a38ac8f6
|
|
BLAKE2b-256 checksum How to use checksums |
854068e15d556dd5580fc72f9affad4e64a283877127a083da58362504977a12
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|
Release files / orblet-0.1.0-py3-none-any.whl
| Download URL | orblet-0.1.0-py3-none-any.whl |
|---|---|
| Size | 222.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c055d573b169de3c6d53849452960b7ce6420da1997703876638eb336b1c2239
|
|
BLAKE2b-256 checksum How to use checksums |
085cbdb07ed33f35ee2f8c8437f92825ac40d32f0a9075c442c8fcf82a210d97
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|