From 56b2d1319ef2f62a9251a2c1dfa87f9b6b60ba37 Mon Sep 17 00:00:00 2001 From: yusuf1759 Date: Thu, 26 Sep 2024 02:10:54 -0400 Subject: [PATCH 01/16] feat: add apo features --- docs/examples/3_access_system_files.ipynb | 233 ++++++++++++++++++++-- src/plinder/core/loader/dataset.py | 21 +- src/plinder/core/loader/featurizer.py | 169 +++++++++++----- src/plinder/core/loader/utils.py | 89 ++++----- src/plinder/core/structure/atoms.py | 15 +- src/plinder/core/structure/structure.py | 6 +- src/plinder/core/structure/vendored.py | 3 +- src/plinder/core/utils/constants.py | 1 + 8 files changed, 397 insertions(+), 140 deletions(-) diff --git a/docs/examples/3_access_system_files.ipynb b/docs/examples/3_access_system_files.ipynb index 227d0a02..9c3451a6 100644 --- a/docs/examples/3_access_system_files.ipynb +++ b/docs/examples/3_access_system_files.ipynb @@ -16,7 +16,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -36,9 +36,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-09-25 21:58:17,520 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-09-25 21:58:17,521 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n" + ] + }, + { + "data": { + "text/plain": [ + "{'1.W': '/Users/yusuf/.local/share/plinder/2024-06/v2/systems/4agi__1__1.C__1.W/ligand_files/1.W.sdf'}" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "plinder_system.ligand_sdfs" ] @@ -52,9 +71,31 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-09-25 21:58:18,231 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.57s\n", + "2024-09-25 21:58:18,317 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.08s\n", + "2024-09-25 21:58:18,317 | plinder.core.index.utils:148 | INFO : loading entries from 1 zips\n", + "2024-09-25 21:58:18,323 | plinder.core.index.utils:163 | INFO : loaded 1 entries\n", + "2024-09-25 21:58:18,324 | plinder.core.index.utils.load_entries:24 | INFO : runtime succeeded: 0.77s\n" + ] + }, + { + "data": { + "text/plain": [ + "{'1.W': 'C[Se][C@@H]1O[C@@H](C)[C@@H](O)[C@@H](O)[C@@H]1O'}" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "plinder_system.smiles" ] @@ -75,9 +116,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "('/Users/yusuf/.local/share/plinder/2024-06/v2/systems/4agi__1__1.C__1.W/receptor.pdb',\n", + " '/Users/yusuf/.local/share/plinder/2024-06/v2/systems/4agi__1__1.C__1.W/receptor.cif')" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "plinder_system.receptor_pdb, plinder_system.receptor_cif" ] @@ -91,9 +144,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "{'1.C': 'A'}" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "plinder_system.chain_mapping" ] @@ -107,9 +171,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "('/Users/yusuf/.local/share/plinder/2024-06/v2/systems/4agi__1__1.C__1.W/sequences.fasta',\n", + " {'1.C': 'MSTPGAQQVLFRTGIAAVNSTNHLRVYFQDVYGSIRESLYEGSWANGTEKNVIGNAKLGSPVAATSKELKHIRVYTLTEGNTLQEFAYDSGTGWYNGGLGGAKFQVAPYSXIAAVFLAGTDALQLRIYAQKPDNTIQEYMWNGDGWKEGTNLGGALPGTGIGATSFRYTDYNGPSIRIWFQTDDLKLVQRAYDPHKGWYPDLVTIFDRAPPRTAIAATSFGAGNSSIYMRIYFVNSDNTIWQVCWDHGKGYHDKGTITPVIQGSEVAIISWGSFANNGPDLRLYFQNGTYISAVSEWVWNRAHGSQLGRSALPPA'})" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "plinder_system.sequences_fasta, plinder_system.sequences" ] @@ -127,18 +203,145 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-09-25 21:58:20,579 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 2.01s\n", + "2024-09-25 21:58:20,962 | plinder.core.scores.links.query_links:24 | INFO : runtime succeeded: 2.54s\n" + ] + } + ], "source": [ "link_info = plinder_system.linked_structures" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idpocket_fidentlddtbb_lddtlddt_lp_avelddt_pli_avebisy_rmsd_avesort_scorekind
04uou_B100.00.9726820.9940650.9878130.9897770.1597022.40apo
14uou_C100.00.9735620.9946870.9672870.9510680.1942332.40apo
24uou_D100.00.9736040.9942350.9725790.9730480.1012522.40apo
34uou_A100.00.9672570.9948000.9769080.9635040.2142432.40apo
4Q4WW81_A100.00.9822750.9985870.9996790.9972730.12622898.57pred
\n", + "
" + ], + "text/plain": [ + " id pocket_fident lddt bb_lddt lddt_lp_ave lddt_pli_ave \\\n", + "0 4uou_B 100.0 0.972682 0.994065 0.987813 0.989777 \n", + "1 4uou_C 100.0 0.973562 0.994687 0.967287 0.951068 \n", + "2 4uou_D 100.0 0.973604 0.994235 0.972579 0.973048 \n", + "3 4uou_A 100.0 0.967257 0.994800 0.976908 0.963504 \n", + "4 Q4WW81_A 100.0 0.982275 0.998587 0.999679 0.997273 \n", + "\n", + " bisy_rmsd_ave sort_score kind \n", + "0 0.159702 2.40 apo \n", + "1 0.194233 2.40 apo \n", + "2 0.101252 2.40 apo \n", + "3 0.214243 2.40 apo \n", + "4 0.126228 98.57 pred " + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "link_info[\n", " [\n", diff --git a/src/plinder/core/loader/dataset.py b/src/plinder/core/loader/dataset.py index 7e1bfc12..2dd4ef5a 100644 --- a/src/plinder/core/loader/dataset.py +++ b/src/plinder/core/loader/dataset.py @@ -9,7 +9,7 @@ from torch.utils.data import DataLoader, Dataset from plinder.core.index.system import PlinderSystem -from plinder.core.loader.featurizer import structure_featurizer +from plinder.core.loader.featurizer import system_featurizer from plinder.core.loader.utils import collate_batch from plinder.core.scores import query_index from plinder.core.scores.query import FILTERS @@ -32,8 +32,8 @@ class PlinderDataset(Dataset): # type: ignore use_alternate_structures: bool, default=True Whether to load alternate structures featurizer: Callable[ - [Structure, int], dict[str, torch.Tensor] - ] = structure_featurizer, + [PlinderSystem, int], dict[str, dict[str, torch.Tensor]] + ] = system_featurizer, Transformation to turn structure to input tensors """ @@ -43,8 +43,9 @@ def __init__( filters: FILTERS = None, use_alternate_structures: bool = True, featurizer: Callable[ - [Structure], torch.Tensor | dict[str, torch.Tensor] - ] = structure_featurizer, + [PlinderSystem, int, bool], + torch.Tensor | dict[str, dict[str, torch.Tensor]], + ] = system_featurizer, **kwargs: Any, ): index = query_index(splits=[split], filters=filters) @@ -68,14 +69,14 @@ def __getitem__( holo_structure = s.holo_structure features_and_coords = None if self._featurizer is not None: - features_and_coords = self._featurizer(holo_structure) + features_and_coords = self._featurizer( + s, + featurize_apo=self._use_alternate_structures, # type: ignore + ) item: dict[str, Any] = { "system_id": holo_structure.id, - "holo_structure": holo_structure, - "alternate_structures": s.alternate_structures - if self._use_alternate_structures - else {}, + "plinder_system": s, "features_and_coords": features_and_coords, "path": s.system_cif, } diff --git a/src/plinder/core/loader/featurizer.py b/src/plinder/core/loader/featurizer.py index aedb337c..0ee8a548 100644 --- a/src/plinder/core/loader/featurizer.py +++ b/src/plinder/core/loader/featurizer.py @@ -2,66 +2,121 @@ import torch +from plinder.core.index.system import PlinderSystem from plinder.core.loader.utils import pad_and_stack from plinder.core.structure.atoms import ( _one_hot_encode_stack, - _stack_atom_array_features, _stack_ligand_feat, ) from plinder.core.structure.diffdock_utils import lig_atom_featurizer -from plinder.core.structure.structure import Structure from plinder.core.utils import constants as pc -def structure_featurizer(structure: Structure, pad_value: int = -100) -> dict[str, Any]: +def system_featurizer( + system: PlinderSystem, pad_value: int = -100, featurize_apo: bool = True +) -> dict[str, Any]: + # Load holo and alternate (apo and pred) structures + holo_structure = system.holo_structure + apo_structures = system.alternate_structures + # This must be used to order the chain features - protein_chain_order = structure.protein_chain_ordered - ligand_chain_order = structure.ligand_chain_ordered - protein_atom_array = structure.protein_atom_array - sequence_atom_mask_stacked = structure.sequence_atom_mask - input_sequence_residue_mask_stacked = structure.input_sequence_residue_mask_stacked - protein_coordinates_stacked = structure.protein_coords - protein_calpha_coordinates_stacked = structure.protein_calpha_coords - input_ligand_templates = ( - structure.input_ligand_templates - ) # 2D templates from SMILES - # input_ligand_conformers = structure.input_ligand_conformers # not needed as features are assigned from 2D - input_ligand_conformers_coords = ( - structure.input_ligand_conformers_coords - ) # 3D (random) conformer - resolved_ligand_mols_coords = structure.resolved_ligand_mols_coords + protein_chain_order = holo_structure.protein_chain_ordered + ligand_chain_order = holo_structure.ligand_chain_ordered - # Sequence atom-level features - input_sequence_full_atom_feat = structure.input_sequence_full_atom_feat + # Extract holo chain id + assert holo_structure.protein_sequence is not None + holo_chain = list(holo_structure.protein_sequence.keys())[0] - # Featurize and sort in input structure order + # Get input sequence dictionary + input_sequences = holo_structure.protein_sequence + # Get residue-level features and sort in input structure order + input_sequence_residue_feat_stack = _one_hot_encode_stack( + [input_sequences[ch] for ch in protein_chain_order], pc.AA_TO_INDEX, "UNK" + ) + # Get atom-level features and sort in input structure order + input_sequence_full_atom_dict = holo_structure.input_sequence_full_atom_dict input_sequence_full_atom_feat_stack = _one_hot_encode_stack( - [input_sequence_full_atom_feat[ch] for ch in protein_chain_order], + [input_sequence_full_atom_dict[ch] for ch in protein_chain_order], pc.ELE2NUM, "other", ) - # Get residue type feature - protein_structure_residue_type_arr = _stack_atom_array_features( - protein_atom_array, "res_name", protein_chain_order + sequence_features = { + "input_sequence_residue_feat_stack": input_sequence_residue_feat_stack, + "input_sequence_full_atom_feat_stack": input_sequence_full_atom_feat_stack, + } + + # Get holo structure to input sequence atom + holo_sequence_atom_mask_stacked = holo_structure.sequence_atom_mask + # Get holo structure to input sequence atom + holo_input_sequence_residue_mask_stacked = ( + holo_structure.input_sequence_residue_mask_stacked ) - protein_structure_residue_type_stack = [ - feat - for feat in _one_hot_encode_stack( - protein_structure_residue_type_arr, pc.AA_TO_INDEX, "UNK" - ) - ] - # TODO: Fix issues with ligands conformer generation - # Featurize and stack ligand chains - # VO: try passing the 2D - does not need a conformer! - input_conformer_ligand_feat = { + # Get holo structure coordinates + holo_protein_coordinates_stacked = holo_structure.protein_coords + # Get holo calpha coordinates + holo_protein_calpha_coordinates_stacked = holo_structure.protein_calpha_coords + + # Bundle holo features into a dictionary + holo_features = { + "holo_sequence_atom_mask_stacked": holo_sequence_atom_mask_stacked, + "holo_input_sequence_residue_mask_stacked": holo_input_sequence_residue_mask_stacked, + "holo_protein_coordinates_stacked": holo_protein_coordinates_stacked, + "holo_protein_calpha_coordinates_stacked": holo_protein_calpha_coordinates_stacked, + } + + # Apo features + # Note: Since there are multiple apo/pred structures linked to a holo structure, we will + # stack all of them and let users choose how the want to use it + if featurize_apo: + all_apo_protein_atom_arrays = [] + all_apo_sequence_atom_masks_stacked = [] + all_apo_input_sequence_residue_masks_stacked = [] + all_apo_protein_coordinates_arrays_stacked = [] + all_apo_protein_calpha_coordinates_arrays_stacked = [] + for apo_id, apo_structure in apo_structures.items(): + apo_structure.set_chain(holo_chain) + all_apo_protein_atom_arrays.append(apo_structure.protein_atom_array) + all_apo_sequence_atom_masks_stacked.append(apo_structure.sequence_atom_mask) + all_apo_input_sequence_residue_masks_stacked.append( + apo_structure.input_sequence_residue_mask_stacked + ) + all_apo_protein_coordinates_arrays_stacked.append( + apo_structure.protein_coords + ) + all_apo_protein_calpha_coordinates_arrays_stacked.append( + apo_structure.protein_calpha_coords + ) + all_apo_features = { + "all_apo_sequence_atom_masks_stacked": all_apo_sequence_atom_masks_stacked, + "all_apo_input_sequence_residue_masks_stacked": all_apo_input_sequence_residue_masks_stacked, + "all_apo_protein_coordinates_arrays_stacked": all_apo_protein_coordinates_arrays_stacked, + "all_apo_protein_calpha_coordinates_arrays_stacked": all_apo_protein_calpha_coordinates_arrays_stacked, + } + else: + all_apo_features = { + "all_apo_sequence_atom_masks_stacked": [], + "all_apo_input_sequence_residue_masks_stacked": [], + "all_apo_protein_coordinates_arrays_stacked": [], + "all_apo_protein_calpha_coordinates_arrays_stacked": [], + } + # Ligand features + input_ligand_templates = ( + holo_structure.input_ligand_templates + ) # 2D templates from SMILES + + input_ligand_conformers_coords = ( + holo_structure.input_ligand_conformers_coords + ) # 3D (random) conformer + resolved_ligand_mols_coords = holo_structure.resolved_ligand_mols_coords + + input_ligand_feat = { ch: lig_atom_featurizer(ligand_mol) for ch, ligand_mol in input_ligand_templates.items() } # Stack in ligand_chain_order order - input_conformer_ligand_feat_stack = [ - feats - for feats in _stack_ligand_feat(input_conformer_ligand_feat, ligand_chain_order) + input_ligand_feat_stack = [ + feats for feats in _stack_ligand_feat(input_ligand_feat, ligand_chain_order) ] input_conformer_ligand_coords_stack = [ @@ -76,26 +131,34 @@ def structure_featurizer(structure: Structure, pad_value: int = -100) -> dict[st coord for coord in _stack_ligand_feat(resolved_ligand_mols_coords, ligand_chain_order) ] + ligand_features = { + "input_conformer_ligand_feat_stack": input_ligand_feat_stack, + "input_conformer_ligand_coords_stack": input_conformer_ligand_coords_stack, + "resolved_ligand_mols_coords_stack": resolved_ligand_mols_coords_stack, + } + features = { - "sequence_atom_mask_feature": sequence_atom_mask_stacked, - "input_sequence_residue_mask_feature": input_sequence_residue_mask_stacked, - "protein_coordinates": protein_coordinates_stacked, - "protein_calpha_coordinates": protein_calpha_coordinates_stacked, - "input_sequence_full_atom_feature": input_sequence_full_atom_feat_stack, - "protein_structure_residue_feature": protein_structure_residue_type_stack, - "input_conformer_ligand_feature": input_conformer_ligand_feat_stack, - "input_conformer_ligand_coordinates": input_conformer_ligand_coords_stack, - "resolved_ligand_mols_feature": resolved_ligand_mols_coords_stack, + "sequence_features": sequence_features, + "holo_features": holo_features, + "apo_features": all_apo_features, + "ligand_features": ligand_features, } # Pad tensors to make chains have equal length padded_features = { - feat_name: pad_and_stack( - [torch.tensor(feat_per_chain) for feat_per_chain in feat], - dim=0, - value=pad_value, - ) - for feat_name, feat in features.items() + feat_group_name: { + feat_name: ( + pad_and_stack( + [torch.tensor(feat_per_chain) for feat_per_chain in feat], + dim=0, + value=pad_value, + ) + if len(feat) != 0 + else [] + ) + for feat_name, feat in feat_dict.items() + } + for feat_group_name, feat_dict in features.items() } # Set features as new properties diff --git a/src/plinder/core/loader/utils.py b/src/plinder/core/loader/utils.py index 10dbd931..91fb7fdd 100644 --- a/src/plinder/core/loader/utils.py +++ b/src/plinder/core/loader/utils.py @@ -1,12 +1,11 @@ from __future__ import annotations -from pathlib import Path from typing import Sequence import torch from torch import Tensor -from plinder.core.structure.structure import Structure +from plinder.core.index.system import PlinderSystem PAD_VALUE = -100 @@ -113,97 +112,77 @@ def collate_complex( batch_features: list[dict[str, Tensor]], pad_value: int = PAD_VALUE, ) -> dict[str, Tensor]: - collated_and_padded_properties = {} + all_collated_and_padded_properties = {} batch_size = len(batch_features) - feature_names = batch_features[0].keys() - for feat_name in feature_names: - collated_properties = [] - for idx in range(batch_size): - feat = batch_features[idx][feat_name] - collated_properties.append(feat) - collated_and_padded_properties[feat_name] = pad_and_stack( - collated_properties, dim=0, value=pad_value - ) + feature_groups_and_names = {k: list(v.keys()) for k, v in batch_features[0].items()} + for feat_group, feature_names in feature_groups_and_names.items(): + collated_and_padded_properties = {} + for feat_name in feature_names: + collated_properties = [] + for idx in range(batch_size): + feat = batch_features[idx][feat_group][feat_name] + collated_properties.append(torch.tensor(feat)) + collated_and_padded_properties[feat_name] = pad_and_stack( + collated_properties, dim=0, value=pad_value + ) + all_collated_and_padded_properties[feat_group] = collated_and_padded_properties return collated_and_padded_properties def collate_batch( - batch: list[ - dict[ - str, - list[str] - | list[Structure] - | list[dict[str, dict[str, Structure]]] - | list[Path] - | list[dict[str, Tensor]], - ] - ], + batch: list[dict[str, str | PlinderSystem | dict[str, dict[str, Tensor]]]] ) -> dict[ str, - list[str] - | list[Structure] - | list[dict[str, dict[str, Structure]]] - | list[Path] - | list[dict[str, Tensor]], + list[str] | list[PlinderSystem] | list[dict[str, dict[str, Tensor]]], ]: """Collate a batch of PlinderDataset items into a merged mini-batch of Tensors. Used as the default collate_fn for the torch DataLoader consuming PlinderDataset. Parameters: - batch list[ + batch: list[ dict[ str, - list[str] - | list[Structure] - | list[dict[str, dict[str, Structure]]] - | list[Path] - | list[dict[str, Tensor]], - ] - ]: A list of dictionaries - containing the data for each item in the batch. + str + | PlinderSystem + | dict[str, dict[str, Tensor]] + | Path, + ], + ] + A list of dictionaries + containing the data for each item in the batch. Returns: dict[ str, - list[str] - | list[Structure] - | list[dict[str, dict[str, Structure]]] - | list[Path] - | list[dict[str, Tensor]] + | list[PlinderSystem] + | list[dict[str, dict[str, Tensor]]] + | list[Path]] A dictionary containing the merged items in the batch. """ system_ids: list[str] = [] - holo_structures: list[Structure] = [] - alternate_structures: list[dict[str, dict[str, Structure]]] = [] + plinder_system: list[PlinderSystem] = [] feature_and_coords: list[dict[str, Tensor]] = [] - paths: list[Path] = [] + paths: list[str] = [] for x in batch: assert isinstance(x["system_id"], str) - assert isinstance(x["holo_structure"], Structure) - assert isinstance(x["alternate_structures"], dict) + assert isinstance(x["plinder_system"], PlinderSystem) assert isinstance(x["features_and_coords"], dict) assert isinstance(x["path"], str) system_ids.append(x["system_id"]) - holo_structures.append(x["holo_structure"]) - alternate_structures.append(x["alternate_structures"]) + plinder_system.append(x["plinder_system"]) feature_and_coords.append(x["features_and_coords"]) paths.append(x["path"]) collated_batch: dict[ str, - list[str] - | list[Structure] - | list[dict[str, dict[str, Structure]]] - | list[Path] - | list[dict[str, Tensor]], + list[str] | list[PlinderSystem] | list[dict[str, dict[str, Tensor]]], ] = { "system_ids": system_ids, - "holo_structures": holo_structures, - "alternate_structures": alternate_structures, + "plinder_system": plinder_system, "paths": paths, "features_and_coords": collate_complex(feature_and_coords), # type: ignore } diff --git a/src/plinder/core/structure/atoms.py b/src/plinder/core/structure/atoms.py index 6bbf812e..168f3e55 100644 --- a/src/plinder/core/structure/atoms.py +++ b/src/plinder/core/structure/atoms.py @@ -325,12 +325,19 @@ def make_atom_mask( resolved_residue_start = 0 for seq_, mask in zip(seq_res_three_aa, seq_mask): if mask == 0: - atom_mask.append([0 for i in range(len(pc.ORDERED_AA_FULL_ATOM[seq_]))]) + atom_mask.append( + [ + 0 + for i in range( + len(pc.ORDERED_AA_FULL_ATOM.get(seq_, ["N", "CA", "C", "O"])) + ) + ] + ) else: resi, resn = residue_tuple[resolved_residue_start] atom_mask.append( get_per_residue_mask( - pc.ORDERED_AA_FULL_ATOM[resn], + pc.ORDERED_AA_FULL_ATOM.get(resn, ["N", "CA", "C", "O"]), get_per_residue_atoms(atom_array, resi, resn), ) ) @@ -383,7 +390,9 @@ def _sequence_full_atom_type_array( for chain, sequence in input_sequences.items(): feat = [] for res in sequence: - for atom in pc.ORDERED_AA_FULL_ATOM[pc.ONE_TO_THREE[res]]: + for atom in pc.ORDERED_AA_FULL_ATOM.get( + pc.ONE_TO_THREE[res], ["N", "CA", "C", "O"] + ): feat.append(_convert_pdb_atom_name_to_elem_symbol(atom)) seq_atom_dict[chain] = np.array(feat) return seq_atom_dict diff --git a/src/plinder/core/structure/structure.py b/src/plinder/core/structure/structure.py index 886d2a0f..a1c340c4 100644 --- a/src/plinder/core/structure/structure.py +++ b/src/plinder/core/structure/structure.py @@ -473,7 +473,7 @@ def protein_chain_ordered(self) -> list[str]: return chain_order @property - def input_sequence_full_atom_feat(self) -> dict[str, list[str]]: + def input_sequence_full_atom_dict(self) -> dict[str, list[str]]: """Resolved sequence full atom features.""" # TODO: do we want to keep this as assertion? # better if then raise? @@ -484,7 +484,9 @@ def input_sequence_full_atom_feat(self) -> dict[str, list[str]]: ch: [ atm for res in self.protein_sequence[ch] - for atm in pc.ORDERED_AA_FULL_ATOM[pc.ONE_TO_THREE[res]] + for atm in pc.ORDERED_AA_FULL_ATOM.get( + pc.ONE_TO_THREE[res], ["N", "CA", "C", "O"] + ) ] for ch in self.protein_chain_ordered } diff --git a/src/plinder/core/structure/vendored.py b/src/plinder/core/structure/vendored.py index ef4b7c3b..649105ff 100644 --- a/src/plinder/core/structure/vendored.py +++ b/src/plinder/core/structure/vendored.py @@ -889,11 +889,10 @@ def cif_to_pdb( model = pdbx.get_structure( pdbx_file, model=1, use_author_fields=False, extra_fields=["b_factor", "charge"] ) - # print(f"DEBUG: {cif_path} has {sorted(np.unique(model.chain_id))} chains") if chains is not None: mask = np.isin(model.chain_id, list(chains.keys())) if np.sum(mask) == 0: - print(f"WARNING: chains {list(chains.keys())} not found in {cif_path}") + log.warn(f"WARNING: chains {list(chains.keys())} not found in {cif_path}") return model = model[mask] model_orig = model.copy() diff --git a/src/plinder/core/utils/constants.py b/src/plinder/core/utils/constants.py index 99611d32..d6abee04 100644 --- a/src/plinder/core/utils/constants.py +++ b/src/plinder/core/utils/constants.py @@ -1088,6 +1088,7 @@ "OH", ], "VAL": ["N", "CA", "C", "O", "CB", "CG1", "CG2"], + "UNK": ["N", "CA", "C", "O"], } From 336ba7a5206b6c7400167d673235c503a62e9137 Mon Sep 17 00:00:00 2001 From: yusuf1759 Date: Mon, 30 Sep 2024 14:08:20 -0400 Subject: [PATCH 02/16] feat: add apo to holo mask --- docs/examples/5_dataset_and_loader.ipynb | 27 ++++++++- src/plinder/core/loader/featurizer.py | 71 ++++++++++++------------ src/plinder/core/loader/utils.py | 2 +- src/plinder/core/structure/structure.py | 14 +++++ 4 files changed, 78 insertions(+), 36 deletions(-) diff --git a/docs/examples/5_dataset_and_loader.ipynb b/docs/examples/5_dataset_and_loader.ipynb index 4575e55c..2612fd9c 100644 --- a/docs/examples/5_dataset_and_loader.ipynb +++ b/docs/examples/5_dataset_and_loader.ipynb @@ -88,6 +88,15 @@ "val_data = val_dataset[1]" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "val_data['features_and_coords']['apo_features']" + ] + }, { "cell_type": "code", "execution_count": null, @@ -125,8 +134,24 @@ "outputs": [], "source": [ "for k, v in test_torch[\"features_and_coords\"].items():\n", - " print(k, v.shape)" + " print(k, v)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "test_torch[\"features_and_coords\"].keys()" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/src/plinder/core/loader/featurizer.py b/src/plinder/core/loader/featurizer.py index 0ee8a548..64674c01 100644 --- a/src/plinder/core/loader/featurizer.py +++ b/src/plinder/core/loader/featurizer.py @@ -1,3 +1,4 @@ +import random from typing import Any import torch @@ -13,8 +14,13 @@ def system_featurizer( - system: PlinderSystem, pad_value: int = -100, featurize_apo: bool = True + system: PlinderSystem, + pad_value: int = -100, + featurize_apo: bool = True, + seed: int = 42, ) -> dict[str, Any]: + # Set seed + random.seed(seed) # Load holo and alternate (apo and pred) structures holo_structure = system.holo_structure apo_structures = system.alternate_structures @@ -64,42 +70,39 @@ def system_featurizer( "holo_protein_coordinates_stacked": holo_protein_coordinates_stacked, "holo_protein_calpha_coordinates_stacked": holo_protein_calpha_coordinates_stacked, } - - # Apo features - # Note: Since there are multiple apo/pred structures linked to a holo structure, we will - # stack all of them and let users choose how the want to use it if featurize_apo: - all_apo_protein_atom_arrays = [] - all_apo_sequence_atom_masks_stacked = [] - all_apo_input_sequence_residue_masks_stacked = [] - all_apo_protein_coordinates_arrays_stacked = [] - all_apo_protein_calpha_coordinates_arrays_stacked = [] - for apo_id, apo_structure in apo_structures.items(): - apo_structure.set_chain(holo_chain) - all_apo_protein_atom_arrays.append(apo_structure.protein_atom_array) - all_apo_sequence_atom_masks_stacked.append(apo_structure.sequence_atom_mask) - all_apo_input_sequence_residue_masks_stacked.append( - apo_structure.input_sequence_residue_mask_stacked - ) - all_apo_protein_coordinates_arrays_stacked.append( - apo_structure.protein_coords - ) - all_apo_protein_calpha_coordinates_arrays_stacked.append( - apo_structure.protein_calpha_coords - ) - all_apo_features = { - "all_apo_sequence_atom_masks_stacked": all_apo_sequence_atom_masks_stacked, - "all_apo_input_sequence_residue_masks_stacked": all_apo_input_sequence_residue_masks_stacked, - "all_apo_protein_coordinates_arrays_stacked": all_apo_protein_coordinates_arrays_stacked, - "all_apo_protein_calpha_coordinates_arrays_stacked": all_apo_protein_calpha_coordinates_arrays_stacked, + selected_apo = apo_structures[random.choice(list(apo_structures.keys()))] + # Set apo chain to match holo + selected_apo.set_chain(holo_chain) + apo_sequence_atom_mask_stacked = selected_apo.sequence_atom_mask + apo_input_sequence_residue_mask_stacked = ( + selected_apo.input_sequence_residue_mask_stacked + ) + apo_protein_coordinates_array_stacked = selected_apo.protein_coords + apo_protein_calpha_coordinates_array_stacked = ( + selected_apo.protein_calpha_coords + ) + # Apo to holo cropping mask + apo_sequence_to_holo_structure_mask_stacked = ( + holo_structure.protein_structure_residue_mask(selected_apo) + ) + + apo_features = { + "apo_sequence_atom_masks_stacked": apo_sequence_atom_mask_stacked, + "apo_input_sequence_residue_masks_stacked": apo_input_sequence_residue_mask_stacked, + "apo_protein_coordinates_arrays_stacked": apo_protein_coordinates_array_stacked, + "apo_protein_calpha_coordinates_arrays_stacked": apo_protein_calpha_coordinates_array_stacked, + "apo_sequence_to_holo_structure_mask_stacked": apo_sequence_to_holo_structure_mask_stacked, } else: - all_apo_features = { - "all_apo_sequence_atom_masks_stacked": [], - "all_apo_input_sequence_residue_masks_stacked": [], - "all_apo_protein_coordinates_arrays_stacked": [], - "all_apo_protein_calpha_coordinates_arrays_stacked": [], + apo_features = { + "apo_sequence_atom_masks_stacked": [], + "apo_input_sequence_residue_masks_stacked": [], + "apo_protein_coordinates_arrays_stacked": [], + "apo_protein_calpha_coordinates_arrays_stacked": [], + "apo_sequence_to_holo_structure_mask_stacked": [], } + # Ligand features input_ligand_templates = ( holo_structure.input_ligand_templates @@ -140,7 +143,7 @@ def system_featurizer( features = { "sequence_features": sequence_features, "holo_features": holo_features, - "apo_features": all_apo_features, + "apo_features": apo_features, "ligand_features": ligand_features, } diff --git a/src/plinder/core/loader/utils.py b/src/plinder/core/loader/utils.py index 91fb7fdd..0ae4a742 100644 --- a/src/plinder/core/loader/utils.py +++ b/src/plinder/core/loader/utils.py @@ -127,7 +127,7 @@ def collate_complex( collated_properties, dim=0, value=pad_value ) all_collated_and_padded_properties[feat_group] = collated_and_padded_properties - return collated_and_padded_properties + return all_collated_and_padded_properties def collate_batch( diff --git a/src/plinder/core/structure/structure.py b/src/plinder/core/structure/structure.py index a1c340c4..55ab664f 100644 --- a/src/plinder/core/structure/structure.py +++ b/src/plinder/core/structure/structure.py @@ -454,6 +454,20 @@ def input_sequence_residue_mask_stacked(self) -> list[list[int]]: ) return [seqres_masks[ch] for ch in self.protein_chain_ordered] + @property + def protein_structure_residue_mask(self, other: Structure) -> list[list[int]]: + """Mask residues from a given structure to another structure""" + self_protein_atom_array = self.protein_atom_array + other_protein_sequence_from_structure = other.protein_sequence_from_structure + other_chain = other_protein_sequence_from_structure.protein_chains[0] + assert self_protein_atom_array is not None + assert other_protein_sequence_from_structure is not None + other_sequence_dict = {other_chain: other_protein_sequence_from_structure} + seqres_masks = get_residue_index_mapping_mask( + other_sequence_dict, self_protein_atom_array + ) + return [seqres_masks[ch] for ch in self.protein_chain_ordered] + @property def input_sequence_list_ordered_by_chain(self) -> list[str] | None: """List of protein chains ordered the way it is in structure.""" From 48d0e09c663725ba32f2463cdf360b0f89890367 Mon Sep 17 00:00:00 2001 From: yusuf1759 Date: Mon, 30 Sep 2024 14:23:57 -0400 Subject: [PATCH 03/16] fix: linting and typing --- src/plinder/core/loader/dataset.py | 1 - src/plinder/core/structure/structure.py | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/plinder/core/loader/dataset.py b/src/plinder/core/loader/dataset.py index 2dd4ef5a..8af42606 100644 --- a/src/plinder/core/loader/dataset.py +++ b/src/plinder/core/loader/dataset.py @@ -13,7 +13,6 @@ from plinder.core.loader.utils import collate_batch from plinder.core.scores import query_index from plinder.core.scores.query import FILTERS -from plinder.core.structure.structure import Structure from plinder.core.utils.log import setup_logger LOG = setup_logger(__name__) diff --git a/src/plinder/core/structure/structure.py b/src/plinder/core/structure/structure.py index 55ab664f..6312f715 100644 --- a/src/plinder/core/structure/structure.py +++ b/src/plinder/core/structure/structure.py @@ -454,12 +454,11 @@ def input_sequence_residue_mask_stacked(self) -> list[list[int]]: ) return [seqres_masks[ch] for ch in self.protein_chain_ordered] - @property def protein_structure_residue_mask(self, other: Structure) -> list[list[int]]: """Mask residues from a given structure to another structure""" self_protein_atom_array = self.protein_atom_array other_protein_sequence_from_structure = other.protein_sequence_from_structure - other_chain = other_protein_sequence_from_structure.protein_chains[0] + other_chain = other.protein_chains[0] assert self_protein_atom_array is not None assert other_protein_sequence_from_structure is not None other_sequence_dict = {other_chain: other_protein_sequence_from_structure} From 18157a5b73f33d88d887d6ab49239a4afae2a8b4 Mon Sep 17 00:00:00 2001 From: yusuf1759 Date: Mon, 30 Sep 2024 21:23:45 -0400 Subject: [PATCH 04/16] fix: update featurizer --- docs/examples/4_align_mask_crop.ipynb | 9 --------- docs/examples/5_dataset_and_loader.ipynb | 22 ++++++++++++++++++++-- src/plinder/core/loader/dataset.py | 3 ++- src/plinder/core/loader/featurizer.py | 21 ++++++++++++++------- src/plinder/core/loader/utils.py | 5 +++++ 5 files changed, 41 insertions(+), 19 deletions(-) diff --git a/docs/examples/4_align_mask_crop.ipynb b/docs/examples/4_align_mask_crop.ipynb index bba9fc43..3bec9508 100644 --- a/docs/examples/4_align_mask_crop.ipynb +++ b/docs/examples/4_align_mask_crop.ipynb @@ -40,15 +40,6 @@ "system_structure = plinder_system.holo_structure" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "system_structure" - ] - }, { "cell_type": "markdown", "metadata": {}, diff --git a/docs/examples/5_dataset_and_loader.ipynb b/docs/examples/5_dataset_and_loader.ipynb index 2612fd9c..416c0056 100644 --- a/docs/examples/5_dataset_and_loader.ipynb +++ b/docs/examples/5_dataset_and_loader.ipynb @@ -72,7 +72,7 @@ " split=\"val\",\n", " filters=[\n", " (\"system_num_protein_chains\", \"==\", 1),\n", - " (\"ligand_unique_ccd_code\", \"in\", {\"ATP\"}),\n", + " #(\"ligand_unique_ccd_code\", \"in\", {\"ATP\"}),\n", " ],\n", " use_alternate_structures=False,\n", ")\n", @@ -85,7 +85,7 @@ "metadata": {}, "outputs": [], "source": [ - "val_data = val_dataset[1]" + "val_data = val_dataset[10]" ] }, { @@ -97,6 +97,15 @@ "val_data['features_and_coords']['apo_features']" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "val_data['system_id']" + ] + }, { "cell_type": "code", "execution_count": null, @@ -146,6 +155,15 @@ "test_torch[\"features_and_coords\"].keys()" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "test_torch[\"features_and_coords\"][\"apo_features\"]" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/src/plinder/core/loader/dataset.py b/src/plinder/core/loader/dataset.py index 8af42606..e7b3be3b 100644 --- a/src/plinder/core/loader/dataset.py +++ b/src/plinder/core/loader/dataset.py @@ -68,13 +68,14 @@ def __getitem__( holo_structure = s.holo_structure features_and_coords = None if self._featurizer is not None: - features_and_coords = self._featurizer( + features_and_coords, selected_alternate_structure_id = self._featurizer( s, featurize_apo=self._use_alternate_structures, # type: ignore ) item: dict[str, Any] = { "system_id": holo_structure.id, + "alternate_structure_id": selected_alternate_structure_id, "plinder_system": s, "features_and_coords": features_and_coords, "path": s.system_cif, diff --git a/src/plinder/core/loader/featurizer.py b/src/plinder/core/loader/featurizer.py index 64674c01..fe782c87 100644 --- a/src/plinder/core/loader/featurizer.py +++ b/src/plinder/core/loader/featurizer.py @@ -71,7 +71,8 @@ def system_featurizer( "holo_protein_calpha_coordinates_stacked": holo_protein_calpha_coordinates_stacked, } if featurize_apo: - selected_apo = apo_structures[random.choice(list(apo_structures.keys()))] + apo_id = random.choice(list(apo_structures.keys())) + selected_apo = apo_structures[apo_id] # Set apo chain to match holo selected_apo.set_chain(holo_chain) apo_sequence_atom_mask_stacked = selected_apo.sequence_atom_mask @@ -95,12 +96,18 @@ def system_featurizer( "apo_sequence_to_holo_structure_mask_stacked": apo_sequence_to_holo_structure_mask_stacked, } else: + # Fallback to holo at the alternate structure + # Apo to holo cropping mask + apo_id = holo_structure.id + apo_sequence_to_holo_structure_mask_stacked = ( + holo_structure.protein_structure_residue_mask(holo_structure) + ) apo_features = { - "apo_sequence_atom_masks_stacked": [], - "apo_input_sequence_residue_masks_stacked": [], - "apo_protein_coordinates_arrays_stacked": [], - "apo_protein_calpha_coordinates_arrays_stacked": [], - "apo_sequence_to_holo_structure_mask_stacked": [], + "apo_sequence_atom_masks_stacked": holo_sequence_atom_mask_stacked, + "apo_input_sequence_residue_masks_stacked": holo_input_sequence_residue_mask_stacked, + "apo_protein_coordinates_arrays_stacked": holo_protein_coordinates_stacked, + "apo_protein_calpha_coordinates_arrays_stacked": holo_protein_calpha_coordinates_stacked, + "apo_sequence_to_holo_structure_mask_stacked": apo_sequence_to_holo_structure_mask_stacked, } # Ligand features @@ -165,4 +172,4 @@ def system_featurizer( } # Set features as new properties - return padded_features + return padded_features, apo_id diff --git a/src/plinder/core/loader/utils.py b/src/plinder/core/loader/utils.py index 0ae4a742..f581c27e 100644 --- a/src/plinder/core/loader/utils.py +++ b/src/plinder/core/loader/utils.py @@ -163,25 +163,30 @@ def collate_batch( """ system_ids: list[str] = [] + alternate_structure_ids: list[str] = [] plinder_system: list[PlinderSystem] = [] feature_and_coords: list[dict[str, Tensor]] = [] paths: list[str] = [] + for x in batch: assert isinstance(x["system_id"], str) assert isinstance(x["plinder_system"], PlinderSystem) assert isinstance(x["features_and_coords"], dict) assert isinstance(x["path"], str) + assert isinstance(x["alternate_structure_id"], str) system_ids.append(x["system_id"]) plinder_system.append(x["plinder_system"]) feature_and_coords.append(x["features_and_coords"]) paths.append(x["path"]) + alternate_structure_ids.append(x["alternate_structure_id"]) collated_batch: dict[ str, list[str] | list[PlinderSystem] | list[dict[str, dict[str, Tensor]]], ] = { "system_ids": system_ids, + "alternate_structure_id": alternate_structure_ids, "plinder_system": plinder_system, "paths": paths, "features_and_coords": collate_complex(feature_and_coords), # type: ignore From eb8da01eef592dff6eba84a9f6e8fd4e04208163 Mon Sep 17 00:00:00 2001 From: yusuf1759 Date: Wed, 2 Oct 2024 22:19:53 -0400 Subject: [PATCH 05/16] test: add tests --- docs/examples/5_dataset_and_loader.ipynb | 11 ++---- src/plinder/core/loader/featurizer.py | 16 ++++----- src/plinder/core/structure/structure.py | 6 ++-- tests/core/test_core_system.py | 44 ++++++++++++++++++++++++ 4 files changed, 58 insertions(+), 19 deletions(-) diff --git a/docs/examples/5_dataset_and_loader.ipynb b/docs/examples/5_dataset_and_loader.ipynb index 416c0056..13ed84f1 100644 --- a/docs/examples/5_dataset_and_loader.ipynb +++ b/docs/examples/5_dataset_and_loader.ipynb @@ -72,7 +72,7 @@ " split=\"val\",\n", " filters=[\n", " (\"system_num_protein_chains\", \"==\", 1),\n", - " #(\"ligand_unique_ccd_code\", \"in\", {\"ATP\"}),\n", + " (\"ligand_unique_ccd_code\", \"in\", {\"ATP\"}),\n", " ],\n", " use_alternate_structures=False,\n", ")\n", @@ -85,7 +85,7 @@ "metadata": {}, "outputs": [], "source": [ - "val_data = val_dataset[10]" + "val_data = val_dataset[1]" ] }, { @@ -163,13 +163,6 @@ "source": [ "test_torch[\"features_and_coords\"][\"apo_features\"]" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/src/plinder/core/loader/featurizer.py b/src/plinder/core/loader/featurizer.py index fe782c87..8be2399f 100644 --- a/src/plinder/core/loader/featurizer.py +++ b/src/plinder/core/loader/featurizer.py @@ -89,10 +89,10 @@ def system_featurizer( ) apo_features = { - "apo_sequence_atom_masks_stacked": apo_sequence_atom_mask_stacked, - "apo_input_sequence_residue_masks_stacked": apo_input_sequence_residue_mask_stacked, - "apo_protein_coordinates_arrays_stacked": apo_protein_coordinates_array_stacked, - "apo_protein_calpha_coordinates_arrays_stacked": apo_protein_calpha_coordinates_array_stacked, + "apo_sequence_atom_mask_stacked": apo_sequence_atom_mask_stacked, + "apo_input_sequence_residue_mask_stacked": apo_input_sequence_residue_mask_stacked, + "apo_protein_coordinates_stacked": apo_protein_coordinates_array_stacked, + "apo_protein_calpha_coordinates_stacked": apo_protein_calpha_coordinates_array_stacked, "apo_sequence_to_holo_structure_mask_stacked": apo_sequence_to_holo_structure_mask_stacked, } else: @@ -103,10 +103,10 @@ def system_featurizer( holo_structure.protein_structure_residue_mask(holo_structure) ) apo_features = { - "apo_sequence_atom_masks_stacked": holo_sequence_atom_mask_stacked, - "apo_input_sequence_residue_masks_stacked": holo_input_sequence_residue_mask_stacked, - "apo_protein_coordinates_arrays_stacked": holo_protein_coordinates_stacked, - "apo_protein_calpha_coordinates_arrays_stacked": holo_protein_calpha_coordinates_stacked, + "apo_sequence_atom_mask_stacked": holo_sequence_atom_mask_stacked, + "apo_input_sequence_residue_mask_stacked": holo_input_sequence_residue_mask_stacked, + "apo_protein_coordinates_stacked": holo_protein_coordinates_stacked, + "apo_protein_calpha_coordinates_stacked": holo_protein_calpha_coordinates_stacked, "apo_sequence_to_holo_structure_mask_stacked": apo_sequence_to_holo_structure_mask_stacked, } diff --git a/src/plinder/core/structure/structure.py b/src/plinder/core/structure/structure.py index 6312f715..f545560f 100644 --- a/src/plinder/core/structure/structure.py +++ b/src/plinder/core/structure/structure.py @@ -199,8 +199,10 @@ def load_sequence(self) -> None: raise ValueError("Protein atom array not loaded") self.protein_sequence = {} for chain in self.protein_chain_ordered: - self.protein_sequence[chain] = struc.to_sequence( - self.protein_atom_array[self.protein_atom_array.chain_id == chain] + self.protein_sequence[chain] = str( + struc.to_sequence( + self.protein_atom_array[self.protein_atom_array.chain_id == chain] + )[0][0] ) if not len(self.protein_sequence): raise ValueError("Protein sequence could not be loaded") diff --git a/tests/core/test_core_system.py b/tests/core/test_core_system.py index 2235f11e..2216d2eb 100644 --- a/tests/core/test_core_system.py +++ b/tests/core/test_core_system.py @@ -3,6 +3,7 @@ import numpy as np import pytest from plinder.core import index +from plinder.core.loader.featurizer import system_featurizer @pytest.mark.parametrize( @@ -67,3 +68,46 @@ def test_plinder_structure(read_plinder_mount): assert len(holo_struc.protein_atom_array) assert holo_struc.ligand_sdfs is not None assert len(holo_struc.ligand_sdfs) + feat = system_featurizer(s) + # Check the selected apo structure + feat[1] == "1rav_A" + # Check seqres to holo mask + seqres_holo_mask = feat[0]["holo_features"][ + "holo_input_sequence_residue_mask_stacked" + ] + assert np.array(seqres_holo_mask[:, :2]) == np.array([[0, 0]]) + # Check seqres to apo mask + seqres_apo_mask = feat[0]["apo_features"][ + "apo_input_sequence_residue_masks_stacked" + ] + assert np.array(seqres_apo_mask[:, -3:]) == np.array([[0, 0, 0]]) + # Check apo to holo mask + apo_holo_mask = feat[0]["apo_features"]["apo_input_sequence_residue_masks_stacked"] + assert np.array(apo_holo_mask[:, -3:]) == np.array([[0, 0, 0]]) + + assert np.array( + feat[0]["apo_features"]["apo_protein_coordinates_stacked"].shape + ) == np.array([1, 976, 3]) + assert np.array( + feat[0]["apo_features"]["apo_protein_calpha_coordinates_stacked"].shape + ) == np.array([1, 128, 3]) + + assert np.array( + feat[0]["holo_features"]["holo_protein_calpha_coordinates_stacked"].shape + ) == np.array([1, 123, 3]) + + assert np.array( + feat[0]["holo_features"]["holo_protein_calpha_coordinates_stacked"].shape + ) == np.array([1, 123, 3]) + + assert np.array( + feat[0]["holo_features"]["holo_protein_coordinates_stacked"].shape + ) == np.array([1, 964, 3]) + + assert np.array( + feat[0]["sequence_features"]["input_sequence_residue_feat_stack"].shape + ) == np.array([1, 128, 21]) + + assert np.array( + feat[0]["sequence_features"]["input_sequence_full_atom_feat_stack"].shape + ) == np.array([1, 1007, 12]) From 1955b184b3d4c0d5c621ed3c130573cb1eb705fb Mon Sep 17 00:00:00 2001 From: yusuf1759 Date: Wed, 2 Oct 2024 22:21:32 -0400 Subject: [PATCH 06/16] chore: type hinting --- src/plinder/core/loader/featurizer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plinder/core/loader/featurizer.py b/src/plinder/core/loader/featurizer.py index 8be2399f..eaec2acd 100644 --- a/src/plinder/core/loader/featurizer.py +++ b/src/plinder/core/loader/featurizer.py @@ -18,7 +18,7 @@ def system_featurizer( pad_value: int = -100, featurize_apo: bool = True, seed: int = 42, -) -> dict[str, Any]: +) -> tuple[dict[str, Any], str]: # Set seed random.seed(seed) # Load holo and alternate (apo and pred) structures From 2e01e835217bcf5a537a3488a6cf18a78a1d94ed Mon Sep 17 00:00:00 2001 From: yusuf1759 Date: Wed, 2 Oct 2024 22:29:10 -0400 Subject: [PATCH 07/16] chore: add apo linked file --- .../mount/linked_structures/1rav_A.cif | 1313 +++++++++++++++++ 1 file changed, 1313 insertions(+) create mode 100644 tests/test_data/plinder/mount/linked_structures/1rav_A.cif diff --git a/tests/test_data/plinder/mount/linked_structures/1rav_A.cif b/tests/test_data/plinder/mount/linked_structures/1rav_A.cif new file mode 100644 index 00000000..966d9def --- /dev/null +++ b/tests/test_data/plinder/mount/linked_structures/1rav_A.cif @@ -0,0 +1,1313 @@ +data_1rav_A +loop_ +_entity.id +_entity.type +1 polymer +# +loop_ +_entity_poly.entity_id +_entity_poly.type +_entity_poly.pdbx_seq_one_letter_code +_entity_poly.pdbx_seq_one_letter_code_can +1 polypeptide(L) RKCSLTGKWTNDLGSNMTIGAVNSRGEFTGTYITAVTATSNEIKESPLHGTENTINKRTQPTFGFTVNWKFSESTTVFTGQCFIDRNGKEVLKTMWLLRSSVNDIGDDWKATRVGINIFTRLRTQKE RKCSLTGKWTNDLGSNMTIGAVNSRGEFTGTYITAVTATSNEIKESPLHGTENTINKRTQPTFGFTVNWKFSESTTVFTGQCFIDRNGKEVLKTMWLLRSSVNDIGDDWKATRVGINIFTRLRTQKE +# +loop_ +_entity_poly_seq.entity_id +_entity_poly_seq.mon_id +_entity_poly_seq.num +_entity_poly_seq.hetero +1 ARG 1 n +1 LYS 2 n +1 CYS 3 n +1 SER 4 n +1 LEU 5 n +1 THR 6 n +1 GLY 7 n +1 LYS 8 n +1 TRP 9 n +1 THR 10 n +1 ASN 11 n +1 ASP 12 n +1 LEU 13 n +1 GLY 14 n +1 SER 15 n +1 ASN 16 n +1 MET 17 n +1 THR 18 n +1 ILE 19 n +1 GLY 20 n +1 ALA 21 n +1 VAL 22 n +1 ASN 23 n +1 SER 24 n +1 ARG 25 n +1 GLY 26 n +1 GLU 27 n +1 PHE 28 n +1 THR 29 n +1 GLY 30 n +1 THR 31 n +1 TYR 32 n +1 ILE 33 n +1 THR 34 n +1 ALA 35 n +1 VAL 36 n +1 THR 37 n +1 ALA 38 n +1 THR 39 n +1 SER 40 n +1 ASN 41 n +1 GLU 42 n +1 ILE 43 n +1 LYS 44 n +1 GLU 45 n +1 SER 46 n +1 PRO 47 n +1 LEU 48 n +1 HIS 49 n +1 GLY 50 n +1 THR 51 n +1 GLU 52 n +1 ASN 53 n +1 THR 54 n +1 ILE 55 n +1 ASN 56 n +1 LYS 57 n +1 ARG 58 n +1 THR 59 n +1 GLN 60 n +1 PRO 61 n +1 THR 62 n +1 PHE 63 n +1 GLY 64 n +1 PHE 65 n +1 THR 66 n +1 VAL 67 n +1 ASN 68 n +1 TRP 69 n +1 LYS 70 n +1 PHE 71 n +1 SER 72 n +1 GLU 73 n +1 SER 74 n +1 THR 75 n +1 THR 76 n +1 VAL 77 n +1 PHE 78 n +1 THR 79 n +1 GLY 80 n +1 GLN 81 n +1 CYS 82 n +1 PHE 83 n +1 ILE 84 n +1 ASP 85 n +1 ARG 86 n +1 ASN 87 n +1 GLY 88 n +1 LYS 89 n +1 GLU 90 n +1 VAL 91 n +1 LEU 92 n +1 LYS 93 n +1 THR 94 n +1 MET 95 n +1 TRP 96 n +1 LEU 97 n +1 LEU 98 n +1 ARG 99 n +1 SER 100 n +1 SER 101 n +1 VAL 102 n +1 ASN 103 n +1 ASP 104 n +1 ILE 105 n +1 GLY 106 n +1 ASP 107 n +1 ASP 108 n +1 TRP 109 n +1 LYS 110 n +1 ALA 111 n +1 THR 112 n +1 ARG 113 n +1 VAL 114 n +1 GLY 115 n +1 ILE 116 n +1 ASN 117 n +1 ILE 118 n +1 PHE 119 n +1 THR 120 n +1 ARG 121 n +1 LEU 122 n +1 ARG 123 n +1 THR 124 n +1 GLN 125 n +1 LYS 126 n +1 GLU 127 n +# +loop_ +_chem_comp.id +_chem_comp.type +_chem_comp.name +ALA "L-PEPTIDE LINKING" ALANINE +ARG "L-PEPTIDE LINKING" ARGININE +ASN "L-PEPTIDE LINKING" ASPARAGINE +ASP "L-PEPTIDE LINKING" "ASPARTIC ACID" +CYS "L-PEPTIDE LINKING" CYSTEINE +GLN "L-PEPTIDE LINKING" GLUTAMINE +GLU "L-PEPTIDE LINKING" "GLUTAMIC ACID" +GLY "PEPTIDE LINKING" GLYCINE +HIS "L-PEPTIDE LINKING" HISTIDINE +ILE "L-PEPTIDE LINKING" ISOLEUCINE +LEU "L-PEPTIDE LINKING" LEUCINE +LYS "L-PEPTIDE LINKING" LYSINE +MET "L-PEPTIDE LINKING" METHIONINE +PHE "L-PEPTIDE LINKING" PHENYLALANINE +PRO "L-PEPTIDE LINKING" PROLINE +SER "L-PEPTIDE LINKING" SERINE +THR "L-PEPTIDE LINKING" THREONINE +TRP "L-PEPTIDE LINKING" TRYPTOPHAN +TYR "L-PEPTIDE LINKING" TYROSINE +VAL "L-PEPTIDE LINKING" VALINE +# +loop_ +_struct_asym.id +_struct_asym.entity_id +A 1 +# +# +loop_ +_atom_type.symbol +C +N +O +S +# +loop_ +_atom_site.group_PDB +_atom_site.type_symbol +_atom_site.label_atom_id +_atom_site.label_comp_id +_atom_site.label_asym_id +_atom_site.label_entity_id +_atom_site.label_seq_id +_atom_site.label_alt_id +_atom_site.Cartn_x +_atom_site.Cartn_y +_atom_site.Cartn_z +_atom_site.occupancy +_atom_site.B_iso_or_equiv +_atom_site.auth_seq_id +_atom_site.auth_asym_id +_atom_site.id +_atom_site.pdbx_PDB_ins_code +_atom_site.pdbx_PDB_model_num +ATOM N N ARG A 1 1 . 41.650 27.311 -3.795 1.00 76.10 2 A 0 ? 1 +ATOM C CA ARG A 1 1 . 42.278 27.262 -2.472 1.00 79.02 2 A 1 ? 1 +ATOM C C ARG A 1 1 . 41.885 26.044 -1.638 1.00 80.60 2 A 2 ? 1 +ATOM O O ARG A 1 1 . 40.781 25.523 -1.745 1.00 81.17 2 A 3 ? 1 +ATOM C CB ARG A 1 1 . 42.203 28.550 -1.667 1.00 84.63 2 A 4 ? 1 +ATOM C CG ARG A 1 1 . 41.209 28.474 -0.517 0.00 90.70 2 A 5 ? 1 +ATOM C CD ARG A 1 1 . 39.777 28.262 -0.992 0.00 93.15 2 A 6 ? 1 +ATOM N NE ARG A 1 1 . 39.494 28.927 -2.260 0.00 93.25 2 A 7 ? 1 +ATOM C CZ ARG A 1 1 . 38.969 30.145 -2.360 0.00 100.00 2 A 8 ? 1 +ATOM N NH1 ARG A 1 1 . 38.650 30.865 -1.288 0.00 87.47 2 A 9 ? 1 +ATOM N NH2 ARG A 1 1 . 38.751 30.657 -3.568 0.00 86.88 2 A 10 ? 1 +ATOM N N LYS A 1 2 . 42.819 25.609 -0.796 1.00 72.74 3 A 11 ? 1 +ATOM C CA LYS A 1 2 . 42.693 24.392 0.003 1.00 69.94 3 A 12 ? 1 +ATOM C C LYS A 1 2 . 42.341 24.503 1.473 1.00 61.24 3 A 13 ? 1 +ATOM O O LYS A 1 2 . 42.430 25.547 2.128 1.00 65.50 3 A 14 ? 1 +ATOM C CB LYS A 1 2 . 43.971 23.561 -0.109 1.00 74.03 3 A 15 ? 1 +ATOM C CG LYS A 1 2 . 45.154 24.205 0.610 1.00 71.52 3 A 16 ? 1 +ATOM C CD LYS A 1 2 . 46.479 23.512 0.334 1.00 75.55 3 A 17 ? 1 +ATOM C CE LYS A 1 2 . 46.602 22.165 1.038 1.00 69.49 3 A 18 ? 1 +ATOM N NZ LYS A 1 2 . 46.494 22.250 2.515 1.00 43.57 3 A 19 ? 1 +ATOM N N CYS A 1 3 . 41.989 23.342 1.988 1.00 45.61 4 A 20 ? 1 +ATOM C CA CYS A 1 3 . 41.627 23.197 3.377 1.00 41.26 4 A 21 ? 1 +ATOM C C CYS A 1 3 . 42.900 23.122 4.151 1.00 36.90 4 A 22 ? 1 +ATOM O O CYS A 1 3 . 43.725 22.273 3.897 1.00 37.51 4 A 23 ? 1 +ATOM C CB CYS A 1 3 . 40.719 21.976 3.523 1.00 41.57 4 A 24 ? 1 +ATOM S SG CYS A 1 3 . 40.079 21.747 5.198 1.00 45.25 4 A 25 ? 1 +ATOM N N SER A 1 4 . 43.097 24.103 5.022 1.00 34.92 5 A 26 ? 1 +ATOM C CA SER A 1 4 . 44.316 24.263 5.838 1.00 38.26 5 A 27 ? 1 +ATOM C C SER A 1 4 . 44.200 23.774 7.323 1.00 35.44 5 A 28 ? 1 +ATOM O O SER A 1 4 . 43.255 24.103 8.048 1.00 34.29 5 A 29 ? 1 +ATOM C CB SER A 1 4 . 44.816 25.718 5.734 1.00 41.24 5 A 30 ? 1 +ATOM O OG SER A 1 4 . 46.119 25.853 6.258 1.00 57.00 5 A 31 ? 1 +ATOM N N LEU A 1 5 . 45.183 22.976 7.756 1.00 32.79 6 A 32 ? 1 +ATOM C CA LEU A 1 5 . 45.251 22.405 9.106 1.00 35.55 6 A 33 ? 1 +ATOM C C LEU A 1 5 . 45.640 23.451 10.186 1.00 35.79 6 A 34 ? 1 +ATOM O O LEU A 1 5 . 45.129 23.430 11.323 1.00 34.70 6 A 35 ? 1 +ATOM C CB LEU A 1 5 . 46.266 21.227 9.128 1.00 37.08 6 A 36 ? 1 +ATOM C CG LEU A 1 5 . 45.780 19.753 9.119 1.00 44.31 6 A 37 ? 1 +ATOM C CD1 LEU A 1 5 . 44.266 19.573 9.093 1.00 39.53 6 A 38 ? 1 +ATOM C CD2 LEU A 1 5 . 46.404 19.008 7.942 1.00 55.77 6 A 39 ? 1 +ATOM N N THR A 1 6 . 46.565 24.356 9.788 1.00 31.35 7 A 40 ? 1 +ATOM C CA THR A 1 6 . 47.113 25.414 10.629 1.00 29.49 7 A 41 ? 1 +ATOM C C THR A 1 6 . 46.070 26.258 11.321 1.00 34.43 7 A 42 ? 1 +ATOM O O THR A 1 6 . 45.140 26.759 10.714 1.00 33.57 7 A 43 ? 1 +ATOM C CB THR A 1 6 . 48.066 26.307 9.868 1.00 27.93 7 A 44 ? 1 +ATOM O OG1 THR A 1 6 . 49.185 25.550 9.393 1.00 35.35 7 A 45 ? 1 +ATOM C CG2 THR A 1 6 . 48.510 27.421 10.810 1.00 28.93 7 A 46 ? 1 +ATOM N N GLY A 1 7 . 46.193 26.415 12.623 1.00 31.25 8 A 47 ? 1 +ATOM C CA GLY A 1 7 . 45.158 27.217 13.281 1.00 31.40 8 A 48 ? 1 +ATOM C C GLY A 1 7 . 44.499 26.586 14.534 1.00 37.49 8 A 49 ? 1 +ATOM O O GLY A 1 7 . 45.014 25.629 15.176 1.00 37.19 8 A 50 ? 1 +ATOM N N LYS A 1 8 . 43.330 27.157 14.863 1.00 32.08 9 A 51 ? 1 +ATOM C CA LYS A 1 8 . 42.559 26.718 16.004 1.00 35.77 9 A 52 ? 1 +ATOM C C LYS A 1 8 . 41.274 26.000 15.648 1.00 32.83 9 A 53 ? 1 +ATOM O O LYS A 1 8 . 40.497 26.461 14.805 1.00 37.26 9 A 54 ? 1 +ATOM C CB LYS A 1 8 . 42.328 27.827 17.040 1.00 44.59 9 A 55 ? 1 +ATOM C CG LYS A 1 8 . 43.609 28.533 17.487 1.00 48.43 9 A 56 ? 1 +ATOM C CD LYS A 1 8 . 43.436 29.543 18.635 1.00 48.40 9 A 57 ? 1 +ATOM C CE LYS A 1 8 . 44.713 29.776 19.427 0.00 59.56 9 A 58 ? 1 +ATOM N NZ LYS A 1 8 . 44.834 31.152 19.928 0.00 68.86 9 A 59 ? 1 +ATOM N N TRP A 1 9 . 41.060 24.868 16.329 1.00 27.32 10 A 60 ? 1 +ATOM C CA TRP A 1 9 . 39.893 24.041 16.058 1.00 29.21 10 A 61 ? 1 +ATOM C C TRP A 1 9 . 39.074 23.612 17.275 1.00 34.72 10 A 62 ? 1 +ATOM O O TRP A 1 9 . 39.522 23.596 18.427 1.00 32.63 10 A 63 ? 1 +ATOM C CB TRP A 1 9 . 40.430 22.804 15.338 1.00 28.18 10 A 64 ? 1 +ATOM C CG TRP A 1 9 . 41.223 23.058 14.049 1.00 30.43 10 A 65 ? 1 +ATOM C CD1 TRP A 1 9 . 42.588 23.128 13.888 1.00 33.49 10 A 66 ? 1 +ATOM C CD2 TRP A 1 9 . 40.674 23.170 12.713 1.00 29.57 10 A 67 ? 1 +ATOM N NE1 TRP A 1 9 . 42.928 23.204 12.543 1.00 31.07 10 A 68 ? 1 +ATOM C CE2 TRP A 1 9 . 41.771 23.221 11.807 1.00 30.80 10 A 69 ? 1 +ATOM C CE3 TRP A 1 9 . 39.359 23.029 12.191 1.00 31.09 10 A 70 ? 1 +ATOM C CZ2 TRP A 1 9 . 41.551 23.323 10.435 1.00 29.60 10 A 71 ? 1 +ATOM C CZ3 TRP A 1 9 . 39.172 23.056 10.811 1.00 29.35 10 A 72 ? 1 +ATOM C CH2 TRP A 1 9 . 40.256 23.237 9.967 1.00 28.73 10 A 73 ? 1 +ATOM N N THR A 1 10 . 37.832 23.264 17.044 1.00 27.91 11 A 74 ? 1 +ATOM C CA THR A 1 10 . 37.087 22.789 18.154 1.00 25.69 11 A 75 ? 1 +ATOM C C THR A 1 10 . 36.229 21.619 17.739 1.00 33.55 11 A 76 ? 1 +ATOM O O THR A 1 10 . 35.826 21.496 16.598 1.00 35.08 11 A 77 ? 1 +ATOM C CB THR A 1 10 . 36.238 23.853 18.836 1.00 42.49 11 A 78 ? 1 +ATOM O OG1 THR A 1 10 . 35.634 23.205 19.928 1.00 48.42 11 A 79 ? 1 +ATOM C CG2 THR A 1 10 . 35.125 24.347 17.904 1.00 30.03 11 A 80 ? 1 +ATOM N N ASN A 1 11 . 35.942 20.758 18.688 1.00 31.38 12 A 81 ? 1 +ATOM C CA ASN A 1 11 . 35.087 19.651 18.401 1.00 35.56 12 A 82 ? 1 +ATOM C C ASN A 1 11 . 33.722 19.678 19.133 1.00 46.77 12 A 83 ? 1 +ATOM O O ASN A 1 11 . 33.367 20.621 19.844 1.00 47.95 12 A 84 ? 1 +ATOM C CB ASN A 1 11 . 35.802 18.309 18.577 1.00 35.13 12 A 85 ? 1 +ATOM C CG ASN A 1 11 . 35.777 17.891 20.045 1.00 55.33 12 A 86 ? 1 +ATOM O OD1 ASN A 1 11 . 35.209 18.556 20.950 1.00 42.19 12 A 87 ? 1 +ATOM N ND2 ASN A 1 11 . 36.510 16.832 20.301 1.00 44.96 12 A 88 ? 1 +ATOM N N ASP A 1 12 . 33.008 18.562 18.920 1.00 51.50 13 A 89 ? 1 +ATOM C CA ASP A 1 12 . 31.687 18.187 19.413 1.00 56.23 13 A 90 ? 1 +ATOM C C ASP A 1 12 . 31.686 17.804 20.891 1.00 67.01 13 A 91 ? 1 +ATOM O O ASP A 1 12 . 30.709 18.034 21.631 1.00 68.48 13 A 92 ? 1 +ATOM C CB ASP A 1 12 . 31.111 17.035 18.570 0.00 58.06 13 A 93 ? 1 +ATOM C CG ASP A 1 12 . 32.179 16.105 18.062 0.00 68.12 13 A 94 ? 1 +ATOM O OD1 ASP A 1 12 . 33.105 15.857 18.955 0.00 74.00 13 A 95 ? 1 +ATOM O OD2 ASP A 1 12 . 32.183 15.644 16.936 0.00 68.61 13 A 96 ? 1 +ATOM N N LEU A 1 13 . 32.796 17.211 21.332 1.00 59.91 14 A 97 ? 1 +ATOM C CA LEU A 1 13 . 32.907 16.903 22.733 1.00 57.43 14 A 98 ? 1 +ATOM C C LEU A 1 13 . 33.366 18.145 23.537 1.00 56.16 14 A 99 ? 1 +ATOM O O LEU A 1 13 . 33.453 18.081 24.758 1.00 52.65 14 A 100 ? 1 +ATOM C CB LEU A 1 13 . 33.851 15.714 22.992 0.00 57.53 14 A 101 ? 1 +ATOM C CG LEU A 1 13 . 33.649 14.563 22.016 0.00 62.43 14 A 102 ? 1 +ATOM C CD1 LEU A 1 13 . 34.691 13.479 22.267 0.00 62.65 14 A 103 ? 1 +ATOM C CD2 LEU A 1 13 . 32.248 13.985 22.175 0.00 64.96 14 A 104 ? 1 +ATOM N N GLY A 1 14 . 33.722 19.287 22.907 1.00 47.73 15 A 105 ? 1 +ATOM C CA GLY A 1 14 . 34.235 20.356 23.759 1.00 46.04 15 A 106 ? 1 +ATOM C C GLY A 1 14 . 35.787 20.309 23.983 1.00 56.47 15 A 107 ? 1 +ATOM O O GLY A 1 14 . 36.329 20.786 24.985 1.00 62.78 15 A 108 ? 1 +ATOM N N SER A 1 15 . 36.569 19.716 23.068 1.00 40.57 16 A 109 ? 1 +ATOM C CA SER A 1 15 . 38.013 19.734 23.223 1.00 33.24 16 A 110 ? 1 +ATOM C C SER A 1 15 . 38.532 20.721 22.212 1.00 31.41 16 A 111 ? 1 +ATOM O O SER A 1 15 . 37.866 20.978 21.233 1.00 29.69 16 A 112 ? 1 +ATOM C CB SER A 1 15 . 38.616 18.428 22.791 1.00 39.49 16 A 113 ? 1 +ATOM O OG SER A 1 15 . 38.005 17.368 23.489 1.00 47.27 16 A 114 ? 1 +ATOM N N ASN A 1 16 . 39.726 21.246 22.392 1.00 27.39 17 A 115 ? 1 +ATOM C CA ASN A 1 16 . 40.259 22.160 21.412 1.00 26.01 17 A 116 ? 1 +ATOM C C ASN A 1 16 . 41.676 21.747 21.048 1.00 33.53 17 A 117 ? 1 +ATOM O O ASN A 1 16 . 42.351 21.029 21.796 1.00 33.48 17 A 118 ? 1 +ATOM C CB ASN A 1 16 . 40.287 23.599 21.979 1.00 34.82 17 A 119 ? 1 +ATOM C CG ASN A 1 16 . 38.887 24.018 22.356 1.00 66.65 17 A 120 ? 1 +ATOM O OD1 ASN A 1 16 . 37.954 23.825 21.558 1.00 65.11 17 A 121 ? 1 +ATOM N ND2 ASN A 1 16 . 38.702 24.423 23.612 1.00 52.32 17 A 122 ? 1 +ATOM N N MET A 1 17 . 42.117 22.221 19.897 1.00 25.76 18 A 123 ? 1 +ATOM C CA MET A 1 17 . 43.459 22.013 19.453 1.00 27.97 18 A 124 ? 1 +ATOM C C MET A 1 17 . 43.980 23.205 18.630 1.00 29.53 18 A 125 ? 1 +ATOM O O MET A 1 17 . 43.249 23.953 17.986 1.00 32.01 18 A 126 ? 1 +ATOM C CB MET A 1 17 . 43.756 20.617 18.838 1.00 31.86 18 A 127 ? 1 +ATOM C CG MET A 1 17 . 43.056 20.373 17.499 1.00 35.62 18 A 128 ? 1 +ATOM S SD MET A 1 17 . 43.538 18.846 16.570 1.00 36.25 18 A 129 ? 1 +ATOM C CE MET A 1 17 . 42.648 19.116 15.022 1.00 30.70 18 A 130 ? 1 +ATOM N N THR A 1 18 . 45.287 23.348 18.646 1.00 28.21 19 A 131 ? 1 +ATOM C CA THR A 1 18 . 45.966 24.390 17.930 1.00 31.36 19 A 132 ? 1 +ATOM C C THR A 1 18 . 47.026 23.692 17.088 1.00 32.55 19 A 133 ? 1 +ATOM O O THR A 1 18 . 47.806 22.874 17.572 1.00 28.34 19 A 134 ? 1 +ATOM C CB THR A 1 18 . 46.639 25.387 18.950 1.00 41.88 19 A 135 ? 1 +ATOM O OG1 THR A 1 18 . 45.709 25.930 19.841 1.00 33.83 19 A 136 ? 1 +ATOM C CG2 THR A 1 18 . 47.328 26.550 18.265 1.00 29.43 19 A 137 ? 1 +ATOM N N ILE A 1 19 . 47.058 24.005 15.826 1.00 29.08 20 A 138 ? 1 +ATOM C CA ILE A 1 19 . 48.070 23.403 15.023 1.00 28.51 20 A 139 ? 1 +ATOM C C ILE A 1 19 . 48.928 24.520 14.479 1.00 35.14 20 A 140 ? 1 +ATOM O O ILE A 1 19 . 48.368 25.467 13.905 1.00 37.03 20 A 141 ? 1 +ATOM C CB ILE A 1 19 . 47.483 22.589 13.876 1.00 30.56 20 A 142 ? 1 +ATOM C CG1 ILE A 1 19 . 46.799 21.381 14.463 1.00 31.84 20 A 143 ? 1 +ATOM C CG2 ILE A 1 19 . 48.624 22.089 12.983 1.00 24.76 20 A 144 ? 1 +ATOM C CD1 ILE A 1 19 . 45.808 20.747 13.493 1.00 38.70 20 A 145 ? 1 +ATOM N N GLY A 1 20 . 50.251 24.394 14.655 1.00 30.69 21 A 146 ? 1 +ATOM C CA GLY A 1 20 . 51.207 25.369 14.157 1.00 32.35 21 A 147 ? 1 +ATOM C C GLY A 1 20 . 51.374 25.328 12.582 1.00 39.27 21 A 148 ? 1 +ATOM O O GLY A 1 20 . 50.569 24.801 11.808 1.00 30.45 21 A 149 ? 1 +ATOM N N ALA A 1 21 . 52.457 25.864 12.058 1.00 34.53 22 A 150 ? 1 +ATOM C CA ALA A 1 21 . 52.582 25.832 10.620 1.00 36.11 22 A 151 ? 1 +ATOM C C ALA A 1 21 . 53.019 24.479 10.026 1.00 36.05 22 A 152 ? 1 +ATOM O O ALA A 1 21 . 53.780 23.683 10.565 1.00 35.69 22 A 153 ? 1 +ATOM C CB ALA A 1 21 . 53.558 26.909 10.223 1.00 37.96 22 A 154 ? 1 +ATOM N N VAL A 1 22 . 52.511 24.218 8.853 1.00 34.06 23 A 155 ? 1 +ATOM C CA VAL A 1 22 . 52.870 23.003 8.128 1.00 36.19 23 A 156 ? 1 +ATOM C C VAL A 1 22 . 54.141 23.181 7.246 1.00 45.63 23 A 157 ? 1 +ATOM O O VAL A 1 22 . 54.196 23.944 6.281 1.00 42.02 23 A 158 ? 1 +ATOM C CB VAL A 1 22 . 51.664 22.597 7.276 1.00 34.67 23 A 159 ? 1 +ATOM C CG1 VAL A 1 22 . 51.969 21.335 6.466 1.00 28.48 23 A 160 ? 1 +ATOM C CG2 VAL A 1 22 . 50.477 22.416 8.237 1.00 34.70 23 A 161 ? 1 +ATOM N N ASN A 1 23 . 55.215 22.486 7.550 1.00 43.74 24 A 162 ? 1 +ATOM C CA ASN A 1 23 . 56.386 22.656 6.719 1.00 39.44 24 A 163 ? 1 +ATOM C C ASN A 1 23 . 56.193 22.103 5.306 1.00 44.08 24 A 164 ? 1 +ATOM O O ASN A 1 23 . 55.099 21.632 4.935 1.00 35.40 24 A 165 ? 1 +ATOM C CB ASN A 1 23 . 57.661 22.160 7.392 1.00 27.38 24 A 166 ? 1 +ATOM C CG ASN A 1 23 . 57.763 20.661 7.506 1.00 38.08 24 A 167 ? 1 +ATOM O OD1 ASN A 1 23 . 57.176 19.853 6.740 1.00 41.32 24 A 168 ? 1 +ATOM N ND2 ASN A 1 23 . 58.566 20.286 8.474 1.00 32.83 24 A 169 ? 1 +ATOM N N SER A 1 24 . 57.286 22.234 4.545 1.00 44.70 25 A 170 ? 1 +ATOM C CA SER A 1 24 . 57.396 21.858 3.136 1.00 45.91 25 A 171 ? 1 +ATOM C C SER A 1 24 . 57.125 20.390 2.970 1.00 51.56 25 A 172 ? 1 +ATOM O O SER A 1 24 . 56.342 19.982 2.091 1.00 57.47 25 A 173 ? 1 +ATOM C CB SER A 1 24 . 58.785 22.193 2.599 1.00 50.08 25 A 174 ? 1 +ATOM O OG SER A 1 24 . 58.850 21.894 1.229 1.00 79.43 25 A 175 ? 1 +ATOM N N ARG A 1 25 . 57.764 19.620 3.863 1.00 41.82 26 A 176 ? 1 +ATOM C CA ARG A 1 25 . 57.625 18.171 3.915 1.00 40.41 26 A 177 ? 1 +ATOM C C ARG A 1 25 . 56.198 17.722 4.261 1.00 37.82 26 A 178 ? 1 +ATOM O O ARG A 1 25 . 55.876 16.568 4.126 1.00 38.67 26 A 179 ? 1 +ATOM C CB ARG A 1 25 . 58.575 17.582 4.963 1.00 40.00 26 A 180 ? 1 +ATOM C CG ARG A 1 25 . 60.075 17.726 4.675 1.00 48.63 26 A 181 ? 1 +ATOM C CD ARG A 1 25 . 60.985 17.534 5.914 1.00 45.72 26 A 182 ? 1 +ATOM N NE ARG A 1 25 . 61.276 18.760 6.647 0.00 54.72 26 A 183 ? 1 +ATOM C CZ ARG A 1 25 . 62.091 18.802 7.699 0.00 68.95 26 A 184 ? 1 +ATOM N NH1 ARG A 1 25 . 62.703 17.714 8.157 0.00 56.30 26 A 185 ? 1 +ATOM N NH2 ARG A 1 25 . 62.301 19.965 8.306 0.00 55.71 26 A 186 ? 1 +ATOM N N GLY A 1 26 . 55.353 18.611 4.767 1.00 32.01 27 A 187 ? 1 +ATOM C CA GLY A 1 26 . 54.012 18.231 5.159 1.00 30.14 27 A 188 ? 1 +ATOM C C GLY A 1 26 . 53.918 18.004 6.692 1.00 34.47 27 A 189 ? 1 +ATOM O O GLY A 1 26 . 52.853 17.595 7.234 1.00 30.92 27 A 190 ? 1 +ATOM N N GLU A 1 27 . 55.002 18.362 7.406 1.00 29.86 28 A 191 ? 1 +ATOM C CA GLU A 1 27 . 54.969 18.203 8.865 1.00 29.66 28 A 192 ? 1 +ATOM C C GLU A 1 27 . 54.412 19.313 9.771 1.00 31.81 28 A 193 ? 1 +ATOM O O GLU A 1 27 . 54.519 20.505 9.490 1.00 29.96 28 A 194 ? 1 +ATOM C CB GLU A 1 27 . 56.265 17.640 9.370 1.00 30.93 28 A 195 ? 1 +ATOM C CG GLU A 1 27 . 56.953 16.840 8.268 1.00 55.00 28 A 196 ? 1 +ATOM C CD GLU A 1 27 . 58.405 16.707 8.572 1.00 69.97 28 A 197 ? 1 +ATOM O OE1 GLU A 1 27 . 58.957 17.433 9.370 1.00 63.11 28 A 198 ? 1 +ATOM O OE2 GLU A 1 27 . 59.006 15.790 7.862 1.00 56.23 28 A 199 ? 1 +ATOM N N PHE A 1 28 . 53.791 18.913 10.900 1.00 29.69 29 A 200 ? 1 +ATOM C CA PHE A 1 28 . 53.242 19.899 11.852 1.00 26.05 29 A 201 ? 1 +ATOM C C PHE A 1 28 . 53.215 19.411 13.257 1.00 27.35 29 A 202 ? 1 +ATOM O O PHE A 1 28 . 53.266 18.195 13.508 1.00 26.82 29 A 203 ? 1 +ATOM C CB PHE A 1 28 . 51.830 20.364 11.552 1.00 25.99 29 A 204 ? 1 +ATOM C CG PHE A 1 28 . 50.854 19.239 11.425 1.00 26.72 29 A 205 ? 1 +ATOM C CD1 PHE A 1 28 . 50.165 18.790 12.553 1.00 30.82 29 A 206 ? 1 +ATOM C CD2 PHE A 1 28 . 50.589 18.656 10.175 1.00 24.59 29 A 207 ? 1 +ATOM C CE1 PHE A 1 28 . 49.234 17.755 12.428 1.00 31.70 29 A 208 ? 1 +ATOM C CE2 PHE A 1 28 . 49.699 17.594 10.035 1.00 25.91 29 A 209 ? 1 +ATOM C CZ PHE A 1 28 . 49.014 17.166 11.172 1.00 28.36 29 A 210 ? 1 +ATOM N N THR A 1 29 . 53.063 20.396 14.142 1.00 28.87 30 A 211 ? 1 +ATOM C CA THR A 1 29 . 52.965 20.186 15.585 1.00 31.44 30 A 212 ? 1 +ATOM C C THR A 1 29 . 51.860 21.066 16.157 1.00 30.64 30 A 213 ? 1 +ATOM O O THR A 1 29 . 51.404 22.008 15.528 1.00 30.90 30 A 214 ? 1 +ATOM C CB THR A 1 29 . 54.288 20.495 16.371 1.00 47.86 30 A 215 ? 1 +ATOM O OG1 THR A 1 29 . 55.365 20.013 15.634 1.00 79.73 30 A 216 ? 1 +ATOM C CG2 THR A 1 29 . 54.317 19.805 17.737 1.00 37.39 30 A 217 ? 1 +ATOM N N GLY A 1 30 . 51.482 20.814 17.416 1.00 27.75 31 A 218 ? 1 +ATOM C CA GLY A 1 30 . 50.440 21.614 18.003 1.00 26.88 31 A 219 ? 1 +ATOM C C GLY A 1 30 . 50.201 21.108 19.387 1.00 29.44 31 A 220 ? 1 +ATOM O O GLY A 1 30 . 51.007 20.381 19.972 1.00 26.17 31 A 221 ? 1 +ATOM N N THR A 1 31 . 49.067 21.493 19.906 1.00 30.17 32 A 222 ? 1 +ATOM C CA THR A 1 31 . 48.742 21.128 21.259 1.00 29.87 32 A 223 ? 1 +ATOM C C THR A 1 31 . 47.313 20.697 21.288 1.00 30.46 32 A 224 ? 1 +ATOM O O THR A 1 31 . 46.487 21.313 20.606 1.00 28.53 32 A 225 ? 1 +ATOM C CB THR A 1 31 . 48.773 22.427 22.111 1.00 39.71 32 A 226 ? 1 +ATOM O OG1 THR A 1 31 . 50.097 22.895 22.311 1.00 40.16 32 A 227 ? 1 +ATOM C CG2 THR A 1 31 . 48.068 22.172 23.440 1.00 41.60 32 A 228 ? 1 +ATOM N N TYR A 1 32 . 47.040 19.708 22.128 1.00 26.63 33 A 229 ? 1 +ATOM C CA TYR A 1 32 . 45.680 19.203 22.326 1.00 29.41 33 A 230 ? 1 +ATOM C C TYR A 1 32 . 45.197 19.550 23.741 1.00 32.07 33 A 231 ? 1 +ATOM O O TYR A 1 32 . 45.834 19.166 24.701 1.00 28.72 33 A 232 ? 1 +ATOM C CB TYR A 1 32 . 45.610 17.682 22.134 1.00 27.70 33 A 233 ? 1 +ATOM C CG TYR A 1 32 . 44.254 17.186 21.706 1.00 27.62 33 A 234 ? 1 +ATOM C CD1 TYR A 1 32 . 43.928 17.076 20.345 1.00 28.02 33 A 235 ? 1 +ATOM C CD2 TYR A 1 32 . 43.315 16.789 22.661 1.00 27.07 33 A 236 ? 1 +ATOM C CE1 TYR A 1 32 . 42.697 16.549 19.921 1.00 24.61 33 A 237 ? 1 +ATOM C CE2 TYR A 1 32 . 42.074 16.281 22.257 1.00 31.83 33 A 238 ? 1 +ATOM C CZ TYR A 1 32 . 41.775 16.158 20.895 1.00 27.34 33 A 239 ? 1 +ATOM O OH TYR A 1 32 . 40.565 15.681 20.517 1.00 30.69 33 A 240 ? 1 +ATOM N N ILE A 1 33 . 44.070 20.283 23.821 1.00 33.18 34 A 241 ? 1 +ATOM C CA ILE A 1 33 . 43.496 20.746 25.074 1.00 39.57 34 A 242 ? 1 +ATOM C C ILE A 1 33 . 42.167 20.057 25.300 1.00 45.93 34 A 243 ? 1 +ATOM O O ILE A 1 33 . 41.286 20.170 24.443 1.00 41.21 34 A 244 ? 1 +ATOM C CB ILE A 1 33 . 43.306 22.272 25.084 1.00 44.10 34 A 245 ? 1 +ATOM C CG1 ILE A 1 33 . 44.665 22.957 25.089 1.00 45.79 34 A 246 ? 1 +ATOM C CG2 ILE A 1 33 . 42.518 22.686 26.322 0.00 44.77 34 A 247 ? 1 +ATOM C CD1 ILE A 1 33 . 44.593 24.425 24.686 0.00 52.65 34 A 248 ? 1 +ATOM N N THR A 1 34 . 42.036 19.343 26.431 1.00 47.46 35 A 249 ? 1 +ATOM C CA THR A 1 34 . 40.798 18.590 26.690 1.00 50.22 35 A 250 ? 1 +ATOM C C THR A 1 34 . 40.137 18.678 28.070 1.00 52.46 35 A 251 ? 1 +ATOM O O THR A 1 34 . 40.766 19.133 29.006 1.00 56.46 35 A 252 ? 1 +ATOM C CB THR A 1 34 . 41.040 17.141 26.381 1.00 50.58 35 A 253 ? 1 +ATOM O OG1 THR A 1 34 . 39.760 16.541 26.389 1.00 72.65 35 A 254 ? 1 +ATOM C CG2 THR A 1 34 . 41.891 16.667 27.539 1.00 40.62 35 A 255 ? 1 +ATOM N N ALA A 1 35 . 38.901 18.209 28.196 0.00 49.66 36 A 256 ? 1 +ATOM C CA ALA A 1 35 . 38.229 18.263 29.482 0.00 49.74 36 A 257 ? 1 +ATOM C C ALA A 1 35 . 37.577 16.949 29.885 0.00 54.04 36 A 258 ? 1 +ATOM O O ALA A 1 35 . 36.960 16.850 30.945 0.00 53.58 36 A 259 ? 1 +ATOM C CB ALA A 1 35 . 37.229 19.407 29.527 0.00 50.47 36 A 260 ? 1 +ATOM N N VAL A 1 36 . 37.715 15.938 29.032 0.00 50.92 37 A 261 ? 1 +ATOM C CA VAL A 1 36 . 37.132 14.638 29.304 0.00 50.85 37 A 262 ? 1 +ATOM C C VAL A 1 36 . 37.991 13.493 28.794 0.00 54.37 37 A 263 ? 1 +ATOM O O VAL A 1 36 . 38.504 13.531 27.677 0.00 53.93 37 A 264 ? 1 +ATOM C CB VAL A 1 36 . 35.708 14.534 28.769 0.00 54.96 37 A 265 ? 1 +ATOM C CG1 VAL A 1 36 . 35.192 15.917 28.389 0.00 54.80 37 A 266 ? 1 +ATOM C CG2 VAL A 1 36 . 35.675 13.615 27.555 0.00 54.81 37 A 267 ? 1 +ATOM N N THR A 1 37 . 38.132 12.468 29.632 0.00 50.58 38 A 268 ? 1 +ATOM C CA THR A 1 37 . 38.915 11.294 29.299 0.00 50.17 38 A 269 ? 1 +ATOM C C THR A 1 37 . 39.059 10.351 30.483 0.00 53.22 38 A 270 ? 1 +ATOM O O THR A 1 37 . 38.843 9.147 30.366 0.00 52.79 38 A 271 ? 1 +ATOM C CB THR A 1 37 . 40.294 11.657 28.717 0.00 58.50 38 A 272 ? 1 +ATOM O OG1 THR A 1 37 . 40.938 10.493 28.239 0.00 58.16 38 A 273 ? 1 +ATOM C CG2 THR A 1 37 . 41.150 12.324 29.786 0.00 57.18 38 A 274 ? 1 +ATOM N N ALA A 1 38 . 39.433 10.917 31.629 0.00 49.05 39 A 275 ? 1 +ATOM C CA ALA A 1 38 . 39.614 10.135 32.837 0.00 48.43 39 A 276 ? 1 +ATOM C C ALA A 1 38 . 39.803 10.993 34.080 0.00 50.67 39 A 277 ? 1 +ATOM O O ALA A 1 38 . 39.202 10.735 35.122 0.00 50.22 39 A 278 ? 1 +ATOM C CB ALA A 1 38 . 40.756 9.145 32.677 0.00 49.22 39 A 279 ? 1 +ATOM N N THR A 1 39 . 40.649 12.016 33.968 0.00 45.88 40 A 280 ? 1 +ATOM C CA THR A 1 39 . 40.928 12.908 35.082 0.00 44.99 40 A 281 ? 1 +ATOM C C THR A 1 39 . 41.912 14.002 34.687 0.00 46.89 40 A 282 ? 1 +ATOM O O THR A 1 39 . 42.509 13.935 33.613 0.00 46.46 40 A 283 ? 1 +ATOM C CB THR A 1 39 . 41.400 12.118 36.318 0.00 53.22 40 A 284 ? 1 +ATOM O OG1 THR A 1 39 . 40.420 12.172 37.334 0.00 52.86 40 A 285 ? 1 +ATOM C CG2 THR A 1 39 . 42.731 12.651 36.833 0.00 51.88 40 A 286 ? 1 +ATOM N N SER A 1 40 . 42.085 15.018 35.539 0.00 41.76 41 A 287 ? 1 +ATOM C CA SER A 1 40 . 43.001 16.089 35.190 0.00 40.70 41 A 288 ? 1 +ATOM C C SER A 1 40 . 43.234 17.139 36.276 0.00 42.15 41 A 289 ? 1 +ATOM O O SER A 1 40 . 44.373 17.421 36.647 0.00 41.65 41 A 290 ? 1 +ATOM C CB SER A 1 40 . 42.536 16.762 33.911 0.00 44.32 41 A 291 ? 1 +ATOM O OG SER A 1 40 . 42.969 16.024 32.785 0.00 53.17 41 A 292 ? 1 +ATOM N N ASN A 1 41 . 42.128 17.711 36.745 0.00 36.87 42 A 293 ? 1 +ATOM C CA ASN A 1 41 . 41.997 18.779 37.736 1.00 35.76 42 A 294 ? 1 +ATOM C C ASN A 1 41 . 40.849 19.623 37.156 1.00 55.40 42 A 295 ? 1 +ATOM O O ASN A 1 41 . 39.720 19.603 37.645 0.00 55.02 42 A 296 ? 1 +ATOM C CB ASN A 1 41 . 43.280 19.618 37.931 0.00 36.68 42 A 297 ? 1 +ATOM C CG ASN A 1 41 . 43.881 20.160 36.646 0.00 59.92 42 A 298 ? 1 +ATOM O OD1 ASN A 1 41 . 43.347 21.098 36.037 0.00 54.31 42 A 299 ? 1 +ATOM N ND2 ASN A 1 41 . 45.011 19.586 36.242 0.00 51.85 42 A 300 ? 1 +ATOM N N GLU A 1 42 . 41.182 20.346 36.057 1.00 63.10 43 A 301 ? 1 +ATOM C CA GLU A 1 42 . 40.296 21.175 35.174 1.00 68.13 43 A 302 ? 1 +ATOM C C GLU A 1 42 . 40.643 21.022 33.650 1.00 71.42 43 A 303 ? 1 +ATOM O O GLU A 1 42 . 40.129 20.083 32.987 1.00 71.43 43 A 304 ? 1 +ATOM C CB GLU A 1 42 . 39.941 22.637 35.586 1.00 69.85 43 A 305 ? 1 +ATOM C CG GLU A 1 42 . 38.775 23.230 34.775 0.00 80.25 43 A 306 ? 1 +ATOM C CD GLU A 1 42 . 37.554 22.356 34.783 0.00 100.00 43 A 307 ? 1 +ATOM O OE1 GLU A 1 42 . 37.047 22.200 35.981 0.00 93.88 43 A 308 ? 1 +ATOM O OE2 GLU A 1 42 . 37.096 21.841 33.780 0.00 94.14 43 A 309 ? 1 +ATOM N N ILE A 1 43 . 41.534 21.901 33.097 1.00 60.36 44 A 310 ? 1 +ATOM C CA ILE A 1 43 . 41.923 21.856 31.668 1.00 56.18 44 A 311 ? 1 +ATOM C C ILE A 1 43 . 43.353 21.360 31.527 1.00 64.05 44 A 312 ? 1 +ATOM O O ILE A 1 43 . 44.221 21.894 32.220 1.00 70.44 44 A 313 ? 1 +ATOM C CB ILE A 1 43 . 41.654 23.157 30.862 1.00 53.50 44 A 314 ? 1 +ATOM C CG1 ILE A 1 43 . 40.240 23.653 31.137 0.00 53.98 44 A 315 ? 1 +ATOM C CG2 ILE A 1 43 . 41.832 22.892 29.372 0.00 54.23 44 A 316 ? 1 +ATOM C CD1 ILE A 1 43 . 39.651 24.449 29.976 0.00 61.43 44 A 317 ? 1 +ATOM N N LYS A 1 44 . 43.593 20.348 30.655 1.00 54.91 45 A 318 ? 1 +ATOM C CA LYS A 1 44 . 44.946 19.792 30.416 1.00 53.44 45 A 319 ? 1 +ATOM C C LYS A 1 44 . 45.427 19.885 28.951 1.00 48.49 45 A 320 ? 1 +ATOM O O LYS A 1 44 . 44.635 19.758 27.988 1.00 45.96 45 A 321 ? 1 +ATOM C CB LYS A 1 44 . 45.406 18.505 31.189 1.00 55.14 45 A 322 ? 1 +ATOM C CG LYS A 1 44 . 44.700 18.205 32.522 1.00 49.95 45 A 323 ? 1 +ATOM C CD LYS A 1 44 . 45.582 18.407 33.755 1.00 53.52 45 A 324 ? 1 +ATOM C CE LYS A 1 44 . 46.027 17.098 34.386 0.00 64.88 45 A 325 ? 1 +ATOM N NZ LYS A 1 44 . 47.221 16.528 33.745 0.00 74.37 45 A 326 ? 1 +ATOM N N GLU A 1 45 . 46.751 20.084 28.822 1.00 32.91 46 A 327 ? 1 +ATOM C CA GLU A 1 45 . 47.330 20.281 27.558 1.00 30.47 46 A 328 ? 1 +ATOM C C GLU A 1 45 . 48.416 19.270 27.239 1.00 37.87 46 A 329 ? 1 +ATOM O O GLU A 1 45 . 49.247 18.973 28.078 1.00 38.87 46 A 330 ? 1 +ATOM C CB GLU A 1 45 . 47.735 21.760 27.494 1.00 31.19 46 A 331 ? 1 +ATOM C CG GLU A 1 45 . 48.938 22.097 26.582 1.00 64.23 46 A 332 ? 1 +ATOM C CD GLU A 1 45 . 49.413 23.554 26.561 1.00 55.65 46 A 333 ? 1 +ATOM O OE1 GLU A 1 45 . 48.445 24.434 26.669 1.00 64.16 46 A 334 ? 1 +ATOM O OE2 GLU A 1 45 . 50.584 23.861 26.445 0.00 49.72 46 A 335 ? 1 +ATOM N N SER A 1 46 . 48.333 18.683 26.023 1.00 29.38 47 A 336 ? 1 +ATOM C CA SER A 1 46 . 49.298 17.707 25.480 1.00 24.47 47 A 337 ? 1 +ATOM C C SER A 1 46 . 49.680 18.030 24.049 1.00 26.06 47 A 338 ? 1 +ATOM O O SER A 1 46 . 48.945 18.679 23.320 1.00 31.24 47 A 339 ? 1 +ATOM C CB SER A 1 46 . 48.956 16.254 25.668 1.00 26.20 47 A 340 ? 1 +ATOM O OG SER A 1 46 . 48.350 16.011 26.955 1.00 40.16 47 A 341 ? 1 +ATOM N N PRO A 1 47 . 50.898 17.699 23.708 1.00 25.00 48 A 342 ? 1 +ATOM C CA PRO A 1 47 . 51.437 17.963 22.386 1.00 27.29 48 A 343 ? 1 +ATOM C C PRO A 1 47 . 50.959 16.923 21.376 1.00 30.68 48 A 344 ? 1 +ATOM O O PRO A 1 47 . 50.661 15.747 21.724 1.00 28.71 48 A 345 ? 1 +ATOM C CB PRO A 1 47 . 52.973 17.777 22.539 1.00 24.44 48 A 346 ? 1 +ATOM C CG PRO A 1 47 . 53.143 16.900 23.766 1.00 25.34 48 A 347 ? 1 +ATOM C CD PRO A 1 47 . 51.889 17.020 24.591 1.00 21.19 48 A 348 ? 1 +ATOM N N LEU A 1 48 . 50.908 17.365 20.131 1.00 30.00 49 A 349 ? 1 +ATOM C CA LEU A 1 48 . 50.552 16.499 18.973 1.00 30.98 49 A 350 ? 1 +ATOM C C LEU A 1 48 . 51.561 16.689 17.850 1.00 30.07 49 A 351 ? 1 +ATOM O O LEU A 1 48 . 52.173 17.749 17.730 1.00 30.91 49 A 352 ? 1 +ATOM C CB LEU A 1 48 . 49.104 16.627 18.497 1.00 27.92 49 A 353 ? 1 +ATOM C CG LEU A 1 48 . 48.861 17.991 17.906 1.00 26.53 49 A 354 ? 1 +ATOM C CD1 LEU A 1 48 . 49.144 17.885 16.423 1.00 21.32 49 A 355 ? 1 +ATOM C CD2 LEU A 1 48 . 47.407 18.411 18.132 1.00 27.91 49 A 356 ? 1 +ATOM N N HIS A 1 49 . 51.811 15.619 17.135 1.00 25.27 50 A 357 ? 1 +ATOM C CA HIS A 1 49 . 52.796 15.517 16.036 1.00 30.89 50 A 358 ? 1 +ATOM C C HIS A 1 49 . 52.124 14.805 14.864 1.00 30.97 50 A 359 ? 1 +ATOM O O HIS A 1 49 . 51.569 13.695 15.021 1.00 26.52 50 A 360 ? 1 +ATOM C CB HIS A 1 49 . 54.184 14.857 16.363 1.00 34.93 50 A 361 ? 1 +ATOM C CG HIS A 1 49 . 54.784 15.438 17.633 1.00 45.17 50 A 362 ? 1 +ATOM N ND1 HIS A 1 49 . 54.332 15.072 18.919 1.00 47.34 50 A 363 ? 1 +ATOM C CD2 HIS A 1 49 . 55.755 16.399 17.810 1.00 50.20 50 A 364 ? 1 +ATOM C CE1 HIS A 1 49 . 55.034 15.777 19.814 1.00 48.22 50 A 365 ? 1 +ATOM N NE2 HIS A 1 49 . 55.900 16.571 19.184 1.00 49.94 50 A 366 ? 1 +ATOM N N GLY A 1 50 . 52.152 15.484 13.712 1.00 28.83 51 A 367 ? 1 +ATOM C CA GLY A 1 50 . 51.505 14.883 12.552 1.00 33.43 51 A 368 ? 1 +ATOM C C GLY A 1 50 . 52.024 15.304 11.183 1.00 36.15 51 A 369 ? 1 +ATOM O O GLY A 1 50 . 53.016 16.034 11.004 1.00 30.93 51 A 370 ? 1 +ATOM N N THR A 1 51 . 51.321 14.760 10.236 1.00 32.75 52 A 371 ? 1 +ATOM C CA THR A 1 51 . 51.644 14.966 8.874 1.00 33.20 52 A 372 ? 1 +ATOM C C THR A 1 51 . 50.417 15.156 7.976 1.00 33.38 52 A 373 ? 1 +ATOM O O THR A 1 51 . 49.355 14.585 8.194 1.00 29.18 52 A 374 ? 1 +ATOM C CB THR A 1 51 . 52.493 13.733 8.465 1.00 43.38 52 A 375 ? 1 +ATOM O OG1 THR A 1 51 . 53.190 14.071 7.317 1.00 63.86 52 A 376 ? 1 +ATOM C CG2 THR A 1 51 . 51.685 12.485 8.172 1.00 28.66 52 A 377 ? 1 +ATOM N N GLU A 1 52 . 50.583 15.966 6.933 1.00 26.90 53 A 378 ? 1 +ATOM C CA GLU A 1 52 . 49.554 16.195 5.929 1.00 25.54 53 A 379 ? 1 +ATOM C C GLU A 1 52 . 50.023 15.520 4.641 1.00 27.48 53 A 380 ? 1 +ATOM O O GLU A 1 52 . 51.200 15.612 4.298 1.00 26.24 53 A 381 ? 1 +ATOM C CB GLU A 1 52 . 49.454 17.709 5.753 1.00 28.62 53 A 382 ? 1 +ATOM C CG GLU A 1 52 . 48.498 18.204 4.693 1.00 38.87 53 A 383 ? 1 +ATOM C CD GLU A 1 52 . 48.533 19.717 4.545 1.00 32.73 53 A 384 ? 1 +ATOM O OE1 GLU A 1 52 . 48.333 20.486 5.464 1.00 65.86 53 A 385 ? 1 +ATOM O OE2 GLU A 1 52 . 48.550 20.086 3.302 1.00 61.66 53 A 386 ? 1 +ATOM N N ASN A 1 53 . 49.178 14.727 3.977 1.00 27.70 54 A 387 ? 1 +ATOM C CA ASN A 1 53 . 49.651 14.089 2.748 1.00 25.38 54 A 388 ? 1 +ATOM C C ASN A 1 53 . 49.682 15.137 1.643 1.00 31.24 54 A 389 ? 1 +ATOM O O ASN A 1 53 . 48.714 15.801 1.371 1.00 33.32 54 A 390 ? 1 +ATOM C CB ASN A 1 53 . 48.761 12.926 2.305 1.00 29.88 54 A 391 ? 1 +ATOM C CG ASN A 1 53 . 49.291 12.158 1.118 1.00 39.71 54 A 392 ? 1 +ATOM O OD1 ASN A 1 53 . 49.578 10.940 1.206 1.00 35.04 54 A 393 ? 1 +ATOM N ND2 ASN A 1 53 . 49.324 12.868 -0.013 1.00 26.58 54 A 394 ? 1 +ATOM N N THR A 1 54 . 50.819 15.277 1.034 1.00 29.95 55 A 395 ? 1 +ATOM C CA THR A 1 54 . 51.027 16.278 -0.004 1.00 39.40 55 A 396 ? 1 +ATOM C C THR A 1 54 . 50.953 15.775 -1.482 1.00 43.32 55 A 397 ? 1 +ATOM O O THR A 1 54 . 51.066 16.573 -2.402 1.00 43.77 55 A 398 ? 1 +ATOM C CB THR A 1 54 . 52.350 17.062 0.303 1.00 43.13 55 A 399 ? 1 +ATOM O OG1 THR A 1 54 . 52.493 18.135 -0.589 1.00 82.61 55 A 400 ? 1 +ATOM C CG2 THR A 1 54 . 53.569 16.150 0.145 1.00 27.04 55 A 401 ? 1 +ATOM N N ILE A 1 55 . 50.766 14.478 -1.708 1.00 36.89 56 A 402 ? 1 +ATOM C CA ILE A 1 55 . 50.701 13.885 -3.032 1.00 35.05 56 A 403 ? 1 +ATOM C C ILE A 1 55 . 49.602 14.499 -3.868 1.00 36.22 56 A 404 ? 1 +ATOM O O ILE A 1 55 . 48.490 14.702 -3.430 1.00 31.17 56 A 405 ? 1 +ATOM C CB ILE A 1 55 . 50.584 12.379 -2.937 1.00 40.44 56 A 406 ? 1 +ATOM C CG1 ILE A 1 55 . 51.749 11.776 -2.110 1.00 44.37 56 A 407 ? 1 +ATOM C CG2 ILE A 1 55 . 50.436 11.739 -4.306 1.00 31.41 56 A 408 ? 1 +ATOM C CD1 ILE A 1 55 . 53.149 12.147 -2.603 1.00 38.92 56 A 409 ? 1 +ATOM N N ASN A 1 56 . 49.944 14.872 -5.112 1.00 39.24 57 A 410 ? 1 +ATOM C CA ASN A 1 56 . 49.028 15.556 -6.038 1.00 35.81 57 A 411 ? 1 +ATOM C C ASN A 1 56 . 48.621 16.909 -5.522 1.00 38.13 57 A 412 ? 1 +ATOM O O ASN A 1 56 . 47.640 17.481 -5.961 1.00 34.69 57 A 413 ? 1 +ATOM C CB ASN A 1 56 . 47.826 14.727 -6.550 1.00 31.72 57 A 414 ? 1 +ATOM C CG ASN A 1 56 . 48.362 13.596 -7.430 1.00 39.57 57 A 415 ? 1 +ATOM O OD1 ASN A 1 56 . 49.373 13.712 -8.124 1.00 47.58 57 A 416 ? 1 +ATOM N ND2 ASN A 1 56 . 47.890 12.411 -7.183 1.00 38.03 57 A 417 ? 1 +ATOM N N LYS A 1 57 . 49.360 17.440 -4.563 1.00 37.68 58 A 418 ? 1 +ATOM C CA LYS A 1 57 . 48.949 18.729 -4.053 1.00 42.78 58 A 419 ? 1 +ATOM C C LYS A 1 57 . 47.394 18.918 -4.028 1.00 44.86 58 A 420 ? 1 +ATOM O O LYS A 1 57 . 46.783 19.871 -4.572 1.00 39.14 58 A 421 ? 1 +ATOM C CB LYS A 1 57 . 49.753 19.849 -4.718 1.00 52.95 58 A 422 ? 1 +ATOM C CG LYS A 1 57 . 51.212 19.869 -4.292 0.00 67.78 58 A 423 ? 1 +ATOM C CD LYS A 1 57 . 52.072 18.904 -5.091 0.00 77.95 58 A 424 ? 1 +ATOM C CE LYS A 1 57 . 53.426 18.647 -4.451 0.00 89.09 58 A 425 ? 1 +ATOM N NZ LYS A 1 57 . 53.443 17.444 -3.607 0.00 98.47 58 A 426 ? 1 +ATOM N N ARG A 1 58 . 46.717 17.996 -3.315 1.00 38.58 59 A 427 ? 1 +ATOM C CA ARG A 1 58 . 45.276 18.055 -3.209 1.00 35.65 59 A 428 ? 1 +ATOM C C ARG A 1 58 . 44.790 19.224 -2.373 1.00 38.79 59 A 429 ? 1 +ATOM O O ARG A 1 58 . 45.443 19.704 -1.432 1.00 40.56 59 A 430 ? 1 +ATOM C CB ARG A 1 58 . 44.682 16.717 -2.753 1.00 46.93 59 A 431 ? 1 +ATOM C CG ARG A 1 58 . 44.963 15.557 -3.723 1.00 57.26 59 A 432 ? 1 +ATOM C CD ARG A 1 58 . 44.033 15.563 -4.955 1.00 51.03 59 A 433 ? 1 +ATOM N NE ARG A 1 58 . 42.880 14.652 -4.836 1.00 82.91 59 A 434 ? 1 +ATOM C CZ ARG A 1 58 . 41.600 14.944 -5.096 1.00 90.05 59 A 435 ? 1 +ATOM N NH1 ARG A 1 58 . 41.211 16.147 -5.498 0.00 77.22 59 A 436 ? 1 +ATOM N NH2 ARG A 1 58 . 40.681 13.996 -4.932 0.00 76.63 59 A 437 ? 1 +ATOM N N THR A 1 59 . 43.594 19.662 -2.719 1.00 37.52 60 A 438 ? 1 +ATOM C CA THR A 1 59 . 42.927 20.775 -2.045 1.00 37.64 60 A 439 ? 1 +ATOM C C THR A 1 59 . 42.283 20.388 -0.701 1.00 35.96 60 A 440 ? 1 +ATOM O O THR A 1 59 . 42.091 21.185 0.224 1.00 32.46 60 A 441 ? 1 +ATOM C CB THR A 1 59 . 41.878 21.259 -3.074 1.00 45.18 60 A 442 ? 1 +ATOM O OG1 THR A 1 59 . 42.256 22.505 -3.627 1.00 52.52 60 A 443 ? 1 +ATOM C CG2 THR A 1 59 . 40.472 21.293 -2.541 1.00 43.56 60 A 444 ? 1 +ATOM N N GLN A 1 60 . 41.912 19.126 -0.642 1.00 30.41 61 A 445 ? 1 +ATOM C CA GLN A 1 60 . 41.277 18.529 0.531 1.00 32.81 61 A 446 ? 1 +ATOM C C GLN A 1 60 . 42.020 17.281 0.943 1.00 32.35 61 A 447 ? 1 +ATOM O O GLN A 1 60 . 41.600 16.162 0.688 1.00 32.79 61 A 448 ? 1 +ATOM C CB GLN A 1 60 . 39.865 18.124 0.145 1.00 35.70 61 A 449 ? 1 +ATOM C CG GLN A 1 60 . 39.002 19.353 -0.164 1.00 33.26 61 A 450 ? 1 +ATOM C CD GLN A 1 60 . 37.585 18.863 -0.356 1.00 44.09 61 A 451 ? 1 +ATOM O OE1 GLN A 1 60 . 36.676 19.186 0.408 1.00 44.81 61 A 452 ? 1 +ATOM N NE2 GLN A 1 60 . 37.400 17.982 -1.329 1.00 54.13 61 A 453 ? 1 +ATOM N N PRO A 1 61 . 43.172 17.500 1.507 1.00 27.01 62 A 454 ? 1 +ATOM C CA PRO A 1 61 . 44.056 16.432 1.932 1.00 28.35 62 A 455 ? 1 +ATOM C C PRO A 1 61 . 43.642 15.582 3.184 1.00 30.62 62 A 456 ? 1 +ATOM O O PRO A 1 61 . 42.870 15.990 4.112 1.00 27.73 62 A 457 ? 1 +ATOM C CB PRO A 1 61 . 45.369 17.157 2.262 1.00 29.05 62 A 458 ? 1 +ATOM C CG PRO A 1 61 . 45.036 18.657 2.404 1.00 33.66 62 A 459 ? 1 +ATOM C CD PRO A 1 61 . 43.665 18.874 1.790 1.00 28.75 62 A 460 ? 1 +ATOM N N THR A 1 62 . 44.194 14.371 3.132 1.00 25.24 63 A 461 ? 1 +ATOM C CA THR A 1 62 . 44.181 13.417 4.236 1.00 26.78 63 A 462 ? 1 +ATOM C C THR A 1 62 . 45.388 13.809 5.130 1.00 25.22 63 A 463 ? 1 +ATOM O O THR A 1 62 . 46.394 14.480 4.713 1.00 25.50 63 A 464 ? 1 +ATOM C CB THR A 1 62 . 44.268 11.909 3.863 1.00 30.08 63 A 465 ? 1 +ATOM O OG1 THR A 1 62 . 45.589 11.501 3.519 1.00 26.58 63 A 466 ? 1 +ATOM C CG2 THR A 1 62 . 43.294 11.510 2.795 1.00 28.03 63 A 467 ? 1 +ATOM N N PHE A 1 63 . 45.327 13.382 6.384 1.00 28.07 64 A 468 ? 1 +ATOM C CA PHE A 1 63 . 46.349 13.663 7.409 1.00 23.57 64 A 469 ? 1 +ATOM C C PHE A 1 63 . 46.204 12.650 8.543 1.00 29.34 64 A 470 ? 1 +ATOM O O PHE A 1 63 . 45.224 11.925 8.641 1.00 27.81 64 A 471 ? 1 +ATOM C CB PHE A 1 63 . 46.230 15.127 7.968 1.00 19.80 64 A 472 ? 1 +ATOM C CG PHE A 1 63 . 44.877 15.348 8.607 1.00 24.33 64 A 473 ? 1 +ATOM C CD1 PHE A 1 63 . 43.757 15.703 7.836 1.00 22.92 64 A 474 ? 1 +ATOM C CD2 PHE A 1 63 . 44.710 15.105 9.982 1.00 27.71 64 A 475 ? 1 +ATOM C CE1 PHE A 1 63 . 42.496 15.852 8.427 1.00 28.78 64 A 476 ? 1 +ATOM C CE2 PHE A 1 63 . 43.454 15.241 10.593 1.00 25.96 64 A 477 ? 1 +ATOM C CZ PHE A 1 63 . 42.361 15.651 9.814 1.00 29.07 64 A 478 ? 1 +ATOM N N GLY A 1 64 . 47.223 12.652 9.393 1.00 28.10 65 A 479 ? 1 +ATOM C CA GLY A 1 64 . 47.327 11.825 10.546 1.00 24.94 65 A 480 ? 1 +ATOM C C GLY A 1 64 . 48.163 12.564 11.583 1.00 29.95 65 A 481 ? 1 +ATOM O O GLY A 1 64 . 49.051 13.366 11.260 1.00 24.81 65 A 482 ? 1 +ATOM N N PHE A 1 65 . 47.815 12.313 12.846 1.00 26.77 66 A 483 ? 1 +ATOM C CA PHE A 1 65 . 48.547 12.886 13.962 1.00 24.19 66 A 484 ? 1 +ATOM C C PHE A 1 65 . 48.472 11.988 15.196 1.00 23.60 66 A 485 ? 1 +ATOM O O PHE A 1 65 . 47.492 11.314 15.400 1.00 22.82 66 A 486 ? 1 +ATOM C CB PHE A 1 65 . 48.261 14.391 14.229 1.00 19.34 66 A 487 ? 1 +ATOM C CG PHE A 1 65 . 46.878 14.713 14.725 1.00 21.98 66 A 488 ? 1 +ATOM C CD1 PHE A 1 65 . 46.543 14.583 16.084 1.00 23.36 66 A 489 ? 1 +ATOM C CD2 PHE A 1 65 . 45.900 15.200 13.855 1.00 23.41 66 A 490 ? 1 +ATOM C CE1 PHE A 1 65 . 45.276 14.927 16.576 1.00 21.55 66 A 491 ? 1 +ATOM C CE2 PHE A 1 65 . 44.626 15.515 14.343 1.00 32.04 66 A 492 ? 1 +ATOM C CZ PHE A 1 65 . 44.285 15.364 15.695 1.00 26.75 66 A 493 ? 1 +ATOM N N THR A 1 66 . 49.523 12.028 15.992 1.00 21.20 67 A 494 ? 1 +ATOM C CA THR A 1 66 . 49.573 11.324 17.266 1.00 23.30 67 A 495 ? 1 +ATOM C C THR A 1 66 . 49.503 12.351 18.426 1.00 28.45 67 A 496 ? 1 +ATOM O O THR A 1 66 . 50.129 13.421 18.408 1.00 24.81 67 A 497 ? 1 +ATOM C CB THR A 1 66 . 50.879 10.514 17.416 1.00 26.31 67 A 498 ? 1 +ATOM O OG1 THR A 1 66 . 51.067 9.644 16.331 1.00 27.71 67 A 499 ? 1 +ATOM C CG2 THR A 1 66 . 50.792 9.680 18.685 1.00 29.66 67 A 500 ? 1 +ATOM N N VAL A 1 67 . 48.744 12.009 19.467 1.00 28.15 68 A 501 ? 1 +ATOM C CA VAL A 1 67 . 48.618 12.848 20.684 1.00 25.95 68 A 502 ? 1 +ATOM C C VAL A 1 67 . 49.353 12.130 21.820 1.00 34.46 68 A 503 ? 1 +ATOM O O VAL A 1 67 . 48.957 11.036 22.203 1.00 29.59 68 A 504 ? 1 +ATOM C CB VAL A 1 67 . 47.213 13.059 21.212 1.00 27.65 68 A 505 ? 1 +ATOM C CG1 VAL A 1 67 . 47.343 13.858 22.536 1.00 28.57 68 A 506 ? 1 +ATOM C CG2 VAL A 1 67 . 46.278 13.760 20.185 1.00 25.82 68 A 507 ? 1 +ATOM N N ASN A 1 68 . 50.431 12.719 22.324 1.00 33.55 69 A 508 ? 1 +ATOM C CA ASN A 1 68 . 51.204 12.121 23.411 1.00 35.89 69 A 509 ? 1 +ATOM C C ASN A 1 68 . 50.678 12.507 24.809 1.00 36.66 69 A 510 ? 1 +ATOM O O ASN A 1 68 . 51.192 13.454 25.426 1.00 32.96 69 A 511 ? 1 +ATOM C CB ASN A 1 68 . 52.659 12.634 23.261 1.00 33.73 69 A 512 ? 1 +ATOM C CG ASN A 1 68 . 53.619 11.789 24.039 1.00 29.66 69 A 513 ? 1 +ATOM O OD1 ASN A 1 68 . 53.234 10.733 24.585 1.00 28.93 69 A 514 ? 1 +ATOM N ND2 ASN A 1 68 . 54.853 12.238 24.022 1.00 43.43 69 A 515 ? 1 +ATOM N N TRP A 1 69 . 49.623 11.862 25.302 1.00 29.48 70 A 516 ? 1 +ATOM C CA TRP A 1 69 . 49.120 12.330 26.577 1.00 28.00 70 A 517 ? 1 +ATOM C C TRP A 1 69 . 50.150 12.513 27.722 1.00 33.21 70 A 518 ? 1 +ATOM O O TRP A 1 69 . 50.961 11.667 28.060 1.00 32.17 70 A 519 ? 1 +ATOM C CB TRP A 1 69 . 47.986 11.495 27.085 1.00 25.52 70 A 520 ? 1 +ATOM C CG TRP A 1 69 . 47.010 11.245 26.037 1.00 28.53 70 A 521 ? 1 +ATOM C CD1 TRP A 1 69 . 46.817 10.052 25.369 1.00 31.02 70 A 522 ? 1 +ATOM C CD2 TRP A 1 69 . 46.052 12.179 25.560 1.00 29.39 70 A 523 ? 1 +ATOM N NE1 TRP A 1 69 . 45.768 10.168 24.500 1.00 26.04 70 A 524 ? 1 +ATOM C CE2 TRP A 1 69 . 45.281 11.476 24.572 1.00 30.82 70 A 525 ? 1 +ATOM C CE3 TRP A 1 69 . 45.731 13.521 25.904 1.00 30.38 70 A 526 ? 1 +ATOM C CZ2 TRP A 1 69 . 44.201 12.121 23.894 1.00 30.69 70 A 527 ? 1 +ATOM C CZ3 TRP A 1 69 . 44.663 14.131 25.260 1.00 33.31 70 A 528 ? 1 +ATOM C CH2 TRP A 1 69 . 43.925 13.440 24.241 1.00 35.16 70 A 529 ? 1 +ATOM N N LYS A 1 70 . 50.043 13.667 28.384 1.00 31.54 71 A 530 ? 1 +ATOM C CA LYS A 1 70 . 50.884 14.048 29.509 1.00 30.37 71 A 531 ? 1 +ATOM C C LYS A 1 70 . 50.320 13.624 30.897 1.00 38.27 71 A 532 ? 1 +ATOM O O LYS A 1 70 . 51.034 13.688 31.872 1.00 41.52 71 A 533 ? 1 +ATOM C CB LYS A 1 70 . 51.093 15.553 29.453 1.00 26.54 71 A 534 ? 1 +ATOM C CG LYS A 1 70 . 52.226 15.934 28.519 1.00 36.23 71 A 535 ? 1 +ATOM C CD LYS A 1 70 . 52.836 14.714 27.828 1.00 65.05 71 A 536 ? 1 +ATOM C CE LYS A 1 70 . 54.325 14.824 27.521 1.00 45.94 71 A 537 ? 1 +ATOM N NZ LYS A 1 70 . 54.996 13.514 27.396 1.00 84.86 71 A 538 ? 1 +ATOM N N PHE A 1 71 . 49.040 13.222 31.010 1.00 31.60 72 A 539 ? 1 +ATOM C CA PHE A 1 71 . 48.470 12.872 32.286 1.00 32.05 72 A 540 ? 1 +ATOM C C PHE A 1 71 . 48.037 11.468 32.287 1.00 33.45 72 A 541 ? 1 +ATOM O O PHE A 1 71 . 47.250 11.065 33.127 1.00 34.29 72 A 542 ? 1 +ATOM C CB PHE A 1 71 . 47.251 13.761 32.605 1.00 39.51 72 A 543 ? 1 +ATOM C CG PHE A 1 71 . 46.208 13.658 31.501 1.00 48.01 72 A 544 ? 1 +ATOM C CD1 PHE A 1 71 . 46.323 14.424 30.336 1.00 58.63 72 A 545 ? 1 +ATOM C CD2 PHE A 1 71 . 45.132 12.777 31.600 1.00 52.39 72 A 546 ? 1 +ATOM C CE1 PHE A 1 71 . 45.401 14.336 29.289 1.00 59.54 72 A 547 ? 1 +ATOM C CE2 PHE A 1 71 . 44.207 12.661 30.562 1.00 59.87 72 A 548 ? 1 +ATOM C CZ PHE A 1 71 . 44.338 13.442 29.411 1.00 59.46 72 A 549 ? 1 +ATOM N N SER A 1 72 . 48.545 10.708 31.344 1.00 28.33 73 A 550 ? 1 +ATOM C CA SER A 1 72 . 48.190 9.316 31.317 1.00 27.34 73 A 551 ? 1 +ATOM C C SER A 1 72 . 49.230 8.539 30.579 1.00 28.63 73 A 552 ? 1 +ATOM O O SER A 1 72 . 50.075 9.177 29.988 1.00 31.73 73 A 553 ? 1 +ATOM C CB SER A 1 72 . 46.777 9.166 30.827 1.00 27.41 73 A 554 ? 1 +ATOM O OG SER A 1 72 . 46.710 8.287 29.755 1.00 38.39 73 A 555 ? 1 +ATOM N N GLU A 1 73 . 49.193 7.214 30.668 1.00 27.09 74 A 556 ? 1 +ATOM C CA GLU A 1 73 . 50.126 6.309 29.973 1.00 27.77 74 A 557 ? 1 +ATOM C C GLU A 1 73 . 49.626 5.915 28.572 1.00 30.81 74 A 558 ? 1 +ATOM O O GLU A 1 73 . 50.233 5.092 27.909 1.00 26.19 74 A 559 ? 1 +ATOM C CB GLU A 1 73 . 50.329 4.970 30.693 1.00 26.30 74 A 560 ? 1 +ATOM C CG GLU A 1 73 . 50.998 5.218 32.052 1.00 32.69 74 A 561 ? 1 +ATOM C CD GLU A 1 73 . 50.822 4.022 32.919 1.00 48.21 74 A 562 ? 1 +ATOM O OE1 GLU A 1 73 . 50.039 3.126 32.648 1.00 66.88 74 A 563 ? 1 +ATOM O OE2 GLU A 1 73 . 51.530 4.094 34.006 1.00 34.79 74 A 564 ? 1 +ATOM N N SER A 1 74 . 48.506 6.455 28.165 1.00 25.24 75 A 565 ? 1 +ATOM C CA SER A 1 74 . 47.931 6.157 26.873 1.00 29.10 75 A 566 ? 1 +ATOM C C SER A 1 74 . 48.441 7.022 25.703 1.00 28.91 75 A 567 ? 1 +ATOM O O SER A 1 74 . 49.010 8.066 25.861 1.00 29.30 75 A 568 ? 1 +ATOM C CB SER A 1 74 . 46.438 6.458 26.959 1.00 25.30 75 A 569 ? 1 +ATOM O OG SER A 1 74 . 46.057 5.728 28.042 1.00 34.97 75 A 570 ? 1 +ATOM N N THR A 1 75 . 48.072 6.588 24.526 1.00 26.39 76 A 571 ? 1 +ATOM C CA THR A 1 75 . 48.322 7.305 23.309 1.00 27.11 76 A 572 ? 1 +ATOM C C THR A 1 75 . 47.071 7.270 22.416 1.00 31.78 76 A 573 ? 1 +ATOM O O THR A 1 75 . 46.295 6.276 22.405 1.00 28.46 76 A 574 ? 1 +ATOM C CB THR A 1 75 . 49.506 6.771 22.526 1.00 30.56 76 A 575 ? 1 +ATOM O OG1 THR A 1 75 . 50.670 6.779 23.334 1.00 24.17 76 A 576 ? 1 +ATOM C CG2 THR A 1 75 . 49.637 7.554 21.185 1.00 19.10 76 A 577 ? 1 +ATOM N N THR A 1 76 . 46.854 8.352 21.668 1.00 25.28 77 A 578 ? 1 +ATOM C CA THR A 1 76 . 45.702 8.335 20.759 1.00 27.22 77 A 579 ? 1 +ATOM C C THR A 1 76 . 46.181 8.739 19.387 1.00 30.69 77 A 580 ? 1 +ATOM O O THR A 1 76 . 47.028 9.577 19.327 1.00 31.61 77 A 581 ? 1 +ATOM C CB THR A 1 76 . 44.596 9.311 21.192 1.00 25.54 77 A 582 ? 1 +ATOM O OG1 THR A 1 76 . 44.225 8.917 22.487 1.00 34.31 77 A 583 ? 1 +ATOM C CG2 THR A 1 76 . 43.378 9.259 20.225 1.00 21.46 77 A 584 ? 1 +ATOM N N VAL A 1 77 . 45.703 8.107 18.328 1.00 26.78 78 A 585 ? 1 +ATOM C CA VAL A 1 77 . 46.055 8.478 16.960 1.00 24.96 78 A 586 ? 1 +ATOM C C VAL A 1 77 . 44.795 8.891 16.244 1.00 26.44 78 A 587 ? 1 +ATOM O O VAL A 1 77 . 43.730 8.323 16.547 1.00 24.04 78 A 588 ? 1 +ATOM C CB VAL A 1 77 . 46.805 7.408 16.151 1.00 24.83 78 A 589 ? 1 +ATOM C CG1 VAL A 1 77 . 48.257 7.313 16.645 1.00 25.36 78 A 590 ? 1 +ATOM C CG2 VAL A 1 77 . 46.097 6.026 16.104 1.00 16.87 78 A 591 ? 1 +ATOM N N PHE A 1 78 . 44.910 9.948 15.398 1.00 23.01 79 A 592 ? 1 +ATOM C CA PHE A 1 78 . 43.755 10.415 14.626 1.00 23.13 79 A 593 ? 1 +ATOM C C PHE A 1 78 . 44.111 10.415 13.143 1.00 27.00 79 A 594 ? 1 +ATOM O O PHE A 1 78 . 45.153 10.861 12.743 1.00 27.43 79 A 595 ? 1 +ATOM C CB PHE A 1 78 . 43.378 11.894 14.885 1.00 22.56 79 A 596 ? 1 +ATOM C CG PHE A 1 78 . 42.773 12.247 16.228 1.00 25.89 79 A 597 ? 1 +ATOM C CD1 PHE A 1 78 . 43.565 12.289 17.385 1.00 26.19 79 A 598 ? 1 +ATOM C CD2 PHE A 1 78 . 41.388 12.440 16.357 1.00 24.80 79 A 599 ? 1 +ATOM C CE1 PHE A 1 78 . 42.991 12.614 18.617 1.00 23.27 79 A 600 ? 1 +ATOM C CE2 PHE A 1 78 . 40.783 12.760 17.575 1.00 22.48 79 A 601 ? 1 +ATOM C CZ PHE A 1 78 . 41.609 12.842 18.692 1.00 19.54 79 A 602 ? 1 +ATOM N N THR A 1 79 . 43.189 10.078 12.315 1.00 23.54 80 A 603 ? 1 +ATOM C CA THR A 1 79 . 43.438 10.236 10.908 1.00 25.37 80 A 604 ? 1 +ATOM C C THR A 1 79 . 42.154 10.759 10.265 1.00 27.63 80 A 605 ? 1 +ATOM O O THR A 1 79 . 41.032 10.460 10.710 1.00 25.06 80 A 606 ? 1 +ATOM C CB THR A 1 79 . 44.071 9.004 10.204 1.00 26.20 80 A 607 ? 1 +ATOM O OG1 THR A 1 79 . 44.453 9.361 8.875 1.00 30.75 80 A 608 ? 1 +ATOM C CG2 THR A 1 79 . 43.060 7.833 10.172 1.00 18.37 80 A 609 ? 1 +ATOM N N GLY A 1 80 . 42.278 11.560 9.208 1.00 22.23 81 A 610 ? 1 +ATOM C CA GLY A 1 80 . 41.052 11.982 8.563 1.00 23.23 81 A 611 ? 1 +ATOM C C GLY A 1 80 . 41.298 12.791 7.312 1.00 22.86 81 A 612 ? 1 +ATOM O O GLY A 1 80 . 42.336 12.726 6.695 1.00 26.09 81 A 613 ? 1 +ATOM N N GLN A 1 81 . 40.341 13.635 7.008 1.00 27.80 82 A 614 ? 1 +ATOM C CA GLN A 1 81 . 40.402 14.481 5.832 1.00 30.46 82 A 615 ? 1 +ATOM C C GLN A 1 81 . 39.886 15.890 6.084 1.00 30.38 82 A 616 ? 1 +ATOM O O GLN A 1 81 . 38.855 16.097 6.745 1.00 25.37 82 A 617 ? 1 +ATOM C CB GLN A 1 81 . 39.699 13.790 4.642 1.00 31.39 82 A 618 ? 1 +ATOM C CG GLN A 1 81 . 40.107 14.407 3.298 1.00 31.02 82 A 619 ? 1 +ATOM C CD GLN A 1 81 . 39.602 13.599 2.089 1.00 43.14 82 A 620 ? 1 +ATOM O OE1 GLN A 1 81 . 39.136 12.451 2.197 1.00 24.52 82 A 621 ? 1 +ATOM N NE2 GLN A 1 81 . 39.669 14.225 0.911 1.00 25.92 82 A 622 ? 1 +ATOM N N CYS A 1 82 . 40.657 16.842 5.566 1.00 34.80 83 A 623 ? 1 +ATOM C CA CYS A 1 82 . 40.373 18.287 5.672 1.00 35.80 83 A 624 ? 1 +ATOM C C CYS A 1 82 . 39.416 18.681 4.553 1.00 34.57 83 A 625 ? 1 +ATOM O O CYS A 1 82 . 39.887 18.809 3.460 1.00 35.07 83 A 626 ? 1 +ATOM C CB CYS A 1 82 . 41.679 19.100 5.492 1.00 35.84 83 A 627 ? 1 +ATOM S SG CYS A 1 82 . 41.604 20.829 6.123 1.00 44.04 83 A 628 ? 1 +ATOM N N PHE A 1 83 . 38.093 18.769 4.808 1.00 27.93 84 A 629 ? 1 +ATOM C CA PHE A 1 83 . 37.074 19.108 3.851 1.00 26.98 84 A 630 ? 1 +ATOM C C PHE A 1 83 . 36.665 20.589 3.947 1.00 41.06 84 A 631 ? 1 +ATOM O O PHE A 1 83 . 37.000 21.340 4.873 1.00 35.65 84 A 632 ? 1 +ATOM C CB PHE A 1 83 . 35.778 18.254 4.014 1.00 28.17 84 A 633 ? 1 +ATOM C CG PHE A 1 83 . 35.857 16.788 3.671 1.00 32.19 84 A 634 ? 1 +ATOM C CD1 PHE A 1 83 . 35.897 16.353 2.344 1.00 36.26 84 A 635 ? 1 +ATOM C CD2 PHE A 1 83 . 35.901 15.822 4.677 1.00 29.47 84 A 636 ? 1 +ATOM C CE1 PHE A 1 83 . 35.967 14.999 2.015 1.00 37.35 84 A 637 ? 1 +ATOM C CE2 PHE A 1 83 . 35.902 14.463 4.367 1.00 27.85 84 A 638 ? 1 +ATOM C CZ PHE A 1 83 . 35.952 14.049 3.039 1.00 29.30 84 A 639 ? 1 +ATOM N N ILE A 1 84 . 35.895 20.982 2.942 1.00 50.32 85 A 640 ? 1 +ATOM C CA ILE A 1 84 . 35.299 22.302 2.845 1.00 57.22 85 A 641 ? 1 +ATOM C C ILE A 1 84 . 33.758 22.272 2.721 1.00 70.30 85 A 642 ? 1 +ATOM O O ILE A 1 84 . 33.219 22.090 1.631 1.00 77.56 85 A 643 ? 1 +ATOM C CB ILE A 1 84 . 35.894 23.094 1.701 1.00 61.00 85 A 644 ? 1 +ATOM C CG1 ILE A 1 84 . 37.428 23.118 1.765 1.00 60.94 85 A 645 ? 1 +ATOM C CG2 ILE A 1 84 . 35.314 24.489 1.814 1.00 61.02 85 A 646 ? 1 +ATOM C CD1 ILE A 1 84 . 38.015 24.523 1.847 1.00 33.98 85 A 647 ? 1 +ATOM N N ASP A 1 85 . 33.011 22.475 3.805 0.00 67.29 86 A 648 ? 1 +ATOM C CA ASP A 1 85 . 31.560 22.450 3.651 1.00 67.32 86 A 649 ? 1 +ATOM C C ASP A 1 85 . 30.767 23.187 4.738 1.00 70.64 86 A 650 ? 1 +ATOM O O ASP A 1 85 . 31.233 23.314 5.869 0.00 70.22 86 A 651 ? 1 +ATOM C CB ASP A 1 85 . 31.013 21.034 3.395 0.00 69.20 86 A 652 ? 1 +ATOM C CG ASP A 1 85 . 30.779 20.752 1.936 0.00 79.07 86 A 653 ? 1 +ATOM O OD1 ASP A 1 85 . 31.066 21.538 1.050 0.00 79.53 86 A 654 ? 1 +ATOM O OD2 ASP A 1 85 . 30.238 19.581 1.725 0.00 84.92 86 A 655 ? 1 +ATOM N N ARG A 1 86 . 29.569 23.647 4.337 0.00 68.45 87 A 656 ? 1 +ATOM C CA ARG A 1 86 . 28.583 24.380 5.137 0.00 68.84 87 A 657 ? 1 +ATOM C C ARG A 1 86 . 28.007 25.575 4.381 0.00 74.48 87 A 658 ? 1 +ATOM O O ARG A 1 86 . 26.898 26.037 4.645 0.00 74.03 87 A 659 ? 1 +ATOM C CB ARG A 1 86 . 29.047 24.784 6.532 0.00 68.70 87 A 660 ? 1 +ATOM C CG ARG A 1 86 . 28.452 23.912 7.631 0.00 77.37 87 A 661 ? 1 +ATOM C CD ARG A 1 86 . 26.967 24.174 7.856 0.00 84.22 87 A 662 ? 1 +ATOM N NE ARG A 1 86 . 26.652 25.594 7.970 0.00 89.14 87 A 663 ? 1 +ATOM C CZ ARG A 1 86 . 25.611 26.176 7.382 0.00 100.00 87 A 664 ? 1 +ATOM N NH1 ARG A 1 86 . 24.754 25.491 6.628 0.00 87.47 87 A 665 ? 1 +ATOM N NH2 ARG A 1 86 . 25.417 27.479 7.556 0.00 86.88 87 A 666 ? 1 +ATOM N N ASN A 1 87 . 28.804 26.055 3.434 1.00 72.44 88 A 667 ? 1 +ATOM C CA ASN A 1 87 . 28.531 27.165 2.560 0.00 71.21 88 A 668 ? 1 +ATOM C C ASN A 1 87 . 29.898 27.597 2.100 0.00 72.18 88 A 669 ? 1 +ATOM O O ASN A 1 87 . 30.090 28.585 1.392 0.00 71.75 88 A 670 ? 1 +ATOM C CB ASN A 1 87 . 27.798 28.309 3.282 0.00 72.13 88 A 671 ? 1 +ATOM C CG ASN A 1 87 . 26.509 28.708 2.592 0.00 95.35 88 A 672 ? 1 +ATOM O OD1 ASN A 1 87 . 26.241 28.298 1.453 0.00 89.75 88 A 673 ? 1 +ATOM N ND2 ASN A 1 87 . 25.703 29.512 3.280 0.00 87.29 88 A 674 ? 1 +ATOM N N GLY A 1 88 . 30.846 26.782 2.556 1.00 66.33 89 A 675 ? 1 +ATOM C CA GLY A 1 88 . 32.269 26.969 2.292 1.00 65.35 89 A 676 ? 1 +ATOM C C GLY A 1 88 . 33.159 27.003 3.563 1.00 59.85 89 A 677 ? 1 +ATOM O O GLY A 1 88 . 34.244 27.574 3.582 1.00 50.64 89 A 678 ? 1 +ATOM N N LYS A 1 89 . 32.674 26.375 4.629 1.00 55.84 90 A 679 ? 1 +ATOM C CA LYS A 1 89 . 33.352 26.261 5.896 1.00 53.97 90 A 680 ? 1 +ATOM C C LYS A 1 89 . 34.355 25.085 5.845 1.00 55.39 90 A 681 ? 1 +ATOM O O LYS A 1 89 . 34.153 24.114 5.115 1.00 60.14 90 A 682 ? 1 +ATOM C CB LYS A 1 89 . 32.289 25.994 6.973 1.00 55.26 90 A 683 ? 1 +ATOM C CG LYS A 1 89 . 31.404 27.202 7.237 0.00 70.04 90 A 684 ? 1 +ATOM C CD LYS A 1 89 . 31.973 28.489 6.662 0.00 80.22 90 A 685 ? 1 +ATOM C CE LYS A 1 89 . 31.102 29.088 5.571 0.00 91.01 90 A 686 ? 1 +ATOM N NZ LYS A 1 89 . 31.824 30.054 4.726 0.00 100.00 90 A 687 ? 1 +ATOM N N GLU A 1 90 . 35.450 25.153 6.602 1.00 43.09 91 A 688 ? 1 +ATOM C CA GLU A 1 90 . 36.400 24.061 6.674 1.00 40.76 91 A 689 ? 1 +ATOM C C GLU A 1 90 . 36.002 23.093 7.799 1.00 42.03 91 A 690 ? 1 +ATOM O O GLU A 1 90 . 35.669 23.488 8.894 1.00 41.76 91 A 691 ? 1 +ATOM C CB GLU A 1 90 . 37.798 24.555 6.994 1.00 41.30 91 A 692 ? 1 +ATOM C CG GLU A 1 90 . 38.736 24.811 5.803 1.00 42.93 91 A 693 ? 1 +ATOM C CD GLU A 1 90 . 39.800 25.808 6.212 1.00 52.95 91 A 694 ? 1 +ATOM O OE1 GLU A 1 90 . 39.540 26.705 6.971 1.00 45.37 91 A 695 ? 1 +ATOM O OE2 GLU A 1 90 . 40.992 25.615 5.701 1.00 60.21 91 A 696 ? 1 +ATOM N N VAL A 1 91 . 36.062 21.808 7.540 1.00 35.99 92 A 697 ? 1 +ATOM C CA VAL A 1 91 . 35.748 20.829 8.526 1.00 32.84 92 A 698 ? 1 +ATOM C C VAL A 1 91 . 36.752 19.688 8.498 1.00 37.61 92 A 699 ? 1 +ATOM O O VAL A 1 91 . 37.160 19.301 7.431 1.00 37.86 92 A 700 ? 1 +ATOM C CB VAL A 1 91 . 34.416 20.241 8.129 1.00 34.37 92 A 701 ? 1 +ATOM C CG1 VAL A 1 91 . 33.998 19.163 9.116 1.00 34.60 92 A 702 ? 1 +ATOM C CG2 VAL A 1 91 . 33.447 21.358 8.266 1.00 36.46 92 A 703 ? 1 +ATOM N N LEU A 1 92 . 37.111 19.118 9.653 1.00 34.29 93 A 704 ? 1 +ATOM C CA LEU A 1 92 . 37.946 17.910 9.722 1.00 32.01 93 A 705 ? 1 +ATOM C C LEU A 1 92 . 37.055 16.755 10.207 1.00 31.25 93 A 706 ? 1 +ATOM O O LEU A 1 92 . 36.444 16.781 11.261 1.00 30.42 93 A 707 ? 1 +ATOM C CB LEU A 1 92 . 39.031 18.035 10.764 1.00 31.09 93 A 708 ? 1 +ATOM C CG LEU A 1 92 . 40.247 18.842 10.376 1.00 38.43 93 A 709 ? 1 +ATOM C CD1 LEU A 1 92 . 39.937 19.931 9.377 1.00 41.96 93 A 710 ? 1 +ATOM C CD2 LEU A 1 92 . 40.945 19.329 11.633 1.00 35.28 93 A 711 ? 1 +ATOM N N LYS A 1 93 . 36.986 15.728 9.429 1.00 27.99 94 A 712 ? 1 +ATOM C CA LYS A 1 93 . 36.246 14.559 9.797 1.00 29.06 94 A 713 ? 1 +ATOM C C LYS A 1 93 . 37.339 13.545 10.149 1.00 33.42 94 A 714 ? 1 +ATOM O O LYS A 1 93 . 38.247 13.232 9.337 1.00 31.79 94 A 715 ? 1 +ATOM C CB LYS A 1 93 . 35.367 14.068 8.620 1.00 32.67 94 A 716 ? 1 +ATOM C CG LYS A 1 93 . 34.132 14.924 8.366 1.00 33.60 94 A 717 ? 1 +ATOM C CD LYS A 1 93 . 32.964 14.159 7.767 1.00 63.56 94 A 718 ? 1 +ATOM C CE LYS A 1 93 . 31.887 13.726 8.751 1.00 56.15 94 A 719 ? 1 +ATOM N NZ LYS A 1 93 . 31.211 12.484 8.350 0.00 65.24 94 A 720 ? 1 +ATOM N N THR A 1 94 . 37.292 13.038 11.374 1.00 27.24 95 A 721 ? 1 +ATOM C CA THR A 1 94 . 38.337 12.103 11.836 1.00 27.61 95 A 722 ? 1 +ATOM C C THR A 1 94 . 37.782 10.830 12.486 1.00 25.50 95 A 723 ? 1 +ATOM O O THR A 1 94 . 36.677 10.773 13.023 1.00 21.10 95 A 724 ? 1 +ATOM C CB THR A 1 94 . 39.319 12.770 12.908 1.00 25.89 95 A 725 ? 1 +ATOM O OG1 THR A 1 94 . 38.644 12.954 14.144 1.00 31.16 95 A 726 ? 1 +ATOM C CG2 THR A 1 94 . 39.829 14.135 12.469 1.00 24.78 95 A 727 ? 1 +ATOM N N MET A 1 95 . 38.639 9.851 12.509 1.00 26.56 96 A 728 ? 1 +ATOM C CA MET A 1 95 . 38.388 8.596 13.206 1.00 31.81 96 A 729 ? 1 +ATOM C C MET A 1 95 . 39.623 8.402 14.158 1.00 29.69 96 A 730 ? 1 +ATOM O O MET A 1 95 . 40.729 8.861 13.832 1.00 21.14 96 A 731 ? 1 +ATOM C CB MET A 1 95 . 38.385 7.572 12.093 1.00 34.13 96 A 732 ? 1 +ATOM C CG MET A 1 95 . 37.712 6.310 12.449 1.00 41.72 96 A 733 ? 1 +ATOM S SD MET A 1 95 . 36.186 6.095 11.477 1.00 41.64 96 A 734 ? 1 +ATOM C CE MET A 1 95 . 35.516 5.100 12.812 1.00 38.47 96 A 735 ? 1 +ATOM N N TRP A 1 96 . 39.509 7.776 15.354 1.00 25.56 97 A 736 ? 1 +ATOM C CA TRP A 1 96 . 40.728 7.675 16.187 1.00 26.04 97 A 737 ? 1 +ATOM C C TRP A 1 96 . 40.831 6.304 16.836 1.00 26.06 97 A 738 ? 1 +ATOM O O TRP A 1 96 . 39.830 5.608 16.922 1.00 23.00 97 A 739 ? 1 +ATOM C CB TRP A 1 96 . 40.773 8.783 17.305 1.00 22.53 97 A 740 ? 1 +ATOM C CG TRP A 1 96 . 39.442 8.876 18.046 1.00 22.76 97 A 741 ? 1 +ATOM C CD1 TRP A 1 96 . 38.451 9.789 17.825 1.00 25.36 97 A 742 ? 1 +ATOM C CD2 TRP A 1 96 . 38.923 8.010 19.101 1.00 23.98 97 A 743 ? 1 +ATOM N NE1 TRP A 1 96 . 37.368 9.605 18.667 1.00 26.99 97 A 744 ? 1 +ATOM C CE2 TRP A 1 96 . 37.616 8.530 19.483 1.00 27.57 97 A 745 ? 1 +ATOM C CE3 TRP A 1 96 . 39.469 6.917 19.857 1.00 22.78 97 A 746 ? 1 +ATOM C CZ2 TRP A 1 96 . 36.854 7.976 20.560 1.00 23.90 97 A 747 ? 1 +ATOM C CZ3 TRP A 1 96 . 38.698 6.369 20.914 1.00 20.12 97 A 748 ? 1 +ATOM C CH2 TRP A 1 96 . 37.390 6.831 21.187 1.00 21.11 97 A 749 ? 1 +ATOM N N LEU A 1 97 . 42.033 5.968 17.281 1.00 21.16 98 A 750 ? 1 +ATOM C CA LEU A 1 97 . 42.331 4.735 18.049 1.00 24.60 98 A 751 ? 1 +ATOM C C LEU A 1 97 . 42.886 5.147 19.415 1.00 25.24 98 A 752 ? 1 +ATOM O O LEU A 1 97 . 43.844 5.873 19.437 1.00 24.62 98 A 753 ? 1 +ATOM C CB LEU A 1 97 . 43.295 3.662 17.400 1.00 24.47 98 A 754 ? 1 +ATOM C CG LEU A 1 97 . 42.806 3.038 16.041 1.00 24.75 98 A 755 ? 1 +ATOM C CD1 LEU A 1 97 . 43.915 2.250 15.377 1.00 21.93 98 A 756 ? 1 +ATOM C CD2 LEU A 1 97 . 41.564 2.169 16.190 1.00 17.14 98 A 757 ? 1 +ATOM N N LEU A 1 98 . 42.304 4.694 20.521 1.00 20.51 99 A 758 ? 1 +ATOM C CA LEU A 1 98 . 42.875 5.048 21.807 1.00 20.34 99 A 759 ? 1 +ATOM C C LEU A 1 98 . 43.502 3.802 22.438 1.00 27.50 99 A 760 ? 1 +ATOM O O LEU A 1 98 . 42.832 2.791 22.761 1.00 22.50 99 A 761 ? 1 +ATOM C CB LEU A 1 98 . 41.830 5.685 22.724 1.00 19.92 99 A 762 ? 1 +ATOM C CG LEU A 1 98 . 41.993 5.574 24.262 1.00 25.78 99 A 763 ? 1 +ATOM C CD1 LEU A 1 98 . 43.070 6.520 24.821 1.00 25.66 99 A 764 ? 1 +ATOM C CD2 LEU A 1 98 . 40.700 6.143 24.850 1.00 30.89 99 A 765 ? 1 +ATOM N N ARG A 1 99 . 44.848 3.848 22.587 1.00 22.01 100 A 766 ? 1 +ATOM C CA ARG A 1 99 . 45.495 2.684 23.149 1.00 24.20 100 A 767 ? 1 +ATOM C C ARG A 1 99 . 45.758 2.881 24.640 1.00 30.94 100 A 768 ? 1 +ATOM O O ARG A 1 99 . 46.433 3.822 25.050 1.00 26.15 100 A 769 ? 1 +ATOM C CB ARG A 1 99 . 46.824 2.543 22.455 1.00 28.04 100 A 770 ? 1 +ATOM C CG ARG A 1 99 . 47.693 1.296 22.666 1.00 21.29 100 A 771 ? 1 +ATOM C CD ARG A 1 99 . 47.413 0.234 23.679 1.00 38.05 100 A 772 ? 1 +ATOM N NE ARG A 1 99 . 47.590 -0.957 22.943 1.00 27.68 100 A 773 ? 1 +ATOM C CZ ARG A 1 99 . 47.957 -2.218 23.118 1.00 36.16 100 A 774 ? 1 +ATOM N NH1 ARG A 1 99 . 48.331 -2.822 24.243 1.00 25.40 100 A 775 ? 1 +ATOM N NH2 ARG A 1 99 . 47.911 -2.938 21.979 1.00 24.94 100 A 776 ? 1 +ATOM N N SER A 1 100 . 45.232 1.963 25.431 1.00 25.55 101 A 777 ? 1 +ATOM C CA SER A 1 100 . 45.534 1.990 26.828 1.00 27.80 101 A 778 ? 1 +ATOM C C SER A 1 100 . 46.798 1.182 27.105 1.00 32.57 101 A 779 ? 1 +ATOM O O SER A 1 100 . 47.147 0.233 26.422 1.00 23.53 101 A 780 ? 1 +ATOM C CB SER A 1 100 . 44.420 1.252 27.576 1.00 23.36 101 A 781 ? 1 +ATOM O OG SER A 1 100 . 43.459 2.261 27.628 1.00 44.39 101 A 782 ? 1 +ATOM N N SER A 1 101 . 47.437 1.469 28.218 1.00 33.09 102 A 783 ? 1 +ATOM C CA SER A 1 101 . 48.581 0.667 28.658 1.00 34.39 102 A 784 ? 1 +ATOM C C SER A 1 101 . 48.169 -0.593 29.407 1.00 32.53 102 A 785 ? 1 +ATOM O O SER A 1 101 . 47.502 -0.514 30.429 1.00 33.90 102 A 786 ? 1 +ATOM C CB SER A 1 101 . 49.342 1.463 29.719 1.00 40.83 102 A 787 ? 1 +ATOM O OG SER A 1 101 . 50.192 0.518 30.328 1.00 59.70 102 A 788 ? 1 +ATOM N N VAL A 1 102 . 48.541 -1.768 28.984 1.00 28.84 103 A 789 ? 1 +ATOM C CA VAL A 1 102 . 48.198 -2.937 29.811 1.00 31.40 103 A 790 ? 1 +ATOM C C VAL A 1 102 . 49.501 -3.507 30.408 1.00 42.31 103 A 791 ? 1 +ATOM O O VAL A 1 102 . 50.590 -3.279 29.844 1.00 41.80 103 A 792 ? 1 +ATOM C CB VAL A 1 102 . 47.321 -4.014 29.195 1.00 33.33 103 A 793 ? 1 +ATOM C CG1 VAL A 1 102 . 45.914 -3.537 28.838 1.00 30.40 103 A 794 ? 1 +ATOM C CG2 VAL A 1 102 . 48.019 -4.631 27.989 1.00 31.17 103 A 795 ? 1 +ATOM N N ASN A 1 103 . 49.409 -4.231 31.544 1.00 40.16 104 A 796 ? 1 +ATOM C CA ASN A 1 103 . 50.587 -4.752 32.236 1.00 39.24 104 A 797 ? 1 +ATOM C C ASN A 1 103 . 51.214 -5.994 31.663 1.00 43.83 104 A 798 ? 1 +ATOM O O ASN A 1 103 . 52.439 -6.224 31.800 1.00 45.40 104 A 799 ? 1 +ATOM C CB ASN A 1 103 . 50.307 -5.034 33.700 1.00 45.54 104 A 800 ? 1 +ATOM C CG ASN A 1 103 . 49.688 -3.873 34.414 0.00 62.23 104 A 801 ? 1 +ATOM O OD1 ASN A 1 103 . 48.606 -3.964 35.013 0.00 56.84 104 A 802 ? 1 +ATOM N ND2 ASN A 1 103 . 50.407 -2.778 34.345 1.00 50.13 104 A 803 ? 1 +ATOM N N ASP A 1 104 . 50.361 -6.776 31.048 1.00 36.48 105 A 804 ? 1 +ATOM C CA ASP A 1 104 . 50.787 -8.034 30.464 1.00 38.14 105 A 805 ? 1 +ATOM C C ASP A 1 104 . 50.374 -8.256 28.991 1.00 36.92 105 A 806 ? 1 +ATOM O O ASP A 1 104 . 49.254 -8.032 28.588 1.00 38.95 105 A 807 ? 1 +ATOM C CB ASP A 1 104 . 50.119 -9.139 31.312 1.00 41.03 105 A 808 ? 1 +ATOM C CG ASP A 1 104 . 50.580 -10.508 30.949 1.00 48.84 105 A 809 ? 1 +ATOM O OD1 ASP A 1 104 . 51.854 -10.666 31.238 1.00 61.50 105 A 810 ? 1 +ATOM O OD2 ASP A 1 104 . 49.885 -11.318 30.371 1.00 51.83 105 A 811 ? 1 +ATOM N N ILE A 1 105 . 51.236 -8.808 28.192 1.00 33.32 106 A 812 ? 1 +ATOM C CA ILE A 1 105 . 50.895 -9.081 26.808 1.00 37.07 106 A 813 ? 1 +ATOM C C ILE A 1 105 . 49.605 -9.874 26.621 1.00 37.97 106 A 814 ? 1 +ATOM O O ILE A 1 105 . 48.992 -9.817 25.542 1.00 36.73 106 A 815 ? 1 +ATOM C CB ILE A 1 105 . 52.035 -9.777 26.040 1.00 40.12 106 A 816 ? 1 +ATOM C CG1 ILE A 1 105 . 51.635 -10.032 24.561 1.00 37.89 106 A 817 ? 1 +ATOM C CG2 ILE A 1 105 . 52.303 -11.098 26.755 1.00 35.15 106 A 818 ? 1 +ATOM C CD1 ILE A 1 105 . 52.771 -10.032 23.499 1.00 38.51 106 A 819 ? 1 +ATOM N N GLY A 1 106 . 49.205 -10.652 27.605 1.00 33.14 107 A 820 ? 1 +ATOM C CA GLY A 1 106 . 47.979 -11.425 27.434 1.00 32.27 107 A 821 ? 1 +ATOM C C GLY A 1 106 . 46.636 -10.582 27.491 1.00 38.49 107 A 822 ? 1 +ATOM O O GLY A 1 106 . 45.565 -11.039 27.113 1.00 39.79 107 A 823 ? 1 +ATOM N N ASP A 1 107 . 46.647 -9.338 27.968 1.00 26.64 108 A 824 ? 1 +ATOM C CA ASP A 1 107 . 45.474 -8.536 27.985 1.00 24.46 108 A 825 ? 1 +ATOM C C ASP A 1 107 . 45.485 -7.613 26.774 1.00 28.64 108 A 826 ? 1 +ATOM O O ASP A 1 107 . 44.669 -6.724 26.609 1.00 27.64 108 A 827 ? 1 +ATOM C CB ASP A 1 107 . 45.594 -7.611 29.193 1.00 29.31 108 A 828 ? 1 +ATOM C CG ASP A 1 107 . 45.616 -8.366 30.503 1.00 53.05 108 A 829 ? 1 +ATOM O OD1 ASP A 1 107 . 44.939 -9.348 30.647 1.00 49.37 108 A 830 ? 1 +ATOM O OD2 ASP A 1 107 . 46.504 -7.945 31.393 1.00 67.21 108 A 831 ? 1 +ATOM N N ASP A 1 108 . 46.454 -7.784 25.937 1.00 28.76 109 A 832 ? 1 +ATOM C CA ASP A 1 108 . 46.570 -6.929 24.797 1.00 25.69 109 A 833 ? 1 +ATOM C C ASP A 1 108 . 45.231 -6.777 24.069 1.00 31.86 109 A 834 ? 1 +ATOM O O ASP A 1 108 . 44.823 -5.686 23.690 1.00 28.41 109 A 835 ? 1 +ATOM C CB ASP A 1 108 . 47.638 -7.434 23.853 1.00 27.74 109 A 836 ? 1 +ATOM C CG ASP A 1 108 . 47.816 -6.426 22.692 1.00 40.14 109 A 837 ? 1 +ATOM O OD1 ASP A 1 108 . 48.248 -5.286 22.792 1.00 37.23 109 A 838 ? 1 +ATOM O OD2 ASP A 1 108 . 47.415 -6.866 21.538 1.00 37.22 109 A 839 ? 1 +ATOM N N TRP A 1 109 . 44.514 -7.852 23.868 1.00 29.37 110 A 840 ? 1 +ATOM C CA TRP A 1 109 . 43.217 -7.815 23.143 1.00 33.65 110 A 841 ? 1 +ATOM C C TRP A 1 109 . 42.194 -6.803 23.615 1.00 32.64 110 A 842 ? 1 +ATOM O O TRP A 1 109 . 41.295 -6.403 22.891 1.00 31.48 110 A 843 ? 1 +ATOM C CB TRP A 1 109 . 42.506 -9.200 23.213 1.00 36.83 110 A 844 ? 1 +ATOM C CG TRP A 1 109 . 42.071 -9.538 24.598 1.00 40.36 110 A 845 ? 1 +ATOM C CD1 TRP A 1 109 . 42.828 -10.002 25.630 1.00 43.26 110 A 846 ? 1 +ATOM C CD2 TRP A 1 109 . 40.806 -9.309 25.123 1.00 41.37 110 A 847 ? 1 +ATOM N NE1 TRP A 1 109 . 42.098 -10.053 26.771 1.00 40.96 110 A 848 ? 1 +ATOM C CE2 TRP A 1 109 . 40.861 -9.644 26.501 1.00 44.12 110 A 849 ? 1 +ATOM C CE3 TRP A 1 109 . 39.638 -8.831 24.543 1.00 44.25 110 A 850 ? 1 +ATOM C CZ2 TRP A 1 109 . 39.757 -9.548 27.330 1.00 46.87 110 A 851 ? 1 +ATOM C CZ3 TRP A 1 109 . 38.543 -8.708 25.372 1.00 47.87 110 A 852 ? 1 +ATOM C CH2 TRP A 1 109 . 38.593 -9.090 26.736 1.00 49.09 110 A 853 ? 1 +ATOM N N LYS A 1 110 . 42.276 -6.409 24.848 1.00 26.96 111 A 854 ? 1 +ATOM C CA LYS A 1 110 . 41.279 -5.481 25.273 1.00 29.20 111 A 855 ? 1 +ATOM C C LYS A 1 110 . 41.800 -4.030 25.411 1.00 32.69 111 A 856 ? 1 +ATOM O O LYS A 1 110 . 41.103 -3.178 25.951 1.00 31.47 111 A 857 ? 1 +ATOM C CB LYS A 1 110 . 40.611 -5.962 26.549 1.00 29.20 111 A 858 ? 1 +ATOM C CG LYS A 1 110 . 41.547 -5.920 27.724 1.00 36.73 111 A 859 ? 1 +ATOM C CD LYS A 1 110 . 41.058 -6.771 28.900 1.00 50.84 111 A 860 ? 1 +ATOM C CE LYS A 1 110 . 41.681 -6.367 30.227 0.00 62.01 111 A 861 ? 1 +ATOM N NZ LYS A 1 110 . 42.626 -7.367 30.745 0.00 71.17 111 A 862 ? 1 +ATOM N N ALA A 1 111 . 42.989 -3.709 24.854 1.00 24.20 112 A 863 ? 1 +ATOM C CA ALA A 1 111 . 43.625 -2.374 24.959 1.00 24.90 112 A 864 ? 1 +ATOM C C ALA A 1 111 . 43.229 -1.214 24.013 1.00 27.00 112 A 865 ? 1 +ATOM O O ALA A 1 111 . 43.638 -0.045 24.224 1.00 28.28 112 A 866 ? 1 +ATOM C CB ALA A 1 111 . 45.146 -2.580 24.967 1.00 25.24 112 A 867 ? 1 +ATOM N N THR A 1 112 . 42.431 -1.518 22.974 1.00 26.28 113 A 868 ? 1 +ATOM C CA THR A 1 112 . 42.093 -0.504 21.960 1.00 28.54 113 A 869 ? 1 +ATOM C C THR A 1 112 . 40.625 -0.122 21.729 1.00 29.14 113 A 870 ? 1 +ATOM O O THR A 1 112 . 39.795 -0.916 21.338 1.00 29.98 113 A 871 ? 1 +ATOM C CB THR A 1 112 . 42.749 -0.916 20.612 1.00 27.69 113 A 872 ? 1 +ATOM O OG1 THR A 1 112 . 44.016 -1.541 20.828 1.00 24.11 113 A 873 ? 1 +ATOM C CG2 THR A 1 112 . 42.859 0.281 19.677 1.00 26.91 113 A 874 ? 1 +ATOM N N ARG A 1 113 . 40.331 1.153 21.924 1.00 23.84 114 A 875 ? 1 +ATOM C CA ARG A 1 113 . 39.020 1.650 21.674 1.00 25.60 114 A 876 ? 1 +ATOM C C ARG A 1 113 . 39.029 2.457 20.361 1.00 27.37 114 A 877 ? 1 +ATOM O O ARG A 1 113 . 40.070 2.951 19.987 1.00 23.33 114 A 878 ? 1 +ATOM C CB ARG A 1 113 . 38.608 2.608 22.743 1.00 20.11 114 A 879 ? 1 +ATOM C CG ARG A 1 113 . 38.477 1.893 24.059 1.00 32.21 114 A 880 ? 1 +ATOM C CD ARG A 1 113 . 38.245 3.018 25.034 1.00 39.81 114 A 881 ? 1 +ATOM N NE ARG A 1 113 . 37.727 2.598 26.302 1.00 45.17 114 A 882 ? 1 +ATOM C CZ ARG A 1 113 . 38.386 2.731 27.449 1.00 76.19 114 A 883 ? 1 +ATOM N NH1 ARG A 1 113 . 39.610 3.324 27.502 1.00 54.33 114 A 884 ? 1 +ATOM N NH2 ARG A 1 113 . 37.781 2.243 28.558 1.00 41.68 114 A 885 ? 1 +ATOM N N VAL A 1 114 . 37.856 2.684 19.746 1.00 19.57 115 A 886 ? 1 +ATOM C CA VAL A 1 114 . 37.773 3.429 18.509 1.00 19.94 115 A 887 ? 1 +ATOM C C VAL A 1 114 . 36.595 4.339 18.560 1.00 25.41 115 A 888 ? 1 +ATOM O O VAL A 1 114 . 35.608 4.016 19.254 1.00 23.12 115 A 889 ? 1 +ATOM C CB VAL A 1 114 . 37.563 2.425 17.366 1.00 24.23 115 A 890 ? 1 +ATOM C CG1 VAL A 1 114 . 36.328 1.518 17.638 1.00 21.87 115 A 891 ? 1 +ATOM C CG2 VAL A 1 114 . 37.563 3.064 15.966 1.00 21.51 115 A 892 ? 1 +ATOM N N GLY A 1 115 . 36.690 5.414 17.758 1.00 23.30 116 A 893 ? 1 +ATOM C CA GLY A 1 115 . 35.612 6.395 17.647 1.00 18.00 116 A 894 ? 1 +ATOM C C GLY A 1 115 . 35.910 7.459 16.604 1.00 23.05 116 A 895 ? 1 +ATOM O O GLY A 1 115 . 36.892 7.374 15.865 1.00 22.86 116 A 896 ? 1 +ATOM N N ILE A 1 116 . 35.009 8.431 16.534 1.00 23.61 117 A 897 ? 1 +ATOM C CA ILE A 1 116 . 35.151 9.562 15.625 1.00 26.38 117 A 898 ? 1 +ATOM C C ILE A 1 116 . 35.199 10.889 16.318 1.00 29.19 117 A 899 ? 1 +ATOM O O ILE A 1 116 . 34.851 11.009 17.513 1.00 29.07 117 A 900 ? 1 +ATOM C CB ILE A 1 116 . 34.212 9.666 14.431 1.00 33.69 117 A 901 ? 1 +ATOM C CG1 ILE A 1 116 . 33.007 10.543 14.716 1.00 40.56 117 A 902 ? 1 +ATOM C CG2 ILE A 1 116 . 33.655 8.339 14.049 1.00 39.56 117 A 903 ? 1 +ATOM C CD1 ILE A 1 116 . 32.177 9.993 15.855 1.00 31.72 117 A 904 ? 1 +ATOM N N ASN A 1 117 . 35.617 11.890 15.543 1.00 23.41 118 A 905 ? 1 +ATOM C CA ASN A 1 117 . 35.540 13.258 16.008 1.00 23.06 118 A 906 ? 1 +ATOM C C ASN A 1 117 . 35.389 14.164 14.807 1.00 30.73 118 A 907 ? 1 +ATOM O O ASN A 1 117 . 36.057 13.970 13.804 1.00 30.88 118 A 908 ? 1 +ATOM C CB ASN A 1 117 . 36.818 13.714 16.749 1.00 30.55 118 A 909 ? 1 +ATOM C CG ASN A 1 117 . 36.830 13.727 18.285 1.00 57.48 118 A 910 ? 1 +ATOM O OD1 ASN A 1 117 . 37.873 13.904 18.938 1.00 72.27 118 A 911 ? 1 +ATOM N ND2 ASN A 1 117 . 35.671 13.613 18.884 1.00 40.49 118 A 912 ? 1 +ATOM N N ILE A 1 118 . 34.553 15.187 14.921 1.00 30.06 119 A 913 ? 1 +ATOM C CA ILE A 1 118 . 34.456 16.225 13.900 1.00 28.67 119 A 914 ? 1 +ATOM C C ILE A 1 118 . 34.934 17.585 14.435 1.00 32.05 119 A 915 ? 1 +ATOM O O ILE A 1 118 . 34.507 18.041 15.525 1.00 29.50 119 A 916 ? 1 +ATOM C CB ILE A 1 118 . 33.079 16.332 13.323 1.00 33.47 119 A 917 ? 1 +ATOM C CG1 ILE A 1 118 . 32.743 14.989 12.728 1.00 33.86 119 A 918 ? 1 +ATOM C CG2 ILE A 1 118 . 33.065 17.391 12.222 1.00 32.46 119 A 919 ? 1 +ATOM C CD1 ILE A 1 118 . 31.241 14.868 12.680 1.00 50.74 119 A 920 ? 1 +ATOM N N PHE A 1 119 . 35.853 18.231 13.692 1.00 27.70 120 A 921 ? 1 +ATOM C CA PHE A 1 119 . 36.384 19.525 14.120 1.00 28.55 120 A 922 ? 1 +ATOM C C PHE A 1 119 . 36.011 20.665 13.195 1.00 31.66 120 A 923 ? 1 +ATOM O O PHE A 1 119 . 36.079 20.486 11.989 1.00 27.33 120 A 924 ? 1 +ATOM C CB PHE A 1 119 . 37.949 19.554 14.220 1.00 31.03 120 A 925 ? 1 +ATOM C CG PHE A 1 119 . 38.524 18.558 15.208 1.00 30.21 120 A 926 ? 1 +ATOM C CD1 PHE A 1 119 . 38.719 17.227 14.824 1.00 30.25 120 A 927 ? 1 +ATOM C CD2 PHE A 1 119 . 38.782 18.952 16.519 1.00 28.11 120 A 928 ? 1 +ATOM C CE1 PHE A 1 119 . 39.211 16.272 15.706 1.00 31.05 120 A 929 ? 1 +ATOM C CE2 PHE A 1 119 . 39.276 18.001 17.409 1.00 31.89 120 A 930 ? 1 +ATOM C CZ PHE A 1 119 . 39.469 16.672 17.017 1.00 30.15 120 A 931 ? 1 +ATOM N N THR A 1 120 . 35.698 21.816 13.787 1.00 27.64 121 A 932 ? 1 +ATOM C CA THR A 1 120 . 35.393 23.046 13.064 1.00 29.35 121 A 933 ? 1 +ATOM C C THR A 1 120 . 36.260 24.131 13.645 1.00 32.80 121 A 934 ? 1 +ATOM O O THR A 1 120 . 36.690 24.052 14.802 1.00 34.56 121 A 935 ? 1 +ATOM C CB THR A 1 120 . 33.950 23.531 13.234 1.00 35.26 121 A 936 ? 1 +ATOM O OG1 THR A 1 120 . 33.630 23.579 14.611 1.00 47.31 121 A 937 ? 1 +ATOM C CG2 THR A 1 120 . 33.001 22.595 12.519 1.00 29.98 121 A 938 ? 1 +ATOM N N ARG A 1 121 . 36.477 25.155 12.835 1.00 32.80 122 A 939 ? 1 +ATOM C CA ARG A 1 121 . 37.296 26.300 13.239 1.00 39.08 122 A 940 ? 1 +ATOM C C ARG A 1 121 . 36.747 27.040 14.433 1.00 47.12 122 A 941 ? 1 +ATOM O O ARG A 1 121 . 35.526 27.235 14.516 1.00 47.59 122 A 942 ? 1 +ATOM C CB ARG A 1 121 . 37.680 27.265 12.117 1.00 37.35 122 A 943 ? 1 +ATOM C CG ARG A 1 121 . 38.441 26.557 11.010 1.00 46.91 122 A 944 ? 1 +ATOM C CD ARG A 1 121 . 39.531 27.406 10.375 1.00 46.12 122 A 945 ? 1 +ATOM N NE ARG A 1 121 . 40.849 27.161 10.937 1.00 55.45 122 A 946 ? 1 +ATOM C CZ ARG A 1 121 . 41.830 26.733 10.194 1.00 55.00 122 A 947 ? 1 +ATOM N NH1 ARG A 1 121 . 41.672 26.480 8.883 1.00 37.31 122 A 948 ? 1 +ATOM N NH2 ARG A 1 121 . 42.990 26.544 10.789 1.00 74.74 122 A 949 ? 1 +ATOM N N LEU A 1 122 . 37.656 27.373 15.372 1.00 47.37 123 A 950 ? 1 +ATOM C CA LEU A 1 122 . 37.250 28.148 16.569 1.00 54.85 123 A 951 ? 1 +ATOM C C LEU A 1 122 . 37.089 29.638 16.167 1.00 74.57 123 A 952 ? 1 +ATOM O O LEU A 1 122 . 37.999 30.254 15.559 1.00 81.23 123 A 953 ? 1 +ATOM C CB LEU A 1 122 . 38.040 27.928 17.919 1.00 52.78 123 A 954 ? 1 +ATOM C CG LEU A 1 122 . 37.512 26.770 18.754 0.00 57.49 123 A 955 ? 1 +ATOM C CD1 LEU A 1 122 . 38.672 26.057 19.439 0.00 57.66 123 A 956 ? 1 +ATOM C CD2 LEU A 1 122 . 36.533 27.288 19.801 0.00 59.97 123 A 957 ? 1 +ATOM N N ARG A 1 123 . 35.913 30.188 16.464 0.00 70.64 124 A 958 ? 1 +ATOM C CA ARG A 1 123 . 35.593 31.566 16.134 0.00 70.24 124 A 959 ? 1 +ATOM C C ARG A 1 123 . 36.798 32.488 16.230 0.00 73.96 124 A 960 ? 1 +ATOM O O ARG A 1 123 . 36.964 33.215 17.207 0.00 73.52 124 A 961 ? 1 +ATOM C CB ARG A 1 123 . 34.417 32.101 16.943 0.00 70.00 124 A 962 ? 1 +ATOM C CG ARG A 1 123 . 33.616 33.160 16.194 0.00 78.53 124 A 963 ? 1 +ATOM C CD ARG A 1 123 . 34.002 34.581 16.585 0.00 85.14 124 A 964 ? 1 +ATOM N NE ARG A 1 123 . 34.191 35.459 15.434 0.00 89.59 124 A 965 ? 1 +ATOM C CZ ARG A 1 123 . 33.206 36.126 14.839 0.00 100.00 124 A 966 ? 1 +ATOM N NH1 ARG A 1 123 . 31.945 36.040 15.253 0.00 87.47 124 A 967 ? 1 +ATOM N NH2 ARG A 1 123 . 33.492 36.904 13.799 0.00 86.88 124 A 968 ? 1 +ATOM N N THR A 1 124 . 37.634 32.438 15.195 0.00 70.34 125 A 969 ? 1 +ATOM C CA THR A 1 124 . 38.850 33.226 15.088 0.00 72.40 125 A 970 ? 1 +ATOM C C THR A 1 124 . 39.741 32.699 13.974 0.00 81.21 125 A 971 ? 1 +ATOM O O THR A 1 124 . 40.220 33.522 13.164 0.00 82.54 125 A 972 ? 1 +ATOM C CB THR A 1 124 . 39.644 33.314 16.408 0.00 80.43 125 A 973 ? 1 +ATOM O OG1 THR A 1 124 . 39.360 32.215 17.251 0.00 80.01 125 A 974 ? 1 +ATOM C CG2 THR A 1 124 . 39.357 34.630 17.122 0.00 79.03 125 A 975 ? 1 +# +loop_ +_pdbx_poly_seq_scheme.asym_id +_pdbx_poly_seq_scheme.entity_id +_pdbx_poly_seq_scheme.mon_id +_pdbx_poly_seq_scheme.seq_id +_pdbx_poly_seq_scheme.pdb_strand_id +_pdbx_poly_seq_scheme.pdb_seq_num +_pdbx_poly_seq_scheme.pdb_ins_code +A 1 ARG 1 A 2 ? +A 1 LYS 2 A 3 ? +A 1 CYS 3 A 4 ? +A 1 SER 4 A 5 ? +A 1 LEU 5 A 6 ? +A 1 THR 6 A 7 ? +A 1 GLY 7 A 8 ? +A 1 LYS 8 A 9 ? +A 1 TRP 9 A 10 ? +A 1 THR 10 A 11 ? +A 1 ASN 11 A 12 ? +A 1 ASP 12 A 13 ? +A 1 LEU 13 A 14 ? +A 1 GLY 14 A 15 ? +A 1 SER 15 A 16 ? +A 1 ASN 16 A 17 ? +A 1 MET 17 A 18 ? +A 1 THR 18 A 19 ? +A 1 ILE 19 A 20 ? +A 1 GLY 20 A 21 ? +A 1 ALA 21 A 22 ? +A 1 VAL 22 A 23 ? +A 1 ASN 23 A 24 ? +A 1 SER 24 A 25 ? +A 1 ARG 25 A 26 ? +A 1 GLY 26 A 27 ? +A 1 GLU 27 A 28 ? +A 1 PHE 28 A 29 ? +A 1 THR 29 A 30 ? +A 1 GLY 30 A 31 ? +A 1 THR 31 A 32 ? +A 1 TYR 32 A 33 ? +A 1 ILE 33 A 34 ? +A 1 THR 34 A 35 ? +A 1 ALA 35 A 36 ? +A 1 VAL 36 A 37 ? +A 1 THR 37 A 38 ? +A 1 ALA 38 A 39 ? +A 1 THR 39 A 40 ? +A 1 SER 40 A 41 ? +A 1 ASN 41 A 42 ? +A 1 GLU 42 A 43 ? +A 1 ILE 43 A 44 ? +A 1 LYS 44 A 45 ? +A 1 GLU 45 A 46 ? +A 1 SER 46 A 47 ? +A 1 PRO 47 A 48 ? +A 1 LEU 48 A 49 ? +A 1 HIS 49 A 50 ? +A 1 GLY 50 A 51 ? +A 1 THR 51 A 52 ? +A 1 GLU 52 A 53 ? +A 1 ASN 53 A 54 ? +A 1 THR 54 A 55 ? +A 1 ILE 55 A 56 ? +A 1 ASN 56 A 57 ? +A 1 LYS 57 A 58 ? +A 1 ARG 58 A 59 ? +A 1 THR 59 A 60 ? +A 1 GLN 60 A 61 ? +A 1 PRO 61 A 62 ? +A 1 THR 62 A 63 ? +A 1 PHE 63 A 64 ? +A 1 GLY 64 A 65 ? +A 1 PHE 65 A 66 ? +A 1 THR 66 A 67 ? +A 1 VAL 67 A 68 ? +A 1 ASN 68 A 69 ? +A 1 TRP 69 A 70 ? +A 1 LYS 70 A 71 ? +A 1 PHE 71 A 72 ? +A 1 SER 72 A 73 ? +A 1 GLU 73 A 74 ? +A 1 SER 74 A 75 ? +A 1 THR 75 A 76 ? +A 1 THR 76 A 77 ? +A 1 VAL 77 A 78 ? +A 1 PHE 78 A 79 ? +A 1 THR 79 A 80 ? +A 1 GLY 80 A 81 ? +A 1 GLN 81 A 82 ? +A 1 CYS 82 A 83 ? +A 1 PHE 83 A 84 ? +A 1 ILE 84 A 85 ? +A 1 ASP 85 A 86 ? +A 1 ARG 86 A 87 ? +A 1 ASN 87 A 88 ? +A 1 GLY 88 A 89 ? +A 1 LYS 89 A 90 ? +A 1 GLU 90 A 91 ? +A 1 VAL 91 A 92 ? +A 1 LEU 92 A 93 ? +A 1 LYS 93 A 94 ? +A 1 THR 94 A 95 ? +A 1 MET 95 A 96 ? +A 1 TRP 96 A 97 ? +A 1 LEU 97 A 98 ? +A 1 LEU 98 A 99 ? +A 1 ARG 99 A 100 ? +A 1 SER 100 A 101 ? +A 1 SER 101 A 102 ? +A 1 VAL 102 A 103 ? +A 1 ASN 103 A 104 ? +A 1 ASP 104 A 105 ? +A 1 ILE 105 A 106 ? +A 1 GLY 106 A 107 ? +A 1 ASP 107 A 108 ? +A 1 ASP 108 A 109 ? +A 1 TRP 109 A 110 ? +A 1 LYS 110 A 111 ? +A 1 ALA 111 A 112 ? +A 1 THR 112 A 113 ? +A 1 ARG 113 A 114 ? +A 1 VAL 114 A 115 ? +A 1 GLY 115 A 116 ? +A 1 ILE 116 A 117 ? +A 1 ASN 117 A 118 ? +A 1 ILE 118 A 119 ? +A 1 PHE 119 A 120 ? +A 1 THR 120 A 121 ? +A 1 ARG 121 A 122 ? +A 1 LEU 122 A 123 ? +A 1 ARG 123 A 124 ? +A 1 THR 124 A 125 ? +# From 5d62a8041a9a55aa23ded87f130c3d06322aee25 Mon Sep 17 00:00:00 2001 From: yusuf1759 Date: Wed, 2 Oct 2024 22:41:40 -0400 Subject: [PATCH 08/16] chore: add apo linked file --- .../plinder/mount/linked_structures/apo.zip | Bin 0 -> 186166 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/test_data/plinder/mount/linked_structures/apo.zip diff --git a/tests/test_data/plinder/mount/linked_structures/apo.zip b/tests/test_data/plinder/mount/linked_structures/apo.zip new file mode 100644 index 0000000000000000000000000000000000000000..876e6177b76607ed9cc12e58bab86221eff984d8 GIT binary patch literal 186166 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 =&BzF$B0b6n)-;_oMFAaQ0>hazWB+eRLzNL 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
IEc?OcRt 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 L06=m-w*&kOm8)Zj literal 0 HcmV?d00001 From 2054c7864f7ce8abc41d0d11e89739fa8253f464 Mon Sep 17 00:00:00 2001 From: yusuf1759 Date: Thu, 3 Oct 2024 02:57:36 +0000 Subject: [PATCH 09/16] fix: tests --- tests/core/test_core_system.py | 39 ++++++++++++++++------------------ 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/tests/core/test_core_system.py b/tests/core/test_core_system.py index 2216d2eb..08ae8d03 100644 --- a/tests/core/test_core_system.py +++ b/tests/core/test_core_system.py @@ -70,44 +70,41 @@ def test_plinder_structure(read_plinder_mount): assert len(holo_struc.ligand_sdfs) feat = system_featurizer(s) # Check the selected apo structure - feat[1] == "1rav_A" + assert feat[1] == "1vyo_B" # Check seqres to holo mask seqres_holo_mask = feat[0]["holo_features"][ "holo_input_sequence_residue_mask_stacked" ] - assert np.array(seqres_holo_mask[:, :2]) == np.array([[0, 0]]) + assert np.allclose(np.array(seqres_holo_mask[:, :2]), np.array([[0, 0]])) # Check seqres to apo mask seqres_apo_mask = feat[0]["apo_features"][ - "apo_input_sequence_residue_masks_stacked" + "apo_input_sequence_residue_mask_stacked" ] - assert np.array(seqres_apo_mask[:, -3:]) == np.array([[0, 0, 0]]) + assert np.allclose(np.array(seqres_apo_mask[:, -3:]), np.array([[0, 0, 0]])) # Check apo to holo mask - apo_holo_mask = feat[0]["apo_features"]["apo_input_sequence_residue_masks_stacked"] - assert np.array(apo_holo_mask[:, -3:]) == np.array([[0, 0, 0]]) + apo_holo_mask = feat[0]["apo_features"]["apo_input_sequence_residue_mask_stacked"] + assert np.allclose(np.array(apo_holo_mask[:, -3:]), np.array([[0, 0, 0]])) - assert np.array( + assert np.allclose(np.array( feat[0]["apo_features"]["apo_protein_coordinates_stacked"].shape - ) == np.array([1, 976, 3]) - assert np.array( + ), np.array([1, 958, 3])) + assert np.allclose(np.array( feat[0]["apo_features"]["apo_protein_calpha_coordinates_stacked"].shape - ) == np.array([1, 128, 3]) + ), np.array([1, 122, 3])) - assert np.array( - feat[0]["holo_features"]["holo_protein_calpha_coordinates_stacked"].shape - ) == np.array([1, 123, 3]) - assert np.array( + assert np.allclose(np.array( feat[0]["holo_features"]["holo_protein_calpha_coordinates_stacked"].shape - ) == np.array([1, 123, 3]) + ), np.array([1, 123, 3])) - assert np.array( + assert np.allclose(np.array( feat[0]["holo_features"]["holo_protein_coordinates_stacked"].shape - ) == np.array([1, 964, 3]) + ), np.array([1, 964, 3])) - assert np.array( + assert np.allclose(np.array( feat[0]["sequence_features"]["input_sequence_residue_feat_stack"].shape - ) == np.array([1, 128, 21]) + ), np.array([1, 128, 21])) - assert np.array( + assert np.allclose(np.array( feat[0]["sequence_features"]["input_sequence_full_atom_feat_stack"].shape - ) == np.array([1, 1007, 12]) + ), np.array([1, 1007, 12])) From d7718724d803f2f2fbbf6f5c591014e8acfa17ba Mon Sep 17 00:00:00 2001 From: yusuf1759 Date: Wed, 2 Oct 2024 22:59:46 -0400 Subject: [PATCH 10/16] chore: fix linting again --- tests/core/test_core_system.py | 55 ++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/tests/core/test_core_system.py b/tests/core/test_core_system.py index 08ae8d03..cedef764 100644 --- a/tests/core/test_core_system.py +++ b/tests/core/test_core_system.py @@ -77,34 +77,45 @@ def test_plinder_structure(read_plinder_mount): ] assert np.allclose(np.array(seqres_holo_mask[:, :2]), np.array([[0, 0]])) # Check seqres to apo mask - seqres_apo_mask = feat[0]["apo_features"][ - "apo_input_sequence_residue_mask_stacked" - ] + seqres_apo_mask = feat[0]["apo_features"]["apo_input_sequence_residue_mask_stacked"] assert np.allclose(np.array(seqres_apo_mask[:, -3:]), np.array([[0, 0, 0]])) # Check apo to holo mask apo_holo_mask = feat[0]["apo_features"]["apo_input_sequence_residue_mask_stacked"] assert np.allclose(np.array(apo_holo_mask[:, -3:]), np.array([[0, 0, 0]])) - assert np.allclose(np.array( - feat[0]["apo_features"]["apo_protein_coordinates_stacked"].shape - ), np.array([1, 958, 3])) - assert np.allclose(np.array( - feat[0]["apo_features"]["apo_protein_calpha_coordinates_stacked"].shape - ), np.array([1, 122, 3])) - + assert np.allclose( + np.array(feat[0]["apo_features"]["apo_protein_coordinates_stacked"].shape), + np.array([1, 958, 3]), + ) + assert np.allclose( + np.array( + feat[0]["apo_features"]["apo_protein_calpha_coordinates_stacked"].shape + ), + np.array([1, 122, 3]), + ) - assert np.allclose(np.array( - feat[0]["holo_features"]["holo_protein_calpha_coordinates_stacked"].shape - ), np.array([1, 123, 3])) + assert np.allclose( + np.array( + feat[0]["holo_features"]["holo_protein_calpha_coordinates_stacked"].shape + ), + np.array([1, 123, 3]), + ) - assert np.allclose(np.array( - feat[0]["holo_features"]["holo_protein_coordinates_stacked"].shape - ), np.array([1, 964, 3])) + assert np.allclose( + np.array(feat[0]["holo_features"]["holo_protein_coordinates_stacked"].shape), + np.array([1, 964, 3]), + ) - assert np.allclose(np.array( - feat[0]["sequence_features"]["input_sequence_residue_feat_stack"].shape - ), np.array([1, 128, 21])) + assert np.allclose( + np.array( + feat[0]["sequence_features"]["input_sequence_residue_feat_stack"].shape + ), + np.array([1, 128, 21]), + ) - assert np.allclose(np.array( - feat[0]["sequence_features"]["input_sequence_full_atom_feat_stack"].shape - ), np.array([1, 1007, 12])) + assert np.allclose( + np.array( + feat[0]["sequence_features"]["input_sequence_full_atom_feat_stack"].shape + ), + np.array([1, 1007, 12]), + ) From 8322aede42c06877e3c16bda3c5847723d5a003c Mon Sep 17 00:00:00 2001 From: yusuf1759 Date: Thu, 3 Oct 2024 18:28:04 +0000 Subject: [PATCH 11/16] fix: failing tests --- src/plinder/core/structure/structure.py | 1 + tests/core/test_data_loader.py | 11 ++++++++++- .../plinder/mount/splits/split.parquet | Bin 5223 -> 5199 bytes 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/plinder/core/structure/structure.py b/src/plinder/core/structure/structure.py index f545560f..b5ade3a6 100644 --- a/src/plinder/core/structure/structure.py +++ b/src/plinder/core/structure/structure.py @@ -454,6 +454,7 @@ def input_sequence_residue_mask_stacked(self) -> list[list[int]]: seqres_masks = get_residue_index_mapping_mask( self.protein_sequence, self.protein_atom_array ) + print(seqres_masks.keys()) return [seqres_masks[ch] for ch in self.protein_chain_ordered] def protein_structure_residue_mask(self, other: Structure) -> list[list[int]]: diff --git a/tests/core/test_data_loader.py b/tests/core/test_data_loader.py index 9f2d7ad5..2474f4ad 100644 --- a/tests/core/test_data_loader.py +++ b/tests/core/test_data_loader.py @@ -3,5 +3,14 @@ def test_data_loader(read_plinder_mount): from plinder.core.loader import PlinderDataset - ds = PlinderDataset(split="removed", use_alternate_structures=False) + FILTERS = [ + ( + "system_id", + "in", + ["19hc__1__1.B__1.T", "19hc__1__1.A__1.I", "1avd__1__1.A__1.C"], + ) + ] + ds = PlinderDataset( + split="removed", filters=FILTERS, use_alternate_structures=False + ) assert len(ds[0]) diff --git a/tests/test_data/plinder/mount/splits/split.parquet b/tests/test_data/plinder/mount/splits/split.parquet index f21db93191698700b4ec569db061a41263a4468e..7ed8d6c42e1d2d47fe8228dd177b29b120dee590 100644 GIT binary patch delta 675 zcma)&K}eKA6vyA2`M%Ftc6VCMH~6V&=K5SjB8x;s%(a6GOGt*G1dC(`VFht53_3@6 zO6FQAff5C=s0R<8B06*lRQBMZQ&7jeNklZOEK(@!FmL8Ezj^=n`=0ueqS5r7F7jwy z(jUx_Ca3|}Tc*kD)!l>OKZm=$1dzrx81boZ>d|yI+vWC^bm_Q7K!)l&9hRVg0^5N7 z*8rj^0RS4MeDU+y z8TU=BlVuc`ILC)mfRUNG9GKmR@Jzx?0$E>!2L+#q+I;LWv#!pO2>H>_6%nfQcco5oH ziwklxOTao7Fp8~URQtiLwqde0a|}?&3}!i?ADEZ}UZ~CEpS+)0lt(~p3nLJz9pO`Z zHTeN^u(|*+G}uJhWXu>en3Ii+Bv_LT&5SL9j^|Qg0+Jxz3{!wkh+HW0mI> z5L?G2*2bjvNm#8xc=87poyiFtLX&5(&Sw{pl#$HA4Db*&qJzp^iKy^VXT}jG%1qe3 atIVv1$MwP-8wA7z)HuZ6Y_8_G!VLgWHk%9p From 1496e706169fe6cfce10aed7d0c4bdd60aa5b757 Mon Sep 17 00:00:00 2001 From: OleinikovasV Date: Tue, 22 Oct 2024 12:16:17 +0000 Subject: [PATCH 12/16] 'chore: cleaning up docs and var names' --- docs/examples/4_align_mask_crop.ipynb | 1527 +++++++++++++++++++++-- src/plinder/core/structure/structure.py | 16 +- 2 files changed, 1431 insertions(+), 112 deletions(-) diff --git a/docs/examples/4_align_mask_crop.ipynb b/docs/examples/4_align_mask_crop.ipynb index 3bec9508..973dbef1 100644 --- a/docs/examples/4_align_mask_crop.ipynb +++ b/docs/examples/4_align_mask_crop.ipynb @@ -9,7 +9,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -29,9 +29,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 120, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-10-22 12:10:50,756 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-10-22 12:10:50,757 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-10-22 12:10:50,900 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-10-22 12:10:50,902 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-10-22 12:10:50,904 | plinder.core.index.utils:148 | INFO : loading entries from 1 zips\n", + "2024-10-22 12:10:50,923 | plinder.core.index.utils:163 | INFO : loaded 1 entries\n", + "2024-10-22 12:10:50,924 | plinder.core.index.utils.load_entries:24 | INFO : runtime succeeded: 0.16s\n" + ] + } + ], "source": [ "from plinder.core import PlinderSystem\n", "\n", @@ -44,7 +58,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- We list all fields and their `FieldInfo` to show which ones are required. `id`, `protein_path` and `protein_sequence` are required. Everything else is optionally. Particularly worth mentioning is the decision to make `list_ligand_sdf_and_input_smiles` optional; this is because ligand will not be availbale in apo and predicted structures.\n", + "- We list all fields and their `FieldInfo` to show which ones are required. `id`, `protein_path` and `protein_sequence` are required. Everything else is optional.\n", + "Particularly worth mentioning is the decision to make `list_ligand_sdf_and_input_smiles` optional; this is because ligand will not be availbale in apo and predicted structures.\n", "- Out of these field `ligand_mols` and `protein_atom_array` is computed within the object if set to default. \n", "- `ligand_mols` returns a chain-mapped dictionary of of the form:\n", " ```\n", @@ -59,15 +74,34 @@ " }\n", " ```\n", "- While `protein_atom_array` returns [biotite AtomArray](https://www.biotite-python.org/latest/apidoc/biotite.structure.AtomArray.html) of the receptor protein structure.\n", - "- `add_ligand_hydrogens` specifies whether to adds hydrogens to ligand\n", + "- `add_ligand_hydrogens` specifies whether to add explicit hydrogens to the ligand input structures\n", "- `structure_type`: could be `\"holo\"`, `\"apo\"` or `\"pred\"`" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 121, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "{'id': FieldInfo(annotation=str, required=True),\n", + " 'protein_path': FieldInfo(annotation=Path, required=True),\n", + " 'protein_sequence': FieldInfo(annotation=Union[dict[str, str], NoneType], required=False, default=None),\n", + " 'ligand_sdfs': FieldInfo(annotation=Union[dict[str, str], NoneType], required=False, default=None),\n", + " 'ligand_smiles': FieldInfo(annotation=Union[dict[str, str], NoneType], required=False, default=None),\n", + " 'protein_atom_array': FieldInfo(annotation=Union[AtomArray, NoneType], required=False, default=None),\n", + " 'ligand_mols': FieldInfo(annotation=Union[dict[str, tuple[Mol, Mol, Mol, tuple[ndarray[Any, dtype[+_ScalarType_co]], ndarray[Any, dtype[+_ScalarType_co]]]]], NoneType], required=False, default=None),\n", + " 'add_ligand_hydrogens': FieldInfo(annotation=bool, required=False, default=False),\n", + " 'structure_type': FieldInfo(annotation=str, required=False, default='holo')}" + ] + }, + "execution_count": 121, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "system_structure.model_fields" ] @@ -79,31 +113,51 @@ "## Ligand" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for name in system_structure.get_properties():\n", - " if \"ligand\" in name:\n", - " print(name)" - ] - }, { "cell_type": "markdown", "metadata": {}, "source": [ - "The ligands are provided using dictionaries.\n", + "The ligands are information is provided using dictionaries.\n", "\n", - "These dictionaries contain information for each ligand:\n", + "These dictionaries contain information for each ligand using chain tag key:\n", "- `input_ligand_templates`: 2D RDKit mols generated from the RDKit canonical SMILES\n", "- `input_ligand_conformers`: 3D (random) conformers generated for each input mol\n", + "- `input_ligand_conformers_atom_array`: biotite atom array object for each input mol\n", "- `input_ligand_conformers_coords`: positional coordintates for 3D conformers\n", - "- `resolved_ligand_mols`: RDKit mols of solved (holo) ligand structures\n", + "- `resolved_ligand_mols`: RDKit mols of resolved (holo) ligand structures\n", + "- `resolved_ligand_mols_atom_array`: biotite atom array object for each resolved mol\n", "- `resolved_ligand_mols_coords`: positional coordintates for holo ligand structures\n", "- `ligand_template2resolved_atom_order_stacks`: paired stacked arrays (template vs holo) mapping atom order by index\n", - "- `ligand_chain_ordered`: ordered list of all ligands by their keys" + "\n", + "Additional property provided as an ordered list\n", + "- `ligand_chain_ordered`: ordered list of all ligands by their chain tag keys" + ] + }, + { + "cell_type": "code", + "execution_count": 122, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "input_ligand_conformers\n", + "input_ligand_conformers_atom_array\n", + "input_ligand_conformers_coords\n", + "input_ligand_templates\n", + "ligand_atom_array\n", + "ligand_chain_ordered\n", + "ligand_template2resolved_atom_order_stacks\n", + "resolved_ligand_mols\n", + "resolved_ligand_mols_coords\n" + ] + } + ], + "source": [ + "for name in system_structure.get_properties():\n", + " if \"ligand\" in name:\n", + " print(name)" ] }, { @@ -117,34 +171,70 @@ "\n", "This is important when calculating ligand structure loss, as the most optimal atom order can change between the different inference results. Typically, it is accepted to take the atom ordering resulting in the best objective score and use that for the loss calculation.\n", "\n", - "Occasionally futher ambiguity arises to to part of the ligand structure being unresolved in the holo structure - this can lead to multiple available matches. We use RascalMCES algorithm from RDKit to provide all the possible matches between the atom order in the input structure (from SMILES) to the resolved holo structure.\n", + "Occasionally, futher ambiguity arises to to part of the ligand structure being unresolved in the holo structure - this can lead to multiple available matches. We use RascalMCES algorithm from RDKit to provide all the possible matches between the atom order in the input structure (from SMILES) to the resolved holo structure.\n", "\n", "This is provided as stacks of atom order arrays that reorder the template and holo indices to provide matches. Each stack is a unique order transformation and should be iterated." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 123, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "execution_count": 123, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "system_structure.input_ligand_templates[system_structure.ligand_chain_ordered[0]]" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 124, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "execution_count": 124, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "system_structure.input_ligand_conformers[system_structure.ligand_chain_ordered[0]]" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 125, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "execution_count": 125, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "system_structure.resolved_ligand_mols[system_structure.ligand_chain_ordered[0]]" ] @@ -161,9 +251,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 126, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(array([[ 2, 10, 8, 6, 4, 5, 11, 9, 7, 3, 0, 1]]),\n", + " array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]]))" + ] + }, + "execution_count": 126, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "(\n", " input_atom_order_stack,\n", @@ -176,9 +278,31 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 127, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "array([[[-0.41258365, -1.47247022, 0.19190594],\n", + " [ 1.04999734, -1.31344674, 0.34536287],\n", + " [ 1.50924512, -0.06954471, 1.01688023],\n", + " [ 0.4414304 , 1.02662908, 1.03100725],\n", + " [-0.3494052 , 0.75274865, -0.25509704],\n", + " [-1.06483789, 1.95295446, -0.7530481 ],\n", + " [ 1.71111848, -1.47775582, -0.89392989],\n", + " [ 2.00933227, -0.2610022 , 2.29662695],\n", + " [-0.39876476, 0.72847291, 2.10418674],\n", + " [-1.13885328, -0.33293265, 0.02358181],\n", + " [-2.14780406, -1.84614112, -2.48741362],\n", + " [-0.8344732 , -2.66267578, -1.31015471]]])" + ] + }, + "execution_count": 127, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "system_structure.input_ligand_conformers_coords[\n", " system_structure.ligand_chain_ordered[0]\n", @@ -187,15 +311,115 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 128, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "array([[[-0.41258365, -1.47247022, 0.19190594],\n", + " [ 1.04999734, -1.31344674, 0.34536287],\n", + " [ 1.50924512, -0.06954471, 1.01688023],\n", + " [ 0.4414304 , 1.02662908, 1.03100725],\n", + " [-0.3494052 , 0.75274865, -0.25509704],\n", + " [-1.06483789, 1.95295446, -0.7530481 ],\n", + " [ 1.71111848, -1.47775582, -0.89392989],\n", + " [ 2.00933227, -0.2610022 , 2.29662695],\n", + " [-0.39876476, 0.72847291, 2.10418674],\n", + " [-1.13885328, -0.33293265, 0.02358181],\n", + " [-2.14780406, -1.84614112, -2.48741362],\n", + " [-0.8344732 , -2.66267578, -1.31015471]]])" + ] + }, + "execution_count": 128, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "system_structure.input_ligand_conformers_coords[\n", + " system_structure.ligand_chain_ordered[0]\n", + "][input_atom_order_stack]" + ] + }, + { + "cell_type": "code", + "execution_count": 129, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[[48.954, 28.186, 62.068],\n", + " [48.681, 29.643, 61.777],\n", + " [48.556, 29.933, 60.282],\n", + " [47.499, 28.988, 59.699],\n", + " [47.948, 27.56 , 59.939],\n", + " [46.992, 26.503, 59.374],\n", + " [49.72 , 30.41 , 62.383],\n", + " [48.255, 31.352, 60.148],\n", + " [46.262, 29.193, 60.366],\n", + " [48.031, 27.383, 61.339],\n", + " [50.647, 25.895, 62.426],\n", + " [50.853, 27.716, 61.696]]])" + ] + }, + "execution_count": 129, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "system_structure.resolved_ligand_mols_coords[system_structure.ligand_chain_ordered[0]][\n", " holo_atom_order_stack\n", "]" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Similar can be achieved for biotite atom arrays" + ] + }, + { + "cell_type": "code", + "execution_count": 130, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[Atom(np.array([-0.4126, -1.4725, 0.1919], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"C\", charge=0),\n", + " Atom(np.array([ 1.05 , -1.3134, 0.3454], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"C\", charge=0),\n", + " Atom(np.array([ 1.5092, -0.0695, 1.0169], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"C\", charge=0),\n", + " Atom(np.array([0.4414, 1.0266, 1.031 ], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"C\", charge=0),\n", + " Atom(np.array([-0.3494, 0.7527, -0.2551], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"C\", charge=0),\n", + " Atom(np.array([-1.0648, 1.953 , -0.753 ], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"C\", charge=0),\n", + " Atom(np.array([ 1.7111, -1.4778, -0.8939], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"O\", charge=0),\n", + " Atom(np.array([ 2.0093, -0.261 , 2.2966], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"O\", charge=0),\n", + " Atom(np.array([-0.3988, 0.7285, 2.1042], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"O\", charge=0),\n", + " Atom(np.array([-1.1389, -0.3329, 0.0236], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"O\", charge=0),\n", + " Atom(np.array([-2.1478, -1.8461, -2.4874], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"C\", charge=0),\n", + " Atom(np.array([-0.8345, -2.6627, -1.3102], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"SE\", charge=0)]],\n", + " dtype=object)" + ] + }, + "execution_count": 130, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import numpy as np\n", + "\n", + "np.array(\n", + " system_structure.input_ligand_conformers_atom_array[\n", + " system_structure.ligand_chain_ordered[0]\n", + " ]\n", + ")[input_atom_order_stack]" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -207,14 +431,39 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Symmetry in ligand (automorphism) - two ways of pairwise mapping the atom order" + "Symmetry in ligand (automorphism) - two ways of pairwise mapping the atom order of the phtalimide ring" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 131, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-10-22 12:11:01,533 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-10-22 12:11:01,535 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-10-22 12:11:01,648 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-10-22 12:11:01,649 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-10-22 12:11:01,650 | plinder.core.index.utils:148 | INFO : loading entries from 1 zips\n", + "2024-10-22 12:11:01,658 | plinder.core.index.utils:163 | INFO : loaded 1 entries\n", + "2024-10-22 12:11:01,660 | plinder.core.index.utils.load_entries:24 | INFO : runtime succeeded: 0.12s\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "execution_count": 131, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "structure_with_symmetry_in_ligand = PlinderSystem(\n", " system_id=\"4v2y__1__1.A__1.E\"\n", @@ -226,9 +475,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 132, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "execution_count": 132, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "structure_with_symmetry_in_ligand.resolved_ligand_mols[\n", " structure_with_symmetry_in_ligand.ligand_chain_ordered[0]\n", @@ -237,9 +498,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 133, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(array([[17, 16, 18, 1, 0, 2, 3, 4, 5, 10, 9, 8, 13, 7, 15, 12,\n", + " 11, 14, 6],\n", + " [17, 16, 18, 1, 0, 2, 3, 4, 5, 11, 12, 13, 8, 15, 7, 9,\n", + " 10, 6, 14]]),\n", + " array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n", + " 16, 17, 18],\n", + " [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n", + " 16, 17, 18]]))" + ] + }, + "execution_count": 133, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "structure_with_symmetry_in_ligand.ligand_template2resolved_atom_order_stacks[\n", " structure_with_symmetry_in_ligand.ligand_chain_ordered[0]\n", @@ -255,9 +534,34 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 134, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-10-22 12:11:02,795 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-10-22 12:11:02,796 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-10-22 12:11:02,927 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-10-22 12:11:02,931 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-10-22 12:11:02,933 | plinder.core.index.utils:148 | INFO : loading entries from 1 zips\n", + "2024-10-22 12:11:02,942 | plinder.core.index.utils:163 | INFO : loaded 1 entries\n", + "2024-10-22 12:11:02,945 | plinder.core.index.utils.load_entries:24 | INFO : runtime succeeded: 0.14s\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "execution_count": 134, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "structure_with_partly_resolved_ligand = PlinderSystem(\n", " system_id=\"1ngx__1__1.A_1.B__1.E\"\n", @@ -269,9 +573,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 135, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "execution_count": 135, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "structure_with_partly_resolved_ligand.resolved_ligand_mols[\n", " structure_with_partly_resolved_ligand.ligand_chain_ordered[0]\n", @@ -280,9 +596,31 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 136, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(array([[ 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,\n", + " 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37],\n", + " [ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,\n", + " 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29],\n", + " [ 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,\n", + " 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33]]),\n", + " array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n", + " 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27],\n", + " [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n", + " 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27],\n", + " [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n", + " 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]]))" + ] + }, + "execution_count": 136, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "structure_with_partly_resolved_ligand.ligand_template2resolved_atom_order_stacks[\n", " structure_with_partly_resolved_ligand.ligand_chain_ordered[0]\n", @@ -293,44 +631,468 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Protein" + "## Protein [ WIP ]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The protein information is provided with properties.\n", + "\n", + "#### General properties:\n", + "- `protein_chains`: list of all protein chains\n", + "- `protein_chain_ordered`: ordered list of all protein chains by their chain tag keys\n", + "- `protein_n_atoms`: total number of atoms in protein structure\n", + "- `protein_coords`: an array of atomic positions for each protein atom in the structure\n", + "- `protein_structure_b_factor`: an array of B-factors for each protein atom in the structure\n", + "- `protein_sequence_from_structure`: residue sequence derived from structure\n", + "\n", + "\n", + "protein_backbone_mask\n", + "protein_calpha_mask\n", + "protein_calpha_coords\n", + "protein_chains\n", + "protein_coords\n", + "protein_n_atoms\n", + "protein_sequence_from_structure\n", + "protein_structure_b_factor\n", + "protein_structure_tokenized_sequence\n", + "protein_unique_atom_names\n", + "protein_unique_residue_ids\n", + "protein_unique_residue_names\n", + "\n", + "#### Masking\n", + "\n", + "The properties `protein_backbone_mask` and `protein_calpha_mask` are boolean masks that can be used to select backbone or calpha atoms from biotite `AtomArray`. The indices of `True` corresponds to backbone or calpha indices.\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 137, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(2443,)" + ] + }, + "execution_count": 137, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "for name in system_structure.get_properties():\n", - " if \"protein\" in name:\n", - " print(name)" + "np.shape(system_structure.protein_calpha_mask)" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 138, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True],\n", + " [ True, True, True]])" + ] + }, + "execution_count": 138, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "system_structure.protein_coords[0][system_structure.protein_calpha_mask] == system_structure.protein_calpha_coords[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 159, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(2, 2)" + ] + }, + "execution_count": 159, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(system_structure.protein_calpha_coords), len(system_structure.protein_calpha_coords)" + ] + }, + { + "cell_type": "code", + "execution_count": 141, "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "protein_backbone_mask\n", + "protein_calpha_coords\n", + "protein_calpha_mask\n", + "protein_chain_ordered\n", + "protein_chains\n", + "protein_coords\n", + "protein_n_atoms\n", + "protein_sequence_from_structure\n", + "protein_structure_b_factor\n", + "protein_structure_tokenized_sequence\n", + "protein_unique_atom_names\n", + "protein_unique_residue_ids\n", + "protein_unique_residue_names\n" + ] + } + ], "source": [ - "### Others properties\n", - "This includes:\n", - "- `num_ligands`: Number of ligand chains\n", - "- `smiles`: Ligand smiles dictionary\n", - "- `num_proteins`: Number of protein chains\n" + "for name in system_structure.get_properties():\n", + " if \"protein\" in name:\n", + " print(name)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Masking\n", - "The properties `protein_backbone_mask` and `protein_calpha_mask` are boolean masks that can be used to select backbone or calpha atoms from biotite `AtomArray`. The indices of `True` corresponds to backbone or calpha indices." + "### Masking\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 142, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total number of atoms: 2443\n", + "Number of backbone atoms: 942\n", + "Number of calpha atoms: 314\n" + ] + } + ], "source": [ "print(\n", " \"Total number of atoms:\",\n", @@ -345,9 +1107,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 143, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(314, 3)" + ] + }, + "execution_count": 143, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "calpha_atom_array = system_structure.protein_atom_array[\n", " system_structure.protein_calpha_mask\n", @@ -364,7 +1137,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 144, "metadata": {}, "outputs": [], "source": [ @@ -376,9 +1149,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 145, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(314, 3)" + ] + }, + "execution_count": 145, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "calpha_structure.protein_atom_array.coord.shape" ] @@ -393,9 +1177,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 146, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "['1.C']" + ] + }, + "execution_count": 146, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "system_structure.protein_chain_ordered" ] @@ -410,9 +1205,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 147, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "['1.C']" + ] + }, + "execution_count": 147, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "system_structure.protein_chains" ] @@ -427,29 +1233,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 148, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "[array([[48.761, 52.015, 58.719],\n", + " [48.178, 50.968, 57.827],\n", + " [49.186, 50.593, 56.712],\n", + " ...,\n", + " [50.066, 42.485, 54.198],\n", + " [47.368, 43.433, 55.544],\n", + " [50.022, 44.674, 54.248]], dtype=float32)]" + ] + }, + "execution_count": 148, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "system_structure.protein_coords" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Get number of atoms of protein molecule" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "system_structure.protein_n_atoms" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -460,9 +1267,58 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 149, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "['C',\n", + " 'CA',\n", + " 'CB',\n", + " 'CD',\n", + " 'CD1',\n", + " 'CD2',\n", + " 'CE',\n", + " 'CE1',\n", + " 'CE2',\n", + " 'CE3',\n", + " 'CG',\n", + " 'CG1',\n", + " 'CG2',\n", + " 'CH2',\n", + " 'CM',\n", + " 'CZ',\n", + " 'CZ2',\n", + " 'CZ3',\n", + " 'N',\n", + " 'ND1',\n", + " 'ND2',\n", + " 'NE',\n", + " 'NE1',\n", + " 'NE2',\n", + " 'NH1',\n", + " 'NH2',\n", + " 'NZ',\n", + " 'O',\n", + " 'OD1',\n", + " 'OD2',\n", + " 'OE1',\n", + " 'OE2',\n", + " 'OG',\n", + " 'OG1',\n", + " 'OH',\n", + " 'OXT',\n", + " 'SD',\n", + " 'SE',\n", + " 'SG']" + ] + }, + "execution_count": 149, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "system_structure.protein_unique_atom_names" ] @@ -476,9 +1332,40 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 150, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "['ALA',\n", + " 'ARG',\n", + " 'ASN',\n", + " 'ASP',\n", + " 'CSD',\n", + " 'CSK',\n", + " 'GLN',\n", + " 'GLU',\n", + " 'GLY',\n", + " 'HIS',\n", + " 'ILE',\n", + " 'LEU',\n", + " 'LYS',\n", + " 'MET',\n", + " 'PHE',\n", + " 'PRO',\n", + " 'SER',\n", + " 'THR',\n", + " 'TRP',\n", + " 'TYR',\n", + " 'VAL']" + ] + }, + "execution_count": 150, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "system_structure.protein_unique_residue_names" ] @@ -493,9 +1380,333 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 151, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "[2,\n", + " 3,\n", + " 4,\n", + " 5,\n", + " 6,\n", + " 7,\n", + " 8,\n", + " 9,\n", + " 10,\n", + " 11,\n", + " 12,\n", + " 13,\n", + " 14,\n", + " 15,\n", + " 16,\n", + " 17,\n", + " 18,\n", + " 19,\n", + " 20,\n", + " 21,\n", + " 22,\n", + " 23,\n", + " 24,\n", + " 25,\n", + " 26,\n", + " 27,\n", + " 28,\n", + " 29,\n", + " 30,\n", + " 31,\n", + " 32,\n", + " 33,\n", + " 34,\n", + " 35,\n", + " 36,\n", + " 37,\n", + " 38,\n", + " 39,\n", + " 40,\n", + " 41,\n", + " 42,\n", + " 43,\n", + " 44,\n", + " 45,\n", + " 46,\n", + " 47,\n", + " 48,\n", + " 49,\n", + " 50,\n", + " 51,\n", + " 52,\n", + " 53,\n", + " 54,\n", + " 55,\n", + " 56,\n", + " 57,\n", + " 58,\n", + " 59,\n", + " 60,\n", + " 61,\n", + " 62,\n", + " 63,\n", + " 64,\n", + " 65,\n", + " 66,\n", + " 67,\n", + " 68,\n", + " 69,\n", + " 70,\n", + " 71,\n", + " 72,\n", + " 73,\n", + " 74,\n", + " 75,\n", + " 76,\n", + " 77,\n", + " 78,\n", + " 79,\n", + " 80,\n", + " 81,\n", + " 82,\n", + " 83,\n", + " 84,\n", + " 85,\n", + " 86,\n", + " 87,\n", + " 88,\n", + " 89,\n", + " 90,\n", + " 91,\n", + " 92,\n", + " 93,\n", + " 94,\n", + " 95,\n", + " 96,\n", + " 97,\n", + " 98,\n", + " 99,\n", + " 100,\n", + " 101,\n", + " 102,\n", + " 103,\n", + " 104,\n", + " 105,\n", + " 106,\n", + " 107,\n", + " 108,\n", + " 109,\n", + " 110,\n", + " 111,\n", + " 112,\n", + " 113,\n", + " 114,\n", + " 115,\n", + " 116,\n", + " 117,\n", + " 118,\n", + " 119,\n", + " 120,\n", + " 121,\n", + " 122,\n", + " 123,\n", + " 124,\n", + " 125,\n", + " 126,\n", + " 127,\n", + " 128,\n", + " 129,\n", + " 130,\n", + " 131,\n", + " 132,\n", + " 133,\n", + " 134,\n", + " 135,\n", + " 136,\n", + " 137,\n", + " 138,\n", + " 139,\n", + " 140,\n", + " 141,\n", + " 142,\n", + " 143,\n", + " 144,\n", + " 145,\n", + " 146,\n", + " 147,\n", + " 148,\n", + " 149,\n", + " 150,\n", + " 151,\n", + " 152,\n", + " 153,\n", + " 154,\n", + " 155,\n", + " 156,\n", + " 157,\n", + " 158,\n", + " 159,\n", + " 160,\n", + " 161,\n", + " 162,\n", + " 163,\n", + " 164,\n", + " 165,\n", + " 166,\n", + " 167,\n", + " 168,\n", + " 169,\n", + " 170,\n", + " 171,\n", + " 172,\n", + " 173,\n", + " 174,\n", + " 175,\n", + " 176,\n", + " 177,\n", + " 178,\n", + " 179,\n", + " 180,\n", + " 181,\n", + " 182,\n", + " 183,\n", + " 184,\n", + " 185,\n", + " 186,\n", + " 187,\n", + " 188,\n", + " 189,\n", + " 190,\n", + " 191,\n", + " 192,\n", + " 193,\n", + " 194,\n", + " 195,\n", + " 196,\n", + " 197,\n", + " 198,\n", + " 199,\n", + " 200,\n", + " 201,\n", + " 202,\n", + " 203,\n", + " 204,\n", + " 205,\n", + " 206,\n", + " 207,\n", + " 208,\n", + " 209,\n", + " 210,\n", + " 211,\n", + " 212,\n", + " 213,\n", + " 214,\n", + " 215,\n", + " 216,\n", + " 217,\n", + " 218,\n", + " 219,\n", + " 220,\n", + " 221,\n", + " 222,\n", + " 223,\n", + " 224,\n", + " 225,\n", + " 226,\n", + " 227,\n", + " 228,\n", + " 229,\n", + " 230,\n", + " 231,\n", + " 232,\n", + " 233,\n", + " 234,\n", + " 235,\n", + " 236,\n", + " 237,\n", + " 238,\n", + " 239,\n", + " 240,\n", + " 241,\n", + " 242,\n", + " 243,\n", + " 244,\n", + " 245,\n", + " 246,\n", + " 247,\n", + " 248,\n", + " 249,\n", + " 250,\n", + " 251,\n", + " 252,\n", + " 253,\n", + " 254,\n", + " 255,\n", + " 256,\n", + " 257,\n", + " 258,\n", + " 259,\n", + " 260,\n", + " 261,\n", + " 262,\n", + " 263,\n", + " 264,\n", + " 265,\n", + " 266,\n", + " 267,\n", + " 268,\n", + " 269,\n", + " 270,\n", + " 271,\n", + " 272,\n", + " 273,\n", + " 274,\n", + " 275,\n", + " 276,\n", + " 277,\n", + " 278,\n", + " 279,\n", + " 280,\n", + " 281,\n", + " 282,\n", + " 283,\n", + " 284,\n", + " 285,\n", + " 286,\n", + " 287,\n", + " 288,\n", + " 289,\n", + " 290,\n", + " 291,\n", + " 292,\n", + " 293,\n", + " 294,\n", + " 295,\n", + " 296,\n", + " 297,\n", + " 298,\n", + " 299,\n", + " 300,\n", + " 301,\n", + " 302,\n", + " 303,\n", + " 304,\n", + " 305,\n", + " 306,\n", + " 307,\n", + " 308,\n", + " 309,\n", + " 310,\n", + " 311,\n", + " 312,\n", + " 313,\n", + " 314,\n", + " 315]" + ] + }, + "execution_count": 151, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "system_structure.protein_unique_residue_ids" ] @@ -509,9 +1720,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 152, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'STPGAQQVLFRTGIAAVNSTNHLRVYFQDVYGSIRESLYEGSWANGTEKNVIGNAKLGSPVAATSKELKHIRVYTLTEGNTLQEFAYDSGTGWYNGGLGGAKFQVAPYSXIAAVFLAGTDALQLRIYAQKPDNTIQEYMWNGDGWKEGTNLGGALPGTGIGATSFRYTDYNGPSIRIWFQTDDLKLVQRAYDPHKGWYPDLVTIFDRAPPRTAIAATSFGAGNSSIYMRIYFVNSDNTIWQVCWDHGKGYHDKGTITPVIQGSEVAIISWGSFANNGPDLRLYFQNGTYISAVSEWVWNRAHGSQLGRSALPPA'" + ] + }, + "execution_count": 152, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "system_structure.protein_sequence_from_structure" ] @@ -525,9 +1747,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 153, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "{'1.C': 'MSTPGAQQVLFRTGIAAVNSTNHLRVYFQDVYGSIRESLYEGSWANGTEKNVIGNAKLGSPVAATSKELKHIRVYTLTEGNTLQEFAYDSGTGWYNGGLGGAKFQVAPYSXIAAVFLAGTDALQLRIYAQKPDNTIQEYMWNGDGWKEGTNLGGALPGTGIGATSFRYTDYNGPSIRIWFQTDDLKLVQRAYDPHKGWYPDLVTIFDRAPPRTAIAATSFGAGNSSIYMRIYFVNSDNTIWQVCWDHGKGYHDKGTITPVIQGSEVAIISWGSFANNGPDLRLYFQNGTYISAVSEWVWNRAHGSQLGRSALPPA'}" + ] + }, + "execution_count": 153, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "system_structure.protein_sequence" ] @@ -542,9 +1775,37 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 154, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([15, 16, 14, 7, 0, 5, 5, 19, 10, 13, 1, 16, 7, 9, 0, 0, 19, 2,\n", + " 15, 16, 2, 8, 10, 1, 19, 18, 13, 5, 3, 19, 18, 7, 15, 9, 1, 6,\n", + " 15, 10, 18, 6, 7, 15, 17, 0, 2, 7, 16, 6, 11, 2, 19, 9, 7, 2,\n", + " 0, 11, 10, 7, 15, 14, 19, 0, 0, 16, 15, 11, 6, 10, 11, 8, 9, 1,\n", + " 19, 18, 16, 10, 16, 6, 7, 2, 16, 10, 5, 6, 13, 0, 18, 3, 15, 7,\n", + " 16, 7, 17, 18, 2, 7, 7, 10, 7, 7, 0, 11, 13, 5, 19, 0, 14, 18,\n", + " 15, 20, 9, 0, 0, 19, 13, 10, 0, 7, 16, 3, 0, 10, 5, 10, 1, 9,\n", + " 18, 0, 5, 11, 14, 3, 2, 16, 9, 5, 6, 18, 12, 17, 2, 7, 3, 7,\n", + " 17, 11, 6, 7, 16, 2, 10, 7, 7, 0, 10, 14, 7, 16, 7, 9, 7, 0,\n", + " 16, 15, 13, 1, 18, 16, 3, 18, 2, 7, 14, 15, 9, 1, 9, 17, 13, 5,\n", + " 16, 3, 3, 10, 11, 10, 19, 5, 1, 0, 18, 3, 14, 8, 11, 7, 17, 18,\n", + " 14, 3, 10, 19, 16, 9, 13, 3, 1, 0, 14, 14, 1, 16, 0, 9, 0, 0,\n", + " 16, 15, 13, 7, 0, 7, 2, 15, 15, 9, 18, 12, 1, 9, 18, 13, 19, 2,\n", + " 15, 3, 2, 16, 9, 17, 5, 19, 4, 17, 3, 8, 7, 11, 7, 18, 8, 3,\n", + " 11, 7, 16, 9, 16, 14, 19, 9, 5, 7, 15, 6, 19, 0, 9, 9, 15, 17,\n", + " 7, 15, 13, 0, 2, 2, 7, 14, 3, 10, 1, 10, 18, 13, 5, 2, 7, 16,\n", + " 18, 9, 15, 0, 19, 15, 6, 17, 19, 17, 2, 1, 0, 8, 7, 15, 5, 10,\n", + " 7, 1, 15, 0, 10, 14, 14, 0])" + ] + }, + "execution_count": 154, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "system_structure.protein_structure_tokenized_sequence" ] @@ -553,7 +1814,60 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Linked protein input structures\n", + "### More complex example - two proteins [ TO BE FIXED ]" + ] + }, + { + "cell_type": "code", + "execution_count": 155, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-10-22 12:12:34,047 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-10-22 12:12:34,049 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-10-22 12:12:34,165 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-10-22 12:12:34,166 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-10-22 12:12:34,168 | plinder.core.index.utils:148 | INFO : loading entries from 1 zips\n", + "2024-10-22 12:12:34,174 | plinder.core.index.utils:163 | INFO : loaded 1 entries\n", + "2024-10-22 12:12:34,175 | plinder.core.index.utils.load_entries:24 | INFO : runtime succeeded: 0.12s\n" + ] + } + ], + "source": [ + "# plinder_system = PlinderSystem(system_id=\"5fqd__1__1.B_1.C__1.H\")\n", + "# system_structure = plinder_system.holo_structure" + ] + }, + { + "cell_type": "code", + "execution_count": 156, + "metadata": {}, + "outputs": [ + { + "ename": "IndexError", + "evalue": "boolean index did not match indexed array along dimension 0; dimension is 3068 but corresponding boolean dimension is 5491", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[156], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43msystem_structure\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mprotein_coords\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m[\u001b[49m\u001b[43msystem_structure\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mprotein_calpha_mask\u001b[49m\u001b[43m]\u001b[49m \u001b[38;5;241m==\u001b[39m system_structure\u001b[38;5;241m.\u001b[39mprotein_calpha_coords[\u001b[38;5;241m0\u001b[39m]\n", + "\u001b[0;31mIndexError\u001b[0m: boolean index did not match indexed array along dimension 0; dimension is 3068 but corresponding boolean dimension is 5491" + ] + } + ], + "source": [ + "# system_structure.protein_coords[0][system_structure.protein_calpha_mask] == system_structure.protein_calpha_coords[0]\n", + "# IndexError: boolean index did not match indexed array along dimension 0; dimension is 3068 but corresponding boolean dimension is 5491" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Linked protein input structures [ TO ADD ?]\n", "\n", "\n", "For realistic inference scenarios we need to initialize our protein structures using a linked structure (introduced above). In most cases, these will not be a perfect match to the _holo_ structure - the number of residues, residue numbering, and sometime the sequnce can be different. It's important to be able to match these structures to ensure that we can map between them. \n", @@ -588,6 +1902,11 @@ ")\n", "```" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] } ], "metadata": { diff --git a/src/plinder/core/structure/structure.py b/src/plinder/core/structure/structure.py index b5ade3a6..68c97f8a 100644 --- a/src/plinder/core/structure/structure.py +++ b/src/plinder/core/structure/structure.py @@ -551,8 +551,8 @@ def protein_coords(self) -> list[NDArray]: return protein_coords @property - def input_ligand_conformer_atom_array(self) -> dict[str, AtomArray]: - """dict[str, AtomArray]: The coordinates of the input 3D conformer generated from input SMILES""" + def input_ligand_conformers_atom_array(self) -> dict[str, AtomArray]: + """dict[str, AtomArray]: The biotite atom array of the input 3D conformer generated from input SMILES (via RDKit molecule)""" ligands = {} for c in self.input_ligand_conformers: with tempfile.NamedTemporaryFile(suffix=".sdf") as tmp_file: @@ -561,8 +561,8 @@ def input_ligand_conformer_atom_array(self) -> dict[str, AtomArray]: return ligands @property - def ligand_atom_array(self) -> dict[str, AtomArray]: - """dict[str, AtomArray]: The coordinates of the input 3D conformer generated from input SMILES""" + def resolved_ligand_mols_atom_array(self) -> dict[str, AtomArray]: + """dict[str, AtomArray]: The biotite atom array of the resolved ligand""" if self.ligand_sdfs is None: return {} ligands = {} @@ -579,7 +579,7 @@ def input_ligand_templates(self) -> dict[str, Chem.Mol]: @property def protein_calpha_coords(self) -> NDArray[np.double]: assert self.protein_atom_array is not None - """list[NDArray]: The coordinates of the protein clapha atoms in the structure.""" + """list[NDArray]: The coordinates of the protein Calpha atoms in the structure""" protein_calpha_coords: list[NDArray] = [ coord for coord in _stack_atom_array_features( @@ -669,9 +669,9 @@ def protein_chains(self) -> list[str]: @property def protein_sequence_from_structure(self) -> str: - """str: The amino acid sequence of the structure.""" + """str: residue (amino acid) sequence of the structure""" assert self.protein_atom_array is not None - numbering, resn = struc.get_residues(self.protein_atom_array) + _, resn = struc.get_residues(self.protein_atom_array) seq: str = resn2seq(resn) return seq @@ -715,7 +715,7 @@ def protein_unique_atom_names(self) -> list[str]: @property def protein_structure_b_factor(self) -> list[float]: - """list[float]: A list of B-factor values for each atom in the structure.""" + """list[float]: a list of B-factor values for each atom in the structure""" assert self.protein_atom_array is not None b_factor = self._attr_from_atom_array( self.protein_atom_array, "b_factor", distinct=False, sort=False From 6b817ec45a04fbcc03d08ccdbb27c4090c1823d6 Mon Sep 17 00:00:00 2001 From: yusuf1759 Date: Wed, 27 Nov 2024 09:52:03 -0500 Subject: [PATCH 13/16] chore: cleanup structure.py --- src/plinder/core/structure/structure.py | 105 +++++++----------------- 1 file changed, 28 insertions(+), 77 deletions(-) diff --git a/src/plinder/core/structure/structure.py b/src/plinder/core/structure/structure.py index 68c97f8a..05e553de 100644 --- a/src/plinder/core/structure/structure.py +++ b/src/plinder/core/structure/structure.py @@ -34,7 +34,7 @@ from plinder.core.utils.log import setup_logger if TYPE_CHECKING: - import torch + pass log = setup_logger(__name__) @@ -454,14 +454,13 @@ def input_sequence_residue_mask_stacked(self) -> list[list[int]]: seqres_masks = get_residue_index_mapping_mask( self.protein_sequence, self.protein_atom_array ) - print(seqres_masks.keys()) return [seqres_masks[ch] for ch in self.protein_chain_ordered] def protein_structure_residue_mask(self, other: Structure) -> list[list[int]]: """Mask residues from a given structure to another structure""" self_protein_atom_array = self.protein_atom_array other_protein_sequence_from_structure = other.protein_sequence_from_structure - other_chain = other.protein_chains[0] + other_chain = other.protein_chain_ordered[0] assert self_protein_atom_array is not None assert other_protein_sequence_from_structure is not None other_sequence_dict = {other_chain: other_protein_sequence_from_structure} @@ -639,100 +638,52 @@ def resolved_ligand_mols_coords(self) -> dict[str, NDArray[np.double]]: def protein_backbone_mask(self) -> NDArray[np.bool_]: """ndarray[np.bool\_]: a logical mask for backbone atoms.""" assert self.protein_atom_array is not None - mask: NDArray[np.bool_] = struc.filter_peptide_backbone(self.protein_atom_array) + mask: dict[str, NDArray[np.bool_]] = { + ch: struc.filter_peptide_backbone( + self.protein_atom_array[self.protein_atom_array.chain_id == ch] + ) + for ch in self.protein_chain_ordered + } + return mask @property def protein_calpha_mask(self) -> NDArray[np.bool_]: """ndarray[np.bool\_]: a logical mask for alpha carbon atoms.""" assert self.protein_atom_array is not None - mask: NDArray[np.bool_] = self.protein_atom_array.atom_name == "CA" + mask: dict[str, NDArray[np.bool_]] = { + ch: self.protein_atom_array[ + self.protein_atom_array.chain_id == ch + ].atom_name + == "CA" + for ch in self.protein_chain_ordered + } + return mask @property def protein_n_atoms(self) -> int: """int: The number of atoms in the structure.""" assert self.protein_atom_array is not None - n: int = self.protein_atom_array.shape[0] + n: dict[str, int] = { + ch: self.protein_atom_array[self.protein_atom_array.chain_id == ch].shape[0] + for ch in self.protein_chain_ordered + } return n - @property - def protein_chains(self) -> list[str]: - """list[str]: The list of chain IDs in the structure.""" - if self.protein_atom_array is not None: - ch_list = self._attr_from_atom_array( - self.protein_atom_array, "chain_id", distinct=True, sort=True - ) - return [str(ch) for ch in ch_list] - else: - return [] - @property def protein_sequence_from_structure(self) -> str: """str: residue (amino acid) sequence of the structure""" assert self.protein_atom_array is not None - _, resn = struc.get_residues(self.protein_atom_array) - seq: str = resn2seq(resn) + resn = { + ch: struc.get_residues( + self.protein_atom_array[self.protein_atom_array.chain_id == ch] + )[1] + for ch in self.protein_chain_ordered + } + seq: dict[str, str] = {resn2seq(resn) for ch, resn in resn.items()} return seq - @property - def protein_structure_tokenized_sequence(self) -> "torch.Tensor": - """torch.Tensor: The tokenized sequence representation of the structure sequence.""" - import torch - - seq_encoding = torch.tensor( - [pc.AA_TO_INDEX[x] for x in self.protein_sequence_from_structure] - ) - tokenized: torch.Tensor = seq_encoding.long() - return tokenized - - @property - def protein_unique_residue_names(self) -> list[str]: - """list[str]: The list of distinct residue names in the structure.""" - assert self.protein_atom_array is not None - res_list = self._attr_from_atom_array( - self.protein_atom_array, "res_name", distinct=True, sort=True - ) - return [str(r) for r in res_list] - - @property - def protein_unique_residue_ids(self) -> list[int]: - """list[int]: The list of distinct residue IDs in the structure.""" - assert self.protein_atom_array is not None - res_list = self._attr_from_atom_array( - self.protein_atom_array, "res_id", distinct=True, sort=True - ) - return [int(r) for r in res_list] - - @property - def protein_unique_atom_names(self) -> list[str]: - """list[str]: The list of distinct atom names in the structure.""" - assert self.protein_atom_array is not None - at_list = self._attr_from_atom_array( - self.protein_atom_array, "atom_name", distinct=True, sort=True - ) - return [str(a) for a in at_list] - - @property - def protein_structure_b_factor(self) -> list[float]: - """list[float]: a list of B-factor values for each atom in the structure""" - assert self.protein_atom_array is not None - b_factor = self._attr_from_atom_array( - self.protein_atom_array, "b_factor", distinct=False, sort=False - ) - return [float(b) for b in b_factor] - - @staticmethod - def _attr_from_atom_array( - array: AtomArray, attr: str, distinct: bool = False, sort: bool = False - ) -> list[str] | list[int] | list[float]: - prop = getattr(array, attr) - if distinct: - prop = set(prop) - if sort: - prop = sorted(prop) - return list(prop) - @classmethod def get_properties(cls) -> list[str]: return [name for name in dir(cls) if isinstance(getattr(cls, name), property)] From 77497a5ab5dcd346a6b929a8a624acfc871cfe9b Mon Sep 17 00:00:00 2001 From: yusuf1759 Date: Wed, 27 Nov 2024 09:54:26 -0500 Subject: [PATCH 14/16] fix: type hinting --- src/plinder/core/structure/structure.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plinder/core/structure/structure.py b/src/plinder/core/structure/structure.py index 05e553de..2fc31912 100644 --- a/src/plinder/core/structure/structure.py +++ b/src/plinder/core/structure/structure.py @@ -648,7 +648,7 @@ def protein_backbone_mask(self) -> NDArray[np.bool_]: return mask @property - def protein_calpha_mask(self) -> NDArray[np.bool_]: + def protein_calpha_mask(self) -> dict[str, NDArray[np.bool_]]: """ndarray[np.bool\_]: a logical mask for alpha carbon atoms.""" assert self.protein_atom_array is not None mask: dict[str, NDArray[np.bool_]] = { @@ -662,7 +662,7 @@ def protein_calpha_mask(self) -> NDArray[np.bool_]: return mask @property - def protein_n_atoms(self) -> int: + def protein_n_atoms(self) -> dict[str, int]: """int: The number of atoms in the structure.""" assert self.protein_atom_array is not None n: dict[str, int] = { @@ -672,7 +672,7 @@ def protein_n_atoms(self) -> int: return n @property - def protein_sequence_from_structure(self) -> str: + def protein_sequence_from_structure(self) -> dict[str, str]: """str: residue (amino acid) sequence of the structure""" assert self.protein_atom_array is not None resn = { From a609483aff57f9d3a817dbf1d2fe9bcfe136239e Mon Sep 17 00:00:00 2001 From: yusuf1759 Date: Wed, 27 Nov 2024 09:59:47 -0500 Subject: [PATCH 15/16] fix: type hinting again --- src/plinder/core/structure/structure.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/plinder/core/structure/structure.py b/src/plinder/core/structure/structure.py index 2fc31912..20382baf 100644 --- a/src/plinder/core/structure/structure.py +++ b/src/plinder/core/structure/structure.py @@ -459,11 +459,10 @@ def input_sequence_residue_mask_stacked(self) -> list[list[int]]: def protein_structure_residue_mask(self, other: Structure) -> list[list[int]]: """Mask residues from a given structure to another structure""" self_protein_atom_array = self.protein_atom_array - other_protein_sequence_from_structure = other.protein_sequence_from_structure - other_chain = other.protein_chain_ordered[0] + other_sequence_dict = other.protein_sequence_from_structure + # = other.protein_chain_ordered[0] assert self_protein_atom_array is not None - assert other_protein_sequence_from_structure is not None - other_sequence_dict = {other_chain: other_protein_sequence_from_structure} + assert other_sequence_dict is not None seqres_masks = get_residue_index_mapping_mask( other_sequence_dict, self_protein_atom_array ) @@ -681,7 +680,7 @@ def protein_sequence_from_structure(self) -> dict[str, str]: )[1] for ch in self.protein_chain_ordered } - seq: dict[str, str] = {resn2seq(resn) for ch, resn in resn.items()} + seq: dict[str, str] = {ch: resn2seq(resn) for ch, resn in resn.items()} return seq @classmethod From 71ef2ad54a9e7156dd8f6b9f1ec36d307683defa Mon Sep 17 00:00:00 2001 From: yusuf1759 Date: Mon, 9 Dec 2024 13:19:13 -0500 Subject: [PATCH 16/16] feat: update notebook --- docs/examples/2_query_filter_index.ipynb | 3467 ++++++++++++++++++++- docs/examples/3_access_system_files.ipynb | 18 +- docs/examples/4_align_mask_crop.ipynb | 1039 +++--- docs/examples/5_dataset_and_loader.ipynb | 699 ++++- docs/examples/data-access.ipynb | 582 ++++ docs/examples/loader_examples.ipynb | 1138 +++++++ docs/examples/mlsb_data_access.ipynb | 837 +++++ docs/examples/test.ipynb | 175 ++ 8 files changed, 7230 insertions(+), 725 deletions(-) create mode 100644 docs/examples/data-access.ipynb create mode 100644 docs/examples/loader_examples.ipynb create mode 100644 docs/examples/mlsb_data_access.ipynb create mode 100644 docs/examples/test.ipynb diff --git a/docs/examples/2_query_filter_index.ipynb b/docs/examples/2_query_filter_index.ipynb index 5866251f..8d0bea2f 100644 --- a/docs/examples/2_query_filter_index.ipynb +++ b/docs/examples/2_query_filter_index.ipynb @@ -9,7 +9,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -33,7 +33,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -58,9 +58,325 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-11-27 10:42:26,662 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.14s\n", + "2024-11-27 10:42:34,812 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.13s\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
system_identry_pdb_idsystem_biounit_idsystem_protein_chains_asym_idsystem_ligand_chains_asym_idligand_instance_chainsplit
03grt__1__1.A_2.A__1.B3grt1[1.A, 2.A][1.B]1.Btrain
13grt__1__1.A_2.A__1.C3grt1[1.A, 2.A][1.C]1.Ctrain
23grt__1__1.A_2.A__2.B3grt1[1.A, 2.A][2.B]2.Btrain
33grt__1__1.A_2.A__2.C3grt1[1.A, 2.A][2.C]2.Ctrain
41grx__1__1.A__1.B1grx1[1.A][1.B]1.Btrain
56grf__1__1.A__1.D6grf1[1.A][1.D]1.Dtrain
66grf__2__1.B__1.E6grf2[1.B][1.E]1.Etrain
73grj__2__1.B__1.I_1.L_1.Q3grj2[1.B][1.I, 1.L, 1.Q]1.Itrain
83grj__2__1.B__1.I_1.L_1.Q3grj2[1.B][1.I, 1.L, 1.Q]1.Ltrain
93grj__2__1.B__1.I_1.L_1.Q3grj2[1.B][1.I, 1.L, 1.Q]1.Qtrain
103grj__1__1.A__1.F3grj1[1.A][1.F]1.Ftrain
113grj__1__1.A__1.H3grj1[1.A][1.H]1.Htrain
128grn__1__1.A__1.C8grn1[1.A][1.C]1.Ctrain
138grn__1__1.B__1.D8grn1[1.B][1.D]1.Dtrain
144grc__1__1.A__1.C_1.D4grc1[1.A][1.C, 1.D]1.Ctrain
154grc__1__1.A__1.C_1.D4grc1[1.A][1.C, 1.D]1.Dtrain
164grc__1__2.A__2.C_2.D4grc1[2.A][2.C, 2.D]2.Ctrain
174grc__1__2.A__2.C_2.D4grc1[2.A][2.C, 2.D]2.Dtrain
184grr__1__1.B_1.C__1.K4grr1[1.B, 1.C][1.K]1.Ktrain
192grt__1__1.A_2.A__1.B2grt1[1.A, 2.A][1.B]1.Btrain
\n", + "
" + ], + "text/plain": [ + " system_id entry_pdb_id system_biounit_id \\\n", + "0 3grt__1__1.A_2.A__1.B 3grt 1 \n", + "1 3grt__1__1.A_2.A__1.C 3grt 1 \n", + "2 3grt__1__1.A_2.A__2.B 3grt 1 \n", + "3 3grt__1__1.A_2.A__2.C 3grt 1 \n", + "4 1grx__1__1.A__1.B 1grx 1 \n", + "5 6grf__1__1.A__1.D 6grf 1 \n", + "6 6grf__2__1.B__1.E 6grf 2 \n", + "7 3grj__2__1.B__1.I_1.L_1.Q 3grj 2 \n", + "8 3grj__2__1.B__1.I_1.L_1.Q 3grj 2 \n", + "9 3grj__2__1.B__1.I_1.L_1.Q 3grj 2 \n", + "10 3grj__1__1.A__1.F 3grj 1 \n", + "11 3grj__1__1.A__1.H 3grj 1 \n", + "12 8grn__1__1.A__1.C 8grn 1 \n", + "13 8grn__1__1.B__1.D 8grn 1 \n", + "14 4grc__1__1.A__1.C_1.D 4grc 1 \n", + "15 4grc__1__1.A__1.C_1.D 4grc 1 \n", + "16 4grc__1__2.A__2.C_2.D 4grc 1 \n", + "17 4grc__1__2.A__2.C_2.D 4grc 1 \n", + "18 4grr__1__1.B_1.C__1.K 4grr 1 \n", + "19 2grt__1__1.A_2.A__1.B 2grt 1 \n", + "\n", + " system_protein_chains_asym_id system_ligand_chains_asym_id \\\n", + "0 [1.A, 2.A] [1.B] \n", + "1 [1.A, 2.A] [1.C] \n", + "2 [1.A, 2.A] [2.B] \n", + "3 [1.A, 2.A] [2.C] \n", + "4 [1.A] [1.B] \n", + "5 [1.A] [1.D] \n", + "6 [1.B] [1.E] \n", + "7 [1.B] [1.I, 1.L, 1.Q] \n", + "8 [1.B] [1.I, 1.L, 1.Q] \n", + "9 [1.B] [1.I, 1.L, 1.Q] \n", + "10 [1.A] [1.F] \n", + "11 [1.A] [1.H] \n", + "12 [1.A] [1.C] \n", + "13 [1.B] [1.D] \n", + "14 [1.A] [1.C, 1.D] \n", + "15 [1.A] [1.C, 1.D] \n", + "16 [2.A] [2.C, 2.D] \n", + "17 [2.A] [2.C, 2.D] \n", + "18 [1.B, 1.C] [1.K] \n", + "19 [1.A, 2.A] [1.B] \n", + "\n", + " ligand_instance_chain split \n", + "0 1.B train \n", + "1 1.C train \n", + "2 2.B train \n", + "3 2.C train \n", + "4 1.B train \n", + "5 1.D train \n", + "6 1.E train \n", + "7 1.I train \n", + "8 1.L train \n", + "9 1.Q train \n", + "10 1.F train \n", + "11 1.H train \n", + "12 1.C train \n", + "13 1.D train \n", + "14 1.C train \n", + "15 1.D train \n", + "16 2.C train \n", + "17 2.D train \n", + "18 1.K train \n", + "19 1.B train " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "plindex = query_index(\n", " columns=[\n", @@ -90,9 +406,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of ligand chains: 419538\n", + "Number of systems: 309972\n", + "Number of biounits: 108206\n", + "Number of PDB IDs: 77474\n" + ] + } + ], "source": [ "print(f\"Number of ligand chains: {plindex.shape[0]}\")\n", "print(f\"Number of systems: {plindex.system_id.nunique()}\")\n", @@ -120,9 +447,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-11-27 10:42:37,427 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.15s\n", + "2024-11-27 10:42:37,891 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.14s\n" + ] + } + ], "source": [ "plindex_single = query_index(\n", " filters=[\n", @@ -135,9 +471,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "152822" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "plindex_single.system_id.nunique()" ] @@ -151,9 +498,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-11-27 10:42:38,727 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.14s\n", + "2024-11-27 10:42:39,163 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.13s\n" + ] + } + ], "source": [ "plindex_single_proper = query_index(\n", " filters=[\n", @@ -167,9 +523,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "182360" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "plindex_single_proper.system_id.nunique()" ] @@ -241,9 +608,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-11-27 10:42:39,873 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.11s\n", + "2024-11-27 10:42:40,434 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.10s\n" + ] + } + ], "source": [ "plindex = query_index(\n", " columns=[\"system_id\", \"system_pass_validation_criteria\"],\n", @@ -253,9 +629,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "data = (\n", " plindex.drop_duplicates(\"system_id\")\n", @@ -289,9 +676,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-11-27 10:42:41,665 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.10s\n", + "2024-11-27 10:42:44,597 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.10s\n" + ] + } + ], "source": [ "plindex = query_index(\n", " columns=[\n", @@ -315,7 +711,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -333,9 +729,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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Qbly5bBlyxaEh4fj+++/R/fu3QE8+cNt1qxZGDp0KAICApCRkYGTJ0/i9OnTmoto7du3D506dUL16tURFRWFx48f46uvvkKrVq1w+vTpQi+C1qdPH0RERODPP/9Es2bNNMOTkpJw4sQJzJs3TzNs5syZmDRpEnr37o2hQ4fi7t27+Oqrr/D666/jr7/+0hzF8O2332LEiBFo2bIlxowZg2vXriEsLAxubm7w9fU1aVmrVCr8+++/qFChwnOXqyHLokePHvjnn3+wceNGLFy4UPO5Uv9AZWiuhYmJicHDhw8xYsQIKBQKzJ07Fz169MC1a9dM2huv/oPR1dVVMywlJQWvvfYaFAoF3nvvPXh4eGDXrl0YMmQIMjIyNIcQr1q1Ch988AF69uyJ0aNHIzs7G2fPnsXvv/+O/v37FzrPyZMnY8aMGQgNDUVoaChOnz6NDh06IDc31+j41davX49BgwYhJCQEc+bMQVZWFpYvX47AwED89ddfmu30zTffxIULF/D++++jWrVquHPnDmJjY3H9+vUiL+h37NgxKBQKvPLKK1rDq1ativz8fM38DfFs7QWe7FlzdnYGAPz444+wt7dH79699U7v5+eHwMBA7Nu3D9nZ2UX+IKBv/RoTS9WqVbFv3z4cOHAAb7zxRpF5GcqYz8CDBw/QsWNH9OjRA71798a2bdvw8ccfo2HDhujUqROAJz+yvvHGG7h9+zZGjx4NLy8vxMTE4ODBg1rz/eyzz5Ceno4bN25oTmF6+hQFAJg9ezasrKwwbtw4pKenY+7cuRgwYAB+//13s+T+tPfffx+urq6YMmUKEhMTsWjRIrz33nvYvHmzZpyoqChMnToVwcHBeOedd3D58mUsX74cf/75J44ePWryETi9evVCzZo18fnnn2t+jDZkveTm5iIkJAQ5OTl4//334eXlhZs3b+Knn35CWloaypcvD8C472y1ihUronXr1tiyZYvO9RA2b94Ma2tr9OrVC8CTU+lat26NmzdvYsSIEahSpQqOHTuGCRMm4Pbt25rrEggh0K1bNxw5cgQjR45E3bp1sX37doM/q2rvvvsuPDw8MHnyZDx69AhAydacx48fo127drh+/To++OAD+Pj4YP369Thw4IBRcT+toKAAYWFhOHLkCIYPH466devi3LlzWLhwIf755x/s2LEDAHDhwgV06dIFL7/8MqZNmwalUomrV6/i6NGjOu/ZpEkT7Ny5ExkZGZqaQVTmBJEFW7NmjQCg9yGEEAcPHhQARPXq1UVWVpbWtNnZ2SI/P19rWEJCglAqlWLatGmaYatXrxYAxIIFC3TmX1BQIIQQ4u7duwKAmDJlis44U6ZMEU9/1OLi4gQAMXToUK3xxo0bJwCIAwcOaIZVrVpVABCHDx/WDLtz545QKpXio48+KnLZ7NixQwAQM2bM0Bres2dPoVAoxNWrVzXDWrduLerXr1/k+z0dU+fOnfW+9ueffwoAYs2aNZphgwYNEgC0lqkQQrzyyiuiSZMmmucJCQkCgHB2dhZ37tzRGrddu3aiYcOGIjs7WzOsoKBAtGzZUtSsWVMzrFGjRoXGpta4cWPh6ekp7t27pxl25swZYWVlJSIiIjTD1NtWQkKCEEKI9PR0vct97ty5QqFQiKSkJCGEEImJicLa2lrMnDlTa7xz584JGxsbzfDc3Fzh6ekpGjduLHJycjTjrVy5UgAQrVu3LjIPIZ6siw4dOoi7d++Ku3fvijNnzoi+ffsKAOL9998XQhS9XA1dFvPmzdNaFmqG5irEk+2gatWqmufquCpUqCDu37+vGb5z504BQPz4449F5q7+bK9evVrcvXtX3Lp1S+zevVvUqFFDKBQK8ccff2jGHTJkiPD29hapqala79G3b19Rvnx5TW3o1q3bcz8Hz24Xd+7cEXZ2dqJz586aeiCEEJ9++qkAIAYNGqQZ9mwtKOw9Hz58KFxcXMSwYcO0xktOThbly5fXDH/w4IEAIObNm1dkzPq89dZbokKFCjrDk5OThYeHhwAg6tSpI0aOHCliYmJEWlqazrjqz7a+R0hIiGY8FxcX0ahRoyLj+eCDDwQAcfbsWSGEcevXmFjOnz8vHBwcBADRuHFjMXr0aLFjxw7x6NEjg5bbs+vQmM9A69atBQCxbt06zbCcnBzh5eUl3nzzTc2w+fPnCwBix44dmmGPHz8WderUEQDEwYMHNcM7d+6s9blSUy+/unXratWXxYsXCwDi3LlzBuVrCPX2GxwcrPUZ+PDDD4W1tbVm21F/Vjp06KD13btkyRLNujaWen3069dPa7ih6+Wvv/4SAMTWrVsLnYcx39mtW7fWqt1ff/213uVdr1498cYbb2ieT58+XZQrV078888/WuN98sknwtraWly/fl0I8b/v9blz52rGycvLE0FBQTrfvfqo11VgYKDIy8vTDDd3zXl2OSxatEgAEFu2bNEMe/TokahRo4bONl21alWtulnYe65fv15YWVmJ3377TWu8FStWCADi6NGjQgghFi5cKACIu3fvFhmzEELExMQIAOL3339/7rhEpYWHwdMLYenSpYiNjdV6PG3QoEFwcHDQGqZUKjXnrefn5+PevXuaw6NOnz6tGe/777+Hu7s73n//fZ35mnILn19++QXAk3M1n6a+SNjPP/+sNbxevXqaQz+BJ3s0a9eujWvXrj13PtbW1vjggw905iOEwK5du4yOvTiePTc2KChIbw5vvvmmZq8t8OSCVwcOHEDv3r3x8OFDpKamIjU1Fffu3UNISAiuXLmCmzdvAgBcXFxw4cIFXLlyRW8Mt2/fRlxcHCIjI+Hm5qYZ/vLLL6N9+/aadaOP+jSJLVu2aPbcAE/2kLz22muoUqUKAOCHH35AQUEBevfurYk1NTUVXl5eqFmzpmbv2MmTJ3Hnzh2MHDlS6/w+9eGNhtq7dy88PDzg4eGBRo0aYevWrRg4cCDmzJmjNd6zy7U4y0LN0FyL0qdPH629pOpt/Xnbt9rbb78NDw8P+Pj4oGPHjkhPT8f69es1Rz8IIfD999+ja9euEEJoxRkSEoL09HTN593FxQU3btww6jD8ffv2ITc3F++//75WPSjOBb9iY2ORlpaGfv36acVrbW2N5s2ba5arg4MD7OzscOjQITx48MCoedy7d0/v3umKFSvizJkzGDlyJB48eIAVK1agf//+8PT0xPTp07W2fQCwt7fXqb2xsbGYPXu2ZpyHDx/CycmpyHjUrz98+FBr+PPWr7Gx1K9fH3FxcXjrrbeQmJiIxYsXIzw8HBUrVsSqVauev+CeYexn4KWXXtI6r97Ozg4BAQFa2/vu3btRqVIlhIWFaeU2bNgwo+MbPHiwVn0x9vNljOHDh2t9BoKCgpCfn4+kpCQA//usjBkzRuuaMcOGDYOzs7POd58xnv1+MXS9qGvtnj17kJWVpfe9jf3OflqPHj1gY2OjdXTB+fPncfHiRfTp00czbOvWrQgKCoKrq6tWvMHBwcjPz8fhw4c1sdjY2GgdkWZtba3375OiDBs2TOvaGyVdc3755Rd4e3trXX/C0dERw4cPNyrup23duhV169ZFnTp1tGJWHzGjjll9ZMvOnTufe5FTdU3Ud4QOUVnhYfD0QggICCjyAnPPXikeeHII1eLFi7Fs2TIkJCRonT/99CHE8fHxqF27ttkuEpeUlAQrKyvUqFFDa7iXlxdcXFw0f9ioqZvAp7m6uj73izIpKQk+Pj46fySrD3F/dj7m9OyPGPb29lqNIlB4Ds+uq6tXr0IIgUmTJmHSpEl653fnzh1UqlQJ06ZNQ7du3VCrVi00aNAAHTt2xMCBAzWnJKhzrl27ts571K1bF3v27CnyYjt9+vTBjh07cPz4cbRs2RLx8fE4deqU1q2Trly5AiEEatasqfc91Id5qmN5djxbW9tCz43Xp3nz5pgxYwYUCgUcHR1Rt25dvYeeP7tci7ssAMNzLcqz27f6jyVD/xCcPHkygoKCkJmZie3bt2PTpk1ajcDdu3eRlpaGlStXYuXKlXrfQ31hsY8//hj79u1DQEAAatSogQ4dOqB///5o1apVofMvbD16eHgUeqj286h/bCrsMG314ZlKpRJz5szBRx99hIoVK+K1115Dly5dEBERYdCV8J9tvNW8vb2xfPlyLFu2DFeuXMGePXswZ84cTJ48Gd7e3hg6dKhmXGtra53z3p/l5OSk04Q/S/36s+eNP2/9Ps2QWACgVq1aWL9+PfLz83Hx4kX89NNPmDt3LoYPHw4/Pz+D3kPN2M9A5cqVdeqjq6srzp49q3melJQEf39/nfGe/c4whCmfr9zcXNy/f19rmIeHx3MvrPi8eRVWc+zs7FC9evVifSc9W98MXS9+fn4YO3YsFixYgOjoaAQFBSEsLAxvvfWWppE39jv7ae7u7mjXrh22bNmC6dOnA3jyA6+NjY3mlDl1vGfPntX5nlRT16ikpCR4e3vrnO6gr44XRd/yAkqu5iQlJaFGjRo627SxcT8b86VLl567zPr06YNvvvkGQ4cOxSeffIJ27dqhR48e6Nmzp04tUddEU3bEEJUUNuskC8/uVQeAzz//HJMmTcLbb7+N6dOnw83NDVZWVhgzZkyJ3GLqWYZ+GRT2B1Jhf2iXNHt7ezx+/Fjva+o9E8+ec2rM1bOfXVfqdTFu3DiEhITonUb9R9Trr7+O+Ph47Ny5E3v37sU333yDhQsXYsWKFVoNhqm6du0KR0dHbNmyBS1btsSWLVtgZWWlOe9QHa9CocCuXbv05v3sH1nF5e7ublBzoe8zUFzmyLW423fDhg01+YeHhyMrKwvDhg1DYGAgfH19NdvPW2+9Veh5neofc+rWrYvLly/jp59+wu7du/H9999j2bJlmDx5sllu6VXYZ/7pHwqB/23z69ev1/sH8NM/HI4ZMwZdu3bFjh07sGfPHkyaNAmzZs3CgQMHdM5Hf1qFChWe+4OIQqFArVq1UKtWLXTu3Bk1a9ZEdHS00Z+levXq4fTp08jJySn0lndnz56FnZ0dKlWqpDX8eeu3OKytrdGwYUM0bNgQLVq0QNu2bREdHW1Us27sZ6C067kp8zt27JjW7fwAICEhochrIJg6L3PR971h6HqZP38+IiMjNd8bH3zwAWbNmoUTJ05oXXzN1Aaub9++GDx4MOLi4tC4cWNs2bIF7dq107quTkFBAdq3b1/oHSxq1apl0rwLU9j3bEnWHEMVVSefXpcFBQVo2LAhFixYoHd8dX1wcHDA4cOHcfDgQfz888/YvXs3Nm/ejDfeeAN79+7Vek91TXx63RCVNTbrJFvbtm1D27Zt8e2332oNT0tL0yrU/v7++P3336FSqQrdU2jMl3jVqlVRUFCAK1euaF3ILSUlBWlpaXqvUmwK9YWUnj0E9e+//9a8bur7qq8k/qzLly8X6731Ue9ltrW1NeiPaDc3NwwePBiDBw9GZmYmXn/9dURFRWHo0KGauNRxPu3vv/+Gu7t7kXuSy5Urhy5dumDr1q1YsGABNm/ejKCgIM3FCIEn24sQAn5+fkX+gaWO5cqVK1p7M1QqFRISEtCoUaPn5locxiyLwrZvQ3MtTbNnz8b27dsxc+ZMrFixAh4eHnByckJ+fr5B20+5cuXQp08f9OnTB7m5uejRowdmzpyJCRMm6L3w2dPr8ekjIu7evavTDKv3NKalpWkd/fDsnjn1FdM9PT0Nitnf3x8fffQRPvroI1y5cgWNGzfG/PnzsWHDhkKnqVOnDqKjo5Genm7QaRfVq1eHq6srbt++/dxxn9W1a1ccO3YMW7du1XtrtcTERPz222/o1q3bc39Uenb9mov6yCxj8yuJz4C6xgohtD57+q7iXhJ7ABs1aqRzKpkhR2o8z9M15+nPSm5uLhISEoz6keR5jF0v6h9tJk6ciGPHjqFVq1ZYsWIFZsyYUezv7PDwcIwYMUJzKPw///yDCRMm6MSbmZn53GVQtWpV7N+/H5mZmVo/OOir48Yo6ZpTtWpVnD9/Xmeb1he3q6ur3qvbJyUlaW03/v7+OHPmDNq1a/fcz4GVlRXatWuHdu3aYcGCBfj888/x2Wef4eDBg1r5JiQkwMrKSjLfZ0QAb91GMmZtba3zi//WrVs15z+rvfnmm0hNTdW6xYqaenpHR0cAMOj2KaGhoQCgdeg0AM2vw507dzYofkPmk5+frxP3woULoVAoNFceNuV9b9y4obnSqlpOTg6++eYbeHp64tVXXzU1bB2enp5o06YNvv76a71/SD99a6B79+5pvfbSSy+hRo0amtu4eHt7o3Hjxvjuu++01tX58+exd+9ezbopSp8+fXDr1i188803OHPmjNZ5h8CTcxStra0xdepUne1LCKGJsWnTpvDw8MCKFSu0rhq+du1ak29jZAxjloW6aX82LkNzLU3+/v548803sXbtWiQnJ8Pa2hpvvvkmvv/+e5w/f15n/KK2Hzs7O9SrVw9CCKhUKr3zCw4Ohq2tLb766iutZfDs51sdGwDN+afAkyt/q29dphYSEgJnZ2d8/vnneuerjjkrKwvZ2dk683ByciryllLAk9sNCiFw6tQpreG///675urQT/vjjz9w7949kw5bHTFiBLy8vDB+/Hidc6Wzs7MxePBgKBSKQvcqPu3Z9Wus3377Te8yVZ+XbGx+JfEZCAkJwc2bN7VuTZmdna33nPpy5cpp3WLMHFxdXREcHKz1MOWWfc8KDg6GnZ0dvvzyS61l9e233yI9PV3ru+/69euaH5ZNYeh6ycjIQF5entbrDRs2hJWVleYzVNzvbBcXF4SEhGDLli3YtGkT7OzsEB4erjVO7969cfz4cezZs0dn+rS0NE2MoaGhyMvLw/LlyzWv5+fn46uvvioyhucp6ZoTGhqKW7duYdu2bZphWVlZek9N8vf3x4kTJ7S+F3/66SedW+717t0bN2/e1Pu5ePz4saaOPXtKBwA0btwYAHRiPnXqFOrXr2/UdWOIShr3rJNsdenSBdOmTcPgwYPRsmVLnDt3DtHR0TrnC0dERGDdunUYO3Ys/vjjDwQFBeHRo0fYt28f3n33Xc3eoHr16mHz5s2oVasW3Nzc0KBBAzRo0EBnvo0aNcKgQYOwcuVKpKWloXXr1vjjjz/w3XffITw8XOfwQ1N17doVbdu2xWeffYbExEQ0atQIe/fuxc6dOzFmzBid+x0bavjw4Vi9ejV69eqFt99+G6+88gru3buHzZs34/z581i3bp3WBY3MYenSpQgMDETDhg0xbNgwVK9eHSkpKTh+/Dhu3LiBM2fOAHhyuG2bNm3QpEkTuLm54eTJk9i2bRvee+89zXvNmzcPnTp1QosWLTBkyBDN7crKly+PqKio58YSGhoKJycnjBs3TtMIPs3f3x8zZszAhAkTkJiYiPDwcDg5OSEhIQHbt2/H8OHDMW7cONja2mLGjBkYMWIE3njjDfTp0wcJCQlYs2aNUeesF4ehy6JJkyYAntwqqm/fvrC1tUXXrl0NzrW0jR8/Hlu2bMGiRYswe/ZszJ49GwcPHkTz5s0xbNgw1KtXD/fv38fp06exb98+zR9zHTp0gJeXF1q1aoWKFSvi0qVLWLJkCTp37lzoBdI8PDwwbtw4zJo1C126dEFoaCj++usv7Nq1S+dQyg4dOqBKlSoYMmQIxo8fD2tra6xevRoeHh64fv26ZjxnZ2csX74cAwcOxKuvvoq+fftqxvn555/RqlUrLFmyBP/88w/atWuH3r17o169erCxscH27duRkpKCvn37FrmMAgMDUaFCBezbt0/ryI7169cjOjoa3bt3R5MmTWBnZ4dLly5h9erVsLe317k3cV5eXqF707p3745y5crB1dUV27ZtQ2hoKF599VUMHToU9erVQ3JyMtauXYtr165hyZIlaN68eZExqz27fo2JZc6cOTh16hR69OihOf3h9OnTWLduHdzc3Iy+MGBJfAZGjBiBJUuWoF+/fhg9ejS8vb0RHR2taZif3ovYpEkTbN68GWPHjkWzZs3w0ksvoWvXrkbNr7R4eHhgwoQJmDp1Kjp27IiwsDBcvnwZy5YtQ7NmzbSOuoiIiMCvv/5q8iH0hq6XAwcO4L333kOvXr1Qq1Yt5OXlYf369Vq13Rzf2X369MFbb72FZcuWISQkROe6IuPHj8d///tfdOnSRXNr1kePHuHcuXPYtm0bEhMT4e7ujq5du6JVq1b45JNPkJiYiHr16uGHH34o9g82JV1zhg0bhiVLliAiIgKnTp2Ct7c31q9fr9nR8bShQ4di27Zt6NixI3r37o34+Hhs2LBB52+WgQMHYsuWLRg5ciQOHjyIVq1aIT8/H3///Te2bNmCPXv2oGnTppg2bRoOHz6Mzp07o2rVqrhz5w6WLVuGypUrIzAwUPN+KpVKc/95IkkpyUvNE5U09W1I/vzzT72vq29fo++2LNnZ2eKjjz4S3t7ewsHBQbRq1UocP35c5/YgQgiRlZUlPvvsM+Hn5ydsbW2Fl5eX6Nmzp4iPj9eMc+zYMdGkSRNhZ2endRs3fbdrUqlUYurUqZr38/X1FRMmTNC6NZkQhd8mTV+M+jx8+FB8+OGHwsfHR9ja2oqaNWuKefPmad1eR/1+ht66TYgnt2/58MMPNfE7OzuLtm3bil27dumMO2jQIFGuXDmd4c8uF/WtvAq7JUx8fLyIiIgQXl5ewtbWVlSqVEl06dJFbNu2TTPOjBkzREBAgHBxcREODg6iTp06YubMmSI3N1frvfbt2ydatWolHBwchLOzs+jatau4ePGi1jjP3k7raQMGDNDcqqgw33//vQgMDBTlypUT5cqVE3Xq1BGjRo0Sly9f1hpv2bJlws/PTyiVStG0aVNx+PBhg9dvUbfRU3vecjVkWQjx5NZClSpVElZWVjrLxZBcC7t1m764nv78FKaoz7YQQrRp00Y4OztrbhuVkpIiRo0aJXx9fTWf4Xbt2omVK1dqpvn666/F66+/LipUqCCUSqXw9/cX48ePF+np6Zpx9G0X+fn5YurUqZpa0qZNG3H+/Hm9tyA6deqUaN68ubCzsxNVqlQRCxYsKHRbO3jwoAgJCRHly5cX9vb2wt/fX0RGRoqTJ08KIYRITU0Vo0aNEnXq1BHlypUT5cuXF82bN9e6PVJRPvjgA1GjRg2tYWfPnhXjx48Xr776qnBzcxM2NjbC29tb9OrVS5w+fVpr3KJul6Yvn8TERDF8+HBRpUoVYWNjoxlv3759OrEZu34NjeXo0aNi1KhRokGDBqJ8+fLC1tZWVKlSRURGRmrV88IUdvs9Qz4DhdXZZz8bQghx7do10blzZ+Hg4CA8PDzERx99JL7//nsBQJw4cUIzXmZmpujfv79wcXERADTvU9jyU3/unneLL2MU9j2sjuHp23IJ8eRWbXXq1BG2traiYsWK4p133hEPHjzQGkd9m7vnUa+Pwm7L9bz1cu3aNfH2228Lf39/YW9vL9zc3ETbtm11tklDv7MLq90ZGRmaWwZu2LBBb6wPHz4UEyZMEDVq1BB2dnbC3d1dtGzZUnzxxRda32H37t0TAwcOFM7OzqJ8+fJi4MCBmlvQGXrrtqL+ZjJHzdG3HJKSkkRYWJhwdHQU7u7uYvTo0WL37t16t5H58+eLSpUqCaVSKVq1aiVOnjyp9z1zc3PFnDlzRP369YVSqRSurq6iSZMmYurUqZq6vX//ftGtWzfh4+Mj7OzshI+Pj+jXr5/ObfJ27dolAIgrV64UuQyJSptCiDK6ShURERGVmWvXrqFOnTrYtWsX2rVrV+rz379/P0JDQxEYGIhdu3aZ/YicF82iRYvw4Ycf4saNGzoX4iOi4gkPD4dCocD27dvLOhQiLWzWiYiIZOqdd97B1atXdS4oVlo2bdqE/v37o1+/ftiwYQNvmfT/Hj9+rHWxvezsbLzyyivIz8/HP//8U4aREb14Ll26hIYNGyIuLk7v6YtEZYnNOhEREZGEdOrUCVWqVEHjxo2Rnp6ODRs24MKFC4iOjkb//v3LOjwiIiolvMAcERERkYSEhITgm2++QXR0NPLz81GvXj1s2rRJ5+4TRET0YuOedSIiIiIiIiKJ4X3WiYiIiIiIiCSGzToRERERERGRxLBZJyIiIiIiIpIYNutEREREREREEsNmnYiIiIiIiEhi2KwTERERERERSQybdSIiIiIiIiKJYbNOREREREREJDFs1omIiIiIiIgkhs06ERERERERkcSwWSciIiIiIiKSGDbrRERERERERBLDZp2IiIiIiIhIYtisExEREREREUkMm3UiIiIiIiIiiWGzTkRERERERCQxbNaJiIiIiIiIJIbNOhEREREREZHEsFknIiIiIiIikhg260REREREREQSw2adiIiIiIiISGLYrBMRERERERFJDJt1IiIiIiIiIolhs05EREREREQkMWzWiZ6hUCgMehw6dAiJiYlFjjN79mzN+xYUFGDdunVo3rw53Nzc4OTkhFq1aiEiIgInTpwAAFSrVs2gea9du7aMlg4RWaLi1DUrKyu4ubmhU6dOOH78eKHzuHTpEhQKBezt7ZGWlqZ3nDZt2qBBgwZaw9R17/3339cZ/9ChQ1AoFNi2bVux8iciUgsLC4OjoyMePnxY6DgDBgyAnZ0d7t27BwBIS0uDvb09FAoFLl26pHeayMhIvPTSSyUSM8mXTVkHQCQ169ev13q+bt06xMbG6gyvW7cuHj9+DADo168fQkNDdd7rlVde0fz/gw8+wNKlS9GtWzcMGDAANjY2uHz5Mnbt2oXq1avjtddew6JFi5CZmamZ5pdf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AxZ1NHqSMqPOtX379hZ7qwRDyCVPQD65WnKeGRkZcHd3N/kPWHPUOcCyl6Ex5JInIJ9c5ZInYNm5SqHWWfLyM5ZccpVLnoB8crXkPI2pc5I/DF6lUqF3795ISkrCgQMHjC7cLi4uqFWrFq5evVroOEqlEkqlUme4ra2t0Ss/X2GLPBOadQvbxgCYtnwskVzyBOSTqyXmWdx4zVnnijOdpZFLnoB8cpVLnoBl5iqlWmeJy89UcslVLnkC8snVEvM0Jl5J32dd3ahfuXIF+/btQ4UKFYx+j8zMTMTHx8Pb27sEIiQiIiIiIiIyvzJt1jMzMxEXF4e4uDgAQEJCAuLi4nD9+nWoVCr07NkTJ0+eRHR0NPLz85GcnIzk5GTk5uZq3qNdu3ZYsmSJ5vm4cePw66+/IjExEceOHUP37t1hbW2Nfv36lXZ6RERERERERCYp08PgT548ibZt22qejx07FgAwaNAgREVF4b///S8AoHHjxlrTHTx4EG3atAEAxMfHIzU1VfPajRs30K9fP9y7dw8eHh4IDAzEiRMn4OHhUbLJEBEREREREZlJmTbrbdq0QVHXtzPk2neJiYlazzdt2lTcsIiIiIiIiIjKlKTPWSciIiIiIiKSIzbrRERERERERBIj+Vu3ERERERGVthnHZ6BAUWDStNODpps5GiKSI+5ZJyIiIiIiIpIYNutEREREREREEsNmnYiIiIiIiEhi2KwTERERERERSQybdSIiIiIiIiKJYbNOREREREREJDFs1omIiIiIiIgkhs06ERERERERkcSwWSciIiIiIiKSGDbrRERERERERBLDZp2IiIiIiIhIYtisExEREREREUkMm3UiIiIiIiIiiWGzTkRERERERCQxbNaJiIiIiIiIJIbNOhEREREREZHEsFknIiIiIiIikhg260REREREREQSw2adiIiIiIiISGLYrBMRERERERFJDJt1IiIiIiIiIolhs05EREREREQkMWXarB8+fBhdu3aFj48PFAoFduzYofW6EAKTJ0+Gt7c3HBwcEBwcjCtXrjz3fZcuXYpq1arB3t4ezZs3xx9//FFCGRARERERERGZX5k2648ePUKjRo2wdOlSva/PnTsXX375JVasWIHff/8d5cqVQ0hICLKzswt9z82bN2Ps2LGYMmUKTp8+jUaNGiEkJAR37twpqTSIiIiIiIiIzKpMm/VOnTphxowZ6N69u85rQggsWrQIEydORLdu3fDyyy9j3bp1uHXrls4e+KctWLAAw4YNw+DBg1GvXj2sWLECjo6OWL16dQlmQkRERERERGQ+kj1nPSEhAcnJyQgODtYMK1++PJo3b47jx4/rnSY3NxenTp3SmsbKygrBwcGFTkNEREREREQkNTZlHUBhkpOTAQAVK1bUGl6xYkXNa89KTU1Ffn6+3mn+/vvvQueVk5ODnJwczfOMjAwAgEqlgkqlMihe9XjWwrDxdac3abIyoc7V0GVjqeSSJyCfXC05z+LGbI4693QclrgMjSGXPAH55CqXPAHLzlUKtU49npUwfZ+WpSx7S95WjCGXPAH55GrJeRoTs2Sb9dI0a9YsTJ06VWf43r174ejoaNR7tROxgDA+hl9+MX6ashYbG1vWIZQKueQJyCdXS8wzKyurWNObs84BlrkMTSGXPAH55CqXPAHLzFVKta5xWmOT4/jFwv6ws8RtxRRyyROQT66WmKcxdU6yzbqXlxcAICUlBd7e3prhKSkpaNy4sd5p3N3dYW1tjZSUFK3hKSkpmvfTZ8KECRg7dqzmeUZGBnx9fdGhQwc4OzsbFK9KpUJsbCz2K9ojX2Fr0DRPW9TR6EnKjDrX9u3bw9bW+FwthVzyBOSTqyXnqd47ZCpz1DnAspehMeSSJyCfXOWSJ2DZuUqh1qmXX5xLHAoUBSbFMbHFRJOmK22WvK0YQy55AvLJ1ZLzNKbOSbZZ9/Pzg5eXF/bv369pzjMyMvD777/jnXfe0TuNnZ0dmjRpgv379yM8PBwAUFBQgP379+O9994rdF5KpRJKpVJnuK2trdErP19hizwTmnUL28YAmLZ8LJFc8gTkk6sl5lnceM1Z54oznaWRS56AfHKVS56AZeYqpVpXoCgwuVm3xOVuaTGbQi55AvLJ1RLzNCbeMm3WMzMzcfXqVc3zhIQExMXFwc3NDVWqVMGYMWMwY8YM1KxZE35+fpg0aRJ8fHw0jTgAtGvXDt27d9c042PHjsWgQYPQtGlTBAQEYNGiRXj06BEGDx5c2ukRERERERERmaRMm/WTJ0+ibdu2mufqw5YGDRqEtWvX4j//+Q8ePXqE4cOHIy0tDYGBgdi9ezfs7e0108THxyM1NVXzvE+fPrh79y4mT56M5ORkNG7cGLt379a56BwRERERERGRVJVps96mTRsIUfjV2BQKBaZNm4Zp06YVOk5iYqLOsPfee6/Iw96JiIiIiIiIpEyy91knIiIiIiIikis260REREREREQSw2adiIiIiIiISGLYrBMRERERERFJDJt1IiIiIiIiIolhs05EREREREQkMWzWiYiIiIiIiCSGzToRERERERGRxLBZJyIiIiIiIpIYNutEREREREREEsNmnYiIiIiIiEhi2KwTERERERERSQybdSIiIiIiIiKJYbNOREREREREJDFs1omIiIiIiIgkhs06ERERERERkcSwWSciIiIiIiKSGDbrRERERERERBLDZp2IiIiIiIhIYtisExEREREREUkMm3UiIiIiIiIiiTGpWb927Zq54yAiIiIiIiKi/2dSs16jRg20bdsWGzZsQHZ2trljIiIiIiIiIpI1G1MmOn36NNasWYOxY8fivffeQ58+fTBkyBAEBASYOz4iIpKitWsBIUp+PsOHl/w8iIiIiCTIpD3rjRs3xuLFi3Hr1i2sXr0at2/fRmBgIBo0aIAFCxbg7t275o6TiIiIiIiISDaKdYE5Gxsb9OjRA1u3bsWcOXNw9epVjBs3Dr6+voiIiMDt27fNFScRERERERGRbBSrWT958iTeffddeHt7Y8GCBRg3bhzi4+MRGxuLW7duoVu3bsUOsFq1alAoFDqPUaNG6R1/7dq1OuPa29sXOw4iIiIiIiKi0mLSOesLFizAmjVrcPnyZYSGhmLdunUIDQ2FldWT3t/Pzw9r165FtWrVih3gn3/+ifz8fM3z8+fPo3379ujVq1eh0zg7O+Py5cua5wqFothxEBEREREREZUWk5r15cuX4+2330ZkZCS8vb31juPp6Ylvv/22WMEBgIeHh9bz2bNnw9/fH61bty50GoVCAS8vr2LPm4iIiIiIiKgsmNSsx8bGokqVKpo96WpCCPz777+oUqUK7OzsMGjQILMEqZabm4sNGzZg7NixRe4tz8zMRNWqVVFQUIBXX30Vn3/+OerXr2/WWIiIiIiIiIhKiknNur+/P27fvg1PT0+t4ffv34efn5/WYevmtGPHDqSlpSEyMrLQcWrXro3Vq1fj5ZdfRnp6Or744gu0bNkSFy5cQOXKlfVOk5OTg5ycHM3zjIwMAIBKpYJKpTIoNvV41sKw8XWnN2myMqHO1dBlY6nkkicgn1wtOc/ixmyOOvd0HKrSOr2ojNaVJW8rxpJLrnLJE7DsXKVQ69TjWQnTL+1kKcvekrcVY8glT0A+uVpynsbErBDC+BvlWllZITk5WadZT0pKQr169fDo0SNj39IgISEhsLOzw48//mjwNCqVCnXr1kW/fv0wffp0veNERUVh6tSpOsNjYmLg6OhocrxEROaSlZWF/v37Iz09Hc7OzkZPzzpHRJaAtY6IXnTG1DmjmvWxY8cCABYvXoxhw4ZpFb38/Hz8/vvvsLa2xtGjR00MvXBJSUmoXr06fvjhB6OvMt+rVy/Y2Nhg48aNel/X9yusr68vUlNTDf6iUKlUiI2NxX5Fe+QrbI2KDwAWdTR6kjKjzrV9+/awtTU+V0shlzwB+eRqyXlmZGTA3d3d5D9gzVHngKeW4d27sDX+t17jFXEkVUmy5G3FWHLJVS55ApadqxRqnXr5xbnEoUBRYHQMADCxxUSTpittlrytGEMueQLyydWS8zSmzhl1GPxff/0F4Mm56efOnYOdnZ3mNTs7OzRq1Ajjxo0zIeTnW7NmDTw9PdG5c2ejpsvPz8e5c+cQGhpa6DhKpRJKpVJnuK2trdErP19hizwTmnUL28YAmLZ8LJFc8gTkk6sl5lnceM1Z5wDAVojSadbLeD1Z4rZiKrnkKpc8AcvMVUq1rkBRYHKzbonL3dJiNoVc8gTkk6sl5mlMvEY16wcPHgQADB48GIsXLzbpF09TFBQUYM2aNRg0aBBsbLRDjoiIQKVKlTBr1iwAwLRp0/Daa6+hRo0aSEtLw7x585CUlIShQ4eWSqxERERERERExWXSBebWrFlj7jiKtG/fPly/fh1vv/22zmvXr1/Xuir9gwcPMGzYMCQnJ8PV1RVNmjTBsWPHUK9evdIMmYiIiIiIiMhkBjfrPXr0wNq1a+Hs7IwePXoUOe4PP/xQ7MCe1qFDBxR2av2hQ4e0ni9cuBALFy406/yJiIiIiIiISpPBzXr58uU19zYvX758iQVEREREREREJHcGN+tPH/pe2ofBExEREREREcmJ1fNH0fX48WNkZWVpniclJWHRokXYu3ev2QIjIiIiIiIikiuTmvVu3bph3bp1AIC0tDQEBARg/vz56NatG5YvX27WAImIiIiIiIjkxqRm/fTp0wgKCgIAbNu2DV5eXkhKSsK6devw5ZdfmjVAIiIiIiIiIrkxqVnPysqCk5MTAGDv3r3o0aMHrKys8NprryEpKcmsARIRERERERHJjUnNeo0aNbBjxw78+++/2LNnDzp06AAAuHPnDpydnc0aIBEREREREZHcmNSsT548GePGjUO1atXQvHlztGjRAsCTveyvvPKKWQMkIiIiIiIikhuDb932tJ49eyIwMBC3b99Go0aNNMPbtWuH7t27my04IiIiIiIiIjkyqVkHAC8vL3h5eWkNCwgIKHZARERERERERHJnUrP+6NEjzJ49G/v378edO3dQUFCg9fq1a9fMEhwRERERERGRHJnUrA8dOhS//vorBg4cCG9vbygUCnPHRURERERERCRbJjXru3btws8//4xWrVqZOx4iIiIiIiIi2TPpavCurq5wc3MzdyxEREREREREBBOb9enTp2Py5MnIysoydzxEREREREREsmfSYfDz589HfHw8KlasiGrVqsHW1lbr9dOnT5slOCIiIiIiIiI5MqlZDw8PN3MYRERERERERKRmUrM+ZcoUc8dBRERERERERP/PpHPWASAtLQ3ffPMNJkyYgPv37wN4cvj7zZs3zRYcERERERERkRyZtGf97NmzCA4ORvny5ZGYmIhhw4bBzc0NP/zwA65fv45169aZO04iIiIiIiIi2TBpz/rYsWMRGRmJK1euwN7eXjM8NDQUhw8fNltwRERERERERHJkUrP+559/YsSIETrDK1WqhOTk5GIHRURERERERCRnJjXrSqUSGRkZOsP/+ecfeHh4FDsoIiIiIiIiIjkzqVkPCwvDtGnToFKpAAAKhQLXr1/Hxx9/jDfffNOsARIRERERERHJjUnN+vz585GZmQkPDw88fvwYrVu3Ro0aNeDk5ISZM2eaO0YiIiIiIiIiWTHpavDly5dHbGwsjh49ijNnziAzMxOvvvoqgoODzR0fERERERERkewYvWe9oKAAq1evRpcuXTBixAgsX74cR44cwa1btyCEMGtwUVFRUCgUWo86deoUOc3WrVtRp04d2Nvbo2HDhvjll1/MGhMRERERERFRSTOqWRdCICwsDEOHDsXNmzfRsGFD1K9fH0lJSYiMjET37t3NHmD9+vVx+/ZtzePIkSOFjnvs2DH069cPQ4YMwV9//YXw8HCEh4fj/PnzZo+LiIiIiIiIqKQYdRj82rVrcfjwYezfvx9t27bVeu3AgQMIDw/HunXrEBERYb4AbWzg5eVl0LiLFy9Gx44dMX78eADA9OnTERsbiyVLlmDFihVmi4mIiIiIiIioJBnVrG/cuBGffvqpTqMOAG+88QY++eQTREdHm7VZv3LlCnx8fGBvb48WLVpg1qxZqFKlit5xjx8/jrFjx2oNCwkJwY4dO4qcR05ODnJycjTP1belU6lUmiveP496PGth2Pi605s0WZlQ52rosrFUcskTkE+ulpxncWM2R517Og6VQlGseIyYYenMR2e2lrutGEsuucolT8Cyc5VCrVOPZyVMug6z1ntInSVvK8aQS56AfHK15DyNiVkhjDjR3MvLC7t370bjxo31vv7XX3+hU6dOSE5ONjiAouzatQuZmZmoXbs2bt++jalTp+LmzZs4f/48nJycdMa3s7PDd999h379+mmGLVu2DFOnTkVKSkqh84mKisLUqVN1hsfExMDR0dEsuRARFUdWVhb69++P9PR0ODs7Gz096xwRWQLWOiJ60RlT54xq1u3s7JCUlARvb2+9r9+6dQt+fn5av2iaU1paGqpWrYoFCxZgyJAheuMzpVnX9yusr68vUlNTDf6iUKlUiI2NxX5Fe+QrbI3I6olFHY2epMyoc23fvj1sbY3P1VLIJU9APrlacp4ZGRlwd3c3+Q9Yc9Q54KllePcubM18UVG9IiNLfh56WPK2Yiy55CqXPAHLzlUKtU69/OJc4lCgKDA6BgCY2GKiSdOVNkveVowhlzwB+eRqyXkaU+eMOgw+Pz8fNjaFT2JtbY28vDxj3tIoLi4uqFWrFq5evar3dS8vL52mPCUl5bnnvCuVSiiVSp3htra2Rq/8fIUt8kxo1i1sGwNg2vKxRHLJE5BPrpaYZ3HjNWedAwBbIUqnWS/j9WSJ24qp5JKrXPIELDNXKdW6AkWByc26JS53S4vZFHLJE5BPrpaYpzHxGtWsCyEQGRmptwgCKLE96mqZmZmIj4/HwIED9b7eokUL7N+/H2PGjNEMi42NRYsWLUo0LiIiIiIiIiJzMqpZHzRo0HPHMefF5caNG4euXbuiatWquHXrFqZMmQJra2vNYe4RERGoVKkSZs2aBQAYPXo0Wrdujfnz56Nz587YtGkTTp48iZUrV5otJiIiIiIiIqKSZlSzvmbNmpKKQ68bN26gX79+uHfvHjw8PBAYGIgTJ07Aw8MDAHD9+nVYWf3vSp0tW7ZETEwMJk6ciE8//RQ1a9bEjh070KBBg1KNm4iIiIiIiKg4jGrWS9umTZuKfP3QoUM6w3r16oVevXqVUEREREREREREJc/0G0gSERERERERUYlgs05EREREREQkMWzWiYiIiIiIiCRG0uesy8mIn0yf9usu5ouDiIiIiIiIyh73rBMRERERERFJDJt1IiIiIiIiIolhs05EREREREQkMWzWiYiIiIiIiCSGzToRERERERGRxPBq8EREREREZjTpt0kmTzs9aLoZIyEiS8Y960REREREREQSw2adiIiIiIiISGLYrBMRERERERFJDJt1IiIiIiIiIolhs05EREREREQkMWzWiYiIiIiIiCSGzToRERERERGRxLBZJyIiIiIiIpIYNutEREREREREEsNmnYiIiIiIiEhi2KwTERERERERSQybdSIiIiIiIiKJYbNOREREREREJDFs1omIiIiIiIgkhs06ERERERERkcRIulmfNWsWmjVrBicnJ3h6eiI8PByXL18ucpq1a9dCoVBoPezt7UspYiIiIiIiIqLik3Sz/uuvv2LUqFE4ceIEYmNjoVKp0KFDBzx69KjI6ZydnXH79m3NIykpqZQiJiIiIiIiIio+m7IOoCi7d+/Wer527Vp4enri1KlTeP311wudTqFQwMvLq6TDIyIiIiIiIioRkt6z/qz09HQAgJubW5HjZWZmomrVqvD19UW3bt1w4cKF0giPiIiIiIiIyCwkvWf9aQUFBRgzZgxatWqFBg0aFDpe7dq1sXr1arz88stIT0/HF198gZYtW+LChQuoXLmy3mlycnKQk5OjeZ6RkQEAUKlUUKlUBsWnHs9aGDa+ORkYohnnp9L690UllzwB+eRqyXkWN2Zz1Lmn41ApFMWKx4gZls58dGZruduKseSSq1zyBCw7VynUOvV4VqJs9mmV5nqz5G3FGHLJE5BPrpacpzExK4QQogRjMZt33nkHu3btwpEjRwptuvVRqVSoW7cu+vXrh+nTp+sdJyoqClOnTtUZHhMTA0dHR5NjJiIyl6ysLPTv3x/p6elwdnY2enrWOSKyBKx1RPSiM6bOWUSz/t5772Hnzp04fPgw/Pz8jJ6+V69esLGxwcaNG/W+ru9XWF9fX6Smphr8RaFSqRAbG4v9ivbIV9gaHWNxLOpYqrPT5Nq+fXvY2pZurqVJLnkC8snVkvPMyMiAu7u7yX/AmqPOAU8tw7t3YVsaXx+RkSU/Dz0seVsxllxylUuegGXnKoVap15+cS5xKFAUGB1DcU1sMbHU5mXJ24ox5JInIJ9cLTlPY+qcpA+DF0Lg/fffx/bt23Ho0CGTGvX8/HycO3cOoaGhhY6jVCqhVCp1htva2hq98vMVtsgr5Wa9rLZPU5aPJZJLnoB8crXEPIsbrznrHADYClE6zXoZrydL3FZMJZdc5ZInYJm5SqnWFSgKyqRZL4t1Zonbiinkkicgn1wtMU9j4pV0sz5q1CjExMRg586dcHJyQnJyMgCgfPnycHBwAABERESgUqVKmDVrFgBg2rRpeO2111CjRg2kpaVh3rx5SEpKwtChQ8ssDyIiIiIiIiJjSLpZX758OQCgTZs2WsPXrFmDyP8/NPL69euwsvrfBUAePHiAYcOGITk5Ga6urmjSpAmOHTuGevXqlVbYRERERERERMUi6WbdkNPpDx06pPV84cKFWLhwYQlFRERERERERFTyLOo+60RERERERERywGadiIiIiIiISGIkfRg8EREREZGcTPptUrGmnx403UyREFFZ4551IiIiIiIiIonhnnUiIpKulStLZz7Dh5fOfIiIiIgMxD3rRERERERERBLDZp2IiIiIiIhIYtisExEREREREUkMz1l/AYz4yfRpv+5ivjiIiIiIiIjIPLhnnYiIiIiIiEhi2KwTERERERERSQybdSIiIiIiIiKJYbNOREREREREJDFs1omIiIiIiIgkhs06ERERERERkcSwWSciIiIiIiKSGDbrRERERERERBLDZp2IiIiIiIhIYmzKOgAqWyN+Mn4aGwF0MH8oRERERERE9P+4Z52IiIiIiIhIYrhnnYiIaOVK7ecKBeDpCaxdCwhh3nkNH27e9yMiIqIXEvesExEREREREUkMm3UiIiIiIiIiieFh8EREREREL4hJv00yeFwrYYVX8SpmHJ+BAkUBpgdNL8HIiMhY3LNOREREREREJDFs1omIiIiIiIgkxiIOg1+6dCnmzZuH5ORkNGrUCF999RUCAgIKHX/r1q2YNGkSEhMTUbNmTcyZMwehoaGlGLE8jNkN5ClMm/brLuaNhYiIiIiI6EUi+WZ98+bNGDt2LFasWIHmzZtj0aJFCAkJweXLl+Hp6akz/rFjx9CvXz/MmjULXbp0QUxMDMLDw3H6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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "fig, axes = plt.subplots(1, 3, figsize=(10, 3), sharex=True, sharey=True)\n", "grouped_data = plindex.drop_duplicates(\"system_id\").groupby(\"split\")\n", @@ -359,9 +766,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Percentage of ligands with no unresolved heavy atoms:\n", + "Train: 82.34%\n", + "Val: 90.75%\n", + "Test: 93.80%\n" + ] + } + ], "source": [ "print(\"Percentage of ligands with no unresolved heavy atoms:\")\n", "for split in [\"train\", \"val\", \"test\"]:\n", @@ -381,9 +799,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-11-27 10:42:46,914 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.09s\n", + "2024-11-27 10:42:47,581 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.09s\n" + ] + } + ], "source": [ "plindex = query_index(\n", " columns=[\"system_id\", \"system_pocket_ECOD_t_name\", \"system_pocket_kinase_name\"],\n", @@ -392,18 +819,62 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "system_pocket_ECOD_t_name\n", + "Nucleoplasmin-like/VP (viral coat and capsid proteins) 14051\n", + "P-loop containing nucleoside triphosphate hydrolases 13463\n", + "Protein kinase 11203\n", + "TIM barrels 9384\n", + "Immunoglobulin/Fibronectin type III/E set domains/PapD-like 9293\n", + "NAD(P)-binding Rossmann-fold domains 9213\n", + "Globin-like 7218\n", + "Ribosomal protein L31e/gp120 outer domain 7141\n", + "S2 subunit of coronavirus spike glycoprotein 6701\n", + "Viral protein domain 6467\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "plindex.drop_duplicates(\"system_id\").system_pocket_ECOD_t_name.value_counts().head(10)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "system_pocket_kinase_name\n", + "CDK2 494\n", + "p38a 413\n", + "EGFR 360\n", + "CK2a1 349\n", + "AurA 278\n", + "PIM1 211\n", + "ALK2 208\n", + "JAK2 191\n", + "IRAK4 186\n", + "MAPKAPK2 183\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "plindex.drop_duplicates(\"system_id\").system_pocket_kinase_name.value_counts().head(10)" ] @@ -419,7 +890,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -439,9 +910,516 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-11-27 10:42:48,802 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.10s\n", + "2024-11-27 10:42:49,441 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.09s\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
system_idligand_instance_chainligand_unique_ccd_codeligand_molecular_weightligand_num_rot_bondsligand_num_ringsligand_num_hbdligand_num_hbaligand_num_heavy_atomsligand_crippen_clogpligand_qedligand_tpsaligand_is_kinase_inhibitorsplit
03grt__1__1.A_2.A__1.B1.BFAD785.15713513692153-2.423960.044261362.93Falsetrain
13grt__1__1.A_2.A__1.C1.CTS2721.288731101111348-4.040100.095714313.27Falsetrain
23grt__1__1.A_2.A__2.B2.BFAD785.15713513692153-2.423960.044261362.93Falsetrain
33grt__1__1.A_2.A__2.C2.CTS2721.288731101111348-4.040100.095714313.27Falsetrain
41grx__1__1.A__1.B1.BGSH307.083806906620-2.206100.263437158.82Truetrain
56grf__1__1.A__1.D1.DHSR221.089937215615-3.077600.337239119.25Falsetrain
66grf__2__1.B__1.E1.EHSR221.089937215615-3.077600.337239119.25Falsetrain
73grj__2__1.B__1.I_1.L_1.Q1.LG14188.0585772222141.774900.75434065.98Falsetrain
83grj__1__1.A__1.F1.FG14188.0585772222141.774900.75434065.98Falsetrain
93grj__1__1.A__1.H1.HG14188.0585772222141.774900.75434065.98Falsetrain
108grn__1__1.A__1.C1.CLPC468.30846621026314.431400.111161102.29Falsetrain
118grn__1__1.B__1.D1.DLPC468.30846621026314.431400.111161102.29Falsetrain
124grc__1__1.A__1.C_1.D1.CHEM616.1772938626434.738540.41659896.26Falsetrain
134grc__1__2.A__2.C_2.D2.CHEM616.1772938626434.738540.41659896.26Falsetrain
144grr__1__1.B_1.C__1.K1.KAVR231.1371623214171.987600.82163660.39Falsetrain
152grt__1__1.A_2.A__1.B1.BFAD785.15713513692153-2.423960.044261362.93Falsetrain
162grt__1__1.A_2.A__1.C1.CGDS612.151962210101240-3.876800.043742317.64Falsetrain
172grt__1__1.A_2.A__2.B2.BFAD785.15713513692153-2.423960.044261362.93Falsetrain
182grt__1__1.A_2.A__2.C2.CGDS612.151962210101240-3.876800.043742317.64Falsetrain
197grp__1__1.A__1.C1.CVXQ149.0840641212111.080200.64810335.25Falsetrain
\n", + "
" + ], + "text/plain": [ + " system_id ligand_instance_chain ligand_unique_ccd_code \\\n", + "0 3grt__1__1.A_2.A__1.B 1.B FAD \n", + "1 3grt__1__1.A_2.A__1.C 1.C TS2 \n", + "2 3grt__1__1.A_2.A__2.B 2.B FAD \n", + "3 3grt__1__1.A_2.A__2.C 2.C TS2 \n", + "4 1grx__1__1.A__1.B 1.B GSH \n", + "5 6grf__1__1.A__1.D 1.D HSR \n", + "6 6grf__2__1.B__1.E 1.E HSR \n", + "7 3grj__2__1.B__1.I_1.L_1.Q 1.L G14 \n", + "8 3grj__1__1.A__1.F 1.F G14 \n", + "9 3grj__1__1.A__1.H 1.H G14 \n", + "10 8grn__1__1.A__1.C 1.C LPC \n", + "11 8grn__1__1.B__1.D 1.D LPC \n", + "12 4grc__1__1.A__1.C_1.D 1.C HEM \n", + "13 4grc__1__2.A__2.C_2.D 2.C HEM \n", + "14 4grr__1__1.B_1.C__1.K 1.K AVR \n", + "15 2grt__1__1.A_2.A__1.B 1.B FAD \n", + "16 2grt__1__1.A_2.A__1.C 1.C GDS \n", + "17 2grt__1__1.A_2.A__2.B 2.B FAD \n", + "18 2grt__1__1.A_2.A__2.C 2.C GDS \n", + "19 7grp__1__1.A__1.C 1.C VXQ \n", + "\n", + " ligand_molecular_weight ligand_num_rot_bonds ligand_num_rings \\\n", + "0 785.157135 13 6 \n", + "1 721.288731 10 1 \n", + "2 785.157135 13 6 \n", + "3 721.288731 10 1 \n", + "4 307.083806 9 0 \n", + "5 221.089937 2 1 \n", + "6 221.089937 2 1 \n", + "7 188.058577 2 2 \n", + "8 188.058577 2 2 \n", + "9 188.058577 2 2 \n", + "10 468.308466 21 0 \n", + "11 468.308466 21 0 \n", + "12 616.177293 8 6 \n", + "13 616.177293 8 6 \n", + "14 231.137162 3 2 \n", + "15 785.157135 13 6 \n", + "16 612.151962 21 0 \n", + "17 785.157135 13 6 \n", + "18 612.151962 21 0 \n", + "19 149.084064 1 2 \n", + "\n", + " ligand_num_hbd ligand_num_hba ligand_num_heavy_atoms \\\n", + "0 9 21 53 \n", + "1 11 13 48 \n", + "2 9 21 53 \n", + "3 11 13 48 \n", + "4 6 6 20 \n", + "5 5 6 15 \n", + "6 5 6 15 \n", + "7 2 2 14 \n", + "8 2 2 14 \n", + "9 2 2 14 \n", + "10 2 6 31 \n", + "11 2 6 31 \n", + "12 2 6 43 \n", + "13 2 6 43 \n", + "14 1 4 17 \n", + "15 9 21 53 \n", + "16 10 12 40 \n", + "17 9 21 53 \n", + "18 10 12 40 \n", + "19 1 2 11 \n", + "\n", + " ligand_crippen_clogp ligand_qed ligand_tpsa ligand_is_kinase_inhibitor \\\n", + "0 -2.42396 0.044261 362.93 False \n", + "1 -4.04010 0.095714 313.27 False \n", + "2 -2.42396 0.044261 362.93 False \n", + "3 -4.04010 0.095714 313.27 False \n", + "4 -2.20610 0.263437 158.82 True \n", + "5 -3.07760 0.337239 119.25 False \n", + "6 -3.07760 0.337239 119.25 False \n", + "7 1.77490 0.754340 65.98 False \n", + "8 1.77490 0.754340 65.98 False \n", + "9 1.77490 0.754340 65.98 False \n", + "10 4.43140 0.111161 102.29 False \n", + "11 4.43140 0.111161 102.29 False \n", + "12 4.73854 0.416598 96.26 False \n", + "13 4.73854 0.416598 96.26 False \n", + "14 1.98760 0.821636 60.39 False \n", + "15 -2.42396 0.044261 362.93 False \n", + "16 -3.87680 0.043742 317.64 False \n", + "17 -2.42396 0.044261 362.93 False \n", + "18 -3.87680 0.043742 317.64 False \n", + "19 1.08020 0.648103 35.25 False \n", + "\n", + " split \n", + "0 train \n", + "1 train \n", + "2 train \n", + "3 train \n", + "4 train \n", + "5 train \n", + "6 train \n", + "7 train \n", + "8 train \n", + "9 train \n", + "10 train \n", + "11 train \n", + "12 train \n", + "13 train \n", + "14 train \n", + "15 train \n", + "16 train \n", + "17 train \n", + "18 train \n", + "19 train " + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "plindex = query_index(\n", " columns=[\"system_id\", \"ligand_instance_chain\", \"ligand_unique_ccd_code\"]\n", @@ -456,9 +1434,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAKyCAYAAADIG729AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAD8/ElEQVR4nOzde1hU1f4/8PeADojIRVEGDB0UvCWCiBJkaUoOWibeNU8KGZVJaaQpfg1vFWrKQdMkK2/nSHosJUujcBAzJRQQzVRSjogJg6IBggoK+/eHP/ZpYga5zA14v55nPzlrr732Z82Yn732ZW2JIAgCiIiIiIiIiEjnzIwdABEREREREVFzxUE3ERERERERkZ5w0E1ERERERESkJxx0ExEREREREekJB91EREREREREesJBNxEREREREZGecNBNREREREREpCccdBMRERERERHpSStjB9BUVVVVIS8vD+3atYNEIjF2OERE1IQJgoDbt2/D2dkZZmY8H15fzMlERKQr+sjJHHQ3UF5eHlxcXIwdBhERNSNXr17FY489ZuwwmhzmZCIi0jVd5mQOuhuoXbt2AB7+GDY2NkaOhoiImrKSkhK4uLiIuYXqhzmZiIh0RR85mYPuBqq+fc3GxoYJnoiIdIK3RjcMczIREemaLnMyHxwjIiIiIiIi0hMOuomIiIiIiIj0hINuIiIiIiIiIj3hM91ERFRnlZWVuH//vrHDaJKkUilfB0ZERDrDnNxwhs7JHHQTEdEjCYIAlUqFoqIiY4fSZJmZmcHV1RVSqdTYoRARURPGnNx4hs7JJjHo3rhxIz766COoVCp4enri448/xqBBg7TW37NnD9577z3k5OTA3d0dq1atwqhRo8T1giBgyZIl+Oyzz1BUVIQnn3wSmzZtgru7e422ysvL4evri9OnT+PUqVPw8vLSRxf1Ky1Nc7mPj2HjIKJmqzq5d+rUCVZWVpxlu56qqqqQl5eH/Px8dOnShd8faZV0JUnrumFdhxkwEiIyVczJjWOMnGz0Qffu3bsRHh6O2NhY+Pr6IiYmBgqFAllZWejUqVON+sePH8fUqVMRFRWF559/HnFxcQgKCkJGRgb69u0LAFi9ejXWr1+P7du3w9XVFe+99x4UCgXOnTsHS0tLtfbeffddODs74/Tp0wbpLxFRU1NZWSkm9w4dOhg7nCarY8eOyMvLw4MHD9C6dWtjh0NERE0Qc7JuGDonG/3hsujoaISGhiIkJAR9+vRBbGwsrKyssGXLFo31161bh8DAQMyfPx+9e/fGihUr4O3tjQ0bNgB4eJU7JiYGixcvxpgxY9CvXz/s2LEDeXl5iI+PV2vr+++/x48//og1a9bou5tERE1W9fNiVlZWRo6kaau+ha2ystLIkRARUVPFnKwbhs7JRh10V1RUID09HQEBAWKZmZkZAgICkJKSonGblJQUtfoAoFAoxPqXL1+GSqVSq2NrawtfX1+1NgsKChAaGop//etfdfpLW15ejpKSErWFiKgl4e1rjcPvj4iIdIU5pXEM/f0ZddBdWFiIyspKODo6qpU7OjpCpVJp3EalUtVav/q/tdURBAHBwcF4/fXX4VPH556joqJga2srLi4uLnXajoiIiIiIiFouo99ebgwff/wxbt++jYiIiDpvExERgeLiYnG5evWqHiMkIiIiIiKi5sCoE6k5ODjA3NwcBQUFauUFBQWQyWQat5HJZLXWr/5vQUEBnJyc1OpUz0yelJSElJQUWFhYqLXj4+ODadOmYfv27TX2a2FhUaM+EVFL9m2WYfc3umf9txk6dCi8vLwQExOjkxiCg4NRVFRUY44QIiIiY2JONm1GvdItlUoxYMAAKJVKsayqqgpKpRJ+fn4at/Hz81OrDwCJiYlifVdXV8hkMrU6JSUlSE1NFeusX78ep0+fRmZmJjIzM3Hw4EEAD2dS/+CDD3TaRyIiIiIiImq5jH57eXh4OD777DNs374d58+fx6xZs1BWVoaQkBAAwPTp09VuA58zZw4SEhKwdu1aXLhwAUuXLkVaWhrCwsIAPHwofu7cuXj//fexf/9+/Prrr5g+fTqcnZ0RFBQEAOjSpQv69u0rLj169AAAdO/eHY899phhvwAiItKL4OBgHDlyBOvWrYNEIoFEIkFOTg7Onj2LkSNHwtraGo6OjnjppZdQWFgobvfVV1/Bw8MDbdq0QYcOHRAQEICysjIsXboU27dvxzfffCO2l5ycbLwOEhERNREtPScb/T3dkydPxo0bNxAZGQmVSgUvLy8kJCSIE6Hl5ubCzOx/5wb8/f0RFxeHxYsXY9GiRXB3d0d8fLz4jm7g4bu3y8rK8Oqrr6KoqAiDBw9GQkJCjXd0ExFR87Vu3Tr8/vvv6Nu3L5YvXw4AaN26NQYNGoRXXnkF//znP3H37l0sWLAAkyZNQlJSEvLz8zF16lSsXr0aY8eOxe3bt3H06FEIgoB58+bh/PnzKCkpwdatWwEA7du3N2YXyRSlpdW+vo4TuBIRNSctPScbfdANAGFhYeKV6r/TdMZi4sSJmDhxotb2JBIJli9fLv6gjyKXyyEIQp3qEhFR02BrawupVAorKytxvo/3338f/fv3x4cffijW27JlC1xcXPD777+jtLQUDx48wLhx49C1a1cAgIeHh1i3TZs2KC8v1zrvCBEREdXU0nOySQy6iYiIDOH06dM4fPgwrK2ta6zLzs7GiBEjMHz4cHh4eEChUGDEiBGYMGEC7O3tjRAtERFR89WScrLRn+kmIiIylNLSUowePVqcSLN6uXjxIp5++mmYm5sjMTER33//Pfr06YOPP/4YPXv2xOXLl40dOhERUbPSknIyB91ERNRsSaVSVFZWip+9vb3x22+/QS6Xw83NTW1p27YtgIePKD355JNYtmwZTp06BalUin379mlsj4iIiOqmJedkDrqJiKjZksvlSE1NRU5ODgoLCzF79mzcunULU6dOxcmTJ5GdnY0ffvgBISEhqKysRGpqKj788EOkpaUhNzcXe/fuxY0bN9C7d2+xvTNnziArKwuFhYW4f/++kXtIRETUNLTknMxBNxERNVvz5s2Dubk5+vTpg44dO6KiogLHjh1DZWUlRowYAQ8PD8ydOxd2dnYwMzODjY0NfvrpJ4waNQo9evTA4sWLsXbtWowcORIAEBoaip49e8LHxwcdO3bEsWPHjNxDIiKipqEl52SJwGm7G6SkpAS2trYoLi6GjY2NcYPR9noSvpaEiHTg3r17uHz5MlxdXfnqxUao7Xs0qZzSBJnU99fIV4YlXUnSum5Y12ENiYiImhHmZN0wdE7mlW4iIiIiIiIiPeGgm4iIiOps48aNkMvlsLS0hK+vL06cOFFr/T179qBXr16wtLSEh4cHDh48qLXu66+/DolEgpiYGB1HTUREZDx8TzcRERHVye7duxEeHo7Y2Fj4+voiJiYGCoUCWVlZ6NSpU436x48fx9SpUxEVFYXnn38ecXFxCAoKQkZGBvr27atWd9++ffjll1/g7OxsqO4YxbdZta9vy7tFiYiaHV7pJiIiojqJjo5GaGgoQkJC0KdPH8TGxsLKygpbtmzRWH/dunUIDAzE/Pnz0bt3b6xYsQLe3t7YsGGDWr1r167hzTffxM6dO9G6dWtDdMVkZRVqX4iIqGnioJuIiIgeqaKiAunp6QgICBDLzMzMEBAQgJSUFI3bpKSkqNUHAIVCoVa/qqoKL730EubPn4/HH3+8TrGUl5ejpKREbSEiIjJVvL2ciIiIHqmwsBCVlZVwdHRUK3d0dMSFCxc0bqNSqTTWV6lU4udVq1ahVatWeOutt+ocS1RUFJYtW1aP6A0n6+YjKrQzSBhERGRCeKWbiIiIjCI9PR3r1q3Dtm3bIJFI6rxdREQEiouLxeXq1at6jJKIiKhxOOgmIiKiR3JwcIC5uTkKCgrUygsKCiCTyTRuI5PJaq1/9OhRXL9+HV26dEGrVq3QqlUrXLlyBe+88w7kcrnWWCwsLGBjY6O2EBERmSoOuomIiOpALpe36FdZSaVSDBgwAEqlUiyrqqqCUqmEn5+fxm38/PzU6gNAYmKiWP+ll17CmTNnkJmZKS7Ozs6YP38+fvjhB/11hoiImrSmlpP5TDcRETVbQ4cOhZeXl04S88mTJ9G2bdvGB9WEhYeHY8aMGfDx8cGgQYMQExODsrIyhISEAACmT5+Ozp07IyoqCgAwZ84cDBkyBGvXrsVzzz2HXbt2IS0tDZs3bwYAdOjQAR06dFDbR+vWrSGTydCzZ0/Ddo6IiPSqJedkDrqJiKhh0tIMuz8fH503KQgCKisr0arVo9Nhx44ddb7/pmby5Mm4ceMGIiMjoVKp4OXlhYSEBHGytNzcXJiZ/e8mOn9/f8TFxWHx4sVYtGgR3N3dER8fX+Md3URE1EjMySaNt5cTEVGzFBwcjCNHjmDdunWQSCSQSCTihF3ff/89BgwYAAsLC/z888/Izs7GmDFj4OjoCGtrawwcOBCHDh1Sa+/vt7JJJBJ8/vnnGDt2LKysrODu7o79+/cbuJeGFxYWhitXrqC8vBypqanw9fUV1yUnJ2Pbtm1q9SdOnIisrCyUl5fj7NmzGDVqVK3t5+TkYO7cuXqInIiIjKWl52QOupuBrJuaFyKilmzdunXw8/NDaGgo8vPzkZ+fDxcXFwDAwoULsXLlSpw/fx79+vVDaWkpRo0aBaVSiVOnTiEwMBCjR49Gbm5urftYtmwZJk2ahDNnzmDUqFGYNm0abt26ZYjuERERNRktPSfz9vIW5tsszeWj+egcETUztra2kEqlsLKyEmfLrn6f9PLly/Hss8+Kddu3bw9PT0/x84oVK7Bv3z7s378fYWFhWvcRHByMqVOnAgA+/PBDrF+/HidOnEBgYKA+ukRNwOnWmt9ZXq0NdH9LJhGRqWvpOZlXuomIqMXx+duzaKWlpZg3bx569+4NOzs7WFtb4/z58488q96vXz/xz23btoWNjQ2uX7+ul5iJiIiao5aQk3mlm4iIWpy/z3g6b948JCYmYs2aNXBzc0ObNm0wYcIEVFRU1NpO69at1T5LJBJUVVXpPF4iIqLmqiXkZA66iYio2ZJKpaisrHxkvWPHjiE4OBhjx44F8PAse05Ojp6jIyIiajlack7m7eVERNRsyeVypKamIicnB4WFhVrPeLu7u2Pv3r3IzMzE6dOn8eKLL5rM2XEiIqLmoCXnZA66iYio2Zo3bx7Mzc3Rp08fdOzYUevzYNHR0bC3t4e/vz9Gjx4NhUIBb29vA0dLRETUfLXknMzby4mIqGF8TH8W5h49eiAlJUWtLDg4uEY9uVyOpKQktbLZs2erff77rW2CINRop6ioqEFxEhERNQpzco12TCkn80o3ERERERERkZ7wSjcRERGRiehQnGfsEIiISMdM4kr3xo0bIZfLYWlpCV9fX5w4caLW+nv27EGvXr1gaWkJDw8PHDx4UG29IAiIjIyEk5MT2rRpg4CAAFy8eFGtzgsvvIAuXbrA0tISTk5OeOmll5CXx0RHREREREREumP0Qffu3bsRHh6OJUuWICMjA56enlAoFFpfZH78+HFMnToVM2fOxKlTpxAUFISgoCCcPXtWrLN69WqsX78esbGxSE1NRdu2baFQKHDv3j2xzjPPPIP//Oc/yMrKwtdff43s7GxMmDBB7/0lIiIiIiKilsPog+7o6GiEhoYiJCQEffr0QWxsLKysrLBlyxaN9detW4fAwEDMnz8fvXv3xooVK+Dt7Y0NGzYAeHiVOyYmBosXL8aYMWPQr18/7NixA3l5eYiPjxfbefvtt/HEE0+ga9eu8Pf3x8KFC/HLL7/g/v37hug2ERERERERtQBGHXRXVFQgPT0dAQEBYpmZmRkCAgJqzGxXLSUlRa0+ACgUCrH+5cuXoVKp1OrY2trC19dXa5u3bt3Czp074e/vj9atWze2WwZ3uvUFjQsREREREREZl1EnUissLERlZSUcHR3Vyh0dHXHhguZBo0ql0lhfpVKJ66vLtNWptmDBAmzYsAF37tzBE088ge+++05rrOXl5SgvLxc/l5SUPKJ3TUvSlaQaZcO6DjNCJERERERERM2H0W8vN6b58+fj1KlT+PHHH2Fubo7p06drfMcbAERFRcHW1lZcXFxcDBwtERERERERNTVGHXQ7ODjA3NwcBQUFauUFBQWQyWQat5HJZLXWr/5vXdp0cHBAjx498Oyzz2LXrl04ePAgfvnlF437jYiIQHFxsbhcvXq17h0lIiIiIiKiFsmog26pVIoBAwZAqVSKZVVVVVAqlfDz89O4jZ+fn1p9AEhMTBTru7q6QiaTqdUpKSlBamqq1jar9wtA7Rbyv7KwsICNjY3aQkREzZtcLkdMTIyxwyAiImrxmnJONuoz3QAQHh6OGTNmwMfHB4MGDUJMTAzKysoQEhICAJg+fTo6d+6MqKgoAMCcOXMwZMgQrF27Fs899xx27dqFtLQ0bN68GQAgkUgwd+5cvP/++3B3d4erqyvee+89ODs7IygoCACQmpqKkydPYvDgwbC3t0d2djbee+89dO/evdaBOREREREREVF9GH3QPXnyZNy4cQORkZFQqVTw8vJCQkKCOBFabm4uzMz+d0He398fcXFxWLx4MRYtWgR3d3fEx8ejb9++Yp13330XZWVlePXVV1FUVITBgwcjISEBlpaWAAArKyvs3bsXS5YsQVlZGZycnBAYGIjFixfDwsLCsF8AEVETpWkCRn3i5I5ERESaMSebNpOYSC0sLAxXrlxBeXk5UlNT4evrK65LTk7Gtm3b1OpPnDgRWVlZKC8vx9mzZzFq1Ci19RKJBMuXL4dKpcK9e/dw6NAh9OjRQ1zv4eGBpKQk3Lx5E/fu3cPly5exadMmdO7cWa/9JCIiw9m8eTOcnZ3Fx4eqjRkzBi+//DKys7MxZswYODo6wtraGgMHDsShQ4eMFC0REVHz1dJzskkMuomIiHRt4sSJuHnzJg4fPiyW3bp1CwkJCZg2bRpKS0sxatQoKJVKnDp1CoGBgRg9ejRyc3ONGDUREVHz09JzMgfdBADIKqy5EBE1Zfb29hg5ciTi4uLEsq+++goODg545pln4Onpiddeew19+/aFu7s7VqxYge7du2P//v1GjJqIiKj5aek5mYNuIiJqtqZNm4avv/5afDPFzp07MWXKFJiZmaG0tBTz5s1D7969YWdnB2tra5w/f77ZnFUnIiIyJS05Jzdo0P3f//5X13EQERHp3OjRoyEIAg4cOICrV6/i6NGjmDZtGgBg3rx52LdvHz788EMcPXoUmZmZ8PDwQEVFhZGj1j1d5u2NGzdCLpfD0tISvr6+OHHiRK319+zZg169esHS0hIeHh44ePCg2vqlS5eiV69eaNu2Lezt7REQEIDU1FSdxUtERKahJefkBg263dzc8Mwzz+Df//437t27p+uYiIiIdMLS0hLjxo3Dzp078eWXX6Jnz57w9vYGABw7dgzBwcEYO3YsPDw8IJPJkJOTY9yA9URXeXv37t0IDw/HkiVLkJGRAU9PTygUCly/fl1j/ePHj2Pq1KmYOXMmTp06haCgIAQFBeHs2bNinR49emDDhg349ddf8fPPP0Mul2PEiBG4ceNGg+MkIiLT05JzcoMG3RkZGejXrx/Cw8Mhk8nw2muvPfJMNxERkTFMmzYNBw4cwJYtW8Qz6gDg7u6OvXv3IjMzE6dPn8aLL75YY1bV5kJXeTs6OhqhoaEICQlBnz59EBsbCysrK2zZskVj/XXr1iEwMBDz589H7969sWLFCnh7e2PDhg1inRdffBEBAQHo1q0bHn/8cURHR6OkpARnzpxpcH+JiMg0tdSc3KBBt5eXF9atW4e8vDxs2bIF+fn5GDx4MPr27Yvo6GienSYiIpMxbNgwtG/fHllZWXjxxRfF8ujoaNjb28Pf3x+jR4+GQqEQz7g3N7rI2xUVFUhPT0dAQIBYZmZmhoCAAKSkpGjcJiUlRa0+ACgUCq31KyoqsHnzZtja2sLT01NrLOXl5SgpKVFbiIjI9LXUnNyqURu3aoVx48bhueeewyeffIKIiAjMmzcPixYtwqRJk7Bq1So4OTnpKlYiIjIhw7oOM3YIdWJmZoa8vLwa5XK5HElJSWpls2fPVvvcnG5tAxqXtwsLC1FZWQlHR0e1ckdHR1y4cEHjNiqVSmN9lUqlVvbdd99hypQpuHPnDpycnJCYmAgHBwet/YiKisKyZcvq0mUiohaBOdm0NWr28rS0NLzxxhtwcnJCdHQ05s2bh+zsbCQmJiIvLw9jxozRVZxERETUSKaat5955hlkZmbi+PHjCAwMxKRJk7Q+Jw4AERERKC4uFperV68aMFoiIqL6adCV7ujoaGzduhVZWVkYNWoUduzYgVGjRsHM7OEY3tXVFdu2bYNcLtdlrERERNQAusjbDg4OMDc3R0FBgVp5QUEBZDKZxm1kMlmd6rdt2xZubm5wc3PDE088AXd3d3zxxReIiIjQ2K6FhQUsLCwe1W0iIiKT0KAr3Zs2bcKLL76IK1euID4+Hs8//7yYuKt16tQJX3zxhU6CJCIioobTRd6WSqUYMGAAlEqlWFZVVQWlUgk/Pz+N2/j5+anVB4DExESt9f/abvV7XImIiJq6Bl3pTkxMRJcuXWokbEEQcPXqVXTp0gVSqRQzZszQSZBERETUcLrK2+Hh4ZgxYwZ8fHwwaNAgxMTEoKysDCEhIQCA6dOno3PnzoiKigIAzJkzB0OGDMHatWvx3HPPYdeuXUhLS8PmzZsBAGVlZfjggw/wwgsvwMnJCYWFhdi4cSOuXbuGiRMn6uGbICIiMrwGDbq7d++O/Px8dOrUSa381q1bcHV1RWVlpU6CIyIiosbTVd6ePHkybty4gcjISKhUKnh5eSEhIUGcLC03N1dtYO/v74+4uDgsXrwYixYtgru7O+Lj49G3b18AgLm5OS5cuIDt27ejsLAQHTp0wMCBA3H06FE8/vjjOuo9ERGRcTVo0C0Igsby0tJSWFpaNiogIiIyTdr+7ae6Meb3p8u8HRYWhrCwMI3rkpOTa5RNnDhR61VrS0tL7N27t177b8m+zap9/eiehomDiIyPOblxDP391WvQHR4eDgCQSCSIjIyElZWVuK6yshKpqanw8vLSaYBERGRcrVu3BgDcuXMHbdq0MXI0TVdFRQWAh1d3DYV5m4ioeWFO1g1D5+R6DbpPnToF4OGZgV9//RVSqVRcJ5VK4enpiXnz5uk2QiIiMipzc3PY2dmJr3CysrKCRCIxclRNS1VVFW7cuAErKyu0atWgm8wahHmbiKh5YU5uPGPk5Hrt5fDhwwCAkJAQrFu3DjY2NnoJigyvQ3HNl9QTEVWrfsVTbe9OptqZmZmhS5cuBj04Yt4mImp+mJMbz9A5uUFD+61bt+o6DiIiMmESiQROTk7o1KkT7t+/b+xwmiSpVFpj9nBDYd4mImo+mJMbz9A5uc6D7nHjxmHbtm2wsbHBuHHjaq3LSVGIiJonc3Nzgz6TTA3HvE1E1LwxJzcddR5029raipffbW1t9RYQERERNR7zNhERkWmo86D7r7em8TY1IiIi08a8TUREZBoadCP73bt3cefOHfHzlStXEBMTgx9//FFngREREZFuMG8TEREZT4MG3WPGjMGOHTsAAEVFRRg0aBDWrl2LMWPGYNOmTToNkIiIiBqHeZuIiMh4GjTozsjIwFNPPQUA+OqrryCTyXDlyhXs2LED69ev12mARERE1DjM20RERMbToEH3nTt30K5dOwDAjz/+iHHjxsHMzAxPPPEErly5otMAiYiIqHGYt4mIiIynQYNuNzc3xMfH4+rVq/jhhx8wYsQIAA9f0G5jY6PTAImIiKhxmLeJiIiMp0GD7sjISMybNw9yuRy+vr7w8/MD8PDsef/+/XUaIBERETUO8zYREZHx1PmVYX81YcIEDB48GPn5+fD09BTLhw8fjrFjx+osOCIiImo85m0iIiLjadCgGwBkMhlkMpla2aBBgxodEBEREeke8zYREZFxNOj28rKyMrz33nvw9/eHm5sbunXrprbU18aNGyGXy2FpaQlfX1+cOHGi1vp79uxBr169YGlpCQ8PDxw8eFBtvSAIiIyMhJOTE9q0aYOAgABcvHhRXJ+Tk4OZM2fC1dUVbdq0Qffu3bFkyRJUVFTUO3YiIiJTp+u8TQ33R2lSrQsRETU/DbrS/corr+DIkSN46aWX4OTkBIlE0uAAdu/ejfDwcMTGxsLX1xcxMTFQKBTIyspCp06datQ/fvw4pk6diqioKDz//POIi4tDUFAQMjIy0LdvXwDA6tWrsX79emzfvh2urq547733oFAocO7cOVhaWuLChQuoqqrCp59+Cjc3N5w9exahoaEoKyvDmjVrGtwXIiIiU6TLvE1ERET1IxEEQajvRnZ2djhw4ACefPLJRgfg6+uLgQMHYsOGDQCAqqoquLi44M0338TChQtr1J88eTLKysrw3XffiWVPPPEEvLy8EBsbC0EQ4OzsjHfeeQfz5s0DABQXF8PR0RHbtm3DlClTNMbx0UcfYdOmTfjvf/9bp7hLSkpga2uL4uJio8/8+p+kf2ssnzTsHzXKvs3S3MbdazXb0LQ9ERHpnr5zii7ztilqCjm52k1b51rXdyjO07quTefa8/LonrWuJiKiOtBHTmnQ7eX29vZo3759o3deUVGB9PR0BAQE/C8gMzMEBAQgJSVF4zYpKSlq9QFAoVCI9S9fvgyVSqVWx9bWFr6+vlrbBB4OzGvrU3l5OUpKStSW5u7bLM0LERE1LbrK20RERFR/DRp0r1ixApGRkbhz506jdl5YWIjKyko4OjqqlTs6OkKlUmncRqVS1Vq/+r/1afPSpUv4+OOP8dprr2mNNSoqCra2tuLi4uJSe+eIiIhMhK7yNhEREdVfg57pXrt2LbKzs+Ho6Ai5XI7WrVurrc/IyNBJcIZw7do1BAYGYuLEiQgNDdVaLyIiAuHh4eLnkpKSFjvw1nS1m7e0ERGZruaUt4mIiJqaBg26g4KCdLJzBwcHmJubo6CgQK28oKCgxmtNqslkslrrV/+3oKAATk5OanW8vLzUtsvLy8MzzzwDf39/bN68udZYLSwsYGFhUad+mTJtM6N2MHAcRERkOLrK22Rcj57dfJhB4iAiovpp0KB7yZIlOtm5VCrFgAEDoFQqxQOCqqoqKJVKhIWFadzGz88PSqUSc+fOFcsSExPh5+cHAHB1dYVMJoNSqRQH2SUlJUhNTcWsWbPEba5du4ZnnnkGAwYMwNatW2Fm1qA77YmIiEyervI2ERER1V+DR5pFRUX4/PPPERERgVu3bgF4eHvatWvX6tVOeHg4PvvsM2zfvh3nz5/HrFmzUFZWhpCQEADA9OnTERERIdafM2cOEhISsHbtWly4cAFLly5FWlqaOEiXSCSYO3cu3n//fezfvx+//vorpk+fDmdnZ3Fgf+3aNQwdOhRdunTBmjVrcOPGDahUKq3PfBMRETV1usrbREREVD8NGnSfOXMGPXr0wKpVq7BmzRoUFRUBAPbu3as2QK6LyZMnY82aNYiMjISXlxcyMzORkJAgToSWm5uL/Px8sb6/vz/i4uKwefNmeHp64quvvkJ8fLz4jm4AePfdd/Hmm2/i1VdfxcCBA1FaWoqEhARYWloCeHhl/NKlS1AqlXjsscfg5OQkLkRERM2NLvP2xo0bIZfLYWlpCV9fX5w4caLW+nv27EGvXr1gaWkJDw8PHDx4UFx3//59LFiwAB4eHmjbti2cnZ0xffp05OVpf20WERFRU9OgQXd4eDiCg4Nx8eJFcSALAKNGjcJPP/1U7/bCwsJw5coVlJeXIzU1Fb6+vuK65ORkbNu2Ta3+xIkTkZWVhfLycpw9exajRo1SWy+RSLB8+XKoVCrcu3cPhw4dQo8ePcT1wcHBEARB40JERNTc6Cpv7969G+Hh4ViyZAkyMjLg6ekJhUKB69eva6x//PhxTJ06FTNnzsSpU6cQFBSEoKAgnD17FgBw584dZGRk4L333kNGRgb27t2LrKwsvPDCC43rcDPVoTiv1oWIiExTg57pPnnyJD799NMa5Z07d+Yt2s2ItglbHrPmRC1ERE2JrvJ2dHQ0QkNDxUfAYmNjceDAAWzZsgULFy6sUX/dunUIDAzE/PnzATx8dVliYiI2bNiA2NhY2NraIjExUW2bDRs2YNCgQcjNzUWXLl3q000iIiKT1KAr3RYWFigpKalR/vvvv6Njx46NDoqIiIh0Rxd5u6KiAunp6QgICBDLzMzMEBAQgJSUFI3bpKSkqNUHAIVCobU+ABQXF0MikcDOzk5rnfLycpSUlKgtREREpqpBg+4XXngBy5cvx/379wE8vJ07NzcXCxYswPjx43UaIBERETWOLvJ2YWEhKisrxTlXqjk6Omq9Wq5SqepV/969e1iwYAGmTp0KGxsbrbFERUXB1tZWXFxcXOrUByIiImNo0KB77dq1KC0tRceOHXH37l0MGTIEbm5uaNeuHT744ANdx0gm5o/SpBoLERGZrqaQt+/fv49JkyZBEARs2rSp1roREREoLi4Wl6tXrxooSiIiovpr0DPd1c9gHTt2DKdPn0ZpaSm8vb1r3EJGRERExqeLvO3g4ABzc3MUFBSolRcUFEAmk2ncRiaT1al+9YD7ypUrSEpKqvUqN/DwdnkLC4s6x05ERGRM9R50V1VVYdu2bdi7dy9ycnIgkUjg6uoKmUwGQRAgkUj0EScRERE1gK7ytlQqxYABA6BUKhEUFCS2rVQqERYWpnEbPz8/KJVKzJ07VyxLTEyEn5+f+Ll6wH3x4kUcPnwYHTp0aHBfmwLOMk5E1PLUa9AtCAJeeOEFHDx4EJ6envDw8IAgCDh//jyCg4Oxd+9exMfH6ylUAoCkK7yVm4iI6kbXeTs8PBwzZsyAj48PBg0ahJiYGJSVlYmzmU+fPh2dO3dGVFQUAGDOnDkYMmQI1q5di+eeew67du1CWloaNm/eDODhgHvChAnIyMjAd999h8rKSvF57/bt20Mqler2C9EB5mEiIqqveg26t23bhp9++glKpRLPPPOM2rqkpCQEBQVhx44dmD59uk6DpIb5NsvYERARkTHpOm9PnjwZN27cQGRkJFQqFby8vJCQkCBOlpabmwszs/9NF+Pv74+4uDgsXrwYixYtgru7O+Lj49G3b18AwLVr17B//34AgJeXl9q+Dh8+jKFDhzaw50RERKZDIgiCUNfKI0aMwLBhwzS+ixMAPvzwQxw5cgQ//PCDzgI0VSUlJbC1tUVxcfEjnz3TJU1n2AuzNd+q1qbzP2qUaZv0TNPtbjdtnesc16wBfHc3EVFD6SuntJS8bcic/Kgr3dpysiFMGlYz76tJS6t9vY+P7oIhImqi9JFT6jV7+ZkzZxAYGKh1/ciRI3H69OlGB0WmoUNxnsaFiIiaBuZtIiIi46vXoPvWrVs13rf5V46Ojvjzzz8bHRQRERE1HvM2ERGR8dXrme7Kykq0aqV9E3Nzczx48KDRQVEzoe02Nt6+RkRkEMzbRERExlfv2cuDg4O1vhuzvLxcJ0ERERFR4zFvExERGV+9Bt0zZsx4ZB3OXE5ERGQamLeJiIiMr16D7q1bt+orDiIiItIx5m0iIiLjq9dEakRERERERERUd/W60k1NH1/5RUREREREZDi80k1ERERERESkJxx0ExEREREREekJB91EREREREREesJnuomIiIjqKo9zoxARUf3wSjcRERERERGRnnDQTURERERERKQnvL2ciIiIqAXIuln7+p6GCYOIqMXhlW4iIiIiIiIiPeGgm4iIiIiIiEhPOOgmIiIiIiIi0hM+001ERETUApxufaHW9T3hY6BIiIhaFqNf6d64cSPkcjksLS3h6+uLEydO1Fp/z5496NWrFywtLeHh4YGDBw+qrRcEAZGRkXByckKbNm0QEBCAixcvqtX54IMP4O/vDysrK9jZ2em6S81eh+K8GgsREVFLUHi39oWIiOjvjDro3r17N8LDw7FkyRJkZGTA09MTCoUC169f11j/+PHjmDp1KmbOnIlTp04hKCgIQUFBOHv2rFhn9erVWL9+PWJjY5Gamoq2bdtCoVDg3r17Yp2KigpMnDgRs2bN0nsfiYiIiIiIqOUy6u3l0dHRCA0NRUhICAAgNjYWBw4cwJYtW7Bw4cIa9detW4fAwEDMnz8fALBixQokJiZiw4YNiI2NhSAIiImJweLFizFmzBgAwI4dO+Do6Ij4+HhMmTIFALBs2TIAwLZt2wzQS93KKqxZ1sHwYRAREZGJ+TbL2BEQEZEmRrvSXVFRgfT0dAQEBPwvGDMzBAQEICUlReM2KSkpavUBQKFQiPUvX74MlUqlVsfW1ha+vr5a26yr8vJylJSUqC1EREREREREtTHaoLuwsBCVlZVwdHRUK3d0dIRKpdK4jUqlqrV+9X/r02ZdRUVFwdbWVlxcXFwa1V5LkHVT80JERE2Xrudi2bt3L0aMGIEOHTpAIpEgMzNTj9ETEREZntEnUmsqIiIiUFxcLC5Xr17V+z6TriTVWIiIiIxFH3OxlJWVYfDgwVi1apWhukFERGRQRnum28HBAebm5igoKFArLygogEwm07iNTCartX71fwsKCuDk5KRWx8vLq1HxWlhYwMLColFt6EJ9Zgr/o7TmIF1vz3+npemrZSIiMhG6nosFAF566SUAQE5OjmE6QUREZGBGu9ItlUoxYMAAKJVKsayqqgpKpRJ+fn4at/Hz81OrDwCJiYlifVdXV8hkMrU6JSUlSE1N1dqmScvLq7nUA1/tRUREuqKPuVhIt3rkpNW6EBGRcRh19vLw8HDMmDEDPj4+GDRoEGJiYlBWViaeQZ8+fTo6d+6MqKgoAMCcOXMwZMgQrF27Fs899xx27dqFtLQ0bN68GQAgkUgwd+5cvP/++3B3d4erqyvee+89ODs7IygoSNxvbm4ubt26hdzcXFRWVorPj7m5ucHa2tqg30FzwWe1iYiat9rmYrlw4YLGbR41F0tDlZeXo7y8XPzMyU2JiMiUGXXQPXnyZNy4cQORkZFQqVTw8vJCQkKCmKBzc3NhZva/i/H+/v6Ii4vD4sWLsWjRIri7uyM+Ph59+/YV67z77rsoKyvDq6++iqKiIgwePBgJCQmwtLQU60RGRmL79u3i5/79+wMADh8+jKFDh+q5183T6dY1D7g87/cyQiRERNTcRUVFia//JCIiMnVGHXQDQFhYGMLCwjSuS05OrlE2ceJETJw4UWt7EokEy5cvx/Lly7XW2bZtW5N8R3dzoWlCuGFdhxkhEiIiqit9zMXSUBEREQgPDxc/l5SU6OytIpy0lIiIdM3og24iIiIyfX+di6X6ka3quVi0nTyvnotl7ty5Ytlf52JpKFOZ3LS5edQJB54gJyJqGA66iYiIqE50PRcLAHGOlbz/P1loVlYWgIdXyRt7RZyIiMgUcNBNREREdaKPuVj2798vDtoBYMqUKQCAJUuWYOnSpYbpGBERkR5x0E1ERER1puu5WIKDgxEcHKyj6IiIiEwPB91keJreN97V8GEQERERERHpGwfdRERERKT5pPhf8QQ5EVGDcNBNJi0p5d81yob5/cMIkRARUYvwqIGnCTvd+oKxQyAiIg046Ca90Zb8HQwcBxERERERkbGYPboKERERERERETUEr3QTERER0SMlXUmqdf2wrsMMFAkRUdPCK91EREREREREesIr3URERESEwru1r+ecLEREDcNBNxnco5L6o+pqu72Nt7UREREREZGp4aCbiIiIiB6N7/EmImoQPtNNREREREREpCe80m0CklL+bewQiIiIiIiISA94pZuIiIiIiIhIT3ilm5oebc+U8VkyIiIiIiIyMbzSTURERERERKQnHHQTERERERER6QlvLyeToO3d242WllazzMdHP/siIiJqxgrvGjsCIqKmiYNuIiIiItIvTSfB/4onxImoGeOgm5ocnmknIiIiIqKmgoNuE9aiBpfaZiQnIiIiIiJqwjjoJpPQok4wEBERERFRi8HZy4mIiIiIiIj0hFe6qfl41CQtREREpD+NycOcaI2ImjEOuomIiIio0ZLuX9C6bljrXgaMhIjItJjE7eUbN26EXC6HpaUlfH19ceLEiVrr79mzB7169YKlpSU8PDxw8OBBtfWCICAyMhJOTk5o06YNAgICcPHiRbU6t27dwrRp02BjYwM7OzvMnDkTpaWlOu8bGU7S/Qs1Fo3S0jQvja1LRNQCGCNnE2nNx8zLRNQEGH3QvXv3boSHh2PJkiXIyMiAp6cnFAoFrl+/rrH+8ePHMXXqVMycOROnTp1CUFAQgoKCcPbsWbHO6tWrsX79esTGxiI1NRVt27aFQqHAvXv3xDrTpk3Db7/9hsTERHz33Xf46aef8Oqrr+q9v2TCDJnEecBARE2QsXK2IRXerX2hJoqDdiIyIokgCIIxA/D19cXAgQOxYcMGAEBVVRVcXFzw5ptvYuHChTXqT548GWVlZfjuu+/EsieeeAJeXl6IjY2FIAhwdnbGO++8g3nz5gEAiouL4ejoiG3btmHKlCk4f/48+vTpg5MnT8Ln/z8jlJCQgFGjRuGPP/6As7PzI+MuKSmBra0tiouLYWNj06jvICnl3xrLmdzrx6FNzTK93c6m4dmypCtJdd582A0Nf2f4vBpRi6XLnKJPxsjZdaHL7+8/SZpzMjXOJJva83Ftt6YDj87nj9r+UYb5/aNR29fmUccHw7oO09u+iaj+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fO3aNWRmZsLa2hpubm4AgHnz5mH06NHo2rUr8vLysGTJEpibm2t85ScREVFT1OAXYcpkshq3kw0aNKjRAZF+nW59Qeu6nuArw4iImitd5O3Jkyfjxo0biIyMhEqlgpeXFxISEsTJ1XJzc2Fm9r+b6PLy8tSupK9ZswZr1qzBkCFDkJycDAD4448/MHXqVNy8eRMdO3bE4MGD8csvv6Bjx44N7CkREZFpadCgu6ysDCtXroRSqcT169dRVVWltv6///2vToIjIiKixtNl3g4LC0NYWJjGddUD6WpyuRyCINTa3q5du+q8byIioqaoQYPuV155BUeOHMFLL70EJycnSCQSXcdFREREOsK8TUREZDwNGnR///33OHDgAJ588kldx0NEREQ6xrxNRERkPA2avdze3h7t27fXdSxERESkB8zbRERExtOgQfeKFSsQGRmJO3fu6DoeIiIi0jHmbSIiIuNp0O3la9euRXZ2NhwdHSGXy9G6dWu19RkZGToJjoiIiBqPeZuIiMh4GjToDgoK0nEYREREpC/M20RERMbToEH3kiVLdB0HERER6QnzNhERkfE0aNANAEVFRfjqq6+QnZ2N+fPno3379sjIyICjoyM6d+6syxhJiw7FecYOgYiImgjmbSIiIuNo0KD7zJkzCAgIgK2tLXJychAaGor27dtj7969yM3NxY4dO3QdJxERETUQ8zYREZHxNGj28vDwcAQHB+PixYuwtLQUy0eNGoWffvpJZ8ERERFR4zFvExERGU+DBt0nT57Ea6+9VqO8c+fOUKlUjQ6KiIiIdId5m4iIyHgaNOi2sLBASUlJjfLff/8dHTt2bHRQREREpDvM20RERMbToEH3Cy+8gOXLl+P+/fsAAIlEgtzcXCxYsADjx4/XaYBERETUOMzbRERExtOgQffatWtRWlqKjh074u7duxgyZAjc3NzQrl07fPDBB/Vub+PGjZDL5bC0tISvry9OnDhRa/09e/agV69esLS0hIeHBw4ePKi2Pjg4GBKJRG0JDAxUq3Pr1i1MmzYNNjY2sLOzw8yZM1FaWlrv2ImIiEydrvM2ERER1V2DZi+3tbVFYmIijh07htOnT6O0tBTe3t4ICAiod1u7d+9GeHg4YmNj4evri5iYGCgUCmRlZaFTp0416h8/fhxTp05FVFQUnn/+ecTFxSEoKAgZGRno27ev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2cPDA/369UP37t2RnJyM4cOHa9wmIiJC7Qp6SUkJB95ERGSyjD7onjx5Mm7cuIHIyEioVCp4eXkhISFBPDOem5sLM7P/XZD39/dHXFwcFi9ejEWLFsHd3R3x8fHihCzXrl3D/v37AQBeXl5q+zp8+DCGDh0KCwsL7Nq1C0uXLkV5eTlcXV3x9ttv17gFjoiIiB7S5yNhf9WtWzc4ODjg0qVLWgfdfOTLsArvGjsCIqKmzeiDbgAICwtDWFiYxnXJyck1yiZOnIiJEydqrC+XyyEIQq378/b2xi+//FLvOJu70601P7PlYOA4iIjI9Pz1kbCgoCAA/3skTFsOr34kbO7cuWLZ3x8J+7s//vgDN2/ehJOTky7Db/a05XBtPO/30lMkRET0dyYx6CbTxjPcREQE6P6RsNLSUixbtgzjx4+HTCZDdnY23n33Xbi5uUGhUBitn0RERLrEQTcRERHVia4fCTM3N8eZM2ewfft2FBUVwdnZGSNGjMCKFSt4+zgRETUbHHQTERFRnenykbA2bdrghx9+0GV4REREJseorwwjIiIiIiIias54pZuIiIiohanvxGtERNRwvNJNREREREREpCccdBMRERERERHpCQfdRERERERERHrCQTcRERERERGRnnDQTURERERERKQnnL2cjCLpSpLG8mFdhxk4EiIiIiIiIv3hoJsaJy1N+zofH8PFQUREREREZIJ4ezkRERERERGRnvBKNzVK1k3t63oaLgwiIiIiIiKTxCvdRERERERERHrCK91EREREZBTaJlbVhhOuElFTxEE3GUdenubyroYNg4iIiIiISJ846KYmo7az4TzzTUREREREpoiDbjKKwrtaVtT2CrKOegmFiIiIdOjbrLrXbWupvziIiEwFB92kP7UNoLVIun+hlrXODY+FiIiIDKJHTt3z/zUbLY+bacPH0IioCeKgm5oObc+BA0zCREREJuJ069pOoKtz0GMcRESmwiReGbZx40bI5XJYWlrC19cXJ06cqLX+nj170KtXL1haWsLDwwMHDx5UWy8IAiIjI+Hk5IQ2bdogICAAFy9eVKtz69YtTJs2DTY2NrCzs8PMmTNRWlqq8761ZFk3tS9ERNQ0GSNn/7/27jwuqqr/A/hnAIdFBFSUTQRUQk0EBSG00pTCJXPLhUjBfLRFTCXNJcUtA0150DLJelJ70jSf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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "binwidths = {\n", " \"ligand_molecular_weight\": (\"Molecular weight\", 50),\n", @@ -501,7 +1490,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": {}, "outputs": [], "source": [ @@ -528,9 +1517,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-11-27 10:42:51,100 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.09s\n", + "2024-11-27 10:42:51,746 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.11s\n" + ] + } + ], "source": [ "plindex = query_index(\n", " columns=[\"system_id\", \"ligand_unique_ccd_code\"] + ligand_types,\n", @@ -540,9 +1538,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "labels = [c.replace(\"ligand_is_\", \"\").capitalize() for c in ligand_types]\n", "bar_colors = plt.cm.Pastel2.colors\n", @@ -590,7 +1599,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ @@ -606,9 +1615,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-11-27 10:42:53,069 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.08s\n", + "2024-11-27 10:42:57,550 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.13s\n" + ] + } + ], "source": [ "plindex = query_index(\n", " columns=[\"system_id\"] + pli_specific,\n", @@ -625,9 +1643,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "34467" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "(\n", " plindex.drop_duplicates(\"system_id\").system_fraction_atoms_with_crystal_contacts > 0\n", @@ -643,9 +1672,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "split system_has_binding_affinity\n", + "test False 862\n", + " True 174\n", + "train False 261204\n", + " True 47936\n", + "val False 685\n", + " True 147\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "plindex.drop_duplicates(\"system_id\").groupby(\n", " \"split\"\n", @@ -654,9 +1701,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0, 0.5, 'No. of system ligands')" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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VX6/XGlpqY4dO+aRogAAAHyN6cNz7733nvHn9evXq3Hjxsbt8vJy5eXlqVWrVh4tDgAAwFeYDk2DBg2SJFksFo0YMcJlW0BAgFq1aqXZs2d7tDgAAABfYTo0ORwOSVJsbKy2b9+upk2bVltRAAAAvsbtT88VFRVVGjt9+rTCwsI8UQ8AAIBPcvtE8FmzZmnVqlXG7SFDhigiIkK//vWv9c9//tOjxQEAAPgKt0NTVlaWYmJiJElWq1Uffvih1q1bp/79+2vChAkeLxAAAMAXuH14rri42AhNa9eu1f3336/ExES1atVKPXv29HiBAAAAvsDtPU3h4eE6evSoJGndunVKSEiQJDmdziqv3wQAAFAbuL2n6d5779WwYcPUpk0bffvtt+rfv78kadeuXWrdurXHCwQAAPAFboemuXPnqlWrVjp69KgyMzPVsGFDSdLx48f1+9//3uMFAgAA+AK3Q1NZWZn+8Ic/VBofP368RwoCAADwRW6f0xQZGamRI0dqy5Yt1VEPAACAT3I7NL3++us6efKkbr/9dv32t7/Viy++qK+//ro6agMAAPAZboemQYMGKScnR8eOHdPYsWOVnZ2tli1b6o477tDq1at14cKF6qgTAADAq9wOTRV+9atfKS0tTbt379acOXP04Ycf6r777lN0dLTS09N1/vx5T9YJAADgVW6fCF6hpKREK1as0PLly/XVV1/pvvvu06hRo/Tvf/9bs2bN0meffabc3FxP1goAAOA1boem1atX69VXX9X69evVvn17/f73v9dDDz3k8oW9vXr1Urt27TxZJwAAgFe5HZoeeeQRDR06VJ988oluuOGGKudER0frmWeeueLiAAAAfIXboen48eNq0KDBJefUr19ff/zjHy+7KAAAAF/j9ongBw4c0J49e4zb7777rgYNGqSnn35aZWVlHi0OAADAV7gdmv77v/9bX3zxhSTpyy+/1NChQ9WgQQO99dZbmjhxoscLBAAA8AVuh6YvvvhCXbt2lSS99dZbuuWWW5Sdna3ly5fr7bff9nR9AAAAPsHt0OR0OuVwOCRJH374oQYMGCBJiomJ0TfffOPZ6gAAAHyE26EpLi5Ozz33nP72t79p06ZNGjhwoCSpqKhIkZGRHi8QAADAF7gdmubNm6edO3cqNTVVzzzzjFq3bi1J+sc//qFevXp5vEAAAABf4HZo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T9UCAADgsy4rNL322mvq1KmT6tevr/r166tz587629/+5unaAAAAfIbbh+fmzJmjqVOnKjU11fjC3i1btmjs2LH65ptvNH78eI8XCQAA4G1uh6aFCxdqyZIlGj58uDF21113qUOHDsrIyCA0AQCAWsntw3PHjx9Xr169Ko336tVLx48f90hRAAAAvsbt0NS6dWu9+eablcZXrVqlNm3aeKQoAAAAX+P24blp06bpgQce0ObNm41zmj755BPl5eVVGaYAAABqA7f3NA0ePFhbt25V06ZNlZOTo5ycHDVt2lTbtm3TPffcUx01AgAAeN1lXdyye/fuev311z1dCwAAgM/iC3sBAABMML2nyc/PTxaL5ZJzLBaLLly4cMVFAQAA+BrToemdd9752W35+flasGCBHA6HR4oCAADwNaZD0913311p7ODBg5o8ebLWrFmj5ORkTZ8+3aPFAQAA+IrLOqfp66+/1ujRo9WpUydduHBBhYWFWrFihVq2bOnp+gAAAHyCW6HpzJkzmjRpklq3bq19+/YpLy9Pa9asUceOHaurPgAAAJ9g+vBcZmamZs2apaioKP3973+v8nAdAABAbWU6NE2ePFn169dX69attWLFCq1YsaLKeatXr/ZYcQAAAL7CdGgaPnz4L15yAAAAoLYyHZqWL19ejWUAAAD4Nq4IDgAAYAKhCQAAwARCEwAAgAmEJgAAABOuqtD04osvymKxaNy4ccbYDz/8oJSUFDVp0kQNGzbU4MGDVVJS4nK/I0eOaODAgWrQoIGaNWumCRMmVPpi4Y8++kjXX3+9goKC1Lp1a058BwAALq6a0LR9+3b9+c9/VufOnV3Gx48frzVr1uitt97Spk2b9PXXX+vee+81tpeXl2vgwIEqKyvTp59+qhUrVmj58uVKT0835hQVFWngwIH63e9+p8LCQo0bN06PPvqo1q9fX2PPDwAA+LarIjSdPXtWycnJeuWVVxQeHm6MnzlzRn/96181Z84c3X777erevbteffVVffrpp/rss88kSbm5ufr888/1+uuvq2vXrurfv79mzJihxYsXq6ysTJKUlZWl2NhYzZ49W+3atVNqaqruu+8+zZ071yvPFwAA+B7T12nyppSUFA0cOFAJCQl67rnnjPGCggLZ7XYlJCQYY23btlWLFi2Un5+vG2+8Ufn5+erUqZMiIyONOUlJ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d+LECack56ZNm7xdik/67rvvnG3atHFarVbnrbfe6nzyySe9XZLPmTRpkvOmm27ydhk+b+DAgc6RI0e6jN17773O5ORkL1XkmyQ533nnHeO2w+FwRkVFOV966SVj7PTp086goCDn3//+dy9U6Dt+2quqbNu2zSnJ+dVXX9VMURdhT5OPKisrU0FBgRISEowxPz8/JSQkKD8/34uV+b4zZ85IkiIiIrxciW9KSUnRwIEDXX624Oq9995TXFychgwZombNmqlbt2565ZVXvF2Wz+nVq5fy8vL0xRdfSJL++c9/asuWLerfv7+XK/NtRUVFKi4udnkNNm7cWD179uT93YQzZ87IYrFU+/e9VoUrgvuob775RuXl5ZWuRh4ZGakDBw54qSrf53A4NG7cOPXu3VsdO3b0djk+54033tDOnTu1fft2b5fi07788kstWbJEaWlpevrpp7V9+3Y98cQTCgwM1IgRI7xdns+YPHmybDab2rZtK39/f5WXl+v5559XcnKyt0vzacXFxZJU5ft7xTZU7YcfftCkSZP04IMPeuULjwlNqFVSUlK0d+9ebdmyxdul+JyjR4/qySeflNVqVXBwsLfL8WkOh0NxcXF64YUXJEndunXT3r17lZWVRWi6yJtvvqmVK1cqOztbHTp0UGFhocaNG6fo6Gj6BI+z2+26//775XQ6tWTJEq/UwOE5H9W0aVP5+/urpKTEZbykpERRUVFeqsq3paamau3atdq4caOuueYab5fjcwoKCnTixAldf/31qlevnurVq6dNmzZpwYIFqlevnsrLy71dos9o3ry52rdv7zLWrl07HTlyxEsV+aYJEyZo8uTJGjp0qDp16qSHH35Y48eP18yZM71dmk+reA/n/d28isD01VdfyWq1emUvk0Ro8lmBgYHq3r278vLyjDGHw6G8vDzFx8d7sTLf43Q6lZqaqnfeeUcbNmxQbGyst0vySX369NGePXtUWFho/IqLi1NycrIKCwvl7+/v7RJ9Ru/evStdtuKLL75Qy5YtvVSRbzp//rz8/Fz/GfH395fD4fBSRVeH2NhYRUVFuby/22w2bd26lff3KlQEpkOHDunDDz9UkyZNvFYLh+d8WFpamkaMGKG4uDj16NFD8+bN07lz5/TII494uzSfkpKSouzsbL377rtq1KiRcU5A48aNVb9+fS9X5zsaNWpU6TyvkJAQNWnShPO/fmL8+PHq1auXXnjhBd1///3atm2bli5dqqVLl3q7NJ9y55136vnnn1eLFi3UoUMH7dq1S3PmzNHIkSO9XZrXnT17Vv/7v/9r3C4qKlJhYaEiIiLUokULjRs3Ts8995zatGmj2NhYTZ06VdHR0Ro0aJD3ivaSS/WqefPmuu+++7Rz506tXbtW5eXlxnt8RESEAgMDa7bYGv+8HtyycOFCZ4sWLZyBgYHOHj16OD/77DNvl+RzJFX569VXX/V2aT6PSw78vDVr1jg7duzoDAoKcrZt29a5dOlSb5fkc2w2m/PJJ590tmjRwhkcHOy89tprnc8884yztLTU26V53caNG6t8XxoxYoTT6fzxsgNTp051RkZGOoOCgpx9+vRxHjx40LtFe8mlelVUVPSz7/EbN26s8VotTieXbgUAAPglnNMEAABgAqEJAADABEITAACACYQmAAAAEwhNAAAAJhCaAAAATCA0AQAAmEBoAgAAMIHQBAAAYAKhCQAAwARCE4Ba4dZbb630RbHz5s1TSEiIlixZ4qWqft7VVi8AqZ63CwCAK+V0OrVr1y4NGTJEknT+/HmNHj1aGzdulNVqVa9evTz+mGVlZZf9DeveqBfAlWNPEwCfV1xcLIvFovnz56tbt24KDg5Whw4dtGXLFknSoUOH9N133+n6669XUVGRevXqpaKiIhUUFJgOIKWlpXriiSfUrFkzBQcH66abbtL27duN7bfddptSU1M1btw4NW3aVElJSV6tF0DNIzQB8HmFhYWSpGXLlmnevHkqLCxUixYtlJycLIfDoYKCAvn7+6ukpERxcXHq2bOnPvroIzVv3tz0Y0ycOFFvv/22VqxYoZ07d6p169ZKSkrSyZMnjTkrVqxQYGCgPvnkE2VlZXm1XgBe4AQAH/fiiy86AwICnEVFRcbYjh07nJKcR44ccf7hD39w+vv7O/38/JyLFy+uco28vDznyy+/XOW2s2fPOgMCApwrV640xsrKypzR0dHOzMxMp9PpdN56663Obt261Vi9s2fPdkZHRzu7dOni7NSpk/PRRx91fvvtt6YeH0D1YE8TAJ9XWFioe++9V61atTLGQkNDjT/v3LlTCQkJat68uQoKCqpc4/bbb9dTTz1V5bZ//etfstvt6t27tzEWEBCgHj16aP/+/cZY9+7da6zevXv3au7cuSosLFRhYaEiIiKUkpJi6vEBVA9CEwCfV1hYqK5du7qM5efnq2nTpvr1r3+tnTt3qn///nr33Xf197//XS+99FKlNe666y7t2bPniuoICQmpsXr37t2rDh06SJL8/Pz0zDPP6P3337+i+gFcGUITAJ/2/fff69ChQyovLzfGHA6H5s2bpxEjRujw4cM6ffq0rr/+enXv3l2vvvqqpkyZonfffddlnQMHDqht27ZVPsZvfvMb41ylCna7Xdu3b1f79u1rvF6n06lDhw7pt7/9rTEWFBSkc+fO6cKFC27VA8BzuOQAAJ+2Z88eWSwWvf7667r99tsVFham9PR0nT59Ws8++6ysVqssFouxZ+eBBx7Qvn37lJycrC1btqhr16767rvvFBwcrICAgCofIyQkRI899pgmTJigiIgItWjRQpmZmTp//rxGjRpV4/UWFRWpefPmLvUePnxYLVu2VL16vG0D3sKrD4BPKywsVNu2bTVx4kQNHjxYZ86cUVJSkjZt2qSwsDDt3LlTbdq0UaNGjYz7TJs2TZ9//rnuuusubdu2TYcPHzYOdf2cF198UQ6HQw8//LC+++47xcXFaf369QoPD6/xei8+NFdh2bJluu+++9yqBYBnWZxOp9PbRQDAz0lJSdGpU6eUnZ192Wu88sor+s9//qOnn37ag5VVzRP1vvDCCyotLdW0adPkdDr1xhtvKCMjQ/n5+YqIiPBgtQDcwTlNAHxaYWGhOnfufEVr7NmzRx07dvRQRZfmiXr37t2rZcuWqXv37urevbs2btyojRs3EpgAL2NPEwCf5XQ61bhxY73xxhsaMGCAt8v5RVdbvQDcQ2gCAAAwgcNzAAAAJhCaAAAATCA0AQAAmEBoAgAAMIHQBAAAYAKhCQAAwARCEwAAgAmEJgAAABMITQAAACYQmgAAAEz4f8FmhOJ9ztkTAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "plindex[\"ligand_binding_affinity\"].hist()\n", "plt.xlabel(r\"$pK_i$ or $pK_D$\")\n", @@ -672,18 +1740,145 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
countmeanstdmin25%50%75%max
split
test1436.016.5912269.8860073.09.015.022.051.0
train418381.014.44813912.0875110.05.012.021.0722.0
val1157.016.07865210.2046470.08.014.022.049.0
\n", + "
" + ], + "text/plain": [ + " count mean std min 25% 50% 75% max\n", + "split \n", + "test 1436.0 16.591226 9.886007 3.0 9.0 15.0 22.0 51.0\n", + "train 418381.0 14.448139 12.087511 0.0 5.0 12.0 21.0 722.0\n", + "val 1157.0 16.078652 10.204647 0.0 8.0 14.0 22.0 49.0" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "plindex.groupby(\"split\").system_num_interactions.describe()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "array(['1.A_36_type:hydrogen_bonds__protisdon:False__sidechain:False',\n", + " '1.A_113_type:hydrogen_bonds__protisdon:False__sidechain:False',\n", + " '1.A_113_type:hydrogen_bonds__protisdon:True__sidechain:False',\n", + " '1.A_312_type:hydrogen_bonds__protisdon:False__sidechain:False',\n", + " '1.A_320_type:hydrogen_bonds__protisdon:False__sidechain:False',\n", + " '1.A_322_type:hydrogen_bonds__protisdon:False__sidechain:True',\n", + " '1.A_322_type:hydrogen_bonds__protisdon:True__sidechain:False',\n", + " '1.A_40_type:hydrogen_bonds__protisdon:True__sidechain:False',\n", + " '1.A_40_type:hydrophobic_contacts',\n", + " '1.A_13_type:hydrogen_bonds__protisdon:True__sidechain:False',\n", + " '1.A_13_type:hydrogen_bonds__protisdon:True__sidechain:True',\n", + " '1.A_11_type:hydrogen_bonds__protisdon:True__sidechain:False',\n", + " '1.A_35_type:hydrogen_bonds__protisdon:True__sidechain:True',\n", + " '1.A_34_type:hydrogen_bonds__protisdon:True__sidechain:False',\n", + " '1.A_49_type:hydrogen_bonds__protisdon:True__sidechain:True',\n", + " '1.A_180_type:hydrogen_bonds__protisdon:True__sidechain:True',\n", + " '1.A_180_type:pi_stacks__stack_type:T',\n", + " '1.A_41_type:hydrogen_bonds__protisdon:True__sidechain:False',\n", + " '1.A_14_type:hydrogen_bonds__protisdon:True__sidechain:False',\n", + " '1.A_15_type:hydrogen_bonds__protisdon:True__sidechain:False',\n", + " '1.A_140_type:hydrogen_bonds__protisdon:True__sidechain:False',\n", + " '1.A_314_type:hydrogen_bonds__protisdon:True__sidechain:False',\n", + " '2.A_450_type:hydrogen_bonds__protisdon:False__sidechain:False'],\n", + " dtype=object)" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "plindex[\"ligand_interactions\"].values[0]" ] @@ -701,9 +1896,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-11-27 10:42:59,362 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.15s\n", + "2024-11-27 10:43:00,060 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.09s\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "No. ligands: 1357906\n", + "No. systems: 990260\n", + "No. PDB entries: 143800\n" + ] + } + ], "source": [ "plindex = query_index(\n", " columns=[\n", @@ -722,9 +1935,52 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "system_num_protein_chains\n", + "1 857629\n", + "2 312129\n", + "3 73237\n", + "4 19875\n", + "30 14122\n", + " ... \n", + "72 72\n", + "64 64\n", + "53 61\n", + "52 52\n", + "29 30\n", + "Name: count, Length: 74, dtype: int64\n", + "system_num_ligand_chains\n", + "1 809509\n", + "2 248916\n", + "3 107613\n", + "4 45856\n", + "5 17065\n", + " ... \n", + "84 84\n", + "39 78\n", + "74 74\n", + "67 67\n", + "46 46\n", + "Name: count, Length: 238, dtype: int64\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "fig, ax = plt.subplots(figsize=(5, 3))\n", "bars = ax.bar(\n", @@ -795,9 +2051,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 33, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-11-27 10:43:01,723 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.09s\n", + "2024-11-27 10:43:02,044 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.09s\n", + "2024-11-27 10:43:02,532 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.09s\n", + "2024-11-27 10:43:02,870 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.08s\n" + ] + }, + { + "data": { + "text/plain": [ + "{'5FA', 'ADP', 'AQP', 'ATP', 'ZF9', 'ZSF'}" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "ligand_cluster_column = \"tanimoto_similarity_max__95__strong__component\"\n", "atp_ligand_cluster = query_index(\n", @@ -835,9 +2112,1864 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b98023f14bca4ef0a89d58a32b1105c5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "MolGridWidget()" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "grid = mols2grid.MolGrid(atp_analogs, smiles_col=\"ligand_rdkit_canonical_smiles\")\n", "grid.display(subset=[\"ligand_unique_ccd_code\", \"img\"])" @@ -852,9 +3984,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-11-27 10:43:03,497 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.09s\n", + "2024-11-27 10:43:03,869 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.08s\n" + ] + } + ], "source": [ "pocket_cluster_column = \"pocket_qcov__50__weak__component\"\n", "plindex = query_index(\n", @@ -879,9 +4020,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 36, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "('No. systems:', 5409, 'No. PDB entries:', 1484, 'No. clusters:', 154)" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "(\n", " \"No. systems:\",\n", @@ -895,9 +4047,31 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "pocket_qcov__50__weak__component\n", + "c0 3562\n", + "c123 260\n", + "c11 259\n", + "c206 146\n", + "c204 141\n", + "c132 80\n", + "c391 75\n", + "c95 73\n", + "c205 58\n", + "c319 58\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "plindex[pocket_cluster_column].value_counts().head(10)" ] @@ -911,9 +4085,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "system_pocket_ECOD_t_name\n", + "GroEL equatorial domain-like 252\n", + "None 7\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "plindex[plindex[pocket_cluster_column] == \"c11\"].system_pocket_ECOD_t_name.value_counts(\n", " dropna=False\n", @@ -922,9 +4110,76 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 39, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
system_identry_pdb_identry_release_datepocket_qcov__50__weak__componentsystem_pocket_ECOD_t_namesplit
5278i6j__1__1.B__1.C8i6j2023-01-28c11Nonetrain
27568hki__1__1.I__1.Q8hki2022-11-27c11Nonetrain
\n", + "
" + ], + "text/plain": [ + " system_id entry_pdb_id entry_release_date \\\n", + "527 8i6j__1__1.B__1.C 8i6j 2023-01-28 \n", + "2756 8hki__1__1.I__1.Q 8hki 2022-11-27 \n", + "\n", + " pocket_qcov__50__weak__component system_pocket_ECOD_t_name split \n", + "527 c11 None train \n", + "2756 c11 None train " + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "plindex[\n", " (plindex[pocket_cluster_column] == \"c11\")\n", @@ -934,9 +4189,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 40, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "290" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "plindex[plindex[\"system_pocket_ECOD_t_name\"].isna()][\"entry_pdb_id\"].nunique()" ] @@ -959,9 +4225,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 41, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-11-27 10:43:05,931 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.10s\n", + "2024-11-27 10:43:06,564 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.09s\n" + ] + } + ], "source": [ "from torch.utils.data import WeightedRandomSampler\n", "\n", @@ -1024,9 +4299,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 42, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "No. of original systems: 259772\n", + "No. of nonredundant sampled systems: 57490\n", + "No. of original clusters: 2723\n", + "No. of sampled clusters: 2719\n" + ] + } + ], "source": [ "print(\"No. of original systems: \", sample_from.system_id.nunique())\n", "print(\"No. of nonredundant sampled systems: \", sampled_plindex.system_id.nunique())\n", @@ -1043,9 +4329,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 43, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0, 0.5, '# Clusters')" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1kAAAEmCAYAAACQ6loOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABUT0lEQVR4nO3deVxU5f4H8M8AsgkMIgKCIHrxauYCoShhZooRmmnazcqFa2W/bHAbrwplmpbLtTJMJy2v620zc6m0cMEFTQpFyV2zcMkENIUJVEB4fn/YnOsICjNzYGY4n/frxUvmnDNnvp+R4cyXec5zVEIIASIiIiIiIpKFg7ULICIiIiIiqk/YZBEREREREcmITRYREREREZGM2GQRERERERHJiE0WERERERGRjNhkERERERERyYhNFhERERERkYzYZBEREREREcnIydoFWFtFRQV+//13eHp6QqVSWbscIiLFEELgzz//RGBgIBwc+Dc/Ax6XiIisR65jk+KbrN9//x3BwcHWLoOISLHOnz+PZs2aWbsMm8HjEhGR9Vl6bFJ8k+Xp6Qng1hPp5eVl8v2FECgsLIRarVbcXxyZXZnZAWXnZ3b5suv1egQHB0u/h+kWS49LRERkPrmOTYpvsgxvFLy8vMxusoQQ8PLyUuQbLmZXXnZA2fmZXf7sSnseq2PpcYmIiCxn6bGJg+CJiIiIiIhkxCaLiIiIiIhIRoofLmhgGAZj7v3Mua+9Y3ZlZgeUnZ/Z5cuuxOeQiIiUQbFNlk6ng06nQ3l5OQCgsLDQ7CarqKgIgPLOK2B2ZWYHlJ2f2eXLrtfrLd4HERGRLVJsk6XRaKDRaKDX66FWq6FWq82e+AKAYmcaA5hdadkBZedndvmyK+35IyIi5VBsk3UnlUpl9gHfcF8lvmFgdmVmB5Sdn9nlya7E54+IiJSBE18QERERERHJiJ9kyeDxBXtwoRgQMO+vsmfm9JW5IiIistScOXOQnJyMsWPHIiUlBQBw48YNTJgwAZ9//jlKSkoQFxeHDz74AP7+/tL9zp07h1GjRmHHjh3w8PBAQkICZs+eDScnHnKJiJSCv/GJiIjusG/fPnz44Yfo0KGD0fLx48dj06ZNWLNmDdRqNRITEzFw4EB8//33AIDy8nL07dsXAQEB2Lt3Ly5evIjhw4ejQYMGmDVrljWiENW50KRNFt2ff3ym+oDDBYmIiG5TVFSEIUOGYMmSJWjUqJG0vLCwEEuXLsW8efPQs2dPREZGYvny5di7dy9++OEHAMCWLVtw7NgxfPzxxwgPD0d8fDzefPNN6HQ6lJaWWisSERHVMTZZREREt9FoNOjbty9iY2ONlmdlZaGsrMxoeZs2bRASEoKMjAwAQEZGBtq3b280fDAuLg56vR5Hjx6tmwBERGR1HC5IRET0l88//xwHDhzAvn37Kq3Lzc2Fs7MzvL29jZb7+/sjNzdX2ub2Bsuw3rCuKiUlJSgpKZFu8/phRET2j59kERERATh//jzGjh2LTz75BK6urnX2uLNnz5au16hWqxEcHFxnj01ERLWDn2T9RQghXWjT1PupzJ5X8H/7sEeG58xe67eEkrMDys7P7PJlt7XnMCsrC/n5+XjggQekZeXl5UhPT8fChQuxefNmlJaWoqCgwOjTrLy8PAQEBAAAAgICkJmZabTfvLw8aV1VkpOTodVqpdt6vZ6NFhGRnVNsk6XT6aDT6VBeXg7g1gnN5jZZfm5/fW9mLYWFhWbe07qEECgqKgKgvIuKKjk7oOz8zC5fdlsbFterVy8cPnzYaNmIESPQpk0bTJ48GcHBwWjQoAHS0tIwaNAgAMDJkydx7tw5REdHAwCio6Mxc+ZM5Ofnw8/PDwCwdetWeHl5oW3btlU+rouLC1xcXGoxGRER1TXFNlkajQYajQZ6vV4aouHl5WXyfoQQyL+Ov66TZR61Wm3mPa3L0JSq1WpFvtkElJkdUHZ+Zpcvu609f56enmjXrp3RsoYNG6Jx48bS8hdeeAFarRY+Pj7w8vLC6NGjER0dja5duwIAHn30UbRt2xbDhg3D3LlzkZubiylTpkCj0bCRIiJSEMU2WXdSqVRmH/BvDRg0/2LEtvZGwxSG582eM5hLydkBZedndnmy2+Pz995778HBwQGDBg0yuhixgaOjIzZu3IhRo0YhOjoaDRs2REJCAmbMmGHFqomIqK6xySIiIrqLnTt3Gt12dXWVhpvfTfPmzfHtt9/WcmVERGTLOLsgERERERGRjNhkERERERERyYhNFhERERERkYzYZBEREREREcmITRYREREREZGM2GQRERERERHJiE0WERERERGRjNhkERERERERyYhNFhERERERkYzsvskqKChAp06dEB4ejnbt2mHJkiXWLomIiIiIiBTMydoFWMrT0xPp6elwd3dHcXEx2rVrh4EDB6Jx48bWLo2IiIiIiBTI7j/JcnR0hLu7OwCgpKQEQggIIaxcFRERERERKZXVm6z09HT069cPgYGBUKlU2LBhQ6VtdDodQkND4erqii5duiAzM9NofUFBATp27IhmzZph4sSJ8PX1raPqiYiIiIiIjFm9ySouLkbHjh2h0+mqXL969WpotVpMmzYNBw4cQMeOHREXF4f8/HxpG29vb/z000/IycnBp59+iry8vLoqn4iIiIiIyIjVz8mKj49HfHz8XdfPmzcPI0eOxIgRIwAAixcvxqZNm7Bs2TIkJSUZbevv74+OHTti9+7deOqpp6rcX0lJCUpKSqTber0eAMweZiiEgAoCKpPvabwPe2R4zuy1fksoOTug7PzMLl92JT6HRESkDFZvsu6ltLQUWVlZSE5OlpY5ODggNjYWGRkZAIC8vDy4u7vD09MThYWFSE9Px6hRo+66z9mzZ2P69OmVlhcWFprdZPm5/fW9yff+32PbIyEEioqKAAAqlSVtpv1RcnZA2fmZXb7shj9yERER1Tc23WRdvnwZ5eXl8Pf3N1ru7++PEydOAADOnj2Ll156Sfrr6ujRo9G+ffu77jM5ORlarVa6rdfrERwcDLVaDS8vL5NrFEIg/zpwodj8JkutVpt5T+syNKVqtVqRbzYBZWYHlJ2f2eXLrrTnj4iIlMOmm6yaiIqKQnZ2do23d3FxgYuLS+0VREREREREimbTTZavry8cHR0rTWSRl5eHgIAAi/at0+mg0+lQXl4OgMMFzcFhU8rMDig7P7NzuCAREVF1bLrJcnZ2RmRkJNLS0jBgwAAAQEVFBdLS0pCYmGjRvjUaDTQaDfR6PdRqNYcLmoHDppSZHVB2fmbncEEiIqLqWL3JKioqwunTp6XbOTk5yM7Oho+PD0JCQqDVapGQkIBOnTohKioKKSkpKC4ulmYbJCIiIiIisiVWb7L279+PRx55RLptmJQiISEBK1aswODBg3Hp0iVMnToVubm5CA8PR2pqaqXJMEzF4YKW47ApZWYHlJ2f2TlckIiIqDomNVnHjx/H559/jt27d+Ps2bO4du0amjRpgoiICMTFxWHQoEEmTyrRo0ePapubxMREi4cH3onDBS3HYVPKzA4oOz+zc7ggERFRdRxqstGBAwcQGxuLiIgI7NmzB126dMG4cePw5ptvYujQoRBC4LXXXkNgYCD+/e9/G13sl4iIiIiISElq9EnWoEGDMHHiRHz55Zfw9va+63YZGRmYP38+3n33Xbz66qty1VgrOFzQchw2pczsgLLzMzuHCxIREVWnRk3WqVOn0KBBg2q3i46ORnR0NMrKyiwurLZxuKDlOGxKmdkBZedndg4XJCIiqk6Nmqy7NVg3btyAq6trjbe3ZSqVyuwDvoAK4q9/zX1se2V43uw5g7mUnB1Qdn5mlye7Ep8/oroQmrTJovufmdNXpkqIlMvk2QUrKiowc+ZMLF68GHl5eTh16hRatmyJ119/HaGhoXjhhRdqo85aJ4Qwe7igyuz26n/7sEeG58xe67eEkrMDys7P7PJlV+JzSEREymByk/XWW29h5cqVmDt3LkaOHCktb9euHVJSUuymyeI5WZbjuSnKzA4oOz+z85wsIiKi6pjcZK1atQofffQRevXqhZdfflla3rFjR5w4cULW4moTz8myHM9NUWZ2QNn5mZ3nZBEREVXH5CbrwoULCAsLq7S8oqLCLia8uBuek2UenpuizOyAsvMzO8/JIqrPLD2ni4hqeJ2s27Vt2xa7d++utPzLL79ERESELEURERERERHZK5M/yZo6dSoSEhJw4cIFVFRUYN26dTh58iRWrVqFjRs31kaNdYITX5iOEwAoMzug7PzMzokviIiIqmNyk9W/f3988803mDFjBho2bIipU6figQcewDfffIPevXvXRo21ghNfWI4TACgzO6Ds/MzOiS+IiIiqY3KTBQAPPfQQtm7dKnctdYoTX1iOEwAoMzug7PzMzokviIiIqmNWk1UfceIL83ACAGVmB5Sdn9k58QUREdG91KjJatSoUY0PhleuXLGoICIiIiIiIntWoyYrJSWllssgIiIiIiKqH2rUZCUkJNR2HVbH2QVNx1nWlJkdUHZ+ZufsgkRERNWx6JysGzduoLS01GiZOZNHWANnF7QcZ1lTZnZA2fmZnbMLEhERVcfkJqu4uBiTJ0/GF198gT/++KPSekPTYus4u6DlOMuaMrMDys7P7JxdkIiIqDomN1mTJk3Cjh07sGjRIgwbNgw6nQ4XLlzAhx9+iDlz5tRGjXWCswuah7OsKTM7oOz8zM7ZBYmIiO7F5Cbrm2++wapVq9CjRw+MGDECDz30EMLCwtC8eXN88sknGDJkSG3USUREREREZBccTL3DlStX0LJlSwC3zr8yTNnerVs3pKeny1sdERFRHVm0aBE6dOgALy8veHl5ITo6Gt999520/saNG9BoNGjcuDE8PDwwaNAg5OXlGe3j3Llz6Nu3L9zd3eHn54eJEyfi5s2bdR2FiIiszOQmq2XLlsjJyQEAtGnTBl988QWAW59weXt7y1ocERFRXWnWrBnmzJmDrKws7N+/Hz179kT//v1x9OhRAMD48ePxzTffYM2aNdi1axd+//13DBw4ULp/eXk5+vbti9LSUuzduxcrV67EihUrMHXqVGtFIiIiKzG5yRoxYgR++uknAEBSUhJ0Oh1cXV0xfvx4TJw4UfYCiYiI6kK/fv3Qp08ftGrVCn//+98xc+ZMeHh44IcffkBhYSGWLl2KefPmoWfPnoiMjMTy5cuxd+9e/PDDDwCALVu24NixY/j4448RHh6O+Ph4vPnmm9DpdJVm4iUiovrN5HOyxo8fL30fGxuLEydOICsrC2FhYejQoYOsxdUlXifLdLxekDKzA8rOz+zKuE5WeXk51qxZg+LiYkRHRyMrKwtlZWWIjY2VtmnTpg1CQkKQkZGBrl27IiMjA+3bt4e/v7+0TVxcHEaNGoWjR48iIiLCGlGIiMgKLLpOFgA0b94czZs3l6OWOsXrZFmO1wtSZnZA2fmZvX5fJ+vw4cOIjo7GjRs34OHhgfXr16Nt27bIzs6Gs7NzpWHx/v7+yM3NBQDk5uYaNViG9YZ1d1NSUoKSkhLpti0+L0REZBqTm6wxY8YgLCwMY8aMMVq+cOFCnD59GikpKXLVVqt4nSzL8XpByswOKDs/s9fv62S1bt0a2dnZKCwsxJdffomEhATs2rWrVh9z9uzZmD59eq0+BhER1S2Tm6y1a9fi66+/rrT8wQcfxJw5c+ymyboTr5NlHl4vSJnZAWXnZ/b6e50sZ2dnhIWFAQAiIyOxb98+zJ8/H4MHD0ZpaSkKCgqMPs3Ky8tDQEAAACAgIACZmZlG+zPMPmjYpirJycnQarXSbb1ej+DgYLkiERGRFZg88cUff/xR5ScvXl5euHz5sixFERER2YKKigqUlJQgMjISDRo0QFpamrTu5MmTOHfuHKKjowEA0dHROHz4MPLz86Vttm7dCi8vL7Rt2/auj+Hi4iJNG2/4IiIi+2byJ1lhYWFITU1FYmKi0fLvvvtOun4WERGRvUlOTkZ8fDxCQkLw559/4tNPP8XOnTuxefNmqNVqvPDCC9BqtfDx8YGXlxdGjx6N6OhodO3aFQDw6KOPom3bthg2bBjmzp2L3NxcTJkyBRqNBi4uLlZOR0REdcnkJkur1SIxMRGXLl1Cz549AQBpaWl499137XaoIBERUX5+PoYPH46LFy9CrVajQ4cO2Lx5M3r37g0AeO+99+Dg4IBBgwahpKQEcXFx+OCDD6T7Ozo6YuPGjRg1ahSio6PRsGFDJCQkYMaMGdaKREREVmJyk/X888+jpKQEM2fOxJtvvgkACA0NxaJFizB8+HDZCyQiIqoLS5cuved6V1dXaWbau2nevDm+/fZbuUsjIiI7Y9YU7qNGjcKoUaNw6dIluLm5wcPDQ+66iIiIiIiI7JLJE19cv34d165dAwA0adIEf/zxB1JSUrBlyxbZiyMiIiIiIrI3JjdZ/fv3x6pVqwAABQUFiIqKwrvvvov+/ftj0aJFshdIRERERERkT0weLnjgwAG89957AIAvv/wSAQEBOHjwINauXYupU6di1KhRshdZF4QQ0oU2Tb2fyuwrZP1vH/bI8JzZa/2WUHJ2QNn5mV2+7Ep8DomISBlMbrKuXbsGT09PAMCWLVswcOBAODg4oGvXrjh79qzsBdYWw8nL5eXlAIDCwkKzmyw/t7++N7OWwsJCM+9pXUIIFBUVAbDNi4rWJiVnB5Sdn9nly67X6y3eBxERkS0y6zpZGzZswJNPPonNmzdj/PjxAG5NfWtPF1DUaDTQaDTQ6/VQq9VQq9Vm1S+EQP514EKx+U1WVRd3tgeGplStVivyzSagzOyAsvMzu3zZlfb8ERGRcpjcZE2dOhXPPfccxo8fj169eklXut+yZQsiIiJkL7CuqFQqsw/4twYMwuxBg/b8RsPwvNlzBnMpOTug7PzMLk92uZ6/1NRUeHh4oFu3bgBujVRYsmQJ2rZtC51Oh0aNGsnyOERERDVl8sQXTz31FM6dO4f9+/cjNTVVWt6rVy/pXC0iIqK6MnHiRGno4eHDhzFhwgT06dMHOTk50Gq1Vq6OiIiUyKzrZAUEBCAgIMBoWVRUlCwFERERmSInJwdt27YFAKxduxaPP/44Zs2ahQMHDqBPnz5Wro6IiJTIrCaLiIjIVjg7O0vXb9y2bRuGDx8OAPDx8eHkGmSXQpM2WbsEIrIQmywiIrJrMTEx0Gq1iImJQWZmJlavXg0AOHXqFJo1a2bl6oiISIlMPieLiIjIluh0OjRo0ABffvklFi1ahKCgIADAd999h8cee8zK1RERkRLxkywiIrJbN2/exM6dO7FkyZJK5wpzMiYiIrIWk5usr7/+usrlKpUKrq6uCAsLQ4sWLSwujIiIqDpOTk54+eWXcfz4cWuXQkREJDG5yRowYABUKpV0UUoDwzKVSoVu3bphw4YNvDYJERHVuqioKBw8eBDNmze3dilEREQAzDgna+vWrejcuTO2bt2KwsJCFBYWYuvWrejSpQs2btyI9PR0/PHHH/jXv/5VG/USEREZeeWVVzBhwgQsXLgQGRkZOHTokNEXERFRXTP5k6yxY8fio48+woMPPigt69WrF1xdXfHSSy/h6NGjSElJwfPPPy9roXdz/vx5DBs2DPn5+XBycsLrr7+Of/zjH3Xy2EREZH3PPPMMAGDMmDHSsttHV5SXl1urNCIiUiiTm6xffvkFXl5elZZ7eXnh119/BQC0atUKly9ftry6GnByckJKSgrCw8ORm5uLyMhI9OnTBw0bNqyTxyciIuvKycmxdglERERGTG6yIiMjMXHiRKxatQpNmjQBAFy6dAmTJk1C586dAQA///wzgoOD5a30Lpo2bYqmTZsCAAICAuDr64srV66wySIiUgiei0VERLbG5HOyli5dipycHDRr1gxhYWEICwtDs2bNcObMGfznP/8BABQVFWHKlCk12l96ejr69euHwMBAqFQqbNiwodI2Op0OoaGhcHV1RZcuXZCZmVnlvrKyslBeXl5nDR4REdmG//73v4iJiUFgYCDOnj0LAEhJScFXX31l5cqIiEiJTP4kq3Xr1jh27Bi2bNmCU6dOSct69+4NB4dbPduAAQNqvL/i4mJ07NgRzz//PAYOHFhp/erVq6HVarF48WJ06dIFKSkpiIuLw8mTJ+Hn5ydtd+XKFQwfPhxLliwxNRIREdmxRYsWYerUqRg3bhxmzpwpnYPl7e2NlJQU9O/f38oVEpEpQpM2WXT/M3P6ylQJkfnMuhixg4MDHnvsMTz22GMWFxAfH4/4+Pi7rp83bx5GjhyJESNGAAAWL16MTZs2YdmyZUhKSgIAlJSUYMCAAUhKSjKakKMqJSUlKCkpkW7r9XoAgBCi0rT0NSGEgAoCKpPvabwPe2R4zuy1fksoOTug7PzMLl92ufazYMECLFmyBAMGDMCcOXOk5Z06deJMt0REZBVmNVm7du3CO++8I138sW3btpg4cSIeeughWYsrLS1FVlYWkpOTpWUODg6IjY1FRkYGgFsH6X/+85/o2bMnhg0bVu0+Z8+ejenTp1daXlhYaHaT5ef21/cm3/t/j22PhBAoKioCcGsmLyVRcnZA2fmZXb7shj9yWSonJwcRERGVlru4uKC4uFiWxyAiIjKFyU3Wxx9/jBEjRmDgwIHSdLl79uxBr169sGLFCjz33HOyFXf58mWUl5fD39/faLm/vz9OnDgBAPj++++xevVqdOjQQTqf67///S/at29f5T6Tk5Oh1Wql23q9HsHBwVCr1VXOmlgdIQTyrwMXis1vstRqtZn3tC5DU6pWqxX5ZhNQZnZA2fmZXb7scj1/LVq0QHZ2dqUJMFJTU3HffffJ8hhERESmMLnJmjlzJubOnYvx48dLy8aMGYN58+bhzTfflLXJqolu3bqhoqKixtu7uLjAxcWlFisiIqK6pNVqodFocOPGDQghkJmZic8++wyzZ8+WJmQiIiKqSyY3Wb/++iv69etXafkTTzyBV199VZaiDHx9feHo6Ii8vDyj5Xl5eQgICLBo3zqdDjqdTjpBmsMFTcdhU8rMDig7P7Pb3nDBF198EW5ubpgyZQquXbuG5557DoGBgZg/f750oWIiIqK6ZHKTFRwcjLS0NISFhRkt37Ztm+xTpzs7OyMyMhJpaWnSjIUVFRVIS0tDYmKiRfvWaDTQaDTQ6/VQq9UcLmgGDptSZnZA2fmZ3faGCwLAkCFDMGTIEFy7dg1FRUVGs88SERHVNZObrAkTJmDMmDHIzs6WZvL7/vvvsWLFCsyfP9/kAoqKinD69Gnpdk5ODrKzs+Hj44OQkBBotVokJCSgU6dOiIqKQkpKCoqLi6XZBomISNl69uyJdevWwdvbG+7u7nB3dwdw65OyAQMGYPv27VaukIiIlMbkJmvUqFEICAjAu+++iy+++AIAcN9992H16tVmXYtk//79eOSRR6TbhkkpEhISsGLFCgwePBiXLl3C1KlTkZubi/DwcKSmplaaDMNUHC5oOQ6bUmZ2QNn5md32hgvu3LkTpaWllZbfuHEDu3fvluUxiIiITGHWFO5PPvkknnzySVkK6NGjR7XNTWJiosXDA+/E4YKW47ApZWYHlJ2f2W1nuOChQ4ek748dO4bc3Fzpdnl5OVJTUxEUFGTRYxAREZnDrCarPlKpVGYf8G9djhhmX5LYnt+oGZ43e85gLiVnB5Sdn9nlyW7pPsLDw6VaevbsWWm9m5sbFixYYNFjEBERmaNGTVajRo1qfDC8cuWKRQVZixDC7OGCKrPbq//twx4ZnjN7rd8SSs4OKDs/s8uX3dL95OTkQAiBli1bIjMzE02aNJHWOTs7w8/PD46OjpaWSUREZLIaNVkpKSm1XEbd4zlZluO5KcrMDig7P7PbzjlZhosPm3KtRCIiorpQoyYrISGhtuuoczwny3I8N0WZ2QFl52d22zkny2DlypXw9fVF3759AQCTJk3CRx99hLZt2+Kzzz6TmjEiIqK6UqMmq7i4GA0bNqzxTk3d3hbwnCzz8NwUZWYHlJ2f2W3jnCyDWbNmYdGiRQCAjIwMLFy4ECkpKdi4cSPGjx+PdevWyfI4RERENVWjJissLAxjx45FQkICmjZtWuU2Qghs27YN8+bNQ/fu3ZGcnCxrobWN52SZjuemKDM7oOz8zG4752QZnD9/HmFhYQCADRs24KmnnsJLL72EmJgY9OjRQ5bHICIiMkWNmqydO3fi1VdfxRtvvIGOHTuiU6dOCAwMhKurK65evYpjx44hIyMDTk5OSE5Oxv/93//Vdt0W4zlZluO5KcrMDig7P7PbzjlZBh4eHvjjjz8QEhKCLVu2SNdbdHV1xfXr12V5DCIiIlPUqMlq3bo11q5di3PnzmHNmjXYvXs39u7di+vXr8PX1xcRERFYsmQJ4uPj7WYmJ56TZTmem6LM7ICy8zO77Z2T1bt3b7z44ouIiIjAqVOn0KdPHwDA0aNHERoaKstjEBERmcKk62SFhIRgwoQJmDBhQm3VYzU8J8s8PDdFmdkBZedndts6J0un02HKlCk4f/481q5di8aNGwMAsrKy8Oyzz8ryGERERKbgxYiJiMiueXt7Y+HChZWWT58+3QrVEBERscmScOIL03ECAGVmB5Sdn9ltb+KL9PT0e67v3r27LI9DVFOhSZusXQIRWZlimyxbmvjiobcs+2W8cXQ3i+5vLk4AoMzsgLLzM7vtTXxR1QyCt9dn+D1PRERUVxTbZNnSxBeWstbEGZwAQJnZAWXnZ3bbm/ji6tWrRrfLyspw8OBBvP7665g5c6Ysj0FERGQKB2sXYCtuP5nb1C/DgEFrfVlSO7/4xS9+WfNLDoY/lBm+fH190bt3b/z73//GpEmTaryf2bNno3PnzvD09ISfnx8GDBiAkydPGm1z48YNaDQaNG7cGB4eHhg0aBDy8vKMtjl37hz69u0Ld3d3+Pn5YeLEibh586YsWYmIyD6Y3GSlpqZiz5490m2dTofw8HA899xzlf6aSEREZC3+/v6VmqR72bVrFzQaDX744Qds3boVZWVlePTRR1FcXCxtM378eHzzzTdYs2YNdu3ahd9//x0DBw6U1peXl6Nv374oLS3F3r17sXLlSqxYsQJTp06VNRsREdk2k4cLTpw4Ef/+978BAIcPH8aECROg1WqxY8cOaLVaLF++XPYiiYiI7ubQoUNGt4UQuHjxIubMmYPw8PAa7yc1NdXo9ooVK+Dn54esrCx0794dhYWFWLp0KT799FP07NkTALB8+XLcd999+OGHH9C1a1ds2bIFx44dw7Zt2+Dv74/w8HC8+eabmDx5Mt544w04OztbnJeIiGyfyU1WTk4O2rZtCwBYu3YtHn/8ccyaNQsHDhyQLgBpj6w5u6ClrDXLGWdZU2Z2QNn5md32ZhcMDw+HSqWqtL+uXbti2bJlZu+3sLAQAODj4wPg1nW3ysrKEBsbK23Tpk0bhISEICMjA127dkVGRgbat28Pf39/aZu4uDiMGjUKR48eRUREhNn1EBGR/TC5yXJ2dsa1a9cAANu2bcPw4cMB3DoIyTVTVF2wpdkFLWV4I1DXOMuaMrMDys7P7LY3u2BOTo7RbQcHBzRp0gSurq5m77OiogLjxo1DTEwM2rVrBwDIzc2Fs7MzvL29jbb19/dHbm6utM3tDZZhvWFdVUpKSlBSUiLdtqdjKRERVc3kJismJgZarRYxMTHIzMzE6tWrAQCnTp1Cs2bNZC+wtnB2QctxljVlZgeUnZ/ZbW92webNm8uyn9tpNBocOXLE6Bzk2jJ79mxeOJmIqJ4xucnS6XTQaDT48ssvsWjRIgQFBQEAvvvuOzz22GOyF1hXLJnp6taAQVht0KA13+jJPUuYPVFydkDZ+ZldnuyW7OP999+v8bZjxowxad+JiYnYuHEj0tPTjf54GBAQgNLSUhQUFBh9mpWXl4eAgABpm8zMTKP9GWYfNGxzp+TkZGi1Wum2Xq9HcHCwSTUTEZFtManJunnzJnbu3IklS5ZUOli89957shZGRER0NzU95qhUqho3WUIIjB49GuvXr8fOnTvRokULo/WRkZFo0KAB0tLSMGjQIADAyZMnce7cOURHRwMAoqOjMXPmTOTn58PPzw8AsHXrVnh5eUnnM9/JxcUFLi4uNaqRiKoXmrTJovufmdNXpkpIyUxqspycnPDyyy/j+PHjtVUPERFRte48D0sOGo0Gn376Kb766it4enpK51Cp1Wq4ublBrVbjhRdegFarhY+PD7y8vDB69GhER0eja9euAIBHH30Ubdu2xbBhwzB37lzk5uZiypQp0Gg0bKSIiBTE5OtkRUVF4eDBg7VRCxERkUn0ej0qKioqLa+oqDB5AolFixahsLAQPXr0QNOmTaUvw7nHwK1P0B5//HEMGjQI3bt3R0BAANatWyetd3R0xMaNG+Ho6Ijo6GgMHToUw4cPx4wZM8wPSUREdsfkc7JeeeUVTJgwAb/99hsiIyPRsGFDo/UdOnSQrbi6xCnczXtcTmWtvOyAsvMzu+1M4b5+/XpMnjwZ2dnZcHd3N1p3/fp1dO7cGe+88w769esnWz2urq7S7LR307x5c3z77bc1ekwiIqqfTG6ynnnmGQDGJxIbrk+iUqmkKdFtHadwtxynslZmdkDZ+ZnddqZwX7RoESZNmlSpwQKAhg0bYvLkyVi4cGGNmywiIiK5mHUx4vqAU7hbjlNZKzM7oOz8zG47U7gfOXIEH3zwwV3Xd+/eHVOmTLHoMYiIiMxhcpNVG9cjsQX2PIV7i2TLhqVYMosOp7JWZnZA2fmZ3fpTuAPA1atXcfPmzbuuLysrw9WrVy16DCIiInOYPPEFAPz3v/9FTEwMAgMDcfbsWQBASkoKvvrqK1mLIyIiupvQ0FDs37//ruv3799fb/8wSEREts3kJmvRokXQarXo06cPCgoKpHOavL29kZKSInd9REREVRo4cCBee+016WK/tzNMnW64nhUREVFdMrnJWrBgAZYsWYLXXnsNjo6O0vJOnTrh8OHDshZHRER0N0lJSfD09ESrVq3wyiuvYP78+Zg/fz5GjRqFv//97/Dw8EBSUpK1yyQiIgUya+KLiIiISstdXFxQXFwsS1FERETV8fT0xPfff4/k5GSsXr1aOv/K29sbQ4cOxcyZM+Hp6WnlKomISIlMbrJatGiB7OzsSuPcU1NTcd9998lWGBERUXXUajU++OAD6HQ6XL58GUIINGnSRJGTkhARke0wucnSarXQaDS4ceMGhBDIzMzEZ599htmzZ+M///lPbdRIRER0TyqVCk2aNLF2GURERADMaLJefPFFuLm5YcqUKbh27Rqee+45BAYGYv78+dKFiomIiIiIiJTK5CYLAIYMGYIhQ4bg2rVrKCoqgp+fn9x11TkhhHShTVPvp7LaFbLkYU5uw/3Mfd7snZKzA8rOz+zyZVfic0hERMpgcpPVs2dPrFu3Dt7e3nB3d4e7uzsAQK/XY8CAAdi+fbvsRdYGnU4HnU4nTUFfWFhodpPl5/bX93IWWIcKCwvNup8QAkVFRQAsv6iovVFydkDZ+Zldvux6vd7ifRAREdkik5usnTt3orS0tNLyGzduYPfu3bIUVRc0Gg00Gg30ej3UajXUajW8vLxM3o8QAvnXgQvF9ttkqdVqs+5naErVarUi32wCyswOKDs/s8uXXWnPHxERKUeNm6xDhw5J3x87dgy5ubnS7fLycqSmpiIoKEje6uqQSqUy+4B/a8Ag7HbQoCVvdAzPmxLfLCk5O6Ds/MwuT3Y5n7/ExETMmDEDPj4+su2TiIjIXDVussLDw6UDa8+ePSutd3Nzw4IFC2QtjupGaNIms+6ngkBQQ2D3lL4yV0REVL3ffvsNzZo1AwB8+umnmDRpEnx8fNC+fXt8++23CA4OtnKFRESkVDVusnJyciCEQMuWLZGZmWk0Va6zszP8/Pzg6OhYK0USERHdqU2bNmjcuDFiYmJw48YNnD9/HiEhIThz5gzKysqsXR4RESlYjZssw8WHKyoqaq0YIiKimiooKMCBAwewe/durFu3Dn369IG/vz9KSkqwefNmDBw4EP7+/tYuk4iIFMjB1DusXLkSmzb9b3jZpEmT4O3tjQcffBBnz56VtTgiIqK7KSsrQ1RUFCZMmAA3NzccPHgQy5cvh6OjI5YtW4YWLVqgdevW1i6TiIgUyOQma9asWXBzuzVneUZGBhYuXIi5c+fC19cX48ePl71AIiKiqnh7e6NLly7QarUoLS3F9evXERMTAycnJ6xevRpXr17F0qVLrV0mEREpkMlTuJ8/fx5hYWEAgA0bNuCpp57CSy+9hJiYGPTo0UPu+oiIiKp04cIFZGRkYO/evbh58yYiIyPRuXNnlJaW4sCBA2jWrBm6detm7TKJiEiBTG6yPDw88McffyAkJARbtmyBVqsFALi6uuL69euyF0hERFQVX19f9OvXD/369cPixYuRnp6O48ePY/jw4fjXv/6FYcOGISoqCrt27bJ2qWRnzJ11l4jIwOQmq3fv3njxxRcRERGBU6dOoU+fPgCAo0ePIjQ0VO76iIiIakStVuPpp5/GCy+8gO3bt8Pd3Z0NFhERWYXJ52TpdDpER0fj0qVLWLt2LRo3bgwAyMrKwrPPPit7gURERNU5dOiQdM2s5s2bo0GDBggICMDgwYOtXBkRESmRyZ9keXt7Y+HChZWWT58+XZaCiIiITHX7hYePHDlixUqIyN5ZOlz0zJy+MlVC9szkJis9Pf2e67t37252MeZ68sknsXPnTvTq1QtffvllnT8+ERERERGRgclNVlUzCKpUKun78vJyiwoyx9ixY/H8889j5cqVdf7YREREREREtzP5nKyrV68afeXn5yM1NRWdO3fGli1baqPGavXo0QOenp5WeWwiIiIiIqLbmdxkqdVqoy9fX1/07t0b//73vzFp0iSTC0hPT0e/fv0QGBgIlUqFDRs2VNpGp9MhNDQUrq6u6NKlCzIzM01+HCIiIiIiorpgcpN1N/7+/jh58qTJ9ysuLkbHjh2h0+mqXL969WpotVpMmzYNBw4cQMeOHREXF4f8/HxLSyYiIiIiIpKdyedkHTp0yOi2EAIXL17EnDlzEB4ebnIB8fHxiI+Pv+v6efPmYeTIkRgxYgQAYPHixdi0aROWLVuGpKQkkx+vpKQEJSUl0m29Xg/gVg4hhMn7E0JABQFV9ZvWO4bc5jxv9s7w86LE7ICy8zO7fNmV+BwSEZEymNxkhYeHQ6VSVTo4du3aFcuWLZOtMAAoLS1FVlYWkpOTpWUODg6IjY1FRkaGWfucPXt2ldPNFxYWmt1k+bn99b1ZFdkvFQA/t1vP3e2TnyiBEAJFRUUAoLjsgLLzM7t82Q1/5CIiIqpvTG6ycnJyjG47ODigSZMmcHV1la0og8uXL6O8vBz+/v5Gy/39/XHixAnpdmxsLH766ScUFxejWbNmWLNmDaKjo6vcZ3JyMrRarXRbr9cjODgYarUaXl5eJtcohED+deBCsTKbLODWeXpKfLMJKDM7oOz8zC5fdqU9f0REpBwmN1nNmzevjTossm3bthpv6+LiAhcXl1qshoiIiIiIlKxGTdb7779f4x2OGTPG7GLu5OvrC0dHR+Tl5Rktz8vLQ0BAgEX71ul00Ol00nW9OFzQdBwuqMwhY4Cy8zM7hwsSERFVp0ZN1nvvvVejnalUKlmbLGdnZ0RGRiItLQ0DBgwAAFRUVCAtLQ2JiYkW7Vuj0UCj0UCv10vT0XO4oGk4XFCZ2QFl52d2DhckIiKqTo2arDvPw5JTUVERTp8+bfRY2dnZ8PHxQUhICLRaLRISEtCpUydERUUhJSUFxcXF0myDREREREREtsSkc7L0ej08PDzg4GB8ea2KigoUFRWZ9UnQ/v378cgjj0i3DZNSJCQkYMWKFRg8eDAuXbqEqVOnIjc3F+Hh4UhNTa00GYapOFzQchwuqMwhY4Cy8zM7hwsSERFVp8ZN1vr16zF58mRkZ2fD3d3daN3169fRuXNnvPPOO+jXr59JBfTo0aPa5iYxMdHi4YF34nBBy3G4oDKzA8rOz+wcLkhERFQdh+o3uWXRokWYNGlSpQYLABo2bIjJkydj4cKFshZHRERERERkb2r8SdaRI0fwwQcf3HV99+7dMWXKFFmKqgscLmg5DhdU5pAxQNn5mZ3DBYmIiKpT4ybr6tWruHnz5l3Xl5WV4erVq7IUVRc4XNByHC6ozOyAsvMzO4cLEhERVafGTVZoaCj279+PNm3aVLl+//79Nnmh4ppSqVRmH/AFVBB//as0ApY9d/bMkFuJ2QFl52d2ebIr8fkjIiJlqHGTNXDgQLz22mvo3bt3pZn9cnNzMWXKFAwdOlT2AuuKEMLs4YIqRbZXkHKb87zZO8PPixKzA8rOz+zyZVfic0hERMpQ4yYrKSkJX331FVq1aoWhQ4eidevWAIATJ07gk08+QXBwMJKSkmqtULnxnCzLGc7JenjmJovazI2ju8lXVB1R8nk5gLLzM3v9PicrPT0db7/9NrKysnDx4kWsX78eAwYMkNYLITBt2jQsWbIEBQUFiImJwaJFi9CqVStpmytXrmD06NH45ptv4ODggEGDBmH+/Pnw8PCwQiIiIrKGGjdZnp6e+P7775GcnIzVq1dL5195e3tj6NChmDlzJjw9PWutULnxnCzLGd5iWZpdrVbLUU6dUvJ5OYCy8zN7/T4nq7i4GB07dsTzzz+PgQMHVlo/d+5cvP/++1i5ciVatGiB119/HXFxcTh27BhcXV0BAEOGDMHFixexdetWlJWVYcSIEXjppZfw6aef1nUcxQpN2mTtEohI4Uy6GLFarcYHH3wAnU6Hy5cvQwiBJk2a2OSB0lQ8J8s8QvoyP7u9/vwo+bwcQNn5mb3+npMVHx+P+Pj4KtcJIZCSkoIpU6agf//+AIBVq1bB398fGzZswDPPPIPjx48jNTUV+/btQ6dOnQAACxYsQJ8+ffDOO+8gMDCwzrIQEZH11Pg6WbdTqVRo0qQJ/Pz8bPIgSUREJLecnBzk5uYiNjZWWqZWq9GlSxdkZGQAADIyMuDt7S01WAAQGxsLBwcH/Pjjj3VeMxERWYdJn2TVZ5z4wnSG3JZmt8eT35U8+QGg7PzMrtyJL3JzcwGg0uRP/v7+0rrc3Fz4+fkZrXdycoKPj4+0zZ1KSkpQUlIi3bbFc9WIiMg0im2yOPGF5QwTXwCWZX/oLcvGzltj4gwlT34AKDs/s9fviS+sYfbs2Zg+fbq1yyAiIhkptsnixBeWk2viC0tZY+IMJU9+ACg7P7PX74kv7iUgIAAAkJeXh6ZNm0rL8/LyEB4eLm2Tn59vdL+bN2/iypUr0v3vlJycDK1WK93W6/UIDg6WuXoiIqpLim2y7sSJL8wjx8QXlrLWGzUlT34AKDs/s9ffiS/upUWLFggICEBaWprUVOn1evz4448YNWoUACA6OhoFBQXIyspCZGQkAGD79u2oqKhAly5dqtyvi4sLXFxc6iQDERHVDbMmvkhMTMSVK1fkroWIiMiqioqKkJ2djezsbAC3JrvIzs7GuXPnoFKpMG7cOLz11lv4+uuvcfjwYQwfPhyBgYHStbTuu+8+PPbYYxg5ciQyMzPx/fffIzExEc888wxnFiQiUpAaN1m//fab9P2nn34qjctv3749zp8/L39lREREdWz//v2IiIhAREQEAECr1SIiIgJTp04FAEyaNAmjR4/GSy+9hM6dO6OoqAipqanSNbIA4JNPPkGbNm3Qq1cv9OnTB926dcNHH31klTxERGQdNR4u2KZNGzRu3BgxMTG4ceMGzp8/j5CQEJw5cwZlZWW1WWOd4OyCppNrdkFLWWOGMiXPMAcoOz+z1+/ZBXv06HHPulQqFWbMmIEZM2bcdRsfHx9eeJiISOFq3GQVFBTgwIED2L17N9atW4c+ffrA398fJSUl2Lx5MwYOHFhpWltbxtkFLSfX7IKWKiwsrPPHVPIMc4Cy8zM7ZxckIiKqjkrUsLO4fv063NxuvaNu1KgRsrKycPHiRcTGxqJdu3Y4evQogoODcfLkyVotWG6G2QULCgrMnl3w4Zmb/pphT1lvuFQQCGoIq2f/dXbfOn9MIQQKCwsVOcMcoOz8zC5fdr1eD29vbxQWFpr1+7e+MhyX+LyYLzTJskuDEFnizJy6f19C8pHrd3CNP8ny9vZGeHg4YmJiUFpaiuvXryMmJgZOTk5YvXo1goKCsG/fPrMLsTbOLmgezi6ozBnmAGXnZ3Zlzi5IRERUUzVusi5cuICMjAzs3bsXN2/eRGRkJDp37ozS0lIcOHAAzZo1Q7dudX9RWCIiIiIiW2HpJ6n8JKx+qPHsgr6+vujXrx9mz54Nd3d37Nu3D6NHj4ZKpcK//vUvqNVqPPzww7VZKxERERERkc0z6zpZAKBWq/H000+jQYMG2L59O3JycvDKK6/IWRsREREREZHdqfFwwdsdOnQIQUFBAIDmzZujQYMGCAgIwODBg2UtjoiIiIiIyN6Y1WQFBwdL3x85ckS2YqyJ18kyHa+TpcxrJQHKzs/s9fs6WURERHIwq8mqD3idLMvZynWyHnrLshNMN442fcIWJV8rCVB2fmbndbKIiIiqo9gmS6PRQKPRSHPhq9Vqs6+TlX/dcK0oZTG8xbL37Gq12uT7GBpyJV4rCVB2fmaXL7vSnj8iIlIOxTZZd+J1ssxjC9fJspS5/+9KvlYSoOz8zM7rZBEREd2L2bMLEhERERERUWVssoiIiIiIiGTEJouIiIiIiEhGbLKIiIiIiIhkxIkviIiIiIhsRGiSZZemAYAzc/rKUAlZgp9kERERERERyYhNFhERERERkYw4XPAvQgjpQpum3k9l11eJMp8ht71nN/f/3dyfmfpAyfmZXb7sSnwOiYhIGRTbZOl0Ouh0OpSXlwMACgsLzX6z7ef21/dyFmgHVEC9yF5YWGjyfYQQKCoqAqDMC6oqOT+zy5ddr9dbvA8iIiJbpNgmS6PRQKPRQK/XQ61WQ61Ww8vLy+T9CCGQfx24UGzfjYY5DG+x7D27Wq02+T6GhlytVivujTag7PzMLl92pT1/VHNynPhPRGRNim2y7qRSqcw+4N8aMAhFDhoU0pf9Zjf3/93wM6PUN4pKzs/s8mRX4vNHRETKwIkviIiIiIiIZMQmi4iIiIiISEZssoiIiIiIiGTEJouIiIiIiEhGbLKIiIiIiIhkxCaLiIiIiIhIRmyyiIiIiIiIZMQmi4iIiIiISEZssoiIiIiIiGRUL5qsjRs3onXr1mjVqhX+85//WLscIiIiIiJSMCdrF2CpmzdvQqvVYseOHVCr1YiMjMSTTz6Jxo0bW7s0IiIiIqI6F5q0yaL7n5nTV6ZKlMvuP8nKzMzE/fffj6CgIHh4eCA+Ph5btmyxdllERERERKRQVv8kKz09HW+//TaysrJw8eJFrF+/HgMGDDDaRqfT4e2330Zubi46duyIBQsWICoqCgDw+++/IygoSNo2KCgIFy5cqMsIREREdBtL/4pORGTvrP5JVnFxMTp27AidTlfl+tWrV0Or1WLatGk4cOAAOnbsiLi4OOTn59dxpURERERERNWz+idZ8fHxiI+Pv+v6efPmYeTIkRgxYgQAYPHixdi0aROWLVuGpKQkBAYGGn1ydeHCBelTrqqUlJSgpKREuq3X6wEAQggIIUyuXwgBFQRUJt/T/hly23t2c//fzf2ZqQ+UnJ/Z5cuuxOeQiIiUwepN1r2UlpYiKysLycnJ0jIHBwfExsYiIyMDABAVFYUjR47gwoULUKvV+O677/D666/fdZ+zZ8/G9OnTKy0vLCw0+822n9tf35t8b/umAupF9ofeMn1Yiwq3/t/zr8PuW+yNo7uZfB8hBIqKigAAKpV95zdVfcv++II9Nd62qp97c35+DAx/5CIiIqpvbLrJunz5MsrLy+Hv72+03N/fHydOnAAAODk54d1338UjjzyCiooKTJo06Z4zCyYnJ0Or1Uq39Xo9goODoVar4eXlZXKNQgjkXwcuFNt3o2EOw9tLZrdvarXa5PsY/iChVqvrRaNhivqW/UJxzbet6ufenJ8faX/14Pmrr3hOFRGRZWy6yaqpJ554Ak888USNtnVxcYGLi0stV0REREREREpl002Wr68vHB0dkZeXZ7Q8Ly8PAQEBFu1bp9NBp9OhvLwcAIcLmqO+DBc0R33KXlhYaPJ96tuQOVPUt+xBDWu+bVU/9+b8/BhwuCAREdVXNt1kOTs7IzIyEmlpadK07hUVFUhLS0NiYqJF+9ZoNNBoNNDr9VCr1RwuaIb6NGTOVPUpO4cLmqa+ZedwQSIiupO1hwzXh4shW73JKioqwunTp6XbOTk5yM7Oho+PD0JCQqDVapGQkIBOnTohKioKKSkpKC4ulmYbJCIiIiIisiVWb7L279+PRx55RLptmJQiISEBK1aswODBg3Hp0iVMnToVubm5CA8PR2pqaqXJMEzF4YKWq09D5kxVn7JzuKBp6lt2DhckIiKSn9WbrB49elTb3CQmJlo8PPBOHC5oufo0ZM5U9Sk7hwuapr5l53DB2qPT6fD2228jNzcXHTt2xIIFC+55HUciIrrF0uGKtjDc0OpNlq1QqVRmH/BvXY7Y/q+XZA4hfTG7vTL3597wmqnvb5SrUp+ym/rze+fPvSXPQX14/u5m9erV0Gq1WLx4Mbp06YKUlBTExcXh5MmT8PPzs3Z5RERUy9hk/UUIYfZwQZXdv802jyE3s9s3c3/uzX3N2Lv6ll1lwmexVf3cW/I81JfnsCrz5s3DyJEjpfOHFy9ejE2bNmHZsmVISkqycnVERFTbFNtkGc7JunnzJgDgt99+g6enp8n7EUKgkeoabjra/ycaplJBoJEKzG7n2c+fP2/yfYQQKC4uhl6vr9efRlSlvmX3d7xW422r+rk35+fH4M8//wRQ/5qt0tJSZGVlITk5WVrm4OCA2NhYZGRkVNq+pKQEJSUl0m3DeW6WnLPWbtpms+9LRGTvLPn9abivpccmlahvRzcT/fbbbwgODrZ2GUREinX+/Hk0a9bM2mXI5vfff0dQUBD27t2L6OhoafmkSZOwa9cu/Pjjj0bbv/HGG5g+fXpdl0lERPdg6bFJsZ9kGQQGBuL8+fPw9PQ066/Ser0ewcHBOH/+vFkTZ9gzZldmdkDZ+ZldvuxCCPz5558IDAyUoTr7lZycLM2sC9y6HuSVK1fQuHFjm/m0tL793NenPPUpC8A8tqw+ZQHunkeuY5PimywHBwdZ/oLq5eVVL37gzMHsyswOKDs/s8uT3ZLZCW2Vr68vHB0dkZeXZ7Q8Ly8PAQEBlbZ3cXGBi4uL0TJvb+/aLNFs9e3nvj7lqU9ZAOaxZfUpC1B1HjmOTQ4W74GIiIgkzs7OiIyMRFpamrSsoqICaWlpRsMHiYio/lL8J1lERERy02q1SEhIQKdOnRAVFYWUlBQUFxdLsw0SEVH9xibLQi4uLpg2bVqloR5KwOzKzA4oOz+zKzO7qQYPHoxLly5h6tSpyM3NRXh4OFJTU+Hv72/t0sxS3/7v61Oe+pQFYB5bVp+yALWfR/GzCxIREREREcmJ52QRERERERHJiE0WERERERGRjNhkERERERERyYhNFhERERERkYzYZFlAp9MhNDQUrq6u6NKlCzIzM61dkklmz56Nzp07w9PTE35+fhgwYABOnjxptM2NGzeg0WjQuHFjeHh4YNCgQZUusHnu3Dn07dsX7u7u8PPzw8SJE3Hz5k2jbXbu3IkHHngALi4uCAsLw4oVK2o7nknmzJkDlUqFcePGScvqe/YLFy5g6NChaNy4Mdzc3NC+fXvs379fWi+EwNSpU9G0aVO4ubkhNjYWP//8s9E+rly5giFDhsDLywve3t544YUXUFRUZLTNoUOH8NBDD8HV1RXBwcGYO3duneS7m/Lycrz++uto0aIF3Nzc8Le//Q1vvvkmbp8DqD5lT09PR79+/RAYGAiVSoUNGzYYra/LrGvWrEGbNm3g6uqK9u3b49tvv5U9L5kvNDQUKpWq0pdGowFQs9+JtkSu17qt+PPPPzFu3Dg0b94cbm5uePDBB7Fv3z5pvS1nqavfQ3Wlujzr1q3Do48+isaNG0OlUiE7O7vSPmzp9XSvPGVlZZg8eTLat2+Phg0bIjAwEMOHD8fvv/9utA9b+f+p7v/mjTfeQJs2bdCwYUM0atQIsbGx+PHHH422kS2LILN8/vnnwtnZWSxbtkwcPXpUjBw5Unh7e4u8vDxrl1ZjcXFxYvny5eLIkSMiOztb9OnTR4SEhIiioiJpm5dfflkEBweLtLQ0sX//ftG1a1fx4IMPSutv3rwp2rVrJ2JjY8XBgwfFt99+K3x9fUVycrK0za+//irc3d2FVqsVx44dEwsWLBCOjo4iNTW1TvPeTWZmpggNDRUdOnQQY8eOlZbX5+xXrlwRzZs3F//85z/Fjz/+KH799VexefNmcfr0aWmbOXPmCLVaLTZs2CB++ukn8cQTT4gWLVqI69evS9s89thjomPHjuKHH34Qu3fvFmFhYeLZZ5+V1hcWFgp/f38xZMgQceTIEfHZZ58JNzc38eGHH9Zp3tvNnDlTNG7cWGzcuFHk5OSINWvWCA8PDzF//nxpm/qU/dtvvxWvvfaaWLdunQAg1q9fb7S+rrJ+//33wtHRUcydO1ccO3ZMTJkyRTRo0EAcPny41p8Dqpn8/Hxx8eJF6Wvr1q0CgNixY4cQovrfibZGrte6rXj66adF27Ztxa5du8TPP/8spk2bJry8vMRvv/0mhLDtLHXxe6guVZdn1apVYvr06WLJkiUCgDh48GClfdjS6+leeQoKCkRsbKxYvXq1OHHihMjIyBBRUVEiMjLSaB+28v9T3f/NJ598IrZu3Sp++eUXceTIEfHCCy8ILy8vkZ+fL20jVxY2WWaKiooSGo1Gul1eXi4CAwPF7NmzrViVZfLz8wUAsWvXLiHErRdWgwYNxJo1a6Rtjh8/LgCIjIwMIcStH2YHBweRm5srbbNo0SLh5eUlSkpKhBBCTJo0Sdx///1GjzV48GARFxdX25Gq9eeff4pWrVqJrVu3iocfflhqsup79smTJ4tu3brddX1FRYUICAgQb7/9trSsoKBAuLi4iM8++0wIIcSxY8cEALFv3z5pm++++06oVCpx4cIFIYQQH3zwgWjUqJH0fBgeu3Xr1nJHqrG+ffuK559/3mjZwIEDxZAhQ4QQ9Tv7nQecusz69NNPi759+xrV06VLF/F///d/smYk+YwdO1b87W9/ExUVFTX6nWhr5Hit24pr164JR0dHsXHjRqPlDzzwgHjttdfsKktt/R6ylqreyBvk5ORU2WTZ8uvpXnkMMjMzBQBx9uxZIYTt/v/UJEthYaEAILZt2yaEkDcLhwuaobS0FFlZWYiNjZWWOTg4IDY2FhkZGVaszDKFhYUAAB8fHwBAVlYWysrKjHK2adMGISEhUs6MjAy0b9/e6AKbcXFx0Ov1OHr0qLTN7fswbGMLz5VGo0Hfvn0r1Vffs3/99dfo1KkT/vGPf8DPzw8RERFYsmSJtD4nJwe5ublGtavVanTp0sUov7e3Nzp16iRtExsbCwcHB+mj94yMDHTv3h3Ozs7SNnFxcTh58iSuXr1a2zGr9OCDDyItLQ2nTp0CAPz000/Ys2cP4uPjAdTv7Heqy6y2+lqgqpWWluLjjz/G888/D5VKVaPfibZGjte6rbh58ybKy8vh6upqtNzNzQ179uyxqyx3kuv3kD2xx9fT7QoLC6FSqeDt7Q3Afv9/SktL8dFHH0GtVqNjx44A5M3iJGu1CnH58mWUl5cbvbkGAH9/f5w4ccJKVVmmoqIC48aNQ0xMDNq1awcAyM3NhbOzs/QiMvD390dubq60TVXPg2HdvbbR6/W4fv063NzcaiNStT7//HMcOHDAaEy7QX3P/uuvv2LRokXQarV49dVXsW/fPowZMwbOzs5ISEiQ6q+q9tuz+fn5Ga13cnKCj4+P0TYtWrSotA/DukaNGtVKvntJSkqCXq9HmzZt4OjoiPLycsycORNDhgyR6rq9ToP6kP1OdZn1bq8Fwz7ItmzYsAEFBQX45z//CaBmvxNtjRyvdVvh6emJ6OhovPnmm7jvvvvg7++Pzz77DBkZGQgLC7OrLHeS6/eQPbHH15PBjRs3MHnyZDz77LPw8vICYH//Pxs3bsQzzzyDa9euoWnTpti6dSt8fX0ByJuFTRYBuPWJzpEjR7Bnzx5rl1Inzp8/j7Fjx2Lr1q2V/jKoBBUVFejUqRNmzZoFAIiIiMCRI0ewePFiJCQkWLm62vXFF1/gk08+waeffor7778f2dnZGDduHAIDA+t9dqKaWrp0KeLj4xEYGGjtUsxW317r//3vf/H8888jKCgIjo6OeOCBB/Dss88iKyvL2qWRQpSVleHpp5+GEAKLFi2ydjlme+SRR5CdnY3Lly9jyZIlePrpp/Hjjz9Waq4sxeGCZvD19YWjo2OlWWDy8vIQEBBgparMl5iYiI0bN2LHjh1o1qyZtDwgIAClpaUoKCgw2v72nAEBAVU+D4Z199rGy8vLap/kZGVlIT8/Hw888ACcnJzg5OSEXbt24f3334eTkxP8/f3rbXYAaNq0Kdq2bWu07L777sO5c+cA/K/+e/2MBwQEID8/32j9zZs3ceXKFZOeo7o2ceJEJCUl4ZlnnkH79u0xbNgwjB8/HrNnzzaqqz5mv1NdZr3bNrbyXND/nD17Ftu2bcOLL74oLavJ8cDWyPFatyV/+9vfsGvXLhQVFeH8+fPIzMxEWVkZWrZsaXdZbifX7yF7Yo+vJ0ODdfbsWWzdulX6FAuwv/+fhg0bIiwsDF27dsXSpUvh5OSEpUuXApA3C5ssMzg7OyMyMhJpaWnSsoqKCqSlpSE6OtqKlZlGCIHExESsX78e27dvrzTcJzIyEg0aNDDKefLkSZw7d07KGR0djcOHDxv9QBpefIY38dHR0Ub7MGxjzeeqV69eOHz4MLKzs6WvTp06YciQIdL39TU7AMTExFSarv/UqVNo3rw5AKBFixYICAgwql2v1+PHH380yl9QUGD0V9Tt27ejoqICXbp0kbZJT09HWVmZtM3WrVvRunVrqw2Xu3btGhwcjH/1OTo6oqKiAkD9zn6nusxqq68Fqmz58uXw8/ND3759pWU1OR7YGjle67aoYcOGaNq0Ka5evYrNmzejf//+dpsFkO/3kD2xt9eTocH6+eefsW3bNjRu3Nhovb3//1RUVKCkpASAzFlMnKiD/vL5558LFxcXsWLFCnHs2DHx0ksvCW9vb6OZ5mzdqFGjhFqtFjt37jSatvfatWvSNi+//LIICQkR27dvF/v37xfR0dEiOjpaWm+YxvzRRx8V2dnZIjU1VTRp0qTKacwnTpwojh8/LnQ6nU1MY36n22cXFKJ+Z8/MzBROTk5i5syZ4ueffxaffPKJcHd3Fx9//LG0zZw5c4S3t7f46quvxKFDh0T//v2rnFI3IiJC/Pjjj2LPnj2iVatWRtOcFhQUCH9/fzFs2DBx5MgR8fnnnwt3d3erTuGekJAggoKCpGmd161bJ3x9fcWkSZOkbepT9j///FMcPHhQHDx4UAAQ8+bNEwcPHpRmhaqrrN9//71wcnIS77zzjjh+/LiYNm0ap3C3QeXl5SIkJERMnjy50rrqfifaGrle67YiNTVVfPfdd+LXX38VW7ZsER07dhRdunQRpaWlQgjbzlIXv4dsKc8ff/whDh48KDZt2iQAiM8//1wcPHhQXLx4UdqHLb2e7pWntLRUPPHEE6JZs2YiOzvb6P3i7TPK2sr/z72yFBUVieTkZJGRkSHOnDkj9u/fL0aMGCFcXFzEkSNHZM/CJssCCxYsECEhIcLZ2VlERUWJH374wdolmQRAlV/Lly+Xtrl+/bp45ZVXRKNGjYS7u7t48sknjX5JCCHEmTNnRHx8vHBzcxO+vr5iwoQJoqyszGibHTt2iPDwcOHs7Cxatmxp9Bi24s4mq75n/+abb0S7du2Ei4uLaNOmjfjoo4+M1ldUVIjXX39d+Pv7CxcXF9GrVy9x8uRJo23++OMP8eyzzwoPDw/h5eUlRowYIf7880+jbX766SfRrVs34eLiIoKCgsScOXNqPdu96PV6MXbsWBESEiJcXV1Fy5YtxWuvvWZ0sKhP2Xfs2FHl6zwhIUEIUbdZv/jiC/H3v/9dODs7i/vvv19s2rSp1nKTeTZv3iwAVPoZEKJmvxNtiVyvdVuxevVq0bJlS+Hs7CwCAgKERqMRBQUF0npbzlJXv4fqSnV5li9fXuX6adOmSfuwpdfTvfIYpqGv6stwDT0hbOf/515Zrl+/Lp588kkRGBgonJ2dRdOmTcUTTzwhMjMzjfYhVxaVELdd+pyIiIiIiIgswnOyiIiIiIiIZMQmi4iIiIiISEZssoiIiIiIiGTEJouIiIiIiEhGbLKIiIiIiIhkxCaLiIiIiIhIRmyyiIiIiIiIZMQmi0gmKpUKGzZssHYZslmxYgW8vb2tXQYREZmJxyUi62GTRVQDubm5GD16NFq2bAkXFxcEBwejX79+SEtLq5XH27lzJ1QqFQoKCmpl/wCwa9cu9OzZEz4+PnB3d0erVq2QkJCA0tJSAMDgwYNx6tSpWnt8IiIyH49LRLaNTRZRNc6cOYPIyEhs374db7/9Ng4fPozU1FQ88sgj0Gg01i7vnoQQuHnzZqXlx44dw2OPPYZOnTohPT0dhw8fxoIFC+Ds7Izy8nIAgJubG/z8/Oq6ZCIiqgaPS0R2QBDRPcXHx4ugoCBRVFRUad3Vq1el7wGI9evXCyGE2LFjhwBgtP7gwYMCgMjJyRFCCHHmzBnx+OOPC29vb+Hu7i7atm0rNm3aJHJycgQAo6+EhAQhhBDl5eVi1qxZIjQ0VLi6uooOHTqINWvWSI9heNxvv/1WPPDAA6JBgwZix44dlep+7733RGho6D1zL1++XKjVaul28+bNK9V1+6+Qc+fOiX/84x9CrVaLRo0aiSeeeELKSkRE8uFx6RYel8iWOdVVM0dkj65cuYLU1FTMnDkTDRs2rLTekrHhGo0GpaWlSE9PR8OGDXHs2DF4eHggODgYa9euxaBBg3Dy5El4eXnBzc0NADB79mx8/PHHWLx4MVq1aoX09HQMHToUTZo0wcMPPyztOykpCe+88w5atmyJRo0aVXrsgIAAXLx4Eenp6ejevXuN6t23b5/018Ty8nI89dRTaNCgAQCgrKwMcXFxiI6Oxu7du+Hk5IS33noLjz32GA4dOgRnZ2eznyciIvofHpf+h8clsmVssoju4fTp0xBCoE2bNrLv+9y5cxg0aBDat28PAGjZsqW0zsfHBwDg5+cnHTBLSkowa9YsbNu2DdHR0dJ99uzZgw8//NDoYDZjxgz07t37ro/9j3/8A5s3b8bDDz+MgIAAdO3aFb169cLw4cPh5eVV5X2aNGkifT927FhcvHgR+/btAwCsXr0aFRUV+M9//gOVSgUAWL58Oby9vbFz5048+uijpj49RERUBR6X/ofHJbJlPCeL6B6EELW27zFjxuCtt95CTEwMpk2bhkOHDt1z+9OnT+PatWvo3bs3PDw8pK9Vq1bhl19+Mdq2U6dO99yXo6Mjli9fjt9++w1z585FUFAQZs2ahfvvvx8XL168530/+ugjLF26FF9//bV0gPvpp59w+vRpeHp6SnX5+Pjgxo0blWojIiLz8bhUGY9LZIvYZBHdQ6tWraBSqXDixAmT7ufgcOuldfvBsKyszGibF198Eb/++iuGDRuGw4cPo1OnTliwYMFd91lUVAQA2LRpE7Kzs6WvY8eO4csvvzTatqohJFUJCgrCsGHDsHDhQhw9ehQ3btzA4sWL77r9jh07MHr0aKxatQodOnQwqi0yMtKoruzsbJw6dQrPPfdcjWohIqLq8bhkjMclslVssojuwcfHB3FxcdDpdCguLq60/m5T2Rr+knb7X9+ys7MrbRccHIyXX34Z69atw4QJE7BkyRIAkMaKG8aaA0Dbtm3h4uKCc+fOISwszOgrODjY3IiSRo0aoWnTplXmBG79xfKpp57Cq6++ioEDBxqte+CBB/Dzzz/Dz8+vUm1qtdri2oiI6BYel/6HxyWyZWyyiKqh0+lQXl6OqKgorF27Fj///DOOHz+O999/XxqDfifDAeaNN97Azz//jE2bNuHdd9812mbcuHHYvHkzcnJycODAAezYsQP33XcfAKB58+ZQqVTYuHEjLl26hKKiInh6euJf//oXxo8fj5UrV+KXX37BgQMHsGDBAqxcudKkTB9++CFGjRqFLVu24JdffsHRo0cxefJkHD16FP369au0/fXr19GvXz9ERETgpZdeQm5urvQFAEOGDIGvry/69++P3bt3IycnBzt37sSYMWPw22+/mVQbERHdG49LPC6RHbDm1IZE9uL3338XGo1GNG/eXDg7O4ugoCDxxBNPGE1Di9umyhVCiD179oj27dsLV1dX8dBDD4k1a9YYTZWbmJgo/va3vwkXFxfRpEkTMWzYMHH58mXp/jNmzBABAQFCpVJJU+VWVFSIlJQU0bp1a9GgQQPRpEkTERcXJ3bt2iWEqHqK3qocOHBADB06VLRo0UK4uLiIxo0bi+7du4uvv/5a2ub2qXKrmr4Xd0yVe/HiRTF8+HDh6+srXFxcRMuWLcXIkSNFYWGh6U84ERHdE49LPC6RbVMJUYtnUBIRERERESkMhwsSERERERHJiE0WERERERGRjNhkERERERERyYhNFhERERERkYzYZBEREREREcmITRYREREREZGM2GQRERERERHJiE0WERERERGRjNhkERERERERyYhNFhERERERkYzYZBEREREREcmITRYREREREZGM/h81z0xg7MbVUQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "fig, ax = plt.subplots(1, 2, figsize=(10, 3))\n", "\n", diff --git a/docs/examples/3_access_system_files.ipynb b/docs/examples/3_access_system_files.ipynb index 9c3451a6..4d25d393 100644 --- a/docs/examples/3_access_system_files.ipynb +++ b/docs/examples/3_access_system_files.ipynb @@ -43,8 +43,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "2024-09-25 21:58:17,520 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", - "2024-09-25 21:58:17,521 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n" + "2024-11-27 10:18:44,563 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-11-27 10:18:44,563 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n" ] }, { @@ -78,11 +78,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "2024-09-25 21:58:18,231 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.57s\n", - "2024-09-25 21:58:18,317 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.08s\n", - "2024-09-25 21:58:18,317 | plinder.core.index.utils:148 | INFO : loading entries from 1 zips\n", - "2024-09-25 21:58:18,323 | plinder.core.index.utils:163 | INFO : loaded 1 entries\n", - "2024-09-25 21:58:18,324 | plinder.core.index.utils.load_entries:24 | INFO : runtime succeeded: 0.77s\n" + "2024-11-27 10:18:44,693 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-11-27 10:18:44,693 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-11-27 10:18:44,694 | plinder.core.index.utils:148 | INFO : loading entries from 1 zips\n", + "2024-11-27 10:18:44,700 | plinder.core.index.utils:163 | INFO : loaded 1 entries\n", + "2024-11-27 10:18:44,700 | plinder.core.index.utils.load_entries:24 | INFO : runtime succeeded: 0.11s\n" ] }, { @@ -210,8 +210,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "2024-09-25 21:58:20,579 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 2.01s\n", - "2024-09-25 21:58:20,962 | plinder.core.scores.links.query_links:24 | INFO : runtime succeeded: 2.54s\n" + "2024-11-27 10:18:45,149 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.17s\n", + "2024-11-27 10:18:45,546 | plinder.core.scores.links.query_links:24 | INFO : runtime succeeded: 0.72s\n" ] } ], diff --git a/docs/examples/4_align_mask_crop.ipynb b/docs/examples/4_align_mask_crop.ipynb index 973dbef1..d9864940 100644 --- a/docs/examples/4_align_mask_crop.ipynb +++ b/docs/examples/4_align_mask_crop.ipynb @@ -29,20 +29,20 @@ }, { "cell_type": "code", - "execution_count": 120, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "2024-10-22 12:10:50,756 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", - "2024-10-22 12:10:50,757 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", - "2024-10-22 12:10:50,900 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", - "2024-10-22 12:10:50,902 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", - "2024-10-22 12:10:50,904 | plinder.core.index.utils:148 | INFO : loading entries from 1 zips\n", - "2024-10-22 12:10:50,923 | plinder.core.index.utils:163 | INFO : loaded 1 entries\n", - "2024-10-22 12:10:50,924 | plinder.core.index.utils.load_entries:24 | INFO : runtime succeeded: 0.16s\n" + "2024-11-27 10:09:04,553 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-11-27 10:09:04,553 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-11-27 10:09:04,701 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-11-27 10:09:04,701 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-11-27 10:09:04,702 | plinder.core.index.utils:148 | INFO : loading entries from 1 zips\n", + "2024-11-27 10:09:04,708 | plinder.core.index.utils:163 | INFO : loaded 1 entries\n", + "2024-11-27 10:09:04,708 | plinder.core.index.utils.load_entries:24 | INFO : runtime succeeded: 0.15s\n" ] } ], @@ -80,7 +80,7 @@ }, { "cell_type": "code", - "execution_count": 121, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -97,7 +97,7 @@ " 'structure_type': FieldInfo(annotation=str, required=False, default='holo')}" ] }, - "execution_count": 121, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -135,7 +135,7 @@ }, { "cell_type": "code", - "execution_count": 122, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -146,10 +146,10 @@ "input_ligand_conformers_atom_array\n", "input_ligand_conformers_coords\n", "input_ligand_templates\n", - "ligand_atom_array\n", "ligand_chain_ordered\n", "ligand_template2resolved_atom_order_stacks\n", "resolved_ligand_mols\n", + "resolved_ligand_mols_atom_array\n", "resolved_ligand_mols_coords\n" ] } @@ -178,17 +178,17 @@ }, { "cell_type": "code", - "execution_count": 123, + "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ - "" + "" ] }, - "execution_count": 123, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -199,17 +199,17 @@ }, { "cell_type": "code", - "execution_count": 124, + "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ - "" + "" ] }, - "execution_count": 124, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -220,17 +220,17 @@ }, { "cell_type": "code", - "execution_count": 125, + "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ - "" + "" ] }, - "execution_count": 125, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -251,7 +251,7 @@ }, { "cell_type": "code", - "execution_count": 126, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -261,7 +261,7 @@ " array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]]))" ] }, - "execution_count": 126, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -278,7 +278,7 @@ }, { "cell_type": "code", - "execution_count": 127, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -298,7 +298,7 @@ " [-0.8344732 , -2.66267578, -1.31015471]]])" ] }, - "execution_count": 127, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -311,7 +311,7 @@ }, { "cell_type": "code", - "execution_count": 128, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -331,7 +331,7 @@ " [-0.8344732 , -2.66267578, -1.31015471]]])" ] }, - "execution_count": 128, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -344,7 +344,7 @@ }, { "cell_type": "code", - "execution_count": 129, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -364,7 +364,7 @@ " [50.853, 27.716, 61.696]]])" ] }, - "execution_count": 129, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -384,28 +384,28 @@ }, { "cell_type": "code", - "execution_count": 130, + "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([[Atom(np.array([-0.4126, -1.4725, 0.1919], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"C\", charge=0),\n", - " Atom(np.array([ 1.05 , -1.3134, 0.3454], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"C\", charge=0),\n", - " Atom(np.array([ 1.5092, -0.0695, 1.0169], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"C\", charge=0),\n", - " Atom(np.array([0.4414, 1.0266, 1.031 ], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"C\", charge=0),\n", - " Atom(np.array([-0.3494, 0.7527, -0.2551], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"C\", charge=0),\n", - " Atom(np.array([-1.0648, 1.953 , -0.753 ], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"C\", charge=0),\n", - " Atom(np.array([ 1.7111, -1.4778, -0.8939], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"O\", charge=0),\n", - " Atom(np.array([ 2.0093, -0.261 , 2.2966], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"O\", charge=0),\n", - " Atom(np.array([-0.3988, 0.7285, 2.1042], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"O\", charge=0),\n", - " Atom(np.array([-1.1389, -0.3329, 0.0236], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"O\", charge=0),\n", - " Atom(np.array([-2.1478, -1.8461, -2.4874], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"C\", charge=0),\n", - " Atom(np.array([-0.8345, -2.6627, -1.3102], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"SE\", charge=0)]],\n", + "array([[Atom(np.array([-0.4126, -1.4725, 0.1919], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"C\"),\n", + " Atom(np.array([ 1.05 , -1.3134, 0.3454], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"C\"),\n", + " Atom(np.array([ 1.5092, -0.0695, 1.0169], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"C\"),\n", + " Atom(np.array([0.4414, 1.0266, 1.031 ], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"C\"),\n", + " Atom(np.array([-0.3494, 0.7527, -0.2551], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"C\"),\n", + " Atom(np.array([-1.0648, 1.953 , -0.753 ], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"C\"),\n", + " Atom(np.array([ 1.7111, -1.4778, -0.8939], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"O\"),\n", + " Atom(np.array([ 2.0093, -0.261 , 2.2966], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"O\"),\n", + " Atom(np.array([-0.3988, 0.7285, 2.1042], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"O\"),\n", + " Atom(np.array([-1.1389, -0.3329, 0.0236], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"O\"),\n", + " Atom(np.array([-2.1478, -1.8461, -2.4874], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"C\"),\n", + " Atom(np.array([-0.8345, -2.6627, -1.3102], dtype=float32), chain_id=\"\", res_id=0, ins_code=\"\", res_name=\"\", hetero=False, atom_name=\"\", element=\"SE\")]],\n", " dtype=object)" ] }, - "execution_count": 130, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -436,30 +436,30 @@ }, { "cell_type": "code", - "execution_count": 131, + "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "2024-10-22 12:11:01,533 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", - "2024-10-22 12:11:01,535 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", - "2024-10-22 12:11:01,648 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", - "2024-10-22 12:11:01,649 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", - "2024-10-22 12:11:01,650 | plinder.core.index.utils:148 | INFO : loading entries from 1 zips\n", - "2024-10-22 12:11:01,658 | plinder.core.index.utils:163 | INFO : loaded 1 entries\n", - "2024-10-22 12:11:01,660 | plinder.core.index.utils.load_entries:24 | INFO : runtime succeeded: 0.12s\n" + "2024-11-27 10:09:10,130 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 4.57s\n", + "2024-11-27 10:09:10,284 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.15s\n", + "2024-11-27 10:09:13,717 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.58s\n", + "2024-11-27 10:09:13,820 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.10s\n", + "2024-11-27 10:09:13,821 | plinder.core.index.utils:148 | INFO : loading entries from 1 zips\n", + "2024-11-27 10:09:13,824 | plinder.core.index.utils:163 | INFO : loaded 1 entries\n", + "2024-11-27 10:09:13,825 | plinder.core.index.utils.load_entries:24 | INFO : runtime succeeded: 0.83s\n" ] }, { "data": { "image/png": "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", "text/plain": [ - "" + "" ] }, - "execution_count": 131, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -475,17 +475,17 @@ }, { "cell_type": "code", - "execution_count": 132, + "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ - "" + "" ] }, - "execution_count": 132, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -498,7 +498,7 @@ }, { "cell_type": "code", - "execution_count": 133, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -514,7 +514,7 @@ " 16, 17, 18]]))" ] }, - "execution_count": 133, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -534,30 +534,30 @@ }, { "cell_type": "code", - "execution_count": 134, + "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "2024-10-22 12:11:02,795 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", - "2024-10-22 12:11:02,796 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", - "2024-10-22 12:11:02,927 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", - "2024-10-22 12:11:02,931 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", - "2024-10-22 12:11:02,933 | plinder.core.index.utils:148 | INFO : loading entries from 1 zips\n", - "2024-10-22 12:11:02,942 | plinder.core.index.utils:163 | INFO : loaded 1 entries\n", - "2024-10-22 12:11:02,945 | plinder.core.index.utils.load_entries:24 | INFO : runtime succeeded: 0.14s\n" + "2024-11-27 10:09:21,587 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 7.48s\n", + "2024-11-27 10:09:21,681 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.09s\n", + "2024-11-27 10:09:26,625 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.62s\n", + "2024-11-27 10:09:26,718 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.09s\n", + "2024-11-27 10:09:26,719 | plinder.core.index.utils:148 | INFO : loading entries from 1 zips\n", + "2024-11-27 10:09:26,721 | plinder.core.index.utils:163 | INFO : loaded 1 entries\n", + "2024-11-27 10:09:26,721 | plinder.core.index.utils.load_entries:24 | INFO : runtime succeeded: 0.81s\n" ] }, { "data": { "image/png": "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", "text/plain": [ - "" + "" ] }, - "execution_count": 134, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -573,17 +573,17 @@ }, { "cell_type": "code", - "execution_count": 135, + "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ - "" + "" ] }, - "execution_count": 135, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -596,7 +596,7 @@ }, { "cell_type": "code", - "execution_count": 136, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -616,7 +616,7 @@ " 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]]))" ] }, - "execution_count": 136, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -669,16 +669,16 @@ }, { "cell_type": "code", - "execution_count": 137, + "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(2443,)" + "()" ] }, - "execution_count": 137, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -689,7 +689,7 @@ }, { "cell_type": "code", - "execution_count": 138, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -1011,27 +1011,27 @@ " [ True, True, True]])" ] }, - "execution_count": 138, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "system_structure.protein_coords[0][system_structure.protein_calpha_mask] == system_structure.protein_calpha_coords[0]" + "system_structure.protein_coords[0][list(system_structure.protein_calpha_mask.values())[0]] == system_structure.protein_calpha_coords[0]" ] }, { "cell_type": "code", - "execution_count": 159, + "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(2, 2)" + "(1, 1)" ] }, - "execution_count": 159, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -1042,7 +1042,7 @@ }, { "cell_type": "code", - "execution_count": 141, + "execution_count": 26, "metadata": {}, "outputs": [ { @@ -1053,15 +1053,9 @@ "protein_calpha_coords\n", "protein_calpha_mask\n", "protein_chain_ordered\n", - "protein_chains\n", "protein_coords\n", "protein_n_atoms\n", - "protein_sequence_from_structure\n", - "protein_structure_b_factor\n", - "protein_structure_tokenized_sequence\n", - "protein_unique_atom_names\n", - "protein_unique_residue_ids\n", - "protein_unique_residue_names\n" + "protein_sequence_from_structure\n" ] } ], @@ -1080,7 +1074,7 @@ }, { "cell_type": "code", - "execution_count": 142, + "execution_count": 31, "metadata": {}, "outputs": [ { @@ -1098,34 +1092,348 @@ " \"Total number of atoms:\",\n", " len(system_structure.protein_atom_array),\n", ")\n", - "print(\"Number of backbone atoms:\", system_structure.protein_backbone_mask.sum())\n", + "print(\"Number of backbone atoms:\", sum([b for ch in list(system_structure.protein_backbone_mask.values()) for b in ch]))\n", "print(\n", " \"Number of calpha atoms:\",\n", - " system_structure.protein_calpha_mask.sum(),\n", - ")" + " sum([b for ch in list(system_structure.protein_calpha_mask.values()) for b in ch]))" ] }, { "cell_type": "code", - "execution_count": 143, + "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(314, 3)" + "array([\n", + "\tAtom(np.array([48.178, 50.968, 57.827], dtype=float32), chain_id=\"1.C\", res_id=2, ins_code=\"\", res_name=\"SER\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([49.525, 49.561, 54.51 ], dtype=float32), chain_id=\"1.C\", res_id=3, ins_code=\"\", res_name=\"THR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([48.243, 50.024, 50.922], dtype=float32), chain_id=\"1.C\", res_id=4, ins_code=\"\", res_name=\"PRO\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([47.043, 46.432, 50.946], dtype=float32), chain_id=\"1.C\", res_id=5, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([45.205, 46.746, 54.3 ], dtype=float32), chain_id=\"1.C\", res_id=6, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([43.543, 49.915, 52.959], dtype=float32), chain_id=\"1.C\", res_id=7, ins_code=\"\", res_name=\"GLN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([41.978, 47.864, 50.152], dtype=float32), chain_id=\"1.C\", res_id=8, ins_code=\"\", res_name=\"GLN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([40.046, 45.702, 52.669], dtype=float32), chain_id=\"1.C\", res_id=9, ins_code=\"\", res_name=\"VAL\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([36.526, 47.068, 53.377], dtype=float32), chain_id=\"1.C\", res_id=10, ins_code=\"\", res_name=\"LEU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([36.091, 48.088, 57.045], dtype=float32), chain_id=\"1.C\", res_id=11, ins_code=\"\", res_name=\"PHE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([33.373, 45.769, 58.383], dtype=float32), chain_id=\"1.C\", res_id=12, ins_code=\"\", res_name=\"ARG\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([33.73 , 43.546, 55.354], dtype=float32), chain_id=\"1.C\", res_id=13, ins_code=\"\", res_name=\"THR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([31.793, 40.336, 55.226], dtype=float32), chain_id=\"1.C\", res_id=14, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([34.125, 37.419, 55.863], dtype=float32), chain_id=\"1.C\", res_id=15, ins_code=\"\", res_name=\"ILE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([33.962, 33.707, 54.991], dtype=float32), chain_id=\"1.C\", res_id=16, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([36.425, 30.858, 55.06 ], dtype=float32), chain_id=\"1.C\", res_id=17, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([36.731, 27.283, 53.803], dtype=float32), chain_id=\"1.C\", res_id=18, ins_code=\"\", res_name=\"VAL\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([39.349, 24.61 , 54.193], dtype=float32), chain_id=\"1.C\", res_id=19, ins_code=\"\", res_name=\"ASN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([40.656, 21.107, 53.682], dtype=float32), chain_id=\"1.C\", res_id=20, ins_code=\"\", res_name=\"SER\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([42.424, 20.471, 56.993], dtype=float32), chain_id=\"1.C\", res_id=21, ins_code=\"\", res_name=\"THR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([45.184, 23.078, 57.089], dtype=float32), chain_id=\"1.C\", res_id=22, ins_code=\"\", res_name=\"ASN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([44.75 , 24.251, 53.478], dtype=float32), chain_id=\"1.C\", res_id=23, ins_code=\"\", res_name=\"HIS\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([42.777, 27.484, 53.918], dtype=float32), chain_id=\"1.C\", res_id=24, ins_code=\"\", res_name=\"LEU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([40.904, 30.038, 51.9 ], dtype=float32), chain_id=\"1.C\", res_id=25, ins_code=\"\", res_name=\"ARG\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([39.457, 33.297, 53.215], dtype=float32), chain_id=\"1.C\", res_id=26, ins_code=\"\", res_name=\"VAL\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([36.989, 35.535, 51.309], dtype=float32), chain_id=\"1.C\", res_id=27, ins_code=\"\", res_name=\"TYR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([36.342, 39.203, 51.867], dtype=float32), chain_id=\"1.C\", res_id=28, ins_code=\"\", res_name=\"PHE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([35.17 , 42.352, 50.114], dtype=float32), chain_id=\"1.C\", res_id=29, ins_code=\"\", res_name=\"GLN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([37.459, 45.16 , 48.959], dtype=float32), chain_id=\"1.C\", res_id=30, ins_code=\"\", res_name=\"ASP\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([36.572, 48.83 , 49.116], dtype=float32), chain_id=\"1.C\", res_id=31, ins_code=\"\", res_name=\"VAL\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([35.426, 48.695, 45.451], dtype=float32), chain_id=\"1.C\", res_id=32, ins_code=\"\", res_name=\"TYR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([32.956, 45.848, 46.046], dtype=float32), chain_id=\"1.C\", res_id=33, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([35.027, 43.026, 44.582], dtype=float32), chain_id=\"1.C\", res_id=34, ins_code=\"\", res_name=\"SER\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([35.16 , 39.747, 46.429], dtype=float32), chain_id=\"1.C\", res_id=35, ins_code=\"\", res_name=\"ILE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([38.718, 38.497, 46.89 ], dtype=float32), chain_id=\"1.C\", res_id=36, ins_code=\"\", res_name=\"ARG\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([40.379, 35.292, 48.005], dtype=float32), chain_id=\"1.C\", res_id=37, ins_code=\"\", res_name=\"GLU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([43.34 , 34.949, 50.278], dtype=float32), chain_id=\"1.C\", res_id=38, ins_code=\"\", res_name=\"SER\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([45.001, 31.562, 50.691], dtype=float32), chain_id=\"1.C\", res_id=39, ins_code=\"\", res_name=\"LEU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([47.128, 29.485, 52.997], dtype=float32), chain_id=\"1.C\", res_id=40, ins_code=\"\", res_name=\"TYR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([49.109, 26.664, 51.464], dtype=float32), chain_id=\"1.C\", res_id=41, ins_code=\"\", res_name=\"GLU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([51.918, 26.3 , 53.961], dtype=float32), chain_id=\"1.C\", res_id=42, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([52.103, 30.121, 53.958], dtype=float32), chain_id=\"1.C\", res_id=43, ins_code=\"\", res_name=\"SER\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([49.823, 33.125, 53.341], dtype=float32), chain_id=\"1.C\", res_id=44, ins_code=\"\", res_name=\"TRP\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([49.35 , 34.608, 49.947], dtype=float32), chain_id=\"1.C\", res_id=45, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([47.019, 36.396, 47.513], dtype=float32), chain_id=\"1.C\", res_id=46, ins_code=\"\", res_name=\"ASN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([44.057, 38.629, 48.445], dtype=float32), chain_id=\"1.C\", res_id=47, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([45.209, 41.081, 45.722], dtype=float32), chain_id=\"1.C\", res_id=48, ins_code=\"\", res_name=\"THR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([43.528, 42.588, 42.651], dtype=float32), chain_id=\"1.C\", res_id=49, ins_code=\"\", res_name=\"GLU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([44.743, 39.413, 40.931], dtype=float32), chain_id=\"1.C\", res_id=50, ins_code=\"\", res_name=\"LYS\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([42.57 , 37.294, 43.258], dtype=float32), chain_id=\"1.C\", res_id=51, ins_code=\"\", res_name=\"ASN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([39.094, 38.716, 42.505], dtype=float32), chain_id=\"1.C\", res_id=52, ins_code=\"\", res_name=\"VAL\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([36.363, 36.056, 42.133], dtype=float32), chain_id=\"1.C\", res_id=53, ins_code=\"\", res_name=\"ILE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([33.433, 38.397, 41.363], dtype=float32), chain_id=\"1.C\", res_id=54, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([31.554, 41.496, 42.428], dtype=float32), chain_id=\"1.C\", res_id=55, ins_code=\"\", res_name=\"ASN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([28.787, 42.179, 44.911], dtype=float32), chain_id=\"1.C\", res_id=56, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([26.905, 45.113, 46.343], dtype=float32), chain_id=\"1.C\", res_id=57, ins_code=\"\", res_name=\"LYS\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([29.015, 47.207, 48.725], dtype=float32), chain_id=\"1.C\", res_id=58, ins_code=\"\", res_name=\"LEU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([28.613, 45.877, 52.229], dtype=float32), chain_id=\"1.C\", res_id=59, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([27.229, 42.54 , 51.045], dtype=float32), chain_id=\"1.C\", res_id=60, ins_code=\"\", res_name=\"SER\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([27.145, 39.534, 53.276], dtype=float32), chain_id=\"1.C\", res_id=61, ins_code=\"\", res_name=\"PRO\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([29.797, 37.007, 52.311], dtype=float32), chain_id=\"1.C\", res_id=62, ins_code=\"\", res_name=\"VAL\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([29.276, 33.303, 52.971], dtype=float32), chain_id=\"1.C\", res_id=63, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([31.129, 30.271, 51.746], dtype=float32), chain_id=\"1.C\", res_id=64, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([31.097, 26.475, 51.985], dtype=float32), chain_id=\"1.C\", res_id=65, ins_code=\"\", res_name=\"THR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([33.165, 23.682, 50.466], dtype=float32), chain_id=\"1.C\", res_id=66, ins_code=\"\", res_name=\"SER\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([33.755, 20.02 , 49.907], dtype=float32), chain_id=\"1.C\", res_id=67, ins_code=\"\", res_name=\"LYS\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([37.423, 20.062, 50.923], dtype=float32), chain_id=\"1.C\", res_id=68, ins_code=\"\", res_name=\"GLU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([39.006, 22.349, 48.293], dtype=float32), chain_id=\"1.C\", res_id=69, ins_code=\"\", res_name=\"LEU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([37.58 , 20.391, 45.335], dtype=float32), chain_id=\"1.C\", res_id=70, ins_code=\"\", res_name=\"LYS\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([34.258, 22.369, 45.302], dtype=float32), chain_id=\"1.C\", res_id=71, ins_code=\"\", res_name=\"HIS\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([33.929, 25.855, 46.791], dtype=float32), chain_id=\"1.C\", res_id=72, ins_code=\"\", res_name=\"ILE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([30.809, 28.097, 46.634], dtype=float32), chain_id=\"1.C\", res_id=73, ins_code=\"\", res_name=\"ARG\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([30.746, 31.74 , 47.745], dtype=float32), chain_id=\"1.C\", res_id=74, ins_code=\"\", res_name=\"VAL\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([27.423, 33.569, 48.302], dtype=float32), chain_id=\"1.C\", res_id=75, ins_code=\"\", res_name=\"TYR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([26.78 , 37.331, 48.237], dtype=float32), chain_id=\"1.C\", res_id=76, ins_code=\"\", res_name=\"THR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([24.045, 39.803, 47.162], dtype=float32), chain_id=\"1.C\", res_id=77, ins_code=\"\", res_name=\"LEU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([23.776, 41.558, 43.833], dtype=float32), chain_id=\"1.C\", res_id=78, ins_code=\"\", res_name=\"THR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([22.96 , 45.276, 43.615], dtype=float32), chain_id=\"1.C\", res_id=79, ins_code=\"\", res_name=\"GLU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([19.38 , 44.094, 43.048], dtype=float32), chain_id=\"1.C\", res_id=80, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([19.243, 42.241, 46.35 ], dtype=float32), chain_id=\"1.C\", res_id=81, ins_code=\"\", res_name=\"ASN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([19.132, 38.785, 44.809], dtype=float32), chain_id=\"1.C\", res_id=82, ins_code=\"\", res_name=\"THR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([21.296, 35.884, 45.952], dtype=float32), chain_id=\"1.C\", res_id=83, ins_code=\"\", res_name=\"LEU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([24.263, 35.052, 43.756], dtype=float32), chain_id=\"1.C\", res_id=84, ins_code=\"\", res_name=\"GLN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([27.001, 32.43 , 43.769], dtype=float32), chain_id=\"1.C\", res_id=85, ins_code=\"\", res_name=\"GLU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([30.617, 32.232, 42.703], dtype=float32), chain_id=\"1.C\", res_id=86, ins_code=\"\", res_name=\"PHE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([31.602, 28.607, 42.139], dtype=float32), chain_id=\"1.C\", res_id=87, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([34.952, 26.835, 42.027], dtype=float32), chain_id=\"1.C\", res_id=88, ins_code=\"\", res_name=\"TYR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([35.409, 23.229, 40.881], dtype=float32), chain_id=\"1.C\", res_id=89, ins_code=\"\", res_name=\"ASP\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([38.828, 21.565, 40.492], dtype=float32), chain_id=\"1.C\", res_id=90, ins_code=\"\", res_name=\"SER\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([39.747, 21.718, 36.807], dtype=float32), chain_id=\"1.C\", res_id=91, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([37.026, 24.195, 35.907], dtype=float32), chain_id=\"1.C\", res_id=92, ins_code=\"\", res_name=\"THR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([38.199, 27.055, 38.038], dtype=float32), chain_id=\"1.C\", res_id=93, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([35.847, 29.91 , 39.003], dtype=float32), chain_id=\"1.C\", res_id=94, ins_code=\"\", res_name=\"TRP\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([32.578, 30.549, 37.328], dtype=float32), chain_id=\"1.C\", res_id=95, ins_code=\"\", res_name=\"TYR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([29.245, 32.271, 37.883], dtype=float32), chain_id=\"1.C\", res_id=96, ins_code=\"\", res_name=\"ASN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([27.07 , 29.688, 39.597], dtype=float32), chain_id=\"1.C\", res_id=97, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([23.45 , 28.889, 38.841], dtype=float32), chain_id=\"1.C\", res_id=98, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([21.963, 30.506, 41.938], dtype=float32), chain_id=\"1.C\", res_id=99, ins_code=\"\", res_name=\"LEU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([21.82 , 34.007, 40.392], dtype=float32), chain_id=\"1.C\", res_id=100, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([19.555, 32.763, 37.623], dtype=float32), chain_id=\"1.C\", res_id=101, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([16.79 , 31.952, 40.105], dtype=float32), chain_id=\"1.C\", res_id=102, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([16.643, 35.647, 41.091], dtype=float32), chain_id=\"1.C\", res_id=103, ins_code=\"\", res_name=\"LYS\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([15.734, 34.949, 44.691], dtype=float32), chain_id=\"1.C\", res_id=104, ins_code=\"\", res_name=\"PHE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([14.869, 38.363, 46.158], dtype=float32), chain_id=\"1.C\", res_id=105, ins_code=\"\", res_name=\"GLN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([15.887, 38.931, 49.736], dtype=float32), chain_id=\"1.C\", res_id=106, ins_code=\"\", res_name=\"VAL\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([15.695, 41.881, 52.2 ], dtype=float32), chain_id=\"1.C\", res_id=107, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([18.41 , 44.412, 51.385], dtype=float32), chain_id=\"1.C\", res_id=108, ins_code=\"\", res_name=\"PRO\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([19.779, 43.943, 54.905], dtype=float32), chain_id=\"1.C\", res_id=109, ins_code=\"\", res_name=\"TYR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([19.784, 40.112, 54.691], dtype=float32), chain_id=\"1.C\", res_id=110, ins_code=\"\", res_name=\"SER\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([22.657, 38.031, 55.82 ], dtype=float32), chain_id=\"1.C\", res_id=111, ins_code=\"\", res_name=\"CSK\", hetero=True, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([23.586, 34.664, 54.178], dtype=float32), chain_id=\"1.C\", res_id=112, ins_code=\"\", res_name=\"ILE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([24.654, 31.27 , 55.531], dtype=float32), chain_id=\"1.C\", res_id=113, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([25.579, 28.238, 53.353], dtype=float32), chain_id=\"1.C\", res_id=114, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([26.359, 24.553, 53.847], dtype=float32), chain_id=\"1.C\", res_id=115, ins_code=\"\", res_name=\"VAL\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([27.08 , 21.51 , 51.754], dtype=float32), chain_id=\"1.C\", res_id=116, ins_code=\"\", res_name=\"PHE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([25.166, 18.737, 53.414], dtype=float32), chain_id=\"1.C\", res_id=117, ins_code=\"\", res_name=\"LEU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([27.495, 16.395, 55.389], dtype=float32), chain_id=\"1.C\", res_id=118, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([28.209, 12.722, 54.823], dtype=float32), chain_id=\"1.C\", res_id=119, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([27.621, 12.438, 51.119], dtype=float32), chain_id=\"1.C\", res_id=120, ins_code=\"\", res_name=\"THR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([29.661, 12.733, 47.991], dtype=float32), chain_id=\"1.C\", res_id=121, ins_code=\"\", res_name=\"ASP\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([26.685, 14.305, 46.211], dtype=float32), chain_id=\"1.C\", res_id=122, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([26.784, 18.082, 45.912], dtype=float32), chain_id=\"1.C\", res_id=123, ins_code=\"\", res_name=\"LEU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([23.739, 19.128, 47.981], dtype=float32), chain_id=\"1.C\", res_id=124, ins_code=\"\", res_name=\"GLN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([23.557, 22.765, 49.178], dtype=float32), chain_id=\"1.C\", res_id=125, ins_code=\"\", res_name=\"LEU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([21.391, 24.6 , 51.679], dtype=float32), chain_id=\"1.C\", res_id=126, ins_code=\"\", res_name=\"ARG\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([21.528, 28.408, 51.676], dtype=float32), chain_id=\"1.C\", res_id=127, ins_code=\"\", res_name=\"ILE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([19.795, 30.545, 54.345], dtype=float32), chain_id=\"1.C\", res_id=128, ins_code=\"\", res_name=\"TYR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([18.8 , 34.209, 53.938], dtype=float32), chain_id=\"1.C\", res_id=129, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([16.092, 36.636, 55.063], dtype=float32), chain_id=\"1.C\", res_id=130, ins_code=\"\", res_name=\"GLN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([13.129, 37.606, 52.906], dtype=float32), chain_id=\"1.C\", res_id=131, ins_code=\"\", res_name=\"LYS\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([11.576, 41.062, 52.885], dtype=float32), chain_id=\"1.C\", res_id=132, ins_code=\"\", res_name=\"PRO\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([ 8.958, 39.833, 55.378], dtype=float32), chain_id=\"1.C\", res_id=133, ins_code=\"\", res_name=\"ASP\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([11.866, 39.045, 57.757], dtype=float32), chain_id=\"1.C\", res_id=134, ins_code=\"\", res_name=\"ASN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([11.411, 35.324, 57.69 ], dtype=float32), chain_id=\"1.C\", res_id=135, ins_code=\"\", res_name=\"THR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([14.411, 33.041, 57.304], dtype=float32), chain_id=\"1.C\", res_id=136, ins_code=\"\", res_name=\"ILE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([14.208, 31.125, 54.02 ], dtype=float32), chain_id=\"1.C\", res_id=137, ins_code=\"\", res_name=\"GLN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([16.164, 28.022, 53.028], dtype=float32), chain_id=\"1.C\", res_id=138, ins_code=\"\", res_name=\"GLU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([17.168, 27.611, 49.355], dtype=float32), chain_id=\"1.C\", res_id=139, ins_code=\"\", res_name=\"TYR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([18.153, 24.136, 48.073], dtype=float32), chain_id=\"1.C\", res_id=140, ins_code=\"\", res_name=\"MET\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([20.271, 22.579, 45.375], dtype=float32), chain_id=\"1.C\", res_id=141, ins_code=\"\", res_name=\"TRP\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([19.89 , 18.801, 44.939], dtype=float32), chain_id=\"1.C\", res_id=142, ins_code=\"\", res_name=\"ASN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([21.219, 18.437, 41.4 ], dtype=float32), chain_id=\"1.C\", res_id=143, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([18.135, 19.568, 39.505], dtype=float32), chain_id=\"1.C\", res_id=144, ins_code=\"\", res_name=\"ASP\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([17.968, 23.314, 39.879], dtype=float32), chain_id=\"1.C\", res_id=145, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([17.554, 25.773, 42.722], dtype=float32), chain_id=\"1.C\", res_id=146, ins_code=\"\", res_name=\"TRP\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([14.331, 25.598, 44.686], dtype=float32), chain_id=\"1.C\", res_id=147, ins_code=\"\", res_name=\"LYS\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([12.911, 27.042, 47.867], dtype=float32), chain_id=\"1.C\", res_id=148, ins_code=\"\", res_name=\"GLU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([13.157, 24.765, 50.822], dtype=float32), chain_id=\"1.C\", res_id=149, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([11.808, 25.155, 54.348], dtype=float32), chain_id=\"1.C\", res_id=150, ins_code=\"\", res_name=\"THR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([10.887, 28.572, 55.76 ], dtype=float32), chain_id=\"1.C\", res_id=151, ins_code=\"\", res_name=\"ASN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([12.064, 28.854, 59.334], dtype=float32), chain_id=\"1.C\", res_id=152, ins_code=\"\", res_name=\"LEU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([ 9.946, 31.735, 60.52 ], dtype=float32), chain_id=\"1.C\", res_id=153, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([10.542, 35.294, 61.687], dtype=float32), chain_id=\"1.C\", res_id=154, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([13.834, 36.746, 62.824], dtype=float32), chain_id=\"1.C\", res_id=155, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([15.222, 40.162, 63.736], dtype=float32), chain_id=\"1.C\", res_id=156, ins_code=\"\", res_name=\"LEU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([15.557, 42.243, 60.568], dtype=float32), chain_id=\"1.C\", res_id=157, ins_code=\"\", res_name=\"PRO\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([19.208, 42.031, 59.538], dtype=float32), chain_id=\"1.C\", res_id=158, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([19.959, 39.084, 61.789], dtype=float32), chain_id=\"1.C\", res_id=159, ins_code=\"\", res_name=\"THR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([23.249, 37.318, 61.43 ], dtype=float32), chain_id=\"1.C\", res_id=160, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([22.877, 33.683, 60.339], dtype=float32), chain_id=\"1.C\", res_id=161, ins_code=\"\", res_name=\"ILE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([25.23 , 30.867, 61.333], dtype=float32), chain_id=\"1.C\", res_id=162, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([24.9 , 27.331, 59.855], dtype=float32), chain_id=\"1.C\", res_id=163, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([26.586, 23.93 , 60.055], dtype=float32), chain_id=\"1.C\", res_id=164, ins_code=\"\", res_name=\"THR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([25.888, 20.448, 58.72 ], dtype=float32), chain_id=\"1.C\", res_id=165, ins_code=\"\", res_name=\"SER\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([27.218, 17.233, 60.209], dtype=float32), chain_id=\"1.C\", res_id=166, ins_code=\"\", res_name=\"PHE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([26.321, 13.526, 59.884], dtype=float32), chain_id=\"1.C\", res_id=167, ins_code=\"\", res_name=\"ARG\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([26.187, 11.386, 62.989], dtype=float32), chain_id=\"1.C\", res_id=168, ins_code=\"\", res_name=\"TYR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([27.957, 8.072, 62.285], dtype=float32), chain_id=\"1.C\", res_id=169, ins_code=\"\", res_name=\"THR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([24.804, 6.126, 63.354], dtype=float32), chain_id=\"1.C\", res_id=170, ins_code=\"\", res_name=\"ASP\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([22.478, 8.159, 61.086], dtype=float32), chain_id=\"1.C\", res_id=171, ins_code=\"\", res_name=\"TYR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([21.552, 7.589, 57.485], dtype=float32), chain_id=\"1.C\", res_id=172, ins_code=\"\", res_name=\"ASN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([21.374, 11.231, 56.488], dtype=float32), chain_id=\"1.C\", res_id=173, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([22.624, 14.731, 57.341], dtype=float32), chain_id=\"1.C\", res_id=174, ins_code=\"\", res_name=\"PRO\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([21.765, 17.011, 60.219], dtype=float32), chain_id=\"1.C\", res_id=175, ins_code=\"\", res_name=\"SER\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([21.637, 20.8 , 60.006], dtype=float32), chain_id=\"1.C\", res_id=176, ins_code=\"\", res_name=\"ILE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([21.901, 23.397, 62.78 ], dtype=float32), chain_id=\"1.C\", res_id=177, ins_code=\"\", res_name=\"ARG\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([21.259, 27.132, 62.182], dtype=float32), chain_id=\"1.C\", res_id=178, ins_code=\"\", res_name=\"ILE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([21.503, 30.099, 64.596], dtype=float32), chain_id=\"1.C\", res_id=179, ins_code=\"\", res_name=\"TRP\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([20.007, 33.574, 64.31 ], dtype=float32), chain_id=\"1.C\", res_id=180, ins_code=\"\", res_name=\"PHE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([18.629, 36.432, 66.401], dtype=float32), chain_id=\"1.C\", res_id=181, ins_code=\"\", res_name=\"GLN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([15.009, 37.04 , 67.219], dtype=float32), chain_id=\"1.C\", res_id=182, ins_code=\"\", res_name=\"THR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([13.231, 40.372, 67.74 ], dtype=float32), chain_id=\"1.C\", res_id=183, ins_code=\"\", res_name=\"ASP\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([13.819, 40.207, 71.511], dtype=float32), chain_id=\"1.C\", res_id=184, ins_code=\"\", res_name=\"ASP\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([17.57 , 40.218, 70.762], dtype=float32), chain_id=\"1.C\", res_id=185, ins_code=\"\", res_name=\"LEU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([18.162, 36.63 , 71.97 ], dtype=float32), chain_id=\"1.C\", res_id=186, ins_code=\"\", res_name=\"LYS\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([20.309, 34.271, 69.879], dtype=float32), chain_id=\"1.C\", res_id=187, ins_code=\"\", res_name=\"LEU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([18.516, 30.973, 69.077], dtype=float32), chain_id=\"1.C\", res_id=188, ins_code=\"\", res_name=\"VAL\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([19.192, 27.671, 67.417], dtype=float32), chain_id=\"1.C\", res_id=189, ins_code=\"\", res_name=\"GLN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([16.964, 25.818, 65.006], dtype=float32), chain_id=\"1.C\", res_id=190, ins_code=\"\", res_name=\"ARG\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([17.678, 22.196, 64.215], dtype=float32), chain_id=\"1.C\", res_id=191, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([17.092, 19.672, 61.459], dtype=float32), chain_id=\"1.C\", res_id=192, ins_code=\"\", res_name=\"TYR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([17.516, 15.899, 61.897], dtype=float32), chain_id=\"1.C\", res_id=193, ins_code=\"\", res_name=\"ASP\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([16.273, 13.271, 59.397], dtype=float32), chain_id=\"1.C\", res_id=194, ins_code=\"\", res_name=\"PRO\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([13.773, 11.686, 61.849], dtype=float32), chain_id=\"1.C\", res_id=195, ins_code=\"\", res_name=\"HIS\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([12.208, 14.882, 63.027], dtype=float32), chain_id=\"1.C\", res_id=196, ins_code=\"\", res_name=\"LYS\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([12.725, 17.287, 60.196], dtype=float32), chain_id=\"1.C\", res_id=197, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([12.951, 20.794, 61.594], dtype=float32), chain_id=\"1.C\", res_id=198, ins_code=\"\", res_name=\"TRP\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([12.362, 20.635, 65.308], dtype=float32), chain_id=\"1.C\", res_id=199, ins_code=\"\", res_name=\"TYR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([ 9.398, 22.84 , 66.296], dtype=float32), chain_id=\"1.C\", res_id=200, ins_code=\"\", res_name=\"PRO\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([11.24 , 24.656, 69.136], dtype=float32), chain_id=\"1.C\", res_id=201, ins_code=\"\", res_name=\"ASP\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([13.825, 27.475, 69.073], dtype=float32), chain_id=\"1.C\", res_id=202, ins_code=\"\", res_name=\"LEU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([16.605, 26.809, 71.591], dtype=float32), chain_id=\"1.C\", res_id=203, ins_code=\"\", res_name=\"VAL\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([18.107, 29.965, 73.225], dtype=float32), chain_id=\"1.C\", res_id=204, ins_code=\"\", res_name=\"THR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([21.879, 30.012, 73.189], dtype=float32), chain_id=\"1.C\", res_id=205, ins_code=\"\", res_name=\"ILE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([22.4 , 33.588, 74.442], dtype=float32), chain_id=\"1.C\", res_id=206, ins_code=\"\", res_name=\"PHE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([19.969, 35.798, 76.3 ], dtype=float32), chain_id=\"1.C\", res_id=207, ins_code=\"\", res_name=\"ASP\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([20.713, 39.213, 74.756], dtype=float32), chain_id=\"1.C\", res_id=208, ins_code=\"\", res_name=\"ARG\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([23.154, 40.213, 71.999], dtype=float32), chain_id=\"1.C\", res_id=209, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([23.736, 43.437, 70.089], dtype=float32), chain_id=\"1.C\", res_id=210, ins_code=\"\", res_name=\"PRO\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([21.218, 44.048, 67.296], dtype=float32), chain_id=\"1.C\", res_id=211, ins_code=\"\", res_name=\"PRO\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([22.435, 42.581, 64.029], dtype=float32), chain_id=\"1.C\", res_id=212, ins_code=\"\", res_name=\"ARG\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([25.505, 41.056, 65.628], dtype=float32), chain_id=\"1.C\", res_id=213, ins_code=\"\", res_name=\"THR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([27.584, 38.765, 63.402], dtype=float32), chain_id=\"1.C\", res_id=214, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([26.978, 35.04 , 63.992], dtype=float32), chain_id=\"1.C\", res_id=215, ins_code=\"\", res_name=\"ILE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([29.182, 32.206, 62.729], dtype=float32), chain_id=\"1.C\", res_id=216, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([29.221, 28.492, 63.545], dtype=float32), chain_id=\"1.C\", res_id=217, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([31.13 , 25.268, 63.09 ], dtype=float32), chain_id=\"1.C\", res_id=218, ins_code=\"\", res_name=\"THR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([30.872, 21.629, 64.18 ], dtype=float32), chain_id=\"1.C\", res_id=219, ins_code=\"\", res_name=\"SER\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([33.38 , 18.795, 64.405], dtype=float32), chain_id=\"1.C\", res_id=220, ins_code=\"\", res_name=\"PHE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([33.927, 15.329, 65.773], dtype=float32), chain_id=\"1.C\", res_id=221, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([30.683, 13.611, 64.715], dtype=float32), chain_id=\"1.C\", res_id=222, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([30.193, 10.154, 66.232], dtype=float32), chain_id=\"1.C\", res_id=223, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([27.302, 7.976, 67.259], dtype=float32), chain_id=\"1.C\", res_id=224, ins_code=\"\", res_name=\"ASN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([24.57 , 10.428, 68.183], dtype=float32), chain_id=\"1.C\", res_id=225, ins_code=\"\", res_name=\"SER\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([27.391, 12.784, 69.269], dtype=float32), chain_id=\"1.C\", res_id=226, ins_code=\"\", res_name=\"SER\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([28.716, 16.117, 67.981], dtype=float32), chain_id=\"1.C\", res_id=227, ins_code=\"\", res_name=\"ILE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([30.701, 19.192, 69.124], dtype=float32), chain_id=\"1.C\", res_id=228, ins_code=\"\", res_name=\"TYR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([29.62 , 22.667, 68.009], dtype=float32), chain_id=\"1.C\", res_id=229, ins_code=\"\", res_name=\"MET\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([30.928, 26.193, 68.412], dtype=float32), chain_id=\"1.C\", res_id=230, ins_code=\"\", res_name=\"ARG\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([29.026, 29.409, 67.78 ], dtype=float32), chain_id=\"1.C\", res_id=231, ins_code=\"\", res_name=\"ILE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([30.61 , 32.868, 67.689], dtype=float32), chain_id=\"1.C\", res_id=232, ins_code=\"\", res_name=\"TYR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([29.075, 36.325, 67.854], dtype=float32), chain_id=\"1.C\", res_id=233, ins_code=\"\", res_name=\"PHE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([30.165, 39.864, 68.646], dtype=float32), chain_id=\"1.C\", res_id=234, ins_code=\"\", res_name=\"VAL\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([29.046, 40.927, 72.063], dtype=float32), chain_id=\"1.C\", res_id=235, ins_code=\"\", res_name=\"ASN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([28.386, 44.358, 73.569], dtype=float32), chain_id=\"1.C\", res_id=236, ins_code=\"\", res_name=\"SER\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([31.951, 44.422, 74.943], dtype=float32), chain_id=\"1.C\", res_id=237, ins_code=\"\", res_name=\"ASP\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([33.341, 44.568, 71.393], dtype=float32), chain_id=\"1.C\", res_id=238, ins_code=\"\", res_name=\"ASN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([34.754, 41.048, 71.6 ], dtype=float32), chain_id=\"1.C\", res_id=239, ins_code=\"\", res_name=\"THR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([33.927, 37.755, 69.915], dtype=float32), chain_id=\"1.C\", res_id=240, ins_code=\"\", res_name=\"ILE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([32.209, 35.414, 72.325], dtype=float32), chain_id=\"1.C\", res_id=241, ins_code=\"\", res_name=\"TRP\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([32.048, 31.688, 71.906], dtype=float32), chain_id=\"1.C\", res_id=242, ins_code=\"\", res_name=\"GLN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([29.167, 29.34 , 72.83 ], dtype=float32), chain_id=\"1.C\", res_id=243, ins_code=\"\", res_name=\"VAL\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([30.053, 25.646, 73.341], dtype=float32), chain_id=\"1.C\", res_id=244, ins_code=\"\", res_name=\"CSD\", hetero=True, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([28.068, 22.515, 72.656], dtype=float32), chain_id=\"1.C\", res_id=245, ins_code=\"\", res_name=\"TRP\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([30.098, 19.504, 73.799], dtype=float32), chain_id=\"1.C\", res_id=246, ins_code=\"\", res_name=\"ASP\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([28.765, 15.966, 73.685], dtype=float32), chain_id=\"1.C\", res_id=247, ins_code=\"\", res_name=\"HIS\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([27.653, 14.773, 77.119], dtype=float32), chain_id=\"1.C\", res_id=248, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([27.289, 18.341, 78.446], dtype=float32), chain_id=\"1.C\", res_id=249, ins_code=\"\", res_name=\"LYS\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([25.142, 20.136, 75.878], dtype=float32), chain_id=\"1.C\", res_id=250, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([25.202, 23.925, 75.82 ], dtype=float32), chain_id=\"1.C\", res_id=251, ins_code=\"\", res_name=\"TYR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([27.284, 24.241, 78.981], dtype=float32), chain_id=\"1.C\", res_id=252, ins_code=\"\", res_name=\"HIS\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([29.672, 27.18 , 78.559], dtype=float32), chain_id=\"1.C\", res_id=253, ins_code=\"\", res_name=\"ASP\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([30.303, 30.475, 76.843], dtype=float32), chain_id=\"1.C\", res_id=254, ins_code=\"\", res_name=\"LYS\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([32.706, 33.377, 77.106], dtype=float32), chain_id=\"1.C\", res_id=255, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([34.938, 35.947, 75.469], dtype=float32), chain_id=\"1.C\", res_id=256, ins_code=\"\", res_name=\"THR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([37.594, 34.96 , 72.957], dtype=float32), chain_id=\"1.C\", res_id=257, ins_code=\"\", res_name=\"ILE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([39.254, 38.034, 71.463], dtype=float32), chain_id=\"1.C\", res_id=258, ins_code=\"\", res_name=\"THR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([38.664, 41.805, 70.99 ], dtype=float32), chain_id=\"1.C\", res_id=259, ins_code=\"\", res_name=\"PRO\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([37.343, 43.1 , 67.63 ], dtype=float32), chain_id=\"1.C\", res_id=260, ins_code=\"\", res_name=\"VAL\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([36.424, 46.395, 66.037], dtype=float32), chain_id=\"1.C\", res_id=261, ins_code=\"\", res_name=\"ILE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([32.9 , 47.663, 66.697], dtype=float32), chain_id=\"1.C\", res_id=262, ins_code=\"\", res_name=\"GLN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([30.635, 45.751, 64.26 ], dtype=float32), chain_id=\"1.C\", res_id=263, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([33.28 , 43.276, 63.008], dtype=float32), chain_id=\"1.C\", res_id=264, ins_code=\"\", res_name=\"SER\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([32.091, 40.342, 61.027], dtype=float32), chain_id=\"1.C\", res_id=265, ins_code=\"\", res_name=\"GLU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([33.338, 36.853, 61.843], dtype=float32), chain_id=\"1.C\", res_id=266, ins_code=\"\", res_name=\"VAL\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([34.187, 33.555, 60.092], dtype=float32), chain_id=\"1.C\", res_id=267, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([35.076, 30.172, 61.599], dtype=float32), chain_id=\"1.C\", res_id=268, ins_code=\"\", res_name=\"ILE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([36.617, 26.986, 60.126], dtype=float32), chain_id=\"1.C\", res_id=269, ins_code=\"\", res_name=\"ILE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([37.575, 23.784, 61.903], dtype=float32), chain_id=\"1.C\", res_id=270, ins_code=\"\", res_name=\"SER\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([39.012, 20.34 , 61.298], dtype=float32), chain_id=\"1.C\", res_id=271, ins_code=\"\", res_name=\"TRP\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([39.945, 17.286, 63.313], dtype=float32), chain_id=\"1.C\", res_id=272, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([38.578, 16.194, 66.67 ], dtype=float32), chain_id=\"1.C\", res_id=273, ins_code=\"\", res_name=\"SER\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([39.244, 15.782, 70.356], dtype=float32), chain_id=\"1.C\", res_id=274, ins_code=\"\", res_name=\"PHE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([39.706, 12.051, 69.787], dtype=float32), chain_id=\"1.C\", res_id=275, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([42.471, 12.568, 67.222], dtype=float32), chain_id=\"1.C\", res_id=276, ins_code=\"\", res_name=\"ASN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([44.648, 15.257, 68.88 ], dtype=float32), chain_id=\"1.C\", res_id=277, ins_code=\"\", res_name=\"ASN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([42.486, 18.171, 67.705], dtype=float32), chain_id=\"1.C\", res_id=278, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([40.354, 19.947, 66.807], dtype=float32), chain_id=\"1.C\", res_id=279, ins_code=\"\", res_name=\"PRO\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([41.922, 22.891, 65.034], dtype=float32), chain_id=\"1.C\", res_id=280, ins_code=\"\", res_name=\"ASP\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([39.872, 26.131, 64.933], dtype=float32), chain_id=\"1.C\", res_id=281, ins_code=\"\", res_name=\"LEU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([40.569, 29.293, 63.008], dtype=float32), chain_id=\"1.C\", res_id=282, ins_code=\"\", res_name=\"ARG\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([38.584, 32.522, 63.403], dtype=float32), chain_id=\"1.C\", res_id=283, ins_code=\"\", res_name=\"LEU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([38.778, 35.493, 61.058], dtype=float32), chain_id=\"1.C\", res_id=284, ins_code=\"\", res_name=\"TYR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([37.594, 38.992, 62.008], dtype=float32), chain_id=\"1.C\", res_id=285, ins_code=\"\", res_name=\"PHE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([38.818, 42.618, 62.143], dtype=float32), chain_id=\"1.C\", res_id=286, ins_code=\"\", res_name=\"GLN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([40.439, 43.865, 65.314], dtype=float32), chain_id=\"1.C\", res_id=287, ins_code=\"\", res_name=\"ASN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([42.099, 47.056, 64.049], dtype=float32), chain_id=\"1.C\", res_id=288, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([45.355, 45.616, 62.828], dtype=float32), chain_id=\"1.C\", res_id=289, ins_code=\"\", res_name=\"THR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([46.634, 48.049, 60.195], dtype=float32), chain_id=\"1.C\", res_id=290, ins_code=\"\", res_name=\"TYR\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([43.217, 49.69 , 60.802], dtype=float32), chain_id=\"1.C\", res_id=291, ins_code=\"\", res_name=\"ILE\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([41.315, 47.512, 58.297], dtype=float32), chain_id=\"1.C\", res_id=292, ins_code=\"\", res_name=\"SER\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([43.241, 44.254, 57.92 ], dtype=float32), chain_id=\"1.C\", res_id=293, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([41.642, 40.899, 58.604], dtype=float32), chain_id=\"1.C\", res_id=294, ins_code=\"\", res_name=\"VAL\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([43.225, 38.997, 61.562], dtype=float32), chain_id=\"1.C\", res_id=295, ins_code=\"\", res_name=\"SER\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([43.223, 35.354, 62.655], dtype=float32), chain_id=\"1.C\", res_id=296, ins_code=\"\", res_name=\"GLU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([42.762, 33.544, 65.958], dtype=float32), chain_id=\"1.C\", res_id=297, ins_code=\"\", res_name=\"TRP\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([43.927, 29.962, 66.475], dtype=float32), chain_id=\"1.C\", res_id=298, ins_code=\"\", res_name=\"VAL\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([42.877, 27.15 , 68.728], dtype=float32), chain_id=\"1.C\", res_id=299, ins_code=\"\", res_name=\"TRP\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([44.807, 23.896, 68.768], dtype=float32), chain_id=\"1.C\", res_id=300, ins_code=\"\", res_name=\"ASN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([45.873, 21.187, 71.218], dtype=float32), chain_id=\"1.C\", res_id=301, ins_code=\"\", res_name=\"ARG\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([49.536, 22.203, 71.185], dtype=float32), chain_id=\"1.C\", res_id=302, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([49.042, 25.799, 72.488], dtype=float32), chain_id=\"1.C\", res_id=303, ins_code=\"\", res_name=\"HIS\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([45.294, 26.37 , 73.032], dtype=float32), chain_id=\"1.C\", res_id=304, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([44.029, 29.898, 72.351], dtype=float32), chain_id=\"1.C\", res_id=305, ins_code=\"\", res_name=\"SER\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([46.497, 32.157, 70.449], dtype=float32), chain_id=\"1.C\", res_id=306, ins_code=\"\", res_name=\"GLN\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([46.396, 34.978, 67.94 ], dtype=float32), chain_id=\"1.C\", res_id=307, ins_code=\"\", res_name=\"LEU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([47.458, 33.723, 64.538], dtype=float32), chain_id=\"1.C\", res_id=308, ins_code=\"\", res_name=\"GLY\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([48.264, 35.732, 61.452], dtype=float32), chain_id=\"1.C\", res_id=309, ins_code=\"\", res_name=\"ARG\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([48.208, 39.343, 62.504], dtype=float32), chain_id=\"1.C\", res_id=310, ins_code=\"\", res_name=\"SER\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([47.214, 40.715, 59.093], dtype=float32), chain_id=\"1.C\", res_id=311, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([46.048, 38.514, 56.263], dtype=float32), chain_id=\"1.C\", res_id=312, ins_code=\"\", res_name=\"LEU\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([47.07 , 39.134, 52.685], dtype=float32), chain_id=\"1.C\", res_id=313, ins_code=\"\", res_name=\"PRO\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([46.856, 41.655, 50.991], dtype=float32), chain_id=\"1.C\", res_id=314, ins_code=\"\", res_name=\"PRO\", hetero=False, atom_name=\"CA\", element=\"C\"),\n", + "\tAtom(np.array([47.911, 43.592, 54.139], dtype=float32), chain_id=\"1.C\", res_id=315, ins_code=\"\", res_name=\"ALA\", hetero=False, atom_name=\"CA\", element=\"C\")\n", + "])" ] }, - "execution_count": 143, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "calpha_atom_array = system_structure.protein_atom_array[\n", - " system_structure.protein_calpha_mask\n", + " list(system_structure.protein_calpha_mask.values())[0]\n", "]\n", - "calpha_atom_array.coord.shape" + "calpha_atom_array" ] }, { @@ -1137,7 +1445,7 @@ }, { "cell_type": "code", - "execution_count": 144, + "execution_count": 36, "metadata": {}, "outputs": [], "source": [ @@ -1149,7 +1457,7 @@ }, { "cell_type": "code", - "execution_count": 145, + "execution_count": 37, "metadata": {}, "outputs": [ { @@ -1158,7 +1466,7 @@ "(314, 3)" ] }, - "execution_count": 145, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } @@ -1177,7 +1485,7 @@ }, { "cell_type": "code", - "execution_count": 146, + "execution_count": 38, "metadata": {}, "outputs": [ { @@ -1186,7 +1494,7 @@ "['1.C']" ] }, - "execution_count": 146, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } @@ -1205,7 +1513,7 @@ }, { "cell_type": "code", - "execution_count": 147, + "execution_count": 40, "metadata": {}, "outputs": [ { @@ -1214,13 +1522,13 @@ "['1.C']" ] }, - "execution_count": 147, + "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "system_structure.protein_chains" + "system_structure.protein_chain_ordered" ] }, { @@ -1233,7 +1541,7 @@ }, { "cell_type": "code", - "execution_count": 148, + "execution_count": 41, "metadata": {}, "outputs": [ { @@ -1248,7 +1556,7 @@ " [50.022, 44.674, 54.248]], dtype=float32)]" ] }, - "execution_count": 148, + "execution_count": 41, "metadata": {}, "output_type": "execute_result" } @@ -1257,460 +1565,6 @@ "system_structure.protein_coords" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Get protein structure atom names\n", - "Returns all atoms names the same way they appear in the structure" - ] - }, - { - "cell_type": "code", - "execution_count": 149, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['C',\n", - " 'CA',\n", - " 'CB',\n", - " 'CD',\n", - " 'CD1',\n", - " 'CD2',\n", - " 'CE',\n", - " 'CE1',\n", - " 'CE2',\n", - " 'CE3',\n", - " 'CG',\n", - " 'CG1',\n", - " 'CG2',\n", - " 'CH2',\n", - " 'CM',\n", - " 'CZ',\n", - " 'CZ2',\n", - " 'CZ3',\n", - " 'N',\n", - " 'ND1',\n", - " 'ND2',\n", - " 'NE',\n", - " 'NE1',\n", - " 'NE2',\n", - " 'NH1',\n", - " 'NH2',\n", - " 'NZ',\n", - " 'O',\n", - " 'OD1',\n", - " 'OD2',\n", - " 'OE1',\n", - " 'OE2',\n", - " 'OG',\n", - " 'OG1',\n", - " 'OH',\n", - " 'OXT',\n", - " 'SD',\n", - " 'SE',\n", - " 'SG']" - ] - }, - "execution_count": 149, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system_structure.protein_unique_atom_names" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Get protein residue names" - ] - }, - { - "cell_type": "code", - "execution_count": 150, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['ALA',\n", - " 'ARG',\n", - " 'ASN',\n", - " 'ASP',\n", - " 'CSD',\n", - " 'CSK',\n", - " 'GLN',\n", - " 'GLU',\n", - " 'GLY',\n", - " 'HIS',\n", - " 'ILE',\n", - " 'LEU',\n", - " 'LYS',\n", - " 'MET',\n", - " 'PHE',\n", - " 'PRO',\n", - " 'SER',\n", - " 'THR',\n", - " 'TRP',\n", - " 'TYR',\n", - " 'VAL']" - ] - }, - "execution_count": 150, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system_structure.protein_unique_residue_names" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Get protein residues number\n", - "Residue number as they appear in structure" - ] - }, - { - "cell_type": "code", - "execution_count": 151, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[2,\n", - " 3,\n", - " 4,\n", - " 5,\n", - " 6,\n", - " 7,\n", - " 8,\n", - " 9,\n", - " 10,\n", - " 11,\n", - " 12,\n", - " 13,\n", - " 14,\n", - " 15,\n", - " 16,\n", - " 17,\n", - " 18,\n", - " 19,\n", - " 20,\n", - " 21,\n", - " 22,\n", - " 23,\n", - " 24,\n", - " 25,\n", - " 26,\n", - " 27,\n", - " 28,\n", - " 29,\n", - " 30,\n", - " 31,\n", - " 32,\n", - " 33,\n", - " 34,\n", - " 35,\n", - " 36,\n", - " 37,\n", - " 38,\n", - " 39,\n", - " 40,\n", - " 41,\n", - " 42,\n", - " 43,\n", - " 44,\n", - " 45,\n", - " 46,\n", - " 47,\n", - " 48,\n", - " 49,\n", - " 50,\n", - " 51,\n", - " 52,\n", - " 53,\n", - " 54,\n", - " 55,\n", - " 56,\n", - " 57,\n", - " 58,\n", - " 59,\n", - " 60,\n", - " 61,\n", - " 62,\n", - " 63,\n", - " 64,\n", - " 65,\n", - " 66,\n", - " 67,\n", - " 68,\n", - " 69,\n", - " 70,\n", - " 71,\n", - " 72,\n", - " 73,\n", - " 74,\n", - " 75,\n", - " 76,\n", - " 77,\n", - " 78,\n", - " 79,\n", - " 80,\n", - " 81,\n", - " 82,\n", - " 83,\n", - " 84,\n", - " 85,\n", - " 86,\n", - " 87,\n", - " 88,\n", - " 89,\n", - " 90,\n", - " 91,\n", - " 92,\n", - " 93,\n", - " 94,\n", - " 95,\n", - " 96,\n", - " 97,\n", - " 98,\n", - " 99,\n", - " 100,\n", - " 101,\n", - " 102,\n", - " 103,\n", - " 104,\n", - " 105,\n", - " 106,\n", - " 107,\n", - " 108,\n", - " 109,\n", - " 110,\n", - " 111,\n", - " 112,\n", - " 113,\n", - " 114,\n", - " 115,\n", - " 116,\n", - " 117,\n", - " 118,\n", - " 119,\n", - " 120,\n", - " 121,\n", - " 122,\n", - " 123,\n", - " 124,\n", - " 125,\n", - " 126,\n", - " 127,\n", - " 128,\n", - " 129,\n", - " 130,\n", - " 131,\n", - " 132,\n", - " 133,\n", - " 134,\n", - " 135,\n", - " 136,\n", - " 137,\n", - " 138,\n", - " 139,\n", - " 140,\n", - " 141,\n", - " 142,\n", - " 143,\n", - " 144,\n", - " 145,\n", - " 146,\n", - " 147,\n", - " 148,\n", - " 149,\n", - " 150,\n", - " 151,\n", - " 152,\n", - " 153,\n", - " 154,\n", - " 155,\n", - " 156,\n", - " 157,\n", - " 158,\n", - " 159,\n", - " 160,\n", - " 161,\n", - " 162,\n", - " 163,\n", - " 164,\n", - " 165,\n", - " 166,\n", - " 167,\n", - " 168,\n", - " 169,\n", - " 170,\n", - " 171,\n", - " 172,\n", - " 173,\n", - " 174,\n", - " 175,\n", - " 176,\n", - " 177,\n", - " 178,\n", - " 179,\n", - " 180,\n", - " 181,\n", - " 182,\n", - " 183,\n", - " 184,\n", - " 185,\n", - " 186,\n", - " 187,\n", - " 188,\n", - " 189,\n", - " 190,\n", - " 191,\n", - " 192,\n", - " 193,\n", - " 194,\n", - " 195,\n", - " 196,\n", - " 197,\n", - " 198,\n", - " 199,\n", - " 200,\n", - " 201,\n", - " 202,\n", - " 203,\n", - " 204,\n", - " 205,\n", - " 206,\n", - " 207,\n", - " 208,\n", - " 209,\n", - " 210,\n", - " 211,\n", - " 212,\n", - " 213,\n", - " 214,\n", - " 215,\n", - " 216,\n", - " 217,\n", - " 218,\n", - " 219,\n", - " 220,\n", - " 221,\n", - " 222,\n", - " 223,\n", - " 224,\n", - " 225,\n", - " 226,\n", - " 227,\n", - " 228,\n", - " 229,\n", - " 230,\n", - " 231,\n", - " 232,\n", - " 233,\n", - " 234,\n", - " 235,\n", - " 236,\n", - " 237,\n", - " 238,\n", - " 239,\n", - " 240,\n", - " 241,\n", - " 242,\n", - " 243,\n", - " 244,\n", - " 245,\n", - " 246,\n", - " 247,\n", - " 248,\n", - " 249,\n", - " 250,\n", - " 251,\n", - " 252,\n", - " 253,\n", - " 254,\n", - " 255,\n", - " 256,\n", - " 257,\n", - " 258,\n", - " 259,\n", - " 260,\n", - " 261,\n", - " 262,\n", - " 263,\n", - " 264,\n", - " 265,\n", - " 266,\n", - " 267,\n", - " 268,\n", - " 269,\n", - " 270,\n", - " 271,\n", - " 272,\n", - " 273,\n", - " 274,\n", - " 275,\n", - " 276,\n", - " 277,\n", - " 278,\n", - " 279,\n", - " 280,\n", - " 281,\n", - " 282,\n", - " 283,\n", - " 284,\n", - " 285,\n", - " 286,\n", - " 287,\n", - " 288,\n", - " 289,\n", - " 290,\n", - " 291,\n", - " 292,\n", - " 293,\n", - " 294,\n", - " 295,\n", - " 296,\n", - " 297,\n", - " 298,\n", - " 299,\n", - " 300,\n", - " 301,\n", - " 302,\n", - " 303,\n", - " 304,\n", - " 305,\n", - " 306,\n", - " 307,\n", - " 308,\n", - " 309,\n", - " 310,\n", - " 311,\n", - " 312,\n", - " 313,\n", - " 314,\n", - " 315]" - ] - }, - "execution_count": 151, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system_structure.protein_unique_residue_ids" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -1720,16 +1574,16 @@ }, { "cell_type": "code", - "execution_count": 152, + "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'STPGAQQVLFRTGIAAVNSTNHLRVYFQDVYGSIRESLYEGSWANGTEKNVIGNAKLGSPVAATSKELKHIRVYTLTEGNTLQEFAYDSGTGWYNGGLGGAKFQVAPYSXIAAVFLAGTDALQLRIYAQKPDNTIQEYMWNGDGWKEGTNLGGALPGTGIGATSFRYTDYNGPSIRIWFQTDDLKLVQRAYDPHKGWYPDLVTIFDRAPPRTAIAATSFGAGNSSIYMRIYFVNSDNTIWQVCWDHGKGYHDKGTITPVIQGSEVAIISWGSFANNGPDLRLYFQNGTYISAVSEWVWNRAHGSQLGRSALPPA'" + "{'1.C': 'STPGAQQVLFRTGIAAVNSTNHLRVYFQDVYGSIRESLYEGSWANGTEKNVIGNAKLGSPVAATSKELKHIRVYTLTEGNTLQEFAYDSGTGWYNGGLGGAKFQVAPYSXIAAVFLAGTDALQLRIYAQKPDNTIQEYMWNGDGWKEGTNLGGALPGTGIGATSFRYTDYNGPSIRIWFQTDDLKLVQRAYDPHKGWYPDLVTIFDRAPPRTAIAATSFGAGNSSIYMRIYFVNSDNTIWQVCWDHGKGYHDKGTITPVIQGSEVAIISWGSFANNGPDLRLYFQNGTYISAVSEWVWNRAHGSQLGRSALPPA'}" ] }, - "execution_count": 152, + "execution_count": 42, "metadata": {}, "output_type": "execute_result" } @@ -1747,7 +1601,7 @@ }, { "cell_type": "code", - "execution_count": 153, + "execution_count": 43, "metadata": {}, "outputs": [ { @@ -1756,7 +1610,7 @@ "{'1.C': 'MSTPGAQQVLFRTGIAAVNSTNHLRVYFQDVYGSIRESLYEGSWANGTEKNVIGNAKLGSPVAATSKELKHIRVYTLTEGNTLQEFAYDSGTGWYNGGLGGAKFQVAPYSXIAAVFLAGTDALQLRIYAQKPDNTIQEYMWNGDGWKEGTNLGGALPGTGIGATSFRYTDYNGPSIRIWFQTDDLKLVQRAYDPHKGWYPDLVTIFDRAPPRTAIAATSFGAGNSSIYMRIYFVNSDNTIWQVCWDHGKGYHDKGTITPVIQGSEVAIISWGSFANNGPDLRLYFQNGTYISAVSEWVWNRAHGSQLGRSALPPA'}" ] }, - "execution_count": 153, + "execution_count": 43, "metadata": {}, "output_type": "execute_result" } @@ -1765,51 +1619,6 @@ "system_structure.protein_sequence" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Get tokenized sequence\n", - "Get tensor of sequence converted to integer-based amino acid tokens" - ] - }, - { - "cell_type": "code", - "execution_count": 154, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "tensor([15, 16, 14, 7, 0, 5, 5, 19, 10, 13, 1, 16, 7, 9, 0, 0, 19, 2,\n", - " 15, 16, 2, 8, 10, 1, 19, 18, 13, 5, 3, 19, 18, 7, 15, 9, 1, 6,\n", - " 15, 10, 18, 6, 7, 15, 17, 0, 2, 7, 16, 6, 11, 2, 19, 9, 7, 2,\n", - " 0, 11, 10, 7, 15, 14, 19, 0, 0, 16, 15, 11, 6, 10, 11, 8, 9, 1,\n", - " 19, 18, 16, 10, 16, 6, 7, 2, 16, 10, 5, 6, 13, 0, 18, 3, 15, 7,\n", - " 16, 7, 17, 18, 2, 7, 7, 10, 7, 7, 0, 11, 13, 5, 19, 0, 14, 18,\n", - " 15, 20, 9, 0, 0, 19, 13, 10, 0, 7, 16, 3, 0, 10, 5, 10, 1, 9,\n", - " 18, 0, 5, 11, 14, 3, 2, 16, 9, 5, 6, 18, 12, 17, 2, 7, 3, 7,\n", - " 17, 11, 6, 7, 16, 2, 10, 7, 7, 0, 10, 14, 7, 16, 7, 9, 7, 0,\n", - " 16, 15, 13, 1, 18, 16, 3, 18, 2, 7, 14, 15, 9, 1, 9, 17, 13, 5,\n", - " 16, 3, 3, 10, 11, 10, 19, 5, 1, 0, 18, 3, 14, 8, 11, 7, 17, 18,\n", - " 14, 3, 10, 19, 16, 9, 13, 3, 1, 0, 14, 14, 1, 16, 0, 9, 0, 0,\n", - " 16, 15, 13, 7, 0, 7, 2, 15, 15, 9, 18, 12, 1, 9, 18, 13, 19, 2,\n", - " 15, 3, 2, 16, 9, 17, 5, 19, 4, 17, 3, 8, 7, 11, 7, 18, 8, 3,\n", - " 11, 7, 16, 9, 16, 14, 19, 9, 5, 7, 15, 6, 19, 0, 9, 9, 15, 17,\n", - " 7, 15, 13, 0, 2, 2, 7, 14, 3, 10, 1, 10, 18, 13, 5, 2, 7, 16,\n", - " 18, 9, 15, 0, 19, 15, 6, 17, 19, 17, 2, 1, 0, 8, 7, 15, 5, 10,\n", - " 7, 1, 15, 0, 10, 14, 14, 0])" - ] - }, - "execution_count": 154, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system_structure.protein_structure_tokenized_sequence" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -1819,7 +1628,7 @@ }, { "cell_type": "code", - "execution_count": 155, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1843,7 +1652,7 @@ }, { "cell_type": "code", - "execution_count": 156, + "execution_count": null, "metadata": {}, "outputs": [ { diff --git a/docs/examples/5_dataset_and_loader.ipynb b/docs/examples/5_dataset_and_loader.ipynb index 13ed84f1..335949a3 100644 --- a/docs/examples/5_dataset_and_loader.ipynb +++ b/docs/examples/5_dataset_and_loader.ipynb @@ -9,7 +9,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -64,9 +64,29 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-11-27 10:19:00,554 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.14s\n", + "2024-11-27 10:19:01,000 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.13s\n", + "2024-11-27 10:19:01,569 | plinder.core.loader.dataset:51 | INFO : Loading 9 systems\n" + ] + }, + { + "data": { + "text/plain": [ + "9" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "val_dataset = PlinderDataset(\n", " split=\"val\",\n", @@ -81,36 +101,186 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-11-27 10:19:01,755 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-11-27 10:19:01,756 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-11-27 10:19:01,902 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-11-27 10:19:01,902 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-11-27 10:19:01,903 | plinder.core.index.utils:148 | INFO : loading entries from 1 zips\n", + "2024-11-27 10:19:01,905 | plinder.core.index.utils:163 | INFO : loaded 1 entries\n", + "2024-11-27 10:19:01,906 | plinder.core.index.utils.load_entries:24 | INFO : runtime succeeded: 0.15s\n", + "2024-11-27 10:19:02,775 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.14s\n", + "2024-11-27 10:19:03,165 | plinder.core.scores.links.query_links:24 | INFO : runtime succeeded: 0.72s\n", + "2024-11-27 10:19:03,547 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-11-27 10:19:03,548 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n" + ] + } + ], "source": [ "val_data = val_dataset[1]" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "{'apo_sequence_atom_mask_stacked': tensor([[0, 0, 0, ..., 0, 0, 0]]),\n", + " 'apo_input_sequence_residue_mask_stacked': tensor([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]],\n", + " dtype=torch.float64),\n", + " 'apo_protein_coordinates_stacked': tensor([[[ 2.7330, 14.3610, 40.0040],\n", + " [ 2.3770, 13.1100, 39.3540],\n", + " [ 3.6350, 12.3080, 39.0430],\n", + " ...,\n", + " [48.4210, 16.8590, -3.6720],\n", + " [47.2130, 17.2590, -4.5050],\n", + " [46.2770, 16.1200, -4.6930]]]),\n", + " 'apo_protein_calpha_coordinates_stacked': tensor([[[ 2.3770, 13.1100, 39.3540],\n", + " [ 5.6590, 12.1790, 37.6810],\n", + " [ 9.2990, 12.9710, 38.4660],\n", + " ...,\n", + " [43.7080, 13.2050, -2.5430],\n", + " [47.0010, 11.6010, -1.5420],\n", + " [49.4010, 14.4570, -0.8550]]]),\n", + " 'apo_sequence_to_holo_structure_mask_stacked': tensor([[1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]], dtype=torch.float64)}" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "val_data['features_and_coords']['apo_features']" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'5ya1__1__1.A__1.E'" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "val_data['system_id']" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-11-27 10:19:07,298 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-11-27 10:19:07,298 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-11-27 10:19:07,407 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-11-27 10:19:07,407 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-11-27 10:19:07,407 | plinder.core.index.utils:148 | INFO : loading entries from 1 zips\n", + "2024-11-27 10:19:07,410 | plinder.core.index.utils:163 | INFO : loaded 1 entries\n", + "2024-11-27 10:19:07,410 | plinder.core.index.utils.load_entries:24 | INFO : runtime succeeded: 0.11s\n", + "2024-11-27 10:19:07,791 | plinder.core.structure.atoms:214 | WARNING : get_template_to_mol_matches: could not match template fully - retry with unmatched bonds set as UNSPECIFIED\n", + "2024-11-27 10:19:07,880 | plinder.core.structure.atoms:214 | WARNING : get_template_to_mol_matches: could not match template fully - retry with unmatched bonds set as UNSPECIFIED\n", + "2024-11-27 10:19:08,233 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.17s\n", + "2024-11-27 10:19:08,373 | plinder.core.scores.links.query_links:24 | INFO : runtime succeeded: 0.49s\n", + "2024-11-27 10:19:08,531 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-11-27 10:19:08,531 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-11-27 10:19:08,623 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-11-27 10:19:08,623 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-11-27 10:19:08,623 | plinder.core.index.utils:148 | INFO : loading entries from 1 zips\n", + "2024-11-27 10:19:08,625 | plinder.core.index.utils:163 | INFO : loaded 1 entries\n", + "2024-11-27 10:19:08,625 | plinder.core.index.utils.load_entries:24 | INFO : runtime succeeded: 0.09s\n", + "2024-11-27 10:19:10,394 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.15s\n", + "2024-11-27 10:19:10,551 | plinder.core.scores.links.query_links:24 | INFO : runtime succeeded: 0.49s\n", + "/Users/yusuf/plinder-org/plinder/src/plinder/core/loader/utils.py:125: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n", + " collated_properties.append(torch.tensor(feat))\n", + "2024-11-27 10:19:16,852 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-11-27 10:19:16,852 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-11-27 10:19:16,990 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-11-27 10:19:16,990 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-11-27 10:19:16,990 | plinder.core.index.utils:148 | INFO : loading entries from 1 zips\n", + "2024-11-27 10:19:16,993 | plinder.core.index.utils:163 | INFO : loaded 1 entries\n", + "2024-11-27 10:19:16,993 | plinder.core.index.utils.load_entries:24 | INFO : runtime succeeded: 0.14s\n", + "2024-11-27 10:19:19,307 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.14s\n", + "2024-11-27 10:19:19,433 | plinder.core.scores.links.query_links:24 | INFO : runtime succeeded: 0.46s\n" + ] + } + ], "source": [ "val_loader = get_torch_loader(val_dataset)\n", "for data in val_loader:\n", @@ -120,27 +290,450 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "dict_keys(['system_ids', 'alternate_structure_id', 'plinder_system', 'paths', 'features_and_coords'])" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "test_torch.keys()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "['3ab8__1__1.A__1.C_1.E', '8vjk__1__1.H__1.IA']" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "test_torch[\"system_ids\"]" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sequence_features {'input_sequence_residue_feat_stack': tensor([[[[ 0., 0., 0., ..., 0., 0., 0.],\n", + " [ 0., 1., 0., ..., 0., 0., 0.],\n", + " [ 0., 0., 0., ..., 0., 0., 0.],\n", + " ...,\n", + " [-100., -100., -100., ..., -100., -100., -100.],\n", + " [-100., -100., -100., ..., -100., -100., -100.],\n", + " [-100., -100., -100., ..., -100., -100., -100.]]],\n", + "\n", + "\n", + " [[[ 0., 0., 0., ..., 0., 0., 0.],\n", + " [ 0., 0., 0., ..., 0., 0., 0.],\n", + " [ 0., 0., 0., ..., 0., 0., 0.],\n", + " ...,\n", + " [ 0., 0., 0., ..., 0., 0., 0.],\n", + " [ 0., 0., 0., ..., 0., 0., 0.],\n", + " [ 0., 0., 0., ..., 0., 0., 0.]]]],\n", + " dtype=torch.float64), 'input_sequence_full_atom_feat_stack': tensor([[[[ 0., 0., 0., ..., 0., 0., 0.],\n", + " [ 0., 0., 0., ..., 0., 0., 0.],\n", + " [ 1., 0., 0., ..., 0., 0., 0.],\n", + " ...,\n", + " [-100., -100., -100., ..., -100., -100., -100.],\n", + " [-100., -100., -100., ..., -100., -100., -100.],\n", + " [-100., -100., -100., ..., -100., -100., -100.]]],\n", + "\n", + "\n", + " [[[ 0., 0., 0., ..., 0., 0., 0.],\n", + " [ 0., 0., 0., ..., 0., 0., 0.],\n", + " [ 1., 0., 0., ..., 0., 0., 0.],\n", + " ...,\n", + " [ 0., 0., 1., ..., 0., 0., 0.],\n", + " [ 0., 0., 0., ..., 0., 0., 0.],\n", + " [ 0., 0., 0., ..., 0., 0., 0.]]]],\n", + " dtype=torch.float64)}\n", + "holo_features {'holo_sequence_atom_mask_stacked': tensor([[[ 1, 1, 1, ..., -100, -100, -100]],\n", + "\n", + " [[ 0, 0, 0, ..., 1, 1, 1]]]), 'holo_input_sequence_residue_mask_stacked': tensor([[[ 1., 1., 1., ..., -100., -100., -100.]],\n", + "\n", + " [[ 0., 0., 0., ..., 1., 1., 1.]]],\n", + " dtype=torch.float64), 'holo_protein_coordinates_stacked': tensor([[[[ 7.5160, 41.8130, -8.8570],\n", + " [ 8.7190, 42.3560, -8.1650],\n", + " [ 8.9950, 41.4740, -6.9490],\n", + " ...,\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000]]],\n", + "\n", + "\n", + " [[[ 230.5450, 234.2060, 226.0810],\n", + " [ 231.5230, 235.2870, 226.0580],\n", + " [ 231.2910, 236.2520, 227.2160],\n", + " ...,\n", + " [ 196.5490, 215.8520, 201.2660],\n", + " [ 199.7080, 216.2970, 200.0450],\n", + " [ 200.3650, 216.3350, 201.3000]]]]), 'holo_protein_calpha_coordinates_stacked': tensor([[[[ 8.7190, 42.3560, -8.1650],\n", + " [ 10.4860, 39.8230, -5.9390],\n", + " [ 11.8770, 40.9130, -2.5670],\n", + " ...,\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000]]],\n", + "\n", + "\n", + " [[[ 231.5230, 235.2870, 226.0580],\n", + " [ 232.2750, 237.7080, 228.8840],\n", + " [ 230.1290, 240.8300, 228.7710],\n", + " ...,\n", + " [ 199.9050, 221.3250, 203.1790],\n", + " [ 197.6910, 220.7300, 200.1380],\n", + " [ 198.3370, 216.9720, 200.1220]]]])}\n", + "apo_features {'apo_sequence_atom_mask_stacked': tensor([[[ 1, 1, 1, ..., -100, -100, -100]],\n", + "\n", + " [[ 0, 0, 0, ..., 1, 1, 1]]]), 'apo_input_sequence_residue_mask_stacked': tensor([[[ 1., 1., 1., ..., -100., -100., -100.]],\n", + "\n", + " [[ 0., 0., 0., ..., 1., 1., 1.]]],\n", + " dtype=torch.float64), 'apo_protein_coordinates_stacked': tensor([[[[ 7.5160, 41.8130, -8.8570],\n", + " [ 8.7190, 42.3560, -8.1650],\n", + " [ 8.9950, 41.4740, -6.9490],\n", + " ...,\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000]]],\n", + "\n", + "\n", + " [[[ 230.5450, 234.2060, 226.0810],\n", + " [ 231.5230, 235.2870, 226.0580],\n", + " [ 231.2910, 236.2520, 227.2160],\n", + " ...,\n", + " [ 196.5490, 215.8520, 201.2660],\n", + " [ 199.7080, 216.2970, 200.0450],\n", + " [ 200.3650, 216.3350, 201.3000]]]]), 'apo_protein_calpha_coordinates_stacked': tensor([[[[ 8.7190, 42.3560, -8.1650],\n", + " [ 10.4860, 39.8230, -5.9390],\n", + " [ 11.8770, 40.9130, -2.5670],\n", + " ...,\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000]]],\n", + "\n", + "\n", + " [[[ 231.5230, 235.2870, 226.0580],\n", + " [ 232.2750, 237.7080, 228.8840],\n", + " [ 230.1290, 240.8300, 228.7710],\n", + " ...,\n", + " [ 199.9050, 221.3250, 203.1790],\n", + " [ 197.6910, 220.7300, 200.1380],\n", + " [ 198.3370, 216.9720, 200.1220]]]]), 'apo_sequence_to_holo_structure_mask_stacked': tensor([[[ 1., 1., 1., ..., -100., -100., -100.]],\n", + "\n", + " [[ 1., 1., 1., ..., 1., 1., 1.]]],\n", + " dtype=torch.float64)}\n", + "ligand_features {'input_conformer_ligand_feat_stack': tensor([[[[ 6, 0, 3, ..., 0, 0, 0],\n", + " [ 5, 0, 3, ..., 1, 0, 0],\n", + " [ 6, 0, 2, ..., 1, 0, 0],\n", + " ...,\n", + " [ 7, 0, 2, ..., 0, 0, 0],\n", + " [ 5, 1, 4, ..., 0, 0, 0],\n", + " [ 7, 0, 2, ..., 0, 0, 0]],\n", + "\n", + " [[ 11, 0, 0, ..., 0, 0, 0],\n", + " [-100, -100, -100, ..., -100, -100, -100],\n", + " [-100, -100, -100, ..., -100, -100, -100],\n", + " ...,\n", + " [-100, -100, -100, ..., -100, -100, -100],\n", + " [-100, -100, -100, ..., -100, -100, -100],\n", + " [-100, -100, -100, ..., -100, -100, -100]]],\n", + "\n", + "\n", + " [[[ 6, 0, 3, ..., 0, 0, 0],\n", + " [ 5, 0, 3, ..., 1, 0, 0],\n", + " [ 6, 0, 2, ..., 1, 0, 0],\n", + " ...,\n", + " [ 7, 0, 2, ..., 0, 0, 0],\n", + " [ 5, 1, 4, ..., 0, 0, 0],\n", + " [ 7, 0, 2, ..., 0, 0, 0]],\n", + "\n", + " [[-100, -100, -100, ..., -100, -100, -100],\n", + " [-100, -100, -100, ..., -100, -100, -100],\n", + " [-100, -100, -100, ..., -100, -100, -100],\n", + " ...,\n", + " [-100, -100, -100, ..., -100, -100, -100],\n", + " [-100, -100, -100, ..., -100, -100, -100],\n", + " [-100, -100, -100, ..., -100, -100, -100]]]]), 'input_conformer_ligand_coords_stack': tensor([[[[ 3.5436, 4.7221, 3.7442],\n", + " [ 2.8425, 3.5782, 3.3024],\n", + " [ 2.0904, 2.8365, 4.1430],\n", + " [ 1.4133, 1.7395, 3.7374],\n", + " [ 1.4559, 1.3265, 2.4581],\n", + " [ 2.1872, 2.0250, 1.5792],\n", + " [ 2.8843, 3.1510, 1.9873],\n", + " [ 3.5108, 3.6255, 0.8992],\n", + " [ 3.2053, 2.8139, -0.1408],\n", + " [ 2.3905, 1.8257, 0.2697],\n", + " [ 1.8797, 0.7934, -0.5912],\n", + " [ 0.5415, 0.4642, -0.2766],\n", + " [ 0.3601, -0.6050, -1.1617],\n", + " [ -0.9988, -1.2358, -1.0133],\n", + " [ -1.2115, -1.7359, 0.2612],\n", + " [ -2.7108, -2.4398, 0.4519],\n", + " [ -2.5795, -3.6998, 1.2645],\n", + " [ -3.7190, -1.3184, 1.2566],\n", + " [ -3.4311, -2.8472, -1.0197],\n", + " [ -5.0976, -2.9924, -0.9067],\n", + " [ -5.6865, -2.3938, -2.1875],\n", + " [ -5.7459, -2.1754, 0.3996],\n", + " [ -5.5483, -4.6346, -0.9163],\n", + " [ -4.5155, -5.4771, -1.9466],\n", + " [ -3.1270, -5.4103, -1.3407],\n", + " [ -5.0479, -7.0679, -2.0526],\n", + " [ -4.4940, -4.8001, -3.5007],\n", + " [ 1.4760, -1.5279, -0.7435],\n", + " [ 1.8900, -2.3743, -1.7459],\n", + " [ 2.5955, -0.5170, -0.4582],\n", + " [ 3.5784, -0.6258, -1.4338]],\n", + "\n", + " [[ -4.9906, 0.7136, -2.4319],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000]]],\n", + "\n", + "\n", + " [[[ 3.5436, 4.7221, 3.7442],\n", + " [ 2.8425, 3.5782, 3.3024],\n", + " [ 2.0904, 2.8365, 4.1430],\n", + " [ 1.4133, 1.7395, 3.7374],\n", + " [ 1.4559, 1.3265, 2.4581],\n", + " [ 2.1872, 2.0250, 1.5792],\n", + " [ 2.8843, 3.1510, 1.9873],\n", + " [ 3.5108, 3.6255, 0.8992],\n", + " [ 3.2053, 2.8139, -0.1408],\n", + " [ 2.3905, 1.8257, 0.2697],\n", + " [ 1.8797, 0.7934, -0.5912],\n", + " [ 0.5415, 0.4642, -0.2766],\n", + " [ 0.3601, -0.6050, -1.1617],\n", + " [ -0.9988, -1.2358, -1.0133],\n", + " [ -1.2115, -1.7359, 0.2612],\n", + " [ -2.7108, -2.4398, 0.4519],\n", + " [ -2.5795, -3.6998, 1.2645],\n", + " [ -3.7190, -1.3184, 1.2566],\n", + " [ -3.4311, -2.8472, -1.0197],\n", + " [ -5.0976, -2.9924, -0.9067],\n", + " [ -5.6865, -2.3938, -2.1875],\n", + " [ -5.7459, -2.1754, 0.3996],\n", + " [ -5.5483, -4.6346, -0.9163],\n", + " [ -4.5155, -5.4771, -1.9466],\n", + " [ -3.1270, -5.4103, -1.3407],\n", + " [ -5.0479, -7.0679, -2.0526],\n", + " [ -4.4940, -4.8001, -3.5007],\n", + " [ 1.4760, -1.5279, -0.7435],\n", + " [ 1.8900, -2.3743, -1.7459],\n", + " [ 2.5955, -0.5170, -0.4582],\n", + " [ 3.5784, -0.6258, -1.4338]],\n", + "\n", + " [[-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000]]]], dtype=torch.float64), 'resolved_ligand_mols_coords_stack': tensor([[[[ 30.1400, 40.3880, 11.0200],\n", + " [ 31.0780, 39.8150, 12.0170],\n", + " [ 30.9910, 41.1190, 9.8850],\n", + " [ 29.2670, 39.2270, 10.3590],\n", + " [ 27.6430, 41.3070, 11.7870],\n", + " [ 27.2340, 39.8820, 11.8670],\n", + " [ 27.1050, 42.0430, 13.1010],\n", + " [ 29.2540, 41.5340, 11.7690],\n", + " [ 26.5420, 41.2890, 9.2200],\n", + " [ 27.1640, 41.9540, 8.0510],\n", + " [ 26.9500, 39.7530, 9.2860],\n", + " [ 26.9450, 42.1220, 10.5570],\n", + " [ 24.9230, 41.3110, 9.1720],\n", + " [ 24.4030, 42.3840, 8.3910],\n", + " [ 23.1430, 41.8620, 7.6860],\n", + " [ 23.5560, 40.8410, 6.7240],\n", + " [ 22.1650, 41.1250, 8.6390],\n", + " [ 21.2730, 42.0020, 9.3510],\n", + " [ 21.4520, 40.1890, 7.6790],\n", + " [ 20.3750, 40.8770, 7.0330],\n", + " [ 22.5630, 39.7740, 6.6900],\n", + " [ 23.1690, 38.4980, 7.1320],\n", + " [ 24.3090, 38.3380, 7.8860],\n", + " [ 24.5440, 37.0800, 8.0940],\n", + " [ 23.5830, 36.3460, 7.4960],\n", + " [ 23.3060, 34.9590, 7.3800],\n", + " [ 24.1310, 34.0300, 7.9720],\n", + " [ 22.2200, 34.5690, 6.6820],\n", + " [ 21.4010, 35.4540, 6.0970],\n", + " [ 21.6230, 36.7690, 6.1830],\n", + " [ 22.6870, 37.2490, 6.8640]],\n", + "\n", + " [[ 27.5420, 38.4510, 10.5530],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000]]],\n", + "\n", + "\n", + " [[[ 236.8440, 371.6330, 242.7170],\n", + " [ 235.9500, 370.4400, 242.6970],\n", + " [ 236.0890, 372.9630, 242.8240],\n", + " [ 237.8090, 371.6990, 241.5290],\n", + " [ 238.3200, 372.5790, 245.1500],\n", + " [ 237.5610, 372.4130, 246.4060],\n", + " [ 238.3400, 373.9910, 244.5680],\n", + " [ 237.7930, 371.6050, 244.0060],\n", + " [ 240.9550, 372.1690, 246.4430],\n", + " [ 241.6140, 373.4900, 246.4880],\n", + " [ 240.2950, 371.7270, 247.7480],\n", + " [ 239.8350, 372.1130, 245.3080],\n", + " [ 241.9830, 371.0530, 246.0020],\n", + " [ 241.5870, 369.9640, 245.1430],\n", + " [ 242.7010, 368.9530, 245.0960],\n", + " [ 242.1730, 367.7290, 245.6540],\n", + " [ 243.0350, 368.5770, 243.6570],\n", + " [ 244.2060, 369.3130, 243.3270],\n", + " [ 243.4830, 367.1290, 243.8150],\n", + " [ 244.6790, 367.1680, 244.5810],\n", + " [ 242.4230, 366.6330, 244.7930],\n", + " [ 241.1660, 366.3460, 244.1140],\n", + " [ 240.0100, 367.0780, 244.1760],\n", + " [ 239.0260, 366.5880, 243.4620],\n", + " [ 239.5730, 365.4500, 242.8880],\n", + " [ 239.0460, 364.4780, 242.0160],\n", + " [ 237.7930, 364.4980, 241.5500],\n", + " [ 239.8600, 363.4690, 241.6340],\n", + " [ 241.1120, 363.4440, 242.0960],\n", + " [ 241.7190, 364.3020, 242.9190],\n", + " [ 240.8920, 365.2880, 243.2810]],\n", + "\n", + " [[-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000]]]], dtype=torch.float64)}\n" + ] + } + ], "source": [ "for k, v in test_torch[\"features_and_coords\"].items():\n", " print(k, v)" @@ -148,18 +741,82 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "dict_keys(['sequence_features', 'holo_features', 'apo_features', 'ligand_features'])" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "test_torch[\"features_and_coords\"].keys()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "{'apo_sequence_atom_mask_stacked': tensor([[[ 1, 1, 1, ..., -100, -100, -100]],\n", + " \n", + " [[ 0, 0, 0, ..., 1, 1, 1]]]),\n", + " 'apo_input_sequence_residue_mask_stacked': tensor([[[ 1., 1., 1., ..., -100., -100., -100.]],\n", + " \n", + " [[ 0., 0., 0., ..., 1., 1., 1.]]],\n", + " dtype=torch.float64),\n", + " 'apo_protein_coordinates_stacked': tensor([[[[ 7.5160, 41.8130, -8.8570],\n", + " [ 8.7190, 42.3560, -8.1650],\n", + " [ 8.9950, 41.4740, -6.9490],\n", + " ...,\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000]]],\n", + " \n", + " \n", + " [[[ 230.5450, 234.2060, 226.0810],\n", + " [ 231.5230, 235.2870, 226.0580],\n", + " [ 231.2910, 236.2520, 227.2160],\n", + " ...,\n", + " [ 196.5490, 215.8520, 201.2660],\n", + " [ 199.7080, 216.2970, 200.0450],\n", + " [ 200.3650, 216.3350, 201.3000]]]]),\n", + " 'apo_protein_calpha_coordinates_stacked': tensor([[[[ 8.7190, 42.3560, -8.1650],\n", + " [ 10.4860, 39.8230, -5.9390],\n", + " [ 11.8770, 40.9130, -2.5670],\n", + " ...,\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000],\n", + " [-100.0000, -100.0000, -100.0000]]],\n", + " \n", + " \n", + " [[[ 231.5230, 235.2870, 226.0580],\n", + " [ 232.2750, 237.7080, 228.8840],\n", + " [ 230.1290, 240.8300, 228.7710],\n", + " ...,\n", + " [ 199.9050, 221.3250, 203.1790],\n", + " [ 197.6910, 220.7300, 200.1380],\n", + " [ 198.3370, 216.9720, 200.1220]]]]),\n", + " 'apo_sequence_to_holo_structure_mask_stacked': tensor([[[ 1., 1., 1., ..., -100., -100., -100.]],\n", + " \n", + " [[ 1., 1., 1., ..., 1., 1., 1.]]],\n", + " dtype=torch.float64)}" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "test_torch[\"features_and_coords\"][\"apo_features\"]" ] diff --git a/docs/examples/data-access.ipynb b/docs/examples/data-access.ipynb new file mode 100644 index 00000000..edfa8941 --- /dev/null +++ b/docs/examples/data-access.ipynb @@ -0,0 +1,582 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Access _PLINDER_ data for training ML models\n", + "\n", + "The goal of this tutorial is to provide a simple and simple hands-on demo for a new user to access _PLINDER_ dataset in prepparation for training machine learning models.\n", + "\n", + "Here, we are going to demonstrate how to get the key input data:\n", + "- protein receptor fasta sequence\n", + "- small molecules ligand SMILES string\n", + "- access to linked _apo_ and _pred_ structure\n", + "\n", + "\n", + "In the process, we will show:\n", + "- How to download the _PLINDER_ data\n", + "- How to query _PLINDER_ index and splits to select relevant data using `plinder.core` API\n", + "- Extract task-specific data one might want to use for training a task-specific ML model, eg. one protein, one ligand\n", + "- How to use `plinder.core` API and `PlinderDataset` class to supply dataset inputs for `train` or `val` splits\n", + "- Load linked `apo` and `pred` structures\n", + "- Example how to create a simple diversity sampler based on cluster labels" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Download _PLINDER_\n", + "To download, run: `plinder_download --release 2024-06 --iteration v2 --yes`
\n", + "This will download and unpack all neccesary files. For more information on download check out [Dataset Tutorial](https://plinder-org.github.io/plinder/tutorial/dataset.html#getting-the-data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## Loading _PLINDER_\n", + "\n", + "We recommend users interact with the dataset using _PLINDER_ Python API.\n", + "\n", + "To install the API run: ``pip install plinder[loader]``. If you are using zsh terminal, you will have to quote the package like ``\"plinder[loader]\"``" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "\n", + "from __future__ import annotations\n", + "import os\n", + "import pandas as pd\n", + "from plinder.core.scores import query_index\n", + "\n", + "os.environ[\"PLINDER_OFFLINE\"] = \"true\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load _PLINDER_ index with selected columns from annotations table\n", + "For a full list with descriptions, please refer to [docs](https://plinder-org.github.io/plinder/dataset.html#annotation-tables-index)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# get plinder index with selected annotation columns specified\n", + "plindex = query_index(\n", + " columns=[\"system_id\", \"ligand_id\",\n", + " \"ligand_rdkit_canonical_smiles\", \"ligand_is_ion\",\n", + " \"ligand_is_artifact\", \"system_num_ligand_chains\",\n", + " \"system_num_neighboring_protein_chains\"],\n", + " filters=[\n", + " (\"system_type\", \"==\", \"holo\"),\n", + " (\"system_num_neighboring_protein_chains\", \"<=\", 5)\n", + " ]\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plindex.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Display number of system neighboring protein chains\n", + "plindex.groupby(\"system_num_neighboring_protein_chains\").system_id.count()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Extracting specific data using _PLINDER_ annotations\n", + "As we can see just from the data tables above - a significant fraction of _PLINDER_ systems contain complex multi protein chain systems." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Task specific selection\n", + "If we would like to focus on single protein and single ligand systems for training, we can use the annotated columns to filter out systems that:\n", + "- contain only one protein chain\n", + "- only one ligand\n", + "\n", + "Remember: In _PLINDER_ artifacts and (single atom) ions are also included in the index if they are part of the pocket.\n", + "- We can use columns `ligand_is_ion` and `ligand_is_artifact` to only select \"proper\" ligands.\n", + "\n", + "Let's find out how many annotated ligands are \"proper\"." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# define \"proper\" ligands that are not ions or artifacts\n", + "plindex[\"ligand_is_proper\"] = (\n", + " ~plindex[\"ligand_is_ion\"] & ~plindex[\"ligand_is_artifact\"]\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plindex.groupby(\"ligand_is_proper\").system_id.count()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### User choice\n", + "\n", + "The annotations table gives flexibility to choose the systems for training:\n", + "- One could strictly choose to use only the data that contains single protein single ligand systems\n", + "- Alternatively one could expand the number of systems to include systems containing single proper ligands, and optionally ignore the artifacts and ions in the pocket\n", + "\n", + "Let's compare the numbers of such systems!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# create mask for single receptor single ligand systems\n", + "systems_1p1l = (plindex[\"system_num_neighboring_protein_chains\"] == 1) & (plindex[\"system_num_ligand_chains\"] == 1)\n", + "\n", + "# make count of these \"proper\" ligands per system\n", + "plindex[\"system_proper_num_ligand_chains\"] = plindex.groupby(\"system_id\")[\"ligand_is_proper\"].transform(\"sum\")\n", + "\n", + "# create mask only for single receptor single \"proper\" ligand systems\n", + "systems_proper_1p1l = (plindex[\"system_num_neighboring_protein_chains\"] == 1) & (plindex[\"system_proper_num_ligand_chains\"] == 1) & plindex[\"ligand_is_proper\"]\n", + "\n", + "print(f\"Number of single receptor single ligand systems: {sum(systems_1p1l)}\")\n", + "print(f\"Number of single receptor single \\\"proper\\\" ligand systems: {sum(systems_proper_1p1l)}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we can see - the second choice can provide up to 20% more data for training, however, the caveat is that some of the interactions made by artifacts or ions may influence the binding pose of the \"proper\" ligand. The user could come up with further strategies to filtering using annotations table or external tools, but this is beyond the scope of this tutorial." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Loading splits\n", + "\n", + "Now, after curating the systems of interest, let's have a look at the splits using _PLINDER_ API.\n", + "\n", + "- How to use {mod}`plinder.core` API and class {class}`PlinderDataset` class to supply dataset inputs for `train` or `val` splits" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from plinder.core import get_split" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Getting the splits\n", + "\n", + "The `get_split` function provided the current _PLINDER_ split, the detailed description of this DataFrame is provide in the [dataset documentation](https://plinder-org.github.io/plinder/dataset.html#splits-splits), but for our practical purposes we are mostly interested in `system_id` and `split` that assigns each of our systems to a specific split category." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# get the current plinder split\n", + "split_df = get_split()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "split_df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Some specific method developers working on _flexible_ docking may also find handy the annotation column `system_has_apo_or_pred` indicating if the system has available `apo` or `pred` linked structures (see later)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "split_df.groupby([\"split\", \"system_has_apo_or_pred\"]).system_id.count()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For simplicity let's merge plindex and split DataFrames into one" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# merge to a single DataFrame\n", + "plindex_split = plindex.merge(split_df, on=\"system_id\", how=\"left\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Getting links to `apo` or `pred` structures\n", + ":::{currentmodule} plinder.core:::\n", + "For users interested in including `apo` and `pred` structures in their workflow, all the information needed can be obtained from the function {func}`query_links`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from plinder.core.scores import query_links" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "links_df = query_links(\n", + " columns=[\"reference_system_id\", \"id\", \"sort_score\"],\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note the table is sorted by `sort_score` that is resolution for `apo`s and `plddt` for `pred`s. The `apo` or `pred` is specified in the additionally added `kind` column." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "links_df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If a user wants to consider only one linked structure per system - we can easily drop duplicates, first sorting by `sort_score`. Using this priority score, `pred` structures will not be used unless there is no `apo` available. Alternative can be achieved by sorting with `ascending=False`, or filtering by `kind==\"pred\"` column." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "single_links_df = links_df.sort_values(\"sort_score\", ascending=True).drop_duplicates(\"reference_system_id\")\n", + "single_links_df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that we have links to `apo` / `pred` structures, we can see how many of those are available for our single protein single ligand systems" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plindex_split[systems_1p1l].groupby([\"split\", \"system_has_apo_or_pred\"]).system_id.count()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plindex_split_1p1l_links = plindex_split[systems_1p1l].merge(single_links_df, left_on=\"system_id\", right_on=\"reference_system_id\", how=\"left\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# let's check how many systems have linked structures\n", + "plindex_split_1p1l_links['system_has_linked_apo_or_pred'] = ~plindex_split_1p1l_links.filename.isna()\n", + "plindex_split_1p1l_links.groupby([\"split\", \"system_has_linked_apo_or_pred\"]).system_id.count()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Selecting final dataset\n", + "Let's select only the set that has linked structures for flexible docking" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plindex_final_df = plindex_split_1p1l_links[\n", + " (plindex_split_1p1l_links.system_has_linked_apo_or_pred) & (plindex_split_1p1l_links.split != \"removed\")\n", + "]\n", + "plindex_final_df.groupby([\"split\", \"system_has_linked_apo_or_pred\"]).system_id.count()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plindex_final_df[[\"ligand_rdkit_canonical_smiles\", \"filename\"]].iloc[0].filename" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Using _PLINDER_ API to load dataset by split" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from plinder.core import PlinderDataset\n", + "from plinder.core.loader import get_model_input_files" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "train_dataset = PlinderDataset(\n", + " df=plindex_final_df,\n", + " split=\"train\",\n", + " num_alternative_structures=2,\n", + " file_paths_only=True,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + ":::{currentmodule} plinder.core:::" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + ":::{note} function {func}`get_model_input_files` accepts `split =` \"train\", \"val\" or \"test\":::" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sample_dataset = get_model_input_files(\n", + " plindex_final_df,\n", + " split = \"val\",\n", + " max_num_sample = 10,\n", + " num_alternative_structures = 1,\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "note, if files not already available this downloads them to `~/.local/share/plinder/{PLINDER_RELEASE}/{PLINDER_ITERATION}` directory" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Inspect data\n", + "sample_dataset[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Using _PLINDER_ clusters in sampling" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Define diversity sampler function\n", + ":::{currentmodule} plinder.core:::\n", + "\n", + "In general, diversity can be sampled using cluster information described [here](https://plinder-org.github.io/plinder/dataset.html#clusters-clusters). All cluster information can easily be added to `plindex` by calling the following function {func}`get_extended_plindex`.
\n", + "Here, we have provided an example of how one might use the function `get_diversity_samples` which is based on `torch.utils.data.WeightedRandomSampler`. This example is meant for demonstration purposes and users are encouraged to come up with sampling strategy that suits their need.
\n", + "For this example, we are going to use the sample dversity based on the following parameters:\n", + "`metric=\"pli_qcov\"`, `threshold=70` and `cluster=communities`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from plinder.core.loader import get_diversity_samples\n", + "from plinder.core import get_extended_plindex\n", + "from typing import Literal\n", + "\n", + "# Example sampler function, this is for demonstration purposes,\n", + "# users are advised to write a sampler that suit their need\n", + "def get_diversity_samples(\n", + " split_df: pd.DataFrame,\n", + " split: Literal[\"train\", \"val\", \"test\"] = \"train\",\n", + " metric: str = \"pli_qcov\",\n", + " threshold: int = 70,\n", + " cluster_type: str = \"communities\"):\n", + "\n", + " from torch.utils.data import WeightedRandomSampler\n", + "\n", + " split_df = split_df[split_df.split == split]\n", + " cluster_counts = (split_df[f\"{metric}__{threshold}__{cluster_type}\"]\\\n", + " .value_counts().rename(\"cluster_count\"))\n", + " split_df = split_df.merge(\n", + " cluster_counts,\n", + " left_on=f\"{metric}__{threshold}__{cluster_type}\",\n", + " right_index=True)\n", + " split_df.reset_index(inplace=True)\n", + " cluster_weights = 1.0 / split_df.cluster_count.values\n", + " sampler = WeightedRandomSampler(\n", + " weights=cluster_weights,\n", + " num_samples=len(cluster_weights))\n", + " sampler_index = [i for i in sampler]\n", + " return split_df.loc[\n", + " tuple(sampler_index),\n", + " (\"system_id\", \"split\")].drop_duplicates()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Note, this takes a couple of minutes to run\n", + "plindex_extended = get_extended_plindex()\n", + "cluster_columns = [\"system_id\"] + [col for col in plindex_extended.columns \\\n", + " if (\"communities\" in col) or (\"component\" in col)]\n", + "plindex_with_clusters = plindex_final_df.merge(plindex_extended[cluster_columns], on=\"system_id\", how=\"left\")\n", + "sampled_df = get_diversity_samples(split_df=plindex_with_clusters,\n", + " metric=\"pli_qcov\",\n", + " threshold=70,\n", + " cluster_type=\"communities\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The returned dataframe could then be passed to {func}`get_model_input_files` the same way `plindex_final_df` was used above." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.18" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/examples/loader_examples.ipynb b/docs/examples/loader_examples.ipynb new file mode 100644 index 00000000..2ff056b0 --- /dev/null +++ b/docs/examples/loader_examples.ipynb @@ -0,0 +1,1138 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Structure, Systems, Dataset and Loader Tutorial" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Topics:\n", + "- Interacting with `Structure` class\n", + "- Interacting `PlinderSystem`\n", + "- Interacting `PlinderDataset`\n", + "- Loader\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## Setup\n", + "\n", + "### Installation\n", + "\n", + "`plinder` is available on *PyPI*.\n", + "\n", + "```\n", + "pip install plinder\n", + "```\n", + "\n", + "### Environment variable configuration\n", + ":::{note}\n", + "We need to set environment variables to point to the release and iteration of choice.\n", + "For the sake of demonstration, this will be set to point to a smaller tutorial example\n", + "dataset, which are `PLINDER_RELEASE=2024-06` and `PLINDER_ITERATION=tutorial`.\n", + ":::\n", + ":::{note}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Getting the configuration\n", + "\n", + "At first we get the configuration to check that all parameters are correctly set. \n", + "In the snippet below, we will check, if the local and remote *PLINDER* paths point to\n", + "the expected location." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import plinder.core.utils.config\n", + "\n", + "cfg = plinder.core.get_config()\n", + "print(f\"local cache directory: {cfg.data.plinder_dir}\")\n", + "print(f\"remote data directory: {cfg.data.plinder_remote}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data ecosystem overview\n", + "This tutorial assumes user have downloaded _PLINDER_ dataset before now. While the examples will run without users doing anything, we encourage users to download the data for performance sake. _PLINDER_ data hierarchy is shown below. We have organized this tutorial to follow this same hierarchy from ground up\n", + "![image](../static/asset/data/plinder_data_hierarchy.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 0. Structure files" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After download all files will be store locally at `~/.local/share/plinder/${PLINDER_RELEASE}/${PLINDER_ITERATION}/systems`. The current default is `PLINDER_RELEASE=2024-06` and `PLINDER_ITERATION-v2`\n", + "\n", + "There, we have sub-folders that corresponds to each systems. In each sub-folder, we have:\n", + "- Receptor PDB: receptor.cif and receptor.pdb\n", + "- Ligand SDF's: `..sdf`. For complexes with more than one ligands, all the sdfs are saved separately.\n", + "- Sequence fasta: sequence.fasta\n", + "For more information on the file organization, see \"\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Structure Python Abstraction\n", + "To make interacting with our data seamless, {class} class Structure, a pydantic data class that:\n", + "- Loads all the structure files + smiles \n", + "- Gets coordinates\n", + "- Featurizes residues and atoms of associated protein and ligand molecules\n", + "- Masks molecules to account for resolved vs unresolved part\n", + "\n", + "To interact with the example, do the following:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load the structure for a given system_id\n", + "For this purpose we will use `\"1avd__1__1.A__1.C\"` as our example system id." + ] + }, + { + "cell_type": "code", + "execution_count": 295, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-09-23 10:15:26,737 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-09-23 10:15:26,737 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-09-23 10:15:26,867 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-09-23 10:15:26,868 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-09-23 10:15:26,868 | plinder.core.index.utils:148 | INFO : loading entries from 1 zips\n", + "2024-09-23 10:15:26,871 | plinder.core.index.utils:163 | INFO : loaded 1 entries\n", + "2024-09-23 10:15:26,872 | plinder.core.index.utils.load_entries:24 | INFO : runtime succeeded: 0.13s\n" + ] + } + ], + "source": [ + "from plinder.core.structure.structure import Structure\n", + "from plinder.core import PlinderSystem\n", + "from pathlib import Path\n", + "\n", + "from biotite.sequence.io.fasta import FastaFile\n", + "\n", + "input_smiles = \"CC(=O)N[C@@H]1[C@H]([C@@H]([C@H](O[C@H]1O)CO)O)O\" # Need to account for unresolved part of the ligand\n", + "input_sdf = Path(cfg.data.plinder_dir)/\"systems/1avd__1__1.A__1.C/ligand_files/1.C.sdf\"\n", + "system_id = \"1avd__1__1.A__1.C\"\n", + "protein_structure_path = Path(cfg.data.plinder_dir)/\"systems/1avd__1__1.A__1.C/receptor.cif\"\n", + "input_sequence_path = Path(cfg.data.plinder_dir)/\"systems/1avd__1__1.A__1.C/sequences.fasta\"\n", + "list_ligand_sdf_and_input_smiles = [\n", + " (input_sdf,input_smiles)]\n", + "\n", + "input_sequences = {k: v for k, v in FastaFile.read_iter(input_sequence_path)}\n", + "\n", + "# Load holo structure\n", + "holo_struc = PlinderSystem(system_id=system_id).holo_structure" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Show fields\n", + "holo_struc.model_fields" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### List fields\n", + "- We list all fields and their `FieldInfo` to show which ones are required. `id`, `protein_path` and `protein_sequence` are required. Everything else is optionally. Particularly worth mentioning is the decision to make `list_ligand_sdf_and_input_smiles` optional; this is because ligand will not be availbale in apo and predicted structures.\n", + "- Out of these field `ligand_mols` and `protein_atom_array` is computed within the object if set to default. \n", + "- `ligand_mols` returns a chain-mapped dictionary of of the form:\n", + " ```python\n", + " {\n", + " \".\": (\n", + " RDKit 2D mol from template SMILES of type `Chem.Mol`,\n", + " RDKit mol from template SMILES with random 3D conformer of type `Chem.Mol`,\n", + " RDKit mol of solved (holo) ligand structure of type `Chem.Mol`,\n", + " paired stacked arrays (template vs holo) mapping atom order by index of type `tuple[NDArray.int_, NDArray.int_]`\n", + " )\n", + "\n", + " }\n", + " ```\n", + "- While `protein_atom_array` returns [biotite AtomArray](https://www.biotite-python.org/latest/apidoc/biotite.structure.AtomArray.html) of the receptor protein structure.\n", + "- `add_ligand_hydrogens` specifies whether to adds hydrogens to ligand\n", + "- `structure_type`: could be `\"holo\"`, `\"apo\"` or `\"pred\"`" + ] + }, + { + "cell_type": "code", + "execution_count": 296, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'1.C': (,\n", + " ,\n", + " ,\n", + " (array([[13, 4, 5, 7, 9, 10, 1, 0, 3, 6, 8, 12, 11, 2]]),\n", + " array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]])))}" + ] + }, + "execution_count": 296, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Inspect ligand_mols\n", + "holo_struc.ligand_mols" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "holo_struc.ligand_smiles" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Inspect protein_atom_araay" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "holo_struc.protein_atom_array[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### List structure protein properties\n", + "Show protein related properties" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for property in holo_struc.get_properties():\n", + " if \"protein\" in property:\n", + " print(property)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Protein backbone mask\n", + "This is a boolean mask that can be used to select backbone atoms from biotite `AtomArray`. The indices of `True` corresponds to backbone indices." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "holo_struc.protein_backbone_mask" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Protein Calpha mask\n", + "This shows the mask of calpha atoms" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "holo_struc.protein_calpha_mask" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get protein chain ordered\n", + "This gives a list of protein chains ordered by how they are in the structure" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "holo_struc.protein_chain_ordered" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get protein chain ordered\n", + "This gives a list of protein chains ordered by how they are in the structure" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get protein chains for all atoms\n", + "The list of chain IDs in the structure. Order of how they appear not kept." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "holo_struc.protein_chains" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get protein coordinates\n", + "This property gets the 3D positions of each of the atoms in protein molecules" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "holo_struc.protein_coords" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get number of atoms of protein molecule" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "holo_struc.protein_n_atoms" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get protein structure atom names\n", + "Returns all atoms names the same way they appear in the structure" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "holo_struc.protein_unique_atom_names" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get protein b-factors\n", + "Get protein atom occupancies. If not available in a structure, it's set to zero." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "holo_struc.protein_structure_b_factor" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get protein residue names" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "holo_struc.protein_unique_residue_names" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get protein residues number\n", + "Residue number as they appear in structure" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "holo_struc.protein_unique_residue_ids" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get sequence from protein structure\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "holo_struc.protein_sequence_from_structure" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "holo_struc.protein_sequence" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get tokenized sequence\n", + "Get tensor of sequence converted to integer-based amino acid token" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "holo_struc.protein_structure_tokenized_sequence" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Inspect holo sequences\n", + "Returns a chain-mapped dictionary of sequences from seqres\n", + "```python\n", + "{\n", + " \".\": sequence of type `str`\n", + "\n", + "}\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "holo_struc.protein_sequence" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "holo_struc.filter(\n", + " property=\"atom_name\",\n", + " mask=\"CA\",\n", + "\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### List ligand properties\n", + "Show ligand related properties" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for property in holo_struc.get_properties():\n", + " if \"ligand\" in property:\n", + " print(property)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + ":::{todo}\n", + "\n", + "The input ligands are provided using dictionaries.\n", + "These dictionaries contain information for each ligand:\n", + "- input_ligand_templates: 2D RDKit mols generated from RDKit canonical SMILES (taken from annotation table)\n", + "- input_ligand_conformers: 3D (random) conformers generated for each input mol\n", + "- input_ligand_conformers_coords: positional coordintates for 3D conformers\n", + "- resolved_ligand_mols: RDKit mols of solved (holo) ligand structures\n", + "- resolved_ligand_mols_coords: positional coordintates for holo ligand structures\n", + "- ligand_template2resolved_atom_order_stacks: paired stacked arrays (template vs holo) mapping atom order by index\n", + "- ligand_chain_ordered: ordered list of all ligands by their keys\n", + "\n", + ":::" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Ligand atom id mapping mapping\n", + "\n", + "Unlike the protein sequence - there is no canonical order to ligand atoms in the molecule.\n", + "It can be further complicated by automorphisms present in the structure due to symmetry, i.e. there is more than one match that is possible between the structures.\n", + "\n", + "This is important when calculating ligand structure loss, as the most optimal atom order can change between the different inference results. Typically, it is accepted to take the atom ordering resulting in the best objective score and use that for the loss calculation.\n", + "\n", + "Occasionally futher ambiguity arises to to part of the ligand structure being unresolved in the holo structure - this can lead to multiple available matches. We use RascalMCES algorithm from RDKit to provide all the possible matches between the atom order in the input structure (from SMILES) to the resolved holo structure.\n", + "\n", + "This is provided as stacks of atom order arrays that reorder the template and holo indices to provide matches. Each stack is a unique order transformation and should be iterated." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Ligand conformer to input smiles mapping\n", + "\n", + "Each RDKit ligand mol that is generated from SMILES matches the atom order that is in the starting SMILES.\n", + "This order is retained when 3D conformer is generated.\n", + "\n", + "! NOTE: While we ensure that each PLINDER ligand can be loaded and sanitized into RDKit 2D molecule, some ligands may struggle to generate sanitizeable 3D conformers. We nonetheless are trying to provide each ligand with as sensible starting structure as possible and make it accessible via coordinate arrays." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# sample_system_2 = PlinderSystem(\n", + "# system_id=\"102m__1__1.A__1.C\",\n", + "# )\n", + "# sample_system_2.holo_structure.ligand_mols['1.C'][1]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "holo_struc.ligand_template2resolved_atom_order_stacks" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Below we use RDKit functionality to draw indixes for `'1.C'` ligand 2D, conformer and holo structures" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from rdkit.Chem.Draw import IPythonConsole\n", + "IPythonConsole.drawOptions.addAtomIndices = True" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "holo_struc.input_ligand_templates[\"1.C\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "holo_struc.input_ligand_conformers[\"1.C\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "holo_struc.resolved_ligand_mols[\"1.C\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Ligand conformer coordinates\n", + "\n", + "As you can tell, the input 2D and 3D conformer indices match, but the resolved ligand is different.\n", + "Thus to perform a correct comparison for their coordinates one should use atom order stacks.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "input_atom_order_stack, holo_atom_order_stack = holo_struc.ligand_template2resolved_atom_order_stacks[\"1.C\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "holo_struc.resolved_ligand_mols_coords['1.C']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "holo_struc.input_ligand_conformers_coords['1.C'][holo_atom_order_stack]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Interacting with PLINDER systems\n", + "PlinderSystem is the next layer of abstraction above `Structure`. It provides encapsulation around all structures associated with a particular `system_id`. With these, we can access the `holo` and alternate (`apo` and `pred`) structure." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sample_system = PlinderSystem(\n", + " system_id=\"1avd__1__1.A__1.C\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Check holo structure\n", + "Since having `holo` structure is a defining feature of _PLINDER_ system, holo structures is by definition available for all systems " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sample_system.holo_structure" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get annotations \n", + "This `system` property returns `json` data of annotations for a the system in question. To get the annotations of all other systems sharing the same PDB entry ids, use `.entry` property." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sample_system.system" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get paths of the underlying structure files" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`archive` points to the subfolder where all the files (except `apo` and `pred` files) relating to a given system are stored" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sample_system.archive" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Similarly, the `system.cif`, `receptor.cif`, `receptor.pdb`, `sequence.fasta`, and ligand sdfs can be accessed via `.system_cif`, `.receptor_cif`, `.receptor_pdb`, `.sequence_fasta` and `.ligand_sdf` properties respectively. \n", + "\n", + "To get all the paths of the structures together, use `.structures`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sample_system.structures" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sample_system.system_cif" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get binding site water (`.water_mapping`)\n", + "This returns the information about binding site water " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sample_system.water_mapping" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Chain mapping \n", + ":::{todo}\n", + "Confirm with Jay\n", + ":::\n", + "\n", + "`.chain_mapping` maps chain ids in system (`.`) to PDB author chain ids " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sample_system.chain_mapping" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "linked_structures, linked_archive, get_linked_structure \n", + "linked_archive, linked_structures, get_linked_structure, alt_structures" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Linked apo and predicted structures.\n", + "The following properties provides different kind of information about linked structures as described below:\n", + "- `.linked_archive`: returns paths the local subfolder where the linked structures are saved; \n", + "- `.linked_structures`: returns the dataframe of linked structures along with all their metrics while \n", + "- `.get_linked_structure`: gives the path to a specific linked structure.\n", + "- `.best_linked_structures_paths`: Gives the best linked structures based on `scrmsd_wave` which is average symmetry-corrected RMSD across mapped ligands weighted by number of atoms. This selects maximum of two alternate structure with at most one `apo` and `pred` each when available\n", + "- `.alt_structures`: returns the dictionary`Structure` object of the best `apo` and `pred` which the corresponding `holo` chain as key" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sample_system.linked_archive" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sample_system.linked_structures\n", + "# TODO AttributeError: 'PlinderSystem' object has no attribute 'linked_structure'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sample_system.get_linked_structure(link_kind=\"apo\", link_id='1vyo_B')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sample_system.alternate_structures" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get `Openstructure` entities and views\n", + "`.receptor_entity` returns receptor `mol.EntityHandle` object\n", + "`.ligand_views` returns `mol.ResidueView` for all ligands\n", + "\n", + ":::{note}\n", + "You must have Openstructure installed to use this property\n", + ":::\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Others properties\n", + "This includes:\n", + "- `num_ligands`: Number of ligand chains\n", + "- `smiles`: Ligand smiles dictionary\n", + "- `num_proteins`: Number of protein chains\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Interacting with the PLINDER dataset\n", + "`PlinderDataset` provides an interface to interact with _PLINDER_ data as a dataset. It is a subclass of `torch.utils.data.Dataset`, as such subclassing it and extending should be familiar to most users. Flexibility and general applicability is our top concern when designing this interface and `PlinderDataset` allows users to not only define their own split but to also bring their own featurizer.\n", + "It can be initialized with the following parameters\n", + "```\n", + "Parameters\n", + " ----------\n", + " df : pd.DataFrame | None\n", + " the split to use\n", + " split : str\n", + " the split to sample from\n", + " split_parquet_path : str | Path, default=None\n", + " split parquet file\n", + " input_structure_priority : str, default=\"apo\"\n", + " Which alternate structure to proritize\n", + " featurizer: Callable[\n", + " [Structure, int], dict[str, torch.Tensor]\n", + " ] = structure_featurizer,\n", + " Transformation to turn structure to input tensors\n", + " padding_value : int\n", + " Value for padding uneven array\n", + " **kwargs : Any\n", + " Any other keyword args\n", + "``` " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from plinder.core.loader import PlinderDataset" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Make _PLINDER_ training dataset with default parameters\n", + "When no parameter is set, PlinderDataset automatically defaults to the training set of the most current version of the dataset. To change this behaviour, we can explicitly pass a data frame to the parameter `df` or split file to `split_parquet_path`. Either of these must have at least two columns named `system_id` and `split`. This also use our default featurizer `plinder.core.loader.featurizer.featurizer`. \n", + "NOTE: We have provided this `plinder.core.loader.featurizer.featurizer` as an example featurizer; users are encourage to use featurizers that suit their need." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "train_dataset = PlinderDataset(split=\"train\")\n", + "#train_dataset = PlinderDataset(df=splits_df[splits_df.system_id ==\"6pl9__1__1.A__1.C\"])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "test_data = train_dataset[1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "test_data[110]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Loader" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "train_loader = get_torch_loader(\n", + " train_dataset\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for data in train_loader:\n", + "\n", + " test_torch = data\n", + " break\n", + " #for k, v in test_torch['input_features'].items():\n", + " # if v.shape[1] > 1:\n", + " # break" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "test_torch.keys()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "test_torch['system_ids']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for k, v in test_torch['features_and_coords'].items():\n", + " print(k, v.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "holo_struc.ligand_mols" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "holo_struc.input_ligand_conformer2resolved_stacks" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "holo_struc = Structure.load_structure(\n", + " id=system_id,\n", + " protein_path=protein_structure_path,\n", + " protein_sequence=input_sequence_path,\n", + " list_ligand_sdf_and_input_smiles=list_ligand_sdf_and_input_smiles\n", + "\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "struct = Structure.load_structure(id=\"102m__1__1.A__1.C\",\n", + " protein_path=Path(\"/Users/yusuf/.local/share/plinder/2024-06/v2/systems/102m__1__1.A__1.C/receptor.cif\"),\n", + " list_ligand_sdf_and_input_smiles=[(Path(\"/Users/yusuf/.local/share/plinder/2024-06/v2/systems/102m__1__1.A__1.C/ligand_files/1.C.sdf\"),\n", + " \"C=CC1=C(C)C2=Cc3c(C)c(CCC(=O)O)c4n3[Fe]35<-N6=C(C=c7c(C=C)c(C)c(n73)=CC1=N->52)C(C)=C(CCC(=O)O)C6=C4\")],\n", + " protein_sequence=Path(\"/Users/yusuf/.local/share/plinder/2024-06/v2/systems/102m__1__1.A__1.C/sequence.fasta\")\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "struct.input_ligand_conformers" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "struct.ligand_mols" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/docs/examples/mlsb_data_access.ipynb b/docs/examples/mlsb_data_access.ipynb new file mode 100644 index 00000000..768bbe50 --- /dev/null +++ b/docs/examples/mlsb_data_access.ipynb @@ -0,0 +1,837 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# MLSB/PLINDER Data Access\n", + "(mlsb-notebook-target)=\n", + "\n", + "The goal of this tutorial is to provide background information for the MLSB/PLINDER challenge, as well as a simple hands-on demo for how participants can access and use the _PLINDER_ dataset. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Background information \n", + "\n", + "For background information on the rules of the challenge, see [MLSB/P(L)INDER challenge rules](#mlsb-rules-target) for more information." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Accessing and loading data for training " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here, we are going to demonstrate how to get the key input data:\n", + "- protein receptor fasta sequence\n", + "- small molecules ligand SMILES string\n", + "- access to linked _apo_ and _pred_ structure\n", + "\n", + "\n", + "In the process, we will show:\n", + "- How to download the _PLINDER_ data\n", + "- How to query _PLINDER_ index and splits to select relevant data using `plinder.core` API\n", + "- Extract task-specific data one might want to use for training a task-specific ML model, eg. one protein, one ligand\n", + "- How to use `plinder.core` API to:\n", + " - supply dataset inputs for `train` or `val` splits\n", + " - load linked `apo` and `pred` structures\n", + " - use diversity subsampling based on cluster labels" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Download _PLINDER_ \n", + "\n", + "To download, run: `plinder_download --release 2024-06 --iteration v2 --yes`
\n", + "This will download and unpack all neccesary files. For more information on download check out [Dataset Tutorial](https://plinder-org.github.io/plinder/tutorial/dataset.html#getting-the-data)\n", + "\n", + ":::{note} The dataset is hundreds of gigabytes in size; downloading and extracting should take about 40 minutes. If you want to play around with a toy example dataset, please use `--iteration tutorial`\n", + ":::" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "### Loading _PLINDER_ \n", + "\n", + "We recommend users interact with the dataset using _PLINDER_ Python API.\n", + "\n", + "To install the API run: ``pip install plinder[loader]``. If you are using `zsh` terminal, you will have to quote the package like ``\"plinder[loader]\"``\n", + "\n", + "NOTE: once the _PLINDER_ is downloaded locally, you can use it in offline mode to save time for data queries with: `os.environ[\"PLINDER_OFFLINE\"] = \"true\"`" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "env: PLINDER_LOG_LEVEL=0\n" + ] + } + ], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "%env PLINDER_LOG_LEVEL=0\n", + "# once PLINDER is downloaded you can set this to true\n", + "# %env PLINDER_OFFLINE=true\n", + "\n", + "from __future__ import annotations" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Load _PLINDER_ index with selected columns from annotations table\n", + "For a full list with descriptions, please refer to [docs](https://plinder-org.github.io/plinder/dataset.html#annotation-tables-index)." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from plinder.core.scores import query_index" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# get plinder index with selected annotation columns specified\n", + "plindex = query_index(\n", + " columns=[\"system_id\", \"ligand_id\",\n", + " \"ligand_rdkit_canonical_smiles\", \"ligand_is_ion\",\n", + " \"ligand_is_artifact\", \"system_num_ligand_chains\",\n", + " \"system_num_protein_chains\",\n", + " \"ligand_is_proper\",\n", + " \"system_proper_num_ligand_chains\",\n", + " ],\n", + " splits=[\"train\", \"val\"], # This is the default\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
system_idligand_idligand_rdkit_canonical_smilesligand_is_ionligand_is_artifactsystem_num_ligand_chainssystem_num_protein_chainsligand_is_propersystem_proper_num_ligand_chainssplit
03grt__1__1.A_2.A__1.B3grt__1__1.BCc1cc2nc3c(=O)[nH]c(=O)nc-3n(C[C@H](O)[C@H](O)...FalseFalse12True1train
13grt__1__1.A_2.A__1.C3grt__1__1.CN[C@@H](CCC(=O)N[C@H]1CSSC[C@H](NC(=O)CC[C@H](...FalseFalse12True1train
23grt__1__1.A_2.A__2.B3grt__1__2.BCc1cc2nc3c(=O)[nH]c(=O)nc-3n(C[C@H](O)[C@H](O)...FalseFalse12True1train
33grt__1__1.A_2.A__2.C3grt__1__2.CN[C@@H](CCC(=O)N[C@H]1CSSC[C@H](NC(=O)CC[C@H](...FalseFalse12True1train
41grx__1__1.A__1.B1grx__1__1.BN[C@@H](CCC(=O)N[C@@H](CS)C(=O)NCC(=O)O)C(=O)OFalseFalse11True1train
\n", + "
" + ], + "text/plain": [ + " system_id ligand_id \\\n", + "0 3grt__1__1.A_2.A__1.B 3grt__1__1.B \n", + "1 3grt__1__1.A_2.A__1.C 3grt__1__1.C \n", + "2 3grt__1__1.A_2.A__2.B 3grt__1__2.B \n", + "3 3grt__1__1.A_2.A__2.C 3grt__1__2.C \n", + "4 1grx__1__1.A__1.B 1grx__1__1.B \n", + "\n", + " ligand_rdkit_canonical_smiles ligand_is_ion \\\n", + "0 Cc1cc2nc3c(=O)[nH]c(=O)nc-3n(C[C@H](O)[C@H](O)... False \n", + "1 N[C@@H](CCC(=O)N[C@H]1CSSC[C@H](NC(=O)CC[C@H](... False \n", + "2 Cc1cc2nc3c(=O)[nH]c(=O)nc-3n(C[C@H](O)[C@H](O)... False \n", + "3 N[C@@H](CCC(=O)N[C@H]1CSSC[C@H](NC(=O)CC[C@H](... False \n", + "4 N[C@@H](CCC(=O)N[C@@H](CS)C(=O)NCC(=O)O)C(=O)O False \n", + "\n", + " ligand_is_artifact system_num_ligand_chains system_num_protein_chains \\\n", + "0 False 1 2 \n", + "1 False 1 2 \n", + "2 False 1 2 \n", + "3 False 1 2 \n", + "4 False 1 1 \n", + "\n", + " ligand_is_proper system_proper_num_ligand_chains split \n", + "0 True 1 train \n", + "1 True 1 train \n", + "2 True 1 train \n", + "3 True 1 train \n", + "4 True 1 train " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "plindex.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "system_num_protein_chains\n", + "1 260142\n", + "2 131014\n", + "3 23306\n", + "4 4466\n", + "5 610\n", + "Name: system_id, dtype: int64" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Display number of system neighboring protein chains\n", + "plindex.groupby(\"system_num_protein_chains\").system_id.count()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Extracting specific data using _PLINDER_ annotations \n", + "As we can see just from the data tables above - a significant fraction of _PLINDER_ systems contain complex multi protein chain systems." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Task specific selection\n", + "If we would like to focus on single protein and single ligand systems for training, we can use the annotated columns to filter out systems that:\n", + "- contain only one protein chain\n", + "- only one ligand\n", + "\n", + "Remember: In _PLINDER_ artifacts and (single atom) ions are also included in the index if they are part of the pocket.\n", + "- `ligand_is_proper` combines columns `ligand_is_ion` and `ligand_is_artifact` to only select \"proper\" ligands.\n", + "\n", + "Let's find out how many annotated ligands are \"proper\"." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "ligand_is_proper\n", + "False 74608\n", + "True 344930\n", + "Name: system_id, dtype: int64" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "plindex.groupby(\"ligand_is_proper\").system_id.count()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### User choice\n", + "\n", + "The annotations table gives flexibility to choose the systems for training:\n", + "- One could strictly choose to use only the data that contains single protein single ligand systems\n", + "- Alternatively one could expand the number of systems to include systems containing single proper ligands, and optionally ignore the artifacts and ions in the pocket\n", + "\n", + "Let's compare the numbers of such systems!" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of single receptor single ligand systems: 153222\n", + "Number of single receptor single \"proper\" ligand systems: 182861\n" + ] + } + ], + "source": [ + "# create mask for single receptor single ligand systems\n", + "systems_1p1l = (plindex[\"system_num_protein_chains\"] == 1) & (plindex[\"system_num_ligand_chains\"] == 1)\n", + "\n", + "# create mask only for single receptor single \"proper\" ligand systems\n", + "systems_proper_1p1l = (plindex[\"system_num_protein_chains\"] == 1) & (plindex[\"system_proper_num_ligand_chains\"] == 1) & plindex[\"ligand_is_proper\"]\n", + "\n", + "print(f\"Number of single receptor single ligand systems: {sum(systems_1p1l)}\")\n", + "print(f\"Number of single receptor single \\\"proper\\\" ligand systems: {sum(systems_proper_1p1l)}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we can see - the second choice can provide up to 20% more data for training, however, the caveat is that some of the interactions made by artifacts or ions may influence the binding pose of the \"proper\" ligand. The user could come up with further strategies to filtering using annotations table or external tools, but this is beyond the scope of this tutorial." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Getting links to `apo` or `pred` structures \n", + "\n", + ":::{currentmodule} plinder.core\n", + ":::\n", + "\n", + "For users interested in including `apo` and `pred` structures in their workflow, all the information needed can be obtained from the function {func}`query_links`" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "from plinder.core.scores import query_links" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "links_df = query_links(\n", + " columns=[\"reference_system_id\", \"id\", \"sort_score\"],\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + ":::{note} The table is sorted by `sort_score` that is resolution for `apo`s and `plddt` for `pred`s. The `apo` or `pred` is specified in the additionally added `filename` and `kind` column that specifies if the structure was sourced from PDB or AF2DB, respectively.\n", + ":::" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
reference_system_ididsort_scorekind
06pl9__1__1.A__1.C2vb1_A0.65apo
16ahh__1__1.A__1.G2vb1_A0.65apo
25b59__1__1.A__1.B2vb1_A0.65apo
33ato__1__1.A__1.B2vb1_A0.65apo
46mx9__1__1.A__1.K2vb1_A0.65apo
\n", + "
" + ], + "text/plain": [ + " reference_system_id id sort_score kind\n", + "0 6pl9__1__1.A__1.C 2vb1_A 0.65 apo\n", + "1 6ahh__1__1.A__1.G 2vb1_A 0.65 apo\n", + "2 5b59__1__1.A__1.B 2vb1_A 0.65 apo\n", + "3 3ato__1__1.A__1.B 2vb1_A 0.65 apo\n", + "4 6mx9__1__1.A__1.K 2vb1_A 0.65 apo" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "links_df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If a user wants to consider only one linked structure per system - we can easily drop duplicates, first sorting by `sort_score`. Using this priority score, `pred` structures will not be used unless there is no `apo` available. Alternative can be achieved by sorting with `ascending=False`, or filtering by `kind==\"pred\"` column." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
reference_system_ididsort_scorekind
06pl9__1__1.A__1.C2vb1_A0.65apo
1106agr__1__1.A__1.G2vb1_A0.65apo
1114qgz__1__1.A__1.C2vb1_A0.65apo
1124owa__2__1.B__1.NA2vb1_A0.65apo
1136wgo__1__1.A__1.E2vb1_A0.65apo
\n", + "
" + ], + "text/plain": [ + " reference_system_id id sort_score kind\n", + "0 6pl9__1__1.A__1.C 2vb1_A 0.65 apo\n", + "110 6agr__1__1.A__1.G 2vb1_A 0.65 apo\n", + "111 4qgz__1__1.A__1.C 2vb1_A 0.65 apo\n", + "112 4owa__2__1.B__1.NA 2vb1_A 0.65 apo\n", + "113 6wgo__1__1.A__1.E 2vb1_A 0.65 apo" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "single_links_df = links_df.sort_values(\"sort_score\", ascending=True).drop_duplicates(\"reference_system_id\")\n", + "single_links_df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that we have links to `apo` / `pred` structures, we can see how many of those are available for our single protein single ligand systems" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "plindex_split_1p1l_links = plindex[systems_1p1l].merge(single_links_df, left_on=\"system_id\", right_on=\"reference_system_id\", how=\"left\")" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "split system_has_linked_apo_or_pred\n", + "train False 47109\n", + " True 105713\n", + "val False 30\n", + " True 370\n", + "Name: system_id, dtype: int64" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# let's check how many systems have linked structures\n", + "plindex_split_1p1l_links['system_has_linked_apo_or_pred'] = ~plindex_split_1p1l_links.kind.isna()\n", + "plindex_split_1p1l_links.groupby([\"split\", \"system_has_linked_apo_or_pred\"]).system_id.count()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Selecting final dataset\n", + "Let's select only the set that has linked structures for flexible docking" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "split system_has_linked_apo_or_pred\n", + "train True 105713\n", + "val True 370\n", + "Name: system_id, dtype: int64" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "plindex_final_df = plindex_split_1p1l_links[\n", + " (plindex_split_1p1l_links.system_has_linked_apo_or_pred)\n", + "]\n", + "plindex_final_df.groupby([\"split\", \"system_has_linked_apo_or_pred\"]).system_id.count()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Using _PLINDER_ API to load dataset by split \n", + "\n", + "More to come here after revamping the data loader code in `plinder`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + ":::{currentmodule} plinder.core\n", + ":::" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + ":::{note} if files not already available this downloads them to `~/.local/share/plinder/{PLINDER_RELEASE}/{PLINDER_ITERATION}` directory\n", + ":::" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Using _PLINDER_ clusters in sampling " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Define diversity sampler function\n", + ":::{currentmodule} plinder.core\n", + ":::\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here, we have provided an example of how one might use the function `get_diversity_samples` which is based on `torch.utils.data.WeightedRandomSampler`.\n", + "\n", + "NOTE: This example function is provided for demonstration purposes and users are encouraged to come up with sampling strategy that suits their need.
\n", + "\n", + "In general, diversity can be sampled using cluster information described [here](https://plinder-org.github.io/plinder/dataset.html#clusters-clusters).\n", + "All cluster information can easily be added to `plindex`.
\n", + "\n", + "See below an example, we are going to sample based on the following cluster label:\n", + "`pli_qcov__70__community`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The returned DataFrame could then be passed to {func}`get_model_input_files` the same way `plindex_final_df` was used above." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "def get_diversity_samples(\n", + " plindex,\n", + " cluster_column: str = \"pli_qcov__70__community\",\n", + "):\n", + " from torch.utils.data import WeightedRandomSampler\n", + "\n", + " cluster_counts = plindex[cluster_column].value_counts().rename(\"cluster_count\")\n", + " plindex = plindex.merge(cluster_counts, left_on=cluster_column, right_index=True).reset_index()\n", + " cluster_weights = 1.0 / plindex.cluster_count.values\n", + " sampler = WeightedRandomSampler(\n", + " weights=cluster_weights, num_samples=len(cluster_weights)\n", + " )\n", + " sampler_index = [i for i in sampler]\n", + " return plindex.loc[tuple(sampler_index), (\"system_id\", \"split\")].drop_duplicates()\n", + "\n", + "cluster_column = \"pli_qcov__70__community\"\n", + "plindex_clusters = query_index(columns=[\"system_id\", cluster_column]).drop(columns=[\"split\"])\n", + "plindex_with_clusters = plindex_final_df.merge(plindex_clusters, on=\"system_id\", how=\"left\")\n", + "sampled_df = get_diversity_samples(plindex_with_clusters, cluster_column)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(28509, 309972)" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sampled_df.system_id.nunique(), plindex.system_id.nunique()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/examples/test.ipynb b/docs/examples/test.ipynb new file mode 100644 index 00000000..da92f263 --- /dev/null +++ b/docs/examples/test.ipynb @@ -0,0 +1,175 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-09-13 16:32:33,098 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-09-13 16:32:33,099 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-09-13 16:32:33,099 | plinder.core.index.utils:146 | INFO : loading entries from 1 zips\n", + "2024-09-13 16:32:33,332 | plinder.core.index.utils:161 | INFO : loaded 1 entries\n", + "2024-09-13 16:32:33,333 | plinder.core.index.utils.load_entries:24 | INFO : runtime succeeded: 0.38s\n" + ] + }, + { + "data": { + "text/plain": [ + "{('220', 'GLY'): ['type:hydrogen_bonds__protisdon:False__sidechain:False',\n", + " 'type:hydrogen_bonds__protisdon:True__sidechain:False'],\n", + " ('317', 'ASP'): ['type:hydrogen_bonds__protisdon:False__sidechain:True'],\n", + " ('261', 'GLY'): ['type:hydrogen_bonds__protisdon:True__sidechain:False'],\n", + " ('262', 'THR'): ['type:hydrogen_bonds__protisdon:True__sidechain:False'],\n", + " ('263', 'GLY'): ['type:hydrogen_bonds__protisdon:True__sidechain:False'],\n", + " ('264', 'LYS'): ['type:hydrogen_bonds__protisdon:True__sidechain:False',\n", + " 'type:salt_bridges__protispos:True',\n", + " 'type:salt_bridges__protispos:True'],\n", + " ('265', 'THR'): ['type:hydrogen_bonds__protisdon:True__sidechain:False',\n", + " 'type:hydrogen_bonds__protisdon:True__sidechain:True'],\n", + " ('266', 'LEU'): ['type:hydrogen_bonds__protisdon:True__sidechain:False']}" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from plinder.core.index.utils import load_entries\n", + "\n", + "system_id = \"8dat__1__1.A_1.B__1.L\"\n", + "pdb_id = \"8dat\"\n", + "\n", + "# Load all annotations\n", + "entry = load_entries(pdb_ids=[pdb_id])\n", + "\n", + "# Function to extract residue name\n", + "def get_residue_types( system_id: str, chain_instance) ->dict[str, tuple[str]]:\n", + " pdb_id = system_id.split(\"__\")[0]\n", + " mapping = {}\n", + " individual_interactions = entry[pdb_id ][\"systems\"][system_id][\"ligands\"]\n", + " for interaction_dict in individual_interactions:\n", + " for residue_number, list_of_interaction_hash in interaction_dict['interactions'][chain_instance].items():\n", + " chain = chain_instance.split(\".\")[-1]\n", + " residue_name = entry[pdb_id]['chains'][chain]['residues'][residue_number]['name']\n", + " mapping[(residue_number, residue_name)] = list_of_interaction_hash\n", + " return mapping\n", + "\n", + "get_residue_types( \"8dat__1__1.A_1.B__1.L\", \"1.A\")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-09-13 16:47:00,876 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-09-13 16:47:00,877 | plinder.core.utils.cpl.download_paths:24 | INFO : runtime succeeded: 0.00s\n", + "2024-09-13 16:47:00,877 | plinder.core.index.utils:146 | INFO : loading entries from 1 zips\n", + "2024-09-13 16:47:00,881 | plinder.core.index.utils:161 | INFO : loaded 1 entries\n", + "2024-09-13 16:47:00,881 | plinder.core.index.utils.load_entries:24 | INFO : runtime succeeded: 0.18s\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{('220', 'GLY'): ['type:hydrogen_bonds__protisdon:False__sidechain:False', 'type:hydrogen_bonds__protisdon:True__sidechain:False'], ('317', 'ASP'): ['type:hydrogen_bonds__protisdon:False__sidechain:True'], ('261', 'GLY'): ['type:hydrogen_bonds__protisdon:True__sidechain:False'], ('262', 'THR'): ['type:hydrogen_bonds__protisdon:True__sidechain:False'], ('263', 'GLY'): ['type:hydrogen_bonds__protisdon:True__sidechain:False'], ('264', 'LYS'): ['type:hydrogen_bonds__protisdon:True__sidechain:False', 'type:salt_bridges__protispos:True', 'type:salt_bridges__protispos:True'], ('265', 'THR'): ['type:hydrogen_bonds__protisdon:True__sidechain:False', 'type:hydrogen_bonds__protisdon:True__sidechain:True'], ('266', 'LEU'): ['type:hydrogen_bonds__protisdon:True__sidechain:False']}\n" + ] + } + ], + "source": [ + "from plinder.core.index.utils import load_entries\n", + "\n", + "system_id = \"8dat__1__1.A_1.B__1.L\"\n", + "pdb_id = \"8dat\"\n", + "chain = \"1.A\"\n", + "\n", + "# Load all annotations\n", + "entry = load_entries(pdb_ids=[pdb_id])\n", + "\n", + "# Function to extract residue name\n", + "def get_residue_types( system_id: str, chain_instance) ->dict[tuple[str], list[str]]:\n", + " pdb_id = system_id.split(\"__\")[0]\n", + " mapping = {}\n", + " individual_interactions = entry[pdb_id ][\"systems\"][system_id][\"ligands\"]\n", + " for interaction_dict in individual_interactions:\n", + " for residue_number, list_of_interaction_hash in interaction_dict['interactions'][chain_instance].items():\n", + " chain = chain_instance.split(\".\")[-1]\n", + " residue_name = entry[pdb_id]['chains'][chain]['residues'][residue_number]['name']\n", + " mapping[(residue_number, residue_name)] = list_of_interaction_hash\n", + " return mapping\n", + "\n", + "print(get_residue_types( system_id, chain))" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'1.A': {'220': ['type:hydrogen_bonds__protisdon:False__sidechain:False',\n", + " 'type:hydrogen_bonds__protisdon:True__sidechain:False'],\n", + " '317': ['type:hydrogen_bonds__protisdon:False__sidechain:True'],\n", + " '261': ['type:hydrogen_bonds__protisdon:True__sidechain:False'],\n", + " '262': ['type:hydrogen_bonds__protisdon:True__sidechain:False'],\n", + " '263': ['type:hydrogen_bonds__protisdon:True__sidechain:False'],\n", + " '264': ['type:hydrogen_bonds__protisdon:True__sidechain:False',\n", + " 'type:salt_bridges__protispos:True',\n", + " 'type:salt_bridges__protispos:True'],\n", + " '265': ['type:hydrogen_bonds__protisdon:True__sidechain:False',\n", + " 'type:hydrogen_bonds__protisdon:True__sidechain:True'],\n", + " '266': ['type:hydrogen_bonds__protisdon:True__sidechain:False']},\n", + " '1.B': {'372': ['type:salt_bridges__protispos:True']}}" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "entry[\"8dat\"][\"systems\"][\"8dat__1__1.A_1.B__1.L\"][\"ligands\"][0]['interactions']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}