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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 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.

  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
    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

  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 : 59
    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
    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...

  4. #4
    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
    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?

  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 : 59
    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
    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);
    }

  6. #6
    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
    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

+ 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