El siguiente script de Python para ejecutar desde consola Linux está pensado para calcular distancias entre átomos seleccionados en una estructura que cambia a lo largo de una simulación de dinámica molecular. Necesitamos tener instalado PyMol, en mi caso en un entorno virtual llamado "env_pymol", que se activa al ejecutar el sbatch. Este tiene la forma siguiente:
#!/bin/bash
#SBATCH --job-name=pY61
#SBATCH --cpus-per-task=4
#SBATCH --mem=16G
#SBATCH --time=7-0
#SBATCH --qos=long
#SBATCH --output=/home/jant.encinar/py-linux/34-foldx-array/pTyr-Cys/out/MD08_salida-%j.out
#SBATCH --error=/home/jant.encinar/py-linux/34-foldx-array/pTyr-Cys/out/MD08_error-%j.err
# Inicializar conda correctamente en SLURM
eval "$(/home/jant.encinar/miniforge3/bin/conda shell.bash hook)"
conda activate env_pymol
# Ejecutar yasara
cd /home/jant.encinar/py-linux/34-foldx-array/pTyr-Cys/
python3 _medida-pTyr-Cys_D1.pyEl script de Python se muestra a continuación. Usa una lista con el nombre de todos los pdbs a los que queremos medir la distancia entre dos átomos de la estructura que contengan esos pdbs, contenida en un fichero de texto: /home/jant.encinar/py-linux/34-foldx-array-DRAGON/_lista-foldx-MD61_Repair.txt. La carpeta donde se encuentran todos los pdbs entá en la ruta: /home/jant.encinar/runMD/MD61_Y118-PXL_PTPRF-D1__human_model_0_ok, y generará un fichero de texto (/home/jant.encinar/py-linux/34-foldx-array/pTyr-Cys/MD61-pTyr-Cys.txt) con las medidas en Armstrons. En las líneas 32 y 33 del script se seleccionan los átomos entre los que se quiere medir la distancia, en este ejemplor entre los átomos O del OH fenólico de la Tyr de la cadena B que es el aminoácido 10 en la seccuencia y S del aminoácido 215 de la cadena B. Dicho nombre se obtiene fácilmente cuando editas un pdb de los implicados en las medidas que te interesan. Justo debajo vemos un ejemplo.

import os
from pymol import cmd
# Input and output file paths
lista_pdb_path = "/home/jant.encinar/py-linux/34-foldx-array-DRAGON/_lista-foldx-MD61_Repair.txt"
directorio_pdbs = "/home/jant.encinar/runMD/MD61_Y118-PXL_PTPRF-D1__human_model_0_ok"
archivo_salida_path = "/home/jant.encinar/py-linux/34-foldx-array/pTyr-Cys/MD61-pTyr-Cys.txt"
# Create output directory if it does not exist
os.makedirs(os.path.dirname(archivo_salida_path), exist_ok=True)
# Read PDB names from input file
with open(lista_pdb_path, "r") as f:
lineas = [line.strip() for line in f if line.strip()]
# Process structures and calculate distances
with open(archivo_salida_path, "w") as f_out:
for nombre_pdb in lineas:
nombre_fichero = nombre_pdb if nombre_pdb.endswith(".pdb") else f"{nombre_pdb}.pdb"
ruta_pdb = os.path.join(directorio_pdbs, nombre_fichero)
if not os.path.exists(ruta_pdb):
print(f"[WARNING] File not found: {ruta_pdb}")
f_out.write(f"{nombre_pdb}\tNA\n")
continue
cmd.reinitialize()
obj_name = "mol_actual"
cmd.load(ruta_pdb, obj_name)
# Standard PyMOL selection strings
sel_atom1 = f"model {obj_name} and chain B and resi 10 and name OH"
sel_atom2 = f"model {obj_name} and chain A and resi 215 and name SG"
try:
# Check if both target atoms exist in the loaded structure
count1 = cmd.count_atoms(sel_atom1)
count2 = cmd.count_atoms(sel_atom2)
if count1 == 0 or count2 == 0:
print(f"[WARNING] Atom not found in {nombre_pdb} (Atom 1: {count1}, Atom 2: {count2})")
f_out.write(f"{nombre_pdb}\tError_AtomNotFound\n")
continue
# Measure distance in Angstroms
distancia = cmd.distance("dist_temp", sel_atom1, sel_atom2)
f_out.write(f"{nombre_pdb}\t{distancia:.3f}\n")
print(f"Processed: {nombre_pdb} -> Distance: {distancia:.3f}")
except Exception as e:
print(f"[ERROR] Could not measure distance in {nombre_pdb}: {e}")
f_out.write(f"{nombre_pdb}\tError\n")
print(f"\nProcess finished. Results saved in: {archivo_salida_path}")