{
 "about": {
  "method": "everyday-preparation (cell-seeding, centrifuge-rcf-rpm, percent-solution, antibody-dilution)",
  "recordedOn": "2026-10-10",
  "script": "pipeline/lab-calculators/preparation_reference_3.py",
  "scriptSha256": "002cd28adbc38fe732f23d37b8f1cd88c98d0adbd4edb208f5b2d724a6244869",
  "source": "docs/design/pre-release-app-depth/calc.md C1-C4 acceptance examples; Thermo Fisher TR0040 for the rounded RCF coefficient; every other case self-constructed",
  "tolerances": {
   "values": "within 1e-9 relative",
   "refusals, flags and text rows": "exact"
  }
 },
 "oracle": {
  "name": "Python fractions and decimal",
  "version": "3.13.16"
 },
 "coefficientCheck": {
  "published": "1.118e-5",
  "exact": "0.000011182439582",
  "definition": "(2 pi / 60)^2 / g_n, g_n = 980.665 cm s^-2",
  "relativeDifference": "-0.00021816",
  "within": "3e-4"
 },
 "count": 41,
 "recordedOn": "2026-10-10",
 "cases": [
  {
   "name": "cells-calc-md-total-viability",
   "about": "calc.md C1: 2 million cells/mL at 80% viability, 100,000 viable cells in each of 10 vessels of 1 mL, 10% overage: 0.625 mL stock before overage, 0.6875 mL with it",
   "input": {
    "v": 1,
    "kind": "cells",
    "mode": "measured",
    "vessels": 10,
    "finalVolume": {
     "value": 1,
     "unit": "mL"
    },
    "stockAvailable": {
     "value": 1,
     "unit": "mL"
    },
    "densityBasis": "total",
    "density": {
     "value": 2000000,
     "unit": "cells/mL"
    },
    "viability": 80,
    "countingDilution": "already-applied",
    "countingFactor": null,
    "targetBasis": "cells",
    "target": {
     "value": 100000,
     "unit": "cells"
    },
    "area": {
     "value": null,
     "unit": "cm²"
    },
    "overagePercent": 10,
    "splitParts": null
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "viableDensity": 1600000000.0,
     "targetPerVessel": 100000.0,
     "nominalCells": 1000000.0,
     "plannedCells": 1100000.0,
     "overagePercent": 10.0,
     "vessels": 10.0,
     "stockPerVessel": 6.25e-05,
     "diluentPerVessel": 0.0009375,
     "finalPerVessel": 0.001,
     "nominalStock": 0.000625,
     "totalStock": 0.0006875,
     "totalDiluent": 0.0103125,
     "preparedVolume": 0.011,
     "unusedStock": 0.0003125
    },
    "flags": []
   }
  },
  {
   "name": "cells-calc-md-already-viable",
   "about": "calc.md C1: the already-viable density 1.6 million cells/mL gives the same answer, viability not applied again",
   "input": {
    "v": 1,
    "kind": "cells",
    "mode": "measured",
    "vessels": 10,
    "finalVolume": {
     "value": 1,
     "unit": "mL"
    },
    "stockAvailable": {
     "value": 1,
     "unit": "mL"
    },
    "densityBasis": "viable",
    "density": {
     "value": 1600000,
     "unit": "cells/mL"
    },
    "viability": null,
    "countingDilution": "already-applied",
    "countingFactor": null,
    "targetBasis": "cells",
    "target": {
     "value": 100000,
     "unit": "cells"
    },
    "area": {
     "value": null,
     "unit": "cm²"
    },
    "overagePercent": 10,
    "splitParts": null
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "viableDensity": 1600000000.0,
     "targetPerVessel": 100000.0,
     "nominalCells": 1000000.0,
     "plannedCells": 1100000.0,
     "overagePercent": 10.0,
     "vessels": 10.0,
     "stockPerVessel": 6.25e-05,
     "diluentPerVessel": 0.0009375,
     "finalPerVessel": 0.001,
     "nominalStock": 0.000625,
     "totalStock": 0.0006875,
     "totalDiluent": 0.0103125,
     "preparedVolume": 0.011,
     "unusedStock": 0.0003125
    },
    "flags": []
   }
  },
  {
   "name": "cells-no-overage",
   "about": "The same plan without overage: 0.625 mL in all",
   "input": {
    "v": 1,
    "kind": "cells",
    "mode": "measured",
    "vessels": 10,
    "finalVolume": {
     "value": 1,
     "unit": "mL"
    },
    "stockAvailable": {
     "value": 1,
     "unit": "mL"
    },
    "densityBasis": "total",
    "density": {
     "value": 2000000,
     "unit": "cells/mL"
    },
    "viability": 80,
    "countingDilution": "already-applied",
    "countingFactor": null,
    "targetBasis": "cells",
    "target": {
     "value": 100000,
     "unit": "cells"
    },
    "area": {
     "value": null,
     "unit": "cm²"
    },
    "overagePercent": 0,
    "splitParts": null
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "viableDensity": 1600000000.0,
     "targetPerVessel": 100000.0,
     "nominalCells": 1000000.0,
     "plannedCells": 1000000.0,
     "overagePercent": 0.0,
     "vessels": 10.0,
     "stockPerVessel": 6.25e-05,
     "diluentPerVessel": 0.0009375,
     "finalPerVessel": 0.001,
     "nominalStock": 0.000625,
     "totalStock": 0.000625,
     "totalDiluent": 0.009375,
     "preparedVolume": 0.01,
     "unusedStock": 0.000375
    },
    "flags": []
   }
  },
  {
   "name": "cells-counting-dilution-applied-once",
   "about": "A chamber count of 200,000 cells/mL on a 1:10 counting dilution, applied once, equals 2 million cells/mL already corrected",
   "input": {
    "v": 1,
    "kind": "cells",
    "mode": "measured",
    "vessels": 10,
    "finalVolume": {
     "value": 1,
     "unit": "mL"
    },
    "stockAvailable": {
     "value": 1,
     "unit": "mL"
    },
    "densityBasis": "total",
    "density": {
     "value": 200000,
     "unit": "cells/mL"
    },
    "viability": 80,
    "countingDilution": "apply",
    "countingFactor": 10,
    "targetBasis": "cells",
    "target": {
     "value": 100000,
     "unit": "cells"
    },
    "area": {
     "value": null,
     "unit": "cm²"
    },
    "overagePercent": 10,
    "splitParts": null
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "viableDensity": 1600000000.0,
     "targetPerVessel": 100000.0,
     "nominalCells": 1000000.0,
     "plannedCells": 1100000.0,
     "overagePercent": 10.0,
     "vessels": 10.0,
     "stockPerVessel": 6.25e-05,
     "diluentPerVessel": 0.0009375,
     "finalPerVessel": 0.001,
     "nominalStock": 0.000625,
     "totalStock": 0.0006875,
     "totalDiluent": 0.0103125,
     "preparedVolume": 0.011,
     "unusedStock": 0.0003125
    },
    "flags": []
   }
  },
  {
   "name": "cells-area-target",
   "about": "An area target: 20,000 viable cells/cm² on 9.5 cm² per well, 6 wells of 2 mL, from 3 million viable cells/mL",
   "input": {
    "v": 1,
    "kind": "cells",
    "mode": "measured",
    "vessels": 6,
    "finalVolume": {
     "value": 2,
     "unit": "mL"
    },
    "stockAvailable": {
     "value": 5,
     "unit": "mL"
    },
    "densityBasis": "viable",
    "density": {
     "value": 3000000,
     "unit": "cells/mL"
    },
    "viability": null,
    "countingDilution": "already-applied",
    "countingFactor": null,
    "targetBasis": "area",
    "target": {
     "value": 20000,
     "unit": "cells/cm²"
    },
    "area": {
     "value": 9.5,
     "unit": "cm²"
    },
    "overagePercent": 5,
    "splitParts": null
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "viableDensity": 3000000000.0,
     "targetPerVessel": 190000.0,
     "nominalCells": 1140000.0,
     "plannedCells": 1197000.0,
     "overagePercent": 5.0,
     "vessels": 6.0,
     "stockPerVessel": 6.333333333333333e-05,
     "diluentPerVessel": 0.0019366666666666666,
     "finalPerVessel": 0.002,
     "nominalStock": 0.00038,
     "totalStock": 0.000399,
     "totalDiluent": 0.012201,
     "preparedVolume": 0.0126,
     "unusedStock": 0.004601
    },
    "flags": []
   }
  },
  {
   "name": "cells-area-target-mm",
   "about": "The same area target typed as 200 cells/mm² over 950 mm²: identical",
   "input": {
    "v": 1,
    "kind": "cells",
    "mode": "measured",
    "vessels": 6,
    "finalVolume": {
     "value": 2,
     "unit": "mL"
    },
    "stockAvailable": {
     "value": 5,
     "unit": "mL"
    },
    "densityBasis": "viable",
    "density": {
     "value": 3000,
     "unit": "cells/µL"
    },
    "viability": null,
    "countingDilution": "already-applied",
    "countingFactor": null,
    "targetBasis": "area",
    "target": {
     "value": 200,
     "unit": "cells/mm²"
    },
    "area": {
     "value": 950,
     "unit": "mm²"
    },
    "overagePercent": 5,
    "splitParts": null
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "viableDensity": 3000000000.0,
     "targetPerVessel": 190000.0,
     "nominalCells": 1140000.0,
     "plannedCells": 1197000.0,
     "overagePercent": 5.0,
     "vessels": 6.0,
     "stockPerVessel": 6.333333333333333e-05,
     "diluentPerVessel": 0.0019366666666666666,
     "finalPerVessel": 0.002,
     "nominalStock": 0.00038,
     "totalStock": 0.000399,
     "totalDiluent": 0.012201,
     "preparedVolume": 0.0126,
     "unusedStock": 0.004601
    },
    "flags": []
   }
  },
  {
   "name": "cells-volume-target",
   "about": "A suspension target: 300,000 viable cells/mL in 4 flasks of 25 mL, from 1.5 million cells/mL at 95% viability",
   "input": {
    "v": 1,
    "kind": "cells",
    "mode": "measured",
    "vessels": 4,
    "finalVolume": {
     "value": 25,
     "unit": "mL"
    },
    "stockAvailable": {
     "value": 30,
     "unit": "mL"
    },
    "densityBasis": "total",
    "density": {
     "value": 1500000,
     "unit": "cells/mL"
    },
    "viability": 95,
    "countingDilution": "already-applied",
    "countingFactor": null,
    "targetBasis": "volume",
    "target": {
     "value": 300000,
     "unit": "cells/mL"
    },
    "area": {
     "value": null,
     "unit": "cm²"
    },
    "overagePercent": 0,
    "splitParts": null
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "viableDensity": 1425000000.0,
     "targetPerVessel": 7500000.0,
     "nominalCells": 30000000.0,
     "plannedCells": 30000000.0,
     "overagePercent": 0.0,
     "vessels": 4.0,
     "stockPerVessel": 0.005263157894736842,
     "diluentPerVessel": 0.019736842105263157,
     "finalPerVessel": 0.025,
     "nominalStock": 0.021052631578947368,
     "totalStock": 0.021052631578947368,
     "totalDiluent": 0.07894736842105263,
     "preparedVolume": 0.1,
     "unusedStock": 0.008947368421052631
    },
    "flags": []
   }
  },
  {
   "name": "cells-split-1-in-4",
   "about": "A 1:4 split of 12 mL into 3 vessels: 3 mL each, no overage, no density predicted",
   "input": {
    "v": 1,
    "kind": "cells",
    "mode": "split",
    "vessels": 3,
    "finalVolume": {
     "value": 10,
     "unit": "mL"
    },
    "stockAvailable": {
     "value": 12,
     "unit": "mL"
    },
    "densityBasis": "total",
    "density": {
     "value": null,
     "unit": "cells/mL"
    },
    "viability": null,
    "countingDilution": "already-applied",
    "countingFactor": null,
    "targetBasis": "cells",
    "target": {
     "value": null,
     "unit": "cells"
    },
    "area": {
     "value": null,
     "unit": "cm²"
    },
    "overagePercent": 0,
    "splitParts": 4
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "splitParts": 4.0,
     "fractionPerVessel": 0.25,
     "vessels": 3.0,
     "stockPerVessel": 0.003,
     "diluentPerVessel": 0.007,
     "finalPerVessel": 0.01,
     "nominalStock": 0.009,
     "totalStock": 0.009,
     "totalDiluent": 0.021,
     "preparedVolume": 0.03,
     "unusedStock": 0.003
    },
    "flags": []
   }
  },
  {
   "name": "refused-cells-zero-density",
   "about": "Zero density",
   "input": {
    "v": 1,
    "kind": "cells",
    "mode": "measured",
    "vessels": 10,
    "finalVolume": {
     "value": 1,
     "unit": "mL"
    },
    "stockAvailable": {
     "value": 1,
     "unit": "mL"
    },
    "densityBasis": "total",
    "density": {
     "value": 0,
     "unit": "cells/mL"
    },
    "viability": 80,
    "countingDilution": "already-applied",
    "countingFactor": null,
    "targetBasis": "cells",
    "target": {
     "value": 100000,
     "unit": "cells"
    },
    "area": {
     "value": null,
     "unit": "cm²"
    },
    "overagePercent": 0,
    "splitParts": null
   },
   "expected": {
    "expect": "refused",
    "problem": "density"
   }
  },
  {
   "name": "refused-cells-insufficient-stock",
   "about": "1 mL of suspension cannot supply 10 vessels at 0.1875 mL each",
   "input": {
    "v": 1,
    "kind": "cells",
    "mode": "measured",
    "vessels": 10,
    "finalVolume": {
     "value": 1,
     "unit": "mL"
    },
    "stockAvailable": {
     "value": 1,
     "unit": "mL"
    },
    "densityBasis": "total",
    "density": {
     "value": 2000000,
     "unit": "cells/mL"
    },
    "viability": 80,
    "countingDilution": "already-applied",
    "countingFactor": null,
    "targetBasis": "cells",
    "target": {
     "value": 300000,
     "unit": "cells"
    },
    "area": {
     "value": null,
     "unit": "cm²"
    },
    "overagePercent": 0,
    "splitParts": null
   },
   "expected": {
    "expect": "refused",
    "problem": "insufficient-stock"
   }
  },
  {
   "name": "refused-cells-stock-above-final",
   "about": "Stock needed per vessel (1.25 mL) exceeds the 1 mL final volume",
   "input": {
    "v": 1,
    "kind": "cells",
    "mode": "measured",
    "vessels": 2,
    "finalVolume": {
     "value": 1,
     "unit": "mL"
    },
    "stockAvailable": {
     "value": 10,
     "unit": "mL"
    },
    "densityBasis": "total",
    "density": {
     "value": 2000000,
     "unit": "cells/mL"
    },
    "viability": 80,
    "countingDilution": "already-applied",
    "countingFactor": null,
    "targetBasis": "cells",
    "target": {
     "value": 2000000,
     "unit": "cells"
    },
    "area": {
     "value": null,
     "unit": "cm²"
    },
    "overagePercent": 0,
    "splitParts": null
   },
   "expected": {
    "expect": "refused",
    "problem": "negative-diluent"
   }
  },
  {
   "name": "refused-cells-split-more-vessels-than-parts",
   "about": "Five vessels from a 1:4 split",
   "input": {
    "v": 1,
    "kind": "cells",
    "mode": "split",
    "vessels": 5,
    "finalVolume": {
     "value": 10,
     "unit": "mL"
    },
    "stockAvailable": {
     "value": 12,
     "unit": "mL"
    },
    "densityBasis": "total",
    "density": {
     "value": null,
     "unit": "cells/mL"
    },
    "viability": null,
    "countingDilution": "already-applied",
    "countingFactor": null,
    "targetBasis": "cells",
    "target": {
     "value": null,
     "unit": "cells"
    },
    "area": {
     "value": null,
     "unit": "cm²"
    },
    "overagePercent": 0,
    "splitParts": 4
   },
   "expected": {
    "expect": "refused",
    "problem": "split-parts"
   }
  },
  {
   "name": "centrifuge-calc-md-rpm-to-rcf",
   "about": "calc.md C2: 7 cm at 5,000 RPM is about 1,956.5 × g",
   "input": {
    "v": 1,
    "kind": "centrifuge",
    "direction": "rpm-to-rcf",
    "radius": {
     "value": 7,
     "unit": "cm"
    },
    "radiusConvention": "maximum",
    "value": 5000,
    "maximumRpm": null
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "rpm": 5000.0,
     "rcf": 1956.5,
     "radius": 7.0,
     "coefficient": 1.118e-05
    },
    "text": {
     "radiusConvention": "maximum"
    },
    "flags": []
   }
  },
  {
   "name": "centrifuge-calc-md-mm",
   "about": "The same radius typed as 70 mm: identical",
   "input": {
    "v": 1,
    "kind": "centrifuge",
    "direction": "rpm-to-rcf",
    "radius": {
     "value": 70,
     "unit": "mm"
    },
    "radiusConvention": "maximum",
    "value": 5000,
    "maximumRpm": null
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "rpm": 5000.0,
     "rcf": 1956.5,
     "radius": 7.0,
     "coefficient": 1.118e-05
    },
    "text": {
     "radiusConvention": "maximum"
    },
    "flags": []
   }
  },
  {
   "name": "centrifuge-calc-md-inverse",
   "about": "The inverse: 1,956.5 × g at 7 cm is 5,000 RPM",
   "input": {
    "v": 1,
    "kind": "centrifuge",
    "direction": "rcf-to-rpm",
    "radius": {
     "value": 7,
     "unit": "cm"
    },
    "radiusConvention": "maximum",
    "value": 1956.5,
    "maximumRpm": null
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "rpm": 5000.0,
     "rcf": 1956.5,
     "radius": 7.0,
     "coefficient": 1.118e-05
    },
    "text": {
     "radiusConvention": "maximum"
    },
    "flags": []
   }
  },
  {
   "name": "centrifuge-inverse-mm",
   "about": "10,000 × g at 95 mm average radius",
   "input": {
    "v": 1,
    "kind": "centrifuge",
    "direction": "rcf-to-rpm",
    "radius": {
     "value": 95,
     "unit": "mm"
    },
    "radiusConvention": "average",
    "value": 10000,
    "maximumRpm": null
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "rpm": 9703.251667822633,
     "rcf": 10000.0,
     "radius": 9.5,
     "coefficient": 1.118e-05
    },
    "text": {
     "radiusConvention": "average"
    },
    "flags": []
   }
  },
  {
   "name": "centrifuge-convention-changes-receipt",
   "about": "The minimum radius convention is carried into the result",
   "input": {
    "v": 1,
    "kind": "centrifuge",
    "direction": "rpm-to-rcf",
    "radius": {
     "value": 4.5,
     "unit": "cm"
    },
    "radiusConvention": "minimum",
    "value": 13000,
    "maximumRpm": null
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "rpm": 13000.0,
     "rcf": 8502.39,
     "radius": 4.5,
     "coefficient": 1.118e-05
    },
    "text": {
     "radiusConvention": "minimum"
    },
    "flags": []
   }
  },
  {
   "name": "centrifuge-limit-exceeded",
   "about": "15,000 RPM against a supplied 14,000 RPM maximum is flagged",
   "input": {
    "v": 1,
    "kind": "centrifuge",
    "direction": "rpm-to-rcf",
    "radius": {
     "value": 8.4,
     "unit": "cm"
    },
    "radiusConvention": "maximum",
    "value": 15000,
    "maximumRpm": 14000
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "rpm": 15000.0,
     "rcf": 21130.2,
     "radius": 8.4,
     "coefficient": 1.118e-05,
     "maximumRpm": 14000.0
    },
    "text": {
     "radiusConvention": "maximum"
    },
    "flags": [
     "rotor-limit-exceeded"
    ]
   }
  },
  {
   "name": "centrifuge-limit-respected",
   "about": "12,000 RPM under a supplied 14,000 RPM maximum is not flagged",
   "input": {
    "v": 1,
    "kind": "centrifuge",
    "direction": "rpm-to-rcf",
    "radius": {
     "value": 8.4,
     "unit": "cm"
    },
    "radiusConvention": "maximum",
    "value": 12000,
    "maximumRpm": 14000
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "rpm": 12000.0,
     "rcf": 13523.328,
     "radius": 8.4,
     "coefficient": 1.118e-05,
     "maximumRpm": 14000.0
    },
    "text": {
     "radiusConvention": "maximum"
    },
    "flags": []
   }
  },
  {
   "name": "refused-centrifuge-zero-radius",
   "about": "Radius zero",
   "input": {
    "v": 1,
    "kind": "centrifuge",
    "direction": "rpm-to-rcf",
    "radius": {
     "value": 0,
     "unit": "cm"
    },
    "radiusConvention": "maximum",
    "value": 5000,
    "maximumRpm": null
   },
   "expected": {
    "expect": "refused",
    "problem": "centrifuge-input"
   }
  },
  {
   "name": "refused-centrifuge-missing-radius",
   "about": "No radius",
   "input": {
    "v": 1,
    "kind": "centrifuge",
    "direction": "rpm-to-rcf",
    "radius": {
     "value": null,
     "unit": "cm"
    },
    "radiusConvention": "maximum",
    "value": 5000,
    "maximumRpm": null
   },
   "expected": {
    "expect": "refused",
    "problem": "centrifuge-input"
   }
  },
  {
   "name": "refused-centrifuge-no-convention",
   "about": "No radius convention",
   "input": {
    "v": 1,
    "kind": "centrifuge",
    "direction": "rpm-to-rcf",
    "radius": {
     "value": 7,
     "unit": "cm"
    },
    "radiusConvention": null,
    "value": 5000,
    "maximumRpm": null
   },
   "expected": {
    "expect": "refused",
    "problem": "centrifuge-input"
   }
  },
  {
   "name": "percent-calc-md-wv",
   "about": "calc.md C3: 5% w/v in 200 mL needs 10 g",
   "input": {
    "v": 1,
    "kind": "percent",
    "basis": "w/v",
    "percent": 5,
    "final": {
     "value": 200,
     "unit": "mL"
    },
    "material": "",
    "sourceNote": ""
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "percent": 5.0,
     "soluteMass": 10.0,
     "finalVolume": 0.2
    },
    "text": {
     "percentBasis": "w/v"
    },
    "flags": []
   }
  },
  {
   "name": "percent-calc-md-ww",
   "about": "calc.md C3: 5% w/w in 200 g needs 10 g solute and 190 g other material",
   "input": {
    "v": 1,
    "kind": "percent",
    "basis": "w/w",
    "percent": 5,
    "final": {
     "value": 200,
     "unit": "g"
    },
    "material": "",
    "sourceNote": ""
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "percent": 5.0,
     "soluteMass": 10.0,
     "otherMass": 190.0,
     "finalMass": 200.0
    },
    "text": {
     "percentBasis": "w/w"
    },
    "flags": []
   }
  },
  {
   "name": "percent-calc-md-vv",
   "about": "calc.md C3: 5% laboratory v/v in 200 mL needs 10 mL solute, made up to 200 mL",
   "input": {
    "v": 1,
    "kind": "percent",
    "basis": "v/v",
    "percent": 5,
    "final": {
     "value": 200,
     "unit": "mL"
    },
    "material": "",
    "sourceNote": ""
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "percent": 5.0,
     "soluteVolume": 0.01,
     "finalVolume": 0.2
    },
    "text": {
     "percentBasis": "v/v"
    },
    "flags": []
   }
  },
  {
   "name": "percent-wv-above-100",
   "about": "w/v may exceed 100 (150 g per 100 mL in 50 mL)",
   "input": {
    "v": 1,
    "kind": "percent",
    "basis": "w/v",
    "percent": 150,
    "final": {
     "value": 50,
     "unit": "mL"
    },
    "material": "",
    "sourceNote": ""
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "percent": 150.0,
     "soluteMass": 75.0,
     "finalVolume": 0.05
    },
    "text": {
     "percentBasis": "w/v"
    },
    "flags": []
   }
  },
  {
   "name": "percent-ww-kg",
   "about": "0.9% w/w in 1.5 kg",
   "input": {
    "v": 1,
    "kind": "percent",
    "basis": "w/w",
    "percent": 0.9,
    "final": {
     "value": 1.5,
     "unit": "kg"
    },
    "material": "",
    "sourceNote": ""
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "percent": 0.9,
     "soluteMass": 13.5,
     "otherMass": 1486.5,
     "finalMass": 1500.0
    },
    "text": {
     "percentBasis": "w/w"
    },
    "flags": []
   }
  },
  {
   "name": "refused-percent-ww-above-100",
   "about": "w/w above 100%",
   "input": {
    "v": 1,
    "kind": "percent",
    "basis": "w/w",
    "percent": 120,
    "final": {
     "value": 200,
     "unit": "g"
    },
    "material": "",
    "sourceNote": ""
   },
   "expected": {
    "expect": "refused",
    "problem": "percent-input"
   }
  },
  {
   "name": "refused-percent-vv-above-100",
   "about": "v/v above 100%",
   "input": {
    "v": 1,
    "kind": "percent",
    "basis": "v/v",
    "percent": 101,
    "final": {
     "value": 200,
     "unit": "mL"
    },
    "material": "",
    "sourceNote": ""
   },
   "expected": {
    "expect": "refused",
    "problem": "percent-input"
   }
  },
  {
   "name": "refused-percent-cross-basis",
   "about": "A w/w percentage with a final volume: a density would be needed",
   "input": {
    "v": 1,
    "kind": "percent",
    "basis": "w/w",
    "percent": 5,
    "final": {
     "value": 200,
     "unit": "mL"
    },
    "material": "",
    "sourceNote": ""
   },
   "expected": {
    "expect": "refused",
    "problem": "percent-input"
   }
  },
  {
   "name": "antibody-calc-md-concentration",
   "about": "calc.md C4: 1 mg/mL to 2 µg/mL in 10 mL takes 20 µL",
   "input": {
    "v": 1,
    "kind": "antibody",
    "mode": "concentration",
    "stock": {
     "value": 1,
     "unit": "mg/mL"
    },
    "target": {
     "value": 2,
     "unit": "µg/mL"
    },
    "factor": null,
    "volume": {
     "value": 10,
     "unit": "mL"
    },
    "vessels": 1,
    "minimumTransfer": null,
    "clone": "",
    "catalogue": "",
    "lot": "",
    "assay": "",
    "sourceNote": "",
    "intermediate": null
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "vessels": 1.0,
     "finalPerVessel": 0.01,
     "finalVolume": 0.01,
     "dilutionFactor": 500.0,
     "stockVolume": 2e-05,
     "diluentVolume": 0.00998,
     "finalConcentration": 0.002
    },
    "flags": []
   }
  },
  {
   "name": "antibody-calc-md-ratio",
   "about": "calc.md C4: 1:500 from a 1 mg/mL stock gives the same 20 µL",
   "input": {
    "v": 1,
    "kind": "antibody",
    "mode": "ratio",
    "stock": {
     "value": 1,
     "unit": "mg/mL"
    },
    "target": {
     "value": null,
     "unit": "µg/mL"
    },
    "factor": 500,
    "volume": {
     "value": 10,
     "unit": "mL"
    },
    "vessels": 1,
    "minimumTransfer": null,
    "clone": "",
    "catalogue": "",
    "lot": "",
    "assay": "",
    "sourceNote": "",
    "intermediate": null
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "vessels": 1.0,
     "finalPerVessel": 0.01,
     "finalVolume": 0.01,
     "dilutionFactor": 500.0,
     "stockVolume": 2e-05,
     "diluentVolume": 0.00998,
     "finalConcentration": 0.002
    },
    "flags": []
   }
  },
  {
   "name": "antibody-ratio-without-stock",
   "about": "calc.md C4: 1:1,000 with no stock concentration: volumes, no absolute concentration",
   "input": {
    "v": 1,
    "kind": "antibody",
    "mode": "ratio",
    "stock": {
     "value": null,
     "unit": "mg/mL"
    },
    "target": {
     "value": null,
     "unit": "µg/mL"
    },
    "factor": 1000,
    "volume": {
     "value": 0.5,
     "unit": "mL"
    },
    "vessels": 12,
    "minimumTransfer": null,
    "clone": "",
    "catalogue": "",
    "lot": "",
    "assay": "",
    "sourceNote": "",
    "intermediate": null
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "vessels": 12.0,
     "finalPerVessel": 0.0005,
     "finalVolume": 0.006,
     "dilutionFactor": 1000.0,
     "stockVolume": 6e-06,
     "diluentVolume": 0.005994
    },
    "flags": [
     "no-absolute-concentration"
    ]
   }
  },
  {
   "name": "antibody-batch-for-vessels",
   "about": "0.5 mg/mL to 1 µg/mL, 0.2 mL in each of 24 wells",
   "input": {
    "v": 1,
    "kind": "antibody",
    "mode": "concentration",
    "stock": {
     "value": 0.5,
     "unit": "mg/mL"
    },
    "target": {
     "value": 1,
     "unit": "µg/mL"
    },
    "factor": null,
    "volume": {
     "value": 0.2,
     "unit": "mL"
    },
    "vessels": 24,
    "minimumTransfer": null,
    "clone": "",
    "catalogue": "",
    "lot": "",
    "assay": "",
    "sourceNote": "",
    "intermediate": null
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "vessels": 24.0,
     "finalPerVessel": 0.0002,
     "finalVolume": 0.0048,
     "dilutionFactor": 500.0,
     "stockVolume": 9.6e-06,
     "diluentVolume": 0.0047904,
     "finalConcentration": 0.001
    },
    "flags": []
   }
  },
  {
   "name": "antibody-molar",
   "about": "6.7 µM to 10 nM in 5 mL (molar units)",
   "input": {
    "v": 1,
    "kind": "antibody",
    "mode": "concentration",
    "stock": {
     "value": 6.7,
     "unit": "µM"
    },
    "target": {
     "value": 10,
     "unit": "nM"
    },
    "factor": null,
    "volume": {
     "value": 5,
     "unit": "mL"
    },
    "vessels": 1,
    "minimumTransfer": null,
    "clone": "",
    "catalogue": "",
    "lot": "",
    "assay": "",
    "sourceNote": "",
    "intermediate": null
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "vessels": 1.0,
     "finalPerVessel": 0.005,
     "finalVolume": 0.005,
     "dilutionFactor": 670.0,
     "stockVolume": 7.462686567164179e-06,
     "diluentVolume": 0.004992537313432836,
     "finalConcentration": 1e-08
    },
    "flags": []
   }
  },
  {
   "name": "antibody-below-minimum",
   "about": "1:10,000 in 1 mL takes 0.1 µL, below a 2 µL minimum: flagged",
   "input": {
    "v": 1,
    "kind": "antibody",
    "mode": "ratio",
    "stock": {
     "value": 1,
     "unit": "mg/mL"
    },
    "target": {
     "value": null,
     "unit": "µg/mL"
    },
    "factor": 10000,
    "volume": {
     "value": 1,
     "unit": "mL"
    },
    "vessels": 1,
    "minimumTransfer": {
     "value": 2,
     "unit": "µL"
    },
    "clone": "",
    "catalogue": "",
    "lot": "",
    "assay": "",
    "sourceNote": "",
    "intermediate": null
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "vessels": 1.0,
     "finalPerVessel": 0.001,
     "finalVolume": 0.001,
     "dilutionFactor": 10000.0,
     "stockVolume": 1e-07,
     "diluentVolume": 0.0009999,
     "finalConcentration": 0.0001
    },
    "flags": [
     "below-minimum-transfer"
    ]
   }
  },
  {
   "name": "refused-antibody-target-above-stock",
   "about": "A target above the stock cannot be reached by dilution",
   "input": {
    "v": 1,
    "kind": "antibody",
    "mode": "concentration",
    "stock": {
     "value": 1,
     "unit": "µg/mL"
    },
    "target": {
     "value": 2,
     "unit": "µg/mL"
    },
    "factor": null,
    "volume": {
     "value": 10,
     "unit": "mL"
    },
    "vessels": 1,
    "minimumTransfer": null,
    "clone": "",
    "catalogue": "",
    "lot": "",
    "assay": "",
    "sourceNote": "",
    "intermediate": null
   },
   "expected": {
    "expect": "refused",
    "problem": "antibody-input"
   }
  },
  {
   "name": "refused-antibody-ratio-below-1",
   "about": "A 1:0.5 ratio would concentrate",
   "input": {
    "v": 1,
    "kind": "antibody",
    "mode": "ratio",
    "stock": {
     "value": 1,
     "unit": "mg/mL"
    },
    "target": {
     "value": null,
     "unit": "µg/mL"
    },
    "factor": 0.5,
    "volume": {
     "value": 10,
     "unit": "mL"
    },
    "vessels": 1,
    "minimumTransfer": null,
    "clone": "",
    "catalogue": "",
    "lot": "",
    "assay": "",
    "sourceNote": "",
    "intermediate": null
   },
   "expected": {
    "expect": "refused",
    "problem": "antibody-input"
   }
  },
  {
   "name": "refused-antibody-mixed-families",
   "about": "A mass-concentration stock with a molar target needs a molar mass",
   "input": {
    "v": 1,
    "kind": "antibody",
    "mode": "concentration",
    "stock": {
     "value": 1,
     "unit": "mg/mL"
    },
    "target": {
     "value": 10,
     "unit": "nM"
    },
    "factor": null,
    "volume": {
     "value": 10,
     "unit": "mL"
    },
    "vessels": 1,
    "minimumTransfer": null,
    "clone": "",
    "catalogue": "",
    "lot": "",
    "assay": "",
    "sourceNote": "",
    "intermediate": null
   },
   "expected": {
    "expect": "refused",
    "problem": "antibody-input"
   }
  },
  {
   "name": "refused-cells-double-viability",
   "about": "An already-viable density with a viability entered: viability would be applied twice",
   "input": {
    "v": 1,
    "kind": "cells",
    "mode": "measured",
    "vessels": 10,
    "finalVolume": {
     "value": 1,
     "unit": "mL"
    },
    "stockAvailable": {
     "value": 1,
     "unit": "mL"
    },
    "densityBasis": "viable",
    "density": {
     "value": 1600000,
     "unit": "cells/mL"
    },
    "viability": 80,
    "countingDilution": "already-applied",
    "countingFactor": null,
    "targetBasis": "cells",
    "target": {
     "value": 100000,
     "unit": "cells"
    },
    "area": {
     "value": null,
     "unit": "cm²"
    },
    "overagePercent": 10,
    "splitParts": null
   },
   "expected": {
    "expect": "refused",
    "problem": "invalid-input"
   }
  },
  {
   "name": "antibody-intermediate-source",
   "about": "1 mg/mL to 1 ng/mL in 10 mL through the intermediate planner: the source handed over",
   "input": {
    "v": 1,
    "kind": "antibody",
    "mode": "concentration",
    "stock": {
     "value": 1,
     "unit": "mg/mL"
    },
    "target": {
     "value": 1,
     "unit": "ng/mL"
    },
    "factor": null,
    "volume": {
     "value": 10,
     "unit": "mL"
    },
    "vessels": 1,
    "minimumTransfer": null,
    "clone": "",
    "catalogue": "",
    "lot": "",
    "assay": "",
    "sourceNote": "",
    "intermediate": {
     "v": 1,
     "minimumTransfer": 2e-06,
     "maximumTransfer": 0.02,
     "stockAvailable": 0.0001,
     "intermediateCapacity": 0.0015,
     "extraVolume": 2e-05,
     "stockSolventFraction": 0,
     "intermediateDiluentSolventFraction": 0,
     "finalDiluentSolventFraction": 0,
     "maximumFinalSolventFraction": 1,
     "solvent": "Carrier"
    }
   },
   "expected": {
    "expect": "intermediate",
    "source": {
     "stockConcentration": 1.0,
     "finalConcentration": 1e-06,
     "finalVolume": 0.01,
     "concentrationUnit": "g/L"
    },
    "planOracle": "src/lib/dilution/fixtures/intermediate-dilution.json",
    "gridCheck": {
     "feasible": true,
     "kind": "one-intermediate",
     "gridStepMicrolitres": 0.5,
     "gridPlanMicrolitres": {
      "stock": 2.0,
      "intermediateDiluent": 398.0,
      "intermediateVolume": 400.0,
      "transfer": 2.0,
      "finalDiluent": 9998.0,
      "remaining": 398.0
     }
    }
   }
  }
 ]
}
