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.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
Query  2      TAATATGTGCATGTAGA  17
              ||||||||||| | |||
Sbjct  54549  TAATATGTGCACGAAGA  54565
$dna_sbjct = '54549 TAATATGTGCATGTAGA 54565\n';
$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.


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;
					}
				}
Y aurait-il moyen d'optimaliser ce code?


Merci pour votre aide.