{
 "about": {
  "fixture": "Control-well sets for Z' worked by hand (brief sections 4.1 and 4.3); reference.R computes Z' from these values",
  "generatedBy": "pipeline/assay-analyser/generate_curves.py",
  "scriptSha256": "721b80f5d3355bda4ee92e2b8b1cb003ce6b7074ff8e817096cf255941ec5c2f",
  "numpy": "2.4.6",
  "python": "3.11.15",
  "model": "y = Bottom + (Top - Bottom) / (1 + 10^((logIC50 - x) * Hill)), x = log10(concentration in M); Hill < 0 for a falling curve",
  "drcMapping": "drc LL.4: b = -Hill, c = Bottom, d = Top, e = IC50 = 10^logIC50",
  "rule": "Synthetic data from known parameters; no value comes from the Drybench engine under test.",
  "licence": "MIT (generated data; no third-party data)"
 },
 "formula": "Z' = 1 - 3 (sd_pos + sd_neg) / |mean_pos - mean_neg| (Zhang, Chung and Oldenburg 1999), sample SDs (n - 1), n shown; refused when either control has fewer than two wells (CSO ruling, 6 October 2026)",
 "sets": [
  {
   "id": "Z01",
   "label": "excellent separation",
   "positive": [
    100.661,
    98.746,
    101.397,
    102.625,
    98.52,
    99.033,
    102.926,
    99.764,
    99.481,
    102.679,
    100.579,
    101.785,
    95.104,
    100.494,
    103.324,
    99.788
   ],
   "negative": [
    1.687,
    3.174,
    -2.022,
    2.753,
    -2.795,
    -1.44,
    5.776,
    0.003,
    4.043,
    -0.165,
    2.895,
    -8.399,
    0.385,
    -0.956,
    4.179,
    1.891
   ],
   "generativeModel": {
    "positive": {
     "mean": 100.0,
     "sd": 3.0
    },
    "negative": {
     "mean": 0.0,
     "sd": 3.0
    },
    "populationZPrime": 0.8200000000000001,
    "seed": 20261206,
    "generator": "numpy.random.RandomState(seed).standard_normal(size=(2, n)): row 0 positive, row 1 negative"
   }
  },
  {
   "id": "Z02",
   "label": "marginal: below the 0.5 convention",
   "positive": [
    98.341,
    115.177,
    95.158,
    109.283,
    106.033,
    94.214,
    94.079,
    100.194,
    111.45,
    120.542,
    91.115,
    98.285,
    111.046,
    110.044,
    90.281,
    97.245
   ],
   "negative": [
    20.374,
    13.442,
    -1.659,
    17.441,
    7.41,
    2.524,
    13.312,
    2.793,
    7.02,
    -12.707,
    16.653,
    17.079,
    12.025,
    6.129,
    6.902,
    2.996
   ],
   "generativeModel": {
    "positive": {
     "mean": 100.0,
     "sd": 11.0
    },
    "negative": {
     "mean": 10.0,
     "sd": 11.0
    },
    "populationZPrime": 0.2666666666666667,
    "seed": 20261207,
    "generator": "numpy.random.RandomState(seed).standard_normal(size=(2, n)): row 0 positive, row 1 negative"
   }
  },
  {
   "id": "Z03",
   "label": "overlapping controls: negative Z'",
   "positive": [
    42.125,
    62.71,
    60.282,
    46.127,
    55.242,
    35.852,
    39.648,
    32.935,
    55.331,
    71.435,
    48.718,
    31.17,
    50.467,
    50.292,
    50.666,
    44.116
   ],
   "negative": [
    25.25,
    18.39,
    2.802,
    24.131,
    3.177,
    20.337,
    5.909,
    27.056,
    17.915,
    23.866,
    9.477,
    28.82,
    35.572,
    21.861,
    41.948,
    6.799
   ],
   "generativeModel": {
    "positive": {
     "mean": 50.0,
     "sd": 12.0
    },
    "negative": {
     "mean": 20.0,
     "sd": 12.0
    },
    "populationZPrime": -1.4,
    "seed": 20261208,
    "generator": "numpy.random.RandomState(seed).standard_normal(size=(2, n)): row 0 positive, row 1 negative"
   }
  },
  {
   "id": "Z04",
   "label": "one negative-control well: Z' refused (a sample SD needs two)",
   "positive": [
    96.912,
    101.691,
    96.374,
    97.429,
    101.782,
    96.693,
    103.161,
    98.859,
    98.566,
    100.391,
    97.287,
    102.892,
    104.387,
    91.667,
    102.9,
    99.077
   ],
   "negative": [
    0.432
   ],
   "generativeModel": {
    "positive": {
     "mean": 100.0,
     "sd": 3.0
    },
    "negative": {
     "mean": 0.0,
     "sd": 3.0
    },
    "populationZPrime": 0.8200000000000001,
    "seed": 20261209,
    "generator": "numpy.random.RandomState(seed).standard_normal(size=(2, n)): row 0 positive, row 1 negative"
   }
  }
 ]
}
