Como wkretzsch sugirió que esto era digno de una respuesta real, creo que aquí falta la solución obvia; indexar el FASTQ
.
Indexar
Por mucho que dudo en saltar a una solución que requiera un script o marco (a diferencia de solo unix herramientas de línea de comandos), lamentablemente no hay samtools fqidx
(quizás debería haberlo), y las respuestas existentes sugieren mucho munging. Si bien probablemente funcionan, algunos parecen engorrosos y tienen muchos pasos en los que podría cometer un error.
Entonces, para simplificar las cosas, un enfoque alternativo rápido y sucio podría ser usar biopython
, ya que ya tiene esta funcionalidad implementada para hacer esto, y si está instalada, es trivial de usar:
de Bio import SeqIOfq = SeqIO.index ("myfastq.fq", "fastq")
Una vez que haya adquirido un índice, obtendrá acceso aleatorio rápido para cualquier lectura:
# Acceso aleatorio por nombre de lectura (me gustan los búhos) record = fq ["HOOT"] record # > SeqRecord (seq = Seq ('ACGTACGT ', SingleLetterAlphabet ()), id =' HOOT ', name =' HOOT ', description =' HOOT ', dbxrefs = []) # Podemos obtener el archivo sequencerecord.seq # > Seq (' ACGTACGT ', SingleLetterAlphabet ()) # and qualityrecord.letter_annotations # > {'phred_quality': [41, 41, 41, 41, 41, 41, 41, 41]}
Si nt para seleccionar registros aleatorios arbitrarios, puede usar algo como randrange
para seleccionar entre 0 y la longitud de la lista de referencias.
from random import randint # Coaccionar claves a una lista, ya que` dictionary-keyiterator` no tiene un atributo # __getitem__ que permita índices enteros # Note también que esto no necesariamente garantiza un orden ordenado # pero supongo que eso no importa si solo quieres registros aleatorioskey_list = list (fq.keys ()) # Selecciona una clave aleatoria
# Tenga en cuenta que usamos len (key_list) -1 ya que los extremos randint son inclusivosrandom_readname = key_list [randint (0, len (key_list) -1)] # Obtenga su recordrand_record = fq.get (random_readname)
Si desea varios registros, probablemente desee sample
(para evitar el reemplazo) en su lugar:
de la muestra de importación aleatoria N = 100 índices_aleatorio = muestra (xrange (len (lista_claves)), N) para key_i en índices_aleatorios: nombre_leído_aleatorio = lista_clave [key_i] rand_record = fq.get (nombre_leído_aleatorio) # ...
Por lo que vale, creo que biopython
contiene este índice en la RAM, por lo que si su archivo es absolutamente masivo, es posible que deba ser más inteligente. Si ese es el caso, puede iterar a través de FASTQ
una vez y generar el nombre de lectura, el desplazamiento del archivo y la longitud, similar a un FASTA
fai
.
Actualización Ver samtools fqidx