Part 1: Search API¶

Text search¶

In [2]:
from rcsbapi.search import TextQuery

query = TextQuery(value="Hemoglobin")
results = list(query())

print(f"Found {len(results)} entries")
print(results[:10])
Found 8960 entries
['3GOU', '6IHX', '2PGH', '9JYU', '9RXG', '3PEL', '3PI9', '3PIA', '1FSX', '1QPW']

Attribute search¶

In [16]:
from rcsbapi.search import AttributeQuery

query = AttributeQuery(
    attribute="rcsb_entity_source_organism.scientific_name",
    operator="exact_match",
    value="Homo sapiens"
)

results = list(query())
print(f"Found {len(results)} entries")
print(results[:10])
Found 79453 entries
['10AD', '10DC', '10DJ', '10FT', '10GH', '10GS', '10IJ', '10IK', '10JT', '10KR']
In [18]:
from rcsbapi.search import search_attributes as attrs
query = attrs.rcsb_entity_source_organism.scientific_name == "Homo sapiens"
results = list(query())
print(f"Found {len(results)} entries")
print(results[:10])
Found 79453 entries
['10AD', '10DC', '10DJ', '10FT', '10GH', '10GS', '10IJ', '10IK', '10JT', '10KR']

Combining queries¶

In [20]:
from rcsbapi.search import TextQuery
from rcsbapi.search import search_attributes as attrs

q1 = TextQuery(value="Hemoglobin")
q2 = attrs.rcsb_entity_source_organism.scientific_name == "Homo sapiens"

query = q1 & q2
results = list(query())

print(f"Found {len(results)} entries")
print(results[:10])
Found 1633 entries
['1SHR', '1I3D', '1SI4', '1FDH', '1Y01', '1JEB', '1I3E', '1W0B', '1Z8U', '7QU4']

Part 2: Data API¶

Example 1: get the experimental method for one structure¶

In [4]:
from rcsbapi.data import DataQuery

query = DataQuery(
    input_type="entries",
    input_ids=["4HHB"],
    return_data_list=["exptl.method"]
)

result = query.exec()
result
Out[4]:
{'data': {'entries': [{'rcsb_id': '4HHB',
    'exptl': [{'method': 'X-RAY DIFFRACTION'}]}]}}
In [8]:
result['data']['entries'][0]['rcsb_id']
Out[8]:
'4HHB'

Example 2: retrieve more than one field¶

In [23]:
from rcsbapi.data import DataQuery

query = DataQuery(
    input_type="entries",
    input_ids=["4HHB"],
    return_data_list=["rcsb_id", "struct.title", "exptl.method"]
)

result = query.exec()
result
Out[23]:
{'data': {'entries': [{'rcsb_id': '4HHB',
    'struct': {'title': 'THE CRYSTAL STRUCTURE OF HUMAN DEOXYHAEMOGLOBIN AT 1.74 ANGSTROMS RESOLUTION'},
    'exptl': [{'method': 'X-RAY DIFFRACTION'}]}]}}

Example 3: request data for multiple entries¶

In [9]:
from rcsbapi.data import DataQuery

query = DataQuery(
    input_type="entries",
    input_ids=["4HHB", "1CRN"],
    return_data_list=["rcsb_id", "struct.title"]
)

result = query.exec()
result
Out[9]:
{'data': {'entries': [{'rcsb_id': '4HHB',
    'struct': {'title': 'THE CRYSTAL STRUCTURE OF HUMAN DEOXYHAEMOGLOBIN AT 1.74 ANGSTROMS RESOLUTION'}},
   {'rcsb_id': '1CRN',
    'struct': {'title': 'WATER STRUCTURE OF A HYDROPHOBIC PROTEIN AT ATOMIC RESOLUTION. PENTAGON RINGS OF WATER MOLECULES IN CRYSTALS OF CRAMBIN'}}]}}
In [14]:
result['data']['entries'][1]['rcsb_id']
Out[14]:
'1CRN'
In [1]:
from rcsbapi.search import TextQuery
from rcsbapi.search import search_attributes as attrs
from rcsbapi.data import DataQuery


def unique_keep_order(items):
    seen = set()
    out = []
    for x in items:
        if x not in seen:
            seen.add(x)
            out.append(x)
    return out


# Step 1: repeat Exercise 4
q1 = TextQuery(value="kinase")
q2 = attrs.rcsb_entity_source_organism.scientific_name == "Homo sapiens"
query = q1 & q2

pdb_ids = list(query())[:10]
print("10 PDB IDs:")
print(pdb_ids)


# Step 2: build the final dictionary
resulting_dictionary = {}

