Задача: найти в базе белок, удовлетворяющий всем требованиям. Для этого напишем код, состоящий из нескольких смысловых блоков.
Устанавливаем необходимые пакеты
!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