| import torch |
| import numpy as np |
| import random |
| import time |
| import re |
|
|
|
|
| from tqdm import tqdm |
| from Bio import SeqIO |
|
|
|
|
| |
| class TimeCounter: |
| def __init__(self, text): |
| self.text = text |
|
|
| def __enter__(self): |
| self.start = time.time() |
| print(self.text, flush=True) |
|
|
| def __exit__(self, exc_type, exc_val, exc_tb): |
| end = time.time() |
| t = end - self.start |
| print(f"\nFinished. The time is {t:.2f}s.\n", flush=True) |
|
|
|
|
| def progress_bar(now: int, total: int, desc: str = '', end='\n'): |
| length = 50 |
| now = now if now <= total else total |
| num = now * length // total |
| progress_bar = '[' + '#' * num + '_' * (length - num) + ']' |
| display = f'{desc:<10} {progress_bar} {int(now/total*100):02d}% {now}/{total}' |
|
|
| print(f'\r\033[31m{display}\033[0m', end=end, flush=True) |
|
|
|
|
| def setup_seed(seed): |
| torch.manual_seed(seed) |
| torch.cuda.manual_seed_all(seed) |
| np.random.seed(seed) |
| random.seed(seed) |
| torch.backends.cudnn.deterministic = True |
|
|
|
|
| def random_seed(): |
| torch.seed() |
| torch.cuda.seed() |
| np.random.seed() |
| random.seed() |
| torch.backends.cudnn.deterministic = False |
|
|
|
|
| def a3m_formalize(input, output, keep_gap=True): |
| with open(output, 'w') as w: |
| for record in SeqIO.parse(input, 'fasta'): |
| desc = record.description |
| if keep_gap: |
| seq = re.sub(r"[a-z]", "", str(record.seq)) |
| else: |
| seq = re.sub(r"[a-z-]", "", str(record.seq)) |
| w.write(f">{desc}\n{seq}\n") |
|
|
|
|
| def merge_file(file_list: list, save_path: str): |
| with open(save_path, 'w') as w: |
| for i, file in enumerate(file_list): |
| with open(file, 'r') as r: |
| for line in tqdm(r, f"Merging {file}... ({i+1}/{len(file_list)})"): |
| w.write(line) |