Python script para eliminar *.out después de terminar una simulación de docking con YASARA en Linux.
Estamos ejecutando simulaciones de molecular docking enfrentando la libreria Molport v7 sobre una escena de YASARA con una caja seleccionada en el sitio de interacción de dos proteínas. Tenemos 6912 ficheros *.sdf, cada uno de ellos contiene 3000 compuestos en 3D y con H, localizados en otras tantas carpetas dentro de la ruta /home/jant.encinar/runDC/.
La versión actual de YASARA no genera ficheros *.adr y hemos filtrado la generación de ficheros *.yob que contienen receptor-ligando acoplado a valores de DeltaG mayores de 10 kcal/mol (Para YASARA valores más positivos indican unión más fuerte). Hemos lanzado nuestros trabajos con ficheros *.sbatch a un cluster de computo con Linux y que gobierna sus colas de trabajos con SLURM. Los ficheros *.out pueden tener más de 1 GB... hay que liberar espacio una vez se ha generado el fichero *.log con los resultados de docking de cada compuesto (con más de 300 KB en mi caso).
Para eso sirve este script. Recorre la ruta /home/jant.encinar/runDC/ y busca en cada subcarpeta ficheros *.log con más de 300 KB, si los encuentra borra el fichero *.out de esa carpeta. Además, copia todos los ficheros *.log (con más de 300 KB) a la ruta /home/jant.encinar/py-linux/15_docking-YAS/logs/ y finalmente genera un fichero de salida /home/jant.encinar/py-linux/15_docking-YAS/00__quitar_out-grandes__runDC.txt, con las carpetas que tienen ficheros *.out y *.log que hemos definido en el script.
# -*- coding: utf-8 -*-
import os
import shutil
# Paths
base_dir = "/home/jant.encinar/runDC/"
backup_dir = "/home/jant.encinar/py-linux/15_docking-YAS/logs/"
output_file = "/home/jant.encinar/py-linux/15_docking-YAS/00__quitar_out-grandes__runDC.txt"
# Ensure backup directory exists
os.makedirs(backup_dir, exist_ok=True)
with open(output_file, "w") as out:
# Write header
out.write("Folder_Path\tOUT_File\tOUT_Size_GB\tLOG_File\tLOG_Size_KB\tOUT_Deleted\tLOG_Copied\n")
for root, dirs, files in os.walk(base_dir):
# Get list of .out files
out_files = [f for f in files if f.lower().endswith(".out")]
log_files = [f for f in files if f.lower().endswith(".log")]
# If there is at least one .log file, take the first
log_file = "-"
log_size_kb = "-"
log_path = None
log_copied = "No"
if log_files:
log_file = log_files[0]
log_path = os.path.join(root, log_file)
log_size_bytes = os.path.getsize(log_path)
log_size_kb = round(log_size_bytes / 1024, 1)
if log_size_kb > 300:
# Copy .log to backup folder
folder_name = os.path.basename(os.path.normpath(root))
dest_log_name = f"{log_file}"
dest_log_path = os.path.join(backup_dir, dest_log_name)
shutil.copy2(log_path, dest_log_path)
log_copied = "Yes"
print(f"Copied LOG > 300KB: {log_path} -> {dest_log_path}")
for out_file in out_files:
out_path = os.path.join(root, out_file)
out_size_bytes = os.path.getsize(out_path)
out_size_gb = round(out_size_bytes / (1024 ** 3), 3)
out_deleted = "No"
# If .log exists and is large ? delete .out
if log_path and log_size_kb != "-" and log_size_kb > 300:
os.remove(out_path)
out_deleted = "Yes"
print(f"Deleted OUT due to large LOG: {out_path}")
# Record result
out.write(f"{root}\t{out_file}\t{out_size_gb}\t{log_file}\t{log_size_kb}\t{out_deleted}\t{log_copied}\n")
print(f"Report written to: {output_file}")