Introduced in the paper Zero-shot design of drug-binding proteins via neural selection-expansion!
Jointly optimize the sequence and structure of a protein-ligand binding pose with iterative selection-expansion.
To run NISE, install the conda environment for LASErMPNN and a separate conda environment which contains Boltz-1x or Boltz-2x:
-
Install LASErMPNN conda environment
-
Install ProDy from source into lasermpnn conda environment. There is currently an issue with the conda installable ProDy and distance-based selections which are used within NISE. This can be resolved for now by installing ProDy from source.
Just follow this set of commands inside the NISE project directory after git clone-ing the project and installing the lasermpnn environment.
git submodule update --init --recursive
conda activate lasermpnn
git clone [email protected]:prody/ProDy.git
cd ProDy
python setup.py build_ext --inplace --force
pip install -Ue .
cd ..
tar -xvf hetdict.tar.gz- Activate your conda environment containing Boltz-1x or Boltz-2x and run
which boltzto get the path to the executable you call when runningboltz predictcommands. You will need to update this path inrun_nise_boltz1x.pyorrun_nise_boltz2x.pyrespectively.
While we would recommend following the protocol using COMBS to generate initial poses as outlined in our paper, decent starting poses may be generated using the workflow outlined here using CARPdock,. CARPdock is likely the fastest way to get a good starting point and has been experimentally validated on some unpublished test targets. Initializations from RFDiffusion2, BoltzDesign1 or BoltzGen will almost certainly work as well, but how best to leverage these tools for ligand binder design remains untested.
-
Create a PDB file containing your PROTONATED input ligand with CONECT records encoding bonds: If you have a non-protonated ligand/are missing conect records, run
protonate_and_add_conect_records.py {input_path}.pdb {smiles_string} {output_path}.pdb. WARNING: This will rename the ligand atoms, ligand chain, and resnum. -
[Optional] If you want to protonate using reduce (keeps added ligand hydrogen names consistent with input, a bit more finicky than the alternative RDKit), Inject your ligand into REDUCE hetdict by running
inject_ligand_into_hetdict.py {output_path}.pdb -
Create an input directory with a subfolder called input_backbones. Ex:
./debug/input_backbones/. -
Update the params dictionary at the bottom of
./run_nise_boltz1x.pywith the path to your new input dir ex: (input_dir = Path('./debug/')). -
Update burial and RMSD atom sets and smiles string in
./run_nise_boltz1x.py -
Update
boltz1x_executable_pathat bottom of./run_nise_boltz1x.py -
If you want to constrain the number of alanine and glycine residues predicted on the surface of the protein in secondary-structured regions, run
identify_surface_residues.ipynband update 'budget_residue_sele_string' in the params dictionary at the bottom of the run_nise_boltz script.
To test out an example run:
# Protonated smiles string from ChemDraw.
./protonate_and_add_conect_records.py ./example_pdbs/16_pose26_en_-5p044_no_CG_top1_of_1_n4_00374_looped_master_6_gly_0001_trim_H_98.pdb "CC[C@]1(O)C2=C(C(N3CC4=C5[C@@H]([NH3+])CCC6=C5C(N=C4C3=C2)=CC(F)=C6C)=O)COC1=O" ./example_pdbs/test_input_protonated_conect.pdb
mkdir -p ./debug/input_backbones/
cp ./example_pdbs/test_input_protonated_conect.pdb ./debug/input_backbones/
./run_nise_boltz1x.py