How hot should a rocky exoplanet be, given the starlight it receives? We use Calor to compare that expectation with dayside emission measurements and explore how residual formation heat, tides, and induction heating could contribute to thermal excesses in planets orbiting M dwarfs, or "M-Earths." A high temperature gets our attention. Establishing which process supplies the heat takes more than a temperature alone. We describe the calculations and science case in Lin & Daylan (2026).
The two Jupyter notebooks and their input data reproduce the analysis and figures from our paper.
Set CALOR_PATH to the checkout directory when using Calor from another location. If it is unset, the package uses its checkout root. Local inference products belong in the ignored data/ directory; example figures are saved directly in the ignored visuals/ directory.
-
reproduce_figures.ipynbreproduces figures from our paper, except for Fig. 3, 10, and 11. -
analyze_R_vs_Tirranalyzes the observational data of rocky exoplanets with dayside emission temperature measurements and generates Fig. 3, 10, and 11. -
Data_all_planets.csvcontains exoplanet system data from both the NASA Exoplanet Archive and the PlanetS catalog, as well as parameters derived in our study Lin & Daylan (2026), such as the thermal emission potential$\Delta R$ . -
Data_observed_planets.csvcontains observed parameters for rocky exoplanets with dayside emission temperature characterizations by JWST or Spitzer. -
Coy_et_al_2025_Table2.csvandIto_et_al_2015_P_T.csvcontains relevant data from the literature. Check out Coy et al. (2025), Ito et al. (2015), and our scripts for their physical meanings and how they are used. -
Tirr_Roche_boundaries.csvcontains pre-computed$T_{\rm irr}$ boundaries corresponding to the Roche limit distances of exoplanets in our sample. - The folder
MR_curvescontains exoplanet mass-radius curves computed using theCORGIplanetary interior composition and structure code. For details aboutCORGI, check out Lin et al. (2025).
We also use PCAT to ask how many changes in slope the temperature-ratio data support, instead of fixing that number in advance. calor.infer_temperature_regimes samples a continuous broken power law for
The default count prior is Poisson with mean 1, normalized over zero through three breakpoints. The initial-segment normalization is log-uniform over 0.2 to 2. Initial slopes and slope changes have uniform priors from -2 to 2. Break temperatures are log-uniform over the supplied interval, defaulting to the observed temperature range. These priors are configurable and should be checked for the intended comparison.
The Gaussian likelihood marginalizes supplied irradiation-temperature errors with Gaussian quadrature. Ratio errors can use the existing notebook's symmetric approximation
Install Calor and its local source dependencies from the Calor repository root:
python -m pip install -e . -e /path/to/pcat -e /path/to/tdpy -e /path/to/chalcedonReplace each /path/to/... value with the location of that package's checkout.
From Python, supply the measured temperatures, ratios, and their uncertainties:
from calor import infer_temperature_regimes
posterior = infer_temperature_regimes(
temperature_kelvin, measured_ratios, ratio_uncertainties,
temperature_uncertainties,
maximum_breaks=3, number_chains=4, seed=42,
)The result retains every variable-sized breakpoint catalog, base parameters, count probabilities, full count traces, log posterior values, and move acceptance counts. Compare independent chains, inspect count transitions, test quadrature convergence, and check prior sensitivity before interpreting the posterior. A short smoke run confirms that the workflow executes. Use longer runs to assess convergence and evidence uncertainty.
The PCAT analysis estimates a variable-break model from the observational data in analyze_R_vs_Tirr.ipynb. The paper's published figures retain the original fixed-fit analysis. The standalone synthetic example injects a slope change at 1,700 K with an initial slope of 0.15, a slope change of -0.75, and independent ratio noise of 0.025:
python examples/temperature_regimes.py --steps 12000 --chains 4The standalone example uses a white plot background with black axes. Add
--typeplotback dark for a black background with white axes. Its
plot_result() function accepts the same typeplotback option from Python
and otherwise inherits an enclosing TDpy plot_style() theme.
With the optional Bokeh extra installed, the CLI also writes an interactive HTML companion under visuals/. Install it with python -m pip install -e ".[bokeh]".
The example writes posterior catalogs under data/temperature_regimes/ and a full-temperature-range figure directly under visuals/. Pass --figure-path to save the figure elsewhere. All values in these outputs come from the synthetic example.