Begin with the files that actually exist
The author project publishes five small photometry tables: Danish, Perth, Canopus, RoboNet and MOA. They contain 151, 65, 12, 52 and 28 rows, respectively: 308 measurements in total. The discovery article used 650 points from six observatories. This exercise is therefore an independent fit of an available subset, not a reproduction of the original data reduction or its quoted precision.
Each headerless row has three numbers: a published relative Julian-day coordinate, an instrumental magnitude and its reported magnitude error. The dates agree with HJD minus 2450000 and the event chronology. The files do not declare a precise time standard or exposure duration. Keep their time column as published; do not rename it BJD/TDB.
The five stations have different instrumental zero points. We give each its own baseline magnitude and source fraction. The error bars remain those supplied by the project. We do not silently rescale them to make a preferred model look statistically comfortable.
No explicit redistribution license was found for these photometry files. The package names the original URLs and their byte counts and hashes, then downloads them directly to your computer. The original observations and their row-wise transformations stay off this website. Its public results are model-level summaries and independently generated synthetic figures.
Reading: OGLE published OGLE-2005-BLG-390 project files · Beaulieu et al. (2006), OGLE-2005-BLG-390 discovery, astro-ph/0601563v1
Prepare a standalone calculation
Download and extract microlensing-science.zip below. Its own Python science routines and small C++ caller are separate from the interactive Lab. The independent VBBinaryLensing reference is fetched at a fixed upstream commit; its LGPL license arrives with the source. A compiler builds that local reference. Nothing imports a protected browser Engine.
python3 -m venv .venv
. .venv/bin/activate
python -m pip install -r requirements.txt
python verify_package.py
python fetch_observations.py --output observations
python fetch_reference.py --output reference
python replay_results.py --materials . --output replay-summary.json
The first verifier checks the package manifest. The downloaders accept only the named origins and exact frozen hashes. Changed bytes stop the download with an error. A verified local cache is identified separately from an actual HTTP fetch. Keep both download receipts.
The replay evaluates frozen fitted parameters against freshly downloaded inputs, profiles all station baselines and source fractions again, and compares aggregate fit statistics at a stated tolerance. That is a forward replay. The next command performs a fresh finite search; it is slower and can settle in a different local minimum.
Reading: Bozza et al. (2018), VBBinaryLensing finite-source methods · OGLE published OGLE-2005-BLG-390 project files
Write one likelihood before choosing a lens
For station , let be its baseline magnitude and its fraction of baseline flux from the lensed star. We restrict that fraction to the physical interval from zero to one. The model predicts an instrumental magnitude after adding source and foreground flux.
For a trial source fraction, the best baseline is an exact weighted mean. A bounded scalar minimization, with both endpoints checked, profiles the fraction. The same operation is used for every competing lens, so a change in blending cannot secretly favor only one model.
The I-band stations use the discovery source coefficient 0.538; RoboNet’s R band uses 0.626. MOA’s custom red passband is treated as I-like in the baseline and tested as R-like later. The coefficients are held at a chosen source-atmosphere approximation. Comparing the alternatives tests that assumption across the tables.
Reading: Beaulieu et al. (2006), OGLE-2005-BLG-390 discovery, astro-ph/0601563v1
Try a smooth lens, a point star, and a stellar disk
python fit_event.py --materials . --output fresh-fit --maximum-evaluations 100
python fit_point_binary.py --materials . --baseline-results fresh-fit/fit-history.json --output fresh-point-source
The first command fits a single point-mass lens with a finite source radius fixed to the published source-crossing ratio, then seven-parameter finite-source wide and close binaries. Wide means lens separation above one total-mass Einstein radius; close means below one. Four distinct starts are retained for each binary branch. The misleading internal label “point” in the JSON means a single point mass; it does not mean a zero-radius star.
On the frozen 308-point subset, the finite-source single lens gives . The best-found finite-source wide binary gives ; the close branch gives . The separate zero-radius binary search gives about 575.1 for wide and 335.6 for close. These are comparisons on identical measurements and errors, not detection probabilities.
Several other starts stop at much worse fits. Keep their status, active bounds and evaluation counts. An optimizer’s success flag only says that its local stopping rule was met. It does not prove that every separated caustic solution was searched. Conversely, an evaluation cap is not convergence.
The finite-source wide solution has a companion-to-host mass ratio near 0.000056 and a normalized source radius near 0.0181. Those dimensionless parameters are conditional on this subset and model. The table below rounds the results to useful precision. The full aggregate record retains numerical digits for computation checks.
| Model on the same 308 samples | |
|---|---|
| Single mass, finite disk fixed | 749.9 |
| Wide binary, finite disk | 219.0 |
| Close binary, finite disk | 323.3 |
| Wide binary, zero-radius source | 575.1 |
| Close binary, zero-radius source | 335.6 |
| Wide binary, annual parallax | 216.9 |
| Close binary, expanded parallax box | 238.3 |
| 0 | 2.10 |
| 0.2 | 1.13 |
| 0.5 | 0.23 |
| 1 | 0.00 |
| 2 | 0.12 |
| 5 | 0.73 |
| 10 | 2.38 |
Reading: Beaulieu et al. (2006), OGLE-2005-BLG-390 discovery, astro-ph/0601563v1 · Bozza et al. (2018), VBBinaryLensing finite-source methods
Ask whether Earth’s motion is measured
python fit_parallax.py --materials . --baseline-results fresh-fit/fit-history.json --output fresh-parallax
Annual parallax adds two north/east trajectory parameters. The package retains a fixed JPL DE441 geometric Earth-vector response: 161 six-hour TDB nodes, with positions and velocities. A cubic Hermite interpolant removes the constant position and velocity at a fixed reference epoch before projection onto the source tangent plane.
This geometric input has its own TDB epochs. It does not repair the photometry’s undeclared time standard. We preserve that qualification and test small common Earth-epoch offsets. We do not manufacture a barycentric timing conversion from missing metadata.
Both impact signs are refitted. The wide solutions reach , improving by only about 2.13 over the zero-parallax wide fit. A finite best-found profile also leaves zero parallax and an amplitude of ten only a few fit units above its minimum. This subset does not supply a robust annual-parallax mass measurement.
Close annual-parallax searches press against the initial amplitude box. Expanding that box, then continuing capped runs, finds a huge-parallax close solution around 239.0. It remains worse than the wide solution. The continuation is recorded because stopping at the first bound would have made the close branch look more strongly excluded than this search justifies.
This exercise stops before fitting a Galaxy population model, source angular-radius posterior or event-rate prior. The discovery paper adds a physical-inference layer; its planet mass requires that further information, beyond the event duration measured here.
Reading: JPL Horizons vector ephemeris documentation · Beaulieu et al. (2006), OGLE-2005-BLG-390 discovery, astro-ph/0601563v1
Read the profile, including its bad starts
python profile_event.py --materials . --baseline-results fresh-fit/fit-history.json --parallax-results fresh-parallax/parallax-history.json --output fresh-profiles
python refine_profiles.py --materials . --profiles fresh-profiles/profile-history.json --output refined-profiles
A mass-ratio profile fixes the ratio and reoptimizes every remaining lens parameter and all station nuisances. A parallax-amplitude profile also refits its direction. These are finite searches on the positive-impact wide branch. They are not posterior densities or confidence intervals with established coverage.
A high point on a numerical profile can come from a failed search. Check the search before interpreting that point as a physical exclusion. In the first pass, the amplitude-five start fell into a much worse basin. The refinement tries adjacent profile solutions and retains the original failure separately. The low-ratio endpoint also needed continuation before its stopping rule was met.
Look at the full attempts before drawing an interval. Nearby optimizer starts leave a global-minimum question open. The low alternative fits are direct counterexamples to a claimed tight upper limit.
Reading: Bozza et al. (2018), VBBinaryLensing finite-source methods · Bozza et al., VBMicroLensing, arXiv:2410.13660v1; A&A 694 A219 (2025)
Check numerical light before interpreting small differences
A fast contour result is not automatically an independent truth. During development, a direct limb-darkened reference call disagreed with another image-area method in a low-mass-ratio caustic case. We kept the disagreement and tested positive weighted annuli built from separately refined uniform-source contours. Their order refinement agreed with the inverse image-plane integration.
For the event itself, every one of the 308 model predictions was checked against the independent inverse-area calculation for the finite wide, finite close, wide-parallax and large-parallax close solutions. Additional anomaly and spread-out epochs were checked with positive annuli. The aggregate diagnostics are included in the package. The floating-point geometric envelopes are not formally rounded interval certificates.
The interactive model’s spatial envelope, its quadrature estimate, time averaging and displayed image pixels are different numerical questions. Its image and flux use the same area-weighted radiance. Display contrast takes a square root to reveal faint images; exported radiance remains linear. The real-event fit uses a separate offline reference and has been checked at its smaller mass ratio and source radius.
Reading: Bozza et al. (2018), VBBinaryLensing finite-source methods · Bozza et al., VBMicroLensing, arXiv:2410.13660v1; A&A 694 A219 (2025)
Vary what the files leave unknown
At the best wide geometry, changing MOA from the I-like limb coefficient to the R-like one changes the maximum source prediction by about 0.00188 magnitude and the profiled fit statistic by −0.152. A hypothetical common thirty-minute rectangular exposure changes it by about 0.000689 magnitude and +0.0276 fit units. Actual exposure lengths are unknown; these are conditional sensitivity probes, with station nuisances refitted and lens geometry held fixed.
For the best wide annual-parallax geometry, replacing six-hour Earth nodes with twelve-hour nodes changes the fit statistic by about 0.000000013. Shifting the Earth epochs, including the reference epoch, by plus or minus 0.007 day changes it by less than 0.000029. This shows that these particular numerical choices are small at this solution. It does not establish that all timing systematics or unmodeled observing effects are negligible.
You can now say something stronger than “a curve looked good”: on this published subset, a finite-source planetary model substantially improves over the tested smooth and zero-radius alternatives. That conclusion belongs to this subset and finite search. Recovering the complete original reduction, mapping every binary solution, calibrating a detection significance and determining an independent physical planet mass each require further work.
Reading: OGLE published OGLE-2005-BLG-390 project files · Beaulieu et al. (2006), OGLE-2005-BLG-390 discovery, astro-ph/0601563v1 · JPL Horizons vector ephemeris documentation