diff --git a/examples/DC2018/dc18_truth_table.py b/examples/DC2018/dc18_truth_table.py index b794a243..3753acd5 100644 --- a/examples/DC2018/dc18_truth_table.py +++ b/examples/DC2018/dc18_truth_table.py @@ -597,61 +597,86 @@ def print_convention_caveat(rows): anyone reading a scoring run, and a caveat that lives somewhere else is a caveat nobody applies. - REWRITTEN 2026-09-17 AFTER THE MEASUREMENT CONTRADICTED THE FIRST VERSION. - That version said theta_star is biased low by 10**(-0.2*grey) -- 0.766x on - event 194 -- straight from the CSB relation. The ab194/av_true arm, the - first run with the colour-anchored prior, measured theta_star at 0.983x of - truth. So the arithmetic was right about the CSB relation and wrong about - where the residual lands: theta_star is PROTECTED, because the light curve - pins rho * theta_E independently of the SED. What actually absorbs the - grey term is teffsed, and behind it the (R_source, D_source) pair. + THIS TEXT HAS BEEN WRONG THREE TIMES. The history is kept because it is + the reason to distrust any version of it that PREDICTS rather than + measures -- every prediction here has failed, and only the measurements + have survived. + v1 predicted theta_star biased low by 10**(-0.2*grey) = 0.766x, from + the CSB relation. av_true measured 0.983x. Wrong. + v2 concluded theta_star is "protected" because the light curve pins + rho * theta_E independently of the SED. av_clump measured 0.738x at + av = 7.18, i.e. theta_star moves strongly WITH av. Wrong -- + `star_constrains_rho: true` means the SED constrains rho. + v3 fit three arms, found a crossing of theta*/truth = 1 at av = 9.007 + against an independent colour anchor of 9.006, and called that + agreement "0.1%". It also forecast 0.83-0.94x for the sweep's wide + prior. The sweep measured 0.698x, and eight more runs show the + crossing is not determined to anything like 0.1%. Both wrong. + v4 (this text) reports eleven runs on event 194, every one with its own + `_results.csv`, and states the crossing with the uncertainty the + scatter actually implies. It forecasts nothing. """ seen = [r["event"] for r in rows if str(r["event"]) in C29_GREY] if not seen: return print("\n" + "=" * 104) - print( - "CAVEAT: THE SIMULATION'S EXTINCTION CONVENTION IS NOT OURS, AND THE" - ) - print(" RESIDUAL LANDS ON teffsed AND (R_source, D_source).") + print("CAVEAT: theta_star TRACKS av. THE CROSSING SITS AT THE COLOUR") + print(" ANCHOR, BUT TO ~0.5 MAG, NOT TO 0.1%.") + print(" R_source IS WRONG AT EVERY av.") print(" This simulation reddened MONOCHROMATICALLY at each filter's") - print( - " effective wavelength; we integrate a reddened spectrum through the" - ) - print( - " passband, which is what a measurement is. For a filter as wide as" - ) - print( - " W149 those differ, so no single av reproduces both simulated band" - ) - print(" extinctions in our model. Anchoring the colour leaves a GREY") - print(" residual in both bands:") + print(" effective wavelength; we integrate a reddened spectrum through") + print(" the passband, which is what a measurement is. For a filter as") + print(" wide as W149 those differ, so no single av reproduces both") + print(" simulated band extinctions in our model. Anchoring the colour") + print(" leaves a GREY residual in both bands:") print(" %-7s %s" % ("event", "grey (mag)")) for ev in sorted({str(e) for e in seen}): print(" %-7s %+10.2f" % (ev, C29_GREY[ev])) - print(" MEASURED ON av_true (event 194, prior av = 9.01 +/- 0.3, ptde,") - print(" Rhat 1.00, ESS 23-25k, 78/78 chains):") - print(" theta_star 0.983x truth <-- NOT biased; the light curve") - print(" pins rho * theta_E") - print(" R_source 0.403x truth pull -5.25") - print(" D_source 0.410x truth pull -5.35") - print(" theta_E 0.774x truth pull -0.66 (within 1 sigma)") - print(" R and D slide ~2.45x IN LOCKSTEP, which is why their ratio --") - print(" theta_star -- survives while each is individually -5 sigma. The") - print( - " flux the grey term over-predicts is absorbed by a source made too" - ) - print( - " COOL (teffsed 3040 K here), and the distance follows the resulting" - ) - print(" luminosity inward.") - print(" DO NOT read the -5 sigma R_source/D_source pulls as 'the") - print(" convention explains them': that is not established. What IS") - print( - " established is that the colour-anchored prior moved theta_star from" - ) - print(" 0.62x truth (the old arms, av ~ 4.25 from A_W149) to 0.983x, and") - print(" R_source's pull from -13.10 to -5.25. The remainder is OURS.") + print(" MEASURED on event 194 -- ELEVEN ptde runs that differ only in") + print(" the av prior (and, where marked, in fitu0te), each scored from") + print(" its own results.csv, Rhat <= 1.01, 78 chains:") + print(" av post theta*/t R/t D/t run (av prior)") + print(" 4.24 0.632 0.352 0.556 sync (2.75 +/- 0.33)") + print(" 4.26 0.634 0.356 0.562 u0te (2.75 +/- 0.33)") + print(" 4.26 0.630 0.350 0.556 u0te_sync") + print(" 4.27 0.651 0.357 0.548 async") + print(" 4.27 0.633 0.356 0.563 tight_sync") + print(" 5.26 0.686 0.348 0.507 av_free, old grid ceiling 6") + print(" 6.80 0.760 0.350 0.461 av_free, ceiling 20") + print(" 7.18 0.733 0.389 0.531 av_clump (8.61 +/- 2.41)") + print(" 7.29 0.698 0.364 0.521 SWEEP (9.01 +/- 1.83, u0te)") + print(" 8.99 0.983 0.403 0.410 av_true (9.01 +/- 0.30)") + print(" 9.42 1.086 0.425 0.391 av_band (11.65 +/- 1.40)") + print(" 1. THE CROSSING IS WHERE THE ANCHOR IS -- TO ~0.5 MAG, WHICH IS") + print(" ALL THE SCATTER ALLOWS. Refit as runs were added it moves:") + print(" 9.01 +/- 0.80 (v3's three arms), 9.31 +/- 2.83 (the six runs") + print(" with av > 5), 9.71 +/- 1.53 (all eleven). The relation is") + print(" monotone but NOT log-linear -- the five runs near av = 4.25") + print(" sit at 0.63, where v3's line predicts 0.44 -- so a global fit") + print(" is the wrong estimator. The local one: the two runs that") + print(" STRADDLE theta*/truth = 1 (8.99 -> 9.42) interpolate to 9.06,") + print(" and three runs at av = 6.8-7.3 scatter 0.037 dex at fixed av,") + print(" i.e. +/- 0.5 mag of crossing. So 9.1 +/- 0.5 against an") + print(" independently computed anchor of 9.01. That confirms the") + print(" anchor. v3's 0.1% was a three-point coincidence.") + print(" 2. theta_star TRACKS av: 0.075 dex/mag locally above av = 7,") + print(" 0.038 dex/mag across the full 4.2-9.4 range, against the CSB") + print(" relation's 0.042. It is NOT independent of the SED, because") + print(" `star_constrains_rho: true` lets the SED constrain rho.") + print(" 3. R_source IS 0.35-0.43x TRUTH AT EVERY av, over 5.2 mag and") + print(" eleven runs. D_source and theta_star move with av; R_source") + print(" does not. The source-radius deficit is NOT an extinction") + print(" problem, and that residual is OURS.") + print(" 4. THE HONEST WIDTH COSTS MORE THAN v3 ESTIMATED. Every wide") + print(" prior is pulled DOWN, never up: -0.94 sigma from") + print(" 9.01 +/- 1.83 (the sweep), -0.59 from 8.61 +/- 2.41, -1.59") + print(" from 11.65 +/- 1.40; only the tight prior held (-0.07 from") + print(" 9.01 +/- 0.30). The data's own av preference is LOW. The") + print(" sweep therefore landed 0.698x, below v3's own 0.83-0.94x") + print(" forecast. That tradeoff is JDE's call, not a defect.") + print(" 5. fitu0te IS NOT WHY THE SWEEP SITS LOW: at av = 4.26 the u0te") + print(" runs give 0.634 and 0.630 against 0.632 and 0.651 for u_0,") + print(" under 0.5%. The sweep is comparable to the arms.") print(" None of this applies to real Roman data, where the integrated") print(" treatment is simply the correct one.")