构建AlphaFold2预测结果可视化函数出现AttributeError报错求助
报错根因
你遇到的AttributeError: 'NoneType' object has no attribute 'show'是多个逻辑问题共同导致的,同时代码还存在多个潜在运行错误,修复清单如下:
- 参数传值错误:调用
show_pdb()时color参数误写为"1DDT"(数字1),正确应为"lDDT"(小写字母L) - 路径匹配规则错误:glob匹配规则写为
'.pdb',只会匹配名称恰好为.pdb的文件,无法匹配所有后缀为pdb的结果文件,应改为'*.pdb' - 空列表逻辑漏洞:如果
pdb_files为空列表,for循环不会执行,view变量未定义,函数直接返回None,调用.show()就会触发你遇到的报错 - 多文件加载逻辑错误:for循环中每次迭代都重新初始化
view对象,最终仅返回最后一个pdb文件的视图,前面加载的文件都会被覆盖 - 缺失依赖导入:代码未导入
py3Dmol库,运行时会触发NameError - 未定义变量引用:
color="chain"分支中使用了未定义的homooligomer变量,选择该配色时会触发报错 - 缺失辅助函数:后续调用的
plot_plddt_legend、plot_confidence函数未定义,运行时会触发报错
修复后完整代码
import os import re import glob import py3Dmol # 以下两个导入是为了补全你缺失的辅助函数,如果你原有环境已经实现可以删除重写 import matplotlib.pyplot as plt import numpy as np #@title Display 3D structure {run: "auto"} model_num = 1 #@param ["1", "2", "3", "4", "5"] {type:"raw"} color = "lDDT" #@param ["chain", "lDDT", "rainbow"] show_sidechains = False #@param {type:"boolean"} show_mainchains = False #@param {type:"boolean"} # 补全未定义的同源多聚体参数,你可以根据实际情况调整数值 homooligomer = 1 def get_filepaths(root_path: str, file_regex: str): return glob.glob(os.path.join(root_path, file_regex)) rootdir = '/projects/p31492/long_alphafold/alphafold__long_sequence_file' regex = '*.pdb' pdb_files = get_filepaths(rootdir, regex) def show_pdb(model_num=1, show_sidechains=False, show_mainchains=False, color="lDDT"): # 先判断是否存在pdb文件,避免空列表报错 if not pdb_files: raise FileNotFoundError(f"在路径{rootdir}下未找到任何pdb文件") # 初始化一次view对象,所有pdb都加载到同一个视图里 view = py3Dmol.view(js='https://3dmol.org/build/3Dmol.js',) for file in pdb_files: view.addModel(open(file,'r').read(),'pdb') if color == "lDDT": view.setStyle({'cartoon': {'colorscheme': {'prop':'b','gradient': 'roygb','min':50,'max':90}}}) elif color == "rainbow": view.setStyle({'cartoon': {'color':'spectrum'}}) elif color == "chain": for n,chain,color_val in zip(range(homooligomer),list("ABCDEFGH"), ["lime","cyan","magenta","yellow","salmon","white","blue","orange"]): view.setStyle({'chain':chain},{'cartoon': {'color':color_val}}) if show_sidechains: BB = ['C','O','N'] view.addStyle({'and':[{'resn':["GLY","PRO"],'invert':True},{'atom':BB,'invert':True}]}, {'stick':{'colorscheme':f"WhiteCarbon",'radius':0.3}}) view.addStyle({'and':[{'resn':"GLY"},{'atom':'CA'}]}, {'sphere':{'colorscheme':f"WhiteCarbon",'radius':0.3}}) view.addStyle({'and':[{'resn':'PRO'},{'atom':['C','O'],'invert':True}]}, {'stick':{'colorscheme':f"WhiteCarbon",'radius':0.3}}) if show_mainchains: BB = ['C','O','N','CA'] view.addStyle({'atom':BB},{'stick':{'colorscheme':f"WhiteCarbon",'radius':0.3}}) view.zoomTo() return view # 修复color参数的拼写错误 show_pdb(model_num,show_sidechains, show_mainchains, color=color).show() # 补全缺失的辅助函数,如果你原有环境已经实现可以删除 def plot_plddt_legend(): fig = plt.figure(figsize=(2, 0.5)) gs = fig.add_gridspec(1, 1) ax = fig.add_subplot(gs[0]) cmap = plt.get_cmap('roygb') norm = plt.Normalize(50, 90) cb = plt.colorbar(plt.cm.ScalarMappable(norm=norm, cmap=cmap), cax=ax, orientation='horizontal', ticks=[50, 60, 70, 80, 90]) cb.set_label('pLDDT') return fig def plot_confidence(model_num): # 这里可以根据你实际的pLDDT数据实现逻辑,示例只返回空图 fig = plt.figure(figsize=(8, 3)) plt.title(f'Model {model_num} per-residue confidence score (pLDDT)') plt.xlabel('Residue index') plt.ylabel('pLDDT') plt.ylim(0, 100) return fig if color == "lDDT": plot_plddt_legend().show() plot_confidence(model_num).show()
额外注意点
如果你只需要加载指定编号的模型文件,不需要遍历所有pdb,可将regex改为*model_{model_num}*.pdb即可匹配对应编号的结果文件。
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

