Communitygithub.com

molecular-dynamics

Ejecuta y analiza simulaciones de dinámica molecular con OpenMM y MDAnalysis. Configura sistemas de proteínas/pequeñas moléculas, define campos de fuerza, ejecuta minimización de energía y MD de producción, analiza trayectorias (RMSD, RMSF, mapas de contacto, superficies de energía libre). Para biología estructural, unión de fármacos y biofísica.

¿Qué es molecular-dynamics?

Esta habilidad proporciona un flujo de trabajo completo para simulaciones de dinámica molecular (MD) utilizando OpenMM y MDAnalysis. OpenMM es un motor de simulación de alto rendimiento con soporte de GPU, ideal para ejecutar simulaciones de proteínas, sistemas de membrana y complejos proteína-ligando. La habilidad cubre todo el proceso: desde la preparación del sistema (carga de PDB, adición de hidrógenos, solvatación, y aplicación de campos de fuerza) hasta la minimización de energía, equilibración NVT y NPT, y ejecución de producción. Por su parte, MDAnalysis permite analizar las trayectorias resultantes, calculando RMSD, RMSF, mapas de contacto y flexibilidad por residuo. La habilidad incluye ejemplos prácticos de código en Python para cada etapa, guías de selección de campos de fuerza (AMBER14, CHARMM36m, ff19SB) y herramientas de preparación como PDBFixer y OpenFF. Está dirigida a investigadores en biología estructural, diseño de fármacos y biofísica, y es compatible con los principales paquetes de MD. La documentación incluye mejores prácticas como minimización previa, equilibrado gradual, uso de GPU, paso de tiempo de 2 fs y condiciones de frontera periódicas.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/K-Dense-AI/scientific-agent-skills/tree/main/skills/molecular-dynamics

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Dinámica Molecular

Descripción General

