AgentHEPGitHub ↗
Tier 1 · Inspection · v1.0.0

Inspect the CMS dimuon file

Load a real CMS open-data CSV and report its shape, columns and basic statistics of the dimuon mass.

t1-schema-summaryinspectioncms_dimuon_2011load_csvschema_inspectionsummary_statistics

Task prompt (what the agent sees)

The working directory contains `data/cms_dimuon_2011.csv`, a public CMS 2011 dimuon dataset
(see README.md for the data card). Inspect the file and write `result.json` with exactly these keys:

- `n_events`: number of rows (int)
- `n_columns`: number of columns (int)
- `columns`: list of column names in file order
- `n_runs`: number of distinct values of `Run` (int)
- `n_events_both_global`: number of events where both `type1` and `type2` equal "G" (int)
- `m_min`, `m_max`, `m_mean`: minimum, maximum and mean of the dimuon mass column `M` in GeV (floats, full precision)
- `frac_opposite_charge`: fraction of events with opposite-sign muon charges, i.e. Q1*Q2 < 0 (float)

Save the complete analysis as `solution.py`. Running `python solution.py` from a clean copy of this
directory must regenerate `result.json`.

Data card (README.md in the workdir)

Data card: data/cms_dimuon_2011.csv (REAL DATA)

Source: CERN Open Data Portal record 545, "Dimuon events from the CMS 2011 DoubleMu primary dataset" (file Dimuon_DoubleMu.csv). Licence CC0. 100,000 events, one per row.

column meaning unit
Run, Event run and event number
type1, type2 muon reconstruction type: G global muon, T tracker muon
E1, px1, py1, pz1 four-momentum of muon 1 GeV
pt1, eta1, phi1 transverse momentum, pseudorapidity, azimuth of muon 1 GeV, –, rad
Q1 charge of muon 1 e
E2 … Q2 same for muon 2
M invariant mass of the muon pair GeV

All energies and momenta are in GeV. There are no missing values.

Expected artifacts

  • result.json json summary statistics
  • solution.py script reproducible analysis script

Deterministic checks and tolerances

rubric: artifact 0.1 · numeric 0.6 · plot 0 · compliance 0.1 · reproducibility 0.2
CheckTypeTargetToleranceWeightCategoryCriticalFailure implies
result_existsfile_existsresult.json1artifactcriticalno_output
solution_existsfile_existssolution.py1artifactno_output
n_eventsjson_valueresult.json › n_eventsexact2numericcriticalwrong_dataset
n_columnsjson_valueresult.json › n_columnsexact1numericwrong_dataset
columnsjson_list_equalresult.json › columnsexact1numericwrong_variable
n_runsjson_valueresult.json › n_runsexact1numericwrong_variable
n_both_globaljson_valueresult.json › n_events_both_globalexact1numericinvalid_cut
m_minjson_valueresult.json › m_minatol 0.00011numericwrong_variable
m_maxjson_valueresult.json › m_maxatol 0.00011numericwrong_variable
m_meanjson_valueresult.json › m_meanrtol 0.0000012numericcriticalwrong_variable
frac_osjson_valueresult.json › frac_opposite_chargeatol 0.0000011numericinvalid_cut
rerunsscript_runssolution.py1reproducibilitynon_reproducible
not_hardcodedno_hardcoded_resultsolution.py1compliancefabricated_result

Tolerance rationale. Counts are exact. Means use rtol 1e-6 (float64 summation order). Min/max atol 1e-4 (four decimals in the source file).

Ground truth (produced by the reference in the sandbox)

built 2026-09-06 · numpy 1.26.4 · scipy 1.13.1 · 0.847s
result.json
{
 "n_events": 100000,
 "n_columns": 21,
 "columns": [
  "Run",
  "Event",
  "type1",
  "E1",
  "px1",
  "py1",
  "pz1",
  "pt1",
  "eta1",
  "phi1",
  "Q1",
  "type2",
  "E2",
  "px2",
  "py2",
  "pz2",
  "pt2",
  "eta2",
  "phi2",
  "Q2",
  "M"
 ],
 "n_runs": 15,
 "n_events_both_global": 93474,
 "m_min": 0.3002,
 "m_max": 299.202,
 "m_mean": 17.691054685,
 "frac_opposite_charge": 1
}
reference.py
import json
import pandas as pd

df = pd.read_csv("data/cms_dimuon_2011.csv")
result = {
    "n_events": int(len(df)),
    "n_columns": int(df.shape[1]),
    "columns": list(df.columns),
    "n_runs": int(df["Run"].nunique()),
    "n_events_both_global": int(((df["type1"] == "G") & (df["type2"] == "G")).sum()),
    "m_min": float(df["M"].min()),
    "m_max": float(df["M"].max()),
    "m_mean": float(df["M"].mean()),
    "frac_opposite_charge": float((df["Q1"] * df["Q2"] < 0).mean()),
}
json.dump(result, open("result.json", "w"), indent=2)
print(result)

Results on this task

4 runs
AgentModelRunsStrict successMean score
Self-debuggingQwen3-8B (gariyuu gateway)1100%1
Planner / executorQwen3-8B (gariyuu gateway)1100%1
ReActQwen3-8B (gariyuu gateway)1100%1
Single-shotQwen3-8B (gariyuu gateway)1100%1
RunAgentModelResultScoreLabels
20260906T171852…r0Single-shotQwen3-8B (gariyuu gateway)✓ strict1
20260906T172012…r0ReActQwen3-8B (gariyuu gateway)✓ strict1unsupported_claim
20260906T173510…r0Planner / executorQwen3-8B (gariyuu gateway)✓ strict1
20260906T174851…r0Self-debuggingQwen3-8B (gariyuu gateway)✓ strict1