| from argparse import ArgumentParser |
| from pathlib import Path |
| import json |
|
|
|
|
| def main(args): |
| |
| with open(args.alignment_db_super_index_path, "r") as fp: |
| super_index = json.load(fp) |
|
|
| |
| chains_to_seqs = {} |
| with open(args.all_chains_fasta, "r") as fp: |
| lines = fp.readlines() |
|
|
| |
| for chain_idx in range(0, len(lines), 2): |
| chain = lines[chain_idx][1:].strip() |
| seq = lines[chain_idx + 1].strip() |
| chains_to_seqs[chain] = seq |
|
|
| chains_w_alignments = set(super_index.keys()) |
| chains_wo_alignments = set(chains_to_seqs.keys()) - chains_w_alignments |
|
|
| seq_to_chain_w_alignment = { |
| chains_to_seqs[chain]: chain for chain in chains_w_alignments |
| } |
|
|
| print("Unique sequences with alignments:", len(seq_to_chain_w_alignment)) |
|
|
| |
| |
| remaining_unaligned_chains = [] |
| for chain in chains_wo_alignments: |
| seq = chains_to_seqs[chain] |
|
|
| try: |
| corresponding_alignment = super_index[seq_to_chain_w_alignment[seq]] |
| |
| except KeyError: |
| remaining_unaligned_chains.append(chain) |
| continue |
|
|
| super_index[chain] = corresponding_alignment |
|
|
| with open(args.output_path, "w") as fp: |
| json.dump(super_index, fp) |
|
|
| print( |
| f"No corresponding alignment found for the following {len(remaining_unaligned_chains)} chains:", |
| remaining_unaligned_chains, |
| ) |
|
|
|
|
| if __name__ == "__main__": |
| parser = ArgumentParser( |
| description=""" |
| If the alignment-db index was created on unique-chain alignments only, |
| this will add the missing chain entries to the super-index file based on |
| a .fasta file that contains sequences for all chains. |
| |
| Note that this only modifies the index and not the database itself, as |
| the duplicate sequences will just point to the same alignments. |
| """ |
| ) |
| parser.add_argument( |
| "alignment_db_super_index_path", |
| type=Path, |
| help="Path to alignment-db super index file.", |
| ) |
| parser.add_argument( |
| "output_path", type=Path, help="Write the output super index to this path." |
| ) |
| parser.add_argument( |
| "all_chains_fasta", |
| type=Path, |
| help="Path to the fasta file containing sequences for all chains.", |
| ) |
|
|
| args = parser.parse_args() |
|
|
| main(args) |
|
|