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 :

maximum d'une entité dans un fichier


Sujet :

Bioinformatique Perl

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut maximum d'une entité dans un fichier
    Bonjour à tous,

    J'ai un fichier de ce type :

    >rho-RA
    ATGCGTAGC
    >rho-RB
    ATGCGTAGCATGCGTAGC
    >rho-RC
    ATGCGTAGCATGCGTAGCATGCGTAGCATGCGTAGC
    >pax6-RA
    GCTGCATGATAG
    >pax6-RB
    GCTGCATGATAGGCTGCATGATAG

    donc, je veux en premier temps determiner la taille de chacune des séquences, j'ai donc écrit cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    my $fichier = 'test.fa';
    open my $fh, '<', $fichier or die "Impossible de lire le fichier $fichier\n";
    while ( my $ligne = <$fh> ) {
    	chomp $ligne;
    	if ($ligne =~ m{^>} ) {
        		print "$ligne\t";
    	}
    	else{
    		my $length = length($ligne);
    		print "$length\n";
    	}
    }
    close $fichier;
    Mais j'aimerai qu'il ne m'affiche pour chaque entité (ie dans l'exemple rho et pax6) seulement le transcript (RA,RB...) qui a la plus grande sequence, dans l'exemple rho-RC et pax6-RB

    je ne sais pas comment faire, quelqu'un pourrait m'aider ?
    merci d'avance,
    et bonne fête de fin d'année

  2. #2
    Membre confirmé Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Points : 515
    Points
    515
    Par défaut
    Bonjour,

    Le plus simple est d'utiliser des tables de hachages avec comme clé le nome de l'entité (rho et pax6 dans ton exemple) pour sauvegarder le plus long transcrit et sa longueur.

    Quand on arrive sur une ligne commençant par '>', on sauvegarde l'entité et le transcrit puis on calcule la longueur de sa séquence sur la ligne suivante.

    Voici un exemple qui fonctionne mais qui ne fait aucun contrôle sur le format du fichier : s'il y a une ligne vide ou bien si la séquence est sur plusieurs lignes cela ne fonctionnera pas...
    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
    use strict;
    use warnings;
     
    my $fasta_file = "sequences.fa";
     
    my $current_entity = q{};
    my $current_transcript = q{};
     
    my %max_length_entity;
    my %max_transcript;
     
    open(my $FASTA, '<', $fasta_file) or die "$fasta_file : $!\n\n";
    while(<$FASTA>){
        chomp;
        if(/^>(.+)[-](.+)/){
            $current_entity = $1;
            $current_transcript = $2;
        }
        else{
            my $length_transcript = length;
            if(!exists($max_length_entity{$current_entity}) ||
               $length_transcript > $max_length_entity{$current_entity}){
                $max_length_entity{$current_entity} = $length_transcript;
                $max_transcript{$current_entity} = $current_transcript;
            }
        }
     
    }
    close($FASTA);
     
    foreach my $entity(sort(keys(%max_length_entity))){
        print "Entity : $entity\n";
        print "Longest transcript (length) : $max_transcript{$entity} ($max_length_entity{$entity})\n\n";
    }

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    Bonjour et Bonne année !
    merci pour votre aide.
    Je débute avec la programmation, et j'aimerai comprendre les lignes suivantes du code que vous avez écrit :

    Citation Envoyé par Beniou Voir le message
    my $current_entity = q{};
    my $current_transcript = q{};
    je ne comprends pas le "=q{} "

    Merci d'avance pour vos explications

  4. #4
    Rédactrice

    Avatar de stoyak
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 408
    Points : 1 491
    Points
    1 491
    Par défaut
    Si tu peux utiliser un module, je te conseille de faire un petit tour sur le CPAN. Un petit exemple avec Bio::SeqIO. Tu pourras très facilement parser un fichier Fasta et récupérer les informations.
    Cela demande du courage d'en tirer du plaisir
    Quand on n'a qu'un marteau, tous les problèmes ressemblent à un clou

  5. #5
    Membre confirmé Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Points : 515
    Points
    515
    Par défaut
    Bonjour,

    Citation Envoyé par Isabella83
    je ne comprends pas le "=q{} "
    Cela initialise la variable avec une chaîne vide. On peut dire que cela est équivalent à la ligne ci dessous mais la notation est plus propre (à mon goût ):
    Citation Envoyé par Stoyak
    Si tu peux utiliser un module, je te conseille de faire un petit tour sur le CPAN. Un petit exemple avec Bio::SeqIO. Tu pourras très facilement parser un fichier Fasta et récupérer les informations.
    J'avais déjà émis l'idée d'utiliser ce module dans une autre discussion mais apparemment, Isabella83 n'a pas choisi cette méthode.

    A réfléchir quand même si il y a beaucoup de manipulation de fichiers fasta pour obtenir des informations basiques (longueur séquences, accès facilement à chaque séquence dans un multifasta, lancer des blasts ? etc.)

  6. #6
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    Merci pour vos réponses, je vais regarder en détail Bio::SeqIO

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

Discussions similaires

  1. Comment Copier une table dans un fichier?
    Par thx2003 dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/12/2003, 12h09
  2. [JSP] Recopier le résultat d'une JSP dans un fichier
    Par xxaragornxx dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 29/09/2003, 15h10
  3. Réponses: 13
    Dernier message: 14/06/2003, 22h15
  4. Supprimer une ligne dans un fichier
    Par sbeu dans le forum Langage
    Réponses: 3
    Dernier message: 13/05/2003, 10h30
  5. Sauvegarder une surface dans un fichier
    Par Freakazoid dans le forum DirectX
    Réponses: 6
    Dernier message: 18/08/2002, 15h23

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