【问题标题】:How to handle ftp links provided in config file in snakemake?如何处理snakemake的配置文件中提供的ftp链接?
【发布时间】:2021-01-20 01:42:03
【问题描述】:

我正在尝试构建一个 snakemake 工作流程,如果本地文件存在或文件不存在,它将提供指向本地文件的符号链接,我会下载该文件并将其集成到工作流程中。为此,我使用了两个具有相同输出的规则,并使用 ruleorder 优先考虑链接规则(下面的 ln_fastq_pe)。

在执行工作流之前知道文件是否存在。文件路径或 ftp 链接在制表符分隔的配置文件中提供,工作流使用该配置文件来读取样本。 例如samples.txt 的内容:

id      sample_name     fq1     fq2
b       test_paired     resources/SRR1945436_1.fastq.gz resources/SRR1945436_2.fastq.gz
c       test_paired2    ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR194/005/SRR1945435/SRR1945435_1.fastq.gz  ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR194/005/SRR1945435/SRR1945435_2.fastq.gz

工作流程中的相关代码在这里:

import pandas as pd
from snakemake.remote.FTP import RemoteProvider as FTPRemoteProvider
FTP = FTPRemoteProvider()

configfile: "config/config.yaml"
samples = pd.read_table("config/samples.tsv").set_index("id", drop=False)
all_ids=list(samples["id"])

ruleorder: ln_fastq_pe > dl_fastq_pe
rule dl_fastq_pe:
    """
    download file from ftp link
    """
    input:
        fq1=lambda wildcards: FTP.remote(samples.loc[wildcards.id, "fq1"], keep_local=True),
        fq2=lambda wildcards: FTP.remote(samples.loc[wildcards.id, "fq2"], keep_local=True)
    output:
        "resources/fq/{id}_1.fq.gz",
        "resources/fq/{id}_2.fq.gz"
    shell:
        """
        mv {input.fq1} {output[0]}
        mv {input.fq2} {output[1]}
        """

rule ln_fastq_pe:
    """
    link file
    """
    input:
        fq1=lambda wildcards: samples.loc[wildcards.id, "fq1"],
        fq2=lambda wildcards: samples.loc[wildcards.id, "fq2"]
    output:
        "resources/fq/{id}_1.fq.gz",
        "resources/fq/{id}_2.fq.gz"
    shell:
        """
        ln -sr {input.fq1} {output[0]}
        ln -sr {input.fq2} {output[1]}
        """

当我运行此工作流时,我收到以下错误,指向描述 ln_fastq_pe 规则的行。

WorkflowError in line 58 of /path/to/Snakefile:
Function did not return str or list of str.

我认为错误在于我在 dl_fastq_pe 规则中的 samples.txt 配置文件中描述 FTP 链接的方式。描述表格配置文件中给出的 FTP 链接的正确方法是什么,以便 snakemake 理解它们并可以在工作流中下载和使用文件?

另外,是否有可能做我想做的事情,这种方法能让我到达那里吗?我尝试了其他解决方案(例如,使用 python 代码检查文件是否存在,如果存在则执行一组 shell 命令,如果不存在则执行另一组)无济于事。

【问题讨论】:

    标签: python ftp config snakemake


    【解决方案1】:

    您正在尝试将对象从 pandas 传递给 Snakemake。后者在规则的输入部分需要 strlist[str] 类型的值,但您提供的值 (samples.loc[wildcards.id, "fq1"]) 的类型为 pandas.core.frame.DataFramepandas.core.series.Series。您需要将它们转换为 Snamemake 所期望的。例如,这可能会有所帮助:samples.loc[wildcards.id, "fq1"].tolist()

    【讨论】:

    • 您是正确的,目标是将 samples.tsv 中描述的 FTP 链接作为str 提供给FTP.remote() 函数以供下载。我尝试了您的解决方案,但并没有完全实现。也许可以定义一个外部函数来生成字符串并返回FTP.remote(str),然后将该函数用作 dl_fastq_pe 规则的输入?
    • 你比我更了解你的任务。只需注意您提供给规则的对象的类型即可。
    【解决方案2】:

    我想出了如何做到这一点,方法是省略输入,而是通过参数从 samples.tsv 中读取字段并将两条规则合并为一条规则。与输入不同,Snakemake 对通过参数读取的内容并不挑剔。然后我使用test 命令询问文件是否存在。如果存在,请继续使用符号链接,如果不存在,请使用 wget 下载。

    解决方法如下:

    import os
    import pandas as pd
    
    samples = pd.read_table("config/samples.tsv").set_index("id", drop=False)
    all_ids=list(samples["id"])
    
    rule all:
        input:
            expand("resources/fq/{id}_1.fq.gz", id=all_ids),
            expand("resources/fq/{id}_2.fq.gz", id=all_ids)
    
    rule dl_fastq_pe:
        """
        if file exists, symlink. If file doesn't exist, download to resources
        """
        params:
            fq1=lambda wildcards: samples.loc[wildcards.id,"fq1"],
            fq2=lambda wildcards: samples.loc[wildcards.id,"fq2"]
        output:
            "resources/fq/{id}_1.fq.gz",
            "resources/fq/{id}_2.fq.gz"
        shell:
            """
            if test -f {params.fq1}
            then
                ln -sr {params.fq1} {output[0]}
                ln -sr {params.fq2} {output[1]}
            else
                wget --no-check-certificate -O {output[0]} {params.fq1}
                wget --no-check-certificate -O {output[1]} {params.fq2}
            fi
            """
    

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-29
      • 2019-07-03
      • 2020-10-23
      • 2013-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多