【问题标题】:snakemake 6.0.5: Input a list of folders and multiple files from each folder (to merge Lanes)snakemake 6.0.5:输入文件夹列表和每个文件夹中的多个文件(合并车道)
【发布时间】:2021-10-09 09:13:14
【问题描述】:

美好的一天。我有一些目录(下面以粗体显示),每个目录都有一些用于不同车道的 .fastq 文件。

CND1/ UD_LOO3_R1.fastq.gz UD_LOO4_R1.fastq.gz

CND2/ XD_L001_R1.fastq.gz XD_L004_R1.fastq.gz

在每个目录中,我想创建一个合并的 fastq 文件,命名为:sample_R1.fastq.gz。例如,CND1/UD_R1.fastq.gz 和 CND2/XD_R1.fastq.gz 等等。为此,我创建了以下 snakemake 工作流程。

from collections import defaultdict
dirs,samp,lane = glob_wildcards("dir}/{sample}_L{lane}_R1.fastq.gz")

dirs, fls  = glob_wildcards("{dir}/{files}_R1.fastq.gz")

D = defaultdict(list)

for x,y in zip(dirs,fls):
    D[x].append(y+'_R1.fastq.gz')

rule ML:
    message:
        "Merge all Lanes for Fragment R1"
    input:
        expand( "{dir}/{files}",zip,dir=D.keys(),files=D.values() )
    output:
        expand( "{dir}/{s}_R1.fastq.gz",zip,dir=dirs,s=set(samp) )
    shell:
        "echo {input} && echo {output} "
        #"zcat {input} >> {output}"

在上面的代码中,dict D 包含目录作为键,fastq 列表作为值。

{ 'CND2': ['XD_L001_R1.fastq.gz', 'XD_L004_R1.fastq.gz'], 'CND1': ['UD_LOO3_R1.fastq.gz', 'UD_LOO4_R1.fastq.gz'] }

进行试运行,snakemake 抱怨我缺少文件,如下所示 缺少规则 ML 的输入文件:

CND2/['XD_L001_R1.fastq.gz', 'XD_L004_R1.fastq.gz'] CND1/['UD_LOO3_R1.fastq.gz', 'UD_LOO4_R1.fastq.gz']

我想了解同时提供目录和文件列表作为输入的正确方法是什么。非常感谢任何帮助。

谢谢。

【问题讨论】:

    标签: bioinformatics snakemake fastq


    【解决方案1】:

    错误清楚地解释了问题。由于expand 函数,您的input 是两个文件:

    CND2/['XD_L001_R1.fastq.gz', 'XD_L004_R1.fastq.gz']
    CND1/['UD_LOO3_R1.fastq.gz', 'UD_LOO4_R1.fastq.gz']
    

    如果你需要输入是四个这样的文件:

    CND1/UD_LOO3_R1.fastq.gz
    CND1/UD_LOO4_R1.fastq.gz
    CND2/XD_L001_R1.fastq.gz
    CND2/XD_L004_R1.fastq.gz
    

    你需要把你的字典弄平:

    inputs = [(dir, file) for dir, files in D.items() for file in files]
    rule ML:
        input:
            expand( "{dir}/{files}", zip, dir=[row[0] for row in inputs], files=[row[1] for row in inputs])
    

    或者:

    inputs = [(dir, file) for dir, files in D.items() for file in files]
    rule ML:
        input:
            expand( "{filename}", filename=[f"{dir}/{file}" for dir, file in inputs])
    

    总体而言,您使问题过于复杂。没有这种丑陋的元组列表也可以做到这一点。 glob_wildcards("{filename_base}_R1.fastq.gz") 应该会为您返回更方便的表示形式。

    【讨论】:

    • 感谢您的建议。我不想将来自不同目录的文件合并在一起,我想在这种情况下,您建议的模式 glob_wildcards("{filename_base}_R1.fastq.gz") 可能很合适。我需要仅使用每个单独目录中存在的文件在每个目录中创建一个合并的 fastq。这就是为什么想到创建一个字典,使用轨迹名称一个键和每个文件中的文件列表作为值。
    猜你喜欢
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多