def hit_filter(self, func=None): """Creates a new QueryResult object whose Hit objects pass the filter function. Arguments: func -- Callback function that accepts a Hit object as its parameter, does a boolean check, and returns True or False Here is an example of using `hit_filter` to select Hits whose description begins with the string 'H**o sapiens', case sensitive: >>> from SAP.Bio import SearchIO >>> qresult = next(SearchIO.parse('Blast/mirna.xml', 'blast-xml')) >>> def desc_filter(hit): ... return hit.description.startswith('H**o sapiens') ... >>> len(qresult) 100 >>> filtered = qresult.hit_filter(desc_filter) >>> len(filtered) 39 >>> print(filtered[:4]) Program: blastn (2.2.27+) Query: 33211 (61) mir_1 Target: refseq_rna Hits: ---- ----- ---------------------------------------------------------- # # HSP ID + description ---- ----- ---------------------------------------------------------- 0 1 gi|262205317|ref|NR_030195.1| H**o sapiens microRNA 52... 1 2 gi|262205330|ref|NR_030198.1| H**o sapiens microRNA 52... 2 1 gi|262205302|ref|NR_030191.1| H**o sapiens microRNA 51... 3 1 gi|262205451|ref|NR_030222.1| H**o sapiens microRNA 51... Note that instance attributes (other than the hits) from the unfiltered QueryResult are retained in the filtered object. >>> qresult.program == filtered.program True >>> qresult.target == filtered.target True """ hits = list(filter(func, self.hits)) obj = self.__class__(hits, self.id, self._hit_key_function) self._transfer_attrs(obj) return obj
def _filter_search(self, filter_func, order, follow_attrs): """Perform a BFS or DFS traversal through all elements in this tree. :returns: generator of all elements for which `filter_func` is True. """ order_opts = {'preorder': _preorder_traverse, 'postorder': _postorder_traverse, 'level': _level_traverse} try: order_func = order_opts[order] except KeyError: raise ValueError("Invalid order '%s'; must be one of: %s" % (order, tuple(order_opts))) if follow_attrs: get_children = _sorted_attrs root = self else: get_children = lambda elem: elem.clades root = self.root return filter(filter_func, order_func(root, get_children))
def _filter_search(self, filter_func, order, follow_attrs): """Perform a BFS or DFS traversal through all elements in this tree. :returns: generator of all elements for which `filter_func` is True. """ order_opts = { 'preorder': _preorder_traverse, 'postorder': _postorder_traverse, 'level': _level_traverse } try: order_func = order_opts[order] except KeyError: raise ValueError("Invalid order '%s'; must be one of: %s" % (order, tuple(order_opts))) if follow_attrs: get_children = _sorted_attrs root = self else: get_children = lambda elem: elem.clades root = self.root return filter(filter_func, order_func(root, get_children))
def filter(self, func=None): """Creates a new Hit object whose HSP objects pass the filter function. Arguments: func -- Callback function that accepts a HSP object as its parameter, does a boolean check, and returns True or False. `filter` is analogous to Python's built-in `filter` function, except that instead of returning a list it returns a `Hit` object. Here is an example of using `filter` to select for HSPs having bitscores bigger than 60: >>> from SAP.Bio import SearchIO >>> qresult = next(SearchIO.parse('Blast/mirna.xml', 'blast-xml')) >>> hit = qresult[3] >>> evalue_filter = lambda hsp: hsp.bitscore > 60 >>> filtered_hit = hit.filter(evalue_filter) >>> len(hit) 2 >>> len(filtered_hit) 1 >>> print(filtered_hit) Query: 33211 mir_1 Hit: gi|301171322|ref|NR_035857.1| (86) Pan troglodytes microRNA mir-520c (MIR520C), microRNA HSPs: ---- -------- --------- ------ --------------- --------------------- # E-value Bit score Span Query range Hit range ---- -------- --------- ------ --------------- --------------------- 0 8.9e-20 100.47 60 [1:61] [13:73] """ hsps = list(filter(func, self.hsps)) if hsps: obj = self.__class__(hsps) self._transfer_attrs(obj) return obj