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, jplephem; also
available one at a time as [sampling], [plots], [tables],
[ephemeris]) 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.
Parallax factors use astropy's built-in solar-system ephemeris by default, with no download. To use a JPL kernel instead:
pip install "orblet[ephemeris]"
python -c "from orblet.parallax import fetch_ephemeris; fetch_ephemeris('de432s')"
then pass ephemeris="de432s". The fetch is a one-time ~10 MB download into
astropy's cache.
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 |
parallax factors from a solar-system ephemeris (Gaia at L2 by default) |
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.
Simulated data
One simulator preset ships, OrbitSimulator.toy_orbit(): an illustrative
orbit that both channels detect strongly, on an invented sky position. The
quickstarts load it through load_simulated_inputs(seed=...), on 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. For any other
truth, construct OrbitSimulator(...) directly and pass it as
load_simulated_inputs(simulator=..., cadence=..., seed=...).
Licence
MIT.
Release files for orblet 0.2.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.2.1.tar.gz | 278.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| orblet-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 499.0 kB
Release files / orblet-0.2.1.tar.gz
| Download URL | orblet-0.2.1.tar.gz |
|---|---|
| Size | 278.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
aaf384fedd5aac44f0cf0b48030a3150757ea3f4f9739aa942dad75c77234930
|
|
BLAKE2b-256 checksum How to use checksums |
7d50d64d3a7bf71e976d48f2e0fcdd96506e9847e1406e284e2e4dd8074e03b8
|
| 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.2.1-py3-none-any.whl
| Download URL | orblet-0.2.1-py3-none-any.whl |
|---|---|
| Size | 220.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
31909e3045925593f6e772ccaf039b5b1615698406695af9d12b91f01e73d567
|
|
BLAKE2b-256 checksum How to use checksums |
ddbfb78d8ff22eef2a32247f4533ac2f943bbeea93553b1d5d31c2117d662c22
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|