Python 如何在Snakemake表格配置中使用列表,用于描述生物信息管道的测序单元

Python 如何在Snakemake表格配置中使用列表,用于描述生物信息管道的测序单元,python,pandas,bioinformatics,pipeline,snakemake,Python,Pandas,Bioinformatics,Pipeline,Snakemake,如何在Snakemake表格配置中使用列表 我使用Snakemake表格(映射BWA mem)配置来描述我的测序单元(在单独的行上测序的库)。在分析的下一阶段,我必须合并测序单元(映射的.bed文件)并获取合并的.bam文件(每个样本一个)。现在我使用YAML配置来描述哪些单元属于哪些样本。但我希望使用表格配置来实现此目的 我不清楚如何从选项卡分隔文件的单元格中编写和调用列表(包含示例信息) 以下是我的单位表格配置: Unit SampleSM LineID PlatformPL

如何在Snakemake表格配置中使用列表

我使用Snakemake表格(映射BWA mem)配置来描述我的测序单元(在单独的行上测序的库)。在分析的下一阶段,我必须合并测序单元(映射的.bed文件)并获取合并的.bam文件(每个样本一个)。现在我使用YAML配置来描述哪些单元属于哪些样本。但我希望使用表格配置来实现此目的

我不清楚如何从选项卡分隔文件的单元格中编写和调用列表(包含示例信息)

以下是我的单位表格配置:

Unit    SampleSM    LineID  PlatformPL  LibraryLB   RawFileR1   RawFileR2
sample_001.lane_L1  sample_001  lane_L1 ILLUMINA    sample_001  /user/data/sample_001.lane_L1.R1.fastq.gz   /user/data/sample_001.lane_L1.R2.fastq.gz
sample_001.lane_L2  sample_001  lane_L2 ILLUMINA    sample_001  /user/data/sample_001.lane_L2.R1.fastq.gz   /user/data/sample_001.lane_L2.R2.fastq.gz
sample_001.lane_L8  sample_001  lane_L8 ILLUMINA    sample_001  /user/data/sample_001.lane_L8.R1.fastq.gz   /user/data/sample_001.lane_L8.R2.fastq.gz
sample_002.lane_L1  sample_002  lane_L1 ILLUMINA    sample_002  /user/data/sample_002.lane_L1.R1.fastq.gz   /user/data/sample_002.lane_L1.R2.fastq.gz
sample_002.lane_L2  sample_002  lane_L2 ILLUMINA    sample_002  /user/data/sample_002.lane_L2.R1.fastq.gz   /user/data/sample_002.lane_L2.R2.fastq.gz
samples:
 "sample_001": ["sample_001.lane_L1", "sample_001.lane_L2", "sample_001.lane_L8"]
 "sample_002": ["sample_002.lane_L1", "sample_002.lane_L2"]
以下是示例的YAML配置:

Unit    SampleSM    LineID  PlatformPL  LibraryLB   RawFileR1   RawFileR2
sample_001.lane_L1  sample_001  lane_L1 ILLUMINA    sample_001  /user/data/sample_001.lane_L1.R1.fastq.gz   /user/data/sample_001.lane_L1.R2.fastq.gz
sample_001.lane_L2  sample_001  lane_L2 ILLUMINA    sample_001  /user/data/sample_001.lane_L2.R1.fastq.gz   /user/data/sample_001.lane_L2.R2.fastq.gz
sample_001.lane_L8  sample_001  lane_L8 ILLUMINA    sample_001  /user/data/sample_001.lane_L8.R1.fastq.gz   /user/data/sample_001.lane_L8.R2.fastq.gz
sample_002.lane_L1  sample_002  lane_L1 ILLUMINA    sample_002  /user/data/sample_002.lane_L1.R1.fastq.gz   /user/data/sample_002.lane_L1.R2.fastq.gz
sample_002.lane_L2  sample_002  lane_L2 ILLUMINA    sample_002  /user/data/sample_002.lane_L2.R1.fastq.gz   /user/data/sample_002.lane_L2.R2.fastq.gz
samples:
 "sample_001": ["sample_001.lane_L1", "sample_001.lane_L2", "sample_001.lane_L8"]
 "sample_002": ["sample_002.lane_L1", "sample_002.lane_L2"]
我的蛇形密码:

import pandas as pd
import os

workdir: "/user/data/snakemake/"

configfile: "Samples.yaml"

units_table = pd.read_table("Units.tsv").set_index("Unit", drop=False)

rule all:
    input:
        expand('map_folder/{unit}.bam', unit=units_table.Unit),
        expand('merge_bam_folder/{sample}.bam', sample=config["samples"]),

rule map_paired_end:
    input:
        r1 = lambda wildcards: expand(units_table.RawFileR1[wildcards.unit]),
        r2 = lambda wildcards: expand(units_table.RawFileR2[wildcards.unit])
    output:
        bam = 'map_folder/{unit}.bam'
    params: 
        bai = 'map_folder/{unit}.bam.bai',
        ref='/user/data/human_g1k_v37.fasta.gz',
        SampleSM = lambda wildcards: units_table.SampleSM[wildcards.unit],
        LineID = lambda wildcards: units_table.LineID[wildcards.unit],
        PlatformPL = lambda wildcards: units_table.PlatformPL[wildcards.unit],
        LibraryLB = lambda wildcards: units_table.LibraryLB[wildcards.unit]
    threads:
        16  
    shell:
            r"""
                    seqtk mergepe {input.r1} {input.r2}\
                    | bwa mem -M -t {threads} -v 3 \
                    {params.ref} - \
                    -R "@RG\tID:{params.LineID}\tSM:{params.SampleSM}\tPL:{params.PlatformPL}\tLB:{params.LibraryLB}"\
                    | samtools view -u -Sb - \
                    | samtools sort - -m 4G -o {output.bam} 

                    samtools index {output.bam}
                    """

rule samtools_merge_bam:
    input:  
        lambda wildcards: expand('map_folder/{file}.bam', file=config['samples'][wildcards.sample])
    output:
        bam = 'merge_bam_folder/{sample}.bam'
    threads:
        1
    shell:  
                    r"""
                    samtools merge {output.bam} {input}

                    samtools index {output.bam}
                    """

下面这个怎么样

我已将样品排除在外,因为考虑到你们的样品单,我认为没有必要

在规则
samtools\u merge\u bam
中,收集共享相同样本m的所有单元bam文件。这些单元bam文件在
map\u paired\u end
中创建,其中lambda表达式收集每个单元的fastq文件

还要注意,我已经从all规则中删除了单元bam文件,因为(我认为)这些只是中间文件,可以使用标志将它们标记为临时文件


请查看以下网站上的最佳实践工作流之一:


例如,工作流定义了两个tsv文件,一个用于单位,一个用于样本。这允许您(a)向样本添加更多属性,以及(b)每个样本有多个单位。

一列中的
samples
,另一列中的
sample.lane
,后者作为字符串,使用逗号或分号作为分隔符,然后对其使用
split()
转换为列表,如何?然而,我同意,如果这样做,可读性将不容易。我希望使用样本表格文件不仅用于单位信息,理想情况下,我希望解析给定样本的其他设置(附加配置文件)。我将尝试使用split(),谢谢!非常感谢。这是好的和清楚的!但我的下一个想法是使用Sample.tab声明其他参数,比如几个config.yaml文件(带有多个目标面板的设置,例如:不同的bed文件和单倍型调用者的设置)