From 3bd1debacfb28d26ae0516d5aacf9b0bd0d36bb3 Mon Sep 17 00:00:00 2001 From: dominiquesydow Date: Mon, 4 Oct 2021 13:25:06 +0200 Subject: [PATCH 1/9] Create empty branch From c2d8a2460d09b5470e7d596734be8174c0e35ac0 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 4 Oct 2021 14:37:40 +0200 Subject: [PATCH 2/9] KLIFS: Add residue modifications to data/klifs_fields.csv --- opencadd/data/klifs_fields.csv | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/opencadd/data/klifs_fields.csv b/opencadd/data/klifs_fields.csv index f97eda7e..b15bbcca 100644 --- a/opencadd/data/klifs_fields.csv +++ b/opencadd/data/klifs_fields.csv @@ -125,3 +125,8 @@ structure_conformations,structure.ploop_rotation,float32,ploop_rotation,, structure_conformations,structure.reference_distance,float32,reference_distance,, structure_conformations,structure.salt_bridge_17_24,float32,salt_bridge_17_24,, structure_conformations,structure.klifs_id,float32,structure_ID,, +structure_modified_residues,residue.id,string,Xray_position,, +structure_modified_residues,residue.klifs_id,Int32,,, +structure_modified_residues,residue.klifs_region_id,string,KLIFS_position,, +structure_modified_residues,residue.klifs_region,string,,, +structure_modified_residues,residue.modification,string,modification,, From bc0dff879d27696cec68fd15143c483ad9f968ed Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 4 Oct 2021 14:38:52 +0200 Subject: [PATCH 3/9] KLIFS: Add core.StructureModifiedResiduesProvider --- opencadd/databases/klifs/core.py | 80 ++++++++++++++++++++++++++++++-- 1 file changed, 75 insertions(+), 5 deletions(-) diff --git a/opencadd/databases/klifs/core.py b/opencadd/databases/klifs/core.py index 16574bfe..bd61ac30 100644 --- a/opencadd/databases/klifs/core.py +++ b/opencadd/databases/klifs/core.py @@ -148,6 +148,7 @@ def _standardize_column_values(dataframe): if "structure.resolution" in dataframe.columns: dataframe["structure.resolution"].replace(0, np.nan, inplace=True) + # In case of drugs if "drug.brand_name" in dataframe.columns: dataframe["drug.brand_name"] = dataframe["drug.brand_name"].apply( lambda x: x.split(";") if x != "" else [] @@ -436,7 +437,6 @@ def by_kinase_name(self, kinase_names, species=None): species : None or str Species name (default is None, i.e. all species are selected). - Returns ------- pandas.DataFrame @@ -1203,7 +1203,7 @@ class PocketsProvider(BaseProvider): Notes ----- - Class methods all return a pandas.DataFrame of interactions (rows) with the (or a subset of + Class methods all return a pandas.DataFrame of pocket residues (rows) with the (or a subset of the) following attributes (columns): residue.klifs_id : int @@ -1488,7 +1488,7 @@ def all_drugs(self): Returns ------- pandas.DataFrame - drugs (rows) with the columns as defined in the class docstring. + Drugs (rows) with the columns as defined in the class docstring. Raises ------ @@ -1558,12 +1558,12 @@ class StructureConformationsProvider(BaseProvider): def all_conformations(self): """ - Get all available drugs. + Get all available conformations. Returns ------- pandas.DataFrame - drugs (rows) with the columns as defined in the class docstring. + Structures (rows) with the columns as defined in the class docstring. Raises ------ @@ -1592,3 +1592,73 @@ def by_structure_klifs_id(self, structure_klifs_id): Remote module: Structure KLIFS ID does not exist. """ raise NotImplementedError("Implement in your subclass!") + + +class StructureModifiedResiduesProvider(BaseProvider): + """ + Class for a structure's modified residues requests. + Get residue ID and the corresponding residue KLIFS ID plus the residue modification. + + Methods + ------- + by_structure_klifs_id() + Get residue ID and the corresponding residue KLIFS ID plus the residue modification. + + Notes + ----- + Class methods all return a pandas.DataFrame of modified residues (rows) with the (or a subset + of the) following attributes (columns): + + residue.klifs_id : int + Residue KLIFS ID. + residue.id : str + Residue ID. + residue.modification : str + The type of modification for this residue. + """ + + def by_structure_klifs_id(self, structure_klifs_id): + """ + Get a structure's modified residues by structure ID. + + Parameters + ---------- + structure_klifs_id : str + Structure KLIFS ID. + + Returns + ------- + pandas.DataFrame + Modified residues details. + + Raises + ------ + bravado_core.exception.SwaggerMappingError + Remote module: Structure KLIFS ID does not exist. + """ + raise NotImplementedError("Implement in your subclass!") + + @staticmethod + def _add_klifs_region_details(modifications): + """ + Based on KLIFS region ID, add KLIFS ID and region name. + + Parameters + ---------- + pandas.DataFrame + Modification data. + + Returns + ------- + pandas.DataFrame + Modification data with KLIFS ID and region name. + """ + + modifications["residue.klifs_region"] = modifications["residue.klifs_region_id"].apply( + lambda x: ".".join(x.split(".")[:-1]) if x != "-" else x + ) + modifications["residue.klifs_id"] = modifications["residue.klifs_region_id"].apply( + lambda x: x.split(".")[-1] if x != "-" else np.nan + ) + + return modifications From 7659234a549c51bd11f12039284ecd3d6056cea1 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 4 Oct 2021 14:39:27 +0200 Subject: [PATCH 4/9] KLIFS: Add local/remote.StructureModifiedResidues --- opencadd/databases/klifs/local.py | 27 ++++++++++++++++-- opencadd/databases/klifs/remote.py | 46 +++++++++++++++++++++++++++++- 2 files changed, 69 insertions(+), 4 deletions(-) diff --git a/opencadd/databases/klifs/local.py b/opencadd/databases/klifs/local.py index bd1266f1..22e22807 100644 --- a/opencadd/databases/klifs/local.py +++ b/opencadd/databases/klifs/local.py @@ -21,6 +21,7 @@ CoordinatesProvider, DrugsProvider, StructureConformationsProvider, + StructureModifiedResiduesProvider, ) from .schema import ( FIELDS, @@ -899,13 +900,33 @@ def all_drugs(self): class StructureConformations(LocalInitializer, StructureConformationsProvider): """ - Extends StructureConformationsProvider to provide remote drug requests. + Extends StructureConformationsProvider to provide remote conformation requests. Refer to StructureConformationsProvider documentation for more information: opencadd.databases.klifs.core.StructureConformationsProvider """ - def all_drugs(self): + def all_conformations(self): raise NotImplementedError( - "Information on drugs is not available locally! Please use a remote session." + "Information on conformations is not available locally! Please use a remote session." + ) + + def by_structure_klifs_id(self): + + raise NotImplementedError( + "Information on conformations is not available locally! Please use a remote session." + ) + + +class StructureModifiedResidues(LocalInitializer, StructureModifiedResiduesProvider): + """ + Extends StructureModifiedResiduesProvider to provide remote modified residues requests. + Refer to StructureModifiedResiduesProvider documentation for more information: + opencadd.databases.klifs.core.StructureModifiedResiduesProvider + """ + + def by_structure_klifs_id(self): + + raise NotImplementedError( + "Information on modified residues is not available locally! Please use a remote session." ) diff --git a/opencadd/databases/klifs/remote.py b/opencadd/databases/klifs/remote.py index 2c70fba2..0ea75644 100644 --- a/opencadd/databases/klifs/remote.py +++ b/opencadd/databases/klifs/remote.py @@ -21,6 +21,7 @@ CoordinatesProvider, DrugsProvider, StructureConformationsProvider, + StructureModifiedResiduesProvider, ) from .schema import FIELDS from .utils import metadata_to_filepath, silence_logging @@ -894,7 +895,7 @@ def all_drugs(self): class StructureConformations(RemoteInitializer, StructureConformationsProvider): """ - Extends StructureConformationsProvider to provide remote drug requests. + Extends StructureConformationsProvider to provide remote conformations requests. Refer to StructureConformationsProvider documentation for more information: opencadd.databases.klifs.core.StructureConformationsProvider """ @@ -933,3 +934,46 @@ def by_structure_klifs_id(self, structure_klifs_ids): FIELDS.remote_to_oc_names("structure_conformations"), ) return conformations + + +class StructureModifiedResidues(RemoteInitializer, StructureModifiedResiduesProvider): + """ + Extends StructureModifiedResiduesProvider to provide remote modified residues requests. + Refer to StructureModifiedResiduesProvider documentation for more information: + opencadd.databases.klifs.core.StructureModifiedResiduesProvider + """ + + def by_structure_klifs_id(self, structure_klifs_id): + + # Use KLIFS API + result = ( + self._client.Structures.get_structure_modified_residues( + structure_ID=structure_klifs_id + ) + .response() + .result + ) + if len(result) == 0: + # Usually we return errors if the DataFrame is empty because it means that the input + # data was incorrect or KLIFS is missing data that should be there + # In this case here, however, most structures won't have modifications and therefore + # will have nothing to return + # To make the transition between 0 and >0 modifications smoother, let's always return + # DataFrames will all columns and 0 or more rows. + fields = FIELDS.df + column_names = fields[fields["field_type"] == "structure_modified_residues"][ + "opencadd.df_name" + ].to_list() + return pd.DataFrame([], columns=column_names) + else: + # Convert to DataFrame and formatting + modifications = pd.DataFrame(result) + # Standardize DataFrame + modifications = self._standardize_dataframe( + modifications, + FIELDS.oc_name_to_type("structure_modified_residues"), + FIELDS.remote_to_oc_names("structure_modified_residues"), + ) + # Add KLIFS region and color TODO not so nice to have this after standardization + modifications = self._add_klifs_region_details(modifications) + return modifications From 64dca5cf3b81610bd841541fcf723d54c74ba0f0 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 4 Oct 2021 14:39:58 +0200 Subject: [PATCH 5/9] KLIFS: Add modified_residues attribute to session.Session --- opencadd/databases/klifs/session.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/opencadd/databases/klifs/session.py b/opencadd/databases/klifs/session.py index c7e70722..2f61c250 100644 --- a/opencadd/databases/klifs/session.py +++ b/opencadd/databases/klifs/session.py @@ -41,6 +41,8 @@ class Session: Drugs object for drugs requests. conformations : None or opencadd.databases.klifs.remote.StructureConformations StructureConformations object for structure conformation requests. + modified_residues : None or opencadd.databases.klifs.remote.StructureModifiedResidues + StructureModifiedResidues object for structure residue modification requests. """ def __init__(self): @@ -62,6 +64,7 @@ def __init__(self): self.coordinates = None self.drugs = None self.conformations = None + self.modified_residues = None @classmethod def from_local(cls, path_to_klifs_download, path_to_klifs_metadata=None): @@ -181,3 +184,8 @@ def _set_attributes(self, backend, path_to_klifs_download=None, database=None, c database=database, path_to_klifs_download=path_to_klifs_download, ) + self.modified_residues = backend.StructureModifiedResidues( + client=client, + database=database, + path_to_klifs_download=path_to_klifs_download, + ) From ed7057a04c45573d3f5e74e4c276fc0db39ee262 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 4 Oct 2021 14:40:18 +0200 Subject: [PATCH 6/9] KLIFS: Add tests for modified residues --- .../tests/databases/test_klifs_local_remote.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/opencadd/tests/databases/test_klifs_local_remote.py b/opencadd/tests/databases/test_klifs_local_remote.py index 147cf622..e4673174 100644 --- a/opencadd/tests/databases/test_klifs_local_remote.py +++ b/opencadd/tests/databases/test_klifs_local_remote.py @@ -384,10 +384,12 @@ class TestsFromStructureIds: Test class methods with structure IDs as input. """ - @pytest.mark.parametrize("structure_klifs_ids", [12347, [12347, 100000]]) + @pytest.mark.parametrize("structure_klifs_ids", [12347, [12347, 100000], 4126]) def test_by_structure_klifs_id(self, structure_klifs_ids): """ Test class methods with structure IDs as input. + + Note: ID 4126 added to test modified residues """ # Structures @@ -407,13 +409,13 @@ def test_by_structure_klifs_id(self, structure_klifs_ids): # Conformations result_remote = REMOTE.conformations.by_structure_klifs_id(structure_klifs_ids) # No local access available - check_dataframe(result_remote, FIELDS.oc_name_to_type("structure_conformations")) - # Pockets (takes only one structure ID as input!) + # Pockets and modified residues (takes only one structure ID as input!) if isinstance(structure_klifs_ids, int): structure_klifs_id = structure_klifs_ids + # Pockets result_remote = REMOTE.pockets.by_structure_klifs_id(structure_klifs_ids) result_local_mol2 = LOCAL.pockets.by_structure_klifs_id(structure_klifs_ids, "mol2") result_local_pdb = LOCAL.pockets.by_structure_klifs_id(structure_klifs_ids, "pdb") @@ -425,6 +427,11 @@ def test_by_structure_klifs_id(self, structure_klifs_ids): assert all(result_local_mol2 == result_local_pdb) assert all(result_local_mol2 == result_remote) + # Modified residues + result_remote = REMOTE.modified_residues.by_structure_klifs_id(structure_klifs_id) + # No local access available + check_dataframe(result_remote, FIELDS.oc_name_to_type("structure_modified_residues")) + @pytest.mark.parametrize("structure_klifs_ids", [100000, "XXX"]) def test_by_structure_klifs_id_raise(self, structure_klifs_ids): """ @@ -438,12 +445,16 @@ def test_by_structure_klifs_id_raise(self, structure_klifs_ids): if isinstance(structure_klifs_ids, int): structure_klifs_id = structure_klifs_ids REMOTE.pockets.by_structure_klifs_id(structure_klifs_id) + REMOTE.modified_residues.by_structure_klifs_id(structure_klifs_id) with pytest.raises(ValueError): LOCAL.structures.by_structure_klifs_id(structure_klifs_ids) LOCAL.interactions.by_structure_klifs_id(structure_klifs_ids) + # No local structure conformations if isinstance(structure_klifs_ids, int): structure_klifs_id = structure_klifs_ids + LOCAL.pockets.by_structure_klifs_id(structure_klifs_id) + # No local structure's residue modifications class TestsFromKinaseNames: From b7042d8e04d37868f76a8d0b7451dad91efe0554 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 4 Oct 2021 14:44:43 +0200 Subject: [PATCH 7/9] KLIFS: Update tutorial with residue modifications (text and code) --- docs/tutorials/databases_klifs.ipynb | 858 ++++++++++++++++----------- 1 file changed, 518 insertions(+), 340 deletions(-) diff --git a/docs/tutorials/databases_klifs.ipynb b/docs/tutorials/databases_klifs.ipynb index 21b63d64..32e03672 100644 --- a/docs/tutorials/databases_klifs.ipynb +++ b/docs/tutorials/databases_klifs.ipynb @@ -558,15 +558,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "| | kinases | ligands | structures | bioactivities | interactions | pockets | drugs |\n", - "|:--------------------------| ------- | ------- | ---------- | ------------- | ------------ | ------- | ----- |\n", - "| __by_kinase_klifs_id__ | x | x | x | x | x | | |\n", - "| __by_kinase_name__ | x | x | x | | | | |\n", - "| __by_ligand_klifs_id__ | | x | x | x | x | | |\n", - "| __by_ligand_expo_id__ | | x | x | x | | | |\n", - "| __by_structure_klifs_id__ | | | x | | x | x | |\n", - "| __by_structure_pdb_id__ | | | x | | | | |\n", - "| __all\\_\\*__ | x | x | x | x | x | | x |\n", + "| | kinases | ligands | structures | bioactivities | interactions | pockets | drugs | conformations | modified residues |\n", + "|:--------------------------| ------- | ------- | ---------- | ------------- | ------------ | ------- | ----- | ------------- | ----------------- |\n", + "| __by_kinase_klifs_id__ | x | x | x | x | x | | | | |\n", + "| __by_kinase_name__ | x | x | x | | | | | | |\n", + "| __by_ligand_klifs_id__ | | x | x | x | x | | | | |\n", + "| __by_ligand_expo_id__ | | x | x | x | | | | | |\n", + "| __by_structure_klifs_id__ | | | x | | x | x | | x | x |\n", + "| __by_structure_pdb_id__ | | | x | | | | | | |\n", + "| __all\\_\\*__ | x | x | x | x | x | | x | x | |\n", "\n", "\\* all_kinases, all_kinases_groups, all_kinase_families, all_ligands, all_structures, ..." ] @@ -2735,7 +2735,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "00bc6e4c8b7f4cbdac70504809792859", + "model_id": "351ad69a83a542dda28ee667a897ce5f", "version_major": 2, "version_minor": 0 }, @@ -2846,7 +2846,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "69d5465981b44de5b32e993b43f76c1b", + "model_id": "c33596d342ec4cb8b3156e4b9e2cec68", "version_major": 2, "version_minor": 0 }, @@ -2995,7 +2995,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "8b7c0818394f4341894fe60f55211477", + "model_id": "92be490e8a3747a7b5d0c0431e0a5194", "version_major": 2, "version_minor": 0 }, @@ -3227,7 +3227,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "96332fd926284986812bbf1ac0cd2d45", + "model_id": "232a13db996740e3b869f604f2eb9447", "version_major": 2, "version_minor": 0 }, @@ -4060,7 +4060,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "998f4f2526d34e8392abefe8ea62dab7", + "model_id": "896e99651c2646d7bc635480ac2d0d1d", "version_major": 2, "version_minor": 0 }, @@ -4256,7 +4256,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "030c09ccc1ed426faa0fc76e45ba9850", + "model_id": "99eab2720c1543e0a486ac6e8ec25f1a", "version_major": 2, "version_minor": 0 }, @@ -4279,7 +4279,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "8b060e6d8b354687a242310ef39f4ce6", + "model_id": "4764dcbef11549d6bec5bc4a3a8c8da1", "version_major": 2, "version_minor": 0 }, @@ -4460,7 +4460,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "3ac928360e454e138cddf37e6e8937d6", + "model_id": "dc76d14a444f446982d58014506e8684", "version_major": 2, "version_minor": 0 }, @@ -4519,7 +4519,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "9b0a912135df41e494ae7ed29e91363a", + "model_id": "d1d764de05fd4ec48891e1b6b613c797", "version_major": 2, "version_minor": 0 }, @@ -4705,7 +4705,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "23a854e9804e42a496de6e4803d83eb9", + "model_id": "5ba34257783b4f1eacc359e75d3e1bbf", "version_major": 2, "version_minor": 0 }, @@ -10545,7 +10545,383 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Pockets\n", + "## Structure conformations\n", + "\n", + "KLIFS also provides a lot of conformation parameters for each structure:\n", + "\n", + "> The Structure conformation endpoint returns a comprehensive set of conformational annotations from KLIFS for the user-specified structure ID(s). This ranges from aC-helix annotations to DFG rotational analyses.\n", + "\n", + "https://dev.klifs.net/swagger_v2/#/Structures/get_structure_conformation\n", + "\n", + "__Note__: Only available remotely (not locally)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "__Remote__" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### All conformations" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
structure.dfgstructure.ac_helixstructure.ac_helix_distancestructure.aloop_rotationstructure.dfg_angle_d_fstructure.dfg_d_outer_rotationstructure.dfg_d_rotationstructure.dfg_f_outer_rotationstructure.dfg_f_rotationstructure.distance_67_82structure.distance_67_82_outstructure.mobitz_dihedralstructure.ploop_anglestructure.ploop_distancestructure.ploop_rotationstructure.reference_distancestructure.salt_bridge_17_24structure.klifs_id
0outin17.43090136.267700169.220993200.0174.0191.0150.02.737825.67957135.1029970.0000000.0000000.00000012.28062.8101181.0
1inin16.806101144.018005132.630005336.0315.018.0340.0-2.67273-2.8061379.66760363.10279818.74679977.15519712.45152.7924582.0
.........................................................
12570inout20.793200149.429001105.876999320.0309.0328.011.0-4.84154-2.6235036.07410049.09629814.73720056.10200112.125512.21209913903.0
12571inout20.793200149.429001105.876999320.0309.0328.011.0-4.84154-2.6235036.07410049.09629814.73720056.10200112.125512.21209913904.0
\n", + "

