Python 3.x Snakemake收集前一条规则的输出以输入第二条规则

Python 3.x Snakemake收集前一条规则的输出以输入第二条规则,python-3.x,snakemake,Python 3.x,Snakemake,我正在尝试运行一个工作流,该工作流将在一系列.fastq文件上运行,合并同一文件夹中的任何文件,然后对合并的文件执行下游分析。到目前为止,我能够合并文件,但如果不再次运行snakemake,我无法运行下游分析。我99%肯定这是因为snakemake(以及下游规则)在第二次运行snakemake之前不会“拾取”合并规则的输出。有关规则如下: def get_barcode_文件夹(通配符): checkpoint_output=checkpoints.basecall_barcode.get(**

我正在尝试运行一个工作流,该工作流将在一系列.fastq文件上运行,合并同一文件夹中的任何文件,然后对合并的文件执行下游分析。到目前为止,我能够合并文件,但如果不再次运行snakemake,我无法运行下游分析。我99%肯定这是因为snakemake(以及下游规则)在第二次运行snakemake之前不会“拾取”合并规则的输出。有关规则如下:

def get_barcode_文件夹(通配符):
checkpoint_output=checkpoints.basecall_barcode.get(**通配符)。输出[0]
条形码=集合()
对于os.listdir中的文件夹(检查点输出):
完整路径=os.path.join(检查点输出,文件夹)
如果路径(完整路径).is\u dir():
条形码。添加(文件夹)
merge_files=[config['results_folder']+“Barcode/“+Barcode+”。merge.fastq”用于条形码中的条形码]
返回合并文件
FAST5_FILES=glob_通配符(config['results_folder']+“DataFiles/FAST5/{FAST5_file}.FAST5”).FAST5_文件
规则所有:
输入:
#basecall、条形码和合并文件
获取\u条形码\u文件夹,
#nanoQC预修剪
展开(配置['results_folder']+“NanoQC/Pre-Trim/{barcode}”,
barcode=set(全局通配符(配置['results\u folder']+“barcode/{barcode}.merged.fastq”).barcode))
检查点基本呼叫\u条形码:
输入:
config['results_folder']+“DataFiles/fast5/”
输出:
目录(配置['results_folder']+“.barcodeTempOutput/”)
康达:
“环境/蟒蛇亚马尔”
外壳:
r”“”
回显{input}
"""
def合并文件输入(通配符):
返回glob.glob(config['results_folder']+f.barcodeTempOutput/{wildcards.barcode}/*.fastq”)
规则合并\u文件:
输入:
合并\u文件\u输入
输出:
config['results_folder']+“Barcode/{Barcode}.merged.fastq”
外壳:
r”“”
#在此处合并文件,按预期工作。触摸用作占位符
触摸{输出}
"""
#我对这条规则(以及所有后续规则)有问题
规则:
输入:
规则。合并_文件。输出[0]
输出:
目录(配置['results_folder']+“NanoQC/Pre-Trim/{barcode}”)
外壳:
r”“”
mkdir{output}
#执行NanoQC分析。mkdir再次用作占位符
"""
当我以“干净”的方式运行此程序时(即,仅存在一些初始.fast5文件),执行的唯一规则是
basecall\u条形码
merge\u文件
。在第一次运行时,
merge_files
没有被snakemake提到,因为它必须重新评估输出以确定必须运行什么,这对我来说很有意义。然而,直到第二次运行工作流,我才让
nanoqpretrim
工作,这让我非常困惑

我认为这是因为当第一次运行工作流时,
rule all
下的
config['results_folder']+“Barcode/{Barcode}.merged.fastq”
中没有数据,因此,没有任何下游规则(过去的merge_文件)需要运行,因为没有输入

但是,我的印象是,在使用snakemake时,它会尝试为每个规则的输出找到必要的输入,因此,即使
规则NanoQCPreTrim
的输入文件当前不存在,它也会运行规则,因为它的输出不存在,然后反向工作,试图确定哪些规则可以进行输入

此外,我认为使用检查点也可以缓解这个问题,因为在
检查点basecall\u条形码
完成后会重新评估DAG。因此,下游规则将能够基于现有文件创建必要的输入/输出

我遗漏了一些东西,这可能很简单,但我几乎整天都在做这件事,无法找出什么似乎是一个幼稚的问题。谢谢你的帮助

编辑
当我使用
-F
运行工作流以强制执行所有规则时,一切都按预期进行;i、 e.snakemake的
作业计数
部分中说明了每个规则

不知道这在内部是如何工作的,但在请求检查点之前,可能会对规则all中的nanoqc pretrim输入进行评估。如果您将此输入添加到函数中,就像获取条形码文件夹一样,并首先请求执行检查点,该怎么办?这很有效!我以为我也做过类似的事情,但没能让它继续下去,但现在它还是做了!非常感谢。我说得有点太早了。这可以让整个工作流正常运行,但是在删除输出文件并执行试运行后,我得到的结果是,没有什么需要做的事情与全局输入的方式相关。我认为qc需要使用与合并函数类似的函数是的,在类似于代码顶部函数的函数中,我似乎在返回正确的
glob_通配符
时遇到了问题。不知道这在内部是如何工作的,但在请求检查点之前,可能会对规则all中的nanoqc pretrim输入进行评估。如果您将此输入添加到函数中,就像获取条形码文件夹一样,并首先请求执行检查点,该怎么办?这很有效!我以为我也做过类似的事情,但没能让它继续下去,但现在它还是做了!非常感谢。我说得有点太早了。这可以让整个工作流正常运行,但是在删除输出文件并执行试运行后,我得到的结果是,没有什么需要做的事情与全局输入的方式相关。我认为qc需要使用与合并函数类似的函数是的,在与代码顶部的函数类似的函数中,我似乎在返回正确的
glob_通配符时遇到了问题