File size: 16,339 Bytes
a0f720e
3c437e4
f8517eb
 
e8fdfbc
 
 
 
651cc8d
 
 
 
f3feb5a
e261e36
e8fdfbc
 
baded55
ab5d528
 
f8517eb
 
 
 
 
 
 
e8fdfbc
437fb66
 
 
 
 
baded55
437fb66
 
 
baded55
437fb66
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3c437e4
651cc8d
baded55
 
651cc8d
 
 
baded55
651cc8d
aad6c5c
 
 
baded55
aad6c5c
 
 
baded55
 
 
 
aad6c5c
 
 
baded55
 
a89a730
651cc8d
baded55
 
 
aad6c5c
baded55
aad6c5c
baded55
c3027e4
baded55
a5a0365
 
baded55
 
a89a730
e8fdfbc
 
 
 
 
 
baded55
 
 
 
3af0361
e8fdfbc
 
 
 
 
 
 
 
9512b53
 
 
 
 
 
 
 
e8fdfbc
af9e04c
3af0361
e8fdfbc
baded55
 
f8517eb
5ad7d62
baded55
5ad7d62
 
 
baded55
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e10ddb8
e81711f
baded55
 
 
 
 
 
 
 
 
f8517eb
e8fdfbc
af9e04c
baded55
 
e8fdfbc
baded55
e8fdfbc
f8517eb
baded55
af9e04c
baded55
f3feb5a
 
baded55
8a5ab71
f3feb5a
baded55
 
f3feb5a
baded55
91d9111
baded55
 
 
 
 
 
 
 
 
 
 
 
 
1325647
4609dee
1325647
 
29ee1af
baded55
 
 
1325647
 
 
 
 
baded55
1325647
 
 
baded55
 
 
 
 
e81711f
24d7a94
 
baded55
24d7a94
 
 
 
baded55
24d7a94
 
 
 
980c380
e10ddb8
baded55
 
 
 
 
 
 
 
 
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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
import streamlit as st
from stmol import showmol
import py3Dmol
import requests
import biotite.structure.io as bsio
import random
import hashlib
import urllib3
from Bio.Blast import NCBIWWW, NCBIXML
from Bio.Seq import Seq
from Bio.SeqRecord import SeqRecord
import time
import urllib.parse

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

st.set_page_config(layout='wide')
st.sidebar.title('🔮 জেনপ্রো২ - BD')
st.sidebar.write('জেনপ্রো২ - BD হলো একটি সম্পূর্ণ প্রোটিন সিকোয়েন্স জেনারেটর, স্ট্রাকচার প্রেডিক্টর এবং অ্যানালাইসিস টুল যা [ESMFold](https://esmatlas.com/explore?at=1%2C1%2C21.999999344348925) এবং ESM-2 ল্যাঙ্গুয়েজ মডেল ব্যবহার করে ( Adapted from GenPro 2,5)')

def generate_sequence_from_words(words, length):
    seed = ' '.join(words).encode('utf-8')
    random.seed(hashlib.md5(seed).hexdigest())
    amino_acids = "ACDEFGHIKLMNPQRSTVWY"
    return ''.join(random.choice(amino_acids) for _ in range(length))

def render_mol(pdb):
    viewer = py3Dmol.view(width='100%', height='400px')
    viewer.addModel(pdb, 'pdb')
    viewer.setStyle({'cartoon': {'color': 'spectrum'}})
    viewer.setBackgroundColor('white')
    viewer.zoomTo()
    viewer.zoom(0.8)  # একটু জুম আউট ভিউ
    viewer.spin(True)
    viewer.render()
    
    # মোবাইলের জন্য রেস্পন্সিভ ডিজাইন
    st.markdown("""
    <style>
    .stmol-container {
        width: 100% !important;
        height: 400px !important;
        max-width: 800px;
        margin: 0 auto;
    }
    @media (max-width: 600px) {
        .stmol-container {
            height: 300px !important;
        }
    }
    </style>
    """, unsafe_allow_html=True)
    
    showmol(viewer, height=400, width=None)

