Desde hace tiempo tenemos la capacidad tecnológica de construir circuitos genéticos para que las células respondan a las señales que nosotros pongamos en su entorno y así generar la respuesta metabólica que nosotros deseemos. Es decir, podemos rediseñar los sistemas biológicos naturales ya existentes para que hagan algo útil que nosotros queramos. Un paso más en la revolución biotecnológica actual. Evidentemente el primer paso para construir un circuito genético es diseñarlo. Hay varias formas de hacerlo pero una de las más sencillas es la descrita por el grupo liderado por Christopher A. Voight. En el 2016 publicó el artículo “Genetic circuit design automation” (DOI: 10.1126/science.aac7341) en el que se describía la web Cello (www.cellocad.org). Esta web es un entorno virtual en el que se aplican los principios del diseño de circuitos electrónicos basados en la lógica booleana para generar circuitos genéticos. Para ello usa un lenguaje de programación usado por los ingenieros electrónicos, el lenguaje Verilog, para el diseño de puertas lógicas del tipo NOT/NOR. Ese tipo de puertas lógicas tiene su equivalente biológico en los sistemas de proteínas represoras/activadoras de la transcripción. En el artículo además describían el desarrollo de una librería de "biobricks" que representaban a esas puertas lógicas y que podían ser interconectadas para formar el circuito genético que quisiéramos. Una vez diseñado el circuito genético el entorno Cello te proporciona la secuencia de DNA completa de dicho circuito, cómo debe diseñarse el plásmido donde clonar el circuito, los resultados esperados en el nivel de expresión de la proteína actuadora por número de células, etc. Todo listo para clonar en E. coli y que el circuito funcione. En el siguiente vídeo el propio Christopher A. Voight explica con detalle lo que hicieron.
Pues bien, este año he considerado que había que introducir algo más de Biología Sintética en el temario de la asignatura de Microbiología Industrial que se imparte en 2º curso del grado de Biotecnología de la UMH. Así que decidí que aprender a usar el entorno Cello podía ser una práctica de informática bastante interesante. Los resultados de la experiencia está comentada en el blog de la asignatura, aquí lo que voy a comentar es cómo me he manejado con dicho entorno y cuál es su potencial como herramienta para diseñar circuitos genéticos.
Como he dicho antes el entorno Cello utiliza el lenguaje de programación Verilog, y si uno se mira algo de dicho lenguaje lo primero que piensa es que no va a poder entenderlo. Sin embargo es más sencillo de lo que parece ya que en realidad los circuitos biológicos no son tan variados como los circuitos electrónicos así que uno puede hacerse unas "plantillas" con los programas que vienen descritos en el artículo de Voight (más abajo he puesto dos ejemplos). En dicho artículo se describen 45 circuitos genéticos distintos que han comprobado que funcionan in vivo. Lo siguiente que tiene que hacer el usuario de Cello es establecer las condiciones previas (en el entorno Cello se denominan UCF por “user constraints file”) como son el tipo de microorganismo que se va a usar, qué tipo de sensores va a disponer - ej: presencia/ausencia de arabinosa - y finalmente qué tipo de “actuador” - ej: expresión de Proteína Verde Fluorescente - está bajo el control del circuito genético que va a diseñarse. Una vez establecidas estas condiciones previas, se debe de establecer la llamada “tabla de la verdad” del circuito lógico. Esa tabla se introduce en la plantilla Verilog que le corresponda. Una vez hecho esto, el entorno Cello diseña automáticamente la secuencia de DNA que codifica para el circuito deseado. También hay que decir los problemas. El primero es que el servidor es bastante lento (lo cual es un problema para la realización de una práctica). El segundo es que el correo de asistencia técnica no funciona (o al menos a mí nunca me han respondido).
El trabajo del grupo de Voight no es interesante solo por el hecho de haber desarrollado el entorno Cello. Lo más interesante es que han conseguido aislar cada una de las "puertas lógicas genéticas" para que no se produzcan cortocircuitos. En un circuito electrónico es fácil aislar los diodos y los resistores y construir el circuito en dos dimensiones. La electricidad recorre el material conductor y ya está. Pero en los circuitos genéticos todos los componentes están en una dimensión y están hechos del mismo material (DNA y proteínas). En un ser vivo las señales de entrada/salida (inputs/outputs) no son electrones, son flujos de la RNA polimerasa. T las puertas lógicas NOT/NOR no son diodos o resistores, son genes, promotores, proteínas represoras, secuencias de unión de ribosomas, y se aíslan entre si gracias a terminadores de transcripción fuertes. De esa forma se puede intercambiar entre sí y así construir circuitos complejos. Algunos de ellos están compuestos por 10 reguladores y 55 partes y su funcionalidad es del 92% de lo predicho.
La Puerta NOR representada con el símbolo ANSI de la esquina superior izquierda, es una puerta lógica que implementa la disyunción lógica negada. Esto quiere decir que se comporta de acuerdo a la tabla de verdad mostrada debajo de dicho símbolo. En la parte inferior izquierda se muestra la programación en Verilog de dicha puerta. Nótese como están codificadas las entradas y las salidas (por ejemplo la entrada "0,0" y salida "1" es la línea 2'b00: {out} = 1'b1; ). En la parte central se representa el diagrama electrónico en la parte superior y la disposición física CMOS en un circuito integrado. A la derecha se representa el circuito genético completo que codifica para la puerta NOR. Hay dos genes sensores, los represores LacI y TetR (arriba), la puerta NOR que consiste en el gen del represor PhlF bajo el control de los promotores Ptac y Ptet (centro) y el gen actuador o reporter (debajo) que consiste en una proteína fluorescente controlada por el promotor PPhlF. Los símbolos que aparecen siguen la normativa SBOL. Más detalles del funcionamiento en el texto.La imagen es una composición realizada a partir de material de la Wikipedia, del artículo de Voight et al. y del resultado del programa Cello |
Vamos a ver como se construye una puerta NOR con un circuito genético. En la imagen de arriba está representado el circuito. Como vemos en la tabla de la verdad, la puerta NOR da un resultado de "1" cuando no hay ninguna entrada. Si hay alguna entrada, entonces la salida es "0". En el circuito biológico, los genes sensores son los represores LacI y TetR. Como vemos se están expresando constitutivamente luego esas proteínas siempre están presentes. En la situación "0,0" significa que no hay ningún estímulo y ambos represores se unen a los promotores Ptac y Ptet, impidiendo la transcripción del gen phlF que codifica para la proteína represora PhlF. Si nos fijamos ahora, el gen de la proteína YPF (Yellow Fluorescent Protein) está bajo el control del promotor PPhlF. Como no está reprimido, entonces la proteína YPF se está expresando y la bacteria brillará con luz amarilla (salida "1"). ¿Qué ocurre si hay un estímulo o entrada (situación "1,0")? es decir ¿qué ocurre si hay IPTG? Pues que el represor LacI queda inactivado y el promotor Ptac ahora puede ser usado por la RNApolimerasa para expresar el gen PhlF (basta con que haya un promotor libre para que el gen se exprese). Como ahora hay proteína represora PhlF, ésta se une al promotor PPhlF impidiendo la expresión de la proteína YPF, con lo cual la bacteria no brillará con luz amarilla (salida "0"). Lo mismo ocurre si añadimos tetraciclina (situación "0,1"), o ambos estímulos (situación "1,1"). Esta puerta NOR ahora puede ser considerada como un "biobrick" funcional.
Lo que puede hacerse es ir conectando varias de dichas puertas lógicas e ir creando circuitos genéticos cada vez más complicados. Pero claro, hay que evitar que los diferentes componentes de los circuitos - recordemos que son DNA y proteínas - se estén estorbando entre sí ya que todos ellos están dentro de la sopa que es el citoplasma de la célula. Ese es precisamente el mayor mérito que tiene el trabajo del grupo de Voight. Que han diseñado 60 circuitos con distintos "biobricks" y que han comprobado que 45 de ellos funcionan de la manera esperada. Y los "biobricks" que forman dichos circuitos funcionales han sido almacenados en una librería que es la que usa Cello para diseñar los circuitos genéticos que nosotros introduzcamos.
Cómo usar Cello. El primer paso consiste en realizar el programa con la "tabla de verdad" del circuito lógico en lenguaje Verilog. Después se añaden las condiciones previas o UCFs (genes sensores, genes actuadores, cepa de E. coli). El entorno Cello construye dicho circuito y a su vez lo transforma en una secuencia de genes utilizando para ello los "biobricks" que tiene en su librería. El programa te realiza una predicción de los resultados esperados indicando en que condiciones las células emitirán fluorescencia o no (gráficas de la derecha, líneas azules y rojas).Ahora solo queda construir el plásmido que lleva ese circuito e introducirlo en una cepa de E. coli que ya lleva los genes sensores y el gen actuador. El siguiente paso sería comprobar que efectivamente eso es lo que sucede al poner a dicha cepa de E. coli en las condiciones especificadas y ver si emite fluorescencia o no (gráficas de la derecha, curvas sólidas negras). Imagen realizada a partir de las figuras en el artículo de Voight et al. |
Este trabajo permite simplificar el desarrollo de una manipulación de las redes genéticas basada en módulos. Es un gran avance, pero hay más cosas a tener en cuenta. Hace poco Victor de Lorenzo comentó en Twitter que uno de los cuellos de botella de la Biología Sintética es la implementación in vivo de este tipo de circuitos complejos es la mutación y la evolución. Recordemos que lo que estamos haciendo es manipular a un ser vivo para que haga algo que nosotros queremos, no para que ese ser vivo haga algo que le permita sobrevivir y reproducirse. Un circuito integrado de una placa base no muta o evoluciona. Siempre va a ser un semiconductor en una placa de plástico. En un ser vivo, la mutación y la evolución pueden alterar esos circuitos genéticos, sobre todo cuanto más complejos sean, de forma tal que al final la evolución nos va a derrotar y vamos a perder esa información que hemos introducido. Quizás una forma de evitar el problema sea usar "sistemas libres de células". Otra posible solución sea que algún ingeniero bioquímico diseñe una DNA-polimerasa hipermejorada que tenga una tasa de error inferior a la de 1 error por cada 10.000 nucleótidos (o mejorar todo el sistema enzimático dedicado a evitar los errores de copia) y usar esa hiiperDNApol en un chasis celular diseñado exclusivamente para alojar ese tipo de enzima. Lo cierto es que esto es una paradoja biotecnológica. La mutación y la evolución pueden ser el mejor amigo de la biotecnología ya que permite el desarrollo de nuevos caracteres o habilidades biológicas (ver simplemente el premio Nobel de Química de este año). Pero también es el peor enemigo de la biotecnología porque causa la pérdida de esas habilidades. Ya veremos que nos depara el futuro.
(*)Hay una serie de vídeos realizados por el EMBL sobre Biología Sintética en los que se pueden explorar los diversos campos en los que esta disciplina está involucrada
Plantillas para módulos de Cello.
Como he dicho más arriba, aquí dejo unas plantillas para diseñar módulos que puedan ser usados el entorno Cello. Basta sustituir el valor de los "0" por los valores de la tabla de verdad que deseamos para nuestro circuito (en la puerta NOR sería 1,0,0,0), copiar el programa y pegarlo en la ventana de Cello. También puede cambiarse la "A" por el nombre del módulo con el que queramos bautizar al programa (por ejemplo module NOR). He puesto dos plantillas .
Plantilla: 2 entradas, 1 salida
module A(output out1, input in1, in2);
always@(in1, in2)
begin
case({in1,in2})
2'b00: {out} = 1'b0;
2'b01: {out} = 1'b0;
2'b10: {out} = 1'b0;
2'b11: {out} = 1'b0;
endcase
end
endmodule
Plantilla: 3 entradas, 1 salida
module A(output out1, input in1, in2, in3);
always@(in1,in2,in3)
begin
case({in1,in2,in3})
3'b000: {out1} = 1'b0;
3'b001: {out1} = 1'b0;
3'b010: {out1} = 1'b0;
3'b011: {out1} = 1'b0;
3'b100: {out1} = 1'b0;
3'b101: {out1} = 1'b0;
3'b110: {out1} = 1'b0;
3'b111: {out1} = 1'b0;
endcase
end
endmodule