Skip to content

Commit 75d0c47

Browse files
committed
add method for computing sub-alignments (for ignoring some taxa)
1 parent eb6140d commit 75d0c47

1 file changed

Lines changed: 26 additions & 1 deletion

File tree

splitp/alignment.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,31 @@
11
from collections import UserDict
22

3+
34
class Alignment(UserDict):
45
def __init__(self, data, taxa):
56
self.data = data
6-
self.taxa = taxa
7+
self.taxa = tuple(taxa)
8+
self.sub_alignments = dict()
9+
10+
def sub_alignment(self, sub_taxa):
11+
sub_taxa = tuple(sorted(sub_taxa, key=self.taxa.index))
12+
try:
13+
return self.sub_alignments[sub_taxa]
14+
except KeyError:
15+
pass
16+
sub_taxa_indexer = {taxon: self.taxa.index(taxon) for taxon in sub_taxa}
17+
sub_taxa_indices = sorted(sub_taxa_indexer.values())
18+
if not (set(sub_taxa) <= set(self.taxa)):
19+
raise ValueError("Sub taxa must be a subset of the taxa")
20+
all_patterns = set(self.data.keys())
21+
sub_alignment_data = {}
22+
while len(all_patterns) > 0:
23+
pattern = all_patterns.pop()
24+
trimmed_pattern = "".join(pattern[i] for i in sub_taxa_indices)
25+
try:
26+
sub_alignment_data[trimmed_pattern] += self.data[pattern]
27+
except KeyError:
28+
sub_alignment_data[trimmed_pattern] = self.data[pattern]
29+
sub_alignment = Alignment(sub_alignment_data, sub_taxa)
30+
self.sub_alignments[sub_taxa] = sub_alignment
31+
return sub_alignment

0 commit comments

Comments
 (0)