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
pip install "orblet[all]"
To follow the repository instead of a release, install from GitHub:
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.1
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.1.tar.gz | 280.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| orblet-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 502.8 kB
Release files / orblet-0.1.1.tar.gz
| Download URL | orblet-0.1.1.tar.gz |
|---|---|
| Size | 280.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
05d48d5ddf10ba00ccc76ca4e8899c1e5e020ee311d89675496fac1e47909140
|
|
BLAKE2b-256 checksum How to use checksums |
ab20ff411b5565a6eb3ee766e69e4de2c27ea10ec735989d3dc7eff4aeb83c6f
|
| 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.1-py3-none-any.whl
| Download URL | orblet-0.1.1-py3-none-any.whl |
|---|---|
| Size | 222.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2c7dcb2ac584a470550096de28867a5b49f6368db16931eb845d20ad50a6f7f6
|
|
BLAKE2b-256 checksum How to use checksums |
badf5253e66c105805a464248995fb572affea9111a2fdc165a15d05ac1bba63
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|