Structure-reading and SMILES fixtures
These repository-authored examples test atom order, structure-file reading, units, record selection and conformer generation. They are synthetic input fixtures, not experimental structures, optimized geometries or reference NMR predictions. The initial corpus was authored on 19 October 2026 for the tests-first plan.
Independent expectations
expected.json
records literal atom order, coordinates and source identifiers chosen by the
fixture author. Readers under test must not regenerate those expectations.
No molecular file was copied from the specifications below or exported by
RDKit. Existing small_chloromethanes.json/.txt and their archive/NIST
provenance remain unchanged.
Every native fixture's coordinates are explicitly declared in angstroms for its test scenario. Units come from instructions or an unambiguous documented format convention and are recorded with the input; bond lengths do not choose the units. Separate nm and bohr cases test explicit conversion.
The corpus includes candidate formats as well as supported ones. A fixture does not add an offering format or establish native-parser safety. In particular, the ordinary V3000 example is neither a security reproducer nor evidence that its unresolved parser issue is fixed. See the RDKit dependency and qualification record and the current input guide.
Files and intended behavior
Paths below are relative to
tests/fixtures/preparation/.
normative/atom_order.json- Authored 22 October 2026: JSON spelling of the existing synthetic
chloromethane, ordered H, Cl, C, H, H with source atom indices 0–4.
SHA-256:
cfe336aaaf1c5b05a6078f8317ecebbeb7a32b01660da6f1a71475c336697f78. This adds an input spelling, not a new geometry or prediction oracle. normative/atom_order.{xyz,pdb,mol2}andatom_order_v{2000,3000}.mol- The same five atoms and three-decimal coordinates. V2000/MOL2 IDs are 1–5; V3000 IDs are 11,22,33,44,55; PDB serials are 40,7,22,5,91 in file order. Preserve that order and supplied H. There is no format-rounding allowance or chemical-accuracy assertion.
normative/mixed_records.{xyz,sdf,mol2}- Anchor, planar water, repeated anchor. Selection of all records, a later record, or (3,1) preserves source identity and requested order, including repeats. These are deliberately different molecules, not a certified conformer ensemble. No molecular-equivalence check is inferred. SDF data fields are not coordinate rows.
normative/butane_conformers.{xyz,sdf}- Two supplied four-carbon chain conformers with different torsions: one planar, one with nonzero Z. Preserve both geometries and four-atom order; do not add absent H. They are unoptimized synthetic literals, separate from generated SMILES references.
normative/heavy_atoms_only.molandplanar_3d.mol- Preserve the supplied Cl,C atoms without adding H. The planar water
declares 3D; zero Z does not trigger embedding. The same planar values in
adversarial/declared_2d.moldeclare 2D and require input correction. normative/partial_hydrogens.molandhydrogen_free.mol- The partial chloromethane retains only H,Cl,C and its two corresponding bonds; two H coordinates are deliberately absent. Carbon dioxide has O,C,O, two double bonds and no H. Exact preservation does not qualify predictions for an incomplete molecule. A reader cannot infer from zero H whether H is chemically absent or omitted.
normative/models.pdbandalternate_locations.pdb- Models 1 and 2 repeat the anchor geometry and require explicit selection. Equal-occupancy C sites A/B require a choice: A is serial 22 at (0,0,0), B is 23 at (0.125,0,0). Keep common atoms once. Element columns, including CL, identify elements; names and serials remain separate source IDs. CONECT records are supplied.
adversarial/invalid_last.{xyz,sdf}- The fourth record is malformed while the first three are usable. Selection (1,4) rejects the complete preparation; (3,1) must not interpret unselected invalid coordinates as selected input. Framing must remain readable. XYZ diagnostics identify record/field without echoing the private-data sentinel.
adversarial/extended.xyzandunsupported_atom_type.mol2- Extended XYZ metadata and an unknown MOL2 atom type must not silently acquire support through the plain reader.
Units and the independent conversion oracle
normative/scale_nm.xyz and scale_bohr.xyz are two-atom
scale markers, not complete molecules. Explicit 0.125 nm becomes 1.25 Å
exactly. Explicit 2 bohr becomes 1.058354421088 Å using the CODATA 2022
central value. The bohr factor is not exact: its standard uncertainty is
8.2 × 10−11 Å/bohr. Preserve the factor, reference and source lines;
missing or unknown units reject. Production conversion belongs to
input_geometry.py, not an estimate from reader output.
The configured native pasted/Upload lifecycle uses the authored
NM_TABLE in
test_nmrnet_supplied_lifecycle.py.
Its nm decimals equal the independent angstrom literals divided by ten.
For exact nm value x, parsed binary64 p = RN(x)
and y = RN(10p), the triangle inequality gives:
|y − 10x| ≤ 10|p − x| + 0.5 ULP(RN(10p))
nm_conversion_oracle computes the bound from fixed literals with
exact Fraction arithmetic before receiving reader output, on radix-2,
53-bit, round-to-nearest Python. Ten is exactly representable; half an ULP
bounds the single multiplication for these finite normal values. Zero has
zero bound. This is arithmetic error, not a tuned chemical tolerance.
Atom, record, received-byte, digest and replay identities remain exact. Uploaded angstrom records (2,1), water then chloromethane, use exact coordinate equality. Native receipts retain reader options, source/oracle hashes and the precomputed rational bounds.
SMILES and complete batches
smiles.json contains nine intended-valid source cases, nine rejected
declarations and three injected worker outcomes. It is a test description,
not a public request schema. Source atoms precede H addition; generated atom
inventories and added-H parent pairs are independent graph expectations.
Implicit CCl adds three H on C0; mixed [H]CCl adds two
on C1; butane adds 3/2/2/3 H on C0/C1/C2/C3. Fully explicit
[H]C([H])([H])Cl and H-free O=C=O add none. The two
specified and one unspecified halomethane centers add H on C1; methane adds
four on C0. Native tests assert exact pairs, not merely non-H parent types.
Source order and AddHs append-order evidence are in the
SMILES generation record.
Cases cover implicit, explicit, mixed and absent H; flexible butane with N=3; opposite specified stereochemistry; unspecified stereochemistry; and a symmetric molecule with N>1. Preserve source-to-output correspondence, supplied stereochemistry and generated-H parents. Disclose unspecified stereochemistry without claiming that NMRNet validates it. Symmetric outputs need not be geometrically distinct.
Missing, null, boolean, string, fractional, zero or negative N rejects before embedding, as do empty or malformed SMILES. Record algorithm/version/full settings, coordinates, conformer IDs, requested/returned counts, shortfall and prepared-byte identity. The corpus freezes no seed, pruning threshold, default algorithm or generated coordinate oracle. Injected shortfall IDs 0,2 expose index-versus-ID confusion; they are not a measured native shortfall.
batch_cases.json names source files/selections and fault-injection
contracts: a bad selected suffix rejects before inference; a later geometry
failure yields no partial success; uncertain delivery replays the exact
completed batch without repeating preparation or science. Result-byte limits
apply before inference. Boundary recipes use admitted limit and limit+1,
rather than invented capacity limits or redundant large files.
What each proof establishes
test_provider_preparation_fixtures.py
sends the actual XYZ files through the pure reader and checks independent
geometry, row/record order, conversion, selection and rejection in the
normative/adversarial unit lane. Those tests alone establish neither native
reader behavior nor Upload authority, embedding or batch publication.
Subsequent native tests consume these files, rather than substituting preconstructed toolkit objects. Version-matched generator/process-channel, connected service and publication evidence is retained in record 003. A fixture declaration or an injected outcome must not be described as a measured native result.
ZIP Upload fixture
api_sdf_zip.json instructs selection of both original records from
normative/butane_conformers.sdf, angstrom units, supplied four-C
order, no H generation and 17 significant digits. It adds no numeric oracle.
The API qualification client creates its own deterministic ZIP and compares
the outer archive identity separately from the selected original member
identity. The GUI also packages selected files as ZIPs, according to the
separately inspected GUI source below; browser submission was not part of
the API qualification.
The unchanged SDF SHA-256 is
c8007f5a1a80ad080bb972caf005bbb4fedcd5a9bd15b892e1b640d2f01e4374.
R46 records
native/reference evidence and R48
the outer/member identity join; R53
records actual API delivery. GUI packaging was inspected at
nmr-gui-v1 df172527409cc08d46b3318cd19e961f6c3be432,
app/src/features/workspace/use-upload-file-selection.ts::prepare/setInputFile
and upload-archive.ts::archiveUpload. Partial-coordinate fixtures
and their delivered shifts establish no paper-accuracy claim.
Interpreter file-format choices
interpreter_formats.json contains three authored requests and inert
direct-file Upload metadata. Only instructions and metadata reach the model.
Expected source, format, angstrom unit and record order are checked after its
terminal prepare_upload call, without feedback or a fabricated result.
This probe does not perform acquisition, parsing or shift inference; its
metadata is not an authenticated Upload or an observed transfer.
Sources remain the R37 inputs and independent expectations at
5525d82, formats_service.py::load_case lines 85–102 and
expected.json::native_files:
- MOL:
normative/atom_order_v2000.mol, 553 bytes, one structure, omitted/null selection. SHA-256:387dc3e64ea9c2c2be46e687705d3deef1043ae300eca6a3b44cc10d37e4f1ab. - PDB:
normative/models.pdb, 1002 bytes, models 2 then 1. SHA-256:570d10b492b7d038d9eceeab02a0bea8301987d459a1e0af0f581ef9bc3d41bc. - MOL2:
normative/mixed_records.mol2, 1019 bytes, records 2 then 1. SHA-256:b00e6653ef34ff3bc9cf5a9f57f05ae1df97e8049770b304f2c282f6fa6ef214.
MOL selection="all" or [1] is not equivalent to its
omitted/null option. PDB blank alternate sites mean a valid explicit label
changes no selected atom. PDB/MOL2 all selects 1,2 rather than the
requested 2,1. See geometry_protocol.py::require_read_options and
pdb.py::_selected_rows at 5525d82.
R54 records the
observed real-interpreter choices; the numerical evidence remains R37.
Specifications and scientific references
Consulted 19 October 2026. These specify the authored examples and chosen reader settings; they do not guarantee arbitrary file compatibility.
- BIOVIA, CTfile Formats, BIOVIA Databases 2020: chapter 2 V3000 atom/bond blocks, printed pp. 7–12; chapter 3 molfile header and dimensional code, pp. 32–34; chapter 6 V2000 CTAB, pp. 41–45; chapter 10 SDfiles, pp. 75–76. Authority for headers, field widths, IDs and framing.
- wwPDB, PDB format v3.3: coordinate section, MODEL/ATOM/HETATM/ENDMDL (serial columns 7–11, alternate location 17, XYZ 31–54, element 77–78), and CONECT connectivity. Reciprocal sorted connectivity IDs are distinct from atom-row order.
- Tripos SYBYL 7.1 (Mid-2005), Mol2 File Format, ATOM/BOND records, printed pp. 12–13, and MOLECULE section. This is a mirror of the Tripos manual, not an RDKit compatibility guarantee.
- RDKit 2026.09.1: MolFromMolBlock, ForwardSDMolSupplier, MolFromPDBBlock and MolFromMol2Block, and embedding parameters and failure reporting. Defaults may remove H; PDB may infer proximity bonds; MOL2 expects Corina typing and offers cleanup. Test selected settings. A seed alone is not a portable numeric oracle.
- Open Babel, XYZ Cartesian coordinates format: plain count/comment/element-X-Y-Z framing. Extended metadata needs a different reader.
- NIST SP 811, Appendix B.8, angstrom conversion (inverse gives nm → Å); and CODATA recommended values 2022, Table XXXIII, p. 033105-45, PDF page 45, Bohr radius. Conversion references are reused, not fitted to fixture points.
Retained scientific input fixtures
tests/fixtures/scientific_inputs preserves the original four-reference
and synthetic H128/C128 XYZ and manifest exports verbatim. No predictions or
expected outputs were regenerated. The pinned loader checks original request
bytes, atom order, coordinates and source positions against the independent
reference packets and capacity recipe.
The reference producer is
reference_fixture.py at c294dca413cc8f4a9309533c1e4a5764d5baa763;
the capacity producer is
the same exporter at 7e5d3dad6b14d76bd3b265d39f3e6863bfbae007.
Both used image
sha256:cabb4fe3e36541b0fefe54ca7c16fb21f9a60112a1e3d47992d4aa18343ecd08
and upstream 3ba8b9c2f3d0a390d00685d238618345c6ab24d7.
Those identities describe the historical export, never the current worker.
The input loader and SHA-256 pins reuse the original reference/production packets; current predictions are compared with those original authorities. Capacity is synthetic input/output capacity, not plausible chemistry or an accuracy oracle. Retaining the small exports makes qualification portable without depending on an untracked local cache or a historical producer image. See the connected qualification packet for the later execution evidence and its limits.