Задача: найти в базе белок, удовлетворяющий всем требованиям. Для этого напишем код, состоящий из нескольких смысловых блоков.
Устанавливаем необходимые пакеты
!pip install nglview --user
Ниже описание запроса, по которому мы ищем нужный белок
import nglview as nv
import requests
import json
#заготовка
my_query = {
"query": {
"type": "group",
"logical_operator": "and",
"nodes": []
},
"return_type": "entry"
}
#ключевые значения
keyword_clause = {
"type": "terminal",
"service": "full_text",
"parameters": {
"value": "diclofenac"
}
}
my_query["query"]["nodes"].append(keyword_clause)
#разрешение не хуже
resolution_clause = {
"type": "terminal",
"service": "text",
"parameters": {
"value": 2.0,
"attribute": "rcsb_entry_info.resolution_combined",
"operator": "less_or_equal"
}
}
my_query["query"]["nodes"].append(resolution_clause)
#количество лигандов
has_ligand_clause = {
"type": "terminal",
"service": "text",
"parameters": {
"attribute": "rcsb_entry_info.nonpolymer_entity_count",
"value": 0,
"operator": "greater"
}
}
my_query["query"]["nodes"].append(has_ligand_clause)
#дата
date_range_clause = {
"type": "terminal",
"service": "text",
"parameters": {
"attribute": "rcsb_accession_info.initial_release_date",
"value": {
"from": "2015-01-01",
"to": "2020-01-01",
},
"operator": "range"
}
}
my_query["query"]["nodes"].append(date_range_clause)
#запрос
rcsb = 'https://search.rcsb.org/rcsbsearch/v1/query'
json_query = json.dumps(my_query)
search = requests.post(f'{rcsb}', data=json_query)
search
<Response [200]>
Распаковываем данные, полученные по запросу выше
#распаковка
search_result = search.json()
search_result
{'query_id': '9c8b6563-efe5-4b35-8c26-a4de223fa14c', 'result_type': 'entry', 'total_count': 21, 'result_set': [{'identifier': '6HN1', 'score': 1.0, 'services': [{'service_type': 'full_text', 'nodes': [{'node_id': 25915, 'original_score': 16.1635799407959, 'norm_score': 1.0}]}, {'service_type': 'text', 'nodes': [{'node_id': 25970, 'original_score': 1.0, 'norm_score': 1.0}, {'node_id': 695, 'original_score': 1.0, 'norm_score': 1.0}, {'node_id': 18477, 'original_score': 1.0, 'norm_score': 1.0}]}]}, {'identifier': '4ZBQ', 'score': 0.9997871559193459, 'services': [{'service_type': 'full_text', 'nodes': [{'node_id': 25915, 'original_score': 16.151243209838867, 'norm_score': 0.9991486236773837}]}, {'service_type': 'text', 'nodes': [{'node_id': 25970, 'original_score': 1.0, 'norm_score': 1.0}, {'node_id': 695, 'original_score': 1.0, 'norm_score': 1.0}, {'node_id': 18477, 'original_score': 1.0, 'norm_score': 1.0}]}]}, {'identifier': '5DYZ', 'score': 0.9487387836467562, 'services': [{'service_type': 'full_text', 'nodes': [{'node_id': 25915, 'original_score': 13.192410469055176, 'norm_score': 0.7949551345870249}]}, {'service_type': 'text', 'nodes': [{'node_id': 25970, 'original_score': 1.0, 'norm_score': 1.0}, {'node_id': 695, 'original_score': 1.0, 'norm_score': 1.0}, {'node_id': 18477, 'original_score': 1.0, 'norm_score': 1.0}]}]}, {'identifier': '6GK5', 'score': 0.8656512729412058, 'services': [{'service_type': 'full_text', 'nodes': [{'node_id': 25915, 'original_score': 8.376545906066895, 'norm_score': 0.46260509176482295}]}, {'service_type': 'text', 'nodes': [{'node_id': 25970, 'original_score': 1.0, 'norm_score': 1.0}, {'node_id': 695, 'original_score': 1.0, 'norm_score': 1.0}, {'node_id': 18477, 'original_score': 1.0, 'norm_score': 1.0}]}]}, {'identifier': '6GK6', 'score': 0.8656512729412058, 'services': [{'service_type': 'full_text', 'nodes': [{'node_id': 25915, 'original_score': 8.376545906066895, 'norm_score': 0.46260509176482295}]}, {'service_type': 'text', 'nodes': [{'node_id': 25970, 'original_score': 1.0, 'norm_score': 1.0}, {'node_id': 695, 'original_score': 1.0, 'norm_score': 1.0}, {'node_id': 18477, 'original_score': 1.0, 'norm_score': 1.0}]}]}, {'identifier': '5U16', 'score': 0.8486690268622524, 'services': [{'service_type': 'full_text', 'nodes': [{'node_id': 25915, 'original_score': 7.3922319412231445, 'norm_score': 0.3946761074490097}]}, {'service_type': 'text', 'nodes': [{'node_id': 25970, 'original_score': 1.0, 'norm_score': 1.0}, {'node_id': 695, 'original_score': 1.0, 'norm_score': 1.0}, {'node_id': 18477, 'original_score': 1.0, 'norm_score': 1.0}]}]}, {'identifier': '5U6Q', 'score': 0.8486690268622524, 'services': [{'service_type': 'full_text', 'nodes': [{'node_id': 25915, 'original_score': 7.3922319412231445, 'norm_score': 0.3946761074490097}]}, {'service_type': 'text', 'nodes': [{'node_id': 25970, 'original_score': 1.0, 'norm_score': 1.0}, {'node_id': 695, 'original_score': 1.0, 'norm_score': 1.0}, {'node_id': 18477, 'original_score': 1.0, 'norm_score': 1.0}]}]}, {'identifier': '5NY7', 'score': 0.8249844957500618, 'services': [{'service_type': 'full_text', 'nodes': [{'node_id': 25915, 'original_score': 6.019444465637207, 'norm_score': 0.29993798300024727}]}, {'service_type': 'text', 'nodes': [{'node_id': 25970, 'original_score': 1.0, 'norm_score': 1.0}, {'node_id': 695, 'original_score': 1.0, 'norm_score': 1.0}, {'node_id': 18477, 'original_score': 1.0, 'norm_score': 1.0}]}]}, {'identifier': '4YP2', 'score': 0.8206751270762747, 'services': [{'service_type': 'full_text', 'nodes': [{'node_id': 25915, 'original_score': 5.769667625427246, 'norm_score': 0.28270050830509835}]}, {'service_type': 'text', 'nodes': [{'node_id': 25970, 'original_score': 1.0, 'norm_score': 1.0}, {'node_id': 695, 'original_score': 1.0, 'norm_score': 1.0}, {'node_id': 18477, 'original_score': 1.0, 'norm_score': 1.0}]}]}, {'identifier': '5WQP', 'score': 0.8206751270762747, 'services': [{'service_type': 'full_text', 'nodes': [{'node_id': 25915, 'original_score': 5.769667625427246, 'norm_score': 0.28270050830509835}]}, {'service_type': 'text', 'nodes': [{'node_id': 25970, 'original_score': 1.0, 'norm_score': 1.0}, {'node_id': 695, 'original_score': 1.0, 'norm_score': 1.0}, {'node_id': 18477, 'original_score': 1.0, 'norm_score': 1.0}]}]}]}
Из всех подходящих белков выбираем самый запрашиваемый (популярный) и дальше работаем с ним
#лучшая находка
best_hit = search_result["result_set"][0]
best_hit
{'identifier': '6HN1', 'score': 1.0, 'services': [{'service_type': 'full_text', 'nodes': [{'node_id': 25915, 'original_score': 16.1635799407959, 'norm_score': 1.0}]}, {'service_type': 'text', 'nodes': [{'node_id': 25970, 'original_score': 1.0, 'norm_score': 1.0}, {'node_id': 695, 'original_score': 1.0, 'norm_score': 1.0}, {'node_id': 18477, 'original_score': 1.0, 'norm_score': 1.0}]}]}
С помощью кода ниже выведем модель нужного белка, взятую из базы
#визуализация
view = nv.show_pdbid('6hn1')
view
По нашему вопросу самым популярным был белковый комплекс сывороточного альбумина коз с диклофенаком. Идентификатор: 6HN1
6HN1 это транспортный белок у Capra hircus.
В общем случае сывороточный альбумин составляет основную часть сывороточных белков, синтезируется в печени и содержится в сыворотке крови. В функции альбуминов входит поддержание коллоидно-осмотического давления и транспорт различных веществ.
Диклофенак (ключевое слово поиска) – это производное фенилуксусной кислоты, в медицине используется как нестероидное противовоспалительное вещество. Оказывает выраженное противовоспалительное и анальгезирующее действие. По экспериментальным данным из всех белков плазмы лучше всего связывается именно с различными альбуминами.
На странице белка в PDB также есть статья на тему структурного исследования связи диклофенака с сыворочным альбумином.
Ниже представлен код, выводящий три различных отображения белка 6HN1
#отображения
from ipywidgets import interact, fixed
my_examples = {
'Example 4': {
'description': '''
Белок в виде cartoon, покраска по типу вторичной структуры
Боковые радикалы покрашены по элементу, показаны линиями
Боковые радикалы ароматических аминокислот показаны в стержневой модели
Лиганды показаны в виде Ван-дер-Ваальсовых сфер, покрашены по гидрофобности
''',
'representations': [
{
'type': 'cartoon',
'params': {
'sele': 'protein',
'color': 'sstruc'
}
},
{
'type': 'line',
'params': {
'sele': 'sidechain',
'color': 'element'
}
},
{
'type': 'licorice',
'params': {
'sele': 'sidechain and aromatic',
'color': 'element'
}
},
{
'type': 'spacefill',
'params': {
'sele': 'ligand',
'color': 'hydrophobicity'
}
},
],
},
'Example 5': {
'description': '''
Белок в виде tube, покраска по типу вторичной структуры
Боковые радикалы в стержневой модели, покрашены по гидрофобности
Лиганды показаны линиями, покрашены по элементам
Вода и ионы показаны в виде Ван-дер-Ваальсовых сфер
''',
'representations': [
{
'type': 'tube',
'params': {
'sele': 'protein',
'color': 'sstruc'
}
},
{
'type': 'licorice',
'params': {
'sele': 'sidechain',
'color': 'hydrophobicity'
}
},
{
'type': 'line',
'params': {
'sele': 'ligand',
'color': 'element'
}
},
{
'type': 'spacefill',
'params': {
'sele': 'ion and water',
'color': 'element'
}
},
],
},
'Example 6': {
'description': '''
Белок в виде cartoon темно-серого цвета
Боковые радикалы в виде линий светло-серого цвета
Боковые радикалы полярных аминокислот в виде hyperball, покрашены по элементам
Лиганды в шаростержневой модели, покрашены по элементам, углероды покрашены в темно-синий
''',
'representations': [
{
'type': 'cartoon',
'params': {
'sele': 'backbone',
'color': 'darkgray'
}
},
{
'type': 'line',
'params': {
'sele': 'sidechain',
'color': 'lightgray'
}
},
{
'type': 'hyperball',
'params': {
'sele': 'sidechain and polar',
'color': 'element'
}
},
{
'type': 'ball+stick',
'params': {
'sele': 'ligand',
'color': 'element'
}
},
{
'type': 'ball+stick',
'params': {
'sele': 'ligand and _C',
'color': 'darkblue'
}
},
],
},
}
def show_examples(view, example_name):
view.clear()
example = my_examples[example_name]
print(example['description'])
view.set_representations(example['representations'])
view.center()
view = nv.show_pdbid("6HN1", default_representation=False)
interact(show_examples, view=fixed(view), example_name=list(my_examples.keys()))
view