2017-06-06 4 views
-2

Je travaille sur la génération d'une page HTML en utilisant un script CGI en Perl.Mettre en surbrillance un motif correspondant dans une séquence d'ADN avec le balisage HTML en utilisant Perl

J'ai besoin de filtrer certaines séquences afin de vérifier si elles contiennent un motif spécifique; si elles le contiennent, j'ai besoin d'imprimer ces séquences sur ma page avec 50 bases par ligne, et mettre en évidence le motif dans les séquences. Mes séquences sont dans un hachage appelé %hash; les clés sont les noms, les valeurs sont les séquences réelles.

my %hash2; 
foreach my $key (keys %hash) { 
    if ($hash{$key} =~ s!(aaagg)!<b>$1</b>!) { 
     $hash2{$key} = $hash{$key} 
} 
} 

foreach my $key (keys %hash2) { 
    print "<p> <b> $key </b> </p>"; 
    print "<p>$_</p>\n" for unpack '(A50)*', $hash2{$key}; 
} 

Cette méthode « ne » mais le travail si je souligne le modèle « aaagg » en utilisant cette méthode, je suis chambouler le déballage de la ligne (for unpack '(A50)*'); parce que maintenant les séquences contiennent les caractères supplémentaires des étiquettes en gras qui sont incluses dans le compte de décompression. Ceci à côté de faire des lignes de longueur différente c'est aussi un gros problème si l'étiquette tombe entre 2 lignes en raison du déballage de 50 caractères, elle reste fondamentalement ouverte et tout ce qui suit est en gras.

+1

Enregistrez la position et la longueur de la correspondance, décompressez-la, puis insérez les étiquettes aux bons endroits. ... Vous devez fournir des exemples de données utilisables et un script autonome. –

+0

Je suis désolé je pensais que le code que j'ai signalé était suffisant. J'ai enregistré la position et la durée des matchs; Comment déballer et insérer des étiquettes aux bons endroits? – Diesel

+0

Pour obtenir de l'aide sur la formulation d'une question, voir [MCVE] (https://stackoverflow.com/help/mcve). Voir aussi [ma réponse] (/ a/44394781/100754). –

Répondre

1

Le script ci-dessous utilise une seule séquence d'ADN générée aléatoirement de longueur 243 (générée en utilisant http://www.bioinformatics.org/sms2/random_dna.html) et un motif de longueur variable.

Il fonctionne en enregistrant d'abord les positions qui doivent être surlignées au lieu de changer la chaîne de séquence. La surbrillance est insérée après la division de la séquence en blocs de 50 bases.

La mise en surbrillance est effectuée dans l'ordre inverse afin de minimiser le travail chargé en comptabilité.

#!/usr/bin/env perl 

use utf8; 
use strict; 
use warnings; 
use YAML::XS; 

my $PRETTY_WIDTH = 50; 

# I am using bold-italic so the highlighting 
# is visible on Stackoverflow, but in real 
# life, this would be something like: 
# my @PRETTY_MARKUP = ('<span class="highlighted-match">', '</span>'); 

my @PRETTY_MARKUP = ('<b><i>', '</i></b>'); 

use constant { BAŞ => 0, SON => 1, ROW => 0, COL => 1 }; 

my $sequence = q{ccggtgagacatccagttagttcactgagccgacttgcatcagtcatgcttttccccgtaatgagggccccatattcaggccgtcgtccggaattgtcttggatccggaatgcagcttttctcaccgcttgatgaacattcactgaatatctgacgccgcgaaaacagggtcactagcctgtttccggtcgcccgagaccggcgagtttgtggtatcgcgagcgcccccgggcggtagggtct}; 

my $wanted = 'c..?gg'; 

my @pos; 

while ($sequence =~ /($wanted)/g) { 
    push @pos, [ pos($sequence) - length($1), pos($sequence) ]; 
} 

print Dump \@pos; 

my @output = unpack "(A$PRETTY_WIDTH)*", $sequence; 

print Dump \@output; 

while (my $pos = pop @pos) { 
    my @rc = map pos_to_rc($_, $PRETTY_WIDTH), @$pos; 
    substr($output[ $rc[$_][ROW] ], $rc[$_][COL], 0, $PRETTY_MARKUP[$_]) for SON, BAŞ; 
} 

print Dump \@output; 

sub pos_to_rc { 
    my $r = int($_[0]/$_[1]); 
    my $c = $_[0] - $r * $_[1]; 
    [ $r, $c ]; 
} 

Sortie:

C:\...\Temp> perl s.pl 
--- 
- - 0 
    - 4 
- - 76 
    - 80 
- - 87 
    - 91 
- - 97 
    - 102 
- - 104 
    - 108 
- - 165 
    - 170 
- - 184 
    - 188 
- - 198 
    - 202 
- - 226 
    - 231 
--- 
- ccggtgagacatccagttagttcactgagccgacttgcatcagtcatgct 
- tttccccgtaatgagggccccatattcaggccgtcgtccggaattgtctt 
- ggatccggaatgcagcttttctcaccgcttgatgaacattcactgaatat 
- ctgacgccgcgaaaacagggtcactagcctgtttccggtcgcccgagacc 
- ggcgagtttgtggtatcgcgagcgcccccgggcggtagggtct 
--- 
- ccggtgagacatccagttagttcactgagccgacttgcatcagtcatgct 
- tttccccgtaatgagggccccatattcaggccgtcgtccggaattgtctt - ggatccggaatgcagcttttctcaccgcttgatgaacattcactgaatat 
- ctgacgccgcgaaaacagggtcactagcctgtttccggtcgcccgagacc - ggcgagtttgtggtatcgcgagcgcccccgggcggtagggtct

D'autant plus que cela se révèle avoir été un devoir, il est maintenant à vous de prendre cela et l'appliquer à toutes les séquences dans votre table de hachage.