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.")