Демультиплексирование Snakemake: сопоставление выходных имен с отдельными sampleID - PullRequest
0 голосов
/ 29 апреля 2020

Я делаю рабочий процесс в Snakemake для конвейера секвенирования. Я выполнил первые несколько правил (прочитал в fastq's, удалил PhiX путем сопоставления и фильтрации для несопоставленных чтений). Важный шаг, который доставляет мне неприятности, заключается в том, что мне нужно индивидуально демультиплексировать мои объединенные библиотеки с помощью flexbar. Мои необработанные чтения - это, по сути, пул отдельных образцов, которые можно идентифицировать по встроенным штрих-кодам P5 (используя flexbar). Ввод Flexbar выглядит следующим образом:

flexbar -t {outputID} -r {read1} -p {read2} -b {barcode_file}

Где файл штрих-кода выглядит примерно так:

>A1
ACTG
>B1
ACCCA
>C1
GTTGGAA

Мои файлы fastq, которые будут вводиться как {read1} и {read2} выглядит примерно так:

PooledSample1_filtered_R1.fastq
PooledSample1_filtered_R2.fastq
PooledSample2_filtered_R1.fastq
PooledSample2_filtered_R2.fastq

В каждом «PooledSample» у меня будет два или три отдельных сэмпла, которые FlexB назначит соответственно на основе файла штрих-кодов.

Например, если бы я должен был выполнить следующее:

flexbar -t PooledSample1 -r PooledSample1_filtered_R1.fastq -p PooledSample1_filtered_R2.fastq -b barcodes.fasta

приведет к 6 различным выходным файлам, которые будут названы в соответствии со своими штрих-кодами, содержащие чтения, которые были назначены этим штрих-кодам соответственно:

PooledSample1_A1_1.fastq    PooledSample1_A1_2.fastq 
PooledSample1_B1_1.fastq    PooledSample1_B1_2.fastq 
PooledSample1_C1_1.fastq    PooledSample1_C1_2.fastq 

Теперь я хочу переименовать эти файлы, чтобы отразить их индивидуальные идентификаторы образцов. Например, я знаю, что для PooledSample1 все показания, назначенные штрих-коду A1, будут индивидуальны_XX, все показания, назначенные B1, будут индивидуальны_XY, а все присвоения C1 будут индивидуальны_YY.

(Вы можете подумать, что я мог бы просто измените имена в barcodes.fasta, но это невозможно, потому что для PooledSample2 также есть чтения, назначенные A1, но с другим индивидуальным_ID.)

Также возможно, что нет чтения в PooledSample, который состоит из определенного образца, поэтому эти результирующие файлы будут пустыми (но все же будут созданы). Это нормально, потому что иногда существует небольшое количество операций чтения, назначенных штрих-кодам, которых на самом деле нет в этом пуле. Поэтому я оставляю это, создавая файл (пустой или нет) для всех возможных штрих-кодов, затем я могу проверить, как man, какие и почему чтения могут быть назначены неправильно.

Таким образом, мое решение было бы тогда создать список или файл tsv, который соединяет индивидуальный_идентификатор со штрих-кодом.

Pool            A1       B1        C1
PooledSample1   XY       YY      noReads
PooledSample2   YY     noReads     XX
PooledSample3   XX       XY        YY

И затем создайте правило, которое принимает все выходные файлы flexbar и соответственно переименовывает их. Файлы, которые не имеют ни одного имени в названии, не должны быть переименованы, поскольку они в основном являются пустыми выводами гибкой панели.

Я хочу, чтобы мое правило взяло файлы из flexbar и проверило PooledSampleID (мой подстановочный знак {samples} из начальной части моего конвейера) по идентификатору штрих-кода в его имени файла, а затем переименовали.

Итак, из приведенного выше примера, выполняя flexbar для PooledSample1:

PooledSample1_A1_1.fastq ---> XY_1.fastq
PooledSample1_A1_2.fastq ---> XY_2.fastq
PooledSample1_B1_1.fastq ---> YY_1.fastq
PooledSample1_B1_2.fastq ---> YY_2.fastq
PooledSample1_C1_1.fastq ---> noReads_1.fastq
PooledSample1_C1_2.fastq ---> noReads_2.fastq

Если бы я имел дело только с одним PooledSample, я решил, что могу составить список возможных штрих-кодов в файле змеи, а затем вызвать их во входных данных в качестве дополнительных подстановочных знаков:


Pooled1 = ['XY', 'YY', 'noReads']
Barcode = ['A1', 'B1', 'C1']


rule all:
    input:
        expand("path/to/renamed/{files}.fastq", files=Pooled1),

rule rename:
    input:
        expand("path/to/demultiplexed/PooledSample1_{barcodes}_1.fastq", barcodes=Barcode)
    output:
        expand("path/to/renamed/{files}.fastq, files=Pooled1)
    shell:
        "mv {input} {output}"

Но это не будет работать по нескольким причинам. Он попытается создать девять файлов, по 3 для каждого из штрих-кодов. Еще более важно то, что у меня будет более одного пула сэмплов, поэтому вместо имени {PooledSample1} у него будет другой подстановочный знак в переименовании правила.

Я нашел кое-что об использовании dict (zip ()), но я не уверен, как назвать это подстановочным знаком.

Я также не уверен, что он обрабатывает штрих-коды как Подстановочные знаки, так как в моем правиле flexbar (непосредственно ранее) я вообще не вызываю эти подстановочные знаки явно, так как flexbar выплевывает вводные данные, основываясь на указанном им файле штрих-кодов.

Также, если я должен был сделать это в соответствии с В приведенном выше примере с псевдо мне понадобится второе правило переименования для другого чтения (_2), что на данный момент хорошо, так как вряд ли это проблема по сравнению с тем, что я сейчас пытаюсь выяснить.

Я буду использовать эти переименованные файлы в последующем рабочем процессе. Любая помощь будет так цениться.

...