Pipeline de prédiction de structure MSA
Prédisez des structures protéiques avec une haute précision en chaînant deux NIMs BioNeMo :
Étape 1 : MSA-Search → Étape 2 : OpenFold3
(Recherche d'homologs) (Prédiction de structure avec MSA)
Vue d'ensemble
Pourquoi chaîner ces NIMs ?
- MSA-Search trouve les homologs évolutifs dans les bases de données UniRef30 et ColabFold en utilisant MMSeqs2 accéléré par GPU. L'alignement résultant fournit des informations évolutives cruciales.
- OpenFold3 utilise le MSA pour améliorer la précision de la prédiction de structure — notamment pour les séquences dont aucun homolog proche n'existe dans la PDB.
- Exécuter MSA-Search en premier signifie qu'OpenFold3 obtient le contexte évolutif complet plutôt qu'une prédiction sur une seule séquence.
Avant de commencer
Confirmez avec l'utilisateur :
- Séquence de requête : séquence d'acides aminés à prédire
- Profondeur MSA : nombre de séquences à récupérer (par défaut 500 ; plus = plus lent mais plus de contexte)
- Mode API : hébergé ou Docker local ?
Remarque : le MSA-Search local nécessite 1,4 TB de stockage de base de données — fortement recommandé en mode hébergé sauf si l'utilisateur dispose de cette infrastructure.
Pour Docker local, ne supposez pas que MSA-Search et OpenFold3 sont tous deux sur
localhost:8000 simultanément. Exécutez un conteneur à la fois et transmettez le
fichier A3M, ou démarrez chaque NIM sur un port d'hôte distinct et définissez les URLs explicitement.
Étape 1 : Rechercher le MSA avec MSA-Search
import requests, json, os
from pathlib import Path
NGC_API_KEY = os.getenv("NGC_API_KEY")
HOSTED = True
query_sequence = "<YOUR_PROTEIN_SEQUENCE>"
if HOSTED:
msa_url = "https://health.api.nvidia.com/v1/biology/colabfold/msa-search/predict"
headers = {"Content-Type": "application/json",
"Authorization": f"Bearer {NGC_API_KEY}"}
else:
msa_url = "http://localhost:8000/biology/colabfold/msa-search/predict"
headers = {"Content-Type": "application/json"}
payload = {
"sequence": query_sequence,
"databases": ["Uniref30_2302", "colabfold_envdb_202108"],
"e_value": 0.0001,
"output_alignment_formats": ["a3m"],
}
r = requests.post(msa_url, headers=headers, json=payload)
r.raise_for_status()
msa_result = r.json()
# Extract the A3M alignment
a3m_alignment = msa_result["alignments"]["Uniref30_2302"]["a3m"]["alignment"]
# Save for reference
with open("query_msa.a3m", "w") as f:
f.write(a3m_alignment)
# Count sequences in alignment
n_seqs = a3m_alignment.count(">")
print(f"Step 1 complete: found {n_seqs} homologous sequences")
print(f"MSA saved to query_msa.a3m")
Étape 2 : Prédire la structure avec OpenFold3
Passez le MSA directement dans le champ msa d'OpenFold3 :
if HOSTED:
of3_url = "https://health.api.nvidia.com/v1/biology/openfold/openfold3/predict"
else:
of3_url = "http://localhost:8000/biology/openfold/openfold3/predict"
# Build the OpenFold3 MSA structure from the retrieved alignment
msa_data = {
"uniref30": {
"a3m": {
"alignment": a3m_alignment,
"format": "a3m"
}
}
}
# Optionally also include colabfold_envdb alignment if requested
# env_alignment = msa_result["alignments"]["colabfold_envdb"]["a3m"]["alignment"]
# msa_data["colabfold_env"] = {"a3m": {"alignment": env_alignment, "format": "a3m"}}
payload = {
"inputs": [{
"input_id": "prediction_with_msa",
"output_format": "pdb",
"molecules": [
{
"type": "protein",
"sequence": query_sequence,
"diffusion_samples": 1,
"msa": msa_data
}
]
}]
}
r = requests.post(of3_url, headers=headers, json=payload, timeout=300)
r.raise_for_status()
result = r.json()
output = result["outputs"][0]
for i, sample in enumerate(output["structures_with_scores"]):
fmt = sample["format"]
filename = f"predicted_structure_{i+1}.{fmt}"
with open(filename, "w") as f:
f.write(sample["structure"])
print(f"\nStep 2 complete: {filename} saved")
print(f" Confidence: {sample['confidence_score']:.4f}")
print(f" pLDDT: {sample['complex_plddt_score']:.4f}")
print(f" pTM: {sample['ptm_score']:.4f}")
Comparer la prédiction sur une seule séquence vs celle informée par MSA
Si l'utilisateur souhaite voir l'impact du MSA, exécutez OpenFold3 deux fois — une fois avec le MSA complet et une fois avec uniquement la séquence de requête comme alignement minimal :
# Minimal MSA (single sequence — same as no MSA context):
minimal_msa = {
"main": {
"a3m": {
"alignment": f">query\n{query_sequence}",
"format": "a3m"
}
}
}
Un MSA plus grand et de meilleure qualité produit généralement un pLDDT plus élevé et un pDE plus bas, particulièrement pour les protéines avec de nombreux homologs connus.
Pour les complexes protéiques
Utilisez le endpoint /paired/predict de MSA-Search pour obtenir des alignements appairés pour les complexes multi-chaînes, puis passez l'alignement de chaque chaîne dans les champs msa et paired_msa correspondants de la molécule :
# Paired MSA search endpoint for complexes:
msa_paired_url = "https://health.api.nvidia.com/v1/biology/colabfold/msa-search/paired/predict"
paired_payload = {
"sequences": [chain_A_sequence, chain_B_sequence],
"e_value": 0.0001,
}
Référence rapide — dépendances de skill
| Étape | Skill | Endpoint clé |
|---|---|---|
| Recherche MSA | msa-search-nim |
/biology/colabfold/msa-search/predict |
| Prédiction de structure | openfold3-nim |
/biology/openfold/openfold3/predict |