Проблема с построением функции для визуализации прогнозов Alphafold2

#python #data-visualization

Вопрос:

Я пытаюсь использовать следующий сценарий (который в значительной степени основан на этом замечательном Колабе здесь: https://colab.research.google.com/github/sokrypton/ColabFold/blob/main/AlphaFold2.ipynb#scrollTo=UGUBLzB3C6WN) визуализировать предсказанное сворачивание аминокислотной последовательности. У меня возникли проблемы с настройкой сценария таким образом, чтобы он работал, и по в основном институциональным причинам я не могу свободно запускать и отлаживать сценарий на своих данных и действительно могу использовать его только для финальных запусков. Сообщение об ошибке, которое я получаю прямо сейчас (со ссылкой на show_pdb() предпоследнюю строку), выглядит так:

 AttributeError: 'NoneType' object has no attribute 'show'
 

Может ли кто-нибудь помочь мне решить эту проблему, и, возможно, другие, которые еще не очевидны для меня? Я включил хэшированные части для контекста, если это необходимо или желательно, но основная часть, в которой мне нужна помощь,-это построение show_pdb() функции.

 import os
import re
import glob

#@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"}

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"):
    for file in pdb_files:      
        view = py3Dmol.view(js='https://3dmol.org/build/3Dmol.js',)
        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 in zip(range(homooligomer),list("ABCDEFGH"),
                             ["lime","cyan","magenta","yellow","salmon","white","blue","orange"]):
                view.setStyle({'chain':chain},{'cartoon': {'color':color}})
        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

show_pdb(model_num,show_sidechains, show_mainchains, color="1DDT").show()
if color == "lDDT": plot_plddt_legend().show()  
plot_confidence(model_num).show()
 

Комментарии:

1. Здравствуйте @Aaron и добро пожаловать в SO, если ваш сценарий представлен в вашем вопросе точно так же, как и в вашем редакторе, похоже, что уровень отступа вашего оператора return неправильно выровнен с вашими циклами for. Кроме того, из-за области действия вашей view переменной она перезаписывается в ходе циклов. Чтобы напрямую ответить на ваш вопрос, вы получаете эту ошибку, потому show_pdb что возвращается None вместо py3Dmol.view

2. @MaxFeinberg Спасибо за твой комментарий, Макс! Я только что обновил свой код, чтобы учесть ваши советы — к сожалению, функция работает не до конца, но я надеюсь, что мой код теперь более читабелен

3. Отлично! Похоже, мы приближаемся. Существует переменная, homooligomer , которая используется до ее определения. Это должно быть параметром функции?

4. @MaxFeinberg Эй, Макс, спасибо за твой комментарий! Я не думаю, что это параметр функции, но ваш комментарий побудил меня просмотреть исходный файл Colab и данные, которые у меня есть, и я, к сожалению, не совсем уверен, как настроить его с помощью моих данных

5. @MaxFeinberg Спасибо за ваш комментарий, Макс! Это в значительной степени привело меня к финишу, и я думаю, что у меня есть некоторые идеи о том, как исправить оставшиеся ошибки — я действительно ценю это, Макс, и ты действительно очень мне помог!

Ответ №1:

Объект представления необходимо создать перед циклом for, чтобы он обновлялся каждый цикл вместо перезаписи предыдущей версии. Итак, следующий код

  for file in pdb_files:      
        view = py3Dmol.view(js='https://3dmol.org/build/3Dmol.js',)
        view.addModel(open(file,'r').read(),'pdb')
        ...
 

будет выглядеть примерно так, как показано ниже.

  
 view = py3Dmol.view(js='https://3dmol.org/build/3Dmol.js')
 for file in pdb_files:
        view.addModel(open(file,'r').read(),'pdb')
        ...
 

И вам нужно присвоить значение переменной homooligomer до ее последующего использования в коде.

  elif color == "chain":
            for n,chain,color in zip(range(homooligomer),list("ABCDEFGH"),
                             ["lime","cyan","magenta","yellow","salmon","white","blue","orange"]):
                view.setStyle({'chain':chain},{'cartoon': {'color':color}})