IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bioinformatique Perl Discussion :

problème de comparaison d'association de deux données entre deux fichiers


Sujet :

Bioinformatique Perl

  1. #21
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par benlh Voir le message
    juste un défaut : si une association ID_contig/ID_oligo existe dans le fichier résultat du blast avec un ID_contig non présente dans le fichier d'origine des associations ID_contig/ID_oligo, celle-ci n'apparait plus dans plus le fichier OUT. Je pense qu'il faudrait ajouter une catégorie KO qui rende compte de ce cas de figure même si a priori il ne devrait pas exister à cause de la construction des banques de séquences restreintes.
    Oui, c'est exactement la remarque que j'avais faite précédemment
    Citation Envoyé par Jasmine80 Voir le message
    Le problème de vouloir que la liste des oligos associés aux contigs soit exactement la même dans les deux fichiers risque de poser problème si les paramètres de blast ont été mal réglés. Si Blast pour un contig trouve ne fusse qu'un hit de plus ou de moins que ce qui se trouve dans le fichier OLIGO ... cela sera donc considéré comme une différence d'oligos associés à ce contig.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    		# on regarde si la liste des oligos qui se sont blastés à ce contig (fichier CONTIG)
    		# est la même que celle qui ont été trouvées dans le fichier OLIGO.		
    		my $lc = List::Compare->new(\@{$oligo_tab{$contig}}, \@{$contig_tab{$contig}});
     
    		# @LorRonly est la liste des oligos n'apparaissant que dans un seul des 2 array
    		# il doit donc être nul afin de conclure que les listes des oligo associés à un 
    		# même contig dans les 2 fichiers d'entrées sont les mêmes
    		my @LorRonly = $lc->get_symmetric_difference;
    @LorRonly est la liste des oligos n'apparaissant que dans un seul des 2 array mais va regarder les autres fonctions du module ListCompare. Tu peux également analyser les listes des oligo et récupérer l'union, l'intersection des 2 listes, les items présents que dans la liste 1 ou ceux n'étant présents que dans la liste 2 ... tu pourras donc ainsi vérifier que dans tes résultats blast tu aies bien toutes les paires d'origine mais également accepter qu'il y en ait des nouvelles.
    -- Jasmine --

  2. #22
    Nouveau Candidat au Club
    Inscrit en
    Février 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 14
    Points : 1
    Points
    1
    Par défaut
    Désolé, dans l'empressement je n'avais pas fait très attention à cette remarque que tu avais déjà faite. D'après ce que tu dis, l'utilisation du module List::Compare ouvre beaucoup de possibilités. Il va falloir que je me penche dessus plus en détails.

    Sinon, j'ai poursuivi mon script et ai réussi (avec un peu d'aide là aussi) à faire tourner quelque chose de correct. Voulà ce que ça donne :

    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
    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);

  3. #23
    Nouveau Candidat au Club
    Inscrit en
    Février 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 14
    Points : 1
    Points
    1
    Par défaut
    je me suis planté sur la variable booléenne : c'est pour faire le tri sur les ID_oligo associés à chaque ID_contig (clé) trouvé dans les deux hash

Discussions similaires

  1. Comparaison de données entre deux tables
    Par da_latifa dans le forum Développement
    Réponses: 3
    Dernier message: 29/07/2014, 16h16
  2. [XL-2003] Comparaison données entre deux feuilles
    Par ivanG dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 30/05/2014, 09h51
  3. Comparaison de données entre deux bases
    Par Soussou33 dans le forum Sql Developer
    Réponses: 2
    Dernier message: 14/04/2014, 09h56
  4. Réponses: 4
    Dernier message: 19/11/2010, 16h42
  5. Comparaison de données entre deux arrays
    Par sironimo dans le forum Général Dotnet
    Réponses: 6
    Dernier message: 20/04/2006, 17h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo