{
 "about": {
  "method": "a260-rules-of-thumb",
  "recordedOn": "2026-10-17",
  "script": "pipeline/lab-calculators/a260_reference_2.py",
  "scriptSha256": "cd9bd699df8cd0ba8c5afb644c245dc6dd59ee72c6c91644cc397a431f134ed7",
  "source": "The CSO's ruling of 17 October 2026 on SCI-145 (docs/board/memos/2026-10-17-cso-ssdna-a260-factor.md), ruling 5, and on SCI-148 (docs/board/memos/2026-10-17-cso-a260-refusals.md): 50/40/33 at 1 cm, dilution and path-length cases, and the refusals. The factors are conventions, transcribed in the script from the sources it names, apart from src/lib/seq/absorbance.ts",
  "factorSources": {
   "dsDNA": "Thermo Fisher, DNA and RNA Molecular Weights and Conversions; NanoDrop One FAQ (read 17 October 2026)",
   "RNA": "Thermo Fisher, DNA and RNA Molecular Weights and Conversions; NanoDrop One FAQ (read 17 October 2026)",
   "ssDNA": "NanoDrop One FAQ; Thermo Fisher technical note MCS-TN1315-EN; Cavaluzzi and Borer 2004, Method 1 (read 17 October 2026)"
  },
  "supersedes": {
   "fixture": "src/lib/seq/fixtures/a260.json",
   "version": "0.4.0",
   "cases": {
    "zero-reading": "refused-reading-zero"
   }
  },
  "units": {
   "a260": "absorbance units",
   "pathLengthCm": "cm",
   "dilution": "fold (a 20-fold dilution is 20)",
   "concentration": "µg/mL and g/L"
  },
  "tolerances": {
   "values": "within 1e-9 relative",
   "refusals": "exact, by problem code"
  }
 },
 "oracle": {
  "name": "Python fractions and decimal",
  "version": "3.13.16"
 },
 "count": 19,
 "recordedOn": "2026-10-17",
 "cases": [
  {
   "name": "dsdna-1cm",
   "about": "1 A260 unit of dsDNA at 1 cm is 50 µg/mL",
   "input": {
    "a260": 1,
    "kind": "dsDNA",
    "pathLengthCm": 1,
    "dilution": 1
   },
   "expected": {
    "expect": "ok",
    "factor": 50.0,
    "sampleMicrogramsPerMl": 50.0,
    "sampleGramsPerLitre": 0.05,
    "stockMicrogramsPerMl": 50.0,
    "stockGramsPerLitre": 0.05,
    "exact": {
     "sampleMicrogramsPerMl": "50",
     "stockMicrogramsPerMl": "50"
    }
   }
  },
  {
   "name": "rna-1cm",
   "about": "1 A260 unit of RNA at 1 cm is 40 µg/mL",
   "input": {
    "a260": 1,
    "kind": "RNA",
    "pathLengthCm": 1,
    "dilution": 1
   },
   "expected": {
    "expect": "ok",
    "factor": 40.0,
    "sampleMicrogramsPerMl": 40.0,
    "sampleGramsPerLitre": 0.04,
    "stockMicrogramsPerMl": 40.0,
    "stockGramsPerLitre": 0.04,
    "exact": {
     "sampleMicrogramsPerMl": "40",
     "stockMicrogramsPerMl": "40"
    }
   }
  },
  {
   "name": "ssdna-1cm",
   "about": "1 A260 unit of ssDNA at 1 cm is 33 µg/mL, the NanoDrop convention",
   "input": {
    "a260": 1,
    "kind": "ssDNA",
    "pathLengthCm": 1,
    "dilution": 1
   },
   "expected": {
    "expect": "ok",
    "factor": 33.0,
    "sampleMicrogramsPerMl": 33.0,
    "sampleGramsPerLitre": 0.033,
    "stockMicrogramsPerMl": 33.0,
    "stockGramsPerLitre": 0.033,
    "exact": {
     "sampleMicrogramsPerMl": "33",
     "stockMicrogramsPerMl": "33"
    }
   }
  },
  {
   "name": "dsdna-reference-page",
   "about": "The A260 reference page's illustrative reading: 0.75 dsDNA at 1 cm is 37.5 µg/mL",
   "input": {
    "a260": "0.75",
    "kind": "dsDNA",
    "pathLengthCm": 1,
    "dilution": 1
   },
   "expected": {
    "expect": "ok",
    "factor": 50.0,
    "sampleMicrogramsPerMl": 37.5,
    "sampleGramsPerLitre": 0.0375,
    "stockMicrogramsPerMl": 37.5,
    "stockGramsPerLitre": 0.0375,
    "exact": {
     "sampleMicrogramsPerMl": "37.5",
     "stockMicrogramsPerMl": "37.5"
    }
   }
  },
  {
   "name": "dsdna-dilution-20",
   "about": "0.25 read on a 20-fold dilution of a dsDNA prep at 1 cm: 12.5 µg/mL read, 250 µg/mL in the stock",
   "input": {
    "a260": "0.25",
    "kind": "dsDNA",
    "pathLengthCm": 1,
    "dilution": 20
   },
   "expected": {
    "expect": "ok",
    "factor": 50.0,
    "sampleMicrogramsPerMl": 12.5,
    "sampleGramsPerLitre": 0.0125,
    "stockMicrogramsPerMl": 250.0,
    "stockGramsPerLitre": 0.25,
    "exact": {
     "sampleMicrogramsPerMl": "12.5",
     "stockMicrogramsPerMl": "250"
    }
   }
  },
  {
   "name": "rna-dilution-50",
   "about": "0.4 read on a 50-fold dilution of an RNA prep at 1 cm: 16 µg/mL read, 800 µg/mL in the stock",
   "input": {
    "a260": "0.4",
    "kind": "RNA",
    "pathLengthCm": 1,
    "dilution": 50
   },
   "expected": {
    "expect": "ok",
    "factor": 40.0,
    "sampleMicrogramsPerMl": 16.0,
    "sampleGramsPerLitre": 0.016,
    "stockMicrogramsPerMl": 800.0,
    "stockGramsPerLitre": 0.8,
    "exact": {
     "sampleMicrogramsPerMl": "16",
     "stockMicrogramsPerMl": "800"
    }
   }
  },
  {
   "name": "ssdna-dilution-10",
   "about": "0.33 read on a 10-fold dilution of ssDNA at 1 cm: 10.89 µg/mL read, 108.9 µg/mL in the stock",
   "input": {
    "a260": "0.33",
    "kind": "ssDNA",
    "pathLengthCm": 1,
    "dilution": 10
   },
   "expected": {
    "expect": "ok",
    "factor": 33.0,
    "sampleMicrogramsPerMl": 10.89,
    "sampleGramsPerLitre": 0.01089,
    "stockMicrogramsPerMl": 108.9,
    "stockGramsPerLitre": 0.1089,
    "exact": {
     "sampleMicrogramsPerMl": "10.89",
     "stockMicrogramsPerMl": "108.9"
    }
   }
  },
  {
   "name": "dsdna-path-0.5",
   "about": "0.5 dsDNA in a 0.5 cm path (a plate well stating its own path) is 50 µg/mL",
   "input": {
    "a260": "0.5",
    "kind": "dsDNA",
    "pathLengthCm": "0.5",
    "dilution": 1
   },
   "expected": {
    "expect": "ok",
    "factor": 50.0,
    "sampleMicrogramsPerMl": 50.0,
    "sampleGramsPerLitre": 0.05,
    "stockMicrogramsPerMl": 50.0,
    "stockGramsPerLitre": 0.05,
    "exact": {
     "sampleMicrogramsPerMl": "50",
     "stockMicrogramsPerMl": "50"
    }
   }
  },
  {
   "name": "rna-path-0.1",
   "about": "0.2 RNA in a 0.1 cm path is 80 µg/mL",
   "input": {
    "a260": "0.2",
    "kind": "RNA",
    "pathLengthCm": "0.1",
    "dilution": 1
   },
   "expected": {
    "expect": "ok",
    "factor": 40.0,
    "sampleMicrogramsPerMl": 80.0,
    "sampleGramsPerLitre": 0.08,
    "stockMicrogramsPerMl": 80.0,
    "stockGramsPerLitre": 0.08,
    "exact": {
     "sampleMicrogramsPerMl": "80",
     "stockMicrogramsPerMl": "80"
    }
   }
  },
  {
   "name": "ssdna-path-0.2-dilution-5",
   "about": "0.66 ssDNA in a 0.2 cm path on a 5-fold dilution: 108.9 µg/mL read, 544.5 µg/mL in the stock",
   "input": {
    "a260": "0.66",
    "kind": "ssDNA",
    "pathLengthCm": "0.2",
    "dilution": 5
   },
   "expected": {
    "expect": "ok",
    "factor": 33.0,
    "sampleMicrogramsPerMl": 108.9,
    "sampleGramsPerLitre": 0.1089,
    "stockMicrogramsPerMl": 544.5,
    "stockGramsPerLitre": 0.5445,
    "exact": {
     "sampleMicrogramsPerMl": "108.9",
     "stockMicrogramsPerMl": "544.5"
    }
   }
  },
  {
   "name": "dsdna-path-0.05-dilution-2",
   "about": "1.2 dsDNA in a 0.05 cm path on a 2-fold dilution: 1200 µg/mL read, 2400 µg/mL in the stock",
   "input": {
    "a260": "1.2",
    "kind": "dsDNA",
    "pathLengthCm": "0.05",
    "dilution": 2
   },
   "expected": {
    "expect": "ok",
    "factor": 50.0,
    "sampleMicrogramsPerMl": 1200.0,
    "sampleGramsPerLitre": 1.2,
    "stockMicrogramsPerMl": 2400.0,
    "stockGramsPerLitre": 2.4,
    "exact": {
     "sampleMicrogramsPerMl": "1200",
     "stockMicrogramsPerMl": "2400"
    }
   }
  },
  {
   "name": "refused-path-zero",
   "about": "A path length of zero gives no concentration",
   "input": {
    "a260": 1,
    "kind": "dsDNA",
    "pathLengthCm": 0,
    "dilution": 1
   },
   "expected": {
    "expect": "refused",
    "problem": "path-not-positive"
   }
  },
  {
   "name": "refused-path-negative",
   "about": "A negative path length gives no concentration",
   "input": {
    "a260": 1,
    "kind": "ssDNA",
    "pathLengthCm": -1,
    "dilution": 1
   },
   "expected": {
    "expect": "refused",
    "problem": "path-not-positive"
   }
  },
  {
   "name": "refused-reading-zero",
   "about": "A reading at the blank means not detected, not 0 µg/mL (supersedes 0.4.0's zero-reading)",
   "input": {
    "a260": 0,
    "kind": "RNA",
    "pathLengthCm": 1,
    "dilution": 1
   },
   "expected": {
    "expect": "refused",
    "problem": "reading-not-positive"
   }
  },
  {
   "name": "refused-reading-negative",
   "about": "A reading below the blank is noise, not a concentration",
   "input": {
    "a260": "-0.02",
    "kind": "dsDNA",
    "pathLengthCm": 1,
    "dilution": 1
   },
   "expected": {
    "expect": "refused",
    "problem": "reading-not-positive"
   }
  },
  {
   "name": "refused-reading-nan",
   "about": "A reading that is not a number",
   "input": {
    "a260": "NaN",
    "kind": "dsDNA",
    "pathLengthCm": 1,
    "dilution": 1
   },
   "expected": {
    "expect": "refused",
    "problem": "reading-not-finite"
   }
  },
  {
   "name": "refused-reading-infinity",
   "about": "An infinite reading",
   "input": {
    "a260": "Infinity",
    "kind": "RNA",
    "pathLengthCm": 1,
    "dilution": 1
   },
   "expected": {
    "expect": "refused",
    "problem": "reading-not-finite"
   }
  },
  {
   "name": "refused-reading-minus-infinity",
   "about": "A negative infinite reading",
   "input": {
    "a260": "-Infinity",
    "kind": "ssDNA",
    "pathLengthCm": 1,
    "dilution": 1
   },
   "expected": {
    "expect": "refused",
    "problem": "reading-not-finite"
   }
  },
  {
   "name": "smallest-accepted",
   "about": "The smallest reading the field accepts, 0.0001 dsDNA at 1 cm, gives 0.005 µg/mL: a small positive reading is not refused",
   "input": {
    "a260": "0.0001",
    "kind": "dsDNA",
    "pathLengthCm": 1,
    "dilution": 1
   },
   "expected": {
    "expect": "ok",
    "factor": 50.0,
    "sampleMicrogramsPerMl": 0.005,
    "sampleGramsPerLitre": 5e-06,
    "stockMicrogramsPerMl": 0.005,
    "stockGramsPerLitre": 5e-06,
    "exact": {
     "sampleMicrogramsPerMl": "0.005",
     "stockMicrogramsPerMl": "0.005"
    }
   }
  }
 ]
}
