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 :

Hash de hash


Sujet :

Bioinformatique Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Points : 57
    Points
    57
    Par défaut Hash de hash
    Bonjour,

    Je dispose d'un fichier tabulé pour lequel pour chaque gène j'ai le nom de l'exon et la position de début et de fin de l'exon

    fchier
    ENSG20 exon5 8 18
    ENSG20 exon4 30 40
    ENSG79 exon42 7 14
    ENSG79 exon13 28 78
    ENSG79 exon9 100 110
    Je souhaiterai obtenir un fichier intermédiaire avec pour chaque exon d'un gène donnée, la taille totale de l'exon en colonne 5 (fin exon - début exon +1) et pour chaque intron du gène sa position
    de début (fin de l'exon n) et de fin (début exon n+1) et la taille totale de l'intron (fin intron - début intron+1). Les positions de début et de fin de l'intron sont déduite de la position des exons



    fichier final
    ENSG20 exon5 8 18 11
    ENSG20 exon4 30 40 11
    ENSG 20 intron 18 30 13
    ENSG79 exon42 7 14 8
    ENSG79 exon13 28 78 51
    ENSG79 exon9 100 110 11
    ENSG79 intron 14 28 15
    ENSG79 intron 78 100 23

    Je procède étape par étape. Mon problème est que je n'arrive pas à afficher mon hash pour toute les lignes de mon fichier!
    Voiçi mon code :


    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
     
     my %new=();
    my @liste;
    my $p=0;
    open OLA, "fichier" or die $!;
     
    while(my $ligne = <OLA>){
            chomp $ligne;
            $p++;
    	my ($gene,$exon,$deb,$fin) = split /\t/, $ligne;
     
    	%new = (
    		$gene => {
    			$exon => [$deb,$fin]
    			}	
    		);
     
    	@liste = @{$new{$gene}{$exon}};
     
    }
    print "\n";
     
    foreach my $t (keys %new){
    	foreach (keys %{$new{$t}}) {
                     print ("$t=>$_ => @liste\n"); 
    	}
    }
    Résultat obtenue:
    ENSG79=>exon9 => 100 110

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 857
    Points : 6 555
    Points
    6 555
    Par défaut
    Si tu veux afficher toutes tes valeurs c'est sur la liste qu'il faut boucler, pas sur le hash.

    D'ailleurs j'ai l'impression que tu n'as pas choisi la bonne structure de donnée. Si j'ai bien compris ce que tu voulais faire, je procéderai comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    while(my $ligne=<OLA>){
        chomp $ligne;
     	my ($gene,$exon,$deb,$fin) = split /\h+/, $ligne;
     	push @liste, {'gene'=> $gene, 'exon'=> $exon, 'deb' => $deb, 'fin' => $fin };
    }
     
    foreach (@liste) {
        $_->{'taille'} = $_->{'fin'} - $_->{'deb'} + 1;
    	print "$_->{'gene'}\t$_->{'exon'}\t$_->{'deb'}\t$_->{'fin'}\t$_->{'taille'}\n";
    }
    Si tout ce que tu souhaites faire est un calcul pour chaque ligne, tu peux le faire directement dans la boucle de lecture au fur et à mesure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my @F;
     
    while(<OLA>){
        (my @F) = split;
        push @F, $F[3] - $F[2] + 1;
        print join ("\t", @F), "\n";
    }
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Si tes lignes sont ordonnées par gène et par début d'exon, comme cela semble être le cas dans l'échantillon de données que tu présentes, tu peux lire tes données et ajouter les informations voulues (y compris les nouvelles lignes relatives aux introns) au fur et à mesure sans même avoir besoin de stocker tes données en entrée dans un hash, un tableau ou quoi que ce soit d'autre.

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Voici un exemple de comment faire l'ensemble au fil de l'eau, sans hash (et encore moins de hash de hash):

    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
     
    use strict;
    use warnings;
    my ($previous_end, $intron);
    my $previous_gene = "";
    while (my $line = <DATA>) {
        chomp $line;
        my ($gene, undef, $start, $end) = split / /, $line;
        my $length = $end - $start + 1;
        if ($gene ne $previous_gene) {
            print $intron if $intron;
            $intron = "";
        } else {
            $intron .= "$gene intron $previous_end $start " . ($start - $previous_end + 1) . "\n";
        }
        print "$line $length\n";   
        $previous_end = $end;
        $previous_gene = $gene;
    }
    print $intron;
     
    __DATA__
    ENSG20 exon5 8 18
    ENSG20 exon4 30 40
    ENSG79 exon42 7 14
    ENSG79 exon13 28 78
    ENSG79 exon9 100 110
    Ce qui produit le résultat suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $ perl intron.pl
    ENSG20 exon5 8 18 11
    ENSG20 exon4 30 40 11
    ENSG20 intron 18 30 13
    ENSG79 exon42 7 14 8
    ENSG79 exon13 28 78 51
    ENSG79 exon9 100 110  11
    ENSG79 intron 14 28 15
    ENSG79 intron 78 100 23
    paraissant bien correspondre à ce que tu attends.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Points : 57
    Points
    57
    Par défaut
    Bonjour,

    Merci CosmoKnacki et Lolo78, vous avez bien compris ce que je souhaite faire!
    En fait, mes lignes ne sont pas ordonnées par gène et par début d'exon!!! Donc je ne peux pas utiliser ta méthode Lolo78, j'ai besoin de stocker les données pour ensuite les trier (pour un gène donnée je trie par rapport à la position de début)

    Je ne peux pas faire de tri sur une liste associative, comment faire?
    Merci

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Il suffit de trier ton fichier avant de commencer, et ça marchera.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Points : 57
    Points
    57
    Par défaut
    MERCI
    #trie de mon fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    my @data = <IN>;
     
    my @sorted_data = map {$_->[2]}
    	sort {$a->[0] cmp $b->[0] || $a->[1] <=> $b->[1]}
            map {my ($f1, $f2) = (split /\t/, $_)[0, 2]; [$f1, $f2, $_]}  @data;
    #print @sorted_data;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Parcours d'un hash de hash de hash
    Par ngere dans le forum Langage
    Réponses: 5
    Dernier message: 06/07/2005, 09h53
  2. Réponses: 6
    Dernier message: 05/07/2005, 11h05
  3. Réponses: 2
    Dernier message: 09/03/2005, 14h35
  4. [langage] hash de hash
    Par Kinethe dans le forum Langage
    Réponses: 17
    Dernier message: 27/08/2004, 13h22
  5. [langage] probleme avec un hash de hash
    Par planetevoyage dans le forum Langage
    Réponses: 4
    Dernier message: 06/06/2003, 12h55

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