Python 按群集拆分bam,然后使用检查点按群集合并bam

Python 按群集拆分bam,然后使用检查点按群集合并bam,python,snakemake,Python,Snakemake,我有三个来自3个不同样本的单单元格bam文件,需要通过集群将其拆分为更小的bam。然后,我需要合并来自相同集群的不同样本的bam文件。我试着使用检查点,但有点迷路了 这是我贴出的这个问题的延续 SAMPLE_cluster={“samreak”:[“1”、“2”、“3”],“SampleB”:[“1”],“SampleC”:[“1”、“2”]} 集群=[] 对于样本_集群中的样本: CLUSTERS.extend(示例\u cluster[SAMPLE]) 集群=已排序(集合(集群) 规则所有:

我有三个来自3个不同样本的单单元格bam文件,需要通过集群将其拆分为更小的bam。然后,我需要合并来自相同集群的不同样本的bam文件。我试着使用检查点,但有点迷路了

这是我贴出的这个问题的延续

SAMPLE_cluster={“samreak”:[“1”、“2”、“3”],“SampleB”:[“1”],“SampleC”:[“1”、“2”]}
集群=[]
对于样本_集群中的样本:
CLUSTERS.extend(示例\u cluster[SAMPLE])
集群=已排序(集合(集群)
规则所有:
输入:展开(“01merged_bam/{cluster_id}.bam,cluster_id=CLUSTERS)
检查点拆分\u bam:
输入:“{sample}.bam”
输出:目录(“01split_bam/{sample}/”)
外壳:
"""
split_bam.sh{input}
"""
##split_bam.sh将bam文件拆分为“01split_bam/{sample}/{sample}}{cluster_id}.bam”
def merge_bam_输入(通配符):
checkpoint\u output=checkpoints.split\u bam.get(**通配符)。输出[0]
返回expand(“01split_bam/{sample}/{sample}{{{cluster_id}}}.bam”\
sample=glob_通配符(os.path.join(检查点_输出,{sample}{cluster\u id}.bam”)).sample)
每个群集的规则合并\u bam\u:
输入:合并\u bam\u输入
输出:“01merged_bam/{cluster_id}.bam”
日志:“00log/{cluster\u id}.merge\u bam.log”
线程:2
外壳:
"""
samtools合并-@2-r{output}{input}
"""
根据群集编号,每个群集的规则合并\u bam\u的输入将更改:

e、 g.对于集群1:“01split_bam/samdeace/samdeace_1.bam”、“01split_bam/SampleB/SampleB_1.bam”、“01split_bam/SampleC/SampleC_1.bam”

对于集群2:“01split_bam/samacreak/samacreak_2.bam”,“01split_bam/SampleC/SampleC_2.bam”


对于集群3:“01split_bam/samamreak/samamreak_3.bam”。

我决定不使用检查点,而是使用输入函数来获取


样本_集群={“样本”:[“1”、“2”、“3”],“样本B”:[“1”],“样本C”:[“1”、“2”]}
#反转映射
集群_sample={'1':['samdeace','sample'B','sampleC'],'2':['samdeace','sampleC'],'3':['samdeace']}
规则拆分\u bam:
输入:“{sample}.bam”
输出:“split.touch”
外壳:
"""
split_bam{input}
轻触,轻触
"""
规则索引\u分割\u bam:
输入:“split.touch”
输出:“split_bam/{sample}{cluster_id}.bam.bai”
外壳:
"""
samtools索引01split_bam/{wildcards.sample}/{wildcards.sample}{wildcards.cluster_id}.bam
"""
def get_merge_bam_输入(通配符):
示例=群集\u示例[通配符.群集\u id]
返回expand(“01split_bam/{sample}/{sample}{{{cluster_id}}}}.bam.bai”,sample=samples)
每个群集的规则合并\u bam\u:
输入:获取\u合并\u bam\u输入
输出:“01merged_bam/{cluster_id}.bam”
参数:
bam=lambda通配符,输入:“”。连接(输入)。替换(“.bai”,”)
日志:“00log/{cluster\u id}.merge\u bam.log”
线程:2
外壳:
"""
samtools merge-@2-r{output}{params.bam}
"""

它似乎正在工作。

很好的snakemake代码!使用函数作为输入非常强大。我想开始更多地使用它。是否可以在params中将另一个lambda函数声明为普通函数?谢谢。是的,params也可以使用函数,并且可以使用通配符和输入、输出作为参数。在某些情况下非常方便。在在您的规则
split_bam
shell
部分,我建议您将
&&
放在
split_bam{input}之后
command。否则,
touch split.touch
会发生,即使第一个命令失败,下游规则
index\u split\u bam
也会继续,要么失败,要么在您没有注意到的情况下处理较旧的过时输入。谢谢您的建议。我通常将-euo pipefail设置在Snake文件的顶部,因此它会失败