Py100Skills

[Py026]Snakefile灵活传递param

2019-01-31  本文已影响19人  安哥生个信

snakemake是用python编写的,最近串流程用的比较频繁,所以也归纳在python实用技巧里面。

现在需要实现的一个功能是——

​ 根据每一个input自身的特点,返回一个值(可能是固定,也可能是随机);然后将这个返回值传递给下面的运行代码。

举例:

​ 现在有两个fastq文件20192.fastq.gz 20193.fastq.gz,需要通过seqkit转换为fasta文件;

​ 如果文件名是奇数,则转换出来的序列,每行长度为80;

​ 如果文件名是偶数,则转换出来的序列,每行长度为60

实现1——

from glob import glob

def out_len_param(wildcards):
        return 80 if int(wildcards.sample_num)%2==0 else 60

samples = [file.split('.')[0] for file in glob('*.fastq.gz')]

rule all:
        input:
                expand('{sample_num}.fa', sample_num=samples)

rule seqkit:
        input:
                fq = os.path.join(DIR,'{sample_num}.fastq.gz')
        output:
                fa = '{sample_num}.fa'
        params: out_len_param
        shell:
                '''
                echo {wildcards.sample_num}
                seqkit fq2fa -w {params} {input.fq} > {output.fa}
                '''

这种实现方式,在撰写函数时候,必须提前指定下面rule种的通配key值

某胖评价:修改代码时稍微麻烦点,因为上下需要一起改

实现2——某胖策略

from glob import glob
import os

DIR = ".../.../..."

samples = [ file.split('/')[-1].split('.')[0] 
           for file in glob(os.path.join(DIR,'*.fastq.gz'))]

def out_len_param(fq):
    (filepath,filename) = os.path.split(fq)
    return 80 if int(filename.split('.')[0]) %2 == 0 else 60

rule all:
    input:
        expand('{sample_num}.fa', sample_num=samples)

rule seqkit:
    input:
        fq = os.path.join(DIR,'{sample_num}.fastq.gz')
    output:
        fa = '{sample_num}.fa'
    params:
        length=lambda wildcards,input:out_len_param2(input.fq)
    shell:
        '''
        echo {wildcards.sample_num}
        seqkit fq2fa -w {params.length} {input} > {output.fa}
        '''

这种实现方式,函数的参数为具体的fastq文件,但是params里面必须通过lambda匿名函数传递wildcards进去

上一篇 下一篇

猜你喜欢

热点阅读