Update app.py
Browse files
app.py
CHANGED
|
@@ -38,9 +38,7 @@ def load_keras(name):
|
|
| 38 |
|
| 39 |
@st.cache_resource
|
| 40 |
def load_hf_encoder(repo_id, subfolder=None, base_tok=None):
|
| 41 |
-
"""
|
| 42 |
-
Carrega tokenizer + encoder HF (converte TF-weights p/ PyTorch on-the-fly).
|
| 43 |
-
"""
|
| 44 |
if base_tok is None:
|
| 45 |
base_tok = repo_id
|
| 46 |
tok = AutoTokenizer.from_pretrained(base_tok, do_lower_case=False)
|
|
@@ -53,14 +51,12 @@ def load_hf_encoder(repo_id, subfolder=None, base_tok=None):
|
|
| 53 |
return tok, mdl
|
| 54 |
|
| 55 |
def embed_seq(model_ref, seq, chunk):
|
| 56 |
-
"""
|
| 57 |
-
|
| 58 |
-
"""
|
| 59 |
-
if isinstance(model_ref, tuple): # ProtBERT fine-tuned
|
| 60 |
repo_id, subf = model_ref
|
| 61 |
tok, mdl = load_hf_encoder(repo_id, subfolder=subf,
|
| 62 |
base_tok="Rostlab/prot_bert")
|
| 63 |
-
else:
|
| 64 |
tok, mdl = load_hf_encoder(model_ref)
|
| 65 |
|
| 66 |
parts = [seq[i:i+chunk] for i in range(0, len(seq), chunk)]
|
|
@@ -112,31 +108,34 @@ if os.path.exists("logo.png"):
|
|
| 112 |
|
| 113 |
st.title("Predição de Funções Moleculares de Proteínas (GO:MF)")
|
| 114 |
|
| 115 |
-
fasta_input
|
| 116 |
-
predict_clicked
|
| 117 |
|
| 118 |
# ——————————————————— UTILITÁRIOS ——————————————————— #
|
| 119 |
def parse_fasta_multiple(text):
|
| 120 |
"""Extrai [(header, seq)] de texto FASTA (bloco inicial sem '>' suportado)."""
|
| 121 |
-
out
|
| 122 |
-
for i, blk in enumerate(
|
| 123 |
if not blk.strip():
|
| 124 |
continue
|
| 125 |
-
lines
|
| 126 |
-
if i
|
| 127 |
-
|
| 128 |
-
else:
|
| 129 |
-
header, seq = f"Seq_{i+1}", "".join(lines).replace(" ", "").upper()
|
| 130 |
if seq:
|
| 131 |
out.append((header, seq))
|
| 132 |
return out
|
| 133 |
|
| 134 |
def clean_definition(defin: str) -> str:
|
| 135 |
-
"""
|
| 136 |
-
|
| 137 |
-
|
| 138 |
-
|
| 139 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 140 |
|
| 141 |
def go_link(go_id, name=""):
|
| 142 |
url = f"https://www.ebi.ac.uk/QuickGO/term/{go_id}"
|
|
@@ -201,7 +200,7 @@ if predict_clicked:
|
|
| 201 |
|
| 202 |
mostrar(header, y_ens)
|
| 203 |
|
| 204 |
-
# ——————————————————— LISTA COMPLETA
|
| 205 |
with st.expander("Mostrar lista completa dos 597 GO terms possíveis", expanded=False):
|
| 206 |
cols = st.columns(3)
|
| 207 |
for i, go_id in enumerate(GO):
|
|
|
|
| 38 |
|
| 39 |
@st.cache_resource
|
| 40 |
def load_hf_encoder(repo_id, subfolder=None, base_tok=None):
|
| 41 |
+
"""Carrega tokenizer + encoder; converte TF-weights → PyTorch on-the-fly."""
|
|
|
|
|
|
|
| 42 |
if base_tok is None:
|
| 43 |
base_tok = repo_id
|
| 44 |
tok = AutoTokenizer.from_pretrained(base_tok, do_lower_case=False)
|
|
|
|
| 51 |
return tok, mdl
|
| 52 |
|
| 53 |
def embed_seq(model_ref, seq, chunk):
|
| 54 |
+
"""Devolve embedding CLS médio; corta seq. longa em chunks se preciso."""
|
| 55 |
+
if isinstance(model_ref, tuple): # ProtBERT fine-tuned
|
|
|
|
|
|
|
| 56 |
repo_id, subf = model_ref
|
| 57 |
tok, mdl = load_hf_encoder(repo_id, subfolder=subf,
|
| 58 |
base_tok="Rostlab/prot_bert")
|
| 59 |
+
else: # modelo base ESM-2
|
| 60 |
tok, mdl = load_hf_encoder(model_ref)
|
| 61 |
|
| 62 |
parts = [seq[i:i+chunk] for i in range(0, len(seq), chunk)]
|
|
|
|
| 108 |
|
| 109 |
st.title("Predição de Funções Moleculares de Proteínas (GO:MF)")
|
| 110 |
|
| 111 |
+
fasta_input = st.text_area("Insere uma ou mais sequências FASTA:", height=300)
|
| 112 |
+
predict_clicked = st.button("Prever GO terms")
|
| 113 |
|
| 114 |
# ——————————————————— UTILITÁRIOS ——————————————————— #
|
| 115 |
def parse_fasta_multiple(text):
|
| 116 |
"""Extrai [(header, seq)] de texto FASTA (bloco inicial sem '>' suportado)."""
|
| 117 |
+
out = []
|
| 118 |
+
for i, blk in enumerate(text.strip().split(">")):
|
| 119 |
if not blk.strip():
|
| 120 |
continue
|
| 121 |
+
lines = blk.strip().splitlines()
|
| 122 |
+
header = lines[0].strip() if i else f"Seq_{i+1}"
|
| 123 |
+
seq = "".join(lines[1:] if i else lines).replace(" ", "").upper()
|
|
|
|
|
|
|
| 124 |
if seq:
|
| 125 |
out.append((header, seq))
|
| 126 |
return out
|
| 127 |
|
| 128 |
def clean_definition(defin: str) -> str:
|
| 129 |
+
"""
|
| 130 |
+
Retorna apenas o texto dentro das primeiras aspas.
|
| 131 |
+
Se não houver aspas, devolve texto antes do primeiro '['.
|
| 132 |
+
"""
|
| 133 |
+
if not defin:
|
| 134 |
+
return ""
|
| 135 |
+
m = re.search(r'"([^"]+)"', defin)
|
| 136 |
+
if m:
|
| 137 |
+
return m.group(1).strip()
|
| 138 |
+
return defin.split("[", 1)[0].strip()
|
| 139 |
|
| 140 |
def go_link(go_id, name=""):
|
| 141 |
url = f"https://www.ebi.ac.uk/QuickGO/term/{go_id}"
|
|
|
|
| 200 |
|
| 201 |
mostrar(header, y_ens)
|
| 202 |
|
| 203 |
+
# ——————————————————— LISTA COMPLETA ——————————————————— #
|
| 204 |
with st.expander("Mostrar lista completa dos 597 GO terms possíveis", expanded=False):
|
| 205 |
cols = st.columns(3)
|
| 206 |
for i, go_id in enumerate(GO):
|