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 :

algorithme comparant des séquences


Sujet :

Langage Perl

  1. #1
    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 algorithme comparant des séquences
    Voici mes données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $TEM_ref   = 'TCTGTGCCGCCGTCATTACCATGAGCGATAACAGCGCCGCCAATCTGCTGCTGGCCACCG’;
    $contig    = 'TCTGTGCCGCCGCCATTACCATGAGCGATAACATCGCCGCCAATCTGCTGCTGGCCACCG’;
    $consensus = 'TCTGTGCCGCCGYCATTACCATGAGCGATAACAKCGCCGCCAATCTGCTGCTGGCCACCG’;
    car dans le code génétique (connu par le programme) : Y = T ou C et K = G ou T. On peut donc travailler sur $consensus directement ($consensus est le consensus de $TEM_ref et $ contig) et ainsi connaitre les différences entre $TEM_ref et $contig.

    Je dois comparer $contig à $TEM_ref et vérifier que l'AGC de $TEM_ref est bien présent dans $contig (ce qui n'est pas le cas ici, car $contig contient ATG donc dans $consensus, c'est un K car T ou G).
    $contig est variable et peut être différent de $TEM_ref à d'autres positions que AGC, par exemple dans ce cas, il y a un C au lieu d'un T mais cela n'est pas important car seul l'AGC compte.


    Est-ce clair? Comment procéderiez-vous?


    Merci pour votre aide.

    Nb : je dois utiliser une boucle car il y a plusieurs triplets à vérifier et pas seulement AGC, je compte faire un tableau comptenant les différents triplets à vérifier et leur position dans la TEM_ref mais peut-être y a-t-il plus simple.
    -- Jasmine --

  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
    peut-être quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $consensus = 'TCTGTGCCGCCGYCATTACCATGAGCGATAACAKCGCCGCCAATCTGCTGCTGGCCACCG...’;
    my ($mut1, $mut2 ...) = $consensus =~ m/[a-z]{32}([a-z]{3})[a-z]{22}([a-z]{3}).../i;

    avec $mut1 qui vaut 'AKC' et $mut2 vaut 'CCG' .... $mut3
    -- Jasmine --

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Dans ton exemple, peut-on imaginer qu'il puisse exister plusieurs AGC dans $TEM_ref ?
    S'il ne peut y en avoir qu'un (ou si l'on ne veut traiter que le premier), voici un exemple qui utiliserais index et substr.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    my @triplet = qw(AGC);
     
    foreach my $triplet (@triplet) {
      my $pos_in_TEM = index($TEM_ref, $triplet);
      push @mut, substr($contig, $pos_in_TEM, length($triplet));
    }
     
    # Le tableau @mut contient pour chaque triplet, la valeur du triplet à la même position dans $contig
    Je ne suis pas sûr d'avoir compris ta demande...
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  4. #4
    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 ce que j'ai 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
    			my ($mut1, $mut2, $mut3 ) = $consensus=~ m/[a-z\.]{41}([a-z\.]{3})[a-z]{117}([a-z]{3})[a-z]{219}([a-z]{3})[a-z]{54}/i;
     
    			if ($mut1 ne 'AGC'){
     
    				my $mut_aa = $myCodonTable->translate($mut1);
    				my $ref_aa = $myCodonTable->translate('AGC');
     
    				if ($mut1 eq 'AGC'){
    					print $bact."\tpas de mutation\t";
    				}
    				else {
    					print $bact."\t".'AGC > '.$mut1." ($mut_aa > $ref_aa)\t";
    				}
    			}
    			if ($mut2 ne 'CGT'){
     
    				my $mut_aa = $myCodonTable->translate($mut1);
    				my $ref_aa = $myCodonTable->translate('CGT');
     
    				if ($mut2 eq 'CGT'){
    					print $bact."\tpas de mutation\t";
    				}
    				else {
    					print $bact."\t".'CGT > '.$mut2." ($mut_aa > $ref_aa)\t";
    				}
    			}
    			if ($mut3 ne 'GGT'){
     
    				my $mut_aa = $myCodonTable->translate($mut1);
    				my $ref_aa = $myCodonTable->translate('GGT');
     
    				if ($mut3 eq 'GGT'){
    					print $bact."\tpas de mutation\t";
    				}
    				else {
    					print $bact."\t".'GGT > '.$mut3." ($mut_aa > $ref_aa)\t";
    				}
    			}
    car on doit analyser l'AGC puis le CGT et enfin le GGT et donc, pour répondre à ta question, il peut y avoir plusieur AGC dans la séquence mais ce qu'on doit analyser, c'est AGC en position 42, puis le CGT en position 162 (41 + 3 + 117 = 1611) et ensuite le GGT à la position 340 (117 + 3 + 219 = 339). Est-ce plus clair?
    -- Jasmine --

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Non, ce n'est pas plus clair, mais si tu veux dire qu'il faut analyser à chaque fois la première séquence de chacun des 3 triplets AGC, CGT et GGT, mon exemple ci-dessus devrait fonctionner en modifiant la définition de @triplet en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @triplet = qw(AGC CGT GGT);
    Si en revanche, il ne faut rechercher CGT qu'après la première occurrence de AGC, et GGT qu'après la première occurrence de CGT faisant suite à AGC, il faut légèrement modifier mon exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    my $start_pos = 0;
    foreach my $triplet (@triplet) {
      my $pos_in_TEM = index($TEM_ref, $triplet, $start_pos);
      push @mut, substr($contig, $pos_in_TEM, length($triplet));
      $start_pos = $pos_in_TEM+length($triplet);
    }
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  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
    Citation Envoyé par Philou67430 Voir le message
    Non, ce n'est pas plus clair, mais si tu veux dire qu'il faut analyser à chaque fois la première séquence de chacun des 3 triplets AGC, CGT et GGT, mon exemple ci-dessus devrait fonctionner
    Désolée, mais ce n'est pas facile à expliquer mais merci pour ton aide :

    Il ne faut pas analyser la première occurrence des 3 triplets mais vérifier qu'on trouve bien AGC en position 42, le CGT en position 162 et le GGT à la position 340. Je récupère donc les valeurs des positions
    - 42-43-44 et je vérifie que c'est bien AGC ($mut1)
    - 162-163-164 et je vérifie que c'est bien CGT ($mut2)
    - 340-341-342 et je vérifie que c'est bien GGT ($mut3)

    J'utilise donc :

    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
     
     
     
    			my ($mut1, $mut2, $mut3 ) = $consensus=~ m/[a-z\.]{41}([a-z\.]{3})[a-z]{117}([a-z]{3})[a-z]{219}([a-z]{3})[a-z]{54}/i;
     
    			if ($mut1 ne 'AGC'){
     
    				my $mut_aa = $myCodonTable->translate($mut1);
    				my $ref_aa = $myCodonTable->translate('AGC');
     
    				if ($mut1 eq 'AGC'){
    					print $bact."\tpas de mutation\t";
    				}
    				else {
    					print $bact."\t".'AGC > '.$mut1." ($mut_aa > $ref_aa)\t";
    				}
    			}
    			if ($mut2 ne 'CGT'){
     
    				my $mut_aa = $myCodonTable->translate($mut1);
    				my $ref_aa = $myCodonTable->translate('CGT');
     
    				if ($mut2 eq 'CGT'){
    					print $bact."\tpas de mutation\t";
    				}
    				else {
    					print $bact."\t".'CGT > '.$mut2." ($mut_aa > $ref_aa)\t";
    				}
    			}
    			if ($mut3 ne 'GGT'){
     
    				my $mut_aa = $myCodonTable->translate($mut1);
    				my $ref_aa = $myCodonTable->translate('GGT');
     
    				if ($mut3 eq 'GGT'){
    					print $bact."\tpas de mutation\t";
    				}
    				else {
    					print $bact."\t".'GGT > '.$mut3." ($mut_aa > $ref_aa)\t";
    				}
    			}
    mon code fonctionne
    -- Jasmine --

  7. #7
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Tu veux dire que les positions pour chaque triplets sont imposées ?
    Dans ce cas, pourquoi ne pas utiliser une table de hashage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    my %triplet = (AGC => 42, CGT => 162, GGT => 340);
     
    foreach my $triplet (keys %triplet) {
      my $pos_in_TEM = $triplet{$triplet};
      $mut = substr($consensus, $pos_in_TEM, length($triplet));
     
      # $mut contient le triplet de $consensus correspondant à la position du triplet en cours de traitement dans TEM.
      if ($mut != $triplet) {
         #
      }
      else {
         #
      }
    }
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  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
    Citation Envoyé par Philou67430 Voir le message
    Tu veux dire que les positions pour chaque triplets sont imposées ?
    Dans ce cas, pourquoi ne pas utiliser une table de hashage :
    C'est vrai que c'est une autre solution. Est-ce mieux que la regexp que j'utilise? Normalement, les séquences doivent toujours avoir ce format mais il vaut peut-être mieux que je vérifie qu'elles ont la bonne longueur et que les positions ne sont pas décalées.
    -- Jasmine --

  9. #9
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    L'usage de regexp, dans ce contexte où les positions sont bien déterminées, me semble une solution inadaptée, essentiellement pour des raison de lisibilité et de maintenance.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  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
    Citation Envoyé par Philou67430 Voir le message
    L'usage de regexp, dans ce contexte où les positions sont bien déterminées, me semble une solution inadaptée, essentiellement pour des raison de lisibilité et de maintenance.

    Ok et merci
    -- Jasmine --

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 02/08/2012, 21h00
  2. algorithme comparant des mots
    Par Jasmine80 dans le forum Langage
    Réponses: 1
    Dernier message: 11/04/2008, 11h09
  3. comparer des sons
    Par heidi79 dans le forum DirectX
    Réponses: 2
    Dernier message: 12/08/2003, 01h18
  4. [LG][FAQ]comparer des fichiers
    Par lucke dans le forum Langage
    Réponses: 11
    Dernier message: 01/06/2003, 18h02
  5. Comparer des fichiers de données : Quel Langage ?
    Par Anonymous dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 24/04/2002, 22h37

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