def perform_blast_analysis(sequence):
    st.subheader('প্রোটিন বিশ্লেষণ')
    with st.spinner("জেনারেট করা প্রোটিন বিশ্লেষণ করা হচ্ছে... এটি কয়েক মিনিট সময় নিতে পারে। অনুগ্রহ করে অপেক্ষা করুন!"):
        progress_bar = st.progress(0)
        for i in range(100):
            progress_bar.progress(i + 1)
            time.sleep(1.9)  # বিশ্লেষণ সময়
        
        try:
            record = SeqRecord(Seq(sequence), id='random_protein')
            result_handle = NCBIWWW.qblast("blastp", "swissprot", record.seq)
            
            blast_record = NCBIXML.read(result_handle)
            
            if blast_record.alignments:
                alignment = blast_record.alignments[0]  # শীর্ষ ম্যাচটি নিন
                hsp = alignment.hsps[0]  # প্রথম (সেরা) HSP নিন
                
                # প্রোটিন নাম এবং অর্গানিজম এক্সট্রাক্ট করুন
                title_parts = alignment.title.split('|')
                protein_name = title_parts[-1].strip()
                organism = title_parts[-2].split('OS=')[-1].split('OX=')[0].strip()
                
                # আইডেন্টিটি পার্সেন্টেজ ক্যালকুলেট করুন
                identity_percentage = (hsp.identities / hsp.align_length) * 100
                
                st.write(f"**শীর্ষ ম্যাচ:** {protein_name}")
                st.write(f"**ইউনিপ্রোট আইডি:** {organism}")
                st.write(f"**সিকোয়েন্স আইডেন্টিটি ম্যাচ:** {identity_percentage:.2f}%")
                
                # প্রোটিন ফাংশন ফেচ করুন (যদি থাকে)
                if hasattr(alignment, 'description') and alignment.description:
                    st.write(f"**সম্ভাব্য ফাংশন:** {alignment.description}")
                else:
                    st.write("ডাটাবেসে কোন উল্লেখযোগ্য ম্যাচ পাওয়া যায়নি। এটি একটি অনন্য প্রোটিন সিকোয়েন্স হতে পারে!")

        except Exception as e:
            st.error(f"প্রোটিন বিশ্লেষণ করার সময় একটি ত্রুটি ঘটেছে: {str(e)}")
            st.write("অনুগ্রহ করে পরে আবার চেষ্টা করুন, BLAST সার্ভারে বিলম্ব হতে পারে।")
            
def update(sequence, word1, word2, word3, sequence_length):
    headers = {
        'Content-Type': 'application/x-www-form-urlencoded',
    }
    try:
        response = requests.post('https://api.esmatlas.com/foldSequence/v1/pdb/', 
                                 headers=headers, 
                                 data=sequence, 
                                 verify=False,
                                 timeout=300)
        response.raise_for_status()
        pdb_string = response.content.decode('utf-8')
        
        with open('predicted.pdb', 'w') as f:
            f.write(pdb_string)
        
        struct = bsio.load_structure('predicted.pdb', extra_fields=["b_factor"])
        b_value = round(struct.b_factor.mean(), 2)
        
        st.session_state.structure_info = {
            'pdb_string': pdb_string,
            'b_value': b_value,
            'word1': word1,
            'word2': word2,
            'word3': word3,
            'sequence_length': sequence_length
        }
        
        st.session_state.show_analyze_button = True

    except requests.exceptions.RequestException as e:
        st.error(f"API কল করার সময় একটি ত্রুটি ঘটেছে: {str(e)}")
        st.write("অনুগ্রহ করে পরে আবার চেষ্টা করুন বা সমস্যা থাকলে সাপোর্টে যোগাযোগ করুন।")

def share_on_twitter(word1, word2, word3, length, plddt):
    tweet_text = f"আমি শুধু একটি নতুন প্রোটিন আবিষ্কার করেছি সিড শব্দ ব্যবহার করে: {word1} + {word2} + {word3} | প্রোটিন জেনারেট করেছে @PotionBio"
    tweet_url = f"https://twitter.com/intent/tweet?text={urllib.parse.quote(tweet_text)}"
    return tweet_url

# সেশন স্টেট ভেরিয়েবল ইনিশিয়ালাইজ করুন
if 'sequence' not in st.session_state:
    st.session_state.sequence = None
