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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 31
    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 é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
    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,

  3. #3
    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
    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,

  4. #4
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 31
    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 é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
    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,

  6. #6
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 31
    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.

+ 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