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 :

récupérer une sous-séquence


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 récupérer une sous-séquence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $sequence = 'ATC.GATGAT....ACAGTAGATA..CAGATATG..TTCGCG...ATATAGGCAAG...ATGGATA.CCAGTA.T';
    Problème :

    A partir du Xième caractère de la séquence X = 30 (2ème A de CAGATATG)
    Récupérer N nucléotides de part et d'autre N = 5

    Résultat attendu TA..CAGATATG..T


    Quelle est la manière la plus simple de procéder?


    Merci pour votre aide,

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Avec un substr, non ?

  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
    Citation Envoyé par djibril Voir le message
    Avec un substr, non ?

    Je ne sais pas j'ai commencé quelque chose de compliqué :
    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
     
    my @sequence_list = split (//, $sequence);
     
    my $x = 30;
    my $n = 5;
     
    # $x - 1 pour avoir l'indice de l'array
    $x --;
     
     
    my $subseq .= $sequence_list[$x];
     
     
    my $ok = 0;
     
     
    # récupération de n nucléotides à droite à partir de $xième
    while ($ok < $n){
     
    	# on progresse 1 à 1
    	$x ++;
     
    	if ($sequence_list[$x] =~ m/[ATCG]/i ){		
     
    		$ok ++;
    		$subseq .= $sequence_list[$x];
    	}
     
    }

  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
    Peut-on dans une expression régulière donner la position? en utilisant $* ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =~ [\w\.*\w\.*\w\.*\w\.*\w\.*[\w\.]\.\w\.*\w\.*\w\.*\w\.*\w]
    Récupérer 5 lettres à gauche et 5 à droite en disant que la lettre rouge (ou le point) est à la 30ième position

    ... le problème, c'est que le nombre de lettres à récupérer est une variable $n

  5. #5
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my $sequence = 'ATC.GATGAT....ACAGTAGATA..CAGATATG..TTCGCG...ATATAGGCAAG...ATGGATA.CCAGTA.T';
    my $motif = 'CAGATATG';
    my $N = 5;
    if ( my ($avant, $apres) = $sequence =~ m/(.{$N})$motif(.{$N})/ ) {
      print "Avant : $avant\n";
      print "Apres : $apres\n";
    }
    Avant : ATA..
    Apres : ..TTC

  6. #6
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Je ne sais pas si j'ai bien saisi car je ne comprends pas ton résultat obtenu par rapport à ton énoncé. Si tu veux juste 5 caractères avant le X=30 et 5 après, pourquoi ne pas utiliser un subtr comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $X = 30;
    print substr $sequence,$X-5, 2*$N;
    .CAGATATG.

  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 : 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
    Je suis d'accord avec djibril, substr est la meilleur solution.
    L'équivalent regexp pourrait être :
    mais il sera forcément moins performant.

  8. #8
    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 djibril Voir le message
    Je ne sais pas si j'ai bien saisi car je ne comprends pas ton résultat obtenu par rapport à ton énoncé. Si tu veux juste 5 caractères avant le X=30 et 5 après
    Je ne veux pas 5 caractères, je veux 5 lettres (A, T, C ou G) quelques soit le nombre de points intermédiaires.

  9. #9
    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 un programme faisant ce que je veux, mais il devrait y avoir moyen de faire un meilleur code :
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    #!/usr/local/bin/perl
     
    use strict;
    use warnings;
     
     
    my $sequence = 'ATC.GATGAT....ACAGTAGATA..CAGATATG..TTCGCG...ATATAGGCAAG...ATGGATA.CCAGTA.T';
     
    =h
    A partier du Xième caractère (2ème A de CAGATATG)		X = 30
    Récupérer N nucléotides de part et d'autre			N = 5
     
    Résultat TA..CAGATATG..T
     
     
    =cut
     
     
    my @sequence_list = split (//, $sequence);
     
    my $x = 30;
    # $x - 1 pour avoir l'indice de l'array
    $x --;
     
    my $n = 5;
    my $ok = 0;
     
    my $x2 = $x;
     
     
    my $subseq .= $sequence_list[$x];
     
     
     
    # récupération de n nucléotides à droite à partir de $xième
    while ($ok < $n){
     
    	# on progresse 1 à 1
    	$x ++;
     
    	if ($sequence_list[$x] =~ m/[ATCG]/i ){		
     
    		$ok ++;
    		$subseq .= $sequence_list[$x];
    	}
     
    }
     
    $ok = 0;
     
     
    # récupération de n nucléotides à gauche à partir de $xième
    while ($ok < $n){
     
    	# on progresse 1 à 1
    	$x2 --;
     
    	if ($sequence_list[$x2] =~ m/[ATCG]/i ){		
     
    		$ok ++;
    		$subseq = $sequence_list[$x2].$subseq ;
     
    		print "$x2 => $sequence_list[$x2]\n";
    	}
     
    }
     
     
     
    print "$subseq\n";

  10. #10
    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
    Je ne comprends pas Jasmine. Tu dis cela
    Citation Envoyé par Jasmine80 Voir le message
    Je ne veux pas 5 caractères, je veux 5 lettres (A, T, C ou G) quelques soit le nombre de points intermédiaires.
    et tu attends ce résultat :
    Citation Envoyé par Jasmine80 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
    =h
    A partier du Xième caractère (2ème A de CAGATATG)		X = 30
    Récupérer N nucléotides de part et d'autre			N = 5
     
    Résultat TA..CAGATATG..T
    Pourrais-tu préciser, car j'ai une autre solution, mais il faudrait savoir si :
    - les X caractères représentent X lettres ou X caractères quelconques (incluant le .)
    - les N nucléotides peuvent-elle contenir des . comme dans ton exemple (donc ce serait des caractères et non des lettres) ?

  11. #11
    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
    my @subseq2 = @{[substr($hash_ali{$id2}, 0, $X) =~ /([A-Z])/gi]}[-$N..-1], @{[substr($hash_ali{$id2}, $X-1) =~ /([A-Z])/gi]}[0 .. $N];
    j'obtiens l'erreur 'Useless use of array slice in void context at best_variable_region.pl line 76.' savez-vous pourquoi?


    Merci

  12. #12
    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
    Quelles sont les valeurs de :
    - $N
    - [substr($hash_ali{$id2}, 0, $X) =~ /([A-Z])/gi]
    - [substr($hash_ali{$id2}, $X-1) =~ /([A-Z])/gi]

  13. #13
    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
    merci de me répondre si rapidement

    j'utilise une boucle qui analyse un fichier, pour la majorité des cas, cela fonctionne mais il doit y en avoir un qui coince.

    voici le programme
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    #!/usr/local/bin/perl
     
     
     
    use strict;
    use warnings;
     
    use Data::Dumper;
    use Bio::SeqIO;
     
     
    #-------------------------------- best_variable_region_per_seq.pl
     
     
     
    # fichier d'entrées
    my $infile = 'P:/Theorie/Leonid/pamgene/purA/test.fsa';
    my $in  = Bio::SeqIO->new(-file => $infile , '-format' => 'fasta');
     
    # taille de la région de part et d'autre du point central
    my $N =  4;
    my $l;
     
    my %hash_ali;
     
    my $start = 0;
     
    my $gap_symbol = '';
     
    while ( my $seq_IO = $in->next_seq() ) {
     
    	$hash_ali{$seq_IO->primary_id} = $seq_IO->seq ;
    	$l = length ($seq_IO->seq);
     
     
    	# on recherche la position où toutes 
    	# les séquences sont alignées
    	my ($s) = $seq_IO->seq =~ m/^([^a-z]*)/i;
    	my $l = length ($s) + 1;
     
    	if ($start < $l){
    		$start = $l
    	}
     
    	($gap_symbol) = $seq_IO->seq =~ m/([^a-z])/i;
    }
     
     
     
    my $k = $l - 2 * $N + 1;
     
    foreach my $id (sort keys %hash_ali){
     
    	my %score_id;
     
    	my @array_score;
     
    	for my $X ( $N + 1 + $start ..$k){
     
    		# my $subseq = join "", @{[substr($hash_ali{$id}, 0, $X-1) =~ /([A-Z])/gi]}[-$N..-1], @{[substr($hash_ali{$id}, $X-1) =~ /([A-Z])/gi]}[0 .. $N];
     
    		my @subseq = @{[substr($hash_ali{$id}, 0, $X) =~ /([A-Z])/gi]}[-$N..-1], @{[substr($hash_ali{$id}, $X-1) =~ /([A-Z])/gi]}[0 .. $N];
     
    =h
    		my $rx = join ('\\'.$gap_symbol.'*', @subseq );
    		my ($subseq_ali) =  $hash_ali{$id} =~m/($rx)/;	
     
    		my $pos = $X - 2 * $N;
     
    		my $score = 0;
     
    		foreach my $id2 (keys %hash_ali){
     
    			if ($id2 ne $id){
     
     
    				my @subseq2 = @{[substr($hash_ali{$id2}, 0, $X) =~ /([A-Z])/gi]}[-$N..-1], @{[substr($hash_ali{$id2}, $X-1) =~ /([A-Z])/gi]}[0 .. $N];
     
    				# print join "$id\t".('', @subseq)."\t$id2".('', @subseq2)."\n";				
    				for my $j (0..$#subseq){
     
    					if ($subseq[$j] ne $subseq2[$j]){
    						$score ++;
    					}				
    				}
     
    			}
     
    		}
     
    		print "$id\t$pos\t$score\t$subseq_ali\n";
     
    		push @{$array_score[$score]}, $score;
     
    =cut	
     
    	}
     
     
    	 # $score_id{$id} = \(sort {$b<=>$a} @array_score)[0..10];
     
    	# print Dumper %score_id ;
     
    }
    et voici le fichier analysé
    >SHAE
    ----------ACTGAGAAGATTG--AAATACGTACATTA-CATAATTCAG
    >SSAP
    ----GGGCCAACTGAGAAGATTG--AAATCTTCACGTCA-CATAATTCAG
    >Staphylococcus_epidermidis
    AGCAGAGCAAGCAGACGTAATTGCTAGATTTTCTGGTGGTAACAATGCGG
    >Staphylococcus_oralis
    ATCTGGCCCAACTGAGAAAGTTG--AGATACGAACACCA-ACCAACTCGC
    >Staphylococcus_carnosus
    ---GGGGCCAACTGAGAATGTTG--AAATGCGAACACCA-ACGAGTTCAC
    >Staphylococcus_haemolyticus
    ----------ACTGAGAAGATTG--AAATACGTACATTA-CATAATTCAG
    >Staphylococcus_hominis
    GCCTGGACCTACTGAGAAGATTG--AAATATGAACGCCA-CATAATTCAG
    >Staphylococcus_aureus
    ATCTGGACCAACTGAGAAGATAG--AAATTTGTACATTA-CATAATTCTG
    le but étant de trouver la séquence de taille (2 * $N) la plus variable pour chaque séquence (par rapport à l'ensemble des autres séquences)

    merci

  14. #14
    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 ... join
    j'ai oublié le join "", ... désolée


    ça fonctionne maintenant

  15. #15
    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 il y a toujours un problème
    a mais non, c'était bon

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

Discussions similaires

  1. récupérer une sous chaine de %%D de mon For
    Par touns390 dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 01/07/2008, 17h14
  2. récupérer une sous-chaîne à partie d'une chaîne
    Par aroua dans le forum Général Java
    Réponses: 8
    Dernier message: 18/04/2008, 15h36
  3. Récupérer une Sous Chaine
    Par ZIED dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 28/11/2007, 10h50
  4. Récupérer une sous chaine de caractère
    Par Alexandre` dans le forum C
    Réponses: 9
    Dernier message: 27/02/2007, 00h15
  5. [String] Récupérer une sous -chaîne sans split
    Par Crazyblinkgirl dans le forum Langage
    Réponses: 3
    Dernier message: 19/07/2004, 14h45

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