{
 "about": {
  "method": "experiment-summary-log-c50",
  "recordedOn": "2026-10-12",
  "script": "pipeline/assay-analyser/oracles/experiment_summary.py",
  "scriptSha256": "62739abf8711f987d0bcc8814dd1fac1c12793f311ca5be31c5d6a9d940626b5",
  "rScript": "pipeline/assay-analyser/oracles/r/experiment_summary_ttest.R",
  "rScriptSha256": "05620c7ea82e61ccac169d8d3607bec34062fa3d62a26f55e2c0bc97354f3f71",
  "origin": "Self-constructed log10 C50 values; no fit is run here (each experiment's fit is the engine's existing, separately verified single-curve fit)",
  "environment": {
   "image": "ghcr.io/biotechmat/drybench/oracle-env:11b8a5e4456df7eb@sha256:7e69891ca1d9f24838660e0a9887bdb654ce7771d2f2ac7e7275e9b1eb3b6a09",
   "python": "3.11.15",
   "scipy": "1.13.1",
   "numpy": "2.0.2",
   "recordedOn": "2026-10-12",
   "r": "R version 4.4.3 (2025-02-28)",
   "packages": {
    "jsonlite": "2.0.0"
   },
   "cpu": "AMD EPYC 7763 64-Core Processor",
   "cpuClass": "x86-64-v3",
   "simd": [
    "SSSE3",
    "SSE41",
    "POPCNT",
    "SSE42",
    "AVX",
    "F16C",
    "FMA3",
    "AVX2"
   ],
   "openblasCore": "Haswell",
   "threads": 1
  },
  "crossCheck": {
   "tool": "R t.test",
   "ran": true,
   "r": "R version 4.4.3 (2025-02-28)",
   "agrees": true,
   "worstAbsolute": 5.425881965948065e-12,
   "tolerance": "1e-9 absolute in log10 units",
   "rows": [
    {
     "case": "three-experiments",
     "mean": 2.6645352591003757e-15,
     "sd": 2.7755575615628914e-17,
     "low": 2.9825031333530205e-12,
     "high": 2.9762858844151197e-12
    },
    {
     "case": "five-experiments",
     "mean": 0.0,
     "sd": 3.885780586188048e-16,
     "low": 2.6645352591003757e-15,
     "high": 3.552713678800501e-15
    },
    {
     "case": "k-of-n",
     "mean": 0.0,
     "sd": 8.326672684688674e-17,
     "low": 4.9542592250872985e-12,
     "high": 4.9542592250872985e-12
    },
    {
     "case": "poorly-determined-carried",
     "mean": 3.552713678800501e-15,
     "sd": 3.3306690738754696e-16,
     "low": 5.423217430688965e-12,
     "high": 5.425881965948065e-12
    },
    {
     "case": "identical",
     "error": "data are essentially constant",
     "mean": 0.0,
     "sd": 0.0
    },
    {
     "case": "metamorphic-units",
     "mean": 3.375077994860476e-14,
     "sd": 2.7755575615628914e-17,
     "low": 2.9629632081196178e-12,
     "high": 2.986055847031821e-12
    },
    {
     "case": "absolute-kind",
     "mean": 3.552713678800501e-15,
     "sd": 2.0816681711721685e-16,
     "low": 3.804068171575636e-12,
     "high": 3.800515457896836e-12
    }
   ],
   "result": "mean, SD and both bounds within 1e-9 log10 on every case with an interval t.test computes (it refuses constant data, recorded per case)"
  },
  "tolerances": {
   "mean, SD and bounds": "1e-9 absolute in log10 units",
   "t quantile": "1e-8 relative",
   "k, n, levels, withheld lists, refusals and the carried flag": "exact"
  }
 },
 "oracle": {
  "arithmetic": "Python fractions from the binary64 inputs; square root in decimal at 50 digits",
  "quantile": "scipy.stats.t.ppf(0.975, k - 1)",
  "scipy": "1.13.1",
  "python": "3.11.15"
 },
 "cases": [
  {
   "name": "three-experiments",
   "about": "Three experiments, each with a shown relative C50 near 100 nM: mean, sample SD and the t-interval on 2 df",
   "members": [
    {
     "experiment": "Exp 1",
     "kind": "relative",
     "log": -6.9123,
     "reason": null,
     "poorlyDetermined": false
    },
    {
     "experiment": "Exp 2",
     "kind": "relative",
     "log": -7.1045,
     "reason": null,
     "poorlyDetermined": false
    },
    {
     "experiment": "Exp 3",
     "kind": "relative",
     "log": -7.0281,
     "reason": null,
     "poorlyDetermined": false
    }
   ],
   "expected": {
    "status": "summarised",
    "declared": 3,
    "k": 3,
    "withheld": [],
    "kind": "relative",
    "values": [
     {
      "experiment": "Exp 1",
      "log": -6.9123
     },
     {
      "experiment": "Exp 2",
      "log": -7.1045
     },
     {
      "experiment": "Exp 3",
      "log": -7.0281
     }
    ],
    "poorlyDetermined": false,
    "level": "summary",
    "mean": -7.014966666666667,
    "geometricMean": 9.661250289804884e-08,
    "sd": 0.09677072560094457,
    "df": 2,
    "tQuantile": 4.302652729696142,
    "low": -7.255358475522438,
    "high": -6.774574857810896,
    "geometricLow": 5.5544559188117237e-08,
    "geometricHigh": 1.6804482477956785e-07
   }
  },
  {
   "name": "five-experiments",
   "about": "Five experiments: the t-interval on 4 df",
   "members": [
    {
     "experiment": "2026-09-01",
     "kind": "relative",
     "log": -5.512,
     "reason": null,
     "poorlyDetermined": false
    },
    {
     "experiment": "2026-09-08",
     "kind": "relative",
     "log": -5.733,
     "reason": null,
     "poorlyDetermined": false
    },
    {
     "experiment": "2026-09-15",
     "kind": "relative",
     "log": -5.648,
     "reason": null,
     "poorlyDetermined": false
    },
    {
     "experiment": "2026-09-22",
     "kind": "relative",
     "log": -5.401,
     "reason": null,
     "poorlyDetermined": false
    },
    {
     "experiment": "2026-09-29",
     "kind": "relative",
     "log": -5.587,
     "reason": null,
     "poorlyDetermined": false
    }
   ],
   "expected": {
    "status": "summarised",
    "declared": 5,
    "k": 5,
    "withheld": [],
    "kind": "relative",
    "values": [
     {
      "experiment": "2026-09-01",
      "log": -5.512
     },
     {
      "experiment": "2026-09-08",
      "log": -5.733
     },
     {
      "experiment": "2026-09-15",
      "log": -5.648
     },
     {
      "experiment": "2026-09-22",
      "log": -5.401
     },
     {
      "experiment": "2026-09-29",
      "log": -5.587
     }
    ],
    "poorlyDetermined": false,
    "level": "summary",
    "mean": -5.5762,
    "geometricMean": 2.6533833523823414e-06,
    "sd": 0.1271562031518714,
    "df": 4,
    "tQuantile": 2.7764451051977987,
    "low": -5.734085279601962,
    "high": -5.418314720398037,
    "geometricLow": 1.8446531609883267e-06,
    "geometricHigh": 3.816675873597638e-06
   }
  },
  {
   "name": "k-of-n",
   "about": "Four declared, one withheld by rule (iii) and listed with its reason: the summary is over the three that gave a C50",
   "members": [
    {
     "experiment": "Run A",
     "kind": "relative",
     "log": -6.31,
     "reason": null,
     "poorlyDetermined": false
    },
    {
     "experiment": "Run B",
     "kind": "relative",
     "log": null,
     "reason": "C50 not bracketed: fewer than two concentrations above it",
     "poorlyDetermined": false
    },
    {
     "experiment": "Run C",
     "kind": "relative",
     "log": -6.12,
     "reason": null,
     "poorlyDetermined": false
    },
    {
     "experiment": "Run D",
     "kind": "relative",
     "log": -6.44,
     "reason": null,
     "poorlyDetermined": false
    }
   ],
   "expected": {
    "status": "summarised",
    "declared": 4,
    "k": 3,
    "withheld": [
     {
      "experiment": "Run B",
      "reason": "C50 not bracketed: fewer than two concentrations above it"
     }
    ],
    "kind": "relative",
    "values": [
     {
      "experiment": "Run A",
      "log": -6.31
     },
     {
      "experiment": "Run C",
      "log": -6.12
     },
     {
      "experiment": "Run D",
      "log": -6.44
     }
    ],
    "poorlyDetermined": false,
    "level": "summary",
    "mean": -6.29,
    "geometricMean": 5.128613839913648e-07,
    "sd": 0.16093476939431092,
    "df": 2,
    "tQuantile": 4.302652729696142,
    "low": -6.689784129779296,
    "high": -5.890215870220704,
    "geometricLow": 2.0427530622840984e-07,
    "geometricHigh": 1.2876093740642126e-06
   }
  },
  {
   "name": "pair",
   "about": "Two experiments: the two values and their difference; no SD, no interval",
   "members": [
    {
     "experiment": "Week 1",
     "kind": "relative",
     "log": -7.4,
     "reason": null,
     "poorlyDetermined": false
    },
    {
     "experiment": "Week 2",
     "kind": "relative",
     "log": -7.15,
     "reason": null,
     "poorlyDetermined": false
    }
   ],
   "expected": {
    "status": "summarised",
    "declared": 2,
    "k": 2,
    "withheld": [],
    "kind": "relative",
    "values": [
     {
      "experiment": "Week 1",
      "log": -7.4
     },
     {
      "experiment": "Week 2",
      "log": -7.15
     }
    ],
    "poorlyDetermined": false,
    "level": "pair",
    "mean": -7.275,
    "geometricMean": 5.3088444423098795e-08,
    "difference": 0.25
   }
  },
  {
   "name": "single",
   "about": "One experiment: the single fit, labelled so; no SD, no interval",
   "members": [
    {
     "experiment": "Only run",
     "kind": "relative",
     "log": -8.02,
     "reason": null,
     "poorlyDetermined": false
    }
   ],
   "expected": {
    "status": "summarised",
    "declared": 1,
    "k": 1,
    "withheld": [],
    "kind": "relative",
    "values": [
     {
      "experiment": "Only run",
      "log": -8.02
     }
    ],
    "poorlyDetermined": false,
    "level": "single",
    "mean": -8.02,
    "geometricMean": 9.549925860214368e-09
   }
  },
  {
   "name": "none",
   "about": "Three declared and none gave a C50: no summary, all three listed as withheld",
   "members": [
    {
     "experiment": "E1",
     "kind": "relative",
     "log": null,
     "reason": "no response",
     "poorlyDetermined": false
    },
    {
     "experiment": "E2",
     "kind": "relative",
     "log": null,
     "reason": "no finite best fit",
     "poorlyDetermined": false
    },
    {
     "experiment": "E3",
     "kind": "relative",
     "log": null,
     "reason": "C50 not bracketed",
     "poorlyDetermined": false
    }
   ],
   "expected": {
    "status": "none",
    "declared": 3,
    "k": 0,
    "withheld": [
     {
      "experiment": "E1",
      "reason": "no response"
     },
     {
      "experiment": "E2",
      "reason": "no finite best fit"
     },
     {
      "experiment": "E3",
      "reason": "C50 not bracketed"
     }
    ],
    "kind": null,
    "values": [],
    "poorlyDetermined": false
   }
  },
  {
   "name": "poorly-determined-carried",
   "about": "Three experiments, one poorly determined (its profile interval wider than two log10 units): the flag is carried to the summary",
   "members": [
    {
     "experiment": "E1",
     "kind": "relative",
     "log": -6.0,
     "reason": null,
     "poorlyDetermined": false
    },
    {
     "experiment": "E2",
     "kind": "relative",
     "log": -6.35,
     "reason": null,
     "poorlyDetermined": true
    },
    {
     "experiment": "E3",
     "kind": "relative",
     "log": -6.21,
     "reason": null,
     "poorlyDetermined": false
    }
   ],
   "expected": {
    "status": "summarised",
    "declared": 3,
    "k": 3,
    "withheld": [],
    "kind": "relative",
    "values": [
     {
      "experiment": "E1",
      "log": -6.0
     },
     {
      "experiment": "E2",
      "log": -6.35
     },
     {
      "experiment": "E3",
      "log": -6.21
     }
    ],
    "poorlyDetermined": true,
    "level": "summary",
    "mean": -6.1866666666666665,
    "geometricMean": 6.506288748655573e-07,
    "sd": 0.17616280348965066,
    "df": 2,
    "tQuantile": 4.302652729696142,
    "low": -6.624279330217547,
    "high": -5.749054003115786,
    "geometricLow": 2.3753120382216984e-07,
    "geometricHigh": 1.7821571481856438e-06
   }
  },
  {
   "name": "mixed-kinds",
   "about": "A relative and an absolute C50 in one summary: refused",
   "members": [
    {
     "experiment": "E1",
     "kind": "relative",
     "log": -6.0,
     "reason": null,
     "poorlyDetermined": false
    },
    {
     "experiment": "E2",
     "kind": "absolute",
     "log": -6.1,
     "reason": null,
     "poorlyDetermined": false
    },
    {
     "experiment": "E3",
     "kind": "relative",
     "log": -6.2,
     "reason": null,
     "poorlyDetermined": false
    }
   ],
   "expected": {
    "status": "refused",
    "reason": "mixed-kinds",
    "declared": 3
   }
  },
  {
   "name": "identical",
   "about": "Three identical values: SD zero and the interval of zero width",
   "members": [
    {
     "experiment": "E1",
     "kind": "relative",
     "log": -6.5,
     "reason": null,
     "poorlyDetermined": false
    },
    {
     "experiment": "E2",
     "kind": "relative",
     "log": -6.5,
     "reason": null,
     "poorlyDetermined": false
    },
    {
     "experiment": "E3",
     "kind": "relative",
     "log": -6.5,
     "reason": null,
     "poorlyDetermined": false
    }
   ],
   "expected": {
    "status": "summarised",
    "declared": 3,
    "k": 3,
    "withheld": [],
    "kind": "relative",
    "values": [
     {
      "experiment": "E1",
      "log": -6.5
     },
     {
      "experiment": "E2",
      "log": -6.5
     },
     {
      "experiment": "E3",
      "log": -6.5
     }
    ],
    "poorlyDetermined": false,
    "level": "summary",
    "mean": -6.5,
    "geometricMean": 3.162277660168379e-07,
    "sd": 0.0,
    "df": 2,
    "tQuantile": 4.302652729696142,
    "low": -6.5,
    "high": -6.5,
    "geometricLow": 3.162277660168379e-07,
    "geometricHigh": 3.162277660168379e-07
   }
  },
  {
   "name": "metamorphic-units",
   "about": "The three-experiment case with every C50 x 1e-3 (log10 shifted by -3): mean and bounds shifted by -3, SD unchanged",
   "members": [
    {
     "experiment": "Exp 1",
     "kind": "relative",
     "log": -9.9123,
     "reason": null,
     "poorlyDetermined": false
    },
    {
     "experiment": "Exp 2",
     "kind": "relative",
     "log": -10.1045,
     "reason": null,
     "poorlyDetermined": false
    },
    {
     "experiment": "Exp 3",
     "kind": "relative",
     "log": -10.0281,
     "reason": null,
     "poorlyDetermined": false
    }
   ],
   "expected": {
    "status": "summarised",
    "declared": 3,
    "k": 3,
    "withheld": [],
    "kind": "relative",
    "values": [
     {
      "experiment": "Exp 1",
      "log": -9.9123
     },
     {
      "experiment": "Exp 2",
      "log": -10.1045
     },
     {
      "experiment": "Exp 3",
      "log": -10.0281
     }
    ],
    "poorlyDetermined": false,
    "level": "summary",
    "mean": -10.014966666666666,
    "geometricMean": 9.661250289804904e-11,
    "sd": 0.09677072560094457,
    "df": 2,
    "tQuantile": 4.302652729696142,
    "low": -10.255358475522437,
    "high": -9.774574857810896,
    "geometricLow": 5.554455918811735e-11,
    "geometricHigh": 1.680448247795682e-10
   }
  },
  {
   "name": "absolute-kind",
   "about": "Three absolute C50s (percent scale): summarised as absolute",
   "members": [
    {
     "experiment": "E1",
     "kind": "absolute",
     "log": -6.71,
     "reason": null,
     "poorlyDetermined": false
    },
    {
     "experiment": "E2",
     "kind": "absolute",
     "log": -6.88,
     "reason": null,
     "poorlyDetermined": false
    },
    {
     "experiment": "E3",
     "kind": "absolute",
     "log": -6.64,
     "reason": null,
     "poorlyDetermined": false
    }
   ],
   "expected": {
    "status": "summarised",
    "declared": 3,
    "k": 3,
    "withheld": [],
    "kind": "absolute",
    "values": [
     {
      "experiment": "E1",
      "log": -6.71
     },
     {
      "experiment": "E2",
      "log": -6.88
     },
     {
      "experiment": "E3",
      "log": -6.64
     }
    ],
    "poorlyDetermined": false,
    "level": "summary",
    "mean": -6.743333333333333,
    "geometricMean": 1.805787600776718e-07,
    "sd": 0.1234233905438242,
    "df": 2,
    "tQuantile": 4.302652729696142,
    "low": -7.049934032291536,
    "high": -6.43673263437513,
    "geometricLow": 8.91386326102069e-08,
    "geometricHigh": 3.658199327982003e-07
   }
  }
 ]
}
