Pregunta:
Generación de intervalos BED aleatorios dadas las restricciones
victor
2018-06-01 22:49:14 UTC
view on stackexchange narkive permalink

El problema es generar un intervalo BED aleatorio dadas las siguientes restricciones:

  1. mínimo start
  2. máximo end
  3. longitud fija
  4. número máximo de bases enmascaradas (similar a la opción -maxN en faSplit )
  5. conjunto de intervalos para evitar la superposición con
  6. 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  
One responder:
Alex Reynolds
2018-06-02 06:35:14 UTC
view on stackexchange narkive permalink

Quizás pueda contraer los requisitos para (1), (2) y (6), siempre que los límites de (1) y (2) estén dentro de los límites de (6).

Para ayudar con esto, puede usar fetchChromSizes de las utilidades Kent UCSC para obtener rápidamente cromosomas y límites cromosómicos para su genoma de interés.

Dado un cromosoma y un maximumEnd que se encuentra dentro de sus límites, muestrear uniformemente de [0, maximumEnd-minimumStart-maxLength) , agregando minimumStart para determinar la posición de inicio y maxLength como longitud para obtener la posición de parada.

Para obtener la cantidad deseada de muestras de una manera eficiente, puede canalizar estas " elementos candidatos "en operaciones de bedmap --echo-map-size en regiones enmascaradas repetidas (4) y bedops -n 1 en operaciones de" regiones para evitar "(5) para hacer muestreo de rechazo.

Quizás algo como:

  $ REPEATMASK_THRESHOLD = 123 $ SAMPLES = 1000 $ someScriptThatGeneratesCandidateIntervalsWithinBounds \ | sort-bed - \ | bedmap --echo-map-size --echo --delim '\ t' - repeatmaskedRegions.bed \ | awk -vthreshold = $ {REPEATMASK_THRESHOLD} '($ 1<threshold)' \ | cut -f2- \ | bedops -n 1 - RegionsToAvoid.bed \ | head - $ {SAMPLES} \ > qualifyingCandidates.bed  

Esto será relativamente eficiente, porque una vez que el proceso head al final escribe el número de SAMPLES a qualifyingCandidates.bed , enviará una señal de SIGINT por la tubería que terminará los procesos ascendentes. Por lo tanto, solo realiza el muestreo en la medida necesaria.

¡Espero que esto ayude!



Esta pregunta y respuesta fue traducida automáticamente del idioma inglés.El contenido original está disponible en stackexchange, a quien agradecemos la licencia cc by-sa 4.0 bajo la que se distribuye.
Loading...