Update app.py
Browse files
app.py
CHANGED
|
@@ -6,6 +6,10 @@ import biotite.structure.io as bsio
|
|
| 6 |
import random
|
| 7 |
import hashlib
|
| 8 |
import urllib3
|
|
|
|
|
|
|
|
|
|
|
|
|
| 9 |
|
| 10 |
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
| 11 |
|
|
@@ -31,6 +35,52 @@ def render_mol(pdb):
|
|
| 31 |
pdbview.spin(True)
|
| 32 |
showmol(pdbview, height = 500,width=800)
|
| 33 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 34 |
# ESMfold
|
| 35 |
def update(sequence, word1, word2, word3, sequence_length):
|
| 36 |
headers = {
|
|
@@ -66,6 +116,9 @@ def update(sequence, word1, word2, word3, sequence_length):
|
|
| 66 |
file_name='predicted.pdb',
|
| 67 |
mime='text/plain',
|
| 68 |
)
|
|
|
|
|
|
|
|
|
|
| 69 |
except requests.exceptions.RequestException as e:
|
| 70 |
st.error(f"An error occurred while calling the API: {str(e)}")
|
| 71 |
st.write("Please try again later or contact support if the issue persists.")
|
|
@@ -100,8 +153,6 @@ If you find interesting results from the sequence folding, you can explore furth
|
|
| 100 |
2. Visit the [Protein Data Bank (PDB)](https://www.rcsb.org/) for known protein structures.
|
| 101 |
3. Compare your folded structure with known functional proteins by downloading your results.
|
| 102 |
4. Read about similar proteins to gain insights into potential functions.
|
| 103 |
-
|
| 104 |
-
|
| 105 |
**Remember, this folding is based on randomly generated sequences. Interpret the results with caution.
|
| 106 |
Enjoy exploring the world of protein sequences! Share your high-confidence protein images with us on X [*@WandsAI*](https://x.com/wandsai)!
|
| 107 |
""")
|
|
|
|
| 6 |
import random
|
| 7 |
import hashlib
|
| 8 |
import urllib3
|
| 9 |
+
from Bio.Blast import NCBIWWW, NCBIXML
|
| 10 |
+
from Bio.Seq import Seq
|
| 11 |
+
from Bio.SeqRecord import SeqRecord
|
| 12 |
+
import time
|
| 13 |
|
| 14 |
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
| 15 |
|
|
|
|
| 35 |
pdbview.spin(True)
|
| 36 |
showmol(pdbview, height = 500,width=800)
|
| 37 |
|
| 38 |
+
# BLAST analysis function
|
| 39 |
+
def perform_blast_analysis(sequence):
|
| 40 |
+
st.subheader('BLAST Analysis')
|
| 41 |
+
with st.spinner("Analyzing generated protein... This may take a few minutes."):
|
| 42 |
+
progress_bar = st.progress(0)
|
| 43 |
+
for i in range(100):
|
| 44 |
+
progress_bar.progress(i + 1)
|
| 45 |
+
if i == 99: # Simulate longer process at the end
|
| 46 |
+
time.sleep(2)
|
| 47 |
+
|
| 48 |
+
try:
|
| 49 |
+
record = SeqRecord(Seq(sequence), id='random_protein')
|
| 50 |
+
result_handle = NCBIWWW.qblast("blastp", "swissprot", record.seq)
|
| 51 |
+
|
| 52 |
+
blast_record = NCBIXML.read(result_handle)
|
| 53 |
+
|
| 54 |
+
st.write('Top BLAST Match:')
|
| 55 |
+
if blast_record.alignments:
|
| 56 |
+
alignment = blast_record.alignments[0] # Get the top hit
|
| 57 |
+
hsp = alignment.hsps[0] # Get the first (best) HSP
|
| 58 |
+
|
| 59 |
+
# Extract protein name and organism
|
| 60 |
+
title_parts = alignment.title.split('|')
|
| 61 |
+
protein_name = title_parts[-1].strip()
|
| 62 |
+
organism = title_parts[-2].split('OS=')[-1].split('OX=')[0].strip()
|
| 63 |
+
|
| 64 |
+
# Calculate identity percentage
|
| 65 |
+
identity_percentage = (hsp.identities / alignment.length) * 100
|
| 66 |
+
|
| 67 |
+
st.write(f"**Protein:** {protein_name}")
|
| 68 |
+
st.write(f"**Organism:** {organism}")
|
| 69 |
+
st.write(f"**Sequence Identity:** {identity_percentage:.2f}%")
|
| 70 |
+
|
| 71 |
+
# Fetch protein function (if available)
|
| 72 |
+
if hasattr(alignment, 'description') and alignment.description:
|
| 73 |
+
st.write(f"**Possible Function:** {alignment.description}")
|
| 74 |
+
|
| 75 |
+
# Link to BLAST
|
| 76 |
+
blast_link = f"https://blast.ncbi.nlm.nih.gov/Blast.cgi?PROGRAM=blastp&PAGE_TYPE=BlastSearch&LINK_LOC=blasthome"
|
| 77 |
+
st.markdown(f"[View full BLAST results]({blast_link})")
|
| 78 |
+
else:
|
| 79 |
+
st.write("No significant matches found.")
|
| 80 |
+
except Exception as e:
|
| 81 |
+
st.error(f"An error occurred during BLAST analysis: {str(e)}")
|
| 82 |
+
st.write("Please try again later or contact support if the issue persists.")
|
| 83 |
+
|
| 84 |
# ESMfold
|
| 85 |
def update(sequence, word1, word2, word3, sequence_length):
|
| 86 |
headers = {
|
|
|
|
| 116 |
file_name='predicted.pdb',
|
| 117 |
mime='text/plain',
|
| 118 |
)
|
| 119 |
+
|
| 120 |
+
# Perform BLAST analysis
|
| 121 |
+
perform_blast_analysis(sequence)
|
| 122 |
except requests.exceptions.RequestException as e:
|
| 123 |
st.error(f"An error occurred while calling the API: {str(e)}")
|
| 124 |
st.write("Please try again later or contact support if the issue persists.")
|
|
|
|
| 153 |
2. Visit the [Protein Data Bank (PDB)](https://www.rcsb.org/) for known protein structures.
|
| 154 |
3. Compare your folded structure with known functional proteins by downloading your results.
|
| 155 |
4. Read about similar proteins to gain insights into potential functions.
|
|
|
|
|
|
|
| 156 |
**Remember, this folding is based on randomly generated sequences. Interpret the results with caution.
|
| 157 |
Enjoy exploring the world of protein sequences! Share your high-confidence protein images with us on X [*@WandsAI*](https://x.com/wandsai)!
|
| 158 |
""")
|