mcpField
T
tooluniverse-biomedical-fact-lookup

tooluniverse-biomedical-fact-lookup

github.com/mims-harvard其他1.8k83 次安装3 天前更新
代码仓库

关于 tooluniverse-biomedical-fact-lookup

tooluniverse-biomedical-fact-lookup 是一项面向生物医学事实问答的技能,指导 Agent 查询权威数据库工具,而非凭记忆回答。它涵盖多类基因、疾病、蛋白质和变异查询,并提示常见的数据解读陷阱。

主要功能

  1. 01按问题类型路由至查询工具
  2. 02查询数据库核实事实
  3. 03检查选项与结果是否匹配
  4. 04提示数据库注释解读陷阱
  5. 05覆盖基因、疾病及蛋白质信息

适用场景

  1. 01核对基因集成员或疾病关联
  2. 02查询蛋白质功能与定位
  3. 03比较变异、调控元件或脑区注释
  4. 04回答指定数据库来源的选择题

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mims-harvard/tooluniverse --skill tooluniverse-biomedical-fact-lookup

安装后在 Claude Code 中输入/tooluniverse-biomedical-fact-lookup确认已加载。

附带文件test_snippets.py

详细介绍

生物医学事实查询(基于工具作答)

生物医学事实问题——例如“集合 X 中有哪些基因”“根据 DisGeNet,哪些基因与疾病 Y 相关”“根据 GTRD,哪些基因具有转录因子结合位点”——在公共数据库中都有权威答案。凭记忆猜测并不可靠(对于冷门注释,猜对的概率约等于碰运气);对应的 ToolUniverse 工具可以返回真实结果。

六个会导致答案看似确定、实则错误的陷阱

