""" Support for chopping a list of alignment blocks to only the portion that intersects a particular interval. """ def chop_list( blocks, src, start, end ): """ For each alignment block in the sequence `blocks`, chop out the portion of the block that overlaps the interval [`start`,`end`) in the component/species named `src`. """ new_blocks = [] for block in blocks: ref = block.get_component_by_src( src ) # If the reference component is on the '-' strand we should complement the interval if ref.strand == '-': slice_start = max( ref.src_size - end, ref.start ) slice_end = max( ref.src_size - start, ref.end ) else: slice_start = max( start, ref.start ) slice_end = min( end, ref.end ) sliced = block.slice_by_component( ref, slice_start, slice_end ) good = True for c in sliced.components: if c.size < 1: good = False if good: new_blocks.append( sliced ) return new_blocks