[PYTHON] Ein Hinweis zum Verhalten von bowtie2 bei mehreren Treffern

Eine Geschichte darüber, wie Multi-Maps von bowtie2 gehandhabt werden.

Hintergrund

Im Standardverhalten von bowtie2 wird nur einer von ihnen gemeldet, selbst wenn die Sequenz mehrmals getroffen wird. Dann wird die Auswahl eines von ihnen normalerweise zufällig aus denjenigen mit der höchsten Ausrichtungsbewertung ausgewählt. Das Dokument sagt es auch [^ 1]. … Aber in einigen Fällen scheint es, dass es nicht zufällig ist und sich verfestigt [^ 2], deshalb möchte ich die Bedingungen klarstellen.

Die meisten Schlussfolgerungen sind hier geschrieben [^ 2], aber dieses Problem ist auf die zufällige Erzeugung von bowtie2 zurückzuführen. Der Optionsabschnitt "--non-deterministic" in der Bedienungsanleitung von Bowtie2 [^ 3] enthält die folgende Erklärung.

Normally, Bowtie 2 re-initializes its pseudo-random generator for each read. It seeds the generator with a number derived from (a) the read name, (b) the nucleotide sequence, (c) the quality sequence, (d) the value of the --seed option. This means that if two reads are identical (same name, same nucleotides, same qualities) Bowtie 2 will find and report the same alignment(s) for both, even if there was ambiguity. When --non-deterministic is specified, Bowtie 2 re-initializes its pseudo-random generator for each read using the current time. This means that Bowtie 2 will not necessarily report the same alignment for two identical reads. This is counter-intuitive for some users, but might be more appropriate in situations where the input consists of many identical reads.

Zusammenfassend initialisiert bowtie2 einen Zufallszahlengenerator für jeden Lesevorgang, und sein Startwert scheint von den folgenden vier abzuhängen.

Kurz gesagt, Leads mit denselben Informationen, einschließlich des __Namens, sind so konzipiert, dass sie demselben Speicherort __ zugeordnet werden. Lassen Sie uns unten bestätigen, dass das Mapping-Ergebnis unterschiedlich ist, wenn der Name "Lesen", das "Qualitätsarray" und die Option "--seed" unterschiedlich sind.

Vorbereitung

Bereiten Sie den folgenden FASTQ basierend auf der mehrfach zugeordneten Basensequenz vor. (Arrangements etc. werden basierend auf dem Verifizierungsbeispiel hier erstellt [^ 2])

--FASTQ mit demselben gelesenen Namen, derselben Basissequenz und derselben Qualitätssequenz --FASTQ mit derselben Basissequenz, aber unterschiedlicher Namens- / Qualitätssequenz (einer oder beide) für jeden Lesevorgang

Da die Vorbereitung jedes Mal schwierig ist, wird stattdessen der nächste Generator verwendet.

gen_testseq.py


#!/usr/bin/env python
import argparse
import random

parser = argparse.ArgumentParser()
parser.add_argument("-r", "--reads", type=int, default=10000)
parser.add_argument("-n", "--name", action="store_true")
parser.add_argument("-q", "--quality", action="store_true")
args = parser.parse_args()

for i in range(args.reads):
    print "@test_sequence{}".format(random.random() if args.name else '')
    print "CAAAGTGTTTACTTTTGGATTTTTGCCAGTCTAACAGGTGAAGCCCTGGAGATTCTTATTAGTGATTTGGGCTGGGGCCTGGCCATGTGTATTTTTTTAAA"
    print '+'
    print ''.join([chr(random.randrange(33, 127)) for _ in range(101)]) if args.quality else 'I' * 101

Wenn das Array in der zweiten Druckzeile auf hg19 abgebildet wird, werden 9 Stellen mehrfach getroffen, und die folgenden 3 Stellen haben die höchste Ausrichtungsbewertung und sind die Kartenkandidaten.

chrom position strand
chr1 11635 +
chr2 114359380 -
chr15 102519535 -

bowtie2 verwendete Version 2.2.4.

Überprüfung

Wenn alle Lead-Informationen gleich FASTQ sind

Auf diese Weise wird nur die Position aus dem Kartenergebnis entfernt und die Anzahl gezählt.

$ bowtie2 --no-hd -x hg19 -U <(./gen_testseq.py) | cut -f 3-4 | sort | uniq -c

Ergebnis

10000 reads; of these:
  10000 (100.00%) were unpaired; of these:
    0 (0.00%) aligned 0 times
    0 (0.00%) aligned exactly 1 time
    10000 (100.00%) aligned >1 times
100.00% overall alignment rate
  10000 chr15	102519435

Alle wurden an einem Ort abgebildet.

Geben Sie die Option "--seed" an

$ bowtie2 --no-hd --seed 17320508 -x hg19 -U <(./gen_testseq.py) | cut -f 3-4 | sort | uniq -c
10000 reads; of these:
  10000 (100.00%) were unpaired; of these:
    0 (0.00%) aligned 0 times
    0 (0.00%) aligned exactly 1 time
    10000 (100.00%) aligned >1 times
100.00% overall alignment rate
  10000 chr1	11635

Der Standort ändert sich je nach Wert, es wird jedoch nur ein Standort zugeordnet.

