Пример #1
0
    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')
Пример #2
0
    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