Parte 3: Implementação de múltiplas amostras com dados paired-end¶
Tradução assistida por IA - saiba mais e sugira melhorias
Anteriormente, você construiu um pipeline de chamada de variantes por amostra que processava os dados de cada amostra independentemente. Nesta parte do curso, vamos levar nosso fluxo de trabalho simples ao próximo nível, transformando-o em uma poderosa ferramenta de automação em lote para lidar com números arbitrários de amostras. E enquanto fazemos isso, também vamos atualizá-lo para esperar dados paired-end, que são mais comuns em estudos mais recentes.
Como começar a partir desta seção
Esta seção do curso assume que você completou a Parte 1: Visão Geral do Método, Parte 2: Implementação de amostra única e tem um pipeline rnaseq.nf funcional com arquivos de módulo preenchidos.
Se você não completou a Parte 2 ou quer começar do zero para esta parte, você pode usar a solução da Parte 2 como seu ponto de partida.
Execute estes comandos de dentro do diretório nf4-science/rnaseq/:
cp solutions/part2/rnaseq-2.nf rnaseq.nf
cp solutions/part2/modules/fastqc.nf modules/
cp solutions/part2/modules/trim_galore.nf modules/
cp solutions/part2/modules/hisat2_align.nf modules/
cp solutions/part2/nextflow.config .
Isso lhe dá um fluxo de trabalho completo de processamento de amostra única. Você pode testar se ele executa com sucesso:
Tarefa¶
Nesta parte do curso, vamos estender o fluxo de trabalho para fazer o seguinte:
- Ler informações de amostra de uma planilha CSV
- Executar QC por amostra, corte e alinhamento em todas as amostras em paralelo
- Agregar todos os relatórios de QC em um relatório MultiQC abrangente
Isso automatiza as etapas da segunda seção da Parte 1: Visão Geral do Método, onde você executou esses comandos manualmente em seus contêineres.
Plano de aula¶
Dividimos isso em três estágios:
- Fazer o fluxo de trabalho aceitar múltiplas amostras de entrada.
Isso cobre a mudança de um único caminho de arquivo para uma planilha CSV, analisando-a com
splitCsv(), e executando todos os processos existentes em múltiplas amostras. - Adicionar geração abrangente de relatório de QC.
Isso introduz o operador
collect()para agregar saídas entre amostras, e adiciona um processo MultiQC para produzir um relatório combinado. - Mudar para dados de RNAseq paired-end. Isso cobre a adaptação de processos para entradas paired-end (usando tuplas), criação de módulos paired-end, e configuração de um perfil de teste separado.
Isso implementa o método descrito na Parte 1: Visão Geral do Método (segunda seção cobrindo o caso de uso de múltiplas amostras) e se baseia diretamente no fluxo de trabalho produzido pela Parte 2.
Dica
Certifique-se de estar no diretório de trabalho correto:
cd /workspaces/training/nf4-science/rnaseq
1. Fazer o fluxo de trabalho aceitar múltiplas amostras de entrada¶
Para executar em múltiplas amostras, precisamos mudar como gerenciamos a entrada: em vez de fornecer um único caminho de arquivo, vamos ler informações de amostra de um arquivo CSV.
Fornecemos um arquivo CSV contendo IDs de amostra e caminhos de arquivos FASTQ no diretório data/.
Este arquivo CSV inclui uma linha de cabeçalho que nomeia as colunas.
Note que estes ainda são dados de leitura single-end.
Aviso
Os caminhos de arquivo no CSV são caminhos absolutos que devem corresponder ao seu ambiente. Se você não está executando isso no ambiente de treinamento que fornecemos, você precisará atualizar os caminhos para corresponder ao seu sistema.
1.1. Mudar a entrada primária para um CSV de caminhos de arquivos no perfil de teste¶
Primeiro, precisamos atualizar o perfil de teste em nextflow.config para fornecer o caminho do arquivo CSV em vez do caminho FASTQ único.
Em seguida, precisaremos atualizar a criação do canal para ler deste CSV.
1.2. Atualizar a fábrica de canal para analisar entrada CSV¶
Precisamos carregar o conteúdo do arquivo no canal em vez de apenas o caminho do arquivo em si.
Podemos fazer isso usando o mesmo padrão que usamos na Parte 2 do Hello Nextflow: aplicando o operador splitCsv() para analisar o arquivo, depois uma operação map para extrair o caminho do arquivo FASTQ de cada linha.
Uma coisa que é nova comparada ao que você encontrou no curso Hello Nextflow é que este CSV tem uma linha de cabeçalho, então adicionamos header: true à chamada splitCsv().
Isso nos permite referenciar colunas por nome na operação map: row.fastq_path extrai o caminho do arquivo da coluna fastq_path de cada linha.
O tratamento de entrada está atualizado e o fluxo de trabalho está pronto para testar.
1.3. Executar o fluxo de trabalho¶
O fluxo de trabalho agora lê informações de amostra de um arquivo CSV e processa todas as amostras em paralelo.
Saída do comando
Desta vez cada etapa é executada 6 vezes, uma vez para cada amostra no arquivo CSV.
Foi só isso que precisamos para fazer o fluxo de trabalho executar em múltiplos arquivos. O Nextflow lida com todo o paralelismo para nós.
Conclusão¶
Você sabe como mudar de uma entrada de arquivo único para entrada de múltiplas amostras baseada em CSV que o Nextflow processa em paralelo.
O que vem a seguir?¶
Adicionar uma etapa de agregação de relatório de QC que combina métricas de todas as amostras.
2. Agregar métricas de QC de pré-processamento em um único relatório MultiQC¶
Tudo isso produz muitos relatórios de QC, e não queremos ter que vasculhar relatórios individuais. Este é o ponto perfeito para colocar uma etapa de agregação de relatório MultiQC.
Lembre-se do comando multiqc da Parte 1:
O comando escaneia o diretório atual em busca de arquivos de saída de QC reconhecidos e os agrega em um único relatório HTML.
O URI do contêiner era community.wave.seqera.io/library/pip_multiqc:a3c26f6199d64b7c.
Precisamos configurar um parâmetro adicional, preparar as entradas, escrever o processo, conectá-lo, e atualizar o tratamento de saída.
2.1. Configurar as entradas¶
O processo MultiQC precisa de um parâmetro de nome de relatório e as saídas de QC coletadas de todas as etapas anteriores agrupadas juntas.
2.1.1. Adicionar um parâmetro report_id¶
Adicione um parâmetro para nomear o relatório de saída.
Adicione o padrão do ID do relatório ao perfil de teste:
Em seguida, precisaremos preparar as entradas para o processo MultiQC.
2.1.2. Coletar e combinar saídas de QC das etapas anteriores¶
Precisamos dar ao processo MULTIQC todas as saídas relacionadas a QC das etapas anteriores agrupadas juntas.
Para isso, usamos o operador .mix(), que agrega múltiplos canais em um único.
Começamos de channel.empty() e misturamos todos os canais de saída que queremos combinar.
Isso é mais limpo do que encadear .mix() diretamente em um dos canais de saída, porque trata todas as entradas simetricamente.
No nosso fluxo de trabalho, as saídas relacionadas a QC para agregar são:
FASTQC.out.zipFASTQC.out.htmlTRIM_GALORE.out.trimming_reportsTRIM_GALORE.out.fastqc_reportsHISAT2_ALIGN.out.log
Nós as misturamos em um único canal, depois usamos .collect() para agregar os relatórios de todas as amostras em uma única lista.
Adicione estas linhas ao corpo do fluxo de trabalho após a chamada HISAT2_ALIGN:
Usar variáveis intermediárias torna cada etapa clara: multiqc_files_ch contém todos os arquivos de QC individuais misturados em um canal, e multiqc_files_list é o pacote coletado pronto para passar ao MultiQC.
2.2. Escrever o processo de agregação de QC e chamá-lo no fluxo de trabalho¶
Como antes, precisamos preencher a definição do processo, importar o módulo e adicionar a chamada do processo.
2.2.1. Preencher o módulo para o processo de agregação de QC¶
Abra modules/multiqc.nf e examine o esboço da definição do processo.
Vá em frente e preencha a definição do processo por si mesmo usando as informações fornecidas acima, depois verifique seu trabalho contra a solução na aba "Depois" abaixo.
Este processo usa path '*' como o qualificador de entrada para os arquivos de QC.
O curinga '*' diz ao Nextflow para preparar todos os arquivos coletados no diretório de trabalho sem exigir nomes específicos.
A entrada val output_name é uma string que controla o nome do arquivo do relatório.
O comando multiqc . escaneia o diretório atual (onde todos os arquivos de QC preparados estão) e gera o relatório.
Uma vez que você tenha completado isso, o processo está pronto para usar.
2.2.2. Incluir o módulo¶
Adicione a instrução de importação a rnaseq.nf:
Agora adicione a chamada do processo ao fluxo de trabalho.
2.2.3. Adicionar a chamada do processo¶
Passe os arquivos de QC coletados e o ID do relatório ao processo MULTIQC:
O processo MultiQC agora está conectado ao fluxo de trabalho.
2.3. Atualizar o tratamento de saída¶
Precisamos adicionar as saídas do MultiQC à declaração de publicação e configurar para onde elas vão.
2.3.1. Adicionar alvos de publicação para as saídas do MultiQC¶
Adicione as saídas do MultiQC à seção publish::
| rnaseq.nf | |
|---|---|
Em seguida, precisaremos dizer ao Nextflow onde colocar essas saídas.
2.3.2. Configurar os novos alvos de saída¶
Adicione entradas para os alvos do MultiQC no bloco output {}, publicando-os em um subdiretório multiqc/:
A configuração de saída está completa.
2.4. Executar o fluxo de trabalho¶
Usamos -resume para que as etapas de processamento anteriores sejam armazenadas em cache e apenas a nova etapa MultiQC seja executada.
Saída do comando
N E X T F L O W ~ version 24.10.0
Launching `rnaseq.nf` [modest_pare] DSL2 - revision: fc724d3b49
executor > local (1)
[07/3ff9c5] FASTQC (6) [100%] 6 of 6, cached: 6 ✔
[2c/8d8e1e] TRIM_GALORE (5) [100%] 6 of 6, cached: 6 ✔
[a4/7f9c44] HISAT2_ALIGN (6) [100%] 6 of 6, cached: 6 ✔
[56/e1f102] MULTIQC [100%] 1 of 1 ✔
Uma única chamada ao MULTIQC foi adicionada após as chamadas de processo em cache.
Você pode encontrar as saídas do MultiQC no diretório de resultados.
results/multiqc
├── all_single-end_data
│ ├── cutadapt_filtered_reads_plot.txt
│ ├── cutadapt_trimmed_sequences_plot_3_Counts.txt
│ ├── cutadapt_trimmed_sequences_plot_3_Obs_Exp.txt
│ ├── fastqc_adapter_content_plot.txt
│ ├── fastqc_overrepresented_sequences_plot.txt
│ ├── fastqc_per_base_n_content_plot.txt
│ ├── fastqc_per_base_sequence_quality_plot.txt
│ ├── fastqc_per_sequence_gc_content_plot_Counts.txt
│ ├── fastqc_per_sequence_gc_content_plot_Percentages.txt
│ ├── fastqc_per_sequence_quality_scores_plot.txt
│ ├── fastqc_sequence_counts_plot.txt
│ ├── fastqc_sequence_duplication_levels_plot.txt
│ ├── fastqc_sequence_length_distribution_plot.txt
│ ├── fastqc-status-check-heatmap.txt
│ ├── fastqc_top_overrepresented_sequences_table.txt
│ ├── hisat2_se_plot.txt
│ ├── multiqc_citations.txt
│ ├── multiqc_cutadapt.txt
│ ├── multiqc_data.json
│ ├── multiqc_fastqc.txt
│ ├── multiqc_general_stats.txt
│ ├── multiqc_hisat2.txt
│ ├── multiqc.log
│ ├── multiqc_software_versions.txt
│ └── multiqc_sources.txt
└── all_single-end.html
Esse último arquivo all_single-end.html é o relatório agregado completo, convenientemente empacotado em um arquivo HTML fácil de navegar.
Conclusão¶
Você sabe como coletar saídas de múltiplos canais, agrupá-las com .mix() e .collect(), e passá-las para um processo de agregação.
O que vem a seguir?¶
Adaptar o fluxo de trabalho para lidar com dados de RNAseq paired-end.
3. Habilitar o processamento de dados de RNAseq paired-end¶
Agora nosso fluxo de trabalho só pode lidar com dados de RNAseq single-end. É cada vez mais comum ver dados de RNAseq paired-end, então queremos ser capazes de lidar com isso.
Fazer o fluxo de trabalho completamente agnóstico do tipo de dado exigiria o uso de recursos de linguagem Nextflow um pouco mais avançados, então não vamos fazer isso aqui, mas podemos fazer uma versão de processamento paired-end para demonstrar o que precisa ser adaptado.
3.1. Copiar o fluxo de trabalho e atualizar as entradas¶
Começamos copiando o arquivo do fluxo de trabalho single-end e atualizando-o para dados paired-end.
3.1.1. Copiar o arquivo do fluxo de trabalho¶
Crie uma cópia do arquivo do fluxo de trabalho para usar como ponto de partida para a versão paired-end.
Agora atualize os parâmetros e o tratamento de entrada no novo arquivo.
3.1.2. Adicionar um perfil de teste paired-end¶
Fornecemos um segundo arquivo CSV contendo IDs de amostra e caminhos de arquivos FASTQ pareados no diretório data/.
Adicione um perfil test_pe a nextflow.config que aponta para este arquivo e usa um ID de relatório paired-end.
O perfil de teste para dados paired-end está pronto.
3.1.3. Atualizar a fábrica de canal¶
O operador .map() precisa pegar ambos os caminhos de arquivo FASTQ e retorná-los como uma lista.
O tratamento de entrada está configurado para dados paired-end.
3.2. Adaptar o módulo FASTQC para dados paired-end¶
Copie o módulo para criar uma versão paired-end:
A entrada do processo FASTQC não precisa mudar — quando o Nextflow recebe uma lista de dois arquivos, ele prepara ambos e reads se expande para ambos os nomes de arquivo.
A única mudança necessária é no bloco de saída: já que agora obtemos dois relatórios FastQC por amostra, mudamos de padrões baseados em simpleName para curingas.
Isso generaliza o processo de uma forma que o torna capaz de lidar com dados de RNAseq single-end ou paired-end.
Atualize a importação em rnaseq_pe.nf para usar a versão paired-end:
O módulo FASTQC e sua importação estão atualizados para dados paired-end.
3.3. Adaptar o módulo TRIM_GALORE para dados paired-end¶
Copie o módulo para criar uma versão paired-end:
Este módulo precisa de mudanças mais substanciais:
- A entrada muda de um único caminho para uma tupla de dois caminhos
- O comando adiciona a flag
--pairede recebe ambos os arquivos de leitura - A saída muda para refletir os arquivos adicionados e diferentes convenções de nomenclatura do Trim Galore, produzindo relatórios FastQC separados para cada arquivo de leitura
| modules/trim_galore_pe.nf | |
|---|---|
Atualize a importação em rnaseq_pe.nf:
O módulo TRIM_GALORE e sua importação estão atualizados para dados paired-end.
3.4. Adaptar o módulo HISAT2_ALIGN para dados paired-end¶
Copie o módulo para criar uma versão paired-end:
Este módulo precisa de mudanças similares:
- A entrada muda de um único caminho para uma tupla de dois caminhos
- O comando HISAT2 muda de
-U(não pareado) para argumentos de leitura-1e-2(pareados) - Todos os usos de
reads.simpleNamemudam pararead1.simpleNamejá que agora referenciamos um membro específico do par
Atualize a importação em rnaseq_pe.nf:
O módulo HISAT2_ALIGN e sua importação estão atualizados para dados paired-end.
3.5. Atualizar a agregação MultiQC para saídas paired-end¶
O processo TRIM_GALORE paired-end agora produz dois canais de relatório FastQC separados (fastqc_reports_1 e fastqc_reports_2) em vez de um.
Atualize o bloco .mix() em rnaseq_pe.nf para incluir ambos:
A agregação MultiQC agora inclui ambos os conjuntos de relatórios FastQC paired-end.
3.6. Atualizar o tratamento de saída para saídas paired-end¶
A seção publish: e o bloco output {} também precisam refletir os dois canais de relatório FastQC separados do processo TRIM_GALORE paired-end.
Atualize a seção publish: em rnaseq_pe.nf:
Atualize as entradas correspondentes no bloco output {}:
O fluxo de trabalho paired-end agora está totalmente atualizado e pronto para executar.
3.7. Executar o fluxo de trabalho¶
Não usamos -resume já que isso não usaria cache, e há duas vezes mais dados para processar do que antes, mas ainda deve ser completado em menos de um minuto.
Saída do comando
Agora temos duas versões ligeiramente divergentes do nosso fluxo de trabalho, uma para dados de leitura single-end e uma para dados paired-end. O próximo passo lógico seria fazer o fluxo de trabalho aceitar qualquer tipo de dado dinamicamente, o que está fora do escopo deste curso, mas podemos abordar isso em um acompanhamento.
Conclusão¶
Você sabe como adaptar um fluxo de trabalho de amostra única para paralelizar o processamento de múltiplas amostras, gerar um relatório de QC abrangente e adaptar o fluxo de trabalho para usar dados de leitura paired-end.
O que vem a seguir?¶
Dê um grande tapinha nas costas! Você completou o curso Nextflow para RNAseq.
Vá para o resumo final do curso para revisar o que você aprendeu e descobrir o que vem a seguir.