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

Langage Perl Discussion :

problème de match


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 43
    Points : 39
    Points
    39
    Par défaut problème de match
    Bonjour,

    En fait je viens d'écrire un petit script qui prend en entrée un fichier fasta, un motif et doit copier les lignes en fonction de la présence ou non de ce motif.
    Les sequences que je veux copier sont donc délimitées par
    >gi blabla
    [A-Z]*

    >gi blabla...

    en vert la séquence à récupérer à chaque tour de boucle.

    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
    #!c:\perl\perl.exe
     
    use strict;
    use warnings;
    use File::Copy;
     
    # Insérer la variable du fichier input
    open (InFile,"test.fasta") || die "Le fichier source n'est pas bon\n";
     
    # insérer le motif saisi par l'utilisateur
    my $Tag = "associated";
     
    my $Ligne;
     
    # si on veut récupérer le fichier sans le tag
    my $Recup = 1;
     
    # $TextRecup récupération du match
    open (GARDE, ">TextRecup.fasta") || die "erreur";
     
    # $TextKeep ce qui ne contient pas le match
    open (KEEP, ">TextKeep.fasta") || die "erreur";
     
     
    # lecture du fichier ligne par ligne
    while ($Ligne=<InFile>)
    {
     
    	if($Ligne =~ m/(\^\>gi.*($Tag).*)>gi/)
    	{
    		print GARDE $1;
    	}
     
    	elsif($Ligne =~m/(\^\>gi.*)>gi/)
    	{
    		print KEEP $1;
    	}
    }
     
    close(GARDE);
    close(KEEP);
     
    # choix du fichier à produire
    if($Recup == 1)
    {
    	copy("TextKeep.fasta", "OutFile.fasta");
    }
    elsif($Recup == 0)
    {
    	copy("TextRecup.fasta", "OutFile.fasta");
    }
    else
    {
    	print("erreur lors de la copie");
    }
    Le code tourne car il me crée les fichiers TextKeep, TextRecup et OutFile, mais ils sont désespérément vides...

    Merci d'avance à qui pourra m'éclairer ...

  2. #2
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m/(\^\>gi.*($Tag).*)>gi/
    apparemment, tu essaies de récupérer le contenu entre deux gi, ce qui signifie récupérer 2 lignes or $Ligne n'en contient qu'une et par conséquence, tu ne rentres jamais dans tes if.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	if($Ligne =~ m/^(>gi.*$Tag.*)/)
    	{
    		print GARDE $1."\n"; # rajoute un enter entre les id récupérés
    	}
     
    	elsif($Ligne =~ m/^(>gi.*)/)
    	{
    		print KEEP $1."\n";
    	}
    mais cela ne récupère pas les séquences.



    Pour les garder
    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
     
    my %seq;
    my $id;
     
     
    while($Ligne = <InFile>){
     
    	if($Ligne =~ m/^(>gi.+)$/){		
                    $id = $1; 
                    $seq{$id} = 1;
    	}
     
    	elsif ($Ligne =~ m/^([A-Z]+)$/i){
                    my $sequence = $1;
    		if( $id eq "" ){
    		         print "erreur de récupération à la ligne $.\n";
    		}
                    else{
                    	$seq{$id} = $sequence;
                    	$id = "";
                    }
    	}
    }
     
    foreach my $id (keys %seq){
     
            if($id =~ /$Tag/){
    		print GARDE $id."\n".$seq{$id}."\n";
            }
     
            else{
    		print KEEP $id."\n".$seq{$id}."\n";
            } 
    }


    Tu devrais faire une recherche sur le CPAN, il existe des modules faisant ce que tu veux. Ils seront plus sûrs et plus optimaux.
    Par exemples
    http://search.cpan.org/~birney/bioperl-1.4/Bio/SeqIO.pm
    http://search.cpan.org/~birney/biope...SeqIO/fasta.pm

  3. #3
    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
    Voici par exemple comment utiliser le module Bio::SeqIO
    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
    use strict;
    use warnings;
    use Bio::SeqIO;
     
     
    my $file = "chemin fichier";
    my $in  = Bio::SeqIO->new(-file => $file, '-format' => 'Fasta');
     
    my $garde = Bio::SeqIO->new(-file => ">garde.fsa", '-format' => 'Fasta');
    my $keep = Bio::SeqIO->new(-file => ">keep.fsa", '-format' => 'Fasta');
     
    my $tag = "";
     
    while ( my $seq = $in->next_seq()){
        if($seq->primary_id =~ /$tag/){
            $garde->write_seq($seq);
        }
        else{
            $keep->write_seq($seq);
        }
    }
    Voici un exemple d'objet de séquence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $VAR1 = bless( {
                     'primary_id' => 'gi|190010013|emb|AM743169.1|',
                     'primary_seq' => bless( {
                                               'display_id' => 'gi|190010013|emb|AM743169.1|',
                                               'primary_id' => 'gi|190010013|emb|AM743169.1|',
                                               'desc' => 'Stenotrophomonas maltophilia K279a complete genome, strain K279a',
                                               'seq' => 'ATGGATGCTTGGTCCCGTAGTCTCGAGCGCCTCGAAGCGGAGTTCCCGCCGGAAGACGTTCATACCTGGCTGAAGCCACTGCAGGCCGATCTGCGCGTGGACAGCCTGGTGCTGTATGCACCGAATGCCTTCATCGTCGA',
                                               'alphabet' => 'dna'
                                             }, 'Bio::PrimarySeq' )
                   }, 'Bio::Seq' );

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 43
    Points : 39
    Points
    39
    Par défaut
    ok .... Merci beaucoup pour toutes tes explications et le temps que tu as passé pour me répondre! Je vais me pencher sur le bio perl d'un peu plus près et je vais tester ça aujourd'hui!

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 43
    Points : 39
    Points
    39
    Par défaut
    Bon en fait le bio perl ça a l'air super puissant mais je comprends pas tout... pour le moment il se contente de recopier le fichier de base dans l'un ou l'autre des fichiers de sortie...
    Par contre, le script perl que tu as corrigé fonctionne presque.... je récupère seulement la 1ère ligne de la séquence et comme pour chaque espèce le nombre de lignes est variable, ca me fait une erreur toutes les 2 lignes...
    Je suis vraiment désolée de poser autant de questions, je viens de commencer à apprendre le perl depuis une semaine et je maîtrise pas vraiment pour le moment malgré la quantité de tutoriaux...

  6. #6
    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
    Pourrais-tu donner quelques exemples de tes lignes >Gi...

    C'est parce que j'ai écrit un script fonctionnant pour des séquences écrites sur une seule ligne ... et c'est déjà assez 'dangereux' de les récupérer ainsi sans pour en plus ajouter une séquence sur différentes lignes.

    Pourquoi n'essaies-tu pas d'utiliser Bio::SeqIO? C'est 100 fois mieux. Avant de l'utiliser, je faisais de simples lectures de fichiers et j'ai parfois eu des problèmes.
    Dans ce script, $seq est un objet possédant des tags. Tu accèdes à la valeur de ses tags par la fonction $seq->tag.
    Le programme que j'ai écrit avec ce module crée les fichiers keep et garde que tu veux.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 43
    Points : 39
    Points
    39
    Par défaut
    C'est bon j'ai compris le souci pour Bio::SeqIO :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while ( my $seq = $in->next_seq()){
        if($seq->desc=~ /$tag/){
            $garde->write_seq($seq);
        }
        else{
            $keep->write_seq($seq);
        }
    voilà la doc finalement contient quand même des infos !! (faut vraiment que je lise attentivement tout..)

    Merci un million de fois Jasmine !!
    Je pense que je vais vraiment me renseigner sur le bioperl.... c'est carrément plus court que le perl pour les applications dont j'ai besoin...

    Par contre une autre question : peut-on appliquer du tk sur bio perl? je compte créer une petite interface graphique pour que l'utilisateur puisse choisir son fichier et son tag...

  8. #8
    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
    Oui, cela devrait être compatible. Bioperl est en fait un ensemble de modules Perl. Il te suffit seulement de bien déclarer les modules que tu utilises.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 43
    Points : 39
    Points
    39
    Par défaut
    oki merci pour tout !!

    Ben je vais y retourner ... En tous cas ça fait vraiment plaisir de trouver de l'aide sur ce forum avec des personnes aussi sympa !!
    Je m'excuse d'avance mais tu vas certainement me revoir dans pas longtemps !

  10. #10
    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
    Au plaisir de te revoir. J'aime beaucoup de forum et il m'a également souvent aidé.

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

Discussions similaires

  1. problème avec MATCH
    Par stany91 dans le forum Requêtes
    Réponses: 1
    Dernier message: 12/09/2008, 00h23
  2. Problème application.match et chiffres
    Par House MD dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 23/11/2007, 12h16
  3. Problème recherche match.. against
    Par pierre_pogo dans le forum Requêtes
    Réponses: 2
    Dernier message: 01/08/2006, 10h45
  4. [Regex] Problème de match...
    Par Hoegaarden dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 14/02/2006, 16h25
  5. Problème avec MATCH - FULLTEXT
    Par Kosti dans le forum Requêtes
    Réponses: 2
    Dernier message: 27/01/2006, 01h20

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