La simulación de dinámica molecular (MD) modela computacionalmente la evolución temporal de sistemas moleculares integrando las ecuaciones de movimiento de Newton. Esta habilidad cubre dos herramientas complementarias:

  • OpenMM (https://openmm.org/): Motor de simulación MD de alto rendimiento con soporte de GPU, API en Python y soporte flexible de campos de fuerza.
  • MDAnalysis (https://mdanalysis.org/): Librería de Python para leer, escribir y analizar trayectorias MD de todos los principales paquetes de simulación.

Instalación:

conda install -c conda-forge openmm mdanalysis nglview
# o
uv pip install openmm mdanalysis

Cuándo Usar Esta Habilidad

Usa dinámica molecular cuando:

  • Análisis de estabilidad de proteínas: ¿Cómo afecta una mutación a la dinámica de la proteína?
  • Simulaciones de unión de fármacos: Caracteriza el modo de unión y el tiempo de residencia de un ligando.
  • Muestreo conformacional: Explora la flexibilidad de proteínas y cambios conformacionales.
  • Interacción proteína-proteína: Modela la dinámica de la interfaz y la energética de unión.
  • Análisis RMSD/RMSF: Cuantifica fluctuaciones estructurales a partir de una estructura de referencia.
  • Estimación de energía libre: Calcula la energía libre de unión o la energía libre conformacional.
  • Simulaciones de membrana: Modela proteínas en bicapas lipídicas.
  • Proteínas intrínsecamente desordenadas: Estudia conjuntos conformacionales de IDR.

Flujo de Trabajo Principal: Simulación con OpenMM

1. Preparación del Sistema

from openmm.app import *
from openmm import *
from openmm.unit import *
import sys

def preparar_sistema_desde_pdb(archivo_pdb, nombre_campo_fuerza="amber14-all.xml",
                              modelo_agua="amber14/tip3pfb.xml"):
    """
    Prepara un sistema OpenMM a partir de un archivo PDB.

    Args:
        archivo_pdb: Ruta al archivo PDB limpio (usa PDBFixer para archivos PDB crudos).
        nombre_campo_fuerza: Archivo XML del campo de fuerza.
        modelo_agua: Archivo XML del modelo de agua.

    Returns:
        pdb, campo_de_fuerza, sistema, topología
    """
    # Cargar PDB
    pdb = PDBFile(archivo_pdb)

    # Cargar campo de fuerza
    forcefield = ForceField(nombre_campo_fuerza, modelo_agua)

    # Agregar hidrógenos y solvatar
    modeller = Modeller(pdb.topology, pdb.positions)
    modeller.addHydrogens(forcefield)

    # Agregar caja de solvente (relleno de 10 Å, NaCl 150 mM)
    modeller.addSolvent(
        forcefield,
        model='tip3p',
        padding=10*angstroms,
        ionicStrength=0.15*molar
    )

    print(f"Sistema: {modeller.topology.getNumAtoms()} átomos, "
          f"{modeller.topology.getNumResidues()} residuos")

    # Crear sistema
    system = forcefield.createSystem(
        modeller.topology,
        nonbondedMethod=PME,         # Malla de partículas Ewald para electrostática de largo alcance
        nonbondedCutoff=1.0*nanometer,
        constraints=HBonds,           # Restringir enlaces de hidrógeno (permite paso de tiempo de 2 fs)
        rigidWater=True,
        ewaldErrorTolerance=0.0005
    )

    return modeller, system

2. Minimización de Energía

from openmm.app import *
from openmm import *
from openmm.unit import *

def minimizar_energia(modeller, system, salida_pdb="minimized.pdb",
                     max_iteraciones=1000, tolerancia=10.0):
    """
    Minimiza energéticamente el sistema para eliminar choques estéricos.

    Args:
        modeller: Objeto Modeller con topología y posiciones.
        system: Sistema OpenMM.
        salida_pdb: Ruta para guardar la estructura minimizada.
        max_iteraciones: Pasos máximos de minimización.
        tolerancia: Criterio de convergencia en kJ/mol/nm.

    Returns:
        objeto simulation con posiciones minimizadas.
    """
    # Configurar integrador (no importa para la minimización)
    integrator = LangevinMiddleIntegrator(300*kelvin, 1/picosecond, 0.004*picoseconds)

    # Crear simulación
    # Usar GPU si está disponible (CUDA o OpenCL), de lo contrario usar CPU
    try:
        platform = Platform.getPlatformByName('CUDA')
        properties = {'DeviceIndex': '0', 'Precision': 'mixed'}
    except Exception:
        try:
            platform = Platform.getPlatformByName('OpenCL')
            properties = {}
        except Exception:
            platform = Platform.getPlatformByName('CPU')
            properties = {}

    simulation = Simulation(
        modeller.topology, system, integrator,
        platform, properties
    )
    simulation.context.setPositions(modeller.positions)

    # Verificar energía inicial
    state = simulation.context.getState(getEnergy=True)
    print(f"Energía inicial: {state.getPotentialEnergy()}")

    # Minimizar
    simulation.minimizeEnergy(
        tolerance=tolerancia*kilojoules_per_mole/nanometer,
        maxIterations=max_iteraciones
    )

    state = simulation.context.getState(getEnergy=True, getPositions=True)
    print(f"Energía minimizada: {state.getPotentialEnergy()}")

    # Guardar estructura minimizada
    with open(salida_pdb, 'w') as f:
        PDBFile.writeFile(simulation.topology, state.getPositions(), f)

    return simulation

3. Equilibración NVT

from openmm.app import *
from openmm import *
from openmm.unit import *

def ejecutar_equilibracion_nvt(simulation, n_pasos=50000, temperatura=300,
                            intervalo_reporte=1000, prefijo_salida="nvt"):
    """
    Equilibración NVT: N, V, T constantes.
    Equilibra las velocidades a la temperatura objetivo.

    Args:
        simulation: Simulación OpenMM (después de minimización).
        n_pasos: Número de pasos MD (50000 × 2 fs = 100 ps).
        temperatura: Temperatura en Kelvin.
        intervalo_reporte: Pasos entre reportes de datos.
        prefijo_salida: Prefijo de archivos para trayectoria y registro.
    """
    # Agregar restricciones de posición para el esqueleto durante NVT
    # (Opcional: restringir átomos pesados)

    # Fijar temperatura
    simulation.context.setVelocitiesToTemperature(temperatura*kelvin)

    # Agregar reporters
    simulation.reporters = []

    # Archivo de registro
    simulation.reporters.append(
        StateDataReporter(
            f"{prefijo_salida}_log.txt",
            intervalo_reporte,
            step=True,
            potentialEnergy=True,
            kineticEnergy=True,
            temperature=True,
            volume=True,
            speed=True
        )
    )

    # Trayectoria DCD (formato binario compacto)
    simulation.reporters.append(
        DCDReporter(f"{prefijo_salida}_traj.dcd", intervalo_reporte)
    )

    print(f"Ejecutando equilibración NVT: {n_pasos} pasos ({n_pasos*2/1000:.1f} ps)")
    simulation.step(n_pasos)
    print("Equilibración NVT completada")

    return simulation

4. Equilibración NPT y Producción

def ejecutar_produccion_npt(simulation, n_pasos=500000, temperatura=300, presion=1.0,
                        intervalo_reporte=5000, prefijo_salida="npt"):
    """
    Ejecución de producción NPT: N, P, T constantes.

    Args:
        n_pasos: Pasos de producción (500000 × 2 fs = 1 ns).
        temperatura: Temperatura en Kelvin.
        presion: Presión en bar.
        intervalo_reporte: Pasos entre reportes.
    """
    # Agregar barostato Monte Carlo para control de presión
    system = simulation.context.getSystem()
    system.addForce(MonteCarloBarostat(presion*bar, temperatura*kelvin, 25))
    simulation.context.reinitialize(preserveState=True)

    # Actualizar reporters
    simulation.reporters = []
    simulation.reporters.append(
        StateDataReporter(
            f"{prefijo_salida}_log.txt",
            intervalo_reporte,
            step=True,
            potentialEnergy=True,
            temperature=True,
            density=True,
            speed=True
        )
    )
    simulation.reporters.append(
        DCDReporter(f"{prefijo_salida}_traj.dcd", intervalo_reporte)
    )

    # Guardar puntos de control
    simulation.reporters.append(
        CheckpointReporter(f"{prefijo_salida}_checkpoint.chk", 50000)
    )

    print(f"Ejecutando producción NPT: {n_pasos} pasos ({n_pasos*2/1000000:.2f} ns)")
    simulation.step(n_pasos)
    print("MD de producción completada")
    return simulation

Análisis de Trayectorias con MDAnalysis

1. Cargar Trayectoria

import MDAnalysis as mda
from MDAnalysis.analysis import rms, align, contacts
import numpy as np
import matplotlib.pyplot as plt

def cargar_trayectoria(archivo_topologia, archivo_trayectoria):
    """
    Carga una trayectoria MD con MDAnalysis.

    Args:
        archivo_topologia: Archivo PDB, PSF u otro archivo de topología.
        archivo_trayectoria: Trayectoria DCD, XTC, TRR u otro formato.
    """
    u = mda.Universe(archivo_topologia, archivo_trayectoria)
    print(f"Universo: {u.atoms.n_atoms} átomos, {u.trajectory.n_frames} cuadros")
    print(f"Rango de tiempo: 0 a {u.trajectory.totaltime:.0f} ps")
    return u

2. Análisis RMSD

def calcular_rmsd(u, seleccion="backbone", cuadro_referencia=0):
    """
    Calcula el RMSD de átomos seleccionados con respecto al cuadro de referencia.

    Args:
        u: Universo MDAnalysis.
        seleccion: Cadena de selección de átomos (sintaxis MDAnalysis).
        cuadro_referencia: Índice del cuadro para la estructura de referencia.

    Returns:
        Arreglo numpy de valores (tiempo, rmsd).
    """
    # Alinear trayectoria para minimizar RMSD
    alineador = align.AlignTraj(u, u, select=seleccion, in_memory=True)
    alineador.run()

    # Calcular RMSD
    R = rms.RMSD(u, select=seleccion, ref_frame=cuadro_referencia)
    R.run()

    datos_rmsd = R.results.rmsd  # columnas: cuadro, tiempo, RMSD
    return datos_rmsd

def graficar_rmsd(datos_rmsd, titulo="RMSD en el tiempo", archivo_salida="rmsd.png"):
    """Grafica el RMSD a lo largo del tiempo de simulación."""
    fig, ax = plt.subplots(figsize=(10, 4))
    ax.plot(datos_rmsd[:, 1] / 1000, datos_rmsd[:, 2], 'b-', linewidth=0.5)
    ax.set_xlabel("Tiempo (ns)")
    ax.set_ylabel("RMSD (Å)")
    ax.set_title(titulo)
    ax.axhline(datos_rmsd[:, 2].mean(), color='r', linestyle='--',
               label=f'Media: {datos_rmsd[:, 2].mean():.2f} Å')
    ax.legend()
    plt.tight_layout()
    plt.savefig(archivo_salida, dpi=150)
    return fig

3. Análisis RMSF (Flexibilidad por Residuo)

def calcular_rmsf(u, seleccion="backbone", cuadro_inicio=0):
    """
    Calcula el RMSF por residuo (flexibilidad).

    Returns:
        Arreglos de residuos y valores RMSF.
    """
    # Seleccionar átomos
    atomos = u.select_atoms(seleccion)

    # Calcular RMSF
    R = rms.RMSF(atomos)
    R.run(start=cuadro_inicio)

    # Promediar por residuo
    residuos = []
    rmsf_por_res = []
    for res in u.select_atoms(seleccion).residues:
        atomos_res = res.atoms.intersection(atomos)
        if len(atomos_res) > 0:
            residuos.append(res.resid)
            rmsf_por_res.append(R.results.rmsf[atomos_res.indices].mean())

    return np.array(residuos), np.array(rmsf_por_res)

4. Contactos Proteína-Ligando

def analizar_contactos(u, seleccion_proteina="protein", seleccion_ligando="resname LIG",
                      radio=4.5, cuadro_inicio=0):
    """
    Rastrea contactos proteína-ligando a lo largo de la trayectoria.

    Args:
        radio: Distancia de corte de contacto en Ángstroms.
    """
    proteina = u.select_atoms(seleccion_proteina)
    ligando = u.select_atoms(seleccion_ligando)

    cuadros_contacto = []
    for ts in u.trajectory[cuadro_inicio:]:
        # Encontrar átomos de proteína dentro del radio del ligando
        distancias = contacts.contact_matrix(
            proteina.positions, ligando.positions, radio
        )
        residuos_contacto = set()
        for i in range(distancias.shape[0]):
            if distancias[i].any():
                residuos_contacto.add(proteina.atoms[i].resid)
        cuadros_contacto.append(residuos_contacto)

    return cuadros_contacto

Guía de Selección de Campos de Fuerza

SistemaCampo de Fuerza RecomendadoModelo de Agua
Proteínas estándarAMBER14 (amber14-all.xml)TIP3P-FB
Proteínas + pequeñas moléculasAMBER14 + GAFF2TIP3P-FB
Proteínas de membranaCHARMM36mTIP3P
Ácidos nucleicosAMBER99-bsc1 o AMBER14TIP3P
Proteínas desordenadasff19SB o CHARMM36mTIP3P

Herramientas de Preparación del Sistema

PDBFixer (para archivos PDB crudos)

from pdbfixer import PDBFixer
from openmm.app import PDBFile

def arreglar_pdb(pdb_entrada, pdb_salida, ph=7.0):
    """Arregla problemas comunes de PDB: residuos faltantes, átomos, agregar H, estandarizar."""
    fixer = PDBFixer(filename=pdb_entrada)
    fixer.findMissingResidues()
    fixer.findNonstandardResidues()
    fixer.replaceNonstandardResidues()
    fixer.removeHeterogens(True)    # Eliminar agua/ligandos
    fixer.findMissingAtoms()
    fixer.addMissingAtoms()
    fixer.addMissingHydrogens(ph)

    with open(pdb_salida, 'w') as f:
        PDBFile.writeFile(fixer.topology, fixer.positions, f)

    return pdb_salida

GAFF2 para Pequeñas Moléculas (a través de OpenFF Toolkit)

# Para parametrización de ligandos, usar OpenFF toolkit o ACPYPE
# uv pip install openff-toolkit
from openff.toolkit import Molecule, ForceField as OFFForceField
from openff.interchange import Interchange

def parametrizar_ligando(smiles, nombre_ff="openff-2.0.0.offxml"):
    """Genera parámetros GAFF2/OpenFF para una pequeña molécula."""
    mol = Molecule.from_smiles(smiles)
    mol.generate_conformers(n_conformers=1)

    off_ff = OFFForceField(nombre_ff)
    interchange = off_ff.create_interchange(mol.to_topology())
    return interchange

Mejores Prácticas

  • Siempre minimizar antes de MD: Las estructuras PDB crudas tienen choques estéricos.
  • Equilibrar antes de la producción: NVT (50–100 ps) → NPT (100–500 ps) → Producción.
  • Usar GPU: Las simulaciones son 10–100× más rápidas en GPU (CUDA/OpenCL).
  • Paso de tiempo de 2 fs con restricciones HBonds: Estándar; usar 4 fs con HMR (repartición de masa de hidrógeno).
  • Analizar solo la trayectoria equilibrada: Descartar el primer 20–50% como equilibración.
  • Guardar puntos de control: Las ejecuciones MD pueden fallar; los puntos de control permiten reiniciar.
  • Condiciones de frontera periódicas: Requeridas para sistemas solvatados.
  • PME para electrostática: Más preciso que métodos de corte para sistemas cargados.

Recursos Adicionales

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

adaptyv

How to use the Adaptyv Bio Foundry API and Python SDK for protein experiment design, submission, and results retrieval. Use this skill whenever the user mentions Adaptyv, Foundry API, protein binding assays, protein screening experiments, BLI/SPR assays, thermostability assays, or wants to submit protein sequences for experimental characterization. Also trigger when code imports `adaptyv`, `adaptyv_sdk`, or `FoundryClient`, or references `foundry-api-public.adaptyvbio.com`.

aeon

This skill should be used for time series machine learning tasks including classification, regression, clustering, forecasting, anomaly detection, segmentation, and similarity search. Use when working with temporal data, sequential patterns, or time-indexed observations requiring specialized algorithms beyond standard ML approaches. Particularly suited for univariate and multivariate time series analysis with scikit-learn compatible APIs.

alphagenome

Look up precomputed AlphaGenome Atlas effects for any GRCh38 single-nucleotide variant (AVI score with Phred and 18 SHAP feature attributions, plus raw and quantile scores for RNA-seq, DNase, ATAC, ChIP-TF, ChIP-histone, CAGE, PRO-cap, splicing, polyadenylation and contact-map tracks), score variants or scan windows on demand with the AlphaGenome model for human and mouse (variant scoring, in silico mutagenesis, REF-versus-ALT track prediction), and build Atlas website deep links. Use when the user mentions AlphaGenome, AlphaGenome Atlas, AVI or AlphaGenome Variant Impact, DeepMind variant effect prediction, or wants to prioritise or mechanistically interpret non-coding, regulatory, splicing, enhancer, promoter, or chromatin-accessibility effects of SNVs from a VCF, credible set, or region. Research use only; not a clinical tool.

analytical-method-validation

Plan, execute, and document validation, verification, and transfer of analytical procedures under the governing framework - ICH Q2(R2) and Q14, USP <1220>/<1225>/<1226>, ICH M10 bioanalytical, CLSI EP, or ISO/IEC 17025. Use for HPLC, LC-MS/MS, GC, CE, ICP-MS, dissolution, qNMR, qPCR, NIR, and ligand binding or cell-based assays whenever the question is whether a procedure is fit for its intended purpose. Triggers include

anndata

Data structure for annotated matrices in single-cell analysis. Use when working with .h5ad files or integrating with the scverse ecosystem. This is the data format skill—for analysis workflows use scanpy; for probabilistic models use scvi-tools; for population-scale queries use cellxgene-census.

arbor

Autonomously improve a real artifact (code, training recipe, agent harness, data pipeline, prompt) against an objective and an evaluator, using Hypothesis Tree Refinement (HTR) from the Arbor paper. Use this whenever someone wants to iteratively optimize something over many experiments without overfitting — e.g.

arboreto

Infer gene regulatory networks (GRNs) from gene expression data using scalable algorithms (GRNBoost2, GENIE3). Use when analyzing transcriptomics data (bulk RNA-seq, single-cell RNA-seq) to identify transcription factor-target gene relationships and regulatory interactions. Supports distributed computation for large-scale datasets.

astropy

Core Python library for astronomy and astrophysics workflows that need Astropy APIs, including units/quantities, coordinates, FITS I/O, tables, time systems, WCS, and cosmology. Use when implementing or debugging astronomical data analysis code with Astropy.

autoskill

Observe the user

benchling-integration

Benchling Python SDK and REST API integration for registry entities, inventory, ELN entries, workflows, Benchling Apps, and Data Warehouse queries. Use when automating lab data with benchling-sdk or the v2 API.

bgpt-paper-search

Search scientific papers and retrieve structured experimental data extracted from full-text studies via the BGPT MCP server. Returns 25+ fields per paper including methods, results, sample sizes, quality scores, and conclusions. Use for literature reviews, evidence synthesis, and finding experimental details not available in abstracts alone.

bids

>

biopython

Comprehensive molecular biology toolkit. Use for sequence manipulation, file parsing (FASTA/GenBank/PDB), phylogenetics, and programmatic NCBI/PubMed access (Bio.Entrez). Best for batch processing, custom bioinformatics pipelines, BLAST automation. For quick lookups use gget; for multi-service integration use bioservices.

bioservices

Unified Python interface to 40+ bioinformatics services. Use when querying multiple databases (UniProt, KEGG, ChEMBL, Reactome) in a single workflow with consistent API. Best for cross-database analysis, ID mapping across services. For quick single-database lookups use gget; for sequence/file manipulation use biopython.

bulk-rnaseq

End-to-end bulk RNA-seq orchestrator — takes raw FASTQ reads through QC and trimming (FastQC, fastp/Trim Galore), alignment and quantification (STAR, Salmon, featureCounts), assembles a gene-level counts matrix, then hands off to differential expression (pydeseq2), pathway/GSEA enrichment (pathway-enrichment), and publication figures (scientific-visualization). Use whenever the user has bulk RNA-seq reads or quant output and wants a complete, reproducible differential-expression workflow — e.g.

cellxgene-census

Query the CZ CELLxGENE Census programmatically for versioned public single-cell and spatial transcriptomics data. Use when you need population-scale cell metadata, gene expression slices, Census summary counts, source H5AD URIs/downloads, embeddings, spatial Census data, or reference atlas comparisons across organisms, tissues, diseases, assays, and cell types. For analyzing your own local single-cell data use scanpy, anndata, or scvi-tools.

cirq

Google quantum computing framework. Use when targeting Google Quantum AI hardware, designing noise-aware circuits, or running quantum characterization experiments. Best for Google hardware, noise modeling, and low-level circuit design. For IBM hardware use qiskit; for quantum ML with autodiff use pennylane; for physics simulations use qutip.

citation-management

Comprehensive citation management for academic research. Search OpenAlex, PubMed, and Google Scholar for papers, extract accurate metadata, validate citations, and generate properly formatted BibTeX entries. This skill should be used when you need to find papers, verify citation information, convert DOIs to BibTeX, or ensure reference accuracy in scientific writing.

clinical-decision-support

Prepare and validate research-only clinical decision-support evaluation, evidence-profile, cohort, survival, biomarker/model, privacy, and governance artifacts. Use for aggregate or synthetic research documentation and traceability—not patient care or live clinical operation.

clinical-reports

Create safety-bounded draft structures and run local deterministic checks for clinical case, diagnostic, trial, safety, and aggregate research reports. Use only with synthetic, de-identified, or aggregate inputs and verified source-fact manifests; every output requires qualified review.

Skills relacionados