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()