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",
+ " system_id \n",
+ " entry_pdb_id \n",
+ " system_biounit_id \n",
+ " system_protein_chains_asym_id \n",
+ " system_ligand_chains_asym_id \n",
+ " ligand_instance_chain \n",
+ " split \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 3grt__1__1.A_2.A__1.B \n",
+ " 3grt \n",
+ " 1 \n",
+ " [1.A, 2.A] \n",
+ " [1.B] \n",
+ " 1.B \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 3grt__1__1.A_2.A__1.C \n",
+ " 3grt \n",
+ " 1 \n",
+ " [1.A, 2.A] \n",
+ " [1.C] \n",
+ " 1.C \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 3grt__1__1.A_2.A__2.B \n",
+ " 3grt \n",
+ " 1 \n",
+ " [1.A, 2.A] \n",
+ " [2.B] \n",
+ " 2.B \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 3grt__1__1.A_2.A__2.C \n",
+ " 3grt \n",
+ " 1 \n",
+ " [1.A, 2.A] \n",
+ " [2.C] \n",
+ " 2.C \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 1grx__1__1.A__1.B \n",
+ " 1grx \n",
+ " 1 \n",
+ " [1.A] \n",
+ " [1.B] \n",
+ " 1.B \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 6grf__1__1.A__1.D \n",
+ " 6grf \n",
+ " 1 \n",
+ " [1.A] \n",
+ " [1.D] \n",
+ " 1.D \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 6grf__2__1.B__1.E \n",
+ " 6grf \n",
+ " 2 \n",
+ " [1.B] \n",
+ " [1.E] \n",
+ " 1.E \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 3grj__2__1.B__1.I_1.L_1.Q \n",
+ " 3grj \n",
+ " 2 \n",
+ " [1.B] \n",
+ " [1.I, 1.L, 1.Q] \n",
+ " 1.I \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 3grj__2__1.B__1.I_1.L_1.Q \n",
+ " 3grj \n",
+ " 2 \n",
+ " [1.B] \n",
+ " [1.I, 1.L, 1.Q] \n",
+ " 1.L \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " 3grj__2__1.B__1.I_1.L_1.Q \n",
+ " 3grj \n",
+ " 2 \n",
+ " [1.B] \n",
+ " [1.I, 1.L, 1.Q] \n",
+ " 1.Q \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " 3grj__1__1.A__1.F \n",
+ " 3grj \n",
+ " 1 \n",
+ " [1.A] \n",
+ " [1.F] \n",
+ " 1.F \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " 3grj__1__1.A__1.H \n",
+ " 3grj \n",
+ " 1 \n",
+ " [1.A] \n",
+ " [1.H] \n",
+ " 1.H \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " 8grn__1__1.A__1.C \n",
+ " 8grn \n",
+ " 1 \n",
+ " [1.A] \n",
+ " [1.C] \n",
+ " 1.C \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 13 \n",
+ " 8grn__1__1.B__1.D \n",
+ " 8grn \n",
+ " 1 \n",
+ " [1.B] \n",
+ " [1.D] \n",
+ " 1.D \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 14 \n",
+ " 4grc__1__1.A__1.C_1.D \n",
+ " 4grc \n",
+ " 1 \n",
+ " [1.A] \n",
+ " [1.C, 1.D] \n",
+ " 1.C \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 15 \n",
+ " 4grc__1__1.A__1.C_1.D \n",
+ " 4grc \n",
+ " 1 \n",
+ " [1.A] \n",
+ " [1.C, 1.D] \n",
+ " 1.D \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 16 \n",
+ " 4grc__1__2.A__2.C_2.D \n",
+ " 4grc \n",
+ " 1 \n",
+ " [2.A] \n",
+ " [2.C, 2.D] \n",
+ " 2.C \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 17 \n",
+ " 4grc__1__2.A__2.C_2.D \n",
+ " 4grc \n",
+ " 1 \n",
+ " [2.A] \n",
+ " [2.C, 2.D] \n",
+ " 2.D \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " 4grr__1__1.B_1.C__1.K \n",
+ " 4grr \n",
+ " 1 \n",
+ " [1.B, 1.C] \n",
+ " [1.K] \n",
+ " 1.K \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 19 \n",
+ " 2grt__1__1.A_2.A__1.B \n",
+ " 2grt \n",
+ " 1 \n",
+ " [1.A, 2.A] \n",
+ " [1.B] \n",
+ " 1.B \n",
+ " train \n",
+ " \n",
+ " \n",
+ "
\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/8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WJhwdHQU7u7uYvTo0WL37t16t5H58+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",
+ " system_id \n",
+ " ligand_instance_chain \n",
+ " ligand_unique_ccd_code \n",
+ " ligand_molecular_weight \n",
+ " ligand_num_rot_bonds \n",
+ " ligand_num_rings \n",
+ " ligand_num_hbd \n",
+ " ligand_num_hba \n",
+ " ligand_num_heavy_atoms \n",
+ " ligand_crippen_clogp \n",
+ " ligand_qed \n",
+ " ligand_tpsa \n",
+ " ligand_is_kinase_inhibitor \n",
+ " split \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 3grt__1__1.A_2.A__1.B \n",
+ " 1.B \n",
+ " FAD \n",
+ " 785.157135 \n",
+ " 13 \n",
+ " 6 \n",
+ " 9 \n",
+ " 21 \n",
+ " 53 \n",
+ " -2.42396 \n",
+ " 0.044261 \n",
+ " 362.93 \n",
+ " False \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 3grt__1__1.A_2.A__1.C \n",
+ " 1.C \n",
+ " TS2 \n",
+ " 721.288731 \n",
+ " 10 \n",
+ " 1 \n",
+ " 11 \n",
+ " 13 \n",
+ " 48 \n",
+ " -4.04010 \n",
+ " 0.095714 \n",
+ " 313.27 \n",
+ " False \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 3grt__1__1.A_2.A__2.B \n",
+ " 2.B \n",
+ " FAD \n",
+ " 785.157135 \n",
+ " 13 \n",
+ " 6 \n",
+ " 9 \n",
+ " 21 \n",
+ " 53 \n",
+ " -2.42396 \n",
+ " 0.044261 \n",
+ " 362.93 \n",
+ " False \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 3grt__1__1.A_2.A__2.C \n",
+ " 2.C \n",
+ " TS2 \n",
+ " 721.288731 \n",
+ " 10 \n",
+ " 1 \n",
+ " 11 \n",
+ " 13 \n",
+ " 48 \n",
+ " -4.04010 \n",
+ " 0.095714 \n",
+ " 313.27 \n",
+ " False \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 1grx__1__1.A__1.B \n",
+ " 1.B \n",
+ " GSH \n",
+ " 307.083806 \n",
+ " 9 \n",
+ " 0 \n",
+ " 6 \n",
+ " 6 \n",
+ " 20 \n",
+ " -2.20610 \n",
+ " 0.263437 \n",
+ " 158.82 \n",
+ " True \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 6grf__1__1.A__1.D \n",
+ " 1.D \n",
+ " HSR \n",
+ " 221.089937 \n",
+ " 2 \n",
+ " 1 \n",
+ " 5 \n",
+ " 6 \n",
+ " 15 \n",
+ " -3.07760 \n",
+ " 0.337239 \n",
+ " 119.25 \n",
+ " False \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 6grf__2__1.B__1.E \n",
+ " 1.E \n",
+ " HSR \n",
+ " 221.089937 \n",
+ " 2 \n",
+ " 1 \n",
+ " 5 \n",
+ " 6 \n",
+ " 15 \n",
+ " -3.07760 \n",
+ " 0.337239 \n",
+ " 119.25 \n",
+ " False \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 3grj__2__1.B__1.I_1.L_1.Q \n",
+ " 1.L \n",
+ " G14 \n",
+ " 188.058577 \n",
+ " 2 \n",
+ " 2 \n",
+ " 2 \n",
+ " 2 \n",
+ " 14 \n",
+ " 1.77490 \n",
+ " 0.754340 \n",
+ " 65.98 \n",
+ " False \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 3grj__1__1.A__1.F \n",
+ " 1.F \n",
+ " G14 \n",
+ " 188.058577 \n",
+ " 2 \n",
+ " 2 \n",
+ " 2 \n",
+ " 2 \n",
+ " 14 \n",
+ " 1.77490 \n",
+ " 0.754340 \n",
+ " 65.98 \n",
+ " False \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " 3grj__1__1.A__1.H \n",
+ " 1.H \n",
+ " G14 \n",
+ " 188.058577 \n",
+ " 2 \n",
+ " 2 \n",
+ " 2 \n",
+ " 2 \n",
+ " 14 \n",
+ " 1.77490 \n",
+ " 0.754340 \n",
+ " 65.98 \n",
+ " False \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " 8grn__1__1.A__1.C \n",
+ " 1.C \n",
+ " LPC \n",
+ " 468.308466 \n",
+ " 21 \n",
+ " 0 \n",
+ " 2 \n",
+ " 6 \n",
+ " 31 \n",
+ " 4.43140 \n",
+ " 0.111161 \n",
+ " 102.29 \n",
+ " False \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " 8grn__1__1.B__1.D \n",
+ " 1.D \n",
+ " LPC \n",
+ " 468.308466 \n",
+ " 21 \n",
+ " 0 \n",
+ " 2 \n",
+ " 6 \n",
+ " 31 \n",
+ " 4.43140 \n",
+ " 0.111161 \n",
+ " 102.29 \n",
+ " False \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " 4grc__1__1.A__1.C_1.D \n",
+ " 1.C \n",
+ " HEM \n",
+ " 616.177293 \n",
+ " 8 \n",
+ " 6 \n",
+ " 2 \n",
+ " 6 \n",
+ " 43 \n",
+ " 4.73854 \n",
+ " 0.416598 \n",
+ " 96.26 \n",
+ " False \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 13 \n",
+ " 4grc__1__2.A__2.C_2.D \n",
+ " 2.C \n",
+ " HEM \n",
+ " 616.177293 \n",
+ " 8 \n",
+ " 6 \n",
+ " 2 \n",
+ " 6 \n",
+ " 43 \n",
+ " 4.73854 \n",
+ " 0.416598 \n",
+ " 96.26 \n",
+ " False \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 14 \n",
+ " 4grr__1__1.B_1.C__1.K \n",
+ " 1.K \n",
+ " AVR \n",
+ " 231.137162 \n",
+ " 3 \n",
+ " 2 \n",
+ " 1 \n",
+ " 4 \n",
+ " 17 \n",
+ " 1.98760 \n",
+ " 0.821636 \n",
+ " 60.39 \n",
+ " False \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 15 \n",
+ " 2grt__1__1.A_2.A__1.B \n",
+ " 1.B \n",
+ " FAD \n",
+ " 785.157135 \n",
+ " 13 \n",
+ " 6 \n",
+ " 9 \n",
+ " 21 \n",
+ " 53 \n",
+ " -2.42396 \n",
+ " 0.044261 \n",
+ " 362.93 \n",
+ " False \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 16 \n",
+ " 2grt__1__1.A_2.A__1.C \n",
+ " 1.C \n",
+ " GDS \n",
+ " 612.151962 \n",
+ " 21 \n",
+ " 0 \n",
+ " 10 \n",
+ " 12 \n",
+ " 40 \n",
+ " -3.87680 \n",
+ " 0.043742 \n",
+ " 317.64 \n",
+ " False \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 17 \n",
+ " 2grt__1__1.A_2.A__2.B \n",
+ " 2.B \n",
+ " FAD \n",
+ " 785.157135 \n",
+ " 13 \n",
+ " 6 \n",
+ " 9 \n",
+ " 21 \n",
+ " 53 \n",
+ " -2.42396 \n",
+ " 0.044261 \n",
+ " 362.93 \n",
+ " False \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " 2grt__1__1.A_2.A__2.C \n",
+ " 2.C \n",
+ " GDS \n",
+ " 612.151962 \n",
+ " 21 \n",
+ " 0 \n",
+ " 10 \n",
+ " 12 \n",
+ " 40 \n",
+ " -3.87680 \n",
+ " 0.043742 \n",
+ " 317.64 \n",
+ " False \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 19 \n",
+ " 7grp__1__1.A__1.C \n",
+ " 1.C \n",
+ " VXQ \n",
+ " 149.084064 \n",
+ " 1 \n",
+ " 2 \n",
+ " 1 \n",
+ " 2 \n",
+ " 11 \n",
+ " 1.08020 \n",
+ " 0.648103 \n",
+ " 35.25 \n",
+ " False \n",
+ " train \n",
+ " \n",
+ " \n",
+ "
\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": "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ERERERHpGwfdRERERKT5pPhf8QQ5EVGDcNBNJi0p5d81yob5/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+fS9X5zsaNWpU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",
+ "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",
+ " count \n",
+ " mean \n",
+ " std \n",
+ " min \n",
+ " 25% \n",
+ " 50% \n",
+ " 75% \n",
+ " max \n",
+ " \n",
+ " \n",
+ " split \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " test \n",
+ " 1436.0 \n",
+ " 16.591226 \n",
+ " 9.886007 \n",
+ " 3.0 \n",
+ " 9.0 \n",
+ " 15.0 \n",
+ " 22.0 \n",
+ " 51.0 \n",
+ " \n",
+ " \n",
+ " train \n",
+ " 418381.0 \n",
+ " 14.448139 \n",
+ " 12.087511 \n",
+ " 0.0 \n",
+ " 5.0 \n",
+ " 12.0 \n",
+ " 21.0 \n",
+ " 722.0 \n",
+ " \n",
+ " \n",
+ " val \n",
+ " 1157.0 \n",
+ " 16.078652 \n",
+ " 10.204647 \n",
+ " 0.0 \n",
+ " 8.0 \n",
+ " 14.0 \n",
+ " 22.0 \n",
+ " 49.0 \n",
+ " \n",
+ " \n",
+ "
\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",
+ " system_id \n",
+ " entry_pdb_id \n",
+ " entry_release_date \n",
+ " pocket_qcov__50__weak__component \n",
+ " system_pocket_ECOD_t_name \n",
+ " split \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 527 \n",
+ " 8i6j__1__1.B__1.C \n",
+ " 8i6j \n",
+ " 2023-01-28 \n",
+ " c11 \n",
+ " None \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 2756 \n",
+ " 8hki__1__1.I__1.Q \n",
+ " 8hki \n",
+ " 2022-11-27 \n",
+ " c11 \n",
+ " None \n",
+ " train \n",
+ " \n",
+ " \n",
+ "
\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": "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PCeL6B6EELW27zFjxuCtt95CTEwMpk2bhkOHDt1z+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 227d0a02..4d25d393 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-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"
+ ]
+ },
+ {
+ "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-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"
+ ]
+ },
+ {
+ "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-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"
+ ]
+ }
+ ],
"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",
+ " id \n",
+ " pocket_fident \n",
+ " lddt \n",
+ " bb_lddt \n",
+ " lddt_lp_ave \n",
+ " lddt_pli_ave \n",
+ " bisy_rmsd_ave \n",
+ " sort_score \n",
+ " kind \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 4uou_B \n",
+ " 100.0 \n",
+ " 0.972682 \n",
+ " 0.994065 \n",
+ " 0.987813 \n",
+ " 0.989777 \n",
+ " 0.159702 \n",
+ " 2.40 \n",
+ " apo \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 4uou_C \n",
+ " 100.0 \n",
+ " 0.973562 \n",
+ " 0.994687 \n",
+ " 0.967287 \n",
+ " 0.951068 \n",
+ " 0.194233 \n",
+ " 2.40 \n",
+ " apo \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 4uou_D \n",
+ " 100.0 \n",
+ " 0.973604 \n",
+ " 0.994235 \n",
+ " 0.972579 \n",
+ " 0.973048 \n",
+ " 0.101252 \n",
+ " 2.40 \n",
+ " apo \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 4uou_A \n",
+ " 100.0 \n",
+ " 0.967257 \n",
+ " 0.994800 \n",
+ " 0.976908 \n",
+ " 0.963504 \n",
+ " 0.214243 \n",
+ " 2.40 \n",
+ " apo \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " Q4WW81_A \n",
+ " 100.0 \n",
+ " 0.982275 \n",
+ " 0.998587 \n",
+ " 0.999679 \n",
+ " 0.997273 \n",
+ " 0.126228 \n",
+ " 98.57 \n",
+ " pred \n",
+ " \n",
+ " \n",
+ "
\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/docs/examples/4_align_mask_crop.ipynb b/docs/examples/4_align_mask_crop.ipynb
index bba9fc43..d9864940 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": 2,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "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"
+ ]
+ }
+ ],
"source": [
"from plinder.core import PlinderSystem\n",
"\n",
@@ -40,20 +54,12 @@
"system_structure = plinder_system.holo_structure"
]
},
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "system_structure"
- ]
- },
{
"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",
@@ -68,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": 3,
"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": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"system_structure.model_fields"
]
@@ -88,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": 4,
+ "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_chain_ordered\n",
+ "ligand_template2resolved_atom_order_stacks\n",
+ "resolved_ligand_mols\n",
+ "resolved_ligand_mols_atom_array\n",
+ "resolved_ligand_mols_coords\n"
+ ]
+ }
+ ],
+ "source": [
+ "for name in system_structure.get_properties():\n",
+ " if \"ligand\" in name:\n",
+ " print(name)"
]
},
{
@@ -126,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": 5,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 5,
+ "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": 6,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 6,
+ "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": 7,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"system_structure.resolved_ligand_mols[system_structure.ligand_chain_ordered[0]]"
]
@@ -170,9 +251,21 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 8,
"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": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"(\n",
" input_atom_order_stack,\n",
@@ -185,9 +278,31 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 9,
"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": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"system_structure.input_ligand_conformers_coords[\n",
" system_structure.ligand_chain_ordered[0]\n",
@@ -196,15 +311,115 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 10,
"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": 10,
+ "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": 11,
+ "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": 11,
+ "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": 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\"),\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": 12,
+ "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": {},
@@ -216,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": 13,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "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": "iVBORw0KGgoAAAANSUhEUgAAAcIAAACWCAIAAADCEh9HAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nO3dd1hUZ/o38O80EEQQQhFiRURscY2JDWOPLWiiAdcSYlklYkF91aCioollRP2J3VmxEBOjoLsG1JhLrIiowegiCorYkN4ZhjblvH8cHHEkiDIzZxjvz+UfcwrnuceE26cfHsMwIIQQ8q74XAdACCENG6VRQgipF0qjhBBSL5RGCSGkXiiNEkJIvVAaJYSQehFyHQAh2qdSqU6dOtWmTZvOnTsfOnQoPT3d3d29b9++XMdFjBOlUWKEHjx48OTJk9zc3M6dO9+8eTM4OJjriIgxo0Y9MUJubm49evRgP5eWlgYEBJw+fZrbkIgRo9ooMXL//ve/AfzrX/8aOXIk17EQ40RplBih9PT0nTt35uXl9ezZ89///rdAIOjfvz/XQRGjxaM19YQQUh/UN0oIIfVCaZQQQuqF+kaJsbt5EwcP4ulTNG2KoUMxYQIEAq5jIkaFaqPEqB09Cnd3mJjgm2/QrRuWLME//wkaDyBaRUNMxHjJZGjRAj/+iNmzq848e4b27XH4MMaM4TQyYlSoNkqM1+3bkEoxffrLMy1bYtQonDvHXUzECFEaJcbr0SM4OsLU9JWTzs549IijgIhxojRKjJeFBWQyzZMyGZo04SIaYrQojRLj5eqK/Hykpr5y8tYtuLpyFBAxTpRGifHq1AmffILvv4dcXnXm2DHcuIGJEzkNixgbGqknRu3hQ3h4QKVCz554/hxxcdi5E99+y3VYxKhQGiXGTi5HdDRSUtC0KQYOhK0t4uORmYmhQ7mOjBgJSqPk/VBeDpEIAgH++gvdu6NVKzx5wnVMxEhQ3yh5DyxcCFtbXLoEAN264cMP8fQp7tzhOixiJCiNkveAqSlkMpw6BQA8HkaMAICTJ7kNihgNSqPkPfDFFwDw22+vHFIaJVpCfaPkPaBUolkz5Obi/n24ukImg60tKiuRkQF7e66DIw0e1UbJe0AgqGrIR0YCQOPGGDgQKhXOnOE2LmIcKI2S94OHB4Cq7lG8aNerDwmpB2rUk/dDcTHs7KBSIScHTZvi2TO0agVLS+TkwMSE6+BIw0a1UfJ+sLRE375QKPDHHwDQsiW6dEFxMaKjuY6MNHiURsl7Q2OAXqOZT8i7okY9eW+kpMDFBTY2yMqCUIirV+HujrZt8fAh15GRho1qo+S90bZt1dZ5164BQK9esLdHSgru3+c6MtKwURol75NRo4AXDXk+H8OHV7Rtm8QuEjV4RUVF7IfMzEy5eus/YgAojRqnioqKrKwsrqMwPF98AYB5MV00cvToRikpvr/+ymlMb6ZUKlevXj1z5kwAW7ZsCQ8P9/Ly4joo8hL1jRqhrKys9evX8/n8Hj16jB8/Xg8lJiUlWVpaOjk56aGsepHLdw4fvubGjdg7d1q3bl1cXGxnZ6dSqbKzs62trbkO7g1mzZq1a9cu9rO3t/f+/ftFIhG3IREW1UaNkIODQ3BwsK+v77179/RQ3G+//Xbr1q0FCxakpaXpobh6EYmi7ewyS0pOnjwJwNLSsm/fvgqF4g92FhQA4MaNG7/88gv7uaSkJCAgwNBa0DExMZ06daIcajgojRonpVK5bdu2GTNm6KGsL7/80tnZ2cbGxtLSUg/F1dMXX3wB4OSLaU8eHh4ATr2Y9iSXy/Pz8y9evMgeisXi5ORkQ0ijqampxcXFubm5v/zyy/Hjx8eNG2cIUREWpVEjlJeX9+23344ZM8ZU493COmNtbW1mZpadna2f4urjiy++EAgEFy9elEqlAEaPHg3g9OnTCoUCgEgkGj58uFAoBHD9+nVHR8cWLVpwGzDr7t27X3755bNnz2xsbHr37n3z5s3KykqugyJVhFwHQLRPJpN99dVXeXl5jx8/ttf9DkYREREWFhZSqbSiokLXZdWfjY1Nr169YmJioqKixowZ07Zt2/bt29+/f//atWt9+/atfueaNWvc3Nyio6PPnDkzduxYrgJmDR8+nNsASC0Eq1at4joGomVWVladOnXq1KlT8+bN//jjj//85z85OTlZWVl5eXkZGRnFxcXFxcUFBQUAysvLlUqlSf0WlTs7O6empg4fPtzNzU1L30C3srOzz507Z2FhwVZFnzx5Ehsb6+DgMGTIEAAbN268dOmSnZ3d6tWrhw4d+vTp02nTphlCR2R8fPzSpUvPnj07YMAAQ4iHqNFIvTGbMWNGSEhIHW9u3Lgxm0+bNm3K4/FEIpGFhUUt5/Pz858/f+7v7//VV1/p7BvoREJCQpcuXezt7TMyMvh8/oULFwYNGtS5c+c7hvpaEZlMtmPHjoCAAKVSCcDGxubo0aNs0ieGgNKo0crNzXVycpLL5RYWFl26dBGJRDKZDEBJSQk7OsFWSCsrK9nz72znzp2zZs3SSsx64+zs/Pjx4xs3bnz66acKhcLOzq6wsPDRo0dt2rThOrRXyOXyvXv3/vDDD+wsYBsbG5lMVlFRwePxJk+eHBQUZGdnx3WMhNKo8Zo2bdqBAwe6du16+/btutz/d+lVJpOxoxka5+/cuRMeHp6VldW2bdvk5GQej6e776J1c+fO3bFjR2BgINupNX78+KNHj27fvn3OnDlch/ZSVFTUggULEhISAPTs2TMoKKhfv35yuXzXrl0BAQEymaxp06arVq2aM2eOQCDgOtj3G0OM0ZUrV3g8nqmpaVJSku5KyczMZIewjh8/rrtSdOH3338H0L17d/bwp59+AjBs2DBuo1KLjY397LPP2N9QV1fXsLAwlUpV/YaUlJSRI0eyN3z88cfXr1/nKlTCMAylUSMkl8u7du0KYNWqVboui11X4+rqWllZqeuytKi8vLxJkyY8Hm/ZsmXW1tZCoZDH45mYmBQXF3MbWFJSkpeXF1u1t7W1FYvFFRUV6qsKhaL6zREREa1atQLA5/N9fHwKCwv1Hi9hGEqjRmnjxo0AXFxcysrKdF2WQqHo0KEDgF27dum6LO1iR8bMzc2rd0d89NFHwcHBGRkZ+o8nOzvbz8+PnbLauHFjf3//oqIi9dX79+97eXn5+Pho/JRMJgsMDGTHAJs1axYaGqpRbyV6QGnU2KSmprIj6adOndJPicePHwdgb2/PeVXurezevZtNnR4eHhKJZOrUqepVWHw+393dXSKRVE9kulNSUiIWi5s0aQJAJBL5+PhUz+OZmZm+vr5serWysiooKHj9CUlJSYMHD2aD79+//927d/UQNlGjNGpsvv76awDjxo3TZ6Hu7u4AAgMD9VloPXl7ewNwdnZWt4XLy8sjIiK8vb3Nzc3ZlGRqaurh4REaGiqTyd7q4eXl5eyHwsLCWqqHlZWVEomkWbNmbHFDhgy5c+eO+iqbXtnkzufzvb2909PT/+5RKpUqNDSU7aoWiUR+fn5SqfStYibvjNKoUTlz5gyAJk2aPH/+XJ/lxsbG8ng8CwsLTprD74DdfKRRo0Y3b958/WphYWFoaKiHhwdbB2Srgd7e3hEREXK5vPYn5+bm+vv7z58/n2GYNWvWBAUFfffddzXeGRER4eLiwj6/V69ely9fVl+Sy+USicTR0VGdXuPj4+vyvQoKCvz8/NiBe2dn55MnT9blp0g9URo1HuXl5a6urgC2bNmi/9LZrkZfX1/9F/227ty5w9Y39+3bV/udaWlpwcHB7u7u6v5TJycnPz+/6OjoWuqY5eXlbBpVqVSxsbELFizQuOHq1avqhaft27fXGIg/e/Zs586d2as9evS4ePHi237Bmzdv9ujRQ91l8eTJk7d9AnkrlEaNx4oVKwB06dKFk0HzpKQkoVAoEAju3bun/9LrTiqVsmNikyZNqvtPPX78WCwWs/9KsVq3bu3v73///v3Xb1anUaVSuX///iVLlqgvJSYmqndctrOzCw4Orl69feM8p7pTKpUSiYTtEDA3Nw8MDKw+4k+0i9KokUhOTm7UqBGPx4uJieEqBh8fHwBjx47lKoC6mDRpEvuPzdt2d7ISEhL8/f3VzW0AHTt2FIvF1XstExMTp06dWlhYePz48WfPno0ZM4ZhmOfPn/v4+FQfiK8+Ilf7PKd3lp6eznYBs3n57Nmz9X8meR2lUSMxYsQIANOnT+cwhqysLHa4+cqVKxyGUYvg4GC27zgxMbE+z1EqldHR0X5+fh988EH1wf3g4ODc3FyJRCKRSOLj4+Pj43ft2hUfH68xEJ+Zmal+VO3znLTiwoULbAWcx+N5e3tnZWVp3BAVFTV48ODExMTExMQpU6YcOHBAuwEYPUqjxuDIkSMAbGxscnJyuI2E7Vjo1auXAc5evH79uomJCY/HCw8P19Yzax/cZwfiHRwc1N2UycnJ6p+tPs9JKBRqzHPSrsrKyuDg4MaNGwNo2rRpcHCwxkz+7du3JyQkMAzz559/hoSE6CgMY0VptMErLi7+8MMP6zJgogdSqZSdvnPixAmuY3lFTg7Tt2+Js/MXrw/4aEVBQcG+ffsGDRrE5/PVg/vqBNq/f//q6zVrn+ekO7UsIaU0Wh+URhu8efPmAXB3dzeQCuCOHTvYAeg3zg3SG6WSGT6cAZjBgxW6Hn+rPrj/4YcftmnTJiwsrPoNERER7dq1q3Gek34cO3asefPmbEdE165ds7KyysvLg4KCrl69KpfLz58/v23bNsP5b9cgUBpt2OLj44VCoVAovHXrFtexVKmsrGTThEQi4TqWKqtWMQBjZ8ekpuqv0J49ewI4d+6c+kzt85z0SSaTLV++nB3RmjRp0u3bt8VisVgsTktLYz/QHKm3Qmm0AVMqlb179wawcOFCrmN5RVhYGAxmeei5c4xAwPD5zJkzei23T58+ANQTJ8LDw9kE6ujoKJFIDKG6N3HiRDYergNp8OiVdg1YSEhIbGyso6MjO7BjOLy8vPr06ZOdnc2OjHPo+XOMHw+lEoGBGDZMr0Wzb6ZSv1XQw8OjY8eO7FRT9cwnbg0YMABAx44duQ6kwaM02lDl5eUFBAQA2LZtm5WVFdfhaBKLxQCCgoLYbds5oVBgwgTk5GDwYAQE6Lt0dq9r9XuuGjVqdOfOHfXQPCeKi4vHjRs3ffp0dUgAnJycuIrHaFAabagWL16cm5s7dOhQT09PrmOpwWeffTZq1KiSkpI1a9ZwFcP33+PKFbRogSNHoP/t4dnaaPXXBaoH8bkilUrDw8PZjRdQU4Tk3VAabZBiYmIOHjxoamq6bds2rmP5W0FBQUKhUCKRJCcn67/0iAgEB0Mkwq+/wtZW/+VX1UbVjXpDoFFBNsAIGyhKo9pz9y58fTFgAEaMwNq1KCrSUTkKhWL27NkMwyxdurR9+/Y6KqX+3NzcpkyZIpfLA15tUefm5s6ePVuhUOiu6IcP8e23YBhs2gR3d92VUxuNnGUINKqfBhhhA8V9P7eRuHwZI0ZgyhQsXAipFNu345dfcO0aLC2xcSNUKvD5YHswGzWCmRkAWFpCIIBAAEtLAApz82empgCsrKz4fL5AIFDvIqwhODj4f//7n4uLi7+/v96+37tZvXr1r7/+Gh4efvXqVXbkGsDatWsLCgpUKpWOCmUYTJiAoiJ4ecHPT0eFvJnGEJMh0Kh+UqNeWyiNvp2tW7emp6cPHjx46NChr1yYPRszZ2Lz5qpDT0907IhNm/DDDwgIgFz+xic/bdnS5dmz1883atTIzMwMgKWlpUAgUKlUaWlpbCTsEIEhc3Jymj9//tq1a5csWXL58mUAZ86c6d69+59//qm7Qnk8bN+O5cuxb5/uCnkzA6zrUaNeRyiNvoWnT5/m5ORs2LDB29v7lTSan4+EBBw58vKMiQkmT0ZUFAAsXgylEkoliosBoKwM5eUAUFQElQoKBaRSALCychYKARQVFalUKoVCIZVKAZSXl5eXl+PF+41Z48aNGzlyZHJy8s8//7x69Wpdf/H68Pf3DwkJiY6OjoyMHDVq1NGjR9u3bx8XF3fp0qXPP/+8/s9ftQpWVliwoOrw3j0cOICNG6v+7jlkgHU9jQqyASb6BorS6FtITU1t06YNAM1Jf48fA0DLlq+cbNWq6vzatXV5eFsgpabzZWVlbBotKiratm3bli1bRCLR//3f/wHIy8t7zBZhwJo0abJs2bJ58+Z9//33I0aMOHDgAIDKykp20mL9hYUhKQmffAJ2o87nz3HoEDZu1Mqz3x3DMHK5HAaWpGqsjRpUhA0UDTG9hVatWj18+JBhGKVS+coFttOTrVSqSaVo2rT+hZqZmVlbW1tbW7du3frp06c8Hq9Tp07sXiS9evVi9+wxcL6+vi4uLklJSXPmzGHPrFy5UiQS1fIj+fkoLKz6fOwY8vMBICcHEyfWcPOIEfD1RWWlVoOuH3aREruhFNexvKRRQTbA+nIDRbXRt9CiRYuWLVsuW7Zs2rRpr1xo1Qqmprh5E9VnMsfFoX17FBZi2DB2EElzcEk96GRqCnPzVHPzSIFAKBTy+Xx2Or1Gr6hAIGjdujXDMBkZGTKZrEEkUJZIJBozZszGjRsPHjy4Z88eACkpKR988EHTpk0BLF++PDAwUCQSxcXFhYSEsDesWwdHRyxcCAArVqBTJ9jYQCrF9es1PH/aNKxfj82bsXSpPr9WbQyzoqfRGUp9o9pCafTt+Pr61nBWJMLkyQgMRK9esLMDgOhoHD6MyEiUluLGjbo8+UG3brNv3arLnVlZWVu2bFm+fPkff/yRmpoaEhKiXpdisDS6QS5fvtytW7d//OMfAMRiMdu9m5ub+/TpU/aGykqoU1BlJdjf9IoK1JiX+Hxs2YIRIzB+vO6+wdsxwGF6vJbcqTaqLZRGtWTTJkycCDc39OyJ4mLcvo116zB0KCorce1aVXtfPbhUXPzKoFN5OcrKWlhZ+fbqpVQqlUplcXExXu0VValU7Pny8vL09PQNGzbMmDFj2LBhw/S8UPydlJaWsm/iHDt2LHtm6tSp6qs5OTnsmyxbtWo1/kUi1Eij7Gd1Pn3dZ5/h668xfz5mz9bNd3hLhlkbrXGIydByfUNEaVRLmjRBZCTu3cO9ezA1fVktNTFBz551eYArsKtuRY0aNerkyZNr16415CVM1a1evfrZs2fdu3c/dOjQ61etra3ZDx06dGDfdQFgzx4wTNUNs2ZVdX5Uz62v27gRbm4wkOUIhlnRoyEmHaEhJq3q2BGenhg1qiqH6sbGjRuFQuGePXs4WWT5tu7evbtlyxY+n79z507B26xsV4/NLF0KdjePTz+trYPE3h5r1mD79voEqzWGWdGjISYdoTTa8Li5uU2ePFkuly9fvpzrWN6AYZi5c+fK5XJfX9+edauV18fMmejaVdeF1IlhVvRoiElHKI02SD/88IO5uXl4eHhsbCzXsdTmp59+unDhgoODw48//qijIrZsQY8eVZ/5fBw+jL17oVKhtFRHBdYJDTG9VyiNNkhOTk7z5s1jGGbJkiVcx/K3CgoKvv/+ewCbNm1Sd4Bq3bBh+PDDl4fOzujSBQMGoMYpFXpjmLXRGrcmMbRc3xBRGm2oli5dam9vf/ny5ZMnT3IdS82WLVuWnZ3dr1+/SZMmaf3h+fn5jx49Sk9Pf/2SUolbt/DTT3jx2g4OGGZFj4aYdITSaEPFLrIEsHjxYp1uOvdu4uLi9u7da2JismfPHl2s5FmzZs3NmzcfPnz4+qW2bSEWA8CsWcjM1HrJdWKYFT3a4UlHKI02YL6+vv/4xycODv/6+WfmzXfrkUqlmj17tlKpXLhwoXoOk3YVFxdnZ2c3/ZvltrNmYcQI5ObCx0cXhb+ZYVb0aIcnHaE02oCZmJh8//2NS5cWLV8u4nZERcPOnTtv3LjRsmXLAJ29AmnDhg3ffPPNunXraty3lMdDSAhsbBAZyc12eYY5xEQTnnSE0mjDNn4875NPkJaGrVu5DuWFrKyslStXAti+fbvuFv6fOnXq7t277BYENd7g5FQ1h3TePNTU9NctQ66N0oQnraM02rDxeNi0CQDWr0d2NtfRAAAWLFhQWFj45Zdfjh49WnelDBo0KDc3t/Z1XBMn4p//hEyGKVOgsSeXrhlmRY+GmHSE0miD178/RoyAVIp167gOBbh06dKRI0fMzc23bNmi04KaN28+evRoGxub2m/bswfNmyMmBjoOR5NhVvQ0uhoMM9c3RJRGjcGGDRAIsHv337ZeVSoV82KNukwm01EYlZWVvr6+DMOsWLGC3d+ac02bYt8+8HhYvhzx8for9/WK3vnz59nXqHCIhph0hNKoMejSBd7eqKzEihU1XE1MTJw2bdrBgwcBTJgwYevWrTpaRRoUFJSYmOjq6rpA/U4PAzB0KHx8UFGByZP1t7WzRr2vtLR0+vTp/fv3HzduXFZWlp6C+JuoqFGvdZRGjcSaNTA3x9GjuHZN81KHDh1mzZoFgGGY0tLSAQMG6GKe6dOnT8ViMYDdu3cbWgVn82Z07lxuZbXkxx9X6qdEdodDdYYSCARTp041MzMLDw/v0KHDnj17dPdi1FoEBgaGhYV98sknABQKhVKpZLcD138kxoYhxsLfnwGY/v1ruHT9+vX9+/eXl5f7+vpu3rx52bJlWi/dw8MDgLe3t9afrBUxMdfYlHH16lXdlZKXlxcWFubt7W1ubm5ra+vi4hIfH6++mpKSMnLkSPb37uOPP75+/bruInmjwsJCACYmJhzGYDQojRqPggLmgw8YgDl9+pXzCoUiKipqx44djx8/9vX1zc/P9/T01G7R//nPfwBYWlqmp6dr98laxO4/4OzsLJVKtfvkO3furF+/3t3dvXrNzt7eHoBIJFq0aFH1EiMiIlq1agWAz+d7e3vn5uZqN5g62rx5MwAej8dJ6UaG0qhR2byZAZguXRiF4uXJ3NxciUQikUjS0tLOnz+/efNm9sV82iKTyVq3bg1g586dWnys1lVUVHTt2hXArFmzqp+XyWSnT5++d+/eWz1NLpdHR0f7+/u3r7ZTtFAodHd3F4vFSUlJJSUl/v7+bGJ1cnIKDQ2tXmJgYCDb5G/WrFloaCg7Bqgf9+/f9/LyYgPu0aOHXC4/f/48eyk6OvrSpUt6i8RoUBo1KuXlTMeOzNKlTFmZ/gpdvHgxgO7duyuqJ2+DdPfu3UaNGvF4vFOnTqlPTp48OTo6OiEhoS5PyM7ODg0N9fLysmRfUwgAsLW19fb2DgsLKyoqYhhGpVJdv3796dOnDMPcunWrd+/e7G2DBg1KTExUPyopKWnw4MHspf79+9+9e1fbX1dTTk6Ov78/23NtZmbWu3fv1NTUQ4cODR06lGGYEydObN68efv27WFhYbqOxMhQGm2ozp5lUlJeHioUzNGjTFERI5MxYWHMgwcvLyUkMLrrD0xISBCJRHw+/9q1a7oqQ6vYcTAnJ6e8vDyGYVJTUz08PJYvXx4TE1PLTyUkJIjFYnd39+qLpjp27Ojv7x8dHa1UKqvfvGHDhgMHDnh7e7OZVKVShYaG2trasskrMDCw7MW/cuwldfPfz89P6x0OLJlMJhaL2dTPdiakpaWpr86cOZNhmLlz5xYXF1dUVHz33Xe6iMGIURptqD7+mNm9++WhTMYATEICk5PDAEynTkxlZdWllSsZbfeFVlGpVAMHDgQwe/ZsnRSgA0qlsn///gDGjh3LMMyjR48WLFigVCrHjRuncWdpaenZs2f9/PyaN2+uTp1mZmZDhgwJDg5OTU39uyLCwsL8/PzYrKQ+mZeX5+fnx2ZhFxeX33//XX0pPz/fz8+Pbf43b9782LFj2v2+oaGhjo6ObPxDhgz53//+p3EPm0YXLlyYk5NTXFw8d+5cLQbwPqA02lC9MY1u2FB1SXdp9MCBAwAcHBwKCgp0UoBuPHr0qEmTJgB+/fVXpVI5adKk/fv3z58/n72amZnJNtstLCzU2dPBwYFttteltrhy5cro6Og5c+b89ddfGpcuX77cuXNn9pkeHh7Pnj1TX4qLi/v000/Vl548eVL/b3r27NkuXbqou0EvXrz4+j0XL17s169feHj49evX58yZM3/+/CtXrtS/6PcKpdGGqvY0evIkY2HBPH7MMDpLo/n5+WxDdcWKFRqX5HI5+0GlUpWUlGi/7HqbPHkyAAsLi2fPnpWVld27d+/GjRuBgYHdu3dX747K5/O7d+8eGBgYFxf3VkNAc+bMOXHixIIFC2JjY1+/KpfLg4OD2TzeuHFjsVis/utSKpUSiYRtepubmwcGBlZUVLzbF7x27Vq/fv3YL+Lq6hoWFvZ3XyE7OzslJYWtXOfm5mZnZ79bie8zHsMY1laVpI66d4eNDT76qOpQocC2bUhIgIMD7OyQk4PFi5Gbi8hIBAbi3j0sXFi1xsnEBOy+SxYWEInA44HdtNPUFObmAGBvf1Yuf8zj8djdPE1NTc3NzQFYWFiIRCL1eQ8Pj8TERAC9e/eOiYlRZ5+tW7dGRkZGRUXdvn17z549zZs3X7hwoZmZmV7/dt5k4MCBFy9eBNCmTZtmzZolJiay8ygBWFpaDh061MPDY+TIkXbv9IZXhUJx7do1BweHdu3a/d096enpS5YsYd843bVr1927d6tHojIyMvz9/dlLrq6uO3fuHDJkSN1Lv3///ooVK9ieAVtb20WLFs2fP9/QFkQYG67zOHlHH3/MjB3LBAVV/Vm79pXaaE4Ok5XFWFsz//1vVW00MpIB6vSnU6dpdfk/h82b7OYgGt15bF/bzJkzz507Z4BDT2lpaQKBwNTU1MLCQp39BQLB9OnTIyIiysvL9RZJVFQUO1+Kx+N5e3vn5OSoL124cEG947WXl1dWVtYbn8YOxLPzqMzNzf39/dmZA0TXhLpIzUQ/Pv8cM2dWfS4thcYWyfb2WLsWixbB0xMA3N1x9iwAVFRUvTVTKoVCAZUKRUUAUF6OsjIAYJiu7u4+KpWqqKgIQEVFRWlpKQCpVKpQKB49elRQUGBtbc0wzNy5c52cnHx9fZctWzZ69GiRSFQ9gJycHB6Pd/ToUR6P18HlsrAAAAiuSURBVEP99k4D8MsvvyiVSk9Pz2+++Wbr1q3Pnz9PSkry9PTcu3evniMZPHjwrVu3NmzYIBaLDx06dOrUqZUrV86dO5fP5w8YMIC9tH79+vDw8KioKLFY7PM3u/nLZLIdO3asW7euuLhYKBT6+PisWrVKPaxEdI7rPE7eUe19o2y1RqlkPv2UadZMm32jsbGxPB7PwsIiIyODYRiFQtGxY0dUm3svlUqnTp0qlUpXrFhx+fLllStX/vnnn1orXhu6desG4MSJEzUeciI5OXnYsGHsr2Tfvn1rXEJa4zykyspKiUTSrFkz9meHDBlS/WeJflAabajqkkYZhomLYwQCLQ8xffXVVwDYPfGYFytB7ezs2CbkqVOnJBLJ6dOnKyoq9u3bFxUVpc2y643tz7W2tmYb7xqH3IqIiGjRogUAoVDo5+dXfb7U8ePH2Ymu1Z09e1Y97t+zZ09agMQVSqMN1caNTPUJ45WVjJ8fk5HBlJQw/v5M9eHxkBDm55+1WXRSUpJQKBQKheoFlO7u7gACAwO1WYxusJsEzpgxo/qhj48Pt1Gp1bKEtLrY2NjPPvuMTaDt27evZSCe6AGlUfIu2E46dgY7U62lb8hbk7DY0fMLFy7UeGggal9C6uXlxY6M2draBgcHq+dLEa5QGiXvIisri535qJ6qzbb02TF6gxUbG8vW8tjl/xqHBkVjCemUKVOuXr367bffCoVCAI0bN6aBeMNBaZS8oxUrVgDo1asX25xMSkoSiUQCgeBtt0rSp7lz5wJYtGhR9cPFixdzG1UtsrKyJk+erJ6VBUAkEs2aNSszM5Pr0MhLlEbJO5JKpewAsXqM+7vvvqve0jc0CoXCwcEBALtGU+PQkIWEhDRq1AiAvb19XFwc1+EQTZRGybvbsWMHO8TBds+lp6c3btxYwOencLqv+985c+YMADc3txoPDZxSqSwsLOQ6ClIzehcTeXc+Pj7t2rW7f//+/v37ATg6Ov4cGFjcvr3z//t/XIdWg9/CwwFMnDiRPTx8+DCASZMmcRlTnfH5fCsrK66jIDWjNfWkXsLDw8eNG2dvb//w4cMmTZqgpATt2iEzE//9L776iuvoqikrY1q1Sm/bVvXzzy3ati0vL2/WrFlRUdGDBw9qWfluIMrKygIDA+VyuY+Pj3qFKDEcVBsl9eLp6ekzcuRVV1eLrVsBwMIC7NublyyBDt4/+u4iI3k5OR8CLdq2BVDwxx8znJ379u5t+DkUwIULF7p167Zu3brt27dzHQupAaVRUi88Hk+yZEnbK1d4GzaAfQO7jw/atcP9+9i/n+voqjl8GABetOgdDx7ceOvWxReHBq5bt26RkZGbNm3Ky8vjOhZSA2rUE20YPRqRkZgzB2x16dgxeHnB3h4PH6JJE66DAwoK4OgIhQJpaXBw0DxsIB48eHD48OFVq1ZxHQjRRLVRog1BQRAKIZEgORkAPD3Rpw+ysxEczHVkAIBjx1BRgSFDqpKmxqHBKysrCwgIOHLkyKJFi7iOhdSAaqNES2bMQEgIvLwQFgYA0dHo1w8WFnj4kPtsNXAgLl5EaCi+/RYABg3ChQs4eBCTJ3McGDEKlEaJlqSnw9UVpaW4cgV9+gCvtfQ5DKxlS4hEyMyElZXmISH1Ro16oiVOTpg3DwyDJUuqzmi09Lly+DCUSoweXZU0NQ4JqTdKo0R7liyBgwOio3HyJAC4uWHKFMjlmvvy69mrY/T49VcAmDCBs3iI0aFGPdGqbdswbx7c3HDnDoTCGlr6epaUhA4dYG2NjAyYmmoeEqINVBslWuXrCxcXJCUhNBR40dK3skJqKjfxsFVRT8+qpKlxSIg2UG2UaNuRI5gwAU5OSE6GuTmkUsjlsLHhJhhXVyQn48IFDBjw8vD8eQwcyE08xBhRGiXaxjDo0QN//YXjxzleVv/wIT76CDY2ePYMfD6uX0evXnBywrNnEAi4DIwYF2rUE23j8bBnD+LiqnLorl3o3BmNGsHODuPH4/Fj/UXi4oLMTJw4AT4feNGinzCBcijRLkqjRAe6d0e3bgCwdi1Wr8aPPyIjAzEx4PHQty9yc/UUBsNALoera9Xhxx+jZ08aoydaR416ojMyGRwcsHfvy8ylVKJjR0yahJUrdV76jh1Yvx75+VAq4eKCoCB4eOi8UPJeotoo0Zn79yGTYfTol2cEAowahb/+0nnREglWrsTevSgpQUkJZs3C2LGIidF5ueS9RGmU6ExaGiws0LjxKycdHfH8uc6LFosREICRIyEQwMQEc+bAywsbN+q8XPJeojRKdKZZM8hkKCt75WR2NpycdFtuSQmePMGQIa+c/Pxz3Lmj23LJ+4rSKNGZ9u1hYoLz51+eYRhERaFLF92Wm5kJAB988MpJO7uq84RoG6VRojOWlvjuO8yfj/h4AKiowPLlSEnBzJm6Lbd5c/B4mkkzIwMtW+q2XPK+EnIdADFqmzZBJEKfPjA3R2EhPvoIZ8+iRQvdFtqoETp0QEQEPvnk5cnffkP37rotl7yvaMIT0T25HOnpsLDQbGjrzrFjmDIF27bB0xPl5di5E5s24cYNdOqkpwDI+4TSKDFSx4/jxx+rNppyd4dYjB49uI6JGCdKo0R/GIb5/fffLS0tP/roo3Xr1gGwtbXV7fuFGAY8ng6fTwgNMRF9SktLk0qlly5dsrS0FIvFAQEBOTk5ui2ScijRPUqjRH+aN2/ep9rmzSEhIVOmTOEuHEK0g0bqCTcUCkVKSkqHDh20+9jKysotW7YAuHLlSmRkpHYfTkiNKI0S/SktLZVIJAkJCffu3Xv48OHXX3+t9SJMTEz8/f0fPHhgSvvbE32hISZihBYtWrRixQorevcn0QvqGyXGJicnx8zMjHIo0RuqjRJjc+PGDUdHxxa6XitFyAuURgkhpF6oUU8IIfVCaZQQQuqF0ighhNQLpVFCCKkXSqOEEFIvlEYJIaRe/j/BTVtFCDjWUgAAAYJ6VFh0cmRraXRQS0wgcmRraXQgMjAyMy4wOS41AAB4nHu/b+09BiDgZ0AAYSAWBeIGRg4GDSDNzMQGoVnYGBKANBMTnFYwAdGMLOwQBcwwhXCNDlCNDhlgeUa8DJglaGag8dkZwBqYGLkZGDWYGJkYmJiBsgwsrCxMrGwKbOwaTGwcChycGUycXAlc3BlM3DwJPLwZTLx8Cnz8GkwsAgwCghpMAkIKQowKfKwKvBwJIsxA89gYhQRYmIEmsPLxcrBxcnHz8HKIvwNKMMKDhXP73gMSnybagTgPdvUeyK+tBbNrUzMPXG06bA9ia+dyHvi7dR+Ybc21ff/r9QZgNZVpfbZanlxgtsiabPv2iz37QWzFq9ftDn5QOABi738n5hCuogMWD7qR4bDZaBeYrTllnoP+URswO/74fAdxGWeIXUtzHSavOwphh0o6vN8TDGZvMam2t9y/Esz+t5XXPuyxgQOInTiV94DW3l6wOcuj9u+fqicNtndzb+6BoA8dYHExAJBBW0AXSDzxAAAB9HpUWHRNT0wgcmRraXQgMjAyMy4wOS41AAB4nH1US47bMAzd+xS6QATxJ4qLLibJzKAoxgHatHfovvdHSRmJNIAwdsjY9BNNPj55S3H8vP74+y89D7xuW0rli5+ZpT9UStk+Ulyk8+v79z1d7i/nR+Ry+73ffyWwhOBr/PyMfbnfPh4RSLd0kmzYxCiV7P9FfEUu/RhLMV3SiTOjlYoBZBW2BZACSLlybV4BZEFlWmXkAGIGVmzNgdzMcJVRAujP6QhnUBSuC2BNe0SrCUHgSArLAqeesHjPRYwjM5QCzAtgc3aK9wzCLWoVYE++AJpnxEzSCDGdSq6K66bBx5OcHWpYqHflrSiukOBIziYirUZOJaW2qhLwQBqVpv5cKzqpKyD1lysQlhqjYSZbVslHPyYNQxUNFcqySDmobIBKnpGwglO1ANZOpQh5O55anQFdzRD0kAUCIuMxHSVakQ4xnqDQ2IRjEbsqYfl6c2mconVQ7TN3lTRasfm6Xz/tkGPPnG/7dewZDBs7IwI09A9uPFQObjK0DG41Xd7ev9HQLbjpkCe6tSFC8FsbUmM3mBXF4QAm5XA4wEkhHA5okgKHA55mDt3JNFwMB3WaYpQPOk0Lw0GbhgI9YhP30D9GT8KCQs/7TIu9YB49xgxmxuP+8YXz6+0/L2z4xmQe6LAAAAFjelRYdFNNSUxFUyByZGtpdCAyMDIzLjA5LjUAAHicTZC9SkQxEIVfxXKFbMiZn0wyiyBcC6vVXixELGVFBBsf3slVSNIk52Ry5ps83GzYtqft9v75cKbtcPNw/cqvY/FGIXbnjKufw1Fzp6Y9lRxb0XQ6ShbqpQ5HTKWHxblKbZSQlUw4HMoQox6OtN6HEyeONzBSqelUcqldGTI81iI6vE5Fu6QoRilxF5YQVFqKRIXU6EaZtTGlY8nVaHSL9hzdR4vItnSS3FUDOkqMjZvsVucy5rBKwTZeGZgwoEX4L7hr5JTcyFBoB2og46hhqtgRVVm1JYocbm0flUD0D20sf7N26TqgJT6J9i8ywGxUxeCN03V6+bq8P35ePrzkcTxfvt5ycUwBpynIeQp2mUJcp1CvU1S3KczbFM37FN2xICAYVgg4FgyQYwEBOxYUiGOBgToWHFTHAgRzLEho6fsu5pKfXy4HqdjWsULtAAAAAElFTkSuQmCC",
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"structure_with_symmetry_in_ligand = PlinderSystem(\n",
" system_id=\"4v2y__1__1.A__1.E\"\n",
@@ -235,9 +475,21 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 14,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 14,
+ "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",
@@ -246,9 +498,27 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 15,
"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": 15,
+ "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",
@@ -264,9 +534,34 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 16,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "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": 16,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"structure_with_partly_resolved_ligand = PlinderSystem(\n",
" system_id=\"1ngx__1__1.A_1.B__1.E\"\n",
@@ -278,9 +573,21 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 17,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 17,
+ "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",
@@ -289,9 +596,31 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 18,
"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": 18,
+ "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",
@@ -302,66 +631,809 @@
"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": 19,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "()"
+ ]
+ },
+ "execution_count": 19,
+ "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": 24,
+ "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": 24,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "system_structure.protein_coords[0][list(system_structure.protein_calpha_mask.values())[0]] == system_structure.protein_calpha_coords[0]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
"metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(1, 1)"
+ ]
+ },
+ "execution_count": 25,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"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"
+ "len(system_structure.protein_calpha_coords), len(system_structure.protein_calpha_coords)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "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_coords\n",
+ "protein_n_atoms\n",
+ "protein_sequence_from_structure\n"
+ ]
+ }
+ ],
+ "source": [
+ "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": 31,
"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",
" 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": null,
+ "execution_count": 35,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "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": 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"
]
},
{
@@ -373,7 +1445,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 36,
"metadata": {},
"outputs": [],
"source": [
@@ -385,9 +1457,20 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 37,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(314, 3)"
+ ]
+ },
+ "execution_count": 37,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"calpha_structure.protein_atom_array.coord.shape"
]
@@ -402,9 +1485,20 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 38,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['1.C']"
+ ]
+ },
+ "execution_count": 38,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"system_structure.protein_chain_ordered"
]
@@ -419,11 +1513,22 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 40,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['1.C']"
+ ]
+ },
+ "execution_count": 40,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
- "system_structure.protein_chains"
+ "system_structure.protein_chain_ordered"
]
},
{
@@ -436,9 +1541,26 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 41,
"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": 41,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"system_structure.protein_coords"
]
@@ -447,122 +1569,114 @@
"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": {},
- "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": [
- "system_structure.protein_unique_atom_names"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Get protein residue names"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "system_structure.protein_unique_residue_names"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Get protein residues number\n",
- "Residue number as they appear in structure"
+ "### Get sequence from protein structure\n"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 42,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'1.C': 'STPGAQQVLFRTGIAAVNSTNHLRVYFQDVYGSIRESLYEGSWANGTEKNVIGNAKLGSPVAATSKELKHIRVYTLTEGNTLQEFAYDSGTGWYNGGLGGAKFQVAPYSXIAAVFLAGTDALQLRIYAQKPDNTIQEYMWNGDGWKEGTNLGGALPGTGIGATSFRYTDYNGPSIRIWFQTDDLKLVQRAYDPHKGWYPDLVTIFDRAPPRTAIAATSFGAGNSSIYMRIYFVNSDNTIWQVCWDHGKGYHDKGTITPVIQGSEVAIISWGSFANNGPDLRLYFQNGTYISAVSEWVWNRAHGSQLGRSALPPA'}"
+ ]
+ },
+ "execution_count": 42,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
- "system_structure.protein_unique_residue_ids"
+ "system_structure.protein_sequence_from_structure"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "### Get sequence from protein structure\n"
+ "Note that this is different from the canonical SEQRES sequence due to unresolved terminal residues:"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 43,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'1.C': 'MSTPGAQQVLFRTGIAAVNSTNHLRVYFQDVYGSIRESLYEGSWANGTEKNVIGNAKLGSPVAATSKELKHIRVYTLTEGNTLQEFAYDSGTGWYNGGLGGAKFQVAPYSXIAAVFLAGTDALQLRIYAQKPDNTIQEYMWNGDGWKEGTNLGGALPGTGIGATSFRYTDYNGPSIRIWFQTDDLKLVQRAYDPHKGWYPDLVTIFDRAPPRTAIAATSFGAGNSSIYMRIYFVNSDNTIWQVCWDHGKGYHDKGTITPVIQGSEVAIISWGSFANNGPDLRLYFQNGTYISAVSEWVWNRAHGSQLGRSALPPA'}"
+ ]
+ },
+ "execution_count": 43,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
- "system_structure.protein_sequence_from_structure"
+ "system_structure.protein_sequence"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "Note that this is different from the canonical SEQRES sequence due to unresolved terminal residues:"
+ "### More complex example - two proteins [ TO BE FIXED ]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
- "outputs": [],
- "source": [
- "system_structure.protein_sequence"
- ]
- },
- {
- "cell_type": "markdown",
- "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": [
- "### Get tokenized sequence\n",
- "Get tensor of sequence converted to integer-based amino acid tokens"
+ "# 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": null,
"metadata": {},
- "outputs": [],
+ "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_structure_tokenized_sequence"
+ "# 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\n",
+ "## 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",
@@ -597,6 +1711,11 @@
")\n",
"```"
]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": []
}
],
"metadata": {
diff --git a/docs/examples/5_dataset_and_loader.ipynb b/docs/examples/5_dataset_and_loader.ipynb
index 4575e55c..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,18 +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": 5,
+ "metadata": {},
+ "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": 6,
+ "metadata": {},
+ "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",
@@ -102,30 +290,535 @@
},
{
"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.shape)"
+ " print(k, v)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "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": 11,
+ "metadata": {},
+ "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",
+ ""
+ ]
+ },
+ {
+ "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",
+ " system_id \n",
+ " ligand_id \n",
+ " ligand_rdkit_canonical_smiles \n",
+ " ligand_is_ion \n",
+ " ligand_is_artifact \n",
+ " system_num_ligand_chains \n",
+ " system_num_protein_chains \n",
+ " ligand_is_proper \n",
+ " system_proper_num_ligand_chains \n",
+ " split \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 3grt__1__1.A_2.A__1.B \n",
+ " 3grt__1__1.B \n",
+ " Cc1cc2nc3c(=O)[nH]c(=O)nc-3n(C[C@H](O)[C@H](O)... \n",
+ " False \n",
+ " False \n",
+ " 1 \n",
+ " 2 \n",
+ " True \n",
+ " 1 \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 3grt__1__1.A_2.A__1.C \n",
+ " 3grt__1__1.C \n",
+ " N[C@@H](CCC(=O)N[C@H]1CSSC[C@H](NC(=O)CC[C@H](... \n",
+ " False \n",
+ " False \n",
+ " 1 \n",
+ " 2 \n",
+ " True \n",
+ " 1 \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 3grt__1__1.A_2.A__2.B \n",
+ " 3grt__1__2.B \n",
+ " Cc1cc2nc3c(=O)[nH]c(=O)nc-3n(C[C@H](O)[C@H](O)... \n",
+ " False \n",
+ " False \n",
+ " 1 \n",
+ " 2 \n",
+ " True \n",
+ " 1 \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 3grt__1__1.A_2.A__2.C \n",
+ " 3grt__1__2.C \n",
+ " N[C@@H](CCC(=O)N[C@H]1CSSC[C@H](NC(=O)CC[C@H](... \n",
+ " False \n",
+ " False \n",
+ " 1 \n",
+ " 2 \n",
+ " True \n",
+ " 1 \n",
+ " train \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 1grx__1__1.A__1.B \n",
+ " 1grx__1__1.B \n",
+ " N[C@@H](CCC(=O)N[C@@H](CS)C(=O)NCC(=O)O)C(=O)O \n",
+ " False \n",
+ " False \n",
+ " 1 \n",
+ " 1 \n",
+ " True \n",
+ " 1 \n",
+ " train \n",
+ " \n",
+ " \n",
+ "
\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",
+ " reference_system_id \n",
+ " id \n",
+ " sort_score \n",
+ " kind \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 6pl9__1__1.A__1.C \n",
+ " 2vb1_A \n",
+ " 0.65 \n",
+ " apo \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 6ahh__1__1.A__1.G \n",
+ " 2vb1_A \n",
+ " 0.65 \n",
+ " apo \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 5b59__1__1.A__1.B \n",
+ " 2vb1_A \n",
+ " 0.65 \n",
+ " apo \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 3ato__1__1.A__1.B \n",
+ " 2vb1_A \n",
+ " 0.65 \n",
+ " apo \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 6mx9__1__1.A__1.K \n",
+ " 2vb1_A \n",
+ " 0.65 \n",
+ " apo \n",
+ " \n",
+ " \n",
+ "
\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",
+ " reference_system_id \n",
+ " id \n",
+ " sort_score \n",
+ " kind \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 6pl9__1__1.A__1.C \n",
+ " 2vb1_A \n",
+ " 0.65 \n",
+ " apo \n",
+ " \n",
+ " \n",
+ " 110 \n",
+ " 6agr__1__1.A__1.G \n",
+ " 2vb1_A \n",
+ " 0.65 \n",
+ " apo \n",
+ " \n",
+ " \n",
+ " 111 \n",
+ " 4qgz__1__1.A__1.C \n",
+ " 2vb1_A \n",
+ " 0.65 \n",
+ " apo \n",
+ " \n",
+ " \n",
+ " 112 \n",
+ " 4owa__2__1.B__1.NA \n",
+ " 2vb1_A \n",
+ " 0.65 \n",
+ " apo \n",
+ " \n",
+ " \n",
+ " 113 \n",
+ " 6wgo__1__1.A__1.E \n",
+ " 2vb1_A \n",
+ " 0.65 \n",
+ " apo \n",
+ " \n",
+ " \n",
+ "
\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
+}
diff --git a/src/plinder/core/loader/dataset.py b/src/plinder/core/loader/dataset.py
index 7e1bfc12..e7b3be3b 100644
--- a/src/plinder/core/loader/dataset.py
+++ b/src/plinder/core/loader/dataset.py
@@ -9,11 +9,10 @@
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
-from plinder.core.structure.structure import Structure
from plinder.core.utils.log import setup_logger
LOG = setup_logger(__name__)
@@ -32,8 +31,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 +42,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 +68,15 @@ 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, selected_alternate_structure_id = 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 {},
+ "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 aedb337c..eaec2acd 100644
--- a/src/plinder/core/loader/featurizer.py
+++ b/src/plinder/core/loader/featurizer.py
@@ -1,67 +1,132 @@
+import random
from typing import Any
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,
+ seed: int = 42,
+) -> tuple[dict[str, Any], str]:
+ # Set seed
+ random.seed(seed)
+ # 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"
+ # 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,
+ }
+ if featurize_apo:
+ 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
+ apo_input_sequence_residue_mask_stacked = (
+ selected_apo.input_sequence_residue_mask_stacked
)
- ]
- # 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 = {
+ 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_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:
+ # 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_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,
+ }
+
+ # 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,27 +141,35 @@ 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": 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
- 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 10dbd931..f581c27e 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,82 @@ 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
- )
- return collated_and_padded_properties
+ 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 all_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]]] = []
+ alternate_structure_ids: list[str] = []
+ 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)
+ assert isinstance(x["alternate_structure_id"], 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"])
+ alternate_structure_ids.append(x["alternate_structure_id"])
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,
+ "alternate_structure_id": alternate_structure_ids,
+ "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..20382baf 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__)
@@ -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")
@@ -454,6 +456,18 @@ def input_sequence_residue_mask_stacked(self) -> list[list[int]]:
)
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_sequence_dict = other.protein_sequence_from_structure
+ # = other.protein_chain_ordered[0]
+ assert self_protein_atom_array is not None
+ assert other_sequence_dict is not None
+ 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."""
@@ -473,7 +487,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 +498,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
}
@@ -533,8 +549,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:
@@ -543,8 +559,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 = {}
@@ -561,7 +577,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(
@@ -621,100 +637,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_]:
+ 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: 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:
+ 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: 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: The amino acid sequence of the structure."""
+ 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
- numbering, 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] = {ch: 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)]
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"],
}
diff --git a/tests/core/test_core_system.py b/tests/core/test_core_system.py
index 2235f11e..cedef764 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,54 @@ 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
+ 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.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"]
+ 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]["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]["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]),
+ )
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/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 ?
+#
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 00000000..876e6177
Binary files /dev/null and b/tests/test_data/plinder/mount/linked_structures/apo.zip differ
diff --git a/tests/test_data/plinder/mount/splits/split.parquet b/tests/test_data/plinder/mount/splits/split.parquet
index f21db931..7ed8d6c4 100644
Binary files a/tests/test_data/plinder/mount/splits/split.parquet and b/tests/test_data/plinder/mount/splits/split.parquet differ