Bonjour,

Voici mon problème,

J'ai une série de 139 séquences contenues dans un hash dont la clé est l'identifiant de la séquence et la valeur la séquence elle-même. Je voudrais prendre une à une les séquences de ce hash et écrire les 138 autres dans un fichier. J'y arrive d'une façon un peu torue, en utilisant un array en parallèle de ce hash. Je voulais savoir si une autre façon plus propre n'existe elle pas.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
	# sequence en cours
	my $output_file = $id.'.blast';
	# les 138 autres séquences
	my @other_seq = grep{$_ !~ /$id/}@a_sequences;
	# toutes les autres séquences de %h_sequences
	# format fasta  : >id\n$seq\n
	map {print $handle_fasta $_;} @other_seq;
Un autre problème vient de la commande système
Code : Sélectionner tout - Visualiser dans une fenêtre à part
	system("formatdb -p F -i $path"."fasta_prov.fa -n $path"."$blastDB_file")   or warn $!;
Bad file descriptor at 104Blast_sonde.pl line 54, <GEN0> line 5.
Pourtant, elle fonctionne quand je l'écris directement dans la console et elle fonctionnait dans le code précédant ... je ne comprends pas.



code complet
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
#----------------- 104Blast_sonde.pl
 
use strict;
use warnings;
 
use Time::localtime;
use DBI;
use FileHandle;
use Bio::Tools::Run::StandAloneBlast;
 
my $start= ctime();
 
#------------#
#   FILES   #
#------------#
# chemin du répertoire de travail
my $path = 'P:/Theorie/PCR_Bact_Hybridation/Sondes_en_Demis/NouveauxMarqueurs/16S/sondes_candidates/analyses_12_11_08/';
# fichier fasta contenant toutes les séquences (139 séquences)
my $fasta_file= 'fasta_sondes_candidates.txt';
 
 
# récupération des séquences de $fasta_file
my $in  = Bio::SeqIO->new(-file => $path.$fasta_file, '-format' => 'Fasta');
 
# mise des séquences dans un hash et un array
my %h_sequences;
my @a_sequences;
while ( my $seq = $in->next_seq()){
	$h_sequences{$seq->primary_id} = $seq->seq;
	push (@a_sequences, '>'.$seq->primary_id."\n".$seq->seq."\n");
}
 
# Blast une à une des sondes versus le reste des sondes
while (my ($id, $seq) = each %h_sequences){
 
	# fichier provisoire contenant les séquences à mettre dans la blastDB (138 séquences)
	my $handle_fasta = FileHandle->new(">".$path.'fasta_prov.fa');
	# fichier provisoire de la base de données blast
	my $blastDB_file = 'prov_BlastDB';
 
	# sequence en cours
	my $output_file = $id.'.blast';
	# les 138 autres séquences
	my @other_seq = grep{$_ !~ /$id/}@a_sequences;
	# toutes les autres séquences de %h_sequences
	# format fasta  : >id\n$seq\n
	map {print $handle_fasta $_;} @other_seq;
 
	#------------#
	# BLAST    #
	#------------#
	my $path_bin = 'C:/BLAST/bin';
	chdir($path_bin); 
	system("formatdb -p F -i $path"."fasta_prov.fa -n $path"."$blastDB_file")   or warn $!;
	my $path_work = 'P:/Perl/scripts2/Analyse_Sites_Epissage';
	chdir($path_work);
 
	# blast
	my $input = Bio::Seq->new(-id=> $id,-seq=>$seq);
	my @params = ('program' => 'blastn' , 'database' => $path.$blastDB_file );
	my $factory = Bio::Tools::Run::StandAloneBlast->new(@params);
	$factory->outfile($path.$output_file);
	$factory->executable('blastall', 'C:/BLAST/bin/blastall.exe');
	my $bl2seq_report = $factory->blastall($input);
 
}
 
my $end = ctime();
print "$start\n$end\n";

Tout conseil pour optimiser ce code est le bienvenu et merci pour votre aide ,