import gzip
import random
import sys
random.seed(20260426)
QUAL = "I" * 50 LEN = 50
TOTAL = 1009
OVERREP = [
("OVERREP_A_HIGH", 73), ("OVERREP_B_MID", 37), ("OVERREP_C_LOW", 11), ("OVERREP_D_TINY", 5), ("OVERREP_E_EDGE", 2), ]
def random_seq(rng):
return "".join(rng.choice("ACGT") for _ in range(LEN))
overrep_seqs = []
seen = set()
seq_rng = random.Random(20260426)
for label, _count in OVERREP:
while True:
s = random_seq(seq_rng)
if s not in seen:
overrep_seqs.append(s)
seen.add(s)
break
n_overrep = sum(c for _, c in OVERREP)
n_background = TOTAL - n_overrep
assert n_background > 0
background_seqs = []
while len(background_seqs) < n_background:
s = random_seq(seq_rng)
if s in seen:
continue
seen.add(s)
background_seqs.append(s)
reads = []
for s, (label, count) in zip(overrep_seqs, OVERREP):
for i in range(count):
reads.append((f"{label}_{i+1}", s))
for i, s in enumerate(background_seqs):
reads.append((f"BACKGROUND_{i+1}", s))
order_rng = random.Random(99)
order_rng.shuffle(reads)
assert len(reads) == TOTAL
out_path = sys.argv[1]
with gzip.GzipFile(filename=out_path, mode="wb", mtime=0) as f:
for header, seq in reads:
f.write(f"@{header}\n{seq}\n+\n{QUAL}\n".encode("ascii"))
print(f"wrote {out_path}: {TOTAL} reads, {LEN}bp, {len(OVERREP)} overrepresented sequences", file=sys.stderr)
for label, count in OVERREP:
pct = count * 100 / TOTAL
print(f" {label}: {count}/{TOTAL} = {pct}%", file=sys.stderr)