slt,
j'ai un petit problème avec les tableau à deux dimensions. En fait je fais un alignement de séquences avec clustalw et j'obtiens un fichier j'ai mis une version simplifié en piece jointe (il n'y a que 4 alignements mais en fait dans mon cas il y en a au moins 30). je dois en déduire une séquence concensus. Pour cela j'ai eu l'idée d'un tableau à deux dimensions avec sur chaque ligne une sequence
ex :
AGTCTTGAC --> seq 1
ATGCTAGCC --> seq 2
et pour en déduire la séquence concensus je lit ce tableau par colonne en comptant le nombre de chaque base et en déduit la base la plus présente.
voici mon code
avec @liste une liste contenant les numéros d'accession correspondant à ceux du fichier.
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92 #!/usr/bin/perl use strict; use warnings; use Cwd; use Bio::DB::GenBank; use Bio::SeqIO; use File::Copy; use Time::localtime; use Bio::Tools::Run::Alignment::Clustalw; use Bio::Perl; open (TEST, ">>test") || die "cannot open file"; open (FILE, "ClustalW_result.txt") || die "cannot open file"; my @liste=("NC_003888.3","AL939106.1","NM_016286.2","AB013846.1"); foreach (@liste) { $n=$_; while (<FILE>) { if (/^accession_$n/) { $ligne3=$_; chomp $ligne3; @ligne=split(/accession_$n\s+/,$ligne3); $ligne2=join("",@ligne); $ligne.=$ligne2; @tab=split("",$ligne); } $taille=$#tab; for ($i=0;$i<=$#liste;$i++)#remplis le tableau { for ($j=0;$j<=$taille;$j++) { $test[$i][$j]=$tab[$j]; } } } } #print "$test[28][5]"; for ($j=0;$j<=$taille;$j++)# lecture par colonne et compte { $c=0;$g=0;$p=0;$a=0;$t=0; for ($i=0;$i<=$#liste;$i++) { if ($test[$i][$j]=~m/\./i) { $p++; } if ($test[$i][$j]=~m/A/i) { $a++; } if ($test[$i][$j]=~m/T/i) { $t++; } if ($test[$i][$j]=~m/C/i) { $c++; } if ($test[$i][$j]=~m/G/i) { $g++; } } if ($p>$a && $p>$t && $p>$c && $p>$g)#comparaison et impression { print TEST "."; } if ($a>$p && $a>$t && $a>$c && $a>$g) { print TEST "A"; } if ($t>$a && $t>$p && $t>$c && $t>$g) { print TEST "T"; } if ($c>$a && $c>$t && $c>$p && $c>$g) { print TEST "C"; } if ($g>$a && $g>$t && $g>$c && $g>$p) { print TEST "G"; } } print TEST "\n";
je ne sais pas si ma solution est la mieux adaptée dans mon cas pour faire ce que je dois faire. si vous trouvez que ce n'est pas le cas, je suis ouverte à toutes propositions et remarques ^^
merci
Partager