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(""" """, 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("""
  1. āωāĻĒāϰ⧇ āφāĻĒāύāĻžāϰ āĻĒā§āϰ⧋āϟāĻŋāύ āĻ¸ā§āĻŸā§āϰāĻžāĻ•āϚāĻžāϰ⧇āϰ āĻāĻ•āϟāĻŋ āĻ¸ā§āĻ•ā§āϰāĻŋāύāĻļāϟ āύāĻŋāύāĨ¤
  2. āύāĻŋāĻšā§‡āϰ 'āĻļ⧇āϝāĻŧāĻžāϰ āϰ⧇āϜāĻžāĻ˛ā§āϟāϏ' āϞāĻŋāĻ™ā§āϕ⧇ āĻ•ā§āϞāĻŋāĻ• āĻ•āϰ⧁āύ āφāĻĒāύāĻžāϰ āĻĒā§āϰ⧋āϟāĻŋāύ⧇āϰ āϏāĻŋāĻĄ-āĻļāĻŦā§āĻĻ āϏāĻš āĻāĻ•āϟāĻŋ āĻĒā§āϰāĻŋ-āĻĢāĻŋāĻ˛ā§āĻĄ āĻĒā§‹āĻ¸ā§āϟ āϖ⧁āϞāϤ⧇āĨ¤
  3. āφāĻĒāύāĻžāϰ āĻĒā§āϰ⧋āϟāĻŋāύ āχāĻŽā§‡āϜ āĻŦāĻž āϏāĻŋāϕ⧋āϝāĻŧ⧇āĻ¨ā§āϏ āφāĻĒāϞ⧋āĻĄ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āĻĒā§‹āĻ¸ā§āϟ āĻ•āϰ⧁āύ!
""", unsafe_allow_html=True) tweet_url = share_on_twitter(info["word1"], info["word2"], info["word3"], info["sequence_length"], plddt_score) st.markdown( f""" āĻĒā§āϰ⧋āϟāĻŋāύ āĻļ⧇āϝāĻŧāĻžāϰ āĻ•āϰ⧁āύ """, 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/) āĻ­āĻŋāϜāĻŋāϟ āĻ•āϰ⧁āύ āĻĒāϰāĻŋāϚāĻŋāϤ āĻĒā§āϰ⧋āϟāĻŋāύ āĻ¸ā§āĻŸā§āϰāĻžāĻ•āϚāĻžāϰ⧇āϰ āϏāĻžāĻĨ⧇ āφāĻĒāύāĻžāϰ āĻĒā§āϰ⧋āϟāĻŋāύ āĻ¸ā§āĻŸā§āϰāĻžāĻ•āϚāĻžāϰ āĻŽā§āϝāĻžāϚ āĻ•āϰāϤ⧇āĨ¤ ā§Š. āϝāĻĻāĻŋ āφāĻĒāύāĻŋ āĻŽāύ⧇ āĻ•āϰ⧇āύ āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ āĻ…āύāĻ¨ā§āϝ āĻāĻŦāĻ‚ āĻĻāϰāĻ•āĻžāϰ⧀ āĻĒā§āϰ⧋āϟāĻŋāύ āφāĻŦāĻŋāĻˇā§āĻ•āĻžāϰ āĻ•āϰ⧇āϛ⧇āύ, āϏ⧋āĻļā§āϝāĻžāϞ āĻŽāĻŋāĻĄāĻŋāϝāĻŧāĻžāϤ⧇ āĻāϟāĻŋ āĻļ⧇āϝāĻŧāĻžāϰ āĻ•āϰ⧁āύ! **āĻŽāύ⧇ āϰāĻžāĻ–āĻŦ⧇āύ, āĻāχ āĻĢā§‹āĻ˛ā§āĻĄāĻŋāĻ‚ āĻāĻ•āϟāĻŋ āĻ°ā§āϝāĻžāĻ¨ā§āĻĄāĻŽāϞāĻŋ āĻœā§‡āύāĻžāϰ⧇āϟ āĻ•āϰāĻž āϏāĻŋāϕ⧋āϝāĻŧ⧇āĻ¨ā§āϏ⧇āϰ āωāĻĒāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇āĨ¤ āĻĢāϞāĻžāĻĢāϞāϗ⧁āϞāĻŋ āϏāϤāĻ°ā§āĻ•āϤāĻžāϰ āϏāĻžāĻĨ⧇ āĻŦā§āϝāĻžāĻ–ā§āϝāĻž āĻ•āϰ⧁āύāĨ¤ āĻĒā§āϰ⧋āϟāĻŋāύ āϏāĻŋāϕ⧋āϝāĻŧ⧇āĻ¨ā§āϏ āĻāĻ•ā§āϏāĻĒā§āϞ⧋āϰ āĻ•āϰāĻžāϰ āφāύāĻ¨ā§āĻĻ āύāĻŋāύ! """)