Reference checks
This page lists the reference checks published for Drybench Calc. Each set gives the methods it covers, what the expected values were computed with, the number of cases, the tolerance the app must meet, the date, and the file holding the inputs and expected outputs, so you can open a case and compare it with what the app gives.
Every case was chosen and recorded by the Drybench team; none has been independently reviewed. A reference check tests the calculation, not your data, your experiment or whether a model suits it. Methods without a set are listed on the methods page with their level.
| Methods | Oracle | Fixtures | Tolerance | Date | File |
|---|---|---|---|---|---|
| formula-mass, stock-salt-purity | RDKit | 58 | exact (decimal sums of the same CIAAW 2021 table) | 2026-10-06 | formula-mass.jsonRecorded for version 0.1.0; the test suite checks the current engine against it. |
| stock-salt-purity, c1v1, serial-dilution, recipe-table, pipette-minimum-2ul, dmso-carry-over | Python fractions and decimal | 31 | nine significant figures; display values exact | 2026-10-06 | dilution.jsonRecorded for version 0.1.0; the test suite checks the current engine against it. |
| pka-temperature-goldberg | NumPy | 15 | within 0.01 (and within 0.0001) at 4, 25 and 37 °C | 2026-10-06 | buffers.jsonRecorded for version 0.1.0; the test suite checks the current engine against it. |
| extinction-280-pace, a280-beer-lambert | Biopython | 22 | exact | 2026-10-06 | extinction.jsonRecorded for version 0.1.0; the test suite checks the current engine against it. |
| master-mix-preparation | Python fractions and decimal | 14 | nine significant figures; refusals exact | 2026-10-10 | master-mix.jsonRecorded for version 0.2.0; the test suite checks the current engine against it. |
| serial-dilution, pipette-minimum-2ul, dmso-carry-over | Python fractions and decimal | 10 | relative 1e-9; each step exactly the fold; flags exact | 2026-10-10 | serial-2.jsonRecorded for version 0.3.0; the test suite checks the current engine against it. |
| plate-sheet, serial-dilution | Python fractions and decimal | 22 | relative 1e-9; wells, roles and refusals exact; compound, carrier and volume balance asserted | 2026-10-10 | plate-sheet-2.jsonRecorded for version 0.3.0; the test suite checks the current engine against it. |
| antibody-dilution | Python fractions and decimal | 10 | relative 1e-9; refusals exact | 2026-10-10 | antibody-batch.jsonRecorded for version 0.3.0; the test suite checks the current engine against it. |
| od600-cell-estimate | Python fractions and decimal | 14 | relative 1e-9; refusals exact | 2026-10-10 | od600.jsonRecorded for version 0.3.0; the test suite checks the current engine against it. |
| buffer-recipe, pka-temperature-goldberg | NumPy | 18 | mass relative 1e-9; setpoint within 0.01 pH, equal to 2 decimals; refusals exact | 2026-10-10 | buffer-recipe.jsonRecorded for version 0.3.0; the test suite checks the current engine against it. |
| unit-conversion, temperature-offset | Python fractions and decimal | 44 | prefix changes and temperature exact as decimal strings; molar bridges relative 1e-9; refusals exact | 2026-10-10 | unit-converter.jsonRecorded for version 0.3.0; the test suite checks the current engine against it. |
| cell-seeding, centrifuge-rcf-rpm, percent-solution, antibody-dilution | Python fractions and decimal | 41 | relative 1e-9; refusals, flags and text rows exact | 2026-10-10 | preparation-3.jsonRecorded for version 0.3.0; the test suite checks the current engine against it. |
| a280-beer-lambert | Python fractions and decimal | 14 | relative 1e-9; refusals exact | 2026-10-17 | absorbance-a280.jsonRecorded for version 0.6.0; the test suite checks the current engine against it. |
| a260-a280-ratio | Python fractions and decimal | 10 | relative 1e-9; refusals exact | 2026-10-17 | absorbance-ratio.jsonRecorded for version 0.6.0; the test suite checks the current engine against it. |
| a260-rules-of-thumb | Python fractions and decimal | 19 | relative 1e-9; refusals exact | 2026-10-17 | a260-2.jsonRecorded for version 0.5.0; the test suite checks the current engine against it. |
| cell-counting-volume | Python fractions and decimal | 28 | relative 1e-9; refusals and receipt integrity exact | 2026-10-18 | cell-counting-v3.jsonRecorded for version 0.7.0; the test suite checks the current engine against it. |
| dose-per-cell-arithmetic | Python fractions and decimal | 35 | relative 1e-9; refusals and receipt integrity exact | 2026-10-18 | dose-plan-v3.jsonRecorded for version 0.7.0; the test suite checks the current engine against it. |
| dna-mass-from-length | Python fractions and decimal | 20 | relative 1e-9; refusals exact | 2026-10-21 | dna-amounts-length.jsonRecorded for version 0.10.0; the test suite checks the current engine against it. |
| dna-mass-from-length | Python fractions and decimal | 49 | relative 1e-9; display strings exact | 2026-10-21 | dna-amounts-length-2.jsonRecorded for version 0.10.0; the test suite checks the current engine against it. |
| plasmid-dna-amounts | Python fractions and decimal | 23 | relative 1e-9; refusals and blanks exact | 2026-10-21 | ligation-refusals.jsonRecorded for version 0.10.0; the test suite checks the current engine against it. |
| plasmid-dna-amounts, dna-mass-from-length | Python fractions and decimal | 10 | relative 1e-9; refusals exact | 2026-10-21 | cloning-amounts.jsonRecorded for version 0.10.0; the test suite checks the current engine against it. |
| selection-stock | Python fractions and decimal | 34 | relative 1e-9; refusals exact | 2026-10-21 | selection-stock-2-1.jsonRecorded for version 0.10.0; the test suite checks the current engine against it. |
| oligo-resuspension | Python fractions and decimal | 18 | relative 1e-9; refusals exact | 2026-10-21 | oligo-resuspension.jsonRecorded for version 0.10.0; the test suite checks the current engine against it. |
| batch-stocks | Python fractions and decimal | 40 | the engine's double bit for bit; within 1e-12 relative; statuses, reasons and the copied text exact | 2026-10-21 | batch-stocks-2.jsonRecorded for version 0.10.0; the test suite checks the current engine against it. |
| cell-counting-volume, dose-per-cell-arithmetic | Python fractions and decimal | 49 | each receipt reads or reads as null, exactly; density identities within float rounding | 2026-10-20 | receipt-integrity-v1.jsonRecorded for version 0.9.0; the test suite checks the current engine against it. |
| one-intermediate-dilution | Python fractions and decimal | 13 | feasibility exact; plan within one grid step | 2026-10-10 | intermediate-dilution.jsonRecorded for version 0.2.0; the test suite checks the current engine against it. |
| pipette-minimum-2ul | Python fractions and decimal | 18 | exact: each flag | 2026-10-21 | pipette-rule-v1.jsonRecorded for version 0.11.0; the test suite checks the current engine against it. |
| od600-calibration | Python fractions and decimal | 18 | relative 1e-9; R² absolute 1e-9; refusals exact | 2026-10-21 | od600-calibration-v1.jsonRecorded for version 0.11.0; the test suite checks the current engine against it. |
| recipe-table | Python fractions and decimal | 21 | amounts and diluent relative 1e-9; validity and problems exact | 2026-10-21 | recipe-table-2.jsonRecorded for version 0.11.0; the test suite checks the current engine against it. |
| recipe-table | Python fractions and decimal | 27 | amounts and diluent relative 1e-9; validity, problems and diluentWithheld exact | 2026-10-28 | recipe-table-2-1.jsonRecorded for version 0.12.0; the test suite checks the current engine against it. |
| protein-average-mass | Biopython | 1 | equal at one decimal; relative 2e-5 | 2026-10-21 | a280-his6-v1.jsonRecorded for version 0.11.0; the test suite checks the current engine against it. |
| pka-temperature-goldberg | Python fractions and decimal | 36 | constants exact; within 1e-9 at 4, 25 and 37 °C, 274 K and 350 K; refusals exact | 2026-10-21 | buffers-2.jsonRecorded for version 0.11.0; the test suite checks the current engine against it. |
| buffer-recipe, pka-temperature-goldberg | Python fractions and decimal | 53 | pK and setpoint within 1e-9, setpoint equal to two decimals; mass relative 1e-9; refusals exact | 2026-10-21 | buffer-recipe-2.jsonRecorded for version 0.11.0; the test suite checks the current engine against it. |
| sample-normalisation | Python fractions and decimal | 12 | volumes, masses and limits relative 1e-12; statuses, flags and refusals exact | 2026-10-17 | normalization-v1.jsonRecorded for version 0.11.0; the test suite checks the current engine against it. |
Software the app's numbers were checked against, or its data built with. None of it ships with the app or is a dependency of it.
Every row is one fixture compared with the engine when this page was built; the full sets are the published files, and pipeline/lab-calculators/reference.py wrote them.
Expected values from CIAAW 2021 sum in Python decimal, formula from RDKit (Python 3.11.15; RDKit 2026.03.6), recorded 2026-10-06; tolerance exact; 12 of 58 shown, all passing. formula-mass.json sha256 b8319e3e0ef032e2…
| Input | Expected | Ours | Difference | Pass |
|---|---|---|---|---|
| imatinib (C29H31N7O) | 493.615 | 493.615 | 0 | yes |
| imatinib mesylate (C30H35N7O4S) | 589.715 | 589.715 | 0 | yes |
| metformin (C4H11N5) | 129.167 | 129.167 | 0 | yes |
| metformin hydrochloride (C4H12ClN5) | 165.625 | 165.625 | 0 | yes |
| dabrafenib (C23H20F3N5O2S2) | 519.560 | 519.56 | 0 | yes |
| dabrafenib mesylate (C24H24F3N5O5S3) | 615.660 | 615.66 | 0 | yes |
| erlotinib hydrochloride (C22H24ClN3O4) | 429.901 | 429.901 | 0 | yes |
| erlotinib (C22H23N3O4) | 393.443 | 393.443 | 0 | yes |
| sorafenib tosylate (C28H24ClF3N4O6S) | 637.026 | 637.026 | 0 | yes |
| sorafenib (C21H16ClF3N4O3) | 464.828 | 464.828 | 0 | yes |
| doxorubicin hydrochloride (C27H30ClNO11) | 579.983 | 579.983 | 0 | yes |
| doxorubicin (C27H29NO11) | 543.525 | 543.525 | 0 | yes |
Expected values from Python fractions and decimal (3.11.15), recorded 2026-10-06; tolerance nine significant figures; 12 of 15 shown, all passing. dilution.json sha256 c569983c9d1a2706…
| Input | Expected | Ours | Difference | Pass |
|---|---|---|---|---|
| mass-nacl-150mm | 8.766 g | 8.766 g | 0 | yes |
| mass-imatinib-mesylate-10mm | 0.00589715 g | 0.00589715 g | 8.673617380e-19 | yes |
| mass-erlotinib-hydrochloride-5mm | 0.00429901 g | 0.00429901 g | 8.673617380e-19 | yes |
| mass-tris-1m | 60.5675 g | 60.5675 g | 0 | yes |
| mass-hepes-20mm | 1.191505 g | 1.191505 g | 0 | yes |
| mass-glucose-5um | 0.0000090078 g | 0.0000090078 g | 0 | yes |
| mass-edta-500mm | 18.6118 g | 18.6118 g | 0 | yes |
| volume-for-mass-imatinib-mesylate | 0.001928049990249527314041528534970282254988 L | 0.00192804999 L | -4.336808690e-19 | yes |
| volume-for-mass-staurosporine | 0.002143434339104173052314801914515551687847 L | 0.002143434339 L | 0 | yes |
| volume-for-mass-small | 0.01428571428571428571428571428571428571429 L | 0.01428571429 L | 0 | yes |
| c1v1-10mm-to-50um | 0.000001 L | 0.000001 L | 0 | yes |
| c1v1-1m-to-150mm | 0.0075 L | 0.0075 L | 0 | yes |
Expected values from Goldberg 2002 equation 12 in NumPy (NumPy 2.4.6; Python 3.11.15), recorded 2026-10-06; tolerance within 0.01; 12 of 45 shown, all passing. buffers.json sha256 18881ec180af861e…
| Input | Expected | Ours | Difference | Pass |
|---|---|---|---|---|
| Tris at 4 °C | 8.7103 | 8.7103 | -0.00000 | yes |
| Tris at 25 °C | 8.0720 | 8.0720 | 0.00000 | yes |
| Tris at 37 °C | 7.7527 | 7.7527 | 0.00004 | yes |
| HEPES at 4 °C | 7.8281 | 7.8281 | -0.00001 | yes |
| HEPES at 25 °C | 7.5640 | 7.5640 | 0.00000 | yes |
| HEPES at 37 °C | 7.4238 | 7.4238 | 0.00004 | yes |
| MOPS at 4 °C | 7.4605 | 7.4605 | 0.00002 | yes |
| MOPS at 25 °C | 7.1840 | 7.1840 | 0.00000 | yes |
| MOPS at 37 °C | 7.0400 | 7.0400 | -0.00003 | yes |
| MES at 4 °C | 6.4657 | 6.4657 | 0.00005 | yes |
| MES at 25 °C | 6.2700 | 6.2700 | 0.00000 | yes |
| MES at 37 °C | 6.1695 | 6.1695 | -0.00002 | yes |
Expected values from Biopython Bio.SeqUtils.ProtParam (Biopython 1.85; Python 3.11.15), recorded 2026-10-06; tolerance exact; 12 of 22 shown, all passing. extinction.json sha256 94e04f78b54b8d3a…
| Input | Expected | Ours | Difference | Pass |
|---|---|---|---|---|
| Insulin (110 aa) | 17335 / 16960 | 17335 / 16960 | 0 | yes |
| Hemoglobin subunit beta (147 aa) | 15595 / 15470 | 15595 / 15470 | 0 | yes |
| Transthyretin (147 aa) | 18575 / 18450 | 18575 / 18450 | 0 | yes |
| GTPase KRas (189 aa) | 13660 / 13410 | 13660 / 13410 | 0 | yes |
| Cellular tumor antigen p53 (393 aa) | 36035 / 35410 | 36035 / 35410 | 0 | yes |
| Epidermal growth factor receptor (1210 aa) | 128890 / 125140 | 128890 / 125140 | 0 | yes |
| Spike glycoprotein (1273 aa) | 148960 / 146460 | 148960 / 146460 | 0 | yes |
| Hemoglobin subunit alpha (142 aa) | 9970 / 9970 | 9970 / 9970 | 0 | yes |
| Tubulin beta chain (444 aa) | 46340 / 45840 | 46340 / 45840 | 0 | yes |
| Lysozyme C (147 aa) | 37970 / 37470 | 37970 / 37470 | 0 | yes |
| Albumin (607 aa) | 49915 / 47790 | 49915 / 47790 | 0 | yes |
| Green fluorescent protein (238 aa) | 22015 / 21890 | 22015 / 21890 | 0 | yes |
Expected values from Python fractions (3.13.16), recorded 2026-10-21; tolerance relative 1e-9; refusals exact; 12 of 20 shown, all passing. dna-amounts-length.json sha256 c7f7d0736969a593…
| Input | Expected | Ours | Difference | Pass |
|---|---|---|---|---|
| ds-circular | 1853697 | 1853697 | 0 | yes |
| ds-linear-oh | 926724.572 | 926724.572 | 0 | yes |
| ds-linear-phosphate | 926884.53 | 926884.53 | 0 | yes |
| ss-linear | 18475.006 | 18475.006 | 0 | yes |
| ss-circular | 2239574.925 | 2239574.925 | 0 | yes |
| ds-1bp | 617.899 | 617.899 | 0 | yes |
| ds-50000bp | 30894950 | 30894950 | 0 | yes |
| refuse-50001 | length-range | length-range | 0 | yes |
| refuse-zero | length-range | length-range | 0 | yes |
| refuse-non-integer | length-integer | length-integer | 0 | yes |
| puc19-estimate | 1659676.714 | 1659676.714 | 0 | yes |
| h18-parity | 1659693.51 | 1659693.51 | 0 | yes |
Expected values from Python fractions and decimal (3.13.16), recorded 2026-10-21; tolerance display strings exact; 7 of 7 shown, all passing. dna-amounts-length-2.json sha256 1138756ec7ace9a9…
| Input | Expected | Ours | Difference | Pass |
|---|---|---|---|---|
| display-puc19 (display) | 1.660 × 10⁶ | 1.660 × 10⁶ | 0 | yes |
| display-ds-linear (display) | 9.267 × 10⁵ | 9.267 × 10⁵ | 0 | yes |
| display-ds-short (display) | 6,055 | 6,055 | 0 | yes |
| display-ds-50000 (display) | 3.089 × 10⁷ | 3.089 × 10⁷ | 0 | yes |
| display-ss-20 (display) | 6.1 × 10³ | 6.1 × 10³ | 0 | yes |
| display-ss-short (display) | 8.6 × 10² | 8.6 × 10² | 0 | yes |
| display-ss-m13 (display) | 2.2 × 10⁶ | 2.2 × 10⁶ | 0 | yes |
Expected values from Python fractions (3.13.16), recorded 2026-10-21; tolerance relative 1e-9; refusals and blanks exact; 12 of 23 shown, all passing. ligation-refusals.json sha256 4242c7d693d633da…
| Input | Expected | Ours | Difference | Pass |
|---|---|---|---|---|
| a05-typed | 40.20848846 | 40.20848846 | 0 | yes |
| a07-typed | 57.32630131 | 57.32630131 | 0 | yes |
| fractional-ratio | 6.701414743 | 6.701414743 | 8.881784197e-16 | yes |
| exponent-mass | 40.20848846 | 40.20848846 | 0 | yes |
| ratio-empty | blank: ratio-empty | blank: ratio-empty | 0 | yes |
| ratio-spaces | blank: ratio-empty | blank: ratio-empty | 0 | yes |
| ratio-zero | refused: ratio-range | refused: ratio-range | 0 | yes |
| ratio-negative | refused: ratio-range | refused: ratio-range | 0 | yes |
| ratio-nan | refused: ratio-number | refused: ratio-number | 0 | yes |
| ratio-infinity | refused: ratio-number | refused: ratio-number | 0 | yes |
| ratio-infinity-symbol | refused: ratio-number | refused: ratio-number | 0 | yes |
| ratio-decimal-comma | refused: ratio-number | refused: ratio-number | 0 | yes |
Expected values from Python fractions (3.13.16), recorded 2026-10-21; tolerance relative 1e-9; refusals exact; 10 of 10 shown, all passing. cloning-amounts.json sha256 b4baf35dc5b4c0ea…
| Input | Expected | Ours | Difference | Pass |
|---|---|---|---|---|
| C01 | 3.628465571e+11 | 3.628465571e+11 | 0.00006103515625 | yes |
| P01 | 0.03012604418 | 0.03012604418 | 0 | yes |
| P02 | 0.00674328113 | 0.00674328113 | 0 | yes |
| M01 | 44.74852356 | 44.74852356 | 0 | yes |
| M02 | 3.078136287 | 3.078136287 | 0 | yes |
| L01 (backbone-estimate) | 40.75471698 | 40.75471698 | 0 | yes |
| L02 (exact) | 40.20848846 | 40.20848846 | 0 | yes |
| L03 (card-estimate) | 40 | 40 | 0 | yes |
| L04 (exact) | 40.20848846 | 40.20848846 | 0 | yes |
| L05 | ligation-single-stranded | ligation-single-stranded | 0 | yes |
Expected values from Python fractions (3.13.16), recorded 2026-10-21; tolerance relative 1e-9 on every row; refusals exact; 12 of 34 shown, all passing. selection-stock-2-1.json sha256 bf090a031b91d55b…
| Input | Expected | Ours | Difference | Pass |
|---|---|---|---|---|
| single-vessel | 0.001 L stock | 0.001 L stock | 0 | yes |
| cso-batch | 0.0011 L stock | 0.0011 L stock | 0 | yes |
| cso-single | 0.0005 L stock | 0.0005 L stock | 0 | yes |
| dead-volume | 0.00044 L stock | 0.00044 L stock | 0 | yes |
| cso-weigh-potency | 0.0005 L stock | 0.0005 L stock | 0 | yes |
| weigh-as-weighed | 0.0005 L stock | 0.0005 L stock | 0 | yes |
| potency-1000 | 0.001 L stock | 0.001 L stock | 0 | yes |
| typed-fw-with-potency | 0.0005 L stock | 0.0005 L stock | 0 | yes |
| picked-resolves-dimension | 0.000482807 L stock | 0.000482807 L stock | 0 | yes |
| molar-both | 0.001 L stock | 0.001 L stock | 0 | yes |
| molar-stock-weigh | 0.0005 L stock | 0.0005 L stock | 0 | yes |
| mass-working-molar-stock | 0.000515995872 L stock | 0.000515995872 L stock | 1.084202172e-19 | yes |
Expected values from Python fractions (3.13.16), recorded 2026-10-21; tolerance relative 1e-9; refusals exact; 12 of 18 shown, all passing. oligo-resuspension.json sha256 c789fd077c3a873f…
| Input | Expected | Ours | Difference | Pass |
|---|---|---|---|---|
| cso-worked | 0.00025 | 0.00025 | -5.421010862e-2 | yes |
| pmol-to-um | 0.00005 | 0.00005 | 0 | yes |
| umol-to-mm | 0.001 | 0.001 | 0 | yes |
| nmol-to-nm | 0.025 | 0.025 | 0 | yes |
| odd-yield | 0.000374 | 0.000374 | -5.421010862e-2 | yes |
| tiny | 1.000000000e-8 | 1.000000000e-8 | -1.654361225e-24 | yes |
| refuse-zero-amount | oligo-input | oligo-input | 0 | yes |
| refuse-negative-amount | oligo-input | oligo-input | 0 | yes |
| refuse-zero-target | oligo-input | oligo-input | 0 | yes |
| refuse-negative-target | oligo-input | oligo-input | 0 | yes |
| blank-amount | oligo-empty | oligo-empty | 0 | yes |
| blank-target | oligo-empty | oligo-empty | 0 | yes |