if 'show_analyze_button' not in st.session_state:
    st.session_state.show_analyze_button = False
if 'structure_info' not in st.session_state:
    st.session_state.structure_info = None

st.title("📖 ব্যবহারকারী গাইড:")

st.sidebar.subheader("শব্দ থেকে সিকোয়েন্স জেনারেট করুন")
word1 = st.sidebar.text_input("শব্দ ১")
word2 = st.sidebar.text_input("শব্দ ২")
word3 = st.sidebar.text_input("শব্দ ৩")
sequence_length = st.sidebar.number_input("সিকোয়েন্স দৈর্ঘ্য", min_value=50, max_value=400, value=100, step=10)

# ব্যবহারকারীদের জন্য তথ্য
st.info("""
প্রোটিন দৈর্ঘ্য গাইড:
- ৫০-১০০ অ্যামিনো অ্যাসিড: ছোট প্রোটিন/পেপটাইড
- ১০০-৩০০ অ্যামিনো অ্যাসিড: গড় প্রোটিন ডোমেইন
- ৩০০-৫০০ অ্যামিনো অ্যাসিড: বড় সিঙ্গেল-ডোমেইন প্রোটিন
""")

st.markdown("""
১. প্রথমে সাইডবারে আপনার পছন্দের যেকোনো তিনটি সিড শব্দ ইনপুট করুন এবং একটি সিকোয়েন্স দৈর্ঘ্য সিলেক্ট করুন।
২. 'জেনারেট এবং প্রেডিক্ট' বাটনে ক্লিক করুন আপনার ইনপুটের ভিত্তিতে একটি অনন্য প্রোটিন সিকোয়েন্স জেনারেট করতে।
৩. জেনপ্রো২ তখন আপনার প্রোটিনের ৩ডি স্ট্রাকচার প্রেডিক্ট করে এবং একটি কনফিডেন্স স্কোর প্রদান করে।
জেনপ্রো২ এবং প্রোটিন সম্পর্কে আরও:  
আপনার অনন্য প্রোটিন নতুন থেরাপিউটিক সম্ভাবনা উন্মোচন বা রোগের মেকানিজম বোঝার চাবিকাঠি হতে পারে। কে জানে? আপনার পরবর্তী জেনারেট করা সিকোয়েন্স একটি যুগান্তকারী আবিষ্কারের দিকে নিয়ে যেতে পারে। কম্পিউটেশনাল প্রোটিন এক্সপ্লোরেশনে আপনার যাত্রা শুরু করুন!  [আরও জানুন](https://www.youtube.com/watch?v=KpedmJdrTpY)
    """)

if st.sidebar.button('জেনারেট এবং প্রেডিক্ট'):
    if word1 and word2 and word3:
        sequence = generate_sequence_from_words([word1, word2, word3], sequence_length)
        st.session_state.sequence = sequence
        st.sidebar.text_area("জেনারেট করা সিকোয়েন্স", sequence, height=100)
        st.sidebar.info("দ্রষ্টব্য: একই শব্দ এবং সিকোয়েন্স দৈর্ঘ্য সবসময় একই সিকোয়েন্স উৎপন্ন করবে।")
        
        with st.spinner("প্রোটিন স্ট্রাকচার প্রেডিক্ট করা হচ্ছে... এটি কয়েক মিনিট সময় নিতে পারে।"):
            update(sequence, word1, word2, word3, sequence_length)
    else:
        st.sidebar.warning("একটি সিকোয়েন্স জেনারেট করতে অনুগ্রহ করে তিনটি শব্দ ইনপুট করুন।")

