<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def get_missing_blocks(info_frags_records, matching_pairs, linkage_orderings):
 """Get missing blocks in a scaffold based on the genetic map order. Given matching scaffold blocks/genetic map blocks (based on restriction sites and SNP markers, respectively), move around the scaffold blocks such that they map the genetic map order. Parameters info_frags_records : dict A dictionary representing the scaffolds and their block order as described in an info_frags.txt file matching_pairs : dict A list of best matching pairs in the form (scaffold_block, linkage group) linkage_orderings : dict A dictionary representing the genetic map and the linkage groups as described in csv file. Example ------- ['sctg_308', 996, 15892, 25865, 1] ['sctg_778', 1210, 45040, 78112, -1] ['sctg_842', 124, 0, 8974, 1] ['sctg_842', 126, 19000, 26084, 1] ['sctg_994', 12, 74201, 86010, -1] ['sctg_516', 5, 0, 38000, 1] ['sctg_486', 47, 42050, 49000, 1] ['sctg_1755', 878, 95001, 10844, -1] ['sctg_207', 705, 45500, 87056, 1] ['sctg_558', 745, 50045, 67851, 1] """


    import logging
    import sys

    logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)

    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)

    touched_lgs = set()

    def record_length(key_record_tuple):
        return len(key_record_tuple[1])

    new_scaffolds = copy.deepcopy(info_frags_records)

    for scaffold_name in collections.OrderedDict(
        sorted(new_scaffolds.items(), key=record_length, reverse=True)
    ):
        scaffold = new_scaffolds[scaffold_name]
        new_scaffold = []
        corresponding_lg = matching_pairs[scaffold_name][1]
        if corresponding_lg in touched_lgs:
            continue
        else:
            touched_lgs.add(corresponding_lg)
        scaffold_block_names = {my_bin[0] for my_bin in scaffold}
        lg_block_names = [
            my_block[0] for my_block in linkage_orderings[corresponding_lg]
        ]

        touched_bins = set()

        for lg_block_name in lg_block_names:
            if lg_block_name in scaffold_block_names:
                for my_bin in scaffold:
                    if tuple(my_bin) in new_scaffold:
                        continue
                    elif (
                        my_bin[0] == lg_block_name
                        or my_bin[0] not in lg_block_names
                    ):
                        new_scaffold.append(tuple(my_bin))
                        touched_bins.add(tuple(my_bin))
                    else:
                        break
            for other_name, other_scaffold in new_scaffolds.items():
                if other_name == scaffold_name:
                    continue
                i = 0
                for my_bin in other_scaffold:
                    if tuple(my_bin) in new_scaffold:
                        i += 1
                        continue
                    elif my_bin[0] == lg_block_name:
                        moved_bin = tuple(other_scaffold.pop(i))
                        new_scaffold.append(tuple(moved_bin))
                        touched_bins.add(tuple(moved_bin))
                        i -= 1
                    i += 1

        for remaining_bin in scaffold:
            if tuple(remaining_bin) not in touched_bins:
                new_scaffold.append(tuple(remaining_bin))
                touched_bins.add(tuple(remaining_bin))

        if len(new_scaffold) > 0:
            new_scaffolds[scaffold_name] = new_scaffold

    return new_scaffolds