El problema es generar un intervalo BED aleatorio dadas las siguientes restricciones:
- mínimo
start
- máximo
end
- longitud fija
- número máximo de bases enmascaradas (similar a la opción
-maxN
enfaSplit
) - conjunto de intervalos para evitar la superposición con
- permanecer dentro de las restricciones de tamaño de los cromosomas
Puedo pensar en formas computacionalmente intensivas de codificarlo desde cero, pero me pregunto si hay un enfoque más eficiente antes de reinventar la rueda.
seq_records = {x.name: x for x in SeqIO.parse ('path / to / genome.fa', 'fasta ')} def generate_random_interval (chrom, lower, upper, length, maxrep = 1.0, prevent_intervals = None): while True: start = np.random.randint (lower, upper - length) end = start + length regenerate = False para intervalo en evitar_intervalos: if (intervalo.inicio < final) o (intervalo.end > inicio): regenerat e = Verdadero si 1. * seq_records [crom] .seq [inferior, superior] .count ('N') / longitud > maxrep: regenerate = Verdadero si no regenera: romper retorno crom, inicio, final