import gzip import random from Bio import SeqIO from mint.utils.logging import get_logger logger = get_logger(__name__) logger.info("===Reading seqs====") seqs = {} for seq in SeqIO.parse(open("../protein.sequences.v12.0.fa"), "fasta"): seqs[seq.name] = str(seq.seq) if len(seqs) % 1000000 == 0: logger.info(f"{len(seqs) / 1e6} million seqs read") logger.info(f"Done, {len(seqs)} seqs total") logger.info("===Reading reps====") reps = {} for line in open("../clu50.tsv"): rep, seq = line.strip().split() reps[seq] = rep if len(reps) % 1000000 == 0: logger.info(f"{len(reps) / 1e6} million reps read") logger.info(f"Done, {len(reps)} reps total, {len(set(reps.values()))} clusters") logger.info("===Reading links====") f = gzip.open("../protein.physical.links.full.v12.0.txt.gz", "rt") f = iter(f) next(f) # skip first line links = [] i = 0 while True: try: line = next(f).strip() except StopIteration: break i += 1 links.append(line) if i % 1000000 == 0: logger.info(f"{i / 1e6} million links read") # if i / 1e6 == 10: break logger.info(f"Done, {len(links)} links total") logger.info("===Shuffling links===") random.seed(137) random.shuffle(links) logger.info("Done shuffling links") logger.info("===Filtering links===") linked_clusters = set() filtered_links = [] i = 0 for link in links: i += 1 name1, name2 = link.split()[:2] clu1, clu2 = reps[name1], reps[name2] clu1, clu2 = tuple(sorted((clu1, clu2))) if (clu1, clu2) not in linked_clusters: linked_clusters.add((clu1, clu2)) filtered_links.append(link) if i % 1000000 == 0: logger.info(f"{i / 1e6} million links filtered, {len(filtered_links) / 1e6} million kept") links = filtered_links logger.info(f"Done, {i} links filtered, {len(links)} kept") logger.info("===Shuffling links===") random.seed(731) random.shuffle(links) logger.info("Done shuffling links") with gzip.open("../filtered.links.txt.gz", "wt") as links_file: for link in links: links_file.write(link + "\n") num_val = 250000 validation = links[:num_val] training = links[num_val:] logger.info("===Writing validation links===") written_seqs = set() with gzip.open("validation.links.txt.gz", "wt") as links_file: with gzip.open("validation.seqs.txt.gz", "wt") as seqs_file: for link in validation: links_file.write(link + "\n") name1, name2 = link.split()[:2] if name1 not in written_seqs: seqs_file.write(name1 + " " + seqs[name1] + "\n") written_seqs.add(name1) if name2 not in written_seqs: seqs_file.write(name2 + " " + seqs[name2] + "\n") written_seqs.add(name2) logger.info(f"Done, {num_val} validation links written, {len(written_seqs)} seqs") logger.info("===Writing training links===") i = 0 written_seqs = set() with gzip.open("training.links.txt.gz", "wt") as links_file: with gzip.open("training.seqs.txt.gz", "wt") as seqs_file: for link in training: i += 1 links_file.write(link + "\n") name1, name2 = link.split()[:2] if name1 not in written_seqs: seqs_file.write(name1 + " " + seqs[name1] + "\n") written_seqs.add(name1) if name2 not in written_seqs: seqs_file.write(name2 + " " + seqs[name2] + "\n") written_seqs.add(name2) if i % 1000000 == 0: logger.info( f"{i / 1e6} million training links written, {len(written_seqs) / 1e6} million seqs" ) logger.info(f"Done, {i} training links written, {len(written_seqs)} seqs") logger.info("===Extracting validation clusters===") val_clus = [] for link in validation: name1, name2 = link.split()[:2] val_clus.append(reps[name1]) val_clus.append(reps[name2]) val_clus = set(val_clus) logger.info(f"Done, {len(val_clus)} validation clusters") i, j = 0, 0 logger.info("===Writing filtered training links===") written_seqs = set() with gzip.open("training_filtered.links.txt.gz", "wt") as links_file: with gzip.open("training_filtered.seqs.txt.gz", "wt") as seqs_file: for link in training: i += 1 name1, name2 = link.split()[:2] clu1, clu2 = reps[name1], reps[name2] if clu1 not in val_clus and clu2 not in val_clus: j += 1 links_file.write(link + "\n") if name1 not in written_seqs: seqs_file.write(name1 + " " + seqs[name1] + "\n") written_seqs.add(name1) if name2 not in written_seqs: seqs_file.write(name2 + " " + seqs[name2] + "\n") written_seqs.add(name2) if i % 1000000 == 0: logger.info( f"{i / 1e6} million training links filtered, {j / 1e6} million written, {len(written_seqs) / 1e6} million seqs" ) logger.info(f"{i} training links filtered, {j} kept, {len(written_seqs)} seqs")