我想要一个规则来执行正常和肿瘤之间的重新调整。主要问题是我不知道如何管理这个问题。它是通配符还是扩展我的问题的答案?
这是我的样本清单:
conditions:
pair1:
tumor: "432"
normal: "433"
所以规则必须是这样的
rule gatk_RealignerTargetCreator:
input:
expand("mapped_reads/merged_samples/{sample}.sorted.dup.reca.bam",sample=config['conditions']['pair1']['tumor']),
"mapped_reads/merged_samples/{sample}.sorted.dup.reca.bam",sample=config['conditions']['pair1']['normal']),
output:
"mapped_reads/merged_samples/{pair1}.realign.intervals"
如何在条件下对所有按键执行此操作? (我想有更多那一对)
我试过这段代码:
input:
lambda wildcards: config["conditions"][wildcards.condition],
tumor= expand("mapped_reads/merged_samples/{tumor}.sorted.dup.reca.bam",tumor=config['conditions'][wildcards.condition]['tumor']),
normal = expand("mapped_reads/merged_samples/{normal}.sorted.dup.reca.bam",normal=config['conditions'][wildcards.condition]['normal']),
output:
"mapped_reads/merged_samples/{tumor}/{tumor}_{normal}.realign.intervals"
名称'通配符'未定义
...
答案 0 :(得分:3)
wildcards
未在规则输入中“直接”定义。您需要使用function of wildcards
代替。我不确定我到底知道你想做什么,但你可以尝试类似的东西。
def condition2tumorsamples(wildcards):
return expand(
"mapped_reads/merged_samples/{sample}.sorted.dup.reca.bam",
sample=config['conditions'][wildcards.condition]['tumor'])
def condition2normalsamples(wildcards):
return expand(
"mapped_reads/merged_samples/{sample}.sorted.dup.reca.bam",
sample=config['conditions'][wildcards.condition]['normal'])
rule gatk_RealignerTargetCreator:
input:
tumor = condition2tumorsamples,
normal = condition2normalsamples,
output:
"mapped_reads/merged_samples/{condition}.realign.intervals"
# remainder of the rule here...
答案 1 :(得分:0)
免责声明:您想要从YAML文件中读取配对,但是, 我建议不要这样做。我无法弄清楚如何使用YAML格式优雅地完成它。我有一种特殊的方式来配对我的SNP和INDEL注释,但是,有很多锅炉板代码,所以它可以从YAML写它。这没关系,因为YAML变量可能永远不会被编辑,所以在这种情况下,在一个迂腐格式的字符串中的维护不再重要。
我认为您尝试的代码是正确的。 我认为缺少的是能够"请求"你"规则中的正确配对"输入。我个人更喜欢使用Pandas来做到这一点。它列在Python Software Foundation的主页上,因此它是一个很好的选择。
pandas设置非常易于维护,它是单个文件选项卡或空格分隔。最终用户比格式化嵌套YAML文件更容易(如果通过YAML格式设置,我认为需要什么)。这是我在我的系统中这样做的方式。它无限扩展。我承认访问pandas对象有点棘手,但我已经为你提供了代码。只要知道第一层对象('示例[1] [肿瘤]'调用中的[#]),我认为[0]只是正在读取的文件的元数据。我还没有找到它的用途,否则就忽略它。
工作区的树结构
(CentOS5-Compatible) [tboyarski@login3 Test]$ tree
.
|-- [tboyarsk 620 Aug 4 10:57] Snakefile
|-- [tboyarsk 47 Aug 4 10:52] config.yaml
|-- [tboyarsk 512 Aug 4 10:57] output
| |-- [tboyarsk 0 Aug 4 10:54] ABC.bam
| |-- [tboyarsk 0 Aug 4 10:53] TimNorm.bam
| |-- [tboyarsk 0 Aug 4 10:53] TimTum.bam
| `-- [tboyarsk 0 Aug 4 10:57] XYZ.bam
`-- [tboyarsk 36 Aug 4 10:49] sampleFILEpair.txt
sampleFILEpair.txt(证明样本名称可以不相关)
tumor normal
TimTum TimNorm
XYZ ABC
config.yaml
pathDIR: output
sampleFILE: sampleFILEpair.txt
Snakefile
from pandas import read_table
configfile: "config.yaml"
rule all:
input:
expand("{pathDIR}/{sample[1][tumor]}_{sample[1][normal]}.bam", pathDIR=config["pathDIR"], sample=read_table(config["sampleFILE"], " ").iterrows())
rule gatk_RealignerTargetCreator:
input:
"{pathGRTC}/{normal}.bam",
"{pathGRTC}/{tumor}.bam",
output:
"{pathGRTC}/{tumor}_{normal}.bam"
# wildcard_constraints:
# tumor = '[^_|-|\/][0-9a-zA-Z]*',
# normal = '[^_|-|\/][0-9a-zA-Z]*'
run:
call('touch ' + str(wildcard.tumor) + '_' + str(wildcard.normal) + '.bam', shell=True)
随着通配符的合并,在过去,我发现它是周期性依赖的来源,因此我在合并时也总是包含wildcard_constraints(基本上就是我们正在做的事情)。它们实际上并不是必需的。 "规则全部"不包含任何通配符,并且它正在调用" gatk",所以在这个确切的示例中,没有模糊性的空间,但如果此规则与其他使用通配符的规则连接,通常它可以生成一些时髦的DAG'第