Skip to main content
Docs

Search guides and API endpoints, for example “Idempotency-Key” or “submit job”.

    Tools · Cheminformatics & Structure

    Small-Molecule Force-Field Parameterizer

    Assign an OpenFF Sage force field and partial charges to 3D small molecules, check every parameter, and get ready-to-simulate systems for OpenMM, GROMACS, or AMBER.

    Updated October 1, 2026

    On this page

    Prices, workflows, and method papersOpen in the app

    The Force-Field Parameterizer prepares small molecules for molecular simulation. It assigns an OpenFF Sage force field and partial charges, checks that every bond, angle, torsion, and van der Waals term was assigned, and writes each molecule as a system file with a record of exactly which force field and charge model were used. Simulations downstream then reuse one checked parameter set instead of regenerating it each time.

    It assigns parameters only: no dynamics, no quantum chemistry. It runs on CPU.

    How it works

    Using the OpenFF Toolkit and Interchange (with RDKit and AmberTools), for each molecule it:

    1. reads the 3D structure, which needs explicit hydrogens;
    2. checks formal charge, elements, radicals, and stereochemistry;
    3. assigns partial charges (charge_method);
    4. assigns the force field (force_field) and confirms nothing was left unassigned;
    5. writes the system for each simulation engine you ask for.

    Force fields: OpenFF releases openff-2.0.0 to openff-2.3.0; the default, openff-2.2.0, matches what OpenMM MD and MM-GBSA Rescoring use.

    Charges: am1bcc (the default, the model Sage was fitted with), nagl (a fast machine-learned model trained to reproduce AM1-BCC), gasteiger, or user (charges already in your SDF or MOL2). Results using gasteiger or user charges carry a warning, because Sage wasn't fitted with them.

    Inputs

    Up to 100 molecules as SDF, MOL2, or MOL blocks with explicit hydrogens and 3D coordinates. Supported elements are H, C, N, O, F, P, S, Cl, Br, and I, with up to 100 heavy atoms per molecule. Undefined stereocenters are rejected unless you set allow_undefined_stereo.

    Outputs

    • Per molecule: an OpenMM system.xml (always), the topology, the serialized Interchange, and GROMACS (.top, .gro) or AMBER (.prmtop, .inpcrd) files if you added those to engines.
    • Charged molecules as SDF (and MOL2 where possible).
    • coverage.csv: one row per molecule with its status and, if it failed, why (for example missing_hydrogens, unsupported_element, charge_sum_mismatch, unassigned_parameters).
    • charges.csv: every atom's formal and partial charge.
    • provenance.json: the force field file and its SHA-256, the charge model, and the toolkit versions.

    A molecule that fails a check is reported and skipped; the job fails only if every molecule fails.

    Use the parameterized systems in OpenMM MD. To make 3D structures from SMILES first, use Molecule Conversion or Conformer Ensemble Generator.

    Run it from the API

    Submit with Submit a job and the job_type below. Price it first with Estimate job reservation cost: submitting reserves that amount from your wallet, and the charge settles at the actual runtime.

    Small-Molecule Force-Field Parameterizer ligand-parameterize

    Job type
    ligand-parameterize
    Hardware
    cpu (default)
    Typical runtime
    15 min on CPU

    Payload

    Payload fields
    FieldTypeDescription
    input_data[]required(string | object)[]

    Limits: min items 1, max items 100

    input_formatrequiredstring

    One of: "sdf", "mol2", "molblock", "smiles"

    force_fieldstring

    Default: "openff-2.2.0"One of: "openff-2.0.0", "openff-2.1.0", "openff-2.1.1", "openff-2.2.0", "openff-2.2.1", "openff-2.3.0"

    charge_methodstring

    Default: "am1bcc"One of: "am1bcc", "nagl", "user", "gasteiger"

    engines[]string[]

    Default: ["openmm"]One of: "openmm", "gromacs", "amber"

    allow_undefined_stereoboolean

    Default: false

    charge_tolerancenumber

    Default: 0.01Limits: > 0, ≤ 0.1

    Example

    from cognichem_client import CogniChem
    
    client = CogniChem.from_env()  # reads COGNICHEM_API_KEY
    payload = {
        "input_data": [
            "ethanol\n     RDKit          3D\n\n  9  8  0  0  0  0  0  0  0 … (813 characters)",
            "acetate\n     RDKit          3D\n\n  7  6  0  0  0  0  0  0  0 … (665 characters)",
            "tetramethylsilane\n     RDKit          3D\n\n 17 16  0  0  0  0… (1,487 characters)",
        ],
        "input_format": "sdf",
        "force_field": "openff-2.2.0",
        "charge_method": "am1bcc",
        "engines": ["openmm", "gromacs"],
    }
    
    estimate = client.jobs.estimate(job_type="ligand-parameterize", payload=payload, resource="cpu")
    print(f"Reserves ${estimate.cost:.2f}")
    
    job = client.jobs.submit(
        job_name="my-ligand-parameterize-run",
        job_type="ligand-parameterize",
        payload=payload,
        resource="cpu",
    )
    status = client.jobs.wait(job.process_id)
    if status.status == "completed":
        client.jobs.result(job.process_id, save_path=".")

    Sample data from the job catalog; long values are shortened here. Each job_name must be unique among your jobs.

    Workflow inputs

    • Molecules (list)SDF, MOL2, MOLBLOCK

    Workflow outputs

    • ArchiveZIP
    • MoleculesSDF
    • TableCSV
    • Force-field systemOPENMM_XML