Skip to main content
Docs

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

    Tools · Computational Biology

    Docking Protocol Validator

    Check a docking setup before a screen: redock the co-crystallized ligand, measure pose RMSD to the crystal pose, score cross-docked analogs, and compute enrichment from labelled actives and decoys.

    Updated October 16, 2026

    On this page

    Prices, workflows, and method papersOpen in the app

    The Docking Protocol Validator answers the first question asked of any docking study: does this receptor preparation, box, and engine reproduce a known binding pose? You dock the co-crystallized ligand back into its own receptor with any engine, and the validator measures how far the docked poses sit from the crystal pose. It scores poses; it does not dock. It runs on CPU.

    What it computes

    • Redocking RMSD. Heavy-atom RMSD between each docked pose and the crystal ligand, measured in place in the receptor frame. The pose is never re-fitted onto the crystal ligand, so errors in the box or in placement stay visible. Symmetry-equivalent atoms (a flipped phenyl ring, the two oxygens of a carboxylate) are matched so they don't inflate the RMSD.
    • A verdict. The protocol passes when the top-ranked pose is within the RMSD threshold (2 Å by default, the conventional cut-off). The best RMSD among the top-k poses is reported too, which separates sampling (was a near-native pose found?) from scoring (was it ranked first?).
    • Cross-docking (optional). Analogs crystallized with the same target, docked into the reference receptor. Each analog's structure is superposed onto the reference by the Cα atoms around the binding site, and its crystal ligand is compared with the docked poses in that frame.
    • Enrichment (optional). With docked actives and decoys and a labels file, each molecule is ranked by its best pose score to give EF1%, EF5%, ROC-AUC, and BEDROC (α = 80.5). Tied scores share their rank, so coarse docking scores don't depend on input order.

    Inputs

    • The reference complex: an RCSB pdb_id, or a PDB or mmCIF file containing the co-crystallized ligand. Name the ligand by residue name (and chain) or let the validator pick the largest bound ligand, skipping waters, ions, buffers, lipids, and glycans. You can also upload the crystal ligand as SDF in the complex frame.
    • Redocked poses: SDF, PDBQT, or PDB files from AutoDock Vina, GNINA, DiffDock, or any other engine. Poses keep the engine's ranking; Vina and GNINA affinities, GNINA CNN scores, and DiffDock confidence are read when present.
    • Docking boxes (optional): the pockets.json from the Binding-Site Detector. The box nearest the crystal ligand is reported; without one, a box is drawn around the crystal ligand.
    • Analogs and actives/decoys (optional): analog complexes with their docked poses, and docked actives/decoys with a CSV of id,active labels.

    Outputs

    • results.csv: one row per pose: set (redock or cross-dock), pose file, rank, score, RMSD, and whether it is within the threshold.
    • validated_boxes.json: the docking box with its redock RMSD and verdict, ready to bind into a screen.
    • summary.json: the verdict, top-1 and best-of-top-k RMSD, cross-docking results, enrichment metrics, and box provenance.
    • reference_ligand.sdf and, with enrichment, enrichment.csv.

    Not covered

    Redocking validates the setup on one system; it says nothing about how well the scoring function ranks a library, which is what the enrichment metrics are for. DiffDock places ligands without a box, so its RMSD validates the pose model rather than a box. Fetching co-crystal analog sets automatically, multi-receptor consensus, and conserved-water handling aren't supported yet.

    The Validate docking protocol, then screen workflow prepares the receptor with the Protein Preparer, boxes the crystal ligand with the Binding-Site Detector, redocks it with AutoDock Vina, and only screens your library when the redocked pose is within 2 Å.

    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.

    Docking Protocol Validator docking-validate

    Job type
    docking-validate
    Hardware
    cpu (default)
    Typical runtime
    2 min on CPU

    Payload

    Payload fields
    FieldTypeDescription
    pdb_idstring

    Limits: pattern ^[0-9A-Za-z]{4}$

    proteinfile_object
    reference_ligandfile_object
    ligand_resnamestring

    Limits: pattern ^[0-9A-Za-z]{1,3}$

    ligand_chainstring

    Limits: min length 1, max length 4

    protein_download_formatstring

    Default: "pdb"One of: "pdb", "cif"

    posesrequiredfile_object[] | file_object
    enginestring

    Default: "vina"One of: "vina", "gnina", "diffdock", "other"

    boxesfile_object
    rmsd_thresholdnumber

    Default: 2Limits: ≥ 0.5, ≤ 5

    top_kinteger

    Default: 3Limits: ≥ 1, ≤ 20

    cross_dock[]object[]

    Limits: max items 10

    cross_dock.labelstring

    Limits: min length 1

    cross_dock.pdb_idstring

    Limits: pattern ^[0-9A-Za-z]{4}$

    cross_dock.proteinfile_object
    cross_dock.reference_ligandfile_object
    cross_dock.ligand_resnamestring

    Limits: pattern ^[0-9A-Za-z]{1,3}$

    cross_dock.ligand_chainstring

    Limits: min length 1, max length 4

    cross_dock.posesrequiredfile_object[] | file_object
    enrichment_posesfile_object[] | file_object
    labelsfile_object
    score_propertystring

    Default: "auto"One of: "auto", "minimizedAffinity", "CNNscore", "CNNaffinity", "confidence"

    File fields take {"name": "x.pdb", "content_b64": "…"} or a stored artifact, {"$artifact": {"id": "art-…", "port": "…"}}. Files are up to 25 MiB each.

    Example

    from cognichem_client import CogniChem
    
    client = CogniChem.from_env()  # reads COGNICHEM_API_KEY
    payload = {
        "protein": {
            "name": "complex.pdb",
            "content_b64": "<file contents, base64>",
        },
        "reference_ligand": {
            "name": "crystal_ligand.sdf",
            "content_b64": "<file contents, base64>",
        },
        "ligand_resname": "LIG",
        "poses": [
            {
                "name": "redock_poses.sdf",
                "content_b64": "<file contents, base64>",
            },
        ],
        "engine": "vina",
        "rmsd_threshold": 2,
        "top_k": 2,
    }
    
    estimate = client.jobs.estimate(job_type="docking-validate", payload=payload, resource="cpu")
    print(f"Reserves ${estimate.cost:.2f}")
    
    job = client.jobs.submit(
        job_name="my-docking-validate-run",
        job_type="docking-validate",
        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

    • Table · optionalJSON
    • Docked poses (list) · optionalSDF, PDBQT, PDB
    • Table · optionalCSV
    • Docked poses (list)SDF, PDBQT, PDB
    • Protein structurePDB, CIF
    • Molecules · optionalSDF

    Workflow outputs

    • ArchiveZIP
    • TableJSON
    • TableCSV