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.
Un autre problème vient de la commande système
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;
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 $!;Pourtant, elle fonctionne quand je l'écris directement dans la console et elle fonctionnait dans le code précédant ... je ne comprends pas.Bad file descriptor at 104Blast_sonde.pl line 54, <GEN0> line 5.
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 ,
Partager