Script de Python para ejecutar YASARA structure desde Windows para trabajos en serie.


Para ejecutar este script necesitamos el software de YASARA structure en la ruta D:\yasara-23.1.5\yasara.exe, el macro de YASARA, C:\Users\jant\Desktop\PTPRK\_dock_runscreening-salva-10-kcal-mol_25-1-13.mcr, que permite ejecutar un cribado de docking sobre moléculas en 3D y con H almacenadas como un fichero *.sdf, un fichero de texto con la lista de 'jobs' a ejecutar: C:\Users\jant\Desktop\PTPRK\_list.txt, este fichero contiene el nombre de todas las carpetas que contienen en su interior un fichero_ligands.sdf y otro fichero_receptor.sce. Por cada carpeta, YASARA ejecutará un 'jobs', en este caso una simulación de docking de todas las moléculas contenidas en fichero_ligands.sdf sobre la 'caja' del sitio catalítico de la estructura de la enzima que hayamos elegido del fichero fichero_receptor.sce.

Cada fichero *.sdf contiene 500 moléculas orgánicas de menos de 750 Da de peso molecular, en 3D y con H.

El macro de YASARA, C:\Users\jant\Desktop\PTPRK\_dock_runscreening-salva-10-kcal-mol_25-1-13.mcr permite elegir un valor de ΔG a partir del cual se guarden los ficheros *.yob con el complejo proteina-compuesto acoplado. Esto evita que se generen ficheros *.yob que no usaremos después porque el valor de ΔG sea menor que el límite que hayamos elegido. En mi caso, 10 kcal/mol. Para YASARA, los valores positivos indican acoplamiento, tanto más fuerte cuanto mayor sea el valor de ΔG calculado.

# Uncomment below to save cluster members only if their binding energy is better 
# than the given value [kcal/mol], adr files will also not be saved.
SaveEnergy 10

✔ NO se detiene si YASARA falla.
✔ Genera un fichero por job (SUCCESS o FAIL).
✔ Guarda stdout y stderr de YASARA.

import subprocess
from pathlib import Path
from datetime import datetime

# Fixed paths
yasara_exe = r"D:\yasara-23.1.5\yasara.exe"
macro_file = r"C:\Users\jant\Desktop\PTPRK\_dock_runscreening-salva-10-kcal-mol_25-1-13.mcr"
list_file = r"C:\Users\jant\Desktop\PTPRK\_list.txt"
base_target = Path(r"C:\Users\jant\Desktop\PTPRK")

# Log directory
log_dir = base_target / "_yasara_logs"
log_dir.mkdir(exist_ok=True)

# Read job list
with open(list_file, "r", encoding="utf-8") as f:
    jobs = [line.strip() for line in f if line.strip()]

for job in jobs:
    job_dir = base_target / job / job
    job_log_dir = log_dir / job
    job_log_dir.mkdir(parents=True, exist_ok=True)

    stdout_file = job_log_dir / "stdout.txt"
    stderr_file = job_log_dir / "stderr.txt"
    status_file = job_log_dir / "STATUS.txt"

    cmd = [
        yasara_exe,
        "-txt",
        macro_file,
        f"MacroTarget='{job_dir}'"
    ]

    print(f"[INFO] Running YASARA job: {job}")

    start_time = datetime.now()

    try:
        result = subprocess.run(
            cmd,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True
        )

        stdout_file.write_text(result.stdout, encoding="utf-8")
        stderr_file.write_text(result.stderr, encoding="utf-8")

        if result.returncode == 0:
            status = "SUCCESS"
        else:
            status = f"FAIL (return code {result.returncode})"

    except Exception as e:
        status = f"FAIL (exception: {e})"
        stderr_file.write_text(str(e), encoding="utf-8")

    end_time = datetime.now()

    status_file.write_text(
        f"Job: {job}\n"
        f"Status: {status}\n"
        f"Start: {start_time}\n"
        f"End: {end_time}\n",
        encoding="utf-8"
    )

    print(f"[INFO] Job {job}: {status}")

print("[INFO] Batch finished.")