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 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
|
use strict;
use warnings;
#---------------------------------------------------------#
# DECLARATION DES VARIABLES
#---------------------------------------------------------#
my ($lineB,$contig,$oligoA,$oligoB,$lineA,$query_name,$hit_name);
my (@elmtsA,@elmtsB);
my %contigA2oligoA; #hash liant ID_oligo/ID_contig avant blast
my %contigB2oligoB; #hash liant ID_oligo/ID_contig après blast
my %oligoB2dseablast; #hash liant chaque ligne du fichier blast à son ID_oligo pour construire le fichier OUT
#création et ouverture du fichier résultats
open OUT, "> oligo_contig_perfect.txt" or
die "Unable to open oligo_contig_perfect file : $!\n";
#---------------------------------------------------------#
# PARTIE 1 RECUPERATION DES DONNEES DU FICHIER OLIGO
# ET STOCKAGE DES DONNES DANS %contigA2oligoA;
#---------------------------------------------------------#
#ouverture du fichier d'associations ID_oligo/ID_contig par le biais des ID_genbank
open ASSO, "< oligo_otherV6.txt" or
die "Unable to open input file #2 : $!\n";
# saut du header
while ($lineA=<ASSO>) {
if ($lineA =~ /^#/) {#Header
next;
}
#extraction des données ligne par ligne
chomp $lineA;
#splitage de chaque ligne dans le tableau elmtsA et mise en mémoire uniquement des ID_oligo et ID_contig dans les variables $oligoA et $contig
@elmtsA=split "\t", $lineA;
$contig=$elmtsA[0];
$oligoA=$elmtsA[4];
#mémorisation dans la table de hachage des associassions ID_contig/ID_oligo sous les clés ID_contig
if (defined $contigA2oligoA{$contig}) {
$contigA2oligoA{$contig}=$contigA2oligoA{$contig}."\t$oligoA";
} else {
$contigA2oligoA{$contig}=$oligoA;
}
}
close (ASSO);
#---------------------------------------------------------#
# PARTIE 2 RECUPERATION DES DONNEES DU FICHIER CONTIG
# ET STOCKAGE DES DONNES DANS %contig_tab;
#---------------------------------------------------------#
#ouverture du fichier de résultats des blasts
open ASSO, "< blastn-oligo_restrict_otherV6-contig_restrict_otherV6-1e-3-1e-3-1,1.csv" or
die "Unable to open input file #1 : $!\n";
# saut du header ou d'une ligne vide
## my $noLine=0; ## inutile de créer la variable $noLine, cette information est contenue dans $.
while ($lineB=<ASSO>) {
##$noLine++;
chomp $lineB;
##if ($lineB =~/^#/ || $noLine==1) {#Header
if ($lineB =~/^#/ || $. == 1)
print OUT "$lineB;match\n"; #création du header pour le fichier résulats
next;
}
#splitage des lignes et extraction des données à mémoriser
@elmtsB=split ";", $lineB;
$query_name=$elmtsB[0]; # =ID_oligo
$oligoB2dseablast{$query_name}=$lineB; # hash liant chaque ligne du fichier blast à son ID_oligo pour construire le fichier OUT
$hit_name=$elmtsB[4]; # =ID_contig
#enregistrement des associations ID_oligo($query_name)/ID_contig ($hit_name) dans le hash sous la clé ID_contig ($hit_name)
if (defined $contigB2oligoB{$hit_name}) {
$contigB2oligoB{$hit_name}=$contigB2oligoB{$hit_name}."\t$query_name";
} else {
$contigB2oligoB{$hit_name}=$query_name;
}
}
close (ASSO);
#---------------------------------------------------------#
# PARTIE 3 COMPARAISON DES VALEURS RECUPEREES
# ET ECRITURE DANS LE FICHIER OUT
#---------------------------------------------------------#
#lecture des données pour chaque clé (ID_contig) des dans le hash "blast"
foreach $contig (sort keys %contigB2oligoB) {
$lineB=$contigB2oligoB{$contig};
@elmtsB=split "\t", $lineB;
#vérification de la présence de l'ID_contig dans le premier hash
if (defined $contigA2oligoA{$contig}) {
$lineA=$contigA2oligoA{$contig};
@elmtsA=split "\t", $lineA;
#vérification des ID_oligo dans les deux hahs pour le même ID_contig
foreach $oligoB (@elmtsB) {
my $found=0; #variable booléenne pour faire le tri entre les clé présentes dans les deux hash (=1) ou seulement dans le hash "blast" (=0)
$lineB=$oligoB2dseablast{$oligoB};
foreach $oligoA (@elmtsA) {
if ($found==0 && $oligoA eq $oligoB){
print OUT "${lineB}OK\n"; #association exacte dans les deux hash=OK
$found=1;
}
}
if ($found==0) {
print OUT "${lineB}NA\n"; #association non vérifiée entre les deux hash mais avec des clés déclarées dans les deux hash=NA
}
}
#alternative si une nouvelle clé ID_contig est présente dans la table de hash "blast" et pas dans la première
} else {
foreach $oligoB (@elmtsB) {
$lineB=$oligoB2dseablast{$oligoB};
print OUT "${lineB}KO\n";
}
}
}
close(OUT); |
Partager