Análisis básico de cadenas de ADN y ARN. Programa en VC++.
Categoría: 1. Programación y electrónica.
Tal vez la primera aplicación a gran escala de las técnicas de programación fue su utilización para decodificar mensajes encriptados durante la segunda guerra mundial. Para los países involucrados era posible interceptar mensajes enviados por escrito o mediante señales de radio. Sin embargo, el tiempo que tomaba decodificarlos resultaba de vital importancia, ya que en ellos se podía anticipar el movimiento de tropas, la disponibilidad de pertrechos, víveres y combustibles y todo lo que una cadena de suministro necesita para sostener el avance en los frentes de batalla.
Cuando ya se conocía el código de encriptación, el siguiente paso era descifrar el mensaje, lo cual era realizado por un programa cargado en una computadora, de manera que descifrar un mensaje tomaba cosa de segundos. Claro, una vez conocido el código de encriptación, se interceptaba el mensaje, se enviaba al centro de cómputo, se capturaba el mensaje en el formato requerido por el programa, se corregían los posibles errores. Aún después de esto, se enfrentaba el reto de interpretar la información contenida en el mensaje. Como puede verse, la velocidad proporcionada en el descifrado del mensaje con el uso de programas computacionales, ayudaba a pasar más deprisa uno de los obstáculos más difíciles en la logística de inteligencia.
En tiempos de paz, estas técnicas son también de gran utilidad, ya que los utilizan los poderosos buscadores de internet, también la llamada minería de datos. Las técnicas comerciales realizan un seguimiento de las costumbres de sus clientes y posibles clientes, mediante el análisis de sus estilos de vida, incluyendo lo que leen y lo que escriben en internet. Esto lo podemos encontrar en una presentación sumamente amena en el libro "Los Numerati", de Stephen Baker (2009).
En la entrada "La epistemología en la práctica" publicada en este mismo blog en noviembre de 2013 se comentó un poco sobre la forma en que se logró encontrar el código de encriptación que traduce una secuencia de bases en el ADN a una secuencia de aminoácidos. En ese texto se comenta que cuando el físico inglés Francis Crick y el genetista norteamericano James Watson estudiaron la estructura del ADN a comienzos de la década de 1950, en Cambridge, Inglaterra, contaban con gran cantidad de información experimental sobre la estructura de los ácidos nucleicos que lo conforman así como con imágenes de difracción de rayos X del ADN, pero tuvieron que hacer un ejercicio primordialmente teórico para encontrar la forma en que esas moléculas se unen para poder después ser traducidas por los ribosomas a un código que permite la formación cadenas de aminoácidos y como producto final, las proteínas.
En otro ejemplo, el relativamente reciente desarrollo de las ciencias genómicas tuvo como base precisamente el entendimiento del código genético en su proceso de traducción a proteínas. De manera que la biología centró sus esfuerzos en el estudio de los genes, podría decirse que durante todo el siglo 20. De manera más o menos racional o más o menos empírica, el enfoque de los estudiosos de los genes ha modificado ligeramente su enfoque hacia el estudio de genomas completos. Este enfoque permite integrar el estudio de vías metabólicas desde la codificación genética de las enzimas que intervienen pasando por su transcripción y síntesis. Esto ha dado origen al campo de la Biología conocido como Proteómica. Esto permite un entendimiento completo y la posibilidad de utilizar en la práctica vías metabólicas de interés médico, agrícola, de la ingeniería de los alimentos, industria farmacéutica, industria química, fabricación de biocombustibles y en muchas otras áreas de interés, por supuesto en las investigaciones sobre evolución, migración, especiación y domesticación de especies. La evolución de las vías metabólicas es un área que se abre para su estudio, ya que en la actualidad se cuenta con técnicas experimentales que permiten reconstruir las cadenas de ADN y ARN de microorganismos y de sus ancestros. Las ribozimas se supone fueron las moléculas precursoras de las actuales enzimas, se ha comprobado experimentalmente la capacidad catalítica de la molécula e ARN. Las ribozimas son pequeñas enzimas de RNA con sitios de reconocimiento específicos, pero menos eficientes que las enzimas proteínicas; de hecho, muchas ribozimas ejercen su actividad catalítica solo una vez, después pierden estabilidad y se degradan. las ribozimas existen tanto en eucariontes como en procariontes y virus.
En la genética molecular, las técnicas de análisis de textos han sido de gran utilidad, ya que el análisis de largas cadenas de ADN o de ARN se puede hacer de manera automatizada, con gran nivel de precisión y cada vez con mayor rapidez. Una de las aplicaciones de mayor utilidad es en el alineamiento de pares de secuencias y de secuencias múltiples de ADN o ARN. Estas comparaciones tienen por objeto comparar dos secuencias de bases obtenidas por PCR en dos muestras independientes y corroborar si corresponden al mismo gen o segmento de ADN. Al ser procesos que dependen de la calidad de la muestra, se pueden tener ausencia de bases (deleciones), repeticiones de bases, bases yuxtapuestas (encimadas) y otras situaciones por las que las secuencias no tienen el 100% de coincidencia. Las técnicas de análisis permiten generar parámetros que indican el grado de coincidencia de las cadenas y ayudar a tomar una decisión dentro de un nivel de confianza conocido. Utilizando programas como ClustalW es posible obtener el estadístico 'p', que indica el grado de similitud entre dos cadenas de ADN. Si el valor de probabilidad 'p' es más cercano a cero, esto significa que las coincidencias encontradas se deben menos al azar, mientras que un valor de 'p' elevado (su valor máximo es 1.0) indicará que las coincidencias reales son pocas y el mayor porcentaje de sus similitudes se debe al azar. En Attwood y Smith, 2004, se pueden encontrar algunas de las técnicas y algoritmos aplicados al análisis de estas cadenas de bases.
Problema 1.
El programa que se desarrolló recibe una cadena primaria de bases de ADN. El análisis de la cadena consiste en obtener los siguientes datos:
- El número de bases de la cadena.
- Cadena complementaria de ADN, para la secuencia primaria (Replicación).
- Cadena de ARN correspondiente a la secuencia primaria (Transcripción).
Figura 1. Salida en la consola de Visual C++.
El reporte se despliega en la consola de VC++ y se envía a un archivo de texto en una unidad de memoria conectada en la PC del usuario.
Problema 2.
En un segundo programa se iniciará con una cadena de ARN para generar:
- Secuencia de aminoácidos que codifica, para una secuencia de ARN (Traducción).
- Secuencia de aminoácidos que codifica, para una secuencia de ARN (Traducción).
Problema 3.
En un tercer programa se iniciará con dos cadenas de ADN de la misma longitud para obtener:
- Grado de similitud entre dos cadenas de ADN.
Bibliografía.
Atwood, T.K. y D.J. Parry Smith. 2002. Introducción a la bioinformática. Editorial Prentice-Hall. Madrid, España.
Beas, Carlos; Daniel ortuño; y Juan Armendáriz. 2009. Biología molecular. Fundamentos y aplicaciones. MacGraw-Hill. México, D.F., México.
Bronson, G. J. 2007. C++ para ingeniería y ciencias. Segunda Edición. International Thomson Editores. México, D.F. México.
Beas, Carlos; Daniel ortuño; y Juan Armendáriz. 2009. Biología molecular. Fundamentos y aplicaciones. MacGraw-Hill. México, D.F., México.
Bronson, G. J. 2007. C++ para ingeniería y ciencias. Segunda Edición. International Thomson Editores. México, D.F. México.
Baker, Stephen. 2009. Numerati. Seix Barral.
Anexo. Código de programa.
// ADN_Secuencias_1.cpp: define el punto de entrada de la aplicación de consola.
//
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
char *adn_sequence = "atatagagctggcct";
char *complemento_adn;
int a,b,c;
void display_adn_sequence()
{
a=0;
std::cout << "The bases sequence of adn_secuencia is: \t";
while (adn_sequence[a] != '\0')
{
std::cout << adn_sequence[a];
a++;
}
std::cout << "\n";
}
void length_adn_sequence()
{
b=0;
while (adn_sequence[b] != '\0')
{
b++;
}
std::cout << "The lengh of sequence adn_secuencia is: \t" << b << "\n";
}
void complemento_adn_sequence()
{
c=0;
std::cout << "Complementary adn chain for adn_secuencia is: \n\t\t\t\t\t\t";
while (adn_sequence[c] != '\0')
{
switch (adn_sequence[c])
{
case 'a':
{
std::cout << 't';
// complemento_adn[c] = 't';
}
break;
case 't':
{
std::cout << 'a';
// complemento_adn[c] = 'a';
}
break;
case 'g':
{
std::cout << 'c';
// complemento_adn[c] = 'c';
}
break;
case 'c':
{
std::cout << 'g';
//complemento_adn[c] = 'g';
}
break;
default:
{
// std::cout << '-';
// complemento_adn[c] = '-';
}
}
c++;
}
}
void printDate()
{
SYSTEMTIME lt;
GetLocalTime(<);
printf("Local date is:\t\t\t\t\t %04d-%02d-%02d", lt.wYear, lt.wMonth, lt.wDay);
std::cout << "\n";
}
void printHour()
{
SYSTEMTIME lt;
GetLocalTime(<);
printf("Local time is:\t\t\t\t\t %02d:%02d:%02d:%03d", lt.wHour, lt.wMinute, lt.wSecond, lt.wMilliseconds, "\n");
std::cout << "\n";
}
int _tmain(int argc, _TCHAR* argv[])
{
printDate();
printHour();
display_adn_sequence();
length_adn_sequence();
complemento_adn_sequence();
std::cout << "\n\n";
return 0;
}