Je ne sais pas si il vaut mieux poser cette question dans la section bioinfo étant donné que le problème est algorithmique et non lié à la biologie.
$dna_sbjct = '54549 TAATATGTGCATGTAGA 54565\n';
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Query 2 TAATATGTGCATGTAGA 17 ||||||||||| | ||| Sbjct 54549 TAATATGTGCACGAAGA 54565
$dna_query = 'Query 2 TAATATGTGCATGTAGA 17\n';
($dna_query => start : 2 end : 17)
J'aimerais vérifier que sur les 5 premières lettres de $dna_query il y ait au minimum 4 appariements avec les 5 premières lettres de $dna_sbjct. Dans ce cas-ci, la séquence commence au second nucléotide donc on ne prend que les 4 premières lettres. Il faut donc vérifier ici que TAATA de $dna_sbjct soit identique à TAATA de $dna_query. La complication vient quand Query commence à 1, je dois prendre les 5 premières lettres et vérifier que sur 5 lettres au maximum 4 sont identiques par rapport à $dna_sbjct.
Reste également la possibilité d'utiliser la ligne de pipes et non celles des ADN mais c'est assez risqué étant donné que je dois vérifier la position des pipes par rapport au ADN afin d'être certaine de commencer au 1ier.
Y aurait-il moyen d'optimaliser ce code?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 $alignment .= $line; $dna_sbjct = $line; # vérification que les 5 premiers ou les 5 derniers nucléotides de notre amorce (dna_sbjct) # ne s'apparie pas à plus de 80% (5 nucléotides sur les 4) if($dna_query =~ /([12])\s+([ATCG]+)\s+/){ my $start_q = $1; # index du premier match du query : 1 ou 2 (index 0) my $dna_q = $2; # substr jusqu'au 5ième nuc 1 : sub 0-4 (1ier au 5ième nuc) ou 2 : 0-3 (second au 5ième) my ($dna_s) = ($dna_sbjct =~ /\s+([ATCG]+)\s+/); my $reject = 0; # on doit vérifier qu'il n'y ait pas 4 matches parfaits du second # au 5ième nucléotide (80% identité sur les 5 premiers nuc) if($start_q == 1){ my $first5_q = substr($dna_q, 0, 4); my $first5_s = substr($dna_s, 0, 4); if ($first5_q eq $first5_s){ $reject = 1; } } # on doit vérifier qu'il n'y ait pas 4 matches parfaits entre le premier # et le 5ième nucléotide (80% identité sur les 5 premiers nuc) elsif($start_q == 2){ my @first5_q = split('', substr($dna_q, 0, 5)); my @first5_s = split('', substr($dna_s, 0, 5)); my $score = 0; for (my $i=0; $i<5; $i++){ $score++ if($first5_q[$i] eq $first5_s[$i]); } if($score>4){ $reject = 1; } }
Merci pour votre aide.
Partager