| import json |
| import os |
| import subprocess |
| import argparse |
| from tqdm import tqdm |
| from requests import get |
| from time import sleep |
|
|
| def process_pdb(pdb_file, output_dir): |
| file_name = pdb_file.split('.')[0].split('/')[-1] |
| |
| if os.path.exists(f'{output_dir}/{file_name}.fasta'): |
| print(f'>>> {file_name} already exists') |
| return None |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| structure_aln_dict = json.load(open(f'{output_dir}/{file_name}.json'))[0] |
| |
| |
| |
| results = structure_aln_dict['results'] |
| query_seq = structure_aln_dict['queries'][0]['sequence'] |
| |
| |
| |
| |
| |
| |
| |
| alignment_dict = {} |
| for result_db in results: |
| |
| if not result_db['alignments'] or len(result_db['alignments']) == 0: |
| continue |
| |
| for alignments_list in result_db['alignments'].values(): |
| for target_info in alignments_list: |
| name = f"{target_info['target']}/prob_{target_info['prob']}/eval_{target_info['eval']}/score_{target_info['score']}/{target_info['qStartPos']}-{target_info['qEndPos']}" |
| qaln = target_info['qAln'] |
| dbaln = target_info['dbAln'] |
| try: |
| |
| qaln = list(qaln) |
| miss_index = [i for i in range(len(qaln)) if qaln[i] == '-'] |
| |
| dbaln = list(dbaln) |
| dbaln = ''.join([dbaln[i] for i in range(len(dbaln)) if i not in miss_index]) |
| except Exception as e: |
| print(e) |
| print(name) |
| |
| left = target_info['qStartPos'] - 1 |
| right = len(query_seq) - target_info['qEndPos'] |
| dbaln = '-' * left + dbaln + '-' * right |
| alignment_dict[name] = dbaln |
|
|
| |
| if alignment_dict == {}: |
| print(f'>>> {file_name} has no alignment') |
| with open(f'{output_dir}/{file_name}.fasta', 'w') as f: |
| f.write('\n') |
| return None |
| |
| seqs = [] |
| with open(f'{output_dir}/{file_name}.fasta', 'w') as f: |
| for key, value in alignment_dict.items(): |
| if value not in seqs: |
| seqs.append(value) |
| else: |
| continue |
| f.write(f'>{key}\n{value}\n') |
| print(f'>>> {file_name} done') |
| |
| if __name__ == '__main__': |
| parser = argparse.ArgumentParser() |
| parser.add_argument('--pdb_dir', type=str) |
| parser.add_argument('--pdb_file', type=str) |
| parser.add_argument('--output_dir', type=str, required=True) |
| args = parser.parse_args() |
| |
| os.makedirs(args.output_dir, exist_ok=True) |
| if args.pdb_dir is not None: |
| pdbs = sorted(os.listdir(args.pdb_dir)) |
| process_bar = tqdm(pdbs) |
| for pdb in process_bar: |
| process_pdb(f'{args.pdb_dir}/{pdb}', args.output_dir) |
| process_bar.set_description(pdb) |
| elif args.pdb_file is not None: |
| process_pdb(args.pdb_file, args.output_dir) |