Hacer un editor / visualizador molecular: programación orientada a objetos, estructuras de datos y moléculas


12

Soy nuevo en programación y estoy tratando de resolver mi primer gran problema y escribir mi primer gran programa. He buscado ejemplos de código abierto de código para aprender, pero hasta ahora solo he encontrado código en idiomas que no entiendo completamente o que hace cosas relacionadas pero aún muy distantes para que realmente pueda aprender. Tengo problemas para dar algunos pasos conceptuales aquí.

Quiero hacer un software simple para construir, modificar y luego representar pequeñas moléculas orgánicas. Esto es principalmente un ejercicio de aprendizaje. Un usuario daría una cadena SMILES o elegiría entre un conjunto básico de moléculas iniciadoras, y luego podría construir sobre esa molécula ya sea gráficamente o mediante una sintaxis de entrada de texto. Sin embargo, aún no estoy en ese punto de complejidad. Ni siquiera puedo comprender completamente cómo hacer clases / objetos para almacenar las moléculas. Entonces, mi pregunta es sucinta: ¿Cómo uso las clases / objetos para construir moléculas mientras se retienen todos los niveles de información, y qué estructuras de datos debo usar como atributos para cada objeto? Y, ¿pueden los objetos ser atributos de otros objetos?

Aquí está mi línea de pensamiento hasta ahora: estaba pensando en tener una clase "Molécula", luego una clase / subclase "Atom" y una subclase "Bond", y quizás también una subclase "FunctionalGroup". Parece un buen lugar para comenzar, pero tal vez no entiendo la POO y esto es malo. Pero entonces mi problema realmente se vuelve confuso (para mí). Aunque tengo todos estos conceptos / ideas / clases, no entiendo completamente qué estructuras de datos se necesitan para representar la molécula. Sería bueno tener una lista de átomos. ¿Podría esa lista ser una lista de objetos Atom? También necesitaría tener una forma de almacenar la conectividad. Una matriz 2D parece una buena idea, con el orden de los enlaces como enteros en las posiciones de la matriz.

En este punto, estoy empezando a sentirme abrumado con la tarea. ¿Tiene sentido todo lo que estoy haciendo hasta ahora? Adjuntar un aspecto de visualización / dibujo sobre esto puede significar que necesito reescribir / reelaborar muchas de estas cosas, pero solo estoy tratando de llegar a un punto en el que al menos pueda almacenar moléculas con los datos relevantes y luego acceder esos datos para verificar / modificar. Estaba pensando en hacer esto en Python, por lo que el código / clases quizás se vería así: http://pastebin.com/uUi1BMzr

Quizás esta es realmente una pregunta de programación para StackOverflow, pero pensé que era lo suficientemente específica como para ir aquí. Cualquier ayuda sería muy apreciada, incluso si usted solo señala dónde he cometido errores conceptuales. Gracias por adelantado.


1
Además, para cualquiera que intente hacer algo similar, acabo de encontrar un paquete de Python de código abierto que me ha ayudado con algunos conceptos llamados MMTK, para el kit de herramientas de mecánica molecular.
Nate

1
¿Has mirado en OpenBabel? Eso debería tener todo lo que necesitas a mano.
Deathbreath

Respuestas:


5

el software de escritura es un proceso iterativo: escriba el código -> vea hasta dónde puede llegar y luego planifique los siguientes pasos -> escriba el código -> repita. En esta etapa del aprendizaje del arte, te sugiero que saltes pronto solo para probar las aguas. No es necesario planificar todo el sistema por adelantado. Sí, Python sería un buen primer idioma. Para la visualización, pruebe MatPlotLib, también NumPy y SciPy son útiles. El software a escala industrial siempre se basa en incorporar bibliotecas preconstruidas, en lugar de escribir todo usted mismo, sin embargo, las soluciones simples pueden y deben escribirse usted mismo, especialmente cuando aprende a programar. Su diseño OO parece estar bien por ahora. Cuando / si sus relaciones de objeto necesitan cambiar más tarde, el acto de refactorizar su código es una experiencia digna de dominar. Bienvenido a bordo !


Gracias por el aporte. Solo voy a seguir así. También estoy aprendiendo un poco sobre cómo pasar y mutar los atributos / variables de un objeto. Es realmente fascinante tomar algo del mundo real e intentar representarlo en un código de computadora.
Nate

9

Tu objetivo tiene muchos desafíos. Los dividiré en partes.

SMILES no es un lenguaje trivial para analizar, y las reglas para la percepción de la aromaticidad no están bien definidas. La definición gramatical detallada del proyecto OpenSMILES debería ayudar a algunos.

SMILES define la topología, pero no proporciona información 2D o 3D. Hacer cualquiera es difícil. (Es decir, si quieres que se vea bien).

Realmente, deberías buscar el kit de herramientas de quiminformática RDKit (u OpenBabel, pero prefiero RDKit). Tiene incorporado un analizador SMILES, así como un diseño 2D, y creo que la generación de conformación 3D. OpenBabel también lo hace.

