Spaces:
Paused
Paused
Upload plot_pdb.py
Browse files- plot_pdb.py +55 -0
plot_pdb.py
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import py3Dmol
|
| 2 |
+
import requests
|
| 3 |
+
from pathlib import Path
|
| 4 |
+
|
| 5 |
+
def display_pdb_by_pdb(pdb):
|
| 6 |
+
# function to display pdb in py3dmol
|
| 7 |
+
# ref: https://huggingface.co/spaces/AIGE/A_B
|
| 8 |
+
|
| 9 |
+
view = py3Dmol.view(width=500, height=500)
|
| 10 |
+
view.addModel(pdb, "pdb")
|
| 11 |
+
view.setStyle({'cartoon': {'color': 'spectrum'}})
|
| 12 |
+
view.zoomTo()
|
| 13 |
+
output = view._make_html().replace("'", '"')
|
| 14 |
+
x = f"""<!DOCTYPE html><html></center> {output} </center></html>""" # do not use ' in this input
|
| 15 |
+
|
| 16 |
+
return f"""<iframe height="500px" width="100%" name="result" allow="midi; geolocation; microphone; camera;
|
| 17 |
+
display-capture; encrypted-media;" sandbox="allow-modals allow-forms
|
| 18 |
+
allow-scripts allow-same-origin allow-popups
|
| 19 |
+
allow-top-navigation-by-user-activation allow-downloads" allowfullscreen=""
|
| 20 |
+
allowpaymentrequest="" frameborder="0" srcdoc='{x}'></iframe>"""
|
| 21 |
+
|
| 22 |
+
def get_pdb(sequence):
|
| 23 |
+
retries = 0
|
| 24 |
+
pdb_str = None
|
| 25 |
+
url = "https://api.esmatlas.com/foldSequence/v1/pdb/"
|
| 26 |
+
while retries < 3 and pdb_str is None:
|
| 27 |
+
response = requests.post(url, data=sequence, verify=False)
|
| 28 |
+
pdb_str = response.text
|
| 29 |
+
if pdb_str == "INTERNAL SERVER ERROR":
|
| 30 |
+
retries += 1
|
| 31 |
+
time.sleep(0.1)
|
| 32 |
+
pdb = str = None
|
| 33 |
+
return pdb_str
|
| 34 |
+
|
| 35 |
+
def plot_struc(sequence):
|
| 36 |
+
headers = {
|
| 37 |
+
'Content-Type': 'application/x-www-form-urlencoded',
|
| 38 |
+
}
|
| 39 |
+
|
| 40 |
+
response = requests.post('https://api.esmatlas.com/foldSequence/v1/pdb/', headers=headers, data=sequence, verify=False) #verify=false jw 0425 work around for SSL certificate
|
| 41 |
+
|
| 42 |
+
pdb_string = get_pdb(sequence)
|
| 43 |
+
name = sequence[:3] + sequence[-3:]
|
| 44 |
+
|
| 45 |
+
outpath = (
|
| 46 |
+
Path.cwd() / f"PDB-{name}.pdb")
|
| 47 |
+
|
| 48 |
+
with open(outpath.name, "w") as f:
|
| 49 |
+
f.write(pdb_string)
|
| 50 |
+
|
| 51 |
+
outpath_str = str(outpath)
|
| 52 |
+
|
| 53 |
+
html_view = display_pdb_by_pdb(pdb_string)
|
| 54 |
+
|
| 55 |
+
return outpath_str, html_view
|