12572 rows × 18 columns

\n", + "
" + ], + "text/plain": [ + " structure.dfg structure.ac_helix structure.ac_helix_distance \\\n", + "0 out in 17.430901 \n", + "1 in in 16.806101 \n", + "... ... ... ... \n", + "12570 in out 20.793200 \n", + "12571 in out 20.793200 \n", + "\n", + " structure.aloop_rotation structure.dfg_angle_d_f \\\n", + "0 36.267700 169.220993 \n", + "1 144.018005 132.630005 \n", + "... ... ... \n", + "12570 149.429001 105.876999 \n", + "12571 149.429001 105.876999 \n", + "\n", + " structure.dfg_d_outer_rotation structure.dfg_d_rotation \\\n", + "0 200.0 174.0 \n", + "1 336.0 315.0 \n", + "... ... ... \n", + "12570 320.0 309.0 \n", + "12571 320.0 309.0 \n", + "\n", + " structure.dfg_f_outer_rotation structure.dfg_f_rotation \\\n", + "0 191.0 150.0 \n", + "1 18.0 340.0 \n", + "... ... ... \n", + "12570 328.0 11.0 \n", + "12571 328.0 11.0 \n", + "\n", + " structure.distance_67_82 structure.distance_67_82_out \\\n", + "0 2.73782 5.67957 \n", + "1 -2.67273 -2.80613 \n", + "... ... ... \n", + "12570 -4.84154 -2.62350 \n", + "12571 -4.84154 -2.62350 \n", + "\n", + " structure.mobitz_dihedral structure.ploop_angle \\\n", + "0 135.102997 0.000000 \n", + "1 79.667603 63.102798 \n", + "... ... ... \n", + "12570 36.074100 49.096298 \n", + "12571 36.074100 49.096298 \n", + "\n", + " structure.ploop_distance structure.ploop_rotation \\\n", + "0 0.000000 0.000000 \n", + "1 18.746799 77.155197 \n", + "... ... ... \n", + "12570 14.737200 56.102001 \n", + "12571 14.737200 56.102001 \n", + "\n", + " structure.reference_distance structure.salt_bridge_17_24 \\\n", + "0 12.2806 2.810118 \n", + "1 12.4515 2.792458 \n", + "... ... ... \n", + "12570 12.1255 12.212099 \n", + "12571 12.1255 12.212099 \n", + "\n", + " structure.klifs_id \n", + "0 1.0 \n", + "1 2.0 \n", + "... ... \n", + "12570 13903.0 \n", + "12571 13904.0 \n", + "\n", + "[12572 rows x 18 columns]" + ] + }, + "execution_count": 98, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "remote.conformations.all_conformations()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Conformations from structure KLIFS ID" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "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", + "
structure.dfgstructure.ac_helixstructure.ac_helix_distancestructure.aloop_rotationstructure.dfg_angle_d_fstructure.dfg_d_outer_rotationstructure.dfg_d_rotationstructure.dfg_f_outer_rotationstructure.dfg_f_rotationstructure.distance_67_82structure.distance_67_82_outstructure.mobitz_dihedralstructure.ploop_anglestructure.ploop_distancestructure.ploop_rotationstructure.reference_distancestructure.salt_bridge_17_24structure.klifs_id
0inout20.1875108.766998115.929001335.0302.0345.032.0-3.12182-3.4565695.3289030.00.00.012.07810.012347.0
\n", + "
" + ], + "text/plain": [ + " structure.dfg structure.ac_helix structure.ac_helix_distance \\\n", + "0 in out 20.1875 \n", + "\n", + " structure.aloop_rotation structure.dfg_angle_d_f \\\n", + "0 108.766998 115.929001 \n", + "\n", + " structure.dfg_d_outer_rotation structure.dfg_d_rotation \\\n", + "0 335.0 302.0 \n", + "\n", + " structure.dfg_f_outer_rotation structure.dfg_f_rotation \\\n", + "0 345.0 32.0 \n", + "\n", + " structure.distance_67_82 structure.distance_67_82_out \\\n", + "0 -3.12182 -3.45656 \n", + "\n", + " structure.mobitz_dihedral structure.ploop_angle structure.ploop_distance \\\n", + "0 95.328903 0.0 0.0 \n", + "\n", + " structure.ploop_rotation structure.reference_distance \\\n", + "0 0.0 12.0781 \n", + "\n", + " structure.salt_bridge_17_24 structure.klifs_id \n", + "0 0.0 12347.0 " + ] + }, + "execution_count": 99, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "remote.conformations.by_structure_klifs_id([12347, 100000])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Pockets (structure's pocket residues)\n", "\n", "Explore access to pocket information." ] @@ -10566,7 +10942,7 @@ }, { "cell_type": "code", - "execution_count": 98, + "execution_count": 100, "metadata": {}, "outputs": [ { @@ -10661,7 +11037,7 @@ "[85 rows x 5 columns]" ] }, - "execution_count": 98, + "execution_count": 100, "metadata": {}, "output_type": "execute_result" } @@ -10672,7 +11048,7 @@ }, { "cell_type": "code", - "execution_count": 99, + "execution_count": 101, "metadata": {}, "outputs": [ { @@ -10699,7 +11075,7 @@ }, { "cell_type": "code", - "execution_count": 100, + "execution_count": 102, "metadata": {}, "outputs": [ { @@ -10794,7 +11170,7 @@ "[85 rows x 5 columns]" ] }, - "execution_count": 100, + "execution_count": 102, "metadata": {}, "output_type": "execute_result" } @@ -10805,7 +11181,7 @@ }, { "cell_type": "code", - "execution_count": 101, + "execution_count": 103, "metadata": {}, "outputs": [ { @@ -10827,13 +11203,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Structure conformations\n", + "## Residue modifications (structure's modified residues)\n", "\n", - "KLIFS also provides a lot of conformation parameters for each structure:\n", + "KLIFS also provides all modified residues for each structure if available:\n", "\n", - "> The Structure conformation endpoint returns a comprehensive set of conformational annotations from KLIFS for the user-specified structure ID(s). This ranges from aC-helix annotations to DFG rotational analyses.\n", + "> The Structure modified residues endpoint returns a list of all residues that have undergone phosphorylation or sulfation for a specific structure. When the residues are within the KLIFS binding site, also the KLIFS numbering for that residue is provided.\n", "\n", - "https://dev.klifs.net/swagger_v2/#/Structures/get_structure_conformation\n", + "https://dev.klifs.net/swagger_v2/#/Structures/get_structure_modified_residues\n", "\n", "__Note__: Only available remotely (not locally)." ] @@ -10842,252 +11218,106 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### All conformations" + "### Residue modifications from structure KLIFS ID" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "__Remote__" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This structure has modified residues:" ] }, { "cell_type": "code", - "execution_count": 102, + "execution_count": 104, "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", - " \n", - " \n", - " \n", - " \n", + "text/html": [ + "
\n", + "\n", + "
structure.dfgstructure.ac_helixstructure.ac_helix_distancestructure.aloop_rotationstructure.dfg_angle_d_fstructure.dfg_d_outer_rotationstructure.dfg_d_rotationstructure.dfg_f_outer_rotationstructure.dfg_f_rotationstructure.distance_67_82structure.distance_67_82_outstructure.mobitz_dihedralstructure.ploop_anglestructure.ploop_distancestructure.ploop_rotationstructure.reference_distancestructure.salt_bridge_17_24structure.klifs_id
0outin17.43090136.267700169.220993200.0174.0191.0150.02.737825.67957135.1029970.0000000.0000000.00000012.28062.8101181.0
1inin16.806101144.018005132.630005336.0315.018.0340.0-2.67273-2.8061379.66760363.10279818.74679977.15519712.45152.7924582.0
.........................................................
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
residue.idresidue.klifs_idresidue.klifs_region_idresidue.klifs_regionresidue.modification
12570inout20.793200149.429001105.876999320.0309.0328.011.0-4.84154-2.6235036.07410049.09629814.73720056.10200112.125512.21209913903.00158g.l.8g.lPhosphorylated tyrosine
12571inout20.793200149.429001105.876999320.0309.0328.011.0-4.84154-2.6235036.07410049.09629814.73720056.10200112.125512.21209913904.01160NaN--Phosphorylated threonine
\n", - "

