Force Disulfide

The force disulfide protocol mutates a specified set of residue pairs to cysteines, forms disulfide bonds between them, and then performs a constrained Rosetta relaxation of the entire protein in order to minimize the energy. The score of the resulting model is then compared to the score resulting from a constrained relax of the original input structure without the disulfide bonds. 

The force disulfide protocol will aggressively attempt to close disulfide bonds in the structure and is perfectly willing to substantially disrupt the tertiary structure of the protein in order to do so.  Results should be carefully inspected to ensure that they are biologically reasonable.


  • Input PDB file — a PDB file with the residues starting at 1 and increasing monotonically (1,2,3,4,…).  Files downloaded from Cyrus Bench will be formatted in this way.  

    • CLI argument: --pdb-file input.pdb

    • Python submit() argument: pdb-file=”input.pdb”

    • Do not include nonprotein residues.

    • Do not include multimodel (NMR-sourced) PDBs.  

    • Cyrus strongly recommends using the Prepare or Relax tool in Cyrus Bench to preprocess models before uploading to this API.  This will number your models as expected and provide a more stable scoring baseline and will make interpreting results easier.

  • Disulfide List — A list of residue number pairs which should form disulfide bonds

    • CLI argument: --disulfide-list “1:10,3:5”

    • Python submit() argument: disulfide_list=[(1,10), (3,5)]

    • Each residue should only be referenced in one disulfide pair

    • Residues in the disulfide list should not already be in disulfides (this will result in an error)

    • Residues should be in a location such that they can reasonably participate in a disulfide bond without major movement of the protein backbone.  This code will not warn you if distant locations are chosen; it will put in a disulfide bond and destroy your protein fold trying to enforce it.

Command Line Examples

Create a PDB model with disulfides between residue positions 2 and 5, and between residue positions 10 and 20:

1 cyrus submit force-disulfide input.pdb --disulfide-list '2:5,10:20'

Python Examples

Create a PDB model with disulfides between residue positions 2 and 5, and between residue positions 10 and 20:

1 2 3 4 from engine.force_disulfide.client import ForceDisulfideClient client = ForceDisulfideClient() job_id = client.submit(pdb_path="input.pdb", disulfide_list=[(2, 5), (10, 20)])


A job that fails due to some issue with the input PDB or other Rosetta problem will be marked FAILED and have no output.

A job that successfully completed will be marked DONE and have the below files available when downloaded with cyrus get.  Note that the completion of the job is not a marker that Rosetta thinks the disulfide formed is physically plausible.

  • force_disulfide.pdb – A PDB file containing the input protein with disulfide bonds added and a constrained relax run afterwards. 

  • – A Rosetta score file containing the scores of the returned PDB with disulfide bonds.  

  • – A Rosetta score file containing the difference between the scores of the pdb file with disulfides added and the relaxed input pdb without disulfides.  Negative values mean the score improved when disulfides were added.  This is the file you should interpret to understand model quality.

Output File interpretation

The resulting PDB, force_disulfide.pdb, can be interpreted in all the usual ways: its Rosetta scores, your biophysical intuition, or by submitting its md5sum as lottery numbers to see if they win.  However, the model should not be interpreted in isolation.  This module forces disulfide bonds whether they are good or not, and an input crystal structure that already has good scores may still have many locally good regions after a bad forced disulfide; these locally good regions will give the overall model apparently-good Rosetta scores even if the model is pretty bad.

As a consequence, we recommend examining the file, which is the score differences between this model and a model that has been put through a similar protocol, except with no mutations to cysteines or a forced disulfide – in other words just the relax. This is effectively a control experiment.  By examining the delta scores (the calculation is constructed so that negative is better) we can examine if Rosetta thinks adding the disulfide is stable in the context of the overall protein fold.  Negative values for the total score change means Rosetta thinks the disulfide is plausible.  Zero to small positive values (+5 or so) for the total score change indicate the disulfide may form.  Scores that increase by more than 5 energy units should be treated with caution; this indicates Rosetta thinks the disulfide is destabilizing.

You should always look at your input PDB and the output model overlaid in the molecular viewer of your choice to see if the disulfide caused any unwanted large backbone rearrangements.

Treatment of Existing Disulfides

This module should leave existing disulfides in place, assuming they are geometrically correct enough that Rosetta can detect them.  Do not submit force disulfide requests to residues that are already in disulfides.