covnmr_purity
qNMR purity determination (USP <761>) with uncertainty budget.
NAME THE TWO SIGNALS with standard_peak_ppm and analyte_peak_ppm. Without
them the first two integration regions are used, which is a guess - the
response then carries selection.method="positional" and a warning.
Optional analyte_signals, e.g. [{"ppm": 3.80, "protons": 3, "label": "OCH3"},
{"ppm": 1.20, "protons": 6}], quantifies the analyte on each listed signal and
returns `multi_signal`: per-signal concentrations, mean, SD, RSD, and the
signals that disagree with the others by more than the integration
uncertainty allows - the usual sign that a signal overlaps an impurity. The
headline result stays the one from analyte_peak_ppm.
Until 2026-07-31 this wrapper passed `reference_peak_ppm` and the core never
read it, while the core silently took integrals[0] and integrals[1]. The
ratio was effectively arbitrary and the certificate looked the same either
way. `reference_peak_ppm` is still accepted and is now honoured as the
standard's shift, so existing callers stop being ignored.
The response includes a `selection` block naming the regions that were
integrated, so the number can be checked against the spectrum.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| smiles | Yes | ||
| api_key | No | ||
| solvent | No | CDCl3 | |
| analyte_mw | Yes | ||
| analyte_protons | Yes | ||
| analyte_signals | No | ||
| standard_purity | No | ||
| analyte_peak_ppm | No | ||
| standard_conc_mm | Yes | ||
| standard_protons | Yes | ||
| standard_peak_ppm | No | ||
| reference_peak_ppm | No |
Output Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| result | Yes |