-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAlign.FastaToStock.pl
executable file
·59 lines (54 loc) · 1.38 KB
/
Align.FastaToStock.pl
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
#!/usr/bin/env perl -w
my $usage = "Usage: $0 <gapped FASTA alignment file(s)>\n";
my @argv;
while (@ARGV) {
my $arg = shift;
if ($arg =~ /^-/) {
if ($arg eq "-h") { print $usage; exit }
else { die $usage }
} else {
push @argv, $arg;
}
}
push @argv, "-" unless @argv;
# loop through FASTA files
foreach my $fasta (@argv) {
# read FASTA file
my %seq;
my @name;
my $name;
open FASTA, "<$fasta" or die "Couldn't open '$fasta': $!";
while (<FASTA>) {
if (/^\s*>\s*(\S+)/) {
$name = $1;
die "Duplicate name: $name" if defined $seq{$name};
push @name, $name;
} else {
if (/\S/ && !defined $name) {
warn "Ignoring: $_";
} else {
s/\s//g;
$seq{$name} .= $_;
}
}
}
close FASTA;
# check all seqs are same length
my $length;
my $lname;
foreach my $name (@name) {
my $l = length $seq{$name};
if (defined $length) {
die "Sequences not all same length ($lname is $length, $name is $l)" unless $length == $l;
} else {
$length = length $seq{$name};
$lname = $name;
}
}
# print Stockholm output
print "# STOCKHOLM 1.0\n";
foreach my $name (@name) {
print $name, " ", $seq{$name}, "\n";
}
print "//\n";
}