Luego, para la visualización, tendrá que descubrir el sistema GUI. En realidad, aquí el kit de herramientas de quiminformática CDK, en Java, es el más avanzado.

Pero estás en los conceptos básicos de cómo representar una molécula. Existen diferencias entre los modelos de datos de molécula pequeña y de molécula grande (proteína, ADN), pero dado que está interesado en SMILES, eso significa que está orientado a la molécula pequeña.

Puede consultar los documentos API para RDKit, OpenBabel, CDK, OEChem e Indigo, entre muchos otros. Eso le dará una idea de las diversas formas en que las personas desarrollan su API de clase. De estos, prefiero OEChem más, seguido de RDKit. Aunque OEChem es de código abierto, la API está en línea y es de fácil lectura, junto con ejemplos de uso.

En resumen, tenga una clase Molecule, con una lista de instancias de Atom y Bond. "mol.AddAtom (número de elemento)" crea un nuevo átomo, sin enlaces, "mol.AddBond (atom1, atom2, bond_type)" realiza una conexión de enlace. Cada enlace necesita conocer los átomos a los que está conectado, y cada átomo necesita una lista de enlaces. Esto lleva a muchos ciclos en la estructura de datos, pero es necesario para que varios algoritmos, como la búsqueda de conectividad, se puedan realizar en tiempo lineal.

No use una matriz 2D. Si bien es factible para una molécula pequeña, no se escala tan bien y no es necesario. Pocos algoritmos necesitan la matriz de conectividad, y se genera fácilmente si es necesario.

No tengo un "grupo funcional". Es muy especializado. Use algo como un "Subconjunto" o "Fragmento", que contiene la lista de átomos y enlaces que le interesan. De esa manera también puede manejar cosas como "átomos seleccionados" y "subestructura de anillo" y "andamio" haciendo referencia a El subconjunto específico.

Miré tu pastebin. El analizador no debería funcionar de esa manera. Debe separar el análisis de la estructura de su molécula real. Intenta algo como esto:

class Molecule(object):
    def __init__(self):
        self.atoms = []
        self.bonds = []
        self._atom_id = 0
        self._bond_id = 0
    def _next_atom_id(self):
        atom_id = self._atom_id
        self.atom_id += 1
        return atom_id
    def AddAtom(self, eleno):
        self.atoms.append(Atom(self, self._next_atom_id(), eleno))
    def AddBond(self, atom1, atom2, bondtype):
        assert atom1.molecule is atom2.molecule
        self.bonds.append(Bond(self, self._next_bond_id(),
                               atom1, atom2, bondtype))

class Atom(object):
    def __init__(self, molecule, id, eleno):
        self.molecule = molecule
        self.id = id
        self.eleno = eleno
        self.charge = 0
        self.isotope = 0
   ..

y luego el analizador para una cadena lineal simple como "CC O" es:

def parse_linear_chain(text):
   mol = Molecule()
   prev_atom = None
   for atom_symbol in text.split():
     eleno = lookup_symbol[atom_symbol]
     atom = mol.NewAtom(eleno)
     if pre_atom is not None:
       mol.AddBond(prev_atom, atom, 1)
     prev_atom = atom
   return mol

Por supuesto, un analizador SMILES completo es mucho más complicado que esto, y el modelo de datos completo tiene que manejar cosas como los recuentos de hidrógeno, que a menudo son implícitos.

Las listas de correo de OpenBabel, RDKit y CDK también son buenos lugares para ir, en caso de que decida utilizar uno de esos juegos de herramientas. También está el sitio de preguntas y respuestas "Blue Obelisk", alojado por Shapado.


1

Otro enfoque para comenzar podría ser echar un vistazo a algún código que ya hace algo relacionado con su problema. En ese caso, su ejercicio podría terminar en algún otro programa, y ​​eso sería bueno, ¿no?

Los programas que pueden ser de su interés son

  • El paquete de simulación MD y modelado molecular MMTK (como ya sugirió Nate arriba)

  • El paquete de visualización PyMol


1

Aprender los detalles de un sistema de objetos moleculares es una forma maravillosa para que los químicos aprendan programación orientada a objetos. Encontrará que la implementación de dicho sistema refinará sus intuiciones moleculares. Debes pensar un poco sobre los átomos, las moléculas y quizás las colecciones de moléculas en términos de atributos y métodos.

Aquí hay algunas diapositivas de Python (un poco más antiguas) que pueden ayudar: http://www.wag.caltech.edu/home/rpm/python_course/Lecture_4.pdf

Para verificar su trabajo: además de openbabel (que tiene enlaces de python) y MMTK, hay ELBOW en phenix.

Para el políglota en ti, también está PerlMol (Perlmol.org). PerlMol está escrito en perl orientado a objetos y se puede descargar desde CPAN.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.