kj03 commited on
Commit
e81711f
·
verified ·
1 Parent(s): 2499469

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +103 -86
app.py CHANGED
@@ -12,23 +12,11 @@ from Bio.SeqRecord import SeqRecord
12
  import time
13
  import urllib.parse
14
 
15
- # Disable warnings
16
  urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
17
 
18
- # Set page config
19
- st.set_page_config(layout='wide', page_title="GenPro2 | Protein Generator")
20
-
21
- # Initialize session state variables
22
- if 'sequence' not in st.session_state:
23
- st.session_state.sequence = None
24
- if 'show_analyze_button' not in st.session_state:
25
- st.session_state.show_analyze_button = False
26
- if 'structure_info' not in st.session_state:
27
- st.session_state.structure_info = None
28
-
29
- # Sidebar content
30
- st.sidebar.title('🔮 GenPro2')
31
- st.sidebar.write('Protein sequence generator using ESMFold | beta v2.51')
32
 
33
  def generate_sequence_from_words(words, length):
34
  seed = ' '.join(words).encode('utf-8')
@@ -42,10 +30,11 @@ def render_mol(pdb):
42
  viewer.setStyle({'cartoon': {'color': 'spectrum'}})
43
  viewer.setBackgroundColor('white')
44
  viewer.zoomTo()
45
- viewer.zoom(0.8)
46
  viewer.spin(True)
47
  viewer.render()