每种情况都曾在真实问题中导致错误答案。请在作答前检查;各项的详细说明见下文。

  1. GWAS 中的“最高 p 值”意味着显著性最低——也就是数值最小。 按字面意思理解,会选出研究中最弱的结果(rs2476491 的 p 值为 1e-06,而非 rs7775055-G 的 3e-174)。

  2. “TSS 上游 N bp 加下游 M bp”的窗口跨度为 N+M+1 个碱基——锚点也计入其中。TSS 两侧各 100 bp,共 201 nt,而非 200。请将得到的长度与所需长度核对。

  3. HPA 的亚细胞定位会汇总抗体测试过的所有细胞系。 请报告 main_locations 和 additional_locations,但如果问题指定了某个细胞系,就应将它们视为候选项,并排除属于其他细胞系的注释——把五个都列出来和只列一个一样是错误的。

  4. Allen Brain:回答叶级结构,而非其上级结构。 图谱会为具体结构和上级结构标注不同颜色,因此,在 Lateral preoptic area(#F2483B)才是正确答案时,回答“Hypothalamus”就是错误的。AllenBrain_search_structures 会返回 color_hex_triplet。

  5. SCREEN 的 is_proximal 不可靠;请根据 element_type 筛选——PLS 和 pELS 位于 TSS 附近,dELS 则位于远端。

  6. 衍生评分与发布版本绑定。 对 APOC2,gnomAD pLI 在 r4 中为 0.047,在 r2.1 中为 0.402——同一基因的数值相差 8.5 倍。请使用问题指定的发布版本,并说明所用版本。

规则零:查询数据,绝不猜测

如果问题提到了数据库、基因集或数据库中包含的任何注释,就必须先查询工具。如果凭记忆回答“根据 <数据库>”的问题,就会出错——这些注释(预测的 miRNA 靶标、ChIP-seq 结合、整理好的基因集、疾病关联)正是模型容易产生幻觉的内容。经过工具核验的答案胜过任何回忆出来的事实。

选择题流程

这些问题大多是选择题,其中有一个“信息不足,无法回答”选项。请按以下步骤作答:

  1. 解析问题,找出:指定的数据库/集合、锚定实体(基因集、疾病、miRNA、TF、基因座……)以及候选选项。
  2. 确定锚定实体对应的工具和标识符(见路由表)。
  3. 查询工具一次,获取权威的成员列表/关联集合。
  4. 核对每个选项与查询结果。应当恰好有一个选项得到支持。
  5. 作答,给出该选项的字母。只有当工具对有效查询确实没有返回任何结果时,才选择“信息不足”(不能因为跳过查询而选择)。

路由表——问题模式 → 工具

问题提及……工具(已验证)方法
一个具名的 基因集 / 致癌特征(MSigDB C6,例如 ATM_DN.V1_DN)MSigDB_get_gene_set_members列出成员,检查其中是否包含某个选项
“根据 miRDB”给出的 miRNA 靶标(例如 MIR186-3p)MSigDB_get_gene_set_members(集合 C3:MIR:MIRDB)集合名称 = MIR<number>_<3P|5P>,例如 MIR186_3P
“根据 GTRD”给出的 TF 结合位点 / 靶标(例如 PGM3)MSigDB_check_gene_in_set(集合 C3:TFT:GTRD)集合名称 = <TF>_TARGET_GENES,例如 PGM3_TARGET_GENES;针对每个选项传入 gene
通路 / 标志成员资格MSigDB_get_hallmark_geneset、MSigDB_get_genesetHALLMARK_<NAME> 或精确的集合名称
基因 ↔ 疾病关联(DisGeNet、OpenTargets、OMIM)umls_search_concepts → DisGeNET_get_disease_genes/DisGeNET_get_gda;OpenTargets_*、MyDisease_get_disease、OMIM_search;文本挖掘备用方案: PubTator3_LiteratureSearch / PubTator3_GetEntityRelations(e1=@GENE_<sym>)、EPMC_get_text_mined_annotationsDisGeNET 需要 UMLS CUI(通过 umls_search_concepts 解析 → C0152200,然后设置 disease=C0152200)以及 DISGENET_API_KEY。参见下方“在 X 中但不在 Y 中”操作方案
小鼠表型基因集(MP / MGI,例如“黑色素瘤发病率升高”)MSigDB_check_gene_in_set(小鼠 M5,集合 MP_<PHENOTYPE>)——备用方案:MGI_search_genes → MGI_get_phenotypes对照 MP_* 集合每个选项调用一次(例如 MP_INCREASED_MELANOMA_INCIDENCE);成员即为答案。仅当集合名称无法解析时,才使用下方的 MGI 逐基因方案
基因基因组位置(Ensembl 带区,例如 chr7q34)Ensembl_* / NCBIDatasets_get_gene_by_symbol解析每个选项并比较细胞遗传学带区 / 坐标
变异 / 序列致病性(“根据 ClinVar,哪个变异 / 序列具有致病性 或 良性”)(仅在确实无法确定时)annotate_variant_multi_source、VEP_predict_pathogenicity、UniProt_get_disease_variants_by_accession提高效率——不要查询每个选项(这会导致超时)。 先确定蛋白质,再找出每个选项对应的单个氨基酸替换,并直接根据具体残基变化进行判断;对于已充分研究的 ClinVar 变异,基础模型通常很可靠。最多进行一次有针对性的工具调用,以解决真正不确定的变异。注意问题的判断方向(良性还是致病):对于“最可能为良性”,常见 / 与参考序列一致的变异就是答案;对于“最可能具有致病性”,罕见且有害的变异才是答案。
药物 / 化合物靶标、作用机制、审批状态ChEMBL_*、OpenFDA_*、GtoPdb_*(需要 GTOPDB_API_KEY)、PubChem_*解析药物并查询相关关系
适合该患者的药物(临床病例中提到了修饰因素)FDA_*_by_drug_name——根据修饰因素选择章节参见下方“为描述的患者选择药物”
蛋白质功能 / 结构域 / 序列UniProt_*解析登录号并阅读注释
蛋白质定位 / 表达(“根据 Human Protein Atlas”)HPA_get_subcellular_location、HPA_get_rna_expression_by_source、HPA_get_comprehensive_gene_details_by_ensembl_id传入基因符号——抗体 ID(例如 HPA073143)也可使用,并会解析到其靶基因。报告主要和其他定位——参见下文
Allen 小鼠/人脑图谱中的脑区AllenBrain_search_structures(name 或 acronym)、AllenBrain_get_structure参考图谱中的区域按颜色编码:结果包含 color_hex_triplet,因此可以回答“图中红色的区域是什么”——见下文
基因附近的调控元件 / cCRE(ENCODE SCREEN)SCREEN_search_cCREs_by_region按 element_type 筛选(PLS 和 pELS 靠近 TSS,dELS 位于远端),并查看 dnase_zscore
ClinVar 中位于 / 与某基因组区域重叠的变异ClinVar_search_by_region不要使用 ClinVar_search_variants——Entrez 匹配的是变异的起点,因此窄窗口会漏掉跨越该区域、但起点在上游数百万碱基处的 CNV。此工具返回真正重叠的变异,并按跨度从小到大排序
ReMap 中某 TF 实验的峰数量 / 数据集ReMap_list_datasets_for_target一个 GEO 系列可以包含多个数据集(GSE23852/FOXA1 = 2 个,分别有 60,158 和 67,736 个峰)——除非问题要求总数,否则应分别报告;使用 count_peaks: true 获取数量
STRING 中的蛋白质互作伙伴STRING_get_protein_interactions查看 partner 字段,而非 preferredName_B:边按内部 ID 排列为 A/B,因此被查询的蛋白质大约一半时间位于 A 列

不确定哪个工具封装了某个数据库时,请按关系(例如“基因-疾病关联”“基因集成员”)搜索目录,而不是按品牌名称搜索——ToolUniverse 通常已经提供了相应工具。

Allen Brain Atlas——回答具体结构,而非其父级结构

参考图谱为每个结构指定颜色,而 AllenBrain_search_structures 会返回 color_hex_triplet。询问某种颜色(“冠状位 181 处标注为红色的是哪个区域”)的问题,问的是具有该颜色的叶级结构,例如 Lateral preoptic area = #F2483B。

回答其所属区域(“Hypothalamus”)是错误的,尽管它包含了正确的区域:图谱为具体结构着色,而父级结构有自己的不同颜色。按名称或缩写搜索,比较 color_hex_triplet,并给出颜色相符的结构。请注意,同一个缩写可能返回多行(半球特异性条目和本体版本条目),且颜色不同——优先选择 name 与问题措辞相符的那一行。

Human Protein Atlas——报告两个定位字段

HPA_get_subcellular_location 将结果拆分为两部分,而且这种拆分并非按显著性排序:

main_locations       : ['Nucleoplasm']
additional_locations : ['Primary cilium', ..., 'Cytosol']

询问“这种抗体显示出什么定位”的问题,需要的是 HPA 报告的所有位置,也就是两个列表——只根据 main_locations 作答会漏掉真实的定位,这是只答对一部分的常见原因(例如,HPA 报告“Nucleoplasm, Cytosol”,却只回答“Nucleoplasm”)。请使用已经合并两者的 location_summary,或查看这两个字段。

另外还需注意两点:

  • 定位信息按细胞系汇总。 HPA 会汇总某个抗体在所有受测细胞系中的免疫荧光结果。如果问题指定了某个细胞系(HEK293、U-2 OS),应将列表视为候选集合,并说明报告的是哪个细胞系,而不要暗示汇总结果仅适用于该细胞系。
  • 仅公开富集细胞类型的 RNA 值。 HPA 的机器可读字段会提供基因富集细胞类型的特异性以及 nTPM/nCPM;不会公开任意细胞类型的数值。如果问题询问的细胞类型没有相应数值,请如实说明,而不要用最接近的可用数值替代——两者可能相差一个数量级。

MSigDB 集合名称规范(LAB-Bench 中最常见的模式)

ToolUniverse 的 MSigDB_* 工具涵盖了 LAB-Bench 问题所基于的多个集合。请准确填写集合名称:

  • C6 致癌特征 — 使用问题中引用的确切集合名称(例如 ATM_DN.V1_DN、KRAS.600_UP.V1_UP)。
  • C3:MIR:MIRDB(miRDB v6.0 预测的 miRNA 靶标)— MIR<number>_<3P|5P>(例如 MIR186_3P、MIR675_3P)。这就是 miRDB;不要说“无法访问 miRDB”。
  • C3:TFT:GTRD(GTRD TF 靶基因)— <TF>_TARGET_GENES(例如 PGM3_TARGET_GENES)。这就是 GTRD。
  • Hallmark — HALLMARK_<NAME>。
  • Mouse M5(MGI 哺乳动物表型) — MP_<PHENOTYPE_IN_CAPS>(例如,“increased melanoma incidence” → MP_INCREASED_MELANOMA_INCIDENCE)。这些是小鼠集合:工具会先尝试人类集合,再自动尝试小鼠集合;也可以传入 species: "mouse" 跳过人类集合的查询。相比逐一查询每个基因的完整 MGI 表型列表,优先使用此方法。

MSigDB_get_gene_set_members(操作 get_gene_set)返回 {genes:[...]};MSigDB_check_gene_in_set(操作 check_gene_in_set,参数 gene)返回 {is_member: bool}。两者都会报告匹配的 species 集合。

每个集合只获取一次,不要为每个选项都获取一次。 多项选择题会询问一个集合中的 3-5 个候选项,因此调用一次 MSigDB_get_gene_set_members 就能回答所有候选项——你可以自行将选项与返回的列表进行比对。仅在问题只涉及一个基因,或集合过大、不便完整返回时,才使用 MSigDB_check_gene_in_set。

“在数据库 X 中有关联,但在数据库 Y 中没有”基因-疾病查询方法

这类问题(例如“根据 DisGeNet,哪个基因与疾病 D 有关联,但与 OMIM 无关?”)需要进行差异查询,而不是单次查询:

  1. 将 D 解析为 UMLS CUI(umls_search_concepts)。
  2. OMIM 侧: 使用 OMIM_search/OMIM_get_gene_map 查询 D → 获取 OMIM 致病基因集合。
  3. DisGeNet 侧: 使用 DisGeNET_get_disease_genes(disease=CUI)(人工整理)。请注意,学术版 API key 仅能访问人工整理的数据;DisGeNet 还包含一个文本挖掘层,而该 key 无法访问。
  4. 文本挖掘回退方案(当人工整理的数据为空时,用于覆盖 DisGeNet 的文本挖掘层):使用 PubTator3_LiteratureSearch("<GENE> <disease>") 或 PubTator3_GetEntityRelations(e1="@GENE_<sym>", type="associate")——与 D 存在文献共现、但不在 OMIM-for-D 中的基因,就是“在 DisGeNet 中有记录,但不在 OMIM 中”的答案。
  5. 排除法: 排除对 D 属于 OMIM 致病基因的选项;在其余选项中,选择与 DisGeNet/文本挖掘关联的基因。如果恰好只有一个选项不属于 OMIM 致病基因,且存在任何关联信号,那就是答案。
  6. 仅当所有来源都没有任何选项存在关联时,才回答“信息不足”。如果标准答案中的基因既不在人工整理的 DisGeNet 数据、OMIM 中,也没有出现在 PubTator 文献中,它可能依赖学术版 API 无法访问的 DisGeNet 内部文本挖掘信号——请如实说明,不要猜测。

为病例描述的患者选择药物(临床病例题)

“以下哪种方案最适合这位患者?”题目会给出一个病例,并指出某种修饰因素——肝功能或肾功能损害、Child-Pugh 分级、合并使用强效 CYP3A4 抑制剂、妊娠、过敏或禁忌证——以及若干候选药物。这类题目看起来是在考临床判断,但真正起决定作用的是修饰因素,而答案就在每种候选药物的 FDA 标签中。依靠记忆作答正是容易出错的地方:选项通常都是治疗该病的合理药物,只有标签能将它们区分开来。

1. 先将每个选项的商品名对应到通用名。 对每个选项调用 FDA_get_active_ingredient_info_by_drug_name。务必先做这一步,再开始推理,原因有二:标签查询以活性成分为依据,而且有时两个选项其实是同一种药物,只是分别使用了商品名和通用名。若出现这种情况,两者都不可能是预期答案——它们无法区分——因此应同时排除,往往就能直接解出题目。明确指出重复选项;这也值得报告为基准测试缺陷。

2. 只查询修饰因素所涉及的章节。 每个候选药物进行一次有针对性的调用,比调取完整标签更有效:

病例描述……查看此章节
肝功能损害、Child-Pugh A/B/C 级、肝硬化调用 FDA_get_pharmacokinetics_by_drug_name(肝功能损害小节),然后调用 FDA_get_dosage_and_storage_information_by_drug_name 查询剂量调整。Child-Pugh 分级可能出现在其中任一章节,也可能出现在禁忌证中;有些标签描述了肝功能损害,却完全不使用这一术语——某个章节中没有相关信息,不代表标签中没有
肾功能损害、CrCl/eGFR、透析同样查询这两个章节——先查药代动力学,再查剂量
“正在使用强效 CYP3A4 抑制剂/诱导剂”,或指定了任何合并用药调用 FDA_get_drug_interactions_by_drug_name;若标签写明的是代谢途径而非特定药物组合,则调用 FDA_get_clinical_pharmacology_by_drug_name
妊娠、哺乳、“计划怀孕”调用 FDA_get_pregnancy_or_breastfeeding_info_by_drug_name(若问题专门询问胎儿伤害,则调用 FDA_get_teratogenic_effects_by_drug_name)
过敏,或会排除某药的合并症调用 FDA_get_contraindications_by_drug_name,然后调用 FDA_get_boxed_warning_info_by_drug_name
老年患者/儿科患者调用 FDA_get_geriatric_use_info_by_drug_name/FDA_get_pediatric_use_info_by_drug_name
该药可能无法治疗所述疾病调用 FDA_get_indications_by_drug_name

命名规则一致——FDA_get_<section>_by_drug_name——因此,如果这里未列出所需章节,可在目录中按章节名称搜索,而不是猜测工具名称。

3. 通过排除法作出判断,并说明每个选项为何被排除。 通常,预期答案是唯一不受该修饰因素排除的候选药物:因肝功能损害而禁用、需要无法实现的剂量减量、与所述合并用药发生相互作用,或未获批用于治疗该疾病。引用标签中排除各选项的原文——没有引用标签原句的病例题答案,只是披着引文外衣的猜测。

不要过度查询。 先确认活性成分(每个选项调用一次),再为每个剩余候选药物查阅一个章节。如果所有选项的标签都没有说明该修饰因素,就如实指出,并根据适应证作答——不要继续查询其他章节,寄望找到区分依据。

小鼠表型匹配(MGI)——仅作备用

先尝试使用 MP_<PHENOTYPE> MSigDB 集合(见上文):每个选项只需一次调用,而且使用的是相同的 MGI 注释。仅当集合名称无法解析时,才使用这种逐基因查询方式。

MGI_get_phenotypes 会为每个基因返回一个 phenotype_statement 字符串列表,并且采用分页——某个基因匹配的陈述往往在后续页面中,因此单页内容不能证明该基因没有匹配项。要回答“哪个基因被注释为具有表型 P”,请查询每个候选基因,并选择陈述中包含与 P 匹配短语的基因(陈述是便于人阅读的内容,例如“癌发生率增加”“肿瘤”)。应匹配表型概念,而非完全相同的 MP ID 字符串。如果有多个匹配项,优先选择最具体的陈述。

计算步骤(答案需要计算,而非查找时)

GWAS 中的“最高 p 值”指最显著

在 GWAS 文献中,“最高 p 值”“首要关联位点”和“最强关联”都指最显著的结果,也就是数值最小的 p 值。按字面理解,“最高”会选出研究中最弱的关联,这几乎从来不是原意。

对于 GCST005528,按字面理解会得到 rs2476491-?,p = 1e-06;预期答案是 rs7775055-G,p = 3e-174。

按 p 值升序排序并报告该位点。如果措辞确实可能有两种理解,就给出最显著的位点,并用一句话说明数值最大的 p 值对应另一个 SNP——不要默默按字面意思选择。

基因组窗口——计入锚点碱基

描述为“X 上游 N bp 加下游 M bp”的窗口,跨度为 N + M + 1 个碱基,因为锚点 X 本身也包含在内。若要求 TSS 上游 100 bp、下游 100 bp,则长度是 201 nt,而不是 200。差一位是序列答案看起来正确却实际错误的最常见原因。

无论调用哪种工具,也要注意其坐标约定:

约定start..end 的跨度使用场景
1 基闭区间end - start + 1Ensembl region、UCSC 浏览器文本、IGV、samtools
0 基半开区间end - startUCSC REST API、BED

UCSC_get_sequence 可通过 region 接收以文本形式给出的位点(1 基闭区间),也可通过带有 coordinate_system 的显式 chrom/start/end 参数接收位点;它会回显 region_1based 和 requested_length,以便核对跨度。回答前务必检查返回长度是否符合问题要求——即使保留的每个碱基都正确,长度不对的序列仍然是错误的。

任何具有唯一确定的数值/组合答案的问题都必须通过运行代码得出,绝不能估算或心算。这适用于序列问题(ORF 数量、限制性酶切片段/大小、GC 含量、翻译),也适用于其他所有可精确计算的问题,例如遗传分离/孟德尔或多倍体配子比例、组合概率、化学计量、剂量/药代动力学运算、计数问题。对这类问题进行心算是最常见且可避免的错误来源:模型很容易数错或乘错。如果问题可以归结为“枚举情形/相乘概率/计数对象”,就编写一段简短的 Python 代码,运行后准确报告返回结果——即使题目看起来像生物学“推理”问题,只要答案是确定的数字,就应计算,而不是凭推理得出。按照问题的措辞采用相应约定(使用哪条链;线性还是环状;采用哪种杂交/分离模型),并说明所用约定,以便核查。 最终答案规范(避免“计算正确,答案错误”)。 代码返回结果后,请仔细、明确地将结果对应到选项字母:先引用计算出的值,再找出与之完全匹配的选项(对于片段大小集合,要匹配完整的多重集;对于计数,要匹配整数)。很多答错的情况都是计算正确,却选错了字母——务必避免这种情况;提交 [ANSWER] 前,请重新逐一核对每个选项与计算结果。

流程:“有多少 ORF 编码的蛋白质长度大于 N 个氨基酸?”

按字面理解题意。“DNA 序列 <X> 中有多少个 ORF”问的是给定的那条单链——只计数该链(3 个阅读框),而不是两条链。不要因为 DNA 是双链的就“热心地”加上反向互补链:题目给出的是一个序列字符串,并询问其中有什么,因此除非题目明确写了“两条链”“双链”“任一条链”或“反向互补链”,否则反向链不在范围内。默认加入反向链是这类题目答错最常见的原因——请务必避免。计入每个能到达同阅读框终止密码子的不同起始位点(ATG);重叠或嵌套的 ORF 都要计数(同一阅读框中,一个终止密码子前有两个 ATG,就算两个 ORF)。长度规则是严格大于:蛋白质长度(aa)=(终止密码子索引 − 起始密码子索引);对于“长度大于 N”,只保留 aa_len > N 的结果。报告代码针对给定链返回的数量——即使也计算了双链的结果,也不要用它替代题目所问的单链答案。

from Bio.Seq import Seq

def count_orfs(dna, min_aa, both_strands=False):
    """Count ORFs (ATG..in-frame-stop) encoding a protein STRICTLY longer than min_aa.
    Counts every qualifying ATG, including nested/overlapping ORFs. Forward strand
    by default; set both_strands=True only if the question asks for both strands."""
    dna = "".join(dna.split()).upper()
    strands = [Seq(dna)]
    if both_strands:
        strands.append(Seq(dna).reverse_complement())
    n = 0
    for s in strands:
        for off in range(3):                       # three reading frames per strand
            trimmed = s[off: len(s) - (len(s) - off) % 3]
            prot = str(trimmed.translate())        # '*' marks stop codons
            i = 0
            while i < len(prot):
                if prot[i] == "M":                 # ATG
                    stop = prot.find("*", i)
                    if stop != -1 and (stop - i) > min_aa:
                        n += 1                      # count this ATG; do NOT jump past stop
                i += 1
    return n
# e.g. count_orfs(seq, 12) -> integer; report exactly that number.

流程:限制性酶切片段计数/大小

# Count fragments after digesting with named enzyme(s).
# LINEAR DNA is the default (a plain sequence string): fragments = cuts + 1.
# Only use circular=True if the question says plasmid/circular.
from Bio.Seq import Seq
from Bio.Restriction import RestrictionBatch

def digest(dna, enzymes, circular=False):
    dna = "".join(dna.split()).upper()
    rb = RestrictionBatch(enzymes)            # e.g. ["EcoRI","BamHI"] or ["AluBI","MalI"]
    cut_positions = sorted(p for sites in rb.search(Seq(dna), linear=not circular).values() for p in sites)
    if not cut_positions:
        return 1, []                          # uncut: one fragment (linear or circular)
    n_frag = len(cut_positions) if circular else len(cut_positions) + 1
    return n_frag, cut_positions

如果 RestrictionBatch 因酶名报错(同裂酶/罕见供应商名称),请通过 DNA 酶切工具(该工具带有 Biopython 回退方案)解析,或将其映射到识别位点后重新运行——不要退而猜测。

流程:遗传分离/配子与子代比例(枚举,而非凭记忆)

涉及比例的遗传学问题——配子频率、子代基因型比例、多倍体分离——都可以通过枚举等可能的等位基因组合精确计算。不要凭记忆套用比例;要推导出来。对于某位点携带一组等位基因的亲本,在染色体随机分离的情况下,配子中的等位基因组合,是从亲本的等位基因中选取配子所含数量的所有等可能组合;用 Counter 和 combinations 统计基因型类别。

from itertools import combinations
from collections import Counter

def gamete_ratio(alleles, gamete_size):
    """Genotype distribution of gametes under random segregation.
    e.g. tetraploid AAaa -> gametes carry 2 alleles: gamete_ratio(['A','A','a','a'], 2)."""
    classes = Counter("".join(sorted(c)) for c in combinations(alleles, gamete_size))
    return dict(classes)   # e.g. {'AA':1, 'Aa':4, 'aa':1}

def progeny_fraction(parent_alleles, gamete_size, target_gamete, selfing=True):
    """Fraction of progeny that are homozygous target (e.g. 'aa' gamete x 'aa' gamete -> aaaa)."""
    g = gamete_ratio(parent_alleles, gamete_size); tot = sum(g.values())
    p = g.get(target_gamete, 0) / tot
    return p * p if selfing else p   # selfing/self-cross: square the gamete frequency
# tetraploid AAaa: gamete_ratio(['A','A','a','a'],2) = {'AA':1,'Aa':4,'aa':1};
# recessive 'aa' gamete freq = 1/6, so aaaa progeny under selfing = (1/6)^2 = 1/36.

将枚举得到的比例与选项对照(例如,若某情形得到 AA:Aa:aa 配子比例 1:4:1,则 aa 配子数量最多,因此 aaaa 子代比例也最高)。报告计算出的分数/比例,并选择与之匹配的选项。

解读:报告代码实际返回的精确值(ORF 数量;完整多重集形式的片段数量/大小;最长 ORF 的 nt 或 aa 长度;配子比例/子代分数——严格按题目所问)。务必说明采用的约定(正向链还是双链;线性还是环状;分离模型),以便核查。如果存在两种合理解读,请分别计算,并选择符合题目字面表述的一种。然后明确将计算结果与选项对应起来再作答(参见上文最终答案规范)。

解读

  • 列出锚点成员/关联项的工具结果具有权威性——选择其中列出的选项。
  • 如果工具因某个名称报错(例如未找到集合),请先根据上述约定重新推导名称,再判断是否“信息不足”。
  • 只有在针对格式正确的查询,权威工具返回空结果时,“信息不足”才是正确答案——如果根本没有尝试查询,就不能这样回答。

局限性(如实说明)

  • 需要密钥的来源:DisGeNET_* 和 OMIM 工具需要 DISGENET_API_KEY / OMIM 密钥。没有密钥时,请改用无需密钥的 OpenTargets_* / MyDisease_*,并说明所用来源。如果没有无需密钥的来源能够回答问题,且问题指定了数据库,则确实属于“信息不足”的情况——请如实说明。

  • 版本不匹配:工具所用的数据库快照可能与问题指定的确切版本不同;对于某些数值,差异可能并不小。不同版本间会重新计算衍生评分,因此同一个基因的评分可能相差一个数量级。通过 gnomad_get_constraint 获取的 gnomAD pLI:

    基因gnomAD r4gnomAD r2.1
    APOC20.0468750.401638
    APOC10.0863230.216848

    如果工具提供 dataset/版本参数,请将其设为问题指定的版本,并说明所用版本。如果工具无法提供问题指定的版本,请报告实际使用的版本,不要把数值说成与版本无关——在这里,单独给出 pLI 值会产生最高 8 倍的歧义。

  • 此技能用于查询事实。若要对用户的数据文件进行计算,请改用数据分析路由技能。

评论

支持 Markdown