Précédent   Forum du club des développeurs et IT Pro > Autres langages > Perl > Langage
Langage Toutes vos questions sur les scripts Perl en général. Avant de poster, veuillez consulter les FAQs perl, les cours Perl, les critiques de livres et les sources Perl.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 14/12/2012, 16h41   #1
Isabella83
Nouveau Membre du Club
 
Inscription : janvier 2010
Messages : 200
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 200
Points : 35
Points : 35
Par défaut Motif commun à des sequences

Bonjour à tous,
Je suis confrontée à un problème que je n'arrive pas à résoudre.
J'ai un fichier qui ressemble à cela :
Code :
Sélectionner tout - Visualiser dans une fenêtre à part

Code :
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
>seq1
ACTTTCCACAACGATGGAAGATGATGA
>seq2
ACTTTCCACAACGATGGAAGATGATGAA
>seq3
ATTCCACAACGATGGAAGATGATGAA
>seq4
CTTTCCACAACGATGGAAGATGATGAA
>seq5
NTCCACAACGATGGAAGATGATGAAGA
>seq6
TACTTTCCACAACGATGGAAGATGATGA
>seq7
TACTTTCCACAACGATGGAAGATGATGAA
>seq8
TCCACAACGATGGAAGATGATGA
>seq9
AAAGAAGAAATTGAATAAATATATGTC
>seq10
AAAGAAGAAATTGAATAAATATATGT
>seq11
AAAGAAGAAATTGAATAAATATATGTCA
>seq12
AAAGAAGAAATTGAATAAATATAT
>seq13
AAAGAAGAAATTGAATAAATATATG
>seq14
AAAGAAGAAATTGAATAAATATA
Je souhaiterai trouver la séquence la plus petite que toutes ces séquences partagent entre elle (en gras dans mon exemple), et donc la seule séquence que j'aimerai récupérer est la seq 8 et seq14
>seq8
TCCACAACGATGGAAGATGATGA
>seq14
AAAGAAGAAATTGAATAAATATA

Quelqu'un aurait une idée ? Une suggestion ?
J'ai fait ceci, mais ca ne fonctionne pas :
Code :
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
#!/usr/bin/perl
use strict;
use warnings;
use Carp qw(confess);
use Getopt::Long;
use List::MoreUtils qw(uniq);
use Bio::SeqIO;
 
my %hash;
my ($fasta_file,$out_file);
GetOptions("fasta=s" => \$fasta_file,"out=s" => \$out_file);
open(my $out,'>',$out_file) or die "$out_file : $!\n\n";
my $in = Bio::SeqIO->new( -file => $fasta_file, '-format' => 'Fasta' );
 
# read file in hash
while ( my $seq = $in->next_seq()){
	my $id = $seq->id() ;
	my $sequence = $seq->seq ;
	$hash{$sequence}=$id;
}
 
my @all_seq=keys (%hash); # @seq contient toutes les sequences
my @uniqueseq;
my $find=0;
 
foreach my $seqs (@all_seq){
	$find=0;
	my $seq=uc($seqs);  #uppercase
	foreach (@uniqueseq){
		if ($_=~/$seq/){ # si ma sequence contient 
			$_=$seq; #remplace avec la plus petite sequence
			$find=1;
		}
	}
	if ($find==0){
		push @uniqueseq,$seq;
	}
}
 
foreach (@uniqueseq){
	print ">$hash{$_}\n$_\n";
}
Isabella83 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 17h28   #2
Lolo78
Membre Expert
 
Homme Laurent R.
Conseil - Consultant en systèmes d'information
Inscription : mai 2012
Messages : 567
Détails du profil
Informations personnelles :
Nom : Homme Laurent R.
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mai 2012
Messages : 567
Points : 1 117
Points : 1 117
Citation:
Envoyé par Isabella83 Voir le message
Je souhaiterai trouver la séquence la plus petite que toutes ces séquences partagent entre elle (en gras dans mon exemple), et donc la seule séquence que j'aimerai récupérer est la seq 8 et seq14
Euh, la plus petite séquence ou la plus grande?
__________________
Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.
Lolo78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 17h33   #3
Isabella83
Nouveau Membre du Club
 
Inscription : janvier 2010
Messages : 200
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 200
Points : 35
Points : 35
La plus petite,
j'ai finalement reussi en fasant comme ceci :
Code :
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
#!/usr/bin/perl
use strict;
use warnings;
use Carp qw(confess);
use Getopt::Long;
use List::MoreUtils qw(uniq);
use Bio::SeqIO;
 
my %hash;
my ($fasta_file,$out_file);
GetOptions("fasta=s" => \$fasta_file,"out=s" => \$out_file);
open(my $out,'>',$out_file) or die "$out_file : $!\n\n";
my $in = Bio::SeqIO->new( -file => $fasta_file, '-format' => 'Fasta' );
 
# read file in hash
while ( my $seq = $in->next_seq()){
	my $id = $seq->id() ;
	my $sequence = $seq->seq ;
	$hash{$sequence}=$id;
}
 
my @all_seq=keys (%hash); # @seq contient toutes les sequences
my @sort_all_seq = sort @all_seq;
 
my @uniqueseq;
my $find=0;
 
foreach my $seqs (@sort_all_seq){
	$find=0;
	my $seq=uc($seqs);  #uppercase
	foreach (@uniqueseq){
		if ($_=~/$seq/){ # si ma sequence contient 
			$_=$seq; #remplace avec la plus petite sequence
			$find=1;
		}
		if ($seq=~/$_/){ 
			$find=1;
		}
	}
	if ($find==0){
		push @uniqueseq,$seq;
	}
}
 
my @final = uniq @uniqueseq;
 
foreach (@final){
	print ">$hash{$_}\n$_\n";
}
Isabella83 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 01h25.


 
 
 
 
Partenaires

Hébergement Web