Versuchen Sie, die Option "--non-deterministic" anzugeben

$ bowtie2 --no-hd --non-deterministic -x hg19 -U <(./gen_testseq.py) | cut -f 3-4 | sort | uniq -c
10000 reads; of these:
  10000 (100.00%) were unpaired; of these:
    0 (0.00%) aligned 0 times
    0 (0.00%) aligned exactly 1 time
    10000 (100.00%) aligned >1 times
100.00% overall alignment rate
   3302 chr1	11635
   3379 chr15	102519435
   3319 chr2	114359280

Diesmal wurde es zufällig zugeordnet. Natürlich ist das Ergebnis jedes Mal anders, wenn Sie es ausführen.

Wenn der Name oder die Qualitätsreihenfolge für jeden Lesevorgang unterschiedlich ist

$ bowtie2 --no-hd -x hg19 -U <(./gen_testseq.py -n) | cut -f 3-4 | sort | uniq -c
10000 reads; of these:
  10000 (100.00%) were unpaired; of these:
    0 (0.00%) aligned 0 times
    0 (0.00%) aligned exactly 1 time
    10000 (100.00%) aligned >1 times
100.00% overall alignment rate
   3379 chr1	11635
   3294 chr15	102519435
   3327 chr2	114359280

Diesmal wurde es zufällig zugeordnet. Hier,

$ ./gen_testseq.py -n > test.fastq
$ bowtie2 --no-hd -x hg19 -U test.fastq | cut -f 3-4 | sort | uniq -c

Wenn Sie es wie oben beschrieben in eine Datei ablegen, erhalten Sie bei jeder Ausführung das gleiche Ergebnis. Dies gilt natürlich nicht, wenn der Wert der Option "--seed" unterschiedlich ist oder wenn die Option "--non-deterministic" angegeben ist.

Wird zufällig zugeordnet, auch wenn das Qualitätsarray unterschiedlich ist

$ bowtie2 --no-hd -x hg19 -U <(./gen_testseq.py -q) | cut -f 3-4 | sort | uniq -c
10000 reads; of these:
  10000 (100.00%) were unpaired; of these:
    0 (0.00%) aligned 0 times
    0 (0.00%) aligned exactly 1 time
    10000 (100.00%) aligned >1 times
100.00% overall alignment rate
   3351 chr1	11635
   3312 chr15	102519435
   3337 chr2	114359280

Fazit

Referenz

Es scheint, dass es einen Fall gab, in dem es nicht gut variierte [^ 2], aber war es ein Fehler?

[^ 1]: Siehe Abschnitt -k Option [^ 3]

Recommended Posts

Ein Hinweis zum Verhalten von bowtie2 bei mehreren Treffern
Informationen zum Verhalten der Warteschlange während der Parallelverarbeitung
Über das Verhalten von Yield_per von SqlAlchemy
Informationen zum Verhalten von enable_backprop von Chainer v2
Ein Memo, das die Achsenspezifikation der Achse erklärt
Über das Verhalten von copy, deepcopy und numpy.copy
Schreiben Sie eine Notiz über die Python-Version von Python Virtualenv
Ein Memorandum über Warnungen in Pylint-Ausgabeergebnissen
Ein Memo zum visuellen Verstehen der Achse von Pandas.Panel
Eine Geschichte über die Änderung des Master-Namens von BlueZ
Ein Memorandum über die Umsetzung von Empfehlungen in Python
Hinweis zum Standardverhalten von collate_fn in PyTorch
Ich habe ein wenig versucht, das Verhalten der Zip-Funktion
Über die Komponenten von Luigi
Über die Funktionen von Python
[Python] Ein Hinweis, dass ich das Verhalten von matplotlib.pyplot zu verstehen begann
Über den Rückgabewert von pthread_mutex_init ()
Über den Rückgabewert des Histogramms.
Über den Grundtyp von Go
Über die Obergrenze von Threads-max
Über die Größe der Punkte in Matplotlib
Informationen zur Grundlagenliste der Python-Grundlagen
Die Geschichte des Exportierens eines Programms
Ich wollte vorsichtig mit dem Verhalten der Standardargumente von Python sein
Ein Hinweis zu den Funktionen der Standard-Linux-Bibliothek, die sich mit Zeit befasst
Überprüfen Sie das Verhalten des Zerstörers in Python
Klasse, die die API von DMM trifft
Ein grobes Verständnis von Python-Feuer und ein Memo
Informationen zur virtuellen Umgebung von Python Version 3.7
Messen Sie die Assoziationsstärke in einer Kreuztabelle
Memorandum zu Djangos QueryDict
Über die Argumente der Setup-Funktion von PyCaret
[Python] [Meta] Ist der Python-Typ ein Typ?
Über die Normalgleichung der linearen Regression
Holen Sie sich den Dateinamen des Verzeichnisses (glob)
Die Geschichte der Verarbeitung A von Blackjack (Python)
Hinweis auf Probleme hinsichtlich der Koexistenz des Python 2/3-Systems
Memo über Sphinx Teil 1 (Erstellen eines Projekts)
Beachten Sie den Abschluss eines zeitaufwändigen Befehls
Ein Memo, dass ich das Pyramid Tutorial ausprobiert habe