48
 
 
49
  st.markdown("""
50
  <style>
51
  .stmol-container {
@@ -65,38 +54,44 @@ def render_mol(pdb):
65
  showmol(viewer, height=400, width=None)
66
 
67
  def perform_blast_analysis(sequence):
68
- st.subheader('Protein Analysis')
69
- with st.spinner("Analyzing generated protein... This may take several minutes."):
70
  progress_bar = st.progress(0)
71
  for i in range(100):
72
  progress_bar.progress(i + 1)
73
- time.sleep(1.9)
74
 
75
  try:
76
  record = SeqRecord(Seq(sequence), id='random_protein')
77
  result_handle = NCBIWWW.qblast("blastp", "swissprot", record.seq)
 
78
  blast_record = NCBIXML.read(result_handle)
79
 
80
  if blast_record.alignments:
81
- alignment = blast_record.alignments[0]
82
- hsp = alignment.hsps[0]
 
 
83
  title_parts = alignment.title.split('|')
84
  protein_name = title_parts[-1].strip()
85
  organism = title_parts[-2].split('OS=')[-1].split('OX=')[0].strip()
 
 
86
  identity_percentage = (hsp.identities / hsp.align_length) * 100
87
 
88
- st.write(f"**Top Match:** {protein_name}")
89
- st.write(f"**UniProt ID:** {organism}")
90
- st.write(f"**Sequence Identity Match:** {identity_percentage:.2f}%")
91
 
 
92
  if hasattr(alignment, 'description') and alignment.description:
93
- st.write(f"**Potential Function:** {alignment.description}")
94
  else:
95
- st.write("No significant matches found. This might be a unique protein sequence!")
96
 
97
  except Exception as e:
98
- st.error(f"Analysis error: {str(e)}")
99
- st.write("Please try again later, BLAST servers might be busy.")
100
 
101
  def update(sequence, word1, word2, word3, sequence_length):
102
  headers = {
@@ -104,10 +99,10 @@ def update(sequence, word1, word2, word3, sequence_length):
104
  }
105
  try:
106
  response = requests.post('https://api.esmatlas.com/foldSequence/v1/pdb/',
107
- headers=headers,
108
- data=sequence,
109
- verify=False,
110
- timeout=300)
111
  response.raise_for_status()
112
  pdb_string = response.content.decode('utf-8')
113
 
@@ -129,103 +124,125 @@ def update(sequence, word1, word2, word3, sequence_length):
129
  st.session_state.show_analyze_button = True
130
 
131
  except requests.exceptions.RequestException as e:
132
- st.error(f"API error: {str(e)}")
133
- st.write("Please try again later.")
134
 
135
  def share_on_twitter(word1, word2, word3, length, plddt):
136
- tweet_text = f"I generated a new protein using: {word1}, {word2}, {word3} | Created with GenPro2"
137
  tweet_url = f"https://twitter.com/intent/tweet?text={urllib.parse.quote(tweet_text)}"
138
  return tweet_url
139
 
140
- # Main Interface
141
- st.title("GenPro2 Protein Generator")
142
- st.markdown("""
143
- ## User Guide:
144
- 1. Enter any three seed words and select sequence length in sidebar
145
- 2. Click 'Generate and Predict'
146
- 3. Analyze your unique protein structure
147
-
148
- **Protein Length Guide:**
149
- - 50-100 aa: Small proteins/peptides
150
- - 100-300 aa: Average protein domains
151
- - 300-500 aa: Larger single-domain proteins
 
 
 
 
 
 
 
 
 
 
152
  """)
153
 
154
- # Sidebar inputs
155
- st.sidebar.subheader("Generate Sequence")
156
- word1 = st.sidebar.text_input("Word 1")
157
- word2 = st.sidebar.text_input("Word 2")
158
- word3 = st.sidebar.text_input("Word 3")
159
- sequence_length = st.sidebar.number_input("Sequence Length",
160
- min_value=50,
161
- max_value=400,
162
- value=100,
163
- step=10)
164
-
165
- if st.sidebar.button('Generate and Predict'):
166
  if word1 and word2 and word3:
167
  sequence = generate_sequence_from_words([word1, word2, word3], sequence_length)
168
  st.session_state.sequence = sequence
169
- st.sidebar.text_area("Generated Sequence", sequence, height=100)
170
- st.sidebar.info("Note: Same inputs will always generate the same sequence.")
171
 
172
- with st.spinner("Predicting structure... This may take a few minutes."):
173
  update(sequence, word1, word2, word3, sequence_length)
174
  else:
175
- st.sidebar.warning("Please enter all three words.")
176
 
177
- # Display results if available
178
  if st.session_state.structure_info:
179
  info = st.session_state.structure_info
180
- st.subheader(f'Predicted structure from: {info["word1"]}, {info["word2"]}, {info["word3"]}')
181
  render_mol(info['pdb_string'])
182
 
183
- st.subheader('Confidence Score (plDDT)')
184
- st.write('plDDT scores range from 0-100%. >70% indicates good confidence.')
185
  plddt_score = int(info["b_value"] * 100)
186
- st.info(f'plDDT score: {plddt_score}%')
187
 
188
- st.subheader("Share Your Protein")
189
- tweet_url = share_on_twitter(info["word1"], info["word2"], info["word3"],
190
- info["sequence_length"], plddt_score)
 
 
 
 
 
 
 
 
 
 
191
 
192
  st.markdown(
193
  f"""
194
  <a href="{tweet_url}" target="_blank" style="
195
  display: inline-block;
196
- background-color: #1DA1F2;
197
- color: white;
 
198
  padding: 0.5em 1em;
199
  text-decoration: none;
200
  border-radius: 8px;
201
  font-weight: bold;
202
  ">
203
- Share on Twitter
204
  </a>
205
  """,
206
  unsafe_allow_html=True
207
- )
 
 
 
 
208
 
209
  col1, col2 = st.columns(2)
210
  with col1:
211
- if st.button('Analyze Protein'):
212
  perform_blast_analysis(st.session_state.sequence)
213
 
214
  with col2:
215
  st.download_button(
216
- label="Download PDB",
217
  data=info['pdb_string'],
218
  file_name='predicted.pdb',
219
  mime='text/plain',
220
  )
221
 
222
  st.markdown("""
223
- **Next Steps:**
224
- - Analyze against protein databases
225
- - Compare with known structures
226
- - Share your unique discovery
227
- """)
228
-
229
- # Requirements for Hugging Face Spaces
230
- st.markdown("---")
231
- st.write("Requirements: Python 3.8+, Streamlit")
 
12
  import time
13
  import urllib.parse
14
 
 
15
  urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
16
 
17
+ st.set_page_config(layout='wide')
18
+ st.sidebar.title('🔮 জেনপ্রো২ - BD')
19
+ st.sidebar.write('জেনপ্রো২ - BD হলো একটি সম্পূর্ণ প্রোটিন সিকোয়েন্স জেনারেটর, স্ট্রাকচার প্রেডিক্টর এবং অ্যানালাইসিস টুল যা [ESMFold](https://esmatlas.com/explore?at=1%2C1%2C21.999999344348925) এবং ESM-2 ল্যাঙ্গুয়েজ মডেল ব্যবহার করে | বিটা ভার্সন ২.৫১')
 
 
 
 
 
 
 
 
 
 
 
20
 
21
  def generate_sequence_from_words(words, length):
22
  seed = ' '.join(words).encode('utf-8')
 
30
  viewer.setStyle({'cartoon': {'color': 'spectrum'}})
31
  viewer.setBackgroundColor('white')
32
  viewer.zoomTo()
33
+ viewer.zoom(0.8) # একটু জুম আউট ভিউ
34
  viewer.spin(True)
35
  viewer.render()
36
 
37
+ # মোবাইলের জন্য রেস্পন্সিভ ডিজাইন
38
  st.markdown("""
39
  <style>
40
  .stmol-container {
 
54
  showmol(viewer, height=400, width=None)
55
 
56
  def perform_blast_analysis(sequence):
57
+ st.subheader('প্রোটিন বিশ্লেষণ')
58
+ with st.spinner("জেনারেট করা প্রোটিন বিশ্লেষণ করা হচ্ছে... এটি কয়েক মিনিট সময় নিতে পারে। অনুগ্রহ করে অপেক্ষা করুন!"):
59
  progress_bar = st.progress(0)
60
  for i in range(100):
61
  progress_bar.progress(i + 1)
62
+ time.sleep(1.9) # বিশ্লেষণ সময়
63
 
64
  try:
65
  record = SeqRecord(Seq(sequence), id='random_protein')
66
  result_handle = NCBIWWW.qblast("blastp", "swissprot", record.seq)
67
+
68
  blast_record = NCBIXML.read(result_handle)
69
 
70
  if blast_record.alignments:
71
+ alignment = blast_record.alignments[0] # শীর্ষ ম্যাচটি নিন
72
+ hsp = alignment.hsps[0] # প্রথম (সেরা) HSP নিন
73
+
74
+ # প্রোটিন নাম এবং অর্গানিজম এক্সট্রাক্ট করুন
75
  title_parts = alignment.title.split('|')
76
  protein_name = title_parts[-1].strip()
77
  organism = title_parts[-2].split('OS=')[-1].split('OX=')[0].strip()
78
+
79
+ # আইডেন্টিটি পার্সেন্টেজ ক্যালকুলেট করুন
80
  identity_percentage = (hsp.identities / hsp.align_length) * 100
81
 
82
+ st.write(f"**শীর্ষ ম্যাচ:** {protein_name}")
83
+ st.write(f"**ইউনিপ্রোট আইডি:** {organism}")
84
+ st.write(f"**সিকোয়েন্স আইডেন্টিটি ম্যাচ:** {identity_percentage:.2f}%")
85
 
86
+ # প্রোটিন ফাংশন ফেচ করুন (যদি থাকে)
87
  if hasattr(alignment, 'description') and alignment.description:
88
+ st.write(f"**সম্ভাব্য ফাংশন:** {alignment.description}")
89
  else:
90
+ st.write("ডাটাবেসে কোন উল্লেখযোগ্য ম্যাচ পাওয়া যায়নি। এটি একটি অনন্য প্রোটি��� সিকোয়েন্স হতে পারে!")
91
 
92
  except Exception as e:
93
+ st.error(f"প্রোটিন বিশ্লেষণ করার সময় একটি ত্রুটি ঘটেছে: {str(e)}")
94
+ st.write("অনুগ্রহ করে পরে আবার চেষ্টা করুন, BLAST সার্ভারে বিলম্ব হতে পারে।")
95
 
96
  def update(sequence, word1, word2, word3, sequence_length):
97
  headers = {
 
99
  }
100
  try:
101
  response = requests.post('https://api.esmatlas.com/foldSequence/v1/pdb/',
102
+ headers=headers,
103
+ data=sequence,
104
+ verify=False,
105
+ timeout=300)
106
  response.raise_for_status()
107
  pdb_string = response.content.decode('utf-8')
108
 
 
124
  st.session_state.show_analyze_button = True
125
 
126
  except requests.exceptions.RequestException as e:
127
+ st.error(f"API কল করার সময় একটি ত্রুটি ঘটেছে: {str(e)}")
128
+ st.write("অনুগ্রহ করে পরে আবার চেষ্টা করুন বা সমস্যা থাকলে সাপোর্টে যোগাযোগ করুন।")
129
 
130
  def share_on_twitter(word1, word2, word3, length, plddt):
131
+ tweet_text = f"আমি শুধু একটি নতুন প্রোটিন আবিষ্কার করেছি সিড শব্দ ব্যবহার করে: {word1} + {word2} + {word3} | প্রোটিন জেনারেট করেছে @PotionBio"
132
  tweet_url = f"https://twitter.com/intent/tweet?text={urllib.parse.quote(tweet_text)}"
133
  return tweet_url
134
 
135
+ # সেশন স্টেট ভেরিয়েবল ইনিশিয়ালাইজ করুন
136
+ if 'sequence' not in st.session_state:
137
+ st.session_state.sequence = None
138
+ if 'show_analyze_button' not in st.session_state:
139
+ st.session_state.show_analyze_button = False
140
+ if 'structure_info' not in st.session_state:
141
+ st.session_state.structure_info = None
142
+
143
+ st.title("📖 ব্যবহারকারী গাইড:")
144
+
145
+ st.sidebar.subheader("শব্দ থেকে সিকোয়েন্স জেনারেট করুন")
146
+ word1 = st.sidebar.text_input("শব্দ ১")
147
+ word2 = st.sidebar.text_input("শব্দ ২")
148
+ word3 = st.sidebar.text_input("শব্দ ৩")
149
+ sequence_length = st.sidebar.number_input("সিকোয়েন্স দৈর্ঘ্য", min_value=50, max_value=400, value=100, step=10)
150
+
151
+ # ব্যবহারকারীদের জন্য তথ্য
152
+ st.info("""
153
+ প্রোটিন দৈর্ঘ্য গাইড:
154
+ - ৫০-১০০ অ্যামিনো অ্যাসিড: ছোট প্রোটিন/পেপটাইড
155
+ - ১০০-৩০০ অ্যামিনো অ্যাসিড: গড় প্রোটিন ডোমেইন
156
+ - ৩০০-৫০০ অ্যামিনো অ্যাসিড: বড় সিঙ্গেল-ডোমেইন প্রোটিন
157
  """)
158
 
159
+ st.markdown("""
160
+ . প্রথমে সাইডবারে আপনার পছন্দের যেকোনো তিনটি সিড শব্দ ইনপুট করুন এবং একটি সিকোয়েন্স দৈর্ঘ্য সিলেক্ট করু��।
161
+ ২. 'জেনারেট এবং প্রেডিক্ট' বাটনে ক্লিক করুন আপনার ইনপুটের ভিত্তিতে একটি অনন্য প্রোটিন সিকোয়েন্স জেনারেট করতে।
162
+ ৩. জেনপ্রো২ তখন আপনার প্রোটিনের ৩ডি স্ট্রাকচার প্রেডিক্ট করে এবং একটি কনফিডেন্স স্কোর প্রদান করে।
163
+ জেনপ্রো২ এবং প্রোটিন সম্পর্কে আরও:
164
+ আপনার অনন্য প্রোটিন নতুন থেরাপিউটিক সম্ভাবনা উন্মোচন বা রোগের মেকানিজম বোঝার চাবিকাঠি হতে পারে। কে জানে? আপনার পরবর্তী জেনারেট করা সিকোয়েন্স একটি যুগান্তকারী আবিষ্কারের দিকে নিয়ে যেতে পারে। কম্পিউটেশনাল প্রোটিন এক্সপ্লোরেশনে আপনার যাত্রা শুরু করুন! [আরও জানুন](https://www.youtube.com/watch?v=KpedmJdrTpY)
165
+ """)
166
+
167
+ if st.sidebar.button('জেনারেট এবং প্রেডিক্ট'):
 
 
 
168
  if word1 and word2 and word3:
169
  sequence = generate_sequence_from_words([word1, word2, word3], sequence_length)
170
  st.session_state.sequence = sequence
171
+ st.sidebar.text_area("জেনারেট করা সিকোয়েন্স", sequence, height=100)
172
+ st.sidebar.info("দ্রষ্টব্য: একই শব্দ এবং সিকোয়েন্স দৈর্ঘ্য সবসময় একই সিকোয়েন্স উৎপন্ন করবে।")
173
 
174
+ with st.spinner("প্রোটিন স্ট্রাকচার প্রেডিক্ট করা হচ্ছে... এটি কয়েক মিনিট সময় নিতে পারে।"):
175
  update(sequence, word1, word2, word3, sequence_length)
176
  else:
177
+ st.sidebar.warning("একটি সিকোয়েন্স জেনারেট করতে অনুগ্রহ করে তিনটি শব্দ ইনপুট করুন।")
178
 
179
+ # স্ট্রাকচার ইনফো ডিসপ্লে করুন যদি থাকে
180
  if st.session_state.structure_info:
181
  info = st.session_state.structure_info
182
+ st.subheader(f'প্রেডিক্ট করা প্রোটিন স্ট্রাকচার সিড ব্যবহার করে: {info["word1"]}, {info["word2"]}, এবং {info["word3"]}')
183
  render_mol(info['pdb_string'])
184
 
185
+ st.subheader('plDDT কনফিডেন্স স্কোর')
186
+ st.write('plDDT হলো প্রোটিন ফোল্ডিং প্রেডিকশনের কনফিডেন্স লেভেল স্কোর করার জন্য একটি বেঞ্চমার্ক যা ০-১০০% স্কেলে কাজ করে। ৭০% বা তার বেশি ভালো!')
187
  plddt_score = int(info["b_value"] * 100)
188
+ st.info(f'আপনার plDDT স্কোর হলো: {plddt_score}%')
189
 
190
+ st.subheader("আপনার অনন্য প্রোটিন X(টুইটার) এ শেয়ার করুন")
191
+
192
+ st.markdown("""
193
+ <div style='background-color: #00000; padding: 10px; border-radius: 5px; font-size: 0.8em;'>
194
+ <ol>
195
+ <li>উপরে আপনার প্রোটিন স্ট্রাকচারের একটি স্ক্রিনশট নিন।</li>
196
+ <li>নিচের 'শেয়ার রেজাল্টস' লিঙ্কে ক্লিক করুন আপনার প্রোটিনের সিড-শব্দ সহ একটি প্রি-ফিল্ড পোস্ট খুলতে।</li>
197
+ <li>আপনার প্রোটিন ইমে��� বা সিকোয়েন্স আপলোড করুন এবং পোস্ট করুন!</li>
198
+ </ol>
199
+ </div>
200
+ """, unsafe_allow_html=True)
201
+
202
+ tweet_url = share_on_twitter(info["word1"], info["word2"], info["word3"], info["sequence_length"], plddt_score)
203
 
204
  st.markdown(
205
  f"""
206
  <a href="{tweet_url}" target="_blank" style="
207
  display: inline-block;
208
+ background-color: white;
209
+ color: black;
210
+ border: 1px solid black;
211
  padding: 0.5em 1em;
212
  text-decoration: none;
213
  border-radius: 8px;
214
  font-weight: bold;
215
  ">
216
+ প্রোটিন শেয়ার করুন
217
  </a>
218
  """,
219
  unsafe_allow_html=True
220
+ )
221
+
222
+ st.markdown("""
223
+ ## পরবর্তী করণীয়:
224
+ """)
225
 
226
  col1, col2 = st.columns(2)
227
  with col1:
228
+ if st.button('প্রোটিন বিশ্লেষণ করুন'):
229
  perform_blast_analysis(st.session_state.sequence)
230
 
231
  with col2:
232
  st.download_button(
233
+ label="PDB ডাউনলোড করুন",
234
  data=info['pdb_string'],
235
  file_name='predicted.pdb',
236
  mime='text/plain',
237
  )
238
 
239
  st.markdown("""
240
+ যদি আপনি একটি আকর্ষণীয় প্রোটিন সিকোয়েন্স এবং স্ট্রাকচার আবিষ্কার করেন, আপনি এটি আরও গভীরভাবে এক্সপ্লোর করতে পারেন:
241
+
242
+ ১. 'প্রোটিন বিশ্লেষণ করুন' বাটনে ক্লিক করুন [BLAST](https://blast.ncbi.nlm.nih.gov/Blast.cgi?PROGRAM=blastp&PAGE_TYPE=BlastSearch&LINK_LOC=blasthome) প্রোটিন ডাটাবেস সার্চ করতে এবং দেখুন আপনার প্রোটিন কোন পরিচিত সিকোয়েন্সের সাথে মিলে কিনা। সিকোয়েন্স আইডেন্টিটি দেখাবে আপনার সিকোয়েন্স কতটা কাছাকাছি ম্যাচ করে। *দ্রষ্টব্য এটি কয়েক মিনিট সময় নিতে পারে
243
+ ২. আপনার প্রোটিন ডাটা ডাউনলোড করুন এবং [প্রোটিন ডাটা ব্যাংক (PDB)](https://www.rcsb.org/) ভিজিট করুন পরিচিত প্রোটিন স্ট্রাকচারের সাথে আপনার প্রোটিন স্ট্রাকচার ম্যাচ করতে।
244
+ ৩. যদি আপনি মনে করেন আপনি একটি অনন্য এবং দরকারী প্রোটিন আবিষ্কার করেছেন, সোশ্যাল মিডিয়াতে এটি শেয়ার করুন!
245
+
246
+ **মনে রাখবেন, এই ফোল্ডিং একটি র্যান্ডমলি জেনারেট করা সিকোয়েন্সের উপর ভিত্তি করে। ফলাফলগুলি সতর্কতার সাথে ব্যাখ্যা করুন।
247
+ প্রোটিন সিকোয়েন্স এক্সপ্লোর করার আনন্দ নিন!
248
+ """)