Aye10032's picture
download
raw
1.18 kB
import random
from dataclasses import dataclass
from bioflow_sim.generators.random_values import weighted_index
DNA_ALPHABET = frozenset('ACGT')
@dataclass(frozen=True)
class GenomicTemplate:
source_id: str
start: int
end: int
strand: str
sequence: str
def reverse_complement(sequence: str) -> str:
return sequence.translate(str.maketrans('ACGTN', 'TGCAN'))[::-1]
def sample_genomic_template(
rng: random.Random,
sequences: list[tuple[str, str]],
length: int,
) -> GenomicTemplate:
eligible = [(identifier, sequence) for identifier, sequence in sequences if len(sequence) >= length]
if not eligible:
raise ValueError(f'no reference sequence is long enough for a {length} bp template')
index = weighted_index(rng, [len(sequence) - length + 1 for _, sequence in eligible])
identifier, source = eligible[index]
start = rng.randrange(0, len(source) - length + 1)
template = source[start : start + length]
if rng.random() < 0.5:
template = reverse_complement(template)
strand = '-'
else:
strand = '+'
return GenomicTemplate(identifier, start, start + length, strand, template)

Xet Storage Details

Size:
1.18 kB
·
Xet hash:
a42d4e52dda7126769a94d4df3a003905a099d6716d3838b0a89f6ec31aa0632

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.