Para dar seguimiento a la respuesta de Devon Ryan, pensé que sería un poco divertido escribir un script de Python que demuestre el uso de una matriz de bits para mantener una tabla de presencia / ausencia.
Nota: escribí una Puerto C ++ que incluye una implementación de conjunto de bits personalizada que se puede dimensionar en tiempo de ejecución. Este y el script de Python están disponibles en Github: https://github.com/alexpreynolds/kmer-boolean
#! / Usr / bin / env pythonimport sysimport osimport bitarray # read FASTAdef read_sequences (): global seqs seqs = [] seq = "" para la línea en sys.stdin: if line.startswith ('>'): if len (seq) > 0: seqs.append (seq) seq = "" else: seq + = line.strip () seqs.append (seq) # construir e inicializar matriz de bits def initialize_bitarray (): global ba ba = bitarray.bitarray (4 ** k) ba.setall (False) sys .stderr.write ("El uso de la memoria de la instancia de bitarray.bitarray es [% ld] bytes \ n"% (ba.buffer_info () [1])) seqs: para i en rango (0, len (seq)): kmer = seq [i: i + k] if len (kmer) == k: observado_kmers [kmer] = Ninguno idx = 0 para j en rango (k-1, -1, -1): idx + = 4 ** (kj-1) * bm [kmer [j]] ba [idx] = Truedef test_bitarray (): test_idx = 0 para j en rango (k-1, -1, -1): test_idx + = 4 ** (kj-1) * bm [test_kmer [j]] test_result = ba [test_idx] if test_result: sys.stdout.write ("% s encontrado \ n "% (test_kmer)) sys.exit (os.EX_OK) else: sys.stdout.write ("% s no encontrado \ n "% (test_kmer)) sys.exit (os.EX_DATAERR) def main (): global kk = int (sys.argv [1]) global bm bm = {'A': 0, 'C': 1, 'T': 2, 'G': 3} read_sequences () initialize_bitarray () process_sequences () intente: global test_kmer test_kmer = sys.argv [2] if len (test_kmer) == k:
test_bitarray () else: raise ValueError ("test kmer (% s) debe ser de longitud k (% d)"% (test_kmer, k)) excepto IndexError como err: keys = list (observe_kmers.keys ()) para i en range (0, len (claves)): sys.stdout.write ("% s encontrado \ n"% (claves [i])) sys.exit (os.EX_OK) if __name __ == "__main__": main ()
Tenga en cuenta que esto no tiene en cuenta los kmers canónicos, por ejemplo , AG
se considera un 2mer distinto de su complemento inverso CT
.
Para usar este script, ingrese su FASTA, especifique la k y un kmer opcional que desee probar para presencia / ausencia, eg:
$ echo -e ">foo \ nCATTCTC \ nGGGAC \ n>bar \ nTTATAT \ n>baz \ nTTTATTAG \ nACCTCT" | ./kmer-bool.py 2 El uso de CGMemory de la instancia bitarray.bitarray es [2] bytesCG encontrado
O:
$ echo -e ">foo \ nCATTCTC \ nGGGAC \ n>bar \ nTTATAT \ n>baz \ nTTTATTAG \ nACCTCT "| ./kmer-bool.py 3 AAAMemory El uso de la instancia de bitarray.bitarray es [8] bytesAAA no encontrado
O si la prueba opcional kmer se omite:
$ echo -e ">foo \ nCATTCTC \ nGGGAC \ n>bar \ nTTATAT \ n>baz \ nTTTATTAG \ nACCTCT" | ./kmer-bool.py 5El uso de memoria de la instancia bitarray.bitarray es [128] bytesCATTC encontradoATTCT encontradoTTCTC encontradoTCTCG encontradoCTCGG encontradoTCGGG encontradoCGGGA encontradoGGGAC encontradoTTATA encontradoTATAT encontradoTTTAT encontradoTTATT encontradoTATTA encontradoATTAG encontradoTCCTAGAACTA encontradoTATTA encontrado O para los ~ 67M kmers en un conjunto de 13 meros, para el cual se reserva una matriz de bits de aproximadamente 8.4 MB: $ echo -e ">foo \ nCATTCTC \ nGGGAC \ n>bar \ nTTATAT \ n>baz \ nTTTATTAG \ nACCTCT "| ./kmer-bool.py 13 El uso de memoria de la instancia de bitarray.bitarray es [8388608] bytesTTTATTAGACCTC encontradoTTATTAGACCTCT encontrado