Microlensing Submission Format Manual
Note
A Note from the Organizers: We strongly recommend integrating the official microlens-submit tool into your workflow. It provides immediate solution validation feedback, easy solution comparison, and automated metadata collection. The tool handles all the tedious formatting and metadata generation for you, significantly reducing the risk of submission errors.
However, if you prefer minimal tool usage or need to build your own submission package programmatically, this document provides the exact specification required. Proceed at your own risk.
Minimal Workflow: Create → Import → (Optional: Generate Dossier) → Export
For users who want minimal interaction with the submission tool, here’s the simplest workflow:
Create Submission Project
microlens-submit init --team-name "Your Team Name" --tier "experienced"
Note
You can re-run
microlens-submit initin the same project directory to quickly update the team name, tier, or other top-level metadata. This will overwrite thesubmission.jsonfile with the new values you provide, but will not affect your events or solutions. It’s a simple way to fix typos or update your info without manually editing the JSON file.Import Solutions from CSV
microlens-submit import-solutions your_solutions.csv --validate
(Optional) Generate Dossier
microlens-submit generate-dossierExport Submission
microlens-submit export-submission
That’s it! Your submission has been sent.
CSV Import Format
The tool can import solutions from a CSV file with the following columns:
Required Columns
Column |
Type |
Description |
Example |
|---|---|---|---|
|
string |
Unique identifier for the microlensing event |
|
|
string |
Human-readable name for the solution (must be unique within event) |
|
|
JSON array |
Model type and higher-order effects |
|
Parameter Columns
You can include model parameters as individual columns. The tool will automatically recognize and validate them:
Core Parameters (Required based on model type)
Parameter |
Type |
Units |
Description |
Category |
|---|---|---|---|---|
|
float |
HJD |
Time of closest approach |
Core |
|
float |
θE |
Minimum impact parameter |
Core |
|
float |
days |
Einstein radius crossing time |
Core |
|
float |
θE |
Binary separation scaled by Einstein radius |
Binary Lens |
|
float |
dimensionless |
Mass ratio M2/M1 |
Binary Lens |
|
float |
rad |
Angle of source trajectory relative to binary axis |
Binary Lens |
Higher-Order Effect Parameters
Parameter |
Type |
Units |
Description |
Category |
|---|---|---|---|---|
|
float |
θE |
Source radius scaled by Einstein radius |
Finite Source |
|
float |
θE |
Parallax vector component (North) |
Parallax |
|
float |
θE |
Parallax vector component (East) |
Parallax |
|
float |
θE/year |
Rate of change of binary separation |
Lens Orbital Motion |
|
float |
rad/year |
Rate of change of binary orientation |
Lens Orbital Motion |
|
float |
au/year |
Relative radial rate of change of lenses |
Lens Orbital Motion |
|
float |
θE |
Xallarap vector component (North) |
Xallarap |
|
float |
θE |
Xallarap vector component (East) |
Xallarap |
|
float |
days |
Orbital period of the source companion |
Xallarap |
|
float |
dimensionless |
Eccentricity of source orbit |
Xallarap |
|
float |
rad |
Argument of periapsis for source orbit |
Xallarap |
|
float |
deg |
Inclination of source orbit |
Xallarap |
|
float |
mag² |
Log-amplitude of the GP kernel |
Gaussian Process |
|
float |
days |
Log-lengthscale of the GP kernel |
Gaussian Process |
|
float |
days |
Log-period of the GP kernel |
Gaussian Process |
|
float |
dimensionless |
Log-smoothing parameter of the GP kernel |
Gaussian Process |
|
float |
km/s |
Rotational velocity times sin(inclination) |
Stellar Rotation |
|
float |
dimensionless |
Spot coverage/brightness parameter |
Stellar Rotation |
Flux Parameters (Required if using bands)
For each photometric band, you need source and blend flux parameters:
F0_S,F0_B: Source and blend flux for band 0F1_S,F1_B: Source and blend flux for band 1F2_S,F2_B: Source and blend flux for band 2
For binary source models, use F0_S1, F0_S2, F0_B etc.
Optional Columns
Column |
Type |
Description |
Example |
|---|---|---|---|
|
string |
Solution notes (supports Markdown) |
|
|
float |
Log-likelihood value |
|
|
integer |
Number of data points used |
|
|
float |
Relative probability (0-1) |
|
Example CSV
# event_id,solution_alias,model_tags,t0,u0,tE,s,q,alpha,piEN,piEE,rho,notes
OGLE-2023-BLG-0001,simple_1S1L,"[""1S1L""]",2459123.5,0.1,20.0,,,,,,,"# Simple Point Lens"
OGLE-2023-BLG-0001,binary_parallax,"[""1S2L"", ""parallax""]",2459123.5,0.1,20.0,1.2,0.5,45.0,0.1,0.05,,"# Binary Lens with Parallax"
OGLE-2023-BLG-0002,finite_source,"[""1S1L"", ""finite-source""]",2459156.2,0.08,35.7,,,,,,0.001,"# Finite Source Solution"
Manual Submission Format
If you prefer to create the submission structure manually, here are the specifications:
Directory Structure
A valid submission is a directory containing a submission.json file and an events/ subdirectory.
<submission_dir>/
├── submission.json
└── events/
└── <event_id>/
├── event.json
└── solutions/
└── <solution_id>.json
File Schemas
submission.json
Global metadata for the entire submission.
Field |
Type |
Required |
Description |
|---|---|---|---|
|
string |
Yes |
Name of the participant team. |
|
string |
Yes |
Challenge tier. |
|
string |
Yes |
GitHub repository URL for the team codebase. |
|
string |
No |
Optional path to the git working tree (used for dirty checks). |
|
dict |
Yes |
Details about the compute environment (GPU details optional). |
Example:
{
"team_name": "Planet Pounders",
"tier": "experienced",
"repo_url": "https://github.com/planet-pounders/microlens-analysis",
"git_dir": "/path/to/microlens-analysis",
"hardware_info": {
"cpu": "Intel i9",
"ram_gb": 64,
"gpu": {
"model": "NVIDIA A100",
"count": 1,
"memory_gb": 40
}
}
}
GPU details are optional. For CPU-only environments (e.g., Roman Nexus),
omit the gpu field entirely.
event.json
Describes a single event.
Field |
Type |
Required |
Description |
|---|---|---|---|
|
string |
Yes |
Unique identifier for the event. |
|
string |
Yes |
Path to the markdown notes file for this event. |
Example:
{
"event_id": "KMT-2025-BLG-001",
"notes_path": "events/KMT-2025-BLG-001/notes.md"
}
solution.json
Represents a single model fit.
Field |
Type |
Required |
Description |
|---|---|---|---|
|
string |
Yes |
Unique identifier for the solution. |
|
string |
Yes |
Must be one of |
|
list |
No |
Photometric bands used, e.g., |
|
list |
No |
Additional effects like |
|
float |
No |
Reference time for the model. |
|
dict |
Yes |
Dictionary of model parameters. |
|
bool |
No |
If |
|
dict |
No |
Recorded dependencies and timing information. |
|
string |
No |
Path to a stored posterior sample file. |
|
string |
No |
Path to the lightcurve plot file. |
|
string |
No |
Path to the lens plane plot file. |
|
string |
No |
Path to the markdown notes file for this solution. |
|
bool |
No |
Indicates use of astrometric data. Defaults to |
|
bool |
No |
Indicates use of postage-stamp images. Defaults to |
|
string |
No |
Name of the limb darkening model employed. |
|
dict |
No |
Mapping of limb darkening coefficients. |
|
dict |
No |
Uncertainties for parameters in parameters. |
|
dict |
No |
Physical parameters derived from the model. |
|
float |
No |
Log-likelihood value of the fit. |
|
float |
No |
Optional probability of this solution being the best model. |
|
integer |
No |
Number of data points used in the fit. |
|
string |
No |
ISO timestamp. If omitted, the validator will add a current timestamp. |
Example:
{
"solution_id": "123e4567-e89b-12d3-a456-426614174000",
"model_type": "1S2L",
"parameters": {"t0": 555.5, "u0": 0.1, "tE": 25.0},
"physical_parameters": {"M_L": 0.5, "D_L": 7.8},
"log_likelihood": -1234.56,
"is_active": true,
"creation_timestamp": "2025-07-15T13:45:10Z"
}
Note
Files referenced by posterior_path, lightcurve_plot_path, and
lens_plane_plot_path are automatically included in the exported .zip.
External File Locations
These optional files must live inside your submission directory, and the
paths stored in each solution.json should be relative to the submission
root. We recommend mirroring the structure that microlens-submit itself
creates:
<submission_dir>/
├── submission.json
└── events/
└── <event_id>/
├── event.json
└── solutions/
├── <solution_id>.json
└── <solution_id>/
├── posterior.h5
├── lightcurve.png
└── lens_plane.png
When exported to a .zip, these files are copied into the archive following the
same layout. The posterior_path, lightcurve_plot_path, and
lens_plane_plot_path values inside the solution.json files in the archive are
rewritten so that they point to their new location relative to the archive root,
e.g. events/<event_id>/solutions/<solution_id>/posterior.h5. Be sure to
extract the archive before running any validation.
Locally, you might reference a posterior file as:
"posterior_path": "my_runs/posterior.h5"
Inside the exported .zip, the same entry becomes:
"posterior_path": "events/<event_id>/solutions/<solution_id>/posterior.h5"
Validation
Before submitting, you must validate your manually created package using the provided validate_submission.py script. This is your only safety net.
Run the script from your terminal, passing the path to your submission directory:
python validate_submission.py /path/to/your/submission_dir
The script will report “Submission is valid” on success or print detailed error messages if it finds any problems with your file structure or JSON formatting. Fix any reported errors before creating your final zip archive.
Note
The notes field supports Markdown formatting, allowing you to create rich documentation with headers, lists, code blocks, tables, and links. This is particularly useful for creating detailed submission dossiers for evaluators.