El siguiente script de Python, para ejecutar en Linux, genera ficheros *.sbatch que lanzan trabajos a una cola gestionada por SLURM y que llevan 5 jobs sucesivos dentro de uno. Deben ejecutarse antes de 7 días.
Necesitamos de entrada _40_docking-YAS-GPU-5-hilos-template.txt como fichero plantilla (template), y _lista-2-variables-en-2-columnas-GPU.txt con la lista de directorios sobre los que ejecutar las simulaciones de docking. Dentro de cada uno de estos directorios habrá un fichero "nombre-directorio_ligands.sdf" y "nombre-directorio_receptor.sce". Este fichero tiene en la primera columna nombres de ficheros de salida y en la segunda columna los nombres de directorios ya mencionados. El número de nombres de directorios debe ser múltimplo de 5, en mi ejemplo 6915.
El fichero plantilla (_40_docking-YAS-GPU-5-hilos-template.txt) tiene dos cadenas texto ([variable-1] y [variable-2]) que serán sustituidas en cada fichero [variable-1].sbatch de salida por valores tomados de _lista-2-variables-en-2-columnas-GPU.txt. Se renerarán 6915 / 5 = 1383 ficheros *.sbatch y a modo de ejemplo su contenido puede verse aquí.
Cuidado al editar el fichero plantilla ya que la versión actual de script analiza las 11 primeras líneas (donde localiza [variable-1]) y después analiza las siguientes 20 líneas (donde localiza [variable-2]).
import os
# Paths
template_path = "/home/40_docking-YAS-GPU-5-hilos/_40_docking-YAS-GPU-5-hilos-template.txt"
list_path = "/home/40_docking-YAS-GPU-5-hilos/_lista-2-variables-en-2-columnas-GPU.txt"
output_path = "/home/40_docking-YAS-GPU-5-hilos"
# Read the template
with open(template_path, "r", encoding="utf-8") as f:
template = f.read()
# Read the list of variables
with open(list_path, "r", encoding="utf-8") as f:
lines = [line.strip().split() for line in f if line.strip()]
# Split columns
col1 = [line[0] for line in lines]
col2 = [line[1] for line in lines]
# Check col2 length is a multiple of 5
if len(col2) % 5 != 0:
raise ValueError("Error: Column 2 must contain a number of values divisible by 5.")
# Total number of groups
num_groups = len(col2) // 5
# Generate output files
for i in range(num_groups):
var1 = col1[i * 5] # use var1 from the first entry in the block
var2_block = col2[i * 5 : (i + 1) * 5]
# Split template into lines
template_lines = template.splitlines()
# First 11 lines: replace [variable-1]
output = "\n".join(line.replace("[variable-1]", var1) for line in template_lines[:11])
# Next 20 lines (5 blocks of 4 lines): replace [variable-2] and [variable-1]
for j in range(5):
v2 = var2_block[j]
for k in range(4):
line = template_lines[11 + j * 4 + k]
line = line.replace("[variable-2]", v2).replace("[variable-1]", var1)
output += "\n" + line
# Write the output file
output_file = os.path.join(output_path, f"GPU-5-hilos_{var1}.sbatch")
with open(output_file, "w", encoding="utf-8") as f:
f.write(output)
print(f"Successfully created {num_groups} sbatch files in: {output_path}")