for pdb_id in pdb_ids:
    pdb_id = pdb_id.upper()

    # Get assembly IDs and polymer entity IDs for this entry
    entry_query = DataQuery(
        input_type="entries",
        input_ids=[pdb_id],
        return_data_list=[
            "rcsb_entry_container_identifiers.assembly_ids",
            "rcsb_entry_container_identifiers.polymer_entity_ids",
        ],
    )
    entry_result = entry_query.exec()
    entry_data = entry_result["data"]["entries"][0]

    assembly_ids = entry_data["rcsb_entry_container_identifiers"].get("assembly_ids", [])
    polymer_entity_ids = entry_data["rcsb_entry_container_identifiers"].get("polymer_entity_ids", [])

    # Build chain -> UniProt mapping
    chain_to_uniprot = {}

    for entity_id in polymer_entity_ids:
        polymer_entity_query = DataQuery(
            input_type="polymer_entities",
            input_ids=[f"{pdb_id}_{entity_id}"],
            return_data_list=[
                "rcsb_polymer_entity_container_identifiers.asym_ids",
                "rcsb_polymer_entity_container_identifiers.uniprot_ids",
            ],
        )
        polymer_entity_result = polymer_entity_query.exec()
        polymer_entity_data = polymer_entity_result["data"]["polymer_entities"][0]

        container = polymer_entity_data["rcsb_polymer_entity_container_identifiers"]
        asym_ids = container.get("asym_ids", [])
        uniprot_ids = container.get("uniprot_ids", [])

        if len(uniprot_ids) == 0:
            uniprot_value = None
        elif len(uniprot_ids) == 1:
            uniprot_value = uniprot_ids[0]
        else:
            uniprot_value = uniprot_ids

        for asym_id in asym_ids:
            chain_to_uniprot[asym_id] = uniprot_value

    # Build bas -> chain -> UniProt
    resulting_dictionary[pdb_id] = {}

    for assembly_id in assembly_ids:
        assembly_query = DataQuery(
            input_type="assemblies",
            input_ids=[f"{pdb_id}-{assembly_id}"],
            return_data_list=[
                "rcsb_assembly_container_identifiers.assembly_id",
                "pdbx_struct_assembly_gen.asym_id_list",
            ],
        )
        assembly_result = assembly_query.exec()
        assembly_data = assembly_result["data"]["assemblies"][0]

        assembly_gen = assembly_data.get("pdbx_struct_assembly_gen", [])

        asym_ids_in_assembly = []
        for item in assembly_gen:
            asym_ids_in_assembly.extend(item.get("asym_id_list", []))

        asym_ids_in_assembly = unique_keep_order(asym_ids_in_assembly)

        bas_key = f"bas_{assembly_id}"
        resulting_dictionary[pdb_id][bas_key] = {}

        for asym_id in asym_ids_in_assembly:
            if asym_id in chain_to_uniprot:
                resulting_dictionary[pdb_id][bas_key][f"chain {asym_id}"] = chain_to_uniprot[asym_id]

print(resulting_dictionary)
10 PDB IDs:
['1QK1', '1I0E', '4O75', '5J5T', '2CU1', '4UY9', '9P6A', '3DTC', '4IDT', '5K28']
{'1QK1': {'bas_1': {'chain A': 'P12532', 'chain B': 'P12532', 'chain C': 'P12532', 'chain D': 'P12532', 'chain E': 'P12532', 'chain F': 'P12532', 'chain G': 'P12532', 'chain H': 'P12532'}}, '1I0E': {'bas_1': {'chain A': 'P06732'}, 'bas_2': {'chain B': 'P06732'}, 'bas_3': {'chain C': 'P06732', 'chain D': 'P06732'}, 'bas_4': {'chain C': 'P06732', 'chain D': 'P06732'}}, '4O75': {'bas_1': {'chain A': 'O60885'}}, '5J5T': {'bas_1': {'chain A': 'Q8IVH8'}}, '2CU1': {'bas_1': {'chain A': 'Q9Y2U5'}}, '4UY9': {'bas_1': {'chain A': 'P80192', 'chain B': 'P80192'}}, '9P6A': {'bas_1': {'chain A': 'Q9Y2U5'}, 'bas_2': {'chain B': 'Q9Y2U5'}}, '3DTC': {'bas_1': {'chain A': 'P80192'}}, '4IDT': {'bas_1': {'chain A': 'Q99558', 'chain B': 'Q99558'}}, '5K28': {'bas_1': {'chain A': 'Q16584'}, 'bas_2': {'chain B': 'Q16584'}}}
In [2]:
resulting_dictionary
Out[2]:
{'1QK1': {'bas_1': {'chain A': 'P12532',
   'chain B': 'P12532',
   'chain C': 'P12532',
   'chain D': 'P12532',
   'chain E': 'P12532',
   'chain F': 'P12532',
   'chain G': 'P12532',
   'chain H': 'P12532'}},
 '1I0E': {'bas_1': {'chain A': 'P06732'},
  'bas_2': {'chain B': 'P06732'},
  'bas_3': {'chain C': 'P06732', 'chain D': 'P06732'},
  'bas_4': {'chain C': 'P06732', 'chain D': 'P06732'}},
 '4O75': {'bas_1': {'chain A': 'O60885'}},
 '5J5T': {'bas_1': {'chain A': 'Q8IVH8'}},
 '2CU1': {'bas_1': {'chain A': 'Q9Y2U5'}},
 '4UY9': {'bas_1': {'chain A': 'P80192', 'chain B': 'P80192'}},
 '9P6A': {'bas_1': {'chain A': 'Q9Y2U5'}, 'bas_2': {'chain B': 'Q9Y2U5'}},
 '3DTC': {'bas_1': {'chain A': 'P80192'}},
 '4IDT': {'bas_1': {'chain A': 'Q99558', 'chain B': 'Q99558'}},
 '5K28': {'bas_1': {'chain A': 'Q16584'}, 'bas_2': {'chain B': 'Q16584'}}}