File size: 6,207 Bytes
580db5b b0cb70d 9f2073b 289b045 0014c63 977b489 2550c12 0014c63 b0cb70d 9f2073b 26ee080 9f2073b 0014c63 9f2073b b0cb70d 9f2073b efd57a2 9f2073b ea99d62 45f9208 54f71b6 ea99d62 9f2073b 3856e63 83bb191 9f2073b b0cb70d 5a255ae e26a5c3 9f2073b 1f3c26c ebd6115 69699d7 ebd6115 69699d7 ead6b80 fc7924f ead6b80 27a7049 1f3c26c 580db5b 9f2073b 2550c12 c9bfe79 2550c12 977b489 2550c12 977b489 fb540ae e90417a 9f2073b c8cad2c 9f2073b 289b045 9f2073b fcdae55 9f2073b fcdae55 9f2073b 26ee080 9f2073b 2550c12 9f2073b 41bea22 dbcc60e 2550c12 41bea22 2550c12 41bea22 2550c12 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 |
import gradio as gr
from igfold import IgFoldRunner
import os
import random
import base64
import socket
import re
def read_mol(molpath):
with open(molpath, "r") as fp:
lines = fp.readlines()
mol = ""
for l in lines:
mol += l
return mol
def molecule(input_pdb, h_seq, l_seq):
mol = read_mol(input_pdb)
byte_content = mol.encode('utf-8')
base64_content = base64.b64encode(byte_content).decode('utf-8')
x = (
"""<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<style>
body{
font-family:sans-serif
}
.mol-container {
width: 100%;
height: 600px;
position: relative;
}
.mol-container select{
background-image:None;
}
</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.3/jquery.min.js" integrity="sha512-STof4xm1wgkfm7heWqFJVn58Hm3EtS31XFaagaa8VMReCXAkQnJZ+jEy8PCC/iT18dFy95WcExNHFTqLyp72eQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="https://3Dmol.csb.pitt.edu/build/3Dmol-min.js"></script>
</head>
<body>
<div id="container" class="mol-container"></div>
<script>
let h_seq = `"""
+ h_seq
+ """`
let l_seq = `"""
+ l_seq
+ """`
let pdb = `"""
+ mol
+ """`
$(document).ready(function () {
let element = $("#container");
let config = { backgroundColor: "white" };
let viewer = $3Dmol.createViewer(element, config);
viewer.addModel(pdb, "pdb");
viewer.getModel(0).setStyle({chain: "H"}, {cartoon:{color:"red"}});
viewer.getModel(0).setStyle({chain: "L"}, {cartoon:{color:"blue"}});
viewer.addSurface($3Dmol.SurfaceType.VDW, {opacity: 0.4, color: "lightblue"});
viewer.zoomTo();
viewer.render();
viewer.zoom(0.8, 2000);
})
</script>
</body></html>"""
)
return f"""<iframe style="width: 100%; height: 600px" name="result" allow="midi; geolocation; microphone; camera;
display-capture; encrypted-media;" sandbox="allow-modals allow-forms
allow-scripts allow-same-origin allow-popups
allow-top-navigation-by-user-activation allow-downloads" allowfullscreen=""
allowpaymentrequest="" frameborder="0" srcdoc='{x}'></iframe>
<div style="position: absolute; top: 10px; right: 10px; background-color: white; padding: 10px; border: 1px solid black;">
<div style="width: 20px; height: 20px; background-color: red; display: inline-block;"></div>
<span style="margin-left: 3px;">Heavy chain</span><br>
<div style="width: 20px; height: 20px; background-color: blue; display: inline-block;"></div>
<span style="margin-left: 3px;">Light chain</span>
<div style="display: flex; justify-content: space-between; margin-top: 5px;">
<a href="data:application/octet-stream;base64,{base64_content}" download="structure.pdb">Download File</a>
</div>
</div>
"""
def validate(seq):
alphabet = set('ACDEFGHIKLMNPQRSTVWY')
leftover = set(seq.upper()) - alphabet
return not leftover
def clean_sequence(seq):
return re.sub(r'\s+', '', seq)
def pred_seq(h_seq, l_seq):
h_seq = clean_sequence(h_seq).upper()
l_seq = clean_sequence(l_seq).upper()
print("Logs","___"*10)
print(f"Heavy chain: {h_seq}")
print(f"Light chain: {l_seq}")
hostname = socket.gethostname()
ip_address = socket.gethostbyname(hostname)
print(f"Hostname: {hostname}")
print(f"IP Address: {ip_address}")
print("___"*10)
h_is_valid = validate(h_seq)
l_is_valid = validate(l_seq)
if h_is_valid and l_is_valid:
sequences = {
"H": h_seq,
"L": l_seq
}
f_name = ''.join([random.choice("ACDEFGHIKLMNPQRSTVWY") for _ in range(15)])
pred_pdb = f"{f_name}.pdb"
igfold = IgFoldRunner(num_models = 1)
igfold.fold(
pred_pdb,
sequences=sequences,
do_refine=False,
do_renum=False
)
html = molecule(pred_pdb, h_seq, l_seq)
else:
html = "<p>ERROR! Not valid sequence. Please use only standard amino acid letters (ACDEFGHIKLMNPQRSTVWY)</p>"
return html
# Примеры последовательностей
examples = [
[
"QVQLKESGPGLVAPSQSLSITCTVSGFSLSSYGVSWVRQPPGKGLEWLGVIWGDGSTNYHPNLMSRLSISKDISKSQVLFKLNSLQTDDTATYYCVTLDYWGQGTSVTVSS",
"DVVMTQTPLSLPVSLGDQASISCRSSQSLVHRNGNTYLHWYLQKPGQSPKLLIYKVSNRFSGVPDRFSGSGSGTDFTLKISRVEAEDLGLYFCFQTTYVPNTFGGGTKLEIK"
],
[
"EVQLLESGGGLVQPGGSLRLSCAASGFTFSLYWMGWVRQAPGKGLEWVSSISSSGGVTPYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCAKLGELGWFDPWGQGTLVTVSS",
"DIQMTQSPSSLSASVGDRVTITCRASQGISSYLNWYQQKPGKAPKLLIYYASNLQNGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQSYSTPLTFGGGTKVEIK"
],
[
"EVQLVQSGPEVKKPGTSVKVSCKASGFTFMSSAVQWVRQARGQRLEWIGWIVIGSGNTNYAQKFQERVTITRDMSTSTAYMELSSLRSEDTAVYYCAAPYCSSISCNDGFDIWGQGTMVTVS",
"EIVLTQSPATLSLSPGERATLSCRASQSVSSYLAWYQQKPGQAPRLLIYDASNRATGIPARFSGSGSGTDFTLTISSLEPEDFAVYYCQQRSNWPITFGQGTKLEIK"
]
]
with gr.Blocks() as demo:
gr.Markdown('# Antibody Structure Prediction')
gr.Markdown("## Examples")
with gr.Row():
h_text = gr.Textbox(lines=5, label="Heavy chain",
placeholder="Enter heavy chain sequence (e.g. QVQLKESGP...)")
l_text = gr.Textbox(lines=5, label="Light chain",
placeholder="Enter light chain sequence (e.g. DVVMTQTPL...)")
# Создаем примеры с помощью gr.Examples
gr.Examples(
examples=examples,
inputs=[h_text, l_text],
label="Click on any example to paste it into the input fields",
fn=pred_seq,
outputs=gr.HTML()
)
btn = gr.Button(value="Submit")
output_html = gr.HTML()
btn.click(pred_seq, inputs=[h_text, l_text], outputs=output_html)
if __name__ == "__main__":
demo.launch() |