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 :

Récuperation de champs sur fichier GenBank


Sujet :

Bioinformatique Perl

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 31
    Points : 34
    Points
    34
    Par défaut Récuperation de champs sur fichier GenBank
    Bonjour.

    Je travaille sur des fichiers de type Genbank. Je dois récupérer différentes infos du genre:
    - uniquement la séquence
    - uniquement le champ LOCUS, ou le nom de l'organisme ou le champ définition par exemple.
    Jusque la c'est bon, pas de problème.

    Par contre pour une récupération de champs via un mot clé rentré par l'utilisateur, je vois pas comment délimiter la partie a récupérer.
    Je m'explique.
    Certains champs sont sur plusieurs lignes (exemple: le champ ORGANISM). Pas de probleme pour récupérer la 1ere ligne, mais comment récupérer les suivantes en s'arrétant bien a la fin de ce champ là, sachant qu'il n'y a aucun caractere spécial qui délimite la fin d'un champ.

    Si vous connaissez une façon de faire, je suis tout ouie (si je puis dire)...

  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
    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
    #!/usr/local/bin/perl
     
    =h
    exemple de fichier
     
    ...
    SOURCE      Escherichia coli
    ORGANISM  Escherichia coli
                Bacteria; Proteobacteria; Gammaproteobacteria; Enterobacteriales;
                Enterobacteriaceae; Escherichia.
    REFERENCE   1  (bases 1 to 402)
    ...
     
    récupère
    Escherichia coli            Bacteria; Proteobacteria; Gammaproteobacteria; Enterobacteriales;            Enterobacteriaceae; Escherichia.
    =cut
     
    use strict;
    use warnings;
     
    my $InFile = "P:/Perl/scripts/Files/test.txt";
    open (InFile,"$InFile") or die "Can't open file\n";
    my $Ligne;
     
    my $Organisme = "";
     
    my $Var = 0;
    my $Nombre;
     
    # lecture du fichier ligne par ligne
    while ($Ligne=<InFile>)
    {
     
            # présence d'un tag : ligne commençant pas au moins 4 majuscules
            if($Ligne =~ /^[A-Z]{4,}\s/)
            {
                    $Var = 0;
            }
            if (($Var == 1 ) & ( $Ligne =~ /^\s/))
            {
                    # récupération des informations
                    # suppression des enters en fin de lignes
                    chomp($Ligne);
                    $Organisme = $Organisme.$Ligne;
            }
            if($Ligne =~ /ORGANISM (.*)/)
            {
                    $Organisme = $1;
                    $Var = 1;
            }
     
    }
     
    print "\n$Organisme\n";
    Pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($Ligne =~ /^[A-Z]{4,}\s/)
    Regarde si la ligne commence par minimum 4 majuscules.
    Si tu es certain(e) que c'est toujours REFERENCE qui suit ORGANISM dans tes fichiers textes il vaut mieux écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($Ligne =~ /REFERENCE/)
    Voire même mettre plusieurs conditions dans le même if
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(($Ligne =~ /REFERENCE/) | ($Ligne =~ /TITLE/))
    Pour information : dans Genbank chaque séquence est stockée sous la forme d'un objet dont tu peux récupérer les données (acc, gi, seq, organisme ...) directement en te connectant à Genbank via un script Perl qui récupère les informations dont tu as besoin sans passé par des fichiers textes en local.
    Tu écris ta requêtes dans ton programme (cela peut être une liste d'accessions, des mots ...) et les séquences que tu obtiens sont exactement celles que tu aurais si tu faisais cette erquête via l'interface web de GenBank.

    Jasmine,
    -- Jasmine --

  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
    Exemple d'objet de genbank =:
    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
    $VAR1 = bless( {
                     '_gsf_tag_hash' => {
                                          'mol_type' => [
                                                          'genomic DNA'
                                                        ],
                                          'db_xref' => [
                                                         'taxon:562'
                                                       ],
                                          'strain' => [
                                                        '07-380'
                                                      ],
                                          'organism' => [
                                                          'Escherichia coli'
                                                        ]
                                        },
                     '_source_tag' => 'EMBL/GenBank/SwissProt',
                     '_gsf_seq' => bless( {
                                            'display_id' => 'EU281544',
                                            'primary_id' => '161705230',
                                            'accession_number' => 'EU281544',
                                            '_seq_length' => undef,
                                            '_version' => '1',
                                            'alphabet' => 'dna',
                                            'desc' => 'Escherichia coli strain 07-380 ParC (parC) gene, partial cds.',
                                            '_root_verbose' => 0,
                                            'seq' => 'ATGAGCGATATGGC…AGC'
                                          }, 'Bio::PrimarySeq' ),
                     '_location' => bless( {
                                             '_strand' => 1,
                                             '_seqid' => 'EU281544',
                                             '_location_type' => 'EXACT',
                                             '_start' => '1',
                                             '_end' => '402',
                                             '_root_verbose' => 0
                                           }, 'Bio::Location::Simple' ),
                     '_primary_tag' => 'source'
                   }, 'Bio::SeqFeature::Generic' );
    L'utilisation d'objets est plus propre et moins lourde que de passer par des fichiers textes.

    ... enfin pour organisme, l'objet est un peu limité.


    Jasmine,
    -- Jasmine --

  4. #4
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 31
    Points : 34
    Points
    34
    Par défaut
    En fait ce que je veux c'est pouvoir récuperer n'importe quel champ passé en mot clé. ORGANISM servait d'exemple puisqu'il est défini sur plusieurs lignes.

    J'ai bien réussi a faire quelque chose, mais mon code est pas du tout optimisé
    Déja je fais un 1er parcours pour verifier l'existance du champ et je fais un second parcours si il existe pour extraire ce champs (faudra que je rassemble tout ça) et je ressort de ma boucle avec un bon petit "exit" a la barbare.
    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
     
    use strict;
      #dans prog principal:
     
    	#print "Taper le champ a rechercher :\n";
    	#my $champ=<STDIN>;
    	#chomp $champ;
     
    	my ($champ, $nom_fichier) = @_;
    	my @recup = affiche_tout($nom_fichier);       # appel de la ss fonction
     
      # =================================
      # Verification de l'existence de ce champ dans le fichier
      # =================================
    	my $i=0;
     
    	foreach my $ligne (@recup)
        {
    # verifie que la ligne commence par le mot cle precede de 0 ou plusieurs espaces
         if ($ligne =~ /^\s*$champ\s.*$/i)     
              {
    		$i++;
    	   }
         }
     
      # =================================
      # Si le champ n'existe pas:
      # =================================
    	if ($i==0)
              {
    	      print "Le champ '$champ' n'existe pas\n\n";
    	  }
     
      # =================================
      # si il existe, on va chercher a l'afficher
      # =================================	
    	else 
              {
    		#print "Le champ $champ existe\n\n";
    		my $j=0;
    		for ($j=0; $j<@recup; $j++)
    	  {
    # verifie que la ligne commence par le mot cle precede de 0 ou plusieurs espaces	
          if ($recup[$j]=~ /^\s*$champ\s.*$/i) 	  
          {
              print $recup[$j],"\n";     # affiche la 1ere ligne comportant le mot cle
     
              for(my $k=$j+1; $k<@recup; $k++) 
               {
    # affiche les lignes suivantes si il y en a plusieurs
                if ($recup[$k]=~ /^\s{5}.*$/i)    
        	     {
                   print $recup[$k],"\n";       
                 }
    # force la boucle a se terminer si on passe a un autre champ
                else {exit;}                      
      	  }
      	}   
         } 
      }

  5. #5
    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
    Bonjour,

    Ta fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @recup = affiche_tout($nom_fichier);
    semble placer tout le fichier dans un tableau indexé.
    Perl possède déjà cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    open (InFile,$nom_fichier) or die "Can't open file\n";
    my @recup = <InFile>;
    close (InFile);
    A ta place, je n'utiliserais pas cela car vu que tu ne veux récupérer que quelques lignes il est inutile de surcharger la mémoire surtout que les fichiers GenBank peuvent être très volumineux. De plus cela complique les choses quand tu trouves ton mot clé et que tu veux récupérer les valeurs suivantes de ton tableau. Si tu veux continuer sur cette voie, quand tu trouves ton mot clé tu dois faire un "while(lignes suivantes ne contiennent pas de tag){concaténation des lignes}".
    J'ai un peu modifié mon script en fonction de celui que tu as fait.
    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
    use strict;
    use warnings;
     
    my $InFile = "P:/Perl/scripts/Files/test.txt";
    my $Champ = "ORGANISM";
    my $Valeur = "";
    open (InFile,"$InFile") or die "Can't open file\n";
    my $Ligne;
     
    my $Var = 0;
    my $Nombre;
     
    # lecture du fichier ligne par ligne
    while ($Ligne=<InFile>)
    {
     
            # présence d'un tag : ligne commençant pas au moins 4 majuscules
            if($Ligne =~ /^\s*[A-Z]{4,}\s*\w*/)
            {
                    $Var = 0;
            }
            if (($Var == 1 ) & ( $Ligne =~ /^\s/))
            {
                    # récupération des informations
                    # suppression des enters en fin de lignes
                    chomp($Ligne);
                    $Valeur = $Valeur.$Ligne;
            }
            if($Ligne =~ /$Champ\s*(.*)/)
            {
                    $Valeur = $1;
                    $Var = 1;
            }
     
    }
    close(InFile);
    if ($Valeur eq "")
    {
            print "Le champ $Champ n'existe pas\n\n";
    }
    else
    {
            print "\n$Champ = $Valeur\n";
    }
    Bon travail,

    Jasmine,
    -- Jasmine --

  6. #6
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 31
    Points : 34
    Points
    34
    Par défaut
    Merci pour cette reponse.
    Effectivement l'appel a ma fonction par: affiche_tout($nom_fichier); utilise la fonction que tu me conseilles au dessous. C'etait pour eviter de modifier mon fichier d'origine par erreur.

    Sinon la fonction est nickelle.
    Y a juste une ligne que je ne comprends pas:
    A quoi correspond "$1".La ligne est récupérée avec ça?
    C'est le seul point noir.
    Sinon j'aurai inversé les 2 derniers "if" dans le "while" pour la logique mais d'un point de vu code c'est la même chose.

  7. #7
    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
    1
    2
    3
    4
    5
            if($Ligne =~ /$Champ\s*(.*)/)
            {
                    $Valeur = $1;
                    $Var = 1;
            }
    Les parenthèses indiquent ce que tu veux récupérer dans ton expression régulière, ici (.*) signifie
    . = n'importe quel caractère sauf un saut de ligne
    * = de 0 à une infinité de fois
    Le $1 veut dire que tu places dans $Valeur ce que tu as récupéré du première couple de parenthèses de l'expreg. Tu peux donc avoir une succession de parenthèses et utiliser $1, $2, $3 ... afin de récupérer les informations voulues dans ton expression régulière.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $InFile = "P:/Perl/scripts/Files/test.txt";
    Ton fichier est ouvert en écriture seulement ce qui signifie que tu ne peux pas le modifier par erreur. Pour ouvrir un fichier en mode écriture tu dois utiliser le signe >
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $InFile = ">P:/Perl/scripts/Files/test.txt";
    Ouverture
    open(NOMPOINTEUR, "(prefixe)nomFichier");

    préfixe description
    < lecture (par défaut)
    > écriture (fichier écrasé)
    > > ajout
    | résultat envoyé à un programme
    ^^ Donc pas de soucis.


    Jasmine,

    PS : n'oublie pas de cocher que ton problème est résolu.
    -- Jasmine --

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juin 2008
    Messages : 6
    Points : 7
    Points
    7
    Par défaut bon boulot mais ...
    Je viens de jeter un oeil a votre echange, et je pense que vous avez bien avancé. Juste une petite remarque en passant, c'est très bien de se plobger dans le code directement mais il existe des librairies dédiées à l'exploitation des fiches genbank. Ces modules ont écrits (et plutot bien...), testés et sont sont fréquemment utilisés.

    Je vous conseille donc de jeter à oeil à :

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juin 2008
    Messages : 6
    Points : 7
    Points
    7
    Par défaut suite
    oops, donc :
    Bio::SeqIO
    Bio::SeqIO::GenBank

    cf : http://doc.bioperl.org/releases/bioperl-1.2/

    Voila, ce n'est que mon avis mais il est important en bioinfo de savoir utiliser l'existant pour ne pas tout recoder à chaque fois.

  10. #10
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 31
    Points : 34
    Points
    34
    Par défaut
    Hello koaku

    Le projet est terminé depuis un petit moment maintenant, je m'en suis sorti. Mais merci pour ton aide.
    Le but des projets que j'ai eu a réaliser était "scolaire" et visait justement à pratiquer la programmation si possible sans reprendre trop de codes déjà existants.

    Mais il est vrai que dans un projet "normal" il est inutile de réinventer la roue à chaque fois, c'est une perte du temps.

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

Discussions similaires

  1. Utiliser un metadata selon un champ sur un fichier positionnel
    Par princebenin dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 19/11/2009, 16h28
  2. [VBA] Excel Récuperer Macro sur fichier corrompu
    Par Phenx dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/01/2009, 13h13
  3. [JFrame] récuperer le path du fichier glissé sur une JFrame ou JPanel
    Par AliJava dans le forum Agents de placement/Fenêtres
    Réponses: 9
    Dernier message: 19/12/2007, 08h25
  4. Récuperer des infos sur des fichiers .txt
    Par arnogb69 dans le forum VB.NET
    Réponses: 5
    Dernier message: 23/08/2007, 15h57
  5. Réponses: 7
    Dernier message: 06/07/2006, 15h32

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