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} and atom_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.mol and planar_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.mol declare 2D and require input correction.
normative/partial_hydrogens.mol and hydrogen_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.pdb and alternate_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.xyz and unsupported_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 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.

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. Open Babel, XYZ Cartesian coordinates format: plain count/comment/element-X-Y-Z framing. Extended metadata needs a different reader.
  6. 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.