[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进去