{
 "about": {
  "generatedBy": "pipeline/sequence-toolkit/reference.py",
  "scriptSha256": "1bc66633d1a780a7f255b02743e9258652769ed35b770f193c5d74e0070410d6",
  "recordedOn": "2026-10-06",
  "python": "3.11.15",
  "oracle": "Hand arithmetic from cited constants",
  "oracleLicence": "Constants are facts with citations (CIAAW, PubChem)",
  "rule": "No value in this file comes from the Drybench engine under test.",
  "fixture": "DNA MW by hand, 5 oligos (brief section 4.3 (5))",
  "tolerance": "Within 0.01 g/mol of expected.mw_g_per_mol (CSO ruling, 6 October 2026)",
  "ruling": "CSO ruling, 6 October 2026 (item 9): the card reads cardWording; no vendor formula is offered or cited",
  "cardWording": "Single-stranded, 5'-OH and 3'-OH, neutral free acid, average masses from CIAAW 2021; delivered oligos are usually sodium salts and weigh more.",
  "endGroupConvention": "5'-OH and 3'-OH, no terminal phosphate (the convention the brief states): MW = sum(n_i x residue_i) + M(H2O) - M(HPO3) = sum(n_i x residue_i) - 61.964",
  "atomicWeights": {
   "values": {
    "H": "1.0080",
    "C": "12.011",
    "N": "14.007",
    "O": "15.999",
    "P": "30.974"
   },
   "source": "CIAAW, Abridged Standard Atomic Weights 2024 (five significant figures), https://www.ciaaw.org/abridged-atomic-weights.htm, read 2026-10-06; equal for H, C, N, O and P to the values implied by CIAAW 2021 (Prohaska T et al., Pure Appl Chem 2022;94:573-600, doi:10.1515/pac-2019-0603). H, C, N and O are interval elements; their abridged values (1.0080, 12.011, 14.007, 15.999) are the conventional ones.",
   "sensitivity": "Using P's full standard atomic weight 30.973761998 instead of 30.974 lowers each MW by 0.000238 per phosphorus (n - 1 phosphorus atoms for n nucleotides): 0.0045 g/mol for a 20-mer."
  },
  "residues": {
   "A": {
    "residue": "dA",
    "formula": "C10H12N5O5P",
    "mass": 313.21,
    "massExact": "313.210000",
    "derivedFrom": "dAMP C10H14N5O6P, PubChem CID 12599 (https://pubchem.ncbi.nlm.nih.gov/compound/12599, read 2026-10-06), minus H2O"
   },
   "C": {
    "residue": "dC",
    "formula": "C9H12N3O6P",
    "mass": 289.184,
    "massExact": "289.184000",
    "derivedFrom": "dCMP C9H14N3O7P, PubChem CID 13945 (https://pubchem.ncbi.nlm.nih.gov/compound/13945, read 2026-10-06), minus H2O"
   },
   "G": {
    "residue": "dG",
    "formula": "C10H12N5O6P",
    "mass": 329.209,
    "massExact": "329.209000",
    "derivedFrom": "dGMP C10H14N5O7P, PubChem CID 135398597 (https://pubchem.ncbi.nlm.nih.gov/compound/135398597, read 2026-10-06), minus H2O"
   },
   "T": {
    "residue": "dT",
    "formula": "C10H13N2O7P",
    "mass": 304.195,
    "massExact": "304.195000",
    "derivedFrom": "dTMP (thymidine 5'-monophosphate) C10H15N2O8P, PubChem CID 9700 (https://pubchem.ncbi.nlm.nih.gov/compound/9700, read 2026-10-06), minus H2O"
   }
  },
  "endGroup": {
   "formula": "+H -P -2O (= +H2O -HPO3)",
   "mass": -61.964,
   "massExact": "-61.964000"
  }
 },
 "cases": [
  {
   "id": "M01",
   "input": {
    "label": "dA (one nucleotide)",
    "sequence": "A",
    "length": 1,
    "counts": {
     "A": 1,
     "C": 0,
     "G": 0,
     "T": 0
    },
    "form": "single-stranded, linear, 5'-OH and 3'-OH (no terminal phosphate), neutral free acid, average masses from CIAAW 2021"
   },
   "expected": {
    "mw_g_per_mol": 251.246,
    "mwExact": "251.246000",
    "formula": "C10H13N5O3",
    "working": "1 x 313.210 (dA) - 61.964 = 251.246"
   },
   "crossCheck": {
    "biopython": {
     "value5PrimeOH": 251.2428,
     "difference": -0.003200000000020964,
     "call": "Bio.SeqUtils.molecular_weight(Seq('A'), seq_type='DNA') - HPO3 (79.979)",
     "note": "Biopython's DNA weights are 5'-monophosphate masses with its own atomic weights, so its oligo carries a 5'-phosphate; HPO3 is subtracted to compare"
    }
   },
   "method": "Hand arithmetic: sum of residue masses (deoxynucleoside 5'-monophosphate minus H2O, from PubChem formulas and CIAAW abridged atomic weights) plus the end-group term H - P - 2O (= + H2O - HPO3)",
   "oracle": "hand arithmetic (exact rational arithmetic in reference.py)",
   "oracleVersion": "constants as listed in about",
   "recordedOn": "2026-10-06",
   "source": "pipeline/sequence-toolkit/reference.py (dna-mw)",
   "notes": "Checks the end-group convention: 5'-OH, 3'-OH dA is deoxyadenosine, C10H13N5O3 (PubChem CID 13730, 251.24 g/mol)."
  },
  {
   "id": "M02",
   "input": {
    "label": "T7 promoter primer",
    "sequence": "TAATACGACTCACTATAGGG",
    "length": 20,
    "counts": {
     "A": 7,
     "C": 4,
     "G": 4,
     "T": 5
    },
    "form": "single-stranded, linear, 5'-OH and 3'-OH (no terminal phosphate), neutral free acid, average masses from CIAAW 2021"
   },
   "expected": {
    "mw_g_per_mol": 6125.053,
    "mwExact": "6125.053000",
    "formula": "C196H246N77O116P19",
    "working": "7 x 313.210 (dA) + 4 x 289.184 (dC) + 4 x 329.209 (dG) + 5 x 304.195 (dT) - 61.964 = 6125.053"
   },
   "crossCheck": {
    "biopython": {
     "value5PrimeOH": 6124.9986,
     "difference": -0.0543999999999869,
     "call": "Bio.SeqUtils.molecular_weight(Seq('TAATACGACTCACTATAGGG'), seq_type='DNA') - HPO3 (79.979)",
     "note": "Biopython's DNA weights are 5'-monophosphate masses with its own atomic weights, so its oligo carries a 5'-phosphate; HPO3 is subtracted to compare"
    }
   },
   "method": "Hand arithmetic: sum of residue masses (deoxynucleoside 5'-monophosphate minus H2O, from PubChem formulas and CIAAW abridged atomic weights) plus the end-group term H - P - 2O (= + H2O - HPO3)",
   "oracle": "hand arithmetic (exact rational arithmetic in reference.py)",
   "oracleVersion": "constants as listed in about",
   "recordedOn": "2026-10-06",
   "source": "pipeline/sequence-toolkit/reference.py (dna-mw)",
   "notes": ""
  },
  {
   "id": "M03",
   "input": {
    "label": "M13 forward (-20) primer",
    "sequence": "GTAAAACGACGGCCAGT",
    "length": 17,
    "counts": {
     "A": 6,
     "C": 4,
     "G": 5,
     "T": 2
    },
    "form": "single-stranded, linear, 5'-OH and 3'-OH (no terminal phosphate), neutral free acid, average masses from CIAAW 2021"
   },
   "expected": {
    "mw_g_per_mol": 5228.467,
    "mwExact": "5228.467000",
    "formula": "C166H207N71O96P16",
    "working": "6 x 313.210 (dA) + 4 x 289.184 (dC) + 5 x 329.209 (dG) + 2 x 304.195 (dT) - 61.964 = 5228.467"
   },
   "crossCheck": {
    "biopython": {
     "value5PrimeOH": 5228.4184,
     "difference": -0.04860000000007858,
     "call": "Bio.SeqUtils.molecular_weight(Seq('GTAAAACGACGGCCAGT'), seq_type='DNA') - HPO3 (79.979)",
     "note": "Biopython's DNA weights are 5'-monophosphate masses with its own atomic weights, so its oligo carries a 5'-phosphate; HPO3 is subtracted to compare"
    }
   },
   "method": "Hand arithmetic: sum of residue masses (deoxynucleoside 5'-monophosphate minus H2O, from PubChem formulas and CIAAW abridged atomic weights) plus the end-group term H - P - 2O (= + H2O - HPO3)",
   "oracle": "hand arithmetic (exact rational arithmetic in reference.py)",
   "oracleVersion": "constants as listed in about",
   "recordedOn": "2026-10-06",
   "source": "pipeline/sequence-toolkit/reference.py (dna-mw)",
   "notes": ""
  },
  {
   "id": "M04",
   "input": {
    "label": "oligo(dT)20",
    "sequence": "TTTTTTTTTTTTTTTTTTTT",
    "length": 20,
    "counts": {
     "A": 0,
     "C": 0,
     "G": 0,
     "T": 20
    },
    "form": "single-stranded, linear, 5'-OH and 3'-OH (no terminal phosphate), neutral free acid, average masses from CIAAW 2021"
   },
   "expected": {
    "mw_g_per_mol": 6021.936,
    "mwExact": "6021.936000",
    "formula": "C200H261N40O138P19",
    "working": "20 x 304.195 (dT) - 61.964 = 6021.936"
   },
   "crossCheck": {
    "biopython": {
     "value5PrimeOH": 6021.900299999998,
     "difference": -0.03570000000127038,
     "call": "Bio.SeqUtils.molecular_weight(Seq('TTTTTTTTTTTTTTTTTTTT'), seq_type='DNA') - HPO3 (79.979)",
     "note": "Biopython's DNA weights are 5'-monophosphate masses with its own atomic weights, so its oligo carries a 5'-phosphate; HPO3 is subtracted to compare"
    }
   },
   "method": "Hand arithmetic: sum of residue masses (deoxynucleoside 5'-monophosphate minus H2O, from PubChem formulas and CIAAW abridged atomic weights) plus the end-group term H - P - 2O (= + H2O - HPO3)",
   "oracle": "hand arithmetic (exact rational arithmetic in reference.py)",
   "oracleVersion": "constants as listed in about",
   "recordedOn": "2026-10-06",
   "source": "pipeline/sequence-toolkit/reference.py (dna-mw)",
   "notes": "Single residue type."
  },
  {
   "id": "M05",
   "input": {
    "label": "designed 40-mer",
    "sequence": "ATGCGTACCATGAGTCAGTTGACCAGTACGCATTGCAAGT",
    "length": 40,
    "counts": {
     "A": 11,
     "C": 9,
     "G": 10,
     "T": 10
    },
    "form": "single-stranded, linear, 5'-OH and 3'-OH (no terminal phosphate), neutral free acid, average masses from CIAAW 2021"
   },
   "expected": {
    "mw_g_per_mol": 12320.042,
    "mwExact": "12320.042000",
    "formula": "C391H491N152O237P39",
    "working": "11 x 313.210 (dA) + 9 x 289.184 (dC) + 10 x 329.209 (dG) + 10 x 304.195 (dT) - 61.964 = 12320.042"
   },
   "crossCheck": {
    "biopython": {
     "value5PrimeOH": 12319.935,
     "difference": -0.1069999999999709,
     "call": "Bio.SeqUtils.molecular_weight(Seq('ATGCGTACCATGAGTCAGTTGACCAGTACGCATTGCAAGT'), seq_type='DNA') - HPO3 (79.979)",
     "note": "Biopython's DNA weights are 5'-monophosphate masses with its own atomic weights, so its oligo carries a 5'-phosphate; HPO3 is subtracted to compare"
    }
   },
   "method": "Hand arithmetic: sum of residue masses (deoxynucleoside 5'-monophosphate minus H2O, from PubChem formulas and CIAAW abridged atomic weights) plus the end-group term H - P - 2O (= + H2O - HPO3)",
   "oracle": "hand arithmetic (exact rational arithmetic in reference.py)",
   "oracleVersion": "constants as listed in about",
   "recordedOn": "2026-10-06",
   "source": "pipeline/sequence-toolkit/reference.py (dna-mw)",
   "notes": "All four bases, 40 nt."
  }
 ]
}
