Load the BINANA module¶
import sys
sys.path.append("../")
import binana
Load optional visualization module for this demo¶
import py3Dmol
Load in a receptor and ligand¶
ligand, receptor = binana.load_ligand_receptor.from_files("ligand.pdbqt", "receptor.pdbqt")
ligand, receptor
(<binana._structure.mol.Mol at 0x7fd4d81f8470>,
<binana._structure.mol.Mol at 0x7fd4d81f87f0>)
Get information about the hydrogen bonds (example)¶
hbond_inf = binana.interactions.get_hydrogen_bonds(ligand, receptor)
# Counting/characterizing the acceptors and donors (counts)
hbond_inf["counts"]
{'HDONOR_LIGAND_SIDECHAIN_OTHER': 1, 'HDONOR_RECEPTOR_SIDECHAIN_OTHER': 1}
# List the atoms involved in each hydrogen bond, and the angles/distances
for hbond_label in hbond_inf["labels"]:
print(hbond_label)
('A:CHT(1):N1(14)', 'A:CHT(1):H1(16)', 'A:ASP(157):OD2(285)', 'LIGAND', {'distance': 2.6500811308335455, 'angle': 16.087842801376098})
('A:CHT(1):O6(22)', 'A:ASN(156):2HD2(276)', 'A:ASN(156):ND2(274)', 'RECEPTOR', {'distance': 2.9006795755477723, 'angle': 35.51562311681741})
Get information about the cation-pi interactions (example)¶
cation_pi_inf = binana.interactions.get_cation_pi(ligand, receptor)
# Counting/characterizing the acceptors and donors (counts)
cation_pi_inf["counts"]
{'PI-CATION_LIGAND-CHARGED_OTHER': 2,
'PI-CATION_LIGAND-CHARGED_BETA': 2,
'PI-CATION_RECEPTOR-CHARGED_OTHER': 1}
# List the atoms involved in each cation-pi interaction
for cation_pi_label in cation_pi_inf["labels"]:
print(cation_pi_label)
('[A:CHT(1):N1(2) / A:CHT(1):C5(1) / A:CHT(1):C6(3) / A:CHT(1):C6(4) / A:CHT(1):C7(9)]', '[A:TRP(43):CG(28) / A:TRP(43):CD1(29) / A:TRP(43):NE1(31) / A:TRP(43):CE2(32) / A:TRP(43):CD2(30)]', {'distance': 4.403228947034208})
('[A:CHT(1):N1(2) / A:CHT(1):C5(1) / A:CHT(1):C6(3) / A:CHT(1):C6(4) / A:CHT(1):C7(9)]', '[A:TRP(43):CE2(32) / A:TRP(43):CD2(30) / A:TRP(43):CE3(33) / A:TRP(43):CZ3(35) / A:TRP(43):CH2(36) / A:TRP(43):CZ2(34)]', {'distance': 4.280756595250165})
('[A:CHT(1):N1(2) / A:CHT(1):C5(1) / A:CHT(1):C6(3) / A:CHT(1):C6(4) / A:CHT(1):C7(9)]', '[A:TRP(205):CG(468) / A:TRP(205):CD1(469) / A:TRP(205):NE1(471) / A:TRP(205):CE2(472) / A:TRP(205):CD2(470)]', {'distance': 4.1748128341280175})
('[A:CHT(1):N1(2) / A:CHT(1):C5(1) / A:CHT(1):C6(3) / A:CHT(1):C6(4) / A:CHT(1):C7(9)]', '[A:TRP(205):CE2(472) / A:TRP(205):CD2(470) / A:TRP(205):CE3(473) / A:TRP(205):CZ3(475) / A:TRP(205):CH2(476) / A:TRP(205):CZ2(474)]', {'distance': 4.45074514048553})
('[A:CHT(1):C2(17) / A:CHT(1):O1(18) / A:CHT(1):C5(19) / A:CHT(1):C4(20) / A:CHT(1):C3(21)]', '[A:LYS(94):NZ(144) / A:LYS(94):HZ1(146) / A:LYS(94):HZ2(147) / A:LYS(94):HZ3(148)]', {'distance': 2.57953875721998})
Other interactions are also available¶
print("Available functions for detecting interactions:")
for f in dir(binana.interactions):
if "get_" in f:
print(" " + f)
Available functions for detecting interactions:
get_active_site_flexibility
get_all_interactions
get_cation_pi
get_close
get_closest
get_electrostatic_energies
get_halogen_bonds
get_hydrogen_bonds
get_hydrophobics
get_ligand_atom_types
get_metal_coordinations
get_pi_pi
get_salt_bridges
Get and display PDB-formatted text¶
pdb_txt = binana.output.pdb_file.write(
ligand, receptor,
hydrogen_bonds=hbond_inf,
cat_pi=cation_pi_inf,
as_str=True
)
print(
"\n".join(
[
l
for l
in pdb_txt.split("\n")
if l.startswith("REMARK")
]
)
)
REMARK
REMARK The residue named "CCN" contains the closest contacts between the
REMARK protein and receptor. "CON" indicates close contacts. "ALP", "BET", and
REMARK "OTH" indicate receptor contacts whose respective protein residues have
REMARK the alpha-helix, beta-sheet, or "other" secondary structure. "BAC" and
REMARK "SID" indicate receptor contacts that are part of the protein backbone
REMARK and sidechain, respectively. "HYD" indicates hydrophobic contacts
REMARK between the protein and ligand. "HBN" indicates hydrogen bonds. "HAL"
REMARK indicates halogen bonds. "SAL" indicates salt bridges. "PIS" indicates
REMARK pi-pi stacking interactions, "PIT" indicates T-stacking interactions,
REMARK and "PIC" indicates cation-pi interactions. "MTL" indicates metal-
REMARK coordination interactions. Protein residue names are unchanged, but the
REMARK ligand residue is now named "LIG".
REMARK
view = py3Dmol.view(data="",linked=False)
view.addModel(pdb_txt)
view.setStyle({'stick':{'radius':0.1}})
view.setStyle({"resn": "LIG"}, {'stick':{'radius':0.3}})
view.setStyle({"resn": "HBN"}, {'sphere':{'radius':1, "color": "yellow"}})
view.setStyle({"resn": "PIC"}, {'sphere':{'radius':0.5, "color": "pink"}})
view.zoomTo()
You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
jupyter labextension install jupyterlab_3dmol
<py3Dmol.view at 0x7fd4e85f8630>
Get the interactions as a dictionary for easier big-data analysis¶
data = binana.output.dictionary.collect(
hydrogen_bonds=hbond_inf,
cat_pi=cation_pi_inf
)
print("Keys:")
print(list(data.keys()))
print("")
print("Hydrogen-bond data (example):")
print(data["hydrogenBonds"])
Keys:
['hydrogenBonds', 'cationPiInteractions']
Hydrogen-bond data (example):
[{'ligandAtoms': [{'chain': 'A', 'resID': 1, 'resName': 'CHT', 'atomName': 'N1', 'atomIndex': 14}, {'chain': 'A', 'resID': 1, 'resName': 'CHT', 'atomName': 'H1', 'atomIndex': 16}], 'receptorAtoms': [{'chain': 'A', 'resID': 157, 'resName': 'ASP', 'atomName': 'OD2', 'atomIndex': 285}], 'metrics': {'distance': 2.6500811308335455, 'angle': 16.087842801376098}}, {'ligandAtoms': [{'chain': 'A', 'resID': 1, 'resName': 'CHT', 'atomName': 'O6', 'atomIndex': 22}], 'receptorAtoms': [{'chain': 'A', 'resID': 156, 'resName': 'ASN', 'atomName': 'ND2', 'atomIndex': 274}, {'chain': 'A', 'resID': 156, 'resName': 'ASN', 'atomName': '2HD2', 'atomIndex': 276}], 'metrics': {'distance': 2.9006795755477723, 'angle': 35.51562311681741}}]
Some prefer CSV-formatted data¶
print(binana.output.csv.collect(data)[:500] + "\n\n...")
cationPiInteractions
,cationPiInteractions.1
,,ligandAtoms
,,,ligandAtoms.1
,,,,atomIndex,2
,,,,atomName,N1
,,,,chain,A
,,,,resID,1
,,,,resName,CHT
,,,ligandAtoms.2
,,,,atomIndex,1
,,,,atomName,C5
,,,,chain,A
,,,,resID,1
,,,,resName,CHT
,,,ligandAtoms.3
,,,,atomIndex,3
,,,,atomName,C6
,,,,chain,A
,,,,resID,1
,,,,resName,CHT
,,,ligandAtoms.4
,,,,atomIndex,4
,,,,atomName,C6
,,,,chain,A
,,,,resID,1
,,,,resName,CHT
,,,ligandAtoms.5
,,,,atomIndex,9
,,,,atomName,C7
,,,,chain,A
,,,,resID,1
,,,,resName,
...
Get all the interactions at once¶
all_inf = binana.interactions.get_all_interactions(ligand, receptor)
all_inf.keys()
dict_keys(['closest', 'close', 'electrostatic_energies', 'active_site_flexibility', 'hydrophobics', 'hydrogen_bonds', 'halogen_bonds', 'ligand_atom_types', 'pi_pi', 'cat_pi', 'salt_bridges', 'metal_coordinations', 'ligand_rotatable_bonds'])
Get and display PDB-formatted text containing all interactions¶
pdb_txt = binana.output.pdb_file.write_all(
ligand, receptor,
all_inf,
None,
as_str=True
)
view = py3Dmol.view(data="",linked=False)
view.addModel(pdb_txt)
view.setStyle({'stick':{'radius':0.1}})
view.setStyle({"resn": "LIG"}, {'stick':{'radius':0.3}})
view.setStyle({"resn": "CCN"}, {'sphere':{'radius':0.5, "color": "yellow"}})
view.setStyle({"resn": "SAL"}, {'sphere':{'radius':1, "color": "pink"}})
view.zoomTo()
You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
jupyter labextension install jupyterlab_3dmol
<py3Dmol.view at 0x7fd4e86ab7b8>
Get all interactions as a single dictionary¶
all_data = binana.output.dictionary.collect_all(all_inf)
print(all_data.keys())
print()
print("Hydrogen bonds (example):")
print()
print(all_data["hydrogenBonds"])
dict_keys(['closestContacts', 'closeContacts', 'hydrophobicContacts', 'hydrogenBonds', 'piPiStackingInteractions', 'tStackingInteractions', 'cationPiInteractions', 'saltBridges', 'activeSiteFlexibility', 'electrostaticEnergies', 'ligandAtomTypes', 'ligandRotatableBonds'])
Hydrogen bonds (example):
[{'ligandAtoms': [{'chain': 'A', 'resID': 1, 'resName': 'LIG', 'atomName': 'N1', 'atomIndex': 14}, {'chain': 'A', 'resID': 1, 'resName': 'LIG', 'atomName': 'H1', 'atomIndex': 16}], 'receptorAtoms': [{'chain': 'A', 'resID': 157, 'resName': 'ASP', 'atomName': 'OD2', 'atomIndex': 285}], 'metrics': {'distance': 2.6500811308335455, 'angle': 16.087842801376098}}, {'ligandAtoms': [{'chain': 'A', 'resID': 1, 'resName': 'LIG', 'atomName': 'O6', 'atomIndex': 22}], 'receptorAtoms': [{'chain': 'A', 'resID': 156, 'resName': 'ASN', 'atomName': 'ND2', 'atomIndex': 274}, {'chain': 'A', 'resID': 156, 'resName': 'ASN', 'atomName': '2HD2', 'atomIndex': 276}], 'metrics': {'distance': 2.9006795755477723, 'angle': 35.51562311681741}}]