def test_keep_chars(self): """keep_chars returns a string containing only chars in keep""" f = keep_chars('ab c3*[') self.assertEqual(f(''),'') #empty self.assertRaises(AttributeError,f,None) #None #one character, case sensitive self.assertEqual(f('b'),'b') self.assertEqual(f('g'),'') self.assertEqual(f('xyz123'),'3') self.assertEqual(f('xyz 123'),' 3') #more characters, case sensitive self.assertEqual(f('kjbwherzcagebcujrkcs'),'bcabcc') self.assertEqual(f('f[ffff*ff*fff3fff'),'[**3') # case insensitive f = keep_chars('AbC',False) self.assertEqual(f('abcdef'),'abc') self.assertEqual(f('ABCDEF'),'ABC') self.assertEqual(f('aBcDeF'),'aBc')
def __init__( self, Monomers, Degenerates=None, Gaps=None, Complements=None, Order=None, Pairs=None, WeightAdjust=0, add_lower=True, ): """Returns new Alphabet object, minimally initialized with monomers. Monomers: Dict of monomers, keyed by symbol. Expect 1-letter and 3-letter symbols, name, and molecular weight (in chain). Degenerate: Dict of degenerate symbol -> monomer mapping. Gaps: Dict of valid gap symbols. Complements:Dict of monomer -> complement (optional). Order: Customary order in which symbols appear. Used by __iter__. Pairs: Dict of tuples containing valid, non-degenerate pairs. WeightAdjust: Weight added for terminal residue add_lower: Whether or not to add lowercase chars (default True) NOTE: All of Monomers, Degenerates, Gaps, Complements, Order, Pairs _must_ support keys() and items() if present. Alphabets should be treated as immutable, though at present there is no explicit code to enforce this. However, the Alphabet makes several additional variables on creation, which would need to be handled carefully if some of the Alphabet's components were changed. """ self.Monomers = Monomers self.Degenerates = Degenerates or {} self.Gaps = Gaps or {} self.Complements = Complements or {} self.Matches = MatchMaker(Monomers, Gaps, Degenerates) self.Pairs = Pairs or {} self.Pairs.update(PairMaker(Pairs, Monomers, Gaps, Degenerates)) self._add_order(Order) self.WeightAdjust = WeightAdjust if add_lower: self._add_lowercase() self._make_all() self._make_comp_table() self.GapString = "".join(self.Gaps.keys()) self.stripDegenerate = FunctionWrapper(keep_chars(self.GapString + self.Order)) self.stripBad = FunctionWrapper(keep_chars("".join(self.All.keys()))) self.stripBadAndGaps = FunctionWrapper( keep_chars("".join(map("".join, [self.Monomers.keys(), self.Degenerates.keys()]))) ) # make inverse degenerates from degenerates # ensure that lowercase versions also exist inv_degens = {} for key, val in self.Degenerates.items(): inv_degens[ImmutableSet(val)] = key inv_degens[ImmutableSet(val.lower())] = key.lower() for m in self.Monomers: inv_degens[ImmutableSet(m)] = m inv_degens[ImmutableSet(m.lower())] = m.lower() for m in self.Gaps: inv_degens[ImmutableSet(m)] = m self.InverseDegenerates = inv_degens