我对Snakemake还是很陌生,并且在尝试编写规则时遇到了麻烦。
我一直在尝试结合使用snakemake.remote.NCBI和访问熊猫数据框并使用通配符,但是我似乎无法使其工作。
我有一个名为基因组.tsv的tsv文件,其中有几列,其中每一行都是一个物种。一个是“ id”,并具有该物种基因组的基因库ID。另一个“物种”具有每个物种唯一的短字符串。在我的Snakefile中,基因组.tsv是作为基因组导入的,只有id和物类列,然后将物类设置为基因组索引并从基因组中删除。
我想使用“物种”中的值作为工作流程中通配符{species}的值,我希望我的规则使用snakemake.remote.NCBI以fasta格式下载每个物种的基因组序列,然后输出到文件“ {species} _gen.fa”
from snakemake.remote.NCBI import RemoteProvider as NCBIRemoteProvider
import pandas as pd
configfile: "config.yaml"
NCBI = NCBIRemoteProvider(email=config["email"]) # email required by NCBI to prevent abuse
genomes = pd.read_table(config["genomes"], usecols=["species","id"]).set_index("species")
SPECIES = genomes.index.values.tolist()
rule all:
input: expand("{species}_gen.fasta",species=SPECIES)
rule download_and_count:
input:
lambda wildcards: NCBI.remote(str(genomes[str(wildcards.species)]) + ".fasta", db="nuccore")
output:
"{species}_gen.fasta"
shell:
"{input} > {output}"
当前,尝试运行我的代码会导致密钥错误,但是它说密钥是物种的值,因此它应该能够从基因组中获取相应的genbank id。
编辑:这是错误
InputFunctionException in line 18 of /home/sjenkins/work/olflo/Snakefile:
KeyError: 'cappil'
Wildcards:
species=cappil
cappil是{species}的有效值,我认为它应该可用作索引。这是基因组的前几行,以供参考:
species id accession name assembly
cappil 8252558 GCA_004027915.1 Capromys_pilorides_(Desmarest's_hutia) CapPil_v1_BIUU
cavape 1067048 GCA_000688575.1 Cavia_aperea_(Brazilian_guinea_pig) CavAp1.0
cavpor 175118 GCA_000151735.1 Cavia_porcellus_(domestic_guinea_pig) Cavpor3.0
更新:
我尝试将输入行更改为:
lambda wildcards: NCBI.remote(str(genomes[genomes['species'] == wildcards.species].iloc[0]['id']) + ".fasta", db="nuccore")
但是这给了我错误消息:
回溯(最近通话最近): 在第547行的“ makemake”文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/init.py”中 export_cwl = export_cwl) 在执行的文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/workflow.py”中,行421 dag.init() 初始化文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/dag.py”,第122行 作业= self.update([作业],进度=进度) 更新文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/dag.py”,第603行 进度=进度) 在update_中的文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/dag.py”中,第666行 进度=进度) 更新文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/dag.py”,第603行 进度=进度) 在update_中的文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/dag.py”中,第655行 missing_input = job.missing_input 文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/jobs.py”,第398行,位于missing_input中 对于self.input中的f 在第399行的文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/jobs.py”中 如果不存在,则self.subworkflow_input中不存在f。 存在文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/io.py”,存在于第208行 返回self.exists_remote 包装中的文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/io.py”,行119 v = func(self,* args,** kwargs) 文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/io.py”,第258行,位于exist_remote 返回self.remote_object.exists() 存在文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/remote/NCBI.py”,存在 可能性_request_options = self._ncbi.guess_db_options_for_extension(self.file_ext,db = self.db,rettype = self.rettype,retmode = self.retmode) File_ext中的文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/remote/NCBI.py”,行110 附件,版本,file_ext = self._ncbi.parse_accession_str(self.local_file()) 在parse_accession_str中的第366行,文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/remote/NCBI.py” 断言file_ext,“必须定义file_ext:{}。{}..。可能的值包括:{}”。format(accession,version,“,” .join(list(self.valid_extensions)))) AssertionError:必须定义file_ext:...可能的值包括:est,ssexemplar,gb.xml,docset,fasta.xml,fasta,fasta_cds_na,abstract,txt,gp,medline,chr,flt,同系物,alignmentscores,gbwithparts, seqid,fasta_cds_aa,gpc,uilist,uilist.xml,rsr,xml,gb,gene_table,gss,ft,gp.xml,acc,asn1,gbc
答案 0 :(得分:2)
我认为您应该拥有:
genomes = pd.read_table(config["genomes"], usecols=["species","id"])
SPECIES = list(genomes['species'])
,然后使用以下命令访问给定物种的ID:
lambda wildcards: str(genomes[genomes['species'] == wildcards.species].iloc[0]['id'])
答案 1 :(得分:1)
好吧,事实证明,我得到AssertionError: file_ext must be defined:
的原因是,如果NCBIRemoteProvider给出的文件名没有有效的Genbank登录号,则NCBIRemoteProvider无法识别该文件扩展名。我给它提供了带有genbank id的文件名,因此它返回了该错误。
另外,似乎整个基因组序列都没有返回所有序列的登录号。而是为wgs报告提供了登录号,然后为每个支架提供了登录号。我决定尝试手动下载所需的基因组,而不是尝试下载所有支架然后组合它们。