15 votos

Cómo crear una hoja de cálculo que contiene las coordenadas y ángulos de enlace predicha, propiedades moleculares, propiedades de torsión, etc. de una molécula?

En una respuesta anterior aquí (http://chemistry.stackexchange.com/a/30841/876) me informó de que en los comentarios que OpenBabel & Python terminal podría ser utilizado para imprimir los datos contenidos en la propiedad de las matrices de Avogadro (puede encontrarse más información aquí ¿Cómo puedo imprimir la propiedad de las matrices de Avogadro?). Debo ser claro, sin embargo, la mayoría de los archivos que quiero ser capaz de hacer esto para que se CIF archivos donde los ángulos de enlace y longitudes no son explícitamente mencionadas en los archivos, por lo que estas propiedades pueden necesitar ser predicho por el software. Así que sentí que no podía ser la única persona interesada en esto, así que pensé en hacer esta pregunta en este sitio.

Me gustaría alguna respuesta para ser adecuado para aquellos que operan en las máquinas de Windows, si es posible. Tengo Python & OpenBabel instalado en mi 64 bits de Windows 7 PC, así que creo que esto no debería ser un gran problema, es de esperar.

9voto

Dylan Beattie Puntos 23222

Quiere el Abierto de Babel "informe" formato, p. ej.:

obabel benzene.cml -oreport

Nombre de archivo: benceno.g03
FÓRMULA: C6H6
MASA: 78.1118
MASA EXACTA: 78.0469502
INTERATÓMICA DISTANCIAS

 C 1 C 2 C 3 C 4 C 5 C 6
\begin{pmatrix}
\sqrt{1+t^2}(a+b\arctan(t))
\\
\frac1{\sqrt{1+t^2}}(at+b+bt\arctan(t))
\end-------------------------------------------------------------
 C 1 0.0000 
 C 2 1.3975 0.0000 
 C 3 2.4207 1.3975 0.0000 
 C 4 2.7952 2.4205 1.3976 0.0000 
 C 5 2.4205 2.7948 2.4205 1.3975 0.0000 
 C 6 1.3976 2.4205 2.7952 2.4207 1.3975 0.0000 
 H 7 1.0841 2.1549 3.4030 3.8793 3.4029 2.1549 
 H 8 2.1548 1.0841 2.1548 3.4028 3.8789 3.4028 
 H 9 3.4030 2.1549 1.0841 2.1549 3.4029 3.8793 
 H 10 3.8793 3.4029 2.1549 1.0841 2.1549 3.4030 
 H 11 3.4028 3.8789 3.4028 2.1548 1.0841 2.1548 
 H 12 2.1549 3.4029 3.8793 3.4030 2.1549 1.0841 

 H 7 H 8 H 9 H 10 H 11 H 12
------------------------------------------------------------------
 H 7 0.0000 
 H 8 2.4816 0.0000 
 H 9 4.2984 2.4816 0.0000 
 H 10 4.9634 4.2982 2.4817 0.0000 
 H 11 4.2982 4.9630 4.2982 2.4816 0.0000 
 H 12 2.4817 4.2982 4.9634 4.2984 2.4816 0.0000 




CARGAS ATÓMICAS
 C 1 -0.1860370000
 C 2 -0.1859930000
 C 3 -0.1860370000
 C 4 -0.1860370000
 C 5 -0.1859930000
 C 6 -0.1860370000
 H 7 0.1860240000
 H 8 0.1860180000
 H 9 0.1860240000
 H 10 0.1860240000
 H 11 0.1860180000
 H 12 0.1860240000


ÁNGULOS DE ENLACE
 6 1 7 Car H 120.003
 2 1 6 Coche Coche Coche 119.993
 2 1 7 Car H 120.004
 1 2 3 Coche Coche Coche 120.014
 1 2 8 Car H 119.993
 3 2 8 Car H 119.993
 4 3 9 Car H 120.003
 2 3 4 Coche Coche Coche 119.993
 2 3 9 Car H 120.004
 5 4 10 Coches H 120.004
 3 4 5 Coche Coche Coche 119.993
 3 4 10 Coches H 120.003
 4 5 11 Car H 119.993
 6 5 11 Car H 119.993
 4 5 6 Coche Coche Coche 120.014
 5 6 12 Car H 120.004
 1 6 5 Coche Coche Coche 119.993
 1 6 12 Car H 120.003


LOS ÁNGULOS DE TORSIÓN
 11 5 4 10 -0.000
 11 5 4 3 -180.000
 6 5 4 10 -180.000
 6 5 4 3 -0.000
 11 5 6 12 0.000
 11 5 6 1 -180.000
 4 5 6 12 -180.000
 4 5 6 1 -0.000
 5 4 3 9 -180.000
 5 4 3 2 -0.000
 10 4 3 9 -0.000
 10 4 3 2 -180.000
 5 6 1 7 -180.000
 5 6 1 2 -0.000
 12 6 1 7 -0.000
 12 6 1 2 -180.000
 6 1 2 3 -0.000
 6 1 2 8 -180.000
 7 1 2 3 -180.000
 7 1 2 8 -0.000
 4 3 2 1 0.000
 4 3 2 8 -180.000
 9 3 2 1 -180.000
 9 3 2 8 -0.000

ACTUALIZACIÓN:

Usted mencionó que desean un CSV-análisis de salida, por ejemplo, desde Python.

Me escribió una bastante rápida herramienta para ello molcsv.py

Debería ser bastante obvio acerca de la modificación en los diferentes for de bucles.

3voto

dsteinweg Puntos 768

Carga tu archivo CIF en PLATON y ejecutar CALC-GEO

En la *.LIS archivo generado, podrás encontrar todas las tablas que necesita, es decir,

  • Longitudes De Enlace (Angstrom)
  • Bond/Valencia Ángulos (Grados)
  • Torsión/Ángulos Diedros (Gr.)

Usted todavía puede usar el regex módulo de Python para analizar los datos,\s*(?P<atoms>([A-Z][a-z]?\(\d*\w\)\s*){4})\s*(?P<value>-?\d*\.\d\(\d+\)) dividirá entradas en la torsión de la tabla en dos grupos con nombre, que se puede seguir el proceso y a escribir a un archivo CSV.


EDITAR

Creo que OpenBabel es una excelente herramienta! En este caso, sin embargo, yo sugiero utilizar el enfoque de arriba, en lugar de analizar el OpenBabel archivo de informe por las siguientes razones:

  1. En un par de casos, me di cuenta de que el generador de informes de OpenBabel tenido algunos problemas con CIF archivos que se comprueba mediante la comprobación interna de las rutinas de PLATÓN, así como CheckCIF, una herramienta en línea proporcionada por la IUCr, y se han encontrado para ser válido.
  2. En la tabla de los ángulos diedros, el OpenBabel informe no descriptores de uso como C(5), H(10A) para denotar los átomos en un diedro, pero utiliza el átomo de índices. Si usted desea escribir los descriptores a un archivo CSV, habría que buscarlos en otra mesa.

Si usted puede vivir con los índices, el siguiente fragmento de código Python debería ser suficiente:

#!/usr/bin/env python3

import csv
import argparse

def get_torsions_from_report(report_path):
    '''Read all rows with he indices to four consecutive atoms and 
       the corresponding dihedral angle from an OpenBabel report file.'''
    try:
        torsion_list = []
        with open(report_path) as infile:
            for line in infile:
                if line.startswith('TORSION ANGLES'):
                    break

            for line in infile:
                if line.strip():
                    torsion_list.append(line.split())

        return torsion_list
    except IOError:
        print(e)


def write_torsions_to_csv(csv_path, torsion_list):
    '''Write torsion data to CSV.'''
    with open(csv_path, 'wt') as fout:
        writer = csv.writer(fout)
        writer.writerow(('Atom1', 'Atom 2', 'Atom 3', 'Atom 4', 'Torsion'))
        writer.writerows(torsion_list)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Read torsions 
    from OpenBabel report and write them to a CSV file.')
    parser.add_argument('-i', dest="infile", required=True,
    help="OpenBabel report file")
    parser.add_argument('-o', dest="outfile", required=True, 
    help="CSV file")

    args = parser.parse_args()  
    torsions = get_torsions_from_report(args.infile)
    write_torsions_to_csv(args.outfile, torsions)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X