Spaces:
Sleeping
Sleeping
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/) ভিজিট করুন পরিচিত প্রোটিন স্ট্রাকচারের সাথে আপনার প্রোটিন স্ট্রাকচার ম্যাচ করতে।
৩. যদি আপনি মনে করেন আপনি একটি অনন্য এবং দরকারী প্রোটিন আবিষ্কার করেছেন, সোশ্যাল মিডিয়াতে এটি শেয়ার করুন!
**মনে রাখবেন, এই ফোল্ডিং একটি র্যান্ডমলি জেনারেট করা সিকোয়েন্সের উপর ভিত্তি করে। ফলাফলগুলি সতর্কতার সাথে ব্যাখ্যা করুন।
প্রোটিন সিকোয়েন্স এক্সপ্লোর করার আনন্দ নিন!
""") |