# স্ট্রাকচার ইনফো ডিসপ্লে করুন যদি থাকে
if st.session_state.structure_info:
    info = st.session_state.structure_info
    st.subheader(f'প্রেডিক্ট করা প্রোটিন স্ট্রাকচার সিড ব্যবহার করে: {info["word1"]}, {info["word2"]}, এবং {info["word3"]}')
    render_mol(info['pdb_string'])
    
    st.subheader('plDDT কনফিডেন্স স্কোর')
    st.write('plDDT হলো প্রোটিন ফোল্ডিং প্রেডিকশনের কনফিডেন্স লেভেল স্কোর করার জন্য একটি বেঞ্চমার্ক যা ০-১০০% স্কেলে কাজ করে। ৭০% বা তার বেশি ভালো!')
    plddt_score = int(info["b_value"] * 100)
    st.info(f'আপনার plDDT স্কোর হলো: {plddt_score}%')
 
    st.subheader("আপনার অনন্য প্রোটিন X(টুইটার) এ শেয়ার করুন")
    
    st.markdown("""
    <div style='background-color: #00000; padding: 10px; border-radius: 5px; font-size: 0.8em;'>
    <ol>
        <li>উপরে আপনার প্রোটিন স্ট্রাকচারের একটি স্ক্রিনশট নিন।</li>
        <li>নিচের 'শেয়ার রেজাল্টস' লিঙ্কে ক্লিক করুন আপনার প্রোটিনের সিড-শব্দ সহ একটি প্রি-ফিল্ড পোস্ট খুলতে।</li>
        <li>আপনার প্রোটিন ইমেজ বা সিকোয়েন্স আপলোড করুন এবং পোস্ট করুন!</li>
    </ol>
    </div>
    """, unsafe_allow_html=True)
    
    tweet_url = share_on_twitter(info["word1"], info["word2"], info["word3"], info["sequence_length"], plddt_score)

    st.markdown(
    f"""
    <a href="{tweet_url}" target="_blank" style="
        display: inline-block;
        background-color: white;
        color: black;
        border: 1px solid black;
        padding: 0.5em 1em;
        text-decoration: none;
        border-radius: 8px;
        font-weight: bold;
    ">
        প্রোটিন শেয়ার করুন
    </a>
    """,
    unsafe_allow_html=True
       )

    st.markdown("""
    ## পরবর্তী করণীয়:
    """)

    col1, col2 = st.columns(2)
    with col1:
        if st.button('প্রোটিন বিশ্লেষণ করুন'):
            perform_blast_analysis(st.session_state.sequence)
    
    with col2:
        st.download_button(
            label="PDB ডাউনলোড করুন",
            data=info['pdb_string'],
            file_name='predicted.pdb',
            mime='text/plain',
        )
        
    st.markdown("""
    যদি আপনি একটি আকর্ষণীয় প্রোটিন সিকোয়েন্স এবং স্ট্রাকচার আবিষ্কার করেন, আপনি এটি আরও গভীরভাবে এক্সপ্লোর করতে পারেন:
   
    ১. 'প্রোটিন বিশ্লেষণ করুন' বাটনে ক্লিক করুন [BLAST](https://blast.ncbi.nlm.nih.gov/Blast.cgi?PROGRAM=blastp&PAGE_TYPE=BlastSearch&LINK_LOC=blasthome) প্রোটিন ডাটাবেস সার্চ করতে এবং দেখুন আপনার প্রোটিন কোন পরিচিত সিকোয়েন্সের সাথে মিলে কিনা। সিকোয়েন্স আইডেন্টিটি দেখাবে আপনার সিকোয়েন্স কতটা কাছাকাছি ম্যাচ করে। *দ্রষ্টব্য এটি কয়েক মিনিট সময় নিতে পারে
    ২. আপনার প্রোটিন ডাটা ডাউনলোড করুন এবং [প্রোটিন ডাটা ব্যাংক (PDB)](https://www.rcsb.org/) ভিজিট করুন পরিচিত প্রোটিন স্ট্রাকচারের সাথে আপনার প্রোটিন স্ট্রাকচার ম্যাচ করতে।
    ৩. যদি আপনি মনে করেন আপনি একটি অনন্য এবং দরকারী প্রোটিন আবিষ্কার করেছেন, সোশ্যাল মিডিয়াতে এটি শেয়ার করুন!
  
    **মনে রাখবেন, এই ফোল্ডিং একটি র্যান্ডমলি জেনারেট করা সিকোয়েন্সের উপর ভিত্তি করে। ফলাফলগুলি সতর্কতার সাথে ব্যাখ্যা করুন।
    প্রোটিন সিকোয়েন্স এক্সপ্লোর করার আনন্দ নিন!
    """)