Índice de Parr

Teoría sobre del Índice de Parr

Parr, R.G. and Pearson, R.G. (1983) Absolute Hardness: Companion Parameter to Absolute Electronegativity. Journal of the American Chemical Society, 105, 7512-7516. https://doi.org/10.1021/ja00364a005

El índice de Parr (\( \omega \)) es una medida teórica que se utiliza para evaluar la electrofilia de una molécula. Se basa en el potencial químico (\( \mu \)) y la dureza química (\( \eta \)) de la molécula.

El índice de Parr se calcula con la siguiente fórmula:

omega = (mu^2) / (2 * eta)

Donde:

En resumen, un mayor valor de \( \omega \) significa que la molécula es más electrofílica, es decir, más propensa a aceptar electrones.

Uso del Script

Este script Python calcula el índice de Parr para un conjunto de moléculas presentes en un archivo SDF y las ordena de mayor a menor electrofilia. Para ello, se utilizan las herramientas RDKit y PySCF.

Para usar el script, sigue los siguientes pasos:

Script Python

A continuación, te presentamos el código completo del script Python que puedes utilizar:


import os
from rdkit import Chem
from rdkit.Chem import AllChem
from pyscf import gto, scf

# Rutas de entrada y salida
input_sdf = "/home/jant/aaa/electrofilia.sdf"
output_sdf = "/home/jant/aaa/electrofilia-salida.sdf"

def calculate_parr_index(molecule):
    """
    Calcula el índice de Parr para la electrofilia usando PySCF.
    """
    mol = gto.M(
        atom=molecule,
        basis="sto-3g"  # Base estándar
    )
    mf = scf.RHF(mol)  # Hartree-Fock restringido
    mf.kernel()

    # Obtener energías de orbitales moleculares
    mo_energies = mf.mo_energy
    num_electrons = mol.nelectron  # Número total de electrones
    num_occupied_orbitals = num_electrons // 2  # Orbitales ocupados para sistemas cerrados

    homo_energy = mo_energies[num_occupied_orbitals - 1]  # Índice del HOMO
    lumo_energy = mo_energies[num_occupied_orbitals]      # Índice del LUMO

    # Calcular potencial químico y dureza
    chemical_potential = -(homo_energy + lumo_energy) / 2
    hardness = lumo_energy - homo_energy

    # Calcular índice de Parr (electrofilia)
    if hardness != 0:
        parr_index = (chemical_potential**2) / (2 * hardness)
    else:
        parr_index = float('inf')  # Si dureza es cero, electrofilia tiende a infinito

    return parr_index, homo_energy, lumo_energy

def main():
    # Leer el archivo SDF
    supplier = Chem.SDMolSupplier(input_sdf, removeHs=False)
    if not supplier:
        print("Error al leer el archivo SDF.")
        return

    results = []
    
    for mol in supplier:
        if mol is None or mol.GetNumAtoms() == 0:  # Validar que la molécula tiene átomos
            print("Molécula vacía o inválida encontrada. Se omite.")
            continue

        try:
            # Optimizar la geometría con RDKit
            AllChem.EmbedMolecule(mol, randomSeed=42)
            AllChem.UFFOptimizeMolecule(mol)

            # Extraer geometría atómica
            atom_coords = [
                f"{atom.GetSymbol()} {pos[0]} {pos[1]} {pos[2]}"
                for atom, pos in zip(mol.GetAtoms(), mol.GetConformer().GetPositions())
            ]
            geometry = "\n".join(atom_coords)

            # Calcular índice de Parr
            parr_index, homo_energy, lumo_energy = calculate_parr_index(geometry)

            # Guardar resultados con la molécula
            mol.SetProp("ParrIndex", str(parr_index))
            mol.SetProp("HOMO", str(homo_energy))
            mol.SetProp("LUMO", str(lumo_energy))
            results.append((parr_index, mol))
        except Exception as e:
            print(f"Error al procesar una molécula: {e}")
            continue

    # Ordenar por índice de Parr (mayor electrofilia primero)
    results.sort(key=lambda x: x[0], reverse=True)

    # Escribir el archivo SDF de salida
    writer = Chem.SDWriter(output_sdf)
    for _, mol in results:
        writer.write(mol)
    writer.close()

    print(f"Archivo de salida generado: {output_sdf}")

if __name__ == "__main__":
    main()
        

Un mayor índice de Parr es indicativo de mayor electrofilia.

El índice de Parr (\( \omega \)) mide la tendencia de una molécula a aceptar electrones en función de su potencial químico (\( \mu \)) y su dureza química (\( \eta \)). Matemáticamente:

$$\omega = \frac{\mu^2}{2\eta}$$

\(\mu\) (potencial químico): Representa la capacidad de la molécula para ganar electrones. Es proporcional al negativo de la media de las energías de los orbitales HOMO y LUMO:

\[ \mu = - \frac{E_{\text{HOMO}} + E_{\text{LUMO}}}{2} \]

\(\eta\) (dureza química): Refleja la resistencia a la transferencia de electrones y se calcula como:

\[ \eta = E_{\text{LUMO}} - E_{\text{HOMO}} \]

Interpretación del índice de Parr

Por lo tanto:

Al ordenar las moléculas de mayor a menor \( \omega \), estarás clasificándolas de mayor a menor electrofilia.





Última modificación: