#!/usr/bin/perl
##########################################################
#Script para realizar busquedas en bases de secuencias de ADN o proteinas
#Diego Mauricio Riaño Pachón, Instituto de Biotecnología Universidad Nacional de Colombia, 2002
#
#Es una version modificada de:
#
#Script to do blast searches on database sequences for WWW
#Steven Jones, Sanger Centre, 1995.
##########################################################
&output_header;
#Recibir los datos desde un formulario
read(STDIN, $entrada, $ENV{'CONTENT_LENGTH'});
#descomponer el mensaje recibidor por el formulario y asignar los valores a las variables correspondientes
foreach (split(/\&/,$entrada)){
($clave,$valor)=split(/=/,$_);
$parametro{$clave}=$valor;
}
#eliminar caracteries extraños en las variables de interes
#
if ($parametro{formatosecuencia} eq "textoplano"){
$parametro{secuencia}=~s/%3E/>/;
$parametro{secuencia}=~s/%0D%0A//g;
$parametro{secuencia}=~s/>/\n/g;
$parametro{secuencia}=~s/%/\n/g;
$parametro{secuencia}=~s/[0123456789]//g;
$parametro{secuencia}=~s/ //g;
$parametro{secuencia}=~s/\+//g;
}
else {
if ($parametro{secuencia}=~/%/){
print "
Con el formato seleccionado solo puede ingresar una línea en el cuadro de texto
";
exit;
}
else {
$parametro{secuencia}=~s/\+//g;
}
}
$parametro{basededatos}=~s/%2F/\//g;
$parametro{basededatos}=~s/%3A/:/g;
$parametro{basededatos}=~s/\+/ /g;
$parametro{email}=~s/%40/@/g;
#Revisar que el tipo de programa seleccionado corresponda con la base de datos seleccionada
if ($parametro{programa} eq "") {
print "Error: No especificó el programa Blast!!!!<\H2>";
exit;
}
elsif (($parametro{programa} eq "blastp" || $parametro{programa} eq "blastx") && ($parametro{basededatos}!~/^swissprot/ && $parametro{basededatos}!~/^swissprot/)) {
print "Con el programa \"$parametro{programa}\" debe realizar la búsqueda en las base de datos de proteínas (SwissProt o SwissProt/TrEMBL/TrEMBL_NEW/Varsplic)!!!!<\H2>";
exit;
}
elsif (($parametro{programa} eq "blastn" || $parametro{programa} eq "tblastn" || $parametro{programa} eq "tblastx") && ($parametro{basededatos}=~/^swiss/)){
print "Con el programa \"$parametro{programa}\" debe realizar la búsqueda en las bases de ADN!!!!<\H2>";
exit;
}
elsif (($parametro{programa} eq "tblastx" || $parametro{programa} eq "tblastn") && $parametro{email} eq "none"){
print "Con el programa \"$parametro{programa}\" debe especificar su dirección de correo electrónico<\H2>";
exit;
}
#Revisar la existencia de la secuencia o de un Numero de Acceso y hacer lo necesario para trabajar con eso
if ($parametro{secuencia} eq ""){
print "Error: No ingresó ninguna secuencia!!!!<\H2>";
exit;
}
if ($parametro{formatosecuencia} eq "textoplano"){
open (dna, ">/tmp/temp$$") || print " Error: Es imposible crear el archivo temporal, intente de nuevo mas tarde
";;
select((select(dna),$|=1)[0]);
#Es necesario que la secuencias se encuentre en formato fasta
if ($first!=1) {
if ($parametro{secuencia}=~/^>/) {
$first=1;
}
else {
print dna ">SIN NOMBRE\n";
}
;$first=1;
}
print dna "$parametro{secuencia}\n";
close dna;
}
elsif ($parametro{formatosecuencia} eq "swiss"){
&traersecuencia($parametro{formatosecuencia},$parametro{secuencia})
}
elsif ($parametro{formatosecuencia} eq "trembl"){
&traersecuencia($parametro{formatosecuencia},$parametro{secuencia})
}
elsif ($parametro{formatosecuencia} eq "embl"){
&traersecuencia($parametro{formatosecuencia},$parametro{secuencia})
}
else {}
#Ejecutar el proceso BLAST, en este caso se ejecuta un cliente blast que envia la peticion a un servidor dentro del mismo Instituto de Biotecnología, esta linea se puede modificar para utilizar BLASt en el mismo equipo (standalone)
system("/usr/local/bin/blastall.remote -P 5556 -B $parametro{email} -p $parametro{programa} -d \"$parametro{basededatos}\" -i /tmp/temp$$ -m $parametro{alinOpt} -F $parametro{Filtro} -G $parametro{AbrirGap} -E $parametro{ExtenderGap} -q $parametro{NucPen} -r $parametro{NucRec} -v $parametro{descripciones} -b $parametro{alineamientos} -f $parametro{Threshold} -g $parametro{Gapped} -M $parametro{matriz} 2>&1 > /tmp/saltemp$$");
if ($parametro{email}=~"none"){
print "";
system("/usr/local/bin/html4blast.BlastServer -go /usr/local/httpd/htdocs/servicios/BLAST/tmp/blast$$.html /tmp/saltemp$$");
open BLAST, "/usr/local/httpd/htdocs/servicios/BLAST/tmp/blast$$.html";
@blastlineas=;
foreach $lineablast(@blastlineas){
print "$lineablast";
}
}
else {
print "
Los resultados de la búsqueda serán enviados a:
$parametro{email}
\n";
}
#Remover archivos temporales
unlink "/tmp/temp$$";
unlink "/tmp/saltemp$$";
#########################################################
#SUBROUTINES
#########################################################
#Subrutina para recuperar secuencias de las bases de datos empleando seqret
sub traersecuencia{
($basedatos,$secuencia)=@_;
system("/usr/local/BioMol/emboss/bin/seqret $basedatos:$secuencia -auto -stdout > /tmp/temp$$");
if ($?!=0){
print "La secuencia $secuencia no se encuentra en la base de datos $basedatos
";
exit;
}
}
#subrutina para imprimir un encabezado
sub output_header {
print <
Grupo de Bioinformática - Instituto de Biotecnología -UNAL
INSTITUTO DE BIOTECNOLOGÍA
GRUPO DE BIOINFORMÁTICA
Servidor BLAST
Resultados de la búsqueda
EOM
}