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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Février 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 14
    Par défaut problème de comparaison d'association de deux données entre deux fichiers
    Bonjour,
    J'essaie désespérément de vérifier si une association de deux chaines de caractères est correcte par rapport à une association originelle. Je m'explique :
    j'avais à l'origine un fichier (tad delimited txt) avec plusieurs colonnes de données dont deux m'intéressaient. Une colonne "oligo" et une colonne "contig" qui définissaient une association d'un oligo à son contig. Pour vérifier la spécificité de cette association, j'ai extrait les listes d'oligos et de contigs pour ensuite générer deux banques de séquences à comparer par blastn. Je récupère alors un fichier csv contenant les meilleurs hits pour chaque oligo. Dans ce fichier j'ai bien une colonne "oligo", une colonne "contig" et d'autres colonnes sur les qualités d'alignements. Je voudrais maintenant vérifier si ces "nouvelles" associations oligo/contig sont les mêmes qu'au départ.

    Pour cela j'ai voulu faire une comparaison de clés de table de hachage pour générer un fichier identique au fichier csv de résultats des blast mais avec une colonne de plus qui indique une bonne (OK) ou une mauvaise (NA) correspondance oligo/contig par rapport aux données d'origine.
    Finalement mon idée ne marche pas, ça a l'air de déconner au niveau du dernier test car je me retrouve avec le bon fichier de sortie mais avec que des OK ou que des NA.

    Si quelqu'un peu m'aider je lui en serai reconnaissant.
    Je joins mon script ci dessous :

    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
    use strict;
     
    my ($lineB,$contig,$oligo,$lineA,$query_name,$query_accession,$query_description,$query_length,$hit_name,$hit_accession,$hit_description,$hit_length,$score,$evalue,$hsp_number,$hsp_query_start,$hsp_query_end,$hsp_hit_start,$hsp_hit_end,$hsp_percent_identity,$direction);
    my (@elmtsA,@elmtsB);
    my %contig2oligo;
     
    open OLIGO, "< oligo_otherV6.txt" or
    	die "Unable to open input file #2 : $!\n";
    while ($lineB=<OLIGO>) {
    	chomp $lineB;
    	if ($lineB =~ /^#/) {#Header
    	    next;
      }
    	@elmtsB=split "\t", $lineB;
    	$contig=$elmtsB[0];
    	$oligo=$elmtsB[4];
    	if (defined $contig2oligo{$contig}) {
    		$contig2oligo{$contig}=$contig2oligo{$contig}."\t$oligo";
    		#$agilent2Oligos{$agilent}.="\t$oligo";
    	} else {
    		$contig2oligo{$contig}=$oligo;
    	}
    }
    close(OLIGO);
     
    open OUT, "> oligo_contig_perfect.txt" or
    	die "Unable to open oligo_contig_perfect file : $!\n";
     
    open CONTIG, "< blastn-oligo_restrict_otherV6-contig_restrict_otherV6-1e-3-1e-3-1,1.csv" or
    	die "Unable to open input file #1 : $!\n";
    my $noLine=0;
    while ($lineA=<CONTIG>) {
    	$noLine++;
    	chomp $lineA;
    	if ($lineA =~/^#/ || $noLine==1) {#Header
    	    print OUT "query_name\tquery_accession\tquery_description\tquery_length\thit_name\thit_accession\thit_description\thit_length\tscore\tevalue\thsp_number\thsp_query_start\thsp_query_end\thsp_hit_start\thsp_hit_end\thsp_percent_identity\tdirection\tmatch\n";
     
    	    next;
      }
    	@elmtsA=split ";", $lineA;
    	$query_name=$elmtsA[0];
      $query_accession=$elmtsA[1];
      $query_description=$elmtsA[2];
      $query_length=$elmtsA[3];
      $hit_name=$elmtsA[4];
      $hit_accession=$elmtsA[5];
      $hit_description=$elmtsA[6];
      $hit_length=$elmtsA[7];
      $score=$elmtsA[8];
      $evalue=$elmtsA[9];
      $hsp_number=$elmtsA[10];
      $hsp_query_start=$elmtsA[11];
      $hsp_query_end=$elmtsA[12];
      $hsp_hit_start=$elmtsA[13];
      $hsp_hit_end=$elmtsA[14];
      $hsp_percent_identity=$elmtsA[15];
      $direction=$elmtsA[16];
     
     
    	if (defined $contig2oligo{$hit_name}) {
     
    		$contig2oligo{$hit_name}=$contig2oligo{$hit_name}."\t$query_name";
    		#$agilent2Oligos{$agilent}.="\t$oligo";
    	} else {
    		$contig2oligo{$hit_name}=$query_name;
    	}	
      if ($contig2oligo{$contig}==$contig2oligo{$hit_name}){
        print OUT "$query_name\t$query_accession\t$query_description\t$query_length\t$hit_name\t$hit_accession\t$hit_description\t$hit_length\t$score\t$evalue\t$hsp_number\t$hsp_query_start\t$hsp_query_end\t$hsp_hit_start\t$hsp_hit_end\t$hsp_percent_identity\t$direction\tOK\n";
    	} else {
          print OUT "$query_name\t$query_accession\t$query_description\t$query_length\t$hit_name\t$hit_accession\t$hit_description\t$hit_length\t$score\t$evalue\t$hsp_number\t$hsp_query_start\t$hsp_query_end\t$hsp_hit_start\t$hsp_hit_end\t$hsp_percent_identity\t$direction\tNA\n";
      }
    }  
    close(CONTIG);
    close(OUT);
    Merci par avance.

    Benoit

  2. #2
    Membre habitué
    Inscrit en
    Février 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 14
    Par défaut
    je précise, j'ai un switch de résultats entre OK et NA quand je change l'opérateur d'égalité à la fin du script :
    == que des OK
    eq que des NA

  3. #3
    Membre habitué
    Inscrit en
    Février 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 14
    Par défaut
    ça y est mon test fonctionne mais j'ai un nouveau problème qui est que cette méthode me génère énormément de doublons. En gros, je passe de 2000 lignes de données à plus de 6 000 000...
    voilà le nouveau script si quelqu'un à une idée je suis preneur:

    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
    use strict;
     
    my ($lineB,$contig,$oligo,$lineA,$query_name,$query_accession,$query_description,$query_length,$hit_name,$hit_accession,$hit_description,$hit_length,$score,$evalue,$hsp_number,$hsp_query_start,$hsp_query_end,$hsp_hit_start,$hsp_hit_end,$hsp_percent_identity,$direction);
    my (@elmtsA,@elmtsB);
    my %contig2oligo;
     
    open OUT, "> oligo_contig_perfect.txt" or
    	die "Unable to open oligo_contig_perfect file : $!\n";
     
    open OLIGO, "< oligo_otherV6.txt" or
    	die "Unable to open input file #2 : $!\n";
    while ($lineB=<OLIGO>) {
    	chomp $lineB;
    	if ($lineB =~ /^#/) {#Header
    	    next;
      }
    	@elmtsB=split "\t", $lineB;
    	$contig=$elmtsB[0];
    	$oligo=$elmtsB[4];
    	if (defined $contig2oligo{$contig}) {
    		$contig2oligo{$contig}=$contig2oligo{$contig}."\t$oligo";
    		#$agilent2Oligos{$agilent}.="\t$oligo";
    	} else {
    		$contig2oligo{$contig}=$oligo;
    	}
     
    open CONTIG, "< blastn-oligo_restrict_otherV6-contig_restrict_otherV6-1e-3-1e-3-1,1.csv" or
    	die "Unable to open input file #1 : $!\n";
    my $noLine=0;
    while ($lineA=<CONTIG>) {
    	$noLine++;
    	chomp $lineA;
    	if ($lineA =~/^#/ || $noLine==1) {#Header
    	    ##print OUT "query_name\tquery_accession\tquery_description\tquery_length\thit_name\thit_accession\thit_description\thit_length\tscore\tevalue\thsp_number\thsp_query_start\thsp_query_end\thsp_hit_start\thsp_hit_end\thsp_percent_identity\tdirection\tmatch\n";
     
    	    next;
      }
    	@elmtsA=split ";", $lineA;
    	$query_name=$elmtsA[0];
      $query_accession=$elmtsA[1];
      $query_description=$elmtsA[2];
      $query_length=$elmtsA[3];
      $hit_name=$elmtsA[4];
      $hit_accession=$elmtsA[5];
      $hit_description=$elmtsA[6];
      $hit_length=$elmtsA[7];
      $score=$elmtsA[8];
      $evalue=$elmtsA[9];
      $hsp_number=$elmtsA[10];
      $hsp_query_start=$elmtsA[11];
      $hsp_query_end=$elmtsA[12];
      $hsp_hit_start=$elmtsA[13];
      $hsp_hit_end=$elmtsA[14];
      $hsp_percent_identity=$elmtsA[15];
      $direction=$elmtsA[16];
     
     
    	if (defined $contig2oligo{$hit_name}) {
     
    		$contig2oligo{$hit_name}=$contig2oligo{$hit_name}."\t$query_name";
    	} else {
    		$contig2oligo{$hit_name}=$query_name;
    	}	
     
      if ($contig2oligo{$contig} eq $contig2oligo{$hit_name}){
       print OUT "$query_name\t$hit_name\tOK\n";
    	} else {
          print OUT "$query_name\t$hit_name\tNA\n";
      }
    }
     
    }
    close(OLIGO);
    close(CONTIG);
    close(OUT);

  4. #4
    Membre habitué
    Inscrit en
    Février 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 14
    Par défaut
    finalement, fausse alerte, ça me génère des faux positifs...
    l'approche de comparaison des clés n'est peut être pas la bonne solution mais pour l'instant je n'ai pas d'autres idées. Pour l'instant je tâtonne en perl, ça ne fait qu'un mois que je m'y suis mis. Si quelqu'un pouvait m'aiguiller un peu ça m'aiderait.
    Merci d'avance.

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    ... sans commentaires dans ton script, c'est difficile de comprendre ce que tu veux faire. Pourrais-tu en rajouter, en expliquant bien ce que contient chaque fichier ainsi que ce que tu veux faire. Utilise les balises CODE afin de rendre ton script lisible.
    Pour vérifier la spécificité de cette association, j'ai extrait les listes d'oligos et de contigs pour ensuite générer deux banques de séquences à comparer par blastn.

    Fais-tu un blast en ligne (module RemoteBlast) ou en local (module StandaloneBlast)?

    Qu'entends-tu par générer 2 banques de séquences? La base de données de blast est-elle générée à partir de tes séquences ou est-elle en ligne? Je suppose que c'est en local, que tu blastes une à une tes séquences d'oligo versus une base de données blast crée à partir de tes séquences de contig.

    Puis tu récupères donc 1 fichier de résultat par séquence d'oligo? (nb il existe le module BoulderBlast permettant de lire un fichier output.blast sans devoir te casser la tête)

    Je récupère alors un fichier csv contenant les meilleurs hits pour chaque oligo. Dans ce fichier j'ai bien une colonne "oligo", une colonne "contig" et d'autres colonnes sur les qualités d'alignements. Je voudrais maintenant vérifier si ces "nouvelles" associations oligo/contig sont les mêmes qu'au départ.
    Pourquoi utiliser un fichier csv? Pourrais-tu montrer un exemple de lignes de ce fichier?


    Ce que je ferais.
    1) créer un hash $hash{oligo} = contig; # à condition que oligo soit unique
    2) faire un blast et récupérer le résultat dans un fichier output.blast
    3) utiliser RemoteBlast afin de lire le résultat facilement et comparer avec ce que tu as dans $hash{oligo}

  6. #6
    Membre habitué
    Inscrit en
    Février 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 14
    Par défaut
    désolé pour le manque de clarté de mon script, je débute n'ai pas l'habitude de mettre des commentaires mais vais remédier à la situation et détailler un plus ce que j'essaie de faire.

    Pour commencer, voilà en résumé mon projet :
    je veux modifier une micropuce à oligos de 15K construite à partir d'EST. Cette modification est réalisé car nous possédons au labo des banques spécifiques de notre étude et voulons enrichir la puce avec ces mêmes séquences. Le problème c'est que pour des raisons techniques, on doit enlever de la puce autant d'oligos qu'on en rajoute. Autre difficulté, c'est que nos banques sont constituées de contig d'EST. De ce fait sur la puce initiale un contig peu être représenté par 0, 1 ou plusieurs EST sur lesquelles ont été déssinés les oligos.

    Ma démarche a donc été la suivante :
    1. associer chaque contig à son/ses oligo(s) par la présence d'EST composant le contig sur la puce en s'appuyant sur les correspondance ID_genbank/ID_oligo du fichier de design de la puce initiale
    2. vérification des associations contig/oligo et de leur spécificité


    j'en suis donc à la 2nd étape.
    J'ai en ma possession la liste des association ID_oligo/ID_contig (faites par le biais des ID_genbank). J'ai extrait les liste des ID_oligo et des ID_contig séparément pour pouvoir générer deux banques distinctes "oligos" et "contigs" en récupérant les séquences associées à chaque ID_oligo et ID_contig.
    Ensuite, j'ai blasté ("dseablast" en local) la banque oligos contre la banque contigs afin de vérifier la spécificité des oligos. Le dseablast est un blast installé en local à l'INRA qui réalise l'ensemble des alignement, fait un tri selon un cutoff sur la e-value et un parse des hits significatifs. Je me suis arranger pour paramétrer des conditions relativement stringentes. Au final, les résultats significatifs des hits sont consignés dans un fichier csv contenant entre autre l'ID_oligo, l'ID_contig et les renseignements relatifs à l'alignement.
    Ce que je voudrait faire maintenant c'est vérifier si les correspondances ID_oligo/ID_contig issues du blast sont les mêmes que celles générées lors de la première étape d'association conyig/oligo.
    D'où mon script que je vais maintenant détailler :

    première étape : lecture et enregistrement des associations originales ID_oligo/ID_contig

    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
     
    use strict;
    #déclaration des variables à extraire des deux fichiers
    my ($lineB,$contig,$oligo,$lineA,$query_name,$query_accession,$query_description,$query_length,$hit_name,$hit_accession,$hit_description,$hit_length,$score,$evalue,$hsp_number,$hsp_query_start,$hsp_query_end,$hsp_hit_start,$hsp_hit_end,$hsp_percent_identity,$direction);
    #déclaration de tableaux pour spliter les lignes de données
    my (@elmtsA,@elmtsB);
    #déclaration de la table de hachage pour consigner les associations ID_oligo/ID_contig avaec en clé les ID_contig
    my %contig2oligo;
     
    #création et ouverture du fichier pour consigner les résultats
    open OUT, "> oligo_contig_perfect.txt" or
        die "Unable to open oligo_contig_perfect file : $!\n";
     
    #ouverture du fichier d'associations ID_oligo/ID_contig par le biais des ID_genbank
    open OLIGO, "< oligo_otherV6.txt" or
        die "Unable to open input file #2 : $!\n";
    #extraction des données ligne par ligne en sautant le header
    while ($lineB=<OLIGO>) {
        chomp $lineB;
        if ($lineB =~ /^#/) {#Header
           next;
    }
    #splitage de chaque ligne dans le tableau elmtsB et mise en mémoire uniquement des ID_oligo et ID_contig dans les variables $coligo et $contig
        @elmtsB=split "\t", $lineB;
        $contig=$elmtsB[0];
        $oligo=$elmtsB[4];
    #mémorisation dans la table de hachage des associassions ID_contig/ID_oligo sous les clés ID_contig
        if (defined $contig2oligo{$contig}) {
    #plusieurs oligos peuvent être associés au même contig
           $contig2oligo{$contig}=$contig2oligo{$contig}."\t$oligo";
        } else {
           $contig2oligo{$contig}=$oligo;
    }
    seconde étape : lecture et enregistrement des associations ID_oligo/ID_contig après blast

    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
     
    #ouverture du fichier de résultats des blasts
    open CONTIG, "< blastn-oligo_restrict_otherV6-contig_restrict_otherV6-1e-3-1e-3-1,1.csv" or
        die "Unable to open input file #1 : $!\n";
    #extraction des données ligne par ligne en sautant le header et en créant le header du fichier OUT
    my $noLine=0;
    while ($lineA=<CONTIG>) {
        $noLine++;
        chomp $lineA;
        if ($lineA =~/^#/ || $noLine==1) {#Header
           print OUT "query_name\tquery_accession\tquery_description\tquery_length\thit_name\thit_accession\thit_description\thit_length\tscore\tevalue\thsp_number\thsp_query_start\thsp_query_end\thsp_hit_start\thsp_hit_end\thsp_percent_identity\tdirection\tmatch\n";
     
        next;
    }
    #splitage des lignes et extraction des données à mémoriser
        @elmtsA=split ";", $lineA;
        $query_name=$elmtsA[0]; #=ID_oligo
        $query_accession=$elmtsA[1];#=ID_oligo
        $query_description=$elmtsA[2];
        $query_length=$elmtsA[3];
        $hit_name=$elmtsA[4];#=ID_contig
        $hit_accession=$elmtsA[5];#=ID_contig
        $hit_description=$elmtsA[6];
        $hit_length=$elmtsA[7];
        $score=$elmtsA[8];
        $evalue=$elmtsA[9];
        $hsp_number=$elmtsA[10];
        $hsp_query_start=$elmtsA[11];
        $hsp_query_end=$elmtsA[12];
        $hsp_hit_start=$elmtsA[13];
        $hsp_hit_end=$elmtsA[14];
        $hsp_percent_identity=$elmtsA[15];
        $direction=$elmtsA[16];
     
    #enregistrement des associations ID_oligo($query_name)/ID_contig ($hit_name) dans la table de hachage sous la clé ID_contig ($hit_name)
        if (defined $contig2oligo{$hit_name}) {
    #plusieurs ID_oligos peuvent être associés à un même oligo
           $contig2oligo{$hit_name}=$contig2oligo{$hit_name}."\t$query_name";
        } else {
           $contig2oligo{$hit_name}=$query_name;
    }
    et enfin le test pour savoir si les associations avant blast et après blast sont les mêmes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if ($contig2oligo{$contig} eq $contig2oligo{$hit_name}){
        print OUT "$query_name\t$query_accession\t$query_description\t$query_length\t$hit_name\t$hit_accession\t$hit_description\t$hit_length\t$score\t$evalue\t$hsp_number\t$hsp_query_start\t$hsp_query_end\t$hsp_hit_start\t$hsp_hit_end\t$hsp_percent_identity\t$direction\tOK\n";
        } else {
           print OUT "$query_name\t$query_accession\t$query_description\t$query_length\t$hit_name\t$hit_accession\t$hit_description\t$hit_length\t$score\t$evalue\t$hsp_number\t$hsp_query_start\t$hsp_query_end\t$hsp_hit_start\t$hsp_hit_end\t$hsp_percent_identity\t$direction\tNA\n";
        }
    }
     
    }
    close(OLIGO);
    close(CONTIG);
    close(OUT);
    voilà, j'espère que ma démarche est plus claire maintenant.
    Peut être n'est ce pas la méthode la plus simple. Merci d'avance pour vos suggestions et votre aide.

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Oui, cela est beaucoup plus clair.

    Au lieu de déclarer toutes tes variables au début du script, tu peux le faire au fur et à mesure en ce qui concerne les lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #déclaration des variables à extraire des deux fichiers
    my ($lineB,$contig,$oligo,$lineA,$query_name,$query_accession,$query_description,$query_length,$hit_name,$hit_accession,$hit_description,$hit_length,$score,$evalue,$hsp_number,$hsp_query_start,$hsp_query_end,$hsp_hit_start,$hsp_hit_end,$hsp_percent_identity,$direction);
    while ($lineB=<OLIGO>) {
    while ($lineA=<CONTIG>) {
    Tu peux utiliser la même variable $line
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while (my $line=<OLIGO>) {
    while (my $line=<CONTIG>) {

    inutile de créer la variable $noLine, cette information est contenue dans $.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if ($lineA =~/^#/ || $noLine==1)
    if ($lineA =~/^#/ || $. == 1)

    Le problème :
    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
    # récupération des données du fichier 1
    while ($lineB=<OLIGO>) {
        if (defined $contig2oligo{$contig}) {
        #plusieurs oligos peuvent être associés au même contig
           $contig2oligo{$contig}=$contig2oligo{$contig}."\t$oligo";
        } else {
           $contig2oligo{$contig}=$oligo;
    }
     
    # récupération des données du fichier 2
    while ($lineA=<CONTIG>) {
     
        #enregistrement des associations ID_oligo($query_name)/ID_contig ($hit_name) dans la table de hachage sous la clé ID_contig ($hit_name)
        if (defined $contig2oligo{$hit_name}) {
        #plusieurs ID_oligos peuvent être associés à un même oligo
           $contig2oligo{$hit_name}=$contig2oligo{$hit_name}."\t$query_name";
        } else {
           $contig2oligo{$hit_name}=$query_name;
    }
     
     
     
    if ($contig2oligo{$contig} eq $contig2oligo{$hit_name}){
        print OUT "$query_name\t$query_accession\t$query_description\t$query_length\t$hit_name\t$hit_accession\t$hit_description\t$hit_length\t$score\t$evalue\t$hsp_number\t$hsp_query_start\t$hsp_query_end\t$hsp_hit_start\t$hsp_hit_end\t$hsp_percent_identity\t$direction\tOK\n";
        } else {
           print OUT "$query_name\t$query_accession\t$query_description\t$query_length\t$hit_name\t$hit_accession\t$hit_description\t$hit_length\t$score\t$evalue\t$hsp_number\t$hsp_query_start\t$hsp_query_end\t$hsp_hit_start\t$hsp_hit_end\t$hsp_percent_identity\t$direction\tNA\n";
        }
    }
    $contig contient la dernière valeur trouvée dans le fichier et idem pour $hit_name. Et surtout idem pour toutes les valeurs de ce que tu veux écrire dans print out!

    Un hash ne peut pas avoir 2 fois la même clé. Si lors de la lecture du premier fichier tu as trouvé une valeur pour $contig2oligo{$contig} ... si tu retrouve la même valeur de clé lors de la lecture du second fichier $contig2oligo{$hit_name} ... les valeurs seront ajoutées à $contig2oligo{$contig}


    solution : créer 2 hashes et garder @elmtsA comme valeur.
    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
    my %oligo_tab;
    # récupération des données du fichier 1
    while ( my $line=<OLIGO>) {
        #enregistrement des associations ID_oligo($query_name)/ID_contig ($hit_name) dans la table de hachage sous la clé ID_contig ($hit_name)
        if (defined $oligo_tab{$hit_name}) {
        #plusieurs ID_oligos peuvent être associés à un même oligo
           $oligo_tab{$hit_name} .= "\t$query_name";
        } else {
           $oligo_tab{$hit_name} = $query_name;
    }
     
     
    my %contig_tab; 
    # récupération des données du fichier 2
    while ($line=<CONTIG>) {
     
        chomp $line;
        if ($line =~/^#/ || $.==1) {#Header
           print OUT "query_name\tquery_accession\tquery_description\tquery_length\thit_name\thit_accession\thit_description\thit_length\tscore\tevalue\thsp_number\thsp_query_start\thsp_query_end\thsp_hit_start\thsp_hit_end\thsp_percent_identity\tdirection\tmatch\n";
     
        next;
        }
     
        # clé = it_name valeur = liste des informations
        @elmtsA=split ";", $lineA;
        # $hit_name=$elmtsA[4];
        $contig2oligo{$elmtsA[4]} = @elmtsA;
    }
     
    # comparaison des clés
    foreach my $key (keys %contig_tab){
     
    	if  ( exists $contig_tab{$key}){
     
    	}
    }

  8. #8
    Membre habitué
    Inscrit en
    Février 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 14
    Par défaut
    Certaines subtilités m'échappent encore mais je comprends mieux maintenant. Je vais essayer de mettre cela en application et merci beaucoup.

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # comparaison des clés
    foreach my $key (keys %contig_tab){
     
    	if  ( exists $contig_tab{$key}){
     
    	}
    }
    comparer tes valeurs et voir si elles sont égales va poser problème étant donné qu'elles sont concaténées via des tabulations dans les valeurs de tes hashes et que leur ordre n'est probablement pas le même. Il faudrait untiliser un hash de hah ou un hash de array. Je vais manger, puis je continue de regarder à ton script.

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        $query_name=$elmtsA[0]; #=ID_oligo
        $hit_name=$elmtsA[4];#=ID_contig
    Donc, cela vient d'un blast de l'oligo sur une DB contenant les différents contig. Pour un même $query_name, tu as donc plusieurs $hit_name ou bien n'as-tu garder que le meilleur hit dans ton fichier des résultats?

    Pour un même oligo tu as donc plusieurs contig et pour un même contig, tu as également plusieurs oligo associés ... si tu as blasté tes 2 banques l'une contre l'autre.

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