12572 rows × 18 columns

\n", "
" ], "text/plain": [ - " structure.dfg structure.ac_helix structure.ac_helix_distance \\\n", - "0 out in 17.430901 \n", - "1 in in 16.806101 \n", - "... ... ... ... \n", - "12570 in out 20.793200 \n", - "12571 in out 20.793200 \n", - "\n", - " structure.aloop_rotation structure.dfg_angle_d_f \\\n", - "0 36.267700 169.220993 \n", - "1 144.018005 132.630005 \n", - "... ... ... \n", - "12570 149.429001 105.876999 \n", - "12571 149.429001 105.876999 \n", - "\n", - " structure.dfg_d_outer_rotation structure.dfg_d_rotation \\\n", - "0 200.0 174.0 \n", - "1 336.0 315.0 \n", - "... ... ... \n", - "12570 320.0 309.0 \n", - "12571 320.0 309.0 \n", - "\n", - " structure.dfg_f_outer_rotation structure.dfg_f_rotation \\\n", - "0 191.0 150.0 \n", - "1 18.0 340.0 \n", - "... ... ... \n", - "12570 328.0 11.0 \n", - "12571 328.0 11.0 \n", - "\n", - " structure.distance_67_82 structure.distance_67_82_out \\\n", - "0 2.73782 5.67957 \n", - "1 -2.67273 -2.80613 \n", - "... ... ... \n", - "12570 -4.84154 -2.62350 \n", - "12571 -4.84154 -2.62350 \n", - "\n", - " structure.mobitz_dihedral structure.ploop_angle \\\n", - "0 135.102997 0.000000 \n", - "1 79.667603 63.102798 \n", - "... ... ... \n", - "12570 36.074100 49.096298 \n", - "12571 36.074100 49.096298 \n", - "\n", - " structure.ploop_distance structure.ploop_rotation \\\n", - "0 0.000000 0.000000 \n", - "1 18.746799 77.155197 \n", - "... ... ... \n", - "12570 14.737200 56.102001 \n", - "12571 14.737200 56.102001 \n", - "\n", - " structure.reference_distance structure.salt_bridge_17_24 \\\n", - "0 12.2806 2.810118 \n", - "1 12.4515 2.792458 \n", - "... ... ... \n", - "12570 12.1255 12.212099 \n", - "12571 12.1255 12.212099 \n", - "\n", - " structure.klifs_id \n", - "0 1.0 \n", - "1 2.0 \n", - "... ... \n", - "12570 13903.0 \n", - "12571 13904.0 \n", + " residue.id residue.klifs_id residue.klifs_region_id residue.klifs_region \\\n", + "0 15 8 g.l.8 g.l \n", + "1 160 NaN - - \n", "\n", - "[12572 rows x 18 columns]" + " residue.modification \n", + "0 Phosphorylated tyrosine \n", + "1 Phosphorylated threonine " ] }, - "execution_count": 102, + "execution_count": 104, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "remote.conformations.all_conformations()" + "remote.modified_residues.by_structure_klifs_id(4126)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Conformations from structure KLIFS ID" + "This structure has no modifications and will return an empty DataFrame:" ] }, { "cell_type": "code", - "execution_count": 103, + "execution_count": 105, "metadata": {}, "outputs": [ { @@ -11111,90 +11341,38 @@ " \n", " \n", " \n", - " structure.dfg\n", - " structure.ac_helix\n", - " structure.ac_helix_distance\n", - " structure.aloop_rotation\n", - " structure.dfg_angle_d_f\n", - " structure.dfg_d_outer_rotation\n", - " structure.dfg_d_rotation\n", - " structure.dfg_f_outer_rotation\n", - " structure.dfg_f_rotation\n", - " structure.distance_67_82\n", - " structure.distance_67_82_out\n", - " structure.mobitz_dihedral\n", - " structure.ploop_angle\n", - " structure.ploop_distance\n", - " structure.ploop_rotation\n", - " structure.reference_distance\n", - " structure.salt_bridge_17_24\n", - " structure.klifs_id\n", + " residue.id\n", + " residue.klifs_id\n", + " residue.klifs_region_id\n", + " residue.klifs_region\n", + " residue.modification\n", " \n", " \n", " \n", - " \n", - " 0\n", - " in\n", - " out\n", - " 20.1875\n", - " 108.766998\n", - " 115.929001\n", - " 335.0\n", - " 302.0\n", - " 345.0\n", - " 32.0\n", - " -3.12182\n", - " -3.45656\n", - " 95.328903\n", - " 0.0\n", - " 0.0\n", - " 0.0\n", - " 12.0781\n", - " 0.0\n", - " 12347.0\n", - " \n", " \n", "\n", "" ], "text/plain": [ - " structure.dfg structure.ac_helix structure.ac_helix_distance \\\n", - "0 in out 20.1875 \n", - "\n", - " structure.aloop_rotation structure.dfg_angle_d_f \\\n", - "0 108.766998 115.929001 \n", - "\n", - " structure.dfg_d_outer_rotation structure.dfg_d_rotation \\\n", - "0 335.0 302.0 \n", - "\n", - " structure.dfg_f_outer_rotation structure.dfg_f_rotation \\\n", - "0 345.0 32.0 \n", - "\n", - " structure.distance_67_82 structure.distance_67_82_out \\\n", - "0 -3.12182 -3.45656 \n", - "\n", - " structure.mobitz_dihedral structure.ploop_angle structure.ploop_distance \\\n", - "0 95.328903 0.0 0.0 \n", - "\n", - " structure.ploop_rotation structure.reference_distance \\\n", - "0 0.0 12.0781 \n", - "\n", - " structure.salt_bridge_17_24 structure.klifs_id \n", - "0 0.0 12347.0 " + "Empty DataFrame\n", + "Columns: [residue.id, residue.klifs_id, residue.klifs_region_id, residue.klifs_region, residue.modification]\n", + "Index: []" ] }, - "execution_count": 103, + "execution_count": 105, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "remote.conformations.by_structure_klifs_id([12347, 100000])" + "remote.modified_residues.by_structure_klifs_id(12347)" ] }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ "## Coordinates\n", "\n", @@ -11214,7 +11392,7 @@ }, { "cell_type": "code", - "execution_count": 104, + "execution_count": 106, "metadata": {}, "outputs": [], "source": [ @@ -11237,7 +11415,7 @@ }, { "cell_type": "code", - "execution_count": 105, + "execution_count": 107, "metadata": {}, "outputs": [ { @@ -11383,7 +11561,7 @@ "[3604 rows x 11 columns]" ] }, - "execution_count": 105, + "execution_count": 107, "metadata": {}, "output_type": "execute_result" } @@ -11395,7 +11573,7 @@ }, { "cell_type": "code", - "execution_count": 106, + "execution_count": 108, "metadata": {}, "outputs": [ { @@ -11446,7 +11624,7 @@ }, { "cell_type": "code", - "execution_count": 107, + "execution_count": 109, "metadata": {}, "outputs": [ { @@ -11485,7 +11663,7 @@ }, { "cell_type": "code", - "execution_count": 108, + "execution_count": 110, "metadata": {}, "outputs": [ { @@ -11517,8 +11695,7 @@ "output_type": "stream", "text": [ "Pocket (pdb): Number of atoms: 1156\n", - "Ligand (mol2): Number of atoms: 49\n", - "Ligand (pdb): Number of atoms: 31\n" + "Ligand (mol2): Number of atoms: 49\n" ] }, { @@ -11534,6 +11711,7 @@ "name": "stdout", "output_type": "stream", "text": [ + "Ligand (pdb): Number of atoms: 31\n", "Water (mol2): Number of atoms: 3\n" ] } @@ -11560,7 +11738,7 @@ }, { "cell_type": "code", - "execution_count": 109, + "execution_count": 111, "metadata": {}, "outputs": [ { @@ -11587,7 +11765,7 @@ }, { "cell_type": "code", - "execution_count": 110, + "execution_count": 112, "metadata": {}, "outputs": [ { @@ -11602,7 +11780,9 @@ "output_type": "stream", "text": [ "Complex (mol2): Number of atoms: 3604\n", - "Protein (mol2): Number of atoms: 3552\n" + "Protein (mol2): Number of atoms: 3552\n", + "Pocket (mol2): Number of atoms: 1156\n", + "Pocket (pdb): Number of atoms: 1156\n" ] }, { @@ -11616,8 +11796,6 @@ "name": "stdout", "output_type": "stream", "text": [ - "Pocket (mol2): Number of atoms: 1156\n", - "Pocket (pdb): Number of atoms: 1156\n", "Ligand (mol2): Number of atoms: 49\n" ] }, @@ -11674,17 +11852,17 @@ }, { "cell_type": "code", - "execution_count": 111, + "execution_count": 113, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, - "execution_count": 111, + "execution_count": 113, "metadata": {}, "output_type": "execute_result" } @@ -11695,17 +11873,17 @@ }, { "cell_type": "code", - "execution_count": 112, + "execution_count": 114, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, - "execution_count": 112, + "execution_count": 114, "metadata": {}, "output_type": "execute_result" } @@ -11716,7 +11894,7 @@ }, { "cell_type": "code", - "execution_count": 113, + "execution_count": 115, "metadata": {}, "outputs": [ { @@ -11750,17 +11928,17 @@ }, { "cell_type": "code", - "execution_count": 114, + "execution_count": 116, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcIAAACWCAIAAADCEh9HAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nO3deVxU5f4H8M8sbAPDvomK+y5uIKJkWmJp4laiP/NaSYleLaybNm6Ja3fQFnJJx9stqW4ZZiqaaWSmGGoQKiCmSYgoKjIMw7DNMDPP74+DI+4IszDM9/3qxWvmcHieZ0w+fs95znkOjzEGQgghjcW39AAIIcS6UYwSQkiTUIwSQkiTUIwSQkiTUIwSQkiTUIwSctv58ygrq3t94QI0GouOhlgJilFCbps5E6+9Vvf6n/9EcbFFR0OshNDSAyCkedFq8cMPGDMGAGprUVyMigpotVCpoNOhvBx6PZRKAFCrc6uqjpWVlTHGuK9KpVKv15eXl+t0unnz5vXt29fFxcWyH4eYAcUoIXdYswYvvoinngKAAwcwZ84D9xw+vOTXX2c96LuZmZmDBg363//+Z4IxkuaFYpSQO/j7Izoaa9YAgFgMHx+IxRAI4OoKPh9ubuDx4O4OAN27u3btGuPm5sbn87mvrq6uAoFALBaXlZUtWLDg66+/njZt2nPPPWfZT0RMjUc3gxIAaWlpS5cujYiIWLx4saXHYklPPoldu+DmhqFDUVqKQ4fQpk0jm1q7dq1EIuncuXN2drajo6NRh0maF5piIgBw6dKlw4cP5+TkWHogzYJQiI8/xsWLTWrkX//6V79+/S5evPjee+8ZaVykmaIYJQBQWloKwMvLy9IDsaTDhzF5MlxdASA0FMeOwcenMe0cOHBAr9cLhUKZTMbn8+Pj48+dO2fcoZJmhWKUAIBcLgfg6elp6YFYjE6HuXPxxhvYu7duy+DBcHB47HZmzpw5evRomUwGIDQ09LXXXtNoNLNnz6azZy0YxSgBblWjthyjn3+Oc+fQoQMiI5vUDjehtHDhwqKiIgBr165t1arV0aNHv/jiC6OMkzRDFKMEuFWN2uxBfU0NVq4EgPfeg719k5qaOHHiuHHjysvL3377bQBubm7r1q0DsHnzcbncCEMlzRDFKAFsvhpdvx6FhejbF5MnA4Be36TWNmzY4OLisn379h9++AHAtGnTYmJO/vHHlnfeMcZYSfNDMUoA265Gy8oQHw8Aa9eCz4dOh9BQSCSorGxkg4GBgcuXLwcwb9686mo1gAULQoVCfP45Dh821qhJM0IxSgDbnqmXSlFaimHD8MwzAJCYiD/+wI4dsLNrfJvz5s0bMeJlb+/UNWscAHTujEWLwBj++U+o1UYaN2k26PJ7AgCenp4KhUIul9vacX1REbp0QXU10tIQFoaaGnTrhsuX8fXXmDq1SS2npyMsDEIhTp1Cz57QaNCvH86dw5o1sO1bHFogqkYJdDqdUqnk8/nu3E2OtmTLlhNCIXvhBYSFAcCGDbh8GX36YMqUprY8cCBiYqDRYPZsMAZ7e2zZAh4Pq1cjL6/pAyfNCFWjBHK53Nvb28vLq6SkxNJjMasLFy706tXLw6PzsWMZXbs6l5Whc2fI5ThwAM8+a4T2y8vRoweKivDZZ5gxAwBeeQWJiXjmGRw8aIT2STNB1Six3WvvFy9erNVqJ058smtXZwBbt/5dVobhw42ToQBcXfH++wAwfz5u3gSADz6Ajw9++gnffmucLkhzQDFKbHSaPj09/fvvv3dycnr33XcBXLt2bcWKoI4dJ65bV23EXqZOxbPPwsGh7kDeywtSKZydUV5uxE6IhVGMEhu9aHTRokWMsXnz5rVp0wbAihUrqqqq+vQRhIQ4Gbejzz7DuXN1514BzJiBtDT88gtKSwFAocDy5cbtkJgbxSixxWr04MGDhw4dcnd3X7BgAYC//vrrs88+EwgEq1atMnpfAQFwc7v9lseDmxtSUrBwIQBUV+PIEaP3ScyKYpTY3EWjjDFuWdXFixdzNfiSJUtqa2ujo6N79OhhnjGEhqKoCGlp5umNmBbFKLG5g/rt27dnZmYGBATMnTsXQEZGxnfffefo6MidJDWbjz7CvHnQas3ZJzEJeogIsbmZ+n379gGIi4sTiUQAqquru3XrNnbs2LZt25pzGF26YPRobN5szj6JSVCMEps7N+rj4wOgoqKCezt06NDs7GyNJZ5Jv2gRQkLg62v+nokx0UE9sbmD+lGjRgFYvnz5lStXuC1CoZCrTM2Dx0PnzgDg5IT330fXrmbrmZgExSixuWp01KhRkyZNUqlU8+bNM3/v1dUYMQIODqipAYDRoyGTmX8UxJgoRm2aWq3eunVrXl6el5eX7VSjADZs2ODu7v79998nJyebuev163HxIlJSmro+NGk+KEZtlEqlio+PDwwMnDVrllKp3LRpU4cOHSw9KPPx9/dfuXIlgDfeeMNwktQMysqwdi0ArFsHPv3ytRiM2BilUimVSg21Z79+/ZKSkvR6vaXHZW46nS4sLAzA/PnzzdbpO+8wgA0bZrYOiTnQCk82pKSkZOPGjR9//HFZWRmA8PBwiUQyduxYS4/LYrKysoKDgwH8/vvv/fv3N3V3d61tSloOS+c4MYcbN25IJBLDZHR4ePjPP/9s6UE1C9ws08CBA3U6nan7eu01BrCoKFP3Q8yNqtEWrqCg4MMPP/zPf/5TXV3N4/HGjBmzdOnSQYMGWXpczYVKperZs+eVK1c2b948e/Zs03V04QJ69QJjyM6Gue44JeZi6RwnppKXlxcbG+vg4ACAz+dHRkZmZGRYelDN0c6dOwG4urpevXrVdL08/zwD2KxZpuuBWAzFaAuUk5Mzffp0oVDIBWhUVFRubq6lB9WsjRs3DsDUqVNN1P7Jkyd79ZoxaJDclEFNLIZitEU5ffr09OnTBQIBAHt7++nTp1+4cMHSg7ICBQUFLi4uAH744QdTtP/000/j1gqnpOWhGG0hTpw4MXr0aO5EjZOTU2xsbGFhoaUHZU3Wrl0LoHPnzlVVVcZt+ccffwTg4eEhl8uN2zJpJmiKqSUoLi5euXLlpk2bXFxcoqOjJRJJQECApQdlZbRa7cCBA0+fPr106dK7Fm/ev3//lStXdDpdeXm5Xq9XKpWMMe6iMYVCAUCpVOr1+vLycp1Op1KpMjMznZ2duZ9ljIWEhGRmZq5bt27+/Pnm/1zEHCwc48QYEhMTAfTr14/qnaY4efIkn8+3t7c/e/Zs/e2Pe0lpSUmJ4We//vprAK1bt66srDT7ByJmQgvltQTc2iLDhw+3qfvijS40NHTmzJkymWz27NlHjhzh8Xjc9rFjxw4cOJDP57u5ufF4PHd3dwAeHh4A3Nzc+Hy+q6urQCAQi8VCodDFxYXbAUBtbe2yZcsArFy50pwrSBEzoxhtCWxtpTvTiY+P37t3b2pqamJi4iuvvMJtXLFiReNa27p168WLF7t16/bSSy8ZbYik+aEYbQlsbaU703Fzc1u3bt20adPmz58/ZswYboHn+zKcCdVqtRUVFbW1tZWVlRqNpqqqSq1W19TUlJWVLV++HIBUKuUuPiMtFf3fbQmoGjWiF198cdu2bSkpKSEhIZ07d37QhFJDmurfv/+AAQPGjx9v2hETS6MYbQmoGjWuSZMmpaWlXb58+fLlyw/ax3Am1M7OztnZ2d7eXiQSOTg4ODo6Ojk5OTg4iESisLCwGTNmmHPkxCIoRlsCW3tCsknpdLr169dXVlbOnTt34sSJ9SeU3N3deTweN6Fk6WGSZoRitCWwtUd7mtSXX3559uzZ9u3bf/DBB9yKBIQ8HC3A3RJQNWosGo2GWxV/1apVlKGkgagatXqM1f76q79W25W7K5w0xcaNG/Pz84OCgl588UVLj4VYDYpRq6fVyhn7y9HRz3C5OGkc7vlUAKRSKZ+elEQajP6uWD2tVg5AIKAj+qaKj48vLi4eOnToc889Z+mxEGtCMWr1dLpSAEIhzS81SXFx8fr16wFIpVJLj4VYGYpRq8dVo0IhVaNNsnz5cpVKNWHChCFDhlh6LMTKUIxaPa22FIBAQNVo4+Xn5//3v/8VCASrV6+29FiI9aEYtXo6HVWjTbVo0SKNRvPyyy/36tXL0mMh1odi1Opx1SidG220M2fO7Nixw9HRMS4uztJjIVaJLniyHK0W+/ahoAC9eiEiognNcDFK1WgjvfPOO3q9/vXXXw8MDLT0WIhVooeIWIhOh2efxRNPICQE+/ZBp4NEgv374eaGl19+rJZKSj5VqQ55e88Wi4eZaLAt2JEjR4YPH+7m5paXl0e3gZHGoWrUQvbuRbt2WL4cACIjMXgw1GrMmIHHvOq7puZcefnPWu3NiopfKUYfF2Ns4cKFACQSCWUoaTSKUQs5exbBwbffhoQgJwdDh8LLC56ed3z19KwYE6D3dhYIvIRCT6HQWyBwM/xcQUFMmzbrRKJgjeaBS7o9Wm0t8vPh7w9X1yZ8JOuzc+fOEydOtGrVKjY21tJjIVaMYtRCxGJUVNx+W1EBxqBQQKG4d9+rg/tUKLIMb3k8ARep3t4xPJ6guvqss3Oog0MntfpiVdUfQqH3rcD15PMbcJf9Dz8gLg5hYfjzT/TqhQ8/xN9/A0CHDmjRa7brdDruQUlxcXGGB3kS0gh0btRCcnLw2ms4ehT29lAoMHgwTpyAXg+5HKWldV9vvbgyV1styNfpSrXaEq22VKdTcm0EBKzy9JxSVLSsqiqzVatlOp3q8uV/1u+Ex3MQCj0dBO27zbG7o8jl/vP0RI8eGDoUJ07AwwMAoqLwj39AowGAyEg4Od137Evy86+p1Y58PoAVHTr42NmZ8k/KVLZu3Tpr1qwuXbqcPXvWzjo/AmkmWnK50az17o0ZM/Dkk+jYEXl5+OgjcI+TvN+aoW3ufMuYVqcr1WrlAoGnnZ1fhw7faLU3c3P7tmv3iYdHlFYr576r1Zbq9ZW1tdcEOicc/fv+w/j2W/ToUZehAMaPx/HjeNTdkBq9fmG7dl0fELJWobq6mnsY/Zo1ayhDSRNRjFrOrFmIiYFCcd/ofAgeTygU+gqFvgCqqjKcnPozpuHx7Fxdn3Nzm1B/T8bUWq1cX6nAryW3y9uSeq9dXFB/IXc7u7pS9FFyKioUtbUigSDIeg6HlUrlxYsX8/Ly8vLykpOTr1y5MmDAgEmTJll6XMTqUYxaFI/3uBl6F6Xyh6KiZYCgffvPeDz7e5p3sLMLgHsAHjSHX1aGt95CbS24iuzYMYSFNaTfv2tqlDqdl1DYPGNUoVD8fT/19/Hy8ho0aBCtLkiajs6NWrfKyvQrV+aLxU8GBKxqZBMJCUhJQVQUzp7FmTPYv/+RM0sL8vJmBgQ0h4N6rVZbWFiYl5dnKDM5lZWV9+4sEok63VJdXf3JJ5/4+/v//fffTs3ggxCrRtWoddNoCioqjtrZPfBx6o/25pt49lmcOoUxYyCVwhoe1paRkfHuu+/m5eVdunSptrb23h28vLw63alz586tWrWqv096enp6evpnn302d+5ccw2ctExUjVq3mzdlly/P9vaOaddOZrZOfykr6+vi4mWhy6FOnDixbNmylJQU7q2Hh0fHenr27Nm7d2/ucZ4Pt2vXrueff75t27YXL160t7/7fAghDUfVqHWzyJrNA1xcRp4509bR8XtLrIf022+/paSkPPfcc2vXru3UqZOjo+PD91coFPWP91944QVucfsJEyYEBQVlZ2d/+eWXr776qlnGTlomilHrZpF1SZRaLQMsNTWTnZ0NYNy4cfcuateQmSV/f38uRnk83qJFi1588cV///vfL7/8srBF32tATIr+6li3Ww9iMms1qtRqAbhZ6CwqF6NBQUHc24yMjDVr1nCVZlVV1b37Ozs71z9DOnjwYMO3Jk+evGLFivPnz3/77bfTpk0zz/hJy0Mxat1uHdSbtxrV6QC4WaJ802q1ubm5PB6vd+/e3Ba1Wr17927u9V3nSTnt27d/0GM+BQKBRCKJjo5es2bN1KlT6WmgpHEoRq1baWk3YLBO1+bRuxoPV426WiJGL1y4UFNT07FjR9dbq6j06dMnKSmJKzbd3Nwe/uP3+sc//rFq1apz587t2rXrhRdeMPZ4iU2gf36t2yuvxIeGpt24EfzoXY2n7qDeEjGalZUFoE+fPoYtYrE4KipqwIABjchQAHZ2dgsWLACwevVqumqFNA7FqHWTy4H734hvQnUH9ZY4N8qdGK0fo00XHR3dunXr06dP79+/34jNEttBMWrduHX1zByj5ZauRg3zS0bh4ODw9ttvA+AWKyHkcVGMWjGVChoNxGKY+eJxC54bFQrn9O8/Pyion3GbnTVrlq+v78mTJw8dOmTcloktoBi1YhY5ogegPXq0S26ua1mZmftVKrFnz+g//1zXuXNn47YsEonefPNNAGvWrDFuy8QWUIxasdJSADD/M4QOrV+//aWX7O+3UL9JZWWBMfTubZL7/ufOnevh4XH48OFjx44Zv3XSolGMWjFLVaNyuRyA+Z8Bl5UFAEadXrrN1dWVeyLTe++9Z5IOSMtFMWodLl6EXl/3urAQlZX44w8EB+PIEaxejbNnzTqY0tJSAJ5mz+/sbAAw6vTSHWJjY8Vi8Y8//pienm6qPkhLRDFqHSZNgkpV93rBAmRmIiQEO3bgyScREoKoKPONRKPRVFRU2NnZubg04Hl5RsVVo6aLUU9Pzzlz5oAKUvKYKEatVe/e+M9/cOOGufs1HNGbed14xuqKbtPFKIB//etfIpFoz5493JVVhDQExajV2LQJH36IDz/E+fMA4OCApUsxf765h8Ed0Zv/xGh+PsrLERAAnyYsUX0vvV4fGxt78OBB7q2vr+/MmTMZY8uWLdPpdMbsibRcFKNWo3t39OyJnj1huOlxwgQoFDhyxKzD4KpR858YNcX8kk6ni46O3rBhw7Rp01S3TpqMHz/ezs4uLS3Nz89v8uTJW7duvXbtmjF7JS0OxajVGDECo0Zh1Cj4+9/e+PHHWLwYAE6exKefwgw3hVuqGpXLIRbj1rpORqDVal955ZXExERnZ+ft27eLxWIAGRkZkyZNqq2tra2tlcvlO3bsmDVrVtu2bYcMGbJ69erMzEy6757cByPWoG9fVlZW93rKFHb0KAsOrnu7fDnr3p1168YANno0u3LFhMPIzMwMDw93d3fv0KHD1atXTdhTPbt3s6NHGWNMr2c7drCiIiO0qVarJ06cCMDNze23337jNh47doxb3yQyMrK6uvrChQsfffTRyJEjHRwcDL8v/v7+b7+9eceO2/87CKEYtQ7p6UyrrXt99iwrK2MnT9a9ra5maWksKYl5ezOAubkxmcz4Azh8+HBERAQXJc7OzgA8PDy++uor4/d0j8mTWceOTKFgjLFp025/8EarrKx85plnuI9w8lZzv/76K1eQTpkyRaPR1N+/qqoqJSUlNjY2MDAQwLBhhwEmELDgYBYXxzIymF5/e+erV1lhYd3roiImlzd1tKT5oxhtOa5fZxMmMIAB7LnnmLGKxdTU1BEjRnABKhaLY2Njs7Kyxo8fz20ZM2aMqcvSyZPZkiVszhzGjBGjFRUV3Mfx8/M7c+YMt3H//v3cY5anTZtWW1v7kB/PysrasEE+bBgTCuv+qAHWrh2bPZslJ7PKSrZ0KQsMZCoVY4wtX87M8g8NsTCK0ZYmKYl5ejKA+fiw775rfDt6vT45OXnQoEFcXHp5ecXFxZWWltbrKMnDwwOAj4/Pd03p6VEmT2bZ2eypp9jJk02NUYVCwT1EpFWrVjk5OdzG5ORk7rB91qxZOp2uwU2xpCT2yivMz+92njo5sbffZhMnsvnzGaMYtRkUoy1QQQGLiKj7xZ49u1z+mAeWOp0uOTk5OLhuKWgfH5+4uLiy+50LLCgoMBzpR0VFlZSUGOkTMMaYXs927WLfflsXozk5bMgQNnUqO3mSffMNu/Owu0FKS0tDQ0MBtGvX7uLFi9zGb775xs7ODsD8+fP19Q/OH0dODpNKWUQECw5mS5eynTtZeDg7c4Zi1FZQjLZMej2TyZirK+vbN9bPz2/37t0N+SmdTpeUlNS9e3cuGdu2bZuQkFBVVWXY4fTp0zdv3ryzI71MJuPuaPL399+zZ0/TB6/TseRkNmAAA1irVuyFF1h2NmOMLVjAPDxYfDwDWGAgk8luny9+pOvXr3OrlHbt2rXw1snLL7/8UiAQAJBIJE0fNmNMrWZLl7Lvv2d//MGefJJi1FZQjLZkeXmlTzzxBJeJr776qlKpfNCearU6MTGxS5cu3M7t27dPSEiorq427HDq1KmoqCgej7dw4cJ7f/zvv/8eNmyYoSytf+z/WDQa9vnnrGvXulI6MJBt3Mhefpnl5jLGmErFundnmzezHj3qdujfnx048OhmL1++zH20Hj16GM7kbt68mXuG3YoVKxo32vviYpQx9vrrLCiIYtQmUIy2cFy1KBKJAAQGBv7888937VBTUyOTydq0qXsoXqdOnWQyWf1plqNHj3Lz2twc/bvvvvvIjtq1a3fo0KHHGqdazRITWefOdfnYoQNLSGD1YvwOOh1LSmIdOtTtPGQIS019YMv5+fmdOnUC0L9/f0MpvXbtWgA8Hu+jjz56rHE+kiFGlUoWEEAxahMoRm1Cbm7uwIEDueCIiYlRqVSMMZVKlZCQ0KpVKy4ig4KCEhMTtfWOk1NTUyMjI7nvuri4xMbGFj3qos2zZ8/e29HDVVZWbt2aGhBQl4k9e7KvvmrQ0bpazWQy5utb94MRESwr6z67paamikSiwYMHK7hrphiTSqXcCDdu3Pjobh7T1at112YVFrJPP6ULnmwCxaitqK2tXbVqlb29PYCOHTu++uqrhhs6Bw0alJycXH+CJSUlJSwsjPuuq6urRCJp+DxVbW2tVCrlOurQocORI0cetKchxwUC+/btNX36sMTExzjdeasRJpUysZgB7KmnDkZFReXn59+1z/Hjxw2BvnTpUgACgWDbtm2P19PjqK5mDg6Mz2eNPb1BrAnFqG3Jzs4eMGCA4RL68PDw5ORkw3e5OfqQkJBHztE/UlZWVv/+/QHw+fzY2Niampr635XL5XFxcdz1UgDCwsIOHsxp7Dw5Y4xdvcreeEMjFvsBEIlECxcuNNSeBnq9ft68eQDs7e137NjR+M4a5oknGMD27jV1P8TyKEZtjlqt5u6IT0pKMmzk5uh79OjB5Zqfn59UKq2srGxKRxqNRiqVcpcT9ezZMz09nTFWXFwcFxfn7u7OdXRXjjfR+fPnuXkw7g4lqVRquMxAq9VGR0cDcHBw2LVrl7F6fIglSxhQdwEpadkoRm0RV4oajnMVCkXHjh25XOvQocOWLVvuKh6b4vjx4926dQNgZ2cXHh7OzUEBGDVq1LFjx4zVS32///674bar1q1by2Sympqal156iStUf/rpJ1N0yklPZ//+d939Yz/9xAAWEmK63khzQTFqc9RqNXdgW3/js88+27Fjx7vm6I2lurpaIpHweLzWrVvzeLzIyMiTTb8x/lEOHjzInb4AwC044urqmvqQGX1jGDuWASwxkTHGKiuZvT0TCGgRk5aPYtTmFBUVcXdD1t9YXFzc8PsgGyc8PByAKSbHH0Sv1yclJXXq1KlNmzZisfj48eOm7vH99xnAoqPr3g4ezAC2f7+puyUWRuuN2pz7rrvs4+PDXYtuOlqtFoDhHlMz4PF4UVFRp0+fLikpqaioMPrT7e81fDiA2wtpc3ckmHldbWJ+FKM2x2zrLufm5u7cufM898wTyz1P1MXFJSwsjDFmhgfQ9+sHd3fk5aGwEKAYtRkUozbHbE8B2bNnz6RJkxITE+v3a/5l8wFwN6oeMX2eCQQYMgQAUlMBIDwc9vZQKmsqKqpN3TWxIIpRm2O2OKtffur1+rKyMj6fb7jUyZzMFqMAhg0Dn4/MTBUAsRhDhow/d84pLS3VDF0TS6EYtTlmO7iuX/aWlZXp9Xp3d3duRSUzGzx4sKOj45kzZ8rKykzd19NP54nF7fftG8i9DQnpCuDo0aOm7pdYEMWozTHbudH6Za+lnifKcXR0DAkJ0ev1Zjk92k6vLz1//jx3RQRXCP/666+m7pdYEMWozTFbotUvey14YpQzfPhwmOW4XigUcgvsc5E9dOhQgUCQnp5eVVVl6q6JpVCM2hyLVKOWmqY3MGdVWP9UrJubW9++fTUazYkTJ8zQNbEIilGbY+ZqtP5BvQWr0SFDhtjb2586dUqpVJq6r7tmtMw5wUUsgmLU5pgt0RQKBQBuGSeLV6MikSg4OFin06WlpZm6r4EDBzo7O+fm5hYXF4Ni1AZQjNoc8yRaeXm5RqMRi8XcwqNmO5PwEGaLM3t7+/fee2/79u3cEjBDhw7l8/knTpyoqakxddfEIihGbY55YvSu3LTsTD3HnFVhbGzs5MmTuRj19PQMCAjQ6XTjxo3btm3bjRs3zDAAYk5CSw+AmFVlZWVNTY1IJHJycjJpR3flZnOoRp944gmhUJiRkaFSqcRisXk6ZYy9+eabV65ccXV1TUlJSUlJAdCzZ8+xY8dGREQMHz5cKKTfQatH1ahtMfO1982qGnVxcenfv79WqzXbpDlj7I033li/fr29vX18fPymTZvGjBkjEolyc3Pj4+NHjhwZEBAwffr0b77ZXlpqnhERk6AYtS0WuRPUnP0+nDmP63U63YwZMzZt2iQSifbu3Tt79uw5c+bs27dPLpenpKRIJJIePXrcvHnzq6++Wr78e19fhIRg4UIcOwbGzDA6YkwUo7blvgfX3ISycd2VmxafqeeYLUY1Gs3//d//JSYmOjs779271/CEagCOjo4RERFSqTQ3N/fPP//88MMPhw+fKxTijz8QH4+hQ9GmDWbOxPffQ6UCgF9+QUhI3eujR7FiBd58E2fO1LW2fj127TL1pyGPQDFqW+49uL506VKXLl1mzZpVUVFhxI6aZzXK3VP0+++/m/SeIrVaPWXKlO+++87d3T0lJeXpp59+0J7dunV76623ZLJhJSXYtQszZ6JNGxQV4dNP8cIL8PbGiBHIzoZKhbg4AKiqglyO68dkHSIAAAcBSURBVNdhmPMvLUV5uek+CmkQilHbwqUb99A3TlpaWnV19datWwcMGGDEayqHDh26ZMkSrvrTarUqlUooFLq6uhqr/ca57z1FhYWFYWFhK1euzMjI0Ov1Teyiqqpq7Nixu3fv9vT0/Omnn7gbQx/JxQUTJmDrVhQWIi8PCQmIiABj+OUXiESYMAGnTuHUqdv7X7uG/Hzk58P0a62QBrDw6vvEvM6fPz9q1CiBQCCRSDQaDbcxOzvb8DDkmJiYJj4Q9F7cJT6+vr7GbbZx3nrrLQDLli0zbNmyZYvh18Hb2zsqKioxMbG0UQ+YV6lUTz31FAA/P7+srKwmDrW0lCUns+RkJpGw06dZeDjbv5+98QabMoVNmMBiYlhMDAsOZtu2NbEf0lQUozYnNjaWq0ZDQ0Nzc3O5jfd9GLKx5ObmAujevbsR22y03bt3Axg2bJhhS1VVFTfnwz3BlCMQCIKDg+Pi4rgStSEtKxSKsLAwAG3btr1w4YKxBszFKGPszTfZ1Kl1MXriRN134+IoRi2PYtQWpaamdurUCYCjo6NUKtVqtdz2kydPdu/eHYBQKJRIJGq12ijdffDBBwC6du1q6qfmNYRcLufz+XZ2dkePHr13PHl5eQkJCREREdzNVxw/P7/p06cnJSUplcoHNXvjxo2+ffsCaN++/cWLF404YEOMKpWsdev7x+i337ING5jxnopNHg/FqI1SKpUxMTFcWTp48ODz589z27mHIXOLKwcFBWVmZja6C71en5ycHBoailt31g8ZMsSIZVqjLVmyJDAwEICXl1dUVJRMJrt27dpd+yiVyu+++y46OrpVq1aGPHVwcBg5cuSVK1fu2vnatWu9e/cG0K1bt8LCQuOONjf39rNFf/6Z7dnDtm1jly7VbfnxR3bwIDt+nO3dy/77X+P2TBqKYtSmHThwoE2bNgCcnJykUqmhOvvtt9+6dOkCwM7OLi4uzlCuNpBWq/3mm2+CgoK49PH394+Ojvbz8wPg4uKyefPmBh4mm4hOp3v99dc7duxY/xA+PDx8zZo1mZmZ944tJydHKpVGRETY2dmJxeK7ivSCggLuz6pnz55FRUVm/Bx3+PRT9ssvlurc1lGM2jqFQhETE8OlSUREREFBAbe9srJSIpFwT10eNGjQuXPnGtKaRqNJTEzkzgwACAwMTEhIqKqququjkSNHXr582YSfqmHy8vJkMllkZKSDg4MhUn19fblDeIVCcdf+JSUlR44cqb8lPz+fi+MBAwbcvHnTjGO/w4ED7JNPLNU5oRgljDHG9u3bxx29urq6ymQyw/aDBw9y5apIJNq3b99DWlCr1YmJiVxdxp0iTEhIqK6uvmu3HTt2+Pj43NuRZVVWVqakpMTGxrZt2/auElUqlT5oluncuXOtW7cGEB4eXlZWZv5hc86cYc88wyQS9uOPlhqCraMYJXVu3Ljx/PPPcwkyatQowxlA7iyqt7f39evX7/uDNTU1MpmMS1sAnTp1kslktbW1D+ro+vXr48eP53YeO3bstQc0ayn3nWVq3759TExMUlJSeXk5t1tOTg73D8+wYcMMG4ltohgld0hKSuLuNXJ3d69fLd43Q1UqVUJCgmESJigoKDExsYEnUpOSkjw9PT0CAp4/fXqn5Q6HH6K0tHT79u0vvfSSr6+vIU+dnJxGjRr1zjvvcDdojR49mjtlQWwZxSi527Vr18aNG8elxqRJk+57yk+pVEqlUsO9nv37909KSnrciaPCwsJ3U1ODMzKCMzIW5uWVPbiAtTjDLBO3rh2fz7e3t3/++eeNdU0YsWo8RuvJkPv54osvXn/9dZVK5evru2XLlokTJ3Lbb968uWnTpo8//ph75nt4eLhEIhk7dmyjO/pBLo8vLKzS6TyFwkXt2j3l7m6cD2AaxcXFBw4c+OuvvyIjI4ODg2m1UAKAYpQ8UEFBQXR09C+//AIgKipq1apVn3/++YYNG7h1PcLDw1esWDFixIimd3RNo1lx6VKGSgUgwsNjcWCgK8UTsR4Uo+Rh9Hr9xo0bFy1aVFVV5ejoWFNTw+Pxxo0bt3Tp0pCQECN2xIBdJSUfFRZW6/XednZL2rXrIRJdVqu577ZzcPCyszNid4QYEcUoebQLFy7MmzevR48e165dW7x4seG6eqMrqKlZfulSdmUlDxjv41OsVge5uAAY6ubWXSQyUaeENBHFKGle9MC3xcV75fJILy8w9qKfn6VHRMgjUIyS5kjH2M6Skp8VCq4InRMQ4MintXFJM0Un8klzJODxAPQSiUZ7egKwr7fONCHNDcUoab587Oy60ilR0uzRgRIhhDQJnRslzZRSq2WAO11ASpo9ilFCCGkSOqgnhJAmoRglhJAmoRglhJAmoRglhJAmoRglhJAm+X8U1V9jMIYuMgAAAjB6VFh0cmRraXRQS0wgcmRraXQgMjAyMS4wMy41AAB4nHu/b+09BiDgAWJGBgiQB2IlIG5gZEvQANLMLGwJFiCakQUhAKUVDJBoJgSNrg7TIFwmYlGBoRRdhlNBAeR+KMWuABFmZodoQNAQCSYMCQ4FkH//M8JoAQWQOCsLNwNHAoNgBhODuAIjUwYTo3gCE3MCE68CM2cGE7NEAgsrAysbA5scAztHBhO7cAK7mAKHCAMnVwKneAIXdwYTN08Cj0QGE4+kAi9fBhOvQAKfVAK/VAYTv3SCgHQGk6BQgqAog5BwBpOYHIOMHIOsHIMICysjEzOnOBu7sJAgAwcbFzePBDMnG58Uv7QArzgsghjkG6S793eYX9gP4nhwstvf/c1gD2Jz32FwaM81BbNzt2s5RKqpgNXYzvI/MLt0ogOI/bYn7MAqbWcw+3PFtAMeAZJgNkNq9oEfqjvA6tkZRA+k3/MAs6N+nLIXFbsOZvO++2Hfd8DjAIituDbCYW5JMpht+KXPQfOzApi9RU3PIYyBCWI+T7tDjyQrmM0c1+KgsHQqmB3255u9WE8wmP2QYeb+wNvuYL2ZT5UObN5WCGZvCC860HHJGswO5+U7cFreDOyvzaU2ttX7a8Hii7PnHnDbLQF226GdbXYdjJVg9pGyZgfv6nYw245/r4PFcog5HpvmOjTsiwTbe+WEhkOrxBQwm0s15IBmhRfYfMFLJw9cZ2sEs70/zTzwxikNzBYDAFHjlN4lriiXAAACLnpUWHRNT0wgcmRraXQgMjAyMS4wMy41AAB4nJ1WS27cMAzd+xS6wAgkRVHissi0CVA0BVqgd+iqm+b+oSyNrGkSoKZhwHqm+My/LC8vf+KnLbTrx/Xr779hXnTdtpAwJA4B3r1VNfwiAGj6F4xQpfaVkJTGAdGkEB7CRxTrvXWNTCWPFaTqY6EI2OxuugWq0xaKIqWxXCAKI7lYLikSdz84Zs7iZUmZdo9SBNbsY2GLBqXuW9LsZElRSoWeaXPNF92LWUAVe3RLZV9cAsZccxlVV4G9LMpcu2+YxFl1lqO659dYcmbwsXBkKalHKCO7O6AQ4uiFhMlrCxGMeoGizj7iFtPcV1LEnyNSGXGG7GOxKkHNaWSayBfdlhm+sZTirJemW0U6nyZ29xGhju4piGtcvpyZu8AC3SqVu6r7fxabL4o6JmZWWXv6+YwtJGlMBi1UfCxWdVCp5xxsSPhYclToU6rliNBri9I+Ma12eUzg8yx2HqV9MrQ+GnynWdpJMqdKUdCF5ftbFvyARawHRXtfAtzZcoKFY7Ukdd2qd6faz7cs7/yIbDu3dtkOsC6gnZjYgVVCmhLaJQP01xPgocMBYUo4UJ7AVjK32apMUNo/0w3U1bYaCFaQ5jYNNHXsi21u8w0chtrr9g8yAAWc/tjqsK2BaZs5g4fEQJkgBzqA/ANmEE1hATWgLoBofkcX58yzIwakC0hwgG8hPDw97omxPdaloYnt2SSfn6/bK7j+pTpm8CpFAAABeHpUWHRTTUlMRVMgcmRraXQgMjAyMS4wMy41AAB4nCWSO24jMRBEr7KhBFBE/z9wKMChN9jQcDS5TuDDbzWFAYiZAl91sTjP5/Pf7fvv4+f+Xr8uvm6f9+v2eMmF9dLrhUfveIFw3b7uL3zMlov//N4eusU0e9l28+D1AUVd1JdusnaDYjtJJJZsbXc5SjGVLtrVbd5vjC0DUjZVB6TYSlG9eBMVvbnm1l4P2t4RVAeMLLL14G1aMSAGSbHOtiwLs6MJtx9/ZhOFBN8CO2RIBFLQllDWGLJTokZySSsH6KRlAGUTq036pEo6Sgoz44SkLLk+bIuQ6gjZY4PkUsRoxdCFj4A5ViguMozHIxQjR5BshGEg7QVEyd9zI9J8woEQni1enucARYg9jE2LaAX2iTmgy2ePbncdX9sWqbxQibMVyvGNyvkorUInLu4HMacjL8ycttCf2rEWwQxUQxbEdMwbh+HTM36EIXVnTrtzQzn3ctwtZd1//wMyNYIrmm29ogAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, - "execution_count": 114, + "execution_count": 116, "metadata": {}, "output_type": "execute_result" } @@ -11771,17 +11949,17 @@ }, { "cell_type": "code", - "execution_count": 115, + "execution_count": 117, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, - "execution_count": 115, + "execution_count": 117, "metadata": {}, "output_type": "execute_result" } @@ -11799,17 +11977,17 @@ }, { "cell_type": "code", - "execution_count": 116, + "execution_count": 118, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, - "execution_count": 116, + "execution_count": 118, "metadata": {}, "output_type": "execute_result" } @@ -11828,7 +12006,7 @@ }, { "cell_type": "code", - "execution_count": 117, + "execution_count": 119, "metadata": {}, "outputs": [ { @@ -11848,7 +12026,7 @@ }, { "cell_type": "code", - "execution_count": 118, + "execution_count": 120, "metadata": {}, "outputs": [ { @@ -11868,7 +12046,7 @@ }, { "cell_type": "code", - "execution_count": 119, + "execution_count": 121, "metadata": {}, "outputs": [ { @@ -11888,7 +12066,7 @@ }, { "cell_type": "code", - "execution_count": 120, + "execution_count": 122, "metadata": {}, "outputs": [ { @@ -11915,7 +12093,7 @@ }, { "cell_type": "code", - "execution_count": 121, + "execution_count": 123, "metadata": {}, "outputs": [ { @@ -11935,7 +12113,7 @@ }, { "cell_type": "code", - "execution_count": 122, + "execution_count": 124, "metadata": {}, "outputs": [ { From 4f50785e6df0cae74a0f3adb5f48fbfa4455b8f8 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 4 Oct 2021 15:17:02 +0200 Subject: [PATCH 8/9] KLIFS: Update tests (test structure 4126 only for modifications) --- .../tests/databases/test_klifs_local_remote.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/opencadd/tests/databases/test_klifs_local_remote.py b/opencadd/tests/databases/test_klifs_local_remote.py index e4673174..09413a8a 100644 --- a/opencadd/tests/databases/test_klifs_local_remote.py +++ b/opencadd/tests/databases/test_klifs_local_remote.py @@ -384,12 +384,10 @@ class TestsFromStructureIds: Test class methods with structure IDs as input. """ - @pytest.mark.parametrize("structure_klifs_ids", [12347, [12347, 100000], 4126]) + @pytest.mark.parametrize("structure_klifs_ids", [12347, [12347, 100000]]) def test_by_structure_klifs_id(self, structure_klifs_ids): """ Test class methods with structure IDs as input. - - Note: ID 4126 added to test modified residues """ # Structures @@ -432,6 +430,18 @@ def test_by_structure_klifs_id(self, structure_klifs_ids): # No local access available check_dataframe(result_remote, FIELDS.oc_name_to_type("structure_modified_residues")) + @pytest.mark.parametrize("structure_klifs_id", [4126]) + def test_modifications_by_structure_klifs_id(self, structure_klifs_id): + """ + Extra test for modifications: Use structure that has modified residues in and outside the + pocket (e.g. structure KLIFS ID 4126). + """ + + # Modified residues + result_remote = REMOTE.modified_residues.by_structure_klifs_id(structure_klifs_id) + # No local access available + check_dataframe(result_remote, FIELDS.oc_name_to_type("structure_modified_residues")) + @pytest.mark.parametrize("structure_klifs_ids", [100000, "XXX"]) def test_by_structure_klifs_id_raise(self, structure_klifs_ids): """ From b9e8156213987816276fc886ee56b6e2eae02e31 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 4 Oct 2021 15:19:11 +0200 Subject: [PATCH 9/9] Satisfy pylint --- opencadd/databases/klifs/local.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/opencadd/databases/klifs/local.py b/opencadd/databases/klifs/local.py index 22e22807..a00f0896 100644 --- a/opencadd/databases/klifs/local.py +++ b/opencadd/databases/klifs/local.py @@ -911,7 +911,7 @@ def all_conformations(self): "Information on conformations is not available locally! Please use a remote session." ) - def by_structure_klifs_id(self): + def by_structure_klifs_id(self, structure_klifs_id): raise NotImplementedError( "Information on conformations is not available locally! Please use a remote session." @@ -925,7 +925,7 @@ class StructureModifiedResidues(LocalInitializer, StructureModifiedResiduesProvi opencadd.databases.klifs.core.StructureModifiedResiduesProvider """ - def by_structure_klifs_id(self): + def by_structure_klifs_id(self, structure_klifs_id): raise NotImplementedError( "Information on modified residues is not available locally! Please use a remote session."