def build_rb_data()

in source/src/molecule-unfolding/utility/GraphModel.py [0:0]


    def build_rb_data(self):
        # find L/R fragments
        rb_data = {}
        self.rb_name = []

        def clear_set(src, value):
            for i in range(2):
                if value[i] in src:
                    src.remove(value[i])

        def update_pts_pair(rb_data):
            rb_data['pair_set'] = set()
            for f_0_pt in rb_data['f_0_set']:
                for f_1_pt in rb_data['f_1_set']:
                    pair_pts = (f_0_pt, f_1_pt)
                    if pair_pts not in rb_data['pair_set']:
                        rb_data['pair_set'].add(pair_pts)

        # add list to save invalid rb
        invalid_rb_list = []
        invalid_rb_name_list = []
        for rb in self.rb_list:
            self.mol_ug.remove_edge(rb[0], rb[1])
            current_rb_name = "{}+{}".format(rb[0], rb[1])
            self.rb_name.append(current_rb_name)
        #     print(rb_name)
            if current_rb_name not in rb_data.keys():
                rb_data[current_rb_name] = {}
                i = 0
                for pts in nx.connected_components(self.mol_ug):
                    #             print(pts)
                    update_pts = pts.copy()
                    clear_set(update_pts, rb)
                    rb_data[current_rb_name]['f_{}_set'.format(i)] = update_pts
                    i = i + 1
                if "f_1_set" not in rb_data[current_rb_name].keys():
                    invalid_rb_list.append(rb)
                    invalid_rb_name_list.append(current_rb_name)
                    # print(f"rb_name {current_rb_name} f_0_set {rb_data[current_rb_name]['f_0_set']} with length {len(rb_data[current_rb_name]['f_0_set'])}")
                # update bc score
                rb_data[current_rb_name]['bc_num'] = (
                    self.bc[rb[0]] + self.bc[rb[1]])/2
                # update make pts pair set
        #         update_pts_pair(rb_data[rb_name])
            self.mol_ug.add_edge(rb[0], rb[1])
        
        for invalid_rb, invalid_rb_name in zip(invalid_rb_list, invalid_rb_name_list):
            self.rb_list.remove(invalid_rb)
            del rb_data[invalid_rb_name]

        sort_rb_data = {k: v for k, v in sorted(rb_data.items(), key=lambda rb: -rb[1]['bc_num'])}

        rb_data_list = []
        for rb, data in sort_rb_data.items():
            if len(rb_data_list) == 0:
                current_rb_data = {}
            else:
                current_rb_data = rb_data_list[-1].copy()
            current_rb_data[rb] = data
            rb_data_list.append(current_rb_data)
            logging.debug(rb_data_list)

        return rb_data, rb_data_list