def test_basic(self): ibd_segs = find_ibd(self.ts, sample_pairs=[(0, 1)]) true_segs = { (0, 1): [ibd.Segment(0.0, 0.4, 2), ibd.Segment(0.4, 1.0, 3)] } assert ibd_is_equal(ibd_segs, true_segs)
def test_defaults(self): ibd_segs = find_ibd(self.ts, sample_pairs=[(1, 2)]) true_segs = { (1, 2): [ibd.Segment(0.0, 0.2, 4), ibd.Segment(0.2, 1.0, 4)], } assert ibd_is_equal(ibd_segs, true_segs)
def test_input_sample_pairs(self): ibd_segs = find_ibd(self.ts, sample_pairs=[(0, 1), (0, 3)]) true_segs = { (0, 1): [ibd.Segment(0.0, 1.0, 4)], (0, 3): [ibd.Segment(0.3, 1.0, 4), ibd.Segment(0.0, 0.3, 5)], } assert ibd_is_equal(ibd_segs, true_segs)
def test_basic(self): ibd_f = ibd.IbdFinder(self.ts) ibd_segs = ibd_f.find_ibd_segments() ibd_segs = convert_dict_of_segmentlists(ibd_segs) true_segs = { (0, 1): [ibd.Segment(0.0, 0.4, 2), ibd.Segment(0.4, 1.0, 3)] } assert ibd_is_equal(ibd_segs, true_segs)
def test_defaults(self): ibd_f = ibd.IbdFinder(self.ts) ibd_segs = ibd_f.find_ibd_segments() ibd_segs = convert_dict_of_segmentlists(ibd_segs) true_segs = { (0, 1): [ibd.Segment(0.0, 1.0, 3)], (0, 2): [ibd.Segment(0.0, 1.0, 4)], (1, 2): [ibd.Segment(0.0, 1.0, 4)], } assert ibd_is_equal(ibd_segs, true_segs)
def test_defaults(self): ts = self.ts ibd_f = ibd.IbdFinder(ts) ibd_segs = ibd_f.find_ibd_segments() true_segs = { (0, 1): [ ibd.Segment(0.0, 0.2, 4), ibd.Segment(0.7, 1.0, 4), ibd.Segment(0.2, 0.7, 4), ] } ibd_segs = convert_dict_of_segmentlists(ibd_segs) assert ibd_is_equal(ibd_segs, true_segs)
def test_basic(self): ibd_segs = find_ibd(self.ts, sample_pairs=[(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]) true_segs = { (0, 1): [], (0, 2): [ibd.Segment(0.0, 1.0, 2)], (0, 3): [], (1, 2): [], (1, 3): [ibd.Segment(0.0, 1.0, 3)], (2, 3): [], } assert ibd_is_equal(ibd_segs, true_segs)
def test_time(self): ts = self.ts ibd_f = ibd.IbdFinder(ts, max_time=3) ibd_segs = ibd_f.find_ibd_segments() true_segs = { (0, 1): [ibd.Segment(0, 1, 4)], (0, 2): [ibd.Segment(0, 0.3, 4)], (0, 3): [ibd.Segment(0.3, 1, 4)], (1, 2): [ibd.Segment(0, 0.3, 4)], (1, 3): [ibd.Segment(0.3, 1, 4)], (2, 3): [], } ibd_segs = convert_dict_of_segmentlists(ibd_segs) assert ibd_is_equal(ibd_segs, true_segs)
def test_time(self): ibd_segs = find_ibd( self.ts, sample_pairs=[(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)], max_time=3, ) true_segs = { (0, 1): [ibd.Segment(0, 1, 4)], (0, 2): [ibd.Segment(0, 0.3, 4)], (0, 3): [ibd.Segment(0.3, 1, 4)], (1, 2): [ibd.Segment(0, 0.3, 4)], (1, 3): [ibd.Segment(0.3, 1, 4)], (2, 3): [], } assert ibd_is_equal(ibd_segs, true_segs)
def test_length(self): ts = self.ts ibd_f = ibd.IbdFinder(ts, min_length=0.4) ibd_segs = ibd_f.find_ibd_segments() true_segs = {(0, 1): [ibd.Segment(0.2, 0.7, 4)]} ibd_segs = convert_dict_of_segmentlists(ibd_segs) assert ibd_is_equal(ibd_segs, true_segs)
def test_time(self): ibd_segs = find_ibd(self.ts, sample_pairs=[(0, 1)], max_time=1.2, compare_lib=True) true_segs = {(0, 1): [ibd.Segment(0.0, 0.4, 2)]} assert ibd_is_equal(ibd_segs, true_segs)
def test_length(self): ibd_segs = find_ibd(self.ts, sample_pairs=[(0, 1)], min_length=0.5, compare_lib=True) true_segs = {(0, 1): [ibd.Segment(0.4, 1.0, 3)]} assert ibd_is_equal(ibd_segs, true_segs)
def test_time(self): ibd_f = ibd.IbdFinder(self.ts, max_time=1.5) ibd_segs = ibd_f.find_ibd_segments() ibd_segs = convert_dict_of_segmentlists(ibd_segs) true_segs = { (0, 1): [ibd.Segment(0.0, 1.0, 3)], (0, 2): [], (1, 2): [] } assert ibd_is_equal(ibd_segs, true_segs)
def test_input_sample_pairs(self): ibd_f = ibd.IbdFinder(self.ts, sample_pairs=[(0, 1), (2, 3), (1, 3)]) ibd_segs = ibd_f.find_ibd_segments() ibd_segs = convert_ibd_output_to_seglists(ibd_segs) true_segs = { (0, 1): [ ibd.Segment(0.0, 0.2, 4), ibd.Segment(0.7, 1.0, 4), ibd.Segment(0.2, 0.7, 4), ], (2, 3): [ibd.Segment(0.2, 0.7, 4)], } ibd_segs = find_ibd( self.ts, sample_pairs=[(0, 1), (2, 3)], compare_lib=True, print_c=False, print_py=False, ) assert ibd_is_equal(ibd_segs, true_segs)
def test_time(self): ibd_segs = find_ibd( self.ts, sample_pairs=[(0, 1), (0, 2), (1, 2)], max_time=1.5, compare_lib=True, ) true_segs = { (0, 1): [ibd.Segment(0.0, 1.0, 3)], (0, 2): [], (1, 2): [] } assert ibd_is_equal(ibd_segs, true_segs)
def convert_ibd_output_to_seglists(ibd_out): """ Converts the Python mock-up output back into lists of segments. This is needed to use the ibd_is_equal function. """ for key in ibd_out.keys(): seg_list = [] num_segs = len(ibd_out[key]["left"]) for s in range(num_segs): seg_list.append( ibd.Segment( left=ibd_out[key]["left"][s], right=ibd_out[key]["right"][s], node=ibd_out[key]["node"][s], )) ibd_out[key] = seg_list return ibd_out
def test_length(self): ts = self.ts ibd_f = ibd.IbdFinder(ts, min_length=0.5) ibd_segs = ibd_f.find_ibd_segments() true_segs = { (0, 1): [ibd.Segment(0, 1, 4)], (0, 2): [ibd.Segment(0.3, 1, 5)], (0, 3): [ibd.Segment(0.3, 1, 4)], (1, 2): [ibd.Segment(0.3, 1, 5)], (1, 3): [ibd.Segment(0.3, 1, 4)], (2, 3): [ibd.Segment(0.3, 1, 5)], } ibd_segs = convert_dict_of_segmentlists(ibd_segs) assert ibd_is_equal(ibd_segs, true_segs)
def test_length(self): ibd_segs = find_ibd( self.ts, sample_pairs=[(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)], min_length=0.5, ) true_segs = { (0, 1): [ibd.Segment(0, 1, 4)], (0, 2): [ibd.Segment(0.3, 1, 5)], (0, 3): [ibd.Segment(0.3, 1, 4)], (1, 2): [ibd.Segment(0.3, 1, 5)], (1, 3): [ibd.Segment(0.3, 1, 4)], (2, 3): [ibd.Segment(0.3, 1, 5)], } assert ibd_is_equal(ibd_segs, true_segs)
def test_defaults(self): ibd_segs = find_ibd(self.ts, sample_pairs=[(0, 2)]) true_segs = { (0, 2): [ibd.Segment(0, 1, 3)], } assert ibd_is_equal(ibd_segs, true_segs)
def test_length(self): ibd_f = ibd.IbdFinder(self.ts, min_length=0.5) ibd_segs = ibd_f.find_ibd_segments() ibd_segs = convert_dict_of_segmentlists(ibd_segs) true_segs = {(0, 1): [ibd.Segment(0.4, 1.0, 3)]} assert ibd_is_equal(ibd_segs, true_segs)
def test_defaults(self): ts = self.ts ibd_f = ibd.IbdFinder(ts) ibd_segs = ibd_f.find_ibd_segments() # print(ibd_segs[(0,1)]) true_segs = { (0, 1): [ibd.Segment(0, 1, 4)], (0, 2): [ibd.Segment(0, 0.3, 4), ibd.Segment(0.3, 1, 5)], (0, 3): [ibd.Segment(0, 0.3, 5), ibd.Segment(0.3, 1, 4)], (1, 2): [ibd.Segment(0, 0.3, 4), ibd.Segment(0.3, 1, 5)], (1, 3): [ibd.Segment(0, 0.3, 5), ibd.Segment(0.3, 1, 4)], (2, 3): [ibd.Segment(0.3, 1, 5), ibd.Segment(0, 0.3, 5)], } ibd_segs = convert_dict_of_segmentlists(ibd_segs) # print(ibd_segs) assert ibd_is_equal(ibd_segs, true_segs)
def test_defaults(self): ibd_segs = find_ibd(self.ts, sample_pairs=[(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]) true_segs = { (0, 1): [ibd.Segment(0, 1, 4)], (0, 2): [ibd.Segment(0, 0.3, 4), ibd.Segment(0.3, 1, 5)], (0, 3): [ibd.Segment(0, 0.3, 5), ibd.Segment(0.3, 1, 4)], (1, 2): [ibd.Segment(0, 0.3, 4), ibd.Segment(0.3, 1, 5)], (1, 3): [ibd.Segment(0, 0.3, 5), ibd.Segment(0.3, 1, 4)], (2, 3): [ibd.Segment(0.3, 1, 5), ibd.Segment(0, 0.3, 5)], } assert ibd_is_equal(ibd_segs, true_segs)
def test_length(self): ibd_segs = find_ibd(self.ts, sample_pairs=[(0, 1)], min_length=0.4) true_segs = {(0, 1): [ibd.Segment(0.2, 0.7, 4)]} assert ibd_is_equal(ibd_segs, true_segs)
def get_ibd( sample0, sample1, treeSequence, min_length=0, max_time=None, path_ibd=True, mrca_ibd=True, ): """ Returns all IBD segments for a given pair of nodes in a tree using a naive algorithm. Note: This function probably looks more complicated than it needs to be -- This is because it also calculates other 'versions' of IBD (mrca_ibd=False, path_ibd=False) that we have't implemented properly yet. """ ibd_list = [] ts, node_map = treeSequence.simplify(samples=[sample0, sample1], keep_unary=True, map_nodes=True) node_map = node_map.tolist() for n in ts.nodes(): if max_time is not None and n.time > max_time: break node_id = n.id interval_list = [] if n.flags == 1: continue prev_dict = None for t in ts.trees(): if len(list(t.nodes(n.id))) == 1 or t.num_samples(n.id) < 2: continue if mrca_ibd and n.id != t.mrca(0, 1): continue current_int = t.get_interval() if len(interval_list) == 0: interval_list.append(current_int) else: prev_int = interval_list[-1] if not path_ibd and prev_int[1] == current_int[0]: interval_list[-1] = (prev_int[0], current_int[1]) elif prev_dict is not None and subtrees_are_equal( t, prev_dict, node_id): interval_list[-1] = (prev_int[0], current_int[1]) else: interval_list.append(current_int) prev_dict = t.get_parent_dict() for interval in interval_list: if min_length == 0 or interval.right - interval.left > min_length: orig_id = node_map.index(node_id) ibd_list.append(ibd.Segment(interval[0], interval[1], orig_id)) return ibd_list