def _remove_overlaps(self, position_idy: IntervalTree, percents: dict): while len(position_idy) > 0: item = position_idy.pop() start = item.begin end = item.end cat = item.data overlaps = position_idy.search(start, end) if len(overlaps) > 0: has_overlap = False for overlap in overlaps: if has_overlap: break o_start = overlap.begin o_end = overlap.end o_cat = overlap.data if not position_idy.containsi(o_start, o_end, o_cat): continue if start < o_start: if end <= o_end: # cccccccccccccc******* # *****ooooooooo[ooooooo] if o_cat < cat: if end < o_end: # No overlap with the current item, we stay has_overlap as False position_idy.discard(overlap) position_idy[end:o_end] = o_cat else: position_idy.discard( overlap) # No kept overlap elif o_cat == cat: if end < o_end: has_overlap = True position_idy.discard(overlap) position_idy[start:o_end] = cat else: position_idy.discard( overlap) # No kept overlap else: has_overlap = True position_idy.discard(overlap) position_idy[start:o_start] = cat position_idy[o_start:o_end] = o_cat else: # end > o_end # ccccccccccccccccccc # *****oooooooooo**** if o_cat <= cat: position_idy.discard( overlap) # No kept overlap else: # o_cat > cat has_overlap = True position_idy.discard(overlap) position_idy[start:o_start] = cat position_idy[o_start:o_end] = o_cat position_idy[o_end:end] = cat elif start == o_start: if end < o_end: # cccccccccccc******* # ooooooooooooooooooo if o_cat < cat: # No overlap with the current item, we stay has_overlap as False position_idy.discard(overlap) position_idy[end:o_end] = o_cat elif o_cat == cat: has_overlap = True position_idy.discard(overlap) position_idy[start:o_end] = cat else: # o_cat > cat # The overlap just contains current item has_overlap = True elif end == o_end: # ***cccccccccccccccc*** # ***oooooooooooooooo*** if o_cat <= cat: position_idy.discard( overlap) # No kept overlap else: # The overlap just contains current item has_overlap = True else: # end > o_end # ccccccccccccccccccccccccccccc # oooooooooooooooooooo********* if o_cat <= cat: # current item just contains the overlap position_idy.discard(overlap) else: has_overlap = True position_idy.discard(overlap) position_idy[o_start:o_end] = o_cat position_idy[o_end:end] = cat else: # start > o_start if end <= o_end: # ******ccccccccc******* # ooooooooooooooo[ooooooo] if o_cat < cat: has_overlap = True position_idy.discard(overlap) position_idy[o_start:start] = o_cat position_idy[start:end] = cat if end < o_end: position_idy[end:o_end] = o_cat else: # o_cat >= cat # Overlap just contains the item has_overlap = True else: # end > o_end # ******ccccccccccccccccccccc # ooooooooooooooooo********** if o_cat < cat: has_overlap = True position_idy.discard(overlap) position_idy[o_start:start] = o_cat position_idy[start:end] = cat elif o_cat == cat: has_overlap = True position_idy.discard(overlap) position_idy[o_start:end] = cat else: # o_cat > cat has_overlap = True position_idy[o_end:end] = cat if not has_overlap: percents = self._add_percents(percents, item) else: percents = self._add_percents(percents, item) return percents