python-3.x - Snakemake - 如何使用文件的每一行作为输入?

标签 python-3.x snakemake

我需要使用文件tissuesused.txt的每一行作为snakemake中并行规则的输入。我想总共大约有 48 个工作机会。

for line in $(cat tissuesused.txt)
do
   echo "Sorting $line.phen_fastqtl.bed to $line/$line.pheno.bed..."
   bedtools sort -header -i $line/$line.phen_fastqtl.bed > $line/$line.pheno.bed 
   echo "bgzipping $line/$line.pheno.bed..."
   bgzip -f $line/$line.pheno.bed
   #figure out where tabix outputs
   echo "Indexing $line/$line.pheno.bed.gz..."
   tabix -p bed $line/$line.pheno.bed.gz
done

我该如何在snakemake中做到这一点?我在网上找不到任何关于此的信息。这项工作发生在管道的中途,因此我不知道如何在蛇文件的顶部为尚不存在的文件定义一个函数。我只想创建一个字符串列表,每个字符串都包含在 tissuesused.txt 中找到的一种人体组织的缩写。我找到了section in the snakemake docs看起来它们可能相关,但我不确定如何将其应用到我的案例中。预先感谢您。

编辑: 这是我到目前为止所拥有的,不确定它是否有效:

def fileAsList(file):
    with open(file) as f:
        for line in f:
            lis = []
            spl = line.split()
            lis.append(spl[0])
        return lis
...
rule sort_zip_ind_pheno:
    input:
        tis=fileAsList("tissuesused.txt"),
        chk=".make_tis_dirs.chkpnt"
    output:
        touch(".sort_zip_ind_pheno.chkpnt")
    shell:
        "bedtools sort -header -i {input.tis}/{input.tis}.phen_fastqtl.bed > \
        {input.tis}/{input.tis}.pheno.bed;"
        "bgzip -f {input.tis}/{input.tis}.pheno.bed;"
        "tabix -p bed {input.tis}/{input.tis}.pheno.bed.gz"

请告诉我这是否有意义。

最佳答案

我认为您正在寻找的是 checkpoints在《蛇形》中。看一下这个例子:

checkpoint get_tissue:
    output:
        "tissuesused.txt"
    run:
        with open(output[0], 'a') as f:
            for i in range(9):
                f.write(f"{i}\n")


rule read_tissue:
    output:
        "tissue_{n}.txt"
    shell:
        """
        echo "this is tissue {wildcards.n}" > {output}
        """


def read_tissues_output(wildcards):
    with open(checkpoints.get_tissue.get().output[0]) as f:
        samples = [sample for sample in f.read().split('\n') if len(sample) > 0]  # we dont want empty lines
        return expand("tissue_{sample}.txt", sample=samples)

rule all:
    input:
        read_tissues_output

并使用

运行它

snakemake --直到全部

规则全部使用read_tissues_output作为输入函数(正如您在问题中指定的那样)。然后,该函数尝试打开检查点 get_tissue 的输出,如果它尚不存在,它将生成它。一旦输出存在,​​函数就会读取文件,并返回我们想要生成的文件 (tissue_{1-10})。规则 read_tissue 可以为我们生成然后生成这些文件(并行)。

编辑:

tissueused.txt:

WHLBLD
TESTIS
THYROID

蛇文件

def read_tissues_output():
    with open('tissuesused.txt') as f:
        samples = [sample for sample in f.read().split('\n') if len(sample) > 0]  # we dont want empty lines
        return expand("tissue_{sample}.txt", sample=samples)

rule all:
    input:
        read_tissues_output()


rule read_tissue:
    output:
        "tissue_{n}.txt"
    shell:
        """
        echo "this is tissue {wildcards.n}" > {output}
        """

关于python-3.x - Snakemake - 如何使用文件的每一行作为输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57596812/

相关文章:

python - 在 Snakemake 工作流程中作为输入的值数组

python - Snakemake:从 DAG 可视化中隐藏某些规则

parameters - Snakemake:扩展参数

python - 程序在将字典传递给函数参数时显示 TypeError

python - 准备从 Python 2.x 转换到 3.x

python - 如何嵌套 numpy() 的 np.where,或者一个接一个?

python - 强制 Nosetests 使用 Python 2.7 而不是 3.4

snakemake - 如何根据可用内核数设置线程?

sockets - sbatch:错误:批处理作业提交失败:运行Snakemake时发送/接收操作时套接字超时

python - 使用 DictWriter 读写 csv