diff --git a/.gitattributes b/.gitattributes index a6344aac8c09253b3b630fb776ae94478aa0275b..bc805e2aea1b31537b1cd6cef67a5891c0a99477 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,35 +1,48 @@ *.7z filter=lfs diff=lfs merge=lfs -text *.arrow filter=lfs diff=lfs merge=lfs -text *.bin filter=lfs diff=lfs merge=lfs -text +*.bin.* filter=lfs diff=lfs merge=lfs -text *.bz2 filter=lfs diff=lfs merge=lfs -text -*.ckpt filter=lfs diff=lfs merge=lfs -text *.ftz filter=lfs diff=lfs merge=lfs -text *.gz filter=lfs diff=lfs merge=lfs -text *.h5 filter=lfs diff=lfs merge=lfs -text *.joblib filter=lfs diff=lfs merge=lfs -text *.lfs.* filter=lfs diff=lfs merge=lfs -text -*.mlmodel filter=lfs diff=lfs merge=lfs -text *.model filter=lfs diff=lfs merge=lfs -text *.msgpack filter=lfs diff=lfs merge=lfs -text -*.npy filter=lfs diff=lfs merge=lfs -text -*.npz filter=lfs diff=lfs merge=lfs -text *.onnx filter=lfs diff=lfs merge=lfs -text *.ot filter=lfs diff=lfs merge=lfs -text *.parquet filter=lfs diff=lfs merge=lfs -text *.pb filter=lfs diff=lfs merge=lfs -text -*.pickle filter=lfs diff=lfs merge=lfs -text -*.pkl filter=lfs diff=lfs merge=lfs -text *.pt filter=lfs diff=lfs merge=lfs -text *.pth filter=lfs diff=lfs merge=lfs -text *.rar filter=lfs diff=lfs merge=lfs -text -*.safetensors filter=lfs diff=lfs merge=lfs -text saved_model/**/* filter=lfs diff=lfs merge=lfs -text *.tar.* filter=lfs diff=lfs merge=lfs -text -*.tar filter=lfs diff=lfs merge=lfs -text *.tflite filter=lfs diff=lfs merge=lfs -text *.tgz filter=lfs diff=lfs merge=lfs -text -*.wasm filter=lfs diff=lfs merge=lfs -text *.xz filter=lfs diff=lfs merge=lfs -text *.zip filter=lfs diff=lfs merge=lfs -text +*.zstandard filter=lfs diff=lfs merge=lfs -text +*.tfevents* filter=lfs diff=lfs merge=lfs -text +*.db* filter=lfs diff=lfs merge=lfs -text +*.ark* filter=lfs diff=lfs merge=lfs -text +**/*ckpt*data* filter=lfs diff=lfs merge=lfs -text +**/*ckpt*.meta filter=lfs diff=lfs merge=lfs -text +**/*ckpt*.index filter=lfs diff=lfs merge=lfs -text +*.safetensors filter=lfs diff=lfs merge=lfs -text +*.ckpt filter=lfs diff=lfs merge=lfs -text +*.gguf* filter=lfs diff=lfs merge=lfs -text +*.ggml filter=lfs diff=lfs merge=lfs -text +*.llamafile* filter=lfs diff=lfs merge=lfs -text +*.pt2 filter=lfs diff=lfs merge=lfs -text +*.mlmodel filter=lfs diff=lfs merge=lfs -text +*.npy filter=lfs diff=lfs merge=lfs -text +*.npz filter=lfs diff=lfs merge=lfs -text +*.pickle filter=lfs diff=lfs merge=lfs -text +*.pkl filter=lfs diff=lfs merge=lfs -text +*.tar filter=lfs diff=lfs merge=lfs -text +*.wasm filter=lfs diff=lfs merge=lfs -text *.zst filter=lfs diff=lfs merge=lfs -text -*tfevents* filter=lfs diff=lfs merge=lfs -text +*tfevents* filter=lfs diff=lfs merge=lfs -textmodel/multievolve_workflow.png filter=lfs diff=lfs merge=lfs -text +model/streamlit_1.png filter=lfs diff=lfs merge=lfs -text diff --git a/.streamlit/config.toml b/.streamlit/config.toml new file mode 100644 index 0000000000000000000000000000000000000000..5c8c3e7863a5379b5426f56277b7074ce408f712 --- /dev/null +++ b/.streamlit/config.toml @@ -0,0 +1,6 @@ +[theme] +primaryColor = "#1E88E5" +backgroundColor = "#FFFFFF" +secondaryBackgroundColor = "#E3F2FD" +textColor = "#262730" +font = "sans serif" \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..261eeb9e9f8b2b4b0d119366dda99c6fd7d35c64 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000000000000000000000000000000000000..1037a621f67f5d8abd2d18fee8890027b039902c --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1 @@ +include model/predictors/sweep_configs/*.yaml diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..e2f49fbe340b7b567f87342022eeabb9ed4f9f32 --- /dev/null +++ b/README.md @@ -0,0 +1,500 @@ +--- +license: apache-2.0 +language: +- en +- zh +tags: +- OneScience +- life-science +- protein +- directed-evolution +- multi-mutant +- protein-language-model +- MULTI-evolve +frameworks: PyTorch +--- + +

+ + MULTI-evolve + +

+ +# Model Introduction + +MULTI-evolve (model-guided, universal, targeted installation of multi-mutants) is an end-to-end framework for protein directed evolution. It trains sequence-to-fitness prediction models, proposes combinatorial multi-mutants, generates MULTI-assembly site-directed mutagenesis oligonucleotides, and supports screening single-mutant candidates through a protein language model zero-shot ensemble method. + +Paper: + +> **Rapid directed evolution guided by protein language models and epistatic interactions** +> Science, 2026 +> https://doi.org/10.1126/science.aea1820 + +# Model Description + +The core workflow of MULTI-evolve includes: + +1. Train fully connected neural networks using experimental sequence-to-fitness data. +2. Compare different data splits, sequence representations, and machine learning models. +3. Select the best-performing prediction model to score combinatorial mutants and propose candidates. +4. Generate MULTI-assembly site-directed mutagenesis oligonucleotides from the selected multi-mutants. +5. In selected iterations, use a protein language model zero-shot ensemble method to screen single-mutant candidates. + +# Use Cases + +| Use case | Description | +| --- | --- | +| Protein directed evolution | Train fitness prediction models from experimental data and screen candidate mutations | +| Multi-mutant design | Predict combinatorial mutations and screen multi-mutants with high predicted fitness | +| Protein complex optimization | Support mutation formats and inputs for multichain proteins | +| Zero-shot mutation screening | Use a protein language model ensemble method to screen candidate single mutations | + +# Usage + +## 1. Using OneCode + +Experience intelligent one-click AI4S programming in the OneCode online environment: + +[Try intelligent one-click AI4S programming](https://web-2069360198568017922-iaaj.ksai.scnet.cn:58043/home) + +## 2. Manual Installation and Usage + +**Hardware Requirements** + +- Supervised model training and standard combinatorial mutation prediction in MULTI-evolve can run on a CPU or GPU/DCU. +- Protein language model zero-shot prediction uses models such as ESM and ESM-IF; a GPU/DCU is recommended. + +### Set Up the Runtime Environment + +#### DCU Environment + +```bash +# Activate DTK and CONDA first +conda create -n onescience311 python=3.11 -y +conda activate onescience311 + +pip install onescience[bio] \ + -i http://mirrors.onescience.ai:3141/pypi/simple/ \ + --trusted-host mirrors.onescience.ai +``` + +#### Environment Notes + +- If you encounter missing dependencies or version incompatibilities during execution, refer to the dependency versions specified in `env.yml` and install or adjust the relevant dependencies as needed. + +### Prepare Models and Data + +The different MULTI-evolve functions have different model and data requirements. Prepare the resources for standard supervised training, combinatorial multi-mutant recommendation, MULTI-assembly design, protein language model zero-shot screening, and benchmark reproduction separately. + +#### 1) Supervised Learning Input Data + +To train your own protein fitness prediction model with MULTI-evolve, prepare: + +```text +Wild-type protein FASTA ++ +Experimental training data CSV +``` + +The training data CSV must contain at least: + +```text +mutation +property_value +``` + +For example, the mutation format for a single-chain protein is: + +```text +A40P/E61Y +``` + +For multichain proteins, use `:` to separate different chains: + +```text +A40P/E61Y:WT +``` + +Where: + +```text +/ Separates multiple mutations on the same chain +: Separates different protein chains +WT Indicates that the corresponding chain remains wild type +``` + +The official repository provides example data: + +```text +data/ +├── example_protein/ +└── example_multichain_protein/ +``` + +Therefore, no additional training data download is required to run the official basic examples. + +#### 2) Combinatorial Mutation Candidate Pool + +When running combinatorial multi-mutant recommendation, in addition to the wild-type FASTA and training data, provide a mutation pool: a list of candidate single mutations eligible for combinatorial design. + +Example: + +```text +data/example_protein/combo_muts.csv +``` + +Pass this file as the: + +```text +--mutation-pool +``` + +parameter, for example: + +```bash +p2_propose.py \ + --experiment-name multievolve_example \ + --protein-name example_protein \ + --wt-files apex.fasta \ + --training-dataset example_dataset.csv \ + --mutation-pool combo_muts.csv \ + --top-muts-per-load 3 \ + --export-name multievolve_proposals +``` + +#### 3) Protein Language Model Zero-Shot Mode + +The MULTI-evolve protein language model zero-shot ensemble workflow requires: + +```text +Wild-type FASTA ++ +PDB/CIF protein structure +``` + +The current official code uses the following models: + +```text +ESM-1v: +esm1v_t33_650M_UR90S_1 +esm1v_t33_650M_UR90S_2 +esm1v_t33_650M_UR90S_3 +esm1v_t33_650M_UR90S_4 +esm1v_t33_650M_UR90S_5 + +ESM-2: +esm2_t36_3B_UR50D + +ESM-IF1: +esm_if1_gvp4_t16_142M_UR50 +``` + +MULTI-evolve calls these models through `fair-esm`. On the first run, if the corresponding weights are not available locally, `fair-esm` automatically downloads the models and caches them in the PyTorch Hub checkpoint directory. + +The default cache location is: + +```text +~/.cache/torch/hub/checkpoints/ +``` + +ESM-2 also uses the corresponding contact regression weights: + +```text +esm2_t36_3B_UR50D-contact-regression.pt +``` +- The current repository already includes `esm2_t36_3B_UR50D-contact-regression.pt` under `hub/checkpoints/`. + +For network-restricted or offline environments, download the weights in advance: + +```bash +mkdir -p ~/.cache/torch/hub/checkpoints +cd ~/.cache/torch/hub/checkpoints + +wget https://dl.fbaipublicfiles.com/fair-esm/models/esm1v_t33_650M_UR90S_1.pt +wget https://dl.fbaipublicfiles.com/fair-esm/models/esm1v_t33_650M_UR90S_2.pt +wget https://dl.fbaipublicfiles.com/fair-esm/models/esm1v_t33_650M_UR90S_3.pt +wget https://dl.fbaipublicfiles.com/fair-esm/models/esm1v_t33_650M_UR90S_4.pt +wget https://dl.fbaipublicfiles.com/fair-esm/models/esm1v_t33_650M_UR90S_5.pt + +wget https://dl.fbaipublicfiles.com/fair-esm/models/esm2_t36_3B_UR50D.pt +wget https://dl.fbaipublicfiles.com/fair-esm/regression/esm2_t36_3B_UR50D-contact-regression.pt + +wget https://dl.fbaipublicfiles.com/fair-esm/models/esm_if1_gvp4_t16_142M_UR50.pt +``` + +To save the models in the current project or another location, set the PyTorch Hub cache root with `TORCH_HOME`. For example, to use a directory in the current project: + +```bash +cd /path/to/MULTI-evolve +export TORCH_HOME=$PWD +mkdir -p ${TORCH_HOME}/hub/checkpoints +``` + +Then save or symlink the weights above to: + +```text +/path/to/MULTI-evolve/hub/checkpoints/ +``` + +This avoids modifying the MULTI-evolve source code. + +#### 4) Benchmark DMS Data + +To run the official benchmark and reproduce the performance comparison across different: + +```text +data splitting methods +sequence representation methods +machine learning models +``` + +you must additionally prepare the official benchmark DMS data by downloading it separately from Zenodo. + +Download: + +```text +DOI: 10.5281/zenodo.17620759 +https://zenodo.org/records/17620759 +``` + +After downloading, place the DMS CSV files directly in the following directory. If the directory does not exist, create it manually first: + +```text +data/benchmark/datasets/ +``` + +The benchmark script entry point in the current repository is: + +```text +scripts/notebooks/benchmark/multievolve_hyperparameter_tuning.py +``` + +## 3. Quick Start + +### Download the Model Package + +```bash +hf download OneScience-Group/MULTI-evolve \ + --local-dir ./MULTI-evolve + +cd MULTI-evolve +``` + +- Standard supervised training and combinatorial mutation recommendation in MULTI-evolve do not require additional large fixed datasets; you can use the example data in the repository or your own experimental data. + +- The protein language model zero-shot mode may require additional ESM/ESM-IF model caches; prepare them in advance in offline environments. + +### Quick Verification + +Install the current repository: + +```bash +python -m pip install -e . --no-deps +``` + +Check the commands: + +```bash +p1_train.py --help +p2_propose.py --help +p3_assembly_design.py --help +plm_zeroshot_ensemble.py --help +``` + + +# Example Data + +The official repository provides: + +```text +data/ +├── example_protein/ +├── example_multichain_protein/ +└── benchmark/ +``` + +The official command-line examples primarily use: + +```bash +cd data/example_protein +``` + +Typical inputs include: + +```text +apex.fasta +example_dataset.csv +combo_muts.csv +APEX_33overhang.fasta +apex.cif +``` + +These files are used for: + +| File | Purpose | +| --- | --- | +| `apex.fasta` | Wild-type protein amino acid sequence | +| `example_dataset.csv` | Training data | +| `combo_muts.csv` | Combinatorial mutation candidate pool | +| `APEX_33overhang.fasta` | DNA input required for MULTI-assembly oligonucleotide design | +| `apex.cif` | Structure-conditioned scoring for protein language models | + +# Inference and Training Examples + +## Step 1: Train the Neural Network Model + +```bash +# If the runtime environment is not active, activate the conda environment in use, such as onescience311 +conda activate onescience311 +cd data/example_protein + +p1_train.py \ + --experiment-name multievolve_example \ + --protein-name example_protein \ + --wt-files apex.fasta \ + --training-dataset-fname example_dataset.csv \ + --wandb-key dummy \ + --mode test +``` + +Key parameters: + +| Parameter | Description | +| --- | --- | +| `--experiment-name` | Current experiment name; keep it consistent in subsequent steps | +| `--protein-name` | Protein name | +| `--wt-files` | Wild-type FASTA; use commas to separate multiple FASTA files for multichain proteins | +| `--training-dataset-fname` | Training data CSV | +| `--mode` | `test` or `standard` | + +## Step 2: Propose Combinatorial Multi-Mutants + +```bash +p2_propose.py \ + --experiment-name multievolve_example \ + --protein-name example_protein \ + --wt-files apex.fasta \ + --training-dataset example_dataset.csv \ + --mutation-pool combo_muts.csv \ + --top-muts-per-load 3 \ + --export-name multievolve_proposals +``` + +The script loads the trained model saved to the local cache in Step 1 and scores the combinatorial mutation candidates. + +Typical output: + +```text +multievolve_proposals.csv +``` + +For protein complexes, candidate files are also generated separately for each chain. + +## Step 3: Design MULTI-assembly Oligonucleotides + +```bash +p3_assembly_design.py \ + --mutations-file multievolve_proposals.csv \ + --wt-fasta APEX_33overhang.fasta \ + --overhang 33 \ + --species human \ + --oligo-direction top \ + --tm 80 \ + --output design +``` + +Where: + +| Parameter | Description | +| --- | --- | +| `--mutations-file` | Candidate mutation CSV generated in Step 2 | +| `--wt-fasta` | Wild-type DNA FASTA containing overhangs at both ends | +| `--overhang` | Overhang length | +| `--species` | `human`, `ecoli`, or `yeast` | +| `--oligo-direction` | `top` or `bottom` | +| `--tm` | Target oligonucleotide melting temperature; the official recommendation is 80 °C | +| `--output` | `design` or `update` | + +Outputs: + +```text +cloning_sheet.csv +oligos.csv +``` + +## Protein Language Model Zero-Shot Ensemble + +```bash +plm_zeroshot_ensemble.py \ + --wt-file apex.fasta \ + --pdb-files apex.cif \ + --chain-id A \ + --variants 24 \ + --excluded-positions 1,14,41,112 \ + --normalizing-method aa_substitution_type +``` + +Where: + +| Parameter | Description | +| --- | --- | +| `--wt-file` | Wild-type protein FASTA | +| `--pdb-files` | PDB/CIF structure files; use commas to separate multiple structures | +| `--chain-id` | Chain ID of the target protein in the structure file | +| `--variants` | Number of mutations nominated by each method | +| `--excluded-positions` | Positions excluded from mutation | +| `--normalizing-method` | `aa_substitution_type` or `aa_mutation` | + +This workflow ensembles four methods and produces: + +```text +plm_zeroshot_ensemble_nominated_mutations.csv +``` + +# Output Description + +MULTI-evolve generates model caches, evaluation results, and candidate sequences at different stages. + +The official repository automatically creates the following after execution: + +```text +proteins/ +└── / + ├── feature_cache/ + ├── model_cache/ + │ └── / + │ ├── objects/ + │ └── results/ + ├── proposers/ + │ └── results/ + └── split_cache/ + └── / +``` + +The main outputs include: + +| Output | Description | +| --- | --- | +| `model_cache/` | Trained models and comparison results | +| `feature_cache/` | Cached sequence representations | +| `multievolve_proposals.csv` | Recommended multi-mutant candidates | +| `cloning_sheet.csv` | MULTI-assembly cloning design sheet | +| `oligos.csv` | Site-directed mutagenesis oligonucleotide sequences | +| `plm_zeroshot_ensemble_nominated_mutations.csv` | Protein language model zero-shot ensemble recommendations | + + +# Official OneScience Information + +| Platform | Main OneScience repository | Skills repository | +| --- | --- | --- | +| Gitee | https://gitee.com/onescience-ai/onescience | https://gitee.com/onescience-ai/oneskills | +| GitHub | https://github.com/onescience-ai/OneScience | https://github.com/onescience-ai/oneskills | + + +# Citation and License + +- Original MULTI-evolve paper: [Rapid directed evolution guided by protein language models and epistatic interactions](https://doi.org/10.1126/science.aea1820). +- The `LICENSE` in the repository root is currently **Apache License 2.0**. This license permits use, modification, distribution, and commercial use, but redistribution requires retaining the license, copyright, and attribution notices, and clearly indicating modified files. +- Apache-2.0 also includes a patent license and explicitly does not grant rights to use the project's trademarks. +- `setup.py` still contains an `MIT License` classifier, which is inconsistent with the actual `LICENSE` file in the repository root. For SCNet/ModelScope redistribution, use the Apache-2.0 `LICENSE` in the repository root as the authoritative license, and retain the original license file. +- This repository is a DCU-adapted version of MULTI-evolve, with some environment configurations, dependencies, and execution procedures adjusted. Use of the repository code, model weights, and related data remains subject to the licenses and terms of use of their respective original projects. diff --git a/config.json b/config.json new file mode 100644 index 0000000000000000000000000000000000000000..9af6de9a87330bd8f0f1818ec335953d374f84d1 --- /dev/null +++ b/config.json @@ -0,0 +1,25 @@ +{ + "framework": "Pytorch", + "task": "protein-engineering", + "subtasks": [ + "supervised-protein-fitness-training", + "combinatorial-mutant-proposal", + "multi-assembly-oligo-design", + "protein-language-model-zeroshot-screening", + "benchmark-evaluation" + ], + "entrypoints": { + "train": "scripts/p1_train.py", + "propose": "scripts/p2_propose.py", + "assembly_design": "scripts/p3_assembly_design.py", + "zeroshot": "scripts/plm_zeroshot_ensemble.py", + "streamlit_app": "scripts/app.py", + "benchmark": "scripts/notebooks/benchmark/multievolve_hyperparameter_tuning.py" + }, + "package": "model", + "example_data": [ + "data/example_protein", + "data/example_multichain_protein" + ], + "model_cache": "hub/checkpoints" +} \ No newline at end of file diff --git a/data/README.md b/data/README.md new file mode 100644 index 0000000000000000000000000000000000000000..5f5e9755c7ade40de1a9c0e84a996d8bfe5d0f72 --- /dev/null +++ b/data/README.md @@ -0,0 +1,13 @@ +# Example data + +## Training dataset + +CSV file with columns ```mutation``` and ```property_value```. Variants should be formatted as ```A40P/E61Y```, or for protein complexes as ```A40P/E61Y:WT```, where ```:``` separates the individual chains (e.g. chain 1 mutations:chain 2 mutations), ```/``` separates the individual mutations, and ```WT``` indicates the wildtype sequence. + +## Multi-chain protein + +The variable heavy domain (vh) and variable light domain (vl) chains of HuABC2, anti-CD122 antibody. + +## Single chain protein + +Engineered ascorbate peroxidase (APEX) \ No newline at end of file diff --git a/data/benchmark/README.md b/data/benchmark/README.md new file mode 100644 index 0000000000000000000000000000000000000000..6ef180afb73a5a0720c5b811fc1722d7e19d4ef5 --- /dev/null +++ b/data/benchmark/README.md @@ -0,0 +1,10 @@ +# Benchmarking + +The multievolve_hyperparameter_tuning.py script in notebooks/benchmark can be used to train the models for benchmarking MULTI-evolve. + +"dataset_summary.csv" provides details on the individual datasets used for benchmarking. The table was derived and modified from [ProteinGym](https://proteingym.org/). + +# Data + +Large datasets are not included in this repository due to size constraints. Please download DMS dataset files from Zenodo (10.5281/zenodo.17620759) and place in: +- `data/benchmark/datasets/` diff --git a/data/benchmark/dataset_summary.csv b/data/benchmark/dataset_summary.csv new file mode 100644 index 0000000000000000000000000000000000000000..735ecfd0b69bc4cd39be1a39352fdd10e95af7f0 --- /dev/null +++ b/data/benchmark/dataset_summary.csv @@ -0,0 +1,13 @@ +DMS_id,DMS_filename,UniProt_ID,taxon,source_organism,target_seq,seq_len,includes_multiple_mutants,DMS_total_number_mutants,DMS_number_multiple_mutants,DMS_binarization_cutoff,DMS_binarization_method,first_author,title,year,jo,molecule_name,selection_assay,selection_type,ProteinGym_version,coarse_selection_type +CAPSD_AAV2S_Sinai_2021,CAPSD_AAV2S_Sinai_2021.csv,CAPSD_AAV2S,Virus,Adeno-associated virus 2,MAADGYLPDWLEDTLSEGIRQWWKLKPGPPPPKPAERHKDDSRGLVLPGYKYLGPFNGLDKGEPVNEADAAALEHDKAYDRQLDSGDNPYLKYNHADAEFQERLKEDTSFGGNLGRAVFQAKKRVLEPLGLVEEPVKTAPGKKRPVEHSPVEPDSSSGTGKAGQQPARKRLNFGQTGDADSVPDPQPLGQPPAAPSGLGTNTMATGSGAPMADNNEGADGVGNSSGNWHCDSTWMGDRVITTSTRTWALPTYNNHLYKQISSQSGASNDNHYFGYSTPWGYFDFNRFHCHFSPRDWQRLINNNWGFRPKRLNFKLFNIQVKEVTQNDGTTTIANNLTSTVQVFTDSEYQLPYVLGSAHQGCLPPFPADVFMVPQYGYLTLNNGSQAVGRSSFYCLEYFPSQMLRTGNNFTFSYTFEDVPFHSSYAHSQSLDRLMNPLIDQYLYYLSRTNTPSGTTTQSRLQFSQAGASDIRDQSRNWLPGPCYRQQRVSKTSADNNNSEYSWTGATKYHLNGRDSLVNPGPAMASHKDDEEKFFPQSGVLIFGKQGSEKTNVDIEKVMITDEEEIRTTNPVATEQYGSVSTNLQRGNRQAATADVNTQGVLPGMVWQDRDVYLQGPIWAKIPHTDGHFHPSPLMGGFGLKHPPPQILIKNTPVPANPSTTFSAAKFASFITQYSTGQVSVEIEWELQKENSKRWNPEIQYTSNYNKSVNVDFTVDTNGVYSEPRPIGTRYLTRNL,735,TRUE,42328,41796,-1.2,manual,Sinai,Generative AAV capsid diversification by latent interpolation,2021,10.1101/2021.04.16.440236,AAV,viability for AAV capsid production,,0.1,OrganismalFitness +D7PM05_CLYGR_Somermeyer_2022,D7PM05_CLYGR_Somermeyer_2022.csv,D7PM05_CLYGR,Eukaryote,Clytia gregaria,MTALTEGAKLFEKEIPYITELEGDVEGMKFIIKGEGTGDATTGTIKAKYICTTGDLPVPWATILSSLSYGVFCFAKYPRHIADFFKSTQPDGYSQDRIISFDNDGQYDVKAKVTYENGTLYNRVTVKGTGFKSNGNILGMRVLYHSPPHAVYILPDRKNGGMKIEYNKAFDVMGGGHQMARHAQFNKPLGAWEEDYPLYHHLTVWTSFGKDPDDDETDHLTIVEVIKAVDLETYR,235,TRUE,24515,23346,12500,manual,Somermeyer,Heterogeneity of the GFP fitness landscape and data-driven protein design,2022,10.7554/eLife.75842,Green fluorescent protein cgreGFP,Fluorescence,FACS,1,Activity +F7YBW8_MESOW_Aakre_2015,F7YBW8_MESOW_Aakre_2015.csv,F7YBW8_MESOW,Prokaryote,Mesorhizobium opportunistum (strain LMG 24607 / HAMBI 3007 / WSM2075),MANVEKMSVAVTPQQAAVMREAVEAGEYATASEIVREAVRDWLAKRELRHDDIRRLRQLWDEGKASGRPEPVDFDALRKEARQKLTEVPPNGR,93,TRUE,9192,9155,-0.001724,median,Aakre,Evolving New Protein-Protein Interaction Specificity through Promiscuous Intermediates,2015,10.1016/j.cell.2015.09.055,Antitoxin ParD3,fitness,Growth (antitoxin neutralization of ParE3),0.1,OrganismalFitness +GFP_AEQVI_Sarkisyan_2016,GFP_AEQVI_Sarkisyan_2016.csv,GFP_AEQVI,Eukaryote,Aequorea victoria,MSKGEELFTGVVPILVELDGDVNGHKFSVSGEGEGDATYGKLTLKFICTTGKLPVPWPTLVTTLSYGVQCFSRYPDHMKQHDFFKSAMPEGYVQERTIFFKDDGNYKTRAEVKFEGDTLVNRIELKGIDFKEDGNILGHKLEYNYNSHNVYIMADKQKNGIKVNFKIRHNIEDGSVQLADHYQQNTPIGDGPVLLPDNHYLSTQSALSKDPNEKRDHMVLLEFVTAAGITHGMDELYK,238,TRUE,51714,50630,2.5,manual,Sarkisyan,Local fitness landscape of the green fluorescent protein,2016,10.1038/nature17995,GFP,Fluorescence,FACS,0.1,Activity +HIS7_YEAST_Pokusaeva_2019,HIS7_YEAST_Pokusaeva_2019.csv,HIS7_YEAST,Eukaryote,Saccharomyces cerevisiae,MTEQKALVKRITNETKIQIAISLKGGPLAIEHSIFPEKEAEAVAEQATQSQVINVHTGIGFLDHMIHALAKHSGWSLIVECIGDLHIDDHHTTEDCGIALGQAFKEALGAVRGVKRFGSGFAPLDEALSRAVVDLSNRPYAVVELGLQREKVGDLSCEMIPHFLESFAEASRITLHVDCLRGKNDHHRSESAFKALAVAIREATSPNGTNDVPSTKGVLM,220,TRUE,496137,495969,0.3,manual,Pokusaeva,An experimental assay of the interactions of amino acids from orthologous sequences shaping a complex fitness landscape,2019,10.1371/journal.pgen.1008079,IGP dehydratase (HIS3),Growth,Growth,0.1,OrganismalFitness +PHOT_CHLRE_Chen_2023,PHOT_CHLRE_Chen_2023.csv,PHOT_CHLRE,Eukaryote,Chlamydomonas reinhardtii,AGLRHTFVVADATLPDCPLVYASEGFYAMTGYGPDEVLGHNARFLQGEGTDPKEVQKIRDAIKKGEACSVRLLNYRKDGTPFWNLLTVTPIKTPDGRVSKFVGVQVDVTSKTEGKALA,118,TRUE,167529,165407,0.631701888,median,Chen,Deep Mutational Scanning of an Oxygen-Independent Fluorescent Protein CreiLOV for Comprehensive Profiling of Mutational and Epistatic Effects,2023,10.1021/acssynbio.2c00662,Phototropin,Fluorescence,FACS,1,Activity +Q6WV13_9MAXI_Somermeyer_2022,Q6WV13_9MAXI_Somermeyer_2022.csv,Q6WV12_9MAXI,Eukaryote,Pontellina plumata,MPAMKIECRITGTLNGVEFELVGGGEGTPEQGRMTNKMKSTKGALTFSPYLLSHVMGYGFYHFGTYPSGYENPFLHAINNGGYTNTRIEKYEDGGVLHVSFSYRYEAGRVIGDFKVVGTGFPEDSVIFTDKIIRSNATVEHLHPMGDNVLVGSFARTFSLRDGGYYSFVVDSHMHFKSAIHPSILQNGGPMFAFRRVEELHSNTELGIVEYQHAFKTPIAFA,222,TRUE,31401,30260,15721.24977,median,Somermeyer,Heterogeneity of the GFP fitness landscape and data-driven protein design,2022,10.7554/eLife.75842,Green fluorescent protein ppluGFP2,Fluorescence,FACS,1,Activity +Q8WTC7_9CNID_Somermeyer_2022,Q8WTC7_9CNID_Somermeyer_2022.csv,Q8WTC7_9CNID,Eukaryote,Aequorea macrodactyla,MSKGEELFTGIVPVLIELDGDVHGHKFSVRGEGEGDADYGKLEIKFICTTGKLPVPWPTLVTTLSYGILCFARYPEHMKMNDFFKSAMPEGYIQERTIFFQDDGKYKTRGEVKFEGDTLVNRIELKGMDFKEDGNILGHKLEYNFNSHNVYIMPDKANNGLKVNFKIRHNIEGGGVQLADHYQTNVPLGDGPVLIPINHYLSCQTAISKDRNETRDHMVFLEFFSACGHTHGMDELYK,238,TRUE,33510,32309,5000,manual,Somermeyer,Heterogeneity of the GFP fitness landscape and data-driven protein design,2022,10.7554/eLife.75842,Green fluorescent protein amacGFP,Fluorescence,FACS,1,Activity +SPG1_STRSG_Wu_2016,SPG1_STRSG_Wu_2016.csv,SPG1_STRSG,Prokaryote,Streptococcus sp. group G,MEKEKKVKYFLRKSAFGLASVSAAFLVGSTVFAVDSPIEDTPIIRNGGELTNLLGNSETTLALRNEESATADLTAAAVADTVAAAAAENAGAAAWEAAAAADALAKAKADALKEFNKYGVSDYYKNLINNAKTVEGIKDLQAQVVESAKKARISEATDGLSDFLKSQTPAEDTVKSIELAEAKVLANRELDKYGVSDYHKNLINNAKTVEGVKELIDEILAALPKTDQYKLILNGKTLKGETTTEAVDAATAEKVFKQYANDNGVDGEWTYDDATKTFTVTEKPEVIDASELTPAVTTYKLVINGKTLKGETTTKAVDAETAEKAFKQYANDNGVDGVWTYDDATKTFTVTEMVTEVPGDAPTEPEKPEASIPLVPLTPATPIAKDDAKKDDTKKEDAKKPEAKKDDAKKAETLPTTGEGSNPFFTAAALAVMAGAGALAVASKRKED,448,TRUE,149360,149284,0.122438875,median,Wu,Adaptation in protein fitness landscapes is facilitated by indirect paths,2016,10.7554/eLife.16965,GB1,Binding (IgG),binding,1,Binding +Q65J43_BACLD_g4_Thomas_2025,Q65J43_BACLD_g4_Thomas_2025.csv,Q65J43_BACLD,Prokaryote,Bacillus licheniformis,MIKKWAVHLLFSALVLLGLSGGAAYSPQHAEGAARYDDVLYFPASRYPETGAHISDAIKAGHADVCTIERSGADKRRQESLKGIPTKPGFDRDEWPMAMCEEGGKGASVRYVSSSDNRGAGSWVGNRLNGYADGTRILFIVQ,142,TRUE,15404,15183,1.33474,WT,Thomas,Engineering highly active nuclease enzymes with machine learning and high-throughput screening,2025,10.1016/j.cels.2025.101236,NucB,Fluorescence,FACS,,Activity +TRPB1_THEMA_Tm9D8_Johnston_2024,TRPB1_THEMA_Tm9D8_Johnston_2024.csv,TRPB1_THEMA,Prokaryote,Escherichia coli,MKGYFGPYGGQYVPEILMGALEELEAAYEGIMKDESFWKEFNDLLRDYAGRPTPLYFARRLSEKYGARVYLKREDLLHTGAHKINNAIGQVLLAKLMGKTRIIAETGAGQHGVATATAAALFGMECVIYMGEEDTIRQKLNVERMKLLGAKVVPVKSGSRTLKDAIDEALRDWITNLQTTYYVFGSVVGPHPYPIIVRNFQKVIGEETKKQIPEKEGRLPDYIVACVSGGSNAAGIFYPFIDSGVKLIGVEAGGEGLETGKHAASLLKGKIGYLHGSKTFVLQDDWGQVQVSHSVSAGLDYSGVGPEHAYWRETGKVLYDAVTDEEALDAFIELSRLEGIIPALESSHALAYLKKINIKGKVVVVNLSGRGDKDLESVLNHPYVRERIR,389,TRUE,159129,159052,0.40807,WT,Johnston,A combinatorially complete epistatic fitness landscape in an enzyme active site,2024,10.1073/pnas.2400439121,TrpB,Growth,Growth,,Stability +VH14_Li_2023,VH14_Li_2023.csv,,Human,Homo sapiens,EVQLVETGGGLVQPGGSLRLSCAASGFTLNSYGISWVRQAPGKGPEWVSVIYSDGRRTFYGDSVKGRFTISRDTSTNTVYLQMNSLRVEDTAVYYCAKGRAAGTFDSWGQGTLVTVSSGGGGSGGGGSGGGGSDVVMTQSPESLAVSLGERATISCKSSQSVLYESRNKNSVAWYQQKAGQPPKLLIYWASTRESGVPDRFSGSGSGTDFTLTISSLQAEDAAVYYCQQYHRLPLSFGGGTKVEIK,246,TRUE,35889,35452,-0.787659364,WT,Li,Machine learning optimization of candidate antibody yields highly diverse sub-nanomolar affinity antibody libraries,2023,10.1038/s41467-023-39022-2,scFv,Binding,,,Binding \ No newline at end of file diff --git a/data/example_multichain_protein/combo_muts.csv b/data/example_multichain_protein/combo_muts.csv new file mode 100644 index 0000000000000000000000000000000000000000..f1cf2e36000caeb2c593011454b074b282bb2532 --- /dev/null +++ b/data/example_multichain_protein/combo_muts.csv @@ -0,0 +1,10 @@ +A40P +S51I +T116L +L11Q +Q13P +S63A +S65H +F203G +I226L +I226P \ No newline at end of file diff --git a/data/example_multichain_protein/example_dataset.csv b/data/example_multichain_protein/example_dataset.csv new file mode 100644 index 0000000000000000000000000000000000000000..072c0da9c784ad237dbbc9cf03adcca57555fde1 --- /dev/null +++ b/data/example_multichain_protein/example_dataset.csv @@ -0,0 +1,254 @@ +mutation,property_value +WT:WT,1 +A40P:WT,1.006 +A50R:WT,1.034 +D106W:WT,0.923 +D76N:WT,0.977 +E35H:WT,0.867 +E35N:WT,0.93 +E61Y:WT,0.748 +E91S:WT,0.871 +F27W:WT,0.651 +F32Y:WT,0.802 +G9V:WT,0.238 +I48V:WT,0.339 +I71T:WT,0.783 +M108F:WT,0.853 +M34H:WT,0.498 +Q113D:WT,0.818 +Q113P:WT,0.858 +Q84D:WT,0.897 +R100I:WT,1.015 +R100L:WT,0.86 +R104G:WT,0.924 +R19T:WT,1.297 +S121P:WT,1.312 +S51I:WT,1.077 +S80T:WT,0.99 +T116L:WT,1.369 +T28D:WT,1.171 +T28P:WT,0.901 +T90P:WT,1.18 +V72I:WT,1.179 +Y103N:WT,1.179 +Y105G:WT,1.098 +Y110V:WT,1.437 +Y33W:WT,1.409 +A55P:WT,1.219 +A64D:WT,1.077 +D106Y:WT,1.036 +D57G:WT,0.763 +E6A:WT,0.929 +E6G:WT,0.435 +E91R:WT,0.659 +F70W:WT,0.487 +G107Y:WT,0.601 +G44T:WT,0.904 +K43Q:WT,1.123 +L11E:WT,0.886 +L11Q:WT,1.108 +M108Y:WT,0.788 +N53P:WT,1.009 +N56E:WT,0.945 +Q113A:WT,0.814 +Q13P:WT,1.219 +Q3K:WT,1.023 +Q84V:WT,0.973 +R104Y:WT,0.919 +R19W:WT,0.75 +R52A:WT,0.951 +S101E:WT,1.014 +S25G:WT,0.804 +S63A:WT,0.993 +S65H:WT,0.891 +T115K:WT,0.354 +V2K:WT,1.02 +Y102P:WT,0.945 +Y33D:WT,1.274 +Y82R:WT,0.66 +WT:D49Y,0.148 +WT:E78A,0.604 +WT:E80S,0.397 +WT:F61Y,0.354 +WT:F82G,1.289 +WT:I105L,1.533 +WT:I105P,1.176 +WT:I26N,1.777 +WT:I26S,1.889 +WT:L21I,1.728 +WT:L45K,0.204 +WT:M32L,0.475 +WT:N52T,0.97 +WT:N52V,1.242 +WT:N91E,1.629 +WT:N91Y,0.534 +WT:Q36K,0.455 +WT:Q88M,1.562 +WT:R18T,1.523 +WT:S24R,1.358 +WT:S24T,1.231 +WT:S27Q,1.09 +WT:S28P,1.769 +WT:T50A,0.146 +WT:T71R,0.731 +WT:V29I,0.617 +WT:V54Q,0.327 +WT:V84T,1.762 +WT:W90Y,0.528 +WT:Y31W,0.608 +WT:Y33A,0.006 +WT:Y33C,0.462 +WT:Y70F,1.467 +WT:Y93P,1.463 +WT:Y93W,1.303 +WT:A42H,0.445 +WT:A59M,0.56 +WT:A59P,0.994 +WT:C23W,0.001 +WT:E104V,0.46 +WT:E78L,0.518 +WT:E80G,0.332 +WT:F82Y,1.167 +WT:F97Y,0.285 +WT:G100V,0.06 +WT:G99N,0.857 +WT:G99P,0.735 +WT:I105N,0.59 +WT:K38L,0.45 +WT:L46T,0.099 +WT:L4M,0.311 +WT:L53R,1.764 +WT:P43T,0.11 +WT:R44K,0.885 +WT:S12H,0.74 +WT:S27E,1.6 +WT:S30P,1.732 +WT:S30Y,0.356 +WT:S7Q,0.836 +WT:T20V,1.589 +WT:T92Y,0.965 +WT:T96D,0.538 +WT:W90L,1.342 +WT:Y33W,0.352 +WT:Y48R,0.62 +WT:Y93L,0.505 +A40P:F82G,1.338 +A40P:I105L,1.428 +A40P:I105P,1.422 +A40P:L21I,1.561 +A40P:N52T,1.092 +A40P:N52V,1.168 +A40P:R18T,1.551 +A40P:S24R,1.232 +A40P:S28P,1.785 +A40P:V84T,1.878 +A40P:Y70F,1.359 +A40P:Y93P,1.7 +A40P:Y93W,1.186 +A40P:F82Y,1.5 +A40P:L53R,2.078 +A40P:S30P,1.839 +A40P:T20V,1.388 +S51I:F82G,1.19 +S51I:I105L,1.048 +S51I:I105P,0.875 +S51I:L21I,1.43 +S51I:N52T,0.836 +S51I:N52V,0.8 +S51I:R18T,0.998 +S51I:S24R,1.076 +S51I:S28P,1.219 +S51I:V84T,1.711 +S51I:Y70F,1.28 +S51I:Y93P,1.482 +S51I:Y93W,1.313 +S51I:F82Y,0.847 +S51I:L53R,1.661 +S51I:S30P,1.569 +S51I:T20V,0.86 +T116L:F82G,1.54 +T116L:I105L,1.445 +T116L:I105P,1.209 +T116L:L21I,1.92 +T116L:N52T,0.984 +T116L:N52V,1.172 +T116L:R18T,1.704 +T116L:S24R,1.577 +T116L:S28P,2.098 +T116L:V84T,2.126 +T116L:Y70F,1.7 +T116L:Y93P,1.62 +T116L:Y93W,1.477 +T116L:F82Y,1.255 +T116L:L53R,2.41 +T116L:S30P,1.929 +T116L:T20V,1.606 +L11Q:F82G,1.913 +L11Q:I105L,1.707 +L11Q:I105P,1.222 +L11Q:L21I,1.98 +L11Q:N52T,1.143 +L11Q:N52V,1.491 +L11Q:R18T,1.548 +L11Q:S24R,1.525 +L11Q:S28P,2.08 +L11Q:V84T,1.98 +L11Q:Y70F,1.441 +L11Q:Y93P,1.14 +L11Q:Y93W,0.733 +L11Q:F82Y,1.139 +L11Q:L53R,1.958 +L11Q:S30P,1.666 +L11Q:T20V,1.258 +Q13P:F82G,1.502 +Q13P:I105L,1.548 +Q13P:I105P,1.272 +Q13P:L21I,1.73 +Q13P:N52T,0.917 +Q13P:N52V,1.245 +Q13P:R18T,1.216 +Q13P:S24R,1.462 +Q13P:S28P,1.842 +Q13P:V84T,2.395 +Q13P:Y70F,1.99 +Q13P:Y93P,1.895 +Q13P:Y93W,1.31 +Q13P:F82Y,1.325 +Q13P:L53R,2.547 +Q13P:S30P,1.959 +Q13P:T20V,1.659 +S63A:F82G,1.357 +S63A:I105L,1.728 +S63A:I105P,1.141 +S63A:L21I,1.63 +S63A:N52T,0.935 +S63A:N52V,1.105 +S63A:R18T,1.625 +S63A:S24R,1.435 +S63A:S28P,2.055 +S63A:V84T,2.517 +S63A:Y70F,1.623 +S63A:Y93P,1.938 +S63A:Y93W,1.44 +S63A:F82Y,1.129 +S63A:L53R,2.276 +S63A:S30P,1.869 +S63A:T20V,1.719 +S65H:F82G,1.34 +S65H:I105L,1.308 +S65H:I105P,0.763 +S65H:L21I,1.619 +S65H:N52T,0.722 +S65H:N52V,0.84 +S65H:R18T,1.346 +S65H:S24R,1.285 +S65H:S28P,2.09 +S65H:V84T,1.78 +S65H:Y70F,1.235 +S65H:Y93P,0.732 +S65H:Y93W,0.685 +S65H:F82Y,0.853 +S65H:L53R,1.669 +S65H:S30P,1.45 +S65H:T20V,1.203 +Q13P:L21I/S28P/L53R/V84T,2.018 \ No newline at end of file diff --git a/data/example_multichain_protein/multichain_protein.cif b/data/example_multichain_protein/multichain_protein.cif new file mode 100644 index 0000000000000000000000000000000000000000..f8d01772df7db9351a8efd91e7412603d5cb6317 --- /dev/null +++ b/data/example_multichain_protein/multichain_protein.cif @@ -0,0 +1,4603 @@ +# By using this file you agree to the legally binding terms of use found at alphafoldserver.com/output-terms +data_644b4ff2e79e3447 +# +_entry.id 644b4ff2e79e3447 +# +loop_ +_atom_type.symbol +C +N +O +S +# +loop_ +_audit_author.name +_audit_author.pdbx_ordinal +"Google DeepMind" 1 +"Isomorphic Labs" 2 +# +_audit_conform.dict_location https://raw.githubusercontent.com/ihmwg/ModelCIF/master/dist/mmcif_ma.dic +_audit_conform.dict_name mmcif_ma.dic +_audit_conform.dict_version 1.4.5 +# +loop_ +_chem_comp.formula +_chem_comp.formula_weight +_chem_comp.id +_chem_comp.mon_nstd_flag +_chem_comp.name +_chem_comp.pdbx_smiles +_chem_comp.pdbx_synonyms +_chem_comp.type +"C3 H7 N O2" 89.093 ALA y ALANINE C[C@H](N)C(O)=O ? "L-PEPTIDE LINKING" +"C6 H15 N4 O2" 175.209 ARG y ARGININE N[C@@H](CCCNC(N)=[NH2+])C(O)=O ? "L-PEPTIDE LINKING" +"C4 H8 N2 O3" 132.118 ASN y ASPARAGINE N[C@@H](CC(N)=O)C(O)=O ? "L-PEPTIDE LINKING" +"C4 H7 N O4" 133.103 ASP y "ASPARTIC ACID" N[C@@H](CC(O)=O)C(O)=O ? "L-PEPTIDE LINKING" +"C3 H7 N O2 S" 121.158 CYS y CYSTEINE N[C@@H](CS)C(O)=O ? "L-PEPTIDE LINKING" +"C5 H10 N2 O3" 146.144 GLN y GLUTAMINE N[C@@H](CCC(N)=O)C(O)=O ? "L-PEPTIDE LINKING" +"C5 H9 N O4" 147.129 GLU y "GLUTAMIC ACID" N[C@@H](CCC(O)=O)C(O)=O ? "L-PEPTIDE LINKING" +"C2 H5 N O2" 75.067 GLY y GLYCINE NCC(O)=O ? "PEPTIDE LINKING" +"C6 H10 N3 O2" 156.162 HIS y HISTIDINE N[C@@H](Cc1c[nH]c[nH+]1)C(O)=O ? "L-PEPTIDE LINKING" +"C6 H13 N O2" 131.173 ILE y ISOLEUCINE CC[C@H](C)[C@H](N)C(O)=O ? "L-PEPTIDE LINKING" +"C6 H13 N O2" 131.173 LEU y LEUCINE CC(C)C[C@H](N)C(O)=O ? "L-PEPTIDE LINKING" +"C6 H15 N2 O2" 147.195 LYS y LYSINE N[C@@H](CCCC[NH3+])C(O)=O ? "L-PEPTIDE LINKING" +"C5 H11 N O2 S" 149.211 MET y METHIONINE CSCC[C@H](N)C(O)=O ? "L-PEPTIDE LINKING" +"C9 H11 N O2" 165.189 PHE y PHENYLALANINE N[C@@H](Cc1ccccc1)C(O)=O ? "L-PEPTIDE LINKING" +"C5 H9 N O2" 115.130 PRO y PROLINE OC(=O)[C@@H]1CCCN1 ? "L-PEPTIDE LINKING" +"C3 H7 N O3" 105.093 SER y SERINE N[C@@H](CO)C(O)=O ? "L-PEPTIDE LINKING" +"C4 H9 N O3" 119.119 THR y THREONINE C[C@@H](O)[C@H](N)C(O)=O ? "L-PEPTIDE LINKING" +"C11 H12 N2 O2" 204.225 TRP y TRYPTOPHAN N[C@@H](Cc1c[nH]c2ccccc12)C(O)=O ? "L-PEPTIDE LINKING" +"C9 H11 N O3" 181.189 TYR y TYROSINE N[C@@H](Cc1ccc(O)cc1)C(O)=O ? "L-PEPTIDE LINKING" +"C5 H11 N O2" 117.146 VAL y VALINE CC(C)[C@H](N)C(O)=O ? "L-PEPTIDE LINKING" +# +_citation.book_publisher ? +_citation.country UK +_citation.id primary +_citation.journal_full Nature +_citation.journal_id_ASTM NATUAS +_citation.journal_id_CSD 0006 +_citation.journal_id_ISSN 0028-0836 +_citation.journal_volume ? +_citation.page_first ? +_citation.page_last ? +_citation.pdbx_database_id_DOI ? +_citation.pdbx_database_id_PubMed ? +_citation.title "Accurate structure prediction of biomolecular interactions with AlphaFold 3" +_citation.year 2024 +# +loop_ +_citation_author.citation_id +_citation_author.name +_citation_author.ordinal +primary "Google DeepMind" 1 +primary "Isomorphic Labs" 2 +# +loop_ +_entity.id +_entity.pdbx_description +_entity.type +1 . polymer +2 . polymer +3 . polymer +# +loop_ +_entity_poly.entity_id +_entity_poly.pdbx_strand_id +_entity_poly.type +1 A polypeptide(L) +2 B polypeptide(L) +3 C polypeptide(L) +# +loop_ +_entity_poly_seq.entity_id +_entity_poly_seq.hetero +_entity_poly_seq.mon_id +_entity_poly_seq.num +1 n GLU 1 +1 n VAL 2 +1 n GLN 3 +1 n LEU 4 +1 n VAL 5 +1 n GLU 6 +1 n SER 7 +1 n GLY 8 +1 n GLY 9 +1 n GLY 10 +1 n LEU 11 +1 n VAL 12 +1 n GLN 13 +1 n PRO 14 +1 n GLY 15 +1 n GLY 16 +1 n SER 17 +1 n LEU 18 +1 n ARG 19 +1 n LEU 20 +1 n SER 21 +1 n CYS 22 +1 n ALA 23 +1 n ALA 24 +1 n SER 25 +1 n GLY 26 +1 n PHE 27 +1 n THR 28 +1 n PHE 29 +1 n SER 30 +1 n ASP 31 +1 n PHE 32 +1 n TYR 33 +1 n MET 34 +1 n GLU 35 +1 n TRP 36 +1 n VAL 37 +1 n ARG 38 +1 n GLN 39 +1 n ALA 40 +1 n PRO 41 +1 n GLY 42 +1 n LYS 43 +1 n GLY 44 +1 n LEU 45 +1 n GLU 46 +1 n TRP 47 +1 n ILE 48 +1 n ALA 49 +1 n ALA 50 +1 n SER 51 +1 n ARG 52 +1 n ASN 53 +1 n LYS 54 +1 n ALA 55 +1 n ASN 56 +1 n ASP 57 +1 n TYR 58 +1 n THR 59 +1 n THR 60 +1 n GLU 61 +1 n TYR 62 +1 n SER 63 +1 n ALA 64 +1 n SER 65 +1 n VAL 66 +1 n LYS 67 +1 n GLY 68 +1 n ARG 69 +1 n PHE 70 +1 n ILE 71 +1 n VAL 72 +1 n SER 73 +1 n ARG 74 +1 n ASP 75 +1 n ASP 76 +1 n SER 77 +1 n LYS 78 +1 n ASN 79 +1 n SER 80 +1 n LEU 81 +1 n TYR 82 +1 n LEU 83 +1 n GLN 84 +1 n MET 85 +1 n ASN 86 +1 n SER 87 +1 n LEU 88 +1 n LYS 89 +1 n THR 90 +1 n GLU 91 +1 n ASP 92 +1 n THR 93 +1 n ALA 94 +1 n VAL 95 +1 n TYR 96 +1 n TYR 97 +1 n CYS 98 +1 n ALA 99 +1 n ARG 100 +1 n SER 101 +1 n TYR 102 +1 n TYR 103 +1 n ARG 104 +1 n TYR 105 +1 n ASP 106 +1 n GLY 107 +1 n MET 108 +1 n ASP 109 +1 n TYR 110 +1 n TRP 111 +1 n GLY 112 +1 n GLN 113 +1 n GLY 114 +1 n THR 115 +1 n THR 116 +1 n VAL 117 +1 n THR 118 +1 n VAL 119 +1 n SER 120 +1 n SER 121 +2 n GLU 1 +2 n ILE 2 +2 n VAL 3 +2 n LEU 4 +2 n THR 5 +2 n GLN 6 +2 n SER 7 +2 n PRO 8 +2 n ALA 9 +2 n THR 10 +2 n LEU 11 +2 n SER 12 +2 n LEU 13 +2 n SER 14 +2 n PRO 15 +2 n GLY 16 +2 n GLU 17 +2 n ARG 18 +2 n ALA 19 +2 n THR 20 +2 n LEU 21 +2 n SER 22 +2 n CYS 23 +2 n SER 24 +2 n ALA 25 +2 n ILE 26 +2 n SER 27 +2 n SER 28 +2 n VAL 29 +2 n SER 30 +2 n TYR 31 +2 n MET 32 +2 n TYR 33 +2 n TRP 34 +2 n TYR 35 +2 n GLN 36 +2 n GLN 37 +2 n LYS 38 +2 n PRO 39 +2 n GLY 40 +2 n GLN 41 +2 n ALA 42 +2 n PRO 43 +2 n ARG 44 +2 n LEU 45 +2 n LEU 46 +2 n ILE 47 +2 n TYR 48 +2 n ASP 49 +2 n THR 50 +2 n SER 51 +2 n ASN 52 +2 n LEU 53 +2 n VAL 54 +2 n SER 55 +2 n GLY 56 +2 n VAL 57 +2 n PRO 58 +2 n ALA 59 +2 n ARG 60 +2 n PHE 61 +2 n SER 62 +2 n GLY 63 +2 n SER 64 +2 n GLY 65 +2 n SER 66 +2 n GLY 67 +2 n THR 68 +2 n ASP 69 +2 n TYR 70 +2 n THR 71 +2 n LEU 72 +2 n THR 73 +2 n ILE 74 +2 n SER 75 +2 n SER 76 +2 n LEU 77 +2 n GLU 78 +2 n PRO 79 +2 n GLU 80 +2 n ASP 81 +2 n PHE 82 +2 n ALA 83 +2 n VAL 84 +2 n TYR 85 +2 n TYR 86 +2 n CYS 87 +2 n GLN 88 +2 n GLN 89 +2 n TRP 90 +2 n ASN 91 +2 n THR 92 +2 n TYR 93 +2 n PRO 94 +2 n TYR 95 +2 n THR 96 +2 n PHE 97 +2 n GLY 98 +2 n GLY 99 +2 n GLY 100 +2 n THR 101 +2 n LYS 102 +2 n VAL 103 +2 n GLU 104 +2 n ILE 105 +2 n LYS 106 +3 n ALA 1 +3 n VAL 2 +3 n ASN 3 +3 n GLY 4 +3 n THR 5 +3 n SER 6 +3 n GLN 7 +3 n PHE 8 +3 n THR 9 +3 n CYS 10 +3 n PHE 11 +3 n TYR 12 +3 n ASN 13 +3 n SER 14 +3 n ARG 15 +3 n ALA 16 +3 n ASN 17 +3 n ILE 18 +3 n SER 19 +3 n CYS 20 +3 n VAL 21 +3 n TRP 22 +3 n SER 23 +3 n GLN 24 +3 n ASP 25 +3 n GLY 26 +3 n ALA 27 +3 n LEU 28 +3 n GLN 29 +3 n ASP 30 +3 n THR 31 +3 n SER 32 +3 n CYS 33 +3 n GLN 34 +3 n VAL 35 +3 n HIS 36 +3 n ALA 37 +3 n TRP 38 +3 n PRO 39 +3 n ASP 40 +3 n ARG 41 +3 n ARG 42 +3 n ARG 43 +3 n TRP 44 +3 n ASN 45 +3 n GLN 46 +3 n THR 47 +3 n CYS 48 +3 n GLU 49 +3 n LEU 50 +3 n LEU 51 +3 n PRO 52 +3 n VAL 53 +3 n SER 54 +3 n GLN 55 +3 n ALA 56 +3 n SER 57 +3 n TRP 58 +3 n ALA 59 +3 n CYS 60 +3 n ASN 61 +3 n LEU 62 +3 n ILE 63 +3 n LEU 64 +3 n GLY 65 +3 n ALA 66 +3 n PRO 67 +3 n ASP 68 +3 n SER 69 +3 n GLN 70 +3 n LYS 71 +3 n LEU 72 +3 n THR 73 +3 n THR 74 +3 n VAL 75 +3 n ASP 76 +3 n ILE 77 +3 n VAL 78 +3 n THR 79 +3 n LEU 80 +3 n ARG 81 +3 n VAL 82 +3 n LEU 83 +3 n CYS 84 +3 n ARG 85 +3 n GLU 86 +3 n GLY 87 +3 n VAL 88 +3 n ARG 89 +3 n TRP 90 +3 n ARG 91 +3 n VAL 92 +3 n MET 93 +3 n ALA 94 +3 n ILE 95 +3 n GLN 96 +3 n ASP 97 +3 n PHE 98 +3 n LYS 99 +3 n PRO 100 +3 n PHE 101 +3 n GLU 102 +3 n ASN 103 +3 n LEU 104 +3 n ARG 105 +3 n LEU 106 +3 n MET 107 +3 n ALA 108 +3 n PRO 109 +3 n ILE 110 +3 n SER 111 +3 n LEU 112 +3 n GLN 113 +3 n VAL 114 +3 n VAL 115 +3 n HIS 116 +3 n VAL 117 +3 n GLU 118 +3 n THR 119 +3 n HIS 120 +3 n ARG 121 +3 n CYS 122 +3 n ASN 123 +3 n ILE 124 +3 n SER 125 +3 n TRP 126 +3 n GLU 127 +3 n ILE 128 +3 n SER 129 +3 n GLN 130 +3 n ALA 131 +3 n SER 132 +3 n HIS 133 +3 n TYR 134 +3 n PHE 135 +3 n GLU 136 +3 n ARG 137 +3 n HIS 138 +3 n LEU 139 +3 n GLU 140 +3 n PHE 141 +3 n GLU 142 +3 n ALA 143 +3 n ARG 144 +3 n THR 145 +3 n LEU 146 +3 n SER 147 +3 n PRO 148 +3 n GLY 149 +3 n HIS 150 +3 n THR 151 +3 n TRP 152 +3 n GLU 153 +3 n GLU 154 +3 n ALA 155 +3 n PRO 156 +3 n LEU 157 +3 n LEU 158 +3 n THR 159 +3 n LEU 160 +3 n LYS 161 +3 n GLN 162 +3 n LYS 163 +3 n GLN 164 +3 n GLU 165 +3 n TRP 166 +3 n ILE 167 +3 n CYS 168 +3 n LEU 169 +3 n GLU 170 +3 n THR 171 +3 n LEU 172 +3 n THR 173 +3 n PRO 174 +3 n ASP 175 +3 n THR 176 +3 n GLN 177 +3 n TYR 178 +3 n GLU 179 +3 n PHE 180 +3 n GLN 181 +3 n VAL 182 +3 n ARG 183 +3 n VAL 184 +3 n LYS 185 +3 n PRO 186 +3 n LEU 187 +3 n GLN 188 +3 n GLY 189 +3 n GLU 190 +3 n PHE 191 +3 n THR 192 +3 n THR 193 +3 n TRP 194 +3 n SER 195 +3 n PRO 196 +3 n TRP 197 +3 n SER 198 +3 n GLN 199 +3 n PRO 200 +3 n LEU 201 +3 n ALA 202 +3 n PHE 203 +3 n ARG 204 +3 n THR 205 +3 n LYS 206 +3 n PRO 207 +3 n ALA 208 +3 n ALA 209 +3 n LEU 210 +3 n GLY 211 +3 n LYS 212 +3 n ASP 213 +3 n THR 214 +# +_ma_data.content_type "model coordinates" +_ma_data.id 1 +_ma_data.name Model +# +_ma_model_list.data_id 1 +_ma_model_list.model_group_id 1 +_ma_model_list.model_group_name "AlphaFold-beta-20231127 (fb0b9d13-0bdd-4522-ba5f-0ee1f426d085 @ 2025-01-17 11:50:10)" +_ma_model_list.model_id 1 +_ma_model_list.model_name "Top ranked model" +_ma_model_list.model_type "Ab initio model" +_ma_model_list.ordinal_id 1 +# +loop_ +_ma_protocol_step.method_type +_ma_protocol_step.ordinal_id +_ma_protocol_step.protocol_id +_ma_protocol_step.step_id +"coevolution MSA" 1 1 1 +"template search" 2 1 2 +modeling 3 1 3 +# +loop_ +_ma_qa_metric.id +_ma_qa_metric.mode +_ma_qa_metric.name +_ma_qa_metric.software_group_id +_ma_qa_metric.type +1 global pLDDT 1 pLDDT +2 local pLDDT 1 pLDDT +# +_ma_qa_metric_global.metric_id 1 +_ma_qa_metric_global.metric_value 85.35 +_ma_qa_metric_global.model_id 1 +_ma_qa_metric_global.ordinal_id 1 +# +_ma_software_group.group_id 1 +_ma_software_group.ordinal_id 1 +_ma_software_group.software_id 1 +# +loop_ +_ma_target_entity.data_id +_ma_target_entity.entity_id +_ma_target_entity.origin +1 1 . +1 2 . +1 3 . +# +loop_ +_ma_target_entity_instance.asym_id +_ma_target_entity_instance.details +_ma_target_entity_instance.entity_id +A . 1 +B . 2 +C . 3 +# +loop_ +_pdbx_data_usage.details +_pdbx_data_usage.id +_pdbx_data_usage.type +_pdbx_data_usage.url +;NON-COMMERCIAL USE ONLY, BY USING THIS FILE YOU AGREE TO THE TERMS OF USE FOUND +AT alphafoldserver.com/output-terms. +; +1 license ? +;THE INFORMATION IS NOT INTENDED FOR, HAS NOT BEEN VALIDATED FOR, AND IS NOT +APPROVED FOR CLINICAL USE. IT SHOULD NOT BE USED FOR CLINICAL PURPOSE OR RELIED +ON FOR MEDICAL OR OTHER PROFESSIONAL ADVICE. IT IS THEORETICAL MODELLING ONLY +AND CAUTION SHOULD BE EXERCISED IN ITS USE. IT IS PROVIDED "AS-IS" WITHOUT ANY +WARRANTY OF ANY KIND, WHETHER EXPRESSED OR IMPLIED. NO WARRANTY IS GIVEN THAT +USE OF THE INFORMATION SHALL NOT INFRINGE THE RIGHTS OF ANY THIRD PARTY. +; +2 disclaimer ? +# +loop_ +_pdbx_poly_seq_scheme.asym_id +_pdbx_poly_seq_scheme.auth_seq_num +_pdbx_poly_seq_scheme.entity_id +_pdbx_poly_seq_scheme.hetero +_pdbx_poly_seq_scheme.mon_id +_pdbx_poly_seq_scheme.pdb_ins_code +_pdbx_poly_seq_scheme.pdb_seq_num +_pdbx_poly_seq_scheme.pdb_strand_id +_pdbx_poly_seq_scheme.seq_id +A 1 1 n GLU . 1 A 1 +A 2 1 n VAL . 2 A 2 +A 3 1 n GLN . 3 A 3 +A 4 1 n LEU . 4 A 4 +A 5 1 n VAL . 5 A 5 +A 6 1 n GLU . 6 A 6 +A 7 1 n SER . 7 A 7 +A 8 1 n GLY . 8 A 8 +A 9 1 n GLY . 9 A 9 +A 10 1 n GLY . 10 A 10 +A 11 1 n LEU . 11 A 11 +A 12 1 n VAL . 12 A 12 +A 13 1 n GLN . 13 A 13 +A 14 1 n PRO . 14 A 14 +A 15 1 n GLY . 15 A 15 +A 16 1 n GLY . 16 A 16 +A 17 1 n SER . 17 A 17 +A 18 1 n LEU . 18 A 18 +A 19 1 n ARG . 19 A 19 +A 20 1 n LEU . 20 A 20 +A 21 1 n SER . 21 A 21 +A 22 1 n CYS . 22 A 22 +A 23 1 n ALA . 23 A 23 +A 24 1 n ALA . 24 A 24 +A 25 1 n SER . 25 A 25 +A 26 1 n GLY . 26 A 26 +A 27 1 n PHE . 27 A 27 +A 28 1 n THR . 28 A 28 +A 29 1 n PHE . 29 A 29 +A 30 1 n SER . 30 A 30 +A 31 1 n ASP . 31 A 31 +A 32 1 n PHE . 32 A 32 +A 33 1 n TYR . 33 A 33 +A 34 1 n MET . 34 A 34 +A 35 1 n GLU . 35 A 35 +A 36 1 n TRP . 36 A 36 +A 37 1 n VAL . 37 A 37 +A 38 1 n ARG . 38 A 38 +A 39 1 n GLN . 39 A 39 +A 40 1 n ALA . 40 A 40 +A 41 1 n PRO . 41 A 41 +A 42 1 n GLY . 42 A 42 +A 43 1 n LYS . 43 A 43 +A 44 1 n GLY . 44 A 44 +A 45 1 n LEU . 45 A 45 +A 46 1 n GLU . 46 A 46 +A 47 1 n TRP . 47 A 47 +A 48 1 n ILE . 48 A 48 +A 49 1 n ALA . 49 A 49 +A 50 1 n ALA . 50 A 50 +A 51 1 n SER . 51 A 51 +A 52 1 n ARG . 52 A 52 +A 53 1 n ASN . 53 A 53 +A 54 1 n LYS . 54 A 54 +A 55 1 n ALA . 55 A 55 +A 56 1 n ASN . 56 A 56 +A 57 1 n ASP . 57 A 57 +A 58 1 n TYR . 58 A 58 +A 59 1 n THR . 59 A 59 +A 60 1 n THR . 60 A 60 +A 61 1 n GLU . 61 A 61 +A 62 1 n TYR . 62 A 62 +A 63 1 n SER . 63 A 63 +A 64 1 n ALA . 64 A 64 +A 65 1 n SER . 65 A 65 +A 66 1 n VAL . 66 A 66 +A 67 1 n LYS . 67 A 67 +A 68 1 n GLY . 68 A 68 +A 69 1 n ARG . 69 A 69 +A 70 1 n PHE . 70 A 70 +A 71 1 n ILE . 71 A 71 +A 72 1 n VAL . 72 A 72 +A 73 1 n SER . 73 A 73 +A 74 1 n ARG . 74 A 74 +A 75 1 n ASP . 75 A 75 +A 76 1 n ASP . 76 A 76 +A 77 1 n SER . 77 A 77 +A 78 1 n LYS . 78 A 78 +A 79 1 n ASN . 79 A 79 +A 80 1 n SER . 80 A 80 +A 81 1 n LEU . 81 A 81 +A 82 1 n TYR . 82 A 82 +A 83 1 n LEU . 83 A 83 +A 84 1 n GLN . 84 A 84 +A 85 1 n MET . 85 A 85 +A 86 1 n ASN . 86 A 86 +A 87 1 n SER . 87 A 87 +A 88 1 n LEU . 88 A 88 +A 89 1 n LYS . 89 A 89 +A 90 1 n THR . 90 A 90 +A 91 1 n GLU . 91 A 91 +A 92 1 n ASP . 92 A 92 +A 93 1 n THR . 93 A 93 +A 94 1 n ALA . 94 A 94 +A 95 1 n VAL . 95 A 95 +A 96 1 n TYR . 96 A 96 +A 97 1 n TYR . 97 A 97 +A 98 1 n CYS . 98 A 98 +A 99 1 n ALA . 99 A 99 +A 100 1 n ARG . 100 A 100 +A 101 1 n SER . 101 A 101 +A 102 1 n TYR . 102 A 102 +A 103 1 n TYR . 103 A 103 +A 104 1 n ARG . 104 A 104 +A 105 1 n TYR . 105 A 105 +A 106 1 n ASP . 106 A 106 +A 107 1 n GLY . 107 A 107 +A 108 1 n MET . 108 A 108 +A 109 1 n ASP . 109 A 109 +A 110 1 n TYR . 110 A 110 +A 111 1 n TRP . 111 A 111 +A 112 1 n GLY . 112 A 112 +A 113 1 n GLN . 113 A 113 +A 114 1 n GLY . 114 A 114 +A 115 1 n THR . 115 A 115 +A 116 1 n THR . 116 A 116 +A 117 1 n VAL . 117 A 117 +A 118 1 n THR . 118 A 118 +A 119 1 n VAL . 119 A 119 +A 120 1 n SER . 120 A 120 +A 121 1 n SER . 121 A 121 +B 1 2 n GLU . 1 B 1 +B 2 2 n ILE . 2 B 2 +B 3 2 n VAL . 3 B 3 +B 4 2 n LEU . 4 B 4 +B 5 2 n THR . 5 B 5 +B 6 2 n GLN . 6 B 6 +B 7 2 n SER . 7 B 7 +B 8 2 n PRO . 8 B 8 +B 9 2 n ALA . 9 B 9 +B 10 2 n THR . 10 B 10 +B 11 2 n LEU . 11 B 11 +B 12 2 n SER . 12 B 12 +B 13 2 n LEU . 13 B 13 +B 14 2 n SER . 14 B 14 +B 15 2 n PRO . 15 B 15 +B 16 2 n GLY . 16 B 16 +B 17 2 n GLU . 17 B 17 +B 18 2 n ARG . 18 B 18 +B 19 2 n ALA . 19 B 19 +B 20 2 n THR . 20 B 20 +B 21 2 n LEU . 21 B 21 +B 22 2 n SER . 22 B 22 +B 23 2 n CYS . 23 B 23 +B 24 2 n SER . 24 B 24 +B 25 2 n ALA . 25 B 25 +B 26 2 n ILE . 26 B 26 +B 27 2 n SER . 27 B 27 +B 28 2 n SER . 28 B 28 +B 29 2 n VAL . 29 B 29 +B 30 2 n SER . 30 B 30 +B 31 2 n TYR . 31 B 31 +B 32 2 n MET . 32 B 32 +B 33 2 n TYR . 33 B 33 +B 34 2 n TRP . 34 B 34 +B 35 2 n TYR . 35 B 35 +B 36 2 n GLN . 36 B 36 +B 37 2 n GLN . 37 B 37 +B 38 2 n LYS . 38 B 38 +B 39 2 n PRO . 39 B 39 +B 40 2 n GLY . 40 B 40 +B 41 2 n GLN . 41 B 41 +B 42 2 n ALA . 42 B 42 +B 43 2 n PRO . 43 B 43 +B 44 2 n ARG . 44 B 44 +B 45 2 n LEU . 45 B 45 +B 46 2 n LEU . 46 B 46 +B 47 2 n ILE . 47 B 47 +B 48 2 n TYR . 48 B 48 +B 49 2 n ASP . 49 B 49 +B 50 2 n THR . 50 B 50 +B 51 2 n SER . 51 B 51 +B 52 2 n ASN . 52 B 52 +B 53 2 n LEU . 53 B 53 +B 54 2 n VAL . 54 B 54 +B 55 2 n SER . 55 B 55 +B 56 2 n GLY . 56 B 56 +B 57 2 n VAL . 57 B 57 +B 58 2 n PRO . 58 B 58 +B 59 2 n ALA . 59 B 59 +B 60 2 n ARG . 60 B 60 +B 61 2 n PHE . 61 B 61 +B 62 2 n SER . 62 B 62 +B 63 2 n GLY . 63 B 63 +B 64 2 n SER . 64 B 64 +B 65 2 n GLY . 65 B 65 +B 66 2 n SER . 66 B 66 +B 67 2 n GLY . 67 B 67 +B 68 2 n THR . 68 B 68 +B 69 2 n ASP . 69 B 69 +B 70 2 n TYR . 70 B 70 +B 71 2 n THR . 71 B 71 +B 72 2 n LEU . 72 B 72 +B 73 2 n THR . 73 B 73 +B 74 2 n ILE . 74 B 74 +B 75 2 n SER . 75 B 75 +B 76 2 n SER . 76 B 76 +B 77 2 n LEU . 77 B 77 +B 78 2 n GLU . 78 B 78 +B 79 2 n PRO . 79 B 79 +B 80 2 n GLU . 80 B 80 +B 81 2 n ASP . 81 B 81 +B 82 2 n PHE . 82 B 82 +B 83 2 n ALA . 83 B 83 +B 84 2 n VAL . 84 B 84 +B 85 2 n TYR . 85 B 85 +B 86 2 n TYR . 86 B 86 +B 87 2 n CYS . 87 B 87 +B 88 2 n GLN . 88 B 88 +B 89 2 n GLN . 89 B 89 +B 90 2 n TRP . 90 B 90 +B 91 2 n ASN . 91 B 91 +B 92 2 n THR . 92 B 92 +B 93 2 n TYR . 93 B 93 +B 94 2 n PRO . 94 B 94 +B 95 2 n TYR . 95 B 95 +B 96 2 n THR . 96 B 96 +B 97 2 n PHE . 97 B 97 +B 98 2 n GLY . 98 B 98 +B 99 2 n GLY . 99 B 99 +B 100 2 n GLY . 100 B 100 +B 101 2 n THR . 101 B 101 +B 102 2 n LYS . 102 B 102 +B 103 2 n VAL . 103 B 103 +B 104 2 n GLU . 104 B 104 +B 105 2 n ILE . 105 B 105 +B 106 2 n LYS . 106 B 106 +C 1 3 n ALA . 1 C 1 +C 2 3 n VAL . 2 C 2 +C 3 3 n ASN . 3 C 3 +C 4 3 n GLY . 4 C 4 +C 5 3 n THR . 5 C 5 +C 6 3 n SER . 6 C 6 +C 7 3 n GLN . 7 C 7 +C 8 3 n PHE . 8 C 8 +C 9 3 n THR . 9 C 9 +C 10 3 n CYS . 10 C 10 +C 11 3 n PHE . 11 C 11 +C 12 3 n TYR . 12 C 12 +C 13 3 n ASN . 13 C 13 +C 14 3 n SER . 14 C 14 +C 15 3 n ARG . 15 C 15 +C 16 3 n ALA . 16 C 16 +C 17 3 n ASN . 17 C 17 +C 18 3 n ILE . 18 C 18 +C 19 3 n SER . 19 C 19 +C 20 3 n CYS . 20 C 20 +C 21 3 n VAL . 21 C 21 +C 22 3 n TRP . 22 C 22 +C 23 3 n SER . 23 C 23 +C 24 3 n GLN . 24 C 24 +C 25 3 n ASP . 25 C 25 +C 26 3 n GLY . 26 C 26 +C 27 3 n ALA . 27 C 27 +C 28 3 n LEU . 28 C 28 +C 29 3 n GLN . 29 C 29 +C 30 3 n ASP . 30 C 30 +C 31 3 n THR . 31 C 31 +C 32 3 n SER . 32 C 32 +C 33 3 n CYS . 33 C 33 +C 34 3 n GLN . 34 C 34 +C 35 3 n VAL . 35 C 35 +C 36 3 n HIS . 36 C 36 +C 37 3 n ALA . 37 C 37 +C 38 3 n TRP . 38 C 38 +C 39 3 n PRO . 39 C 39 +C 40 3 n ASP . 40 C 40 +C 41 3 n ARG . 41 C 41 +C 42 3 n ARG . 42 C 42 +C 43 3 n ARG . 43 C 43 +C 44 3 n TRP . 44 C 44 +C 45 3 n ASN . 45 C 45 +C 46 3 n GLN . 46 C 46 +C 47 3 n THR . 47 C 47 +C 48 3 n CYS . 48 C 48 +C 49 3 n GLU . 49 C 49 +C 50 3 n LEU . 50 C 50 +C 51 3 n LEU . 51 C 51 +C 52 3 n PRO . 52 C 52 +C 53 3 n VAL . 53 C 53 +C 54 3 n SER . 54 C 54 +C 55 3 n GLN . 55 C 55 +C 56 3 n ALA . 56 C 56 +C 57 3 n SER . 57 C 57 +C 58 3 n TRP . 58 C 58 +C 59 3 n ALA . 59 C 59 +C 60 3 n CYS . 60 C 60 +C 61 3 n ASN . 61 C 61 +C 62 3 n LEU . 62 C 62 +C 63 3 n ILE . 63 C 63 +C 64 3 n LEU . 64 C 64 +C 65 3 n GLY . 65 C 65 +C 66 3 n ALA . 66 C 66 +C 67 3 n PRO . 67 C 67 +C 68 3 n ASP . 68 C 68 +C 69 3 n SER . 69 C 69 +C 70 3 n GLN . 70 C 70 +C 71 3 n LYS . 71 C 71 +C 72 3 n LEU . 72 C 72 +C 73 3 n THR . 73 C 73 +C 74 3 n THR . 74 C 74 +C 75 3 n VAL . 75 C 75 +C 76 3 n ASP . 76 C 76 +C 77 3 n ILE . 77 C 77 +C 78 3 n VAL . 78 C 78 +C 79 3 n THR . 79 C 79 +C 80 3 n LEU . 80 C 80 +C 81 3 n ARG . 81 C 81 +C 82 3 n VAL . 82 C 82 +C 83 3 n LEU . 83 C 83 +C 84 3 n CYS . 84 C 84 +C 85 3 n ARG . 85 C 85 +C 86 3 n GLU . 86 C 86 +C 87 3 n GLY . 87 C 87 +C 88 3 n VAL . 88 C 88 +C 89 3 n ARG . 89 C 89 +C 90 3 n TRP . 90 C 90 +C 91 3 n ARG . 91 C 91 +C 92 3 n VAL . 92 C 92 +C 93 3 n MET . 93 C 93 +C 94 3 n ALA . 94 C 94 +C 95 3 n ILE . 95 C 95 +C 96 3 n GLN . 96 C 96 +C 97 3 n ASP . 97 C 97 +C 98 3 n PHE . 98 C 98 +C 99 3 n LYS . 99 C 99 +C 100 3 n PRO . 100 C 100 +C 101 3 n PHE . 101 C 101 +C 102 3 n GLU . 102 C 102 +C 103 3 n ASN . 103 C 103 +C 104 3 n LEU . 104 C 104 +C 105 3 n ARG . 105 C 105 +C 106 3 n LEU . 106 C 106 +C 107 3 n MET . 107 C 107 +C 108 3 n ALA . 108 C 108 +C 109 3 n PRO . 109 C 109 +C 110 3 n ILE . 110 C 110 +C 111 3 n SER . 111 C 111 +C 112 3 n LEU . 112 C 112 +C 113 3 n GLN . 113 C 113 +C 114 3 n VAL . 114 C 114 +C 115 3 n VAL . 115 C 115 +C 116 3 n HIS . 116 C 116 +C 117 3 n VAL . 117 C 117 +C 118 3 n GLU . 118 C 118 +C 119 3 n THR . 119 C 119 +C 120 3 n HIS . 120 C 120 +C 121 3 n ARG . 121 C 121 +C 122 3 n CYS . 122 C 122 +C 123 3 n ASN . 123 C 123 +C 124 3 n ILE . 124 C 124 +C 125 3 n SER . 125 C 125 +C 126 3 n TRP . 126 C 126 +C 127 3 n GLU . 127 C 127 +C 128 3 n ILE . 128 C 128 +C 129 3 n SER . 129 C 129 +C 130 3 n GLN . 130 C 130 +C 131 3 n ALA . 131 C 131 +C 132 3 n SER . 132 C 132 +C 133 3 n HIS . 133 C 133 +C 134 3 n TYR . 134 C 134 +C 135 3 n PHE . 135 C 135 +C 136 3 n GLU . 136 C 136 +C 137 3 n ARG . 137 C 137 +C 138 3 n HIS . 138 C 138 +C 139 3 n LEU . 139 C 139 +C 140 3 n GLU . 140 C 140 +C 141 3 n PHE . 141 C 141 +C 142 3 n GLU . 142 C 142 +C 143 3 n ALA . 143 C 143 +C 144 3 n ARG . 144 C 144 +C 145 3 n THR . 145 C 145 +C 146 3 n LEU . 146 C 146 +C 147 3 n SER . 147 C 147 +C 148 3 n PRO . 148 C 148 +C 149 3 n GLY . 149 C 149 +C 150 3 n HIS . 150 C 150 +C 151 3 n THR . 151 C 151 +C 152 3 n TRP . 152 C 152 +C 153 3 n GLU . 153 C 153 +C 154 3 n GLU . 154 C 154 +C 155 3 n ALA . 155 C 155 +C 156 3 n PRO . 156 C 156 +C 157 3 n LEU . 157 C 157 +C 158 3 n LEU . 158 C 158 +C 159 3 n THR . 159 C 159 +C 160 3 n LEU . 160 C 160 +C 161 3 n LYS . 161 C 161 +C 162 3 n GLN . 162 C 162 +C 163 3 n LYS . 163 C 163 +C 164 3 n GLN . 164 C 164 +C 165 3 n GLU . 165 C 165 +C 166 3 n TRP . 166 C 166 +C 167 3 n ILE . 167 C 167 +C 168 3 n CYS . 168 C 168 +C 169 3 n LEU . 169 C 169 +C 170 3 n GLU . 170 C 170 +C 171 3 n THR . 171 C 171 +C 172 3 n LEU . 172 C 172 +C 173 3 n THR . 173 C 173 +C 174 3 n PRO . 174 C 174 +C 175 3 n ASP . 175 C 175 +C 176 3 n THR . 176 C 176 +C 177 3 n GLN . 177 C 177 +C 178 3 n TYR . 178 C 178 +C 179 3 n GLU . 179 C 179 +C 180 3 n PHE . 180 C 180 +C 181 3 n GLN . 181 C 181 +C 182 3 n VAL . 182 C 182 +C 183 3 n ARG . 183 C 183 +C 184 3 n VAL . 184 C 184 +C 185 3 n LYS . 185 C 185 +C 186 3 n PRO . 186 C 186 +C 187 3 n LEU . 187 C 187 +C 188 3 n GLN . 188 C 188 +C 189 3 n GLY . 189 C 189 +C 190 3 n GLU . 190 C 190 +C 191 3 n PHE . 191 C 191 +C 192 3 n THR . 192 C 192 +C 193 3 n THR . 193 C 193 +C 194 3 n TRP . 194 C 194 +C 195 3 n SER . 195 C 195 +C 196 3 n PRO . 196 C 196 +C 197 3 n TRP . 197 C 197 +C 198 3 n SER . 198 C 198 +C 199 3 n GLN . 199 C 199 +C 200 3 n PRO . 200 C 200 +C 201 3 n LEU . 201 C 201 +C 202 3 n ALA . 202 C 202 +C 203 3 n PHE . 203 C 203 +C 204 3 n ARG . 204 C 204 +C 205 3 n THR . 205 C 205 +C 206 3 n LYS . 206 C 206 +C 207 3 n PRO . 207 C 207 +C 208 3 n ALA . 208 C 208 +C 209 3 n ALA . 209 C 209 +C 210 3 n LEU . 210 C 210 +C 211 3 n GLY . 211 C 211 +C 212 3 n LYS . 212 C 212 +C 213 3 n ASP . 213 C 213 +C 214 3 n THR . 214 C 214 +# +_software.classification other +_software.date ? +_software.description "Structure prediction" +_software.name AlphaFold +_software.pdbx_ordinal 1 +_software.type package +_software.version "AlphaFold-beta-20231127 (fb0b9d13-0bdd-4522-ba5f-0ee1f426d085 @ 2025-01-17 11:50:10)" +# +loop_ +_struct_asym.entity_id +_struct_asym.id +1 A +2 B +3 C +# +loop_ +_atom_site.group_PDB +_atom_site.id +_atom_site.type_symbol +_atom_site.label_atom_id +_atom_site.label_alt_id +_atom_site.label_comp_id +_atom_site.label_asym_id +_atom_site.label_entity_id +_atom_site.label_seq_id +_atom_site.pdbx_PDB_ins_code +_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.pdbx_PDB_model_num +ATOM 1 N N . GLU A 1 1 ? 11.197 6.650 25.875 1.00 82.03 1 A 1 +ATOM 2 C CA . GLU A 1 1 ? 10.443 5.378 25.806 1.00 89.27 1 A 1 +ATOM 3 C C . GLU A 1 1 ? 9.113 5.632 25.111 1.00 91.01 1 A 1 +ATOM 4 O O . GLU A 1 1 ? 8.547 6.706 25.291 1.00 86.82 1 A 1 +ATOM 5 C CB . GLU A 1 1 ? 10.252 4.833 27.220 1.00 81.08 1 A 1 +ATOM 6 C CG . GLU A 1 1 ? 9.656 3.429 27.243 1.00 66.77 1 A 1 +ATOM 7 C CD . GLU A 1 1 ? 9.628 2.839 28.661 1.00 58.54 1 A 1 +ATOM 8 O OE1 . GLU A 1 1 ? 9.294 1.652 28.750 1.00 49.05 1 A 1 +ATOM 9 O OE2 . GLU A 1 1 ? 9.966 3.573 29.606 1.00 54.08 1 A 1 +ATOM 10 N N . VAL A 1 2 ? 8.642 4.709 24.293 1.00 92.25 2 A 1 +ATOM 11 C CA . VAL A 1 2 ? 7.333 4.830 23.634 1.00 92.54 2 A 1 +ATOM 12 C C . VAL A 1 2 ? 6.247 4.541 24.656 1.00 93.50 2 A 1 +ATOM 13 O O . VAL A 1 2 ? 6.276 3.490 25.297 1.00 92.45 2 A 1 +ATOM 14 C CB . VAL A 1 2 ? 7.205 3.877 22.443 1.00 89.96 2 A 1 +ATOM 15 C CG1 . VAL A 1 2 ? 5.798 3.912 21.836 1.00 86.14 2 A 1 +ATOM 16 C CG2 . VAL A 1 2 ? 8.224 4.224 21.354 1.00 86.31 2 A 1 +ATOM 17 N N . GLN A 1 3 ? 5.277 5.440 24.786 1.00 95.46 3 A 1 +ATOM 18 C CA . GLN A 1 3 ? 4.170 5.290 25.720 1.00 96.06 3 A 1 +ATOM 19 C C . GLN A 1 3 ? 2.858 5.759 25.093 1.00 96.89 3 A 1 +ATOM 20 O O . GLN A 1 3 ? 2.811 6.783 24.408 1.00 96.24 3 A 1 +ATOM 21 C CB . GLN A 1 3 ? 4.505 6.046 27.010 1.00 94.54 3 A 1 +ATOM 22 C CG . GLN A 1 3 ? 3.567 5.653 28.157 1.00 84.11 3 A 1 +ATOM 23 C CD . GLN A 1 3 ? 3.917 6.342 29.479 1.00 81.70 3 A 1 +ATOM 24 O OE1 . GLN A 1 3 ? 4.735 7.244 29.555 1.00 73.87 3 A 1 +ATOM 25 N NE2 . GLN A 1 3 ? 3.293 5.950 30.560 1.00 69.24 3 A 1 +ATOM 26 N N . LEU A 1 4 ? 1.796 5.004 25.355 1.00 97.35 4 A 1 +ATOM 27 C CA . LEU A 1 4 ? 0.423 5.343 25.015 1.00 97.72 4 A 1 +ATOM 28 C C . LEU A 1 4 ? -0.401 5.303 26.304 1.00 97.92 4 A 1 +ATOM 29 O O . LEU A 1 4 ? -0.287 4.365 27.082 1.00 96.93 4 A 1 +ATOM 30 C CB . LEU A 1 4 ? -0.134 4.335 23.987 1.00 97.32 4 A 1 +ATOM 31 C CG . LEU A 1 4 ? 0.636 4.270 22.656 1.00 96.26 4 A 1 +ATOM 32 C CD1 . LEU A 1 4 ? 0.024 3.203 21.755 1.00 94.01 4 A 1 +ATOM 33 C CD2 . LEU A 1 4 ? 0.595 5.595 21.899 1.00 93.48 4 A 1 +ATOM 34 N N . VAL A 1 5 ? -1.215 6.337 26.536 1.00 97.71 5 A 1 +ATOM 35 C CA . VAL A 1 5 ? -2.044 6.449 27.741 1.00 97.77 5 A 1 +ATOM 36 C C . VAL A 1 5 ? -3.460 6.827 27.342 1.00 97.94 5 A 1 +ATOM 37 O O . VAL A 1 5 ? -3.723 7.949 26.915 1.00 97.12 5 A 1 +ATOM 38 C CB . VAL A 1 5 ? -1.468 7.464 28.745 1.00 96.95 5 A 1 +ATOM 39 C CG1 . VAL A 1 5 ? -2.315 7.514 30.019 1.00 92.99 5 A 1 +ATOM 40 C CG2 . VAL A 1 5 ? -0.040 7.107 29.152 1.00 93.31 5 A 1 +ATOM 41 N N . GLU A 1 6 ? -4.388 5.893 27.501 1.00 97.62 6 A 1 +ATOM 42 C CA . GLU A 1 6 ? -5.807 6.133 27.294 1.00 97.69 6 A 1 +ATOM 43 C C . GLU A 1 6 ? -6.445 6.832 28.493 1.00 97.69 6 A 1 +ATOM 44 O O . GLU A 1 6 ? -6.085 6.630 29.649 1.00 96.61 6 A 1 +ATOM 45 C CB . GLU A 1 6 ? -6.572 4.837 26.975 1.00 96.34 6 A 1 +ATOM 46 C CG . GLU A 1 6 ? -6.041 4.065 25.762 1.00 93.72 6 A 1 +ATOM 47 C CD . GLU A 1 6 ? -4.980 3.023 26.134 1.00 96.40 6 A 1 +ATOM 48 O OE1 . GLU A 1 6 ? -4.877 2.021 25.398 1.00 92.33 6 A 1 +ATOM 49 O OE2 . GLU A 1 6 ? -4.296 3.165 27.159 1.00 93.47 6 A 1 +ATOM 50 N N . SER A 1 7 ? -7.455 7.657 28.196 1.00 97.68 7 A 1 +ATOM 51 C CA . SER A 1 7 ? -8.262 8.343 29.201 1.00 97.50 7 A 1 +ATOM 52 C C . SER A 1 7 ? -9.668 8.633 28.674 1.00 97.77 7 A 1 +ATOM 53 O O . SER A 1 7 ? -9.949 8.473 27.486 1.00 96.66 7 A 1 +ATOM 54 C CB . SER A 1 7 ? -7.557 9.625 29.653 1.00 96.23 7 A 1 +ATOM 55 O OG . SER A 1 7 ? -7.354 10.503 28.562 1.00 91.51 7 A 1 +ATOM 56 N N . GLY A 1 8 ? -10.569 9.078 29.537 1.00 97.17 8 A 1 +ATOM 57 C CA . GLY A 1 8 ? -11.934 9.467 29.175 1.00 96.98 8 A 1 +ATOM 58 C C . GLY A 1 8 ? -12.970 8.346 29.292 1.00 97.13 8 A 1 +ATOM 59 O O . GLY A 1 8 ? -14.138 8.595 29.012 1.00 94.30 8 A 1 +ATOM 60 N N . GLY A 1 9 ? -12.581 7.159 29.713 1.00 97.07 9 A 1 +ATOM 61 C CA . GLY A 1 9 ? -13.521 6.099 30.067 1.00 96.97 9 A 1 +ATOM 62 C C . GLY A 1 9 ? -14.414 6.476 31.256 1.00 96.96 9 A 1 +ATOM 63 O O . GLY A 1 9 ? -14.163 7.446 31.972 1.00 94.31 9 A 1 +ATOM 64 N N . GLY A 1 10 ? -15.489 5.718 31.451 1.00 96.57 10 A 1 +ATOM 65 C CA . GLY A 1 10 ? -16.437 5.961 32.529 1.00 96.35 10 A 1 +ATOM 66 C C . GLY A 1 10 ? -17.768 5.246 32.338 1.00 97.34 10 A 1 +ATOM 67 O O . GLY A 1 10 ? -17.935 4.429 31.435 1.00 96.15 10 A 1 +ATOM 68 N N . LEU A 1 11 ? -18.717 5.580 33.206 1.00 96.90 11 A 1 +ATOM 69 C CA . LEU A 1 11 ? -20.093 5.098 33.133 1.00 97.04 11 A 1 +ATOM 70 C C . LEU A 1 11 ? -20.933 6.053 32.289 1.00 97.09 11 A 1 +ATOM 71 O O . LEU A 1 11 ? -20.924 7.264 32.522 1.00 95.05 11 A 1 +ATOM 72 C CB . LEU A 1 11 ? -20.641 4.955 34.564 1.00 95.54 11 A 1 +ATOM 73 C CG . LEU A 1 11 ? -22.084 4.402 34.638 1.00 89.08 11 A 1 +ATOM 74 C CD1 . LEU A 1 11 ? -22.166 2.949 34.183 1.00 80.35 11 A 1 +ATOM 75 C CD2 . LEU A 1 11 ? -22.580 4.464 36.084 1.00 80.58 11 A 1 +ATOM 76 N N . VAL A 1 12 ? -21.683 5.512 31.329 1.00 97.48 12 A 1 +ATOM 77 C CA . VAL A 1 12 ? -22.562 6.263 30.429 1.00 97.37 12 A 1 +ATOM 78 C C . VAL A 1 12 ? -23.875 5.509 30.266 1.00 97.67 12 A 1 +ATOM 79 O O . VAL A 1 12 ? -23.897 4.278 30.241 1.00 96.39 12 A 1 +ATOM 80 C CB . VAL A 1 12 ? -21.877 6.500 29.068 1.00 95.40 12 A 1 +ATOM 81 C CG1 . VAL A 1 12 ? -22.766 7.219 28.062 1.00 84.31 12 A 1 +ATOM 82 C CG2 . VAL A 1 12 ? -20.637 7.380 29.243 1.00 83.46 12 A 1 +ATOM 83 N N . GLN A 1 13 ? -24.979 6.239 30.132 1.00 97.16 13 A 1 +ATOM 84 C CA . GLN A 1 13 ? -26.278 5.634 29.850 1.00 96.91 13 A 1 +ATOM 85 C C . GLN A 1 13 ? -26.396 5.237 28.369 1.00 97.35 13 A 1 +ATOM 86 O O . GLN A 1 13 ? -25.810 5.894 27.504 1.00 96.48 13 A 1 +ATOM 87 C CB . GLN A 1 13 ? -27.404 6.592 30.246 1.00 95.38 13 A 1 +ATOM 88 C CG . GLN A 1 13 ? -27.494 6.755 31.772 1.00 87.73 13 A 1 +ATOM 89 C CD . GLN A 1 13 ? -28.687 7.612 32.209 1.00 81.17 13 A 1 +ATOM 90 O OE1 . GLN A 1 13 ? -29.308 8.317 31.435 1.00 71.47 13 A 1 +ATOM 91 N NE2 . GLN A 1 13 ? -29.039 7.585 33.469 1.00 67.27 13 A 1 +ATOM 92 N N . PRO A 1 14 ? -27.197 4.204 28.037 1.00 97.53 14 A 1 +ATOM 93 C CA . PRO A 1 14 ? -27.536 3.885 26.663 1.00 97.58 14 A 1 +ATOM 94 C C . PRO A 1 14 ? -28.059 5.106 25.897 1.00 97.51 14 A 1 +ATOM 95 O O . PRO A 1 14 ? -28.847 5.888 26.421 1.00 96.09 14 A 1 +ATOM 96 C CB . PRO A 1 14 ? -28.597 2.779 26.746 1.00 96.70 14 A 1 +ATOM 97 C CG . PRO A 1 14 ? -28.306 2.113 28.086 1.00 94.82 14 A 1 +ATOM 98 C CD . PRO A 1 14 ? -27.842 3.279 28.957 1.00 96.97 14 A 1 +ATOM 99 N N . GLY A 1 15 ? -27.599 5.291 24.662 1.00 97.21 15 A 1 +ATOM 100 C CA . GLY A 1 15 ? -27.867 6.471 23.838 1.00 97.05 15 A 1 +ATOM 101 C C . GLY A 1 15 ? -26.940 7.662 24.103 1.00 97.33 15 A 1 +ATOM 102 O O . GLY A 1 15 ? -26.887 8.577 23.284 1.00 95.34 15 A 1 +ATOM 103 N N . GLY A 1 16 ? -26.173 7.636 25.183 1.00 97.02 16 A 1 +ATOM 104 C CA . GLY A 1 16 ? -25.214 8.665 25.530 1.00 96.81 16 A 1 +ATOM 105 C C . GLY A 1 16 ? -24.007 8.744 24.598 1.00 97.41 16 A 1 +ATOM 106 O O . GLY A 1 16 ? -23.847 7.955 23.659 1.00 96.62 16 A 1 +ATOM 107 N N . SER A 1 17 ? -23.160 9.721 24.900 1.00 97.40 17 A 1 +ATOM 108 C CA . SER A 1 17 ? -21.909 9.947 24.171 1.00 97.47 17 A 1 +ATOM 109 C C . SER A 1 17 ? -20.726 10.038 25.128 1.00 97.43 17 A 1 +ATOM 110 O O . SER A 1 17 ? -20.855 10.523 26.248 1.00 96.01 17 A 1 +ATOM 111 C CB . SER A 1 17 ? -21.988 11.212 23.318 1.00 96.21 17 A 1 +ATOM 112 O OG . SER A 1 17 ? -22.995 11.084 22.324 1.00 87.16 17 A 1 +ATOM 113 N N . LEU A 1 18 ? -19.562 9.609 24.670 1.00 97.47 18 A 1 +ATOM 114 C CA . LEU A 1 18 ? -18.313 9.674 25.413 1.00 97.31 18 A 1 +ATOM 115 C C . LEU A 1 18 ? -17.163 9.930 24.447 1.00 97.94 18 A 1 +ATOM 116 O O . LEU A 1 18 ? -17.182 9.453 23.313 1.00 97.21 18 A 1 +ATOM 117 C CB . LEU A 1 18 ? -18.138 8.360 26.185 1.00 95.45 18 A 1 +ATOM 118 C CG . LEU A 1 18 ? -17.042 8.382 27.254 1.00 90.70 18 A 1 +ATOM 119 C CD1 . LEU A 1 18 ? -17.418 9.269 28.443 1.00 86.07 18 A 1 +ATOM 120 C CD2 . LEU A 1 18 ? -16.818 6.970 27.784 1.00 86.32 18 A 1 +ATOM 121 N N . ARG A 1 19 ? -16.135 10.666 24.881 1.00 97.95 19 A 1 +ATOM 122 C CA . ARG A 1 19 ? -14.924 10.895 24.093 1.00 98.13 19 A 1 +ATOM 123 C C . ARG A 1 19 ? -13.730 10.285 24.811 1.00 98.26 19 A 1 +ATOM 124 O O . ARG A 1 19 ? -13.372 10.745 25.887 1.00 97.63 19 A 1 +ATOM 125 C CB . ARG A 1 19 ? -14.741 12.394 23.834 1.00 97.47 19 A 1 +ATOM 126 C CG . ARG A 1 19 ? -13.578 12.655 22.857 1.00 94.54 19 A 1 +ATOM 127 C CD . ARG A 1 19 ? -13.436 14.149 22.593 1.00 91.17 19 A 1 +ATOM 128 N NE . ARG A 1 19 ? -12.384 14.430 21.614 1.00 83.10 19 A 1 +ATOM 129 C CZ . ARG A 1 19 ? -11.860 15.615 21.333 1.00 77.04 19 A 1 +ATOM 130 N NH1 . ARG A 1 19 ? -12.251 16.694 21.944 1.00 69.47 19 A 1 +ATOM 131 N NH2 . ARG A 1 19 ? -10.934 15.730 20.432 1.00 70.41 19 A 1 +ATOM 132 N N . LEU A 1 20 ? -13.102 9.315 24.179 1.00 98.29 20 A 1 +ATOM 133 C CA . LEU A 1 20 ? -11.830 8.780 24.634 1.00 98.30 20 A 1 +ATOM 134 C C . LEU A 1 20 ? -10.670 9.579 24.032 1.00 98.40 20 A 1 +ATOM 135 O O . LEU A 1 20 ? -10.768 10.076 22.913 1.00 97.89 20 A 1 +ATOM 136 C CB . LEU A 1 20 ? -11.708 7.287 24.293 1.00 98.21 20 A 1 +ATOM 137 C CG . LEU A 1 20 ? -12.881 6.412 24.763 1.00 97.54 20 A 1 +ATOM 138 C CD1 . LEU A 1 20 ? -12.572 4.948 24.465 1.00 96.32 20 A 1 +ATOM 139 C CD2 . LEU A 1 20 ? -13.153 6.559 26.259 1.00 96.12 20 A 1 +ATOM 140 N N . SER A 1 21 ? -9.588 9.672 24.789 1.00 98.30 21 A 1 +ATOM 141 C CA . SER A 1 21 ? -8.330 10.251 24.348 1.00 98.22 21 A 1 +ATOM 142 C C . SER A 1 21 ? -7.201 9.250 24.581 1.00 98.39 21 A 1 +ATOM 143 O O . SER A 1 21 ? -7.232 8.512 25.565 1.00 97.55 21 A 1 +ATOM 144 C CB . SER A 1 21 ? -8.028 11.556 25.089 1.00 97.47 21 A 1 +ATOM 145 O OG . SER A 1 21 ? -9.088 12.491 24.897 1.00 85.59 21 A 1 +ATOM 146 N N . CYS A 1 22 ? -6.214 9.250 23.692 1.00 98.35 22 A 1 +ATOM 147 C CA . CYS A 1 22 ? -4.976 8.509 23.840 1.00 98.22 22 A 1 +ATOM 148 C C . CYS A 1 22 ? -3.818 9.475 23.640 1.00 98.28 22 A 1 +ATOM 149 O O . CYS A 1 22 ? -3.665 10.032 22.551 1.00 97.42 22 A 1 +ATOM 150 C CB . CYS A 1 22 ? -4.968 7.358 22.830 1.00 97.61 22 A 1 +ATOM 151 S SG . CYS A 1 22 ? -3.362 6.535 22.644 1.00 96.76 22 A 1 +ATOM 152 N N . ALA A 1 23 ? -3.031 9.702 24.674 1.00 98.12 23 A 1 +ATOM 153 C CA . ALA A 1 23 ? -1.838 10.535 24.616 1.00 98.07 23 A 1 +ATOM 154 C C . ALA A 1 23 ? -0.624 9.670 24.266 1.00 98.01 23 A 1 +ATOM 155 O O . ALA A 1 23 ? -0.336 8.697 24.955 1.00 97.27 23 A 1 +ATOM 156 C CB . ALA A 1 23 ? -1.678 11.265 25.951 1.00 97.64 23 A 1 +ATOM 157 N N . ALA A 1 24 ? 0.073 10.031 23.193 1.00 97.79 24 A 1 +ATOM 158 C CA . ALA A 1 24 ? 1.248 9.340 22.700 1.00 97.56 24 A 1 +ATOM 159 C C . ALA A 1 24 ? 2.529 10.118 23.052 1.00 97.60 24 A 1 +ATOM 160 O O . ALA A 1 24 ? 2.566 11.345 22.998 1.00 96.70 24 A 1 +ATOM 161 C CB . ALA A 1 24 ? 1.089 9.129 21.196 1.00 96.56 24 A 1 +ATOM 162 N N . SER A 1 25 ? 3.600 9.401 23.369 1.00 97.11 25 A 1 +ATOM 163 C CA . SER A 1 25 ? 4.914 9.998 23.620 1.00 96.78 25 A 1 +ATOM 164 C C . SER A 1 25 ? 6.056 9.065 23.230 1.00 96.39 25 A 1 +ATOM 165 O O . SER A 1 25 ? 5.872 7.859 23.055 1.00 94.68 25 A 1 +ATOM 166 C CB . SER A 1 25 ? 5.027 10.435 25.094 1.00 95.98 25 A 1 +ATOM 167 O OG . SER A 1 25 ? 4.905 9.327 25.963 1.00 89.49 25 A 1 +ATOM 168 N N . GLY A 1 26 ? 7.257 9.631 23.058 1.00 95.22 26 A 1 +ATOM 169 C CA . GLY A 1 26 ? 8.472 8.865 22.779 1.00 94.25 26 A 1 +ATOM 170 C C . GLY A 1 26 ? 8.678 8.450 21.322 1.00 93.82 26 A 1 +ATOM 171 O O . GLY A 1 26 ? 9.593 7.672 21.044 1.00 91.11 26 A 1 +ATOM 172 N N . PHE A 1 27 ? 7.866 8.959 20.388 1.00 93.25 27 A 1 +ATOM 173 C CA . PHE A 1 27 ? 8.013 8.730 18.946 1.00 92.61 27 A 1 +ATOM 174 C C . PHE A 1 27 ? 7.377 9.864 18.135 1.00 92.44 27 A 1 +ATOM 175 O O . PHE A 1 27 ? 6.574 10.632 18.656 1.00 91.52 27 A 1 +ATOM 176 C CB . PHE A 1 27 ? 7.409 7.375 18.558 1.00 92.33 27 A 1 +ATOM 177 C CG . PHE A 1 27 ? 5.899 7.268 18.721 1.00 92.55 27 A 1 +ATOM 178 C CD1 . PHE A 1 27 ? 5.335 7.007 19.976 1.00 92.24 27 A 1 +ATOM 179 C CD2 . PHE A 1 27 ? 5.062 7.384 17.597 1.00 92.35 27 A 1 +ATOM 180 C CE1 . PHE A 1 27 ? 3.939 6.856 20.114 1.00 91.68 27 A 1 +ATOM 181 C CE2 . PHE A 1 27 ? 3.674 7.234 17.729 1.00 91.59 27 A 1 +ATOM 182 C CZ . PHE A 1 27 ? 3.113 6.968 18.991 1.00 92.59 27 A 1 +ATOM 183 N N . THR A 1 28 ? 7.701 9.956 16.843 1.00 91.96 28 A 1 +ATOM 184 C CA . THR A 1 28 ? 7.109 10.929 15.917 1.00 90.79 28 A 1 +ATOM 185 C C . THR A 1 28 ? 5.689 10.487 15.559 1.00 90.70 28 A 1 +ATOM 186 O O . THR A 1 28 ? 5.480 9.715 14.635 1.00 89.96 28 A 1 +ATOM 187 C CB . THR A 1 28 ? 7.961 11.089 14.655 1.00 89.34 28 A 1 +ATOM 188 O OG1 . THR A 1 28 ? 9.306 11.309 15.012 1.00 84.38 28 A 1 +ATOM 189 C CG2 . THR A 1 28 ? 7.521 12.302 13.835 1.00 83.68 28 A 1 +ATOM 190 N N . PHE A 1 29 ? 4.706 10.985 16.298 1.00 93.06 29 A 1 +ATOM 191 C CA . PHE A 1 29 ? 3.313 10.533 16.211 1.00 93.98 29 A 1 +ATOM 192 C C . PHE A 1 29 ? 2.711 10.625 14.798 1.00 93.11 29 A 1 +ATOM 193 O O . PHE A 1 29 ? 1.965 9.743 14.395 1.00 91.82 29 A 1 +ATOM 194 C CB . PHE A 1 29 ? 2.492 11.357 17.208 1.00 94.54 29 A 1 +ATOM 195 C CG . PHE A 1 29 ? 1.030 10.973 17.283 1.00 95.55 29 A 1 +ATOM 196 C CD1 . PHE A 1 29 ? 0.034 11.880 16.874 1.00 93.92 29 A 1 +ATOM 197 C CD2 . PHE A 1 29 ? 0.653 9.726 17.801 1.00 94.19 29 A 1 +ATOM 198 C CE1 . PHE A 1 29 ? -1.317 11.547 16.991 1.00 94.26 29 A 1 +ATOM 199 C CE2 . PHE A 1 29 ? -0.705 9.388 17.925 1.00 94.04 29 A 1 +ATOM 200 C CZ . PHE A 1 29 ? -1.693 10.301 17.524 1.00 95.85 29 A 1 +ATOM 201 N N . SER A 1 30 ? 3.066 11.653 14.023 1.00 92.02 30 A 1 +ATOM 202 C CA . SER A 1 30 ? 2.571 11.875 12.660 1.00 90.25 30 A 1 +ATOM 203 C C . SER A 1 30 ? 2.950 10.784 11.659 1.00 88.76 30 A 1 +ATOM 204 O O . SER A 1 30 ? 2.280 10.656 10.639 1.00 86.77 30 A 1 +ATOM 205 C CB . SER A 1 30 ? 3.089 13.220 12.131 1.00 89.73 30 A 1 +ATOM 206 O OG . SER A 1 30 ? 4.496 13.288 12.183 1.00 86.17 30 A 1 +ATOM 207 N N . ASP A 1 31 ? 3.982 9.995 11.936 1.00 86.47 31 A 1 +ATOM 208 C CA . ASP A 1 31 ? 4.495 8.987 11.008 1.00 83.04 31 A 1 +ATOM 209 C C . ASP A 1 31 ? 3.770 7.641 11.146 1.00 82.57 31 A 1 +ATOM 210 O O . ASP A 1 31 ? 3.855 6.789 10.262 1.00 81.41 31 A 1 +ATOM 211 C CB . ASP A 1 31 ? 6.007 8.823 11.211 1.00 81.43 31 A 1 +ATOM 212 C CG . ASP A 1 31 ? 6.812 10.099 10.956 1.00 77.81 31 A 1 +ATOM 213 O OD1 . ASP A 1 31 ? 6.256 11.068 10.391 1.00 73.85 31 A 1 +ATOM 214 O OD2 . ASP A 1 31 ? 7.987 10.128 11.374 1.00 72.76 31 A 1 +ATOM 215 N N . PHE A 1 32 ? 3.039 7.447 12.245 1.00 87.23 32 A 1 +ATOM 216 C CA . PHE A 1 32 ? 2.412 6.174 12.584 1.00 88.11 32 A 1 +ATOM 217 C C . PHE A 1 32 ? 0.908 6.177 12.325 1.00 89.18 32 A 1 +ATOM 218 O O . PHE A 1 32 ? 0.211 7.186 12.470 1.00 88.77 32 A 1 +ATOM 219 C CB . PHE A 1 32 ? 2.729 5.804 14.031 1.00 87.64 32 A 1 +ATOM 220 C CG . PHE A 1 32 ? 4.187 5.438 14.246 1.00 86.31 32 A 1 +ATOM 221 C CD1 . PHE A 1 32 ? 4.583 4.097 14.312 1.00 83.17 32 A 1 +ATOM 222 C CD2 . PHE A 1 32 ? 5.161 6.446 14.351 1.00 83.02 32 A 1 +ATOM 223 C CE1 . PHE A 1 32 ? 5.938 3.759 14.486 1.00 81.18 32 A 1 +ATOM 224 C CE2 . PHE A 1 32 ? 6.513 6.117 14.514 1.00 80.89 32 A 1 +ATOM 225 C CZ . PHE A 1 32 ? 6.904 4.773 14.585 1.00 82.80 32 A 1 +ATOM 226 N N . TYR A 1 33 ? 0.377 4.989 12.002 1.00 88.36 33 A 1 +ATOM 227 C CA . TYR A 1 33 ? -1.039 4.706 12.102 1.00 88.66 33 A 1 +ATOM 228 C C . TYR A 1 33 ? -1.396 4.513 13.574 1.00 90.40 33 A 1 +ATOM 229 O O . TYR A 1 33 ? -0.579 4.053 14.376 1.00 90.57 33 A 1 +ATOM 230 C CB . TYR A 1 33 ? -1.402 3.467 11.287 1.00 85.91 33 A 1 +ATOM 231 C CG . TYR A 1 33 ? -1.507 3.679 9.792 1.00 82.79 33 A 1 +ATOM 232 C CD1 . TYR A 1 33 ? -2.600 3.128 9.104 1.00 76.24 33 A 1 +ATOM 233 C CD2 . TYR A 1 33 ? -0.531 4.385 9.077 1.00 75.74 33 A 1 +ATOM 234 C CE1 . TYR A 1 33 ? -2.705 3.269 7.710 1.00 72.47 33 A 1 +ATOM 235 C CE2 . TYR A 1 33 ? -0.635 4.534 7.684 1.00 72.48 33 A 1 +ATOM 236 C CZ . TYR A 1 33 ? -1.721 3.963 7.000 1.00 74.02 33 A 1 +ATOM 237 O OH . TYR A 1 33 ? -1.810 4.078 5.644 1.00 70.15 33 A 1 +ATOM 238 N N . MET A 1 34 ? -2.629 4.842 13.917 1.00 93.46 34 A 1 +ATOM 239 C CA . MET A 1 34 ? -3.158 4.632 15.251 1.00 94.61 34 A 1 +ATOM 240 C C . MET A 1 34 ? -4.458 3.843 15.173 1.00 94.89 34 A 1 +ATOM 241 O O . MET A 1 34 ? -5.323 4.139 14.349 1.00 94.36 34 A 1 +ATOM 242 C CB . MET A 1 34 ? -3.369 5.970 15.953 1.00 95.27 34 A 1 +ATOM 243 C CG . MET A 1 34 ? -2.063 6.741 16.203 1.00 94.21 34 A 1 +ATOM 244 S SD . MET A 1 34 ? -0.828 5.926 17.257 1.00 93.83 34 A 1 +ATOM 245 C CE . MET A 1 34 ? -1.756 5.705 18.782 1.00 89.03 34 A 1 +ATOM 246 N N . GLU A 1 35 ? -4.594 2.872 16.056 1.00 95.64 35 A 1 +ATOM 247 C CA . GLU A 1 35 ? -5.672 1.896 16.072 1.00 95.89 35 A 1 +ATOM 248 C C . GLU A 1 35 ? -6.445 1.996 17.391 1.00 97.29 35 A 1 +ATOM 249 O O . GLU A 1 35 ? -5.859 2.190 18.455 1.00 97.19 35 A 1 +ATOM 250 C CB . GLU A 1 35 ? -5.087 0.483 15.917 1.00 94.20 35 A 1 +ATOM 251 C CG . GLU A 1 35 ? -4.089 0.279 14.754 1.00 91.34 35 A 1 +ATOM 252 C CD . GLU A 1 35 ? -4.698 0.361 13.352 1.00 89.26 35 A 1 +ATOM 253 O OE1 . GLU A 1 35 ? -3.936 0.587 12.395 1.00 84.16 35 A 1 +ATOM 254 O OE2 . GLU A 1 35 ? -5.923 0.146 13.218 1.00 83.83 35 A 1 +ATOM 255 N N . TRP A 1 36 ? -7.765 1.805 17.318 1.00 97.27 36 A 1 +ATOM 256 C CA . TRP A 1 36 ? -8.590 1.515 18.475 1.00 97.94 36 A 1 +ATOM 257 C C . TRP A 1 36 ? -9.029 0.058 18.434 1.00 97.75 36 A 1 +ATOM 258 O O . TRP A 1 36 ? -9.640 -0.395 17.463 1.00 97.31 36 A 1 +ATOM 259 C CB . TRP A 1 36 ? -9.779 2.466 18.546 1.00 98.30 36 A 1 +ATOM 260 C CG . TRP A 1 36 ? -9.448 3.854 18.990 1.00 98.44 36 A 1 +ATOM 261 C CD1 . TRP A 1 36 ? -9.376 4.940 18.191 1.00 97.99 36 A 1 +ATOM 262 C CD2 . TRP A 1 36 ? -9.139 4.321 20.347 1.00 98.43 36 A 1 +ATOM 263 N NE1 . TRP A 1 36 ? -9.059 6.059 18.951 1.00 98.11 36 A 1 +ATOM 264 C CE2 . TRP A 1 36 ? -8.906 5.720 20.280 1.00 98.29 36 A 1 +ATOM 265 C CE3 . TRP A 1 36 ? -9.043 3.696 21.603 1.00 98.37 36 A 1 +ATOM 266 C CZ2 . TRP A 1 36 ? -8.587 6.481 21.423 1.00 98.18 36 A 1 +ATOM 267 C CZ3 . TRP A 1 36 ? -8.722 4.454 22.749 1.00 98.09 36 A 1 +ATOM 268 C CH2 . TRP A 1 36 ? -8.496 5.826 22.661 1.00 98.01 36 A 1 +ATOM 269 N N . VAL A 1 37 ? -8.759 -0.667 19.520 1.00 98.20 37 A 1 +ATOM 270 C CA . VAL A 1 37 ? -9.177 -2.055 19.736 1.00 98.27 37 A 1 +ATOM 271 C C . VAL A 1 37 ? -9.936 -2.120 21.046 1.00 98.49 37 A 1 +ATOM 272 O O . VAL A 1 37 ? -9.529 -1.505 22.021 1.00 98.14 37 A 1 +ATOM 273 C CB . VAL A 1 37 ? -7.965 -3.006 19.741 1.00 97.85 37 A 1 +ATOM 274 C CG1 . VAL A 1 37 ? -8.379 -4.464 19.963 1.00 96.13 37 A 1 +ATOM 275 C CG2 . VAL A 1 37 ? -7.196 -2.933 18.422 1.00 96.06 37 A 1 +ATOM 276 N N . ARG A 1 38 ? -11.034 -2.860 21.087 1.00 98.54 38 A 1 +ATOM 277 C CA . ARG A 1 38 ? -11.773 -3.049 22.343 1.00 98.58 38 A 1 +ATOM 278 C C . ARG A 1 38 ? -11.855 -4.509 22.750 1.00 98.45 38 A 1 +ATOM 279 O O . ARG A 1 38 ? -11.710 -5.404 21.935 1.00 97.93 38 A 1 +ATOM 280 C CB . ARG A 1 38 ? -13.141 -2.358 22.274 1.00 98.04 38 A 1 +ATOM 281 C CG . ARG A 1 38 ? -14.140 -3.085 21.360 1.00 97.86 38 A 1 +ATOM 282 C CD . ARG A 1 38 ? -15.458 -2.314 21.337 1.00 97.32 38 A 1 +ATOM 283 N NE . ARG A 1 38 ? -16.440 -2.977 20.487 1.00 97.17 38 A 1 +ATOM 284 C CZ . ARG A 1 38 ? -17.644 -2.532 20.197 1.00 97.31 38 A 1 +ATOM 285 N NH1 . ARG A 1 38 ? -18.103 -1.409 20.672 1.00 95.78 38 A 1 +ATOM 286 N NH2 . ARG A 1 38 ? -18.405 -3.225 19.399 1.00 95.59 38 A 1 +ATOM 287 N N . GLN A 1 39 ? -12.135 -4.731 24.022 1.00 98.14 39 A 1 +ATOM 288 C CA . GLN A 1 39 ? -12.334 -6.056 24.582 1.00 98.01 39 A 1 +ATOM 289 C C . GLN A 1 39 ? -13.483 -6.039 25.586 1.00 98.07 39 A 1 +ATOM 290 O O . GLN A 1 39 ? -13.350 -5.489 26.679 1.00 97.32 39 A 1 +ATOM 291 C CB . GLN A 1 39 ? -11.019 -6.524 25.206 1.00 97.68 39 A 1 +ATOM 292 C CG . GLN A 1 39 ? -11.075 -7.988 25.635 1.00 97.01 39 A 1 +ATOM 293 C CD . GLN A 1 39 ? -9.725 -8.494 26.094 1.00 97.28 39 A 1 +ATOM 294 O OE1 . GLN A 1 39 ? -8.902 -7.774 26.647 1.00 93.21 39 A 1 +ATOM 295 N NE2 . GLN A 1 39 ? -9.428 -9.758 25.866 1.00 92.06 39 A 1 +ATOM 296 N N . ALA A 1 40 ? -14.600 -6.624 25.198 1.00 97.56 40 A 1 +ATOM 297 C CA . ALA A 1 40 ? -15.720 -6.797 26.103 1.00 97.44 40 A 1 +ATOM 298 C C . ALA A 1 40 ? -15.349 -7.762 27.250 1.00 97.23 40 A 1 +ATOM 299 O O . ALA A 1 40 ? -14.520 -8.654 27.051 1.00 96.04 40 A 1 +ATOM 300 C CB . ALA A 1 40 ? -16.937 -7.287 25.310 1.00 96.96 40 A 1 +ATOM 301 N N . PRO A 1 41 ? -15.961 -7.634 28.433 1.00 96.38 41 A 1 +ATOM 302 C CA . PRO A 1 41 ? -15.647 -8.497 29.569 1.00 95.70 41 A 1 +ATOM 303 C C . PRO A 1 41 ? -15.757 -9.988 29.220 1.00 95.37 41 A 1 +ATOM 304 O O . PRO A 1 41 ? -16.790 -10.464 28.736 1.00 92.73 41 A 1 +ATOM 305 C CB . PRO A 1 41 ? -16.628 -8.087 30.674 1.00 94.55 41 A 1 +ATOM 306 C CG . PRO A 1 41 ? -16.942 -6.637 30.352 1.00 92.48 41 A 1 +ATOM 307 C CD . PRO A 1 41 ? -16.924 -6.610 28.823 1.00 95.44 41 A 1 +ATOM 308 N N . GLY A 1 42 ? -14.678 -10.737 29.444 1.00 93.53 42 A 1 +ATOM 309 C CA . GLY A 1 42 ? -14.610 -12.169 29.145 1.00 92.92 42 A 1 +ATOM 310 C C . GLY A 1 42 ? -14.660 -12.542 27.658 1.00 94.19 42 A 1 +ATOM 311 O O . GLY A 1 42 ? -14.864 -13.708 27.329 1.00 91.75 42 A 1 +ATOM 312 N N . LYS A 1 43 ? -14.491 -11.568 26.741 1.00 95.06 43 A 1 +ATOM 313 C CA . LYS A 1 43 ? -14.451 -11.769 25.295 1.00 95.44 43 A 1 +ATOM 314 C C . LYS A 1 43 ? -13.046 -11.541 24.730 1.00 96.10 43 A 1 +ATOM 315 O O . LYS A 1 43 ? -12.124 -11.133 25.438 1.00 94.19 43 A 1 +ATOM 316 C CB . LYS A 1 43 ? -15.516 -10.890 24.609 1.00 94.02 43 A 1 +ATOM 317 C CG . LYS A 1 43 ? -16.961 -11.167 25.051 1.00 89.34 43 A 1 +ATOM 318 C CD . LYS A 1 43 ? -17.437 -12.575 24.669 1.00 80.02 43 A 1 +ATOM 319 C CE . LYS A 1 43 ? -18.919 -12.733 25.030 1.00 71.90 43 A 1 +ATOM 320 N NZ . LYS A 1 43 ? -19.445 -14.057 24.622 1.00 63.45 43 A 1 +ATOM 321 N N . GLY A 1 44 ? -12.901 -11.855 23.443 1.00 96.09 44 A 1 +ATOM 322 C CA . GLY A 1 44 ? -11.682 -11.600 22.691 1.00 96.43 44 A 1 +ATOM 323 C C . GLY A 1 44 ? -11.519 -10.131 22.288 1.00 97.38 44 A 1 +ATOM 324 O O . GLY A 1 44 ? -12.336 -9.277 22.619 1.00 96.40 44 A 1 +ATOM 325 N N . LEU A 1 45 ? -10.453 -9.864 21.549 1.00 97.66 45 A 1 +ATOM 326 C CA . LEU A 1 45 ? -10.145 -8.549 20.999 1.00 97.72 45 A 1 +ATOM 327 C C . LEU A 1 45 ? -11.009 -8.274 19.760 1.00 97.57 45 A 1 +ATOM 328 O O . LEU A 1 45 ? -11.190 -9.144 18.918 1.00 96.83 45 A 1 +ATOM 329 C CB . LEU A 1 45 ? -8.650 -8.479 20.660 1.00 97.71 45 A 1 +ATOM 330 C CG . LEU A 1 45 ? -7.700 -8.675 21.866 1.00 97.21 45 A 1 +ATOM 331 C CD1 . LEU A 1 45 ? -6.260 -8.754 21.382 1.00 96.20 45 A 1 +ATOM 332 C CD2 . LEU A 1 45 ? -7.816 -7.536 22.871 1.00 95.81 45 A 1 +ATOM 333 N N . GLU A 1 46 ? -11.484 -7.036 19.624 1.00 97.77 46 A 1 +ATOM 334 C CA . GLU A 1 46 ? -12.204 -6.536 18.465 1.00 97.67 46 A 1 +ATOM 335 C C . GLU A 1 46 ? -11.553 -5.236 17.989 1.00 97.79 46 A 1 +ATOM 336 O O . GLU A 1 46 ? -11.572 -4.227 18.694 1.00 97.24 46 A 1 +ATOM 337 C CB . GLU A 1 46 ? -13.692 -6.329 18.820 1.00 97.14 46 A 1 +ATOM 338 C CG . GLU A 1 46 ? -14.556 -5.890 17.619 1.00 95.20 46 A 1 +ATOM 339 C CD . GLU A 1 46 ? -15.963 -5.383 17.999 1.00 94.75 46 A 1 +ATOM 340 O OE1 . GLU A 1 46 ? -16.710 -4.936 17.093 1.00 88.69 46 A 1 +ATOM 341 O OE2 . GLU A 1 46 ? -16.310 -5.334 19.195 1.00 90.99 46 A 1 +ATOM 342 N N . TRP A 1 47 ? -11.001 -5.241 16.774 1.00 97.19 47 A 1 +ATOM 343 C CA . TRP A 1 47 ? -10.572 -4.003 16.126 1.00 96.58 47 A 1 +ATOM 344 C C . TRP A 1 47 ? -11.802 -3.189 15.723 1.00 96.78 47 A 1 +ATOM 345 O O . TRP A 1 47 ? -12.733 -3.723 15.115 1.00 95.98 47 A 1 +ATOM 346 C CB . TRP A 1 47 ? -9.688 -4.317 14.927 1.00 95.24 47 A 1 +ATOM 347 C CG . TRP A 1 47 ? -9.299 -3.107 14.133 1.00 94.01 47 A 1 +ATOM 348 C CD1 . TRP A 1 47 ? -8.193 -2.349 14.331 1.00 92.45 47 A 1 +ATOM 349 C CD2 . TRP A 1 47 ? -10.023 -2.481 13.032 1.00 92.94 47 A 1 +ATOM 350 N NE1 . TRP A 1 47 ? -8.183 -1.307 13.421 1.00 91.60 47 A 1 +ATOM 351 C CE2 . TRP A 1 47 ? -9.287 -1.354 12.611 1.00 91.81 47 A 1 +ATOM 352 C CE3 . TRP A 1 47 ? -11.223 -2.782 12.355 1.00 91.04 47 A 1 +ATOM 353 C CZ2 . TRP A 1 47 ? -9.727 -0.523 11.552 1.00 89.25 47 A 1 +ATOM 354 C CZ3 . TRP A 1 47 ? -11.663 -1.955 11.300 1.00 90.10 47 A 1 +ATOM 355 C CH2 . TRP A 1 47 ? -10.920 -0.840 10.910 1.00 89.69 47 A 1 +ATOM 356 N N . ILE A 1 48 ? -11.826 -1.895 16.041 1.00 97.02 48 A 1 +ATOM 357 C CA . ILE A 1 48 ? -12.989 -1.042 15.790 1.00 96.78 48 A 1 +ATOM 358 C C . ILE A 1 48 ? -12.730 0.139 14.861 1.00 96.59 48 A 1 +ATOM 359 O O . ILE A 1 48 ? -13.624 0.506 14.107 1.00 95.30 48 A 1 +ATOM 360 C CB . ILE A 1 48 ? -13.640 -0.569 17.109 1.00 95.50 48 A 1 +ATOM 361 C CG1 . ILE A 1 48 ? -12.675 0.214 18.016 1.00 90.10 48 A 1 +ATOM 362 C CG2 . ILE A 1 48 ? -14.240 -1.786 17.848 1.00 85.24 48 A 1 +ATOM 363 C CD1 . ILE A 1 48 ? -13.392 0.966 19.132 1.00 86.97 48 A 1 +ATOM 364 N N . ALA A 1 49 ? -11.542 0.744 14.898 1.00 96.49 49 A 1 +ATOM 365 C CA . ALA A 1 49 ? -11.236 1.903 14.071 1.00 96.23 49 A 1 +ATOM 366 C C . ALA A 1 49 ? -9.731 2.097 13.889 1.00 95.75 49 A 1 +ATOM 367 O O . ALA A 1 49 ? -8.937 1.722 14.751 1.00 94.76 49 A 1 +ATOM 368 C CB . ALA A 1 49 ? -11.871 3.152 14.695 1.00 96.09 49 A 1 +ATOM 369 N N . ALA A 1 50 ? -9.355 2.779 12.797 1.00 94.48 50 A 1 +ATOM 370 C CA . ALA A 1 50 ? -8.004 3.237 12.548 1.00 93.55 50 A 1 +ATOM 371 C C . ALA A 1 50 ? -7.976 4.680 12.045 1.00 93.91 50 A 1 +ATOM 372 O O . ALA A 1 50 ? -8.870 5.117 11.318 1.00 93.29 50 A 1 +ATOM 373 C CB . ALA A 1 50 ? -7.325 2.306 11.539 1.00 91.13 50 A 1 +ATOM 374 N N . SER A 1 51 ? -6.924 5.410 12.388 1.00 93.59 51 A 1 +ATOM 375 C CA . SER A 1 51 ? -6.514 6.660 11.758 1.00 93.14 51 A 1 +ATOM 376 C C . SER A 1 51 ? -5.178 6.445 11.070 1.00 91.52 51 A 1 +ATOM 377 O O . SER A 1 51 ? -4.191 6.100 11.725 1.00 89.60 51 A 1 +ATOM 378 C CB . SER A 1 51 ? -6.400 7.772 12.804 1.00 93.52 51 A 1 +ATOM 379 O OG . SER A 1 51 ? -5.979 8.976 12.205 1.00 88.91 51 A 1 +ATOM 380 N N . ARG A 1 52 ? -5.128 6.688 9.763 1.00 88.12 52 A 1 +ATOM 381 C CA . ARG A 1 52 ? -3.875 6.709 9.007 1.00 86.49 52 A 1 +ATOM 382 C C . ARG A 1 52 ? -2.996 7.880 9.439 1.00 86.64 52 A 1 +ATOM 383 O O . ARG A 1 52 ? -3.442 8.791 10.148 1.00 86.30 52 A 1 +ATOM 384 C CB . ARG A 1 52 ? -4.168 6.720 7.493 1.00 84.35 52 A 1 +ATOM 385 C CG . ARG A 1 52 ? -4.857 5.429 7.008 1.00 80.18 52 A 1 +ATOM 386 C CD . ARG A 1 52 ? -5.022 5.451 5.498 1.00 78.22 52 A 1 +ATOM 387 N NE . ARG A 1 52 ? -5.594 4.202 4.972 1.00 76.53 52 A 1 +ATOM 388 C CZ . ARG A 1 52 ? -6.878 3.938 4.755 1.00 73.44 52 A 1 +ATOM 389 N NH1 . ARG A 1 52 ? -7.830 4.784 5.011 1.00 66.65 52 A 1 +ATOM 390 N NH2 . ARG A 1 52 ? -7.212 2.788 4.260 1.00 70.14 52 A 1 +ATOM 391 N N . ASN A 1 53 ? -1.739 7.850 9.028 1.00 85.88 53 A 1 +ATOM 392 C CA . ASN A 1 53 ? -0.761 8.887 9.327 1.00 83.50 53 A 1 +ATOM 393 C C . ASN A 1 53 ? -0.951 10.137 8.449 1.00 83.00 53 A 1 +ATOM 394 O O . ASN A 1 53 ? -1.805 10.182 7.566 1.00 81.70 53 A 1 +ATOM 395 C CB . ASN A 1 53 ? 0.653 8.277 9.235 1.00 80.58 53 A 1 +ATOM 396 C CG . ASN A 1 53 ? 1.070 7.858 7.838 1.00 80.80 53 A 1 +ATOM 397 O OD1 . ASN A 1 53 ? 0.366 8.048 6.864 1.00 76.50 53 A 1 +ATOM 398 N ND2 . ASN A 1 53 ? 2.241 7.283 7.716 1.00 76.69 53 A 1 +ATOM 399 N N . LYS A 1 54 ? -0.112 11.153 8.691 1.00 82.63 54 A 1 +ATOM 400 C CA . LYS A 1 54 ? -0.114 12.412 7.936 1.00 82.29 54 A 1 +ATOM 401 C C . LYS A 1 54 ? 0.108 12.204 6.437 1.00 80.04 54 A 1 +ATOM 402 O O . LYS A 1 54 ? -0.577 12.827 5.636 1.00 78.26 54 A 1 +ATOM 403 C CB . LYS A 1 54 ? 0.958 13.335 8.526 1.00 82.82 54 A 1 +ATOM 404 C CG . LYS A 1 54 ? 0.972 14.713 7.846 1.00 81.63 54 A 1 +ATOM 405 C CD . LYS A 1 54 ? 2.057 15.600 8.458 1.00 80.82 54 A 1 +ATOM 406 C CE . LYS A 1 54 ? 2.093 16.944 7.732 1.00 74.92 54 A 1 +ATOM 407 N NZ . LYS A 1 54 ? 3.202 17.788 8.211 1.00 70.09 54 A 1 +ATOM 408 N N . ALA A 1 55 ? 1.010 11.322 6.059 1.00 77.91 55 A 1 +ATOM 409 C CA . ALA A 1 55 ? 1.304 11.025 4.659 1.00 74.46 55 A 1 +ATOM 410 C C . ALA A 1 55 ? 0.097 10.453 3.889 1.00 74.60 55 A 1 +ATOM 411 O O . ALA A 1 55 ? 0.042 10.529 2.669 1.00 73.15 55 A 1 +ATOM 412 C CB . ALA A 1 55 ? 2.493 10.057 4.620 1.00 72.64 55 A 1 +ATOM 413 N N . ASN A 1 56 ? -0.894 9.920 4.595 1.00 74.62 56 A 1 +ATOM 414 C CA . ASN A 1 56 ? -2.143 9.391 4.059 1.00 74.83 56 A 1 +ATOM 415 C C . ASN A 1 56 ? -3.369 10.250 4.428 1.00 77.63 56 A 1 +ATOM 416 O O . ASN A 1 56 ? -4.477 9.727 4.565 1.00 77.66 56 A 1 +ATOM 417 C CB . ASN A 1 56 ? -2.279 7.922 4.483 1.00 73.94 56 A 1 +ATOM 418 C CG . ASN A 1 56 ? -1.242 7.056 3.797 1.00 70.19 56 A 1 +ATOM 419 O OD1 . ASN A 1 56 ? -1.298 6.826 2.602 1.00 64.68 56 A 1 +ATOM 420 N ND2 . ASN A 1 56 ? -0.288 6.548 4.534 1.00 64.04 56 A 1 +ATOM 421 N N . ASP A 1 57 ? -3.163 11.548 4.623 1.00 77.77 57 A 1 +ATOM 422 C CA . ASP A 1 57 ? -4.197 12.572 4.844 1.00 78.92 57 A 1 +ATOM 423 C C . ASP A 1 57 ? -5.138 12.258 6.026 1.00 82.12 57 A 1 +ATOM 424 O O . ASP A 1 57 ? -6.315 12.621 6.023 1.00 81.55 57 A 1 +ATOM 425 C CB . ASP A 1 57 ? -4.968 12.874 3.543 1.00 77.51 57 A 1 +ATOM 426 C CG . ASP A 1 57 ? -4.059 13.001 2.332 1.00 71.78 57 A 1 +ATOM 427 O OD1 . ASP A 1 57 ? -2.965 13.593 2.454 1.00 66.96 57 A 1 +ATOM 428 O OD2 . ASP A 1 57 ? -4.389 12.371 1.299 1.00 64.88 57 A 1 +ATOM 429 N N . TYR A 1 58 ? -4.617 11.556 7.039 1.00 84.41 58 A 1 +ATOM 430 C CA . TYR A 1 58 ? -5.376 11.183 8.233 1.00 87.49 58 A 1 +ATOM 431 C C . TYR A 1 58 ? -6.689 10.428 7.956 1.00 88.51 58 A 1 +ATOM 432 O O . TYR A 1 58 ? -7.615 10.446 8.770 1.00 87.52 58 A 1 +ATOM 433 C CB . TYR A 1 58 ? -5.606 12.427 9.100 1.00 87.86 58 A 1 +ATOM 434 C CG . TYR A 1 58 ? -4.370 13.272 9.319 1.00 87.06 58 A 1 +ATOM 435 C CD1 . TYR A 1 58 ? -3.381 12.842 10.225 1.00 84.50 58 A 1 +ATOM 436 C CD2 . TYR A 1 58 ? -4.197 14.488 8.632 1.00 85.32 58 A 1 +ATOM 437 C CE1 . TYR A 1 58 ? -2.253 13.634 10.475 1.00 84.10 58 A 1 +ATOM 438 C CE2 . TYR A 1 58 ? -3.072 15.291 8.877 1.00 83.67 58 A 1 +ATOM 439 C CZ . TYR A 1 58 ? -2.113 14.863 9.812 1.00 86.08 58 A 1 +ATOM 440 O OH . TYR A 1 58 ? -1.025 15.661 10.098 1.00 84.16 58 A 1 +ATOM 441 N N . THR A 1 59 ? -6.777 9.769 6.805 1.00 85.71 59 A 1 +ATOM 442 C CA . THR A 1 59 ? -7.970 9.005 6.430 1.00 85.32 59 A 1 +ATOM 443 C C . THR A 1 59 ? -8.275 7.908 7.452 1.00 86.94 59 A 1 +ATOM 444 O O . THR A 1 59 ? -7.382 7.379 8.113 1.00 87.09 59 A 1 +ATOM 445 C CB . THR A 1 59 ? -7.865 8.410 5.022 1.00 82.71 59 A 1 +ATOM 446 O OG1 . THR A 1 59 ? -6.653 7.722 4.843 1.00 76.97 59 A 1 +ATOM 447 C CG2 . THR A 1 59 ? -7.946 9.480 3.953 1.00 74.67 59 A 1 +ATOM 448 N N . THR A 1 60 ? -9.560 7.570 7.596 1.00 89.64 60 A 1 +ATOM 449 C CA . THR A 1 60 ? -10.040 6.717 8.679 1.00 90.66 60 A 1 +ATOM 450 C C . THR A 1 60 ? -10.765 5.485 8.163 1.00 89.57 60 A 1 +ATOM 451 O O . THR A 1 60 ? -11.396 5.508 7.106 1.00 88.06 60 A 1 +ATOM 452 C CB . THR A 1 60 ? -10.951 7.493 9.638 1.00 91.25 60 A 1 +ATOM 453 O OG1 . THR A 1 60 ? -12.054 8.043 8.944 1.00 87.45 60 A 1 +ATOM 454 C CG2 . THR A 1 60 ? -10.228 8.658 10.316 1.00 86.63 60 A 1 +ATOM 455 N N . GLU A 1 61 ? -10.710 4.408 8.943 1.00 90.37 61 A 1 +ATOM 456 C CA . GLU A 1 61 ? -11.435 3.159 8.696 1.00 90.68 61 A 1 +ATOM 457 C C . GLU A 1 61 ? -12.169 2.719 9.967 1.00 92.80 61 A 1 +ATOM 458 O O . GLU A 1 61 ? -11.737 3.007 11.076 1.00 92.72 61 A 1 +ATOM 459 C CB . GLU A 1 61 ? -10.464 2.074 8.230 1.00 87.91 61 A 1 +ATOM 460 C CG . GLU A 1 61 ? -9.798 2.362 6.875 1.00 81.68 61 A 1 +ATOM 461 C CD . GLU A 1 61 ? -10.751 2.388 5.677 1.00 80.75 61 A 1 +ATOM 462 O OE1 . GLU A 1 61 ? -10.323 2.880 4.611 1.00 73.50 61 A 1 +ATOM 463 O OE2 . GLU A 1 61 ? -11.895 1.895 5.784 1.00 72.46 61 A 1 +ATOM 464 N N . TYR A 1 62 ? -13.282 2.019 9.788 1.00 92.86 62 A 1 +ATOM 465 C CA . TYR A 1 62 ? -14.139 1.590 10.882 1.00 94.18 62 A 1 +ATOM 466 C C . TYR A 1 62 ? -14.646 0.155 10.669 1.00 93.32 62 A 1 +ATOM 467 O O . TYR A 1 62 ? -14.969 -0.236 9.541 1.00 91.25 62 A 1 +ATOM 468 C CB . TYR A 1 62 ? -15.344 2.525 11.020 1.00 94.98 62 A 1 +ATOM 469 C CG . TYR A 1 62 ? -14.985 3.969 11.302 1.00 95.82 62 A 1 +ATOM 470 C CD1 . TYR A 1 62 ? -14.754 4.404 12.612 1.00 94.43 62 A 1 +ATOM 471 C CD2 . TYR A 1 62 ? -14.853 4.889 10.239 1.00 94.65 62 A 1 +ATOM 472 C CE1 . TYR A 1 62 ? -14.407 5.733 12.875 1.00 94.69 62 A 1 +ATOM 473 C CE2 . TYR A 1 62 ? -14.500 6.221 10.490 1.00 94.91 62 A 1 +ATOM 474 C CZ . TYR A 1 62 ? -14.272 6.645 11.810 1.00 96.37 62 A 1 +ATOM 475 O OH . TYR A 1 62 ? -13.924 7.944 12.061 1.00 96.27 62 A 1 +ATOM 476 N N . SER A 1 63 ? -14.808 -0.585 11.767 1.00 95.33 63 A 1 +ATOM 477 C CA . SER A 1 63 ? -15.557 -1.836 11.747 1.00 95.41 63 A 1 +ATOM 478 C C . SER A 1 63 ? -17.055 -1.569 11.557 1.00 95.86 63 A 1 +ATOM 479 O O . SER A 1 63 ? -17.571 -0.494 11.871 1.00 95.35 63 A 1 +ATOM 480 C CB . SER A 1 63 ? -15.300 -2.647 13.027 1.00 94.76 63 A 1 +ATOM 481 O OG . SER A 1 63 ? -15.975 -2.064 14.121 1.00 87.47 63 A 1 +ATOM 482 N N . ALA A 1 64 ? -17.776 -2.574 11.062 1.00 94.41 64 A 1 +ATOM 483 C CA . ALA A 1 64 ? -19.218 -2.469 10.858 1.00 94.58 64 A 1 +ATOM 484 C C . ALA A 1 64 ? -19.986 -2.212 12.161 1.00 95.44 64 A 1 +ATOM 485 O O . ALA A 1 64 ? -20.994 -1.502 12.145 1.00 94.52 64 A 1 +ATOM 486 C CB . ALA A 1 64 ? -19.698 -3.747 10.166 1.00 92.92 64 A 1 +ATOM 487 N N . SER A 1 65 ? -19.499 -2.717 13.300 1.00 95.31 65 A 1 +ATOM 488 C CA . SER A 1 65 ? -20.148 -2.587 14.606 1.00 95.60 65 A 1 +ATOM 489 C C . SER A 1 65 ? -20.199 -1.143 15.127 1.00 96.51 65 A 1 +ATOM 490 O O . SER A 1 65 ? -21.114 -0.793 15.876 1.00 95.50 65 A 1 +ATOM 491 C CB . SER A 1 65 ? -19.454 -3.493 15.632 1.00 94.06 65 A 1 +ATOM 492 O OG . SER A 1 65 ? -18.085 -3.166 15.756 1.00 82.85 65 A 1 +ATOM 493 N N . VAL A 1 66 ? -19.265 -0.279 14.693 1.00 96.44 66 A 1 +ATOM 494 C CA . VAL A 1 66 ? -19.162 1.114 15.160 1.00 97.14 66 A 1 +ATOM 495 C C . VAL A 1 66 ? -19.362 2.154 14.064 1.00 97.59 66 A 1 +ATOM 496 O O . VAL A 1 66 ? -19.562 3.341 14.370 1.00 96.86 66 A 1 +ATOM 497 C CB . VAL A 1 66 ? -17.842 1.364 15.909 1.00 96.68 66 A 1 +ATOM 498 C CG1 . VAL A 1 66 ? -17.674 0.375 17.067 1.00 94.17 66 A 1 +ATOM 499 C CG2 . VAL A 1 66 ? -16.616 1.290 15.001 1.00 93.61 66 A 1 +ATOM 500 N N . LYS A 1 67 ? -19.342 1.758 12.794 1.00 95.70 67 A 1 +ATOM 501 C CA . LYS A 1 67 ? -19.468 2.662 11.651 1.00 95.40 67 A 1 +ATOM 502 C C . LYS A 1 67 ? -20.748 3.488 11.722 1.00 95.56 67 A 1 +ATOM 503 O O . LYS A 1 67 ? -21.832 2.958 11.940 1.00 93.80 67 A 1 +ATOM 504 C CB . LYS A 1 67 ? -19.360 1.859 10.348 1.00 93.74 67 A 1 +ATOM 505 C CG . LYS A 1 67 ? -19.258 2.770 9.123 1.00 88.78 67 A 1 +ATOM 506 C CD . LYS A 1 67 ? -18.976 1.937 7.851 1.00 83.98 67 A 1 +ATOM 507 C CE . LYS A 1 67 ? -18.785 2.858 6.651 1.00 74.07 67 A 1 +ATOM 508 N NZ . LYS A 1 67 ? -18.352 2.109 5.450 1.00 65.01 67 A 1 +ATOM 509 N N . GLY A 1 68 ? -20.625 4.805 11.535 1.00 95.65 68 A 1 +ATOM 510 C CA . GLY A 1 68 ? -21.724 5.764 11.640 1.00 95.97 68 A 1 +ATOM 511 C C . GLY A 1 68 ? -22.061 6.220 13.061 1.00 96.86 68 A 1 +ATOM 512 O O . GLY A 1 68 ? -22.819 7.172 13.218 1.00 95.05 68 A 1 +ATOM 513 N N . ARG A 1 69 ? -21.510 5.579 14.100 1.00 97.69 69 A 1 +ATOM 514 C CA . ARG A 1 69 ? -21.678 5.979 15.505 1.00 97.94 69 A 1 +ATOM 515 C C . ARG A 1 69 ? -20.398 6.542 16.108 1.00 98.11 69 A 1 +ATOM 516 O O . ARG A 1 69 ? -20.458 7.478 16.903 1.00 97.80 69 A 1 +ATOM 517 C CB . ARG A 1 69 ? -22.169 4.794 16.347 1.00 97.38 69 A 1 +ATOM 518 C CG . ARG A 1 69 ? -23.515 4.219 15.869 1.00 96.60 69 A 1 +ATOM 519 C CD . ARG A 1 69 ? -24.093 3.199 16.860 1.00 96.37 69 A 1 +ATOM 520 N NE . ARG A 1 69 ? -23.182 2.063 17.108 1.00 95.33 69 A 1 +ATOM 521 C CZ . ARG A 1 69 ? -22.631 1.700 18.267 1.00 96.77 69 A 1 +ATOM 522 N NH1 . ARG A 1 69 ? -22.826 2.349 19.373 1.00 89.45 69 A 1 +ATOM 523 N NH2 . ARG A 1 69 ? -21.871 0.667 18.343 1.00 92.18 69 A 1 +ATOM 524 N N . PHE A 1 70 ? -19.264 5.965 15.755 1.00 97.96 70 A 1 +ATOM 525 C CA . PHE A 1 70 ? -17.971 6.376 16.286 1.00 98.10 70 A 1 +ATOM 526 C C . PHE A 1 70 ? -17.200 7.167 15.237 1.00 98.00 70 A 1 +ATOM 527 O O . PHE A 1 70 ? -17.334 6.935 14.041 1.00 97.01 70 A 1 +ATOM 528 C CB . PHE A 1 70 ? -17.176 5.162 16.782 1.00 98.13 70 A 1 +ATOM 529 C CG . PHE A 1 70 ? -17.708 4.423 17.998 1.00 98.30 70 A 1 +ATOM 530 C CD1 . PHE A 1 70 ? -18.999 4.630 18.532 1.00 96.86 70 A 1 +ATOM 531 C CD2 . PHE A 1 70 ? -16.878 3.473 18.616 1.00 96.89 70 A 1 +ATOM 532 C CE1 . PHE A 1 70 ? -19.452 3.899 19.640 1.00 96.62 70 A 1 +ATOM 533 C CE2 . PHE A 1 70 ? -17.334 2.731 19.730 1.00 96.40 70 A 1 +ATOM 534 C CZ . PHE A 1 70 ? -18.620 2.946 20.229 1.00 97.49 70 A 1 +ATOM 535 N N . ILE A 1 71 ? -16.394 8.134 15.709 1.00 98.10 71 A 1 +ATOM 536 C CA . ILE A 1 71 ? -15.534 8.980 14.886 1.00 98.01 71 A 1 +ATOM 537 C C . ILE A 1 71 ? -14.144 8.980 15.505 1.00 98.12 71 A 1 +ATOM 538 O O . ILE A 1 71 ? -13.948 9.504 16.605 1.00 97.74 71 A 1 +ATOM 539 C CB . ILE A 1 71 ? -16.106 10.413 14.752 1.00 97.45 71 A 1 +ATOM 540 C CG1 . ILE A 1 71 ? -17.554 10.404 14.198 1.00 93.11 71 A 1 +ATOM 541 C CG2 . ILE A 1 71 ? -15.191 11.257 13.845 1.00 92.41 71 A 1 +ATOM 542 C CD1 . ILE A 1 71 ? -18.243 11.779 14.217 1.00 79.51 71 A 1 +ATOM 543 N N . VAL A 1 72 ? -13.180 8.398 14.797 1.00 97.73 72 A 1 +ATOM 544 C CA . VAL A 1 72 ? -11.772 8.511 15.162 1.00 97.37 72 A 1 +ATOM 545 C C . VAL A 1 72 ? -11.188 9.786 14.555 1.00 97.28 72 A 1 +ATOM 546 O O . VAL A 1 72 ? -11.489 10.153 13.413 1.00 95.67 72 A 1 +ATOM 547 C CB . VAL A 1 72 ? -10.985 7.231 14.815 1.00 95.37 72 A 1 +ATOM 548 C CG1 . VAL A 1 72 ? -10.838 6.976 13.323 1.00 84.09 72 A 1 +ATOM 549 C CG2 . VAL A 1 72 ? -9.583 7.259 15.425 1.00 84.00 72 A 1 +ATOM 550 N N . SER A 1 73 ? -10.380 10.495 15.335 1.00 97.38 73 A 1 +ATOM 551 C CA . SER A 1 73 ? -9.636 11.672 14.893 1.00 97.17 73 A 1 +ATOM 552 C C . SER A 1 73 ? -8.296 11.739 15.622 1.00 97.31 73 A 1 +ATOM 553 O O . SER A 1 73 ? -8.096 11.039 16.618 1.00 96.86 73 A 1 +ATOM 554 C CB . SER A 1 73 ? -10.456 12.949 15.124 1.00 96.59 73 A 1 +ATOM 555 O OG . SER A 1 73 ? -10.764 13.125 16.496 1.00 93.84 73 A 1 +ATOM 556 N N . ARG A 1 74 ? -7.392 12.570 15.123 1.00 97.08 74 A 1 +ATOM 557 C CA . ARG A 1 74 ? -6.082 12.797 15.752 1.00 96.63 74 A 1 +ATOM 558 C C . ARG A 1 74 ? -5.674 14.257 15.671 1.00 96.85 74 A 1 +ATOM 559 O O . ARG A 1 74 ? -6.125 14.974 14.784 1.00 95.21 74 A 1 +ATOM 560 C CB . ARG A 1 74 ? -5.037 11.853 15.131 1.00 93.70 74 A 1 +ATOM 561 C CG . ARG A 1 74 ? -4.802 12.107 13.624 1.00 87.86 74 A 1 +ATOM 562 C CD . ARG A 1 74 ? -3.942 11.005 13.000 1.00 89.06 74 A 1 +ATOM 563 N NE . ARG A 1 74 ? -2.559 11.054 13.475 1.00 86.13 74 A 1 +ATOM 564 C CZ . ARG A 1 74 ? -1.669 10.079 13.405 1.00 88.26 74 A 1 +ATOM 565 N NH1 . ARG A 1 74 ? -1.950 8.910 12.907 1.00 78.12 74 A 1 +ATOM 566 N NH2 . ARG A 1 74 ? -0.465 10.277 13.832 1.00 79.00 74 A 1 +ATOM 567 N N . ASP A 1 75 ? -4.835 14.681 16.605 1.00 96.31 75 A 1 +ATOM 568 C CA . ASP A 1 75 ? -4.184 15.981 16.624 1.00 96.68 75 A 1 +ATOM 569 C C . ASP A 1 75 ? -2.689 15.751 16.807 1.00 96.68 75 A 1 +ATOM 570 O O . ASP A 1 75 ? -2.212 15.504 17.915 1.00 95.77 75 A 1 +ATOM 571 C CB . ASP A 1 75 ? -4.806 16.858 17.721 1.00 96.38 75 A 1 +ATOM 572 C CG . ASP A 1 75 ? -4.267 18.292 17.767 1.00 95.30 75 A 1 +ATOM 573 O OD1 . ASP A 1 75 ? -3.216 18.572 17.155 1.00 92.15 75 A 1 +ATOM 574 O OD2 . ASP A 1 75 ? -4.900 19.126 18.461 1.00 90.93 75 A 1 +ATOM 575 N N . ASP A 1 76 ? -1.949 15.790 15.698 1.00 95.38 76 A 1 +ATOM 576 C CA . ASP A 1 76 ? -0.502 15.545 15.685 1.00 94.68 76 A 1 +ATOM 577 C C . ASP A 1 76 ? 0.261 16.618 16.470 1.00 95.33 76 A 1 +ATOM 578 O O . ASP A 1 76 ? 1.305 16.326 17.039 1.00 94.26 76 A 1 +ATOM 579 C CB . ASP A 1 76 ? 0.002 15.439 14.236 1.00 92.76 76 A 1 +ATOM 580 C CG . ASP A 1 76 ? -0.351 14.124 13.528 1.00 89.77 76 A 1 +ATOM 581 O OD1 . ASP A 1 76 ? -0.981 13.225 14.131 1.00 86.09 76 A 1 +ATOM 582 O OD2 . ASP A 1 76 ? 0.048 13.958 12.353 1.00 85.30 76 A 1 +ATOM 583 N N . SER A 1 77 ? -0.274 17.844 16.577 1.00 95.67 77 A 1 +ATOM 584 C CA . SER A 1 77 ? 0.340 18.912 17.378 1.00 95.73 77 A 1 +ATOM 585 C C . SER A 1 77 ? 0.312 18.624 18.882 1.00 96.25 77 A 1 +ATOM 586 O O . SER A 1 77 ? 1.137 19.136 19.638 1.00 95.05 77 A 1 +ATOM 587 C CB . SER A 1 77 ? -0.333 20.257 17.079 1.00 95.47 77 A 1 +ATOM 588 O OG . SER A 1 77 ? -1.586 20.395 17.713 1.00 89.66 77 A 1 +ATOM 589 N N . LYS A 1 78 ? -0.629 17.785 19.320 1.00 96.14 78 A 1 +ATOM 590 C CA . LYS A 1 78 ? -0.793 17.350 20.710 1.00 96.55 78 A 1 +ATOM 591 C C . LYS A 1 78 ? -0.423 15.881 20.929 1.00 96.98 78 A 1 +ATOM 592 O O . LYS A 1 78 ? -0.687 15.366 22.016 1.00 95.78 78 A 1 +ATOM 593 C CB . LYS A 1 78 ? -2.237 17.617 21.165 1.00 96.01 78 A 1 +ATOM 594 C CG . LYS A 1 78 ? -2.571 19.107 21.154 1.00 92.93 78 A 1 +ATOM 595 C CD . LYS A 1 78 ? -4.016 19.293 21.618 1.00 88.52 78 A 1 +ATOM 596 C CE . LYS A 1 78 ? -4.430 20.739 21.366 1.00 80.63 78 A 1 +ATOM 597 N NZ . LYS A 1 78 ? -5.875 20.805 21.079 1.00 71.55 78 A 1 +ATOM 598 N N . ASN A 1 79 ? 0.120 15.211 19.916 1.00 96.81 79 A 1 +ATOM 599 C CA . ASN A 1 79 ? 0.399 13.776 19.938 1.00 97.25 79 A 1 +ATOM 600 C C . ASN A 1 79 ? -0.774 12.959 20.502 1.00 97.73 79 A 1 +ATOM 601 O O . ASN A 1 79 ? -0.603 12.114 21.375 1.00 96.83 79 A 1 +ATOM 602 C CB . ASN A 1 79 ? 1.728 13.536 20.669 1.00 96.44 79 A 1 +ATOM 603 C CG . ASN A 1 79 ? 2.913 14.129 19.936 1.00 93.61 79 A 1 +ATOM 604 O OD1 . ASN A 1 79 ? 3.002 14.125 18.728 1.00 83.44 79 A 1 +ATOM 605 N ND2 . ASN A 1 79 ? 3.882 14.637 20.663 1.00 82.00 79 A 1 +ATOM 606 N N . SER A 1 80 ? -2.004 13.264 20.053 1.00 97.77 80 A 1 +ATOM 607 C CA . SER A 1 80 ? -3.211 12.719 20.661 1.00 97.83 80 A 1 +ATOM 608 C C . SER A 1 80 ? -4.140 12.098 19.628 1.00 97.88 80 A 1 +ATOM 609 O O . SER A 1 80 ? -4.470 12.706 18.608 1.00 97.00 80 A 1 +ATOM 610 C CB . SER A 1 80 ? -3.931 13.791 21.471 1.00 97.51 80 A 1 +ATOM 611 O OG . SER A 1 80 ? -3.149 14.193 22.582 1.00 91.26 80 A 1 +ATOM 612 N N . LEU A 1 81 ? -4.603 10.889 19.914 1.00 97.99 81 A 1 +ATOM 613 C CA . LEU A 1 81 ? -5.671 10.194 19.208 1.00 97.97 81 A 1 +ATOM 614 C C . LEU A 1 81 ? -6.967 10.328 20.011 1.00 98.27 81 A 1 +ATOM 615 O O . LEU A 1 81 ? -6.946 10.270 21.237 1.00 97.97 81 A 1 +ATOM 616 C CB . LEU A 1 81 ? -5.262 8.725 19.033 1.00 97.37 81 A 1 +ATOM 617 C CG . LEU A 1 81 ? -6.254 7.854 18.251 1.00 96.56 81 A 1 +ATOM 618 C CD1 . LEU A 1 81 ? -6.182 8.150 16.760 1.00 93.71 81 A 1 +ATOM 619 C CD2 . LEU A 1 81 ? -5.917 6.376 18.466 1.00 94.01 81 A 1 +ATOM 620 N N . TYR A 1 82 ? -8.092 10.476 19.318 1.00 98.19 82 A 1 +ATOM 621 C CA . TYR A 1 82 ? -9.411 10.566 19.928 1.00 98.28 82 A 1 +ATOM 622 C C . TYR A 1 82 ? -10.372 9.548 19.326 1.00 98.24 82 A 1 +ATOM 623 O O . TYR A 1 82 ? -10.304 9.236 18.144 1.00 97.87 82 A 1 +ATOM 624 C CB . TYR A 1 82 ? -9.963 11.985 19.777 1.00 98.12 82 A 1 +ATOM 625 C CG . TYR A 1 82 ? -9.027 13.074 20.252 1.00 98.04 82 A 1 +ATOM 626 C CD1 . TYR A 1 82 ? -8.822 13.286 21.627 1.00 96.07 82 A 1 +ATOM 627 C CD2 . TYR A 1 82 ? -8.341 13.875 19.317 1.00 96.00 82 A 1 +ATOM 628 C CE1 . TYR A 1 82 ? -7.952 14.291 22.079 1.00 95.34 82 A 1 +ATOM 629 C CE2 . TYR A 1 82 ? -7.464 14.879 19.754 1.00 95.21 82 A 1 +ATOM 630 C CZ . TYR A 1 82 ? -7.274 15.092 21.135 1.00 96.66 82 A 1 +ATOM 631 O OH . TYR A 1 82 ? -6.429 16.083 21.566 1.00 95.51 82 A 1 +ATOM 632 N N . LEU A 1 83 ? -11.335 9.103 20.138 1.00 98.24 83 A 1 +ATOM 633 C CA . LEU A 1 83 ? -12.488 8.327 19.705 1.00 98.33 83 A 1 +ATOM 634 C C . LEU A 1 83 ? -13.750 8.967 20.274 1.00 98.42 83 A 1 +ATOM 635 O O . LEU A 1 83 ? -14.044 8.834 21.461 1.00 98.07 83 A 1 +ATOM 636 C CB . LEU A 1 83 ? -12.317 6.867 20.144 1.00 98.28 83 A 1 +ATOM 637 C CG . LEU A 1 83 ? -13.408 5.929 19.603 1.00 97.97 83 A 1 +ATOM 638 C CD1 . LEU A 1 83 ? -13.285 5.735 18.084 1.00 96.38 83 A 1 +ATOM 639 C CD2 . LEU A 1 83 ? -13.274 4.559 20.275 1.00 96.24 83 A 1 +ATOM 640 N N . GLN A 1 84 ? -14.490 9.686 19.435 1.00 98.39 84 A 1 +ATOM 641 C CA . GLN A 1 84 ? -15.826 10.162 19.772 1.00 98.33 84 A 1 +ATOM 642 C C . GLN A 1 84 ? -16.814 9.017 19.569 1.00 98.35 84 A 1 +ATOM 643 O O . GLN A 1 84 ? -17.012 8.564 18.450 1.00 98.01 84 A 1 +ATOM 644 C CB . GLN A 1 84 ? -16.171 11.389 18.910 1.00 98.10 84 A 1 +ATOM 645 C CG . GLN A 1 84 ? -17.559 11.970 19.230 1.00 96.15 84 A 1 +ATOM 646 C CD . GLN A 1 84 ? -17.640 12.502 20.663 1.00 95.85 84 A 1 +ATOM 647 O OE1 . GLN A 1 84 ? -16.778 13.230 21.136 1.00 89.38 84 A 1 +ATOM 648 N NE2 . GLN A 1 84 ? -18.670 12.155 21.403 1.00 86.66 84 A 1 +ATOM 649 N N . MET A 1 85 ? -17.425 8.571 20.647 1.00 98.36 85 A 1 +ATOM 650 C CA . MET A 1 85 ? -18.432 7.518 20.639 1.00 98.27 85 A 1 +ATOM 651 C C . MET A 1 85 ? -19.806 8.140 20.865 1.00 98.30 85 A 1 +ATOM 652 O O . MET A 1 85 ? -20.031 8.777 21.895 1.00 97.64 85 A 1 +ATOM 653 C CB . MET A 1 85 ? -18.112 6.486 21.719 1.00 97.87 85 A 1 +ATOM 654 C CG . MET A 1 85 ? -16.711 5.875 21.583 1.00 96.74 85 A 1 +ATOM 655 S SD . MET A 1 85 ? -16.359 4.557 22.770 1.00 95.59 85 A 1 +ATOM 656 C CE . MET A 1 85 ? -16.421 5.478 24.312 1.00 87.54 85 A 1 +ATOM 657 N N . ASN A 1 86 ? -20.721 7.963 19.914 1.00 97.92 86 A 1 +ATOM 658 C CA . ASN A 1 86 ? -22.097 8.442 19.980 1.00 97.83 86 A 1 +ATOM 659 C C . ASN A 1 86 ? -23.070 7.261 19.942 1.00 97.87 86 A 1 +ATOM 660 O O . ASN A 1 86 ? -22.735 6.190 19.443 1.00 96.73 86 A 1 +ATOM 661 C CB . ASN A 1 86 ? -22.357 9.421 18.821 1.00 97.29 86 A 1 +ATOM 662 C CG . ASN A 1 86 ? -21.444 10.621 18.828 1.00 96.72 86 A 1 +ATOM 663 O OD1 . ASN A 1 86 ? -21.186 11.249 19.840 1.00 90.03 86 A 1 +ATOM 664 N ND2 . ASN A 1 86 ? -20.916 10.999 17.679 1.00 88.20 86 A 1 +ATOM 665 N N . SER A 1 87 ? -24.303 7.482 20.419 1.00 97.97 87 A 1 +ATOM 666 C CA . SER A 1 87 ? -25.365 6.466 20.413 1.00 97.82 87 A 1 +ATOM 667 C C . SER A 1 87 ? -24.895 5.135 21.024 1.00 97.98 87 A 1 +ATOM 668 O O . SER A 1 87 ? -25.057 4.067 20.427 1.00 96.58 87 A 1 +ATOM 669 C CB . SER A 1 87 ? -25.924 6.285 18.998 1.00 97.18 87 A 1 +ATOM 670 O OG . SER A 1 87 ? -26.348 7.529 18.463 1.00 91.48 87 A 1 +ATOM 671 N N . LEU A 1 88 ? -24.254 5.231 22.192 1.00 97.86 88 A 1 +ATOM 672 C CA . LEU A 1 88 ? -23.680 4.092 22.888 1.00 98.02 88 A 1 +ATOM 673 C C . LEU A 1 88 ? -24.744 3.060 23.252 1.00 97.95 88 A 1 +ATOM 674 O O . LEU A 1 88 ? -25.866 3.387 23.633 1.00 97.05 88 A 1 +ATOM 675 C CB . LEU A 1 88 ? -22.902 4.578 24.124 1.00 97.86 88 A 1 +ATOM 676 C CG . LEU A 1 88 ? -21.520 5.157 23.779 1.00 97.41 88 A 1 +ATOM 677 C CD1 . LEU A 1 88 ? -20.940 5.918 24.966 1.00 95.74 88 A 1 +ATOM 678 C CD2 . LEU A 1 88 ? -20.524 4.052 23.410 1.00 95.49 88 A 1 +ATOM 679 N N . LYS A 1 89 ? -24.370 1.792 23.147 1.00 97.78 89 A 1 +ATOM 680 C CA . LYS A 1 89 ? -25.199 0.633 23.474 1.00 97.49 89 A 1 +ATOM 681 C C . LYS A 1 89 ? -24.539 -0.166 24.593 1.00 97.66 89 A 1 +ATOM 682 O O . LYS A 1 89 ? -23.328 -0.083 24.773 1.00 96.95 89 A 1 +ATOM 683 C CB . LYS A 1 89 ? -25.371 -0.253 22.233 1.00 96.13 89 A 1 +ATOM 684 C CG . LYS A 1 89 ? -25.997 0.469 21.038 1.00 92.73 89 A 1 +ATOM 685 C CD . LYS A 1 89 ? -26.073 -0.528 19.879 1.00 90.88 89 A 1 +ATOM 686 C CE . LYS A 1 89 ? -26.654 0.100 18.616 1.00 82.09 89 A 1 +ATOM 687 N NZ . LYS A 1 89 ? -26.706 -0.932 17.549 1.00 75.32 89 A 1 +ATOM 688 N N . THR A 1 90 ? -25.309 -0.997 25.274 1.00 97.34 90 A 1 +ATOM 689 C CA . THR A 1 90 ? -24.764 -1.908 26.297 1.00 97.19 90 A 1 +ATOM 690 C C . THR A 1 90 ? -23.671 -2.827 25.738 1.00 97.39 90 A 1 +ATOM 691 O O . THR A 1 90 ? -22.695 -3.108 26.422 1.00 96.37 90 A 1 +ATOM 692 C CB . THR A 1 90 ? -25.880 -2.760 26.897 1.00 96.01 90 A 1 +ATOM 693 O OG1 . THR A 1 90 ? -26.676 -3.300 25.859 1.00 83.93 90 A 1 +ATOM 694 C CG2 . THR A 1 90 ? -26.816 -1.919 27.779 1.00 81.37 90 A 1 +ATOM 695 N N . GLU A 1 91 ? -23.786 -3.201 24.460 1.00 97.06 91 A 1 +ATOM 696 C CA . GLU A 1 91 ? -22.795 -3.990 23.709 1.00 96.63 91 A 1 +ATOM 697 C C . GLU A 1 91 ? -21.437 -3.284 23.535 1.00 97.18 91 A 1 +ATOM 698 O O . GLU A 1 91 ? -20.437 -3.941 23.277 1.00 96.15 91 A 1 +ATOM 699 C CB . GLU A 1 91 ? -23.365 -4.276 22.308 1.00 94.63 91 A 1 +ATOM 700 C CG . GLU A 1 91 ? -24.668 -5.083 22.287 1.00 84.89 91 A 1 +ATOM 701 C CD . GLU A 1 91 ? -25.571 -4.719 21.092 1.00 79.83 91 A 1 +ATOM 702 O OE1 . GLU A 1 91 ? -26.805 -4.873 21.234 1.00 72.28 91 A 1 +ATOM 703 O OE2 . GLU A 1 91 ? -25.069 -4.192 20.075 1.00 73.92 91 A 1 +ATOM 704 N N . ASP A 1 92 ? -21.397 -1.960 23.690 1.00 97.41 92 A 1 +ATOM 705 C CA . ASP A 1 92 ? -20.157 -1.188 23.616 1.00 97.96 92 A 1 +ATOM 706 C C . ASP A 1 92 ? -19.380 -1.188 24.951 1.00 98.17 92 A 1 +ATOM 707 O O . ASP A 1 92 ? -18.297 -0.604 25.035 1.00 97.67 92 A 1 +ATOM 708 C CB . ASP A 1 92 ? -20.450 0.255 23.150 1.00 97.86 92 A 1 +ATOM 709 C CG . ASP A 1 92 ? -21.131 0.372 21.770 1.00 97.75 92 A 1 +ATOM 710 O OD1 . ASP A 1 92 ? -20.672 -0.220 20.777 1.00 95.27 92 A 1 +ATOM 711 O OD2 . ASP A 1 92 ? -22.105 1.157 21.641 1.00 95.55 92 A 1 +ATOM 712 N N . THR A 1 93 ? -19.895 -1.829 25.990 1.00 98.29 93 A 1 +ATOM 713 C CA . THR A 1 93 ? -19.186 -2.009 27.267 1.00 98.21 93 A 1 +ATOM 714 C C . THR A 1 93 ? -17.930 -2.846 27.053 1.00 98.19 93 A 1 +ATOM 715 O O . THR A 1 93 ? -18.013 -4.031 26.722 1.00 97.33 93 A 1 +ATOM 716 C CB . THR A 1 93 ? -20.085 -2.678 28.316 1.00 97.85 93 A 1 +ATOM 717 O OG1 . THR A 1 93 ? -21.180 -1.841 28.609 1.00 94.56 93 A 1 +ATOM 718 C CG2 . THR A 1 93 ? -19.363 -2.935 29.647 1.00 94.50 93 A 1 +ATOM 719 N N . ALA A 1 94 ? -16.765 -2.238 27.239 1.00 98.22 94 A 1 +ATOM 720 C CA . ALA A 1 94 ? -15.477 -2.869 26.998 1.00 98.21 94 A 1 +ATOM 721 C C . ALA A 1 94 ? -14.323 -2.083 27.631 1.00 98.27 94 A 1 +ATOM 722 O O . ALA A 1 94 ? -14.459 -0.899 27.962 1.00 97.79 94 A 1 +ATOM 723 C CB . ALA A 1 94 ? -15.274 -2.979 25.475 1.00 97.70 94 A 1 +ATOM 724 N N . VAL A 1 95 ? -13.166 -2.721 27.733 1.00 98.12 95 A 1 +ATOM 725 C CA . VAL A 1 95 ? -11.891 -2.006 27.814 1.00 98.28 95 A 1 +ATOM 726 C C . VAL A 1 95 ? -11.510 -1.575 26.396 1.00 98.32 95 A 1 +ATOM 727 O O . VAL A 1 95 ? -11.518 -2.396 25.486 1.00 97.99 95 A 1 +ATOM 728 C CB . VAL A 1 95 ? -10.783 -2.869 28.443 1.00 97.79 95 A 1 +ATOM 729 C CG1 . VAL A 1 95 ? -9.487 -2.071 28.583 1.00 95.46 95 A 1 +ATOM 730 C CG2 . VAL A 1 95 ? -11.188 -3.359 29.836 1.00 95.45 95 A 1 +ATOM 731 N N . TYR A 1 96 ? -11.194 -0.300 26.213 1.00 98.38 96 A 1 +ATOM 732 C CA . TYR A 1 96 ? -10.755 0.276 24.953 1.00 98.52 96 A 1 +ATOM 733 C C . TYR A 1 96 ? -9.257 0.540 25.012 1.00 98.46 96 A 1 +ATOM 734 O O . TYR A 1 96 ? -8.800 1.285 25.879 1.00 98.04 96 A 1 +ATOM 735 C CB . TYR A 1 96 ? -11.523 1.574 24.664 1.00 98.54 96 A 1 +ATOM 736 C CG . TYR A 1 96 ? -12.954 1.342 24.241 1.00 98.62 96 A 1 +ATOM 737 C CD1 . TYR A 1 96 ? -13.320 1.472 22.886 1.00 97.75 96 A 1 +ATOM 738 C CD2 . TYR A 1 96 ? -13.927 0.963 25.186 1.00 97.85 96 A 1 +ATOM 739 C CE1 . TYR A 1 96 ? -14.639 1.226 22.473 1.00 97.89 96 A 1 +ATOM 740 C CE2 . TYR A 1 96 ? -15.240 0.701 24.782 1.00 97.67 96 A 1 +ATOM 741 C CZ . TYR A 1 96 ? -15.598 0.830 23.420 1.00 98.40 96 A 1 +ATOM 742 O OH . TYR A 1 96 ? -16.874 0.550 23.025 1.00 98.04 96 A 1 +ATOM 743 N N . TYR A 1 97 ? -8.510 -0.058 24.088 1.00 98.44 97 A 1 +ATOM 744 C CA . TYR A 1 97 ? -7.078 0.100 23.930 1.00 98.48 97 A 1 +ATOM 745 C C . TYR A 1 97 ? -6.777 0.989 22.726 1.00 98.40 97 A 1 +ATOM 746 O O . TYR A 1 97 ? -7.349 0.819 21.653 1.00 98.17 97 A 1 +ATOM 747 C CB . TYR A 1 97 ? -6.411 -1.264 23.751 1.00 98.37 97 A 1 +ATOM 748 C CG . TYR A 1 97 ? -6.596 -2.199 24.926 1.00 98.38 97 A 1 +ATOM 749 C CD1 . TYR A 1 97 ? -5.795 -2.053 26.069 1.00 97.54 97 A 1 +ATOM 750 C CD2 . TYR A 1 97 ? -7.557 -3.229 24.881 1.00 97.55 97 A 1 +ATOM 751 C CE1 . TYR A 1 97 ? -5.949 -2.925 27.160 1.00 97.34 97 A 1 +ATOM 752 C CE2 . TYR A 1 97 ? -7.719 -4.102 25.967 1.00 97.25 97 A 1 +ATOM 753 C CZ . TYR A 1 97 ? -6.910 -3.945 27.107 1.00 97.76 97 A 1 +ATOM 754 O OH . TYR A 1 97 ? -7.063 -4.797 28.174 1.00 96.95 97 A 1 +ATOM 755 N N . CYS A 1 98 ? -5.840 1.895 22.917 1.00 98.09 98 A 1 +ATOM 756 C CA . CYS A 1 98 ? -5.146 2.585 21.848 1.00 97.69 98 A 1 +ATOM 757 C C . CYS A 1 98 ? -3.879 1.795 21.512 1.00 97.81 98 A 1 +ATOM 758 O O . CYS A 1 98 ? -3.146 1.395 22.411 1.00 96.64 98 A 1 +ATOM 759 C CB . CYS A 1 98 ? -4.839 4.000 22.344 1.00 94.82 98 A 1 +ATOM 760 S SG . CYS A 1 98 ? -3.776 4.998 21.291 1.00 87.34 98 A 1 +ATOM 761 N N . ALA A 1 99 ? -3.606 1.582 20.227 1.00 97.19 99 A 1 +ATOM 762 C CA . ALA A 1 99 ? -2.380 0.960 19.780 1.00 96.69 99 A 1 +ATOM 763 C C . ALA A 1 99 ? -1.790 1.726 18.592 1.00 96.03 99 A 1 +ATOM 764 O O . ALA A 1 99 ? -2.520 2.363 17.829 1.00 94.78 99 A 1 +ATOM 765 C CB . ALA A 1 99 ? -2.651 -0.508 19.446 1.00 96.18 99 A 1 +ATOM 766 N N . ARG A 1 100 ? -0.476 1.666 18.410 1.00 94.40 100 A 1 +ATOM 767 C CA . ARG A 1 100 ? 0.156 2.170 17.194 1.00 92.98 100 A 1 +ATOM 768 C C . ARG A 1 100 ? 0.549 1.029 16.270 1.00 92.44 100 A 1 +ATOM 769 O O . ARG A 1 100 ? 0.916 -0.054 16.726 1.00 90.85 100 A 1 +ATOM 770 C CB . ARG A 1 100 ? 1.327 3.126 17.513 1.00 89.89 100 A 1 +ATOM 771 C CG . ARG A 1 100 ? 2.601 2.392 17.912 1.00 86.56 100 A 1 +ATOM 772 C CD . ARG A 1 100 ? 3.799 3.336 18.039 1.00 85.37 100 A 1 +ATOM 773 N NE . ARG A 1 100 ? 4.999 2.521 18.007 1.00 83.53 100 A 1 +ATOM 774 C CZ . ARG A 1 100 ? 6.260 2.894 17.973 1.00 83.06 100 A 1 +ATOM 775 N NH1 . ARG A 1 100 ? 6.625 4.138 18.098 1.00 77.18 100 A 1 +ATOM 776 N NH2 . ARG A 1 100 ? 7.162 1.987 17.788 1.00 77.45 100 A 1 +ATOM 777 N N . SER A 1 101 ? 0.559 1.307 14.963 1.00 88.45 101 A 1 +ATOM 778 C CA . SER A 1 101 ? 1.200 0.476 13.960 1.00 85.06 101 A 1 +ATOM 779 C C . SER A 1 101 ? 2.140 1.327 13.116 1.00 81.29 101 A 1 +ATOM 780 O O . SER A 1 101 ? 1.833 2.465 12.773 1.00 73.74 101 A 1 +ATOM 781 C CB . SER A 1 101 ? 0.156 -0.277 13.120 1.00 81.83 101 A 1 +ATOM 782 O OG . SER A 1 101 ? -0.769 0.583 12.494 1.00 75.57 101 A 1 +ATOM 783 N N . TYR A 1 102 ? 3.343 0.814 12.818 1.00 71.17 102 A 1 +ATOM 784 C CA . TYR A 1 102 ? 4.264 1.492 11.903 1.00 66.63 102 A 1 +ATOM 785 C C . TYR A 1 102 ? 3.850 1.148 10.482 1.00 66.19 102 A 1 +ATOM 786 O O . TYR A 1 102 ? 4.033 0.010 10.056 1.00 60.12 102 A 1 +ATOM 787 C CB . TYR A 1 102 ? 5.702 1.072 12.173 1.00 60.42 102 A 1 +ATOM 788 C CG . TYR A 1 102 ? 6.682 1.725 11.226 1.00 54.45 102 A 1 +ATOM 789 C CD1 . TYR A 1 102 ? 7.359 0.963 10.248 1.00 48.87 102 A 1 +ATOM 790 C CD2 . TYR A 1 102 ? 6.900 3.119 11.270 1.00 47.23 102 A 1 +ATOM 791 C CE1 . TYR A 1 102 ? 8.236 1.583 9.354 1.00 42.64 102 A 1 +ATOM 792 C CE2 . TYR A 1 102 ? 7.773 3.744 10.372 1.00 41.97 102 A 1 +ATOM 793 C CZ . TYR A 1 102 ? 8.448 2.975 9.415 1.00 42.14 102 A 1 +ATOM 794 O OH . TYR A 1 102 ? 9.304 3.592 8.545 1.00 37.34 102 A 1 +ATOM 795 N N . TYR A 1 103 ? 3.252 2.121 9.788 1.00 62.30 103 A 1 +ATOM 796 C CA . TYR A 1 103 ? 2.493 1.801 8.587 1.00 59.41 103 A 1 +ATOM 797 C C . TYR A 1 103 ? 1.542 0.631 8.836 1.00 59.99 103 A 1 +ATOM 798 O O . TYR A 1 103 ? 1.401 0.131 9.957 1.00 54.88 103 A 1 +ATOM 799 C CB . TYR A 1 103 ? 3.437 1.614 7.382 1.00 53.43 103 A 1 +ATOM 800 C CG . TYR A 1 103 ? 4.141 2.883 6.980 1.00 50.85 103 A 1 +ATOM 801 C CD1 . TYR A 1 103 ? 3.563 3.715 6.004 1.00 47.22 103 A 1 +ATOM 802 C CD2 . TYR A 1 103 ? 5.366 3.257 7.569 1.00 46.51 103 A 1 +ATOM 803 C CE1 . TYR A 1 103 ? 4.190 4.904 5.624 1.00 43.37 103 A 1 +ATOM 804 C CE2 . TYR A 1 103 ? 5.996 4.454 7.192 1.00 42.58 103 A 1 +ATOM 805 C CZ . TYR A 1 103 ? 5.405 5.277 6.220 1.00 43.12 103 A 1 +ATOM 806 O OH . TYR A 1 103 ? 6.016 6.444 5.846 1.00 37.82 103 A 1 +ATOM 807 N N . ARG A 1 104 ? 0.858 0.191 7.829 1.00 58.37 104 A 1 +ATOM 808 C CA . ARG A 1 104 ? -0.243 -0.754 8.063 1.00 56.77 104 A 1 +ATOM 809 C C . ARG A 1 104 ? 0.194 -2.125 8.580 1.00 58.48 104 A 1 +ATOM 810 O O . ARG A 1 104 ? -0.543 -2.741 9.334 1.00 53.83 104 A 1 +ATOM 811 C CB . ARG A 1 104 ? -1.041 -0.834 6.764 1.00 50.68 104 A 1 +ATOM 812 C CG . ARG A 1 104 ? -2.328 -1.628 6.934 1.00 45.39 104 A 1 +ATOM 813 C CD . ARG A 1 104 ? -3.128 -1.517 5.648 1.00 42.57 104 A 1 +ATOM 814 N NE . ARG A 1 104 ? -4.184 -2.533 5.607 1.00 40.54 104 A 1 +ATOM 815 C CZ . ARG A 1 104 ? -4.542 -3.188 4.530 1.00 37.00 104 A 1 +ATOM 816 N NH1 . ARG A 1 104 ? -4.028 -2.922 3.362 1.00 35.71 104 A 1 +ATOM 817 N NH2 . ARG A 1 104 ? -5.406 -4.148 4.587 1.00 34.00 104 A 1 +ATOM 818 N N . TYR A 1 105 ? 1.324 -2.641 8.115 1.00 59.71 105 A 1 +ATOM 819 C CA . TYR A 1 105 ? 1.567 -4.080 8.131 1.00 58.62 105 A 1 +ATOM 820 C C . TYR A 1 105 ? 2.618 -4.590 9.114 1.00 61.53 105 A 1 +ATOM 821 O O . TYR A 1 105 ? 2.855 -5.794 9.136 1.00 57.15 105 A 1 +ATOM 822 C CB . TYR A 1 105 ? 1.852 -4.564 6.711 1.00 52.31 105 A 1 +ATOM 823 C CG . TYR A 1 105 ? 0.709 -4.305 5.754 1.00 49.24 105 A 1 +ATOM 824 C CD1 . TYR A 1 105 ? -0.591 -4.757 6.044 1.00 44.65 105 A 1 +ATOM 825 C CD2 . TYR A 1 105 ? 0.948 -3.602 4.567 1.00 44.30 105 A 1 +ATOM 826 C CE1 . TYR A 1 105 ? -1.650 -4.497 5.164 1.00 40.49 105 A 1 +ATOM 827 C CE2 . TYR A 1 105 ? -0.099 -3.345 3.680 1.00 39.73 105 A 1 +ATOM 828 C CZ . TYR A 1 105 ? -1.398 -3.792 3.978 1.00 40.01 105 A 1 +ATOM 829 O OH . TYR A 1 105 ? -2.416 -3.530 3.109 1.00 34.43 105 A 1 +ATOM 830 N N . ASP A 1 106 ? 3.179 -3.736 9.969 1.00 69.88 106 A 1 +ATOM 831 C CA . ASP A 1 106 ? 4.161 -4.188 10.956 1.00 70.89 106 A 1 +ATOM 832 C C . ASP A 1 106 ? 3.525 -4.665 12.274 1.00 75.65 106 A 1 +ATOM 833 O O . ASP A 1 106 ? 4.210 -5.003 13.237 1.00 73.20 106 A 1 +ATOM 834 C CB . ASP A 1 106 ? 5.247 -3.116 11.139 1.00 64.59 106 A 1 +ATOM 835 C CG . ASP A 1 106 ? 6.159 -2.973 9.913 1.00 58.28 106 A 1 +ATOM 836 O OD1 . ASP A 1 106 ? 5.926 -3.649 8.885 1.00 51.07 106 A 1 +ATOM 837 O OD2 . ASP A 1 106 ? 7.112 -2.179 10.007 1.00 51.18 106 A 1 +ATOM 838 N N . GLY A 1 107 ? 2.210 -4.744 12.313 1.00 79.30 107 A 1 +ATOM 839 C CA . GLY A 1 107 ? 1.443 -5.085 13.502 1.00 81.99 107 A 1 +ATOM 840 C C . GLY A 1 107 ? 1.299 -3.906 14.468 1.00 84.27 107 A 1 +ATOM 841 O O . GLY A 1 107 ? 1.852 -2.828 14.265 1.00 82.98 107 A 1 +ATOM 842 N N . MET A 1 108 ? 0.535 -4.120 15.529 1.00 90.55 108 A 1 +ATOM 843 C CA . MET A 1 108 ? 0.388 -3.157 16.620 1.00 92.45 108 A 1 +ATOM 844 C C . MET A 1 108 ? 1.484 -3.422 17.656 1.00 93.29 108 A 1 +ATOM 845 O O . MET A 1 108 ? 1.370 -4.346 18.461 1.00 92.56 108 A 1 +ATOM 846 C CB . MET A 1 108 ? -1.018 -3.252 17.217 1.00 92.13 108 A 1 +ATOM 847 C CG . MET A 1 108 ? -2.075 -2.725 16.240 1.00 89.58 108 A 1 +ATOM 848 S SD . MET A 1 108 ? -3.794 -2.893 16.804 1.00 87.70 108 A 1 +ATOM 849 C CE . MET A 1 108 ? -4.010 -4.660 16.603 1.00 79.15 108 A 1 +ATOM 850 N N . ASP A 1 109 ? 2.556 -2.638 17.588 1.00 91.25 109 A 1 +ATOM 851 C CA . ASP A 1 109 ? 3.780 -2.890 18.351 1.00 89.90 109 A 1 +ATOM 852 C C . ASP A 1 109 ? 3.749 -2.309 19.774 1.00 90.93 109 A 1 +ATOM 853 O O . ASP A 1 109 ? 4.352 -2.881 20.680 1.00 89.80 109 A 1 +ATOM 854 C CB . ASP A 1 109 ? 4.998 -2.399 17.544 1.00 86.40 109 A 1 +ATOM 855 C CG . ASP A 1 109 ? 5.081 -0.881 17.338 1.00 83.87 109 A 1 +ATOM 856 O OD1 . ASP A 1 109 ? 4.058 -0.168 17.453 1.00 79.16 109 A 1 +ATOM 857 O OD2 . ASP A 1 109 ? 6.201 -0.372 17.115 1.00 80.56 109 A 1 +ATOM 858 N N . TYR A 1 110 ? 3.010 -1.224 19.975 1.00 93.06 110 A 1 +ATOM 859 C CA . TYR A 1 110 ? 2.788 -0.635 21.294 1.00 94.11 110 A 1 +ATOM 860 C C . TYR A 1 110 ? 1.300 -0.443 21.557 1.00 95.26 110 A 1 +ATOM 861 O O . TYR A 1 110 ? 0.550 -0.005 20.683 1.00 95.15 110 A 1 +ATOM 862 C CB . TYR A 1 110 ? 3.543 0.691 21.443 1.00 93.08 110 A 1 +ATOM 863 C CG . TYR A 1 110 ? 5.037 0.518 21.543 1.00 89.83 110 A 1 +ATOM 864 C CD1 . TYR A 1 110 ? 5.664 0.400 22.798 1.00 86.68 110 A 1 +ATOM 865 C CD2 . TYR A 1 110 ? 5.818 0.454 20.377 1.00 86.47 110 A 1 +ATOM 866 C CE1 . TYR A 1 110 ? 7.052 0.220 22.891 1.00 84.22 110 A 1 +ATOM 867 C CE2 . TYR A 1 110 ? 7.205 0.264 20.455 1.00 83.40 110 A 1 +ATOM 868 C CZ . TYR A 1 110 ? 7.822 0.155 21.713 1.00 83.45 110 A 1 +ATOM 869 O OH . TYR A 1 110 ? 9.177 -0.024 21.787 1.00 79.24 110 A 1 +ATOM 870 N N . TRP A 1 111 ? 0.906 -0.717 22.782 1.00 96.20 111 A 1 +ATOM 871 C CA . TRP A 1 111 ? -0.455 -0.606 23.291 1.00 97.13 111 A 1 +ATOM 872 C C . TRP A 1 111 ? -0.461 0.234 24.563 1.00 97.40 111 A 1 +ATOM 873 O O . TRP A 1 111 ? 0.492 0.187 25.351 1.00 96.74 111 A 1 +ATOM 874 C CB . TRP A 1 111 ? -1.009 -2.005 23.575 1.00 97.12 111 A 1 +ATOM 875 C CG . TRP A 1 111 ? -1.172 -2.897 22.383 1.00 97.00 111 A 1 +ATOM 876 C CD1 . TRP A 1 111 ? -0.172 -3.400 21.611 1.00 95.93 111 A 1 +ATOM 877 C CD2 . TRP A 1 111 ? -2.422 -3.415 21.811 1.00 96.79 111 A 1 +ATOM 878 N NE1 . TRP A 1 111 ? -0.709 -4.195 20.605 1.00 95.94 111 A 1 +ATOM 879 C CE2 . TRP A 1 111 ? -2.086 -4.241 20.701 1.00 96.45 111 A 1 +ATOM 880 C CE3 . TRP A 1 111 ? -3.779 -3.270 22.142 1.00 96.44 111 A 1 +ATOM 881 C CZ2 . TRP A 1 111 ? -3.065 -4.921 19.949 1.00 96.08 111 A 1 +ATOM 882 C CZ3 . TRP A 1 111 ? -4.761 -3.939 21.396 1.00 95.92 111 A 1 +ATOM 883 C CH2 . TRP A 1 111 ? -4.402 -4.761 20.311 1.00 95.67 111 A 1 +ATOM 884 N N . GLY A 1 112 ? -1.536 0.972 24.786 1.00 97.64 112 A 1 +ATOM 885 C CA . GLY A 1 112 ? -1.820 1.548 26.090 1.00 97.71 112 A 1 +ATOM 886 C C . GLY A 1 112 ? -2.309 0.491 27.086 1.00 97.84 112 A 1 +ATOM 887 O O . GLY A 1 112 ? -2.479 -0.688 26.758 1.00 96.91 112 A 1 +ATOM 888 N N . GLN A 1 113 ? -2.541 0.917 28.323 1.00 97.10 113 A 1 +ATOM 889 C CA . GLN A 1 113 ? -3.075 0.037 29.373 1.00 96.50 113 A 1 +ATOM 890 C C . GLN A 1 113 ? -4.580 -0.192 29.248 1.00 97.28 113 A 1 +ATOM 891 O O . GLN A 1 113 ? -5.128 -1.100 29.875 1.00 95.98 113 A 1 +ATOM 892 C CB . GLN A 1 113 ? -2.723 0.606 30.753 1.00 94.37 113 A 1 +ATOM 893 C CG . GLN A 1 113 ? -1.211 0.673 31.008 1.00 78.47 113 A 1 +ATOM 894 C CD . GLN A 1 113 ? -0.535 -0.711 30.933 1.00 59.89 113 A 1 +ATOM 895 O OE1 . GLN A 1 113 ? -1.073 -1.728 31.342 1.00 52.59 113 A 1 +ATOM 896 N NE2 . GLN A 1 113 ? 0.664 -0.792 30.412 1.00 47.88 113 A 1 +ATOM 897 N N . GLY A 1 114 ? -5.261 0.610 28.417 1.00 97.37 114 A 1 +ATOM 898 C CA . GLY A 1 114 ? -6.695 0.576 28.217 1.00 97.68 114 A 1 +ATOM 899 C C . GLY A 1 114 ? -7.466 1.485 29.172 1.00 97.99 114 A 1 +ATOM 900 O O . GLY A 1 114 ? -7.039 1.798 30.283 1.00 96.70 114 A 1 +ATOM 901 N N . THR A 1 115 ? -8.657 1.885 28.721 1.00 97.80 115 A 1 +ATOM 902 C CA . THR A 1 115 ? -9.629 2.621 29.539 1.00 98.05 115 A 1 +ATOM 903 C C . THR A 1 115 ? -10.981 1.922 29.474 1.00 98.18 115 A 1 +ATOM 904 O O . THR A 1 115 ? -11.427 1.486 28.412 1.00 97.84 115 A 1 +ATOM 905 C CB . THR A 1 115 ? -9.701 4.096 29.135 1.00 97.75 115 A 1 +ATOM 906 O OG1 . THR A 1 115 ? -10.472 4.814 30.081 1.00 95.30 115 A 1 +ATOM 907 C CG2 . THR A 1 115 ? -10.295 4.355 27.750 1.00 94.95 115 A 1 +ATOM 908 N N . THR A 1 116 ? -11.651 1.778 30.602 1.00 97.82 116 A 1 +ATOM 909 C CA . THR A 1 116 ? -12.915 1.047 30.687 1.00 97.95 116 A 1 +ATOM 910 C C . THR A 1 116 ? -14.099 1.961 30.391 1.00 98.13 116 A 1 +ATOM 911 O O . THR A 1 116 ? -14.264 3.006 31.025 1.00 97.51 116 A 1 +ATOM 912 C CB . THR A 1 116 ? -13.085 0.374 32.056 1.00 97.15 116 A 1 +ATOM 913 O OG1 . THR A 1 116 ? -11.976 -0.475 32.303 1.00 92.68 116 A 1 +ATOM 914 C CG2 . THR A 1 116 ? -14.333 -0.512 32.122 1.00 92.12 116 A 1 +ATOM 915 N N . VAL A 1 117 ? -14.961 1.543 29.479 1.00 98.13 117 A 1 +ATOM 916 C CA . VAL A 1 117 ? -16.258 2.158 29.197 1.00 98.22 117 A 1 +ATOM 917 C C . VAL A 1 117 ? -17.350 1.193 29.616 1.00 98.20 117 A 1 +ATOM 918 O O . VAL A 1 117 ? -17.392 0.055 29.150 1.00 97.64 117 A 1 +ATOM 919 C CB . VAL A 1 117 ? -16.388 2.524 27.706 1.00 97.97 117 A 1 +ATOM 920 C CG1 . VAL A 1 117 ? -17.768 3.100 27.387 1.00 96.20 117 A 1 +ATOM 921 C CG2 . VAL A 1 117 ? -15.327 3.562 27.313 1.00 96.22 117 A 1 +ATOM 922 N N . THR A 1 118 ? -18.252 1.646 30.471 1.00 98.04 118 A 1 +ATOM 923 C CA . THR A 1 118 ? -19.409 0.874 30.913 1.00 97.84 118 A 1 +ATOM 924 C C . THR A 1 118 ? -20.680 1.589 30.476 1.00 97.95 118 A 1 +ATOM 925 O O . THR A 1 118 ? -20.935 2.714 30.894 1.00 97.09 118 A 1 +ATOM 926 C CB . THR A 1 118 ? -19.398 0.667 32.436 1.00 97.20 118 A 1 +ATOM 927 O OG1 . THR A 1 118 ? -18.186 0.059 32.818 1.00 93.24 118 A 1 +ATOM 928 C CG2 . THR A 1 118 ? -20.525 -0.261 32.899 1.00 93.04 118 A 1 +ATOM 929 N N . VAL A 1 119 ? -21.495 0.936 29.644 1.00 97.38 119 A 1 +ATOM 930 C CA . VAL A 1 119 ? -22.793 1.442 29.199 1.00 97.14 119 A 1 +ATOM 931 C C . VAL A 1 119 ? -23.875 0.672 29.934 1.00 96.37 119 A 1 +ATOM 932 O O . VAL A 1 119 ? -24.128 -0.495 29.637 1.00 93.81 119 A 1 +ATOM 933 C CB . VAL A 1 119 ? -22.963 1.359 27.675 1.00 96.60 119 A 1 +ATOM 934 C CG1 . VAL A 1 119 ? -24.227 2.094 27.246 1.00 93.38 119 A 1 +ATOM 935 C CG2 . VAL A 1 119 ? -21.775 1.982 26.928 1.00 93.83 119 A 1 +ATOM 936 N N . SER A 1 120 ? -24.477 1.316 30.915 1.00 95.05 120 A 1 +ATOM 937 C CA . SER A 1 120 ? -25.500 0.731 31.776 1.00 93.16 120 A 1 +ATOM 938 C C . SER A 1 120 ? -26.596 1.750 32.050 1.00 92.12 120 A 1 +ATOM 939 O O . SER A 1 120 ? -26.326 2.942 32.194 1.00 85.63 120 A 1 +ATOM 940 C CB . SER A 1 120 ? -24.877 0.263 33.093 1.00 88.46 120 A 1 +ATOM 941 O OG . SER A 1 120 ? -25.838 -0.371 33.919 1.00 77.38 120 A 1 +ATOM 942 N N . SER A 1 121 ? -27.824 1.294 32.117 1.00 89.80 121 A 1 +ATOM 943 C CA . SER A 1 121 ? -28.950 2.041 32.667 1.00 86.09 121 A 1 +ATOM 944 C C . SER A 1 121 ? -28.849 2.189 34.169 1.00 80.36 121 A 1 +ATOM 945 O O . SER A 1 121 ? -28.414 1.218 34.821 1.00 71.56 121 A 1 +ATOM 946 C CB . SER A 1 121 ? -30.257 1.313 32.337 1.00 78.40 121 A 1 +ATOM 947 O OG . SER A 1 121 ? -30.129 -0.001 32.829 1.00 69.47 121 A 1 +ATOM 948 O OXT . SER A 1 121 ? -29.265 3.298 34.653 1.00 67.75 121 A 1 +ATOM 949 N N . GLU B 2 1 ? -15.795 -9.537 5.471 1.00 78.24 1 B 1 +ATOM 950 C CA . GLU B 2 1 ? -14.912 -9.687 6.643 1.00 85.05 1 B 1 +ATOM 951 C C . GLU B 2 1 ? -14.168 -11.005 6.555 1.00 86.96 1 B 1 +ATOM 952 O O . GLU B 2 1 ? -14.727 -11.981 6.059 1.00 84.33 1 B 1 +ATOM 953 C CB . GLU B 2 1 ? -15.763 -9.589 7.907 1.00 79.56 1 B 1 +ATOM 954 C CG . GLU B 2 1 ? -14.941 -9.568 9.183 1.00 73.16 1 B 1 +ATOM 955 C CD . GLU B 2 1 ? -15.810 -9.239 10.402 1.00 70.16 1 B 1 +ATOM 956 O OE1 . GLU B 2 1 ? -15.210 -8.904 11.433 1.00 64.26 1 B 1 +ATOM 957 O OE2 . GLU B 2 1 ? -17.052 -9.294 10.276 1.00 69.56 1 B 1 +ATOM 958 N N . ILE B 2 2 ? -12.912 -11.042 6.966 1.00 85.69 2 B 1 +ATOM 959 C CA . ILE B 2 2 ? -12.115 -12.274 7.036 1.00 89.43 2 B 1 +ATOM 960 C C . ILE B 2 2 ? -12.215 -12.814 8.460 1.00 92.07 2 B 1 +ATOM 961 O O . ILE B 2 2 ? -11.553 -12.311 9.367 1.00 91.84 2 B 1 +ATOM 962 C CB . ILE B 2 2 ? -10.661 -12.051 6.586 1.00 87.07 2 B 1 +ATOM 963 C CG1 . ILE B 2 2 ? -10.622 -11.541 5.127 1.00 84.90 2 B 1 +ATOM 964 C CG2 . ILE B 2 2 ? -9.875 -13.362 6.728 1.00 84.42 2 B 1 +ATOM 965 C CD1 . ILE B 2 2 ? -9.206 -11.288 4.590 1.00 78.89 2 B 1 +ATOM 966 N N . VAL B 2 3 ? -13.032 -13.834 8.656 1.00 93.62 3 B 1 +ATOM 967 C CA . VAL B 2 3 ? -13.160 -14.493 9.955 1.00 94.89 3 B 1 +ATOM 968 C C . VAL B 2 3 ? -11.932 -15.378 10.198 1.00 95.30 3 B 1 +ATOM 969 O O . VAL B 2 3 ? -11.523 -16.137 9.316 1.00 94.69 3 B 1 +ATOM 970 C CB . VAL B 2 3 ? -14.464 -15.306 10.038 1.00 94.35 3 B 1 +ATOM 971 C CG1 . VAL B 2 3 ? -14.616 -15.993 11.394 1.00 89.68 3 B 1 +ATOM 972 C CG2 . VAL B 2 3 ? -15.680 -14.395 9.823 1.00 90.09 3 B 1 +ATOM 973 N N . LEU B 2 4 ? -11.357 -15.268 11.388 1.00 95.84 4 B 1 +ATOM 974 C CA . LEU B 2 4 ? -10.267 -16.102 11.866 1.00 96.60 4 B 1 +ATOM 975 C C . LEU B 2 4 ? -10.785 -17.041 12.955 1.00 97.04 4 B 1 +ATOM 976 O O . LEU B 2 4 ? -11.350 -16.584 13.955 1.00 96.54 4 B 1 +ATOM 977 C CB . LEU B 2 4 ? -9.124 -15.227 12.401 1.00 96.46 4 B 1 +ATOM 978 C CG . LEU B 2 4 ? -8.519 -14.236 11.401 1.00 95.55 4 B 1 +ATOM 979 C CD1 . LEU B 2 4 ? -7.377 -13.480 12.077 1.00 93.18 4 B 1 +ATOM 980 C CD2 . LEU B 2 4 ? -7.963 -14.928 10.154 1.00 92.58 4 B 1 +ATOM 981 N N . THR B 2 5 ? -10.558 -18.333 12.792 1.00 96.67 5 B 1 +ATOM 982 C CA . THR B 2 5 ? -10.915 -19.354 13.782 1.00 96.61 5 B 1 +ATOM 983 C C . THR B 2 5 ? -9.655 -19.896 14.424 1.00 97.07 5 B 1 +ATOM 984 O O . THR B 2 5 ? -8.813 -20.480 13.745 1.00 96.27 5 B 1 +ATOM 985 C CB . THR B 2 5 ? -11.734 -20.482 13.138 1.00 95.94 5 B 1 +ATOM 986 O OG1 . THR B 2 5 ? -12.878 -19.932 12.519 1.00 91.54 5 B 1 +ATOM 987 C CG2 . THR B 2 5 ? -12.224 -21.480 14.173 1.00 90.64 5 B 1 +ATOM 988 N N . GLN B 2 6 ? -9.514 -19.715 15.722 1.00 97.50 6 B 1 +ATOM 989 C CA . GLN B 2 6 ? -8.419 -20.305 16.489 1.00 97.67 6 B 1 +ATOM 990 C C . GLN B 2 6 ? -8.824 -21.634 17.121 1.00 97.24 6 B 1 +ATOM 991 O O . GLN B 2 6 ? -9.931 -21.783 17.636 1.00 95.43 6 B 1 +ATOM 992 C CB . GLN B 2 6 ? -7.892 -19.333 17.545 1.00 97.35 6 B 1 +ATOM 993 C CG . GLN B 2 6 ? -7.111 -18.190 16.901 1.00 96.59 6 B 1 +ATOM 994 C CD . GLN B 2 6 ? -6.513 -17.259 17.939 1.00 97.62 6 B 1 +ATOM 995 O OE1 . GLN B 2 6 ? -6.941 -16.137 18.102 1.00 93.05 6 B 1 +ATOM 996 N NE2 . GLN B 2 6 ? -5.506 -17.686 18.677 1.00 92.40 6 B 1 +ATOM 997 N N . SER B 2 7 ? -7.904 -22.583 17.093 1.00 95.96 7 B 1 +ATOM 998 C CA . SER B 2 7 ? -8.093 -23.887 17.728 1.00 95.11 7 B 1 +ATOM 999 C C . SER B 2 7 ? -6.800 -24.376 18.384 1.00 95.16 7 B 1 +ATOM 1000 O O . SER B 2 7 ? -5.712 -24.145 17.853 1.00 93.08 7 B 1 +ATOM 1001 C CB . SER B 2 7 ? -8.603 -24.901 16.702 1.00 92.57 7 B 1 +ATOM 1002 O OG . SER B 2 7 ? -7.672 -25.089 15.655 1.00 81.80 7 B 1 +ATOM 1003 N N . PRO B 2 8 ? -6.891 -25.090 19.530 1.00 94.88 8 B 1 +ATOM 1004 C CA . PRO B 2 8 ? -8.089 -25.245 20.352 1.00 95.29 8 B 1 +ATOM 1005 C C . PRO B 2 8 ? -8.471 -23.921 21.051 1.00 95.86 8 B 1 +ATOM 1006 O O . PRO B 2 8 ? -7.702 -22.968 21.044 1.00 94.74 8 B 1 +ATOM 1007 C CB . PRO B 2 8 ? -7.723 -26.346 21.346 1.00 93.98 8 B 1 +ATOM 1008 C CG . PRO B 2 8 ? -6.229 -26.120 21.560 1.00 91.92 8 B 1 +ATOM 1009 C CD . PRO B 2 8 ? -5.743 -25.696 20.186 1.00 92.67 8 B 1 +ATOM 1010 N N . ALA B 2 9 ? -9.655 -23.851 21.646 1.00 95.87 9 B 1 +ATOM 1011 C CA . ALA B 2 9 ? -10.045 -22.688 22.453 1.00 95.97 9 B 1 +ATOM 1012 C C . ALA B 2 9 ? -9.269 -22.617 23.780 1.00 96.58 9 B 1 +ATOM 1013 O O . ALA B 2 9 ? -8.928 -21.535 24.261 1.00 95.12 9 B 1 +ATOM 1014 C CB . ALA B 2 9 ? -11.555 -22.742 22.701 1.00 94.27 9 B 1 +ATOM 1015 N N . THR B 2 10 ? -8.973 -23.795 24.350 1.00 96.33 10 B 1 +ATOM 1016 C CA . THR B 2 10 ? -8.153 -23.951 25.552 1.00 96.22 10 B 1 +ATOM 1017 C C . THR B 2 10 ? -7.148 -25.071 25.331 1.00 96.18 10 B 1 +ATOM 1018 O O . THR B 2 10 ? -7.484 -26.112 24.766 1.00 93.94 10 B 1 +ATOM 1019 C CB . THR B 2 10 ? -9.015 -24.243 26.785 1.00 94.71 10 B 1 +ATOM 1020 O OG1 . THR B 2 10 ? -9.993 -23.236 26.942 1.00 83.35 10 B 1 +ATOM 1021 C CG2 . THR B 2 10 ? -8.203 -24.272 28.075 1.00 81.81 10 B 1 +ATOM 1022 N N . LEU B 2 11 ? -5.912 -24.844 25.749 1.00 96.09 11 B 1 +ATOM 1023 C CA . LEU B 2 11 ? -4.821 -25.798 25.688 1.00 95.62 11 B 1 +ATOM 1024 C C . LEU B 2 11 ? -4.209 -25.929 27.085 1.00 96.20 11 B 1 +ATOM 1025 O O . LEU B 2 11 ? -3.517 -25.022 27.551 1.00 94.67 11 B 1 +ATOM 1026 C CB . LEU B 2 11 ? -3.817 -25.290 24.637 1.00 93.24 11 B 1 +ATOM 1027 C CG . LEU B 2 11 ? -2.669 -26.263 24.334 1.00 88.82 11 B 1 +ATOM 1028 C CD1 . LEU B 2 11 ? -3.171 -27.533 23.636 1.00 84.79 11 B 1 +ATOM 1029 C CD2 . LEU B 2 11 ? -1.666 -25.577 23.416 1.00 84.38 11 B 1 +ATOM 1030 N N . SER B 2 12 ? -4.476 -27.055 27.752 1.00 95.89 12 B 1 +ATOM 1031 C CA . SER B 2 12 ? -3.953 -27.351 29.086 1.00 95.79 12 B 1 +ATOM 1032 C C . SER B 2 12 ? -2.681 -28.184 28.972 1.00 95.76 12 B 1 +ATOM 1033 O O . SER B 2 12 ? -2.727 -29.335 28.526 1.00 93.85 12 B 1 +ATOM 1034 C CB . SER B 2 12 ? -4.996 -28.076 29.940 1.00 94.28 12 B 1 +ATOM 1035 O OG . SER B 2 12 ? -6.255 -27.424 29.900 1.00 81.74 12 B 1 +ATOM 1036 N N . LEU B 2 13 ? -1.548 -27.602 29.342 1.00 95.66 13 B 1 +ATOM 1037 C CA . LEU B 2 13 ? -0.224 -28.198 29.213 1.00 95.69 13 B 1 +ATOM 1038 C C . LEU B 2 13 ? 0.603 -27.968 30.486 1.00 95.63 13 B 1 +ATOM 1039 O O . LEU B 2 13 ? 0.346 -27.062 31.271 1.00 94.11 13 B 1 +ATOM 1040 C CB . LEU B 2 13 ? 0.505 -27.614 27.990 1.00 94.69 13 B 1 +ATOM 1041 C CG . LEU B 2 13 ? -0.084 -27.988 26.620 1.00 93.76 13 B 1 +ATOM 1042 C CD1 . LEU B 2 13 ? 0.682 -27.250 25.529 1.00 89.72 13 B 1 +ATOM 1043 C CD2 . LEU B 2 13 ? 0.015 -29.485 26.313 1.00 89.68 13 B 1 +ATOM 1044 N N . SER B 2 14 ? 1.634 -28.794 30.656 1.00 95.43 14 B 1 +ATOM 1045 C CA . SER B 2 14 ? 2.598 -28.634 31.737 1.00 95.37 14 B 1 +ATOM 1046 C C . SER B 2 14 ? 3.776 -27.754 31.296 1.00 95.77 14 B 1 +ATOM 1047 O O . SER B 2 14 ? 4.115 -27.718 30.111 1.00 94.55 14 B 1 +ATOM 1048 C CB . SER B 2 14 ? 3.096 -29.998 32.214 1.00 94.00 14 B 1 +ATOM 1049 O OG . SER B 2 14 ? 2.002 -30.831 32.569 1.00 87.57 14 B 1 +ATOM 1050 N N . PRO B 2 15 ? 4.447 -27.062 32.223 1.00 95.94 15 B 1 +ATOM 1051 C CA . PRO B 2 15 ? 5.716 -26.402 31.918 1.00 95.71 15 B 1 +ATOM 1052 C C . PRO B 2 15 ? 6.719 -27.363 31.268 1.00 95.90 15 B 1 +ATOM 1053 O O . PRO B 2 15 ? 6.825 -28.525 31.658 1.00 94.51 15 B 1 +ATOM 1054 C CB . PRO B 2 15 ? 6.229 -25.865 33.259 1.00 94.41 15 B 1 +ATOM 1055 C CG . PRO B 2 15 ? 4.953 -25.712 34.089 1.00 92.18 15 B 1 +ATOM 1056 C CD . PRO B 2 15 ? 4.081 -26.864 33.613 1.00 94.59 15 B 1 +ATOM 1057 N N . GLY B 2 16 ? 7.454 -26.881 30.258 1.00 95.55 16 B 1 +ATOM 1058 C CA . GLY B 2 16 ? 8.396 -27.680 29.462 1.00 95.57 16 B 1 +ATOM 1059 C C . GLY B 2 16 ? 7.785 -28.361 28.242 1.00 95.90 16 B 1 +ATOM 1060 O O . GLY B 2 16 ? 8.522 -28.722 27.317 1.00 93.67 16 B 1 +ATOM 1061 N N . GLU B 2 17 ? 6.456 -28.509 28.151 1.00 95.91 17 B 1 +ATOM 1062 C CA . GLU B 2 17 ? 5.792 -29.075 26.982 1.00 95.73 17 B 1 +ATOM 1063 C C . GLU B 2 17 ? 5.764 -28.087 25.805 1.00 96.02 17 B 1 +ATOM 1064 O O . GLU B 2 17 ? 5.913 -26.869 25.952 1.00 95.27 17 B 1 +ATOM 1065 C CB . GLU B 2 17 ? 4.380 -29.574 27.319 1.00 94.38 17 B 1 +ATOM 1066 C CG . GLU B 2 17 ? 4.407 -30.767 28.301 1.00 90.46 17 B 1 +ATOM 1067 C CD . GLU B 2 17 ? 3.016 -31.391 28.483 1.00 89.90 17 B 1 +ATOM 1068 O OE1 . GLU B 2 17 ? 2.890 -32.619 28.305 1.00 82.69 17 B 1 +ATOM 1069 O OE2 . GLU B 2 17 ? 2.064 -30.642 28.811 1.00 84.27 17 B 1 +ATOM 1070 N N . ARG B 2 18 ? 5.581 -28.641 24.595 1.00 96.36 18 B 1 +ATOM 1071 C CA . ARG B 2 18 ? 5.402 -27.846 23.386 1.00 96.74 18 B 1 +ATOM 1072 C C . ARG B 2 18 ? 3.936 -27.465 23.229 1.00 96.87 18 B 1 +ATOM 1073 O O . ARG B 2 18 ? 3.079 -28.343 23.160 1.00 95.33 18 B 1 +ATOM 1074 C CB . ARG B 2 18 ? 5.937 -28.615 22.169 1.00 96.00 18 B 1 +ATOM 1075 C CG . ARG B 2 18 ? 5.713 -27.836 20.857 1.00 93.32 18 B 1 +ATOM 1076 C CD . ARG B 2 18 ? 6.277 -28.583 19.647 1.00 91.10 18 B 1 +ATOM 1077 N NE . ARG B 2 18 ? 7.749 -28.606 19.664 1.00 85.09 18 B 1 +ATOM 1078 C CZ . ARG B 2 18 ? 8.535 -29.285 18.844 1.00 80.43 18 B 1 +ATOM 1079 N NH1 . ARG B 2 18 ? 8.034 -30.053 17.905 1.00 70.98 18 B 1 +ATOM 1080 N NH2 . ARG B 2 18 ? 9.823 -29.197 18.943 1.00 74.62 18 B 1 +ATOM 1081 N N . ALA B 2 19 ? 3.664 -26.177 23.048 1.00 96.87 19 B 1 +ATOM 1082 C CA . ALA B 2 19 ? 2.351 -25.681 22.645 1.00 96.81 19 B 1 +ATOM 1083 C C . ALA B 2 19 ? 2.307 -25.435 21.132 1.00 97.21 19 B 1 +ATOM 1084 O O . ALA B 2 19 ? 3.218 -24.841 20.566 1.00 96.50 19 B 1 +ATOM 1085 C CB . ALA B 2 19 ? 2.016 -24.421 23.444 1.00 96.16 19 B 1 +ATOM 1086 N N . THR B 2 20 ? 1.220 -25.880 20.484 1.00 97.32 20 B 1 +ATOM 1087 C CA . THR B 2 20 ? 0.940 -25.611 19.075 1.00 97.24 20 B 1 +ATOM 1088 C C . THR B 2 20 ? -0.467 -25.035 18.952 1.00 97.35 20 B 1 +ATOM 1089 O O . THR B 2 20 ? -1.445 -25.693 19.306 1.00 96.28 20 B 1 +ATOM 1090 C CB . THR B 2 20 ? 1.080 -26.885 18.225 1.00 96.28 20 B 1 +ATOM 1091 O OG1 . THR B 2 20 ? 2.375 -27.425 18.379 1.00 89.55 20 B 1 +ATOM 1092 C CG2 . THR B 2 20 ? 0.895 -26.607 16.734 1.00 87.77 20 B 1 +ATOM 1093 N N . LEU B 2 21 ? -0.565 -23.791 18.470 1.00 97.76 21 B 1 +ATOM 1094 C CA . LEU B 2 21 ? -1.807 -23.041 18.349 1.00 97.84 21 B 1 +ATOM 1095 C C . LEU B 2 21 ? -2.088 -22.804 16.872 1.00 97.92 21 B 1 +ATOM 1096 O O . LEU B 2 21 ? -1.244 -22.265 16.164 1.00 96.93 21 B 1 +ATOM 1097 C CB . LEU B 2 21 ? -1.698 -21.700 19.087 1.00 97.48 21 B 1 +ATOM 1098 C CG . LEU B 2 21 ? -1.613 -21.773 20.627 1.00 96.49 21 B 1 +ATOM 1099 C CD1 . LEU B 2 21 ? -0.238 -22.200 21.147 1.00 91.30 21 B 1 +ATOM 1100 C CD2 . LEU B 2 21 ? -1.890 -20.386 21.197 1.00 90.75 21 B 1 +ATOM 1101 N N . SER B 2 22 ? -3.284 -23.176 16.404 1.00 97.71 22 B 1 +ATOM 1102 C CA . SER B 2 22 ? -3.695 -23.008 15.013 1.00 97.70 22 B 1 +ATOM 1103 C C . SER B 2 22 ? -4.608 -21.795 14.844 1.00 97.98 22 B 1 +ATOM 1104 O O . SER B 2 22 ? -5.426 -21.490 15.712 1.00 97.17 22 B 1 +ATOM 1105 C CB . SER B 2 22 ? -4.368 -24.276 14.495 1.00 96.82 22 B 1 +ATOM 1106 O OG . SER B 2 22 ? -3.464 -25.365 14.573 1.00 79.17 22 B 1 +ATOM 1107 N N . CYS B 2 23 ? -4.481 -21.120 13.699 1.00 97.65 23 B 1 +ATOM 1108 C CA . CYS B 2 23 ? -5.377 -20.062 13.263 1.00 97.51 23 B 1 +ATOM 1109 C C . CYS B 2 23 ? -5.734 -20.294 11.799 1.00 97.46 23 B 1 +ATOM 1110 O O . CYS B 2 23 ? -4.848 -20.288 10.940 1.00 95.78 23 B 1 +ATOM 1111 C CB . CYS B 2 23 ? -4.687 -18.708 13.479 1.00 97.04 23 B 1 +ATOM 1112 S SG . CYS B 2 23 ? -5.692 -17.297 12.949 1.00 96.55 23 B 1 +ATOM 1113 N N . SER B 2 24 ? -7.023 -20.501 11.510 1.00 97.08 24 B 1 +ATOM 1114 C CA . SER B 2 24 ? -7.533 -20.720 10.166 1.00 96.85 24 B 1 +ATOM 1115 C C . SER B 2 24 ? -8.373 -19.527 9.716 1.00 96.73 24 B 1 +ATOM 1116 O O . SER B 2 24 ? -9.255 -19.068 10.449 1.00 95.55 24 B 1 +ATOM 1117 C CB . SER B 2 24 ? -8.327 -22.029 10.098 1.00 95.72 24 B 1 +ATOM 1118 O OG . SER B 2 24 ? -8.627 -22.345 8.762 1.00 79.20 24 B 1 +ATOM 1119 N N . ALA B 2 25 ? -8.097 -19.010 8.524 1.00 95.15 25 B 1 +ATOM 1120 C CA . ALA B 2 25 ? -8.823 -17.913 7.914 1.00 94.17 25 B 1 +ATOM 1121 C C . ALA B 2 25 ? -9.842 -18.438 6.891 1.00 93.80 25 B 1 +ATOM 1122 O O . ALA B 2 25 ? -9.534 -19.318 6.103 1.00 92.39 25 B 1 +ATOM 1123 C CB . ALA B 2 25 ? -7.815 -16.943 7.277 1.00 92.90 25 B 1 +ATOM 1124 N N . ILE B 2 26 ? -11.041 -17.840 6.833 1.00 92.45 26 B 1 +ATOM 1125 C CA . ILE B 2 26 ? -12.079 -18.225 5.855 1.00 91.50 26 B 1 +ATOM 1126 C C . ILE B 2 26 ? -11.674 -17.943 4.392 1.00 90.55 26 B 1 +ATOM 1127 O O . ILE B 2 26 ? -12.233 -18.505 3.453 1.00 87.11 26 B 1 +ATOM 1128 C CB . ILE B 2 26 ? -13.410 -17.536 6.223 1.00 89.88 26 B 1 +ATOM 1129 C CG1 . ILE B 2 26 ? -14.598 -18.221 5.517 1.00 79.30 26 B 1 +ATOM 1130 C CG2 . ILE B 2 26 ? -13.372 -16.027 5.940 1.00 76.39 26 B 1 +ATOM 1131 C CD1 . ILE B 2 26 ? -15.967 -17.779 6.035 1.00 71.00 26 B 1 +ATOM 1132 N N . SER B 2 27 ? -10.717 -17.045 4.185 1.00 89.32 27 B 1 +ATOM 1133 C CA . SER B 2 27 ? -10.111 -16.753 2.897 1.00 87.53 27 B 1 +ATOM 1134 C C . SER B 2 27 ? -8.622 -16.490 3.074 1.00 87.87 27 B 1 +ATOM 1135 O O . SER B 2 27 ? -8.218 -15.997 4.122 1.00 85.96 27 B 1 +ATOM 1136 C CB . SER B 2 27 ? -10.785 -15.546 2.231 1.00 84.60 27 B 1 +ATOM 1137 O OG . SER B 2 27 ? -10.661 -14.386 3.023 1.00 73.77 27 B 1 +ATOM 1138 N N . SER B 2 28 ? -7.836 -16.769 2.041 1.00 85.12 28 B 1 +ATOM 1139 C CA . SER B 2 28 ? -6.388 -16.588 2.069 1.00 83.33 28 B 1 +ATOM 1140 C C . SER B 2 28 ? -5.979 -15.193 2.515 1.00 82.73 28 B 1 +ATOM 1141 O O . SER B 2 28 ? -6.503 -14.184 2.025 1.00 80.54 28 B 1 +ATOM 1142 C CB . SER B 2 28 ? -5.802 -16.895 0.683 1.00 80.62 28 B 1 +ATOM 1143 O OG . SER B 2 28 ? -4.388 -16.874 0.729 1.00 70.79 28 B 1 +ATOM 1144 N N . VAL B 2 29 ? -5.017 -15.141 3.431 1.00 82.96 29 B 1 +ATOM 1145 C CA . VAL B 2 29 ? -4.315 -13.936 3.865 1.00 83.52 29 B 1 +ATOM 1146 C C . VAL B 2 29 ? -2.824 -14.098 3.605 1.00 82.74 29 B 1 +ATOM 1147 O O . VAL B 2 29 ? -2.311 -15.215 3.537 1.00 81.16 29 B 1 +ATOM 1148 C CB . VAL B 2 29 ? -4.600 -13.576 5.339 1.00 84.25 29 B 1 +ATOM 1149 C CG1 . VAL B 2 29 ? -6.088 -13.317 5.560 1.00 78.16 29 B 1 +ATOM 1150 C CG2 . VAL B 2 29 ? -4.144 -14.649 6.321 1.00 79.39 29 B 1 +ATOM 1151 N N . SER B 2 30 ? -2.119 -12.981 3.435 1.00 80.50 30 B 1 +ATOM 1152 C CA . SER B 2 30 ? -0.704 -13.008 3.056 1.00 78.84 30 B 1 +ATOM 1153 C C . SER B 2 30 ? 0.218 -13.214 4.251 1.00 80.58 30 B 1 +ATOM 1154 O O . SER B 2 30 ? 1.259 -13.848 4.125 1.00 78.32 30 B 1 +ATOM 1155 C CB . SER B 2 30 ? -0.339 -11.709 2.351 1.00 74.45 30 B 1 +ATOM 1156 O OG . SER B 2 30 ? -1.263 -11.481 1.307 1.00 66.17 30 B 1 +ATOM 1157 N N . TYR B 2 31 ? -0.175 -12.680 5.407 1.00 81.32 31 B 1 +ATOM 1158 C CA . TYR B 2 31 ? 0.591 -12.753 6.648 1.00 83.22 31 B 1 +ATOM 1159 C C . TYR B 2 31 ? -0.344 -12.868 7.844 1.00 86.48 31 B 1 +ATOM 1160 O O . TYR B 2 31 ? -1.484 -12.398 7.811 1.00 86.64 31 B 1 +ATOM 1161 C CB . TYR B 2 31 ? 1.473 -11.505 6.800 1.00 80.30 31 B 1 +ATOM 1162 C CG . TYR B 2 31 ? 2.455 -11.315 5.676 1.00 76.55 31 B 1 +ATOM 1163 C CD1 . TYR B 2 31 ? 3.616 -12.118 5.586 1.00 71.96 31 B 1 +ATOM 1164 C CD2 . TYR B 2 31 ? 2.216 -10.352 4.682 1.00 70.94 31 B 1 +ATOM 1165 C CE1 . TYR B 2 31 ? 4.513 -11.962 4.532 1.00 67.57 31 B 1 +ATOM 1166 C CE2 . TYR B 2 31 ? 3.115 -10.189 3.625 1.00 67.13 31 B 1 +ATOM 1167 C CZ . TYR B 2 31 ? 4.263 -10.997 3.545 1.00 68.51 31 B 1 +ATOM 1168 O OH . TYR B 2 31 ? 5.142 -10.833 2.510 1.00 63.38 31 B 1 +ATOM 1169 N N . MET B 2 32 ? 0.177 -13.453 8.914 1.00 88.93 32 B 1 +ATOM 1170 C CA . MET B 2 32 ? -0.483 -13.534 10.210 1.00 91.53 32 B 1 +ATOM 1171 C C . MET B 2 32 ? 0.374 -12.853 11.280 1.00 91.58 32 B 1 +ATOM 1172 O O . MET B 2 32 ? 1.605 -12.896 11.232 1.00 90.37 32 B 1 +ATOM 1173 C CB . MET B 2 32 ? -0.776 -14.998 10.549 1.00 92.41 32 B 1 +ATOM 1174 C CG . MET B 2 32 ? -1.795 -15.138 11.675 1.00 90.87 32 B 1 +ATOM 1175 S SD . MET B 2 32 ? -3.442 -14.452 11.323 1.00 92.14 32 B 1 +ATOM 1176 C CE . MET B 2 32 ? -4.000 -15.558 10.015 1.00 88.50 32 B 1 +ATOM 1177 N N . TYR B 2 33 ? -0.299 -12.243 12.231 1.00 93.46 33 B 1 +ATOM 1178 C CA . TYR B 2 33 ? 0.293 -11.569 13.373 1.00 94.31 33 B 1 +ATOM 1179 C C . TYR B 2 33 ? -0.208 -12.241 14.642 1.00 95.82 33 B 1 +ATOM 1180 O O . TYR B 2 33 ? -1.369 -12.628 14.716 1.00 96.09 33 B 1 +ATOM 1181 C CB . TYR B 2 33 ? -0.071 -10.078 13.339 1.00 92.63 33 B 1 +ATOM 1182 C CG . TYR B 2 33 ? 0.440 -9.357 12.112 1.00 90.18 33 B 1 +ATOM 1183 C CD1 . TYR B 2 33 ? 1.569 -8.512 12.196 1.00 86.06 33 B 1 +ATOM 1184 C CD2 . TYR B 2 33 ? -0.179 -9.554 10.865 1.00 85.57 33 B 1 +ATOM 1185 C CE1 . TYR B 2 33 ? 2.079 -7.902 11.049 1.00 82.93 33 B 1 +ATOM 1186 C CE2 . TYR B 2 33 ? 0.341 -8.957 9.705 1.00 82.29 33 B 1 +ATOM 1187 C CZ . TYR B 2 33 ? 1.475 -8.132 9.801 1.00 82.77 33 B 1 +ATOM 1188 O OH . TYR B 2 33 ? 1.998 -7.581 8.674 1.00 78.84 33 B 1 +ATOM 1189 N N . TRP B 2 34 ? 0.669 -12.383 15.638 1.00 96.47 34 B 1 +ATOM 1190 C CA . TRP B 2 34 ? 0.337 -13.047 16.886 1.00 97.39 34 B 1 +ATOM 1191 C C . TRP B 2 34 ? 0.577 -12.132 18.079 1.00 97.35 34 B 1 +ATOM 1192 O O . TRP B 2 34 ? 1.624 -11.495 18.190 1.00 96.95 34 B 1 +ATOM 1193 C CB . TRP B 2 34 ? 1.125 -14.347 17.015 1.00 97.79 34 B 1 +ATOM 1194 C CG . TRP B 2 34 ? 0.743 -15.412 16.028 1.00 97.94 34 B 1 +ATOM 1195 C CD1 . TRP B 2 34 ? 1.332 -15.632 14.834 1.00 97.31 34 B 1 +ATOM 1196 C CD2 . TRP B 2 34 ? -0.302 -16.423 16.161 1.00 97.92 34 B 1 +ATOM 1197 N NE1 . TRP B 2 34 ? 0.738 -16.720 14.203 1.00 97.38 34 B 1 +ATOM 1198 C CE2 . TRP B 2 34 ? -0.267 -17.245 15.000 1.00 97.75 34 B 1 +ATOM 1199 C CE3 . TRP B 2 34 ? -1.258 -16.736 17.153 1.00 97.86 34 B 1 +ATOM 1200 C CZ2 . TRP B 2 34 ? -1.129 -18.347 14.835 1.00 97.73 34 B 1 +ATOM 1201 C CZ3 . TRP B 2 34 ? -2.119 -17.826 16.989 1.00 97.56 34 B 1 +ATOM 1202 C CH2 . TRP B 2 34 ? -2.055 -18.627 15.847 1.00 97.43 34 B 1 +ATOM 1203 N N . TYR B 2 35 ? -0.384 -12.131 18.994 1.00 98.03 35 B 1 +ATOM 1204 C CA . TYR B 2 35 ? -0.356 -11.348 20.216 1.00 98.10 35 B 1 +ATOM 1205 C C . TYR B 2 35 ? -0.512 -12.259 21.431 1.00 98.38 35 B 1 +ATOM 1206 O O . TYR B 2 35 ? -1.260 -13.230 21.389 1.00 98.24 35 B 1 +ATOM 1207 C CB . TYR B 2 35 ? -1.463 -10.283 20.207 1.00 97.59 35 B 1 +ATOM 1208 C CG . TYR B 2 35 ? -1.370 -9.313 19.053 1.00 97.06 35 B 1 +ATOM 1209 C CD1 . TYR B 2 35 ? -0.759 -8.043 19.222 1.00 95.58 35 B 1 +ATOM 1210 C CD2 . TYR B 2 35 ? -1.881 -9.660 17.789 1.00 95.57 35 B 1 +ATOM 1211 C CE1 . TYR B 2 35 ? -0.632 -7.162 18.151 1.00 94.67 35 B 1 +ATOM 1212 C CE2 . TYR B 2 35 ? -1.751 -8.784 16.697 1.00 94.48 35 B 1 +ATOM 1213 C CZ . TYR B 2 35 ? -1.125 -7.531 16.877 1.00 95.02 35 B 1 +ATOM 1214 O OH . TYR B 2 35 ? -0.975 -6.687 15.819 1.00 93.49 35 B 1 +ATOM 1215 N N . GLN B 2 36 ? 0.168 -11.918 22.525 1.00 98.28 36 B 1 +ATOM 1216 C CA . GLN B 2 36 ? -0.035 -12.499 23.849 1.00 98.26 36 B 1 +ATOM 1217 C C . GLN B 2 36 ? -0.772 -11.497 24.728 1.00 98.18 36 B 1 +ATOM 1218 O O . GLN B 2 36 ? -0.410 -10.321 24.775 1.00 97.67 36 B 1 +ATOM 1219 C CB . GLN B 2 36 ? 1.327 -12.871 24.449 1.00 97.97 36 B 1 +ATOM 1220 C CG . GLN B 2 36 ? 1.229 -13.542 25.817 1.00 97.30 36 B 1 +ATOM 1221 C CD . GLN B 2 36 ? 2.619 -13.727 26.441 1.00 97.04 36 B 1 +ATOM 1222 O OE1 . GLN B 2 36 ? 3.303 -12.770 26.772 1.00 91.12 36 B 1 +ATOM 1223 N NE2 . GLN B 2 36 ? 3.089 -14.945 26.611 1.00 90.06 36 B 1 +ATOM 1224 N N . GLN B 2 37 ? -1.751 -11.972 25.495 1.00 98.18 37 B 1 +ATOM 1225 C CA . GLN B 2 37 ? -2.392 -11.180 26.539 1.00 97.91 37 B 1 +ATOM 1226 C C . GLN B 2 37 ? -2.408 -11.951 27.863 1.00 97.85 37 B 1 +ATOM 1227 O O . GLN B 2 37 ? -3.025 -13.006 27.978 1.00 96.96 37 B 1 +ATOM 1228 C CB . GLN B 2 37 ? -3.798 -10.770 26.095 1.00 97.64 37 B 1 +ATOM 1229 C CG . GLN B 2 37 ? -4.388 -9.721 27.041 1.00 97.03 37 B 1 +ATOM 1230 C CD . GLN B 2 37 ? -5.800 -9.303 26.651 1.00 97.24 37 B 1 +ATOM 1231 O OE1 . GLN B 2 37 ? -6.573 -10.052 26.066 1.00 93.19 37 B 1 +ATOM 1232 N NE2 . GLN B 2 37 ? -6.195 -8.099 26.993 1.00 91.78 37 B 1 +ATOM 1233 N N . LYS B 2 38 ? -1.740 -11.386 28.854 1.00 96.91 38 B 1 +ATOM 1234 C CA . LYS B 2 38 ? -1.792 -11.884 30.225 1.00 96.46 38 B 1 +ATOM 1235 C C . LYS B 2 38 ? -3.003 -11.293 30.954 1.00 95.93 38 B 1 +ATOM 1236 O O . LYS B 2 38 ? -3.443 -10.194 30.600 1.00 94.38 38 B 1 +ATOM 1237 C CB . LYS B 2 38 ? -0.478 -11.583 30.956 1.00 95.84 38 B 1 +ATOM 1238 C CG . LYS B 2 38 ? 0.705 -12.323 30.317 1.00 93.72 38 B 1 +ATOM 1239 C CD . LYS B 2 38 ? 2.001 -12.147 31.129 1.00 89.49 38 B 1 +ATOM 1240 C CE . LYS B 2 38 ? 3.133 -12.894 30.415 1.00 83.56 38 B 1 +ATOM 1241 N NZ . LYS B 2 38 ? 4.392 -12.915 31.190 1.00 75.78 38 B 1 +ATOM 1242 N N . PRO B 2 39 ? -3.555 -11.962 31.970 1.00 94.27 39 B 1 +ATOM 1243 C CA . PRO B 2 39 ? -4.692 -11.454 32.727 1.00 93.26 39 B 1 +ATOM 1244 C C . PRO B 2 39 ? -4.461 -10.033 33.258 1.00 93.50 39 B 1 +ATOM 1245 O O . PRO B 2 39 ? -3.433 -9.755 33.881 1.00 91.61 39 B 1 +ATOM 1246 C CB . PRO B 2 39 ? -4.907 -12.455 33.874 1.00 91.03 39 B 1 +ATOM 1247 C CG . PRO B 2 39 ? -4.348 -13.758 33.304 1.00 87.98 39 B 1 +ATOM 1248 C CD . PRO B 2 39 ? -3.171 -13.289 32.442 1.00 91.57 39 B 1 +ATOM 1249 N N . GLY B 2 40 ? -5.417 -9.135 32.999 1.00 91.79 40 B 1 +ATOM 1250 C CA . GLY B 2 40 ? -5.359 -7.739 33.445 1.00 92.00 40 B 1 +ATOM 1251 C C . GLY B 2 40 ? -4.331 -6.854 32.737 1.00 93.76 40 B 1 +ATOM 1252 O O . GLY B 2 40 ? -4.133 -5.716 33.154 1.00 91.72 40 B 1 +ATOM 1253 N N . GLN B 2 41 ? -3.673 -7.348 31.679 1.00 95.13 41 B 1 +ATOM 1254 C CA . GLN B 2 41 ? -2.693 -6.583 30.910 1.00 95.62 41 B 1 +ATOM 1255 C C . GLN B 2 41 ? -3.187 -6.306 29.486 1.00 96.45 41 B 1 +ATOM 1256 O O . GLN B 2 41 ? -4.039 -7.020 28.951 1.00 95.77 41 B 1 +ATOM 1257 C CB . GLN B 2 41 ? -1.337 -7.304 30.898 1.00 94.73 41 B 1 +ATOM 1258 C CG . GLN B 2 41 ? -0.766 -7.475 32.312 1.00 91.82 41 B 1 +ATOM 1259 C CD . GLN B 2 41 ? 0.655 -8.056 32.342 1.00 88.38 41 B 1 +ATOM 1260 O OE1 . GLN B 2 41 ? 1.275 -8.347 31.329 1.00 80.49 41 B 1 +ATOM 1261 N NE2 . GLN B 2 41 ? 1.215 -8.252 33.512 1.00 77.92 41 B 1 +ATOM 1262 N N . ALA B 2 42 ? -2.611 -5.288 28.870 1.00 96.76 42 B 1 +ATOM 1263 C CA . ALA B 2 42 ? -2.772 -5.043 27.448 1.00 97.02 42 B 1 +ATOM 1264 C C . ALA B 2 42 ? -2.142 -6.176 26.615 1.00 97.42 42 B 1 +ATOM 1265 O O . ALA B 2 42 ? -1.195 -6.827 27.072 1.00 96.73 42 B 1 +ATOM 1266 C CB . ALA B 2 42 ? -2.150 -3.688 27.103 1.00 96.05 42 B 1 +ATOM 1267 N N . PRO B 2 43 ? -2.629 -6.414 25.387 1.00 97.63 43 B 1 +ATOM 1268 C CA . PRO B 2 43 ? -1.974 -7.319 24.453 1.00 97.63 43 B 1 +ATOM 1269 C C . PRO B 2 43 ? -0.547 -6.873 24.131 1.00 97.48 43 B 1 +ATOM 1270 O O . PRO B 2 43 ? -0.228 -5.688 24.117 1.00 96.28 43 B 1 +ATOM 1271 C CB . PRO B 2 43 ? -2.852 -7.343 23.198 1.00 97.29 43 B 1 +ATOM 1272 C CG . PRO B 2 43 ? -4.210 -6.860 23.699 1.00 95.92 43 B 1 +ATOM 1273 C CD . PRO B 2 43 ? -3.852 -5.879 24.807 1.00 97.42 43 B 1 +ATOM 1274 N N . ARG B 2 44 ? 0.314 -7.844 23.813 1.00 96.75 44 B 1 +ATOM 1275 C CA . ARG B 2 44 ? 1.684 -7.614 23.348 1.00 96.54 44 B 1 +ATOM 1276 C C . ARG B 2 44 ? 1.896 -8.328 22.020 1.00 96.81 44 B 1 +ATOM 1277 O O . ARG B 2 44 ? 1.648 -9.530 21.941 1.00 96.16 44 B 1 +ATOM 1278 C CB . ARG B 2 44 ? 2.665 -8.102 24.425 1.00 95.01 44 B 1 +ATOM 1279 C CG . ARG B 2 44 ? 4.133 -7.919 24.001 1.00 87.13 44 B 1 +ATOM 1280 C CD . ARG B 2 44 ? 5.091 -8.486 25.058 1.00 83.93 44 B 1 +ATOM 1281 N NE . ARG B 2 44 ? 6.487 -8.389 24.609 1.00 73.79 44 B 1 +ATOM 1282 C CZ . ARG B 2 44 ? 7.546 -8.926 25.203 1.00 68.45 44 B 1 +ATOM 1283 N NH1 . ARG B 2 44 ? 7.427 -9.608 26.313 1.00 63.50 44 B 1 +ATOM 1284 N NH2 . ARG B 2 44 ? 8.728 -8.788 24.684 1.00 57.64 44 B 1 +ATOM 1285 N N . LEU B 2 45 ? 2.421 -7.630 21.014 1.00 96.21 45 B 1 +ATOM 1286 C CA . LEU B 2 45 ? 2.837 -8.246 19.761 1.00 95.55 45 B 1 +ATOM 1287 C C . LEU B 2 45 ? 4.026 -9.201 20.007 1.00 95.41 45 B 1 +ATOM 1288 O O . LEU B 2 45 ? 5.018 -8.820 20.615 1.00 94.37 45 B 1 +ATOM 1289 C CB . LEU B 2 45 ? 3.195 -7.140 18.754 1.00 94.15 45 B 1 +ATOM 1290 C CG . LEU B 2 45 ? 3.575 -7.642 17.346 1.00 92.67 45 B 1 +ATOM 1291 C CD1 . LEU B 2 45 ? 2.395 -8.277 16.608 1.00 90.43 45 B 1 +ATOM 1292 C CD2 . LEU B 2 45 ? 4.068 -6.465 16.501 1.00 89.78 45 B 1 +ATOM 1293 N N . LEU B 2 46 ? 3.907 -10.438 19.525 1.00 95.93 46 B 1 +ATOM 1294 C CA . LEU B 2 46 ? 4.956 -11.461 19.581 1.00 95.49 46 B 1 +ATOM 1295 C C . LEU B 2 46 ? 5.610 -11.679 18.230 1.00 94.52 46 B 1 +ATOM 1296 O O . LEU B 2 46 ? 6.830 -11.774 18.128 1.00 91.99 46 B 1 +ATOM 1297 C CB . LEU B 2 46 ? 4.350 -12.798 20.036 1.00 95.17 46 B 1 +ATOM 1298 C CG . LEU B 2 46 ? 3.761 -12.857 21.449 1.00 92.15 46 B 1 +ATOM 1299 C CD1 . LEU B 2 46 ? 3.245 -14.278 21.664 1.00 89.09 46 B 1 +ATOM 1300 C CD2 . LEU B 2 46 ? 4.803 -12.538 22.515 1.00 88.48 46 B 1 +ATOM 1301 N N . ILE B 2 47 ? 4.784 -11.825 17.185 1.00 93.96 47 B 1 +ATOM 1302 C CA . ILE B 2 47 ? 5.201 -12.203 15.836 1.00 93.95 47 B 1 +ATOM 1303 C C . ILE B 2 47 ? 4.474 -11.309 14.843 1.00 93.39 47 B 1 +ATOM 1304 O O . ILE B 2 47 ? 3.254 -11.177 14.903 1.00 92.23 47 B 1 +ATOM 1305 C CB . ILE B 2 47 ? 4.932 -13.699 15.576 1.00 94.08 47 B 1 +ATOM 1306 C CG1 . ILE B 2 47 ? 5.872 -14.555 16.454 1.00 92.12 47 B 1 +ATOM 1307 C CG2 . ILE B 2 47 ? 5.121 -14.061 14.086 1.00 92.24 47 B 1 +ATOM 1308 C CD1 . ILE B 2 47 ? 5.637 -16.070 16.376 1.00 86.06 47 B 1 +ATOM 1309 N N . TYR B 2 48 ? 5.249 -10.738 13.904 1.00 89.57 48 B 1 +ATOM 1310 C CA . TYR B 2 48 ? 4.759 -10.021 12.737 1.00 87.19 48 B 1 +ATOM 1311 C C . TYR B 2 48 ? 5.169 -10.751 11.458 1.00 86.34 48 B 1 +ATOM 1312 O O . TYR B 2 48 ? 6.085 -11.584 11.473 1.00 84.67 48 B 1 +ATOM 1313 C CB . TYR B 2 48 ? 5.243 -8.566 12.778 1.00 84.66 48 B 1 +ATOM 1314 C CG . TYR B 2 48 ? 6.738 -8.387 12.637 1.00 82.64 48 B 1 +ATOM 1315 C CD1 . TYR B 2 48 ? 7.590 -8.520 13.754 1.00 81.13 48 B 1 +ATOM 1316 C CD2 . TYR B 2 48 ? 7.293 -8.073 11.381 1.00 80.71 48 B 1 +ATOM 1317 C CE1 . TYR B 2 48 ? 8.973 -8.353 13.623 1.00 78.41 48 B 1 +ATOM 1318 C CE2 . TYR B 2 48 ? 8.681 -7.899 11.243 1.00 77.84 48 B 1 +ATOM 1319 C CZ . TYR B 2 48 ? 9.517 -8.044 12.368 1.00 78.66 48 B 1 +ATOM 1320 O OH . TYR B 2 48 ? 10.876 -7.888 12.230 1.00 74.69 48 B 1 +ATOM 1321 N N . ASP B 2 49 ? 4.463 -10.497 10.360 1.00 83.91 49 B 1 +ATOM 1322 C CA . ASP B 2 49 ? 4.726 -11.103 9.055 1.00 82.87 49 B 1 +ATOM 1323 C C . ASP B 2 49 ? 4.889 -12.639 9.110 1.00 84.41 49 B 1 +ATOM 1324 O O . ASP B 2 49 ? 5.835 -13.212 8.570 1.00 82.55 49 B 1 +ATOM 1325 C CB . ASP B 2 49 ? 5.892 -10.381 8.360 1.00 79.38 49 B 1 +ATOM 1326 C CG . ASP B 2 49 ? 5.511 -9.007 7.791 1.00 74.03 49 B 1 +ATOM 1327 O OD1 . ASP B 2 49 ? 4.305 -8.694 7.714 1.00 68.29 49 B 1 +ATOM 1328 O OD2 . ASP B 2 49 ? 6.414 -8.310 7.296 1.00 68.59 49 B 1 +ATOM 1329 N N . THR B 2 50 ? 3.974 -13.294 9.798 1.00 85.61 50 B 1 +ATOM 1330 C CA . THR B 2 50 ? 3.897 -14.757 9.990 1.00 88.57 50 B 1 +ATOM 1331 C C . THR B 2 50 ? 5.004 -15.364 10.861 1.00 90.49 50 B 1 +ATOM 1332 O O . THR B 2 50 ? 4.707 -16.248 11.670 1.00 89.93 50 B 1 +ATOM 1333 C CB . THR B 2 50 ? 3.823 -15.485 8.636 1.00 87.52 50 B 1 +ATOM 1334 O OG1 . THR B 2 50 ? 2.776 -14.943 7.851 1.00 82.55 50 B 1 +ATOM 1335 C CG2 . THR B 2 50 ? 3.577 -16.980 8.742 1.00 81.35 50 B 1 +ATOM 1336 N N . SER B 2 51 ? 6.262 -14.967 10.684 1.00 86.80 51 B 1 +ATOM 1337 C CA . SER B 2 51 ? 7.414 -15.706 11.219 1.00 86.22 51 B 1 +ATOM 1338 C C . SER B 2 51 ? 8.494 -14.845 11.869 1.00 86.08 51 B 1 +ATOM 1339 O O . SER B 2 51 ? 9.450 -15.380 12.437 1.00 84.02 51 B 1 +ATOM 1340 C CB . SER B 2 51 ? 8.018 -16.556 10.102 1.00 84.70 51 B 1 +ATOM 1341 O OG . SER B 2 51 ? 8.499 -15.746 9.055 1.00 78.96 51 B 1 +ATOM 1342 N N . ASN B 2 52 ? 8.368 -13.518 11.817 1.00 85.73 52 B 1 +ATOM 1343 C CA . ASN B 2 52 ? 9.344 -12.602 12.394 1.00 84.91 52 B 1 +ATOM 1344 C C . ASN B 2 52 ? 9.044 -12.344 13.871 1.00 86.96 52 B 1 +ATOM 1345 O O . ASN B 2 52 ? 7.971 -11.865 14.231 1.00 86.55 52 B 1 +ATOM 1346 C CB . ASN B 2 52 ? 9.379 -11.309 11.578 1.00 81.20 52 B 1 +ATOM 1347 C CG . ASN B 2 52 ? 9.876 -11.540 10.168 1.00 75.25 52 B 1 +ATOM 1348 O OD1 . ASN B 2 52 ? 10.916 -12.134 9.938 1.00 66.67 52 B 1 +ATOM 1349 N ND2 . ASN B 2 52 ? 9.142 -11.085 9.176 1.00 65.74 52 B 1 +ATOM 1350 N N . LEU B 2 53 ? 10.011 -12.655 14.741 1.00 86.97 53 B 1 +ATOM 1351 C CA . LEU B 2 53 ? 9.912 -12.354 16.163 1.00 87.64 53 B 1 +ATOM 1352 C C . LEU B 2 53 ? 10.138 -10.864 16.414 1.00 87.15 53 B 1 +ATOM 1353 O O . LEU B 2 53 ? 11.123 -10.306 15.945 1.00 85.10 53 B 1 +ATOM 1354 C CB . LEU B 2 53 ? 10.949 -13.185 16.942 1.00 87.00 53 B 1 +ATOM 1355 C CG . LEU B 2 53 ? 10.539 -14.653 17.124 1.00 83.19 53 B 1 +ATOM 1356 C CD1 . LEU B 2 53 ? 11.762 -15.503 17.464 1.00 78.10 53 B 1 +ATOM 1357 C CD2 . LEU B 2 53 ? 9.533 -14.820 18.256 1.00 78.74 53 B 1 +ATOM 1358 N N . VAL B 2 54 ? 9.269 -10.268 17.222 1.00 88.41 54 B 1 +ATOM 1359 C CA . VAL B 2 54 ? 9.483 -8.926 17.753 1.00 88.01 54 B 1 +ATOM 1360 C C . VAL B 2 54 ? 10.716 -8.919 18.663 1.00 87.65 54 B 1 +ATOM 1361 O O . VAL B 2 54 ? 11.013 -9.904 19.347 1.00 86.90 54 B 1 +ATOM 1362 C CB . VAL B 2 54 ? 8.224 -8.424 18.488 1.00 87.58 54 B 1 +ATOM 1363 C CG1 . VAL B 2 54 ? 8.417 -7.072 19.174 1.00 83.26 54 B 1 +ATOM 1364 C CG2 . VAL B 2 54 ? 7.080 -8.272 17.491 1.00 83.74 54 B 1 +ATOM 1365 N N . SER B 2 55 ? 11.449 -7.809 18.674 1.00 85.30 55 B 1 +ATOM 1366 C CA . SER B 2 55 ? 12.613 -7.659 19.544 1.00 84.51 55 B 1 +ATOM 1367 C C . SER B 2 55 ? 12.245 -7.881 21.015 1.00 86.27 55 B 1 +ATOM 1368 O O . SER B 2 55 ? 11.231 -7.393 21.508 1.00 84.33 55 B 1 +ATOM 1369 C CB . SER B 2 55 ? 13.237 -6.267 19.349 1.00 81.16 55 B 1 +ATOM 1370 O OG . SER B 2 55 ? 14.457 -6.214 20.069 1.00 69.99 55 B 1 +ATOM 1371 N N . GLY B 2 56 ? 13.066 -8.649 21.719 1.00 87.33 56 B 1 +ATOM 1372 C CA . GLY B 2 56 ? 12.829 -9.014 23.119 1.00 89.16 56 B 1 +ATOM 1373 C C . GLY B 2 56 ? 11.807 -10.134 23.348 1.00 91.77 56 B 1 +ATOM 1374 O O . GLY B 2 56 ? 11.551 -10.487 24.497 1.00 90.00 56 B 1 +ATOM 1375 N N . VAL B 2 57 ? 11.217 -10.716 22.291 1.00 92.37 57 B 1 +ATOM 1376 C CA . VAL B 2 57 ? 10.433 -11.951 22.403 1.00 93.67 57 B 1 +ATOM 1377 C C . VAL B 2 57 ? 11.389 -13.151 22.409 1.00 94.07 57 B 1 +ATOM 1378 O O . VAL B 2 57 ? 12.250 -13.243 21.535 1.00 93.00 57 B 1 +ATOM 1379 C CB . VAL B 2 57 ? 9.383 -12.074 21.282 1.00 93.63 57 B 1 +ATOM 1380 C CG1 . VAL B 2 57 ? 8.594 -13.378 21.385 1.00 90.16 57 B 1 +ATOM 1381 C CG2 . VAL B 2 57 ? 8.376 -10.920 21.376 1.00 89.67 57 B 1 +ATOM 1382 N N . PRO B 2 58 ? 11.248 -14.096 23.369 1.00 94.73 58 B 1 +ATOM 1383 C CA . PRO B 2 58 ? 12.135 -15.252 23.465 1.00 95.03 58 B 1 +ATOM 1384 C C . PRO B 2 58 ? 12.108 -16.148 22.217 1.00 95.33 58 B 1 +ATOM 1385 O O . PRO B 2 58 ? 11.055 -16.388 21.627 1.00 94.42 58 B 1 +ATOM 1386 C CB . PRO B 2 58 ? 11.681 -16.015 24.706 1.00 94.26 58 B 1 +ATOM 1387 C CG . PRO B 2 58 ? 10.994 -14.962 25.564 1.00 91.93 58 B 1 +ATOM 1388 C CD . PRO B 2 58 ? 10.359 -14.055 24.525 1.00 94.28 58 B 1 +ATOM 1389 N N . ALA B 2 59 ? 13.253 -16.747 21.865 1.00 93.81 59 B 1 +ATOM 1390 C CA . ALA B 2 59 ? 13.398 -17.589 20.683 1.00 93.37 59 B 1 +ATOM 1391 C C . ALA B 2 59 ? 12.569 -18.894 20.703 1.00 94.39 59 B 1 +ATOM 1392 O O . ALA B 2 59 ? 12.430 -19.547 19.668 1.00 92.53 59 B 1 +ATOM 1393 C CB . ALA B 2 59 ? 14.893 -17.888 20.498 1.00 91.12 59 B 1 +ATOM 1394 N N . ARG B 2 60 ? 12.005 -19.270 21.836 1.00 96.07 60 B 1 +ATOM 1395 C CA . ARG B 2 60 ? 11.075 -20.409 21.958 1.00 96.59 60 B 1 +ATOM 1396 C C . ARG B 2 60 ? 9.760 -20.205 21.208 1.00 96.87 60 B 1 +ATOM 1397 O O . ARG B 2 60 ? 9.120 -21.186 20.846 1.00 96.10 60 B 1 +ATOM 1398 C CB . ARG B 2 60 ? 10.846 -20.745 23.441 1.00 95.74 60 B 1 +ATOM 1399 C CG . ARG B 2 60 ? 10.137 -19.645 24.248 1.00 93.48 60 B 1 +ATOM 1400 C CD . ARG B 2 60 ? 9.932 -20.077 25.695 1.00 94.19 60 B 1 +ATOM 1401 N NE . ARG B 2 60 ? 9.272 -19.052 26.492 1.00 92.19 60 B 1 +ATOM 1402 C CZ . ARG B 2 60 ? 9.813 -18.118 27.252 1.00 94.17 60 B 1 +ATOM 1403 N NH1 . ARG B 2 60 ? 11.101 -17.944 27.347 1.00 83.47 60 B 1 +ATOM 1404 N NH2 . ARG B 2 60 ? 9.059 -17.332 27.952 1.00 87.43 60 B 1 +ATOM 1405 N N . PHE B 2 61 ? 9.391 -18.954 20.931 1.00 96.95 61 B 1 +ATOM 1406 C CA . PHE B 2 61 ? 8.261 -18.623 20.080 1.00 96.82 61 B 1 +ATOM 1407 C C . PHE B 2 61 ? 8.658 -18.694 18.599 1.00 96.24 61 B 1 +ATOM 1408 O O . PHE B 2 61 ? 9.695 -18.184 18.191 1.00 94.97 61 B 1 +ATOM 1409 C CB . PHE B 2 61 ? 7.693 -17.244 20.425 1.00 96.99 61 B 1 +ATOM 1410 C CG . PHE B 2 61 ? 7.065 -17.178 21.798 1.00 97.18 61 B 1 +ATOM 1411 C CD1 . PHE B 2 61 ? 5.690 -17.446 21.966 1.00 95.26 61 B 1 +ATOM 1412 C CD2 . PHE B 2 61 ? 7.834 -16.837 22.919 1.00 95.56 61 B 1 +ATOM 1413 C CE1 . PHE B 2 61 ? 5.101 -17.391 23.226 1.00 95.33 61 B 1 +ATOM 1414 C CE2 . PHE B 2 61 ? 7.252 -16.783 24.194 1.00 95.16 61 B 1 +ATOM 1415 C CZ . PHE B 2 61 ? 5.887 -17.063 24.342 1.00 96.42 61 B 1 +ATOM 1416 N N . SER B 2 62 ? 7.808 -19.303 17.784 1.00 96.08 62 B 1 +ATOM 1417 C CA . SER B 2 62 ? 7.954 -19.301 16.328 1.00 95.81 62 B 1 +ATOM 1418 C C . SER B 2 62 ? 6.590 -19.308 15.652 1.00 96.31 62 B 1 +ATOM 1419 O O . SER B 2 62 ? 5.635 -19.885 16.166 1.00 96.01 62 B 1 +ATOM 1420 C CB . SER B 2 62 ? 8.811 -20.481 15.864 1.00 94.65 62 B 1 +ATOM 1421 O OG . SER B 2 62 ? 8.234 -21.718 16.234 1.00 88.67 62 B 1 +ATOM 1422 N N . GLY B 2 63 ? 6.499 -18.678 14.486 1.00 95.00 63 B 1 +ATOM 1423 C CA . GLY B 2 63 ? 5.306 -18.654 13.658 1.00 94.59 63 B 1 +ATOM 1424 C C . GLY B 2 63 ? 5.587 -19.237 12.279 1.00 94.03 63 B 1 +ATOM 1425 O O . GLY B 2 63 ? 6.683 -19.079 11.732 1.00 92.23 63 B 1 +ATOM 1426 N N . SER B 2 64 ? 4.593 -19.922 11.719 1.00 94.20 64 B 1 +ATOM 1427 C CA . SER B 2 64 ? 4.650 -20.505 10.378 1.00 94.36 64 B 1 +ATOM 1428 C C . SER B 2 64 ? 3.261 -20.511 9.745 1.00 95.02 64 B 1 +ATOM 1429 O O . SER B 2 64 ? 2.266 -20.215 10.407 1.00 94.50 64 B 1 +ATOM 1430 C CB . SER B 2 64 ? 5.233 -21.921 10.449 1.00 93.13 64 B 1 +ATOM 1431 O OG . SER B 2 64 ? 4.415 -22.780 11.220 1.00 86.20 64 B 1 +ATOM 1432 N N . GLY B 2 65 ? 3.190 -20.878 8.465 1.00 92.24 65 B 1 +ATOM 1433 C CA . GLY B 2 65 ? 1.941 -21.022 7.733 1.00 91.97 65 B 1 +ATOM 1434 C C . GLY B 2 65 ? 1.893 -20.187 6.458 1.00 91.11 65 B 1 +ATOM 1435 O O . GLY B 2 65 ? 2.810 -19.409 6.160 1.00 87.70 65 B 1 +ATOM 1436 N N . SER B 2 66 ? 0.824 -20.392 5.691 1.00 88.63 66 B 1 +ATOM 1437 C CA . SER B 2 66 ? 0.555 -19.667 4.450 1.00 88.35 66 B 1 +ATOM 1438 C C . SER B 2 66 ? -0.914 -19.833 4.042 1.00 89.21 66 B 1 +ATOM 1439 O O . SER B 2 66 ? -1.588 -20.765 4.480 1.00 86.83 66 B 1 +ATOM 1440 C CB . SER B 2 66 ? 1.456 -20.178 3.318 1.00 85.40 66 B 1 +ATOM 1441 O OG . SER B 2 66 ? 1.239 -21.553 3.058 1.00 78.18 66 B 1 +ATOM 1442 N N . GLY B 2 67 ? -1.400 -18.946 3.174 1.00 86.60 67 B 1 +ATOM 1443 C CA . GLY B 2 67 ? -2.760 -19.049 2.653 1.00 86.46 67 B 1 +ATOM 1444 C C . GLY B 2 67 ? -3.824 -18.871 3.736 1.00 87.72 67 B 1 +ATOM 1445 O O . GLY B 2 67 ? -4.025 -17.757 4.218 1.00 85.81 67 B 1 +ATOM 1446 N N . THR B 2 68 ? -4.509 -19.963 4.102 1.00 91.14 68 B 1 +ATOM 1447 C CA . THR B 2 68 ? -5.579 -19.958 5.114 1.00 92.92 68 B 1 +ATOM 1448 C C . THR B 2 68 ? -5.118 -20.436 6.482 1.00 94.24 68 B 1 +ATOM 1449 O O . THR B 2 68 ? -5.781 -20.123 7.462 1.00 93.04 68 B 1 +ATOM 1450 C CB . THR B 2 68 ? -6.762 -20.821 4.664 1.00 91.74 68 B 1 +ATOM 1451 O OG1 . THR B 2 68 ? -6.335 -22.093 4.237 1.00 87.12 68 B 1 +ATOM 1452 C CG2 . THR B 2 68 ? -7.489 -20.170 3.490 1.00 85.95 68 B 1 +ATOM 1453 N N . ASP B 2 69 ? -4.007 -21.152 6.574 1.00 94.98 69 B 1 +ATOM 1454 C CA . ASP B 2 69 ? -3.627 -21.885 7.775 1.00 95.57 69 B 1 +ATOM 1455 C C . ASP B 2 69 ? -2.288 -21.422 8.335 1.00 95.65 69 B 1 +ATOM 1456 O O . ASP B 2 69 ? -1.244 -21.491 7.676 1.00 94.24 69 B 1 +ATOM 1457 C CB . ASP B 2 69 ? -3.657 -23.394 7.501 1.00 94.30 69 B 1 +ATOM 1458 C CG . ASP B 2 69 ? -5.057 -23.832 7.082 1.00 86.02 69 B 1 +ATOM 1459 O OD1 . ASP B 2 69 ? -5.954 -23.814 7.960 1.00 78.36 69 B 1 +ATOM 1460 O OD2 . ASP B 2 69 ? -5.255 -24.090 5.881 1.00 76.78 69 B 1 +ATOM 1461 N N . TYR B 2 70 ? -2.317 -20.970 9.587 1.00 96.70 70 B 1 +ATOM 1462 C CA . TYR B 2 70 ? -1.162 -20.431 10.297 1.00 96.77 70 B 1 +ATOM 1463 C C . TYR B 2 70 ? -1.033 -21.066 11.680 1.00 97.24 70 B 1 +ATOM 1464 O O . TYR B 2 70 ? -2.024 -21.421 12.317 1.00 96.60 70 B 1 +ATOM 1465 C CB . TYR B 2 70 ? -1.273 -18.909 10.394 1.00 95.45 70 B 1 +ATOM 1466 C CG . TYR B 2 70 ? -1.188 -18.210 9.058 1.00 94.52 70 B 1 +ATOM 1467 C CD1 . TYR B 2 70 ? 0.043 -17.701 8.601 1.00 91.14 70 B 1 +ATOM 1468 C CD2 . TYR B 2 70 ? -2.331 -18.076 8.244 1.00 91.41 70 B 1 +ATOM 1469 C CE1 . TYR B 2 70 ? 0.142 -17.060 7.359 1.00 89.87 70 B 1 +ATOM 1470 C CE2 . TYR B 2 70 ? -2.246 -17.443 6.990 1.00 89.89 70 B 1 +ATOM 1471 C CZ . TYR B 2 70 ? -1.009 -16.937 6.555 1.00 91.16 70 B 1 +ATOM 1472 O OH . TYR B 2 70 ? -0.911 -16.321 5.340 1.00 89.03 70 B 1 +ATOM 1473 N N . THR B 2 71 ? 0.199 -21.180 12.155 1.00 97.45 71 B 1 +ATOM 1474 C CA . THR B 2 71 ? 0.521 -21.821 13.427 1.00 97.56 71 B 1 +ATOM 1475 C C . THR B 2 71 ? 1.493 -20.978 14.243 1.00 97.59 71 B 1 +ATOM 1476 O O . THR B 2 71 ? 2.521 -20.541 13.730 1.00 96.51 71 B 1 +ATOM 1477 C CB . THR B 2 71 ? 1.087 -23.228 13.192 1.00 96.91 71 B 1 +ATOM 1478 O OG1 . THR B 2 71 ? 0.193 -23.997 12.427 1.00 86.49 71 B 1 +ATOM 1479 C CG2 . THR B 2 71 ? 1.313 -24.003 14.488 1.00 85.90 71 B 1 +ATOM 1480 N N . LEU B 2 72 ? 1.192 -20.808 15.527 1.00 97.61 72 B 1 +ATOM 1481 C CA . LEU B 2 72 ? 2.126 -20.354 16.548 1.00 97.82 72 B 1 +ATOM 1482 C C . LEU B 2 72 ? 2.620 -21.576 17.331 1.00 97.95 72 B 1 +ATOM 1483 O O . LEU B 2 72 ? 1.813 -22.359 17.829 1.00 97.53 72 B 1 +ATOM 1484 C CB . LEU B 2 72 ? 1.436 -19.333 17.467 1.00 97.74 72 B 1 +ATOM 1485 C CG . LEU B 2 72 ? 2.290 -18.844 18.652 1.00 97.21 72 B 1 +ATOM 1486 C CD1 . LEU B 2 72 ? 3.477 -18.009 18.192 1.00 95.24 72 B 1 +ATOM 1487 C CD2 . LEU B 2 72 ? 1.445 -17.976 19.582 1.00 95.08 72 B 1 +ATOM 1488 N N . THR B 2 73 ? 3.932 -21.709 17.471 1.00 97.49 73 B 1 +ATOM 1489 C CA . THR B 2 73 ? 4.553 -22.771 18.266 1.00 97.33 73 B 1 +ATOM 1490 C C . THR B 2 73 ? 5.376 -22.156 19.392 1.00 97.38 73 B 1 +ATOM 1491 O O . THR B 2 73 ? 6.171 -21.256 19.159 1.00 96.74 73 B 1 +ATOM 1492 C CB . THR B 2 73 ? 5.426 -23.680 17.390 1.00 96.85 73 B 1 +ATOM 1493 O OG1 . THR B 2 73 ? 4.673 -24.211 16.329 1.00 90.62 73 B 1 +ATOM 1494 C CG2 . THR B 2 73 ? 5.998 -24.861 18.158 1.00 89.30 73 B 1 +ATOM 1495 N N . ILE B 2 74 ? 5.205 -22.699 20.608 1.00 97.26 74 B 1 +ATOM 1496 C CA . ILE B 2 74 ? 6.068 -22.435 21.765 1.00 97.20 74 B 1 +ATOM 1497 C C . ILE B 2 74 ? 6.806 -23.735 22.056 1.00 97.11 74 B 1 +ATOM 1498 O O . ILE B 2 74 ? 6.184 -24.735 22.404 1.00 96.33 74 B 1 +ATOM 1499 C CB . ILE B 2 74 ? 5.260 -21.931 22.983 1.00 97.25 74 B 1 +ATOM 1500 C CG1 . ILE B 2 74 ? 4.240 -20.826 22.610 1.00 96.21 74 B 1 +ATOM 1501 C CG2 . ILE B 2 74 ? 6.253 -21.445 24.051 1.00 95.78 74 B 1 +ATOM 1502 C CD1 . ILE B 2 74 ? 3.330 -20.396 23.759 1.00 94.39 74 B 1 +ATOM 1503 N N . SER B 2 75 ? 8.123 -23.767 21.844 1.00 96.71 75 B 1 +ATOM 1504 C CA . SER B 2 75 ? 8.890 -25.017 21.834 1.00 96.50 75 B 1 +ATOM 1505 C C . SER B 2 75 ? 8.966 -25.710 23.195 1.00 96.55 75 B 1 +ATOM 1506 O O . SER B 2 75 ? 8.960 -26.939 23.248 1.00 94.49 75 B 1 +ATOM 1507 C CB . SER B 2 75 ? 10.301 -24.769 21.296 1.00 95.72 75 B 1 +ATOM 1508 O OG . SER B 2 75 ? 10.988 -23.802 22.066 1.00 89.65 75 B 1 +ATOM 1509 N N . SER B 2 76 ? 9.028 -24.926 24.261 1.00 96.60 76 B 1 +ATOM 1510 C CA . SER B 2 76 ? 9.052 -25.370 25.650 1.00 96.76 76 B 1 +ATOM 1511 C C . SER B 2 76 ? 8.410 -24.287 26.509 1.00 96.80 76 B 1 +ATOM 1512 O O . SER B 2 76 ? 8.954 -23.185 26.589 1.00 95.35 76 B 1 +ATOM 1513 C CB . SER B 2 76 ? 10.500 -25.609 26.081 1.00 95.52 76 B 1 +ATOM 1514 O OG . SER B 2 76 ? 10.553 -26.064 27.414 1.00 86.92 76 B 1 +ATOM 1515 N N . LEU B 2 77 ? 7.242 -24.567 27.071 1.00 96.43 77 B 1 +ATOM 1516 C CA . LEU B 2 77 ? 6.480 -23.601 27.844 1.00 96.53 77 B 1 +ATOM 1517 C C . LEU B 2 77 ? 7.200 -23.208 29.133 1.00 96.58 77 B 1 +ATOM 1518 O O . LEU B 2 77 ? 7.573 -24.069 29.934 1.00 95.10 77 B 1 +ATOM 1519 C CB . LEU B 2 77 ? 5.093 -24.167 28.172 1.00 95.64 77 B 1 +ATOM 1520 C CG . LEU B 2 77 ? 4.084 -24.075 27.018 1.00 92.94 77 B 1 +ATOM 1521 C CD1 . LEU B 2 77 ? 2.878 -24.957 27.319 1.00 89.08 77 B 1 +ATOM 1522 C CD2 . LEU B 2 77 ? 3.584 -22.643 26.821 1.00 89.59 77 B 1 +ATOM 1523 N N . GLU B 2 78 ? 7.320 -21.909 29.361 1.00 96.83 78 B 1 +ATOM 1524 C CA . GLU B 2 78 ? 7.750 -21.358 30.641 1.00 96.53 78 B 1 +ATOM 1525 C C . GLU B 2 78 ? 6.538 -20.838 31.433 1.00 96.54 78 B 1 +ATOM 1526 O O . GLU B 2 78 ? 5.487 -20.554 30.848 1.00 95.25 78 B 1 +ATOM 1527 C CB . GLU B 2 78 ? 8.818 -20.282 30.433 1.00 95.86 78 B 1 +ATOM 1528 C CG . GLU B 2 78 ? 10.132 -20.907 29.950 1.00 90.87 78 B 1 +ATOM 1529 C CD . GLU B 2 78 ? 11.301 -19.911 29.888 1.00 87.85 78 B 1 +ATOM 1530 O OE1 . GLU B 2 78 ? 12.306 -20.260 29.229 1.00 79.13 78 B 1 +ATOM 1531 O OE2 . GLU B 2 78 ? 11.200 -18.817 30.462 1.00 80.69 78 B 1 +ATOM 1532 N N . PRO B 2 79 ? 6.645 -20.677 32.755 1.00 95.59 79 B 1 +ATOM 1533 C CA . PRO B 2 79 ? 5.531 -20.201 33.578 1.00 94.99 79 B 1 +ATOM 1534 C C . PRO B 2 79 ? 4.919 -18.867 33.125 1.00 95.02 79 B 1 +ATOM 1535 O O . PRO B 2 79 ? 3.736 -18.622 33.320 1.00 93.61 79 B 1 +ATOM 1536 C CB . PRO B 2 79 ? 6.112 -20.081 34.990 1.00 93.81 79 B 1 +ATOM 1537 C CG . PRO B 2 79 ? 7.219 -21.134 35.008 1.00 91.81 79 B 1 +ATOM 1538 C CD . PRO B 2 79 ? 7.775 -21.067 33.589 1.00 94.51 79 B 1 +ATOM 1539 N N . GLU B 2 80 ? 5.727 -18.005 32.501 1.00 95.71 80 B 1 +ATOM 1540 C CA . GLU B 2 80 ? 5.288 -16.718 31.975 1.00 95.49 80 B 1 +ATOM 1541 C C . GLU B 2 80 ? 4.535 -16.796 30.635 1.00 96.02 80 B 1 +ATOM 1542 O O . GLU B 2 80 ? 3.981 -15.789 30.207 1.00 94.87 80 B 1 +ATOM 1543 C CB . GLU B 2 80 ? 6.505 -15.794 31.879 1.00 93.55 80 B 1 +ATOM 1544 C CG . GLU B 2 80 ? 7.562 -16.323 30.898 1.00 86.04 80 B 1 +ATOM 1545 C CD . GLU B 2 80 ? 8.968 -15.850 31.253 1.00 83.78 80 B 1 +ATOM 1546 O OE1 . GLU B 2 80 ? 9.698 -15.489 30.313 1.00 76.53 80 B 1 +ATOM 1547 O OE2 . GLU B 2 80 ? 9.282 -15.852 32.474 1.00 79.50 80 B 1 +ATOM 1548 N N . ASP B 2 81 ? 4.479 -17.980 30.003 1.00 96.03 81 B 1 +ATOM 1549 C CA . ASP B 2 81 ? 3.814 -18.200 28.721 1.00 96.58 81 B 1 +ATOM 1550 C C . ASP B 2 81 ? 2.339 -18.594 28.873 1.00 96.79 81 B 1 +ATOM 1551 O O . ASP B 2 81 ? 1.599 -18.611 27.889 1.00 95.57 81 B 1 +ATOM 1552 C CB . ASP B 2 81 ? 4.550 -19.269 27.909 1.00 96.35 81 B 1 +ATOM 1553 C CG . ASP B 2 81 ? 6.011 -18.926 27.624 1.00 96.20 81 B 1 +ATOM 1554 O OD1 . ASP B 2 81 ? 6.367 -17.736 27.511 1.00 92.88 81 B 1 +ATOM 1555 O OD2 . ASP B 2 81 ? 6.814 -19.867 27.441 1.00 93.31 81 B 1 +ATOM 1556 N N . PHE B 2 82 ? 1.873 -18.890 30.085 1.00 95.71 82 B 1 +ATOM 1557 C CA . PHE B 2 82 ? 0.468 -19.172 30.356 1.00 95.24 82 B 1 +ATOM 1558 C C . PHE B 2 82 ? -0.357 -17.881 30.265 1.00 95.09 82 B 1 +ATOM 1559 O O . PHE B 2 82 ? -0.343 -17.030 31.136 1.00 93.25 82 B 1 +ATOM 1560 C CB . PHE B 2 82 ? 0.315 -19.899 31.697 1.00 93.90 82 B 1 +ATOM 1561 C CG . PHE B 2 82 ? 0.958 -21.270 31.685 1.00 91.04 82 B 1 +ATOM 1562 C CD1 . PHE B 2 82 ? 0.291 -22.358 31.105 1.00 84.57 82 B 1 +ATOM 1563 C CD2 . PHE B 2 82 ? 2.253 -21.451 32.197 1.00 83.53 82 B 1 +ATOM 1564 C CE1 . PHE B 2 82 ? 0.901 -23.626 31.054 1.00 82.50 82 B 1 +ATOM 1565 C CE2 . PHE B 2 82 ? 2.875 -22.712 32.139 1.00 80.74 82 B 1 +ATOM 1566 C CZ . PHE B 2 82 ? 2.197 -23.794 31.565 1.00 84.46 82 B 1 +ATOM 1567 N N . ALA B 2 83 ? -1.046 -17.738 29.135 1.00 96.92 83 B 1 +ATOM 1568 C CA . ALA B 2 83 ? -1.730 -16.531 28.705 1.00 97.24 83 B 1 +ATOM 1569 C C . ALA B 2 83 ? -2.770 -16.865 27.620 1.00 97.64 83 B 1 +ATOM 1570 O O . ALA B 2 83 ? -2.900 -18.004 27.180 1.00 96.99 83 B 1 +ATOM 1571 C CB . ALA B 2 83 ? -0.671 -15.551 28.174 1.00 96.39 83 B 1 +ATOM 1572 N N . VAL B 2 84 ? -3.504 -15.851 27.153 1.00 97.80 84 B 1 +ATOM 1573 C CA . VAL B 2 84 ? -4.338 -15.960 25.952 1.00 98.18 84 B 1 +ATOM 1574 C C . VAL B 2 84 ? -3.554 -15.445 24.751 1.00 98.20 84 B 1 +ATOM 1575 O O . VAL B 2 84 ? -2.951 -14.374 24.809 1.00 97.94 84 B 1 +ATOM 1576 C CB . VAL B 2 84 ? -5.685 -15.224 26.107 1.00 97.78 84 B 1 +ATOM 1577 C CG1 . VAL B 2 84 ? -6.591 -15.509 24.901 1.00 95.44 84 B 1 +ATOM 1578 C CG2 . VAL B 2 84 ? -6.426 -15.677 27.364 1.00 95.18 84 B 1 +ATOM 1579 N N . TYR B 2 85 ? -3.579 -16.198 23.650 1.00 98.35 85 B 1 +ATOM 1580 C CA . TYR B 2 85 ? -2.926 -15.858 22.390 1.00 98.44 85 B 1 +ATOM 1581 C C . TYR B 2 85 ? -3.969 -15.566 21.317 1.00 98.47 85 B 1 +ATOM 1582 O O . TYR B 2 85 ? -4.913 -16.334 21.143 1.00 98.05 85 B 1 +ATOM 1583 C CB . TYR B 2 85 ? -1.994 -16.991 21.966 1.00 98.41 85 B 1 +ATOM 1584 C CG . TYR B 2 85 ? -0.844 -17.187 22.922 1.00 98.46 85 B 1 +ATOM 1585 C CD1 . TYR B 2 85 ? 0.364 -16.501 22.721 1.00 97.42 85 B 1 +ATOM 1586 C CD2 . TYR B 2 85 ? -0.988 -18.022 24.051 1.00 97.54 85 B 1 +ATOM 1587 C CE1 . TYR B 2 85 ? 1.422 -16.640 23.623 1.00 97.45 85 B 1 +ATOM 1588 C CE2 . TYR B 2 85 ? 0.066 -18.165 24.967 1.00 97.22 85 B 1 +ATOM 1589 C CZ . TYR B 2 85 ? 1.268 -17.469 24.749 1.00 97.97 85 B 1 +ATOM 1590 O OH . TYR B 2 85 ? 2.295 -17.595 25.650 1.00 97.34 85 B 1 +ATOM 1591 N N . TYR B 2 86 ? -3.791 -14.475 20.584 1.00 98.40 86 B 1 +ATOM 1592 C CA . TYR B 2 86 ? -4.661 -14.061 19.488 1.00 98.35 86 B 1 +ATOM 1593 C C . TYR B 2 86 ? -3.878 -14.012 18.186 1.00 98.23 86 B 1 +ATOM 1594 O O . TYR B 2 86 ? -2.796 -13.432 18.145 1.00 97.98 86 B 1 +ATOM 1595 C CB . TYR B 2 86 ? -5.281 -12.690 19.790 1.00 98.34 86 B 1 +ATOM 1596 C CG . TYR B 2 86 ? -6.182 -12.689 21.003 1.00 98.34 86 B 1 +ATOM 1597 C CD1 . TYR B 2 86 ? -7.531 -13.050 20.881 1.00 97.19 86 B 1 +ATOM 1598 C CD2 . TYR B 2 86 ? -5.670 -12.328 22.268 1.00 97.31 86 B 1 +ATOM 1599 C CE1 . TYR B 2 86 ? -8.374 -13.064 22.005 1.00 97.18 86 B 1 +ATOM 1600 C CE2 . TYR B 2 86 ? -6.504 -12.346 23.401 1.00 97.02 86 B 1 +ATOM 1601 C CZ . TYR B 2 86 ? -7.860 -12.721 23.267 1.00 97.70 86 B 1 +ATOM 1602 O OH . TYR B 2 86 ? -8.675 -12.757 24.363 1.00 96.84 86 B 1 +ATOM 1603 N N . CYS B 2 87 ? -4.444 -14.567 17.106 1.00 98.27 87 B 1 +ATOM 1604 C CA . CYS B 2 87 ? -3.995 -14.252 15.762 1.00 98.14 87 B 1 +ATOM 1605 C C . CYS B 2 87 ? -4.747 -13.026 15.232 1.00 97.97 87 B 1 +ATOM 1606 O O . CYS B 2 87 ? -5.879 -12.757 15.645 1.00 97.39 87 B 1 +ATOM 1607 C CB . CYS B 2 87 ? -4.115 -15.470 14.840 1.00 97.74 87 B 1 +ATOM 1608 S SG . CYS B 2 87 ? -5.810 -16.073 14.600 1.00 96.68 87 B 1 +ATOM 1609 N N . GLN B 2 88 ? -4.137 -12.291 14.298 1.00 96.88 88 B 1 +ATOM 1610 C CA . GLN B 2 88 ? -4.751 -11.149 13.638 1.00 96.00 88 B 1 +ATOM 1611 C C . GLN B 2 88 ? -4.379 -11.116 12.161 1.00 95.49 88 B 1 +ATOM 1612 O O . GLN B 2 88 ? -3.230 -11.347 11.802 1.00 93.91 88 B 1 +ATOM 1613 C CB . GLN B 2 88 ? -4.322 -9.850 14.327 1.00 94.57 88 B 1 +ATOM 1614 C CG . GLN B 2 88 ? -5.096 -8.634 13.804 1.00 90.73 88 B 1 +ATOM 1615 C CD . GLN B 2 88 ? -4.395 -7.303 14.059 1.00 87.68 88 B 1 +ATOM 1616 O OE1 . GLN B 2 88 ? -3.308 -7.227 14.598 1.00 79.62 88 B 1 +ATOM 1617 N NE2 . GLN B 2 88 ? -4.983 -6.210 13.635 1.00 76.69 88 B 1 +ATOM 1618 N N . GLN B 2 89 ? -5.332 -10.764 11.318 1.00 92.54 89 B 1 +ATOM 1619 C CA . GLN B 2 89 ? -5.083 -10.482 9.913 1.00 90.19 89 B 1 +ATOM 1620 C C . GLN B 2 89 ? -5.152 -8.969 9.638 1.00 87.69 89 B 1 +ATOM 1621 O O . GLN B 2 89 ? -6.016 -8.265 10.154 1.00 84.80 89 B 1 +ATOM 1622 C CB . GLN B 2 89 ? -6.020 -11.318 9.020 1.00 88.60 89 B 1 +ATOM 1623 C CG . GLN B 2 89 ? -7.497 -10.902 9.052 1.00 84.94 89 B 1 +ATOM 1624 C CD . GLN B 2 89 ? -7.836 -9.699 8.182 1.00 85.85 89 B 1 +ATOM 1625 O OE1 . GLN B 2 89 ? -7.162 -9.377 7.221 1.00 79.06 89 B 1 +ATOM 1626 N NE2 . GLN B 2 89 ? -8.904 -9.001 8.485 1.00 78.30 89 B 1 +ATOM 1627 N N . TRP B 2 90 ? -4.260 -8.512 8.767 1.00 83.39 90 B 1 +ATOM 1628 C CA . TRP B 2 90 ? -4.223 -7.143 8.244 1.00 79.77 90 B 1 +ATOM 1629 C C . TRP B 2 90 ? -4.604 -7.069 6.761 1.00 78.75 90 B 1 +ATOM 1630 O O . TRP B 2 90 ? -4.532 -6.010 6.145 1.00 73.13 90 B 1 +ATOM 1631 C CB . TRP B 2 90 ? -2.830 -6.567 8.485 1.00 76.04 90 B 1 +ATOM 1632 C CG . TRP B 2 90 ? -2.473 -6.349 9.923 1.00 72.66 90 B 1 +ATOM 1633 C CD1 . TRP B 2 90 ? -2.010 -7.271 10.782 1.00 63.30 90 B 1 +ATOM 1634 C CD2 . TRP B 2 90 ? -2.521 -5.083 10.663 1.00 68.85 90 B 1 +ATOM 1635 N NE1 . TRP B 2 90 ? -1.762 -6.683 12.017 1.00 61.27 90 B 1 +ATOM 1636 C CE2 . TRP B 2 90 ? -2.060 -5.333 11.979 1.00 63.05 90 B 1 +ATOM 1637 C CE3 . TRP B 2 90 ? -2.901 -3.772 10.335 1.00 60.17 90 B 1 +ATOM 1638 C CZ2 . TRP B 2 90 ? -1.974 -4.313 12.941 1.00 57.95 90 B 1 +ATOM 1639 C CZ3 . TRP B 2 90 ? -2.816 -2.755 11.289 1.00 56.07 90 B 1 +ATOM 1640 C CH2 . TRP B 2 90 ? -2.365 -3.024 12.580 1.00 57.19 90 B 1 +ATOM 1641 N N . ASN B 2 91 ? -4.998 -8.183 6.154 1.00 76.10 91 B 1 +ATOM 1642 C CA . ASN B 2 91 ? -5.108 -8.334 4.698 1.00 73.44 91 B 1 +ATOM 1643 C C . ASN B 2 91 ? -6.120 -7.372 4.066 1.00 73.37 91 B 1 +ATOM 1644 O O . ASN B 2 91 ? -5.873 -6.827 2.993 1.00 69.46 91 B 1 +ATOM 1645 C CB . ASN B 2 91 ? -5.474 -9.788 4.398 1.00 69.92 91 B 1 +ATOM 1646 C CG . ASN B 2 91 ? -5.110 -10.191 2.982 1.00 64.92 91 B 1 +ATOM 1647 O OD1 . ASN B 2 91 ? -3.978 -10.537 2.694 1.00 58.71 91 B 1 +ATOM 1648 N ND2 . ASN B 2 91 ? -6.045 -10.199 2.065 1.00 59.26 91 B 1 +ATOM 1649 N N . THR B 2 92 ? -7.263 -7.157 4.726 1.00 73.86 92 B 1 +ATOM 1650 C CA . THR B 2 92 ? -8.276 -6.188 4.308 1.00 74.88 92 B 1 +ATOM 1651 C C . THR B 2 92 ? -8.979 -5.611 5.537 1.00 77.78 92 B 1 +ATOM 1652 O O . THR B 2 92 ? -9.128 -6.304 6.542 1.00 76.64 92 B 1 +ATOM 1653 C CB . THR B 2 92 ? -9.364 -6.817 3.413 1.00 70.01 92 B 1 +ATOM 1654 O OG1 . THR B 2 92 ? -10.087 -7.815 4.097 1.00 61.89 92 B 1 +ATOM 1655 C CG2 . THR B 2 92 ? -8.811 -7.455 2.141 1.00 59.36 92 B 1 +ATOM 1656 N N . TYR B 2 93 ? -9.498 -4.396 5.409 1.00 77.44 93 B 1 +ATOM 1657 C CA . TYR B 2 93 ? -10.476 -3.889 6.365 1.00 79.03 93 B 1 +ATOM 1658 C C . TYR B 2 93 ? -11.817 -4.647 6.269 1.00 80.78 93 B 1 +ATOM 1659 O O . TYR B 2 93 ? -12.224 -5.044 5.178 1.00 80.22 93 B 1 +ATOM 1660 C CB . TYR B 2 93 ? -10.685 -2.385 6.154 1.00 77.52 93 B 1 +ATOM 1661 C CG . TYR B 2 93 ? -9.468 -1.561 6.485 1.00 76.80 93 B 1 +ATOM 1662 C CD1 . TYR B 2 93 ? -9.092 -1.371 7.822 1.00 73.77 93 B 1 +ATOM 1663 C CD2 . TYR B 2 93 ? -8.712 -0.973 5.458 1.00 74.50 93 B 1 +ATOM 1664 C CE1 . TYR B 2 93 ? -7.962 -0.603 8.142 1.00 71.90 93 B 1 +ATOM 1665 C CE2 . TYR B 2 93 ? -7.582 -0.204 5.767 1.00 71.28 93 B 1 +ATOM 1666 C CZ . TYR B 2 93 ? -7.200 -0.013 7.108 1.00 73.15 93 B 1 +ATOM 1667 O OH . TYR B 2 93 ? -6.100 0.734 7.416 1.00 68.09 93 B 1 +ATOM 1668 N N . PRO B 2 94 ? -12.534 -4.809 7.410 1.00 83.23 94 B 1 +ATOM 1669 C CA . PRO B 2 94 ? -12.049 -4.524 8.755 1.00 85.92 94 B 1 +ATOM 1670 C C . PRO B 2 94 ? -10.949 -5.519 9.164 1.00 87.57 94 B 1 +ATOM 1671 O O . PRO B 2 94 ? -10.990 -6.684 8.776 1.00 85.94 94 B 1 +ATOM 1672 C CB . PRO B 2 94 ? -13.276 -4.650 9.654 1.00 83.75 94 B 1 +ATOM 1673 C CG . PRO B 2 94 ? -14.109 -5.720 8.946 1.00 82.53 94 B 1 +ATOM 1674 C CD . PRO B 2 94 ? -13.848 -5.440 7.470 1.00 85.07 94 B 1 +ATOM 1675 N N . TYR B 2 95 ? -9.984 -5.074 9.949 1.00 87.11 95 B 1 +ATOM 1676 C CA . TYR B 2 95 ? -9.032 -5.984 10.571 1.00 89.02 95 B 1 +ATOM 1677 C C . TYR B 2 95 ? -9.752 -6.860 11.590 1.00 92.07 95 B 1 +ATOM 1678 O O . TYR B 2 95 ? -10.708 -6.426 12.226 1.00 91.91 95 B 1 +ATOM 1679 C CB . TYR B 2 95 ? -7.877 -5.223 11.219 1.00 85.92 95 B 1 +ATOM 1680 C CG . TYR B 2 95 ? -7.095 -4.332 10.281 1.00 84.09 95 B 1 +ATOM 1681 C CD1 . TYR B 2 95 ? -6.938 -4.667 8.926 1.00 78.71 95 B 1 +ATOM 1682 C CD2 . TYR B 2 95 ? -6.502 -3.153 10.784 1.00 77.92 95 B 1 +ATOM 1683 C CE1 . TYR B 2 95 ? -6.216 -3.827 8.068 1.00 74.26 95 B 1 +ATOM 1684 C CE2 . TYR B 2 95 ? -5.774 -2.314 9.933 1.00 73.92 95 B 1 +ATOM 1685 C CZ . TYR B 2 95 ? -5.640 -2.653 8.573 1.00 73.36 95 B 1 +ATOM 1686 O OH . TYR B 2 95 ? -4.945 -1.829 7.748 1.00 68.53 95 B 1 +ATOM 1687 N N . THR B 2 96 ? -9.320 -8.102 11.723 1.00 92.44 96 B 1 +ATOM 1688 C CA . THR B 2 96 ? -9.990 -9.059 12.603 1.00 94.27 96 B 1 +ATOM 1689 C C . THR B 2 96 ? -8.983 -9.850 13.416 1.00 95.07 96 B 1 +ATOM 1690 O O . THR B 2 96 ? -7.895 -10.183 12.937 1.00 94.77 96 B 1 +ATOM 1691 C CB . THR B 2 96 ? -10.918 -10.000 11.833 1.00 93.69 96 B 1 +ATOM 1692 O OG1 . THR B 2 96 ? -10.259 -10.622 10.750 1.00 90.18 96 B 1 +ATOM 1693 C CG2 . THR B 2 96 ? -12.117 -9.260 11.261 1.00 89.83 96 B 1 +ATOM 1694 N N . PHE B 2 97 ? -9.376 -10.172 14.633 1.00 96.83 97 B 1 +ATOM 1695 C CA . PHE B 2 97 ? -8.691 -11.109 15.509 1.00 97.37 97 B 1 +ATOM 1696 C C . PHE B 2 97 ? -9.392 -12.464 15.495 1.00 97.61 97 B 1 +ATOM 1697 O O . PHE B 2 97 ? -10.607 -12.552 15.290 1.00 97.02 97 B 1 +ATOM 1698 C CB . PHE B 2 97 ? -8.625 -10.541 16.922 1.00 97.18 97 B 1 +ATOM 1699 C CG . PHE B 2 97 ? -7.766 -9.305 17.056 1.00 97.17 97 B 1 +ATOM 1700 C CD1 . PHE B 2 97 ? -6.405 -9.431 17.395 1.00 95.60 97 B 1 +ATOM 1701 C CD2 . PHE B 2 97 ? -8.306 -8.025 16.858 1.00 95.87 97 B 1 +ATOM 1702 C CE1 . PHE B 2 97 ? -5.596 -8.296 17.547 1.00 95.58 97 B 1 +ATOM 1703 C CE2 . PHE B 2 97 ? -7.506 -6.884 17.002 1.00 95.36 97 B 1 +ATOM 1704 C CZ . PHE B 2 97 ? -6.151 -7.016 17.350 1.00 96.23 97 B 1 +ATOM 1705 N N . GLY B 2 98 ? -8.645 -13.530 15.764 1.00 97.61 98 B 1 +ATOM 1706 C CA . GLY B 2 98 ? -9.225 -14.806 16.162 1.00 97.77 98 B 1 +ATOM 1707 C C . GLY B 2 98 ? -9.871 -14.730 17.546 1.00 97.94 98 B 1 +ATOM 1708 O O . GLY B 2 98 ? -9.640 -13.786 18.307 1.00 97.32 98 B 1 +ATOM 1709 N N . GLY B 2 99 ? -10.655 -15.744 17.902 1.00 97.07 99 B 1 +ATOM 1710 C CA . GLY B 2 99 ? -11.342 -15.810 19.196 1.00 96.89 99 B 1 +ATOM 1711 C C . GLY B 2 99 ? -10.420 -15.995 20.409 1.00 97.45 99 B 1 +ATOM 1712 O O . GLY B 2 99 ? -10.880 -15.892 21.547 1.00 95.45 99 B 1 +ATOM 1713 N N . GLY B 2 100 ? -9.149 -16.262 20.171 1.00 97.53 100 B 1 +ATOM 1714 C CA . GLY B 2 100 ? -8.143 -16.533 21.188 1.00 97.78 100 B 1 +ATOM 1715 C C . GLY B 2 100 ? -7.993 -18.019 21.509 1.00 98.00 100 B 1 +ATOM 1716 O O . GLY B 2 100 ? -8.937 -18.796 21.450 1.00 96.88 100 B 1 +ATOM 1717 N N . THR B 2 101 ? -6.783 -18.402 21.891 1.00 97.83 101 B 1 +ATOM 1718 C CA . THR B 2 101 ? -6.472 -19.686 22.526 1.00 97.97 101 B 1 +ATOM 1719 C C . THR B 2 101 ? -5.904 -19.416 23.905 1.00 98.06 101 B 1 +ATOM 1720 O O . THR B 2 101 ? -4.866 -18.762 24.029 1.00 97.54 101 B 1 +ATOM 1721 C CB . THR B 2 101 ? -5.483 -20.514 21.696 1.00 97.62 101 B 1 +ATOM 1722 O OG1 . THR B 2 101 ? -6.074 -20.893 20.478 1.00 95.05 101 B 1 +ATOM 1723 C CG2 . THR B 2 101 ? -5.064 -21.809 22.403 1.00 94.93 101 B 1 +ATOM 1724 N N . LYS B 2 102 ? -6.561 -19.929 24.940 1.00 97.49 102 B 1 +ATOM 1725 C CA . LYS B 2 102 ? -6.045 -19.868 26.308 1.00 97.37 102 B 1 +ATOM 1726 C C . LYS B 2 102 ? -5.076 -21.022 26.534 1.00 97.28 102 B 1 +ATOM 1727 O O . LYS B 2 102 ? -5.471 -22.178 26.443 1.00 96.46 102 B 1 +ATOM 1728 C CB . LYS B 2 102 ? -7.223 -19.907 27.292 1.00 96.76 102 B 1 +ATOM 1729 C CG . LYS B 2 102 ? -6.770 -19.670 28.735 1.00 94.50 102 B 1 +ATOM 1730 C CD . LYS B 2 102 ? -7.952 -19.852 29.701 1.00 90.93 102 B 1 +ATOM 1731 C CE . LYS B 2 102 ? -7.486 -19.662 31.153 1.00 83.22 102 B 1 +ATOM 1732 N NZ . LYS B 2 102 ? -8.377 -20.384 32.095 1.00 74.47 102 B 1 +ATOM 1733 N N . VAL B 2 103 ? -3.839 -20.714 26.844 1.00 97.19 103 B 1 +ATOM 1734 C CA . VAL B 2 103 ? -2.861 -21.699 27.316 1.00 97.13 103 B 1 +ATOM 1735 C C . VAL B 2 103 ? -2.870 -21.652 28.841 1.00 96.88 103 B 1 +ATOM 1736 O O . VAL B 2 103 ? -2.585 -20.607 29.428 1.00 95.56 103 B 1 +ATOM 1737 C CB . VAL B 2 103 ? -1.450 -21.436 26.743 1.00 96.89 103 B 1 +ATOM 1738 C CG1 . VAL B 2 103 ? -0.487 -22.529 27.179 1.00 93.94 103 B 1 +ATOM 1739 C CG2 . VAL B 2 103 ? -1.487 -21.422 25.213 1.00 94.26 103 B 1 +ATOM 1740 N N . GLU B 2 104 ? -3.241 -22.746 29.473 1.00 96.32 104 B 1 +ATOM 1741 C CA . GLU B 2 104 ? -3.346 -22.856 30.927 1.00 95.65 104 B 1 +ATOM 1742 C C . GLU B 2 104 ? -2.520 -24.024 31.471 1.00 95.50 104 B 1 +ATOM 1743 O O . GLU B 2 104 ? -2.237 -24.989 30.759 1.00 93.94 104 B 1 +ATOM 1744 C CB . GLU B 2 104 ? -4.817 -22.903 31.378 1.00 92.69 104 B 1 +ATOM 1745 C CG . GLU B 2 104 ? -5.584 -24.165 30.953 1.00 86.38 104 B 1 +ATOM 1746 C CD . GLU B 2 104 ? -7.075 -24.109 31.349 1.00 85.80 104 B 1 +ATOM 1747 O OE1 . GLU B 2 104 ? -7.763 -25.140 31.198 1.00 79.08 104 B 1 +ATOM 1748 O OE2 . GLU B 2 104 ? -7.551 -23.030 31.772 1.00 81.70 104 B 1 +ATOM 1749 N N . ILE B 2 105 ? -2.100 -23.917 32.724 1.00 91.82 105 B 1 +ATOM 1750 C CA . ILE B 2 105 ? -1.349 -24.964 33.415 1.00 91.03 105 B 1 +ATOM 1751 C C . ILE B 2 105 ? -2.288 -26.150 33.658 1.00 90.44 105 B 1 +ATOM 1752 O O . ILE B 2 105 ? -3.430 -25.966 34.086 1.00 88.07 105 B 1 +ATOM 1753 C CB . ILE B 2 105 ? -0.715 -24.438 34.724 1.00 87.68 105 B 1 +ATOM 1754 C CG1 . ILE B 2 105 ? 0.297 -23.327 34.408 1.00 81.65 105 B 1 +ATOM 1755 C CG2 . ILE B 2 105 ? -0.025 -25.573 35.494 1.00 81.01 105 B 1 +ATOM 1756 C CD1 . ILE B 2 105 ? 0.897 -22.612 35.642 1.00 75.19 105 B 1 +ATOM 1757 N N . LYS B 2 106 ? -1.804 -27.346 33.364 1.00 87.71 106 B 1 +ATOM 1758 C CA . LYS B 2 106 ? -2.496 -28.613 33.578 1.00 87.56 106 B 1 +ATOM 1759 C C . LYS B 2 106 ? -2.489 -29.040 35.040 1.00 82.07 106 B 1 +ATOM 1760 O O . LYS B 2 106 ? -1.454 -28.866 35.698 1.00 74.98 106 B 1 +ATOM 1761 C CB . LYS B 2 106 ? -1.859 -29.686 32.695 1.00 81.63 106 B 1 +ATOM 1762 C CG . LYS B 2 106 ? -2.642 -31.001 32.726 1.00 77.35 106 B 1 +ATOM 1763 C CD . LYS B 2 106 ? -1.965 -32.010 31.812 1.00 74.99 106 B 1 +ATOM 1764 C CE . LYS B 2 106 ? -2.724 -33.320 31.785 1.00 68.72 106 B 1 +ATOM 1765 N NZ . LYS B 2 106 ? -2.043 -34.284 30.905 1.00 63.44 106 B 1 +ATOM 1766 O OXT . LYS B 2 106 ? -3.534 -29.594 35.462 1.00 72.07 106 B 1 +ATOM 1767 N N . ALA C 3 1 ? 24.011 -0.949 12.290 1.00 25.01 1 C 1 +ATOM 1768 C CA . ALA C 3 1 ? 22.924 -0.155 11.708 1.00 26.33 1 C 1 +ATOM 1769 C C . ALA C 3 1 ? 23.352 0.178 10.291 1.00 28.92 1 C 1 +ATOM 1770 O O . ALA C 3 1 ? 24.420 0.757 10.137 1.00 27.40 1 C 1 +ATOM 1771 C CB . ALA C 3 1 ? 22.690 1.104 12.552 1.00 24.33 1 C 1 +ATOM 1772 N N . VAL C 3 2 ? 22.625 -0.274 9.279 1.00 34.18 2 C 1 +ATOM 1773 C CA . VAL C 3 2 ? 22.929 0.102 7.892 1.00 33.74 2 C 1 +ATOM 1774 C C . VAL C 3 2 ? 22.435 1.538 7.740 1.00 34.93 2 C 1 +ATOM 1775 O O . VAL C 3 2 ? 21.241 1.754 7.559 1.00 32.95 2 C 1 +ATOM 1776 C CB . VAL C 3 2 ? 22.305 -0.867 6.874 1.00 31.52 2 C 1 +ATOM 1777 C CG1 . VAL C 3 2 ? 22.732 -0.522 5.451 1.00 29.06 2 C 1 +ATOM 1778 C CG2 . VAL C 3 2 ? 22.722 -2.321 7.154 1.00 30.05 2 C 1 +ATOM 1779 N N . ASN C 3 3 ? 23.314 2.502 7.932 1.00 34.65 3 C 1 +ATOM 1780 C CA . ASN C 3 3 ? 23.013 3.938 7.877 1.00 35.76 3 C 1 +ATOM 1781 C C . ASN C 3 3 ? 22.906 4.457 6.435 1.00 37.36 3 C 1 +ATOM 1782 O O . ASN C 3 3 ? 22.816 5.663 6.248 1.00 35.14 3 C 1 +ATOM 1783 C CB . ASN C 3 3 ? 24.103 4.713 8.651 1.00 33.36 3 C 1 +ATOM 1784 C CG . ASN C 3 3 ? 23.877 4.830 10.144 1.00 29.95 3 C 1 +ATOM 1785 O OD1 . ASN C 3 3 ? 22.909 4.379 10.719 1.00 27.84 3 C 1 +ATOM 1786 N ND2 . ASN C 3 3 ? 24.802 5.471 10.834 1.00 28.11 3 C 1 +ATOM 1787 N N . GLY C 3 4 ? 22.991 3.581 5.434 1.00 45.92 4 C 1 +ATOM 1788 C CA . GLY C 3 4 ? 22.890 3.997 4.043 1.00 48.43 4 C 1 +ATOM 1789 C C . GLY C 3 4 ? 21.516 4.597 3.766 1.00 51.44 4 C 1 +ATOM 1790 O O . GLY C 3 4 ? 20.494 4.052 4.192 1.00 48.94 4 C 1 +ATOM 1791 N N . THR C 3 5 ? 21.496 5.716 3.045 1.00 53.73 5 C 1 +ATOM 1792 C CA . THR C 3 5 ? 20.263 6.307 2.524 1.00 58.13 5 C 1 +ATOM 1793 C C . THR C 3 5 ? 19.610 5.331 1.552 1.00 62.66 5 C 1 +ATOM 1794 O O . THR C 3 5 ? 20.065 5.137 0.432 1.00 59.19 5 C 1 +ATOM 1795 C CB . THR C 3 5 ? 20.547 7.654 1.845 1.00 53.41 5 C 1 +ATOM 1796 O OG1 . THR C 3 5 ? 21.837 7.689 1.275 1.00 47.82 5 C 1 +ATOM 1797 C CG2 . THR C 3 5 ? 20.484 8.792 2.858 1.00 46.00 5 C 1 +ATOM 1798 N N . SER C 3 6 ? 18.527 4.685 2.004 1.00 71.27 6 C 1 +ATOM 1799 C CA . SER C 3 6 ? 17.701 3.845 1.156 1.00 74.12 6 C 1 +ATOM 1800 C C . SER C 3 6 ? 16.645 4.722 0.477 1.00 77.41 6 C 1 +ATOM 1801 O O . SER C 3 6 ? 15.873 5.401 1.155 1.00 74.93 6 C 1 +ATOM 1802 C CB . SER C 3 6 ? 17.049 2.735 1.979 1.00 68.42 6 C 1 +ATOM 1803 O OG . SER C 3 6 ? 16.234 1.914 1.162 1.00 62.18 6 C 1 +ATOM 1804 N N . GLN C 3 7 ? 16.585 4.683 -0.848 1.00 84.23 7 C 1 +ATOM 1805 C CA . GLN C 3 7 ? 15.541 5.323 -1.630 1.00 87.27 7 C 1 +ATOM 1806 C C . GLN C 3 7 ? 14.673 4.257 -2.284 1.00 89.34 7 C 1 +ATOM 1807 O O . GLN C 3 7 ? 15.163 3.408 -3.026 1.00 88.39 7 C 1 +ATOM 1808 C CB . GLN C 3 7 ? 16.159 6.291 -2.640 1.00 83.51 7 C 1 +ATOM 1809 C CG . GLN C 3 7 ? 15.070 7.120 -3.342 1.00 72.78 7 C 1 +ATOM 1810 C CD . GLN C 3 7 ? 15.636 8.159 -4.317 1.00 66.50 7 C 1 +ATOM 1811 O OE1 . GLN C 3 7 ? 16.822 8.234 -4.578 1.00 59.06 7 C 1 +ATOM 1812 N NE2 . GLN C 3 7 ? 14.798 8.988 -4.892 1.00 55.50 7 C 1 +ATOM 1813 N N . PHE C 3 8 ? 13.367 4.313 -2.023 1.00 89.16 8 C 1 +ATOM 1814 C CA . PHE C 3 8 ? 12.394 3.404 -2.620 1.00 91.08 8 C 1 +ATOM 1815 C C . PHE C 3 8 ? 11.317 4.210 -3.338 1.00 91.16 8 C 1 +ATOM 1816 O O . PHE C 3 8 ? 10.517 4.890 -2.707 1.00 89.17 8 C 1 +ATOM 1817 C CB . PHE C 3 8 ? 11.832 2.483 -1.532 1.00 90.70 8 C 1 +ATOM 1818 C CG . PHE C 3 8 ? 10.817 1.470 -2.025 1.00 91.19 8 C 1 +ATOM 1819 C CD1 . PHE C 3 8 ? 9.685 1.182 -1.249 1.00 86.75 8 C 1 +ATOM 1820 C CD2 . PHE C 3 8 ? 11.014 0.788 -3.240 1.00 86.93 8 C 1 +ATOM 1821 C CE1 . PHE C 3 8 ? 8.755 0.223 -1.680 1.00 88.21 8 C 1 +ATOM 1822 C CE2 . PHE C 3 8 ? 10.083 -0.161 -3.678 1.00 87.00 8 C 1 +ATOM 1823 C CZ . PHE C 3 8 ? 8.956 -0.449 -2.897 1.00 90.92 8 C 1 +ATOM 1824 N N . THR C 3 9 ? 11.322 4.156 -4.661 1.00 92.38 9 C 1 +ATOM 1825 C CA . THR C 3 9 ? 10.443 4.948 -5.523 1.00 91.90 9 C 1 +ATOM 1826 C C . THR C 3 9 ? 9.646 4.034 -6.434 1.00 92.92 9 C 1 +ATOM 1827 O O . THR C 3 9 ? 10.209 3.181 -7.113 1.00 92.75 9 C 1 +ATOM 1828 C CB . THR C 3 9 ? 11.245 5.960 -6.354 1.00 90.01 9 C 1 +ATOM 1829 O OG1 . THR C 3 9 ? 12.071 6.737 -5.520 1.00 82.21 9 C 1 +ATOM 1830 C CG2 . THR C 3 9 ? 10.333 6.936 -7.095 1.00 79.80 9 C 1 +ATOM 1831 N N . CYS C 3 10 ? 8.326 4.241 -6.477 1.00 92.09 10 C 1 +ATOM 1832 C CA . CYS C 3 10 ? 7.426 3.485 -7.343 1.00 92.73 10 C 1 +ATOM 1833 C C . CYS C 3 10 ? 6.516 4.424 -8.138 1.00 93.13 10 C 1 +ATOM 1834 O O . CYS C 3 10 ? 6.178 5.514 -7.687 1.00 92.07 10 C 1 +ATOM 1835 C CB . CYS C 3 10 ? 6.623 2.481 -6.514 1.00 93.10 10 C 1 +ATOM 1836 S SG . CYS C 3 10 ? 7.619 1.227 -5.658 1.00 92.48 10 C 1 +ATOM 1837 N N . PHE C 3 11 ? 6.105 3.972 -9.328 1.00 93.47 11 C 1 +ATOM 1838 C CA . PHE C 3 11 ? 5.184 4.694 -10.203 1.00 93.72 11 C 1 +ATOM 1839 C C . PHE C 3 11 ? 4.096 3.765 -10.729 1.00 93.84 11 C 1 +ATOM 1840 O O . PHE C 3 11 ? 4.373 2.636 -11.135 1.00 92.71 11 C 1 +ATOM 1841 C CB . PHE C 3 11 ? 5.946 5.327 -11.364 1.00 92.50 11 C 1 +ATOM 1842 C CG . PHE C 3 11 ? 6.886 6.434 -10.954 1.00 88.27 11 C 1 +ATOM 1843 C CD1 . PHE C 3 11 ? 6.378 7.698 -10.615 1.00 82.24 11 C 1 +ATOM 1844 C CD2 . PHE C 3 11 ? 8.271 6.209 -10.898 1.00 81.61 11 C 1 +ATOM 1845 C CE1 . PHE C 3 11 ? 7.242 8.734 -10.233 1.00 79.20 11 C 1 +ATOM 1846 C CE2 . PHE C 3 11 ? 9.146 7.245 -10.516 1.00 79.30 11 C 1 +ATOM 1847 C CZ . PHE C 3 11 ? 8.629 8.503 -10.183 1.00 83.36 11 C 1 +ATOM 1848 N N . TYR C 3 12 ? 2.874 4.259 -10.781 1.00 92.84 12 C 1 +ATOM 1849 C CA . TYR C 3 12 ? 1.728 3.555 -11.338 1.00 93.22 12 C 1 +ATOM 1850 C C . TYR C 3 12 ? 1.460 4.012 -12.770 1.00 92.92 12 C 1 +ATOM 1851 O O . TYR C 3 12 ? 1.342 5.202 -13.035 1.00 91.56 12 C 1 +ATOM 1852 C CB . TYR C 3 12 ? 0.523 3.771 -10.429 1.00 93.01 12 C 1 +ATOM 1853 C CG . TYR C 3 12 ? -0.746 3.089 -10.890 1.00 91.87 12 C 1 +ATOM 1854 C CD1 . TYR C 3 12 ? -1.946 3.821 -11.003 1.00 83.78 12 C 1 +ATOM 1855 C CD2 . TYR C 3 12 ? -0.755 1.714 -11.170 1.00 83.44 12 C 1 +ATOM 1856 C CE1 . TYR C 3 12 ? -3.139 3.184 -11.380 1.00 84.78 12 C 1 +ATOM 1857 C CE2 . TYR C 3 12 ? -1.939 1.071 -11.559 1.00 82.97 12 C 1 +ATOM 1858 C CZ . TYR C 3 12 ? -3.128 1.806 -11.658 1.00 90.68 12 C 1 +ATOM 1859 O OH . TYR C 3 12 ? -4.286 1.176 -12.013 1.00 89.70 12 C 1 +ATOM 1860 N N . ASN C 3 13 ? 1.293 3.072 -13.700 1.00 89.47 13 C 1 +ATOM 1861 C CA . ASN C 3 13 ? 1.004 3.409 -15.099 1.00 88.81 13 C 1 +ATOM 1862 C C . ASN C 3 13 ? -0.484 3.718 -15.377 1.00 88.33 13 C 1 +ATOM 1863 O O . ASN C 3 13 ? -0.891 3.772 -16.532 1.00 85.67 13 C 1 +ATOM 1864 C CB . ASN C 3 13 ? 1.550 2.305 -16.028 1.00 87.83 13 C 1 +ATOM 1865 C CG . ASN C 3 13 ? 0.654 1.083 -16.122 1.00 85.89 13 C 1 +ATOM 1866 O OD1 . ASN C 3 13 ? -0.191 0.831 -15.275 1.00 81.81 13 C 1 +ATOM 1867 N ND2 . ASN C 3 13 ? 0.786 0.319 -17.179 1.00 81.68 13 C 1 +ATOM 1868 N N . SER C 3 14 ? -1.289 3.896 -14.337 1.00 87.54 14 C 1 +ATOM 1869 C CA . SER C 3 14 ? -2.739 4.152 -14.360 1.00 87.99 14 C 1 +ATOM 1870 C C . SER C 3 14 ? -3.653 2.951 -14.651 1.00 88.34 14 C 1 +ATOM 1871 O O . SER C 3 14 ? -4.876 3.096 -14.590 1.00 85.46 14 C 1 +ATOM 1872 C CB . SER C 3 14 ? -3.083 5.333 -15.267 1.00 87.37 14 C 1 +ATOM 1873 O OG . SER C 3 14 ? -3.171 4.948 -16.625 1.00 86.00 14 C 1 +ATOM 1874 N N . ARG C 3 15 ? -3.104 1.769 -14.922 1.00 86.53 15 C 1 +ATOM 1875 C CA . ARG C 3 15 ? -3.881 0.560 -15.261 1.00 87.63 15 C 1 +ATOM 1876 C C . ARG C 3 15 ? -3.546 -0.632 -14.367 1.00 86.75 15 C 1 +ATOM 1877 O O . ARG C 3 15 ? -4.186 -0.804 -13.318 1.00 81.98 15 C 1 +ATOM 1878 C CB . ARG C 3 15 ? -3.707 0.229 -16.760 1.00 85.86 15 C 1 +ATOM 1879 C CG . ARG C 3 15 ? -4.323 1.258 -17.720 1.00 83.69 15 C 1 +ATOM 1880 C CD . ARG C 3 15 ? -5.848 1.298 -17.607 1.00 80.45 15 C 1 +ATOM 1881 N NE . ARG C 3 15 ? -6.430 1.997 -18.761 1.00 75.52 15 C 1 +ATOM 1882 C CZ . ARG C 3 15 ? -7.683 1.913 -19.192 1.00 68.29 15 C 1 +ATOM 1883 N NH1 . ARG C 3 15 ? -8.608 1.286 -18.519 1.00 62.14 15 C 1 +ATOM 1884 N NH2 . ARG C 3 15 ? -8.011 2.461 -20.315 1.00 63.80 15 C 1 +ATOM 1885 N N . ALA C 3 16 ? -2.579 -1.451 -14.757 1.00 87.48 16 C 1 +ATOM 1886 C CA . ALA C 3 16 ? -2.287 -2.732 -14.121 1.00 87.80 16 C 1 +ATOM 1887 C C . ALA C 3 16 ? -0.805 -2.965 -13.809 1.00 88.71 16 C 1 +ATOM 1888 O O . ALA C 3 16 ? -0.394 -4.105 -13.601 1.00 86.71 16 C 1 +ATOM 1889 C CB . ALA C 3 16 ? -2.890 -3.842 -14.999 1.00 86.44 16 C 1 +ATOM 1890 N N . ASN C 3 17 ? 0.012 -1.913 -13.763 1.00 90.24 17 C 1 +ATOM 1891 C CA . ASN C 3 17 ? 1.445 -2.032 -13.512 1.00 91.85 17 C 1 +ATOM 1892 C C . ASN C 3 17 ? 1.942 -0.964 -12.522 1.00 92.49 17 C 1 +ATOM 1893 O O . ASN C 3 17 ? 1.636 0.217 -12.676 1.00 91.90 17 C 1 +ATOM 1894 C CB . ASN C 3 17 ? 2.195 -1.974 -14.849 1.00 90.42 17 C 1 +ATOM 1895 C CG . ASN C 3 17 ? 3.669 -2.239 -14.672 1.00 81.95 17 C 1 +ATOM 1896 O OD1 . ASN C 3 17 ? 4.435 -1.371 -14.319 1.00 71.94 17 C 1 +ATOM 1897 N ND2 . ASN C 3 17 ? 4.104 -3.453 -14.890 1.00 70.75 17 C 1 +ATOM 1898 N N . ILE C 3 18 ? 2.727 -1.403 -11.537 1.00 91.32 18 C 1 +ATOM 1899 C CA . ILE C 3 18 ? 3.526 -0.530 -10.672 1.00 92.52 18 C 1 +ATOM 1900 C C . ILE C 3 18 ? 4.995 -0.863 -10.918 1.00 92.39 18 C 1 +ATOM 1901 O O . ILE C 3 18 ? 5.422 -1.997 -10.679 1.00 91.05 18 C 1 +ATOM 1902 C CB . ILE C 3 18 ? 3.131 -0.680 -9.185 1.00 93.64 18 C 1 +ATOM 1903 C CG1 . ILE C 3 18 ? 1.645 -0.326 -8.945 1.00 92.34 18 C 1 +ATOM 1904 C CG2 . ILE C 3 18 ? 4.042 0.211 -8.317 1.00 91.69 18 C 1 +ATOM 1905 C CD1 . ILE C 3 18 ? 1.142 -0.684 -7.536 1.00 90.62 18 C 1 +ATOM 1906 N N . SER C 3 19 ? 5.769 0.114 -11.374 1.00 93.95 19 C 1 +ATOM 1907 C CA . SER C 3 19 ? 7.213 -0.013 -11.545 1.00 93.47 19 C 1 +ATOM 1908 C C . SER C 3 19 ? 7.922 0.528 -10.312 1.00 94.02 19 C 1 +ATOM 1909 O O . SER C 3 19 ? 7.655 1.665 -9.924 1.00 92.98 19 C 1 +ATOM 1910 C CB . SER C 3 19 ? 7.689 0.758 -12.778 1.00 91.59 19 C 1 +ATOM 1911 O OG . SER C 3 19 ? 7.085 0.242 -13.947 1.00 75.53 19 C 1 +ATOM 1912 N N . CYS C 3 20 ? 8.826 -0.244 -9.726 1.00 92.99 20 C 1 +ATOM 1913 C CA . CYS C 3 20 ? 9.569 0.133 -8.535 1.00 93.09 20 C 1 +ATOM 1914 C C . CYS C 3 20 ? 11.075 0.122 -8.789 1.00 93.13 20 C 1 +ATOM 1915 O O . CYS C 3 20 ? 11.583 -0.768 -9.467 1.00 91.80 20 C 1 +ATOM 1916 C CB . CYS C 3 20 ? 9.198 -0.799 -7.377 1.00 93.21 20 C 1 +ATOM 1917 S SG . CYS C 3 20 ? 7.488 -0.600 -6.800 1.00 92.38 20 C 1 +ATOM 1918 N N . VAL C 3 21 ? 11.766 1.093 -8.196 1.00 93.48 21 C 1 +ATOM 1919 C CA . VAL C 3 21 ? 13.221 1.158 -8.112 1.00 92.91 21 C 1 +ATOM 1920 C C . VAL C 3 21 ? 13.591 1.324 -6.648 1.00 92.78 21 C 1 +ATOM 1921 O O . VAL C 3 21 ? 13.059 2.182 -5.954 1.00 92.21 21 C 1 +ATOM 1922 C CB . VAL C 3 21 ? 13.798 2.311 -8.950 1.00 91.59 21 C 1 +ATOM 1923 C CG1 . VAL C 3 21 ? 15.330 2.353 -8.855 1.00 83.70 21 C 1 +ATOM 1924 C CG2 . VAL C 3 21 ? 13.428 2.157 -10.432 1.00 83.70 21 C 1 +ATOM 1925 N N . TRP C 3 22 ? 14.501 0.491 -6.182 1.00 93.09 22 C 1 +ATOM 1926 C CA . TRP C 3 22 ? 15.071 0.572 -4.846 1.00 92.54 22 C 1 +ATOM 1927 C C . TRP C 3 22 ? 16.571 0.784 -4.953 1.00 91.92 22 C 1 +ATOM 1928 O O . TRP C 3 22 ? 17.245 0.062 -5.686 1.00 90.52 22 C 1 +ATOM 1929 C CB . TRP C 3 22 ? 14.724 -0.690 -4.067 1.00 91.65 22 C 1 +ATOM 1930 C CG . TRP C 3 22 ? 15.305 -0.744 -2.692 1.00 90.64 22 C 1 +ATOM 1931 C CD1 . TRP C 3 22 ? 15.156 0.186 -1.722 1.00 88.38 22 C 1 +ATOM 1932 C CD2 . TRP C 3 22 ? 16.148 -1.793 -2.112 1.00 89.70 22 C 1 +ATOM 1933 N NE1 . TRP C 3 22 ? 15.818 -0.216 -0.581 1.00 87.57 22 C 1 +ATOM 1934 C CE2 . TRP C 3 22 ? 16.431 -1.432 -0.771 1.00 88.34 22 C 1 +ATOM 1935 C CE3 . TRP C 3 22 ? 16.663 -3.006 -2.603 1.00 87.76 22 C 1 +ATOM 1936 C CZ2 . TRP C 3 22 ? 17.180 -2.273 0.085 1.00 86.57 22 C 1 +ATOM 1937 C CZ3 . TRP C 3 22 ? 17.410 -3.837 -1.762 1.00 86.57 22 C 1 +ATOM 1938 C CH2 . TRP C 3 22 ? 17.667 -3.477 -0.428 1.00 86.05 22 C 1 +ATOM 1939 N N . SER C 3 23 ? 17.088 1.774 -4.239 1.00 91.47 23 C 1 +ATOM 1940 C CA . SER C 3 23 ? 18.512 2.066 -4.159 1.00 89.97 23 C 1 +ATOM 1941 C C . SER C 3 23 ? 18.956 2.029 -2.707 1.00 88.97 23 C 1 +ATOM 1942 O O . SER C 3 23 ? 18.282 2.592 -1.839 1.00 86.55 23 C 1 +ATOM 1943 C CB . SER C 3 23 ? 18.840 3.430 -4.786 1.00 87.48 23 C 1 +ATOM 1944 O OG . SER C 3 23 ? 18.412 3.462 -6.143 1.00 75.62 23 C 1 +ATOM 1945 N N . GLN C 3 24 ? 20.074 1.369 -2.436 1.00 86.20 24 C 1 +ATOM 1946 C CA . GLN C 3 24 ? 20.652 1.308 -1.102 1.00 83.41 24 C 1 +ATOM 1947 C C . GLN C 3 24 ? 22.169 1.203 -1.187 1.00 81.54 24 C 1 +ATOM 1948 O O . GLN C 3 24 ? 22.705 0.374 -1.922 1.00 75.67 24 C 1 +ATOM 1949 C CB . GLN C 3 24 ? 20.035 0.142 -0.317 1.00 79.49 24 C 1 +ATOM 1950 C CG . GLN C 3 24 ? 20.616 0.044 1.102 1.00 73.28 24 C 1 +ATOM 1951 C CD . GLN C 3 24 ? 19.789 -0.793 2.069 1.00 70.38 24 C 1 +ATOM 1952 O OE1 . GLN C 3 24 ? 18.696 -1.232 1.805 1.00 63.77 24 C 1 +ATOM 1953 N NE2 . GLN C 3 24 ? 20.288 -1.006 3.267 1.00 61.44 24 C 1 +ATOM 1954 N N . ASP C 3 25 ? 22.845 2.015 -0.365 1.00 78.66 25 C 1 +ATOM 1955 C CA . ASP C 3 25 ? 24.288 1.932 -0.216 1.00 75.17 25 C 1 +ATOM 1956 C C . ASP C 3 25 ? 24.669 0.688 0.603 1.00 72.91 25 C 1 +ATOM 1957 O O . ASP C 3 25 ? 24.139 0.433 1.688 1.00 65.72 25 C 1 +ATOM 1958 C CB . ASP C 3 25 ? 24.823 3.210 0.450 1.00 70.94 25 C 1 +ATOM 1959 C CG . ASP C 3 25 ? 24.587 4.471 -0.385 1.00 64.59 25 C 1 +ATOM 1960 O OD1 . ASP C 3 25 ? 24.642 4.364 -1.626 1.00 58.11 25 C 1 +ATOM 1961 O OD2 . ASP C 3 25 ? 24.349 5.529 0.241 1.00 57.93 25 C 1 +ATOM 1962 N N . GLY C 3 26 ? 25.629 -0.089 0.105 1.00 68.84 26 C 1 +ATOM 1963 C CA . GLY C 3 26 ? 26.198 -1.251 0.779 1.00 66.37 26 C 1 +ATOM 1964 C C . GLY C 3 26 ? 26.044 -2.569 0.017 1.00 66.24 26 C 1 +ATOM 1965 O O . GLY C 3 26 ? 25.319 -2.692 -0.966 1.00 61.19 26 C 1 +ATOM 1966 N N . ALA C 3 27 ? 26.760 -3.590 0.491 1.00 58.15 27 C 1 +ATOM 1967 C CA . ALA C 3 27 ? 26.845 -4.885 -0.167 1.00 57.11 27 C 1 +ATOM 1968 C C . ALA C 3 27 ? 25.596 -5.738 0.111 1.00 60.33 27 C 1 +ATOM 1969 O O . ALA C 3 27 ? 25.536 -6.464 1.095 1.00 56.45 27 C 1 +ATOM 1970 C CB . ALA C 3 27 ? 28.144 -5.565 0.272 1.00 49.67 27 C 1 +ATOM 1971 N N . LEU C 3 28 ? 24.636 -5.693 -0.805 1.00 64.31 28 C 1 +ATOM 1972 C CA . LEU C 3 28 ? 23.507 -6.629 -0.870 1.00 63.10 28 C 1 +ATOM 1973 C C . LEU C 3 28 ? 23.606 -7.574 -2.087 1.00 63.62 28 C 1 +ATOM 1974 O O . LEU C 3 28 ? 22.609 -8.159 -2.487 1.00 59.92 28 C 1 +ATOM 1975 C CB . LEU C 3 28 ? 22.189 -5.833 -0.853 1.00 58.79 28 C 1 +ATOM 1976 C CG . LEU C 3 28 ? 21.864 -5.194 0.509 1.00 55.36 28 C 1 +ATOM 1977 C CD1 . LEU C 3 28 ? 20.740 -4.181 0.333 1.00 53.24 28 C 1 +ATOM 1978 C CD2 . LEU C 3 28 ? 21.392 -6.229 1.539 1.00 53.18 28 C 1 +ATOM 1979 N N . GLN C 3 29 ? 24.793 -7.717 -2.674 1.00 63.54 29 C 1 +ATOM 1980 C CA . GLN C 3 29 ? 25.004 -8.361 -3.976 1.00 62.68 29 C 1 +ATOM 1981 C C . GLN C 3 29 ? 24.388 -9.761 -4.085 1.00 64.07 29 C 1 +ATOM 1982 O O . GLN C 3 29 ? 23.679 -10.043 -5.045 1.00 58.60 29 C 1 +ATOM 1983 C CB . GLN C 3 29 ? 26.509 -8.423 -4.283 1.00 56.88 29 C 1 +ATOM 1984 C CG . GLN C 3 29 ? 27.090 -7.041 -4.625 1.00 51.64 29 C 1 +ATOM 1985 C CD . GLN C 3 29 ? 28.571 -7.093 -5.015 1.00 46.05 29 C 1 +ATOM 1986 O OE1 . GLN C 3 29 ? 29.275 -8.052 -4.799 1.00 42.95 29 C 1 +ATOM 1987 N NE2 . GLN C 3 29 ? 29.089 -6.039 -5.588 1.00 40.55 29 C 1 +ATOM 1988 N N . ASP C 3 30 ? 24.598 -10.615 -3.068 1.00 64.54 30 C 1 +ATOM 1989 C CA . ASP C 3 30 ? 24.125 -12.011 -3.094 1.00 66.21 30 C 1 +ATOM 1990 C C . ASP C 3 30 ? 22.787 -12.217 -2.371 1.00 69.62 30 C 1 +ATOM 1991 O O . ASP C 3 30 ? 22.411 -13.343 -2.017 1.00 65.02 30 C 1 +ATOM 1992 C CB . ASP C 3 30 ? 25.230 -12.924 -2.545 1.00 60.62 30 C 1 +ATOM 1993 C CG . ASP C 3 30 ? 26.506 -12.898 -3.389 1.00 54.66 30 C 1 +ATOM 1994 O OD1 . ASP C 3 30 ? 26.385 -12.797 -4.627 1.00 49.13 30 C 1 +ATOM 1995 O OD2 . ASP C 3 30 ? 27.582 -12.994 -2.774 1.00 48.46 30 C 1 +ATOM 1996 N N . THR C 3 31 ? 22.049 -11.148 -2.107 1.00 75.80 31 C 1 +ATOM 1997 C CA . THR C 3 31 ? 20.786 -11.229 -1.366 1.00 77.85 31 C 1 +ATOM 1998 C C . THR C 3 31 ? 19.602 -11.166 -2.323 1.00 80.48 31 C 1 +ATOM 1999 O O . THR C 3 31 ? 19.420 -10.196 -3.037 1.00 78.22 31 C 1 +ATOM 2000 C CB . THR C 3 31 ? 20.686 -10.136 -0.295 1.00 73.47 31 C 1 +ATOM 2001 O OG1 . THR C 3 31 ? 21.850 -10.130 0.503 1.00 65.31 31 C 1 +ATOM 2002 C CG2 . THR C 3 31 ? 19.521 -10.389 0.661 1.00 63.09 31 C 1 +ATOM 2003 N N . SER C 3 32 ? 18.736 -12.197 -2.286 1.00 83.82 32 C 1 +ATOM 2004 C CA . SER C 3 32 ? 17.460 -12.163 -3.006 1.00 85.30 32 C 1 +ATOM 2005 C C . SER C 3 32 ? 16.507 -11.177 -2.327 1.00 86.46 32 C 1 +ATOM 2006 O O . SER C 3 32 ? 16.200 -11.328 -1.141 1.00 84.89 32 C 1 +ATOM 2007 C CB . SER C 3 32 ? 16.851 -13.566 -3.076 1.00 82.66 32 C 1 +ATOM 2008 O OG . SER C 3 32 ? 15.573 -13.537 -3.673 1.00 70.36 32 C 1 +ATOM 2009 N N . CYS C 3 33 ? 16.045 -10.189 -3.078 1.00 87.90 33 C 1 +ATOM 2010 C CA . CYS C 3 33 ? 15.092 -9.195 -2.629 1.00 89.56 33 C 1 +ATOM 2011 C C . CYS C 3 33 ? 13.859 -9.154 -3.543 1.00 90.84 33 C 1 +ATOM 2012 O O . CYS C 3 33 ? 13.932 -9.434 -4.737 1.00 89.95 33 C 1 +ATOM 2013 C CB . CYS C 3 33 ? 15.763 -7.817 -2.520 1.00 88.77 33 C 1 +ATOM 2014 S SG . CYS C 3 33 ? 17.155 -7.731 -1.347 1.00 87.62 33 C 1 +ATOM 2015 N N . GLN C 3 34 ? 12.720 -8.781 -2.974 1.00 90.56 34 C 1 +ATOM 2016 C CA . GLN C 3 34 ? 11.469 -8.629 -3.698 1.00 90.95 34 C 1 +ATOM 2017 C C . GLN C 3 34 ? 10.704 -7.399 -3.217 1.00 92.04 34 C 1 +ATOM 2018 O O . GLN C 3 34 ? 10.830 -6.992 -2.063 1.00 92.04 34 C 1 +ATOM 2019 C CB . GLN C 3 34 ? 10.625 -9.911 -3.595 1.00 88.14 34 C 1 +ATOM 2020 C CG . GLN C 3 34 ? 10.190 -10.240 -2.159 1.00 81.31 34 C 1 +ATOM 2021 C CD . GLN C 3 34 ? 9.330 -11.506 -2.051 1.00 80.05 34 C 1 +ATOM 2022 O OE1 . GLN C 3 34 ? 8.994 -12.166 -3.020 1.00 71.47 34 C 1 +ATOM 2023 N NE2 . GLN C 3 34 ? 8.918 -11.879 -0.859 1.00 68.77 34 C 1 +ATOM 2024 N N . VAL C 3 35 ? 9.864 -6.836 -4.081 1.00 91.63 35 C 1 +ATOM 2025 C CA . VAL C 3 35 ? 8.821 -5.901 -3.682 1.00 92.72 35 C 1 +ATOM 2026 C C . VAL C 3 35 ? 7.541 -6.685 -3.435 1.00 92.42 35 C 1 +ATOM 2027 O O . VAL C 3 35 ? 7.146 -7.512 -4.247 1.00 91.71 35 C 1 +ATOM 2028 C CB . VAL C 3 35 ? 8.606 -4.768 -4.699 1.00 93.47 35 C 1 +ATOM 2029 C CG1 . VAL C 3 35 ? 7.490 -3.813 -4.261 1.00 90.35 35 C 1 +ATOM 2030 C CG2 . VAL C 3 35 ? 9.883 -3.946 -4.863 1.00 89.33 35 C 1 +ATOM 2031 N N . HIS C 3 36 ? 6.891 -6.404 -2.316 1.00 92.00 36 C 1 +ATOM 2032 C CA . HIS C 3 36 ? 5.573 -6.916 -1.973 1.00 90.37 36 C 1 +ATOM 2033 C C . HIS C 3 36 ? 4.558 -5.763 -1.945 1.00 90.80 36 C 1 +ATOM 2034 O O . HIS C 3 36 ? 4.768 -4.775 -1.251 1.00 90.83 36 C 1 +ATOM 2035 C CB . HIS C 3 36 ? 5.651 -7.636 -0.620 1.00 87.68 36 C 1 +ATOM 2036 C CG . HIS C 3 36 ? 4.323 -8.153 -0.159 1.00 80.92 36 C 1 +ATOM 2037 N ND1 . HIS C 3 36 ? 3.508 -7.579 0.790 1.00 69.01 36 C 1 +ATOM 2038 C CD2 . HIS C 3 36 ? 3.684 -9.260 -0.631 1.00 68.84 36 C 1 +ATOM 2039 C CE1 . HIS C 3 36 ? 2.398 -8.320 0.888 1.00 65.32 36 C 1 +ATOM 2040 N NE2 . HIS C 3 36 ? 2.475 -9.356 0.040 1.00 66.31 36 C 1 +ATOM 2041 N N . ALA C 3 37 ? 3.469 -5.906 -2.700 1.00 90.57 37 C 1 +ATOM 2042 C CA . ALA C 3 37 ? 2.373 -4.954 -2.788 1.00 89.91 37 C 1 +ATOM 2043 C C . ALA C 3 37 ? 1.127 -5.507 -2.111 1.00 88.23 37 C 1 +ATOM 2044 O O . ALA C 3 37 ? 0.659 -6.594 -2.450 1.00 85.91 37 C 1 +ATOM 2045 C CB . ALA C 3 37 ? 2.087 -4.638 -4.255 1.00 90.76 37 C 1 +ATOM 2046 N N . TRP C 3 38 ? 0.561 -4.719 -1.200 1.00 85.18 38 C 1 +ATOM 2047 C CA . TRP C 3 38 ? -0.614 -5.120 -0.432 1.00 83.17 38 C 1 +ATOM 2048 C C . TRP C 3 38 ? -1.636 -3.981 -0.349 1.00 84.71 38 C 1 +ATOM 2049 O O . TRP C 3 38 ? -1.514 -3.085 0.491 1.00 83.05 38 C 1 +ATOM 2050 C CB . TRP C 3 38 ? -0.138 -5.621 0.924 1.00 77.32 38 C 1 +ATOM 2051 C CG . TRP C 3 38 ? -1.041 -6.588 1.611 1.00 69.77 38 C 1 +ATOM 2052 C CD1 . TRP C 3 38 ? -2.247 -7.023 1.201 1.00 60.90 38 C 1 +ATOM 2053 C CD2 . TRP C 3 38 ? -0.761 -7.276 2.867 1.00 63.93 38 C 1 +ATOM 2054 N NE1 . TRP C 3 38 ? -2.747 -7.931 2.114 1.00 56.29 38 C 1 +ATOM 2055 C CE2 . TRP C 3 38 ? -1.865 -8.103 3.154 1.00 58.51 38 C 1 +ATOM 2056 C CE3 . TRP C 3 38 ? 0.312 -7.260 3.779 1.00 54.90 38 C 1 +ATOM 2057 C CZ2 . TRP C 3 38 ? -1.912 -8.889 4.321 1.00 53.78 38 C 1 +ATOM 2058 C CZ3 . TRP C 3 38 ? 0.262 -8.029 4.932 1.00 52.17 38 C 1 +ATOM 2059 C CH2 . TRP C 3 38 ? -0.835 -8.832 5.206 1.00 51.58 38 C 1 +ATOM 2060 N N . PRO C 3 39 ? -2.659 -3.971 -1.214 1.00 80.63 39 C 1 +ATOM 2061 C CA . PRO C 3 39 ? -3.688 -2.944 -1.206 1.00 79.61 39 C 1 +ATOM 2062 C C . PRO C 3 39 ? -4.576 -3.016 0.042 1.00 78.98 39 C 1 +ATOM 2063 O O . PRO C 3 39 ? -4.924 -4.099 0.502 1.00 76.32 39 C 1 +ATOM 2064 C CB . PRO C 3 39 ? -4.519 -3.147 -2.479 1.00 78.13 39 C 1 +ATOM 2065 C CG . PRO C 3 39 ? -3.641 -4.028 -3.351 1.00 75.95 39 C 1 +ATOM 2066 C CD . PRO C 3 39 ? -2.842 -4.850 -2.356 1.00 79.64 39 C 1 +ATOM 2067 N N . ASP C 3 40 ? -4.967 -1.872 0.571 1.00 78.56 40 C 1 +ATOM 2068 C CA . ASP C 3 40 ? -5.750 -1.790 1.807 1.00 74.13 40 C 1 +ATOM 2069 C C . ASP C 3 40 ? -7.231 -2.170 1.640 1.00 73.04 40 C 1 +ATOM 2070 O O . ASP C 3 40 ? -7.861 -2.644 2.586 1.00 68.23 40 C 1 +ATOM 2071 C CB . ASP C 3 40 ? -5.570 -0.396 2.430 1.00 69.99 40 C 1 +ATOM 2072 C CG . ASP C 3 40 ? -6.291 0.738 1.701 1.00 63.23 40 C 1 +ATOM 2073 O OD1 . ASP C 3 40 ? -6.500 0.611 0.475 1.00 56.93 40 C 1 +ATOM 2074 O OD2 . ASP C 3 40 ? -6.662 1.714 2.388 1.00 59.38 40 C 1 +ATOM 2075 N N . ARG C 3 41 ? -7.770 -2.050 0.431 1.00 72.39 41 C 1 +ATOM 2076 C CA . ARG C 3 41 ? -9.185 -2.304 0.096 1.00 70.77 41 C 1 +ATOM 2077 C C . ARG C 3 41 ? -9.396 -3.472 -0.878 1.00 70.50 41 C 1 +ATOM 2078 O O . ARG C 3 41 ? -10.489 -3.648 -1.414 1.00 65.80 41 C 1 +ATOM 2079 C CB . ARG C 3 41 ? -9.815 -1.009 -0.435 1.00 67.71 41 C 1 +ATOM 2080 C CG . ARG C 3 41 ? -9.815 0.084 0.647 1.00 63.57 41 C 1 +ATOM 2081 C CD . ARG C 3 41 ? -10.412 1.381 0.110 1.00 59.94 41 C 1 +ATOM 2082 N NE . ARG C 3 41 ? -10.439 2.392 1.176 1.00 55.30 41 C 1 +ATOM 2083 C CZ . ARG C 3 41 ? -11.103 3.527 1.166 1.00 50.30 41 C 1 +ATOM 2084 N NH1 . ARG C 3 41 ? -11.785 3.919 0.129 1.00 46.64 41 C 1 +ATOM 2085 N NH2 . ARG C 3 41 ? -11.080 4.271 2.221 1.00 44.49 41 C 1 +ATOM 2086 N N . ARG C 3 42 ? -8.349 -4.251 -1.137 1.00 68.62 42 C 1 +ATOM 2087 C CA . ARG C 3 42 ? -8.383 -5.354 -2.106 1.00 67.52 42 C 1 +ATOM 2088 C C . ARG C 3 42 ? -7.984 -6.669 -1.426 1.00 65.23 42 C 1 +ATOM 2089 O O . ARG C 3 42 ? -7.158 -6.684 -0.524 1.00 61.03 42 C 1 +ATOM 2090 C CB . ARG C 3 42 ? -7.465 -5.044 -3.305 1.00 67.74 42 C 1 +ATOM 2091 C CG . ARG C 3 42 ? -7.707 -3.682 -3.992 1.00 68.25 42 C 1 +ATOM 2092 C CD . ARG C 3 42 ? -9.076 -3.581 -4.643 1.00 65.44 42 C 1 +ATOM 2093 N NE . ARG C 3 42 ? -9.270 -2.238 -5.217 1.00 67.14 42 C 1 +ATOM 2094 C CZ . ARG C 3 42 ? -10.318 -1.798 -5.888 1.00 64.16 42 C 1 +ATOM 2095 N NH1 . ARG C 3 42 ? -11.341 -2.571 -6.143 1.00 58.94 42 C 1 +ATOM 2096 N NH2 . ARG C 3 42 ? -10.365 -0.566 -6.282 1.00 62.84 42 C 1 +ATOM 2097 N N . ARG C 3 43 ? -8.566 -7.772 -1.892 1.00 67.33 43 C 1 +ATOM 2098 C CA . ARG C 3 43 ? -8.285 -9.122 -1.378 1.00 65.36 43 C 1 +ATOM 2099 C C . ARG C 3 43 ? -7.201 -9.844 -2.189 1.00 67.15 43 C 1 +ATOM 2100 O O . ARG C 3 43 ? -7.309 -11.042 -2.438 1.00 62.71 43 C 1 +ATOM 2101 C CB . ARG C 3 43 ? -9.569 -9.951 -1.282 1.00 60.49 43 C 1 +ATOM 2102 C CG . ARG C 3 43 ? -10.575 -9.385 -0.274 1.00 53.50 43 C 1 +ATOM 2103 C CD . ARG C 3 43 ? -11.725 -10.376 -0.120 1.00 47.92 43 C 1 +ATOM 2104 N NE . ARG C 3 43 ? -12.720 -9.909 0.853 1.00 42.34 43 C 1 +ATOM 2105 C CZ . ARG C 3 43 ? -13.787 -10.577 1.263 1.00 36.65 43 C 1 +ATOM 2106 N NH1 . ARG C 3 43 ? -14.058 -11.762 0.795 1.00 32.59 43 C 1 +ATOM 2107 N NH2 . ARG C 3 43 ? -14.581 -10.063 2.140 1.00 32.01 43 C 1 +ATOM 2108 N N . TRP C 3 44 ? -6.197 -9.121 -2.630 1.00 68.29 44 C 1 +ATOM 2109 C CA . TRP C 3 44 ? -5.069 -9.698 -3.344 1.00 68.36 44 C 1 +ATOM 2110 C C . TRP C 3 44 ? -3.781 -9.024 -2.892 1.00 69.09 44 C 1 +ATOM 2111 O O . TRP C 3 44 ? -3.785 -7.905 -2.384 1.00 67.73 44 C 1 +ATOM 2112 C CB . TRP C 3 44 ? -5.279 -9.576 -4.857 1.00 68.41 44 C 1 +ATOM 2113 C CG . TRP C 3 44 ? -5.490 -8.195 -5.401 1.00 70.96 44 C 1 +ATOM 2114 C CD1 . TRP C 3 44 ? -6.691 -7.651 -5.732 1.00 66.31 44 C 1 +ATOM 2115 C CD2 . TRP C 3 44 ? -4.496 -7.163 -5.706 1.00 71.62 44 C 1 +ATOM 2116 N NE1 . TRP C 3 44 ? -6.512 -6.368 -6.215 1.00 64.79 44 C 1 +ATOM 2117 C CE2 . TRP C 3 44 ? -5.180 -6.021 -6.212 1.00 68.67 44 C 1 +ATOM 2118 C CE3 . TRP C 3 44 ? -3.093 -7.098 -5.602 1.00 67.31 44 C 1 +ATOM 2119 C CZ2 . TRP C 3 44 ? -4.489 -4.842 -6.580 1.00 66.49 44 C 1 +ATOM 2120 C CZ3 . TRP C 3 44 ? -2.416 -5.928 -5.965 1.00 64.31 44 C 1 +ATOM 2121 C CH2 . TRP C 3 44 ? -3.109 -4.816 -6.444 1.00 63.93 44 C 1 +ATOM 2122 N N . ASN C 3 45 ? -2.674 -9.714 -3.087 1.00 75.46 45 C 1 +ATOM 2123 C CA . ASN C 3 45 ? -1.331 -9.170 -3.002 1.00 75.72 45 C 1 +ATOM 2124 C C . ASN C 3 45 ? -0.558 -9.555 -4.265 1.00 78.57 45 C 1 +ATOM 2125 O O . ASN C 3 45 ? -0.977 -10.420 -5.032 1.00 76.44 45 C 1 +ATOM 2126 C CB . ASN C 3 45 ? -0.665 -9.637 -1.695 1.00 71.14 45 C 1 +ATOM 2127 C CG . ASN C 3 45 ? -0.370 -11.134 -1.628 1.00 64.78 45 C 1 +ATOM 2128 O OD1 . ASN C 3 45 ? -0.726 -11.933 -2.463 1.00 57.26 45 C 1 +ATOM 2129 N ND2 . ASN C 3 45 ? 0.330 -11.553 -0.605 1.00 58.02 45 C 1 +ATOM 2130 N N . GLN C 3 46 ? 0.574 -8.894 -4.489 1.00 80.97 46 C 1 +ATOM 2131 C CA . GLN C 3 46 ? 1.445 -9.194 -5.623 1.00 84.40 46 C 1 +ATOM 2132 C C . GLN C 3 46 ? 2.893 -9.004 -5.202 1.00 86.99 46 C 1 +ATOM 2133 O O . GLN C 3 46 ? 3.213 -8.109 -4.421 1.00 86.44 46 C 1 +ATOM 2134 C CB . GLN C 3 46 ? 1.056 -8.291 -6.806 1.00 82.93 46 C 1 +ATOM 2135 C CG . GLN C 3 46 ? 1.781 -8.648 -8.110 1.00 76.42 46 C 1 +ATOM 2136 C CD . GLN C 3 46 ? 1.505 -10.085 -8.551 1.00 74.68 46 C 1 +ATOM 2137 O OE1 . GLN C 3 46 ? 0.383 -10.562 -8.558 1.00 67.43 46 C 1 +ATOM 2138 N NE2 . GLN C 3 46 ? 2.517 -10.842 -8.904 1.00 63.48 46 C 1 +ATOM 2139 N N . THR C 3 47 ? 3.776 -9.820 -5.759 1.00 87.25 47 C 1 +ATOM 2140 C CA . THR C 3 47 ? 5.218 -9.676 -5.569 1.00 88.06 47 C 1 +ATOM 2141 C C . THR C 3 47 ? 5.934 -9.552 -6.904 1.00 88.96 47 C 1 +ATOM 2142 O O . THR C 3 47 ? 5.429 -9.993 -7.944 1.00 88.20 47 C 1 +ATOM 2143 C CB . THR C 3 47 ? 5.810 -10.845 -4.753 1.00 85.22 47 C 1 +ATOM 2144 O OG1 . THR C 3 47 ? 5.523 -12.080 -5.362 1.00 78.36 47 C 1 +ATOM 2145 C CG2 . THR C 3 47 ? 5.240 -10.903 -3.342 1.00 77.10 47 C 1 +ATOM 2146 N N . CYS C 3 48 ? 7.123 -8.941 -6.896 1.00 90.60 48 C 1 +ATOM 2147 C CA . CYS C 3 48 ? 8.069 -8.991 -7.997 1.00 91.36 48 C 1 +ATOM 2148 C C . CYS C 3 48 ? 9.494 -9.087 -7.456 1.00 91.98 48 C 1 +ATOM 2149 O O . CYS C 3 48 ? 9.822 -8.439 -6.462 1.00 91.16 48 C 1 +ATOM 2150 C CB . CYS C 3 48 ? 7.899 -7.785 -8.937 1.00 90.70 48 C 1 +ATOM 2151 S SG . CYS C 3 48 ? 7.948 -6.117 -8.212 1.00 90.40 48 C 1 +ATOM 2152 N N . GLU C 3 49 ? 10.319 -9.896 -8.099 1.00 89.63 49 C 1 +ATOM 2153 C CA . GLU C 3 49 ? 11.731 -10.017 -7.766 1.00 89.88 49 C 1 +ATOM 2154 C C . GLU C 3 49 ? 12.491 -8.768 -8.205 1.00 90.17 49 C 1 +ATOM 2155 O O . GLU C 3 49 ? 12.315 -8.285 -9.322 1.00 89.07 49 C 1 +ATOM 2156 C CB . GLU C 3 49 ? 12.284 -11.290 -8.416 1.00 87.51 49 C 1 +ATOM 2157 C CG . GLU C 3 49 ? 13.736 -11.576 -7.998 1.00 77.14 49 C 1 +ATOM 2158 C CD . GLU C 3 49 ? 14.257 -12.912 -8.546 1.00 71.48 49 C 1 +ATOM 2159 O OE1 . GLU C 3 49 ? 15.340 -13.325 -8.078 1.00 63.31 49 C 1 +ATOM 2160 O OE2 . GLU C 3 49 ? 13.579 -13.514 -9.401 1.00 66.42 49 C 1 +ATOM 2161 N N . LEU C 3 50 ? 13.310 -8.223 -7.307 1.00 89.76 50 C 1 +ATOM 2162 C CA . LEU C 3 50 ? 14.180 -7.092 -7.594 1.00 90.60 50 C 1 +ATOM 2163 C C . LEU C 3 50 ? 15.424 -7.577 -8.336 1.00 90.09 50 C 1 +ATOM 2164 O O . LEU C 3 50 ? 16.215 -8.356 -7.800 1.00 88.07 50 C 1 +ATOM 2165 C CB . LEU C 3 50 ? 14.543 -6.374 -6.288 1.00 90.84 50 C 1 +ATOM 2166 C CG . LEU C 3 50 ? 13.445 -5.423 -5.778 1.00 90.82 50 C 1 +ATOM 2167 C CD1 . LEU C 3 50 ? 13.737 -5.015 -4.342 1.00 87.35 50 C 1 +ATOM 2168 C CD2 . LEU C 3 50 ? 13.365 -4.143 -6.617 1.00 88.39 50 C 1 +ATOM 2169 N N . LEU C 3 51 ? 15.615 -7.074 -9.546 1.00 90.01 51 C 1 +ATOM 2170 C CA . LEU C 3 51 ? 16.769 -7.365 -10.385 1.00 88.98 51 C 1 +ATOM 2171 C C . LEU C 3 51 ? 17.702 -6.152 -10.438 1.00 89.08 51 C 1 +ATOM 2172 O O . LEU C 3 51 ? 17.223 -5.014 -10.487 1.00 88.81 51 C 1 +ATOM 2173 C CB . LEU C 3 51 ? 16.305 -7.784 -11.788 1.00 87.73 51 C 1 +ATOM 2174 C CG . LEU C 3 51 ? 15.457 -9.073 -11.815 1.00 84.41 51 C 1 +ATOM 2175 C CD1 . LEU C 3 51 ? 15.021 -9.350 -13.251 1.00 79.55 51 C 1 +ATOM 2176 C CD2 . LEU C 3 51 ? 16.223 -10.291 -11.301 1.00 79.08 51 C 1 +ATOM 2177 N N . PRO C 3 52 ? 19.029 -6.360 -10.440 1.00 89.26 52 C 1 +ATOM 2178 C CA . PRO C 3 52 ? 19.989 -5.262 -10.489 1.00 87.78 52 C 1 +ATOM 2179 C C . PRO C 3 52 ? 19.892 -4.500 -11.817 1.00 87.55 52 C 1 +ATOM 2180 O O . PRO C 3 52 ? 19.855 -5.094 -12.891 1.00 85.55 52 C 1 +ATOM 2181 C CB . PRO C 3 52 ? 21.362 -5.908 -10.281 1.00 85.54 52 C 1 +ATOM 2182 C CG . PRO C 3 52 ? 21.168 -7.336 -10.791 1.00 83.36 52 C 1 +ATOM 2183 C CD . PRO C 3 52 ? 19.722 -7.643 -10.437 1.00 86.32 52 C 1 +ATOM 2184 N N . VAL C 3 53 ? 19.881 -3.171 -11.729 1.00 87.05 53 C 1 +ATOM 2185 C CA . VAL C 3 53 ? 19.939 -2.244 -12.877 1.00 85.14 53 C 1 +ATOM 2186 C C . VAL C 3 53 ? 21.172 -1.351 -12.843 1.00 84.79 53 C 1 +ATOM 2187 O O . VAL C 3 53 ? 21.569 -0.788 -13.854 1.00 81.43 53 C 1 +ATOM 2188 C CB . VAL C 3 53 ? 18.661 -1.400 -12.995 1.00 83.87 53 C 1 +ATOM 2189 C CG1 . VAL C 3 53 ? 17.444 -2.279 -13.300 1.00 75.39 53 C 1 +ATOM 2190 C CG2 . VAL C 3 53 ? 18.371 -0.568 -11.738 1.00 76.86 53 C 1 +ATOM 2191 N N . SER C 3 54 ? 21.802 -1.213 -11.669 1.00 85.09 54 C 1 +ATOM 2192 C CA . SER C 3 54 ? 23.089 -0.566 -11.464 1.00 83.93 54 C 1 +ATOM 2193 C C . SER C 3 54 ? 23.804 -1.215 -10.277 1.00 84.22 54 C 1 +ATOM 2194 O O . SER C 3 54 ? 23.286 -2.145 -9.661 1.00 82.24 54 C 1 +ATOM 2195 C CB . SER C 3 54 ? 22.892 0.938 -11.242 1.00 81.55 54 C 1 +ATOM 2196 O OG . SER C 3 54 ? 22.446 1.200 -9.926 1.00 75.44 54 C 1 +ATOM 2197 N N . GLN C 3 55 ? 24.984 -0.715 -9.914 1.00 83.34 55 C 1 +ATOM 2198 C CA . GLN C 3 55 ? 25.767 -1.257 -8.804 1.00 81.21 55 C 1 +ATOM 2199 C C . GLN C 3 55 ? 25.055 -1.177 -7.433 1.00 81.29 55 C 1 +ATOM 2200 O O . GLN C 3 55 ? 25.302 -2.013 -6.572 1.00 76.60 55 C 1 +ATOM 2201 C CB . GLN C 3 55 ? 27.109 -0.518 -8.777 1.00 77.85 55 C 1 +ATOM 2202 C CG . GLN C 3 55 ? 28.127 -1.182 -7.836 1.00 68.52 55 C 1 +ATOM 2203 C CD . GLN C 3 55 ? 29.494 -0.483 -7.870 1.00 62.09 55 C 1 +ATOM 2204 O OE1 . GLN C 3 55 ? 29.682 0.550 -8.477 1.00 55.37 55 C 1 +ATOM 2205 N NE2 . GLN C 3 55 ? 30.486 -1.029 -7.210 1.00 52.91 55 C 1 +ATOM 2206 N N . ALA C 3 56 ? 24.187 -0.186 -7.233 1.00 83.58 56 C 1 +ATOM 2207 C CA . ALA C 3 56 ? 23.487 0.065 -5.973 1.00 84.80 56 C 1 +ATOM 2208 C C . ALA C 3 56 ? 21.969 0.243 -6.157 1.00 86.71 56 C 1 +ATOM 2209 O O . ALA C 3 56 ? 21.299 0.816 -5.295 1.00 84.33 56 C 1 +ATOM 2210 C CB . ALA C 3 56 ? 24.145 1.259 -5.288 1.00 81.87 56 C 1 +ATOM 2211 N N . SER C 3 57 ? 21.412 -0.196 -7.285 1.00 87.59 57 C 1 +ATOM 2212 C CA . SER C 3 57 ? 19.989 -0.050 -7.581 1.00 89.01 57 C 1 +ATOM 2213 C C . SER C 3 57 ? 19.401 -1.307 -8.200 1.00 90.26 57 C 1 +ATOM 2214 O O . SER C 3 57 ? 19.997 -1.935 -9.072 1.00 89.02 57 C 1 +ATOM 2215 C CB . SER C 3 57 ? 19.717 1.145 -8.501 1.00 87.22 57 C 1 +ATOM 2216 O OG . SER C 3 57 ? 20.203 2.346 -7.924 1.00 78.55 57 C 1 +ATOM 2217 N N . TRP C 3 58 ? 18.187 -1.624 -7.774 1.00 90.74 58 C 1 +ATOM 2218 C CA . TRP C 3 58 ? 17.393 -2.753 -8.229 1.00 91.35 58 C 1 +ATOM 2219 C C . TRP C 3 58 ? 16.031 -2.260 -8.692 1.00 91.90 58 C 1 +ATOM 2220 O O . TRP C 3 58 ? 15.494 -1.295 -8.160 1.00 91.12 58 C 1 +ATOM 2221 C CB . TRP C 3 58 ? 17.249 -3.789 -7.105 1.00 90.52 58 C 1 +ATOM 2222 C CG . TRP C 3 58 ? 18.530 -4.345 -6.579 1.00 89.40 58 C 1 +ATOM 2223 C CD1 . TRP C 3 58 ? 19.082 -5.531 -6.927 1.00 83.90 58 C 1 +ATOM 2224 C CD2 . TRP C 3 58 ? 19.450 -3.744 -5.619 1.00 86.70 58 C 1 +ATOM 2225 N NE1 . TRP C 3 58 ? 20.282 -5.701 -6.267 1.00 82.85 58 C 1 +ATOM 2226 C CE2 . TRP C 3 58 ? 20.563 -4.619 -5.469 1.00 84.73 58 C 1 +ATOM 2227 C CE3 . TRP C 3 58 ? 19.465 -2.542 -4.895 1.00 82.96 58 C 1 +ATOM 2228 C CZ2 . TRP C 3 58 ? 21.664 -4.295 -4.653 1.00 82.16 58 C 1 +ATOM 2229 C CZ3 . TRP C 3 58 ? 20.559 -2.221 -4.076 1.00 80.49 58 C 1 +ATOM 2230 C CH2 . TRP C 3 58 ? 21.652 -3.077 -3.964 1.00 79.77 58 C 1 +ATOM 2231 N N . ALA C 3 59 ? 15.447 -2.955 -9.662 1.00 92.52 59 C 1 +ATOM 2232 C CA . ALA C 3 59 ? 14.140 -2.620 -10.184 1.00 92.67 59 C 1 +ATOM 2233 C C . ALA C 3 59 ? 13.271 -3.862 -10.386 1.00 92.50 59 C 1 +ATOM 2234 O O . ALA C 3 59 ? 13.773 -4.955 -10.647 1.00 90.98 59 C 1 +ATOM 2235 C CB . ALA C 3 59 ? 14.299 -1.815 -11.475 1.00 91.62 59 C 1 +ATOM 2236 N N . CYS C 3 60 ? 11.956 -3.684 -10.292 1.00 90.68 60 C 1 +ATOM 2237 C CA . CYS C 3 60 ? 10.990 -4.703 -10.682 1.00 90.96 60 C 1 +ATOM 2238 C C . CYS C 3 60 ? 9.647 -4.082 -11.082 1.00 92.00 60 C 1 +ATOM 2239 O O . CYS C 3 60 ? 9.361 -2.922 -10.792 1.00 90.37 60 C 1 +ATOM 2240 C CB . CYS C 3 60 ? 10.844 -5.756 -9.581 1.00 87.32 60 C 1 +ATOM 2241 S SG . CYS C 3 60 ? 9.920 -5.262 -8.106 1.00 83.35 60 C 1 +ATOM 2242 N N . ASN C 3 61 ? 8.820 -4.879 -11.758 1.00 90.68 61 C 1 +ATOM 2243 C CA . ASN C 3 61 ? 7.480 -4.503 -12.189 1.00 90.46 61 C 1 +ATOM 2244 C C . ASN C 3 61 ? 6.436 -5.406 -11.532 1.00 90.34 61 C 1 +ATOM 2245 O O . ASN C 3 61 ? 6.413 -6.615 -11.770 1.00 89.06 61 C 1 +ATOM 2246 C CB . ASN C 3 61 ? 7.395 -4.572 -13.720 1.00 88.50 61 C 1 +ATOM 2247 C CG . ASN C 3 61 ? 8.201 -3.465 -14.376 1.00 83.09 61 C 1 +ATOM 2248 O OD1 . ASN C 3 61 ? 7.956 -2.297 -14.176 1.00 75.80 61 C 1 +ATOM 2249 N ND2 . ASN C 3 61 ? 9.177 -3.806 -15.192 1.00 73.82 61 C 1 +ATOM 2250 N N . LEU C 3 62 ? 5.537 -4.810 -10.757 1.00 90.74 62 C 1 +ATOM 2251 C CA . LEU C 3 62 ? 4.360 -5.475 -10.212 1.00 91.17 62 C 1 +ATOM 2252 C C . LEU C 3 62 ? 3.270 -5.517 -11.282 1.00 91.04 62 C 1 +ATOM 2253 O O . LEU C 3 62 ? 2.716 -4.480 -11.649 1.00 89.52 62 C 1 +ATOM 2254 C CB . LEU C 3 62 ? 3.879 -4.721 -8.970 1.00 91.22 62 C 1 +ATOM 2255 C CG . LEU C 3 62 ? 4.840 -4.794 -7.774 1.00 89.24 62 C 1 +ATOM 2256 C CD1 . LEU C 3 62 ? 4.557 -3.658 -6.807 1.00 82.31 62 C 1 +ATOM 2257 C CD2 . LEU C 3 62 ? 4.671 -6.124 -7.027 1.00 83.94 62 C 1 +ATOM 2258 N N . ILE C 3 63 ? 2.945 -6.708 -11.760 1.00 89.95 63 C 1 +ATOM 2259 C CA . ILE C 3 63 ? 1.899 -6.947 -12.751 1.00 87.97 63 C 1 +ATOM 2260 C C . ILE C 3 63 ? 0.608 -7.313 -12.015 1.00 87.19 63 C 1 +ATOM 2261 O O . ILE C 3 63 ? 0.483 -8.400 -11.456 1.00 84.99 63 C 1 +ATOM 2262 C CB . ILE C 3 63 ? 2.326 -8.029 -13.765 1.00 86.62 63 C 1 +ATOM 2263 C CG1 . ILE C 3 63 ? 3.643 -7.631 -14.473 1.00 83.79 63 C 1 +ATOM 2264 C CG2 . ILE C 3 63 ? 1.196 -8.259 -14.785 1.00 82.67 63 C 1 +ATOM 2265 C CD1 . ILE C 3 63 ? 4.227 -8.734 -15.370 1.00 75.33 63 C 1 +ATOM 2266 N N . LEU C 3 64 ? -0.362 -6.413 -12.027 1.00 87.16 64 C 1 +ATOM 2267 C CA . LEU C 3 64 ? -1.611 -6.558 -11.272 1.00 85.36 64 C 1 +ATOM 2268 C C . LEU C 3 64 ? -2.712 -7.281 -12.060 1.00 83.61 64 C 1 +ATOM 2269 O O . LEU C 3 64 ? -3.725 -7.693 -11.491 1.00 80.03 64 C 1 +ATOM 2270 C CB . LEU C 3 64 ? -2.082 -5.160 -10.823 1.00 86.78 64 C 1 +ATOM 2271 C CG . LEU C 3 64 ? -1.020 -4.278 -10.134 1.00 87.69 64 C 1 +ATOM 2272 C CD1 . LEU C 3 64 ? -1.657 -2.955 -9.731 1.00 82.33 64 C 1 +ATOM 2273 C CD2 . LEU C 3 64 ? -0.432 -4.943 -8.884 1.00 82.29 64 C 1 +ATOM 2274 N N . GLY C 3 65 ? -2.539 -7.442 -13.365 1.00 84.46 65 C 1 +ATOM 2275 C CA . GLY C 3 65 ? -3.485 -8.089 -14.272 1.00 81.63 65 C 1 +ATOM 2276 C C . GLY C 3 65 ? -3.184 -7.809 -15.739 1.00 82.77 65 C 1 +ATOM 2277 O O . GLY C 3 65 ? -2.067 -7.444 -16.088 1.00 80.20 65 C 1 +ATOM 2278 N N . ALA C 3 66 ? -4.192 -7.965 -16.586 1.00 80.83 66 C 1 +ATOM 2279 C CA . ALA C 3 66 ? -4.068 -7.658 -18.007 1.00 80.78 66 C 1 +ATOM 2280 C C . ALA C 3 66 ? -3.703 -6.177 -18.224 1.00 81.25 66 C 1 +ATOM 2281 O O . ALA C 3 66 ? -4.211 -5.334 -17.486 1.00 78.89 66 C 1 +ATOM 2282 C CB . ALA C 3 66 ? -5.378 -8.024 -18.717 1.00 79.03 66 C 1 +ATOM 2283 N N . PRO C 3 67 ? -2.879 -5.847 -19.239 1.00 78.62 67 C 1 +ATOM 2284 C CA . PRO C 3 67 ? -2.283 -4.514 -19.408 1.00 79.69 67 C 1 +ATOM 2285 C C . PRO C 3 67 ? -3.267 -3.343 -19.329 1.00 81.98 67 C 1 +ATOM 2286 O O . PRO C 3 67 ? -3.034 -2.384 -18.599 1.00 78.05 67 C 1 +ATOM 2287 C CB . PRO C 3 67 ? -1.575 -4.565 -20.768 1.00 77.66 67 C 1 +ATOM 2288 C CG . PRO C 3 67 ? -1.168 -6.032 -20.884 1.00 76.02 67 C 1 +ATOM 2289 C CD . PRO C 3 67 ? -2.321 -6.767 -20.223 1.00 79.73 67 C 1 +ATOM 2290 N N . ASP C 3 68 ? -4.408 -3.452 -19.980 1.00 79.63 68 C 1 +ATOM 2291 C CA . ASP C 3 68 ? -5.417 -2.382 -20.048 1.00 79.25 68 C 1 +ATOM 2292 C C . ASP C 3 68 ? -6.497 -2.463 -18.964 1.00 80.80 68 C 1 +ATOM 2293 O O . ASP C 3 68 ? -7.440 -1.667 -18.945 1.00 77.35 68 C 1 +ATOM 2294 C CB . ASP C 3 68 ? -6.034 -2.351 -21.447 1.00 76.20 68 C 1 +ATOM 2295 C CG . ASP C 3 68 ? -4.952 -2.091 -22.489 1.00 66.67 68 C 1 +ATOM 2296 O OD1 . ASP C 3 68 ? -4.244 -1.074 -22.316 1.00 59.22 68 C 1 +ATOM 2297 O OD2 . ASP C 3 68 ? -4.806 -2.970 -23.366 1.00 59.51 68 C 1 +ATOM 2298 N N . SER C 3 69 ? -6.388 -3.428 -18.039 1.00 81.65 69 C 1 +ATOM 2299 C CA . SER C 3 69 ? -7.365 -3.561 -16.970 1.00 82.34 69 C 1 +ATOM 2300 C C . SER C 3 69 ? -7.165 -2.498 -15.889 1.00 83.82 69 C 1 +ATOM 2301 O O . SER C 3 69 ? -6.050 -2.270 -15.420 1.00 82.10 69 C 1 +ATOM 2302 C CB . SER C 3 69 ? -7.387 -4.982 -16.398 1.00 79.94 69 C 1 +ATOM 2303 O OG . SER C 3 69 ? -6.200 -5.317 -15.719 1.00 73.00 69 C 1 +ATOM 2304 N N . GLN C 3 70 ? -8.263 -1.873 -15.441 1.00 84.79 70 C 1 +ATOM 2305 C CA . GLN C 3 70 ? -8.232 -0.935 -14.323 1.00 85.68 70 C 1 +ATOM 2306 C C . GLN C 3 70 ? -8.205 -1.712 -12.996 1.00 84.60 70 C 1 +ATOM 2307 O O . GLN C 3 70 ? -9.225 -2.254 -12.574 1.00 80.29 70 C 1 +ATOM 2308 C CB . GLN C 3 70 ? -9.438 0.013 -14.422 1.00 84.94 70 C 1 +ATOM 2309 C CG . GLN C 3 70 ? -9.307 1.198 -13.464 1.00 81.85 70 C 1 +ATOM 2310 C CD . GLN C 3 70 ? -8.189 2.149 -13.888 1.00 82.26 70 C 1 +ATOM 2311 O OE1 . GLN C 3 70 ? -8.149 2.615 -15.009 1.00 75.70 70 C 1 +ATOM 2312 N NE2 . GLN C 3 70 ? -7.243 2.431 -13.029 1.00 72.69 70 C 1 +ATOM 2313 N N . LYS C 3 71 ? -7.041 -1.776 -12.353 1.00 84.51 71 C 1 +ATOM 2314 C CA . LYS C 3 71 ? -6.848 -2.559 -11.123 1.00 84.22 71 C 1 +ATOM 2315 C C . LYS C 3 71 ? -6.860 -1.748 -9.837 1.00 85.32 71 C 1 +ATOM 2316 O O . LYS C 3 71 ? -7.126 -2.317 -8.779 1.00 83.82 71 C 1 +ATOM 2317 C CB . LYS C 3 71 ? -5.554 -3.383 -11.227 1.00 81.80 71 C 1 +ATOM 2318 C CG . LYS C 3 71 ? -5.645 -4.516 -12.254 1.00 79.27 71 C 1 +ATOM 2319 C CD . LYS C 3 71 ? -6.703 -5.564 -11.880 1.00 74.51 71 C 1 +ATOM 2320 C CE . LYS C 3 71 ? -6.647 -6.713 -12.873 1.00 71.08 71 C 1 +ATOM 2321 N NZ . LYS C 3 71 ? -7.620 -7.791 -12.553 1.00 61.94 71 C 1 +ATOM 2322 N N . LEU C 3 72 ? -6.597 -0.455 -9.930 1.00 84.83 72 C 1 +ATOM 2323 C CA . LEU C 3 72 ? -6.563 0.468 -8.796 1.00 86.78 72 C 1 +ATOM 2324 C C . LEU C 3 72 ? -7.415 1.705 -9.107 1.00 85.96 72 C 1 +ATOM 2325 O O . LEU C 3 72 ? -7.687 2.019 -10.274 1.00 83.74 72 C 1 +ATOM 2326 C CB . LEU C 3 72 ? -5.107 0.831 -8.462 1.00 88.30 72 C 1 +ATOM 2327 C CG . LEU C 3 72 ? -4.232 -0.366 -8.037 1.00 89.25 72 C 1 +ATOM 2328 C CD1 . LEU C 3 72 ? -2.767 0.067 -7.919 1.00 84.62 72 C 1 +ATOM 2329 C CD2 . LEU C 3 72 ? -4.660 -0.945 -6.689 1.00 84.82 72 C 1 +ATOM 2330 N N . THR C 3 73 ? -7.839 2.387 -8.054 1.00 88.21 73 C 1 +ATOM 2331 C CA . THR C 3 73 ? -8.662 3.595 -8.107 1.00 87.43 73 C 1 +ATOM 2332 C C . THR C 3 73 ? -7.997 4.730 -7.323 1.00 88.27 73 C 1 +ATOM 2333 O O . THR C 3 73 ? -7.016 4.511 -6.619 1.00 87.64 73 C 1 +ATOM 2334 C CB . THR C 3 73 ? -10.071 3.324 -7.548 1.00 85.03 73 C 1 +ATOM 2335 O OG1 . THR C 3 73 ? -10.013 3.014 -6.175 1.00 78.32 73 C 1 +ATOM 2336 C CG2 . THR C 3 73 ? -10.789 2.182 -8.267 1.00 76.06 73 C 1 +ATOM 2337 N N . THR C 3 74 ? -8.543 5.937 -7.409 1.00 86.44 74 C 1 +ATOM 2338 C CA . THR C 3 74 ? -8.025 7.119 -6.702 1.00 85.27 74 C 1 +ATOM 2339 C C . THR C 3 74 ? -8.091 7.009 -5.176 1.00 85.11 74 C 1 +ATOM 2340 O O . THR C 3 74 ? -7.405 7.750 -4.484 1.00 83.38 74 C 1 +ATOM 2341 C CB . THR C 3 74 ? -8.801 8.374 -7.124 1.00 83.72 74 C 1 +ATOM 2342 O OG1 . THR C 3 74 ? -10.182 8.149 -6.959 1.00 75.94 74 C 1 +ATOM 2343 C CG2 . THR C 3 74 ? -8.581 8.715 -8.598 1.00 73.98 74 C 1 +ATOM 2344 N N . VAL C 3 75 ? -8.911 6.097 -4.642 1.00 85.73 75 C 1 +ATOM 2345 C CA . VAL C 3 75 ? -9.079 5.892 -3.193 1.00 84.14 75 C 1 +ATOM 2346 C C . VAL C 3 75 ? -8.285 4.693 -2.663 1.00 84.55 75 C 1 +ATOM 2347 O O . VAL C 3 75 ? -8.301 4.452 -1.458 1.00 81.96 75 C 1 +ATOM 2348 C CB . VAL C 3 75 ? -10.556 5.779 -2.788 1.00 82.37 75 C 1 +ATOM 2349 C CG1 . VAL C 3 75 ? -11.329 7.049 -3.173 1.00 74.28 75 C 1 +ATOM 2350 C CG2 . VAL C 3 75 ? -11.250 4.564 -3.422 1.00 73.75 75 C 1 +ATOM 2351 N N . ASP C 3 76 ? -7.642 3.911 -3.532 1.00 84.90 76 C 1 +ATOM 2352 C CA . ASP C 3 76 ? -6.798 2.807 -3.104 1.00 86.21 76 C 1 +ATOM 2353 C C . ASP C 3 76 ? -5.479 3.352 -2.532 1.00 86.97 76 C 1 +ATOM 2354 O O . ASP C 3 76 ? -4.880 4.282 -3.072 1.00 86.70 76 C 1 +ATOM 2355 C CB . ASP C 3 76 ? -6.522 1.825 -4.252 1.00 86.33 76 C 1 +ATOM 2356 C CG . ASP C 3 76 ? -7.741 0.967 -4.642 1.00 85.28 76 C 1 +ATOM 2357 O OD1 . ASP C 3 76 ? -8.261 0.177 -3.820 1.00 81.03 76 C 1 +ATOM 2358 O OD2 . ASP C 3 76 ? -8.170 1.003 -5.822 1.00 80.59 76 C 1 +ATOM 2359 N N . ILE C 3 77 ? -5.013 2.720 -1.459 1.00 87.16 77 C 1 +ATOM 2360 C CA . ILE C 3 77 ? -3.664 2.863 -0.917 1.00 86.34 77 C 1 +ATOM 2361 C C . ILE C 3 77 ? -3.022 1.481 -0.957 1.00 86.42 77 C 1 +ATOM 2362 O O . ILE C 3 77 ? -3.629 0.498 -0.518 1.00 85.31 77 C 1 +ATOM 2363 C CB . ILE C 3 77 ? -3.674 3.477 0.498 1.00 84.17 77 C 1 +ATOM 2364 C CG1 . ILE C 3 77 ? -4.361 4.863 0.484 1.00 79.45 77 C 1 +ATOM 2365 C CG2 . ILE C 3 77 ? -2.239 3.576 1.041 1.00 79.32 77 C 1 +ATOM 2366 C CD1 . ILE C 3 77 ? -4.575 5.469 1.873 1.00 74.76 77 C 1 +ATOM 2367 N N . VAL C 3 78 ? -1.825 1.381 -1.494 1.00 88.69 78 C 1 +ATOM 2368 C CA . VAL C 3 78 ? -1.080 0.132 -1.591 1.00 89.67 78 C 1 +ATOM 2369 C C . VAL C 3 78 ? 0.149 0.254 -0.713 1.00 89.57 78 C 1 +ATOM 2370 O O . VAL C 3 78 ? 1.040 1.025 -1.022 1.00 88.67 78 C 1 +ATOM 2371 C CB . VAL C 3 78 ? -0.688 -0.186 -3.047 1.00 90.48 78 C 1 +ATOM 2372 C CG1 . VAL C 3 78 ? -0.027 -1.560 -3.143 1.00 86.96 78 C 1 +ATOM 2373 C CG2 . VAL C 3 78 ? -1.899 -0.179 -3.980 1.00 86.32 78 C 1 +ATOM 2374 N N . THR C 3 79 ? 0.235 -0.538 0.345 1.00 88.18 79 C 1 +ATOM 2375 C CA . THR C 3 79 ? 1.486 -0.620 1.090 1.00 86.93 79 C 1 +ATOM 2376 C C . THR C 3 79 ? 2.490 -1.444 0.300 1.00 88.48 79 C 1 +ATOM 2377 O O . THR C 3 79 ? 2.249 -2.622 0.009 1.00 88.65 79 C 1 +ATOM 2378 C CB . THR C 3 79 ? 1.287 -1.176 2.499 1.00 83.89 79 C 1 +ATOM 2379 O OG1 . THR C 3 79 ? 0.364 -0.368 3.185 1.00 77.49 79 C 1 +ATOM 2380 C CG2 . THR C 3 79 ? 2.587 -1.188 3.300 1.00 75.01 79 C 1 +ATOM 2381 N N . LEU C 3 80 ? 3.598 -0.812 -0.063 1.00 89.15 80 C 1 +ATOM 2382 C CA . LEU C 3 80 ? 4.708 -1.417 -0.780 1.00 90.38 80 C 1 +ATOM 2383 C C . LEU C 3 80 ? 5.865 -1.645 0.188 1.00 89.17 80 C 1 +ATOM 2384 O O . LEU C 3 80 ? 6.239 -0.739 0.929 1.00 87.61 80 C 1 +ATOM 2385 C CB . LEU C 3 80 ? 5.139 -0.506 -1.942 1.00 92.07 80 C 1 +ATOM 2386 C CG . LEU C 3 80 ? 4.059 -0.269 -3.007 1.00 92.59 80 C 1 +ATOM 2387 C CD1 . LEU C 3 80 ? 4.584 0.695 -4.064 1.00 89.50 80 C 1 +ATOM 2388 C CD2 . LEU C 3 80 ? 3.652 -1.561 -3.717 1.00 90.43 80 C 1 +ATOM 2389 N N . ARG C 3 81 ? 6.448 -2.839 0.158 1.00 91.05 81 C 1 +ATOM 2390 C CA . ARG C 3 81 ? 7.583 -3.208 1.006 1.00 90.06 81 C 1 +ATOM 2391 C C . ARG C 3 81 ? 8.702 -3.815 0.174 1.00 91.68 81 C 1 +ATOM 2392 O O . ARG C 3 81 ? 8.424 -4.646 -0.683 1.00 91.39 81 C 1 +ATOM 2393 C CB . ARG C 3 81 ? 7.137 -4.185 2.104 1.00 86.69 81 C 1 +ATOM 2394 C CG . ARG C 3 81 ? 6.040 -3.575 2.992 1.00 78.59 81 C 1 +ATOM 2395 C CD . ARG C 3 81 ? 5.709 -4.460 4.192 1.00 74.82 81 C 1 +ATOM 2396 N NE . ARG C 3 81 ? 5.020 -5.710 3.806 1.00 67.33 81 C 1 +ATOM 2397 C CZ . ARG C 3 81 ? 4.743 -6.673 4.676 1.00 61.76 81 C 1 +ATOM 2398 N NH1 . ARG C 3 81 ? 5.037 -6.559 5.924 1.00 56.93 81 C 1 +ATOM 2399 N NH2 . ARG C 3 81 ? 4.179 -7.774 4.315 1.00 53.90 81 C 1 +ATOM 2400 N N . VAL C 3 82 ? 9.938 -3.445 0.463 1.00 89.24 82 C 1 +ATOM 2401 C CA . VAL C 3 82 ? 11.118 -4.178 0.010 1.00 89.66 82 C 1 +ATOM 2402 C C . VAL C 3 82 ? 11.452 -5.219 1.066 1.00 88.51 82 C 1 +ATOM 2403 O O . VAL C 3 82 ? 11.699 -4.879 2.221 1.00 86.97 82 C 1 +ATOM 2404 C CB . VAL C 3 82 ? 12.311 -3.254 -0.255 1.00 90.30 82 C 1 +ATOM 2405 C CG1 . VAL C 3 82 ? 13.537 -4.051 -0.700 1.00 87.71 82 C 1 +ATOM 2406 C CG2 . VAL C 3 82 ? 11.988 -2.240 -1.352 1.00 86.84 82 C 1 +ATOM 2407 N N . LEU C 3 83 ? 11.452 -6.482 0.667 1.00 88.56 83 C 1 +ATOM 2408 C CA . LEU C 3 83 ? 11.779 -7.619 1.511 1.00 87.56 83 C 1 +ATOM 2409 C C . LEU C 3 83 ? 13.049 -8.280 0.976 1.00 88.01 83 C 1 +ATOM 2410 O O . LEU C 3 83 ? 13.075 -8.695 -0.174 1.00 87.54 83 C 1 +ATOM 2411 C CB . LEU C 3 83 ? 10.615 -8.629 1.510 1.00 85.77 83 C 1 +ATOM 2412 C CG . LEU C 3 83 ? 9.252 -8.086 1.968 1.00 82.37 83 C 1 +ATOM 2413 C CD1 . LEU C 3 83 ? 8.192 -9.186 1.835 1.00 78.25 83 C 1 +ATOM 2414 C CD2 . LEU C 3 83 ? 9.280 -7.624 3.422 1.00 77.69 83 C 1 +ATOM 2415 N N . CYS C 3 84 ? 14.072 -8.412 1.812 1.00 86.13 84 C 1 +ATOM 2416 C CA . CYS C 3 84 ? 15.293 -9.143 1.486 1.00 85.40 84 C 1 +ATOM 2417 C C . CYS C 3 84 ? 15.426 -10.384 2.365 1.00 83.61 84 C 1 +ATOM 2418 O O . CYS C 3 84 ? 15.042 -10.383 3.532 1.00 80.94 84 C 1 +ATOM 2419 C CB . CYS C 3 84 ? 16.510 -8.224 1.573 1.00 85.87 84 C 1 +ATOM 2420 S SG . CYS C 3 84 ? 16.517 -6.914 0.316 1.00 85.73 84 C 1 +ATOM 2421 N N . ARG C 3 85 ? 15.957 -11.457 1.787 1.00 82.88 85 C 1 +ATOM 2422 C CA . ARG C 3 85 ? 16.069 -12.734 2.478 1.00 80.90 85 C 1 +ATOM 2423 C C . ARG C 3 85 ? 17.246 -12.708 3.453 1.00 79.95 85 C 1 +ATOM 2424 O O . ARG C 3 85 ? 18.379 -12.496 3.054 1.00 77.10 85 C 1 +ATOM 2425 C CB . ARG C 3 85 ? 16.171 -13.852 1.436 1.00 77.57 85 C 1 +ATOM 2426 C CG . ARG C 3 85 ? 15.881 -15.223 2.058 1.00 68.76 85 C 1 +ATOM 2427 C CD . ARG C 3 85 ? 15.862 -16.288 0.960 1.00 66.42 85 C 1 +ATOM 2428 N NE . ARG C 3 85 ? 15.442 -17.589 1.486 1.00 58.54 85 C 1 +ATOM 2429 C CZ . ARG C 3 85 ? 15.239 -18.686 0.777 1.00 52.58 85 C 1 +ATOM 2430 N NH1 . ARG C 3 85 ? 15.441 -18.713 -0.508 1.00 47.90 85 C 1 +ATOM 2431 N NH2 . ARG C 3 85 ? 14.835 -19.763 1.356 1.00 46.28 85 C 1 +ATOM 2432 N N . GLU C 3 86 ? 16.973 -13.030 4.719 1.00 77.04 86 C 1 +ATOM 2433 C CA . GLU C 3 86 ? 17.979 -13.273 5.753 1.00 75.99 86 C 1 +ATOM 2434 C C . GLU C 3 86 ? 17.824 -14.715 6.266 1.00 73.99 86 C 1 +ATOM 2435 O O . GLU C 3 86 ? 16.973 -15.030 7.105 1.00 69.45 86 C 1 +ATOM 2436 C CB . GLU C 3 86 ? 17.891 -12.247 6.894 1.00 72.83 86 C 1 +ATOM 2437 C CG . GLU C 3 86 ? 18.506 -10.881 6.524 1.00 65.01 86 C 1 +ATOM 2438 C CD . GLU C 3 86 ? 18.568 -9.906 7.712 1.00 63.70 86 C 1 +ATOM 2439 O OE1 . GLU C 3 86 ? 19.217 -8.838 7.578 1.00 58.88 86 C 1 +ATOM 2440 O OE2 . GLU C 3 86 ? 17.957 -10.170 8.767 1.00 62.38 86 C 1 +ATOM 2441 N N . GLY C 3 87 ? 18.614 -15.628 5.714 1.00 70.15 87 C 1 +ATOM 2442 C CA . GLY C 3 87 ? 18.497 -17.057 5.978 1.00 69.10 87 C 1 +ATOM 2443 C C . GLY C 3 87 ? 17.137 -17.610 5.536 1.00 69.65 87 C 1 +ATOM 2444 O O . GLY C 3 87 ? 16.831 -17.663 4.347 1.00 66.19 87 C 1 +ATOM 2445 N N . VAL C 3 88 ? 16.321 -18.064 6.505 1.00 64.28 88 C 1 +ATOM 2446 C CA . VAL C 3 88 ? 14.977 -18.606 6.254 1.00 63.41 88 C 1 +ATOM 2447 C C . VAL C 3 88 ? 13.862 -17.557 6.360 1.00 65.36 88 C 1 +ATOM 2448 O O . VAL C 3 88 ? 12.708 -17.869 6.115 1.00 62.33 88 C 1 +ATOM 2449 C CB . VAL C 3 88 ? 14.666 -19.809 7.173 1.00 60.65 88 C 1 +ATOM 2450 C CG1 . VAL C 3 88 ? 15.609 -20.976 6.865 1.00 53.91 88 C 1 +ATOM 2451 C CG2 . VAL C 3 88 ? 14.762 -19.458 8.658 1.00 54.70 88 C 1 +ATOM 2452 N N . ARG C 3 89 ? 14.197 -16.320 6.744 1.00 66.31 89 C 1 +ATOM 2453 C CA . ARG C 3 89 ? 13.241 -15.237 6.992 1.00 67.53 89 C 1 +ATOM 2454 C C . ARG C 3 89 ? 13.346 -14.149 5.932 1.00 71.55 89 C 1 +ATOM 2455 O O . ARG C 3 89 ? 14.321 -14.081 5.184 1.00 69.47 89 C 1 +ATOM 2456 C CB . ARG C 3 89 ? 13.447 -14.662 8.407 1.00 61.86 89 C 1 +ATOM 2457 C CG . ARG C 3 89 ? 13.173 -15.728 9.478 1.00 54.01 89 C 1 +ATOM 2458 C CD . ARG C 3 89 ? 13.297 -15.135 10.886 1.00 49.31 89 C 1 +ATOM 2459 N NE . ARG C 3 89 ? 13.063 -16.160 11.912 1.00 43.74 89 C 1 +ATOM 2460 C CZ . ARG C 3 89 ? 13.078 -15.977 13.220 1.00 38.83 89 C 1 +ATOM 2461 N NH1 . ARG C 3 89 ? 13.327 -14.808 13.741 1.00 35.90 89 C 1 +ATOM 2462 N NH2 . ARG C 3 89 ? 12.855 -16.967 14.017 1.00 33.75 89 C 1 +ATOM 2463 N N . TRP C 3 90 ? 12.331 -13.302 5.888 1.00 71.97 90 C 1 +ATOM 2464 C CA . TRP C 3 90 ? 12.342 -12.071 5.122 1.00 72.49 90 C 1 +ATOM 2465 C C . TRP C 3 90 ? 12.475 -10.891 6.078 1.00 72.16 90 C 1 +ATOM 2466 O O . TRP C 3 90 ? 11.748 -10.816 7.075 1.00 71.55 90 C 1 +ATOM 2467 C CB . TRP C 3 90 ? 11.078 -11.974 4.284 1.00 73.77 90 C 1 +ATOM 2468 C CG . TRP C 3 90 ? 10.998 -13.000 3.189 1.00 74.89 90 C 1 +ATOM 2469 C CD1 . TRP C 3 90 ? 10.311 -14.172 3.241 1.00 70.52 90 C 1 +ATOM 2470 C CD2 . TRP C 3 90 ? 11.625 -12.959 1.874 1.00 74.12 90 C 1 +ATOM 2471 N NE1 . TRP C 3 90 ? 10.460 -14.855 2.040 1.00 69.92 90 C 1 +ATOM 2472 C CE2 . TRP C 3 90 ? 11.253 -14.136 1.172 1.00 71.91 90 C 1 +ATOM 2473 C CE3 . TRP C 3 90 ? 12.451 -12.021 1.218 1.00 71.66 90 C 1 +ATOM 2474 C CZ2 . TRP C 3 90 ? 11.694 -14.376 -0.155 1.00 71.35 90 C 1 +ATOM 2475 C CZ3 . TRP C 3 90 ? 12.887 -12.262 -0.091 1.00 71.16 90 C 1 +ATOM 2476 C CH2 . TRP C 3 90 ? 12.513 -13.429 -0.780 1.00 71.48 90 C 1 +ATOM 2477 N N . ARG C 3 91 ? 13.382 -9.977 5.769 1.00 76.45 91 C 1 +ATOM 2478 C CA . ARG C 3 91 ? 13.562 -8.727 6.488 1.00 77.90 91 C 1 +ATOM 2479 C C . ARG C 3 91 ? 12.981 -7.578 5.678 1.00 80.94 91 C 1 +ATOM 2480 O O . ARG C 3 91 ? 13.276 -7.457 4.493 1.00 81.01 91 C 1 +ATOM 2481 C CB . ARG C 3 91 ? 15.051 -8.533 6.782 1.00 74.10 91 C 1 +ATOM 2482 C CG . ARG C 3 91 ? 15.305 -7.233 7.541 1.00 63.80 91 C 1 +ATOM 2483 C CD . ARG C 3 91 ? 16.791 -7.116 7.845 1.00 60.57 91 C 1 +ATOM 2484 N NE . ARG C 3 91 ? 17.133 -5.844 8.476 1.00 53.79 91 C 1 +ATOM 2485 C CZ . ARG C 3 91 ? 18.364 -5.495 8.821 1.00 47.95 91 C 1 +ATOM 2486 N NH1 . ARG C 3 91 ? 19.365 -6.316 8.639 1.00 44.20 91 C 1 +ATOM 2487 N NH2 . ARG C 3 91 ? 18.601 -4.320 9.330 1.00 41.34 91 C 1 +ATOM 2488 N N . VAL C 3 92 ? 12.199 -6.720 6.326 1.00 79.05 92 C 1 +ATOM 2489 C CA . VAL C 3 92 ? 11.717 -5.471 5.733 1.00 78.82 92 C 1 +ATOM 2490 C C . VAL C 3 92 ? 12.889 -4.489 5.653 1.00 79.88 92 C 1 +ATOM 2491 O O . VAL C 3 92 ? 13.485 -4.154 6.675 1.00 79.46 92 C 1 +ATOM 2492 C CB . VAL C 3 92 ? 10.546 -4.870 6.518 1.00 77.05 92 C 1 +ATOM 2493 C CG1 . VAL C 3 92 ? 9.994 -3.638 5.811 1.00 72.70 92 C 1 +ATOM 2494 C CG2 . VAL C 3 92 ? 9.399 -5.877 6.668 1.00 73.56 92 C 1 +ATOM 2495 N N . MET C 3 93 ? 13.217 -4.044 4.444 1.00 83.62 93 C 1 +ATOM 2496 C CA . MET C 3 93 ? 14.302 -3.098 4.173 1.00 83.38 93 C 1 +ATOM 2497 C C . MET C 3 93 ? 13.784 -1.680 3.931 1.00 83.73 93 C 1 +ATOM 2498 O O . MET C 3 93 ? 14.442 -0.706 4.288 1.00 81.91 93 C 1 +ATOM 2499 C CB . MET C 3 93 ? 15.099 -3.571 2.948 1.00 82.79 93 C 1 +ATOM 2500 C CG . MET C 3 93 ? 15.714 -4.960 3.109 1.00 80.88 93 C 1 +ATOM 2501 S SD . MET C 3 93 ? 16.860 -5.163 4.510 1.00 78.22 93 C 1 +ATOM 2502 C CE . MET C 3 93 ? 18.190 -4.049 4.003 1.00 70.89 93 C 1 +ATOM 2503 N N . ALA C 3 94 ? 12.604 -1.567 3.318 1.00 85.16 94 C 1 +ATOM 2504 C CA . ALA C 3 94 ? 11.902 -0.315 3.095 1.00 85.31 94 C 1 +ATOM 2505 C C . ALA C 3 94 ? 10.392 -0.569 3.055 1.00 85.57 94 C 1 +ATOM 2506 O O . ALA C 3 94 ? 9.947 -1.652 2.681 1.00 84.62 94 C 1 +ATOM 2507 C CB . ALA C 3 94 ? 12.399 0.321 1.789 1.00 84.95 94 C 1 +ATOM 2508 N N . ILE C 3 95 ? 9.610 0.451 3.426 1.00 84.53 95 C 1 +ATOM 2509 C CA . ILE C 3 95 ? 8.153 0.402 3.403 1.00 83.35 95 C 1 +ATOM 2510 C C . ILE C 3 95 ? 7.607 1.783 3.053 1.00 83.23 95 C 1 +ATOM 2511 O O . ILE C 3 95 ? 8.163 2.796 3.464 1.00 81.87 95 C 1 +ATOM 2512 C CB . ILE C 3 95 ? 7.601 -0.148 4.735 1.00 79.67 95 C 1 +ATOM 2513 C CG1 . ILE C 3 95 ? 6.072 -0.324 4.677 1.00 69.79 95 C 1 +ATOM 2514 C CG2 . ILE C 3 95 ? 8.022 0.708 5.939 1.00 69.00 95 C 1 +ATOM 2515 C CD1 . ILE C 3 95 ? 5.514 -1.210 5.789 1.00 64.40 95 C 1 +ATOM 2516 N N . GLN C 3 96 ? 6.518 1.827 2.281 1.00 83.44 96 C 1 +ATOM 2517 C CA . GLN C 3 96 ? 5.766 3.042 2.022 1.00 84.50 96 C 1 +ATOM 2518 C C . GLN C 3 96 ? 4.300 2.718 1.742 1.00 84.67 96 C 1 +ATOM 2519 O O . GLN C 3 96 ? 3.988 1.710 1.112 1.00 84.02 96 C 1 +ATOM 2520 C CB . GLN C 3 96 ? 6.380 3.843 0.859 1.00 84.23 96 C 1 +ATOM 2521 C CG . GLN C 3 96 ? 6.363 3.118 -0.494 1.00 82.42 96 C 1 +ATOM 2522 C CD . GLN C 3 96 ? 6.919 3.962 -1.636 1.00 83.42 96 C 1 +ATOM 2523 O OE1 . GLN C 3 96 ? 6.890 5.174 -1.629 1.00 77.66 96 C 1 +ATOM 2524 N NE2 . GLN C 3 96 ? 7.426 3.356 -2.678 1.00 75.72 96 C 1 +ATOM 2525 N N . ASP C 3 97 ? 3.422 3.627 2.147 1.00 84.48 97 C 1 +ATOM 2526 C CA . ASP C 3 97 ? 2.043 3.624 1.690 1.00 83.60 97 C 1 +ATOM 2527 C C . ASP C 3 97 ? 1.942 4.427 0.394 1.00 86.18 97 C 1 +ATOM 2528 O O . ASP C 3 97 ? 2.067 5.646 0.358 1.00 85.23 97 C 1 +ATOM 2529 C CB . ASP C 3 97 ? 1.117 4.166 2.776 1.00 79.39 97 C 1 +ATOM 2530 C CG . ASP C 3 97 ? 0.881 3.148 3.896 1.00 74.23 97 C 1 +ATOM 2531 O OD1 . ASP C 3 97 ? 0.985 1.929 3.651 1.00 68.78 97 C 1 +ATOM 2532 O OD2 . ASP C 3 97 ? 0.522 3.594 4.997 1.00 69.57 97 C 1 +ATOM 2533 N N . PHE C 3 98 ? 1.734 3.704 -0.694 1.00 88.28 98 C 1 +ATOM 2534 C CA . PHE C 3 98 ? 1.727 4.216 -2.049 1.00 90.83 98 C 1 +ATOM 2535 C C . PHE C 3 98 ? 0.309 4.578 -2.473 1.00 91.05 98 C 1 +ATOM 2536 O O . PHE C 3 98 ? -0.577 3.722 -2.527 1.00 90.32 98 C 1 +ATOM 2537 C CB . PHE C 3 98 ? 2.353 3.156 -2.953 1.00 92.09 98 C 1 +ATOM 2538 C CG . PHE C 3 98 ? 2.410 3.531 -4.406 1.00 93.03 98 C 1 +ATOM 2539 C CD1 . PHE C 3 98 ? 1.511 2.962 -5.327 1.00 90.58 98 C 1 +ATOM 2540 C CD2 . PHE C 3 98 ? 3.397 4.423 -4.851 1.00 90.67 98 C 1 +ATOM 2541 C CE1 . PHE C 3 98 ? 1.612 3.278 -6.687 1.00 90.79 98 C 1 +ATOM 2542 C CE2 . PHE C 3 98 ? 3.492 4.740 -6.215 1.00 90.61 98 C 1 +ATOM 2543 C CZ . PHE C 3 98 ? 2.606 4.163 -7.133 1.00 93.88 98 C 1 +ATOM 2544 N N . LYS C 3 99 ? 0.096 5.846 -2.834 1.00 90.09 99 C 1 +ATOM 2545 C CA . LYS C 3 99 ? -1.136 6.348 -3.448 1.00 89.81 99 C 1 +ATOM 2546 C C . LYS C 3 99 ? -0.960 6.292 -4.977 1.00 90.71 99 C 1 +ATOM 2547 O O . LYS C 3 99 ? -0.245 7.121 -5.529 1.00 90.53 99 C 1 +ATOM 2548 C CB . LYS C 3 99 ? -1.410 7.778 -2.983 1.00 88.41 99 C 1 +ATOM 2549 C CG . LYS C 3 99 ? -1.707 7.898 -1.485 1.00 84.73 99 C 1 +ATOM 2550 C CD . LYS C 3 99 ? -1.898 9.380 -1.130 1.00 79.81 99 C 1 +ATOM 2551 C CE . LYS C 3 99 ? -2.140 9.615 0.358 1.00 71.90 99 C 1 +ATOM 2552 N NZ . LYS C 3 99 ? -2.162 11.059 0.659 1.00 63.83 99 C 1 +ATOM 2553 N N . PRO C 3 100 ? -1.579 5.343 -5.679 1.00 91.46 100 C 1 +ATOM 2554 C CA . PRO C 3 100 ? -1.292 5.102 -7.091 1.00 91.44 100 C 1 +ATOM 2555 C C . PRO C 3 100 ? -1.508 6.327 -7.982 1.00 91.68 100 C 1 +ATOM 2556 O O . PRO C 3 100 ? -0.679 6.636 -8.831 1.00 90.65 100 C 1 +ATOM 2557 C CB . PRO C 3 100 ? -2.211 3.940 -7.495 1.00 90.84 100 C 1 +ATOM 2558 C CG . PRO C 3 100 ? -2.475 3.211 -6.181 1.00 88.41 100 C 1 +ATOM 2559 C CD . PRO C 3 100 ? -2.480 4.330 -5.153 1.00 90.62 100 C 1 +ATOM 2560 N N . PHE C 3 101 ? -2.599 7.061 -7.767 1.00 90.34 101 C 1 +ATOM 2561 C CA . PHE C 3 101 ? -2.967 8.217 -8.587 1.00 90.24 101 C 1 +ATOM 2562 C C . PHE C 3 101 ? -2.212 9.514 -8.229 1.00 89.72 101 C 1 +ATOM 2563 O O . PHE C 3 101 ? -2.311 10.473 -8.977 1.00 87.46 101 C 1 +ATOM 2564 C CB . PHE C 3 101 ? -4.485 8.398 -8.570 1.00 89.77 101 C 1 +ATOM 2565 C CG . PHE C 3 101 ? -5.196 7.440 -9.507 1.00 89.15 101 C 1 +ATOM 2566 C CD1 . PHE C 3 101 ? -5.535 7.861 -10.810 1.00 84.59 101 C 1 +ATOM 2567 C CD2 . PHE C 3 101 ? -5.469 6.120 -9.115 1.00 84.28 101 C 1 +ATOM 2568 C CE1 . PHE C 3 101 ? -6.163 6.973 -11.698 1.00 83.29 101 C 1 +ATOM 2569 C CE2 . PHE C 3 101 ? -6.092 5.230 -10.000 1.00 82.68 101 C 1 +ATOM 2570 C CZ . PHE C 3 101 ? -6.438 5.660 -11.295 1.00 86.91 101 C 1 +ATOM 2571 N N . GLU C 3 102 ? -1.415 9.511 -7.155 1.00 89.59 102 C 1 +ATOM 2572 C CA . GLU C 3 102 ? -0.489 10.598 -6.827 1.00 88.85 102 C 1 +ATOM 2573 C C . GLU C 3 102 ? 0.910 10.359 -7.409 1.00 89.42 102 C 1 +ATOM 2574 O O . GLU C 3 102 ? 1.726 11.270 -7.489 1.00 87.15 102 C 1 +ATOM 2575 C CB . GLU C 3 102 ? -0.411 10.779 -5.301 1.00 87.16 102 C 1 +ATOM 2576 C CG . GLU C 3 102 ? -1.753 11.137 -4.642 1.00 82.60 102 C 1 +ATOM 2577 C CD . GLU C 3 102 ? -2.410 12.371 -5.271 1.00 75.72 102 C 1 +ATOM 2578 O OE1 . GLU C 3 102 ? -3.641 12.312 -5.482 1.00 66.66 102 C 1 +ATOM 2579 O OE2 . GLU C 3 102 ? -1.673 13.315 -5.608 1.00 67.39 102 C 1 +ATOM 2580 N N . ASN C 3 103 ? 1.192 9.132 -7.846 1.00 90.57 103 C 1 +ATOM 2581 C CA . ASN C 3 103 ? 2.502 8.688 -8.318 1.00 90.92 103 C 1 +ATOM 2582 C C . ASN C 3 103 ? 2.413 8.108 -9.735 1.00 91.73 103 C 1 +ATOM 2583 O O . ASN C 3 103 ? 2.795 6.964 -9.998 1.00 90.09 103 C 1 +ATOM 2584 C CB . ASN C 3 103 ? 3.087 7.695 -7.305 1.00 89.77 103 C 1 +ATOM 2585 C CG . ASN C 3 103 ? 3.435 8.341 -5.978 1.00 86.36 103 C 1 +ATOM 2586 O OD1 . ASN C 3 103 ? 4.518 8.862 -5.799 1.00 79.61 103 C 1 +ATOM 2587 N ND2 . ASN C 3 103 ? 2.546 8.292 -5.014 1.00 79.77 103 C 1 +ATOM 2588 N N . LEU C 3 104 ? 1.858 8.886 -10.656 1.00 89.75 104 C 1 +ATOM 2589 C CA . LEU C 3 104 ? 1.607 8.442 -12.015 1.00 90.49 104 C 1 +ATOM 2590 C C . LEU C 3 104 ? 2.839 8.630 -12.906 1.00 90.44 104 C 1 +ATOM 2591 O O . LEU C 3 104 ? 3.467 9.685 -12.941 1.00 89.02 104 C 1 +ATOM 2592 C CB . LEU C 3 104 ? 0.380 9.165 -12.577 1.00 89.70 104 C 1 +ATOM 2593 C CG . LEU C 3 104 ? -0.948 8.742 -11.915 1.00 88.43 104 C 1 +ATOM 2594 C CD1 . LEU C 3 104 ? -2.043 9.746 -12.249 1.00 83.10 104 C 1 +ATOM 2595 C CD2 . LEU C 3 104 ? -1.393 7.361 -12.380 1.00 84.38 104 C 1 +ATOM 2596 N N . ARG C 3 105 ? 3.141 7.607 -13.690 1.00 91.17 105 C 1 +ATOM 2597 C CA . ARG C 3 105 ? 4.047 7.680 -14.839 1.00 91.71 105 C 1 +ATOM 2598 C C . ARG C 3 105 ? 3.482 6.788 -15.929 1.00 91.19 105 C 1 +ATOM 2599 O O . ARG C 3 105 ? 3.566 5.563 -15.833 1.00 89.75 105 C 1 +ATOM 2600 C CB . ARG C 3 105 ? 5.467 7.285 -14.421 1.00 91.72 105 C 1 +ATOM 2601 C CG . ARG C 3 105 ? 6.458 7.481 -15.580 1.00 88.59 105 C 1 +ATOM 2602 C CD . ARG C 3 105 ? 7.899 7.199 -15.131 1.00 86.51 105 C 1 +ATOM 2603 N NE . ARG C 3 105 ? 8.090 5.780 -14.802 1.00 78.14 105 C 1 +ATOM 2604 C CZ . ARG C 3 105 ? 9.165 5.239 -14.238 1.00 71.95 105 C 1 +ATOM 2605 N NH1 . ARG C 3 105 ? 10.204 5.966 -13.920 1.00 67.13 105 C 1 +ATOM 2606 N NH2 . ARG C 3 105 ? 9.203 3.963 -13.988 1.00 63.02 105 C 1 +ATOM 2607 N N . LEU C 3 106 ? 2.891 7.404 -16.942 1.00 90.13 106 C 1 +ATOM 2608 C CA . LEU C 3 106 ? 2.315 6.683 -18.066 1.00 90.43 106 C 1 +ATOM 2609 C C . LEU C 3 106 ? 3.398 5.978 -18.887 1.00 90.62 106 C 1 +ATOM 2610 O O . LEU C 3 106 ? 4.586 6.305 -18.798 1.00 89.66 106 C 1 +ATOM 2611 C CB . LEU C 3 106 ? 1.451 7.624 -18.923 1.00 89.60 106 C 1 +ATOM 2612 C CG . LEU C 3 106 ? 0.258 8.250 -18.180 1.00 89.39 106 C 1 +ATOM 2613 C CD1 . LEU C 3 106 ? -0.594 9.057 -19.161 1.00 84.70 106 C 1 +ATOM 2614 C CD2 . LEU C 3 106 ? -0.650 7.199 -17.534 1.00 83.70 106 C 1 +ATOM 2615 N N . MET C 3 107 ? 2.985 5.015 -19.688 1.00 90.45 107 C 1 +ATOM 2616 C CA . MET C 3 107 ? 3.833 4.459 -20.734 1.00 90.13 107 C 1 +ATOM 2617 C C . MET C 3 107 ? 4.172 5.547 -21.758 1.00 91.64 107 C 1 +ATOM 2618 O O . MET C 3 107 ? 3.402 6.488 -21.945 1.00 91.74 107 C 1 +ATOM 2619 C CB . MET C 3 107 ? 3.144 3.271 -21.402 1.00 88.58 107 C 1 +ATOM 2620 C CG . MET C 3 107 ? 2.888 2.108 -20.431 1.00 83.33 107 C 1 +ATOM 2621 S SD . MET C 3 107 ? 4.362 1.390 -19.662 1.00 74.81 107 C 1 +ATOM 2622 C CE . MET C 3 107 ? 5.101 0.574 -21.084 1.00 62.98 107 C 1 +ATOM 2623 N N . ALA C 3 108 ? 5.316 5.399 -22.417 1.00 91.94 108 C 1 +ATOM 2624 C CA . ALA C 3 108 ? 5.665 6.278 -23.532 1.00 93.11 108 C 1 +ATOM 2625 C C . ALA C 3 108 ? 4.589 6.191 -24.631 1.00 93.72 108 C 1 +ATOM 2626 O O . ALA C 3 108 ? 4.035 5.114 -24.849 1.00 92.54 108 C 1 +ATOM 2627 C CB . ALA C 3 108 ? 7.036 5.872 -24.068 1.00 92.40 108 C 1 +ATOM 2628 N N . PRO C 3 109 ? 4.310 7.297 -25.339 1.00 94.19 109 C 1 +ATOM 2629 C CA . PRO C 3 109 ? 3.498 7.249 -26.546 1.00 94.53 109 C 1 +ATOM 2630 C C . PRO C 3 109 ? 4.070 6.254 -27.562 1.00 95.02 109 C 1 +ATOM 2631 O O . PRO C 3 109 ? 5.281 6.075 -27.663 1.00 94.09 109 C 1 +ATOM 2632 C CB . PRO C 3 109 ? 3.466 8.678 -27.094 1.00 94.03 109 C 1 +ATOM 2633 C CG . PRO C 3 109 ? 3.729 9.525 -25.854 1.00 92.44 109 C 1 +ATOM 2634 C CD . PRO C 3 109 ? 4.698 8.664 -25.052 1.00 93.31 109 C 1 +ATOM 2635 N N . ILE C 3 110 ? 3.166 5.620 -28.313 1.00 93.45 110 C 1 +ATOM 2636 C CA . ILE C 3 110 ? 3.486 4.593 -29.310 1.00 93.48 110 C 1 +ATOM 2637 C C . ILE C 3 110 ? 2.876 4.945 -30.669 1.00 93.38 110 C 1 +ATOM 2638 O O . ILE C 3 110 ? 2.244 5.991 -30.821 1.00 92.43 110 C 1 +ATOM 2639 C CB . ILE C 3 110 ? 3.049 3.188 -28.823 1.00 92.39 110 C 1 +ATOM 2640 C CG1 . ILE C 3 110 ? 1.532 3.109 -28.568 1.00 88.71 110 C 1 +ATOM 2641 C CG2 . ILE C 3 110 ? 3.865 2.790 -27.577 1.00 87.00 110 C 1 +ATOM 2642 C CD1 . ILE C 3 110 ? 1.014 1.670 -28.403 1.00 82.42 110 C 1 +ATOM 2643 N N . SER C 3 111 ? 3.086 4.081 -31.654 1.00 93.41 111 C 1 +ATOM 2644 C CA . SER C 3 111 ? 2.516 4.228 -32.998 1.00 93.76 111 C 1 +ATOM 2645 C C . SER C 3 111 ? 2.824 5.584 -33.654 1.00 94.53 111 C 1 +ATOM 2646 O O . SER C 3 111 ? 1.992 6.141 -34.372 1.00 92.26 111 C 1 +ATOM 2647 C CB . SER C 3 111 ? 1.003 3.929 -33.004 1.00 92.30 111 C 1 +ATOM 2648 O OG . SER C 3 111 ? 0.692 2.712 -32.358 1.00 85.26 111 C 1 +ATOM 2649 N N . LEU C 3 112 ? 4.018 6.139 -33.391 1.00 93.21 112 C 1 +ATOM 2650 C CA . LEU C 3 112 ? 4.450 7.373 -34.037 1.00 94.15 112 C 1 +ATOM 2651 C C . LEU C 3 112 ? 4.534 7.160 -35.549 1.00 93.32 112 C 1 +ATOM 2652 O O . LEU C 3 112 ? 5.198 6.229 -36.013 1.00 92.21 112 C 1 +ATOM 2653 C CB . LEU C 3 112 ? 5.802 7.860 -33.500 1.00 94.73 112 C 1 +ATOM 2654 C CG . LEU C 3 112 ? 5.735 8.651 -32.185 1.00 94.11 112 C 1 +ATOM 2655 C CD1 . LEU C 3 112 ? 5.463 7.761 -30.970 1.00 85.02 112 C 1 +ATOM 2656 C CD2 . LEU C 3 112 ? 7.073 9.366 -31.961 1.00 86.16 112 C 1 +ATOM 2657 N N . GLN C 3 113 ? 3.902 8.046 -36.312 1.00 94.57 113 C 1 +ATOM 2658 C CA . GLN C 3 113 ? 3.891 7.966 -37.769 1.00 93.85 113 C 1 +ATOM 2659 C C . GLN C 3 113 ? 3.873 9.355 -38.411 1.00 94.27 113 C 1 +ATOM 2660 O O . GLN C 3 113 ? 3.273 10.298 -37.906 1.00 92.96 113 C 1 +ATOM 2661 C CB . GLN C 3 113 ? 2.713 7.097 -38.242 1.00 91.02 113 C 1 +ATOM 2662 C CG . GLN C 3 113 ? 1.344 7.575 -37.735 1.00 80.51 113 C 1 +ATOM 2663 C CD . GLN C 3 113 ? 0.191 6.656 -38.147 1.00 78.15 113 C 1 +ATOM 2664 O OE1 . GLN C 3 113 ? 0.256 5.928 -39.113 1.00 68.80 113 C 1 +ATOM 2665 N NE2 . GLN C 3 113 ? -0.902 6.675 -37.429 1.00 65.32 113 C 1 +ATOM 2666 N N . VAL C 3 114 ? 4.512 9.464 -39.579 1.00 93.71 114 C 1 +ATOM 2667 C CA . VAL C 3 114 ? 4.409 10.638 -40.451 1.00 92.92 114 C 1 +ATOM 2668 C C . VAL C 3 114 ? 3.082 10.557 -41.200 1.00 92.71 114 C 1 +ATOM 2669 O O . VAL C 3 114 ? 2.878 9.667 -42.023 1.00 90.69 114 C 1 +ATOM 2670 C CB . VAL C 3 114 ? 5.596 10.716 -41.423 1.00 92.04 114 C 1 +ATOM 2671 C CG1 . VAL C 3 114 ? 5.452 11.902 -42.376 1.00 86.57 114 C 1 +ATOM 2672 C CG2 . VAL C 3 114 ? 6.920 10.876 -40.667 1.00 85.90 114 C 1 +ATOM 2673 N N . VAL C 3 115 ? 2.184 11.495 -40.923 1.00 93.05 115 C 1 +ATOM 2674 C CA . VAL C 3 115 ? 0.894 11.621 -41.619 1.00 91.98 115 C 1 +ATOM 2675 C C . VAL C 3 115 ? 1.074 12.326 -42.958 1.00 92.20 115 C 1 +ATOM 2676 O O . VAL C 3 115 ? 0.502 11.931 -43.969 1.00 89.38 115 C 1 +ATOM 2677 C CB . VAL C 3 115 ? -0.117 12.395 -40.751 1.00 90.48 115 C 1 +ATOM 2678 C CG1 . VAL C 3 115 ? -1.480 12.532 -41.432 1.00 82.34 115 C 1 +ATOM 2679 C CG2 . VAL C 3 115 ? -0.339 11.700 -39.405 1.00 82.78 115 C 1 +ATOM 2680 N N . HIS C 3 116 ? 1.895 13.403 -42.956 1.00 92.12 116 C 1 +ATOM 2681 C CA . HIS C 3 116 ? 2.187 14.185 -44.150 1.00 92.20 116 C 1 +ATOM 2682 C C . HIS C 3 116 ? 3.547 14.870 -44.019 1.00 92.66 116 C 1 +ATOM 2683 O O . HIS C 3 116 ? 3.884 15.363 -42.948 1.00 90.63 116 C 1 +ATOM 2684 C CB . HIS C 3 116 ? 1.076 15.222 -44.350 1.00 90.38 116 C 1 +ATOM 2685 C CG . HIS C 3 116 ? 1.235 16.002 -45.627 1.00 88.91 116 C 1 +ATOM 2686 N ND1 . HIS C 3 116 ? 1.181 15.465 -46.898 1.00 78.80 116 C 1 +ATOM 2687 C CD2 . HIS C 3 116 ? 1.471 17.340 -45.734 1.00 79.04 116 C 1 +ATOM 2688 C CE1 . HIS C 3 116 ? 1.378 16.480 -47.753 1.00 78.53 116 C 1 +ATOM 2689 N NE2 . HIS C 3 116 ? 1.553 17.624 -47.079 1.00 80.11 116 C 1 +ATOM 2690 N N . VAL C 3 117 ? 4.325 14.916 -45.074 1.00 92.12 117 C 1 +ATOM 2691 C CA . VAL C 3 117 ? 5.628 15.587 -45.118 1.00 92.63 117 C 1 +ATOM 2692 C C . VAL C 3 117 ? 5.763 16.438 -46.375 1.00 92.20 117 C 1 +ATOM 2693 O O . VAL C 3 117 ? 5.446 15.995 -47.487 1.00 89.10 117 C 1 +ATOM 2694 C CB . VAL C 3 117 ? 6.785 14.584 -44.942 1.00 90.75 117 C 1 +ATOM 2695 C CG1 . VAL C 3 117 ? 6.953 13.616 -46.107 1.00 81.15 117 C 1 +ATOM 2696 C CG2 . VAL C 3 117 ? 8.116 15.308 -44.697 1.00 81.42 117 C 1 +ATOM 2697 N N . GLU C 3 118 ? 6.268 17.657 -46.176 1.00 92.11 118 C 1 +ATOM 2698 C CA . GLU C 3 118 ? 6.559 18.631 -47.222 1.00 91.94 118 C 1 +ATOM 2699 C C . GLU C 3 118 ? 8.053 19.023 -47.203 1.00 92.11 118 C 1 +ATOM 2700 O O . GLU C 3 118 ? 8.882 18.346 -46.587 1.00 89.92 118 C 1 +ATOM 2701 C CB . GLU C 3 118 ? 5.635 19.855 -47.061 1.00 89.86 118 C 1 +ATOM 2702 C CG . GLU C 3 118 ? 4.154 19.510 -47.218 1.00 85.83 118 C 1 +ATOM 2703 C CD . GLU C 3 118 ? 3.246 20.758 -47.199 1.00 85.22 118 C 1 +ATOM 2704 O OE1 . GLU C 3 118 ? 2.021 20.565 -47.393 1.00 77.18 118 C 1 +ATOM 2705 O OE2 . GLU C 3 118 ? 3.760 21.877 -47.002 1.00 79.95 118 C 1 +ATOM 2706 N N . THR C 3 119 ? 8.405 20.113 -47.883 1.00 92.73 119 C 1 +ATOM 2707 C CA . THR C 3 119 ? 9.772 20.660 -47.894 1.00 92.48 119 C 1 +ATOM 2708 C C . THR C 3 119 ? 10.146 21.326 -46.580 1.00 92.84 119 C 1 +ATOM 2709 O O . THR C 3 119 ? 11.276 21.183 -46.127 1.00 90.16 119 C 1 +ATOM 2710 C CB . THR C 3 119 ? 9.936 21.681 -49.033 1.00 90.91 119 C 1 +ATOM 2711 O OG1 . THR C 3 119 ? 8.844 22.580 -49.028 1.00 82.02 119 C 1 +ATOM 2712 C CG2 . THR C 3 119 ? 9.924 21.009 -50.404 1.00 82.01 119 C 1 +ATOM 2713 N N . HIS C 3 120 ? 9.206 22.017 -45.931 1.00 92.84 120 C 1 +ATOM 2714 C CA . HIS C 3 120 ? 9.412 22.801 -44.709 1.00 92.96 120 C 1 +ATOM 2715 C C . HIS C 3 120 ? 8.505 22.385 -43.547 1.00 93.34 120 C 1 +ATOM 2716 O O . HIS C 3 120 ? 8.565 22.997 -42.481 1.00 90.03 120 C 1 +ATOM 2717 C CB . HIS C 3 120 ? 9.209 24.285 -45.027 1.00 91.77 120 C 1 +ATOM 2718 C CG . HIS C 3 120 ? 10.176 24.807 -46.042 1.00 91.19 120 C 1 +ATOM 2719 N ND1 . HIS C 3 120 ? 11.507 25.075 -45.816 1.00 79.67 120 C 1 +ATOM 2720 C CD2 . HIS C 3 120 ? 9.922 25.127 -47.346 1.00 80.09 120 C 1 +ATOM 2721 C CE1 . HIS C 3 120 ? 12.033 25.552 -46.964 1.00 81.92 120 C 1 +ATOM 2722 N NE2 . HIS C 3 120 ? 11.106 25.588 -47.914 1.00 83.33 120 C 1 +ATOM 2723 N N . ARG C 3 121 ? 7.647 21.383 -43.726 1.00 92.49 121 C 1 +ATOM 2724 C CA . ARG C 3 121 ? 6.643 20.960 -42.747 1.00 93.55 121 C 1 +ATOM 2725 C C . ARG C 3 121 ? 6.558 19.443 -42.648 1.00 93.53 121 C 1 +ATOM 2726 O O . ARG C 3 121 ? 6.779 18.734 -43.628 1.00 91.21 121 C 1 +ATOM 2727 C CB . ARG C 3 121 ? 5.258 21.540 -43.096 1.00 91.57 121 C 1 +ATOM 2728 C CG . ARG C 3 121 ? 5.210 23.064 -42.952 1.00 84.37 121 C 1 +ATOM 2729 C CD . ARG C 3 121 ? 3.804 23.582 -43.269 1.00 83.76 121 C 1 +ATOM 2730 N NE . ARG C 3 121 ? 3.650 24.994 -42.891 1.00 72.77 121 C 1 +ATOM 2731 C CZ . ARG C 3 121 ? 2.632 25.789 -43.140 1.00 66.63 121 C 1 +ATOM 2732 N NH1 . ARG C 3 121 ? 1.651 25.413 -43.909 1.00 60.82 121 C 1 +ATOM 2733 N NH2 . ARG C 3 121 ? 2.596 26.956 -42.604 1.00 57.27 121 C 1 +ATOM 2734 N N . CYS C 3 122 ? 6.184 18.976 -41.456 1.00 92.52 122 C 1 +ATOM 2735 C CA . CYS C 3 122 ? 5.876 17.570 -41.231 1.00 93.21 122 C 1 +ATOM 2736 C C . CYS C 3 122 ? 4.764 17.438 -40.192 1.00 93.24 122 C 1 +ATOM 2737 O O . CYS C 3 122 ? 4.866 17.982 -39.088 1.00 92.18 122 C 1 +ATOM 2738 C CB . CYS C 3 122 ? 7.155 16.848 -40.800 1.00 93.01 122 C 1 +ATOM 2739 S SG . CYS C 3 122 ? 6.856 15.058 -40.742 1.00 91.61 122 C 1 +ATOM 2740 N N . ASN C 3 123 ? 3.713 16.684 -40.515 1.00 93.47 123 C 1 +ATOM 2741 C CA . ASN C 3 123 ? 2.655 16.323 -39.577 1.00 93.83 123 C 1 +ATOM 2742 C C . ASN C 3 123 ? 2.924 14.923 -39.043 1.00 93.79 123 C 1 +ATOM 2743 O O . ASN C 3 123 ? 3.042 13.967 -39.816 1.00 92.37 123 C 1 +ATOM 2744 C CB . ASN C 3 123 ? 1.286 16.410 -40.264 1.00 92.82 123 C 1 +ATOM 2745 C CG . ASN C 3 123 ? 0.883 17.817 -40.654 1.00 87.95 123 C 1 +ATOM 2746 O OD1 . ASN C 3 123 ? 1.463 18.809 -40.265 1.00 80.16 123 C 1 +ATOM 2747 N ND2 . ASN C 3 123 ? -0.145 17.949 -41.460 1.00 79.91 123 C 1 +ATOM 2748 N N . ILE C 3 124 ? 3.003 14.809 -37.708 1.00 93.64 124 C 1 +ATOM 2749 C CA . ILE C 3 124 ? 3.266 13.552 -37.011 1.00 94.13 124 C 1 +ATOM 2750 C C . ILE C 3 124 ? 2.096 13.273 -36.075 1.00 93.59 124 C 1 +ATOM 2751 O O . ILE C 3 124 ? 1.631 14.178 -35.388 1.00 91.71 124 C 1 +ATOM 2752 C CB . ILE C 3 124 ? 4.618 13.605 -36.276 1.00 94.32 124 C 1 +ATOM 2753 C CG1 . ILE C 3 124 ? 5.770 13.836 -37.286 1.00 91.98 124 C 1 +ATOM 2754 C CG2 . ILE C 3 124 ? 4.856 12.310 -35.472 1.00 91.81 124 C 1 +ATOM 2755 C CD1 . ILE C 3 124 ? 7.144 14.056 -36.642 1.00 90.13 124 C 1 +ATOM 2756 N N . SER C 3 125 ? 1.653 12.020 -36.017 1.00 94.47 125 C 1 +ATOM 2757 C CA . SER C 3 125 ? 0.672 11.543 -35.045 1.00 94.50 125 C 1 +ATOM 2758 C C . SER C 3 125 ? 1.247 10.427 -34.181 1.00 94.79 125 C 1 +ATOM 2759 O O . SER C 3 125 ? 2.237 9.789 -34.544 1.00 94.44 125 C 1 +ATOM 2760 C CB . SER C 3 125 ? -0.624 11.097 -35.732 1.00 93.23 125 C 1 +ATOM 2761 O OG . SER C 3 125 ? -0.407 9.951 -36.535 1.00 88.09 125 C 1 +ATOM 2762 N N . TRP C 3 126 ? 0.619 10.194 -33.018 1.00 94.60 126 C 1 +ATOM 2763 C CA . TRP C 3 126 ? 0.947 9.111 -32.097 1.00 95.01 126 C 1 +ATOM 2764 C C . TRP C 3 126 ? -0.294 8.620 -31.364 1.00 94.38 126 C 1 +ATOM 2765 O O . TRP C 3 126 ? -1.362 9.210 -31.445 1.00 91.92 126 C 1 +ATOM 2766 C CB . TRP C 3 126 ? 2.011 9.583 -31.101 1.00 94.67 126 C 1 +ATOM 2767 C CG . TRP C 3 126 ? 1.630 10.789 -30.302 1.00 94.69 126 C 1 +ATOM 2768 C CD1 . TRP C 3 126 ? 0.919 10.792 -29.149 1.00 92.96 126 C 1 +ATOM 2769 C CD2 . TRP C 3 126 ? 1.907 12.194 -30.602 1.00 94.75 126 C 1 +ATOM 2770 N NE1 . TRP C 3 126 ? 0.737 12.097 -28.714 1.00 92.84 126 C 1 +ATOM 2771 C CE2 . TRP C 3 126 ? 1.333 12.987 -29.581 1.00 93.90 126 C 1 +ATOM 2772 C CE3 . TRP C 3 126 ? 2.594 12.850 -31.647 1.00 93.33 126 C 1 +ATOM 2773 C CZ2 . TRP C 3 126 ? 1.427 14.394 -29.582 1.00 93.22 126 C 1 +ATOM 2774 C CZ3 . TRP C 3 126 ? 2.690 14.249 -31.655 1.00 93.20 126 C 1 +ATOM 2775 C CH2 . TRP C 3 126 ? 2.105 15.017 -30.637 1.00 92.61 126 C 1 +ATOM 2776 N N . GLU C 3 127 ? -0.132 7.548 -30.600 1.00 93.23 127 C 1 +ATOM 2777 C CA . GLU C 3 127 ? -1.161 6.980 -29.734 1.00 92.62 127 C 1 +ATOM 2778 C C . GLU C 3 127 ? -0.668 6.910 -28.286 1.00 92.75 127 C 1 +ATOM 2779 O O . GLU C 3 127 ? 0.521 6.741 -28.009 1.00 92.04 127 C 1 +ATOM 2780 C CB . GLU C 3 127 ? -1.573 5.587 -30.225 1.00 90.75 127 C 1 +ATOM 2781 C CG . GLU C 3 127 ? -2.265 5.602 -31.590 1.00 84.09 127 C 1 +ATOM 2782 C CD . GLU C 3 127 ? -2.570 4.189 -32.123 1.00 81.55 127 C 1 +ATOM 2783 O OE1 . GLU C 3 127 ? -3.321 4.097 -33.115 1.00 73.08 127 C 1 +ATOM 2784 O OE2 . GLU C 3 127 ? -2.011 3.205 -31.580 1.00 75.04 127 C 1 +ATOM 2785 N N . ILE C 3 128 ? -1.597 7.002 -27.337 1.00 91.24 128 C 1 +ATOM 2786 C CA . ILE C 3 128 ? -1.302 6.833 -25.910 1.00 89.58 128 C 1 +ATOM 2787 C C . ILE C 3 128 ? -1.571 5.378 -25.520 1.00 87.82 128 C 1 +ATOM 2788 O O . ILE C 3 128 ? -2.679 4.874 -25.669 1.00 83.72 128 C 1 +ATOM 2789 C CB . ILE C 3 128 ? -2.126 7.802 -25.046 1.00 87.55 128 C 1 +ATOM 2790 C CG1 . ILE C 3 128 ? -1.957 9.270 -25.489 1.00 80.13 128 C 1 +ATOM 2791 C CG2 . ILE C 3 128 ? -1.697 7.658 -23.576 1.00 77.08 128 C 1 +ATOM 2792 C CD1 . ILE C 3 128 ? -3.009 10.177 -24.842 1.00 69.50 128 C 1 +ATOM 2793 N N . SER C 3 129 ? -0.563 4.714 -24.951 1.00 86.16 129 C 1 +ATOM 2794 C CA . SER C 3 129 ? -0.682 3.335 -24.484 1.00 83.91 129 C 1 +ATOM 2795 C C . SER C 3 129 ? -1.117 3.264 -23.017 1.00 83.41 129 C 1 +ATOM 2796 O O . SER C 3 129 ? -0.605 4.003 -22.178 1.00 77.37 129 C 1 +ATOM 2797 C CB . SER C 3 129 ? 0.644 2.612 -24.685 1.00 79.82 129 C 1 +ATOM 2798 O OG . SER C 3 129 ? 0.498 1.246 -24.365 1.00 72.81 129 C 1 +ATOM 2799 N N . GLN C 3 130 ? -2.014 2.347 -22.691 1.00 77.70 130 C 1 +ATOM 2800 C CA . GLN C 3 130 ? -2.376 1.947 -21.315 1.00 78.43 130 C 1 +ATOM 2801 C C . GLN C 3 130 ? -2.767 3.111 -20.375 1.00 79.35 130 C 1 +ATOM 2802 O O . GLN C 3 130 ? -2.544 3.051 -19.162 1.00 76.01 130 C 1 +ATOM 2803 C CB . GLN C 3 130 ? -1.268 1.067 -20.711 1.00 77.15 130 C 1 +ATOM 2804 C CG . GLN C 3 130 ? -0.955 -0.170 -21.557 1.00 76.03 130 C 1 +ATOM 2805 C CD . GLN C 3 130 ? 0.173 -1.018 -20.973 1.00 72.39 130 C 1 +ATOM 2806 O OE1 . GLN C 3 130 ? 0.550 -0.919 -19.822 1.00 66.99 130 C 1 +ATOM 2807 N NE2 . GLN C 3 130 ? 0.753 -1.887 -21.775 1.00 65.51 130 C 1 +ATOM 2808 N N . ALA C 3 131 ? -3.347 4.177 -20.913 1.00 78.46 131 C 1 +ATOM 2809 C CA . ALA C 3 131 ? -3.811 5.302 -20.107 1.00 79.73 131 C 1 +ATOM 2810 C C . ALA C 3 131 ? -5.231 5.062 -19.582 1.00 80.41 131 C 1 +ATOM 2811 O O . ALA C 3 131 ? -6.133 4.624 -20.304 1.00 77.54 131 C 1 +ATOM 2812 C CB . ALA C 3 131 ? -3.701 6.590 -20.911 1.00 77.78 131 C 1 +ATOM 2813 N N . SER C 3 132 ? -5.444 5.377 -18.298 1.00 79.28 132 C 1 +ATOM 2814 C CA . SER C 3 132 ? -6.758 5.256 -17.666 1.00 79.62 132 C 1 +ATOM 2815 C C . SER C 3 132 ? -7.782 6.209 -18.282 1.00 79.82 132 C 1 +ATOM 2816 O O . SER C 3 132 ? -7.484 7.362 -18.561 1.00 77.85 132 C 1 +ATOM 2817 C CB . SER C 3 132 ? -6.663 5.526 -16.171 1.00 77.40 132 C 1 +ATOM 2818 O OG . SER C 3 132 ? -7.918 5.304 -15.565 1.00 73.07 132 C 1 +ATOM 2819 N N . HIS C 3 133 ? -9.019 5.749 -18.394 1.00 76.32 133 C 1 +ATOM 2820 C CA . HIS C 3 133 ? -10.147 6.584 -18.807 1.00 75.30 133 C 1 +ATOM 2821 C C . HIS C 3 133 ? -10.420 7.746 -17.835 1.00 76.13 133 C 1 +ATOM 2822 O O . HIS C 3 133 ? -10.971 8.752 -18.251 1.00 73.25 133 C 1 +ATOM 2823 C CB . HIS C 3 133 ? -11.398 5.717 -18.955 1.00 72.32 133 C 1 +ATOM 2824 C CG . HIS C 3 133 ? -11.224 4.583 -19.921 1.00 65.60 133 C 1 +ATOM 2825 N ND1 . HIS C 3 133 ? -10.929 4.685 -21.263 1.00 56.82 133 C 1 +ATOM 2826 C CD2 . HIS C 3 133 ? -11.330 3.242 -19.638 1.00 56.02 133 C 1 +ATOM 2827 C CE1 . HIS C 3 133 ? -10.856 3.441 -21.769 1.00 51.11 133 C 1 +ATOM 2828 N NE2 . HIS C 3 133 ? -11.091 2.535 -20.820 1.00 51.89 133 C 1 +ATOM 2829 N N . TYR C 3 134 ? -9.972 7.642 -16.577 1.00 76.35 134 C 1 +ATOM 2830 C CA . TYR C 3 134 ? -10.134 8.704 -15.580 1.00 75.19 134 C 1 +ATOM 2831 C C . TYR C 3 134 ? -9.458 10.025 -15.953 1.00 75.35 134 C 1 +ATOM 2832 O O . TYR C 3 134 ? -9.867 11.062 -15.440 1.00 72.64 134 C 1 +ATOM 2833 C CB . TYR C 3 134 ? -9.592 8.223 -14.226 1.00 71.90 134 C 1 +ATOM 2834 C CG . TYR C 3 134 ? -10.391 7.110 -13.579 1.00 67.81 134 C 1 +ATOM 2835 C CD1 . TYR C 3 134 ? -11.762 7.286 -13.320 1.00 61.50 134 C 1 +ATOM 2836 C CD2 . TYR C 3 134 ? -9.766 5.905 -13.206 1.00 60.33 134 C 1 +ATOM 2837 C CE1 . TYR C 3 134 ? -12.516 6.271 -12.720 1.00 54.82 134 C 1 +ATOM 2838 C CE2 . TYR C 3 134 ? -10.511 4.884 -12.595 1.00 54.62 134 C 1 +ATOM 2839 C CZ . TYR C 3 134 ? -11.888 5.065 -12.356 1.00 54.80 134 C 1 +ATOM 2840 O OH . TYR C 3 134 ? -12.628 4.064 -11.775 1.00 51.31 134 C 1 +ATOM 2841 N N . PHE C 3 135 ? -8.465 10.014 -16.820 1.00 73.85 135 C 1 +ATOM 2842 C CA . PHE C 3 135 ? -7.806 11.252 -17.245 1.00 73.62 135 C 1 +ATOM 2843 C C . PHE C 3 135 ? -8.616 12.041 -18.267 1.00 71.90 135 C 1 +ATOM 2844 O O . PHE C 3 135 ? -8.394 13.240 -18.402 1.00 67.63 135 C 1 +ATOM 2845 C CB . PHE C 3 135 ? -6.407 10.935 -17.793 1.00 73.59 135 C 1 +ATOM 2846 C CG . PHE C 3 135 ? -5.526 10.216 -16.805 1.00 77.70 135 C 1 +ATOM 2847 C CD1 . PHE C 3 135 ? -5.364 10.719 -15.500 1.00 73.02 135 C 1 +ATOM 2848 C CD2 . PHE C 3 135 ? -4.880 9.021 -17.172 1.00 75.36 135 C 1 +ATOM 2849 C CE1 . PHE C 3 135 ? -4.594 10.026 -14.568 1.00 71.88 135 C 1 +ATOM 2850 C CE2 . PHE C 3 135 ? -4.097 8.331 -16.235 1.00 72.78 135 C 1 +ATOM 2851 C CZ . PHE C 3 135 ? -3.966 8.829 -14.933 1.00 76.26 135 C 1 +ATOM 2852 N N . GLU C 3 136 ? -9.536 11.413 -18.972 1.00 69.45 136 C 1 +ATOM 2853 C CA . GLU C 3 136 ? -10.320 12.007 -20.054 1.00 67.01 136 C 1 +ATOM 2854 C C . GLU C 3 136 ? -9.482 12.934 -20.955 1.00 67.82 136 C 1 +ATOM 2855 O O . GLU C 3 136 ? -8.733 12.459 -21.812 1.00 62.52 136 C 1 +ATOM 2856 C CB . GLU C 3 136 ? -11.569 12.729 -19.502 1.00 61.35 136 C 1 +ATOM 2857 C CG . GLU C 3 136 ? -12.585 11.795 -18.836 1.00 55.67 136 C 1 +ATOM 2858 C CD . GLU C 3 136 ? -13.909 12.527 -18.534 1.00 51.08 136 C 1 +ATOM 2859 O OE1 . GLU C 3 136 ? -14.893 11.825 -18.223 1.00 45.30 136 C 1 +ATOM 2860 O OE2 . GLU C 3 136 ? -13.946 13.772 -18.659 1.00 48.12 136 C 1 +ATOM 2861 N N . ARG C 3 137 ? -9.594 14.255 -20.751 1.00 69.92 137 C 1 +ATOM 2862 C CA . ARG C 3 137 ? -8.890 15.306 -21.503 1.00 70.35 137 C 1 +ATOM 2863 C C . ARG C 3 137 ? -7.725 15.934 -20.734 1.00 73.73 137 C 1 +ATOM 2864 O O . ARG C 3 137 ? -7.078 16.823 -21.269 1.00 68.85 137 C 1 +ATOM 2865 C CB . ARG C 3 137 ? -9.896 16.372 -21.962 1.00 64.02 137 C 1 +ATOM 2866 C CG . ARG C 3 137 ? -10.950 15.784 -22.909 1.00 57.77 137 C 1 +ATOM 2867 C CD . ARG C 3 137 ? -11.871 16.897 -23.418 1.00 53.01 137 C 1 +ATOM 2868 N NE . ARG C 3 137 ? -12.906 16.361 -24.315 1.00 46.89 137 C 1 +ATOM 2869 C CZ . ARG C 3 137 ? -13.844 17.067 -24.925 1.00 40.84 137 C 1 +ATOM 2870 N NH1 . ARG C 3 137 ? -13.919 18.363 -24.782 1.00 37.80 137 C 1 +ATOM 2871 N NH2 . ARG C 3 137 ? -14.716 16.469 -25.684 1.00 35.48 137 C 1 +ATOM 2872 N N . HIS C 3 138 ? -7.461 15.501 -19.509 1.00 81.47 138 C 1 +ATOM 2873 C CA . HIS C 3 138 ? -6.460 16.094 -18.622 1.00 82.97 138 C 1 +ATOM 2874 C C . HIS C 3 138 ? -5.073 15.466 -18.824 1.00 85.00 138 C 1 +ATOM 2875 O O . HIS C 3 138 ? -4.459 14.937 -17.898 1.00 82.73 138 C 1 +ATOM 2876 C CB . HIS C 3 138 ? -6.949 16.034 -17.173 1.00 78.66 138 C 1 +ATOM 2877 C CG . HIS C 3 138 ? -8.250 16.759 -16.973 1.00 71.91 138 C 1 +ATOM 2878 N ND1 . HIS C 3 138 ? -8.425 18.124 -16.958 1.00 61.41 138 C 1 +ATOM 2879 C CD2 . HIS C 3 138 ? -9.489 16.189 -16.805 1.00 60.93 138 C 1 +ATOM 2880 C CE1 . HIS C 3 138 ? -9.729 18.376 -16.777 1.00 57.69 138 C 1 +ATOM 2881 N NE2 . HIS C 3 138 ? -10.410 17.231 -16.684 1.00 57.54 138 C 1 +ATOM 2882 N N . LEU C 3 139 ? -4.575 15.532 -20.065 1.00 86.32 139 C 1 +ATOM 2883 C CA . LEU C 3 139 ? -3.226 15.115 -20.438 1.00 88.04 139 C 1 +ATOM 2884 C C . LEU C 3 139 ? -2.503 16.281 -21.109 1.00 88.48 139 C 1 +ATOM 2885 O O . LEU C 3 139 ? -3.110 17.048 -21.859 1.00 86.63 139 C 1 +ATOM 2886 C CB . LEU C 3 139 ? -3.280 13.898 -21.374 1.00 86.95 139 C 1 +ATOM 2887 C CG . LEU C 3 139 ? -3.886 12.625 -20.753 1.00 86.34 139 C 1 +ATOM 2888 C CD1 . LEU C 3 139 ? -3.975 11.525 -21.804 1.00 81.42 139 C 1 +ATOM 2889 C CD2 . LEU C 3 139 ? -3.050 12.084 -19.600 1.00 82.03 139 C 1 +ATOM 2890 N N . GLU C 3 140 ? -1.198 16.392 -20.852 1.00 91.32 140 C 1 +ATOM 2891 C CA . GLU C 3 140 ? -0.289 17.280 -21.573 1.00 91.63 140 C 1 +ATOM 2892 C C . GLU C 3 140 ? 0.809 16.466 -22.259 1.00 92.62 140 C 1 +ATOM 2893 O O . GLU C 3 140 ? 1.131 15.347 -21.848 1.00 92.03 140 C 1 +ATOM 2894 C CB . GLU C 3 140 ? 0.259 18.382 -20.644 1.00 88.70 140 C 1 +ATOM 2895 C CG . GLU C 3 140 ? 1.111 17.870 -19.468 1.00 79.82 140 C 1 +ATOM 2896 C CD . GLU C 3 140 ? 1.593 18.988 -18.521 1.00 81.32 140 C 1 +ATOM 2897 O OE1 . GLU C 3 140 ? 2.093 18.653 -17.421 1.00 73.32 140 C 1 +ATOM 2898 O OE2 . GLU C 3 140 ? 1.468 20.176 -18.878 1.00 76.69 140 C 1 +ATOM 2899 N N . PHE C 3 141 ? 1.369 17.027 -23.312 1.00 93.10 141 C 1 +ATOM 2900 C CA . PHE C 3 141 ? 2.450 16.423 -24.076 1.00 93.60 141 C 1 +ATOM 2901 C C . PHE C 3 141 ? 3.633 17.374 -24.182 1.00 93.87 141 C 1 +ATOM 2902 O O . PHE C 3 141 ? 3.462 18.588 -24.257 1.00 92.73 141 C 1 +ATOM 2903 C CB . PHE C 3 141 ? 1.968 15.997 -25.469 1.00 92.85 141 C 1 +ATOM 2904 C CG . PHE C 3 141 ? 0.868 14.966 -25.451 1.00 92.11 141 C 1 +ATOM 2905 C CD1 . PHE C 3 141 ? 1.183 13.595 -25.534 1.00 85.78 141 C 1 +ATOM 2906 C CD2 . PHE C 3 141 ? -0.483 15.363 -25.355 1.00 86.30 141 C 1 +ATOM 2907 C CE1 . PHE C 3 141 ? 0.158 12.642 -25.520 1.00 85.10 141 C 1 +ATOM 2908 C CE2 . PHE C 3 141 ? -1.509 14.404 -25.331 1.00 84.32 141 C 1 +ATOM 2909 C CZ . PHE C 3 141 ? -1.183 13.042 -25.419 1.00 88.01 141 C 1 +ATOM 2910 N N . GLU C 3 142 ? 4.835 16.826 -24.222 1.00 94.68 142 C 1 +ATOM 2911 C CA . GLU C 3 142 ? 6.031 17.512 -24.686 1.00 95.02 142 C 1 +ATOM 2912 C C . GLU C 3 142 ? 6.618 16.758 -25.868 1.00 95.53 142 C 1 +ATOM 2913 O O . GLU C 3 142 ? 6.705 15.532 -25.847 1.00 95.03 142 C 1 +ATOM 2914 C CB . GLU C 3 142 ? 7.076 17.641 -23.579 1.00 93.48 142 C 1 +ATOM 2915 C CG . GLU C 3 142 ? 6.811 18.814 -22.641 1.00 87.84 142 C 1 +ATOM 2916 C CD . GLU C 3 142 ? 7.850 18.900 -21.515 1.00 89.83 142 C 1 +ATOM 2917 O OE1 . GLU C 3 142 ? 7.849 19.897 -20.770 1.00 82.67 142 C 1 +ATOM 2918 O OE2 . GLU C 3 142 ? 8.662 17.953 -21.373 1.00 84.58 142 C 1 +ATOM 2919 N N . ALA C 3 143 ? 7.048 17.507 -26.866 1.00 95.01 143 C 1 +ATOM 2920 C CA . ALA C 3 143 ? 7.707 16.979 -28.036 1.00 94.93 143 C 1 +ATOM 2921 C C . ALA C 3 143 ? 9.064 17.657 -28.255 1.00 94.96 143 C 1 +ATOM 2922 O O . ALA C 3 143 ? 9.262 18.804 -27.858 1.00 93.55 143 C 1 +ATOM 2923 C CB . ALA C 3 143 ? 6.775 17.138 -29.240 1.00 93.81 143 C 1 +ATOM 2924 N N . ARG C 3 144 ? 9.995 16.954 -28.892 1.00 95.72 144 C 1 +ATOM 2925 C CA . ARG C 3 144 ? 11.294 17.488 -29.312 1.00 95.71 144 C 1 +ATOM 2926 C C . ARG C 3 144 ? 11.702 16.921 -30.666 1.00 95.48 144 C 1 +ATOM 2927 O O . ARG C 3 144 ? 11.350 15.793 -31.002 1.00 94.54 144 C 1 +ATOM 2928 C CB . ARG C 3 144 ? 12.351 17.247 -28.221 1.00 94.52 144 C 1 +ATOM 2929 C CG . ARG C 3 144 ? 12.651 15.768 -27.956 1.00 93.58 144 C 1 +ATOM 2930 C CD . ARG C 3 144 ? 13.633 15.641 -26.782 1.00 93.59 144 C 1 +ATOM 2931 N NE . ARG C 3 144 ? 14.036 14.258 -26.551 1.00 92.76 144 C 1 +ATOM 2932 C CZ . ARG C 3 144 ? 14.918 13.845 -25.653 1.00 92.93 144 C 1 +ATOM 2933 N NH1 . ARG C 3 144 ? 15.492 14.672 -24.821 1.00 88.57 144 C 1 +ATOM 2934 N NH2 . ARG C 3 144 ? 15.242 12.590 -25.584 1.00 88.88 144 C 1 +ATOM 2935 N N . THR C 3 145 ? 12.456 17.719 -31.415 1.00 94.81 145 C 1 +ATOM 2936 C CA . THR C 3 145 ? 12.926 17.358 -32.755 1.00 94.31 145 C 1 +ATOM 2937 C C . THR C 3 145 ? 14.441 17.457 -32.796 1.00 93.90 145 C 1 +ATOM 2938 O O . THR C 3 145 ? 14.994 18.532 -32.569 1.00 92.00 145 C 1 +ATOM 2939 C CB . THR C 3 145 ? 12.297 18.263 -33.821 1.00 93.34 145 C 1 +ATOM 2940 O OG1 . THR C 3 145 ? 10.894 18.230 -33.707 1.00 86.90 145 C 1 +ATOM 2941 C CG2 . THR C 3 145 ? 12.637 17.804 -35.237 1.00 86.03 145 C 1 +ATOM 2942 N N . LEU C 3 146 ? 15.100 16.344 -33.072 1.00 94.08 146 C 1 +ATOM 2943 C CA . LEU C 3 146 ? 16.538 16.284 -33.268 1.00 93.63 146 C 1 +ATOM 2944 C C . LEU C 3 146 ? 16.873 16.719 -34.695 1.00 93.41 146 C 1 +ATOM 2945 O O . LEU C 3 146 ? 16.423 16.098 -35.665 1.00 91.65 146 C 1 +ATOM 2946 C CB . LEU C 3 146 ? 17.026 14.859 -32.973 1.00 92.54 146 C 1 +ATOM 2947 C CG . LEU C 3 146 ? 18.546 14.685 -33.091 1.00 90.48 146 C 1 +ATOM 2948 C CD1 . LEU C 3 146 ? 19.300 15.504 -32.036 1.00 83.55 146 C 1 +ATOM 2949 C CD2 . LEU C 3 146 ? 18.912 13.214 -32.883 1.00 84.10 146 C 1 +ATOM 2950 N N . SER C 3 147 ? 17.674 17.778 -34.798 1.00 92.30 147 C 1 +ATOM 2951 C CA . SER C 3 147 ? 18.210 18.272 -36.061 1.00 90.97 147 C 1 +ATOM 2952 C C . SER C 3 147 ? 19.630 17.730 -36.287 1.00 91.27 147 C 1 +ATOM 2953 O O . SER C 3 147 ? 20.338 17.454 -35.312 1.00 88.50 147 C 1 +ATOM 2954 C CB . SER C 3 147 ? 18.223 19.799 -36.072 1.00 87.84 147 C 1 +ATOM 2955 O OG . SER C 3 147 ? 16.911 20.297 -35.865 1.00 78.02 147 C 1 +ATOM 2956 N N . PRO C 3 148 ? 20.097 17.612 -37.530 1.00 90.34 148 C 1 +ATOM 2957 C CA . PRO C 3 148 ? 21.464 17.183 -37.812 1.00 88.31 148 C 1 +ATOM 2958 C C . PRO C 3 148 ? 22.498 18.067 -37.109 1.00 88.11 148 C 1 +ATOM 2959 O O . PRO C 3 148 ? 22.414 19.296 -37.149 1.00 83.40 148 C 1 +ATOM 2960 C CB . PRO C 3 148 ? 21.615 17.262 -39.335 1.00 86.15 148 C 1 +ATOM 2961 C CG . PRO C 3 148 ? 20.179 17.159 -39.853 1.00 84.50 148 C 1 +ATOM 2962 C CD . PRO C 3 148 ? 19.372 17.852 -38.766 1.00 87.60 148 C 1 +ATOM 2963 N N . GLY C 3 149 ? 23.489 17.434 -36.475 1.00 86.49 149 C 1 +ATOM 2964 C CA . GLY C 3 149 ? 24.565 18.139 -35.770 1.00 86.10 149 C 1 +ATOM 2965 C C . GLY C 3 149 ? 24.240 18.581 -34.339 1.00 88.18 149 C 1 +ATOM 2966 O O . GLY C 3 149 ? 25.124 19.105 -33.673 1.00 83.91 149 C 1 +ATOM 2967 N N . HIS C 3 150 ? 23.019 18.349 -33.853 1.00 90.34 150 C 1 +ATOM 2968 C CA . HIS C 3 150 ? 22.597 18.646 -32.487 1.00 91.08 150 C 1 +ATOM 2969 C C . HIS C 3 150 ? 22.377 17.373 -31.665 1.00 92.63 150 C 1 +ATOM 2970 O O . HIS C 3 150 ? 22.241 16.275 -32.202 1.00 89.67 150 C 1 +ATOM 2971 C CB . HIS C 3 150 ? 21.353 19.541 -32.523 1.00 88.33 150 C 1 +ATOM 2972 C CG . HIS C 3 150 ? 21.648 20.895 -33.101 1.00 84.45 150 C 1 +ATOM 2973 N ND1 . HIS C 3 150 ? 22.335 21.902 -32.461 1.00 72.60 150 C 1 +ATOM 2974 C CD2 . HIS C 3 150 ? 21.337 21.363 -34.353 1.00 72.36 150 C 1 +ATOM 2975 C CE1 . HIS C 3 150 ? 22.434 22.939 -33.307 1.00 72.72 150 C 1 +ATOM 2976 N NE2 . HIS C 3 150 ? 21.838 22.655 -34.468 1.00 73.59 150 C 1 +ATOM 2977 N N . THR C 3 151 ? 22.307 17.534 -30.337 1.00 91.84 151 C 1 +ATOM 2978 C CA . THR C 3 151 ? 21.932 16.467 -29.408 1.00 92.07 151 C 1 +ATOM 2979 C C . THR C 3 151 ? 20.462 16.577 -28.996 1.00 92.57 151 C 1 +ATOM 2980 O O . THR C 3 151 ? 19.798 17.593 -29.212 1.00 90.69 151 C 1 +ATOM 2981 C CB . THR C 3 151 ? 22.840 16.450 -28.167 1.00 90.34 151 C 1 +ATOM 2982 O OG1 . THR C 3 151 ? 22.586 17.576 -27.375 1.00 84.54 151 C 1 +ATOM 2983 C CG2 . THR C 3 151 ? 24.328 16.408 -28.507 1.00 83.34 151 C 1 +ATOM 2984 N N . TRP C 3 152 ? 19.915 15.524 -28.386 1.00 93.13 152 C 1 +ATOM 2985 C CA . TRP C 3 152 ? 18.553 15.543 -27.853 1.00 93.41 152 C 1 +ATOM 2986 C C . TRP C 3 152 ? 18.380 16.528 -26.688 1.00 92.88 152 C 1 +ATOM 2987 O O . TRP C 3 152 ? 17.286 17.041 -26.492 1.00 90.08 152 C 1 +ATOM 2988 C CB . TRP C 3 152 ? 18.166 14.141 -27.397 1.00 92.84 152 C 1 +ATOM 2989 C CG . TRP C 3 152 ? 17.760 13.207 -28.486 1.00 93.01 152 C 1 +ATOM 2990 C CD1 . TRP C 3 152 ? 18.384 12.061 -28.834 1.00 90.60 152 C 1 +ATOM 2991 C CD2 . TRP C 3 152 ? 16.582 13.297 -29.351 1.00 93.45 152 C 1 +ATOM 2992 N NE1 . TRP C 3 152 ? 17.673 11.419 -29.841 1.00 90.94 152 C 1 +ATOM 2993 C CE2 . TRP C 3 152 ? 16.565 12.154 -30.182 1.00 92.15 152 C 1 +ATOM 2994 C CE3 . TRP C 3 152 ? 15.545 14.247 -29.489 1.00 92.39 152 C 1 +ATOM 2995 C CZ2 . TRP C 3 152 ? 15.533 11.941 -31.131 1.00 91.87 152 C 1 +ATOM 2996 C CZ3 . TRP C 3 152 ? 14.526 14.035 -30.438 1.00 91.83 152 C 1 +ATOM 2997 C CH2 . TRP C 3 152 ? 14.527 12.899 -31.242 1.00 91.74 152 C 1 +ATOM 2998 N N . GLU C 3 153 ? 19.427 16.768 -25.906 1.00 93.51 153 C 1 +ATOM 2999 C CA . GLU C 3 153 ? 19.446 17.697 -24.781 1.00 92.06 153 C 1 +ATOM 3000 C C . GLU C 3 153 ? 19.351 19.156 -25.241 1.00 91.81 153 C 1 +ATOM 3001 O O . GLU C 3 153 ? 18.766 19.980 -24.549 1.00 90.26 153 C 1 +ATOM 3002 C CB . GLU C 3 153 ? 20.724 17.484 -23.956 1.00 90.94 153 C 1 +ATOM 3003 C CG . GLU C 3 153 ? 20.837 16.116 -23.254 1.00 80.23 153 C 1 +ATOM 3004 C CD . GLU C 3 153 ? 21.050 14.910 -24.178 1.00 69.84 153 C 1 +ATOM 3005 O OE1 . GLU C 3 153 ? 20.655 13.795 -23.759 1.00 61.64 153 C 1 +ATOM 3006 O OE2 . GLU C 3 153 ? 21.541 15.093 -25.315 1.00 62.51 153 C 1 +ATOM 3007 N N . GLU C 3 154 ? 19.887 19.474 -26.429 1.00 91.29 154 C 1 +ATOM 3008 C CA . GLU C 3 154 ? 19.832 20.806 -27.045 1.00 89.88 154 C 1 +ATOM 3009 C C . GLU C 3 154 ? 18.518 21.058 -27.797 1.00 89.60 154 C 1 +ATOM 3010 O O . GLU C 3 154 ? 18.209 22.203 -28.146 1.00 87.07 154 C 1 +ATOM 3011 C CB . GLU C 3 154 ? 21.012 20.950 -28.018 1.00 87.35 154 C 1 +ATOM 3012 C CG . GLU C 3 154 ? 22.377 20.931 -27.324 1.00 81.34 154 C 1 +ATOM 3013 C CD . GLU C 3 154 ? 23.541 20.769 -28.316 1.00 78.22 154 C 1 +ATOM 3014 O OE1 . GLU C 3 154 ? 24.681 21.106 -27.921 1.00 70.61 154 C 1 +ATOM 3015 O OE2 . GLU C 3 154 ? 23.306 20.279 -29.441 1.00 74.07 154 C 1 +ATOM 3016 N N . ALA C 3 155 ? 17.739 20.010 -28.053 1.00 91.49 155 C 1 +ATOM 3017 C CA . ALA C 3 155 ? 16.512 20.126 -28.824 1.00 90.86 155 C 1 +ATOM 3018 C C . ALA C 3 155 ? 15.443 20.913 -28.040 1.00 90.42 155 C 1 +ATOM 3019 O O . ALA C 3 155 ? 15.119 20.563 -26.899 1.00 88.19 155 C 1 +ATOM 3020 C CB . ALA C 3 155 ? 16.022 18.734 -29.227 1.00 89.49 155 C 1 +ATOM 3021 N N . PRO C 3 156 ? 14.816 21.939 -28.646 1.00 89.05 156 C 1 +ATOM 3022 C CA . PRO C 3 156 ? 13.778 22.718 -27.982 1.00 87.36 156 C 1 +ATOM 3023 C C . PRO C 3 156 ? 12.557 21.852 -27.676 1.00 89.05 156 C 1 +ATOM 3024 O O . PRO C 3 156 ? 12.109 21.043 -28.495 1.00 87.61 156 C 1 +ATOM 3025 C CB . PRO C 3 156 ? 13.463 23.877 -28.928 1.00 84.35 156 C 1 +ATOM 3026 C CG . PRO C 3 156 ? 13.837 23.325 -30.304 1.00 80.40 156 C 1 +ATOM 3027 C CD . PRO C 3 156 ? 15.028 22.413 -29.998 1.00 83.33 156 C 1 +ATOM 3028 N N . LEU C 3 157 ? 11.993 22.074 -26.479 1.00 90.67 157 C 1 +ATOM 3029 C CA . LEU C 3 157 ? 10.769 21.411 -26.045 1.00 90.85 157 C 1 +ATOM 3030 C C . LEU C 3 157 ? 9.538 22.182 -26.536 1.00 90.42 157 C 1 +ATOM 3031 O O . LEU C 3 157 ? 9.365 23.367 -26.252 1.00 87.83 157 C 1 +ATOM 3032 C CB . LEU C 3 157 ? 10.757 21.273 -24.511 1.00 89.26 157 C 1 +ATOM 3033 C CG . LEU C 3 157 ? 11.837 20.341 -23.939 1.00 86.51 157 C 1 +ATOM 3034 C CD1 . LEU C 3 157 ? 11.837 20.414 -22.416 1.00 80.49 157 C 1 +ATOM 3035 C CD2 . LEU C 3 157 ? 11.604 18.884 -24.342 1.00 81.03 157 C 1 +ATOM 3036 N N . LEU C 3 158 ? 8.653 21.481 -27.233 1.00 91.65 158 C 1 +ATOM 3037 C CA . LEU C 3 158 ? 7.339 21.962 -27.647 1.00 91.14 158 C 1 +ATOM 3038 C C . LEU C 3 158 ? 6.289 21.387 -26.707 1.00 92.43 158 C 1 +ATOM 3039 O O . LEU C 3 158 ? 6.064 20.183 -26.666 1.00 91.07 158 C 1 +ATOM 3040 C CB . LEU C 3 158 ? 7.082 21.538 -29.100 1.00 89.17 158 C 1 +ATOM 3041 C CG . LEU C 3 158 ? 8.006 22.209 -30.131 1.00 78.70 158 C 1 +ATOM 3042 C CD1 . LEU C 3 158 ? 7.836 21.530 -31.489 1.00 71.10 158 C 1 +ATOM 3043 C CD2 . LEU C 3 158 ? 7.694 23.693 -30.282 1.00 69.81 158 C 1 +ATOM 3044 N N . THR C 3 159 ? 5.616 22.268 -25.931 1.00 91.86 159 C 1 +ATOM 3045 C CA . THR C 3 159 ? 4.593 21.848 -24.972 1.00 90.91 159 C 1 +ATOM 3046 C C . THR C 3 159 ? 3.191 21.954 -25.562 1.00 91.13 159 C 1 +ATOM 3047 O O . THR C 3 159 ? 2.771 23.020 -26.008 1.00 88.78 159 C 1 +ATOM 3048 C CB . THR C 3 159 ? 4.674 22.667 -23.675 1.00 88.39 159 C 1 +ATOM 3049 O OG1 . THR C 3 159 ? 5.987 22.719 -23.181 1.00 79.02 159 C 1 +ATOM 3050 C CG2 . THR C 3 159 ? 3.803 22.062 -22.571 1.00 75.48 159 C 1 +ATOM 3051 N N . LEU C 3 160 ? 2.431 20.865 -25.499 1.00 90.26 160 C 1 +ATOM 3052 C CA . LEU C 3 160 ? 1.018 20.779 -25.872 1.00 89.21 160 C 1 +ATOM 3053 C C . LEU C 3 160 ? 0.189 20.608 -24.595 1.00 88.61 160 C 1 +ATOM 3054 O O . LEU C 3 160 ? 0.093 19.511 -24.047 1.00 86.53 160 C 1 +ATOM 3055 C CB . LEU C 3 160 ? 0.811 19.611 -26.848 1.00 88.39 160 C 1 +ATOM 3056 C CG . LEU C 3 160 ? 1.641 19.675 -28.142 1.00 84.97 160 C 1 +ATOM 3057 C CD1 . LEU C 3 160 ? 1.481 18.369 -28.907 1.00 76.81 160 C 1 +ATOM 3058 C CD2 . LEU C 3 160 ? 1.196 20.823 -29.038 1.00 76.19 160 C 1 +ATOM 3059 N N . LYS C 3 161 ? -0.436 21.691 -24.108 1.00 85.97 161 C 1 +ATOM 3060 C CA . LYS C 3 161 ? -1.238 21.716 -22.869 1.00 83.11 161 C 1 +ATOM 3061 C C . LYS C 3 161 ? -2.674 21.202 -23.054 1.00 82.26 161 C 1 +ATOM 3062 O O . LYS C 3 161 ? -3.610 21.664 -22.390 1.00 77.57 161 C 1 +ATOM 3063 C CB . LYS C 3 161 ? -1.215 23.108 -22.234 1.00 80.49 161 C 1 +ATOM 3064 C CG . LYS C 3 161 ? 0.193 23.538 -21.812 1.00 75.25 161 C 1 +ATOM 3065 C CD . LYS C 3 161 ? 0.109 24.834 -21.011 1.00 68.10 161 C 1 +ATOM 3066 C CE . LYS C 3 161 ? 1.512 25.235 -20.536 1.00 60.69 161 C 1 +ATOM 3067 N NZ . LYS C 3 161 ? 1.474 26.434 -19.680 1.00 53.39 161 C 1 +ATOM 3068 N N . GLN C 3 162 ? -2.894 20.286 -23.974 1.00 82.96 162 C 1 +ATOM 3069 C CA . GLN C 3 162 ? -4.188 19.717 -24.302 1.00 80.77 162 C 1 +ATOM 3070 C C . GLN C 3 162 ? -4.009 18.284 -24.804 1.00 80.71 162 C 1 +ATOM 3071 O O . GLN C 3 162 ? -2.921 17.904 -25.241 1.00 76.46 162 C 1 +ATOM 3072 C CB . GLN C 3 162 ? -4.918 20.601 -25.331 1.00 76.29 162 C 1 +ATOM 3073 C CG . GLN C 3 162 ? -4.162 20.786 -26.658 1.00 67.88 162 C 1 +ATOM 3074 C CD . GLN C 3 162 ? -4.861 21.760 -27.610 1.00 64.70 162 C 1 +ATOM 3075 O OE1 . GLN C 3 162 ? -5.887 22.349 -27.302 1.00 58.42 162 C 1 +ATOM 3076 N NE2 . GLN C 3 162 ? -4.334 21.970 -28.795 1.00 55.35 162 C 1 +ATOM 3077 N N . LYS C 3 163 ? -5.079 17.498 -24.755 1.00 78.36 163 C 1 +ATOM 3078 C CA . LYS C 3 163 ? -5.090 16.150 -25.322 1.00 77.40 163 C 1 +ATOM 3079 C C . LYS C 3 163 ? -5.062 16.235 -26.855 1.00 78.62 163 C 1 +ATOM 3080 O O . LYS C 3 163 ? -6.104 16.215 -27.508 1.00 73.96 163 C 1 +ATOM 3081 C CB . LYS C 3 163 ? -6.273 15.341 -24.784 1.00 71.93 163 C 1 +ATOM 3082 C CG . LYS C 3 163 ? -6.149 13.868 -25.196 1.00 66.06 163 C 1 +ATOM 3083 C CD . LYS C 3 163 ? -7.337 13.020 -24.738 1.00 61.62 163 C 1 +ATOM 3084 C CE . LYS C 3 163 ? -7.111 11.601 -25.264 1.00 55.88 163 C 1 +ATOM 3085 N NZ . LYS C 3 163 ? -8.224 10.682 -24.953 1.00 50.59 163 C 1 +ATOM 3086 N N . GLN C 3 164 ? -3.878 16.369 -27.388 1.00 81.37 164 C 1 +ATOM 3087 C CA . GLN C 3 164 ? -3.610 16.422 -28.820 1.00 83.44 164 C 1 +ATOM 3088 C C . GLN C 3 164 ? -2.573 15.350 -29.159 1.00 85.60 164 C 1 +ATOM 3089 O O . GLN C 3 164 ? -1.442 15.423 -28.698 1.00 82.97 164 C 1 +ATOM 3090 C CB . GLN C 3 164 ? -3.139 17.835 -29.188 1.00 80.70 164 C 1 +ATOM 3091 C CG . GLN C 3 164 ? -2.820 17.980 -30.679 1.00 78.26 164 C 1 +ATOM 3092 C CD . GLN C 3 164 ? -2.443 19.414 -31.053 1.00 75.65 164 C 1 +ATOM 3093 O OE1 . GLN C 3 164 ? -2.922 20.373 -30.480 1.00 70.13 164 C 1 +ATOM 3094 N NE2 . GLN C 3 164 ? -1.590 19.600 -32.025 1.00 66.79 164 C 1 +ATOM 3095 N N . GLU C 3 165 ? -2.971 14.369 -29.941 1.00 84.72 165 C 1 +ATOM 3096 C CA . GLU C 3 165 ? -2.144 13.217 -30.325 1.00 87.46 165 C 1 +ATOM 3097 C C . GLU C 3 165 ? -1.487 13.411 -31.708 1.00 89.00 165 C 1 +ATOM 3098 O O . GLU C 3 165 ? -1.239 12.465 -32.452 1.00 86.36 165 C 1 +ATOM 3099 C CB . GLU C 3 165 ? -2.984 11.932 -30.218 1.00 85.59 165 C 1 +ATOM 3100 C CG . GLU C 3 165 ? -3.367 11.632 -28.763 1.00 82.87 165 C 1 +ATOM 3101 C CD . GLU C 3 165 ? -4.422 10.526 -28.586 1.00 79.79 165 C 1 +ATOM 3102 O OE1 . GLU C 3 165 ? -4.810 10.284 -27.418 1.00 71.84 165 C 1 +ATOM 3103 O OE2 . GLU C 3 165 ? -4.934 10.000 -29.592 1.00 73.55 165 C 1 +ATOM 3104 N N . TRP C 3 166 ? -1.214 14.663 -32.061 1.00 91.68 166 C 1 +ATOM 3105 C CA . TRP C 3 166 ? -0.541 15.049 -33.300 1.00 92.25 166 C 1 +ATOM 3106 C C . TRP C 3 166 ? 0.128 16.416 -33.161 1.00 92.67 166 C 1 +ATOM 3107 O O . TRP C 3 166 ? -0.261 17.234 -32.327 1.00 90.93 166 C 1 +ATOM 3108 C CB . TRP C 3 166 ? -1.552 15.052 -34.465 1.00 89.78 166 C 1 +ATOM 3109 C CG . TRP C 3 166 ? -2.656 16.059 -34.349 1.00 84.81 166 C 1 +ATOM 3110 C CD1 . TRP C 3 166 ? -3.833 15.864 -33.709 1.00 77.07 166 C 1 +ATOM 3111 C CD2 . TRP C 3 166 ? -2.682 17.438 -34.847 1.00 81.02 166 C 1 +ATOM 3112 N NE1 . TRP C 3 166 ? -4.594 17.027 -33.767 1.00 69.36 166 C 1 +ATOM 3113 C CE2 . TRP C 3 166 ? -3.929 18.016 -34.458 1.00 75.06 166 C 1 +ATOM 3114 C CE3 . TRP C 3 166 ? -1.781 18.227 -35.584 1.00 70.48 166 C 1 +ATOM 3115 C CZ2 . TRP C 3 166 ? -4.258 19.350 -34.772 1.00 72.01 166 C 1 +ATOM 3116 C CZ3 . TRP C 3 166 ? -2.115 19.561 -35.897 1.00 68.40 166 C 1 +ATOM 3117 C CH2 . TRP C 3 166 ? -3.335 20.117 -35.488 1.00 67.24 166 C 1 +ATOM 3118 N N . ILE C 3 167 ? 1.106 16.690 -34.020 1.00 92.55 167 C 1 +ATOM 3119 C CA . ILE C 3 167 ? 1.774 17.982 -34.135 1.00 93.20 167 C 1 +ATOM 3120 C C . ILE C 3 167 ? 2.079 18.306 -35.591 1.00 93.24 167 C 1 +ATOM 3121 O O . ILE C 3 167 ? 2.388 17.417 -36.391 1.00 92.17 167 C 1 +ATOM 3122 C CB . ILE C 3 167 ? 3.028 18.020 -33.237 1.00 92.62 167 C 1 +ATOM 3123 C CG1 . ILE C 3 167 ? 3.521 19.463 -33.036 1.00 87.64 167 C 1 +ATOM 3124 C CG2 . ILE C 3 167 ? 4.149 17.104 -33.784 1.00 85.97 167 C 1 +ATOM 3125 C CD1 . ILE C 3 167 ? 4.553 19.593 -31.914 1.00 81.46 167 C 1 +ATOM 3126 N N . CYS C 3 168 ? 2.020 19.587 -35.931 1.00 91.97 168 C 1 +ATOM 3127 C CA . CYS C 3 168 ? 2.551 20.115 -37.178 1.00 91.20 168 C 1 +ATOM 3128 C C . CYS C 3 168 ? 3.882 20.811 -36.877 1.00 91.30 168 C 1 +ATOM 3129 O O . CYS C 3 168 ? 3.902 21.859 -36.236 1.00 90.54 168 C 1 +ATOM 3130 C CB . CYS C 3 168 ? 1.518 21.048 -37.810 1.00 89.06 168 C 1 +ATOM 3131 S SG . CYS C 3 168 ? 2.098 21.600 -39.434 1.00 71.77 168 C 1 +ATOM 3132 N N . LEU C 3 169 ? 4.982 20.215 -37.309 1.00 91.58 169 C 1 +ATOM 3133 C CA . LEU C 3 169 ? 6.301 20.830 -37.270 1.00 91.70 169 C 1 +ATOM 3134 C C . LEU C 3 169 ? 6.440 21.762 -38.472 1.00 91.88 169 C 1 +ATOM 3135 O O . LEU C 3 169 ? 6.208 21.344 -39.610 1.00 90.05 169 C 1 +ATOM 3136 C CB . LEU C 3 169 ? 7.396 19.752 -37.283 1.00 91.86 169 C 1 +ATOM 3137 C CG . LEU C 3 169 ? 7.311 18.730 -36.135 1.00 91.88 169 C 1 +ATOM 3138 C CD1 . LEU C 3 169 ? 8.391 17.668 -36.323 1.00 86.78 169 C 1 +ATOM 3139 C CD2 . LEU C 3 169 ? 7.502 19.378 -34.764 1.00 86.75 169 C 1 +ATOM 3140 N N . GLU C 3 170 ? 6.831 23.007 -38.202 1.00 90.73 170 C 1 +ATOM 3141 C CA . GLU C 3 170 ? 7.027 24.042 -39.218 1.00 89.52 170 C 1 +ATOM 3142 C C . GLU C 3 170 ? 8.500 24.490 -39.260 1.00 89.03 170 C 1 +ATOM 3143 O O . GLU C 3 170 ? 9.310 24.081 -38.432 1.00 85.87 170 C 1 +ATOM 3144 C CB . GLU C 3 170 ? 6.075 25.224 -38.987 1.00 87.24 170 C 1 +ATOM 3145 C CG . GLU C 3 170 ? 4.597 24.832 -38.902 1.00 82.09 170 C 1 +ATOM 3146 C CD . GLU C 3 170 ? 3.674 26.016 -39.233 1.00 78.84 170 C 1 +ATOM 3147 O OE1 . GLU C 3 170 ? 2.716 25.809 -40.015 1.00 69.40 170 C 1 +ATOM 3148 O OE2 . GLU C 3 170 ? 3.959 27.151 -38.801 1.00 71.10 170 C 1 +ATOM 3149 N N . THR C 3 171 ? 8.837 25.333 -40.234 1.00 90.27 171 C 1 +ATOM 3150 C CA . THR C 3 171 ? 10.181 25.929 -40.396 1.00 89.98 171 C 1 +ATOM 3151 C C . THR C 3 171 ? 11.319 24.911 -40.519 1.00 90.60 171 C 1 +ATOM 3152 O O . THR C 3 171 ? 12.461 25.192 -40.166 1.00 87.58 171 C 1 +ATOM 3153 C CB . THR C 3 171 ? 10.470 27.016 -39.337 1.00 87.84 171 C 1 +ATOM 3154 O OG1 . THR C 3 171 ? 10.464 26.493 -38.038 1.00 80.52 171 C 1 +ATOM 3155 C CG2 . THR C 3 171 ? 9.430 28.134 -39.381 1.00 77.41 171 C 1 +ATOM 3156 N N . LEU C 3 172 ? 11.015 23.720 -41.049 1.00 90.60 172 C 1 +ATOM 3157 C CA . LEU C 3 172 ? 12.014 22.689 -41.297 1.00 90.94 172 C 1 +ATOM 3158 C C . LEU C 3 172 ? 12.850 23.016 -42.544 1.00 91.19 172 C 1 +ATOM 3159 O O . LEU C 3 172 ? 12.383 23.652 -43.491 1.00 89.28 172 C 1 +ATOM 3160 C CB . LEU C 3 172 ? 11.324 21.314 -41.427 1.00 90.84 172 C 1 +ATOM 3161 C CG . LEU C 3 172 ? 10.468 20.894 -40.220 1.00 91.10 172 C 1 +ATOM 3162 C CD1 . LEU C 3 172 ? 9.823 19.542 -40.510 1.00 85.90 172 C 1 +ATOM 3163 C CD2 . LEU C 3 172 ? 11.279 20.772 -38.938 1.00 85.70 172 C 1 +ATOM 3164 N N . THR C 3 173 ? 14.089 22.543 -42.543 1.00 92.26 173 C 1 +ATOM 3165 C CA . THR C 3 173 ? 14.985 22.673 -43.698 1.00 91.75 173 C 1 +ATOM 3166 C C . THR C 3 173 ? 14.640 21.617 -44.758 1.00 92.17 173 C 1 +ATOM 3167 O O . THR C 3 173 ? 14.387 20.465 -44.391 1.00 91.05 173 C 1 +ATOM 3168 C CB . THR C 3 173 ? 16.457 22.557 -43.273 1.00 90.31 173 C 1 +ATOM 3169 O OG1 . THR C 3 173 ? 16.704 23.439 -42.203 1.00 84.38 173 C 1 +ATOM 3170 C CG2 . THR C 3 173 ? 17.430 22.930 -44.379 1.00 82.27 173 C 1 +ATOM 3171 N N . PRO C 3 174 ? 14.616 21.960 -46.045 1.00 93.16 174 C 1 +ATOM 3172 C CA . PRO C 3 174 ? 14.402 20.983 -47.112 1.00 92.70 174 C 1 +ATOM 3173 C C . PRO C 3 174 ? 15.474 19.886 -47.150 1.00 92.56 174 C 1 +ATOM 3174 O O . PRO C 3 174 ? 16.606 20.098 -46.737 1.00 90.62 174 C 1 +ATOM 3175 C CB . PRO C 3 174 ? 14.415 21.778 -48.422 1.00 91.55 174 C 1 +ATOM 3176 C CG . PRO C 3 174 ? 14.078 23.195 -47.991 1.00 89.98 174 C 1 +ATOM 3177 C CD . PRO C 3 174 ? 14.685 23.295 -46.597 1.00 92.48 174 C 1 +ATOM 3178 N N . ASP C 3 175 ? 15.100 18.721 -47.646 1.00 91.12 175 C 1 +ATOM 3179 C CA . ASP C 3 175 ? 15.972 17.565 -47.849 1.00 91.50 175 C 1 +ATOM 3180 C C . ASP C 3 175 ? 16.833 17.189 -46.634 1.00 91.94 175 C 1 +ATOM 3181 O O . ASP C 3 175 ? 17.991 16.784 -46.746 1.00 88.26 175 C 1 +ATOM 3182 C CB . ASP C 3 175 ? 16.782 17.712 -49.154 1.00 90.04 175 C 1 +ATOM 3183 C CG . ASP C 3 175 ? 17.363 16.363 -49.588 1.00 89.21 175 C 1 +ATOM 3184 O OD1 . ASP C 3 175 ? 16.672 15.334 -49.389 1.00 83.83 175 C 1 +ATOM 3185 O OD2 . ASP C 3 175 ? 18.501 16.322 -50.093 1.00 83.47 175 C 1 +ATOM 3186 N N . THR C 3 176 ? 16.265 17.350 -45.446 1.00 91.96 176 C 1 +ATOM 3187 C CA . THR C 3 176 ? 16.969 17.161 -44.177 1.00 92.00 176 C 1 +ATOM 3188 C C . THR C 3 176 ? 16.361 16.008 -43.389 1.00 92.61 176 C 1 +ATOM 3189 O O . THR C 3 176 ? 15.134 15.870 -43.306 1.00 91.16 176 C 1 +ATOM 3190 C CB . THR C 3 176 ? 16.989 18.461 -43.380 1.00 90.94 176 C 1 +ATOM 3191 O OG1 . THR C 3 176 ? 17.630 19.457 -44.140 1.00 83.43 176 C 1 +ATOM 3192 C CG2 . THR C 3 176 ? 17.780 18.344 -42.089 1.00 82.42 176 C 1 +ATOM 3193 N N . GLN C 3 177 ? 17.220 15.167 -42.798 1.00 94.28 177 C 1 +ATOM 3194 C CA . GLN C 3 177 ? 16.804 14.088 -41.926 1.00 94.03 177 C 1 +ATOM 3195 C C . GLN C 3 177 ? 16.647 14.600 -40.489 1.00 94.12 177 C 1 +ATOM 3196 O O . GLN C 3 177 ? 17.558 15.214 -39.946 1.00 92.61 177 C 1 +ATOM 3197 C CB . GLN C 3 177 ? 17.778 12.916 -42.045 1.00 92.09 177 C 1 +ATOM 3198 C CG . GLN C 3 177 ? 17.291 11.685 -41.266 1.00 81.95 177 C 1 +ATOM 3199 C CD . GLN C 3 177 ? 18.059 10.400 -41.619 1.00 75.83 177 C 1 +ATOM 3200 O OE1 . GLN C 3 177 ? 18.905 10.362 -42.501 1.00 68.72 177 C 1 +ATOM 3201 N NE2 . GLN C 3 177 ? 17.759 9.308 -40.964 1.00 64.95 177 C 1 +ATOM 3202 N N . TYR C 3 178 ? 15.503 14.323 -39.879 1.00 93.73 178 C 1 +ATOM 3203 C CA . TYR C 3 178 ? 15.158 14.653 -38.503 1.00 94.24 178 C 1 +ATOM 3204 C C . TYR C 3 178 ? 14.766 13.397 -37.744 1.00 94.57 178 C 1 +ATOM 3205 O O . TYR C 3 178 ? 14.342 12.395 -38.333 1.00 93.06 178 C 1 +ATOM 3206 C CB . TYR C 3 178 ? 13.998 15.659 -38.500 1.00 93.94 178 C 1 +ATOM 3207 C CG . TYR C 3 178 ? 14.349 17.017 -39.058 1.00 94.22 178 C 1 +ATOM 3208 C CD1 . TYR C 3 178 ? 14.937 17.984 -38.230 1.00 89.49 178 C 1 +ATOM 3209 C CD2 . TYR C 3 178 ? 14.091 17.333 -40.409 1.00 89.95 178 C 1 +ATOM 3210 C CE1 . TYR C 3 178 ? 15.273 19.253 -38.728 1.00 88.94 178 C 1 +ATOM 3211 C CE2 . TYR C 3 178 ? 14.422 18.595 -40.922 1.00 88.46 178 C 1 +ATOM 3212 C CZ . TYR C 3 178 ? 15.011 19.550 -40.071 1.00 92.39 178 C 1 +ATOM 3213 O OH . TYR C 3 178 ? 15.341 20.794 -40.548 1.00 91.51 178 C 1 +ATOM 3214 N N . GLU C 3 179 ? 14.835 13.475 -36.422 1.00 94.62 179 C 1 +ATOM 3215 C CA . GLU C 3 179 ? 14.177 12.528 -35.533 1.00 94.57 179 C 1 +ATOM 3216 C C . GLU C 3 179 ? 13.212 13.265 -34.614 1.00 94.62 179 C 1 +ATOM 3217 O O . GLU C 3 179 ? 13.458 14.403 -34.202 1.00 93.76 179 C 1 +ATOM 3218 C CB . GLU C 3 179 ? 15.199 11.706 -34.736 1.00 93.53 179 C 1 +ATOM 3219 C CG . GLU C 3 179 ? 16.064 10.805 -35.624 1.00 88.97 179 C 1 +ATOM 3220 C CD . GLU C 3 179 ? 17.049 9.945 -34.812 1.00 87.70 179 C 1 +ATOM 3221 O OE1 . GLU C 3 179 ? 18.015 9.457 -35.438 1.00 79.04 179 C 1 +ATOM 3222 O OE2 . GLU C 3 179 ? 16.830 9.764 -33.592 1.00 80.78 179 C 1 +ATOM 3223 N N . PHE C 3 180 ? 12.102 12.619 -34.265 1.00 94.69 180 C 1 +ATOM 3224 C CA . PHE C 3 180 ? 11.068 13.184 -33.410 1.00 95.22 180 C 1 +ATOM 3225 C C . PHE C 3 180 ? 10.774 12.268 -32.228 1.00 96.07 180 C 1 +ATOM 3226 O O . PHE C 3 180 ? 10.655 11.055 -32.383 1.00 95.57 180 C 1 +ATOM 3227 C CB . PHE C 3 180 ? 9.817 13.450 -34.253 1.00 94.96 180 C 1 +ATOM 3228 C CG . PHE C 3 180 ? 8.636 13.943 -33.446 1.00 95.39 180 C 1 +ATOM 3229 C CD1 . PHE C 3 180 ? 7.676 13.032 -32.962 1.00 90.38 180 C 1 +ATOM 3230 C CD2 . PHE C 3 180 ? 8.492 15.313 -33.172 1.00 90.94 180 C 1 +ATOM 3231 C CE1 . PHE C 3 180 ? 6.576 13.495 -32.225 1.00 90.85 180 C 1 +ATOM 3232 C CE2 . PHE C 3 180 ? 7.386 15.776 -32.437 1.00 90.36 180 C 1 +ATOM 3233 C CZ . PHE C 3 180 ? 6.427 14.869 -31.962 1.00 94.16 180 C 1 +ATOM 3234 N N . GLN C 3 181 ? 10.613 12.859 -31.026 1.00 96.18 181 C 1 +ATOM 3235 C CA . GLN C 3 181 ? 10.146 12.166 -29.836 1.00 96.28 181 C 1 +ATOM 3236 C C . GLN C 3 181 ? 9.035 12.957 -29.154 1.00 96.14 181 C 1 +ATOM 3237 O O . GLN C 3 181 ? 9.028 14.188 -29.151 1.00 95.34 181 C 1 +ATOM 3238 C CB . GLN C 3 181 ? 11.295 11.924 -28.852 1.00 95.29 181 C 1 +ATOM 3239 C CG . GLN C 3 181 ? 12.302 10.888 -29.341 1.00 92.06 181 C 1 +ATOM 3240 C CD . GLN C 3 181 ? 13.326 10.538 -28.260 1.00 93.86 181 C 1 +ATOM 3241 O OE1 . GLN C 3 181 ? 13.841 11.394 -27.556 1.00 85.38 181 C 1 +ATOM 3242 N NE2 . GLN C 3 181 ? 13.639 9.280 -28.073 1.00 84.20 181 C 1 +ATOM 3243 N N . VAL C 3 182 ? 8.142 12.232 -28.481 1.00 95.74 182 C 1 +ATOM 3244 C CA . VAL C 3 182 ? 7.069 12.804 -27.662 1.00 96.31 182 C 1 +ATOM 3245 C C . VAL C 3 182 ? 6.957 12.049 -26.347 1.00 96.48 182 C 1 +ATOM 3246 O O . VAL C 3 182 ? 7.254 10.846 -26.272 1.00 96.08 182 C 1 +ATOM 3247 C CB . VAL C 3 182 ? 5.750 12.858 -28.459 1.00 95.54 182 C 1 +ATOM 3248 C CG1 . VAL C 3 182 ? 5.229 11.474 -28.858 1.00 88.39 182 C 1 +ATOM 3249 C CG2 . VAL C 3 182 ? 4.649 13.610 -27.706 1.00 86.46 182 C 1 +ATOM 3250 N N . ARG C 3 183 ? 6.555 12.748 -25.273 1.00 96.52 183 C 1 +ATOM 3251 C CA . ARG C 3 183 ? 6.214 12.174 -23.970 1.00 96.13 183 C 1 +ATOM 3252 C C . ARG C 3 183 ? 4.911 12.760 -23.445 1.00 95.59 183 C 1 +ATOM 3253 O O . ARG C 3 183 ? 4.489 13.824 -23.874 1.00 94.61 183 C 1 +ATOM 3254 C CB . ARG C 3 183 ? 7.380 12.334 -22.992 1.00 95.05 183 C 1 +ATOM 3255 C CG . ARG C 3 183 ? 7.712 13.795 -22.637 1.00 94.21 183 C 1 +ATOM 3256 C CD . ARG C 3 183 ? 8.914 13.817 -21.691 1.00 93.76 183 C 1 +ATOM 3257 N NE . ARG C 3 183 ? 9.275 15.172 -21.269 1.00 91.82 183 C 1 +ATOM 3258 C CZ . ARG C 3 183 ? 10.275 15.510 -20.475 1.00 91.39 183 C 1 +ATOM 3259 N NH1 . ARG C 3 183 ? 11.093 14.614 -19.978 1.00 86.79 183 C 1 +ATOM 3260 N NH2 . ARG C 3 183 ? 10.478 16.748 -20.169 1.00 86.24 183 C 1 +ATOM 3261 N N . VAL C 3 184 ? 4.275 12.065 -22.499 1.00 94.16 184 C 1 +ATOM 3262 C CA . VAL C 3 184 ? 2.952 12.413 -21.965 1.00 94.00 184 C 1 +ATOM 3263 C C . VAL C 3 184 ? 2.984 12.481 -20.446 1.00 93.95 184 C 1 +ATOM 3264 O O . VAL C 3 184 ? 3.703 11.719 -19.790 1.00 93.66 184 C 1 +ATOM 3265 C CB . VAL C 3 184 ? 1.880 11.434 -22.483 1.00 93.42 184 C 1 +ATOM 3266 C CG1 . VAL C 3 184 ? 2.099 9.982 -22.051 1.00 88.36 184 C 1 +ATOM 3267 C CG2 . VAL C 3 184 ? 0.469 11.857 -22.077 1.00 88.06 184 C 1 +ATOM 3268 N N . LYS C 3 185 ? 2.185 13.386 -19.865 1.00 92.91 185 C 1 +ATOM 3269 C CA . LYS C 3 185 ? 1.995 13.520 -18.421 1.00 92.63 185 C 1 +ATOM 3270 C C . LYS C 3 185 ? 0.523 13.804 -18.107 1.00 91.96 185 C 1 +ATOM 3271 O O . LYS C 3 185 ? -0.070 14.678 -18.737 1.00 90.71 185 C 1 +ATOM 3272 C CB . LYS C 3 185 ? 2.926 14.625 -17.925 1.00 90.93 185 C 1 +ATOM 3273 C CG . LYS C 3 185 ? 2.911 14.790 -16.407 1.00 87.85 185 C 1 +ATOM 3274 C CD . LYS C 3 185 ? 3.747 16.019 -16.024 1.00 87.09 185 C 1 +ATOM 3275 C CE . LYS C 3 185 ? 3.507 16.394 -14.564 1.00 79.22 185 C 1 +ATOM 3276 N NZ . LYS C 3 185 ? 3.910 17.792 -14.328 1.00 74.44 185 C 1 +ATOM 3277 N N . PRO C 3 186 ? -0.081 13.112 -17.126 1.00 91.25 186 C 1 +ATOM 3278 C CA . PRO C 3 186 ? -1.359 13.527 -16.573 1.00 90.10 186 C 1 +ATOM 3279 C C . PRO C 3 186 ? -1.218 14.859 -15.825 1.00 89.51 186 C 1 +ATOM 3280 O O . PRO C 3 186 ? -0.198 15.107 -15.184 1.00 87.55 186 C 1 +ATOM 3281 C CB . PRO C 3 186 ? -1.793 12.402 -15.621 1.00 88.50 186 C 1 +ATOM 3282 C CG . PRO C 3 186 ? -0.899 11.223 -15.995 1.00 86.81 186 C 1 +ATOM 3283 C CD . PRO C 3 186 ? 0.374 11.891 -16.495 1.00 89.25 186 C 1 +ATOM 3284 N N . LEU C 3 187 ? -2.267 15.684 -15.834 1.00 86.77 187 C 1 +ATOM 3285 C CA . LEU C 3 187 ? -2.324 16.909 -15.024 1.00 84.56 187 C 1 +ATOM 3286 C C . LEU C 3 187 ? -2.641 16.639 -13.540 1.00 83.45 187 C 1 +ATOM 3287 O O . LEU C 3 187 ? -2.598 17.552 -12.721 1.00 78.77 187 C 1 +ATOM 3288 C CB . LEU C 3 187 ? -3.370 17.862 -15.628 1.00 81.53 187 C 1 +ATOM 3289 C CG . LEU C 3 187 ? -3.019 18.391 -17.024 1.00 75.52 187 C 1 +ATOM 3290 C CD1 . LEU C 3 187 ? -4.179 19.206 -17.587 1.00 69.97 187 C 1 +ATOM 3291 C CD2 . LEU C 3 187 ? -1.791 19.305 -16.997 1.00 68.61 187 C 1 +ATOM 3292 N N . GLN C 3 188 ? -2.988 15.407 -13.188 1.00 81.03 188 C 1 +ATOM 3293 C CA . GLN C 3 188 ? -3.372 14.984 -11.840 1.00 79.71 188 C 1 +ATOM 3294 C C . GLN C 3 188 ? -2.213 14.292 -11.122 1.00 80.48 188 C 1 +ATOM 3295 O O . GLN C 3 188 ? -1.467 13.539 -11.744 1.00 74.33 188 C 1 +ATOM 3296 C CB . GLN C 3 188 ? -4.602 14.063 -11.955 1.00 73.31 188 C 1 +ATOM 3297 C CG . GLN C 3 188 ? -5.166 13.658 -10.593 1.00 65.48 188 C 1 +ATOM 3298 C CD . GLN C 3 188 ? -6.415 12.772 -10.679 1.00 61.29 188 C 1 +ATOM 3299 O OE1 . GLN C 3 188 ? -6.874 12.371 -11.736 1.00 55.47 188 C 1 +ATOM 3300 N NE2 . GLN C 3 188 ? -7.002 12.424 -9.556 1.00 53.64 188 C 1 +ATOM 3301 N N . GLY C 3 189 ? -2.138 14.483 -9.799 1.00 78.43 189 C 1 +ATOM 3302 C CA . GLY C 3 189 ? -1.207 13.794 -8.916 1.00 78.02 189 C 1 +ATOM 3303 C C . GLY C 3 189 ? 0.011 14.634 -8.538 1.00 80.94 189 C 1 +ATOM 3304 O O . GLY C 3 189 ? 0.697 15.175 -9.413 1.00 77.43 189 C 1 +ATOM 3305 N N . GLU C 3 190 ? 0.295 14.736 -7.244 1.00 79.79 190 C 1 +ATOM 3306 C CA . GLU C 3 190 ? 1.371 15.586 -6.709 1.00 81.44 190 C 1 +ATOM 3307 C C . GLU C 3 190 ? 2.763 15.126 -7.176 1.00 82.48 190 C 1 +ATOM 3308 O O . GLU C 3 190 ? 3.597 15.943 -7.576 1.00 77.91 190 C 1 +ATOM 3309 C CB . GLU C 3 190 ? 1.265 15.579 -5.170 1.00 77.36 190 C 1 +ATOM 3310 C CG . GLU C 3 190 ? 2.238 16.564 -4.507 1.00 68.65 190 C 1 +ATOM 3311 C CD . GLU C 3 190 ? 2.123 16.601 -2.968 1.00 63.62 190 C 1 +ATOM 3312 O OE1 . GLU C 3 190 ? 2.969 17.299 -2.353 1.00 55.85 190 C 1 +ATOM 3313 O OE2 . GLU C 3 190 ? 1.229 15.945 -2.403 1.00 61.15 190 C 1 +ATOM 3314 N N . PHE C 3 191 ? 2.987 13.817 -7.200 1.00 84.30 191 C 1 +ATOM 3315 C CA . PHE C 3 191 ? 4.259 13.208 -7.597 1.00 84.36 191 C 1 +ATOM 3316 C C . PHE C 3 191 ? 4.236 12.634 -9.023 1.00 86.26 191 C 1 +ATOM 3317 O O . PHE C 3 191 ? 5.059 11.795 -9.397 1.00 82.89 191 C 1 +ATOM 3318 C CB . PHE C 3 191 ? 4.678 12.170 -6.550 1.00 80.94 191 C 1 +ATOM 3319 C CG . PHE C 3 191 ? 4.663 12.716 -5.133 1.00 77.91 191 C 1 +ATOM 3320 C CD1 . PHE C 3 191 ? 5.627 13.655 -4.728 1.00 71.34 191 C 1 +ATOM 3321 C CD2 . PHE C 3 191 ? 3.641 12.335 -4.248 1.00 72.68 191 C 1 +ATOM 3322 C CE1 . PHE C 3 191 ? 5.574 14.215 -3.441 1.00 67.76 191 C 1 +ATOM 3323 C CE2 . PHE C 3 191 ? 3.583 12.894 -2.961 1.00 66.83 191 C 1 +ATOM 3324 C CZ . PHE C 3 191 ? 4.536 13.839 -2.552 1.00 68.60 191 C 1 +ATOM 3325 N N . THR C 3 192 ? 3.273 13.065 -9.822 1.00 84.85 192 C 1 +ATOM 3326 C CA . THR C 3 192 ? 3.172 12.643 -11.223 1.00 86.14 192 C 1 +ATOM 3327 C C . THR C 3 192 ? 4.343 13.197 -12.030 1.00 87.42 192 C 1 +ATOM 3328 O O . THR C 3 192 ? 4.672 14.379 -11.962 1.00 85.92 192 C 1 +ATOM 3329 C CB . THR C 3 192 ? 1.826 13.053 -11.814 1.00 83.43 192 C 1 +ATOM 3330 O OG1 . THR C 3 192 ? 0.833 12.227 -11.227 1.00 76.44 192 C 1 +ATOM 3331 C CG2 . THR C 3 192 ? 1.740 12.828 -13.312 1.00 75.00 192 C 1 +ATOM 3332 N N . THR C 3 193 ? 4.944 12.332 -12.836 1.00 90.05 193 C 1 +ATOM 3333 C CA . THR C 3 193 ? 6.074 12.687 -13.692 1.00 91.39 193 C 1 +ATOM 3334 C C . THR C 3 193 ? 5.770 12.413 -15.162 1.00 92.13 193 C 1 +ATOM 3335 O O . THR C 3 193 ? 4.793 11.736 -15.503 1.00 91.17 193 C 1 +ATOM 3336 C CB . THR C 3 193 ? 7.349 11.979 -13.211 1.00 88.89 193 C 1 +ATOM 3337 O OG1 . THR C 3 193 ? 8.478 12.519 -13.872 1.00 75.64 193 C 1 +ATOM 3338 C CG2 . THR C 3 193 ? 7.340 10.475 -13.446 1.00 76.94 193 C 1 +ATOM 3339 N N . TRP C 3 194 ? 6.617 12.945 -16.036 1.00 92.97 194 C 1 +ATOM 3340 C CA . TRP C 3 194 ? 6.577 12.639 -17.459 1.00 93.94 194 C 1 +ATOM 3341 C C . TRP C 3 194 ? 6.782 11.143 -17.723 1.00 93.86 194 C 1 +ATOM 3342 O O . TRP C 3 194 ? 7.568 10.483 -17.033 1.00 91.52 194 C 1 +ATOM 3343 C CB . TRP C 3 194 ? 7.641 13.470 -18.187 1.00 93.67 194 C 1 +ATOM 3344 C CG . TRP C 3 194 ? 7.295 14.930 -18.269 1.00 93.50 194 C 1 +ATOM 3345 C CD1 . TRP C 3 194 ? 7.834 15.927 -17.529 1.00 91.60 194 C 1 +ATOM 3346 C CD2 . TRP C 3 194 ? 6.294 15.550 -19.119 1.00 93.55 194 C 1 +ATOM 3347 N NE1 . TRP C 3 194 ? 7.225 17.130 -17.855 1.00 91.75 194 C 1 +ATOM 3348 C CE2 . TRP C 3 194 ? 6.262 16.931 -18.817 1.00 92.67 194 C 1 +ATOM 3349 C CE3 . TRP C 3 194 ? 5.399 15.059 -20.097 1.00 92.64 194 C 1 +ATOM 3350 C CZ2 . TRP C 3 194 ? 5.349 17.803 -19.457 1.00 92.22 194 C 1 +ATOM 3351 C CZ3 . TRP C 3 194 ? 4.496 15.933 -20.736 1.00 92.37 194 C 1 +ATOM 3352 C CH2 . TRP C 3 194 ? 4.474 17.286 -20.408 1.00 91.99 194 C 1 +ATOM 3353 N N . SER C 3 195 ? 6.116 10.627 -18.743 1.00 93.38 195 C 1 +ATOM 3354 C CA . SER C 3 195 ? 6.455 9.324 -19.296 1.00 93.95 195 C 1 +ATOM 3355 C C . SER C 3 195 ? 7.907 9.324 -19.791 1.00 94.30 195 C 1 +ATOM 3356 O O . SER C 3 195 ? 8.490 10.390 -20.012 1.00 94.16 195 C 1 +ATOM 3357 C CB . SER C 3 195 ? 5.495 8.957 -20.443 1.00 94.08 195 C 1 +ATOM 3358 O OG . SER C 3 195 ? 5.779 9.667 -21.626 1.00 92.45 195 C 1 +ATOM 3359 N N . PRO C 3 196 ? 8.512 8.157 -20.020 1.00 94.08 196 C 1 +ATOM 3360 C CA . PRO C 3 196 ? 9.666 8.080 -20.906 1.00 93.92 196 C 1 +ATOM 3361 C C . PRO C 3 196 ? 9.343 8.726 -22.262 1.00 94.96 196 C 1 +ATOM 3362 O O . PRO C 3 196 ? 8.178 8.809 -22.668 1.00 94.67 196 C 1 +ATOM 3363 C CB . PRO C 3 196 ? 9.982 6.586 -21.042 1.00 92.60 196 C 1 +ATOM 3364 C CG . PRO C 3 196 ? 9.332 5.970 -19.800 1.00 90.77 196 C 1 +ATOM 3365 C CD . PRO C 3 196 ? 8.105 6.842 -19.586 1.00 92.71 196 C 1 +ATOM 3366 N N . TRP C 3 197 ? 10.384 9.179 -22.954 1.00 95.45 197 C 1 +ATOM 3367 C CA . TRP C 3 197 ? 10.260 9.577 -24.352 1.00 96.22 197 C 1 +ATOM 3368 C C . TRP C 3 197 ? 9.844 8.374 -25.206 1.00 96.10 197 C 1 +ATOM 3369 O O . TRP C 3 197 ? 10.237 7.242 -24.919 1.00 94.41 197 C 1 +ATOM 3370 C CB . TRP C 3 197 ? 11.591 10.164 -24.837 1.00 95.98 197 C 1 +ATOM 3371 C CG . TRP C 3 197 ? 11.910 11.499 -24.239 1.00 96.04 197 C 1 +ATOM 3372 C CD1 . TRP C 3 197 ? 12.846 11.738 -23.291 1.00 94.60 197 C 1 +ATOM 3373 C CD2 . TRP C 3 197 ? 11.304 12.787 -24.546 1.00 95.98 197 C 1 +ATOM 3374 N NE1 . TRP C 3 197 ? 12.866 13.096 -22.990 1.00 94.42 197 C 1 +ATOM 3375 C CE2 . TRP C 3 197 ? 11.930 13.771 -23.742 1.00 95.22 197 C 1 +ATOM 3376 C CE3 . TRP C 3 197 ? 10.285 13.207 -25.438 1.00 95.37 197 C 1 +ATOM 3377 C CZ2 . TRP C 3 197 ? 11.565 15.134 -23.820 1.00 95.02 197 C 1 +ATOM 3378 C CZ3 . TRP C 3 197 ? 9.923 14.568 -25.503 1.00 95.21 197 C 1 +ATOM 3379 C CH2 . TRP C 3 197 ? 10.559 15.515 -24.707 1.00 94.89 197 C 1 +ATOM 3380 N N . SER C 3 198 ? 9.070 8.621 -26.250 1.00 95.27 198 C 1 +ATOM 3381 C CA . SER C 3 198 ? 8.774 7.615 -27.259 1.00 95.45 198 C 1 +ATOM 3382 C C . SER C 3 198 ? 10.053 7.111 -27.928 1.00 95.27 198 C 1 +ATOM 3383 O O . SER C 3 198 ? 11.106 7.753 -27.856 1.00 94.53 198 C 1 +ATOM 3384 C CB . SER C 3 198 ? 7.829 8.198 -28.319 1.00 95.52 198 C 1 +ATOM 3385 O OG . SER C 3 198 ? 8.479 9.207 -29.061 1.00 93.72 198 C 1 +ATOM 3386 N N . GLN C 3 199 ? 9.960 5.989 -28.636 1.00 95.23 199 C 1 +ATOM 3387 C CA . GLN C 3 199 ? 10.986 5.674 -29.622 1.00 94.44 199 C 1 +ATOM 3388 C C . GLN C 3 199 ? 11.119 6.833 -30.624 1.00 94.64 199 C 1 +ATOM 3389 O O . GLN C 3 199 ? 10.105 7.456 -30.959 1.00 94.21 199 C 1 +ATOM 3390 C CB . GLN C 3 199 ? 10.647 4.357 -30.338 1.00 93.84 199 C 1 +ATOM 3391 C CG . GLN C 3 199 ? 10.760 3.137 -29.411 1.00 84.77 199 C 1 +ATOM 3392 C CD . GLN C 3 199 ? 12.173 2.940 -28.842 1.00 78.10 199 C 1 +ATOM 3393 O OE1 . GLN C 3 199 ? 13.177 3.247 -29.463 1.00 71.04 199 C 1 +ATOM 3394 N NE2 . GLN C 3 199 ? 12.299 2.439 -27.640 1.00 66.40 199 C 1 +ATOM 3395 N N . PRO C 3 200 ? 12.338 7.142 -31.090 1.00 94.74 200 C 1 +ATOM 3396 C CA . PRO C 3 200 ? 12.534 8.162 -32.108 1.00 94.57 200 C 1 +ATOM 3397 C C . PRO C 3 200 ? 11.850 7.766 -33.420 1.00 94.85 200 C 1 +ATOM 3398 O O . PRO C 3 200 ? 12.050 6.655 -33.915 1.00 93.30 200 C 1 +ATOM 3399 C CB . PRO C 3 200 ? 14.051 8.323 -32.277 1.00 92.95 200 C 1 +ATOM 3400 C CG . PRO C 3 200 ? 14.650 7.646 -31.045 1.00 88.88 200 C 1 +ATOM 3401 C CD . PRO C 3 200 ? 13.617 6.589 -30.676 1.00 91.94 200 C 1 +ATOM 3402 N N . LEU C 3 201 ? 11.083 8.691 -33.994 1.00 94.16 201 C 1 +ATOM 3403 C CA . LEU C 3 201 ? 10.576 8.565 -35.352 1.00 94.32 201 C 1 +ATOM 3404 C C . LEU C 3 201 ? 11.506 9.340 -36.296 1.00 94.36 201 C 1 +ATOM 3405 O O . LEU C 3 201 ? 11.520 10.569 -36.266 1.00 93.05 201 C 1 +ATOM 3406 C CB . LEU C 3 201 ? 9.130 9.082 -35.416 1.00 94.46 201 C 1 +ATOM 3407 C CG . LEU C 3 201 ? 8.530 9.050 -36.837 1.00 94.13 201 C 1 +ATOM 3408 C CD1 . LEU C 3 201 ? 8.294 7.625 -37.325 1.00 86.26 201 C 1 +ATOM 3409 C CD2 . LEU C 3 201 ? 7.198 9.793 -36.850 1.00 86.61 201 C 1 +ATOM 3410 N N . ALA C 3 202 ? 12.232 8.622 -37.145 1.00 94.32 202 C 1 +ATOM 3411 C CA . ALA C 3 202 ? 13.031 9.240 -38.194 1.00 93.79 202 C 1 +ATOM 3412 C C . ALA C 3 202 ? 12.146 9.634 -39.391 1.00 93.98 202 C 1 +ATOM 3413 O O . ALA C 3 202 ? 11.321 8.846 -39.855 1.00 92.46 202 C 1 +ATOM 3414 C CB . ALA C 3 202 ? 14.162 8.294 -38.595 1.00 92.31 202 C 1 +ATOM 3415 N N . PHE C 3 203 ? 12.363 10.850 -39.916 1.00 93.60 203 C 1 +ATOM 3416 C CA . PHE C 3 203 ? 11.733 11.302 -41.160 1.00 93.70 203 C 1 +ATOM 3417 C C . PHE C 3 203 ? 12.656 12.232 -41.937 1.00 94.19 203 C 1 +ATOM 3418 O O . PHE C 3 203 ? 13.584 12.819 -41.381 1.00 93.14 203 C 1 +ATOM 3419 C CB . PHE C 3 203 ? 10.372 11.961 -40.868 1.00 92.75 203 C 1 +ATOM 3420 C CG . PHE C 3 203 ? 10.455 13.312 -40.196 1.00 93.19 203 C 1 +ATOM 3421 C CD1 . PHE C 3 203 ? 10.546 13.408 -38.790 1.00 89.18 203 C 1 +ATOM 3422 C CD2 . PHE C 3 203 ? 10.438 14.496 -40.960 1.00 89.86 203 C 1 +ATOM 3423 C CE1 . PHE C 3 203 ? 10.625 14.660 -38.165 1.00 88.38 203 C 1 +ATOM 3424 C CE2 . PHE C 3 203 ? 10.519 15.751 -40.336 1.00 87.72 203 C 1 +ATOM 3425 C CZ . PHE C 3 203 ? 10.609 15.837 -38.933 1.00 90.97 203 C 1 +ATOM 3426 N N . ARG C 3 204 ? 12.408 12.390 -43.228 1.00 92.84 204 C 1 +ATOM 3427 C CA . ARG C 3 204 ? 13.156 13.292 -44.105 1.00 93.51 204 C 1 +ATOM 3428 C C . ARG C 3 204 ? 12.199 14.241 -44.822 1.00 93.45 204 C 1 +ATOM 3429 O O . ARG C 3 204 ? 11.211 13.787 -45.398 1.00 90.84 204 C 1 +ATOM 3430 C CB . ARG C 3 204 ? 14.018 12.468 -45.073 1.00 92.37 204 C 1 +ATOM 3431 C CG . ARG C 3 204 ? 15.033 13.334 -45.833 1.00 89.87 204 C 1 +ATOM 3432 C CD . ARG C 3 204 ? 15.876 12.466 -46.776 1.00 87.21 204 C 1 +ATOM 3433 N NE . ARG C 3 204 ? 16.924 13.255 -47.451 1.00 82.58 204 C 1 +ATOM 3434 C CZ . ARG C 3 204 ? 18.220 13.335 -47.162 1.00 78.59 204 C 1 +ATOM 3435 N NH1 . ARG C 3 204 ? 18.755 12.659 -46.191 1.00 70.48 204 C 1 +ATOM 3436 N NH2 . ARG C 3 204 ? 18.981 14.092 -47.879 1.00 74.53 204 C 1 +ATOM 3437 N N . THR C 3 205 ? 12.489 15.531 -44.765 1.00 92.87 205 C 1 +ATOM 3438 C CA . THR C 3 205 ? 11.749 16.533 -45.532 1.00 92.97 205 C 1 +ATOM 3439 C C . THR C 3 205 ? 11.979 16.355 -47.035 1.00 92.37 205 C 1 +ATOM 3440 O O . THR C 3 205 ? 13.007 15.834 -47.473 1.00 90.16 205 C 1 +ATOM 3441 C CB . THR C 3 205 ? 12.112 17.960 -45.105 1.00 91.88 205 C 1 +ATOM 3442 O OG1 . THR C 3 205 ? 13.501 18.126 -45.100 1.00 85.33 205 C 1 +ATOM 3443 C CG2 . THR C 3 205 ? 11.592 18.274 -43.707 1.00 85.33 205 C 1 +ATOM 3444 N N . LYS C 3 206 ? 11.020 16.780 -47.842 1.00 92.41 206 C 1 +ATOM 3445 C CA . LYS C 3 206 ? 11.162 16.732 -49.300 1.00 92.50 206 C 1 +ATOM 3446 C C . LYS C 3 206 ? 12.223 17.725 -49.765 1.00 92.84 206 C 1 +ATOM 3447 O O . LYS C 3 206 ? 12.358 18.799 -49.164 1.00 90.87 206 C 1 +ATOM 3448 C CB . LYS C 3 206 ? 9.812 16.993 -49.982 1.00 90.80 206 C 1 +ATOM 3449 C CG . LYS C 3 206 ? 8.817 15.852 -49.745 1.00 87.16 206 C 1 +ATOM 3450 C CD . LYS C 3 206 ? 7.489 16.142 -50.449 1.00 80.41 206 C 1 +ATOM 3451 C CE . LYS C 3 206 ? 6.487 15.017 -50.172 1.00 72.67 206 C 1 +ATOM 3452 N NZ . LYS C 3 206 ? 5.123 15.360 -50.640 1.00 64.32 206 C 1 +ATOM 3453 N N . PRO C 3 207 ? 12.960 17.428 -50.848 1.00 91.91 207 C 1 +ATOM 3454 C CA . PRO C 3 207 ? 13.871 18.396 -51.442 1.00 91.32 207 C 1 +ATOM 3455 C C . PRO C 3 207 ? 13.094 19.609 -51.967 1.00 91.22 207 C 1 +ATOM 3456 O O . PRO C 3 207 ? 11.941 19.486 -52.404 1.00 88.09 207 C 1 +ATOM 3457 C CB . PRO C 3 207 ? 14.605 17.636 -52.550 1.00 88.94 207 C 1 +ATOM 3458 C CG . PRO C 3 207 ? 13.636 16.520 -52.932 1.00 86.29 207 C 1 +ATOM 3459 C CD . PRO C 3 207 ? 12.928 16.201 -51.618 1.00 89.42 207 C 1 +ATOM 3460 N N . ALA C 3 208 ? 13.723 20.785 -51.896 1.00 88.57 208 C 1 +ATOM 3461 C CA . ALA C 3 208 ? 13.182 21.953 -52.570 1.00 86.21 208 C 1 +ATOM 3462 C C . ALA C 3 208 ? 13.098 21.651 -54.074 1.00 84.85 208 C 1 +ATOM 3463 O O . ALA C 3 208 ? 14.019 21.075 -54.651 1.00 78.28 208 C 1 +ATOM 3464 C CB . ALA C 3 208 ? 14.045 23.173 -52.265 1.00 81.79 208 C 1 +ATOM 3465 N N . ALA C 3 209 ? 11.996 22.040 -54.707 1.00 81.99 209 C 1 +ATOM 3466 C CA . ALA C 3 209 ? 11.929 21.974 -56.152 1.00 80.50 209 C 1 +ATOM 3467 C C . ALA C 3 209 ? 13.062 22.854 -56.701 1.00 78.77 209 C 1 +ATOM 3468 O O . ALA C 3 209 ? 13.141 24.031 -56.358 1.00 71.51 209 C 1 +ATOM 3469 C CB . ALA C 3 209 ? 10.546 22.426 -56.622 1.00 74.68 209 C 1 +ATOM 3470 N N . LEU C 3 210 ? 13.923 22.284 -57.549 1.00 71.13 210 C 1 +ATOM 3471 C CA . LEU C 3 210 ? 14.813 23.076 -58.394 1.00 71.00 210 C 1 +ATOM 3472 C C . LEU C 3 210 ? 13.923 24.070 -59.140 1.00 70.03 210 C 1 +ATOM 3473 O O . LEU C 3 210 ? 12.974 23.656 -59.816 1.00 61.24 210 C 1 +ATOM 3474 C CB . LEU C 3 210 ? 15.580 22.160 -59.368 1.00 65.20 210 C 1 +ATOM 3475 C CG . LEU C 3 210 ? 16.798 21.475 -58.720 1.00 58.79 210 C 1 +ATOM 3476 C CD1 . LEU C 3 210 ? 17.200 20.242 -59.534 1.00 54.87 210 C 1 +ATOM 3477 C CD2 . LEU C 3 210 ? 17.996 22.423 -58.659 1.00 55.12 210 C 1 +ATOM 3478 N N . GLY C 3 211 ? 14.187 25.355 -58.910 1.00 59.18 211 C 1 +ATOM 3479 C CA . GLY C 3 211 ? 13.577 26.382 -59.735 1.00 59.43 211 C 1 +ATOM 3480 C C . GLY C 3 211 ? 13.840 26.016 -61.190 1.00 57.76 211 C 1 +ATOM 3481 O O . GLY C 3 211 ? 14.937 25.571 -61.530 1.00 53.76 211 C 1 +ATOM 3482 N N . LYS C 3 212 ? 12.839 26.164 -62.049 1.00 44.96 212 C 1 +ATOM 3483 C CA . LYS C 3 212 ? 13.110 26.174 -63.485 1.00 47.92 212 C 1 +ATOM 3484 C C . LYS C 3 212 ? 14.073 27.338 -63.699 1.00 47.56 212 C 1 +ATOM 3485 O O . LYS C 3 212 ? 13.657 28.479 -63.504 1.00 44.26 212 C 1 +ATOM 3486 C CB . LYS C 3 212 ? 11.841 26.384 -64.303 1.00 45.40 212 C 1 +ATOM 3487 C CG . LYS C 3 212 ? 10.994 25.114 -64.437 1.00 41.17 212 C 1 +ATOM 3488 C CD . LYS C 3 212 ? 9.797 25.398 -65.352 1.00 39.03 212 C 1 +ATOM 3489 C CE . LYS C 3 212 ? 8.995 24.130 -65.596 1.00 34.17 212 C 1 +ATOM 3490 N NZ . LYS C 3 212 ? 7.853 24.389 -66.503 1.00 32.28 212 C 1 +ATOM 3491 N N . ASP C 3 213 ? 15.315 27.039 -64.045 1.00 35.20 213 C 1 +ATOM 3492 C CA . ASP C 3 213 ? 16.129 28.016 -64.749 1.00 37.51 213 C 1 +ATOM 3493 C C . ASP C 3 213 ? 15.340 28.430 -65.992 1.00 36.05 213 C 1 +ATOM 3494 O O . ASP C 3 213 ? 15.169 27.641 -66.926 1.00 33.82 213 C 1 +ATOM 3495 C CB . ASP C 3 213 ? 17.506 27.437 -65.120 1.00 35.99 213 C 1 +ATOM 3496 C CG . ASP C 3 213 ? 18.487 27.339 -63.944 1.00 32.77 213 C 1 +ATOM 3497 O OD1 . ASP C 3 213 ? 18.375 28.154 -63.009 1.00 32.25 213 C 1 +ATOM 3498 O OD2 . ASP C 3 213 ? 19.357 26.443 -64.002 1.00 31.20 213 C 1 +ATOM 3499 N N . THR C 3 214 ? 14.732 29.595 -65.916 1.00 31.37 214 C 1 +ATOM 3500 C CA . THR C 3 214 ? 14.310 30.353 -67.099 1.00 30.94 214 C 1 +ATOM 3501 C C . THR C 3 214 ? 15.499 31.126 -67.631 1.00 29.21 214 C 1 +ATOM 3502 O O . THR C 3 214 ? 16.204 31.726 -66.795 1.00 26.53 214 C 1 +ATOM 3503 C CB . THR C 3 214 ? 13.205 31.361 -66.800 1.00 28.40 214 C 1 +ATOM 3504 O OG1 . THR C 3 214 ? 13.441 31.946 -65.546 1.00 26.71 214 C 1 +ATOM 3505 C CG2 . THR C 3 214 ? 11.831 30.712 -66.814 1.00 28.92 214 C 1 +ATOM 3506 O OXT . THR C 3 214 ? 15.623 31.100 -68.892 1.00 27.40 214 C 1 +# diff --git a/data/example_multichain_protein/vh_chain1.fasta b/data/example_multichain_protein/vh_chain1.fasta new file mode 100644 index 0000000000000000000000000000000000000000..21813591601249b445adc8434d9c53f9b8a132d8 --- /dev/null +++ b/data/example_multichain_protein/vh_chain1.fasta @@ -0,0 +1,2 @@ +>vh_anticd122 +EVQLVESGGGLVQPGGSLRLSCAASGFTFSDFYMEWVRQAPGKGLEWIAASRNKANDYTTEYSASVKGRFIVSRDDSKNSLYLQMNSLKTEDTAVYYCARSYYRYDGMDYWGQGTTVTVSS diff --git a/data/example_multichain_protein/vl_chain2.fasta b/data/example_multichain_protein/vl_chain2.fasta new file mode 100644 index 0000000000000000000000000000000000000000..7a482454ddbd46b063ce30c2198fb469052fd98f --- /dev/null +++ b/data/example_multichain_protein/vl_chain2.fasta @@ -0,0 +1,2 @@ +>vl_anticd122 +EIVLTQSPATLSLSPGERATLSCSAISSVSYMYWYQQKPGQAPRLLIYDTSNLVSGVPARFSGSGSGTDYTLTISSLEPEDFAVYYCQQWNTYPYTFGGGTKVEIK diff --git a/data/example_protein/APEX_33overhang.fasta b/data/example_protein/APEX_33overhang.fasta new file mode 100644 index 0000000000000000000000000000000000000000..4e0fb4f9884bf7f53b3cd75faa7762081c01df4e --- /dev/null +++ b/data/example_protein/APEX_33overhang.fasta @@ -0,0 +1,2 @@ +>APEX_33overhang +TCTCGCACCATGGACTACAAGGATGACGACGATAAGGGAAAGTCTTACCCAACTGTGAGTGCTGATTACCAGGACGCCGTTGAGAAGGCGAAGAAGAAGCTCAGAGGCTTCATCGCTGAGAAGAGATGCGCTCCTCTAATGCTCCGTTTGGCATTCCACTCTGCTGGAACCTTTGACAAGGGCACGAAGACCGGTGGACCCTTCGGAACCATCAAGCACCCTGCCGAACTGGCTCACAGCGCTAACAACGGTCTTGACATCGCTGTTAGGCTTTTGGAGCCACTCAAGGCGGAGTTCCCTATTTTGAGCTACGCCGATTTCTACCAGTTGGCTGGCGTTGTTGCCGTTGAGGTCACGGGTGGACCTAAGGTTCCATTCCACCCTGGAAGAGAGGACAAGCCTGAGCCACCACCAGAGGGTCGCTTGCCCGATGCCACTAAGGGTTCTGACCATTTGAGAGATGTGTTTGGCAAAGCTATGGGGCTTACTGACCAAGATATCGTTGCTCTATCTGGGGGTCACACTATTGGAGCTGCACACAAGGAGCGTTCTGGATTTGAGGGTCCCTGGACCTCTAATCCTCTTATTTTCGACAACTCATACTTCACGGAGTTGTTGAGTGGTGAGAAGGAAGGTCTCCTTCAGCTACCTTCTGACAAGGCTCTTTTGTCTGACCCTGTATTCCGCCCTCTCGTTGACAAATATGCAGCGGACGAAGATGCCTTCTTTGCTGATTACGCTGAGGCTCACCAAAAGCTTTCCGAGCTTGGGTTTGCTGATGCCCTGCAGCTGCCTCCCCTGGAGCGCCTGACCCTGGACTAGTAAGCGAGACGAAGACGAATTCTCTAGATATAG diff --git a/data/example_protein/MULTI-assembly_input.csv b/data/example_protein/MULTI-assembly_input.csv new file mode 100644 index 0000000000000000000000000000000000000000..982e3977d19ac227c5e33d8dff9891fec3f6ad45 --- /dev/null +++ b/data/example_protein/MULTI-assembly_input.csv @@ -0,0 +1,15 @@ +N72A/A167R/T192K +A167R/T192K/D222E +S138A/A167R/T192K +N72A/A167R/T192K/D222E +N72A/S138A/A167R/T192K +N72A/A167R/T192K/D229A +N72A/S138A/A167R/T192K/D222E +N72A/A167R/T192K/D222E/D229A +K61R/N72A/A167R/T192K/D222E +N72A/S138A/A167R/T192K/D222E/D229A +K61R/N72A/S138A/A167R/T192K/D222E +K61R/N72A/A167R/T192K/D222E/D229A +K61R/N72A/S138A/A167R/T192K/D222E/D229A +N72A/S138A/A148Q/A167R/T192K/D222E/D229A +N72A/S138A/A167R/I185V/T192K/D222E/D229A \ No newline at end of file diff --git a/data/example_protein/apex.cif b/data/example_protein/apex.cif new file mode 100644 index 0000000000000000000000000000000000000000..bf86bd3f2e16b0be0481a5a907bd404673f0c54d --- /dev/null +++ b/data/example_protein/apex.cif @@ -0,0 +1,2604 @@ +# By using this file you agree to the legally binding terms of use found at alphafoldserver.com/output-terms +data_537378a8140b6b64 +# +_entry.id 537378a8140b6b64 +# +loop_ +_atom_type.symbol +C +N +O +S +# +loop_ +_audit_author.name +_audit_author.pdbx_ordinal +"Google DeepMind" 1 +"Isomorphic Labs" 2 +# +_audit_conform.dict_location https://raw.githubusercontent.com/ihmwg/ModelCIF/master/dist/mmcif_ma.dic +_audit_conform.dict_name mmcif_ma.dic +_audit_conform.dict_version 1.4.5 +# +loop_ +_chem_comp.formula +_chem_comp.formula_weight +_chem_comp.id +_chem_comp.mon_nstd_flag +_chem_comp.name +_chem_comp.pdbx_smiles +_chem_comp.pdbx_synonyms +_chem_comp.type +"C3 H7 N O2" 89.093 ALA y ALANINE C[C@H](N)C(O)=O ? "L-PEPTIDE LINKING" +"C6 H15 N4 O2" 175.209 ARG y ARGININE N[C@@H](CCCNC(N)=[NH2+])C(O)=O ? "L-PEPTIDE LINKING" +"C4 H8 N2 O3" 132.118 ASN y ASPARAGINE N[C@@H](CC(N)=O)C(O)=O ? "L-PEPTIDE LINKING" +"C4 H7 N O4" 133.103 ASP y "ASPARTIC ACID" N[C@@H](CC(O)=O)C(O)=O ? "L-PEPTIDE LINKING" +"C3 H7 N O2 S" 121.158 CYS y CYSTEINE N[C@@H](CS)C(O)=O ? "L-PEPTIDE LINKING" +"C5 H10 N2 O3" 146.144 GLN y GLUTAMINE N[C@@H](CCC(N)=O)C(O)=O ? "L-PEPTIDE LINKING" +"C5 H9 N O4" 147.129 GLU y "GLUTAMIC ACID" N[C@@H](CCC(O)=O)C(O)=O ? "L-PEPTIDE LINKING" +"C2 H5 N O2" 75.067 GLY y GLYCINE NCC(O)=O ? "PEPTIDE LINKING" +"C6 H10 N3 O2" 156.162 HIS y HISTIDINE N[C@@H](Cc1c[nH]c[nH+]1)C(O)=O ? "L-PEPTIDE LINKING" +"C6 H13 N O2" 131.173 ILE y ISOLEUCINE CC[C@H](C)[C@H](N)C(O)=O ? "L-PEPTIDE LINKING" +"C6 H13 N O2" 131.173 LEU y LEUCINE CC(C)C[C@H](N)C(O)=O ? "L-PEPTIDE LINKING" +"C6 H15 N2 O2" 147.195 LYS y LYSINE N[C@@H](CCCC[NH3+])C(O)=O ? "L-PEPTIDE LINKING" +"C5 H11 N O2 S" 149.211 MET y METHIONINE CSCC[C@H](N)C(O)=O ? "L-PEPTIDE LINKING" +"C9 H11 N O2" 165.189 PHE y PHENYLALANINE N[C@@H](Cc1ccccc1)C(O)=O ? "L-PEPTIDE LINKING" +"C5 H9 N O2" 115.130 PRO y PROLINE OC(=O)[C@@H]1CCCN1 ? "L-PEPTIDE LINKING" +"C3 H7 N O3" 105.093 SER y SERINE N[C@@H](CO)C(O)=O ? "L-PEPTIDE LINKING" +"C4 H9 N O3" 119.119 THR y THREONINE C[C@@H](O)[C@H](N)C(O)=O ? "L-PEPTIDE LINKING" +"C11 H12 N2 O2" 204.225 TRP y TRYPTOPHAN N[C@@H](Cc1c[nH]c2ccccc12)C(O)=O ? "L-PEPTIDE LINKING" +"C9 H11 N O3" 181.189 TYR y TYROSINE N[C@@H](Cc1ccc(O)cc1)C(O)=O ? "L-PEPTIDE LINKING" +"C5 H11 N O2" 117.146 VAL y VALINE CC(C)[C@H](N)C(O)=O ? "L-PEPTIDE LINKING" +# +_citation.book_publisher ? +_citation.country UK +_citation.id primary +_citation.journal_full Nature +_citation.journal_id_ASTM NATUAS +_citation.journal_id_CSD 0006 +_citation.journal_id_ISSN 0028-0836 +_citation.journal_volume ? +_citation.page_first ? +_citation.page_last ? +_citation.pdbx_database_id_DOI ? +_citation.pdbx_database_id_PubMed ? +_citation.title "Accurate structure prediction of biomolecular interactions with AlphaFold 3" +_citation.year 2024 +# +loop_ +_citation_author.citation_id +_citation_author.name +_citation_author.ordinal +primary "Google DeepMind" 1 +primary "Isomorphic Labs" 2 +# +_entity.id 1 +_entity.pdbx_description . +_entity.type polymer +# +_entity_poly.entity_id 1 +_entity_poly.pdbx_strand_id A +_entity_poly.type polypeptide(L) +# +loop_ +_entity_poly_seq.entity_id +_entity_poly_seq.hetero +_entity_poly_seq.mon_id +_entity_poly_seq.num +1 n MET 1 +1 n GLY 2 +1 n LYS 3 +1 n SER 4 +1 n TYR 5 +1 n PRO 6 +1 n THR 7 +1 n VAL 8 +1 n SER 9 +1 n ALA 10 +1 n ASP 11 +1 n TYR 12 +1 n GLN 13 +1 n ASP 14 +1 n ALA 15 +1 n VAL 16 +1 n GLU 17 +1 n LYS 18 +1 n ALA 19 +1 n LYS 20 +1 n LYS 21 +1 n LYS 22 +1 n LEU 23 +1 n ARG 24 +1 n GLY 25 +1 n PHE 26 +1 n ILE 27 +1 n ALA 28 +1 n GLU 29 +1 n LYS 30 +1 n ARG 31 +1 n CYS 32 +1 n ALA 33 +1 n PRO 34 +1 n LEU 35 +1 n MET 36 +1 n LEU 37 +1 n ARG 38 +1 n LEU 39 +1 n ALA 40 +1 n PHE 41 +1 n HIS 42 +1 n SER 43 +1 n ALA 44 +1 n GLY 45 +1 n THR 46 +1 n PHE 47 +1 n ASP 48 +1 n LYS 49 +1 n GLY 50 +1 n THR 51 +1 n LYS 52 +1 n THR 53 +1 n GLY 54 +1 n GLY 55 +1 n PRO 56 +1 n PHE 57 +1 n GLY 58 +1 n THR 59 +1 n ILE 60 +1 n LYS 61 +1 n HIS 62 +1 n PRO 63 +1 n ALA 64 +1 n GLU 65 +1 n LEU 66 +1 n ALA 67 +1 n HIS 68 +1 n SER 69 +1 n ALA 70 +1 n ASN 71 +1 n ASN 72 +1 n GLY 73 +1 n LEU 74 +1 n ASP 75 +1 n ILE 76 +1 n ALA 77 +1 n VAL 78 +1 n ARG 79 +1 n LEU 80 +1 n LEU 81 +1 n GLU 82 +1 n PRO 83 +1 n LEU 84 +1 n LYS 85 +1 n ALA 86 +1 n GLU 87 +1 n PHE 88 +1 n PRO 89 +1 n ILE 90 +1 n LEU 91 +1 n SER 92 +1 n TYR 93 +1 n ALA 94 +1 n ASP 95 +1 n PHE 96 +1 n TYR 97 +1 n GLN 98 +1 n LEU 99 +1 n ALA 100 +1 n GLY 101 +1 n VAL 102 +1 n VAL 103 +1 n ALA 104 +1 n VAL 105 +1 n GLU 106 +1 n VAL 107 +1 n THR 108 +1 n GLY 109 +1 n GLY 110 +1 n PRO 111 +1 n LYS 112 +1 n VAL 113 +1 n PRO 114 +1 n PHE 115 +1 n HIS 116 +1 n PRO 117 +1 n GLY 118 +1 n ARG 119 +1 n GLU 120 +1 n ASP 121 +1 n LYS 122 +1 n PRO 123 +1 n GLU 124 +1 n PRO 125 +1 n PRO 126 +1 n PRO 127 +1 n GLU 128 +1 n GLY 129 +1 n ARG 130 +1 n LEU 131 +1 n PRO 132 +1 n ASP 133 +1 n ALA 134 +1 n THR 135 +1 n LYS 136 +1 n GLY 137 +1 n SER 138 +1 n ASP 139 +1 n HIS 140 +1 n LEU 141 +1 n ARG 142 +1 n ASP 143 +1 n VAL 144 +1 n PHE 145 +1 n GLY 146 +1 n LYS 147 +1 n ALA 148 +1 n MET 149 +1 n GLY 150 +1 n LEU 151 +1 n THR 152 +1 n ASP 153 +1 n GLN 154 +1 n ASP 155 +1 n ILE 156 +1 n VAL 157 +1 n ALA 158 +1 n LEU 159 +1 n SER 160 +1 n GLY 161 +1 n GLY 162 +1 n HIS 163 +1 n THR 164 +1 n ILE 165 +1 n GLY 166 +1 n ALA 167 +1 n ALA 168 +1 n HIS 169 +1 n LYS 170 +1 n GLU 171 +1 n ARG 172 +1 n SER 173 +1 n GLY 174 +1 n PHE 175 +1 n GLU 176 +1 n GLY 177 +1 n PRO 178 +1 n TRP 179 +1 n THR 180 +1 n SER 181 +1 n ASN 182 +1 n PRO 183 +1 n LEU 184 +1 n ILE 185 +1 n PHE 186 +1 n ASP 187 +1 n ASN 188 +1 n SER 189 +1 n TYR 190 +1 n PHE 191 +1 n THR 192 +1 n GLU 193 +1 n LEU 194 +1 n LEU 195 +1 n SER 196 +1 n GLY 197 +1 n GLU 198 +1 n LYS 199 +1 n GLU 200 +1 n GLY 201 +1 n LEU 202 +1 n LEU 203 +1 n GLN 204 +1 n LEU 205 +1 n PRO 206 +1 n SER 207 +1 n ASP 208 +1 n LYS 209 +1 n ALA 210 +1 n LEU 211 +1 n LEU 212 +1 n SER 213 +1 n ASP 214 +1 n PRO 215 +1 n VAL 216 +1 n PHE 217 +1 n ARG 218 +1 n PRO 219 +1 n LEU 220 +1 n VAL 221 +1 n ASP 222 +1 n LYS 223 +1 n TYR 224 +1 n ALA 225 +1 n ALA 226 +1 n ASP 227 +1 n GLU 228 +1 n ASP 229 +1 n ALA 230 +1 n PHE 231 +1 n PHE 232 +1 n ALA 233 +1 n ASP 234 +1 n TYR 235 +1 n ALA 236 +1 n GLU 237 +1 n ALA 238 +1 n HIS 239 +1 n GLN 240 +1 n LYS 241 +1 n LEU 242 +1 n SER 243 +1 n GLU 244 +1 n LEU 245 +1 n GLY 246 +1 n PHE 247 +1 n ALA 248 +1 n ASP 249 +1 n ALA 250 +# +_ma_data.content_type "model coordinates" +_ma_data.id 1 +_ma_data.name Model +# +_ma_model_list.data_id 1 +_ma_model_list.model_group_id 1 +_ma_model_list.model_group_name "AlphaFold-beta-20231127 (7a14c934-fe78-43c1-a552-7fb305b0ebd1 @ 2024-08-24 11:46:13)" +_ma_model_list.model_id 1 +_ma_model_list.model_name "Top ranked model" +_ma_model_list.model_type "Ab initio model" +_ma_model_list.ordinal_id 1 +# +loop_ +_ma_protocol_step.method_type +_ma_protocol_step.ordinal_id +_ma_protocol_step.protocol_id +_ma_protocol_step.step_id +"coevolution MSA" 1 1 1 +"template search" 2 1 2 +modeling 3 1 3 +# +loop_ +_ma_qa_metric.id +_ma_qa_metric.mode +_ma_qa_metric.name +_ma_qa_metric.software_group_id +_ma_qa_metric.type +1 global pLDDT 1 pLDDT +2 local pLDDT 1 pLDDT +# +_ma_qa_metric_global.metric_id 1 +_ma_qa_metric_global.metric_value 96.61 +_ma_qa_metric_global.model_id 1 +_ma_qa_metric_global.ordinal_id 1 +# +_ma_software_group.group_id 1 +_ma_software_group.ordinal_id 1 +_ma_software_group.software_id 1 +# +_ma_target_entity.data_id 1 +_ma_target_entity.entity_id 1 +_ma_target_entity.origin . +# +_ma_target_entity_instance.asym_id A +_ma_target_entity_instance.details . +_ma_target_entity_instance.entity_id 1 +# +loop_ +_pdbx_data_usage.details +_pdbx_data_usage.id +_pdbx_data_usage.type +_pdbx_data_usage.url +;NON-COMMERCIAL USE ONLY, BY USING THIS FILE YOU AGREE TO THE TERMS OF USE FOUND +AT alphafoldserver.com/output-terms. +; +1 license ? +;THE INFORMATION IS NOT INTENDED FOR, HAS NOT BEEN VALIDATED FOR, AND IS NOT +APPROVED FOR CLINICAL USE. IT SHOULD NOT BE USED FOR CLINICAL PURPOSE OR RELIED +ON FOR MEDICAL OR OTHER PROFESSIONAL ADVICE. IT IS THEORETICAL MODELLING ONLY +AND CAUTION SHOULD BE EXERCISED IN ITS USE. IT IS PROVIDED "AS-IS" WITHOUT ANY +WARRANTY OF ANY KIND, WHETHER EXPRESSED OR IMPLIED. NO WARRANTY IS GIVEN THAT +USE OF THE INFORMATION SHALL NOT INFRINGE THE RIGHTS OF ANY THIRD PARTY. +; +2 disclaimer ? +# +loop_ +_pdbx_poly_seq_scheme.asym_id +_pdbx_poly_seq_scheme.auth_seq_num +_pdbx_poly_seq_scheme.entity_id +_pdbx_poly_seq_scheme.hetero +_pdbx_poly_seq_scheme.mon_id +_pdbx_poly_seq_scheme.pdb_ins_code +_pdbx_poly_seq_scheme.pdb_seq_num +_pdbx_poly_seq_scheme.pdb_strand_id +_pdbx_poly_seq_scheme.seq_id +A 1 1 n MET . 1 A 1 +A 2 1 n GLY . 2 A 2 +A 3 1 n LYS . 3 A 3 +A 4 1 n SER . 4 A 4 +A 5 1 n TYR . 5 A 5 +A 6 1 n PRO . 6 A 6 +A 7 1 n THR . 7 A 7 +A 8 1 n VAL . 8 A 8 +A 9 1 n SER . 9 A 9 +A 10 1 n ALA . 10 A 10 +A 11 1 n ASP . 11 A 11 +A 12 1 n TYR . 12 A 12 +A 13 1 n GLN . 13 A 13 +A 14 1 n ASP . 14 A 14 +A 15 1 n ALA . 15 A 15 +A 16 1 n VAL . 16 A 16 +A 17 1 n GLU . 17 A 17 +A 18 1 n LYS . 18 A 18 +A 19 1 n ALA . 19 A 19 +A 20 1 n LYS . 20 A 20 +A 21 1 n LYS . 21 A 21 +A 22 1 n LYS . 22 A 22 +A 23 1 n LEU . 23 A 23 +A 24 1 n ARG . 24 A 24 +A 25 1 n GLY . 25 A 25 +A 26 1 n PHE . 26 A 26 +A 27 1 n ILE . 27 A 27 +A 28 1 n ALA . 28 A 28 +A 29 1 n GLU . 29 A 29 +A 30 1 n LYS . 30 A 30 +A 31 1 n ARG . 31 A 31 +A 32 1 n CYS . 32 A 32 +A 33 1 n ALA . 33 A 33 +A 34 1 n PRO . 34 A 34 +A 35 1 n LEU . 35 A 35 +A 36 1 n MET . 36 A 36 +A 37 1 n LEU . 37 A 37 +A 38 1 n ARG . 38 A 38 +A 39 1 n LEU . 39 A 39 +A 40 1 n ALA . 40 A 40 +A 41 1 n PHE . 41 A 41 +A 42 1 n HIS . 42 A 42 +A 43 1 n SER . 43 A 43 +A 44 1 n ALA . 44 A 44 +A 45 1 n GLY . 45 A 45 +A 46 1 n THR . 46 A 46 +A 47 1 n PHE . 47 A 47 +A 48 1 n ASP . 48 A 48 +A 49 1 n LYS . 49 A 49 +A 50 1 n GLY . 50 A 50 +A 51 1 n THR . 51 A 51 +A 52 1 n LYS . 52 A 52 +A 53 1 n THR . 53 A 53 +A 54 1 n GLY . 54 A 54 +A 55 1 n GLY . 55 A 55 +A 56 1 n PRO . 56 A 56 +A 57 1 n PHE . 57 A 57 +A 58 1 n GLY . 58 A 58 +A 59 1 n THR . 59 A 59 +A 60 1 n ILE . 60 A 60 +A 61 1 n LYS . 61 A 61 +A 62 1 n HIS . 62 A 62 +A 63 1 n PRO . 63 A 63 +A 64 1 n ALA . 64 A 64 +A 65 1 n GLU . 65 A 65 +A 66 1 n LEU . 66 A 66 +A 67 1 n ALA . 67 A 67 +A 68 1 n HIS . 68 A 68 +A 69 1 n SER . 69 A 69 +A 70 1 n ALA . 70 A 70 +A 71 1 n ASN . 71 A 71 +A 72 1 n ASN . 72 A 72 +A 73 1 n GLY . 73 A 73 +A 74 1 n LEU . 74 A 74 +A 75 1 n ASP . 75 A 75 +A 76 1 n ILE . 76 A 76 +A 77 1 n ALA . 77 A 77 +A 78 1 n VAL . 78 A 78 +A 79 1 n ARG . 79 A 79 +A 80 1 n LEU . 80 A 80 +A 81 1 n LEU . 81 A 81 +A 82 1 n GLU . 82 A 82 +A 83 1 n PRO . 83 A 83 +A 84 1 n LEU . 84 A 84 +A 85 1 n LYS . 85 A 85 +A 86 1 n ALA . 86 A 86 +A 87 1 n GLU . 87 A 87 +A 88 1 n PHE . 88 A 88 +A 89 1 n PRO . 89 A 89 +A 90 1 n ILE . 90 A 90 +A 91 1 n LEU . 91 A 91 +A 92 1 n SER . 92 A 92 +A 93 1 n TYR . 93 A 93 +A 94 1 n ALA . 94 A 94 +A 95 1 n ASP . 95 A 95 +A 96 1 n PHE . 96 A 96 +A 97 1 n TYR . 97 A 97 +A 98 1 n GLN . 98 A 98 +A 99 1 n LEU . 99 A 99 +A 100 1 n ALA . 100 A 100 +A 101 1 n GLY . 101 A 101 +A 102 1 n VAL . 102 A 102 +A 103 1 n VAL . 103 A 103 +A 104 1 n ALA . 104 A 104 +A 105 1 n VAL . 105 A 105 +A 106 1 n GLU . 106 A 106 +A 107 1 n VAL . 107 A 107 +A 108 1 n THR . 108 A 108 +A 109 1 n GLY . 109 A 109 +A 110 1 n GLY . 110 A 110 +A 111 1 n PRO . 111 A 111 +A 112 1 n LYS . 112 A 112 +A 113 1 n VAL . 113 A 113 +A 114 1 n PRO . 114 A 114 +A 115 1 n PHE . 115 A 115 +A 116 1 n HIS . 116 A 116 +A 117 1 n PRO . 117 A 117 +A 118 1 n GLY . 118 A 118 +A 119 1 n ARG . 119 A 119 +A 120 1 n GLU . 120 A 120 +A 121 1 n ASP . 121 A 121 +A 122 1 n LYS . 122 A 122 +A 123 1 n PRO . 123 A 123 +A 124 1 n GLU . 124 A 124 +A 125 1 n PRO . 125 A 125 +A 126 1 n PRO . 126 A 126 +A 127 1 n PRO . 127 A 127 +A 128 1 n GLU . 128 A 128 +A 129 1 n GLY . 129 A 129 +A 130 1 n ARG . 130 A 130 +A 131 1 n LEU . 131 A 131 +A 132 1 n PRO . 132 A 132 +A 133 1 n ASP . 133 A 133 +A 134 1 n ALA . 134 A 134 +A 135 1 n THR . 135 A 135 +A 136 1 n LYS . 136 A 136 +A 137 1 n GLY . 137 A 137 +A 138 1 n SER . 138 A 138 +A 139 1 n ASP . 139 A 139 +A 140 1 n HIS . 140 A 140 +A 141 1 n LEU . 141 A 141 +A 142 1 n ARG . 142 A 142 +A 143 1 n ASP . 143 A 143 +A 144 1 n VAL . 144 A 144 +A 145 1 n PHE . 145 A 145 +A 146 1 n GLY . 146 A 146 +A 147 1 n LYS . 147 A 147 +A 148 1 n ALA . 148 A 148 +A 149 1 n MET . 149 A 149 +A 150 1 n GLY . 150 A 150 +A 151 1 n LEU . 151 A 151 +A 152 1 n THR . 152 A 152 +A 153 1 n ASP . 153 A 153 +A 154 1 n GLN . 154 A 154 +A 155 1 n ASP . 155 A 155 +A 156 1 n ILE . 156 A 156 +A 157 1 n VAL . 157 A 157 +A 158 1 n ALA . 158 A 158 +A 159 1 n LEU . 159 A 159 +A 160 1 n SER . 160 A 160 +A 161 1 n GLY . 161 A 161 +A 162 1 n GLY . 162 A 162 +A 163 1 n HIS . 163 A 163 +A 164 1 n THR . 164 A 164 +A 165 1 n ILE . 165 A 165 +A 166 1 n GLY . 166 A 166 +A 167 1 n ALA . 167 A 167 +A 168 1 n ALA . 168 A 168 +A 169 1 n HIS . 169 A 169 +A 170 1 n LYS . 170 A 170 +A 171 1 n GLU . 171 A 171 +A 172 1 n ARG . 172 A 172 +A 173 1 n SER . 173 A 173 +A 174 1 n GLY . 174 A 174 +A 175 1 n PHE . 175 A 175 +A 176 1 n GLU . 176 A 176 +A 177 1 n GLY . 177 A 177 +A 178 1 n PRO . 178 A 178 +A 179 1 n TRP . 179 A 179 +A 180 1 n THR . 180 A 180 +A 181 1 n SER . 181 A 181 +A 182 1 n ASN . 182 A 182 +A 183 1 n PRO . 183 A 183 +A 184 1 n LEU . 184 A 184 +A 185 1 n ILE . 185 A 185 +A 186 1 n PHE . 186 A 186 +A 187 1 n ASP . 187 A 187 +A 188 1 n ASN . 188 A 188 +A 189 1 n SER . 189 A 189 +A 190 1 n TYR . 190 A 190 +A 191 1 n PHE . 191 A 191 +A 192 1 n THR . 192 A 192 +A 193 1 n GLU . 193 A 193 +A 194 1 n LEU . 194 A 194 +A 195 1 n LEU . 195 A 195 +A 196 1 n SER . 196 A 196 +A 197 1 n GLY . 197 A 197 +A 198 1 n GLU . 198 A 198 +A 199 1 n LYS . 199 A 199 +A 200 1 n GLU . 200 A 200 +A 201 1 n GLY . 201 A 201 +A 202 1 n LEU . 202 A 202 +A 203 1 n LEU . 203 A 203 +A 204 1 n GLN . 204 A 204 +A 205 1 n LEU . 205 A 205 +A 206 1 n PRO . 206 A 206 +A 207 1 n SER . 207 A 207 +A 208 1 n ASP . 208 A 208 +A 209 1 n LYS . 209 A 209 +A 210 1 n ALA . 210 A 210 +A 211 1 n LEU . 211 A 211 +A 212 1 n LEU . 212 A 212 +A 213 1 n SER . 213 A 213 +A 214 1 n ASP . 214 A 214 +A 215 1 n PRO . 215 A 215 +A 216 1 n VAL . 216 A 216 +A 217 1 n PHE . 217 A 217 +A 218 1 n ARG . 218 A 218 +A 219 1 n PRO . 219 A 219 +A 220 1 n LEU . 220 A 220 +A 221 1 n VAL . 221 A 221 +A 222 1 n ASP . 222 A 222 +A 223 1 n LYS . 223 A 223 +A 224 1 n TYR . 224 A 224 +A 225 1 n ALA . 225 A 225 +A 226 1 n ALA . 226 A 226 +A 227 1 n ASP . 227 A 227 +A 228 1 n GLU . 228 A 228 +A 229 1 n ASP . 229 A 229 +A 230 1 n ALA . 230 A 230 +A 231 1 n PHE . 231 A 231 +A 232 1 n PHE . 232 A 232 +A 233 1 n ALA . 233 A 233 +A 234 1 n ASP . 234 A 234 +A 235 1 n TYR . 235 A 235 +A 236 1 n ALA . 236 A 236 +A 237 1 n GLU . 237 A 237 +A 238 1 n ALA . 238 A 238 +A 239 1 n HIS . 239 A 239 +A 240 1 n GLN . 240 A 240 +A 241 1 n LYS . 241 A 241 +A 242 1 n LEU . 242 A 242 +A 243 1 n SER . 243 A 243 +A 244 1 n GLU . 244 A 244 +A 245 1 n LEU . 245 A 245 +A 246 1 n GLY . 246 A 246 +A 247 1 n PHE . 247 A 247 +A 248 1 n ALA . 248 A 248 +A 249 1 n ASP . 249 A 249 +A 250 1 n ALA . 250 A 250 +# +_software.classification other +_software.date ? +_software.description "Structure prediction" +_software.name AlphaFold +_software.pdbx_ordinal 1 +_software.type package +_software.version "AlphaFold-beta-20231127 (7a14c934-fe78-43c1-a552-7fb305b0ebd1 @ 2024-08-24 11:46:13)" +# +_struct_asym.entity_id 1 +_struct_asym.id A +# +loop_ +_atom_site.group_PDB +_atom_site.id +_atom_site.type_symbol +_atom_site.label_atom_id +_atom_site.label_alt_id +_atom_site.label_comp_id +_atom_site.label_asym_id +_atom_site.label_entity_id +_atom_site.label_seq_id +_atom_site.pdbx_PDB_ins_code +_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.pdbx_PDB_model_num +ATOM 1 N N . MET A 1 1 ? -21.252 -0.742 -3.457 1.00 55.28 1 A 1 +ATOM 2 C CA . MET A 1 1 ? -21.795 -2.070 -3.825 1.00 62.36 1 A 1 +ATOM 3 C C . MET A 1 1 ? -21.536 -3.019 -2.663 1.00 66.82 1 A 1 +ATOM 4 O O . MET A 1 1 ? -20.525 -2.841 -1.993 1.00 61.73 1 A 1 +ATOM 5 C CB . MET A 1 1 ? -21.157 -2.603 -5.117 1.00 59.39 1 A 1 +ATOM 6 C CG . MET A 1 1 ? -21.620 -1.805 -6.341 1.00 55.65 1 A 1 +ATOM 7 S SD . MET A 1 1 ? -20.885 -2.396 -7.884 1.00 52.74 1 A 1 +ATOM 8 C CE . MET A 1 1 ? -21.223 -1.007 -8.976 1.00 47.24 1 A 1 +ATOM 9 N N . GLY A 1 2 ? -22.472 -3.933 -2.354 1.00 81.66 2 A 1 +ATOM 10 C CA . GLY A 1 2 ? -22.303 -4.879 -1.252 1.00 87.39 2 A 1 +ATOM 11 C C . GLY A 1 2 ? -21.216 -5.906 -1.581 1.00 91.29 2 A 1 +ATOM 12 O O . GLY A 1 2 ? -21.140 -6.351 -2.721 1.00 88.02 2 A 1 +ATOM 13 N N . LYS A 1 3 ? -20.397 -6.268 -0.589 1.00 96.26 3 A 1 +ATOM 14 C CA . LYS A 1 3 ? -19.394 -7.334 -0.699 1.00 97.05 3 A 1 +ATOM 15 C C . LYS A 1 3 ? -20.029 -8.673 -0.323 1.00 97.40 3 A 1 +ATOM 16 O O . LYS A 1 3 ? -20.802 -8.734 0.627 1.00 96.87 3 A 1 +ATOM 17 C CB . LYS A 1 3 ? -18.195 -7.020 0.203 1.00 97.05 3 A 1 +ATOM 18 C CG . LYS A 1 3 ? -17.371 -5.796 -0.236 1.00 96.52 3 A 1 +ATOM 19 C CD . LYS A 1 3 ? -16.568 -6.073 -1.503 1.00 95.55 3 A 1 +ATOM 20 C CE . LYS A 1 3 ? -15.595 -4.941 -1.782 1.00 93.99 3 A 1 +ATOM 21 N NZ . LYS A 1 3 ? -14.515 -5.391 -2.713 1.00 93.20 3 A 1 +ATOM 22 N N . SER A 1 4 ? -19.690 -9.730 -1.060 1.00 97.50 4 A 1 +ATOM 23 C CA . SER A 1 4 ? -20.056 -11.116 -0.757 1.00 97.53 4 A 1 +ATOM 24 C C . SER A 1 4 ? -18.776 -11.918 -0.540 1.00 97.95 4 A 1 +ATOM 25 O O . SER A 1 4 ? -18.146 -12.377 -1.493 1.00 97.90 4 A 1 +ATOM 26 C CB . SER A 1 4 ? -20.901 -11.694 -1.894 1.00 97.07 4 A 1 +ATOM 27 O OG . SER A 1 4 ? -21.329 -12.998 -1.559 1.00 89.64 4 A 1 +ATOM 28 N N . TYR A 1 5 ? -18.345 -12.024 0.719 1.00 98.06 5 A 1 +ATOM 29 C CA . TYR A 1 5 ? -17.072 -12.669 1.037 1.00 98.23 5 A 1 +ATOM 30 C C . TYR A 1 5 ? -17.168 -14.195 0.871 1.00 98.32 5 A 1 +ATOM 31 O O . TYR A 1 5 ? -18.152 -14.797 1.318 1.00 98.22 5 A 1 +ATOM 32 C CB . TYR A 1 5 ? -16.622 -12.288 2.449 1.00 98.24 5 A 1 +ATOM 33 C CG . TYR A 1 5 ? -16.472 -10.787 2.648 1.00 98.34 5 A 1 +ATOM 34 C CD1 . TYR A 1 5 ? -15.409 -10.097 2.035 1.00 98.20 5 A 1 +ATOM 35 C CD2 . TYR A 1 5 ? -17.411 -10.078 3.419 1.00 98.16 5 A 1 +ATOM 36 C CE1 . TYR A 1 5 ? -15.276 -8.698 2.205 1.00 98.15 5 A 1 +ATOM 37 C CE2 . TYR A 1 5 ? -17.285 -8.690 3.588 1.00 98.13 5 A 1 +ATOM 38 C CZ . TYR A 1 5 ? -16.215 -7.999 2.985 1.00 98.24 5 A 1 +ATOM 39 O OH . TYR A 1 5 ? -16.095 -6.652 3.161 1.00 97.97 5 A 1 +ATOM 40 N N . PRO A 1 6 ? -16.159 -14.851 0.277 1.00 98.34 6 A 1 +ATOM 41 C CA . PRO A 1 6 ? -16.167 -16.291 0.100 1.00 98.50 6 A 1 +ATOM 42 C C . PRO A 1 6 ? -16.054 -17.017 1.449 1.00 98.64 6 A 1 +ATOM 43 O O . PRO A 1 6 ? -15.397 -16.552 2.390 1.00 98.65 6 A 1 +ATOM 44 C CB . PRO A 1 6 ? -14.989 -16.603 -0.821 1.00 98.44 6 A 1 +ATOM 45 C CG . PRO A 1 6 ? -14.006 -15.482 -0.512 1.00 97.98 6 A 1 +ATOM 46 C CD . PRO A 1 6 ? -14.914 -14.287 -0.241 1.00 98.60 6 A 1 +ATOM 47 N N . THR A 1 7 ? -16.650 -18.195 1.539 1.00 98.58 7 A 1 +ATOM 48 C CA . THR A 1 7 ? -16.427 -19.093 2.673 1.00 98.60 7 A 1 +ATOM 49 C C . THR A 1 7 ? -15.032 -19.711 2.572 1.00 98.74 7 A 1 +ATOM 50 O O . THR A 1 7 ? -14.692 -20.302 1.552 1.00 98.70 7 A 1 +ATOM 51 C CB . THR A 1 7 ? -17.491 -20.197 2.728 1.00 98.42 7 A 1 +ATOM 52 O OG1 . THR A 1 7 ? -18.773 -19.616 2.776 1.00 95.00 7 A 1 +ATOM 53 C CG2 . THR A 1 7 ? -17.364 -21.083 3.965 1.00 95.15 7 A 1 +ATOM 54 N N . VAL A 1 8 ? -14.255 -19.629 3.654 1.00 98.76 8 A 1 +ATOM 55 C CA . VAL A 1 8 ? -12.992 -20.350 3.807 1.00 98.84 8 A 1 +ATOM 56 C C . VAL A 1 8 ? -13.119 -21.404 4.913 1.00 98.86 8 A 1 +ATOM 57 O O . VAL A 1 8 ? -14.015 -21.324 5.757 1.00 98.83 8 A 1 +ATOM 58 C CB . VAL A 1 8 ? -11.794 -19.406 4.049 1.00 98.80 8 A 1 +ATOM 59 C CG1 . VAL A 1 8 ? -11.621 -18.408 2.899 1.00 98.61 8 A 1 +ATOM 60 C CG2 . VAL A 1 8 ? -11.914 -18.631 5.361 1.00 98.49 8 A 1 +ATOM 61 N N . SER A 1 9 ? -12.250 -22.425 4.912 1.00 98.89 9 A 1 +ATOM 62 C CA . SER A 1 9 ? -12.290 -23.485 5.920 1.00 98.82 9 A 1 +ATOM 63 C C . SER A 1 9 ? -11.950 -22.973 7.326 1.00 98.94 9 A 1 +ATOM 64 O O . SER A 1 9 ? -11.306 -21.934 7.496 1.00 98.87 9 A 1 +ATOM 65 C CB . SER A 1 9 ? -11.366 -24.647 5.521 1.00 98.81 9 A 1 +ATOM 66 O OG . SER A 1 9 ? -10.004 -24.271 5.618 1.00 98.65 9 A 1 +ATOM 67 N N . ALA A 1 10 ? -12.335 -23.731 8.366 1.00 98.75 10 A 1 +ATOM 68 C CA . ALA A 1 10 ? -11.953 -23.423 9.738 1.00 98.86 10 A 1 +ATOM 69 C C . ALA A 1 10 ? -10.422 -23.381 9.930 1.00 98.86 10 A 1 +ATOM 70 O O . ALA A 1 10 ? -9.917 -22.500 10.605 1.00 98.83 10 A 1 +ATOM 71 C CB . ALA A 1 10 ? -12.614 -24.453 10.664 1.00 98.75 10 A 1 +ATOM 72 N N . ASP A 1 11 ? -9.690 -24.280 9.266 1.00 98.64 11 A 1 +ATOM 73 C CA . ASP A 1 11 ? -8.225 -24.304 9.291 1.00 98.73 11 A 1 +ATOM 74 C C . ASP A 1 11 ? -7.620 -23.038 8.658 1.00 98.85 11 A 1 +ATOM 75 O O . ASP A 1 11 ? -6.612 -22.522 9.141 1.00 98.75 11 A 1 +ATOM 76 C CB . ASP A 1 11 ? -7.701 -25.548 8.546 1.00 98.37 11 A 1 +ATOM 77 C CG . ASP A 1 11 ? -8.077 -26.878 9.198 1.00 93.92 11 A 1 +ATOM 78 O OD1 . ASP A 1 11 ? -8.414 -26.885 10.402 1.00 90.99 11 A 1 +ATOM 79 O OD2 . ASP A 1 11 ? -8.040 -27.894 8.464 1.00 90.74 11 A 1 +ATOM 80 N N . TYR A 1 12 ? -8.243 -22.520 7.597 1.00 98.95 12 A 1 +ATOM 81 C CA . TYR A 1 12 ? -7.810 -21.261 6.979 1.00 98.93 12 A 1 +ATOM 82 C C . TYR A 1 12 ? -8.016 -20.079 7.934 1.00 98.92 12 A 1 +ATOM 83 O O . TYR A 1 12 ? -7.101 -19.273 8.117 1.00 98.94 12 A 1 +ATOM 84 C CB . TYR A 1 12 ? -8.559 -21.041 5.654 1.00 98.94 12 A 1 +ATOM 85 C CG . TYR A 1 12 ? -7.897 -20.019 4.742 1.00 98.97 12 A 1 +ATOM 86 C CD1 . TYR A 1 12 ? -7.998 -18.639 5.005 1.00 98.94 12 A 1 +ATOM 87 C CD2 . TYR A 1 12 ? -7.173 -20.458 3.617 1.00 98.92 12 A 1 +ATOM 88 C CE1 . TYR A 1 12 ? -7.365 -17.706 4.153 1.00 98.92 12 A 1 +ATOM 89 C CE2 . TYR A 1 12 ? -6.552 -19.539 2.762 1.00 98.91 12 A 1 +ATOM 90 C CZ . TYR A 1 12 ? -6.643 -18.161 3.033 1.00 98.96 12 A 1 +ATOM 91 O OH . TYR A 1 12 ? -6.023 -17.264 2.204 1.00 98.92 12 A 1 +ATOM 92 N N . GLN A 1 13 ? -9.182 -20.009 8.605 1.00 98.97 13 A 1 +ATOM 93 C CA . GLN A 1 13 ? -9.470 -18.975 9.603 1.00 98.95 13 A 1 +ATOM 94 C C . GLN A 1 13 ? -8.495 -19.034 10.794 1.00 98.91 13 A 1 +ATOM 95 O O . GLN A 1 13 ? -7.957 -18.005 11.209 1.00 98.92 13 A 1 +ATOM 96 C CB . GLN A 1 13 ? -10.915 -19.130 10.111 1.00 98.78 13 A 1 +ATOM 97 C CG . GLN A 1 13 ? -11.987 -18.778 9.061 1.00 90.85 13 A 1 +ATOM 98 C CD . GLN A 1 13 ? -12.109 -17.289 8.765 1.00 92.21 13 A 1 +ATOM 99 O OE1 . GLN A 1 13 ? -11.337 -16.449 9.182 1.00 83.57 13 A 1 +ATOM 100 N NE2 . GLN A 1 13 ? -13.120 -16.896 8.021 1.00 81.76 13 A 1 +ATOM 101 N N . ASP A 1 14 ? -8.206 -20.226 11.307 1.00 98.89 14 A 1 +ATOM 102 C CA . ASP A 1 14 ? -7.219 -20.416 12.380 1.00 98.82 14 A 1 +ATOM 103 C C . ASP A 1 14 ? -5.808 -19.992 11.940 1.00 98.87 14 A 1 +ATOM 104 O O . ASP A 1 14 ? -5.081 -19.330 12.689 1.00 98.86 14 A 1 +ATOM 105 C CB . ASP A 1 14 ? -7.279 -21.883 12.827 1.00 98.76 14 A 1 +ATOM 106 C CG . ASP A 1 14 ? -6.197 -22.211 13.856 1.00 91.85 14 A 1 +ATOM 107 O OD1 . ASP A 1 14 ? -6.219 -21.714 15.011 1.00 88.71 14 A 1 +ATOM 108 O OD2 . ASP A 1 14 ? -5.283 -23.000 13.524 1.00 87.85 14 A 1 +ATOM 109 N N . ALA A 1 15 ? -5.423 -20.296 10.697 1.00 98.84 15 A 1 +ATOM 110 C CA . ALA A 1 15 ? -4.167 -19.835 10.117 1.00 98.82 15 A 1 +ATOM 111 C C . ALA A 1 15 ? -4.105 -18.304 10.004 1.00 98.93 15 A 1 +ATOM 112 O O . ALA A 1 15 ? -3.065 -17.726 10.310 1.00 98.93 15 A 1 +ATOM 113 C CB . ALA A 1 15 ? -3.951 -20.527 8.773 1.00 98.90 15 A 1 +ATOM 114 N N . VAL A 1 16 ? -5.203 -17.622 9.626 1.00 98.97 16 A 1 +ATOM 115 C CA . VAL A 1 16 ? -5.280 -16.149 9.604 1.00 98.99 16 A 1 +ATOM 116 C C . VAL A 1 16 ? -5.012 -15.562 10.990 1.00 98.99 16 A 1 +ATOM 117 O O . VAL A 1 16 ? -4.162 -14.688 11.133 1.00 98.93 16 A 1 +ATOM 118 C CB . VAL A 1 16 ? -6.642 -15.657 9.053 1.00 98.93 16 A 1 +ATOM 119 C CG1 . VAL A 1 16 ? -6.869 -14.153 9.260 1.00 98.79 16 A 1 +ATOM 120 C CG2 . VAL A 1 16 ? -6.747 -15.925 7.547 1.00 98.84 16 A 1 +ATOM 121 N N . GLU A 1 17 ? -5.677 -16.072 12.031 1.00 98.96 17 A 1 +ATOM 122 C CA . GLU A 1 17 ? -5.501 -15.566 13.399 1.00 98.80 17 A 1 +ATOM 123 C C . GLU A 1 17 ? -4.076 -15.799 13.933 1.00 98.83 17 A 1 +ATOM 124 O O . GLU A 1 17 ? -3.452 -14.901 14.511 1.00 98.84 17 A 1 +ATOM 125 C CB . GLU A 1 17 ? -6.552 -16.207 14.325 1.00 98.80 17 A 1 +ATOM 126 C CG . GLU A 1 17 ? -7.981 -15.698 14.045 1.00 95.31 17 A 1 +ATOM 127 C CD . GLU A 1 17 ? -8.078 -14.156 14.125 1.00 88.48 17 A 1 +ATOM 128 O OE1 . GLU A 1 17 ? -8.618 -13.546 13.189 1.00 78.30 17 A 1 +ATOM 129 O OE2 . GLU A 1 17 ? -7.533 -13.584 15.107 1.00 83.83 17 A 1 +ATOM 130 N N . LYS A 1 18 ? -3.513 -16.995 13.683 1.00 98.82 18 A 1 +ATOM 131 C CA . LYS A 1 18 ? -2.128 -17.312 14.044 1.00 98.84 18 A 1 +ATOM 132 C C . LYS A 1 18 ? -1.124 -16.448 13.277 1.00 98.89 18 A 1 +ATOM 133 O O . LYS A 1 18 ? -0.199 -15.901 13.894 1.00 98.89 18 A 1 +ATOM 134 C CB . LYS A 1 18 ? -1.863 -18.804 13.808 1.00 98.86 18 A 1 +ATOM 135 C CG . LYS A 1 18 ? -2.549 -19.676 14.877 1.00 97.51 18 A 1 +ATOM 136 C CD . LYS A 1 18 ? -2.435 -21.161 14.507 1.00 96.24 18 A 1 +ATOM 137 C CE . LYS A 1 18 ? -3.106 -21.991 15.595 1.00 93.04 18 A 1 +ATOM 138 N NZ . LYS A 1 18 ? -3.331 -23.390 15.159 1.00 86.08 18 A 1 +ATOM 139 N N . ALA A 1 19 ? -1.314 -16.272 11.968 1.00 98.83 19 A 1 +ATOM 140 C CA . ALA A 1 19 ? -0.469 -15.423 11.132 1.00 98.83 19 A 1 +ATOM 141 C C . ALA A 1 19 ? -0.529 -13.961 11.586 1.00 98.91 19 A 1 +ATOM 142 O O . ALA A 1 19 ? 0.512 -13.329 11.731 1.00 98.93 19 A 1 +ATOM 143 C CB . ALA A 1 19 ? -0.882 -15.572 9.667 1.00 98.89 19 A 1 +ATOM 144 N N . LYS A 1 20 ? -1.723 -13.441 11.916 1.00 98.91 20 A 1 +ATOM 145 C CA . LYS A 1 20 ? -1.914 -12.084 12.433 1.00 98.97 20 A 1 +ATOM 146 C C . LYS A 1 20 ? -1.085 -11.849 13.700 1.00 98.94 20 A 1 +ATOM 147 O O . LYS A 1 20 ? -0.374 -10.853 13.808 1.00 98.90 20 A 1 +ATOM 148 C CB . LYS A 1 20 ? -3.417 -11.837 12.658 1.00 98.89 20 A 1 +ATOM 149 C CG . LYS A 1 20 ? -3.718 -10.358 12.960 1.00 98.25 20 A 1 +ATOM 150 C CD . LYS A 1 20 ? -5.234 -10.097 13.000 1.00 97.37 20 A 1 +ATOM 151 C CE . LYS A 1 20 ? -5.495 -8.600 13.205 1.00 92.79 20 A 1 +ATOM 152 N NZ . LYS A 1 20 ? -6.938 -8.267 13.120 1.00 86.77 20 A 1 +ATOM 153 N N . LYS A 1 21 ? -1.109 -12.805 14.655 1.00 98.90 21 A 1 +ATOM 154 C CA . LYS A 1 21 ? -0.296 -12.735 15.883 1.00 98.88 21 A 1 +ATOM 155 C C . LYS A 1 21 ? 1.207 -12.751 15.585 1.00 98.97 21 A 1 +ATOM 156 O O . LYS A 1 21 ? 1.956 -11.969 16.177 1.00 98.86 21 A 1 +ATOM 157 C CB . LYS A 1 21 ? -0.707 -13.872 16.825 1.00 98.66 21 A 1 +ATOM 158 C CG . LYS A 1 21 ? 0.032 -13.791 18.170 1.00 85.04 21 A 1 +ATOM 159 C CD . LYS A 1 21 ? -0.420 -14.922 19.109 1.00 85.86 21 A 1 +ATOM 160 C CE . LYS A 1 21 ? 0.349 -14.855 20.427 1.00 73.86 21 A 1 +ATOM 161 N NZ . LYS A 1 21 ? -0.061 -15.935 21.355 1.00 67.44 21 A 1 +ATOM 162 N N . LYS A 1 22 ? 1.661 -13.625 14.689 1.00 98.83 22 A 1 +ATOM 163 C CA . LYS A 1 22 ? 3.074 -13.720 14.292 1.00 98.80 22 A 1 +ATOM 164 C C . LYS A 1 22 ? 3.553 -12.463 13.565 1.00 98.91 22 A 1 +ATOM 165 O O . LYS A 1 22 ? 4.625 -11.949 13.892 1.00 98.89 22 A 1 +ATOM 166 C CB . LYS A 1 22 ? 3.263 -14.972 13.421 1.00 98.79 22 A 1 +ATOM 167 C CG . LYS A 1 22 ? 3.262 -16.293 14.209 1.00 96.85 22 A 1 +ATOM 168 C CD . LYS A 1 22 ? 4.642 -16.611 14.780 1.00 91.71 22 A 1 +ATOM 169 C CE . LYS A 1 22 ? 4.702 -18.054 15.290 1.00 87.99 22 A 1 +ATOM 170 N NZ . LYS A 1 22 ? 6.013 -18.702 14.949 1.00 79.84 22 A 1 +ATOM 171 N N . LEU A 1 23 ? 2.739 -11.918 12.655 1.00 98.88 23 A 1 +ATOM 172 C CA . LEU A 1 23 ? 3.005 -10.673 11.936 1.00 98.87 23 A 1 +ATOM 173 C C . LEU A 1 23 ? 3.158 -9.490 12.890 1.00 98.90 23 A 1 +ATOM 174 O O . LEU A 1 23 ? 4.090 -8.717 12.720 1.00 98.92 23 A 1 +ATOM 175 C CB . LEU A 1 23 ? 1.885 -10.409 10.914 1.00 98.91 23 A 1 +ATOM 176 C CG . LEU A 1 23 ? 1.997 -11.232 9.618 1.00 98.84 23 A 1 +ATOM 177 C CD1 . LEU A 1 23 ? 0.689 -11.142 8.834 1.00 98.78 23 A 1 +ATOM 178 C CD2 . LEU A 1 23 ? 3.124 -10.708 8.725 1.00 98.79 23 A 1 +ATOM 179 N N . ARG A 1 24 ? 2.315 -9.372 13.932 1.00 98.97 24 A 1 +ATOM 180 C CA . ARG A 1 24 ? 2.461 -8.316 14.951 1.00 98.98 24 A 1 +ATOM 181 C C . ARG A 1 24 ? 3.858 -8.325 15.570 1.00 98.97 24 A 1 +ATOM 182 O O . ARG A 1 24 ? 4.544 -7.308 15.563 1.00 98.89 24 A 1 +ATOM 183 C CB . ARG A 1 24 ? 1.414 -8.460 16.068 1.00 98.87 24 A 1 +ATOM 184 C CG . ARG A 1 24 ? 0.003 -8.041 15.642 1.00 98.02 24 A 1 +ATOM 185 C CD . ARG A 1 24 ? -0.965 -8.340 16.793 1.00 97.48 24 A 1 +ATOM 186 N NE . ARG A 1 24 ? -2.354 -8.016 16.432 1.00 95.02 24 A 1 +ATOM 187 C CZ . ARG A 1 24 ? -3.420 -8.783 16.562 1.00 93.70 24 A 1 +ATOM 188 N NH1 . ARG A 1 24 ? -3.374 -10.008 17.004 1.00 88.57 24 A 1 +ATOM 189 N NH2 . ARG A 1 24 ? -4.594 -8.316 16.254 1.00 88.59 24 A 1 +ATOM 190 N N . GLY A 1 25 ? 4.287 -9.477 16.079 1.00 98.86 25 A 1 +ATOM 191 C CA . GLY A 1 25 ? 5.603 -9.617 16.705 1.00 98.84 25 A 1 +ATOM 192 C C . GLY A 1 25 ? 6.745 -9.307 15.727 1.00 98.81 25 A 1 +ATOM 193 O O . GLY A 1 25 ? 7.617 -8.503 16.030 1.00 98.74 25 A 1 +ATOM 194 N N . PHE A 1 26 ? 6.682 -9.898 14.526 1.00 98.82 26 A 1 +ATOM 195 C CA . PHE A 1 26 ? 7.703 -9.734 13.498 1.00 98.83 26 A 1 +ATOM 196 C C . PHE A 1 26 ? 7.826 -8.285 13.005 1.00 98.86 26 A 1 +ATOM 197 O O . PHE A 1 26 ? 8.926 -7.735 12.953 1.00 98.81 26 A 1 +ATOM 198 C CB . PHE A 1 26 ? 7.360 -10.673 12.331 1.00 98.76 26 A 1 +ATOM 199 C CG . PHE A 1 26 ? 8.349 -10.585 11.192 1.00 98.68 26 A 1 +ATOM 200 C CD1 . PHE A 1 26 ? 8.098 -9.736 10.094 1.00 98.41 26 A 1 +ATOM 201 C CD2 . PHE A 1 26 ? 9.537 -11.331 11.232 1.00 98.48 26 A 1 +ATOM 202 C CE1 . PHE A 1 26 ? 9.033 -9.635 9.053 1.00 98.08 26 A 1 +ATOM 203 C CE2 . PHE A 1 26 ? 10.472 -11.234 10.189 1.00 98.05 26 A 1 +ATOM 204 C CZ . PHE A 1 26 ? 10.215 -10.384 9.108 1.00 97.95 26 A 1 +ATOM 205 N N . ILE A 1 27 ? 6.712 -7.642 12.657 1.00 98.84 27 A 1 +ATOM 206 C CA . ILE A 1 27 ? 6.700 -6.278 12.119 1.00 98.81 27 A 1 +ATOM 207 C C . ILE A 1 27 ? 7.179 -5.270 13.161 1.00 98.80 27 A 1 +ATOM 208 O O . ILE A 1 27 ? 7.956 -4.379 12.827 1.00 98.82 27 A 1 +ATOM 209 C CB . ILE A 1 27 ? 5.300 -5.950 11.538 1.00 98.91 27 A 1 +ATOM 210 C CG1 . ILE A 1 27 ? 5.035 -6.800 10.277 1.00 98.81 27 A 1 +ATOM 211 C CG2 . ILE A 1 27 ? 5.186 -4.454 11.192 1.00 98.87 27 A 1 +ATOM 212 C CD1 . ILE A 1 27 ? 3.624 -6.665 9.702 1.00 98.74 27 A 1 +ATOM 213 N N . ALA A 1 28 ? 6.777 -5.449 14.431 1.00 98.73 28 A 1 +ATOM 214 C CA . ALA A 1 28 ? 7.247 -4.612 15.530 1.00 98.78 28 A 1 +ATOM 215 C C . ALA A 1 28 ? 8.752 -4.792 15.779 1.00 98.69 28 A 1 +ATOM 216 O O . ALA A 1 28 ? 9.489 -3.807 15.827 1.00 98.52 28 A 1 +ATOM 217 C CB . ALA A 1 28 ? 6.413 -4.937 16.780 1.00 98.70 28 A 1 +ATOM 218 N N . GLU A 1 29 ? 9.248 -6.042 15.863 1.00 98.62 29 A 1 +ATOM 219 C CA . GLU A 1 29 ? 10.674 -6.344 16.080 1.00 98.52 29 A 1 +ATOM 220 C C . GLU A 1 29 ? 11.552 -5.789 14.948 1.00 98.55 29 A 1 +ATOM 221 O O . GLU A 1 29 ? 12.574 -5.152 15.194 1.00 98.24 29 A 1 +ATOM 222 C CB . GLU A 1 29 ? 10.862 -7.869 16.181 1.00 98.31 29 A 1 +ATOM 223 C CG . GLU A 1 29 ? 12.295 -8.275 16.570 1.00 94.12 29 A 1 +ATOM 224 C CD . GLU A 1 29 ? 12.607 -9.727 16.180 1.00 89.77 29 A 1 +ATOM 225 O OE1 . GLU A 1 29 ? 13.661 -9.927 15.499 1.00 80.82 29 A 1 +ATOM 226 O OE2 . GLU A 1 29 ? 11.786 -10.609 16.462 1.00 84.38 29 A 1 +ATOM 227 N N . LYS A 1 30 ? 11.134 -6.008 13.695 1.00 98.65 30 A 1 +ATOM 228 C CA . LYS A 1 30 ? 11.880 -5.564 12.514 1.00 98.69 30 A 1 +ATOM 229 C C . LYS A 1 30 ? 11.687 -4.085 12.179 1.00 98.60 30 A 1 +ATOM 230 O O . LYS A 1 30 ? 12.349 -3.603 11.263 1.00 98.42 30 A 1 +ATOM 231 C CB . LYS A 1 30 ? 11.545 -6.452 11.306 1.00 98.58 30 A 1 +ATOM 232 C CG . LYS A 1 30 ? 11.915 -7.940 11.473 1.00 97.72 30 A 1 +ATOM 233 C CD . LYS A 1 30 ? 13.368 -8.174 11.863 1.00 95.85 30 A 1 +ATOM 234 C CE . LYS A 1 30 ? 13.643 -9.673 11.927 1.00 92.68 30 A 1 +ATOM 235 N NZ . LYS A 1 30 ? 14.727 -9.997 12.886 1.00 85.60 30 A 1 +ATOM 236 N N . ARG A 1 31 ? 10.793 -3.374 12.892 1.00 98.37 31 A 1 +ATOM 237 C CA . ARG A 1 31 ? 10.475 -1.952 12.659 1.00 98.39 31 A 1 +ATOM 238 C C . ARG A 1 31 ? 10.121 -1.657 11.199 1.00 98.47 31 A 1 +ATOM 239 O O . ARG A 1 31 ? 10.467 -0.613 10.660 1.00 98.23 31 A 1 +ATOM 240 C CB . ARG A 1 31 ? 11.617 -1.065 13.192 1.00 98.22 31 A 1 +ATOM 241 C CG . ARG A 1 31 ? 11.935 -1.306 14.673 1.00 97.36 31 A 1 +ATOM 242 C CD . ARG A 1 31 ? 13.182 -0.519 15.124 1.00 95.89 31 A 1 +ATOM 243 N NE . ARG A 1 31 ? 13.009 0.934 15.020 1.00 89.68 31 A 1 +ATOM 244 C CZ . ARG A 1 31 ? 12.459 1.733 15.920 1.00 84.42 31 A 1 +ATOM 245 N NH1 . ARG A 1 31 ? 11.961 1.285 17.039 1.00 77.87 31 A 1 +ATOM 246 N NH2 . ARG A 1 31 ? 12.401 3.024 15.725 1.00 77.33 31 A 1 +ATOM 247 N N . CYS A 1 32 ? 9.458 -2.619 10.542 1.00 98.21 32 A 1 +ATOM 248 C CA . CYS A 1 32 ? 9.212 -2.576 9.102 1.00 98.32 32 A 1 +ATOM 249 C C . CYS A 1 32 ? 7.756 -2.256 8.725 1.00 98.59 32 A 1 +ATOM 250 O O . CYS A 1 32 ? 7.403 -2.391 7.558 1.00 98.63 32 A 1 +ATOM 251 C CB . CYS A 1 32 ? 9.737 -3.863 8.451 1.00 98.51 32 A 1 +ATOM 252 S SG . CYS A 1 32 ? 8.809 -5.312 9.021 1.00 98.62 32 A 1 +ATOM 253 N N . ALA A 1 33 ? 6.921 -1.785 9.672 1.00 98.54 33 A 1 +ATOM 254 C CA . ALA A 1 33 ? 5.515 -1.456 9.434 1.00 98.60 33 A 1 +ATOM 255 C C . ALA A 1 33 ? 5.290 -0.551 8.195 1.00 98.70 33 A 1 +ATOM 256 O O . ALA A 1 33 ? 4.503 -0.945 7.341 1.00 98.78 33 A 1 +ATOM 257 C CB . ALA A 1 33 ? 4.901 -0.866 10.707 1.00 98.75 33 A 1 +ATOM 258 N N . PRO A 1 34 ? 6.031 0.558 7.997 1.00 98.46 34 A 1 +ATOM 259 C CA . PRO A 1 34 ? 5.831 1.404 6.820 1.00 98.48 34 A 1 +ATOM 260 C C . PRO A 1 34 ? 6.087 0.672 5.501 1.00 98.46 34 A 1 +ATOM 261 O O . PRO A 1 34 ? 5.376 0.856 4.519 1.00 98.47 34 A 1 +ATOM 262 C CB . PRO A 1 34 ? 6.797 2.582 6.995 1.00 98.50 34 A 1 +ATOM 263 C CG . PRO A 1 34 ? 7.054 2.631 8.496 1.00 98.04 34 A 1 +ATOM 264 C CD . PRO A 1 34 ? 6.999 1.173 8.897 1.00 98.66 34 A 1 +ATOM 265 N N . LEU A 1 35 ? 7.105 -0.207 5.479 1.00 97.90 35 A 1 +ATOM 266 C CA . LEU A 1 35 ? 7.427 -0.993 4.287 1.00 97.70 35 A 1 +ATOM 267 C C . LEU A 1 35 ? 6.353 -2.058 4.010 1.00 98.12 35 A 1 +ATOM 268 O O . LEU A 1 35 ? 6.043 -2.311 2.848 1.00 98.24 35 A 1 +ATOM 269 C CB . LEU A 1 35 ? 8.823 -1.605 4.475 1.00 97.37 35 A 1 +ATOM 270 C CG . LEU A 1 35 ? 9.353 -2.344 3.233 1.00 96.38 35 A 1 +ATOM 271 C CD1 . LEU A 1 35 ? 9.589 -1.399 2.054 1.00 95.96 35 A 1 +ATOM 272 C CD2 . LEU A 1 35 ? 10.671 -3.030 3.573 1.00 95.85 35 A 1 +ATOM 273 N N . MET A 1 36 ? 5.768 -2.664 5.050 1.00 98.56 36 A 1 +ATOM 274 C CA . MET A 1 36 ? 4.679 -3.631 4.906 1.00 98.58 36 A 1 +ATOM 275 C C . MET A 1 36 ? 3.373 -2.977 4.474 1.00 98.68 36 A 1 +ATOM 276 O O . MET A 1 36 ? 2.670 -3.522 3.625 1.00 98.70 36 A 1 +ATOM 277 C CB . MET A 1 36 ? 4.486 -4.423 6.215 1.00 98.59 36 A 1 +ATOM 278 C CG . MET A 1 36 ? 5.733 -5.236 6.584 1.00 98.21 36 A 1 +ATOM 279 S SD . MET A 1 36 ? 6.346 -6.307 5.256 1.00 98.28 36 A 1 +ATOM 280 C CE . MET A 1 36 ? 8.096 -6.328 5.642 1.00 96.16 36 A 1 +ATOM 281 N N . LEU A 1 37 ? 3.089 -1.773 4.976 1.00 98.42 37 A 1 +ATOM 282 C CA . LEU A 1 37 ? 1.950 -0.977 4.502 1.00 98.50 37 A 1 +ATOM 283 C C . LEU A 1 37 ? 2.110 -0.623 3.021 1.00 98.52 37 A 1 +ATOM 284 O O . LEU A 1 37 ? 1.201 -0.855 2.228 1.00 98.63 37 A 1 +ATOM 285 C CB . LEU A 1 37 ? 1.804 0.278 5.382 1.00 98.71 37 A 1 +ATOM 286 C CG . LEU A 1 37 ? 0.573 1.123 5.019 1.00 98.57 37 A 1 +ATOM 287 C CD1 . LEU A 1 37 ? -0.727 0.326 5.163 1.00 98.61 37 A 1 +ATOM 288 C CD2 . LEU A 1 37 ? 0.486 2.344 5.931 1.00 98.62 37 A 1 +ATOM 289 N N . ARG A 1 38 ? 3.301 -0.163 2.621 1.00 97.99 38 A 1 +ATOM 290 C CA . ARG A 1 38 ? 3.608 0.123 1.214 1.00 97.82 38 A 1 +ATOM 291 C C . ARG A 1 38 ? 3.477 -1.121 0.328 1.00 98.07 38 A 1 +ATOM 292 O O . ARG A 1 38 ? 2.923 -1.016 -0.761 1.00 98.27 38 A 1 +ATOM 293 C CB . ARG A 1 38 ? 4.995 0.765 1.120 1.00 97.63 38 A 1 +ATOM 294 C CG . ARG A 1 38 ? 5.355 1.143 -0.330 1.00 97.06 38 A 1 +ATOM 295 C CD . ARG A 1 38 ? 6.672 1.913 -0.418 1.00 96.54 38 A 1 +ATOM 296 N NE . ARG A 1 38 ? 7.058 2.098 -1.833 1.00 95.52 38 A 1 +ATOM 297 C CZ . ARG A 1 38 ? 8.010 1.457 -2.492 1.00 95.90 38 A 1 +ATOM 298 N NH1 . ARG A 1 38 ? 8.790 0.575 -1.929 1.00 93.47 38 A 1 +ATOM 299 N NH2 . ARG A 1 38 ? 8.190 1.688 -3.751 1.00 93.24 38 A 1 +ATOM 300 N N . LEU A 1 39 ? 3.933 -2.299 0.780 1.00 98.24 39 A 1 +ATOM 301 C CA . LEU A 1 39 ? 3.767 -3.558 0.039 1.00 98.24 39 A 1 +ATOM 302 C C . LEU A 1 39 ? 2.281 -3.859 -0.221 1.00 98.38 39 A 1 +ATOM 303 O O . LEU A 1 39 ? 1.906 -4.144 -1.360 1.00 98.48 39 A 1 +ATOM 304 C CB . LEU A 1 39 ? 4.434 -4.706 0.816 1.00 98.42 39 A 1 +ATOM 305 C CG . LEU A 1 39 ? 4.290 -6.086 0.154 1.00 98.16 39 A 1 +ATOM 306 C CD1 . LEU A 1 39 ? 5.125 -6.198 -1.120 1.00 97.88 39 A 1 +ATOM 307 C CD2 . LEU A 1 39 ? 4.730 -7.182 1.119 1.00 97.94 39 A 1 +ATOM 308 N N . ALA A 1 40 ? 1.431 -3.751 0.810 1.00 98.50 40 A 1 +ATOM 309 C CA . ALA A 1 40 ? 0.001 -4.001 0.675 1.00 98.48 40 A 1 +ATOM 310 C C . ALA A 1 40 ? -0.680 -2.991 -0.260 1.00 98.57 40 A 1 +ATOM 311 O O . ALA A 1 40 ? -1.471 -3.384 -1.110 1.00 98.60 40 A 1 +ATOM 312 C CB . ALA A 1 40 ? -0.618 -3.982 2.085 1.00 98.67 40 A 1 +ATOM 313 N N . PHE A 1 41 ? -0.333 -1.700 -0.155 1.00 98.42 41 A 1 +ATOM 314 C CA . PHE A 1 41 ? -0.883 -0.636 -0.992 1.00 98.38 41 A 1 +ATOM 315 C C . PHE A 1 41 ? -0.488 -0.796 -2.462 1.00 98.21 41 A 1 +ATOM 316 O O . PHE A 1 41 ? -1.335 -0.694 -3.337 1.00 98.10 41 A 1 +ATOM 317 C CB . PHE A 1 41 ? -0.423 0.730 -0.469 1.00 97.93 41 A 1 +ATOM 318 C CG . PHE A 1 41 ? -1.268 1.333 0.639 1.00 92.36 41 A 1 +ATOM 319 C CD1 . PHE A 1 41 ? -1.876 0.543 1.633 1.00 86.37 41 A 1 +ATOM 320 C CD2 . PHE A 1 41 ? -1.467 2.728 0.650 1.00 86.60 41 A 1 +ATOM 321 C CE1 . PHE A 1 41 ? -2.684 1.138 2.622 1.00 81.05 41 A 1 +ATOM 322 C CE2 . PHE A 1 41 ? -2.271 3.327 1.639 1.00 82.11 41 A 1 +ATOM 323 C CZ . PHE A 1 41 ? -2.881 2.531 2.619 1.00 79.77 41 A 1 +ATOM 324 N N . HIS A 1 42 ? 0.781 -1.099 -2.740 1.00 98.20 42 A 1 +ATOM 325 C CA . HIS A 1 42 ? 1.254 -1.302 -4.105 1.00 98.29 42 A 1 +ATOM 326 C C . HIS A 1 42 ? 0.674 -2.576 -4.739 1.00 98.37 42 A 1 +ATOM 327 O O . HIS A 1 42 ? 0.382 -2.581 -5.926 1.00 98.12 42 A 1 +ATOM 328 C CB . HIS A 1 42 ? 2.783 -1.313 -4.128 1.00 98.25 42 A 1 +ATOM 329 C CG . HIS A 1 42 ? 3.404 0.056 -4.048 1.00 98.27 42 A 1 +ATOM 330 N ND1 . HIS A 1 42 ? 4.380 0.534 -4.897 1.00 96.35 42 A 1 +ATOM 331 C CD2 . HIS A 1 42 ? 3.125 1.070 -3.175 1.00 96.25 42 A 1 +ATOM 332 C CE1 . HIS A 1 42 ? 4.677 1.796 -4.543 1.00 95.68 42 A 1 +ATOM 333 N NE2 . HIS A 1 42 ? 3.935 2.171 -3.491 1.00 96.29 42 A 1 +ATOM 334 N N . SER A 1 43 ? 0.448 -3.622 -3.931 1.00 98.49 43 A 1 +ATOM 335 C CA . SER A 1 43 ? -0.258 -4.824 -4.373 1.00 98.30 43 A 1 +ATOM 336 C C . SER A 1 43 ? -1.700 -4.501 -4.781 1.00 98.42 43 A 1 +ATOM 337 O O . SER A 1 43 ? -2.135 -4.888 -5.855 1.00 98.27 43 A 1 +ATOM 338 C CB . SER A 1 43 ? -0.229 -5.871 -3.255 1.00 98.16 43 A 1 +ATOM 339 O OG . SER A 1 43 ? -0.886 -7.067 -3.643 1.00 93.86 43 A 1 +ATOM 340 N N . ALA A 1 44 ? -2.440 -3.743 -3.947 1.00 98.72 44 A 1 +ATOM 341 C CA . ALA A 1 44 ? -3.846 -3.434 -4.201 1.00 98.79 44 A 1 +ATOM 342 C C . ALA A 1 44 ? -4.060 -2.337 -5.261 1.00 98.74 44 A 1 +ATOM 343 O O . ALA A 1 44 ? -4.967 -2.439 -6.087 1.00 98.73 44 A 1 +ATOM 344 C CB . ALA A 1 44 ? -4.479 -3.051 -2.859 1.00 98.73 44 A 1 +ATOM 345 N N . GLY A 1 45 ? -3.221 -1.305 -5.259 1.00 98.65 45 A 1 +ATOM 346 C CA . GLY A 1 45 ? -3.387 -0.076 -6.035 1.00 98.65 45 A 1 +ATOM 347 C C . GLY A 1 45 ? -3.205 -0.217 -7.551 1.00 98.76 45 A 1 +ATOM 348 O O . GLY A 1 45 ? -3.362 0.751 -8.288 1.00 98.65 45 A 1 +ATOM 349 N N . THR A 1 46 ? -2.904 -1.417 -8.021 1.00 98.76 46 A 1 +ATOM 350 C CA . THR A 1 46 ? -2.840 -1.730 -9.456 1.00 98.79 46 A 1 +ATOM 351 C C . THR A 1 46 ? -4.206 -2.081 -10.055 1.00 98.73 46 A 1 +ATOM 352 O O . THR A 1 46 ? -4.297 -2.308 -11.267 1.00 98.67 46 A 1 +ATOM 353 C CB . THR A 1 46 ? -1.863 -2.879 -9.710 1.00 98.68 46 A 1 +ATOM 354 O OG1 . THR A 1 46 ? -2.284 -4.027 -9.007 1.00 98.54 46 A 1 +ATOM 355 C CG2 . THR A 1 46 ? -0.440 -2.544 -9.266 1.00 98.40 46 A 1 +ATOM 356 N N . PHE A 1 47 ? -5.286 -2.139 -9.247 1.00 98.57 47 A 1 +ATOM 357 C CA . PHE A 1 47 ? -6.607 -2.532 -9.725 1.00 98.53 47 A 1 +ATOM 358 C C . PHE A 1 47 ? -7.173 -1.529 -10.741 1.00 98.57 47 A 1 +ATOM 359 O O . PHE A 1 47 ? -7.154 -0.319 -10.532 1.00 98.59 47 A 1 +ATOM 360 C CB . PHE A 1 47 ? -7.577 -2.705 -8.554 1.00 98.40 47 A 1 +ATOM 361 C CG . PHE A 1 47 ? -8.939 -3.233 -8.966 1.00 98.37 47 A 1 +ATOM 362 C CD1 . PHE A 1 47 ? -10.100 -2.447 -8.787 1.00 98.23 47 A 1 +ATOM 363 C CD2 . PHE A 1 47 ? -9.054 -4.512 -9.533 1.00 98.23 47 A 1 +ATOM 364 C CE1 . PHE A 1 47 ? -11.357 -2.947 -9.161 1.00 98.03 47 A 1 +ATOM 365 C CE2 . PHE A 1 47 ? -10.307 -5.010 -9.913 1.00 97.91 47 A 1 +ATOM 366 C CZ . PHE A 1 47 ? -11.463 -4.228 -9.722 1.00 97.91 47 A 1 +ATOM 367 N N . ASP A 1 48 ? -7.737 -2.055 -11.819 1.00 98.66 48 A 1 +ATOM 368 C CA . ASP A 1 48 ? -8.521 -1.312 -12.795 1.00 98.57 48 A 1 +ATOM 369 C C . ASP A 1 48 ? -9.937 -1.894 -12.858 1.00 98.44 48 A 1 +ATOM 370 O O . ASP A 1 48 ? -10.143 -3.036 -13.292 1.00 98.24 48 A 1 +ATOM 371 C CB . ASP A 1 48 ? -7.818 -1.342 -14.157 1.00 98.59 48 A 1 +ATOM 372 C CG . ASP A 1 48 ? -8.665 -0.655 -15.219 1.00 98.36 48 A 1 +ATOM 373 O OD1 . ASP A 1 48 ? -9.399 -1.383 -15.929 1.00 96.50 48 A 1 +ATOM 374 O OD2 . ASP A 1 48 ? -8.616 0.583 -15.302 1.00 96.61 48 A 1 +ATOM 375 N N . LYS A 1 49 ? -10.935 -1.103 -12.427 1.00 97.93 49 A 1 +ATOM 376 C CA . LYS A 1 49 ? -12.337 -1.544 -12.360 1.00 97.55 49 A 1 +ATOM 377 C C . LYS A 1 49 ? -12.964 -1.802 -13.729 1.00 97.57 49 A 1 +ATOM 378 O O . LYS A 1 49 ? -13.920 -2.568 -13.821 1.00 97.62 49 A 1 +ATOM 379 C CB . LYS A 1 49 ? -13.169 -0.539 -11.544 1.00 97.51 49 A 1 +ATOM 380 C CG . LYS A 1 49 ? -13.400 0.805 -12.259 1.00 97.41 49 A 1 +ATOM 381 C CD . LYS A 1 49 ? -14.118 1.804 -11.343 1.00 96.39 49 A 1 +ATOM 382 C CE . LYS A 1 49 ? -14.301 3.134 -12.059 1.00 93.81 49 A 1 +ATOM 383 N NZ . LYS A 1 49 ? -14.761 4.196 -11.128 1.00 89.90 49 A 1 +ATOM 384 N N . GLY A 1 50 ? -12.449 -1.158 -14.784 1.00 97.72 50 A 1 +ATOM 385 C CA . GLY A 1 50 ? -12.972 -1.302 -16.140 1.00 97.88 50 A 1 +ATOM 386 C C . GLY A 1 50 ? -12.650 -2.666 -16.736 1.00 97.92 50 A 1 +ATOM 387 O O . GLY A 1 50 ? -13.518 -3.311 -17.325 1.00 97.69 50 A 1 +ATOM 388 N N . THR A 1 51 ? -11.423 -3.127 -16.525 1.00 98.01 51 A 1 +ATOM 389 C CA . THR A 1 51 ? -10.930 -4.415 -17.037 1.00 98.15 51 A 1 +ATOM 390 C C . THR A 1 51 ? -10.947 -5.534 -16.001 1.00 98.19 51 A 1 +ATOM 391 O O . THR A 1 51 ? -10.774 -6.700 -16.364 1.00 98.09 51 A 1 +ATOM 392 C CB . THR A 1 51 ? -9.519 -4.257 -17.603 1.00 98.35 51 A 1 +ATOM 393 O OG1 . THR A 1 51 ? -8.639 -3.839 -16.590 1.00 98.18 51 A 1 +ATOM 394 C CG2 . THR A 1 51 ? -9.443 -3.232 -18.735 1.00 97.78 51 A 1 +ATOM 395 N N . LYS A 1 52 ? -11.148 -5.212 -14.719 1.00 97.47 52 A 1 +ATOM 396 C CA . LYS A 1 52 ? -11.046 -6.131 -13.570 1.00 97.35 52 A 1 +ATOM 397 C C . LYS A 1 52 ? -9.688 -6.842 -13.489 1.00 97.78 52 A 1 +ATOM 398 O O . LYS A 1 52 ? -9.601 -8.023 -13.149 1.00 97.77 52 A 1 +ATOM 399 C CB . LYS A 1 52 ? -12.238 -7.091 -13.516 1.00 97.01 52 A 1 +ATOM 400 C CG . LYS A 1 52 ? -13.594 -6.371 -13.479 1.00 95.16 52 A 1 +ATOM 401 C CD . LYS A 1 52 ? -14.707 -7.391 -13.223 1.00 87.77 52 A 1 +ATOM 402 C CE . LYS A 1 52 ? -16.052 -6.671 -13.068 1.00 82.78 52 A 1 +ATOM 403 N NZ . LYS A 1 52 ? -17.087 -7.577 -12.527 1.00 70.29 52 A 1 +ATOM 404 N N . THR A 1 53 ? -8.607 -6.121 -13.812 1.00 97.94 53 A 1 +ATOM 405 C CA . THR A 1 53 ? -7.225 -6.614 -13.770 1.00 98.28 53 A 1 +ATOM 406 C C . THR A 1 53 ? -6.413 -5.894 -12.689 1.00 98.46 53 A 1 +ATOM 407 O O . THR A 1 53 ? -6.767 -4.788 -12.284 1.00 98.56 53 A 1 +ATOM 408 C CB . THR A 1 53 ? -6.517 -6.481 -15.118 1.00 98.32 53 A 1 +ATOM 409 O OG1 . THR A 1 53 ? -6.473 -5.142 -15.549 1.00 98.14 53 A 1 +ATOM 410 C CG2 . THR A 1 53 ? -7.177 -7.294 -16.223 1.00 97.98 53 A 1 +ATOM 411 N N . GLY A 1 54 ? -5.308 -6.497 -12.255 1.00 98.49 54 A 1 +ATOM 412 C CA . GLY A 1 54 ? -4.531 -6.021 -11.120 1.00 98.55 54 A 1 +ATOM 413 C C . GLY A 1 54 ? -5.265 -6.248 -9.792 1.00 98.69 54 A 1 +ATOM 414 O O . GLY A 1 54 ? -6.159 -7.092 -9.714 1.00 98.56 54 A 1 +ATOM 415 N N . GLY A 1 55 ? -4.898 -5.484 -8.752 1.00 98.62 55 A 1 +ATOM 416 C CA . GLY A 1 55 ? -5.475 -5.603 -7.416 1.00 98.73 55 A 1 +ATOM 417 C C . GLY A 1 55 ? -4.714 -6.554 -6.478 1.00 98.89 55 A 1 +ATOM 418 O O . GLY A 1 55 ? -3.663 -7.086 -6.833 1.00 98.78 55 A 1 +ATOM 419 N N . PRO A 1 56 ? -5.246 -6.779 -5.252 1.00 98.80 56 A 1 +ATOM 420 C CA . PRO A 1 56 ? -4.537 -7.445 -4.162 1.00 98.88 56 A 1 +ATOM 421 C C . PRO A 1 56 ? -4.536 -8.978 -4.301 1.00 98.83 56 A 1 +ATOM 422 O O . PRO A 1 56 ? -5.091 -9.686 -3.459 1.00 98.82 56 A 1 +ATOM 423 C CB . PRO A 1 56 ? -5.240 -6.948 -2.901 1.00 98.81 56 A 1 +ATOM 424 C CG . PRO A 1 56 ? -6.685 -6.800 -3.355 1.00 98.61 56 A 1 +ATOM 425 C CD . PRO A 1 56 ? -6.524 -6.273 -4.780 1.00 98.84 56 A 1 +ATOM 426 N N . PHE A 1 57 ? -3.922 -9.501 -5.356 1.00 98.89 57 A 1 +ATOM 427 C CA . PHE A 1 57 ? -3.974 -10.928 -5.711 1.00 98.86 57 A 1 +ATOM 428 C C . PHE A 1 57 ? -2.605 -11.613 -5.736 1.00 98.88 57 A 1 +ATOM 429 O O . PHE A 1 57 ? -2.374 -12.531 -6.516 1.00 98.52 57 A 1 +ATOM 430 C CB . PHE A 1 57 ? -4.766 -11.102 -7.015 1.00 98.75 57 A 1 +ATOM 431 C CG . PHE A 1 57 ? -6.193 -10.605 -6.935 1.00 98.75 57 A 1 +ATOM 432 C CD1 . PHE A 1 57 ? -7.149 -11.321 -6.196 1.00 98.56 57 A 1 +ATOM 433 C CD2 . PHE A 1 57 ? -6.553 -9.406 -7.562 1.00 98.54 57 A 1 +ATOM 434 C CE1 . PHE A 1 57 ? -8.468 -10.845 -6.096 1.00 98.32 57 A 1 +ATOM 435 C CE2 . PHE A 1 57 ? -7.874 -8.932 -7.465 1.00 98.26 57 A 1 +ATOM 436 C CZ . PHE A 1 57 ? -8.828 -9.650 -6.732 1.00 98.28 57 A 1 +ATOM 437 N N . GLY A 1 58 ? -1.675 -11.169 -4.885 1.00 97.94 58 A 1 +ATOM 438 C CA . GLY A 1 58 ? -0.401 -11.842 -4.621 1.00 97.93 58 A 1 +ATOM 439 C C . GLY A 1 58 ? 0.682 -11.696 -5.697 1.00 98.26 58 A 1 +ATOM 440 O O . GLY A 1 58 ? 1.777 -12.235 -5.536 1.00 97.59 58 A 1 +ATOM 441 N N . THR A 1 59 ? 0.410 -10.967 -6.780 1.00 98.33 59 A 1 +ATOM 442 C CA . THR A 1 59 ? 1.307 -10.835 -7.939 1.00 98.41 59 A 1 +ATOM 443 C C . THR A 1 59 ? 2.543 -9.971 -7.665 1.00 98.32 59 A 1 +ATOM 444 O O . THR A 1 59 ? 3.571 -10.183 -8.300 1.00 98.16 59 A 1 +ATOM 445 C CB . THR A 1 59 ? 0.560 -10.286 -9.158 1.00 98.48 59 A 1 +ATOM 446 O OG1 . THR A 1 59 ? -0.106 -9.093 -8.826 1.00 98.06 59 A 1 +ATOM 447 C CG2 . THR A 1 59 ? -0.501 -11.269 -9.651 1.00 97.59 59 A 1 +ATOM 448 N N . ILE A 1 60 ? 2.497 -9.098 -6.655 1.00 97.96 60 A 1 +ATOM 449 C CA . ILE A 1 60 ? 3.623 -8.210 -6.274 1.00 97.75 60 A 1 +ATOM 450 C C . ILE A 1 60 ? 4.927 -8.967 -5.963 1.00 97.68 60 A 1 +ATOM 451 O O . ILE A 1 60 ? 6.008 -8.410 -6.108 1.00 97.60 60 A 1 +ATOM 452 C CB . ILE A 1 60 ? 3.192 -7.312 -5.088 1.00 97.73 60 A 1 +ATOM 453 C CG1 . ILE A 1 60 ? 4.132 -6.123 -4.804 1.00 96.29 60 A 1 +ATOM 454 C CG2 . ILE A 1 60 ? 3.012 -8.118 -3.803 1.00 96.08 60 A 1 +ATOM 455 C CD1 . ILE A 1 60 ? 4.181 -5.098 -5.915 1.00 95.17 60 A 1 +ATOM 456 N N . LYS A 1 61 ? 4.859 -10.252 -5.584 1.00 97.21 61 A 1 +ATOM 457 C CA . LYS A 1 61 ? 6.042 -11.099 -5.392 1.00 96.67 61 A 1 +ATOM 458 C C . LYS A 1 61 ? 6.681 -11.566 -6.703 1.00 96.97 61 A 1 +ATOM 459 O O . LYS A 1 61 ? 7.782 -12.116 -6.677 1.00 97.27 61 A 1 +ATOM 460 C CB . LYS A 1 61 ? 5.697 -12.293 -4.489 1.00 95.85 61 A 1 +ATOM 461 C CG . LYS A 1 61 ? 4.975 -13.419 -5.244 1.00 96.16 61 A 1 +ATOM 462 C CD . LYS A 1 61 ? 4.462 -14.492 -4.285 1.00 95.65 61 A 1 +ATOM 463 C CE . LYS A 1 61 ? 3.762 -15.622 -5.062 1.00 93.26 61 A 1 +ATOM 464 N NZ . LYS A 1 61 ? 4.724 -16.422 -5.851 1.00 90.29 61 A 1 +ATOM 465 N N . HIS A 1 62 ? 5.991 -11.421 -7.835 1.00 98.03 62 A 1 +ATOM 466 C CA . HIS A 1 62 ? 6.500 -11.867 -9.123 1.00 97.89 62 A 1 +ATOM 467 C C . HIS A 1 62 ? 7.674 -10.983 -9.567 1.00 97.95 62 A 1 +ATOM 468 O O . HIS A 1 62 ? 7.564 -9.762 -9.490 1.00 97.92 62 A 1 +ATOM 469 C CB . HIS A 1 62 ? 5.358 -11.877 -10.154 1.00 97.31 62 A 1 +ATOM 470 C CG . HIS A 1 62 ? 5.730 -12.597 -11.416 1.00 91.73 62 A 1 +ATOM 471 N ND1 . HIS A 1 62 ? 6.304 -12.043 -12.541 1.00 77.68 62 A 1 +ATOM 472 C CD2 . HIS A 1 62 ? 5.624 -13.940 -11.649 1.00 77.11 62 A 1 +ATOM 473 C CE1 . HIS A 1 62 ? 6.531 -13.028 -13.421 1.00 77.76 62 A 1 +ATOM 474 N NE2 . HIS A 1 62 ? 6.139 -14.202 -12.915 1.00 78.92 62 A 1 +ATOM 475 N N . PRO A 1 63 ? 8.794 -11.544 -10.061 1.00 97.37 63 A 1 +ATOM 476 C CA . PRO A 1 63 ? 9.960 -10.748 -10.443 1.00 96.90 63 A 1 +ATOM 477 C C . PRO A 1 63 ? 9.650 -9.622 -11.440 1.00 97.18 63 A 1 +ATOM 478 O O . PRO A 1 63 ? 10.210 -8.540 -11.323 1.00 97.27 63 A 1 +ATOM 479 C CB . PRO A 1 63 ? 10.959 -11.745 -11.032 1.00 97.07 63 A 1 +ATOM 480 C CG . PRO A 1 63 ? 10.624 -13.032 -10.299 1.00 96.21 63 A 1 +ATOM 481 C CD . PRO A 1 63 ? 9.107 -12.961 -10.130 1.00 97.70 63 A 1 +ATOM 482 N N . ALA A 1 64 ? 8.719 -9.849 -12.377 1.00 97.07 64 A 1 +ATOM 483 C CA . ALA A 1 64 ? 8.299 -8.834 -13.339 1.00 96.81 64 A 1 +ATOM 484 C C . ALA A 1 64 ? 7.610 -7.627 -12.679 1.00 97.35 64 A 1 +ATOM 485 O O . ALA A 1 64 ? 7.844 -6.501 -13.096 1.00 97.11 64 A 1 +ATOM 486 C CB . ALA A 1 64 ? 7.381 -9.488 -14.377 1.00 96.63 64 A 1 +ATOM 487 N N . GLU A 1 65 ? 6.789 -7.832 -11.626 1.00 96.53 65 A 1 +ATOM 488 C CA . GLU A 1 65 ? 6.113 -6.736 -10.916 1.00 97.06 65 A 1 +ATOM 489 C C . GLU A 1 65 ? 7.041 -6.048 -9.911 1.00 97.23 65 A 1 +ATOM 490 O O . GLU A 1 65 ? 7.019 -4.829 -9.770 1.00 97.46 65 A 1 +ATOM 491 C CB . GLU A 1 65 ? 4.830 -7.260 -10.254 1.00 97.56 65 A 1 +ATOM 492 C CG . GLU A 1 65 ? 3.939 -6.105 -9.774 1.00 96.97 65 A 1 +ATOM 493 C CD . GLU A 1 65 ? 2.570 -6.575 -9.251 1.00 98.06 65 A 1 +ATOM 494 O OE1 . GLU A 1 65 ? 1.856 -5.763 -8.628 1.00 96.37 65 A 1 +ATOM 495 O OE2 . GLU A 1 65 ? 2.214 -7.754 -9.469 1.00 97.34 65 A 1 +ATOM 496 N N . LEU A 1 66 ? 7.944 -6.803 -9.253 1.00 96.90 66 A 1 +ATOM 497 C CA . LEU A 1 66 ? 8.999 -6.217 -8.421 1.00 95.60 66 A 1 +ATOM 498 C C . LEU A 1 66 ? 9.961 -5.335 -9.217 1.00 95.30 66 A 1 +ATOM 499 O O . LEU A 1 66 ? 10.535 -4.402 -8.656 1.00 95.84 66 A 1 +ATOM 500 C CB . LEU A 1 66 ? 9.790 -7.330 -7.711 1.00 95.41 66 A 1 +ATOM 501 C CG . LEU A 1 66 ? 9.058 -7.976 -6.526 1.00 93.96 66 A 1 +ATOM 502 C CD1 . LEU A 1 66 ? 9.887 -9.154 -6.009 1.00 93.41 66 A 1 +ATOM 503 C CD2 . LEU A 1 66 ? 8.863 -6.997 -5.364 1.00 94.04 66 A 1 +ATOM 504 N N . ALA A 1 67 ? 10.136 -5.600 -10.514 1.00 95.78 67 A 1 +ATOM 505 C CA . ALA A 1 67 ? 10.973 -4.803 -11.409 1.00 94.83 67 A 1 +ATOM 506 C C . ALA A 1 67 ? 10.337 -3.465 -11.832 1.00 94.99 67 A 1 +ATOM 507 O O . ALA A 1 67 ? 11.042 -2.617 -12.373 1.00 94.71 67 A 1 +ATOM 508 C CB . ALA A 1 67 ? 11.336 -5.662 -12.622 1.00 94.85 67 A 1 +ATOM 509 N N . HIS A 1 68 ? 9.036 -3.241 -11.580 1.00 95.19 68 A 1 +ATOM 510 C CA . HIS A 1 68 ? 8.402 -1.946 -11.816 1.00 95.16 68 A 1 +ATOM 511 C C . HIS A 1 68 ? 9.090 -0.871 -10.967 1.00 95.05 68 A 1 +ATOM 512 O O . HIS A 1 68 ? 9.279 -1.036 -9.765 1.00 95.29 68 A 1 +ATOM 513 C CB . HIS A 1 68 ? 6.899 -1.984 -11.493 1.00 95.77 68 A 1 +ATOM 514 C CG . HIS A 1 68 ? 6.055 -2.920 -12.316 1.00 96.41 68 A 1 +ATOM 515 N ND1 . HIS A 1 68 ? 4.692 -3.102 -12.145 1.00 92.16 68 A 1 +ATOM 516 C CD2 . HIS A 1 68 ? 6.422 -3.712 -13.372 1.00 91.53 68 A 1 +ATOM 517 C CE1 . HIS A 1 68 ? 4.265 -3.971 -13.072 1.00 93.68 68 A 1 +ATOM 518 N NE2 . HIS A 1 68 ? 5.288 -4.363 -13.838 1.00 94.36 68 A 1 +ATOM 519 N N . SER A 1 69 ? 9.429 0.270 -11.577 1.00 95.28 69 A 1 +ATOM 520 C CA . SER A 1 69 ? 10.159 1.354 -10.910 1.00 93.94 69 A 1 +ATOM 521 C C . SER A 1 69 ? 9.448 1.876 -9.652 1.00 94.00 69 A 1 +ATOM 522 O O . SER A 1 69 ? 10.093 2.159 -8.637 1.00 93.47 69 A 1 +ATOM 523 C CB . SER A 1 69 ? 10.395 2.481 -11.911 1.00 93.35 69 A 1 +ATOM 524 O OG . SER A 1 69 ? 9.167 2.934 -12.441 1.00 87.69 69 A 1 +ATOM 525 N N . ALA A 1 70 ? 8.111 1.901 -9.662 1.00 93.41 70 A 1 +ATOM 526 C CA . ALA A 1 70 ? 7.288 2.239 -8.505 1.00 93.03 70 A 1 +ATOM 527 C C . ALA A 1 70 ? 7.500 1.279 -7.311 1.00 93.75 70 A 1 +ATOM 528 O O . ALA A 1 70 ? 7.283 1.666 -6.169 1.00 93.76 70 A 1 +ATOM 529 C CB . ALA A 1 70 ? 5.826 2.236 -8.946 1.00 93.32 70 A 1 +ATOM 530 N N . ASN A 1 71 ? 7.957 0.042 -7.557 1.00 95.01 71 A 1 +ATOM 531 C CA . ASN A 1 71 ? 8.132 -1.011 -6.552 1.00 95.77 71 A 1 +ATOM 532 C C . ASN A 1 71 ? 9.560 -1.113 -6.000 1.00 95.83 71 A 1 +ATOM 533 O O . ASN A 1 71 ? 9.833 -1.984 -5.176 1.00 95.68 71 A 1 +ATOM 534 C CB . ASN A 1 71 ? 7.604 -2.335 -7.124 1.00 96.41 71 A 1 +ATOM 535 C CG . ASN A 1 71 ? 6.098 -2.309 -7.323 1.00 96.90 71 A 1 +ATOM 536 O OD1 . ASN A 1 71 ? 5.376 -1.549 -6.681 1.00 94.20 71 A 1 +ATOM 537 N ND2 . ASN A 1 71 ? 5.581 -3.144 -8.183 1.00 93.78 71 A 1 +ATOM 538 N N . ASN A 1 72 ? 10.468 -0.199 -6.368 1.00 93.97 72 A 1 +ATOM 539 C CA . ASN A 1 72 ? 11.836 -0.168 -5.858 1.00 93.26 72 A 1 +ATOM 540 C C . ASN A 1 72 ? 11.880 -0.310 -4.323 1.00 92.85 72 A 1 +ATOM 541 O O . ASN A 1 72 ? 11.267 0.466 -3.577 1.00 93.03 72 A 1 +ATOM 542 C CB . ASN A 1 72 ? 12.532 1.133 -6.295 1.00 93.42 72 A 1 +ATOM 543 C CG . ASN A 1 72 ? 12.940 1.145 -7.759 1.00 91.12 72 A 1 +ATOM 544 O OD1 . ASN A 1 72 ? 12.985 0.140 -8.438 1.00 86.79 72 A 1 +ATOM 545 N ND2 . ASN A 1 72 ? 13.296 2.300 -8.277 1.00 85.18 72 A 1 +ATOM 546 N N . GLY A 1 73 ? 12.612 -1.314 -3.842 1.00 94.74 73 A 1 +ATOM 547 C CA . GLY A 1 73 ? 12.751 -1.648 -2.423 1.00 94.62 73 A 1 +ATOM 548 C C . GLY A 1 73 ? 11.671 -2.581 -1.856 1.00 95.79 73 A 1 +ATOM 549 O O . GLY A 1 73 ? 11.800 -2.996 -0.703 1.00 95.93 73 A 1 +ATOM 550 N N . LEU A 1 74 ? 10.618 -2.946 -2.607 1.00 96.55 74 A 1 +ATOM 551 C CA . LEU A 1 74 ? 9.615 -3.921 -2.151 1.00 97.08 74 A 1 +ATOM 552 C C . LEU A 1 74 ? 10.092 -5.374 -2.244 1.00 97.15 74 A 1 +ATOM 553 O O . LEU A 1 74 ? 9.556 -6.238 -1.550 1.00 97.27 74 A 1 +ATOM 554 C CB . LEU A 1 74 ? 8.281 -3.730 -2.891 1.00 97.40 74 A 1 +ATOM 555 C CG . LEU A 1 74 ? 7.556 -2.420 -2.570 1.00 97.22 74 A 1 +ATOM 556 C CD1 . LEU A 1 74 ? 6.231 -2.371 -3.324 1.00 97.07 74 A 1 +ATOM 557 C CD2 . LEU A 1 74 ? 7.244 -2.269 -1.076 1.00 96.90 74 A 1 +ATOM 558 N N . ASP A 1 75 ? 11.156 -5.660 -3.006 1.00 97.18 75 A 1 +ATOM 559 C CA . ASP A 1 75 ? 11.865 -6.944 -2.961 1.00 97.08 75 A 1 +ATOM 560 C C . ASP A 1 75 ? 12.386 -7.260 -1.547 1.00 97.43 75 A 1 +ATOM 561 O O . ASP A 1 75 ? 12.382 -8.414 -1.116 1.00 97.47 75 A 1 +ATOM 562 C CB . ASP A 1 75 ? 13.018 -6.899 -3.976 1.00 96.45 75 A 1 +ATOM 563 C CG . ASP A 1 75 ? 14.089 -5.884 -3.575 1.00 93.77 75 A 1 +ATOM 564 O OD1 . ASP A 1 75 ? 13.754 -4.691 -3.403 1.00 91.20 75 A 1 +ATOM 565 O OD2 . ASP A 1 75 ? 15.245 -6.318 -3.318 1.00 91.12 75 A 1 +ATOM 566 N N . ILE A 1 76 ? 12.759 -6.221 -0.766 1.00 96.97 76 A 1 +ATOM 567 C CA . ILE A 1 76 ? 13.141 -6.344 0.642 1.00 96.96 76 A 1 +ATOM 568 C C . ILE A 1 76 ? 11.942 -6.804 1.470 1.00 97.43 76 A 1 +ATOM 569 O O . ILE A 1 76 ? 12.071 -7.729 2.274 1.00 97.62 76 A 1 +ATOM 570 C CB . ILE A 1 76 ? 13.717 -5.017 1.187 1.00 96.76 76 A 1 +ATOM 571 C CG1 . ILE A 1 76 ? 14.932 -4.546 0.354 1.00 96.30 76 A 1 +ATOM 572 C CG2 . ILE A 1 76 ? 14.093 -5.150 2.673 1.00 96.35 76 A 1 +ATOM 573 C CD1 . ILE A 1 76 ? 15.405 -3.125 0.690 1.00 94.44 76 A 1 +ATOM 574 N N . ALA A 1 77 ? 10.758 -6.208 1.260 1.00 97.20 77 A 1 +ATOM 575 C CA . ALA A 1 77 ? 9.539 -6.568 1.981 1.00 97.43 77 A 1 +ATOM 576 C C . ALA A 1 77 ? 9.133 -8.025 1.718 1.00 98.04 77 A 1 +ATOM 577 O O . ALA A 1 77 ? 8.876 -8.775 2.661 1.00 98.34 77 A 1 +ATOM 578 C CB . ALA A 1 77 ? 8.412 -5.609 1.574 1.00 97.68 77 A 1 +ATOM 579 N N . VAL A 1 78 ? 9.154 -8.443 0.451 1.00 98.36 78 A 1 +ATOM 580 C CA . VAL A 1 78 ? 8.856 -9.826 0.048 1.00 98.35 78 A 1 +ATOM 581 C C . VAL A 1 78 ? 9.834 -10.798 0.713 1.00 98.42 78 A 1 +ATOM 582 O O . VAL A 1 78 ? 9.400 -11.742 1.364 1.00 98.49 78 A 1 +ATOM 583 C CB . VAL A 1 78 ? 8.856 -9.956 -1.486 1.00 98.37 78 A 1 +ATOM 584 C CG1 . VAL A 1 78 ? 8.747 -11.410 -1.950 1.00 98.00 78 A 1 +ATOM 585 C CG2 . VAL A 1 78 ? 7.673 -9.183 -2.079 1.00 98.01 78 A 1 +ATOM 586 N N . ARG A 1 79 ? 11.150 -10.540 0.636 1.00 98.47 79 A 1 +ATOM 587 C CA . ARG A 1 79 ? 12.168 -11.398 1.278 1.00 98.37 79 A 1 +ATOM 588 C C . ARG A 1 79 ? 12.013 -11.478 2.796 1.00 98.44 79 A 1 +ATOM 589 O O . ARG A 1 79 ? 12.231 -12.549 3.361 1.00 98.45 79 A 1 +ATOM 590 C CB . ARG A 1 79 ? 13.581 -10.913 0.950 1.00 98.06 79 A 1 +ATOM 591 C CG . ARG A 1 79 ? 14.025 -11.248 -0.479 1.00 93.09 79 A 1 +ATOM 592 C CD . ARG A 1 79 ? 15.536 -10.988 -0.648 1.00 92.96 79 A 1 +ATOM 593 N NE . ARG A 1 79 ? 15.905 -9.587 -0.363 1.00 87.93 79 A 1 +ATOM 594 C CZ . ARG A 1 79 ? 16.020 -8.606 -1.254 1.00 85.80 79 A 1 +ATOM 595 N NH1 . ARG A 1 79 ? 15.856 -8.811 -2.515 1.00 77.30 79 A 1 +ATOM 596 N NH2 . ARG A 1 79 ? 16.292 -7.390 -0.894 1.00 79.23 79 A 1 +ATOM 597 N N . LEU A 1 80 ? 11.672 -10.374 3.461 1.00 98.34 80 A 1 +ATOM 598 C CA . LEU A 1 80 ? 11.447 -10.353 4.910 1.00 98.38 80 A 1 +ATOM 599 C C . LEU A 1 80 ? 10.277 -11.245 5.313 1.00 98.53 80 A 1 +ATOM 600 O O . LEU A 1 80 ? 10.358 -11.913 6.336 1.00 98.57 80 A 1 +ATOM 601 C CB . LEU A 1 80 ? 11.199 -8.903 5.375 1.00 98.24 80 A 1 +ATOM 602 C CG . LEU A 1 80 ? 12.470 -8.048 5.533 1.00 96.66 80 A 1 +ATOM 603 C CD1 . LEU A 1 80 ? 12.079 -6.595 5.809 1.00 96.12 80 A 1 +ATOM 604 C CD2 . LEU A 1 80 ? 13.343 -8.526 6.706 1.00 96.13 80 A 1 +ATOM 605 N N . LEU A 1 81 ? 9.201 -11.264 4.521 1.00 98.78 81 A 1 +ATOM 606 C CA . LEU A 1 81 ? 7.979 -12.006 4.825 1.00 98.76 81 A 1 +ATOM 607 C C . LEU A 1 81 ? 8.044 -13.492 4.448 1.00 98.77 81 A 1 +ATOM 608 O O . LEU A 1 81 ? 7.305 -14.276 5.039 1.00 98.77 81 A 1 +ATOM 609 C CB . LEU A 1 81 ? 6.797 -11.317 4.139 1.00 98.76 81 A 1 +ATOM 610 C CG . LEU A 1 81 ? 6.369 -9.985 4.777 1.00 98.59 81 A 1 +ATOM 611 C CD1 . LEU A 1 81 ? 5.197 -9.411 3.980 1.00 98.47 81 A 1 +ATOM 612 C CD2 . LEU A 1 81 ? 5.906 -10.153 6.225 1.00 98.40 81 A 1 +ATOM 613 N N . GLU A 1 82 ? 8.908 -13.894 3.510 1.00 98.81 82 A 1 +ATOM 614 C CA . GLU A 1 82 ? 8.921 -15.250 2.957 1.00 98.72 82 A 1 +ATOM 615 C C . GLU A 1 82 ? 9.100 -16.362 4.017 1.00 98.82 82 A 1 +ATOM 616 O O . GLU A 1 82 ? 8.309 -17.311 4.001 1.00 98.79 82 A 1 +ATOM 617 C CB . GLU A 1 82 ? 9.972 -15.341 1.832 1.00 98.57 82 A 1 +ATOM 618 C CG . GLU A 1 82 ? 9.802 -16.587 0.950 1.00 93.50 82 A 1 +ATOM 619 C CD . GLU A 1 82 ? 8.481 -16.617 0.158 1.00 95.61 82 A 1 +ATOM 620 O OE1 . GLU A 1 82 ? 8.055 -17.711 -0.249 1.00 89.57 82 A 1 +ATOM 621 O OE2 . GLU A 1 82 ? 7.857 -15.546 -0.034 1.00 91.70 82 A 1 +ATOM 622 N N . PRO A 1 83 ? 10.027 -16.260 5.004 1.00 98.81 83 A 1 +ATOM 623 C CA . PRO A 1 83 ? 10.149 -17.273 6.060 1.00 98.78 83 A 1 +ATOM 624 C C . PRO A 1 83 ? 8.876 -17.412 6.898 1.00 98.87 83 A 1 +ATOM 625 O O . PRO A 1 83 ? 8.484 -18.521 7.241 1.00 98.80 83 A 1 +ATOM 626 C CB . PRO A 1 83 ? 11.339 -16.830 6.924 1.00 98.75 83 A 1 +ATOM 627 C CG . PRO A 1 83 ? 12.159 -15.953 5.984 1.00 97.89 83 A 1 +ATOM 628 C CD . PRO A 1 83 ? 11.084 -15.272 5.148 1.00 98.80 83 A 1 +ATOM 629 N N . LEU A 1 84 ? 8.204 -16.297 7.204 1.00 98.88 84 A 1 +ATOM 630 C CA . LEU A 1 84 ? 6.970 -16.309 7.980 1.00 98.81 84 A 1 +ATOM 631 C C . LEU A 1 84 ? 5.795 -16.846 7.151 1.00 98.97 84 A 1 +ATOM 632 O O . LEU A 1 84 ? 4.989 -17.615 7.659 1.00 98.84 84 A 1 +ATOM 633 C CB . LEU A 1 84 ? 6.708 -14.891 8.512 1.00 98.36 84 A 1 +ATOM 634 C CG . LEU A 1 84 ? 5.536 -14.820 9.498 1.00 91.59 84 A 1 +ATOM 635 C CD1 . LEU A 1 84 ? 5.807 -15.629 10.763 1.00 86.35 84 A 1 +ATOM 636 C CD2 . LEU A 1 84 ? 5.315 -13.374 9.929 1.00 87.87 84 A 1 +ATOM 637 N N . LYS A 1 85 ? 5.710 -16.504 5.853 1.00 98.83 85 A 1 +ATOM 638 C CA . LYS A 1 85 ? 4.714 -17.066 4.938 1.00 98.98 85 A 1 +ATOM 639 C C . LYS A 1 85 ? 4.837 -18.584 4.811 1.00 98.90 85 A 1 +ATOM 640 O O . LYS A 1 85 ? 3.808 -19.269 4.742 1.00 98.93 85 A 1 +ATOM 641 C CB . LYS A 1 85 ? 4.826 -16.371 3.575 1.00 98.88 85 A 1 +ATOM 642 C CG . LYS A 1 85 ? 3.880 -16.935 2.505 1.00 98.55 85 A 1 +ATOM 643 C CD . LYS A 1 85 ? 2.394 -16.777 2.851 1.00 98.14 85 A 1 +ATOM 644 C CE . LYS A 1 85 ? 1.508 -17.523 1.841 1.00 97.44 85 A 1 +ATOM 645 N NZ . LYS A 1 85 ? 1.592 -18.988 1.993 1.00 97.50 85 A 1 +ATOM 646 N N . ALA A 1 86 ? 6.058 -19.122 4.839 1.00 98.85 86 A 1 +ATOM 647 C CA . ALA A 1 86 ? 6.303 -20.560 4.784 1.00 98.85 86 A 1 +ATOM 648 C C . ALA A 1 86 ? 5.739 -21.327 5.996 1.00 98.80 86 A 1 +ATOM 649 O O . ALA A 1 86 ? 5.409 -22.504 5.868 1.00 98.82 86 A 1 +ATOM 650 C CB . ALA A 1 86 ? 7.812 -20.790 4.614 1.00 98.82 86 A 1 +ATOM 651 N N . GLU A 1 87 ? 5.551 -20.683 7.162 1.00 98.89 87 A 1 +ATOM 652 C CA . GLU A 1 87 ? 4.858 -21.263 8.326 1.00 98.84 87 A 1 +ATOM 653 C C . GLU A 1 87 ? 3.335 -21.406 8.103 1.00 98.85 87 A 1 +ATOM 654 O O . GLU A 1 87 ? 2.680 -22.166 8.809 1.00 98.83 87 A 1 +ATOM 655 C CB . GLU A 1 87 ? 5.117 -20.436 9.606 1.00 98.79 87 A 1 +ATOM 656 C CG . GLU A 1 87 ? 6.588 -20.319 10.039 1.00 98.45 87 A 1 +ATOM 657 C CD . GLU A 1 87 ? 6.792 -19.521 11.349 1.00 98.34 87 A 1 +ATOM 658 O OE1 . GLU A 1 87 ? 7.805 -18.810 11.489 1.00 95.48 87 A 1 +ATOM 659 O OE2 . GLU A 1 87 ? 5.948 -19.612 12.281 1.00 96.59 87 A 1 +ATOM 660 N N . PHE A 1 88 ? 2.769 -20.712 7.122 1.00 98.98 88 A 1 +ATOM 661 C CA . PHE A 1 88 ? 1.335 -20.672 6.815 1.00 98.90 88 A 1 +ATOM 662 C C . PHE A 1 88 ? 1.046 -21.049 5.348 1.00 98.93 88 A 1 +ATOM 663 O O . PHE A 1 88 ? 0.529 -20.229 4.583 1.00 98.89 88 A 1 +ATOM 664 C CB . PHE A 1 88 ? 0.776 -19.295 7.186 1.00 98.91 88 A 1 +ATOM 665 C CG . PHE A 1 88 ? 0.970 -18.933 8.643 1.00 98.94 88 A 1 +ATOM 666 C CD1 . PHE A 1 88 ? 0.145 -19.499 9.631 1.00 98.87 88 A 1 +ATOM 667 C CD2 . PHE A 1 88 ? 2.014 -18.072 9.014 1.00 98.88 88 A 1 +ATOM 668 C CE1 . PHE A 1 88 ? 0.363 -19.203 10.978 1.00 98.80 88 A 1 +ATOM 669 C CE2 . PHE A 1 88 ? 2.235 -17.775 10.371 1.00 98.80 88 A 1 +ATOM 670 C CZ . PHE A 1 88 ? 1.414 -18.343 11.355 1.00 98.83 88 A 1 +ATOM 671 N N . PRO A 1 89 ? 1.379 -22.284 4.917 1.00 98.89 89 A 1 +ATOM 672 C CA . PRO A 1 89 ? 1.269 -22.688 3.506 1.00 98.80 89 A 1 +ATOM 673 C C . PRO A 1 89 ? -0.168 -22.621 2.979 1.00 98.80 89 A 1 +ATOM 674 O O . PRO A 1 89 ? -0.353 -22.357 1.793 1.00 98.83 89 A 1 +ATOM 675 C CB . PRO A 1 89 ? 1.825 -24.108 3.450 1.00 98.82 89 A 1 +ATOM 676 C CG . PRO A 1 89 ? 1.635 -24.642 4.867 1.00 98.12 89 A 1 +ATOM 677 C CD . PRO A 1 89 ? 1.866 -23.395 5.718 1.00 98.87 89 A 1 +ATOM 678 N N . ILE A 1 90 ? -1.182 -22.808 3.845 1.00 98.85 90 A 1 +ATOM 679 C CA . ILE A 1 90 ? -2.600 -22.752 3.483 1.00 98.95 90 A 1 +ATOM 680 C C . ILE A 1 90 ? -3.056 -21.350 3.046 1.00 98.92 90 A 1 +ATOM 681 O O . ILE A 1 90 ? -3.947 -21.248 2.211 1.00 98.92 90 A 1 +ATOM 682 C CB . ILE A 1 90 ? -3.461 -23.304 4.639 1.00 98.86 90 A 1 +ATOM 683 C CG1 . ILE A 1 90 ? -4.905 -23.597 4.171 1.00 98.26 90 A 1 +ATOM 684 C CG2 . ILE A 1 90 ? -3.447 -22.365 5.859 1.00 98.31 90 A 1 +ATOM 685 C CD1 . ILE A 1 90 ? -5.764 -24.330 5.215 1.00 97.70 90 A 1 +ATOM 686 N N . LEU A 1 91 ? -2.452 -20.261 3.569 1.00 98.90 91 A 1 +ATOM 687 C CA . LEU A 1 91 ? -2.835 -18.893 3.211 1.00 98.99 91 A 1 +ATOM 688 C C . LEU A 1 91 ? -2.326 -18.543 1.811 1.00 98.90 91 A 1 +ATOM 689 O O . LEU A 1 91 ? -1.188 -18.856 1.476 1.00 98.93 91 A 1 +ATOM 690 C CB . LEU A 1 91 ? -2.296 -17.880 4.240 1.00 98.95 91 A 1 +ATOM 691 C CG . LEU A 1 91 ? -2.779 -18.097 5.687 1.00 98.78 91 A 1 +ATOM 692 C CD1 . LEU A 1 91 ? -2.260 -16.966 6.576 1.00 98.70 91 A 1 +ATOM 693 C CD2 . LEU A 1 91 ? -4.304 -18.126 5.804 1.00 98.72 91 A 1 +ATOM 694 N N . SER A 1 92 ? -3.133 -17.858 1.017 1.00 98.90 92 A 1 +ATOM 695 C CA . SER A 1 92 ? -2.655 -17.228 -0.209 1.00 98.93 92 A 1 +ATOM 696 C C . SER A 1 92 ? -1.638 -16.125 0.107 1.00 98.92 92 A 1 +ATOM 697 O O . SER A 1 92 ? -1.634 -15.538 1.198 1.00 98.95 92 A 1 +ATOM 698 C CB . SER A 1 92 ? -3.828 -16.692 -1.041 1.00 98.92 92 A 1 +ATOM 699 O OG . SER A 1 92 ? -4.466 -15.636 -0.354 1.00 98.68 92 A 1 +ATOM 700 N N . TYR A 1 93 ? -0.736 -15.819 -0.837 1.00 98.84 93 A 1 +ATOM 701 C CA . TYR A 1 93 ? 0.118 -14.629 -0.726 1.00 98.96 93 A 1 +ATOM 702 C C . TYR A 1 93 ? -0.718 -13.351 -0.754 1.00 98.90 93 A 1 +ATOM 703 O O . TYR A 1 93 ? -0.424 -12.413 -0.018 1.00 98.88 93 A 1 +ATOM 704 C CB . TYR A 1 93 ? 1.149 -14.611 -1.855 1.00 98.87 93 A 1 +ATOM 705 C CG . TYR A 1 93 ? 2.322 -15.534 -1.635 1.00 98.85 93 A 1 +ATOM 706 C CD1 . TYR A 1 93 ? 3.460 -15.058 -0.951 1.00 98.65 93 A 1 +ATOM 707 C CD2 . TYR A 1 93 ? 2.302 -16.851 -2.122 1.00 98.62 93 A 1 +ATOM 708 C CE1 . TYR A 1 93 ? 4.582 -15.885 -0.774 1.00 98.48 93 A 1 +ATOM 709 C CE2 . TYR A 1 93 ? 3.416 -17.688 -1.941 1.00 98.43 93 A 1 +ATOM 710 C CZ . TYR A 1 93 ? 4.558 -17.209 -1.275 1.00 98.58 93 A 1 +ATOM 711 O OH . TYR A 1 93 ? 5.654 -18.007 -1.128 1.00 98.22 93 A 1 +ATOM 712 N N . ALA A 1 94 ? -1.801 -13.341 -1.540 1.00 98.93 94 A 1 +ATOM 713 C CA . ALA A 1 94 ? -2.787 -12.277 -1.613 1.00 98.99 94 A 1 +ATOM 714 C C . ALA A 1 94 ? -3.319 -11.878 -0.226 1.00 98.91 94 A 1 +ATOM 715 O O . ALA A 1 94 ? -3.183 -10.718 0.183 1.00 98.93 94 A 1 +ATOM 716 C CB . ALA A 1 94 ? -3.914 -12.773 -2.531 1.00 98.91 94 A 1 +ATOM 717 N N . ASP A 1 95 ? -3.846 -12.848 0.534 1.00 98.92 95 A 1 +ATOM 718 C CA . ASP A 1 95 ? -4.335 -12.608 1.892 1.00 98.99 95 A 1 +ATOM 719 C C . ASP A 1 95 ? -3.197 -12.247 2.848 1.00 98.94 95 A 1 +ATOM 720 O O . ASP A 1 95 ? -3.328 -11.324 3.646 1.00 98.93 95 A 1 +ATOM 721 C CB . ASP A 1 95 ? -5.087 -13.832 2.421 1.00 98.90 95 A 1 +ATOM 722 C CG . ASP A 1 95 ? -6.561 -13.879 2.000 1.00 98.92 95 A 1 +ATOM 723 O OD1 . ASP A 1 95 ? -7.106 -12.849 1.544 1.00 98.61 95 A 1 +ATOM 724 O OD2 . ASP A 1 95 ? -7.189 -14.936 2.202 1.00 98.66 95 A 1 +ATOM 725 N N . PHE A 1 96 ? -2.053 -12.930 2.747 1.00 98.90 96 A 1 +ATOM 726 C CA . PHE A 1 96 ? -0.934 -12.718 3.662 1.00 98.92 96 A 1 +ATOM 727 C C . PHE A 1 96 ? -0.354 -11.297 3.575 1.00 98.99 96 A 1 +ATOM 728 O O . PHE A 1 96 ? -0.071 -10.683 4.602 1.00 98.93 96 A 1 +ATOM 729 C CB . PHE A 1 96 ? 0.133 -13.779 3.384 1.00 98.91 96 A 1 +ATOM 730 C CG . PHE A 1 96 ? 1.190 -13.844 4.462 1.00 98.90 96 A 1 +ATOM 731 C CD1 . PHE A 1 96 ? 2.461 -13.271 4.258 1.00 98.77 96 A 1 +ATOM 732 C CD2 . PHE A 1 96 ? 0.896 -14.469 5.686 1.00 98.78 96 A 1 +ATOM 733 C CE1 . PHE A 1 96 ? 3.430 -13.335 5.266 1.00 98.68 96 A 1 +ATOM 734 C CE2 . PHE A 1 96 ? 1.870 -14.536 6.694 1.00 98.63 96 A 1 +ATOM 735 C CZ . PHE A 1 96 ? 3.136 -13.968 6.484 1.00 98.77 96 A 1 +ATOM 736 N N . TYR A 1 97 ? -0.223 -10.736 2.365 1.00 98.92 97 A 1 +ATOM 737 C CA . TYR A 1 97 ? 0.272 -9.370 2.182 1.00 98.98 97 A 1 +ATOM 738 C C . TYR A 1 97 ? -0.747 -8.314 2.618 1.00 98.90 97 A 1 +ATOM 739 O O . TYR A 1 97 ? -0.350 -7.335 3.259 1.00 98.89 97 A 1 +ATOM 740 C CB . TYR A 1 97 ? 0.701 -9.153 0.729 1.00 98.92 97 A 1 +ATOM 741 C CG . TYR A 1 97 ? 1.878 -9.980 0.244 1.00 98.91 97 A 1 +ATOM 742 C CD1 . TYR A 1 97 ? 2.868 -10.454 1.127 1.00 98.75 97 A 1 +ATOM 743 C CD2 . TYR A 1 97 ? 2.006 -10.247 -1.133 1.00 98.70 97 A 1 +ATOM 744 C CE1 . TYR A 1 97 ? 3.970 -11.199 0.651 1.00 98.61 97 A 1 +ATOM 745 C CE2 . TYR A 1 97 ? 3.098 -10.981 -1.619 1.00 98.58 97 A 1 +ATOM 746 C CZ . TYR A 1 97 ? 4.085 -11.457 -0.729 1.00 98.70 97 A 1 +ATOM 747 O OH . TYR A 1 97 ? 5.140 -12.168 -1.201 1.00 98.35 97 A 1 +ATOM 748 N N . GLN A 1 98 ? -2.044 -8.510 2.365 1.00 98.91 98 A 1 +ATOM 749 C CA . GLN A 1 98 ? -3.062 -7.591 2.875 1.00 98.99 98 A 1 +ATOM 750 C C . GLN A 1 98 ? -3.165 -7.653 4.406 1.00 98.94 98 A 1 +ATOM 751 O O . GLN A 1 98 ? -3.256 -6.618 5.059 1.00 98.93 98 A 1 +ATOM 752 C CB . GLN A 1 98 ? -4.426 -7.848 2.202 1.00 98.93 98 A 1 +ATOM 753 C CG . GLN A 1 98 ? -4.414 -7.562 0.688 1.00 98.63 98 A 1 +ATOM 754 C CD . GLN A 1 98 ? -3.843 -6.193 0.335 1.00 98.72 98 A 1 +ATOM 755 O OE1 . GLN A 1 98 ? -4.204 -5.178 0.894 1.00 95.21 98 A 1 +ATOM 756 N NE2 . GLN A 1 98 ? -2.902 -6.111 -0.574 1.00 95.78 98 A 1 +ATOM 757 N N . LEU A 1 99 ? -3.050 -8.855 5.003 1.00 98.89 99 A 1 +ATOM 758 C CA . LEU A 1 99 ? -2.992 -9.016 6.455 1.00 98.87 99 A 1 +ATOM 759 C C . LEU A 1 99 ? -1.759 -8.323 7.053 1.00 98.94 99 A 1 +ATOM 760 O O . LEU A 1 99 ? -1.873 -7.683 8.097 1.00 98.94 99 A 1 +ATOM 761 C CB . LEU A 1 99 ? -3.022 -10.518 6.794 1.00 98.92 99 A 1 +ATOM 762 C CG . LEU A 1 99 ? -3.097 -10.824 8.294 1.00 98.77 99 A 1 +ATOM 763 C CD1 . LEU A 1 99 ? -4.391 -10.302 8.936 1.00 98.64 99 A 1 +ATOM 764 C CD2 . LEU A 1 99 ? -3.039 -12.339 8.511 1.00 98.65 99 A 1 +ATOM 765 N N . ALA A 1 100 ? -0.595 -8.388 6.394 1.00 98.93 100 A 1 +ATOM 766 C CA . ALA A 1 100 ? 0.601 -7.672 6.820 1.00 98.89 100 A 1 +ATOM 767 C C . ALA A 1 100 ? 0.400 -6.145 6.804 1.00 98.98 100 A 1 +ATOM 768 O O . ALA A 1 100 ? 0.827 -5.474 7.741 1.00 98.92 100 A 1 +ATOM 769 C CB . ALA A 1 100 ? 1.792 -8.104 5.958 1.00 98.90 100 A 1 +ATOM 770 N N . GLY A 1 101 ? -0.302 -5.600 5.795 1.00 98.98 101 A 1 +ATOM 771 C CA . GLY A 1 101 ? -0.680 -4.182 5.735 1.00 98.92 101 A 1 +ATOM 772 C C . GLY A 1 101 ? -1.612 -3.758 6.870 1.00 98.99 101 A 1 +ATOM 773 O O . GLY A 1 101 ? -1.347 -2.767 7.546 1.00 98.94 101 A 1 +ATOM 774 N N . VAL A 1 102 ? -2.660 -4.547 7.151 1.00 98.94 102 A 1 +ATOM 775 C CA . VAL A 1 102 ? -3.573 -4.323 8.286 1.00 98.91 102 A 1 +ATOM 776 C C . VAL A 1 102 ? -2.818 -4.341 9.619 1.00 98.95 102 A 1 +ATOM 777 O O . VAL A 1 102 ? -3.008 -3.465 10.464 1.00 98.93 102 A 1 +ATOM 778 C CB . VAL A 1 102 ? -4.698 -5.380 8.282 1.00 98.90 102 A 1 +ATOM 779 C CG1 . VAL A 1 102 ? -5.527 -5.383 9.572 1.00 98.41 102 A 1 +ATOM 780 C CG2 . VAL A 1 102 ? -5.653 -5.151 7.111 1.00 98.48 102 A 1 +ATOM 781 N N . VAL A 1 103 ? -1.931 -5.322 9.817 1.00 98.94 103 A 1 +ATOM 782 C CA . VAL A 1 103 ? -1.119 -5.432 11.033 1.00 98.95 103 A 1 +ATOM 783 C C . VAL A 1 103 ? -0.128 -4.279 11.155 1.00 98.98 103 A 1 +ATOM 784 O O . VAL A 1 103 ? 0.092 -3.812 12.264 1.00 98.93 103 A 1 +ATOM 785 C CB . VAL A 1 103 ? -0.410 -6.792 11.086 1.00 98.91 103 A 1 +ATOM 786 C CG1 . VAL A 1 103 ? 0.639 -6.876 12.196 1.00 98.72 103 A 1 +ATOM 787 C CG2 . VAL A 1 103 ? -1.436 -7.899 11.363 1.00 98.70 103 A 1 +ATOM 788 N N . ALA A 1 104 ? 0.454 -3.789 10.046 1.00 98.98 104 A 1 +ATOM 789 C CA . ALA A 1 104 ? 1.369 -2.657 10.049 1.00 98.90 104 A 1 +ATOM 790 C C . ALA A 1 104 ? 0.725 -1.387 10.627 1.00 98.97 104 A 1 +ATOM 791 O O . ALA A 1 104 ? 1.345 -0.718 11.457 1.00 98.92 104 A 1 +ATOM 792 C CB . ALA A 1 104 ? 1.878 -2.428 8.627 1.00 98.91 104 A 1 +ATOM 793 N N . VAL A 1 105 ? -0.528 -1.107 10.256 1.00 98.99 105 A 1 +ATOM 794 C CA . VAL A 1 105 ? -1.320 -0.004 10.821 1.00 98.99 105 A 1 +ATOM 795 C C . VAL A 1 105 ? -1.581 -0.238 12.310 1.00 98.99 105 A 1 +ATOM 796 O O . VAL A 1 105 ? -1.311 0.623 13.135 1.00 98.89 105 A 1 +ATOM 797 C CB . VAL A 1 105 ? -2.637 0.172 10.046 1.00 98.92 105 A 1 +ATOM 798 C CG1 . VAL A 1 105 ? -3.515 1.277 10.625 1.00 98.78 105 A 1 +ATOM 799 C CG2 . VAL A 1 105 ? -2.350 0.514 8.578 1.00 98.83 105 A 1 +ATOM 800 N N . GLU A 1 106 ? -2.030 -1.445 12.674 1.00 98.98 106 A 1 +ATOM 801 C CA . GLU A 1 106 ? -2.365 -1.783 14.056 1.00 98.92 106 A 1 +ATOM 802 C C . GLU A 1 106 ? -1.172 -1.642 15.019 1.00 98.93 106 A 1 +ATOM 803 O O . GLU A 1 106 ? -1.297 -1.039 16.083 1.00 98.88 106 A 1 +ATOM 804 C CB . GLU A 1 106 ? -2.950 -3.215 14.091 1.00 98.78 106 A 1 +ATOM 805 C CG . GLU A 1 106 ? -3.503 -3.590 15.479 1.00 97.73 106 A 1 +ATOM 806 C CD . GLU A 1 106 ? -3.911 -5.069 15.600 1.00 97.86 106 A 1 +ATOM 807 O OE1 . GLU A 1 106 ? -3.874 -5.604 16.734 1.00 94.35 106 A 1 +ATOM 808 O OE2 . GLU A 1 106 ? -4.253 -5.772 14.616 1.00 95.46 106 A 1 +ATOM 809 N N . VAL A 1 107 ? 0.004 -2.184 14.668 1.00 98.83 107 A 1 +ATOM 810 C CA . VAL A 1 107 ? 1.173 -2.190 15.572 1.00 98.85 107 A 1 +ATOM 811 C C . VAL A 1 107 ? 1.872 -0.837 15.692 1.00 98.86 107 A 1 +ATOM 812 O O . VAL A 1 107 ? 2.703 -0.666 16.576 1.00 98.81 107 A 1 +ATOM 813 C CB . VAL A 1 107 ? 2.210 -3.272 15.222 1.00 98.82 107 A 1 +ATOM 814 C CG1 . VAL A 1 107 ? 1.590 -4.670 15.263 1.00 98.29 107 A 1 +ATOM 815 C CG2 . VAL A 1 107 ? 2.909 -3.036 13.886 1.00 98.31 107 A 1 +ATOM 816 N N . THR A 1 108 ? 1.542 0.121 14.814 1.00 98.82 108 A 1 +ATOM 817 C CA . THR A 1 108 ? 2.000 1.505 14.904 1.00 98.96 108 A 1 +ATOM 818 C C . THR A 1 108 ? 1.012 2.419 15.636 1.00 98.80 108 A 1 +ATOM 819 O O . THR A 1 108 ? 1.291 3.597 15.797 1.00 98.79 108 A 1 +ATOM 820 C CB . THR A 1 108 ? 2.375 2.067 13.526 1.00 98.89 108 A 1 +ATOM 821 O OG1 . THR A 1 108 ? 1.367 1.858 12.573 1.00 98.71 108 A 1 +ATOM 822 C CG2 . THR A 1 108 ? 3.643 1.407 12.987 1.00 98.54 108 A 1 +ATOM 823 N N . GLY A 1 109 ? -0.097 1.871 16.155 1.00 98.88 109 A 1 +ATOM 824 C CA . GLY A 1 109 ? -1.087 2.601 16.951 1.00 98.85 109 A 1 +ATOM 825 C C . GLY A 1 109 ? -2.306 3.080 16.165 1.00 98.95 109 A 1 +ATOM 826 O O . GLY A 1 109 ? -3.157 3.754 16.732 1.00 98.75 109 A 1 +ATOM 827 N N . GLY A 1 110 ? -2.410 2.728 14.874 1.00 98.80 110 A 1 +ATOM 828 C CA . GLY A 1 110 ? -3.524 3.113 14.017 1.00 98.83 110 A 1 +ATOM 829 C C . GLY A 1 110 ? -4.812 2.307 14.231 1.00 98.95 110 A 1 +ATOM 830 O O . GLY A 1 110 ? -4.870 1.403 15.071 1.00 98.83 110 A 1 +ATOM 831 N N . PRO A 1 111 ? -5.868 2.599 13.448 1.00 98.95 111 A 1 +ATOM 832 C CA . PRO A 1 111 ? -7.164 1.943 13.590 1.00 98.84 111 A 1 +ATOM 833 C C . PRO A 1 111 ? -7.112 0.445 13.249 1.00 98.83 111 A 1 +ATOM 834 O O . PRO A 1 111 ? -6.289 -0.041 12.477 1.00 98.79 111 A 1 +ATOM 835 C CB . PRO A 1 111 ? -8.111 2.701 12.651 1.00 98.86 111 A 1 +ATOM 836 C CG . PRO A 1 111 ? -7.179 3.228 11.571 1.00 98.65 111 A 1 +ATOM 837 C CD . PRO A 1 111 ? -5.908 3.558 12.356 1.00 98.92 111 A 1 +ATOM 838 N N . LYS A 1 112 ? -8.070 -0.308 13.795 1.00 98.70 112 A 1 +ATOM 839 C CA . LYS A 1 112 ? -8.272 -1.715 13.442 1.00 98.67 112 A 1 +ATOM 840 C C . LYS A 1 112 ? -9.042 -1.809 12.126 1.00 98.75 112 A 1 +ATOM 841 O O . LYS A 1 112 ? -10.270 -1.759 12.129 1.00 98.43 112 A 1 +ATOM 842 C CB . LYS A 1 112 ? -8.985 -2.467 14.569 1.00 97.97 112 A 1 +ATOM 843 C CG . LYS A 1 112 ? -8.101 -2.594 15.810 1.00 92.04 112 A 1 +ATOM 844 C CD . LYS A 1 112 ? -8.854 -3.355 16.911 1.00 84.64 112 A 1 +ATOM 845 C CE . LYS A 1 112 ? -7.979 -3.408 18.154 1.00 75.60 112 A 1 +ATOM 846 N NZ . LYS A 1 112 ? -8.717 -3.993 19.295 1.00 64.63 112 A 1 +ATOM 847 N N . VAL A 1 113 ? -8.324 -1.986 11.031 1.00 98.83 113 A 1 +ATOM 848 C CA . VAL A 1 113 ? -8.918 -2.206 9.712 1.00 98.99 113 A 1 +ATOM 849 C C . VAL A 1 113 ? -9.548 -3.608 9.656 1.00 98.94 113 A 1 +ATOM 850 O O . VAL A 1 113 ? -8.854 -4.589 9.959 1.00 98.87 113 A 1 +ATOM 851 C CB . VAL A 1 113 ? -7.870 -2.016 8.605 1.00 98.92 113 A 1 +ATOM 852 C CG1 . VAL A 1 113 ? -8.499 -2.158 7.210 1.00 98.81 113 A 1 +ATOM 853 C CG2 . VAL A 1 113 ? -7.209 -0.636 8.688 1.00 98.81 113 A 1 +ATOM 854 N N . PRO A 1 114 ? -10.837 -3.758 9.284 1.00 98.98 114 A 1 +ATOM 855 C CA . PRO A 1 114 ? -11.451 -5.060 9.091 1.00 98.80 114 A 1 +ATOM 856 C C . PRO A 1 114 ? -10.727 -5.875 8.009 1.00 98.97 114 A 1 +ATOM 857 O O . PRO A 1 114 ? -10.330 -5.346 6.977 1.00 98.87 114 A 1 +ATOM 858 C CB . PRO A 1 114 ? -12.907 -4.797 8.724 1.00 98.80 114 A 1 +ATOM 859 C CG . PRO A 1 114 ? -13.181 -3.410 9.305 1.00 98.38 114 A 1 +ATOM 860 C CD . PRO A 1 114 ? -11.835 -2.708 9.129 1.00 98.83 114 A 1 +ATOM 861 N N . PHE A 1 115 ? -10.580 -7.189 8.248 1.00 98.97 115 A 1 +ATOM 862 C CA . PHE A 1 115 ? -9.938 -8.110 7.311 1.00 98.94 115 A 1 +ATOM 863 C C . PHE A 1 115 ? -10.836 -9.318 7.042 1.00 98.97 115 A 1 +ATOM 864 O O . PHE A 1 115 ? -11.231 -10.009 7.985 1.00 98.92 115 A 1 +ATOM 865 C CB . PHE A 1 115 ? -8.572 -8.541 7.859 1.00 98.94 115 A 1 +ATOM 866 C CG . PHE A 1 115 ? -7.858 -9.527 6.962 1.00 98.96 115 A 1 +ATOM 867 C CD1 . PHE A 1 115 ? -8.012 -10.914 7.162 1.00 98.93 115 A 1 +ATOM 868 C CD2 . PHE A 1 115 ? -7.081 -9.070 5.885 1.00 98.93 115 A 1 +ATOM 869 C CE1 . PHE A 1 115 ? -7.397 -11.830 6.296 1.00 98.89 115 A 1 +ATOM 870 C CE2 . PHE A 1 115 ? -6.454 -9.985 5.023 1.00 98.88 115 A 1 +ATOM 871 C CZ . PHE A 1 115 ? -6.619 -11.360 5.230 1.00 98.92 115 A 1 +ATOM 872 N N . HIS A 1 116 ? -11.107 -9.579 5.773 1.00 98.84 116 A 1 +ATOM 873 C CA . HIS A 1 116 ? -11.837 -10.756 5.319 1.00 98.83 116 A 1 +ATOM 874 C C . HIS A 1 116 ? -10.922 -11.618 4.434 1.00 98.87 116 A 1 +ATOM 875 O O . HIS A 1 116 ? -10.344 -11.094 3.475 1.00 98.87 116 A 1 +ATOM 876 C CB . HIS A 1 116 ? -13.105 -10.338 4.571 1.00 98.84 116 A 1 +ATOM 877 C CG . HIS A 1 116 ? -14.000 -9.447 5.398 1.00 98.60 116 A 1 +ATOM 878 N ND1 . HIS A 1 116 ? -14.027 -8.076 5.345 1.00 91.12 116 A 1 +ATOM 879 C CD2 . HIS A 1 116 ? -14.891 -9.824 6.361 1.00 93.45 116 A 1 +ATOM 880 C CE1 . HIS A 1 116 ? -14.920 -7.641 6.250 1.00 94.47 116 A 1 +ATOM 881 N NE2 . HIS A 1 116 ? -15.477 -8.681 6.896 1.00 95.89 116 A 1 +ATOM 882 N N . PRO A 1 117 ? -10.743 -12.922 4.746 1.00 98.95 117 A 1 +ATOM 883 C CA . PRO A 1 117 ? -9.899 -13.814 3.966 1.00 98.94 117 A 1 +ATOM 884 C C . PRO A 1 117 ? -10.614 -14.327 2.709 1.00 98.90 117 A 1 +ATOM 885 O O . PRO A 1 117 ? -11.841 -14.280 2.614 1.00 98.81 117 A 1 +ATOM 886 C CB . PRO A 1 117 ? -9.564 -14.951 4.924 1.00 98.88 117 A 1 +ATOM 887 C CG . PRO A 1 117 ? -10.828 -15.059 5.769 1.00 98.61 117 A 1 +ATOM 888 C CD . PRO A 1 117 ? -11.282 -13.606 5.906 1.00 98.90 117 A 1 +ATOM 889 N N . GLY A 1 118 ? -9.827 -14.890 1.786 1.00 98.87 118 A 1 +ATOM 890 C CA . GLY A 1 118 ? -10.334 -15.606 0.616 1.00 98.89 118 A 1 +ATOM 891 C C . GLY A 1 118 ? -9.855 -15.071 -0.731 1.00 98.81 118 A 1 +ATOM 892 O O . GLY A 1 118 ? -10.361 -15.503 -1.768 1.00 98.76 118 A 1 +ATOM 893 N N . ARG A 1 119 ? -8.898 -14.130 -0.757 1.00 98.82 119 A 1 +ATOM 894 C CA . ARG A 1 119 ? -8.248 -13.702 -2.004 1.00 98.93 119 A 1 +ATOM 895 C C . ARG A 1 119 ? -7.454 -14.862 -2.595 1.00 98.85 119 A 1 +ATOM 896 O O . ARG A 1 119 ? -6.660 -15.495 -1.895 1.00 98.86 119 A 1 +ATOM 897 C CB . ARG A 1 119 ? -7.304 -12.515 -1.773 1.00 98.87 119 A 1 +ATOM 898 C CG . ARG A 1 119 ? -8.026 -11.247 -1.310 1.00 98.57 119 A 1 +ATOM 899 C CD . ARG A 1 119 ? -7.023 -10.229 -0.767 1.00 98.65 119 A 1 +ATOM 900 N NE . ARG A 1 119 ? -7.691 -9.127 -0.075 1.00 98.57 119 A 1 +ATOM 901 C CZ . ARG A 1 119 ? -8.292 -9.195 1.106 1.00 98.80 119 A 1 +ATOM 902 N NH1 . ARG A 1 119 ? -8.321 -10.283 1.832 1.00 97.61 119 A 1 +ATOM 903 N NH2 . ARG A 1 119 ? -8.890 -8.161 1.594 1.00 97.81 119 A 1 +ATOM 904 N N . GLU A 1 120 ? -7.617 -15.120 -3.880 1.00 98.70 120 A 1 +ATOM 905 C CA . GLU A 1 120 ? -6.844 -16.121 -4.611 1.00 98.68 120 A 1 +ATOM 906 C C . GLU A 1 120 ? -5.580 -15.491 -5.217 1.00 98.72 120 A 1 +ATOM 907 O O . GLU A 1 120 ? -5.600 -14.347 -5.681 1.00 98.64 120 A 1 +ATOM 908 C CB . GLU A 1 120 ? -7.704 -16.764 -5.703 1.00 98.31 120 A 1 +ATOM 909 C CG . GLU A 1 120 ? -8.896 -17.542 -5.118 1.00 93.69 120 A 1 +ATOM 910 C CD . GLU A 1 120 ? -9.748 -18.232 -6.204 1.00 90.92 120 A 1 +ATOM 911 O OE1 . GLU A 1 120 ? -10.641 -19.020 -5.814 1.00 82.12 120 A 1 +ATOM 912 O OE2 . GLU A 1 120 ? -9.512 -17.983 -7.408 1.00 85.22 120 A 1 +ATOM 913 N N . ASP A 1 121 ? -4.478 -16.240 -5.233 1.00 98.70 121 A 1 +ATOM 914 C CA . ASP A 1 121 ? -3.267 -15.832 -5.932 1.00 98.72 121 A 1 +ATOM 915 C C . ASP A 1 121 ? -3.479 -15.942 -7.450 1.00 98.70 121 A 1 +ATOM 916 O O . ASP A 1 121 ? -3.773 -17.018 -7.980 1.00 98.37 121 A 1 +ATOM 917 C CB . ASP A 1 121 ? -2.050 -16.659 -5.481 1.00 98.75 121 A 1 +ATOM 918 C CG . ASP A 1 121 ? -1.580 -16.347 -4.056 1.00 98.82 121 A 1 +ATOM 919 O OD1 . ASP A 1 121 ? -1.821 -15.225 -3.558 1.00 98.38 121 A 1 +ATOM 920 O OD2 . ASP A 1 121 ? -0.913 -17.205 -3.450 1.00 98.36 121 A 1 +ATOM 921 N N . LYS A 1 122 ? -3.300 -14.828 -8.177 1.00 98.51 122 A 1 +ATOM 922 C CA . LYS A 1 122 ? -3.406 -14.789 -9.635 1.00 98.46 122 A 1 +ATOM 923 C C . LYS A 1 122 ? -2.030 -14.997 -10.288 1.00 98.49 122 A 1 +ATOM 924 O O . LYS A 1 122 ? -1.017 -14.587 -9.728 1.00 98.33 122 A 1 +ATOM 925 C CB . LYS A 1 122 ? -4.083 -13.496 -10.099 1.00 98.26 122 A 1 +ATOM 926 C CG . LYS A 1 122 ? -5.575 -13.473 -9.734 1.00 97.38 122 A 1 +ATOM 927 C CD . LYS A 1 122 ? -6.250 -12.206 -10.280 1.00 95.86 122 A 1 +ATOM 928 C CE . LYS A 1 122 ? -7.727 -12.180 -9.885 1.00 93.38 122 A 1 +ATOM 929 N NZ . LYS A 1 122 ? -8.367 -10.866 -10.190 1.00 86.23 122 A 1 +ATOM 930 N N . PRO A 1 123 ? -1.972 -15.620 -11.472 1.00 97.91 123 A 1 +ATOM 931 C CA . PRO A 1 123 ? -0.709 -15.939 -12.132 1.00 97.53 123 A 1 +ATOM 932 C C . PRO A 1 123 ? -0.050 -14.726 -12.800 1.00 97.50 123 A 1 +ATOM 933 O O . PRO A 1 123 ? 1.170 -14.600 -12.755 1.00 96.88 123 A 1 +ATOM 934 C CB . PRO A 1 123 ? -1.067 -17.028 -13.154 1.00 97.35 123 A 1 +ATOM 935 C CG . PRO A 1 123 ? -2.524 -16.741 -13.497 1.00 96.82 123 A 1 +ATOM 936 C CD . PRO A 1 123 ? -3.099 -16.218 -12.180 1.00 98.02 123 A 1 +ATOM 937 N N . GLU A 1 124 ? -0.846 -13.837 -13.401 1.00 97.15 124 A 1 +ATOM 938 C CA . GLU A 1 124 ? -0.344 -12.760 -14.250 1.00 96.91 124 A 1 +ATOM 939 C C . GLU A 1 124 ? -0.334 -11.413 -13.503 1.00 97.73 124 A 1 +ATOM 940 O O . GLU A 1 124 ? -1.394 -10.960 -13.049 1.00 97.61 124 A 1 +ATOM 941 C CB . GLU A 1 124 ? -1.200 -12.644 -15.521 1.00 95.42 124 A 1 +ATOM 942 C CG . GLU A 1 124 ? -1.130 -13.884 -16.432 1.00 83.67 124 A 1 +ATOM 943 C CD . GLU A 1 124 ? 0.289 -14.208 -16.929 1.00 78.91 124 A 1 +ATOM 944 O OE1 . GLU A 1 124 ? 0.563 -15.420 -17.115 1.00 71.60 124 A 1 +ATOM 945 O OE2 . GLU A 1 124 ? 1.075 -13.261 -17.119 1.00 71.44 124 A 1 +ATOM 946 N N . PRO A 1 125 ? 0.839 -10.752 -13.389 1.00 97.88 125 A 1 +ATOM 947 C CA . PRO A 1 125 ? 0.905 -9.399 -12.858 1.00 98.15 125 A 1 +ATOM 948 C C . PRO A 1 125 ? 0.245 -8.388 -13.812 1.00 98.34 125 A 1 +ATOM 949 O O . PRO A 1 125 ? 0.212 -8.595 -15.029 1.00 98.12 125 A 1 +ATOM 950 C CB . PRO A 1 125 ? 2.395 -9.110 -12.657 1.00 97.68 125 A 1 +ATOM 951 C CG . PRO A 1 125 ? 3.067 -9.970 -13.724 1.00 95.98 125 A 1 +ATOM 952 C CD . PRO A 1 125 ? 2.161 -11.198 -13.816 1.00 97.71 125 A 1 +ATOM 953 N N . PRO A 1 126 ? -0.276 -7.253 -13.296 1.00 98.04 126 A 1 +ATOM 954 C CA . PRO A 1 126 ? -0.770 -6.165 -14.117 1.00 98.00 126 A 1 +ATOM 955 C C . PRO A 1 126 ? 0.379 -5.480 -14.887 1.00 98.20 126 A 1 +ATOM 956 O O . PRO A 1 126 ? 1.540 -5.570 -14.481 1.00 98.25 126 A 1 +ATOM 957 C CB . PRO A 1 126 ? -1.433 -5.198 -13.134 1.00 97.94 126 A 1 +ATOM 958 C CG . PRO A 1 126 ? -0.595 -5.402 -11.870 1.00 97.45 126 A 1 +ATOM 959 C CD . PRO A 1 126 ? -0.298 -6.893 -11.890 1.00 98.18 126 A 1 +ATOM 960 N N . PRO A 1 127 ? 0.073 -4.731 -15.965 1.00 98.07 127 A 1 +ATOM 961 C CA . PRO A 1 127 ? 1.069 -3.905 -16.629 1.00 98.04 127 A 1 +ATOM 962 C C . PRO A 1 127 ? 1.592 -2.805 -15.696 1.00 98.27 127 A 1 +ATOM 963 O O . PRO A 1 127 ? 0.856 -2.283 -14.850 1.00 98.10 127 A 1 +ATOM 964 C CB . PRO A 1 127 ? 0.362 -3.329 -17.859 1.00 97.88 127 A 1 +ATOM 965 C CG . PRO A 1 127 ? -1.098 -3.287 -17.429 1.00 96.90 127 A 1 +ATOM 966 C CD . PRO A 1 127 ? -1.240 -4.528 -16.559 1.00 98.32 127 A 1 +ATOM 967 N N . GLU A 1 128 ? 2.855 -2.398 -15.880 1.00 97.42 128 A 1 +ATOM 968 C CA . GLU A 1 128 ? 3.472 -1.272 -15.175 1.00 97.63 128 A 1 +ATOM 969 C C . GLU A 1 128 ? 2.743 0.055 -15.467 1.00 97.66 128 A 1 +ATOM 970 O O . GLU A 1 128 ? 2.126 0.229 -16.518 1.00 97.15 128 A 1 +ATOM 971 C CB . GLU A 1 128 ? 4.970 -1.185 -15.525 1.00 96.57 128 A 1 +ATOM 972 C CG . GLU A 1 128 ? 5.711 -0.151 -14.659 1.00 95.39 128 A 1 +ATOM 973 C CD . GLU A 1 128 ? 7.245 -0.161 -14.776 1.00 95.37 128 A 1 +ATOM 974 O OE1 . GLU A 1 128 ? 7.882 0.525 -13.933 1.00 89.75 128 A 1 +ATOM 975 O OE2 . GLU A 1 128 ? 7.786 -0.855 -15.661 1.00 91.06 128 A 1 +ATOM 976 N N . GLY A 1 129 ? 2.840 1.022 -14.543 1.00 97.34 129 A 1 +ATOM 977 C CA . GLY A 1 129 ? 2.415 2.410 -14.743 1.00 97.18 129 A 1 +ATOM 978 C C . GLY A 1 129 ? 1.059 2.769 -14.147 1.00 97.74 129 A 1 +ATOM 979 O O . GLY A 1 129 ? 0.579 3.877 -14.371 1.00 96.93 129 A 1 +ATOM 980 N N . ARG A 1 130 ? 0.425 1.863 -13.385 1.00 97.93 130 A 1 +ATOM 981 C CA . ARG A 1 130 ? -0.888 2.110 -12.751 1.00 98.20 130 A 1 +ATOM 982 C C . ARG A 1 130 ? -0.812 2.805 -11.386 1.00 98.32 130 A 1 +ATOM 983 O O . ARG A 1 130 ? -1.806 3.386 -10.960 1.00 98.13 130 A 1 +ATOM 984 C CB . ARG A 1 130 ? -1.649 0.793 -12.605 1.00 98.17 130 A 1 +ATOM 985 C CG . ARG A 1 130 ? -2.076 0.226 -13.963 1.00 98.11 130 A 1 +ATOM 986 C CD . ARG A 1 130 ? -2.936 -1.009 -13.728 1.00 98.07 130 A 1 +ATOM 987 N NE . ARG A 1 130 ? -3.462 -1.564 -14.973 1.00 98.05 130 A 1 +ATOM 988 C CZ . ARG A 1 130 ? -4.315 -2.568 -15.054 1.00 98.19 130 A 1 +ATOM 989 N NH1 . ARG A 1 130 ? -4.725 -3.202 -13.988 1.00 97.38 130 A 1 +ATOM 990 N NH2 . ARG A 1 130 ? -4.776 -2.960 -16.199 1.00 97.09 130 A 1 +ATOM 991 N N . LEU A 1 131 ? 0.320 2.725 -10.681 1.00 98.06 131 A 1 +ATOM 992 C CA . LEU A 1 131 ? 0.503 3.350 -9.370 1.00 97.92 131 A 1 +ATOM 993 C C . LEU A 1 131 ? 0.700 4.868 -9.518 1.00 97.62 131 A 1 +ATOM 994 O O . LEU A 1 131 ? 1.199 5.315 -10.551 1.00 97.40 131 A 1 +ATOM 995 C CB . LEU A 1 131 ? 1.665 2.673 -8.634 1.00 97.98 131 A 1 +ATOM 996 C CG . LEU A 1 131 ? 1.378 1.209 -8.238 1.00 97.92 131 A 1 +ATOM 997 C CD1 . LEU A 1 131 ? 2.640 0.564 -7.694 1.00 97.79 131 A 1 +ATOM 998 C CD2 . LEU A 1 131 ? 0.291 1.097 -7.173 1.00 97.48 131 A 1 +ATOM 999 N N . PRO A 1 132 ? 0.302 5.685 -8.514 1.00 97.69 132 A 1 +ATOM 1000 C CA . PRO A 1 132 ? 0.341 7.139 -8.618 1.00 96.85 132 A 1 +ATOM 1001 C C . PRO A 1 132 ? 1.759 7.685 -8.739 1.00 96.15 132 A 1 +ATOM 1002 O O . PRO A 1 132 ? 2.703 7.192 -8.112 1.00 96.38 132 A 1 +ATOM 1003 C CB . PRO A 1 132 ? -0.388 7.662 -7.379 1.00 97.05 132 A 1 +ATOM 1004 C CG . PRO A 1 132 ? -0.211 6.543 -6.362 1.00 96.17 132 A 1 +ATOM 1005 C CD . PRO A 1 132 ? -0.248 5.286 -7.228 1.00 97.75 132 A 1 +ATOM 1006 N N . ASP A 1 133 ? 1.905 8.757 -9.526 1.00 95.53 133 A 1 +ATOM 1007 C CA . ASP A 1 133 ? 3.136 9.522 -9.711 1.00 95.44 133 A 1 +ATOM 1008 C C . ASP A 1 133 ? 3.191 10.660 -8.686 1.00 95.88 133 A 1 +ATOM 1009 O O . ASP A 1 133 ? 2.364 11.575 -8.709 1.00 96.41 133 A 1 +ATOM 1010 C CB . ASP A 1 133 ? 3.179 10.008 -11.163 1.00 95.19 133 A 1 +ATOM 1011 C CG . ASP A 1 133 ? 4.412 10.814 -11.568 1.00 95.08 133 A 1 +ATOM 1012 O OD1 . ASP A 1 133 ? 5.124 11.349 -10.686 1.00 93.63 133 A 1 +ATOM 1013 O OD2 . ASP A 1 133 ? 4.591 10.947 -12.801 1.00 92.61 133 A 1 +ATOM 1014 N N . ALA A 1 134 ? 4.177 10.617 -7.797 1.00 95.23 134 A 1 +ATOM 1015 C CA . ALA A 1 134 ? 4.382 11.585 -6.720 1.00 94.75 134 A 1 +ATOM 1016 C C . ALA A 1 134 ? 4.623 13.025 -7.192 1.00 95.63 134 A 1 +ATOM 1017 O O . ALA A 1 134 ? 4.480 13.966 -6.407 1.00 96.06 134 A 1 +ATOM 1018 C CB . ALA A 1 134 ? 5.572 11.084 -5.892 1.00 94.48 134 A 1 +ATOM 1019 N N . THR A 1 135 ? 4.986 13.229 -8.468 1.00 95.11 135 A 1 +ATOM 1020 C CA . THR A 1 135 ? 5.242 14.550 -9.058 1.00 95.47 135 A 1 +ATOM 1021 C C . THR A 1 135 ? 3.993 15.219 -9.621 1.00 96.50 135 A 1 +ATOM 1022 O O . THR A 1 135 ? 4.041 16.389 -10.014 1.00 96.60 135 A 1 +ATOM 1023 C CB . THR A 1 135 ? 6.330 14.492 -10.140 1.00 95.35 135 A 1 +ATOM 1024 O OG1 . THR A 1 135 ? 5.888 13.835 -11.299 1.00 94.55 135 A 1 +ATOM 1025 C CG2 . THR A 1 135 ? 7.607 13.802 -9.664 1.00 93.43 135 A 1 +ATOM 1026 N N . LYS A 1 136 ? 2.861 14.512 -9.653 1.00 95.68 136 A 1 +ATOM 1027 C CA . LYS A 1 136 ? 1.598 14.983 -10.225 1.00 96.65 136 A 1 +ATOM 1028 C C . LYS A 1 136 ? 0.603 15.441 -9.155 1.00 97.49 136 A 1 +ATOM 1029 O O . LYS A 1 136 ? 0.829 15.293 -7.956 1.00 97.73 136 A 1 +ATOM 1030 C CB . LYS A 1 136 ? 1.024 13.908 -11.156 1.00 97.00 136 A 1 +ATOM 1031 C CG . LYS A 1 136 ? 1.929 13.674 -12.363 1.00 96.28 136 A 1 +ATOM 1032 C CD . LYS A 1 136 ? 1.248 12.733 -13.359 1.00 94.63 136 A 1 +ATOM 1033 C CE . LYS A 1 136 ? 2.236 12.369 -14.465 1.00 92.19 136 A 1 +ATOM 1034 N NZ . LYS A 1 136 ? 1.719 11.240 -15.271 1.00 85.41 136 A 1 +ATOM 1035 N N . GLY A 1 137 ? -0.503 16.057 -9.598 1.00 97.10 137 A 1 +ATOM 1036 C CA . GLY A 1 137 ? -1.506 16.690 -8.756 1.00 97.67 137 A 1 +ATOM 1037 C C . GLY A 1 137 ? -2.849 15.958 -8.683 1.00 98.31 137 A 1 +ATOM 1038 O O . GLY A 1 137 ? -2.959 14.774 -8.998 1.00 98.47 137 A 1 +ATOM 1039 N N . SER A 1 138 ? -3.897 16.699 -8.281 1.00 98.59 138 A 1 +ATOM 1040 C CA . SER A 1 138 ? -5.239 16.194 -7.980 1.00 98.68 138 A 1 +ATOM 1041 C C . SER A 1 138 ? -5.925 15.465 -9.137 1.00 98.79 138 A 1 +ATOM 1042 O O . SER A 1 138 ? -6.544 14.431 -8.913 1.00 98.78 138 A 1 +ATOM 1043 C CB . SER A 1 138 ? -6.121 17.356 -7.507 1.00 98.26 138 A 1 +ATOM 1044 O OG . SER A 1 138 ? -6.075 18.431 -8.424 1.00 90.49 138 A 1 +ATOM 1045 N N . ASP A 1 139 ? -5.779 15.941 -10.370 1.00 98.43 139 A 1 +ATOM 1046 C CA . ASP A 1 139 ? -6.364 15.273 -11.551 1.00 98.44 139 A 1 +ATOM 1047 C C . ASP A 1 139 ? -5.788 13.863 -11.722 1.00 98.67 139 A 1 +ATOM 1048 O O . ASP A 1 139 ? -6.527 12.903 -11.955 1.00 98.55 139 A 1 +ATOM 1049 C CB . ASP A 1 139 ? -6.096 16.101 -12.817 1.00 98.19 139 A 1 +ATOM 1050 C CG . ASP A 1 139 ? -6.884 17.405 -12.870 1.00 96.48 139 A 1 +ATOM 1051 O OD1 . ASP A 1 139 ? -7.888 17.527 -12.133 1.00 94.37 139 A 1 +ATOM 1052 O OD2 . ASP A 1 139 ? -6.490 18.272 -13.683 1.00 93.75 139 A 1 +ATOM 1053 N N . HIS A 1 140 ? -4.474 13.718 -11.551 1.00 98.56 140 A 1 +ATOM 1054 C CA . HIS A 1 140 ? -3.810 12.425 -11.619 1.00 98.59 140 A 1 +ATOM 1055 C C . HIS A 1 140 ? -4.231 11.493 -10.477 1.00 98.66 140 A 1 +ATOM 1056 O O . HIS A 1 140 ? -4.480 10.308 -10.714 1.00 98.67 140 A 1 +ATOM 1057 C CB . HIS A 1 140 ? -2.297 12.628 -11.619 1.00 98.34 140 A 1 +ATOM 1058 C CG . HIS A 1 140 ? -1.552 11.329 -11.714 1.00 98.22 140 A 1 +ATOM 1059 N ND1 . HIS A 1 140 ? -1.609 10.434 -12.774 1.00 95.54 140 A 1 +ATOM 1060 C CD2 . HIS A 1 140 ? -0.750 10.790 -10.744 1.00 95.93 140 A 1 +ATOM 1061 C CE1 . HIS A 1 140 ? -0.843 9.387 -12.444 1.00 95.65 140 A 1 +ATOM 1062 N NE2 . HIS A 1 140 ? -0.306 9.571 -11.231 1.00 96.06 140 A 1 +ATOM 1063 N N . LEU A 1 141 ? -4.374 12.023 -9.252 1.00 98.66 141 A 1 +ATOM 1064 C CA . LEU A 1 141 ? -4.887 11.237 -8.130 1.00 98.65 141 A 1 +ATOM 1065 C C . LEU A 1 141 ? -6.290 10.708 -8.427 1.00 98.70 141 A 1 +ATOM 1066 O O . LEU A 1 141 ? -6.546 9.521 -8.249 1.00 98.76 141 A 1 +ATOM 1067 C CB . LEU A 1 141 ? -4.855 12.076 -6.836 1.00 98.70 141 A 1 +ATOM 1068 C CG . LEU A 1 141 ? -3.449 12.433 -6.326 1.00 98.38 141 A 1 +ATOM 1069 C CD1 . LEU A 1 141 ? -3.567 13.345 -5.103 1.00 98.40 141 A 1 +ATOM 1070 C CD2 . LEU A 1 141 ? -2.638 11.192 -5.921 1.00 98.20 141 A 1 +ATOM 1071 N N . ARG A 1 142 ? -7.187 11.544 -8.983 1.00 98.84 142 A 1 +ATOM 1072 C CA . ARG A 1 142 ? -8.540 11.109 -9.394 1.00 98.80 142 A 1 +ATOM 1073 C C . ARG A 1 142 ? -8.528 10.125 -10.563 1.00 98.72 142 A 1 +ATOM 1074 O O . ARG A 1 142 ? -9.382 9.240 -10.613 1.00 98.78 142 A 1 +ATOM 1075 C CB . ARG A 1 142 ? -9.398 12.324 -9.742 1.00 98.83 142 A 1 +ATOM 1076 C CG . ARG A 1 142 ? -9.771 13.121 -8.489 1.00 98.61 142 A 1 +ATOM 1077 C CD . ARG A 1 142 ? -10.748 14.228 -8.853 1.00 98.65 142 A 1 +ATOM 1078 N NE . ARG A 1 142 ? -11.146 14.969 -7.659 1.00 98.50 142 A 1 +ATOM 1079 C CZ . ARG A 1 142 ? -10.680 16.135 -7.250 1.00 98.74 142 A 1 +ATOM 1080 N NH1 . ARG A 1 142 ? -9.805 16.834 -7.925 1.00 97.97 142 A 1 +ATOM 1081 N NH2 . ARG A 1 142 ? -11.099 16.624 -6.126 1.00 98.16 142 A 1 +ATOM 1082 N N . ASP A 1 143 ? -7.592 10.251 -11.500 1.00 98.86 143 A 1 +ATOM 1083 C CA . ASP A 1 143 ? -7.436 9.267 -12.575 1.00 98.73 143 A 1 +ATOM 1084 C C . ASP A 1 143 ? -7.078 7.884 -12.004 1.00 98.75 143 A 1 +ATOM 1085 O O . ASP A 1 143 ? -7.717 6.891 -12.351 1.00 98.63 143 A 1 +ATOM 1086 C CB . ASP A 1 143 ? -6.384 9.729 -13.595 1.00 98.68 143 A 1 +ATOM 1087 C CG . ASP A 1 143 ? -6.862 10.836 -14.538 1.00 97.93 143 A 1 +ATOM 1088 O OD1 . ASP A 1 143 ? -8.095 11.022 -14.655 1.00 96.56 143 A 1 +ATOM 1089 O OD2 . ASP A 1 143 ? -6.021 11.418 -15.250 1.00 96.29 143 A 1 +ATOM 1090 N N . VAL A 1 144 ? -6.113 7.832 -11.084 1.00 98.78 144 A 1 +ATOM 1091 C CA . VAL A 1 144 ? -5.606 6.578 -10.502 1.00 98.70 144 A 1 +ATOM 1092 C C . VAL A 1 144 ? -6.595 5.995 -9.495 1.00 98.79 144 A 1 +ATOM 1093 O O . VAL A 1 144 ? -7.078 4.876 -9.673 1.00 98.69 144 A 1 +ATOM 1094 C CB . VAL A 1 144 ? -4.202 6.803 -9.907 1.00 98.69 144 A 1 +ATOM 1095 C CG1 . VAL A 1 144 ? -3.694 5.559 -9.165 1.00 98.41 144 A 1 +ATOM 1096 C CG2 . VAL A 1 144 ? -3.188 7.121 -11.012 1.00 98.46 144 A 1 +ATOM 1097 N N . PHE A 1 145 ? -6.938 6.739 -8.431 1.00 98.87 145 A 1 +ATOM 1098 C CA . PHE A 1 145 ? -7.797 6.224 -7.357 1.00 98.87 145 A 1 +ATOM 1099 C C . PHE A 1 145 ? -9.272 6.167 -7.780 1.00 98.74 145 A 1 +ATOM 1100 O O . PHE A 1 145 ? -9.960 5.188 -7.491 1.00 98.56 145 A 1 +ATOM 1101 C CB . PHE A 1 145 ? -7.618 7.075 -6.096 1.00 98.81 145 A 1 +ATOM 1102 C CG . PHE A 1 145 ? -6.281 6.903 -5.386 1.00 98.81 145 A 1 +ATOM 1103 C CD1 . PHE A 1 145 ? -6.159 5.958 -4.347 1.00 98.67 145 A 1 +ATOM 1104 C CD2 . PHE A 1 145 ? -5.171 7.686 -5.740 1.00 98.66 145 A 1 +ATOM 1105 C CE1 . PHE A 1 145 ? -4.944 5.802 -3.680 1.00 98.48 145 A 1 +ATOM 1106 C CE2 . PHE A 1 145 ? -3.946 7.529 -5.067 1.00 98.44 145 A 1 +ATOM 1107 C CZ . PHE A 1 145 ? -3.835 6.584 -4.034 1.00 98.45 145 A 1 +ATOM 1108 N N . GLY A 1 146 ? -9.763 7.190 -8.490 1.00 98.73 146 A 1 +ATOM 1109 C CA . GLY A 1 146 ? -11.166 7.281 -8.879 1.00 98.61 146 A 1 +ATOM 1110 C C . GLY A 1 146 ? -11.496 6.487 -10.136 1.00 98.50 146 A 1 +ATOM 1111 O O . GLY A 1 146 ? -12.334 5.579 -10.110 1.00 98.20 146 A 1 +ATOM 1112 N N . LYS A 1 147 ? -10.865 6.832 -11.279 1.00 98.52 147 A 1 +ATOM 1113 C CA . LYS A 1 147 ? -11.227 6.214 -12.567 1.00 98.48 147 A 1 +ATOM 1114 C C . LYS A 1 147 ? -10.761 4.764 -12.666 1.00 98.33 147 A 1 +ATOM 1115 O O . LYS A 1 147 ? -11.564 3.938 -13.102 1.00 98.20 147 A 1 +ATOM 1116 C CB . LYS A 1 147 ? -10.720 7.033 -13.759 1.00 98.50 147 A 1 +ATOM 1117 C CG . LYS A 1 147 ? -11.338 8.443 -13.827 1.00 96.59 147 A 1 +ATOM 1118 C CD . LYS A 1 147 ? -10.773 9.202 -15.033 1.00 93.03 147 A 1 +ATOM 1119 C CE . LYS A 1 147 ? -11.235 10.668 -15.018 1.00 89.33 147 A 1 +ATOM 1120 N NZ . LYS A 1 147 ? -10.393 11.496 -15.901 1.00 80.36 147 A 1 +ATOM 1121 N N . ALA A 1 148 ? -9.530 4.467 -12.236 1.00 98.50 148 A 1 +ATOM 1122 C CA . ALA A 1 148 ? -9.012 3.106 -12.273 1.00 98.54 148 A 1 +ATOM 1123 C C . ALA A 1 148 ? -9.516 2.274 -11.081 1.00 98.56 148 A 1 +ATOM 1124 O O . ALA A 1 148 ? -10.307 1.345 -11.290 1.00 98.35 148 A 1 +ATOM 1125 C CB . ALA A 1 148 ? -7.485 3.118 -12.417 1.00 98.57 148 A 1 +ATOM 1126 N N . MET A 1 149 ? -9.162 2.631 -9.838 1.00 98.52 149 A 1 +ATOM 1127 C CA . MET A 1 149 ? -9.494 1.803 -8.667 1.00 98.58 149 A 1 +ATOM 1128 C C . MET A 1 149 ? -10.981 1.832 -8.293 1.00 98.32 149 A 1 +ATOM 1129 O O . MET A 1 149 ? -11.525 0.829 -7.839 1.00 98.29 149 A 1 +ATOM 1130 C CB . MET A 1 149 ? -8.658 2.201 -7.449 1.00 98.73 149 A 1 +ATOM 1131 C CG . MET A 1 149 ? -7.144 2.127 -7.683 1.00 98.64 149 A 1 +ATOM 1132 S SD . MET A 1 149 ? -6.212 2.611 -6.203 1.00 98.51 149 A 1 +ATOM 1133 C CE . MET A 1 149 ? -4.623 3.000 -6.953 1.00 96.29 149 A 1 +ATOM 1134 N N . GLY A 1 150 ? -11.667 2.971 -8.495 1.00 98.11 150 A 1 +ATOM 1135 C CA . GLY A 1 150 ? -13.064 3.145 -8.101 1.00 97.92 150 A 1 +ATOM 1136 C C . GLY A 1 150 ? -13.267 3.637 -6.669 1.00 98.01 150 A 1 +ATOM 1137 O O . GLY A 1 150 ? -14.358 3.465 -6.131 1.00 97.95 150 A 1 +ATOM 1138 N N . LEU A 1 151 ? -12.243 4.237 -6.072 1.00 98.31 151 A 1 +ATOM 1139 C CA . LEU A 1 151 ? -12.278 4.861 -4.747 1.00 98.55 151 A 1 +ATOM 1140 C C . LEU A 1 151 ? -12.793 6.313 -4.836 1.00 98.65 151 A 1 +ATOM 1141 O O . LEU A 1 151 ? -12.815 6.924 -5.905 1.00 98.67 151 A 1 +ATOM 1142 C CB . LEU A 1 151 ? -10.882 4.769 -4.110 1.00 98.65 151 A 1 +ATOM 1143 C CG . LEU A 1 151 ? -10.385 3.335 -3.862 1.00 98.52 151 A 1 +ATOM 1144 C CD1 . LEU A 1 151 ? -8.962 3.364 -3.285 1.00 98.45 151 A 1 +ATOM 1145 C CD2 . LEU A 1 151 ? -11.269 2.563 -2.879 1.00 98.37 151 A 1 +ATOM 1146 N N . THR A 1 152 ? -13.229 6.867 -3.697 1.00 98.61 152 A 1 +ATOM 1147 C CA . THR A 1 152 ? -13.785 8.220 -3.592 1.00 98.73 152 A 1 +ATOM 1148 C C . THR A 1 152 ? -12.710 9.266 -3.303 1.00 98.81 152 A 1 +ATOM 1149 O O . THR A 1 152 ? -11.604 8.943 -2.873 1.00 98.90 152 A 1 +ATOM 1150 C CB . THR A 1 152 ? -14.876 8.293 -2.508 1.00 98.76 152 A 1 +ATOM 1151 O OG1 . THR A 1 152 ? -14.323 8.089 -1.239 1.00 98.60 152 A 1 +ATOM 1152 C CG2 . THR A 1 152 ? -15.996 7.274 -2.718 1.00 98.47 152 A 1 +ATOM 1153 N N . ASP A 1 153 ? -13.048 10.554 -3.466 1.00 98.88 153 A 1 +ATOM 1154 C CA . ASP A 1 153 ? -12.177 11.667 -3.067 1.00 98.89 153 A 1 +ATOM 1155 C C . ASP A 1 153 ? -11.838 11.632 -1.566 1.00 98.94 153 A 1 +ATOM 1156 O O . ASP A 1 153 ? -10.711 11.934 -1.172 1.00 98.91 153 A 1 +ATOM 1157 C CB . ASP A 1 153 ? -12.854 12.999 -3.436 1.00 98.85 153 A 1 +ATOM 1158 C CG . ASP A 1 153 ? -12.678 13.419 -4.908 1.00 98.81 153 A 1 +ATOM 1159 O OD1 . ASP A 1 153 ? -12.162 12.631 -5.723 1.00 98.29 153 A 1 +ATOM 1160 O OD2 . ASP A 1 153 ? -13.000 14.587 -5.230 1.00 98.18 153 A 1 +ATOM 1161 N N . GLN A 1 154 ? -12.784 11.202 -0.714 1.00 98.90 154 A 1 +ATOM 1162 C CA . GLN A 1 154 ? -12.527 10.982 0.714 1.00 98.97 154 A 1 +ATOM 1163 C C . GLN A 1 154 ? -11.491 9.868 0.931 1.00 98.93 154 A 1 +ATOM 1164 O O . GLN A 1 154 ? -10.560 10.046 1.710 1.00 98.96 154 A 1 +ATOM 1165 C CB . GLN A 1 154 ? -13.837 10.668 1.441 1.00 98.90 154 A 1 +ATOM 1166 C CG . GLN A 1 154 ? -13.632 10.524 2.958 1.00 98.06 154 A 1 +ATOM 1167 C CD . GLN A 1 154 ? -14.955 10.306 3.692 1.00 97.85 154 A 1 +ATOM 1168 O OE1 . GLN A 1 154 ? -15.805 11.178 3.724 1.00 92.15 154 A 1 +ATOM 1169 N NE2 . GLN A 1 154 ? -15.162 9.154 4.282 1.00 90.59 154 A 1 +ATOM 1170 N N . ASP A 1 155 ? -11.619 8.757 0.201 1.00 98.89 155 A 1 +ATOM 1171 C CA . ASP A 1 155 ? -10.661 7.659 0.295 1.00 98.97 155 A 1 +ATOM 1172 C C . ASP A 1 155 ? -9.252 8.114 -0.117 1.00 98.96 155 A 1 +ATOM 1173 O O . ASP A 1 155 ? -8.281 7.742 0.543 1.00 98.93 155 A 1 +ATOM 1174 C CB . ASP A 1 155 ? -11.095 6.467 -0.577 1.00 98.86 155 A 1 +ATOM 1175 C CG . ASP A 1 155 ? -12.467 5.860 -0.248 1.00 98.79 155 A 1 +ATOM 1176 O OD1 . ASP A 1 155 ? -12.829 5.669 0.931 1.00 98.54 155 A 1 +ATOM 1177 O OD2 . ASP A 1 155 ? -13.212 5.537 -1.208 1.00 98.48 155 A 1 +ATOM 1178 N N . ILE A 1 156 ? -9.112 8.968 -1.150 1.00 98.85 156 A 1 +ATOM 1179 C CA . ILE A 1 156 ? -7.817 9.515 -1.582 1.00 98.81 156 A 1 +ATOM 1180 C C . ILE A 1 156 ? -7.125 10.243 -0.437 1.00 98.83 156 A 1 +ATOM 1181 O O . ILE A 1 156 ? -5.956 9.979 -0.157 1.00 98.89 156 A 1 +ATOM 1182 C CB . ILE A 1 156 ? -7.980 10.454 -2.806 1.00 98.89 156 A 1 +ATOM 1183 C CG1 . ILE A 1 156 ? -8.453 9.658 -4.038 1.00 98.82 156 A 1 +ATOM 1184 C CG2 . ILE A 1 156 ? -6.663 11.195 -3.126 1.00 98.85 156 A 1 +ATOM 1185 C CD1 . ILE A 1 156 ? -8.814 10.505 -5.263 1.00 98.70 156 A 1 +ATOM 1186 N N . VAL A 1 157 ? -7.845 11.162 0.225 1.00 98.82 157 A 1 +ATOM 1187 C CA . VAL A 1 157 ? -7.254 11.975 1.304 1.00 98.83 157 A 1 +ATOM 1188 C C . VAL A 1 157 ? -6.936 11.106 2.514 1.00 98.95 157 A 1 +ATOM 1189 O O . VAL A 1 157 ? -5.824 11.171 3.030 1.00 98.91 157 A 1 +ATOM 1190 C CB . VAL A 1 157 ? -8.151 13.166 1.674 1.00 98.91 157 A 1 +ATOM 1191 C CG1 . VAL A 1 157 ? -7.490 14.044 2.753 1.00 98.75 157 A 1 +ATOM 1192 C CG2 . VAL A 1 157 ? -8.400 14.060 0.460 1.00 98.78 157 A 1 +ATOM 1193 N N . ALA A 1 158 ? -7.862 10.238 2.929 1.00 98.91 158 A 1 +ATOM 1194 C CA . ALA A 1 158 ? -7.636 9.345 4.058 1.00 98.98 158 A 1 +ATOM 1195 C C . ALA A 1 158 ? -6.441 8.403 3.819 1.00 98.92 158 A 1 +ATOM 1196 O O . ALA A 1 158 ? -5.555 8.301 4.667 1.00 98.94 158 A 1 +ATOM 1197 C CB . ALA A 1 158 ? -8.934 8.576 4.337 1.00 98.94 158 A 1 +ATOM 1198 N N . LEU A 1 159 ? -6.338 7.772 2.643 1.00 98.89 159 A 1 +ATOM 1199 C CA . LEU A 1 159 ? -5.225 6.881 2.297 1.00 98.81 159 A 1 +ATOM 1200 C C . LEU A 1 159 ? -3.889 7.621 2.165 1.00 98.82 159 A 1 +ATOM 1201 O O . LEU A 1 159 ? -2.854 7.036 2.479 1.00 98.86 159 A 1 +ATOM 1202 C CB . LEU A 1 159 ? -5.533 6.129 0.994 1.00 98.86 159 A 1 +ATOM 1203 C CG . LEU A 1 159 ? -6.664 5.089 1.119 1.00 98.76 159 A 1 +ATOM 1204 C CD1 . LEU A 1 159 ? -7.013 4.562 -0.274 1.00 98.75 159 A 1 +ATOM 1205 C CD2 . LEU A 1 159 ? -6.293 3.912 2.010 1.00 98.70 159 A 1 +ATOM 1206 N N . SER A 1 160 ? -3.898 8.896 1.741 1.00 98.82 160 A 1 +ATOM 1207 C CA . SER A 1 160 ? -2.683 9.725 1.737 1.00 98.86 160 A 1 +ATOM 1208 C C . SER A 1 160 ? -2.113 9.876 3.145 1.00 98.84 160 A 1 +ATOM 1209 O O . SER A 1 160 ? -0.895 9.873 3.322 1.00 98.85 160 A 1 +ATOM 1210 C CB . SER A 1 160 ? -2.960 11.110 1.135 1.00 98.76 160 A 1 +ATOM 1211 O OG . SER A 1 160 ? -3.385 10.986 -0.201 1.00 98.04 160 A 1 +ATOM 1212 N N . GLY A 1 161 ? -2.975 9.861 4.168 1.00 98.85 161 A 1 +ATOM 1213 C CA . GLY A 1 161 ? -2.582 9.813 5.580 1.00 98.87 161 A 1 +ATOM 1214 C C . GLY A 1 161 ? -1.769 8.574 5.975 1.00 98.84 161 A 1 +ATOM 1215 O O . GLY A 1 161 ? -1.131 8.572 7.019 1.00 98.85 161 A 1 +ATOM 1216 N N . GLY A 1 162 ? -1.690 7.538 5.136 1.00 98.73 162 A 1 +ATOM 1217 C CA . GLY A 1 162 ? -0.739 6.435 5.317 1.00 98.72 162 A 1 +ATOM 1218 C C . GLY A 1 162 ? 0.728 6.876 5.356 1.00 98.88 162 A 1 +ATOM 1219 O O . GLY A 1 162 ? 1.561 6.196 5.957 1.00 98.74 162 A 1 +ATOM 1220 N N . HIS A 1 163 ? 1.053 8.048 4.788 1.00 98.60 163 A 1 +ATOM 1221 C CA . HIS A 1 163 ? 2.369 8.695 4.911 1.00 98.67 163 A 1 +ATOM 1222 C C . HIS A 1 163 ? 2.671 9.215 6.339 1.00 98.73 163 A 1 +ATOM 1223 O O . HIS A 1 163 ? 3.791 9.641 6.590 1.00 98.63 163 A 1 +ATOM 1224 C CB . HIS A 1 163 ? 2.494 9.821 3.890 1.00 98.51 163 A 1 +ATOM 1225 C CG . HIS A 1 163 ? 2.564 9.395 2.447 1.00 98.33 163 A 1 +ATOM 1226 N ND1 . HIS A 1 163 ? 2.286 10.203 1.367 1.00 96.36 163 A 1 +ATOM 1227 C CD2 . HIS A 1 163 ? 3.012 8.203 1.935 1.00 96.39 163 A 1 +ATOM 1228 C CE1 . HIS A 1 163 ? 2.539 9.518 0.242 1.00 96.16 163 A 1 +ATOM 1229 N NE2 . HIS A 1 163 ? 2.991 8.291 0.536 1.00 96.27 163 A 1 +ATOM 1230 N N . THR A 1 164 ? 1.718 9.134 7.269 1.00 98.77 164 A 1 +ATOM 1231 C CA . THR A 1 164 ? 2.000 9.408 8.685 1.00 98.70 164 A 1 +ATOM 1232 C C . THR A 1 164 ? 3.074 8.478 9.253 1.00 98.80 164 A 1 +ATOM 1233 O O . THR A 1 164 ? 3.814 8.866 10.153 1.00 98.74 164 A 1 +ATOM 1234 C CB . THR A 1 164 ? 0.722 9.357 9.528 1.00 98.70 164 A 1 +ATOM 1235 O OG1 . THR A 1 164 ? 0.952 10.028 10.740 1.00 97.59 164 A 1 +ATOM 1236 C CG2 . THR A 1 164 ? 0.228 7.940 9.842 1.00 97.83 164 A 1 +ATOM 1237 N N . ILE A 1 165 ? 3.233 7.271 8.661 1.00 98.56 165 A 1 +ATOM 1238 C CA . ILE A 1 165 ? 4.340 6.362 8.957 1.00 98.59 165 A 1 +ATOM 1239 C C . ILE A 1 165 ? 5.308 6.238 7.775 1.00 98.45 165 A 1 +ATOM 1240 O O . ILE A 1 165 ? 4.918 6.198 6.613 1.00 98.50 165 A 1 +ATOM 1241 C CB . ILE A 1 165 ? 3.861 4.989 9.477 1.00 98.62 165 A 1 +ATOM 1242 C CG1 . ILE A 1 165 ? 3.004 4.206 8.471 1.00 98.44 165 A 1 +ATOM 1243 C CG2 . ILE A 1 165 ? 3.119 5.184 10.811 1.00 98.24 165 A 1 +ATOM 1244 C CD1 . ILE A 1 165 ? 2.787 2.729 8.865 1.00 98.33 165 A 1 +ATOM 1245 N N . GLY A 1 166 ? 6.590 6.109 8.080 1.00 97.74 166 A 1 +ATOM 1246 C CA . GLY A 1 166 ? 7.633 5.807 7.107 1.00 97.82 166 A 1 +ATOM 1247 C C . GLY A 1 166 ? 8.354 7.023 6.546 1.00 98.27 166 A 1 +ATOM 1248 O O . GLY A 1 166 ? 8.306 8.127 7.088 1.00 98.29 166 A 1 +ATOM 1249 N N . ALA A 1 167 ? 9.107 6.781 5.483 1.00 96.81 167 A 1 +ATOM 1250 C CA . ALA A 1 167 ? 9.954 7.751 4.820 1.00 96.68 167 A 1 +ATOM 1251 C C . ALA A 1 167 ? 10.165 7.362 3.348 1.00 96.30 167 A 1 +ATOM 1252 O O . ALA A 1 167 ? 10.107 6.178 2.989 1.00 96.00 167 A 1 +ATOM 1253 C CB . ALA A 1 167 ? 11.304 7.812 5.554 1.00 96.69 167 A 1 +ATOM 1254 N N . ALA A 1 168 ? 10.465 8.359 2.516 1.00 94.07 168 A 1 +ATOM 1255 C CA . ALA A 1 168 ? 11.031 8.128 1.197 1.00 93.47 168 A 1 +ATOM 1256 C C . ALA A 1 168 ? 12.548 7.899 1.291 1.00 92.69 168 A 1 +ATOM 1257 O O . ALA A 1 168 ? 13.202 8.296 2.259 1.00 93.09 168 A 1 +ATOM 1258 C CB . ALA A 1 168 ? 10.666 9.283 0.277 1.00 94.92 168 A 1 +ATOM 1259 N N . HIS A 1 169 ? 13.100 7.234 0.279 1.00 93.54 169 A 1 +ATOM 1260 C CA . HIS A 1 169 ? 14.517 6.892 0.196 1.00 92.30 169 A 1 +ATOM 1261 C C . HIS A 1 169 ? 15.037 7.253 -1.195 1.00 91.67 169 A 1 +ATOM 1262 O O . HIS A 1 169 ? 14.458 6.827 -2.196 1.00 90.66 169 A 1 +ATOM 1263 C CB . HIS A 1 169 ? 14.695 5.400 0.460 1.00 92.82 169 A 1 +ATOM 1264 C CG . HIS A 1 169 ? 14.270 4.955 1.829 1.00 93.42 169 A 1 +ATOM 1265 N ND1 . HIS A 1 169 ? 15.042 5.011 2.967 1.00 86.78 169 A 1 +ATOM 1266 C CD2 . HIS A 1 169 ? 13.060 4.422 2.183 1.00 87.69 169 A 1 +ATOM 1267 C CE1 . HIS A 1 169 ? 14.309 4.527 3.979 1.00 89.12 169 A 1 +ATOM 1268 N NE2 . HIS A 1 169 ? 13.099 4.146 3.552 1.00 90.60 169 A 1 +ATOM 1269 N N . LYS A 1 170 ? 16.140 7.998 -1.244 1.00 95.55 170 A 1 +ATOM 1270 C CA . LYS A 1 170 ? 16.722 8.510 -2.490 1.00 95.30 170 A 1 +ATOM 1271 C C . LYS A 1 170 ? 17.078 7.411 -3.487 1.00 95.02 170 A 1 +ATOM 1272 O O . LYS A 1 170 ? 16.888 7.578 -4.680 1.00 92.33 170 A 1 +ATOM 1273 C CB . LYS A 1 170 ? 17.947 9.351 -2.117 1.00 93.70 170 A 1 +ATOM 1274 C CG . LYS A 1 170 ? 18.514 10.098 -3.323 1.00 81.83 170 A 1 +ATOM 1275 C CD . LYS A 1 170 ? 19.648 10.994 -2.839 1.00 80.18 170 A 1 +ATOM 1276 C CE . LYS A 1 170 ? 20.214 11.798 -3.998 1.00 70.05 170 A 1 +ATOM 1277 N NZ . LYS A 1 170 ? 21.240 12.735 -3.497 1.00 62.25 170 A 1 +ATOM 1278 N N . GLU A 1 171 ? 17.527 6.266 -2.990 1.00 92.31 171 A 1 +ATOM 1279 C CA . GLU A 1 171 ? 17.864 5.101 -3.810 1.00 92.11 171 A 1 +ATOM 1280 C C . GLU A 1 171 ? 16.644 4.321 -4.333 1.00 92.28 171 A 1 +ATOM 1281 O O . GLU A 1 171 ? 16.805 3.382 -5.113 1.00 89.27 171 A 1 +ATOM 1282 C CB . GLU A 1 171 ? 18.835 4.194 -3.027 1.00 91.37 171 A 1 +ATOM 1283 C CG . GLU A 1 171 ? 18.250 3.337 -1.889 1.00 84.08 171 A 1 +ATOM 1284 C CD . GLU A 1 171 ? 17.833 4.065 -0.608 1.00 79.17 171 A 1 +ATOM 1285 O OE1 . GLU A 1 171 ? 17.259 3.373 0.272 1.00 72.65 171 A 1 +ATOM 1286 O OE2 . GLU A 1 171 ? 18.032 5.284 -0.498 1.00 76.75 171 A 1 +ATOM 1287 N N . ARG A 1 172 ? 15.403 4.702 -3.915 1.00 91.35 172 A 1 +ATOM 1288 C CA . ARG A 1 172 ? 14.149 4.071 -4.360 1.00 90.74 172 A 1 +ATOM 1289 C C . ARG A 1 172 ? 13.363 4.995 -5.280 1.00 90.14 172 A 1 +ATOM 1290 O O . ARG A 1 172 ? 13.292 4.736 -6.476 1.00 89.20 172 A 1 +ATOM 1291 C CB . ARG A 1 172 ? 13.302 3.602 -3.164 1.00 92.02 172 A 1 +ATOM 1292 C CG . ARG A 1 172 ? 14.047 2.621 -2.247 1.00 93.17 172 A 1 +ATOM 1293 C CD . ARG A 1 172 ? 13.134 2.184 -1.097 1.00 90.33 172 A 1 +ATOM 1294 N NE . ARG A 1 172 ? 13.877 1.422 -0.082 1.00 90.84 172 A 1 +ATOM 1295 C CZ . ARG A 1 172 ? 13.456 1.126 1.128 1.00 89.43 172 A 1 +ATOM 1296 N NH1 . ARG A 1 172 ? 12.243 1.410 1.532 1.00 87.72 172 A 1 +ATOM 1297 N NH2 . ARG A 1 172 ? 14.251 0.538 1.974 1.00 87.33 172 A 1 +ATOM 1298 N N . SER A 1 173 ? 12.796 6.070 -4.724 1.00 90.76 173 A 1 +ATOM 1299 C CA . SER A 1 173 ? 11.944 7.017 -5.455 1.00 89.79 173 A 1 +ATOM 1300 C C . SER A 1 173 ? 12.682 8.280 -5.914 1.00 88.11 173 A 1 +ATOM 1301 O O . SER A 1 173 ? 12.143 9.044 -6.706 1.00 87.56 173 A 1 +ATOM 1302 C CB . SER A 1 173 ? 10.751 7.416 -4.579 1.00 92.16 173 A 1 +ATOM 1303 O OG . SER A 1 173 ? 11.206 8.058 -3.404 1.00 94.67 173 A 1 +ATOM 1304 N N . GLY A 1 174 ? 13.880 8.558 -5.381 1.00 91.74 174 A 1 +ATOM 1305 C CA . GLY A 1 174 ? 14.588 9.824 -5.567 1.00 91.49 174 A 1 +ATOM 1306 C C . GLY A 1 174 ? 14.248 10.899 -4.530 1.00 93.40 174 A 1 +ATOM 1307 O O . GLY A 1 174 ? 15.065 11.796 -4.306 1.00 92.08 174 A 1 +ATOM 1308 N N . PHE A 1 175 ? 13.089 10.806 -3.848 1.00 92.95 175 A 1 +ATOM 1309 C CA . PHE A 1 175 ? 12.753 11.617 -2.677 1.00 94.03 175 A 1 +ATOM 1310 C C . PHE A 1 175 ? 13.416 11.041 -1.422 1.00 94.91 175 A 1 +ATOM 1311 O O . PHE A 1 175 ? 13.774 9.867 -1.390 1.00 94.47 175 A 1 +ATOM 1312 C CB . PHE A 1 175 ? 11.235 11.691 -2.509 1.00 94.73 175 A 1 +ATOM 1313 C CG . PHE A 1 175 ? 10.515 12.354 -3.650 1.00 95.73 175 A 1 +ATOM 1314 C CD1 . PHE A 1 175 ? 10.427 13.756 -3.709 1.00 94.16 175 A 1 +ATOM 1315 C CD2 . PHE A 1 175 ? 9.923 11.585 -4.668 1.00 94.24 175 A 1 +ATOM 1316 C CE1 . PHE A 1 175 ? 9.762 14.391 -4.773 1.00 93.66 175 A 1 +ATOM 1317 C CE2 . PHE A 1 175 ? 9.258 12.211 -5.733 1.00 93.85 175 A 1 +ATOM 1318 C CZ . PHE A 1 175 ? 9.177 13.613 -5.786 1.00 94.71 175 A 1 +ATOM 1319 N N . GLU A 1 176 ? 13.562 11.864 -0.357 1.00 95.87 176 A 1 +ATOM 1320 C CA . GLU A 1 176 ? 14.272 11.457 0.853 1.00 96.57 176 A 1 +ATOM 1321 C C . GLU A 1 176 ? 13.651 12.061 2.116 1.00 97.25 176 A 1 +ATOM 1322 O O . GLU A 1 176 ? 13.320 13.241 2.152 1.00 97.24 176 A 1 +ATOM 1323 C CB . GLU A 1 176 ? 15.754 11.826 0.713 1.00 95.75 176 A 1 +ATOM 1324 C CG . GLU A 1 176 ? 16.626 11.322 1.879 1.00 93.56 176 A 1 +ATOM 1325 C CD . GLU A 1 176 ? 18.128 11.358 1.544 1.00 92.10 176 A 1 +ATOM 1326 O OE1 . GLU A 1 176 ? 18.857 10.496 2.091 1.00 83.77 176 A 1 +ATOM 1327 O OE2 . GLU A 1 176 ? 18.558 12.174 0.696 1.00 85.13 176 A 1 +ATOM 1328 N N . GLY A 1 177 ? 13.528 11.248 3.157 1.00 96.25 177 A 1 +ATOM 1329 C CA . GLY A 1 177 ? 13.104 11.659 4.492 1.00 96.87 177 A 1 +ATOM 1330 C C . GLY A 1 177 ? 11.674 11.261 4.868 1.00 97.72 177 A 1 +ATOM 1331 O O . GLY A 1 177 ? 10.904 10.804 4.020 1.00 97.93 177 A 1 +ATOM 1332 N N . PRO A 1 178 ? 11.323 11.390 6.164 1.00 97.42 178 A 1 +ATOM 1333 C CA . PRO A 1 178 ? 9.992 11.088 6.675 1.00 97.92 178 A 1 +ATOM 1334 C C . PRO A 1 178 ? 9.023 12.260 6.456 1.00 98.24 178 A 1 +ATOM 1335 O O . PRO A 1 178 ? 9.437 13.413 6.403 1.00 98.39 178 A 1 +ATOM 1336 C CB . PRO A 1 178 ? 10.211 10.813 8.165 1.00 98.15 178 A 1 +ATOM 1337 C CG . PRO A 1 178 ? 11.341 11.781 8.520 1.00 97.88 178 A 1 +ATOM 1338 C CD . PRO A 1 178 ? 12.202 11.809 7.255 1.00 98.37 178 A 1 +ATOM 1339 N N . TRP A 1 179 ? 7.708 11.961 6.410 1.00 98.57 179 A 1 +ATOM 1340 C CA . TRP A 1 179 ? 6.657 12.991 6.397 1.00 98.55 179 A 1 +ATOM 1341 C C . TRP A 1 179 ? 6.386 13.579 7.782 1.00 98.61 179 A 1 +ATOM 1342 O O . TRP A 1 179 ? 5.941 14.723 7.889 1.00 98.49 179 A 1 +ATOM 1343 C CB . TRP A 1 179 ? 5.370 12.396 5.825 1.00 98.40 179 A 1 +ATOM 1344 C CG . TRP A 1 179 ? 5.430 12.064 4.369 1.00 98.39 179 A 1 +ATOM 1345 C CD1 . TRP A 1 179 ? 5.001 12.871 3.372 1.00 98.33 179 A 1 +ATOM 1346 C CD2 . TRP A 1 179 ? 5.944 10.865 3.716 1.00 98.55 179 A 1 +ATOM 1347 N NE1 . TRP A 1 179 ? 5.209 12.263 2.148 1.00 98.25 179 A 1 +ATOM 1348 C CE2 . TRP A 1 179 ? 5.790 11.028 2.309 1.00 98.35 179 A 1 +ATOM 1349 C CE3 . TRP A 1 179 ? 6.526 9.665 4.170 1.00 98.35 179 A 1 +ATOM 1350 C CZ2 . TRP A 1 179 ? 6.189 10.029 1.389 1.00 98.16 179 A 1 +ATOM 1351 C CZ3 . TRP A 1 179 ? 6.932 8.672 3.256 1.00 98.04 179 A 1 +ATOM 1352 C CH2 . TRP A 1 179 ? 6.761 8.852 1.878 1.00 97.86 179 A 1 +ATOM 1353 N N . THR A 1 180 ? 6.655 12.814 8.845 1.00 98.38 180 A 1 +ATOM 1354 C CA . THR A 1 180 ? 6.359 13.193 10.230 1.00 98.40 180 A 1 +ATOM 1355 C C . THR A 1 180 ? 7.574 13.000 11.134 1.00 98.47 180 A 1 +ATOM 1356 O O . THR A 1 180 ? 8.486 12.228 10.839 1.00 98.55 180 A 1 +ATOM 1357 C CB . THR A 1 180 ? 5.160 12.399 10.785 1.00 98.49 180 A 1 +ATOM 1358 O OG1 . THR A 1 180 ? 5.491 11.051 10.977 1.00 97.97 180 A 1 +ATOM 1359 C CG2 . THR A 1 180 ? 3.940 12.458 9.863 1.00 97.87 180 A 1 +ATOM 1360 N N . SER A 1 181 ? 7.569 13.664 12.292 1.00 98.43 181 A 1 +ATOM 1361 C CA . SER A 1 181 ? 8.631 13.519 13.301 1.00 98.24 181 A 1 +ATOM 1362 C C . SER A 1 181 ? 8.642 12.152 13.986 1.00 98.36 181 A 1 +ATOM 1363 O O . SER A 1 181 ? 9.641 11.779 14.597 1.00 97.74 181 A 1 +ATOM 1364 C CB . SER A 1 181 ? 8.478 14.617 14.352 1.00 97.66 181 A 1 +ATOM 1365 O OG . SER A 1 181 ? 8.588 15.892 13.735 1.00 89.83 181 A 1 +ATOM 1366 N N . ASN A 1 182 ? 7.540 11.386 13.889 1.00 98.39 182 A 1 +ATOM 1367 C CA . ASN A 1 182 ? 7.358 10.088 14.542 1.00 98.20 182 A 1 +ATOM 1368 C C . ASN A 1 182 ? 6.998 8.987 13.525 1.00 98.61 182 A 1 +ATOM 1369 O O . ASN A 1 182 ? 5.902 8.434 13.580 1.00 98.38 182 A 1 +ATOM 1370 C CB . ASN A 1 182 ? 6.289 10.241 15.639 1.00 97.49 182 A 1 +ATOM 1371 C CG . ASN A 1 182 ? 6.735 11.161 16.753 1.00 91.37 182 A 1 +ATOM 1372 O OD1 . ASN A 1 182 ? 7.797 11.013 17.335 1.00 84.21 182 A 1 +ATOM 1373 N ND2 . ASN A 1 182 ? 5.922 12.133 17.089 1.00 81.77 182 A 1 +ATOM 1374 N N . PRO A 1 183 ? 7.902 8.607 12.602 1.00 98.30 183 A 1 +ATOM 1375 C CA . PRO A 1 183 ? 7.586 7.786 11.423 1.00 98.33 183 A 1 +ATOM 1376 C C . PRO A 1 183 ? 7.279 6.308 11.717 1.00 98.61 183 A 1 +ATOM 1377 O O . PRO A 1 183 ? 7.245 5.486 10.795 1.00 98.41 183 A 1 +ATOM 1378 C CB . PRO A 1 183 ? 8.798 7.965 10.504 1.00 97.88 183 A 1 +ATOM 1379 C CG . PRO A 1 183 ? 9.944 8.164 11.483 1.00 96.36 183 A 1 +ATOM 1380 C CD . PRO A 1 183 ? 9.299 9.016 12.569 1.00 98.23 183 A 1 +ATOM 1381 N N . LEU A 1 184 ? 7.094 5.929 12.989 1.00 98.59 184 A 1 +ATOM 1382 C CA . LEU A 1 184 ? 6.620 4.612 13.431 1.00 98.63 184 A 1 +ATOM 1383 C C . LEU A 1 184 ? 5.401 4.733 14.359 1.00 98.76 184 A 1 +ATOM 1384 O O . LEU A 1 184 ? 5.058 3.766 15.038 1.00 98.69 184 A 1 +ATOM 1385 C CB . LEU A 1 184 ? 7.762 3.831 14.110 1.00 98.61 184 A 1 +ATOM 1386 C CG . LEU A 1 184 ? 8.909 3.426 13.172 1.00 98.10 184 A 1 +ATOM 1387 C CD1 . LEU A 1 184 ? 10.001 2.737 13.989 1.00 97.51 184 A 1 +ATOM 1388 C CD2 . LEU A 1 184 ? 8.471 2.435 12.092 1.00 97.23 184 A 1 +ATOM 1389 N N . ILE A 1 185 ? 4.767 5.907 14.385 1.00 98.87 185 A 1 +ATOM 1390 C CA . ILE A 1 185 ? 3.523 6.165 15.116 1.00 98.83 185 A 1 +ATOM 1391 C C . ILE A 1 185 ? 2.464 6.524 14.082 1.00 98.93 185 A 1 +ATOM 1392 O O . ILE A 1 185 ? 2.647 7.451 13.299 1.00 98.90 185 A 1 +ATOM 1393 C CB . ILE A 1 185 ? 3.718 7.266 16.187 1.00 98.84 185 A 1 +ATOM 1394 C CG1 . ILE A 1 185 ? 4.807 6.833 17.192 1.00 98.21 185 A 1 +ATOM 1395 C CG2 . ILE A 1 185 ? 2.377 7.557 16.883 1.00 98.62 185 A 1 +ATOM 1396 C CD1 . ILE A 1 185 ? 5.048 7.821 18.344 1.00 92.26 185 A 1 +ATOM 1397 N N . PHE A 1 186 ? 1.366 5.772 14.079 1.00 98.98 186 A 1 +ATOM 1398 C CA . PHE A 1 186 ? 0.224 6.046 13.227 1.00 98.97 186 A 1 +ATOM 1399 C C . PHE A 1 186 ? -0.736 6.989 13.955 1.00 98.99 186 A 1 +ATOM 1400 O O . PHE A 1 186 ? -1.455 6.560 14.849 1.00 98.84 186 A 1 +ATOM 1401 C CB . PHE A 1 186 ? -0.443 4.726 12.806 1.00 98.91 186 A 1 +ATOM 1402 C CG . PHE A 1 186 ? -1.351 4.876 11.605 1.00 98.96 186 A 1 +ATOM 1403 C CD1 . PHE A 1 186 ? -2.566 5.567 11.705 1.00 98.94 186 A 1 +ATOM 1404 C CD2 . PHE A 1 186 ? -0.954 4.349 10.359 1.00 98.91 186 A 1 +ATOM 1405 C CE1 . PHE A 1 186 ? -3.367 5.756 10.572 1.00 98.88 186 A 1 +ATOM 1406 C CE2 . PHE A 1 186 ? -1.758 4.533 9.226 1.00 98.84 186 A 1 +ATOM 1407 C CZ . PHE A 1 186 ? -2.965 5.241 9.330 1.00 98.92 186 A 1 +ATOM 1408 N N . ASP A 1 187 ? -0.717 8.254 13.559 1.00 98.89 187 A 1 +ATOM 1409 C CA . ASP A 1 187 ? -1.565 9.324 14.074 1.00 98.80 187 A 1 +ATOM 1410 C C . ASP A 1 187 ? -1.954 10.275 12.924 1.00 98.82 187 A 1 +ATOM 1411 O O . ASP A 1 187 ? -1.693 9.984 11.749 1.00 98.81 187 A 1 +ATOM 1412 C CB . ASP A 1 187 ? -0.820 10.038 15.225 1.00 98.53 187 A 1 +ATOM 1413 C CG . ASP A 1 187 ? 0.507 10.701 14.829 1.00 98.46 187 A 1 +ATOM 1414 O OD1 . ASP A 1 187 ? 0.733 10.947 13.616 1.00 98.04 187 A 1 +ATOM 1415 O OD2 . ASP A 1 187 ? 1.308 11.035 15.721 1.00 97.35 187 A 1 +ATOM 1416 N N . ASN A 1 188 ? -2.569 11.418 13.215 1.00 98.83 188 A 1 +ATOM 1417 C CA . ASN A 1 188 ? -2.953 12.407 12.199 1.00 98.89 188 A 1 +ATOM 1418 C C . ASN A 1 188 ? -1.840 13.415 11.848 1.00 98.96 188 A 1 +ATOM 1419 O O . ASN A 1 188 ? -2.098 14.387 11.126 1.00 98.85 188 A 1 +ATOM 1420 C CB . ASN A 1 188 ? -4.271 13.079 12.609 1.00 98.78 188 A 1 +ATOM 1421 C CG . ASN A 1 188 ? -4.127 14.068 13.753 1.00 98.86 188 A 1 +ATOM 1422 O OD1 . ASN A 1 188 ? -3.155 14.088 14.487 1.00 97.57 188 A 1 +ATOM 1423 N ND2 . ASN A 1 188 ? -5.105 14.925 13.926 1.00 97.46 188 A 1 +ATOM 1424 N N . SER A 1 189 ? -0.602 13.200 12.312 1.00 98.88 189 A 1 +ATOM 1425 C CA . SER A 1 189 ? 0.513 14.148 12.158 1.00 98.74 189 A 1 +ATOM 1426 C C . SER A 1 189 ? 0.805 14.495 10.698 1.00 98.88 189 A 1 +ATOM 1427 O O . SER A 1 189 ? 1.167 15.630 10.418 1.00 98.77 189 A 1 +ATOM 1428 C CB . SER A 1 189 ? 1.798 13.618 12.793 1.00 98.35 189 A 1 +ATOM 1429 O OG . SER A 1 189 ? 1.676 13.530 14.191 1.00 93.98 189 A 1 +ATOM 1430 N N . TYR A 1 190 ? 0.592 13.578 9.763 1.00 98.84 190 A 1 +ATOM 1431 C CA . TYR A 1 190 ? 0.720 13.864 8.334 1.00 98.81 190 A 1 +ATOM 1432 C C . TYR A 1 190 ? -0.071 15.119 7.915 1.00 98.87 190 A 1 +ATOM 1433 O O . TYR A 1 190 ? 0.467 15.996 7.238 1.00 98.86 190 A 1 +ATOM 1434 C CB . TYR A 1 190 ? 0.246 12.651 7.524 1.00 98.85 190 A 1 +ATOM 1435 C CG . TYR A 1 190 ? 0.087 12.929 6.045 1.00 98.86 190 A 1 +ATOM 1436 C CD1 . TYR A 1 190 ? -1.192 13.176 5.500 1.00 98.85 190 A 1 +ATOM 1437 C CD2 . TYR A 1 190 ? 1.215 12.977 5.204 1.00 98.86 190 A 1 +ATOM 1438 C CE1 . TYR A 1 190 ? -1.347 13.447 4.129 1.00 98.81 190 A 1 +ATOM 1439 C CE2 . TYR A 1 190 ? 1.063 13.246 3.830 1.00 98.80 190 A 1 +ATOM 1440 C CZ . TYR A 1 190 ? -0.216 13.475 3.289 1.00 98.85 190 A 1 +ATOM 1441 O OH . TYR A 1 190 ? -0.374 13.723 1.961 1.00 98.77 190 A 1 +ATOM 1442 N N . PHE A 1 191 ? -1.321 15.251 8.360 1.00 98.84 191 A 1 +ATOM 1443 C CA . PHE A 1 191 ? -2.183 16.380 8.001 1.00 98.82 191 A 1 +ATOM 1444 C C . PHE A 1 191 ? -1.785 17.664 8.733 1.00 98.88 191 A 1 +ATOM 1445 O O . PHE A 1 191 ? -1.799 18.738 8.139 1.00 98.81 191 A 1 +ATOM 1446 C CB . PHE A 1 191 ? -3.639 16.022 8.287 1.00 98.92 191 A 1 +ATOM 1447 C CG . PHE A 1 191 ? -4.120 14.799 7.535 1.00 98.95 191 A 1 +ATOM 1448 C CD1 . PHE A 1 191 ? -4.337 14.871 6.143 1.00 98.93 191 A 1 +ATOM 1449 C CD2 . PHE A 1 191 ? -4.322 13.587 8.205 1.00 98.92 191 A 1 +ATOM 1450 C CE1 . PHE A 1 191 ? -4.746 13.738 5.435 1.00 98.92 191 A 1 +ATOM 1451 C CE2 . PHE A 1 191 ? -4.732 12.454 7.491 1.00 98.90 191 A 1 +ATOM 1452 C CZ . PHE A 1 191 ? -4.950 12.528 6.105 1.00 98.93 191 A 1 +ATOM 1453 N N . THR A 1 192 ? -1.375 17.564 10.010 1.00 98.89 192 A 1 +ATOM 1454 C CA . THR A 1 192 ? -0.921 18.732 10.778 1.00 98.76 192 A 1 +ATOM 1455 C C . THR A 1 192 ? 0.387 19.290 10.215 1.00 98.61 192 A 1 +ATOM 1456 O O . THR A 1 192 ? 0.519 20.508 10.070 1.00 98.43 192 A 1 +ATOM 1457 C CB . THR A 1 192 ? -0.777 18.432 12.280 1.00 98.49 192 A 1 +ATOM 1458 O OG1 . THR A 1 192 ? 0.231 17.493 12.530 1.00 94.33 192 A 1 +ATOM 1459 C CG2 . THR A 1 192 ? -2.068 17.890 12.898 1.00 92.14 192 A 1 +ATOM 1460 N N . GLU A 1 193 ? 1.321 18.421 9.829 1.00 98.62 193 A 1 +ATOM 1461 C CA . GLU A 1 193 ? 2.563 18.813 9.165 1.00 98.55 193 A 1 +ATOM 1462 C C . GLU A 1 193 ? 2.283 19.429 7.791 1.00 98.45 193 A 1 +ATOM 1463 O O . GLU A 1 193 ? 2.797 20.506 7.488 1.00 98.26 193 A 1 +ATOM 1464 C CB . GLU A 1 193 ? 3.515 17.606 9.039 1.00 98.44 193 A 1 +ATOM 1465 C CG . GLU A 1 193 ? 4.086 17.101 10.383 1.00 97.22 193 A 1 +ATOM 1466 C CD . GLU A 1 193 ? 4.807 18.191 11.190 1.00 97.32 193 A 1 +ATOM 1467 O OE1 . GLU A 1 193 ? 4.922 18.104 12.428 1.00 92.83 193 A 1 +ATOM 1468 O OE2 . GLU A 1 193 ? 5.241 19.199 10.591 1.00 94.15 193 A 1 +ATOM 1469 N N . LEU A 1 194 ? 1.395 18.834 7.006 1.00 98.39 194 A 1 +ATOM 1470 C CA . LEU A 1 194 ? 1.025 19.345 5.686 1.00 98.01 194 A 1 +ATOM 1471 C C . LEU A 1 194 ? 0.449 20.772 5.772 1.00 98.05 194 A 1 +ATOM 1472 O O . LEU A 1 194 ? 0.855 21.639 5.002 1.00 97.82 194 A 1 +ATOM 1473 C CB . LEU A 1 194 ? 0.047 18.348 5.040 1.00 97.35 194 A 1 +ATOM 1474 C CG . LEU A 1 194 ? -0.284 18.642 3.567 1.00 94.72 194 A 1 +ATOM 1475 C CD1 . LEU A 1 194 ? 0.951 18.577 2.663 1.00 95.42 194 A 1 +ATOM 1476 C CD2 . LEU A 1 194 ? -1.293 17.611 3.050 1.00 95.65 194 A 1 +ATOM 1477 N N . LEU A 1 195 ? -0.435 21.055 6.740 1.00 98.31 195 A 1 +ATOM 1478 C CA . LEU A 1 195 ? -1.020 22.382 6.965 1.00 98.09 195 A 1 +ATOM 1479 C C . LEU A 1 195 ? -0.018 23.414 7.481 1.00 97.30 195 A 1 +ATOM 1480 O O . LEU A 1 195 ? -0.140 24.598 7.172 1.00 96.67 195 A 1 +ATOM 1481 C CB . LEU A 1 195 ? -2.174 22.272 7.971 1.00 98.12 195 A 1 +ATOM 1482 C CG . LEU A 1 195 ? -3.461 21.638 7.415 1.00 97.76 195 A 1 +ATOM 1483 C CD1 . LEU A 1 195 ? -4.484 21.547 8.550 1.00 97.39 195 A 1 +ATOM 1484 C CD2 . LEU A 1 195 ? -4.071 22.465 6.288 1.00 97.29 195 A 1 +ATOM 1485 N N . SER A 1 196 ? 0.974 22.997 8.275 1.00 97.83 196 A 1 +ATOM 1486 C CA . SER A 1 196 ? 1.976 23.896 8.854 1.00 96.87 196 A 1 +ATOM 1487 C C . SER A 1 196 ? 3.031 24.393 7.858 1.00 95.80 196 A 1 +ATOM 1488 O O . SER A 1 196 ? 3.821 25.274 8.192 1.00 92.46 196 A 1 +ATOM 1489 C CB . SER A 1 196 ? 2.616 23.245 10.079 1.00 96.05 196 A 1 +ATOM 1490 O OG . SER A 1 196 ? 3.473 22.171 9.744 1.00 93.54 196 A 1 +ATOM 1491 N N . GLY A 1 197 ? 3.020 23.858 6.634 1.00 94.68 197 A 1 +ATOM 1492 C CA . GLY A 1 197 ? 3.999 24.160 5.596 1.00 93.94 197 A 1 +ATOM 1493 C C . GLY A 1 197 ? 5.269 23.319 5.714 1.00 95.25 197 A 1 +ATOM 1494 O O . GLY A 1 197 ? 5.362 22.387 6.514 1.00 93.76 197 A 1 +ATOM 1495 N N . GLU A 1 198 ? 6.249 23.630 4.875 1.00 95.52 198 A 1 +ATOM 1496 C CA . GLU A 1 198 ? 7.509 22.885 4.842 1.00 95.81 198 A 1 +ATOM 1497 C C . GLU A 1 198 ? 8.328 23.126 6.113 1.00 96.15 198 A 1 +ATOM 1498 O O . GLU A 1 198 ? 8.593 24.268 6.497 1.00 94.57 198 A 1 +ATOM 1499 C CB . GLU A 1 198 ? 8.330 23.252 3.601 1.00 94.10 198 A 1 +ATOM 1500 C CG . GLU A 1 198 ? 7.654 22.810 2.297 1.00 90.81 198 A 1 +ATOM 1501 C CD . GLU A 1 198 ? 8.487 23.141 1.039 1.00 89.97 198 A 1 +ATOM 1502 O OE1 . GLU A 1 198 ? 7.995 22.835 -0.064 1.00 83.14 198 A 1 +ATOM 1503 O OE2 . GLU A 1 198 ? 9.597 23.700 1.143 1.00 85.15 198 A 1 +ATOM 1504 N N . LYS A 1 199 ? 8.777 22.044 6.744 1.00 96.49 199 A 1 +ATOM 1505 C CA . LYS A 1 199 ? 9.710 22.062 7.869 1.00 96.31 199 A 1 +ATOM 1506 C C . LYS A 1 199 ? 10.991 21.337 7.480 1.00 96.79 199 A 1 +ATOM 1507 O O . LYS A 1 199 ? 10.955 20.295 6.823 1.00 96.19 199 A 1 +ATOM 1508 C CB . LYS A 1 199 ? 9.075 21.425 9.111 1.00 95.45 199 A 1 +ATOM 1509 C CG . LYS A 1 199 ? 7.907 22.241 9.666 1.00 92.54 199 A 1 +ATOM 1510 C CD . LYS A 1 199 ? 7.340 21.526 10.906 1.00 90.66 199 A 1 +ATOM 1511 C CE . LYS A 1 199 ? 6.027 22.146 11.375 1.00 85.94 199 A 1 +ATOM 1512 N NZ . LYS A 1 199 ? 5.312 21.206 12.273 1.00 78.03 199 A 1 +ATOM 1513 N N . GLU A 1 200 ? 12.124 21.874 7.905 1.00 95.89 200 A 1 +ATOM 1514 C CA . GLU A 1 200 ? 13.419 21.248 7.660 1.00 96.11 200 A 1 +ATOM 1515 C C . GLU A 1 200 ? 13.440 19.809 8.195 1.00 96.67 200 A 1 +ATOM 1516 O O . GLU A 1 200 ? 13.045 19.538 9.330 1.00 95.24 200 A 1 +ATOM 1517 C CB . GLU A 1 200 ? 14.530 22.114 8.262 1.00 95.40 200 A 1 +ATOM 1518 C CG . GLU A 1 200 ? 15.924 21.617 7.863 1.00 85.86 200 A 1 +ATOM 1519 C CD . GLU A 1 200 ? 17.070 22.507 8.385 1.00 79.59 200 A 1 +ATOM 1520 O OE1 . GLU A 1 200 ? 18.238 22.184 8.052 1.00 72.63 200 A 1 +ATOM 1521 O OE2 . GLU A 1 200 ? 16.793 23.488 9.111 1.00 76.17 200 A 1 +ATOM 1522 N N . GLY A 1 201 ? 13.887 18.877 7.354 1.00 96.28 201 A 1 +ATOM 1523 C CA . GLY A 1 201 ? 13.953 17.447 7.687 1.00 96.74 201 A 1 +ATOM 1524 C C . GLY A 1 201 ? 12.659 16.653 7.462 1.00 97.89 201 A 1 +ATOM 1525 O O . GLY A 1 201 ? 12.705 15.428 7.582 1.00 97.33 201 A 1 +ATOM 1526 N N . LEU A 1 202 ? 11.527 17.309 7.110 1.00 96.87 202 A 1 +ATOM 1527 C CA . LEU A 1 202 ? 10.270 16.628 6.793 1.00 97.57 202 A 1 +ATOM 1528 C C . LEU A 1 202 ? 9.923 16.737 5.305 1.00 97.76 202 A 1 +ATOM 1529 O O . LEU A 1 202 ? 10.080 17.783 4.682 1.00 97.69 202 A 1 +ATOM 1530 C CB . LEU A 1 202 ? 9.119 17.138 7.680 1.00 97.67 202 A 1 +ATOM 1531 C CG . LEU A 1 202 ? 9.327 16.958 9.191 1.00 97.15 202 A 1 +ATOM 1532 C CD1 . LEU A 1 202 ? 8.062 17.367 9.923 1.00 96.59 202 A 1 +ATOM 1533 C CD2 . LEU A 1 202 ? 9.651 15.519 9.591 1.00 96.56 202 A 1 +ATOM 1534 N N . LEU A 1 203 ? 9.434 15.655 4.742 1.00 97.53 203 A 1 +ATOM 1535 C CA . LEU A 1 203 ? 9.087 15.527 3.334 1.00 97.65 203 A 1 +ATOM 1536 C C . LEU A 1 203 ? 7.639 15.957 3.074 1.00 97.93 203 A 1 +ATOM 1537 O O . LEU A 1 203 ? 6.735 15.616 3.821 1.00 98.14 203 A 1 +ATOM 1538 C CB . LEU A 1 203 ? 9.340 14.070 2.901 1.00 97.54 203 A 1 +ATOM 1539 C CG . LEU A 1 203 ? 9.012 13.749 1.436 1.00 96.94 203 A 1 +ATOM 1540 C CD1 . LEU A 1 203 ? 9.863 14.551 0.451 1.00 96.65 203 A 1 +ATOM 1541 C CD2 . LEU A 1 203 ? 9.252 12.271 1.179 1.00 96.69 203 A 1 +ATOM 1542 N N . GLN A 1 204 ? 7.414 16.648 1.952 1.00 97.78 204 A 1 +ATOM 1543 C CA . GLN A 1 204 ? 6.104 16.831 1.332 1.00 97.74 204 A 1 +ATOM 1544 C C . GLN A 1 204 ? 6.249 16.622 -0.178 1.00 97.67 204 A 1 +ATOM 1545 O O . GLN A 1 204 ? 6.943 17.390 -0.848 1.00 97.57 204 A 1 +ATOM 1546 C CB . GLN A 1 204 ? 5.534 18.224 1.629 1.00 97.57 204 A 1 +ATOM 1547 C CG . GLN A 1 204 ? 5.234 18.463 3.115 1.00 97.07 204 A 1 +ATOM 1548 C CD . GLN A 1 204 ? 4.543 19.801 3.374 1.00 97.22 204 A 1 +ATOM 1549 O OE1 . GLN A 1 204 ? 4.281 20.586 2.474 1.00 93.03 204 A 1 +ATOM 1550 N NE2 . GLN A 1 204 ? 4.229 20.106 4.603 1.00 92.65 204 A 1 +ATOM 1551 N N . LEU A 1 205 ? 5.612 15.588 -0.717 1.00 97.57 205 A 1 +ATOM 1552 C CA . LEU A 1 205 ? 5.594 15.336 -2.150 1.00 97.27 205 A 1 +ATOM 1553 C C . LEU A 1 205 ? 4.678 16.344 -2.867 1.00 97.34 205 A 1 +ATOM 1554 O O . LEU A 1 205 ? 3.730 16.856 -2.262 1.00 97.73 205 A 1 +ATOM 1555 C CB . LEU A 1 205 ? 5.136 13.890 -2.432 1.00 97.36 205 A 1 +ATOM 1556 C CG . LEU A 1 205 ? 5.941 12.791 -1.730 1.00 96.78 205 A 1 +ATOM 1557 C CD1 . LEU A 1 205 ? 5.246 11.446 -1.897 1.00 96.46 205 A 1 +ATOM 1558 C CD2 . LEU A 1 205 ? 7.350 12.682 -2.298 1.00 96.38 205 A 1 +ATOM 1559 N N . PRO A 1 206 ? 4.862 16.595 -4.178 1.00 97.66 206 A 1 +ATOM 1560 C CA . PRO A 1 206 ? 3.890 17.339 -4.967 1.00 97.50 206 A 1 +ATOM 1561 C C . PRO A 1 206 ? 2.470 16.771 -4.875 1.00 97.94 206 A 1 +ATOM 1562 O O . PRO A 1 206 ? 1.508 17.537 -4.791 1.00 98.22 206 A 1 +ATOM 1563 C CB . PRO A 1 206 ? 4.428 17.308 -6.396 1.00 97.49 206 A 1 +ATOM 1564 C CG . PRO A 1 206 ? 5.940 17.182 -6.194 1.00 96.80 206 A 1 +ATOM 1565 C CD . PRO A 1 206 ? 6.049 16.293 -4.962 1.00 97.74 206 A 1 +ATOM 1566 N N . SER A 1 207 ? 2.311 15.453 -4.819 1.00 97.61 207 A 1 +ATOM 1567 C CA . SER A 1 207 ? 1.024 14.783 -4.632 1.00 97.96 207 A 1 +ATOM 1568 C C . SER A 1 207 ? 0.407 15.037 -3.253 1.00 98.21 207 A 1 +ATOM 1569 O O . SER A 1 207 ? -0.812 15.172 -3.171 1.00 98.46 207 A 1 +ATOM 1570 C CB . SER A 1 207 ? 1.166 13.278 -4.876 1.00 97.91 207 A 1 +ATOM 1571 O OG . SER A 1 207 ? 2.213 12.733 -4.105 1.00 97.32 207 A 1 +ATOM 1572 N N . ASP A 1 208 ? 1.201 15.190 -2.189 1.00 98.38 208 A 1 +ATOM 1573 C CA . ASP A 1 208 ? 0.707 15.573 -0.862 1.00 98.40 208 A 1 +ATOM 1574 C C . ASP A 1 208 ? 0.206 17.025 -0.885 1.00 98.54 208 A 1 +ATOM 1575 O O . ASP A 1 208 ? -0.917 17.325 -0.475 1.00 98.59 208 A 1 +ATOM 1576 C CB . ASP A 1 208 ? 1.821 15.438 0.205 1.00 98.43 208 A 1 +ATOM 1577 C CG . ASP A 1 208 ? 2.457 14.053 0.293 1.00 98.39 208 A 1 +ATOM 1578 O OD1 . ASP A 1 208 ? 1.728 13.043 0.231 1.00 97.84 208 A 1 +ATOM 1579 O OD2 . ASP A 1 208 ? 3.700 13.995 0.403 1.00 97.92 208 A 1 +ATOM 1580 N N . LYS A 1 209 ? 0.996 17.949 -1.454 1.00 98.11 209 A 1 +ATOM 1581 C CA . LYS A 1 209 ? 0.644 19.368 -1.585 1.00 98.07 209 A 1 +ATOM 1582 C C . LYS A 1 209 ? -0.596 19.608 -2.431 1.00 98.23 209 A 1 +ATOM 1583 O O . LYS A 1 209 ? -1.317 20.575 -2.188 1.00 98.32 209 A 1 +ATOM 1584 C CB . LYS A 1 209 ? 1.824 20.142 -2.168 1.00 97.96 209 A 1 +ATOM 1585 C CG . LYS A 1 209 ? 3.008 20.206 -1.200 1.00 97.24 209 A 1 +ATOM 1586 C CD . LYS A 1 209 ? 4.179 20.894 -1.887 1.00 95.64 209 A 1 +ATOM 1587 C CE . LYS A 1 209 ? 5.352 20.980 -0.918 1.00 91.17 209 A 1 +ATOM 1588 N NZ . LYS A 1 209 ? 6.555 21.484 -1.599 1.00 84.62 209 A 1 +ATOM 1589 N N . ALA A 1 210 ? -0.877 18.744 -3.399 1.00 98.22 210 A 1 +ATOM 1590 C CA . ALA A 1 210 ? -2.084 18.823 -4.214 1.00 98.44 210 A 1 +ATOM 1591 C C . ALA A 1 210 ? -3.371 18.732 -3.376 1.00 98.60 210 A 1 +ATOM 1592 O O . ALA A 1 210 ? -4.377 19.341 -3.742 1.00 98.67 210 A 1 +ATOM 1593 C CB . ALA A 1 210 ? -2.027 17.723 -5.272 1.00 98.45 210 A 1 +ATOM 1594 N N . LEU A 1 211 ? -3.336 18.058 -2.221 1.00 98.63 211 A 1 +ATOM 1595 C CA . LEU A 1 211 ? -4.469 17.971 -1.300 1.00 98.73 211 A 1 +ATOM 1596 C C . LEU A 1 211 ? -4.828 19.331 -0.680 1.00 98.74 211 A 1 +ATOM 1597 O O . LEU A 1 211 ? -5.969 19.554 -0.315 1.00 98.82 211 A 1 +ATOM 1598 C CB . LEU A 1 211 ? -4.166 16.952 -0.188 1.00 98.80 211 A 1 +ATOM 1599 C CG . LEU A 1 211 ? -3.698 15.557 -0.638 1.00 98.53 211 A 1 +ATOM 1600 C CD1 . LEU A 1 211 ? -3.489 14.678 0.591 1.00 98.58 211 A 1 +ATOM 1601 C CD2 . LEU A 1 211 ? -4.697 14.872 -1.569 1.00 98.47 211 A 1 +ATOM 1602 N N . LEU A 1 212 ? -3.870 20.269 -0.581 1.00 98.74 212 A 1 +ATOM 1603 C CA . LEU A 1 212 ? -4.085 21.596 0.010 1.00 98.69 212 A 1 +ATOM 1604 C C . LEU A 1 212 ? -4.796 22.579 -0.918 1.00 98.62 212 A 1 +ATOM 1605 O O . LEU A 1 212 ? -5.433 23.521 -0.437 1.00 98.61 212 A 1 +ATOM 1606 C CB . LEU A 1 212 ? -2.732 22.199 0.416 1.00 98.62 212 A 1 +ATOM 1607 C CG . LEU A 1 212 ? -1.990 21.470 1.536 1.00 98.31 212 A 1 +ATOM 1608 C CD1 . LEU A 1 212 ? -0.672 22.201 1.796 1.00 98.15 212 A 1 +ATOM 1609 C CD2 . LEU A 1 212 ? -2.810 21.455 2.830 1.00 98.05 212 A 1 +ATOM 1610 N N . SER A 1 213 ? -4.646 22.428 -2.227 1.00 98.71 213 A 1 +ATOM 1611 C CA . SER A 1 213 ? -5.171 23.356 -3.233 1.00 98.67 213 A 1 +ATOM 1612 C C . SER A 1 213 ? -6.470 22.891 -3.875 1.00 98.75 213 A 1 +ATOM 1613 O O . SER A 1 213 ? -7.154 23.696 -4.503 1.00 98.45 213 A 1 +ATOM 1614 C CB . SER A 1 213 ? -4.105 23.624 -4.293 1.00 98.07 213 A 1 +ATOM 1615 O OG . SER A 1 213 ? -3.667 22.420 -4.894 1.00 96.12 213 A 1 +ATOM 1616 N N . ASP A 1 214 ? -6.820 21.618 -3.736 1.00 98.72 214 A 1 +ATOM 1617 C CA . ASP A 1 214 ? -8.055 21.078 -4.294 1.00 98.82 214 A 1 +ATOM 1618 C C . ASP A 1 214 ? -9.272 21.413 -3.400 1.00 98.85 214 A 1 +ATOM 1619 O O . ASP A 1 214 ? -9.229 21.184 -2.189 1.00 98.86 214 A 1 +ATOM 1620 C CB . ASP A 1 214 ? -7.900 19.574 -4.500 1.00 98.80 214 A 1 +ATOM 1621 C CG . ASP A 1 214 ? -9.116 19.015 -5.221 1.00 98.86 214 A 1 +ATOM 1622 O OD1 . ASP A 1 214 ? -10.139 18.733 -4.553 1.00 98.34 214 A 1 +ATOM 1623 O OD2 . ASP A 1 214 ? -9.063 18.865 -6.459 1.00 98.49 214 A 1 +ATOM 1624 N N . PRO A 1 215 ? -10.380 21.938 -3.969 1.00 98.85 215 A 1 +ATOM 1625 C CA . PRO A 1 215 ? -11.528 22.380 -3.181 1.00 98.80 215 A 1 +ATOM 1626 C C . PRO A 1 215 ? -12.276 21.245 -2.461 1.00 98.98 215 A 1 +ATOM 1627 O O . PRO A 1 215 ? -13.013 21.524 -1.517 1.00 98.87 215 A 1 +ATOM 1628 C CB . PRO A 1 215 ? -12.440 23.098 -4.184 1.00 98.74 215 A 1 +ATOM 1629 C CG . PRO A 1 215 ? -12.090 22.443 -5.517 1.00 97.21 215 A 1 +ATOM 1630 C CD . PRO A 1 215 ? -10.596 22.186 -5.378 1.00 98.79 215 A 1 +ATOM 1631 N N . VAL A 1 216 ? -12.122 19.992 -2.882 1.00 98.86 216 A 1 +ATOM 1632 C CA . VAL A 1 216 ? -12.738 18.823 -2.241 1.00 98.85 216 A 1 +ATOM 1633 C C . VAL A 1 216 ? -11.779 18.200 -1.223 1.00 98.97 216 A 1 +ATOM 1634 O O . VAL A 1 216 ? -12.196 17.849 -0.121 1.00 98.93 216 A 1 +ATOM 1635 C CB . VAL A 1 216 ? -13.183 17.774 -3.275 1.00 98.85 216 A 1 +ATOM 1636 C CG1 . VAL A 1 216 ? -13.876 16.581 -2.618 1.00 98.54 216 A 1 +ATOM 1637 C CG2 . VAL A 1 216 ? -14.154 18.378 -4.290 1.00 98.58 216 A 1 +ATOM 1638 N N . PHE A 1 217 ? -10.492 18.093 -1.550 1.00 98.98 217 A 1 +ATOM 1639 C CA . PHE A 1 217 ? -9.506 17.481 -0.657 1.00 98.98 217 A 1 +ATOM 1640 C C . PHE A 1 217 ? -9.178 18.365 0.549 1.00 98.90 217 A 1 +ATOM 1641 O O . PHE A 1 217 ? -9.057 17.852 1.661 1.00 98.94 217 A 1 +ATOM 1642 C CB . PHE A 1 217 ? -8.223 17.152 -1.437 1.00 98.93 217 A 1 +ATOM 1643 C CG . PHE A 1 217 ? -8.350 16.204 -2.616 1.00 98.93 217 A 1 +ATOM 1644 C CD1 . PHE A 1 217 ? -9.393 15.277 -2.715 1.00 98.87 217 A 1 +ATOM 1645 C CD2 . PHE A 1 217 ? -7.355 16.227 -3.614 1.00 98.85 217 A 1 +ATOM 1646 C CE1 . PHE A 1 217 ? -9.462 14.394 -3.807 1.00 98.83 217 A 1 +ATOM 1647 C CE2 . PHE A 1 217 ? -7.419 15.348 -4.700 1.00 98.80 217 A 1 +ATOM 1648 C CZ . PHE A 1 217 ? -8.473 14.429 -4.798 1.00 98.86 217 A 1 +ATOM 1649 N N . ARG A 1 218 ? -9.081 19.691 0.356 1.00 98.94 218 A 1 +ATOM 1650 C CA . ARG A 1 218 ? -8.673 20.613 1.427 1.00 98.90 218 A 1 +ATOM 1651 C C . ARG A 1 218 ? -9.559 20.551 2.682 1.00 98.96 218 A 1 +ATOM 1652 O O . ARG A 1 218 ? -8.992 20.414 3.769 1.00 98.94 218 A 1 +ATOM 1653 C CB . ARG A 1 218 ? -8.522 22.032 0.858 1.00 98.78 218 A 1 +ATOM 1654 C CG . ARG A 1 218 ? -8.254 23.093 1.929 1.00 98.03 218 A 1 +ATOM 1655 C CD . ARG A 1 218 ? -6.970 22.795 2.711 1.00 97.02 218 A 1 +ATOM 1656 N NE . ARG A 1 218 ? -6.802 23.744 3.800 1.00 95.45 218 A 1 +ATOM 1657 C CZ . ARG A 1 218 ? -6.179 24.900 3.784 1.00 95.86 218 A 1 +ATOM 1658 N NH1 . ARG A 1 218 ? -5.594 25.368 2.711 1.00 91.42 218 A 1 +ATOM 1659 N NH2 . ARG A 1 218 ? -6.143 25.594 4.883 1.00 93.12 218 A 1 +ATOM 1660 N N . PRO A 1 219 ? -10.909 20.565 2.602 1.00 98.94 219 A 1 +ATOM 1661 C CA . PRO A 1 219 ? -11.755 20.401 3.787 1.00 98.94 219 A 1 +ATOM 1662 C C . PRO A 1 219 ? -11.528 19.080 4.534 1.00 98.96 219 A 1 +ATOM 1663 O O . PRO A 1 219 ? -11.683 19.044 5.752 1.00 98.93 219 A 1 +ATOM 1664 C CB . PRO A 1 219 ? -13.195 20.493 3.266 1.00 98.87 219 A 1 +ATOM 1665 C CG . PRO A 1 219 ? -13.064 21.331 2.005 1.00 97.90 219 A 1 +ATOM 1666 C CD . PRO A 1 219 ? -11.722 20.880 1.437 1.00 98.90 219 A 1 +ATOM 1667 N N . LEU A 1 220 ? -11.157 18.006 3.841 1.00 98.95 220 A 1 +ATOM 1668 C CA . LEU A 1 220 ? -10.845 16.718 4.459 1.00 98.97 220 A 1 +ATOM 1669 C C . LEU A 1 220 ? -9.491 16.763 5.179 1.00 98.98 220 A 1 +ATOM 1670 O O . LEU A 1 220 ? -9.389 16.265 6.293 1.00 98.97 220 A 1 +ATOM 1671 C CB . LEU A 1 220 ? -10.874 15.610 3.402 1.00 98.96 220 A 1 +ATOM 1672 C CG . LEU A 1 220 ? -12.249 15.380 2.759 1.00 98.85 220 A 1 +ATOM 1673 C CD1 . LEU A 1 220 ? -12.099 14.504 1.515 1.00 98.77 220 A 1 +ATOM 1674 C CD2 . LEU A 1 220 ? -13.206 14.673 3.724 1.00 98.73 220 A 1 +ATOM 1675 N N . VAL A 1 221 ? -8.475 17.421 4.599 1.00 98.93 221 A 1 +ATOM 1676 C CA . VAL A 1 221 ? -7.196 17.684 5.279 1.00 98.87 221 A 1 +ATOM 1677 C C . VAL A 1 221 ? -7.429 18.466 6.577 1.00 98.94 221 A 1 +ATOM 1678 O O . VAL A 1 221 ? -6.922 18.073 7.630 1.00 98.92 221 A 1 +ATOM 1679 C CB . VAL A 1 221 ? -6.216 18.443 4.368 1.00 98.89 221 A 1 +ATOM 1680 C CG1 . VAL A 1 221 ? -4.925 18.842 5.095 1.00 98.77 221 A 1 +ATOM 1681 C CG2 . VAL A 1 221 ? -5.817 17.607 3.150 1.00 98.83 221 A 1 +ATOM 1682 N N . ASP A 1 222 ? -8.241 19.546 6.517 1.00 98.99 222 A 1 +ATOM 1683 C CA . ASP A 1 222 ? -8.564 20.360 7.688 1.00 98.82 222 A 1 +ATOM 1684 C C . ASP A 1 222 ? -9.313 19.534 8.756 1.00 98.98 222 A 1 +ATOM 1685 O O . ASP A 1 222 ? -8.981 19.611 9.940 1.00 98.88 222 A 1 +ATOM 1686 C CB . ASP A 1 222 ? -9.390 21.596 7.269 1.00 98.83 222 A 1 +ATOM 1687 C CG . ASP A 1 222 ? -8.630 22.629 6.400 1.00 98.69 222 A 1 +ATOM 1688 O OD1 . ASP A 1 222 ? -7.411 22.817 6.567 1.00 97.86 222 A 1 +ATOM 1689 O OD2 . ASP A 1 222 ? -9.272 23.305 5.564 1.00 97.78 222 A 1 +ATOM 1690 N N . LYS A 1 223 ? -10.287 18.704 8.344 1.00 98.94 223 A 1 +ATOM 1691 C CA . LYS A 1 223 ? -11.014 17.776 9.224 1.00 98.98 223 A 1 +ATOM 1692 C C . LYS A 1 223 ? -10.054 16.828 9.937 1.00 98.95 223 A 1 +ATOM 1693 O O . LYS A 1 223 ? -10.086 16.753 11.158 1.00 98.95 223 A 1 +ATOM 1694 C CB . LYS A 1 223 ? -12.077 16.999 8.410 1.00 98.85 223 A 1 +ATOM 1695 C CG . LYS A 1 223 ? -12.858 15.946 9.224 1.00 98.24 223 A 1 +ATOM 1696 C CD . LYS A 1 223 ? -13.712 15.039 8.309 1.00 97.42 223 A 1 +ATOM 1697 C CE . LYS A 1 223 ? -14.319 13.873 9.102 1.00 94.00 223 A 1 +ATOM 1698 N NZ . LYS A 1 223 ? -14.845 12.788 8.229 1.00 91.75 223 A 1 +ATOM 1699 N N . TYR A 1 224 ? -9.187 16.130 9.207 1.00 98.91 224 A 1 +ATOM 1700 C CA . TYR A 1 224 ? -8.303 15.121 9.773 1.00 98.90 224 A 1 +ATOM 1701 C C . TYR A 1 224 ? -7.185 15.707 10.637 1.00 98.99 224 A 1 +ATOM 1702 O O . TYR A 1 224 ? -6.772 15.078 11.604 1.00 98.95 224 A 1 +ATOM 1703 C CB . TYR A 1 224 ? -7.716 14.254 8.659 1.00 98.97 224 A 1 +ATOM 1704 C CG . TYR A 1 224 ? -8.713 13.528 7.775 1.00 98.97 224 A 1 +ATOM 1705 C CD1 . TYR A 1 224 ? -9.979 13.124 8.251 1.00 98.94 224 A 1 +ATOM 1706 C CD2 . TYR A 1 224 ? -8.353 13.221 6.445 1.00 98.93 224 A 1 +ATOM 1707 C CE1 . TYR A 1 224 ? -10.877 12.451 7.412 1.00 98.94 224 A 1 +ATOM 1708 C CE2 . TYR A 1 224 ? -9.241 12.545 5.610 1.00 98.92 224 A 1 +ATOM 1709 C CZ . TYR A 1 224 ? -10.500 12.159 6.087 1.00 98.96 224 A 1 +ATOM 1710 O OH . TYR A 1 224 ? -11.363 11.511 5.258 1.00 98.93 224 A 1 +ATOM 1711 N N . ALA A 1 225 ? -6.724 16.925 10.333 1.00 98.86 225 A 1 +ATOM 1712 C CA . ALA A 1 225 ? -5.769 17.630 11.181 1.00 98.86 225 A 1 +ATOM 1713 C C . ALA A 1 225 ? -6.383 18.045 12.532 1.00 98.81 225 A 1 +ATOM 1714 O O . ALA A 1 225 ? -5.676 18.089 13.536 1.00 98.89 225 A 1 +ATOM 1715 C CB . ALA A 1 225 ? -5.249 18.845 10.422 1.00 98.86 225 A 1 +ATOM 1716 N N . ALA A 1 226 ? -7.687 18.370 12.545 1.00 98.86 226 A 1 +ATOM 1717 C CA . ALA A 1 226 ? -8.399 18.787 13.750 1.00 98.89 226 A 1 +ATOM 1718 C C . ALA A 1 226 ? -8.970 17.616 14.574 1.00 98.82 226 A 1 +ATOM 1719 O O . ALA A 1 226 ? -9.171 17.770 15.772 1.00 98.82 226 A 1 +ATOM 1720 C CB . ALA A 1 226 ? -9.516 19.747 13.325 1.00 98.79 226 A 1 +ATOM 1721 N N . ASP A 1 227 ? -9.249 16.477 13.931 1.00 98.80 227 A 1 +ATOM 1722 C CA . ASP A 1 227 ? -9.946 15.336 14.518 1.00 98.95 227 A 1 +ATOM 1723 C C . ASP A 1 227 ? -9.315 14.008 14.052 1.00 98.98 227 A 1 +ATOM 1724 O O . ASP A 1 227 ? -9.569 13.509 12.950 1.00 98.91 227 A 1 +ATOM 1725 C CB . ASP A 1 227 ? -11.441 15.456 14.158 1.00 98.84 227 A 1 +ATOM 1726 C CG . ASP A 1 227 ? -12.334 14.427 14.855 1.00 98.83 227 A 1 +ATOM 1727 O OD1 . ASP A 1 227 ? -11.802 13.421 15.365 1.00 98.53 227 A 1 +ATOM 1728 O OD2 . ASP A 1 227 ? -13.568 14.657 14.844 1.00 98.41 227 A 1 +ATOM 1729 N N . GLU A 1 228 ? -8.462 13.445 14.913 1.00 98.98 228 A 1 +ATOM 1730 C CA . GLU A 1 228 ? -7.788 12.167 14.676 1.00 98.94 228 A 1 +ATOM 1731 C C . GLU A 1 228 ? -8.774 10.988 14.639 1.00 98.96 228 A 1 +ATOM 1732 O O . GLU A 1 228 ? -8.599 10.068 13.840 1.00 98.95 228 A 1 +ATOM 1733 C CB . GLU A 1 228 ? -6.704 11.942 15.739 1.00 98.89 228 A 1 +ATOM 1734 C CG . GLU A 1 228 ? -5.892 10.660 15.482 1.00 98.72 228 A 1 +ATOM 1735 C CD . GLU A 1 228 ? -4.731 10.548 16.461 1.00 98.71 228 A 1 +ATOM 1736 O OE1 . GLU A 1 228 ? -4.944 9.991 17.559 1.00 97.12 228 A 1 +ATOM 1737 O OE2 . GLU A 1 228 ? -3.625 11.036 16.121 1.00 97.32 228 A 1 +ATOM 1738 N N . ASP A 1 229 ? -9.838 11.020 15.447 1.00 98.85 229 A 1 +ATOM 1739 C CA . ASP A 1 229 ? -10.838 9.953 15.457 1.00 98.90 229 A 1 +ATOM 1740 C C . ASP A 1 229 ? -11.594 9.897 14.116 1.00 98.96 229 A 1 +ATOM 1741 O O . ASP A 1 229 ? -11.829 8.820 13.559 1.00 98.92 229 A 1 +ATOM 1742 C CB . ASP A 1 229 ? -11.832 10.159 16.619 1.00 98.86 229 A 1 +ATOM 1743 C CG . ASP A 1 229 ? -11.280 9.825 18.012 1.00 98.09 229 A 1 +ATOM 1744 O OD1 . ASP A 1 229 ? -10.319 9.028 18.098 1.00 96.54 229 A 1 +ATOM 1745 O OD2 . ASP A 1 229 ? -11.897 10.290 18.998 1.00 96.00 229 A 1 +ATOM 1746 N N . ALA A 1 230 ? -11.917 11.076 13.546 1.00 98.90 230 A 1 +ATOM 1747 C CA . ALA A 1 230 ? -12.498 11.171 12.217 1.00 98.98 230 A 1 +ATOM 1748 C C . ALA A 1 230 ? -11.542 10.668 11.127 1.00 98.96 230 A 1 +ATOM 1749 O O . ALA A 1 230 ? -11.978 9.976 10.204 1.00 98.95 230 A 1 +ATOM 1750 C CB . ALA A 1 230 ? -12.912 12.627 11.955 1.00 98.94 230 A 1 +ATOM 1751 N N . PHE A 1 231 ? -10.242 10.970 11.236 1.00 98.98 231 A 1 +ATOM 1752 C CA . PHE A 1 231 ? -9.235 10.401 10.341 1.00 98.98 231 A 1 +ATOM 1753 C C . PHE A 1 231 ? -9.182 8.877 10.457 1.00 98.90 231 A 1 +ATOM 1754 O O . PHE A 1 231 ? -9.235 8.188 9.443 1.00 98.98 231 A 1 +ATOM 1755 C CB . PHE A 1 231 ? -7.853 11.020 10.614 1.00 98.96 231 A 1 +ATOM 1756 C CG . PHE A 1 231 ? -6.699 10.270 9.965 1.00 98.96 231 A 1 +ATOM 1757 C CD1 . PHE A 1 231 ? -5.573 9.917 10.730 1.00 98.94 231 A 1 +ATOM 1758 C CD2 . PHE A 1 231 ? -6.758 9.884 8.613 1.00 98.96 231 A 1 +ATOM 1759 C CE1 . PHE A 1 231 ? -4.513 9.186 10.149 1.00 98.95 231 A 1 +ATOM 1760 C CE2 . PHE A 1 231 ? -5.709 9.147 8.032 1.00 98.93 231 A 1 +ATOM 1761 C CZ . PHE A 1 231 ? -4.595 8.808 8.801 1.00 98.96 231 A 1 +ATOM 1762 N N . PHE A 1 232 ? -9.132 8.337 11.668 1.00 98.92 232 A 1 +ATOM 1763 C CA . PHE A 1 232 ? -9.030 6.896 11.898 1.00 98.97 232 A 1 +ATOM 1764 C C . PHE A 1 232 ? -10.243 6.136 11.355 1.00 98.99 232 A 1 +ATOM 1765 O O . PHE A 1 232 ? -10.082 5.068 10.758 1.00 98.93 232 A 1 +ATOM 1766 C CB . PHE A 1 232 ? -8.834 6.617 13.396 1.00 98.96 232 A 1 +ATOM 1767 C CG . PHE A 1 232 ? -7.401 6.703 13.906 1.00 98.94 232 A 1 +ATOM 1768 C CD1 . PHE A 1 232 ? -6.432 7.513 13.290 1.00 98.79 232 A 1 +ATOM 1769 C CD2 . PHE A 1 232 ? -7.044 5.928 15.025 1.00 98.77 232 A 1 +ATOM 1770 C CE1 . PHE A 1 232 ? -5.117 7.546 13.783 1.00 98.71 232 A 1 +ATOM 1771 C CE2 . PHE A 1 232 ? -5.729 5.964 15.525 1.00 98.68 232 A 1 +ATOM 1772 C CZ . PHE A 1 232 ? -4.764 6.773 14.905 1.00 98.78 232 A 1 +ATOM 1773 N N . ALA A 1 233 ? -11.449 6.704 11.506 1.00 98.90 233 A 1 +ATOM 1774 C CA . ALA A 1 233 ? -12.668 6.129 10.949 1.00 98.96 233 A 1 +ATOM 1775 C C . ALA A 1 233 ? -12.617 6.060 9.411 1.00 98.91 233 A 1 +ATOM 1776 O O . ALA A 1 233 ? -12.752 4.977 8.837 1.00 98.92 233 A 1 +ATOM 1777 C CB . ALA A 1 233 ? -13.864 6.940 11.458 1.00 98.94 233 A 1 +ATOM 1778 N N . ASP A 1 234 ? -12.342 7.195 8.757 1.00 98.90 234 A 1 +ATOM 1779 C CA . ASP A 1 234 ? -12.311 7.278 7.300 1.00 98.93 234 A 1 +ATOM 1780 C C . ASP A 1 234 ? -11.125 6.487 6.710 1.00 98.96 234 A 1 +ATOM 1781 O O . ASP A 1 234 ? -11.255 5.844 5.659 1.00 98.92 234 A 1 +ATOM 1782 C CB . ASP A 1 234 ? -12.265 8.762 6.866 1.00 98.95 234 A 1 +ATOM 1783 C CG . ASP A 1 234 ? -13.525 9.598 7.175 1.00 98.91 234 A 1 +ATOM 1784 O OD1 . ASP A 1 234 ? -14.576 9.064 7.590 1.00 98.56 234 A 1 +ATOM 1785 O OD2 . ASP A 1 234 ? -13.482 10.837 6.980 1.00 98.47 234 A 1 +ATOM 1786 N N . TYR A 1 235 ? -9.976 6.437 7.413 1.00 98.96 235 A 1 +ATOM 1787 C CA . TYR A 1 235 ? -8.830 5.619 7.014 1.00 98.98 235 A 1 +ATOM 1788 C C . TYR A 1 235 ? -9.140 4.128 7.078 1.00 98.95 235 A 1 +ATOM 1789 O O . TYR A 1 235 ? -8.805 3.391 6.147 1.00 98.96 235 A 1 +ATOM 1790 C CB . TYR A 1 235 ? -7.610 5.938 7.877 1.00 98.97 235 A 1 +ATOM 1791 C CG . TYR A 1 235 ? -6.386 5.136 7.463 1.00 98.98 235 A 1 +ATOM 1792 C CD1 . TYR A 1 235 ? -6.183 3.837 7.974 1.00 98.97 235 A 1 +ATOM 1793 C CD2 . TYR A 1 235 ? -5.492 5.649 6.506 1.00 98.96 235 A 1 +ATOM 1794 C CE1 . TYR A 1 235 ? -5.109 3.058 7.521 1.00 98.95 235 A 1 +ATOM 1795 C CE2 . TYR A 1 235 ? -4.406 4.875 6.057 1.00 98.94 235 A 1 +ATOM 1796 C CZ . TYR A 1 235 ? -4.222 3.579 6.566 1.00 98.97 235 A 1 +ATOM 1797 O OH . TYR A 1 235 ? -3.181 2.810 6.109 1.00 98.93 235 A 1 +ATOM 1798 N N . ALA A 1 236 ? -9.786 3.650 8.148 1.00 98.99 236 A 1 +ATOM 1799 C CA . ALA A 1 236 ? -10.152 2.241 8.272 1.00 98.91 236 A 1 +ATOM 1800 C C . ALA A 1 236 ? -11.100 1.810 7.150 1.00 98.94 236 A 1 +ATOM 1801 O O . ALA A 1 236 ? -10.906 0.744 6.556 1.00 98.89 236 A 1 +ATOM 1802 C CB . ALA A 1 236 ? -10.760 2.000 9.652 1.00 98.93 236 A 1 +ATOM 1803 N N . GLU A 1 237 ? -12.078 2.658 6.806 1.00 98.90 237 A 1 +ATOM 1804 C CA . GLU A 1 237 ? -12.993 2.424 5.685 1.00 98.80 237 A 1 +ATOM 1805 C C . GLU A 1 237 ? -12.236 2.368 4.346 1.00 98.86 237 A 1 +ATOM 1806 O O . GLU A 1 237 ? -12.374 1.406 3.587 1.00 98.73 237 A 1 +ATOM 1807 C CB . GLU A 1 237 ? -14.073 3.518 5.672 1.00 98.70 237 A 1 +ATOM 1808 C CG . GLU A 1 237 ? -15.150 3.209 4.620 1.00 90.50 237 A 1 +ATOM 1809 C CD . GLU A 1 237 ? -16.260 4.279 4.501 1.00 90.56 237 A 1 +ATOM 1810 O OE1 . GLU A 1 237 ? -16.855 4.328 3.396 1.00 80.95 237 A 1 +ATOM 1811 O OE2 . GLU A 1 237 ? -16.529 5.005 5.469 1.00 85.71 237 A 1 +ATOM 1812 N N . ALA A 1 238 ? -11.397 3.369 4.071 1.00 98.82 238 A 1 +ATOM 1813 C CA . ALA A 1 238 ? -10.661 3.463 2.821 1.00 98.80 238 A 1 +ATOM 1814 C C . ALA A 1 238 ? -9.629 2.335 2.662 1.00 98.89 238 A 1 +ATOM 1815 O O . ALA A 1 238 ? -9.503 1.749 1.580 1.00 98.86 238 A 1 +ATOM 1816 C CB . ALA A 1 238 ? -10.010 4.850 2.765 1.00 98.92 238 A 1 +ATOM 1817 N N . HIS A 1 239 ? -8.914 1.975 3.731 1.00 98.90 239 A 1 +ATOM 1818 C CA . HIS A 1 239 ? -7.954 0.867 3.697 1.00 98.96 239 A 1 +ATOM 1819 C C . HIS A 1 239 ? -8.656 -0.470 3.485 1.00 98.98 239 A 1 +ATOM 1820 O O . HIS A 1 239 ? -8.199 -1.275 2.667 1.00 98.87 239 A 1 +ATOM 1821 C CB . HIS A 1 239 ? -7.098 0.876 4.967 1.00 98.92 239 A 1 +ATOM 1822 C CG . HIS A 1 239 ? -5.920 -0.084 4.976 1.00 98.92 239 A 1 +ATOM 1823 N ND1 . HIS A 1 239 ? -4.961 -0.140 5.971 1.00 96.98 239 A 1 +ATOM 1824 C CD2 . HIS A 1 239 ? -5.572 -1.033 4.055 1.00 96.50 239 A 1 +ATOM 1825 C CE1 . HIS A 1 239 ? -4.076 -1.103 5.662 1.00 97.13 239 A 1 +ATOM 1826 N NE2 . HIS A 1 239 ? -4.417 -1.673 4.497 1.00 97.60 239 A 1 +ATOM 1827 N N . GLN A 1 240 ? -9.798 -0.716 4.143 1.00 98.88 240 A 1 +ATOM 1828 C CA . GLN A 1 240 ? -10.592 -1.909 3.863 1.00 98.84 240 A 1 +ATOM 1829 C C . GLN A 1 240 ? -10.965 -1.984 2.385 1.00 98.72 240 A 1 +ATOM 1830 O O . GLN A 1 240 ? -10.646 -2.971 1.725 1.00 98.76 240 A 1 +ATOM 1831 C CB . GLN A 1 240 ? -11.826 -1.959 4.776 1.00 98.79 240 A 1 +ATOM 1832 C CG . GLN A 1 240 ? -12.608 -3.261 4.521 1.00 98.55 240 A 1 +ATOM 1833 C CD . GLN A 1 240 ? -13.876 -3.404 5.343 1.00 98.52 240 A 1 +ATOM 1834 O OE1 . GLN A 1 240 ? -14.247 -2.598 6.178 1.00 96.55 240 A 1 +ATOM 1835 N NE2 . GLN A 1 240 ? -14.602 -4.467 5.113 1.00 96.22 240 A 1 +ATOM 1836 N N . LYS A 1 241 ? -11.574 -0.901 1.822 1.00 98.61 241 A 1 +ATOM 1837 C CA . LYS A 1 241 ? -11.927 -0.833 0.392 1.00 98.54 241 A 1 +ATOM 1838 C C . LYS A 1 241 ? -10.720 -1.109 -0.508 1.00 98.51 241 A 1 +ATOM 1839 O O . LYS A 1 241 ? -10.820 -1.954 -1.391 1.00 98.61 241 A 1 +ATOM 1840 C CB . LYS A 1 241 ? -12.493 0.548 0.046 1.00 98.53 241 A 1 +ATOM 1841 C CG . LYS A 1 241 ? -13.896 0.837 0.610 1.00 97.77 241 A 1 +ATOM 1842 C CD . LYS A 1 241 ? -14.193 2.316 0.355 1.00 97.20 241 A 1 +ATOM 1843 C CE . LYS A 1 241 ? -15.488 2.782 1.003 1.00 94.71 241 A 1 +ATOM 1844 N NZ . LYS A 1 241 ? -15.543 4.272 0.988 1.00 93.47 241 A 1 +ATOM 1845 N N . LEU A 1 242 ? -9.582 -0.447 -0.262 1.00 98.60 242 A 1 +ATOM 1846 C CA . LEU A 1 242 ? -8.351 -0.644 -1.027 1.00 98.76 242 A 1 +ATOM 1847 C C . LEU A 1 242 ? -7.908 -2.113 -0.997 1.00 98.72 242 A 1 +ATOM 1848 O O . LEU A 1 242 ? -7.679 -2.714 -2.041 1.00 98.79 242 A 1 +ATOM 1849 C CB . LEU A 1 242 ? -7.255 0.284 -0.472 1.00 98.83 242 A 1 +ATOM 1850 C CG . LEU A 1 242 ? -5.872 0.111 -1.137 1.00 98.77 242 A 1 +ATOM 1851 C CD1 . LEU A 1 242 ? -5.884 0.515 -2.604 1.00 98.77 242 A 1 +ATOM 1852 C CD2 . LEU A 1 242 ? -4.831 0.951 -0.421 1.00 98.74 242 A 1 +ATOM 1853 N N . SER A 1 243 ? -7.857 -2.719 0.195 1.00 98.71 243 A 1 +ATOM 1854 C CA . SER A 1 243 ? -7.430 -4.112 0.389 1.00 98.72 243 A 1 +ATOM 1855 C C . SER A 1 243 ? -8.362 -5.139 -0.260 1.00 98.77 243 A 1 +ATOM 1856 O O . SER A 1 243 ? -7.995 -6.303 -0.413 1.00 98.77 243 A 1 +ATOM 1857 C CB . SER A 1 243 ? -7.267 -4.395 1.888 1.00 98.81 243 A 1 +ATOM 1858 O OG . SER A 1 243 ? -8.514 -4.611 2.527 1.00 98.06 243 A 1 +ATOM 1859 N N . GLU A 1 244 ? -9.575 -4.725 -0.648 1.00 98.50 244 A 1 +ATOM 1860 C CA . GLU A 1 244 ? -10.633 -5.567 -1.194 1.00 98.45 244 A 1 +ATOM 1861 C C . GLU A 1 244 ? -10.984 -5.239 -2.661 1.00 98.39 244 A 1 +ATOM 1862 O O . GLU A 1 244 ? -11.977 -5.734 -3.189 1.00 98.30 244 A 1 +ATOM 1863 C CB . GLU A 1 244 ? -11.872 -5.475 -0.293 1.00 98.57 244 A 1 +ATOM 1864 C CG . GLU A 1 244 ? -11.647 -6.119 1.087 1.00 98.55 244 A 1 +ATOM 1865 C CD . GLU A 1 244 ? -12.877 -6.024 2.003 1.00 98.64 244 A 1 +ATOM 1866 O OE1 . GLU A 1 244 ? -12.796 -6.553 3.136 1.00 98.17 244 A 1 +ATOM 1867 O OE2 . GLU A 1 244 ? -13.915 -5.464 1.589 1.00 98.39 244 A 1 +ATOM 1868 N N . LEU A 1 245 ? -10.190 -4.403 -3.351 1.00 98.19 245 A 1 +ATOM 1869 C CA . LEU A 1 245 ? -10.428 -4.069 -4.757 1.00 98.11 245 A 1 +ATOM 1870 C C . LEU A 1 245 ? -10.380 -5.324 -5.650 1.00 98.10 245 A 1 +ATOM 1871 O O . LEU A 1 245 ? -9.407 -6.079 -5.641 1.00 98.29 245 A 1 +ATOM 1872 C CB . LEU A 1 245 ? -9.411 -3.026 -5.245 1.00 98.20 245 A 1 +ATOM 1873 C CG . LEU A 1 245 ? -9.574 -1.626 -4.626 1.00 98.08 245 A 1 +ATOM 1874 C CD1 . LEU A 1 245 ? -8.410 -0.740 -5.080 1.00 98.17 245 A 1 +ATOM 1875 C CD2 . LEU A 1 245 ? -10.882 -0.950 -5.021 1.00 98.05 245 A 1 +ATOM 1876 N N . GLY A 1 246 ? -11.436 -5.557 -6.430 1.00 98.24 246 A 1 +ATOM 1877 C CA . GLY A 1 246 ? -11.570 -6.721 -7.297 1.00 98.13 246 A 1 +ATOM 1878 C C . GLY A 1 246 ? -11.829 -8.050 -6.576 1.00 98.30 246 A 1 +ATOM 1879 O O . GLY A 1 246 ? -11.866 -9.105 -7.224 1.00 98.21 246 A 1 +ATOM 1880 N N . PHE A 1 247 ? -11.999 -8.022 -5.247 1.00 98.42 247 A 1 +ATOM 1881 C CA . PHE A 1 247 ? -12.273 -9.171 -4.389 1.00 98.59 247 A 1 +ATOM 1882 C C . PHE A 1 247 ? -13.708 -9.114 -3.850 1.00 98.48 247 A 1 +ATOM 1883 O O . PHE A 1 247 ? -14.213 -8.033 -3.553 1.00 98.26 247 A 1 +ATOM 1884 C CB . PHE A 1 247 ? -11.238 -9.205 -3.256 1.00 98.62 247 A 1 +ATOM 1885 C CG . PHE A 1 247 ? -11.523 -10.213 -2.169 1.00 98.76 247 A 1 +ATOM 1886 C CD1 . PHE A 1 247 ? -11.757 -9.769 -0.842 1.00 98.67 247 A 1 +ATOM 1887 C CD2 . PHE A 1 247 ? -11.581 -11.581 -2.460 1.00 98.70 247 A 1 +ATOM 1888 C CE1 . PHE A 1 247 ? -12.037 -10.694 0.172 1.00 98.70 247 A 1 +ATOM 1889 C CE2 . PHE A 1 247 ? -11.870 -12.510 -1.438 1.00 98.69 247 A 1 +ATOM 1890 C CZ . PHE A 1 247 ? -12.089 -12.067 -0.124 1.00 98.75 247 A 1 +ATOM 1891 N N . ALA A 1 248 ? -14.359 -10.253 -3.711 1.00 97.80 248 A 1 +ATOM 1892 C CA . ALA A 1 248 ? -15.724 -10.391 -3.206 1.00 97.68 248 A 1 +ATOM 1893 C C . ALA A 1 248 ? -16.745 -9.499 -3.959 1.00 96.50 248 A 1 +ATOM 1894 O O . ALA A 1 248 ? -17.444 -8.682 -3.369 1.00 92.64 248 A 1 +ATOM 1895 C CB . ALA A 1 248 ? -15.721 -10.198 -1.686 1.00 97.46 248 A 1 +ATOM 1896 N N . ASP A 1 249 ? -16.812 -9.660 -5.289 1.00 86.45 249 A 1 +ATOM 1897 C CA . ASP A 1 249 ? -17.755 -9.015 -6.226 1.00 80.63 249 A 1 +ATOM 1898 C C . ASP A 1 249 ? -17.619 -7.480 -6.375 1.00 77.80 249 A 1 +ATOM 1899 O O . ASP A 1 249 ? -18.586 -6.790 -6.700 1.00 70.68 249 A 1 +ATOM 1900 C CB . ASP A 1 249 ? -19.194 -9.480 -5.955 1.00 72.64 249 A 1 +ATOM 1901 C CG . ASP A 1 249 ? -19.334 -11.009 -5.885 1.00 69.12 249 A 1 +ATOM 1902 O OD1 . ASP A 1 249 ? -18.690 -11.677 -6.724 1.00 66.72 249 A 1 +ATOM 1903 O OD2 . ASP A 1 249 ? -20.087 -11.484 -5.012 1.00 65.48 249 A 1 +ATOM 1904 N N . ALA A 1 250 ? -16.417 -6.936 -6.157 1.00 73.01 250 A 1 +ATOM 1905 C CA . ALA A 1 250 ? -16.083 -5.521 -6.397 1.00 74.15 250 A 1 +ATOM 1906 C C . ALA A 1 250 ? -16.035 -5.107 -7.873 1.00 66.74 250 A 1 +ATOM 1907 O O . ALA A 1 250 ? -15.620 -5.921 -8.725 1.00 58.67 250 A 1 +ATOM 1908 C CB . ALA A 1 250 ? -14.764 -5.192 -5.720 1.00 67.88 250 A 1 +ATOM 1909 O OXT . ALA A 1 250 ? -16.336 -3.921 -8.118 1.00 56.85 250 A 1 +# diff --git a/data/example_protein/apex.fasta b/data/example_protein/apex.fasta new file mode 100644 index 0000000000000000000000000000000000000000..0d324aade9db9272ed528cd49d0b91452b415c61 --- /dev/null +++ b/data/example_protein/apex.fasta @@ -0,0 +1,2 @@ +>Lam2015_APEX_translation Expresses APEX2 in the cytosol of mammalian cells +MGKSYPTVSADYQDAVEKAKKKLRGFIAEKRCAPLMLRLAFHSAGTFDKGTKTGGPFGTIKHPAELAHSANNGLDIAVRLLEPLKAEFPILSYADFYQLAGVVAVEVTGGPKVPFHPGREDKPEPPPEGRLPDATKGSDHLRDVFGKAMGLTDQDIVALSGGHTIGAAHKERSGFEGPWTSNPLIFDNSYFTELLSGEKEGLLQLPSDKALLSDPVFRPLVDKYAADEDAFFADYAEAHQKLSELGFADA diff --git a/data/example_protein/combo_muts.csv b/data/example_protein/combo_muts.csv new file mode 100644 index 0000000000000000000000000000000000000000..7960ea2540664a153cc592edf967687e094a1075 --- /dev/null +++ b/data/example_protein/combo_muts.csv @@ -0,0 +1,15 @@ +T192V +T192K +A167R +N72A +D222E +A148Q +D229A +S138A +K61R +S196A +I185V +L84V +E87Q +G50R +L80M \ No newline at end of file diff --git a/data/example_protein/example_dataset.csv b/data/example_protein/example_dataset.csv new file mode 100644 index 0000000000000000000000000000000000000000..7ef81f33848d249b12b26c12a9b0cde5b0a2649d --- /dev/null +++ b/data/example_protein/example_dataset.csv @@ -0,0 +1,185 @@ +mutation,property_value,round +WT,1,0 +A167R/T192V,5.003,1 +T192V,2.327,0 +T192K,2.637,0 +A167R,2.277,0 +N72A,2.157,0 +D222E,1.843,0 +A148Q,1.733,0 +D229A,1.73,0 +S138A,1.697,0 +K61R,1.66,0 +S196A,1.527,0 +I185V,1.443,0 +L84V,1.527,0 +E87Q,1.49,0 +G50R,1.877,0 +L80M,1.447,0 +K21R,1.31,0 +A148R,1.307,0 +S69G,1.3,0 +G50N,1.29,0 +Q240L,1.277,0 +P123A,1.267,0 +E237K,1.213,0 +K20R,1.19,0 +L84I,1.19,0 +S213T,1.19,0 +D143E,1.153,0 +A250D,1.14,0 +Q154K,1.1,0 +K21A,1.07,0 +G2A,0.997,0 +F47Y,0.993,0 +K22D,0.937,0 +E171D,0.897,0 +R31N,0.86,0 +S43E,0.83,0 +F26L,0.823,0 +I165L,0.803,0 +E128A,0.717,0 +G162A,0.603,0 +Y93W,0.557,0 +K49A,0.55,0 +N182T,0.49,0 +H116R,0.483,0 +Q240E,0.36,0 +H68Y,0.253,0 +K3H,0.24,0 +Q204L,0.223,0 +K170G,0.197,0 +F247C,0.15,0 +H239W,0.137,0 +H239L,0.033,0 +L220W,0.753,0 +A168C,0.297,0 +G50E,1.423,0 +V216G,0.903,0 +A148H,1.297,0 +G146I,1.387,0 +K49V,0.663,0 +R31P,0.237,0 +G2P,0.863,0 +P123L,0.987,0 +E120I,1.033,0 +L81C,0.417,0 +L66Q,0.34,0 +F57N,0.277,0 +L35I,1.247,0 +V102C,0.513,0 +A10P,1.233,0 +P123K,1.123,0 +T7P,1.133,0 +V216D,0.833,0 +D143Y,0.74,0 +E128P,1.067,0 +E65M,0.5,0 +R172Y,0.787,0 +G25E,1.24,0 +L37V,0.23,0 +K85M,0.49,0 +L141A,0.287,0 +A148M,0.923,0 +L205F,0.353,0 +A167R/T192K,7.267,1 +N72A/T192V,4.3,1 +N72A/T192K,6.273,1 +N72A/A167R,4.723,1 +T192V/D222E,3.81,1 +T192K/D222E,5.47,1 +A167R/D222E,5.91,1 +N72A/D222E,5.7,1 +A148Q/T192V,2.147,1 +A148Q/T192K,3.333,1 +A148Q/A167R,3.46,1 +N72A/A148Q,3.08,1 +A148Q/D222E,3.193,1 +T192V/D229A,3.17,1 +T192K/D229A,4.523,1 +A167R/D229A,4.557,1 +N72A/D229A,3.973,1 +D222E/D229A,3.023,1 +A148Q/D229A,2.32,1 +S138A/T192V,3.007,1 +S138A/T192K,5.277,1 +S138A/A167R,4.847,1 +N72A/S138A,4.453,1 +S138A/D222E,4.233,1 +S138A/D229A,3.477,1 +K61R/T192V,2.41,1 +K61R/T192K,4.253,1 +K61R/A167R,4.153,1 +K61R/N72A,3.037,1 +K61R/D222E,2.923,1 +K61R/A148Q,2.417,1 +K61R/D229A,2.873,1 +K61R/S138A,3.103,1 +T192V/S196A,3.627,1 +A167R/S196A,3.24,1 +N72A/S196A,2.697,1 +S196A/D222E,2.26,1 +A148Q/S196A,1.953,1 +S196A/D229A,1.85,1 +S138A/S196A,2.167,1 +K61R/S196A,2.533,1 +I185V/T192V,3.023,1 +I185V/T192K,4.017,1 +A167R/I185V,3.277,1 +N72A/I185V,2.313,1 +I185V/D222E,2.373,1 +A148Q/I185V,2.013,1 +I185V/D229A,1.977,1 +S138A/I185V,2.453,1 +K61R/I185V,2.293,1 +I185V/S196A,2.06,1 +L84V/T192V,1.963,1 +L84V/T192K,3.53,1 +L84V/A167R,3.033,1 +N72A/L84V,2.573,1 +L84V/D222E,2.43,1 +L84V/A148Q,1.967,1 +L84V/D229A,2.103,1 +L84V/S138A,2.417,1 +K61R/L84V,2.4,1 +L84V/S196A,1.327,1 +L84V/I185V,1.487,1 +E87Q/T192V,1.8,1 +E87Q/T192K,2.397,1 +E87Q/A167R,3.04,1 +N72A/E87Q,2.43,1 +E87Q/D222E,2.597,1 +E87Q/A148Q,1.99,1 +E87Q/D229A,1.943,1 +E87Q/S138A,1.297,1 +K61R/E87Q,1.307,1 +E87Q/S196A,1.32,1 +E87Q/I185V,1.05,1 +L84V/E87Q,1.113,1 +G50R/T192V,1.913,1 +G50R/T192K,2.997,1 +G50R/A167R,3.003,1 +G50R/N72A,2.48,1 +G50R/D222E,1.83,1 +G50R/A148Q,1.31,1 +G50R/D229A,1.283,1 +G50R/S138A,1.483,1 +G50R/K61R,1.36,1 +G50R/S196A,1.507,1 +G50R/I185V,1.483,1 +G50R/L84V,1.42,1 +G50R/E87Q,1.577,1 +L80M/T192V,1.84,1 +L80M/T192K,2.83,1 +L80M/A167R,2.517,1 +N72A/L80M,2.14,1 +L80M/D222E,2.127,1 +L80M/A148Q,1.797,1 +L80M/D229A,1.757,1 +L80M/S138A,1.897,1 +K61R/L80M,1.237,1 +L80M/S196A,1.25,1 +L80M/I185V,1.187,1 +L80M/L84V,1.237,1 +L80M/E87Q,0.827,1 +G50R/L80M,1.353,1 \ No newline at end of file diff --git a/data/example_protein/run.sh b/data/example_protein/run.sh new file mode 100644 index 0000000000000000000000000000000000000000..5a02b243505c9cf33daf02a0812e1d8a14ae7c94 --- /dev/null +++ b/data/example_protein/run.sh @@ -0,0 +1,43 @@ +#!/bin/bash +module purge +module load sghpc-mpi-gcc/26.3 +#module load compiler/dtk/25.04 +source /public/software/apps/anaconda3/2023.09/etc/profile.d/conda.sh +conda activate model_bio +export WANDB_MODE=disabled +export WANDB_SILENT=true +export WANDB_DISABLED=true + + +export HIP_VISIBLE_DEVICES=1 + +#python -u ~/.conda/envs/model_bio/bin/p1_train.py \ +# --experiment-name multievolve_example \ +# --protein-name example_protein \ +# --wt-files apex.fasta \ +# --training-dataset-fname example_dataset.csv \ +# --wandb-key dummy_key \ +# --mode test + +#检查模型文件 +#find /public/home/scnb9biwet/jiangqq/MULTI-evolve-main/proteins/example_protein/model_cache -name "*.pth" -o -name "*.pt" + +## Step 2:Propose MULTI-evolve Variants,利用训练好的模型来推荐突变 +#python -u ~/.conda/envs/model_bio/bin/p2_propose.py \ +#--experiment-name multievolve_example \ +#--protein-name example_protein \ +#--wt-files apex.fasta \ +#--training-dataset example_dataset.csv \ +#--mutation-pool combo_muts.csv \ +#--top-muts-per-load 3 \ +#--export-name multievolve_proposals + +## step 3: 生成 MULTI-assembly 寡核苷酸 +python -u ~/.conda/envs/model_bio/bin/p3_assembly_design.py \ +--mutations-file ../../proteins/example_protein/multievolve_proposals.csv \ +--wt-fasta APEX_33overhang.fasta \ +--overhang 33 \ +--species human \ +--oligo-direction top \ +--tm 80 \ +--output design diff --git a/env.yml b/env.yml new file mode 100644 index 0000000000000000000000000000000000000000..3fb03193ec46ef1bc958b867d22089b597535634 --- /dev/null +++ b/env.yml @@ -0,0 +1,26 @@ +# updated 5/21/2025 +name: multievolve +channels: + - conda-forge +dependencies: + - python=3.11 + - pip + - tqdm + - ipykernel + - numpy=1.26 + - pandas=2.2 + - matplotlib + - seaborn=0.13 + - scipy=1.15 + - biopython=1.85 + - scikit-learn=1.6 + - scikit-optimize=0.10 + - pip: + - torch==2.6.0 + - wandb==0.19 + - Levenshtein + - streamlit==1.45 + - fair-esm + - biotite==0.41.2 + - ankh + - protobuf \ No newline at end of file diff --git a/env_mac.yml b/env_mac.yml new file mode 100644 index 0000000000000000000000000000000000000000..abe7bebcaeecf8081db402981f7f940f68174bf1 --- /dev/null +++ b/env_mac.yml @@ -0,0 +1,27 @@ +# updated 5/21/2025 +name: multievolve +channels: + - conda-forge +dependencies: + - python=3.11 + - pip + - tqdm + - ipykernel + - numpy=1.26 + - pandas=2.2 + - matplotlib + - seaborn=0.13 + - scipy=1.15 + - biopython=1.85 + - scikit-learn=1.6 + - scikit-optimize=0.10 + - pip: + - torch==2.2.2 + - transformers==4.42.4 + - wandb==0.19 + - Levenshtein + - streamlit==1.45 + - fair-esm + - biotite==0.41.2 + - ankh + - protobuf \ No newline at end of file diff --git a/hub/checkpoints/esm2_t36_3B_UR50D-contact-regression.pt b/hub/checkpoints/esm2_t36_3B_UR50D-contact-regression.pt new file mode 100644 index 0000000000000000000000000000000000000000..042e38b40e9a0e0549e419f2aa2477f97b4d1121 --- /dev/null +++ b/hub/checkpoints/esm2_t36_3B_UR50D-contact-regression.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4da500eab246481dc9c8c95bc7b1d02f2803d761c380b0e95186d4a07d0fc84e +size 6759 diff --git a/model/__init__.py b/model/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..17da2886d5b58d177eecbe8ba40b4745b198eb59 --- /dev/null +++ b/model/__init__.py @@ -0,0 +1,6 @@ +# Import main components +from model.splitters import * +from model.predictors import * +from model.proposers import * +from model.utils import * +from model.featurizers import * \ No newline at end of file diff --git a/model/featurizers/__init__.py b/model/featurizers/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..bc4f8e183d9eab4886f141ada1e6bb9771f99eb2 --- /dev/null +++ b/model/featurizers/__init__.py @@ -0,0 +1,7 @@ +from model.featurizers.base_featurizers import * +from model.featurizers.esm_featurizers import * +from model.featurizers.msa_featurizers import * +from model.featurizers.zeroshot_featurizers import * +from model.featurizers.combinatorial_featurizers import * +from model.featurizers.ankh_featurizers import * +from model.featurizers.prott5_featurizers import * \ No newline at end of file diff --git a/model/featurizers/ankh_featurizers.py b/model/featurizers/ankh_featurizers.py new file mode 100644 index 0000000000000000000000000000000000000000..de673ff2e8e9639935aa1d67596dd1d60ca2d070 --- /dev/null +++ b/model/featurizers/ankh_featurizers.py @@ -0,0 +1,82 @@ +import ankh +import numpy as np +import torch + +from model.featurizers.base_featurizers import BaseFeaturizer + +# alternate name: AnkhBaseFeaturizer +class AnkhFeaturizer(BaseFeaturizer): + def __init__(self, + protein=None, + use_cache=False, + model_version=None, + batch_size=968, + model_type="ankh", + **kwargs): + + super().__init__(model_type,protein, use_cache, **kwargs) + + self.batch_size = batch_size + self.model_version = model_version + + def featurize_ankh(self, seqs): + + if self.model_version == 'large': + self.model, self.tokenizer = ankh.load_large_model() + elif self.model_version == 'base': + self.model, self.tokenizer = ankh.load_base_model() + else: + raise ValueError(f"Invalid model version: {self.model_version}") + self.model.eval() + self.model.to(self.device) + + input_seqs = [list(seq) for seq in seqs] + + seq_batch = [] + + for i in range(0, len(input_seqs), self.batch_size): + batch = input_seqs[i:i + self.batch_size] + outputs = self.tokenizer( + batch, + add_special_tokens=True, + padding=True, + is_split_into_words=True, + return_tensors="pt", + ) + outputs = {key: val.to(self.device) for key, val in outputs.items()} + with torch.no_grad(): + embeddings = self.model(input_ids=outputs['input_ids'], attention_mask=outputs['attention_mask']) + seq_batch.append(embeddings['last_hidden_state'].mean(axis=1).cpu().numpy()) + + return np.concatenate(seq_batch) + +# alternate name: AnkhBaseEmbedFeaturizer +class AnkhBaseFeaturizer(AnkhFeaturizer): + def __init__(self, + protein=None, + use_cache=False, + model_version="base", + batch_size=968, + model_type="ankh_base", + **kwargs): + super().__init__(protein, use_cache, model_version, batch_size, model_type, **kwargs) + + def custom_featurizer(self, seqs): + + X = self.featurize_ankh(seqs) + return X + +# alternate name: AnkhLargeEmbedFeaturizer +class AnkhLargeFeaturizer(AnkhFeaturizer): + def __init__(self, + protein=None, + use_cache=False, + model_version="large", + batch_size=968, + model_type="ankh_large", + **kwargs): + super().__init__(protein, use_cache, model_version, batch_size, model_type, **kwargs) + + def custom_featurizer(self, seqs): + X = self.featurize_ankh(seqs) + return X \ No newline at end of file diff --git a/model/featurizers/base_featurizers.py b/model/featurizers/base_featurizers.py new file mode 100644 index 0000000000000000000000000000000000000000..7fff3b6d4c928180c90580c69d89631faeb5b113 --- /dev/null +++ b/model/featurizers/base_featurizers.py @@ -0,0 +1,266 @@ +from abc import ABC, abstractmethod +import numpy as np +import torch + +# root_folder = os.path.dirname(os.path.dirname(__file__)) +# sys.path.append(root_folder) + +from model.utils.other_utils import AAs +from model.utils.featurizer_utils import seqs_to_georgiev, featurize_aa_idx +from model.utils.cache_utils import load_cache, update_cache + + +class BaseFeaturizer(ABC): + """Abstract base class for featurizers. + + Attributes: + model_type (str): Type of featurization model to use. + name (str): Name of the featurizer. + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache featurization results. + flatten_features (bool): Whether to flatten output features. + device (torch.device): Device to use for computation. + + Example Usage: + + featurizer = BaseFeaturizer( + model_type='onehot', # Type of featurization used + protein='protein1', # Name of protein for caching + use_cache=True, # Whether to cache results + flatten_features=False # Whether to flatten output features + ) + features = featurizer.featurize(sequences) + """ + + def __init__(self, model_type=None, protein=None, use_cache=False, flatten_features=False, **kwargs): + """ + Args: + model_type (str): Type of featurization model. + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache results. + flatten_features (bool): Whether to flatten output features. + **kwargs: Additional keyword arguments. + """ + self.model_type = model_type + self.name = str(model_type) + self.protein = protein + self.use_cache = use_cache + self.flatten_features = flatten_features + self.set_parameters(**kwargs) + + if torch.backends.mps.is_available(): + self.device = torch.device("mps") + elif torch.cuda.is_available(): + self.device = torch.device("cuda:0") + else: + self.device = torch.device("cpu") + + def set_parameters(self, **kwargs): + """Sets additional parameters from kwargs.""" + for key, value in kwargs.items(): + setattr(self, key, value) + + def load_features(self, seqs): + """ + Loads cached features if they exist. + + Args: + seqs (list): List of sequences to featurize. + + Returns: + tuple: (seq_to_feature dict, original sequences, unique sorted sequences) + """ + print("Loading features...") + + assert ( + self.protein is not None + ), "No protein specified to cache. Either specify a protein or set use_cache to False." + original_seqs = seqs + cache = load_cache(self.model_type, self.protein) + seq_to_feature = {seq: cache[seq] for seq in seqs if seq in cache} + seqs = [seq for seq in seqs if seq not in cache] + print(f"Seqs in cache: {len(seq_to_feature)} | Seqs not in cache: {len(seqs)}") + del cache # free up memory + + unique_seqs = {} + for seq in seqs: + if seq not in unique_seqs: + unique_seqs[seq] = len(unique_seqs) + + unique_seqs_sorted = sorted(unique_seqs.keys(), key=lambda k: unique_seqs[k]) + + return seq_to_feature, original_seqs, unique_seqs_sorted + + @abstractmethod + def custom_featurizer(self, seqs, **kwargs): + """ + Custom featurizer to be implemented in subclasses. + + Args: + seqs (list): List of sequences to featurize. + **kwargs: Additional keyword arguments. + """ + pass + + def featurize(self, seqs, **kwargs): + """ + Featurizes input sequences. + + Args: + seqs (list): List of sequences to featurize. + **kwargs: Additional keyword arguments. + + Returns: + np.ndarray: Array of featurized sequences. + """ + if self.use_cache: + seqs_to_feature, original_seqs, unique_seqs_sorted = self.load_features( + seqs + ) + else: + seqs_to_feature = {} + original_seqs, unique_seqs_sorted = seqs, seqs + + if len(unique_seqs_sorted) > 0: + X_unique = self.custom_featurizer(unique_seqs_sorted, **kwargs) + + for idx, seq in enumerate(unique_seqs_sorted): + seqs_to_feature[seq] = X_unique[idx] + + if self.use_cache: + update_cache(self.model_type, self.protein, seqs_to_feature) + + X = np.array([seqs_to_feature[seq] for seq in original_seqs]) + + if self.flatten_features == True: + X = X.reshape(len(X), -1) + + return X + + +class OneHotFeaturizer(BaseFeaturizer): + """Class for one-hot encoding of sequences. + + Attributes: + model_type (str): Type of featurization model to use. + name (str): Name of the featurizer. + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache featurization results. + flatten_features (bool): Whether to flatten output features. + device (torch.device): Device to use for computation. + + Example Usage: + + featurizer = OneHotFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True, # Whether to cache results + flatten_features=False # Whether to flatten output features + ) + features = featurizer.featurize(sequences) + """ + + def __init__(self, **kwargs) -> None: + super().__init__(model_type="onehot", **kwargs) + + def custom_featurizer(self, seqs, **kwargs): + """ + One-hot encodes sequences. + + Args: + seqs (list): List of sequences to encode. + **kwargs: Additional keyword arguments. + + Returns: + np.ndarray: One-hot encoded sequences. + """ + data = [[char for char in seq] for seq in seqs] + + from sklearn.preprocessing import OneHotEncoder + + enc = OneHotEncoder( + categories=([AAs + ["X"]] * len(data[0])), + sparse_output=False, + ) + X = enc.fit_transform(data).reshape(len(data), len(data[0]), len(AAs + ["X"])) + + return X + + +class GeorgievFeaturizer(BaseFeaturizer): + """Class for Georgiev encoding of sequences. + + Attributes: + model_type (str): Type of featurization model to use. + name (str): Name of the featurizer. + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache featurization results. + flatten_features (bool): Whether to flatten output features. + device (torch.device): Device to use for computation. + + Example Usage: + + featurizer = GeorgievFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True, # Whether to cache results + flatten_features=False # Whether to flatten output features + ) + features = featurizer.featurize(sequences) + """ + + def __init__(self, **kwargs) -> None: + super().__init__(model_type="georgiev", **kwargs) + + def custom_featurizer(self, seqs, **kwargs): + """ + Applies Georgiev encoding to sequences. + + Args: + seqs (list): List of sequences to encode. + **kwargs: Additional keyword arguments. + + Returns: + np.ndarray: Georgiev encoded sequences. + """ + X = seqs_to_georgiev(seqs) + + return X + + +class AAIdxFeaturizer(BaseFeaturizer): + """Class for amino acid index encoding of sequences. + + Attributes: + model_type (str): Type of featurization model to use. + name (str): Name of the featurizer. + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache featurization results. + flatten_features (bool): Whether to flatten output features. + device (torch.device): Device to use for computation. + + Example Usage: + + featurizer = AAIdxFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True, # Whether to cache results + flatten_features=False # Whether to flatten output features + ) + features = featurizer.featurize(sequences) + """ + + def __init__(self, **kwargs) -> None: + super().__init__(model_type="aa_idx", **kwargs) + + def custom_featurizer(self, seqs, **kwargs): + """ + Applies amino acid index encoding to sequences. + + Args: + seqs (list): List of sequences to encode. + **kwargs: Additional keyword arguments. + + Returns: + np.ndarray: Amino acid index encoded sequences. + """ + X = featurize_aa_idx(seqs) + + return X \ No newline at end of file diff --git a/model/featurizers/combinatorial_featurizers.py b/model/featurizers/combinatorial_featurizers.py new file mode 100644 index 0000000000000000000000000000000000000000..e608550c1e19721c2ed0a03644a54351743b27ce --- /dev/null +++ b/model/featurizers/combinatorial_featurizers.py @@ -0,0 +1,425 @@ +from model.featurizers.base_featurizers import * +from model.featurizers.esm_featurizers import * +from model.featurizers.msa_featurizers import * +from model.featurizers.zeroshot_featurizers import * + +from model.featurizers.model_choices import FEATURIZE_CHOICES + +FEATURIZE_CLASSES = { + # Dictionary of model names to model classes. + # Base Featurizers + "onehot": OneHotFeaturizer, + "georgiev": GeorgievFeaturizer, + "aa_idx": AAIdxFeaturizer, + # MSA Featurizers + "msa_embed": MSAEmbedFeaturizer, + "msa_sequence_embed": MSASequenceEmbedFeaturizer, + "msa_logits": MSALogitsFeaturizer, + # ESM Featurizers + "esm_logits": ESMLogitsFeaturizer, + "esm_embed_1v": ESM1vEmbedFeaturizer, + "esm_embed_2_3b": ESM2EmbedFeaturizer, + "esm_embed_2_15b": ESM2_15b_EmbedFeaturizer, + # Zeroshot Featurizers + "zeroshot_msa": ZeroshotMSAFeaturizer, + "zeroshot_esm": ZeroshotESMFeaturizer, + "zeroshot_prose": ZeroshotProseFeaturizer, + "zeroshot_cscs": ZeroshotCSCSFeaturizer, + "zeroshot_cscs_gram": ZeroshotCSCSGramFeaturizer, + "zeroshot_cscs_sem": ZeroshotCSCSSemFeaturizer, +} + + +class CombinatorialFeaturizer(): + """Base class for combining multiple featurizers. + + Attributes: + name (str): Name of the combined featurizer. + featurizers (dict): Dictionary mapping featurizer names to instances. + + Example Usage: + + featurizer = CombinatorialFeaturizer( + featurize_methods=['onehot', 'georgiev'], # List of featurizers to combine + protein='protein1', # Name of protein for caching + use_cache=True # Whether to cache results + ) + features = featurizer.featurize(sequences) + """ + + def __init__(self, featurize_methods, **kwargs): + """ + Args: + featurize_methods (list): List of featurizer names to combine. + **kwargs: Additional arguments passed to each featurizer. + """ + for featurize_method in featurize_methods: + assert ( + featurize_method in FEATURIZE_CHOICES + ), f"{featurize_method} not in {FEATURIZE_CHOICES}" + + model_type = "-".join(featurize_methods) + self.name = str(model_type) + + self.featurizers = { + featurize_method: FEATURIZE_CLASSES[featurize_method](**kwargs) + for featurize_method in featurize_methods + } + + def featurize(self, seqs, **kwargs): + """ + Featurizes sequences using all component featurizers. + + Args: + seqs (list): List of sequences to featurize. + **kwargs: Additional arguments passed to each featurizer. + + Returns: + np.ndarray: Combined features from all featurizers. + """ + X = [] + for featurizer in self.featurizers.values(): + X.append(featurizer.featurize(seqs, **kwargs)) + + X = np.concatenate(X, axis=-1) + + return X + +class ESMAugmentedFeaturizer(CombinatorialFeaturizer): + """Class for combining ESM features with one-hot encoding. + + Attributes: + name (str): Name of the combined featurizer. + featurizers (dict): Dictionary mapping featurizer names to instances. + + Example Usage: + + featurizer = ESMAugmentedFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True # Whether to cache results + ) + features = featurizer.featurize(sequences) + """ + + def __init__(self, featurize_methods=["zeroshot_esm", "onehot"], **kwargs): + """ + Args: + featurize_methods (list): List of featurizer names to combine. + **kwargs: Additional arguments passed to each featurizer. + """ + super().__init__(featurize_methods, **kwargs) + + def featurize(self, seqs, **kwargs): + """ + Featurizes sequences using ESM and one-hot encoding. + + Args: + seqs (list): List of sequences to featurize. + **kwargs: Additional arguments passed to each featurizer. + + Returns: + np.ndarray: Combined ESM and one-hot features. + """ + X = [] + + featurizer_0 = list(self.featurizers.values())[0] + X.append(featurizer_0.featurize(seqs, **kwargs)) + + featurizer_1 = list(self.featurizers.values())[1] + onehot = featurizer_1.featurize(seqs, **kwargs) + X.append(onehot.reshape(onehot.shape[0], -1)) + + X = np.concatenate(X, axis=1) + + return X + +class MSAAugmentedFeaturizer(CombinatorialFeaturizer): + """Class for combining MSA features with one-hot encoding. + + Attributes: + name (str): Name of the combined featurizer. + featurizers (dict): Dictionary mapping featurizer names to instances. + + Example Usage: + + featurizer = MSAAugmentedFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True # Whether to cache results + ) + features = featurizer.featurize(sequences) + """ + + def __init__(self, featurize_methods=["zeroshot_msa", "onehot"], **kwargs): + """ + Args: + featurize_methods (list): List of featurizer names to combine. + **kwargs: Additional arguments passed to each featurizer. + """ + super().__init__(featurize_methods, **kwargs) + + def featurize(self, seqs, **kwargs): + """ + Featurizes sequences using MSA and one-hot encoding. + + Args: + seqs (list): List of sequences to featurize. + **kwargs: Additional arguments passed to each featurizer. + + Returns: + np.ndarray: Combined MSA and one-hot features. + """ + X = [] + + featurizer_0 = list(self.featurizers.values())[0] + X.append(featurizer_0.featurize(seqs, **kwargs)) + + featurizer_1 = list(self.featurizers.values())[1] + onehot = featurizer_1.featurize(seqs, **kwargs) + X.append(onehot.reshape(onehot.shape[0], -1)) + + X = np.concatenate(X, axis=1) + + return X + +class OnehotAndGeorgievFeaturizer(CombinatorialFeaturizer): + """Class for combining one-hot and Georgiev encodings. + + Attributes: + name (str): Name of the combined featurizer. + featurizers (dict): Dictionary mapping featurizer names to instances. + + Example Usage: + + featurizer = OnehotAndGeorgievFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True # Whether to cache results + ) + features = featurizer.featurize(sequences) + """ + + def __init__(self, featurize_methods=["onehot", "georgiev"], **kwargs): + """ + Args: + featurize_methods (list): List of featurizer names to combine. + **kwargs: Additional arguments passed to each featurizer. + """ + super().__init__(featurize_methods, **kwargs) + +class OnehotAndAAIdxFeaturizer(CombinatorialFeaturizer): + """Class for combining one-hot and amino acid index encodings. + + Attributes: + name (str): Name of the combined featurizer. + featurizers (dict): Dictionary mapping featurizer names to instances. + + Example Usage: + + featurizer = OnehotAndAAIdxFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True # Whether to cache results + ) + features = featurizer.featurize(sequences) + """ + + def __init__(self, featurize_methods=["onehot", "aa_idx"], **kwargs): + """ + Args: + featurize_methods (list): List of featurizer names to combine. + **kwargs: Additional arguments passed to each featurizer. + """ + super().__init__(featurize_methods, **kwargs) + +class OnehotAndESMLogitsFeaturizer(CombinatorialFeaturizer): + """Class for combining one-hot encoding with ESM logits. + + Attributes: + name (str): Name of the combined featurizer. + featurizers (dict): Dictionary mapping featurizer names to instances. + + Example Usage: + + featurizer = OnehotAndESMLogitsFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True # Whether to cache results + ) + features = featurizer.featurize(sequences) + """ + + def __init__(self, featurize_methods=["onehot", "esm_logits"], **kwargs): + """ + Args: + featurize_methods (list): List of featurizer names to combine. + **kwargs: Additional arguments passed to each featurizer. + """ + super().__init__(featurize_methods, **kwargs) + + def featurize(self, seqs, **kwargs): + """ + Featurizes sequences using one-hot encoding and ESM logits. + + Args: + seqs (list): List of sequences to featurize. + **kwargs: Additional arguments passed to each featurizer. + + Returns: + np.ndarray: Combined one-hot and ESM logits features. + """ + X = [] + + featurizer_0 = list(self.featurizers.values())[0] + x = featurizer_0.featurize(seqs, **kwargs) + zero_vectors = np.zeros((x.shape[0], 1, x.shape[2])) + X.append(np.concatenate((zero_vectors, x, zero_vectors), axis=1)) + + featurizer_1 = list(self.featurizers.values())[1] + X.append(featurizer_1.featurize(seqs, **kwargs)) + + X = np.concatenate(X, axis=-1) + + return X + +class OnehotAndESMMSALogitsFeaturizer(CombinatorialFeaturizer): + """Class for combining one-hot encoding with ESM-MSA logits. + + Attributes: + name (str): Name of the combined featurizer. + featurizers (dict): Dictionary mapping featurizer names to instances. + + Example Usage: + + featurizer = OnehotAndESMMSALogitsFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True # Whether to cache results + ) + features = featurizer.featurize(sequences) + """ + + def __init__(self, featurize_methods=["onehot", "msa_logits"], **kwargs): + """ + Args: + featurize_methods (list): List of featurizer names to combine. + **kwargs: Additional arguments passed to each featurizer. + """ + super().__init__(featurize_methods, **kwargs) + + def featurize(self, seqs, **kwargs): + """ + Featurizes sequences using one-hot encoding and ESM-MSA logits. + + Args: + seqs (list): List of sequences to featurize. + **kwargs: Additional arguments passed to each featurizer. + + Returns: + np.ndarray: Combined one-hot and ESM-MSA logits features. + """ + X = [] + + featurizer_0 = list(self.featurizers.values())[0] + x = featurizer_0.featurize(seqs, **kwargs) + zero_vectors = np.zeros((x.shape[0], 1, x.shape[2])) + X.append(np.concatenate((zero_vectors, x), axis=1)) + + featurizer_1 = list(self.featurizers.values())[1] + X.append(featurizer_1.featurize(seqs, **kwargs)) + + X = np.concatenate(X, axis=-1) + + return X + + +class OnehotAndESM2EmbedFeaturizer(CombinatorialFeaturizer): + """Class for combining one-hot encoding with ESM2 embeddings. + + Attributes: + name (str): Name of the combined featurizer. + featurizers (dict): Dictionary mapping featurizer names to instances. + + Example Usage: + + featurizer = OnehotAndESM2EmbedFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True # Whether to cache results + ) + features = featurizer.featurize(sequences) + """ + + def __init__(self, featurize_methods=["onehot", "esm_embed_2_3b"], **kwargs): + """ + Args: + featurize_methods (list): List of featurizer names to combine. + **kwargs: Additional arguments passed to each featurizer. + """ + super().__init__(featurize_methods, **kwargs) + + def featurize(self, seqs, **kwargs): + """ + Featurizes sequences using one-hot encoding and ESM2 embeddings. + + Args: + seqs (list): List of sequences to featurize. + **kwargs: Additional arguments passed to each featurizer. + + Returns: + np.ndarray: Combined one-hot and ESM2 embedding features. + """ + X = [] + + featurizer_0 = list(self.featurizers.values())[0] + onehot = featurizer_0.featurize(seqs, **kwargs) + X.append(onehot.reshape(onehot.shape[0], -1)) + + featurizer_1 = list(self.featurizers.values())[1] + X.append(featurizer_1.featurize(seqs, **kwargs)) + + X = np.concatenate(X, axis=1) + + return X + +class OnehotAndESM2_15bEmbedFeaturizer(CombinatorialFeaturizer): + """Class for combining one-hot encoding with ESM2 embeddings. + + Attributes: + name (str): Name of the combined featurizer. + featurizers (dict): Dictionary mapping featurizer names to instances. + + Example Usage: + + featurizer = OnehotAndESM2EmbedFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True # Whether to cache results + ) + features = featurizer.featurize(sequences) + """ + + def __init__(self, featurize_methods=["onehot", "esm_embed_2_15b"], **kwargs): + """ + Args: + featurize_methods (list): List of featurizer names to combine. + **kwargs: Additional arguments passed to each featurizer. + """ + super().__init__(featurize_methods, **kwargs) + + def featurize(self, seqs, **kwargs): + """ + Featurizes sequences using one-hot encoding and ESM2 embeddings. + + Args: + seqs (list): List of sequences to featurize. + **kwargs: Additional arguments passed to each featurizer. + + Returns: + np.ndarray: Combined one-hot and ESM2 embedding features. + """ + X = [] + + featurizer_0 = list(self.featurizers.values())[0] + onehot = featurizer_0.featurize(seqs, **kwargs) + X.append(onehot.reshape(onehot.shape[0], -1)) + + featurizer_1 = list(self.featurizers.values())[1] + X.append(featurizer_1.featurize(seqs, **kwargs)) + + X = np.concatenate(X, axis=1) + + return X \ No newline at end of file diff --git a/model/featurizers/esm_featurizers.py b/model/featurizers/esm_featurizers.py new file mode 100644 index 0000000000000000000000000000000000000000..4bcdd7322c4dd537377351f0e6de10cfd27d5833 --- /dev/null +++ b/model/featurizers/esm_featurizers.py @@ -0,0 +1,620 @@ +import numpy as np +import torch + +from model.featurizers.model_choices import FEATURE_MODELS +from model.featurizers.base_featurizers import BaseFeaturizer +from concurrent.futures import ProcessPoolExecutor +import concurrent.futures + +class ForgeESMFeaturizer(BaseFeaturizer): + """Class for generating ESM Forge-based protein embeddings or log probabilities. + + Attributes: + model_type (str): Type of featurization model to use. + name (str): Name of the featurizer. + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache featurization results. + flatten_features (bool): Whether to flatten output features. + device (torch.device): Device to use for computation. + model (str): ESM model name. + url (str): Forge API URL. + token (str): API token. + output_type (str): Output format type. + + Example Usage: + + featurizer = ForgeESMFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True, # Whether to cache results + flatten_features=False, # Whether to flatten output features + model='esm2_t33_650M', # ESM model to use + token='api_token', # Forge API token + output_type='sequence_representations' # Output type + ) + features = featurizer.featurize(sequences) + """ + + def __init__( + self, + protein=None, + use_cache=False, + flatten_features=False, + model=None, + url="https://forge.evolutionaryscale.ai", + token=None, + output_type=None, + model_type="esm", + **kwargs, + ): + """ + Args: + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache results. + flatten_features (bool): Whether to flatten output features. + model (str): ESM model name. + url (str): Forge API URL. + token (str): API token. + output_type (str): Output format type. + model_type (str): Type of featurization model. + **kwargs: Additional keyword arguments. + """ + super().__init__(model_type=model_type, protein=protein, use_cache=use_cache, flatten_features=flatten_features, **kwargs) + self.model = model + self.url = url + if token is None: + raise ValueError("ESM Forge API token must be provided") + self.token = token + self.output_type = output_type + + def process_single_protein(self, sequence, model, url, token, output_type): + """Process a single protein sequence using ESM Forge. + + Args: + sequence (str): Protein sequence to process. + model (str): ESM model name. + url (str): Forge API URL. + token (str): Forge API access token. + output_type (str): Either "log_probabilities" or "sequence_representations". + + Returns: + numpy.ndarray: Protein embeddings or log probabilities. + + Raises: + ValueError: If output_type is invalid. + RuntimeError: If API call fails. + """ + if output_type not in ["log_probabilities", "sequence_representations"]: + raise ValueError("output_type must be 'log_probabilities' or 'sequence_representations'") + + try: + + from esm.sdk.forge import ESM3ForgeInferenceClient + from esm.sdk.api import ESMProtein, LogitsConfig + + forge_client = ESM3ForgeInferenceClient(model=model, url=url, token=token) + protein = ESMProtein(sequence=sequence) + protein_tensor = forge_client.encode(protein) + logits_output = forge_client.logits( + protein_tensor, LogitsConfig(sequence=True, return_embeddings=True) + ) + except Exception as e: + raise RuntimeError(f"ESM Forge API call failed: {str(e)}") + + if output_type == "log_probabilities": + return np.array(logits_output.logits.sequence.numpy()) + elif output_type == "sequence_representations": + embeddings_float32 = logits_output.embeddings.squeeze().float() + return (np.array(embeddings_float32.numpy()).mean(axis=0)) + + + def process_proteins_parallel(self, seqs, model, url, token, output_type): + """Process a list of protein sequences in parallel using ESM Forge. + + Args: + seqs (list): List of protein sequences to process. + model (str): ESM model name to use. + url (str): Forge API URL. + token (str): Forge API access token. + output_type (str): Type of output features. + + Returns: + list: List of protein embeddings as numpy arrays. + """ + with ProcessPoolExecutor(max_workers=16) as executor: + future_to_index = { + executor.submit(self.process_single_protein, seq, model, url, token, output_type): i + for i, seq in enumerate(seqs) + } + + results = [None] * len(seqs) + + for future in concurrent.futures.as_completed(future_to_index): + index = future_to_index[future] + results[index] = future.result() + + return results + + def custom_featurizer(self, seqs, **kwargs): + """ + Featurizes sequences using ESM Forge. + + Args: + seqs (list): List of sequences to featurize. + **kwargs: Additional keyword arguments. + + Returns: + np.ndarray: Array of featurized sequences. + """ + X = self.process_proteins_parallel(seqs, model=self.model, url=self.url, token=self.token, output_type=self.output_type) + return X + + +class Forge_ESMC_6B_EmbedFeaturizer(ForgeESMFeaturizer): + """Class for generating ESM-C 6B embeddings using Forge. + + Attributes: + model_type (str): Type of featurization model to use. + name (str): Name of the featurizer. + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache featurization results. + flatten_features (bool): Whether to flatten output features. + device (torch.device): Device to use for computation. + model (str): ESM model name. + url (str): Forge API URL. + token (str): API token. + output_type (str): Output format type. + + Example Usage: + + featurizer = Forge_ESMC_6B_EmbedFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True, # Whether to cache results + flatten_features=False, # Whether to flatten output features + token='api_token' # Forge API token + ) + features = featurizer.featurize(sequences) + """ + + def __init__( + self, + protein=None, + use_cache=False, + flatten_features=False, + model="esmc-6b-2024-12", + url="https://forge.evolutionaryscale.ai", + token=None, + output_type="sequence_representations", + **kwargs, + ): + """ + Args: + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache results. + flatten_features (bool): Whether to flatten output features. + model (str): ESM model name. + url (str): Forge API URL. + token (str): API token. + output_type (str): Output format type. + **kwargs: Additional keyword arguments. + """ + super().__init__(model_type="esmc_6b", protein=protein, use_cache=use_cache, flatten_features=flatten_features, output_type=output_type, model=model, url=url, token=token, **kwargs) + + +class ESMBaseFeaturizer(BaseFeaturizer): + """Base class for ESM model featurizers. + + Attributes: + model_type (str): Type of featurization model to use. + name (str): Name of the featurizer. + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache featurization results. + flatten_features (bool): Whether to flatten output features. + device (torch.device): Device to use for computation. + batch_size (int): Batch size for processing. + model_locations (list): Paths to ESM model files. + + Example Usage: + + featurizer = ESMBaseFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True, # Whether to cache results + batch_size=968, # Processing batch size + model_locations=['path/to/model'] # Model file paths + ) + features = featurizer.featurize(sequences) + """ + + def __init__( + self, + protein=None, + use_cache=False, + model_locations=None, + batch_size=968, + model_type="esm", + **kwargs, + ): + """ + Args: + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache results. + model_locations (list): Paths to ESM model files. + batch_size (int): Batch size for processing. + model_type (str): Type of featurization model. + **kwargs: Additional keyword arguments. + """ + super().__init__(model_type, protein, use_cache, **kwargs) + self.batch_size = batch_size + self.model_locations = model_locations + + def eval_esm(self, model, batch_tokens, sequence_data, output_type): + """ + Evaluates sequences using ESM model. + + Args: + model (torch.nn.Module): ESM model. + batch_tokens (torch.Tensor): Tokenized sequences. + sequence_data (list): Original sequence data. + output_type (str): Type of output features. + + Returns: + np.ndarray: Model outputs. + """ + if output_type == "log_probabilities": + # Featurize as sequence log probabilities. + with torch.no_grad(): + token_probs = torch.log_softmax( + model(batch_tokens.to(self.device))["logits"], dim=-1 + ) + output = token_probs.cpu().numpy() + + elif output_type == "sequence_representations": + # Featurize as sequence embeddings (last hidden layer). + last_layer = len(model.layers) + with torch.no_grad(): + results = model( + batch_tokens.to(self.device), repr_layers=[last_layer] + ) + token_representations = results["representations"][last_layer] + + sequence_representations = [] + for i, (_, seq) in enumerate(sequence_data): + seq_embed = token_representations[i, 1 : len(seq) + 1].mean(0) + sequence_representations.append(seq_embed.cpu().numpy().ravel()) + + output = np.array(sequence_representations) + + return output + + def featurize_esm(self, seqs, output_type): + """ + Featurizes sequences using ESM model. + + Args: + seqs (list): List of sequences to featurize. + output_type (str): Type of output features. + + Returns: + np.ndarray: Array of featurized sequences. + """ + from esm import pretrained + model_loc_to_model = {} + for model_location in self.model_locations: + model, alphabet = pretrained.load_model_and_alphabet(model_location) + model.eval() + if torch.backends.mps.is_available() or torch.cuda.is_available(): + model = model.to(self.device) + else: + print("GPU device not available") + return + model_loc_to_model[model_location] = model + + output = [] + + batch_size = self.batch_size + n_batches = ((len(seqs[0]) - 1) // batch_size) + 1 + for batchi in range(n_batches): + start = batchi * batch_size + end = (batchi + 1) * batch_size + + model_features = [] + for model_location in self.model_locations: + model = model_loc_to_model[model_location] + + seq_batch = [] + sbatch_size = 3 + n_sbatches = ((len(seqs) - 1) // sbatch_size) + 1 + for batchj in range(n_sbatches): + sb_start = batchj * sbatch_size + sb_end = (batchj + 1) * sbatch_size + + sequence_data = [ + (f"protein{sbidx}", seq[start:end]) + if output_type == "log_probabilities" + else (f"protein{sbidx}", seq[start:end].replace("X", "")) + for sbidx, seq in enumerate(seqs[sb_start:sb_end]) + ] + + batch_converter = alphabet.get_batch_converter() + batch_labels, batch_strs, batch_tokens = batch_converter( + sequence_data + ) + + if n_batches > 1: + if batchi == 0: + batch_tokens = batch_tokens[:, :-1] + elif batchi == n_batches - 1: + batch_tokens = batch_tokens[:, 1:] + else: + batch_tokens = batch_tokens[:, 1:-1] + + seq_batch.append( + self.eval_esm(model, batch_tokens, sequence_data, output_type) + ) + + model_features.append(np.concatenate(seq_batch)) + + output.append(np.mean(model_features, axis=0)) + + X = np.hstack(output) + + return X + + +class ESMLogitsFeaturizer(ESMBaseFeaturizer): + """Class for generating ESM model log probabilities. + + Attributes: + model_type (str): Type of featurization model to use. + name (str): Name of the featurizer. + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache featurization results. + flatten_features (bool): Whether to flatten output features. + device (torch.device): Device to use for computation. + batch_size (int): Batch size for processing. + model_locations (list): Paths to ESM model files. + + Example Usage: + + featurizer = ESMLogitsFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True, # Whether to cache results + batch_size=968 # Processing batch size + ) + features = featurizer.featurize(sequences) + """ + + def __init__( + self, + protein=None, + use_cache=False, + model_locations=FEATURE_MODELS["esm_logits"], + batch_size=968, + model_type="esm_logits", + **kwargs, + ): + """ + Args: + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache results. + model_locations (list): Paths to ESM model files. + batch_size (int): Batch size for processing. + model_type (str): Type of featurization model. + **kwargs: Additional keyword arguments. + """ + super().__init__( + protein, + use_cache, + model_locations, + batch_size, + model_type, + **kwargs, + ) + + def custom_featurizer(self, seqs, **kwargs): + """ + Featurizes sequences using ESM model log probabilities. + + Args: + seqs (list): List of sequences to featurize. + **kwargs: Additional keyword arguments. + + Returns: + np.ndarray: Array of log probabilities. + """ + X = self.featurize_esm(seqs, output_type="log_probabilities") + return X + + +class ESM1vEmbedFeaturizer(ESMBaseFeaturizer): + """Class for generating ESM-1v model embeddings. + + Attributes: + model_type (str): Type of featurization model to use. + name (str): Name of the featurizer. + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache featurization results. + flatten_features (bool): Whether to flatten output features. + device (torch.device): Device to use for computation. + batch_size (int): Batch size for processing. + model_locations (list): Paths to ESM model files. + + Example Usage: + + featurizer = ESM1vEmbedFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True, # Whether to cache results + batch_size=968 # Processing batch size + ) + features = featurizer.featurize(sequences) + """ + + def __init__( + self, + protein=None, + use_cache=False, + model_locations=FEATURE_MODELS["esm_embed_1v"], + batch_size=968, + model_type="esm_embed_1v", + **kwargs, + ): + """ + Args: + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache results. + model_locations (list): Paths to ESM model files. + batch_size (int): Batch size for processing. + model_type (str): Type of featurization model. + **kwargs: Additional keyword arguments. + """ + super().__init__( + protein, + use_cache, + model_locations, + batch_size, + model_type, + **kwargs, + ) + + def custom_featurizer(self, seqs, **kwargs): + """ + Featurizes sequences using ESM-1v model embeddings. + + Args: + seqs (list): List of sequences to featurize. + **kwargs: Additional keyword arguments. + + Returns: + np.ndarray: Array of sequence embeddings. + """ + X = self.featurize_esm(seqs, output_type="sequence_representations") + return X + + +class ESM2EmbedFeaturizer(ESMBaseFeaturizer): + """Class for generating ESM-2 model embeddings. + + Attributes: + model_type (str): Type of featurization model to use. + name (str): Name of the featurizer. + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache featurization results. + flatten_features (bool): Whether to flatten output features. + device (torch.device): Device to use for computation. + batch_size (int): Batch size for processing. + model_locations (list): Paths to ESM model files. + + Example Usage: + + featurizer = ESM2EmbedFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True, # Whether to cache results + batch_size=968 # Processing batch size + ) + features = featurizer.featurize(sequences) + """ + + def __init__( + self, + protein=None, + use_cache=False, + model_locations=FEATURE_MODELS["esm_embed_2_3b"], + batch_size=968, + model_type="esm_embed_2_3b", + **kwargs, + ): + """ + Args: + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache results. + model_locations (list): Paths to ESM model files. + batch_size (int): Batch size for processing. + model_type (str): Type of featurization model. + **kwargs: Additional keyword arguments. + """ + super().__init__( + protein, + use_cache, + model_locations, + batch_size, + model_type, + **kwargs, + ) + + def custom_featurizer(self, seqs, **kwargs): + """ + Featurizes sequences using ESM-2 model embeddings. + + Args: + seqs (list): List of sequences to featurize. + **kwargs: Additional keyword arguments. + + Returns: + np.ndarray: Array of sequence embeddings. + """ + X = self.featurize_esm(seqs, output_type="sequence_representations") + return X + + +class ESM2_15b_EmbedFeaturizer(ESMBaseFeaturizer): + """Class for generating ESM-2 15B model embeddings. + + Attributes: + model_type (str): Type of featurization model to use. + name (str): Name of the featurizer. + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache featurization results. + flatten_features (bool): Whether to flatten output features. + device (torch.device): Device to use for computation. + batch_size (int): Batch size for processing. + model_locations (list): Paths to ESM model files. + + Example Usage: + + featurizer = ESM2_15b_EmbedFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True, # Whether to cache results + batch_size=968 # Processing batch size + ) + features = featurizer.featurize(sequences) + """ + + def __init__( + self, + protein=None, + use_cache=False, + model_locations=FEATURE_MODELS["esm_embed_2_15b"], + batch_size=968, + model_type="esm_embed_2_15b", + **kwargs, + ): + """ + Args: + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache results. + model_locations (list): Paths to ESM model files. + batch_size (int): Batch size for processing. + model_type (str): Type of featurization model. + **kwargs: Additional keyword arguments. + """ + super().__init__( + protein, + use_cache, + model_locations, + batch_size, + model_type, + **kwargs, + ) + + def custom_featurizer(self, seqs, **kwargs): + """ + Featurizes sequences using ESM-2 15B model embeddings. + + Args: + seqs (list): List of sequences to featurize. + **kwargs: Additional keyword arguments. + + Returns: + np.ndarray: Array of sequence embeddings. + """ + X = self.featurize_esm(seqs, output_type="sequence_representations") + return X \ No newline at end of file diff --git a/model/featurizers/model_choices.py b/model/featurizers/model_choices.py new file mode 100644 index 0000000000000000000000000000000000000000..55800e716596fb07f81491c407551a5938d3279c --- /dev/null +++ b/model/featurizers/model_choices.py @@ -0,0 +1,70 @@ +from model.featurizers.model_locations import ( + msa_models, + esm_models, + prose_models, + prose_models_cas13, +) + +FEATURIZE_CHOICES = [ + # All the implemented featurizers + # Base Featurizers + 'onehot', + 'georgiev', + 'aa_idx', + + # MSA Featurizers + 'msa_embed', + 'msa_sequence_embed', + 'msa_logits', + 'msa_augmented', + + # ESM Featurizers + 'esm_logits', + 'esm_embed_1v', + 'esm_embed_2_3b', + 'esm_embed_2_15b', + 'esm_augmented', + + # Zeroshot Featurizers + 'zeroshot_msa', + 'zeroshot_esm', + 'zeroshot_cscs', + 'zeroshot_cscs_gram', + 'zeroshot_cscs_sem', + 'zeroshot_prose', + 'zeroshot_esmif', +] + +FEATURE_MODELS = { + # Dictionary of model names to model locations. + # Base Featurizers + 'onehot': [ None ], + 'georgiev': [ None ], + 'aa_idx': [ None ], + + # MSA Featurizers + 'msa_embed': msa_models, + 'msa_sequence_embed': msa_models, + 'msa_logits': msa_models, + 'msa_augmented': msa_models, + + # ESM Featurizers + 'esm_logits': esm_models[:1], + 'esm_embed_1v': esm_models[:1], + 'esm_embed_2_3b': esm_models[5:6], + 'esm_embed_2_15b': esm_models[7:8], + 'esm_augmented': esm_models[:5], + + # Zeroshot Featurizers + 'zeroshot_msa': msa_models, + 'zeroshot_esm': esm_models[:6], + 'zeroshot_cscs': [ None ], + 'zeroshot_cscs_gram': [ None ], + 'zeroshot_cscs_sem': [ None ], + 'zeroshot_prose': prose_models_cas13, + 'zeroshot_esmif': esm_models[6:7], + + # Prose Featurizers + 'prose_embedmean': prose_models, + 'prose_augmented': prose_models_cas13, +} \ No newline at end of file diff --git a/model/featurizers/model_locations.py b/model/featurizers/model_locations.py new file mode 100644 index 0000000000000000000000000000000000000000..10eb84c5d48f4fefd11851b680c3c4b34d5b690c --- /dev/null +++ b/model/featurizers/model_locations.py @@ -0,0 +1,38 @@ +esm_models = [ + 'esm1v_t33_650M_UR90S_1', + 'esm1v_t33_650M_UR90S_2', + 'esm1v_t33_650M_UR90S_3', + 'esm1v_t33_650M_UR90S_4', + 'esm1v_t33_650M_UR90S_5', + 'esm2_t36_3B_UR50D', + 'esm_if1_gvp4_t16_142M_UR50', + 'esm2_t48_15B_UR50D', +] + +msa_models = [ + 'esm_msa1b_t12_100M_UR50S', +] + +prose_models = [ + 'data/prose_pretrained_models/prose_dlm_3x1024.sav', +] + +prose_models_cas13 = [ + 'target/cas13/prose_rd512_nl3_dr0_ns2000000_si100000_le1280_mr0.1_bs100_wd0_lr0.0001_cs0.98_0/_iter0500000.sav', + 'target/cas13/prose_rd512_nl3_dr0_ns2000000_si100000_le1280_mr0.1_bs100_wd0_lr0.0001_cs0.98_1/_iter0400000.sav', + 'target/cas13/prose_rd512_nl3_dr0_ns2000000_si100000_le1280_mr0.1_bs100_wd0_lr0.0001_cs0.98_3/_iter0600000.sav', + 'target/cas13/prose_rd512_nl3_dr0_ns2000000_si100000_le1280_mr0.1_bs100_wd0_lr0.0001_cs0.98_4/_iter0600000.sav', + 'target/cas13/prose_rd512_nl3_dr0_ns2000000_si100000_le1280_mr0.1_bs100_wd0_lr0.0001_cs0.98_5/_iter0600000.sav', +] + +prose_models_cas13_old1 = [ + 'target/cas13/prose_rd512_nl3_dr0_ns2000000_si100000_le1280_mr0.1_bs100_wd0_lr0.0001_cs0.98_0/_iter0500000.sav', + 'target/cas13/prose_rd512_nl3_dr0_ns2000000_si100000_le1280_mr0.1_bs100_wd0_lr0.0001_cs0.98_1/_iter0400000.sav', + 'target/cas13/prose_rd512_nl3_dr0_ns2000000_si100000_le1280_mr0.1_bs100_wd0_lr0.0001_cs0.98_2/_iter0300000.sav', +] + +prose_models_cas13_old = [ + 'target/cas13_old/prose_rd512_nl3_dr0_ns2000000_si100000_le1280_mr0.1_bs100_wd0_lr0.0001_cs0.98_1/_iter0300000.sav', + 'target/cas13_old/prose_rd512_nl3_dr0_ns2000000_si100000_le1280_mr0.1_bs100_wd0_lr0.0001_cs0.98_2/_iter0200000.sav', + 'target/cas13_old/prose_rd512_nl3_dr0_ns2000000_si100000_le1280_mr0.1_bs100_wd0_lr0.0001_cs0.98_3/_iter0300000.sav', +] diff --git a/model/featurizers/msa_featurizers.py b/model/featurizers/msa_featurizers.py new file mode 100644 index 0000000000000000000000000000000000000000..6aa31105fe73a4300c100378f3b78415e345f8e1 --- /dev/null +++ b/model/featurizers/msa_featurizers.py @@ -0,0 +1,381 @@ +from Bio import SeqIO +import numpy as np +import torch + +from model.featurizers.base_featurizers import BaseFeaturizer +from model.featurizers.model_choices import FEATURE_MODELS +from model.utils.other_utils import read_msa, greedy_select, msa_splicer + + +class MSABaseFeaturizer(BaseFeaturizer): + """Base class for MSA-based featurizers. + + Attributes: + model_type (str): Type of featurization model to use. + name (str): Name of the featurizer. + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache featurization results. + flatten_features (bool): Whether to flatten output features. + device (torch.device): Device to use for computation. + batch_size (int): Batch size for processing. + model_locations (list): Paths to model files. + msa_file (str): Path to MSA file. + + Example Usage: + + featurizer = MSABaseFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True, # Whether to cache results + msa_file='msa.fasta', # Path to MSA file + batch_size=968 # Processing batch size + ) + features = featurizer.featurize(sequences) + """ + + def __init__( + self, + protein=None, + use_cache=False, + model_locations=None, + msa_file=None, + batch_size=968, + model_type="msa", + **kwargs + ): + """ + Args: + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache results. + model_locations (list): Paths to model files. + msa_file (str): Path to MSA file. + batch_size (int): Batch size for processing. + model_type (str): Type of featurization model. + **kwargs: Additional keyword arguments. + """ + super().__init__(model_type, protein, use_cache, **kwargs) + self.batch_size = batch_size + self.model_locations = model_locations + self.msa_file = msa_file + self.device = torch.device("cpu") # MSAs might be too big for GPU + + + + def featurize_msa(self, seqs, msa_file, output_type, **kwargs): + """ + Featurizes sequences using MSA Transformer model. + + Args: + seqs (list): List of sequences to featurize. + msa_file (str): Path to MSA file. + output_type (str): Type of output features to extract. + **kwargs: Additional keyword arguments. + + Returns: + np.ndarray: Array of sequence features. + """ + from esm import pretrained + + torch.set_grad_enabled(False) + # Check to see if there is an MSA file in **kwargs. + if msa_file is None: + assert self.msa_file is not None, "No MSA file provided." + msa_file = self.msa_file + assert output_type in [ + "sequence_representations", + "msa_representations", + "log_probabilities", + ] + msa = read_msa(msa_file) + + # Instantiate the model + ( + msa_transformer, + msa_transformer_alphabet, + ) = pretrained.esm_msa1b_t12_100M_UR50S() + msa_transformer = msa_transformer.eval().to(self.device) + msa_transformer_batch_converter = msa_transformer_alphabet.get_batch_converter() + + # Prep the MSA, making the appropriate mutations + inputs = greedy_select( + msa, num_seqs=128 + ) # can change this to pass more/fewer sequences + # This splices the MSA to exclude gaps in the first sequence, due to MSATransformer context window + # size limit of 1024. If your MSA width is less than 1024, then you don't need to do this + inputs = msa_splicer(inputs) + name, wt_seq = inputs[0][0], inputs[0][1] + reps = [] + + # Batch processing + batch_size = self.batch_size + num_batches = len(seqs) // batch_size + (len(seqs) % batch_size != 0) + for batch_i in range(num_batches): # TODO: change this to num_batches + start_idx = batch_i * batch_size + end_idx = start_idx + batch_size + batch_seqs = seqs[start_idx:end_idx] + + input_msas = [] + for seq in batch_seqs: + # Replace the first sequence in the MSA with the mutant sequence + assert len(wt_seq) == len(seq) + inputs[0] = (name, seq) + input_msas.append(inputs) + # print(len(input_msas), len(input_msas[0]), len(input_msas[0][0][1]), len(input_msas[0][1][1])) + # Run the MSA Transformer + ( + msa_transformer_batch_labels, + msa_transformer_batch_strs, + msa_transformer_batch_tokens, + ) = msa_transformer_batch_converter(input_msas) + num_msas = len(msa_transformer_batch_tokens) + msa_transformer_batch_tokens = msa_transformer_batch_tokens.to( + next(msa_transformer.parameters()).device + ) + msa_transformer_predictions = msa_transformer.forward( + msa_transformer_batch_tokens, repr_layers=[12] + ) + + # Extract features + msa_reps = ( + msa_transformer_predictions["representations"][12] + .detach() + .cpu() + .numpy() + ) + for i in range(num_msas): + logits = ( + msa_transformer_predictions["logits"][i][0].detach().cpu().numpy() + ) + avg_msa_rep = msa_reps[i].mean((0, 1)) + sequence_rep = msa_reps[i][0].mean(0) + + if output_type == "msa_representations": + reps.append(avg_msa_rep) + + elif output_type == "sequence_representations": + reps.append(sequence_rep) + + elif output_type == "log_probabilities": + reps.append(logits) + + X = np.array(reps) + + return X + + +class MSAEmbedFeaturizer(MSABaseFeaturizer): + """Class for generating MSA embedding features. + + Attributes: + model_type (str): Type of featurization model to use. + name (str): Name of the featurizer. + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache featurization results. + flatten_features (bool): Whether to flatten output features. + device (torch.device): Device to use for computation. + batch_size (int): Batch size for processing. + model_locations (list): Paths to model files. + msa_file (str): Path to MSA file. + + Example Usage: + + featurizer = MSAEmbedFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True, # Whether to cache results + msa_file='msa.fasta', # Path to MSA file + batch_size=968 # Processing batch size + ) + features = featurizer.featurize(sequences) + """ + + def __init__( + self, + protein=None, + use_cache=False, + msa_file=None, + model_locations=FEATURE_MODELS["msa_embed"], + batch_size=968, + model_type="msa_embed", + **kwargs + ): + """ + Args: + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache results. + msa_file (str): Path to MSA file. + model_locations (list): Paths to model files. + batch_size (int): Batch size for processing. + model_type (str): Type of featurization model. + **kwargs: Additional keyword arguments. + """ + super().__init__( + protein, + use_cache, + model_locations, + msa_file, + batch_size, + model_type, + **kwargs + ) + + def custom_featurizer(self, seqs, msa_file=None, **kwargs): + """ + Featurizes sequences using MSA embeddings. + + Args: + seqs (list): List of sequences to featurize. + msa_file (str): Path to MSA file. + **kwargs: Additional keyword arguments. + + Returns: + np.ndarray: Array of MSA embedding features. + """ + X = self.featurize_msa( + seqs, msa_file, output_type="msa_representations", **kwargs + ) + return X + + +class MSASequenceEmbedFeaturizer(MSABaseFeaturizer): + """Class for generating MSA sequence embedding features. + + Attributes: + model_type (str): Type of featurization model to use. + name (str): Name of the featurizer. + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache featurization results. + flatten_features (bool): Whether to flatten output features. + device (torch.device): Device to use for computation. + batch_size (int): Batch size for processing. + model_locations (list): Paths to model files. + msa_file (str): Path to MSA file. + + Example Usage: + + featurizer = MSASequenceEmbedFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True, # Whether to cache results + msa_file='msa.fasta', # Path to MSA file + batch_size=968 # Processing batch size + ) + features = featurizer.featurize(sequences) + """ + + def __init__( + self, + protein=None, + use_cache=False, + msa_file=None, + model_locations=FEATURE_MODELS["msa_sequence_embed"], + batch_size=968, + model_type="msa_sequence_embed", + **kwargs + ): + """ + Args: + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache results. + msa_file (str): Path to MSA file. + model_locations (list): Paths to model files. + batch_size (int): Batch size for processing. + model_type (str): Type of featurization model. + **kwargs: Additional keyword arguments. + """ + super().__init__( + protein, + use_cache, + model_locations, + msa_file, + batch_size, + model_type, + **kwargs + ) + + def custom_featurizer(self, seqs, msa_file=None, **kwargs): + """ + Featurizes sequences using MSA sequence embeddings. + + Args: + seqs (list): List of sequences to featurize. + msa_file (str): Path to MSA file. + **kwargs: Additional keyword arguments. + + Returns: + np.ndarray: Array of MSA sequence embedding features. + """ + X = self.featurize_msa( + seqs, msa_file, output_type="sequence_representations", **kwargs + ) + return X + + +class MSALogitsFeaturizer(MSABaseFeaturizer): + """Class for generating MSA logits features. + + Attributes: + model_type (str): Type of featurization model to use. + name (str): Name of the featurizer. + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache featurization results. + flatten_features (bool): Whether to flatten output features. + device (torch.device): Device to use for computation. + batch_size (int): Batch size for processing. + model_locations (list): Paths to model files. + msa_file (str): Path to MSA file. + + Example Usage: + + featurizer = MSALogitsFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True, # Whether to cache results + msa_file='msa.fasta', # Path to MSA file + batch_size=968 # Processing batch size + ) + features = featurizer.featurize(sequences) + """ + + def __init__( + self, + protein=None, + use_cache=False, + msa_file=None, + model_locations=FEATURE_MODELS["msa_logits"], + batch_size=968, + model_type="msa_logits", + **kwargs + ): + """ + Args: + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache results. + msa_file (str): Path to MSA file. + model_locations (list): Paths to model files. + batch_size (int): Batch size for processing. + model_type (str): Type of featurization model. + **kwargs: Additional keyword arguments. + """ + super().__init__( + protein, + use_cache, + model_locations, + msa_file, + batch_size, + model_type, + **kwargs + ) + + def custom_featurizer(self, seqs, msa_file=None, **kwargs): + """ + Featurizes sequences using MSA logits. + + Args: + seqs (list): List of sequences to featurize. + msa_file (str): Path to MSA file. + **kwargs: Additional keyword arguments. + + Returns: + np.ndarray: Array of MSA logits features. + """ + X = self.featurize_msa( + seqs, msa_file, output_type="log_probabilities", **kwargs + ) + return X diff --git a/model/featurizers/prott5_featurizers.py b/model/featurizers/prott5_featurizers.py new file mode 100644 index 0000000000000000000000000000000000000000..c53d83169362a4030a9247674c68be5d0f6f7687 --- /dev/null +++ b/model/featurizers/prott5_featurizers.py @@ -0,0 +1,65 @@ +import ankh +import numpy as np +import torch + +from model.featurizers.base_featurizers import BaseFeaturizer +from transformers import T5Tokenizer, T5EncoderModel +import re + +class ProtT5BaseFeaturizer(BaseFeaturizer): + def __init__(self, + protein=None, + use_cache=False, + model_version=None, + batch_size=968, + model_type="ProtT5", + **kwargs): + + super().__init__(model_type,protein, use_cache, **kwargs) + + self.batch_size = batch_size + self.model_version = model_version + + def featurize_prott5(self, seqs): + + if self.model_version == 'prot_t5_xl_u50': + self.tokenizer = T5Tokenizer.from_pretrained('Rostlab/prot_t5_xl_half_uniref50-enc', do_lower_case=False) + self.model = T5EncoderModel.from_pretrained("Rostlab/prot_t5_xl_half_uniref50-enc").to(self.device) + else: + raise ValueError(f"Invalid model version: {self.model_version}") + + input_seqs = [" ".join(list(re.sub(r"[UZOB]", "X", sequence))) for sequence in seqs] + + seq_batch = [] + + for i in range(0, len(input_seqs), self.batch_size): + batch = input_seqs[i:i + self.batch_size] + # tokenize sequences and pad up to the longest sequence in the batch + ids = self.tokenizer(batch, add_special_tokens=True, padding="longest") + + input_ids = torch.tensor(ids['input_ids']).to(self.device) + attention_mask = torch.tensor(ids['attention_mask']).to(self.device) + + # generate embeddings + with torch.no_grad(): + embeddings = self.model(input_ids=input_ids, attention_mask=attention_mask) + + seq_batch.append(embeddings['last_hidden_state'].mean(axis=1).cpu().numpy()) + + return np.concatenate(seq_batch) + + +class ProtT5_XL_U50_EmbedFeaturizer(ProtT5BaseFeaturizer): + def __init__(self, + protein=None, + use_cache=False, + model_version="prot_t5_xl_u50", + batch_size=968, + model_type="ProtT5_XL_U50_Embed", + **kwargs): + super().__init__(protein, use_cache, model_version, batch_size, model_type, **kwargs) + + def custom_featurizer(self, seqs): + + X = self.featurize_prott5(seqs) + return X \ No newline at end of file diff --git a/model/featurizers/unirep_featurizers.py b/model/featurizers/unirep_featurizers.py new file mode 100644 index 0000000000000000000000000000000000000000..e35e857d8b53226da3d1a3e026ff3d48746ec651 --- /dev/null +++ b/model/featurizers/unirep_featurizers.py @@ -0,0 +1,42 @@ +from jax_unirep.featurize import get_reps +from jax_unirep.utils import load_params + +from model.featurizers.base_featurizers import BaseFeaturizer + +UNIREP_MODEL_SIZES = [1900, 256, 64] + + +class UnirepBaseFeaturizer(BaseFeaturizer): + def __init__( + self, + protein=None, + use_cache=False, + model_locations=None, + model_type="unirep", + model_size=1900, + **kwargs, + ): + super().__init__(model_type, protein, use_cache, **kwargs) + self.model_locations = model_locations + self.update_model_name(model_size) + self.load_params() + + def update_model_name(self, model_size): + # Validate model size + assert model_size in UNIREP_MODEL_SIZES, "Model size must be 1900, 256, or 64." + self.model_size = model_size + self.model_type = self.model_type + str(model_size) + + def load_params(self): + self.params = load_params(self.model_locations, self.model_size)[1] + + def custom_featurizer(self, seqs, **kwargs): + h_avg, h_final, c_final = get_reps( + seqs=seqs, params=self.params, mlstm_size=self.model_size + ) + + return h_avg + +class EvotunedUnirepFeaturizer(UnirepBaseFeaturizer): + def __init__(self, model_type="evotuned_unirep", **kwargs): + super().__init__(model_type=model_type, **kwargs) \ No newline at end of file diff --git a/model/featurizers/zeroshot_featurizers.py b/model/featurizers/zeroshot_featurizers.py new file mode 100644 index 0000000000000000000000000000000000000000..58141dfafa0596d2dba0c8b2e9205ebdfc799b7f --- /dev/null +++ b/model/featurizers/zeroshot_featurizers.py @@ -0,0 +1,632 @@ +from Bio import SeqIO + +from model.featurizers.base_featurizers import BaseFeaturizer +from model.featurizers.model_choices import FEATURE_MODELS +from model.utils.data_utils import find_mutations_multithreaded + +class ZeroshotBaseFeaturizer(BaseFeaturizer): + """Base class for zero-shot featurizers. + + Attributes: + model_type (str): Type of featurization model to use. + name (str): Name of the featurizer. + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache featurization results. + flatten_features (bool): Whether to flatten output features. + device (torch.device): Device to use for computation. + model_locations (list): Paths to model files. + wt_file (str): Path to wild-type sequence file. + wt_seq (str): Wild-type protein sequence. + + Example Usage: + + featurizer = ZeroshotBaseFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True, # Whether to cache results + wt_file='wt.fasta', # Path to wild-type sequence + model_locations=[] # Paths to model files + ) + features = featurizer.featurize(sequences) + """ + + def __init__( + self, + protein=None, + use_cache=False, + model_locations=None, + wt_file=None, + model_type="zeroshot", + **kwargs + ): + """ + Args: + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache results. + model_locations (list): Paths to model files. + wt_file (str): Path to wild-type sequence file. + model_type (str): Type of featurization model. + **kwargs: Additional keyword arguments. + """ + super().__init__(model_type, protein, use_cache, **kwargs) + self.model_locations = model_locations + self.wt_file = wt_file + self.wt_seq = str(SeqIO.read(self.wt_file, "fasta").seq) + + def featurize_zeroshot( + self, seqs, model_locations, wt_file, zeroshot_model, **kwargs + ): + """ + Featurizes sequences using zero-shot prediction. + + Args: + seqs (list): List of sequences to featurize. + model_locations (list): Paths to model files. + wt_file (str): Path to wild-type sequence file. + zeroshot_model (callable): Zero-shot prediction function. + **kwargs: Additional keyword arguments. + + Returns: + np.ndarray: Zero-shot prediction scores. + """ + assert (self.wt_file is not None) or ( + wt_file is not None + ), "No wt sequence provided." + assert (self.model_locations is not None) or ( + model_locations is not None + ), "No model locations provided." + + wt_file = wt_file or self.wt_file + model_locations = model_locations or self.model_locations + + wt_seq = str(SeqIO.read(self.wt_file, "fasta").seq) + model_locations = self.model_locations + + mutations = find_mutations_multithreaded(wt_seq, seqs) + + # make sure to remove model_locations and sequence from kwargs + kwargs.pop("model_locations", None) + kwargs.pop("sequence", None) + kwargs['device'] = self.device + X = zeroshot_model( + mutations, model_locations=model_locations, sequence=wt_seq, **kwargs + ) + + X = X.reshape(-1, 1) + + return X + + +class ZeroshotESMFeaturizer(ZeroshotBaseFeaturizer): + """Class for ESM zero-shot featurization. + + Attributes: + model_type (str): Type of featurization model to use. + name (str): Name of the featurizer. + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache featurization results. + flatten_features (bool): Whether to flatten output features. + device (torch.device): Device to use for computation. + model_locations (list): Paths to model files. + wt_file (str): Path to wild-type sequence file. + wt_seq (str): Wild-type protein sequence. + + Example Usage: + + featurizer = ZeroshotESMFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True, # Whether to cache results + wt_file='wt.fasta' # Path to wild-type sequence + ) + features = featurizer.featurize(sequences) + """ + + def __init__( + self, + protein=None, + use_cache=False, + model_locations=FEATURE_MODELS["zeroshot_esm"], + wt_file=None, + model_type="zeroshot_esm", + **kwargs + ): + """ + Args: + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache results. + model_locations (list): Paths to model files. + wt_file (str): Path to wild-type sequence file. + model_type (str): Type of featurization model. + **kwargs: Additional keyword arguments. + """ + super().__init__( + protein=protein, + use_cache=use_cache, + model_locations=model_locations, + wt_file=wt_file, + model_type=model_type, + **kwargs + ) + + def custom_featurizer(self, seqs, **kwargs): + """ + Featurizes sequences using ESM zero-shot prediction. + + Args: + seqs (list): List of sequences to featurize. + **kwargs: Additional keyword arguments. + + Returns: + np.ndarray: ESM zero-shot prediction scores. + """ + from model.utils.zeroshot_utils import zero_shot_esm as zero_shot + + X = self.featurize_zeroshot( + seqs, + model_locations=self.model_locations, + wt_file=self.wt_file, + zeroshot_model=zero_shot, + **kwargs + ) + return X + + +class ZeroshotMSAFeaturizer(ZeroshotBaseFeaturizer): + """Class for MSA zero-shot featurization. + + Attributes: + model_type (str): Type of featurization model to use. + name (str): Name of the featurizer. + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache featurization results. + flatten_features (bool): Whether to flatten output features. + device (torch.device): Device to use for computation. + model_locations (list): Paths to model files. + wt_file (str): Path to wild-type sequence file. + wt_seq (str): Wild-type protein sequence. + msa_file (str): Path to MSA file. + + Example Usage: + + featurizer = ZeroshotMSAFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True, # Whether to cache results + wt_file='wt.fasta', # Path to wild-type sequence + msa_file='msa.fasta' # Path to MSA file + ) + features = featurizer.featurize(sequences) + """ + + def __init__( + self, + protein=None, + use_cache=False, + model_locations=FEATURE_MODELS["zeroshot_msa"], + wt_file=None, + msa_file=None, + model_type="zeroshot_msa", + **kwargs + ): + """ + Args: + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache results. + model_locations (list): Paths to model files. + wt_file (str): Path to wild-type sequence file. + msa_file (str): Path to MSA file. + model_type (str): Type of featurization model. + **kwargs: Additional keyword arguments. + """ + super().__init__( + protein=protein, + use_cache=use_cache, + model_locations=model_locations, + wt_file=wt_file, + model_type=model_type, + **kwargs + ) + self.msa_file = msa_file + + def custom_featurizer(self, seqs, **kwargs): + """ + Featurizes sequences using MSA zero-shot prediction. + + Args: + seqs (list): List of sequences to featurize. + **kwargs: Additional keyword arguments. + + Returns: + np.ndarray: MSA zero-shot prediction scores. + """ + from model.utils.zeroshot_utils import zero_shot_msa as zero_shot + + X = self.featurize_zeroshot( + seqs, + model_locations=self.model_locations, + wt_file=self.wt_file, + zeroshot_model=zero_shot, + msa_file=self.msa_file, + **kwargs + ) + return X + + +class ZeroshotCSCSFeaturizer(ZeroshotBaseFeaturizer): + """Class for CSCS zero-shot featurization. + + Attributes: + model_type (str): Type of featurization model to use. + name (str): Name of the featurizer. + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache featurization results. + flatten_features (bool): Whether to flatten output features. + device (torch.device): Device to use for computation. + model_locations (list): Paths to model files. + wt_file (str): Path to wild-type sequence file. + wt_seq (str): Wild-type protein sequence. + + Example Usage: + + featurizer = ZeroshotCSCSFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True, # Whether to cache results + wt_file='wt.fasta' # Path to wild-type sequence + ) + features = featurizer.featurize(sequences) + """ + + def __init__( + self, + protein=None, + use_cache=False, + model_locations=None, + wt_file=None, + model_type="zeroshot_cscs", + **kwargs + ): + """ + Args: + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache results. + model_locations (list): Paths to model files. + wt_file (str): Path to wild-type sequence file. + model_type (str): Type of featurization model. + **kwargs: Additional keyword arguments. + """ + super().__init__( + protein=protein, + use_cache=use_cache, + model_locations=model_locations, + wt_file=wt_file, + model_type=model_type, + **kwargs + ) + + def custom_featurizer(self, seqs, **kwargs): + """ + Featurizes sequences using CSCS zero-shot prediction. + + Args: + seqs (list): List of sequences to featurize. + **kwargs: Additional keyword arguments. + + Returns: + np.ndarray: CSCS zero-shot prediction scores. + """ + from model.utils.zeroshot_utils import zero_shot_cscs as zero_shot + + X = self.featurize_zeroshot( + seqs, + model_locations=self.model_locations, + wt_file=self.wt_file, + zeroshot_model=zero_shot, + **kwargs + ) + return X + + +class ZeroshotCSCSGramFeaturizer(ZeroshotBaseFeaturizer): + """Class for CSCS-Gram zero-shot featurization. + + Attributes: + model_type (str): Type of featurization model to use. + name (str): Name of the featurizer. + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache featurization results. + flatten_features (bool): Whether to flatten output features. + device (torch.device): Device to use for computation. + model_locations (list): Paths to model files. + wt_file (str): Path to wild-type sequence file. + wt_seq (str): Wild-type protein sequence. + + Example Usage: + + featurizer = ZeroshotCSCSGramFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True, # Whether to cache results + wt_file='wt.fasta' # Path to wild-type sequence + ) + features = featurizer.featurize(sequences) + """ + + def __init__( + self, + protein=None, + use_cache=False, + model_locations=None, + wt_file=None, + model_type="zeroshot_cscs_gram", + **kwargs + ): + """ + Args: + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache results. + model_locations (list): Paths to model files. + wt_file (str): Path to wild-type sequence file. + model_type (str): Type of featurization model. + **kwargs: Additional keyword arguments. + """ + super().__init__( + protein=protein, + use_cache=use_cache, + model_locations=model_locations, + wt_file=wt_file, + model_type=model_type, + **kwargs + ) + + def custom_featurizer(self, seqs, **kwargs): + """ + Featurizes sequences using CSCS-Gram zero-shot prediction. + + Args: + seqs (list): List of sequences to featurize. + **kwargs: Additional keyword arguments. + + Returns: + np.ndarray: CSCS-Gram zero-shot prediction scores. + """ + from model.utils.zeroshot_utils import zero_shot_cscs_gram as zero_shot + + X = self.featurize_zeroshot( + seqs, + model_locations=self.model_locations, + wt_file=self.wt_file, + zeroshot_model=zero_shot, + **kwargs + ) + return X + + +class ZeroshotCSCSSemFeaturizer(ZeroshotBaseFeaturizer): + """Class for CSCS-Sem zero-shot featurization. + + Attributes: + model_type (str): Type of featurization model to use. + name (str): Name of the featurizer. + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache featurization results. + flatten_features (bool): Whether to flatten output features. + device (torch.device): Device to use for computation. + model_locations (list): Paths to model files. + wt_file (str): Path to wild-type sequence file. + wt_seq (str): Wild-type protein sequence. + + Example Usage: + + featurizer = ZeroshotCSCSSemFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True, # Whether to cache results + wt_file='wt.fasta' # Path to wild-type sequence + ) + features = featurizer.featurize(sequences) + """ + + def __init__( + self, + protein=None, + use_cache=False, + model_locations=None, + wt_file=None, + model_type="zeroshot_cscs_sem", + **kwargs + ): + """ + Args: + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache results. + model_locations (list): Paths to model files. + wt_file (str): Path to wild-type sequence file. + model_type (str): Type of featurization model. + **kwargs: Additional keyword arguments. + """ + super().__init__( + protein=protein, + use_cache=use_cache, + model_locations=model_locations, + wt_file=wt_file, + model_type=model_type, + **kwargs + ) + + def custom_featurizer(self, seqs, **kwargs): + """ + Featurizes sequences using CSCS-Sem zero-shot prediction. + + Args: + seqs (list): List of sequences to featurize. + **kwargs: Additional keyword arguments. + + Returns: + np.ndarray: CSCS-Sem zero-shot prediction scores. + """ + from model.utils.zeroshot_utils import zero_shot_cscs_sem as zero_shot + + X = self.featurize_zeroshot( + seqs, + model_locations=self.model_locations, + wt_file=self.wt_file, + zeroshot_model=zero_shot, + **kwargs + ) + return X + + +class ZeroshotProseFeaturizer(ZeroshotBaseFeaturizer): + """Class for ProSE zero-shot featurization. + + Attributes: + model_type (str): Type of featurization model to use. + name (str): Name of the featurizer. + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache featurization results. + flatten_features (bool): Whether to flatten output features. + device (torch.device): Device to use for computation. + model_locations (list): Paths to model files. + wt_file (str): Path to wild-type sequence file. + wt_seq (str): Wild-type protein sequence. + + Example Usage: + + featurizer = ZeroshotProseFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True, # Whether to cache results + wt_file='wt.fasta' # Path to wild-type sequence + ) + features = featurizer.featurize(sequences) + """ + + def __init__( + self, + protein=None, + use_cache=False, + model_locations=FEATURE_MODELS["zeroshot_prose"], + wt_file=None, + model_type="zeroshot_prose", + **kwargs + ): + """ + Args: + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache results. + model_locations (list): Paths to model files. + wt_file (str): Path to wild-type sequence file. + model_type (str): Type of featurization model. + **kwargs: Additional keyword arguments. + """ + super().__init__( + protein=protein, + use_cache=use_cache, + model_locations=model_locations, + wt_file=wt_file, + model_type=model_type, + **kwargs + ) + + def custom_featurizer(self, seqs, **kwargs): + """ + Featurizes sequences using ProSE zero-shot prediction. + + Args: + seqs (list): List of sequences to featurize. + **kwargs: Additional keyword arguments. + + Returns: + np.ndarray: ProSE zero-shot prediction scores. + """ + from model.utils.zeroshot_utils import zero_shot_prose as zero_shot + + X = self.featurize_zeroshot( + seqs, + model_locations=self.model_locations, + wt_file=self.wt_file, + zeroshot_model=zero_shot, + **kwargs + ) + return X + + +class ZeroshotESMIFFeaturizer(ZeroshotBaseFeaturizer): + """Class for ESM-IF zero-shot featurization. + + Attributes: + model_type (str): Type of featurization model to use. + name (str): Name of the featurizer. + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache featurization results. + flatten_features (bool): Whether to flatten output features. + device (torch.device): Device to use for computation. + model_locations (list): Paths to model files. + wt_file (str): Path to wild-type sequence file. + wt_seq (str): Wild-type protein sequence. + pdb_file (str): Path to PDB structure file. + chain_id (str): Chain identifier in PDB file. + + Example Usage: + + featurizer = ZeroshotESMIFFeaturizer( + protein='protein1', # Name of protein for caching + use_cache=True, # Whether to cache results + wt_file='wt.fasta', # Path to wild-type sequence + pdb_file='struct.pdb', # Path to structure file + chain_id='A' # Chain identifier + ) + features = featurizer.featurize(sequences) + """ + + def __init__( + self, + protein=None, + use_cache=False, + model_locations=FEATURE_MODELS["zeroshot_esmif"], + wt_file=None, + model_type="zeroshot_esmif", + pdb_file=None, + chain_id='A', + **kwargs + ): + """ + Args: + protein (str): Name of protein being featurized. + use_cache (bool): Whether to cache results. + model_locations (list): Paths to model files. + wt_file (str): Path to wild-type sequence file. + model_type (str): Type of featurization model. + pdb_file (str): Path to PDB structure file. + chain_id (str): Chain identifier in PDB file. + **kwargs: Additional keyword arguments. + """ + super().__init__( + protein=protein, + use_cache=use_cache, + model_locations=model_locations, + wt_file=wt_file, + model_type=model_type, + pdb_file=pdb_file, + chain_id=chain_id, + **kwargs + ) + + def custom_featurizer(self, seqs, **kwargs): + """ + Featurizes sequences using ESM-IF zero-shot prediction. + + Args: + seqs (list): List of sequences to featurize. + **kwargs: Additional keyword arguments. + + Returns: + np.ndarray: ESM-IF zero-shot prediction scores. + """ + from model.utils.zeroshot_utils import zero_shot_esm_if as zero_shot + + X = self.featurize_zeroshot( + seqs, + model_locations=self.model_locations, + wt_file=self.wt_file, + zeroshot_model=zero_shot, + pdb_file=self.pdb_file, + chain_id=self.chain_id, + **kwargs + ) + return X \ No newline at end of file diff --git a/model/multievolve_workflow.png b/model/multievolve_workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..bbc597089ea3eae8163c6c75386b456e1082bca8 --- /dev/null +++ b/model/multievolve_workflow.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80a141357222a3a6954ae57cc299054b507283aed254e87c5780a1397286d0b7 +size 291236 diff --git a/model/predictors/__init__.py b/model/predictors/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..5947cd27ed71bd8d1935d23b7102583452daf566 --- /dev/null +++ b/model/predictors/__init__.py @@ -0,0 +1,3 @@ +from model.predictors.base_regressors import * +from model.predictors.gaussian_process_regressors import * +from model.predictors.neural_net_regressors import * \ No newline at end of file diff --git a/model/predictors/base_regressors.py b/model/predictors/base_regressors.py new file mode 100644 index 0000000000000000000000000000000000000000..1e42c68e0fca4e86426205232cdc9f3051f83829 --- /dev/null +++ b/model/predictors/base_regressors.py @@ -0,0 +1,550 @@ +import os +import pickle +from abc import ABC, abstractmethod + +from matplotlib import pyplot as plt +import numpy as np +import pandas as pd +import scipy.stats as ss +from sklearn.metrics import make_scorer +from sklearn.linear_model import Ridge, LinearRegression +from sklearn.model_selection import cross_val_score +from sklearn.preprocessing import StandardScaler +from sklearn.ensemble import RandomForestRegressor as RFRegressor + +from model.utils.other_utils import performance_report + +def run_model_experiments(splits, + features, + models, + experiment_name, + use_cache=False, + show_plots=True): + """ + Trains multiple models with various data splits and features, evaluates their performance, + and compiles the results into a CSV file. + + Args: + splits (list): A list of data splits to use for training + features (list): A list of features to use for training + models (list): A list of model instances to train + experiment_name (str): Name of the experiment for saving results + use_cache (bool, optional): Whether to use cached models. Defaults to False. + show_plots (bool, optional): Whether to show matplotlib plots. Defaults to True. + + Returns: + pd.DataFrame: DataFrame containing evaluation results for all models + + Example Usage: + + run_model_experiments(splits, + features, + models, + experiment_name, + use_cache=False) + """ + + names = [] + stats = [] + + for split in splits: + for feature in features: + for model in models: + + instance = model(split, feature, use_cache=use_cache, show_plots=show_plots) + + # Train and evaluate model + stat = instance.run_model() + names.append(instance.file_attrs['model_name'].split('__')) + stats.append(list(stat.values())) + + # Return results for all training permutations + stats_array = np.array(stats) + names_array = np.array(names) + combined_array = np.concatenate([names_array, stats_array], axis=1) + columns = ['Data Split', 'Feature', 'Model'] + list(stat.keys()) + table = pd.DataFrame(combined_array, columns=columns) + + # Check if the directory exists, create it if it doesn't + dir_path = f'{instance.file_attrs["model_dir"]}/' + "results" + if not os.path.exists(dir_path): + os.makedirs(dir_path) + + # Save the results + if use_cache: + table.to_csv(f"{dir_path}/{experiment_name}.csv", index=False) + + return table + + +class BaseRegressor(ABC): + """ + Abstract base class for regression models. + + Args: + data_splitter: Object containing train/test splits + featurizer: Object that converts sequences to features + model (str, optional): Name of model. Defaults to 'Base' + use_cache (bool, optional): Whether to use cached models. Defaults to False + show_plots (bool, optional): Whether to show matplotlib plots. Defaults to True + **kwargs: Additional keyword arguments + + Attributes: + model_name (str): Name of the model + featurizer: Featurizer object + use_cache (bool): Whether to use cached models + kwargs (dict): Additional keyword arguments + X_train: Training features + X_test: Test features + y_train: Training labels + y_test: Test labels + split_method (str): Name of data split method + file_attrs (dict): Dictionary of file attributes and paths + show_plots (bool): Whether to show matplotlib plots. Defaults to True + + Example Usage: + + regressor = BaseRegressor(data_splitter, featurizer, model='Linear', use_cache=False, show_plots=True) + regressor.run_model() + """ + + def __init__(self, + data_splitter, + featurizer, + model='Base', + use_cache=False, + show_plots=True, + **kwargs): + + # Set variables + self.model_name = model + self.featurizer = featurizer + self.use_cache = use_cache + self.show_plots = show_plots + self.kwargs = kwargs + + # Setup data + self.X_train = data_splitter.splits['X_train'] + self.X_test = data_splitter.splits['X_test'] + self.y_train = data_splitter.splits['y_train'] + self.y_test = data_splitter.splits['y_test'] + self.split_method = data_splitter.splits['split_name'] + + # Check if 'X_val' is not a key in data_splitter + if 'X_val' in data_splitter.splits: + print("Validation sets do not need to be present in data splits for non-neural network models.") + + # Set model directory + self.file_attrs = data_splitter.file_attrs + self.file_attrs['model_name'] = self.split_method + ' __ ' + self.featurizer.name + ' __ ' + self.model_name + self.file_attrs['model_dir'] = os.path.join(data_splitter.file_attrs["dataset_dir"], 'model_cache', data_splitter.file_attrs["dataset_name"]) + self.file_attrs['model_path'] = os.path.join(self.file_attrs['model_dir'], 'objects', f'{self.file_attrs["model_name"]}.pkl') + + + # Load model if available + if self.file_attrs['model_path'] is not None and os.path.exists(self.file_attrs['model_path']) and self.use_cache: + self.load_model(self.file_attrs['model_path']) + + def run_model(self, eval=True): + """ + Runs model training and evaluation. + + Args: + eval (bool, optional): Whether to evaluate the model. Defaults to True. + + Returns: + If eval=True: + dict: Dictionary of evaluation statistics + If eval=False: + None + """ + + if self.file_attrs['model_path'] is not None and os.path.exists(self.file_attrs['model_path']) and self.use_cache: + pass + else: + print(f'Training model for {self.file_attrs["model_name"]}') + X = self.preprocess_data(self.X_train) + self.train(X, self.y_train) + + if self.use_cache: + self.save_model() + + if eval: + return self.evaluate() + else: + return None + + + def load_model(self, model_path=None): + """ + Loads a pre-trained model from a pkl file. + + Args: + model_path (str, optional): Path to model file. Defaults to None. + """ + + # set location to load model + model_path = self.file_attrs['model_path'] if model_path is None else model_path + print(f'Loading model from {model_path}') + + try: + with open(model_path, 'rb') as file: + self.model = pickle.load(file) + print("Model loaded successfully.") + except FileNotFoundError: + print(f"Error: The file at {model_path} was not found.") + except PermissionError: + print(f"Error: Permission denied when trying to read {model_path}.") + except Exception as e: + print(f"An error occurred while loading the model: {str(e)}") + + def save_model(self, model_path=None): + """ + Saves the model to a pkl file. + + Args: + model_path (str, optional): Path to save model to. Defaults to None. + """ + + # set location to save model + model_path = self.file_attrs['model_path'] if model_path is None else model_path + + dir_path = os.path.join(self.file_attrs['model_dir'], 'objects') + # Check if the directory exists, create it if it doesn't + if not os.path.exists(dir_path): + os.makedirs(dir_path) + + # Save the model + print(f'Saving model to {model_path}') + pickle.dump(self.model, open(model_path, 'wb')) + + def featurize(self, X): + """ + Featurizes a list of sequences. + + Args: + X (list): List of sequences to featurize + + Returns: + array: Featurized sequences + """ + + X_featurized = self.featurizer.featurize(X) + return X_featurized + + def preprocess_data(self, X): + """ + Featurizes and scales input data. + + Args: + X (list): List of sequences to preprocess + + Returns: + array: Preprocessed data + """ + X = self.featurizer.featurize(X) + + X = X.reshape(X.shape[0],-1) + + return X + + @abstractmethod + def train(self, X, y): + """ + Trains the model. + + Args: + X (array): Input features + y (array): Target values + + Returns: + Trained model, also stored in self.model + """ + pass + + def evaluate(self): + """ + Evaluates model on test set. + + Returns: + dict: Dictionary of evaluation statistics + """ + + # Evaluate model + y_pred = self.predict(self.X_test) + + # Reshape data and get correlation stats + y, y_pred = np.array(self.y_test), np.array(y_pred) + y, y_pred = y.reshape(-1), y_pred.reshape(-1) + + # Get stats + stats = performance_report(y, y_pred) + + # Set the default parameters + plt.rcParams['font.size'] = 7 + plt.rcParams['lines.linewidth'] = 0.5 + + # Plotting Results + fig, ax = plt.subplots(figsize=(4, 3)) # Adjust size as needed + + ## Mark data points that have activity less than 0 or greater than 1.2x the max experimental y value + y_max = max(y.max() * 1.2, y_pred.max() * 1.2) + y_min = min(y.min() * 0.8, y_pred.min() * 0.8) + # colors = np.where(y_pred > y_max, 'crimson', np.where(y_pred < 0, 'crimson', 'dodgerblue')) + # y_pred_adjusted = np.clip(y_pred, 0, y_max) + + ## Scatter plot for main graph + ax.scatter(y_pred, y, c='dodgerblue', alpha=0.4, edgecolors='w', linewidth=0.5) + + ## Draw x=y line + ax.plot([y_min, y_max], [y_min, y_max], 'k--', linewidth=0.5) + + ## Set labels and title for main graph + ax.text(0.9, 0.1, f'Pearson r={stats["Pearson r"]:.2f}', fontsize=7, ha='right', va='bottom', transform=ax.transAxes) + ax.text(0.9, 0.2, f'Spearman r={stats["Spearman r"]:.2f}', fontsize=7, ha='right', va='bottom', transform=ax.transAxes) + ax.set_xlabel('Predicted Score', fontsize=7) + ax.set_ylabel('True Score', fontsize=7) + ax.set_title('Model Performance', fontsize=7) + ax.set_xlim(y_min, y_max) + + ## Display model parameters using legend + model_params = self.file_attrs["model_name"].split('__') # Assuming '|' separates different parameters + param_text = '\n'.join(model_params) + props = dict(boxstyle='square', facecolor='wheat', alpha=0.2) + ax.text(0.02, 0.98, param_text, transform=ax.transAxes, fontsize=7, verticalalignment='top', bbox=props) + + # Adjust tick parameters + ax.tick_params(axis='both', which='major', labelsize=7) + + # Show figure + if self.show_plots: + plt.show() + plt.close(fig) + + # Return the stats + return stats + + @abstractmethod + def custom_predictor(self, X): + """ + Custom prediction method to be implemented in subclasses. + Inputs have been filtered by self.predict() + + Args: + X (array): Featurized sequences + + Returns: + array: Model predictions + """ + pass + + def predict(self, X): + """ + Gets model predictions. Runs checks and calls custom_predictor. + + Args: + X (list): List of sequences + + Returns: + array: Model predictions + """ + + X_featurized = self.featurizer.featurize(X) + + X_featurized = X_featurized.reshape(X_featurized.shape[0],-1) + + predictions = self.custom_predictor(X_featurized) + + return predictions + +class IdentityRegressor(BaseRegressor): + """ + Identity regressor that returns all 1's. + + Args: + data_splitter: Object containing train/test splits + featurizer: Object that converts sequences to features + model (str, optional): Name of model. Defaults to 'Linear' + use_cache (bool, optional): Whether to use cached models. Defaults to False + **kwargs: Additional keyword arguments + """ + + def train(self, X, y): + pass + + def custom_predictor(self, X): + return [1 for _ in range(len(X))] + +class LinearRegressor(BaseRegressor): + """ + Linear regression model. + + Args: + data_splitter: Object containing train/test splits + featurizer: Object that converts sequences to features + model (str, optional): Name of model. Defaults to 'Linear' + use_cache (bool, optional): Whether to use cached models. Defaults to False + **kwargs: Additional keyword arguments + """ + def __init__(self, data_splitter, featurizer, model='Linear', use_cache=False, **kwargs): + super().__init__(data_splitter, featurizer, model, use_cache, **kwargs) + + def train(self, X, y): + model = LinearRegression( + fit_intercept=True, + copy_X=True, + n_jobs=10, + ) + model.fit(X, y) + self.model = model + + def custom_predictor(self, X): + return self.model.predict(X) + +class RandomForestRegressor(BaseRegressor): + """ + Random Forest regression model. + + Args: + data_splitter: Object containing train/test splits + featurizer: Object that converts sequences to features + model (str, optional): Name of model. Defaults to 'RandomForest' + use_cache (bool, optional): Whether to use cached models. Defaults to False + n_estimators (int, optional): Number of trees. Defaults to 100 + criterion (str, optional): Split criterion. Defaults to 'friedman_mse' + max_depth (int, optional): Max tree depth. Defaults to None + min_samples_split (int, optional): Min samples for split. Defaults to 2 + min_samples_leaf (int, optional): Min samples in leaf. Defaults to 1 + min_weight_fraction_leaf (float, optional): Min weight fraction in leaf. Defaults to 0.0 + max_features (float, optional): Max features to consider. Defaults to 1.0 + max_leaf_nodes (int, optional): Max leaf nodes. Defaults to None + min_impurity_decrease (float, optional): Min impurity decrease. Defaults to 0.0 + bootstrap (bool, optional): Whether to bootstrap. Defaults to True + oob_score (bool, optional): Whether to use out-of-bag score. Defaults to False + n_jobs (int, optional): Number of parallel jobs. Defaults to 6 + random_state (int, optional): Random seed. Defaults to 1 + verbose (int, optional): Verbosity level. Defaults to 0 + warm_start (bool, optional): Whether to reuse solution. Defaults to False + ccp_alpha (float, optional): Complexity parameter. Defaults to 0.0 + max_samples (int, optional): Max samples for bootstrap. Defaults to None + **kwargs: Additional keyword arguments + """ + def __init__(self, data_splitter, featurizer, model='RandomForest', use_cache=False, + n_estimators=100, + criterion='friedman_mse', + max_depth=None, + min_samples_split=2, + min_samples_leaf=1, + min_weight_fraction_leaf=0.0, + max_features=1.0, + max_leaf_nodes=None, + min_impurity_decrease=0.0, + bootstrap=True, + oob_score=False, + n_jobs=6, # change this based on number of cores + random_state=1, + verbose=0, + warm_start=False, + ccp_alpha=0.0, + max_samples=None, + **kwargs + ): + + self.n_estimators = n_estimators + self.criterion = criterion + self.max_depth = max_depth + self.min_samples_split = min_samples_split + self.min_samples_leaf = min_samples_leaf + self.min_weight_fraction_leaf = min_weight_fraction_leaf + self.max_features = max_features + self.max_leaf_nodes = max_leaf_nodes + self.min_impurity_decrease = min_impurity_decrease + self.bootstrap = bootstrap + self.oob_score = oob_score + self.n_jobs = n_jobs + self.random_state = random_state + self.verbose = verbose + self.warm_start = warm_start + self.ccp_alpha = ccp_alpha + self.max_samples = max_samples + + super().__init__(data_splitter, featurizer, model=model, use_cache=use_cache, **kwargs) + + def train(self, X, y): + self.model = RFRegressor(n_estimators=self.n_estimators, + criterion=self.criterion, + max_depth=self.max_depth, + min_samples_split=self.min_samples_split, + min_samples_leaf=self.min_samples_leaf, + min_weight_fraction_leaf=self.min_weight_fraction_leaf, + max_features=self.max_features, + max_leaf_nodes=self.max_leaf_nodes, + min_impurity_decrease=self.min_impurity_decrease, + bootstrap=self.bootstrap, + oob_score=self.oob_score, + n_jobs=self.n_jobs, + random_state=self.random_state, + verbose=self.verbose, + warm_start=self.warm_start, + ccp_alpha=self.ccp_alpha, + max_samples=self.max_samples + ) + + self.model.fit(X, y) + + def custom_predictor(self, X): + return self.model.predict(X) + +class RidgeRegressor(BaseRegressor): + """ + Ridge regression model. + + Args: + data_splitter: Object containing train/test splits + featurizer: Object that converts sequences to features + model (str, optional): Name of model. Defaults to 'Ridge' + use_cache (bool, optional): Whether to use cached models. Defaults to False + reg_coef (float, optional): Ridge regularization coefficient. If None, use CV. Defaults to None + linear_model_cls (class, optional): Sklearn linear model class. Defaults to Ridge + reg_coef_list (list, optional): List of regularization strengths for CV. Defaults to [0.1, 1.0, 2.0] + **kwargs: Additional keyword arguments + """ + # [TODO] edit cv to include modifiable splits + def __init__(self, data_splitter, featurizer, model='Ridge', use_cache=False, reg_coef=None, linear_model_cls=Ridge, reg_coef_list=None, **kwargs): + """ + Args: + - reg_coef: Ridge regression coefficient. If none, then train with CV + - linear_model_cls: sklearn linear model class + - reg_coef_list: list of ridge regression regularization strength (default: [0.1, 1.0]) + """ + self.reg_coef = reg_coef + self.linear_model_cls = linear_model_cls + self.reg_coef_list = reg_coef_list if reg_coef_list is not None else [0.1, 1.0, 2.0] + super().__init__(data_splitter, featurizer, model=model, use_cache=use_cache, **kwargs) + + def train(self, X, y): + def spearman(y_pred, y_true): + y_pred = np.array(y_pred) + y_true = np.array(y_true) + + y_pred = y_pred.reshape(-1) + y_true = y_true.reshape(-1) + + if np.var(y_pred) < 1e-6 or np.var(y_true) < 1e-6: + return 0.0 + return ss.spearmanr(y_pred, y_true).correlation + if self.reg_coef is None or self.reg_coef == 'CV': + best_reg_coef, best_score = None, -np.inf + for sample_reg_coef in self.reg_coef_list: + model = self.linear_model_cls(alpha=sample_reg_coef) + score = cross_val_score(model, X, y, + cv=5, + scoring=make_scorer(spearman)).mean() + if score > best_score: + best_reg_coef = sample_reg_coef + best_score = score + self.model = self.linear_model_cls(alpha=best_reg_coef) + self.model.fit(X, y) + + def custom_predictor(self, X): + return self.model.predict(X) \ No newline at end of file diff --git a/model/predictors/gaussian_process_regressors.py b/model/predictors/gaussian_process_regressors.py new file mode 100644 index 0000000000000000000000000000000000000000..1ff3ab9a471afa81d7a45433abaec4fbb1069f86 --- /dev/null +++ b/model/predictors/gaussian_process_regressors.py @@ -0,0 +1,503 @@ +from joblib import Parallel, delayed +from math import ceil + +from matplotlib import pyplot as plt +import matplotlib.colors as mcolors +import numpy as np +from scipy.stats import iqr +from sklearn.gaussian_process.kernels import ( + ConstantKernel as C, + DotProduct as DP, + RBF +) + +from model.predictors.base_regressors import BaseRegressor +from model.utils.other_utils import performance_report + +def parallel_predict(model, X, batch_num, n_batches, verbose): + """ + Makes predictions in parallel using batches. + + Args: + model: The trained model to make predictions with + X (array-like): Input features to predict on + batch_num (int): Current batch number + n_batches (int): Total number of batches + verbose (bool): Whether to print progress messages + + Returns: + tuple: (mean predictions, prediction variances) + """ + mean, var = model.predict(X, return_std=True) + if verbose: + print('Finished predicting batch number {}/{}' + .format(batch_num + 1, n_batches)) + return mean, var + +class GPRegressor(BaseRegressor): + """Base Gaussian Process regressor class. + + Attributes: + n_restarts_ (int): Number of restarts for optimizer + kernel_ (sklearn.gaussian_process.kernels): Kernel function + normalize_y_ (bool): Whether to normalize target values + backend_ (str): Backend framework to use ('sklearn', 'gpy', or 'gpytorch') + batch_size_ (int): Batch size for predictions + n_jobs_ (int): Number of parallel jobs + verbose_ (bool): Whether to print progress messages + model: The trained GP model + uncertainties_ (array): Prediction uncertainties + """ + + def __init__(self, + data_splitter, + featurizer, + model='GPR', + n_restarts=0, + kernel=None, + normalize_y=True, + backend='sklearn', + batch_size=1000, + n_jobs=1, + verbose=False, + **kwargs + ): + """ + Args: + data_splitter: Object to split data into train/test sets + featurizer: Object to convert sequences to numerical features + model (str): Model identifier string + n_restarts (int): Number of restarts for optimizer + kernel: Kernel function for GP + normalize_y (bool): Whether to normalize target values + backend (str): Framework to use ('sklearn', 'gpy', or 'gpytorch') + batch_size (int): Batch size for predictions + n_jobs (int): Number of parallel jobs + verbose (bool): Whether to print progress messages + **kwargs: Additional keyword arguments + """ + self.n_restarts_ = n_restarts + self.kernel_ = kernel + self.normalize_y_ = normalize_y + self.backend_ = backend + self.batch_size_ = batch_size + self.n_jobs_ = n_jobs + self.verbose_ = verbose + super().__init__(data_splitter, featurizer, model, **kwargs) + + def train(self, X, y): + """ + Train the GP model. + + Args: + X (array-like): Training features + y (array-like): Training target values + + Returns: + self: The trained model instance + """ + n_samples, n_features = X.shape + + if self.verbose_: + print('Fitting GP model on {} data points with dimension {}...' + .format(*X.shape)) + + # scikit-learn backend. + if self.backend_ == 'sklearn': + from sklearn.gaussian_process import GaussianProcessRegressor + self.model = GaussianProcessRegressor( + kernel=self.kernel_, + normalize_y=self.normalize_y_, + alpha=1e-0, + n_restarts_optimizer=self.n_restarts_, + copy_X_train=False, + ).fit(X, y) + + # GPy backend. + elif self.backend_ == 'gpy': + import GPy + if self.kernel_ == 'rbf': + kernel = GPy.kern.RBF( + input_dim=n_features, variance=1., lengthscale=1. + ) + else: + raise ValueError('Kernel value {} not supported' + .format(self.kernel_)) + + self.model = GPy.models.SparseGPRegression( + X, y.reshape(-1, 1), kernel=kernel, + num_inducing=min(self.n_inducing_, n_samples) + ) + self.model.Z.unconstrain() + self.model.optimize(messages=self.verbose_) + + # GPyTorch with CUDA backend. + elif self.backend_ == 'gpytorch': + import gpytorch + import torch + + class GPyTorchRegressor(gpytorch.models.ExactGP): + def __init__(self, X, y, likelihood): + super(GPyTorchRegressor, self).__init__(X, y, likelihood) + self.mean_module = gpytorch.means.ConstantMean() + self.covar_module = gpytorch.kernels.ScaleKernel( + gpytorch.kernels.RBFKernel() + ) + + def forward(self, X): + mean_X = self.mean_module(X) + covar_X = self.covar_module(X) + return gpytorch.distributions.MultivariateNormal(mean_X, covar_X) + + X = torch.Tensor(X).contiguous().cuda() + y = torch.Tensor(y).contiguous().cuda() + + likelihood = gpytorch.likelihoods.GaussianLikelihood().cuda() + model = GPyTorchRegressor(X, y, likelihood).cuda() + + model.train() + likelihood.train() + + # Use the Adam optimizer. + #optimizer = torch.optim.LBFGS([ {'params': model.parameters()} ]) + optimizer = torch.optim.Adam([ + {'params': model.parameters()}, # Includes GaussianLikelihood parameters. + ], lr=1.) + + # Loss for GPs is the marginal log likelihood. + mll = gpytorch.mlls.ExactMarginalLogLikelihood(likelihood, model) + + training_iterations = 100 + for i in range(training_iterations): + optimizer.zero_grad() + output = model(X) + loss = -mll(output, y) + loss.backward() + if self.verbose_: + print('Iter {}/{} - Loss: {:.3f}' + .format(i + 1, training_iterations, loss.item())) + optimizer.step() + + self.model = model + self.likelihood_ = likelihood + + if self.verbose_: + print('Done fitting GP model.') + + return self + + def evaluate(self): + """ + Evaluates the model on a test set. + + Returns: + tuple: (dict of evaluation metrics, matplotlib figure) + """ + + # Reshape data and get correlation stats + y_pred = self.predict(self.X_test) + y, y_pred = np.array(self.y_test), np.array(y_pred) + y, y_pred = y.reshape(-1), y_pred.reshape(-1) + stats = performance_report(y, y_pred) + + # Plotting + fig, ax = plt.subplots(figsize=(8, 5)) # Adjust size as needed + + # Clip data points that have activity less than 0 or greater than 1.2x the max experimental y value + y_max = y.max()*1.1 + y_pred_adjusted = np.clip(y_pred, 0, y_max) + + # Scale uncertainties using IQR and color data points based on uncertainty + scaled_uncertainties = (self.uncertainties_ - np.percentile(self.uncertainties_, 25)) / iqr(self.uncertainties_) + cmap = plt.cm.viridis + colors = cmap(scaled_uncertainties) + colors[y_pred > y_max] = mcolors.to_rgba('crimson') + colors[y_pred < 0] = mcolors.to_rgba('crimson') + + # Scatter plot for main graph + scatter = ax.scatter(y_pred_adjusted, y, c=colors, alpha = 0.4) + + # Uncertainty colorbar + cbar = plt.colorbar(scatter, ax=ax) + cbar.set_label('Uncertainty') + + # Draw x=y line + ax.plot([0, y_max], [0, y_max], 'k--', linewidth=2) + + # Set labels and title for main graph + ax.text(0.9, 0.1, f'Pearson r={stats["Pearson r"]:.2f}', fontsize=12, ha='right', va='bottom', transform=ax.transAxes) + ax.set_xlabel('Predicted Score') + ax.set_ylabel('True Score') + ax.set_title(f'Model Performance') + ax.set_xlim(0, y_max) + + # Display model parameters using legend + model_params = self.name.split('|') # Assuming '|' separates different parameters + param_text = '\n'.join(model_params) + props = dict(boxstyle='round', facecolor='wheat', alpha=0.5) + ax.text(0.05, 0.95, param_text, transform=ax.transAxes, fontsize=9, + verticalalignment='top', bbox=props) + + # Return the figure and axes object + return stats, fig + + def custom_predictor(self, X): + """ + Makes predictions using the trained GP model. + + Args: + X (array-like): Features to predict on + + Returns: + array: Mean predictions + """ + if self.verbose_: + print('Finding GP model predictions on {} data points...' + .format(X.shape[0])) + + if self.backend_ == 'sklearn': + n_batches = int(ceil(float(X.shape[0]) / self.batch_size_)) + results = Parallel(n_jobs=self.n_jobs_)(#, max_nbytes=None)( + delayed(parallel_predict)( + self.model, + X[batch_num*self.batch_size_:(batch_num+1)*self.batch_size_], + batch_num, n_batches, self.verbose_ + ) + for batch_num in range(n_batches) + ) + mean = np.concatenate([ result[0] for result in results ]) + var = np.concatenate([ result[1] for result in results ]) + + elif self.backend_ == 'gpy': + mean, var = self.model.predict(X, full_cov=False) + + elif self.backend_ == 'gpytorch': + import gpytorch + import torch + + X = torch.Tensor(X).contiguous().cuda() + + # Set into eval mode. + self.model.eval() + self.likelihood_.eval() + + with torch.no_grad(), \ + gpytorch.settings.fast_pred_var(), \ + gpytorch.settings.max_root_decomposition_size(35): + preds = self.model(X) + + mean = preds.mean.detach().cpu().numpy() + var = preds.variance.detach().cpu().numpy() + + if self.verbose_: + print('Done predicting with GP model.') + + self.uncertainties_ = var.flatten() + return mean.flatten() + +class SparseGPRegressor(BaseRegressor): + """Sparse Gaussian Process regressor using inducing points. + + Attributes: + n_inducing_ (int): Number of inducing points + method_ (str): Method for selecting inducing points ('uniform' or 'geosketch') + n_restarts_ (int): Number of restarts for optimizer + kernel_ (sklearn.gaussian_process.kernels): Kernel function + backend_ (str): Backend framework to use + batch_size_ (int): Batch size for predictions + n_jobs_ (int): Number of parallel jobs + verbose_ (bool): Whether to print progress messages + gpr_: The trained GP model + """ + + def __init__( + self, + data_splitter, + featurizer, + model='SparseGPRegressor', + n_inducing=1000, + method='geoskech', + n_restarts=0, + kernel=None, + backend='sklearn', + batch_size=1000, + n_jobs=1, + verbose=False, + **kwargs + ): + """ + Args: + data_splitter: Object to split data into train/test sets + featurizer: Object to convert sequences to numerical features + model (str): Model identifier string + n_inducing (int): Number of inducing points + method (str): Method for selecting inducing points + n_restarts (int): Number of restarts for optimizer + kernel: Kernel function for GP + backend (str): Framework to use + batch_size (int): Batch size for predictions + n_jobs (int): Number of parallel jobs + verbose (bool): Whether to print progress messages + **kwargs: Additional keyword arguments + """ + self.n_inducing_ = n_inducing + self.method_ = method + self.n_restarts_ = n_restarts + self.kernel_ = kernel + self.backend_ = backend + self.batch_size_ = batch_size + self.n_jobs_ = n_jobs + self.verbose_ = verbose + super().__init__(data_splitter, featurizer,model, **kwargs) + + def train(self, X, y): + """ + Train the sparse GP model. + + Args: + X (array-like): Training features + y (array-like): Training target values + """ + X, y = self.X, self.y + if X.shape[0] > self.n_inducing_: + if self.method_ == 'uniform': + uni_idx = np.random.choice(X.shape[0], self.n_inducing_, + replace=False) + X_sketch = X[uni_idx] + y_sketch = y[uni_idx] + + elif self.method_ == 'geosketch': + from fbpca import pca + from geosketch import gs + + U, s, _ = pca(X, k=100) + X_dimred = U[:, :100] * s[:100] + gs_idx = gs(X_dimred, self.n_inducing_, replace=False) + X_sketch = X[gs_idx] + y_sketch = y[gs_idx] + + else: + X_sketch, y_sketch = X, y + + self.gpr_ = GPRegressor( + n_restarts=self.n_restarts_, + kernel=self.kernel_, + backend=self.backend_, + batch_size=self.batch_size_, + n_jobs=self.n_jobs_, + verbose=self.verbose_, + ).fit(X_sketch, y_sketch) + + + def custom_predictor(self, X): + """ + Makes predictions using the trained sparse GP model. + + Args: + X (array-like): Features to predict on + + Returns: + array: Mean predictions + """ + y_pred = self.gpr_.predict(X) + self.uncertainties_ = self.gpr_.uncertainties_ + return y_pred + +class GPLinearRegressor(GPRegressor): + """Gaussian Process regressor with linear kernel.""" + + def __init__(self, + data_splitter, + featurizer, + model='GPLinearRegressor', + n_restarts=0, + kernel = C(1., 'fixed') * DP(1., 'fixed'), + normalize_y=True, + backend='sklearn', + batch_size=1000, + n_jobs=1, + verbose=False, + **kwargs + ): + """ + Args: + data_splitter: Object to split data into train/test sets + featurizer: Object to convert sequences to numerical features + model (str): Model identifier string + n_restarts (int): Number of restarts for optimizer + kernel: Linear kernel function + normalize_y (bool): Whether to normalize target values + backend (str): Framework to use + batch_size (int): Batch size for predictions + n_jobs (int): Number of parallel jobs + verbose (bool): Whether to print progress messages + **kwargs: Additional keyword arguments + """ + + super().__init__(data_splitter, featurizer, model, n_restarts, kernel, normalize_y, backend, batch_size, n_jobs, verbose, **kwargs) + +class GPQuadRegressor(GPRegressor): + """Gaussian Process regressor with quadratic kernel.""" + + def __init__(self, + data_splitter, + featurizer, + model='GPQuadRegressor', + n_restarts=0, + kernel = C(1., 'fixed') * (DP(1, 'fixed') ** 2), + normalize_y=True, + backend='sklearn', + batch_size=1000, + n_jobs=1, + verbose=False, + **kwargs + ): + """ + Args: + data_splitter: Object to split data into train/test sets + featurizer: Object to convert sequences to numerical features + model (str): Model identifier string + n_restarts (int): Number of restarts for optimizer + kernel: Quadratic kernel function + normalize_y (bool): Whether to normalize target values + backend (str): Framework to use + batch_size (int): Batch size for predictions + n_jobs (int): Number of parallel jobs + verbose (bool): Whether to print progress messages + **kwargs: Additional keyword arguments + """ + + super().__init__(data_splitter, featurizer, model, n_restarts, kernel, normalize_y, backend, batch_size, n_jobs, verbose, **kwargs) + +class GPRBFRegressor(GPRegressor): + """Gaussian Process regressor with RBF kernel.""" + + def __init__(self, + data_splitter, + featurizer, + model='GPRBFRegressor', + n_restarts=0, + kernel = C(1., 'fixed') * RBF(1., 'fixed'), + normalize_y=True, + backend='sklearn', + batch_size=1000, + n_jobs=1, + verbose=False, + **kwargs + ): + """ + Args: + data_splitter: Object to split data into train/test sets + featurizer: Object to convert sequences to numerical features + model (str): Model identifier string + n_restarts (int): Number of restarts for optimizer + kernel: RBF kernel function + normalize_y (bool): Whether to normalize target values + backend (str): Framework to use + batch_size (int): Batch size for predictions + n_jobs (int): Number of parallel jobs + verbose (bool): Whether to print progress messages + **kwargs: Additional keyword arguments + """ + + super().__init__(data_splitter, featurizer, model, n_restarts, kernel, normalize_y, backend, batch_size, n_jobs, verbose, **kwargs) \ No newline at end of file diff --git a/model/predictors/neural_net_regressors.py b/model/predictors/neural_net_regressors.py new file mode 100644 index 0000000000000000000000000000000000000000..c198411f036ebe23be151d0a60c58790652e18d2 --- /dev/null +++ b/model/predictors/neural_net_regressors.py @@ -0,0 +1,746 @@ +import torch, wandb +from torch import nn, optim +import numpy as np +import matplotlib.pyplot as plt +import yaml +import os +import pandas as pd + +from model.utils.other_utils import performance_report, log_results +from model.utils.data_utils import TorchDataProcessor + +# Get the directory where the script is located +script_dir = os.path.dirname(__file__) + +# Master Functions to Train and Evaluate Models +def run_nn_model_experiments(splits, + features, + models, # Fcn, Cnn + experiment_name, + use_cache=False, + sweep_depth="standard", # standard, custom, test + search_method="grid", # grid, bayes, test + count=10, + show_plots=True + ): + """Run neural network model experiments with hyperparameter sweeps. + + Args: + splits (list): List of DataSplitter objects containing train/val/test splits + features (list): List of feature types to use (e.g. ['onehot', 'esm']) + models (list): List of model classes to run (e.g. [Fcn, Cnn]) + experiment_name (str): Name for the W&B experiment + use_cache (bool, optional): Whether to cache results. Defaults to False. + sweep_depth (str, optional): Sweep type - 'standard', 'custom', 'test'. Defaults to 'standard'. + search_method (str, optional): Search method - 'grid', 'bayes', 'test'. Defaults to 'grid'. + count (int, optional): Number of runs per sweep. Defaults to 10. + show_plots (bool, optional): Whether to show matplotlib plots. Defaults to True. + + Returns: + None: Results are logged to W&B + + Example: + >>> splits = [DataSplitter(data, 'random')] + >>> features = ['onehot'] + >>> models = [Fcn, Cnn] + >>> run_nn_model_experiments(splits, + ... features, + ... models, + ... experiment_name='my_experiment', + ... sweep_depth='selective', + ... search_method='bayes', + ... show_plots=True) + """ + + for split in splits: + for feature in features: + for model in models: + + """Define sweep configuration.""" + config_map = { + ("Fcn", "standard", "grid"): "fcn_standard_grid_sweep.yaml", + ("Fcn", "standard", "bayes"): "fcn_standard_bayes_sweep.yaml", + ("Fcn", "custom", "grid"): "fcn_custom_grid_sweep.yaml", + ("Fcn", "test", "test"): "fcn_test_sweep.yaml", + ("Cnn", "standard", "grid"): "cnn_standard_grid_sweep.yaml", + ("Cnn", "standard", "bayes"): "cnn_standard_bayes_sweep.yaml", + ("Cnn", "custom", "grid"): "cnn_custom_grid_sweep.yaml", + ("Cnn", "test", "test"): "cnn_test_sweep.yaml", + } + + yaml_file = config_map.get((model.__name__, sweep_depth, search_method)) + if yaml_file is None: + print( + f"Invalid sweep configuration: model={model}, sweep_depth={sweep_depth}, search_method={search_method}." + ) + return + + working_script_dir = script_dir + + # Assuming 'script_dir' is defined earlier in your code + yaml_file_path = os.path.join(working_script_dir, "sweep_configs", yaml_file) + + with open(yaml_file_path, "r") as file: + sweep_config = yaml.safe_load(file) + + + """initialize the sweep.""" + #sweep_id = wandb.sweep(sweep=sweep_config, project=experiment_name) + + # Define a train function for hyperparameter sweeps with WANDB + + #def train_function(): + # with wandb.init() as run: + + # Grab config + # config = run.config + + # Specify model + # instance = model(split, feature, use_cache=use_cache, config=config, show_plots=show_plots) + + # Train and evaluate model + # stat = instance.run_model() + + #if search_method == "grid" or search_method == "test": + # wandb.agent(sweep_id, train_function) + #elif search_method == "bayes": + # wandb.agent(sweep_id, train_function, count=count) + #LL 2026 # 手动从 sweep_config 中提取一组默认参数(取每个参数的第一个值) + default_config = {} + if 'parameters' in sweep_config: + for param_name, param_values in sweep_config['parameters'].items(): + if 'value' in param_values: + default_config[param_name] = param_values['value'] + elif 'values' in param_values: + default_config[param_name] = param_values['values'][0] + else: + default_config[param_name] = None + + # 直接训练模型,不通过 wandb + instance = model(split, feature, use_cache=use_cache, config=default_config, show_plots=show_plots) + stat = instance.run_model() + + +# Neural network classes +class BaseNN(nn.Module): + """Base neural network class implementing common functionality. + + This class provides the base implementation for neural network models including + data loading, training loops, evaluation, and model saving/loading. + + Args: + data_splitter: DataSplitter object containing train/val/test splits + featurizer: Featurizer object for processing sequences + nn_arch: Neural network architecture specification + model (str): Model name identifier. Defaults to "Base" + use_cache (bool): Whether to use model caching. Defaults to False + show_plots (bool): Whether to show matplotlib plots. Defaults to True + **kwargs: Additional keyword arguments + + Attributes: + model_name (str): Name of the model + featurizer: Featurizer object + use_cache (bool): Whether caching is enabled + kwargs (dict): Additional arguments + nn_arch (str): Architecture specification string + device (torch.device): Device to run model on (CPU/GPU) + show_plots (bool): Whether to show matplotlib plots. Defaults to True + Example: + >>> splitter = DataSplitter(data, 'random') + >>> featurizer = OneHotFeaturizer() + >>> model = BaseNN(splitter, featurizer, [64,32], model='test', show_plots=True) + """ + + def __init__(self, data_splitter, featurizer, nn_arch, model="Base", use_cache=False, show_plots=True, **kwargs): + super(BaseNN, self).__init__() + + # Set variables + self.model_name = model + self.featurizer = featurizer + self.use_cache = use_cache + self.kwargs = kwargs + self.nn_arch = "-".join([str(x) for x in nn_arch]) + self.show_plots = show_plots + + # Setup data + self.nn_data_processor = TorchDataProcessor(data_splitter, self.featurizer, self.kwargs["config"]["batch_size"]) + #[TODO] remove this and only process data once required + + self.split_method = self.nn_data_processor.split_name + + # set model directory + self.file_attrs = data_splitter.file_attrs + self.file_attrs['model_dir'] = os.path.join(data_splitter.file_attrs["dataset_dir"], 'model_cache', data_splitter.file_attrs["dataset_name"]) + + """Set variables.""" + if torch.backends.mps.is_available(): + self.device = torch.device("mps") + print("MPS available. Using Apple Silicon GPU for Neural Network.") + elif torch.cuda.is_available(): + self.device = torch.device("cuda:0") + print("CUDA available. Using Nvidia GPU for Neural Network.") + else: + self.device = torch.device("cpu") + print("Neither MPS nor CUDA is available. Using CPU for Neural Network.") + + def setup_model(self): + """Set up the model by initializing hyperparameters and loading cached model if available.""" + + # Retrieve hyperparameters from current run config + self.set_hyperparams() + + # Define model + self.file_attrs['model_name'] = ( + self.split_method + " __ " + + self.featurizer.name + " __ " + + self.model_name + " __ " + + self.nn_arch + " __ " + + str(self.kwargs["config"]["learning_rate"]) + " __ " + + str(self.kwargs["config"]["batch_size"]) + " __ " + + self.kwargs["config"]["optimizer"] + ) + + self.model_path = os.path.join(self.file_attrs['model_dir'], 'objects', f'{self.file_attrs["model_name"]}.pth') + + # Load model if available + if self.model_path is not None and os.path.exists(self.model_path) and self.use_cache: + self.load_model(model_path=None) + self.to(self.device) + else: + self.to(self.device) + + def run_model(self, eval=True): + """Run the full model training and evaluation pipeline. + + This method handles: + 1. Loading cached model if available + 2. Training the model if needed + 3. Evaluating on test set + 4. Saving model if caching enabled + + Returns: + dict: Dictionary of model performance statistics + """ + + if self.model_path is not None and os.path.exists(self.model_path): + model = self + train_loss = self.train_loop_eval_mode(model) + val_loss = self.val_loop(model) + + else: + model = self + + # Train model + + for epoch in range(self.epochs): + train_loss = self.train_loop(model) + val_loss = self.val_loop(model) + + # Log data + if wandb.run is not None: + wandb.log({"Train Loss": train_loss, "Val Loss": val_loss}) + + # Check for early stopping + if self.early_stopping_check(val_loss, epoch) == True: + break + else: + continue + + # Save model + if self.use_cache: + self.save_model(model, model_path=None) + + # Test model + if eval == True: + return self.evaluate(model) + else: + return None + + def load_model(self, model_path=None): + """Load a pre-trained model from disk. + + Args: + model_path (str, optional): Path to model file. If None, uses default path. + """ + + # set location to load model + model_path = self.model_path if model_path is None else model_path + print(f"Loading model from {model_path}") + # Load the trained model parameters + self.load_state_dict(torch.load(model_path, map_location=self.device, weights_only=True)) + + def save_model(self, model, model_path=None): + """Save model to disk. + + Args: + model: Model to save + model_path (str, optional): Path to save model to. If None, uses default path. + """ + + # set location to save model + model_path = self.model_path if model_path is None else model_path + + dir_path = os.path.join(self.file_attrs['model_dir'], 'objects') + # Check if the directory exists, create it if it doesn't + if not os.path.exists(dir_path): + os.makedirs(dir_path) + + # Save the model + print(f"Saving model to {self.model_path}") + torch.save(model.state_dict(), self.model_path) + + def forward(self, x): + """Forward pass through the network. + + Args: + x: Input tensor + + Returns: + Output tensor + """ + return x + + def train_loop(self, model): + """Training loop for one epoch. + + Args: + model: Model to train + + Returns: + float: Average training loss for the epoch + """ + model.train() + total_train_loss = 0 + total_samples = 0 + + # [TODO] new function to set up train loader if not already done + if not hasattr(self, 'train_loader'): + self.train_loader = self.nn_data_processor.setup_train_loader() + + for batch in self.train_loader: + inputs, targets, __ = batch + inputs, targets = inputs.to(self.device), targets.to(self.device) + targets = targets.unsqueeze(1) + self.optimizer.zero_grad() + outputs = model(inputs) + loss = self.criterion(outputs, targets) + total_train_loss += loss.item() + loss.backward() + self.optimizer.step() + total_samples += inputs.size(0) + + train_loss = total_train_loss / total_samples + + return train_loss + + def train_loop_eval_mode(self, model): + """Training loop in evaluation mode (no gradients). + + Args: + model: Model to evaluate + + Returns: + float: Average training loss + """ + model.eval() + with torch.no_grad(): + total_train_loss = 0 + total_samples = 0 + + # [TODO] new function to set up train loader if not already done + if not hasattr(self, 'train_loader'): + self.train_loader = self.nn_data_processor.setup_train_loader() + + for batch in self.train_loader: + inputs, targets, __ = batch + inputs, targets = inputs.to(self.device), targets.to(self.device) + targets = targets.unsqueeze(1) + outputs = model(inputs) + total_train_loss += self.criterion(outputs, targets).item() + total_samples += inputs.size(0) + + train_loss = total_train_loss / total_samples + + return train_loss + + def val_loop(self, model): + """Validation loop. + + Args: + model: Model to evaluate + + Returns: + float: Average validation loss + """ + model.eval() + with torch.no_grad(): + total_val_loss = 0 + total_samples = 0 + # [TODO] new function to set up val loader if not already done + if not hasattr(self, 'val_loader'): + self.val_loader = self.nn_data_processor.setup_val_loader() + + for batch in self.val_loader: + inputs, targets, __ = batch + inputs, targets = inputs.to(self.device), targets.to(self.device) + targets = targets.unsqueeze(1) + outputs = model(inputs) + total_val_loss += self.criterion(outputs, targets).item() + total_samples += inputs.size(0) + + val_loss = total_val_loss / total_samples + + return val_loss + + def evaluate(self, model): + """Evaluate model on test set. + + Args: + model: Model to evaluate + + Returns: + dict: Dictionary of performance statistics + """ + + # Evaluate model, get metrics for validation and test set + model.eval() + + stats_dict = { + "val": {}, + "test": {} + } + + loader_names = ["val", "test"] + + with torch.no_grad(): + + # [TODO] new function to set up val and test loaders if not already done + if not hasattr(self, 'val_loader'): + self.val_loader = self.nn_data_processor.setup_val_loader() + if not hasattr(self, 'test_loader'): + self.test_loader = self.nn_data_processor.setup_test_loader() + + for index, loader in enumerate([self.val_loader, self.test_loader]): + loader_name = loader_names[index] + total_loss = 0 + total_samples = 0 + y = [] + y_pred = [] + original_sequences_list = [] + + for batch in loader: + inputs, targets, original_sequences = batch + inputs, targets = inputs.to(self.device), targets.to(self.device) + targets = targets.unsqueeze(1) + outputs = model(inputs) + total_loss += self.criterion(outputs, targets).item() + + # Move to CPU and convert to numpy + y.extend(targets.cpu().detach().numpy()) + y_pred.extend(outputs.cpu().detach().numpy()) + original_sequences_list.extend(original_sequences) + + total_samples += inputs.size(0) + + + # Reshape data and get correlation stats + y = np.concatenate(y).ravel() + y_pred = np.concatenate(y_pred).ravel() + + # Get stats + stats_dict[loader_name] = performance_report(y, y_pred) + + # graph results for test set + # Set the default parameters + plt.rcParams['font.size'] = 7 + plt.rcParams['lines.linewidth'] = 0.5 + + fig, ax = plt.subplots(figsize=(4, 3)) + + # Mark data points that have activity less than 0 or greater than 1.2x the max experimental y value + y_max = max(y.max(), y_pred.max()) * 1.2 + colors = np.where(y_pred > y_max, 'crimson', np.where(y_pred < 0, 'crimson', 'dodgerblue')) + y_pred_adjusted = np.clip(y_pred, 0, y_max) + + # Scatter plot for main graph + ax.scatter(y_pred_adjusted, y, c=colors, alpha=0.4, edgecolors='w', linewidth=0.5) + + # Draw x=y line + ax.plot([0, y_max], [0, y_max], 'k--', linewidth=0.5) + + # Set labels and title for main graph + ax.text(0.9, 0.1, f'Pearson r={stats_dict["test"]["Pearson r"]:.2f}', fontsize=7, ha='right', va='bottom', transform=ax.transAxes) + ax.text(0.9, 0.2, f'Spearman r={stats_dict["test"]["Spearman r"]:.2f}', fontsize=7, ha='right', va='bottom', transform=ax.transAxes) + ax.set_xlabel('Predicted Score', fontsize=7) + ax.set_ylabel('True Score', fontsize=7) + ax.set_title('Model Performance', fontsize=7) + ax.set_xlim(0, y_max) + + # Display model parameters using legend + model_params = self.file_attrs['model_name'].split('__') # Assuming '|' separates different parameters + param_text = '\n'.join(model_params) + props = dict(boxstyle='square', facecolor='wheat', alpha=0.2) + ax.text(0.02, 0.98, param_text, transform=ax.transAxes, fontsize=7, verticalalignment='top', bbox=props) + + # Adjust tick parameters + ax.tick_params(axis='both', which='major', labelsize=7) + + self.fig = fig + + if self.show_plots: + plt.show() + plt.close(fig) + + # Log data + log_results(stats_dict, self) + + # Save predictions for test set as a table + if self.use_cache: + dir_path = os.path.join(self.file_attrs['model_dir'], 'results') + # Check if the directory exists, create it if it doesn't + if not os.path.exists(dir_path): + os.makedirs(dir_path) + pred_results = pd.DataFrame({"original_sequences": original_sequences_list, "y": list(y), "y_pred": list(y_pred)}) + pred_results.to_csv(f"{dir_path}/{self.file_attrs['model_name']}.csv", index=False) + + return stats_dict['test'] + + def early_stopping_check(self, val_loss, epoch): + """Check if early stopping criteria are met. + + Args: + val_loss (float): Current validation loss + epoch (int): Current epoch number + + Returns: + bool: True if training should stop, False otherwise + """ + # modify epoch count + val_loss_delta = self.val_loss_min - val_loss + if val_loss_delta > self.val_loss_delta_min: + self.val_loss_min = val_loss + self.epochs_no_improve = 0 + else: + self.epochs_no_improve += 1 + + # check epoch count + if self.epochs_no_improve == self.patience: + print(f"Early stopping after {epoch} epochs with {self.val_loss_min}.") + return True + else: + return False + + def set_hyperparams(self): + """Set model hyperparameters from config.""" + + self.criterion = nn.MSELoss() + self.lr = self.kwargs["config"]["learning_rate"] + if self.kwargs["config"]["optimizer"] == "adam": + self.optimizer = optim.Adam(self.parameters(), lr=self.lr) + elif self.kwargs["config"]["optimizer"] == "sgd": + self.optimizer = optim.SGD(self.parameters(), lr=self.lr) + self.epochs = self.kwargs["config"]["epochs"] + + # early stopping + self.patience = 15 + self.val_loss_min = float("inf") + self.val_loss_delta_min = 0.00001 + self.epochs_no_improve = 0 # initialize epochs_no_improve for early stopping + + def custom_predictor(self, X): + """Make predictions on input data. + + Args: + X: Input features + + Returns: + numpy.ndarray: Model predictions + """ + + model = self + inputs = torch.from_numpy(X.astype(np.float32)).to(self.device) + + model.eval() + with torch.no_grad(): + outputs = model(inputs) + + outputs_np = outputs.cpu().numpy() + return outputs_np + + def predict(self, X, batch_size=10000): + """Make predictions on sequences in batches. + + Args: + X (list): List of sequences to predict + + Returns: + numpy.ndarray: Array of predictions + """ + batch_size = batch_size + predictions = [] + + # Process in batches + for i in range(0, len(X), batch_size): + batch = X[i:i + batch_size] + X_featurized = self.featurizer.featurize(batch) + X_featurized = X_featurized.reshape(X_featurized.shape[0], -1) + batch_predictions = self.custom_predictor(X_featurized) + predictions.append(batch_predictions) + + return np.concatenate(predictions).ravel() + +class Fcn(BaseNN): + """Fully connected neural network model. + + Args: + data_splitter: DataSplitter object containing train/val/test splits + feature: Featurizer object for processing sequences + model (str): Model name identifier. Defaults to "fcn" + use_cache (bool): Whether to use model caching. Defaults to False + show_plots (bool): Whether to show matplotlib plots. Defaults to True + **kwargs: Additional keyword arguments including network architecture + + Example: + >>> splitter = DataSplitter(data, 'random') + >>> featurizer = OneHotFeaturizer() + >>> model = Fcn(splitter, featurizer, config=config, use_cache=True, show_plots=True) + """ + + def __init__(self, data_splitter, feature, model="fcn", use_cache=False, show_plots=True, **kwargs): + + # Specify network architecture + nn_arch = [kwargs["config"]["layer_size"]] * kwargs["config"]["num_layers"] + + super().__init__(data_splitter, feature, nn_arch, model, use_cache=use_cache, show_plots=show_plots, **kwargs) + + # [TODO] new function to extract input features if not already done + + X_train_feat_example = self.nn_data_processor.featurize([self.nn_data_processor.X_train[0]])[0] + input_features = X_train_feat_example.flatten().shape[0] + self.flatten = nn.Flatten() + self.layers = nn.ModuleList() + + # First layer + self.layers.append(nn.Linear(input_features, nn_arch[0])) + self.layers.append(nn.LeakyReLU(negative_slope=0.2)) + self.layers.append(nn.Dropout(p=0.2)) + + for i in range(0, len(nn_arch)): + if i < len(nn_arch) - 1: + self.layers.append(nn.Linear(nn_arch[i], nn_arch[i + 1])) + self.layers.append(nn.LeakyReLU(negative_slope=0.2)) + self.layers.append(nn.Dropout(p=0.2)) + if i == len(nn_arch) - 1: + self.layers.append(nn.Linear(nn_arch[i], 1)) + + # set model hyperparameters + self.setup_model() + + def forward(self, x): + """Forward pass through the network. + + Args: + x: Input tensor + + Returns: + Output tensor + """ + x = self.flatten(x) + for layer in self.layers: + x = layer(x) + return x + +class Cnn(BaseNN): + """Convolutional neural network model. + + Args: + data_splitter: DataSplitter object containing train/val/test splits + feature: Featurizer object for processing sequences + model (str): Model name identifier. Defaults to "cnn" + use_cache (bool): Whether to use model caching. Defaults to False + show_plots (bool): Whether to show matplotlib plots. Defaults to True + **kwargs: Additional keyword arguments including network architecture + + Example: + >>> splitter = DataSplitter(data, 'random') + >>> featurizer = OneHotFeaturizer() + >>> model = Cnn(splitter, featurizer, use_cache=True, show_plots=True) + """ + + def __init__(self, data_splitter, feature, model="cnn", use_cache=False, show_plots=True, **kwargs): + + # Specify network architecture + nn_arch = [kwargs["config"]["kernel_size"]] + [ + int(x) for x in kwargs["config"]["layersize_filtersize"].split("-") + ] + + super().__init__(data_splitter, feature, nn_arch, model, use_cache=use_cache, show_plots=show_plots, **kwargs) + + # [TODO] new function to extract input features if not already done + X_train_feat_example = self.nn_data_processor.featurize([self.nn_data_processor.X_train[0]])[0] + protein_len = X_train_feat_example.shape[0] + encoding_len = X_train_feat_example.shape[1] + kernel_size_dim1, layers, out_channels = nn_arch + + in_channels = 1 + + self.conv_layers = nn.ModuleList() + + for i in range(layers): + conv2d_layer = nn.Conv2d( + in_channels=in_channels, + out_channels=out_channels, + kernel_size=(kernel_size_dim1, encoding_len if i == 0 else 1), + stride=(1, 1), + ) + self.conv_layers.append(conv2d_layer) + self.conv_layers.append(nn.LeakyReLU(negative_slope=0.2)) + in_channels = out_channels + + # Dynamically calculate the input size for the fully connected layer + self._init_fc_layers(protein_len, encoding_len, out_channels) + + # set model hyperparameters + self.setup_model() + + def _init_fc_layers(self, protein_len, encoding_len, out_channels): + """Initialize fully connected layers. + + Args: + protein_len (int): Length of protein sequence + encoding_len (int): Length of sequence encoding + out_channels (int): Number of output channels + """ + # Dummy input for calculating size + dummy_input = torch.randn(1, 1, protein_len, encoding_len) + for layer in self.conv_layers: + dummy_input = layer(dummy_input) + + output_size = dummy_input.view(dummy_input.size(0), -1).size(1) + + self.flatten = nn.Flatten() + self.fc1 = nn.Linear(output_size, 100) + self.leaky_relu = nn.LeakyReLU(negative_slope=0.2) + self.dropout = nn.Dropout(p=0.2) + self.fc2 = nn.Linear(100, 1) + + def forward(self, x): + """Forward pass through the network. + + Args: + x: Input tensor + + Returns: + Output tensor + """ + x = x.unsqueeze(1) # add a channel dimension of 1 to the data + for layer in self.conv_layers: + x = layer(x) + + x = self.flatten(x) + x = self.fc1(x) + x = self.leaky_relu(x) + x = self.dropout(x) + x = self.fc2(x) + + return x diff --git a/model/predictors/sweep_configs/cnn_custom_grid_sweep.yaml b/model/predictors/sweep_configs/cnn_custom_grid_sweep.yaml new file mode 100644 index 0000000000000000000000000000000000000000..11215cc549f644589ba98baeea47d2db9cb68ca2 --- /dev/null +++ b/model/predictors/sweep_configs/cnn_custom_grid_sweep.yaml @@ -0,0 +1,18 @@ +program: train.py +method: grid +metric: + name: Test Loss + goal: minimize +parameters: + layersize_filtersize: + values: ["1-32", "1-128", "1-256", "1-1024"] + kernel_size: + values: [3, 7] + learning_rate: + values: [0.0001, 0.001] + batch_size: + values: [4, 8] + optimizer: + value: "adam" + epochs: + value: 300 diff --git a/model/predictors/sweep_configs/cnn_standard_bayes_sweep.yaml b/model/predictors/sweep_configs/cnn_standard_bayes_sweep.yaml new file mode 100644 index 0000000000000000000000000000000000000000..9310230ec8f92ca376f675520ac9b15cd7d1f82f --- /dev/null +++ b/model/predictors/sweep_configs/cnn_standard_bayes_sweep.yaml @@ -0,0 +1,18 @@ +program: train.py +method: bayes +metric: + name: Test Loss + goal: minimize +parameters: + layersize_filtersize: + values: ["1-32", "1-128", "1-256", "1-1024", "2-128", "3-128", "5-128"] + kernel_size: + values: [3, 7, 13, 17] + learning_rate: + values: [0.0001, 0.001, 0.01] + batch_size: + values: [4, 8, 16, 32] + optimizer: + value: "adam" + epochs: + value: 300 diff --git a/model/predictors/sweep_configs/cnn_standard_grid_sweep.yaml b/model/predictors/sweep_configs/cnn_standard_grid_sweep.yaml new file mode 100644 index 0000000000000000000000000000000000000000..8c86c8b1669878d03d3638776cfecd165dc53572 --- /dev/null +++ b/model/predictors/sweep_configs/cnn_standard_grid_sweep.yaml @@ -0,0 +1,18 @@ +program: train.py +method: grid +metric: + name: Test Loss + goal: minimize +parameters: + layersize_filtersize: + values: ["1-32", "1-128", "1-256", "1-1024", "2-128", "3-128", "5-128"] + kernel_size: + values: [3, 7, 13, 17] + learning_rate: + values: [0.0001, 0.001, 0.01] + batch_size: + values: [4, 8, 16, 32] + optimizer: + value: "adam" + epochs: + value: 300 diff --git a/model/predictors/sweep_configs/cnn_test_sweep.yaml b/model/predictors/sweep_configs/cnn_test_sweep.yaml new file mode 100644 index 0000000000000000000000000000000000000000..27b82194889d45217d6010aa9d3ac9a985ad7d7c --- /dev/null +++ b/model/predictors/sweep_configs/cnn_test_sweep.yaml @@ -0,0 +1,18 @@ +program: train.py +method: grid +metric: + name: Test Loss + goal: minimize +parameters: + layersize_filtersize: + values: ["1-32"] + kernel_size: + values: [3] + learning_rate: + values: [0.0001] + batch_size: + values: [32] + optimizer: + value: "adam" + epochs: + value: 300 diff --git a/model/predictors/sweep_configs/fcn_custom_grid_sweep.yaml b/model/predictors/sweep_configs/fcn_custom_grid_sweep.yaml new file mode 100644 index 0000000000000000000000000000000000000000..9811ede81c4bb41081fdf86ca9ef0c1382bb953f --- /dev/null +++ b/model/predictors/sweep_configs/fcn_custom_grid_sweep.yaml @@ -0,0 +1,18 @@ +program: train.py +method: grid +metric: + name: Test Loss + goal: minimize +parameters: + layer_size: + value: 100 + num_layers: + values: [1, 2, 3, 4, 5] + learning_rate: + values: [0.0001, 0.001, 0.01] + batch_size: + values: [16, 32, 64, 128, 256, 512] + optimizer: + value: "adam" + epochs: + value: 500 \ No newline at end of file diff --git a/model/predictors/sweep_configs/fcn_standard_bayes_sweep.yaml b/model/predictors/sweep_configs/fcn_standard_bayes_sweep.yaml new file mode 100644 index 0000000000000000000000000000000000000000..ca1aa154ac4f603952f11d6a46e31e5a9da6ecae --- /dev/null +++ b/model/predictors/sweep_configs/fcn_standard_bayes_sweep.yaml @@ -0,0 +1,18 @@ +program: train.py +method: bayes +metric: + name: Test Loss + goal: minimize +parameters: + layer_size: + value: 100 + num_layers: + values: [1, 2, 3, 4, 5] + learning_rate: + values: [0.0001, 0.001, 0.01] + batch_size: + values: [4, 8, 16, 32] + optimizer: + value: "adam" + epochs: + value: 300 \ No newline at end of file diff --git a/model/predictors/sweep_configs/fcn_standard_grid_sweep.yaml b/model/predictors/sweep_configs/fcn_standard_grid_sweep.yaml new file mode 100644 index 0000000000000000000000000000000000000000..fd937ea90be9ae34875ac481fdb871672d64e1de --- /dev/null +++ b/model/predictors/sweep_configs/fcn_standard_grid_sweep.yaml @@ -0,0 +1,18 @@ +program: train.py +method: grid +metric: + name: Test Loss + goal: minimize +parameters: + layer_size: + value: 100 + num_layers: + values: [1, 2, 3, 4, 5] + learning_rate: + values: [0.0001, 0.001, 0.01] + batch_size: + values: [4, 8, 16, 32] + optimizer: + value: "adam" + epochs: + value: 300 \ No newline at end of file diff --git a/model/predictors/sweep_configs/fcn_test_sweep.yaml b/model/predictors/sweep_configs/fcn_test_sweep.yaml new file mode 100644 index 0000000000000000000000000000000000000000..bda9d273ec2c839ea552904026087199116f5295 --- /dev/null +++ b/model/predictors/sweep_configs/fcn_test_sweep.yaml @@ -0,0 +1,18 @@ +program: train.py +method: grid +metric: + name: Test Loss + goal: minimize +parameters: + layer_size: + value: 100 + num_layers: + values: [1] + learning_rate: + values: [0.0001] + batch_size: + values: [32] + optimizer: + value: "adam" + epochs: + value: 300 \ No newline at end of file diff --git a/model/proposers/__init__.py b/model/proposers/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..242fe6471cada381706b34f35e2c24a999cd6f8a --- /dev/null +++ b/model/proposers/__init__.py @@ -0,0 +1 @@ +from model.proposers.base_proposers import * \ No newline at end of file diff --git a/model/proposers/base_proposers.py b/model/proposers/base_proposers.py new file mode 100644 index 0000000000000000000000000000000000000000..dba243ed8759373801b466be679188eae2921ba2 --- /dev/null +++ b/model/proposers/base_proposers.py @@ -0,0 +1,921 @@ +import copy +import os +from joblib import Parallel, delayed +import random +from typing import List, Tuple + +from Bio import SeqIO +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt +from tqdm import tqdm +import seaborn as sns +from itertools import combinations, product + +from model.predictors import BaseRegressor, GPRegressor +from model.utils.data_utils import MutationFormat, MutationListFormats, levenshtein_distance_matrix +from model.utils.other_utils import deep_mutational_scan, wt_only_mutational_pool_to_dict, mutational_pool_to_dict, mut_pool_searcher + +# Definitions: +# Mutant = single substitution, deletion, or insertion +# Variant = single sequence with multiple mutations + +######################################### +# Unsupervised proposers: These propose new sequences without using previous data. + + +class BaseProposer: + """ + Base class for proposing mutations on protein sequences. + + Attributes: + start_seq (str): The starting protein sequence. + models (list): List of models for evaluating proposed mutants. + trust_radius (int): Maximum number of mutations allowed in a variant. + num_seeds (int): Maximum number of sequences or evolutionary trajectories allowed. + mutation_pool (list): List of possible mutations to propose from. + experiment_name (str): Name of the experiment run. + proposals (pd.DataFrame): DataFrame to store proposed mutations. + """ + + def __init__( + self, + start_seq, + models=None, + trust_radius=None, + num_seeds=None, + mutation_pool=None, + experiment_name="base_proposer_run" + ): + """ + Initialize the BaseProposer. + + Args: + start_seq (str): Starting protein sequence. + experiment_name (str): Name of the experiment run. + models (list): List of models for evaluating proposed mutants. + trust_radius (int): Maximum number of mutations allowed in a variant. + num_seeds (int): Maximum number of sequences or evolutionary trajectories allowed. + mutation_pool (list): List of possible mutations to propose from. If None, generates a full deep mutational scan. + """ + self.start_seq = start_seq + self.experiment_name = experiment_name + self.models = models + self.trust_radius = trust_radius + self.num_seeds = num_seeds + self.proposals = None + + if mutation_pool is None: + # Generate default mutation pool if not provided + mutation_pool = list(deep_mutational_scan(self.start_seq)) + mutation_pool = [mut for mut in mutation_pool if mut[2] != "*"] + mutation_pool = [f"{mut[1]}{mut[0] + 1}{mut[2]}" for mut in mutation_pool] + self.mutation_pool = mutation_pool + elif mutation_pool is not None: + # Convert provided mutation pool to standard format + mutation_lists = MutationListFormats(mutation_pool, self.start_seq) + self.mutation_pool = mutation_lists.get_mutation_pool() + + def get_proposals(self): + """ + Retrieve the current proposals. + + Returns: + pd.DataFrame: Current proposals. + """ + return self.proposals + + def save_proposals(self, filename): + """ + Save the current proposals to a CSV file. + + Args: + filename (str): Name of the file to save proposals. + + Raises: + ValueError: If no proposals have been made. + """ + if self.proposals is None: + raise ValueError("No proposals have been made.") + else: + dir_path = os.path.join(self.models[0].file_attrs["dataset_dir"], "proposers/results/") + + if not os.path.exists(dir_path): + os.makedirs(dir_path) + self.proposals.to_csv( + os.path.join(dir_path, f"{filename}.csv"), index=False + ) + + def proposal_list_to_dataframe(self, muts) -> pd.DataFrame: + """ + Convert a list of mutations to a DataFrame. + + Args: + muts (list): List of mutation lists. + + Returns: + pd.DataFrame: DataFrame containing mutations, full sequences, and mutation strings. + """ + proposals = pd.DataFrame({'Mutations': muts}) + proposals["Full_Sequence"] = proposals.apply(lambda row: MutationFormat(row['Mutations'], self.start_seq).to_full_sequence(), axis=1) + proposals['Mut_string'] = proposals.apply(lambda row: MutationFormat(row['Full_Sequence'], self.start_seq).to_mutation_string(), axis=1) + + return proposals + + def propose(self) -> pd.DataFrame: + """ + Generate and return proposals. + + Returns: + pd.DataFrame: DataFrame of proposal mutations and full sequences. + + Raises: + NotImplementedError: This method should be implemented by subclasses. + """ + raise NotImplementedError + + def evaluate_proposals(self) -> pd.DataFrame: + """ + Evaluate the generated proposals with the supplied models. + + Returns: + pd.DataFrame: DataFrame with evaluation results added. + + Raises: + ValueError: If no model is available or no proposals have been made. + """ + if self.models is None: + raise ValueError("No model to evaluate.") + if self.proposals is None: + raise ValueError("No proposals have been made.") + + for model in tqdm(self.models): + print(f"Evaluating proposals with model: {model.file_attrs['model_name']}") + self.proposals[model.file_attrs['model_name']] = model.predict(self.proposals["Full_Sequence"]) + + # Calculate average across all models + self.proposals['average'] = self.proposals.iloc[:,-len(self.models):].mean(axis=1) + + + def get_variables(self) -> dict: + """ + Retrieve all instance variables. + + Returns: + dict: Dictionary of all instance variables. + """ + return self.__dict__ + + +class AlanineScanningProposer(BaseProposer): + """ + Proposer that replaces every position with an alanine. + + Attributes: + start_seq (str): The starting protein sequence. + models (list): List of models for evaluating proposed mutants. + trust_radius (int): Maximum number of mutations allowed in a variant. + num_seeds (int): Maximum number of sequences or evolutionary trajectories allowed. + mutation_pool (list): List of possible mutations to propose from. + experiment_name (str): Name of the experiment run. + proposals (pd.DataFrame): DataFrame to store proposed mutations. + + Example Usage: + + # Ignore: num_seeds, experiment_name, trust_radius, mutation_pool + proposer = AlanineScanningProposer( + start_seq="MKTSTGNFKIVILMGVNRRMKTSTGNFKI", + models=[model1, model2], # List of trained models + ) + + # Generate and get proposals + proposer.propose() + + # Predict activity of proposed mutants + proposer.evaluate_proposals() + + # Save proposals to file + proposer.save_proposals("alanine_scanning_proposals") + """ + + def propose(self) -> pd.DataFrame: + """ + Generate proposals by replacing each position with alanine. + + Returns: + pd.DataFrame: DataFrame of alanine scanning proposals. + """ + muts = [] + for i, wt in enumerate(self.start_seq): + muts.append(f"{wt}{i+1}A") + + self.proposals = self.proposal_list_to_dataframe(muts) + + return self.proposals + + +class DeepMutationalScanningProposer(BaseProposer): + """ + Proposer that generates every possible single amino acid substitution. + + Attributes: + start_seq (str): The starting protein sequence. + models (list): List of models for evaluating proposed mutants. + trust_radius (int): Maximum number of mutations allowed in a variant. + num_seeds (int): Maximum number of sequences or evolutionary trajectories allowed. + mutation_pool (list): List of possible mutations to propose from. + experiment_name (str): Name of the experiment run. + proposals (pd.DataFrame): DataFrame to store proposed mutations. + + Example Usage: + + # Ignore: num_seeds, experiment_name, trust_radius, mutation_pool + proposer = DeepMutationalScanningProposer( + start_seq="MKTSTGNFKIVILMGVNRRMKTSTGNFKI", + models=[model1, model2], # List of trained models + ) + + # Generate and get proposals + proposer.propose() + + # Predict activity of proposed mutants + proposer.evaluate_proposals() + + # Save proposals to file + proposer.save_proposals("deep_mutational_scanning_proposals") + """ + + def propose(self) -> pd.DataFrame: + """ + Generate proposals for every possible substitution. + + Returns: + pd.DataFrame: DataFrame containing all possible single amino acid substitutions. + """ + muts = list(deep_mutational_scan(self.start_seq)) + # Filter out stop codons, which are represented by * + muts = [mut for mut in muts if mut[2] != "*"] + muts = [f"{mut[1]}{mut[0] + 1}{mut[2]}" for mut in muts] + + self.proposals = self.proposal_list_to_dataframe(muts) + + return self.proposals + + +class RandomMutagenesisProposer(BaseProposer): + """ + Proposer that generates random variants with a specified number of mutations. + + Attributes: + start_seq (str): The starting protein sequence. + models (list): List of models for evaluating proposed mutants. + trust_radius (int): Maximum number of mutations allowed in a variant. + num_seeds (int): Maximum number of sequences or evolutionary trajectories allowed. -1 for all combinations. + mutation_pool (list): List of possible mutations to propose from. + experiment_name (str): Name of the experiment run. + proposals (pd.DataFrame): DataFrame to store proposed mutations. + + Example Usage: + + # Initialize proposer with sequence and parameters + # Ignore: experiment_name + proposer = RandomMutagenesisProposer( + start_seq="MKTSTGNFKIVILMGVNRRMKTSTGNFKI", + models=[model1, model2], # List of trained models + trust_radius=2, # Maximum 2 mutations per variant + num_seeds=-1, # -1 for all combinations. + mutation_pool=["A1G", "D2E", "K3R"], # Allowed mutations + ) + + # Generate and get proposals + proposer.propose() + + # Predict activity of proposed mutants + proposer.evaluate_proposals() + + # Save proposals to file + proposer.save_proposals("random_mutagenesis_proposals") + """ + + def propose(self) -> pd.DataFrame: + """ + Generate random proposals with the specified number of mutations. + + Returns: + pd.DataFrame: DataFrame of random mutagenesis proposals. + """ + mutation_pool = self.mutation_pool + + # Generate variants based on trust_radius + if self.num_seeds == -1: + muts = combinations(mutation_pool, self.trust_radius) + else: + muts = [ + random.sample(mutation_pool, self.trust_radius) + for _ in range(self.num_seeds) + ] + + self.proposals = self.proposal_list_to_dataframe(muts) + + return self.proposals + + +class CombinatorialProposer(BaseProposer): + """ + Proposer that generates combinatorial proposals by combining mutations. + + Attributes: + start_seq (str): The starting protein sequence. + models (list): List of models for evaluating proposed mutants. + trust_radius (int): Maximum number of mutations allowed in a variant. + num_seeds (int): Maximum number of sequences or evolutionary trajectories allowed, -1 for all combinations. + mutation_pool (list): List of possible mutations to propose from. + experiment_name (str): Name of the experiment run. + proposals (pd.DataFrame): DataFrame to store proposed mutations. + + Example Usage: + + # Initialize proposer with sequence and parameters + # Ignore: experiment_name + proposer = CombinatorialProposer( + start_seq="MKTSTGNFKIVILMGVNRRMKTSTGNFKI", + models=[model1, model2], # List of trained models + trust_radius=2, # Maximum 2 mutations per variant + num_seeds=-1, # -1 for all combinations. + mutation_pool=["A1G", "D2E", "K3R"], # Allowed mutations + ) + + # Generate and get proposals + proposer.propose() + + # Predict activity of proposed mutants + proposer.evaluate_proposals() + + # Save proposals to file + proposer.save_proposals("combinatorial_proposals") + """ + + def propose(self, output_df=True) -> pd.DataFrame: + """ + Generate combinatorial proposals by combining mutations. + + Returns: + pd.DataFrame: DataFrame of combinatorial proposals, including the number of mutations for each proposal. + """ + + # Function to generate all possible combinations of mutations + def generate_permutations(mutations, num_positions): + positions = list(mutations.keys()) + all_combinations_ls = [] + + # Get all combinations of the given number of positions + for combo in combinations(positions, num_positions): + # Generate all permutations for the selected combination of positions + perms_ls = [permutation for permutation in product(*(mutations[pos] for pos in combo))] + all_combinations_ls.extend(perms_ls) + + return all_combinations_ls + + # Initialize an empty dictionary to store the mutations + mutations_dict = {} + + # Iterate over the list and populate the dictionary + for mutation in self.mutation_pool: + # Extract the position and mutation from the string + position = int(''.join(filter(str.isdigit, mutation))) + + # If the position is not in the dictionary, add it with an empty list + if position not in mutations_dict: + mutations_dict[position] = [] + + # Append the mutation to the list at the current position + mutations_dict[position].append(mutation) + + muts = [] + if self.num_seeds == -1: + # Create combinations for all sizes from 2 up to trust_radius + for r in range(2, self.trust_radius + 1): + muts.extend(generate_permutations(mutations_dict, r)) + else: + # Randomly sample num_seeds combinations for each size from 2 up to trust_radius + for r in range(2, self.trust_radius + 1): + muts.extend(random.sample(generate_permutations(mutations_dict, r), self.num_seeds)) + + self.proposals = self.proposal_list_to_dataframe(muts) + self.proposals['num_muts'] = [len(mut) for mut in muts] + + if output_df: + return self.proposals + + +######################################### +# Model-guided proposers: These proposer mechanisms iteratively propose mutations with guidance from a model. +# Examples include MCMC, simulated annealing, ICE, etc. + + +class ModelGuidedProposer(BaseProposer): + """ + A model-guided proposer that iteratively proposes mutations with guidance from a model. + Evaluations by the model are made throughout the proposal process. + Models can be data-driven or pre-trained. + + Attributes: + start_seq (str): The starting protein sequence. + models (list): List of models for final evaluation of proposals. + trust_radius (int): Maximum number of mutations allowed in a variant. + num_seeds (int): Maximum number of sequences or evolutionary trajectories allowed. + mutation_pool (list): List of possible mutations to propose from. + proposals (pd.DataFrame): DataFrame of proposed mutations and their evaluations. + guiding_model: The model used to evaluate variants during the proposal process. + experiment_name (str): Name of the experiment run. + """ + + def __init__( + self, + guiding_model, + start_seq, + experiment_name="model_guided_run", + models=None, + trust_radius=1, + num_seeds=10, + mutation_pool=None, + ): + """ + Initialize the ModelGuidedProposer. + + Args: + guiding_model: Model of class Regressor used to evaluate variants during the proposal process. + start_seq (str): Starting protein sequence. + experiment_name (str): Name of the experiment run. + models (list): List of models for final evaluation of proposals. + trust_radius (int): Maximum number of mutations allowed in a variant. + num_seeds (int): Maximum number of sequences or evolutionary trajectories allowed. + mutation_pool (list): List of possible mutations to propose from. If None, generates a full deep mutational scan including WT amino acids. + """ + if mutation_pool is None: + # Generate full mutation pool including WT amino acids for iterative proposers + mutation_pool = list(deep_mutational_scan(start_seq, exclude_noop=False)) + mutation_pool = [mut for mut in mutation_pool if mut[2] != "*"] + mutation_pool = [f"{mut[1]}{mut[0] + 1}{mut[2]}" for mut in mutation_pool] + self.mutation_pool = mutation_pool + elif mutation_pool is not None: + mutation_lists = MutationListFormats(mutation_pool, start_seq) + self.mutation_pool = mutation_lists.get_mutation_pool() + + super().__init__( + start_seq, + experiment_name, + [guiding_model], + trust_radius, + num_seeds, + self.mutation_pool, + ) + self.guiding_model = guiding_model + + +class SimulatedAnnealingProposer(ModelGuidedProposer): + """ + Propose new sequences using Simulated Annealing, a flavor of MCMC. + + Attributes: + start_seq (str): The starting protein sequence. + experiment_name (str): Name of the experiment run. + models (list): List of models for final evaluation of proposals. + trust_radius (int): Maximum number of mutations allowed in a variant. + num_seeds (int): Maximum number of sequences or evolutionary trajectories allowed. + mutation_pool (list): List of possible mutations to propose from. + proposals (pd.DataFrame): DataFrame of proposed mutations and their evaluations. + guiding_model: The model used to evaluate variants during the proposal process. + variant_seeds (list): List of sequences to seed the proposal process. + avg_muts_per_seq (int): Average number of mutations per sequence. + trajectories (int): Number of trajectories to run. + n_iter (int): Number of iterations for the simulated annealing process. + T_max (float): Maximum temperature for simulated annealing. + decay_rate (float): Temperature decay rate. + k (float): Annealing schedule parameter. + min_mut_pos (int): Minimum position to mutate. + max_mut_pos (int): Maximum position to mutate. + use_cache (bool): Whether to use cached fitness values. + n_jobs (int): Number of parallel jobs to run. + verbose (int): Verbosity level. + start_seq_ls (list): Starting sequence as a list. + wt_mutational_pool_dict (dict): Dictionary of wild-type mutations. + mutational_pool_dict (dict): Dictionary of all possible mutations. + acceptance_rate_history (list): History of acceptance rates. + best_fitness_values (list): History of best fitness values. + avg_fitness_values (list): History of average fitness values. + serial_corr_best (list): History of serial correlations for best fitness. + serial_corr_avg (list): History of serial correlations for average fitness. + """ + + def __init__( + self, + guiding_model: BaseRegressor, + start_seq, + trust_radius, + mutation_pool, + avg_muts_per_seq, + models=None, + num_seeds=10, + experiment_name="simulated_annealing_run", + variant_seeds=None, + n_iter=1000, + T_max=0.01, + decay_rate=0.99, + k=1, + min_mut_pos=0, + max_mut_pos=1e6, + use_cache=True, + n_jobs=1, + verbose=1, + + ): + """ + Initialize the SimulatedAnnealingProposer. + + Args: + guiding_model (BaseRegressor): The model used to evaluate variants during the proposal process. + start_seq (str): Starting sequence. + trust_radius (int): Maximum number of mutations allowed per variant. + mutation_pool (list): Pool of possible mutations. + avg_muts_per_seq (int): Average number of mutations per sequence. + models (list): List of models for final evaluation. + num_seeds (int): Maximum number of sequences or evolutionary trajectories allowed. + experiment_name (str): Name of the experiment. + variant_seeds (list): List of sequences to seed the proposal process. + n_iter (int): Number of iterations for the simulated annealing process. + T_max (float): Maximum temperature for simulated annealing. + decay_rate (float): Temperature decay rate. + k (float): Annealing schedule parameter. + min_mut_pos (int): Minimum position to mutate. + max_mut_pos (int): Maximum position to mutate. + use_cache (bool): Whether to use cached fitness values. + n_jobs (int): Number of parallel jobs to run. + verbose (int): Verbosity level. + """ + # If variant_seeds are provided, then update num_seeds to match + if variant_seeds: + num_seeds = len(variant_seeds) + super().__init__( + guiding_model, + start_seq, + experiment_name, + [guiding_model], + trust_radius, + num_seeds, + mutation_pool, + ) + self.variant_seeds = variant_seeds + self.avg_muts_per_seq = avg_muts_per_seq + self.trajectories = len(self.variant_seeds) + self.n_iter = n_iter + self.T_max = T_max + self.decay_rate = decay_rate + self.k = k + self.min_mut_pos = min_mut_pos + self.max_mut_pos = max_mut_pos + self.use_cache = use_cache + self.n_jobs = n_jobs + self.verbose = verbose + self.start_seq_ls = list(self.start_seq) + + # Double check to make sure mutations are within the min + max range + mutation_pool = self.mutation_pool + + filtered_mutation_pool = [] + for mut in mutation_pool: + idx = int(mut[1:-1]) - 1 + if min_mut_pos <= idx <= max_mut_pos: + filtered_mutation_pool.append(mut) + self.mutation_pool = filtered_mutation_pool # mutations should be 1-indexed + + # Create dictionaries from the mutational pool + self.wt_mutational_pool_dict = wt_only_mutational_pool_to_dict(self.mutation_pool, self.start_seq) + self.mutational_pool_dict = mutational_pool_to_dict(self.mutation_pool) + + def save_proposals(self): + """Save the proposals to a CSV file.""" + if self.proposals is None: + raise ValueError("No proposals have been made.") + else: + dir_path = os.path.join(self.models[0].file_attrs["dataset_dir"], "proposers/results/") + if not os.path.exists(dir_path): + os.makedirs(dir_path) + self.proposals.to_csv( + os.path.join(dir_path, f"{self.trust_radius}-{self.trajectories}-{self.n_iter}-{self.T_max}-{self.decay_rate}-{self.k}-{self.experiment_name}-proposals.csv"), index=False + ) + + def graph_annealing_history(self, seeds_to_plot=30): + """ + Generate graphs showing the annealing history. + + Args: + seeds_to_plot (int): Number of seeds to include in the fitness plot. + """ + fig, axs = plt.subplots(4, 1, figsize=(10, 20)) # Create a figure and a 4x1 grid of subplots + + # Plot histories + metrics = [ + (self.acceptance_rate_history, 'Acceptance Rate'), + (self.best_fitness_values, 'Best Fitness'), + (self.avg_fitness_values, 'Average Fitness') + ] + for i, (data, title) in enumerate(metrics): + axs[i].plot(data) + axs[i].set(title=f'{title} History', xlabel='Iteration', ylabel=title) + + # Plot fitness scores by seed + sns.set_theme(style="darkgrid") + for seed in self.proposals['Seed'].unique()[:seeds_to_plot]: + subset = self.proposals[self.proposals['Seed'] == seed] + axs[3].plot(subset['Iteration'], subset['Fitness'], label=f'Seed {seed}', marker='o') + axs[3].set(xlabel='Iteration', ylabel='Fitness', title='Fitness Scores by Seed Over Time') + + plt.tight_layout() # Adjust layout to not overlap + + dir_path = os.path.join(self.models[0].file_attrs["dataset_dir"], "proposers/graphs/") + if not os.path.exists(dir_path): + os.makedirs(dir_path) + + plt.savefig(os.path.join(dir_path, f"{self.trust_radius}-{self.trajectories}-{self.n_iter}-{self.T_max}-{self.decay_rate}-{self.k}-{self.experiment_name}-graphs.jpg"), dpi=600) + + def __acceptance_prob(self, f_proposal, f_current, i): + """ + Calculate the acceptance probability for the simulated annealing process. + + Args: + f_proposal (float): Fitness of the proposed sequence. + f_current (float): Fitness of the current sequence. + i (int): Current iteration. + + Returns: + float: Acceptance probability. + """ + current_temperature = self.T_max * self.decay_rate**i + ap = np.exp((f_proposal - f_current) / (self.k * current_temperature)) + ap[ap > 1] = 1 + return ap + + def __make_n_mutations(self, seq, n_edits, seq_mut_positions, backward=False): + """ + Make n mutations to a given sequence. + + Args: + seq (str): The sequence to mutate. + n_edits (int): Number of mutations to make. + seq_mut_positions (list): Current mutated positions in the sequence. + backward (bool): Whether to revert mutations or make new ones. + + Returns: + tuple: Mutated sequence and updated list of mutated positions. + """ + # Enforce trust radius part 2 + if not backward: + if len(seq_mut_positions) + n_edits > self.trust_radius: + n_edits = self.trust_radius - len(seq_mut_positions) + random_mutations = random.sample(self.mutation_pool, n_edits) + else: + random_wt_mutations = [] + random_pos_mutations = [] + # adjust n_edits to be less than the total number of mutations + if len(seq_mut_positions) - n_edits < 0: + n_edits = len(seq_mut_positions) + # randomly determine how many of the total edits will be to revert to wildtype + n_edits_wt = random.choice(range(0, n_edits+1)) + random_wt_mutations = random.sample(mut_pool_searcher(seq_mut_positions, self.wt_mutational_pool_dict), n_edits_wt) + if n_edits - n_edits_wt > 0: + random_pos_mutations = random.sample(mut_pool_searcher(seq_mut_positions, self.mutational_pool_dict), n_edits - n_edits_wt) + # combine the two lists + random_mutations = random_wt_mutations + random_pos_mutations + + lseq = list(seq) + pos_ls = seq_mut_positions.copy() + + for mut in random_mutations: + idx = int(mut[1:-1]) - 1 # adjust for 1-index based residue positioning + lseq[idx] = mut[-1] + # Remove mutation from position list if mutating back to wildtype + if mut[-1] == self.start_seq_ls[idx]: + if (idx+1) in pos_ls: + pos_ls.remove(idx+1) # account for 1-index based residue positioning + else: + if (idx+1) not in pos_ls: + pos_ls.append(idx+1) # account for 1-index based residue positioning + + mutated_seq = ''.join(lseq) + + return mutated_seq, pos_ls + + def __propose_seqs(self, seqs, seqs_mut_positions): + """ + Propose new sequences based on the current sequences. + + Args: + seqs (list): Current sequences. + seqs_mut_positions (list): Current mutated positions for each sequence. + + Returns: + tuple: Proposed sequences and their mutated positions. + """ + mu_muts_per_seq = np.array([self.avg_muts_per_seq] * len(seqs)) + n_edits = np.random.poisson(mu_muts_per_seq - 1) + 1 + + # Enforce trust radius part 1 (by limiting the mutational pool to sample from) + nmut = np.array([len(pos_ls) for pos_ls in seqs_mut_positions]) + mut_mask = nmut >= self.trust_radius # if number of mutations is greater than or equal to maximum allowed, then edit walk direction + + results = Parallel(n_jobs=self.n_jobs)( + delayed(self.__make_n_mutations)( + seq, + n_edits[i], + seqs_mut_positions[i], + backward=mut_mask[i] + ) + for i, seq in enumerate(seqs) + ) + + mseqs, mpositions = zip(*results) + + return mseqs, mpositions + + def __get_fitness_fn(self, seqs, seqs_mut_positions): + """ + Calculate fitness for the given sequences. + + Args: + seqs (list): Sequences to evaluate. + seqs_mut_positions (list): Mutated positions for each sequence. + + Returns: + tuple: Predicted fitness, uncertainties, and original predictions. + """ + y_pred = self.guiding_model.predict(seqs) + y_pred_original = y_pred.copy() + + if isinstance(self.guiding_model, GPRegressor): + uncertainties = self.guiding_model.uncertainties_ + else: + uncertainties = np.zeros(y_pred.shape) + + # Enforce trust radius part 3 + nmut = np.array([len(pos_ls) for pos_ls in seqs_mut_positions]) + mut_mask = nmut > self.trust_radius # if number of mutations is greater than maximum allowed, then prevent accepting the change + y_pred[mut_mask] = -np.inf + + return y_pred, uncertainties, y_pred_original + + def save_best_proposals(self, num_vars_per_mut_dist=6, min_mut_distance=2): + """ + Save the best proposals, filtered by mutation distance. + + Args: + num_vars_per_mut_dist (int): Number of variants to save per mutation distance. + min_mut_distance (int): Minimum mutation distance to consider. + """ + if self.proposals is None: + raise ValueError("No proposals have been made.") + else: + dir_path = os.path.join(self.models[0].file_attrs["dataset_dir"], "proposers/designs/") + if not os.path.exists(dir_path): + os.makedirs(dir_path) + + df_dedup = self.proposals.drop_duplicates('Full_Sequence').copy() + df_dedup.sort_values(by='Fitness',ascending=False, inplace=True) + sequences = df_dedup['Full_Sequence'].tolist() + + num_mutations_seed = list(levenshtein_distance_matrix([self.start_seq], sequences).reshape(-1).astype(int)) + df_dedup['dist_from_start_seq'] = num_mutations_seed + + df_ls = [] + for num in list(set(num_mutations_seed)): + if num >= min_mut_distance: + df_current = df_dedup[df_dedup['dist_from_start_seq'] == num].copy() + df_current.sort_values(by='Fitness',ascending=False, inplace=True) + df_current = df_current[:num_vars_per_mut_dist] + df_ls.append(df_current) + + df_top = pd.concat(df_ls) + + df_top.to_csv( + os.path.join(dir_path, f"{self.trust_radius}-{self.trajectories}-{self.n_iter}-{self.T_max}-{self.decay_rate}-{self.k}-{self.experiment_name}-top_proposals.csv"), index=False + ) + + + def propose(self) -> pd.DataFrame: + # [TODO] implement maximum mutation distance from WT + """ + 1. Start with a set of sequence *seeds*, which can either be user-input or + generated from the WT sequence and mutation pool. + 2. For each seed, iteratively run simulated annealing. + 2a. Propose a mutation + 2b. Evaluate fitness + 2c. Accept or reject, and update the acceptance probability given the current temperature. + 3. Repeat 2a-2c until the stopping criteria is met. + 4. Return the seeds, the proposed mutations, and the fitness of the proposed mutations in a dataframe. + + Returns: + pd.DataFrame: DataFrame containing the proposed sequences and their properties. + """ + # [TODO] implement maximum mutation distance from WT + if self.verbose: + print("Initializing") + + # 1. Get seeds. If none are provided, generate single variants from the WT sequence and mutation pool. + if self.variant_seeds is None: + if self.verbose: + print("Generating seeds since none were provided.") + random_proposer = RandomMutagenesisProposer( + start_seq=self.start_seq, + trust_radius=1, + num_seeds=self.num_seeds, + mutation_pool=self.mutation_pool, + ) + random_proposals = random_proposer.propose() + self.variant_seeds = random_proposals["Full_Sequence"].values + + # 1b. Evaluate fitness of seeds + state_seqs = copy.deepcopy(self.variant_seeds) + state_seqs_mut_positions = [[] for _ in range(len(self.variant_seeds))] + state_fitness, state_fitness_std, __ = self.__get_fitness_fn(self.variant_seeds, state_seqs_mut_positions) + seq_history = [copy.deepcopy(state_seqs)] + fitness_history = [copy.deepcopy(state_fitness)] + fitness_std_history = [copy.deepcopy(state_fitness_std)] + + # Initialize monitoring variables + self.acceptance_rate_history = [] + self.best_fitness_values = [] + self.avg_fitness_values = [] + self.serial_corr_best = [] + self.serial_corr_avg = [] + + # 2. Iteratively run simulated annealing + for i in range(self.n_iter): + if self.verbose: + print(f"Iteration: {i}") + + if self.verbose: + print("\tProposing sequences.") + proposal_seqs, proposal_seqs_mut_pos = self.__propose_seqs(state_seqs, state_seqs_mut_positions) + + if self.verbose: + print("\tCalculating predicted fitness.") + proposal_fitness, proposal_fitness_std, proposal_fitness_original = self.__get_fitness_fn( + proposal_seqs, proposal_seqs_mut_pos + ) + + if self.verbose: + print("\tMaking acceptance/rejection decisions.") + aprob = self.__acceptance_prob(proposal_fitness, state_fitness, i) + + # Monitor simulated annealing + self.accepted_proposals = 0 + + if self.verbose: + print("\tUpdating state.") + for j, ap in enumerate(aprob): + if np.random.rand() < ap: + state_seqs[j] = copy.deepcopy(proposal_seqs[j]) + state_seqs_mut_positions[j] = copy.deepcopy(proposal_seqs_mut_pos[j]) + state_fitness[j] = copy.deepcopy(proposal_fitness[j]) + state_fitness_std[j] = copy.deepcopy(proposal_fitness_std[j]) + self.accepted_proposals += 1 + + # Update monitoring variables + acceptance_rate = round(self.accepted_proposals/len(state_seqs)*100, 2) + self.acceptance_rate_history.append(acceptance_rate) + + self.best_fitness_values.append(proposal_fitness_original.max()) + self.avg_fitness_values.append(proposal_fitness_original.mean()) + if i > 0: + best_fitness_array = np.array(self.best_fitness_values) + avg_fitness_array = np.array(self.avg_fitness_values) + serial_correlation_best = np.corrcoef(best_fitness_array[:-1], best_fitness_array[1:])[0, 1] + serial_correlation_avg = np.corrcoef(avg_fitness_array[:-1], avg_fitness_array[1:])[0, 1] + self.serial_corr_best.append(serial_correlation_best) + self.serial_corr_avg.append(serial_correlation_avg) + + + seq_history.append(copy.deepcopy(state_seqs)) + fitness_history.append(copy.deepcopy(state_fitness)) + fitness_std_history.append(copy.deepcopy(state_fitness_std)) + + if self.verbose: + print(f'\tCurrent best fitness: {state_fitness.max()}') + print(f"Acceptance Rate: {acceptance_rate}") + + + # 3. Save results to pd.DataFrame and then csv + + # Label each row with the sequence, seed number, iteration number, fitness score, fitness std, mutation string, and number of mutations + data = [ + [seq, j, i, fitness_history[i][j][0], fitness_std_history[i][j][0]] + for i, seqs in enumerate(seq_history) + for j, seq in enumerate(seqs) + ] + + df = pd.DataFrame( + data, + columns=["Full_Sequence", "Seed", "Iteration", "Fitness", "Fitness_Std"], + ) + + self.proposals = df \ No newline at end of file diff --git a/model/splitters/__init__.py b/model/splitters/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..b6c0960c8258b01fc3909b32a3b71de3d960d6a5 --- /dev/null +++ b/model/splitters/__init__.py @@ -0,0 +1 @@ +from model.splitters.base_splitters import * \ No newline at end of file diff --git a/model/splitters/base_splitters.py b/model/splitters/base_splitters.py new file mode 100644 index 0000000000000000000000000000000000000000..d5e692c59c1415bcbd7cf51feda8cc48f78b4449 --- /dev/null +++ b/model/splitters/base_splitters.py @@ -0,0 +1,1071 @@ +import random +import pandas as pd +from abc import ABC, abstractmethod +from Bio import SeqIO, PDB +from sklearn.preprocessing import MinMaxScaler +import numpy as np +import pickle +import copy +import shutil + +import os +import sys +root_folder = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) + +from model.utils.other_utils import aa_dict_3to1 +from model.utils.data_utils import find_mutation_positions_multithreaded, MutationFormat + +class BaseSplitter(ABC): + """Abstract base class for splitters.""" + + """ + Attributes: + wt_seq (str): Wild-type sequence of the protein. + use_cache (bool): Flag to determine if caching should be used. + random_state (int): Random state for reproducibility. + data (pd.DataFrame): DataFrame containing the protein data. + file_attrs (dict): Dictionary containing file attributes and paths. + + Example Usage: + + splitter = BaseSplitter(training_dataset_fname, + wt_file, + csv_has_header=True, # Whether input CSV has a header row (default: True) + use_cache=True # Whether to cache split results (default: True) + ) + splitter.split_data() + """ + + def __init__(self, name, data, wt_file, csv_has_header=False, use_cache=False, + random_state=42, type='biomolecules', + **kwargs): + """ + Args: + - name (str): Name of the biomolecule. + - data (str or pd.DataFrame): Accepts a table of data, containing two columns: one for sequences (for multi-chain proteins, colon-separated sequences) and the second one for the labels. + - wt_file (str or list): File path(s) to wild-type sequence of protein of interest in FASTA format. + - csv_has_header (bool): Flag to modify if your data has headers (True) or does not (False). + - use_cache (bool): Flag to use cache. + - random_state (int): Random state for reproducibility. + - type (str): Type of biomolecule. + - **kwargs: Additional keyword arguments. + """ + + self.wt_seq_lens = [] + self.wt_seqs = [] + if isinstance(wt_file, str): + self.wt_seq_lens.append(len(str(SeqIO.read(wt_file, "fasta").seq))) + self.wt_seqs.append(str(SeqIO.read(wt_file, "fasta").seq)) + elif isinstance(wt_file, list): + for file in wt_file: + self.wt_seq_lens.append(len(str(SeqIO.read(file, "fasta").seq))) + self.wt_seqs.append(str(SeqIO.read(file, "fasta").seq)) + self.wt_seq = ''.join(self.wt_seqs) + self.use_cache = use_cache + self.random_state = random_state + + # If the data is a CSV file + if isinstance(data, str) and data.endswith('.csv'): + self.data = pd.read_csv(data, header=0 if csv_has_header else None) + # Rename columns for consistency + self.data.rename(columns={self.data.columns[0]: 0, self.data.columns[1]: 1}, inplace=True) + dataset_name = os.path.splitext(os.path.basename(data))[0] + dataset_file = os.path.join(root_folder, type, name, dataset_name + '.csv') + elif isinstance(data, pd.DataFrame): # If the data is already a DataFrame + self.data = data.copy() + # Ensure column names are standardized + self.data.rename(columns={self.data.columns[0]: 0, self.data.columns[1]: 1}, inplace=True) + dataset_name = 'dataframe_input' + dataset_file = os.path.join(root_folder, type, name, dataset_name + '.csv') + else: + raise ValueError("Invalid data format: data must be a file path to a CSV or a DataFrame.") + + # Define file attributes and split directory + self.file_attrs = { + 'dataset_file': dataset_file, + 'dataset_name': dataset_name, + 'dataset_dir': os.path.join(root_folder, type, name), + 'split_dir': os.path.join(root_folder, type, name, 'split_cache', dataset_name) + } + + # Create cache directory if needed + if self.use_cache: + os.makedirs(self.file_attrs['split_dir'], exist_ok=True) + + # copy dataset file to new location + if not os.path.exists(self.file_attrs['dataset_file']): + os.makedirs(os.path.dirname(self.file_attrs['dataset_file']), exist_ok=True) + + if isinstance(data, str): # data is a file path + shutil.copy(data, self.file_attrs['dataset_file']) + else: # data is a DataFrame + data.to_csv(self.file_attrs['dataset_file'], index=False) + +# Note: For new classes on top of ProteinSplitter, all unique args for split_data() should be used for generate split_type attribute for proper cache storage + +class ProteinSplitter(BaseSplitter): + """Class for splitting protein datasets.""" + + """ + Attributes: + y_scaling (str): String indicating whether y values are scaled or not. + val_split (float): Fraction of data for validation set. + file_attrs (dict): Dictionary containing file attributes and paths. + base_splitter_path (str): Path to the base splitter pickle file. + splits (dict): Dictionary to store the data splits. + + Example Usage: + + splitter = ProteinSplitter(training_dataset_fname, + wt_file, + csv_has_header=True, # Whether input CSV has a header row + use_cache=True, # Whether to cache results to disk + y_scaling=True, # Whether to scale y values to [0,1] + val_split=None # Fraction of data for validation (None=no validation split) + ) + splitter.split_data() + """ + + def __init__(self, protein_name, data, wt_file, csv_has_header=False, use_cache=False, + random_state=42, + y_scaling=False, + val_split=None, + **kwargs): + """ + Args: + - protein_name (str): Name of the protein. + - data (str or pd.DataFrame): Accepts a table of data, containing two columns: one for sequences and the second one for the labels. + - wt_file (str or list): File path(s) to wild-type sequence of protein of interest in FASTA format. + - csv_has_header (bool): Flag to modify if your data has headers (True) or does not (False). + - use_cache (bool): Flag to use cache. + - y_scaling (bool): Flag to scale y values. + - val_split (float): Fraction of data to partition into the validation set. + - random_state (int): Random state for reproducibility. + - **kwargs: Additional keyword arguments. + """ + + super().__init__(protein_name, data, wt_file, csv_has_header=csv_has_header, use_cache=use_cache, + random_state=random_state, type='proteins', + **kwargs) + + # Define base protein splitter path + if y_scaling == False: + self.y_scaling = "y_unscaled" + else: + self.y_scaling = "y_scaled" + + self.val_split = val_split + self.kfold_splits = False + + self.file_attrs['base_splitter_path'] = os.path.join(self.file_attrs['split_dir'], "base_splitter" + '_' + self.y_scaling + ".pkl") + + # Load existing base protein splitter or create a new one + if self.use_cache and os.path.exists(self.file_attrs['base_splitter_path']): + self.data = pd.read_pickle(self.file_attrs['base_splitter_path']) + + # Create base protein splitter if not found and save is use_cache is True + else: + + if len(self.wt_seq_lens) > 1: + # check MutationFormat of column 0 + if MutationFormat(self.data[0].iloc[0].split(':')[0], self.wt_seq).format == 'Mutation String': + self.data[0] = self.data[0].apply(lambda x: self._shift_mutation_position(x, self.wt_seq_lens, 'Mutation String')) + elif MutationFormat(self.data[0].iloc[0].split(':')[0], self.wt_seq).format == 'Mutation List': + self.data[0] = self.data[0].apply(lambda x: self._shift_mutation_position(x, self.wt_seq_lens, 'Mutation List')) + elif MutationFormat(self.data[0].iloc[0].split(':')[0], self.wt_seq).format == 'Full Sequence': + self.data[0] = self.data[0].apply(lambda x: ''.join(x.split(':'))) + else: + raise ValueError('Mutation format not recognized') + + self.data[0] = self.data[0].apply(lambda x: MutationFormat(x, self.wt_seq).to_full_sequence()) + mut_positions = find_mutation_positions_multithreaded(self.wt_seq, self.data[0].tolist()) + self.data['mut_positions'] = mut_positions + self.data['muts'] = self.data[0].apply(lambda x: MutationFormat(x, self.wt_seq).to_mutation_string()) + self.data['mut_load'] = self.data['mut_positions'].apply(lambda x: len(x)) + + if y_scaling == True: + scaler = MinMaxScaler() + scaled_data = scaler.fit_transform(np.array(self.data[1]).reshape(-1, 1)) + self.data[1] = scaled_data + + # save as pickle file + if self.use_cache: + self.data.to_pickle(self.file_attrs['base_splitter_path']) + + def _shift_mutation_position(self, inputs, lengths, type): + # inputs is a list of mutation strings or mutation lists + # goal is to return a combined mutation string/mutation list + inputs = inputs.split(':') + lengths = [sum(lengths[:i+1]) for i in range(len(lengths))] + new_inputs = [] + # Process first input differently based on type + if type == 'Mutation String': + new_inputs.extend(inputs[0].split('/')) + + # Process remaining inputs + for i in range(1, len(inputs)): + mutations = inputs[i].split('/') if type == 'Mutation String' else inputs[i] + for mut in mutations: + if mut == 'WT': + break + else: + mut_pos = mut[1:-1] + mut_pos = str(int(mut_pos) + lengths[i-1]) + mut = mut[0] + mut_pos + mut[-1] + new_inputs.append(mut) + + if len(new_inputs) > 1 and "WT" in new_inputs: + new_inputs.remove("WT") + + return '/'.join(new_inputs) + + def split_data(self, iter=None): + """ + Splits data into training and test sets. + Data split into the test set is given a group label of 1, + while data split into the training set is given a group label of 0. + + Args: + - iter (int, optional): Iteration number for naming the split file. + """ + + self.split_type = 'base' + + raise NotImplementedError("This method should be implemented by the subclass.") + + def _save_splits(self, iter=None): + """ + Save splits for specific split type. + + Args: + - iter (int, optional): Iteration number for naming the split file. + """ + + test_size = self.data['group'].sum() / len(self.data) + + # 0 for train, 1 for test, 2 for val + + if self.val_split is not None: + + if self.kfold_splits == True: + pass + else: + # Separate train set into train and val sets + rows_with_marker_0 = self.data[self.data['group'] == 0] + num_to_sample = int(len(rows_with_marker_0) * self.val_split) + sampled_indices = rows_with_marker_0.sample(n=num_to_sample).index + self.data.loc[sampled_indices, 'group'] = 2 + + X_train = self.data[self.data['group'] == 0][0].values + X_val = self.data[self.data['group'] == 2][0].values + X_test = self.data[self.data['group'] == 1][0].values + y_train = self.data[self.data['group'] == 0][1].values + y_val = self.data[self.data['group'] == 2][1].values + y_test = self.data[self.data['group'] == 1][1].values + + train_size = len(X_train) / len(self.data) + val_size = len(X_val) / len(self.data) + + # return splits + # initialize dictionary to store splits + self.splits = {'X_train': X_train, 'X_val': X_val, 'X_test': X_test, 'y_train': y_train, 'y_val': y_val, 'y_test': y_test} + + + # check if iter is none: + if iter is None: + split_name = f'split_by_{self.split_type}_{int(train_size*100)}-{int(val_size*100)}-{int(test_size*100)}-{self.y_scaling}' + else: + split_name = f'split_by_{self.split_type}_{int(train_size*100)}-{int(val_size*100)}-{int(test_size*100)}-{self.y_scaling}_iter{iter}' + + else: + X_train = self.data[self.data['group'] == 0][0].values + X_test = self.data[self.data['group'] == 1][0].values + y_train = self.data[self.data['group'] == 0][1].values + y_test = self.data[self.data['group'] == 1][1].values + + # initialize dictionary to store splits + self.splits = {'X_train': X_train, 'X_test': X_test, 'y_train': y_train, 'y_test': y_test} + + # check if iter is none: + if iter is None: + split_name = f'split_by_{self.split_type}_{int((1-test_size)*100)}-{int(test_size*100)}-{self.y_scaling}' + else: + split_name = f'split_by_{self.split_type}_{int((1-test_size)*100)}-{int(test_size*100)}-{self.y_scaling}_iter{iter}' + + # Save split or load split if it already exists to prevent overwriting + self.splits['split_name'] = split_name + + file_name = os.path.join(self.file_attrs['split_dir'], split_name + ".pkl") + + if self.use_cache: + if not os.path.exists(file_name): + with open(file_name, 'wb') as file: + print("Split saved.") + pickle.dump(self.splits, file) + + else: + with open(file_name, 'rb') as file: + print("Split already exists. Generated splits not saved. Loading pre-existing split.") + self.splits = pickle.load(file) + + def _assign_folds(self, k_folds): + """ + Assigns fold labels to the data for K-Fold cross-validation if there is a validation split. + + Args: + - k_folds (int): Number of folds. + """ + + if self.random_state is not None: + np.random.seed(self.random_state) + + # initialize fold columns + self.data['fold'] = None + + # get indices of rows designated for training/validation + train_indices = self.data[self.data['group'] == 0].index + + # Shuffle the indices + shuffled_indices = np.random.permutation(train_indices) + + # Determine the number of points per fold + fold_sizes = [len(shuffled_indices) // k_folds] * k_folds + for i in range(len(shuffled_indices) % k_folds): + fold_sizes[i] += 1 + + # Assign fold labels + groups = np.zeros(len(self.data), dtype=int) + current_idx = 0 + for fold_idx, fold_size in enumerate(fold_sizes): + for i in range(current_idx, current_idx + fold_size): + self.data.loc[shuffled_indices[i], 'fold'] = fold_idx + current_idx += fold_size + + def _save_folds(self,k_folds): + + # assert at least 2 folds or code breaks + assert k_folds >= 2, "At least 2 folds are required" + + # mark object as having kfold splits + self.kfold_splits = True + self._assign_folds(k_folds=k_folds) + + folds = [] + for fold_num in range(k_folds): + + # Create a deep copy of self and add it to folds + fold_copy = copy.deepcopy(self) + + # Assign fold num to validation set if match fold num, otherwise keep in train or test + fold_copy.data['group'] = np.where( + fold_copy.data['fold'] == fold_num, 2, fold_copy.data['group'] + ) + + fold_copy._save_splits(iter=fold_num) + folds.append(fold_copy) + + self.folds = folds + + def load_splits(self, file_path): + """ + Loads the split from a pickle file. + + Args: + - file_path (str): Path to the pickle file containing the splits. + """ + with open(file_path, 'rb') as file: + self.splits = pickle.load(file) + +class KFoldProteinSplitter(ProteinSplitter): + """ + Class for K-Fold splitting of protein datasets. + + Attributes: + data (pd.DataFrame): The protein dataset. + random_state (int): Random seed for reproducibility. + splits (dict): Dictionary to store the data splits. + split_type (str): Type of split being performed. + file_attrs (dict): Dictionary containing file attributes. + use_cache (bool): Whether to use cached splits. + y_scaling (str): Method for scaling y values. + val_split (float): Fraction of data to use for validation. + + Example Usage: + + splitter = KFoldProteinSplitter(training_dataset_fname, + wt_file, + csv_has_header=True, # Whether input CSV has a header row + use_cache=True, # Whether to cache results to disk + y_scaling=True, # Whether to scale y values to [0,1] + val_split=None # Fraction of data for validation (None=no validation split) + ) + splitter.split_data(5) # Performs a 5-Fold split for 5-Fold cross-validation + splits = splitter.generate_splits() # Returns a list of 5 splitter objects, one for each fold + """ + + def _assign_folds(self, n_splits): + """ + Assigns fold labels to the data for K-Fold cross-validation. + + Args: + - n_splits (int): Number of folds. + """ + + if self.random_state is not None: + np.random.seed(self.random_state) + + # Shuffle the DataFrame indices + shuffled_indices = np.random.permutation(self.data.index) + + # Determine the number of points per fold + fold_sizes = [len(shuffled_indices) // n_splits] * n_splits + for i in range(len(shuffled_indices) % n_splits): + fold_sizes[i] += 1 + + # Assign fold labels + groups = np.zeros(len(self.data), dtype=int) + current_idx = 0 + for fold_idx, fold_size in enumerate(fold_sizes): + for i in range(current_idx, current_idx + fold_size): + groups[shuffled_indices[i]] = fold_idx + current_idx += fold_size + + # Add 'group' column to the DataFrame + self.data['fold'] = groups + + def _split_data(self, fold_number): + """ + Splits data into training and test sets based on the specified fold number. + + Args: + - fold_number (int): Fold number to include in the test set. + """ + + self.data['group'] = np.where( + self.data['fold'] == fold_number, 1, 0 + ) + + # Save splits + self.split_type = f'kfold-{fold_number}' + self._save_splits() + + def generate_splits(self, n_splits): + + self._assign_folds(n_splits=n_splits) + + splits = [] + for fold_num in range(n_splits): + self._split_data(fold_number=fold_num) + # Create a deep copy of self and add it to splits + split_copy = copy.deepcopy(self) + splits.append(split_copy) + + return splits + +class RoundProteinSplitter(ProteinSplitter): + """ + Class for splitting protein datasets based on round number. + + Attributes: + data (pd.DataFrame): The protein dataset. + random_state (int): Random seed for reproducibility. + splits (dict): Dictionary to store the data splits. + split_type (str): Type of split being performed. + file_attrs (dict): Dictionary containing file attributes. + use_cache (bool): Whether to use cached splits. + y_scaling (str): Method for scaling y values. + val_split (float): Fraction of data to use for validation. + + Example Usage: + + splitter = RoundProteinSplitter(training_dataset_fname, + wt_file, + csv_has_header=True, # Whether input CSV has a header row + use_cache=True, # Whether to cache results to disk + y_scaling=True, # Whether to scale y values to [0,1] + val_split=None # Fraction of data for validation (None=no validation split) + ) + splitter.split_data(1, 3) # Splits data such that all data from round 1 and 2 are in the training set, and all data from round 3 and above are in the test set + """ + + def split_data(self, max_train_round, min_test_round, iter=None, k_folds=None): + """ + Splits data into training and test sets based on round number. + + Args: + - max_train_round (int): Maximum round number to include in the training set. + - min_test_round (int): Minimum round number to include in the test set. + - iter (int, optional): Iteration number for naming the split file. + - k_folds (int, optional): Number of folds to generate. + """ + assert 'round' in self.data.columns, "DataFrame must contain a 'round' column" + assert max_train_round < min_test_round, "Maximum training round must be less than minimum test round" + + self.data['group'] = np.where( + self.data['round'] <= max_train_round, 0, + np.where( + self.data['round'] >= min_test_round, 1, np.nan + ) + ) + + # Save splits + self.split_type = f'round-{max_train_round}-{min_test_round}' + + if k_folds is not None: + if self.val_split is not None: + self._save_folds(k_folds=k_folds) + elif self.val_split is None: + print("No validation split, cannot generate kfolds") + return + + else: + + if iter is None: + self._save_splits() + else: + self._save_splits(iter=iter) + +class RandomProteinSplitter(ProteinSplitter): + """ + Class for splitting protein datasets randomly. + + Attributes: + data (pd.DataFrame): The protein dataset. + random_state (int): Random seed for reproducibility. + splits (dict): Dictionary to store the data splits. + split_type (str): Type of split being performed. + file_attrs (dict): Dictionary containing file attributes. + use_cache (bool): Whether to use cached splits. + y_scaling (str): Method for scaling y values. + val_split (float): Fraction of data to use for validation. + + Example Usage: + + splitter = RandomProteinSplitter(training_dataset_fname, + wt_file, + csv_has_header=True, # Whether input CSV has a header row + use_cache=True, # Whether to cache results to disk + y_scaling=True, # Whether to scale y values to [0,1] + val_split=None # Fraction of data for validation (None=no validation split) + ) + splitter.split_data(test_size=0.2) # Splits data into 80% training and 20% test sets + """ + + def split_data(self, test_size=0.2, iter=None, k_folds=None): + """ + Splits data into training and test sets randomly. + + Args: + - test_size (float): Fraction of data to partition into the test set. + - iter (int, optional): Iteration number for naming the split file. + - k_folds (int, optional): Number of folds to generate. + """ + random.seed(self.random_state) # Add this line + test_len = int(test_size * len(self.data)) + test_indices = random.sample(range(len(self.data)), test_len) + self.data['group'] = 0 + self.data.loc[test_indices, 'group'] = 1 + + # Save splits + self.split_type = 'random' + + if k_folds is not None: + if self.val_split is not None: + self._save_folds(k_folds=k_folds) + elif self.val_split is None: + print("No validation split, cannot generate kfolds") + return + + else: + + if iter is None: + self._save_splits() + else: + self._save_splits(iter=iter) + +class PositionProteinSplitter(ProteinSplitter): + """ + Class for splitting protein datasets based on mutation positions. + + Attributes: + data (pd.DataFrame): The protein dataset. + random_state (int): Random seed for reproducibility. + splits (dict): Dictionary to store the data splits. + split_type (str): Type of split being performed. + file_attrs (dict): Dictionary containing file attributes. + use_cache (bool): Whether to use cached splits. + y_scaling (str): Method for scaling y values. + val_split (float): Fraction of data to use for validation. + + Example Usage: + + splitter = PositionProteinSplitter(training_dataset_fname, + wt_file, + csv_has_header=True, # Whether input CSV has a header row + use_cache=True, # Whether to cache results to disk + y_scaling=True, # Whether to scale y values to [0,1] + val_split=None # Fraction of data for validation (None=no validation split) + ) + # Splits data into training and test sets based on mutation positions: + # 1. Randomly samples test_size_sample fraction of variants to get mutation positions to exclude + # 2. Any variant containing those positions goes into test set + # 3. Repeats sampling up to iter times until test set size is between test_size_min and test_size_max + # 4. If test set size requirements not met after iter attempts, uses best attempt + + splitter.split_data(test_size_sample=0.2, iter=3, test_size_min=0.2, test_size_max=0.3) + """ + + def split_data(self, test_size_sample, sample_iter=3, test_size_min=0.2, test_size_max=0.3, iter=None, k_folds=None): + """ + Splits the dataset into training and test sets based on mutation positions occupied in each variant. + + Args: + - test_size_sample (float): Fraction to sample to retrieve mutation positions to exclude out of the training set. + - sample_iter (int): Number of sampling iterations. + - test_size_min (float): Minimum test size set desired. + - test_size_max (float): Maximum test size set allowed. + - iter (int, optional): Iteration number for naming the split file. + - k_folds (int, optional): Number of folds to generate. + """ + + def are_any_elements_present(row): + return 1 if any(element in test_positions for element in row['mut_positions']) else 0 + + i = 0 + test_size = test_size_sample + random.seed(self.random_state) + while not (test_size_min < test_size < test_size_max) and i < sample_iter: + i += 1 + positions = [sublist for sublist in self.data['mut_positions'].values] + test_len = int(test_size_sample * len(positions)) + test_positions_ls = random.sample(positions, test_len) + test_positions = [item for sublist in test_positions_ls for item in sublist] + self.data['group'] = self.data.apply(are_any_elements_present, axis=1) + test_size = self.data['group'].sum() / len(self.data) + + if (test_size_min < test_size < test_size_max): + print(f'Test set size ({round(test_size,2)}) passes the recommended requirements (i.e. between {test_size_min} and {test_size_max}).') + elif test_size < test_size_min: + print(f'Test set size ({round(test_size,2)}) is lower than the recommended minimum size ({test_size_min}). If necessary, rerun with the same or higher test set sample size.') + elif test_size > test_size_max: + print(f'Test set size ({round(test_size,2)}) is higher than the recommended maximum size ({test_size_max}). If necessary, rerun with the same or lower test set sample size.') + + # Save splits + self.split_type = 'position' + + if k_folds is not None: + if self.val_split is not None: + self._save_folds(k_folds=k_folds) + elif self.val_split is None: + print("No validation split, cannot generate kfolds") + return + + else: + + if iter is None: + self._save_splits() + else: + self._save_splits(iter=iter) + + +class RegionProteinSplitter(ProteinSplitter): + """ + Class for splitting protein datasets based on mutation positions. + + Attributes: + data (pd.DataFrame): The protein dataset. + random_state (int): Random seed for reproducibility. + splits (dict): Dictionary to store the data splits. + split_type (str): Type of split being performed. + file_attrs (dict): Dictionary containing file attributes. + use_cache (bool): Whether to use cached splits. + y_scaling (str): Method for scaling y values. + val_split (float): Fraction of data to use for validation. + + Example Usage: + + splitter = RegionProteinSplitter(training_dataset_fname, + wt_file, + csv_has_header=True, # Whether input CSV has a header row + use_cache=True, # Whether to cache results to disk + y_scaling=True, # Whether to scale y values to [0,1] + val_split=None # Fraction of data for validation (None=no validation split) + ) + splitter.split_data(region=[1, 60]) # Splits data such that all variants containing mutations in the first 60 positions are in the test set + """ + + def split_data(self, region, iter=None, k_folds=None): + """ + Exclude a region or domain of a protein into the test set, the remaining regions are placed into the test set. + + Args: + - region (list): Provided as a 2-number list defining the boundaries of the region to exclude (e.g. [1, 60]). + - iter (int, optional): Iteration number for naming the split file. + - k_folds (int, optional): Number of folds to generate. + """ + + region_i = region[0] + region_f = region[1] + + def are_any_mutations_present(row): + return 1 if any(element in range(region_i, region_f + 1, 1) for element in row['mut_positions']) else 0 + + self.data['group'] = self.data.apply(are_any_mutations_present, axis=1) + + # Save splits + self.split_type = f'region_{region[0]}-{region[1]}' + + if k_folds is not None: + if self.val_split is not None: + self._save_folds(k_folds=k_folds) + elif self.val_split is None: + print("No validation split, cannot generate kfolds") + return + + else: + if iter is None: + self._save_splits() + else: + self._save_splits(iter=iter) + +class PropertyProteinSplitter(ProteinSplitter): + """ + Class for splitting protein datasets by value. + + Attributes: + data (pd.DataFrame): The protein dataset. + random_state (int): Random seed for reproducibility. + splits (dict): Dictionary to store the data splits. + split_type (str): Type of split being performed. + file_attrs (dict): Dictionary containing file attributes. + use_cache (bool): Whether to use cached splits. + y_scaling (str): Method for scaling y values. + val_split (float): Fraction of data to use for validation. + + Example Usage: + + splitter = PropertyProteinSplitter(training_dataset_fname, + wt_file, + csv_has_header=True, # Whether input CSV has a header row + use_cache=True, # Whether to cache results to disk + y_scaling=True, # Whether to scale y values to [0,1] + val_split=None # Fraction of data for validation (None=no validation split) + ) + splitter.split_data( + property=0.5, # Value to split on (e.g. 0.5 for median split) + above_or_below='above' # 'above': variants with y > property in test set + # 'below': variants with y < property in test set + ) + """ + + def split_data(self, property, above_or_below, iter=None, k_folds=None): + """ + Splits data by the property represented by the y values. + + Args: + - property (float): Value of property to split on. + - above_or_below (str): 'above' or 'below', values to leave out into the test set based on the given property value. + - iter (int, optional): Iteration number for naming the split file. + - k_folds (int, optional): Number of folds to generate. + """ + + if above_or_below == 'above': + self.data['group'] = np.where(self.data[1] > property, 1, 0) + + elif above_or_below == 'below': + self.data['group'] = np.where(self.data[1] < property, 1, 0) + + # Save splits + self.split_type = f'y_{above_or_below}_{property}' + + if k_folds is not None: + if self.val_split is not None: + self._save_folds(k_folds=k_folds) + elif self.val_split is None: + print("No validation split, cannot generate kfolds") + return + + else: + if iter is None: + self._save_splits() + else: + self._save_splits(iter=iter) + +class MutLoadProteinSplitter(ProteinSplitter): + """ + Class for splitting protein datasets by mutational load. + + Attributes: + data (pd.DataFrame): The protein dataset. + random_state (int): Random seed for reproducibility. + splits (dict): Dictionary to store the data splits. + split_type (str): Type of split being performed. + file_attrs (dict): Dictionary containing file attributes. + use_cache (bool): Whether to use cached splits. + y_scaling (str): Method for scaling y values. + val_split (float): Fraction of data to use for validation. + + Example Usage: + + splitter = MutLoadProteinSplitter(training_dataset_fname, + wt_file, + csv_has_header=True, # Whether input CSV has a header row + use_cache=True, # Whether to cache results to disk + y_scaling=True, # Whether to scale y values to [0,1] + val_split=None # Fraction of data for validation (None=no validation split) + ) + splitter.split_data( + max_train_muts=2, # Maximum number of mutations to include in training set + min_test_muts=5 # Minimum number of mutations to include in test set + ) + """ + + def split_data(self, max_train_muts, min_test_muts, iter=None, k_folds=None): + """ + Splits data into training and test sets based on mutational load. + + Args: + - max_train_muts (int): Maximum mutational load to include in the training set. + - min_test_muts (int): Minimum mutational load to include in the test set. + - iter (int, optional): Iteration number for naming the split file. + - k_folds (int, optional): Number of folds to generate. + """ + assert 'mut_load' in self.data.columns, "DataFrame must contain a 'mut_load' column" + assert max_train_muts < min_test_muts, "Maximum training mutational load must be less than minimum test mutational load" + + self.data['group'] = np.where( + self.data['mut_load'] <= max_train_muts, 0, + np.where( + self.data['mut_load'] >= min_test_muts, 1, np.nan + ) + ) + + # Save splits + self.split_type = f'muts-{max_train_muts}-{min_test_muts}' + + if k_folds is not None: + if self.val_split is not None: + self._save_folds(k_folds=k_folds) + elif self.val_split is None: + print("No validation split, cannot generate kfolds") + return + + else: + if iter is None: + self._save_splits() + else: + self._save_splits(iter=iter) + +class ResidueDistanceSplitter(ProteinSplitter): + """ + Class for splitting protein datasets based on residue distances in 3D structure. + + Attributes: + data (pd.DataFrame): The protein dataset. + random_state (int): Random seed for reproducibility. + splits (dict): Dictionary to store the data splits. + split_type (str): Type of split being performed. + file_attrs (dict): Dictionary containing file attributes. + use_cache (bool): Whether to use cached splits. + y_scaling (str): Method for scaling y values. + val_split (float): Fraction of data to use for validation. + pdb_file (str): Path to PDB/CIF structure file. + chain_ids (list): List of chain IDs to analyze. + dist_dict (dict): Dictionary mapping mutation pairs to distances. + + Example Usage: + + splitter = ResidueDistanceSplitter(training_dataset_fname, + wt_file, + csv_has_header=True, # Whether input CSV has a header row + use_cache=True, # Whether to cache results to disk + y_scaling=True, # Whether to scale y values to [0,1] + val_split=None, # Fraction of data for validation (None=no validation split) + pdb_file='1abc.pdb', # Path to structure file + chain_ids=['A','B'] # Chain IDs to analyze + ) + splitter.split_data( + percentile_threshold=50, # Distance percentile threshold for training set + min_test_muts=5, # Minimum mutations for test set + max_train_muts=2 # Maximum mutations for training set + ) + """ + + def __init__(self, protein_name, data, wt_file, csv_has_header=False, use_cache=False, + y_scaling=False, + val_split=None, + random_state=42, + pdb_file=None, + chain_ids=None, + **kwargs): + """ + Args: + data (str or pd.DataFrame): Input data containing sequences and labels. + wt_file (str or list): Path(s) to wild-type sequence file(s). + csv_has_header (bool): Whether input CSV has header. + use_cache (bool): Whether to cache results. + y_scaling (bool): Whether to scale y values. + val_split (float): Fraction of data for validation. + random_state (int): Random seed. + pdb_file (str): Path to PDB/CIF structure file. + chain_ids (list): List of chain IDs to analyze. + **kwargs: Additional keyword arguments. + """ + super().__init__(protein_name, data, wt_file, csv_has_header=csv_has_header, use_cache=use_cache, + random_state=random_state, + y_scaling=y_scaling, + val_split=val_split, + **kwargs) + + self.pdb_file = pdb_file + self.chain_ids = chain_ids + + def _calculate_ca_distances(self): + """ + Calculate pairwise distances between all alpha carbons in a protein structure. + + Calculates distances between CA atoms and stores in self.dist_dict mapping + mutation pairs to their 3D distance in Angstroms. + """ + # Initialize PDB parser + if self.pdb_file.endswith(".pdb"): + parser = PDB.PDBParser(QUIET=True) + elif self.pdb_file.endswith(".cif"): + parser = PDB.MMCIFParser(QUIET=True) + else: + raise ValueError("Invalid file type. Please provide a PDB or CIF file.") + + structure = parser.get_structure('protein', self.pdb_file) + + # Get all alpha carbons + ca_atoms = [] + residue_info = [] + + for model in structure: + for chain in model: + if chain.id in self.chain_ids: + for residue in chain: + if 'CA' in residue: + ca_atoms.append(residue['CA']) + residue_info.append(( + chain.id, + residue.get_id()[1], # residue number + residue.get_resname() # residue name + )) + + # Calculate distance matrix + n_residues = len(ca_atoms) + distance_matrix = np.zeros((n_residues, n_residues)) + + for i in range(n_residues): + for j in range(i+1, n_residues): + distance = ca_atoms[i] - ca_atoms[j] # Returns distance in Angstroms + distance_matrix[i,j] = distance + distance_matrix[j,i] = distance + + dist_dict = {} + + for i in range(len(residue_info)): + for j in range(i+1, len(residue_info)): # Only upper triangle to avoid duplicates + chain_i, resnum_i, resname_i = residue_info[i] + chain_j, resnum_j, resname_j = residue_info[j] + resname_i = aa_dict_3to1[resname_i] + resname_j = aa_dict_3to1[resname_j] + + # Calculate adjusted residue numbers based on chain index + resnum_i_adj = resnum_i + self.wt_seq_lens[self.chain_ids.index(chain_i)-1] if self.chain_ids.index(chain_i) != 0 else resnum_i + resnum_j_adj = resnum_j + self.wt_seq_lens[self.chain_ids.index(chain_j)-1] if self.chain_ids.index(chain_j) != 0 else resnum_j + + # Create key string with adjusted residue numbers + key = f'{resname_i}{resnum_i_adj}_{resname_j}{resnum_j_adj}' + + # Store distance in dictionary + dist_dict[key] = distance_matrix[i,j] + + if self.randomized_control: + # modify dist_dict to be randomized + # Set random seed before shuffling + random.seed(self.random_state) + # Get all values and shuffle them + values = list(dist_dict.values()) + random.shuffle(values) + # Reassign shuffled values to the same keys + dist_dict = dict(zip(dist_dict.keys(), values)) + + self.dist_dict = dist_dict + + self.data['dist'] = self.data['muts'].apply(lambda x: self._get_dist(x.split('/'))) + + self._get_dist_percentile() + + def _get_dist(self, muts): + """ + Get sum of pairwise distances between mutations. + + Args: + muts (list): List of mutation strings in format 'A123B'. + + Returns: + float: Sum of pairwise distances between mutations. + """ + distances = [] + for i in range(len(muts)): + for j in range(i+1, len(muts)): + mut_pair = f"{muts[i][:-1]}_{muts[j][:-1]}" + if mut_pair in self.dist_dict: + distances.append(self.dist_dict[mut_pair]) + return sum(distances) + + def _get_dist_percentile(self): + """ + Calculate distance percentile for each variant within its mutational load group. + Updates self.data with 'dist_percentile' column. + """ + for mut_load in self.data['mut_load'].unique(): + subset = self.data[self.data['mut_load'] == mut_load].copy() + if mut_load == 0 or mut_load == 1: + subset['dist_percentile'] = 0 + else: + subset['dist_percentile'] = subset['dist'].rank(pct=True) *100 + self.data.loc[self.data['mut_load'] == mut_load, 'dist_percentile'] = subset['dist_percentile'] + + def split_data(self, percentile_threshold, min_test_muts, max_train_muts, randomized_control=False, iter=None, k_folds=None): + """ + Split data based on mutation distances and counts. + + Args: + percentile_threshold (float): Maximum distance percentile for training set. + min_test_muts (int): Minimum mutations for test set. + max_train_muts (int): Maximum mutations for training set. + randomized_control (bool): Whether to randomize the distance dictionary. + iter (int, optional): Iteration number for naming the split file. + k_folds (int, optional): Number of folds to generate. + """ + assert 'mut_load' in self.data.columns, "DataFrame must contain a 'mut_load' column" + assert max_train_muts < min_test_muts, "Maximum training mutational load must be less than minimum test mutational load" + + self.randomized_control = randomized_control + self._calculate_ca_distances() + + self.data['group'] = np.where( + (self.data['mut_load'] <= max_train_muts) & (self.data['dist_percentile'] <= percentile_threshold), 0, + np.where( + self.data['mut_load'] >= min_test_muts, 1, np.nan + ) + ) + + # Save splits + self.split_type = f'dist-p{percentile_threshold}-{max_train_muts}-{min_test_muts}{"-randomized-" + str(self.random_state) if self.randomized_control else ""}' + + if k_folds is not None: + if self.val_split is not None: + self._save_folds(k_folds=k_folds) + elif self.val_split is None: + print("No validation split, cannot generate kfolds") + return + else: + if iter is None: + self._save_splits() + else: + self._save_splits(iter=iter) + diff --git a/model/streamlit_1.png b/model/streamlit_1.png new file mode 100644 index 0000000000000000000000000000000000000000..fc2b4632a2e968703f6526ccf4a82b63461b86ad --- /dev/null +++ b/model/streamlit_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c47c694f023cdc6de5204054b67e4a7a2d57c71bdca4af4ab80d9edf186b8cdc +size 219038 diff --git a/model/utils/__init__.py b/model/utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..bb23be01c659d465258677a26c1fc62d7250fb1b --- /dev/null +++ b/model/utils/__init__.py @@ -0,0 +1,7 @@ +from model.utils.data_utils import * +from model.utils.other_utils import * +from model.utils.featurizer_utils import * +from model.utils.zeroshot_utils import * +from model.utils.cache_utils import * +from model.utils.benchmark_utils import * +from model.utils.cloning_utils import * \ No newline at end of file diff --git a/model/utils/benchmark_utils.py b/model/utils/benchmark_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..10a9c7b288b7fe9457d21016cb3405972b4a9269 --- /dev/null +++ b/model/utils/benchmark_utils.py @@ -0,0 +1,290 @@ +import pandas as pd +import numpy as np + +from pathlib import Path +import json, hashlib +import re + +from model.splitters import * +from model.featurizers import * +from model.predictors import * +from model.proposers import * + +class TrainingCache: + """ + A cache class for storing training results with an index-based lookup system. + + Attributes: + dir (Path): Directory path for cache storage + index_path (Path): Path to the index CSV file + index (pd.DataFrame): DataFrame containing cache metadata and lookup information + """ + + def __init__(self, cache_dir: str | Path): + """ + Initialize the TrainingCache. + + Args: + cache_dir (str | Path): Directory path where cache files will be stored + """ + self.dir = Path(cache_dir) + self.dir.mkdir(parents=True, exist_ok=True) + self.index_path = self.dir / "index.csv" + + if self.index_path.exists(): + # Just load it back; columns will include whatever keys you added + self.index = pd.read_csv(self.index_path) + else: + # Start empty; no need to predefine columns, they’ll be added by set() + self.index = pd.DataFrame() + + def _key_id(self, keys: dict) -> str: + """ + Generate a unique hash ID for the given keys dictionary. + + Args: + keys (dict): Dictionary of keys to hash + + Returns: + str: MD5 hash of the serialized keys + """ + blob = json.dumps(keys, sort_keys=True, default=str) + return hashlib.md5(blob.encode()).hexdigest() + + def _path(self, key_id: str) -> Path: + """ + Generate the file path for a given key ID. + + Args: + key_id (str): Unique identifier for the cache entry + + Returns: + Path: Path object pointing to the pickle file + """ + return self.dir / f"{key_id}.pkl" + + def _check_index(self, row: pd.DataFrame) -> None: + + # check if index exists + if self.index_path.exists(): + self.index = pd.read_csv(self.index_path) + + # overwrite existing entry in case of updating path + if not self.index.empty and "key_id" in self.index.columns: + self.index = self.index[self.index["key_id"] != row['key_id']] + + self.index = pd.concat([self.index, pd.DataFrame([row])], ignore_index=True) + self.index.to_csv(self.index_path, index=False) + + + def get(self, keys: dict) -> pd.DataFrame | None: + """ + Check if a pkl file for run exists, if so retrieve dataframe and check index if run is in index. + + Args: + keys (dict): Dictionary of keys to look up + + Returns: + pd.DataFrame | None: Cached DataFrame if found, None otherwise + """ + + # Check if pkl file for run exists else return None + path = self._path(self._key_id(keys)) + + if not path.exists(): + return None + + # retrieve dataframe + df = pd.read_pickle(path) + + # update index + row = { + "key_id": self._key_id(keys), + "path": str(path), + "variants": df.shape[0], + **keys, # expand keys directly into columns + } + self._check_index(row) + + return df + + def set(self, keys: dict, df: pd.DataFrame) -> None: + """ + Store a DataFrame in the cache with the given keys and check index to update with new entry. + + Args: + keys (dict): Dictionary of keys to associate with the DataFrame + df (pd.DataFrame): DataFrame to cache + """ + + key_id = self._key_id(keys) + path = self._path(key_id) + + # save dataframe + df.to_pickle(path) + + # build row with expanded keys + row = { + "key_id": key_id, + "path": str(path), + "variants": df.shape[0], + **keys, # expand keys directly into columns + } + + # update index + self._check_index(row) + + +def summary_df_check_dms_completion(summary_df, threshold=0.8): + + def check_dms_completion(row): + fraction_dms = row['DMS_number_single_mutants'] / (row['seq_len'] * 19) + if fraction_dms >= threshold: + return fraction_dms, True + else: + return fraction_dms, False + + summary_df[['fraction_dms', 'dms_threshold_met']] = summary_df.apply(check_dms_completion, axis=1, result_type='expand') + return summary_df + +# function to receive dataset name, dataset filename, and sequence from dataframe row +def receive_dataset_vars(row): + # generate fasta file of sequence + dataset_name = row['DMS_id'] + dataset_fname = row['DMS_filename'] + sequence = row['target_seq'] + + return dataset_name, dataset_fname, sequence + +# function to generate fasta file of sequence +def retrieve_wt_file(dataset_name, seq_dir, sequence): + + output_dir = Path(seq_dir) + wt_file = output_dir / f'{dataset_name}.fasta' + if wt_file.exists(): + return str(wt_file) + else: + # Prepare folder to save results + output_dir.mkdir(parents=True, exist_ok=True) + + with open(wt_file, 'w') as file: + file.write(f'>{dataset_name}\n') + file.write(sequence + '\n') + + return str(wt_file) + +# function to preprocess dataset (mark valid multimutants), add relevant columns +def preprocess_dataset(dataset_fname, data_dir, stringency='singles'): + # options for stringency: 'singles', 'singles_or_doubles', 'singles_positions' + + # check for existing processed datasets + processed_datasets_dir = os.path.join(data_dir, 'processed') + processed_datasets_all_dir = os.path.join(data_dir, 'processed', 'all') + processed_datasets_stringency_dir = os.path.join(data_dir, 'processed', stringency) + processed_all_filename = os.path.join(processed_datasets_all_dir, f'{dataset_fname}.csv') + processed_stringency_filename = os.path.join(processed_datasets_stringency_dir, f'{dataset_fname}.csv') + if os.path.exists(processed_all_filename) and os.path.exists(processed_stringency_filename): + return pd.read_csv(processed_all_filename), pd.read_csv(processed_stringency_filename) + + # read csv file + working_df_head = pd.read_csv(os.path.join(data_dir, dataset_fname)) + + # replace colon with slash in mutant column + working_df_head['mutant'] = working_df_head['mutant'].apply(lambda x: x.replace(':', '/')) + + # retrieve number of mutations + working_df_head['num_mutations'] = working_df_head['mutant'].apply(lambda x: len(x.split('/'))) + + # retrieve single mutants + singles = working_df_head[working_df_head['num_mutations'] == 1]['mutant'].tolist() + + # get positions from single mutants + singles_positions = [] + pattern = r'[A-Z]\d+[A-Z]' + for mutant in singles: + if len(re.findall(pattern, mutant)) != 0: + singles_positions.append(int(mutant[1:-1])) + singles_positions = list(set(singles_positions)) + + # retrieve mutations doubles + doubles = [single for double in working_df_head[working_df_head['num_mutations'] == 2]['mutant'].tolist() for single in double.split('/')] + + # function to check for multimutants where are single mutants are present + def check_existing_mutants_in_singles(mutant): + mutant_list = mutant.split('/') + for m in mutant_list: + if m in singles: + pass + else: + return False + return True + + def check_existing_mutants_in_singles_or_doubles(mutant): + mutant_list = mutant.split('/') + for m in mutant_list: + if m in singles or m in doubles: + pass + else: + return False + return True + + def check_existing_mutants_in_singles_positions(mutant): + mutant_list = mutant.split('/') + if mutant_list[0] == 'WT': + return True + else: + for m in mutant_list: + if int(m[1:-1]) in singles_positions: + pass + else: + return False + return True + + # filter dataset keeping only combo variants with all single mutants existing in the dataset + working_df_head['singles_exist'] = working_df_head['mutant'].apply(check_existing_mutants_in_singles) + working_df_head['singles_or_doubles_exist'] = working_df_head['mutant'].apply(check_existing_mutants_in_singles_or_doubles) + working_df_head['singles_positions_exist'] = working_df_head['mutant'].apply(check_existing_mutants_in_singles_positions) + + if stringency == 'singles': + working_df_head_valid = working_df_head[working_df_head['singles_exist'] == True].sort_values(by='num_mutations', ascending=False) + elif stringency == 'singles_or_doubles': + working_df_head_valid = working_df_head[working_df_head['singles_or_doubles_exist'] == True].sort_values(by='num_mutations', ascending=False) + elif stringency == 'singles_positions': + working_df_head_valid = working_df_head[working_df_head['singles_positions_exist'] == True].sort_values(by='num_mutations', ascending=False) + else: + raise ValueError(f'Invalid stringency: {stringency}. Please choose from ["singles", "singles_or_doubles"].') + + # save results + os.makedirs(os.path.join(processed_datasets_all_dir), exist_ok=True) + os.makedirs(os.path.join(processed_datasets_stringency_dir), exist_ok=True) + working_df_head.to_csv(processed_all_filename, index=False) + working_df_head_valid.to_csv(processed_stringency_filename, index=False) + + return working_df_head, working_df_head_valid + +def select_feature(encoding, protein_name, batch_size=1000): + + # check if encoding_name is in the list of available encodings + if encoding not in ['esm2_15b', 'esm2_3b', 'onehot', 'georgiev', 'aaidx', 'onehot_and_esm2_15b', 'ankh_base', 'ankh_large', 'ProtT5_XL_U50_Embed']: + raise ValueError(f'Invalid encoding_name: {encoding}. Please choose from {["esm2_15b", "esm2_3b", "onehot", "georgiev", "aaidx", "ankh_base", "ankh_large", "ProtT5_XL_U50_Embed"]}.') + + # get feature + if encoding == 'esm2_15b': + feature = ESM2_15b_EmbedFeaturizer(protein=protein_name, use_cache=True) + elif encoding == 'esm2_3b': + feature = ESM2EmbedFeaturizer(protein=protein_name, use_cache=True) + elif encoding == 'onehot': + feature = OneHotFeaturizer(protein=protein_name, use_cache=True) + elif encoding == 'georgiev': + feature = GeorgievFeaturizer(protein=protein_name, use_cache=True) + elif encoding == 'aaidx': + feature = AAIdxFeaturizer(protein=protein_name, use_cache=True) + elif encoding == 'onehot_and_esm2_15b': + feature = OnehotAndESM2_15bEmbedFeaturizer(protein=protein_name, use_cache=True) + elif encoding == 'ankh_base': + feature = AnkhBaseFeaturizer(protein=protein_name, use_cache=True, batch_size=batch_size) + elif encoding == 'ankh_large': + feature = AnkhLargeFeaturizer(protein=protein_name, use_cache=True, batch_size=batch_size) + elif encoding == 'ProtT5_XL_U50_Embed': + feature = ProtT5_XL_U50_EmbedFeaturizer(protein=protein_name, use_cache=True, batch_size=batch_size) + return feature \ No newline at end of file diff --git a/model/utils/cache_utils.py b/model/utils/cache_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..390a1be8e451843f22cd691e89006ff8143bb613 --- /dev/null +++ b/model/utils/cache_utils.py @@ -0,0 +1,84 @@ +# This module contains utility functions for caching and loading feature model data + +import numpy as np +import os +import pickle +import sys + +def cache_namespace(fmodel_type, protein): + """ + Creates a namespace directory for caching feature models of a specific protein. + + Args: + - fmodel_type (str): Type of feature model. + - protein (str): Name of the protein. + + Returns: + - str: Path to the namespace directory. + """ + fmodel_type = fmodel_type.replace('/', '-') + root_folder = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) + namespace = f'{root_folder}/proteins/{protein}/feature_cache/{fmodel_type}' + if not os.path.exists(namespace): + os.makedirs(namespace) + return namespace + +def load_cache(fmodel_type, protein, verbose=1): + """ + Loads cached feature model data for a specific protein. + + Args: + - fmodel_type (str): Type of feature model. + - protein (str): Name of the protein. + - verbose (int): Whether to print the number of sequences loaded from cache. + + Returns: + - dict: Cached data where keys are sequences and values are feature arrays. + """ + dirname = cache_namespace(fmodel_type, protein) + + if not os.path.exists(f'{dirname}/seqs.pkl') or \ + not os.path.exists(f'{dirname}/X.npy'): + sys.stderr.write(f'Warning: Could not load cache in {dirname}\n') + return {} + + with open(f'{dirname}/seqs.pkl', 'rb') as f: + seqs = pickle.load(f) + + X = np.load(f'{dirname}/X.npy') + + cache = { + seq: X[idx] for idx, seq in enumerate(seqs) + } + + if verbose > 0: + print(f'Loaded {len(cache)} sequences from cache.') + + return cache + +def update_cache(fmodel_type, protein, updating_cache_values): + """ + Update the existing cache with new values. + + Args: + - fmodel_type (str): Type of feature model. + - protein (str): Name of the protein. + - updating_cache_values (dict): New values to update the cache with, where keys are sequences and values are feature arrays. + """ + dirname = cache_namespace(fmodel_type, protein) + + existing_cache = load_cache(fmodel_type, protein, verbose=0) + new_cache_values = { seq: val for seq, val in updating_cache_values.items() if seq not in existing_cache.keys() } + # print(f'Existing cache: {len(existing_cache)}') + print(f'Updating cache with {len(new_cache_values)} new values for {fmodel_type}') + if len(new_cache_values) > 0: + updated_cache = existing_cache | new_cache_values + print(f'Updated cache: {len(updated_cache)}') + + seqs = list(updated_cache.keys()) + X = np.array([ updated_cache[seq] for seq in seqs ]) + + with open(f'{dirname}/seqs.pkl', 'wb') as f: + pickle.dump(seqs, f) + + np.save(f'{dirname}/X.npy', X) diff --git a/model/utils/cloning_utils.py b/model/utils/cloning_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..c0a068b00b4740a903d2ed5b48c4af92723bbcc0 --- /dev/null +++ b/model/utils/cloning_utils.py @@ -0,0 +1,795 @@ +# updated 3/25/2025 +from concurrent.futures import ProcessPoolExecutor +import copy +import re + +import pandas as pd +import numpy as np +import os + +from Bio import Align, SeqIO +from Bio.Seq import Seq +from Bio.SeqUtils import MeltingTemp as mt +from Bio.SeqRecord import SeqRecord +from typing import Optional, Tuple + +codon_dicts = { + 'human': { + 'F': 'TTT', 'L': 'CTG', 'Y': 'TAT', 'H': 'CAT', 'Q': 'CAG', + 'I': 'ATT', 'M': 'ATG', 'N': 'AAT', 'K': 'AAG', 'V': 'GTG', + 'D': 'GAT', 'E': 'GAG', 'S': 'TCT', 'C': 'TGT', 'W': 'TGG', + 'P': 'CCT', 'R': 'CGG', 'T': 'ACT', 'A': 'GCT', 'G': 'GGG', + }, + 'ecoli': { + 'F': 'TTT', 'L': 'CTG', 'Y': 'TAT', 'H': 'CAT', 'Q': 'CAG', + 'I': 'ATT', 'M': 'ATG', 'N': 'AAC', 'K': 'AAA', 'V': 'GTG', + 'D': 'GAT', 'E': 'GAA', 'S': 'TCT', 'C': 'TGC', 'W': 'TGG', + 'P': 'CCG', 'R': 'CGT', 'T': 'ACC', 'A': 'GCG', 'G': 'GGC', + }, + 'yeast': { + 'F': 'TTT', 'L': 'CTA', 'Y': 'TAT', 'H': 'CAT', 'Q': 'CAA', + 'I': 'ATT', 'M': 'ATG', 'N': 'AAT', 'K': 'AAA', 'V': 'GTT', + 'D': 'GAT', 'E': 'GAA', 'S': 'TCT', 'C': 'TGT', 'W': 'TGG', + 'P': 'CCA', 'R': 'AGA', 'T': 'ACT', 'A': 'GCT', 'G': 'GGT', + } +} + +class MultiAssemblyDesigner: + + """ + Designs oligos for protein mutations. + + Args: + data (pd.DataFrame): DataFrame containing mutation data. + start_seq_fasta (str): Path to FASTA file with starting sequence. + overhang (int): Overhang length. + species (str): Species, 'human', 'ecoli', or 'yeast'. + oligo_direction (str): Direction of oligo, 'bottom' or 'top'. + tm (float): Target melting temperature. + output (str): Type of output, 'design' or 'update'. + """ + + def __init__(self, data, start_seq_fasta, overhang, species='human', oligo_direction='bottom', tm=80, output='design'): + + print("Initializing MultiAssemblyDesigner...") + self.data = data.rename(columns={data.columns[0]:'aa_mut'}) + self.data['aa_mut'] = self.data['aa_mut'].apply(lambda x: self._sort_mutations(x)) + self.fasta_dir = os.path.dirname(start_seq_fasta) + + print(f'The melting temperature is {tm}') + self.tm = tm + self.start_seq = SeqIO.read(start_seq_fasta, "fasta").seq.upper() + self.overhang = overhang + self.oligo_direction = oligo_direction + self.codon_dict = codon_dicts[species] + # print('Processing mutations...') + self._process_mutations() + + # print('Designing oligos...') + self._design_oligos() + self._find_unique_mutant_oligos() + + if output == 'design': + print('Exporting design...') + self._export_design() + + elif output == 'update': + print('Updating oligo IDs...') + self._modify_oligo_id() + + def _sort_mutations(self, mutation_string): + """ + Sort mutations within a string based on their position numbers. + + Args: + mutation_string (str): String containing mutations (e.g., 'A167R/T192V') + + Returns: + str: Sorted mutation string + """ + mutations = mutation_string.split('/') + sorted_mutations = sorted(mutations, key=lambda x: int(''.join(filter(str.isdigit, x)))) + return sorted_mutations + + def _process_mutations(self): + """Processes mutations to extract positions and bases.""" + self.data[['Positions','Reference_bases','Alternative_bases']] = self.data.apply( + lambda x: pd.Series(self._get_codon_mutation_list(x['aa_mut'], self.codon_dict, self.overhang, str(self.start_seq))), + axis=1 + ) + + self.data['mut_seq'] = self.data.apply( + lambda x: self._get_mut_seq(x['Positions'], x['Alternative_bases'], x['aa_mut']), + axis=1 + ) + + def _design_oligos(self): + """Designs oligos for each mutation in the dataset.""" + self.data[['oligos','oligo_mut']] = self.data.apply( + lambda x: pd.Series(self._design_oligo_pipeline(x)), + axis=1 + ) + + def _get_codon_mutation_list(self, mut_ls, codon_dict, overhang, start_seq): + """ + Retrieves list of codon mutations. + + Args: + mut_ls (list): List of mutations. + codon_dict (dict): Codon dictionary. + overhang (int): Overhang length. + start_seq (str): Starting sequence. + + Returns: + tuple: Lists of positions, old codons, and new codons. + """ + pos_ls, old_codon_ls, new_codon_ls = [], [], [] + for mut in mut_ls: + pos, new_codon = self._get_codon_mutation(mut, codon_dict) + pos_ls.append(int(pos)+overhang) + old_codon_ls.append(start_seq[(int(pos)+overhang)-1:(int(pos)+overhang+2)]) + new_codon_ls.append(new_codon) + return pos_ls, old_codon_ls, new_codon_ls + + def _get_codon_mutation(self, mut, codon_dict): + """ + Retrieves codon mutation details. + + Args: + mut (str): Mutation string. + codon_dict (dict): Codon dictionary. + + Returns: + tuple: Position and new codon. + """ + new_codon = codon_dict[mut[-1]] + pos = str(int(mut[1:-1])*3 - 2) + return pos, new_codon + + def _design_oligo_pipeline(self, row): + """ + Designs oligos for a row of mutations. + + Args: + row (pd.Series): Row of mutation data. + + Returns: + tuple: Lists of oligos and oligo mutations. + """ + pos_start_ls, pos_end_ls = [], [] + for i, pos in enumerate(row['Positions']): + pos_start, pos_end = self._design_mutant_oligo(self.start_seq, pos, row['Alternative_bases'][i], row['Reference_bases'][i], result='positions') + pos_start_ls.append(pos_start) + pos_end_ls.append(pos_end) + + oligos, oligo_mt_mapping = [], [] + i = 0 + while i < len(row['Positions']): + mut = [row['aa_mut'][i]] + start_index = pos_start_ls[i] + index_i = i + + if i < len(row['Positions'])-1: + n = 0 + while pos_end_ls[i+n] >= pos_start_ls[i+n+1]: + n += 1 + mut.append(row['aa_mut'][i+n]) + if i+n+1 == len(row['Positions']): + break + index_f = i + n + i = i + n + end_index = pos_end_ls[index_f] + else: + index_f = i + end_index = pos_end_ls[i] + + oligos.append(str(self._get_mutant_oligo_by_pos(self.start_seq, row['Positions'], row['Alternative_bases'], row['Reference_bases'], start_index, end_index, index_i, index_f))) + i += 1 + oligo_mt_mapping.append("-".join(mut)) + + return oligos, oligo_mt_mapping + + def _get_mut_seq(self, pos_ls, new_codon_ls, mut_ls): + """ + Generates mutated sequence. + + Args: + pos_ls (list): List of positions. + new_codon_ls (list): List of new codons. + mut_ls (list): List of mutations. + + Returns: + str: Mutated sequence. + """ + mut_seq = copy.deepcopy(self.start_seq) + for i, pos in enumerate(pos_ls): + mod_pos = int(pos) - 1 + wt_aa = mut_ls[i][0] + wt_aa_retrieved = Seq(self.start_seq[mod_pos:mod_pos+3]).translate() + assert wt_aa == wt_aa_retrieved, f"{mut_ls[i]} is not a true mutation from {wt_aa_retrieved}{mut_ls[i][1:-1]}" + mut_seq = mut_seq[:mod_pos] + new_codon_ls[i].lower() + mut_seq[mod_pos+3:] + return str(mut_seq) + + def _design_mutant_oligo(self, seq, pos, new_codon, old_codon, result='oligo'): + """ + Designs mutant oligo. + + Args: + seq (str): Sequence. + pos (int): Position. + new_codon (str): New codon. + old_codon (str): Old codon. + result (str): Type of result to return. + + Returns: + tuple: Oligo sequence and wild-type oligo sequence, or start and end positions. + """ + mod_pos = int(pos) - 1 + mut_seq = seq[:mod_pos] + new_codon.lower() + seq[mod_pos+3:] + wt_seq = seq[:mod_pos] + old_codon.lower() + seq[mod_pos+3:] + + start_index = mod_pos - 11 + end_index = mod_pos + 14 + + if self.oligo_direction == 'bottom': + oligo = mut_seq[start_index:end_index].reverse_complement() + wt_oligo = wt_seq[start_index:end_index].reverse_complement() + else: + oligo = mut_seq[start_index:end_index] + wt_oligo = wt_seq[start_index:end_index] + + while mt.Tm_NN(oligo, Na=50, K=25, Tris=35, Mg=10) <= self.tm: + if len(oligo) % 2 == 0: + start_index -= 1 + else: + end_index += 1 + + if self.oligo_direction == 'bottom': + oligo = mut_seq[start_index:end_index].reverse_complement() + wt_oligo = wt_seq[start_index:end_index].reverse_complement() + else: + oligo = mut_seq[start_index:end_index] + wt_oligo = wt_seq[start_index:end_index] + + if result == 'oligo': + return str(oligo), str(wt_oligo), round(mt.Tm_NN(oligo, Na=50, K=25, Tris=35, Mg=10), 2) + else: + return start_index+1, end_index+1 + + def _get_mutant_oligo_by_pos(self, seq, pos_ls, new_codon_ls, old_codon_ls, start, end, index_i, index_f): + """ + Retrieves mutant oligo by position. + + Args: + seq (str): Sequence. + pos_ls (list): List of positions. + new_codon_ls (list): List of new codons. + old_codon_ls (list): List of old codons. + start (int): Start position. + end (int): End position. + index_i (int): Start index. + index_f (int): End index. + + Returns: + str: Mutant oligo sequence. + """ + mod_pos_ls = pos_ls[index_i:index_f+1] + mod_new_codon_ls = new_codon_ls[index_i:index_f+1] + mod_old_codon_ls = old_codon_ls[index_i:index_f+1] + + for i, mod_pos in enumerate(mod_pos_ls): + mod_pos = int(mod_pos) - 1 + old_codon = seq[mod_pos:mod_pos+3] + assert old_codon.upper() == mod_old_codon_ls[i].upper() + seq = seq[:mod_pos] + mod_new_codon_ls[i].lower() + seq[mod_pos+3:] + + mod_start, mod_end = int(start) - 1, int(end) - 1 + return seq[mod_start:mod_end].reverse_complement() if self.oligo_direction == 'bottom' else seq[mod_start:mod_end] + + def _find_unique_mutant_oligos(self): + """Identifies unique mutant oligos in the dataset.""" + oligos = [item for sublist in self.data['oligos'].tolist() for item in sublist] + oligo_mutation = [item for sublist in self.data['oligo_mut'].tolist() for item in sublist] + + df = pd.DataFrame({'oligos': oligos, 'mutation': oligo_mutation}).drop_duplicates(subset=['mutation'], keep='first') + df['oligo_id'] = range(len(df)) + + oligo_dict = {oligo: i for i, oligo in enumerate(df['oligos'])} + self.data['oligo_id'] = self.data['oligos'].apply(lambda x: [oligo_dict[oligo] for oligo in x]) + + self.oligos = df + + # Apply the sorting function to each row + self.data[['oligo_id', 'oligo_mut']] = self.data.apply(self._sort_oligos, axis=1) + + def _sort_oligos(self, row): + """Sort oligo_id and corresponding oligo_mut values in sync.""" + + # Convert oligo_id string to list of integers + oligo_ids = row['oligo_id'] + # Convert oligo_mut string to list + oligo_muts = row['oligo_mut'] + + # Zip together for sorting + paired_data = list(zip(oligo_ids, oligo_muts)) + # Sort by oligo_id + paired_data.sort(key=lambda x: x[0]) + + # Unzip the sorted data + sorted_ids, sorted_muts = map(list, zip(*paired_data)) + + # Return new row with sorted, comma-joined values + return pd.Series({ + 'oligo_id': sorted_ids, + 'oligo_mut': sorted_muts + }) + + def _export_df_with_lists(self, df, filepath, delimiter=','): + """ + Export DataFrame with list columns to CSV, converting lists to delimiter-separated strings + without brackets for better readability. + + Parameters: + df (pandas.DataFrame): DataFrame containing list columns + filepath (str): Path where CSV will be saved + delimiter (str): Delimiter to separate list items (default ';') + """ + # Create a copy to avoid modifying the original + df_to_save = df.copy() + + # Convert list columns to delimited strings + for column in df_to_save.columns: + if df_to_save[column].apply(lambda x: isinstance(x, list)).any(): + df_to_save[column] = df_to_save[column].apply( + lambda x: delimiter.join(str(item) for item in x) if isinstance(x, list) else x + ) + + # Save to CSV + df_to_save.to_csv(filepath, index=False) + + def _import_df_with_lists(self, filepath, delimiter=','): + """ + Import CSV file and convert delimiter-separated strings back to lists. + + Parameters: + filepath (str): Path to the CSV file + delimiter (str): Delimiter used to separate list items (default ';') + + Returns: + pandas.DataFrame: DataFrame with list columns properly restored + """ + # Read the CSV + df = pd.read_csv(filepath) + + # Try to convert delimited strings back to lists + for column in df.columns: + try: + # Check if the column contains delimiter-separated values + if df[column].dtype == 'object': + first_value = str(df[column].iloc[0]) + if delimiter in first_value: + # Convert to list and handle type conversion + def convert_to_list(value): + if pd.isna(value): + return [] + items = str(value).split(delimiter) + # Try to convert to numbers if possible + try: + return [float(item) if '.' in item else int(item) + for item in items] + except ValueError: + return items + + df[column] = df[column].apply(convert_to_list) + except: + # If conversion fails, keep the column as is + continue + + return df + + def _export_design(self): + """Exports the cloning sheet and oligos.""" + + self._export_df_with_lists(self.data[['oligo_id', 'oligo_mut']].copy(), os.path.join(self.fasta_dir, 'cloning_sheet.csv')) + self.oligos.to_csv(os.path.join(self.fasta_dir, 'oligos.csv'), index=False) + + def _modify_oligo_id(self): + """Modifies the oligo_id in the cloning sheet to match the updated oligo_id in the oligos file.""" + self.oligos = self._import_df_with_lists(os.path.join(self.fasta_dir, 'oligos.csv')) + oligo_dict = dict(zip(self.oligos['mutation'], self.oligos['oligo_id'])) + self.data['oligo_id'] = self.data['oligo_mut'].apply(lambda x: [oligo_dict[mutation] for mutation in x]) + self.data[['oligo_id', 'oligo_mut']] = self.data.apply(self._sort_oligos, axis=1) + + self._export_df_with_lists(self.data[['oligo_id', 'oligo_mut']].copy(), os.path.join(self.fasta_dir, 'cloning_sheet.csv')) + +class SequenceTrimmer: + """ + Trims adapter sequences from DNA sequences, handling both forward and reverse orientations. + + Args: + five_prime (str): 5' adapter sequence to find and trim before + three_prime (str): 3' adapter sequence to find and trim after + max_error_rate (float): Maximum mismatch rate allowed when matching adapters (default: 0.1) + min_length (int): Minimum sequence length after trimming (default: 15) + + Attributes: + five_prime (str): Uppercase 5' adapter sequence + three_prime (str): Uppercase 3' adapter sequence + max_error_rate (float): Maximum allowed mismatch rate + min_length (int): Minimum allowed sequence length + """ + + def __init__(self, + five_prime: str, + three_prime: str, + min_length: int, + max_error_rate: float = 0 + ): + self.five_prime = five_prime.upper() + self.three_prime = three_prime.upper() + self.max_error_rate = max_error_rate + self.min_length = min_length + + def _count_mismatches(self, seq1: str, seq2: str) -> int: + """ + Count mismatches between two sequences of equal length. + + Args: + seq1 (str): First sequence + seq2 (str): Second sequence + + Returns: + int: Number of mismatched positions + """ + return sum(c1 != c2 for c1, c2 in zip(seq1, seq2)) + + def _reverse_complement(self, seq: str) -> str: + """ + Generate reverse complement of a DNA sequence. + + Args: + seq (str): Input DNA sequence + + Returns: + str: Reverse complement sequence + """ + seq = seq.upper() + complement = {'A':'T', 'T':'A', 'G':'C', 'C':'G'} + return ''.join(complement.get(base, base) for base in reversed(seq)) + + def _find_with_mismatches(self, sequence: str, pattern: str) -> Optional[Tuple[Tuple[int, int], str]]: + """ + Find pattern in sequence and its reverse complement, allowing mismatches. + + Args: + sequence (str): Input sequence to search + pattern (str): Pattern to find + + Returns: + Optional[Tuple[Tuple[int, int], str]]: Tuple of ((start, end), strand) if found, None if not found + """ + sequence = sequence.upper() + pattern_len = len(pattern) + + if len(sequence) < pattern_len: + return None + + scores = {} + rev_comp = self._reverse_complement(sequence) + + for i, seq in enumerate([sequence, rev_comp]): + for start in range(len(seq) - pattern_len + 1): + window = seq[start:start + pattern_len] + score = self._count_mismatches(window, pattern) + scores[(start, start + pattern_len), "fwd" if i == 0 else "rev"] = score + + if not scores: + return None + + best_pos = min(scores.items(), key=lambda x: x[1]) + return best_pos[0] if best_pos[1] <= (1 - self.max_error_rate) * pattern_len else None + + def _trim_record(self, seq: str) -> Optional[str]: + """ + Trim adapters from a single sequence. + + Args: + seq (str): Input DNA sequence + + Returns: + Optional[str]: Trimmed sequence if successful, None if discarded + """ + if len(seq) < self.min_length: + return None + + sequence = seq + sequence_rev_comp = self._reverse_complement(sequence) + start = 0 + end = len(sequence) + strand = "fwd" + + five_prime_pos = self._find_with_mismatches(sequence, self.five_prime) + if five_prime_pos: + start = five_prime_pos[0][0] + strand = five_prime_pos[1] + + three_prime_pos = self._find_with_mismatches(sequence, self.three_prime) + if three_prime_pos: + end = three_prime_pos[0][1] + + + # check if start position is less than end position + if start < end: + + if end - start < self.min_length: + return None + + return sequence[start:end] if strand == "fwd" else sequence_rev_comp[start:end] + + # if start is greater than end, then the region of interest is wrapping around (given the sequence is circular) + else: + + if strand == "fwd": + trim = sequence[start:] + sequence[:end] + else: + trim = sequence_rev_comp[start:] + sequence_rev_comp[:end] + + return trim + + def trim_file(self, input, input_type: str = 'fasta') -> Optional[list]: + """ + Process FASTQ file and output trimmed sequences. + + Args: + input: Path to input FASTQ file or FASTA file or list of either (fasta, fastq, fasta list, fastq list) + input_type (str): Type of input, either 'fastq' or 'fasta' + + Returns: + Optional[list]: List of trimmed sequences if output='list', None otherwise + """ + records_stored = [] + if input_type == 'fastq': + records_stored = [record for record in SeqIO.parse(input, "fastq")] + seqs = [str(record.seq) for record in SeqIO.parse(input, "fastq")] + elif input_type == 'fasta': + records_stored = [record for record in SeqIO.parse(input, "fasta")] + seqs = [str(record.seq) for record in SeqIO.parse(input, "fasta")] + elif input_type == 'fasta list': + records_stored = [record for file in input for record in SeqIO.parse(file, "fasta")] + seqs = [str(record.seq) for file in input for record in SeqIO.parse(file, "fasta")] + elif input_type == 'fastq list': + records_stored = [record for file in input for record in SeqIO.parse(file, "fastq")] + seqs = [str(record.seq) for file in input for record in SeqIO.parse(file, "fastq")] + + with ProcessPoolExecutor(max_workers=10) as executor: + trimmed_seqs = list(executor.map(self._trim_record, seqs)) + + records = [] + for seq, record in zip(trimmed_seqs, records_stored): + if seq is not None and len(seq) >= self.min_length: + records.append(SeqRecord(seq=Seq(seq), id=record.id, + name=record.name, description=record.description)) + + if input_type == 'fasta list' or input_type == 'fastq list': + SeqIO.write(records, f"seqs_trimmed.fasta", "fasta") + else: + SeqIO.write(records, f"{input.split('.')[0]}_trimmed.fasta", "fasta") + +class BaseProteinCDSAnalyzer: + """ + Analyzes coding sequences (CDS) of proteins. + + Args: + seqs (str or list): Path to FASTA file or list of sequences. + ref_seqs (str or list): Path to reference FASTA file or list of reference sequences. + input_type (str): Type of input, either 'fasta' or 'list'. + """ + + def __init__(self, seqs, ref_seqs, input_type='fasta'): + self._load_sequences(seqs, ref_seqs, input_type) + self._run_pipeline() + + def _load_sequences(self, seqs, ref_seqs, input_type): + """ + Loads sequences from input file or list. + + Args: + seqs (str or list): Path to FASTA file or list of sequences. + ref_seqs (str or list): Path to reference FASTA file or list of reference sequences. + input_type (str): Type of input, either 'fasta' or 'list'. + """ + if input_type == 'fasta': + self.data = pd.DataFrame([str(record.seq).upper() for record in SeqIO.parse(seqs, "fasta")], columns=['seqs']) + self.ref_seq = str(next(SeqIO.parse(ref_seqs, "fasta")).seq).upper() + elif input_type == 'list': + self.data = pd.DataFrame(seqs, columns=['seqs']) + self.ref_seq = ref_seqs[0] + + def _align_sequences(self, query_sequence): + """ + Aligns a query sequence to the reference sequence. + + Args: + query_sequence (str): The sequence to align. + + Returns: + list: Aligned sequence and its length. + """ + aligner = Align.PairwiseAligner() + aligner.mode = 'global' + aligner.match_score = 2 + aligner.mismatch_score = 0 + aligner.open_gap_score = -4 + aligner.extend_gap_score = -2 + alignment = next(aligner.align(self.ref_seq, query_sequence)) + return [alignment[1], len(alignment[1])] + + def _align_sequences_multithreaded(self): + """Aligns sequences using multiple threads for improved performance.""" + with ProcessPoolExecutor() as executor: + results = executor.map(self._align_sequences, self.data['seqs']) + self.data[['aligned_seqs', 'aligned_seqs_length']] = pd.DataFrame(list(results)) + + def _generate_mutation_name(self, input_list): + """ + Generates a mutation name from a list of mutations. + + Args: + input_list (list): List of mutations. + + Returns: + str: Generated mutation name. + """ + if not input_list: + return 'WT' + if input_list[0] in ['indel', 'deletion', 'contains_N']: + return input_list[0] + return '/'.join(sorted(input_list, key=lambda s: int(''.join(filter(str.isdigit, s))))) + + def _compare_codon_to_ref(self, sequence): + """ + Compares codons in a sequence to the reference sequence. + + Args: + sequence (str): The sequence to compare. + + Returns: + tuple: Dictionary of mutation counts and dictionary of mutation details. + """ + ref_codon_seq = [self.ref_seq[i:i+3] for i in range(0, len(self.ref_seq), 3)] + codon_seq = [sequence[i:i+3] for i in range(0, len(sequence), 3)] + + if 'N' in sequence: + return [0, 0, 0, 0, [], ['contains_N'], [], [], 'contains_N'] + + if "-" in sequence: + return [0, 0, 0, 0, [], ['deletion'], [], [], 'deletion'] + + if len(sequence) > len(self.ref_seq): + return [0, 0, 0, 0, [], ['indel'], [], [], 'indel'] + + if len(sequence) == len(self.ref_seq): + muts = [0, 0, 0, 0] + seq_mutations = [[], [], [], [], ''] + for pos, (codon, ref_codon) in enumerate(zip(codon_seq, ref_codon_seq), 1): + mismatches = sum(c1 != c2 for c1, c2 in zip(codon, ref_codon)) + if mismatches: + seq_mutations[mismatches].append(ref_codon + str(pos) + codon) + muts[mismatches] += 1 + return muts + seq_mutations + + def _compare_codon_to_ref_multithreaded(self): + """Compares codons to reference using multiple threads for improved efficiency.""" + with ProcessPoolExecutor() as executor: + results = executor.map(self._compare_codon_to_ref, self.data['aligned_seqs']) + self.data[['Num_Changes_0', 'Num_Changes_1', 'Num_Changes_2', 'Num_Changes_3', + 'nt_0_mut', 'nt_1_mut', 'nt_2_mut', 'nt_3_mut', 'error']] = pd.DataFrame(list(results)) + + def _convert_codon_mut_to_aa_mut(self, codon_mut_ls): + """ + Converts codon mutations to amino acid mutations. + + Args: + codon_mut_ls (list): List of codon mutations. + + Returns: + list: List of amino acid mutations. + """ + aa_mut_ls = [] + for mut in codon_mut_ls: + if mut in ['indel', 'deletion']: + aa_mut_ls.append(mut) + continue + match = re.match(r'([a-zA-Z]+)(\d+)([a-zA-Z]+)', mut) + if match: + part1, part2, part3 = match.groups() + aa_i = str(Seq(part1).translate()) + aa_f = str(Seq(part3).translate()) + aa_mut_ls.append(aa_i + part2 + aa_f) + return [aa_mut_ls] + + def _convert_codon_mut_to_aa_mut_multithreaded(self): + """Converts codon mutations to amino acid mutations using multiple threads for better performance.""" + with ProcessPoolExecutor() as executor: + results = executor.map(self._convert_codon_mut_to_aa_mut, self.data['codon_mut_ls']) + self.data['aa_mut_ls'] = pd.DataFrame(list(results)) + self.data['aa_mutation'] = self.data['aa_mut_ls'].apply(self._generate_mutation_name) + + def _generate_mutation_names_all(self): + """Generates mutation names for all sequences in the dataset.""" + self.data['codon_mut_ls'] = self.data['nt_1_mut'] + self.data['nt_2_mut'] + self.data['nt_3_mut'] + self.data['codon_mutation'] = self.data['codon_mut_ls'].apply(self._generate_mutation_name) + + def _run_pipeline(self): + """Executes the full analysis pipeline.""" + self._align_sequences_multithreaded() + self._compare_codon_to_ref_multithreaded() + self._generate_mutation_names_all() + self._convert_codon_mut_to_aa_mut_multithreaded() + self.mutants = self.data[['aa_mut_ls','aa_mutation']] + +class RawNanoporeProteinCDSAnalyzer(BaseProteinCDSAnalyzer): + """ + Manages raw nanopore sequencing data with high error rate. + + Inherits from BaseProteinCDSAnalyzer. + """ + + def _remove_insertions(self, reference_aligned, query_aligned): + """ + Removes insertions from aligned query sequence. + + Args: + reference_aligned (str): Aligned reference sequence. + query_aligned (str): Aligned query sequence. + + Returns: + str: Query sequence with insertions removed. + """ + return ''.join(char for i, char in enumerate(query_aligned) if reference_aligned[i] != '-') + + def _align_sequences(self, query_sequence): + """ + Aligns a query sequence to the reference sequence, removing insertions. + + Args: + query_sequence (str): The sequence to align. + + Returns: + list: Aligned sequence without insertions and its length. + """ + aligner = Align.PairwiseAligner() + aligner.mode = 'global' + aligner.match_score = 2 + aligner.mismatch_score = 0 + aligner.open_gap_score = aligner.extend_gap_score = -2 + alignment = next(aligner.align(self.ref_seq, query_sequence)) + query_aligned_no_ins = self._remove_insertions(*alignment) + return [query_aligned_no_ins, len(query_aligned_no_ins)] + + # def _generate_mutation_names_all(self): + # """Generates mutation names for all sequences, considering only 2 and 3 nucleotide changes.""" + # self.data['codon_mut_ls'] = self.data['nt_2_mut'] + self.data['nt_3_mut'] + # self.data['codon_mutation'] = self.data['codon_mut_ls'].apply(self._generate_mutation_name) + + def _compare_codon_to_ref(self, sequence): + """ + Compares codons in a sequence to the reference sequence, ignoring deletions within codons. + + Args: + sequence (str): The sequence to compare. + + Returns: + tuple: Dictionary of mutation counts and dictionary of mutation details. + """ + ref_codon_seq = [self.ref_seq[i:i+3] for i in range(0, len(self.ref_seq), 3)] + codon_seq = [sequence[i:i+3] for i in range(0, len(sequence), 3)] + + muts = [0, 0, 0, 0] + seq_mutations = [[], [], [], [], ''] + for pos, (codon, ref_codon) in enumerate(zip(codon_seq, ref_codon_seq), 1): + mismatches = sum(c1 != c2 for c1, c2 in zip(codon, ref_codon)) + if mismatches: + seq_mutations[mismatches].append(ref_codon + str(pos) + codon) + muts[mismatches] += 1 + return muts + seq_mutations \ No newline at end of file diff --git a/model/utils/data_utils.py b/model/utils/data_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..88c9d090f4fb8c7a2000dce029812acc5d8203b8 --- /dev/null +++ b/model/utils/data_utils.py @@ -0,0 +1,610 @@ +# This utils page is for functions for manipulation and handling datasets + +from concurrent.futures import ProcessPoolExecutor +import re +import math + +import pandas as pd +import numpy as np +import Levenshtein +from torch.utils.data import DataLoader, Dataset +import torch + +# Given a set of mutations separated by "/" (e.g "G19S/R420G"), convert it into a list; if given 'WT', return ['WT'] +def convert_mutation_list(string): + """ + Convert a mutation string into a list of mutations. + + Args: + - string (str): Mutation string separated by "/" (e.g. "G19S/R420G") or 'WT'. + + Returns: + - list: List of mutations or ['WT'] if input is 'WT'. + """ + if isinstance(string, float) and math.isnan(string): + return ['WT'] + else: + mutation_list = string.split('/') + filtered_mutation_list = [mutation for mutation in mutation_list if re.search(r'[a-zA-Z]\d+[a-zA-Z]', mutation) or mutation == 'WT'] + return filtered_mutation_list + +# Given a wild-type sequence and a list of mutations, generate the mutant sequence +def make_mutations(seq, mutations): + """ + Given a wild-type sequence and a list of mutations, generate the mutant sequence. + + Args: + - seq (str): Wild-type sequence. + - mutations (list): List of mutations (e.g. ["G19S", "R420G"]). + + Returns: + - str: Mutant sequence. + """ + mut_seq = [char for char in seq] + + for mutation in mutations: + if mutation == 'WT': + break + else: + wt, pos, mt = mutation[0], int(mutation[1:-1]) - 1, mutation[-1] + assert seq[pos] == wt, f"{wt}{pos+1}{mt} is not a true mutation from {seq[pos]}{pos+1}" + mut_seq[pos] = mt + mut_seq = ''.join(mut_seq).replace('-', '') + return mut_seq + +def mutation_format_check(mutation): + """ + Check the format of the mutation. + + Args: + - mutation (str or list): Mutation in string or list format. + + Returns: + - str: Format of the mutation ('Mutation String', 'Mutation List', or 'Full Sequence'). + """ + if type(mutation) == str: + if re.search(r'[a-zA-Z]\d+[a-zA-Z]', mutation) or mutation == 'WT': + return 'Mutation String' + else: + return 'Full Sequence' + + if type(mutation) == list or type(mutation) == tuple: + assert re.search(r'[a-zA-Z]\d+[a-zA-Z]', mutation[0]), f"{mutation[0]} is not a true mutation" + return 'Mutation List' + + raise ValueError('mutation not in Mutation String, Mutation List, or Full Sequence format') + +def find_mutation_positions(seq1, seq2): + """ + Find the positions of mutations between two sequences. + + Args: + - seq1 (str): First sequence (wild-type). + - seq2 (str): Second sequence (mutant). + + Returns: + - list: List of mutation positions. + """ + mutation_set = [] + pos1 = 0 + + for wt, mt in zip(seq1, seq2): + pos1 += 1 + if wt != mt: + mut_str = pos1 + mutation_set.append(mut_str) + + if len(mutation_set) == 0: + mutation_set = [0] + + return mutation_set + +def find_mutation_positions_helper(args): + """ + Helper function to find mutation positions. + + Args: + - args (tuple): Tuple containing wild-type sequence and mutant sequence. + + Returns: + - list: List of mutation positions. + """ + wt_seq, seq = args + seq = seq.replace('X', '') + mutation_set = find_mutation_positions(wt_seq, seq) + return mutation_set + +def find_mutation_positions_multithreaded(wt_seq, seqs): + """ + Find mutation positions using multithreading. + + Args: + - wt_seq (str): Wild-type sequence. + - seqs (list): List of mutant sequences. + + Returns: + - list: List of mutation positions for each mutant sequence. + """ + args = [(wt_seq, seq) for seq in seqs] + with ProcessPoolExecutor() as executor: + mutation_sets = executor.map(find_mutation_positions_helper, args) + return list(mutation_sets) + +def find_mutations(seq1, seq2): + """ + Find mutations between two sequences. + + Args: + - seq1 (str): First sequence (wild-type). + - seq2 (str): Second sequence (mutant). + + Returns: + - list: List of mutations in the format 'wt_pos_mt'. + """ + mutation_set = [] + pos1 = 0 + for wt, mt in zip(seq1, seq2): + pos1 += 1 + if wt != mt: + mut_str = f'{wt}{pos1}{mt}' + mutation_set.append(mut_str) + + return mutation_set + +def find_mutations_helper(args): + """ + Helper function to find mutations. + + Args: + - args (tuple): Tuple containing wild-type sequence and mutant sequence. + + Returns: + - list: List of mutations in the format 'wt_pos_mt'. + """ + wt_seq, seq = args + seq = seq.replace('X', '') + mutation_set = find_mutations(wt_seq, seq) + return mutation_set + +def find_mutations_multithreaded(wt_seq, seqs): + """ + Find mutations using multithreading. + + Args: + - wt_seq (str): Wild-type sequence. + - seqs (list): List of mutant sequences. + + Returns: + - list: List of mutations for each mutant sequence. + """ + args = [(wt_seq, seq) for seq in seqs] + with ProcessPoolExecutor() as executor: + mutations = list(executor.map(find_mutations_helper, args)) + return mutations + +class MutationFormat: + """ + Class to handle different mutation formats. + + Attributes: + mutation (str or list): The mutation in its original format. + wt_seq (str): The wild-type sequence. + format (str): The determined format of the mutation. + formats (dict): Dictionary storing the mutation in different formats. + """ + def __init__(self, mutation, wt_seq): + """ + Initialize MutationFormat. + + Args: + - mutation (str or list): Mutation in string or list format. + - wt_seq (str): Wild-type sequence. + """ + self.mutation = mutation + self.wt_seq = wt_seq + self._determine_type() + self.formats = {} + self.formats[self.format] = mutation + + def _determine_type(self): + """ + Determine the format of the mutation. + """ + self.format = mutation_format_check(self.mutation) + + def to_full_sequence(self): + """ + Convert mutation to full sequence format. + + Returns: + - str: Full sequence. + """ + if 'Full Sequence' in self.formats.keys(): + return self.formats['Full Sequence'] + + if 'Mutation List' in self.formats.keys(): + full_sequence = make_mutations(self.wt_seq, self.formats['Mutation List']) + self.formats['Full Sequence'] = full_sequence + return full_sequence + + if 'Mutation String' in self.formats.keys(): + mutation_list = self.formats['Mutation String'].split('/') + full_sequence = make_mutations(self.wt_seq, mutation_list) + self.formats['Mutation List'] = mutation_list + self.formats['Full Sequence'] = full_sequence + return full_sequence + + def to_mutation_list(self): + """ + Convert mutation to mutation list format. + + Returns: + - list: List of mutations. + """ + if 'Mutation List' in self.formats.keys(): + return self.formats['Mutation List'] + + if 'Mutation String' in self.formats.keys(): + mutation_list = self.formats['Mutation String'].split('/') + self.formats['Mutation List'] = mutation_list + return mutation_list + + if 'Full Sequence' in self.formats.keys(): + mutation_list = find_mutations(self.wt_seq, self.formats['Full Sequence']) + self.formats['Mutation List'] = mutation_list + return mutation_list + + def to_mutation_string(self): + """ + Convert mutation to mutation string format. + + Returns: + - str: Mutation string. + """ + if 'Mutation String' in self.formats.keys(): + return self.formats['Mutation String'] + + if 'Mutation List' in self.formats.keys(): + mutation_string = "/".join(self.formats['Mutation List']) + self.formats['Mutation String'] = mutation_string + return mutation_string + + if 'Full Sequence' in self.formats.keys(): + mutation_list = find_mutations(self.wt_seq, self.formats['Full Sequence']) + mutation_string = "/".join(mutation_list) + self.formats['Mutation List'] = mutation_list + self.formats['Mutation String'] = mutation_string + return mutation_string + +class MutationListFormats: + """ + Class to handle different formats of mutation lists. + + Attributes: + mutation_list (list): List of mutations. + wt_seq (str): The wild-type sequence. + format (str): The determined format of the mutations. + formats (dict): Dictionary storing the mutations in different formats. + + Example Usage: + + muts = pd.read_csv('muts.csv', header=None) # load csv file with sequences in first column + muts_ls = muts[0].tolist() + mut_seqs = MutationListFormats(muts_ls, wt_seq) + + # get mutation strings + muts['mut_strings'] = mut_seqs.to_mutation_strings() + + # get mutation lists + muts['mut_lists'] = mut_seqs.to_mutation_lists() + + # get full sequences + muts['full_seqs'] = mut_seqs.to_full_sequences() + + """ + def __init__(self, mutation_list, wt_seq): + """ + Initialize MutationListFormats. + + Args: + - mutation_list (list or pd.Series or pd.DataFrame): List of mutations. + - wt_seq (str): Wild-type sequence. + """ + if isinstance(mutation_list, pd.Series): + mutation_list = mutation_list.tolist() + elif isinstance(mutation_list, pd.DataFrame): + cols = mutation_list.columns + mutation_list = mutation_list[cols[0]].tolist() + assert isinstance(mutation_list, list), 'mutation_list must be a list' + self.mutation_list = mutation_list + self.wt_seq = wt_seq + self._determine_type(mutation_list[0]) + self.formats = {} + self.formats[self.format] = self.mutation_list + + def _determine_type(self, mutation): + """ + Determine the format of the mutation. + + Args: + - mutation (str): Mutation in string format. + """ + self.format = mutation_format_check(mutation) + + def to_full_sequences(self): + """ + Convert mutation list to full sequences format. + + Returns: + - list: List of full sequences. + """ + if 'Full Sequence' in self.formats.keys(): + return self.formats['Full Sequence'] + + if 'Mutation List' in self.formats.keys(): + full_sequences = [make_mutations(self.wt_seq, mutation_list) for mutation_list in self.formats['Mutation List']] + self.formats['Full Sequences'] = full_sequences + return full_sequences + + if 'Mutation String' in self.formats.keys(): + mutation_lists = [mutation_string.split('/') for mutation_string in self.formats['Mutation String']] + full_sequences = [make_mutations(self.wt_seq, mutation_list) for mutation_list in mutation_lists] + self.formats['Mutation Lists'] = mutation_lists + self.formats['Full Sequences'] = full_sequences + return full_sequences + + def to_mutation_lists(self): + """ + Convert mutation list to mutation lists format. + + Returns: + - list: List of mutation lists. + """ + if 'Mutation List' in self.formats.keys(): + return self.formats['Mutation List'] + + if 'Mutation String' in self.formats.keys(): + mutation_lists = [mutation_string.split('/') for mutation_string in self.formats['Mutation String']] + self.formats['Mutation Lists'] = mutation_lists + return mutation_lists + + if 'Full Sequence' in self.formats.keys(): + mutation_lists = find_mutations_multithreaded(self.wt_seq, self.formats['Full Sequence']) + self.formats['Mutation Lists'] = mutation_lists + return mutation_lists + + def to_mutation_strings(self): + """ + Convert mutation list to mutation strings format. + + Returns: + - list: List of mutation strings. + """ + if 'Mutation String' in self.formats.keys(): + return self.formats['Mutation String'] + + if 'Mutation List' in self.formats.keys(): + mutation_strings = ["/".join(mutation_list) for mutation_list in self.formats['Mutation List']] + self.formats['Mutation Strings'] = mutation_strings + return mutation_strings + + if 'Full Sequence' in self.formats.keys(): + mutation_lists = find_mutations_multithreaded(self.wt_seq, self.formats['Full Sequence']) + mutation_strings = ["/".join(mutation_list) for mutation_list in mutation_lists] + self.formats['Mutation Lists'] = mutation_lists + self.formats['Mutation Strings'] = mutation_strings + return mutation_strings + + def get_mutation_pool(self): + """ + Get all the pool of single mutations in the mutation list. + + Returns: + - list: List of unique single mutations. + """ + mutation_lists = self.to_mutation_lists() + mutation_pool = set() + for mutation_list in mutation_lists: + mutation_pool.update(mutation_list) + return list(mutation_pool) + +# This code snippet was taken from https://github.com/VincentQTran/low-N-protein-engineering/blob/master/analysis/common/utils.py +def levenshtein_distance_matrix(a_list, b_list=None, verbose=False): + """ + Computes a len(a_list) x len(b_list) Levenshtein distance matrix. + + Args: + - a_list (list): List of sequences. + - b_list (list, optional): List of sequences. If None, computes the distance matrix for a_list against itself. + - verbose (bool, optional): If True, prints progress. + + Returns: + - np.ndarray: Levenshtein distance matrix. + """ + if b_list is None: + single_list = True + b_list = a_list + else: + single_list = False + + H = np.zeros(shape=(len(a_list), len(b_list))) + for i in range(len(a_list)): + if verbose: + print(i) + + if single_list: + # only compute upper triangle. + for j in range(i+1, len(b_list)): + H[i, j] = Levenshtein.distance(a_list[i], b_list[j]) + H[j, i] = H[i, j] + else: + for j in range(len(b_list)): + H[i, j] = Levenshtein.distance(a_list[i], b_list[j]) + + return H + +# Classes to handle data +class TorchCustomDataset(Dataset): + """ + Class to create a PyTorch dataset from a list of sequences and labels. + + Attributes: + encodings (list): List of encoded sequences. + labels (list): List of labels corresponding to the sequences. + original_sequences (list): List of original sequences before encoding. + """ + def __init__(self, encodings, labels, original_sequences): + """ + Initialize TorchCustomDataset. + + Args: + - encodings (list): List of encoded sequences. + - labels (list): List of labels. + - original_sequences (list): List of original sequences. + """ + self.encodings = encodings + self.labels = labels + self.original_sequences = original_sequences + + def __len__(self): + """ + Get the number of samples in the dataset. + + Returns: + - int: Number of samples. + """ + return len(self.labels) + + def __getitem__(self, idx): + """ + Get a sample from the dataset. + + Args: + - idx (int): Index of the sample. + + Returns: + - tuple: Encoded sequence, label, and original sequence. + """ + return self.encodings[idx], self.labels[idx], self.original_sequences[idx] + +class TorchDataProcessor: + """ + Processes data for neural network models. + + Attributes: + featurizer (object): Object to featurize sequences. + X_train, X_val, X_test (list): Lists of sequences for training, validation, and testing. + y_train, y_val, y_test (list): Lists of labels for training, validation, and testing. + split_name (str): Name of the data split. + bs (int): Batch size for data loading. + X_train_feat, X_val_feat, X_test_feat (np.array): Featurized sequences. + train_dataset, val_dataset, test_dataset (TorchCustomDataset): PyTorch datasets. + train_loader, val_loader, test_loader (DataLoader): PyTorch DataLoaders. + """ + def __init__(self, split, featurizer, batch_size): + """ + Initialize TorchDataProcessor. + + Args: + - split (object): Object containing data splits. + - featurizer (object): Object to featurize sequences. + - batch_size (int): Batch size for data loading. + """ + self.featurizer = featurizer + ( + self.X_train, + self.X_val, + self.X_test, + self.y_train, + self.y_val, + self.y_test, + self.split_name, + ) = ( + split.splits['X_train'], + split.splits['X_val'], + split.splits['X_test'], + split.splits['y_train'], + split.splits['y_val'], + split.splits['y_test'], + split.splits['split_name'], + ) + + self.bs = batch_size + + def featurize(self, X): + """ + Featurizes a list of sequences X. + + Args: + - X (list): List of sequences. + + Returns: + - list: List of featurized sequences. + """ + X_featurized = self.featurizer.featurize(X) + return X_featurized + + def setup_train_loader(self): + """ + Setup the train loader if not already created. + """ + if hasattr(self, 'train_loader'): + return self.train_loader + + print("Featurizing training data...") + self.X_train_feat = self.featurizer.featurize(self.X_train) + + self.train_dataset = TorchCustomDataset( + torch.from_numpy(self.X_train_feat.astype(np.float32)), + torch.from_numpy(self.y_train.astype(np.float32)), + self.X_train + ) + + self.train_loader = DataLoader(self.train_dataset, batch_size=self.bs, shuffle=True) + return self.train_loader + + def setup_val_loader(self): + """ + Setup the validation loader if not already created. + """ + if hasattr(self, 'val_loader'): + return self.val_loader + + print("Featurizing validation data...") + self.X_val_feat = self.featurizer.featurize(self.X_val) + + self.val_dataset = TorchCustomDataset( + torch.from_numpy(self.X_val_feat.astype(np.float32)), + torch.from_numpy(self.y_val.astype(np.float32)), + self.X_val + ) + + self.val_loader = DataLoader(self.val_dataset, batch_size=self.bs, shuffle=True) + return self.val_loader + + def setup_test_loader(self): + """ + Setup the test loader if not already created. + """ + if hasattr(self, 'test_loader'): + return self.test_loader + + print("Featurizing testing data...") + self.X_test_feat = self.featurizer.featurize(self.X_test) + + self.test_dataset = TorchCustomDataset( + torch.from_numpy(self.X_test_feat.astype(np.float32)), + torch.from_numpy(self.y_test.astype(np.float32)), + self.X_test + ) + + self.test_loader = DataLoader(self.test_dataset, batch_size=self.bs, shuffle=True) + return self.test_loader + + def preprocess_data(self): + """ + Set up all data loaders. + """ + self.setup_train_loader() + self.setup_val_loader() + self.setup_test_loader() \ No newline at end of file diff --git a/model/utils/featurizer_utils.py b/model/utils/featurizer_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..3224629fe4ab02a83f81863030ffc321ba15a059 --- /dev/null +++ b/model/utils/featurizer_utils.py @@ -0,0 +1,212 @@ +# This module contains utility functions and classes for feature extraction from protein sequences + +import numpy as np +import string +from typing import Tuple, List +import os + +from Bio import SeqIO +from scipy.spatial.distance import cdist + +"""Base Featurizer Functions""" + +# Code acquired from Chloe Hsu's 2022 paper and github: https://github.com/chloechsu/combining-evolutionary-and-assay-labelled-data/blob/main/src/utils/georgiev_utils.py +# This section of code is copied from ProFET (Ofer & Linial, DOI: 10.1093/bioinformatics/btv345) +# Original comment by the ProFET authors: 'Acquired from georgiev's paper of +# AAscales using helper script "GetTextData.py". + RegEx cleaning DOI: 10.1089/cmb.2008.0173' +gg_1 = {'Q': -2.54, 'L': 2.72, 'T': -0.65, 'C': 2.66, 'I': 3.1, 'G': 0.15, 'V': 2.64, 'K': -3.89, 'M': 1.89, 'F': 3.12, 'N': -2.02, 'R': -2.8, 'H': -0.39, 'E': -3.08, 'W': 1.89, 'A': 0.57, 'D': -2.46, 'Y': 0.79, 'S': -1.1, 'P': -0.58, '*': 0} +gg_2 = {'Q': 1.82, 'L': 1.88, 'T': -1.6, 'C': -1.52, 'I': 0.37, 'G': -3.49, 'V': 0.03, 'K': 1.47, 'M': 3.88, 'F': 0.68, 'N': -1.92, 'R': 0.31, 'H': 1, 'E': 3.45, 'W': -0.09, 'A': 3.37, 'D': -0.66, 'Y': -2.62, 'S': -2.05, 'P': -4.33, '*': 0} +gg_3 = {'Q': -0.82, 'L': 1.92, 'T': -1.39, 'C': -3.29, 'I': 0.26, 'G': -2.97, 'V': -0.67, 'K': 1.95, 'M': -1.57, 'F': 2.4, 'N': 0.04, 'R': 2.84, 'H': -0.63, 'E': 0.05, 'W': 4.21, 'A': -3.66, 'D': -0.57, 'Y': 4.11, 'S': -2.19, 'P': -0.02, '*': 0} +gg_4 = {'Q': -1.85, 'L': 5.33, 'T': 0.63, 'C': -3.77, 'I': 1.04, 'G': 2.06, 'V': 2.34, 'K': 1.17, 'M': -3.58, 'F': -0.35, 'N': -0.65, 'R': 0.25, 'H': -3.49, 'E': 0.62, 'W': -2.77, 'A': 2.34, 'D': 0.14, 'Y': -0.63, 'S': 1.36, 'P': -0.21, '*': 0} +gg_5 = {'Q': 0.09, 'L': 0.08, 'T': 1.35, 'C': 2.96, 'I': -0.05, 'G': 0.7, 'V': 0.64, 'K': 0.53, 'M': -2.55, 'F': -0.88, 'N': 1.61, 'R': 0.2, 'H': 0.05, 'E': -0.49, 'W': 0.72, 'A': -1.07, 'D': 0.75, 'Y': 1.89, 'S': 1.78, 'P': -8.31, '*': 0} +gg_6 = {'Q': 0.6, 'L': 0.09, 'T': -2.45, 'C': -2.23, 'I': -1.18, 'G': 7.47, 'V': -2.01, 'K': 0.1, 'M': 2.07, 'F': 1.62, 'N': 2.08, 'R': -0.37, 'H': 0.41, 'E': 0, 'W': 0.86, 'A': -0.4, 'D': 0.24, 'Y': -0.53, 'S': -3.36, 'P': -1.82, '*': 0} +gg_7 = {'Q': 0.25, 'L': 0.27, 'T': -0.65, 'C': 0.44, 'I': -0.21, 'G': 0.41, 'V': -0.33, 'K': 4.01, 'M': 0.84, 'F': -0.15, 'N': 0.4, 'R': 3.81, 'H': 1.61, 'E': -5.66, 'W': -1.07, 'A': 1.23, 'D': -5.15, 'Y': -1.3, 'S': 1.39, 'P': -0.12, '*': 0} +gg_8 = {'Q': 2.11, 'L': -4.06, 'T': 3.43, 'C': -3.49, 'I': 3.45, 'G': 1.62, 'V': 3.93, 'K': -0.01, 'M': 1.85, 'F': -0.41, 'N': -2.47, 'R': 0.98, 'H': -0.6, 'E': -0.11, 'W': -1.66, 'A': -2.32, 'D': -1.17, 'Y': 1.31, 'S': -1.21, 'P': -1.18, '*': 0} +gg_9 = {'Q': -1.92, 'L': 0.43, 'T': 0.34, 'C': 2.22, 'I': 0.86, 'G': -0.47, 'V': -0.21, 'K': -0.26, 'M': -2.05, 'F': 4.2, 'N': -0.07, 'R': 2.43, 'H': 3.55, 'E': 1.49, 'W': -5.87, 'A': -2.01, 'D': 0.73, 'Y': -0.56, 'S': -2.83, 'P': 0, '*': 0} +gg_10 = {'Q': -1.67, 'L': -1.2, 'T': 0.24, 'C': -3.78, 'I': 1.98, 'G': -2.9, 'V': 1.27, 'K': -1.66, 'M': 0.78, 'F': 0.73, 'N': 7.02, 'R': -0.99, 'H': 1.52, 'E': -2.26, 'W': -0.66, 'A': 1.31, 'D': 1.5, 'Y': -0.95, 'S': 0.39, 'P': -0.66, '*': 0} +gg_11 = {'Q': 0.7, 'L': 0.67, 'T': -0.53, 'C': 1.98, 'I': 0.89, 'G': -0.98, 'V': 0.43, 'K': 5.86, 'M': 1.53, 'F': -0.56, 'N': 1.32, 'R': -4.9, 'H': -2.28, 'E': -1.62, 'W': -2.49, 'A': -1.14, 'D': 1.51, 'Y': 1.91, 'S': -2.92, 'P': 0.64, '*': 0} +gg_12 = {'Q': -0.27, 'L': -0.29, 'T': 1.91, 'C': -0.43, 'I': -1.67, 'G': -0.62, 'V': -1.71, 'K': -0.06, 'M': 2.44, 'F': 3.54, 'N': -2.44, 'R': 2.09, 'H': -3.12, 'E': -3.97, 'W': -0.3, 'A': 0.19, 'D': 5.61, 'Y': -1.26, 'S': 1.27, 'P': -0.92, '*': 0} +gg_13 = {'Q': -0.99, 'L': -2.47, 'T': 2.66, 'C': -1.03, 'I': -1.02, 'G': -0.11, 'V': -2.93, 'K': 1.38, 'M': -0.26, 'F': 5.25, 'N': 0.37, 'R': -3.08, 'H': -1.45, 'E': 2.3, 'W': -0.5, 'A': 1.66, 'D': -3.85, 'Y': 1.57, 'S': 2.86, 'P': -0.37, '*': 0} +gg_14 = {'Q': -1.56, 'L': -4.79, 'T': -3.07, 'C': 0.93, 'I': -1.21, 'G': 0.15, 'V': 4.22, 'K': 1.78, 'M': -3.09, 'F': 1.73, 'N': -0.89, 'R': 0.82, 'H': -0.77, 'E': -0.06, 'W': 1.64, 'A': 4.39, 'D': 1.28, 'Y': 0.2, 'S': -1.88, 'P': 0.17, '*': 0} +gg_15 = {'Q': 6.22, 'L': 0.8, 'T': 0.2, 'C': 1.43, 'I': -1.78, 'G': -0.53, 'V': 1.06, 'K': -2.71, 'M': -1.39, 'F': 2.14, 'N': 3.13, 'R': 1.32, 'H': -4.18, 'E': -0.35, 'W': -0.72, 'A': 0.18, 'D': -1.98, 'Y': -0.76, 'S': -2.42, 'P': 0.36, '*': 0} +gg_16 = {'Q': -0.18, 'L': -1.43, 'T': -2.2, 'C': 1.45, 'I': 5.71, 'G': 0.35, 'V': -1.31, 'K': 1.62, 'M': -1.02, 'F': 1.1, 'N': 0.79, 'R': 0.69, 'H': -2.91, 'E': 1.51, 'W': 1.75, 'A': -2.6, 'D': 0.05, 'Y': -5.19, 'S': 1.75, 'P': 0.08, '*': 0} +gg_17 = {'Q': 2.72, 'L': 0.63, 'T': 3.73, 'C': -1.15, 'I': 1.54, 'G': 0.3, 'V': -1.97, 'K': 0.96, 'M': -4.32, 'F': 0.68, 'N': -1.54, 'R': -2.62, 'H': 3.37, 'E': -2.29, 'W': 2.73, 'A': 1.49, 'D': 0.9, 'Y': -2.56, 'S': -2.77, 'P': 0.16, '*': 0} +gg_18 = {'Q': 4.35, 'L': -0.24, 'T': -5.46, 'C': -1.64, 'I': 2.11, 'G': 0.32, 'V': -1.21, 'K': -1.09, 'M': -1.34, 'F': 1.46, 'N': -1.71, 'R': -1.49, 'H': 1.87, 'E': -1.47, 'W': -2.2, 'A': 0.46, 'D': 1.38, 'Y': 2.87, 'S': 3.36, 'P': -0.34, '*': 0} +gg_19 = {'Q': 0.92, 'L': 1.01, 'T': -0.73, 'C': -1.05, 'I': -4.18, 'G': 0.05, 'V': 4.77, 'K': 1.36, 'M': 0.09, 'F': 2.33, 'N': -0.25, 'R': -2.57, 'H': 2.17, 'E': 0.15, 'W': 0.9, 'A': -4.22, 'D': -0.03, 'Y': -3.43, 'S': 2.67, 'P': 0.04, '*': 0} + +# Package all georgiev parameters +georgiev_parameters = [gg_1, gg_2, gg_3, gg_4, gg_5, gg_6, gg_7, gg_8, gg_9, + gg_10, gg_11, gg_12, gg_13, gg_14, gg_15, gg_16, gg_17, + gg_18, gg_19] + +def get_georgiev_params_for_aa(aa: str) -> List[float]: + """ + Get Georgiev parameters for a given amino acid. + + Args: + aa (str): Amino acid character. + + Returns: + List[float]: List of Georgiev parameters for the given amino acid. + """ + return [gg[aa] for gg in georgiev_parameters] + +def get_georgiev_params_for_seq(s: str) -> np.ndarray: + """ + Get Georgiev parameters for a given sequence. + + Args: + s (str): Amino acid sequence. + + Returns: + np.ndarray: Array of Georgiev parameters for the given sequence. + """ + return np.array([get_georgiev_params_for_aa(aa) for aa in s]) + +def seqs_to_georgiev(seqs: List[str]) -> np.ndarray: + """ + Convert a list of sequences to Georgiev parameters. + + Args: + seqs (List[str]): List of amino acid sequences. + + Returns: + np.ndarray: Array of Georgiev parameters for the given sequences. + """ + return np.stack([get_georgiev_params_for_seq(s) for s in seqs]) + +def featurize_aa_idx(seqs: List[str]) -> np.ndarray: + """ + Featurize amino acid sequences using PCA features. + + Args: + seqs (List[str]): List of amino acid sequences. + + Returns: + np.ndarray: Array of featurized sequences. + """ + # Code adapted from Sam Gelman's 2021 paper and github: https://github.com/gitter-lab/nn4dms.git + + # list of chars that can be encountered in any sequence + CHARS = ["*", "A", "C", "D", "E", "F", "G", "H", "I", "K", "L", + "M", "N", "P", "Q", "R", "S", "T", "V", "W", "Y"] + + # dictionary mapping chars->int + C2I_MAPPING = {c: i for i, c in enumerate(CHARS)} + + current_directory = os.path.dirname(os.path.abspath(__file__)) + aa_features = np.load(os.path.join(current_directory, "pca-19.npy")) + aa_features = np.insert(aa_features, 0, np.zeros(aa_features.shape[1]), axis=0) + + X = [] + + for seq in seqs: + seq_feat = [] + for aa in seq: + seq_feat.append(aa_features[C2I_MAPPING[aa]]) + seq_feat = np.array(seq_feat) + X.append(seq_feat) + + X = np.stack(X) + + return X + + +"""MSA Featurizer Utils""" + +# This is an efficient way to delete lowercase characters and insertion characters from a string +deletekeys = dict.fromkeys(string.ascii_lowercase) +deletekeys["."] = None +deletekeys["*"] = None +translation = str.maketrans(deletekeys) + +def read_sequence(filename: str) -> Tuple[str, str]: + """ + Reads the first (reference) sequences from a fasta or MSA file. + + Args: + filename (str): Path to the fasta or MSA file. + + Returns: + Tuple[str, str]: Description and sequence of the first record. + """ + record = next(SeqIO.parse(filename, "fasta")) + return record.description, str(record.seq) + +def remove_insertions(sequence: str) -> str: + """ + Removes any insertions into the sequence. Needed to load aligned sequences in an MSA. + + Args: + sequence (str): Amino acid sequence. + + Returns: + str: Sequence with insertions removed. + """ + return sequence.translate(translation) + +def read_msa(filename: str) -> List[Tuple[str, str]]: + """ + Reads the sequences from an MSA file, automatically removes insertions. + + Args: + filename (str): Path to the MSA file. + + Returns: + List[Tuple[str, str]]: List of tuples containing description and sequence. + """ + return [(record.description, remove_insertions(str(record.seq))) for record in SeqIO.parse(filename, "fasta")] + +def greedy_select(msa: List[Tuple[str, str]], num_seqs: int, mode: str = "max") -> List[Tuple[str, str]]: + """ + Select sequences from the MSA to maximize the hamming distance. + + Args: + msa (List[Tuple[str, str]]): List of tuples containing description and sequence. + num_seqs (int): Number of sequences to select. + mode (str): Selection mode, either "max" or "min". + + Returns: + List[Tuple[str, str]]: List of selected sequences. + """ + assert mode in ("max", "min") + if len(msa) <= num_seqs: + return msa + + array = np.array([list(seq) for _, seq in msa], dtype=np.bytes_).view(np.uint8) + + optfunc = np.argmax if mode == "max" else np.argmin + all_indices = np.arange(len(msa)) + indices = [0] + pairwise_distances = np.zeros((0, len(msa))) + for _ in range(num_seqs - 1): + dist = cdist(array[indices[-1:]], array, "hamming") + pairwise_distances = np.concatenate([pairwise_distances, dist]) + shifted_distance = np.delete(pairwise_distances, indices, axis=1).mean(0) + shifted_index = optfunc(shifted_distance) + index = np.delete(all_indices, indices)[shifted_index] + indices.append(index) + indices = sorted(indices) + return [msa[idx] for idx in indices] + +def msa_splicer(msa: List[Tuple[str, str]]) -> List[Tuple[str, str]]: + """ + Splice the MSA into only positions where the first sequence is (remove extra positions in the MSA). + + Args: + msa (List[Tuple[str, str]]): List of tuples containing description and sequence. + + Returns: + List[Tuple[str, str]]: List of spliced sequences. + """ + # Get the positions where the first sequence in the MSA is not empty + base_sequence = msa[0][1] + positions = [i for i, _ in enumerate(base_sequence) if base_sequence[i] != '-'] + + # Apply the positions over the entire MSA + spliced_msa = [] + for name, seq in msa: + spliced_seq = [seq[i] for i in positions] + spliced_msa.append((name, ''.join(spliced_seq))) + + return spliced_msa \ No newline at end of file diff --git a/model/utils/other_utils.py b/model/utils/other_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..4dc7698f50e16fd53ec2d35c946e3b1b19d71d1f --- /dev/null +++ b/model/utils/other_utils.py @@ -0,0 +1,453 @@ +# This utils page is for functions that don't belong to any particular category + +from typing import List, Tuple +from Bio import SeqIO +import errno +import numpy as np +import os +import scipy.stats as ss +from scipy.spatial.distance import cdist +import logging +import string +import wandb +import re + +# List of amino acids, including stop codon '*' +AAs = [ + 'A', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'K', 'L', + 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'Y', + '*' +] + +aa_dict_3to1 = { + 'ALA': 'A', 'ARG': 'R', 'ASN': 'N', 'ASP': 'D', 'CYS': 'C', + 'GLU': 'E', 'GLN': 'Q', 'GLY': 'G', 'HIS': 'H', 'ILE': 'I', + 'LEU': 'L', 'LYS': 'K', 'MET': 'M', 'PHE': 'F', 'PRO': 'P', + 'SER': 'S', 'THR': 'T', 'TRP': 'W', 'TYR': 'Y', 'VAL': 'V' +} + +def load_seqs_file(fnames): + """ + Load sequences and their corresponding values from files. + + Args: + - fnames (list): List of file names to load from. + + Returns: + - tuple: Lists of sequences and their corresponding values. + """ + seqs, y = [], [] + for fname in fnames: + with open(fname) as f: + for line in f: + fields = line.strip().split('\t') + if len(fields) == 0: + raise ValueError(f'Input file {fname} has no columns.') + elif len(fields) == 1: + seqs.append(fields[0]) + y.append(float('nan')) + elif len(fields) == 2: + seqs.append(fields[0]) + y.append(float(fields[1])) + else: + raise ValueError(f'Input file {fname} has more than two columns.') + + if not seqs[-1].startswith('M'): + print(seqs[-1], y[-1]) + return seqs, y + +def performance_report(y_true, y_pred): + """ + Generate a performance report comparing true and predicted values. + + Args: + - y_true (array-like): True values. + - y_pred (array-like): Predicted values. + + Returns: + - dict: Dictionary containing various performance metrics. + """ + from sklearn.metrics import mean_squared_error, ndcg_score + + y_true = np.array(y_true) + y_pred = np.array(y_pred) + + y_true, y_pred = y_true.reshape(-1,), y_pred.reshape(-1,) + + top_10_min = y_true[np.argsort(-y_pred)[:10]].min() + top_10_mean = y_true[np.argsort(-y_pred)[:10]].mean() + top_10_max = y_true[np.argsort(-y_pred)[:10]].max() + top_1_percentile_min = y_true[np.argsort(-y_pred)[int(len(y_true)*0.01)]].min() + top_1_percentile_mean = y_true[np.argsort(-y_pred)[int(len(y_true)*0.01)]].mean() + top_1_percentile_max = y_true[np.argsort(-y_pred)[int(len(y_true)*0.01)]].max() + top_0_1_percentile_min = y_true[np.argsort(-y_pred)[int(len(y_true)*0.001)]].min() + top_0_1_percentile_mean = y_true[np.argsort(-y_pred)[int(len(y_true)*0.001)]].mean() + top_0_1_percentile_max = y_true[np.argsort(-y_pred)[int(len(y_true)*0.001)]].max() + + return { + 'MSE': mean_squared_error(y_true, y_pred), + 'Spearman r': ss.spearmanr(y_true, y_pred).correlation, + 'Spearman p': ss.spearmanr(y_true, y_pred).pvalue, + 'Pearson r': ss.pearsonr(y_true, y_pred).correlation, + 'Pearson p': ss.pearsonr(y_true, y_pred).pvalue, + 'NDCG': ndcg_score([y_true], [y_pred]), + 'Top 10 Min': top_10_min, + 'Top 10 Mean': top_10_mean, + 'Top 10 Max': top_10_max, + 'Top 1% Min': top_1_percentile_min, + 'Top 1% Mean': top_1_percentile_mean, + 'Top 1% Max': top_1_percentile_max, + 'Top 0.1% Min': top_0_1_percentile_min, + 'Top 0.1% Mean': top_0_1_percentile_mean, + 'Top 0.1% Max': top_0_1_percentile_max + } + +def log_results(stats_dict, model_object): + """ + Log results to Weights & Biases (wandb). + + Args: + - stats (dict): Dictionary containing performance statistics. + - model_object: Object containing model information. + """ + # Wandb logging + if wandb.run is not None: + # Log the plot to wandb for display + wandb.log({"Plot": wandb.Image(model_object.fig)}, commit=False) + # Log data + wandb.log( + { + "Model": model_object.model_name, + "Feature": model_object.featurizer.name, + "Split Method": model_object.split_method, + "Test Loss": stats_dict['test']['MSE'], + "Spearman - Test": stats_dict['test']['Spearman r'], + "Spearman p-value - Test": stats_dict['test']['Spearman p'], + "Pearson - Test": stats_dict['test']['Pearson r'], + "Pearson p-value - Test": stats_dict['test']['Pearson p'], + "NDCG - Test" : stats_dict['test']['NDCG'], + "Top 10 Min - Test" : stats_dict['test']['Top 10 Min'], + "Top 10 Mean - Test" : stats_dict['test']['Top 10 Mean'], + "Top 10 Max - Test" : stats_dict['test']['Top 10 Max'], + "Val Loss": stats_dict['val']['MSE'], + "Spearman - Val": stats_dict['val']['Spearman r'], + "Spearman p-value - Val": stats_dict['val']['Spearman p'], + "Pearson - Val": stats_dict['val']['Pearson r'], + "Pearson p-value - Val": stats_dict['val']['Pearson p'], + "NDCG - Val" : stats_dict['val']['NDCG'], + "Top 10 Min - Val" : stats_dict['val']['Top 10 Min'], + "Top 10 Mean - Val" : stats_dict['val']['Top 10 Mean'], + "Top 10 Max - Val" : stats_dict['val']['Top 10 Max'], + }) + +def mkdir_p(path): + """ + Create a directory if it doesn't exist. + + Args: + - path (str): Directory path to create. + """ + try: + os.makedirs(path) + except OSError as exc: # Python >2.5 + if exc.errno == errno.EEXIST and os.path.isdir(path): + pass + else: + raise + +def deep_mutational_scan(sequence, exclude_noop=True): + """ + Generate all possible single amino acid mutations for a given sequence. + + Args: + - sequence (str): Input protein sequence. + - exclude_noop (bool): If True, exclude mutations that don't change the amino acid. + + Yields: + - tuple: (position, wild-type amino acid, mutant amino acid) + """ + for pos, wt in enumerate(sequence): + for mt in AAs: + if exclude_noop and wt == mt: + continue + yield (pos, wt, mt) + +def deep_mutational_scan_seqs(sequence, exclude_stop=True): + """ + Generate all possible single amino acid mutant sequences for a given sequence. + + Args: + - sequence (str): Input protein sequence. + - exclude_stop (bool): If True, exclude mutations to stop codons. + + Returns: + - list: List of mutant sequences. + """ + sequences = [] + for pos, wt in enumerate(sequence): + for mt in AAs: + if wt == mt: + continue + if exclude_stop and mt == '*': + continue + mut_seq = sequence[:pos] + mt + sequence[pos + 1:] + sequences.append(mut_seq) + return sequences + +def dms_dict(sequence): + """ + Create a dictionary of all possible single amino acid mutations for each position in a sequence. + + Args: + - sequence (str): Input protein sequence. + + Returns: + - dict: Dictionary with positions as keys and lists of possible mutations as values. + """ + dms_dict = {} + for pos, wt in enumerate(sequence): + pos_mts = [] + for mt in AAs: + if mt != '*': + pos_mts.append(wt + str(pos + 1) + mt) + dms_dict[pos] = pos_mts + return dms_dict + +def mutational_pool_to_dict(mutational_pool, increase_wt=False): + """ + Convert a list of mutations to a dictionary grouped by position. + + Args: + - mutational_pool (list): List of mutations. + - increase_wt (bool): If True, increase the count of wild-type mutations. + + Returns: + - dict: Dictionary with positions as keys and lists of mutations as values. + """ + mutations_dict = {} + + for mutation in mutational_pool: + number = int(re.search(r'\d+', mutation).group()) + + if number not in mutations_dict: + mutations_dict[number] = [mutation] + else: + mutations_dict[number].append(mutation) + + for key in mutations_dict: + mut = mutations_dict[key][0] + wt, pos, mt = mut[0], mut[1:-1], mut[-1] + wt_value = wt+pos+wt + + if wt_value not in mutations_dict[key]: + mutations_dict[key].append(wt_value) + + if increase_wt == True: + total_mutants = len(mutations_dict[key]) - 2 + for i in range(total_mutants): + mutations_dict[key].append(wt_value) + + return mutations_dict + +def wt_only_mutational_pool_to_dict(mutational_pool, wt_seq): + """ + Create a dictionary of wild-type mutations for each position in a sequence. + + Args: + - mutational_pool (list): List of mutations. + - wt_seq (str): Wild-type full sequence. + + Returns: + - dict: Dictionary with positions as keys and lists of wild-type mutations as values. + """ + wt_mutations_dict = {} + pos = [] + + for mutation in mutational_pool: + number = int(re.search(r'\d+', mutation).group()) + + if number not in wt_mutations_dict: + wt = wt_seq[number-1] + wt_value = wt+str(number)+wt + wt_mutations_dict[number] = [wt_value] + + return wt_mutations_dict + +def mut_pool_searcher(keys, dict): + """ + Search for mutations in a dictionary based on given keys. + + Args: + - keys (list): List of keys to search for. + - dict (dict): Dictionary to search in. + + Returns: + - list: List of mutations found for the given keys. + """ + muts = [] + for key in keys: + muts.extend(dict[key]) + return muts + +def eAUC(y_true, y_pred): + """ + Calculate the enrichment Area Under the Curve (eAUC). + + Args: + - y_true (array-like): True binary labels. + - y_pred (array-like): Predicted scores. + + Returns: + - float: eAUC score. + """ + from sklearn.metrics import auc + ranked = ss.rankdata(-y_pred)[y_true == 1.] + n_true = np.array([ + sum(ranked <= i + 1) for i in range(len(y_true)) + ]) + n_consider = np.array([ i + 1 for i in range(len(y_true)) ]) + norm = max(n_consider) * max(n_true) + return auc(n_consider, n_true) / norm + + +def setup_logger(log_file): + """ + Set up a logger for both file and stream logging. + + Args: + - log_file (str): Path to the log file. + + Returns: + - logging.Logger: Configured logger object. + """ + if not os.path.exists(os.path.dirname(log_file)): + os.makedirs(os.path.dirname(log_file)) + + logger = logging.getLogger('my_logger') + logger.setLevel(logging.DEBUG) + + file_handler = logging.FileHandler(log_file) + file_handler.setLevel(logging.DEBUG) + + stream_handler = logging.StreamHandler() + stream_handler.setLevel(logging.DEBUG) + + formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + + file_handler.setFormatter(formatter) + stream_handler.setFormatter(formatter) + + logger.addHandler(file_handler) + logger.addHandler(stream_handler) + + logger.info('Logger set up.') + return logger + +def close_logger(logger): + """ + Close all handlers associated with the given logger. + + Args: + - logger (logging.Logger): Logger object to close. + """ + logger.info('Closing logger.') + for handler in logger.handlers: + handler.close() + logger.removeHandler(handler) + +# MSA utils + +# This is an efficient way to delete lowercase characters and insertion characters from a string +deletekeys = dict.fromkeys(string.ascii_lowercase) +deletekeys["."] = None +deletekeys["*"] = None +translation = str.maketrans(deletekeys) + +def read_sequence(filename: str) -> Tuple[str, str]: + """ + Read the first (reference) sequence from a fasta or MSA file. + + Args: + - filename (str): Path to the fasta or MSA file. + + Returns: + - tuple: (sequence description, sequence) + """ + record = next(SeqIO.parse(filename, "fasta")) + return record.description, str(record.seq) + +def remove_insertions(sequence: str) -> str: + """ + Remove any insertions from the sequence. Needed to load aligned sequences in an MSA. + + Args: + - sequence (str): Input sequence. + + Returns: + - str: Sequence with insertions removed. + """ + return sequence.translate(translation) + +def read_msa(filename: str) -> List[Tuple[str, str]]: + """ + Read sequences from an MSA file, automatically removing insertions. + + Args: + - filename (str): Path to the MSA file. + + Returns: + - list: List of tuples (sequence description, sequence without insertions) + """ + return [(record.description, remove_insertions(str(record.seq))) for record in SeqIO.parse(filename, "fasta")] + +def greedy_select(msa: List[Tuple[str, str]], num_seqs: int, mode: str = "max") -> List[Tuple[str, str]]: + """ + Select sequences from the MSA to maximize or minimize the hamming distance. + + Args: + - msa (list): List of (description, sequence) tuples. + - num_seqs (int): Number of sequences to select. + - mode (str): 'max' to maximize distance, 'min' to minimize. + + Returns: + - list: Selected sequences. + """ + assert mode in ("max", "min") + if len(msa) <= num_seqs: + return msa + + array = np.array([list(seq) for _, seq in msa], dtype=np.bytes_).view(np.uint8) + + optfunc = np.argmax if mode == "max" else np.argmin + all_indices = np.arange(len(msa)) + indices = [0] + pairwise_distances = np.zeros((0, len(msa))) + for _ in range(num_seqs - 1): + dist = cdist(array[indices[-1:]], array, "hamming") + pairwise_distances = np.concatenate([pairwise_distances, dist]) + shifted_distance = np.delete(pairwise_distances, indices, axis=1).mean(0) + shifted_index = optfunc(shifted_distance) + index = np.delete(all_indices, indices)[shifted_index] + indices.append(index) + indices = sorted(indices) + return [msa[idx] for idx in indices] + +def msa_splicer(msa): + """ + Splice the MSA to only include positions where the first sequence is not empty. + + Args: + - msa (list): List of (description, sequence) tuples. + + Returns: + - list: Spliced MSA. + """ + base_sequence = msa[0][1] + positions = [i for i, _ in enumerate(base_sequence) if base_sequence[i] != '-'] + + spliced_msa = [] + for name, seq in msa: + spliced_seq = [seq[i] for i in positions] + spliced_msa.append((name, ''.join(spliced_seq))) + + return spliced_msa \ No newline at end of file diff --git a/model/utils/pca-19.npy b/model/utils/pca-19.npy new file mode 100644 index 0000000000000000000000000000000000000000..9bd21adf2672baded31a55ab18b8e5b9a58149c1 --- /dev/null +++ b/model/utils/pca-19.npy @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d275ac4ae994960b87e2dc925999596befe6fd5480f6c6090ed1b90c042f5e65 +size 1648 diff --git a/model/utils/zeroshot_utils.py b/model/utils/zeroshot_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..d61523e5eb47f8c8892c8b65f675c18cf1abc766 --- /dev/null +++ b/model/utils/zeroshot_utils.py @@ -0,0 +1,478 @@ +# This module contains utility functions for zero-shot predictions using various protein language models + +import argparse +from Bio import SeqIO +import numpy as np +import pandas as pd +import scipy.stats as ss +import torch +from tqdm import tqdm + +from model.utils.other_utils import read_msa, greedy_select, msa_splicer, AAs + +def zero_shot_esm_dms(wt_seq, + model_locations = ['esm1v_t33_650M_UR90S_1', + 'esm1v_t33_650M_UR90S_2', + 'esm1v_t33_650M_UR90S_3', + 'esm1v_t33_650M_UR90S_4', + 'esm1v_t33_650M_UR90S_5', + 'esm2_t36_3B_UR50D'], + scoring_strategy='wt-marginals', + num_msa_seqs=400, + **kwargs): + """ + Perform deep mutational scanning using ESM model. + + Args: + wt_seq (str): Wild-type protein sequence + scoring_strategy (str): 'wt-marginals' or 'masked-marginals' + **kwargs: Additional arguments + + Returns: + pandas.DataFrame: DataFrame containing mutation scores and statistics + """ + from esm import pretrained, MSATransformer + + # create list of all possible single point mutations in the wildtype sequence + amino_acids = AAs[:-1] + mutations = [] + for i, residue in enumerate(wt_seq): + for aa in amino_acids: + if wt_seq[i] == aa: + continue + mutations.append(wt_seq[i] + str(i + 1) + aa) + + # Compute token probs for each model. + model_probs = [] + + if torch.backends.mps.is_available(): + device = "mps" + elif torch.cuda.is_available(): + device = "cuda:0" + else: + device = "cpu" + + for model_location in model_locations: + model, alphabet = pretrained.load_model_and_alphabet(model_location) + model.eval() + model = model.to(device) + + batch_converter = alphabet.get_batch_converter() + + if isinstance(model, MSATransformer): + + assert kwargs['msa_file'] is not None, 'No MSA file provided.' + msa = read_msa(kwargs['msa_file']) + + # Prep the MSA, making the appropriate mutations + inputs = greedy_select(msa, num_seqs=num_msa_seqs) # can change this to pass more/fewer sequences + #This splices the MSA to exclude gaps in the first sequence, due to MSATransformer context window + #size limit of 1024. If your MSA width is less than 1024, then you don't need to do this + data = [msa_splicer(inputs)] + + # Run the model, retrieve logits + _, __, batch_tokens = batch_converter(data) + all_token_probs = [] + for i in tqdm(range(batch_tokens.size(2))): + batch_tokens_masked = batch_tokens.clone() + batch_tokens_masked[0, 0, i] = alphabet.mask_idx # mask out first sequence + with torch.no_grad(): + token_probs = torch.log_softmax( + model(batch_tokens_masked.to(device))["logits"], dim=-1 + ) + all_token_probs.append(token_probs[:, 0, i]) # vocab size + token_probs = torch.cat(all_token_probs, dim=0).unsqueeze(0) + + else: + data = [ + ('protein1', wt_seq), + ] + batch_labels, batch_strs, batch_tokens = batch_converter(data) + + if scoring_strategy == 'wt-marginals': + with torch.no_grad(): + token_probs = torch.log_softmax(model(batch_tokens.to(device))['logits'], dim=-1) + + elif scoring_strategy == 'masked-marginals': + all_token_probs = [] + for i in tqdm(range(batch_tokens.size(1))): + batch_tokens_masked = batch_tokens.clone() + batch_tokens_masked[0, i] = alphabet.mask_idx + with torch.no_grad(): + token_probs = torch.log_softmax( + model(batch_tokens_masked.to(device))['logits'], dim=-1 + ) + all_token_probs.append(token_probs[:, i]) # vocab size + token_probs = torch.cat(all_token_probs, dim=0).unsqueeze(0) + + else: + raise ValueError(f'Invalid scoring strategy {scoring_strategy}') + + model_probs.append(token_probs.cpu().numpy()[0]) + + X = [] + for model_prob in model_probs: + + X_sub = [] + for mutation in mutations: + wt, idx, mt = mutation[0], int(mutation[1:-1])-1, mutation[-1] + assert wt_seq[idx] == wt, 'Wild-type residue does not match input sequence.' + + wt_encoded, mt_encoded = alphabet.tok_to_idx[wt], alphabet.tok_to_idx[mt] + + score = model_prob[idx + 1, mt_encoded] - model_prob[idx + 1, wt_encoded] + if not np.isfinite(score): + score = 0. + + X_sub.append(score) + + X.append(X_sub) + + # set up dataframe + data = {'mutations': mutations} + for i in range(len(X)): + data[f'model_{i+1}_logratio'] = X[i] + df = pd.DataFrame(data) + + # Calculate average log ratio across all models + logratio_cols = [f'model_{i+1}_logratio' for i in range(len(X))] + df['average_model_logratio'] = df[logratio_cols].mean(axis=1) + + # Calculate pass/fail for each model + for i in range(len(X)): + df[f'model_{i+1}_pass'] = df[f'model_{i+1}_logratio'].apply(lambda x: 1 if x > 0 else 0) + + # Sum up total passes + pass_cols = [f'model_{i+1}_pass' for i in range(len(X))] + df['total_model_pass'] = df[pass_cols].sum(axis=1) + df.sort_values(by='average_model_logratio', ascending=False, inplace=True) + df.sort_values(by='total_model_pass', ascending=False, inplace=True) + + df_ls = [] + + # sort dataframe by total_model_pass and then by average_model_logratio + + total_model_pass_list = list(set(df['total_model_pass'].values)) + total_model_pass_list = total_model_pass_list[::-1] + + for model_pass_value in total_model_pass_list: + subset = df[df['total_model_pass'] == model_pass_value].copy() + subset.sort_values(by='average_model_logratio', ascending=False, inplace=True) + df_ls.append(subset) + + df_sorted = pd.concat(df_ls) + + return df_sorted + +def zero_shot_esm_if_dms(wt_seq, pdb_file, chain_id = 'A', scoring_strategy='wt-marginals', **kwargs): + """ + Perform deep mutational scanning using ESM-IF (Inverse Folding) model. + + Args: + wt_seq (str): Wild-type protein sequence + pdb_file (str): Path to PDB file + chain_id (str): Chain ID in the PDB file + scoring_strategy (str): Currently not used, kept for consistency + **kwargs: Additional arguments + + Returns: + pandas.DataFrame: DataFrame containing mutation scores + """ + import torch_geometric + import torch_sparse + from torch_geometric.nn import MessagePassing + import esm + from esm import pretrained + from esm.inverse_folding.util import CoordBatchConverter + + amino_acids = AAs[:-1] + mutations = [] + for i, residue in enumerate(wt_seq): + for aa in amino_acids: + if wt_seq[i] == aa: + continue + mutations.append(wt_seq[i] + str(i + 1) + aa) + + model_locations = ['esm_if1_gvp4_t16_142M_UR50'] + + model, alphabet = pretrained.load_model_and_alphabet(model_locations[0]) + model = model.eval() + + structure = esm.inverse_folding.util.load_structure(pdb_file, chain_id) + coords, native_seq = esm.inverse_folding.util.extract_coords_from_structure(structure) + + if native_seq == wt_seq: + print(f"Native sequence from structure matches input sequence ({len(native_seq)} residues)") + else: + print(f"Warning: Native sequence from structure ({len(native_seq)} residues) does not match input sequence ({len(wt_seq)} residues)") + + device = next(model.parameters()).device + batch_converter = CoordBatchConverter(alphabet) + batch = [(coords, None, wt_seq)] + coords, confidence, strs, tokens, padding_mask = batch_converter( + batch, device=device) + + prev_output_tokens = tokens[:, :-1].to(device) + target = tokens[:, 1:] + logits, _ = model.forward(coords, padding_mask, confidence, prev_output_tokens) + + # Average model scores and find scores for the mutations-of-interest. + + scores = logits.detach().numpy()[0] + mutation_score = {} + for pos in range(len(wt_seq)): + wt = wt_seq[pos] + for mt in alphabet.all_toks: + mutation = f'{wt}{pos + 1}{mt}' + mutation_score[mutation] = scores[alphabet.tok_to_idx[mt], pos] + + X = [] + for mutation in mutations: + wt = mutation[0]+mutation[1:-1]+mutation[0] + score = mutation_score[mutation] - mutation_score[wt] + if not np.isfinite(score): + score = 0. + + X.append(score) + + df = pd.DataFrame({'mutations': mutations, 'logratio': X}) + + return df + +def zero_shot_esm( + mutations, + model_locations, + sequence, + scoring_strategy='wt-marginals', + **kwargs +): + """ + Perform zero-shot prediction using ESM (Evolutionary Scale Modeling) model. + + Args: + mutations (list): List of mutation sets + model_locations (list): List of ESM model file paths + sequence (str): Original protein sequence + scoring_strategy (str): 'wt-marginals' or 'masked-marginals' + **kwargs: Additional arguments (e.g., device) + + Returns: + numpy.ndarray: Array of mutation scores + """ + from esm import pretrained + + # Compute token probs for each model. + + model_probs = [] + + for model_location in model_locations: + model, alphabet = pretrained.load_model_and_alphabet(model_location) + model.eval() + model = model.to(kwargs['device']) + + batch_converter = alphabet.get_batch_converter() + + data = [ + ('protein1', sequence), + ] + batch_labels, batch_strs, batch_tokens = batch_converter(data) + + if scoring_strategy == 'wt-marginals': + with torch.no_grad(): + token_probs = torch.log_softmax(model(batch_tokens.to(kwargs['device']))['logits'], dim=-1) + + elif scoring_strategy == 'masked-marginals': + all_token_probs = [] + for i in tqdm(range(batch_tokens.size(1))): + batch_tokens_masked = batch_tokens.clone() + batch_tokens_masked[0, i] = alphabet.mask_idx + with torch.no_grad(): + token_probs = torch.log_softmax( + model(batch_tokens_masked.to(kwargs['device']))['logits'], dim=-1 + ) + all_token_probs.append(token_probs[:, i]) # vocab size + token_probs = torch.cat(all_token_probs, dim=0).unsqueeze(0) + + else: + raise ValueError(f'Invalid scoring strategy {scoring_strategy}') + + model_probs.append(token_probs.cpu().numpy()[0]) + + + # Sum model scores and find scores for the mutations-of-interest. + scores = np.sum(model_probs, axis=0) + mutation_score = {} + for pos in range(len(sequence)): + wt = sequence[pos] + for mt in alphabet.all_toks: + mutation = f'{wt}{pos + 1}{mt}' + mutation_score[mutation] = scores[pos + 1, alphabet.tok_to_idx[mt]] + + X = [] + for mutation_set in mutations: + score = np.mean([ + mutation_score[mutation] for mutation in mutation_set + ]) + if not np.isfinite(score): + score = 0. + X.append(score) + + return np.array(X) + +def zero_shot_msa( + mutations, + sequence, + **kwargs, +): + """ + Perform zero-shot prediction using MSA Transformer model. + + Args: + mutations (list): List of mutation sets + sequence (str): Original protein sequence + **kwargs: Additional arguments (must include 'msa_file') + + Returns: + numpy.ndarray: Array of mutation scores + """ + import esm + import torch + torch.set_grad_enabled(False) + # Check to see if there is an MSA file in **kwargs. + assert kwargs['msa_file'] is not None, 'No MSA file provided.' + msa = read_msa(kwargs['msa_file']) + + # Instantiate the model + msa_transformer, msa_transformer_alphabet = esm.pretrained.esm_msa1b_t12_100M_UR50S() + msa_transformer = msa_transformer.eval() + msa_transformer_batch_converter = msa_transformer_alphabet.get_batch_converter() + + # Prep the MSA, making the appropriate mutations + inputs = greedy_select(msa, num_seqs=128) # can change this to pass more/fewer sequences + #This splices the MSA to exclude gaps in the first sequence, due to MSATransformer context window + #size limit of 1024. If your MSA width is less than 1024, then you don't need to do this + inputs = [msa_splicer(inputs)] + + # Run the model, retrieve logits + _, __, msa_transformer_batch_tokens = msa_transformer_batch_converter(inputs) + msa_transformer_batch_tokens = msa_transformer_batch_tokens.to(next(msa_transformer.parameters()).device) + predictions = msa_transformer.forward(msa_transformer_batch_tokens, repr_layers=[12]) + logits = predictions['logits'][0][0] + token_probs = torch.softmax(logits, dim=-1) + print(token_probs.shape) + + print('pulling out mutations') + # Pull specific logits out for the mutations-of-interest. + mutation_score = {} + for pos in range(len(sequence)): + wt = sequence[pos] + for mt in msa_transformer_alphabet.all_toks: + mutation = f'{wt}{pos + 1}{mt}' + mutation_score[mutation] = token_probs[pos + 1, msa_transformer_alphabet.tok_to_idx[mt]] + + X = [] + for mutation_set in mutations: + score = np.mean([ + mutation_score[mutation] for mutation in mutation_set + ]) + if not np.isfinite(score): + score = 0. + X.append(score) + + return np.array(X) + +def zero_shot_esm_if( + mutations, + model_locations, + sequence, + pdb_file, + chain_id, + **kwargs +): + """ + Perform zero-shot prediction using ESM-IF (Inverse Folding) model. + + Args: + mutations (list): List of mutation sets + model_locations (list): List of ESM-IF model file paths + sequence (str): Original protein sequence + pdb_file (str): Path to PDB file + chain_id (str): Chain ID in the PDB file + **kwargs: Additional arguments + + Returns: + numpy.ndarray: Array of mutation scores + """ + # Check that imports are correctly installed + import torch_geometric + import torch_sparse + from torch_geometric.nn import MessagePassing + import esm + from esm import pretrained + from esm.inverse_folding.util import CoordBatchConverter + + # If one of the above fails, run the following in your conda environment + # import torch + + # def format_pytorch_version(version): + # return version.split('+')[0] + + # TORCH_version = torch.__version__ + # TORCH = format_pytorch_version(TORCH_version) + + # def format_cuda_version(version): + # return 'cu' + version.replace('.', '') + + # CUDA_version = torch.version.cuda + # CUDA = format_cuda_version(CUDA_version) + + # !pip install -q torch-scatter -f https://data.pyg.org/whl/torch-{TORCH}+{CUDA}.html + # !pip install -q torch-sparse -f https://data.pyg.org/whl/torch-{TORCH}+{CUDA}.html + # !pip install -q torch-cluster -f https://data.pyg.org/whl/torch-{TORCH}+{CUDA}.html + # !pip install -q torch-spline-conv -f https://data.pyg.org/whl/torch-{TORCH}+{CUDA}.html + # !pip install -q torch-geometric + + # # Install esm + # !pip install -q git+https://github.com/facebookresearch/esm.git + + # # Install biotite + # !pip install -q biotite + + # Compute token probs for each model. + + model, alphabet = pretrained.load_model_and_alphabet(model_locations[0]) + model = model.eval() + + structure = esm.inverse_folding.util.load_structure(pdb_file, chain_id) + coords, native_seq = esm.inverse_folding.util.extract_coords_from_structure(structure) + + device = next(model.parameters()).device + batch_converter = CoordBatchConverter(alphabet) + batch = [(coords, None, sequence)] + coords, confidence, strs, tokens, padding_mask = batch_converter( + batch, device=device) + + prev_output_tokens = tokens[:, :-1].to(device) + target = tokens[:, 1:] + logits, _ = model.forward(coords, padding_mask, confidence, prev_output_tokens) + + # Average model scores and find scores for the mutations-of-interest. + + scores = logits.detach().numpy()[0] + mutation_score = {} + for pos in range(len(sequence)): + wt = sequence[pos] + for mt in alphabet.all_toks: + mutation = f'{wt}{pos + 1}{mt}' + mutation_score[mutation] = scores[alphabet.tok_to_idx[mt], pos] # logits are vocab x length (no padding) + + X = [] + for mutation_set in mutations: + score = np.mean([ + mutation_score[mutation] for mutation in mutation_set + ]) + if not np.isfinite(score): + score = 0. + X.append(score) + + return np.array(X) diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..34585cf0909e1f11ff16978aabd5365730a86715 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["setuptools>=64.0"] +build-backend = "setuptools.build_meta" \ No newline at end of file diff --git a/scripts/app.py b/scripts/app.py new file mode 100644 index 0000000000000000000000000000000000000000..fab9cf212c91cfc9a547ba2c6c1d2128732507cf --- /dev/null +++ b/scripts/app.py @@ -0,0 +1,732 @@ +""" +Streamlit app for MULTI-evolve: A framework for engineering hyperactive multi-mutants. + +This app provides an interactive web app to: +1. Train neural network models on protein mutation data +2. Propose optimized multi-mutant combinations +3. Generate MULTI-assembly mutagenic oligos for gene synthesis +4. Perform zero-shot predictions with protein language models +""" + +import streamlit as st +import pandas as pd +from Bio import SeqIO +import os +import wandb +from pathlib import Path +import subprocess + +from model.splitters import * +from model.featurizers import * +from model.predictors import * +from model.proposers import * + +def setup_page(): + """Configure basic Streamlit page settings""" + st.set_page_config( + page_title="MULTI-evolve", + page_icon="🧬", + layout="wide" + ) + + # Custom branded header with subtitle + st.markdown(""" +

MULTI-evolve

+

+ A framework for engineering hyperactive multi-mutants +

+
+ """, unsafe_allow_html=True) + + # Global styles — injected once, available to all tabs + st.markdown(""" + + """, unsafe_allow_html=True) + +def create_protein_directory(protein_name): + """ + Create directory structure for a protein project + + Args: + protein_name (str): Name of the protein project + + Returns: + Path: Path object pointing to protein directory + """ + protein_dir = Path("proteins") / protein_name + protein_dir.mkdir(parents=True, exist_ok=True) + + return protein_dir + +def save_uploaded_file(uploaded_file, protein_dir): + """ + Save an uploaded file to the protein directory + + Args: + uploaded_file (UploadedFile): Streamlit uploaded file + protein_dir (Path): Path to protein directory + + Returns: + Path: Path to saved file + """ + + if uploaded_file is None: + return None + + save_path = protein_dir / uploaded_file.name + with open(save_path, "wb") as f: + f.write(uploaded_file.getbuffer()) + return save_path + +def validate_files(protein_name, wt_files_aa=None, wt_file_aa=None,wt_file_dna=None, dataset_file=None, mutations_file=None, pdb_files=None): + """Validate uploaded files with protein-specific directory handling""" + try: + protein_dir = create_protein_directory(protein_name) + + # Validate and save FASTA + if wt_files_aa: + for wt_file_aa in wt_files_aa: + fasta_path = save_uploaded_file(wt_file_aa, protein_dir) + wt_seq_aa = str(SeqIO.read(fasta_path, "fasta").seq.upper()) + elif wt_file_aa: + fasta_path = save_uploaded_file(wt_file_aa, protein_dir) + wt_seq_aa = str(SeqIO.read(fasta_path, "fasta").seq.upper()) + + if wt_file_dna: + fasta_path = save_uploaded_file(wt_file_dna, protein_dir) + wt_seq_dna = str(SeqIO.read(fasta_path, "fasta").seq.upper()) + + # Validate and save dataset CSV + if dataset_file: + dataset_path = save_uploaded_file(dataset_file, protein_dir) + df = pd.read_csv(dataset_path) + required_cols = ['mutation', 'property_value'] + if not all(col in df.columns for col in required_cols): + st.error("Training dataset must contain 'mutation' and 'property_value' columns") + return False + + # Validate and save mutation pool + if mutations_file: + pool_path = save_uploaded_file(mutations_file, protein_dir) + df = pd.read_csv(pool_path, header=None) + if df.empty: + st.error("Mutation pool file is empty") + return False + + if pdb_files: + for pdb_file in pdb_files: + pdb_path = save_uploaded_file(pdb_file, protein_dir) + if not str(pdb_path).endswith('.pdb') and not str(pdb_path).endswith('.cif'): + st.error("PDB/CIF files must be in PDB or CIF format") + return False + + return True + + except Exception as e: + st.error(f"File validation error: {str(e)}") + return False + +def train_models(): + """Train neural network models section""" + + with st.form("train_models_form"): + col1, col2 = st.columns([2,3]) + + with col1: + protein_name = st.text_input("Protein Name") + wt_files_aa = st.file_uploader("Upload Wildtype Amino Acid Sequence FASTA", accept_multiple_files=True, type=['fasta', 'fa']) + dataset_file = st.file_uploader("Upload Training Dataset (CSV)", type=['csv'], accept_multiple_files=False) + st.divider() + experiment_name = st.text_input("Experiment Name", value="test") + wandb_key = st.text_input("WandB API Key", type="password") + mode = st.selectbox("Training Mode", ["test", "standard"]) + + with col2: + st.markdown(""" + ### Step 1: Train Neural Network Models + + This tool performs a grid search over many neural network architectures to find the best performing model for a given protein and dataset. + """) + with st.expander("Input Files and Parameters", expanded=False): + st.markdown(""" + - **Training Dataset (CSV)**: CSV file with columns 'mutation' and 'property_value'. Variants should be formatted as ```A40P/E61Y```, or for protein complexes as ```A40P/E61Y:WT```, where ```:``` separates the individual chains (e.g. ```chain 1 mutations:chain 2 mutations```), ```/``` separates the individual mutations, and ```WT``` indicates the wildtype sequence. A sample dataset for APEX peroxidase can be found in ```data/example_protein/example_dataset.csv```. For a protein complex example, use ```data/example_multichain_protein/example_dataset.csv```. + - **Wildtype Amino Acid Sequence FASTA**: Protein sequence in FASTA format. Upload multiple sequence files if working with a protein complex in the same order as you formatted the variants in the training dataset. A sample sequence of APEX peroxidase can be found in ```data/example_protein/apex.fasta```. For a protein complex example, upload in the following order: ```data/example_multichain_protein/vh_chain1.fasta```, ```data/example_multichain_protein/vl_chain2.fasta```. + - **Experiment Name**: Name of the model training experiment (e.g. APEX_gridsearch). This should be used for the subsequent step 2 for proposing mutations. + - **WandB API Key**: API key for logging to WandB. Create an account and get an API key from [WandB](https://wandb.ai/authorize). + - **Training Mode**: + - `test`: Test the training process for a single architecture. + - `standard`: Performs a grid search over many architectures. Will take a longer time to run. + """) + + submitted = st.form_submit_button("Train Models", type="primary") + + if submitted: + if not all([experiment_name, protein_name, wandb_key, wt_files_aa, dataset_file]): + st.error("Please fill in all required fields") + return + + if not validate_files(protein_name, wt_files_aa=wt_files_aa, dataset_file=dataset_file): + return + + try: + protein_dir = Path("proteins") / protein_name + wt_paths = [protein_dir / wt_file_aa.name for wt_file_aa in wt_files_aa] + dataset_path = protein_dir / dataset_file.name + + # Force wandb relogin + subprocess.run(["wandb", "login", "--relogin", wandb_key], capture_output=True) + + # Show the command that will be executed + command = [ + "python", "scripts/p1_train.py", + "--experiment-name", experiment_name, + "--protein-name", protein_name, + "--wt-files", ",".join(str(wt_path) for wt_path in wt_paths), + "--training-dataset-fname", str(dataset_path), + "--wandb-key", wandb_key, + "--mode", mode + ] + + st.subheader("Terminal Output:") + st.code(f"$ {' '.join(command)}", language="bash") + + with st.container(border=True): + terminal_output = st.empty() + + with st.spinner("Training models..."): + # Run the command and capture all output + process = subprocess.Popen( + command, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + bufsize=1, + universal_newlines=True + ) + + output_lines = [] + + # Stream output in real-time + for line in iter(process.stdout.readline, ''): + output_lines.append(line.rstrip()) + # Update the terminal display with all output so far + terminal_text = '\n'.join(output_lines) + terminal_output.markdown(f'
{terminal_text}
', + unsafe_allow_html=True) + + process.wait() + + # Keep the final scrollable output instead of replacing with code block + final_output = '\n'.join(output_lines) + terminal_output.markdown(f'
{final_output}
', + unsafe_allow_html=True) + + if process.returncode == 0: + st.success("✅ Model training completed successfully!") + else: + st.error(f"❌ Training failed with exit code: {process.returncode}") + + except Exception as e: + st.error(f"Error during training: {str(e)}") + st.exception(e) + +def propose_mutations(): + """Propose mutations section""" + + with st.form("propose_mutations_form"): + col1, col2 = st.columns([2,3]) + + with col1: + protein_name = st.text_input("Protein Name", key="propose_protein") + wt_files_aa = st.file_uploader("Upload Wildtype Amino Acid Sequence FASTA", accept_multiple_files=True, type=['fasta', 'fa'], key="propose_wt") + dataset_file = st.file_uploader("Upload Training Dataset (CSV)", type=['csv'], key="propose_dataset") + mutation_pool = st.file_uploader("Upload Mutation Pool (CSV)", type=['csv']) + st.divider() + experiment_name = st.text_input("Experiment Name", key="propose_exp") + top_muts = st.number_input("Top Mutations per Load", min_value=1, value=3) + export_name = st.text_input("Export Name", value="multievolve_proposals") + + with col2: + st.markdown(""" + ### Step 2: Propose MULTI-evolve Variants + + This tool proposes MULTI-evolve variants using a trained neural network model, whose ideal architecture is selected from a grid search in Step 1. + """) + with st.expander("Input Files and Parameters", expanded=False): + st.markdown(""" + - **Wildtype Amino Acid Sequence FASTA**: Protein sequence in FASTA format. Upload multiple sequence files if working with a protein complex. Same file(s) as Step 1. A sample sequence of APEX peroxidase can be found in ```data/example_protein/apex.fasta```. For a protein complex example, upload in the following order: ```data/example_multichain_protein/vh_chain1.fasta```, ```data/example_multichain_protein/vl_chain2.fasta```. + - **Training Dataset (CSV)**: CSV file with columns 'mutation' and 'property_value'. Same file as Step 1. A sample dataset for APEX peroxidase can be found in ```data/example_protein/example_dataset.csv```. For a protein complex example, use ```data/example_multichain_protein/example_dataset.csv```. + - **Mutation Pool (CSV)**: Path to the mutation pool CSV file, which is a list of mutations to be used to generate the proposed combinatorial variants. It is a one column no header CSV file. Example is provided in ```data/example_protein/combo_muts.csv```. For a protein complex example, use ```data/example_multichain_protein/combo_muts.csv```. + - **Experiment Name**: Name of the model training experiment (e.g. APEX_gridsearch). Same experiment name as Step 1. + - **Top Mutations per Load**: Number of top mutations to propose per mutational load. + - **Export Name**: Name of the exported csv file containing the list of the proposed variants. This csv file can be used to generate MULTI-assembly mutagenic oligos for cloning the proposed variants in the ```Design MULTI-assembly Oligos``` tab. + """) + with st.expander("Outputs", expanded=False): + st.markdown(""" + A CSV file will be generated: + - `.csv`: List of proposed variants. If it is a protein complex, it will export files for each chain (e.g. ```_chain_1_mutants.csv```) + """) + + submitted = st.form_submit_button("Propose Mutations", type="primary") + + if submitted: + if not all([experiment_name, protein_name, wt_files_aa, dataset_file, mutation_pool, export_name]): + st.error("Please fill in all required fields") + return + + if not validate_files(protein_name, wt_files_aa=wt_files_aa, dataset_file=dataset_file, mutations_file=mutation_pool): + return + + try: + protein_dir = Path("proteins") / protein_name + wt_paths = [protein_dir / wt_file_aa.name for wt_file_aa in wt_files_aa] + dataset_path = protein_dir / dataset_file.name + mutation_pool_path = protein_dir / mutation_pool.name + + # Show the command that will be executed + command = [ + "python", "scripts/p2_propose.py", + "--experiment-name", experiment_name, + "--protein-name", protein_name, + "--wt-files", ",".join(str(wt_path) for wt_path in wt_paths), + "--training-dataset", str(dataset_path), + "--mutation-pool", str(mutation_pool_path), + "--top-muts-per-load", str(top_muts), + "--export-name", export_name + ] + + st.subheader("Terminal Output:") + st.code(f"$ {' '.join(command)}", language="bash") + + with st.container(border=True): + terminal_output = st.empty() + + with st.spinner("Proposing mutations..."): + # Run the command and capture all output + process = subprocess.Popen( + command, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + bufsize=1, + universal_newlines=True + ) + + output_lines = [] + + # Stream output in real-time + for line in iter(process.stdout.readline, ''): + output_lines.append(line.rstrip()) + # Update the terminal display with all output so far + terminal_text = '\n'.join(output_lines) + terminal_output.markdown(f'
{terminal_text}
', + unsafe_allow_html=True) + + process.wait() + + # Keep the final scrollable output instead of replacing with code block + final_output = '\n'.join(output_lines) + terminal_output.markdown(f'
{final_output}
', + unsafe_allow_html=True) + + if process.returncode == 0: + st.success("✅ MULTI-evolve variants proposed successfully!") + else: + st.error(f"❌ MULTI-evolve variants proposal failed with exit code: {process.returncode}") + + except Exception as e: + st.error(f"Error during mutation proposal: {str(e)}") + st.exception(e) + +def design_oligos(): + """Design MULTI-assembly oligos section""" + + with st.form("design_oligos_form"): + col1, col2 = st.columns([2,3]) + + with col1: + protein_name = st.text_input("Protein Name", key="MULTI-assembly_protein") + wt_file_dna = st.file_uploader("Upload Wildtype DNA Sequence FASTA", type=['fasta', 'fa'], key="oligo_wt") + mutations_file = st.file_uploader("Upload Mutations File (CSV)", type=['csv']) + st.divider() + species = st.selectbox("Species", ["human", "ecoli", "yeast"]) + tm = st.number_input("Melting Temperature (°C)", value=80.0) + overhang = st.number_input("Overhang Length", value=33) + oligo_direction = st.selectbox("Oligo Direction", ["top", "bottom"]) + output_type = st.selectbox("Output Type", ["design", "update"]) + + with col2: + st.markdown(""" + ### Step 3: Generate MULTI-assembly Mutagenic Oligos + + This tool generates mutagenic oligos for MULTI-assembly cloning of multi-mutant variants. + """) + with st.expander("Input Files and Parameters", expanded=False): + st.markdown(""" + - **Protein Name**: Name of the protein to generate oligos for. + - **Wildtype DNA Sequence FASTA**: DNA sequence of the wildtype protein with overhangs from the protein's MULTI-assembly vector. The sequence should include overhangs for the MULTI-assembly oligos, wherein the overhangs are the same length on both ends of the DNA sequence. Recommended overhang length is 33 bp or longer. An example is found in ```data/example_protein/APEX_33overhang.fasta```. + - **Mutations File (CSV)**: List of proposed variants to generate oligos for. It is a one column no-header csv file with the variants. See ```data/example_protein/MULTI-assembly_input.csv``` for an example of the csv format. + - **Species**: Codon usage table selection (human/ecoli/yeast). + - **Melting Temperature**: Target Tm for oligos (recommended: 80°C). + - **Overhang Length**: Length of overhangs on both ends of sequence. + - **Oligo Direction**: + - `top`: Oligos bind 5' to 3' in top strand orientation. + - `bottom`: Oligos bind 3' to 5' in bottom strand orientation. + - **Output Type**: + - `design`: Generate new oligo designs. + - `update`: Update existing oligo IDs. + """) + with st.expander("Outputs", expanded=False): + st.markdown(""" + Two CSV files will be generated: + 1. `cloning_sheet.csv`: Assembly instructions describing which oligos to pool for each variant. + 2. `oligos.csv`: Oligo sequences and IDs. + + The oligo IDs in `oligos.csv` can be customized with user-defined IDs. After editing the `oligos.csv` file, re-running with `update` will sync IDs between files. + """) + + submitted = st.form_submit_button("Design Oligos", type="primary") + + if submitted: + if not all([protein_name, mutations_file, wt_file_dna]): + st.error("Please fill in all required fields") + return + + if not validate_files(protein_name, wt_file_dna=wt_file_dna, mutations_file=mutations_file): + return + + try: + protein_dir = Path("proteins") / protein_name + mutations_path = protein_dir / mutations_file.name + wt_path = protein_dir / wt_file_dna.name + + # Show the command that will be executed + command = [ + "python", "scripts/p3_assembly_design.py", + "--mutations-file", str(mutations_path), + "--wt-fasta", str(wt_path), + "--overhang", str(overhang), + "--species", species, + "--oligo-direction", oligo_direction, + "--tm", str(tm), + "--output", output_type + ] + + st.subheader("Terminal Output:") + st.code(f"$ {' '.join(command)}", language="bash") + + with st.container(border=True): + terminal_output = st.empty() + + with st.spinner("Designing oligos..."): + # Run the command and capture all output + process = subprocess.Popen( + command, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + bufsize=1, + universal_newlines=True + ) + + output_lines = [] + + # Stream output in real-time + for line in iter(process.stdout.readline, ''): + output_lines.append(line.rstrip()) + # Update the terminal display with all output so far + terminal_text = '\n'.join(output_lines) + terminal_output.markdown(f'
{terminal_text}
', + unsafe_allow_html=True) + + process.wait() + + # Keep the final scrollable output instead of replacing with code block + final_output = '\n'.join(output_lines) + terminal_output.markdown(f'
{final_output}
', + unsafe_allow_html=True) + + if process.returncode == 0: + st.success("✅ Oligo design completed successfully!") + else: + st.error(f"❌ Oligo design failed with exit code: {process.returncode}") + + except Exception as e: + st.error(f"Error during oligo design: {str(e)}") + st.exception(e) + +def zeroshot_predictions(): + """Perform zero-shot predictions section""" + + with st.form("zeroshot_predictions_form"): + col1, col2 = st.columns([2,3]) + + with col1: + protein_name = st.text_input("Protein Name", key="zeroshot_protein") + wt_file_aa = st.file_uploader("Upload Wildtype Amino Acid Sequence FASTA", type=['fasta', 'fa'], key="zeroshot_wt") + pdb_files = st.file_uploader("Upload PDB/CIF Files", type=['pdb', 'cif'], accept_multiple_files=True, key="zeroshot_pdb") + st.divider() + chain_id = st.text_input("Chain ID", value="A", key="zeroshot_chain") + variants = st.number_input("Number of Variants", min_value=1, value=24) + excluded_pos = st.text_input("Excluded Positions (comma-separated, optional)", value="1,10,30", key="zeroshot_excluded") + norm_method = st.selectbox("Normalizing Method", ["aa_substitution_type", "aa_mutation"], key="zeroshot_norm") + + with col2: + st.markdown(""" + ### Protein Language Model Zero-shot Ensemble + + This tool performs zero-shot predictions with a protein language model ensemble to nominate mutations. + """) + with st.expander("Input Files and Parameters", expanded=False): + st.markdown(""" + - **Wildtype Amino Acid Sequence FASTA**: Protein sequence in FASTA format. + - **PDB/CIF Files**: One or more structure files in PDB or CIF format. Provide multiple structure files if there are different models (e.g. top 5 predicted structures from AlphaFold). + - **Chain ID**: Chain ID of the targeted protein in the structure files. + - **Number of Variants**: Number of variants to nominate per method (default: 24) + - **Excluded Positions**: Comma-separated list of positions to exclude from mutation (e.g. 1,5,20). Leave empty if no positions should be excluded. + - **Normalizing Method**: Method for normalizing fold-change scores: + - `aa_substitution_type`: Group by specific amino acid substitution type (e.g. all alanine to proline mutations, A→P mutations). + - `aa_mutation`: Group by amino acid mutation (e.g. all mutations to proline, →P). + """) + with st.expander("Outputs", expanded=False): + st.markdown(""" + A CSV file will be generated: + - `plm_zeroshot_ensemble_nominated_mutations.csv`: List of proposed variants and nominating methods. + """) + + submitted = st.form_submit_button("Run Zero-shot Predictions", type="primary") + + if submitted: + if not all([protein_name, wt_file_aa, pdb_files, chain_id]): + st.error("Please fill in all required fields") + return + + if not validate_files(protein_name, wt_file_aa=wt_file_aa, pdb_files=pdb_files): + return + + try: + protein_dir = Path("proteins") / protein_name + wt_path = protein_dir / wt_file_aa.name + pdb_paths = [protein_dir / pdb_file.name for pdb_file in pdb_files] + + + # Show the command that will be executed + command = [ + "python", "scripts/plm_zeroshot_ensemble.py", + "--wt-file", str(wt_path), + "--pdb-files", ",".join(str(path) for path in pdb_paths), + "--chain-id", chain_id, + "--variants", str(variants), + "--normalizing-method", norm_method + ] + + # Only add excluded-positions flag if it's provided and not empty + if excluded_pos.strip(): + command.extend(["--excluded-positions", excluded_pos]) + + st.subheader("Terminal Output:") + st.code(f"$ {' '.join(command)}", language="bash") + + with st.container(border=True): + terminal_output = st.empty() + + with st.spinner("Running Zero-shot Predictions..."): + # Run the command and capture all output + process = subprocess.Popen( + command, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + bufsize=1, + universal_newlines=True + ) + + output_lines = [] + + # Stream output in real-time + for line in iter(process.stdout.readline, ''): + output_lines.append(line.rstrip()) + # Update the terminal display with all output so far + terminal_text = '\n'.join(output_lines) + terminal_output.markdown(f'
{terminal_text}
', + unsafe_allow_html=True) + + process.wait() + + # Keep the final scrollable output instead of replacing with code block + final_output = '\n'.join(output_lines) + terminal_output.markdown(f'
{final_output}
', + unsafe_allow_html=True) + + if process.returncode == 0: + st.success("✅ Zero-shot predictions completed successfully!") + else: + st.error(f"❌ Zero-shot predictions failed with exit code: {process.returncode}") + + except Exception as e: + st.error(f"Error during zero-shot predictions: {str(e)}") + st.exception(e) + +def about(): + st.markdown(""" + + This tool provides an interactive web app to perform the computational steps of MULTI-evolve (model-guided, universal, targeted installation of multi-mutants), an end-to-end framework for efficiently engineering hyperactive multi-mutants. + + The interactive web app has the following uses: + 1. Implement the MULTI-evolve framework to propose multi-mutants and generate the associated MULTI-assembly mutagenic oligos for gene synthesis: + + (a) Train fully connected neural networks to predict the fitness of a given sequence. + + (b) Choose the best performing neural network and use it to predict combinatorial variants. + + (c) For the chosen multi-mutants, generate the MULTI-assembly mutagenic oligos for gene synthesis. + + 2. Perform the Protein Language Model Zero-shot Ensemble Approach used in the MULTI-evolve framework. + """) + +def file_locations(): + st.markdown("### Where are my files saved?") + st.markdown(""" + When you run any of the tools above, MULTI-evolve automatically creates a folder called **`proteins`** + (inside the main MULTI-evolve directory) to keep all of your work organized. Inside that folder, + each protein you work with gets its own sub-folder named after the **Protein Name** you entered. + + Here is what that folder looks like and what each part contains: + """) + + st.code(""" +proteins/ +└── your_protein_name/ + │ + ├── your_uploaded_files ← Your uploaded FASTA, CSV, and structure files + │ + ├── feature_cache/ ← Saved sequence features (speeds up re-runs) + │ + ├── model_cache/ ← Trained models and comparison results + │ └── your_dataset_name/ + │ ├── objects/ ← The saved trained models + │ └── results/ ← Performance metrics from model comparisons + │ + ├── proposers/ ← Proposed multi-mutant variants + │ └── results/ ← CSV files with proposed variants and scores + │ + ├── split_cache/ ← Saved data splits (train/test sets) + │ + ├── cloning_sheet.csv ← Which oligos to pool for each variant + ├── oligos.csv ← Oligo sequences for ordering + └── plm_zeroshot_ensemble_nominated_mutations.csv ← Nominated mutations from PLM ensemble + """, language=None) + + st.markdown("#### Quick guide to finding your results") + + col1, col2 = st.columns(2) + + with col1: + st.info( + "**After Step 1 (Train Models)**\n\n" + "Your trained models are saved in:\n\n" + "`proteins/your_protein_name/model_cache/`" + ) + st.info( + "**After Step 3 (Generate Oligos)**\n\n" + "Your oligo designs are saved in:\n\n" + "`proteins/your_protein_name/cloning_sheet.csv`\n\n" + "`proteins/your_protein_name/oligos.csv`" + ) + + with col2: + st.info( + "**After Step 2 (Propose Multi-mutants)**\n\n" + "`proteins/your_protein_name/proposers/results/` — Predictions for all multi-mutant variants\n\n" + "`proteins/your_protein_name/multievolve_proposals.csv` — The proposed variants to test\n\n" + ) + st.info( + "**After PLM Zero-shot Ensemble**\n\n" + "Your nominated mutations are saved in:\n\n" + "`proteins/your_protein_name/plm_zeroshot_ensemble_nominated_mutations.csv`" + ) + +def main(): + """Main function to run the Streamlit app""" + setup_page() + + # Create tabs for different functionalities + tab5, tab1, tab2, tab3, tab4, tab6 = st.tabs([ + "About", + "Train Models", + "Propose Multi-mutants", + "Generate MULTI-assembly Oligos", + "Perform PLM Zero-shot Ensemble", + "Output Files", + ]) + + with tab5: + about() + + with tab1: + train_models() + + with tab2: + propose_mutations() + + with tab3: + design_oligos() + + with tab4: + zeroshot_predictions() + + with tab6: + file_locations() + + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/scripts/ins_benchmark.sh b/scripts/ins_benchmark.sh new file mode 100644 index 0000000000000000000000000000000000000000..8972b16efbd6b9a403cc861b0c4b55f8e80da642 --- /dev/null +++ b/scripts/ins_benchmark.sh @@ -0,0 +1,22 @@ +# 创建目标目录 +mkdir -p data/benchmark/datasets +cd data/benchmark/datasets + +# 下载所有 CSV 文件 +for key in \ + CAPSD_AAV2S_Sinai_2021.csv \ + D7PM05_CLYGR_Somermeyer_2022.csv \ + F7YBW8_MESOW_Aakre_2015.csv \ + GFP_AEQVI_Sarkisyan_2016.csv \ + SPG1_STRSG_Wu_2016.csv \ + VH14_Li_2023.csv \ + HIS7_YEAST_Pokusaeva_2019.csv \ + TRPB1_THEMA_Tm9D8_Johnston_2024.csv \ + PHOT_CHLRE_Chen_2023.csv \ + Q8WTC7_9CNID_Somermeyer_2022.csv \ + Q6WV13_9MAXI_Somermeyer_2022.csv \ + Q65J43_BACLD_g4_Thomas_2025.csv +do + echo "Downloading $key ..." + wget -q "https://zenodo.org/api/records/17620759/files/${key}/content" -O "$key" +done diff --git a/scripts/notebooks/benchmark/README.md b/scripts/notebooks/benchmark/README.md new file mode 100644 index 0000000000000000000000000000000000000000..5a47400e101619c70e552a7bca6b70b2a77305e8 --- /dev/null +++ b/scripts/notebooks/benchmark/README.md @@ -0,0 +1,8 @@ +# Benchmarking + +The multievolve_hyperparameter_tuning.py script can be used to train the models for benchmarking MULTI-evolve. + +# Data + +Large datasets are not included in this repository due to size constraints. Please download DMS dataset files from Zenodo (10.5281/zenodo.17620759) and place in: +- `data/benchmark/datasets/` diff --git a/scripts/notebooks/benchmark/multievolve_hyperparameter_tuning.py b/scripts/notebooks/benchmark/multievolve_hyperparameter_tuning.py new file mode 100644 index 0000000000000000000000000000000000000000..bb979c7d141d7dd05e9fdf4c8f8721b70f51ef4b --- /dev/null +++ b/scripts/notebooks/benchmark/multievolve_hyperparameter_tuning.py @@ -0,0 +1,49 @@ +from model.splitters import * +from model.featurizers import * +from model.predictors import * +from model.proposers import * +from model.utils import * +from pathlib import Path + +# dataset directory +project_root = Path(__file__).resolve().parents[3] +main_dir = project_root / 'data' / 'benchmark' +seq_dir = main_dir / 'sequences' +datasets_dir = main_dir / 'datasets' + +summary = pd.read_csv(main_dir / 'dataset_summary.csv') + +for index, row in summary.iterrows(): + + # default variables + dataset_name, dataset_fname, sequence = receive_dataset_vars(row) # get dataset vars + wt_file = retrieve_wt_file(dataset_name, seq_dir, sequence) # generate fasta file of sequence + working_df_head, working_df_head_valid = preprocess_dataset(dataset_fname, datasets_dir, stringency='singles') + + # variables for training models + protein_name = os.path.join(f"benchmark/", dataset_name) + train_df = working_df_head_valid[['mutant','DMS_score','DMS_score_bin']].copy() + + # get feature + feature = select_feature('onehot', protein_name) + featurizers = [feature] + + # get splitters + # generate split based on mutational load and do k-fold cross-validation + splitters = [] + for max_train_mut_load in range(1,4,1): + splitter = MutLoadProteinSplitter(protein_name, train_df, wt_file, use_cache=True, y_scaling=True, val_split=0.15) + splitter.split_data(max_train_muts=max_train_mut_load, min_test_muts=4, k_folds=5) + splitters = splitters + splitter.folds + + models = [Fcn] + + run_nn_model_experiments(splitters, + featurizers, + models, + experiment_name=dataset_name, + use_cache=True, + sweep_depth='custom', + search_method='grid', + count=1 + ) diff --git a/scripts/notebooks/benchmark/run.sh b/scripts/notebooks/benchmark/run.sh new file mode 100644 index 0000000000000000000000000000000000000000..46230da288f36e62c5537a4a23dd9927bb854eff --- /dev/null +++ b/scripts/notebooks/benchmark/run.sh @@ -0,0 +1 @@ +python multievolve_hyperparameter_tuning.py diff --git a/scripts/notebooks/examples/Part_1_introduction.ipynb b/scripts/notebooks/examples/Part_1_introduction.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..d51009b5a5fd5442e4804303f9b4c80a50aec2fa --- /dev/null +++ b/scripts/notebooks/examples/Part_1_introduction.ipynb @@ -0,0 +1,690 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "# Introduction\n", + "\n", + "The model package utilizes a series of four modules to prepare data and deploy models to perform machine learning guided directed evolution.\n", + "\n", + "1. ```Splitters``` are used to split the dataset into training, validation, and test sets.\n", + "\n", + "2. ```Featurizers``` are used to featurize the sequences.\n", + "\n", + "3. ```Predictors``` are used to train and deploy models to perform property prediction.\n", + "\n", + "4. ```Proposers``` are used to propose and evaluate new sequences given a list of trained models.\n", + "\n", + "For developers, additional classes can be added to each module to implement custom functionality." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from model.splitters import *\n", + "from model.featurizers import *\n", + "from model.predictors import *\n", + "from model.proposers import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting up\n", + "\n", + "First, define the following variables:\n", + "- ```experiment_name```: the name of the experiment\n", + "\n", + "- ```protein_name```: the name of the protein\n", + "\n", + "- ```wt_file```: the path to the wildtype sequence\n", + "\n", + "- ```training_dataset_fname```: the path to the training dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "experiment_name = \"example_experiment\"\n", + "protein_name = \"example_protein\"\n", + "wt_file = \"../../../data/example_protein/apex.fasta\"\n", + "training_dataset_fname = '../../../data/example_protein/example_dataset.csv'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Datasets should be in CSV format with following columns:\n", + "\n", + "- ```mutation```: the mutation, formatted as ```A123V```, wherein multi-mutants are separated by forward slashes (```/```). If there is no mutation, the value should be ```WT```.\n", + "\n", + "- ```property_value```: the property value\n", + "\n", + "- ```evolution_round```: the evolution round in which the variant was measured (optional)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "df = pd.read_csv(training_dataset_fname)\n", + "df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Splitters\n", + "\n", + "Several splitters are available in the ```splitters``` module. Each splitter can split the dataset into training, validation, and test sets using different strategies. To learn more about the splitters, check out the ```splitters.ipynb``` notebook." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each splitter has the following parameters:\n", + "\n", + "- ```protein_name```: the name of the protein\n", + "\n", + "- ```training_dataset_fname```: the path to the training dataset\n", + "\n", + "- ```wt_file```: the path to the wildtype sequence\n", + "\n", + "- ```csv_has_header```: whether the CSV has a header\n", + "\n", + "- ```use_cache```: whether to cache the processed dataset for later use (default: ```False```)\n", + "\n", + "- ```y_scaling```: whether to scale the property values between 0 and 1 (default: ```False```)\n", + "\n", + "- ```val_split```: the proportion of the dataset to include in the validation set (default: ```None```). The validation set is only used for when training neural network models.\n", + "\n", + "We will initilize two splitters: one for non-neural network models and one for neural network models. We will use a validation set of 15% of the data for the neural network models." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "splitter = RandomProteinSplitter(protein_name, training_dataset_fname, wt_file, csv_has_header=True, use_cache=True, y_scaling=False, val_split=None)\n", + "splitter_nn = RandomProteinSplitter(protein_name, training_dataset_fname, wt_file, csv_has_header=True, use_cache=True, y_scaling=False, val_split=0.15)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The ```data``` attribute of the splitter views the dataset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "splitter.data.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After initializing the splitter, run ```splitter.split_data()``` to split the data. For ```RandomProteinSplitter```, the ```split_data()``` method takes the following parameters:\n", + "\n", + "- ```test_size```: the proportion of the dataset to include in the test set" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "splitter.split_data(test_size=0.15)\n", + "splitter_nn.split_data(test_size=0.15)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And that's it! The dataset has now been split into training, validation, and test sets and can be fed into the ```Predictors``` module to train and deploy models. If you check the ```splits``` attribute of the splitter, you will see that the dataset has been split into training, validation, and test sets in the form of a dictionary." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "splitter.splits.keys()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "print(splitter.splits['X_train'][:3])\n", + "print(splitter.splits['y_train'][:3])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Featurizers\n", + "\n", + "Featurizers are used to featurize the sequences. To learn more about the different featurizers, check out the ```featurizers.ipynb``` notebook." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each featurizer has the following parameters:\n", + "\n", + "- ```protein```: the name of the protein for caching\n", + "\n", + "- ```use_cache```: whether to cache the features for later use (default: ```False```)\n", + "\n", + "- ```flatten_features```: whether to flatten the feature vectors (default: ```False```)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "featurizer = OneHotFeaturizer(protein=protein_name, use_cache=True, flatten_features=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Predictors\n", + "\n", + "Predictors are used to train and deploy models to perform property prediction. To learn more about the different predictors, check out the documentation.\n", + "\n", + "Each predictor has the following parameters:\n", + "\n", + "- ```splitter```: the splitter to use\n", + "\n", + "- ```featurizer```: the featurizer to use\n", + "\n", + "- ```use_cache```: whether to cache the model for later use (default: ```False```)\n", + "\n", + "- ```show_plots```: whether to show matplotlib plots (default: ```True```)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Training non-neural network models" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There a several models available in the ```predictors``` module. To learn more about the different models, check out the documentation.\n", + "\n", + "- ```RidgeRegressor```: a ridge regression model\n", + "\n", + "- ```RandomForestRegressor```: a random forest regression model\n", + "\n", + "- ```GPLinearRegressor```: a gaussian process linear regression model\n", + "\n", + "- ```GPQuadRegressor```: a gaussian process quadratic regression model\n", + "\n", + "- ```GPRBFRegressor```: a gaussian process radial basis function regression model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "predictor = RidgeRegressor(splitter, featurizer, use_cache=True, show_plots=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After initializing the predictor, run ```predictor.run_model()``` to train and deploy the model. This command returns a dictionary of performance statistics as well as a plot of the model's performance on the test set." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "stats = predictor.run_model()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pd.DataFrame([stats]).transpose().rename(columns={0: 'Value'})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That's it! The model has now been trained and deployed and can be used to predict the property of new sequences." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Training neural network models\n", + "\n", + "Training neural network models is similar to training machine learning models. The only major difference is that neural network models require a ```config``` dictionary to specify the network architecture.\n", + "\n", + "In the model package, there are two simple neural network models available: ```Fcn``` and ```Cnn```. ```Fcn``` is a fully connected neural network and ```Cnn``` is a convolutional neural network.\n", + "\n", + "First, we will train a fully connected neural network." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Fully connected neural network\n", + "\n", + "The config dictionary for the fully connected neural network has the following parameters:\n", + "\n", + "- ```layer_size```: the number of neurons in the hidden layers\n", + "\n", + "- ```num_layers```: the number of hidden layers\n", + "\n", + "- ```learning_rate```: the learning rate for the optimizer\n", + "\n", + "- ```batch_size```: the batch size for training\n", + "\n", + "- ```optimizer```: the optimizer to use (default: ```adam```)\n", + "\n", + "- ```epochs```: the number of epochs to train for" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# config\n", + "config = {\n", + " 'layer_size': 100,\n", + " 'num_layers' : 2,\n", + " 'learning_rate': 0.001,\n", + " 'batch_size': 32,\n", + " 'optimizer': 'adam',\n", + " 'epochs': 300\n", + "}\n", + "\n", + "fcn_model = Fcn(splitter_nn, featurizer, config=config, use_cache=True, show_plots=True)\n", + "stats = fcn_model.run_model()\n", + "pd.DataFrame([stats]).transpose().rename(columns={0: 'Value'})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Convolutional neural network\n", + "\n", + "The convolutional neural network is a 2D convolutional neural network that scans across the featurized protein sequences with dimensions of ```(sequence_length, feature_length)``` with filter size ```(kernel_size, feature_length)```. When using the ```Cnn``` class, make sure to set ```flatten_features=False``` in the ```Featurizer``` class.\n", + "\n", + "The config dictionary for the convolutional neural network has the following parameters:\n", + "\n", + "- ```layersize_filtersize```: the number of hidden layers and the number of filters separated by a dash (```-```)\n", + "\n", + "- ```kernel_size```: the kernel size for the convolutional layer\n", + "\n", + "- ```learning_rate```: the learning rate for the optimizer\n", + "\n", + "- ```batch_size```: the batch size for training\n", + "\n", + "- ```optimizer```: the optimizer to use (default: ```adam```)\n", + "\n", + "- ```epochs```: the number of epochs to train for" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "config = {\n", + " 'layersize_filtersize': \"1-12\",\n", + " 'kernel_size' : 17,\n", + " 'learning_rate':0.001,\n", + " 'batch_size': 32,\n", + " 'optimizer': 'adam',\n", + " 'epochs': 10\n", + "}\n", + "\n", + "cnn_model = Cnn(splitter_nn, featurizer, config=config, use_cache=True)\n", + "stats = cnn_model.run_model()\n", + "pd.DataFrame([stats]).transpose().rename(columns={0: 'Value'})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Proposers\n", + "\n", + "Proposers are used to propose new sequences given a list of trained models. To learn more about the different proposers, check out the documentation. Generally, we used the ```CombinatorialProposer``` to propose new sequences.\n", + "\n", + "Each proposer has the following parameters:\n", + "\n", + "- ```start_seq```: the starting sequence to mutate, generally the wildtype sequence\n", + "\n", + "- ```models```: the list of trained models\n", + "\n", + "- ```trust_radius```: the maximum number of mutations allowed in the proposed variant\n", + "\n", + "- ```num_seeds```: the maximum number of sequences to propose for evaluation, -1 means tests all possible variants\n", + "\n", + "- ```mutation_pool```: the list of allowed mutations for generating the proposed variants" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "wt_seq = 'MGKSYPTVSADYQDAVEKAKKKLRGFIAEKRCAPLMLRLAFHSAGTFDKGTKTGGPFGTIKHPAELAHSANNGLDIAVRLLEPLKAEFPILSYADFYQLAGVVAVEVTGGPKVPFHPGREDKPEPPPEGRLPDATKGSDHLRDVFGKAMGLTDQDIVALSGGHTIGAAHKERSGFEGPWTSNPLIFDNSYFTELLSGEKEGLLQLPSDKALLSDPVFRPLVDKYAADEDAFFADYAEAHQKLSELGFADA'\n", + "mutations = ['T192V', 'T192K', 'A167R', 'N72A', 'D222E', 'A148Q', 'D229A', 'S138A', 'K61R', 'S196A', 'I185V', 'L84V', 'E87Q', 'G50R', 'L80M']\n", + "\n", + "proposer = CombinatorialProposer(\n", + " start_seq=wt_seq,\n", + " models=[fcn_model], \n", + " trust_radius=10, \n", + " num_seeds=-1, \n", + " # num_seeds=20, \n", + " mutation_pool=mutations)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After initializing the proposer, run ```proposer.propose()``` to propose new sequences. This command returns a dataframe of proposed sequences and their evaluations." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "proposal_results = proposer.propose()\n", + "proposal_results.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After proposing new sequences, run ```proposer.evaluate_proposals()``` to evaluate the proposed sequences. This command returns a dataframe of proposed sequences and their evaluations." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "proposer.evaluate_proposals()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The ```proposals``` dataframe now contains the proposed sequences and their evaluations." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "proposer.proposals.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The results can now be saved to a CSV file using ```proposer.save_proposals()```. Results will be saved in the following folder: ```destination_folder/proposers/results/```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "proposer.save_proposals(f'{experiment_name}_proposals') " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Another alternative proposer is the ```DeepMutationalScanningProposer```, which generates every possible single amino acid substitution and predicts the property of each proposed sequence." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dms_proposer = DeepMutationalScanningProposer(\n", + " start_seq=wt_seq, \n", + " models=[predictor]\n", + " )\n", + "dms_proposer.propose()\n", + "dms_proposer.evaluate_proposals()\n", + "dms_proposer.save_proposals(f'{experiment_name}_dms_proposals') " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dms_proposer.proposals.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# (Aside) Cache save locations\n", + "\n", + "A new directory named ```proteins``` will be created. Under the ```protein_name```, there will be cache folders for splitters, featurizers, predictors, and proposers. The cache folder organization will look like this:\n", + "\n", + "```\n", + "example_protein/ \n", + "鈹溾攢鈹€ example_dataset.csv \n", + "鈹溾攢鈹€ feature_cache/ \n", + "鈹? 鈹斺攢鈹€ onehot/ \n", + "鈹溾攢鈹€ model_cache/ \n", + "鈹? 鈹斺攢鈹€ example_dataset/ \n", + "鈹? 鈹溾攢鈹€ objects/ \n", + "鈹? 鈹斺攢鈹€ results/ \n", + "鈹斺攢鈹€ proposers/ \n", + " 鈹斺攢鈹€ results/ \n", + "鈹溾攢鈹€ split_cache/ \n", + "鈹? 鈹斺攢鈹€ example_dataset/ \n", + "```\n", + "\n", + "The ```feature_cache``` folder contains the featurized sequences separated based on featurizer type.\n", + "\n", + "The ```model_cache``` folder contains the predictor objects separated by dataset. The ```objects``` folder contains the saved models and the ```results``` folder contain results generating when comparing multiple models (seen later in the ```Part_2_comparing_multiple_models.ipynb``` notebook).\n", + "\n", + "The ```proposers``` folder contains the results of the evaluated proposed sequences.\n", + "\n", + "The ```split_cache``` folder contains the splitter objects separated by dataset. \n", + "\n", + "If you check the ```file_attrs``` attribute of the splitter or predictor, you will see the cache save locations of the objects." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "splitter.file_attrs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "predictor.file_attrs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Summary\n", + "\n", + "Overall, we have seen how to use the ```splitters```, ```featurizers```, ```predictors```, and ```proposers``` modules to train and deploy models to perform property prediction in a few lines of code. We separated the code into these four modules to be able to compare different methods of data splits, featurizations, and models. The full example of a code block training a simple ridge regression model and proposing new sequences is shown below. By changing a single line of code, you can test a different data split method, featurization, or model, allowing for easy comparison of different methods.\n", + "\n", + "For streamlined comparison of multiple methods of data splits, featurizations, and models, head over to ```Part_2_comparing_multiple_models.ipynb```.\n", + "\n", + "Again, to learn more about the different modules, check out the ```splitters.ipynb``` and ```featurizers.ipynb``` notebooks." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Full Example" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Define variables\n", + "experiment_name = \"example_experiment\"\n", + "protein_name = \"example_protein\"\n", + "wt_file = \"../../../data/example_protein/apex.fasta\"\n", + "training_dataset_fname = '../../../data/example_protein/example_dataset.csv'\n", + "\n", + "# Initialize splitter\n", + "splitter = RandomProteinSplitter(protein_name, training_dataset_fname, wt_file, csv_has_header=True, use_cache=True, y_scaling=False, val_split=None)\n", + "splitter.split_data(test_size=0.15)\n", + "\n", + "# Initialize featurizer\n", + "featurizer = OneHotFeaturizer(protein=protein_name, use_cache=True, flatten_features=False)\n", + "\n", + "# Initialize predictor\n", + "predictor = RidgeRegressor(splitter, featurizer, use_cache=True)\n", + "stats = predictor.run_model()\n", + "\n", + "# Initialize proposer\n", + "wt_seq = 'MGKSYPTVSADYQDAVEKAKKKLRGFIAEKRCAPLMLRLAFHSAGTFDKGTKTGGPFGTIKHPAELAHSANNGLDIAVRLLEPLKAEFPILSYADFYQLAGVVAVEVTGGPKVPFHPGREDKPEPPPEGRLPDATKGSDHLRDVFGKAMGLTDQDIVALSGGHTIGAAHKERSGFEGPWTSNPLIFDNSYFTELLSGEKEGLLQLPSDKALLSDPVFRPLVDKYAADEDAFFADYAEAHQKLSELGFADA'\n", + "mutations = ['T192V', 'T192K', 'A167R', 'N72A', 'D222E', 'A148Q', 'D229A', 'S138A', 'K61R', 'S196A', 'I185V', 'L84V', 'E87Q', 'G50R', 'L80M']\n", + "proposer = CombinatorialProposer(start_seq=wt_seq, models=[predictor], trust_radius=10, num_seeds=20, mutation_pool=mutations)\n", + "proposal_results = proposer.propose()\n", + "proposer.evaluate_proposals()\n", + "proposer.save_proposals(f'{experiment_name}_proposals') " + ] + } + ], + "metadata": { + "environment": { + "kernel": "multievolve", + "name": "workbench-notebooks.m128", + "type": "gcloud", + "uri": "us-docker.pkg.dev/deeplearning-platform-release/gcr.io/workbench-notebooks:m128" + }, + "kernelspec": { + "display_name": "multievolve_mac", + "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.11.13" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/scripts/notebooks/examples/Part_2_comparing_multiple_models.ipynb b/scripts/notebooks/examples/Part_2_comparing_multiple_models.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..5766513e23a47aae9de00c96727e04b989cf405d --- /dev/null +++ b/scripts/notebooks/examples/Part_2_comparing_multiple_models.ipynb @@ -0,0 +1,298 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Introduction\n", + "\n", + "In the previous notebook, we saw how to use the ```splitters```, ```featurizers```, ```predictors```, and ```proposers``` modules to train and deploy models to perform property prediction. In this notebook, we will see how to test multiple methods of data splits, featurizations, and models at once. We will initialize several different ```splitters```, ```featurizers```, and ```predictors``` and test them all at once." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from model.splitters import *\n", + "from model.featurizers import *\n", + "from model.predictors import *\n", + "from model.proposers import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting up\n", + "\n", + "First, define the following variables as before:\n", + "- ```experiment_name```: the name of the experiment\n", + "\n", + "- ```protein_name```: the name of the protein\n", + "\n", + "- ```wt_file```: the path to the wildtype sequence\n", + "\n", + "- ```training_dataset_fname```: the path to the training dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "experiment_name = \"example_experiment\"\n", + "protein_name = \"example_protein\"\n", + "wt_file = \"../../../data/example_protein/apex.fasta\"\n", + "training_dataset_fname = '../../../data/example_protein/example_dataset.csv'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Non-neural network models\n", + "\n", + "We will show an example for non-neural network models first." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First, we initialize our desired splitters and save them in a list." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "random_splitter = RandomProteinSplitter(protein_name, training_dataset_fname, wt_file, csv_has_header=True, use_cache=True, y_scaling=False, val_split=None)\n", + "round_splitter = RoundProteinSplitter(protein_name, training_dataset_fname, wt_file, csv_has_header=True, use_cache=True, y_scaling=False, val_split=None)\n", + "\n", + "random_splitter.split_data(test_size=0.2)\n", + "round_splitter.split_data(min_test_round=1, max_train_round=0)\n", + "\n", + "splitters = [random_splitter, round_splitter]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we initialize our desired featurizers." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "onehot = OneHotFeaturizer(protein=protein_name, use_cache=True)\n", + "georgiev = GeorgievFeaturizer(protein=protein_name, use_cache=True)\n", + "\n", + "featurizers = [onehot, georgiev]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we initialize our desired predictors in the form of a list." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "predictors = [RidgeRegressor, RandomForestRegressor]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, we run the following function ```run_model_experiments``` to train and test all the models. The function will return a pandas dataframe with the results, which are also saved in the directory where the training dataset is located in the folder ```model_cache/dataset_name/results```\n", + "\n", + "```run_model_experiments``` takes the following arguments:\n", + "\n", + "- ```splitters```: A list of splitters to use for the experiment.\n", + "\n", + "- ```featurizers```: A list of featurizers to use for the experiment.\n", + "\n", + "- ```predictors```: A list of predictors to use for the experiment.\n", + "\n", + "- ```experiment_name```: The name of the experiment.\n", + "\n", + "- ```use_cache```: Whether to use the cache for the splitters, featurizers, and predictors.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "results = run_model_experiments(splitters, featurizers, predictors, experiment_name,use_cache=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Neural network models\n", + "\n", + "Now, we will show an example for neural network models. You will need to have a wandb account to run this example.\n", + "\n", + "For neural network models, we used wandb to perform hyperparameter sweeps, which include comparing different methods of splitting and featurizing.\n", + "\n", + "We will initialize the same splitters and featurizers as before, and train various fully connected neural networks with different architectures and hyperparameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "random_splitter = RandomProteinSplitter(protein_name, training_dataset_fname, wt_file, csv_has_header=True, use_cache=True, y_scaling=False, val_split=0.15)\n", + "round_splitter = RoundProteinSplitter(protein_name, training_dataset_fname, wt_file, csv_has_header=True, use_cache=True, y_scaling=False, val_split=0.15)\n", + "\n", + "random_splitter.split_data(test_size=0.2)\n", + "round_splitter.split_data(min_test_round=1, max_train_round=0)\n", + "\n", + "splitters = [random_splitter, round_splitter]" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "onehot = OneHotFeaturizer(protein=protein_name, use_cache=True) # just as an example, we will just use onehot featurizer\n", + "\n", + "featurizers = [onehot]" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "models = [Fcn]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For neural network models, we use the function ```run_nn_model_experiments``` to train and test all the models. Unlike the previous function, the results of the model training are saved on the wandb server.\n", + "\n", + "```run_nn_model_experiments``` takes the following arguments:\n", + "\n", + "- ```splitters```: A list of splitters to use for the experiment.\n", + "\n", + "- ```featurizers```: A list of featurizers to use for the experiment.\n", + "\n", + "- ```models```: A list of models to use for the experiment.\n", + "\n", + "- ```experiment_name```: The name of the experiment.\n", + "\n", + "- ```use_cache```: Whether to use the cache for the splitters, featurizers, and predictors.\n", + "\n", + "- ```sweep_depth```: The depth of the hyperparameter sweep. Options are 'test', 'standard', and 'custom'. 'test' is to test the training on a single hyperparameter configuration. 'standard' will test a standard set of hyperparameter configurations. 'custom' is a modified version of 'standard' that can be modified to test a subset of hyperparameter configurations.\n", + "\n", + "\n", + "- ```search_method```: The method of hyperparameter search. Options are 'test', 'grid', and 'bayes'. 'test' is to test the training on a single hyperparameter configuration. 'grid' is to test the training on all possible hyperparameter configurations. 'bayes' is to test the training on a bayesian search of hyperparameter configurations.\n", + "\n", + "- ```count```: The number of different hyperparameter configurations to test. This is only used if ```search_method``` is 'bayes'.\n", + "\n", + "If the user wants to modify the hyperparameter sweeps to test other hyperparameters, then the configuration files for the sweep configs can be found in ```model/predictors/sweep_configs```." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "run_nn_model_experiments(splitters, \n", + " featurizers, \n", + " models, \n", + " experiment_name=experiment_name,\n", + " use_cache=False,\n", + " sweep_depth='test', \n", + " search_method='test',\n", + " count=1\n", + " )" + ] + } + ], + "metadata": { + "environment": { + "kernel": "multievolve", + "name": "workbench-notebooks.m128", + "type": "gcloud", + "uri": "us-docker.pkg.dev/deeplearning-platform-release/gcr.io/workbench-notebooks:m128" + }, + "kernelspec": { + "display_name": "multievolve", + "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.11.11" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/scripts/notebooks/examples/featurizers.ipynb b/scripts/notebooks/examples/featurizers.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..d5e76da86e3dbae6d1d46feea60997253704a068 --- /dev/null +++ b/scripts/notebooks/examples/featurizers.ipynb @@ -0,0 +1,160 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Introduction\n", + "\n", + "This notebook will discuss how to use the various featurizers in the ```multievolve``` package." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "from model.splitters import *\n", + "from model.featurizers import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting up\n", + "\n", + "First, define the following variables:\n", + "\n", + "- ```protein_name```: the name of the protein\n", + "\n", + "- ```wt_file```: the path to the wildtype sequence\n", + "\n", + "- ```training_dataset_fname```: the path to the training dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "protein_name = \"example_protein\"\n", + "wt_file = \"../../../data/example_protein/apex.fasta\"\n", + "training_dataset_fname = '../../../data/example_protein/example_dataset.csv'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Define a splitter object 鈥?we will just use this to load the dataset and pull sequences from to featurizer later." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "splitter = RandomProteinSplitter(protein_name, training_dataset_fname, wt_file, csv_has_header=True, use_cache=True, y_scaling=False, val_split=None)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Featurizers\n", + "\n", + "There are many featurizers available in the ```multievolve``` package. We discuss a few of the most common ones below. \n", + "\n", + "- ```OneHotFeaturizer```: One-hot encoding of the protein sequence\n", + "\n", + "- ```GeorgievFeaturizer```: Georgiev et al. (2022) featurizer\n", + "\n", + "- ```AAIdxFeaturizer```: amino acid index featurizer \n", + "\n", + "- ```ESMLogitsFeaturizer```: ESM-2 logits featurizer\n", + "\n", + "- ```ESM2EmbedFeaturizer```: ESM-2 embedding featurizer\n", + "\n", + "There are also combinatorial featurizers that combine multiple featurizers.\n", + "\n", + "- ```ESMAugmentedFeaturizer```: One-hot encoding augmented likelihood scores from the ESM-1/ESM-2 models\n", + "\n", + "- ```OnehotAndGeorgievFeaturizer```: One-hot encoding combined with Georgiev et al. (2022) featurizer, wherein the encodings are stacked along the last axis (i.e. by position)\n", + "\n", + "- ```OnehotAndAAIdxFeaturizer```: One-hot encoding augmented with amino acid index featurizer, wherein the encodings are stacked along the last axis (i.e. by position)\n", + "\n", + "- ```OnehotAndESMLogitsFeaturizer```: One-hot encoding augmented with ESM-2 logits featurizer, wherein the encodings are stacked along the last axis (i.e. by position)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# Base Featurizers\n", + "onehot = OneHotFeaturizer(protein=protein_name, use_cache=True)\n", + "georgiev = GeorgievFeaturizer(protein=protein_name, use_cache=True)\n", + "aa_idx = AAIdxFeaturizer(protein=protein_name, use_cache=True)\n", + "esm_logits = ESMLogitsFeaturizer(protein=protein_name, use_cache=True)\n", + "esm_embed = ESM2EmbedFeaturizer(protein=protein_name, use_cache=True)\n", + "\n", + "# Combinatorial Featurizers\n", + "esm_augmented = ESMAugmentedFeaturizer(protein=protein_name, use_cache=True, wt_file=wt_file)\n", + "onehotgeorgiev = OnehotAndGeorgievFeaturizer(protein=protein_name, use_cache=True)\n", + "onehotaaidx = OnehotAndAAIdxFeaturizer(protein=protein_name, use_cache=True)\n", + "onehotesmlogits = OnehotAndESMLogitsFeaturizer(protein=protein_name, use_cache=True)\n", + "onehotesmmsalogits = OnehotAndESMMSALogitsFeaturizer(protein=protein_name, use_cache=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Featurizers have the function ```featurize```, which takes in a list of sequences and returns the featurized sequences." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "example_sequences = splitter.data[0][:5].tolist()\n", + "\n", + "onehot.featurize(example_sequences)" + ] + } + ], + "metadata": { + "environment": { + "kernel": "multievolve", + "name": "workbench-notebooks.m128", + "type": "gcloud", + "uri": "us-docker.pkg.dev/deeplearning-platform-release/gcr.io/workbench-notebooks:m128" + }, + "kernelspec": { + "display_name": "multievolve", + "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.11.11" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/scripts/notebooks/examples/splitters.ipynb b/scripts/notebooks/examples/splitters.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..d23c077b2e6637d3b1f8843c73e6d1d8ed906653 --- /dev/null +++ b/scripts/notebooks/examples/splitters.ipynb @@ -0,0 +1,570 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Introduction\n", + "\n", + "This notebook will discuss how to use the various splitters in the ```multievolve``` package." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from model.splitters import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting up\n", + "\n", + "First, define the following variables, including a structure of the protein of interest:\n", + "\n", + "- ```protein_name```: the name of the protein\n", + "\n", + "- ```wt_file```: the path to the wildtype sequence\n", + "\n", + "- ```training_dataset_fname```: the path to the training dataset\n", + "\n", + "- ```structure_file```: the path to the structure file, either .pdb or .cif" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "protein_name = \"example_protein\"\n", + "wt_file = \"../../../data/example_protein/apex.fasta\"\n", + "training_dataset_fname = '../../../data/example_protein/example_dataset.csv'\n", + "structure_file = \"../../../data/example_protein/apex.cif\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Refresher\n", + "\n", + "As previously mentioned, each splitter has the following parameters:\n", + "\n", + "- ```protein_name```: the name of the protein\n", + "\n", + "- ```training_dataset_fname```: the path to the training dataset\n", + "\n", + "- ```wt_file```: the path to the wildtype sequence\n", + "\n", + "- ```csv_has_header```: whether the CSV has a header\n", + "\n", + "- ```use_cache```: whether to cache the processed dataset for later use (default: ```False```)\n", + "\n", + "- ```y_scaling```: whether to scale the property values between 0 and 1 (default: ```False```)\n", + "\n", + "- ```val_split```: the proportion of the dataset to include in the validation set (default: ```None```). The validation set is only used for when training neural network models." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### KFoldProteinSplitter\n", + "\n", + "```KFoldProteinSplitter```: Performs k-fold cross-validation by randomly splitting data into k folds." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "kfold_splitter = KFoldProteinSplitter(protein_name, training_dataset_fname, wt_file, csv_has_header=True, use_cache=False, y_scaling=False, val_split=None)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Unlike the other Splitters in which we run ```split_data()``` method, we obtain the processed datasets by running ```kfold_splitter.generate_splits(n_splits=5)```, where ```n_splits``` is the number of folds, in this case we perform 5-fold cross-validation. \n", + "\n", + "This returns a list of ```n_splits``` splitter objects, each with using a different fold for the test set." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "splits = kfold_splitter.generate_splits(n_splits=5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Again, if you check the ```splits``` attribute of one of the splitter objects, then you will see that the dataset has been split into training, validation, and test sets in the form of a dictionary." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "splits[0].splits.keys()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### RoundProteinSplitter\n", + "\n", + "```RoundProteinSplitter```: Splits data based on evolution rounds, allowing training on early rounds and testing on later rounds." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "round_splitter = RoundProteinSplitter(protein_name, training_dataset_fname, wt_file, csv_has_header=True, use_cache=False, y_scaling=False, val_split=None)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For ```RoundProteinSplitter```,```split_data()``` has the following arguments:\n", + "- ```max_train_round```: the maximum round number to include in the training set\n", + "- ```min_test_round```: the minimum round number to include in the test set" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "round_splitter.split_data(max_train_round=0, min_test_round=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### RandomProteinSplitter\n", + "\n", + "```RandomProteinSplitter```: Randomly splits data into training and test sets with a specified test size." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "random_splitter = RandomProteinSplitter(protein_name, training_dataset_fname, wt_file, csv_has_header=True, use_cache=False, y_scaling=False, val_split=None)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For ```RandomProteinSplitter```,```split_data()``` has the following arguments:\n", + "- ```test_size```: the proportion of the dataset to include in the test set" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "random_splitter.split_data(test_size=0.2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### PositionProteinSplitter\n", + "\n", + "```PositionProteinSplitter```: Splits based on mutation positions - variants with mutations at certain positions go to test set." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "position_splitter = PositionProteinSplitter(protein_name, training_dataset_fname, wt_file, csv_has_header=True, use_cache=False, y_scaling=False, val_split=None)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For ```PositionProteinSplitter```,```split_data()``` has the following arguments:\n", + "- ```test_size_sample```: the proportion of the dataset to sample to get mutation positions to exclude out of the training set\n", + "- ```sample_iter```: the number of iterations to perform to get a test set size between ```test_size_min``` and ```test_size_max```\n", + "- ```test_size_min```: the minimum test size set desired\n", + "- ```test_size_max```: the maximum test size set allowed\n", + "\n", + "When splitting the data, the splitter will sample random mutations to get the mutation positions to exclude out of the training set. The splitter will attempt to get a test set size between a specified range, and will repeat sampling for specified number of iterations if the test set size is not within the desired range." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "position_splitter.split_data(test_size_sample=0.2, sample_iter=3, test_size_min=0.2, test_size_max=0.3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### RegionProteinSplitter\n", + "\n", + "```RegionProteinSplitter```: Splits based on protein regions - variants with mutations in specified regions go to test set." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "region_splitter = RegionProteinSplitter(protein_name, training_dataset_fname, wt_file, csv_has_header=True, use_cache=False, y_scaling=False, val_split=None)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For ```RegionProteinSplitter```,```split_data()``` has the following arguments:\n", + "- ```region```: a list of two numbers defining the minimum and maximum positions to include in the test set (e.g. [1, 60])" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "region_splitter.split_data(region=[1, 60])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### PropertyProteinSplitter\n", + "\n", + "```PropertyProteinSplitter```: Splits based on property values - can separate high/low performing variants." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "property_splitter = PropertyProteinSplitter(protein_name, training_dataset_fname, wt_file, csv_has_header=True, use_cache=False, y_scaling=False, val_split=None)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For ```PropertyProteinSplitter```,```split_data()``` has the following arguments:\n", + "- ```property```: the value of the property split on\n", + "- ```above_or_below```: 'above' or 'below', values to leave out into the test set based on the given property value" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "property_splitter.split_data(property=1, above_or_below='above')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### MutLoadProteinSplitter\n", + "\n", + "```MutLoadProteinSplitter```: Splits based on number of mutations - can train on low mutation count variants and test on higher ones.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "mutload_splitter = MutLoadProteinSplitter(protein_name, training_dataset_fname, wt_file, csv_has_header=True, use_cache=False, y_scaling=False, val_split=None)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For ```MutLoadProteinSplitter```,```split_data()``` has the following arguments:\n", + "- ```max_train_muts```: the maximum mutation load to include in the training set\n", + "- ```min_test_muts```: the minimum mutation load to include in the test set" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "mutload_splitter.split_data(max_train_muts=1, min_test_muts=2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### ResidueDistanceSplitter\n", + "\n", + "```ResidueDistanceSplitter```: Splits based on 3D distances between mutations using protein structure.\n", + "\n", + "When initializing ```ResidueDistanceSplitter```, we need to specify the additional arguments:\n", + "- ```pdb_file```: the path to the PDB/CIF structure file\n", + "- ```chain_ids```: the chain IDs of the protein of interest" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "residue_distance_splitter = ResidueDistanceSplitter(protein_name, training_dataset_fname, wt_file, csv_has_header=True, use_cache=False, y_scaling=False, val_split=None,\n", + " pdb_file=structure_file, chain_ids=['A'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For ```ResidueDistanceSplitter```,```split_data()``` has the following arguments:\n", + "- ```percentile_threshold```: the percentile threshold for the distance to include in the training set\n", + "- ```min_test_muts```: the minimum number of mutations to include in the test set\n", + "- ```max_train_muts```: the maximum number of mutations to include in the training set\n", + "- ```randomized_control```: whether to randomize the distance dictionary as a control (default: ```False```)\n", + "\n", + "When splitting the data, the splitter will calculate the distance percentile for each variant within its mutational load group. The splitter will consider variants with mutational load less than or equal to the ```max_train_muts``` for the training set. The splitter will then split the data based on the distance percentile, with variants with distances less than or equal to the percentile threshold going to the training set and variants with distances greater than the percentile threshold going to the test set. All variants will a mutational load higher than or equal to ```max_train_muts``` will go to the test set." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "residue_distance_splitter.split_data(\n", + " percentile_threshold=50, \n", + " min_test_muts=5, \n", + " max_train_muts=2,\n", + " randomized_control=False\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Multi-chain proteins\n", + "\n", + "If you are working with multi-chain proteins such as antibodies that have a heavy variable domain and light variable domain, you can use the Splitters to accept both chains.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting up\n", + "\n", + "With multi-chain proteins, you need to:\n", + "- Specify the wild-type sequences for each chain in the ```wt_files``` argument as a list." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "protein_name_multichain = \"example_multichain_protein\"\n", + "wt_files = ['../../../data/example_multichain_protein/vh_chain1.fasta', '../../../data/example_multichain_protein/vl_chain2.fasta']\n", + "training_dataset_fname_multichain = '../../../data/example_multichain_protein/example_dataset.csv'\n", + "structure_file_multichain = 'multichain_protein.cif'\n", + "chain_ids = ['A', 'B']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Formatting datasets for multi-chain proteins\n", + "For multi-chain datasets, the mutation strings for each chain are separated by a colon (e.g. ```F32Y:E61Y```). If a variant is wild-type for both chains, then the mutation string should be ```WT:WT```. If a variant is wild-type for one chain and has a mutation for the other chain, then the mutation string should be ```WT:F32Y```." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_csv(training_dataset_fname_multichain)\n", + "df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Example with ResidueDistanceSplitter" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For the ```ResidueDistanceSplitter```, the arguments should be as follows:\n", + "- Specify the chain IDs in the ```chain_ids``` argument as a list.\n", + "- Specify the structure file in the ```pdb_file``` argument. This should be one structure containing all chains." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "split = ResidueDistanceSplitter(protein_name_multichain, training_dataset_fname_multichain, wt_files, csv_has_header=True, use_cache=False, \n", + " y_scaling=False,\n", + " val_split=None,\n", + " pdb_file=structure_file_multichain,\n", + " chain_ids=chain_ids,\n", + " random_state=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For multi-chain proteins, the Splitter will concatenate the sequences of each chain to get the full sequence. It will then automatically adjust the mutation positions for each chain to match the positions in the full concatenatedsequence." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "split.data" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "residue_distance_splitter.split_data(\n", + " percentile_threshold=50, \n", + " min_test_muts=5, \n", + " max_train_muts=2,\n", + " randomized_control=False\n", + " )" + ] + } + ], + "metadata": { + "environment": { + "kernel": "multievolve", + "name": "workbench-notebooks.m128", + "type": "gcloud", + "uri": "us-docker.pkg.dev/deeplearning-platform-release/gcr.io/workbench-notebooks:m128" + }, + "kernelspec": { + "display_name": "multievolve", + "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.11.11" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/scripts/notebooks/examples/zeroshot.ipynb b/scripts/notebooks/examples/zeroshot.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..c60fbcf9dcca212cb4cc32974930bc03d8623d68 --- /dev/null +++ b/scripts/notebooks/examples/zeroshot.ipynb @@ -0,0 +1,135 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# # (optional) check if the installation is successful\n", + "# import torch_sparse\n", + "# import torch_geometric\n", + "# import torch_cluster\n", + "# import torch_scatter\n", + "# import torch_spline_conv" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Introduction\n", + "\n", + "This notebook shows you how to run zero-shot with an ensemble of non-structure-informed models (ESM-1v, ESM-2 3B) with the ```zero_shot_esm_dms``` function as well as run zero-shot with a structure-informed model (ESM-IF) using ```zero_shot_esm_if_dms``` function. \n", + "\n", + "```zero_shot_esm_dms``` requires the wild-type amino acid sequence of the protein of the interest\n", + "\n", + "```zero_shot_esm_if_dms``` requires the wild-type amino acid sequence and the structure of the protein of the interest, including the chain id of the protein of interest in the structure file.\n", + "\n", + "Both functions return a dataframe with all the possible single amino acid mutations and their corresponding log likelihood ratio scores (i.e. the ratio of the likelihood compared to the wild-type sequence)." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from Bio import SeqIO\n", + "\n", + "from model import zero_shot_esm_dms, zero_shot_esm_if_dms" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "wt_file = \"../../../data/example_protein/apex.fasta\"\n", + "pdb_file = \"../../../data/example_protein/apex.cif\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "wt_seq = str(SeqIO.read(wt_file, \"fasta\").seq)\n", + "\n", + "esm_zeroshot = zero_shot_esm_dms(wt_seq)\n", + "esm_if_zeroshot = zero_shot_esm_if_dms(wt_seq, pdb_file, chain_id = 'A', scoring_strategy='wt-marginals')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The ```zero_shot_esm_dms``` returns a dataframe with the log likelihood ratio scores for each model as well as whether the mutation had a ratio greater than 1 indicated by the corresponding ```model#_pass``` column." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "esm_zeroshot.head(10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The ```zero_shot_esm_if_dms``` returns a dataframe with the log likelihood ratio scores." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "esm_if_zeroshot.head(10)" + ] + } + ], + "metadata": { + "environment": { + "kernel": "multievolve", + "name": "workbench-notebooks.m128", + "type": "gcloud", + "uri": "us-docker.pkg.dev/deeplearning-platform-release/gcr.io/workbench-notebooks:m128" + }, + "kernelspec": { + "display_name": "multievolve_public", + "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.11.14" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/scripts/p1_train.py b/scripts/p1_train.py new file mode 100644 index 0000000000000000000000000000000000000000..bc45449a82a8657b6972276eeb8e085195ed0a2c --- /dev/null +++ b/scripts/p1_train.py @@ -0,0 +1,148 @@ +#!/public/home/scnb9biwet/.conda/envs/model_bio/bin/python + +""" +Script to train multievolve neural network models. + +Example usage: + +conda activate multievolve + +p1_train.py \ +--experiment-name multievolve_example \ +--protein-name example_protein \ +--wt-files apex.fasta \ +--training-dataset-fname example_dataset.csv \ +--wandb-key \ +--mode test +""" + +import wandb +import argparse +import sys +import matplotlib +matplotlib.use('Agg') + +from model.splitters import * +from model.featurizers import * +from model.predictors import * +from model.proposers import * + +## LL 2026 +import os +os.environ["WANDB_MODE"] = "disabled" +os.environ["WANDB_SILENT"] = "true" +## LL 2026 + +def parse_args(): + """Parse command line arguments.""" + parser = argparse.ArgumentParser(description='Train multievolveneural network models') + + parser.add_argument( + '-e', + '--experiment-name', + required=True, + help='Name of the experiment' + ) + parser.add_argument( + '-p', + '--protein-name', + required=True, + help='Name of the protein' + ) + parser.add_argument( + '-wt', + '--wt-files', + required=True, + help='Comma separated list of paths to the wildtype FASTA files' + ) + parser.add_argument( + '-t', + '--training-dataset-fname', + required=True, + help='Path to the training dataset CSV file' + ) + parser.add_argument( + '-k', + '--wandb-key', + required=True, + help='WandB API key for authentication' + ) + parser.add_argument( + '-m', + '--mode', + required=True, + help='Training method of the experiment, options include: test or standard' + ) + args = parser.parse_args() + args.wt_files = [f.strip() for f in args.wt_files.split(',')] + return args + +def main(): + + """Main function.""" + + # Parse command line arguments + args = parse_args() + + try: + # Login to WandB + #wandb.login(key=args.wandb_key) + # 强制禁用 wandb #LL 2026 + import os + os.environ["WANDB_MODE"] = "disabled" + except Exception as e: + print(f"Error logging into WandB: {e}") + sys.exit(1) + + # Define variables + experiment_name = args.experiment_name + protein_name = args.protein_name + wt_files = args.wt_files + training_dataset_fname = args.training_dataset_fname + + try: + # Define splits + fold_splitter = KFoldProteinSplitter(protein_name, training_dataset_fname, wt_files, csv_has_header=True, use_cache=True, y_scaling=True, val_split=0.15) + splits = fold_splitter.generate_splits(n_splits=5) + except Exception as e: + print(f"Error generating splits: {e}") + sys.exit(1) + + try: + # Define features + onehot = OneHotFeaturizer(protein=protein_name, use_cache=True) + features = [onehot] + except Exception as e: + print(f"Error generating features: {e}") + sys.exit(1) + + # Define models + models = [Fcn] + + if args.mode == 'test': + print("Running in test mode") + sweep_depth = 'test' + search_method = 'test' + elif args.mode == 'standard': + print("Running in standard mode") + sweep_depth = 'standard' + search_method = 'grid' + + try: + # Run experiments + print(f"Running experiments for {experiment_name} with {protein_name}...") + run_nn_model_experiments(splits, + features, + models, + experiment_name=experiment_name, + use_cache=True,#LL 2026 + sweep_depth=sweep_depth, + search_method=search_method, + show_plots=True, # prevents issue when running script in terminal + ) + except Exception as e: + print(f"Error running experiments: {e}") + sys.exit(1) + +if __name__ == '__main__': + main() diff --git a/scripts/p2_propose.py b/scripts/p2_propose.py new file mode 100644 index 0000000000000000000000000000000000000000..a6a0ebb865b49e85516252036264c7bea7cf081c --- /dev/null +++ b/scripts/p2_propose.py @@ -0,0 +1,220 @@ +#!/public/home/scnb9biwet/.conda/envs/model_bio/bin/python + +""" +Script to propose mutations using trained multievolve models. +Modified to load local models instead of using wandb. +""" + +import os +os.environ["WANDB_MODE"] = "disabled" +os.environ["WANDB_SILENT"] = "true" + +import wandb +import argparse +import pandas as pd +import numpy as np +from Bio import SeqIO +import matplotlib +matplotlib.use('Agg') +import glob +import re +import torch + +from model.splitters import * +from model.featurizers import * +from model.predictors import * +from model.proposers import * + + +def parse_args(): + """Parse command line arguments.""" + parser = argparse.ArgumentParser(description='Propose mutations using trained models') + parser.add_argument( + '--experiment-name', + required=True, + help='Name of experiment' + ) + parser.add_argument( + '--protein-name', + required=True, + help='Name of protein' + ) + parser.add_argument( + '--wt-files', + required=True, + help='Comma separated list of paths to the wildtype FASTA files' + ) + parser.add_argument( + '--training-dataset', + required=True, + help='Path to training dataset CSV' + ) + parser.add_argument( + '--mutation-pool', + required=True, + help='Path to mutation pool CSV' + ) + parser.add_argument( + '--top-muts-per-load', + type=int, + default=3, + help='Number of top mutations to select per load (default: 3)' + ) + parser.add_argument( + '--export-name', + required=True, + help='Name for export files' + ) + + args = parser.parse_args() + args.wt_files = [f.strip() for f in args.wt_files.split(',')] + return args + + +def main(): + """Main function.""" + + # Parse command line arguments + args = parse_args() + + # Define variables from args + experiment_name = args.experiment_name + protein_name = args.protein_name + wt_files = args.wt_files + training_dataset_fname = args.training_dataset + mutation_pool_fname = args.mutation_pool + top_muts_per_load = args.top_muts_per_load + export_name = args.export_name + + # Processed variables + mutation_pool = pd.read_csv(mutation_pool_fname, header=None).values.flatten().tolist() + wt_seq = "".join([str(SeqIO.read(wt_file, "fasta").seq.upper()) for wt_file in wt_files]) + + # 手动指定最佳超参数(来自 fcn_test_sweep.yaml 和训练设置) + bs = 32 + lr = 0.0001 + hidden = 100 + layers = 1 + print(bs, lr, hidden, layers) + + # 配置模型 + config = { + 'layer_size': hidden, + 'num_layers' : layers, + 'learning_rate': lr, + 'batch_size': bs, + 'optimizer': 'adam', + 'epochs': 300 + } + + # 初始化 splits(与训练时一致,5 折) + split = KFoldProteinSplitter(protein_name, training_dataset_fname, wt_files, + csv_has_header=True, use_cache=True, y_scaling=True, val_split=0.15) + splits = split.generate_splits(n_splits=5) + + # 初始化 feature + feature = OneHotFeaturizer(protein=protein_name, use_cache=True) + + # 加载已有模型 + # 从分裂对象中获取 dataset_dir 和 dataset_name,动态构造模型目录 + dataset_dir = splits[0].file_attrs['dataset_dir'] + dataset_name = splits[0].file_attrs['dataset_name'] + model_dir = os.path.join(dataset_dir, 'model_cache', dataset_name, 'objects') + #model_dir = os.path.join(splits[0].file_attrs['model_dir'], 'objects') + model_files = glob.glob(os.path.join(model_dir, 'split_by_kfold-*.pth')) + # 按 fold 编号排序 + model_files.sort(key=lambda x: int(re.search(r'split_by_kfold-(\d+)_', os.path.basename(x)).group(1))) + print(f"Found {len(model_files)} model files in {model_dir}") + + models = [] + device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') + for i, split in enumerate(splits): + model = Fcn(split, feature, config=config, use_cache=True) + model.load_state_dict(torch.load(model_files[i], map_location=device, weights_only=True)) + model.to(device) + model.eval() + models.append(model) + print(f"Loaded model from {model_files[i]}") + + print("Proposing mutations...") + + # 初始化 proposer 并评估提案 + proposer = CombinatorialProposer( + start_seq=wt_seq, + models=models, + trust_radius=11, + num_seeds=-1, # evaluate all seeds + mutation_pool=mutation_pool) + proposer.propose(output_df=False) + proposer.evaluate_proposals() + proposer.save_proposals(f'{experiment_name}_proposals_all') + + # 获取每个突变负荷的前 N 个变体 + df = proposer.proposals + df_ls = [] + for num_mut in range(3, 11, 1): + subset = df[df['num_muts'] == num_mut].copy() + subset.sort_values(by='average', ascending=False, inplace=True) + top_subset = subset.head(top_muts_per_load).copy() + df_ls.append(top_subset) + top_df = pd.concat(df_ls, ignore_index=True) + + # 导出结果 + print('Saving all proposals...') + top_df.to_csv(os.path.join(splits[0].file_attrs['dataset_dir'], 'proposers/results', + f'{experiment_name}_proposals_top_{top_muts_per_load}.csv'), index=False) + top_df[['Mut_string']].to_csv(os.path.join(splits[0].file_attrs['dataset_dir'], f'{export_name}.csv'), + index=False, header=None) + + # 多链蛋白处理函数(原代码保留,未修改) + def reverse_multichain_mutations(mut_strings, chain_lengths): + cumulative_lengths = [sum(chain_lengths[:i]) for i in range(len(chain_lengths))] + mutation_map = {} + for mut_string in mut_strings: + mutations = mut_string.split('/') + chain_mutations = {i: [] for i in range(len(chain_lengths))} + for mut in mutations: + position = int(mut[1:-1]) + wt_aa = mut[0] + mut_aa = mut[-1] + for chain_idx, start_pos in enumerate(cumulative_lengths): + if position <= cumulative_lengths[chain_idx + 1] if chain_idx + 1 < len(cumulative_lengths) else float('inf'): + chain_pos = position - start_pos + chain_mutations[chain_idx].append(f"{wt_aa}{chain_pos}{mut_aa}") + break + mutation_map[mut_string] = chain_mutations + return mutation_map + + def mutation_map_to_df(mutation_map): + rows = [] + for mut_string, chain_muts in mutation_map.items(): + row = {'Mut_string': mut_string} + for chain_idx, mutations in chain_muts.items(): + row[f'chain_{chain_idx + 1}'] = '/'.join(mutations) if mutations else '' + rows.append(row) + df = pd.DataFrame(rows) + chain_cols = [col for col in df.columns if col.startswith('chain_')] + df = df[['Mut_string'] + sorted(chain_cols)] + return df + + if len(wt_files) > 1: + mutations = top_df['Mut_string'].values.tolist() + chain_lens = splits[0].wt_seq_lens + dict_mutations = reverse_multichain_mutations(mutations, chain_lens) + df_mutations = mutation_map_to_df(dict_mutations) + + top_df = pd.merge(top_df, df_mutations, on='Mut_string', how='left') + top_df.to_csv(os.path.join(splits[0].file_attrs['dataset_dir'], 'proposers/results', + f'{experiment_name}_proposals_top_{top_muts_per_load}.csv'), index=False) + + for col in df_mutations.columns[1:]: + mutations = set(df_mutations[col].tolist()) + if '' in mutations: + mutations.remove('') + df_mutations_col = pd.DataFrame(mutations, columns=[col]) + df_mutations_col.to_csv(os.path.join(splits[0].file_attrs['dataset_dir'], + f'{export_name}_{col}_mutants.csv'), index=False, header=None) + + +if __name__ == "__main__": + main() diff --git a/scripts/p3_assembly_design.py b/scripts/p3_assembly_design.py new file mode 100644 index 0000000000000000000000000000000000000000..25f264e4eaf1f22c57b6257b47776c1400f0af96 --- /dev/null +++ b/scripts/p3_assembly_design.py @@ -0,0 +1,118 @@ +#!/public/home/scnb9biwet/.conda/envs/model_bio/bin/python +""" +Script to design oligos using MultiAssemblyDesigner. + +Example usage: + +conda activate multievolve + +p3_assembly_design.py \ +--mutations-file multievolve_proposals.csv \ +--wt-fasta APEX_33overhang.fasta \ +--overhang 33 \ +--species human \ +--oligo-direction bottom \ +--tm 80 \ +--output design +""" + +import argparse +import sys +import pandas as pd + +def parse_args(): + """Parse command line arguments.""" + parser = argparse.ArgumentParser(description='Design oligos using MultiAssemblyDesigner') + + parser.add_argument( + '-m', + '--mutations-file', + required=True, + help='Path to CSV file containing mutations (no header)' + ) + + parser.add_argument( + '-wt', + '--wt-fasta', + required=True, + help='Path to input FASTA file' + ) + + parser.add_argument( + '-ov', + '--overhang', + type=int, + default=33, + help='Overhang length (default: 33)' + ) + + parser.add_argument( + '-s', + '--species', + choices=['human', 'ecoli', 'yeast'], + default='human', + help='Species (default: human)' + ) + + parser.add_argument( + '-d', + '--oligo-direction', + choices=['top', 'bottom'], + default='bottom', + help='Oligo direction (default: bottom)' + ) + + parser.add_argument( + '--tm', + type=float, + default=80.0, + help='Melting temperature (default: 80.0)' + ) + + parser.add_argument( + '-o', + '--output', + choices=['design', 'update'], + default='design', + help='Output type (default: design)' + ) + + return parser.parse_args() + +def main(): + """Main function.""" + # Parse command line arguments + args = parse_args() + + # Import MultiAssemblyDesigner after setting up path + try: + from model import MultiAssemblyDesigner + except ImportError as e: + print(f"Error importing MultiAssemblyDesigner: {e}") + print("Make sure the src directory path is correct and contains the required module") + sys.exit(1) + + # Read mutations file + try: + df = pd.read_csv(args.mutations_file, header=None) + except Exception as e: + print(f"Error reading mutations file: {e}") + sys.exit(1) + + # Create designer instance + try: + designer = MultiAssemblyDesigner( + df, + args.wt_fasta, + args.overhang, + args.species, + oligo_direction=args.oligo_direction, + tm=args.tm, + output=args.output + ) + except Exception as e: + print(f"Error creating MultiAssemblyDesigner instance: {e}") + sys.exit(1) + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/scripts/plm_zeroshot_ensemble.py b/scripts/plm_zeroshot_ensemble.py new file mode 100644 index 0000000000000000000000000000000000000000..13884007d054f9604eb43417dd4f9d21ce71cf44 --- /dev/null +++ b/scripts/plm_zeroshot_ensemble.py @@ -0,0 +1,227 @@ +#!/usr/bin/env python3 + +""" +Script to generate zeroshot mutations for ESM and ESM-IF. + +Example usage: + +conda activate multievolve + +plm_zeroshot_ensemble.py \ +--wt-file apex.fasta \ +--pdb-files apex.cif, apex_2.cif \ +--chain-id A \ +--variants 24 \ +--normalizing-method aa_substitution_type \ +--excluded-positions 1,14,41,112 +""" + +import argparse +from Bio import SeqIO +import pandas as pd +import os + +from model import zero_shot_esm_dms, zero_shot_esm_if_dms + +def parse_args(): + """Parse command line arguments.""" + + parser = argparse.ArgumentParser(description='Nominate mutations using a PLM zeroshot ensemble') + + parser.add_argument( + '--wt-file', + required=True, + help='Path to the wildtype FASTA file' + ) + parser.add_argument( + '--pdb-files', + required=True, + help='Comma-separated list of PDB/CIF structure files' + ) + parser.add_argument( + '--chain-id', + required=True, + help='Chain ID to include in the zeroshot predictions' + ) + parser.add_argument( + '--variants', + type=int, + required=True, + help='Number of variants to nominate per method' + ) + parser.add_argument( + '--normalizing-method', + required=True, + help='Method for normalizing fold-change scores to generate z-scores' + ) + parser.add_argument( + '--excluded-positions', + required=False, + help='Comma-separated list of positions to exclude from mutation' + ) + + args = parser.parse_args() + + # Process arguments + args.pdb_files = [f.strip() for f in args.pdb_files.split(',')] + args.excluded_positions = [int(p) for p in args.excluded_positions.split(',')] if args.excluded_positions else [] + + return args + +def main(): + + args = parse_args() + wt_file = args.wt_file + pdb_files = args.pdb_files + variants = args.variants + excluded_positions = args.excluded_positions + normalizing_method = args.normalizing_method + chain_id = args.chain_id + + + wt_seq = str(SeqIO.read(wt_file, "fasta").seq) + + print('Running ESM zeroshot...') + esm_zeroshot = zero_shot_esm_dms(wt_seq) + + print('Running ESM-IF zeroshot...') + esm_if_zeroshot_ls = [] + for pdb_file in pdb_files: + esm_if_zeroshot_ls.append(zero_shot_esm_if_dms(wt_seq, pdb_file, chain_id = chain_id, scoring_strategy='wt-marginals')) + + def sample_mutations(df, total_muts, excluded_positions): + + muts = [] + pos = excluded_positions.copy() + + # iterate over each row + for index, row in df.iterrows(): + if row['pos'] not in pos: + muts.append(row.to_frame().T) + pos.append(row['pos']) + if len(muts) == total_muts: + break + + result = pd.concat(muts, ignore_index=True) + return result + + def calculate_z_scores(df, col_name, activity_col): + """ + Calculate z-scores for activity values grouped by a column and filter groups with sufficient samples. + + Args: + df (pd.DataFrame): Input dataframe + col_name (str): Column name to group by + activity_col (str): Column name containing activity values to calculate z-scores for + + Returns: + pd.DataFrame: Dataframe with z-scores calculated and sorted, filtered to groups with >= 5 samples + """ + dfs = [] + col_values = df[col_name].unique() + for value in col_values: + subset = df[df[col_name] == value].copy() + subset['z_logratio'] = (subset[activity_col] - subset[activity_col].mean()) / subset[activity_col].std() + subset['n'] = len(subset) + + if len(subset) >= 5: + dfs.append(subset) + df = pd.concat(dfs, ignore_index=True) + df.sort_values(by='z_logratio', ascending=False, inplace=True) + + return df + + # Function to merge dataframes + def merge_mutation_dfs(df_dict): + # Start with the first dataframe + first_key = list(df_dict.keys())[0] + result = df_dict[first_key][0][['mutations', df_dict[first_key][1]]].copy() + + # Merge all remaining dataframes + for key in list(df_dict.keys())[1:]: + df = df_dict[key][0] + col = df_dict[key][1] + result = pd.merge(result, df[['mutations', col]], on='mutations', how='outer') + + return result.fillna(0) + + # average results for esm if zeroshot across multiple structure models + subset_ls = [] + for j in range(len(esm_if_zeroshot_ls)): + subset_ls.append(esm_if_zeroshot_ls[j][['mutations','logratio']].copy()) + subset_ls[j].rename(columns={'logratio': f'logratio_model{j}'}, inplace=True) + + # Start with first dataframe + esm_if_zeroshot = subset_ls[0].copy() + + # Merge remaining dataframes iteratively + for j in range(1, len(subset_ls)): + esm_if_zeroshot = pd.merge(esm_if_zeroshot, subset_ls[j], on='mutations', how='outer') + + # Calculate average across all model logratios + logratio_cols = [f'logratio_model{j}' for j in range(len(subset_ls))] + esm_if_zeroshot['average_model_logratio'] = esm_if_zeroshot[logratio_cols].mean(axis=1) + + # sort esm_zeroshot by number of total models with FC > 1 and then by FC value + + esm_zeroshot_ls = [] + + total_model_pass_list = list(set(esm_zeroshot['total_model_pass'].values)) + total_model_pass_list = total_model_pass_list[::-1] + + for model_pass_value in total_model_pass_list: + subset = esm_zeroshot[esm_zeroshot['total_model_pass'] == model_pass_value].copy() + subset.sort_values(by='average_model_logratio', ascending=False, inplace=True) + esm_zeroshot_ls.append(subset) + + esm_zeroshot_sorted = pd.concat(esm_zeroshot_ls) + + # modify dataframes with columns for amino acid substitution type and remove wt + + esm_zeroshot_sorted['aa_mutation'] = esm_zeroshot_sorted['mutations'].apply(lambda x: x[-1]) + esm_zeroshot_sorted['aa_substitution_type'] = esm_zeroshot_sorted['mutations'].apply(lambda x: f'{x[0]}-{x[-1]}') + esm_zeroshot_sorted['pos'] = esm_zeroshot_sorted['mutations'].apply(lambda x: int(x[1:-1])) + + esm_if_zeroshot['aa_mutation'] = esm_if_zeroshot['mutations'].apply(lambda x: x[-1]) + esm_if_zeroshot['aa_substitution_type'] = esm_if_zeroshot['mutations'].apply(lambda x: f'{x[0]}-{x[-1]}') + esm_if_zeroshot['pos'] = esm_if_zeroshot['mutations'].apply(lambda x: int(x[1:-1])) + + # ESM FC + + muts_esm = sample_mutations(esm_zeroshot_sorted, variants, excluded_positions) + muts_esm['esm_sampled'] = 1 + + # # ESM-IF FC + + esm_if_zeroshot.sort_values(by='average_model_logratio', ascending=False, inplace=True) + muts_esm_if = sample_mutations(esm_if_zeroshot, variants, excluded_positions) + muts_esm_if['esm_if_sampled'] = 1 + + # ESM Z + df = esm_zeroshot_sorted.copy() + activity_col = 'average_model_logratio' + df = calculate_z_scores(df, normalizing_method, activity_col) + muts_esm_z = sample_mutations(df, variants, excluded_positions) + muts_esm_z['esm_z_sampled'] = 1 + + # ESM-IF Z + df = esm_if_zeroshot.copy() + activity_col = 'average_model_logratio' + df = calculate_z_scores(df, normalizing_method, activity_col) + muts_esm_if_z = sample_mutations(df, variants, excluded_positions) + muts_esm_if_z['esm_if_z_sampled'] = 1 + + # Define dataframes to combine + dfs = { + 'esm': [muts_esm, 'esm_sampled'], + 'esm_if': [muts_esm_if, 'esm_if_sampled'], + 'esm_z': [muts_esm_z, 'esm_z_sampled'], + 'esm_if_z': [muts_esm_if_z, 'esm_if_z_sampled'] + } + + muts_combined = merge_mutation_dfs(dfs) + + muts_combined.to_csv(os.path.join(os.path.dirname(wt_file), 'plm_zeroshot_ensemble_nominated_mutations.csv')) + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000000000000000000000000000000000000..ef1e9b4786630a1e89bf7e8ef7b4a8fced711e54 --- /dev/null +++ b/setup.py @@ -0,0 +1,47 @@ +from pathlib import Path + +from setuptools import setup, find_packages + + +readme_path = Path(__file__).with_name("README.md") +long_description = readme_path.read_text(encoding="utf-8") if readme_path.exists() else ( + "MULTI-evolve: model-guided, universal, targeted installation of multi-mutants" +) + +setup( + name="multievolve", + version="0.1.0", + packages=find_packages(), + include_package_data=True, + scripts=['scripts/p1_train.py', + 'scripts/p2_propose.py', + 'scripts/p3_assembly_design.py', + 'scripts/plm_zeroshot_ensemble.py'], + install_requires=[ + "torch>=2.1.0", + "numpy>=1.26", + "pandas>=2.2", + "matplotlib>=3.10", + "seaborn>=0.13", + "scipy>=1.15", + "biopython>=1.85", + "scikit-learn>=1.6", + "scikit-optimize>=0.10", + "wandb>=0.19", + "Levenshtein", + "streamlit>=1.45", + "fair-esm", + "biotite>=0.41.2", + ], + python_requires=">=3.11", + authors="Vincent Q. Tran, Matthew Nemeth, and Brian Hie", + description="MULTI-evolve: model-guided, universal, targeted installation of multi-mutants", + long_description=long_description, + long_description_content_type="text/markdown", + url="https://github.com/VincentQTran/multievolve", + classifiers=[ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + ], +)