diff --git a/alphafold/LICENSE b/alphafold/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..d645695673349e3947e8e5ae42332d0ac3164cd7 --- /dev/null +++ b/alphafold/LICENSE @@ -0,0 +1,202 @@ + + 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/alphafold/alphafold/__init__.py b/alphafold/alphafold/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..a0fd7f8294b9d7be770127c356f0b6564f1baa6c --- /dev/null +++ b/alphafold/alphafold/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. +"""An implementation of the inference pipeline of AlphaFold v2.0.""" diff --git a/alphafold/alphafold/__pycache__/__init__.cpython-36.pyc b/alphafold/alphafold/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2e7dd334470e19f7e61c09aabc4a91b7e5183e1a Binary files /dev/null and b/alphafold/alphafold/__pycache__/__init__.cpython-36.pyc differ diff --git a/alphafold/alphafold/__pycache__/__init__.cpython-38.pyc b/alphafold/alphafold/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08d2486a0d4fd844fb3a6d085f1dd71cf23de58c Binary files /dev/null and b/alphafold/alphafold/__pycache__/__init__.cpython-38.pyc differ diff --git a/alphafold/alphafold/common/__init__.py b/alphafold/alphafold/common/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..d3c65d69d5f61b7b9547153c47d84e7f545e2636 --- /dev/null +++ b/alphafold/alphafold/common/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. +"""Common data types and constants used within Alphafold.""" diff --git a/alphafold/alphafold/common/__pycache__/__init__.cpython-36.pyc b/alphafold/alphafold/common/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1319db200a5ce789acf2da044927023bc4b6c1ed Binary files /dev/null and b/alphafold/alphafold/common/__pycache__/__init__.cpython-36.pyc differ diff --git a/alphafold/alphafold/common/__pycache__/__init__.cpython-38.pyc b/alphafold/alphafold/common/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee7e547fcdb4a25cc55da4c50abd3ccffb7d838d Binary files /dev/null and b/alphafold/alphafold/common/__pycache__/__init__.cpython-38.pyc differ diff --git a/alphafold/alphafold/common/__pycache__/confidence.cpython-36.pyc b/alphafold/alphafold/common/__pycache__/confidence.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1722f20bf5bead86ac9c7db2537f42dac728840c Binary files /dev/null and b/alphafold/alphafold/common/__pycache__/confidence.cpython-36.pyc differ diff --git a/alphafold/alphafold/common/__pycache__/confidence.cpython-38.pyc b/alphafold/alphafold/common/__pycache__/confidence.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e088558450120f086e0507639d686ec22f97267f Binary files /dev/null and b/alphafold/alphafold/common/__pycache__/confidence.cpython-38.pyc differ diff --git a/alphafold/alphafold/common/__pycache__/protein.cpython-36.pyc b/alphafold/alphafold/common/__pycache__/protein.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9cad08d21500e87ffdf8ad80cc4b44b0f94d2b76 Binary files /dev/null and b/alphafold/alphafold/common/__pycache__/protein.cpython-36.pyc differ diff --git a/alphafold/alphafold/common/__pycache__/protein.cpython-38.pyc b/alphafold/alphafold/common/__pycache__/protein.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..259a71cfb744cf8084501ed899037834c4fa0e2a Binary files /dev/null and b/alphafold/alphafold/common/__pycache__/protein.cpython-38.pyc differ diff --git a/alphafold/alphafold/common/__pycache__/residue_constants.cpython-36.pyc b/alphafold/alphafold/common/__pycache__/residue_constants.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..51ac5bdd2930b5a64a6d8a27eda16aea0fcc77b8 Binary files /dev/null and b/alphafold/alphafold/common/__pycache__/residue_constants.cpython-36.pyc differ diff --git a/alphafold/alphafold/common/__pycache__/residue_constants.cpython-38.pyc b/alphafold/alphafold/common/__pycache__/residue_constants.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..901462a23d79c2230f014068b583c5bbb714840f Binary files /dev/null and b/alphafold/alphafold/common/__pycache__/residue_constants.cpython-38.pyc differ diff --git a/alphafold/alphafold/common/confidence.py b/alphafold/alphafold/common/confidence.py new file mode 100644 index 0000000000000000000000000000000000000000..5f1085f75d2c8528a05abc12a483c3685af8c7c1 --- /dev/null +++ b/alphafold/alphafold/common/confidence.py @@ -0,0 +1,155 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Functions for processing confidence metrics.""" + +from typing import Dict, Optional, Tuple +import numpy as np +import scipy.special + + +def compute_plddt(logits: np.ndarray) -> np.ndarray: + """Computes per-residue pLDDT from logits. + + Args: + logits: [num_res, num_bins] output from the PredictedLDDTHead. + + Returns: + plddt: [num_res] per-residue pLDDT. + """ + num_bins = logits.shape[-1] + bin_width = 1.0 / num_bins + bin_centers = np.arange(start=0.5 * bin_width, stop=1.0, step=bin_width) + probs = scipy.special.softmax(logits, axis=-1) + predicted_lddt_ca = np.sum(probs * bin_centers[None, :], axis=-1) + return predicted_lddt_ca * 100 + + +def _calculate_bin_centers(breaks: np.ndarray): + """Gets the bin centers from the bin edges. + + Args: + breaks: [num_bins - 1] the error bin edges. + + Returns: + bin_centers: [num_bins] the error bin centers. + """ + step = (breaks[1] - breaks[0]) + + # Add half-step to get the center + bin_centers = breaks + step / 2 + # Add a catch-all bin at the end. + bin_centers = np.concatenate([bin_centers, [bin_centers[-1] + step]], + axis=0) + return bin_centers + + +def _calculate_expected_aligned_error( + alignment_confidence_breaks: np.ndarray, + aligned_distance_error_probs: np.ndarray) -> Tuple[np.ndarray, np.ndarray]: + """Calculates expected aligned distance errors for every pair of residues. + + Args: + alignment_confidence_breaks: [num_bins - 1] the error bin edges. + aligned_distance_error_probs: [num_res, num_res, num_bins] the predicted + probs for each error bin, for each pair of residues. + + Returns: + predicted_aligned_error: [num_res, num_res] the expected aligned distance + error for each pair of residues. + max_predicted_aligned_error: The maximum predicted error possible. + """ + bin_centers = _calculate_bin_centers(alignment_confidence_breaks) + + # Tuple of expected aligned distance error and max possible error. + return (np.sum(aligned_distance_error_probs * bin_centers, axis=-1), + np.asarray(bin_centers[-1])) + + +def compute_predicted_aligned_error( + logits: np.ndarray, + breaks: np.ndarray) -> Dict[str, np.ndarray]: + """Computes aligned confidence metrics from logits. + + Args: + logits: [num_res, num_res, num_bins] the logits output from + PredictedAlignedErrorHead. + breaks: [num_bins - 1] the error bin edges. + + Returns: + aligned_confidence_probs: [num_res, num_res, num_bins] the predicted + aligned error probabilities over bins for each residue pair. + predicted_aligned_error: [num_res, num_res] the expected aligned distance + error for each pair of residues. + max_predicted_aligned_error: The maximum predicted error possible. + """ + aligned_confidence_probs = scipy.special.softmax( + logits, + axis=-1) + predicted_aligned_error, max_predicted_aligned_error = ( + _calculate_expected_aligned_error( + alignment_confidence_breaks=breaks, + aligned_distance_error_probs=aligned_confidence_probs)) + return { + 'aligned_confidence_probs': aligned_confidence_probs, + 'predicted_aligned_error': predicted_aligned_error, + 'max_predicted_aligned_error': max_predicted_aligned_error, + } + + +def predicted_tm_score( + logits: np.ndarray, + breaks: np.ndarray, + residue_weights: Optional[np.ndarray] = None) -> np.ndarray: + """Computes predicted TM alignment score. + + Args: + logits: [num_res, num_res, num_bins] the logits output from + PredictedAlignedErrorHead. + breaks: [num_bins] the error bins. + residue_weights: [num_res] the per residue weights to use for the + expectation. + + Returns: + ptm_score: the predicted TM alignment score. + """ + + # residue_weights has to be in [0, 1], but can be floating-point, i.e. the + # exp. resolved head's probability. + if residue_weights is None: + residue_weights = np.ones(logits.shape[0]) + + bin_centers = _calculate_bin_centers(breaks) + + num_res = np.sum(residue_weights) + # Clip num_res to avoid negative/undefined d0. + clipped_num_res = max(num_res, 19) + + # Compute d_0(num_res) as defined by TM-score, eqn. (5) in + # http://zhanglab.ccmb.med.umich.edu/papers/2004_3.pdf + # Yang & Skolnick "Scoring function for automated + # assessment of protein structure template quality" 2004 + d0 = 1.24 * (clipped_num_res - 15) ** (1./3) - 1.8 + + # Convert logits to probs + probs = scipy.special.softmax(logits, axis=-1) + + # TM-Score term for every bin + tm_per_bin = 1. / (1 + np.square(bin_centers) / np.square(d0)) + # E_distances tm(distance) + predicted_tm_term = np.sum(probs * tm_per_bin, axis=-1) + + normed_residue_mask = residue_weights / (1e-8 + residue_weights.sum()) + per_alignment = np.sum(predicted_tm_term * normed_residue_mask, axis=-1) + return np.asarray(per_alignment[(per_alignment * residue_weights).argmax()]) diff --git a/alphafold/alphafold/common/protein.py b/alphafold/alphafold/common/protein.py new file mode 100644 index 0000000000000000000000000000000000000000..2848f5bbc52d646ddc22a8f2e1c6b4d98ae1ffce --- /dev/null +++ b/alphafold/alphafold/common/protein.py @@ -0,0 +1,229 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Protein data type.""" +import dataclasses +import io +from typing import Any, Mapping, Optional +from alphafold.common import residue_constants +from Bio.PDB import PDBParser +import numpy as np + +FeatureDict = Mapping[str, np.ndarray] +ModelOutput = Mapping[str, Any] # Is a nested dict. + + +@dataclasses.dataclass(frozen=True) +class Protein: + """Protein structure representation.""" + + # Cartesian coordinates of atoms in angstroms. The atom types correspond to + # residue_constants.atom_types, i.e. the first three are N, CA, CB. + atom_positions: np.ndarray # [num_res, num_atom_type, 3] + + # Amino-acid type for each residue represented as an integer between 0 and + # 20, where 20 is 'X'. + aatype: np.ndarray # [num_res] + + # Binary float mask to indicate presence of a particular atom. 1.0 if an atom + # is present and 0.0 if not. This should be used for loss masking. + atom_mask: np.ndarray # [num_res, num_atom_type] + + # Residue index as used in PDB. It is not necessarily continuous or 0-indexed. + residue_index: np.ndarray # [num_res] + + # B-factors, or temperature factors, of each residue (in sq. angstroms units), + # representing the displacement of the residue from its ground truth mean + # value. + b_factors: np.ndarray # [num_res, num_atom_type] + + +def from_pdb_string(pdb_str: str, chain_id: Optional[str] = None) -> Protein: + """Takes a PDB string and constructs a Protein object. + + WARNING: All non-standard residue types will be converted into UNK. All + non-standard atoms will be ignored. + + Args: + pdb_str: The contents of the pdb file + chain_id: If None, then the pdb file must contain a single chain (which + will be parsed). If chain_id is specified (e.g. A), then only that chain + is parsed. + + Returns: + A new `Protein` parsed from the pdb contents. + """ + pdb_fh = io.StringIO(pdb_str) + parser = PDBParser(QUIET=True) + structure = parser.get_structure('none', pdb_fh) + models = list(structure.get_models()) + if len(models) != 1: + raise ValueError( + f'Only single model PDBs are supported. Found {len(models)} models.') + model = models[0] + + if chain_id is not None: + chain = model[chain_id] + else: + chains = list(model.get_chains()) + if len(chains) != 1: + raise ValueError( + 'Only single chain PDBs are supported when chain_id not specified. ' + f'Found {len(chains)} chains.') + else: + chain = chains[0] + + atom_positions = [] + aatype = [] + atom_mask = [] + residue_index = [] + b_factors = [] + + for res in chain: + if res.id[2] != ' ': + raise ValueError( + f'PDB contains an insertion code at chain {chain.id} and residue ' + f'index {res.id[1]}. These are not supported.') + res_shortname = residue_constants.restype_3to1.get(res.resname, 'X') + restype_idx = residue_constants.restype_order.get( + res_shortname, residue_constants.restype_num) + pos = np.zeros((residue_constants.atom_type_num, 3)) + mask = np.zeros((residue_constants.atom_type_num,)) + res_b_factors = np.zeros((residue_constants.atom_type_num,)) + for atom in res: + if atom.name not in residue_constants.atom_types: + continue + pos[residue_constants.atom_order[atom.name]] = atom.coord + mask[residue_constants.atom_order[atom.name]] = 1. + res_b_factors[residue_constants.atom_order[atom.name]] = atom.bfactor + if np.sum(mask) < 0.5: + # If no known atom positions are reported for the residue then skip it. + continue + aatype.append(restype_idx) + atom_positions.append(pos) + atom_mask.append(mask) + residue_index.append(res.id[1]) + b_factors.append(res_b_factors) + + return Protein( + atom_positions=np.array(atom_positions), + atom_mask=np.array(atom_mask), + aatype=np.array(aatype), + residue_index=np.array(residue_index), + b_factors=np.array(b_factors)) + + +def to_pdb(prot: Protein) -> str: + """Converts a `Protein` instance to a PDB string. + + Args: + prot: The protein to convert to PDB. + + Returns: + PDB string. + """ + restypes = residue_constants.restypes + ['X'] + res_1to3 = lambda r: residue_constants.restype_1to3.get(restypes[r], 'UNK') + atom_types = residue_constants.atom_types + + pdb_lines = [] + + atom_mask = prot.atom_mask + aatype = prot.aatype + atom_positions = prot.atom_positions + residue_index = prot.residue_index.astype(np.int32) + b_factors = prot.b_factors + + if np.any(aatype > residue_constants.restype_num): + raise ValueError('Invalid aatypes.') + + pdb_lines.append('MODEL 1') + atom_index = 1 + chain_id = 'A' + # Add all atom sites. + for i in range(aatype.shape[0]): + res_name_3 = res_1to3(aatype[i]) + for atom_name, pos, mask, b_factor in zip( + atom_types, atom_positions[i], atom_mask[i], b_factors[i]): + if mask < 0.5: + continue + + record_type = 'ATOM' + name = atom_name if len(atom_name) == 4 else f' {atom_name}' + alt_loc = '' + insertion_code = '' + occupancy = 1.00 + element = atom_name[0] # Protein supports only C, N, O, S, this works. + charge = '' + # PDB is a columnar format, every space matters here! + atom_line = (f'{record_type:<6}{atom_index:>5} {name:<4}{alt_loc:>1}' + f'{res_name_3:>3} {chain_id:>1}' + f'{residue_index[i]:>4}{insertion_code:>1} ' + f'{pos[0]:>8.3f}{pos[1]:>8.3f}{pos[2]:>8.3f}' + f'{occupancy:>6.2f}{b_factor:>6.2f} ' + f'{element:>2}{charge:>2}') + pdb_lines.append(atom_line) + atom_index += 1 + + # Close the chain. + chain_end = 'TER' + chain_termination_line = ( + f'{chain_end:<6}{atom_index:>5} {res_1to3(aatype[-1]):>3} ' + f'{chain_id:>1}{residue_index[-1]:>4}') + pdb_lines.append(chain_termination_line) + pdb_lines.append('ENDMDL') + + pdb_lines.append('END') + pdb_lines.append('') + return '\n'.join(pdb_lines) + + +def ideal_atom_mask(prot: Protein) -> np.ndarray: + """Computes an ideal atom mask. + + `Protein.atom_mask` typically is defined according to the atoms that are + reported in the PDB. This function computes a mask according to heavy atoms + that should be present in the given sequence of amino acids. + + Args: + prot: `Protein` whose fields are `numpy.ndarray` objects. + + Returns: + An ideal atom mask. + """ + return residue_constants.STANDARD_ATOM_MASK[prot.aatype] + + +def from_prediction(features: FeatureDict, result: ModelOutput, + b_factors: Optional[np.ndarray] = None) -> Protein: + """Assembles a protein from a prediction. + + Args: + features: Dictionary holding model inputs. + result: Dictionary holding model outputs. + b_factors: (Optional) B-factors to use for the protein. + + Returns: + A protein instance. + """ + fold_output = result['structure_module'] + if b_factors is None: + b_factors = np.zeros_like(fold_output['final_atom_mask']) + + return Protein( + aatype=features['aatype'][0], + atom_positions=fold_output['final_atom_positions'], + atom_mask=fold_output['final_atom_mask'], + residue_index=features['residue_index'][0] + 1, + b_factors=b_factors) diff --git a/alphafold/alphafold/common/protein_test.py b/alphafold/alphafold/common/protein_test.py new file mode 100644 index 0000000000000000000000000000000000000000..b8ae10756e99f9019aeeed082b34789cdd515774 --- /dev/null +++ b/alphafold/alphafold/common/protein_test.py @@ -0,0 +1,89 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Tests for protein.""" + +import os + +from absl.testing import absltest +from absl.testing import parameterized +from alphafold.common import protein +from alphafold.common import residue_constants +import numpy as np +# Internal import (7716). + +TEST_DATA_DIR = 'alphafold/common/testdata/' + + +class ProteinTest(parameterized.TestCase): + + def _check_shapes(self, prot, num_res): + """Check that the processed shapes are correct.""" + num_atoms = residue_constants.atom_type_num + self.assertEqual((num_res, num_atoms, 3), prot.atom_positions.shape) + self.assertEqual((num_res,), prot.aatype.shape) + self.assertEqual((num_res, num_atoms), prot.atom_mask.shape) + self.assertEqual((num_res,), prot.residue_index.shape) + self.assertEqual((num_res, num_atoms), prot.b_factors.shape) + + @parameterized.parameters(('2rbg.pdb', 'A', 282), + ('2rbg.pdb', 'B', 282)) + def test_from_pdb_str(self, pdb_file, chain_id, num_res): + pdb_file = os.path.join(absltest.get_default_test_srcdir(), TEST_DATA_DIR, + pdb_file) + with open(pdb_file) as f: + pdb_string = f.read() + prot = protein.from_pdb_string(pdb_string, chain_id) + self._check_shapes(prot, num_res) + self.assertGreaterEqual(prot.aatype.min(), 0) + # Allow equal since unknown restypes have index equal to restype_num. + self.assertLessEqual(prot.aatype.max(), residue_constants.restype_num) + + def test_to_pdb(self): + with open( + os.path.join(absltest.get_default_test_srcdir(), TEST_DATA_DIR, + '2rbg.pdb')) as f: + pdb_string = f.read() + prot = protein.from_pdb_string(pdb_string, chain_id='A') + pdb_string_reconstr = protein.to_pdb(prot) + prot_reconstr = protein.from_pdb_string(pdb_string_reconstr) + + np.testing.assert_array_equal(prot_reconstr.aatype, prot.aatype) + np.testing.assert_array_almost_equal( + prot_reconstr.atom_positions, prot.atom_positions) + np.testing.assert_array_almost_equal( + prot_reconstr.atom_mask, prot.atom_mask) + np.testing.assert_array_equal( + prot_reconstr.residue_index, prot.residue_index) + np.testing.assert_array_almost_equal( + prot_reconstr.b_factors, prot.b_factors) + + def test_ideal_atom_mask(self): + with open( + os.path.join(absltest.get_default_test_srcdir(), TEST_DATA_DIR, + '2rbg.pdb')) as f: + pdb_string = f.read() + prot = protein.from_pdb_string(pdb_string, chain_id='A') + ideal_mask = protein.ideal_atom_mask(prot) + non_ideal_residues = set([102] + list(range(127, 285))) + for i, (res, atom_mask) in enumerate( + zip(prot.residue_index, prot.atom_mask)): + if res in non_ideal_residues: + self.assertFalse(np.all(atom_mask == ideal_mask[i]), msg=f'{res}') + else: + self.assertTrue(np.all(atom_mask == ideal_mask[i]), msg=f'{res}') + + +if __name__ == '__main__': + absltest.main() diff --git a/alphafold/alphafold/common/residue_constants.py b/alphafold/alphafold/common/residue_constants.py new file mode 100644 index 0000000000000000000000000000000000000000..07049b3c86bb3a3d6a5abd479944418729ef7837 --- /dev/null +++ b/alphafold/alphafold/common/residue_constants.py @@ -0,0 +1,895 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Constants used in AlphaFold.""" + +import collections +import functools +from typing import List, Mapping, Tuple + +import numpy as np +import tree + +# Internal import (35fd). + + +# Distance from one CA to next CA [trans configuration: omega = 180]. +ca_ca = 3.80209737096 + +# Format: The list for each AA type contains chi1, chi2, chi3, chi4 in +# this order (or a relevant subset from chi1 onwards). ALA and GLY don't have +# chi angles so their chi angle lists are empty. +chi_angles_atoms = { + 'ALA': [], + # Chi5 in arginine is always 0 +- 5 degrees, so ignore it. + 'ARG': [['N', 'CA', 'CB', 'CG'], ['CA', 'CB', 'CG', 'CD'], + ['CB', 'CG', 'CD', 'NE'], ['CG', 'CD', 'NE', 'CZ']], + 'ASN': [['N', 'CA', 'CB', 'CG'], ['CA', 'CB', 'CG', 'OD1']], + 'ASP': [['N', 'CA', 'CB', 'CG'], ['CA', 'CB', 'CG', 'OD1']], + 'CYS': [['N', 'CA', 'CB', 'SG']], + 'GLN': [['N', 'CA', 'CB', 'CG'], ['CA', 'CB', 'CG', 'CD'], + ['CB', 'CG', 'CD', 'OE1']], + 'GLU': [['N', 'CA', 'CB', 'CG'], ['CA', 'CB', 'CG', 'CD'], + ['CB', 'CG', 'CD', 'OE1']], + 'GLY': [], + 'HIS': [['N', 'CA', 'CB', 'CG'], ['CA', 'CB', 'CG', 'ND1']], + 'ILE': [['N', 'CA', 'CB', 'CG1'], ['CA', 'CB', 'CG1', 'CD1']], + 'LEU': [['N', 'CA', 'CB', 'CG'], ['CA', 'CB', 'CG', 'CD1']], + 'LYS': [['N', 'CA', 'CB', 'CG'], ['CA', 'CB', 'CG', 'CD'], + ['CB', 'CG', 'CD', 'CE'], ['CG', 'CD', 'CE', 'NZ']], + 'MET': [['N', 'CA', 'CB', 'CG'], ['CA', 'CB', 'CG', 'SD'], + ['CB', 'CG', 'SD', 'CE']], + 'PHE': [['N', 'CA', 'CB', 'CG'], ['CA', 'CB', 'CG', 'CD1']], + 'PRO': [['N', 'CA', 'CB', 'CG'], ['CA', 'CB', 'CG', 'CD']], + 'SER': [['N', 'CA', 'CB', 'OG']], + 'THR': [['N', 'CA', 'CB', 'OG1']], + 'TRP': [['N', 'CA', 'CB', 'CG'], ['CA', 'CB', 'CG', 'CD1']], + 'TYR': [['N', 'CA', 'CB', 'CG'], ['CA', 'CB', 'CG', 'CD1']], + 'VAL': [['N', 'CA', 'CB', 'CG1']], +} + +# If chi angles given in fixed-length array, this matrix determines how to mask +# them for each AA type. The order is as per restype_order (see below). +chi_angles_mask = [ + [0.0, 0.0, 0.0, 0.0], # ALA + [1.0, 1.0, 1.0, 1.0], # ARG + [1.0, 1.0, 0.0, 0.0], # ASN + [1.0, 1.0, 0.0, 0.0], # ASP + [1.0, 0.0, 0.0, 0.0], # CYS + [1.0, 1.0, 1.0, 0.0], # GLN + [1.0, 1.0, 1.0, 0.0], # GLU + [0.0, 0.0, 0.0, 0.0], # GLY + [1.0, 1.0, 0.0, 0.0], # HIS + [1.0, 1.0, 0.0, 0.0], # ILE + [1.0, 1.0, 0.0, 0.0], # LEU + [1.0, 1.0, 1.0, 1.0], # LYS + [1.0, 1.0, 1.0, 0.0], # MET + [1.0, 1.0, 0.0, 0.0], # PHE + [1.0, 1.0, 0.0, 0.0], # PRO + [1.0, 0.0, 0.0, 0.0], # SER + [1.0, 0.0, 0.0, 0.0], # THR + [1.0, 1.0, 0.0, 0.0], # TRP + [1.0, 1.0, 0.0, 0.0], # TYR + [1.0, 0.0, 0.0, 0.0], # VAL +] + +# The following chi angles are pi periodic: they can be rotated by a multiple +# of pi without affecting the structure. +chi_pi_periodic = [ + [0.0, 0.0, 0.0, 0.0], # ALA + [0.0, 0.0, 0.0, 0.0], # ARG + [0.0, 0.0, 0.0, 0.0], # ASN + [0.0, 1.0, 0.0, 0.0], # ASP + [0.0, 0.0, 0.0, 0.0], # CYS + [0.0, 0.0, 0.0, 0.0], # GLN + [0.0, 0.0, 1.0, 0.0], # GLU + [0.0, 0.0, 0.0, 0.0], # GLY + [0.0, 0.0, 0.0, 0.0], # HIS + [0.0, 0.0, 0.0, 0.0], # ILE + [0.0, 0.0, 0.0, 0.0], # LEU + [0.0, 0.0, 0.0, 0.0], # LYS + [0.0, 0.0, 0.0, 0.0], # MET + [0.0, 1.0, 0.0, 0.0], # PHE + [0.0, 0.0, 0.0, 0.0], # PRO + [0.0, 0.0, 0.0, 0.0], # SER + [0.0, 0.0, 0.0, 0.0], # THR + [0.0, 0.0, 0.0, 0.0], # TRP + [0.0, 1.0, 0.0, 0.0], # TYR + [0.0, 0.0, 0.0, 0.0], # VAL + [0.0, 0.0, 0.0, 0.0], # UNK +] + +# Atoms positions relative to the 8 rigid groups, defined by the pre-omega, phi, +# psi and chi angles: +# 0: 'backbone group', +# 1: 'pre-omega-group', (empty) +# 2: 'phi-group', (currently empty, because it defines only hydrogens) +# 3: 'psi-group', +# 4,5,6,7: 'chi1,2,3,4-group' +# The atom positions are relative to the axis-end-atom of the corresponding +# rotation axis. The x-axis is in direction of the rotation axis, and the y-axis +# is defined such that the dihedral-angle-definiting atom (the last entry in +# chi_angles_atoms above) is in the xy-plane (with a positive y-coordinate). +# format: [atomname, group_idx, rel_position] +rigid_group_atom_positions = { + 'ALA': [ + ['N', 0, (-0.525, 1.363, 0.000)], + ['CA', 0, (0.000, 0.000, 0.000)], + ['C', 0, (1.526, -0.000, -0.000)], + ['CB', 0, (-0.529, -0.774, -1.205)], + ['O', 3, (0.627, 1.062, 0.000)], + ], + 'ARG': [ + ['N', 0, (-0.524, 1.362, -0.000)], + ['CA', 0, (0.000, 0.000, 0.000)], + ['C', 0, (1.525, -0.000, -0.000)], + ['CB', 0, (-0.524, -0.778, -1.209)], + ['O', 3, (0.626, 1.062, 0.000)], + ['CG', 4, (0.616, 1.390, -0.000)], + ['CD', 5, (0.564, 1.414, 0.000)], + ['NE', 6, (0.539, 1.357, -0.000)], + ['NH1', 7, (0.206, 2.301, 0.000)], + ['NH2', 7, (2.078, 0.978, -0.000)], + ['CZ', 7, (0.758, 1.093, -0.000)], + ], + 'ASN': [ + ['N', 0, (-0.536, 1.357, 0.000)], + ['CA', 0, (0.000, 0.000, 0.000)], + ['C', 0, (1.526, -0.000, -0.000)], + ['CB', 0, (-0.531, -0.787, -1.200)], + ['O', 3, (0.625, 1.062, 0.000)], + ['CG', 4, (0.584, 1.399, 0.000)], + ['ND2', 5, (0.593, -1.188, 0.001)], + ['OD1', 5, (0.633, 1.059, 0.000)], + ], + 'ASP': [ + ['N', 0, (-0.525, 1.362, -0.000)], + ['CA', 0, (0.000, 0.000, 0.000)], + ['C', 0, (1.527, 0.000, -0.000)], + ['CB', 0, (-0.526, -0.778, -1.208)], + ['O', 3, (0.626, 1.062, -0.000)], + ['CG', 4, (0.593, 1.398, -0.000)], + ['OD1', 5, (0.610, 1.091, 0.000)], + ['OD2', 5, (0.592, -1.101, -0.003)], + ], + 'CYS': [ + ['N', 0, (-0.522, 1.362, -0.000)], + ['CA', 0, (0.000, 0.000, 0.000)], + ['C', 0, (1.524, 0.000, 0.000)], + ['CB', 0, (-0.519, -0.773, -1.212)], + ['O', 3, (0.625, 1.062, -0.000)], + ['SG', 4, (0.728, 1.653, 0.000)], + ], + 'GLN': [ + ['N', 0, (-0.526, 1.361, -0.000)], + ['CA', 0, (0.000, 0.000, 0.000)], + ['C', 0, (1.526, 0.000, 0.000)], + ['CB', 0, (-0.525, -0.779, -1.207)], + ['O', 3, (0.626, 1.062, -0.000)], + ['CG', 4, (0.615, 1.393, 0.000)], + ['CD', 5, (0.587, 1.399, -0.000)], + ['NE2', 6, (0.593, -1.189, -0.001)], + ['OE1', 6, (0.634, 1.060, 0.000)], + ], + 'GLU': [ + ['N', 0, (-0.528, 1.361, 0.000)], + ['CA', 0, (0.000, 0.000, 0.000)], + ['C', 0, (1.526, -0.000, -0.000)], + ['CB', 0, (-0.526, -0.781, -1.207)], + ['O', 3, (0.626, 1.062, 0.000)], + ['CG', 4, (0.615, 1.392, 0.000)], + ['CD', 5, (0.600, 1.397, 0.000)], + ['OE1', 6, (0.607, 1.095, -0.000)], + ['OE2', 6, (0.589, -1.104, -0.001)], + ], + 'GLY': [ + ['N', 0, (-0.572, 1.337, 0.000)], + ['CA', 0, (0.000, 0.000, 0.000)], + ['C', 0, (1.517, -0.000, -0.000)], + ['O', 3, (0.626, 1.062, -0.000)], + ], + 'HIS': [ + ['N', 0, (-0.527, 1.360, 0.000)], + ['CA', 0, (0.000, 0.000, 0.000)], + ['C', 0, (1.525, 0.000, 0.000)], + ['CB', 0, (-0.525, -0.778, -1.208)], + ['O', 3, (0.625, 1.063, 0.000)], + ['CG', 4, (0.600, 1.370, -0.000)], + ['CD2', 5, (0.889, -1.021, 0.003)], + ['ND1', 5, (0.744, 1.160, -0.000)], + ['CE1', 5, (2.030, 0.851, 0.002)], + ['NE2', 5, (2.145, -0.466, 0.004)], + ], + 'ILE': [ + ['N', 0, (-0.493, 1.373, -0.000)], + ['CA', 0, (0.000, 0.000, 0.000)], + ['C', 0, (1.527, -0.000, -0.000)], + ['CB', 0, (-0.536, -0.793, -1.213)], + ['O', 3, (0.627, 1.062, -0.000)], + ['CG1', 4, (0.534, 1.437, -0.000)], + ['CG2', 4, (0.540, -0.785, -1.199)], + ['CD1', 5, (0.619, 1.391, 0.000)], + ], + 'LEU': [ + ['N', 0, (-0.520, 1.363, 0.000)], + ['CA', 0, (0.000, 0.000, 0.000)], + ['C', 0, (1.525, -0.000, -0.000)], + ['CB', 0, (-0.522, -0.773, -1.214)], + ['O', 3, (0.625, 1.063, -0.000)], + ['CG', 4, (0.678, 1.371, 0.000)], + ['CD1', 5, (0.530, 1.430, -0.000)], + ['CD2', 5, (0.535, -0.774, 1.200)], + ], + 'LYS': [ + ['N', 0, (-0.526, 1.362, -0.000)], + ['CA', 0, (0.000, 0.000, 0.000)], + ['C', 0, (1.526, 0.000, 0.000)], + ['CB', 0, (-0.524, -0.778, -1.208)], + ['O', 3, (0.626, 1.062, -0.000)], + ['CG', 4, (0.619, 1.390, 0.000)], + ['CD', 5, (0.559, 1.417, 0.000)], + ['CE', 6, (0.560, 1.416, 0.000)], + ['NZ', 7, (0.554, 1.387, 0.000)], + ], + 'MET': [ + ['N', 0, (-0.521, 1.364, -0.000)], + ['CA', 0, (0.000, 0.000, 0.000)], + ['C', 0, (1.525, 0.000, 0.000)], + ['CB', 0, (-0.523, -0.776, -1.210)], + ['O', 3, (0.625, 1.062, -0.000)], + ['CG', 4, (0.613, 1.391, -0.000)], + ['SD', 5, (0.703, 1.695, 0.000)], + ['CE', 6, (0.320, 1.786, -0.000)], + ], + 'PHE': [ + ['N', 0, (-0.518, 1.363, 0.000)], + ['CA', 0, (0.000, 0.000, 0.000)], + ['C', 0, (1.524, 0.000, -0.000)], + ['CB', 0, (-0.525, -0.776, -1.212)], + ['O', 3, (0.626, 1.062, -0.000)], + ['CG', 4, (0.607, 1.377, 0.000)], + ['CD1', 5, (0.709, 1.195, -0.000)], + ['CD2', 5, (0.706, -1.196, 0.000)], + ['CE1', 5, (2.102, 1.198, -0.000)], + ['CE2', 5, (2.098, -1.201, -0.000)], + ['CZ', 5, (2.794, -0.003, -0.001)], + ], + 'PRO': [ + ['N', 0, (-0.566, 1.351, -0.000)], + ['CA', 0, (0.000, 0.000, 0.000)], + ['C', 0, (1.527, -0.000, 0.000)], + ['CB', 0, (-0.546, -0.611, -1.293)], + ['O', 3, (0.621, 1.066, 0.000)], + ['CG', 4, (0.382, 1.445, 0.0)], + # ['CD', 5, (0.427, 1.440, 0.0)], + ['CD', 5, (0.477, 1.424, 0.0)], # manually made angle 2 degrees larger + ], + 'SER': [ + ['N', 0, (-0.529, 1.360, -0.000)], + ['CA', 0, (0.000, 0.000, 0.000)], + ['C', 0, (1.525, -0.000, -0.000)], + ['CB', 0, (-0.518, -0.777, -1.211)], + ['O', 3, (0.626, 1.062, -0.000)], + ['OG', 4, (0.503, 1.325, 0.000)], + ], + 'THR': [ + ['N', 0, (-0.517, 1.364, 0.000)], + ['CA', 0, (0.000, 0.000, 0.000)], + ['C', 0, (1.526, 0.000, -0.000)], + ['CB', 0, (-0.516, -0.793, -1.215)], + ['O', 3, (0.626, 1.062, 0.000)], + ['CG2', 4, (0.550, -0.718, -1.228)], + ['OG1', 4, (0.472, 1.353, 0.000)], + ], + 'TRP': [ + ['N', 0, (-0.521, 1.363, 0.000)], + ['CA', 0, (0.000, 0.000, 0.000)], + ['C', 0, (1.525, -0.000, 0.000)], + ['CB', 0, (-0.523, -0.776, -1.212)], + ['O', 3, (0.627, 1.062, 0.000)], + ['CG', 4, (0.609, 1.370, -0.000)], + ['CD1', 5, (0.824, 1.091, 0.000)], + ['CD2', 5, (0.854, -1.148, -0.005)], + ['CE2', 5, (2.186, -0.678, -0.007)], + ['CE3', 5, (0.622, -2.530, -0.007)], + ['NE1', 5, (2.140, 0.690, -0.004)], + ['CH2', 5, (3.028, -2.890, -0.013)], + ['CZ2', 5, (3.283, -1.543, -0.011)], + ['CZ3', 5, (1.715, -3.389, -0.011)], + ], + 'TYR': [ + ['N', 0, (-0.522, 1.362, 0.000)], + ['CA', 0, (0.000, 0.000, 0.000)], + ['C', 0, (1.524, -0.000, -0.000)], + ['CB', 0, (-0.522, -0.776, -1.213)], + ['O', 3, (0.627, 1.062, -0.000)], + ['CG', 4, (0.607, 1.382, -0.000)], + ['CD1', 5, (0.716, 1.195, -0.000)], + ['CD2', 5, (0.713, -1.194, -0.001)], + ['CE1', 5, (2.107, 1.200, -0.002)], + ['CE2', 5, (2.104, -1.201, -0.003)], + ['OH', 5, (4.168, -0.002, -0.005)], + ['CZ', 5, (2.791, -0.001, -0.003)], + ], + 'VAL': [ + ['N', 0, (-0.494, 1.373, -0.000)], + ['CA', 0, (0.000, 0.000, 0.000)], + ['C', 0, (1.527, -0.000, -0.000)], + ['CB', 0, (-0.533, -0.795, -1.213)], + ['O', 3, (0.627, 1.062, -0.000)], + ['CG1', 4, (0.540, 1.429, -0.000)], + ['CG2', 4, (0.533, -0.776, 1.203)], + ], +} + +# A list of atoms (excluding hydrogen) for each AA type. PDB naming convention. +residue_atoms = { + 'ALA': ['C', 'CA', 'CB', 'N', 'O'], + 'ARG': ['C', 'CA', 'CB', 'CG', 'CD', 'CZ', 'N', 'NE', 'O', 'NH1', 'NH2'], + 'ASP': ['C', 'CA', 'CB', 'CG', 'N', 'O', 'OD1', 'OD2'], + 'ASN': ['C', 'CA', 'CB', 'CG', 'N', 'ND2', 'O', 'OD1'], + 'CYS': ['C', 'CA', 'CB', 'N', 'O', 'SG'], + 'GLU': ['C', 'CA', 'CB', 'CG', 'CD', 'N', 'O', 'OE1', 'OE2'], + 'GLN': ['C', 'CA', 'CB', 'CG', 'CD', 'N', 'NE2', 'O', 'OE1'], + 'GLY': ['C', 'CA', 'N', 'O'], + 'HIS': ['C', 'CA', 'CB', 'CG', 'CD2', 'CE1', 'N', 'ND1', 'NE2', 'O'], + 'ILE': ['C', 'CA', 'CB', 'CG1', 'CG2', 'CD1', 'N', 'O'], + 'LEU': ['C', 'CA', 'CB', 'CG', 'CD1', 'CD2', 'N', 'O'], + 'LYS': ['C', 'CA', 'CB', 'CG', 'CD', 'CE', 'N', 'NZ', 'O'], + 'MET': ['C', 'CA', 'CB', 'CG', 'CE', 'N', 'O', 'SD'], + 'PHE': ['C', 'CA', 'CB', 'CG', 'CD1', 'CD2', 'CE1', 'CE2', 'CZ', 'N', 'O'], + 'PRO': ['C', 'CA', 'CB', 'CG', 'CD', 'N', 'O'], + 'SER': ['C', 'CA', 'CB', 'N', 'O', 'OG'], + 'THR': ['C', 'CA', 'CB', 'CG2', 'N', 'O', 'OG1'], + 'TRP': ['C', 'CA', 'CB', 'CG', 'CD1', 'CD2', 'CE2', 'CE3', 'CZ2', 'CZ3', + 'CH2', 'N', 'NE1', 'O'], + 'TYR': ['C', 'CA', 'CB', 'CG', 'CD1', 'CD2', 'CE1', 'CE2', 'CZ', 'N', 'O', + 'OH'], + 'VAL': ['C', 'CA', 'CB', 'CG1', 'CG2', 'N', 'O'] +} + +# Naming swaps for ambiguous atom names. +# Due to symmetries in the amino acids the naming of atoms is ambiguous in +# 4 of the 20 amino acids. +# (The LDDT paper lists 7 amino acids as ambiguous, but the naming ambiguities +# in LEU, VAL and ARG can be resolved by using the 3d constellations of +# the 'ambiguous' atoms and their neighbours) +residue_atom_renaming_swaps = { + 'ASP': {'OD1': 'OD2'}, + 'GLU': {'OE1': 'OE2'}, + 'PHE': {'CD1': 'CD2', 'CE1': 'CE2'}, + 'TYR': {'CD1': 'CD2', 'CE1': 'CE2'}, +} + +# Van der Waals radii [Angstroem] of the atoms (from Wikipedia) +van_der_waals_radius = { + 'C': 1.7, + 'N': 1.55, + 'O': 1.52, + 'S': 1.8, +} + +Bond = collections.namedtuple( + 'Bond', ['atom1_name', 'atom2_name', 'length', 'stddev']) +BondAngle = collections.namedtuple( + 'BondAngle', + ['atom1_name', 'atom2_name', 'atom3name', 'angle_rad', 'stddev']) + + +@functools.lru_cache(maxsize=None) +def load_stereo_chemical_props() -> Tuple[Mapping[str, List[Bond]], + Mapping[str, List[Bond]], + Mapping[str, List[BondAngle]]]: + """Load stereo_chemical_props.txt into a nice structure. + + Load literature values for bond lengths and bond angles and translate + bond angles into the length of the opposite edge of the triangle + ("residue_virtual_bonds"). + + Returns: + residue_bonds: dict that maps resname --> list of Bond tuples + residue_virtual_bonds: dict that maps resname --> list of Bond tuples + residue_bond_angles: dict that maps resname --> list of BondAngle tuples + """ + stereo_chemical_props_path = ( + 'alphafold/common/stereo_chemical_props.txt') + with open(stereo_chemical_props_path, 'rt') as f: + stereo_chemical_props = f.read() + lines_iter = iter(stereo_chemical_props.splitlines()) + # Load bond lengths. + residue_bonds = {} + next(lines_iter) # Skip header line. + for line in lines_iter: + if line.strip() == '-': + break + bond, resname, length, stddev = line.split() + atom1, atom2 = bond.split('-') + if resname not in residue_bonds: + residue_bonds[resname] = [] + residue_bonds[resname].append( + Bond(atom1, atom2, float(length), float(stddev))) + residue_bonds['UNK'] = [] + + # Load bond angles. + residue_bond_angles = {} + next(lines_iter) # Skip empty line. + next(lines_iter) # Skip header line. + for line in lines_iter: + if line.strip() == '-': + break + bond, resname, angle_degree, stddev_degree = line.split() + atom1, atom2, atom3 = bond.split('-') + if resname not in residue_bond_angles: + residue_bond_angles[resname] = [] + residue_bond_angles[resname].append( + BondAngle(atom1, atom2, atom3, + float(angle_degree) / 180. * np.pi, + float(stddev_degree) / 180. * np.pi)) + residue_bond_angles['UNK'] = [] + + def make_bond_key(atom1_name, atom2_name): + """Unique key to lookup bonds.""" + return '-'.join(sorted([atom1_name, atom2_name])) + + # Translate bond angles into distances ("virtual bonds"). + residue_virtual_bonds = {} + for resname, bond_angles in residue_bond_angles.items(): + # Create a fast lookup dict for bond lengths. + bond_cache = {} + for b in residue_bonds[resname]: + bond_cache[make_bond_key(b.atom1_name, b.atom2_name)] = b + residue_virtual_bonds[resname] = [] + for ba in bond_angles: + bond1 = bond_cache[make_bond_key(ba.atom1_name, ba.atom2_name)] + bond2 = bond_cache[make_bond_key(ba.atom2_name, ba.atom3name)] + + # Compute distance between atom1 and atom3 using the law of cosines + # c^2 = a^2 + b^2 - 2ab*cos(gamma). + gamma = ba.angle_rad + length = np.sqrt(bond1.length**2 + bond2.length**2 + - 2 * bond1.length * bond2.length * np.cos(gamma)) + + # Propagation of uncertainty assuming uncorrelated errors. + dl_outer = 0.5 / length + dl_dgamma = (2 * bond1.length * bond2.length * np.sin(gamma)) * dl_outer + dl_db1 = (2 * bond1.length - 2 * bond2.length * np.cos(gamma)) * dl_outer + dl_db2 = (2 * bond2.length - 2 * bond1.length * np.cos(gamma)) * dl_outer + stddev = np.sqrt((dl_dgamma * ba.stddev)**2 + + (dl_db1 * bond1.stddev)**2 + + (dl_db2 * bond2.stddev)**2) + residue_virtual_bonds[resname].append( + Bond(ba.atom1_name, ba.atom3name, length, stddev)) + + return (residue_bonds, + residue_virtual_bonds, + residue_bond_angles) + + +# Between-residue bond lengths for general bonds (first element) and for Proline +# (second element). +between_res_bond_length_c_n = [1.329, 1.341] +between_res_bond_length_stddev_c_n = [0.014, 0.016] + +# Between-residue cos_angles. +between_res_cos_angles_c_n_ca = [-0.5203, 0.0353] # degrees: 121.352 +- 2.315 +between_res_cos_angles_ca_c_n = [-0.4473, 0.0311] # degrees: 116.568 +- 1.995 + +# This mapping is used when we need to store atom data in a format that requires +# fixed atom data size for every residue (e.g. a numpy array). +atom_types = [ + 'N', 'CA', 'C', 'CB', 'O', 'CG', 'CG1', 'CG2', 'OG', 'OG1', 'SG', 'CD', + 'CD1', 'CD2', 'ND1', 'ND2', 'OD1', 'OD2', 'SD', 'CE', 'CE1', 'CE2', 'CE3', + 'NE', 'NE1', 'NE2', 'OE1', 'OE2', 'CH2', 'NH1', 'NH2', 'OH', 'CZ', 'CZ2', + 'CZ3', 'NZ', 'OXT' +] +atom_order = {atom_type: i for i, atom_type in enumerate(atom_types)} +atom_type_num = len(atom_types) # := 37. + +# A compact atom encoding with 14 columns +# pylint: disable=line-too-long +# pylint: disable=bad-whitespace +restype_name_to_atom14_names = { + 'ALA': ['N', 'CA', 'C', 'O', 'CB', '', '', '', '', '', '', '', '', ''], + 'ARG': ['N', 'CA', 'C', 'O', 'CB', 'CG', 'CD', 'NE', 'CZ', 'NH1', 'NH2', '', '', ''], + 'ASN': ['N', 'CA', 'C', 'O', 'CB', 'CG', 'OD1', 'ND2', '', '', '', '', '', ''], + 'ASP': ['N', 'CA', 'C', 'O', 'CB', 'CG', 'OD1', 'OD2', '', '', '', '', '', ''], + 'CYS': ['N', 'CA', 'C', 'O', 'CB', 'SG', '', '', '', '', '', '', '', ''], + 'GLN': ['N', 'CA', 'C', 'O', 'CB', 'CG', 'CD', 'OE1', 'NE2', '', '', '', '', ''], + 'GLU': ['N', 'CA', 'C', 'O', 'CB', 'CG', 'CD', 'OE1', 'OE2', '', '', '', '', ''], + 'GLY': ['N', 'CA', 'C', 'O', '', '', '', '', '', '', '', '', '', ''], + 'HIS': ['N', 'CA', 'C', 'O', 'CB', 'CG', 'ND1', 'CD2', 'CE1', 'NE2', '', '', '', ''], + 'ILE': ['N', 'CA', 'C', 'O', 'CB', 'CG1', 'CG2', 'CD1', '', '', '', '', '', ''], + 'LEU': ['N', 'CA', 'C', 'O', 'CB', 'CG', 'CD1', 'CD2', '', '', '', '', '', ''], + 'LYS': ['N', 'CA', 'C', 'O', 'CB', 'CG', 'CD', 'CE', 'NZ', '', '', '', '', ''], + 'MET': ['N', 'CA', 'C', 'O', 'CB', 'CG', 'SD', 'CE', '', '', '', '', '', ''], + 'PHE': ['N', 'CA', 'C', 'O', 'CB', 'CG', 'CD1', 'CD2', 'CE1', 'CE2', 'CZ', '', '', ''], + 'PRO': ['N', 'CA', 'C', 'O', 'CB', 'CG', 'CD', '', '', '', '', '', '', ''], + 'SER': ['N', 'CA', 'C', 'O', 'CB', 'OG', '', '', '', '', '', '', '', ''], + 'THR': ['N', 'CA', 'C', 'O', 'CB', 'OG1', 'CG2', '', '', '', '', '', '', ''], + 'TRP': ['N', 'CA', 'C', 'O', 'CB', 'CG', 'CD1', 'CD2', 'NE1', 'CE2', 'CE3', 'CZ2', 'CZ3', 'CH2'], + 'TYR': ['N', 'CA', 'C', 'O', 'CB', 'CG', 'CD1', 'CD2', 'CE1', 'CE2', 'CZ', 'OH', '', ''], + 'VAL': ['N', 'CA', 'C', 'O', 'CB', 'CG1', 'CG2', '', '', '', '', '', '', ''], + 'UNK': ['', '', '', '', '', '', '', '', '', '', '', '', '', ''], + +} +# pylint: enable=line-too-long +# pylint: enable=bad-whitespace + + +# This is the standard residue order when coding AA type as a number. +# Reproduce it by taking 3-letter AA codes and sorting them alphabetically. +restypes = [ + 'A', 'R', 'N', 'D', 'C', 'Q', 'E', 'G', 'H', 'I', 'L', 'K', 'M', 'F', 'P', + 'S', 'T', 'W', 'Y', 'V' +] +restype_order = {restype: i for i, restype in enumerate(restypes)} +restype_num = len(restypes) # := 20. +unk_restype_index = restype_num # Catch-all index for unknown restypes. + +restypes_with_x = restypes + ['X'] +restype_order_with_x = {restype: i for i, restype in enumerate(restypes_with_x)} + + +def sequence_to_onehot( + sequence: str, + mapping: Mapping[str, int], + map_unknown_to_x: bool = False) -> np.ndarray: + """Maps the given sequence into a one-hot encoded matrix. + + Args: + sequence: An amino acid sequence. + mapping: A dictionary mapping amino acids to integers. + map_unknown_to_x: If True, any amino acid that is not in the mapping will be + mapped to the unknown amino acid 'X'. If the mapping doesn't contain + amino acid 'X', an error will be thrown. If False, any amino acid not in + the mapping will throw an error. + + Returns: + A numpy array of shape (seq_len, num_unique_aas) with one-hot encoding of + the sequence. + + Raises: + ValueError: If the mapping doesn't contain values from 0 to + num_unique_aas - 1 without any gaps. + """ + num_entries = max(mapping.values()) + 1 + + if sorted(set(mapping.values())) != list(range(num_entries)): + raise ValueError('The mapping must have values from 0 to num_unique_aas-1 ' + 'without any gaps. Got: %s' % sorted(mapping.values())) + + one_hot_arr = np.zeros((len(sequence), num_entries), dtype=np.int32) + + for aa_index, aa_type in enumerate(sequence): + if map_unknown_to_x: + if aa_type.isalpha() and aa_type.isupper(): + aa_id = mapping.get(aa_type, mapping['X']) + else: + raise ValueError(f'Invalid character in the sequence: {aa_type}') + else: + aa_id = mapping[aa_type] + one_hot_arr[aa_index, aa_id] = 1 + + return one_hot_arr + + +restype_1to3 = { + 'A': 'ALA', + 'R': 'ARG', + 'N': 'ASN', + 'D': 'ASP', + 'C': 'CYS', + 'Q': 'GLN', + 'E': 'GLU', + 'G': 'GLY', + 'H': 'HIS', + 'I': 'ILE', + 'L': 'LEU', + 'K': 'LYS', + 'M': 'MET', + 'F': 'PHE', + 'P': 'PRO', + 'S': 'SER', + 'T': 'THR', + 'W': 'TRP', + 'Y': 'TYR', + 'V': 'VAL', +} + + +# NB: restype_3to1 differs from Bio.PDB.protein_letters_3to1 by being a simple +# 1-to-1 mapping of 3 letter names to one letter names. The latter contains +# many more, and less common, three letter names as keys and maps many of these +# to the same one letter name (including 'X' and 'U' which we don't use here). +restype_3to1 = {v: k for k, v in restype_1to3.items()} + +# Define a restype name for all unknown residues. +unk_restype = 'UNK' + +resnames = [restype_1to3[r] for r in restypes] + [unk_restype] +resname_to_idx = {resname: i for i, resname in enumerate(resnames)} + + +# The mapping here uses hhblits convention, so that B is mapped to D, J and O +# are mapped to X, U is mapped to C, and Z is mapped to E. Other than that the +# remaining 20 amino acids are kept in alphabetical order. +# There are 2 non-amino acid codes, X (representing any amino acid) and +# "-" representing a missing amino acid in an alignment. The id for these +# codes is put at the end (20 and 21) so that they can easily be ignored if +# desired. +HHBLITS_AA_TO_ID = { + 'A': 0, + 'B': 2, + 'C': 1, + 'D': 2, + 'E': 3, + 'F': 4, + 'G': 5, + 'H': 6, + 'I': 7, + 'J': 20, + 'K': 8, + 'L': 9, + 'M': 10, + 'N': 11, + 'O': 20, + 'P': 12, + 'Q': 13, + 'R': 14, + 'S': 15, + 'T': 16, + 'U': 1, + 'V': 17, + 'W': 18, + 'X': 20, + 'Y': 19, + 'Z': 3, + '-': 21, +} + +# Partial inversion of HHBLITS_AA_TO_ID. +ID_TO_HHBLITS_AA = { + 0: 'A', + 1: 'C', # Also U. + 2: 'D', # Also B. + 3: 'E', # Also Z. + 4: 'F', + 5: 'G', + 6: 'H', + 7: 'I', + 8: 'K', + 9: 'L', + 10: 'M', + 11: 'N', + 12: 'P', + 13: 'Q', + 14: 'R', + 15: 'S', + 16: 'T', + 17: 'V', + 18: 'W', + 19: 'Y', + 20: 'X', # Includes J and O. + 21: '-', +} + +restypes_with_x_and_gap = restypes + ['X', '-'] +MAP_HHBLITS_AATYPE_TO_OUR_AATYPE = tuple( + restypes_with_x_and_gap.index(ID_TO_HHBLITS_AA[i]) + for i in range(len(restypes_with_x_and_gap))) + + +def _make_standard_atom_mask() -> np.ndarray: + """Returns [num_res_types, num_atom_types] mask array.""" + # +1 to account for unknown (all 0s). + mask = np.zeros([restype_num + 1, atom_type_num], dtype=np.int32) + for restype, restype_letter in enumerate(restypes): + restype_name = restype_1to3[restype_letter] + atom_names = residue_atoms[restype_name] + for atom_name in atom_names: + atom_type = atom_order[atom_name] + mask[restype, atom_type] = 1 + return mask + + +STANDARD_ATOM_MASK = _make_standard_atom_mask() + + +# A one hot representation for the first and second atoms defining the axis +# of rotation for each chi-angle in each residue. +def chi_angle_atom(atom_index: int) -> np.ndarray: + """Define chi-angle rigid groups via one-hot representations.""" + chi_angles_index = {} + one_hots = [] + + for k, v in chi_angles_atoms.items(): + indices = [atom_types.index(s[atom_index]) for s in v] + indices.extend([-1]*(4-len(indices))) + chi_angles_index[k] = indices + + for r in restypes: + res3 = restype_1to3[r] + one_hot = np.eye(atom_type_num)[chi_angles_index[res3]] + one_hots.append(one_hot) + + one_hots.append(np.zeros([4, atom_type_num])) # Add zeros for residue `X`. + one_hot = np.stack(one_hots, axis=0) + one_hot = np.transpose(one_hot, [0, 2, 1]) + + return one_hot + +chi_atom_1_one_hot = chi_angle_atom(1) +chi_atom_2_one_hot = chi_angle_atom(2) + +# An array like chi_angles_atoms but using indices rather than names. +chi_angles_atom_indices = [chi_angles_atoms[restype_1to3[r]] for r in restypes] +chi_angles_atom_indices = tree.map_structure( + lambda atom_name: atom_order[atom_name], chi_angles_atom_indices) +chi_angles_atom_indices = np.array([ + chi_atoms + ([[0, 0, 0, 0]] * (4 - len(chi_atoms))) + for chi_atoms in chi_angles_atom_indices]) + +# Mapping from (res_name, atom_name) pairs to the atom's chi group index +# and atom index within that group. +chi_groups_for_atom = collections.defaultdict(list) +for res_name, chi_angle_atoms_for_res in chi_angles_atoms.items(): + for chi_group_i, chi_group in enumerate(chi_angle_atoms_for_res): + for atom_i, atom in enumerate(chi_group): + chi_groups_for_atom[(res_name, atom)].append((chi_group_i, atom_i)) +chi_groups_for_atom = dict(chi_groups_for_atom) + + +def _make_rigid_transformation_4x4(ex, ey, translation): + """Create a rigid 4x4 transformation matrix from two axes and transl.""" + # Normalize ex. + ex_normalized = ex / np.linalg.norm(ex) + + # make ey perpendicular to ex + ey_normalized = ey - np.dot(ey, ex_normalized) * ex_normalized + ey_normalized /= np.linalg.norm(ey_normalized) + + # compute ez as cross product + eznorm = np.cross(ex_normalized, ey_normalized) + m = np.stack([ex_normalized, ey_normalized, eznorm, translation]).transpose() + m = np.concatenate([m, [[0., 0., 0., 1.]]], axis=0) + return m + + +# create an array with (restype, atomtype) --> rigid_group_idx +# and an array with (restype, atomtype, coord) for the atom positions +# and compute affine transformation matrices (4,4) from one rigid group to the +# previous group +restype_atom37_to_rigid_group = np.zeros([21, 37], dtype=np.int) +restype_atom37_mask = np.zeros([21, 37], dtype=np.float32) +restype_atom37_rigid_group_positions = np.zeros([21, 37, 3], dtype=np.float32) +restype_atom14_to_rigid_group = np.zeros([21, 14], dtype=np.int) +restype_atom14_mask = np.zeros([21, 14], dtype=np.float32) +restype_atom14_rigid_group_positions = np.zeros([21, 14, 3], dtype=np.float32) +restype_rigid_group_default_frame = np.zeros([21, 8, 4, 4], dtype=np.float32) + + +def _make_rigid_group_constants(): + """Fill the arrays above.""" + for restype, restype_letter in enumerate(restypes): + resname = restype_1to3[restype_letter] + for atomname, group_idx, atom_position in rigid_group_atom_positions[ + resname]: + atomtype = atom_order[atomname] + restype_atom37_to_rigid_group[restype, atomtype] = group_idx + restype_atom37_mask[restype, atomtype] = 1 + restype_atom37_rigid_group_positions[restype, atomtype, :] = atom_position + + atom14idx = restype_name_to_atom14_names[resname].index(atomname) + restype_atom14_to_rigid_group[restype, atom14idx] = group_idx + restype_atom14_mask[restype, atom14idx] = 1 + restype_atom14_rigid_group_positions[restype, + atom14idx, :] = atom_position + + for restype, restype_letter in enumerate(restypes): + resname = restype_1to3[restype_letter] + atom_positions = {name: np.array(pos) for name, _, pos + in rigid_group_atom_positions[resname]} + + # backbone to backbone is the identity transform + restype_rigid_group_default_frame[restype, 0, :, :] = np.eye(4) + + # pre-omega-frame to backbone (currently dummy identity matrix) + restype_rigid_group_default_frame[restype, 1, :, :] = np.eye(4) + + # phi-frame to backbone + mat = _make_rigid_transformation_4x4( + ex=atom_positions['N'] - atom_positions['CA'], + ey=np.array([1., 0., 0.]), + translation=atom_positions['N']) + restype_rigid_group_default_frame[restype, 2, :, :] = mat + + # psi-frame to backbone + mat = _make_rigid_transformation_4x4( + ex=atom_positions['C'] - atom_positions['CA'], + ey=atom_positions['CA'] - atom_positions['N'], + translation=atom_positions['C']) + restype_rigid_group_default_frame[restype, 3, :, :] = mat + + # chi1-frame to backbone + if chi_angles_mask[restype][0]: + base_atom_names = chi_angles_atoms[resname][0] + base_atom_positions = [atom_positions[name] for name in base_atom_names] + mat = _make_rigid_transformation_4x4( + ex=base_atom_positions[2] - base_atom_positions[1], + ey=base_atom_positions[0] - base_atom_positions[1], + translation=base_atom_positions[2]) + restype_rigid_group_default_frame[restype, 4, :, :] = mat + + # chi2-frame to chi1-frame + # chi3-frame to chi2-frame + # chi4-frame to chi3-frame + # luckily all rotation axes for the next frame start at (0,0,0) of the + # previous frame + for chi_idx in range(1, 4): + if chi_angles_mask[restype][chi_idx]: + axis_end_atom_name = chi_angles_atoms[resname][chi_idx][2] + axis_end_atom_position = atom_positions[axis_end_atom_name] + mat = _make_rigid_transformation_4x4( + ex=axis_end_atom_position, + ey=np.array([-1., 0., 0.]), + translation=axis_end_atom_position) + restype_rigid_group_default_frame[restype, 4 + chi_idx, :, :] = mat + + +_make_rigid_group_constants() + + +def make_atom14_dists_bounds(overlap_tolerance=1.5, + bond_length_tolerance_factor=15): + """compute upper and lower bounds for bonds to assess violations.""" + restype_atom14_bond_lower_bound = np.zeros([21, 14, 14], np.float32) + restype_atom14_bond_upper_bound = np.zeros([21, 14, 14], np.float32) + restype_atom14_bond_stddev = np.zeros([21, 14, 14], np.float32) + residue_bonds, residue_virtual_bonds, _ = load_stereo_chemical_props() + for restype, restype_letter in enumerate(restypes): + resname = restype_1to3[restype_letter] + atom_list = restype_name_to_atom14_names[resname] + + # create lower and upper bounds for clashes + for atom1_idx, atom1_name in enumerate(atom_list): + if not atom1_name: + continue + atom1_radius = van_der_waals_radius[atom1_name[0]] + for atom2_idx, atom2_name in enumerate(atom_list): + if (not atom2_name) or atom1_idx == atom2_idx: + continue + atom2_radius = van_der_waals_radius[atom2_name[0]] + lower = atom1_radius + atom2_radius - overlap_tolerance + upper = 1e10 + restype_atom14_bond_lower_bound[restype, atom1_idx, atom2_idx] = lower + restype_atom14_bond_lower_bound[restype, atom2_idx, atom1_idx] = lower + restype_atom14_bond_upper_bound[restype, atom1_idx, atom2_idx] = upper + restype_atom14_bond_upper_bound[restype, atom2_idx, atom1_idx] = upper + + # overwrite lower and upper bounds for bonds and angles + for b in residue_bonds[resname] + residue_virtual_bonds[resname]: + atom1_idx = atom_list.index(b.atom1_name) + atom2_idx = atom_list.index(b.atom2_name) + lower = b.length - bond_length_tolerance_factor * b.stddev + upper = b.length + bond_length_tolerance_factor * b.stddev + restype_atom14_bond_lower_bound[restype, atom1_idx, atom2_idx] = lower + restype_atom14_bond_lower_bound[restype, atom2_idx, atom1_idx] = lower + restype_atom14_bond_upper_bound[restype, atom1_idx, atom2_idx] = upper + restype_atom14_bond_upper_bound[restype, atom2_idx, atom1_idx] = upper + restype_atom14_bond_stddev[restype, atom1_idx, atom2_idx] = b.stddev + restype_atom14_bond_stddev[restype, atom2_idx, atom1_idx] = b.stddev + return {'lower_bound': restype_atom14_bond_lower_bound, # shape (21,14,14) + 'upper_bound': restype_atom14_bond_upper_bound, # shape (21,14,14) + 'stddev': restype_atom14_bond_stddev, # shape (21,14,14) + } diff --git a/alphafold/alphafold/common/residue_constants_test.py b/alphafold/alphafold/common/residue_constants_test.py new file mode 100644 index 0000000000000000000000000000000000000000..3a7981e0d1bb59b58274194b69e23afe9da89bf4 --- /dev/null +++ b/alphafold/alphafold/common/residue_constants_test.py @@ -0,0 +1,190 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Test that residue_constants generates correct values.""" + +from absl.testing import absltest +from absl.testing import parameterized +from alphafold.common import residue_constants +import numpy as np + + +class ResidueConstantsTest(parameterized.TestCase): + + @parameterized.parameters( + ('ALA', 0), + ('CYS', 1), + ('HIS', 2), + ('MET', 3), + ('LYS', 4), + ('ARG', 4), + ) + def testChiAnglesAtoms(self, residue_name, chi_num): + chi_angles_atoms = residue_constants.chi_angles_atoms[residue_name] + self.assertLen(chi_angles_atoms, chi_num) + for chi_angle_atoms in chi_angles_atoms: + self.assertLen(chi_angle_atoms, 4) + + def testChiGroupsForAtom(self): + for k, chi_groups in residue_constants.chi_groups_for_atom.items(): + res_name, atom_name = k + for chi_group_i, atom_i in chi_groups: + self.assertEqual( + atom_name, + residue_constants.chi_angles_atoms[res_name][chi_group_i][atom_i]) + + @parameterized.parameters( + ('ALA', 5), ('ARG', 11), ('ASN', 8), ('ASP', 8), ('CYS', 6), ('GLN', 9), + ('GLU', 9), ('GLY', 4), ('HIS', 10), ('ILE', 8), ('LEU', 8), ('LYS', 9), + ('MET', 8), ('PHE', 11), ('PRO', 7), ('SER', 6), ('THR', 7), ('TRP', 14), + ('TYR', 12), ('VAL', 7) + ) + def testResidueAtoms(self, atom_name, num_residue_atoms): + residue_atoms = residue_constants.residue_atoms[atom_name] + self.assertLen(residue_atoms, num_residue_atoms) + + def testStandardAtomMask(self): + with self.subTest('Check shape'): + self.assertEqual(residue_constants.STANDARD_ATOM_MASK.shape, (21, 37,)) + + with self.subTest('Check values'): + str_to_row = lambda s: [c == '1' for c in s] # More clear/concise. + np.testing.assert_array_equal( + residue_constants.STANDARD_ATOM_MASK, + np.array([ + # NB This was defined by c+p but looks sane. + str_to_row('11111 '), # ALA + str_to_row('111111 1 1 11 1 '), # ARG + str_to_row('111111 11 '), # ASP + str_to_row('111111 11 '), # ASN + str_to_row('11111 1 '), # CYS + str_to_row('111111 1 11 '), # GLU + str_to_row('111111 1 11 '), # GLN + str_to_row('111 1 '), # GLY + str_to_row('111111 11 1 1 '), # HIS + str_to_row('11111 11 1 '), # ILE + str_to_row('111111 11 '), # LEU + str_to_row('111111 1 1 1 '), # LYS + str_to_row('111111 11 '), # MET + str_to_row('111111 11 11 1 '), # PHE + str_to_row('111111 1 '), # PRO + str_to_row('11111 1 '), # SER + str_to_row('11111 1 1 '), # THR + str_to_row('111111 11 11 1 1 11 '), # TRP + str_to_row('111111 11 11 11 '), # TYR + str_to_row('11111 11 '), # VAL + str_to_row(' '), # UNK + ])) + + with self.subTest('Check row totals'): + # Check each row has the right number of atoms. + for row, restype in enumerate(residue_constants.restypes): # A, R, ... + long_restype = residue_constants.restype_1to3[restype] # ALA, ARG, ... + atoms_names = residue_constants.residue_atoms[ + long_restype] # ['C', 'CA', 'CB', 'N', 'O'], ... + self.assertLen(atoms_names, + residue_constants.STANDARD_ATOM_MASK[row, :].sum(), + long_restype) + + def testAtomTypes(self): + self.assertEqual(residue_constants.atom_type_num, 37) + + self.assertEqual(residue_constants.atom_types[0], 'N') + self.assertEqual(residue_constants.atom_types[1], 'CA') + self.assertEqual(residue_constants.atom_types[2], 'C') + self.assertEqual(residue_constants.atom_types[3], 'CB') + self.assertEqual(residue_constants.atom_types[4], 'O') + + self.assertEqual(residue_constants.atom_order['N'], 0) + self.assertEqual(residue_constants.atom_order['CA'], 1) + self.assertEqual(residue_constants.atom_order['C'], 2) + self.assertEqual(residue_constants.atom_order['CB'], 3) + self.assertEqual(residue_constants.atom_order['O'], 4) + self.assertEqual(residue_constants.atom_type_num, 37) + + def testRestypes(self): + three_letter_restypes = [ + residue_constants.restype_1to3[r] for r in residue_constants.restypes] + for restype, exp_restype in zip( + three_letter_restypes, sorted(residue_constants.restype_1to3.values())): + self.assertEqual(restype, exp_restype) + self.assertEqual(residue_constants.restype_num, 20) + + def testSequenceToOneHotHHBlits(self): + one_hot = residue_constants.sequence_to_onehot( + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ-', residue_constants.HHBLITS_AA_TO_ID) + exp_one_hot = np.array( + [[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], + [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], + [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]]) + np.testing.assert_array_equal(one_hot, exp_one_hot) + + def testSequenceToOneHotStandard(self): + one_hot = residue_constants.sequence_to_onehot( + 'ARNDCQEGHILKMFPSTWYV', residue_constants.restype_order) + np.testing.assert_array_equal(one_hot, np.eye(20)) + + def testSequenceToOneHotUnknownMapping(self): + seq = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + expected_out = np.zeros([26, 21]) + for row, position in enumerate( + [0, 20, 4, 3, 6, 13, 7, 8, 9, 20, 11, 10, 12, 2, 20, 14, 5, 1, 15, 16, + 20, 19, 17, 20, 18, 20]): + expected_out[row, position] = 1 + aa_types = residue_constants.sequence_to_onehot( + sequence=seq, + mapping=residue_constants.restype_order_with_x, + map_unknown_to_x=True) + self.assertTrue((aa_types == expected_out).all()) + + @parameterized.named_parameters( + ('lowercase', 'aaa'), # Insertions in A3M. + ('gaps', '---'), # Gaps in A3M. + ('dots', '...'), # Gaps in A3M. + ('metadata', '>TEST'), # FASTA metadata line. + ) + def testSequenceToOneHotUnknownMappingError(self, seq): + with self.assertRaises(ValueError): + residue_constants.sequence_to_onehot( + sequence=seq, + mapping=residue_constants.restype_order_with_x, + map_unknown_to_x=True) + + +if __name__ == '__main__': + absltest.main() diff --git a/alphafold/alphafold/common/testdata/2rbg.pdb b/alphafold/alphafold/common/testdata/2rbg.pdb new file mode 100755 index 0000000000000000000000000000000000000000..f480d512dc2991f7168d99cb78407db314042a54 --- /dev/null +++ b/alphafold/alphafold/common/testdata/2rbg.pdb @@ -0,0 +1,2784 @@ +HEADER STRUCTURAL GENOMICS, UNKNOWN FUNCTION 19-SEP-07 2RBG +TITLE CRYSTAL STRUCTURE OF HYPOTHETICAL PROTEIN(ST0493) FROM +TITLE 2 SULFOLOBUS TOKODAII +COMPND MOL_ID: 1; +COMPND 2 MOLECULE: PUTATIVE UNCHARACTERIZED PROTEIN ST0493; +COMPND 3 CHAIN: A, B; +COMPND 4 ENGINEERED: YES +SOURCE MOL_ID: 1; +SOURCE 2 ORGANISM_SCIENTIFIC: SULFOLOBUS TOKODAII; +SOURCE 3 ORGANISM_TAXID: 111955; +SOURCE 4 STRAIN: STRAIN 7; +SOURCE 5 EXPRESSION_SYSTEM: ESCHERICHIA COLI; +SOURCE 6 EXPRESSION_SYSTEM_TAXID: 562; +SOURCE 7 EXPRESSION_SYSTEM_STRAIN: ROSETTA834(DE3); +SOURCE 8 EXPRESSION_SYSTEM_VECTOR_TYPE: PLASMID; +SOURCE 9 EXPRESSION_SYSTEM_PLASMID: PET-21A +KEYWDS HYPOTHETICAL PROTEIN, STRUCTURAL GENOMICS, UNKNOWN FUNCTION, +KEYWDS 2 NPPSFA, NATIONAL PROJECT ON PROTEIN STRUCTURAL AND +KEYWDS 3 FUNCTIONAL ANALYSES, RIKEN STRUCTURAL GENOMICS/PROTEOMICS +KEYWDS 4 INITIATIVE, RSGI +EXPDTA X-RAY DIFFRACTION +AUTHOR J.JEYAKANTHAN,S.KURAMITSU,S.YOKOYAMA,RIKEN STRUCTURAL +AUTHOR 2 GENOMICS/PROTEOMICS INITIATIVE (RSGI) +REVDAT 2 24-FEB-09 2RBG 1 VERSN +REVDAT 1 30-SEP-08 2RBG 0 +JRNL AUTH J.JEYAKANTHAN,S.KURAMITSU,S.YOKOYAMA +JRNL TITL CRYSTAL STRUCTURE OF HYPOTHETICAL PROTEIN(ST0493) +JRNL TITL 2 FROM SULFOLOBUS TOKODAII +JRNL REF TO BE PUBLISHED +JRNL REFN +REMARK 1 +REMARK 2 +REMARK 2 RESOLUTION. 1.75 ANGSTROMS. +REMARK 3 +REMARK 3 REFINEMENT. +REMARK 3 PROGRAM : CNS 1.1 +REMARK 3 AUTHORS : BRUNGER,ADAMS,CLORE,DELANO,GROS,GROSSE- +REMARK 3 : KUNSTLEVE,JIANG,KUSZEWSKI,NILGES, PANNU, +REMARK 3 : READ,RICE,SIMONSON,WARREN +REMARK 3 +REMARK 3 REFINEMENT TARGET : ENGH & HUBER +REMARK 3 +REMARK 3 DATA USED IN REFINEMENT. +REMARK 3 RESOLUTION RANGE HIGH (ANGSTROMS) : 1.75 +REMARK 3 RESOLUTION RANGE LOW (ANGSTROMS) : 33.49 +REMARK 3 DATA CUTOFF (SIGMA(F)) : 0.000 +REMARK 3 DATA CUTOFF HIGH (ABS(F)) : 2067291.840 +REMARK 3 DATA CUTOFF LOW (ABS(F)) : 0.0000 +REMARK 3 COMPLETENESS (WORKING+TEST) (%) : 99.3 +REMARK 3 NUMBER OF REFLECTIONS : 25029 +REMARK 3 +REMARK 3 FIT TO DATA USED IN REFINEMENT. +REMARK 3 CROSS-VALIDATION METHOD : THROUGHOUT +REMARK 3 FREE R VALUE TEST SET SELECTION : RANDOM +REMARK 3 R VALUE (WORKING SET) : 0.173 +REMARK 3 FREE R VALUE : 0.196 +REMARK 3 FREE R VALUE TEST SET SIZE (%) : 4.900 +REMARK 3 FREE R VALUE TEST SET COUNT : 1216 +REMARK 3 ESTIMATED ERROR OF FREE R VALUE : 0.006 +REMARK 3 +REMARK 3 FIT IN THE HIGHEST RESOLUTION BIN. +REMARK 3 TOTAL NUMBER OF BINS USED : 8 +REMARK 3 BIN RESOLUTION RANGE HIGH (A) : 1.75 +REMARK 3 BIN RESOLUTION RANGE LOW (A) : 1.83 +REMARK 3 BIN COMPLETENESS (WORKING+TEST) (%) : 96.80 +REMARK 3 REFLECTIONS IN BIN (WORKING SET) : 2906 +REMARK 3 BIN R VALUE (WORKING SET) : 0.1980 +REMARK 3 BIN FREE R VALUE : 0.2420 +REMARK 3 BIN FREE R VALUE TEST SET SIZE (%) : 5.10 +REMARK 3 BIN FREE R VALUE TEST SET COUNT : 156 +REMARK 3 ESTIMATED ERROR OF BIN FREE R VALUE : 0.019 +REMARK 3 +REMARK 3 NUMBER OF NON-HYDROGEN ATOMS USED IN REFINEMENT. +REMARK 3 PROTEIN ATOMS : 2060 +REMARK 3 NUCLEIC ACID ATOMS : 0 +REMARK 3 HETEROGEN ATOMS : 5 +REMARK 3 SOLVENT ATOMS : 316 +REMARK 3 +REMARK 3 B VALUES. +REMARK 3 FROM WILSON PLOT (A**2) : 13.30 +REMARK 3 MEAN B VALUE (OVERALL, A**2) : 16.90 +REMARK 3 OVERALL ANISOTROPIC B VALUE. +REMARK 3 B11 (A**2) : 2.81000 +REMARK 3 B22 (A**2) : -1.00000 +REMARK 3 B33 (A**2) : -1.81000 +REMARK 3 B12 (A**2) : 0.00000 +REMARK 3 B13 (A**2) : -1.31000 +REMARK 3 B23 (A**2) : 0.00000 +REMARK 3 +REMARK 3 ESTIMATED COORDINATE ERROR. +REMARK 3 ESD FROM LUZZATI PLOT (A) : 0.16 +REMARK 3 ESD FROM SIGMAA (A) : 0.06 +REMARK 3 LOW RESOLUTION CUTOFF (A) : 5.00 +REMARK 3 +REMARK 3 CROSS-VALIDATED ESTIMATED COORDINATE ERROR. +REMARK 3 ESD FROM C-V LUZZATI PLOT (A) : 0.19 +REMARK 3 ESD FROM C-V SIGMAA (A) : 0.14 +REMARK 3 +REMARK 3 RMS DEVIATIONS FROM IDEAL VALUES. +REMARK 3 BOND LENGTHS (A) : 0.005 +REMARK 3 BOND ANGLES (DEGREES) : 1.10 +REMARK 3 DIHEDRAL ANGLES (DEGREES) : 22.00 +REMARK 3 IMPROPER ANGLES (DEGREES) : 0.70 +REMARK 3 +REMARK 3 ISOTROPIC THERMAL MODEL : RESTRAINED +REMARK 3 +REMARK 3 ISOTROPIC THERMAL FACTOR RESTRAINTS. RMS SIGMA +REMARK 3 MAIN-CHAIN BOND (A**2) : NULL ; NULL +REMARK 3 MAIN-CHAIN ANGLE (A**2) : NULL ; NULL +REMARK 3 SIDE-CHAIN BOND (A**2) : NULL ; NULL +REMARK 3 SIDE-CHAIN ANGLE (A**2) : NULL ; NULL +REMARK 3 +REMARK 3 BULK SOLVENT MODELING. +REMARK 3 METHOD USED : FLAT MODEL +REMARK 3 KSOL : 0.37 +REMARK 3 BSOL : 51.20 +REMARK 3 +REMARK 3 NCS MODEL : NULL +REMARK 3 +REMARK 3 NCS RESTRAINTS. RMS SIGMA/WEIGHT +REMARK 3 GROUP 1 POSITIONAL (A) : NULL ; NULL +REMARK 3 GROUP 1 B-FACTOR (A**2) : NULL ; NULL +REMARK 3 +REMARK 3 PARAMETER FILE 1 : PROTEIN_REP.PARAM +REMARK 3 PARAMETER FILE 2 : LIGAND.PARAM +REMARK 3 PARAMETER FILE 3 : ION.PARAM +REMARK 3 PARAMETER FILE 5 : WATER_REP.PARAM +REMARK 3 PARAMETER FILE 6 : NULL +REMARK 3 TOPOLOGY FILE 1 : PROTEIN.TOP +REMARK 3 TOPOLOGY FILE 2 : LIGAND.TOP +REMARK 3 TOPOLOGY FILE 3 : ION.TOP +REMARK 3 TOPOLOGY FILE 5 : WATER_PROTIN.TOP +REMARK 3 TOPOLOGY FILE 6 : NULL +REMARK 3 +REMARK 3 OTHER REFINEMENT REMARKS: NULL +REMARK 4 +REMARK 4 2RBG COMPLIES WITH FORMAT V. 3.15, 01-DEC-08 +REMARK 100 +REMARK 100 THIS ENTRY HAS BEEN PROCESSED BY PDBJ ON 27-SEP-07. +REMARK 100 THE RCSB ID CODE IS RCSB044658. +REMARK 200 +REMARK 200 EXPERIMENTAL DETAILS +REMARK 200 EXPERIMENT TYPE : X-RAY DIFFRACTION +REMARK 200 DATE OF DATA COLLECTION : 16-JUN-07 +REMARK 200 TEMPERATURE (KELVIN) : 100 +REMARK 200 PH : 7.5 +REMARK 200 NUMBER OF CRYSTALS USED : 1 +REMARK 200 +REMARK 200 SYNCHROTRON (Y/N) : Y +REMARK 200 RADIATION SOURCE : SPRING-8 +REMARK 200 BEAMLINE : BL26B2 +REMARK 200 X-RAY GENERATOR MODEL : NULL +REMARK 200 MONOCHROMATIC OR LAUE (M/L) : M +REMARK 200 WAVELENGTH OR RANGE (A) : 0.97899, 0.9, 0.97931 +REMARK 200 MONOCHROMATOR : SI-1 1 1 DOUBLE CRYSTAL +REMARK 200 MONOCHROMATOR +REMARK 200 OPTICS : RH COATED BENT-CYRINDRICAL +REMARK 200 MIRROR +REMARK 200 +REMARK 200 DETECTOR TYPE : CCD +REMARK 200 DETECTOR MANUFACTURER : MARMOSAIC 225 MM CCD +REMARK 200 INTENSITY-INTEGRATION SOFTWARE : HKL-2000 +REMARK 200 DATA SCALING SOFTWARE : SCALEPACK +REMARK 200 +REMARK 200 NUMBER OF UNIQUE REFLECTIONS : 25105 +REMARK 200 RESOLUTION RANGE HIGH (A) : 1.750 +REMARK 200 RESOLUTION RANGE LOW (A) : 50.000 +REMARK 200 REJECTION CRITERIA (SIGMA(I)) : NULL +REMARK 200 +REMARK 200 OVERALL. +REMARK 200 COMPLETENESS FOR RANGE (%) : 99.6 +REMARK 200 DATA REDUNDANCY : NULL +REMARK 200 R MERGE (I) : 0.05900 +REMARK 200 R SYM (I) : 0.06300 +REMARK 200 FOR THE DATA SET : NULL +REMARK 200 +REMARK 200 IN THE HIGHEST RESOLUTION SHELL. +REMARK 200 HIGHEST RESOLUTION SHELL, RANGE HIGH (A) : 1.75 +REMARK 200 HIGHEST RESOLUTION SHELL, RANGE LOW (A) : 1.81 +REMARK 200 COMPLETENESS FOR SHELL (%) : 96.9 +REMARK 200 DATA REDUNDANCY IN SHELL : NULL +REMARK 200 R MERGE FOR SHELL (I) : 0.14300 +REMARK 200 R SYM FOR SHELL (I) : 0.13300 +REMARK 200 FOR SHELL : NULL +REMARK 200 +REMARK 200 DIFFRACTION PROTOCOL: MAD +REMARK 200 METHOD USED TO DETERMINE THE STRUCTURE: MAD +REMARK 200 SOFTWARE USED: SOLVE +REMARK 200 STARTING MODEL: NULL +REMARK 200 +REMARK 200 REMARK: NULL +REMARK 280 +REMARK 280 CRYSTAL +REMARK 280 SOLVENT CONTENT, VS (%): 41.69 +REMARK 280 MATTHEWS COEFFICIENT, VM (ANGSTROMS**3/DA): 2.11 +REMARK 280 +REMARK 280 CRYSTALLIZATION CONDITIONS: 30% PEG 4K, 0.2M AMMONIUM SULFATE, +REMARK 280 PH 7.5, MICROBATCH, TEMPERATURE 293K +REMARK 290 +REMARK 290 CRYSTALLOGRAPHIC SYMMETRY +REMARK 290 SYMMETRY OPERATORS FOR SPACE GROUP: P 1 21 1 +REMARK 290 +REMARK 290 SYMOP SYMMETRY +REMARK 290 NNNMMM OPERATOR +REMARK 290 1555 X,Y,Z +REMARK 290 2555 -X,Y+1/2,-Z +REMARK 290 +REMARK 290 WHERE NNN -> OPERATOR NUMBER +REMARK 290 MMM -> TRANSLATION VECTOR +REMARK 290 +REMARK 290 CRYSTALLOGRAPHIC SYMMETRY TRANSFORMATIONS +REMARK 290 THE FOLLOWING TRANSFORMATIONS OPERATE ON THE ATOM/HETATM +REMARK 290 RECORDS IN THIS ENTRY TO PRODUCE CRYSTALLOGRAPHICALLY +REMARK 290 RELATED MOLECULES. +REMARK 290 SMTRY1 1 1.000000 0.000000 0.000000 0.00000 +REMARK 290 SMTRY2 1 0.000000 1.000000 0.000000 0.00000 +REMARK 290 SMTRY3 1 0.000000 0.000000 1.000000 0.00000 +REMARK 290 SMTRY1 2 -1.000000 0.000000 0.000000 0.00000 +REMARK 290 SMTRY2 2 0.000000 1.000000 0.000000 32.59200 +REMARK 290 SMTRY3 2 0.000000 0.000000 -1.000000 0.00000 +REMARK 290 +REMARK 290 REMARK: NULL +REMARK 300 +REMARK 300 BIOMOLECULE: 1, 2, 3 +REMARK 300 SEE REMARK 350 FOR THE AUTHOR PROVIDED AND/OR PROGRAM +REMARK 300 GENERATED ASSEMBLY INFORMATION FOR THE STRUCTURE IN +REMARK 300 THIS ENTRY. THE REMARK MAY ALSO PROVIDE INFORMATION ON +REMARK 300 BURIED SURFACE AREA. +REMARK 350 +REMARK 350 COORDINATES FOR A COMPLETE MULTIMER REPRESENTING THE KNOWN +REMARK 350 BIOLOGICALLY SIGNIFICANT OLIGOMERIZATION STATE OF THE +REMARK 350 MOLECULE CAN BE GENERATED BY APPLYING BIOMT TRANSFORMATIONS +REMARK 350 GIVEN BELOW. BOTH NON-CRYSTALLOGRAPHIC AND +REMARK 350 CRYSTALLOGRAPHIC OPERATIONS ARE GIVEN. +REMARK 350 +REMARK 350 BIOMOLECULE: 1 +REMARK 350 AUTHOR DETERMINED BIOLOGICAL UNIT: DIMERIC +REMARK 350 APPLY THE FOLLOWING TO CHAINS: A, B +REMARK 350 BIOMT1 1 1.000000 0.000000 0.000000 0.00000 +REMARK 350 BIOMT2 1 0.000000 1.000000 0.000000 0.00000 +REMARK 350 BIOMT3 1 0.000000 0.000000 1.000000 0.00000 +REMARK 350 +REMARK 350 BIOMOLECULE: 2 +REMARK 350 SOFTWARE DETERMINED QUATERNARY STRUCTURE: MONOMERIC +REMARK 350 SOFTWARE USED: PISA +REMARK 350 APPLY THE FOLLOWING TO CHAINS: A +REMARK 350 BIOMT1 1 1.000000 0.000000 0.000000 0.00000 +REMARK 350 BIOMT2 1 0.000000 1.000000 0.000000 0.00000 +REMARK 350 BIOMT3 1 0.000000 0.000000 1.000000 0.00000 +REMARK 350 +REMARK 350 BIOMOLECULE: 3 +REMARK 350 SOFTWARE DETERMINED QUATERNARY STRUCTURE: MONOMERIC +REMARK 350 SOFTWARE USED: PISA +REMARK 350 APPLY THE FOLLOWING TO CHAINS: B +REMARK 350 BIOMT1 1 1.000000 0.000000 0.000000 0.00000 +REMARK 350 BIOMT2 1 0.000000 1.000000 0.000000 0.00000 +REMARK 350 BIOMT3 1 0.000000 0.000000 1.000000 0.00000 +REMARK 465 +REMARK 465 MISSING RESIDUES +REMARK 465 THE FOLLOWING RESIDUES WERE NOT LOCATED IN THE +REMARK 465 EXPERIMENT. (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN +REMARK 465 IDENTIFIER; SSSEQ=SEQUENCE NUMBER; I=INSERTION CODE.) +REMARK 465 +REMARK 465 M RES C SSSEQI +REMARK 465 MSE A 1 +REMARK 465 PRO A 2 +REMARK 465 MSE B 1 +REMARK 465 PRO B 2 +REMARK 500 +REMARK 500 GEOMETRY AND STEREOCHEMISTRY +REMARK 500 SUBTOPIC: TORSION ANGLES +REMARK 500 +REMARK 500 TORSION ANGLES OUTSIDE THE EXPECTED RAMACHANDRAN REGIONS: +REMARK 500 (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN IDENTIFIER; +REMARK 500 SSEQ=SEQUENCE NUMBER; I=INSERTION CODE). +REMARK 500 +REMARK 500 STANDARD TABLE: +REMARK 500 FORMAT:(10X,I3,1X,A3,1X,A1,I4,A1,4X,F7.2,3X,F7.2) +REMARK 500 +REMARK 500 EXPECTED VALUES: GJ KLEYWEGT AND TA JONES (1996). PHI/PSI- +REMARK 500 CHOLOGY: RAMACHANDRAN REVISITED. STRUCTURE 4, 1395 - 1400 +REMARK 500 +REMARK 500 M RES CSSEQI PSI PHI +REMARK 500 PHE A 121 76.88 -102.11 +REMARK 500 CYS A 122 -73.41 -165.90 +REMARK 500 CYS B 122 -70.28 -161.68 +REMARK 500 +REMARK 500 REMARK: NULL +REMARK 800 +REMARK 800 SITE +REMARK 800 SITE_IDENTIFIER: AC1 +REMARK 800 EVIDENCE_CODE: SOFTWARE +REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE SO4 B 127 +REMARK 900 +REMARK 900 RELATED ENTRIES +REMARK 900 RELATED ID: STO001000493.1 RELATED DB: TARGETDB +DBREF 2RBG A 1 126 UNP Q975B5 Q975B5_SULTO 1 126 +DBREF 2RBG B 1 126 UNP Q975B5 Q975B5_SULTO 1 126 +SEQRES 1 A 126 MSE PRO TYR LYS ASN ILE LEU THR LEU ILE SER VAL ASN +SEQRES 2 A 126 ASN ASP ASN PHE GLU ASN TYR PHE ARG LYS ILE PHE LEU +SEQRES 3 A 126 ASP VAL ARG SER SER GLY SER LYS LYS THR THR ILE ASN +SEQRES 4 A 126 VAL PHE THR GLU ILE GLN TYR GLN GLU LEU VAL THR LEU +SEQRES 5 A 126 ILE ARG GLU ALA LEU LEU GLU ASN ILE ASP ILE GLY TYR +SEQRES 6 A 126 GLU LEU PHE LEU TRP LYS LYS ASN GLU VAL ASP ILE PHE +SEQRES 7 A 126 LEU LYS ASN LEU GLU LYS SER GLU VAL ASP GLY LEU LEU +SEQRES 8 A 126 VAL TYR CYS ASP ASP GLU ASN LYS VAL PHE MSE SER LYS +SEQRES 9 A 126 ILE VAL ASP ASN LEU PRO THR ALA ILE LYS ARG ASN LEU +SEQRES 10 A 126 ILE LYS ASP PHE CYS ARG LYS LEU SER +SEQRES 1 B 126 MSE PRO TYR LYS ASN ILE LEU THR LEU ILE SER VAL ASN +SEQRES 2 B 126 ASN ASP ASN PHE GLU ASN TYR PHE ARG LYS ILE PHE LEU +SEQRES 3 B 126 ASP VAL ARG SER SER GLY SER LYS LYS THR THR ILE ASN +SEQRES 4 B 126 VAL PHE THR GLU ILE GLN TYR GLN GLU LEU VAL THR LEU +SEQRES 5 B 126 ILE ARG GLU ALA LEU LEU GLU ASN ILE ASP ILE GLY TYR +SEQRES 6 B 126 GLU LEU PHE LEU TRP LYS LYS ASN GLU VAL ASP ILE PHE +SEQRES 7 B 126 LEU LYS ASN LEU GLU LYS SER GLU VAL ASP GLY LEU LEU +SEQRES 8 B 126 VAL TYR CYS ASP ASP GLU ASN LYS VAL PHE MSE SER LYS +SEQRES 9 B 126 ILE VAL ASP ASN LEU PRO THR ALA ILE LYS ARG ASN LEU +SEQRES 10 B 126 ILE LYS ASP PHE CYS ARG LYS LEU SER +MODRES 2RBG MSE A 102 MET SELENOMETHIONINE +MODRES 2RBG MSE B 102 MET SELENOMETHIONINE +HET MSE A 102 8 +HET MSE B 102 8 +HET SO4 B 127 5 +HETNAM MSE SELENOMETHIONINE +HETNAM SO4 SULFATE ION +FORMUL 1 MSE 2(C5 H11 N O2 SE) +FORMUL 3 SO4 O4 S 2- +FORMUL 4 HOH *316(H2 O) +HELIX 1 1 ASN A 13 ASP A 15 5 3 +HELIX 2 2 ASN A 16 GLY A 32 1 17 +HELIX 3 3 GLN A 45 ILE A 53 1 9 +HELIX 4 4 ILE A 53 ASN A 60 1 8 +HELIX 5 5 LYS A 71 ASN A 73 5 3 +HELIX 6 6 GLU A 74 GLU A 83 1 10 +HELIX 7 7 ASN A 98 ASN A 108 1 11 +HELIX 8 8 PRO A 110 ARG A 115 1 6 +HELIX 9 9 ASN B 13 ASP B 15 5 3 +HELIX 10 10 ASN B 16 GLY B 32 1 17 +HELIX 11 11 GLN B 45 ILE B 53 1 9 +HELIX 12 12 ILE B 53 GLU B 59 1 7 +HELIX 13 13 LYS B 71 ASN B 73 5 3 +HELIX 14 14 GLU B 74 LEU B 82 1 9 +HELIX 15 15 GLU B 83 SER B 85 5 3 +HELIX 16 16 ASN B 98 ASN B 108 1 11 +HELIX 17 17 PRO B 110 ASN B 116 1 7 +SHEET 1 A 5 GLY A 64 TRP A 70 0 +SHEET 2 A 5 LYS A 35 PHE A 41 1 N VAL A 40 O PHE A 68 +SHEET 3 A 5 ILE A 6 SER A 11 1 N THR A 8 O ASN A 39 +SHEET 4 A 5 GLY A 89 CYS A 94 1 O GLY A 89 N LEU A 7 +SHEET 5 A 5 LEU A 117 PHE A 121 1 O ILE A 118 N LEU A 90 +SHEET 1 B 5 GLY B 64 TRP B 70 0 +SHEET 2 B 5 LYS B 35 PHE B 41 1 N VAL B 40 O TRP B 70 +SHEET 3 B 5 ILE B 6 SER B 11 1 N THR B 8 O ASN B 39 +SHEET 4 B 5 GLY B 89 CYS B 94 1 O GLY B 89 N LEU B 7 +SHEET 5 B 5 LEU B 117 PHE B 121 1 O ILE B 118 N LEU B 90 +SSBOND 1 CYS A 94 CYS A 122 1555 1555 2.03 +SSBOND 2 CYS B 94 CYS B 122 1555 1555 2.03 +LINK C PHE A 101 N MSE A 102 1555 1555 1.33 +LINK C MSE A 102 N SER A 103 1555 1555 1.33 +LINK C PHE B 101 N MSE B 102 1555 1555 1.33 +LINK C MSE B 102 N SER B 103 1555 1555 1.33 +SITE 1 AC1 5 GLU B 18 ARG B 22 GLU B 55 HOH B 217 +SITE 2 AC1 5 HOH B 234 +CRYST1 39.444 65.184 49.604 90.00 98.19 90.00 P 1 21 1 4 +ORIGX1 1.000000 0.000000 0.000000 0.00000 +ORIGX2 0.000000 1.000000 0.000000 0.00000 +ORIGX3 0.000000 0.000000 1.000000 0.00000 +SCALE1 0.025352 0.000000 0.003650 0.00000 +SCALE2 0.000000 0.015341 0.000000 0.00000 +SCALE3 0.000000 0.000000 0.020368 0.00000 +ATOM 1 N TYR A 3 33.471 9.062 24.101 1.00 24.34 N +ATOM 2 CA TYR A 3 32.068 8.798 23.671 1.00 22.76 C +ATOM 3 C TYR A 3 31.421 10.059 23.108 1.00 22.12 C +ATOM 4 O TYR A 3 31.551 11.144 23.678 1.00 23.86 O +ATOM 5 CB TYR A 3 31.252 8.265 24.852 1.00 22.59 C +ATOM 6 CG TYR A 3 31.720 6.909 25.338 1.00 23.54 C +ATOM 7 CD1 TYR A 3 32.254 6.746 26.616 1.00 23.82 C +ATOM 8 CD2 TYR A 3 31.647 5.792 24.508 1.00 23.93 C +ATOM 9 CE1 TYR A 3 32.705 5.500 27.055 1.00 25.31 C +ATOM 10 CE2 TYR A 3 32.095 4.544 24.936 1.00 22.68 C +ATOM 11 CZ TYR A 3 32.622 4.405 26.208 1.00 25.21 C +ATOM 12 OH TYR A 3 33.070 3.171 26.625 1.00 27.53 O +ATOM 13 N LYS A 4 30.720 9.903 21.989 1.00 18.90 N +ATOM 14 CA LYS A 4 30.060 11.019 21.317 1.00 18.65 C +ATOM 15 C LYS A 4 28.537 10.918 21.313 1.00 15.20 C +ATOM 16 O LYS A 4 27.850 11.932 21.232 1.00 13.13 O +ATOM 17 CB LYS A 4 30.555 11.114 19.870 1.00 21.41 C +ATOM 18 CG LYS A 4 32.064 11.283 19.734 1.00 32.01 C +ATOM 19 CD LYS A 4 32.527 12.652 20.213 1.00 36.58 C +ATOM 20 CE LYS A 4 32.002 13.760 19.311 1.00 39.57 C +ATOM 21 NZ LYS A 4 32.463 15.105 19.752 1.00 43.99 N +ATOM 22 N ASN A 5 28.009 9.699 21.374 1.00 13.77 N +ATOM 23 CA ASN A 5 26.560 9.508 21.373 1.00 13.94 C +ATOM 24 C ASN A 5 26.217 8.213 22.092 1.00 14.07 C +ATOM 25 O ASN A 5 26.368 7.121 21.548 1.00 13.93 O +ATOM 26 CB ASN A 5 26.022 9.489 19.936 1.00 15.07 C +ATOM 27 CG ASN A 5 24.503 9.457 19.879 1.00 19.05 C +ATOM 28 OD1 ASN A 5 23.826 10.028 20.734 1.00 18.93 O +ATOM 29 ND2 ASN A 5 23.960 8.805 18.857 1.00 23.13 N +ATOM 30 N ILE A 6 25.749 8.359 23.324 1.00 12.56 N +ATOM 31 CA ILE A 6 25.398 7.232 24.174 1.00 10.81 C +ATOM 32 C ILE A 6 24.026 6.636 23.871 1.00 9.05 C +ATOM 33 O ILE A 6 23.032 7.360 23.784 1.00 10.03 O +ATOM 34 CB ILE A 6 25.409 7.661 25.661 1.00 10.42 C +ATOM 35 CG1 ILE A 6 26.761 8.291 26.015 1.00 14.05 C +ATOM 36 CG2 ILE A 6 25.114 6.465 26.555 1.00 10.54 C +ATOM 37 CD1 ILE A 6 27.942 7.352 25.864 1.00 13.83 C +ATOM 38 N LEU A 7 23.978 5.317 23.695 1.00 7.97 N +ATOM 39 CA LEU A 7 22.708 4.638 23.468 1.00 7.84 C +ATOM 40 C LEU A 7 22.167 4.341 24.862 1.00 6.49 C +ATOM 41 O LEU A 7 22.786 3.598 25.623 1.00 7.93 O +ATOM 42 CB LEU A 7 22.901 3.315 22.724 1.00 7.80 C +ATOM 43 CG LEU A 7 21.627 2.465 22.610 1.00 8.47 C +ATOM 44 CD1 LEU A 7 20.587 3.198 21.769 1.00 8.00 C +ATOM 45 CD2 LEU A 7 21.961 1.115 21.988 1.00 10.59 C +ATOM 46 N THR A 8 21.029 4.936 25.201 1.00 5.70 N +ATOM 47 CA THR A 8 20.419 4.719 26.508 1.00 6.42 C +ATOM 48 C THR A 8 19.137 3.917 26.352 1.00 6.87 C +ATOM 49 O THR A 8 18.243 4.298 25.595 1.00 7.76 O +ATOM 50 CB THR A 8 20.101 6.061 27.208 1.00 6.58 C +ATOM 51 OG1 THR A 8 21.328 6.729 27.538 1.00 7.53 O +ATOM 52 CG2 THR A 8 19.310 5.826 28.490 1.00 7.99 C +ATOM 53 N LEU A 9 19.067 2.792 27.057 1.00 7.67 N +ATOM 54 CA LEU A 9 17.898 1.930 27.012 1.00 8.24 C +ATOM 55 C LEU A 9 17.289 1.878 28.404 1.00 8.48 C +ATOM 56 O LEU A 9 18.000 1.681 29.391 1.00 7.88 O +ATOM 57 CB LEU A 9 18.293 0.514 26.583 1.00 9.90 C +ATOM 58 CG LEU A 9 19.140 0.391 25.315 1.00 11.56 C +ATOM 59 CD1 LEU A 9 19.413 -1.082 25.031 1.00 10.95 C +ATOM 60 CD2 LEU A 9 18.418 1.039 24.145 1.00 10.46 C +ATOM 61 N ILE A 10 15.976 2.056 28.484 1.00 7.53 N +ATOM 62 CA ILE A 10 15.301 2.010 29.771 1.00 7.34 C +ATOM 63 C ILE A 10 13.911 1.408 29.690 1.00 8.82 C +ATOM 64 O ILE A 10 13.146 1.683 28.767 1.00 10.17 O +ATOM 65 CB ILE A 10 15.190 3.420 30.412 1.00 8.96 C +ATOM 66 CG1 ILE A 10 14.388 3.338 31.717 1.00 7.62 C +ATOM 67 CG2 ILE A 10 14.524 4.392 29.433 1.00 9.63 C +ATOM 68 CD1 ILE A 10 14.445 4.613 32.566 1.00 11.33 C +ATOM 69 N SER A 11 13.605 0.560 30.664 1.00 8.33 N +ATOM 70 CA SER A 11 12.297 -0.060 30.761 1.00 10.47 C +ATOM 71 C SER A 11 11.962 -0.145 32.245 1.00 9.11 C +ATOM 72 O SER A 11 12.520 -0.964 32.972 1.00 11.58 O +ATOM 73 CB SER A 11 12.300 -1.457 30.143 1.00 13.19 C +ATOM 74 OG SER A 11 10.990 -1.998 30.156 1.00 19.72 O +ATOM 75 N VAL A 12 11.067 0.730 32.687 1.00 11.21 N +ATOM 76 CA VAL A 12 10.643 0.770 34.081 1.00 11.41 C +ATOM 77 C VAL A 12 9.161 1.098 34.156 1.00 15.63 C +ATOM 78 O VAL A 12 8.563 1.528 33.170 1.00 16.75 O +ATOM 79 CB VAL A 12 11.402 1.858 34.886 1.00 11.30 C +ATOM 80 CG1 VAL A 12 12.884 1.530 34.945 1.00 8.11 C +ATOM 81 CG2 VAL A 12 11.178 3.230 34.255 1.00 12.03 C +ATOM 82 N ASN A 13 8.575 0.887 35.330 1.00 17.25 N +ATOM 83 CA ASN A 13 7.170 1.200 35.547 1.00 20.47 C +ATOM 84 C ASN A 13 7.075 2.724 35.563 1.00 19.38 C +ATOM 85 O ASN A 13 8.061 3.404 35.845 1.00 18.17 O +ATOM 86 CB ASN A 13 6.700 0.622 36.885 1.00 23.13 C +ATOM 87 CG ASN A 13 6.713 -0.895 36.900 1.00 31.36 C +ATOM 88 OD1 ASN A 13 6.035 -1.541 36.099 1.00 36.96 O +ATOM 89 ND2 ASN A 13 7.484 -1.472 37.817 1.00 34.18 N +ATOM 90 N ASN A 14 5.896 3.259 35.266 1.00 18.03 N +ATOM 91 CA ASN A 14 5.707 4.707 35.224 1.00 19.51 C +ATOM 92 C ASN A 14 6.148 5.468 36.472 1.00 20.09 C +ATOM 93 O ASN A 14 6.659 6.582 36.372 1.00 20.91 O +ATOM 94 CB ASN A 14 4.242 5.048 34.941 1.00 20.73 C +ATOM 95 CG ASN A 14 3.742 4.437 33.653 1.00 23.53 C +ATOM 96 OD1 ASN A 14 4.496 4.276 32.696 1.00 22.26 O +ATOM 97 ND2 ASN A 14 2.456 4.108 33.615 1.00 26.38 N +ATOM 98 N ASP A 15 5.954 4.876 37.645 1.00 20.00 N +ATOM 99 CA ASP A 15 6.319 5.543 38.890 1.00 23.11 C +ATOM 100 C ASP A 15 7.828 5.697 39.071 1.00 20.27 C +ATOM 101 O ASP A 15 8.275 6.420 39.958 1.00 21.58 O +ATOM 102 CB ASP A 15 5.736 4.783 40.086 1.00 23.65 C +ATOM 103 CG ASP A 15 6.495 3.509 40.394 1.00 33.42 C +ATOM 104 OD1 ASP A 15 6.862 2.787 39.443 1.00 37.24 O +ATOM 105 OD2 ASP A 15 6.719 3.222 41.591 1.00 40.07 O +ATOM 106 N ASN A 16 8.607 5.025 38.228 1.00 17.28 N +ATOM 107 CA ASN A 16 10.063 5.089 38.322 1.00 16.22 C +ATOM 108 C ASN A 16 10.757 6.035 37.343 1.00 17.13 C +ATOM 109 O ASN A 16 11.960 6.258 37.458 1.00 15.71 O +ATOM 110 CB ASN A 16 10.670 3.691 38.150 1.00 18.31 C +ATOM 111 CG ASN A 16 10.692 2.896 39.440 1.00 21.25 C +ATOM 112 OD1 ASN A 16 11.056 3.416 40.495 1.00 23.56 O +ATOM 113 ND2 ASN A 16 10.323 1.623 39.357 1.00 19.07 N +ATOM 114 N PHE A 17 10.020 6.598 36.392 1.00 14.63 N +ATOM 115 CA PHE A 17 10.641 7.486 35.409 1.00 14.77 C +ATOM 116 C PHE A 17 11.409 8.670 35.984 1.00 14.87 C +ATOM 117 O PHE A 17 12.552 8.913 35.604 1.00 9.25 O +ATOM 118 CB PHE A 17 9.602 7.998 34.404 1.00 12.16 C +ATOM 119 CG PHE A 17 9.216 6.987 33.365 1.00 11.38 C +ATOM 120 CD1 PHE A 17 10.192 6.337 32.614 1.00 13.83 C +ATOM 121 CD2 PHE A 17 7.878 6.680 33.135 1.00 14.52 C +ATOM 122 CE1 PHE A 17 9.842 5.393 31.649 1.00 14.54 C +ATOM 123 CE2 PHE A 17 7.518 5.740 32.174 1.00 14.67 C +ATOM 124 CZ PHE A 17 8.500 5.095 31.429 1.00 14.46 C +ATOM 125 N GLU A 18 10.792 9.411 36.897 1.00 16.23 N +ATOM 126 CA GLU A 18 11.464 10.565 37.475 1.00 16.73 C +ATOM 127 C GLU A 18 12.805 10.207 38.106 1.00 16.00 C +ATOM 128 O GLU A 18 13.818 10.842 37.814 1.00 16.65 O +ATOM 129 CB GLU A 18 10.557 11.247 38.505 1.00 23.36 C +ATOM 130 CG GLU A 18 9.338 11.909 37.879 1.00 30.35 C +ATOM 131 CD GLU A 18 8.469 12.633 38.889 1.00 37.35 C +ATOM 132 OE1 GLU A 18 8.971 13.562 39.558 1.00 37.02 O +ATOM 133 OE2 GLU A 18 7.280 12.273 39.010 1.00 40.39 O +ATOM 134 N ASN A 19 12.816 9.184 38.954 1.00 16.87 N +ATOM 135 CA ASN A 19 14.049 8.770 39.618 1.00 15.97 C +ATOM 136 C ASN A 19 15.094 8.227 38.649 1.00 15.31 C +ATOM 137 O ASN A 19 16.278 8.557 38.756 1.00 13.61 O +ATOM 138 CB ASN A 19 13.761 7.713 40.690 1.00 19.94 C +ATOM 139 CG ASN A 19 12.921 8.251 41.831 1.00 26.59 C +ATOM 140 OD1 ASN A 19 13.143 9.361 42.313 1.00 28.74 O +ATOM 141 ND2 ASN A 19 11.958 7.454 42.283 1.00 31.96 N +ATOM 142 N TYR A 20 14.667 7.395 37.705 1.00 9.62 N +ATOM 143 CA TYR A 20 15.612 6.830 36.750 1.00 8.42 C +ATOM 144 C TYR A 20 16.193 7.835 35.765 1.00 10.15 C +ATOM 145 O TYR A 20 17.354 7.718 35.390 1.00 8.97 O +ATOM 146 CB TYR A 20 14.988 5.667 35.975 1.00 8.90 C +ATOM 147 CG TYR A 20 15.099 4.331 36.683 1.00 11.47 C +ATOM 148 CD1 TYR A 20 14.377 4.074 37.848 1.00 11.36 C +ATOM 149 CD2 TYR A 20 15.916 3.319 36.178 1.00 9.86 C +ATOM 150 CE1 TYR A 20 14.461 2.838 38.488 1.00 10.09 C +ATOM 151 CE2 TYR A 20 16.008 2.080 36.808 1.00 11.95 C +ATOM 152 CZ TYR A 20 15.272 1.847 37.965 1.00 10.22 C +ATOM 153 OH TYR A 20 15.329 0.615 38.579 1.00 12.19 O +ATOM 154 N PHE A 21 15.407 8.817 35.331 1.00 10.83 N +ATOM 155 CA PHE A 21 15.961 9.786 34.396 1.00 10.37 C +ATOM 156 C PHE A 21 17.015 10.652 35.066 1.00 9.86 C +ATOM 157 O PHE A 21 17.893 11.207 34.403 1.00 10.68 O +ATOM 158 CB PHE A 21 14.863 10.640 33.760 1.00 10.02 C +ATOM 159 CG PHE A 21 14.380 10.090 32.448 1.00 9.94 C +ATOM 160 CD1 PHE A 21 13.536 8.984 32.413 1.00 10.87 C +ATOM 161 CD2 PHE A 21 14.844 10.618 31.247 1.00 11.58 C +ATOM 162 CE1 PHE A 21 13.166 8.405 31.199 1.00 10.52 C +ATOM 163 CE2 PHE A 21 14.479 10.046 30.021 1.00 12.43 C +ATOM 164 CZ PHE A 21 13.640 8.937 29.999 1.00 11.64 C +ATOM 165 N ARG A 22 16.937 10.756 36.386 1.00 10.63 N +ATOM 166 CA ARG A 22 17.930 11.519 37.121 1.00 12.46 C +ATOM 167 C ARG A 22 19.243 10.741 36.990 1.00 12.16 C +ATOM 168 O ARG A 22 20.314 11.326 36.831 1.00 12.50 O +ATOM 169 CB ARG A 22 17.521 11.653 38.592 1.00 12.81 C +ATOM 170 CG ARG A 22 18.512 12.441 39.436 1.00 17.97 C +ATOM 171 CD ARG A 22 18.033 12.635 40.873 1.00 15.56 C +ATOM 172 NE ARG A 22 16.944 13.605 40.993 1.00 15.48 N +ATOM 173 CZ ARG A 22 16.484 14.056 42.158 1.00 17.00 C +ATOM 174 NH1 ARG A 22 17.020 13.622 43.293 1.00 13.10 N +ATOM 175 NH2 ARG A 22 15.495 14.941 42.195 1.00 16.86 N +ATOM 176 N LYS A 23 19.150 9.414 37.040 1.00 9.11 N +ATOM 177 CA LYS A 23 20.330 8.562 36.910 1.00 8.13 C +ATOM 178 C LYS A 23 20.899 8.647 35.497 1.00 8.65 C +ATOM 179 O LYS A 23 22.109 8.744 35.305 1.00 11.79 O +ATOM 180 CB LYS A 23 19.983 7.099 37.206 1.00 10.36 C +ATOM 181 CG LYS A 23 19.601 6.794 38.646 1.00 10.87 C +ATOM 182 CD LYS A 23 19.398 5.289 38.832 1.00 14.62 C +ATOM 183 CE LYS A 23 19.222 4.926 40.294 1.00 23.04 C +ATOM 184 NZ LYS A 23 20.438 5.264 41.088 1.00 16.09 N +ATOM 185 N ILE A 24 20.015 8.600 34.505 1.00 7.43 N +ATOM 186 CA ILE A 24 20.443 8.660 33.116 1.00 6.12 C +ATOM 187 C ILE A 24 21.374 9.834 32.842 1.00 8.47 C +ATOM 188 O ILE A 24 22.446 9.661 32.271 1.00 9.39 O +ATOM 189 CB ILE A 24 19.226 8.750 32.168 1.00 6.49 C +ATOM 190 CG1 ILE A 24 18.475 7.414 32.183 1.00 5.04 C +ATOM 191 CG2 ILE A 24 19.684 9.104 30.748 1.00 7.14 C +ATOM 192 CD1 ILE A 24 17.160 7.432 31.432 1.00 5.89 C +ATOM 193 N PHE A 25 20.976 11.031 33.254 1.00 8.27 N +ATOM 194 CA PHE A 25 21.814 12.192 32.991 1.00 10.11 C +ATOM 195 C PHE A 25 23.098 12.230 33.813 1.00 8.55 C +ATOM 196 O PHE A 25 24.106 12.772 33.361 1.00 9.67 O +ATOM 197 CB PHE A 25 20.985 13.470 33.142 1.00 9.31 C +ATOM 198 CG PHE A 25 20.000 13.667 32.016 1.00 11.97 C +ATOM 199 CD1 PHE A 25 20.452 13.926 30.721 1.00 13.37 C +ATOM 200 CD2 PHE A 25 18.635 13.523 32.230 1.00 12.47 C +ATOM 201 CE1 PHE A 25 19.556 14.034 29.657 1.00 12.22 C +ATOM 202 CE2 PHE A 25 17.728 13.627 31.173 1.00 15.03 C +ATOM 203 CZ PHE A 25 18.193 13.883 29.883 1.00 13.24 C +ATOM 204 N LEU A 26 23.077 11.647 35.008 1.00 8.53 N +ATOM 205 CA LEU A 26 24.284 11.592 35.825 1.00 10.27 C +ATOM 206 C LEU A 26 25.305 10.752 35.054 1.00 7.43 C +ATOM 207 O LEU A 26 26.474 11.116 34.935 1.00 8.43 O +ATOM 208 CB LEU A 26 24.005 10.915 37.172 1.00 12.37 C +ATOM 209 CG LEU A 26 23.874 11.773 38.432 1.00 23.05 C +ATOM 210 CD1 LEU A 26 22.666 12.653 38.319 1.00 28.50 C +ATOM 211 CD2 LEU A 26 23.748 10.880 39.654 1.00 23.45 C +ATOM 212 N ASP A 27 24.847 9.626 34.519 1.00 8.78 N +ATOM 213 CA ASP A 27 25.724 8.732 33.779 1.00 6.87 C +ATOM 214 C ASP A 27 26.167 9.306 32.439 1.00 7.47 C +ATOM 215 O ASP A 27 27.331 9.171 32.059 1.00 8.28 O +ATOM 216 CB ASP A 27 25.053 7.370 33.581 1.00 10.81 C +ATOM 217 CG ASP A 27 24.911 6.601 34.882 1.00 11.54 C +ATOM 218 OD1 ASP A 27 25.857 6.645 35.699 1.00 9.76 O +ATOM 219 OD2 ASP A 27 23.868 5.947 35.086 1.00 10.25 O +ATOM 220 N VAL A 28 25.251 9.952 31.723 1.00 6.57 N +ATOM 221 CA VAL A 28 25.619 10.536 30.437 1.00 8.12 C +ATOM 222 C VAL A 28 26.681 11.616 30.644 1.00 10.25 C +ATOM 223 O VAL A 28 27.683 11.663 29.928 1.00 9.64 O +ATOM 224 CB VAL A 28 24.399 11.150 29.718 1.00 8.01 C +ATOM 225 CG1 VAL A 28 24.862 11.969 28.515 1.00 9.50 C +ATOM 226 CG2 VAL A 28 23.457 10.034 29.253 1.00 8.04 C +ATOM 227 N ARG A 29 26.475 12.475 31.636 1.00 10.05 N +ATOM 228 CA ARG A 29 27.444 13.536 31.898 1.00 11.15 C +ATOM 229 C ARG A 29 28.827 12.967 32.214 1.00 11.79 C +ATOM 230 O ARG A 29 29.835 13.455 31.704 1.00 12.01 O +ATOM 231 CB ARG A 29 26.970 14.422 33.053 1.00 9.99 C +ATOM 232 CG ARG A 29 25.831 15.367 32.695 1.00 10.18 C +ATOM 233 CD ARG A 29 25.445 16.189 33.912 1.00 10.25 C +ATOM 234 NE ARG A 29 24.425 17.192 33.628 1.00 14.64 N +ATOM 235 CZ ARG A 29 24.640 18.502 33.651 1.00 20.85 C +ATOM 236 NH1 ARG A 29 25.844 18.976 33.943 1.00 20.73 N +ATOM 237 NH2 ARG A 29 23.645 19.341 33.398 1.00 23.29 N +ATOM 238 N SER A 30 28.875 11.926 33.040 1.00 10.27 N +ATOM 239 CA SER A 30 30.149 11.310 33.406 1.00 10.98 C +ATOM 240 C SER A 30 30.842 10.609 32.239 1.00 13.07 C +ATOM 241 O SER A 30 32.064 10.454 32.245 1.00 12.79 O +ATOM 242 CB SER A 30 29.953 10.298 34.543 1.00 8.79 C +ATOM 243 OG SER A 30 29.665 10.953 35.765 1.00 12.96 O +ATOM 244 N SER A 31 30.067 10.189 31.243 1.00 12.07 N +ATOM 245 CA SER A 31 30.625 9.488 30.087 1.00 12.63 C +ATOM 246 C SER A 31 31.478 10.385 29.197 1.00 14.41 C +ATOM 247 O SER A 31 32.286 9.894 28.411 1.00 16.95 O +ATOM 248 CB SER A 31 29.507 8.879 29.237 1.00 15.15 C +ATOM 249 OG SER A 31 28.857 9.877 28.469 1.00 12.95 O +ATOM 250 N GLY A 32 31.289 11.694 29.312 1.00 16.32 N +ATOM 251 CA GLY A 32 32.051 12.623 28.496 1.00 17.33 C +ATOM 252 C GLY A 32 31.281 13.013 27.251 1.00 17.70 C +ATOM 253 O GLY A 32 31.649 13.951 26.540 1.00 16.74 O +ATOM 254 N SER A 33 30.205 12.284 26.981 1.00 14.11 N +ATOM 255 CA SER A 33 29.375 12.562 25.818 1.00 12.55 C +ATOM 256 C SER A 33 28.436 13.717 26.128 1.00 16.51 C +ATOM 257 O SER A 33 28.044 13.919 27.281 1.00 17.01 O +ATOM 258 CB SER A 33 28.557 11.324 25.442 1.00 12.31 C +ATOM 259 OG SER A 33 27.756 11.569 24.299 1.00 11.59 O +ATOM 260 N LYS A 34 28.081 14.476 25.099 1.00 15.42 N +ATOM 261 CA LYS A 34 27.176 15.601 25.267 1.00 17.53 C +ATOM 262 C LYS A 34 25.871 15.259 24.559 1.00 17.01 C +ATOM 263 O LYS A 34 24.970 16.090 24.465 1.00 17.51 O +ATOM 264 CB LYS A 34 27.785 16.869 24.656 1.00 21.02 C +ATOM 265 CG LYS A 34 29.250 17.100 25.025 1.00 25.18 C +ATOM 266 CD LYS A 34 29.463 17.088 26.533 1.00 29.46 C +ATOM 267 CE LYS A 34 30.942 17.190 26.884 1.00 31.20 C +ATOM 268 NZ LYS A 34 31.184 17.073 28.353 1.00 29.05 N +ATOM 269 N LYS A 35 25.781 14.020 24.078 1.00 16.37 N +ATOM 270 CA LYS A 35 24.604 13.544 23.358 1.00 13.55 C +ATOM 271 C LYS A 35 24.222 12.119 23.748 1.00 10.82 C +ATOM 272 O LYS A 35 25.074 11.303 24.092 1.00 12.00 O +ATOM 273 CB LYS A 35 24.861 13.551 21.851 1.00 14.65 C +ATOM 274 CG LYS A 35 25.180 14.899 21.239 1.00 23.77 C +ATOM 275 CD LYS A 35 25.571 14.724 19.774 1.00 29.96 C +ATOM 276 CE LYS A 35 25.766 16.063 19.075 1.00 34.03 C +ATOM 277 NZ LYS A 35 24.495 16.835 18.986 1.00 39.83 N +ATOM 278 N THR A 36 22.932 11.825 23.676 1.00 11.15 N +ATOM 279 CA THR A 36 22.449 10.487 23.972 1.00 9.64 C +ATOM 280 C THR A 36 21.129 10.278 23.253 1.00 8.90 C +ATOM 281 O THR A 36 20.336 11.211 23.103 1.00 11.37 O +ATOM 282 CB THR A 36 22.235 10.255 25.494 1.00 9.30 C +ATOM 283 OG1 THR A 36 21.808 8.903 25.714 1.00 11.46 O +ATOM 284 CG2 THR A 36 21.178 11.205 26.049 1.00 10.57 C +ATOM 285 N THR A 37 20.918 9.064 22.766 1.00 8.09 N +ATOM 286 CA THR A 37 19.669 8.733 22.098 1.00 8.90 C +ATOM 287 C THR A 37 18.999 7.773 23.072 1.00 9.34 C +ATOM 288 O THR A 37 19.467 6.652 23.292 1.00 10.35 O +ATOM 289 CB THR A 37 19.916 8.084 20.710 1.00 16.76 C +ATOM 290 OG1 THR A 37 18.661 7.702 20.136 1.00 18.76 O +ATOM 291 CG2 THR A 37 20.828 6.875 20.819 1.00 17.18 C +ATOM 292 N ILE A 38 17.924 8.254 23.685 1.00 8.42 N +ATOM 293 CA ILE A 38 17.186 7.508 24.697 1.00 9.46 C +ATOM 294 C ILE A 38 16.015 6.715 24.137 1.00 10.38 C +ATOM 295 O ILE A 38 15.143 7.264 23.462 1.00 11.66 O +ATOM 296 CB ILE A 38 16.668 8.472 25.778 1.00 9.91 C +ATOM 297 CG1 ILE A 38 17.829 9.320 26.300 1.00 12.94 C +ATOM 298 CG2 ILE A 38 16.015 7.697 26.913 1.00 9.08 C +ATOM 299 CD1 ILE A 38 17.408 10.432 27.235 1.00 11.43 C +ATOM 300 N ASN A 39 15.999 5.422 24.441 1.00 6.80 N +ATOM 301 CA ASN A 39 14.946 4.527 23.976 1.00 8.56 C +ATOM 302 C ASN A 39 14.206 3.962 25.172 1.00 8.17 C +ATOM 303 O ASN A 39 14.772 3.221 25.977 1.00 12.28 O +ATOM 304 CB ASN A 39 15.563 3.409 23.141 1.00 6.67 C +ATOM 305 CG ASN A 39 16.136 3.923 21.841 1.00 11.85 C +ATOM 306 OD1 ASN A 39 15.430 4.038 20.838 1.00 10.25 O +ATOM 307 ND2 ASN A 39 17.416 4.264 21.856 1.00 11.82 N +ATOM 308 N VAL A 40 12.932 4.318 25.272 1.00 9.81 N +ATOM 309 CA VAL A 40 12.091 3.905 26.380 1.00 10.60 C +ATOM 310 C VAL A 40 11.061 2.874 25.947 1.00 11.33 C +ATOM 311 O VAL A 40 10.274 3.117 25.035 1.00 13.32 O +ATOM 312 CB VAL A 40 11.351 5.120 26.969 1.00 10.53 C +ATOM 313 CG1 VAL A 40 10.654 4.734 28.265 1.00 9.46 C +ATOM 314 CG2 VAL A 40 12.328 6.266 27.186 1.00 10.11 C +ATOM 315 N PHE A 41 11.073 1.724 26.609 1.00 10.47 N +ATOM 316 CA PHE A 41 10.134 0.655 26.303 1.00 10.56 C +ATOM 317 C PHE A 41 9.024 0.767 27.336 1.00 14.51 C +ATOM 318 O PHE A 41 9.169 0.343 28.482 1.00 12.82 O +ATOM 319 CB PHE A 41 10.880 -0.674 26.364 1.00 11.18 C +ATOM 320 CG PHE A 41 12.024 -0.741 25.393 1.00 13.39 C +ATOM 321 CD1 PHE A 41 11.798 -1.046 24.052 1.00 11.41 C +ATOM 322 CD2 PHE A 41 13.314 -0.401 25.795 1.00 13.82 C +ATOM 323 CE1 PHE A 41 12.837 -1.005 23.125 1.00 12.58 C +ATOM 324 CE2 PHE A 41 14.361 -0.357 24.875 1.00 16.09 C +ATOM 325 CZ PHE A 41 14.120 -0.659 23.535 1.00 13.07 C +ATOM 326 N THR A 42 7.918 1.371 26.909 1.00 15.02 N +ATOM 327 CA THR A 42 6.788 1.623 27.790 1.00 14.54 C +ATOM 328 C THR A 42 5.495 1.721 26.988 1.00 15.87 C +ATOM 329 O THR A 42 5.521 1.803 25.764 1.00 14.97 O +ATOM 330 CB THR A 42 7.011 2.962 28.532 1.00 16.35 C +ATOM 331 OG1 THR A 42 5.902 3.242 29.391 1.00 16.32 O +ATOM 332 CG2 THR A 42 7.166 4.098 27.525 1.00 15.89 C +ATOM 333 N GLU A 43 4.366 1.718 27.689 1.00 18.33 N +ATOM 334 CA GLU A 43 3.063 1.834 27.041 1.00 22.06 C +ATOM 335 C GLU A 43 2.551 3.265 27.188 1.00 23.02 C +ATOM 336 O GLU A 43 1.500 3.621 26.656 1.00 22.29 O +ATOM 337 CB GLU A 43 2.065 0.859 27.673 1.00 21.32 C +ATOM 338 CG GLU A 43 2.461 -0.607 27.557 1.00 26.43 C +ATOM 339 CD GLU A 43 2.665 -1.048 26.118 1.00 31.13 C +ATOM 340 OE1 GLU A 43 1.763 -0.802 25.290 1.00 33.47 O +ATOM 341 OE2 GLU A 43 3.724 -1.642 25.815 1.00 32.35 O +ATOM 342 N ILE A 44 3.311 4.083 27.910 1.00 23.91 N +ATOM 343 CA ILE A 44 2.948 5.476 28.149 1.00 26.52 C +ATOM 344 C ILE A 44 3.168 6.328 26.894 1.00 27.74 C +ATOM 345 O ILE A 44 3.974 5.976 26.033 1.00 24.73 O +ATOM 346 CB ILE A 44 3.783 6.040 29.326 1.00 28.12 C +ATOM 347 CG1 ILE A 44 2.971 7.072 30.104 1.00 28.57 C +ATOM 348 CG2 ILE A 44 5.080 6.650 28.810 1.00 24.21 C +ATOM 349 CD1 ILE A 44 3.649 7.523 31.384 1.00 31.00 C +ATOM 350 N GLN A 45 2.447 7.444 26.787 1.00 29.19 N +ATOM 351 CA GLN A 45 2.580 8.334 25.633 1.00 30.61 C +ATOM 352 C GLN A 45 3.693 9.358 25.823 1.00 28.49 C +ATOM 353 O GLN A 45 4.030 9.722 26.950 1.00 29.37 O +ATOM 354 CB GLN A 45 1.258 9.058 25.363 1.00 36.95 C +ATOM 355 CG GLN A 45 0.165 8.172 24.788 1.00 48.09 C +ATOM 356 CD GLN A 45 0.496 7.672 23.394 1.00 54.95 C +ATOM 357 OE1 GLN A 45 0.715 8.463 22.477 1.00 59.19 O +ATOM 358 NE2 GLN A 45 0.531 6.354 23.229 1.00 59.21 N +ATOM 359 N TYR A 46 4.248 9.823 24.708 1.00 24.28 N +ATOM 360 CA TYR A 46 5.337 10.793 24.713 1.00 24.71 C +ATOM 361 C TYR A 46 5.090 11.982 25.639 1.00 25.54 C +ATOM 362 O TYR A 46 5.881 12.250 26.541 1.00 22.81 O +ATOM 363 CB TYR A 46 5.583 11.314 23.296 1.00 23.11 C +ATOM 364 CG TYR A 46 6.881 12.075 23.142 1.00 27.98 C +ATOM 365 CD1 TYR A 46 8.087 11.399 22.962 1.00 31.13 C +ATOM 366 CD2 TYR A 46 6.910 13.468 23.200 1.00 28.93 C +ATOM 367 CE1 TYR A 46 9.291 12.088 22.845 1.00 32.93 C +ATOM 368 CE2 TYR A 46 8.113 14.169 23.086 1.00 32.03 C +ATOM 369 CZ TYR A 46 9.298 13.470 22.909 1.00 32.08 C +ATOM 370 OH TYR A 46 10.492 14.148 22.803 1.00 33.47 O +ATOM 371 N GLN A 47 3.994 12.697 25.406 1.00 24.63 N +ATOM 372 CA GLN A 47 3.667 13.870 26.208 1.00 25.17 C +ATOM 373 C GLN A 47 3.568 13.610 27.706 1.00 23.21 C +ATOM 374 O GLN A 47 3.976 14.450 28.507 1.00 24.07 O +ATOM 375 CB GLN A 47 2.370 14.508 25.706 1.00 28.35 C +ATOM 376 CG GLN A 47 2.495 15.121 24.321 1.00 36.99 C +ATOM 377 CD GLN A 47 3.718 16.012 24.190 1.00 43.34 C +ATOM 378 OE1 GLN A 47 3.944 16.904 25.011 1.00 46.34 O +ATOM 379 NE2 GLN A 47 4.514 15.776 23.152 1.00 45.64 N +ATOM 380 N GLU A 48 3.025 12.459 28.091 1.00 23.97 N +ATOM 381 CA GLU A 48 2.911 12.138 29.507 1.00 22.97 C +ATOM 382 C GLU A 48 4.296 11.901 30.099 1.00 22.51 C +ATOM 383 O GLU A 48 4.583 12.325 31.217 1.00 17.54 O +ATOM 384 CB GLU A 48 2.029 10.903 29.720 1.00 27.75 C +ATOM 385 CG GLU A 48 2.033 10.402 31.160 1.00 35.85 C +ATOM 386 CD GLU A 48 0.862 9.493 31.483 1.00 42.98 C +ATOM 387 OE1 GLU A 48 0.527 8.621 30.652 1.00 46.34 O +ATOM 388 OE2 GLU A 48 0.281 9.645 32.578 1.00 44.85 O +ATOM 389 N LEU A 49 5.157 11.228 29.342 1.00 18.62 N +ATOM 390 CA LEU A 49 6.510 10.961 29.811 1.00 18.78 C +ATOM 391 C LEU A 49 7.267 12.268 30.002 1.00 17.00 C +ATOM 392 O LEU A 49 7.848 12.511 31.058 1.00 16.05 O +ATOM 393 CB LEU A 49 7.269 10.084 28.811 1.00 16.29 C +ATOM 394 CG LEU A 49 8.755 9.895 29.139 1.00 16.44 C +ATOM 395 CD1 LEU A 49 8.901 9.183 30.479 1.00 17.18 C +ATOM 396 CD2 LEU A 49 9.432 9.102 28.033 1.00 19.52 C +ATOM 397 N VAL A 50 7.262 13.102 28.967 1.00 16.87 N +ATOM 398 CA VAL A 50 7.953 14.385 29.010 1.00 15.59 C +ATOM 399 C VAL A 50 7.490 15.214 30.201 1.00 17.36 C +ATOM 400 O VAL A 50 8.260 15.984 30.771 1.00 15.94 O +ATOM 401 CB VAL A 50 7.715 15.185 27.712 1.00 20.49 C +ATOM 402 CG1 VAL A 50 8.450 16.511 27.775 1.00 22.89 C +ATOM 403 CG2 VAL A 50 8.186 14.373 26.511 1.00 20.90 C +ATOM 404 N THR A 51 6.222 15.061 30.568 1.00 16.58 N +ATOM 405 CA THR A 51 5.677 15.789 31.705 1.00 13.61 C +ATOM 406 C THR A 51 6.308 15.251 32.989 1.00 13.20 C +ATOM 407 O THR A 51 6.723 16.020 33.856 1.00 14.98 O +ATOM 408 CB THR A 51 4.147 15.633 31.774 1.00 16.56 C +ATOM 409 OG1 THR A 51 3.559 16.293 30.645 1.00 19.12 O +ATOM 410 CG2 THR A 51 3.597 16.237 33.060 1.00 17.52 C +ATOM 411 N LEU A 52 6.396 13.929 33.099 1.00 13.91 N +ATOM 412 CA LEU A 52 6.985 13.303 34.279 1.00 13.78 C +ATOM 413 C LEU A 52 8.467 13.623 34.464 1.00 16.52 C +ATOM 414 O LEU A 52 8.925 13.837 35.587 1.00 20.03 O +ATOM 415 CB LEU A 52 6.814 11.781 34.219 1.00 15.00 C +ATOM 416 CG LEU A 52 5.407 11.210 34.404 1.00 18.12 C +ATOM 417 CD1 LEU A 52 5.443 9.698 34.229 1.00 19.35 C +ATOM 418 CD2 LEU A 52 4.885 11.576 35.785 1.00 20.14 C +ATOM 419 N ILE A 53 9.220 13.657 33.371 1.00 13.70 N +ATOM 420 CA ILE A 53 10.653 13.921 33.466 1.00 15.34 C +ATOM 421 C ILE A 53 11.051 15.357 33.146 1.00 16.08 C +ATOM 422 O ILE A 53 12.228 15.643 32.926 1.00 12.68 O +ATOM 423 CB ILE A 53 11.451 12.979 32.540 1.00 13.70 C +ATOM 424 CG1 ILE A 53 11.137 13.288 31.076 1.00 12.89 C +ATOM 425 CG2 ILE A 53 11.112 11.530 32.859 1.00 15.48 C +ATOM 426 CD1 ILE A 53 11.973 12.498 30.092 1.00 17.37 C +ATOM 427 N ARG A 54 10.075 16.259 33.133 1.00 14.93 N +ATOM 428 CA ARG A 54 10.339 17.663 32.831 1.00 17.46 C +ATOM 429 C ARG A 54 11.521 18.227 33.615 1.00 15.05 C +ATOM 430 O ARG A 54 12.396 18.875 33.043 1.00 13.17 O +ATOM 431 CB ARG A 54 9.100 18.515 33.120 1.00 21.33 C +ATOM 432 CG ARG A 54 9.292 19.993 32.805 1.00 27.86 C +ATOM 433 CD ARG A 54 8.119 20.838 33.282 1.00 38.40 C +ATOM 434 NE ARG A 54 7.921 20.738 34.727 1.00 45.55 N +ATOM 435 CZ ARG A 54 6.935 20.058 35.304 1.00 48.28 C +ATOM 436 NH1 ARG A 54 6.838 20.021 36.627 1.00 49.43 N +ATOM 437 NH2 ARG A 54 6.037 19.424 34.560 1.00 44.89 N +ATOM 438 N GLU A 55 11.542 17.982 34.922 1.00 14.40 N +ATOM 439 CA GLU A 55 12.616 18.484 35.777 1.00 18.96 C +ATOM 440 C GLU A 55 13.983 17.950 35.365 1.00 15.03 C +ATOM 441 O GLU A 55 14.967 18.691 35.337 1.00 13.65 O +ATOM 442 CB GLU A 55 12.335 18.123 37.240 1.00 20.18 C +ATOM 443 CG GLU A 55 13.348 18.673 38.231 1.00 27.21 C +ATOM 444 CD GLU A 55 13.525 20.176 38.117 1.00 30.48 C +ATOM 445 OE1 GLU A 55 12.515 20.882 37.911 1.00 32.00 O +ATOM 446 OE2 GLU A 55 14.673 20.653 38.246 1.00 30.82 O +ATOM 447 N ALA A 56 14.046 16.664 35.041 1.00 15.12 N +ATOM 448 CA ALA A 56 15.308 16.061 34.628 1.00 13.23 C +ATOM 449 C ALA A 56 15.794 16.704 33.334 1.00 12.47 C +ATOM 450 O ALA A 56 16.980 16.980 33.175 1.00 12.54 O +ATOM 451 CB ALA A 56 15.137 14.559 34.439 1.00 12.68 C +ATOM 452 N LEU A 57 14.873 16.938 32.404 1.00 8.74 N +ATOM 453 CA LEU A 57 15.230 17.554 31.136 1.00 7.77 C +ATOM 454 C LEU A 57 15.739 18.981 31.332 1.00 8.61 C +ATOM 455 O LEU A 57 16.717 19.390 30.700 1.00 9.52 O +ATOM 456 CB LEU A 57 14.023 17.558 30.189 1.00 10.14 C +ATOM 457 CG LEU A 57 13.440 16.175 29.888 1.00 9.25 C +ATOM 458 CD1 LEU A 57 12.287 16.312 28.914 1.00 10.72 C +ATOM 459 CD2 LEU A 57 14.518 15.277 29.300 1.00 10.29 C +ATOM 460 N LEU A 58 15.081 19.731 32.211 1.00 9.14 N +ATOM 461 CA LEU A 58 15.472 21.111 32.480 1.00 10.13 C +ATOM 462 C LEU A 58 16.850 21.191 33.132 1.00 9.44 C +ATOM 463 O LEU A 58 17.678 22.021 32.756 1.00 9.82 O +ATOM 464 CB LEU A 58 14.433 21.785 33.386 1.00 13.24 C +ATOM 465 CG LEU A 58 14.756 23.201 33.871 1.00 18.30 C +ATOM 466 CD1 LEU A 58 14.880 24.140 32.686 1.00 21.51 C +ATOM 467 CD2 LEU A 58 13.657 23.679 34.814 1.00 25.65 C +ATOM 468 N GLU A 59 17.090 20.322 34.107 1.00 8.78 N +ATOM 469 CA GLU A 59 18.364 20.302 34.818 1.00 11.12 C +ATOM 470 C GLU A 59 19.538 19.936 33.920 1.00 11.69 C +ATOM 471 O GLU A 59 20.687 20.279 34.210 1.00 12.28 O +ATOM 472 CB GLU A 59 18.304 19.309 35.980 1.00 13.15 C +ATOM 473 CG GLU A 59 17.497 19.777 37.170 1.00 17.13 C +ATOM 474 CD GLU A 59 17.449 18.742 38.275 1.00 18.20 C +ATOM 475 OE1 GLU A 59 18.404 17.944 38.381 1.00 18.34 O +ATOM 476 OE2 GLU A 59 16.466 18.734 39.045 1.00 19.18 O +ATOM 477 N ASN A 60 19.249 19.245 32.826 1.00 9.78 N +ATOM 478 CA ASN A 60 20.295 18.811 31.914 1.00 10.61 C +ATOM 479 C ASN A 60 20.108 19.363 30.509 1.00 12.44 C +ATOM 480 O ASN A 60 20.324 18.670 29.515 1.00 10.50 O +ATOM 481 CB ASN A 60 20.327 17.286 31.914 1.00 11.88 C +ATOM 482 CG ASN A 60 20.659 16.731 33.279 1.00 11.93 C +ATOM 483 OD1 ASN A 60 21.817 16.741 33.693 1.00 13.53 O +ATOM 484 ND2 ASN A 60 19.640 16.277 34.007 1.00 9.60 N +ATOM 485 N ILE A 61 19.726 20.634 30.453 1.00 14.87 N +ATOM 486 CA ILE A 61 19.486 21.340 29.203 1.00 14.76 C +ATOM 487 C ILE A 61 20.688 21.322 28.253 1.00 15.03 C +ATOM 488 O ILE A 61 20.517 21.351 27.035 1.00 13.45 O +ATOM 489 CB ILE A 61 19.085 22.812 29.492 1.00 15.88 C +ATOM 490 CG1 ILE A 61 18.626 23.505 28.208 1.00 20.00 C +ATOM 491 CG2 ILE A 61 20.250 23.555 30.119 1.00 19.27 C +ATOM 492 CD1 ILE A 61 17.277 23.039 27.718 1.00 24.49 C +ATOM 493 N ASP A 62 21.900 21.274 28.803 1.00 13.67 N +ATOM 494 CA ASP A 62 23.103 21.264 27.972 1.00 14.54 C +ATOM 495 C ASP A 62 23.280 19.967 27.191 1.00 14.65 C +ATOM 496 O ASP A 62 23.929 19.953 26.146 1.00 18.15 O +ATOM 497 CB ASP A 62 24.359 21.499 28.819 1.00 17.19 C +ATOM 498 CG ASP A 62 24.426 22.899 29.397 1.00 23.32 C +ATOM 499 OD1 ASP A 62 23.613 23.757 28.991 1.00 22.32 O +ATOM 500 OD2 ASP A 62 25.304 23.141 30.253 1.00 23.74 O +ATOM 501 N ILE A 63 22.711 18.880 27.699 1.00 12.30 N +ATOM 502 CA ILE A 63 22.830 17.585 27.038 1.00 12.18 C +ATOM 503 C ILE A 63 21.861 17.474 25.867 1.00 14.22 C +ATOM 504 O ILE A 63 20.675 17.746 26.010 1.00 18.15 O +ATOM 505 CB ILE A 63 22.543 16.420 28.018 1.00 13.92 C +ATOM 506 CG1 ILE A 63 23.548 16.441 29.172 1.00 17.28 C +ATOM 507 CG2 ILE A 63 22.620 15.091 27.280 1.00 14.00 C +ATOM 508 CD1 ILE A 63 24.995 16.287 28.735 1.00 17.06 C +ATOM 509 N GLY A 64 22.375 17.081 24.708 1.00 14.14 N +ATOM 510 CA GLY A 64 21.516 16.922 23.552 1.00 16.94 C +ATOM 511 C GLY A 64 20.961 15.515 23.593 1.00 18.30 C +ATOM 512 O GLY A 64 21.693 14.568 23.869 1.00 20.02 O +ATOM 513 N TYR A 65 19.673 15.357 23.331 1.00 18.65 N +ATOM 514 CA TYR A 65 19.100 14.024 23.372 1.00 18.31 C +ATOM 515 C TYR A 65 17.954 13.851 22.395 1.00 20.44 C +ATOM 516 O TYR A 65 17.351 14.821 21.934 1.00 19.03 O +ATOM 517 CB TYR A 65 18.598 13.718 24.790 1.00 22.93 C +ATOM 518 CG TYR A 65 17.282 14.393 25.118 1.00 22.93 C +ATOM 519 CD1 TYR A 65 16.071 13.842 24.693 1.00 27.91 C +ATOM 520 CD2 TYR A 65 17.249 15.608 25.797 1.00 24.79 C +ATOM 521 CE1 TYR A 65 14.862 14.486 24.929 1.00 26.74 C +ATOM 522 CE2 TYR A 65 16.042 16.264 26.040 1.00 26.83 C +ATOM 523 CZ TYR A 65 14.853 15.695 25.600 1.00 28.42 C +ATOM 524 OH TYR A 65 13.655 16.334 25.824 1.00 30.78 O +ATOM 525 N GLU A 66 17.679 12.593 22.080 1.00 19.35 N +ATOM 526 CA GLU A 66 16.576 12.221 21.212 1.00 18.13 C +ATOM 527 C GLU A 66 15.814 11.238 22.081 1.00 17.07 C +ATOM 528 O GLU A 66 16.422 10.477 22.836 1.00 13.89 O +ATOM 529 CB GLU A 66 17.066 11.523 19.944 1.00 22.10 C +ATOM 530 CG GLU A 66 17.781 12.427 18.959 1.00 31.96 C +ATOM 531 CD GLU A 66 18.028 11.743 17.627 1.00 38.40 C +ATOM 532 OE1 GLU A 66 18.679 10.676 17.616 1.00 42.11 O +ATOM 533 OE2 GLU A 66 17.569 12.272 16.592 1.00 43.89 O +ATOM 534 N LEU A 67 14.491 11.264 21.992 1.00 15.56 N +ATOM 535 CA LEU A 67 13.666 10.376 22.794 1.00 14.40 C +ATOM 536 C LEU A 67 12.745 9.543 21.909 1.00 14.70 C +ATOM 537 O LEU A 67 11.996 10.080 21.093 1.00 15.80 O +ATOM 538 CB LEU A 67 12.839 11.203 23.785 1.00 16.90 C +ATOM 539 CG LEU A 67 11.914 10.470 24.757 1.00 19.24 C +ATOM 540 CD1 LEU A 67 12.727 9.532 25.637 1.00 21.66 C +ATOM 541 CD2 LEU A 67 11.172 11.489 25.610 1.00 20.68 C +ATOM 542 N PHE A 68 12.818 8.227 22.076 1.00 11.13 N +ATOM 543 CA PHE A 68 11.996 7.298 21.314 1.00 12.93 C +ATOM 544 C PHE A 68 11.285 6.355 22.272 1.00 12.63 C +ATOM 545 O PHE A 68 11.911 5.759 23.149 1.00 12.01 O +ATOM 546 CB PHE A 68 12.866 6.479 20.355 1.00 12.05 C +ATOM 547 CG PHE A 68 13.523 7.296 19.285 1.00 14.59 C +ATOM 548 CD1 PHE A 68 12.792 7.756 18.195 1.00 14.07 C +ATOM 549 CD2 PHE A 68 14.870 7.625 19.375 1.00 15.16 C +ATOM 550 CE1 PHE A 68 13.394 8.532 17.208 1.00 15.37 C +ATOM 551 CE2 PHE A 68 15.482 8.401 18.393 1.00 17.63 C +ATOM 552 CZ PHE A 68 14.744 8.856 17.308 1.00 18.22 C +ATOM 553 N LEU A 69 9.974 6.232 22.112 1.00 12.84 N +ATOM 554 CA LEU A 69 9.198 5.334 22.955 1.00 13.24 C +ATOM 555 C LEU A 69 8.765 4.137 22.123 1.00 14.32 C +ATOM 556 O LEU A 69 8.332 4.289 20.978 1.00 13.65 O +ATOM 557 CB LEU A 69 7.968 6.046 23.526 1.00 14.24 C +ATOM 558 CG LEU A 69 8.206 6.979 24.718 1.00 18.28 C +ATOM 559 CD1 LEU A 69 9.175 8.085 24.331 1.00 18.52 C +ATOM 560 CD2 LEU A 69 6.879 7.565 25.175 1.00 19.14 C +ATOM 561 N TRP A 70 8.900 2.949 22.702 1.00 12.36 N +ATOM 562 CA TRP A 70 8.536 1.716 22.025 1.00 13.82 C +ATOM 563 C TRP A 70 7.665 0.826 22.889 1.00 14.23 C +ATOM 564 O TRP A 70 7.958 0.612 24.063 1.00 14.03 O +ATOM 565 CB TRP A 70 9.783 0.908 21.663 1.00 10.85 C +ATOM 566 CG TRP A 70 10.830 1.673 20.944 1.00 10.51 C +ATOM 567 CD1 TRP A 70 12.000 2.158 21.461 1.00 11.33 C +ATOM 568 CD2 TRP A 70 10.815 2.036 19.565 1.00 9.50 C +ATOM 569 NE1 TRP A 70 12.718 2.801 20.477 1.00 10.64 N +ATOM 570 CE2 TRP A 70 12.012 2.740 19.305 1.00 9.79 C +ATOM 571 CE3 TRP A 70 9.905 1.834 18.520 1.00 12.09 C +ATOM 572 CZ2 TRP A 70 12.322 3.243 18.038 1.00 11.85 C +ATOM 573 CZ3 TRP A 70 10.215 2.336 17.259 1.00 12.80 C +ATOM 574 CH2 TRP A 70 11.414 3.031 17.031 1.00 14.03 C +ATOM 575 N LYS A 71 6.585 0.311 22.315 1.00 16.48 N +ATOM 576 CA LYS A 71 5.751 -0.615 23.057 1.00 18.93 C +ATOM 577 C LYS A 71 6.589 -1.886 22.981 1.00 22.72 C +ATOM 578 O LYS A 71 7.369 -2.052 22.045 1.00 20.37 O +ATOM 579 CB LYS A 71 4.404 -0.808 22.362 1.00 21.31 C +ATOM 580 CG LYS A 71 3.515 0.422 22.417 1.00 26.79 C +ATOM 581 CD LYS A 71 2.153 0.147 21.800 1.00 34.56 C +ATOM 582 CE LYS A 71 1.226 1.341 21.964 1.00 38.54 C +ATOM 583 NZ LYS A 71 1.787 2.569 21.336 1.00 42.94 N +ATOM 584 N LYS A 72 6.453 -2.775 23.957 1.00 25.48 N +ATOM 585 CA LYS A 72 7.250 -3.995 23.956 1.00 28.37 C +ATOM 586 C LYS A 72 7.172 -4.780 22.646 1.00 25.79 C +ATOM 587 O LYS A 72 8.112 -5.485 22.282 1.00 26.09 O +ATOM 588 CB LYS A 72 6.847 -4.875 25.142 1.00 33.91 C +ATOM 589 CG LYS A 72 7.142 -4.215 26.484 1.00 41.92 C +ATOM 590 CD LYS A 72 6.760 -5.093 27.661 1.00 49.29 C +ATOM 591 CE LYS A 72 7.062 -4.389 28.976 1.00 53.30 C +ATOM 592 NZ LYS A 72 6.675 -5.210 30.154 1.00 56.26 N +ATOM 593 N ASN A 73 6.063 -4.638 21.929 1.00 22.90 N +ATOM 594 CA ASN A 73 5.882 -5.339 20.663 1.00 22.29 C +ATOM 595 C ASN A 73 6.590 -4.636 19.501 1.00 18.11 C +ATOM 596 O ASN A 73 6.606 -5.141 18.379 1.00 16.58 O +ATOM 597 CB ASN A 73 4.388 -5.471 20.351 1.00 26.17 C +ATOM 598 CG ASN A 73 3.713 -4.126 20.148 1.00 30.05 C +ATOM 599 OD1 ASN A 73 3.996 -3.417 19.182 1.00 34.23 O +ATOM 600 ND2 ASN A 73 2.815 -3.767 21.060 1.00 33.29 N +ATOM 601 N GLU A 74 7.181 -3.476 19.774 1.00 15.76 N +ATOM 602 CA GLU A 74 7.876 -2.716 18.737 1.00 12.60 C +ATOM 603 C GLU A 74 9.394 -2.799 18.865 1.00 10.48 C +ATOM 604 O GLU A 74 10.123 -2.059 18.200 1.00 9.42 O +ATOM 605 CB GLU A 74 7.441 -1.250 18.779 1.00 16.35 C +ATOM 606 CG GLU A 74 5.944 -1.042 18.607 1.00 17.92 C +ATOM 607 CD GLU A 74 5.549 0.420 18.673 1.00 20.34 C +ATOM 608 OE1 GLU A 74 5.999 1.117 19.606 1.00 16.46 O +ATOM 609 OE2 GLU A 74 4.782 0.874 17.800 1.00 19.67 O +ATOM 610 N VAL A 75 9.871 -3.700 19.715 1.00 9.06 N +ATOM 611 CA VAL A 75 11.307 -3.853 19.904 1.00 10.52 C +ATOM 612 C VAL A 75 12.000 -4.150 18.577 1.00 10.22 C +ATOM 613 O VAL A 75 13.149 -3.753 18.366 1.00 11.77 O +ATOM 614 CB VAL A 75 11.630 -4.984 20.903 1.00 11.34 C +ATOM 615 CG1 VAL A 75 13.144 -5.106 21.081 1.00 15.60 C +ATOM 616 CG2 VAL A 75 10.972 -4.693 22.241 1.00 17.33 C +ATOM 617 N ASP A 76 11.312 -4.838 17.672 1.00 9.91 N +ATOM 618 CA ASP A 76 11.929 -5.147 16.387 1.00 12.34 C +ATOM 619 C ASP A 76 12.226 -3.892 15.563 1.00 9.21 C +ATOM 620 O ASP A 76 13.214 -3.852 14.831 1.00 9.36 O +ATOM 621 CB ASP A 76 11.070 -6.145 15.589 1.00 14.04 C +ATOM 622 CG ASP A 76 9.660 -5.646 15.307 1.00 17.54 C +ATOM 623 OD1 ASP A 76 9.238 -4.607 15.857 1.00 13.26 O +ATOM 624 OD2 ASP A 76 8.960 -6.325 14.525 1.00 15.98 O +ATOM 625 N ILE A 77 11.388 -2.865 15.690 1.00 7.60 N +ATOM 626 CA ILE A 77 11.612 -1.620 14.956 1.00 8.71 C +ATOM 627 C ILE A 77 12.832 -0.927 15.568 1.00 9.62 C +ATOM 628 O ILE A 77 13.683 -0.391 14.857 1.00 8.90 O +ATOM 629 CB ILE A 77 10.393 -0.676 15.051 1.00 10.93 C +ATOM 630 CG1 ILE A 77 9.149 -1.364 14.476 1.00 10.71 C +ATOM 631 CG2 ILE A 77 10.673 0.611 14.282 1.00 10.85 C +ATOM 632 CD1 ILE A 77 7.862 -0.594 14.705 1.00 12.30 C +ATOM 633 N PHE A 78 12.907 -0.944 16.894 1.00 7.81 N +ATOM 634 CA PHE A 78 14.037 -0.347 17.592 1.00 8.65 C +ATOM 635 C PHE A 78 15.349 -0.969 17.115 1.00 11.53 C +ATOM 636 O PHE A 78 16.296 -0.264 16.767 1.00 11.69 O +ATOM 637 CB PHE A 78 13.900 -0.555 19.101 1.00 8.63 C +ATOM 638 CG PHE A 78 15.210 -0.506 19.831 1.00 10.37 C +ATOM 639 CD1 PHE A 78 15.906 0.690 19.962 1.00 13.42 C +ATOM 640 CD2 PHE A 78 15.776 -1.673 20.335 1.00 11.53 C +ATOM 641 CE1 PHE A 78 17.155 0.722 20.581 1.00 15.39 C +ATOM 642 CE2 PHE A 78 17.025 -1.651 20.955 1.00 11.81 C +ATOM 643 CZ PHE A 78 17.713 -0.451 21.077 1.00 14.87 C +ATOM 644 N LEU A 79 15.400 -2.296 17.108 1.00 10.16 N +ATOM 645 CA LEU A 79 16.603 -3.000 16.689 1.00 9.69 C +ATOM 646 C LEU A 79 16.961 -2.733 15.231 1.00 10.98 C +ATOM 647 O LEU A 79 18.139 -2.623 14.893 1.00 10.05 O +ATOM 648 CB LEU A 79 16.443 -4.500 16.940 1.00 11.59 C +ATOM 649 CG LEU A 79 16.470 -4.879 18.425 1.00 9.25 C +ATOM 650 CD1 LEU A 79 15.977 -6.304 18.620 1.00 13.42 C +ATOM 651 CD2 LEU A 79 17.888 -4.720 18.953 1.00 12.07 C +ATOM 652 N LYS A 80 15.954 -2.620 14.369 1.00 10.41 N +ATOM 653 CA LYS A 80 16.218 -2.349 12.958 1.00 10.15 C +ATOM 654 C LYS A 80 16.780 -0.939 12.799 1.00 10.76 C +ATOM 655 O LYS A 80 17.782 -0.733 12.114 1.00 10.37 O +ATOM 656 CB LYS A 80 14.940 -2.495 12.126 1.00 12.27 C +ATOM 657 CG LYS A 80 15.145 -2.238 10.633 1.00 16.44 C +ATOM 658 CD LYS A 80 16.171 -3.193 10.040 1.00 20.17 C +ATOM 659 CE LYS A 80 16.448 -2.877 8.575 1.00 24.66 C +ATOM 660 NZ LYS A 80 17.426 -3.837 7.977 1.00 25.43 N +ATOM 661 N ASN A 81 16.134 0.032 13.438 1.00 8.82 N +ATOM 662 CA ASN A 81 16.580 1.417 13.367 1.00 9.52 C +ATOM 663 C ASN A 81 17.985 1.579 13.938 1.00 9.21 C +ATOM 664 O ASN A 81 18.736 2.458 13.516 1.00 8.16 O +ATOM 665 CB ASN A 81 15.615 2.325 14.133 1.00 6.26 C +ATOM 666 CG ASN A 81 14.281 2.498 13.423 1.00 9.62 C +ATOM 667 OD1 ASN A 81 14.035 1.894 12.378 1.00 9.19 O +ATOM 668 ND2 ASN A 81 13.414 3.328 13.993 1.00 6.70 N +ATOM 669 N LEU A 82 18.331 0.736 14.904 1.00 8.29 N +ATOM 670 CA LEU A 82 19.650 0.796 15.531 1.00 9.25 C +ATOM 671 C LEU A 82 20.761 0.619 14.493 1.00 10.59 C +ATOM 672 O LEU A 82 21.870 1.130 14.661 1.00 9.88 O +ATOM 673 CB LEU A 82 19.762 -0.282 16.614 1.00 9.95 C +ATOM 674 CG LEU A 82 21.043 -0.292 17.456 1.00 14.09 C +ATOM 675 CD1 LEU A 82 21.245 1.066 18.111 1.00 13.71 C +ATOM 676 CD2 LEU A 82 20.950 -1.389 18.509 1.00 10.74 C +ATOM 677 N GLU A 83 20.458 -0.095 13.413 1.00 9.50 N +ATOM 678 CA GLU A 83 21.448 -0.317 12.362 1.00 11.88 C +ATOM 679 C GLU A 83 21.947 0.992 11.755 1.00 12.86 C +ATOM 680 O GLU A 83 23.071 1.058 11.257 1.00 13.04 O +ATOM 681 CB GLU A 83 20.865 -1.191 11.249 1.00 12.61 C +ATOM 682 CG GLU A 83 20.452 -2.577 11.705 1.00 14.42 C +ATOM 683 CD GLU A 83 19.991 -3.454 10.558 1.00 18.48 C +ATOM 684 OE1 GLU A 83 19.859 -2.939 9.430 1.00 18.66 O +ATOM 685 OE2 GLU A 83 19.754 -4.658 10.787 1.00 22.59 O +ATOM 686 N LYS A 84 21.115 2.030 11.799 1.00 11.63 N +ATOM 687 CA LYS A 84 21.477 3.330 11.232 1.00 14.14 C +ATOM 688 C LYS A 84 21.896 4.374 12.268 1.00 16.24 C +ATOM 689 O LYS A 84 22.274 5.489 11.911 1.00 17.54 O +ATOM 690 CB LYS A 84 20.302 3.900 10.431 1.00 13.67 C +ATOM 691 CG LYS A 84 19.888 3.087 9.219 1.00 18.74 C +ATOM 692 CD LYS A 84 18.672 3.720 8.549 1.00 19.43 C +ATOM 693 CE LYS A 84 18.253 2.953 7.308 1.00 25.40 C +ATOM 694 NZ LYS A 84 19.315 2.959 6.266 1.00 30.14 N +ATOM 695 N SER A 85 21.823 4.016 13.544 1.00 12.83 N +ATOM 696 CA SER A 85 22.165 4.943 14.616 1.00 16.34 C +ATOM 697 C SER A 85 23.641 4.895 14.983 1.00 17.60 C +ATOM 698 O SER A 85 24.186 3.830 15.267 1.00 14.60 O +ATOM 699 CB SER A 85 21.316 4.638 15.855 1.00 18.24 C +ATOM 700 OG SER A 85 21.550 5.583 16.885 1.00 25.32 O +ATOM 701 N GLU A 86 24.281 6.058 14.976 1.00 16.65 N +ATOM 702 CA GLU A 86 25.691 6.148 15.318 1.00 20.54 C +ATOM 703 C GLU A 86 25.847 6.356 16.818 1.00 19.99 C +ATOM 704 O GLU A 86 25.795 7.484 17.308 1.00 23.78 O +ATOM 705 CB GLU A 86 26.349 7.301 14.555 1.00 25.96 C +ATOM 706 CG GLU A 86 27.754 7.656 15.035 1.00 39.12 C +ATOM 707 CD GLU A 86 28.656 6.445 15.179 1.00 45.75 C +ATOM 708 OE1 GLU A 86 28.753 5.654 14.216 1.00 50.19 O +ATOM 709 OE2 GLU A 86 29.275 6.290 16.256 1.00 50.06 O +ATOM 710 N VAL A 87 26.020 5.254 17.540 1.00 20.16 N +ATOM 711 CA VAL A 87 26.198 5.286 18.989 1.00 18.68 C +ATOM 712 C VAL A 87 27.523 4.612 19.338 1.00 18.77 C +ATOM 713 O VAL A 87 27.977 3.724 18.616 1.00 17.50 O +ATOM 714 CB VAL A 87 25.051 4.552 19.704 1.00 18.06 C +ATOM 715 CG1 VAL A 87 23.748 5.309 19.504 1.00 20.67 C +ATOM 716 CG2 VAL A 87 24.926 3.138 19.163 1.00 18.82 C +ATOM 717 N ASP A 88 28.144 5.031 20.439 1.00 16.11 N +ATOM 718 CA ASP A 88 29.428 4.461 20.846 1.00 16.31 C +ATOM 719 C ASP A 88 29.521 4.009 22.300 1.00 20.76 C +ATOM 720 O ASP A 88 30.507 3.385 22.698 1.00 25.38 O +ATOM 721 CB ASP A 88 30.556 5.454 20.570 1.00 19.28 C +ATOM 722 CG ASP A 88 30.224 6.857 21.036 1.00 18.16 C +ATOM 723 OD1 ASP A 88 29.422 7.004 21.984 1.00 19.26 O +ATOM 724 OD2 ASP A 88 30.779 7.813 20.458 1.00 20.16 O +ATOM 725 N GLY A 89 28.514 4.344 23.094 1.00 14.98 N +ATOM 726 CA GLY A 89 28.505 3.944 24.492 1.00 11.49 C +ATOM 727 C GLY A 89 27.131 3.392 24.807 1.00 11.28 C +ATOM 728 O GLY A 89 26.179 3.676 24.081 1.00 11.07 O +ATOM 729 N LEU A 90 27.014 2.623 25.887 1.00 7.86 N +ATOM 730 CA LEU A 90 25.732 2.028 26.248 1.00 8.27 C +ATOM 731 C LEU A 90 25.364 2.179 27.720 1.00 6.84 C +ATOM 732 O LEU A 90 26.191 1.947 28.599 1.00 8.06 O +ATOM 733 CB LEU A 90 25.743 0.539 25.897 1.00 9.22 C +ATOM 734 CG LEU A 90 24.518 -0.287 26.296 1.00 7.17 C +ATOM 735 CD1 LEU A 90 23.307 0.167 25.493 1.00 7.45 C +ATOM 736 CD2 LEU A 90 24.793 -1.763 26.048 1.00 10.76 C +ATOM 737 N LEU A 91 24.115 2.563 27.969 1.00 6.67 N +ATOM 738 CA LEU A 91 23.578 2.701 29.323 1.00 5.88 C +ATOM 739 C LEU A 91 22.297 1.877 29.362 1.00 7.65 C +ATOM 740 O LEU A 91 21.460 1.981 28.461 1.00 7.92 O +ATOM 741 CB LEU A 91 23.271 4.165 29.649 1.00 6.06 C +ATOM 742 CG LEU A 91 24.490 5.069 29.862 1.00 7.72 C +ATOM 743 CD1 LEU A 91 24.037 6.516 30.030 1.00 9.04 C +ATOM 744 CD2 LEU A 91 25.261 4.604 31.098 1.00 11.40 C +ATOM 745 N VAL A 92 22.147 1.056 30.397 1.00 7.74 N +ATOM 746 CA VAL A 92 20.973 0.196 30.526 1.00 9.41 C +ATOM 747 C VAL A 92 20.280 0.360 31.876 1.00 8.85 C +ATOM 748 O VAL A 92 20.929 0.302 32.920 1.00 9.80 O +ATOM 749 CB VAL A 92 21.368 -1.292 30.351 1.00 9.33 C +ATOM 750 CG1 VAL A 92 20.167 -2.188 30.602 1.00 11.21 C +ATOM 751 CG2 VAL A 92 21.923 -1.520 28.949 1.00 9.68 C +ATOM 752 N TYR A 93 18.962 0.546 31.846 1.00 8.30 N +ATOM 753 CA TYR A 93 18.179 0.713 33.072 1.00 7.46 C +ATOM 754 C TYR A 93 16.867 -0.059 33.053 1.00 9.64 C +ATOM 755 O TYR A 93 16.169 -0.096 32.039 1.00 9.58 O +ATOM 756 CB TYR A 93 17.833 2.185 33.292 1.00 7.49 C +ATOM 757 CG TYR A 93 19.013 3.115 33.250 1.00 7.32 C +ATOM 758 CD1 TYR A 93 19.727 3.425 34.408 1.00 10.22 C +ATOM 759 CD2 TYR A 93 19.428 3.677 32.045 1.00 8.50 C +ATOM 760 CE1 TYR A 93 20.827 4.275 34.363 1.00 7.50 C +ATOM 761 CE2 TYR A 93 20.519 4.520 31.989 1.00 10.65 C +ATOM 762 CZ TYR A 93 21.217 4.818 33.149 1.00 9.17 C +ATOM 763 OH TYR A 93 22.297 5.665 33.083 1.00 9.81 O +ATOM 764 N CYS A 94 16.525 -0.652 34.191 1.00 9.58 N +ATOM 765 CA CYS A 94 15.270 -1.383 34.321 1.00 11.58 C +ATOM 766 C CYS A 94 14.964 -1.598 35.795 1.00 11.27 C +ATOM 767 O CYS A 94 15.816 -1.357 36.656 1.00 12.83 O +ATOM 768 CB CYS A 94 15.356 -2.754 33.632 1.00 11.71 C +ATOM 769 SG CYS A 94 16.168 -4.070 34.608 1.00 12.06 S +ATOM 770 N ASP A 95 13.733 -2.008 36.085 1.00 13.29 N +ATOM 771 CA ASP A 95 13.353 -2.344 37.450 1.00 15.28 C +ATOM 772 C ASP A 95 13.033 -3.840 37.408 1.00 15.81 C +ATOM 773 O ASP A 95 13.032 -4.440 36.335 1.00 14.16 O +ATOM 774 CB ASP A 95 12.152 -1.522 37.960 1.00 14.63 C +ATOM 775 CG ASP A 95 11.055 -1.342 36.927 1.00 16.19 C +ATOM 776 OD1 ASP A 95 10.946 -2.160 35.993 1.00 16.16 O +ATOM 777 OD2 ASP A 95 10.279 -0.370 37.074 1.00 16.66 O +ATOM 778 N ASP A 96 12.781 -4.451 38.561 1.00 18.96 N +ATOM 779 CA ASP A 96 12.504 -5.884 38.602 1.00 20.56 C +ATOM 780 C ASP A 96 11.413 -6.363 37.654 1.00 20.25 C +ATOM 781 O ASP A 96 11.549 -7.411 37.027 1.00 19.79 O +ATOM 782 CB ASP A 96 12.154 -6.317 40.026 1.00 25.74 C +ATOM 783 CG ASP A 96 13.353 -6.310 40.945 1.00 27.79 C +ATOM 784 OD1 ASP A 96 14.408 -6.847 40.547 1.00 33.13 O +ATOM 785 OD2 ASP A 96 13.237 -5.779 42.067 1.00 35.26 O +ATOM 786 N GLU A 97 10.333 -5.599 37.556 1.00 20.92 N +ATOM 787 CA GLU A 97 9.216 -5.962 36.693 1.00 22.17 C +ATOM 788 C GLU A 97 9.593 -6.037 35.216 1.00 22.07 C +ATOM 789 O GLU A 97 8.908 -6.691 34.431 1.00 21.21 O +ATOM 790 CB GLU A 97 8.068 -4.964 36.869 1.00 25.44 C +ATOM 791 CG GLU A 97 7.371 -5.031 38.219 1.00 37.78 C +ATOM 792 CD GLU A 97 8.317 -4.805 39.384 1.00 43.22 C +ATOM 793 OE1 GLU A 97 9.043 -3.786 39.372 1.00 45.28 O +ATOM 794 OE2 GLU A 97 8.330 -5.642 40.314 1.00 42.89 O +ATOM 795 N ASN A 98 10.685 -5.380 34.840 1.00 17.80 N +ATOM 796 CA ASN A 98 11.110 -5.371 33.443 1.00 15.94 C +ATOM 797 C ASN A 98 12.511 -5.926 33.204 1.00 16.06 C +ATOM 798 O ASN A 98 13.054 -5.792 32.104 1.00 13.18 O +ATOM 799 CB ASN A 98 11.031 -3.942 32.901 1.00 16.46 C +ATOM 800 CG ASN A 98 9.621 -3.391 32.918 1.00 19.73 C +ATOM 801 OD1 ASN A 98 8.775 -3.797 32.120 1.00 23.19 O +ATOM 802 ND2 ASN A 98 9.354 -2.468 33.837 1.00 17.02 N +ATOM 803 N LYS A 99 13.088 -6.561 34.218 1.00 13.73 N +ATOM 804 CA LYS A 99 14.437 -7.107 34.102 1.00 14.87 C +ATOM 805 C LYS A 99 14.580 -8.218 33.063 1.00 14.96 C +ATOM 806 O LYS A 99 15.552 -8.238 32.307 1.00 14.14 O +ATOM 807 CB LYS A 99 14.920 -7.605 35.468 1.00 16.79 C +ATOM 808 CG LYS A 99 16.342 -8.144 35.460 1.00 18.70 C +ATOM 809 CD LYS A 99 16.878 -8.325 36.875 1.00 25.73 C +ATOM 810 CE LYS A 99 16.023 -9.280 37.685 1.00 30.36 C +ATOM 811 NZ LYS A 99 16.496 -9.377 39.094 1.00 34.03 N +ATOM 812 N VAL A 100 13.628 -9.147 33.025 1.00 15.47 N +ATOM 813 CA VAL A 100 13.688 -10.233 32.049 1.00 14.52 C +ATOM 814 C VAL A 100 13.612 -9.647 30.641 1.00 13.62 C +ATOM 815 O VAL A 100 14.373 -10.028 29.752 1.00 13.40 O +ATOM 816 CB VAL A 100 12.520 -11.229 32.240 1.00 17.58 C +ATOM 817 CG1 VAL A 100 12.531 -12.268 31.124 1.00 14.99 C +ATOM 818 CG2 VAL A 100 12.641 -11.914 33.593 1.00 18.88 C +ATOM 819 N PHE A 101 12.694 -8.707 30.454 1.00 14.49 N +ATOM 820 CA PHE A 101 12.518 -8.053 29.166 1.00 16.41 C +ATOM 821 C PHE A 101 13.790 -7.329 28.728 1.00 16.42 C +ATOM 822 O PHE A 101 14.326 -7.593 27.650 1.00 13.50 O +ATOM 823 CB PHE A 101 11.368 -7.052 29.243 1.00 16.85 C +ATOM 824 CG PHE A 101 11.188 -6.238 27.995 1.00 21.20 C +ATOM 825 CD1 PHE A 101 10.807 -6.843 26.801 1.00 22.47 C +ATOM 826 CD2 PHE A 101 11.394 -4.864 28.013 1.00 24.04 C +ATOM 827 CE1 PHE A 101 10.633 -6.091 25.642 1.00 24.25 C +ATOM 828 CE2 PHE A 101 11.224 -4.101 26.861 1.00 28.34 C +ATOM 829 CZ PHE A 101 10.842 -4.716 25.672 1.00 27.51 C +HETATM 830 N MSE A 102 14.271 -6.413 29.562 1.00 15.07 N +HETATM 831 CA MSE A 102 15.471 -5.656 29.229 1.00 15.73 C +HETATM 832 C MSE A 102 16.697 -6.542 29.030 1.00 15.29 C +HETATM 833 O MSE A 102 17.510 -6.291 28.138 1.00 14.86 O +HETATM 834 CB MSE A 102 15.761 -4.609 30.308 1.00 16.50 C +HETATM 835 CG MSE A 102 16.999 -3.766 30.031 1.00 12.98 C +HETATM 836 SE MSE A 102 16.938 -2.880 28.300 1.00 27.13 SE +HETATM 837 CE MSE A 102 15.668 -1.533 28.732 1.00 8.64 C +ATOM 838 N SER A 103 16.835 -7.578 29.852 1.00 17.48 N +ATOM 839 CA SER A 103 17.978 -8.478 29.733 1.00 17.27 C +ATOM 840 C SER A 103 18.018 -9.139 28.360 1.00 17.75 C +ATOM 841 O SER A 103 19.089 -9.324 27.783 1.00 18.72 O +ATOM 842 CB SER A 103 17.930 -9.555 30.822 1.00 17.33 C +ATOM 843 OG SER A 103 18.125 -8.986 32.103 1.00 22.22 O +ATOM 844 N LYS A 104 16.848 -9.489 27.836 1.00 18.40 N +ATOM 845 CA LYS A 104 16.772 -10.126 26.526 1.00 17.38 C +ATOM 846 C LYS A 104 17.196 -9.150 25.431 1.00 17.58 C +ATOM 847 O LYS A 104 17.929 -9.518 24.512 1.00 19.01 O +ATOM 848 CB LYS A 104 15.349 -10.623 26.261 1.00 18.69 C +ATOM 849 CG LYS A 104 15.172 -11.313 24.916 1.00 22.54 C +ATOM 850 CD LYS A 104 13.791 -11.952 24.792 1.00 23.95 C +ATOM 851 CE LYS A 104 12.674 -10.929 24.964 1.00 27.27 C +ATOM 852 NZ LYS A 104 11.319 -11.539 24.823 1.00 29.03 N +ATOM 853 N ILE A 105 16.734 -7.906 25.533 1.00 16.37 N +ATOM 854 CA ILE A 105 17.081 -6.884 24.551 1.00 16.07 C +ATOM 855 C ILE A 105 18.596 -6.688 24.526 1.00 14.20 C +ATOM 856 O ILE A 105 19.206 -6.640 23.458 1.00 15.34 O +ATOM 857 CB ILE A 105 16.404 -5.529 24.878 1.00 15.75 C +ATOM 858 CG1 ILE A 105 14.885 -5.662 24.757 1.00 18.48 C +ATOM 859 CG2 ILE A 105 16.901 -4.445 23.925 1.00 16.56 C +ATOM 860 CD1 ILE A 105 14.134 -4.377 25.044 1.00 22.69 C +ATOM 861 N VAL A 106 19.198 -6.572 25.706 1.00 11.65 N +ATOM 862 CA VAL A 106 20.641 -6.388 25.798 1.00 13.23 C +ATOM 863 C VAL A 106 21.380 -7.546 25.132 1.00 17.19 C +ATOM 864 O VAL A 106 22.370 -7.336 24.431 1.00 15.73 O +ATOM 865 CB VAL A 106 21.103 -6.275 27.268 1.00 14.34 C +ATOM 866 CG1 VAL A 106 22.621 -6.188 27.332 1.00 14.51 C +ATOM 867 CG2 VAL A 106 20.482 -5.042 27.909 1.00 12.30 C +ATOM 868 N ASP A 107 20.894 -8.767 25.344 1.00 15.92 N +ATOM 869 CA ASP A 107 21.528 -9.939 24.748 1.00 19.28 C +ATOM 870 C ASP A 107 21.531 -9.877 23.224 1.00 18.25 C +ATOM 871 O ASP A 107 22.408 -10.453 22.581 1.00 19.40 O +ATOM 872 CB ASP A 107 20.820 -11.232 25.174 1.00 21.10 C +ATOM 873 CG ASP A 107 20.957 -11.522 26.654 1.00 24.44 C +ATOM 874 OD1 ASP A 107 22.031 -11.238 27.225 1.00 24.29 O +ATOM 875 OD2 ASP A 107 19.993 -12.057 27.244 1.00 26.54 O +ATOM 876 N ASN A 108 20.550 -9.187 22.650 1.00 16.67 N +ATOM 877 CA ASN A 108 20.448 -9.090 21.196 1.00 16.97 C +ATOM 878 C ASN A 108 21.076 -7.848 20.570 1.00 15.91 C +ATOM 879 O ASN A 108 20.954 -7.636 19.366 1.00 13.39 O +ATOM 880 CB ASN A 108 18.984 -9.189 20.759 1.00 19.30 C +ATOM 881 CG ASN A 108 18.415 -10.582 20.944 1.00 23.83 C +ATOM 882 OD1 ASN A 108 18.184 -11.032 22.068 1.00 26.90 O +ATOM 883 ND2 ASN A 108 18.194 -11.278 19.835 1.00 22.68 N +ATOM 884 N LEU A 109 21.741 -7.026 21.374 1.00 14.98 N +ATOM 885 CA LEU A 109 22.385 -5.828 20.840 1.00 14.18 C +ATOM 886 C LEU A 109 23.672 -6.221 20.135 1.00 16.48 C +ATOM 887 O LEU A 109 24.253 -7.265 20.431 1.00 14.47 O +ATOM 888 CB LEU A 109 22.727 -4.847 21.963 1.00 11.94 C +ATOM 889 CG LEU A 109 21.578 -4.194 22.728 1.00 9.62 C +ATOM 890 CD1 LEU A 109 22.146 -3.384 23.887 1.00 8.05 C +ATOM 891 CD2 LEU A 109 20.769 -3.304 21.795 1.00 8.93 C +ATOM 892 N PRO A 110 24.137 -5.388 19.190 1.00 16.03 N +ATOM 893 CA PRO A 110 25.377 -5.682 18.467 1.00 18.68 C +ATOM 894 C PRO A 110 26.539 -5.848 19.445 1.00 18.36 C +ATOM 895 O PRO A 110 26.588 -5.189 20.486 1.00 16.80 O +ATOM 896 CB PRO A 110 25.551 -4.459 17.572 1.00 17.68 C +ATOM 897 CG PRO A 110 24.137 -4.055 17.288 1.00 20.90 C +ATOM 898 CD PRO A 110 23.488 -4.181 18.649 1.00 17.75 C +ATOM 899 N THR A 111 27.473 -6.725 19.102 1.00 17.87 N +ATOM 900 CA THR A 111 28.631 -6.987 19.946 1.00 19.17 C +ATOM 901 C THR A 111 29.378 -5.717 20.354 1.00 18.59 C +ATOM 902 O THR A 111 29.683 -5.518 21.529 1.00 15.29 O +ATOM 903 CB THR A 111 29.625 -7.918 19.230 1.00 18.45 C +ATOM 904 OG1 THR A 111 28.975 -9.154 18.913 1.00 26.33 O +ATOM 905 CG2 THR A 111 30.828 -8.193 20.116 1.00 22.32 C +ATOM 906 N ALA A 112 29.671 -4.864 19.377 1.00 16.37 N +ATOM 907 CA ALA A 112 30.402 -3.627 19.631 1.00 18.47 C +ATOM 908 C ALA A 112 29.717 -2.716 20.643 1.00 17.46 C +ATOM 909 O ALA A 112 30.381 -2.010 21.401 1.00 19.35 O +ATOM 910 CB ALA A 112 30.624 -2.875 18.321 1.00 18.49 C +ATOM 911 N ILE A 113 28.390 -2.731 20.658 1.00 12.89 N +ATOM 912 CA ILE A 113 27.644 -1.887 21.583 1.00 16.15 C +ATOM 913 C ILE A 113 27.695 -2.444 23.001 1.00 15.76 C +ATOM 914 O ILE A 113 27.925 -1.706 23.959 1.00 17.40 O +ATOM 915 CB ILE A 113 26.179 -1.734 21.130 1.00 15.62 C +ATOM 916 CG1 ILE A 113 26.143 -1.026 19.771 1.00 16.32 C +ATOM 917 CG2 ILE A 113 25.391 -0.936 22.162 1.00 15.49 C +ATOM 918 CD1 ILE A 113 24.753 -0.743 19.245 1.00 16.88 C +ATOM 919 N LYS A 114 27.491 -3.749 23.134 1.00 16.40 N +ATOM 920 CA LYS A 114 27.527 -4.383 24.446 1.00 17.88 C +ATOM 921 C LYS A 114 28.898 -4.255 25.099 1.00 18.65 C +ATOM 922 O LYS A 114 29.004 -4.206 26.323 1.00 19.90 O +ATOM 923 CB LYS A 114 27.149 -5.863 24.332 1.00 20.13 C +ATOM 924 CG LYS A 114 25.693 -6.097 23.967 1.00 23.14 C +ATOM 925 CD LYS A 114 25.324 -7.573 24.001 1.00 28.04 C +ATOM 926 CE LYS A 114 25.952 -8.340 22.854 1.00 31.86 C +ATOM 927 NZ LYS A 114 25.460 -9.747 22.805 1.00 36.71 N +ATOM 928 N ARG A 115 29.946 -4.185 24.285 1.00 19.13 N +ATOM 929 CA ARG A 115 31.299 -4.081 24.819 1.00 21.63 C +ATOM 930 C ARG A 115 31.620 -2.708 25.393 1.00 21.69 C +ATOM 931 O ARG A 115 32.625 -2.540 26.082 1.00 19.57 O +ATOM 932 CB ARG A 115 32.322 -4.458 23.745 1.00 29.14 C +ATOM 933 CG ARG A 115 32.066 -5.832 23.150 1.00 40.81 C +ATOM 934 CD ARG A 115 33.338 -6.510 22.674 1.00 51.82 C +ATOM 935 NE ARG A 115 33.045 -7.808 22.070 1.00 60.88 N +ATOM 936 CZ ARG A 115 33.959 -8.734 21.800 1.00 65.54 C +ATOM 937 NH1 ARG A 115 35.235 -8.513 22.083 1.00 68.77 N +ATOM 938 NH2 ARG A 115 33.595 -9.882 21.242 1.00 67.23 N +ATOM 939 N ASN A 116 30.768 -1.727 25.116 1.00 16.60 N +ATOM 940 CA ASN A 116 30.983 -0.385 25.639 1.00 13.28 C +ATOM 941 C ASN A 116 29.921 -0.012 26.664 1.00 13.98 C +ATOM 942 O ASN A 116 29.466 1.131 26.721 1.00 11.77 O +ATOM 943 CB ASN A 116 31.011 0.644 24.508 1.00 17.96 C +ATOM 944 CG ASN A 116 32.280 0.560 23.682 1.00 23.95 C +ATOM 945 OD1 ASN A 116 32.393 -0.258 22.771 1.00 27.65 O +ATOM 946 ND2 ASN A 116 33.253 1.399 24.014 1.00 24.96 N +ATOM 947 N LEU A 117 29.532 -0.993 27.472 1.00 14.76 N +ATOM 948 CA LEU A 117 28.539 -0.790 28.520 1.00 16.01 C +ATOM 949 C LEU A 117 29.169 0.082 29.606 1.00 16.50 C +ATOM 950 O LEU A 117 30.149 -0.311 30.238 1.00 19.94 O +ATOM 951 CB LEU A 117 28.119 -2.142 29.100 1.00 13.89 C +ATOM 952 CG LEU A 117 27.156 -2.147 30.288 1.00 15.07 C +ATOM 953 CD1 LEU A 117 25.825 -1.532 29.881 1.00 13.69 C +ATOM 954 CD2 LEU A 117 26.961 -3.579 30.766 1.00 16.68 C +ATOM 955 N ILE A 118 28.601 1.266 29.813 1.00 11.74 N +ATOM 956 CA ILE A 118 29.109 2.215 30.801 1.00 13.36 C +ATOM 957 C ILE A 118 28.505 1.995 32.180 1.00 12.53 C +ATOM 958 O ILE A 118 29.206 2.033 33.191 1.00 12.37 O +ATOM 959 CB ILE A 118 28.810 3.664 30.367 1.00 14.81 C +ATOM 960 CG1 ILE A 118 29.505 3.958 29.037 1.00 17.20 C +ATOM 961 CG2 ILE A 118 29.273 4.644 31.445 1.00 16.33 C +ATOM 962 CD1 ILE A 118 29.137 5.297 28.442 1.00 15.95 C +ATOM 963 N LYS A 119 27.196 1.782 32.216 1.00 9.94 N +ATOM 964 CA LYS A 119 26.491 1.553 33.470 1.00 8.83 C +ATOM 965 C LYS A 119 25.264 0.711 33.185 1.00 12.00 C +ATOM 966 O LYS A 119 24.547 0.953 32.216 1.00 9.96 O +ATOM 967 CB LYS A 119 26.062 2.883 34.105 1.00 10.54 C +ATOM 968 CG LYS A 119 25.176 2.742 35.358 1.00 12.68 C +ATOM 969 CD LYS A 119 25.904 2.066 36.516 1.00 12.97 C +ATOM 970 CE LYS A 119 25.005 1.904 37.747 1.00 9.78 C +ATOM 971 NZ LYS A 119 24.704 3.205 38.415 1.00 9.17 N +ATOM 972 N ASP A 120 25.043 -0.291 34.025 1.00 11.88 N +ATOM 973 CA ASP A 120 23.892 -1.164 33.887 1.00 12.15 C +ATOM 974 C ASP A 120 23.189 -1.204 35.238 1.00 13.35 C +ATOM 975 O ASP A 120 23.647 -1.875 36.158 1.00 13.72 O +ATOM 976 CB ASP A 120 24.332 -2.579 33.492 1.00 13.47 C +ATOM 977 CG ASP A 120 23.156 -3.506 33.216 1.00 18.79 C +ATOM 978 OD1 ASP A 120 22.239 -3.586 34.061 1.00 19.37 O +ATOM 979 OD2 ASP A 120 23.149 -4.162 32.155 1.00 26.90 O +ATOM 980 N PHE A 121 22.112 -0.440 35.374 1.00 9.12 N +ATOM 981 CA PHE A 121 21.345 -0.460 36.612 1.00 8.53 C +ATOM 982 C PHE A 121 20.158 -1.323 36.233 1.00 10.99 C +ATOM 983 O PHE A 121 19.062 -0.820 35.976 1.00 12.01 O +ATOM 984 CB PHE A 121 20.864 0.938 37.000 1.00 8.25 C +ATOM 985 CG PHE A 121 20.292 1.008 38.388 1.00 9.71 C +ATOM 986 CD1 PHE A 121 21.126 1.167 39.490 1.00 9.45 C +ATOM 987 CD2 PHE A 121 18.926 0.875 38.597 1.00 13.08 C +ATOM 988 CE1 PHE A 121 20.606 1.190 40.781 1.00 10.63 C +ATOM 989 CE2 PHE A 121 18.394 0.895 39.887 1.00 11.99 C +ATOM 990 CZ PHE A 121 19.238 1.054 40.981 1.00 12.89 C +ATOM 991 N CYS A 122 20.385 -2.631 36.182 1.00 12.06 N +ATOM 992 CA CYS A 122 19.331 -3.542 35.781 1.00 13.91 C +ATOM 993 C CYS A 122 19.612 -5.009 36.086 1.00 15.31 C +ATOM 994 O CYS A 122 19.032 -5.583 37.008 1.00 15.62 O +ATOM 995 CB CYS A 122 19.078 -3.364 34.280 1.00 13.84 C +ATOM 996 SG CYS A 122 17.857 -4.508 33.568 1.00 13.88 S +ATOM 997 N ARG A 123 20.511 -5.611 35.318 1.00 16.09 N +ATOM 998 CA ARG A 123 20.827 -7.025 35.485 1.00 18.40 C +ATOM 999 C ARG A 123 21.351 -7.484 36.846 1.00 17.94 C +ATOM 1000 O ARG A 123 21.097 -8.621 37.244 1.00 17.65 O +ATOM 1001 CB ARG A 123 21.772 -7.468 34.366 1.00 19.65 C +ATOM 1002 CG ARG A 123 21.072 -7.500 33.007 1.00 28.18 C +ATOM 1003 CD ARG A 123 22.004 -7.899 31.879 1.00 29.84 C +ATOM 1004 NE ARG A 123 23.045 -6.901 31.658 1.00 32.33 N +ATOM 1005 CZ ARG A 123 24.006 -7.013 30.748 1.00 29.90 C +ATOM 1006 NH1 ARG A 123 24.060 -8.083 29.967 1.00 27.70 N +ATOM 1007 NH2 ARG A 123 24.913 -6.056 30.619 1.00 29.83 N +ATOM 1008 N LYS A 124 22.063 -6.621 37.567 1.00 13.84 N +ATOM 1009 CA LYS A 124 22.574 -7.010 38.881 1.00 12.49 C +ATOM 1010 C LYS A 124 21.558 -6.778 40.004 1.00 10.77 C +ATOM 1011 O LYS A 124 21.839 -7.074 41.164 1.00 12.23 O +ATOM 1012 CB LYS A 124 23.877 -6.264 39.210 1.00 15.02 C +ATOM 1013 CG LYS A 124 25.124 -6.785 38.485 1.00 17.86 C +ATOM 1014 CD LYS A 124 26.376 -6.035 38.942 1.00 21.21 C +ATOM 1015 CE LYS A 124 27.647 -6.566 38.282 1.00 24.54 C +ATOM 1016 NZ LYS A 124 28.878 -5.873 38.791 1.00 21.46 N +ATOM 1017 N LEU A 125 20.385 -6.246 39.670 1.00 9.74 N +ATOM 1018 CA LEU A 125 19.359 -6.009 40.684 1.00 11.32 C +ATOM 1019 C LEU A 125 18.803 -7.337 41.180 1.00 14.53 C +ATOM 1020 O LEU A 125 18.539 -8.239 40.388 1.00 14.63 O +ATOM 1021 CB LEU A 125 18.213 -5.171 40.115 1.00 11.72 C +ATOM 1022 CG LEU A 125 18.482 -3.693 39.848 1.00 13.13 C +ATOM 1023 CD1 LEU A 125 17.307 -3.105 39.084 1.00 13.14 C +ATOM 1024 CD2 LEU A 125 18.690 -2.955 41.168 1.00 13.06 C +ATOM 1025 N SER A 126 18.630 -7.454 42.493 1.00 13.97 N +ATOM 1026 CA SER A 126 18.095 -8.673 43.087 1.00 18.03 C +ATOM 1027 C SER A 126 16.570 -8.624 43.178 1.00 20.57 C +ATOM 1028 O SER A 126 15.954 -9.708 43.269 1.00 24.85 O +ATOM 1029 CB SER A 126 18.697 -8.899 44.479 1.00 18.07 C +ATOM 1030 OG SER A 126 18.407 -7.823 45.351 1.00 15.78 O +TER 1031 SER A 126 +ATOM 1032 N TYR B 3 24.874 -14.238 65.592 1.00 21.36 N +ATOM 1033 CA TYR B 3 24.778 -13.845 64.154 1.00 14.51 C +ATOM 1034 C TYR B 3 24.644 -15.062 63.250 1.00 13.36 C +ATOM 1035 O TYR B 3 25.275 -16.090 63.494 1.00 14.59 O +ATOM 1036 CB TYR B 3 26.025 -13.057 63.736 1.00 14.32 C +ATOM 1037 CG TYR B 3 26.252 -11.805 64.544 1.00 12.05 C +ATOM 1038 CD1 TYR B 3 27.202 -11.769 65.564 1.00 12.30 C +ATOM 1039 CD2 TYR B 3 25.492 -10.662 64.309 1.00 10.81 C +ATOM 1040 CE1 TYR B 3 27.388 -10.616 66.331 1.00 14.06 C +ATOM 1041 CE2 TYR B 3 25.667 -9.512 65.069 1.00 13.41 C +ATOM 1042 CZ TYR B 3 26.614 -9.496 66.076 1.00 15.79 C +ATOM 1043 OH TYR B 3 26.781 -8.356 66.825 1.00 14.76 O +ATOM 1044 N LYS B 4 23.823 -14.950 62.210 1.00 11.22 N +ATOM 1045 CA LYS B 4 23.663 -16.057 61.274 1.00 13.45 C +ATOM 1046 C LYS B 4 23.831 -15.659 59.804 1.00 10.36 C +ATOM 1047 O LYS B 4 23.870 -16.522 58.933 1.00 10.86 O +ATOM 1048 CB LYS B 4 22.316 -16.761 61.471 1.00 16.58 C +ATOM 1049 CG LYS B 4 21.093 -15.942 61.128 1.00 16.48 C +ATOM 1050 CD LYS B 4 19.882 -16.859 61.028 1.00 21.17 C +ATOM 1051 CE LYS B 4 18.595 -16.085 60.822 1.00 27.98 C +ATOM 1052 NZ LYS B 4 18.247 -15.263 62.014 1.00 29.87 N +ATOM 1053 N ASN B 5 23.921 -14.359 59.523 1.00 8.93 N +ATOM 1054 CA ASN B 5 24.134 -13.899 58.150 1.00 8.93 C +ATOM 1055 C ASN B 5 24.842 -12.553 58.160 1.00 8.91 C +ATOM 1056 O ASN B 5 24.222 -11.500 58.322 1.00 10.65 O +ATOM 1057 CB ASN B 5 22.820 -13.791 57.372 1.00 11.88 C +ATOM 1058 CG ASN B 5 23.049 -13.491 55.898 1.00 13.66 C +ATOM 1059 OD1 ASN B 5 24.105 -13.815 55.347 1.00 19.21 O +ATOM 1060 ND2 ASN B 5 22.060 -12.887 55.250 1.00 22.41 N +ATOM 1061 N ILE B 6 26.152 -12.612 57.965 1.00 8.00 N +ATOM 1062 CA ILE B 6 27.003 -11.433 57.994 1.00 9.10 C +ATOM 1063 C ILE B 6 27.177 -10.713 56.666 1.00 8.01 C +ATOM 1064 O ILE B 6 27.518 -11.327 55.654 1.00 9.10 O +ATOM 1065 CB ILE B 6 28.416 -11.809 58.500 1.00 9.03 C +ATOM 1066 CG1 ILE B 6 28.320 -12.480 59.874 1.00 9.90 C +ATOM 1067 CG2 ILE B 6 29.303 -10.572 58.544 1.00 10.80 C +ATOM 1068 CD1 ILE B 6 27.770 -11.591 60.966 1.00 9.93 C +ATOM 1069 N LEU B 7 26.941 -9.405 56.678 1.00 8.14 N +ATOM 1070 CA LEU B 7 27.147 -8.591 55.489 1.00 6.09 C +ATOM 1071 C LEU B 7 28.588 -8.124 55.596 1.00 6.79 C +ATOM 1072 O LEU B 7 28.950 -7.434 56.551 1.00 7.97 O +ATOM 1073 CB LEU B 7 26.225 -7.367 55.478 1.00 7.81 C +ATOM 1074 CG LEU B 7 26.529 -6.349 54.369 1.00 8.36 C +ATOM 1075 CD1 LEU B 7 26.304 -6.988 53.002 1.00 9.26 C +ATOM 1076 CD2 LEU B 7 25.638 -5.118 54.545 1.00 7.47 C +ATOM 1077 N THR B 8 29.417 -8.518 54.635 1.00 6.69 N +ATOM 1078 CA THR B 8 30.821 -8.123 54.639 1.00 7.81 C +ATOM 1079 C THR B 8 31.088 -7.181 53.468 1.00 6.38 C +ATOM 1080 O THR B 8 30.726 -7.481 52.328 1.00 6.46 O +ATOM 1081 CB THR B 8 31.759 -9.352 54.501 1.00 10.09 C +ATOM 1082 OG1 THR B 8 31.631 -10.194 55.656 1.00 7.20 O +ATOM 1083 CG2 THR B 8 33.214 -8.901 54.370 1.00 8.79 C +ATOM 1084 N LEU B 9 31.706 -6.039 53.757 1.00 4.35 N +ATOM 1085 CA LEU B 9 32.043 -5.062 52.729 1.00 5.78 C +ATOM 1086 C LEU B 9 33.558 -4.900 52.689 1.00 6.78 C +ATOM 1087 O LEU B 9 34.209 -4.773 53.731 1.00 6.68 O +ATOM 1088 CB LEU B 9 31.407 -3.701 53.039 1.00 6.10 C +ATOM 1089 CG LEU B 9 29.928 -3.657 53.430 1.00 6.69 C +ATOM 1090 CD1 LEU B 9 29.491 -2.202 53.589 1.00 7.98 C +ATOM 1091 CD2 LEU B 9 29.087 -4.351 52.367 1.00 8.90 C +ATOM 1092 N ILE B 10 34.125 -4.911 51.490 1.00 5.68 N +ATOM 1093 CA ILE B 10 35.562 -4.744 51.369 1.00 6.72 C +ATOM 1094 C ILE B 10 35.965 -4.002 50.110 1.00 7.62 C +ATOM 1095 O ILE B 10 35.402 -4.206 49.037 1.00 5.59 O +ATOM 1096 CB ILE B 10 36.308 -6.109 51.406 1.00 6.91 C +ATOM 1097 CG1 ILE B 10 37.820 -5.882 51.274 1.00 7.02 C +ATOM 1098 CG2 ILE B 10 35.802 -7.021 50.297 1.00 6.03 C +ATOM 1099 CD1 ILE B 10 38.662 -7.130 51.515 1.00 8.43 C +ATOM 1100 N SER B 11 36.934 -3.110 50.267 1.00 7.10 N +ATOM 1101 CA SER B 11 37.476 -2.363 49.148 1.00 6.62 C +ATOM 1102 C SER B 11 38.942 -2.164 49.466 1.00 8.26 C +ATOM 1103 O SER B 11 39.288 -1.400 50.368 1.00 7.92 O +ATOM 1104 CB SER B 11 36.790 -1.008 48.984 1.00 6.11 C +ATOM 1105 OG SER B 11 37.256 -0.365 47.808 1.00 9.34 O +ATOM 1106 N VAL B 12 39.792 -2.885 48.742 1.00 7.09 N +ATOM 1107 CA VAL B 12 41.239 -2.801 48.918 1.00 10.34 C +ATOM 1108 C VAL B 12 41.924 -2.927 47.557 1.00 12.03 C +ATOM 1109 O VAL B 12 41.310 -3.347 46.576 1.00 10.61 O +ATOM 1110 CB VAL B 12 41.782 -3.938 49.832 1.00 10.18 C +ATOM 1111 CG1 VAL B 12 41.208 -3.817 51.237 1.00 7.55 C +ATOM 1112 CG2 VAL B 12 41.446 -5.301 49.234 1.00 11.44 C +ATOM 1113 N ASN B 13 43.197 -2.553 47.500 1.00 11.33 N +ATOM 1114 CA ASN B 13 43.973 -2.680 46.275 1.00 11.60 C +ATOM 1115 C ASN B 13 44.161 -4.169 46.021 1.00 10.16 C +ATOM 1116 O ASN B 13 44.092 -4.971 46.953 1.00 11.25 O +ATOM 1117 CB ASN B 13 45.327 -1.996 46.446 1.00 14.31 C +ATOM 1118 CG ASN B 13 45.205 -0.496 46.587 1.00 19.40 C +ATOM 1119 OD1 ASN B 13 46.076 0.158 47.157 1.00 27.47 O +ATOM 1120 ND2 ASN B 13 44.121 0.060 46.054 1.00 20.72 N +ATOM 1121 N ASN B 14 44.410 -4.534 44.769 1.00 10.10 N +ATOM 1122 CA ASN B 14 44.581 -5.938 44.400 1.00 11.06 C +ATOM 1123 C ASN B 14 45.570 -6.732 45.250 1.00 10.81 C +ATOM 1124 O ASN B 14 45.307 -7.888 45.580 1.00 10.95 O +ATOM 1125 CB ASN B 14 44.995 -6.057 42.930 1.00 10.61 C +ATOM 1126 CG ASN B 14 43.954 -5.496 41.982 1.00 15.18 C +ATOM 1127 OD1 ASN B 14 42.782 -5.372 42.330 1.00 14.69 O +ATOM 1128 ND2 ASN B 14 44.378 -5.164 40.769 1.00 19.56 N +ATOM 1129 N ASP B 15 46.702 -6.125 45.602 1.00 10.94 N +ATOM 1130 CA ASP B 15 47.705 -6.838 46.383 1.00 10.98 C +ATOM 1131 C ASP B 15 47.330 -7.096 47.836 1.00 10.19 C +ATOM 1132 O ASP B 15 48.071 -7.759 48.557 1.00 10.38 O +ATOM 1133 CB ASP B 15 49.065 -6.124 46.325 1.00 14.95 C +ATOM 1134 CG ASP B 15 49.000 -4.684 46.787 1.00 21.05 C +ATOM 1135 OD1 ASP B 15 48.229 -4.376 47.719 1.00 22.00 O +ATOM 1136 OD2 ASP B 15 49.746 -3.853 46.223 1.00 30.99 O +ATOM 1137 N ASN B 16 46.183 -6.581 48.267 1.00 11.48 N +ATOM 1138 CA ASN B 16 45.732 -6.790 49.641 1.00 7.76 C +ATOM 1139 C ASN B 16 44.579 -7.784 49.751 1.00 8.08 C +ATOM 1140 O ASN B 16 44.177 -8.141 50.855 1.00 8.44 O +ATOM 1141 CB ASN B 16 45.291 -5.466 50.279 1.00 10.28 C +ATOM 1142 CG ASN B 16 46.462 -4.627 50.763 1.00 15.33 C +ATOM 1143 OD1 ASN B 16 47.456 -5.156 51.263 1.00 15.34 O +ATOM 1144 ND2 ASN B 16 46.339 -3.308 50.640 1.00 12.76 N +ATOM 1145 N PHE B 17 44.050 -8.238 48.619 1.00 7.20 N +ATOM 1146 CA PHE B 17 42.923 -9.167 48.655 1.00 8.00 C +ATOM 1147 C PHE B 17 43.147 -10.464 49.434 1.00 8.33 C +ATOM 1148 O PHE B 17 42.342 -10.807 50.296 1.00 7.68 O +ATOM 1149 CB PHE B 17 42.446 -9.503 47.237 1.00 9.52 C +ATOM 1150 CG PHE B 17 41.524 -8.472 46.637 1.00 8.82 C +ATOM 1151 CD1 PHE B 17 40.442 -7.979 47.362 1.00 9.39 C +ATOM 1152 CD2 PHE B 17 41.709 -8.030 45.330 1.00 9.79 C +ATOM 1153 CE1 PHE B 17 39.554 -7.063 46.793 1.00 11.35 C +ATOM 1154 CE2 PHE B 17 40.827 -7.116 44.753 1.00 9.80 C +ATOM 1155 CZ PHE B 17 39.746 -6.631 45.487 1.00 12.77 C +ATOM 1156 N GLU B 18 44.218 -11.194 49.136 1.00 8.33 N +ATOM 1157 CA GLU B 18 44.467 -12.456 49.833 1.00 9.72 C +ATOM 1158 C GLU B 18 44.568 -12.297 51.348 1.00 6.59 C +ATOM 1159 O GLU B 18 43.893 -13.004 52.094 1.00 7.10 O +ATOM 1160 CB GLU B 18 45.735 -13.128 49.290 1.00 9.13 C +ATOM 1161 CG GLU B 18 46.238 -14.336 50.100 1.00 9.85 C +ATOM 1162 CD GLU B 18 45.206 -15.448 50.289 1.00 8.42 C +ATOM 1163 OE1 GLU B 18 44.234 -15.524 49.511 1.00 9.56 O +ATOM 1164 OE2 GLU B 18 45.382 -16.271 51.218 1.00 8.00 O +ATOM 1165 N ASN B 19 45.401 -11.369 51.806 1.00 9.24 N +ATOM 1166 CA ASN B 19 45.557 -11.164 53.242 1.00 9.87 C +ATOM 1167 C ASN B 19 44.248 -10.732 53.898 1.00 8.85 C +ATOM 1168 O ASN B 19 43.897 -11.222 54.976 1.00 8.14 O +ATOM 1169 CB ASN B 19 46.644 -10.121 53.523 1.00 14.61 C +ATOM 1170 CG ASN B 19 48.006 -10.540 52.996 1.00 22.00 C +ATOM 1171 OD1 ASN B 19 48.394 -11.704 53.106 1.00 25.40 O +ATOM 1172 ND2 ASN B 19 48.743 -9.590 52.434 1.00 24.63 N +ATOM 1173 N TYR B 20 43.531 -9.813 53.257 1.00 8.18 N +ATOM 1174 CA TYR B 20 42.266 -9.340 53.804 1.00 8.95 C +ATOM 1175 C TYR B 20 41.182 -10.413 53.812 1.00 6.99 C +ATOM 1176 O TYR B 20 40.396 -10.486 54.756 1.00 6.01 O +ATOM 1177 CB TYR B 20 41.754 -8.112 53.038 1.00 7.13 C +ATOM 1178 CG TYR B 20 42.236 -6.785 53.592 1.00 10.34 C +ATOM 1179 CD1 TYR B 20 43.548 -6.365 53.404 1.00 10.74 C +ATOM 1180 CD2 TYR B 20 41.368 -5.940 54.287 1.00 8.51 C +ATOM 1181 CE1 TYR B 20 43.987 -5.135 53.886 1.00 12.05 C +ATOM 1182 CE2 TYR B 20 41.797 -4.704 54.778 1.00 10.80 C +ATOM 1183 CZ TYR B 20 43.110 -4.309 54.569 1.00 8.47 C +ATOM 1184 OH TYR B 20 43.553 -3.083 55.017 1.00 8.55 O +ATOM 1185 N PHE B 21 41.125 -11.248 52.780 1.00 5.65 N +ATOM 1186 CA PHE B 21 40.097 -12.284 52.766 1.00 7.22 C +ATOM 1187 C PHE B 21 40.299 -13.326 53.856 1.00 6.90 C +ATOM 1188 O PHE B 21 39.324 -13.832 54.410 1.00 8.49 O +ATOM 1189 CB PHE B 21 39.983 -12.952 51.392 1.00 5.51 C +ATOM 1190 CG PHE B 21 38.875 -12.384 50.547 1.00 7.65 C +ATOM 1191 CD1 PHE B 21 39.053 -11.194 49.852 1.00 6.57 C +ATOM 1192 CD2 PHE B 21 37.629 -13.008 50.502 1.00 8.14 C +ATOM 1193 CE1 PHE B 21 38.005 -10.630 49.123 1.00 8.19 C +ATOM 1194 CE2 PHE B 21 36.577 -12.451 49.778 1.00 7.92 C +ATOM 1195 CZ PHE B 21 36.765 -11.262 49.089 1.00 7.63 C +ATOM 1196 N ARG B 22 41.545 -13.654 54.184 1.00 8.64 N +ATOM 1197 CA ARG B 22 41.753 -14.615 55.260 1.00 7.68 C +ATOM 1198 C ARG B 22 41.218 -13.986 56.546 1.00 9.23 C +ATOM 1199 O ARG B 22 40.626 -14.672 57.380 1.00 9.14 O +ATOM 1200 CB ARG B 22 43.234 -14.984 55.408 1.00 9.83 C +ATOM 1201 CG ARG B 22 43.737 -15.893 54.292 1.00 10.47 C +ATOM 1202 CD ARG B 22 45.028 -16.626 54.665 1.00 13.14 C +ATOM 1203 NE ARG B 22 46.093 -15.705 55.047 1.00 13.85 N +ATOM 1204 CZ ARG B 22 46.393 -15.381 56.301 1.00 16.65 C +ATOM 1205 NH1 ARG B 22 47.374 -14.525 56.546 1.00 19.74 N +ATOM 1206 NH2 ARG B 22 45.724 -15.926 57.310 1.00 16.23 N +ATOM 1207 N LYS B 23 41.398 -12.673 56.692 1.00 7.74 N +ATOM 1208 CA LYS B 23 40.906 -11.974 57.875 1.00 7.68 C +ATOM 1209 C LYS B 23 39.377 -11.989 57.872 1.00 5.61 C +ATOM 1210 O LYS B 23 38.747 -12.230 58.905 1.00 7.57 O +ATOM 1211 CB LYS B 23 41.417 -10.528 57.899 1.00 9.24 C +ATOM 1212 CG LYS B 23 41.097 -9.790 59.192 1.00 11.93 C +ATOM 1213 CD LYS B 23 41.651 -8.368 59.170 1.00 14.74 C +ATOM 1214 CE LYS B 23 41.414 -7.664 60.495 1.00 14.38 C +ATOM 1215 NZ LYS B 23 42.184 -8.300 61.608 1.00 14.94 N +ATOM 1216 N ILE B 24 38.780 -11.740 56.710 1.00 5.67 N +ATOM 1217 CA ILE B 24 37.320 -11.754 56.607 1.00 7.29 C +ATOM 1218 C ILE B 24 36.753 -13.062 57.160 1.00 6.15 C +ATOM 1219 O ILE B 24 35.866 -13.060 58.012 1.00 5.44 O +ATOM 1220 CB ILE B 24 36.851 -11.614 55.145 1.00 7.36 C +ATOM 1221 CG1 ILE B 24 37.094 -10.182 54.655 1.00 8.85 C +ATOM 1222 CG2 ILE B 24 35.367 -11.981 55.032 1.00 6.64 C +ATOM 1223 CD1 ILE B 24 36.766 -9.965 53.187 1.00 10.23 C +ATOM 1224 N PHE B 25 37.273 -14.181 56.675 1.00 7.30 N +ATOM 1225 CA PHE B 25 36.786 -15.477 57.122 1.00 6.63 C +ATOM 1226 C PHE B 25 37.036 -15.736 58.600 1.00 6.31 C +ATOM 1227 O PHE B 25 36.211 -16.363 59.267 1.00 8.06 O +ATOM 1228 CB PHE B 25 37.379 -16.585 56.248 1.00 6.24 C +ATOM 1229 CG PHE B 25 36.784 -16.631 54.864 1.00 7.17 C +ATOM 1230 CD1 PHE B 25 35.424 -16.880 54.690 1.00 10.68 C +ATOM 1231 CD2 PHE B 25 37.574 -16.405 53.740 1.00 8.30 C +ATOM 1232 CE1 PHE B 25 34.854 -16.902 53.414 1.00 9.57 C +ATOM 1233 CE2 PHE B 25 37.018 -16.424 52.459 1.00 9.90 C +ATOM 1234 CZ PHE B 25 35.653 -16.674 52.295 1.00 9.39 C +ATOM 1235 N LEU B 26 38.160 -15.256 59.125 1.00 6.24 N +ATOM 1236 CA LEU B 26 38.429 -15.438 60.548 1.00 7.07 C +ATOM 1237 C LEU B 26 37.368 -14.669 61.341 1.00 8.61 C +ATOM 1238 O LEU B 26 36.790 -15.187 62.301 1.00 5.92 O +ATOM 1239 CB LEU B 26 39.826 -14.922 60.903 1.00 9.61 C +ATOM 1240 CG LEU B 26 40.979 -15.783 60.382 1.00 11.99 C +ATOM 1241 CD1 LEU B 26 42.318 -15.135 60.716 1.00 15.65 C +ATOM 1242 CD2 LEU B 26 40.888 -17.159 61.010 1.00 15.48 C +ATOM 1243 N ASP B 27 37.096 -13.436 60.929 1.00 8.13 N +ATOM 1244 CA ASP B 27 36.103 -12.634 61.626 1.00 7.07 C +ATOM 1245 C ASP B 27 34.694 -13.209 61.508 1.00 7.64 C +ATOM 1246 O ASP B 27 33.921 -13.169 62.470 1.00 7.91 O +ATOM 1247 CB ASP B 27 36.155 -11.187 61.136 1.00 7.16 C +ATOM 1248 CG ASP B 27 37.445 -10.494 61.533 1.00 11.83 C +ATOM 1249 OD1 ASP B 27 38.008 -10.859 62.590 1.00 13.94 O +ATOM 1250 OD2 ASP B 27 37.894 -9.586 60.805 1.00 9.25 O +ATOM 1251 N VAL B 28 34.356 -13.751 60.342 1.00 7.89 N +ATOM 1252 CA VAL B 28 33.037 -14.357 60.160 1.00 7.06 C +ATOM 1253 C VAL B 28 32.926 -15.562 61.097 1.00 9.16 C +ATOM 1254 O VAL B 28 31.903 -15.760 61.754 1.00 7.46 O +ATOM 1255 CB VAL B 28 32.816 -14.809 58.693 1.00 6.73 C +ATOM 1256 CG1 VAL B 28 31.580 -15.694 58.589 1.00 7.73 C +ATOM 1257 CG2 VAL B 28 32.634 -13.586 57.804 1.00 7.11 C +ATOM 1258 N ARG B 29 33.987 -16.359 61.174 1.00 8.79 N +ATOM 1259 CA ARG B 29 33.973 -17.523 62.054 1.00 7.46 C +ATOM 1260 C ARG B 29 33.776 -17.098 63.509 1.00 8.15 C +ATOM 1261 O ARG B 29 33.002 -17.712 64.242 1.00 9.77 O +ATOM 1262 CB ARG B 29 35.277 -18.318 61.898 1.00 8.24 C +ATOM 1263 CG ARG B 29 35.368 -19.078 60.575 1.00 9.41 C +ATOM 1264 CD ARG B 29 36.749 -19.682 60.375 1.00 8.70 C +ATOM 1265 NE ARG B 29 36.866 -20.456 59.139 1.00 8.62 N +ATOM 1266 CZ ARG B 29 36.483 -21.722 59.003 1.00 8.78 C +ATOM 1267 NH1 ARG B 29 35.950 -22.369 60.030 1.00 9.82 N +ATOM 1268 NH2 ARG B 29 36.656 -22.349 57.843 1.00 7.70 N +ATOM 1269 N SER B 30 34.465 -16.037 63.918 1.00 8.47 N +ATOM 1270 CA SER B 30 34.359 -15.538 65.287 1.00 8.70 C +ATOM 1271 C SER B 30 32.961 -15.039 65.643 1.00 11.97 C +ATOM 1272 O SER B 30 32.552 -15.105 66.807 1.00 10.24 O +ATOM 1273 CB SER B 30 35.365 -14.405 65.520 1.00 10.41 C +ATOM 1274 OG SER B 30 36.696 -14.894 65.528 1.00 11.54 O +ATOM 1275 N SER B 31 32.233 -14.544 64.644 1.00 9.60 N +ATOM 1276 CA SER B 31 30.889 -14.011 64.854 1.00 10.45 C +ATOM 1277 C SER B 31 29.856 -15.081 65.192 1.00 14.38 C +ATOM 1278 O SER B 31 28.767 -14.765 65.677 1.00 12.30 O +ATOM 1279 CB SER B 31 30.422 -13.255 63.607 1.00 11.04 C +ATOM 1280 OG SER B 31 30.032 -14.161 62.589 1.00 12.20 O +ATOM 1281 N GLY B 32 30.193 -16.340 64.928 1.00 10.52 N +ATOM 1282 CA GLY B 32 29.270 -17.425 65.206 1.00 11.98 C +ATOM 1283 C GLY B 32 28.446 -17.773 63.980 1.00 13.86 C +ATOM 1284 O GLY B 32 27.744 -18.785 63.947 1.00 12.72 O +ATOM 1285 N SER B 33 28.535 -16.928 62.959 1.00 10.25 N +ATOM 1286 CA SER B 33 27.795 -17.154 61.730 1.00 10.12 C +ATOM 1287 C SER B 33 28.492 -18.175 60.842 1.00 13.27 C +ATOM 1288 O SER B 33 29.716 -18.303 60.857 1.00 14.12 O +ATOM 1289 CB SER B 33 27.634 -15.844 60.953 1.00 11.43 C +ATOM 1290 OG SER B 33 26.877 -16.052 59.770 1.00 9.60 O +ATOM 1291 N LYS B 34 27.692 -18.904 60.075 1.00 12.90 N +ATOM 1292 CA LYS B 34 28.201 -19.903 59.151 1.00 16.28 C +ATOM 1293 C LYS B 34 28.040 -19.350 57.738 1.00 15.90 C +ATOM 1294 O LYS B 34 28.468 -19.973 56.766 1.00 17.22 O +ATOM 1295 CB LYS B 34 27.387 -21.195 59.265 1.00 20.08 C +ATOM 1296 CG LYS B 34 27.424 -21.879 60.621 1.00 26.09 C +ATOM 1297 CD LYS B 34 28.788 -22.475 60.911 1.00 34.94 C +ATOM 1298 CE LYS B 34 28.685 -23.580 61.956 1.00 40.70 C +ATOM 1299 NZ LYS B 34 27.976 -23.125 63.184 1.00 42.62 N +ATOM 1300 N LYS B 35 27.418 -18.177 57.635 1.00 15.00 N +ATOM 1301 CA LYS B 35 27.156 -17.559 56.339 1.00 11.11 C +ATOM 1302 C LYS B 35 27.487 -16.076 56.267 1.00 10.39 C +ATOM 1303 O LYS B 35 27.381 -15.347 57.255 1.00 11.24 O +ATOM 1304 CB LYS B 35 25.683 -17.740 55.977 1.00 15.77 C +ATOM 1305 CG LYS B 35 25.189 -19.176 56.068 1.00 20.51 C +ATOM 1306 CD LYS B 35 23.718 -19.269 55.693 1.00 27.36 C +ATOM 1307 CE LYS B 35 23.207 -20.698 55.805 1.00 30.29 C +ATOM 1308 NZ LYS B 35 21.767 -20.799 55.436 1.00 32.88 N +ATOM 1309 N THR B 36 27.878 -15.635 55.080 1.00 9.45 N +ATOM 1310 CA THR B 36 28.195 -14.235 54.860 1.00 6.93 C +ATOM 1311 C THR B 36 28.056 -13.890 53.388 1.00 9.04 C +ATOM 1312 O THR B 36 28.339 -14.711 52.515 1.00 8.55 O +ATOM 1313 CB THR B 36 29.639 -13.890 55.312 1.00 8.94 C +ATOM 1314 OG1 THR B 36 29.877 -12.488 55.108 1.00 7.64 O +ATOM 1315 CG2 THR B 36 30.668 -14.686 54.509 1.00 8.11 C +ATOM 1316 N THR B 37 27.575 -12.685 53.116 1.00 6.55 N +ATOM 1317 CA THR B 37 27.456 -12.220 51.747 1.00 7.22 C +ATOM 1318 C THR B 37 28.550 -11.157 51.653 1.00 8.96 C +ATOM 1319 O THR B 37 28.499 -10.132 52.332 1.00 10.00 O +ATOM 1320 CB THR B 37 26.045 -11.642 51.461 1.00 9.54 C +ATOM 1321 OG1 THR B 37 26.030 -11.052 50.157 1.00 19.34 O +ATOM 1322 CG2 THR B 37 25.651 -10.610 52.505 1.00 10.53 C +ATOM 1323 N ILE B 38 29.562 -11.441 50.837 1.00 8.16 N +ATOM 1324 CA ILE B 38 30.718 -10.567 50.672 1.00 8.94 C +ATOM 1325 C ILE B 38 30.612 -9.660 49.451 1.00 10.05 C +ATOM 1326 O ILE B 38 30.499 -10.126 48.319 1.00 9.73 O +ATOM 1327 CB ILE B 38 32.004 -11.415 50.574 1.00 7.92 C +ATOM 1328 CG1 ILE B 38 32.062 -12.379 51.763 1.00 9.45 C +ATOM 1329 CG2 ILE B 38 33.238 -10.515 50.565 1.00 8.79 C +ATOM 1330 CD1 ILE B 38 33.220 -13.372 51.715 1.00 7.50 C +ATOM 1331 N ASN B 39 30.662 -8.357 49.696 1.00 6.83 N +ATOM 1332 CA ASN B 39 30.555 -7.375 48.632 1.00 7.60 C +ATOM 1333 C ASN B 39 31.892 -6.676 48.469 1.00 7.50 C +ATOM 1334 O ASN B 39 32.391 -6.020 49.387 1.00 7.74 O +ATOM 1335 CB ASN B 39 29.431 -6.397 48.972 1.00 6.86 C +ATOM 1336 CG ASN B 39 28.067 -7.076 48.974 1.00 9.10 C +ATOM 1337 OD1 ASN B 39 27.369 -7.091 47.962 1.00 8.69 O +ATOM 1338 ND2 ASN B 39 27.695 -7.661 50.108 1.00 7.52 N +ATOM 1339 N VAL B 40 32.458 -6.839 47.279 1.00 7.15 N +ATOM 1340 CA VAL B 40 33.767 -6.311 46.936 1.00 7.12 C +ATOM 1341 C VAL B 40 33.661 -5.146 45.967 1.00 5.32 C +ATOM 1342 O VAL B 40 33.176 -5.295 44.850 1.00 7.18 O +ATOM 1343 CB VAL B 40 34.619 -7.420 46.298 1.00 7.37 C +ATOM 1344 CG1 VAL B 40 36.071 -6.974 46.193 1.00 8.05 C +ATOM 1345 CG2 VAL B 40 34.495 -8.707 47.128 1.00 8.26 C +ATOM 1346 N PHE B 41 34.125 -3.985 46.407 1.00 6.40 N +ATOM 1347 CA PHE B 41 34.074 -2.781 45.595 1.00 7.08 C +ATOM 1348 C PHE B 41 35.436 -2.650 44.936 1.00 8.59 C +ATOM 1349 O PHE B 41 36.407 -2.182 45.533 1.00 9.38 O +ATOM 1350 CB PHE B 41 33.711 -1.605 46.501 1.00 7.78 C +ATOM 1351 CG PHE B 41 32.379 -1.790 47.188 1.00 6.03 C +ATOM 1352 CD1 PHE B 41 31.199 -1.394 46.565 1.00 7.43 C +ATOM 1353 CD2 PHE B 41 32.299 -2.440 48.419 1.00 9.83 C +ATOM 1354 CE1 PHE B 41 29.961 -1.645 47.155 1.00 7.05 C +ATOM 1355 CE2 PHE B 41 31.067 -2.696 49.017 1.00 6.67 C +ATOM 1356 CZ PHE B 41 29.894 -2.297 48.381 1.00 8.89 C +ATOM 1357 N THR B 42 35.482 -3.107 43.690 1.00 7.50 N +ATOM 1358 CA THR B 42 36.710 -3.151 42.912 1.00 8.15 C +ATOM 1359 C THR B 42 36.402 -3.075 41.421 1.00 9.00 C +ATOM 1360 O THR B 42 35.268 -3.300 40.997 1.00 9.92 O +ATOM 1361 CB THR B 42 37.437 -4.487 43.196 1.00 8.93 C +ATOM 1362 OG1 THR B 42 38.652 -4.557 42.448 1.00 10.65 O +ATOM 1363 CG2 THR B 42 36.541 -5.666 42.806 1.00 11.87 C +ATOM 1364 N GLU B 43 37.422 -2.775 40.624 1.00 10.57 N +ATOM 1365 CA GLU B 43 37.249 -2.693 39.181 1.00 12.53 C +ATOM 1366 C GLU B 43 37.648 -3.989 38.483 1.00 14.07 C +ATOM 1367 O GLU B 43 37.383 -4.157 37.293 1.00 16.11 O +ATOM 1368 CB GLU B 43 38.075 -1.536 38.611 1.00 16.12 C +ATOM 1369 CG GLU B 43 37.726 -0.181 39.197 1.00 15.81 C +ATOM 1370 CD GLU B 43 36.268 0.189 38.986 1.00 23.61 C +ATOM 1371 OE1 GLU B 43 35.846 0.301 37.816 1.00 24.60 O +ATOM 1372 OE2 GLU B 43 35.545 0.365 39.989 1.00 18.58 O +ATOM 1373 N ILE B 44 38.278 -4.910 39.208 1.00 14.38 N +ATOM 1374 CA ILE B 44 38.701 -6.163 38.588 1.00 13.44 C +ATOM 1375 C ILE B 44 37.572 -7.170 38.400 1.00 15.13 C +ATOM 1376 O ILE B 44 36.524 -7.074 39.036 1.00 15.84 O +ATOM 1377 CB ILE B 44 39.841 -6.843 39.375 1.00 14.02 C +ATOM 1378 CG1 ILE B 44 39.340 -7.340 40.733 1.00 11.19 C +ATOM 1379 CG2 ILE B 44 40.994 -5.866 39.553 1.00 16.33 C +ATOM 1380 CD1 ILE B 44 40.359 -8.210 41.455 1.00 15.68 C +ATOM 1381 N GLN B 45 37.807 -8.134 37.514 1.00 16.76 N +ATOM 1382 CA GLN B 45 36.832 -9.174 37.202 1.00 19.24 C +ATOM 1383 C GLN B 45 36.789 -10.271 38.260 1.00 16.19 C +ATOM 1384 O GLN B 45 37.752 -10.479 38.996 1.00 14.16 O +ATOM 1385 CB GLN B 45 37.155 -9.808 35.845 1.00 24.48 C +ATOM 1386 CG GLN B 45 37.228 -8.825 34.687 1.00 36.32 C +ATOM 1387 CD GLN B 45 35.945 -8.039 34.503 1.00 44.19 C +ATOM 1388 OE1 GLN B 45 35.594 -7.194 35.328 1.00 48.12 O +ATOM 1389 NE2 GLN B 45 35.232 -8.317 33.416 1.00 48.87 N +ATOM 1390 N TYR B 46 35.667 -10.979 38.312 1.00 14.44 N +ATOM 1391 CA TYR B 46 35.469 -12.063 39.267 1.00 15.86 C +ATOM 1392 C TYR B 46 36.586 -13.102 39.193 1.00 15.61 C +ATOM 1393 O TYR B 46 37.147 -13.498 40.215 1.00 13.79 O +ATOM 1394 CB TYR B 46 34.119 -12.740 39.004 1.00 18.12 C +ATOM 1395 CG TYR B 46 33.872 -13.978 39.836 1.00 21.54 C +ATOM 1396 CD1 TYR B 46 33.393 -13.885 41.142 1.00 25.49 C +ATOM 1397 CD2 TYR B 46 34.141 -15.242 39.324 1.00 25.07 C +ATOM 1398 CE1 TYR B 46 33.190 -15.030 41.917 1.00 27.73 C +ATOM 1399 CE2 TYR B 46 33.944 -16.387 40.088 1.00 28.82 C +ATOM 1400 CZ TYR B 46 33.470 -16.274 41.381 1.00 26.16 C +ATOM 1401 OH TYR B 46 33.292 -17.410 42.136 1.00 35.66 O +ATOM 1402 N GLN B 47 36.904 -13.545 37.980 1.00 14.94 N +ATOM 1403 CA GLN B 47 37.942 -14.550 37.785 1.00 16.78 C +ATOM 1404 C GLN B 47 39.307 -14.112 38.297 1.00 13.48 C +ATOM 1405 O GLN B 47 40.060 -14.923 38.834 1.00 14.27 O +ATOM 1406 CB GLN B 47 38.049 -14.931 36.306 1.00 22.36 C +ATOM 1407 CG GLN B 47 36.854 -15.712 35.777 1.00 35.45 C +ATOM 1408 CD GLN B 47 36.478 -16.881 36.668 1.00 40.51 C +ATOM 1409 OE1 GLN B 47 37.328 -17.687 37.049 1.00 47.75 O +ATOM 1410 NE2 GLN B 47 35.195 -16.982 37.001 1.00 44.08 N +ATOM 1411 N GLU B 48 39.635 -12.835 38.127 1.00 14.84 N +ATOM 1412 CA GLU B 48 40.919 -12.340 38.598 1.00 15.28 C +ATOM 1413 C GLU B 48 40.953 -12.332 40.122 1.00 11.23 C +ATOM 1414 O GLU B 48 41.966 -12.685 40.728 1.00 12.95 O +ATOM 1415 CB GLU B 48 41.194 -10.929 38.068 1.00 19.97 C +ATOM 1416 CG GLU B 48 42.401 -10.274 38.728 1.00 27.02 C +ATOM 1417 CD GLU B 48 42.936 -9.080 37.961 1.00 35.49 C +ATOM 1418 OE1 GLU B 48 42.132 -8.218 37.548 1.00 40.04 O +ATOM 1419 OE2 GLU B 48 44.169 -8.997 37.783 1.00 40.61 O +ATOM 1420 N LEU B 49 39.846 -11.926 40.736 1.00 11.02 N +ATOM 1421 CA LEU B 49 39.762 -11.885 42.193 1.00 11.31 C +ATOM 1422 C LEU B 49 39.961 -13.280 42.770 1.00 10.26 C +ATOM 1423 O LEU B 49 40.787 -13.481 43.656 1.00 9.70 O +ATOM 1424 CB LEU B 49 38.404 -11.336 42.644 1.00 10.72 C +ATOM 1425 CG LEU B 49 38.112 -11.444 44.146 1.00 11.65 C +ATOM 1426 CD1 LEU B 49 39.136 -10.645 44.939 1.00 10.78 C +ATOM 1427 CD2 LEU B 49 36.704 -10.938 44.434 1.00 11.81 C +ATOM 1428 N VAL B 50 39.202 -14.244 42.261 1.00 10.32 N +ATOM 1429 CA VAL B 50 39.306 -15.613 42.748 1.00 10.38 C +ATOM 1430 C VAL B 50 40.726 -16.154 42.600 1.00 10.88 C +ATOM 1431 O VAL B 50 41.206 -16.896 43.455 1.00 13.41 O +ATOM 1432 CB VAL B 50 38.310 -16.535 42.016 1.00 13.49 C +ATOM 1433 CG1 VAL B 50 38.539 -17.985 42.420 1.00 17.72 C +ATOM 1434 CG2 VAL B 50 36.884 -16.117 42.361 1.00 15.41 C +ATOM 1435 N THR B 51 41.407 -15.783 41.523 1.00 11.07 N +ATOM 1436 CA THR B 51 42.776 -16.248 41.341 1.00 10.86 C +ATOM 1437 C THR B 51 43.654 -15.720 42.478 1.00 11.23 C +ATOM 1438 O THR B 51 44.450 -16.459 43.060 1.00 10.30 O +ATOM 1439 CB THR B 51 43.347 -15.788 39.984 1.00 12.39 C +ATOM 1440 OG1 THR B 51 42.631 -16.439 38.926 1.00 15.79 O +ATOM 1441 CG2 THR B 51 44.827 -16.145 39.877 1.00 18.33 C +ATOM 1442 N LEU B 52 43.487 -14.445 42.810 1.00 9.34 N +ATOM 1443 CA LEU B 52 44.268 -13.828 43.879 1.00 9.57 C +ATOM 1444 C LEU B 52 43.998 -14.404 45.271 1.00 11.04 C +ATOM 1445 O LEU B 52 44.922 -14.555 46.074 1.00 9.13 O +ATOM 1446 CB LEU B 52 44.007 -12.317 43.913 1.00 10.77 C +ATOM 1447 CG LEU B 52 44.517 -11.502 42.726 1.00 12.17 C +ATOM 1448 CD1 LEU B 52 43.986 -10.074 42.826 1.00 9.44 C +ATOM 1449 CD2 LEU B 52 46.042 -11.518 42.710 1.00 12.47 C +ATOM 1450 N ILE B 53 42.737 -14.722 45.555 1.00 9.03 N +ATOM 1451 CA ILE B 53 42.364 -15.239 46.870 1.00 7.73 C +ATOM 1452 C ILE B 53 42.152 -16.749 46.942 1.00 7.93 C +ATOM 1453 O ILE B 53 41.464 -17.244 47.836 1.00 8.40 O +ATOM 1454 CB ILE B 53 41.103 -14.523 47.406 1.00 5.70 C +ATOM 1455 CG1 ILE B 53 39.873 -14.863 46.556 1.00 6.12 C +ATOM 1456 CG2 ILE B 53 41.334 -13.011 47.401 1.00 9.05 C +ATOM 1457 CD1 ILE B 53 38.572 -14.312 47.139 1.00 8.25 C +ATOM 1458 N ARG B 54 42.758 -17.477 46.014 1.00 9.29 N +ATOM 1459 CA ARG B 54 42.631 -18.928 45.974 1.00 9.99 C +ATOM 1460 C ARG B 54 42.875 -19.572 47.327 1.00 8.02 C +ATOM 1461 O ARG B 54 42.100 -20.417 47.756 1.00 9.00 O +ATOM 1462 CB ARG B 54 43.621 -19.514 44.970 1.00 10.84 C +ATOM 1463 CG ARG B 54 43.545 -21.034 44.825 1.00 15.54 C +ATOM 1464 CD ARG B 54 44.889 -21.574 44.350 1.00 25.54 C +ATOM 1465 NE ARG B 54 45.874 -21.548 45.431 1.00 35.40 N +ATOM 1466 CZ ARG B 54 45.931 -22.444 46.417 1.00 35.95 C +ATOM 1467 NH1 ARG B 54 46.855 -22.337 47.363 1.00 34.18 N +ATOM 1468 NH2 ARG B 54 45.084 -23.463 46.445 1.00 36.89 N +ATOM 1469 N GLU B 55 43.955 -19.179 48.001 1.00 7.65 N +ATOM 1470 CA GLU B 55 44.280 -19.755 49.306 1.00 8.27 C +ATOM 1471 C GLU B 55 43.230 -19.447 50.378 1.00 8.18 C +ATOM 1472 O GLU B 55 42.825 -20.334 51.128 1.00 7.81 O +ATOM 1473 CB GLU B 55 45.660 -19.268 49.765 1.00 7.59 C +ATOM 1474 CG GLU B 55 46.121 -19.813 51.110 1.00 9.10 C +ATOM 1475 CD GLU B 55 46.189 -21.334 51.151 1.00 11.01 C +ATOM 1476 OE1 GLU B 55 46.581 -21.942 50.133 1.00 11.02 O +ATOM 1477 OE2 GLU B 55 45.871 -21.924 52.210 1.00 14.73 O +ATOM 1478 N ALA B 56 42.780 -18.197 50.450 1.00 5.58 N +ATOM 1479 CA ALA B 56 41.766 -17.826 51.441 1.00 8.49 C +ATOM 1480 C ALA B 56 40.509 -18.678 51.253 1.00 6.38 C +ATOM 1481 O ALA B 56 39.930 -19.169 52.222 1.00 7.61 O +ATOM 1482 CB ALA B 56 41.421 -16.341 51.305 1.00 7.15 C +ATOM 1483 N LEU B 57 40.087 -18.854 50.003 1.00 6.97 N +ATOM 1484 CA LEU B 57 38.895 -19.654 49.723 1.00 6.21 C +ATOM 1485 C LEU B 57 39.125 -21.130 50.040 1.00 6.89 C +ATOM 1486 O LEU B 57 38.231 -21.810 50.550 1.00 7.94 O +ATOM 1487 CB LEU B 57 38.481 -19.495 48.256 1.00 6.42 C +ATOM 1488 CG LEU B 57 38.129 -18.065 47.838 1.00 5.28 C +ATOM 1489 CD1 LEU B 57 37.753 -18.044 46.360 1.00 9.60 C +ATOM 1490 CD2 LEU B 57 36.975 -17.546 48.688 1.00 8.97 C +ATOM 1491 N LEU B 58 40.328 -21.617 49.746 1.00 7.19 N +ATOM 1492 CA LEU B 58 40.682 -23.014 50.003 1.00 6.27 C +ATOM 1493 C LEU B 58 40.545 -23.373 51.479 1.00 7.53 C +ATOM 1494 O LEU B 58 40.129 -24.481 51.820 1.00 8.25 O +ATOM 1495 CB LEU B 58 42.121 -23.282 49.548 1.00 6.35 C +ATOM 1496 CG LEU B 58 42.717 -24.658 49.858 1.00 7.35 C +ATOM 1497 CD1 LEU B 58 41.888 -25.747 49.182 1.00 7.89 C +ATOM 1498 CD2 LEU B 58 44.163 -24.708 49.380 1.00 10.98 C +ATOM 1499 N GLU B 59 40.896 -22.431 52.349 1.00 7.39 N +ATOM 1500 CA GLU B 59 40.833 -22.649 53.795 1.00 5.78 C +ATOM 1501 C GLU B 59 39.439 -22.459 54.377 1.00 7.88 C +ATOM 1502 O GLU B 59 39.225 -22.688 55.567 1.00 7.81 O +ATOM 1503 CB GLU B 59 41.794 -21.689 54.508 1.00 7.90 C +ATOM 1504 CG GLU B 59 43.269 -21.913 54.189 1.00 9.78 C +ATOM 1505 CD GLU B 59 44.161 -20.852 54.813 1.00 14.31 C +ATOM 1506 OE1 GLU B 59 43.781 -20.303 55.868 1.00 14.64 O +ATOM 1507 OE2 GLU B 59 45.246 -20.578 54.261 1.00 12.79 O +ATOM 1508 N ASN B 60 38.487 -22.056 53.543 1.00 7.83 N +ATOM 1509 CA ASN B 60 37.139 -21.803 54.034 1.00 6.84 C +ATOM 1510 C ASN B 60 36.024 -22.395 53.193 1.00 9.20 C +ATOM 1511 O ASN B 60 34.979 -21.777 52.989 1.00 7.74 O +ATOM 1512 CB ASN B 60 36.959 -20.295 54.187 1.00 7.58 C +ATOM 1513 CG ASN B 60 37.812 -19.737 55.302 1.00 7.35 C +ATOM 1514 OD1 ASN B 60 37.463 -19.854 56.474 1.00 8.74 O +ATOM 1515 ND2 ASN B 60 38.955 -19.151 54.947 1.00 7.82 N +ATOM 1516 N ILE B 61 36.254 -23.612 52.716 1.00 7.19 N +ATOM 1517 CA ILE B 61 35.274 -24.308 51.903 1.00 8.45 C +ATOM 1518 C ILE B 61 33.970 -24.537 52.664 1.00 6.57 C +ATOM 1519 O ILE B 61 32.893 -24.505 52.067 1.00 7.89 O +ATOM 1520 CB ILE B 61 35.847 -25.659 51.421 1.00 5.90 C +ATOM 1521 CG1 ILE B 61 36.984 -25.406 50.425 1.00 9.41 C +ATOM 1522 CG2 ILE B 61 34.754 -26.509 50.796 1.00 8.75 C +ATOM 1523 CD1 ILE B 61 37.798 -26.654 50.073 1.00 8.14 C +ATOM 1524 N ASP B 62 34.053 -24.753 53.977 1.00 7.51 N +ATOM 1525 CA ASP B 62 32.839 -24.992 54.752 1.00 7.54 C +ATOM 1526 C ASP B 62 32.080 -23.742 55.198 1.00 8.49 C +ATOM 1527 O ASP B 62 31.092 -23.839 55.927 1.00 9.19 O +ATOM 1528 CB ASP B 62 33.125 -25.913 55.954 1.00 8.95 C +ATOM 1529 CG ASP B 62 34.151 -25.345 56.931 1.00 11.12 C +ATOM 1530 OD1 ASP B 62 34.862 -24.373 56.603 1.00 11.35 O +ATOM 1531 OD2 ASP B 62 34.250 -25.905 58.043 1.00 12.08 O +ATOM 1532 N ILE B 63 32.526 -22.570 54.754 1.00 6.73 N +ATOM 1533 CA ILE B 63 31.831 -21.333 55.099 1.00 7.47 C +ATOM 1534 C ILE B 63 30.831 -21.025 53.983 1.00 6.96 C +ATOM 1535 O ILE B 63 31.175 -21.080 52.801 1.00 8.12 O +ATOM 1536 CB ILE B 63 32.812 -20.143 55.247 1.00 7.47 C +ATOM 1537 CG1 ILE B 63 33.789 -20.415 56.397 1.00 8.97 C +ATOM 1538 CG2 ILE B 63 32.041 -18.852 55.484 1.00 9.26 C +ATOM 1539 CD1 ILE B 63 33.126 -20.594 57.752 1.00 13.96 C +ATOM 1540 N GLY B 64 29.594 -20.718 54.361 1.00 8.71 N +ATOM 1541 CA GLY B 64 28.574 -20.414 53.371 1.00 9.81 C +ATOM 1542 C GLY B 64 28.652 -18.974 52.900 1.00 11.60 C +ATOM 1543 O GLY B 64 27.928 -18.109 53.392 1.00 16.00 O +ATOM 1544 N TYR B 65 29.521 -18.716 51.931 1.00 9.38 N +ATOM 1545 CA TYR B 65 29.691 -17.360 51.422 1.00 9.58 C +ATOM 1546 C TYR B 65 29.271 -17.191 49.968 1.00 9.17 C +ATOM 1547 O TYR B 65 29.208 -18.152 49.198 1.00 10.42 O +ATOM 1548 CB TYR B 65 31.159 -16.940 51.560 1.00 8.00 C +ATOM 1549 CG TYR B 65 32.102 -17.727 50.671 1.00 8.44 C +ATOM 1550 CD1 TYR B 65 32.355 -17.325 49.358 1.00 8.81 C +ATOM 1551 CD2 TYR B 65 32.707 -18.900 51.130 1.00 7.86 C +ATOM 1552 CE1 TYR B 65 33.186 -18.072 48.522 1.00 9.11 C +ATOM 1553 CE2 TYR B 65 33.542 -19.655 50.300 1.00 7.54 C +ATOM 1554 CZ TYR B 65 33.773 -19.233 48.997 1.00 8.70 C +ATOM 1555 OH TYR B 65 34.584 -19.970 48.162 1.00 8.32 O +ATOM 1556 N GLU B 66 28.971 -15.950 49.609 1.00 9.95 N +ATOM 1557 CA GLU B 66 28.626 -15.599 48.244 1.00 10.88 C +ATOM 1558 C GLU B 66 29.390 -14.316 47.987 1.00 10.98 C +ATOM 1559 O GLU B 66 29.493 -13.463 48.869 1.00 11.96 O +ATOM 1560 CB GLU B 66 27.117 -15.390 48.066 1.00 16.40 C +ATOM 1561 CG GLU B 66 26.420 -14.541 49.113 1.00 22.87 C +ATOM 1562 CD GLU B 66 24.932 -14.377 48.814 1.00 29.66 C +ATOM 1563 OE1 GLU B 66 24.317 -15.340 48.309 1.00 28.07 O +ATOM 1564 OE2 GLU B 66 24.372 -13.294 49.089 1.00 28.91 O +ATOM 1565 N LEU B 67 29.958 -14.200 46.793 1.00 10.09 N +ATOM 1566 CA LEU B 67 30.736 -13.023 46.438 1.00 9.45 C +ATOM 1567 C LEU B 67 30.013 -12.174 45.404 1.00 9.82 C +ATOM 1568 O LEU B 67 29.510 -12.684 44.405 1.00 9.58 O +ATOM 1569 CB LEU B 67 32.098 -13.436 45.864 1.00 10.31 C +ATOM 1570 CG LEU B 67 33.024 -14.359 46.663 1.00 12.61 C +ATOM 1571 CD1 LEU B 67 34.260 -14.652 45.824 1.00 14.54 C +ATOM 1572 CD2 LEU B 67 33.416 -13.716 47.986 1.00 16.56 C +ATOM 1573 N PHE B 68 29.965 -10.874 45.655 1.00 7.13 N +ATOM 1574 CA PHE B 68 29.349 -9.941 44.731 1.00 8.35 C +ATOM 1575 C PHE B 68 30.373 -8.842 44.496 1.00 8.15 C +ATOM 1576 O PHE B 68 30.893 -8.265 45.452 1.00 9.87 O +ATOM 1577 CB PHE B 68 28.079 -9.342 45.338 1.00 6.56 C +ATOM 1578 CG PHE B 68 26.940 -10.313 45.438 1.00 11.63 C +ATOM 1579 CD1 PHE B 68 26.211 -10.667 44.306 1.00 15.37 C +ATOM 1580 CD2 PHE B 68 26.596 -10.875 46.662 1.00 12.83 C +ATOM 1581 CE1 PHE B 68 25.152 -11.568 44.393 1.00 13.27 C +ATOM 1582 CE2 PHE B 68 25.539 -11.778 46.760 1.00 15.36 C +ATOM 1583 CZ PHE B 68 24.817 -12.124 45.626 1.00 16.24 C +ATOM 1584 N LEU B 69 30.692 -8.578 43.234 1.00 5.68 N +ATOM 1585 CA LEU B 69 31.650 -7.527 42.914 1.00 4.44 C +ATOM 1586 C LEU B 69 30.907 -6.317 42.384 1.00 6.39 C +ATOM 1587 O LEU B 69 29.952 -6.459 41.617 1.00 7.09 O +ATOM 1588 CB LEU B 69 32.661 -8.008 41.873 1.00 5.18 C +ATOM 1589 CG LEU B 69 33.798 -8.882 42.412 1.00 10.26 C +ATOM 1590 CD1 LEU B 69 33.221 -10.151 43.019 1.00 11.61 C +ATOM 1591 CD2 LEU B 69 34.768 -9.215 41.286 1.00 11.86 C +ATOM 1592 N TRP B 70 31.340 -5.130 42.800 1.00 6.32 N +ATOM 1593 CA TRP B 70 30.705 -3.894 42.360 1.00 6.17 C +ATOM 1594 C TRP B 70 31.718 -2.869 41.889 1.00 6.61 C +ATOM 1595 O TRP B 70 32.664 -2.547 42.611 1.00 7.06 O +ATOM 1596 CB TRP B 70 29.895 -3.267 43.501 1.00 7.19 C +ATOM 1597 CG TRP B 70 28.922 -4.198 44.142 1.00 8.42 C +ATOM 1598 CD1 TRP B 70 29.044 -4.803 45.358 1.00 9.62 C +ATOM 1599 CD2 TRP B 70 27.671 -4.631 43.600 1.00 10.62 C +ATOM 1600 NE1 TRP B 70 27.941 -5.588 45.610 1.00 8.49 N +ATOM 1601 CE2 TRP B 70 27.083 -5.499 44.545 1.00 7.83 C +ATOM 1602 CE3 TRP B 70 26.989 -4.369 42.403 1.00 11.10 C +ATOM 1603 CZ2 TRP B 70 25.840 -6.108 44.333 1.00 10.76 C +ATOM 1604 CZ3 TRP B 70 25.756 -4.974 42.191 1.00 13.52 C +ATOM 1605 CH2 TRP B 70 25.194 -5.835 43.152 1.00 12.87 C +ATOM 1606 N LYS B 71 31.529 -2.358 40.679 1.00 7.61 N +ATOM 1607 CA LYS B 71 32.419 -1.326 40.172 1.00 6.82 C +ATOM 1608 C LYS B 71 32.048 -0.038 40.905 1.00 7.46 C +ATOM 1609 O LYS B 71 30.964 0.055 41.489 1.00 8.76 O +ATOM 1610 CB LYS B 71 32.262 -1.184 38.657 1.00 10.45 C +ATOM 1611 CG LYS B 71 32.688 -2.447 37.920 1.00 14.60 C +ATOM 1612 CD LYS B 71 32.776 -2.235 36.424 1.00 21.45 C +ATOM 1613 CE LYS B 71 33.170 -3.528 35.718 1.00 28.85 C +ATOM 1614 NZ LYS B 71 34.417 -4.119 36.279 1.00 29.47 N +ATOM 1615 N LYS B 72 32.934 0.952 40.881 1.00 10.20 N +ATOM 1616 CA LYS B 72 32.683 2.190 41.615 1.00 10.67 C +ATOM 1617 C LYS B 72 31.363 2.895 41.325 1.00 11.13 C +ATOM 1618 O LYS B 72 30.823 3.562 42.204 1.00 12.36 O +ATOM 1619 CB LYS B 72 33.845 3.175 41.423 1.00 12.82 C +ATOM 1620 CG LYS B 72 34.057 3.639 40.001 1.00 18.96 C +ATOM 1621 CD LYS B 72 35.183 4.664 39.913 1.00 28.19 C +ATOM 1622 CE LYS B 72 36.520 4.078 40.352 1.00 32.59 C +ATOM 1623 NZ LYS B 72 37.623 5.080 40.287 1.00 35.96 N +ATOM 1624 N ASN B 73 30.832 2.751 40.113 1.00 8.90 N +ATOM 1625 CA ASN B 73 29.574 3.414 39.788 1.00 9.56 C +ATOM 1626 C ASN B 73 28.354 2.527 40.037 1.00 10.10 C +ATOM 1627 O ASN B 73 27.233 2.896 39.693 1.00 10.34 O +ATOM 1628 CB ASN B 73 29.592 3.918 38.328 1.00 8.81 C +ATOM 1629 CG ASN B 73 29.639 2.794 37.304 1.00 10.55 C +ATOM 1630 OD1 ASN B 73 29.998 1.660 37.616 1.00 12.03 O +ATOM 1631 ND2 ASN B 73 29.290 3.117 36.060 1.00 9.29 N +ATOM 1632 N GLU B 74 28.569 1.373 40.666 1.00 9.00 N +ATOM 1633 CA GLU B 74 27.469 0.454 40.940 1.00 6.85 C +ATOM 1634 C GLU B 74 27.067 0.383 42.410 1.00 8.04 C +ATOM 1635 O GLU B 74 26.327 -0.515 42.811 1.00 7.33 O +ATOM 1636 CB GLU B 74 27.822 -0.950 40.445 1.00 9.08 C +ATOM 1637 CG GLU B 74 28.150 -1.011 38.957 1.00 8.15 C +ATOM 1638 CD GLU B 74 28.526 -2.404 38.503 1.00 12.67 C +ATOM 1639 OE1 GLU B 74 29.315 -3.068 39.207 1.00 10.13 O +ATOM 1640 OE2 GLU B 74 28.042 -2.832 37.435 1.00 15.47 O +ATOM 1641 N VAL B 75 27.546 1.323 43.217 1.00 6.01 N +ATOM 1642 CA VAL B 75 27.194 1.309 44.628 1.00 6.91 C +ATOM 1643 C VAL B 75 25.682 1.445 44.799 1.00 6.67 C +ATOM 1644 O VAL B 75 25.110 0.892 45.736 1.00 8.26 O +ATOM 1645 CB VAL B 75 27.912 2.439 45.412 1.00 7.12 C +ATOM 1646 CG1 VAL B 75 27.420 2.463 46.858 1.00 5.38 C +ATOM 1647 CG2 VAL B 75 29.418 2.209 45.390 1.00 6.09 C +ATOM 1648 N ASP B 76 25.025 2.163 43.893 1.00 6.82 N +ATOM 1649 CA ASP B 76 23.583 2.319 44.020 1.00 7.89 C +ATOM 1650 C ASP B 76 22.834 1.000 43.830 1.00 7.12 C +ATOM 1651 O ASP B 76 21.776 0.803 44.422 1.00 8.14 O +ATOM 1652 CB ASP B 76 23.051 3.404 43.064 1.00 7.64 C +ATOM 1653 CG ASP B 76 23.365 3.132 41.602 1.00 11.13 C +ATOM 1654 OD1 ASP B 76 24.132 2.203 41.297 1.00 10.63 O +ATOM 1655 OD2 ASP B 76 22.837 3.878 40.751 1.00 13.20 O +ATOM 1656 N ILE B 77 23.387 0.092 43.028 1.00 6.11 N +ATOM 1657 CA ILE B 77 22.744 -1.205 42.808 1.00 8.01 C +ATOM 1658 C ILE B 77 22.865 -2.010 44.101 1.00 8.15 C +ATOM 1659 O ILE B 77 21.906 -2.637 44.558 1.00 9.44 O +ATOM 1660 CB ILE B 77 23.425 -2.003 41.673 1.00 9.58 C +ATOM 1661 CG1 ILE B 77 23.411 -1.197 40.376 1.00 7.88 C +ATOM 1662 CG2 ILE B 77 22.686 -3.322 41.452 1.00 8.83 C +ATOM 1663 CD1 ILE B 77 24.174 -1.865 39.240 1.00 12.83 C +ATOM 1664 N PHE B 78 24.063 -1.987 44.677 1.00 6.79 N +ATOM 1665 CA PHE B 78 24.345 -2.679 45.931 1.00 8.25 C +ATOM 1666 C PHE B 78 23.391 -2.195 47.028 1.00 8.65 C +ATOM 1667 O PHE B 78 22.766 -2.994 47.732 1.00 7.35 O +ATOM 1668 CB PHE B 78 25.797 -2.404 46.343 1.00 8.13 C +ATOM 1669 CG PHE B 78 26.064 -2.614 47.804 1.00 9.18 C +ATOM 1670 CD1 PHE B 78 26.089 -3.896 48.347 1.00 11.50 C +ATOM 1671 CD2 PHE B 78 26.260 -1.525 48.647 1.00 9.14 C +ATOM 1672 CE1 PHE B 78 26.302 -4.091 49.710 1.00 12.70 C +ATOM 1673 CE2 PHE B 78 26.472 -1.709 50.011 1.00 8.09 C +ATOM 1674 CZ PHE B 78 26.492 -2.997 50.543 1.00 8.89 C +ATOM 1675 N LEU B 79 23.280 -0.879 47.174 1.00 6.99 N +ATOM 1676 CA LEU B 79 22.406 -0.309 48.195 1.00 8.19 C +ATOM 1677 C LEU B 79 20.935 -0.653 47.975 1.00 9.19 C +ATOM 1678 O LEU B 79 20.199 -0.903 48.933 1.00 10.56 O +ATOM 1679 CB LEU B 79 22.586 1.212 48.258 1.00 7.77 C +ATOM 1680 CG LEU B 79 23.921 1.718 48.820 1.00 5.84 C +ATOM 1681 CD1 LEU B 79 23.942 3.241 48.802 1.00 6.51 C +ATOM 1682 CD2 LEU B 79 24.111 1.209 50.245 1.00 8.59 C +ATOM 1683 N LYS B 80 20.506 -0.667 46.717 1.00 8.80 N +ATOM 1684 CA LYS B 80 19.117 -0.992 46.399 1.00 11.21 C +ATOM 1685 C LYS B 80 18.807 -2.433 46.794 1.00 10.33 C +ATOM 1686 O LYS B 80 17.754 -2.720 47.370 1.00 11.42 O +ATOM 1687 CB LYS B 80 18.856 -0.805 44.901 1.00 8.58 C +ATOM 1688 CG LYS B 80 17.441 -1.174 44.457 1.00 13.04 C +ATOM 1689 CD LYS B 80 16.393 -0.278 45.106 1.00 19.56 C +ATOM 1690 CE LYS B 80 14.994 -0.616 44.612 1.00 20.22 C +ATOM 1691 NZ LYS B 80 14.629 -2.024 44.919 1.00 31.99 N +ATOM 1692 N ASN B 81 19.731 -3.335 46.486 1.00 7.78 N +ATOM 1693 CA ASN B 81 19.559 -4.746 46.801 1.00 8.85 C +ATOM 1694 C ASN B 81 19.494 -5.008 48.302 1.00 11.79 C +ATOM 1695 O ASN B 81 18.920 -6.005 48.733 1.00 13.02 O +ATOM 1696 CB ASN B 81 20.695 -5.571 46.195 1.00 8.56 C +ATOM 1697 CG ASN B 81 20.609 -5.668 44.686 1.00 11.64 C +ATOM 1698 OD1 ASN B 81 19.701 -5.116 44.060 1.00 10.80 O +ATOM 1699 ND2 ASN B 81 21.561 -6.377 44.091 1.00 10.75 N +ATOM 1700 N LEU B 82 20.082 -4.120 49.098 1.00 9.55 N +ATOM 1701 CA LEU B 82 20.057 -4.301 50.545 1.00 10.33 C +ATOM 1702 C LEU B 82 18.641 -4.223 51.100 1.00 11.86 C +ATOM 1703 O LEU B 82 18.372 -4.695 52.203 1.00 13.00 O +ATOM 1704 CB LEU B 82 20.930 -3.254 51.240 1.00 9.26 C +ATOM 1705 CG LEU B 82 22.442 -3.431 51.116 1.00 9.05 C +ATOM 1706 CD1 LEU B 82 23.140 -2.329 51.907 1.00 8.92 C +ATOM 1707 CD2 LEU B 82 22.851 -4.799 51.646 1.00 10.02 C +ATOM 1708 N GLU B 83 17.731 -3.629 50.339 1.00 14.53 N +ATOM 1709 CA GLU B 83 16.353 -3.521 50.798 1.00 19.28 C +ATOM 1710 C GLU B 83 15.740 -4.909 50.969 1.00 16.91 C +ATOM 1711 O GLU B 83 14.796 -5.087 51.740 1.00 22.85 O +ATOM 1712 CB GLU B 83 15.523 -2.705 49.806 1.00 17.82 C +ATOM 1713 CG GLU B 83 16.124 -1.348 49.480 1.00 20.84 C +ATOM 1714 CD GLU B 83 15.169 -0.450 48.720 1.00 24.65 C +ATOM 1715 OE1 GLU B 83 14.455 -0.957 47.831 1.00 24.44 O +ATOM 1716 OE2 GLU B 83 15.143 0.766 49.008 1.00 29.53 O +ATOM 1717 N LYS B 84 16.288 -5.890 50.257 1.00 18.37 N +ATOM 1718 CA LYS B 84 15.791 -7.263 50.318 1.00 19.92 C +ATOM 1719 C LYS B 84 16.692 -8.213 51.104 1.00 21.36 C +ATOM 1720 O LYS B 84 16.516 -9.429 51.038 1.00 22.42 O +ATOM 1721 CB LYS B 84 15.623 -7.824 48.905 1.00 19.42 C +ATOM 1722 CG LYS B 84 14.672 -7.046 48.012 1.00 20.23 C +ATOM 1723 CD LYS B 84 14.571 -7.707 46.647 1.00 19.41 C +ATOM 1724 CE LYS B 84 13.602 -6.969 45.739 1.00 21.89 C +ATOM 1725 NZ LYS B 84 13.462 -7.655 44.424 1.00 22.51 N +ATOM 1726 N SER B 85 17.653 -7.668 51.842 1.00 20.41 N +ATOM 1727 CA SER B 85 18.573 -8.503 52.610 1.00 23.07 C +ATOM 1728 C SER B 85 18.061 -8.818 54.011 1.00 23.57 C +ATOM 1729 O SER B 85 17.211 -8.109 54.546 1.00 24.14 O +ATOM 1730 CB SER B 85 19.933 -7.813 52.728 1.00 21.57 C +ATOM 1731 OG SER B 85 19.832 -6.638 53.513 1.00 25.20 O +ATOM 1732 N GLU B 86 18.589 -9.890 54.595 1.00 26.07 N +ATOM 1733 CA GLU B 86 18.218 -10.297 55.947 1.00 27.12 C +ATOM 1734 C GLU B 86 19.449 -10.455 56.833 1.00 25.62 C +ATOM 1735 O GLU B 86 19.457 -11.265 57.761 1.00 29.42 O +ATOM 1736 CB GLU B 86 17.442 -11.616 55.932 1.00 33.85 C +ATOM 1737 CG GLU B 86 15.974 -11.483 55.572 1.00 46.71 C +ATOM 1738 CD GLU B 86 15.149 -12.647 56.094 1.00 55.10 C +ATOM 1739 OE1 GLU B 86 15.076 -12.816 57.331 1.00 58.77 O +ATOM 1740 OE2 GLU B 86 14.577 -13.393 55.272 1.00 60.31 O +ATOM 1741 N VAL B 87 20.487 -9.678 56.549 1.00 19.87 N +ATOM 1742 CA VAL B 87 21.721 -9.739 57.325 1.00 15.79 C +ATOM 1743 C VAL B 87 21.506 -9.220 58.747 1.00 15.58 C +ATOM 1744 O VAL B 87 20.686 -8.329 58.969 1.00 16.78 O +ATOM 1745 CB VAL B 87 22.835 -8.920 56.642 1.00 13.99 C +ATOM 1746 CG1 VAL B 87 23.189 -9.550 55.304 1.00 14.84 C +ATOM 1747 CG2 VAL B 87 22.378 -7.485 56.435 1.00 15.74 C +ATOM 1748 N ASP B 88 22.243 -9.777 59.707 1.00 12.15 N +ATOM 1749 CA ASP B 88 22.111 -9.363 61.103 1.00 12.58 C +ATOM 1750 C ASP B 88 23.424 -8.891 61.719 1.00 12.85 C +ATOM 1751 O ASP B 88 23.489 -8.607 62.913 1.00 12.10 O +ATOM 1752 CB ASP B 88 21.535 -10.510 61.946 1.00 12.92 C +ATOM 1753 CG ASP B 88 22.373 -11.778 61.865 1.00 16.42 C +ATOM 1754 OD1 ASP B 88 23.456 -11.748 61.248 1.00 13.85 O +ATOM 1755 OD2 ASP B 88 21.945 -12.809 62.426 1.00 18.60 O +ATOM 1756 N GLY B 89 24.465 -8.810 60.898 1.00 9.61 N +ATOM 1757 CA GLY B 89 25.765 -8.370 61.375 1.00 8.63 C +ATOM 1758 C GLY B 89 26.526 -7.749 60.220 1.00 8.43 C +ATOM 1759 O GLY B 89 26.303 -8.118 59.068 1.00 9.07 O +ATOM 1760 N LEU B 90 27.431 -6.824 60.526 1.00 6.06 N +ATOM 1761 CA LEU B 90 28.197 -6.125 59.495 1.00 7.92 C +ATOM 1762 C LEU B 90 29.699 -6.040 59.755 1.00 8.64 C +ATOM 1763 O LEU B 90 30.126 -5.642 60.839 1.00 8.63 O +ATOM 1764 CB LEU B 90 27.641 -4.703 59.335 1.00 6.14 C +ATOM 1765 CG LEU B 90 28.462 -3.683 58.540 1.00 7.39 C +ATOM 1766 CD1 LEU B 90 28.459 -4.048 57.061 1.00 8.17 C +ATOM 1767 CD2 LEU B 90 27.865 -2.287 58.742 1.00 7.67 C +ATOM 1768 N LEU B 91 30.488 -6.410 58.747 1.00 8.03 N +ATOM 1769 CA LEU B 91 31.948 -6.346 58.821 1.00 7.73 C +ATOM 1770 C LEU B 91 32.418 -5.421 57.696 1.00 7.16 C +ATOM 1771 O LEU B 91 31.980 -5.560 56.556 1.00 7.44 O +ATOM 1772 CB LEU B 91 32.566 -7.739 58.630 1.00 8.30 C +ATOM 1773 CG LEU B 91 32.297 -8.804 59.697 1.00 9.27 C +ATOM 1774 CD1 LEU B 91 32.918 -10.122 59.253 1.00 8.84 C +ATOM 1775 CD2 LEU B 91 32.879 -8.366 61.036 1.00 9.26 C +ATOM 1776 N VAL B 92 33.300 -4.476 58.020 1.00 5.28 N +ATOM 1777 CA VAL B 92 33.805 -3.528 57.030 1.00 7.29 C +ATOM 1778 C VAL B 92 35.331 -3.537 56.959 1.00 8.28 C +ATOM 1779 O VAL B 92 36.003 -3.466 57.991 1.00 8.12 O +ATOM 1780 CB VAL B 92 33.333 -2.097 57.360 1.00 6.10 C +ATOM 1781 CG1 VAL B 92 33.953 -1.102 56.387 1.00 9.80 C +ATOM 1782 CG2 VAL B 92 31.810 -2.031 57.295 1.00 8.41 C +ATOM 1783 N TYR B 93 35.865 -3.613 55.739 1.00 7.56 N +ATOM 1784 CA TYR B 93 37.314 -3.644 55.512 1.00 8.52 C +ATOM 1785 C TYR B 93 37.751 -2.746 54.368 1.00 8.93 C +ATOM 1786 O TYR B 93 37.059 -2.635 53.356 1.00 8.79 O +ATOM 1787 CB TYR B 93 37.777 -5.054 55.143 1.00 6.28 C +ATOM 1788 CG TYR B 93 37.401 -6.110 56.135 1.00 7.75 C +ATOM 1789 CD1 TYR B 93 38.258 -6.448 57.178 1.00 8.54 C +ATOM 1790 CD2 TYR B 93 36.173 -6.760 56.047 1.00 6.62 C +ATOM 1791 CE1 TYR B 93 37.899 -7.410 58.112 1.00 7.93 C +ATOM 1792 CE2 TYR B 93 35.805 -7.720 56.973 1.00 7.24 C +ATOM 1793 CZ TYR B 93 36.668 -8.041 58.001 1.00 6.95 C +ATOM 1794 OH TYR B 93 36.297 -8.983 58.924 1.00 8.30 O +ATOM 1795 N CYS B 94 38.916 -2.126 54.519 1.00 10.13 N +ATOM 1796 CA CYS B 94 39.474 -1.296 53.458 1.00 6.30 C +ATOM 1797 C CYS B 94 40.934 -1.012 53.768 1.00 9.34 C +ATOM 1798 O CYS B 94 41.413 -1.327 54.855 1.00 9.31 O +ATOM 1799 CB CYS B 94 38.720 0.038 53.327 1.00 9.03 C +ATOM 1800 SG CYS B 94 39.178 1.336 54.530 1.00 9.87 S +ATOM 1801 N ASP B 95 41.650 -0.461 52.793 1.00 8.48 N +ATOM 1802 CA ASP B 95 43.035 -0.071 53.012 1.00 10.08 C +ATOM 1803 C ASP B 95 43.051 1.444 52.844 1.00 11.80 C +ATOM 1804 O ASP B 95 42.013 2.040 52.560 1.00 10.63 O +ATOM 1805 CB ASP B 95 44.006 -0.766 52.039 1.00 10.61 C +ATOM 1806 CG ASP B 95 43.580 -0.672 50.585 1.00 8.45 C +ATOM 1807 OD1 ASP B 95 42.664 0.111 50.255 1.00 12.75 O +ATOM 1808 OD2 ASP B 95 44.191 -1.392 49.765 1.00 11.59 O +ATOM 1809 N ASP B 96 44.202 2.080 53.024 1.00 12.83 N +ATOM 1810 CA ASP B 96 44.246 3.534 52.912 1.00 12.81 C +ATOM 1811 C ASP B 96 43.786 4.116 51.581 1.00 12.83 C +ATOM 1812 O ASP B 96 43.073 5.124 51.555 1.00 12.12 O +ATOM 1813 CB ASP B 96 45.646 4.051 53.243 1.00 14.63 C +ATOM 1814 CG ASP B 96 45.965 3.940 54.717 1.00 18.00 C +ATOM 1815 OD1 ASP B 96 45.036 4.107 55.539 1.00 20.62 O +ATOM 1816 OD2 ASP B 96 47.142 3.704 55.055 1.00 20.71 O +ATOM 1817 N GLU B 97 44.181 3.493 50.480 1.00 13.53 N +ATOM 1818 CA GLU B 97 43.797 3.990 49.165 1.00 16.29 C +ATOM 1819 C GLU B 97 42.293 3.999 48.910 1.00 15.06 C +ATOM 1820 O GLU B 97 41.811 4.738 48.053 1.00 13.57 O +ATOM 1821 CB GLU B 97 44.491 3.177 48.068 1.00 19.19 C +ATOM 1822 CG GLU B 97 45.967 3.506 47.915 1.00 33.67 C +ATOM 1823 CD GLU B 97 46.597 2.839 46.710 1.00 39.74 C +ATOM 1824 OE1 GLU B 97 46.065 3.000 45.590 1.00 44.51 O +ATOM 1825 OE2 GLU B 97 47.631 2.159 46.883 1.00 45.30 O +ATOM 1826 N ASN B 98 41.549 3.195 49.661 1.00 12.17 N +ATOM 1827 CA ASN B 98 40.107 3.113 49.459 1.00 11.15 C +ATOM 1828 C ASN B 98 39.261 3.487 50.674 1.00 11.99 C +ATOM 1829 O ASN B 98 38.048 3.275 50.679 1.00 10.72 O +ATOM 1830 CB ASN B 98 39.754 1.699 48.991 1.00 11.64 C +ATOM 1831 CG ASN B 98 40.408 1.347 47.664 1.00 10.09 C +ATOM 1832 OD1 ASN B 98 39.992 1.828 46.607 1.00 13.42 O +ATOM 1833 ND2 ASN B 98 41.447 0.520 47.713 1.00 8.18 N +ATOM 1834 N LYS B 99 39.896 4.064 51.689 1.00 10.70 N +ATOM 1835 CA LYS B 99 39.202 4.453 52.914 1.00 9.28 C +ATOM 1836 C LYS B 99 38.101 5.505 52.754 1.00 10.44 C +ATOM 1837 O LYS B 99 37.004 5.350 53.298 1.00 9.09 O +ATOM 1838 CB LYS B 99 40.223 4.933 53.946 1.00 14.04 C +ATOM 1839 CG LYS B 99 39.622 5.373 55.271 1.00 15.01 C +ATOM 1840 CD LYS B 99 40.712 5.559 56.327 1.00 19.90 C +ATOM 1841 CE LYS B 99 41.761 6.564 55.878 1.00 26.11 C +ATOM 1842 NZ LYS B 99 42.944 6.571 56.785 1.00 26.96 N +ATOM 1843 N VAL B 100 38.390 6.580 52.030 1.00 9.93 N +ATOM 1844 CA VAL B 100 37.398 7.632 51.838 1.00 7.71 C +ATOM 1845 C VAL B 100 36.164 7.083 51.128 1.00 6.80 C +ATOM 1846 O VAL B 100 35.033 7.363 51.524 1.00 8.22 O +ATOM 1847 CB VAL B 100 37.983 8.805 51.019 1.00 9.27 C +ATOM 1848 CG1 VAL B 100 36.916 9.865 50.786 1.00 11.14 C +ATOM 1849 CG2 VAL B 100 39.168 9.414 51.769 1.00 15.69 C +ATOM 1850 N PHE B 101 36.398 6.280 50.097 1.00 7.70 N +ATOM 1851 CA PHE B 101 35.322 5.675 49.312 1.00 8.14 C +ATOM 1852 C PHE B 101 34.479 4.742 50.180 1.00 8.71 C +ATOM 1853 O PHE B 101 33.250 4.853 50.224 1.00 7.41 O +ATOM 1854 CB PHE B 101 35.927 4.907 48.130 1.00 5.31 C +ATOM 1855 CG PHE B 101 34.907 4.246 47.230 1.00 7.28 C +ATOM 1856 CD1 PHE B 101 33.906 4.989 46.616 1.00 8.36 C +ATOM 1857 CD2 PHE B 101 34.976 2.880 46.976 1.00 8.23 C +ATOM 1858 CE1 PHE B 101 32.985 4.381 45.754 1.00 12.37 C +ATOM 1859 CE2 PHE B 101 34.066 2.261 46.120 1.00 9.85 C +ATOM 1860 CZ PHE B 101 33.068 3.012 45.506 1.00 11.79 C +HETATM 1861 N MSE B 102 35.133 3.819 50.878 1.00 8.34 N +HETATM 1862 CA MSE B 102 34.399 2.889 51.728 1.00 7.79 C +HETATM 1863 C MSE B 102 33.624 3.614 52.821 1.00 8.44 C +HETATM 1864 O MSE B 102 32.502 3.230 53.152 1.00 7.89 O +HETATM 1865 CB MSE B 102 35.342 1.866 52.363 1.00 7.74 C +HETATM 1866 CG MSE B 102 34.653 0.952 53.367 1.00 7.13 C +HETATM 1867 SE MSE B 102 33.179 -0.057 52.589 1.00 21.70 SE +HETATM 1868 CE MSE B 102 34.237 -1.244 51.580 1.00 3.62 C +ATOM 1869 N SER B 103 34.214 4.667 53.379 1.00 10.25 N +ATOM 1870 CA SER B 103 33.543 5.428 54.423 1.00 9.15 C +ATOM 1871 C SER B 103 32.213 5.987 53.913 1.00 9.43 C +ATOM 1872 O SER B 103 31.223 6.000 54.643 1.00 8.98 O +ATOM 1873 CB SER B 103 34.438 6.569 54.911 1.00 12.94 C +ATOM 1874 OG SER B 103 35.597 6.055 55.542 1.00 22.39 O +ATOM 1875 N LYS B 104 32.194 6.449 52.664 1.00 9.19 N +ATOM 1876 CA LYS B 104 30.970 6.986 52.078 1.00 8.57 C +ATOM 1877 C LYS B 104 29.930 5.884 51.887 1.00 8.03 C +ATOM 1878 O LYS B 104 28.731 6.110 52.064 1.00 8.00 O +ATOM 1879 CB LYS B 104 31.268 7.676 50.740 1.00 8.00 C +ATOM 1880 CG LYS B 104 31.871 9.067 50.906 1.00 9.99 C +ATOM 1881 CD LYS B 104 32.200 9.726 49.569 1.00 7.11 C +ATOM 1882 CE LYS B 104 33.320 8.997 48.840 1.00 6.13 C +ATOM 1883 NZ LYS B 104 33.713 9.685 47.577 1.00 5.13 N +ATOM 1884 N ILE B 105 30.384 4.688 51.531 1.00 6.44 N +ATOM 1885 CA ILE B 105 29.462 3.573 51.353 1.00 6.44 C +ATOM 1886 C ILE B 105 28.830 3.272 52.708 1.00 6.86 C +ATOM 1887 O ILE B 105 27.612 3.161 52.822 1.00 6.84 O +ATOM 1888 CB ILE B 105 30.192 2.306 50.833 1.00 7.27 C +ATOM 1889 CG1 ILE B 105 30.792 2.582 49.447 1.00 6.29 C +ATOM 1890 CG2 ILE B 105 29.221 1.133 50.772 1.00 8.00 C +ATOM 1891 CD1 ILE B 105 31.576 1.404 48.858 1.00 7.28 C +ATOM 1892 N VAL B 106 29.661 3.163 53.743 1.00 7.24 N +ATOM 1893 CA VAL B 106 29.164 2.872 55.084 1.00 9.20 C +ATOM 1894 C VAL B 106 28.161 3.927 55.551 1.00 7.38 C +ATOM 1895 O VAL B 106 27.119 3.595 56.122 1.00 8.51 O +ATOM 1896 CB VAL B 106 30.323 2.788 56.108 1.00 7.67 C +ATOM 1897 CG1 VAL B 106 29.766 2.577 57.510 1.00 11.73 C +ATOM 1898 CG2 VAL B 106 31.254 1.633 55.740 1.00 12.47 C +ATOM 1899 N ASP B 107 28.473 5.195 55.298 1.00 7.77 N +ATOM 1900 CA ASP B 107 27.600 6.297 55.700 1.00 9.68 C +ATOM 1901 C ASP B 107 26.195 6.181 55.132 1.00 9.43 C +ATOM 1902 O ASP B 107 25.243 6.702 55.715 1.00 10.12 O +ATOM 1903 CB ASP B 107 28.160 7.649 55.246 1.00 11.43 C +ATOM 1904 CG ASP B 107 29.454 8.021 55.935 1.00 14.81 C +ATOM 1905 OD1 ASP B 107 29.679 7.575 57.079 1.00 13.62 O +ATOM 1906 OD2 ASP B 107 30.238 8.783 55.327 1.00 15.91 O +ATOM 1907 N ASN B 108 26.071 5.508 53.992 1.00 6.57 N +ATOM 1908 CA ASN B 108 24.786 5.373 53.330 1.00 6.46 C +ATOM 1909 C ASN B 108 24.078 4.036 53.473 1.00 7.81 C +ATOM 1910 O ASN B 108 23.088 3.775 52.787 1.00 6.91 O +ATOM 1911 CB ASN B 108 24.944 5.724 51.854 1.00 5.98 C +ATOM 1912 CG ASN B 108 25.294 7.180 51.656 1.00 11.56 C +ATOM 1913 OD1 ASN B 108 26.455 7.536 51.435 1.00 13.06 O +ATOM 1914 ND2 ASN B 108 24.288 8.038 51.762 1.00 7.03 N +ATOM 1915 N LEU B 109 24.574 3.193 54.367 1.00 8.14 N +ATOM 1916 CA LEU B 109 23.942 1.902 54.592 1.00 9.38 C +ATOM 1917 C LEU B 109 22.630 2.122 55.329 1.00 9.65 C +ATOM 1918 O LEU B 109 22.479 3.106 56.056 1.00 11.76 O +ATOM 1919 CB LEU B 109 24.843 1.007 55.443 1.00 7.90 C +ATOM 1920 CG LEU B 109 26.133 0.519 54.786 1.00 9.37 C +ATOM 1921 CD1 LEU B 109 27.005 -0.174 55.820 1.00 11.40 C +ATOM 1922 CD2 LEU B 109 25.797 -0.421 53.642 1.00 9.65 C +ATOM 1923 N PRO B 110 21.658 1.219 55.136 1.00 9.50 N +ATOM 1924 CA PRO B 110 20.372 1.357 55.826 1.00 11.16 C +ATOM 1925 C PRO B 110 20.658 1.400 57.325 1.00 11.60 C +ATOM 1926 O PRO B 110 21.537 0.692 57.816 1.00 11.71 O +ATOM 1927 CB PRO B 110 19.628 0.090 55.417 1.00 9.96 C +ATOM 1928 CG PRO B 110 20.142 -0.164 54.034 1.00 14.79 C +ATOM 1929 CD PRO B 110 21.629 0.087 54.192 1.00 12.17 C +ATOM 1930 N THR B 111 19.915 2.230 58.045 1.00 10.64 N +ATOM 1931 CA THR B 111 20.094 2.385 59.485 1.00 11.86 C +ATOM 1932 C THR B 111 20.244 1.077 60.269 1.00 12.74 C +ATOM 1933 O THR B 111 21.185 0.923 61.051 1.00 15.22 O +ATOM 1934 CB THR B 111 18.921 3.195 60.078 1.00 14.73 C +ATOM 1935 OG1 THR B 111 18.902 4.497 59.480 1.00 19.58 O +ATOM 1936 CG2 THR B 111 19.062 3.336 61.581 1.00 15.13 C +ATOM 1937 N ALA B 112 19.323 0.142 60.053 1.00 12.23 N +ATOM 1938 CA ALA B 112 19.331 -1.141 60.754 1.00 11.14 C +ATOM 1939 C ALA B 112 20.574 -1.979 60.483 1.00 12.34 C +ATOM 1940 O ALA B 112 21.040 -2.715 61.355 1.00 13.84 O +ATOM 1941 CB ALA B 112 18.080 -1.932 60.391 1.00 12.37 C +ATOM 1942 N ILE B 113 21.111 -1.869 59.274 1.00 9.34 N +ATOM 1943 CA ILE B 113 22.304 -2.621 58.913 1.00 9.05 C +ATOM 1944 C ILE B 113 23.555 -1.956 59.482 1.00 7.74 C +ATOM 1945 O ILE B 113 24.417 -2.625 60.057 1.00 11.19 O +ATOM 1946 CB ILE B 113 22.432 -2.740 57.378 1.00 10.56 C +ATOM 1947 CG1 ILE B 113 21.304 -3.629 56.844 1.00 10.65 C +ATOM 1948 CG2 ILE B 113 23.796 -3.307 57.002 1.00 13.59 C +ATOM 1949 CD1 ILE B 113 21.297 -3.801 55.332 1.00 15.03 C +ATOM 1950 N LYS B 114 23.645 -0.639 59.327 1.00 10.63 N +ATOM 1951 CA LYS B 114 24.794 0.124 59.815 1.00 11.86 C +ATOM 1952 C LYS B 114 24.963 -0.081 61.318 1.00 11.42 C +ATOM 1953 O LYS B 114 26.074 -0.212 61.827 1.00 11.28 O +ATOM 1954 CB LYS B 114 24.588 1.614 59.527 1.00 14.01 C +ATOM 1955 CG LYS B 114 25.802 2.487 59.815 1.00 17.21 C +ATOM 1956 CD LYS B 114 25.454 3.972 59.759 1.00 21.95 C +ATOM 1957 CE LYS B 114 24.861 4.377 58.417 1.00 22.79 C +ATOM 1958 NZ LYS B 114 24.536 5.835 58.380 1.00 25.75 N +ATOM 1959 N ARG B 115 23.831 -0.098 62.012 1.00 11.17 N +ATOM 1960 CA ARG B 115 23.769 -0.271 63.455 1.00 12.50 C +ATOM 1961 C ARG B 115 24.406 -1.587 63.920 1.00 13.03 C +ATOM 1962 O ARG B 115 24.989 -1.654 65.005 1.00 12.52 O +ATOM 1963 CB ARG B 115 22.293 -0.205 63.865 1.00 17.05 C +ATOM 1964 CG ARG B 115 21.964 -0.530 65.299 1.00 24.23 C +ATOM 1965 CD ARG B 115 20.478 -0.855 65.396 1.00 17.93 C +ATOM 1966 NE ARG B 115 19.625 0.260 64.986 1.00 17.89 N +ATOM 1967 CZ ARG B 115 18.384 0.122 64.528 1.00 15.78 C +ATOM 1968 NH1 ARG B 115 17.848 -1.084 64.406 1.00 18.02 N +ATOM 1969 NH2 ARG B 115 17.665 1.191 64.219 1.00 16.37 N +ATOM 1970 N ASN B 116 24.299 -2.623 63.091 1.00 11.67 N +ATOM 1971 CA ASN B 116 24.841 -3.943 63.414 1.00 11.83 C +ATOM 1972 C ASN B 116 26.324 -4.121 63.093 1.00 10.94 C +ATOM 1973 O ASN B 116 26.787 -5.246 62.882 1.00 8.87 O +ATOM 1974 CB ASN B 116 24.043 -5.033 62.688 1.00 16.10 C +ATOM 1975 CG ASN B 116 22.639 -5.197 63.240 1.00 25.97 C +ATOM 1976 OD1 ASN B 116 22.443 -5.273 64.453 1.00 29.95 O +ATOM 1977 ND2 ASN B 116 21.656 -5.268 62.348 1.00 29.56 N +ATOM 1978 N LEU B 117 27.063 -3.018 63.057 1.00 11.88 N +ATOM 1979 CA LEU B 117 28.491 -3.063 62.772 1.00 12.36 C +ATOM 1980 C LEU B 117 29.195 -3.846 63.874 1.00 14.22 C +ATOM 1981 O LEU B 117 29.126 -3.479 65.049 1.00 15.46 O +ATOM 1982 CB LEU B 117 29.061 -1.640 62.696 1.00 14.10 C +ATOM 1983 CG LEU B 117 30.572 -1.486 62.471 1.00 14.06 C +ATOM 1984 CD1 LEU B 117 30.963 -2.022 61.099 1.00 11.30 C +ATOM 1985 CD2 LEU B 117 30.951 -0.014 62.586 1.00 15.66 C +ATOM 1986 N ILE B 118 29.860 -4.931 63.487 1.00 11.99 N +ATOM 1987 CA ILE B 118 30.584 -5.786 64.424 1.00 14.24 C +ATOM 1988 C ILE B 118 32.050 -5.387 64.479 1.00 14.47 C +ATOM 1989 O ILE B 118 32.655 -5.317 65.551 1.00 15.41 O +ATOM 1990 CB ILE B 118 30.537 -7.271 63.985 1.00 13.78 C +ATOM 1991 CG1 ILE B 118 29.107 -7.801 64.047 1.00 17.05 C +ATOM 1992 CG2 ILE B 118 31.464 -8.106 64.863 1.00 21.57 C +ATOM 1993 CD1 ILE B 118 28.975 -9.211 63.506 1.00 13.64 C +ATOM 1994 N LYS B 119 32.617 -5.133 63.307 1.00 12.50 N +ATOM 1995 CA LYS B 119 34.020 -4.779 63.206 1.00 13.01 C +ATOM 1996 C LYS B 119 34.268 -3.873 62.013 1.00 13.28 C +ATOM 1997 O LYS B 119 33.690 -4.068 60.943 1.00 10.47 O +ATOM 1998 CB LYS B 119 34.845 -6.058 63.061 1.00 15.90 C +ATOM 1999 CG LYS B 119 36.341 -5.859 62.985 1.00 20.79 C +ATOM 2000 CD LYS B 119 37.027 -7.195 62.754 1.00 22.35 C +ATOM 2001 CE LYS B 119 38.522 -7.087 62.940 1.00 23.28 C +ATOM 2002 NZ LYS B 119 38.848 -6.704 64.340 1.00 21.74 N +ATOM 2003 N ASP B 120 35.123 -2.875 62.207 1.00 11.74 N +ATOM 2004 CA ASP B 120 35.468 -1.949 61.143 1.00 13.09 C +ATOM 2005 C ASP B 120 36.980 -1.826 61.068 1.00 15.64 C +ATOM 2006 O ASP B 120 37.588 -1.076 61.830 1.00 18.59 O +ATOM 2007 CB ASP B 120 34.859 -0.566 61.395 1.00 14.18 C +ATOM 2008 CG ASP B 120 35.133 0.406 60.255 1.00 21.36 C +ATOM 2009 OD1 ASP B 120 36.318 0.667 59.958 1.00 18.80 O +ATOM 2010 OD2 ASP B 120 34.162 0.905 59.651 1.00 24.72 O +ATOM 2011 N PHE B 121 37.586 -2.590 60.165 1.00 10.68 N +ATOM 2012 CA PHE B 121 39.028 -2.547 59.977 1.00 8.67 C +ATOM 2013 C PHE B 121 39.187 -1.661 58.755 1.00 9.80 C +ATOM 2014 O PHE B 121 39.505 -2.131 57.658 1.00 10.45 O +ATOM 2015 CB PHE B 121 39.567 -3.948 59.690 1.00 11.06 C +ATOM 2016 CG PHE B 121 41.064 -4.048 59.755 1.00 8.57 C +ATOM 2017 CD1 PHE B 121 41.720 -4.053 60.981 1.00 7.88 C +ATOM 2018 CD2 PHE B 121 41.819 -4.133 58.589 1.00 11.03 C +ATOM 2019 CE1 PHE B 121 43.108 -4.144 61.049 1.00 9.29 C +ATOM 2020 CE2 PHE B 121 43.210 -4.224 58.644 1.00 12.45 C +ATOM 2021 CZ PHE B 121 43.857 -4.230 59.876 1.00 11.76 C +ATOM 2022 N CYS B 122 38.954 -0.368 58.952 1.00 9.68 N +ATOM 2023 CA CYS B 122 39.012 0.558 57.842 1.00 11.76 C +ATOM 2024 C CYS B 122 39.164 2.035 58.195 1.00 12.00 C +ATOM 2025 O CYS B 122 40.214 2.631 57.964 1.00 11.46 O +ATOM 2026 CB CYS B 122 37.749 0.362 56.999 1.00 10.50 C +ATOM 2027 SG CYS B 122 37.515 1.575 55.670 1.00 12.06 S +ATOM 2028 N ARG B 123 38.109 2.618 58.753 1.00 13.81 N +ATOM 2029 CA ARG B 123 38.098 4.038 59.077 1.00 13.54 C +ATOM 2030 C ARG B 123 39.199 4.550 60.003 1.00 15.49 C +ATOM 2031 O ARG B 123 39.665 5.677 59.835 1.00 15.89 O +ATOM 2032 CB ARG B 123 36.724 4.424 59.631 1.00 17.36 C +ATOM 2033 CG ARG B 123 35.592 4.061 58.678 1.00 27.63 C +ATOM 2034 CD ARG B 123 34.225 4.502 59.180 1.00 35.34 C +ATOM 2035 NE ARG B 123 34.042 5.948 59.100 1.00 40.69 N +ATOM 2036 CZ ARG B 123 32.965 6.534 58.583 1.00 43.50 C +ATOM 2037 NH1 ARG B 123 32.876 7.856 58.550 1.00 44.75 N +ATOM 2038 NH2 ARG B 123 31.979 5.797 58.087 1.00 40.61 N +ATOM 2039 N LYS B 124 39.622 3.735 60.964 1.00 12.28 N +ATOM 2040 CA LYS B 124 40.664 4.165 61.897 1.00 10.38 C +ATOM 2041 C LYS B 124 42.094 3.826 61.471 1.00 11.81 C +ATOM 2042 O LYS B 124 43.044 4.116 62.200 1.00 10.66 O +ATOM 2043 CB LYS B 124 40.400 3.591 63.293 1.00 12.36 C +ATOM 2044 CG LYS B 124 39.249 4.256 64.030 1.00 15.36 C +ATOM 2045 CD LYS B 124 39.132 3.712 65.448 1.00 24.54 C +ATOM 2046 CE LYS B 124 38.082 4.458 66.251 1.00 31.08 C +ATOM 2047 NZ LYS B 124 38.118 4.064 67.691 1.00 36.16 N +ATOM 2048 N LEU B 125 42.251 3.215 60.301 1.00 10.78 N +ATOM 2049 CA LEU B 125 43.581 2.873 59.807 1.00 9.35 C +ATOM 2050 C LEU B 125 44.342 4.140 59.430 1.00 13.02 C +ATOM 2051 O LEU B 125 43.768 5.079 58.880 1.00 16.48 O +ATOM 2052 CB LEU B 125 43.482 1.964 58.579 1.00 12.38 C +ATOM 2053 CG LEU B 125 43.052 0.517 58.828 1.00 9.98 C +ATOM 2054 CD1 LEU B 125 42.807 -0.166 57.488 1.00 15.34 C +ATOM 2055 CD2 LEU B 125 44.125 -0.216 59.624 1.00 10.78 C +ATOM 2056 N SER B 126 45.634 4.162 59.737 1.00 10.00 N +ATOM 2057 CA SER B 126 46.478 5.305 59.416 1.00 14.06 C +ATOM 2058 C SER B 126 47.202 5.060 58.094 1.00 16.28 C +ATOM 2059 O SER B 126 47.689 6.043 57.498 1.00 15.23 O +ATOM 2060 CB SER B 126 47.498 5.546 60.535 1.00 15.40 C +ATOM 2061 OG SER B 126 48.333 4.419 60.724 1.00 18.55 O +TER 2062 SER B 126 +HETATM 2063 S SO4 B 127 48.867 -16.604 52.271 1.00 25.56 S +HETATM 2064 O1 SO4 B 127 49.341 -16.224 50.947 1.00 28.92 O +HETATM 2065 O2 SO4 B 127 48.593 -18.036 52.303 1.00 28.08 O +HETATM 2066 O3 SO4 B 127 47.644 -15.882 52.588 1.00 25.89 O +HETATM 2067 O4 SO4 B 127 49.897 -16.287 53.254 1.00 29.35 O +HETATM 2068 O HOH A 127 28.458 6.021 35.670 1.00 18.16 O +HETATM 2069 O HOH A 128 15.890 4.410 18.138 1.00 20.16 O +HETATM 2070 O HOH A 129 27.529 3.101 15.774 1.00 15.18 O +HETATM 2071 O HOH A 130 32.450 11.412 36.797 1.00 19.18 O +HETATM 2072 O HOH A 131 8.531 7.793 20.199 1.00 17.77 O +HETATM 2073 O HOH A 132 14.364 5.265 15.973 1.00 14.05 O +HETATM 2074 O HOH A 133 21.168 -10.826 39.672 1.00 40.57 O +HETATM 2075 O HOH A 134 13.915 13.483 37.608 1.00 27.78 O +HETATM 2076 O HOH A 135 26.790 -7.651 16.405 1.00 24.21 O +HETATM 2077 O HOH A 136 6.144 2.232 31.847 1.00 13.55 O +HETATM 2078 O HOH A 137 23.212 5.252 37.469 1.00 16.16 O +HETATM 2079 O HOH A 138 32.876 14.054 31.321 1.00 14.52 O +HETATM 2080 O HOH A 139 18.750 15.727 36.860 1.00 13.89 O +HETATM 2081 O HOH A 140 20.509 13.974 37.699 1.00 18.12 O +HETATM 2082 O HOH A 141 12.567 16.103 40.950 1.00 47.04 O +HETATM 2083 O HOH A 142 9.021 -9.289 16.267 1.00 17.98 O +HETATM 2084 O HOH A 143 17.666 0.546 9.599 1.00 17.59 O +HETATM 2085 O HOH A 144 20.509 19.781 39.096 1.00 16.70 O +HETATM 2086 O HOH A 145 29.542 14.893 29.222 1.00 19.74 O +HETATM 2087 O HOH A 146 24.207 0.245 8.979 1.00 13.69 O +HETATM 2088 O HOH A 147 19.424 -0.651 7.809 1.00 27.68 O +HETATM 2089 O HOH A 148 9.795 2.207 30.687 1.00 15.45 O +HETATM 2090 O HOH A 149 18.090 5.197 13.129 1.00 16.39 O +HETATM 2091 O HOH A 150 10.390 8.107 40.116 1.00 22.43 O +HETATM 2092 O HOH A 151 9.065 -6.856 18.209 1.00 15.48 O +HETATM 2093 O HOH A 152 0.569 7.297 34.180 1.00 59.53 O +HETATM 2094 O HOH A 153 15.795 -12.274 29.582 1.00 22.45 O +HETATM 2095 O HOH A 154 0.364 8.593 28.085 1.00 32.19 O +HETATM 2096 O HOH A 155 14.526 -6.119 13.878 1.00 17.77 O +HETATM 2097 O HOH A 156 32.185 -6.589 38.208 1.00 18.38 O +HETATM 2098 O HOH A 157 7.829 8.695 37.464 1.00 26.42 O +HETATM 2099 O HOH A 158 34.392 10.333 26.308 1.00 36.60 O +HETATM 2100 O HOH A 159 23.565 -8.918 42.385 1.00 17.23 O +HETATM 2101 O HOH A 160 13.468 -2.601 41.021 1.00 31.02 O +HETATM 2102 O HOH A 161 15.974 -11.974 39.259 1.00 46.44 O +HETATM 2103 O HOH A 162 20.465 -3.746 15.557 1.00 19.08 O +HETATM 2104 O HOH A 163 10.423 -8.380 32.230 1.00 20.38 O +HETATM 2105 O HOH A 164 26.461 20.839 31.209 1.00 31.39 O +HETATM 2106 O HOH A 165 29.295 -9.281 16.094 1.00 23.95 O +HETATM 2107 O HOH A 166 26.125 5.967 38.272 1.00 11.91 O +HETATM 2108 O HOH A 167 29.108 7.237 33.084 1.00 20.47 O +HETATM 2109 O HOH A 168 34.636 11.173 33.949 1.00 30.19 O +HETATM 2110 O HOH A 169 6.420 -3.918 15.489 1.00 25.60 O +HETATM 2111 O HOH A 170 23.472 24.694 26.504 1.00 26.33 O +HETATM 2112 O HOH A 171 34.478 14.634 27.057 1.00 37.21 O +HETATM 2113 O HOH A 172 18.881 4.081 43.149 1.00 24.39 O +HETATM 2114 O HOH A 173 28.866 14.402 22.340 1.00 18.69 O +HETATM 2115 O HOH A 174 4.439 4.023 24.306 1.00 23.70 O +HETATM 2116 O HOH A 175 31.755 2.603 33.263 1.00 16.38 O +HETATM 2117 O HOH A 176 23.200 -4.358 36.680 1.00 31.65 O +HETATM 2118 O HOH A 177 21.150 21.348 36.961 1.00 26.97 O +HETATM 2119 O HOH A 178 11.925 20.572 30.823 1.00 22.88 O +HETATM 2120 O HOH A 179 16.017 -13.071 21.195 1.00 25.75 O +HETATM 2121 O HOH A 180 14.731 -0.038 41.120 1.00 26.44 O +HETATM 2122 O HOH A 181 11.300 -9.182 34.868 1.00 21.65 O +HETATM 2123 O HOH A 182 18.427 8.411 15.853 1.00 38.01 O +HETATM 2124 O HOH A 183 14.795 -4.039 42.949 1.00 21.73 O +HETATM 2125 O HOH A 184 21.308 0.911 6.430 1.00 32.59 O +HETATM 2126 O HOH A 185 4.527 0.507 15.147 1.00 25.41 O +HETATM 2127 O HOH A 186 29.661 0.827 20.631 1.00 25.66 O +HETATM 2128 O HOH A 187 21.751 11.717 19.933 1.00 32.92 O +HETATM 2129 O HOH A 188 21.736 -9.779 17.752 1.00 27.30 O +HETATM 2130 O HOH A 189 11.316 -12.582 27.378 1.00 29.15 O +HETATM 2131 O HOH A 190 9.669 5.484 18.610 1.00 26.69 O +HETATM 2132 O HOH A 191 19.318 3.820 18.119 1.00 38.74 O +HETATM 2133 O HOH A 192 18.070 -13.805 22.871 1.00 25.31 O +HETATM 2134 O HOH A 193 22.731 8.761 14.625 1.00 41.11 O +HETATM 2135 O HOH A 194 4.385 2.690 38.102 1.00 35.23 O +HETATM 2136 O HOH A 195 23.645 19.112 17.947 1.00 46.35 O +HETATM 2137 O HOH A 196 30.774 3.605 16.864 1.00 28.90 O +HETATM 2138 O HOH A 197 19.222 -10.903 33.649 1.00 28.13 O +HETATM 2139 O HOH A 198 17.347 9.215 41.145 1.00 22.51 O +HETATM 2140 O HOH A 199 21.370 8.664 17.154 1.00 38.09 O +HETATM 2141 O HOH A 200 18.365 -12.649 29.262 1.00 33.71 O +HETATM 2142 O HOH A 201 2.634 2.625 18.276 1.00 42.51 O +HETATM 2143 O HOH A 202 13.378 13.206 20.148 1.00 35.17 O +HETATM 2144 O HOH A 203 8.441 -6.718 31.351 1.00 38.20 O +HETATM 2145 O HOH A 204 21.225 -5.776 17.077 1.00 25.88 O +HETATM 2146 O HOH A 205 9.449 -9.504 24.578 1.00 41.50 O +HETATM 2147 O HOH A 206 33.653 8.582 34.021 1.00 37.11 O +HETATM 2148 O HOH A 207 32.071 -2.237 29.668 1.00 38.24 O +HETATM 2149 O HOH A 208 22.846 20.908 31.331 1.00 24.85 O +HETATM 2150 O HOH A 209 9.709 16.523 36.392 1.00 34.23 O +HETATM 2151 O HOH A 210 19.545 -8.901 47.793 1.00 19.93 O +HETATM 2152 O HOH A 211 3.834 1.410 34.546 1.00 29.83 O +HETATM 2153 O HOH A 212 9.928 10.065 19.432 1.00 23.37 O +HETATM 2154 O HOH A 213 17.316 2.456 17.331 1.00 23.33 O +HETATM 2155 O HOH A 214 18.932 -10.214 38.460 1.00 51.98 O +HETATM 2156 O HOH A 215 12.017 14.522 36.271 1.00 20.10 O +HETATM 2157 O HOH A 216 16.337 6.663 14.598 1.00 20.86 O +HETATM 2158 O HOH A 217 11.392 -9.367 14.836 1.00 24.37 O +HETATM 2159 O HOH A 218 24.178 -2.514 8.091 1.00 29.18 O +HETATM 2160 O HOH A 219 19.046 7.405 11.509 1.00 24.46 O +HETATM 2161 O HOH A 220 13.723 -7.995 15.643 1.00 19.27 O +HETATM 2162 O HOH A 221 16.915 -6.210 12.855 1.00 34.03 O +HETATM 2163 O HOH A 222 15.213 -12.334 36.436 1.00 43.21 O +HETATM 2164 O HOH A 223 16.447 -11.679 34.274 1.00 31.98 O +HETATM 2165 O HOH A 224 22.688 -2.690 14.501 1.00 17.55 O +HETATM 2166 O HOH A 225 9.995 -10.442 28.308 1.00 27.23 O +HETATM 2167 O HOH A 226 31.864 6.950 32.720 1.00 21.11 O +HETATM 2168 O HOH A 227 4.229 -2.360 15.587 1.00 23.38 O +HETATM 2169 O HOH A 228 4.505 0.687 30.549 1.00 23.25 O +HETATM 2170 O HOH A 229 6.174 9.648 39.470 1.00 41.45 O +HETATM 2171 O HOH A 230 4.610 12.718 39.742 1.00 35.21 O +HETATM 2172 O HOH A 231 15.402 10.740 42.875 1.00 36.92 O +HETATM 2173 O HOH A 232 16.260 14.730 38.071 1.00 25.76 O +HETATM 2174 O HOH A 233 15.127 16.485 39.592 1.00 30.08 O +HETATM 2175 O HOH A 234 28.618 7.242 38.403 1.00 15.53 O +HETATM 2176 O HOH A 235 28.047 16.891 29.963 1.00 23.89 O +HETATM 2177 O HOH A 236 27.988 19.477 29.092 1.00 28.80 O +HETATM 2178 O HOH A 237 26.753 23.936 32.222 1.00 31.67 O +HETATM 2179 O HOH A 238 28.048 21.800 33.174 1.00 21.45 O +HETATM 2180 O HOH A 239 33.571 13.322 35.119 1.00 15.52 O +HETATM 2181 O HOH A 240 32.541 8.637 36.660 1.00 36.94 O +HETATM 2182 O HOH A 241 34.452 16.574 29.303 1.00 48.18 O +HETATM 2183 O HOH A 242 18.024 5.361 19.430 1.00 47.32 O +HETATM 2184 O HOH A 243 14.592 11.263 14.709 1.00 42.99 O +HETATM 2185 O HOH A 244 14.557 12.387 17.278 1.00 40.04 O +HETATM 2186 O HOH A 245 5.402 11.533 19.367 1.00 37.99 O +HETATM 2187 O HOH A 246 1.547 10.483 34.966 1.00 50.86 O +HETATM 2188 O HOH A 247 8.347 19.301 29.971 1.00 34.22 O +HETATM 2189 O HOH A 248 4.474 5.156 21.778 1.00 35.03 O +HETATM 2190 O HOH A 249 4.468 -6.497 29.200 1.00 55.94 O +HETATM 2191 O HOH A 250 19.651 -5.640 13.417 1.00 36.65 O +HETATM 2192 O HOH A 251 21.605 -7.187 12.499 1.00 40.70 O +HETATM 2193 O HOH A 252 23.453 -4.868 12.762 1.00 29.49 O +HETATM 2194 O HOH A 253 23.477 2.365 7.143 1.00 32.07 O +HETATM 2195 O HOH A 254 9.360 -11.007 35.370 1.00 34.26 O +HETATM 2196 O HOH A 255 13.398 -14.109 27.878 1.00 35.77 O +HETATM 2197 O HOH A 256 21.048 -13.292 21.921 1.00 33.01 O +HETATM 2198 O HOH A 257 33.756 -0.353 28.616 1.00 50.01 O +HETATM 2199 O HOH A 258 23.567 -10.992 38.444 1.00 31.78 O +HETATM 2200 O HOH A 259 17.284 -11.906 42.550 1.00 54.66 O +HETATM 2201 O HOH A 260 30.748 19.823 29.133 1.00 25.39 O +HETATM 2202 O HOH A 261 25.043 -8.497 14.937 1.00 41.33 O +HETATM 2203 O HOH A 262 19.440 8.016 41.932 1.00 35.29 O +HETATM 2204 O HOH A 263 29.159 5.342 11.721 1.00 43.86 O +HETATM 2205 O HOH A 264 10.175 16.614 23.367 1.00 47.96 O +HETATM 2206 O HOH A 265 8.888 19.630 27.509 1.00 45.65 O +HETATM 2207 O HOH A 266 15.171 8.791 13.449 1.00 28.77 O +HETATM 2208 O HOH A 267 17.008 9.159 11.329 1.00 40.73 O +HETATM 2209 O HOH A 268 20.272 -10.986 36.161 1.00 41.24 O +HETATM 2210 O HOH A 269 21.708 -11.083 42.464 1.00 33.85 O +HETATM 2211 O HOH A 270 34.883 19.761 29.704 1.00 42.92 O +HETATM 2212 O HOH A 271 33.870 21.990 30.733 1.00 43.19 O +HETATM 2213 O HOH A 272 10.579 -15.293 33.494 1.00 39.64 O +HETATM 2214 O HOH A 273 9.508 -13.518 35.159 1.00 38.76 O +HETATM 2215 O HOH A 274 12.930 -11.463 37.352 1.00 43.18 O +HETATM 2216 O HOH A 275 16.007 -13.401 32.247 1.00 39.13 O +HETATM 2217 O HOH A 276 9.398 -14.257 28.668 1.00 33.79 O +HETATM 2218 O HOH A 277 1.835 11.932 23.571 1.00 30.16 O +HETATM 2219 O HOH A 278 9.119 -10.573 30.966 1.00 37.25 O +HETATM 2220 O HOH A 279 7.930 -9.110 27.143 1.00 42.11 O +HETATM 2221 O HOH A 280 26.814 17.987 16.451 1.00 51.41 O +HETATM 2222 O HOH A 281 9.758 9.876 16.768 1.00 40.33 O +HETATM 2223 O HOH A 282 7.752 12.854 19.320 1.00 35.83 O +HETATM 2224 O HOH A 283 6.752 15.361 19.555 1.00 39.15 O +HETATM 2225 O HOH A 284 12.304 -3.776 44.474 1.00 42.18 O +HETATM 2226 O HOH B 128 21.749 7.845 52.818 1.00 14.25 O +HETATM 2227 O HOH B 129 35.392 -13.107 35.614 1.00 25.17 O +HETATM 2228 O HOH B 130 35.727 8.326 46.410 1.00 12.99 O +HETATM 2229 O HOH B 131 23.311 -8.504 45.288 1.00 12.61 O +HETATM 2230 O HOH B 132 29.110 -18.789 46.047 1.00 23.45 O +HETATM 2231 O HOH B 133 47.502 1.457 58.755 1.00 14.50 O +HETATM 2232 O HOH B 134 27.493 10.307 51.644 1.00 12.27 O +HETATM 2233 O HOH B 135 24.522 10.723 51.950 1.00 10.99 O +HETATM 2234 O HOH B 136 39.003 6.377 48.604 1.00 14.10 O +HETATM 2235 O HOH B 137 27.459 -7.921 41.927 1.00 18.41 O +HETATM 2236 O HOH B 138 27.538 1.783 63.090 1.00 19.30 O +HETATM 2237 O HOH B 139 24.761 -7.627 47.446 1.00 12.74 O +HETATM 2238 O HOH B 140 39.216 4.896 46.269 1.00 19.66 O +HETATM 2239 O HOH B 141 29.205 10.791 53.689 1.00 15.87 O +HETATM 2240 O HOH B 142 19.940 2.678 45.179 1.00 13.59 O +HETATM 2241 O HOH B 143 29.698 -20.740 49.396 1.00 16.97 O +HETATM 2242 O HOH B 144 41.100 6.919 50.486 1.00 10.64 O +HETATM 2243 O HOH B 145 20.931 5.078 51.843 1.00 29.27 O +HETATM 2244 O HOH B 146 27.235 -1.233 35.422 1.00 19.56 O +HETATM 2245 O HOH B 147 46.212 1.487 50.336 1.00 23.03 O +HETATM 2246 O HOH B 148 22.198 -11.958 48.612 1.00 24.32 O +HETATM 2247 O HOH B 149 29.694 -10.191 41.013 1.00 18.37 O +HETATM 2248 O HOH B 150 33.598 -20.124 45.598 1.00 15.74 O +HETATM 2249 O HOH B 151 36.668 7.905 57.359 1.00 28.27 O +HETATM 2250 O HOH B 152 22.383 3.251 62.407 1.00 21.39 O +HETATM 2251 O HOH B 153 30.112 -16.483 44.979 1.00 20.97 O +HETATM 2252 O HOH B 154 34.356 -5.386 39.413 1.00 16.41 O +HETATM 2253 O HOH B 155 15.656 -4.125 46.248 1.00 18.93 O +HETATM 2254 O HOH B 156 16.874 -4.983 44.105 1.00 17.87 O +HETATM 2255 O HOH B 157 33.806 -0.151 43.682 1.00 16.12 O +HETATM 2256 O HOH B 158 15.326 3.157 46.586 1.00 41.28 O +HETATM 2257 O HOH B 159 32.716 9.399 55.235 1.00 21.01 O +HETATM 2258 O HOH B 160 34.643 9.442 53.256 1.00 16.07 O +HETATM 2259 O HOH B 161 29.968 -0.287 35.588 1.00 19.95 O +HETATM 2260 O HOH B 162 23.577 9.066 55.922 1.00 30.60 O +HETATM 2261 O HOH B 163 29.571 -4.628 36.083 1.00 31.15 O +HETATM 2262 O HOH B 164 28.896 -12.583 41.636 1.00 33.44 O +HETATM 2263 O HOH B 165 46.622 0.764 53.966 1.00 19.11 O +HETATM 2264 O HOH B 166 22.306 5.686 56.691 1.00 29.21 O +HETATM 2265 O HOH B 167 36.992 7.644 39.802 1.00 35.51 O +HETATM 2266 O HOH B 168 25.761 -3.624 36.491 1.00 38.29 O +HETATM 2267 O HOH B 169 18.592 1.549 49.716 1.00 27.31 O +HETATM 2268 O HOH B 170 42.868 7.188 46.987 1.00 35.86 O +HETATM 2269 O HOH B 171 27.292 -14.274 43.160 1.00 37.43 O +HETATM 2270 O HOH B 172 25.362 -15.750 45.104 1.00 30.52 O +HETATM 2271 O HOH B 173 43.076 9.501 56.562 1.00 43.34 O +HETATM 2272 O HOH B 174 32.204 2.950 60.662 1.00 32.82 O +HETATM 2273 O HOH B 175 33.831 1.926 37.009 1.00 29.41 O +HETATM 2274 O HOH B 176 47.425 8.687 58.230 1.00 35.83 O +HETATM 2275 O HOH B 177 43.492 7.252 53.386 1.00 29.73 O +HETATM 2276 O HOH B 178 32.958 -17.842 44.639 1.00 36.54 O +HETATM 2277 O HOH B 179 23.971 6.496 39.400 1.00 31.56 O +HETATM 2278 O HOH B 180 38.250 8.614 47.381 1.00 19.44 O +HETATM 2279 O HOH B 181 21.536 -10.246 46.303 1.00 20.07 O +HETATM 2280 O HOH B 182 30.890 -20.716 46.247 1.00 18.53 O +HETATM 2281 O HOH B 183 26.565 -19.302 45.680 1.00 34.84 O +HETATM 2282 O HOH B 184 46.915 -0.253 56.738 1.00 18.35 O +HETATM 2283 O HOH B 185 45.975 -2.818 56.285 1.00 19.90 O +HETATM 2284 O HOH B 186 25.009 3.263 63.422 1.00 16.72 O +HETATM 2285 O HOH B 187 25.048 -8.829 50.066 1.00 15.00 O +HETATM 2286 O HOH B 188 17.988 2.155 47.022 1.00 26.39 O +HETATM 2287 O HOH B 189 20.881 4.644 46.848 1.00 14.77 O +HETATM 2288 O HOH B 190 23.050 5.646 45.819 1.00 13.73 O +HETATM 2289 O HOH B 191 19.937 4.058 49.511 1.00 15.75 O +HETATM 2290 O HOH B 192 17.160 1.434 51.955 1.00 32.82 O +HETATM 2291 O HOH B 193 48.590 -1.720 48.336 1.00 27.63 O +HETATM 2292 O HOH B 194 47.845 -3.678 44.065 1.00 28.54 O +HETATM 2293 O HOH B 195 44.564 -2.291 42.836 1.00 25.85 O +HETATM 2294 O HOH B 196 40.878 -3.749 43.732 1.00 11.38 O +HETATM 2295 O HOH B 197 38.402 -3.964 46.400 1.00 14.57 O +HETATM 2296 O HOH B 198 18.847 -6.953 56.593 1.00 25.01 O +HETATM 2297 O HOH B 199 17.606 -2.703 54.515 1.00 27.07 O +HETATM 2298 O HOH B 200 35.941 -22.085 49.046 1.00 8.69 O +HETATM 2299 O HOH B 201 36.529 9.884 55.225 1.00 34.94 O +HETATM 2300 O HOH B 202 21.808 7.078 43.858 1.00 15.74 O +HETATM 2301 O HOH B 203 33.310 -10.259 36.870 1.00 28.74 O +HETATM 2302 O HOH B 204 24.861 -18.928 59.731 1.00 19.32 O +HETATM 2303 O HOH B 205 32.609 0.477 35.005 1.00 33.68 O +HETATM 2304 O HOH B 206 25.908 -5.820 34.938 1.00 32.89 O +HETATM 2305 O HOH B 207 25.406 -5.983 66.383 1.00 18.21 O +HETATM 2306 O HOH B 208 22.532 -12.430 65.714 1.00 21.91 O +HETATM 2307 O HOH B 209 36.385 0.150 42.555 1.00 21.29 O +HETATM 2308 O HOH B 210 40.011 -1.866 41.602 1.00 16.46 O +HETATM 2309 O HOH B 211 45.990 -10.409 46.937 1.00 15.14 O +HETATM 2310 O HOH B 212 47.299 -12.855 46.122 1.00 37.65 O +HETATM 2311 O HOH B 213 47.300 -10.021 50.070 1.00 11.57 O +HETATM 2312 O HOH B 214 49.415 -11.742 49.384 1.00 25.56 O +HETATM 2313 O HOH B 215 50.432 -8.592 48.180 1.00 34.76 O +HETATM 2314 O HOH B 216 45.950 -17.117 47.140 1.00 11.91 O +HETATM 2315 O HOH B 217 48.209 -16.855 48.400 1.00 20.67 O +HETATM 2316 O HOH B 218 49.622 -19.497 48.902 1.00 36.91 O +HETATM 2317 O HOH B 219 41.472 -19.513 42.460 1.00 22.18 O +HETATM 2318 O HOH B 220 41.314 -19.608 39.815 1.00 29.27 O +HETATM 2319 O HOH B 221 39.856 -17.844 38.429 1.00 27.86 O +HETATM 2320 O HOH B 222 42.340 -15.231 36.539 1.00 36.18 O +HETATM 2321 O HOH B 223 44.862 -13.117 36.832 1.00 31.70 O +HETATM 2322 O HOH B 224 40.127 -8.641 36.131 1.00 26.48 O +HETATM 2323 O HOH B 225 51.919 -10.132 49.666 1.00 40.48 O +HETATM 2324 O HOH B 226 45.494 -11.393 57.214 1.00 17.13 O +HETATM 2325 O HOH B 227 40.907 -17.643 56.706 1.00 12.60 O +HETATM 2326 O HOH B 228 43.628 -18.106 57.649 1.00 17.39 O +HETATM 2327 O HOH B 229 44.061 -22.668 57.601 1.00 21.34 O +HETATM 2328 O HOH B 230 40.771 -24.364 57.020 1.00 20.20 O +HETATM 2329 O HOH B 231 45.333 -24.598 53.420 1.00 28.40 O +HETATM 2330 O HOH B 232 46.233 -26.590 51.909 1.00 21.65 O +HETATM 2331 O HOH B 233 47.659 -24.550 50.161 1.00 20.60 O +HETATM 2332 O HOH B 234 49.724 -20.577 51.545 1.00 34.06 O +HETATM 2333 O HOH B 235 40.623 -10.464 63.091 1.00 15.64 O +HETATM 2334 O HOH B 236 33.734 -11.034 64.366 1.00 21.79 O +HETATM 2335 O HOH B 237 26.492 -22.373 55.525 1.00 23.99 O +HETATM 2336 O HOH B 238 25.286 -19.773 52.394 1.00 35.79 O +HETATM 2337 O HOH B 239 25.742 -17.045 51.744 1.00 29.50 O +HETATM 2338 O HOH B 240 20.699 -11.436 52.346 1.00 31.96 O +HETATM 2339 O HOH B 241 17.839 -12.847 51.084 1.00 53.96 O +HETATM 2340 O HOH B 242 17.325 -14.512 53.143 1.00 48.01 O +HETATM 2341 O HOH B 243 35.255 -19.515 41.312 1.00 31.47 O +HETATM 2342 O HOH B 244 33.856 -21.721 40.045 1.00 48.42 O +HETATM 2343 O HOH B 245 39.732 -21.420 43.520 1.00 21.00 O +HETATM 2344 O HOH B 246 46.284 -18.521 42.584 1.00 31.72 O +HETATM 2345 O HOH B 247 48.066 -14.706 42.752 1.00 40.32 O +HETATM 2346 O HOH B 248 26.797 -21.029 50.222 1.00 33.09 O +HETATM 2347 O HOH B 249 25.231 -19.819 48.034 1.00 34.56 O +HETATM 2348 O HOH B 250 26.390 -12.057 40.877 1.00 38.86 O +HETATM 2349 O HOH B 251 18.719 -5.241 58.774 1.00 33.80 O +HETATM 2350 O HOH B 252 28.694 -8.590 68.622 1.00 44.04 O +HETATM 2351 O HOH B 253 46.080 7.186 51.268 1.00 44.97 O +HETATM 2352 O HOH B 254 28.373 6.487 59.114 1.00 33.05 O +HETATM 2353 O HOH B 255 27.450 11.405 55.672 1.00 31.86 O +HETATM 2354 O HOH B 256 16.075 -0.438 53.582 1.00 38.00 O +HETATM 2355 O HOH B 257 19.558 -3.430 63.621 1.00 18.86 O +HETATM 2356 O HOH B 258 25.992 0.299 66.754 1.00 27.95 O +HETATM 2357 O HOH B 259 28.314 0.884 65.617 1.00 32.35 O +HETATM 2358 O HOH B 260 38.082 1.529 62.092 1.00 20.93 O +HETATM 2359 O HOH B 261 43.837 6.147 64.045 1.00 24.66 O +HETATM 2360 O HOH B 262 41.759 6.912 65.427 1.00 32.58 O +HETATM 2361 O HOH B 263 36.427 5.947 43.277 1.00 54.89 O +HETATM 2362 O HOH B 264 28.281 6.171 42.732 1.00 30.95 O +HETATM 2363 O HOH B 265 28.532 3.758 42.855 1.00 31.26 O +HETATM 2364 O HOH B 266 26.279 4.488 42.304 1.00 18.18 O +HETATM 2365 O HOH B 267 38.450 -25.374 53.625 1.00 11.50 O +HETATM 2366 O HOH B 268 33.268 -11.967 34.839 1.00 44.52 O +HETATM 2367 O HOH B 269 21.291 7.640 55.382 1.00 37.07 O +HETATM 2368 O HOH B 270 40.543 -6.191 35.086 1.00 46.78 O +HETATM 2369 O HOH B 271 36.278 8.494 43.716 1.00 39.94 O +HETATM 2370 O HOH B 272 38.077 0.885 44.425 1.00 37.70 O +HETATM 2371 O HOH B 273 36.624 2.995 44.072 1.00 44.84 O +HETATM 2372 O HOH B 274 47.680 -3.802 54.241 1.00 29.52 O +HETATM 2373 O HOH B 275 47.542 -25.183 47.426 1.00 44.28 O +HETATM 2374 O HOH B 276 47.958 -0.641 51.434 1.00 41.18 O +HETATM 2375 O HOH B 277 48.773 -1.142 45.731 1.00 47.19 O +HETATM 2376 O HOH B 278 52.432 -3.449 47.286 1.00 34.07 O +HETATM 2377 O HOH B 279 22.927 -20.727 46.764 1.00 43.74 O +HETATM 2378 O HOH B 280 19.895 -12.192 66.540 1.00 37.79 O +HETATM 2379 O HOH B 281 41.198 10.198 58.267 1.00 48.98 O +HETATM 2380 O HOH B 282 44.205 11.703 55.646 1.00 52.92 O +HETATM 2381 O HOH B 283 42.359 7.497 60.196 1.00 46.88 O +HETATM 2382 O HOH B 284 43.862 -18.935 38.363 1.00 32.12 O +HETATM 2383 O HOH B 285 44.692 -12.023 39.188 1.00 33.96 O +CONECT 769 996 +CONECT 821 830 +CONECT 830 821 831 +CONECT 831 830 832 834 +CONECT 832 831 833 838 +CONECT 833 832 +CONECT 834 831 835 +CONECT 835 834 836 +CONECT 836 835 837 +CONECT 837 836 +CONECT 838 832 +CONECT 996 769 +CONECT 1800 2027 +CONECT 1852 1861 +CONECT 1861 1852 1862 +CONECT 1862 1861 1863 1865 +CONECT 1863 1862 1864 1869 +CONECT 1864 1863 +CONECT 1865 1862 1866 +CONECT 1866 1865 1867 +CONECT 1867 1866 1868 +CONECT 1868 1867 +CONECT 1869 1863 +CONECT 2027 1800 +CONECT 2063 2064 2065 2066 2067 +CONECT 2064 2063 +CONECT 2065 2063 +CONECT 2066 2063 +CONECT 2067 2063 +MASTER 266 0 3 17 10 0 2 6 2381 2 29 20 +END diff --git a/alphafold/alphafold/data/__init__.py b/alphafold/alphafold/data/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..9821d212c3c7781e601ea8d2137493942d0937d4 --- /dev/null +++ b/alphafold/alphafold/data/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. +"""Data pipeline for model features.""" diff --git a/alphafold/alphafold/data/__pycache__/__init__.cpython-36.pyc b/alphafold/alphafold/data/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d9b141a5e9376bd4797f5b1e9f750144436dacfc Binary files /dev/null and b/alphafold/alphafold/data/__pycache__/__init__.cpython-36.pyc differ diff --git a/alphafold/alphafold/data/__pycache__/__init__.cpython-38.pyc b/alphafold/alphafold/data/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..80b064dd17378044e88a5eac1e0593f80839244a Binary files /dev/null and b/alphafold/alphafold/data/__pycache__/__init__.cpython-38.pyc differ diff --git a/alphafold/alphafold/data/__pycache__/mmcif_parsing.cpython-36.pyc b/alphafold/alphafold/data/__pycache__/mmcif_parsing.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..529bbf55c8594a32359ad209c84073d1ec86c70b Binary files /dev/null and b/alphafold/alphafold/data/__pycache__/mmcif_parsing.cpython-36.pyc differ diff --git a/alphafold/alphafold/data/__pycache__/mmcif_parsing.cpython-38.pyc b/alphafold/alphafold/data/__pycache__/mmcif_parsing.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..311157aa7c941630d04197befaacd14452bdd943 Binary files /dev/null and b/alphafold/alphafold/data/__pycache__/mmcif_parsing.cpython-38.pyc differ diff --git a/alphafold/alphafold/data/__pycache__/parsers.cpython-36.pyc b/alphafold/alphafold/data/__pycache__/parsers.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42cba15965d846f97405da7b726d5534f7c207f5 Binary files /dev/null and b/alphafold/alphafold/data/__pycache__/parsers.cpython-36.pyc differ diff --git a/alphafold/alphafold/data/__pycache__/parsers.cpython-38.pyc b/alphafold/alphafold/data/__pycache__/parsers.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d79eb841d19c9b9d4add12e8521ddec45809ebd6 Binary files /dev/null and b/alphafold/alphafold/data/__pycache__/parsers.cpython-38.pyc differ diff --git a/alphafold/alphafold/data/__pycache__/pipeline.cpython-36.pyc b/alphafold/alphafold/data/__pycache__/pipeline.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b4147ad7eb5416b2ec935f9f8f731030c3f6a8a1 Binary files /dev/null and b/alphafold/alphafold/data/__pycache__/pipeline.cpython-36.pyc differ diff --git a/alphafold/alphafold/data/__pycache__/pipeline.cpython-38.pyc b/alphafold/alphafold/data/__pycache__/pipeline.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f1e62640b283668e021ac33b98ed29d0549484c Binary files /dev/null and b/alphafold/alphafold/data/__pycache__/pipeline.cpython-38.pyc differ diff --git a/alphafold/alphafold/data/__pycache__/templates.cpython-36.pyc b/alphafold/alphafold/data/__pycache__/templates.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee9c04ccdc756c9d825ac4bd76fb03f928134286 Binary files /dev/null and b/alphafold/alphafold/data/__pycache__/templates.cpython-36.pyc differ diff --git a/alphafold/alphafold/data/__pycache__/templates.cpython-38.pyc b/alphafold/alphafold/data/__pycache__/templates.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..32a7b67256b5f13610dde10d82d53541a8252717 Binary files /dev/null and b/alphafold/alphafold/data/__pycache__/templates.cpython-38.pyc differ diff --git a/alphafold/alphafold/data/mmcif_parsing.py b/alphafold/alphafold/data/mmcif_parsing.py new file mode 100644 index 0000000000000000000000000000000000000000..18375165a526a780f2e602a3800e12833dbb3e67 --- /dev/null +++ b/alphafold/alphafold/data/mmcif_parsing.py @@ -0,0 +1,384 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Parses the mmCIF file format.""" +import collections +import dataclasses +import io +from typing import Any, Mapping, Optional, Sequence, Tuple + +from absl import logging +from Bio import PDB +from Bio.Data import SCOPData + +# Type aliases: +ChainId = str +PdbHeader = Mapping[str, Any] +PdbStructure = PDB.Structure.Structure +SeqRes = str +MmCIFDict = Mapping[str, Sequence[str]] + + +@dataclasses.dataclass(frozen=True) +class Monomer: + id: str + num: int + + +# Note - mmCIF format provides no guarantees on the type of author-assigned +# sequence numbers. They need not be integers. +@dataclasses.dataclass(frozen=True) +class AtomSite: + residue_name: str + author_chain_id: str + mmcif_chain_id: str + author_seq_num: str + mmcif_seq_num: int + insertion_code: str + hetatm_atom: str + model_num: int + + +# Used to map SEQRES index to a residue in the structure. +@dataclasses.dataclass(frozen=True) +class ResiduePosition: + chain_id: str + residue_number: int + insertion_code: str + + +@dataclasses.dataclass(frozen=True) +class ResidueAtPosition: + position: Optional[ResiduePosition] + name: str + is_missing: bool + hetflag: str + + +@dataclasses.dataclass(frozen=True) +class MmcifObject: + """Representation of a parsed mmCIF file. + + Contains: + file_id: A meaningful name, e.g. a pdb_id. Should be unique amongst all + files being processed. + header: Biopython header. + structure: Biopython structure. + chain_to_seqres: Dict mapping chain_id to 1 letter amino acid sequence. E.g. + {'A': 'ABCDEFG'} + seqres_to_structure: Dict; for each chain_id contains a mapping between + SEQRES index and a ResidueAtPosition. e.g. {'A': {0: ResidueAtPosition, + 1: ResidueAtPosition, + ...}} + raw_string: The raw string used to construct the MmcifObject. + """ + file_id: str + header: PdbHeader + structure: PdbStructure + chain_to_seqres: Mapping[ChainId, SeqRes] + seqres_to_structure: Mapping[ChainId, Mapping[int, ResidueAtPosition]] + raw_string: Any + + +@dataclasses.dataclass(frozen=True) +class ParsingResult: + """Returned by the parse function. + + Contains: + mmcif_object: A MmcifObject, may be None if no chain could be successfully + parsed. + errors: A dict mapping (file_id, chain_id) to any exception generated. + """ + mmcif_object: Optional[MmcifObject] + errors: Mapping[Tuple[str, str], Any] + + +class ParseError(Exception): + """An error indicating that an mmCIF file could not be parsed.""" + + +def mmcif_loop_to_list(prefix: str, + parsed_info: MmCIFDict) -> Sequence[Mapping[str, str]]: + """Extracts loop associated with a prefix from mmCIF data as a list. + + Reference for loop_ in mmCIF: + http://mmcif.wwpdb.org/docs/tutorials/mechanics/pdbx-mmcif-syntax.html + + Args: + prefix: Prefix shared by each of the data items in the loop. + e.g. '_entity_poly_seq.', where the data items are _entity_poly_seq.num, + _entity_poly_seq.mon_id. Should include the trailing period. + parsed_info: A dict of parsed mmCIF data, e.g. _mmcif_dict from a Biopython + parser. + + Returns: + Returns a list of dicts; each dict represents 1 entry from an mmCIF loop. + """ + cols = [] + data = [] + for key, value in parsed_info.items(): + if key.startswith(prefix): + cols.append(key) + data.append(value) + + assert all([len(xs) == len(data[0]) for xs in data]), ( + 'mmCIF error: Not all loops are the same length: %s' % cols) + + return [dict(zip(cols, xs)) for xs in zip(*data)] + + +def mmcif_loop_to_dict(prefix: str, + index: str, + parsed_info: MmCIFDict, + ) -> Mapping[str, Mapping[str, str]]: + """Extracts loop associated with a prefix from mmCIF data as a dictionary. + + Args: + prefix: Prefix shared by each of the data items in the loop. + e.g. '_entity_poly_seq.', where the data items are _entity_poly_seq.num, + _entity_poly_seq.mon_id. Should include the trailing period. + index: Which item of loop data should serve as the key. + parsed_info: A dict of parsed mmCIF data, e.g. _mmcif_dict from a Biopython + parser. + + Returns: + Returns a dict of dicts; each dict represents 1 entry from an mmCIF loop, + indexed by the index column. + """ + entries = mmcif_loop_to_list(prefix, parsed_info) + return {entry[index]: entry for entry in entries} + + +def parse(*, + file_id: str, + mmcif_string: str, + catch_all_errors: bool = True) -> ParsingResult: + """Entry point, parses an mmcif_string. + + Args: + file_id: A string identifier for this file. Should be unique within the + collection of files being processed. + mmcif_string: Contents of an mmCIF file. + catch_all_errors: If True, all exceptions are caught and error messages are + returned as part of the ParsingResult. If False exceptions will be allowed + to propagate. + + Returns: + A ParsingResult. + """ + errors = {} + try: + parser = PDB.MMCIFParser(QUIET=True) + handle = io.StringIO(mmcif_string) + full_structure = parser.get_structure('', handle) + first_model_structure = _get_first_model(full_structure) + # Extract the _mmcif_dict from the parser, which contains useful fields not + # reflected in the Biopython structure. + parsed_info = parser._mmcif_dict # pylint:disable=protected-access + + # Ensure all values are lists, even if singletons. + for key, value in parsed_info.items(): + if not isinstance(value, list): + parsed_info[key] = [value] + + header = _get_header(parsed_info) + + # Determine the protein chains, and their start numbers according to the + # internal mmCIF numbering scheme (likely but not guaranteed to be 1). + valid_chains = _get_protein_chains(parsed_info=parsed_info) + if not valid_chains: + return ParsingResult( + None, {(file_id, ''): 'No protein chains found in this file.'}) + seq_start_num = {chain_id: min([monomer.num for monomer in seq]) + for chain_id, seq in valid_chains.items()} + + # Loop over the atoms for which we have coordinates. Populate two mappings: + # -mmcif_to_author_chain_id (maps internal mmCIF chain ids to chain ids used + # the authors / Biopython). + # -seq_to_structure_mappings (maps idx into sequence to ResidueAtPosition). + mmcif_to_author_chain_id = {} + seq_to_structure_mappings = {} + for atom in _get_atom_site_list(parsed_info): + if atom.model_num != '1': + # We only process the first model at the moment. + continue + + mmcif_to_author_chain_id[atom.mmcif_chain_id] = atom.author_chain_id + + if atom.mmcif_chain_id in valid_chains: + hetflag = ' ' + if atom.hetatm_atom == 'HETATM': + # Water atoms are assigned a special hetflag of W in Biopython. We + # need to do the same, so that this hetflag can be used to fetch + # a residue from the Biopython structure by id. + if atom.residue_name in ('HOH', 'WAT'): + hetflag = 'W' + else: + hetflag = 'H_' + atom.residue_name + insertion_code = atom.insertion_code + if not _is_set(atom.insertion_code): + insertion_code = ' ' + position = ResiduePosition(chain_id=atom.author_chain_id, + residue_number=int(atom.author_seq_num), + insertion_code=insertion_code) + seq_idx = int(atom.mmcif_seq_num) - seq_start_num[atom.mmcif_chain_id] + current = seq_to_structure_mappings.get(atom.author_chain_id, {}) + current[seq_idx] = ResidueAtPosition(position=position, + name=atom.residue_name, + is_missing=False, + hetflag=hetflag) + seq_to_structure_mappings[atom.author_chain_id] = current + + # Add missing residue information to seq_to_structure_mappings. + for chain_id, seq_info in valid_chains.items(): + author_chain = mmcif_to_author_chain_id[chain_id] + current_mapping = seq_to_structure_mappings[author_chain] + for idx, monomer in enumerate(seq_info): + if idx not in current_mapping: + current_mapping[idx] = ResidueAtPosition(position=None, + name=monomer.id, + is_missing=True, + hetflag=' ') + + author_chain_to_sequence = {} + for chain_id, seq_info in valid_chains.items(): + author_chain = mmcif_to_author_chain_id[chain_id] + seq = [] + for monomer in seq_info: + code = SCOPData.protein_letters_3to1.get(monomer.id, 'X') + seq.append(code if len(code) == 1 else 'X') + seq = ''.join(seq) + author_chain_to_sequence[author_chain] = seq + + mmcif_object = MmcifObject( + file_id=file_id, + header=header, + structure=first_model_structure, + chain_to_seqres=author_chain_to_sequence, + seqres_to_structure=seq_to_structure_mappings, + raw_string=parsed_info) + + return ParsingResult(mmcif_object=mmcif_object, errors=errors) + except Exception as e: # pylint:disable=broad-except + errors[(file_id, '')] = e + if not catch_all_errors: + raise + return ParsingResult(mmcif_object=None, errors=errors) + + +def _get_first_model(structure: PdbStructure) -> PdbStructure: + """Returns the first model in a Biopython structure.""" + return next(structure.get_models()) + +_MIN_LENGTH_OF_CHAIN_TO_BE_COUNTED_AS_PEPTIDE = 21 + + +def get_release_date(parsed_info: MmCIFDict) -> str: + """Returns the oldest revision date.""" + revision_dates = parsed_info['_pdbx_audit_revision_history.revision_date'] + return min(revision_dates) + + +def _get_header(parsed_info: MmCIFDict) -> PdbHeader: + """Returns a basic header containing method, release date and resolution.""" + header = {} + + experiments = mmcif_loop_to_list('_exptl.', parsed_info) + header['structure_method'] = ','.join([ + experiment['_exptl.method'].lower() for experiment in experiments]) + + # Note: The release_date here corresponds to the oldest revision. We prefer to + # use this for dataset filtering over the deposition_date. + if '_pdbx_audit_revision_history.revision_date' in parsed_info: + header['release_date'] = get_release_date(parsed_info) + else: + logging.warning('Could not determine release_date: %s', + parsed_info['_entry.id']) + + header['resolution'] = 0.00 + for res_key in ('_refine.ls_d_res_high', '_em_3d_reconstruction.resolution', + '_reflns.d_resolution_high'): + if res_key in parsed_info: + try: + raw_resolution = parsed_info[res_key][0] + header['resolution'] = float(raw_resolution) + except ValueError: + logging.warning('Invalid resolution format: %s', parsed_info[res_key]) + + return header + + +def _get_atom_site_list(parsed_info: MmCIFDict) -> Sequence[AtomSite]: + """Returns list of atom sites; contains data not present in the structure.""" + return [AtomSite(*site) for site in zip( # pylint:disable=g-complex-comprehension + parsed_info['_atom_site.label_comp_id'], + parsed_info['_atom_site.auth_asym_id'], + parsed_info['_atom_site.label_asym_id'], + parsed_info['_atom_site.auth_seq_id'], + parsed_info['_atom_site.label_seq_id'], + parsed_info['_atom_site.pdbx_PDB_ins_code'], + parsed_info['_atom_site.group_PDB'], + parsed_info['_atom_site.pdbx_PDB_model_num'], + )] + + +def _get_protein_chains( + *, parsed_info: Mapping[str, Any]) -> Mapping[ChainId, Sequence[Monomer]]: + """Extracts polymer information for protein chains only. + + Args: + parsed_info: _mmcif_dict produced by the Biopython parser. + + Returns: + A dict mapping mmcif chain id to a list of Monomers. + """ + # Get polymer information for each entity in the structure. + entity_poly_seqs = mmcif_loop_to_list('_entity_poly_seq.', parsed_info) + + polymers = collections.defaultdict(list) + for entity_poly_seq in entity_poly_seqs: + polymers[entity_poly_seq['_entity_poly_seq.entity_id']].append( + Monomer(id=entity_poly_seq['_entity_poly_seq.mon_id'], + num=int(entity_poly_seq['_entity_poly_seq.num']))) + + # Get chemical compositions. Will allow us to identify which of these polymers + # are proteins. + chem_comps = mmcif_loop_to_dict('_chem_comp.', '_chem_comp.id', parsed_info) + + # Get chains information for each entity. Necessary so that we can return a + # dict keyed on chain id rather than entity. + struct_asyms = mmcif_loop_to_list('_struct_asym.', parsed_info) + + entity_to_mmcif_chains = collections.defaultdict(list) + for struct_asym in struct_asyms: + chain_id = struct_asym['_struct_asym.id'] + entity_id = struct_asym['_struct_asym.entity_id'] + entity_to_mmcif_chains[entity_id].append(chain_id) + + # Identify and return the valid protein chains. + valid_chains = {} + for entity_id, seq_info in polymers.items(): + chain_ids = entity_to_mmcif_chains[entity_id] + + # Reject polymers without any peptide-like components, such as DNA/RNA. + if any(['peptide' in chem_comps[monomer.id]['_chem_comp.type'] + for monomer in seq_info]): + for chain_id in chain_ids: + valid_chains[chain_id] = seq_info + return valid_chains + + +def _is_set(data: str) -> bool: + """Returns False if data is a special mmCIF character indicating 'unset'.""" + return data not in ('.', '?') diff --git a/alphafold/alphafold/data/parsers.py b/alphafold/alphafold/data/parsers.py new file mode 100644 index 0000000000000000000000000000000000000000..edc21bbeb897520baae2352dbfb4ac0ebfbb7a59 --- /dev/null +++ b/alphafold/alphafold/data/parsers.py @@ -0,0 +1,364 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Functions for parsing various file formats.""" +import collections +import dataclasses +import re +import string +from typing import Dict, Iterable, List, Optional, Sequence, Tuple + +DeletionMatrix = Sequence[Sequence[int]] + + +@dataclasses.dataclass(frozen=True) +class TemplateHit: + """Class representing a template hit.""" + index: int + name: str + aligned_cols: int + sum_probs: float + query: str + hit_sequence: str + indices_query: List[int] + indices_hit: List[int] + + +def parse_fasta(fasta_string: str) -> Tuple[Sequence[str], Sequence[str]]: + """Parses FASTA string and returns list of strings with amino-acid sequences. + + Arguments: + fasta_string: The string contents of a FASTA file. + + Returns: + A tuple of two lists: + * A list of sequences. + * A list of sequence descriptions taken from the comment lines. In the + same order as the sequences. + """ + sequences = [] + descriptions = [] + index = -1 + for line in fasta_string.splitlines(): + line = line.strip() + if line.startswith('>'): + index += 1 + descriptions.append(line[1:]) # Remove the '>' at the beginning. + sequences.append('') + continue + elif not line: + continue # Skip blank lines. + sequences[index] += line + + return sequences, descriptions + + +def parse_stockholm( + stockholm_string: str +) -> Tuple[Sequence[str], DeletionMatrix, Sequence[str]]: + """Parses sequences and deletion matrix from stockholm format alignment. + + Args: + stockholm_string: The string contents of a stockholm file. The first + sequence in the file should be the query sequence. + + Returns: + A tuple of: + * A list of sequences that have been aligned to the query. These + might contain duplicates. + * The deletion matrix for the alignment as a list of lists. The element + at `deletion_matrix[i][j]` is the number of residues deleted from + the aligned sequence i at residue position j. + * The names of the targets matched, including the jackhmmer subsequence + suffix. + """ + name_to_sequence = collections.OrderedDict() + for line in stockholm_string.splitlines(): + line = line.strip() + if not line or line.startswith(('#', '//')): + continue + name, sequence = line.split() + if name not in name_to_sequence: + name_to_sequence[name] = '' + name_to_sequence[name] += sequence + + msa = [] + deletion_matrix = [] + + query = '' + keep_columns = [] + for seq_index, sequence in enumerate(name_to_sequence.values()): + if seq_index == 0: + # Gather the columns with gaps from the query + query = sequence + keep_columns = [i for i, res in enumerate(query) if res != '-'] + + # Remove the columns with gaps in the query from all sequences. + aligned_sequence = ''.join([sequence[c] for c in keep_columns]) + + msa.append(aligned_sequence) + + # Count the number of deletions w.r.t. query. + deletion_vec = [] + deletion_count = 0 + for seq_res, query_res in zip(sequence, query): + if seq_res != '-' or query_res != '-': + if query_res == '-': + deletion_count += 1 + else: + deletion_vec.append(deletion_count) + deletion_count = 0 + deletion_matrix.append(deletion_vec) + + return msa, deletion_matrix, list(name_to_sequence.keys()) + + +def parse_a3m(a3m_string: str) -> Tuple[Sequence[str], DeletionMatrix]: + """Parses sequences and deletion matrix from a3m format alignment. + + Args: + a3m_string: The string contents of a a3m file. The first sequence in the + file should be the query sequence. + + Returns: + A tuple of: + * A list of sequences that have been aligned to the query. These + might contain duplicates. + * The deletion matrix for the alignment as a list of lists. The element + at `deletion_matrix[i][j]` is the number of residues deleted from + the aligned sequence i at residue position j. + """ + sequences, _ = parse_fasta(a3m_string) + deletion_matrix = [] + for msa_sequence in sequences: + deletion_vec = [] + deletion_count = 0 + for j in msa_sequence: + if j.islower(): + deletion_count += 1 + else: + deletion_vec.append(deletion_count) + deletion_count = 0 + deletion_matrix.append(deletion_vec) + + # Make the MSA matrix out of aligned (deletion-free) sequences. + deletion_table = str.maketrans('', '', string.ascii_lowercase) + aligned_sequences = [s.translate(deletion_table) for s in sequences] + return aligned_sequences, deletion_matrix + + +def _convert_sto_seq_to_a3m( + query_non_gaps: Sequence[bool], sto_seq: str) -> Iterable[str]: + for is_query_res_non_gap, sequence_res in zip(query_non_gaps, sto_seq): + if is_query_res_non_gap: + yield sequence_res + elif sequence_res != '-': + yield sequence_res.lower() + + +def convert_stockholm_to_a3m(stockholm_format: str, + max_sequences: Optional[int] = None) -> str: + """Converts MSA in Stockholm format to the A3M format.""" + descriptions = {} + sequences = {} + reached_max_sequences = False + + for line in stockholm_format.splitlines(): + reached_max_sequences = max_sequences and len(sequences) >= max_sequences + if line.strip() and not line.startswith(('#', '//')): + # Ignore blank lines, markup and end symbols - remainder are alignment + # sequence parts. + seqname, aligned_seq = line.split(maxsplit=1) + if seqname not in sequences: + if reached_max_sequences: + continue + sequences[seqname] = '' + sequences[seqname] += aligned_seq + + for line in stockholm_format.splitlines(): + if line[:4] == '#=GS': + # Description row - example format is: + # #=GS UniRef90_Q9H5Z4/4-78 DE [subseq from] cDNA: FLJ22755 ... + columns = line.split(maxsplit=3) + seqname, feature = columns[1:3] + value = columns[3] if len(columns) == 4 else '' + if feature != 'DE': + continue + if reached_max_sequences and seqname not in sequences: + continue + descriptions[seqname] = value + if len(descriptions) == len(sequences): + break + + # Convert sto format to a3m line by line + a3m_sequences = {} + # query_sequence is assumed to be the first sequence + query_sequence = next(iter(sequences.values())) + query_non_gaps = [res != '-' for res in query_sequence] + for seqname, sto_sequence in sequences.items(): + a3m_sequences[seqname] = ''.join( + _convert_sto_seq_to_a3m(query_non_gaps, sto_sequence)) + + fasta_chunks = (f">{k} {descriptions.get(k, '')}\n{a3m_sequences[k]}" + for k in a3m_sequences) + return '\n'.join(fasta_chunks) + '\n' # Include terminating newline. + + +def _get_hhr_line_regex_groups( + regex_pattern: str, line: str) -> Sequence[Optional[str]]: + match = re.match(regex_pattern, line) + if match is None: + raise RuntimeError(f'Could not parse query line {line}') + return match.groups() + + +def _update_hhr_residue_indices_list( + sequence: str, start_index: int, indices_list: List[int]): + """Computes the relative indices for each residue with respect to the original sequence.""" + counter = start_index + for symbol in sequence: + if symbol == '-': + indices_list.append(-1) + else: + indices_list.append(counter) + counter += 1 + + +def _parse_hhr_hit(detailed_lines: Sequence[str]) -> TemplateHit: + """Parses the detailed HMM HMM comparison section for a single Hit. + + This works on .hhr files generated from both HHBlits and HHSearch. + + Args: + detailed_lines: A list of lines from a single comparison section between 2 + sequences (which each have their own HMM's) + + Returns: + A dictionary with the information from that detailed comparison section + + Raises: + RuntimeError: If a certain line cannot be processed + """ + # Parse first 2 lines. + number_of_hit = int(detailed_lines[0].split()[-1]) + name_hit = detailed_lines[1][1:] + + # Parse the summary line. + pattern = ( + 'Probab=(.*)[\t ]*E-value=(.*)[\t ]*Score=(.*)[\t ]*Aligned_cols=(.*)[\t' + ' ]*Identities=(.*)%[\t ]*Similarity=(.*)[\t ]*Sum_probs=(.*)[\t ' + ']*Template_Neff=(.*)') + match = re.match(pattern, detailed_lines[2]) + if match is None: + raise RuntimeError( + 'Could not parse section: %s. Expected this: \n%s to contain summary.' % + (detailed_lines, detailed_lines[2])) + (prob_true, e_value, _, aligned_cols, _, _, sum_probs, + neff) = [float(x) for x in match.groups()] + + # The next section reads the detailed comparisons. These are in a 'human + # readable' format which has a fixed length. The strategy employed is to + # assume that each block starts with the query sequence line, and to parse + # that with a regexp in order to deduce the fixed length used for that block. + query = '' + hit_sequence = '' + indices_query = [] + indices_hit = [] + length_block = None + + for line in detailed_lines[3:]: + # Parse the query sequence line + if (line.startswith('Q ') and not line.startswith('Q ss_dssp') and + not line.startswith('Q ss_pred') and + not line.startswith('Q Consensus')): + # Thus the first 17 characters must be 'Q ', and we can parse + # everything after that. + # start sequence end total_sequence_length + patt = r'[\t ]*([0-9]*) ([A-Z-]*)[\t ]*([0-9]*) \([0-9]*\)' + groups = _get_hhr_line_regex_groups(patt, line[17:]) + + # Get the length of the parsed block using the start and finish indices, + # and ensure it is the same as the actual block length. + start = int(groups[0]) - 1 # Make index zero based. + delta_query = groups[1] + end = int(groups[2]) + num_insertions = len([x for x in delta_query if x == '-']) + length_block = end - start + num_insertions + assert length_block == len(delta_query) + + # Update the query sequence and indices list. + query += delta_query + _update_hhr_residue_indices_list(delta_query, start, indices_query) + + elif line.startswith('T '): + # Parse the hit sequence. + if (not line.startswith('T ss_dssp') and + not line.startswith('T ss_pred') and + not line.startswith('T Consensus')): + # Thus the first 17 characters must be 'T ', and we can + # parse everything after that. + # start sequence end total_sequence_length + patt = r'[\t ]*([0-9]*) ([A-Z-]*)[\t ]*[0-9]* \([0-9]*\)' + groups = _get_hhr_line_regex_groups(patt, line[17:]) + start = int(groups[0]) - 1 # Make index zero based. + delta_hit_sequence = groups[1] + assert length_block == len(delta_hit_sequence) + + # Update the hit sequence and indices list. + hit_sequence += delta_hit_sequence + _update_hhr_residue_indices_list(delta_hit_sequence, start, indices_hit) + + return TemplateHit( + index=number_of_hit, + name=name_hit, + aligned_cols=int(aligned_cols), + sum_probs=sum_probs, + query=query, + hit_sequence=hit_sequence, + indices_query=indices_query, + indices_hit=indices_hit, + ) + + +def parse_hhr(hhr_string: str) -> Sequence[TemplateHit]: + """Parses the content of an entire HHR file.""" + lines = hhr_string.splitlines() + + # Each .hhr file starts with a results table, then has a sequence of hit + # "paragraphs", each paragraph starting with a line 'No '. We + # iterate through each paragraph to parse each hit. + + block_starts = [i for i, line in enumerate(lines) if line.startswith('No ')] + + hits = [] + if block_starts: + block_starts.append(len(lines)) # Add the end of the final block. + for i in range(len(block_starts) - 1): + hits.append(_parse_hhr_hit(lines[block_starts[i]:block_starts[i + 1]])) + return hits + + +def parse_e_values_from_tblout(tblout: str) -> Dict[str, float]: + """Parse target to e-value mapping parsed from Jackhmmer tblout string.""" + e_values = {'query': 0} + lines = [line for line in tblout.splitlines() if line[0] != '#'] + # As per http://eddylab.org/software/hmmer/Userguide.pdf fields are + # space-delimited. Relevant fields are (1) target name: and + # (5) E-value (full sequence) (numbering from 1). + for line in lines: + fields = line.split() + e_value = fields[4] + target_name = fields[0] + e_values[target_name] = float(e_value) + return e_values diff --git a/alphafold/alphafold/data/pipeline.py b/alphafold/alphafold/data/pipeline.py new file mode 100644 index 0000000000000000000000000000000000000000..461bce875ab6f9cad4e2b0897c44a6cf1ef399ae --- /dev/null +++ b/alphafold/alphafold/data/pipeline.py @@ -0,0 +1,209 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Functions for building the input features for the AlphaFold model.""" + +import os +from typing import Mapping, Optional, Sequence +from absl import logging +from alphafold.common import residue_constants +from alphafold.data import parsers +from alphafold.data import templates +from alphafold.data.tools import hhblits +from alphafold.data.tools import hhsearch +from alphafold.data.tools import jackhmmer +import numpy as np + +# Internal import (7716). + +FeatureDict = Mapping[str, np.ndarray] + + +def make_sequence_features( + sequence: str, description: str, num_res: int) -> FeatureDict: + """Constructs a feature dict of sequence features.""" + features = {} + features['aatype'] = residue_constants.sequence_to_onehot( + sequence=sequence, + mapping=residue_constants.restype_order_with_x, + map_unknown_to_x=True) + features['between_segment_residues'] = np.zeros((num_res,), dtype=np.int32) + features['domain_name'] = np.array([description.encode('utf-8')], + dtype=np.object_) + features['residue_index'] = np.array(range(num_res), dtype=np.int32) + features['seq_length'] = np.array([num_res] * num_res, dtype=np.int32) + features['sequence'] = np.array([sequence.encode('utf-8')], dtype=np.object_) + return features + + +def make_msa_features( + msas: Sequence[Sequence[str]], + deletion_matrices: Sequence[parsers.DeletionMatrix]) -> FeatureDict: + """Constructs a feature dict of MSA features.""" + if not msas: + raise ValueError('At least one MSA must be provided.') + + int_msa = [] + deletion_matrix = [] + seen_sequences = set() + for msa_index, msa in enumerate(msas): + if not msa: + raise ValueError(f'MSA {msa_index} must contain at least one sequence.') + for sequence_index, sequence in enumerate(msa): + if sequence in seen_sequences: + continue + seen_sequences.add(sequence) + int_msa.append( + [residue_constants.HHBLITS_AA_TO_ID[res] for res in sequence]) + deletion_matrix.append(deletion_matrices[msa_index][sequence_index]) + + num_res = len(msas[0][0]) + num_alignments = len(int_msa) + features = {} + features['deletion_matrix_int'] = np.array(deletion_matrix, dtype=np.int32) + features['msa'] = np.array(int_msa, dtype=np.int32) + features['num_alignments'] = np.array( + [num_alignments] * num_res, dtype=np.int32) + return features + + +class DataPipeline: + """Runs the alignment tools and assembles the input features.""" + + def __init__(self, + jackhmmer_binary_path: str, + hhblits_binary_path: str, + hhsearch_binary_path: str, + uniref90_database_path: str, + mgnify_database_path: str, + bfd_database_path: Optional[str], + uniclust30_database_path: Optional[str], + small_bfd_database_path: Optional[str], + pdb70_database_path: str, + template_featurizer: templates.TemplateHitFeaturizer, + use_small_bfd: bool, + mgnify_max_hits: int = 501, + uniref_max_hits: int = 10000): + """Constructs a feature dict for a given FASTA file.""" + self._use_small_bfd = use_small_bfd + self.jackhmmer_uniref90_runner = jackhmmer.Jackhmmer( + binary_path=jackhmmer_binary_path, + database_path=uniref90_database_path) + if use_small_bfd: + self.jackhmmer_small_bfd_runner = jackhmmer.Jackhmmer( + binary_path=jackhmmer_binary_path, + database_path=small_bfd_database_path) + else: + self.hhblits_bfd_uniclust_runner = hhblits.HHBlits( + binary_path=hhblits_binary_path, + databases=[bfd_database_path, uniclust30_database_path]) + self.jackhmmer_mgnify_runner = jackhmmer.Jackhmmer( + binary_path=jackhmmer_binary_path, + database_path=mgnify_database_path) + self.hhsearch_pdb70_runner = hhsearch.HHSearch( + binary_path=hhsearch_binary_path, + databases=[pdb70_database_path]) + self.template_featurizer = template_featurizer + self.mgnify_max_hits = mgnify_max_hits + self.uniref_max_hits = uniref_max_hits + + def process(self, input_fasta_path: str, msa_output_dir: str) -> FeatureDict: + """Runs alignment tools on the input sequence and creates features.""" + with open(input_fasta_path) as f: + input_fasta_str = f.read() + input_seqs, input_descs = parsers.parse_fasta(input_fasta_str) + if len(input_seqs) != 1: + raise ValueError( + f'More than one input sequence found in {input_fasta_path}.') + input_sequence = input_seqs[0] + input_description = input_descs[0] + num_res = len(input_sequence) + + jackhmmer_uniref90_result = self.jackhmmer_uniref90_runner.query( + input_fasta_path)[0] + jackhmmer_mgnify_result = self.jackhmmer_mgnify_runner.query( + input_fasta_path)[0] + + uniref90_msa_as_a3m = parsers.convert_stockholm_to_a3m( + jackhmmer_uniref90_result['sto'], max_sequences=self.uniref_max_hits) + hhsearch_result = self.hhsearch_pdb70_runner.query(uniref90_msa_as_a3m) + + uniref90_out_path = os.path.join(msa_output_dir, 'uniref90_hits.sto') + with open(uniref90_out_path, 'w') as f: + f.write(jackhmmer_uniref90_result['sto']) + + mgnify_out_path = os.path.join(msa_output_dir, 'mgnify_hits.sto') + with open(mgnify_out_path, 'w') as f: + f.write(jackhmmer_mgnify_result['sto']) + + pdb70_out_path = os.path.join(msa_output_dir, 'pdb70_hits.hhr') + with open(pdb70_out_path, 'w') as f: + f.write(hhsearch_result) + + uniref90_msa, uniref90_deletion_matrix, _ = parsers.parse_stockholm( + jackhmmer_uniref90_result['sto']) + mgnify_msa, mgnify_deletion_matrix, _ = parsers.parse_stockholm( + jackhmmer_mgnify_result['sto']) + hhsearch_hits = parsers.parse_hhr(hhsearch_result) + mgnify_msa = mgnify_msa[:self.mgnify_max_hits] + mgnify_deletion_matrix = mgnify_deletion_matrix[:self.mgnify_max_hits] + + if self._use_small_bfd: + jackhmmer_small_bfd_result = self.jackhmmer_small_bfd_runner.query( + input_fasta_path)[0] + + bfd_out_path = os.path.join(msa_output_dir, 'small_bfd_hits.a3m') + with open(bfd_out_path, 'w') as f: + f.write(jackhmmer_small_bfd_result['sto']) + + bfd_msa, bfd_deletion_matrix, _ = parsers.parse_stockholm( + jackhmmer_small_bfd_result['sto']) + else: + hhblits_bfd_uniclust_result = self.hhblits_bfd_uniclust_runner.query( + input_fasta_path) + + bfd_out_path = os.path.join(msa_output_dir, 'bfd_uniclust_hits.a3m') + with open(bfd_out_path, 'w') as f: + f.write(hhblits_bfd_uniclust_result['a3m']) + + bfd_msa, bfd_deletion_matrix = parsers.parse_a3m( + hhblits_bfd_uniclust_result['a3m']) + + templates_result = self.template_featurizer.get_templates( + query_sequence=input_sequence, + query_pdb_code=None, + query_release_date=None, + hits=hhsearch_hits) + + sequence_features = make_sequence_features( + sequence=input_sequence, + description=input_description, + num_res=num_res) + + msa_features = make_msa_features( + msas=(uniref90_msa, bfd_msa, mgnify_msa), + deletion_matrices=(uniref90_deletion_matrix, + bfd_deletion_matrix, + mgnify_deletion_matrix)) + + logging.info('Uniref90 MSA size: %d sequences.', len(uniref90_msa)) + logging.info('BFD MSA size: %d sequences.', len(bfd_msa)) + logging.info('MGnify MSA size: %d sequences.', len(mgnify_msa)) + logging.info('Final (deduplicated) MSA size: %d sequences.', + msa_features['num_alignments'][0]) + logging.info('Total number of templates (NB: this can include bad ' + 'templates and is later filtered to top 4): %d.', + templates_result.features['template_domain_names'].shape[0]) + + return {**sequence_features, **msa_features, **templates_result.features} diff --git a/alphafold/alphafold/data/templates.py b/alphafold/alphafold/data/templates.py new file mode 100644 index 0000000000000000000000000000000000000000..9c1f2077351125b272b5970db5356631a29722f0 --- /dev/null +++ b/alphafold/alphafold/data/templates.py @@ -0,0 +1,922 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Functions for getting templates and calculating template features.""" +import dataclasses +import datetime +import glob +import os +import re +from typing import Any, Dict, Mapping, Optional, Sequence, Tuple + +from absl import logging +from alphafold.common import residue_constants +from alphafold.data import mmcif_parsing +from alphafold.data import parsers +from alphafold.data.tools import kalign +import numpy as np + +# Internal import (7716). + + +class Error(Exception): + """Base class for exceptions.""" + + +class NoChainsError(Error): + """An error indicating that template mmCIF didn't have any chains.""" + + +class SequenceNotInTemplateError(Error): + """An error indicating that template mmCIF didn't contain the sequence.""" + + +class NoAtomDataInTemplateError(Error): + """An error indicating that template mmCIF didn't contain atom positions.""" + + +class TemplateAtomMaskAllZerosError(Error): + """An error indicating that template mmCIF had all atom positions masked.""" + + +class QueryToTemplateAlignError(Error): + """An error indicating that the query can't be aligned to the template.""" + + +class CaDistanceError(Error): + """An error indicating that a CA atom distance exceeds a threshold.""" + + +class MultipleChainsError(Error): + """An error indicating that multiple chains were found for a given ID.""" + + +# Prefilter exceptions. +class PrefilterError(Exception): + """A base class for template prefilter exceptions.""" + + +class DateError(PrefilterError): + """An error indicating that the hit date was after the max allowed date.""" + + +class PdbIdError(PrefilterError): + """An error indicating that the hit PDB ID was identical to the query.""" + + +class AlignRatioError(PrefilterError): + """An error indicating that the hit align ratio to the query was too small.""" + + +class DuplicateError(PrefilterError): + """An error indicating that the hit was an exact subsequence of the query.""" + + +class LengthError(PrefilterError): + """An error indicating that the hit was too short.""" + + +TEMPLATE_FEATURES = { + 'template_aatype': np.float32, + 'template_all_atom_masks': np.float32, + 'template_all_atom_positions': np.float32, + 'template_domain_names': np.object, + 'template_sequence': np.object, + 'template_sum_probs': np.float32, +} + + +def _get_pdb_id_and_chain(hit: parsers.TemplateHit) -> Tuple[str, str]: + """Returns PDB id and chain id for an HHSearch Hit.""" + # PDB ID: 4 letters. Chain ID: 1+ alphanumeric letters or "." if unknown. + id_match = re.match(r'[a-zA-Z\d]{4}_[a-zA-Z0-9.]+', hit.name) + if not id_match: + raise ValueError(f'hit.name did not start with PDBID_chain: {hit.name}') + pdb_id, chain_id = id_match.group(0).split('_') + return pdb_id.lower(), chain_id + + +def _is_after_cutoff( + pdb_id: str, + release_dates: Mapping[str, datetime.datetime], + release_date_cutoff: Optional[datetime.datetime]) -> bool: + """Checks if the template date is after the release date cutoff. + + Args: + pdb_id: 4 letter pdb code. + release_dates: Dictionary mapping PDB ids to their structure release dates. + release_date_cutoff: Max release date that is valid for this query. + + Returns: + True if the template release date is after the cutoff, False otherwise. + """ + if release_date_cutoff is None: + raise ValueError('The release_date_cutoff must not be None.') + if pdb_id in release_dates: + return release_dates[pdb_id] > release_date_cutoff + else: + # Since this is just a quick prefilter to reduce the number of mmCIF files + # we need to parse, we don't have to worry about returning True here. + logging.warning('Template structure not in release dates dict: %s', pdb_id) + return False + + +def _parse_obsolete(obsolete_file_path: str) -> Mapping[str, Optional[str]]: + """Parses the data file from PDB that lists which pdb_ids are obsolete.""" + with open(obsolete_file_path) as f: + result = {} + for line in f: + line = line.strip() + # Format: Date From To + # 'OBSLTE 06-NOV-19 6G9Y' - Removed, rare + # 'OBSLTE 31-JUL-94 116L 216L' - Replaced, common + # 'OBSLTE 26-SEP-06 2H33 2JM5 2OWI' - Replaced by multiple, rare + if line.startswith('OBSLTE'): + if len(line) > 30: + # Replaced by at least one structure. + from_id = line[20:24].lower() + to_id = line[29:33].lower() + result[from_id] = to_id + elif len(line) == 24: + # Removed. + from_id = line[20:24].lower() + result[from_id] = None + return result + + +def _parse_release_dates(path: str) -> Mapping[str, datetime.datetime]: + """Parses release dates file, returns a mapping from PDBs to release dates.""" + if path.endswith('txt'): + release_dates = {} + with open(path, 'r') as f: + for line in f: + pdb_id, date = line.split(':') + date = date.strip() + # Python 3.6 doesn't have datetime.date.fromisoformat() which is about + # 90x faster than strptime. However, splitting the string manually is + # about 10x faster than strptime. + release_dates[pdb_id.strip()] = datetime.datetime( + year=int(date[:4]), month=int(date[5:7]), day=int(date[8:10])) + return release_dates + else: + raise ValueError('Invalid format of the release date file %s.' % path) + + +def _assess_hhsearch_hit( + hit: parsers.TemplateHit, + hit_pdb_code: str, + query_sequence: str, + query_pdb_code: Optional[str], + release_dates: Mapping[str, datetime.datetime], + release_date_cutoff: datetime.datetime, + max_subsequence_ratio: float = 0.95, + min_align_ratio: float = 0.1) -> bool: + """Determines if template is valid (without parsing the template mmcif file). + + Args: + hit: HhrHit for the template. + hit_pdb_code: The 4 letter pdb code of the template hit. This might be + different from the value in the actual hit since the original pdb might + have become obsolete. + query_sequence: Amino acid sequence of the query. + query_pdb_code: 4 letter pdb code of the query. + release_dates: Dictionary mapping pdb codes to their structure release + dates. + release_date_cutoff: Max release date that is valid for this query. + max_subsequence_ratio: Exclude any exact matches with this much overlap. + min_align_ratio: Minimum overlap between the template and query. + + Returns: + True if the hit passed the prefilter. Raises an exception otherwise. + + Raises: + DateError: If the hit date was after the max allowed date. + PdbIdError: If the hit PDB ID was identical to the query. + AlignRatioError: If the hit align ratio to the query was too small. + DuplicateError: If the hit was an exact subsequence of the query. + LengthError: If the hit was too short. + """ + aligned_cols = hit.aligned_cols + align_ratio = aligned_cols / len(query_sequence) + + template_sequence = hit.hit_sequence.replace('-', '') + length_ratio = float(len(template_sequence)) / len(query_sequence) + + # Check whether the template is a large subsequence or duplicate of original + # query. This can happen due to duplicate entries in the PDB database. + duplicate = (template_sequence in query_sequence and + length_ratio > max_subsequence_ratio) + + if _is_after_cutoff(hit_pdb_code, release_dates, release_date_cutoff): + raise DateError(f'Date ({release_dates[hit_pdb_code]}) > max template date ' + f'({release_date_cutoff}).') + + if query_pdb_code is not None: + if query_pdb_code.lower() == hit_pdb_code.lower(): + raise PdbIdError('PDB code identical to Query PDB code.') + + if align_ratio <= min_align_ratio: + raise AlignRatioError('Proportion of residues aligned to query too small. ' + f'Align ratio: {align_ratio}.') + + if duplicate: + raise DuplicateError('Template is an exact subsequence of query with large ' + f'coverage. Length ratio: {length_ratio}.') + + if len(template_sequence) < 10: + raise LengthError(f'Template too short. Length: {len(template_sequence)}.') + + return True + + +def _find_template_in_pdb( + template_chain_id: str, + template_sequence: str, + mmcif_object: mmcif_parsing.MmcifObject) -> Tuple[str, str, int]: + """Tries to find the template chain in the given pdb file. + + This method tries the three following things in order: + 1. Tries if there is an exact match in both the chain ID and the sequence. + If yes, the chain sequence is returned. Otherwise: + 2. Tries if there is an exact match only in the sequence. + If yes, the chain sequence is returned. Otherwise: + 3. Tries if there is a fuzzy match (X = wildcard) in the sequence. + If yes, the chain sequence is returned. + If none of these succeed, a SequenceNotInTemplateError is thrown. + + Args: + template_chain_id: The template chain ID. + template_sequence: The template chain sequence. + mmcif_object: The PDB object to search for the template in. + + Returns: + A tuple with: + * The chain sequence that was found to match the template in the PDB object. + * The ID of the chain that is being returned. + * The offset where the template sequence starts in the chain sequence. + + Raises: + SequenceNotInTemplateError: If no match is found after the steps described + above. + """ + # Try if there is an exact match in both the chain ID and the (sub)sequence. + pdb_id = mmcif_object.file_id + chain_sequence = mmcif_object.chain_to_seqres.get(template_chain_id) + if chain_sequence and (template_sequence in chain_sequence): + logging.info( + 'Found an exact template match %s_%s.', pdb_id, template_chain_id) + mapping_offset = chain_sequence.find(template_sequence) + return chain_sequence, template_chain_id, mapping_offset + + # Try if there is an exact match in the (sub)sequence only. + for chain_id, chain_sequence in mmcif_object.chain_to_seqres.items(): + if chain_sequence and (template_sequence in chain_sequence): + logging.info('Found a sequence-only match %s_%s.', pdb_id, chain_id) + mapping_offset = chain_sequence.find(template_sequence) + return chain_sequence, chain_id, mapping_offset + + # Return a chain sequence that fuzzy matches (X = wildcard) the template. + # Make parentheses unnamed groups (?:_) to avoid the 100 named groups limit. + regex = ['.' if aa == 'X' else '(?:%s|X)' % aa for aa in template_sequence] + regex = re.compile(''.join(regex)) + for chain_id, chain_sequence in mmcif_object.chain_to_seqres.items(): + match = re.search(regex, chain_sequence) + if match: + logging.info('Found a fuzzy sequence-only match %s_%s.', pdb_id, chain_id) + mapping_offset = match.start() + return chain_sequence, chain_id, mapping_offset + + # No hits, raise an error. + raise SequenceNotInTemplateError( + 'Could not find the template sequence in %s_%s. Template sequence: %s, ' + 'chain_to_seqres: %s' % (pdb_id, template_chain_id, template_sequence, + mmcif_object.chain_to_seqres)) + + +def _realign_pdb_template_to_query( + old_template_sequence: str, + template_chain_id: str, + mmcif_object: mmcif_parsing.MmcifObject, + old_mapping: Mapping[int, int], + kalign_binary_path: str) -> Tuple[str, Mapping[int, int]]: + """Aligns template from the mmcif_object to the query. + + In case PDB70 contains a different version of the template sequence, we need + to perform a realignment to the actual sequence that is in the mmCIF file. + This method performs such realignment, but returns the new sequence and + mapping only if the sequence in the mmCIF file is 90% identical to the old + sequence. + + Note that the old_template_sequence comes from the hit, and contains only that + part of the chain that matches with the query while the new_template_sequence + is the full chain. + + Args: + old_template_sequence: The template sequence that was returned by the PDB + template search (typically done using HHSearch). + template_chain_id: The template chain id was returned by the PDB template + search (typically done using HHSearch). This is used to find the right + chain in the mmcif_object chain_to_seqres mapping. + mmcif_object: A mmcif_object which holds the actual template data. + old_mapping: A mapping from the query sequence to the template sequence. + This mapping will be used to compute the new mapping from the query + sequence to the actual mmcif_object template sequence by aligning the + old_template_sequence and the actual template sequence. + kalign_binary_path: The path to a kalign executable. + + Returns: + A tuple (new_template_sequence, new_query_to_template_mapping) where: + * new_template_sequence is the actual template sequence that was found in + the mmcif_object. + * new_query_to_template_mapping is the new mapping from the query to the + actual template found in the mmcif_object. + + Raises: + QueryToTemplateAlignError: + * If there was an error thrown by the alignment tool. + * Or if the actual template sequence differs by more than 10% from the + old_template_sequence. + """ + aligner = kalign.Kalign(binary_path=kalign_binary_path) + new_template_sequence = mmcif_object.chain_to_seqres.get( + template_chain_id, '') + + # Sometimes the template chain id is unknown. But if there is only a single + # sequence within the mmcif_object, it is safe to assume it is that one. + if not new_template_sequence: + if len(mmcif_object.chain_to_seqres) == 1: + logging.info('Could not find %s in %s, but there is only 1 sequence, so ' + 'using that one.', + template_chain_id, + mmcif_object.file_id) + new_template_sequence = list(mmcif_object.chain_to_seqres.values())[0] + else: + raise QueryToTemplateAlignError( + f'Could not find chain {template_chain_id} in {mmcif_object.file_id}. ' + 'If there are no mmCIF parsing errors, it is possible it was not a ' + 'protein chain.') + + try: + (old_aligned_template, new_aligned_template), _ = parsers.parse_a3m( + aligner.align([old_template_sequence, new_template_sequence])) + except Exception as e: + raise QueryToTemplateAlignError( + 'Could not align old template %s to template %s (%s_%s). Error: %s' % + (old_template_sequence, new_template_sequence, mmcif_object.file_id, + template_chain_id, str(e))) + + logging.info('Old aligned template: %s\nNew aligned template: %s', + old_aligned_template, new_aligned_template) + + old_to_new_template_mapping = {} + old_template_index = -1 + new_template_index = -1 + num_same = 0 + for old_template_aa, new_template_aa in zip( + old_aligned_template, new_aligned_template): + if old_template_aa != '-': + old_template_index += 1 + if new_template_aa != '-': + new_template_index += 1 + if old_template_aa != '-' and new_template_aa != '-': + old_to_new_template_mapping[old_template_index] = new_template_index + if old_template_aa == new_template_aa: + num_same += 1 + + # Require at least 90 % sequence identity wrt to the shorter of the sequences. + if float(num_same) / min( + len(old_template_sequence), len(new_template_sequence)) < 0.9: + raise QueryToTemplateAlignError( + 'Insufficient similarity of the sequence in the database: %s to the ' + 'actual sequence in the mmCIF file %s_%s: %s. We require at least ' + '90 %% similarity wrt to the shorter of the sequences. This is not a ' + 'problem unless you think this is a template that should be included.' % + (old_template_sequence, mmcif_object.file_id, template_chain_id, + new_template_sequence)) + + new_query_to_template_mapping = {} + for query_index, old_template_index in old_mapping.items(): + new_query_to_template_mapping[query_index] = ( + old_to_new_template_mapping.get(old_template_index, -1)) + + new_template_sequence = new_template_sequence.replace('-', '') + + return new_template_sequence, new_query_to_template_mapping + + +def _check_residue_distances(all_positions: np.ndarray, + all_positions_mask: np.ndarray, + max_ca_ca_distance: float): + """Checks if the distance between unmasked neighbor residues is ok.""" + ca_position = residue_constants.atom_order['CA'] + prev_is_unmasked = False + prev_calpha = None + for i, (coords, mask) in enumerate(zip(all_positions, all_positions_mask)): + this_is_unmasked = bool(mask[ca_position]) + if this_is_unmasked: + this_calpha = coords[ca_position] + if prev_is_unmasked: + distance = np.linalg.norm(this_calpha - prev_calpha) + if distance > max_ca_ca_distance: + raise CaDistanceError( + 'The distance between residues %d and %d is %f > limit %f.' % ( + i, i + 1, distance, max_ca_ca_distance)) + prev_calpha = this_calpha + prev_is_unmasked = this_is_unmasked + + +def _get_atom_positions( + mmcif_object: mmcif_parsing.MmcifObject, + auth_chain_id: str, + max_ca_ca_distance: float) -> Tuple[np.ndarray, np.ndarray]: + """Gets atom positions and mask from a list of Biopython Residues.""" + num_res = len(mmcif_object.chain_to_seqres[auth_chain_id]) + + relevant_chains = [c for c in mmcif_object.structure.get_chains() + if c.id == auth_chain_id] + if len(relevant_chains) != 1: + raise MultipleChainsError( + f'Expected exactly one chain in structure with id {auth_chain_id}.') + chain = relevant_chains[0] + + all_positions = np.zeros([num_res, residue_constants.atom_type_num, 3]) + all_positions_mask = np.zeros([num_res, residue_constants.atom_type_num], + dtype=np.int64) + for res_index in range(num_res): + pos = np.zeros([residue_constants.atom_type_num, 3], dtype=np.float32) + mask = np.zeros([residue_constants.atom_type_num], dtype=np.float32) + res_at_position = mmcif_object.seqres_to_structure[auth_chain_id][res_index] + if not res_at_position.is_missing: + res = chain[(res_at_position.hetflag, + res_at_position.position.residue_number, + res_at_position.position.insertion_code)] + for atom in res.get_atoms(): + atom_name = atom.get_name() + x, y, z = atom.get_coord() + if atom_name in residue_constants.atom_order.keys(): + pos[residue_constants.atom_order[atom_name]] = [x, y, z] + mask[residue_constants.atom_order[atom_name]] = 1.0 + elif atom_name.upper() == 'SE' and res.get_resname() == 'MSE': + # Put the coordinates of the selenium atom in the sulphur column. + pos[residue_constants.atom_order['SD']] = [x, y, z] + mask[residue_constants.atom_order['SD']] = 1.0 + + all_positions[res_index] = pos + all_positions_mask[res_index] = mask + _check_residue_distances( + all_positions, all_positions_mask, max_ca_ca_distance) + return all_positions, all_positions_mask + + +def _extract_template_features( + mmcif_object: mmcif_parsing.MmcifObject, + pdb_id: str, + mapping: Mapping[int, int], + template_sequence: str, + query_sequence: str, + template_chain_id: str, + kalign_binary_path: str) -> Tuple[Dict[str, Any], Optional[str]]: + """Parses atom positions in the target structure and aligns with the query. + + Atoms for each residue in the template structure are indexed to coincide + with their corresponding residue in the query sequence, according to the + alignment mapping provided. + + Args: + mmcif_object: mmcif_parsing.MmcifObject representing the template. + pdb_id: PDB code for the template. + mapping: Dictionary mapping indices in the query sequence to indices in + the template sequence. + template_sequence: String describing the amino acid sequence for the + template protein. + query_sequence: String describing the amino acid sequence for the query + protein. + template_chain_id: String ID describing which chain in the structure proto + should be used. + kalign_binary_path: The path to a kalign executable used for template + realignment. + + Returns: + A tuple with: + * A dictionary containing the extra features derived from the template + protein structure. + * A warning message if the hit was realigned to the actual mmCIF sequence. + Otherwise None. + + Raises: + NoChainsError: If the mmcif object doesn't contain any chains. + SequenceNotInTemplateError: If the given chain id / sequence can't + be found in the mmcif object. + QueryToTemplateAlignError: If the actual template in the mmCIF file + can't be aligned to the query. + NoAtomDataInTemplateError: If the mmcif object doesn't contain + atom positions. + TemplateAtomMaskAllZerosError: If the mmcif object doesn't have any + unmasked residues. + """ + if mmcif_object is None or not mmcif_object.chain_to_seqres: + raise NoChainsError('No chains in PDB: %s_%s' % (pdb_id, template_chain_id)) + + warning = None + try: + seqres, chain_id, mapping_offset = _find_template_in_pdb( + template_chain_id=template_chain_id, + template_sequence=template_sequence, + mmcif_object=mmcif_object) + except SequenceNotInTemplateError: + # If PDB70 contains a different version of the template, we use the sequence + # from the mmcif_object. + chain_id = template_chain_id + warning = ( + f'The exact sequence {template_sequence} was not found in ' + f'{pdb_id}_{chain_id}. Realigning the template to the actual sequence.') + logging.warning(warning) + # This throws an exception if it fails to realign the hit. + seqres, mapping = _realign_pdb_template_to_query( + old_template_sequence=template_sequence, + template_chain_id=template_chain_id, + mmcif_object=mmcif_object, + old_mapping=mapping, + kalign_binary_path=kalign_binary_path) + logging.info('Sequence in %s_%s: %s successfully realigned to %s', + pdb_id, chain_id, template_sequence, seqres) + # The template sequence changed. + template_sequence = seqres + # No mapping offset, the query is aligned to the actual sequence. + mapping_offset = 0 + + try: + # Essentially set to infinity - we don't want to reject templates unless + # they're really really bad. + all_atom_positions, all_atom_mask = _get_atom_positions( + mmcif_object, chain_id, max_ca_ca_distance=150.0) + except (CaDistanceError, KeyError) as ex: + raise NoAtomDataInTemplateError( + 'Could not get atom data (%s_%s): %s' % (pdb_id, chain_id, str(ex)) + ) from ex + + all_atom_positions = np.split(all_atom_positions, all_atom_positions.shape[0]) + all_atom_masks = np.split(all_atom_mask, all_atom_mask.shape[0]) + + output_templates_sequence = [] + templates_all_atom_positions = [] + templates_all_atom_masks = [] + + for _ in query_sequence: + # Residues in the query_sequence that are not in the template_sequence: + templates_all_atom_positions.append( + np.zeros((residue_constants.atom_type_num, 3))) + templates_all_atom_masks.append(np.zeros(residue_constants.atom_type_num)) + output_templates_sequence.append('-') + + for k, v in mapping.items(): + template_index = v + mapping_offset + templates_all_atom_positions[k] = all_atom_positions[template_index][0] + templates_all_atom_masks[k] = all_atom_masks[template_index][0] + output_templates_sequence[k] = template_sequence[v] + + # Alanine (AA with the lowest number of atoms) has 5 atoms (C, CA, CB, N, O). + if np.sum(templates_all_atom_masks) < 5: + raise TemplateAtomMaskAllZerosError( + 'Template all atom mask was all zeros: %s_%s. Residue range: %d-%d' % + (pdb_id, chain_id, min(mapping.values()) + mapping_offset, + max(mapping.values()) + mapping_offset)) + + output_templates_sequence = ''.join(output_templates_sequence) + + templates_aatype = residue_constants.sequence_to_onehot( + output_templates_sequence, residue_constants.HHBLITS_AA_TO_ID) + + return ( + { + 'template_all_atom_positions': np.array(templates_all_atom_positions), + 'template_all_atom_masks': np.array(templates_all_atom_masks), + 'template_sequence': output_templates_sequence.encode(), + 'template_aatype': np.array(templates_aatype), + 'template_domain_names': f'{pdb_id.lower()}_{chain_id}'.encode(), + }, + warning) + + +def _build_query_to_hit_index_mapping( + hit_query_sequence: str, + hit_sequence: str, + indices_hit: Sequence[int], + indices_query: Sequence[int], + original_query_sequence: str) -> Mapping[int, int]: + """Gets mapping from indices in original query sequence to indices in the hit. + + hit_query_sequence and hit_sequence are two aligned sequences containing gap + characters. hit_query_sequence contains only the part of the original query + sequence that matched the hit. When interpreting the indices from the .hhr, we + need to correct for this to recover a mapping from original query sequence to + the hit sequence. + + Args: + hit_query_sequence: The portion of the query sequence that is in the .hhr + hit + hit_sequence: The portion of the hit sequence that is in the .hhr + indices_hit: The indices for each aminoacid relative to the hit sequence + indices_query: The indices for each aminoacid relative to the original query + sequence + original_query_sequence: String describing the original query sequence. + + Returns: + Dictionary with indices in the original query sequence as keys and indices + in the hit sequence as values. + """ + # If the hit is empty (no aligned residues), return empty mapping + if not hit_query_sequence: + return {} + + # Remove gaps and find the offset of hit.query relative to original query. + hhsearch_query_sequence = hit_query_sequence.replace('-', '') + hit_sequence = hit_sequence.replace('-', '') + hhsearch_query_offset = original_query_sequence.find(hhsearch_query_sequence) + + # Index of -1 used for gap characters. Subtract the min index ignoring gaps. + min_idx = min(x for x in indices_hit if x > -1) + fixed_indices_hit = [ + x - min_idx if x > -1 else -1 for x in indices_hit + ] + + min_idx = min(x for x in indices_query if x > -1) + fixed_indices_query = [x - min_idx if x > -1 else -1 for x in indices_query] + + # Zip the corrected indices, ignore case where both seqs have gap characters. + mapping = {} + for q_i, q_t in zip(fixed_indices_query, fixed_indices_hit): + if q_t != -1 and q_i != -1: + if (q_t >= len(hit_sequence) or + q_i + hhsearch_query_offset >= len(original_query_sequence)): + continue + mapping[q_i + hhsearch_query_offset] = q_t + + return mapping + + +@dataclasses.dataclass(frozen=True) +class SingleHitResult: + features: Optional[Mapping[str, Any]] + error: Optional[str] + warning: Optional[str] + + +def _process_single_hit( + query_sequence: str, + query_pdb_code: Optional[str], + hit: parsers.TemplateHit, + mmcif_dir: str, + max_template_date: datetime.datetime, + release_dates: Mapping[str, datetime.datetime], + obsolete_pdbs: Mapping[str, Optional[str]], + kalign_binary_path: str, + strict_error_check: bool = False) -> SingleHitResult: + """Tries to extract template features from a single HHSearch hit.""" + # Fail hard if we can't get the PDB ID and chain name from the hit. + hit_pdb_code, hit_chain_id = _get_pdb_id_and_chain(hit) + + # This hit has been removed (obsoleted) from PDB, skip it. + if hit_pdb_code in obsolete_pdbs and obsolete_pdbs[hit_pdb_code] is None: + return SingleHitResult( + features=None, error=None, warning=f'Hit {hit_pdb_code} is obsolete.') + + if hit_pdb_code not in release_dates: + if hit_pdb_code in obsolete_pdbs: + hit_pdb_code = obsolete_pdbs[hit_pdb_code] + + # Pass hit_pdb_code since it might have changed due to the pdb being obsolete. + try: + _assess_hhsearch_hit( + hit=hit, + hit_pdb_code=hit_pdb_code, + query_sequence=query_sequence, + query_pdb_code=query_pdb_code, + release_dates=release_dates, + release_date_cutoff=max_template_date) + except PrefilterError as e: + msg = f'hit {hit_pdb_code}_{hit_chain_id} did not pass prefilter: {str(e)}' + logging.info('%s: %s', query_pdb_code, msg) + if strict_error_check and isinstance( + e, (DateError, PdbIdError, DuplicateError)): + # In strict mode we treat some prefilter cases as errors. + return SingleHitResult(features=None, error=msg, warning=None) + + return SingleHitResult(features=None, error=None, warning=None) + + mapping = _build_query_to_hit_index_mapping( + hit.query, hit.hit_sequence, hit.indices_hit, hit.indices_query, + query_sequence) + + # The mapping is from the query to the actual hit sequence, so we need to + # remove gaps (which regardless have a missing confidence score). + template_sequence = hit.hit_sequence.replace('-', '') + + cif_path = os.path.join(mmcif_dir, hit_pdb_code + '.cif') + logging.info('Reading PDB entry from %s. Query: %s, template: %s', + cif_path, query_sequence, template_sequence) + # Fail if we can't find the mmCIF file. + with open(cif_path, 'r') as cif_file: + cif_string = cif_file.read() + + parsing_result = mmcif_parsing.parse( + file_id=hit_pdb_code, mmcif_string=cif_string) + + if parsing_result.mmcif_object is not None: + hit_release_date = datetime.datetime.strptime( + parsing_result.mmcif_object.header['release_date'], '%Y-%m-%d') + if hit_release_date > max_template_date: + error = ('Template %s date (%s) > max template date (%s).' % + (hit_pdb_code, hit_release_date, max_template_date)) + if strict_error_check: + return SingleHitResult(features=None, error=error, warning=None) + else: + logging.warning(error) + return SingleHitResult(features=None, error=None, warning=None) + + try: + features, realign_warning = _extract_template_features( + mmcif_object=parsing_result.mmcif_object, + pdb_id=hit_pdb_code, + mapping=mapping, + template_sequence=template_sequence, + query_sequence=query_sequence, + template_chain_id=hit_chain_id, + kalign_binary_path=kalign_binary_path) + features['template_sum_probs'] = [hit.sum_probs] + + # It is possible there were some errors when parsing the other chains in the + # mmCIF file, but the template features for the chain we want were still + # computed. In such case the mmCIF parsing errors are not relevant. + return SingleHitResult( + features=features, error=None, warning=realign_warning) + except (NoChainsError, NoAtomDataInTemplateError, + TemplateAtomMaskAllZerosError) as e: + # These 3 errors indicate missing mmCIF experimental data rather than a + # problem with the template search, so turn them into warnings. + warning = ('%s_%s (sum_probs: %.2f, rank: %d): feature extracting errors: ' + '%s, mmCIF parsing errors: %s' + % (hit_pdb_code, hit_chain_id, hit.sum_probs, hit.index, + str(e), parsing_result.errors)) + if strict_error_check: + return SingleHitResult(features=None, error=warning, warning=None) + else: + return SingleHitResult(features=None, error=None, warning=warning) + except Error as e: + error = ('%s_%s (sum_probs: %.2f, rank: %d): feature extracting errors: ' + '%s, mmCIF parsing errors: %s' + % (hit_pdb_code, hit_chain_id, hit.sum_probs, hit.index, + str(e), parsing_result.errors)) + return SingleHitResult(features=None, error=error, warning=None) + + +@dataclasses.dataclass(frozen=True) +class TemplateSearchResult: + features: Mapping[str, Any] + errors: Sequence[str] + warnings: Sequence[str] + + +class TemplateHitFeaturizer: + """A class for turning hhr hits to template features.""" + + def __init__( + self, + mmcif_dir: str, + max_template_date: str, + max_hits: int, + kalign_binary_path: str, + release_dates_path: Optional[str], + obsolete_pdbs_path: Optional[str], + strict_error_check: bool = False): + """Initializes the Template Search. + + Args: + mmcif_dir: Path to a directory with mmCIF structures. Once a template ID + is found by HHSearch, this directory is used to retrieve the template + data. + max_template_date: The maximum date permitted for template structures. No + template with date higher than this date will be returned. In ISO8601 + date format, YYYY-MM-DD. + max_hits: The maximum number of templates that will be returned. + kalign_binary_path: The path to a kalign executable used for template + realignment. + release_dates_path: An optional path to a file with a mapping from PDB IDs + to their release dates. Thanks to this we don't have to redundantly + parse mmCIF files to get that information. + obsolete_pdbs_path: An optional path to a file containing a mapping from + obsolete PDB IDs to the PDB IDs of their replacements. + strict_error_check: If True, then the following will be treated as errors: + * If any template date is after the max_template_date. + * If any template has identical PDB ID to the query. + * If any template is a duplicate of the query. + * Any feature computation errors. + """ + self._mmcif_dir = mmcif_dir + if not glob.glob(os.path.join(self._mmcif_dir, '*.cif')): + logging.error('Could not find CIFs in %s', self._mmcif_dir) + raise ValueError(f'Could not find CIFs in {self._mmcif_dir}') + + try: + self._max_template_date = datetime.datetime.strptime( + max_template_date, '%Y-%m-%d') + except ValueError: + raise ValueError( + 'max_template_date must be set and have format YYYY-MM-DD.') + self._max_hits = max_hits + self._kalign_binary_path = kalign_binary_path + self._strict_error_check = strict_error_check + + if release_dates_path: + logging.info('Using precomputed release dates %s.', release_dates_path) + self._release_dates = _parse_release_dates(release_dates_path) + else: + self._release_dates = {} + + if obsolete_pdbs_path: + logging.info('Using precomputed obsolete pdbs %s.', obsolete_pdbs_path) + self._obsolete_pdbs = _parse_obsolete(obsolete_pdbs_path) + else: + self._obsolete_pdbs = {} + + def get_templates( + self, + query_sequence: str, + query_pdb_code: Optional[str], + query_release_date: Optional[datetime.datetime], + hits: Sequence[parsers.TemplateHit]) -> TemplateSearchResult: + """Computes the templates for given query sequence (more details above).""" + logging.info('Searching for template for: %s', query_pdb_code) + + template_features = {} + for template_feature_name in TEMPLATE_FEATURES: + template_features[template_feature_name] = [] + + # Always use a max_template_date. Set to query_release_date minus 60 days + # if that's earlier. + template_cutoff_date = self._max_template_date + if query_release_date: + delta = datetime.timedelta(days=60) + if query_release_date - delta < template_cutoff_date: + template_cutoff_date = query_release_date - delta + assert template_cutoff_date < query_release_date + assert template_cutoff_date <= self._max_template_date + + num_hits = 0 + errors = [] + warnings = [] + + for hit in sorted(hits, key=lambda x: x.sum_probs, reverse=True): + # We got all the templates we wanted, stop processing hits. + if num_hits >= self._max_hits: + break + + result = _process_single_hit( + query_sequence=query_sequence, + query_pdb_code=query_pdb_code, + hit=hit, + mmcif_dir=self._mmcif_dir, + max_template_date=template_cutoff_date, + release_dates=self._release_dates, + obsolete_pdbs=self._obsolete_pdbs, + strict_error_check=self._strict_error_check, + kalign_binary_path=self._kalign_binary_path) + + if result.error: + errors.append(result.error) + + # There could be an error even if there are some results, e.g. thrown by + # other unparsable chains in the same mmCIF file. + if result.warning: + warnings.append(result.warning) + + if result.features is None: + logging.info('Skipped invalid hit %s, error: %s, warning: %s', + hit.name, result.error, result.warning) + else: + # Increment the hit counter, since we got features out of this hit. + num_hits += 1 + for k in template_features: + template_features[k].append(result.features[k]) + + for name in template_features: + if num_hits > 0: + template_features[name] = np.stack( + template_features[name], axis=0).astype(TEMPLATE_FEATURES[name]) + else: + # Make sure the feature has correct dtype even if empty. + template_features[name] = np.array([], dtype=TEMPLATE_FEATURES[name]) + + return TemplateSearchResult( + features=template_features, errors=errors, warnings=warnings) diff --git a/alphafold/alphafold/data/tools/__init__.py b/alphafold/alphafold/data/tools/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..903d09793c39d08491dd9a6fecefd463b058a251 --- /dev/null +++ b/alphafold/alphafold/data/tools/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. +"""Python wrappers for third party tools.""" diff --git a/alphafold/alphafold/data/tools/__pycache__/__init__.cpython-36.pyc b/alphafold/alphafold/data/tools/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67f0d96c121d4a015db61b2f0009d39a350938ea Binary files /dev/null and b/alphafold/alphafold/data/tools/__pycache__/__init__.cpython-36.pyc differ diff --git a/alphafold/alphafold/data/tools/__pycache__/__init__.cpython-38.pyc b/alphafold/alphafold/data/tools/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1781c5273c0289fda5b58c853b3feb751d4a0ed Binary files /dev/null and b/alphafold/alphafold/data/tools/__pycache__/__init__.cpython-38.pyc differ diff --git a/alphafold/alphafold/data/tools/__pycache__/hhblits.cpython-36.pyc b/alphafold/alphafold/data/tools/__pycache__/hhblits.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15f7784e6c281ae56f2490fed51dfed307622478 Binary files /dev/null and b/alphafold/alphafold/data/tools/__pycache__/hhblits.cpython-36.pyc differ diff --git a/alphafold/alphafold/data/tools/__pycache__/hhblits.cpython-38.pyc b/alphafold/alphafold/data/tools/__pycache__/hhblits.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e2ce8ddcd071050a1f294f9e786013c2cdac72f Binary files /dev/null and b/alphafold/alphafold/data/tools/__pycache__/hhblits.cpython-38.pyc differ diff --git a/alphafold/alphafold/data/tools/__pycache__/hhsearch.cpython-36.pyc b/alphafold/alphafold/data/tools/__pycache__/hhsearch.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ebdcfe8a2fe17f8786522f8e560a6f4c1ff34414 Binary files /dev/null and b/alphafold/alphafold/data/tools/__pycache__/hhsearch.cpython-36.pyc differ diff --git a/alphafold/alphafold/data/tools/__pycache__/hhsearch.cpython-38.pyc b/alphafold/alphafold/data/tools/__pycache__/hhsearch.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a177c317b0ed1f031e4d6bd9b33359e258449fa4 Binary files /dev/null and b/alphafold/alphafold/data/tools/__pycache__/hhsearch.cpython-38.pyc differ diff --git a/alphafold/alphafold/data/tools/__pycache__/jackhmmer.cpython-36.pyc b/alphafold/alphafold/data/tools/__pycache__/jackhmmer.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0946276f27e99ae5d14d64a79d4530b0b837988 Binary files /dev/null and b/alphafold/alphafold/data/tools/__pycache__/jackhmmer.cpython-36.pyc differ diff --git a/alphafold/alphafold/data/tools/__pycache__/jackhmmer.cpython-38.pyc b/alphafold/alphafold/data/tools/__pycache__/jackhmmer.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93dc5e8f0fde142ddb14be7bfc5370dfb332342a Binary files /dev/null and b/alphafold/alphafold/data/tools/__pycache__/jackhmmer.cpython-38.pyc differ diff --git a/alphafold/alphafold/data/tools/__pycache__/kalign.cpython-36.pyc b/alphafold/alphafold/data/tools/__pycache__/kalign.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d83bef5e93a9de8d6ed9c8239c13cb808f65dbb Binary files /dev/null and b/alphafold/alphafold/data/tools/__pycache__/kalign.cpython-36.pyc differ diff --git a/alphafold/alphafold/data/tools/__pycache__/kalign.cpython-38.pyc b/alphafold/alphafold/data/tools/__pycache__/kalign.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..238376d03229ab487cc06021300b008598dc99b9 Binary files /dev/null and b/alphafold/alphafold/data/tools/__pycache__/kalign.cpython-38.pyc differ diff --git a/alphafold/alphafold/data/tools/__pycache__/utils.cpython-36.pyc b/alphafold/alphafold/data/tools/__pycache__/utils.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4294afe43c8ba45d0b001262a16d557886db167d Binary files /dev/null and b/alphafold/alphafold/data/tools/__pycache__/utils.cpython-36.pyc differ diff --git a/alphafold/alphafold/data/tools/__pycache__/utils.cpython-38.pyc b/alphafold/alphafold/data/tools/__pycache__/utils.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..338df1b0c4ad6bae1ad939942e42fb349d707412 Binary files /dev/null and b/alphafold/alphafold/data/tools/__pycache__/utils.cpython-38.pyc differ diff --git a/alphafold/alphafold/data/tools/hhblits.py b/alphafold/alphafold/data/tools/hhblits.py new file mode 100644 index 0000000000000000000000000000000000000000..e0aa098a6f6a2e702340aafbde7a5a045b674543 --- /dev/null +++ b/alphafold/alphafold/data/tools/hhblits.py @@ -0,0 +1,155 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Library to run HHblits from Python.""" + +import glob +import os +import subprocess +from typing import Any, Mapping, Optional, Sequence + +from absl import logging +from alphafold.data.tools import utils +# Internal import (7716). + + +_HHBLITS_DEFAULT_P = 20 +_HHBLITS_DEFAULT_Z = 500 + + +class HHBlits: + """Python wrapper of the HHblits binary.""" + + def __init__(self, + *, + binary_path: str, + databases: Sequence[str], + n_cpu: int = 4, + n_iter: int = 3, + e_value: float = 0.001, + maxseq: int = 1_000_000, + realign_max: int = 100_000, + maxfilt: int = 100_000, + min_prefilter_hits: int = 1000, + all_seqs: bool = False, + alt: Optional[int] = None, + p: int = _HHBLITS_DEFAULT_P, + z: int = _HHBLITS_DEFAULT_Z): + """Initializes the Python HHblits wrapper. + + Args: + binary_path: The path to the HHblits executable. + databases: A sequence of HHblits database paths. This should be the + common prefix for the database files (i.e. up to but not including + _hhm.ffindex etc.) + n_cpu: The number of CPUs to give HHblits. + n_iter: The number of HHblits iterations. + e_value: The E-value, see HHblits docs for more details. + maxseq: The maximum number of rows in an input alignment. Note that this + parameter is only supported in HHBlits version 3.1 and higher. + realign_max: Max number of HMM-HMM hits to realign. HHblits default: 500. + maxfilt: Max number of hits allowed to pass the 2nd prefilter. + HHblits default: 20000. + min_prefilter_hits: Min number of hits to pass prefilter. + HHblits default: 100. + all_seqs: Return all sequences in the MSA / Do not filter the result MSA. + HHblits default: False. + alt: Show up to this many alternative alignments. + p: Minimum Prob for a hit to be included in the output hhr file. + HHblits default: 20. + z: Hard cap on number of hits reported in the hhr file. + HHblits default: 500. NB: The relevant HHblits flag is -Z not -z. + + Raises: + RuntimeError: If HHblits binary not found within the path. + """ + self.binary_path = binary_path + self.databases = databases + + for database_path in self.databases: + if not glob.glob(database_path + '_*'): + logging.error('Could not find HHBlits database %s', database_path) + raise ValueError(f'Could not find HHBlits database {database_path}') + + self.n_cpu = n_cpu + self.n_iter = n_iter + self.e_value = e_value + self.maxseq = maxseq + self.realign_max = realign_max + self.maxfilt = maxfilt + self.min_prefilter_hits = min_prefilter_hits + self.all_seqs = all_seqs + self.alt = alt + self.p = p + self.z = z + + def query(self, input_fasta_path: str) -> Mapping[str, Any]: + """Queries the database using HHblits.""" + with utils.tmpdir_manager(base_dir='/tmp') as query_tmp_dir: + a3m_path = os.path.join(query_tmp_dir, 'output.a3m') + + db_cmd = [] + for db_path in self.databases: + db_cmd.append('-d') + db_cmd.append(db_path) + cmd = [ + self.binary_path, + '-i', input_fasta_path, + '-cpu', str(self.n_cpu), + '-oa3m', a3m_path, + '-o', '/dev/null', + '-n', str(self.n_iter), + '-e', str(self.e_value), + '-maxseq', str(self.maxseq), + '-realign_max', str(self.realign_max), + '-maxfilt', str(self.maxfilt), + '-min_prefilter_hits', str(self.min_prefilter_hits)] + if self.all_seqs: + cmd += ['-all'] + if self.alt: + cmd += ['-alt', str(self.alt)] + if self.p != _HHBLITS_DEFAULT_P: + cmd += ['-p', str(self.p)] + if self.z != _HHBLITS_DEFAULT_Z: + cmd += ['-Z', str(self.z)] + cmd += db_cmd + + logging.info('Launching subprocess "%s"', ' '.join(cmd)) + process = subprocess.Popen( + cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + + with utils.timing('HHblits query'): + stdout, stderr = process.communicate() + retcode = process.wait() + + if retcode: + # Logs have a 15k character limit, so log HHblits error line by line. + logging.error('HHblits failed. HHblits stderr begin:') + for error_line in stderr.decode('utf-8').splitlines(): + if error_line.strip(): + logging.error(error_line.strip()) + logging.error('HHblits stderr end') + raise RuntimeError('HHblits failed\nstdout:\n%s\n\nstderr:\n%s\n' % ( + stdout.decode('utf-8'), stderr[:500_000].decode('utf-8'))) + + with open(a3m_path) as f: + a3m = f.read() + + raw_output = dict( + a3m=a3m, + output=stdout, + stderr=stderr, + n_iter=self.n_iter, + e_value=self.e_value) + return raw_output diff --git a/alphafold/alphafold/data/tools/hhsearch.py b/alphafold/alphafold/data/tools/hhsearch.py new file mode 100644 index 0000000000000000000000000000000000000000..fac137e0172f53e7c7ef943c5fa73dcb69f72246 --- /dev/null +++ b/alphafold/alphafold/data/tools/hhsearch.py @@ -0,0 +1,91 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Library to run HHsearch from Python.""" + +import glob +import os +import subprocess +from typing import Sequence + +from absl import logging + +from alphafold.data.tools import utils +# Internal import (7716). + + +class HHSearch: + """Python wrapper of the HHsearch binary.""" + + def __init__(self, + *, + binary_path: str, + databases: Sequence[str], + maxseq: int = 1_000_000): + """Initializes the Python HHsearch wrapper. + + Args: + binary_path: The path to the HHsearch executable. + databases: A sequence of HHsearch database paths. This should be the + common prefix for the database files (i.e. up to but not including + _hhm.ffindex etc.) + maxseq: The maximum number of rows in an input alignment. Note that this + parameter is only supported in HHBlits version 3.1 and higher. + + Raises: + RuntimeError: If HHsearch binary not found within the path. + """ + self.binary_path = binary_path + self.databases = databases + self.maxseq = maxseq + + for database_path in self.databases: + if not glob.glob(database_path + '_*'): + logging.error('Could not find HHsearch database %s', database_path) + raise ValueError(f'Could not find HHsearch database {database_path}') + + def query(self, a3m: str) -> str: + """Queries the database using HHsearch using a given a3m.""" + with utils.tmpdir_manager(base_dir='/tmp') as query_tmp_dir: + input_path = os.path.join(query_tmp_dir, 'query.a3m') + hhr_path = os.path.join(query_tmp_dir, 'output.hhr') + with open(input_path, 'w') as f: + f.write(a3m) + + db_cmd = [] + for db_path in self.databases: + db_cmd.append('-d') + db_cmd.append(db_path) + cmd = [self.binary_path, + '-i', input_path, + '-o', hhr_path, + '-maxseq', str(self.maxseq) + ] + db_cmd + + logging.info('Launching subprocess "%s"', ' '.join(cmd)) + process = subprocess.Popen( + cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + with utils.timing('HHsearch query'): + stdout, stderr = process.communicate() + retcode = process.wait() + + if retcode: + # Stderr is truncated to prevent proto size errors in Beam. + raise RuntimeError( + 'HHSearch failed:\nstdout:\n%s\n\nstderr:\n%s\n' % ( + stdout.decode('utf-8'), stderr[:100_000].decode('utf-8'))) + + with open(hhr_path) as f: + hhr = f.read() + return hhr diff --git a/alphafold/alphafold/data/tools/hmmbuild.py b/alphafold/alphafold/data/tools/hmmbuild.py new file mode 100644 index 0000000000000000000000000000000000000000..f3c573047450f5f17e791ad9a54f1b436e71b095 --- /dev/null +++ b/alphafold/alphafold/data/tools/hmmbuild.py @@ -0,0 +1,138 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""A Python wrapper for hmmbuild - construct HMM profiles from MSA.""" + +import os +import re +import subprocess + +from absl import logging +from alphafold.data.tools import utils +# Internal import (7716). + + +class Hmmbuild(object): + """Python wrapper of the hmmbuild binary.""" + + def __init__(self, + *, + binary_path: str, + singlemx: bool = False): + """Initializes the Python hmmbuild wrapper. + + Args: + binary_path: The path to the hmmbuild executable. + singlemx: Whether to use --singlemx flag. If True, it forces HMMBuild to + just use a common substitution score matrix. + + Raises: + RuntimeError: If hmmbuild binary not found within the path. + """ + self.binary_path = binary_path + self.singlemx = singlemx + + def build_profile_from_sto(self, sto: str, model_construction='fast') -> str: + """Builds a HHM for the aligned sequences given as an A3M string. + + Args: + sto: A string with the aligned sequences in the Stockholm format. + model_construction: Whether to use reference annotation in the msa to + determine consensus columns ('hand') or default ('fast'). + + Returns: + A string with the profile in the HMM format. + + Raises: + RuntimeError: If hmmbuild fails. + """ + return self._build_profile(sto, model_construction=model_construction) + + def build_profile_from_a3m(self, a3m: str) -> str: + """Builds a HHM for the aligned sequences given as an A3M string. + + Args: + a3m: A string with the aligned sequences in the A3M format. + + Returns: + A string with the profile in the HMM format. + + Raises: + RuntimeError: If hmmbuild fails. + """ + lines = [] + for line in a3m.splitlines(): + if not line.startswith('>'): + line = re.sub('[a-z]+', '', line) # Remove inserted residues. + lines.append(line + '\n') + msa = ''.join(lines) + return self._build_profile(msa, model_construction='fast') + + def _build_profile(self, msa: str, model_construction: str = 'fast') -> str: + """Builds a HMM for the aligned sequences given as an MSA string. + + Args: + msa: A string with the aligned sequences, in A3M or STO format. + model_construction: Whether to use reference annotation in the msa to + determine consensus columns ('hand') or default ('fast'). + + Returns: + A string with the profile in the HMM format. + + Raises: + RuntimeError: If hmmbuild fails. + ValueError: If unspecified arguments are provided. + """ + if model_construction not in {'hand', 'fast'}: + raise ValueError(f'Invalid model_construction {model_construction} - only' + 'hand and fast supported.') + + with utils.tmpdir_manager(base_dir='/tmp') as query_tmp_dir: + input_query = os.path.join(query_tmp_dir, 'query.msa') + output_hmm_path = os.path.join(query_tmp_dir, 'output.hmm') + + with open(input_query, 'w') as f: + f.write(msa) + + cmd = [self.binary_path] + # If adding flags, we have to do so before the output and input: + + if model_construction == 'hand': + cmd.append(f'--{model_construction}') + if self.singlemx: + cmd.append('--singlemx') + cmd.extend([ + '--amino', + output_hmm_path, + input_query, + ]) + + logging.info('Launching subprocess %s', cmd) + process = subprocess.Popen(cmd, stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + + with utils.timing('hmmbuild query'): + stdout, stderr = process.communicate() + retcode = process.wait() + logging.info('hmmbuild stdout:\n%s\n\nstderr:\n%s\n', + stdout.decode('utf-8'), stderr.decode('utf-8')) + + if retcode: + raise RuntimeError('hmmbuild failed\nstdout:\n%s\n\nstderr:\n%s\n' + % (stdout.decode('utf-8'), stderr.decode('utf-8'))) + + with open(output_hmm_path, encoding='utf-8') as f: + hmm = f.read() + + return hmm diff --git a/alphafold/alphafold/data/tools/hmmsearch.py b/alphafold/alphafold/data/tools/hmmsearch.py new file mode 100644 index 0000000000000000000000000000000000000000..a60d3e760e217f175b7daeffb803837e23391b0a --- /dev/null +++ b/alphafold/alphafold/data/tools/hmmsearch.py @@ -0,0 +1,90 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""A Python wrapper for hmmsearch - search profile against a sequence db.""" + +import os +import subprocess +from typing import Optional, Sequence + +from absl import logging +from alphafold.data.tools import utils +# Internal import (7716). + + +class Hmmsearch(object): + """Python wrapper of the hmmsearch binary.""" + + def __init__(self, + *, + binary_path: str, + database_path: str, + flags: Optional[Sequence[str]] = None): + """Initializes the Python hmmsearch wrapper. + + Args: + binary_path: The path to the hmmsearch executable. + database_path: The path to the hmmsearch database (FASTA format). + flags: List of flags to be used by hmmsearch. + + Raises: + RuntimeError: If hmmsearch binary not found within the path. + """ + self.binary_path = binary_path + self.database_path = database_path + self.flags = flags + + if not os.path.exists(self.database_path): + logging.error('Could not find hmmsearch database %s', database_path) + raise ValueError(f'Could not find hmmsearch database {database_path}') + + def query(self, hmm: str) -> str: + """Queries the database using hmmsearch using a given hmm.""" + with utils.tmpdir_manager(base_dir='/tmp') as query_tmp_dir: + hmm_input_path = os.path.join(query_tmp_dir, 'query.hmm') + a3m_out_path = os.path.join(query_tmp_dir, 'output.a3m') + with open(hmm_input_path, 'w') as f: + f.write(hmm) + + cmd = [ + self.binary_path, + '--noali', # Don't include the alignment in stdout. + '--cpu', '8' + ] + # If adding flags, we have to do so before the output and input: + if self.flags: + cmd.extend(self.flags) + cmd.extend([ + '-A', a3m_out_path, + hmm_input_path, + self.database_path, + ]) + + logging.info('Launching sub-process %s', cmd) + process = subprocess.Popen( + cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + with utils.timing( + f'hmmsearch ({os.path.basename(self.database_path)}) query'): + stdout, stderr = process.communicate() + retcode = process.wait() + + if retcode: + raise RuntimeError( + 'hmmsearch failed:\nstdout:\n%s\n\nstderr:\n%s\n' % ( + stdout.decode('utf-8'), stderr.decode('utf-8'))) + + with open(a3m_out_path) as f: + a3m_out = f.read() + + return a3m_out diff --git a/alphafold/alphafold/data/tools/jackhmmer.py b/alphafold/alphafold/data/tools/jackhmmer.py new file mode 100644 index 0000000000000000000000000000000000000000..194d266c1251de25d2f85ba3a2b338ca0adf95e0 --- /dev/null +++ b/alphafold/alphafold/data/tools/jackhmmer.py @@ -0,0 +1,198 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Library to run Jackhmmer from Python.""" + +from concurrent import futures +import glob +import os +import subprocess +from typing import Any, Callable, Mapping, Optional, Sequence +from urllib import request + +from absl import logging + +from alphafold.data.tools import utils +# Internal import (7716). + + +class Jackhmmer: + """Python wrapper of the Jackhmmer binary.""" + + def __init__(self, + *, + binary_path: str, + database_path: str, + n_cpu: int = 8, + n_iter: int = 1, + e_value: float = 0.0001, + z_value: Optional[int] = None, + get_tblout: bool = False, + filter_f1: float = 0.0005, + filter_f2: float = 0.00005, + filter_f3: float = 0.0000005, + incdom_e: Optional[float] = None, + dom_e: Optional[float] = None, + num_streamed_chunks: Optional[int] = None, + streaming_callback: Optional[Callable[[int], None]] = None): + """Initializes the Python Jackhmmer wrapper. + + Args: + binary_path: The path to the jackhmmer executable. + database_path: The path to the jackhmmer database (FASTA format). + n_cpu: The number of CPUs to give Jackhmmer. + n_iter: The number of Jackhmmer iterations. + e_value: The E-value, see Jackhmmer docs for more details. + z_value: The Z-value, see Jackhmmer docs for more details. + get_tblout: Whether to save tblout string. + filter_f1: MSV and biased composition pre-filter, set to >1.0 to turn off. + filter_f2: Viterbi pre-filter, set to >1.0 to turn off. + filter_f3: Forward pre-filter, set to >1.0 to turn off. + incdom_e: Domain e-value criteria for inclusion of domains in MSA/next + round. + dom_e: Domain e-value criteria for inclusion in tblout. + num_streamed_chunks: Number of database chunks to stream over. + streaming_callback: Callback function run after each chunk iteration with + the iteration number as argument. + """ + self.binary_path = binary_path + self.database_path = database_path + self.num_streamed_chunks = num_streamed_chunks + + if not os.path.exists(self.database_path) and num_streamed_chunks is None: + logging.error('Could not find Jackhmmer database %s', database_path) + raise ValueError(f'Could not find Jackhmmer database {database_path}') + + self.n_cpu = n_cpu + self.n_iter = n_iter + self.e_value = e_value + self.z_value = z_value + self.filter_f1 = filter_f1 + self.filter_f2 = filter_f2 + self.filter_f3 = filter_f3 + self.incdom_e = incdom_e + self.dom_e = dom_e + self.get_tblout = get_tblout + self.streaming_callback = streaming_callback + + def _query_chunk(self, input_fasta_path: str, database_path: str + ) -> Mapping[str, Any]: + """Queries the database chunk using Jackhmmer.""" + with utils.tmpdir_manager(base_dir='/tmp') as query_tmp_dir: + sto_path = os.path.join(query_tmp_dir, 'output.sto') + + # The F1/F2/F3 are the expected proportion to pass each of the filtering + # stages (which get progressively more expensive), reducing these + # speeds up the pipeline at the expensive of sensitivity. They are + # currently set very low to make querying Mgnify run in a reasonable + # amount of time. + cmd_flags = [ + # Don't pollute stdout with Jackhmmer output. + '-o', '/dev/null', + '-A', sto_path, + '--noali', + '--F1', str(self.filter_f1), + '--F2', str(self.filter_f2), + '--F3', str(self.filter_f3), + '--incE', str(self.e_value), + # Report only sequences with E-values <= x in per-sequence output. + '-E', str(self.e_value), + '--cpu', str(self.n_cpu), + '-N', str(self.n_iter) + ] + if self.get_tblout: + tblout_path = os.path.join(query_tmp_dir, 'tblout.txt') + cmd_flags.extend(['--tblout', tblout_path]) + + if self.z_value: + cmd_flags.extend(['-Z', str(self.z_value)]) + + if self.dom_e is not None: + cmd_flags.extend(['--domE', str(self.dom_e)]) + + if self.incdom_e is not None: + cmd_flags.extend(['--incdomE', str(self.incdom_e)]) + + cmd = [self.binary_path] + cmd_flags + [input_fasta_path, + database_path] + + logging.info('Launching subprocess "%s"', ' '.join(cmd)) + process = subprocess.Popen( + cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + with utils.timing( + f'Jackhmmer ({os.path.basename(database_path)}) query'): + _, stderr = process.communicate() + retcode = process.wait() + + if retcode: + raise RuntimeError( + 'Jackhmmer failed\nstderr:\n%s\n' % stderr.decode('utf-8')) + + # Get e-values for each target name + tbl = '' + if self.get_tblout: + with open(tblout_path) as f: + tbl = f.read() + + with open(sto_path) as f: + sto = f.read() + + raw_output = dict( + sto=sto, + tbl=tbl, + stderr=stderr, + n_iter=self.n_iter, + e_value=self.e_value) + + return raw_output + + def query(self, input_fasta_path: str) -> Sequence[Mapping[str, Any]]: + """Queries the database using Jackhmmer.""" + if self.num_streamed_chunks is None: + return [self._query_chunk(input_fasta_path, self.database_path)] + + db_basename = os.path.basename(self.database_path) + db_remote_chunk = lambda db_idx: f'{self.database_path}.{db_idx}' + db_local_chunk = lambda db_idx: f'/tmp/ramdisk/{db_basename}.{db_idx}' + + # Remove existing files to prevent OOM + for f in glob.glob(db_local_chunk('[0-9]*')): + try: + os.remove(f) + except OSError: + print(f'OSError while deleting {f}') + + # Download the (i+1)-th chunk while Jackhmmer is running on the i-th chunk + with futures.ThreadPoolExecutor(max_workers=2) as executor: + chunked_output = [] + for i in range(1, self.num_streamed_chunks + 1): + # Copy the chunk locally + if i == 1: + future = executor.submit( + request.urlretrieve, db_remote_chunk(i), db_local_chunk(i)) + if i < self.num_streamed_chunks: + next_future = executor.submit( + request.urlretrieve, db_remote_chunk(i+1), db_local_chunk(i+1)) + + # Run Jackhmmer with the chunk + future.result() + chunked_output.append( + self._query_chunk(input_fasta_path, db_local_chunk(i))) + + # Remove the local copy of the chunk + os.remove(db_local_chunk(i)) + future = next_future + if self.streaming_callback: + self.streaming_callback(i) + return chunked_output diff --git a/alphafold/alphafold/data/tools/kalign.py b/alphafold/alphafold/data/tools/kalign.py new file mode 100644 index 0000000000000000000000000000000000000000..fc4e58a43205c138b7f29c07f39a87ea741d2656 --- /dev/null +++ b/alphafold/alphafold/data/tools/kalign.py @@ -0,0 +1,104 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""A Python wrapper for Kalign.""" +import os +import subprocess +from typing import Sequence + +from absl import logging + +from alphafold.data.tools import utils +# Internal import (7716). + + +def _to_a3m(sequences: Sequence[str]) -> str: + """Converts sequences to an a3m file.""" + names = ['sequence %d' % i for i in range(1, len(sequences) + 1)] + a3m = [] + for sequence, name in zip(sequences, names): + a3m.append(u'>' + name + u'\n') + a3m.append(sequence + u'\n') + return ''.join(a3m) + + +class Kalign: + """Python wrapper of the Kalign binary.""" + + def __init__(self, *, binary_path: str): + """Initializes the Python Kalign wrapper. + + Args: + binary_path: The path to the Kalign binary. + + Raises: + RuntimeError: If Kalign binary not found within the path. + """ + self.binary_path = binary_path + + def align(self, sequences: Sequence[str]) -> str: + """Aligns the sequences and returns the alignment in A3M string. + + Args: + sequences: A list of query sequence strings. The sequences have to be at + least 6 residues long (Kalign requires this). Note that the order in + which you give the sequences might alter the output slightly as + different alignment tree might get constructed. + + Returns: + A string with the alignment in a3m format. + + Raises: + RuntimeError: If Kalign fails. + ValueError: If any of the sequences is less than 6 residues long. + """ + logging.info('Aligning %d sequences', len(sequences)) + + for s in sequences: + if len(s) < 6: + raise ValueError('Kalign requires all sequences to be at least 6 ' + 'residues long. Got %s (%d residues).' % (s, len(s))) + + with utils.tmpdir_manager(base_dir='/tmp') as query_tmp_dir: + input_fasta_path = os.path.join(query_tmp_dir, 'input.fasta') + output_a3m_path = os.path.join(query_tmp_dir, 'output.a3m') + + with open(input_fasta_path, 'w') as f: + f.write(_to_a3m(sequences)) + + cmd = [ + self.binary_path, + '-i', input_fasta_path, + '-o', output_a3m_path, + '-format', 'fasta', + ] + + logging.info('Launching subprocess "%s"', ' '.join(cmd)) + process = subprocess.Popen(cmd, stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + + with utils.timing('Kalign query'): + stdout, stderr = process.communicate() + retcode = process.wait() + logging.info('Kalign stdout:\n%s\n\nstderr:\n%s\n', + stdout.decode('utf-8'), stderr.decode('utf-8')) + + if retcode: + raise RuntimeError('Kalign failed\nstdout:\n%s\n\nstderr:\n%s\n' + % (stdout.decode('utf-8'), stderr.decode('utf-8'))) + + with open(output_a3m_path) as f: + a3m = f.read() + + return a3m diff --git a/alphafold/alphafold/data/tools/utils.py b/alphafold/alphafold/data/tools/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..e65b8824d3f240e869ca073a8264f32cb224813c --- /dev/null +++ b/alphafold/alphafold/data/tools/utils.py @@ -0,0 +1,40 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. +"""Common utilities for data pipeline tools.""" +import contextlib +import shutil +import tempfile +import time +from typing import Optional + +from absl import logging + + +@contextlib.contextmanager +def tmpdir_manager(base_dir: Optional[str] = None): + """Context manager that deletes a temporary directory on exit.""" + tmpdir = tempfile.mkdtemp(dir=base_dir) + try: + yield tmpdir + finally: + shutil.rmtree(tmpdir, ignore_errors=True) + + +@contextlib.contextmanager +def timing(msg: str): + logging.info('Started %s', msg) + tic = time.time() + yield + toc = time.time() + logging.info('Finished %s in %.3f seconds', msg, toc - tic) diff --git a/alphafold/alphafold/model/__init__.py b/alphafold/alphafold/model/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..fc2efc8d3e1439f8d264268adcde82231f784636 --- /dev/null +++ b/alphafold/alphafold/model/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. +"""Alphafold model.""" diff --git a/alphafold/alphafold/model/__pycache__/__init__.cpython-36.pyc b/alphafold/alphafold/model/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1d54c9dcc6deadba159eb7a2fe7e6da6d196a0d Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/__init__.cpython-36.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/__init__.cpython-38.pyc b/alphafold/alphafold/model/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d999bae77cb34b2e5ed927f009cfc43ec970052 Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/__init__.cpython-38.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/all_atom.cpython-36.pyc b/alphafold/alphafold/model/__pycache__/all_atom.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9a43b44b8e8e0ac18691e1027b69daeef0d15e1 Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/all_atom.cpython-36.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/all_atom.cpython-38.pyc b/alphafold/alphafold/model/__pycache__/all_atom.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f9e9a9fb90e0301874c36af87a40a648f09ba045 Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/all_atom.cpython-38.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/common_modules.cpython-36.pyc b/alphafold/alphafold/model/__pycache__/common_modules.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0dc9f5f77c0bcacd7ce34c642bb0aa62d04e7980 Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/common_modules.cpython-36.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/common_modules.cpython-38.pyc b/alphafold/alphafold/model/__pycache__/common_modules.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ab703a37bc90cbee5e85c11052d52a733da7caf Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/common_modules.cpython-38.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/config.cpython-36.pyc b/alphafold/alphafold/model/__pycache__/config.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c88c3c800525eac18346e7812d43276d9abd867 Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/config.cpython-36.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/config.cpython-38.pyc b/alphafold/alphafold/model/__pycache__/config.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..085c005042c1e3cbc926043bb6ebbe6c9942227a Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/config.cpython-38.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/data.cpython-36.pyc b/alphafold/alphafold/model/__pycache__/data.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e33ba9820d23c4ac54a05584fb7c2f2ad010e865 Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/data.cpython-36.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/data.cpython-38.pyc b/alphafold/alphafold/model/__pycache__/data.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..feb4d774c85f937b3a41ddcea3c25a2545c4abfe Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/data.cpython-38.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/features.cpython-36.pyc b/alphafold/alphafold/model/__pycache__/features.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d6b17e778291b85ef80c0cfe5849fc823bba07e3 Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/features.cpython-36.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/features.cpython-38.pyc b/alphafold/alphafold/model/__pycache__/features.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd461ef08fac7e1b78c45e8056744eba45aebe95 Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/features.cpython-38.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/folding.cpython-36.pyc b/alphafold/alphafold/model/__pycache__/folding.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c24d1154c9f480967af9f5ab6d6e712469983cfc Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/folding.cpython-36.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/folding.cpython-38.pyc b/alphafold/alphafold/model/__pycache__/folding.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..98e7e8d970c18372840c088c9c3190ad643fcdeb Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/folding.cpython-38.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/layer_stack.cpython-36.pyc b/alphafold/alphafold/model/__pycache__/layer_stack.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9b650d9e5210a083d835a6d1aaafb57aa1896b6 Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/layer_stack.cpython-36.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/layer_stack.cpython-38.pyc b/alphafold/alphafold/model/__pycache__/layer_stack.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b0aacfd2e49392aa476c13eab995777b7ce978ff Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/layer_stack.cpython-38.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/lddt.cpython-36.pyc b/alphafold/alphafold/model/__pycache__/lddt.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8f1f93f83996d8fb9b87b8ea3a21219f2ed40e1 Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/lddt.cpython-36.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/lddt.cpython-38.pyc b/alphafold/alphafold/model/__pycache__/lddt.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..829208e99f7f8d0f831cd2b594bc5c8627ee9dc7 Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/lddt.cpython-38.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/mapping.cpython-36.pyc b/alphafold/alphafold/model/__pycache__/mapping.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59cd2178b52c4090de9d3f5c5b5068fb46ea4837 Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/mapping.cpython-36.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/mapping.cpython-38.pyc b/alphafold/alphafold/model/__pycache__/mapping.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0f8f87fdcc36feff789e73bdb7f522096358be4 Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/mapping.cpython-38.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/model.cpython-36.pyc b/alphafold/alphafold/model/__pycache__/model.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d926bc684be148eefcf95cf0c59879dbf8fae227 Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/model.cpython-36.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/model.cpython-38.pyc b/alphafold/alphafold/model/__pycache__/model.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad9f7e4c4bab2c3ab65a940c00cf3dde4aa1af1d Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/model.cpython-38.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/modules.cpython-36.pyc b/alphafold/alphafold/model/__pycache__/modules.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d29f84243eb453e02fa064966514589c94a6ef7 Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/modules.cpython-36.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/modules.cpython-38.pyc b/alphafold/alphafold/model/__pycache__/modules.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fed453f7004f278f410c0df341ad8dd5eab549c Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/modules.cpython-38.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/prng.cpython-36.pyc b/alphafold/alphafold/model/__pycache__/prng.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59a38c6fcd88436233a5e07773df91d9356bbce3 Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/prng.cpython-36.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/prng.cpython-38.pyc b/alphafold/alphafold/model/__pycache__/prng.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..32ca6389e4ead4522f0d26b500ee81250b894c0b Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/prng.cpython-38.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/quat_affine.cpython-36.pyc b/alphafold/alphafold/model/__pycache__/quat_affine.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..56afe6ce70b6e0e5e23b205913d0a67425f955f3 Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/quat_affine.cpython-36.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/quat_affine.cpython-38.pyc b/alphafold/alphafold/model/__pycache__/quat_affine.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6c0ce8efd3dbc1aca335932ee8183517f39e5dc Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/quat_affine.cpython-38.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/r3.cpython-36.pyc b/alphafold/alphafold/model/__pycache__/r3.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a19f63f08ba68823f45693cd687f03c86a1f3f3a Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/r3.cpython-36.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/r3.cpython-38.pyc b/alphafold/alphafold/model/__pycache__/r3.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bae779261867f9606f1da39a6199687fa948c51d Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/r3.cpython-38.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/utils.cpython-36.pyc b/alphafold/alphafold/model/__pycache__/utils.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..04a84d393e0669ca5ede18c037c358b1e954f021 Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/utils.cpython-36.pyc differ diff --git a/alphafold/alphafold/model/__pycache__/utils.cpython-38.pyc b/alphafold/alphafold/model/__pycache__/utils.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..98673cfed72565f3289c21a7f1eea59b47cd49fc Binary files /dev/null and b/alphafold/alphafold/model/__pycache__/utils.cpython-38.pyc differ diff --git a/alphafold/alphafold/model/all_atom.py b/alphafold/alphafold/model/all_atom.py new file mode 100644 index 0000000000000000000000000000000000000000..c8ebe8b08c068876d8903fb5b1cc861e71e9095c --- /dev/null +++ b/alphafold/alphafold/model/all_atom.py @@ -0,0 +1,1141 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Ops for all atom representations. + +Generally we employ two different representations for all atom coordinates, +one is atom37 where each heavy atom corresponds to a given position in a 37 +dimensional array, This mapping is non amino acid specific, but each slot +corresponds to an atom of a given name, for example slot 12 always corresponds +to 'C delta 1', positions that are not present for a given amino acid are +zeroed out and denoted by a mask. +The other representation we employ is called atom14, this is a more dense way +of representing atoms with 14 slots. Here a given slot will correspond to a +different kind of atom depending on amino acid type, for example slot 5 +corresponds to 'N delta 2' for Aspargine, but to 'C delta 1' for Isoleucine. +14 is chosen because it is the maximum number of heavy atoms for any standard +amino acid. +The order of slots can be found in 'residue_constants.residue_atoms'. +Internally the model uses the atom14 representation because it is +computationally more efficient. +The internal atom14 representation is turned into the atom37 at the output of +the network to facilitate easier conversion to existing protein datastructures. +""" + +from typing import Dict, Optional +from alphafold.common import residue_constants + +from alphafold.model import r3 +from alphafold.model import utils +import jax +import jax.numpy as jnp +import numpy as np + + +def squared_difference(x, y): + return jnp.square(x - y) + + +def get_chi_atom_indices(): + """Returns atom indices needed to compute chi angles for all residue types. + + Returns: + A tensor of shape [residue_types=21, chis=4, atoms=4]. The residue types are + in the order specified in residue_constants.restypes + unknown residue type + at the end. For chi angles which are not defined on the residue, the + positions indices are by default set to 0. + """ + chi_atom_indices = [] + for residue_name in residue_constants.restypes: + residue_name = residue_constants.restype_1to3[residue_name] + residue_chi_angles = residue_constants.chi_angles_atoms[residue_name] + atom_indices = [] + for chi_angle in residue_chi_angles: + atom_indices.append( + [residue_constants.atom_order[atom] for atom in chi_angle]) + for _ in range(4 - len(atom_indices)): + atom_indices.append([0, 0, 0, 0]) # For chi angles not defined on the AA. + chi_atom_indices.append(atom_indices) + + chi_atom_indices.append([[0, 0, 0, 0]] * 4) # For UNKNOWN residue. + + return jnp.asarray(chi_atom_indices) + + +def atom14_to_atom37(atom14_data: jnp.ndarray, # (N, 14, ...) + batch: Dict[str, jnp.ndarray] + ) -> jnp.ndarray: # (N, 37, ...) + """Convert atom14 to atom37 representation.""" + assert len(atom14_data.shape) in [2, 3] + assert 'residx_atom37_to_atom14' in batch + assert 'atom37_atom_exists' in batch + + atom37_data = utils.batched_gather(atom14_data, + batch['residx_atom37_to_atom14'], + batch_dims=1) + if len(atom14_data.shape) == 2: + atom37_data *= batch['atom37_atom_exists'] + elif len(atom14_data.shape) == 3: + atom37_data *= batch['atom37_atom_exists'][:, :, + None].astype(atom37_data.dtype) + return atom37_data + + +def atom37_to_atom14( + atom37_data: jnp.ndarray, # (N, 37, ...) + batch: Dict[str, jnp.ndarray]) -> jnp.ndarray: # (N, 14, ...) + """Convert atom14 to atom37 representation.""" + assert len(atom37_data.shape) in [2, 3] + assert 'residx_atom14_to_atom37' in batch + assert 'atom14_atom_exists' in batch + + atom14_data = utils.batched_gather(atom37_data, + batch['residx_atom14_to_atom37'], + batch_dims=1) + if len(atom37_data.shape) == 2: + atom14_data *= batch['atom14_atom_exists'].astype(atom14_data.dtype) + elif len(atom37_data.shape) == 3: + atom14_data *= batch['atom14_atom_exists'][:, :, + None].astype(atom14_data.dtype) + return atom14_data + + +def atom37_to_frames( + aatype: jnp.ndarray, # (...) + all_atom_positions: jnp.ndarray, # (..., 37, 3) + all_atom_mask: jnp.ndarray, # (..., 37) +) -> Dict[str, jnp.ndarray]: + """Computes the frames for the up to 8 rigid groups for each residue. + + The rigid groups are defined by the possible torsions in a given amino acid. + We group the atoms according to their dependence on the torsion angles into + "rigid groups". E.g., the position of atoms in the chi2-group depend on + chi1 and chi2, but do not depend on chi3 or chi4. + Jumper et al. (2021) Suppl. Table 2 and corresponding text. + + Args: + aatype: Amino acid type, given as array with integers. + all_atom_positions: atom37 representation of all atom coordinates. + all_atom_mask: atom37 representation of mask on all atom coordinates. + Returns: + Dictionary containing: + * 'rigidgroups_gt_frames': 8 Frames corresponding to 'all_atom_positions' + represented as flat 12 dimensional array. + * 'rigidgroups_gt_exists': Mask denoting whether the atom positions for + the given frame are available in the ground truth, e.g. if they were + resolved in the experiment. + * 'rigidgroups_group_exists': Mask denoting whether given group is in + principle present for given amino acid type. + * 'rigidgroups_group_is_ambiguous': Mask denoting whether frame is + affected by naming ambiguity. + * 'rigidgroups_alt_gt_frames': 8 Frames with alternative atom renaming + corresponding to 'all_atom_positions' represented as flat + 12 dimensional array. + """ + # 0: 'backbone group', + # 1: 'pre-omega-group', (empty) + # 2: 'phi-group', (currently empty, because it defines only hydrogens) + # 3: 'psi-group', + # 4,5,6,7: 'chi1,2,3,4-group' + aatype_in_shape = aatype.shape + + # If there is a batch axis, just flatten it away, and reshape everything + # back at the end of the function. + aatype = jnp.reshape(aatype, [-1]) + all_atom_positions = jnp.reshape(all_atom_positions, [-1, 37, 3]) + all_atom_mask = jnp.reshape(all_atom_mask, [-1, 37]) + + # Create an array with the atom names. + # shape (num_restypes, num_rigidgroups, 3_atoms): (21, 8, 3) + restype_rigidgroup_base_atom_names = np.full([21, 8, 3], '', dtype=object) + + # 0: backbone frame + restype_rigidgroup_base_atom_names[:, 0, :] = ['C', 'CA', 'N'] + + # 3: 'psi-group' + restype_rigidgroup_base_atom_names[:, 3, :] = ['CA', 'C', 'O'] + + # 4,5,6,7: 'chi1,2,3,4-group' + for restype, restype_letter in enumerate(residue_constants.restypes): + resname = residue_constants.restype_1to3[restype_letter] + for chi_idx in range(4): + if residue_constants.chi_angles_mask[restype][chi_idx]: + atom_names = residue_constants.chi_angles_atoms[resname][chi_idx] + restype_rigidgroup_base_atom_names[ + restype, chi_idx + 4, :] = atom_names[1:] + + # Create mask for existing rigid groups. + restype_rigidgroup_mask = np.zeros([21, 8], dtype=np.float32) + restype_rigidgroup_mask[:, 0] = 1 + restype_rigidgroup_mask[:, 3] = 1 + restype_rigidgroup_mask[:20, 4:] = residue_constants.chi_angles_mask + + # Translate atom names into atom37 indices. + lookuptable = residue_constants.atom_order.copy() + lookuptable[''] = 0 + restype_rigidgroup_base_atom37_idx = np.vectorize(lambda x: lookuptable[x])( + restype_rigidgroup_base_atom_names) + + # Compute the gather indices for all residues in the chain. + # shape (N, 8, 3) + residx_rigidgroup_base_atom37_idx = utils.batched_gather( + restype_rigidgroup_base_atom37_idx, aatype) + + # Gather the base atom positions for each rigid group. + base_atom_pos = utils.batched_gather( + all_atom_positions, + residx_rigidgroup_base_atom37_idx, + batch_dims=1) + + # Compute the Rigids. + gt_frames = r3.rigids_from_3_points( + point_on_neg_x_axis=r3.vecs_from_tensor(base_atom_pos[:, :, 0, :]), + origin=r3.vecs_from_tensor(base_atom_pos[:, :, 1, :]), + point_on_xy_plane=r3.vecs_from_tensor(base_atom_pos[:, :, 2, :]) + ) + + # Compute a mask whether the group exists. + # (N, 8) + group_exists = utils.batched_gather(restype_rigidgroup_mask, aatype) + + # Compute a mask whether ground truth exists for the group + gt_atoms_exist = utils.batched_gather( # shape (N, 8, 3) + all_atom_mask.astype(jnp.float32), + residx_rigidgroup_base_atom37_idx, + batch_dims=1) + gt_exists = jnp.min(gt_atoms_exist, axis=-1) * group_exists # (N, 8) + + # Adapt backbone frame to old convention (mirror x-axis and z-axis). + rots = np.tile(np.eye(3, dtype=np.float32), [8, 1, 1]) + rots[0, 0, 0] = -1 + rots[0, 2, 2] = -1 + gt_frames = r3.rigids_mul_rots(gt_frames, r3.rots_from_tensor3x3(rots)) + + # The frames for ambiguous rigid groups are just rotated by 180 degree around + # the x-axis. The ambiguous group is always the last chi-group. + restype_rigidgroup_is_ambiguous = np.zeros([21, 8], dtype=np.float32) + restype_rigidgroup_rots = np.tile(np.eye(3, dtype=np.float32), [21, 8, 1, 1]) + + for resname, _ in residue_constants.residue_atom_renaming_swaps.items(): + restype = residue_constants.restype_order[ + residue_constants.restype_3to1[resname]] + chi_idx = int(sum(residue_constants.chi_angles_mask[restype]) - 1) + restype_rigidgroup_is_ambiguous[restype, chi_idx + 4] = 1 + restype_rigidgroup_rots[restype, chi_idx + 4, 1, 1] = -1 + restype_rigidgroup_rots[restype, chi_idx + 4, 2, 2] = -1 + + # Gather the ambiguity information for each residue. + residx_rigidgroup_is_ambiguous = utils.batched_gather( + restype_rigidgroup_is_ambiguous, aatype) + residx_rigidgroup_ambiguity_rot = utils.batched_gather( + restype_rigidgroup_rots, aatype) + + # Create the alternative ground truth frames. + alt_gt_frames = r3.rigids_mul_rots( + gt_frames, r3.rots_from_tensor3x3(residx_rigidgroup_ambiguity_rot)) + + gt_frames_flat12 = r3.rigids_to_tensor_flat12(gt_frames) + alt_gt_frames_flat12 = r3.rigids_to_tensor_flat12(alt_gt_frames) + + # reshape back to original residue layout + gt_frames_flat12 = jnp.reshape(gt_frames_flat12, aatype_in_shape + (8, 12)) + gt_exists = jnp.reshape(gt_exists, aatype_in_shape + (8,)) + group_exists = jnp.reshape(group_exists, aatype_in_shape + (8,)) + gt_frames_flat12 = jnp.reshape(gt_frames_flat12, aatype_in_shape + (8, 12)) + residx_rigidgroup_is_ambiguous = jnp.reshape(residx_rigidgroup_is_ambiguous, + aatype_in_shape + (8,)) + alt_gt_frames_flat12 = jnp.reshape(alt_gt_frames_flat12, + aatype_in_shape + (8, 12,)) + + return { + 'rigidgroups_gt_frames': gt_frames_flat12, # (..., 8, 12) + 'rigidgroups_gt_exists': gt_exists, # (..., 8) + 'rigidgroups_group_exists': group_exists, # (..., 8) + 'rigidgroups_group_is_ambiguous': + residx_rigidgroup_is_ambiguous, # (..., 8) + 'rigidgroups_alt_gt_frames': alt_gt_frames_flat12, # (..., 8, 12) + } + + +def atom37_to_torsion_angles( + aatype: jnp.ndarray, # (B, N) + all_atom_pos: jnp.ndarray, # (B, N, 37, 3) + all_atom_mask: jnp.ndarray, # (B, N, 37) + placeholder_for_undefined=False, +) -> Dict[str, jnp.ndarray]: + """Computes the 7 torsion angles (in sin, cos encoding) for each residue. + + The 7 torsion angles are in the order + '[pre_omega, phi, psi, chi_1, chi_2, chi_3, chi_4]', + here pre_omega denotes the omega torsion angle between the given amino acid + and the previous amino acid. + + Args: + aatype: Amino acid type, given as array with integers. + all_atom_pos: atom37 representation of all atom coordinates. + all_atom_mask: atom37 representation of mask on all atom coordinates. + placeholder_for_undefined: flag denoting whether to set masked torsion + angles to zero. + Returns: + Dict containing: + * 'torsion_angles_sin_cos': Array with shape (B, N, 7, 2) where the final + 2 dimensions denote sin and cos respectively + * 'alt_torsion_angles_sin_cos': same as 'torsion_angles_sin_cos', but + with the angle shifted by pi for all chi angles affected by the naming + ambiguities. + * 'torsion_angles_mask': Mask for which chi angles are present. + """ + + # Map aatype > 20 to 'Unknown' (20). + aatype = jnp.minimum(aatype, 20) + + # Compute the backbone angles. + num_batch, num_res = aatype.shape + + pad = jnp.zeros([num_batch, 1, 37, 3], jnp.float32) + prev_all_atom_pos = jnp.concatenate([pad, all_atom_pos[:, :-1, :, :]], axis=1) + + pad = jnp.zeros([num_batch, 1, 37], jnp.float32) + prev_all_atom_mask = jnp.concatenate([pad, all_atom_mask[:, :-1, :]], axis=1) + + # For each torsion angle collect the 4 atom positions that define this angle. + # shape (B, N, atoms=4, xyz=3) + pre_omega_atom_pos = jnp.concatenate( + [prev_all_atom_pos[:, :, 1:3, :], # prev CA, C + all_atom_pos[:, :, 0:2, :] # this N, CA + ], axis=-2) + phi_atom_pos = jnp.concatenate( + [prev_all_atom_pos[:, :, 2:3, :], # prev C + all_atom_pos[:, :, 0:3, :] # this N, CA, C + ], axis=-2) + psi_atom_pos = jnp.concatenate( + [all_atom_pos[:, :, 0:3, :], # this N, CA, C + all_atom_pos[:, :, 4:5, :] # this O + ], axis=-2) + + # Collect the masks from these atoms. + # Shape [batch, num_res] + pre_omega_mask = ( + jnp.prod(prev_all_atom_mask[:, :, 1:3], axis=-1) # prev CA, C + * jnp.prod(all_atom_mask[:, :, 0:2], axis=-1)) # this N, CA + phi_mask = ( + prev_all_atom_mask[:, :, 2] # prev C + * jnp.prod(all_atom_mask[:, :, 0:3], axis=-1)) # this N, CA, C + psi_mask = ( + jnp.prod(all_atom_mask[:, :, 0:3], axis=-1) * # this N, CA, C + all_atom_mask[:, :, 4]) # this O + + # Collect the atoms for the chi-angles. + # Compute the table of chi angle indices. Shape: [restypes, chis=4, atoms=4]. + chi_atom_indices = get_chi_atom_indices() + # Select atoms to compute chis. Shape: [batch, num_res, chis=4, atoms=4]. + atom_indices = utils.batched_gather( + params=chi_atom_indices, indices=aatype, axis=0, batch_dims=0) + # Gather atom positions. Shape: [batch, num_res, chis=4, atoms=4, xyz=3]. + chis_atom_pos = utils.batched_gather( + params=all_atom_pos, indices=atom_indices, axis=-2, + batch_dims=2) + + # Copy the chi angle mask, add the UNKNOWN residue. Shape: [restypes, 4]. + chi_angles_mask = list(residue_constants.chi_angles_mask) + chi_angles_mask.append([0.0, 0.0, 0.0, 0.0]) + chi_angles_mask = jnp.asarray(chi_angles_mask) + + # Compute the chi angle mask. I.e. which chis angles exist according to the + # aatype. Shape [batch, num_res, chis=4]. + chis_mask = utils.batched_gather(params=chi_angles_mask, indices=aatype, + axis=0, batch_dims=0) + + # Constrain the chis_mask to those chis, where the ground truth coordinates of + # all defining four atoms are available. + # Gather the chi angle atoms mask. Shape: [batch, num_res, chis=4, atoms=4]. + chi_angle_atoms_mask = utils.batched_gather( + params=all_atom_mask, indices=atom_indices, axis=-1, + batch_dims=2) + # Check if all 4 chi angle atoms were set. Shape: [batch, num_res, chis=4]. + chi_angle_atoms_mask = jnp.prod(chi_angle_atoms_mask, axis=[-1]) + chis_mask = chis_mask * (chi_angle_atoms_mask).astype(jnp.float32) + + # Stack all torsion angle atom positions. + # Shape (B, N, torsions=7, atoms=4, xyz=3) + torsions_atom_pos = jnp.concatenate( + [pre_omega_atom_pos[:, :, None, :, :], + phi_atom_pos[:, :, None, :, :], + psi_atom_pos[:, :, None, :, :], + chis_atom_pos + ], axis=2) + + # Stack up masks for all torsion angles. + # shape (B, N, torsions=7) + torsion_angles_mask = jnp.concatenate( + [pre_omega_mask[:, :, None], + phi_mask[:, :, None], + psi_mask[:, :, None], + chis_mask + ], axis=2) + + # Create a frame from the first three atoms: + # First atom: point on x-y-plane + # Second atom: point on negative x-axis + # Third atom: origin + # r3.Rigids (B, N, torsions=7) + torsion_frames = r3.rigids_from_3_points( + point_on_neg_x_axis=r3.vecs_from_tensor(torsions_atom_pos[:, :, :, 1, :]), + origin=r3.vecs_from_tensor(torsions_atom_pos[:, :, :, 2, :]), + point_on_xy_plane=r3.vecs_from_tensor(torsions_atom_pos[:, :, :, 0, :])) + + # Compute the position of the forth atom in this frame (y and z coordinate + # define the chi angle) + # r3.Vecs (B, N, torsions=7) + forth_atom_rel_pos = r3.rigids_mul_vecs( + r3.invert_rigids(torsion_frames), + r3.vecs_from_tensor(torsions_atom_pos[:, :, :, 3, :])) + + # Normalize to have the sin and cos of the torsion angle. + # jnp.ndarray (B, N, torsions=7, sincos=2) + torsion_angles_sin_cos = jnp.stack( + [forth_atom_rel_pos.z, forth_atom_rel_pos.y], axis=-1) + torsion_angles_sin_cos /= jnp.sqrt( + jnp.sum(jnp.square(torsion_angles_sin_cos), axis=-1, keepdims=True) + + 1e-8) + + # Mirror psi, because we computed it from the Oxygen-atom. + torsion_angles_sin_cos *= jnp.asarray( + [1., 1., -1., 1., 1., 1., 1.])[None, None, :, None] + + # Create alternative angles for ambiguous atom names. + chi_is_ambiguous = utils.batched_gather( + jnp.asarray(residue_constants.chi_pi_periodic), aatype) + mirror_torsion_angles = jnp.concatenate( + [jnp.ones([num_batch, num_res, 3]), + 1.0 - 2.0 * chi_is_ambiguous], axis=-1) + alt_torsion_angles_sin_cos = ( + torsion_angles_sin_cos * mirror_torsion_angles[:, :, :, None]) + + if placeholder_for_undefined: + # Add placeholder torsions in place of undefined torsion angles + # (e.g. N-terminus pre-omega) + placeholder_torsions = jnp.stack([ + jnp.ones(torsion_angles_sin_cos.shape[:-1]), + jnp.zeros(torsion_angles_sin_cos.shape[:-1]) + ], axis=-1) + torsion_angles_sin_cos = torsion_angles_sin_cos * torsion_angles_mask[ + ..., None] + placeholder_torsions * (1 - torsion_angles_mask[..., None]) + alt_torsion_angles_sin_cos = alt_torsion_angles_sin_cos * torsion_angles_mask[ + ..., None] + placeholder_torsions * (1 - torsion_angles_mask[..., None]) + + return { + 'torsion_angles_sin_cos': torsion_angles_sin_cos, # (B, N, 7, 2) + 'alt_torsion_angles_sin_cos': alt_torsion_angles_sin_cos, # (B, N, 7, 2) + 'torsion_angles_mask': torsion_angles_mask # (B, N, 7) + } + + +def torsion_angles_to_frames( + aatype: jnp.ndarray, # (N) + backb_to_global: r3.Rigids, # (N) + torsion_angles_sin_cos: jnp.ndarray # (N, 7, 2) +) -> r3.Rigids: # (N, 8) + """Compute rigid group frames from torsion angles. + + Jumper et al. (2021) Suppl. Alg. 24 "computeAllAtomCoordinates" lines 2-10 + Jumper et al. (2021) Suppl. Alg. 25 "makeRotX" + + Args: + aatype: aatype for each residue + backb_to_global: Rigid transformations describing transformation from + backbone frame to global frame. + torsion_angles_sin_cos: sin and cosine of the 7 torsion angles + Returns: + Frames corresponding to all the Sidechain Rigid Transforms + """ + assert len(aatype.shape) == 1 + assert len(backb_to_global.rot.xx.shape) == 1 + assert len(torsion_angles_sin_cos.shape) == 3 + assert torsion_angles_sin_cos.shape[1] == 7 + assert torsion_angles_sin_cos.shape[2] == 2 + + # Gather the default frames for all rigid groups. + # r3.Rigids with shape (N, 8) + m = utils.batched_gather(residue_constants.restype_rigid_group_default_frame, + aatype) + default_frames = r3.rigids_from_tensor4x4(m) + + # Create the rotation matrices according to the given angles (each frame is + # defined such that its rotation is around the x-axis). + sin_angles = torsion_angles_sin_cos[..., 0] + cos_angles = torsion_angles_sin_cos[..., 1] + + # insert zero rotation for backbone group. + num_residues, = aatype.shape + sin_angles = jnp.concatenate([jnp.zeros([num_residues, 1]), sin_angles], + axis=-1) + cos_angles = jnp.concatenate([jnp.ones([num_residues, 1]), cos_angles], + axis=-1) + zeros = jnp.zeros_like(sin_angles) + ones = jnp.ones_like(sin_angles) + + # all_rots are r3.Rots with shape (N, 8) + all_rots = r3.Rots(ones, zeros, zeros, + zeros, cos_angles, -sin_angles, + zeros, sin_angles, cos_angles) + + # Apply rotations to the frames. + all_frames = r3.rigids_mul_rots(default_frames, all_rots) + + # chi2, chi3, and chi4 frames do not transform to the backbone frame but to + # the previous frame. So chain them up accordingly. + chi2_frame_to_frame = jax.tree_map(lambda x: x[:, 5], all_frames) + chi3_frame_to_frame = jax.tree_map(lambda x: x[:, 6], all_frames) + chi4_frame_to_frame = jax.tree_map(lambda x: x[:, 7], all_frames) + + chi1_frame_to_backb = jax.tree_map(lambda x: x[:, 4], all_frames) + chi2_frame_to_backb = r3.rigids_mul_rigids(chi1_frame_to_backb, + chi2_frame_to_frame) + chi3_frame_to_backb = r3.rigids_mul_rigids(chi2_frame_to_backb, + chi3_frame_to_frame) + chi4_frame_to_backb = r3.rigids_mul_rigids(chi3_frame_to_backb, + chi4_frame_to_frame) + + # Recombine them to a r3.Rigids with shape (N, 8). + def _concat_frames(xall, x5, x6, x7): + return jnp.concatenate( + [xall[:, 0:5], x5[:, None], x6[:, None], x7[:, None]], axis=-1) + + all_frames_to_backb = jax.tree_map( + _concat_frames, + all_frames, + chi2_frame_to_backb, + chi3_frame_to_backb, + chi4_frame_to_backb) + + # Create the global frames. + # shape (N, 8) + all_frames_to_global = r3.rigids_mul_rigids( + jax.tree_map(lambda x: x[:, None], backb_to_global), + all_frames_to_backb) + + return all_frames_to_global + + +def frames_and_literature_positions_to_atom14_pos( + aatype: jnp.ndarray, # (N) + all_frames_to_global: r3.Rigids # (N, 8) +) -> r3.Vecs: # (N, 14) + """Put atom literature positions (atom14 encoding) in each rigid group. + + Jumper et al. (2021) Suppl. Alg. 24 "computeAllAtomCoordinates" line 11 + + Args: + aatype: aatype for each residue. + all_frames_to_global: All per residue coordinate frames. + Returns: + Positions of all atom coordinates in global frame. + """ + + # Pick the appropriate transform for every atom. + residx_to_group_idx = utils.batched_gather( + residue_constants.restype_atom14_to_rigid_group, aatype) + group_mask = jax.nn.one_hot( + residx_to_group_idx, num_classes=8) # shape (N, 14, 8) + + # r3.Rigids with shape (N, 14) + map_atoms_to_global = jax.tree_map( + lambda x: jnp.sum(x[:, None, :] * group_mask, axis=-1), + all_frames_to_global) + + # Gather the literature atom positions for each residue. + # r3.Vecs with shape (N, 14) + lit_positions = r3.vecs_from_tensor( + utils.batched_gather( + residue_constants.restype_atom14_rigid_group_positions, aatype)) + + # Transform each atom from its local frame to the global frame. + # r3.Vecs with shape (N, 14) + pred_positions = r3.rigids_mul_vecs(map_atoms_to_global, lit_positions) + + # Mask out non-existing atoms. + mask = utils.batched_gather(residue_constants.restype_atom14_mask, aatype) + pred_positions = jax.tree_map(lambda x: x * mask, pred_positions) + + return pred_positions + + +def extreme_ca_ca_distance_violations( + pred_atom_positions: jnp.ndarray, # (N, 37(14), 3) + pred_atom_mask: jnp.ndarray, # (N, 37(14)) + residue_index: jnp.ndarray, # (N) + max_angstrom_tolerance=1.5 + ) -> jnp.ndarray: + """Counts residues whose Ca is a large distance from its neighbour. + + Measures the fraction of CA-CA pairs between consecutive amino acids that are + more than 'max_angstrom_tolerance' apart. + + Args: + pred_atom_positions: Atom positions in atom37/14 representation + pred_atom_mask: Atom mask in atom37/14 representation + residue_index: Residue index for given amino acid, this is assumed to be + monotonically increasing. + max_angstrom_tolerance: Maximum distance allowed to not count as violation. + Returns: + Fraction of consecutive CA-CA pairs with violation. + """ + this_ca_pos = pred_atom_positions[:-1, 1, :] # (N - 1, 3) + this_ca_mask = pred_atom_mask[:-1, 1] # (N - 1) + next_ca_pos = pred_atom_positions[1:, 1, :] # (N - 1, 3) + next_ca_mask = pred_atom_mask[1:, 1] # (N - 1) + has_no_gap_mask = ((residue_index[1:] - residue_index[:-1]) == 1.0).astype( + jnp.float32) + ca_ca_distance = jnp.sqrt( + 1e-6 + jnp.sum(squared_difference(this_ca_pos, next_ca_pos), axis=-1)) + violations = (ca_ca_distance - + residue_constants.ca_ca) > max_angstrom_tolerance + mask = this_ca_mask * next_ca_mask * has_no_gap_mask + return utils.mask_mean(mask=mask, value=violations) + + +def between_residue_bond_loss( + pred_atom_positions: jnp.ndarray, # (N, 37(14), 3) + pred_atom_mask: jnp.ndarray, # (N, 37(14)) + residue_index: jnp.ndarray, # (N) + aatype: jnp.ndarray, # (N) + tolerance_factor_soft=12.0, + tolerance_factor_hard=12.0 +) -> Dict[str, jnp.ndarray]: + """Flat-bottom loss to penalize structural violations between residues. + + This is a loss penalizing any violation of the geometry around the peptide + bond between consecutive amino acids. This loss corresponds to + Jumper et al. (2021) Suppl. Sec. 1.9.11, eq 44, 45. + + Args: + pred_atom_positions: Atom positions in atom37/14 representation + pred_atom_mask: Atom mask in atom37/14 representation + residue_index: Residue index for given amino acid, this is assumed to be + monotonically increasing. + aatype: Amino acid type of given residue + tolerance_factor_soft: soft tolerance factor measured in standard deviations + of pdb distributions + tolerance_factor_hard: hard tolerance factor measured in standard deviations + of pdb distributions + + Returns: + Dict containing: + * 'c_n_loss_mean': Loss for peptide bond length violations + * 'ca_c_n_loss_mean': Loss for violations of bond angle around C spanned + by CA, C, N + * 'c_n_ca_loss_mean': Loss for violations of bond angle around N spanned + by C, N, CA + * 'per_residue_loss_sum': sum of all losses for each residue + * 'per_residue_violation_mask': mask denoting all residues with violation + present. + """ + assert len(pred_atom_positions.shape) == 3 + assert len(pred_atom_mask.shape) == 2 + assert len(residue_index.shape) == 1 + assert len(aatype.shape) == 1 + + # Get the positions of the relevant backbone atoms. + this_ca_pos = pred_atom_positions[:-1, 1, :] # (N - 1, 3) + this_ca_mask = pred_atom_mask[:-1, 1] # (N - 1) + this_c_pos = pred_atom_positions[:-1, 2, :] # (N - 1, 3) + this_c_mask = pred_atom_mask[:-1, 2] # (N - 1) + next_n_pos = pred_atom_positions[1:, 0, :] # (N - 1, 3) + next_n_mask = pred_atom_mask[1:, 0] # (N - 1) + next_ca_pos = pred_atom_positions[1:, 1, :] # (N - 1, 3) + next_ca_mask = pred_atom_mask[1:, 1] # (N - 1) + has_no_gap_mask = ((residue_index[1:] - residue_index[:-1]) == 1.0).astype( + jnp.float32) + + # Compute loss for the C--N bond. + c_n_bond_length = jnp.sqrt( + 1e-6 + jnp.sum(squared_difference(this_c_pos, next_n_pos), axis=-1)) + + # The C-N bond to proline has slightly different length because of the ring. + next_is_proline = ( + aatype[1:] == residue_constants.resname_to_idx['PRO']).astype(jnp.float32) + gt_length = ( + (1. - next_is_proline) * residue_constants.between_res_bond_length_c_n[0] + + next_is_proline * residue_constants.between_res_bond_length_c_n[1]) + gt_stddev = ( + (1. - next_is_proline) * + residue_constants.between_res_bond_length_stddev_c_n[0] + + next_is_proline * residue_constants.between_res_bond_length_stddev_c_n[1]) + c_n_bond_length_error = jnp.sqrt(1e-6 + + jnp.square(c_n_bond_length - gt_length)) + c_n_loss_per_residue = jax.nn.relu( + c_n_bond_length_error - tolerance_factor_soft * gt_stddev) + mask = this_c_mask * next_n_mask * has_no_gap_mask + c_n_loss = jnp.sum(mask * c_n_loss_per_residue) / (jnp.sum(mask) + 1e-6) + c_n_violation_mask = mask * ( + c_n_bond_length_error > (tolerance_factor_hard * gt_stddev)) + + # Compute loss for the angles. + ca_c_bond_length = jnp.sqrt(1e-6 + jnp.sum( + squared_difference(this_ca_pos, this_c_pos), axis=-1)) + n_ca_bond_length = jnp.sqrt(1e-6 + jnp.sum( + squared_difference(next_n_pos, next_ca_pos), axis=-1)) + + c_ca_unit_vec = (this_ca_pos - this_c_pos) / ca_c_bond_length[:, None] + c_n_unit_vec = (next_n_pos - this_c_pos) / c_n_bond_length[:, None] + n_ca_unit_vec = (next_ca_pos - next_n_pos) / n_ca_bond_length[:, None] + + ca_c_n_cos_angle = jnp.sum(c_ca_unit_vec * c_n_unit_vec, axis=-1) + gt_angle = residue_constants.between_res_cos_angles_ca_c_n[0] + gt_stddev = residue_constants.between_res_bond_length_stddev_c_n[0] + ca_c_n_cos_angle_error = jnp.sqrt( + 1e-6 + jnp.square(ca_c_n_cos_angle - gt_angle)) + ca_c_n_loss_per_residue = jax.nn.relu( + ca_c_n_cos_angle_error - tolerance_factor_soft * gt_stddev) + mask = this_ca_mask * this_c_mask * next_n_mask * has_no_gap_mask + ca_c_n_loss = jnp.sum(mask * ca_c_n_loss_per_residue) / (jnp.sum(mask) + 1e-6) + ca_c_n_violation_mask = mask * (ca_c_n_cos_angle_error > + (tolerance_factor_hard * gt_stddev)) + + c_n_ca_cos_angle = jnp.sum((-c_n_unit_vec) * n_ca_unit_vec, axis=-1) + gt_angle = residue_constants.between_res_cos_angles_c_n_ca[0] + gt_stddev = residue_constants.between_res_cos_angles_c_n_ca[1] + c_n_ca_cos_angle_error = jnp.sqrt( + 1e-6 + jnp.square(c_n_ca_cos_angle - gt_angle)) + c_n_ca_loss_per_residue = jax.nn.relu( + c_n_ca_cos_angle_error - tolerance_factor_soft * gt_stddev) + mask = this_c_mask * next_n_mask * next_ca_mask * has_no_gap_mask + c_n_ca_loss = jnp.sum(mask * c_n_ca_loss_per_residue) / (jnp.sum(mask) + 1e-6) + c_n_ca_violation_mask = mask * ( + c_n_ca_cos_angle_error > (tolerance_factor_hard * gt_stddev)) + + # Compute a per residue loss (equally distribute the loss to both + # neighbouring residues). + per_residue_loss_sum = (c_n_loss_per_residue + + ca_c_n_loss_per_residue + + c_n_ca_loss_per_residue) + per_residue_loss_sum = 0.5 * (jnp.pad(per_residue_loss_sum, [[0, 1]]) + + jnp.pad(per_residue_loss_sum, [[1, 0]])) + + # Compute hard violations. + violation_mask = jnp.max( + jnp.stack([c_n_violation_mask, + ca_c_n_violation_mask, + c_n_ca_violation_mask]), axis=0) + violation_mask = jnp.maximum( + jnp.pad(violation_mask, [[0, 1]]), + jnp.pad(violation_mask, [[1, 0]])) + + return {'c_n_loss_mean': c_n_loss, # shape () + 'ca_c_n_loss_mean': ca_c_n_loss, # shape () + 'c_n_ca_loss_mean': c_n_ca_loss, # shape () + 'per_residue_loss_sum': per_residue_loss_sum, # shape (N) + 'per_residue_violation_mask': violation_mask # shape (N) + } + + +def between_residue_clash_loss( + atom14_pred_positions: jnp.ndarray, # (N, 14, 3) + atom14_atom_exists: jnp.ndarray, # (N, 14) + atom14_atom_radius: jnp.ndarray, # (N, 14) + residue_index: jnp.ndarray, # (N) + overlap_tolerance_soft=1.5, + overlap_tolerance_hard=1.5 +) -> Dict[str, jnp.ndarray]: + """Loss to penalize steric clashes between residues. + + This is a loss penalizing any steric clashes due to non bonded atoms in + different peptides coming too close. This loss corresponds to the part with + different residues of + Jumper et al. (2021) Suppl. Sec. 1.9.11, eq 46. + + Args: + atom14_pred_positions: Predicted positions of atoms in + global prediction frame + atom14_atom_exists: Mask denoting whether atom at positions exists for given + amino acid type + atom14_atom_radius: Van der Waals radius for each atom. + residue_index: Residue index for given amino acid. + overlap_tolerance_soft: Soft tolerance factor. + overlap_tolerance_hard: Hard tolerance factor. + + Returns: + Dict containing: + * 'mean_loss': average clash loss + * 'per_atom_loss_sum': sum of all clash losses per atom, shape (N, 14) + * 'per_atom_clash_mask': mask whether atom clashes with any other atom + shape (N, 14) + """ + assert len(atom14_pred_positions.shape) == 3 + assert len(atom14_atom_exists.shape) == 2 + assert len(atom14_atom_radius.shape) == 2 + assert len(residue_index.shape) == 1 + + # Create the distance matrix. + # (N, N, 14, 14) + dists = jnp.sqrt(1e-10 + jnp.sum( + squared_difference( + atom14_pred_positions[:, None, :, None, :], + atom14_pred_positions[None, :, None, :, :]), + axis=-1)) + + # Create the mask for valid distances. + # shape (N, N, 14, 14) + dists_mask = (atom14_atom_exists[:, None, :, None] * + atom14_atom_exists[None, :, None, :]) + + # Mask out all the duplicate entries in the lower triangular matrix. + # Also mask out the diagonal (atom-pairs from the same residue) -- these atoms + # are handled separately. + dists_mask *= ( + residue_index[:, None, None, None] < residue_index[None, :, None, None]) + + # Backbone C--N bond between subsequent residues is no clash. + c_one_hot = jax.nn.one_hot(2, num_classes=14) + n_one_hot = jax.nn.one_hot(0, num_classes=14) + neighbour_mask = ((residue_index[:, None, None, None] + + 1) == residue_index[None, :, None, None]) + c_n_bonds = neighbour_mask * c_one_hot[None, None, :, + None] * n_one_hot[None, None, None, :] + dists_mask *= (1. - c_n_bonds) + + # Disulfide bridge between two cysteines is no clash. + cys_sg_idx = residue_constants.restype_name_to_atom14_names['CYS'].index('SG') + cys_sg_one_hot = jax.nn.one_hot(cys_sg_idx, num_classes=14) + disulfide_bonds = (cys_sg_one_hot[None, None, :, None] * + cys_sg_one_hot[None, None, None, :]) + dists_mask *= (1. - disulfide_bonds) + + # Compute the lower bound for the allowed distances. + # shape (N, N, 14, 14) + dists_lower_bound = dists_mask * (atom14_atom_radius[:, None, :, None] + + atom14_atom_radius[None, :, None, :]) + + # Compute the error. + # shape (N, N, 14, 14) + dists_to_low_error = dists_mask * jax.nn.relu( + dists_lower_bound - overlap_tolerance_soft - dists) + + # Compute the mean loss. + # shape () + mean_loss = (jnp.sum(dists_to_low_error) + / (1e-6 + jnp.sum(dists_mask))) + + # Compute the per atom loss sum. + # shape (N, 14) + per_atom_loss_sum = (jnp.sum(dists_to_low_error, axis=[0, 2]) + + jnp.sum(dists_to_low_error, axis=[1, 3])) + + # Compute the hard clash mask. + # shape (N, N, 14, 14) + clash_mask = dists_mask * ( + dists < (dists_lower_bound - overlap_tolerance_hard)) + + # Compute the per atom clash. + # shape (N, 14) + per_atom_clash_mask = jnp.maximum( + jnp.max(clash_mask, axis=[0, 2]), + jnp.max(clash_mask, axis=[1, 3])) + + return {'mean_loss': mean_loss, # shape () + 'per_atom_loss_sum': per_atom_loss_sum, # shape (N, 14) + 'per_atom_clash_mask': per_atom_clash_mask # shape (N, 14) + } + + +def within_residue_violations( + atom14_pred_positions: jnp.ndarray, # (N, 14, 3) + atom14_atom_exists: jnp.ndarray, # (N, 14) + atom14_dists_lower_bound: jnp.ndarray, # (N, 14, 14) + atom14_dists_upper_bound: jnp.ndarray, # (N, 14, 14) + tighten_bounds_for_loss=0.0, +) -> Dict[str, jnp.ndarray]: + """Loss to penalize steric clashes within residues. + + This is a loss penalizing any steric violations or clashes of non-bonded atoms + in a given peptide. This loss corresponds to the part with + the same residues of + Jumper et al. (2021) Suppl. Sec. 1.9.11, eq 46. + + Args: + atom14_pred_positions: Predicted positions of atoms in + global prediction frame + atom14_atom_exists: Mask denoting whether atom at positions exists for given + amino acid type + atom14_dists_lower_bound: Lower bound on allowed distances. + atom14_dists_upper_bound: Upper bound on allowed distances + tighten_bounds_for_loss: Extra factor to tighten loss + + Returns: + Dict containing: + * 'per_atom_loss_sum': sum of all clash losses per atom, shape (N, 14) + * 'per_atom_clash_mask': mask whether atom clashes with any other atom + shape (N, 14) + """ + assert len(atom14_pred_positions.shape) == 3 + assert len(atom14_atom_exists.shape) == 2 + assert len(atom14_dists_lower_bound.shape) == 3 + assert len(atom14_dists_upper_bound.shape) == 3 + + # Compute the mask for each residue. + # shape (N, 14, 14) + dists_masks = (1. - jnp.eye(14, 14)[None]) + dists_masks *= (atom14_atom_exists[:, :, None] * + atom14_atom_exists[:, None, :]) + + # Distance matrix + # shape (N, 14, 14) + dists = jnp.sqrt(1e-10 + jnp.sum( + squared_difference( + atom14_pred_positions[:, :, None, :], + atom14_pred_positions[:, None, :, :]), + axis=-1)) + + # Compute the loss. + # shape (N, 14, 14) + dists_to_low_error = jax.nn.relu( + atom14_dists_lower_bound + tighten_bounds_for_loss - dists) + dists_to_high_error = jax.nn.relu( + dists - (atom14_dists_upper_bound - tighten_bounds_for_loss)) + loss = dists_masks * (dists_to_low_error + dists_to_high_error) + + # Compute the per atom loss sum. + # shape (N, 14) + per_atom_loss_sum = (jnp.sum(loss, axis=1) + + jnp.sum(loss, axis=2)) + + # Compute the violations mask. + # shape (N, 14, 14) + violations = dists_masks * ((dists < atom14_dists_lower_bound) | + (dists > atom14_dists_upper_bound)) + + # Compute the per atom violations. + # shape (N, 14) + per_atom_violations = jnp.maximum( + jnp.max(violations, axis=1), jnp.max(violations, axis=2)) + + return {'per_atom_loss_sum': per_atom_loss_sum, # shape (N, 14) + 'per_atom_violations': per_atom_violations # shape (N, 14) + } + + +def find_optimal_renaming( + atom14_gt_positions: jnp.ndarray, # (N, 14, 3) + atom14_alt_gt_positions: jnp.ndarray, # (N, 14, 3) + atom14_atom_is_ambiguous: jnp.ndarray, # (N, 14) + atom14_gt_exists: jnp.ndarray, # (N, 14) + atom14_pred_positions: jnp.ndarray, # (N, 14, 3) + atom14_atom_exists: jnp.ndarray, # (N, 14) +) -> jnp.ndarray: # (N): + """Find optimal renaming for ground truth that maximizes LDDT. + + Jumper et al. (2021) Suppl. Alg. 26 + "renameSymmetricGroundTruthAtoms" lines 1-5 + + Args: + atom14_gt_positions: Ground truth positions in global frame of ground truth. + atom14_alt_gt_positions: Alternate ground truth positions in global frame of + ground truth with coordinates of ambiguous atoms swapped relative to + 'atom14_gt_positions'. + atom14_atom_is_ambiguous: Mask denoting whether atom is among ambiguous + atoms, see Jumper et al. (2021) Suppl. Table 3 + atom14_gt_exists: Mask denoting whether atom at positions exists in ground + truth. + atom14_pred_positions: Predicted positions of atoms in + global prediction frame + atom14_atom_exists: Mask denoting whether atom at positions exists for given + amino acid type + + Returns: + Float array of shape [N] with 1. where atom14_alt_gt_positions is closer to + prediction and 0. otherwise + """ + assert len(atom14_gt_positions.shape) == 3 + assert len(atom14_alt_gt_positions.shape) == 3 + assert len(atom14_atom_is_ambiguous.shape) == 2 + assert len(atom14_gt_exists.shape) == 2 + assert len(atom14_pred_positions.shape) == 3 + assert len(atom14_atom_exists.shape) == 2 + + # Create the pred distance matrix. + # shape (N, N, 14, 14) + pred_dists = jnp.sqrt(1e-10 + jnp.sum( + squared_difference( + atom14_pred_positions[:, None, :, None, :], + atom14_pred_positions[None, :, None, :, :]), + axis=-1)) + + # Compute distances for ground truth with original and alternative names. + # shape (N, N, 14, 14) + gt_dists = jnp.sqrt(1e-10 + jnp.sum( + squared_difference( + atom14_gt_positions[:, None, :, None, :], + atom14_gt_positions[None, :, None, :, :]), + axis=-1)) + alt_gt_dists = jnp.sqrt(1e-10 + jnp.sum( + squared_difference( + atom14_alt_gt_positions[:, None, :, None, :], + atom14_alt_gt_positions[None, :, None, :, :]), + axis=-1)) + + # Compute LDDT's. + # shape (N, N, 14, 14) + lddt = jnp.sqrt(1e-10 + squared_difference(pred_dists, gt_dists)) + alt_lddt = jnp.sqrt(1e-10 + squared_difference(pred_dists, alt_gt_dists)) + + # Create a mask for ambiguous atoms in rows vs. non-ambiguous atoms + # in cols. + # shape (N ,N, 14, 14) + mask = (atom14_gt_exists[:, None, :, None] * # rows + atom14_atom_is_ambiguous[:, None, :, None] * # rows + atom14_gt_exists[None, :, None, :] * # cols + (1. - atom14_atom_is_ambiguous[None, :, None, :])) # cols + + # Aggregate distances for each residue to the non-amibuguous atoms. + # shape (N) + per_res_lddt = jnp.sum(mask * lddt, axis=[1, 2, 3]) + alt_per_res_lddt = jnp.sum(mask * alt_lddt, axis=[1, 2, 3]) + + # Decide for each residue, whether alternative naming is better. + # shape (N) + alt_naming_is_better = (alt_per_res_lddt < per_res_lddt).astype(jnp.float32) + + return alt_naming_is_better # shape (N) + + +def frame_aligned_point_error( + pred_frames: r3.Rigids, # shape (num_frames) + target_frames: r3.Rigids, # shape (num_frames) + frames_mask: jnp.ndarray, # shape (num_frames) + pred_positions: r3.Vecs, # shape (num_positions) + target_positions: r3.Vecs, # shape (num_positions) + positions_mask: jnp.ndarray, # shape (num_positions) + length_scale: float, + l1_clamp_distance: Optional[float] = None, + epsilon=1e-4) -> jnp.ndarray: # shape () + """Measure point error under different alignments. + + Jumper et al. (2021) Suppl. Alg. 28 "computeFAPE" + + Computes error between two structures with B points under A alignments derived + from the given pairs of frames. + Args: + pred_frames: num_frames reference frames for 'pred_positions'. + target_frames: num_frames reference frames for 'target_positions'. + frames_mask: Mask for frame pairs to use. + pred_positions: num_positions predicted positions of the structure. + target_positions: num_positions target positions of the structure. + positions_mask: Mask on which positions to score. + length_scale: length scale to divide loss by. + l1_clamp_distance: Distance cutoff on error beyond which gradients will + be zero. + epsilon: small value used to regularize denominator for masked average. + Returns: + Masked Frame Aligned Point Error. + """ + assert pred_frames.rot.xx.ndim == 1 + assert target_frames.rot.xx.ndim == 1 + assert frames_mask.ndim == 1, frames_mask.ndim + assert pred_positions.x.ndim == 1 + assert target_positions.x.ndim == 1 + assert positions_mask.ndim == 1 + + # Compute array of predicted positions in the predicted frames. + # r3.Vecs (num_frames, num_positions) + local_pred_pos = r3.rigids_mul_vecs( + jax.tree_map(lambda r: r[:, None], r3.invert_rigids(pred_frames)), + jax.tree_map(lambda x: x[None, :], pred_positions)) + + # Compute array of target positions in the target frames. + # r3.Vecs (num_frames, num_positions) + local_target_pos = r3.rigids_mul_vecs( + jax.tree_map(lambda r: r[:, None], r3.invert_rigids(target_frames)), + jax.tree_map(lambda x: x[None, :], target_positions)) + + # Compute errors between the structures. + # jnp.ndarray (num_frames, num_positions) + error_dist = jnp.sqrt( + r3.vecs_squared_distance(local_pred_pos, local_target_pos) + + epsilon) + + if l1_clamp_distance: + error_dist = jnp.clip(error_dist, 0, l1_clamp_distance) + + normed_error = error_dist / length_scale + normed_error *= jnp.expand_dims(frames_mask, axis=-1) + normed_error *= jnp.expand_dims(positions_mask, axis=-2) + + normalization_factor = ( + jnp.sum(frames_mask, axis=-1) * + jnp.sum(positions_mask, axis=-1)) + return (jnp.sum(normed_error, axis=(-2, -1)) / + (epsilon + normalization_factor)) + + +def _make_renaming_matrices(): + """Matrices to map atoms to symmetry partners in ambiguous case.""" + # As the atom naming is ambiguous for 7 of the 20 amino acids, provide + # alternative groundtruth coordinates where the naming is swapped + restype_3 = [ + residue_constants.restype_1to3[res] for res in residue_constants.restypes + ] + restype_3 += ['UNK'] + # Matrices for renaming ambiguous atoms. + all_matrices = {res: np.eye(14, dtype=np.float32) for res in restype_3} + for resname, swap in residue_constants.residue_atom_renaming_swaps.items(): + correspondences = np.arange(14) + for source_atom_swap, target_atom_swap in swap.items(): + source_index = residue_constants.restype_name_to_atom14_names[ + resname].index(source_atom_swap) + target_index = residue_constants.restype_name_to_atom14_names[ + resname].index(target_atom_swap) + correspondences[source_index] = target_index + correspondences[target_index] = source_index + renaming_matrix = np.zeros((14, 14), dtype=np.float32) + for index, correspondence in enumerate(correspondences): + renaming_matrix[index, correspondence] = 1. + all_matrices[resname] = renaming_matrix.astype(np.float32) + renaming_matrices = np.stack([all_matrices[restype] for restype in restype_3]) + return renaming_matrices + + +RENAMING_MATRICES = _make_renaming_matrices() + + +def get_alt_atom14(aatype, positions, mask): + """Get alternative atom14 positions. + + Constructs renamed atom positions for ambiguous residues. + + Jumper et al. (2021) Suppl. Table 3 "Ambiguous atom names due to 180 degree- + rotation-symmetry" + + Args: + aatype: Amino acid at given position + positions: Atom positions as r3.Vecs in atom14 representation, (N, 14) + mask: Atom masks in atom14 representation, (N, 14) + Returns: + renamed atom positions, renamed atom mask + """ + # pick the transformation matrices for the given residue sequence + # shape (num_res, 14, 14) + renaming_transform = utils.batched_gather( + jnp.asarray(RENAMING_MATRICES), aatype) + + positions = jax.tree_map(lambda x: x[:, :, None], positions) + alternative_positions = jax.tree_map( + lambda x: jnp.sum(x, axis=1), positions * renaming_transform) + + # Create the mask for the alternative ground truth (differs from the + # ground truth mask, if only one of the atoms in an ambiguous pair has a + # ground truth position) + alternative_mask = jnp.sum(mask[..., None] * renaming_transform, axis=1) + + return alternative_positions, alternative_mask diff --git a/alphafold/alphafold/model/all_atom_test.py b/alphafold/alphafold/model/all_atom_test.py new file mode 100644 index 0000000000000000000000000000000000000000..36ba45fe3d828d22614b021ad0deefe3e99bdcca --- /dev/null +++ b/alphafold/alphafold/model/all_atom_test.py @@ -0,0 +1,135 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Tests for all_atom.""" + +from absl.testing import absltest +from absl.testing import parameterized +from alphafold.model import all_atom +from alphafold.model import r3 +import numpy as np + +L1_CLAMP_DISTANCE = 10 + + +def get_identity_rigid(shape): + """Returns identity rigid transform.""" + + ones = np.ones(shape) + zeros = np.zeros(shape) + rot = r3.Rots(ones, zeros, zeros, + zeros, ones, zeros, + zeros, zeros, ones) + trans = r3.Vecs(zeros, zeros, zeros) + return r3.Rigids(rot, trans) + + +def get_global_rigid_transform(rot_angle, translation, bcast_dims): + """Returns rigid transform that globally rotates/translates by same amount.""" + + rot_angle = np.asarray(rot_angle) + translation = np.asarray(translation) + if bcast_dims: + for _ in range(bcast_dims): + rot_angle = np.expand_dims(rot_angle, 0) + translation = np.expand_dims(translation, 0) + sin_angle = np.sin(np.deg2rad(rot_angle)) + cos_angle = np.cos(np.deg2rad(rot_angle)) + ones = np.ones_like(sin_angle) + zeros = np.zeros_like(sin_angle) + rot = r3.Rots(ones, zeros, zeros, + zeros, cos_angle, -sin_angle, + zeros, sin_angle, cos_angle) + trans = r3.Vecs(translation[..., 0], translation[..., 1], translation[..., 2]) + return r3.Rigids(rot, trans) + + +class AllAtomTest(parameterized.TestCase, absltest.TestCase): + + @parameterized.named_parameters( + ('identity', 0, [0, 0, 0]), + ('rot_90', 90, [0, 0, 0]), + ('trans_10', 0, [0, 0, 10]), + ('rot_174_trans_1', 174, [1, 1, 1])) + def test_frame_aligned_point_error_perfect_on_global_transform( + self, rot_angle, translation): + """Tests global transform between target and preds gives perfect score.""" + + # pylint: disable=bad-whitespace + target_positions = np.array( + [[ 21.182, 23.095, 19.731], + [ 22.055, 20.919, 17.294], + [ 24.599, 20.005, 15.041], + [ 25.567, 18.214, 12.166], + [ 28.063, 17.082, 10.043], + [ 28.779, 15.569, 6.985], + [ 30.581, 13.815, 4.612], + [ 29.258, 12.193, 2.296]]) + # pylint: enable=bad-whitespace + global_rigid_transform = get_global_rigid_transform( + rot_angle, translation, 1) + + target_positions = r3.vecs_from_tensor(target_positions) + pred_positions = r3.rigids_mul_vecs( + global_rigid_transform, target_positions) + positions_mask = np.ones(target_positions.x.shape[0]) + + target_frames = get_identity_rigid(10) + pred_frames = r3.rigids_mul_rigids(global_rigid_transform, target_frames) + frames_mask = np.ones(10) + + fape = all_atom.frame_aligned_point_error( + pred_frames, target_frames, frames_mask, pred_positions, + target_positions, positions_mask, L1_CLAMP_DISTANCE, + L1_CLAMP_DISTANCE, epsilon=0) + self.assertAlmostEqual(fape, 0.) + + @parameterized.named_parameters( + ('identity', + [[0, 0, 0], [5, 0, 0], [10, 0, 0]], + [[0, 0, 0], [5, 0, 0], [10, 0, 0]], + 0.), + ('shift_2.5', + [[0, 0, 0], [5, 0, 0], [10, 0, 0]], + [[2.5, 0, 0], [7.5, 0, 0], [7.5, 0, 0]], + 0.25), + ('shift_5', + [[0, 0, 0], [5, 0, 0], [10, 0, 0]], + [[5, 0, 0], [10, 0, 0], [15, 0, 0]], + 0.5), + ('shift_10', + [[0, 0, 0], [5, 0, 0], [10, 0, 0]], + [[10, 0, 0], [15, 0, 0], [0, 0, 0]], + 1.)) + def test_frame_aligned_point_error_matches_expected( + self, target_positions, pred_positions, expected_alddt): + """Tests score matches expected.""" + + target_frames = get_identity_rigid(2) + pred_frames = target_frames + frames_mask = np.ones(2) + + target_positions = r3.vecs_from_tensor(np.array(target_positions)) + pred_positions = r3.vecs_from_tensor(np.array(pred_positions)) + positions_mask = np.ones(target_positions.x.shape[0]) + + alddt = all_atom.frame_aligned_point_error( + pred_frames, target_frames, frames_mask, pred_positions, + target_positions, positions_mask, L1_CLAMP_DISTANCE, + L1_CLAMP_DISTANCE, epsilon=0) + self.assertAlmostEqual(alddt, expected_alddt) + + +if __name__ == '__main__': + absltest.main() diff --git a/alphafold/alphafold/model/common_modules.py b/alphafold/alphafold/model/common_modules.py new file mode 100644 index 0000000000000000000000000000000000000000..f239c870bde49e1e5b1a7e6622c5ef4f44a37b3f --- /dev/null +++ b/alphafold/alphafold/model/common_modules.py @@ -0,0 +1,84 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""A collection of common Haiku modules for use in protein folding.""" +import haiku as hk +import jax.numpy as jnp + + +class Linear(hk.Module): + """Protein folding specific Linear Module. + + This differs from the standard Haiku Linear in a few ways: + * It supports inputs of arbitrary rank + * Initializers are specified by strings + """ + + def __init__(self, + num_output: int, + initializer: str = 'linear', + use_bias: bool = True, + bias_init: float = 0., + name: str = 'linear'): + """Constructs Linear Module. + + Args: + num_output: number of output channels. + initializer: What initializer to use, should be one of {'linear', 'relu', + 'zeros'} + use_bias: Whether to include trainable bias + bias_init: Value used to initialize bias. + name: name of module, used for name scopes. + """ + + super().__init__(name=name) + self.num_output = num_output + self.initializer = initializer + self.use_bias = use_bias + self.bias_init = bias_init + + def __call__(self, inputs: jnp.ndarray) -> jnp.ndarray: + """Connects Module. + + Args: + inputs: Tensor of shape [..., num_channel] + + Returns: + output of shape [..., num_output] + """ + n_channels = int(inputs.shape[-1]) + + weight_shape = [n_channels, self.num_output] + if self.initializer == 'linear': + weight_init = hk.initializers.VarianceScaling(mode='fan_in', scale=1.) + elif self.initializer == 'relu': + weight_init = hk.initializers.VarianceScaling(mode='fan_in', scale=2.) + elif self.initializer == 'zeros': + weight_init = hk.initializers.Constant(0.0) + + weights = hk.get_parameter('weights', weight_shape, inputs.dtype, + weight_init) + + # this is equivalent to einsum('...c,cd->...d', inputs, weights) + # but turns out to be slightly faster + inputs = jnp.swapaxes(inputs, -1, -2) + output = jnp.einsum('...cb,cd->...db', inputs, weights) + output = jnp.swapaxes(output, -1, -2) + + if self.use_bias: + bias = hk.get_parameter('bias', [self.num_output], inputs.dtype, + hk.initializers.Constant(self.bias_init)) + output += bias + + return output diff --git a/alphafold/alphafold/model/config.py b/alphafold/alphafold/model/config.py new file mode 100644 index 0000000000000000000000000000000000000000..03d494f719237339854467c527c2a2e8f188b1e2 --- /dev/null +++ b/alphafold/alphafold/model/config.py @@ -0,0 +1,402 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. +"""Model config.""" + +import copy +from alphafold.model.tf import shape_placeholders +import ml_collections + + +NUM_RES = shape_placeholders.NUM_RES +NUM_MSA_SEQ = shape_placeholders.NUM_MSA_SEQ +NUM_EXTRA_SEQ = shape_placeholders.NUM_EXTRA_SEQ +NUM_TEMPLATES = shape_placeholders.NUM_TEMPLATES + + +def model_config(name: str) -> ml_collections.ConfigDict: + """Get the ConfigDict of a CASP14 model.""" + + if name not in CONFIG_DIFFS: + raise ValueError(f'Invalid model name {name}.') + cfg = copy.deepcopy(CONFIG) + cfg.update_from_flattened_dict(CONFIG_DIFFS[name]) + return cfg + + +CONFIG_DIFFS = { + 'model_1': { + # Jumper et al. (2021) Suppl. Table 5, Model 1.1.1 + 'data.common.max_extra_msa': 5120, + 'data.common.reduce_msa_clusters_by_max_templates': True, + 'data.common.use_templates': True, + 'model.embeddings_and_evoformer.template.embed_torsion_angles': True, + 'model.embeddings_and_evoformer.template.enabled': True + }, + 'model_2': { + # Jumper et al. (2021) Suppl. Table 5, Model 1.1.2 + 'data.common.reduce_msa_clusters_by_max_templates': True, + 'data.common.use_templates': True, + 'model.embeddings_and_evoformer.template.embed_torsion_angles': True, + 'model.embeddings_and_evoformer.template.enabled': True + }, + 'model_3': { + # Jumper et al. (2021) Suppl. Table 5, Model 1.2.1 + 'data.common.max_extra_msa': 5120, + }, + 'model_4': { + # Jumper et al. (2021) Suppl. Table 5, Model 1.2.2 + 'data.common.max_extra_msa': 5120, + }, + 'model_5': { + # Jumper et al. (2021) Suppl. Table 5, Model 1.2.3 + }, + + # The following models are fine-tuned from the corresponding models above + # with an additional predicted_aligned_error head that can produce + # predicted TM-score (pTM) and predicted aligned errors. + 'model_1_ptm': { + 'data.common.max_extra_msa': 5120, + 'data.common.reduce_msa_clusters_by_max_templates': True, + 'data.common.use_templates': True, + 'model.embeddings_and_evoformer.template.embed_torsion_angles': True, + 'model.embeddings_and_evoformer.template.enabled': True, + 'model.heads.predicted_aligned_error.weight': 0.1 + }, + 'model_2_ptm': { + 'data.common.reduce_msa_clusters_by_max_templates': True, + 'data.common.use_templates': True, + 'model.embeddings_and_evoformer.template.embed_torsion_angles': True, + 'model.embeddings_and_evoformer.template.enabled': True, + 'model.heads.predicted_aligned_error.weight': 0.1 + }, + 'model_3_ptm': { + 'data.common.max_extra_msa': 5120, + 'model.heads.predicted_aligned_error.weight': 0.1 + }, + 'model_4_ptm': { + 'data.common.max_extra_msa': 5120, + 'model.heads.predicted_aligned_error.weight': 0.1 + }, + 'model_5_ptm': { + 'model.heads.predicted_aligned_error.weight': 0.1 + } +} + +CONFIG = ml_collections.ConfigDict({ + 'data': { + 'common': { + 'masked_msa': { + 'profile_prob': 0.1, + 'same_prob': 0.1, + 'uniform_prob': 0.1 + }, + 'max_extra_msa': 1024, + 'msa_cluster_features': True, + 'num_recycle': 3, + 'reduce_msa_clusters_by_max_templates': False, + 'resample_msa_in_recycling': True, + 'template_features': [ + 'template_all_atom_positions', 'template_sum_probs', + 'template_aatype', 'template_all_atom_masks', + 'template_domain_names' + ], + 'unsupervised_features': [ + 'aatype', 'residue_index', 'sequence', 'msa', 'domain_name', + 'num_alignments', 'seq_length', 'between_segment_residues', + 'deletion_matrix' + ], + 'use_templates': False, + }, + 'eval': { + 'feat': { + 'aatype': [NUM_RES], + 'all_atom_mask': [NUM_RES, None], + 'all_atom_positions': [NUM_RES, None, None], + 'alt_chi_angles': [NUM_RES, None], + 'atom14_alt_gt_exists': [NUM_RES, None], + 'atom14_alt_gt_positions': [NUM_RES, None, None], + 'atom14_atom_exists': [NUM_RES, None], + 'atom14_atom_is_ambiguous': [NUM_RES, None], + 'atom14_gt_exists': [NUM_RES, None], + 'atom14_gt_positions': [NUM_RES, None, None], + 'atom37_atom_exists': [NUM_RES, None], + 'backbone_affine_mask': [NUM_RES], + 'backbone_affine_tensor': [NUM_RES, None], + 'bert_mask': [NUM_MSA_SEQ, NUM_RES], + 'chi_angles': [NUM_RES, None], + 'chi_mask': [NUM_RES, None], + 'extra_deletion_value': [NUM_EXTRA_SEQ, NUM_RES], + 'extra_has_deletion': [NUM_EXTRA_SEQ, NUM_RES], + 'extra_msa': [NUM_EXTRA_SEQ, NUM_RES], + 'extra_msa_mask': [NUM_EXTRA_SEQ, NUM_RES], + 'extra_msa_row_mask': [NUM_EXTRA_SEQ], + 'is_distillation': [], + 'msa_feat': [NUM_MSA_SEQ, NUM_RES, None], + 'msa_mask': [NUM_MSA_SEQ, NUM_RES], + 'msa_row_mask': [NUM_MSA_SEQ], + 'pseudo_beta': [NUM_RES, None], + 'pseudo_beta_mask': [NUM_RES], + 'random_crop_to_size_seed': [None], + 'residue_index': [NUM_RES], + 'residx_atom14_to_atom37': [NUM_RES, None], + 'residx_atom37_to_atom14': [NUM_RES, None], + 'resolution': [], + 'rigidgroups_alt_gt_frames': [NUM_RES, None, None], + 'rigidgroups_group_exists': [NUM_RES, None], + 'rigidgroups_group_is_ambiguous': [NUM_RES, None], + 'rigidgroups_gt_exists': [NUM_RES, None], + 'rigidgroups_gt_frames': [NUM_RES, None, None], + 'seq_length': [], + 'seq_mask': [NUM_RES], + 'target_feat': [NUM_RES, None], + 'template_aatype': [NUM_TEMPLATES, NUM_RES], + 'template_all_atom_masks': [NUM_TEMPLATES, NUM_RES, None], + 'template_all_atom_positions': [ + NUM_TEMPLATES, NUM_RES, None, None], + 'template_backbone_affine_mask': [NUM_TEMPLATES, NUM_RES], + 'template_backbone_affine_tensor': [ + NUM_TEMPLATES, NUM_RES, None], + 'template_mask': [NUM_TEMPLATES], + 'template_pseudo_beta': [NUM_TEMPLATES, NUM_RES, None], + 'template_pseudo_beta_mask': [NUM_TEMPLATES, NUM_RES], + 'template_sum_probs': [NUM_TEMPLATES, None], + 'true_msa': [NUM_MSA_SEQ, NUM_RES] + }, + 'fixed_size': True, + 'subsample_templates': False, # We want top templates. + 'masked_msa_replace_fraction': 0.15, + 'max_msa_clusters': 512, + 'max_templates': 4, + 'num_ensemble': 1, + }, + }, + 'model': { + 'embeddings_and_evoformer': { + 'evoformer_num_block': 48, + 'evoformer': { + 'msa_row_attention_with_pair_bias': { + 'dropout_rate': 0.15, + 'gating': True, + 'num_head': 8, + 'orientation': 'per_row', + 'shared_dropout': True + }, + 'msa_column_attention': { + 'dropout_rate': 0.0, + 'gating': True, + 'num_head': 8, + 'orientation': 'per_column', + 'shared_dropout': True + }, + 'msa_transition': { + 'dropout_rate': 0.0, + 'num_intermediate_factor': 4, + 'orientation': 'per_row', + 'shared_dropout': True + }, + 'outer_product_mean': { + 'chunk_size': 128, + 'dropout_rate': 0.0, + 'num_outer_channel': 32, + 'orientation': 'per_row', + 'shared_dropout': True + }, + 'triangle_attention_starting_node': { + 'dropout_rate': 0.25, + 'gating': True, + 'num_head': 4, + 'orientation': 'per_row', + 'shared_dropout': True + }, + 'triangle_attention_ending_node': { + 'dropout_rate': 0.25, + 'gating': True, + 'num_head': 4, + 'orientation': 'per_column', + 'shared_dropout': True + }, + 'triangle_multiplication_outgoing': { + 'dropout_rate': 0.25, + 'equation': 'ikc,jkc->ijc', + 'num_intermediate_channel': 128, + 'orientation': 'per_row', + 'shared_dropout': True + }, + 'triangle_multiplication_incoming': { + 'dropout_rate': 0.25, + 'equation': 'kjc,kic->ijc', + 'num_intermediate_channel': 128, + 'orientation': 'per_row', + 'shared_dropout': True + }, + 'pair_transition': { + 'dropout_rate': 0.0, + 'num_intermediate_factor': 4, + 'orientation': 'per_row', + 'shared_dropout': True + } + }, + 'extra_msa_channel': 64, + 'extra_msa_stack_num_block': 4, + 'max_relative_feature': 32, + 'msa_channel': 256, + 'pair_channel': 128, + 'prev_pos': { + 'min_bin': 3.25, + 'max_bin': 20.75, + 'num_bins': 15 + }, + 'recycle_features': True, + 'recycle_pos': True, + 'seq_channel': 384, + 'template': { + 'attention': { + 'gating': False, + 'key_dim': 64, + 'num_head': 4, + 'value_dim': 64 + }, + 'dgram_features': { + 'min_bin': 3.25, + 'max_bin': 50.75, + 'num_bins': 39 + }, + 'embed_torsion_angles': False, + 'enabled': False, + 'template_pair_stack': { + 'num_block': 2, + 'triangle_attention_starting_node': { + 'dropout_rate': 0.25, + 'gating': True, + 'key_dim': 64, + 'num_head': 4, + 'orientation': 'per_row', + 'shared_dropout': True, + 'value_dim': 64 + }, + 'triangle_attention_ending_node': { + 'dropout_rate': 0.25, + 'gating': True, + 'key_dim': 64, + 'num_head': 4, + 'orientation': 'per_column', + 'shared_dropout': True, + 'value_dim': 64 + }, + 'triangle_multiplication_outgoing': { + 'dropout_rate': 0.25, + 'equation': 'ikc,jkc->ijc', + 'num_intermediate_channel': 64, + 'orientation': 'per_row', + 'shared_dropout': True + }, + 'triangle_multiplication_incoming': { + 'dropout_rate': 0.25, + 'equation': 'kjc,kic->ijc', + 'num_intermediate_channel': 64, + 'orientation': 'per_row', + 'shared_dropout': True + }, + 'pair_transition': { + 'dropout_rate': 0.0, + 'num_intermediate_factor': 2, + 'orientation': 'per_row', + 'shared_dropout': True + } + }, + 'max_templates': 4, + 'subbatch_size': 128, + 'use_template_unit_vector': False, + } + }, + 'global_config': { + 'deterministic': False, + 'subbatch_size': 4, + 'use_remat': False, + 'zero_init': True + }, + 'heads': { + 'distogram': { + 'first_break': 2.3125, + 'last_break': 21.6875, + 'num_bins': 64, + 'weight': 0.3 + }, + 'predicted_aligned_error': { + # `num_bins - 1` bins uniformly space the + # [0, max_error_bin A] range. + # The final bin covers [max_error_bin A, +infty] + # 31A gives bins with 0.5A width. + 'max_error_bin': 31., + 'num_bins': 64, + 'num_channels': 128, + 'filter_by_resolution': True, + 'min_resolution': 0.1, + 'max_resolution': 3.0, + 'weight': 0.0, + }, + 'experimentally_resolved': { + 'filter_by_resolution': True, + 'max_resolution': 3.0, + 'min_resolution': 0.1, + 'weight': 0.01 + }, + 'structure_module': { + 'num_layer': 8, + 'fape': { + 'clamp_distance': 10.0, + 'clamp_type': 'relu', + 'loss_unit_distance': 10.0 + }, + 'angle_norm_weight': 0.01, + 'chi_weight': 0.5, + 'clash_overlap_tolerance': 1.5, + 'compute_in_graph_metrics': True, + 'dropout': 0.1, + 'num_channel': 384, + 'num_head': 12, + 'num_layer_in_transition': 3, + 'num_point_qk': 4, + 'num_point_v': 8, + 'num_scalar_qk': 16, + 'num_scalar_v': 16, + 'position_scale': 10.0, + 'sidechain': { + 'atom_clamp_distance': 10.0, + 'num_channel': 128, + 'num_residual_block': 2, + 'weight_frac': 0.5, + 'length_scale': 10., + }, + 'structural_violation_loss_weight': 1.0, + 'violation_tolerance_factor': 12.0, + 'weight': 1.0 + }, + 'predicted_lddt': { + 'filter_by_resolution': True, + 'max_resolution': 3.0, + 'min_resolution': 0.1, + 'num_bins': 50, + 'num_channels': 128, + 'weight': 0.01 + }, + 'masked_msa': { + 'num_output': 23, + 'weight': 2.0 + }, + }, + 'num_recycle': 3, + 'resample_msa_in_recycling': True + }, +}) diff --git a/alphafold/alphafold/model/data.py b/alphafold/alphafold/model/data.py new file mode 100644 index 0000000000000000000000000000000000000000..249cdb3158f94d3f3ff4ae04c971b903284fdc09 --- /dev/null +++ b/alphafold/alphafold/model/data.py @@ -0,0 +1,39 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Convenience functions for reading data.""" + +import io +import os +from typing import List +from alphafold.model import utils +import haiku as hk +import numpy as np +# Internal import (7716). + + +def casp_model_names(data_dir: str) -> List[str]: + params = os.listdir(os.path.join(data_dir, 'params')) + return [os.path.splitext(filename)[0] for filename in params] + + +def get_model_haiku_params(model_name: str, data_dir: str) -> hk.Params: + """Get the Haiku parameters from a model name.""" + + path = os.path.join(data_dir, 'params', f'params_{model_name}.npz') + + with open(path, 'rb') as f: + params = np.load(io.BytesIO(f.read()), allow_pickle=False) + + return utils.flat_params_to_haiku(params) diff --git a/alphafold/alphafold/model/features.py b/alphafold/alphafold/model/features.py new file mode 100644 index 0000000000000000000000000000000000000000..b31b277e02d66aa94013cef914ed035e7f041edc --- /dev/null +++ b/alphafold/alphafold/model/features.py @@ -0,0 +1,102 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Code to generate processed features.""" +import copy +from typing import List, Mapping, Tuple +from alphafold.model.tf import input_pipeline +from alphafold.model.tf import proteins_dataset +import ml_collections +import numpy as np +import tensorflow.compat.v1 as tf + +FeatureDict = Mapping[str, np.ndarray] + + +def make_data_config( + config: ml_collections.ConfigDict, + num_res: int, + ) -> Tuple[ml_collections.ConfigDict, List[str]]: + """Makes a data config for the input pipeline.""" + cfg = copy.deepcopy(config.data) + + feature_names = cfg.common.unsupervised_features + if cfg.common.use_templates: + feature_names += cfg.common.template_features + + with cfg.unlocked(): + cfg.eval.crop_size = num_res + + return cfg, feature_names + + +def tf_example_to_features(tf_example: tf.train.Example, + config: ml_collections.ConfigDict, + random_seed: int = 0) -> FeatureDict: + """Converts tf_example to numpy feature dictionary.""" + num_res = int(tf_example.features.feature['seq_length'].int64_list.value[0]) + cfg, feature_names = make_data_config(config, num_res=num_res) + + if 'deletion_matrix_int' in set(tf_example.features.feature): + deletion_matrix_int = ( + tf_example.features.feature['deletion_matrix_int'].int64_list.value) + feat = tf.train.Feature(float_list=tf.train.FloatList( + value=map(float, deletion_matrix_int))) + tf_example.features.feature['deletion_matrix'].CopyFrom(feat) + del tf_example.features.feature['deletion_matrix_int'] + + tf_graph = tf.Graph() + with tf_graph.as_default(), tf.device('/device:CPU:0'): + tf.compat.v1.set_random_seed(random_seed) + tensor_dict = proteins_dataset.create_tensor_dict( + raw_data=tf_example.SerializeToString(), + features=feature_names) + processed_batch = input_pipeline.process_tensors_from_config( + tensor_dict, cfg) + + tf_graph.finalize() + + with tf.Session(graph=tf_graph) as sess: + features = sess.run(processed_batch) + + return {k: v for k, v in features.items() if v.dtype != 'O'} + + +def np_example_to_features(np_example: FeatureDict, + config: ml_collections.ConfigDict, + random_seed: int = 0) -> FeatureDict: + """Preprocesses NumPy feature dict using TF pipeline.""" + np_example = dict(np_example) + num_res = int(np_example['seq_length'][0]) + cfg, feature_names = make_data_config(config, num_res=num_res) + + if 'deletion_matrix_int' in np_example: + np_example['deletion_matrix'] = ( + np_example.pop('deletion_matrix_int').astype(np.float32)) + + tf_graph = tf.Graph() + with tf_graph.as_default(), tf.device('/device:CPU:0'): + tf.compat.v1.set_random_seed(random_seed) + tensor_dict = proteins_dataset.np_to_tensor_dict( + np_example=np_example, features=feature_names) + + processed_batch = input_pipeline.process_tensors_from_config( + tensor_dict, cfg) + + tf_graph.finalize() + + with tf.Session(graph=tf_graph) as sess: + features = sess.run(processed_batch) + + return {k: v for k, v in features.items() if v.dtype != 'O'} diff --git a/alphafold/alphafold/model/folding.py b/alphafold/alphafold/model/folding.py new file mode 100644 index 0000000000000000000000000000000000000000..1faf5bd58377880107da119b4b65c96a2f1e728d --- /dev/null +++ b/alphafold/alphafold/model/folding.py @@ -0,0 +1,1009 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Modules and utilities for the structure module.""" + +import functools +from typing import Dict +from alphafold.common import residue_constants +from alphafold.model import all_atom +from alphafold.model import common_modules +from alphafold.model import prng +from alphafold.model import quat_affine +from alphafold.model import r3 +from alphafold.model import utils +import haiku as hk +import jax +import jax.numpy as jnp +import ml_collections +import numpy as np + + +def squared_difference(x, y): + return jnp.square(x - y) + + +class InvariantPointAttention(hk.Module): + """Invariant Point attention module. + + The high-level idea is that this attention module works over a set of points + and associated orientations in 3D space (e.g. protein residues). + + Each residue outputs a set of queries and keys as points in their local + reference frame. The attention is then defined as the euclidean distance + between the queries and keys in the global frame. + + Jumper et al. (2021) Suppl. Alg. 22 "InvariantPointAttention" + """ + + def __init__(self, + config, + global_config, + dist_epsilon=1e-8, + name='invariant_point_attention'): + """Initialize. + + Args: + config: Structure Module Config + global_config: Global Config of Model. + dist_epsilon: Small value to avoid NaN in distance calculation. + name: Haiku Module name. + """ + super().__init__(name=name) + + self._dist_epsilon = dist_epsilon + self._zero_initialize_last = global_config.zero_init + + self.config = config + + self.global_config = global_config + + def __call__(self, inputs_1d, inputs_2d, mask, affine): + """Compute geometry-aware attention. + + Given a set of query residues (defined by affines and associated scalar + features), this function computes geometry-aware attention between the + query residues and target residues. + + The residues produce points in their local reference frame, which + are converted into the global frame in order to compute attention via + euclidean distance. + + Equivalently, the target residues produce points in their local frame to be + used as attention values, which are converted into the query residues' + local frames. + + Args: + inputs_1d: (N, C) 1D input embedding that is the basis for the + scalar queries. + inputs_2d: (N, M, C') 2D input embedding, used for biases and values. + mask: (N, 1) mask to indicate which elements of inputs_1d participate + in the attention. + affine: QuatAffine object describing the position and orientation of + every element in inputs_1d. + + Returns: + Transformation of the input embedding. + """ + num_residues, _ = inputs_1d.shape + + # Improve readability by removing a large number of 'self's. + num_head = self.config.num_head + num_scalar_qk = self.config.num_scalar_qk + num_point_qk = self.config.num_point_qk + num_scalar_v = self.config.num_scalar_v + num_point_v = self.config.num_point_v + num_output = self.config.num_channel + + assert num_scalar_qk > 0 + assert num_point_qk > 0 + assert num_point_v > 0 + + # Construct scalar queries of shape: + # [num_query_residues, num_head, num_points] + q_scalar = common_modules.Linear( + num_head * num_scalar_qk, name='q_scalar')( + inputs_1d) + q_scalar = jnp.reshape( + q_scalar, [num_residues, num_head, num_scalar_qk]) + + # Construct scalar keys/values of shape: + # [num_target_residues, num_head, num_points] + kv_scalar = common_modules.Linear( + num_head * (num_scalar_v + num_scalar_qk), name='kv_scalar')( + inputs_1d) + kv_scalar = jnp.reshape(kv_scalar, + [num_residues, num_head, + num_scalar_v + num_scalar_qk]) + k_scalar, v_scalar = jnp.split(kv_scalar, [num_scalar_qk], axis=-1) + + # Construct query points of shape: + # [num_residues, num_head, num_point_qk] + + # First construct query points in local frame. + q_point_local = common_modules.Linear( + num_head * 3 * num_point_qk, name='q_point_local')( + inputs_1d) + q_point_local = jnp.split(q_point_local, 3, axis=-1) + # Project query points into global frame. + q_point_global = affine.apply_to_point(q_point_local, extra_dims=1) + # Reshape query point for later use. + q_point = [ + jnp.reshape(x, [num_residues, num_head, num_point_qk]) + for x in q_point_global] + + # Construct key and value points. + # Key points have shape [num_residues, num_head, num_point_qk] + # Value points have shape [num_residues, num_head, num_point_v] + + # Construct key and value points in local frame. + kv_point_local = common_modules.Linear( + num_head * 3 * (num_point_qk + num_point_v), name='kv_point_local')( + inputs_1d) + kv_point_local = jnp.split(kv_point_local, 3, axis=-1) + # Project key and value points into global frame. + kv_point_global = affine.apply_to_point(kv_point_local, extra_dims=1) + kv_point_global = [ + jnp.reshape(x, [num_residues, + num_head, (num_point_qk + num_point_v)]) + for x in kv_point_global] + # Split key and value points. + k_point, v_point = list( + zip(*[ + jnp.split(x, [num_point_qk,], axis=-1) + for x in kv_point_global + ])) + + # We assume that all queries and keys come iid from N(0, 1) distribution + # and compute the variances of the attention logits. + # Each scalar pair (q, k) contributes Var q*k = 1 + scalar_variance = max(num_scalar_qk, 1) * 1. + # Each point pair (q, k) contributes Var [0.5 ||q||^2 - ] = 9 / 2 + point_variance = max(num_point_qk, 1) * 9. / 2 + + # Allocate equal variance to scalar, point and attention 2d parts so that + # the sum is 1. + + num_logit_terms = 3 + + scalar_weights = np.sqrt(1.0 / (num_logit_terms * scalar_variance)) + point_weights = np.sqrt(1.0 / (num_logit_terms * point_variance)) + attention_2d_weights = np.sqrt(1.0 / (num_logit_terms)) + + # Trainable per-head weights for points. + trainable_point_weights = jax.nn.softplus(hk.get_parameter( + 'trainable_point_weights', shape=[num_head], + # softplus^{-1} (1) + init=hk.initializers.Constant(np.log(np.exp(1.) - 1.)))) + point_weights *= jnp.expand_dims(trainable_point_weights, axis=1) + + v_point = [jnp.swapaxes(x, -2, -3) for x in v_point] + + q_point = [jnp.swapaxes(x, -2, -3) for x in q_point] + k_point = [jnp.swapaxes(x, -2, -3) for x in k_point] + dist2 = [ + squared_difference(qx[:, :, None, :], kx[:, None, :, :]) + for qx, kx in zip(q_point, k_point) + ] + dist2 = sum(dist2) + attn_qk_point = -0.5 * jnp.sum( + point_weights[:, None, None, :] * dist2, axis=-1) + + v = jnp.swapaxes(v_scalar, -2, -3) + q = jnp.swapaxes(scalar_weights * q_scalar, -2, -3) + k = jnp.swapaxes(k_scalar, -2, -3) + attn_qk_scalar = jnp.matmul(q, jnp.swapaxes(k, -2, -1)) + attn_logits = attn_qk_scalar + attn_qk_point + + attention_2d = common_modules.Linear( + num_head, name='attention_2d')( + inputs_2d) + + attention_2d = jnp.transpose(attention_2d, [2, 0, 1]) + attention_2d = attention_2d_weights * attention_2d + attn_logits += attention_2d + + mask_2d = mask * jnp.swapaxes(mask, -1, -2) + attn_logits -= 1e5 * (1. - mask_2d) + + # [num_head, num_query_residues, num_target_residues] + attn = jax.nn.softmax(attn_logits) + + # [num_head, num_query_residues, num_head * num_scalar_v] + result_scalar = jnp.matmul(attn, v) + + # For point result, implement matmul manually so that it will be a float32 + # on TPU. This is equivalent to + # result_point_global = [jnp.einsum('bhqk,bhkc->bhqc', attn, vx) + # for vx in v_point] + # but on the TPU, doing the multiply and reduce_sum ensures the + # computation happens in float32 instead of bfloat16. + result_point_global = [jnp.sum( + attn[:, :, :, None] * vx[:, None, :, :], + axis=-2) for vx in v_point] + + # [num_query_residues, num_head, num_head * num_(scalar|point)_v] + result_scalar = jnp.swapaxes(result_scalar, -2, -3) + result_point_global = [ + jnp.swapaxes(x, -2, -3) + for x in result_point_global] + + # Features used in the linear output projection. Should have the size + # [num_query_residues, ?] + output_features = [] + + result_scalar = jnp.reshape( + result_scalar, [num_residues, num_head * num_scalar_v]) + output_features.append(result_scalar) + + result_point_global = [ + jnp.reshape(r, [num_residues, num_head * num_point_v]) + for r in result_point_global] + result_point_local = affine.invert_point(result_point_global, extra_dims=1) + output_features.extend(result_point_local) + + output_features.append(jnp.sqrt(self._dist_epsilon + + jnp.square(result_point_local[0]) + + jnp.square(result_point_local[1]) + + jnp.square(result_point_local[2]))) + + # Dimensions: h = heads, i and j = residues, + # c = inputs_2d channels + # Contraction happens over the second residue dimension, similarly to how + # the usual attention is performed. + result_attention_over_2d = jnp.einsum('hij, ijc->ihc', attn, inputs_2d) + num_out = num_head * result_attention_over_2d.shape[-1] + output_features.append( + jnp.reshape(result_attention_over_2d, + [num_residues, num_out])) + + final_init = 'zeros' if self._zero_initialize_last else 'linear' + + final_act = jnp.concatenate(output_features, axis=-1) + + return common_modules.Linear( + num_output, + initializer=final_init, + name='output_projection')(final_act) + + +class FoldIteration(hk.Module): + """A single iteration of the main structure module loop. + + Jumper et al. (2021) Suppl. Alg. 20 "StructureModule" lines 6-21 + + First, each residue attends to all residues using InvariantPointAttention. + Then, we apply transition layers to update the hidden representations. + Finally, we use the hidden representations to produce an update to the + affine of each residue. + """ + + def __init__(self, config, global_config, + name='fold_iteration'): + super().__init__(name=name) + self.config = config + self.global_config = global_config + + def __call__(self, + activations, + sequence_mask, + update_affine, + is_training, + initial_act, + safe_key=None, + static_feat_2d=None, + aatype=None): + c = self.config + + if safe_key is None: + safe_key = prng.SafeKey(hk.next_rng_key()) + + def safe_dropout_fn(tensor, safe_key): + return prng.safe_dropout( + tensor=tensor, + safe_key=safe_key, + rate=c.dropout, + is_deterministic=self.global_config.deterministic, + is_training=is_training) + + affine = quat_affine.QuatAffine.from_tensor(activations['affine']) + + act = activations['act'] + attention_module = InvariantPointAttention(self.config, self.global_config) + # Attention + attn = attention_module( + inputs_1d=act, + inputs_2d=static_feat_2d, + mask=sequence_mask, + affine=affine) + act += attn + safe_key, *sub_keys = safe_key.split(3) + sub_keys = iter(sub_keys) + act = safe_dropout_fn(act, next(sub_keys)) + act = hk.LayerNorm( + axis=[-1], + create_scale=True, + create_offset=True, + name='attention_layer_norm')( + act) + + final_init = 'zeros' if self.global_config.zero_init else 'linear' + + # Transition + input_act = act + for i in range(c.num_layer_in_transition): + init = 'relu' if i < c.num_layer_in_transition - 1 else final_init + act = common_modules.Linear( + c.num_channel, + initializer=init, + name='transition')( + act) + if i < c.num_layer_in_transition - 1: + act = jax.nn.relu(act) + act += input_act + act = safe_dropout_fn(act, next(sub_keys)) + act = hk.LayerNorm( + axis=[-1], + create_scale=True, + create_offset=True, + name='transition_layer_norm')(act) + + if update_affine: + # This block corresponds to + # Jumper et al. (2021) Alg. 23 "Backbone update" + affine_update_size = 6 + + # Affine update + affine_update = common_modules.Linear( + affine_update_size, + initializer=final_init, + name='affine_update')( + act) + + affine = affine.pre_compose(affine_update) + + sc = MultiRigidSidechain(c.sidechain, self.global_config)( + affine.scale_translation(c.position_scale), [act, initial_act], aatype) + + outputs = {'affine': affine.to_tensor(), 'sc': sc} + + affine = affine.apply_rotation_tensor_fn(jax.lax.stop_gradient) + + new_activations = { + 'act': act, + 'affine': affine.to_tensor() + } + return new_activations, outputs + + +def generate_affines(representations, batch, config, global_config, + is_training, safe_key): + """Generate predicted affines for a single chain. + + Jumper et al. (2021) Suppl. Alg. 20 "StructureModule" + + This is the main part of the structure module - it iteratively applies + folding to produce a set of predicted residue positions. + + Args: + representations: Representations dictionary. + batch: Batch dictionary. + config: Config for the structure module. + global_config: Global config. + is_training: Whether the model is being trained. + safe_key: A prng.SafeKey object that wraps a PRNG key. + + Returns: + A dictionary containing residue affines and sidechain positions. + """ + c = config + sequence_mask = batch['seq_mask'][:, None] + + act = hk.LayerNorm( + axis=[-1], + create_scale=True, + create_offset=True, + name='single_layer_norm')( + representations['single']) + + initial_act = act + act = common_modules.Linear( + c.num_channel, name='initial_projection')( + act) + + affine = generate_new_affine(sequence_mask) + + fold_iteration = FoldIteration( + c, global_config, name='fold_iteration') + + assert len(batch['seq_mask'].shape) == 1 + + activations = {'act': act, + 'affine': affine.to_tensor(), + } + + act_2d = hk.LayerNorm( + axis=[-1], + create_scale=True, + create_offset=True, + name='pair_layer_norm')( + representations['pair']) + + outputs = [] + safe_keys = safe_key.split(c.num_layer) + for sub_key in safe_keys: + activations, output = fold_iteration( + activations, + initial_act=initial_act, + static_feat_2d=act_2d, + safe_key=sub_key, + sequence_mask=sequence_mask, + update_affine=True, + is_training=is_training, + aatype=batch['aatype']) + outputs.append(output) + + output = jax.tree_map(lambda *x: jnp.stack(x), *outputs) + # Include the activations in the output dict for use by the LDDT-Head. + output['act'] = activations['act'] + + return output + + +class StructureModule(hk.Module): + """StructureModule as a network head. + + Jumper et al. (2021) Suppl. Alg. 20 "StructureModule" + """ + + def __init__(self, config, global_config, compute_loss=True, + name='structure_module'): + super().__init__(name=name) + self.config = config + self.global_config = global_config + self.compute_loss = compute_loss + + def __call__(self, representations, batch, is_training, + safe_key=None): + c = self.config + ret = {} + + if safe_key is None: + safe_key = prng.SafeKey(hk.next_rng_key()) + + output = generate_affines( + representations=representations, + batch=batch, + config=self.config, + global_config=self.global_config, + is_training=is_training, + safe_key=safe_key) + + ret['representations'] = {'structure_module': output['act']} + + ret['traj'] = output['affine'] * jnp.array([1.] * 4 + + [c.position_scale] * 3) + + ret['sidechains'] = output['sc'] + + atom14_pred_positions = r3.vecs_to_tensor(output['sc']['atom_pos'])[-1] + ret['final_atom14_positions'] = atom14_pred_positions # (N, 14, 3) + ret['final_atom14_mask'] = batch['atom14_atom_exists'] # (N, 14) + + atom37_pred_positions = all_atom.atom14_to_atom37(atom14_pred_positions, + batch) + atom37_pred_positions *= batch['atom37_atom_exists'][:, :, None] + ret['final_atom_positions'] = atom37_pred_positions # (N, 37, 3) + + ret['final_atom_mask'] = batch['atom37_atom_exists'] # (N, 37) + ret['final_affines'] = ret['traj'][-1] + + if self.compute_loss: + return ret + else: + no_loss_features = ['final_atom_positions', 'final_atom_mask', + 'representations'] + no_loss_ret = {k: ret[k] for k in no_loss_features} + return no_loss_ret + + def loss(self, value, batch): + ret = {'loss': 0.} + + ret['metrics'] = {} + # If requested, compute in-graph metrics. + if self.config.compute_in_graph_metrics: + atom14_pred_positions = value['final_atom14_positions'] + # Compute renaming and violations. + value.update(compute_renamed_ground_truth(batch, atom14_pred_positions)) + value['violations'] = find_structural_violations( + batch, atom14_pred_positions, self.config) + + # Several violation metrics: + violation_metrics = compute_violation_metrics( + batch=batch, + atom14_pred_positions=atom14_pred_positions, + violations=value['violations']) + ret['metrics'].update(violation_metrics) + + backbone_loss(ret, batch, value, self.config) + + if 'renamed_atom14_gt_positions' not in value: + value.update(compute_renamed_ground_truth( + batch, value['final_atom14_positions'])) + sc_loss = sidechain_loss(batch, value, self.config) + + ret['loss'] = ((1 - self.config.sidechain.weight_frac) * ret['loss'] + + self.config.sidechain.weight_frac * sc_loss['loss']) + ret['sidechain_fape'] = sc_loss['fape'] + + supervised_chi_loss(ret, batch, value, self.config) + + if self.config.structural_violation_loss_weight: + if 'violations' not in value: + value['violations'] = find_structural_violations( + batch, value['final_atom14_positions'], self.config) + structural_violation_loss(ret, batch, value, self.config) + + return ret + + +def compute_renamed_ground_truth( + batch: Dict[str, jnp.ndarray], + atom14_pred_positions: jnp.ndarray, + ) -> Dict[str, jnp.ndarray]: + """Find optimal renaming of ground truth based on the predicted positions. + + Jumper et al. (2021) Suppl. Alg. 26 "renameSymmetricGroundTruthAtoms" + + This renamed ground truth is then used for all losses, + such that each loss moves the atoms in the same direction. + Shape (N). + + Args: + batch: Dictionary containing: + * atom14_gt_positions: Ground truth positions. + * atom14_alt_gt_positions: Ground truth positions with renaming swaps. + * atom14_atom_is_ambiguous: 1.0 for atoms that are affected by + renaming swaps. + * atom14_gt_exists: Mask for which atoms exist in ground truth. + * atom14_alt_gt_exists: Mask for which atoms exist in ground truth + after renaming. + * atom14_atom_exists: Mask for whether each atom is part of the given + amino acid type. + atom14_pred_positions: Array of atom positions in global frame with shape + (N, 14, 3). + Returns: + Dictionary containing: + alt_naming_is_better: Array with 1.0 where alternative swap is better. + renamed_atom14_gt_positions: Array of optimal ground truth positions + after renaming swaps are performed. + renamed_atom14_gt_exists: Mask after renaming swap is performed. + """ + alt_naming_is_better = all_atom.find_optimal_renaming( + atom14_gt_positions=batch['atom14_gt_positions'], + atom14_alt_gt_positions=batch['atom14_alt_gt_positions'], + atom14_atom_is_ambiguous=batch['atom14_atom_is_ambiguous'], + atom14_gt_exists=batch['atom14_gt_exists'], + atom14_pred_positions=atom14_pred_positions, + atom14_atom_exists=batch['atom14_atom_exists']) + + renamed_atom14_gt_positions = ( + (1. - alt_naming_is_better[:, None, None]) + * batch['atom14_gt_positions'] + + alt_naming_is_better[:, None, None] + * batch['atom14_alt_gt_positions']) + + renamed_atom14_gt_mask = ( + (1. - alt_naming_is_better[:, None]) * batch['atom14_gt_exists'] + + alt_naming_is_better[:, None] * batch['atom14_alt_gt_exists']) + + return { + 'alt_naming_is_better': alt_naming_is_better, # (N) + 'renamed_atom14_gt_positions': renamed_atom14_gt_positions, # (N, 14, 3) + 'renamed_atom14_gt_exists': renamed_atom14_gt_mask, # (N, 14) + } + + +def backbone_loss(ret, batch, value, config): + """Backbone FAPE Loss. + + Jumper et al. (2021) Suppl. Alg. 20 "StructureModule" line 17 + + Args: + ret: Dictionary to write outputs into, needs to contain 'loss'. + batch: Batch, needs to contain 'backbone_affine_tensor', + 'backbone_affine_mask'. + value: Dictionary containing structure module output, needs to contain + 'traj', a trajectory of rigids. + config: Configuration of loss, should contain 'fape.clamp_distance' and + 'fape.loss_unit_distance'. + """ + affine_trajectory = quat_affine.QuatAffine.from_tensor(value['traj']) + rigid_trajectory = r3.rigids_from_quataffine(affine_trajectory) + + gt_affine = quat_affine.QuatAffine.from_tensor( + batch['backbone_affine_tensor']) + gt_rigid = r3.rigids_from_quataffine(gt_affine) + backbone_mask = batch['backbone_affine_mask'] + + fape_loss_fn = functools.partial( + all_atom.frame_aligned_point_error, + l1_clamp_distance=config.fape.clamp_distance, + length_scale=config.fape.loss_unit_distance) + + fape_loss_fn = jax.vmap(fape_loss_fn, (0, None, None, 0, None, None)) + fape_loss = fape_loss_fn(rigid_trajectory, gt_rigid, backbone_mask, + rigid_trajectory.trans, gt_rigid.trans, + backbone_mask) + + if 'use_clamped_fape' in batch: + # Jumper et al. (2021) Suppl. Sec. 1.11.5 "Loss clamping details" + use_clamped_fape = jnp.asarray(batch['use_clamped_fape'], jnp.float32) + unclamped_fape_loss_fn = functools.partial( + all_atom.frame_aligned_point_error, + l1_clamp_distance=None, + length_scale=config.fape.loss_unit_distance) + unclamped_fape_loss_fn = jax.vmap(unclamped_fape_loss_fn, + (0, None, None, 0, None, None)) + fape_loss_unclamped = unclamped_fape_loss_fn(rigid_trajectory, gt_rigid, + backbone_mask, + rigid_trajectory.trans, + gt_rigid.trans, + backbone_mask) + + fape_loss = (fape_loss * use_clamped_fape + + fape_loss_unclamped * (1 - use_clamped_fape)) + + ret['fape'] = fape_loss[-1] + ret['loss'] += jnp.mean(fape_loss) + + +def sidechain_loss(batch, value, config): + """All Atom FAPE Loss using renamed rigids.""" + # Rename Frames + # Jumper et al. (2021) Suppl. Alg. 26 "renameSymmetricGroundTruthAtoms" line 7 + alt_naming_is_better = value['alt_naming_is_better'] + renamed_gt_frames = ( + (1. - alt_naming_is_better[:, None, None]) + * batch['rigidgroups_gt_frames'] + + alt_naming_is_better[:, None, None] + * batch['rigidgroups_alt_gt_frames']) + + flat_gt_frames = r3.rigids_from_tensor_flat12( + jnp.reshape(renamed_gt_frames, [-1, 12])) + flat_frames_mask = jnp.reshape(batch['rigidgroups_gt_exists'], [-1]) + + flat_gt_positions = r3.vecs_from_tensor( + jnp.reshape(value['renamed_atom14_gt_positions'], [-1, 3])) + flat_positions_mask = jnp.reshape(value['renamed_atom14_gt_exists'], [-1]) + + # Compute frame_aligned_point_error score for the final layer. + pred_frames = value['sidechains']['frames'] + pred_positions = value['sidechains']['atom_pos'] + + def _slice_last_layer_and_flatten(x): + return jnp.reshape(x[-1], [-1]) + flat_pred_frames = jax.tree_map( + _slice_last_layer_and_flatten, pred_frames) + flat_pred_positions = jax.tree_map( + _slice_last_layer_and_flatten, pred_positions) + # FAPE Loss on sidechains + fape = all_atom.frame_aligned_point_error( + pred_frames=flat_pred_frames, + target_frames=flat_gt_frames, + frames_mask=flat_frames_mask, + pred_positions=flat_pred_positions, + target_positions=flat_gt_positions, + positions_mask=flat_positions_mask, + l1_clamp_distance=config.sidechain.atom_clamp_distance, + length_scale=config.sidechain.length_scale) + + return { + 'fape': fape, + 'loss': fape} + + +def structural_violation_loss(ret, batch, value, config): + """Computes loss for structural violations.""" + assert config.sidechain.weight_frac + + # Put all violation losses together to one large loss. + violations = value['violations'] + num_atoms = jnp.sum(batch['atom14_atom_exists']).astype(jnp.float32) + ret['loss'] += (config.structural_violation_loss_weight * ( + violations['between_residues']['bonds_c_n_loss_mean'] + + violations['between_residues']['angles_ca_c_n_loss_mean'] + + violations['between_residues']['angles_c_n_ca_loss_mean'] + + jnp.sum( + violations['between_residues']['clashes_per_atom_loss_sum'] + + violations['within_residues']['per_atom_loss_sum']) / + (1e-6 + num_atoms))) + + +def find_structural_violations( + batch: Dict[str, jnp.ndarray], + atom14_pred_positions: jnp.ndarray, # (N, 14, 3) + config: ml_collections.ConfigDict + ): + """Computes several checks for structural violations.""" + + # Compute between residue backbone violations of bonds and angles. + connection_violations = all_atom.between_residue_bond_loss( + pred_atom_positions=atom14_pred_positions, + pred_atom_mask=batch['atom14_atom_exists'].astype(jnp.float32), + residue_index=batch['residue_index'].astype(jnp.float32), + aatype=batch['aatype'], + tolerance_factor_soft=config.violation_tolerance_factor, + tolerance_factor_hard=config.violation_tolerance_factor) + + # Compute the Van der Waals radius for every atom + # (the first letter of the atom name is the element type). + # Shape: (N, 14). + atomtype_radius = jnp.array([ + residue_constants.van_der_waals_radius[name[0]] + for name in residue_constants.atom_types + ]) + atom14_atom_radius = batch['atom14_atom_exists'] * utils.batched_gather( + atomtype_radius, batch['residx_atom14_to_atom37']) + + # Compute the between residue clash loss. + between_residue_clashes = all_atom.between_residue_clash_loss( + atom14_pred_positions=atom14_pred_positions, + atom14_atom_exists=batch['atom14_atom_exists'], + atom14_atom_radius=atom14_atom_radius, + residue_index=batch['residue_index'], + overlap_tolerance_soft=config.clash_overlap_tolerance, + overlap_tolerance_hard=config.clash_overlap_tolerance) + + # Compute all within-residue violations (clashes, + # bond length and angle violations). + restype_atom14_bounds = residue_constants.make_atom14_dists_bounds( + overlap_tolerance=config.clash_overlap_tolerance, + bond_length_tolerance_factor=config.violation_tolerance_factor) + atom14_dists_lower_bound = utils.batched_gather( + restype_atom14_bounds['lower_bound'], batch['aatype']) + atom14_dists_upper_bound = utils.batched_gather( + restype_atom14_bounds['upper_bound'], batch['aatype']) + within_residue_violations = all_atom.within_residue_violations( + atom14_pred_positions=atom14_pred_positions, + atom14_atom_exists=batch['atom14_atom_exists'], + atom14_dists_lower_bound=atom14_dists_lower_bound, + atom14_dists_upper_bound=atom14_dists_upper_bound, + tighten_bounds_for_loss=0.0) + + # Combine them to a single per-residue violation mask (used later for LDDT). + per_residue_violations_mask = jnp.max(jnp.stack([ + connection_violations['per_residue_violation_mask'], + jnp.max(between_residue_clashes['per_atom_clash_mask'], axis=-1), + jnp.max(within_residue_violations['per_atom_violations'], + axis=-1)]), axis=0) + + return { + 'between_residues': { + 'bonds_c_n_loss_mean': + connection_violations['c_n_loss_mean'], # () + 'angles_ca_c_n_loss_mean': + connection_violations['ca_c_n_loss_mean'], # () + 'angles_c_n_ca_loss_mean': + connection_violations['c_n_ca_loss_mean'], # () + 'connections_per_residue_loss_sum': + connection_violations['per_residue_loss_sum'], # (N) + 'connections_per_residue_violation_mask': + connection_violations['per_residue_violation_mask'], # (N) + 'clashes_mean_loss': + between_residue_clashes['mean_loss'], # () + 'clashes_per_atom_loss_sum': + between_residue_clashes['per_atom_loss_sum'], # (N, 14) + 'clashes_per_atom_clash_mask': + between_residue_clashes['per_atom_clash_mask'], # (N, 14) + }, + 'within_residues': { + 'per_atom_loss_sum': + within_residue_violations['per_atom_loss_sum'], # (N, 14) + 'per_atom_violations': + within_residue_violations['per_atom_violations'], # (N, 14), + }, + 'total_per_residue_violations_mask': + per_residue_violations_mask, # (N) + } + + +def compute_violation_metrics( + batch: Dict[str, jnp.ndarray], + atom14_pred_positions: jnp.ndarray, # (N, 14, 3) + violations: Dict[str, jnp.ndarray], + ) -> Dict[str, jnp.ndarray]: + """Compute several metrics to assess the structural violations.""" + + ret = {} + extreme_ca_ca_violations = all_atom.extreme_ca_ca_distance_violations( + pred_atom_positions=atom14_pred_positions, + pred_atom_mask=batch['atom14_atom_exists'].astype(jnp.float32), + residue_index=batch['residue_index'].astype(jnp.float32)) + ret['violations_extreme_ca_ca_distance'] = extreme_ca_ca_violations + ret['violations_between_residue_bond'] = utils.mask_mean( + mask=batch['seq_mask'], + value=violations['between_residues'][ + 'connections_per_residue_violation_mask']) + ret['violations_between_residue_clash'] = utils.mask_mean( + mask=batch['seq_mask'], + value=jnp.max( + violations['between_residues']['clashes_per_atom_clash_mask'], + axis=-1)) + ret['violations_within_residue'] = utils.mask_mean( + mask=batch['seq_mask'], + value=jnp.max( + violations['within_residues']['per_atom_violations'], axis=-1)) + ret['violations_per_residue'] = utils.mask_mean( + mask=batch['seq_mask'], + value=violations['total_per_residue_violations_mask']) + return ret + + +def supervised_chi_loss(ret, batch, value, config): + """Computes loss for direct chi angle supervision. + + Jumper et al. (2021) Suppl. Alg. 27 "torsionAngleLoss" + + Args: + ret: Dictionary to write outputs into, needs to contain 'loss'. + batch: Batch, needs to contain 'seq_mask', 'chi_mask', 'chi_angles'. + value: Dictionary containing structure module output, needs to contain + value['sidechains']['angles_sin_cos'] for angles and + value['sidechains']['unnormalized_angles_sin_cos'] for unnormalized + angles. + config: Configuration of loss, should contain 'chi_weight' and + 'angle_norm_weight', 'angle_norm_weight' scales angle norm term, + 'chi_weight' scales torsion term. + """ + eps = 1e-6 + + sequence_mask = batch['seq_mask'] + num_res = sequence_mask.shape[0] + chi_mask = batch['chi_mask'].astype(jnp.float32) + pred_angles = jnp.reshape( + value['sidechains']['angles_sin_cos'], [-1, num_res, 7, 2]) + pred_angles = pred_angles[:, :, 3:] + + residue_type_one_hot = jax.nn.one_hot( + batch['aatype'], residue_constants.restype_num + 1, + dtype=jnp.float32)[None] + chi_pi_periodic = jnp.einsum('ijk, kl->ijl', residue_type_one_hot, + jnp.asarray(residue_constants.chi_pi_periodic)) + + true_chi = batch['chi_angles'][None] + sin_true_chi = jnp.sin(true_chi) + cos_true_chi = jnp.cos(true_chi) + sin_cos_true_chi = jnp.stack([sin_true_chi, cos_true_chi], axis=-1) + + # This is -1 if chi is pi-periodic and +1 if it's 2pi-periodic + shifted_mask = (1 - 2 * chi_pi_periodic)[..., None] + sin_cos_true_chi_shifted = shifted_mask * sin_cos_true_chi + + sq_chi_error = jnp.sum( + squared_difference(sin_cos_true_chi, pred_angles), -1) + sq_chi_error_shifted = jnp.sum( + squared_difference(sin_cos_true_chi_shifted, pred_angles), -1) + sq_chi_error = jnp.minimum(sq_chi_error, sq_chi_error_shifted) + + sq_chi_loss = utils.mask_mean(mask=chi_mask[None], value=sq_chi_error) + ret['chi_loss'] = sq_chi_loss + ret['loss'] += config.chi_weight * sq_chi_loss + unnormed_angles = jnp.reshape( + value['sidechains']['unnormalized_angles_sin_cos'], [-1, num_res, 7, 2]) + angle_norm = jnp.sqrt(jnp.sum(jnp.square(unnormed_angles), axis=-1) + eps) + norm_error = jnp.abs(angle_norm - 1.) + angle_norm_loss = utils.mask_mean(mask=sequence_mask[None, :, None], + value=norm_error) + + ret['angle_norm_loss'] = angle_norm_loss + ret['loss'] += config.angle_norm_weight * angle_norm_loss + + +def generate_new_affine(sequence_mask): + num_residues, _ = sequence_mask.shape + quaternion = jnp.tile( + jnp.reshape(jnp.asarray([1., 0., 0., 0.]), [1, 4]), + [num_residues, 1]) + + translation = jnp.zeros([num_residues, 3]) + return quat_affine.QuatAffine(quaternion, translation, unstack_inputs=True) + + +def l2_normalize(x, axis=-1, epsilon=1e-12): + return x / jnp.sqrt( + jnp.maximum(jnp.sum(x**2, axis=axis, keepdims=True), epsilon)) + + +class MultiRigidSidechain(hk.Module): + """Class to make side chain atoms.""" + + def __init__(self, config, global_config, name='rigid_sidechain'): + super().__init__(name=name) + self.config = config + self.global_config = global_config + + def __call__(self, affine, representations_list, aatype): + """Predict side chains using multi-rigid representations. + + Args: + affine: The affines for each residue (translations in angstroms). + representations_list: A list of activations to predict side chains from. + aatype: Amino acid types. + + Returns: + Dict containing atom positions and frames (in angstroms). + """ + act = [ + common_modules.Linear( # pylint: disable=g-complex-comprehension + self.config.num_channel, + name='input_projection')(jax.nn.relu(x)) + for x in representations_list + ] + # Sum the activation list (equivalent to concat then Linear). + act = sum(act) + + final_init = 'zeros' if self.global_config.zero_init else 'linear' + + # Mapping with some residual blocks. + for _ in range(self.config.num_residual_block): + old_act = act + act = common_modules.Linear( + self.config.num_channel, + initializer='relu', + name='resblock1')( + jax.nn.relu(act)) + act = common_modules.Linear( + self.config.num_channel, + initializer=final_init, + name='resblock2')( + jax.nn.relu(act)) + act += old_act + + # Map activations to torsion angles. Shape: (num_res, 14). + num_res = act.shape[0] + unnormalized_angles = common_modules.Linear( + 14, name='unnormalized_angles')( + jax.nn.relu(act)) + unnormalized_angles = jnp.reshape( + unnormalized_angles, [num_res, 7, 2]) + angles = l2_normalize(unnormalized_angles, axis=-1) + + outputs = { + 'angles_sin_cos': angles, # jnp.ndarray (N, 7, 2) + 'unnormalized_angles_sin_cos': + unnormalized_angles, # jnp.ndarray (N, 7, 2) + } + + # Map torsion angles to frames. + backb_to_global = r3.rigids_from_quataffine(affine) + + # Jumper et al. (2021) Suppl. Alg. 24 "computeAllAtomCoordinates" + + # r3.Rigids with shape (N, 8). + all_frames_to_global = all_atom.torsion_angles_to_frames( + aatype, + backb_to_global, + angles) + + # Use frames and literature positions to create the final atom coordinates. + # r3.Vecs with shape (N, 14). + pred_positions = all_atom.frames_and_literature_positions_to_atom14_pos( + aatype, all_frames_to_global) + + outputs.update({ + 'atom_pos': pred_positions, # r3.Vecs (N, 14) + 'frames': all_frames_to_global, # r3.Rigids (N, 8) + }) + return outputs diff --git a/alphafold/alphafold/model/layer_stack.py b/alphafold/alphafold/model/layer_stack.py new file mode 100644 index 0000000000000000000000000000000000000000..cbbb0dcb26445ec8ce57149f31aba9fc4de2863c --- /dev/null +++ b/alphafold/alphafold/model/layer_stack.py @@ -0,0 +1,274 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Function to stack repeats of a layer function without shared parameters.""" + +import collections +import contextlib +import functools +import inspect +from typing import Any, Callable, Optional, Tuple, Union + +import haiku as hk +import jax +import jax.numpy as jnp + +LayerStackCarry = collections.namedtuple('LayerStackCarry', ['x', 'rng']) +LayerStackScanned = collections.namedtuple('LayerStackScanned', + ['i', 'args_ys']) + +# WrappedFn should take in arbitrarily nested `jnp.ndarray`, and return the +# exact same type. We cannot express this with `typing`. So we just use it +# to inform the user. In reality, the typing below will accept anything. +NestedArray = Any +WrappedFn = Callable[..., Union[NestedArray, Tuple[NestedArray]]] + + +def _check_no_varargs(f): + if list(inspect.signature( + f).parameters.values())[0].kind == inspect.Parameter.VAR_POSITIONAL: + raise ValueError( + 'The function `f` should not have any `varargs` (that is *args) ' + 'argument. Instead, it should only use explicit positional' + 'arguments.') + + +@contextlib.contextmanager +def nullcontext(): + yield + + +def maybe_with_rng(key): + if key is not None: + return hk.with_rng(key) + else: + return nullcontext() + + +def maybe_fold_in(key, data): + if key is not None: + return jax.random.fold_in(key, data) + else: + return None + + +class _LayerStack(hk.Module): + """Module to compose parameterized functions, implemented as a scan.""" + + def __init__(self, + count: int, + unroll: int, + name: Optional[str] = None): + """Iterate a function `f` `count` times, with non-shared parameters.""" + super().__init__(name=name) + self._count = count + self._unroll = unroll + + def __call__(self, x, *args_ys): + count = self._count + if hk.running_init(): + # At initialization time, we run just one layer but add an extra first + # dimension to every initialized tensor, making sure to use different + # random keys for different slices. + def creator(next_creator, shape, dtype, init, context): + del context + + def multi_init(shape, dtype): + assert shape[0] == count + key = hk.maybe_next_rng_key() + + def rng_context_init(slice_idx): + slice_key = maybe_fold_in(key, slice_idx) + with maybe_with_rng(slice_key): + return init(shape[1:], dtype) + + return jax.vmap(rng_context_init)(jnp.arange(count)) + + return next_creator((count,) + tuple(shape), dtype, multi_init) + + def getter(next_getter, value, context): + trailing_dims = len(context.original_shape) + 1 + sliced_value = jax.lax.index_in_dim( + value, index=0, axis=value.ndim - trailing_dims, keepdims=False) + return next_getter(sliced_value) + + with hk.experimental.custom_creator( + creator), hk.experimental.custom_getter(getter): + if len(args_ys) == 1 and args_ys[0] is None: + args0 = (None,) + else: + args0 = [ + jax.lax.dynamic_index_in_dim(ys, 0, keepdims=False) + for ys in args_ys + ] + x, z = self._call_wrapped(x, *args0) + if z is None: + return x, z + + # Broadcast state to hold each layer state. + def broadcast_state(layer_state): + return jnp.broadcast_to( + layer_state, [count,] + list(layer_state.shape)) + zs = jax.tree_util.tree_map(broadcast_state, z) + return x, zs + else: + # Use scan during apply, threading through random seed so that it's + # unique for each layer. + def layer(carry: LayerStackCarry, scanned: LayerStackScanned): + rng = carry.rng + + def getter(next_getter, value, context): + # Getter slices the full param at the current loop index. + trailing_dims = len(context.original_shape) + 1 + assert value.shape[value.ndim - trailing_dims] == count, ( + f'Attempting to use a parameter stack of size ' + f'{value.shape[value.ndim - trailing_dims]} for a LayerStack of ' + f'size {count}.') + + sliced_value = jax.lax.dynamic_index_in_dim( + value, scanned.i, axis=value.ndim - trailing_dims, keepdims=False) + return next_getter(sliced_value) + + with hk.experimental.custom_getter(getter): + if rng is None: + out_x, z = self._call_wrapped(carry.x, *scanned.args_ys) + else: + rng, rng_ = jax.random.split(rng) + with hk.with_rng(rng_): + out_x, z = self._call_wrapped(carry.x, *scanned.args_ys) + return LayerStackCarry(x=out_x, rng=rng), z + + carry = LayerStackCarry(x=x, rng=hk.maybe_next_rng_key()) + scanned = LayerStackScanned(i=jnp.arange(count, dtype=jnp.int32), + args_ys=args_ys) + + carry, zs = hk.scan( + layer, carry, scanned, length=count, unroll=self._unroll) + return carry.x, zs + + def _call_wrapped(self, + x: jnp.ndarray, + *args, + ) -> Tuple[jnp.ndarray, Optional[jnp.ndarray]]: + raise NotImplementedError() + + +class _LayerStackNoState(_LayerStack): + """_LayerStack impl with no per-layer state provided to the function.""" + + def __init__(self, + f: WrappedFn, + count: int, + unroll: int, + name: Optional[str] = None): + super().__init__(count=count, unroll=unroll, name=name) + _check_no_varargs(f) + self._f = f + + @hk.transparent + def _call_wrapped(self, args, y): + del y + ret = self._f(*args) + if len(args) == 1: + # If the function takes a single argument, the wrapped function receives + # a tuple of length 1, and therefore it must return a tuple of length 1. + ret = (ret,) + return ret, None + + +class _LayerStackWithState(_LayerStack): + """_LayerStack impl with per-layer state provided to the function.""" + + def __init__(self, + f: WrappedFn, + count: int, + unroll: int, + name: Optional[str] = None): + super().__init__(count=count, unroll=unroll, name=name) + self._f = f + + @hk.transparent + def _call_wrapped(self, x, *args): + return self._f(x, *args) + + +def layer_stack(num_layers: int, + with_state=False, + unroll: int = 1, + name: Optional[str] = None): + """Utility to wrap a Haiku function and recursively apply it to an input. + + A function is valid if it uses only explicit position parameters, and + its return type matches its input type. The position parameters can be + arbitrarily nested structures with `jnp.ndarray` at the leaf nodes. Note + that kwargs are not supported, neither are functions with variable number + of parameters (specified by `*args`). + + If `with_state=False` then the new, wrapped function can be understood as + performing the following: + ``` + for i in range(num_layers): + x = f(x) + return x + ``` + + And if `with_state=True`, assuming `f` takes two arguments on top of `x`: + ``` + for i in range(num_layers): + x, zs[i] = f(x, ys_0[i], ys_1[i]) + return x, zs + ``` + The code using `layer_stack` for the above function would be: + ``` + def f(x, y_0, y_1): + ... + return new_x, z + x, zs = layer_stack.layer_stack(num_layers, + with_state=True)(f)(x, ys_0, ys_1) + ``` + + Crucially, any parameters created inside `f` will not be shared across + iterations. + + Args: + num_layers: The number of times to iterate the wrapped function. + with_state: Whether or not to pass per-layer state to the wrapped function. + unroll: the unroll used by `scan`. + name: Name of the Haiku context. + + Returns: + Callable that will produce a layer stack when called with a valid function. + """ + def iterate(f): + if with_state: + @functools.wraps(f) + def wrapped(x, *args): + for ys in args: + assert ys.shape[0] == num_layers + return _LayerStackWithState( + f, num_layers, unroll=unroll, name=name)(x, *args) + else: + _check_no_varargs(f) + @functools.wraps(f) + def wrapped(*args): + ret = _LayerStackNoState( + f, num_layers, unroll=unroll, name=name)(args, None)[0] + if len(args) == 1: + # If the function takes a single argument, we must also return a + # single value, and not a tuple of length 1. + ret = ret[0] + return ret + + return wrapped + return iterate diff --git a/alphafold/alphafold/model/layer_stack_test.py b/alphafold/alphafold/model/layer_stack_test.py new file mode 100644 index 0000000000000000000000000000000000000000..062221f6b753f188475de40f3d50f53324735ffc --- /dev/null +++ b/alphafold/alphafold/model/layer_stack_test.py @@ -0,0 +1,335 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Tests for layer_stack.""" + +import functools +from absl.testing import absltest +from absl.testing import parameterized +from alphafold.model import layer_stack +import haiku as hk +import jax +import jax.numpy as jnp +import numpy as np +import scipy + + +# Suffixes applied by Haiku for repeated module names. +suffixes = [''] + [f'_{i}' for i in range(1, 100)] + + +def _slice_layers_params(layers_params): + sliced_layers_params = {} + for k, v in layers_params.items(): + for inner_k in v: + for var_slice, suffix in zip(v[inner_k], suffixes): + k_new = k.split('/')[-1] + suffix + if k_new not in sliced_layers_params: + sliced_layers_params[k_new] = {} + sliced_layers_params[k_new][inner_k] = var_slice + return sliced_layers_params + + +class LayerStackTest(parameterized.TestCase): + + @parameterized.parameters([1, 2, 4]) + def test_layer_stack(self, unroll): + """Compare layer_stack to the equivalent unrolled stack. + + Tests that the layer_stack application of a Haiku layer function is + equivalent to repeatedly applying the layer function in an unrolled loop. + + Args: + unroll: Number of unrolled layers. + """ + num_layers = 20 + + def inner_fn(x): + x += hk.Linear(100, name='linear1')(x) + x += hk.Linear(100, name='linear2')(x) + return x + + def outer_fn_unrolled(x): + for _ in range(num_layers): + x = inner_fn(x) + return x + + def outer_fn_layer_stack(x): + stack = layer_stack.layer_stack(num_layers, unroll=unroll)(inner_fn) + return stack(x) + + unrolled_fn = hk.transform(outer_fn_unrolled) + layer_stack_fn = hk.transform(outer_fn_layer_stack) + + x = jax.random.uniform(jax.random.PRNGKey(0), [10, 256, 100]) + + rng_init = jax.random.PRNGKey(42) + + params = layer_stack_fn.init(rng_init, x) + + sliced_params = _slice_layers_params(params) + + unrolled_pred = unrolled_fn.apply(sliced_params, None, x) + layer_stack_pred = layer_stack_fn.apply(params, None, x) + + np.testing.assert_allclose(unrolled_pred, layer_stack_pred) + + def test_layer_stack_multi_args(self): + """Compare layer_stack to the equivalent unrolled stack. + + Similar to `test_layer_stack`, but use a function that takes more than one + argument. + """ + num_layers = 20 + + def inner_fn(x, y): + x_out = x + hk.Linear(100, name='linear1')(y) + y_out = y + hk.Linear(100, name='linear2')(x) + return x_out, y_out + + def outer_fn_unrolled(x, y): + for _ in range(num_layers): + x, y = inner_fn(x, y) + return x, y + + def outer_fn_layer_stack(x, y): + stack = layer_stack.layer_stack(num_layers)(inner_fn) + return stack(x, y) + + unrolled_fn = hk.transform(outer_fn_unrolled) + layer_stack_fn = hk.transform(outer_fn_layer_stack) + + x = jax.random.uniform(jax.random.PRNGKey(0), [10, 256, 100]) + y = jax.random.uniform(jax.random.PRNGKey(1), [10, 256, 100]) + + rng_init = jax.random.PRNGKey(42) + + params = layer_stack_fn.init(rng_init, x, y) + + sliced_params = _slice_layers_params(params) + + unrolled_x, unrolled_y = unrolled_fn.apply(sliced_params, None, x, y) + layer_stack_x, layer_stack_y = layer_stack_fn.apply(params, None, x, y) + + np.testing.assert_allclose(unrolled_x, layer_stack_x) + np.testing.assert_allclose(unrolled_y, layer_stack_y) + + def test_layer_stack_no_varargs(self): + """Test an error is raised when using a function with varargs.""" + + class VarArgsModule(hk.Module): + """When used, this module should cause layer_stack to raise an Error.""" + + def __call__(self, *args): + return args + + class NoVarArgsModule(hk.Module): + """This module should be fine to use with layer_stack.""" + + def __call__(self, x): + return x + + def build_and_init_stack(module_class): + def stack_fn(x): + module = module_class() + return layer_stack.layer_stack(1)(module)(x) + + stack = hk.without_apply_rng(hk.transform(stack_fn)) + stack.init(jax.random.PRNGKey(1729), jnp.ones([5])) + + build_and_init_stack(NoVarArgsModule) + with self.assertRaisesRegex( + ValueError, 'The function `f` should not have any `varargs`'): + build_and_init_stack(VarArgsModule) + + @parameterized.parameters([1, 2, 4]) + def test_layer_stack_grads(self, unroll): + """Compare layer_stack gradients to the equivalent unrolled stack. + + Tests that the layer_stack application of a Haiku layer function is + equivalent to repeatedly applying the layer function in an unrolled loop. + + Args: + unroll: Number of unrolled layers. + """ + num_layers = 20 + + def inner_fn(x): + x += hk.Linear(100, name='linear1')(x) + x += hk.Linear(100, name='linear2')(x) + return x + + def outer_fn_unrolled(x): + for _ in range(num_layers): + x = inner_fn(x) + return x + + def outer_fn_layer_stack(x): + stack = layer_stack.layer_stack(num_layers, unroll=unroll)(inner_fn) + return stack(x) + + unrolled_fn = hk.transform(outer_fn_unrolled) + layer_stack_fn = hk.transform(outer_fn_layer_stack) + + x = jax.random.uniform(jax.random.PRNGKey(0), [10, 256, 100]) + + rng_init = jax.random.PRNGKey(42) + + params = layer_stack_fn.init(rng_init, x) + + sliced_params = _slice_layers_params(params) + + unrolled_grad = jax.grad( + lambda p, x: jnp.mean(unrolled_fn.apply(p, None, x)))(sliced_params, x) + layer_stack_grad = jax.grad( + lambda p, x: jnp.mean(layer_stack_fn.apply(p, None, x)))(params, x) + + assert_fn = functools.partial( + np.testing.assert_allclose, atol=1e-4, rtol=1e-4) + + jax.tree_multimap(assert_fn, unrolled_grad, + _slice_layers_params(layer_stack_grad)) + + def test_random(self): + """Random numbers should be handled correctly.""" + n = 100 + + @hk.transform + @layer_stack.layer_stack(n) + def add_random(x): + x = x + jax.random.normal(hk.next_rng_key()) + return x + + # Evaluate a bunch of times + key, *keys = jax.random.split(jax.random.PRNGKey(7), 1024 + 1) + params = add_random.init(key, 0.) + apply_fn = jax.jit(add_random.apply) + values = [apply_fn(params, key, 0.) for key in keys] + + # Should be roughly N(0, sqrt(n)) + cdf = scipy.stats.norm(scale=np.sqrt(n)).cdf + _, p = scipy.stats.kstest(values, cdf) + self.assertLess(0.3, p) + + def test_threading(self): + """Test @layer_stack when the function gets per-layer state.""" + n = 5 + + @layer_stack.layer_stack(n, with_state=True) + def f(x, y): + x = x + y * jax.nn.one_hot(y, len(x)) / 10 + return x, 2 * y + + @hk.without_apply_rng + @hk.transform + def g(x, ys): + x, zs = f(x, ys) + # Check here to catch issues at init time + self.assertEqual(zs.shape, (n,)) + return x, zs + + rng = jax.random.PRNGKey(7) + x = np.zeros(n) + ys = np.arange(n).astype(np.float32) + params = g.init(rng, x, ys) + x, zs = g.apply(params, x, ys) + self.assertTrue(np.allclose(x, [0, .1, .2, .3, .4])) + self.assertTrue(np.all(zs == 2 * ys)) + + def test_nested_stacks(self): + def stack_fn(x): + def layer_fn(x): + return hk.Linear(100)(x) + + outer_fn = layer_stack.layer_stack(10)(layer_fn) + + layer_outer = layer_stack.layer_stack(20)(outer_fn) + return layer_outer(x) + + hk_mod = hk.transform(stack_fn) + apply_rng, init_rng = jax.random.split(jax.random.PRNGKey(0)) + + params = hk_mod.init(init_rng, jnp.zeros([10, 100])) + + hk_mod.apply(params, apply_rng, jnp.zeros([10, 100])) + + p, = params.values() + + assert p['w'].shape == (10, 20, 100, 100) + assert p['b'].shape == (10, 20, 100) + + def test_with_state_multi_args(self): + """Test layer_stack with state with multiple arguments.""" + width = 4 + batch_size = 5 + stack_height = 3 + + def f_with_multi_args(x, a, b): + return hk.Linear( + width, w_init=hk.initializers.Constant( + jnp.eye(width)))(x) * a + b, None + + @hk.without_apply_rng + @hk.transform + def hk_fn(x): + return layer_stack.layer_stack( + stack_height, + with_state=True)(f_with_multi_args)(x, jnp.full([stack_height], 2.), + jnp.ones([stack_height])) + + x = jnp.zeros([batch_size, width]) + key_seq = hk.PRNGSequence(19) + params = hk_fn.init(next(key_seq), x) + output, z = hk_fn.apply(params, x) + self.assertIsNone(z) + self.assertEqual(output.shape, (batch_size, width)) + np.testing.assert_equal(output, np.full([batch_size, width], 7.)) + + def test_with_container_state(self): + width = 2 + batch_size = 2 + stack_height = 3 + + def f_with_container_state(x): + hk_layer = hk.Linear( + width, w_init=hk.initializers.Constant(jnp.eye(width))) + layer_output = hk_layer(x) + layer_state = { + 'raw_output': layer_output, + 'output_projection': jnp.sum(layer_output) + } + return layer_output + jnp.ones_like(layer_output), layer_state + + @hk.without_apply_rng + @hk.transform + def hk_fn(x): + return layer_stack.layer_stack( + stack_height, + with_state=True)(f_with_container_state)(x) + + x = jnp.zeros([batch_size, width]) + key_seq = hk.PRNGSequence(19) + params = hk_fn.init(next(key_seq), x) + output, z = hk_fn.apply(params, x) + self.assertEqual(z['raw_output'].shape, (stack_height, batch_size, width)) + self.assertEqual(output.shape, (batch_size, width)) + self.assertEqual(z['output_projection'].shape, (stack_height,)) + np.testing.assert_equal(np.sum(z['output_projection']), np.array(12.)) + np.testing.assert_equal( + np.all(z['raw_output'] == np.array([0., 1., 2.])[..., None, None]), + np.array(True)) + + +if __name__ == '__main__': + absltest.main() diff --git a/alphafold/alphafold/model/lddt.py b/alphafold/alphafold/model/lddt.py new file mode 100644 index 0000000000000000000000000000000000000000..6b2a3f9c9c427b8da547cabf75ff48a7b9fc1844 --- /dev/null +++ b/alphafold/alphafold/model/lddt.py @@ -0,0 +1,88 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""lDDT protein distance score.""" +import jax.numpy as jnp + + +def lddt(predicted_points, + true_points, + true_points_mask, + cutoff=15., + per_residue=False): + """Measure (approximate) lDDT for a batch of coordinates. + + lDDT reference: + Mariani, V., Biasini, M., Barbato, A. & Schwede, T. lDDT: A local + superposition-free score for comparing protein structures and models using + distance difference tests. Bioinformatics 29, 2722–2728 (2013). + + lDDT is a measure of the difference between the true distance matrix and the + distance matrix of the predicted points. The difference is computed only on + points closer than cutoff *in the true structure*. + + This function does not compute the exact lDDT value that the original paper + describes because it does not include terms for physical feasibility + (e.g. bond length violations). Therefore this is only an approximate + lDDT score. + + Args: + predicted_points: (batch, length, 3) array of predicted 3D points + true_points: (batch, length, 3) array of true 3D points + true_points_mask: (batch, length, 1) binary-valued float array. This mask + should be 1 for points that exist in the true points. + cutoff: Maximum distance for a pair of points to be included + per_residue: If true, return score for each residue. Note that the overall + lDDT is not exactly the mean of the per_residue lDDT's because some + residues have more contacts than others. + + Returns: + An (approximate, see above) lDDT score in the range 0-1. + """ + + assert len(predicted_points.shape) == 3 + assert predicted_points.shape[-1] == 3 + assert true_points_mask.shape[-1] == 1 + assert len(true_points_mask.shape) == 3 + + # Compute true and predicted distance matrices. + dmat_true = jnp.sqrt(1e-10 + jnp.sum( + (true_points[:, :, None] - true_points[:, None, :])**2, axis=-1)) + + dmat_predicted = jnp.sqrt(1e-10 + jnp.sum( + (predicted_points[:, :, None] - + predicted_points[:, None, :])**2, axis=-1)) + + dists_to_score = ( + (dmat_true < cutoff).astype(jnp.float32) * true_points_mask * + jnp.transpose(true_points_mask, [0, 2, 1]) * + (1. - jnp.eye(dmat_true.shape[1])) # Exclude self-interaction. + ) + + # Shift unscored distances to be far away. + dist_l1 = jnp.abs(dmat_true - dmat_predicted) + + # True lDDT uses a number of fixed bins. + # We ignore the physical plausibility correction to lDDT, though. + score = 0.25 * ((dist_l1 < 0.5).astype(jnp.float32) + + (dist_l1 < 1.0).astype(jnp.float32) + + (dist_l1 < 2.0).astype(jnp.float32) + + (dist_l1 < 4.0).astype(jnp.float32)) + + # Normalize over the appropriate axes. + reduce_axes = (-1,) if per_residue else (-2, -1) + norm = 1. / (1e-10 + jnp.sum(dists_to_score, axis=reduce_axes)) + score = norm * (1e-10 + jnp.sum(dists_to_score * score, axis=reduce_axes)) + + return score diff --git a/alphafold/alphafold/model/lddt_test.py b/alphafold/alphafold/model/lddt_test.py new file mode 100644 index 0000000000000000000000000000000000000000..8b4f050f05e3c786987d0151de0acb0ec2c54fee --- /dev/null +++ b/alphafold/alphafold/model/lddt_test.py @@ -0,0 +1,79 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Tests for lddt.""" + +from absl.testing import absltest +from absl.testing import parameterized +from alphafold.model import lddt +import numpy as np + + +class LddtTest(parameterized.TestCase, absltest.TestCase): + + @parameterized.named_parameters( + ('same', + [[0, 0, 0], [5, 0, 0], [10, 0, 0]], + [[0, 0, 0], [5, 0, 0], [10, 0, 0]], + [1, 1, 1]), + ('all_shifted', + [[0, 0, 0], [5, 0, 0], [10, 0, 0]], + [[-1, 0, 0], [4, 0, 0], [9, 0, 0]], + [1, 1, 1]), + ('all_rotated', + [[0, 0, 0], [5, 0, 0], [10, 0, 0]], + [[0, 0, 0], [0, 5, 0], [0, 10, 0]], + [1, 1, 1]), + ('half_a_dist', + [[0, 0, 0], [5, 0, 0]], + [[0, 0, 0], [5.5-1e-5, 0, 0]], + [1, 1]), + ('one_a_dist', + [[0, 0, 0], [5, 0, 0]], + [[0, 0, 0], [6-1e-5, 0, 0]], + [0.75, 0.75]), + ('two_a_dist', + [[0, 0, 0], [5, 0, 0]], + [[0, 0, 0], [7-1e-5, 0, 0]], + [0.5, 0.5]), + ('four_a_dist', + [[0, 0, 0], [5, 0, 0]], + [[0, 0, 0], [9-1e-5, 0, 0]], + [0.25, 0.25],), + ('five_a_dist', + [[0, 0, 0], [16-1e-5, 0, 0]], + [[0, 0, 0], [11, 0, 0]], + [0, 0]), + ('no_pairs', + [[0, 0, 0], [20, 0, 0]], + [[0, 0, 0], [25-1e-5, 0, 0]], + [1, 1]), + ) + def test_lddt( + self, predicted_pos, true_pos, exp_lddt): + predicted_pos = np.array([predicted_pos], dtype=np.float32) + true_points_mask = np.array([[[1]] * len(true_pos)], dtype=np.float32) + true_pos = np.array([true_pos], dtype=np.float32) + cutoff = 15.0 + per_residue = True + + result = lddt.lddt( + predicted_pos, true_pos, true_points_mask, cutoff, + per_residue) + + np.testing.assert_almost_equal(result, [exp_lddt], decimal=4) + + +if __name__ == '__main__': + absltest.main() diff --git a/alphafold/alphafold/model/mapping.py b/alphafold/alphafold/model/mapping.py new file mode 100644 index 0000000000000000000000000000000000000000..e6c0fd85e3f6c71b48592d9a65507b71843dc1ed --- /dev/null +++ b/alphafold/alphafold/model/mapping.py @@ -0,0 +1,218 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Specialized mapping functions.""" + +import functools + +from typing import Any, Callable, Optional, Sequence, Union + +import haiku as hk +import jax +import jax.numpy as jnp + + +PYTREE = Any +PYTREE_JAX_ARRAY = Any + +partial = functools.partial +PROXY = object() + + +def _maybe_slice(array, i, slice_size, axis): + if axis is PROXY: + return array + else: + return jax.lax.dynamic_slice_in_dim( + array, i, slice_size=slice_size, axis=axis) + + +def _maybe_get_size(array, axis): + if axis == PROXY: + return -1 + else: + return array.shape[axis] + + +def _expand_axes(axes, values, name='sharded_apply'): + values_tree_def = jax.tree_flatten(values)[1] + flat_axes = jax.api_util.flatten_axes(name, values_tree_def, axes) + # Replace None's with PROXY + flat_axes = [PROXY if x is None else x for x in flat_axes] + return jax.tree_unflatten(values_tree_def, flat_axes) + + +def sharded_map( + fun: Callable[..., PYTREE_JAX_ARRAY], + shard_size: Union[int, None] = 1, + in_axes: Union[int, PYTREE] = 0, + out_axes: Union[int, PYTREE] = 0) -> Callable[..., PYTREE_JAX_ARRAY]: + """Sharded vmap. + + Maps `fun` over axes, in a way similar to vmap, but does so in shards of + `shard_size`. This allows a smooth trade-off between memory usage + (as in a plain map) vs higher throughput (as in a vmap). + + Args: + fun: Function to apply smap transform to. + shard_size: Integer denoting shard size. + in_axes: Either integer or pytree describing which axis to map over for each + input to `fun`, None denotes broadcasting. + out_axes: integer or pytree denoting to what axis in the output the mapped + over axis maps. + + Returns: + function with smap applied. + """ + vmapped_fun = hk.vmap(fun, in_axes, out_axes) + return sharded_apply(vmapped_fun, shard_size, in_axes, out_axes) + + +def sharded_apply( + fun: Callable[..., PYTREE_JAX_ARRAY], # pylint: disable=g-bare-generic + shard_size: Union[int, None] = 1, + in_axes: Union[int, PYTREE] = 0, + out_axes: Union[int, PYTREE] = 0, + new_out_axes: bool = False) -> Callable[..., PYTREE_JAX_ARRAY]: + """Sharded apply. + + Applies `fun` over shards to axes, in a way similar to vmap, + but does so in shards of `shard_size`. Shards are stacked after. + This allows a smooth trade-off between + memory usage (as in a plain map) vs higher throughput (as in a vmap). + + Args: + fun: Function to apply smap transform to. + shard_size: Integer denoting shard size. + in_axes: Either integer or pytree describing which axis to map over for each + input to `fun`, None denotes broadcasting. + out_axes: integer or pytree denoting to what axis in the output the mapped + over axis maps. + new_out_axes: whether to stack outputs on new axes. This assumes that the + output sizes for each shard (including the possible remainder shard) are + the same. + + Returns: + function with smap applied. + """ + docstr = ('Mapped version of {fun}. Takes similar arguments to {fun} ' + 'but with additional array axes over which {fun} is mapped.') + if new_out_axes: + raise NotImplementedError('New output axes not yet implemented.') + + # shard size None denotes no sharding + if shard_size is None: + return fun + + @jax.util.wraps(fun, docstr=docstr) + def mapped_fn(*args): + # Expand in axes and Determine Loop range + in_axes_ = _expand_axes(in_axes, args) + + in_sizes = jax.tree_multimap(_maybe_get_size, args, in_axes_) + flat_sizes = jax.tree_flatten(in_sizes)[0] + in_size = max(flat_sizes) + assert all(i in {in_size, -1} for i in flat_sizes) + + num_extra_shards = (in_size - 1) // shard_size + + # Fix Up if necessary + last_shard_size = in_size % shard_size + last_shard_size = shard_size if last_shard_size == 0 else last_shard_size + + def apply_fun_to_slice(slice_start, slice_size): + input_slice = jax.tree_multimap( + lambda array, axis: _maybe_slice(array, slice_start, slice_size, axis + ), args, in_axes_) + return fun(*input_slice) + + remainder_shape_dtype = hk.eval_shape( + partial(apply_fun_to_slice, 0, last_shard_size)) + out_dtypes = jax.tree_map(lambda x: x.dtype, remainder_shape_dtype) + out_shapes = jax.tree_map(lambda x: x.shape, remainder_shape_dtype) + out_axes_ = _expand_axes(out_axes, remainder_shape_dtype) + + if num_extra_shards > 0: + regular_shard_shape_dtype = hk.eval_shape( + partial(apply_fun_to_slice, 0, shard_size)) + shard_shapes = jax.tree_map(lambda x: x.shape, regular_shard_shape_dtype) + + def make_output_shape(axis, shard_shape, remainder_shape): + return shard_shape[:axis] + ( + shard_shape[axis] * num_extra_shards + + remainder_shape[axis],) + shard_shape[axis + 1:] + + out_shapes = jax.tree_multimap(make_output_shape, out_axes_, shard_shapes, + out_shapes) + + # Calls dynamic Update slice with different argument order + # This is here since tree_multimap only works with positional arguments + def dynamic_update_slice_in_dim(full_array, update, axis, i): + return jax.lax.dynamic_update_slice_in_dim(full_array, update, i, axis) + + def compute_shard(outputs, slice_start, slice_size): + slice_out = apply_fun_to_slice(slice_start, slice_size) + update_slice = partial( + dynamic_update_slice_in_dim, i=slice_start) + return jax.tree_multimap(update_slice, outputs, slice_out, out_axes_) + + def scan_iteration(outputs, i): + new_outputs = compute_shard(outputs, i, shard_size) + return new_outputs, () + + slice_starts = jnp.arange(0, in_size - shard_size + 1, shard_size) + + def allocate_buffer(dtype, shape): + return jnp.zeros(shape, dtype=dtype) + + outputs = jax.tree_multimap(allocate_buffer, out_dtypes, out_shapes) + + if slice_starts.shape[0] > 0: + outputs, _ = hk.scan(scan_iteration, outputs, slice_starts) + + if last_shard_size != shard_size: + remainder_start = in_size - last_shard_size + outputs = compute_shard(outputs, remainder_start, last_shard_size) + + return outputs + + return mapped_fn + + +def inference_subbatch( + module: Callable[..., PYTREE_JAX_ARRAY], + subbatch_size: int, + batched_args: Sequence[PYTREE_JAX_ARRAY], + nonbatched_args: Sequence[PYTREE_JAX_ARRAY], + low_memory: bool = True, + input_subbatch_dim: int = 0, + output_subbatch_dim: Optional[int] = None) -> PYTREE_JAX_ARRAY: + """Run through subbatches (like batch apply but with split and concat).""" + assert len(batched_args) > 0 # pylint: disable=g-explicit-length-test + + if not low_memory: + args = list(batched_args) + list(nonbatched_args) + return module(*args) + + if output_subbatch_dim is None: + output_subbatch_dim = input_subbatch_dim + + def run_module(*batched_args): + args = list(batched_args) + list(nonbatched_args) + return module(*args) + sharded_module = sharded_apply(run_module, + shard_size=subbatch_size, + in_axes=input_subbatch_dim, + out_axes=output_subbatch_dim) + return sharded_module(*batched_args) diff --git a/alphafold/alphafold/model/model.py b/alphafold/alphafold/model/model.py new file mode 100644 index 0000000000000000000000000000000000000000..66addeb6e7ac27a109775e2cac43d1724b5a6fb2 --- /dev/null +++ b/alphafold/alphafold/model/model.py @@ -0,0 +1,141 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Code for constructing the model.""" +from typing import Any, Mapping, Optional, Union + +from absl import logging +from alphafold.common import confidence +from alphafold.model import features +from alphafold.model import modules +import haiku as hk +import jax +import ml_collections +import numpy as np +import tensorflow.compat.v1 as tf +import tree + + +def get_confidence_metrics( + prediction_result: Mapping[str, Any]) -> Mapping[str, Any]: + """Post processes prediction_result to get confidence metrics.""" + + confidence_metrics = {} + confidence_metrics['plddt'] = confidence.compute_plddt( + prediction_result['predicted_lddt']['logits']) + if 'predicted_aligned_error' in prediction_result: + confidence_metrics.update(confidence.compute_predicted_aligned_error( + prediction_result['predicted_aligned_error']['logits'], + prediction_result['predicted_aligned_error']['breaks'])) + confidence_metrics['ptm'] = confidence.predicted_tm_score( + prediction_result['predicted_aligned_error']['logits'], + prediction_result['predicted_aligned_error']['breaks']) + + return confidence_metrics + + +class RunModel: + """Container for JAX model.""" + + def __init__(self, + config: ml_collections.ConfigDict, + params: Optional[Mapping[str, Mapping[str, np.ndarray]]] = None): + self.config = config + self.params = params + + def _forward_fn(batch): + model = modules.AlphaFold(self.config.model) + return model( + batch, + is_training=False, + compute_loss=False, + ensemble_representations=True) + + self.apply = jax.jit(hk.transform(_forward_fn).apply) + self.init = jax.jit(hk.transform(_forward_fn).init) + + def init_params(self, feat: features.FeatureDict, random_seed: int = 0): + """Initializes the model parameters. + + If none were provided when this class was instantiated then the parameters + are randomly initialized. + + Args: + feat: A dictionary of NumPy feature arrays as output by + RunModel.process_features. + random_seed: A random seed to use to initialize the parameters if none + were set when this class was initialized. + """ + if not self.params: + # Init params randomly. + rng = jax.random.PRNGKey(random_seed) + self.params = hk.data_structures.to_mutable_dict( + self.init(rng, feat)) + logging.warning('Initialized parameters randomly') + + def process_features( + self, + raw_features: Union[tf.train.Example, features.FeatureDict], + random_seed: int) -> features.FeatureDict: + """Processes features to prepare for feeding them into the model. + + Args: + raw_features: The output of the data pipeline either as a dict of NumPy + arrays or as a tf.train.Example. + random_seed: The random seed to use when processing the features. + + Returns: + A dict of NumPy feature arrays suitable for feeding into the model. + """ + if isinstance(raw_features, dict): + return features.np_example_to_features( + np_example=raw_features, + config=self.config, + random_seed=random_seed) + else: + return features.tf_example_to_features( + tf_example=raw_features, + config=self.config, + random_seed=random_seed) + + def eval_shape(self, feat: features.FeatureDict) -> jax.ShapeDtypeStruct: + self.init_params(feat) + logging.info('Running eval_shape with shape(feat) = %s', + tree.map_structure(lambda x: x.shape, feat)) + shape = jax.eval_shape(self.apply, self.params, jax.random.PRNGKey(0), feat) + logging.info('Output shape was %s', shape) + return shape + + def predict(self, feat: features.FeatureDict) -> Mapping[str, Any]: + """Makes a prediction by inferencing the model on the provided features. + + Args: + feat: A dictionary of NumPy feature arrays as output by + RunModel.process_features. + + Returns: + A dictionary of model outputs. + """ + self.init_params(feat) + logging.info('Running predict with shape(feat) = %s', + tree.map_structure(lambda x: x.shape, feat)) + result = self.apply(self.params, jax.random.PRNGKey(0), feat) + # This block is to ensure benchmark timings are accurate. Some blocking is + # already happening when computing get_confidence_metrics, and this ensures + # all outputs are blocked on. + jax.tree_map(lambda x: x.block_until_ready(), result) + result.update(get_confidence_metrics(result)) + logging.info('Output shape was %s', + tree.map_structure(lambda x: x.shape, result)) + return result diff --git a/alphafold/alphafold/model/modules.py b/alphafold/alphafold/model/modules.py new file mode 100644 index 0000000000000000000000000000000000000000..794597ff17d416bb232d1a378c064d0ae9860836 --- /dev/null +++ b/alphafold/alphafold/model/modules.py @@ -0,0 +1,2091 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Modules and code used in the core part of AlphaFold. + +The structure generation code is in 'folding.py'. +""" +import functools +from alphafold.common import residue_constants +from alphafold.model import all_atom +from alphafold.model import common_modules +from alphafold.model import folding +from alphafold.model import layer_stack +from alphafold.model import lddt +from alphafold.model import mapping +from alphafold.model import prng +from alphafold.model import quat_affine +from alphafold.model import utils +import haiku as hk +import jax +import jax.numpy as jnp + + +def softmax_cross_entropy(logits, labels): + """Computes softmax cross entropy given logits and one-hot class labels.""" + loss = -jnp.sum(labels * jax.nn.log_softmax(logits), axis=-1) + return jnp.asarray(loss) + + +def sigmoid_cross_entropy(logits, labels): + """Computes sigmoid cross entropy given logits and multiple class labels.""" + log_p = jax.nn.log_sigmoid(logits) + # log(1 - sigmoid(x)) = log_sigmoid(-x), the latter is more numerically stable + log_not_p = jax.nn.log_sigmoid(-logits) + loss = -labels * log_p - (1. - labels) * log_not_p + return jnp.asarray(loss) + + +def apply_dropout(*, tensor, safe_key, rate, is_training, broadcast_dim=None): + """Applies dropout to a tensor.""" + if is_training and rate != 0.0: + shape = list(tensor.shape) + if broadcast_dim is not None: + shape[broadcast_dim] = 1 + keep_rate = 1.0 - rate + keep = jax.random.bernoulli(safe_key.get(), keep_rate, shape=shape) + return keep * tensor / keep_rate + else: + return tensor + + +def dropout_wrapper(module, + input_act, + mask, + safe_key, + global_config, + output_act=None, + is_training=True, + **kwargs): + """Applies module + dropout + residual update.""" + if output_act is None: + output_act = input_act + + gc = global_config + residual = module(input_act, mask, is_training=is_training, **kwargs) + dropout_rate = 0.0 if gc.deterministic else module.config.dropout_rate + + if module.config.shared_dropout: + if module.config.orientation == 'per_row': + broadcast_dim = 0 + else: + broadcast_dim = 1 + else: + broadcast_dim = None + + residual = apply_dropout(tensor=residual, + safe_key=safe_key, + rate=dropout_rate, + is_training=is_training, + broadcast_dim=broadcast_dim) + + new_act = output_act + residual + + return new_act + + +def create_extra_msa_feature(batch): + """Expand extra_msa into 1hot and concat with other extra msa features. + + We do this as late as possible as the one_hot extra msa can be very large. + + Arguments: + batch: a dictionary with the following keys: + * 'extra_msa': [N_extra_seq, N_res] MSA that wasn't selected as a cluster + centre. Note, that this is not one-hot encoded. + * 'extra_has_deletion': [N_extra_seq, N_res] Whether there is a deletion to + the left of each position in the extra MSA. + * 'extra_deletion_value': [N_extra_seq, N_res] The number of deletions to + the left of each position in the extra MSA. + + Returns: + Concatenated tensor of extra MSA features. + """ + # 23 = 20 amino acids + 'X' for unknown + gap + bert mask + msa_1hot = jax.nn.one_hot(batch['extra_msa'], 23) + msa_feat = [msa_1hot, + jnp.expand_dims(batch['extra_has_deletion'], axis=-1), + jnp.expand_dims(batch['extra_deletion_value'], axis=-1)] + return jnp.concatenate(msa_feat, axis=-1) + + +class AlphaFoldIteration(hk.Module): + """A single recycling iteration of AlphaFold architecture. + + Computes ensembled (averaged) representations from the provided features. + These representations are then passed to the various heads + that have been requested by the configuration file. Each head also returns a + loss which is combined as a weighted sum to produce the total loss. + + Jumper et al. (2021) Suppl. Alg. 2 "Inference" lines 3-22 + """ + + def __init__(self, config, global_config, name='alphafold_iteration'): + super().__init__(name=name) + self.config = config + self.global_config = global_config + + def __call__(self, + ensembled_batch, + non_ensembled_batch, + is_training, + compute_loss=False, + ensemble_representations=False, + return_representations=False): + + num_ensemble = jnp.asarray(ensembled_batch['seq_length'].shape[0]) + + if not ensemble_representations: + assert ensembled_batch['seq_length'].shape[0] == 1 + + def slice_batch(i): + b = {k: v[i] for k, v in ensembled_batch.items()} + b.update(non_ensembled_batch) + return b + + # Compute representations for each batch element and average. + evoformer_module = EmbeddingsAndEvoformer( + self.config.embeddings_and_evoformer, self.global_config) + batch0 = slice_batch(0) + representations = evoformer_module(batch0, is_training) + + # MSA representations are not ensembled so + # we don't pass tensor into the loop. + msa_representation = representations['msa'] + del representations['msa'] + + # Average the representations (except MSA) over the batch dimension. + if ensemble_representations: + def body(x): + """Add one element to the representations ensemble.""" + i, current_representations = x + feats = slice_batch(i) + representations_update = evoformer_module( + feats, is_training) + + new_representations = {} + for k in current_representations: + new_representations[k] = ( + current_representations[k] + representations_update[k]) + return i+1, new_representations + + if hk.running_init(): + # When initializing the Haiku module, run one iteration of the + # while_loop to initialize the Haiku modules used in `body`. + _, representations = body((1, representations)) + else: + _, representations = hk.while_loop( + lambda x: x[0] < num_ensemble, + body, + (1, representations)) + + for k in representations: + if k != 'msa': + representations[k] /= num_ensemble.astype(representations[k].dtype) + + representations['msa'] = msa_representation + batch = batch0 # We are not ensembled from here on. + + heads = {} + for head_name, head_config in sorted(self.config.heads.items()): + if not head_config.weight: + continue # Do not instantiate zero-weight heads. + + head_factory = { + 'masked_msa': MaskedMsaHead, + 'distogram': DistogramHead, + 'structure_module': functools.partial( + folding.StructureModule, compute_loss=compute_loss), + 'predicted_lddt': PredictedLDDTHead, + 'predicted_aligned_error': PredictedAlignedErrorHead, + 'experimentally_resolved': ExperimentallyResolvedHead, + }[head_name] + heads[head_name] = (head_config, + head_factory(head_config, self.global_config)) + + total_loss = 0. + ret = {} + ret['representations'] = representations + + def loss(module, head_config, ret, name, filter_ret=True): + if filter_ret: + value = ret[name] + else: + value = ret + loss_output = module.loss(value, batch) + ret[name].update(loss_output) + loss = head_config.weight * ret[name]['loss'] + return loss + + for name, (head_config, module) in heads.items(): + # Skip PredictedLDDTHead and PredictedAlignedErrorHead until + # StructureModule is executed. + if name in ('predicted_lddt', 'predicted_aligned_error'): + continue + else: + ret[name] = module(representations, batch, is_training) + if 'representations' in ret[name]: + # Extra representations from the head. Used by the structure module + # to provide activations for the PredictedLDDTHead. + representations.update(ret[name].pop('representations')) + if compute_loss: + total_loss += loss(module, head_config, ret, name) + + if self.config.heads.get('predicted_lddt.weight', 0.0): + # Add PredictedLDDTHead after StructureModule executes. + name = 'predicted_lddt' + # Feed all previous results to give access to structure_module result. + head_config, module = heads[name] + ret[name] = module(representations, batch, is_training) + if compute_loss: + total_loss += loss(module, head_config, ret, name, filter_ret=False) + + if ('predicted_aligned_error' in self.config.heads + and self.config.heads.get('predicted_aligned_error.weight', 0.0)): + # Add PredictedAlignedErrorHead after StructureModule executes. + name = 'predicted_aligned_error' + # Feed all previous results to give access to structure_module result. + head_config, module = heads[name] + ret[name] = module(representations, batch, is_training) + if compute_loss: + total_loss += loss(module, head_config, ret, name, filter_ret=False) + + if compute_loss: + return ret, total_loss + else: + return ret + + +class AlphaFold(hk.Module): + """AlphaFold model with recycling. + + Jumper et al. (2021) Suppl. Alg. 2 "Inference" + """ + + def __init__(self, config, name='alphafold'): + super().__init__(name=name) + self.config = config + self.global_config = config.global_config + + def __call__( + self, + batch, + is_training, + compute_loss=False, + ensemble_representations=False, + return_representations=False): + """Run the AlphaFold model. + + Arguments: + batch: Dictionary with inputs to the AlphaFold model. + is_training: Whether the system is in training or inference mode. + compute_loss: Whether to compute losses (requires extra features + to be present in the batch and knowing the true structure). + ensemble_representations: Whether to use ensembling of representations. + return_representations: Whether to also return the intermediate + representations. + + Returns: + When compute_loss is True: + a tuple of loss and output of AlphaFoldIteration. + When compute_loss is False: + just output of AlphaFoldIteration. + + The output of AlphaFoldIteration is a nested dictionary containing + predictions from the various heads. + """ + + impl = AlphaFoldIteration(self.config, self.global_config) + batch_size, num_residues = batch['aatype'].shape + + def get_prev(ret): + new_prev = { + 'prev_pos': + ret['structure_module']['final_atom_positions'], + 'prev_msa_first_row': ret['representations']['msa_first_row'], + 'prev_pair': ret['representations']['pair'], + } + return jax.tree_map(jax.lax.stop_gradient, new_prev) + + def do_call(prev, + recycle_idx, + compute_loss=compute_loss): + if self.config.resample_msa_in_recycling: + num_ensemble = batch_size // (self.config.num_recycle + 1) + def slice_recycle_idx(x): + start = recycle_idx * num_ensemble + size = num_ensemble + return jax.lax.dynamic_slice_in_dim(x, start, size, axis=0) + ensembled_batch = jax.tree_map(slice_recycle_idx, batch) + else: + num_ensemble = batch_size + ensembled_batch = batch + + non_ensembled_batch = jax.tree_map(lambda x: x, prev) + + return impl( + ensembled_batch=ensembled_batch, + non_ensembled_batch=non_ensembled_batch, + is_training=is_training, + compute_loss=compute_loss, + ensemble_representations=ensemble_representations) + + if self.config.num_recycle: + emb_config = self.config.embeddings_and_evoformer + prev = { + 'prev_pos': jnp.zeros( + [num_residues, residue_constants.atom_type_num, 3]), + 'prev_msa_first_row': jnp.zeros( + [num_residues, emb_config.msa_channel]), + 'prev_pair': jnp.zeros( + [num_residues, num_residues, emb_config.pair_channel]), + } + + if 'num_iter_recycling' in batch: + # Training time: num_iter_recycling is in batch. + # The value for each ensemble batch is the same, so arbitrarily taking + # 0-th. + num_iter = batch['num_iter_recycling'][0] + + # Add insurance that we will not run more + # recyclings than the model is configured to run. + num_iter = jnp.minimum(num_iter, self.config.num_recycle) + else: + # Eval mode or tests: use the maximum number of iterations. + num_iter = self.config.num_recycle + + body = lambda x: (x[0] + 1, # pylint: disable=g-long-lambda + get_prev(do_call(x[1], recycle_idx=x[0], + compute_loss=False))) + if hk.running_init(): + # When initializing the Haiku module, run one iteration of the + # while_loop to initialize the Haiku modules used in `body`. + _, prev = body((0, prev)) + else: + _, prev = hk.while_loop( + lambda x: x[0] < num_iter, + body, + (0, prev)) + else: + prev = {} + num_iter = 0 + + ret = do_call(prev=prev, recycle_idx=num_iter) + if compute_loss: + ret = ret[0], [ret[1]] + + if not return_representations: + del (ret[0] if compute_loss else ret)['representations'] # pytype: disable=unsupported-operands + return ret + + +class TemplatePairStack(hk.Module): + """Pair stack for the templates. + + Jumper et al. (2021) Suppl. Alg. 16 "TemplatePairStack" + """ + + def __init__(self, config, global_config, name='template_pair_stack'): + super().__init__(name=name) + self.config = config + self.global_config = global_config + + def __call__(self, pair_act, pair_mask, is_training, safe_key=None): + """Builds TemplatePairStack module. + + Arguments: + pair_act: Pair activations for single template, shape [N_res, N_res, c_t]. + pair_mask: Pair mask, shape [N_res, N_res]. + is_training: Whether the module is in training mode. + safe_key: Safe key object encapsulating the random number generation key. + + Returns: + Updated pair_act, shape [N_res, N_res, c_t]. + """ + + if safe_key is None: + safe_key = prng.SafeKey(hk.next_rng_key()) + + gc = self.global_config + c = self.config + + if not c.num_block: + return pair_act + + def block(x): + """One block of the template pair stack.""" + pair_act, safe_key = x + + dropout_wrapper_fn = functools.partial( + dropout_wrapper, is_training=is_training, global_config=gc) + + safe_key, *sub_keys = safe_key.split(6) + sub_keys = iter(sub_keys) + + pair_act = dropout_wrapper_fn( + TriangleAttention(c.triangle_attention_starting_node, gc, + name='triangle_attention_starting_node'), + pair_act, + pair_mask, + next(sub_keys)) + pair_act = dropout_wrapper_fn( + TriangleAttention(c.triangle_attention_ending_node, gc, + name='triangle_attention_ending_node'), + pair_act, + pair_mask, + next(sub_keys)) + pair_act = dropout_wrapper_fn( + TriangleMultiplication(c.triangle_multiplication_outgoing, gc, + name='triangle_multiplication_outgoing'), + pair_act, + pair_mask, + next(sub_keys)) + pair_act = dropout_wrapper_fn( + TriangleMultiplication(c.triangle_multiplication_incoming, gc, + name='triangle_multiplication_incoming'), + pair_act, + pair_mask, + next(sub_keys)) + pair_act = dropout_wrapper_fn( + Transition(c.pair_transition, gc, name='pair_transition'), + pair_act, + pair_mask, + next(sub_keys)) + + return pair_act, safe_key + + if gc.use_remat: + block = hk.remat(block) + + res_stack = layer_stack.layer_stack(c.num_block)(block) + pair_act, safe_key = res_stack((pair_act, safe_key)) + return pair_act + + +class Transition(hk.Module): + """Transition layer. + + Jumper et al. (2021) Suppl. Alg. 9 "MSATransition" + Jumper et al. (2021) Suppl. Alg. 15 "PairTransition" + """ + + def __init__(self, config, global_config, name='transition_block'): + super().__init__(name=name) + self.config = config + self.global_config = global_config + + def __call__(self, act, mask, is_training=True): + """Builds Transition module. + + Arguments: + act: A tensor of queries of size [batch_size, N_res, N_channel]. + mask: A tensor denoting the mask of size [batch_size, N_res]. + is_training: Whether the module is in training mode. + + Returns: + A float32 tensor of size [batch_size, N_res, N_channel]. + """ + _, _, nc = act.shape + + num_intermediate = int(nc * self.config.num_intermediate_factor) + mask = jnp.expand_dims(mask, axis=-1) + + act = hk.LayerNorm( + axis=[-1], + create_scale=True, + create_offset=True, + name='input_layer_norm')( + act) + + transition_module = hk.Sequential([ + common_modules.Linear( + num_intermediate, + initializer='relu', + name='transition1'), jax.nn.relu, + common_modules.Linear( + nc, + initializer=utils.final_init(self.global_config), + name='transition2') + ]) + + act = mapping.inference_subbatch( + transition_module, + self.global_config.subbatch_size, + batched_args=[act], + nonbatched_args=[], + low_memory=not is_training) + + return act + + +def glorot_uniform(): + return hk.initializers.VarianceScaling(scale=1.0, + mode='fan_avg', + distribution='uniform') + + +class Attention(hk.Module): + """Multihead attention.""" + + def __init__(self, config, global_config, output_dim, name='attention'): + super().__init__(name=name) + + self.config = config + self.global_config = global_config + self.output_dim = output_dim + + def __call__(self, q_data, m_data, bias, nonbatched_bias=None): + """Builds Attention module. + + Arguments: + q_data: A tensor of queries, shape [batch_size, N_queries, q_channels]. + m_data: A tensor of memories from which the keys and values are + projected, shape [batch_size, N_keys, m_channels]. + bias: A bias for the attention, shape [batch_size, N_queries, N_keys]. + nonbatched_bias: Shared bias, shape [N_queries, N_keys]. + + Returns: + A float32 tensor of shape [batch_size, N_queries, output_dim]. + """ + # Sensible default for when the config keys are missing + key_dim = self.config.get('key_dim', int(q_data.shape[-1])) + value_dim = self.config.get('value_dim', int(m_data.shape[-1])) + num_head = self.config.num_head + assert key_dim % num_head == 0 + assert value_dim % num_head == 0 + key_dim = key_dim // num_head + value_dim = value_dim // num_head + + q_weights = hk.get_parameter( + 'query_w', shape=(q_data.shape[-1], num_head, key_dim), + init=glorot_uniform()) + k_weights = hk.get_parameter( + 'key_w', shape=(m_data.shape[-1], num_head, key_dim), + init=glorot_uniform()) + v_weights = hk.get_parameter( + 'value_w', shape=(m_data.shape[-1], num_head, value_dim), + init=glorot_uniform()) + + q = jnp.einsum('bqa,ahc->bqhc', q_data, q_weights) * key_dim**(-0.5) + k = jnp.einsum('bka,ahc->bkhc', m_data, k_weights) + v = jnp.einsum('bka,ahc->bkhc', m_data, v_weights) + logits = jnp.einsum('bqhc,bkhc->bhqk', q, k) + bias + if nonbatched_bias is not None: + logits += jnp.expand_dims(nonbatched_bias, axis=0) + weights = jax.nn.softmax(logits) + weighted_avg = jnp.einsum('bhqk,bkhc->bqhc', weights, v) + + if self.global_config.zero_init: + init = hk.initializers.Constant(0.0) + else: + init = glorot_uniform() + + if self.config.gating: + gating_weights = hk.get_parameter( + 'gating_w', + shape=(q_data.shape[-1], num_head, value_dim), + init=hk.initializers.Constant(0.0)) + gating_bias = hk.get_parameter( + 'gating_b', + shape=(num_head, value_dim), + init=hk.initializers.Constant(1.0)) + + gate_values = jnp.einsum('bqc, chv->bqhv', q_data, + gating_weights) + gating_bias + + gate_values = jax.nn.sigmoid(gate_values) + + weighted_avg *= gate_values + + o_weights = hk.get_parameter( + 'output_w', shape=(num_head, value_dim, self.output_dim), + init=init) + o_bias = hk.get_parameter('output_b', shape=(self.output_dim,), + init=hk.initializers.Constant(0.0)) + + output = jnp.einsum('bqhc,hco->bqo', weighted_avg, o_weights) + o_bias + + return output + + +class GlobalAttention(hk.Module): + """Global attention. + + Jumper et al. (2021) Suppl. Alg. 19 "MSAColumnGlobalAttention" lines 2-7 + """ + + def __init__(self, config, global_config, output_dim, name='attention'): + super().__init__(name=name) + + self.config = config + self.global_config = global_config + self.output_dim = output_dim + + def __call__(self, q_data, m_data, q_mask, bias): + """Builds GlobalAttention module. + + Arguments: + q_data: A tensor of queries with size [batch_size, N_queries, + q_channels] + m_data: A tensor of memories from which the keys and values + projected. Size [batch_size, N_keys, m_channels] + q_mask: A binary mask for q_data with zeros in the padded sequence + elements and ones otherwise. Size [batch_size, N_queries, q_channels] + (or broadcastable to this shape). + bias: A bias for the attention. + + Returns: + A float32 tensor of size [batch_size, N_queries, output_dim]. + """ + # Sensible default for when the config keys are missing + key_dim = self.config.get('key_dim', int(q_data.shape[-1])) + value_dim = self.config.get('value_dim', int(m_data.shape[-1])) + num_head = self.config.num_head + assert key_dim % num_head == 0 + assert value_dim % num_head == 0 + key_dim = key_dim // num_head + value_dim = value_dim // num_head + + q_weights = hk.get_parameter( + 'query_w', shape=(q_data.shape[-1], num_head, key_dim), + init=glorot_uniform()) + k_weights = hk.get_parameter( + 'key_w', shape=(m_data.shape[-1], key_dim), + init=glorot_uniform()) + v_weights = hk.get_parameter( + 'value_w', shape=(m_data.shape[-1], value_dim), + init=glorot_uniform()) + + v = jnp.einsum('bka,ac->bkc', m_data, v_weights) + + q_avg = utils.mask_mean(q_mask, q_data, axis=1) + + q = jnp.einsum('ba,ahc->bhc', q_avg, q_weights) * key_dim**(-0.5) + k = jnp.einsum('bka,ac->bkc', m_data, k_weights) + bias = (1e9 * (q_mask[:, None, :, 0] - 1.)) + logits = jnp.einsum('bhc,bkc->bhk', q, k) + bias + weights = jax.nn.softmax(logits) + weighted_avg = jnp.einsum('bhk,bkc->bhc', weights, v) + + if self.global_config.zero_init: + init = hk.initializers.Constant(0.0) + else: + init = glorot_uniform() + + o_weights = hk.get_parameter( + 'output_w', shape=(num_head, value_dim, self.output_dim), + init=init) + o_bias = hk.get_parameter('output_b', shape=(self.output_dim,), + init=hk.initializers.Constant(0.0)) + + if self.config.gating: + gating_weights = hk.get_parameter( + 'gating_w', + shape=(q_data.shape[-1], num_head, value_dim), + init=hk.initializers.Constant(0.0)) + gating_bias = hk.get_parameter( + 'gating_b', + shape=(num_head, value_dim), + init=hk.initializers.Constant(1.0)) + + gate_values = jnp.einsum('bqc, chv->bqhv', q_data, gating_weights) + gate_values = jax.nn.sigmoid(gate_values + gating_bias) + weighted_avg = weighted_avg[:, None] * gate_values + output = jnp.einsum('bqhc,hco->bqo', weighted_avg, o_weights) + o_bias + else: + output = jnp.einsum('bhc,hco->bo', weighted_avg, o_weights) + o_bias + output = output[:, None] + return output + + +class MSARowAttentionWithPairBias(hk.Module): + """MSA per-row attention biased by the pair representation. + + Jumper et al. (2021) Suppl. Alg. 7 "MSARowAttentionWithPairBias" + """ + + def __init__(self, config, global_config, + name='msa_row_attention_with_pair_bias'): + super().__init__(name=name) + self.config = config + self.global_config = global_config + + def __call__(self, + msa_act, + msa_mask, + pair_act, + is_training=False): + """Builds MSARowAttentionWithPairBias module. + + Arguments: + msa_act: [N_seq, N_res, c_m] MSA representation. + msa_mask: [N_seq, N_res] mask of non-padded regions. + pair_act: [N_res, N_res, c_z] pair representation. + is_training: Whether the module is in training mode. + + Returns: + Update to msa_act, shape [N_seq, N_res, c_m]. + """ + c = self.config + + assert len(msa_act.shape) == 3 + assert len(msa_mask.shape) == 2 + assert c.orientation == 'per_row' + + bias = (1e9 * (msa_mask - 1.))[:, None, None, :] + assert len(bias.shape) == 4 + + msa_act = hk.LayerNorm( + axis=[-1], create_scale=True, create_offset=True, name='query_norm')( + msa_act) + + pair_act = hk.LayerNorm( + axis=[-1], + create_scale=True, + create_offset=True, + name='feat_2d_norm')( + pair_act) + + init_factor = 1. / jnp.sqrt(int(pair_act.shape[-1])) + weights = hk.get_parameter( + 'feat_2d_weights', + shape=(pair_act.shape[-1], c.num_head), + init=hk.initializers.RandomNormal(stddev=init_factor)) + nonbatched_bias = jnp.einsum('qkc,ch->hqk', pair_act, weights) + + attn_mod = Attention( + c, self.global_config, msa_act.shape[-1]) + msa_act = mapping.inference_subbatch( + attn_mod, + self.global_config.subbatch_size, + batched_args=[msa_act, msa_act, bias], + nonbatched_args=[nonbatched_bias], + low_memory=not is_training) + + return msa_act + + +class MSAColumnAttention(hk.Module): + """MSA per-column attention. + + Jumper et al. (2021) Suppl. Alg. 8 "MSAColumnAttention" + """ + + def __init__(self, config, global_config, name='msa_column_attention'): + super().__init__(name=name) + self.config = config + self.global_config = global_config + + def __call__(self, + msa_act, + msa_mask, + is_training=False): + """Builds MSAColumnAttention module. + + Arguments: + msa_act: [N_seq, N_res, c_m] MSA representation. + msa_mask: [N_seq, N_res] mask of non-padded regions. + is_training: Whether the module is in training mode. + + Returns: + Update to msa_act, shape [N_seq, N_res, c_m] + """ + c = self.config + + assert len(msa_act.shape) == 3 + assert len(msa_mask.shape) == 2 + assert c.orientation == 'per_column' + + msa_act = jnp.swapaxes(msa_act, -2, -3) + msa_mask = jnp.swapaxes(msa_mask, -1, -2) + + bias = (1e9 * (msa_mask - 1.))[:, None, None, :] + assert len(bias.shape) == 4 + + msa_act = hk.LayerNorm( + axis=[-1], create_scale=True, create_offset=True, name='query_norm')( + msa_act) + + attn_mod = Attention( + c, self.global_config, msa_act.shape[-1]) + msa_act = mapping.inference_subbatch( + attn_mod, + self.global_config.subbatch_size, + batched_args=[msa_act, msa_act, bias], + nonbatched_args=[], + low_memory=not is_training) + + msa_act = jnp.swapaxes(msa_act, -2, -3) + + return msa_act + + +class MSAColumnGlobalAttention(hk.Module): + """MSA per-column global attention. + + Jumper et al. (2021) Suppl. Alg. 19 "MSAColumnGlobalAttention" + """ + + def __init__(self, config, global_config, name='msa_column_global_attention'): + super().__init__(name=name) + self.config = config + self.global_config = global_config + + def __call__(self, + msa_act, + msa_mask, + is_training=False): + """Builds MSAColumnGlobalAttention module. + + Arguments: + msa_act: [N_seq, N_res, c_m] MSA representation. + msa_mask: [N_seq, N_res] mask of non-padded regions. + is_training: Whether the module is in training mode. + + Returns: + Update to msa_act, shape [N_seq, N_res, c_m]. + """ + c = self.config + + assert len(msa_act.shape) == 3 + assert len(msa_mask.shape) == 2 + assert c.orientation == 'per_column' + + msa_act = jnp.swapaxes(msa_act, -2, -3) + msa_mask = jnp.swapaxes(msa_mask, -1, -2) + + bias = (1e9 * (msa_mask - 1.))[:, None, None, :] + assert len(bias.shape) == 4 + + msa_act = hk.LayerNorm( + axis=[-1], create_scale=True, create_offset=True, name='query_norm')( + msa_act) + + attn_mod = GlobalAttention( + c, self.global_config, msa_act.shape[-1], + name='attention') + # [N_seq, N_res, 1] + msa_mask = jnp.expand_dims(msa_mask, axis=-1) + msa_act = mapping.inference_subbatch( + attn_mod, + self.global_config.subbatch_size, + batched_args=[msa_act, msa_act, msa_mask, bias], + nonbatched_args=[], + low_memory=not is_training) + + msa_act = jnp.swapaxes(msa_act, -2, -3) + + return msa_act + + +class TriangleAttention(hk.Module): + """Triangle Attention. + + Jumper et al. (2021) Suppl. Alg. 13 "TriangleAttentionStartingNode" + Jumper et al. (2021) Suppl. Alg. 14 "TriangleAttentionEndingNode" + """ + + def __init__(self, config, global_config, name='triangle_attention'): + super().__init__(name=name) + self.config = config + self.global_config = global_config + + def __call__(self, pair_act, pair_mask, is_training=False): + """Builds TriangleAttention module. + + Arguments: + pair_act: [N_res, N_res, c_z] pair activations tensor + pair_mask: [N_res, N_res] mask of non-padded regions in the tensor. + is_training: Whether the module is in training mode. + + Returns: + Update to pair_act, shape [N_res, N_res, c_z]. + """ + c = self.config + + assert len(pair_act.shape) == 3 + assert len(pair_mask.shape) == 2 + assert c.orientation in ['per_row', 'per_column'] + + if c.orientation == 'per_column': + pair_act = jnp.swapaxes(pair_act, -2, -3) + pair_mask = jnp.swapaxes(pair_mask, -1, -2) + + bias = (1e9 * (pair_mask - 1.))[:, None, None, :] + assert len(bias.shape) == 4 + + pair_act = hk.LayerNorm( + axis=[-1], create_scale=True, create_offset=True, name='query_norm')( + pair_act) + + init_factor = 1. / jnp.sqrt(int(pair_act.shape[-1])) + weights = hk.get_parameter( + 'feat_2d_weights', + shape=(pair_act.shape[-1], c.num_head), + init=hk.initializers.RandomNormal(stddev=init_factor)) + nonbatched_bias = jnp.einsum('qkc,ch->hqk', pair_act, weights) + + attn_mod = Attention( + c, self.global_config, pair_act.shape[-1]) + pair_act = mapping.inference_subbatch( + attn_mod, + self.global_config.subbatch_size, + batched_args=[pair_act, pair_act, bias], + nonbatched_args=[nonbatched_bias], + low_memory=not is_training) + + if c.orientation == 'per_column': + pair_act = jnp.swapaxes(pair_act, -2, -3) + + return pair_act + + +class MaskedMsaHead(hk.Module): + """Head to predict MSA at the masked locations. + + The MaskedMsaHead employs a BERT-style objective to reconstruct a masked + version of the full MSA, based on a linear projection of + the MSA representation. + Jumper et al. (2021) Suppl. Sec. 1.9.9 "Masked MSA prediction" + """ + + def __init__(self, config, global_config, name='masked_msa_head'): + super().__init__(name=name) + self.config = config + self.global_config = global_config + + def __call__(self, representations, batch, is_training): + """Builds MaskedMsaHead module. + + Arguments: + representations: Dictionary of representations, must contain: + * 'msa': MSA representation, shape [N_seq, N_res, c_m]. + batch: Batch, unused. + is_training: Whether the module is in training mode. + + Returns: + Dictionary containing: + * 'logits': logits of shape [N_seq, N_res, N_aatype] with + (unnormalized) log probabilies of predicted aatype at position. + """ + del batch + logits = common_modules.Linear( + self.config.num_output, + initializer=utils.final_init(self.global_config), + name='logits')( + representations['msa']) + return dict(logits=logits) + + def loss(self, value, batch): + errors = softmax_cross_entropy( + labels=jax.nn.one_hot(batch['true_msa'], num_classes=23), + logits=value['logits']) + loss = (jnp.sum(errors * batch['bert_mask'], axis=(-2, -1)) / + (1e-8 + jnp.sum(batch['bert_mask'], axis=(-2, -1)))) + return {'loss': loss} + + +class PredictedLDDTHead(hk.Module): + """Head to predict the per-residue LDDT to be used as a confidence measure. + + Jumper et al. (2021) Suppl. Sec. 1.9.6 "Model confidence prediction (pLDDT)" + Jumper et al. (2021) Suppl. Alg. 29 "predictPerResidueLDDT_Ca" + """ + + def __init__(self, config, global_config, name='predicted_lddt_head'): + super().__init__(name=name) + self.config = config + self.global_config = global_config + + def __call__(self, representations, batch, is_training): + """Builds ExperimentallyResolvedHead module. + + Arguments: + representations: Dictionary of representations, must contain: + * 'structure_module': Single representation from the structure module, + shape [N_res, c_s]. + batch: Batch, unused. + is_training: Whether the module is in training mode. + + Returns: + Dictionary containing : + * 'logits': logits of shape [N_res, N_bins] with + (unnormalized) log probabilies of binned predicted lDDT. + """ + act = representations['structure_module'] + + act = hk.LayerNorm( + axis=[-1], + create_scale=True, + create_offset=True, + name='input_layer_norm')( + act) + + act = common_modules.Linear( + self.config.num_channels, + initializer='relu', + name='act_0')( + act) + act = jax.nn.relu(act) + + act = common_modules.Linear( + self.config.num_channels, + initializer='relu', + name='act_1')( + act) + act = jax.nn.relu(act) + + logits = common_modules.Linear( + self.config.num_bins, + initializer=utils.final_init(self.global_config), + name='logits')( + act) + # Shape (batch_size, num_res, num_bins) + return dict(logits=logits) + + def loss(self, value, batch): + # Shape (num_res, 37, 3) + pred_all_atom_pos = value['structure_module']['final_atom_positions'] + # Shape (num_res, 37, 3) + true_all_atom_pos = batch['all_atom_positions'] + # Shape (num_res, 37) + all_atom_mask = batch['all_atom_mask'] + + # Shape (num_res,) + lddt_ca = lddt.lddt( + # Shape (batch_size, num_res, 3) + predicted_points=pred_all_atom_pos[None, :, 1, :], + # Shape (batch_size, num_res, 3) + true_points=true_all_atom_pos[None, :, 1, :], + # Shape (batch_size, num_res, 1) + true_points_mask=all_atom_mask[None, :, 1:2].astype(jnp.float32), + cutoff=15., + per_residue=True)[0] + lddt_ca = jax.lax.stop_gradient(lddt_ca) + + num_bins = self.config.num_bins + bin_index = jnp.floor(lddt_ca * num_bins).astype(jnp.int32) + + # protect against out of range for lddt_ca == 1 + bin_index = jnp.minimum(bin_index, num_bins - 1) + lddt_ca_one_hot = jax.nn.one_hot(bin_index, num_classes=num_bins) + + # Shape (num_res, num_channel) + logits = value['predicted_lddt']['logits'] + errors = softmax_cross_entropy(labels=lddt_ca_one_hot, logits=logits) + + # Shape (num_res,) + mask_ca = all_atom_mask[:, residue_constants.atom_order['CA']] + mask_ca = mask_ca.astype(jnp.float32) + loss = jnp.sum(errors * mask_ca) / (jnp.sum(mask_ca) + 1e-8) + + if self.config.filter_by_resolution: + # NMR & distillation have resolution = 0 + loss *= ((batch['resolution'] >= self.config.min_resolution) + & (batch['resolution'] <= self.config.max_resolution)).astype( + jnp.float32) + + output = {'loss': loss} + return output + + +class PredictedAlignedErrorHead(hk.Module): + """Head to predict the distance errors in the backbone alignment frames. + + Can be used to compute predicted TM-Score. + Jumper et al. (2021) Suppl. Sec. 1.9.7 "TM-score prediction" + """ + + def __init__(self, config, global_config, + name='predicted_aligned_error_head'): + super().__init__(name=name) + self.config = config + self.global_config = global_config + + def __call__(self, representations, batch, is_training): + """Builds PredictedAlignedErrorHead module. + + Arguments: + representations: Dictionary of representations, must contain: + * 'pair': pair representation, shape [N_res, N_res, c_z]. + batch: Batch, unused. + is_training: Whether the module is in training mode. + + Returns: + Dictionary containing: + * logits: logits for aligned error, shape [N_res, N_res, N_bins]. + * bin_breaks: array containing bin breaks, shape [N_bins - 1]. + """ + + act = representations['pair'] + + # Shape (num_res, num_res, num_bins) + logits = common_modules.Linear( + self.config.num_bins, + initializer=utils.final_init(self.global_config), + name='logits')(act) + # Shape (num_bins,) + breaks = jnp.linspace( + 0., self.config.max_error_bin, self.config.num_bins - 1) + return dict(logits=logits, breaks=breaks) + + def loss(self, value, batch): + # Shape (num_res, 7) + predicted_affine = quat_affine.QuatAffine.from_tensor( + value['structure_module']['final_affines']) + # Shape (num_res, 7) + true_affine = quat_affine.QuatAffine.from_tensor( + batch['backbone_affine_tensor']) + # Shape (num_res) + mask = batch['backbone_affine_mask'] + # Shape (num_res, num_res) + square_mask = mask[:, None] * mask[None, :] + num_bins = self.config.num_bins + # (1, num_bins - 1) + breaks = value['predicted_aligned_error']['breaks'] + # (1, num_bins) + logits = value['predicted_aligned_error']['logits'] + + # Compute the squared error for each alignment. + def _local_frame_points(affine): + points = [jnp.expand_dims(x, axis=-2) for x in affine.translation] + return affine.invert_point(points, extra_dims=1) + error_dist2_xyz = [ + jnp.square(a - b) + for a, b in zip(_local_frame_points(predicted_affine), + _local_frame_points(true_affine))] + error_dist2 = sum(error_dist2_xyz) + # Shape (num_res, num_res) + # First num_res are alignment frames, second num_res are the residues. + error_dist2 = jax.lax.stop_gradient(error_dist2) + + sq_breaks = jnp.square(breaks) + true_bins = jnp.sum(( + error_dist2[..., None] > sq_breaks).astype(jnp.int32), axis=-1) + + errors = softmax_cross_entropy( + labels=jax.nn.one_hot(true_bins, num_bins, axis=-1), logits=logits) + + loss = (jnp.sum(errors * square_mask, axis=(-2, -1)) / + (1e-8 + jnp.sum(square_mask, axis=(-2, -1)))) + + if self.config.filter_by_resolution: + # NMR & distillation have resolution = 0 + loss *= ((batch['resolution'] >= self.config.min_resolution) + & (batch['resolution'] <= self.config.max_resolution)).astype( + jnp.float32) + + output = {'loss': loss} + return output + + +class ExperimentallyResolvedHead(hk.Module): + """Predicts if an atom is experimentally resolved in a high-res structure. + + Only trained on high-resolution X-ray crystals & cryo-EM. + Jumper et al. (2021) Suppl. Sec. 1.9.10 '"Experimentally resolved" prediction' + """ + + def __init__(self, config, global_config, + name='experimentally_resolved_head'): + super().__init__(name=name) + self.config = config + self.global_config = global_config + + def __call__(self, representations, batch, is_training): + """Builds ExperimentallyResolvedHead module. + + Arguments: + representations: Dictionary of representations, must contain: + * 'single': Single representation, shape [N_res, c_s]. + batch: Batch, unused. + is_training: Whether the module is in training mode. + + Returns: + Dictionary containing: + * 'logits': logits of shape [N_res, 37], + log probability that an atom is resolved in atom37 representation, + can be converted to probability by applying sigmoid. + """ + logits = common_modules.Linear( + 37, # atom_exists.shape[-1] + initializer=utils.final_init(self.global_config), + name='logits')(representations['single']) + return dict(logits=logits) + + def loss(self, value, batch): + logits = value['logits'] + assert len(logits.shape) == 2 + + # Does the atom appear in the amino acid? + atom_exists = batch['atom37_atom_exists'] + # Is the atom resolved in the experiment? Subset of atom_exists, + # *except for OXT* + all_atom_mask = batch['all_atom_mask'].astype(jnp.float32) + + xent = sigmoid_cross_entropy(labels=all_atom_mask, logits=logits) + loss = jnp.sum(xent * atom_exists) / (1e-8 + jnp.sum(atom_exists)) + + if self.config.filter_by_resolution: + # NMR & distillation examples have resolution = 0. + loss *= ((batch['resolution'] >= self.config.min_resolution) + & (batch['resolution'] <= self.config.max_resolution)).astype( + jnp.float32) + + output = {'loss': loss} + return output + + +class TriangleMultiplication(hk.Module): + """Triangle multiplication layer ("outgoing" or "incoming"). + + Jumper et al. (2021) Suppl. Alg. 11 "TriangleMultiplicationOutgoing" + Jumper et al. (2021) Suppl. Alg. 12 "TriangleMultiplicationIncoming" + """ + + def __init__(self, config, global_config, name='triangle_multiplication'): + super().__init__(name=name) + self.config = config + self.global_config = global_config + + def __call__(self, act, mask, is_training=True): + """Builds TriangleMultiplication module. + + Arguments: + act: Pair activations, shape [N_res, N_res, c_z] + mask: Pair mask, shape [N_res, N_res]. + is_training: Whether the module is in training mode. + + Returns: + Outputs, same shape/type as act. + """ + del is_training + c = self.config + gc = self.global_config + + mask = mask[..., None] + + act = hk.LayerNorm(axis=[-1], create_scale=True, create_offset=True, + name='layer_norm_input')(act) + input_act = act + + left_projection = common_modules.Linear( + c.num_intermediate_channel, + name='left_projection') + left_proj_act = mask * left_projection(act) + + right_projection = common_modules.Linear( + c.num_intermediate_channel, + name='right_projection') + right_proj_act = mask * right_projection(act) + + left_gate_values = jax.nn.sigmoid(common_modules.Linear( + c.num_intermediate_channel, + bias_init=1., + initializer=utils.final_init(gc), + name='left_gate')(act)) + + right_gate_values = jax.nn.sigmoid(common_modules.Linear( + c.num_intermediate_channel, + bias_init=1., + initializer=utils.final_init(gc), + name='right_gate')(act)) + + left_proj_act *= left_gate_values + right_proj_act *= right_gate_values + + # "Outgoing" edges equation: 'ikc,jkc->ijc' + # "Incoming" edges equation: 'kjc,kic->ijc' + # Note on the Suppl. Alg. 11 & 12 notation: + # For the "outgoing" edges, a = left_proj_act and b = right_proj_act + # For the "incoming" edges, it's swapped: + # b = left_proj_act and a = right_proj_act + act = jnp.einsum(c.equation, left_proj_act, right_proj_act) + + act = hk.LayerNorm( + axis=[-1], + create_scale=True, + create_offset=True, + name='center_layer_norm')( + act) + + output_channel = int(input_act.shape[-1]) + + act = common_modules.Linear( + output_channel, + initializer=utils.final_init(gc), + name='output_projection')(act) + + gate_values = jax.nn.sigmoid(common_modules.Linear( + output_channel, + bias_init=1., + initializer=utils.final_init(gc), + name='gating_linear')(input_act)) + act *= gate_values + + return act + + +class DistogramHead(hk.Module): + """Head to predict a distogram. + + Jumper et al. (2021) Suppl. Sec. 1.9.8 "Distogram prediction" + """ + + def __init__(self, config, global_config, name='distogram_head'): + super().__init__(name=name) + self.config = config + self.global_config = global_config + + def __call__(self, representations, batch, is_training): + """Builds DistogramHead module. + + Arguments: + representations: Dictionary of representations, must contain: + * 'pair': pair representation, shape [N_res, N_res, c_z]. + batch: Batch, unused. + is_training: Whether the module is in training mode. + + Returns: + Dictionary containing: + * logits: logits for distogram, shape [N_res, N_res, N_bins]. + * bin_breaks: array containing bin breaks, shape [N_bins - 1,]. + """ + half_logits = common_modules.Linear( + self.config.num_bins, + initializer=utils.final_init(self.global_config), + name='half_logits')( + representations['pair']) + + logits = half_logits + jnp.swapaxes(half_logits, -2, -3) + breaks = jnp.linspace(self.config.first_break, self.config.last_break, + self.config.num_bins - 1) + + return dict(logits=logits, bin_edges=breaks) + + def loss(self, value, batch): + return _distogram_log_loss(value['logits'], value['bin_edges'], + batch, self.config.num_bins) + + +def _distogram_log_loss(logits, bin_edges, batch, num_bins): + """Log loss of a distogram.""" + + assert len(logits.shape) == 3 + positions = batch['pseudo_beta'] + mask = batch['pseudo_beta_mask'] + + assert positions.shape[-1] == 3 + + sq_breaks = jnp.square(bin_edges) + + dist2 = jnp.sum( + jnp.square( + jnp.expand_dims(positions, axis=-2) - + jnp.expand_dims(positions, axis=-3)), + axis=-1, + keepdims=True) + + true_bins = jnp.sum(dist2 > sq_breaks, axis=-1) + + errors = softmax_cross_entropy( + labels=jax.nn.one_hot(true_bins, num_bins), logits=logits) + + square_mask = jnp.expand_dims(mask, axis=-2) * jnp.expand_dims(mask, axis=-1) + + avg_error = ( + jnp.sum(errors * square_mask, axis=(-2, -1)) / + (1e-6 + jnp.sum(square_mask, axis=(-2, -1)))) + dist2 = dist2[..., 0] + return dict(loss=avg_error, true_dist=jnp.sqrt(1e-6 + dist2)) + + +class OuterProductMean(hk.Module): + """Computes mean outer product. + + Jumper et al. (2021) Suppl. Alg. 10 "OuterProductMean" + """ + + def __init__(self, + config, + global_config, + num_output_channel, + name='outer_product_mean'): + super().__init__(name=name) + self.global_config = global_config + self.config = config + self.num_output_channel = num_output_channel + + def __call__(self, act, mask, is_training=True): + """Builds OuterProductMean module. + + Arguments: + act: MSA representation, shape [N_seq, N_res, c_m]. + mask: MSA mask, shape [N_seq, N_res]. + is_training: Whether the module is in training mode. + + Returns: + Update to pair representation, shape [N_res, N_res, c_z]. + """ + gc = self.global_config + c = self.config + + mask = mask[..., None] + act = hk.LayerNorm([-1], True, True, name='layer_norm_input')(act) + + left_act = mask * common_modules.Linear( + c.num_outer_channel, + initializer='linear', + name='left_projection')( + act) + + right_act = mask * common_modules.Linear( + c.num_outer_channel, + initializer='linear', + name='right_projection')( + act) + + if gc.zero_init: + init_w = hk.initializers.Constant(0.0) + else: + init_w = hk.initializers.VarianceScaling(scale=2., mode='fan_in') + + output_w = hk.get_parameter( + 'output_w', + shape=(c.num_outer_channel, c.num_outer_channel, + self.num_output_channel), + init=init_w) + output_b = hk.get_parameter( + 'output_b', shape=(self.num_output_channel,), + init=hk.initializers.Constant(0.0)) + + def compute_chunk(left_act): + # This is equivalent to + # + # act = jnp.einsum('abc,ade->dceb', left_act, right_act) + # act = jnp.einsum('dceb,cef->bdf', act, output_w) + output_b + # + # but faster. + left_act = jnp.transpose(left_act, [0, 2, 1]) + act = jnp.einsum('acb,ade->dceb', left_act, right_act) + act = jnp.einsum('dceb,cef->dbf', act, output_w) + output_b + return jnp.transpose(act, [1, 0, 2]) + + act = mapping.inference_subbatch( + compute_chunk, + c.chunk_size, + batched_args=[left_act], + nonbatched_args=[], + low_memory=True, + input_subbatch_dim=1, + output_subbatch_dim=0) + + epsilon = 1e-3 + norm = jnp.einsum('abc,adc->bdc', mask, mask) + act /= epsilon + norm + + return act + + +def dgram_from_positions(positions, num_bins, min_bin, max_bin): + """Compute distogram from amino acid positions. + + Arguments: + positions: [N_res, 3] Position coordinates. + num_bins: The number of bins in the distogram. + min_bin: The left edge of the first bin. + max_bin: The left edge of the final bin. The final bin catches + everything larger than `max_bin`. + + Returns: + Distogram with the specified number of bins. + """ + + def squared_difference(x, y): + return jnp.square(x - y) + + lower_breaks = jnp.linspace(min_bin, max_bin, num_bins) + lower_breaks = jnp.square(lower_breaks) + upper_breaks = jnp.concatenate([lower_breaks[1:], + jnp.array([1e8], dtype=jnp.float32)], axis=-1) + dist2 = jnp.sum( + squared_difference( + jnp.expand_dims(positions, axis=-2), + jnp.expand_dims(positions, axis=-3)), + axis=-1, keepdims=True) + + dgram = ((dist2 > lower_breaks).astype(jnp.float32) * + (dist2 < upper_breaks).astype(jnp.float32)) + return dgram + + +def pseudo_beta_fn(aatype, all_atom_positions, all_atom_masks): + """Create pseudo beta features.""" + + is_gly = jnp.equal(aatype, residue_constants.restype_order['G']) + ca_idx = residue_constants.atom_order['CA'] + cb_idx = residue_constants.atom_order['CB'] + pseudo_beta = jnp.where( + jnp.tile(is_gly[..., None], [1] * len(is_gly.shape) + [3]), + all_atom_positions[..., ca_idx, :], + all_atom_positions[..., cb_idx, :]) + + if all_atom_masks is not None: + pseudo_beta_mask = jnp.where( + is_gly, all_atom_masks[..., ca_idx], all_atom_masks[..., cb_idx]) + pseudo_beta_mask = pseudo_beta_mask.astype(jnp.float32) + return pseudo_beta, pseudo_beta_mask + else: + return pseudo_beta + + +class EvoformerIteration(hk.Module): + """Single iteration (block) of Evoformer stack. + + Jumper et al. (2021) Suppl. Alg. 6 "EvoformerStack" lines 2-10 + """ + + def __init__(self, config, global_config, is_extra_msa, + name='evoformer_iteration'): + super().__init__(name=name) + self.config = config + self.global_config = global_config + self.is_extra_msa = is_extra_msa + + def __call__(self, activations, masks, is_training=True, safe_key=None): + """Builds EvoformerIteration module. + + Arguments: + activations: Dictionary containing activations: + * 'msa': MSA activations, shape [N_seq, N_res, c_m]. + * 'pair': pair activations, shape [N_res, N_res, c_z]. + masks: Dictionary of masks: + * 'msa': MSA mask, shape [N_seq, N_res]. + * 'pair': pair mask, shape [N_res, N_res]. + is_training: Whether the module is in training mode. + safe_key: prng.SafeKey encapsulating rng key. + + Returns: + Outputs, same shape/type as act. + """ + c = self.config + gc = self.global_config + + msa_act, pair_act = activations['msa'], activations['pair'] + + if safe_key is None: + safe_key = prng.SafeKey(hk.next_rng_key()) + + msa_mask, pair_mask = masks['msa'], masks['pair'] + + dropout_wrapper_fn = functools.partial( + dropout_wrapper, + is_training=is_training, + global_config=gc) + + safe_key, *sub_keys = safe_key.split(10) + sub_keys = iter(sub_keys) + + msa_act = dropout_wrapper_fn( + MSARowAttentionWithPairBias( + c.msa_row_attention_with_pair_bias, gc, + name='msa_row_attention_with_pair_bias'), + msa_act, + msa_mask, + safe_key=next(sub_keys), + pair_act=pair_act) + + if not self.is_extra_msa: + attn_mod = MSAColumnAttention( + c.msa_column_attention, gc, name='msa_column_attention') + else: + attn_mod = MSAColumnGlobalAttention( + c.msa_column_attention, gc, name='msa_column_global_attention') + msa_act = dropout_wrapper_fn( + attn_mod, + msa_act, + msa_mask, + safe_key=next(sub_keys)) + + msa_act = dropout_wrapper_fn( + Transition(c.msa_transition, gc, name='msa_transition'), + msa_act, + msa_mask, + safe_key=next(sub_keys)) + + pair_act = dropout_wrapper_fn( + OuterProductMean( + config=c.outer_product_mean, + global_config=self.global_config, + num_output_channel=int(pair_act.shape[-1]), + name='outer_product_mean'), + msa_act, + msa_mask, + safe_key=next(sub_keys), + output_act=pair_act) + + pair_act = dropout_wrapper_fn( + TriangleMultiplication(c.triangle_multiplication_outgoing, gc, + name='triangle_multiplication_outgoing'), + pair_act, + pair_mask, + safe_key=next(sub_keys)) + pair_act = dropout_wrapper_fn( + TriangleMultiplication(c.triangle_multiplication_incoming, gc, + name='triangle_multiplication_incoming'), + pair_act, + pair_mask, + safe_key=next(sub_keys)) + + pair_act = dropout_wrapper_fn( + TriangleAttention(c.triangle_attention_starting_node, gc, + name='triangle_attention_starting_node'), + pair_act, + pair_mask, + safe_key=next(sub_keys)) + pair_act = dropout_wrapper_fn( + TriangleAttention(c.triangle_attention_ending_node, gc, + name='triangle_attention_ending_node'), + pair_act, + pair_mask, + safe_key=next(sub_keys)) + + pair_act = dropout_wrapper_fn( + Transition(c.pair_transition, gc, name='pair_transition'), + pair_act, + pair_mask, + safe_key=next(sub_keys)) + + return {'msa': msa_act, 'pair': pair_act} + + +class EmbeddingsAndEvoformer(hk.Module): + """Embeds the input data and runs Evoformer. + + Produces the MSA, single and pair representations. + Jumper et al. (2021) Suppl. Alg. 2 "Inference" line 5-18 + """ + + def __init__(self, config, global_config, name='evoformer'): + super().__init__(name=name) + self.config = config + self.global_config = global_config + + def __call__(self, batch, is_training, safe_key=None): + + c = self.config + gc = self.global_config + + if safe_key is None: + safe_key = prng.SafeKey(hk.next_rng_key()) + + # Embed clustered MSA. + # Jumper et al. (2021) Suppl. Alg. 2 "Inference" line 5 + # Jumper et al. (2021) Suppl. Alg. 3 "InputEmbedder" + preprocess_1d = common_modules.Linear( + c.msa_channel, name='preprocess_1d')( + batch['target_feat']) + + preprocess_msa = common_modules.Linear( + c.msa_channel, name='preprocess_msa')( + batch['msa_feat']) + + msa_activations = jnp.expand_dims(preprocess_1d, axis=0) + preprocess_msa + + left_single = common_modules.Linear( + c.pair_channel, name='left_single')( + batch['target_feat']) + right_single = common_modules.Linear( + c.pair_channel, name='right_single')( + batch['target_feat']) + pair_activations = left_single[:, None] + right_single[None] + mask_2d = batch['seq_mask'][:, None] * batch['seq_mask'][None, :] + + # Inject previous outputs for recycling. + # Jumper et al. (2021) Suppl. Alg. 2 "Inference" line 6 + # Jumper et al. (2021) Suppl. Alg. 32 "RecyclingEmbedder" + if c.recycle_pos and 'prev_pos' in batch: + prev_pseudo_beta = pseudo_beta_fn( + batch['aatype'], batch['prev_pos'], None) + dgram = dgram_from_positions(prev_pseudo_beta, **self.config.prev_pos) + pair_activations += common_modules.Linear( + c.pair_channel, name='prev_pos_linear')( + dgram) + + if c.recycle_features: + if 'prev_msa_first_row' in batch: + prev_msa_first_row = hk.LayerNorm([-1], + True, + True, + name='prev_msa_first_row_norm')( + batch['prev_msa_first_row']) + msa_activations = jax.ops.index_add(msa_activations, 0, + prev_msa_first_row) + + if 'prev_pair' in batch: + pair_activations += hk.LayerNorm([-1], + True, + True, + name='prev_pair_norm')( + batch['prev_pair']) + + # Relative position encoding. + # Jumper et al. (2021) Suppl. Alg. 4 "relpos" + # Jumper et al. (2021) Suppl. Alg. 5 "one_hot" + if c.max_relative_feature: + # Add one-hot-encoded clipped residue distances to the pair activations. + pos = batch['residue_index'] + offset = pos[:, None] - pos[None, :] + rel_pos = jax.nn.one_hot( + jnp.clip( + offset + c.max_relative_feature, + a_min=0, + a_max=2 * c.max_relative_feature), + 2 * c.max_relative_feature + 1) + pair_activations += common_modules.Linear( + c.pair_channel, name='pair_activiations')( + rel_pos) + + # Embed templates into the pair activations. + # Jumper et al. (2021) Suppl. Alg. 2 "Inference" lines 9-13 + if c.template.enabled: + template_batch = {k: batch[k] for k in batch if k.startswith('template_')} + template_pair_representation = TemplateEmbedding(c.template, gc)( + pair_activations, + template_batch, + mask_2d, + is_training=is_training) + + pair_activations += template_pair_representation + + # Embed extra MSA features. + # Jumper et al. (2021) Suppl. Alg. 2 "Inference" lines 14-16 + extra_msa_feat = create_extra_msa_feature(batch) + extra_msa_activations = common_modules.Linear( + c.extra_msa_channel, + name='extra_msa_activations')( + extra_msa_feat) + + # Extra MSA Stack. + # Jumper et al. (2021) Suppl. Alg. 18 "ExtraMsaStack" + extra_msa_stack_input = { + 'msa': extra_msa_activations, + 'pair': pair_activations, + } + + extra_msa_stack_iteration = EvoformerIteration( + c.evoformer, gc, is_extra_msa=True, name='extra_msa_stack') + + def extra_msa_stack_fn(x): + act, safe_key = x + safe_key, safe_subkey = safe_key.split() + extra_evoformer_output = extra_msa_stack_iteration( + activations=act, + masks={ + 'msa': batch['extra_msa_mask'], + 'pair': mask_2d + }, + is_training=is_training, + safe_key=safe_subkey) + return (extra_evoformer_output, safe_key) + + if gc.use_remat: + extra_msa_stack_fn = hk.remat(extra_msa_stack_fn) + + extra_msa_stack = layer_stack.layer_stack( + c.extra_msa_stack_num_block)( + extra_msa_stack_fn) + extra_msa_output, safe_key = extra_msa_stack( + (extra_msa_stack_input, safe_key)) + + pair_activations = extra_msa_output['pair'] + + evoformer_input = { + 'msa': msa_activations, + 'pair': pair_activations, + } + + evoformer_masks = {'msa': batch['msa_mask'], 'pair': mask_2d} + + # Append num_templ rows to msa_activations with template embeddings. + # Jumper et al. (2021) Suppl. Alg. 2 "Inference" lines 7-8 + if c.template.enabled and c.template.embed_torsion_angles: + num_templ, num_res = batch['template_aatype'].shape + + # Embed the templates aatypes. + aatype_one_hot = jax.nn.one_hot(batch['template_aatype'], 22, axis=-1) + + # Embed the templates aatype, torsion angles and masks. + # Shape (templates, residues, msa_channels) + ret = all_atom.atom37_to_torsion_angles( + aatype=batch['template_aatype'], + all_atom_pos=batch['template_all_atom_positions'], + all_atom_mask=batch['template_all_atom_masks'], + # Ensure consistent behaviour during testing: + placeholder_for_undefined=not gc.zero_init) + + template_features = jnp.concatenate([ + aatype_one_hot, + jnp.reshape( + ret['torsion_angles_sin_cos'], [num_templ, num_res, 14]), + jnp.reshape( + ret['alt_torsion_angles_sin_cos'], [num_templ, num_res, 14]), + ret['torsion_angles_mask']], axis=-1) + + template_activations = common_modules.Linear( + c.msa_channel, + initializer='relu', + name='template_single_embedding')( + template_features) + template_activations = jax.nn.relu(template_activations) + template_activations = common_modules.Linear( + c.msa_channel, + initializer='relu', + name='template_projection')( + template_activations) + + # Concatenate the templates to the msa. + evoformer_input['msa'] = jnp.concatenate( + [evoformer_input['msa'], template_activations], axis=0) + # Concatenate templates masks to the msa masks. + # Use mask from the psi angle, as it only depends on the backbone atoms + # from a single residue. + torsion_angle_mask = ret['torsion_angles_mask'][:, :, 2] + torsion_angle_mask = torsion_angle_mask.astype( + evoformer_masks['msa'].dtype) + evoformer_masks['msa'] = jnp.concatenate( + [evoformer_masks['msa'], torsion_angle_mask], axis=0) + + # Main trunk of the network + # Jumper et al. (2021) Suppl. Alg. 2 "Inference" lines 17-18 + evoformer_iteration = EvoformerIteration( + c.evoformer, gc, is_extra_msa=False, name='evoformer_iteration') + + def evoformer_fn(x): + act, safe_key = x + safe_key, safe_subkey = safe_key.split() + evoformer_output = evoformer_iteration( + activations=act, + masks=evoformer_masks, + is_training=is_training, + safe_key=safe_subkey) + return (evoformer_output, safe_key) + + if gc.use_remat: + evoformer_fn = hk.remat(evoformer_fn) + + evoformer_stack = layer_stack.layer_stack(c.evoformer_num_block)( + evoformer_fn) + evoformer_output, safe_key = evoformer_stack( + (evoformer_input, safe_key)) + + msa_activations = evoformer_output['msa'] + pair_activations = evoformer_output['pair'] + + single_activations = common_modules.Linear( + c.seq_channel, name='single_activations')( + msa_activations[0]) + + num_sequences = batch['msa_feat'].shape[0] + output = { + 'single': single_activations, + 'pair': pair_activations, + # Crop away template rows such that they are not used in MaskedMsaHead. + 'msa': msa_activations[:num_sequences, :, :], + 'msa_first_row': msa_activations[0], + } + + return output + + +class SingleTemplateEmbedding(hk.Module): + """Embeds a single template. + + Jumper et al. (2021) Suppl. Alg. 2 "Inference" lines 9+11 + """ + + def __init__(self, config, global_config, name='single_template_embedding'): + super().__init__(name=name) + self.config = config + self.global_config = global_config + + def __call__(self, query_embedding, batch, mask_2d, is_training): + """Build the single template embedding. + + Arguments: + query_embedding: Query pair representation, shape [N_res, N_res, c_z]. + batch: A batch of template features (note the template dimension has been + stripped out as this module only runs over a single template). + mask_2d: Padding mask (Note: this doesn't care if a template exists, + unlike the template_pseudo_beta_mask). + is_training: Whether the module is in training mode. + + Returns: + A template embedding [N_res, N_res, c_z]. + """ + assert mask_2d.dtype == query_embedding.dtype + dtype = query_embedding.dtype + num_res = batch['template_aatype'].shape[0] + num_channels = (self.config.template_pair_stack + .triangle_attention_ending_node.value_dim) + template_mask = batch['template_pseudo_beta_mask'] + template_mask_2d = template_mask[:, None] * template_mask[None, :] + template_mask_2d = template_mask_2d.astype(dtype) + + template_dgram = dgram_from_positions(batch['template_pseudo_beta'], + **self.config.dgram_features) + template_dgram = template_dgram.astype(dtype) + + to_concat = [template_dgram, template_mask_2d[:, :, None]] + + aatype = jax.nn.one_hot(batch['template_aatype'], 22, axis=-1, dtype=dtype) + + to_concat.append(jnp.tile(aatype[None, :, :], [num_res, 1, 1])) + to_concat.append(jnp.tile(aatype[:, None, :], [1, num_res, 1])) + + n, ca, c = [residue_constants.atom_order[a] for a in ('N', 'CA', 'C')] + rot, trans = quat_affine.make_transform_from_reference( + n_xyz=batch['template_all_atom_positions'][:, n], + ca_xyz=batch['template_all_atom_positions'][:, ca], + c_xyz=batch['template_all_atom_positions'][:, c]) + affines = quat_affine.QuatAffine( + quaternion=quat_affine.rot_to_quat(rot, unstack_inputs=True), + translation=trans, + rotation=rot, + unstack_inputs=True) + points = [jnp.expand_dims(x, axis=-2) for x in affines.translation] + affine_vec = affines.invert_point(points, extra_dims=1) + inv_distance_scalar = jax.lax.rsqrt( + 1e-6 + sum([jnp.square(x) for x in affine_vec])) + + # Backbone affine mask: whether the residue has C, CA, N + # (the template mask defined above only considers pseudo CB). + template_mask = ( + batch['template_all_atom_masks'][..., n] * + batch['template_all_atom_masks'][..., ca] * + batch['template_all_atom_masks'][..., c]) + template_mask_2d = template_mask[:, None] * template_mask[None, :] + + inv_distance_scalar *= template_mask_2d.astype(inv_distance_scalar.dtype) + + unit_vector = [(x * inv_distance_scalar)[..., None] for x in affine_vec] + + unit_vector = [x.astype(dtype) for x in unit_vector] + template_mask_2d = template_mask_2d.astype(dtype) + if not self.config.use_template_unit_vector: + unit_vector = [jnp.zeros_like(x) for x in unit_vector] + to_concat.extend(unit_vector) + + to_concat.append(template_mask_2d[..., None]) + + act = jnp.concatenate(to_concat, axis=-1) + + # Mask out non-template regions so we don't get arbitrary values in the + # distogram for these regions. + act *= template_mask_2d[..., None] + + # Jumper et al. (2021) Suppl. Alg. 2 "Inference" line 9 + act = common_modules.Linear( + num_channels, + initializer='relu', + name='embedding2d')( + act) + + # Jumper et al. (2021) Suppl. Alg. 2 "Inference" line 11 + act = TemplatePairStack( + self.config.template_pair_stack, self.global_config)( + act, mask_2d, is_training) + + act = hk.LayerNorm([-1], True, True, name='output_layer_norm')(act) + return act + + +class TemplateEmbedding(hk.Module): + """Embeds a set of templates. + + Jumper et al. (2021) Suppl. Alg. 2 "Inference" lines 9-12 + Jumper et al. (2021) Suppl. Alg. 17 "TemplatePointwiseAttention" + """ + + def __init__(self, config, global_config, name='template_embedding'): + super().__init__(name=name) + self.config = config + self.global_config = global_config + + def __call__(self, query_embedding, template_batch, mask_2d, is_training): + """Build TemplateEmbedding module. + + Arguments: + query_embedding: Query pair representation, shape [N_res, N_res, c_z]. + template_batch: A batch of template features. + mask_2d: Padding mask (Note: this doesn't care if a template exists, + unlike the template_pseudo_beta_mask). + is_training: Whether the module is in training mode. + + Returns: + A template embedding [N_res, N_res, c_z]. + """ + + num_templates = template_batch['template_mask'].shape[0] + num_channels = (self.config.template_pair_stack + .triangle_attention_ending_node.value_dim) + num_res = query_embedding.shape[0] + + dtype = query_embedding.dtype + template_mask = template_batch['template_mask'] + template_mask = template_mask.astype(dtype) + + query_num_channels = query_embedding.shape[-1] + + # Make sure the weights are shared across templates by constructing the + # embedder here. + # Jumper et al. (2021) Suppl. Alg. 2 "Inference" lines 9-12 + template_embedder = SingleTemplateEmbedding(self.config, self.global_config) + + def map_fn(batch): + return template_embedder(query_embedding, batch, mask_2d, is_training) + + template_pair_representation = mapping.sharded_map(map_fn, in_axes=0)( + template_batch) + + # Cross attend from the query to the templates along the residue + # dimension by flattening everything else into the batch dimension. + # Jumper et al. (2021) Suppl. Alg. 17 "TemplatePointwiseAttention" + flat_query = jnp.reshape(query_embedding, + [num_res * num_res, 1, query_num_channels]) + + flat_templates = jnp.reshape( + jnp.transpose(template_pair_representation, [1, 2, 0, 3]), + [num_res * num_res, num_templates, num_channels]) + + bias = (1e9 * (template_mask[None, None, None, :] - 1.)) + + template_pointwise_attention_module = Attention( + self.config.attention, self.global_config, query_num_channels) + nonbatched_args = [bias] + batched_args = [flat_query, flat_templates] + + embedding = mapping.inference_subbatch( + template_pointwise_attention_module, + self.config.subbatch_size, + batched_args=batched_args, + nonbatched_args=nonbatched_args, + low_memory=not is_training) + embedding = jnp.reshape(embedding, + [num_res, num_res, query_num_channels]) + + # No gradients if no templates. + embedding *= (jnp.sum(template_mask) > 0.).astype(embedding.dtype) + + return embedding diff --git a/alphafold/alphafold/model/prng.py b/alphafold/alphafold/model/prng.py new file mode 100644 index 0000000000000000000000000000000000000000..2dde12965c4b10203801a198a4d73fe610d1059d --- /dev/null +++ b/alphafold/alphafold/model/prng.py @@ -0,0 +1,69 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""A collection of utilities surrounding PRNG usage in protein folding.""" + +import haiku as hk +import jax + + +def safe_dropout(*, tensor, safe_key, rate, is_deterministic, is_training): + if is_training and rate != 0.0 and not is_deterministic: + return hk.dropout(safe_key.get(), rate, tensor) + else: + return tensor + + +class SafeKey: + """Safety wrapper for PRNG keys.""" + + def __init__(self, key): + self._key = key + self._used = False + + def _assert_not_used(self): + if self._used: + raise RuntimeError('Random key has been used previously.') + + def get(self): + self._assert_not_used() + self._used = True + return self._key + + def split(self, num_keys=2): + self._assert_not_used() + self._used = True + new_keys = jax.random.split(self._key, num_keys) + return jax.tree_map(SafeKey, tuple(new_keys)) + + def duplicate(self, num_keys=2): + self._assert_not_used() + self._used = True + return tuple(SafeKey(self._key) for _ in range(num_keys)) + + +def _safe_key_flatten(safe_key): + # Flatten transfers "ownership" to the tree + return (safe_key._key,), safe_key._used # pylint: disable=protected-access + + +def _safe_key_unflatten(aux_data, children): + ret = SafeKey(children[0]) + ret._used = aux_data # pylint: disable=protected-access + return ret + + +jax.tree_util.register_pytree_node( + SafeKey, _safe_key_flatten, _safe_key_unflatten) + diff --git a/alphafold/alphafold/model/prng_test.py b/alphafold/alphafold/model/prng_test.py new file mode 100644 index 0000000000000000000000000000000000000000..f77276ffe31709b11ff3c0a347c6ee0414b29b5c --- /dev/null +++ b/alphafold/alphafold/model/prng_test.py @@ -0,0 +1,46 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Tests for prng.""" + +from absl.testing import absltest +from alphafold.model import prng +import jax + + +class PrngTest(absltest.TestCase): + + def test_key_reuse(self): + + init_key = jax.random.PRNGKey(42) + safe_key = prng.SafeKey(init_key) + _, safe_key = safe_key.split() + + raw_key = safe_key.get() + + self.assertNotEqual(raw_key[0], init_key[0]) + self.assertNotEqual(raw_key[1], init_key[1]) + + with self.assertRaises(RuntimeError): + safe_key.get() + + with self.assertRaises(RuntimeError): + safe_key.split() + + with self.assertRaises(RuntimeError): + safe_key.duplicate() + + +if __name__ == '__main__': + absltest.main() diff --git a/alphafold/alphafold/model/quat_affine.py b/alphafold/alphafold/model/quat_affine.py new file mode 100644 index 0000000000000000000000000000000000000000..9ebcd20f3e2948c905242dc3e09df6684b99ace7 --- /dev/null +++ b/alphafold/alphafold/model/quat_affine.py @@ -0,0 +1,459 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Quaternion geometry modules. + +This introduces a representation of coordinate frames that is based around a +‘QuatAffine’ object. This object describes an array of coordinate frames. +It consists of vectors corresponding to the +origin of the frames as well as orientations which are stored in two +ways, as unit quaternions as well as a rotation matrices. +The rotation matrices are derived from the unit quaternions and the two are kept +in sync. +For an explanation of the relation between unit quaternions and rotations see +https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation + +This representation is used in the model for the backbone frames. + +One important thing to note here, is that while we update both representations +the jit compiler is going to ensure that only the parts that are +actually used are executed. +""" + + +import functools +from typing import Tuple + +import jax +import jax.numpy as jnp +import numpy as np + +# pylint: disable=bad-whitespace +QUAT_TO_ROT = np.zeros((4, 4, 3, 3), dtype=np.float32) + +QUAT_TO_ROT[0, 0] = [[ 1, 0, 0], [ 0, 1, 0], [ 0, 0, 1]] # rr +QUAT_TO_ROT[1, 1] = [[ 1, 0, 0], [ 0,-1, 0], [ 0, 0,-1]] # ii +QUAT_TO_ROT[2, 2] = [[-1, 0, 0], [ 0, 1, 0], [ 0, 0,-1]] # jj +QUAT_TO_ROT[3, 3] = [[-1, 0, 0], [ 0,-1, 0], [ 0, 0, 1]] # kk + +QUAT_TO_ROT[1, 2] = [[ 0, 2, 0], [ 2, 0, 0], [ 0, 0, 0]] # ij +QUAT_TO_ROT[1, 3] = [[ 0, 0, 2], [ 0, 0, 0], [ 2, 0, 0]] # ik +QUAT_TO_ROT[2, 3] = [[ 0, 0, 0], [ 0, 0, 2], [ 0, 2, 0]] # jk + +QUAT_TO_ROT[0, 1] = [[ 0, 0, 0], [ 0, 0,-2], [ 0, 2, 0]] # ir +QUAT_TO_ROT[0, 2] = [[ 0, 0, 2], [ 0, 0, 0], [-2, 0, 0]] # jr +QUAT_TO_ROT[0, 3] = [[ 0,-2, 0], [ 2, 0, 0], [ 0, 0, 0]] # kr + +QUAT_MULTIPLY = np.zeros((4, 4, 4), dtype=np.float32) +QUAT_MULTIPLY[:, :, 0] = [[ 1, 0, 0, 0], + [ 0,-1, 0, 0], + [ 0, 0,-1, 0], + [ 0, 0, 0,-1]] + +QUAT_MULTIPLY[:, :, 1] = [[ 0, 1, 0, 0], + [ 1, 0, 0, 0], + [ 0, 0, 0, 1], + [ 0, 0,-1, 0]] + +QUAT_MULTIPLY[:, :, 2] = [[ 0, 0, 1, 0], + [ 0, 0, 0,-1], + [ 1, 0, 0, 0], + [ 0, 1, 0, 0]] + +QUAT_MULTIPLY[:, :, 3] = [[ 0, 0, 0, 1], + [ 0, 0, 1, 0], + [ 0,-1, 0, 0], + [ 1, 0, 0, 0]] + +QUAT_MULTIPLY_BY_VEC = QUAT_MULTIPLY[:, 1:, :] +# pylint: enable=bad-whitespace + + +def rot_to_quat(rot, unstack_inputs=False): + """Convert rotation matrix to quaternion. + + Note that this function calls self_adjoint_eig which is extremely expensive on + the GPU. If at all possible, this function should run on the CPU. + + Args: + rot: rotation matrix (see below for format). + unstack_inputs: If true, rotation matrix should be shape (..., 3, 3) + otherwise the rotation matrix should be a list of lists of tensors. + + Returns: + Quaternion as (..., 4) tensor. + """ + if unstack_inputs: + rot = [jnp.moveaxis(x, -1, 0) for x in jnp.moveaxis(rot, -2, 0)] + + [[xx, xy, xz], [yx, yy, yz], [zx, zy, zz]] = rot + + # pylint: disable=bad-whitespace + k = [[ xx + yy + zz, zy - yz, xz - zx, yx - xy,], + [ zy - yz, xx - yy - zz, xy + yx, xz + zx,], + [ xz - zx, xy + yx, yy - xx - zz, yz + zy,], + [ yx - xy, xz + zx, yz + zy, zz - xx - yy,]] + # pylint: enable=bad-whitespace + + k = (1./3.) * jnp.stack([jnp.stack(x, axis=-1) for x in k], + axis=-2) + + # Get eigenvalues in non-decreasing order and associated. + _, qs = jnp.linalg.eigh(k) + return qs[..., -1] + + +def rot_list_to_tensor(rot_list): + """Convert list of lists to rotation tensor.""" + return jnp.stack( + [jnp.stack(rot_list[0], axis=-1), + jnp.stack(rot_list[1], axis=-1), + jnp.stack(rot_list[2], axis=-1)], + axis=-2) + + +def vec_list_to_tensor(vec_list): + """Convert list to vector tensor.""" + return jnp.stack(vec_list, axis=-1) + + +def quat_to_rot(normalized_quat): + """Convert a normalized quaternion to a rotation matrix.""" + rot_tensor = jnp.sum( + np.reshape(QUAT_TO_ROT, (4, 4, 9)) * + normalized_quat[..., :, None, None] * + normalized_quat[..., None, :, None], + axis=(-3, -2)) + rot = jnp.moveaxis(rot_tensor, -1, 0) # Unstack. + return [[rot[0], rot[1], rot[2]], + [rot[3], rot[4], rot[5]], + [rot[6], rot[7], rot[8]]] + + +def quat_multiply_by_vec(quat, vec): + """Multiply a quaternion by a pure-vector quaternion.""" + return jnp.sum( + QUAT_MULTIPLY_BY_VEC * + quat[..., :, None, None] * + vec[..., None, :, None], + axis=(-3, -2)) + + +def quat_multiply(quat1, quat2): + """Multiply a quaternion by another quaternion.""" + return jnp.sum( + QUAT_MULTIPLY * + quat1[..., :, None, None] * + quat2[..., None, :, None], + axis=(-3, -2)) + + +def apply_rot_to_vec(rot, vec, unstack=False): + """Multiply rotation matrix by a vector.""" + if unstack: + x, y, z = [vec[:, i] for i in range(3)] + else: + x, y, z = vec + return [rot[0][0] * x + rot[0][1] * y + rot[0][2] * z, + rot[1][0] * x + rot[1][1] * y + rot[1][2] * z, + rot[2][0] * x + rot[2][1] * y + rot[2][2] * z] + + +def apply_inverse_rot_to_vec(rot, vec): + """Multiply the inverse of a rotation matrix by a vector.""" + # Inverse rotation is just transpose + return [rot[0][0] * vec[0] + rot[1][0] * vec[1] + rot[2][0] * vec[2], + rot[0][1] * vec[0] + rot[1][1] * vec[1] + rot[2][1] * vec[2], + rot[0][2] * vec[0] + rot[1][2] * vec[1] + rot[2][2] * vec[2]] + + +class QuatAffine(object): + """Affine transformation represented by quaternion and vector.""" + + def __init__(self, quaternion, translation, rotation=None, normalize=True, + unstack_inputs=False): + """Initialize from quaternion and translation. + + Args: + quaternion: Rotation represented by a quaternion, to be applied + before translation. Must be a unit quaternion unless normalize==True. + translation: Translation represented as a vector. + rotation: Same rotation as the quaternion, represented as a (..., 3, 3) + tensor. If None, rotation will be calculated from the quaternion. + normalize: If True, l2 normalize the quaternion on input. + unstack_inputs: If True, translation is a vector with last component 3 + """ + + if quaternion is not None: + assert quaternion.shape[-1] == 4 + + if unstack_inputs: + if rotation is not None: + rotation = [jnp.moveaxis(x, -1, 0) # Unstack. + for x in jnp.moveaxis(rotation, -2, 0)] # Unstack. + translation = jnp.moveaxis(translation, -1, 0) # Unstack. + + if normalize and quaternion is not None: + quaternion = quaternion / jnp.linalg.norm(quaternion, axis=-1, + keepdims=True) + + if rotation is None: + rotation = quat_to_rot(quaternion) + + self.quaternion = quaternion + self.rotation = [list(row) for row in rotation] + self.translation = list(translation) + + assert all(len(row) == 3 for row in self.rotation) + assert len(self.translation) == 3 + + def to_tensor(self): + return jnp.concatenate( + [self.quaternion] + + [jnp.expand_dims(x, axis=-1) for x in self.translation], + axis=-1) + + def apply_tensor_fn(self, tensor_fn): + """Return a new QuatAffine with tensor_fn applied (e.g. stop_gradient).""" + return QuatAffine( + tensor_fn(self.quaternion), + [tensor_fn(x) for x in self.translation], + rotation=[[tensor_fn(x) for x in row] for row in self.rotation], + normalize=False) + + def apply_rotation_tensor_fn(self, tensor_fn): + """Return a new QuatAffine with tensor_fn applied to the rotation part.""" + return QuatAffine( + tensor_fn(self.quaternion), + [x for x in self.translation], + rotation=[[tensor_fn(x) for x in row] for row in self.rotation], + normalize=False) + + def scale_translation(self, position_scale): + """Return a new quat affine with a different scale for translation.""" + + return QuatAffine( + self.quaternion, + [x * position_scale for x in self.translation], + rotation=[[x for x in row] for row in self.rotation], + normalize=False) + + @classmethod + def from_tensor(cls, tensor, normalize=False): + quaternion, tx, ty, tz = jnp.split(tensor, [4, 5, 6], axis=-1) + return cls(quaternion, + [tx[..., 0], ty[..., 0], tz[..., 0]], + normalize=normalize) + + def pre_compose(self, update): + """Return a new QuatAffine which applies the transformation update first. + + Args: + update: Length-6 vector. 3-vector of x, y, and z such that the quaternion + update is (1, x, y, z) and zero for the 3-vector is the identity + quaternion. 3-vector for translation concatenated. + + Returns: + New QuatAffine object. + """ + vector_quaternion_update, x, y, z = jnp.split(update, [3, 4, 5], axis=-1) + trans_update = [jnp.squeeze(x, axis=-1), + jnp.squeeze(y, axis=-1), + jnp.squeeze(z, axis=-1)] + + new_quaternion = (self.quaternion + + quat_multiply_by_vec(self.quaternion, + vector_quaternion_update)) + + trans_update = apply_rot_to_vec(self.rotation, trans_update) + new_translation = [ + self.translation[0] + trans_update[0], + self.translation[1] + trans_update[1], + self.translation[2] + trans_update[2]] + + return QuatAffine(new_quaternion, new_translation) + + def apply_to_point(self, point, extra_dims=0): + """Apply affine to a point. + + Args: + point: List of 3 tensors to apply affine. + extra_dims: Number of dimensions at the end of the transformed_point + shape that are not present in the rotation and translation. The most + common use is rotation N points at once with extra_dims=1 for use in a + network. + + Returns: + Transformed point after applying affine. + """ + rotation = self.rotation + translation = self.translation + for _ in range(extra_dims): + expand_fn = functools.partial(jnp.expand_dims, axis=-1) + rotation = jax.tree_map(expand_fn, rotation) + translation = jax.tree_map(expand_fn, translation) + + rot_point = apply_rot_to_vec(rotation, point) + return [ + rot_point[0] + translation[0], + rot_point[1] + translation[1], + rot_point[2] + translation[2]] + + def invert_point(self, transformed_point, extra_dims=0): + """Apply inverse of transformation to a point. + + Args: + transformed_point: List of 3 tensors to apply affine + extra_dims: Number of dimensions at the end of the transformed_point + shape that are not present in the rotation and translation. The most + common use is rotation N points at once with extra_dims=1 for use in a + network. + + Returns: + Transformed point after applying affine. + """ + rotation = self.rotation + translation = self.translation + for _ in range(extra_dims): + expand_fn = functools.partial(jnp.expand_dims, axis=-1) + rotation = jax.tree_map(expand_fn, rotation) + translation = jax.tree_map(expand_fn, translation) + + rot_point = [ + transformed_point[0] - translation[0], + transformed_point[1] - translation[1], + transformed_point[2] - translation[2]] + + return apply_inverse_rot_to_vec(rotation, rot_point) + + def __repr__(self): + return 'QuatAffine(%r, %r)' % (self.quaternion, self.translation) + + +def _multiply(a, b): + return jnp.stack([ + jnp.array([a[0][0]*b[0][0] + a[0][1]*b[1][0] + a[0][2]*b[2][0], + a[0][0]*b[0][1] + a[0][1]*b[1][1] + a[0][2]*b[2][1], + a[0][0]*b[0][2] + a[0][1]*b[1][2] + a[0][2]*b[2][2]]), + + jnp.array([a[1][0]*b[0][0] + a[1][1]*b[1][0] + a[1][2]*b[2][0], + a[1][0]*b[0][1] + a[1][1]*b[1][1] + a[1][2]*b[2][1], + a[1][0]*b[0][2] + a[1][1]*b[1][2] + a[1][2]*b[2][2]]), + + jnp.array([a[2][0]*b[0][0] + a[2][1]*b[1][0] + a[2][2]*b[2][0], + a[2][0]*b[0][1] + a[2][1]*b[1][1] + a[2][2]*b[2][1], + a[2][0]*b[0][2] + a[2][1]*b[1][2] + a[2][2]*b[2][2]])]) + + +def make_canonical_transform( + n_xyz: jnp.ndarray, + ca_xyz: jnp.ndarray, + c_xyz: jnp.ndarray) -> Tuple[jnp.ndarray, jnp.ndarray]: + """Returns translation and rotation matrices to canonicalize residue atoms. + + Note that this method does not take care of symmetries. If you provide the + atom positions in the non-standard way, the N atom will end up not at + [-0.527250, 1.359329, 0.0] but instead at [-0.527250, -1.359329, 0.0]. You + need to take care of such cases in your code. + + Args: + n_xyz: An array of shape [batch, 3] of nitrogen xyz coordinates. + ca_xyz: An array of shape [batch, 3] of carbon alpha xyz coordinates. + c_xyz: An array of shape [batch, 3] of carbon xyz coordinates. + + Returns: + A tuple (translation, rotation) where: + translation is an array of shape [batch, 3] defining the translation. + rotation is an array of shape [batch, 3, 3] defining the rotation. + After applying the translation and rotation to all atoms in a residue: + * All atoms will be shifted so that CA is at the origin, + * All atoms will be rotated so that C is at the x-axis, + * All atoms will be shifted so that N is in the xy plane. + """ + assert len(n_xyz.shape) == 2, n_xyz.shape + assert n_xyz.shape[-1] == 3, n_xyz.shape + assert n_xyz.shape == ca_xyz.shape == c_xyz.shape, ( + n_xyz.shape, ca_xyz.shape, c_xyz.shape) + + # Place CA at the origin. + translation = -ca_xyz + n_xyz = n_xyz + translation + c_xyz = c_xyz + translation + + # Place C on the x-axis. + c_x, c_y, c_z = [c_xyz[:, i] for i in range(3)] + # Rotate by angle c1 in the x-y plane (around the z-axis). + sin_c1 = -c_y / jnp.sqrt(1e-20 + c_x**2 + c_y**2) + cos_c1 = c_x / jnp.sqrt(1e-20 + c_x**2 + c_y**2) + zeros = jnp.zeros_like(sin_c1) + ones = jnp.ones_like(sin_c1) + # pylint: disable=bad-whitespace + c1_rot_matrix = jnp.stack([jnp.array([cos_c1, -sin_c1, zeros]), + jnp.array([sin_c1, cos_c1, zeros]), + jnp.array([zeros, zeros, ones])]) + + # Rotate by angle c2 in the x-z plane (around the y-axis). + sin_c2 = c_z / jnp.sqrt(1e-20 + c_x**2 + c_y**2 + c_z**2) + cos_c2 = jnp.sqrt(c_x**2 + c_y**2) / jnp.sqrt( + 1e-20 + c_x**2 + c_y**2 + c_z**2) + c2_rot_matrix = jnp.stack([jnp.array([cos_c2, zeros, sin_c2]), + jnp.array([zeros, ones, zeros]), + jnp.array([-sin_c2, zeros, cos_c2])]) + + c_rot_matrix = _multiply(c2_rot_matrix, c1_rot_matrix) + n_xyz = jnp.stack(apply_rot_to_vec(c_rot_matrix, n_xyz, unstack=True)).T + + # Place N in the x-y plane. + _, n_y, n_z = [n_xyz[:, i] for i in range(3)] + # Rotate by angle alpha in the y-z plane (around the x-axis). + sin_n = -n_z / jnp.sqrt(1e-20 + n_y**2 + n_z**2) + cos_n = n_y / jnp.sqrt(1e-20 + n_y**2 + n_z**2) + n_rot_matrix = jnp.stack([jnp.array([ones, zeros, zeros]), + jnp.array([zeros, cos_n, -sin_n]), + jnp.array([zeros, sin_n, cos_n])]) + # pylint: enable=bad-whitespace + + return (translation, + jnp.transpose(_multiply(n_rot_matrix, c_rot_matrix), [2, 0, 1])) + + +def make_transform_from_reference( + n_xyz: jnp.ndarray, + ca_xyz: jnp.ndarray, + c_xyz: jnp.ndarray) -> Tuple[jnp.ndarray, jnp.ndarray]: + """Returns rotation and translation matrices to convert from reference. + + Note that this method does not take care of symmetries. If you provide the + atom positions in the non-standard way, the N atom will end up not at + [-0.527250, 1.359329, 0.0] but instead at [-0.527250, -1.359329, 0.0]. You + need to take care of such cases in your code. + + Args: + n_xyz: An array of shape [batch, 3] of nitrogen xyz coordinates. + ca_xyz: An array of shape [batch, 3] of carbon alpha xyz coordinates. + c_xyz: An array of shape [batch, 3] of carbon xyz coordinates. + + Returns: + A tuple (rotation, translation) where: + rotation is an array of shape [batch, 3, 3] defining the rotation. + translation is an array of shape [batch, 3] defining the translation. + After applying the translation and rotation to the reference backbone, + the coordinates will approximately equal to the input coordinates. + + The order of translation and rotation differs from make_canonical_transform + because the rotation from this function should be applied before the + translation, unlike make_canonical_transform. + """ + translation, rotation = make_canonical_transform(n_xyz, ca_xyz, c_xyz) + return np.transpose(rotation, (0, 2, 1)), -translation diff --git a/alphafold/alphafold/model/quat_affine_test.py b/alphafold/alphafold/model/quat_affine_test.py new file mode 100644 index 0000000000000000000000000000000000000000..6a477b2d0634af1d1ab47a4c0d41bc5991d6c89a --- /dev/null +++ b/alphafold/alphafold/model/quat_affine_test.py @@ -0,0 +1,150 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Tests for quat_affine.""" + +from absl import logging +from absl.testing import absltest +from alphafold.model import quat_affine +import jax +import jax.numpy as jnp +import numpy as np + +VERBOSE = False +np.set_printoptions(precision=3, suppress=True) + +r2t = quat_affine.rot_list_to_tensor +v2t = quat_affine.vec_list_to_tensor + +q2r = lambda q: r2t(quat_affine.quat_to_rot(q)) + + +class QuatAffineTest(absltest.TestCase): + + def _assert_check(self, to_check, tol=1e-5): + for k, (correct, generated) in to_check.items(): + if VERBOSE: + logging.info(k) + logging.info('Correct %s', correct) + logging.info('Predicted %s', generated) + self.assertLess(np.max(np.abs(correct - generated)), tol) + + def test_conversion(self): + quat = jnp.array([-2., 5., -1., 4.]) + + rotation = jnp.array([ + [0.26087, 0.130435, 0.956522], + [-0.565217, -0.782609, 0.26087], + [0.782609, -0.608696, -0.130435]]) + + translation = jnp.array([1., -3., 4.]) + point = jnp.array([0.7, 3.2, -2.9]) + + a = quat_affine.QuatAffine(quat, translation, unstack_inputs=True) + true_new_point = jnp.matmul(rotation, point[:, None])[:, 0] + translation + + self._assert_check({ + 'rot': (rotation, r2t(a.rotation)), + 'trans': (translation, v2t(a.translation)), + 'point': (true_new_point, + v2t(a.apply_to_point(jnp.moveaxis(point, -1, 0)))), + # Because of the double cover, we must be careful and compare rotations + 'quat': (q2r(a.quaternion), + q2r(quat_affine.rot_to_quat(a.rotation))), + + }) + + def test_double_cover(self): + """Test that -q is the same rotation as q.""" + rng = jax.random.PRNGKey(42) + keys = jax.random.split(rng) + q = jax.random.normal(keys[0], (2, 4)) + trans = jax.random.normal(keys[1], (2, 3)) + a1 = quat_affine.QuatAffine(q, trans, unstack_inputs=True) + a2 = quat_affine.QuatAffine(-q, trans, unstack_inputs=True) + + self._assert_check({ + 'rot': (r2t(a1.rotation), + r2t(a2.rotation)), + 'trans': (v2t(a1.translation), + v2t(a2.translation)), + }) + + def test_homomorphism(self): + rng = jax.random.PRNGKey(42) + keys = jax.random.split(rng, 4) + vec_q1 = jax.random.normal(keys[0], (2, 3)) + + q1 = jnp.concatenate([ + jnp.ones_like(vec_q1)[:, :1], + vec_q1], axis=-1) + + q2 = jax.random.normal(keys[1], (2, 4)) + t1 = jax.random.normal(keys[2], (2, 3)) + t2 = jax.random.normal(keys[3], (2, 3)) + + a1 = quat_affine.QuatAffine(q1, t1, unstack_inputs=True) + a2 = quat_affine.QuatAffine(q2, t2, unstack_inputs=True) + a21 = a2.pre_compose(jnp.concatenate([vec_q1, t1], axis=-1)) + + rng, key = jax.random.split(rng) + x = jax.random.normal(key, (2, 3)) + new_x = a21.apply_to_point(jnp.moveaxis(x, -1, 0)) + new_x_apply2 = a2.apply_to_point(a1.apply_to_point(jnp.moveaxis(x, -1, 0))) + + self._assert_check({ + 'quat': (q2r(quat_affine.quat_multiply(a2.quaternion, a1.quaternion)), + q2r(a21.quaternion)), + 'rot': (jnp.matmul(r2t(a2.rotation), r2t(a1.rotation)), + r2t(a21.rotation)), + 'point': (v2t(new_x_apply2), + v2t(new_x)), + 'inverse': (x, v2t(a21.invert_point(new_x))), + }) + + def test_batching(self): + """Test that affine applies batchwise.""" + rng = jax.random.PRNGKey(42) + keys = jax.random.split(rng, 3) + q = jax.random.uniform(keys[0], (5, 2, 4)) + t = jax.random.uniform(keys[1], (2, 3)) + x = jax.random.uniform(keys[2], (5, 1, 3)) + + a = quat_affine.QuatAffine(q, t, unstack_inputs=True) + y = v2t(a.apply_to_point(jnp.moveaxis(x, -1, 0))) + + y_list = [] + for i in range(5): + for j in range(2): + a_local = quat_affine.QuatAffine(q[i, j], t[j], + unstack_inputs=True) + y_local = v2t(a_local.apply_to_point(jnp.moveaxis(x[i, 0], -1, 0))) + y_list.append(y_local) + y_combine = jnp.reshape(jnp.stack(y_list, axis=0), (5, 2, 3)) + + self._assert_check({ + 'batch': (y_combine, y), + 'quat': (q2r(a.quaternion), + q2r(quat_affine.rot_to_quat(a.rotation))), + }) + + def assertAllClose(self, a, b, rtol=1e-06, atol=1e-06): + self.assertTrue(np.allclose(a, b, rtol=rtol, atol=atol)) + + def assertAllEqual(self, a, b): + self.assertTrue(np.all(np.array(a) == np.array(b))) + + +if __name__ == '__main__': + absltest.main() diff --git a/alphafold/alphafold/model/r3.py b/alphafold/alphafold/model/r3.py new file mode 100644 index 0000000000000000000000000000000000000000..1e775ab39e529c6086938adbb1d6c2cd3fb6cc8e --- /dev/null +++ b/alphafold/alphafold/model/r3.py @@ -0,0 +1,320 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Transformations for 3D coordinates. + +This Module contains objects for representing Vectors (Vecs), Rotation Matrices +(Rots) and proper Rigid transformation (Rigids). These are represented as +named tuples with arrays for each entry, for example a set of +[N, M] points would be represented as a Vecs object with arrays of shape [N, M] +for x, y and z. + +This is being done to improve readability by making it very clear what objects +are geometric objects rather than relying on comments and array shapes. +Another reason for this is to avoid using matrix +multiplication primitives like matmul or einsum, on modern accelerator hardware +these can end up on specialized cores such as tensor cores on GPU or the MXU on +cloud TPUs, this often involves lower computational precision which can be +problematic for coordinate geometry. Also these cores are typically optimized +for larger matrices than 3 dimensional, this code is written to avoid any +unintended use of these cores on both GPUs and TPUs. +""" + +import collections +from typing import List +from alphafold.model import quat_affine +import jax.numpy as jnp +import tree + +# Array of 3-component vectors, stored as individual array for +# each component. +Vecs = collections.namedtuple('Vecs', ['x', 'y', 'z']) + +# Array of 3x3 rotation matrices, stored as individual array for +# each component. +Rots = collections.namedtuple('Rots', ['xx', 'xy', 'xz', + 'yx', 'yy', 'yz', + 'zx', 'zy', 'zz']) +# Array of rigid 3D transformations, stored as array of rotations and +# array of translations. +Rigids = collections.namedtuple('Rigids', ['rot', 'trans']) + + +def squared_difference(x, y): + return jnp.square(x - y) + + +def invert_rigids(r: Rigids) -> Rigids: + """Computes group inverse of rigid transformations 'r'.""" + inv_rots = invert_rots(r.rot) + t = rots_mul_vecs(inv_rots, r.trans) + inv_trans = Vecs(-t.x, -t.y, -t.z) + return Rigids(inv_rots, inv_trans) + + +def invert_rots(m: Rots) -> Rots: + """Computes inverse of rotations 'm'.""" + return Rots(m.xx, m.yx, m.zx, + m.xy, m.yy, m.zy, + m.xz, m.yz, m.zz) + + +def rigids_from_3_points( + point_on_neg_x_axis: Vecs, # shape (...) + origin: Vecs, # shape (...) + point_on_xy_plane: Vecs, # shape (...) +) -> Rigids: # shape (...) + """Create Rigids from 3 points. + + Jumper et al. (2021) Suppl. Alg. 21 "rigidFrom3Points" + This creates a set of rigid transformations from 3 points by Gram Schmidt + orthogonalization. + + Args: + point_on_neg_x_axis: Vecs corresponding to points on the negative x axis + origin: Origin of resulting rigid transformations + point_on_xy_plane: Vecs corresponding to points in the xy plane + Returns: + Rigid transformations from global frame to local frames derived from + the input points. + """ + m = rots_from_two_vecs( + e0_unnormalized=vecs_sub(origin, point_on_neg_x_axis), + e1_unnormalized=vecs_sub(point_on_xy_plane, origin)) + + return Rigids(rot=m, trans=origin) + + +def rigids_from_list(l: List[jnp.ndarray]) -> Rigids: + """Converts flat list of arrays to rigid transformations.""" + assert len(l) == 12 + return Rigids(Rots(*(l[:9])), Vecs(*(l[9:]))) + + +def rigids_from_quataffine(a: quat_affine.QuatAffine) -> Rigids: + """Converts QuatAffine object to the corresponding Rigids object.""" + return Rigids(Rots(*tree.flatten(a.rotation)), + Vecs(*a.translation)) + + +def rigids_from_tensor4x4( + m: jnp.ndarray # shape (..., 4, 4) +) -> Rigids: # shape (...) + """Construct Rigids object from an 4x4 array. + + Here the 4x4 is representing the transformation in homogeneous coordinates. + + Args: + m: Array representing transformations in homogeneous coordinates. + Returns: + Rigids object corresponding to transformations m + """ + assert m.shape[-1] == 4 + assert m.shape[-2] == 4 + return Rigids( + Rots(m[..., 0, 0], m[..., 0, 1], m[..., 0, 2], + m[..., 1, 0], m[..., 1, 1], m[..., 1, 2], + m[..., 2, 0], m[..., 2, 1], m[..., 2, 2]), + Vecs(m[..., 0, 3], m[..., 1, 3], m[..., 2, 3])) + + +def rigids_from_tensor_flat9( + m: jnp.ndarray # shape (..., 9) +) -> Rigids: # shape (...) + """Flat9 encoding: first two columns of rotation matrix + translation.""" + assert m.shape[-1] == 9 + e0 = Vecs(m[..., 0], m[..., 1], m[..., 2]) + e1 = Vecs(m[..., 3], m[..., 4], m[..., 5]) + trans = Vecs(m[..., 6], m[..., 7], m[..., 8]) + return Rigids(rot=rots_from_two_vecs(e0, e1), + trans=trans) + + +def rigids_from_tensor_flat12( + m: jnp.ndarray # shape (..., 12) +) -> Rigids: # shape (...) + """Flat12 encoding: rotation matrix (9 floats) + translation (3 floats).""" + assert m.shape[-1] == 12 + x = jnp.moveaxis(m, -1, 0) # Unstack + return Rigids(Rots(*x[:9]), Vecs(*x[9:])) + + +def rigids_mul_rigids(a: Rigids, b: Rigids) -> Rigids: + """Group composition of Rigids 'a' and 'b'.""" + return Rigids( + rots_mul_rots(a.rot, b.rot), + vecs_add(a.trans, rots_mul_vecs(a.rot, b.trans))) + + +def rigids_mul_rots(r: Rigids, m: Rots) -> Rigids: + """Compose rigid transformations 'r' with rotations 'm'.""" + return Rigids(rots_mul_rots(r.rot, m), r.trans) + + +def rigids_mul_vecs(r: Rigids, v: Vecs) -> Vecs: + """Apply rigid transforms 'r' to points 'v'.""" + return vecs_add(rots_mul_vecs(r.rot, v), r.trans) + + +def rigids_to_list(r: Rigids) -> List[jnp.ndarray]: + """Turn Rigids into flat list, inverse of 'rigids_from_list'.""" + return list(r.rot) + list(r.trans) + + +def rigids_to_quataffine(r: Rigids) -> quat_affine.QuatAffine: + """Convert Rigids r into QuatAffine, inverse of 'rigids_from_quataffine'.""" + return quat_affine.QuatAffine( + quaternion=None, + rotation=[[r.rot.xx, r.rot.xy, r.rot.xz], + [r.rot.yx, r.rot.yy, r.rot.yz], + [r.rot.zx, r.rot.zy, r.rot.zz]], + translation=[r.trans.x, r.trans.y, r.trans.z]) + + +def rigids_to_tensor_flat9( + r: Rigids # shape (...) +) -> jnp.ndarray: # shape (..., 9) + """Flat9 encoding: first two columns of rotation matrix + translation.""" + return jnp.stack( + [r.rot.xx, r.rot.yx, r.rot.zx, r.rot.xy, r.rot.yy, r.rot.zy] + + list(r.trans), axis=-1) + + +def rigids_to_tensor_flat12( + r: Rigids # shape (...) +) -> jnp.ndarray: # shape (..., 12) + """Flat12 encoding: rotation matrix (9 floats) + translation (3 floats).""" + return jnp.stack(list(r.rot) + list(r.trans), axis=-1) + + +def rots_from_tensor3x3( + m: jnp.ndarray, # shape (..., 3, 3) +) -> Rots: # shape (...) + """Convert rotations represented as (3, 3) array to Rots.""" + assert m.shape[-1] == 3 + assert m.shape[-2] == 3 + return Rots(m[..., 0, 0], m[..., 0, 1], m[..., 0, 2], + m[..., 1, 0], m[..., 1, 1], m[..., 1, 2], + m[..., 2, 0], m[..., 2, 1], m[..., 2, 2]) + + +def rots_from_two_vecs(e0_unnormalized: Vecs, e1_unnormalized: Vecs) -> Rots: + """Create rotation matrices from unnormalized vectors for the x and y-axes. + + This creates a rotation matrix from two vectors using Gram-Schmidt + orthogonalization. + + Args: + e0_unnormalized: vectors lying along x-axis of resulting rotation + e1_unnormalized: vectors lying in xy-plane of resulting rotation + Returns: + Rotations resulting from Gram-Schmidt procedure. + """ + # Normalize the unit vector for the x-axis, e0. + e0 = vecs_robust_normalize(e0_unnormalized) + + # make e1 perpendicular to e0. + c = vecs_dot_vecs(e1_unnormalized, e0) + e1 = Vecs(e1_unnormalized.x - c * e0.x, + e1_unnormalized.y - c * e0.y, + e1_unnormalized.z - c * e0.z) + e1 = vecs_robust_normalize(e1) + + # Compute e2 as cross product of e0 and e1. + e2 = vecs_cross_vecs(e0, e1) + + return Rots(e0.x, e1.x, e2.x, e0.y, e1.y, e2.y, e0.z, e1.z, e2.z) + + +def rots_mul_rots(a: Rots, b: Rots) -> Rots: + """Composition of rotations 'a' and 'b'.""" + c0 = rots_mul_vecs(a, Vecs(b.xx, b.yx, b.zx)) + c1 = rots_mul_vecs(a, Vecs(b.xy, b.yy, b.zy)) + c2 = rots_mul_vecs(a, Vecs(b.xz, b.yz, b.zz)) + return Rots(c0.x, c1.x, c2.x, c0.y, c1.y, c2.y, c0.z, c1.z, c2.z) + + +def rots_mul_vecs(m: Rots, v: Vecs) -> Vecs: + """Apply rotations 'm' to vectors 'v'.""" + return Vecs(m.xx * v.x + m.xy * v.y + m.xz * v.z, + m.yx * v.x + m.yy * v.y + m.yz * v.z, + m.zx * v.x + m.zy * v.y + m.zz * v.z) + + +def vecs_add(v1: Vecs, v2: Vecs) -> Vecs: + """Add two vectors 'v1' and 'v2'.""" + return Vecs(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z) + + +def vecs_dot_vecs(v1: Vecs, v2: Vecs) -> jnp.ndarray: + """Dot product of vectors 'v1' and 'v2'.""" + return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z + + +def vecs_cross_vecs(v1: Vecs, v2: Vecs) -> Vecs: + """Cross product of vectors 'v1' and 'v2'.""" + return Vecs(v1.y * v2.z - v1.z * v2.y, + v1.z * v2.x - v1.x * v2.z, + v1.x * v2.y - v1.y * v2.x) + + +def vecs_from_tensor(x: jnp.ndarray # shape (..., 3) + ) -> Vecs: # shape (...) + """Converts from tensor of shape (3,) to Vecs.""" + num_components = x.shape[-1] + assert num_components == 3 + return Vecs(x[..., 0], x[..., 1], x[..., 2]) + + +def vecs_robust_normalize(v: Vecs, epsilon: float = 1e-8) -> Vecs: + """Normalizes vectors 'v'. + + Args: + v: vectors to be normalized. + epsilon: small regularizer added to squared norm before taking square root. + Returns: + normalized vectors + """ + norms = vecs_robust_norm(v, epsilon) + return Vecs(v.x / norms, v.y / norms, v.z / norms) + + +def vecs_robust_norm(v: Vecs, epsilon: float = 1e-8) -> jnp.ndarray: + """Computes norm of vectors 'v'. + + Args: + v: vectors to be normalized. + epsilon: small regularizer added to squared norm before taking square root. + Returns: + norm of 'v' + """ + return jnp.sqrt(jnp.square(v.x) + jnp.square(v.y) + jnp.square(v.z) + epsilon) + + +def vecs_sub(v1: Vecs, v2: Vecs) -> Vecs: + """Computes v1 - v2.""" + return Vecs(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z) + + +def vecs_squared_distance(v1: Vecs, v2: Vecs) -> jnp.ndarray: + """Computes squared euclidean difference between 'v1' and 'v2'.""" + return (squared_difference(v1.x, v2.x) + + squared_difference(v1.y, v2.y) + + squared_difference(v1.z, v2.z)) + + +def vecs_to_tensor(v: Vecs # shape (...) + ) -> jnp.ndarray: # shape(..., 3) + """Converts 'v' to tensor with shape 3, inverse of 'vecs_from_tensor'.""" + return jnp.stack([v.x, v.y, v.z], axis=-1) diff --git a/alphafold/alphafold/model/tf/__init__.py b/alphafold/alphafold/model/tf/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..6c520687f67754b0488690287f941854c8cf6133 --- /dev/null +++ b/alphafold/alphafold/model/tf/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. +"""Alphafold model TensorFlow code.""" diff --git a/alphafold/alphafold/model/tf/__pycache__/__init__.cpython-36.pyc b/alphafold/alphafold/model/tf/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7318732e4fea0e9f3e58fdbfb6b21c95138123c1 Binary files /dev/null and b/alphafold/alphafold/model/tf/__pycache__/__init__.cpython-36.pyc differ diff --git a/alphafold/alphafold/model/tf/__pycache__/__init__.cpython-38.pyc b/alphafold/alphafold/model/tf/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec4053676e0fb8f11090ca5ded00cb43697a71a6 Binary files /dev/null and b/alphafold/alphafold/model/tf/__pycache__/__init__.cpython-38.pyc differ diff --git a/alphafold/alphafold/model/tf/__pycache__/data_transforms.cpython-36.pyc b/alphafold/alphafold/model/tf/__pycache__/data_transforms.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67fd182c6ee28334d24d6d2b616cb71d986dc851 Binary files /dev/null and b/alphafold/alphafold/model/tf/__pycache__/data_transforms.cpython-36.pyc differ diff --git a/alphafold/alphafold/model/tf/__pycache__/data_transforms.cpython-38.pyc b/alphafold/alphafold/model/tf/__pycache__/data_transforms.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2588daf3f82109e2692629753bfaf4ac8702182 Binary files /dev/null and b/alphafold/alphafold/model/tf/__pycache__/data_transforms.cpython-38.pyc differ diff --git a/alphafold/alphafold/model/tf/__pycache__/input_pipeline.cpython-36.pyc b/alphafold/alphafold/model/tf/__pycache__/input_pipeline.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2fd144b8cb9ea2f91648125f741287b1e1c0fdab Binary files /dev/null and b/alphafold/alphafold/model/tf/__pycache__/input_pipeline.cpython-36.pyc differ diff --git a/alphafold/alphafold/model/tf/__pycache__/input_pipeline.cpython-38.pyc b/alphafold/alphafold/model/tf/__pycache__/input_pipeline.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7fd2f36551ce514be34d0a6017fe70ad556a0260 Binary files /dev/null and b/alphafold/alphafold/model/tf/__pycache__/input_pipeline.cpython-38.pyc differ diff --git a/alphafold/alphafold/model/tf/__pycache__/protein_features.cpython-36.pyc b/alphafold/alphafold/model/tf/__pycache__/protein_features.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7f67ef67eb6369a7116e50f198ec84695dbc9098 Binary files /dev/null and b/alphafold/alphafold/model/tf/__pycache__/protein_features.cpython-36.pyc differ diff --git a/alphafold/alphafold/model/tf/__pycache__/protein_features.cpython-38.pyc b/alphafold/alphafold/model/tf/__pycache__/protein_features.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4328cfeba294db24b5b631f0a49586ebe2dd7868 Binary files /dev/null and b/alphafold/alphafold/model/tf/__pycache__/protein_features.cpython-38.pyc differ diff --git a/alphafold/alphafold/model/tf/__pycache__/proteins_dataset.cpython-36.pyc b/alphafold/alphafold/model/tf/__pycache__/proteins_dataset.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e965888399250555aeed1fd24e1cdec2b8f43eb Binary files /dev/null and b/alphafold/alphafold/model/tf/__pycache__/proteins_dataset.cpython-36.pyc differ diff --git a/alphafold/alphafold/model/tf/__pycache__/proteins_dataset.cpython-38.pyc b/alphafold/alphafold/model/tf/__pycache__/proteins_dataset.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..936ff70ce499f0af849f1e071b1a1ed69c495a88 Binary files /dev/null and b/alphafold/alphafold/model/tf/__pycache__/proteins_dataset.cpython-38.pyc differ diff --git a/alphafold/alphafold/model/tf/__pycache__/shape_helpers.cpython-36.pyc b/alphafold/alphafold/model/tf/__pycache__/shape_helpers.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70ac8806b0ff4ba38d6d07bf01ee03257a22ede6 Binary files /dev/null and b/alphafold/alphafold/model/tf/__pycache__/shape_helpers.cpython-36.pyc differ diff --git a/alphafold/alphafold/model/tf/__pycache__/shape_helpers.cpython-38.pyc b/alphafold/alphafold/model/tf/__pycache__/shape_helpers.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d5cdf976e874a6c5743c3b32c3620e56d57cb7a3 Binary files /dev/null and b/alphafold/alphafold/model/tf/__pycache__/shape_helpers.cpython-38.pyc differ diff --git a/alphafold/alphafold/model/tf/__pycache__/shape_placeholders.cpython-36.pyc b/alphafold/alphafold/model/tf/__pycache__/shape_placeholders.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd0934fa4ac491f9039187176207ecefc3c4988b Binary files /dev/null and b/alphafold/alphafold/model/tf/__pycache__/shape_placeholders.cpython-36.pyc differ diff --git a/alphafold/alphafold/model/tf/__pycache__/shape_placeholders.cpython-38.pyc b/alphafold/alphafold/model/tf/__pycache__/shape_placeholders.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a4fe67955de4d0abf9b1bfdef690878e2ee93f92 Binary files /dev/null and b/alphafold/alphafold/model/tf/__pycache__/shape_placeholders.cpython-38.pyc differ diff --git a/alphafold/alphafold/model/tf/__pycache__/utils.cpython-36.pyc b/alphafold/alphafold/model/tf/__pycache__/utils.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bbcdabc992bad6aad1439fcd5b71d576f046e019 Binary files /dev/null and b/alphafold/alphafold/model/tf/__pycache__/utils.cpython-36.pyc differ diff --git a/alphafold/alphafold/model/tf/__pycache__/utils.cpython-38.pyc b/alphafold/alphafold/model/tf/__pycache__/utils.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1454e5b057a69fc1b2ceac6d1ed7797d039a1473 Binary files /dev/null and b/alphafold/alphafold/model/tf/__pycache__/utils.cpython-38.pyc differ diff --git a/alphafold/alphafold/model/tf/data_transforms.py b/alphafold/alphafold/model/tf/data_transforms.py new file mode 100644 index 0000000000000000000000000000000000000000..7af966ef4b7cb469f2b817a16ad42eea50f31e18 --- /dev/null +++ b/alphafold/alphafold/model/tf/data_transforms.py @@ -0,0 +1,625 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Data for AlphaFold.""" + +from alphafold.common import residue_constants +from alphafold.model.tf import shape_helpers +from alphafold.model.tf import shape_placeholders +from alphafold.model.tf import utils +import numpy as np +import tensorflow.compat.v1 as tf + +# Pylint gets confused by the curry1 decorator because it changes the number +# of arguments to the function. +# pylint:disable=no-value-for-parameter + + +NUM_RES = shape_placeholders.NUM_RES +NUM_MSA_SEQ = shape_placeholders.NUM_MSA_SEQ +NUM_EXTRA_SEQ = shape_placeholders.NUM_EXTRA_SEQ +NUM_TEMPLATES = shape_placeholders.NUM_TEMPLATES + + +def cast_64bit_ints(protein): + + for k, v in protein.items(): + if v.dtype == tf.int64: + protein[k] = tf.cast(v, tf.int32) + return protein + + +_MSA_FEATURE_NAMES = [ + 'msa', 'deletion_matrix', 'msa_mask', 'msa_row_mask', 'bert_mask', + 'true_msa' +] + + +def make_seq_mask(protein): + protein['seq_mask'] = tf.ones( + shape_helpers.shape_list(protein['aatype']), dtype=tf.float32) + return protein + + +def make_template_mask(protein): + protein['template_mask'] = tf.ones( + shape_helpers.shape_list(protein['template_domain_names']), + dtype=tf.float32) + return protein + + +def curry1(f): + """Supply all arguments but the first.""" + + def fc(*args, **kwargs): + return lambda x: f(x, *args, **kwargs) + + return fc + + +@curry1 +def add_distillation_flag(protein, distillation): + protein['is_distillation'] = tf.constant(float(distillation), + shape=[], + dtype=tf.float32) + return protein + + +def make_all_atom_aatype(protein): + protein['all_atom_aatype'] = protein['aatype'] + return protein + + +def fix_templates_aatype(protein): + """Fixes aatype encoding of templates.""" + # Map one-hot to indices. + protein['template_aatype'] = tf.argmax( + protein['template_aatype'], output_type=tf.int32, axis=-1) + # Map hhsearch-aatype to our aatype. + new_order_list = residue_constants.MAP_HHBLITS_AATYPE_TO_OUR_AATYPE + new_order = tf.constant(new_order_list, dtype=tf.int32) + protein['template_aatype'] = tf.gather(params=new_order, + indices=protein['template_aatype']) + return protein + + +def correct_msa_restypes(protein): + """Correct MSA restype to have the same order as residue_constants.""" + new_order_list = residue_constants.MAP_HHBLITS_AATYPE_TO_OUR_AATYPE + new_order = tf.constant(new_order_list, dtype=protein['msa'].dtype) + protein['msa'] = tf.gather(new_order, protein['msa'], axis=0) + + perm_matrix = np.zeros((22, 22), dtype=np.float32) + perm_matrix[range(len(new_order_list)), new_order_list] = 1. + + for k in protein: + if 'profile' in k: # Include both hhblits and psiblast profiles + num_dim = protein[k].shape.as_list()[-1] + assert num_dim in [20, 21, 22], ( + 'num_dim for %s out of expected range: %s' % (k, num_dim)) + protein[k] = tf.tensordot(protein[k], perm_matrix[:num_dim, :num_dim], 1) + return protein + + +def squeeze_features(protein): + """Remove singleton and repeated dimensions in protein features.""" + protein['aatype'] = tf.argmax( + protein['aatype'], axis=-1, output_type=tf.int32) + for k in [ + 'domain_name', 'msa', 'num_alignments', 'seq_length', 'sequence', + 'superfamily', 'deletion_matrix', 'resolution', + 'between_segment_residues', 'residue_index', 'template_all_atom_masks']: + if k in protein: + final_dim = shape_helpers.shape_list(protein[k])[-1] + if isinstance(final_dim, int) and final_dim == 1: + protein[k] = tf.squeeze(protein[k], axis=-1) + + for k in ['seq_length', 'num_alignments']: + if k in protein: + protein[k] = protein[k][0] # Remove fake sequence dimension + return protein + + +def make_random_crop_to_size_seed(protein): + """Random seed for cropping residues and templates.""" + protein['random_crop_to_size_seed'] = utils.make_random_seed() + return protein + + +@curry1 +def randomly_replace_msa_with_unknown(protein, replace_proportion): + """Replace a proportion of the MSA with 'X'.""" + msa_mask = (tf.random.uniform(shape_helpers.shape_list(protein['msa'])) < + replace_proportion) + x_idx = 20 + gap_idx = 21 + msa_mask = tf.logical_and(msa_mask, protein['msa'] != gap_idx) + protein['msa'] = tf.where(msa_mask, + tf.ones_like(protein['msa']) * x_idx, + protein['msa']) + aatype_mask = ( + tf.random.uniform(shape_helpers.shape_list(protein['aatype'])) < + replace_proportion) + + protein['aatype'] = tf.where(aatype_mask, + tf.ones_like(protein['aatype']) * x_idx, + protein['aatype']) + return protein + + +@curry1 +def sample_msa(protein, max_seq, keep_extra): + """Sample MSA randomly, remaining sequences are stored as `extra_*`. + + Args: + protein: batch to sample msa from. + max_seq: number of sequences to sample. + keep_extra: When True sequences not sampled are put into fields starting + with 'extra_*'. + + Returns: + Protein with sampled msa. + """ + num_seq = tf.shape(protein['msa'])[0] + shuffled = tf.random_shuffle(tf.range(1, num_seq)) + index_order = tf.concat([[0], shuffled], axis=0) + num_sel = tf.minimum(max_seq, num_seq) + + sel_seq, not_sel_seq = tf.split(index_order, [num_sel, num_seq - num_sel]) + + for k in _MSA_FEATURE_NAMES: + if k in protein: + if keep_extra: + protein['extra_' + k] = tf.gather(protein[k], not_sel_seq) + protein[k] = tf.gather(protein[k], sel_seq) + + return protein + + +@curry1 +def crop_extra_msa(protein, max_extra_msa): + """MSA features are cropped so only `max_extra_msa` sequences are kept.""" + num_seq = tf.shape(protein['extra_msa'])[0] + num_sel = tf.minimum(max_extra_msa, num_seq) + select_indices = tf.random_shuffle(tf.range(0, num_seq))[:num_sel] + for k in _MSA_FEATURE_NAMES: + if 'extra_' + k in protein: + protein['extra_' + k] = tf.gather(protein['extra_' + k], select_indices) + + return protein + + +def delete_extra_msa(protein): + for k in _MSA_FEATURE_NAMES: + if 'extra_' + k in protein: + del protein['extra_' + k] + return protein + + +@curry1 +def block_delete_msa(protein, config): + """Sample MSA by deleting contiguous blocks. + + Jumper et al. (2021) Suppl. Alg. 1 "MSABlockDeletion" + + Arguments: + protein: batch dict containing the msa + config: ConfigDict with parameters + + Returns: + updated protein + """ + num_seq = shape_helpers.shape_list(protein['msa'])[0] + block_num_seq = tf.cast( + tf.floor(tf.cast(num_seq, tf.float32) * config.msa_fraction_per_block), + tf.int32) + + if config.randomize_num_blocks: + nb = tf.random.uniform([], 0, config.num_blocks + 1, dtype=tf.int32) + else: + nb = config.num_blocks + + del_block_starts = tf.random.uniform([nb], 0, num_seq, dtype=tf.int32) + del_blocks = del_block_starts[:, None] + tf.range(block_num_seq) + del_blocks = tf.clip_by_value(del_blocks, 0, num_seq - 1) + del_indices = tf.unique(tf.sort(tf.reshape(del_blocks, [-1])))[0] + + # Make sure we keep the original sequence + sparse_diff = tf.sets.difference(tf.range(1, num_seq)[None], + del_indices[None]) + keep_indices = tf.squeeze(tf.sparse.to_dense(sparse_diff), 0) + keep_indices = tf.concat([[0], keep_indices], axis=0) + + for k in _MSA_FEATURE_NAMES: + if k in protein: + protein[k] = tf.gather(protein[k], keep_indices) + + return protein + + +@curry1 +def nearest_neighbor_clusters(protein, gap_agreement_weight=0.): + """Assign each extra MSA sequence to its nearest neighbor in sampled MSA.""" + + # Determine how much weight we assign to each agreement. In theory, we could + # use a full blosum matrix here, but right now let's just down-weight gap + # agreement because it could be spurious. + # Never put weight on agreeing on BERT mask + weights = tf.concat([ + tf.ones(21), + gap_agreement_weight * tf.ones(1), + np.zeros(1)], 0) + + # Make agreement score as weighted Hamming distance + sample_one_hot = (protein['msa_mask'][:, :, None] * + tf.one_hot(protein['msa'], 23)) + extra_one_hot = (protein['extra_msa_mask'][:, :, None] * + tf.one_hot(protein['extra_msa'], 23)) + + num_seq, num_res, _ = shape_helpers.shape_list(sample_one_hot) + extra_num_seq, _, _ = shape_helpers.shape_list(extra_one_hot) + + # Compute tf.einsum('mrc,nrc,c->mn', sample_one_hot, extra_one_hot, weights) + # in an optimized fashion to avoid possible memory or computation blowup. + agreement = tf.matmul( + tf.reshape(extra_one_hot, [extra_num_seq, num_res * 23]), + tf.reshape(sample_one_hot * weights, [num_seq, num_res * 23]), + transpose_b=True) + + # Assign each sequence in the extra sequences to the closest MSA sample + protein['extra_cluster_assignment'] = tf.argmax( + agreement, axis=1, output_type=tf.int32) + + return protein + + +@curry1 +def summarize_clusters(protein): + """Produce profile and deletion_matrix_mean within each cluster.""" + num_seq = shape_helpers.shape_list(protein['msa'])[0] + def csum(x): + return tf.math.unsorted_segment_sum( + x, protein['extra_cluster_assignment'], num_seq) + + mask = protein['extra_msa_mask'] + mask_counts = 1e-6 + protein['msa_mask'] + csum(mask) # Include center + + msa_sum = csum(mask[:, :, None] * tf.one_hot(protein['extra_msa'], 23)) + msa_sum += tf.one_hot(protein['msa'], 23) # Original sequence + protein['cluster_profile'] = msa_sum / mask_counts[:, :, None] + + del msa_sum + + del_sum = csum(mask * protein['extra_deletion_matrix']) + del_sum += protein['deletion_matrix'] # Original sequence + protein['cluster_deletion_mean'] = del_sum / mask_counts + del del_sum + + return protein + + +def make_msa_mask(protein): + """Mask features are all ones, but will later be zero-padded.""" + protein['msa_mask'] = tf.ones( + shape_helpers.shape_list(protein['msa']), dtype=tf.float32) + protein['msa_row_mask'] = tf.ones( + shape_helpers.shape_list(protein['msa'])[0], dtype=tf.float32) + return protein + + +def pseudo_beta_fn(aatype, all_atom_positions, all_atom_masks): + """Create pseudo beta features.""" + is_gly = tf.equal(aatype, residue_constants.restype_order['G']) + ca_idx = residue_constants.atom_order['CA'] + cb_idx = residue_constants.atom_order['CB'] + pseudo_beta = tf.where( + tf.tile(is_gly[..., None], [1] * len(is_gly.shape) + [3]), + all_atom_positions[..., ca_idx, :], + all_atom_positions[..., cb_idx, :]) + + if all_atom_masks is not None: + pseudo_beta_mask = tf.where( + is_gly, all_atom_masks[..., ca_idx], all_atom_masks[..., cb_idx]) + pseudo_beta_mask = tf.cast(pseudo_beta_mask, tf.float32) + return pseudo_beta, pseudo_beta_mask + else: + return pseudo_beta + + +@curry1 +def make_pseudo_beta(protein, prefix=''): + """Create pseudo-beta (alpha for glycine) position and mask.""" + assert prefix in ['', 'template_'] + protein[prefix + 'pseudo_beta'], protein[prefix + 'pseudo_beta_mask'] = ( + pseudo_beta_fn( + protein['template_aatype' if prefix else 'all_atom_aatype'], + protein[prefix + 'all_atom_positions'], + protein['template_all_atom_masks' if prefix else 'all_atom_mask'])) + return protein + + +@curry1 +def add_constant_field(protein, key, value): + protein[key] = tf.convert_to_tensor(value) + return protein + + +def shaped_categorical(probs, epsilon=1e-10): + ds = shape_helpers.shape_list(probs) + num_classes = ds[-1] + counts = tf.random.categorical( + tf.reshape(tf.log(probs + epsilon), [-1, num_classes]), + 1, + dtype=tf.int32) + return tf.reshape(counts, ds[:-1]) + + +def make_hhblits_profile(protein): + """Compute the HHblits MSA profile if not already present.""" + if 'hhblits_profile' in protein: + return protein + + # Compute the profile for every residue (over all MSA sequences). + protein['hhblits_profile'] = tf.reduce_mean( + tf.one_hot(protein['msa'], 22), axis=0) + return protein + + +@curry1 +def make_masked_msa(protein, config, replace_fraction): + """Create data for BERT on raw MSA.""" + # Add a random amino acid uniformly + random_aa = tf.constant([0.05] * 20 + [0., 0.], dtype=tf.float32) + + categorical_probs = ( + config.uniform_prob * random_aa + + config.profile_prob * protein['hhblits_profile'] + + config.same_prob * tf.one_hot(protein['msa'], 22)) + + # Put all remaining probability on [MASK] which is a new column + pad_shapes = [[0, 0] for _ in range(len(categorical_probs.shape))] + pad_shapes[-1][1] = 1 + mask_prob = 1. - config.profile_prob - config.same_prob - config.uniform_prob + assert mask_prob >= 0. + categorical_probs = tf.pad( + categorical_probs, pad_shapes, constant_values=mask_prob) + + sh = shape_helpers.shape_list(protein['msa']) + mask_position = tf.random.uniform(sh) < replace_fraction + + bert_msa = shaped_categorical(categorical_probs) + bert_msa = tf.where(mask_position, bert_msa, protein['msa']) + + # Mix real and masked MSA + protein['bert_mask'] = tf.cast(mask_position, tf.float32) + protein['true_msa'] = protein['msa'] + protein['msa'] = bert_msa + + return protein + + +@curry1 +def make_fixed_size(protein, shape_schema, msa_cluster_size, extra_msa_size, + num_res, num_templates=0): + """Guess at the MSA and sequence dimensions to make fixed size.""" + + pad_size_map = { + NUM_RES: num_res, + NUM_MSA_SEQ: msa_cluster_size, + NUM_EXTRA_SEQ: extra_msa_size, + NUM_TEMPLATES: num_templates, + } + + for k, v in protein.items(): + # Don't transfer this to the accelerator. + if k == 'extra_cluster_assignment': + continue + shape = v.shape.as_list() + schema = shape_schema[k] + assert len(shape) == len(schema), ( + f'Rank mismatch between shape and shape schema for {k}: ' + f'{shape} vs {schema}') + pad_size = [ + pad_size_map.get(s2, None) or s1 for (s1, s2) in zip(shape, schema) + ] + padding = [(0, p - tf.shape(v)[i]) for i, p in enumerate(pad_size)] + if padding: + protein[k] = tf.pad( + v, padding, name=f'pad_to_fixed_{k}') + protein[k].set_shape(pad_size) + + return protein + + +@curry1 +def make_msa_feat(protein): + """Create and concatenate MSA features.""" + # Whether there is a domain break. Always zero for chains, but keeping + # for compatibility with domain datasets. + has_break = tf.clip_by_value( + tf.cast(protein['between_segment_residues'], tf.float32), + 0, 1) + aatype_1hot = tf.one_hot(protein['aatype'], 21, axis=-1) + + target_feat = [ + tf.expand_dims(has_break, axis=-1), + aatype_1hot, # Everyone gets the original sequence. + ] + + msa_1hot = tf.one_hot(protein['msa'], 23, axis=-1) + has_deletion = tf.clip_by_value(protein['deletion_matrix'], 0., 1.) + deletion_value = tf.atan(protein['deletion_matrix'] / 3.) * (2. / np.pi) + + msa_feat = [ + msa_1hot, + tf.expand_dims(has_deletion, axis=-1), + tf.expand_dims(deletion_value, axis=-1), + ] + + if 'cluster_profile' in protein: + deletion_mean_value = ( + tf.atan(protein['cluster_deletion_mean'] / 3.) * (2. / np.pi)) + msa_feat.extend([ + protein['cluster_profile'], + tf.expand_dims(deletion_mean_value, axis=-1), + ]) + + if 'extra_deletion_matrix' in protein: + protein['extra_has_deletion'] = tf.clip_by_value( + protein['extra_deletion_matrix'], 0., 1.) + protein['extra_deletion_value'] = tf.atan( + protein['extra_deletion_matrix'] / 3.) * (2. / np.pi) + + protein['msa_feat'] = tf.concat(msa_feat, axis=-1) + protein['target_feat'] = tf.concat(target_feat, axis=-1) + return protein + + +@curry1 +def select_feat(protein, feature_list): + return {k: v for k, v in protein.items() if k in feature_list} + + +@curry1 +def crop_templates(protein, max_templates): + for k, v in protein.items(): + if k.startswith('template_'): + protein[k] = v[:max_templates] + return protein + + +@curry1 +def random_crop_to_size(protein, crop_size, max_templates, shape_schema, + subsample_templates=False): + """Crop randomly to `crop_size`, or keep as is if shorter than that.""" + seq_length = protein['seq_length'] + if 'template_mask' in protein: + num_templates = tf.cast( + shape_helpers.shape_list(protein['template_mask'])[0], tf.int32) + else: + num_templates = tf.constant(0, dtype=tf.int32) + num_res_crop_size = tf.math.minimum(seq_length, crop_size) + + # Ensures that the cropping of residues and templates happens in the same way + # across ensembling iterations. + # Do not use for randomness that should vary in ensembling. + seed_maker = utils.SeedMaker(initial_seed=protein['random_crop_to_size_seed']) + + if subsample_templates: + templates_crop_start = tf.random.stateless_uniform( + shape=(), minval=0, maxval=num_templates + 1, dtype=tf.int32, + seed=seed_maker()) + else: + templates_crop_start = 0 + + num_templates_crop_size = tf.math.minimum( + num_templates - templates_crop_start, max_templates) + + num_res_crop_start = tf.random.stateless_uniform( + shape=(), minval=0, maxval=seq_length - num_res_crop_size + 1, + dtype=tf.int32, seed=seed_maker()) + + templates_select_indices = tf.argsort(tf.random.stateless_uniform( + [num_templates], seed=seed_maker())) + + for k, v in protein.items(): + if k not in shape_schema or ( + 'template' not in k and NUM_RES not in shape_schema[k]): + continue + + # randomly permute the templates before cropping them. + if k.startswith('template') and subsample_templates: + v = tf.gather(v, templates_select_indices) + + crop_sizes = [] + crop_starts = [] + for i, (dim_size, dim) in enumerate(zip(shape_schema[k], + shape_helpers.shape_list(v))): + is_num_res = (dim_size == NUM_RES) + if i == 0 and k.startswith('template'): + crop_size = num_templates_crop_size + crop_start = templates_crop_start + else: + crop_start = num_res_crop_start if is_num_res else 0 + crop_size = (num_res_crop_size if is_num_res else + (-1 if dim is None else dim)) + crop_sizes.append(crop_size) + crop_starts.append(crop_start) + protein[k] = tf.slice(v, crop_starts, crop_sizes) + + protein['seq_length'] = num_res_crop_size + return protein + + +def make_atom14_masks(protein): + """Construct denser atom positions (14 dimensions instead of 37).""" + restype_atom14_to_atom37 = [] # mapping (restype, atom14) --> atom37 + restype_atom37_to_atom14 = [] # mapping (restype, atom37) --> atom14 + restype_atom14_mask = [] + + for rt in residue_constants.restypes: + atom_names = residue_constants.restype_name_to_atom14_names[ + residue_constants.restype_1to3[rt]] + + restype_atom14_to_atom37.append([ + (residue_constants.atom_order[name] if name else 0) + for name in atom_names + ]) + + atom_name_to_idx14 = {name: i for i, name in enumerate(atom_names)} + restype_atom37_to_atom14.append([ + (atom_name_to_idx14[name] if name in atom_name_to_idx14 else 0) + for name in residue_constants.atom_types + ]) + + restype_atom14_mask.append([(1. if name else 0.) for name in atom_names]) + + # Add dummy mapping for restype 'UNK' + restype_atom14_to_atom37.append([0] * 14) + restype_atom37_to_atom14.append([0] * 37) + restype_atom14_mask.append([0.] * 14) + + restype_atom14_to_atom37 = np.array(restype_atom14_to_atom37, dtype=np.int32) + restype_atom37_to_atom14 = np.array(restype_atom37_to_atom14, dtype=np.int32) + restype_atom14_mask = np.array(restype_atom14_mask, dtype=np.float32) + + # create the mapping for (residx, atom14) --> atom37, i.e. an array + # with shape (num_res, 14) containing the atom37 indices for this protein + residx_atom14_to_atom37 = tf.gather(restype_atom14_to_atom37, + protein['aatype']) + residx_atom14_mask = tf.gather(restype_atom14_mask, + protein['aatype']) + + protein['atom14_atom_exists'] = residx_atom14_mask + protein['residx_atom14_to_atom37'] = residx_atom14_to_atom37 + + # create the gather indices for mapping back + residx_atom37_to_atom14 = tf.gather(restype_atom37_to_atom14, + protein['aatype']) + protein['residx_atom37_to_atom14'] = residx_atom37_to_atom14 + + # create the corresponding mask + restype_atom37_mask = np.zeros([21, 37], dtype=np.float32) + for restype, restype_letter in enumerate(residue_constants.restypes): + restype_name = residue_constants.restype_1to3[restype_letter] + atom_names = residue_constants.residue_atoms[restype_name] + for atom_name in atom_names: + atom_type = residue_constants.atom_order[atom_name] + restype_atom37_mask[restype, atom_type] = 1 + + residx_atom37_mask = tf.gather(restype_atom37_mask, + protein['aatype']) + protein['atom37_atom_exists'] = residx_atom37_mask + + return protein diff --git a/alphafold/alphafold/model/tf/input_pipeline.py b/alphafold/alphafold/model/tf/input_pipeline.py new file mode 100644 index 0000000000000000000000000000000000000000..e9a9bc3a8aa15316aa88c3947120883be869331e --- /dev/null +++ b/alphafold/alphafold/model/tf/input_pipeline.py @@ -0,0 +1,166 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Feature pre-processing input pipeline for AlphaFold.""" + +from alphafold.model.tf import data_transforms +from alphafold.model.tf import shape_placeholders +import tensorflow.compat.v1 as tf +import tree + +# Pylint gets confused by the curry1 decorator because it changes the number +# of arguments to the function. +# pylint:disable=no-value-for-parameter + + +NUM_RES = shape_placeholders.NUM_RES +NUM_MSA_SEQ = shape_placeholders.NUM_MSA_SEQ +NUM_EXTRA_SEQ = shape_placeholders.NUM_EXTRA_SEQ +NUM_TEMPLATES = shape_placeholders.NUM_TEMPLATES + + +def nonensembled_map_fns(data_config): + """Input pipeline functions which are not ensembled.""" + common_cfg = data_config.common + + map_fns = [ + data_transforms.correct_msa_restypes, + data_transforms.add_distillation_flag(False), + data_transforms.cast_64bit_ints, + data_transforms.squeeze_features, + # Keep to not disrupt RNG. + data_transforms.randomly_replace_msa_with_unknown(0.0), + data_transforms.make_seq_mask, + data_transforms.make_msa_mask, + # Compute the HHblits profile if it's not set. This has to be run before + # sampling the MSA. + data_transforms.make_hhblits_profile, + data_transforms.make_random_crop_to_size_seed, + ] + if common_cfg.use_templates: + map_fns.extend([ + data_transforms.fix_templates_aatype, + data_transforms.make_template_mask, + data_transforms.make_pseudo_beta('template_') + ]) + map_fns.extend([ + data_transforms.make_atom14_masks, + ]) + + return map_fns + + +def ensembled_map_fns(data_config): + """Input pipeline functions that can be ensembled and averaged.""" + common_cfg = data_config.common + eval_cfg = data_config.eval + + map_fns = [] + + if common_cfg.reduce_msa_clusters_by_max_templates: + pad_msa_clusters = eval_cfg.max_msa_clusters - eval_cfg.max_templates + else: + pad_msa_clusters = eval_cfg.max_msa_clusters + + max_msa_clusters = pad_msa_clusters + max_extra_msa = common_cfg.max_extra_msa + + map_fns.append( + data_transforms.sample_msa( + max_msa_clusters, + keep_extra=True)) + + if 'masked_msa' in common_cfg: + # Masked MSA should come *before* MSA clustering so that + # the clustering and full MSA profile do not leak information about + # the masked locations and secret corrupted locations. + map_fns.append( + data_transforms.make_masked_msa(common_cfg.masked_msa, + eval_cfg.masked_msa_replace_fraction)) + + if common_cfg.msa_cluster_features: + map_fns.append(data_transforms.nearest_neighbor_clusters()) + map_fns.append(data_transforms.summarize_clusters()) + + # Crop after creating the cluster profiles. + if max_extra_msa: + map_fns.append(data_transforms.crop_extra_msa(max_extra_msa)) + else: + map_fns.append(data_transforms.delete_extra_msa) + + map_fns.append(data_transforms.make_msa_feat()) + + crop_feats = dict(eval_cfg.feat) + + if eval_cfg.fixed_size: + map_fns.append(data_transforms.select_feat(list(crop_feats))) + map_fns.append(data_transforms.random_crop_to_size( + eval_cfg.crop_size, + eval_cfg.max_templates, + crop_feats, + eval_cfg.subsample_templates)) + map_fns.append(data_transforms.make_fixed_size( + crop_feats, + pad_msa_clusters, + common_cfg.max_extra_msa, + eval_cfg.crop_size, + eval_cfg.max_templates)) + else: + map_fns.append(data_transforms.crop_templates(eval_cfg.max_templates)) + + return map_fns + + +def process_tensors_from_config(tensors, data_config): + """Apply filters and maps to an existing dataset, based on the config.""" + + def wrap_ensemble_fn(data, i): + """Function to be mapped over the ensemble dimension.""" + d = data.copy() + fns = ensembled_map_fns(data_config) + fn = compose(fns) + d['ensemble_index'] = i + return fn(d) + + eval_cfg = data_config.eval + tensors = compose( + nonensembled_map_fns( + data_config))( + tensors) + + tensors_0 = wrap_ensemble_fn(tensors, tf.constant(0)) + num_ensemble = eval_cfg.num_ensemble + if data_config.common.resample_msa_in_recycling: + # Separate batch per ensembling & recycling step. + num_ensemble *= data_config.common.num_recycle + 1 + + if isinstance(num_ensemble, tf.Tensor) or num_ensemble > 1: + fn_output_signature = tree.map_structure( + tf.TensorSpec.from_tensor, tensors_0) + tensors = tf.map_fn( + lambda x: wrap_ensemble_fn(tensors, x), + tf.range(num_ensemble), + parallel_iterations=1, + fn_output_signature=fn_output_signature) + else: + tensors = tree.map_structure(lambda x: x[None], + tensors_0) + return tensors + + +@data_transforms.curry1 +def compose(x, fs): + for f in fs: + x = f(x) + return x diff --git a/alphafold/alphafold/model/tf/protein_features.py b/alphafold/alphafold/model/tf/protein_features.py new file mode 100644 index 0000000000000000000000000000000000000000..c78cfa5ea50baa63f9fabcb3bc7c7b66d10a1fa0 --- /dev/null +++ b/alphafold/alphafold/model/tf/protein_features.py @@ -0,0 +1,129 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Contains descriptions of various protein features.""" +import enum +from typing import Dict, Optional, Sequence, Tuple, Union +from alphafold.common import residue_constants +import tensorflow.compat.v1 as tf + +# Type aliases. +FeaturesMetadata = Dict[str, Tuple[tf.dtypes.DType, Sequence[Union[str, int]]]] + + +class FeatureType(enum.Enum): + ZERO_DIM = 0 # Shape [x] + ONE_DIM = 1 # Shape [num_res, x] + TWO_DIM = 2 # Shape [num_res, num_res, x] + MSA = 3 # Shape [msa_length, num_res, x] + + +# Placeholder values that will be replaced with their true value at runtime. +NUM_RES = "num residues placeholder" +NUM_SEQ = "length msa placeholder" +NUM_TEMPLATES = "num templates placeholder" +# Sizes of the protein features, NUM_RES and NUM_SEQ are allowed as placeholders +# to be replaced with the number of residues and the number of sequences in the +# multiple sequence alignment, respectively. + + +FEATURES = { + #### Static features of a protein sequence #### + "aatype": (tf.float32, [NUM_RES, 21]), + "between_segment_residues": (tf.int64, [NUM_RES, 1]), + "deletion_matrix": (tf.float32, [NUM_SEQ, NUM_RES, 1]), + "domain_name": (tf.string, [1]), + "msa": (tf.int64, [NUM_SEQ, NUM_RES, 1]), + "num_alignments": (tf.int64, [NUM_RES, 1]), + "residue_index": (tf.int64, [NUM_RES, 1]), + "seq_length": (tf.int64, [NUM_RES, 1]), + "sequence": (tf.string, [1]), + "all_atom_positions": (tf.float32, + [NUM_RES, residue_constants.atom_type_num, 3]), + "all_atom_mask": (tf.int64, [NUM_RES, residue_constants.atom_type_num]), + "resolution": (tf.float32, [1]), + "template_domain_names": (tf.string, [NUM_TEMPLATES]), + "template_sum_probs": (tf.float32, [NUM_TEMPLATES, 1]), + "template_aatype": (tf.float32, [NUM_TEMPLATES, NUM_RES, 22]), + "template_all_atom_positions": (tf.float32, [ + NUM_TEMPLATES, NUM_RES, residue_constants.atom_type_num, 3 + ]), + "template_all_atom_masks": (tf.float32, [ + NUM_TEMPLATES, NUM_RES, residue_constants.atom_type_num, 1 + ]), +} + +FEATURE_TYPES = {k: v[0] for k, v in FEATURES.items()} +FEATURE_SIZES = {k: v[1] for k, v in FEATURES.items()} + + +def register_feature(name: str, + type_: tf.dtypes.DType, + shape_: Tuple[Union[str, int]]): + """Register extra features used in custom datasets.""" + FEATURES[name] = (type_, shape_) + FEATURE_TYPES[name] = type_ + FEATURE_SIZES[name] = shape_ + + +def shape(feature_name: str, + num_residues: int, + msa_length: int, + num_templates: Optional[int] = None, + features: Optional[FeaturesMetadata] = None): + """Get the shape for the given feature name. + + This is near identical to _get_tf_shape_no_placeholders() but with 2 + differences: + * This method does not calculate a single placeholder from the total number of + elements (eg given and size := 12, this won't deduce NUM_RES + must be 4) + * This method will work with tensors + + Args: + feature_name: String identifier for the feature. If the feature name ends + with "_unnormalized", this suffix is stripped off. + num_residues: The number of residues in the current domain - some elements + of the shape can be dynamic and will be replaced by this value. + msa_length: The number of sequences in the multiple sequence alignment, some + elements of the shape can be dynamic and will be replaced by this value. + If the number of alignments is unknown / not read, please pass None for + msa_length. + num_templates (optional): The number of templates in this tfexample. + features: A feature_name to (tf_dtype, shape) lookup; defaults to FEATURES. + + Returns: + List of ints representation the tensor size. + + Raises: + ValueError: If a feature is requested but no concrete placeholder value is + given. + """ + features = features or FEATURES + if feature_name.endswith("_unnormalized"): + feature_name = feature_name[:-13] + + unused_dtype, raw_sizes = features[feature_name] + replacements = {NUM_RES: num_residues, + NUM_SEQ: msa_length} + + if num_templates is not None: + replacements[NUM_TEMPLATES] = num_templates + + sizes = [replacements.get(dimension, dimension) for dimension in raw_sizes] + for dimension in sizes: + if isinstance(dimension, str): + raise ValueError("Could not parse %s (shape: %s) with values: %s" % ( + feature_name, raw_sizes, replacements)) + return sizes diff --git a/alphafold/alphafold/model/tf/protein_features_test.py b/alphafold/alphafold/model/tf/protein_features_test.py new file mode 100644 index 0000000000000000000000000000000000000000..ee88711281f5cfb366ab26b10c75f37b211120ea --- /dev/null +++ b/alphafold/alphafold/model/tf/protein_features_test.py @@ -0,0 +1,51 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Tests for protein_features.""" +import uuid + +from absl.testing import absltest +from absl.testing import parameterized +from alphafold.model.tf import protein_features +import tensorflow.compat.v1 as tf + + +def _random_bytes(): + return str(uuid.uuid4()).encode('utf-8') + + +class FeaturesTest(parameterized.TestCase, tf.test.TestCase): + + def testFeatureNames(self): + self.assertEqual(len(protein_features.FEATURE_SIZES), + len(protein_features.FEATURE_TYPES)) + sorted_size_names = sorted(protein_features.FEATURE_SIZES.keys()) + sorted_type_names = sorted(protein_features.FEATURE_TYPES.keys()) + for i, size_name in enumerate(sorted_size_names): + self.assertEqual(size_name, sorted_type_names[i]) + + def testReplacement(self): + for name in protein_features.FEATURE_SIZES.keys(): + sizes = protein_features.shape(name, + num_residues=12, + msa_length=24, + num_templates=3) + for x in sizes: + self.assertEqual(type(x), int) + self.assertGreater(x, 0) + + +if __name__ == '__main__': + tf.disable_v2_behavior() + absltest.main() diff --git a/alphafold/alphafold/model/tf/proteins_dataset.py b/alphafold/alphafold/model/tf/proteins_dataset.py new file mode 100644 index 0000000000000000000000000000000000000000..e0b1c038a41c6e276275a7904e748ea9e31e6083 --- /dev/null +++ b/alphafold/alphafold/model/tf/proteins_dataset.py @@ -0,0 +1,166 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Datasets consisting of proteins.""" +from typing import Dict, Mapping, Optional, Sequence +from alphafold.model.tf import protein_features +import numpy as np +import tensorflow.compat.v1 as tf + +TensorDict = Dict[str, tf.Tensor] + + +def parse_tfexample( + raw_data: bytes, + features: protein_features.FeaturesMetadata, + key: Optional[str] = None) -> Dict[str, tf.train.Feature]: + """Read a single TF Example proto and return a subset of its features. + + Args: + raw_data: A serialized tf.Example proto. + features: A dictionary of features, mapping string feature names to a tuple + (dtype, shape). This dictionary should be a subset of + protein_features.FEATURES (or the dictionary itself for all features). + key: Optional string with the SSTable key of that tf.Example. This will be + added into features as a 'key' but only if requested in features. + + Returns: + A dictionary of features mapping feature names to features. Only the given + features are returned, all other ones are filtered out. + """ + feature_map = { + k: tf.io.FixedLenSequenceFeature(shape=(), dtype=v[0], allow_missing=True) + for k, v in features.items() + } + parsed_features = tf.io.parse_single_example(raw_data, feature_map) + reshaped_features = parse_reshape_logic(parsed_features, features, key=key) + + return reshaped_features + + +def _first(tensor: tf.Tensor) -> tf.Tensor: + """Returns the 1st element - the input can be a tensor or a scalar.""" + return tf.reshape(tensor, shape=(-1,))[0] + + +def parse_reshape_logic( + parsed_features: TensorDict, + features: protein_features.FeaturesMetadata, + key: Optional[str] = None) -> TensorDict: + """Transforms parsed serial features to the correct shape.""" + # Find out what is the number of sequences and the number of alignments. + num_residues = tf.cast(_first(parsed_features["seq_length"]), dtype=tf.int32) + + if "num_alignments" in parsed_features: + num_msa = tf.cast(_first(parsed_features["num_alignments"]), dtype=tf.int32) + else: + num_msa = 0 + + if "template_domain_names" in parsed_features: + num_templates = tf.cast( + tf.shape(parsed_features["template_domain_names"])[0], dtype=tf.int32) + else: + num_templates = 0 + + if key is not None and "key" in features: + parsed_features["key"] = [key] # Expand dims from () to (1,). + + # Reshape the tensors according to the sequence length and num alignments. + for k, v in parsed_features.items(): + new_shape = protein_features.shape( + feature_name=k, + num_residues=num_residues, + msa_length=num_msa, + num_templates=num_templates, + features=features) + new_shape_size = tf.constant(1, dtype=tf.int32) + for dim in new_shape: + new_shape_size *= tf.cast(dim, tf.int32) + + assert_equal = tf.assert_equal( + tf.size(v), new_shape_size, + name="assert_%s_shape_correct" % k, + message="The size of feature %s (%s) could not be reshaped " + "into %s" % (k, tf.size(v), new_shape)) + if "template" not in k: + # Make sure the feature we are reshaping is not empty. + assert_non_empty = tf.assert_greater( + tf.size(v), 0, name="assert_%s_non_empty" % k, + message="The feature %s is not set in the tf.Example. Either do not " + "request the feature or use a tf.Example that has the " + "feature set." % k) + with tf.control_dependencies([assert_non_empty, assert_equal]): + parsed_features[k] = tf.reshape(v, new_shape, name="reshape_%s" % k) + else: + with tf.control_dependencies([assert_equal]): + parsed_features[k] = tf.reshape(v, new_shape, name="reshape_%s" % k) + + return parsed_features + + +def _make_features_metadata( + feature_names: Sequence[str]) -> protein_features.FeaturesMetadata: + """Makes a feature name to type and shape mapping from a list of names.""" + # Make sure these features are always read. + required_features = ["aatype", "sequence", "seq_length"] + feature_names = list(set(feature_names) | set(required_features)) + + features_metadata = {name: protein_features.FEATURES[name] + for name in feature_names} + return features_metadata + + +def create_tensor_dict( + raw_data: bytes, + features: Sequence[str], + key: Optional[str] = None, + ) -> TensorDict: + """Creates a dictionary of tensor features. + + Args: + raw_data: A serialized tf.Example proto. + features: A list of strings of feature names to be returned in the dataset. + key: Optional string with the SSTable key of that tf.Example. This will be + added into features as a 'key' but only if requested in features. + + Returns: + A dictionary of features mapping feature names to features. Only the given + features are returned, all other ones are filtered out. + """ + features_metadata = _make_features_metadata(features) + return parse_tfexample(raw_data, features_metadata, key) + + +def np_to_tensor_dict( + np_example: Mapping[str, np.ndarray], + features: Sequence[str], + ) -> TensorDict: + """Creates dict of tensors from a dict of NumPy arrays. + + Args: + np_example: A dict of NumPy feature arrays. + features: A list of strings of feature names to be returned in the dataset. + + Returns: + A dictionary of features mapping feature names to features. Only the given + features are returned, all other ones are filtered out. + """ + features_metadata = _make_features_metadata(features) + tensor_dict = {k: tf.constant(v) for k, v in np_example.items() + if k in features_metadata} + + # Ensures shapes are as expected. Needed for setting size of empty features + # e.g. when no template hits were found. + tensor_dict = parse_reshape_logic(tensor_dict, features_metadata) + return tensor_dict diff --git a/alphafold/alphafold/model/tf/shape_helpers.py b/alphafold/alphafold/model/tf/shape_helpers.py new file mode 100644 index 0000000000000000000000000000000000000000..be2926a63bce7ca5db3effe63d5264620aa1dcf8 --- /dev/null +++ b/alphafold/alphafold/model/tf/shape_helpers.py @@ -0,0 +1,47 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Utilities for dealing with shapes of TensorFlow tensors.""" +import tensorflow.compat.v1 as tf + + +def shape_list(x): + """Return list of dimensions of a tensor, statically where possible. + + Like `x.shape.as_list()` but with tensors instead of `None`s. + + Args: + x: A tensor. + Returns: + A list with length equal to the rank of the tensor. The n-th element of the + list is an integer when that dimension is statically known otherwise it is + the n-th element of `tf.shape(x)`. + """ + x = tf.convert_to_tensor(x) + + # If unknown rank, return dynamic shape + if x.get_shape().dims is None: + return tf.shape(x) + + static = x.get_shape().as_list() + shape = tf.shape(x) + + ret = [] + for i in range(len(static)): + dim = static[i] + if dim is None: + dim = shape[i] + ret.append(dim) + return ret + diff --git a/alphafold/alphafold/model/tf/shape_helpers_test.py b/alphafold/alphafold/model/tf/shape_helpers_test.py new file mode 100644 index 0000000000000000000000000000000000000000..d7797b340514d9577dd77b9e9660babd0aa52b5e --- /dev/null +++ b/alphafold/alphafold/model/tf/shape_helpers_test.py @@ -0,0 +1,39 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Tests for shape_helpers.""" + +from alphafold.model.tf import shape_helpers +import numpy as np +import tensorflow.compat.v1 as tf + + +class ShapeTest(tf.test.TestCase): + + def test_shape_list(self): + """Test that shape_list can allow for reshaping to dynamic shapes.""" + a = tf.zeros([10, 4, 4, 2]) + p = tf.placeholder(tf.float32, shape=[None, None, 1, 4, 4]) + shape_dyn = shape_helpers.shape_list(p)[:2] + [4, 4] + + b = tf.reshape(a, shape_dyn) + with self.session() as sess: + out = sess.run(b, feed_dict={p: np.ones((20, 1, 1, 4, 4))}) + + self.assertAllEqual(out.shape, (20, 1, 4, 4)) + + +if __name__ == '__main__': + tf.disable_v2_behavior() + tf.test.main() diff --git a/alphafold/alphafold/model/tf/shape_placeholders.py b/alphafold/alphafold/model/tf/shape_placeholders.py new file mode 100644 index 0000000000000000000000000000000000000000..cffdeb5e1fa9691eb74680b8c9aeb8bab6123fa8 --- /dev/null +++ b/alphafold/alphafold/model/tf/shape_placeholders.py @@ -0,0 +1,20 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Placeholder values for run-time varying dimension sizes.""" + +NUM_RES = 'num residues placeholder' +NUM_MSA_SEQ = 'msa placeholder' +NUM_EXTRA_SEQ = 'extra msa placeholder' +NUM_TEMPLATES = 'num templates placeholder' diff --git a/alphafold/alphafold/model/tf/utils.py b/alphafold/alphafold/model/tf/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..fc40a2ceb2de1c2d56c17697393713804d7da350 --- /dev/null +++ b/alphafold/alphafold/model/tf/utils.py @@ -0,0 +1,47 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Shared utilities for various components.""" +import tensorflow.compat.v1 as tf + + +def tf_combine_mask(*masks): + """Take the intersection of float-valued masks.""" + ret = 1 + for m in masks: + ret *= m + return ret + + +class SeedMaker(object): + """Return unique seeds.""" + + def __init__(self, initial_seed=0): + self.next_seed = initial_seed + + def __call__(self): + i = self.next_seed + self.next_seed += 1 + return i + +seed_maker = SeedMaker() + + +def make_random_seed(): + return tf.random.uniform([2], + tf.int32.min, + tf.int32.max, + tf.int32, + seed=seed_maker()) + diff --git a/alphafold/alphafold/model/utils.py b/alphafold/alphafold/model/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..8ed5361e867a3f566afaa5aafeaac10863c4af8d --- /dev/null +++ b/alphafold/alphafold/model/utils.py @@ -0,0 +1,81 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""A collection of JAX utility functions for use in protein folding.""" + +import collections +import numbers +from typing import Mapping + +import haiku as hk +import jax +import jax.numpy as jnp +import numpy as np + + +def final_init(config): + if config.zero_init: + return 'zeros' + else: + return 'linear' + + +def batched_gather(params, indices, axis=0, batch_dims=0): + """Implements a JAX equivalent of `tf.gather` with `axis` and `batch_dims`.""" + take_fn = lambda p, i: jnp.take(p, i, axis=axis) + for _ in range(batch_dims): + take_fn = jax.vmap(take_fn) + return take_fn(params, indices) + + +def mask_mean(mask, value, axis=None, drop_mask_channel=False, eps=1e-10): + """Masked mean.""" + if drop_mask_channel: + mask = mask[..., 0] + + mask_shape = mask.shape + value_shape = value.shape + + assert len(mask_shape) == len(value_shape) + + if isinstance(axis, numbers.Integral): + axis = [axis] + elif axis is None: + axis = list(range(len(mask_shape))) + assert isinstance(axis, collections.Iterable), ( + 'axis needs to be either an iterable, integer or "None"') + + broadcast_factor = 1. + for axis_ in axis: + value_size = value_shape[axis_] + mask_size = mask_shape[axis_] + if mask_size == 1: + broadcast_factor *= value_size + else: + assert mask_size == value_size + + return (jnp.sum(mask * value, axis=axis) / + (jnp.sum(mask, axis=axis) * broadcast_factor + eps)) + + +def flat_params_to_haiku(params: Mapping[str, np.ndarray]) -> hk.Params: + """Convert a dictionary of NumPy arrays to Haiku parameters.""" + hk_params = {} + for path, array in params.items(): + scope, name = path.split('//') + if scope not in hk_params: + hk_params[scope] = {} + hk_params[scope][name] = jnp.array(array) + + return hk_params diff --git a/alphafold/alphafold/relax/__init__.py b/alphafold/alphafold/relax/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..98feaf80700f21bf7c1c5e7f755d3c38d0008dba --- /dev/null +++ b/alphafold/alphafold/relax/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. +"""Amber relaxation.""" diff --git a/alphafold/alphafold/relax/amber_minimize.py b/alphafold/alphafold/relax/amber_minimize.py new file mode 100644 index 0000000000000000000000000000000000000000..d3ff9f74218bdcabe0b57d8e0e749814b583edcd --- /dev/null +++ b/alphafold/alphafold/relax/amber_minimize.py @@ -0,0 +1,543 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Restrained Amber Minimization of a structure.""" + +import io +import time +from typing import Collection, Optional, Sequence + +from absl import logging +from alphafold.common import protein +from alphafold.common import residue_constants +from alphafold.model import folding +from alphafold.relax import cleanup +from alphafold.relax import utils +import ml_collections +import numpy as np +from simtk import openmm +from simtk import unit +from simtk.openmm import app as openmm_app +from simtk.openmm.app.internal.pdbstructure import PdbStructure + + +ENERGY = unit.kilocalories_per_mole +LENGTH = unit.angstroms + + +def will_restrain(atom: openmm_app.Atom, rset: str) -> bool: + """Returns True if the atom will be restrained by the given restraint set.""" + + if rset == "non_hydrogen": + return atom.element.name != "hydrogen" + elif rset == "c_alpha": + return atom.name == "CA" + + +def _add_restraints( + system: openmm.System, + reference_pdb: openmm_app.PDBFile, + stiffness: unit.Unit, + rset: str, + exclude_residues: Sequence[int]): + """Adds a harmonic potential that restrains the system to a structure.""" + assert rset in ["non_hydrogen", "c_alpha"] + + force = openmm.CustomExternalForce( + "0.5 * k * ((x-x0)^2 + (y-y0)^2 + (z-z0)^2)") + force.addGlobalParameter("k", stiffness) + for p in ["x0", "y0", "z0"]: + force.addPerParticleParameter(p) + + for i, atom in enumerate(reference_pdb.topology.atoms()): + if atom.residue.index in exclude_residues: + continue + if will_restrain(atom, rset): + force.addParticle(i, reference_pdb.positions[i]) + logging.info("Restraining %d / %d particles.", + force.getNumParticles(), system.getNumParticles()) + system.addForce(force) + + +def _openmm_minimize( + pdb_str: str, + max_iterations: int, + tolerance: unit.Unit, + stiffness: unit.Unit, + restraint_set: str, + exclude_residues: Sequence[int]): + """Minimize energy via openmm.""" + + pdb_file = io.StringIO(pdb_str) + pdb = openmm_app.PDBFile(pdb_file) + + force_field = openmm_app.ForceField("amber99sb.xml") + constraints = openmm_app.HBonds + system = force_field.createSystem( + pdb.topology, constraints=constraints) + if stiffness > 0 * ENERGY / (LENGTH**2): + _add_restraints(system, pdb, stiffness, restraint_set, exclude_residues) + + integrator = openmm.LangevinIntegrator(0, 0.01, 0.0) + platform = openmm.Platform.getPlatformByName("CPU") + simulation = openmm_app.Simulation( + pdb.topology, system, integrator, platform) + simulation.context.setPositions(pdb.positions) + + ret = {} + state = simulation.context.getState(getEnergy=True, getPositions=True) + ret["einit"] = state.getPotentialEnergy().value_in_unit(ENERGY) + ret["posinit"] = state.getPositions(asNumpy=True).value_in_unit(LENGTH) + simulation.minimizeEnergy(maxIterations=max_iterations, + tolerance=tolerance) + state = simulation.context.getState(getEnergy=True, getPositions=True) + ret["efinal"] = state.getPotentialEnergy().value_in_unit(ENERGY) + ret["pos"] = state.getPositions(asNumpy=True).value_in_unit(LENGTH) + ret["min_pdb"] = _get_pdb_string(simulation.topology, state.getPositions()) + return ret + + +def _get_pdb_string(topology: openmm_app.Topology, positions: unit.Quantity): + """Returns a pdb string provided OpenMM topology and positions.""" + with io.StringIO() as f: + openmm_app.PDBFile.writeFile(topology, positions, f) + return f.getvalue() + + +def _check_cleaned_atoms(pdb_cleaned_string: str, pdb_ref_string: str): + """Checks that no atom positions have been altered by cleaning.""" + cleaned = openmm_app.PDBFile(io.StringIO(pdb_cleaned_string)) + reference = openmm_app.PDBFile(io.StringIO(pdb_ref_string)) + + cl_xyz = np.array(cleaned.getPositions().value_in_unit(LENGTH)) + ref_xyz = np.array(reference.getPositions().value_in_unit(LENGTH)) + + for ref_res, cl_res in zip(reference.topology.residues(), + cleaned.topology.residues()): + assert ref_res.name == cl_res.name + for rat in ref_res.atoms(): + for cat in cl_res.atoms(): + if cat.name == rat.name: + if not np.array_equal(cl_xyz[cat.index], ref_xyz[rat.index]): + raise ValueError(f"Coordinates of cleaned atom {cat} do not match " + f"coordinates of reference atom {rat}.") + + +def _check_residues_are_well_defined(prot: protein.Protein): + """Checks that all residues contain non-empty atom sets.""" + if (prot.atom_mask.sum(axis=-1) == 0).any(): + raise ValueError("Amber minimization can only be performed on proteins with" + " well-defined residues. This protein contains at least" + " one residue with no atoms.") + + +def _check_atom_mask_is_ideal(prot): + """Sanity-check the atom mask is ideal, up to a possible OXT.""" + atom_mask = prot.atom_mask + ideal_atom_mask = protein.ideal_atom_mask(prot) + utils.assert_equal_nonterminal_atom_types(atom_mask, ideal_atom_mask) + + +def clean_protein( + prot: protein.Protein, + checks: bool = True): + """Adds missing atoms to Protein instance. + + Args: + prot: A `protein.Protein` instance. + checks: A `bool` specifying whether to add additional checks to the cleaning + process. + + Returns: + pdb_string: A string of the cleaned protein. + """ + _check_atom_mask_is_ideal(prot) + + # Clean pdb. + prot_pdb_string = protein.to_pdb(prot) + pdb_file = io.StringIO(prot_pdb_string) + alterations_info = {} + fixed_pdb = cleanup.fix_pdb(pdb_file, alterations_info) + fixed_pdb_file = io.StringIO(fixed_pdb) + pdb_structure = PdbStructure(fixed_pdb_file) + cleanup.clean_structure(pdb_structure, alterations_info) + + logging.info("alterations info: %s", alterations_info) + + # Write pdb file of cleaned structure. + as_file = openmm_app.PDBFile(pdb_structure) + pdb_string = _get_pdb_string(as_file.getTopology(), as_file.getPositions()) + if checks: + _check_cleaned_atoms(pdb_string, prot_pdb_string) + return pdb_string + + +def make_atom14_positions(prot): + """Constructs denser atom positions (14 dimensions instead of 37).""" + restype_atom14_to_atom37 = [] # mapping (restype, atom14) --> atom37 + restype_atom37_to_atom14 = [] # mapping (restype, atom37) --> atom14 + restype_atom14_mask = [] + + for rt in residue_constants.restypes: + atom_names = residue_constants.restype_name_to_atom14_names[ + residue_constants.restype_1to3[rt]] + + restype_atom14_to_atom37.append([ + (residue_constants.atom_order[name] if name else 0) + for name in atom_names + ]) + + atom_name_to_idx14 = {name: i for i, name in enumerate(atom_names)} + restype_atom37_to_atom14.append([ + (atom_name_to_idx14[name] if name in atom_name_to_idx14 else 0) + for name in residue_constants.atom_types + ]) + + restype_atom14_mask.append([(1. if name else 0.) for name in atom_names]) + + # Add dummy mapping for restype 'UNK'. + restype_atom14_to_atom37.append([0] * 14) + restype_atom37_to_atom14.append([0] * 37) + restype_atom14_mask.append([0.] * 14) + + restype_atom14_to_atom37 = np.array(restype_atom14_to_atom37, dtype=np.int32) + restype_atom37_to_atom14 = np.array(restype_atom37_to_atom14, dtype=np.int32) + restype_atom14_mask = np.array(restype_atom14_mask, dtype=np.float32) + + # Create the mapping for (residx, atom14) --> atom37, i.e. an array + # with shape (num_res, 14) containing the atom37 indices for this protein. + residx_atom14_to_atom37 = restype_atom14_to_atom37[prot["aatype"]] + residx_atom14_mask = restype_atom14_mask[prot["aatype"]] + + # Create a mask for known ground truth positions. + residx_atom14_gt_mask = residx_atom14_mask * np.take_along_axis( + prot["all_atom_mask"], residx_atom14_to_atom37, axis=1).astype(np.float32) + + # Gather the ground truth positions. + residx_atom14_gt_positions = residx_atom14_gt_mask[:, :, None] * ( + np.take_along_axis(prot["all_atom_positions"], + residx_atom14_to_atom37[..., None], + axis=1)) + + prot["atom14_atom_exists"] = residx_atom14_mask + prot["atom14_gt_exists"] = residx_atom14_gt_mask + prot["atom14_gt_positions"] = residx_atom14_gt_positions + + prot["residx_atom14_to_atom37"] = residx_atom14_to_atom37 + + # Create the gather indices for mapping back. + residx_atom37_to_atom14 = restype_atom37_to_atom14[prot["aatype"]] + prot["residx_atom37_to_atom14"] = residx_atom37_to_atom14 + + # Create the corresponding mask. + restype_atom37_mask = np.zeros([21, 37], dtype=np.float32) + for restype, restype_letter in enumerate(residue_constants.restypes): + restype_name = residue_constants.restype_1to3[restype_letter] + atom_names = residue_constants.residue_atoms[restype_name] + for atom_name in atom_names: + atom_type = residue_constants.atom_order[atom_name] + restype_atom37_mask[restype, atom_type] = 1 + + residx_atom37_mask = restype_atom37_mask[prot["aatype"]] + prot["atom37_atom_exists"] = residx_atom37_mask + + # As the atom naming is ambiguous for 7 of the 20 amino acids, provide + # alternative ground truth coordinates where the naming is swapped + restype_3 = [ + residue_constants.restype_1to3[res] for res in residue_constants.restypes + ] + restype_3 += ["UNK"] + + # Matrices for renaming ambiguous atoms. + all_matrices = {res: np.eye(14, dtype=np.float32) for res in restype_3} + for resname, swap in residue_constants.residue_atom_renaming_swaps.items(): + correspondences = np.arange(14) + for source_atom_swap, target_atom_swap in swap.items(): + source_index = residue_constants.restype_name_to_atom14_names[ + resname].index(source_atom_swap) + target_index = residue_constants.restype_name_to_atom14_names[ + resname].index(target_atom_swap) + correspondences[source_index] = target_index + correspondences[target_index] = source_index + renaming_matrix = np.zeros((14, 14), dtype=np.float32) + for index, correspondence in enumerate(correspondences): + renaming_matrix[index, correspondence] = 1. + all_matrices[resname] = renaming_matrix.astype(np.float32) + renaming_matrices = np.stack([all_matrices[restype] for restype in restype_3]) + + # Pick the transformation matrices for the given residue sequence + # shape (num_res, 14, 14). + renaming_transform = renaming_matrices[prot["aatype"]] + + # Apply it to the ground truth positions. shape (num_res, 14, 3). + alternative_gt_positions = np.einsum("rac,rab->rbc", + residx_atom14_gt_positions, + renaming_transform) + prot["atom14_alt_gt_positions"] = alternative_gt_positions + + # Create the mask for the alternative ground truth (differs from the + # ground truth mask, if only one of the atoms in an ambiguous pair has a + # ground truth position). + alternative_gt_mask = np.einsum("ra,rab->rb", + residx_atom14_gt_mask, + renaming_transform) + + prot["atom14_alt_gt_exists"] = alternative_gt_mask + + # Create an ambiguous atoms mask. shape: (21, 14). + restype_atom14_is_ambiguous = np.zeros((21, 14), dtype=np.float32) + for resname, swap in residue_constants.residue_atom_renaming_swaps.items(): + for atom_name1, atom_name2 in swap.items(): + restype = residue_constants.restype_order[ + residue_constants.restype_3to1[resname]] + atom_idx1 = residue_constants.restype_name_to_atom14_names[resname].index( + atom_name1) + atom_idx2 = residue_constants.restype_name_to_atom14_names[resname].index( + atom_name2) + restype_atom14_is_ambiguous[restype, atom_idx1] = 1 + restype_atom14_is_ambiguous[restype, atom_idx2] = 1 + + # From this create an ambiguous_mask for the given sequence. + prot["atom14_atom_is_ambiguous"] = ( + restype_atom14_is_ambiguous[prot["aatype"]]) + + return prot + + +def find_violations(prot_np: protein.Protein): + """Analyzes a protein and returns structural violation information. + + Args: + prot_np: A protein. + + Returns: + violations: A `dict` of structure components with structural violations. + violation_metrics: A `dict` of violation metrics. + """ + batch = { + "aatype": prot_np.aatype, + "all_atom_positions": prot_np.atom_positions.astype(np.float32), + "all_atom_mask": prot_np.atom_mask.astype(np.float32), + "residue_index": prot_np.residue_index, + } + + batch["seq_mask"] = np.ones_like(batch["aatype"], np.float32) + batch = make_atom14_positions(batch) + + violations = folding.find_structural_violations( + batch=batch, + atom14_pred_positions=batch["atom14_gt_positions"], + config=ml_collections.ConfigDict( + {"violation_tolerance_factor": 12, # Taken from model config. + "clash_overlap_tolerance": 1.5, # Taken from model config. + })) + violation_metrics = folding.compute_violation_metrics( + batch=batch, + atom14_pred_positions=batch["atom14_gt_positions"], + violations=violations, + ) + + return violations, violation_metrics + + +def get_violation_metrics(prot: protein.Protein): + """Computes violation and alignment metrics.""" + structural_violations, struct_metrics = find_violations(prot) + violation_idx = np.flatnonzero( + structural_violations["total_per_residue_violations_mask"]) + + struct_metrics["residue_violations"] = violation_idx + struct_metrics["num_residue_violations"] = len(violation_idx) + struct_metrics["structural_violations"] = structural_violations + return struct_metrics + + +def _run_one_iteration( + *, + pdb_string: str, + max_iterations: int, + tolerance: float, + stiffness: float, + restraint_set: str, + max_attempts: int, + exclude_residues: Optional[Collection[int]] = None): + """Runs the minimization pipeline. + + Args: + pdb_string: A pdb string. + max_iterations: An `int` specifying the maximum number of L-BFGS iterations. + A value of 0 specifies no limit. + tolerance: kcal/mol, the energy tolerance of L-BFGS. + stiffness: kcal/mol A**2, spring constant of heavy atom restraining + potential. + restraint_set: The set of atoms to restrain. + max_attempts: The maximum number of minimization attempts. + exclude_residues: An optional list of zero-indexed residues to exclude from + restraints. + + Returns: + A `dict` of minimization info. + """ + exclude_residues = exclude_residues or [] + + # Assign physical dimensions. + tolerance = tolerance * ENERGY + stiffness = stiffness * ENERGY / (LENGTH**2) + + start = time.time() + minimized = False + attempts = 0 + while not minimized and attempts < max_attempts: + attempts += 1 + try: + logging.info("Minimizing protein, attempt %d of %d.", + attempts, max_attempts) + ret = _openmm_minimize( + pdb_string, max_iterations=max_iterations, + tolerance=tolerance, stiffness=stiffness, + restraint_set=restraint_set, + exclude_residues=exclude_residues) + minimized = True + except Exception as e: # pylint: disable=broad-except + logging.info(e) + if not minimized: + raise ValueError(f"Minimization failed after {max_attempts} attempts.") + ret["opt_time"] = time.time() - start + ret["min_attempts"] = attempts + return ret + + +def run_pipeline( + prot: protein.Protein, + stiffness: float, + max_outer_iterations: int = 1, + place_hydrogens_every_iteration: bool = True, + max_iterations: int = 0, + tolerance: float = 2.39, + restraint_set: str = "non_hydrogen", + max_attempts: int = 100, + checks: bool = True, + exclude_residues: Optional[Sequence[int]] = None): + """Run iterative amber relax. + + Successive relax iterations are performed until all violations have been + resolved. Each iteration involves a restrained Amber minimization, with + restraint exclusions determined by violation-participating residues. + + Args: + prot: A protein to be relaxed. + stiffness: kcal/mol A**2, the restraint stiffness. + max_outer_iterations: The maximum number of iterative minimization. + place_hydrogens_every_iteration: Whether hydrogens are re-initialized + prior to every minimization. + max_iterations: An `int` specifying the maximum number of L-BFGS steps + per relax iteration. A value of 0 specifies no limit. + tolerance: kcal/mol, the energy tolerance of L-BFGS. + The default value is the OpenMM default. + restraint_set: The set of atoms to restrain. + max_attempts: The maximum number of minimization attempts per iteration. + checks: Whether to perform cleaning checks. + exclude_residues: An optional list of zero-indexed residues to exclude from + restraints. + + Returns: + out: A dictionary of output values. + """ + + # `protein.to_pdb` will strip any poorly-defined residues so we need to + # perform this check before `clean_protein`. + _check_residues_are_well_defined(prot) + pdb_string = clean_protein(prot, checks=checks) + + exclude_residues = exclude_residues or [] + exclude_residues = set(exclude_residues) + violations = np.inf + iteration = 0 + + while violations > 0 and iteration < max_outer_iterations: + ret = _run_one_iteration( + pdb_string=pdb_string, + exclude_residues=exclude_residues, + max_iterations=max_iterations, + tolerance=tolerance, + stiffness=stiffness, + restraint_set=restraint_set, + max_attempts=max_attempts) + prot = protein.from_pdb_string(ret["min_pdb"]) + if place_hydrogens_every_iteration: + pdb_string = clean_protein(prot, checks=True) + else: + pdb_string = ret["min_pdb"] + ret.update(get_violation_metrics(prot)) + ret.update({ + "num_exclusions": len(exclude_residues), + "iteration": iteration, + }) + violations = ret["violations_per_residue"] + exclude_residues = exclude_residues.union(ret["residue_violations"]) + + logging.info("Iteration completed: Einit %.2f Efinal %.2f Time %.2f s " + "num residue violations %d num residue exclusions %d ", + ret["einit"], ret["efinal"], ret["opt_time"], + ret["num_residue_violations"], ret["num_exclusions"]) + iteration += 1 + return ret + + +def get_initial_energies(pdb_strs: Sequence[str], + stiffness: float = 0.0, + restraint_set: str = "non_hydrogen", + exclude_residues: Optional[Sequence[int]] = None): + """Returns initial potential energies for a sequence of PDBs. + + Assumes the input PDBs are ready for minimization, and all have the same + topology. + Allows time to be saved by not pdbfixing / rebuilding the system. + + Args: + pdb_strs: List of PDB strings. + stiffness: kcal/mol A**2, spring constant of heavy atom restraining + potential. + restraint_set: Which atom types to restrain. + exclude_residues: An optional list of zero-indexed residues to exclude from + restraints. + + Returns: + A list of initial energies in the same order as pdb_strs. + """ + exclude_residues = exclude_residues or [] + + openmm_pdbs = [openmm_app.PDBFile(PdbStructure(io.StringIO(p))) + for p in pdb_strs] + force_field = openmm_app.ForceField("amber99sb.xml") + system = force_field.createSystem(openmm_pdbs[0].topology, + constraints=openmm_app.HBonds) + stiffness = stiffness * ENERGY / (LENGTH**2) + if stiffness > 0 * ENERGY / (LENGTH**2): + _add_restraints(system, openmm_pdbs[0], stiffness, restraint_set, + exclude_residues) + simulation = openmm_app.Simulation(openmm_pdbs[0].topology, + system, + openmm.LangevinIntegrator(0, 0.01, 0.0), + openmm.Platform.getPlatformByName("CPU")) + energies = [] + for pdb in openmm_pdbs: + try: + simulation.context.setPositions(pdb.positions) + state = simulation.context.getState(getEnergy=True) + energies.append(state.getPotentialEnergy().value_in_unit(ENERGY)) + except Exception as e: # pylint: disable=broad-except + logging.error("Error getting initial energy, returning large value %s", e) + energies.append(unit.Quantity(1e20, ENERGY)) + return energies diff --git a/alphafold/alphafold/relax/amber_minimize_test.py b/alphafold/alphafold/relax/amber_minimize_test.py new file mode 100644 index 0000000000000000000000000000000000000000..b67cb911cbb07b505c7313eb4e7c13d518f162d9 --- /dev/null +++ b/alphafold/alphafold/relax/amber_minimize_test.py @@ -0,0 +1,130 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Tests for amber_minimize.""" +import os + +from absl.testing import absltest +from alphafold.common import protein +from alphafold.relax import amber_minimize +import numpy as np +# Internal import (7716). + + +def _load_test_protein(data_path): + pdb_path = os.path.join(absltest.get_default_test_srcdir(), data_path) + with open(pdb_path, 'r') as f: + return protein.from_pdb_string(f.read()) + + +class AmberMinimizeTest(absltest.TestCase): + + def test_multiple_disulfides_target(self): + prot = _load_test_protein( + 'alphafold/relax/testdata/multiple_disulfides_target.pdb' + ) + ret = amber_minimize.run_pipeline(prot, max_iterations=10, max_attempts=1, + stiffness=10.) + self.assertIn('opt_time', ret) + self.assertIn('min_attempts', ret) + + def test_raises_invalid_protein_assertion(self): + prot = _load_test_protein( + 'alphafold/relax/testdata/multiple_disulfides_target.pdb' + ) + prot.atom_mask[4, :] = 0 + with self.assertRaisesRegex( + ValueError, + 'Amber minimization can only be performed on proteins with well-defined' + ' residues. This protein contains at least one residue with no atoms.'): + amber_minimize.run_pipeline(prot, max_iterations=10, + stiffness=1., + max_attempts=1) + + def test_iterative_relax(self): + prot = _load_test_protein( + 'alphafold/relax/testdata/with_violations.pdb' + ) + violations = amber_minimize.get_violation_metrics(prot) + self.assertGreater(violations['num_residue_violations'], 0) + out = amber_minimize.run_pipeline( + prot=prot, max_outer_iterations=10, stiffness=10.) + self.assertLess(out['efinal'], out['einit']) + self.assertEqual(0, out['num_residue_violations']) + + def test_find_violations(self): + prot = _load_test_protein( + 'alphafold/relax/testdata/multiple_disulfides_target.pdb' + ) + viols, _ = amber_minimize.find_violations(prot) + + expected_between_residues_connection_mask = np.zeros((191,), np.float32) + for residue in (42, 43, 59, 60, 135, 136): + expected_between_residues_connection_mask[residue] = 1.0 + + expected_clash_indices = np.array([ + [8, 4], + [8, 5], + [13, 3], + [14, 1], + [14, 4], + [26, 4], + [26, 5], + [31, 8], + [31, 10], + [39, 0], + [39, 1], + [39, 2], + [39, 3], + [39, 4], + [42, 5], + [42, 6], + [42, 7], + [42, 8], + [47, 7], + [47, 8], + [47, 9], + [47, 10], + [64, 4], + [85, 5], + [102, 4], + [102, 5], + [109, 13], + [111, 5], + [118, 6], + [118, 7], + [118, 8], + [124, 4], + [124, 5], + [131, 5], + [139, 7], + [147, 4], + [152, 7]], dtype=np.int32) + expected_between_residues_clash_mask = np.zeros([191, 14]) + expected_between_residues_clash_mask[expected_clash_indices[:, 0], + expected_clash_indices[:, 1]] += 1 + expected_per_atom_violations = np.zeros([191, 14]) + np.testing.assert_array_equal( + viols['between_residues']['connections_per_residue_violation_mask'], + expected_between_residues_connection_mask) + np.testing.assert_array_equal( + viols['between_residues']['clashes_per_atom_clash_mask'], + expected_between_residues_clash_mask) + np.testing.assert_array_equal( + viols['within_residues']['per_atom_violations'], + expected_per_atom_violations) + + +if __name__ == '__main__': + absltest.main() diff --git a/alphafold/alphafold/relax/cleanup.py b/alphafold/alphafold/relax/cleanup.py new file mode 100644 index 0000000000000000000000000000000000000000..4bdd449d28c6733eb948f0502db04dbbade53ad2 --- /dev/null +++ b/alphafold/alphafold/relax/cleanup.py @@ -0,0 +1,127 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Cleans up a PDB file using pdbfixer in preparation for OpenMM simulations. + +fix_pdb uses a third-party tool. We also support fixing some additional edge +cases like removing chains of length one (see clean_structure). +""" +import io + +import pdbfixer +from simtk.openmm import app +from simtk.openmm.app import element + + +def fix_pdb(pdbfile, alterations_info): + """Apply pdbfixer to the contents of a PDB file; return a PDB string result. + + 1) Replaces nonstandard residues. + 2) Removes heterogens (non protein residues) including water. + 3) Adds missing residues and missing atoms within existing residues. + 4) Adds hydrogens assuming pH=7.0. + 5) KeepIds is currently true, so the fixer must keep the existing chain and + residue identifiers. This will fail for some files in wider PDB that have + invalid IDs. + + Args: + pdbfile: Input PDB file handle. + alterations_info: A dict that will store details of changes made. + + Returns: + A PDB string representing the fixed structure. + """ + fixer = pdbfixer.PDBFixer(pdbfile=pdbfile) + fixer.findNonstandardResidues() + alterations_info['nonstandard_residues'] = fixer.nonstandardResidues + fixer.replaceNonstandardResidues() + _remove_heterogens(fixer, alterations_info, keep_water=False) + fixer.findMissingResidues() + alterations_info['missing_residues'] = fixer.missingResidues + fixer.findMissingAtoms() + alterations_info['missing_heavy_atoms'] = fixer.missingAtoms + alterations_info['missing_terminals'] = fixer.missingTerminals + fixer.addMissingAtoms(seed=0) + fixer.addMissingHydrogens() + out_handle = io.StringIO() + app.PDBFile.writeFile(fixer.topology, fixer.positions, out_handle, + keepIds=True) + return out_handle.getvalue() + + +def clean_structure(pdb_structure, alterations_info): + """Applies additional fixes to an OpenMM structure, to handle edge cases. + + Args: + pdb_structure: An OpenMM structure to modify and fix. + alterations_info: A dict that will store details of changes made. + """ + _replace_met_se(pdb_structure, alterations_info) + _remove_chains_of_length_one(pdb_structure, alterations_info) + + +def _remove_heterogens(fixer, alterations_info, keep_water): + """Removes the residues that Pdbfixer considers to be heterogens. + + Args: + fixer: A Pdbfixer instance. + alterations_info: A dict that will store details of changes made. + keep_water: If True, water (HOH) is not considered to be a heterogen. + """ + initial_resnames = set() + for chain in fixer.topology.chains(): + for residue in chain.residues(): + initial_resnames.add(residue.name) + fixer.removeHeterogens(keepWater=keep_water) + final_resnames = set() + for chain in fixer.topology.chains(): + for residue in chain.residues(): + final_resnames.add(residue.name) + alterations_info['removed_heterogens'] = ( + initial_resnames.difference(final_resnames)) + + +def _replace_met_se(pdb_structure, alterations_info): + """Replace the Se in any MET residues that were not marked as modified.""" + modified_met_residues = [] + for res in pdb_structure.iter_residues(): + name = res.get_name_with_spaces().strip() + if name == 'MET': + s_atom = res.get_atom('SD') + if s_atom.element_symbol == 'Se': + s_atom.element_symbol = 'S' + s_atom.element = element.get_by_symbol('S') + modified_met_residues.append(s_atom.residue_number) + alterations_info['Se_in_MET'] = modified_met_residues + + +def _remove_chains_of_length_one(pdb_structure, alterations_info): + """Removes chains that correspond to a single amino acid. + + A single amino acid in a chain is both N and C terminus. There is no force + template for this case. + + Args: + pdb_structure: An OpenMM pdb_structure to modify and fix. + alterations_info: A dict that will store details of changes made. + """ + removed_chains = {} + for model in pdb_structure.iter_models(): + valid_chains = [c for c in model.iter_chains() if len(c) > 1] + invalid_chain_ids = [c.chain_id for c in model.iter_chains() if len(c) <= 1] + model.chains = valid_chains + for chain_id in invalid_chain_ids: + model.chains_by_id.pop(chain_id) + removed_chains[model.number] = invalid_chain_ids + alterations_info['removed_chains'] = removed_chains diff --git a/alphafold/alphafold/relax/cleanup_test.py b/alphafold/alphafold/relax/cleanup_test.py new file mode 100644 index 0000000000000000000000000000000000000000..7061b292953fe9512bd7243031ac1cb4611e4556 --- /dev/null +++ b/alphafold/alphafold/relax/cleanup_test.py @@ -0,0 +1,137 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Tests for relax.cleanup.""" +import io + +from absl.testing import absltest +from alphafold.relax import cleanup +from simtk.openmm.app.internal import pdbstructure + + +def _pdb_to_structure(pdb_str): + handle = io.StringIO(pdb_str) + return pdbstructure.PdbStructure(handle) + + +def _lines_to_structure(pdb_lines): + return _pdb_to_structure('\n'.join(pdb_lines)) + + +class CleanupTest(absltest.TestCase): + + def test_missing_residues(self): + pdb_lines = ['SEQRES 1 C 3 CYS GLY LEU', + 'ATOM 1 N CYS C 1 -12.262 20.115 60.959 1.00 ' + '19.08 N', + 'ATOM 2 CA CYS C 1 -11.065 20.934 60.773 1.00 ' + '17.23 C', + 'ATOM 3 C CYS C 1 -10.002 20.742 61.844 1.00 ' + '15.38 C', + 'ATOM 4 O CYS C 1 -10.284 20.225 62.929 1.00 ' + '16.04 O', + 'ATOM 5 N LEU C 3 -7.688 18.700 62.045 1.00 ' + '14.75 N', + 'ATOM 6 CA LEU C 3 -7.256 17.320 62.234 1.00 ' + '16.81 C', + 'ATOM 7 C LEU C 3 -6.380 16.864 61.070 1.00 ' + '16.95 C', + 'ATOM 8 O LEU C 3 -6.551 17.332 59.947 1.00 ' + '16.97 O'] + input_handle = io.StringIO('\n'.join(pdb_lines)) + alterations = {} + result = cleanup.fix_pdb(input_handle, alterations) + structure = _pdb_to_structure(result) + residue_names = [r.get_name() for r in structure.iter_residues()] + self.assertCountEqual(residue_names, ['CYS', 'GLY', 'LEU']) + self.assertCountEqual(alterations['missing_residues'].values(), [['GLY']]) + + def test_missing_atoms(self): + pdb_lines = ['SEQRES 1 A 1 PRO', + 'ATOM 1 CA PRO A 1 1.000 1.000 1.000 1.00 ' + ' 0.00 C'] + input_handle = io.StringIO('\n'.join(pdb_lines)) + alterations = {} + result = cleanup.fix_pdb(input_handle, alterations) + structure = _pdb_to_structure(result) + atom_names = [a.get_name() for a in structure.iter_atoms()] + self.assertCountEqual(atom_names, ['N', 'CD', 'HD2', 'HD3', 'CG', 'HG2', + 'HG3', 'CB', 'HB2', 'HB3', 'CA', 'HA', + 'C', 'O', 'H2', 'H3', 'OXT']) + missing_atoms_by_residue = list(alterations['missing_heavy_atoms'].values()) + self.assertLen(missing_atoms_by_residue, 1) + atoms_added = [a.name for a in missing_atoms_by_residue[0]] + self.assertCountEqual(atoms_added, ['N', 'CD', 'CG', 'CB', 'C', 'O']) + missing_terminals_by_residue = alterations['missing_terminals'] + self.assertLen(missing_terminals_by_residue, 1) + has_missing_terminal = [r.name for r in missing_terminals_by_residue.keys()] + self.assertCountEqual(has_missing_terminal, ['PRO']) + self.assertCountEqual([t for t in missing_terminals_by_residue.values()], + [['OXT']]) + + def test_remove_heterogens(self): + pdb_lines = ['SEQRES 1 A 1 GLY', + 'ATOM 1 CA GLY A 1 0.000 0.000 0.000 1.00 ' + ' 0.00 C', + 'ATOM 2 O HOH A 2 0.000 0.000 0.000 1.00 ' + ' 0.00 O'] + input_handle = io.StringIO('\n'.join(pdb_lines)) + alterations = {} + result = cleanup.fix_pdb(input_handle, alterations) + structure = _pdb_to_structure(result) + self.assertCountEqual([res.get_name() for res in structure.iter_residues()], + ['GLY']) + self.assertEqual(alterations['removed_heterogens'], set(['HOH'])) + + def test_fix_nonstandard_residues(self): + pdb_lines = ['SEQRES 1 A 1 DAL', + 'ATOM 1 CA DAL A 1 0.000 0.000 0.000 1.00 ' + ' 0.00 C'] + input_handle = io.StringIO('\n'.join(pdb_lines)) + alterations = {} + result = cleanup.fix_pdb(input_handle, alterations) + structure = _pdb_to_structure(result) + residue_names = [res.get_name() for res in structure.iter_residues()] + self.assertCountEqual(residue_names, ['ALA']) + self.assertLen(alterations['nonstandard_residues'], 1) + original_res, new_name = alterations['nonstandard_residues'][0] + self.assertEqual(original_res.id, '1') + self.assertEqual(new_name, 'ALA') + + def test_replace_met_se(self): + pdb_lines = ['SEQRES 1 A 1 MET', + 'ATOM 1 SD MET A 1 0.000 0.000 0.000 1.00 ' + ' 0.00 Se'] + structure = _lines_to_structure(pdb_lines) + alterations = {} + cleanup._replace_met_se(structure, alterations) + sd = [a for a in structure.iter_atoms() if a.get_name() == 'SD'] + self.assertLen(sd, 1) + self.assertEqual(sd[0].element_symbol, 'S') + self.assertCountEqual(alterations['Se_in_MET'], [sd[0].residue_number]) + + def test_remove_chains_of_length_one(self): + pdb_lines = ['SEQRES 1 A 1 GLY', + 'ATOM 1 CA GLY A 1 0.000 0.000 0.000 1.00 ' + ' 0.00 C'] + structure = _lines_to_structure(pdb_lines) + alterations = {} + cleanup._remove_chains_of_length_one(structure, alterations) + chains = list(structure.iter_chains()) + self.assertEmpty(chains) + self.assertCountEqual(alterations['removed_chains'].values(), [['A']]) + + +if __name__ == '__main__': + absltest.main() diff --git a/alphafold/alphafold/relax/relax.py b/alphafold/alphafold/relax/relax.py new file mode 100644 index 0000000000000000000000000000000000000000..f7af5856dc03b714d9a3566d0d393729c57c0522 --- /dev/null +++ b/alphafold/alphafold/relax/relax.py @@ -0,0 +1,80 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Amber relaxation.""" +from typing import Any, Dict, Sequence, Tuple +from alphafold.common import protein +from alphafold.relax import amber_minimize +from alphafold.relax import utils +import numpy as np + + +class AmberRelaxation(object): + """Amber relaxation.""" + + def __init__(self, + *, + max_iterations: int, + tolerance: float, + stiffness: float, + exclude_residues: Sequence[int], + max_outer_iterations: int): + """Initialize Amber Relaxer. + + Args: + max_iterations: Maximum number of L-BFGS iterations. 0 means no max. + tolerance: kcal/mol, the energy tolerance of L-BFGS. + stiffness: kcal/mol A**2, spring constant of heavy atom restraining + potential. + exclude_residues: Residues to exclude from per-atom restraining. + Zero-indexed. + max_outer_iterations: Maximum number of violation-informed relax + iterations. A value of 1 will run the non-iterative procedure used in + CASP14. Use 20 so that >95% of the bad cases are relaxed. Relax finishes + as soon as there are no violations, hence in most cases this causes no + slowdown. In the worst case we do 20 outer iterations. + """ + + self._max_iterations = max_iterations + self._tolerance = tolerance + self._stiffness = stiffness + self._exclude_residues = exclude_residues + self._max_outer_iterations = max_outer_iterations + + def process(self, *, + prot: protein.Protein) -> Tuple[str, Dict[str, Any], np.ndarray]: + """Runs Amber relax on a prediction, adds hydrogens, returns PDB string.""" + out = amber_minimize.run_pipeline( + prot=prot, max_iterations=self._max_iterations, + tolerance=self._tolerance, stiffness=self._stiffness, + exclude_residues=self._exclude_residues, + max_outer_iterations=self._max_outer_iterations) + min_pos = out['pos'] + start_pos = out['posinit'] + rmsd = np.sqrt(np.sum((start_pos - min_pos)**2) / start_pos.shape[0]) + debug_data = { + 'initial_energy': out['einit'], + 'final_energy': out['efinal'], + 'attempts': out['min_attempts'], + 'rmsd': rmsd + } + pdb_str = amber_minimize.clean_protein(prot) + min_pdb = utils.overwrite_pdb_coordinates(pdb_str, min_pos) + min_pdb = utils.overwrite_b_factors(min_pdb, prot.b_factors) + utils.assert_equal_nonterminal_atom_types( + protein.from_pdb_string(min_pdb).atom_mask, + prot.atom_mask) + violations = out['structural_violations'][ + 'total_per_residue_violations_mask'] + return min_pdb, debug_data, violations diff --git a/alphafold/alphafold/relax/relax_test.py b/alphafold/alphafold/relax/relax_test.py new file mode 100644 index 0000000000000000000000000000000000000000..eba67ef2359e0a35696fcf4fd47404ec47cd3736 --- /dev/null +++ b/alphafold/alphafold/relax/relax_test.py @@ -0,0 +1,88 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Tests for relax.""" +import os + +from absl.testing import absltest +from alphafold.common import protein +from alphafold.relax import relax +import numpy as np +# Internal import (7716). + + +class RunAmberRelaxTest(absltest.TestCase): + + def setUp(self): + super().setUp() + self.test_dir = os.path.join( + absltest.get_default_test_srcdir(), + 'alphafold/relax/testdata/') + self.test_config = { + 'max_iterations': 1, + 'tolerance': 2.39, + 'stiffness': 10.0, + 'exclude_residues': [], + 'max_outer_iterations': 1} + + def test_process(self): + amber_relax = relax.AmberRelaxation(**self.test_config) + + with open(os.path.join(self.test_dir, 'model_output.pdb')) as f: + test_prot = protein.from_pdb_string(f.read()) + pdb_min, debug_info, num_violations = amber_relax.process(prot=test_prot) + + self.assertCountEqual(debug_info.keys(), + set({'initial_energy', 'final_energy', + 'attempts', 'rmsd'})) + self.assertLess(debug_info['final_energy'], debug_info['initial_energy']) + self.assertGreater(debug_info['rmsd'], 0) + + prot_min = protein.from_pdb_string(pdb_min) + # Most protein properties should be unchanged. + np.testing.assert_almost_equal(test_prot.aatype, prot_min.aatype) + np.testing.assert_almost_equal(test_prot.residue_index, + prot_min.residue_index) + # Atom mask and bfactors identical except for terminal OXT of last residue. + np.testing.assert_almost_equal(test_prot.atom_mask[:-1, :], + prot_min.atom_mask[:-1, :]) + np.testing.assert_almost_equal(test_prot.b_factors[:-1, :], + prot_min.b_factors[:-1, :]) + np.testing.assert_almost_equal(test_prot.atom_mask[:, :-1], + prot_min.atom_mask[:, :-1]) + np.testing.assert_almost_equal(test_prot.b_factors[:, :-1], + prot_min.b_factors[:, :-1]) + # There are no residues with violations. + np.testing.assert_equal(num_violations, np.zeros_like(num_violations)) + + def test_unresolved_violations(self): + amber_relax = relax.AmberRelaxation(**self.test_config) + with open(os.path.join(self.test_dir, + 'with_violations_casp14.pdb')) as f: + test_prot = protein.from_pdb_string(f.read()) + _, _, num_violations = amber_relax.process(prot=test_prot) + exp_num_violations = np.array( + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 0]) + # Check no violations were added. Can't check exactly due to stochasticity. + self.assertTrue(np.all(num_violations <= exp_num_violations)) + + +if __name__ == '__main__': + absltest.main() diff --git a/alphafold/alphafold/relax/testdata/model_output.pdb b/alphafold/alphafold/relax/testdata/model_output.pdb new file mode 100644 index 0000000000000000000000000000000000000000..f6e00beec4a5c55441d28e7bf3af48dcc0db87f6 --- /dev/null +++ b/alphafold/alphafold/relax/testdata/model_output.pdb @@ -0,0 +1,98 @@ +ATOM 1 C MET A 1 1.921 -46.152 7.786 1.00 4.39 C +ATOM 2 CA MET A 1 1.631 -46.829 9.131 1.00 4.39 C +ATOM 3 CB MET A 1 2.759 -47.768 9.578 1.00 4.39 C +ATOM 4 CE MET A 1 3.466 -49.770 13.198 1.00 4.39 C +ATOM 5 CG MET A 1 2.581 -48.221 11.034 1.00 4.39 C +ATOM 6 H MET A 1 0.234 -48.249 8.549 1.00 4.39 H +ATOM 7 H2 MET A 1 -0.424 -46.789 8.952 1.00 4.39 H +ATOM 8 H3 MET A 1 0.111 -47.796 10.118 1.00 4.39 H +ATOM 9 HA MET A 1 1.628 -46.009 9.849 1.00 4.39 H +ATOM 10 HB2 MET A 1 3.701 -47.225 9.500 1.00 4.39 H +ATOM 11 HB3 MET A 1 2.807 -48.640 8.926 1.00 4.39 H +ATOM 12 HE1 MET A 1 2.747 -50.537 12.910 1.00 4.39 H +ATOM 13 HE2 MET A 1 4.296 -50.241 13.725 1.00 4.39 H +ATOM 14 HE3 MET A 1 2.988 -49.052 13.864 1.00 4.39 H +ATOM 15 HG2 MET A 1 1.791 -48.971 11.083 1.00 4.39 H +ATOM 16 HG3 MET A 1 2.295 -47.368 11.650 1.00 4.39 H +ATOM 17 N MET A 1 0.291 -47.464 9.182 1.00 4.39 N +ATOM 18 O MET A 1 2.091 -44.945 7.799 1.00 4.39 O +ATOM 19 SD MET A 1 4.096 -48.921 11.725 1.00 4.39 S +ATOM 20 C LYS A 2 1.366 -45.033 4.898 1.00 2.92 C +ATOM 21 CA LYS A 2 2.235 -46.242 5.308 1.00 2.92 C +ATOM 22 CB LYS A 2 2.206 -47.314 4.196 1.00 2.92 C +ATOM 23 CD LYS A 2 3.331 -49.342 3.134 1.00 2.92 C +ATOM 24 CE LYS A 2 4.434 -50.403 3.293 1.00 2.92 C +ATOM 25 CG LYS A 2 3.294 -48.395 4.349 1.00 2.92 C +ATOM 26 H LYS A 2 1.832 -47.853 6.656 1.00 2.92 H +ATOM 27 HA LYS A 2 3.248 -45.841 5.355 1.00 2.92 H +ATOM 28 HB2 LYS A 2 1.223 -47.785 4.167 1.00 2.92 H +ATOM 29 HB3 LYS A 2 2.363 -46.812 3.241 1.00 2.92 H +ATOM 30 HD2 LYS A 2 3.524 -48.754 2.237 1.00 2.92 H +ATOM 31 HD3 LYS A 2 2.364 -49.833 3.031 1.00 2.92 H +ATOM 32 HE2 LYS A 2 5.383 -49.891 3.455 1.00 2.92 H +ATOM 33 HE3 LYS A 2 4.225 -51.000 4.180 1.00 2.92 H +ATOM 34 HG2 LYS A 2 3.102 -48.977 5.250 1.00 2.92 H +ATOM 35 HG3 LYS A 2 4.264 -47.909 4.446 1.00 2.92 H +ATOM 36 HZ1 LYS A 2 4.763 -50.747 1.274 1.00 2.92 H +ATOM 37 HZ2 LYS A 2 3.681 -51.785 1.931 1.00 2.92 H +ATOM 38 HZ3 LYS A 2 5.280 -51.965 2.224 1.00 2.92 H +ATOM 39 N LYS A 2 1.907 -46.846 6.629 1.00 2.92 N +ATOM 40 NZ LYS A 2 4.542 -51.286 2.100 1.00 2.92 N +ATOM 41 O LYS A 2 1.882 -44.093 4.312 1.00 2.92 O +ATOM 42 C PHE A 3 -0.511 -42.597 5.624 1.00 4.39 C +ATOM 43 CA PHE A 3 -0.853 -43.933 4.929 1.00 4.39 C +ATOM 44 CB PHE A 3 -2.271 -44.408 5.285 1.00 4.39 C +ATOM 45 CD1 PHE A 3 -3.760 -43.542 3.432 1.00 4.39 C +ATOM 46 CD2 PHE A 3 -4.050 -42.638 5.675 1.00 4.39 C +ATOM 47 CE1 PHE A 3 -4.797 -42.715 2.965 1.00 4.39 C +ATOM 48 CE2 PHE A 3 -5.091 -41.818 5.207 1.00 4.39 C +ATOM 49 CG PHE A 3 -3.382 -43.505 4.788 1.00 4.39 C +ATOM 50 CZ PHE A 3 -5.463 -41.853 3.853 1.00 4.39 C +ATOM 51 H PHE A 3 -0.311 -45.868 5.655 1.00 4.39 H +ATOM 52 HA PHE A 3 -0.817 -43.746 3.856 1.00 4.39 H +ATOM 53 HB2 PHE A 3 -2.353 -44.512 6.367 1.00 4.39 H +ATOM 54 HB3 PHE A 3 -2.432 -45.393 4.848 1.00 4.39 H +ATOM 55 HD1 PHE A 3 -3.255 -44.198 2.739 1.00 4.39 H +ATOM 56 HD2 PHE A 3 -3.768 -42.590 6.716 1.00 4.39 H +ATOM 57 HE1 PHE A 3 -5.083 -42.735 1.923 1.00 4.39 H +ATOM 58 HE2 PHE A 3 -5.604 -41.151 5.885 1.00 4.39 H +ATOM 59 HZ PHE A 3 -6.257 -41.215 3.493 1.00 4.39 H +ATOM 60 N PHE A 3 0.079 -45.027 5.253 1.00 4.39 N +ATOM 61 O PHE A 3 -0.633 -41.541 5.014 1.00 4.39 O +ATOM 62 C LEU A 4 1.598 -40.732 7.042 1.00 4.39 C +ATOM 63 CA LEU A 4 0.367 -41.437 7.633 1.00 4.39 C +ATOM 64 CB LEU A 4 0.628 -41.823 9.104 1.00 4.39 C +ATOM 65 CD1 LEU A 4 -0.319 -42.778 11.228 1.00 4.39 C +ATOM 66 CD2 LEU A 4 -1.300 -40.694 10.309 1.00 4.39 C +ATOM 67 CG LEU A 4 -0.650 -42.027 9.937 1.00 4.39 C +ATOM 68 H LEU A 4 0.163 -43.538 7.292 1.00 4.39 H +ATOM 69 HA LEU A 4 -0.445 -40.712 7.588 1.00 4.39 H +ATOM 70 HB2 LEU A 4 1.213 -41.034 9.576 1.00 4.39 H +ATOM 71 HB3 LEU A 4 1.235 -42.728 9.127 1.00 4.39 H +ATOM 72 HD11 LEU A 4 0.380 -42.191 11.824 1.00 4.39 H +ATOM 73 HD12 LEU A 4 0.127 -43.747 11.002 1.00 4.39 H +ATOM 74 HD13 LEU A 4 -1.230 -42.927 11.808 1.00 4.39 H +ATOM 75 HD21 LEU A 4 -0.606 -40.080 10.883 1.00 4.39 H +ATOM 76 HD22 LEU A 4 -2.193 -40.869 10.909 1.00 4.39 H +ATOM 77 HD23 LEU A 4 -1.593 -40.147 9.413 1.00 4.39 H +ATOM 78 HG LEU A 4 -1.359 -42.630 9.370 1.00 4.39 H +ATOM 79 N LEU A 4 -0.012 -42.638 6.869 1.00 4.39 N +ATOM 80 O LEU A 4 1.655 -39.508 7.028 1.00 4.39 O +ATOM 81 C VAL A 5 3.372 -40.190 4.573 1.00 4.39 C +ATOM 82 CA VAL A 5 3.752 -40.956 5.845 1.00 4.39 C +ATOM 83 CB VAL A 5 4.757 -42.083 5.528 1.00 4.39 C +ATOM 84 CG1 VAL A 5 6.019 -41.568 4.827 1.00 4.39 C +ATOM 85 CG2 VAL A 5 5.199 -42.807 6.810 1.00 4.39 C +ATOM 86 H VAL A 5 2.440 -42.503 6.548 1.00 4.39 H +ATOM 87 HA VAL A 5 4.234 -40.242 6.512 1.00 4.39 H +ATOM 88 HB VAL A 5 4.279 -42.813 4.875 1.00 4.39 H +ATOM 89 HG11 VAL A 5 6.494 -40.795 5.431 1.00 4.39 H +ATOM 90 HG12 VAL A 5 5.770 -41.145 3.853 1.00 4.39 H +ATOM 91 HG13 VAL A 5 6.725 -42.383 4.670 1.00 4.39 H +ATOM 92 HG21 VAL A 5 4.347 -43.283 7.297 1.00 4.39 H +ATOM 93 HG22 VAL A 5 5.933 -43.575 6.568 1.00 4.39 H +ATOM 94 HG23 VAL A 5 5.651 -42.093 7.498 1.00 4.39 H +ATOM 95 N VAL A 5 2.554 -41.501 6.509 1.00 4.39 N +ATOM 96 O VAL A 5 3.937 -39.138 4.297 1.00 4.39 O +TER 96 VAL A 5 +END diff --git a/alphafold/alphafold/relax/testdata/multiple_disulfides_target.pdb b/alphafold/alphafold/relax/testdata/multiple_disulfides_target.pdb new file mode 100644 index 0000000000000000000000000000000000000000..9e01f8d4b17f4dc704802b7afae28850ee7e39e4 --- /dev/null +++ b/alphafold/alphafold/relax/testdata/multiple_disulfides_target.pdb @@ -0,0 +1,1478 @@ +MODEL 0 +ATOM 1 N MET A 1 19.164 -28.457 26.130 1.00 0.00 N +ATOM 2 CA MET A 1 19.746 -27.299 25.456 1.00 0.00 C +ATOM 3 C MET A 1 19.080 -26.008 25.921 1.00 0.00 C +ATOM 4 CB MET A 1 19.615 -27.438 23.938 1.00 0.00 C +ATOM 5 O MET A 1 17.853 -25.899 25.913 1.00 0.00 O +ATOM 6 CG MET A 1 19.873 -28.846 23.427 1.00 0.00 C +ATOM 7 SD MET A 1 21.636 -29.126 23.002 1.00 0.00 S +ATOM 8 CE MET A 1 22.302 -27.462 23.284 1.00 0.00 C +ATOM 9 N ALA A 2 19.679 -25.354 27.019 1.00 0.00 N +ATOM 10 CA ALA A 2 19.241 -24.061 27.539 1.00 0.00 C +ATOM 11 C ALA A 2 18.629 -23.204 26.434 1.00 0.00 C +ATOM 12 CB ALA A 2 20.410 -23.326 28.192 1.00 0.00 C +ATOM 13 O ALA A 2 19.158 -23.145 25.322 1.00 0.00 O +ATOM 14 N HIS A 3 17.369 -23.382 26.161 1.00 0.00 N +ATOM 15 CA HIS A 3 16.748 -22.427 25.250 1.00 0.00 C +ATOM 16 C HIS A 3 17.419 -21.061 25.342 1.00 0.00 C +ATOM 17 CB HIS A 3 15.252 -22.299 25.547 1.00 0.00 C +ATOM 18 O HIS A 3 17.896 -20.669 26.409 1.00 0.00 O +ATOM 19 CG HIS A 3 14.464 -23.520 25.196 1.00 0.00 C +ATOM 20 CD2 HIS A 3 13.848 -24.436 25.979 1.00 0.00 C +ATOM 21 ND1 HIS A 3 14.242 -23.914 23.894 1.00 0.00 N +ATOM 22 CE1 HIS A 3 13.520 -25.022 23.892 1.00 0.00 C +ATOM 23 NE2 HIS A 3 13.268 -25.360 25.145 1.00 0.00 N +ATOM 24 N GLU A 4 18.306 -20.798 24.429 1.00 0.00 N +ATOM 25 CA GLU A 4 18.907 -19.505 24.115 1.00 0.00 C +ATOM 26 C GLU A 4 18.392 -18.415 25.050 1.00 0.00 C +ATOM 27 CB GLU A 4 18.631 -19.123 22.659 1.00 0.00 C +ATOM 28 O GLU A 4 17.240 -18.458 25.486 1.00 0.00 O +ATOM 29 CG GLU A 4 19.253 -20.072 21.645 1.00 0.00 C +ATOM 30 CD GLU A 4 20.767 -19.956 21.564 1.00 0.00 C +ATOM 31 OE1 GLU A 4 21.330 -18.981 22.111 1.00 0.00 O +ATOM 32 OE2 GLU A 4 21.394 -20.846 20.948 1.00 0.00 O +ATOM 33 N GLU A 5 19.093 -18.090 26.026 1.00 0.00 N +ATOM 34 CA GLU A 5 19.080 -16.885 26.849 1.00 0.00 C +ATOM 35 C GLU A 5 17.938 -15.956 26.449 1.00 0.00 C +ATOM 36 CB GLU A 5 20.418 -16.148 26.746 1.00 0.00 C +ATOM 37 O GLU A 5 17.774 -15.636 25.269 1.00 0.00 O +ATOM 38 CG GLU A 5 21.604 -16.952 27.257 1.00 0.00 C +ATOM 39 CD GLU A 5 21.641 -17.070 28.772 1.00 0.00 C +ATOM 40 OE1 GLU A 5 20.899 -16.330 29.457 1.00 0.00 O +ATOM 41 OE2 GLU A 5 22.419 -17.909 29.279 1.00 0.00 O +ATOM 42 N ASP A 6 16.721 -16.161 26.857 1.00 0.00 N +ATOM 43 CA ASP A 6 15.629 -15.196 26.948 1.00 0.00 C +ATOM 44 C ASP A 6 16.107 -13.791 26.591 1.00 0.00 C +ATOM 45 CB ASP A 6 15.022 -15.204 28.353 1.00 0.00 C +ATOM 46 O ASP A 6 17.144 -13.339 27.079 1.00 0.00 O +ATOM 47 CG ASP A 6 14.317 -16.507 28.687 1.00 0.00 C +ATOM 48 OD1 ASP A 6 14.123 -16.805 29.885 1.00 0.00 O +ATOM 49 OD2 ASP A 6 13.956 -17.243 27.744 1.00 0.00 O +ATOM 50 N GLY A 7 16.251 -13.433 25.339 1.00 0.00 N +ATOM 51 CA GLY A 7 16.311 -11.996 25.123 1.00 0.00 C +ATOM 52 C GLY A 7 15.833 -11.192 26.317 1.00 0.00 C +ATOM 53 O GLY A 7 15.023 -11.674 27.112 1.00 0.00 O +ATOM 54 N VAL A 8 16.762 -10.664 27.143 1.00 0.00 N +ATOM 55 CA VAL A 8 16.521 -9.756 28.260 1.00 0.00 C +ATOM 56 C VAL A 8 15.307 -8.880 27.960 1.00 0.00 C +ATOM 57 CB VAL A 8 17.755 -8.875 28.552 1.00 0.00 C +ATOM 58 O VAL A 8 15.173 -8.351 26.854 1.00 0.00 O +ATOM 59 CG1 VAL A 8 17.461 -7.891 29.683 1.00 0.00 C +ATOM 60 CG2 VAL A 8 18.962 -9.745 28.898 1.00 0.00 C +ATOM 61 N CYS A 9 14.157 -9.255 28.398 1.00 0.00 N +ATOM 62 CA CYS A 9 13.010 -8.353 28.403 1.00 0.00 C +ATOM 63 C CYS A 9 13.310 -7.095 29.209 1.00 0.00 C +ATOM 64 CB CYS A 9 11.779 -9.055 28.975 1.00 0.00 C +ATOM 65 O CYS A 9 14.058 -7.142 30.187 1.00 0.00 O +ATOM 66 SG CYS A 9 11.197 -10.439 27.970 1.00 0.00 S +ATOM 67 N ASN A 10 13.304 -5.993 28.589 1.00 0.00 N +ATOM 68 CA ASN A 10 13.371 -4.703 29.267 1.00 0.00 C +ATOM 69 C ASN A 10 12.018 -3.997 29.264 1.00 0.00 C +ATOM 70 CB ASN A 10 14.436 -3.812 28.624 1.00 0.00 C +ATOM 71 O ASN A 10 11.047 -4.510 28.706 1.00 0.00 O +ATOM 72 CG ASN A 10 14.149 -3.521 27.164 1.00 0.00 C +ATOM 73 ND2 ASN A 10 15.189 -3.547 26.338 1.00 0.00 N +ATOM 74 OD1 ASN A 10 13.003 -3.275 26.781 1.00 0.00 O +ATOM 75 N SER A 11 11.830 -2.986 30.142 1.00 0.00 N +ATOM 76 CA SER A 11 10.597 -2.233 30.343 1.00 0.00 C +ATOM 77 C SER A 11 10.027 -1.741 29.017 1.00 0.00 C +ATOM 78 CB SER A 11 10.840 -1.044 31.274 1.00 0.00 C +ATOM 79 O SER A 11 8.847 -1.392 28.933 1.00 0.00 O +ATOM 80 OG SER A 11 11.841 -0.190 30.748 1.00 0.00 O +ATOM 81 N ASN A 12 10.789 -1.874 27.933 1.00 0.00 N +ATOM 82 CA ASN A 12 10.334 -1.422 26.622 1.00 0.00 C +ATOM 83 C ASN A 12 9.775 -2.576 25.795 1.00 0.00 C +ATOM 84 CB ASN A 12 11.472 -0.730 25.868 1.00 0.00 C +ATOM 85 O ASN A 12 9.262 -2.365 24.694 1.00 0.00 O +ATOM 86 CG ASN A 12 11.875 0.587 26.501 1.00 0.00 C +ATOM 87 ND2 ASN A 12 13.170 0.882 26.482 1.00 0.00 N +ATOM 88 OD1 ASN A 12 11.031 1.333 27.004 1.00 0.00 O +ATOM 89 N ALA A 13 10.045 -3.775 26.303 1.00 0.00 N +ATOM 90 CA ALA A 13 9.523 -4.930 25.578 1.00 0.00 C +ATOM 91 C ALA A 13 8.001 -4.994 25.671 1.00 0.00 C +ATOM 92 CB ALA A 13 10.140 -6.219 26.115 1.00 0.00 C +ATOM 93 O ALA A 13 7.423 -4.684 26.715 1.00 0.00 O +ATOM 94 N PRO A 14 7.310 -5.193 24.591 1.00 0.00 N +ATOM 95 CA PRO A 14 5.846 -5.238 24.577 1.00 0.00 C +ATOM 96 C PRO A 14 5.280 -6.316 25.499 1.00 0.00 C +ATOM 97 CB PRO A 14 5.517 -5.544 23.113 1.00 0.00 C +ATOM 98 O PRO A 14 4.127 -6.222 25.929 1.00 0.00 O +ATOM 99 CG PRO A 14 6.757 -6.177 22.568 1.00 0.00 C +ATOM 100 CD PRO A 14 7.941 -5.617 23.303 1.00 0.00 C +ATOM 101 N CYS A 15 6.076 -7.229 25.793 1.00 0.00 N +ATOM 102 CA CYS A 15 5.597 -8.339 26.610 1.00 0.00 C +ATOM 103 C CYS A 15 6.142 -8.245 28.030 1.00 0.00 C +ATOM 104 CB CYS A 15 5.999 -9.676 25.987 1.00 0.00 C +ATOM 105 O CYS A 15 6.205 -9.249 28.743 1.00 0.00 O +ATOM 106 SG CYS A 15 7.766 -9.813 25.636 1.00 0.00 S +ATOM 107 N TYR A 16 6.510 -6.994 28.366 1.00 0.00 N +ATOM 108 CA TYR A 16 7.076 -6.735 29.685 1.00 0.00 C +ATOM 109 C TYR A 16 5.978 -6.589 30.731 1.00 0.00 C +ATOM 110 CB TYR A 16 7.944 -5.473 29.659 1.00 0.00 C +ATOM 111 O TYR A 16 5.053 -5.791 30.563 1.00 0.00 O +ATOM 112 CG TYR A 16 8.545 -5.122 30.998 1.00 0.00 C +ATOM 113 CD1 TYR A 16 8.126 -3.993 31.698 1.00 0.00 C +ATOM 114 CD2 TYR A 16 9.534 -5.918 31.566 1.00 0.00 C +ATOM 115 CE1 TYR A 16 8.678 -3.665 32.932 1.00 0.00 C +ATOM 116 CE2 TYR A 16 10.093 -5.600 32.799 1.00 0.00 C +ATOM 117 OH TYR A 16 10.210 -4.153 34.695 1.00 0.00 O +ATOM 118 CZ TYR A 16 9.660 -4.473 33.474 1.00 0.00 C +ATOM 119 N HIS A 17 5.834 -7.548 31.703 1.00 0.00 N +ATOM 120 CA HIS A 17 4.846 -7.504 32.775 1.00 0.00 C +ATOM 121 C HIS A 17 5.518 -7.493 34.143 1.00 0.00 C +ATOM 122 CB HIS A 17 3.888 -8.692 32.669 1.00 0.00 C +ATOM 123 O HIS A 17 6.482 -8.228 34.372 1.00 0.00 O +ATOM 124 CG HIS A 17 2.782 -8.661 33.675 1.00 0.00 C +ATOM 125 CD2 HIS A 17 2.548 -9.432 34.764 1.00 0.00 C +ATOM 126 ND1 HIS A 17 1.748 -7.752 33.617 1.00 0.00 N +ATOM 127 CE1 HIS A 17 0.924 -7.965 34.630 1.00 0.00 C +ATOM 128 NE2 HIS A 17 1.387 -8.979 35.341 1.00 0.00 N +ATOM 129 N CYS A 18 5.067 -6.579 34.995 1.00 0.00 N +ATOM 130 CA CYS A 18 5.599 -6.487 36.350 1.00 0.00 C +ATOM 131 C CYS A 18 4.501 -6.711 37.383 1.00 0.00 C +ATOM 132 CB CYS A 18 6.255 -5.126 36.577 1.00 0.00 C +ATOM 133 O CYS A 18 3.325 -6.465 37.109 1.00 0.00 O +ATOM 134 SG CYS A 18 7.757 -4.870 35.607 1.00 0.00 S +ATOM 135 N ASP A 19 4.791 -7.344 38.476 1.00 0.00 N +ATOM 136 CA ASP A 19 3.829 -7.460 39.568 1.00 0.00 C +ATOM 137 C ASP A 19 3.430 -6.084 40.096 1.00 0.00 C +ATOM 138 CB ASP A 19 4.403 -8.313 40.701 1.00 0.00 C +ATOM 139 O ASP A 19 3.960 -5.064 39.651 1.00 0.00 O +ATOM 140 CG ASP A 19 5.572 -7.650 41.408 1.00 0.00 C +ATOM 141 OD1 ASP A 19 6.325 -8.345 42.124 1.00 0.00 O +ATOM 142 OD2 ASP A 19 5.741 -6.422 41.250 1.00 0.00 O +ATOM 143 N ALA A 20 2.383 -5.908 40.933 1.00 0.00 N +ATOM 144 CA ALA A 20 1.776 -4.676 41.429 1.00 0.00 C +ATOM 145 C ALA A 20 2.806 -3.807 42.144 1.00 0.00 C +ATOM 146 CB ALA A 20 0.612 -4.995 42.363 1.00 0.00 C +ATOM 147 O ALA A 20 2.714 -2.577 42.119 1.00 0.00 O +ATOM 148 N ASN A 21 3.841 -4.457 42.638 1.00 0.00 N +ATOM 149 CA ASN A 21 4.863 -3.719 43.373 1.00 0.00 C +ATOM 150 C ASN A 21 6.048 -3.362 42.480 1.00 0.00 C +ATOM 151 CB ASN A 21 5.335 -4.521 44.588 1.00 0.00 C +ATOM 152 O ASN A 21 6.980 -2.686 42.919 1.00 0.00 O +ATOM 153 CG ASN A 21 4.246 -4.704 45.626 1.00 0.00 C +ATOM 154 ND2 ASN A 21 4.183 -5.892 46.216 1.00 0.00 N +ATOM 155 OD1 ASN A 21 3.467 -3.786 45.895 1.00 0.00 O +ATOM 156 N GLY A 22 5.989 -3.893 41.230 1.00 0.00 N +ATOM 157 CA GLY A 22 7.093 -3.614 40.325 1.00 0.00 C +ATOM 158 C GLY A 22 8.376 -4.324 40.712 1.00 0.00 C +ATOM 159 O GLY A 22 9.456 -3.972 40.234 1.00 0.00 O +ATOM 160 N GLU A 23 8.305 -5.221 41.664 1.00 0.00 N +ATOM 161 CA GLU A 23 9.501 -5.877 42.183 1.00 0.00 C +ATOM 162 C GLU A 23 9.861 -7.105 41.352 1.00 0.00 C +ATOM 163 CB GLU A 23 9.306 -6.272 43.649 1.00 0.00 C +ATOM 164 O GLU A 23 11.038 -7.361 41.089 1.00 0.00 O +ATOM 165 CG GLU A 23 9.200 -5.085 44.596 1.00 0.00 C +ATOM 166 CD GLU A 23 9.074 -5.493 46.055 1.00 0.00 C +ATOM 167 OE1 GLU A 23 9.075 -6.710 46.348 1.00 0.00 O +ATOM 168 OE2 GLU A 23 8.972 -4.587 46.913 1.00 0.00 O +ATOM 169 N ASN A 24 8.853 -7.853 40.844 1.00 0.00 N +ATOM 170 CA ASN A 24 9.050 -9.077 40.075 1.00 0.00 C +ATOM 171 C ASN A 24 8.522 -8.936 38.651 1.00 0.00 C +ATOM 172 CB ASN A 24 8.381 -10.263 40.774 1.00 0.00 C +ATOM 173 O ASN A 24 7.317 -9.045 38.417 1.00 0.00 O +ATOM 174 CG ASN A 24 8.973 -10.546 42.140 1.00 0.00 C +ATOM 175 ND2 ASN A 24 8.125 -10.569 43.162 1.00 0.00 N +ATOM 176 OD1 ASN A 24 10.184 -10.741 42.277 1.00 0.00 O +ATOM 177 N CYS A 25 9.371 -8.554 37.764 1.00 0.00 N +ATOM 178 CA CYS A 25 8.978 -8.390 36.369 1.00 0.00 C +ATOM 179 C CYS A 25 9.448 -9.572 35.529 1.00 0.00 C +ATOM 180 CB CYS A 25 9.548 -7.091 35.800 1.00 0.00 C +ATOM 181 O CYS A 25 10.486 -10.171 35.816 1.00 0.00 O +ATOM 182 SG CYS A 25 8.933 -5.605 36.623 1.00 0.00 S +ATOM 183 N SER A 26 8.561 -10.102 34.701 1.00 0.00 N +ATOM 184 CA SER A 26 8.921 -11.145 33.746 1.00 0.00 C +ATOM 185 C SER A 26 8.422 -10.808 32.345 1.00 0.00 C +ATOM 186 CB SER A 26 8.353 -12.495 34.187 1.00 0.00 C +ATOM 187 O SER A 26 7.563 -9.940 32.178 1.00 0.00 O +ATOM 188 OG SER A 26 6.936 -12.470 34.186 1.00 0.00 O +ATOM 189 N CYS A 27 9.208 -11.265 31.277 1.00 0.00 N +ATOM 190 CA CYS A 27 8.779 -11.211 29.884 1.00 0.00 C +ATOM 191 C CYS A 27 7.948 -12.436 29.521 1.00 0.00 C +ATOM 192 CB CYS A 27 9.988 -11.110 28.954 1.00 0.00 C +ATOM 193 O CYS A 27 8.470 -13.551 29.464 1.00 0.00 O +ATOM 194 SG CYS A 27 10.970 -9.614 29.197 1.00 0.00 S +ATOM 195 N ASN A 28 6.768 -12.360 29.728 1.00 0.00 N +ATOM 196 CA ASN A 28 5.905 -13.476 29.355 1.00 0.00 C +ATOM 197 C ASN A 28 5.123 -13.178 28.079 1.00 0.00 C +ATOM 198 CB ASN A 28 4.946 -13.817 30.498 1.00 0.00 C +ATOM 199 O ASN A 28 4.074 -12.532 28.125 1.00 0.00 O +ATOM 200 CG ASN A 28 4.239 -15.142 30.291 1.00 0.00 C +ATOM 201 ND2 ASN A 28 3.472 -15.568 31.288 1.00 0.00 N +ATOM 202 OD1 ASN A 28 4.381 -15.779 29.243 1.00 0.00 O +ATOM 203 N CYS A 29 5.741 -13.488 26.787 1.00 0.00 N +ATOM 204 CA CYS A 29 5.086 -13.282 25.500 1.00 0.00 C +ATOM 205 C CYS A 29 3.880 -14.201 25.348 1.00 0.00 C +ATOM 206 CB CYS A 29 6.070 -13.522 24.355 1.00 0.00 C +ATOM 207 O CYS A 29 3.011 -13.958 24.510 1.00 0.00 O +ATOM 208 SG CYS A 29 7.446 -12.353 24.319 1.00 0.00 S +ATOM 209 N GLU A 30 3.849 -15.077 26.140 1.00 0.00 N +ATOM 210 CA GLU A 30 2.725 -16.005 26.063 1.00 0.00 C +ATOM 211 C GLU A 30 1.452 -15.379 26.627 1.00 0.00 C +ATOM 212 CB GLU A 30 3.047 -17.303 26.808 1.00 0.00 C +ATOM 213 O GLU A 30 0.344 -15.770 26.255 1.00 0.00 O +ATOM 214 CG GLU A 30 4.161 -18.119 26.169 1.00 0.00 C +ATOM 215 CD GLU A 30 4.469 -19.405 26.919 1.00 0.00 C +ATOM 216 OE1 GLU A 30 3.822 -19.672 27.957 1.00 0.00 O +ATOM 217 OE2 GLU A 30 5.366 -20.150 26.466 1.00 0.00 O +ATOM 218 N LEU A 31 1.743 -14.305 27.387 1.00 0.00 N +ATOM 219 CA LEU A 31 0.622 -13.672 28.074 1.00 0.00 C +ATOM 220 C LEU A 31 0.044 -12.536 27.237 1.00 0.00 C +ATOM 221 CB LEU A 31 1.061 -13.142 29.441 1.00 0.00 C +ATOM 222 O LEU A 31 -0.996 -11.971 27.584 1.00 0.00 O +ATOM 223 CG LEU A 31 1.437 -14.194 30.487 1.00 0.00 C +ATOM 224 CD1 LEU A 31 1.920 -13.520 31.766 1.00 0.00 C +ATOM 225 CD2 LEU A 31 0.252 -15.110 30.774 1.00 0.00 C +ATOM 226 N PHE A 32 0.769 -12.166 26.008 1.00 0.00 N +ATOM 227 CA PHE A 32 0.157 -11.063 25.278 1.00 0.00 C +ATOM 228 C PHE A 32 -1.020 -11.553 24.443 1.00 0.00 C +ATOM 229 CB PHE A 32 1.188 -10.374 24.378 1.00 0.00 C +ATOM 230 O PHE A 32 -0.898 -12.531 23.702 1.00 0.00 O +ATOM 231 CG PHE A 32 2.115 -9.447 25.117 1.00 0.00 C +ATOM 232 CD1 PHE A 32 3.383 -9.869 25.499 1.00 0.00 C +ATOM 233 CD2 PHE A 32 1.719 -8.153 25.429 1.00 0.00 C +ATOM 234 CE1 PHE A 32 4.243 -9.014 26.183 1.00 0.00 C +ATOM 235 CE2 PHE A 32 2.574 -7.293 26.112 1.00 0.00 C +ATOM 236 CZ PHE A 32 3.835 -7.725 26.489 1.00 0.00 C +ATOM 237 N ASP A 33 -2.070 -11.361 25.097 1.00 0.00 N +ATOM 238 CA ASP A 33 -3.364 -11.602 24.466 1.00 0.00 C +ATOM 239 C ASP A 33 -3.423 -10.975 23.075 1.00 0.00 C +ATOM 240 CB ASP A 33 -4.496 -11.055 25.339 1.00 0.00 C +ATOM 241 O ASP A 33 -3.225 -9.767 22.924 1.00 0.00 O +ATOM 242 CG ASP A 33 -5.861 -11.590 24.943 1.00 0.00 C +ATOM 243 OD1 ASP A 33 -6.769 -11.638 25.800 1.00 0.00 O +ATOM 244 OD2 ASP A 33 -6.029 -11.969 23.764 1.00 0.00 O +ATOM 245 N CYS A 34 -3.021 -11.756 22.063 1.00 0.00 N +ATOM 246 CA CYS A 34 -3.371 -11.337 20.711 1.00 0.00 C +ATOM 247 C CYS A 34 -4.691 -10.576 20.700 1.00 0.00 C +ATOM 248 CB CYS A 34 -3.461 -12.547 19.781 1.00 0.00 C +ATOM 249 O CYS A 34 -4.986 -9.851 19.748 1.00 0.00 O +ATOM 250 SG CYS A 34 -1.909 -13.455 19.615 1.00 0.00 S +ATOM 251 N GLU A 35 -5.284 -10.672 21.987 1.00 0.00 N +ATOM 252 CA GLU A 35 -6.617 -10.086 22.085 1.00 0.00 C +ATOM 253 C GLU A 35 -6.556 -8.667 22.644 1.00 0.00 C +ATOM 254 CB GLU A 35 -7.525 -10.956 22.958 1.00 0.00 C +ATOM 255 O GLU A 35 -7.592 -8.032 22.853 1.00 0.00 O +ATOM 256 CG GLU A 35 -7.790 -12.339 22.381 1.00 0.00 C +ATOM 257 CD GLU A 35 -8.779 -13.152 23.202 1.00 0.00 C +ATOM 258 OE1 GLU A 35 -9.290 -12.636 24.222 1.00 0.00 O +ATOM 259 OE2 GLU A 35 -9.046 -14.314 22.821 1.00 0.00 O +ATOM 260 N ALA A 36 -5.315 -8.202 22.860 1.00 0.00 N +ATOM 261 CA ALA A 36 -5.282 -6.884 23.489 1.00 0.00 C +ATOM 262 C ALA A 36 -5.714 -5.797 22.509 1.00 0.00 C +ATOM 263 CB ALA A 36 -3.884 -6.586 24.027 1.00 0.00 C +ATOM 264 O ALA A 36 -5.299 -5.799 21.348 1.00 0.00 O +ATOM 265 N LYS A 37 -6.942 -5.271 22.819 1.00 0.00 N +ATOM 266 CA LYS A 37 -7.519 -4.143 22.094 1.00 0.00 C +ATOM 267 C LYS A 37 -6.974 -2.817 22.617 1.00 0.00 C +ATOM 268 CB LYS A 37 -9.045 -4.160 22.200 1.00 0.00 C +ATOM 269 O LYS A 37 -6.897 -2.606 23.829 1.00 0.00 O +ATOM 270 CG LYS A 37 -9.701 -5.341 21.499 1.00 0.00 C +ATOM 271 CD LYS A 37 -11.220 -5.239 21.536 1.00 0.00 C +ATOM 272 CE LYS A 37 -11.877 -6.385 20.778 1.00 0.00 C +ATOM 273 NZ LYS A 37 -13.353 -6.194 20.656 1.00 0.00 N +ATOM 274 N LYS A 38 -6.207 -2.111 21.604 1.00 0.00 N +ATOM 275 CA LYS A 38 -5.876 -0.745 21.998 1.00 0.00 C +ATOM 276 C LYS A 38 -7.131 0.118 22.100 1.00 0.00 C +ATOM 277 CB LYS A 38 -4.892 -0.123 21.007 1.00 0.00 C +ATOM 278 O LYS A 38 -8.188 -0.253 21.585 1.00 0.00 O +ATOM 279 CG LYS A 38 -3.518 -0.776 21.006 1.00 0.00 C +ATOM 280 CD LYS A 38 -2.564 -0.072 20.049 1.00 0.00 C +ATOM 281 CE LYS A 38 -1.196 -0.740 20.029 1.00 0.00 C +ATOM 282 NZ LYS A 38 -0.234 -0.007 19.153 1.00 0.00 N +ATOM 283 N PRO A 39 -7.175 1.097 22.994 1.00 0.00 N +ATOM 284 CA PRO A 39 -8.319 2.000 23.133 1.00 0.00 C +ATOM 285 C PRO A 39 -8.863 2.474 21.787 1.00 0.00 C +ATOM 286 CB PRO A 39 -7.748 3.173 23.934 1.00 0.00 C +ATOM 287 O PRO A 39 -10.057 2.762 21.666 1.00 0.00 O +ATOM 288 CG PRO A 39 -6.594 2.594 24.688 1.00 0.00 C +ATOM 289 CD PRO A 39 -6.004 1.478 23.874 1.00 0.00 C +ATOM 290 N ASP A 40 -8.068 2.468 20.731 1.00 0.00 N +ATOM 291 CA ASP A 40 -8.452 2.969 19.415 1.00 0.00 C +ATOM 292 C ASP A 40 -9.034 1.852 18.551 1.00 0.00 C +ATOM 293 CB ASP A 40 -7.252 3.607 18.712 1.00 0.00 C +ATOM 294 O ASP A 40 -9.337 2.064 17.375 1.00 0.00 O +ATOM 295 CG ASP A 40 -6.113 2.630 18.480 1.00 0.00 C +ATOM 296 OD1 ASP A 40 -5.040 3.049 17.994 1.00 0.00 O +ATOM 297 OD2 ASP A 40 -6.290 1.431 18.784 1.00 0.00 O +ATOM 298 N GLY A 41 -9.199 0.638 19.013 1.00 0.00 N +ATOM 299 CA GLY A 41 -9.761 -0.484 18.279 1.00 0.00 C +ATOM 300 C GLY A 41 -8.723 -1.268 17.500 1.00 0.00 C +ATOM 301 O GLY A 41 -9.019 -2.338 16.963 1.00 0.00 O +ATOM 302 N SER A 42 -7.510 -0.651 17.403 1.00 0.00 N +ATOM 303 CA SER A 42 -6.433 -1.355 16.714 1.00 0.00 C +ATOM 304 C SER A 42 -5.824 -2.436 17.601 1.00 0.00 C +ATOM 305 CB SER A 42 -5.346 -0.373 16.274 1.00 0.00 C +ATOM 306 O SER A 42 -6.031 -2.440 18.816 1.00 0.00 O +ATOM 307 OG SER A 42 -4.758 0.262 17.396 1.00 0.00 O +ATOM 308 N TYR A 43 -5.412 -3.575 16.938 1.00 0.00 N +ATOM 309 CA TYR A 43 -4.705 -4.628 17.660 1.00 0.00 C +ATOM 310 C TYR A 43 -3.244 -4.254 17.877 1.00 0.00 C +ATOM 311 CB TYR A 43 -4.798 -5.955 16.901 1.00 0.00 C +ATOM 312 O TYR A 43 -2.651 -3.542 17.063 1.00 0.00 O +ATOM 313 CG TYR A 43 -6.184 -6.551 16.887 1.00 0.00 C +ATOM 314 CD1 TYR A 43 -7.022 -6.388 15.786 1.00 0.00 C +ATOM 315 CD2 TYR A 43 -6.659 -7.277 17.974 1.00 0.00 C +ATOM 316 CE1 TYR A 43 -8.302 -6.934 15.769 1.00 0.00 C +ATOM 317 CE2 TYR A 43 -7.937 -7.827 17.968 1.00 0.00 C +ATOM 318 OH TYR A 43 -10.015 -8.194 16.852 1.00 0.00 O +ATOM 319 CZ TYR A 43 -8.749 -7.651 16.863 1.00 0.00 C +ATOM 320 N ALA A 44 -3.024 -4.415 19.155 1.00 0.00 N +ATOM 321 CA ALA A 44 -1.659 -4.137 19.595 1.00 0.00 C +ATOM 322 C ALA A 44 -0.642 -4.865 18.721 1.00 0.00 C +ATOM 323 CB ALA A 44 -1.480 -4.536 21.058 1.00 0.00 C +ATOM 324 O ALA A 44 0.477 -4.383 18.527 1.00 0.00 O +ATOM 325 N HIS A 45 -1.081 -5.938 17.989 1.00 0.00 N +ATOM 326 CA HIS A 45 -0.065 -6.665 17.236 1.00 0.00 C +ATOM 327 C HIS A 45 -0.455 -6.795 15.768 1.00 0.00 C +ATOM 328 CB HIS A 45 0.163 -8.051 17.843 1.00 0.00 C +ATOM 329 O HIS A 45 -1.558 -7.246 15.452 1.00 0.00 O +ATOM 330 CG HIS A 45 1.501 -8.634 17.520 1.00 0.00 C +ATOM 331 CD2 HIS A 45 2.577 -8.880 18.304 1.00 0.00 C +ATOM 332 ND1 HIS A 45 1.850 -9.037 16.249 1.00 0.00 N +ATOM 333 CE1 HIS A 45 3.086 -9.508 16.266 1.00 0.00 C +ATOM 334 NE2 HIS A 45 3.550 -9.423 17.502 1.00 0.00 N +ATOM 335 N PRO A 46 0.267 -6.191 14.776 1.00 0.00 N +ATOM 336 CA PRO A 46 0.007 -6.193 13.334 1.00 0.00 C +ATOM 337 C PRO A 46 -0.224 -7.596 12.778 1.00 0.00 C +ATOM 338 CB PRO A 46 1.278 -5.574 12.747 1.00 0.00 C +ATOM 339 O PRO A 46 -0.835 -7.750 11.717 1.00 0.00 O +ATOM 340 CG PRO A 46 2.320 -5.770 13.800 1.00 0.00 C +ATOM 341 CD PRO A 46 1.648 -5.768 15.143 1.00 0.00 C +ATOM 342 N CYS A 47 0.238 -8.592 13.354 1.00 0.00 N +ATOM 343 CA CYS A 47 0.115 -9.950 12.835 1.00 0.00 C +ATOM 344 C CYS A 47 -1.253 -10.537 13.163 1.00 0.00 C +ATOM 345 CB CYS A 47 1.214 -10.844 13.408 1.00 0.00 C +ATOM 346 O CYS A 47 -1.515 -11.707 12.880 1.00 0.00 O +ATOM 347 SG CYS A 47 1.222 -10.923 15.212 1.00 0.00 S +ATOM 348 N ARG A 48 -2.155 -9.724 13.452 1.00 0.00 N +ATOM 349 CA ARG A 48 -3.422 -10.192 14.005 1.00 0.00 C +ATOM 350 C ARG A 48 -4.542 -10.086 12.974 1.00 0.00 C +ATOM 351 CB ARG A 48 -3.788 -9.396 15.260 1.00 0.00 C +ATOM 352 O ARG A 48 -4.649 -9.082 12.268 1.00 0.00 O +ATOM 353 CG ARG A 48 -5.032 -9.905 15.970 1.00 0.00 C +ATOM 354 CD ARG A 48 -5.909 -8.761 16.460 1.00 0.00 C +ATOM 355 NE ARG A 48 -6.344 -7.906 15.359 1.00 0.00 N +ATOM 356 NH1 ARG A 48 -6.885 -6.103 16.700 1.00 0.00 N +ATOM 357 NH2 ARG A 48 -7.167 -5.974 14.429 1.00 0.00 N +ATOM 358 CZ ARG A 48 -6.798 -6.663 15.499 1.00 0.00 C +ATOM 359 N ARG A 49 -5.146 -11.174 12.527 1.00 0.00 N +ATOM 360 CA ARG A 49 -6.391 -11.158 11.765 1.00 0.00 C +ATOM 361 C ARG A 49 -7.546 -11.713 12.593 1.00 0.00 C +ATOM 362 CB ARG A 49 -6.241 -11.962 10.472 1.00 0.00 C +ATOM 363 O ARG A 49 -7.402 -12.739 13.261 1.00 0.00 O +ATOM 364 CG ARG A 49 -5.303 -11.327 9.458 1.00 0.00 C +ATOM 365 CD ARG A 49 -5.887 -10.048 8.873 1.00 0.00 C +ATOM 366 NE ARG A 49 -5.349 -9.769 7.544 1.00 0.00 N +ATOM 367 NH1 ARG A 49 -6.902 -8.137 7.033 1.00 0.00 N +ATOM 368 NH2 ARG A 49 -5.276 -8.694 5.516 1.00 0.00 N +ATOM 369 CZ ARG A 49 -5.843 -8.867 6.701 1.00 0.00 C +ATOM 370 N CYS A 50 -8.427 -10.800 12.832 1.00 0.00 N +ATOM 371 CA CYS A 50 -9.591 -11.226 13.601 1.00 0.00 C +ATOM 372 C CYS A 50 -10.795 -11.442 12.692 1.00 0.00 C +ATOM 373 CB CYS A 50 -9.931 -10.193 14.675 1.00 0.00 C +ATOM 374 O CYS A 50 -11.034 -10.657 11.773 1.00 0.00 O +ATOM 375 SG CYS A 50 -8.684 -10.057 15.975 1.00 0.00 S +ATOM 376 N ASP A 51 -11.409 -12.618 12.691 1.00 0.00 N +ATOM 377 CA ASP A 51 -12.641 -12.851 11.943 1.00 0.00 C +ATOM 378 C ASP A 51 -13.818 -12.115 12.580 1.00 0.00 C +ATOM 379 CB ASP A 51 -12.942 -14.349 11.858 1.00 0.00 C +ATOM 380 O ASP A 51 -13.640 -11.361 13.539 1.00 0.00 O +ATOM 381 CG ASP A 51 -13.232 -14.974 13.211 1.00 0.00 C +ATOM 382 OD1 ASP A 51 -13.125 -16.212 13.347 1.00 0.00 O +ATOM 383 OD2 ASP A 51 -13.573 -14.221 14.150 1.00 0.00 O +ATOM 384 N ALA A 52 -15.076 -12.051 11.991 1.00 0.00 N +ATOM 385 CA ALA A 52 -16.275 -11.314 12.381 1.00 0.00 C +ATOM 386 C ALA A 52 -16.730 -11.710 13.783 1.00 0.00 C +ATOM 387 CB ALA A 52 -17.397 -11.550 11.374 1.00 0.00 C +ATOM 388 O ALA A 52 -17.439 -10.952 14.450 1.00 0.00 O +ATOM 389 N ASN A 53 -16.263 -12.790 14.290 1.00 0.00 N +ATOM 390 CA ASN A 53 -16.638 -13.257 15.620 1.00 0.00 C +ATOM 391 C ASN A 53 -15.557 -12.943 16.650 1.00 0.00 C +ATOM 392 CB ASN A 53 -16.930 -14.759 15.599 1.00 0.00 C +ATOM 393 O ASN A 53 -15.602 -13.442 17.776 1.00 0.00 O +ATOM 394 CG ASN A 53 -18.169 -15.101 14.795 1.00 0.00 C +ATOM 395 ND2 ASN A 53 -18.098 -16.183 14.029 1.00 0.00 N +ATOM 396 OD1 ASN A 53 -19.181 -14.399 14.862 1.00 0.00 O +ATOM 397 N ASN A 54 -14.551 -12.153 16.191 1.00 0.00 N +ATOM 398 CA ASN A 54 -13.470 -11.666 17.041 1.00 0.00 C +ATOM 399 C ASN A 54 -12.543 -12.798 17.474 1.00 0.00 C +ATOM 400 CB ASN A 54 -14.034 -10.943 18.266 1.00 0.00 C +ATOM 401 O ASN A 54 -11.968 -12.753 18.563 1.00 0.00 O +ATOM 402 CG ASN A 54 -14.752 -9.657 17.906 1.00 0.00 C +ATOM 403 ND2 ASN A 54 -15.894 -9.418 18.540 1.00 0.00 N +ATOM 404 OD1 ASN A 54 -14.285 -8.885 17.065 1.00 0.00 O +ATOM 405 N ILE A 55 -12.428 -13.839 16.751 1.00 0.00 N +ATOM 406 CA ILE A 55 -11.423 -14.875 16.963 1.00 0.00 C +ATOM 407 C ILE A 55 -10.158 -14.536 16.179 1.00 0.00 C +ATOM 408 CB ILE A 55 -11.952 -16.268 16.552 1.00 0.00 C +ATOM 409 O ILE A 55 -10.162 -14.552 14.946 1.00 0.00 O +ATOM 410 CG1 ILE A 55 -13.233 -16.602 17.325 1.00 0.00 C +ATOM 411 CG2 ILE A 55 -10.881 -17.340 16.777 1.00 0.00 C +ATOM 412 CD1 ILE A 55 -13.942 -17.857 16.834 1.00 0.00 C +ATOM 413 N CYS A 56 -9.197 -14.050 16.887 1.00 0.00 N +ATOM 414 CA CYS A 56 -7.960 -13.587 16.266 1.00 0.00 C +ATOM 415 C CYS A 56 -6.914 -14.694 16.244 1.00 0.00 C +ATOM 416 CB CYS A 56 -7.411 -12.369 17.009 1.00 0.00 C +ATOM 417 O CYS A 56 -6.807 -15.473 17.192 1.00 0.00 O +ATOM 418 SG CYS A 56 -8.495 -10.925 16.941 1.00 0.00 S +ATOM 419 N LYS A 57 -6.417 -14.976 15.112 1.00 0.00 N +ATOM 420 CA LYS A 57 -5.263 -15.861 14.977 1.00 0.00 C +ATOM 421 C LYS A 57 -4.007 -15.075 14.612 1.00 0.00 C +ATOM 422 CB LYS A 57 -5.532 -16.937 13.924 1.00 0.00 C +ATOM 423 O LYS A 57 -4.077 -14.092 13.873 1.00 0.00 O +ATOM 424 CG LYS A 57 -6.672 -17.880 14.280 1.00 0.00 C +ATOM 425 CD LYS A 57 -6.811 -19.000 13.257 1.00 0.00 C +ATOM 426 CE LYS A 57 -7.903 -19.986 13.651 1.00 0.00 C +ATOM 427 NZ LYS A 57 -7.947 -21.161 12.730 1.00 0.00 N +ATOM 428 N CYS A 58 -2.976 -15.105 15.608 1.00 0.00 N +ATOM 429 CA CYS A 58 -1.644 -14.583 15.328 1.00 0.00 C +ATOM 430 C CYS A 58 -0.938 -15.425 14.272 1.00 0.00 C +ATOM 431 CB CYS A 58 -0.804 -14.543 16.605 1.00 0.00 C +ATOM 432 O CYS A 58 -0.662 -16.605 14.495 1.00 0.00 O +ATOM 433 SG CYS A 58 -1.471 -13.452 17.881 1.00 0.00 S +ATOM 434 N SER A 59 -1.100 -15.266 13.105 1.00 0.00 N +ATOM 435 CA SER A 59 -0.317 -16.194 12.296 1.00 0.00 C +ATOM 436 C SER A 59 0.363 -15.475 11.135 1.00 0.00 C +ATOM 437 CB SER A 59 -1.204 -17.319 11.760 1.00 0.00 C +ATOM 438 O SER A 59 -0.281 -15.151 10.135 1.00 0.00 O +ATOM 439 OG SER A 59 -0.425 -18.302 11.100 1.00 0.00 O +ATOM 440 N CYS A 60 1.699 -14.861 11.329 1.00 0.00 N +ATOM 441 CA CYS A 60 2.405 -14.577 10.084 1.00 0.00 C +ATOM 442 C CYS A 60 2.585 -15.845 9.258 1.00 0.00 C +ATOM 443 CB CYS A 60 3.768 -13.947 10.372 1.00 0.00 C +ATOM 444 O CYS A 60 2.717 -15.781 8.035 1.00 0.00 O +ATOM 445 SG CYS A 60 4.863 -14.997 11.352 1.00 0.00 S +ATOM 446 N THR A 61 2.370 -16.747 10.083 1.00 0.00 N +ATOM 447 CA THR A 61 2.549 -18.025 9.403 1.00 0.00 C +ATOM 448 C THR A 61 1.237 -18.493 8.779 1.00 0.00 C +ATOM 449 CB THR A 61 3.075 -19.103 10.369 1.00 0.00 C +ATOM 450 O THR A 61 1.241 -19.301 7.848 1.00 0.00 O +ATOM 451 CG2 THR A 61 4.474 -18.758 10.869 1.00 0.00 C +ATOM 452 OG1 THR A 61 2.190 -19.204 11.491 1.00 0.00 O +ATOM 453 N ALA A 62 0.127 -17.759 9.279 1.00 0.00 N +ATOM 454 CA ALA A 62 -1.157 -18.259 8.792 1.00 0.00 C +ATOM 455 C ALA A 62 -1.490 -17.673 7.423 1.00 0.00 C +ATOM 456 CB ALA A 62 -2.266 -17.936 9.790 1.00 0.00 C +ATOM 457 O ALA A 62 -2.183 -18.305 6.623 1.00 0.00 O +ATOM 458 N ILE A 63 -0.953 -16.508 7.207 1.00 0.00 N +ATOM 459 CA ILE A 63 -1.310 -15.966 5.900 1.00 0.00 C +ATOM 460 C ILE A 63 -0.123 -16.091 4.948 1.00 0.00 C +ATOM 461 CB ILE A 63 -1.761 -14.492 6.004 1.00 0.00 C +ATOM 462 O ILE A 63 0.973 -15.611 5.246 1.00 0.00 O +ATOM 463 CG1 ILE A 63 -2.978 -14.369 6.929 1.00 0.00 C +ATOM 464 CG2 ILE A 63 -2.068 -13.922 4.616 1.00 0.00 C +ATOM 465 CD1 ILE A 63 -3.430 -12.936 7.171 1.00 0.00 C +ATOM 466 N PRO A 64 -0.261 -17.160 4.081 1.00 0.00 N +ATOM 467 CA PRO A 64 0.812 -17.254 3.088 1.00 0.00 C +ATOM 468 C PRO A 64 1.182 -15.899 2.489 1.00 0.00 C +ATOM 469 CB PRO A 64 0.224 -18.181 2.021 1.00 0.00 C +ATOM 470 O PRO A 64 0.304 -15.069 2.242 1.00 0.00 O +ATOM 471 CG PRO A 64 -1.257 -18.050 2.175 1.00 0.00 C +ATOM 472 CD PRO A 64 -1.560 -17.707 3.605 1.00 0.00 C +ATOM 473 N CYS A 65 2.470 -15.492 2.721 1.00 0.00 N +ATOM 474 CA CYS A 65 2.970 -14.283 2.076 1.00 0.00 C +ATOM 475 C CYS A 65 2.884 -14.399 0.559 1.00 0.00 C +ATOM 476 CB CYS A 65 4.415 -14.011 2.494 1.00 0.00 C +ATOM 477 O CYS A 65 3.627 -15.170 -0.052 1.00 0.00 O +ATOM 478 SG CYS A 65 4.983 -12.341 2.107 1.00 0.00 S +ATOM 479 N ASN A 66 1.810 -14.008 0.034 1.00 0.00 N +ATOM 480 CA ASN A 66 1.657 -13.952 -1.416 1.00 0.00 C +ATOM 481 C ASN A 66 1.636 -12.512 -1.922 1.00 0.00 C +ATOM 482 CB ASN A 66 0.388 -14.686 -1.851 1.00 0.00 C +ATOM 483 O ASN A 66 1.843 -11.575 -1.149 1.00 0.00 O +ATOM 484 CG ASN A 66 -0.864 -14.121 -1.209 1.00 0.00 C +ATOM 485 ND2 ASN A 66 -1.787 -14.999 -0.835 1.00 0.00 N +ATOM 486 OD1 ASN A 66 -0.999 -12.905 -1.050 1.00 0.00 O +ATOM 487 N GLU A 67 1.630 -12.346 -3.214 1.00 0.00 N +ATOM 488 CA GLU A 67 1.700 -11.038 -3.857 1.00 0.00 C +ATOM 489 C GLU A 67 0.657 -10.083 -3.284 1.00 0.00 C +ATOM 490 CB GLU A 67 1.515 -11.172 -5.371 1.00 0.00 C +ATOM 491 O GLU A 67 0.820 -8.863 -3.353 1.00 0.00 O +ATOM 492 CG GLU A 67 0.220 -11.863 -5.773 1.00 0.00 C +ATOM 493 CD GLU A 67 0.104 -12.095 -7.271 1.00 0.00 C +ATOM 494 OE1 GLU A 67 -1.026 -12.040 -7.808 1.00 0.00 O +ATOM 495 OE2 GLU A 67 1.151 -12.333 -7.914 1.00 0.00 O +ATOM 496 N ASP A 68 -0.317 -10.492 -2.553 1.00 0.00 N +ATOM 497 CA ASP A 68 -1.388 -9.666 -2.004 1.00 0.00 C +ATOM 498 C ASP A 68 -1.103 -9.292 -0.551 1.00 0.00 C +ATOM 499 CB ASP A 68 -2.731 -10.391 -2.108 1.00 0.00 C +ATOM 500 O ASP A 68 -1.847 -8.517 0.053 1.00 0.00 O +ATOM 501 CG ASP A 68 -3.195 -10.578 -3.541 1.00 0.00 C +ATOM 502 OD1 ASP A 68 -3.828 -11.611 -3.848 1.00 0.00 O +ATOM 503 OD2 ASP A 68 -2.923 -9.685 -4.373 1.00 0.00 O +ATOM 504 N HIS A 69 -0.167 -9.956 0.090 1.00 0.00 N +ATOM 505 CA HIS A 69 0.211 -9.683 1.472 1.00 0.00 C +ATOM 506 C HIS A 69 1.044 -8.410 1.574 1.00 0.00 C +ATOM 507 CB HIS A 69 0.985 -10.865 2.059 1.00 0.00 C +ATOM 508 O HIS A 69 2.031 -8.249 0.852 1.00 0.00 O +ATOM 509 CG HIS A 69 1.021 -10.875 3.555 1.00 0.00 C +ATOM 510 CD2 HIS A 69 0.448 -11.711 4.452 1.00 0.00 C +ATOM 511 ND1 HIS A 69 1.712 -9.936 4.288 1.00 0.00 N +ATOM 512 CE1 HIS A 69 1.562 -10.195 5.577 1.00 0.00 C +ATOM 513 NE2 HIS A 69 0.800 -11.267 5.703 1.00 0.00 N +ATOM 514 N PRO A 70 0.701 -7.489 2.427 1.00 0.00 N +ATOM 515 CA PRO A 70 1.384 -6.197 2.516 1.00 0.00 C +ATOM 516 C PRO A 70 2.882 -6.337 2.776 1.00 0.00 C +ATOM 517 CB PRO A 70 0.687 -5.510 3.693 1.00 0.00 C +ATOM 518 O PRO A 70 3.663 -5.461 2.397 1.00 0.00 O +ATOM 519 CG PRO A 70 -0.046 -6.606 4.396 1.00 0.00 C +ATOM 520 CD PRO A 70 -0.242 -7.742 3.433 1.00 0.00 C +ATOM 521 N CYS A 71 3.295 -7.400 3.302 1.00 0.00 N +ATOM 522 CA CYS A 71 4.698 -7.619 3.633 1.00 0.00 C +ATOM 523 C CYS A 71 5.402 -8.407 2.534 1.00 0.00 C +ATOM 524 CB CYS A 71 4.825 -8.359 4.965 1.00 0.00 C +ATOM 525 O CYS A 71 6.576 -8.754 2.669 1.00 0.00 O +ATOM 526 SG CYS A 71 4.149 -7.448 6.371 1.00 0.00 S +ATOM 527 N HIS A 72 4.559 -8.757 1.576 1.00 0.00 N +ATOM 528 CA HIS A 72 5.119 -9.541 0.482 1.00 0.00 C +ATOM 529 C HIS A 72 6.010 -8.684 -0.411 1.00 0.00 C +ATOM 530 CB HIS A 72 4.003 -10.179 -0.347 1.00 0.00 C +ATOM 531 O HIS A 72 5.596 -7.614 -0.864 1.00 0.00 O +ATOM 532 CG HIS A 72 4.498 -10.942 -1.534 1.00 0.00 C +ATOM 533 CD2 HIS A 72 4.508 -10.627 -2.851 1.00 0.00 C +ATOM 534 ND1 HIS A 72 5.064 -12.194 -1.431 1.00 0.00 N +ATOM 535 CE1 HIS A 72 5.402 -12.618 -2.638 1.00 0.00 C +ATOM 536 NE2 HIS A 72 5.076 -11.686 -3.517 1.00 0.00 N +ATOM 537 N HIS A 73 7.276 -9.193 -0.608 1.00 0.00 N +ATOM 538 CA HIS A 73 8.219 -8.528 -1.500 1.00 0.00 C +ATOM 539 C HIS A 73 8.888 -9.527 -2.439 1.00 0.00 C +ATOM 540 CB HIS A 73 9.278 -7.774 -0.695 1.00 0.00 C +ATOM 541 O HIS A 73 9.246 -10.632 -2.024 1.00 0.00 O +ATOM 542 CG HIS A 73 8.715 -6.693 0.172 1.00 0.00 C +ATOM 543 CD2 HIS A 73 8.550 -6.625 1.514 1.00 0.00 C +ATOM 544 ND1 HIS A 73 8.240 -5.504 -0.336 1.00 0.00 N +ATOM 545 CE1 HIS A 73 7.806 -4.749 0.660 1.00 0.00 C +ATOM 546 NE2 HIS A 73 7.983 -5.406 1.793 1.00 0.00 N +ATOM 547 N CYS A 74 8.907 -9.137 -3.729 1.00 0.00 N +ATOM 548 CA CYS A 74 9.582 -9.976 -4.713 1.00 0.00 C +ATOM 549 C CYS A 74 10.677 -9.199 -5.433 1.00 0.00 C +ATOM 550 CB CYS A 74 8.580 -10.523 -5.729 1.00 0.00 C +ATOM 551 O CYS A 74 10.529 -8.003 -5.689 1.00 0.00 O +ATOM 552 SG CYS A 74 7.391 -11.686 -5.025 1.00 0.00 S +ATOM 553 N HIS A 75 11.715 -9.738 -5.575 1.00 0.00 N +ATOM 554 CA HIS A 75 12.772 -9.115 -6.364 1.00 0.00 C +ATOM 555 C HIS A 75 13.308 -10.074 -7.422 1.00 0.00 C +ATOM 556 CB HIS A 75 13.910 -8.643 -5.458 1.00 0.00 C +ATOM 557 O HIS A 75 13.275 -11.292 -7.235 1.00 0.00 O +ATOM 558 CG HIS A 75 14.605 -9.755 -4.740 1.00 0.00 C +ATOM 559 CD2 HIS A 75 15.789 -10.366 -4.981 1.00 0.00 C +ATOM 560 ND1 HIS A 75 14.075 -10.368 -3.625 1.00 0.00 N +ATOM 561 CE1 HIS A 75 14.905 -11.310 -3.211 1.00 0.00 C +ATOM 562 NE2 HIS A 75 15.954 -11.330 -4.016 1.00 0.00 N +ATOM 563 N GLU A 76 13.647 -9.546 -8.538 1.00 0.00 N +ATOM 564 CA GLU A 76 14.228 -10.322 -9.630 1.00 0.00 C +ATOM 565 C GLU A 76 15.753 -10.283 -9.585 1.00 0.00 C +ATOM 566 CB GLU A 76 13.727 -9.806 -10.981 1.00 0.00 C +ATOM 567 O GLU A 76 16.350 -9.205 -9.546 1.00 0.00 O +ATOM 568 CG GLU A 76 14.060 -10.722 -12.150 1.00 0.00 C +ATOM 569 CD GLU A 76 13.399 -10.297 -13.452 1.00 0.00 C +ATOM 570 OE1 GLU A 76 12.554 -9.373 -13.430 1.00 0.00 O +ATOM 571 OE2 GLU A 76 13.727 -10.894 -14.501 1.00 0.00 O +ATOM 572 N GLU A 77 16.313 -11.414 -9.551 1.00 0.00 N +ATOM 573 CA GLU A 77 17.769 -11.510 -9.570 1.00 0.00 C +ATOM 574 C GLU A 77 18.310 -11.423 -10.994 1.00 0.00 C +ATOM 575 CB GLU A 77 18.231 -12.812 -8.911 1.00 0.00 C +ATOM 576 O GLU A 77 17.548 -11.510 -11.959 1.00 0.00 O +ATOM 577 CG GLU A 77 17.844 -12.929 -7.444 1.00 0.00 C +ATOM 578 CD GLU A 77 18.639 -12.003 -6.537 1.00 0.00 C +ATOM 579 OE1 GLU A 77 19.776 -11.626 -6.901 1.00 0.00 O +ATOM 580 OE2 GLU A 77 18.120 -11.651 -5.454 1.00 0.00 O +ATOM 581 N ASP A 78 19.573 -11.066 -11.091 1.00 0.00 N +ATOM 582 CA ASP A 78 20.266 -10.915 -12.367 1.00 0.00 C +ATOM 583 C ASP A 78 20.084 -12.153 -13.241 1.00 0.00 C +ATOM 584 CB ASP A 78 21.755 -10.645 -12.140 1.00 0.00 C +ATOM 585 O ASP A 78 20.095 -12.059 -14.470 1.00 0.00 O +ATOM 586 CG ASP A 78 22.029 -9.254 -11.597 1.00 0.00 C +ATOM 587 OD1 ASP A 78 23.114 -9.028 -11.018 1.00 0.00 O +ATOM 588 OD2 ASP A 78 21.152 -8.376 -11.747 1.00 0.00 O +ATOM 589 N ASP A 79 19.875 -13.279 -12.572 1.00 0.00 N +ATOM 590 CA ASP A 79 19.730 -14.515 -13.335 1.00 0.00 C +ATOM 591 C ASP A 79 18.288 -14.708 -13.799 1.00 0.00 C +ATOM 592 CB ASP A 79 20.180 -15.716 -12.501 1.00 0.00 C +ATOM 593 O ASP A 79 17.946 -15.750 -14.363 1.00 0.00 O +ATOM 594 CG ASP A 79 19.357 -15.903 -11.238 1.00 0.00 C +ATOM 595 OD1 ASP A 79 19.656 -16.822 -10.446 1.00 0.00 O +ATOM 596 OD2 ASP A 79 18.399 -15.127 -11.036 1.00 0.00 O +ATOM 597 N GLY A 80 17.414 -13.715 -13.581 1.00 0.00 N +ATOM 598 CA GLY A 80 16.044 -13.776 -14.063 1.00 0.00 C +ATOM 599 C GLY A 80 15.095 -14.439 -13.081 1.00 0.00 C +ATOM 600 O GLY A 80 13.881 -14.444 -13.291 1.00 0.00 O +ATOM 601 N ASP A 81 15.662 -15.063 -12.040 1.00 0.00 N +ATOM 602 CA ASP A 81 14.823 -15.721 -11.043 1.00 0.00 C +ATOM 603 C ASP A 81 14.161 -14.699 -10.121 1.00 0.00 C +ATOM 604 CB ASP A 81 15.646 -16.715 -10.221 1.00 0.00 C +ATOM 605 O ASP A 81 14.715 -13.625 -9.878 1.00 0.00 O +ATOM 606 CG ASP A 81 16.113 -17.911 -11.031 1.00 0.00 C +ATOM 607 OD1 ASP A 81 17.118 -18.550 -10.652 1.00 0.00 O +ATOM 608 OD2 ASP A 81 15.472 -18.216 -12.060 1.00 0.00 O +ATOM 609 N THR A 82 12.968 -14.929 -9.764 1.00 0.00 N +ATOM 610 CA THR A 82 12.231 -14.082 -8.832 1.00 0.00 C +ATOM 611 C THR A 82 12.233 -14.689 -7.432 1.00 0.00 C +ATOM 612 CB THR A 82 10.780 -13.868 -9.299 1.00 0.00 C +ATOM 613 O THR A 82 11.931 -15.872 -7.262 1.00 0.00 O +ATOM 614 CG2 THR A 82 10.028 -12.938 -8.352 1.00 0.00 C +ATOM 615 OG1 THR A 82 10.786 -13.291 -10.611 1.00 0.00 O +ATOM 616 N HIS A 83 12.679 -13.936 -6.510 1.00 0.00 N +ATOM 617 CA HIS A 83 12.653 -14.347 -5.110 1.00 0.00 C +ATOM 618 C HIS A 83 11.661 -13.511 -4.309 1.00 0.00 C +ATOM 619 CB HIS A 83 14.049 -14.239 -4.494 1.00 0.00 C +ATOM 620 O HIS A 83 11.675 -12.280 -4.387 1.00 0.00 O +ATOM 621 CG HIS A 83 15.047 -15.170 -5.104 1.00 0.00 C +ATOM 622 CD2 HIS A 83 15.925 -14.991 -6.119 1.00 0.00 C +ATOM 623 ND1 HIS A 83 15.219 -16.466 -4.669 1.00 0.00 N +ATOM 624 CE1 HIS A 83 16.163 -17.046 -5.391 1.00 0.00 C +ATOM 625 NE2 HIS A 83 16.608 -16.172 -6.279 1.00 0.00 N +ATOM 626 N CYS A 84 10.791 -14.185 -3.722 1.00 0.00 N +ATOM 627 CA CYS A 84 9.793 -13.514 -2.896 1.00 0.00 C +ATOM 628 C CYS A 84 10.017 -13.813 -1.419 1.00 0.00 C +ATOM 629 CB CYS A 84 8.384 -13.942 -3.305 1.00 0.00 C +ATOM 630 O CYS A 84 10.408 -14.924 -1.059 1.00 0.00 O +ATOM 631 SG CYS A 84 7.968 -13.539 -5.016 1.00 0.00 S +ATOM 632 N HIS A 85 9.909 -12.859 -0.708 1.00 0.00 N +ATOM 633 CA HIS A 85 9.975 -13.070 0.733 1.00 0.00 C +ATOM 634 C HIS A 85 8.927 -12.236 1.461 1.00 0.00 C +ATOM 635 CB HIS A 85 11.372 -12.734 1.260 1.00 0.00 C +ATOM 636 O HIS A 85 8.377 -11.289 0.894 1.00 0.00 O +ATOM 637 CG HIS A 85 11.748 -11.296 1.089 1.00 0.00 C +ATOM 638 CD2 HIS A 85 11.777 -10.273 1.975 1.00 0.00 C +ATOM 639 ND1 HIS A 85 12.152 -10.772 -0.120 1.00 0.00 N +ATOM 640 CE1 HIS A 85 12.415 -9.485 0.031 1.00 0.00 C +ATOM 641 NE2 HIS A 85 12.196 -9.157 1.293 1.00 0.00 N +ATOM 642 N CYS A 86 8.500 -12.728 2.583 1.00 0.00 N +ATOM 643 CA CYS A 86 7.596 -12.021 3.484 1.00 0.00 C +ATOM 644 C CYS A 86 8.373 -11.290 4.572 1.00 0.00 C +ATOM 645 CB CYS A 86 6.603 -12.993 4.119 1.00 0.00 C +ATOM 646 O CYS A 86 8.939 -11.920 5.467 1.00 0.00 O +ATOM 647 SG CYS A 86 5.473 -13.757 2.934 1.00 0.00 S +ATOM 648 N SER A 87 8.541 -10.143 4.355 1.00 0.00 N +ATOM 649 CA SER A 87 9.296 -9.406 5.363 1.00 0.00 C +ATOM 650 C SER A 87 8.570 -8.129 5.774 1.00 0.00 C +ATOM 651 CB SER A 87 10.692 -9.064 4.843 1.00 0.00 C +ATOM 652 O SER A 87 8.018 -7.424 4.927 1.00 0.00 O +ATOM 653 OG SER A 87 11.410 -8.297 5.794 1.00 0.00 O +ATOM 654 N CYS A 88 8.324 -8.020 6.956 1.00 0.00 N +ATOM 655 CA CYS A 88 7.764 -6.786 7.497 1.00 0.00 C +ATOM 656 C CYS A 88 8.869 -5.829 7.928 1.00 0.00 C +ATOM 657 CB CYS A 88 6.847 -7.088 8.681 1.00 0.00 C +ATOM 658 O CYS A 88 8.600 -4.816 8.576 1.00 0.00 O +ATOM 659 SG CYS A 88 5.414 -8.102 8.253 1.00 0.00 S +ATOM 660 N GLU A 89 9.941 -6.277 7.427 1.00 0.00 N +ATOM 661 CA GLU A 89 11.079 -5.417 7.736 1.00 0.00 C +ATOM 662 C GLU A 89 11.164 -4.244 6.763 1.00 0.00 C +ATOM 663 CB GLU A 89 12.382 -6.219 7.709 1.00 0.00 C +ATOM 664 O GLU A 89 10.884 -4.397 5.572 1.00 0.00 O +ATOM 665 CG GLU A 89 12.497 -7.244 8.828 1.00 0.00 C +ATOM 666 CD GLU A 89 12.821 -6.626 10.178 1.00 0.00 C +ATOM 667 OE1 GLU A 89 13.318 -5.477 10.216 1.00 0.00 O +ATOM 668 OE2 GLU A 89 12.577 -7.295 11.207 1.00 0.00 O +ATOM 669 N HIS A 90 10.877 -2.882 7.151 1.00 0.00 N +ATOM 670 CA HIS A 90 11.037 -1.634 6.414 1.00 0.00 C +ATOM 671 C HIS A 90 12.477 -1.452 5.945 1.00 0.00 C +ATOM 672 CB HIS A 90 10.611 -0.444 7.276 1.00 0.00 C +ATOM 673 O HIS A 90 13.291 -0.847 6.647 1.00 0.00 O +ATOM 674 CG HIS A 90 9.172 -0.482 7.682 1.00 0.00 C +ATOM 675 CD2 HIS A 90 8.592 -0.729 8.880 1.00 0.00 C +ATOM 676 ND1 HIS A 90 8.143 -0.249 6.795 1.00 0.00 N +ATOM 677 CE1 HIS A 90 6.989 -0.350 7.434 1.00 0.00 C +ATOM 678 NE2 HIS A 90 7.234 -0.641 8.700 1.00 0.00 N +ATOM 679 N SER A 91 13.113 -2.415 5.257 1.00 0.00 N +ATOM 680 CA SER A 91 14.468 -1.999 4.909 1.00 0.00 C +ATOM 681 C SER A 91 14.482 -1.180 3.623 1.00 0.00 C +ATOM 682 CB SER A 91 15.380 -3.217 4.758 1.00 0.00 C +ATOM 683 O SER A 91 13.868 -1.568 2.627 1.00 0.00 O +ATOM 684 OG SER A 91 15.023 -3.974 3.614 1.00 0.00 O +ATOM 685 N HIS A 92 14.296 0.148 3.642 1.00 0.00 N +ATOM 686 CA HIS A 92 14.603 1.170 2.647 1.00 0.00 C +ATOM 687 C HIS A 92 15.930 0.882 1.953 1.00 0.00 C +ATOM 688 CB HIS A 92 14.638 2.555 3.295 1.00 0.00 C +ATOM 689 O HIS A 92 16.284 1.551 0.979 1.00 0.00 O +ATOM 690 CG HIS A 92 13.324 2.984 3.866 1.00 0.00 C +ATOM 691 CD2 HIS A 92 12.943 3.213 5.145 1.00 0.00 C +ATOM 692 ND1 HIS A 92 12.216 3.224 3.084 1.00 0.00 N +ATOM 693 CE1 HIS A 92 11.207 3.584 3.859 1.00 0.00 C +ATOM 694 NE2 HIS A 92 11.621 3.585 5.114 1.00 0.00 N +ATOM 695 N ASP A 93 16.676 -0.193 2.168 1.00 0.00 N +ATOM 696 CA ASP A 93 18.015 -0.132 1.589 1.00 0.00 C +ATOM 697 C ASP A 93 18.097 -0.954 0.305 1.00 0.00 C +ATOM 698 CB ASP A 93 19.058 -0.622 2.596 1.00 0.00 C +ATOM 699 O ASP A 93 19.179 -1.132 -0.256 1.00 0.00 O +ATOM 700 CG ASP A 93 19.487 0.454 3.577 1.00 0.00 C +ATOM 701 OD1 ASP A 93 20.370 0.192 4.423 1.00 0.00 O +ATOM 702 OD2 ASP A 93 18.935 1.573 3.507 1.00 0.00 O +ATOM 703 N HIS A 94 17.467 -0.634 -0.758 1.00 0.00 N +ATOM 704 CA HIS A 94 18.140 -1.057 -1.982 1.00 0.00 C +ATOM 705 C HIS A 94 17.627 -0.280 -3.189 1.00 0.00 C +ATOM 706 CB HIS A 94 17.951 -2.559 -2.205 1.00 0.00 C +ATOM 707 O HIS A 94 16.419 -0.075 -3.334 1.00 0.00 O +ATOM 708 CG HIS A 94 18.800 -3.409 -1.315 1.00 0.00 C +ATOM 709 CD2 HIS A 94 18.467 -4.255 -0.312 1.00 0.00 C +ATOM 710 ND1 HIS A 94 20.175 -3.442 -1.407 1.00 0.00 N +ATOM 711 CE1 HIS A 94 20.651 -4.276 -0.497 1.00 0.00 C +ATOM 712 NE2 HIS A 94 19.635 -4.782 0.181 1.00 0.00 N +ATOM 713 N HIS A 95 18.249 0.957 -3.481 1.00 0.00 N +ATOM 714 CA HIS A 95 18.496 1.578 -4.778 1.00 0.00 C +ATOM 715 C HIS A 95 18.041 0.672 -5.918 1.00 0.00 C +ATOM 716 CB HIS A 95 19.979 1.916 -4.936 1.00 0.00 C +ATOM 717 O HIS A 95 18.521 0.799 -7.046 1.00 0.00 O +ATOM 718 CG HIS A 95 20.458 2.973 -3.992 1.00 0.00 C +ATOM 719 CD2 HIS A 95 21.388 2.932 -3.010 1.00 0.00 C +ATOM 720 ND1 HIS A 95 19.959 4.258 -3.999 1.00 0.00 N +ATOM 721 CE1 HIS A 95 20.565 4.963 -3.059 1.00 0.00 C +ATOM 722 NE2 HIS A 95 21.437 4.182 -2.444 1.00 0.00 N +ATOM 723 N ASP A 96 16.923 0.136 -5.980 1.00 0.00 N +ATOM 724 CA ASP A 96 16.554 -0.218 -7.347 1.00 0.00 C +ATOM 725 C ASP A 96 15.459 0.705 -7.877 1.00 0.00 C +ATOM 726 CB ASP A 96 16.093 -1.676 -7.418 1.00 0.00 C +ATOM 727 O ASP A 96 14.655 1.230 -7.104 1.00 0.00 O +ATOM 728 CG ASP A 96 17.246 -2.663 -7.414 1.00 0.00 C +ATOM 729 OD1 ASP A 96 17.024 -3.859 -7.125 1.00 0.00 O +ATOM 730 OD2 ASP A 96 18.388 -2.242 -7.699 1.00 0.00 O +ATOM 731 N ASP A 97 15.890 1.837 -8.509 1.00 0.00 N +ATOM 732 CA ASP A 97 15.081 2.551 -9.491 1.00 0.00 C +ATOM 733 C ASP A 97 13.874 1.718 -9.918 1.00 0.00 C +ATOM 734 CB ASP A 97 15.923 2.923 -10.713 1.00 0.00 C +ATOM 735 O ASP A 97 13.369 1.874 -11.032 1.00 0.00 O +ATOM 736 CG ASP A 97 16.981 3.969 -10.409 1.00 0.00 C +ATOM 737 OD1 ASP A 97 18.049 3.963 -11.058 1.00 0.00 O +ATOM 738 OD2 ASP A 97 16.746 4.804 -9.509 1.00 0.00 O +ATOM 739 N ASP A 98 13.468 0.802 -9.181 1.00 0.00 N +ATOM 740 CA ASP A 98 12.224 0.241 -9.699 1.00 0.00 C +ATOM 741 C ASP A 98 11.093 1.266 -9.639 1.00 0.00 C +ATOM 742 CB ASP A 98 11.837 -1.017 -8.920 1.00 0.00 C +ATOM 743 O ASP A 98 10.974 2.010 -8.663 1.00 0.00 O +ATOM 744 CG ASP A 98 12.688 -2.222 -9.278 1.00 0.00 C +ATOM 745 OD1 ASP A 98 12.775 -3.170 -8.468 1.00 0.00 O +ATOM 746 OD2 ASP A 98 13.280 -2.223 -10.379 1.00 0.00 O +ATOM 747 N THR A 99 11.132 2.146 -10.695 1.00 0.00 N +ATOM 748 CA THR A 99 9.998 2.959 -11.120 1.00 0.00 C +ATOM 749 C THR A 99 8.685 2.355 -10.628 1.00 0.00 C +ATOM 750 CB THR A 99 9.957 3.102 -12.653 1.00 0.00 C +ATOM 751 O THR A 99 7.730 2.223 -11.396 1.00 0.00 O +ATOM 752 CG2 THR A 99 11.214 3.791 -13.174 1.00 0.00 C +ATOM 753 OG1 THR A 99 9.857 1.802 -13.246 1.00 0.00 O +ATOM 754 N HIS A 100 8.653 1.675 -9.540 1.00 0.00 N +ATOM 755 CA HIS A 100 7.234 1.548 -9.228 1.00 0.00 C +ATOM 756 C HIS A 100 6.625 2.899 -8.870 1.00 0.00 C +ATOM 757 CB HIS A 100 7.024 0.557 -8.082 1.00 0.00 C +ATOM 758 O HIS A 100 7.154 3.617 -8.019 1.00 0.00 O +ATOM 759 CG HIS A 100 7.437 -0.842 -8.414 1.00 0.00 C +ATOM 760 CD2 HIS A 100 8.446 -1.607 -7.937 1.00 0.00 C +ATOM 761 ND1 HIS A 100 6.777 -1.610 -9.349 1.00 0.00 N +ATOM 762 CE1 HIS A 100 7.365 -2.793 -9.431 1.00 0.00 C +ATOM 763 NE2 HIS A 100 8.380 -2.816 -8.585 1.00 0.00 N +ATOM 764 N GLY A 101 6.381 3.654 -9.900 1.00 0.00 N +ATOM 765 CA GLY A 101 5.487 4.753 -9.574 1.00 0.00 C +ATOM 766 C GLY A 101 4.744 4.550 -8.267 1.00 0.00 C +ATOM 767 O GLY A 101 3.522 4.386 -8.261 1.00 0.00 O +ATOM 768 N GLU A 102 5.430 3.707 -7.432 1.00 0.00 N +ATOM 769 CA GLU A 102 4.594 3.693 -6.235 1.00 0.00 C +ATOM 770 C GLU A 102 4.478 5.087 -5.627 1.00 0.00 C +ATOM 771 CB GLU A 102 5.153 2.712 -5.201 1.00 0.00 C +ATOM 772 O GLU A 102 5.392 5.905 -5.757 1.00 0.00 O +ATOM 773 CG GLU A 102 5.195 1.269 -5.681 1.00 0.00 C +ATOM 774 CD GLU A 102 3.815 0.668 -5.897 1.00 0.00 C +ATOM 775 OE1 GLU A 102 2.810 1.292 -5.486 1.00 0.00 O +ATOM 776 OE2 GLU A 102 3.738 -0.436 -6.481 1.00 0.00 O +ATOM 777 N CYS A 103 3.304 5.585 -5.881 1.00 0.00 N +ATOM 778 CA CYS A 103 2.937 6.733 -5.061 1.00 0.00 C +ATOM 779 C CYS A 103 3.767 6.778 -3.783 1.00 0.00 C +ATOM 780 CB CYS A 103 1.449 6.690 -4.712 1.00 0.00 C +ATOM 781 O CYS A 103 3.803 5.806 -3.027 1.00 0.00 O +ATOM 782 SG CYS A 103 0.362 6.999 -6.121 1.00 0.00 S +ATOM 783 N THR A 104 4.856 7.423 -3.910 1.00 0.00 N +ATOM 784 CA THR A 104 5.617 7.650 -2.686 1.00 0.00 C +ATOM 785 C THR A 104 5.025 8.808 -1.888 1.00 0.00 C +ATOM 786 CB THR A 104 7.098 7.939 -2.995 1.00 0.00 C +ATOM 787 O THR A 104 4.142 9.517 -2.375 1.00 0.00 O +ATOM 788 CG2 THR A 104 7.686 6.875 -3.916 1.00 0.00 C +ATOM 789 OG1 THR A 104 7.206 9.219 -3.631 1.00 0.00 O +ATOM 790 N LYS A 105 5.301 8.726 -0.683 1.00 0.00 N +ATOM 791 CA LYS A 105 4.870 9.830 0.169 1.00 0.00 C +ATOM 792 C LYS A 105 5.196 11.178 -0.469 1.00 0.00 C +ATOM 793 CB LYS A 105 5.523 9.731 1.548 1.00 0.00 C +ATOM 794 O LYS A 105 4.534 12.179 -0.190 1.00 0.00 O +ATOM 795 CG LYS A 105 4.955 8.625 2.425 1.00 0.00 C +ATOM 796 CD LYS A 105 5.514 8.690 3.840 1.00 0.00 C +ATOM 797 CE LYS A 105 4.894 7.627 4.736 1.00 0.00 C +ATOM 798 NZ LYS A 105 5.487 7.643 6.107 1.00 0.00 N +ATOM 799 N LYS A 106 6.132 11.170 -1.417 1.00 0.00 N +ATOM 800 CA LYS A 106 6.565 12.408 -2.059 1.00 0.00 C +ATOM 801 C LYS A 106 5.727 12.707 -3.298 1.00 0.00 C +ATOM 802 CB LYS A 106 8.046 12.329 -2.434 1.00 0.00 C +ATOM 803 O LYS A 106 5.794 13.808 -3.849 1.00 0.00 O +ATOM 804 CG LYS A 106 8.986 12.274 -1.239 1.00 0.00 C +ATOM 805 CD LYS A 106 10.445 12.262 -1.676 1.00 0.00 C +ATOM 806 CE LYS A 106 11.387 12.222 -0.480 1.00 0.00 C +ATOM 807 NZ LYS A 106 12.817 12.151 -0.903 1.00 0.00 N +ATOM 808 N ALA A 107 5.009 11.655 -3.672 1.00 0.00 N +ATOM 809 CA ALA A 107 4.208 11.854 -4.877 1.00 0.00 C +ATOM 810 C ALA A 107 3.004 12.748 -4.594 1.00 0.00 C +ATOM 811 CB ALA A 107 3.749 10.511 -5.439 1.00 0.00 C +ATOM 812 O ALA A 107 2.358 12.618 -3.552 1.00 0.00 O +ATOM 813 N PRO A 108 2.750 13.735 -5.350 1.00 0.00 N +ATOM 814 CA PRO A 108 1.593 14.609 -5.140 1.00 0.00 C +ATOM 815 C PRO A 108 0.271 13.845 -5.124 1.00 0.00 C +ATOM 816 CB PRO A 108 1.656 15.568 -6.331 1.00 0.00 C +ATOM 817 O PRO A 108 -0.730 14.348 -4.607 1.00 0.00 O +ATOM 818 CG PRO A 108 2.473 14.851 -7.356 1.00 0.00 C +ATOM 819 CD PRO A 108 3.398 13.901 -6.650 1.00 0.00 C +ATOM 820 N CYS A 109 0.245 12.652 -5.681 1.00 0.00 N +ATOM 821 CA CYS A 109 -1.009 11.911 -5.770 1.00 0.00 C +ATOM 822 C CYS A 109 -1.162 10.954 -4.594 1.00 0.00 C +ATOM 823 CB CYS A 109 -1.079 11.134 -7.084 1.00 0.00 C +ATOM 824 O CYS A 109 -2.174 10.261 -4.480 1.00 0.00 O +ATOM 825 SG CYS A 109 0.290 9.980 -7.322 1.00 0.00 S +ATOM 826 N TRP A 110 -0.068 10.925 -3.822 1.00 0.00 N +ATOM 827 CA TRP A 110 -0.125 10.100 -2.621 1.00 0.00 C +ATOM 828 C TRP A 110 -1.071 10.704 -1.589 1.00 0.00 C +ATOM 829 CB TRP A 110 1.272 9.934 -2.016 1.00 0.00 C +ATOM 830 O TRP A 110 -0.962 11.887 -1.255 1.00 0.00 O +ATOM 831 CG TRP A 110 1.322 8.997 -0.846 1.00 0.00 C +ATOM 832 CD1 TRP A 110 1.696 7.682 -0.859 1.00 0.00 C +ATOM 833 CD2 TRP A 110 0.980 9.304 0.509 1.00 0.00 C +ATOM 834 CE2 TRP A 110 1.172 8.127 1.266 1.00 0.00 C +ATOM 835 CE3 TRP A 110 0.531 10.462 1.158 1.00 0.00 C +ATOM 836 NE1 TRP A 110 1.608 7.153 0.408 1.00 0.00 N +ATOM 837 CH2 TRP A 110 0.491 9.222 3.250 1.00 0.00 C +ATOM 838 CZ2 TRP A 110 0.929 8.075 2.640 1.00 0.00 C +ATOM 839 CZ3 TRP A 110 0.290 10.409 2.526 1.00 0.00 C +ATOM 840 N ARG A 111 -2.102 9.880 -1.162 1.00 0.00 N +ATOM 841 CA ARG A 111 -3.086 10.357 -0.197 1.00 0.00 C +ATOM 842 C ARG A 111 -3.345 9.313 0.884 1.00 0.00 C +ATOM 843 CB ARG A 111 -4.397 10.720 -0.899 1.00 0.00 C +ATOM 844 O ARG A 111 -3.329 8.111 0.610 1.00 0.00 O +ATOM 845 CG ARG A 111 -5.466 11.263 0.034 1.00 0.00 C +ATOM 846 CD ARG A 111 -5.180 12.701 0.443 1.00 0.00 C +ATOM 847 NE ARG A 111 -6.289 13.277 1.200 1.00 0.00 N +ATOM 848 NH1 ARG A 111 -5.313 15.357 1.444 1.00 0.00 N +ATOM 849 NH2 ARG A 111 -7.384 14.946 2.335 1.00 0.00 N +ATOM 850 CZ ARG A 111 -6.326 14.525 1.658 1.00 0.00 C +ATOM 851 N CYS A 112 -3.365 9.888 2.033 1.00 0.00 N +ATOM 852 CA CYS A 112 -3.705 9.030 3.162 1.00 0.00 C +ATOM 853 C CYS A 112 -5.019 9.463 3.801 1.00 0.00 C +ATOM 854 CB CYS A 112 -2.589 9.051 4.206 1.00 0.00 C +ATOM 855 O CYS A 112 -5.318 10.657 3.866 1.00 0.00 O +ATOM 856 SG CYS A 112 -1.031 8.349 3.621 1.00 0.00 S +ATOM 857 N GLU A 113 -5.830 8.580 3.951 1.00 0.00 N +ATOM 858 CA GLU A 113 -7.053 8.822 4.710 1.00 0.00 C +ATOM 859 C GLU A 113 -7.031 8.080 6.044 1.00 0.00 C +ATOM 860 CB GLU A 113 -8.282 8.407 3.897 1.00 0.00 C +ATOM 861 O GLU A 113 -6.553 6.947 6.122 1.00 0.00 O +ATOM 862 CG GLU A 113 -8.500 9.241 2.643 1.00 0.00 C +ATOM 863 CD GLU A 113 -9.731 8.826 1.853 1.00 0.00 C +ATOM 864 OE1 GLU A 113 -10.458 7.909 2.299 1.00 0.00 O +ATOM 865 OE2 GLU A 113 -9.971 9.422 0.780 1.00 0.00 O +ATOM 866 N TYR A 114 -7.305 8.869 7.059 1.00 0.00 N +ATOM 867 CA TYR A 114 -7.411 8.262 8.381 1.00 0.00 C +ATOM 868 C TYR A 114 -8.671 7.412 8.491 1.00 0.00 C +ATOM 869 CB TYR A 114 -7.412 9.340 9.469 1.00 0.00 C +ATOM 870 O TYR A 114 -9.775 7.889 8.219 1.00 0.00 O +ATOM 871 CG TYR A 114 -7.392 8.785 10.872 1.00 0.00 C +ATOM 872 CD1 TYR A 114 -8.527 8.834 11.678 1.00 0.00 C +ATOM 873 CD2 TYR A 114 -6.238 8.213 11.396 1.00 0.00 C +ATOM 874 CE1 TYR A 114 -8.513 8.326 12.973 1.00 0.00 C +ATOM 875 CE2 TYR A 114 -6.212 7.702 12.690 1.00 0.00 C +ATOM 876 OH TYR A 114 -7.333 7.258 14.750 1.00 0.00 O +ATOM 877 CZ TYR A 114 -7.353 7.762 13.469 1.00 0.00 C +ATOM 878 N ASN A 115 -8.439 6.137 8.704 1.00 0.00 N +ATOM 879 CA ASN A 115 -9.527 5.202 8.972 1.00 0.00 C +ATOM 880 C ASN A 115 -9.770 5.039 10.469 1.00 0.00 C +ATOM 881 CB ASN A 115 -9.238 3.844 8.330 1.00 0.00 C +ATOM 882 O ASN A 115 -8.953 4.443 11.174 1.00 0.00 O +ATOM 883 CG ASN A 115 -10.442 2.922 8.345 1.00 0.00 C +ATOM 884 ND2 ASN A 115 -10.511 2.021 7.373 1.00 0.00 N +ATOM 885 OD1 ASN A 115 -11.302 3.020 9.224 1.00 0.00 O +ATOM 886 N ALA A 116 -10.796 5.699 10.920 1.00 0.00 N +ATOM 887 CA ALA A 116 -11.108 5.723 12.347 1.00 0.00 C +ATOM 888 C ALA A 116 -11.283 4.310 12.894 1.00 0.00 C +ATOM 889 CB ALA A 116 -12.366 6.549 12.603 1.00 0.00 C +ATOM 890 O ALA A 116 -10.898 4.025 14.031 1.00 0.00 O +ATOM 891 N ASP A 117 -11.725 3.414 12.007 1.00 0.00 N +ATOM 892 CA ASP A 117 -11.929 2.033 12.433 1.00 0.00 C +ATOM 893 C ASP A 117 -10.595 1.313 12.619 1.00 0.00 C +ATOM 894 CB ASP A 117 -12.796 1.281 11.421 1.00 0.00 C +ATOM 895 O ASP A 117 -10.432 0.529 13.557 1.00 0.00 O +ATOM 896 CG ASP A 117 -14.225 1.793 11.369 1.00 0.00 C +ATOM 897 OD1 ASP A 117 -14.898 1.618 10.331 1.00 0.00 O +ATOM 898 OD2 ASP A 117 -14.681 2.378 12.375 1.00 0.00 O +ATOM 899 N LEU A 118 -9.664 1.666 11.738 1.00 0.00 N +ATOM 900 CA LEU A 118 -8.349 1.035 11.785 1.00 0.00 C +ATOM 901 C LEU A 118 -7.364 1.891 12.575 1.00 0.00 C +ATOM 902 CB LEU A 118 -7.816 0.800 10.369 1.00 0.00 C +ATOM 903 O LEU A 118 -6.231 1.472 12.822 1.00 0.00 O +ATOM 904 CG LEU A 118 -8.639 -0.135 9.481 1.00 0.00 C +ATOM 905 CD1 LEU A 118 -8.022 -0.225 8.090 1.00 0.00 C +ATOM 906 CD2 LEU A 118 -8.746 -1.518 10.115 1.00 0.00 C +ATOM 907 N LYS A 119 -7.828 3.091 12.895 1.00 0.00 N +ATOM 908 CA LYS A 119 -6.988 4.069 13.580 1.00 0.00 C +ATOM 909 C LYS A 119 -5.640 4.222 12.882 1.00 0.00 C +ATOM 910 CB LYS A 119 -6.780 3.668 15.041 1.00 0.00 C +ATOM 911 O LYS A 119 -4.596 4.257 13.537 1.00 0.00 O +ATOM 912 CG LYS A 119 -8.064 3.604 15.855 1.00 0.00 C +ATOM 913 CD LYS A 119 -7.786 3.255 17.311 1.00 0.00 C +ATOM 914 CE LYS A 119 -9.062 3.263 18.143 1.00 0.00 C +ATOM 915 NZ LYS A 119 -8.786 2.979 19.583 1.00 0.00 N +ATOM 916 N HIS A 120 -5.544 4.099 11.731 1.00 0.00 N +ATOM 917 CA HIS A 120 -4.341 4.353 10.946 1.00 0.00 C +ATOM 918 C HIS A 120 -4.690 4.898 9.565 1.00 0.00 C +ATOM 919 CB HIS A 120 -3.510 3.075 10.811 1.00 0.00 C +ATOM 920 O HIS A 120 -5.853 4.869 9.156 1.00 0.00 O +ATOM 921 CG HIS A 120 -4.217 1.973 10.089 1.00 0.00 C +ATOM 922 CD2 HIS A 120 -4.107 1.532 8.813 1.00 0.00 C +ATOM 923 ND1 HIS A 120 -5.174 1.183 10.689 1.00 0.00 N +ATOM 924 CE1 HIS A 120 -5.622 0.301 9.811 1.00 0.00 C +ATOM 925 NE2 HIS A 120 -4.990 0.491 8.666 1.00 0.00 N +ATOM 926 N ASP A 121 -3.704 5.475 9.017 1.00 0.00 N +ATOM 927 CA ASP A 121 -3.873 6.009 7.669 1.00 0.00 C +ATOM 928 C ASP A 121 -3.838 4.892 6.628 1.00 0.00 C +ATOM 929 CB ASP A 121 -2.792 7.047 7.363 1.00 0.00 C +ATOM 930 O ASP A 121 -3.053 3.949 6.747 1.00 0.00 O +ATOM 931 CG ASP A 121 -2.917 8.301 8.210 1.00 0.00 C +ATOM 932 OD1 ASP A 121 -1.936 9.069 8.312 1.00 0.00 O +ATOM 933 OD2 ASP A 121 -4.006 8.521 8.784 1.00 0.00 O +ATOM 934 N VAL A 122 -4.829 4.935 5.875 1.00 0.00 N +ATOM 935 CA VAL A 122 -4.775 4.123 4.663 1.00 0.00 C +ATOM 936 C VAL A 122 -4.276 4.971 3.495 1.00 0.00 C +ATOM 937 CB VAL A 122 -6.154 3.511 4.328 1.00 0.00 C +ATOM 938 O VAL A 122 -4.857 6.013 3.184 1.00 0.00 O +ATOM 939 CG1 VAL A 122 -6.063 2.625 3.087 1.00 0.00 C +ATOM 940 CG2 VAL A 122 -6.688 2.717 5.518 1.00 0.00 C +ATOM 941 N CYS A 123 -3.142 4.531 3.102 1.00 0.00 N +ATOM 942 CA CYS A 123 -2.472 5.318 2.073 1.00 0.00 C +ATOM 943 C CYS A 123 -2.628 4.669 0.702 1.00 0.00 C +ATOM 944 CB CYS A 123 -0.988 5.481 2.403 1.00 0.00 C +ATOM 945 O CYS A 123 -2.671 3.443 0.593 1.00 0.00 O +ATOM 946 SG CYS A 123 -0.681 6.285 3.991 1.00 0.00 S +ATOM 947 N GLY A 124 -2.924 5.462 -0.260 1.00 0.00 N +ATOM 948 CA GLY A 124 -2.940 5.028 -1.648 1.00 0.00 C +ATOM 949 C GLY A 124 -2.699 6.159 -2.630 1.00 0.00 C +ATOM 950 O GLY A 124 -2.463 7.299 -2.225 1.00 0.00 O +ATOM 951 N CYS A 125 -2.378 5.820 -3.813 1.00 0.00 N +ATOM 952 CA CYS A 125 -2.283 6.770 -4.916 1.00 0.00 C +ATOM 953 C CYS A 125 -3.667 7.160 -5.421 1.00 0.00 C +ATOM 954 CB CYS A 125 -1.458 6.183 -6.061 1.00 0.00 C +ATOM 955 O CYS A 125 -4.425 6.307 -5.886 1.00 0.00 O +ATOM 956 SG CYS A 125 0.275 5.900 -5.639 1.00 0.00 S +ATOM 957 N GLU A 126 -4.004 8.323 -5.203 1.00 0.00 N +ATOM 958 CA GLU A 126 -5.332 8.779 -5.604 1.00 0.00 C +ATOM 959 C GLU A 126 -5.243 9.988 -6.530 1.00 0.00 C +ATOM 960 CB GLU A 126 -6.177 9.119 -4.374 1.00 0.00 C +ATOM 961 O GLU A 126 -5.752 11.064 -6.206 1.00 0.00 O +ATOM 962 CG GLU A 126 -6.467 7.924 -3.478 1.00 0.00 C +ATOM 963 CD GLU A 126 -7.488 6.964 -4.068 1.00 0.00 C +ATOM 964 OE1 GLU A 126 -8.228 7.361 -4.997 1.00 0.00 O +ATOM 965 OE2 GLU A 126 -7.550 5.807 -3.597 1.00 0.00 O +ATOM 966 N CYS A 127 -4.822 9.841 -7.699 1.00 0.00 N +ATOM 967 CA CYS A 127 -4.615 10.948 -8.626 1.00 0.00 C +ATOM 968 C CYS A 127 -5.940 11.598 -9.005 1.00 0.00 C +ATOM 969 CB CYS A 127 -3.895 10.466 -9.885 1.00 0.00 C +ATOM 970 O CYS A 127 -5.987 12.790 -9.312 1.00 0.00 O +ATOM 971 SG CYS A 127 -2.217 9.868 -9.581 1.00 0.00 S +ATOM 972 N SER A 128 -6.846 10.833 -8.955 1.00 0.00 N +ATOM 973 CA SER A 128 -8.150 11.305 -9.408 1.00 0.00 C +ATOM 974 C SER A 128 -8.755 12.293 -8.417 1.00 0.00 C +ATOM 975 CB SER A 128 -9.104 10.128 -9.616 1.00 0.00 C +ATOM 976 O SER A 128 -9.642 13.073 -8.772 1.00 0.00 O +ATOM 977 OG SER A 128 -9.249 9.381 -8.420 1.00 0.00 O +ATOM 978 N LYS A 129 -8.286 12.254 -7.213 1.00 0.00 N +ATOM 979 CA LYS A 129 -8.887 13.076 -6.166 1.00 0.00 C +ATOM 980 C LYS A 129 -8.020 14.294 -5.859 1.00 0.00 C +ATOM 981 CB LYS A 129 -9.104 12.253 -4.896 1.00 0.00 C +ATOM 982 O LYS A 129 -8.420 15.169 -5.089 1.00 0.00 O +ATOM 983 CG LYS A 129 -10.151 11.158 -5.039 1.00 0.00 C +ATOM 984 CD LYS A 129 -10.395 10.441 -3.717 1.00 0.00 C +ATOM 985 CE LYS A 129 -11.490 9.392 -3.843 1.00 0.00 C +ATOM 986 NZ LYS A 129 -11.820 8.774 -2.524 1.00 0.00 N +ATOM 987 N LEU A 130 -6.820 14.391 -6.394 1.00 0.00 N +ATOM 988 CA LEU A 130 -5.922 15.506 -6.110 1.00 0.00 C +ATOM 989 C LEU A 130 -6.255 16.708 -6.987 1.00 0.00 C +ATOM 990 CB LEU A 130 -4.465 15.089 -6.326 1.00 0.00 C +ATOM 991 O LEU A 130 -6.713 16.548 -8.120 1.00 0.00 O +ATOM 992 CG LEU A 130 -3.879 14.117 -5.300 1.00 0.00 C +ATOM 993 CD1 LEU A 130 -2.476 13.689 -5.718 1.00 0.00 C +ATOM 994 CD2 LEU A 130 -3.859 14.751 -3.913 1.00 0.00 C +ATOM 995 N PRO A 131 -6.218 17.878 -6.321 1.00 0.00 N +ATOM 996 CA PRO A 131 -6.403 19.088 -7.125 1.00 0.00 C +ATOM 997 C PRO A 131 -5.423 19.176 -8.293 1.00 0.00 C +ATOM 998 CB PRO A 131 -6.159 20.219 -6.123 1.00 0.00 C +ATOM 999 O PRO A 131 -4.287 18.706 -8.188 1.00 0.00 O +ATOM 1000 CG PRO A 131 -5.279 19.617 -5.075 1.00 0.00 C +ATOM 1001 CD PRO A 131 -5.586 18.150 -4.979 1.00 0.00 C +ATOM 1002 N CYS A 132 -5.915 19.530 -9.527 1.00 0.00 N +ATOM 1003 CA CYS A 132 -5.087 19.711 -10.714 1.00 0.00 C +ATOM 1004 C CYS A 132 -4.132 20.886 -10.540 1.00 0.00 C +ATOM 1005 CB CYS A 132 -5.960 19.930 -11.949 1.00 0.00 C +ATOM 1006 O CYS A 132 -4.531 22.042 -10.690 1.00 0.00 O +ATOM 1007 SG CYS A 132 -6.896 18.468 -12.448 1.00 0.00 S +ATOM 1008 N ASN A 133 -3.080 20.705 -9.927 1.00 0.00 N +ATOM 1009 CA ASN A 133 -2.027 21.708 -9.810 1.00 0.00 C +ATOM 1010 C ASN A 133 -0.764 21.283 -10.553 1.00 0.00 C +ATOM 1011 CB ASN A 133 -1.710 21.986 -8.339 1.00 0.00 C +ATOM 1012 O ASN A 133 -0.740 20.230 -11.194 1.00 0.00 O +ATOM 1013 CG ASN A 133 -1.260 20.744 -7.595 1.00 0.00 C +ATOM 1014 ND2 ASN A 133 -1.758 20.570 -6.376 1.00 0.00 N +ATOM 1015 OD1 ASN A 133 -0.470 19.949 -8.110 1.00 0.00 O +ATOM 1016 N ASP A 134 0.201 22.148 -10.651 1.00 0.00 N +ATOM 1017 CA ASP A 134 1.408 21.962 -11.451 1.00 0.00 C +ATOM 1018 C ASP A 134 2.162 20.705 -11.023 1.00 0.00 C +ATOM 1019 CB ASP A 134 2.320 23.185 -11.338 1.00 0.00 C +ATOM 1020 O ASP A 134 2.999 20.192 -11.768 1.00 0.00 O +ATOM 1021 CG ASP A 134 1.789 24.392 -12.091 1.00 0.00 C +ATOM 1022 OD1 ASP A 134 2.250 25.525 -11.832 1.00 0.00 O +ATOM 1023 OD2 ASP A 134 0.898 24.210 -12.950 1.00 0.00 O +ATOM 1024 N GLU A 135 1.732 20.132 -9.899 1.00 0.00 N +ATOM 1025 CA GLU A 135 2.429 18.946 -9.410 1.00 0.00 C +ATOM 1026 C GLU A 135 1.714 17.669 -9.840 1.00 0.00 C +ATOM 1027 CB GLU A 135 2.559 18.988 -7.885 1.00 0.00 C +ATOM 1028 O GLU A 135 2.282 16.577 -9.766 1.00 0.00 O +ATOM 1029 CG GLU A 135 3.439 20.120 -7.374 1.00 0.00 C +ATOM 1030 CD GLU A 135 3.561 20.146 -5.859 1.00 0.00 C +ATOM 1031 OE1 GLU A 135 2.885 19.340 -5.181 1.00 0.00 O +ATOM 1032 OE2 GLU A 135 4.339 20.981 -5.346 1.00 0.00 O +ATOM 1033 N HIS A 136 0.480 17.885 -10.293 1.00 0.00 N +ATOM 1034 CA HIS A 136 -0.314 16.733 -10.704 1.00 0.00 C +ATOM 1035 C HIS A 136 0.053 16.287 -12.116 1.00 0.00 C +ATOM 1036 CB HIS A 136 -1.807 17.057 -10.628 1.00 0.00 C +ATOM 1037 O HIS A 136 0.114 17.107 -13.035 1.00 0.00 O +ATOM 1038 CG HIS A 136 -2.685 15.846 -10.645 1.00 0.00 C +ATOM 1039 CD2 HIS A 136 -3.469 15.303 -9.684 1.00 0.00 C +ATOM 1040 ND1 HIS A 136 -2.822 15.042 -11.756 1.00 0.00 N +ATOM 1041 CE1 HIS A 136 -3.655 14.054 -11.476 1.00 0.00 C +ATOM 1042 NE2 HIS A 136 -4.062 14.189 -10.225 1.00 0.00 N +ATOM 1043 N PRO A 137 0.226 15.184 -12.322 1.00 0.00 N +ATOM 1044 CA PRO A 137 0.690 14.688 -13.619 1.00 0.00 C +ATOM 1045 C PRO A 137 -0.331 14.908 -14.734 1.00 0.00 C +ATOM 1046 CB PRO A 137 0.910 13.194 -13.368 1.00 0.00 C +ATOM 1047 O PRO A 137 0.032 14.929 -15.913 1.00 0.00 O +ATOM 1048 CG PRO A 137 0.170 12.907 -12.101 1.00 0.00 C +ATOM 1049 CD PRO A 137 0.003 14.193 -11.344 1.00 0.00 C +ATOM 1050 N CYS A 138 -1.650 15.096 -14.399 1.00 0.00 N +ATOM 1051 CA CYS A 138 -2.702 15.293 -15.390 1.00 0.00 C +ATOM 1052 C CYS A 138 -2.947 16.776 -15.639 1.00 0.00 C +ATOM 1053 CB CYS A 138 -3.998 14.621 -14.937 1.00 0.00 C +ATOM 1054 O CYS A 138 -3.870 17.144 -16.368 1.00 0.00 O +ATOM 1055 SG CYS A 138 -3.887 12.822 -14.830 1.00 0.00 S +ATOM 1056 N TYR A 139 -2.050 17.530 -14.923 1.00 0.00 N +ATOM 1057 CA TYR A 139 -2.147 18.977 -15.082 1.00 0.00 C +ATOM 1058 C TYR A 139 -1.580 19.417 -16.427 1.00 0.00 C +ATOM 1059 CB TYR A 139 -1.411 19.693 -13.946 1.00 0.00 C +ATOM 1060 O TYR A 139 -0.470 19.029 -16.796 1.00 0.00 O +ATOM 1061 CG TYR A 139 -1.400 21.197 -14.083 1.00 0.00 C +ATOM 1062 CD1 TYR A 139 -0.320 21.854 -14.668 1.00 0.00 C +ATOM 1063 CD2 TYR A 139 -2.468 21.962 -13.627 1.00 0.00 C +ATOM 1064 CE1 TYR A 139 -0.305 23.239 -14.795 1.00 0.00 C +ATOM 1065 CE2 TYR A 139 -2.463 23.348 -13.748 1.00 0.00 C +ATOM 1066 OH TYR A 139 -1.369 25.348 -14.456 1.00 0.00 O +ATOM 1067 CZ TYR A 139 -1.379 23.976 -14.333 1.00 0.00 C +ATOM 1068 N ARG A 140 -2.489 20.100 -17.284 1.00 0.00 N +ATOM 1069 CA ARG A 140 -2.036 20.668 -18.550 1.00 0.00 C +ATOM 1070 C ARG A 140 -2.355 22.157 -18.626 1.00 0.00 C +ATOM 1071 CB ARG A 140 -2.678 19.934 -19.729 1.00 0.00 C +ATOM 1072 O ARG A 140 -3.435 22.589 -18.217 1.00 0.00 O +ATOM 1073 CG ARG A 140 -2.260 18.477 -19.849 1.00 0.00 C +ATOM 1074 CD ARG A 140 -2.856 17.819 -21.086 1.00 0.00 C +ATOM 1075 NE ARG A 140 -2.303 16.486 -21.307 1.00 0.00 N +ATOM 1076 NH1 ARG A 140 -1.510 16.942 -23.429 1.00 0.00 N +ATOM 1077 NH2 ARG A 140 -1.212 14.863 -22.510 1.00 0.00 N +ATOM 1078 CZ ARG A 140 -1.676 16.100 -22.415 1.00 0.00 C +ATOM 1079 N LYS A 141 -1.270 22.911 -18.875 1.00 0.00 N +ATOM 1080 CA LYS A 141 -1.432 24.343 -19.105 1.00 0.00 C +ATOM 1081 C LYS A 141 -1.210 24.693 -20.574 1.00 0.00 C +ATOM 1082 CB LYS A 141 -0.468 25.141 -18.226 1.00 0.00 C +ATOM 1083 O LYS A 141 -0.111 24.513 -21.101 1.00 0.00 O +ATOM 1084 CG LYS A 141 -0.749 26.636 -18.196 1.00 0.00 C +ATOM 1085 CD LYS A 141 0.167 27.359 -17.217 1.00 0.00 C +ATOM 1086 CE LYS A 141 -0.124 28.853 -17.175 1.00 0.00 C +ATOM 1087 NZ LYS A 141 0.783 29.568 -16.230 1.00 0.00 N +ATOM 1088 N GLU A 142 -2.285 24.849 -21.311 1.00 0.00 N +ATOM 1089 CA GLU A 142 -2.217 25.247 -22.713 1.00 0.00 C +ATOM 1090 C GLU A 142 -2.920 26.583 -22.942 1.00 0.00 C +ATOM 1091 CB GLU A 142 -2.832 24.169 -23.609 1.00 0.00 C +ATOM 1092 O GLU A 142 -4.113 26.718 -22.665 1.00 0.00 O +ATOM 1093 CG GLU A 142 -2.588 24.391 -25.095 1.00 0.00 C +ATOM 1094 CD GLU A 142 -3.160 23.287 -25.969 1.00 0.00 C +ATOM 1095 OE1 GLU A 142 -3.890 22.415 -25.445 1.00 0.00 O +ATOM 1096 OE2 GLU A 142 -2.875 23.292 -27.187 1.00 0.00 O +ATOM 1097 N GLY A 143 -2.182 27.579 -23.469 1.00 0.00 N +ATOM 1098 CA GLY A 143 -2.758 28.882 -23.764 1.00 0.00 C +ATOM 1099 C GLY A 143 -3.342 29.566 -22.543 1.00 0.00 C +ATOM 1100 O GLY A 143 -4.385 30.217 -22.629 1.00 0.00 O +ATOM 1101 N GLY A 144 -2.777 29.290 -21.354 1.00 0.00 N +ATOM 1102 CA GLY A 144 -3.245 29.947 -20.144 1.00 0.00 C +ATOM 1103 C GLY A 144 -4.395 29.217 -19.476 1.00 0.00 C +ATOM 1104 O GLY A 144 -4.892 29.651 -18.435 1.00 0.00 O +ATOM 1105 N VAL A 145 -4.936 28.140 -20.164 1.00 0.00 N +ATOM 1106 CA VAL A 145 -6.039 27.365 -19.605 1.00 0.00 C +ATOM 1107 C VAL A 145 -5.504 26.079 -18.980 1.00 0.00 C +ATOM 1108 CB VAL A 145 -7.101 27.035 -20.678 1.00 0.00 C +ATOM 1109 O VAL A 145 -4.666 25.395 -19.573 1.00 0.00 O +ATOM 1110 CG1 VAL A 145 -8.253 26.236 -20.071 1.00 0.00 C +ATOM 1111 CG2 VAL A 145 -7.619 28.316 -21.328 1.00 0.00 C +ATOM 1112 N VAL A 146 -5.959 25.837 -17.763 1.00 0.00 N +ATOM 1113 CA VAL A 146 -5.574 24.626 -17.045 1.00 0.00 C +ATOM 1114 C VAL A 146 -6.593 23.521 -17.311 1.00 0.00 C +ATOM 1115 CB VAL A 146 -5.450 24.882 -15.526 1.00 0.00 C +ATOM 1116 O VAL A 146 -7.803 23.758 -17.264 1.00 0.00 O +ATOM 1117 CG1 VAL A 146 -5.098 23.592 -14.788 1.00 0.00 C +ATOM 1118 CG2 VAL A 146 -4.405 25.962 -15.251 1.00 0.00 C +ATOM 1119 N SER A 147 -6.150 22.494 -17.818 1.00 0.00 N +ATOM 1120 CA SER A 147 -7.007 21.324 -17.979 1.00 0.00 C +ATOM 1121 C SER A 147 -6.522 20.161 -17.121 1.00 0.00 C +ATOM 1122 CB SER A 147 -7.062 20.898 -19.447 1.00 0.00 C +ATOM 1123 O SER A 147 -5.316 19.946 -16.982 1.00 0.00 O +ATOM 1124 OG SER A 147 -7.912 19.776 -19.614 1.00 0.00 O +ATOM 1125 N CYS A 148 -7.409 19.637 -16.271 1.00 0.00 N +ATOM 1126 CA CYS A 148 -7.135 18.448 -15.471 1.00 0.00 C +ATOM 1127 C CYS A 148 -7.876 17.237 -16.024 1.00 0.00 C +ATOM 1128 CB CYS A 148 -7.534 18.680 -14.014 1.00 0.00 C +ATOM 1129 O CYS A 148 -8.941 16.873 -15.523 1.00 0.00 O +ATOM 1130 SG CYS A 148 -6.884 17.438 -12.875 1.00 0.00 S +ATOM 1131 N ASP A 149 -7.699 16.869 -17.159 1.00 0.00 N +ATOM 1132 CA ASP A 149 -8.393 15.760 -17.806 1.00 0.00 C +ATOM 1133 C ASP A 149 -7.445 14.590 -18.056 1.00 0.00 C +ATOM 1134 CB ASP A 149 -9.023 16.217 -19.124 1.00 0.00 C +ATOM 1135 O ASP A 149 -6.548 14.679 -18.896 1.00 0.00 O +ATOM 1136 CG ASP A 149 -9.976 15.192 -19.713 1.00 0.00 C +ATOM 1137 OD1 ASP A 149 -10.762 15.540 -20.620 1.00 0.00 O +ATOM 1138 OD2 ASP A 149 -9.941 14.025 -19.265 1.00 0.00 O +ATOM 1139 N CYS A 150 -7.567 13.519 -17.222 1.00 0.00 N +ATOM 1140 CA CYS A 150 -6.727 12.334 -17.354 1.00 0.00 C +ATOM 1141 C CYS A 150 -7.054 11.573 -18.634 1.00 0.00 C +ATOM 1142 CB CYS A 150 -6.900 11.416 -16.145 1.00 0.00 C +ATOM 1143 O CYS A 150 -6.244 10.777 -19.112 1.00 0.00 O +ATOM 1144 SG CYS A 150 -6.406 12.171 -14.581 1.00 0.00 S +ATOM 1145 N LYS A 151 -8.188 11.835 -19.161 1.00 0.00 N +ATOM 1146 CA LYS A 151 -8.679 11.063 -20.298 1.00 0.00 C +ATOM 1147 C LYS A 151 -8.050 11.543 -21.603 1.00 0.00 C +ATOM 1148 CB LYS A 151 -10.204 11.151 -20.388 1.00 0.00 C +ATOM 1149 O LYS A 151 -7.990 10.796 -22.581 1.00 0.00 O +ATOM 1150 CG LYS A 151 -10.931 10.505 -19.219 1.00 0.00 C +ATOM 1151 CD LYS A 151 -12.443 10.620 -19.368 1.00 0.00 C +ATOM 1152 CE LYS A 151 -13.172 9.972 -18.199 1.00 0.00 C +ATOM 1153 NZ LYS A 151 -14.653 10.132 -18.313 1.00 0.00 N +ATOM 1154 N THR A 152 -7.674 12.782 -21.597 1.00 0.00 N +ATOM 1155 CA THR A 152 -7.207 13.367 -22.850 1.00 0.00 C +ATOM 1156 C THR A 152 -5.688 13.279 -22.954 1.00 0.00 C +ATOM 1157 CB THR A 152 -7.649 14.836 -22.979 1.00 0.00 C +ATOM 1158 O THR A 152 -5.115 13.562 -24.008 1.00 0.00 O +ATOM 1159 CG2 THR A 152 -9.168 14.950 -23.052 1.00 0.00 C +ATOM 1160 OG1 THR A 152 -7.180 15.572 -21.843 1.00 0.00 O +ATOM 1161 N ILE A 153 -5.064 12.924 -21.810 1.00 0.00 N +ATOM 1162 CA ILE A 153 -3.608 12.834 -21.820 1.00 0.00 C +ATOM 1163 C ILE A 153 -3.181 11.435 -22.259 1.00 0.00 C +ATOM 1164 CB ILE A 153 -3.011 13.167 -20.435 1.00 0.00 C +ATOM 1165 O ILE A 153 -3.826 10.444 -21.909 1.00 0.00 O +ATOM 1166 CG1 ILE A 153 -3.390 14.593 -20.018 1.00 0.00 C +ATOM 1167 CG2 ILE A 153 -1.490 12.986 -20.444 1.00 0.00 C +ATOM 1168 CD1 ILE A 153 -2.744 15.679 -20.868 1.00 0.00 C +ATOM 1169 N THR A 154 -2.270 11.363 -23.110 1.00 0.00 N +ATOM 1170 CA THR A 154 -1.713 10.090 -23.553 1.00 0.00 C +ATOM 1171 C THR A 154 -1.160 9.301 -22.370 1.00 0.00 C +ATOM 1172 CB THR A 154 -0.603 10.299 -24.599 1.00 0.00 C +ATOM 1173 O THR A 154 -0.336 9.812 -21.607 1.00 0.00 O +ATOM 1174 CG2 THR A 154 -0.102 8.965 -25.144 1.00 0.00 C +ATOM 1175 OG1 THR A 154 -1.117 11.082 -25.683 1.00 0.00 O +ATOM 1176 N CYS A 155 -1.859 8.148 -22.092 1.00 0.00 N +ATOM 1177 CA CYS A 155 -1.409 7.282 -21.008 1.00 0.00 C +ATOM 1178 C CYS A 155 -0.060 6.653 -21.338 1.00 0.00 C +ATOM 1179 CB CYS A 155 -2.439 6.187 -20.734 1.00 0.00 C +ATOM 1180 O CYS A 155 0.086 5.991 -22.367 1.00 0.00 O +ATOM 1181 SG CYS A 155 -4.010 6.809 -20.095 1.00 0.00 S +ATOM 1182 N ASN A 156 0.893 7.176 -20.743 1.00 0.00 N +ATOM 1183 CA ASN A 156 2.201 6.536 -20.836 1.00 0.00 C +ATOM 1184 C ASN A 156 2.611 5.904 -19.509 1.00 0.00 C +ATOM 1185 CB ASN A 156 3.259 7.541 -21.294 1.00 0.00 C +ATOM 1186 O ASN A 156 1.841 5.916 -18.546 1.00 0.00 O +ATOM 1187 CG ASN A 156 3.393 8.721 -20.351 1.00 0.00 C +ATOM 1188 ND2 ASN A 156 3.554 9.913 -20.912 1.00 0.00 N +ATOM 1189 OD1 ASN A 156 3.352 8.561 -19.128 1.00 0.00 O +ATOM 1190 N GLU A 157 3.624 5.165 -19.538 1.00 0.00 N +ATOM 1191 CA GLU A 157 4.078 4.402 -18.379 1.00 0.00 C +ATOM 1192 C GLU A 157 4.196 5.291 -17.145 1.00 0.00 C +ATOM 1193 CB GLU A 157 5.421 3.727 -18.672 1.00 0.00 C +ATOM 1194 O GLU A 157 4.169 4.799 -16.014 1.00 0.00 O +ATOM 1195 CG GLU A 157 5.336 2.611 -19.703 1.00 0.00 C +ATOM 1196 CD GLU A 157 6.670 1.925 -19.955 1.00 0.00 C +ATOM 1197 OE1 GLU A 157 7.660 2.250 -19.261 1.00 0.00 O +ATOM 1198 OE2 GLU A 157 6.725 1.058 -20.855 1.00 0.00 O +ATOM 1199 N ASP A 158 4.203 6.614 -17.357 1.00 0.00 N +ATOM 1200 CA ASP A 158 4.344 7.540 -16.237 1.00 0.00 C +ATOM 1201 C ASP A 158 2.979 8.001 -15.731 1.00 0.00 C +ATOM 1202 CB ASP A 158 5.190 8.748 -16.643 1.00 0.00 C +ATOM 1203 O ASP A 158 2.882 8.629 -14.675 1.00 0.00 O +ATOM 1204 CG ASP A 158 6.638 8.390 -16.927 1.00 0.00 C +ATOM 1205 OD1 ASP A 158 7.251 8.999 -17.830 1.00 0.00 O +ATOM 1206 OD2 ASP A 158 7.169 7.487 -16.244 1.00 0.00 O +ATOM 1207 N HIS A 159 2.048 7.688 -16.589 1.00 0.00 N +ATOM 1208 CA HIS A 159 0.697 8.104 -16.230 1.00 0.00 C +ATOM 1209 C HIS A 159 0.098 7.180 -15.176 1.00 0.00 C +ATOM 1210 CB HIS A 159 -0.199 8.139 -17.469 1.00 0.00 C +ATOM 1211 O HIS A 159 0.148 5.956 -15.317 1.00 0.00 O +ATOM 1212 CG HIS A 159 -1.463 8.914 -17.273 1.00 0.00 C +ATOM 1213 CD2 HIS A 159 -1.859 10.110 -17.769 1.00 0.00 C +ATOM 1214 ND1 HIS A 159 -2.495 8.466 -16.477 1.00 0.00 N +ATOM 1215 CE1 HIS A 159 -3.474 9.356 -16.493 1.00 0.00 C +ATOM 1216 NE2 HIS A 159 -3.113 10.363 -17.270 1.00 0.00 N +ATOM 1217 N PRO A 160 -0.393 7.607 -14.171 1.00 0.00 N +ATOM 1218 CA PRO A 160 -0.882 6.789 -13.059 1.00 0.00 C +ATOM 1219 C PRO A 160 -2.041 5.880 -13.461 1.00 0.00 C +ATOM 1220 CB PRO A 160 -1.334 7.828 -12.030 1.00 0.00 C +ATOM 1221 O PRO A 160 -2.326 4.896 -12.773 1.00 0.00 O +ATOM 1222 CG PRO A 160 -1.619 9.058 -12.828 1.00 0.00 C +ATOM 1223 CD PRO A 160 -0.678 9.096 -13.998 1.00 0.00 C +ATOM 1224 N CYS A 161 -2.737 6.193 -14.475 1.00 0.00 N +ATOM 1225 CA CYS A 161 -3.885 5.408 -14.913 1.00 0.00 C +ATOM 1226 C CYS A 161 -3.470 4.357 -15.936 1.00 0.00 C +ATOM 1227 CB CYS A 161 -4.960 6.317 -15.509 1.00 0.00 C +ATOM 1228 O CYS A 161 -4.312 3.621 -16.453 1.00 0.00 O +ATOM 1229 SG CYS A 161 -5.656 7.493 -14.328 1.00 0.00 S +ATOM 1230 N TYR A 162 -2.132 4.465 -16.183 1.00 0.00 N +ATOM 1231 CA TYR A 162 -1.573 3.516 -17.140 1.00 0.00 C +ATOM 1232 C TYR A 162 -1.452 2.127 -16.525 1.00 0.00 C +ATOM 1233 CB TYR A 162 -0.201 3.992 -17.629 1.00 0.00 C +ATOM 1234 O TYR A 162 -0.908 1.972 -15.429 1.00 0.00 O +ATOM 1235 CG TYR A 162 0.469 3.033 -18.583 1.00 0.00 C +ATOM 1236 CD1 TYR A 162 1.424 2.124 -18.131 1.00 0.00 C +ATOM 1237 CD2 TYR A 162 0.151 3.035 -19.936 1.00 0.00 C +ATOM 1238 CE1 TYR A 162 2.046 1.240 -19.007 1.00 0.00 C +ATOM 1239 CE2 TYR A 162 0.766 2.155 -20.821 1.00 0.00 C +ATOM 1240 OH TYR A 162 2.323 0.390 -21.219 1.00 0.00 O +ATOM 1241 CZ TYR A 162 1.710 1.263 -20.348 1.00 0.00 C +ATOM 1242 N HIS A 163 -2.235 1.147 -17.118 1.00 0.00 N +ATOM 1243 CA HIS A 163 -2.129 -0.243 -16.689 1.00 0.00 C +ATOM 1244 C HIS A 163 -1.553 -1.119 -17.797 1.00 0.00 C +ATOM 1245 CB HIS A 163 -3.496 -0.776 -16.256 1.00 0.00 C +ATOM 1246 O HIS A 163 -1.953 -1.002 -18.957 1.00 0.00 O +ATOM 1247 CG HIS A 163 -4.058 -0.081 -15.057 1.00 0.00 C +ATOM 1248 CD2 HIS A 163 -5.018 0.867 -14.948 1.00 0.00 C +ATOM 1249 ND1 HIS A 163 -3.625 -0.342 -13.775 1.00 0.00 N +ATOM 1250 CE1 HIS A 163 -4.297 0.419 -12.926 1.00 0.00 C +ATOM 1251 NE2 HIS A 163 -5.148 1.162 -13.613 1.00 0.00 N +ATOM 1252 N SER A 164 -0.416 -1.652 -17.433 1.00 0.00 N +ATOM 1253 CA SER A 164 0.122 -2.646 -18.356 1.00 0.00 C +ATOM 1254 C SER A 164 -0.175 -4.063 -17.877 1.00 0.00 C +ATOM 1255 CB SER A 164 1.630 -2.462 -18.523 1.00 0.00 C +ATOM 1256 O SER A 164 -0.055 -4.360 -16.687 1.00 0.00 O +ATOM 1257 OG SER A 164 2.304 -2.686 -17.297 1.00 0.00 O +ATOM 1258 N TYR A 165 -0.841 -4.799 -18.656 1.00 0.00 N +ATOM 1259 CA TYR A 165 -1.123 -6.182 -18.287 1.00 0.00 C +ATOM 1260 C TYR A 165 -0.783 -7.132 -19.429 1.00 0.00 C +ATOM 1261 CB TYR A 165 -2.594 -6.345 -17.894 1.00 0.00 C +ATOM 1262 O TYR A 165 -0.643 -6.705 -20.578 1.00 0.00 O +ATOM 1263 CG TYR A 165 -3.559 -6.039 -19.013 1.00 0.00 C +ATOM 1264 CD1 TYR A 165 -3.953 -4.730 -19.282 1.00 0.00 C +ATOM 1265 CD2 TYR A 165 -4.080 -7.058 -19.804 1.00 0.00 C +ATOM 1266 CE1 TYR A 165 -4.843 -4.444 -20.312 1.00 0.00 C +ATOM 1267 CE2 TYR A 165 -4.971 -6.783 -20.836 1.00 0.00 C +ATOM 1268 OH TYR A 165 -6.228 -5.197 -22.103 1.00 0.00 O +ATOM 1269 CZ TYR A 165 -5.346 -5.475 -21.082 1.00 0.00 C +ATOM 1270 N GLU A 166 -0.437 -8.271 -19.075 1.00 0.00 N +ATOM 1271 CA GLU A 166 -0.092 -9.311 -20.039 1.00 0.00 C +ATOM 1272 C GLU A 166 -1.292 -10.203 -20.342 1.00 0.00 C +ATOM 1273 CB GLU A 166 1.075 -10.158 -19.523 1.00 0.00 C +ATOM 1274 O GLU A 166 -1.951 -10.699 -19.426 1.00 0.00 O +ATOM 1275 CG GLU A 166 1.667 -11.091 -20.569 1.00 0.00 C +ATOM 1276 CD GLU A 166 2.944 -11.776 -20.108 1.00 0.00 C +ATOM 1277 OE1 GLU A 166 3.581 -11.289 -19.146 1.00 0.00 O +ATOM 1278 OE2 GLU A 166 3.310 -12.808 -20.713 1.00 0.00 O +ATOM 1279 N GLU A 167 -1.701 -10.268 -21.599 1.00 0.00 N +ATOM 1280 CA GLU A 167 -2.770 -11.135 -22.087 1.00 0.00 C +ATOM 1281 C GLU A 167 -2.310 -11.956 -23.288 1.00 0.00 C +ATOM 1282 CB GLU A 167 -4.006 -10.310 -22.455 1.00 0.00 C +ATOM 1283 O GLU A 167 -1.837 -11.400 -24.282 1.00 0.00 O +ATOM 1284 CG GLU A 167 -5.232 -11.150 -22.780 1.00 0.00 C +ATOM 1285 CD GLU A 167 -6.476 -10.318 -23.048 1.00 0.00 C +ATOM 1286 OE1 GLU A 167 -6.367 -9.075 -23.139 1.00 0.00 O +ATOM 1287 OE2 GLU A 167 -7.570 -10.915 -23.165 1.00 0.00 O +ATOM 1288 N ASP A 168 -2.308 -13.235 -23.226 1.00 0.00 N +ATOM 1289 CA ASP A 168 -1.919 -14.168 -24.278 1.00 0.00 C +ATOM 1290 C ASP A 168 -0.472 -13.938 -24.708 1.00 0.00 C +ATOM 1291 CB ASP A 168 -2.852 -14.039 -25.483 1.00 0.00 C +ATOM 1292 O ASP A 168 -0.162 -13.963 -25.901 1.00 0.00 O +ATOM 1293 CG ASP A 168 -4.284 -14.437 -25.170 1.00 0.00 C +ATOM 1294 OD1 ASP A 168 -5.222 -13.831 -25.730 1.00 0.00 O +ATOM 1295 OD2 ASP A 168 -4.475 -15.363 -24.352 1.00 0.00 O +ATOM 1296 N GLY A 169 0.378 -13.615 -23.661 1.00 0.00 N +ATOM 1297 CA GLY A 169 1.802 -13.483 -23.928 1.00 0.00 C +ATOM 1298 C GLY A 169 2.181 -12.123 -24.482 1.00 0.00 C +ATOM 1299 O GLY A 169 3.340 -11.889 -24.830 1.00 0.00 O +ATOM 1300 N VAL A 170 1.173 -11.220 -24.645 1.00 0.00 N +ATOM 1301 CA VAL A 170 1.451 -9.891 -25.180 1.00 0.00 C +ATOM 1302 C VAL A 170 1.131 -8.832 -24.128 1.00 0.00 C +ATOM 1303 CB VAL A 170 0.648 -9.620 -26.472 1.00 0.00 C +ATOM 1304 O VAL A 170 0.124 -8.932 -23.423 1.00 0.00 O +ATOM 1305 CG1 VAL A 170 0.954 -8.226 -27.016 1.00 0.00 C +ATOM 1306 CG2 VAL A 170 0.952 -10.686 -27.523 1.00 0.00 C +ATOM 1307 N THR A 171 2.053 -7.976 -23.977 1.00 0.00 N +ATOM 1308 CA THR A 171 1.846 -6.867 -23.053 1.00 0.00 C +ATOM 1309 C THR A 171 0.857 -5.859 -23.631 1.00 0.00 C +ATOM 1310 CB THR A 171 3.173 -6.158 -22.725 1.00 0.00 C +ATOM 1311 O THR A 171 1.042 -5.370 -24.747 1.00 0.00 O +ATOM 1312 CG2 THR A 171 2.958 -5.020 -21.732 1.00 0.00 C +ATOM 1313 OG1 THR A 171 4.087 -7.105 -22.158 1.00 0.00 O +ATOM 1314 N LYS A 172 -0.220 -5.669 -22.883 1.00 0.00 N +ATOM 1315 CA LYS A 172 -1.215 -4.669 -23.260 1.00 0.00 C +ATOM 1316 C LYS A 172 -1.232 -3.510 -22.267 1.00 0.00 C +ATOM 1317 CB LYS A 172 -2.604 -5.301 -23.351 1.00 0.00 C +ATOM 1318 O LYS A 172 -0.846 -3.673 -21.107 1.00 0.00 O +ATOM 1319 CG LYS A 172 -2.720 -6.393 -24.405 1.00 0.00 C +ATOM 1320 CD LYS A 172 -4.154 -6.886 -24.543 1.00 0.00 C +ATOM 1321 CE LYS A 172 -4.280 -7.941 -25.634 1.00 0.00 C +ATOM 1322 NZ LYS A 172 -5.700 -8.358 -25.841 1.00 0.00 N +ATOM 1323 N SER A 173 -1.325 -2.368 -22.806 1.00 0.00 N +ATOM 1324 CA SER A 173 -1.442 -1.178 -21.969 1.00 0.00 C +ATOM 1325 C SER A 173 -2.815 -0.530 -22.119 1.00 0.00 C +ATOM 1326 CB SER A 173 -0.350 -0.167 -22.320 1.00 0.00 C +ATOM 1327 O SER A 173 -3.418 -0.584 -23.193 1.00 0.00 O +ATOM 1328 OG SER A 173 -0.430 0.207 -23.684 1.00 0.00 O +ATOM 1329 N ASP A 174 -3.338 -0.380 -21.075 1.00 0.00 N +ATOM 1330 CA ASP A 174 -4.630 0.300 -21.062 1.00 0.00 C +ATOM 1331 C ASP A 174 -4.627 1.467 -20.077 1.00 0.00 C +ATOM 1332 CB ASP A 174 -5.749 -0.682 -20.712 1.00 0.00 C +ATOM 1333 O ASP A 174 -3.834 1.488 -19.134 1.00 0.00 O +ATOM 1334 CG ASP A 174 -7.118 -0.209 -21.168 1.00 0.00 C +ATOM 1335 OD1 ASP A 174 -8.137 -0.811 -20.767 1.00 0.00 O +ATOM 1336 OD2 ASP A 174 -7.178 0.774 -21.938 1.00 0.00 O +ATOM 1337 N CYS A 175 -5.254 2.474 -20.569 1.00 0.00 N +ATOM 1338 CA CYS A 175 -5.511 3.614 -19.696 1.00 0.00 C +ATOM 1339 C CYS A 175 -6.886 3.506 -19.049 1.00 0.00 C +ATOM 1340 CB CYS A 175 -5.407 4.922 -20.479 1.00 0.00 C +ATOM 1341 O CYS A 175 -7.906 3.530 -19.740 1.00 0.00 O +ATOM 1342 SG CYS A 175 -5.469 6.399 -19.441 1.00 0.00 S +ATOM 1343 N ASP A 176 -6.926 3.117 -17.897 1.00 0.00 N +ATOM 1344 CA ASP A 176 -8.216 2.947 -17.236 1.00 0.00 C +ATOM 1345 C ASP A 176 -8.579 4.181 -16.413 1.00 0.00 C +ATOM 1346 CB ASP A 176 -8.202 1.705 -16.343 1.00 0.00 C +ATOM 1347 O ASP A 176 -8.390 4.199 -15.195 1.00 0.00 O +ATOM 1348 CG ASP A 176 -9.574 1.352 -15.795 1.00 0.00 C +ATOM 1349 OD1 ASP A 176 -9.681 0.413 -14.978 1.00 0.00 O +ATOM 1350 OD2 ASP A 176 -10.557 2.018 -16.187 1.00 0.00 O +ATOM 1351 N CYS A 177 -8.999 5.207 -17.129 1.00 0.00 N +ATOM 1352 CA CYS A 177 -9.425 6.426 -16.450 1.00 0.00 C +ATOM 1353 C CYS A 177 -10.930 6.422 -16.214 1.00 0.00 C +ATOM 1354 CB CYS A 177 -9.030 7.658 -17.264 1.00 0.00 C +ATOM 1355 O CYS A 177 -11.489 7.406 -15.726 1.00 0.00 O +ATOM 1356 SG CYS A 177 -7.251 7.814 -17.535 1.00 0.00 S +ATOM 1357 N GLU A 178 -11.529 5.450 -16.815 1.00 0.00 N +ATOM 1358 CA GLU A 178 -12.986 5.385 -16.754 1.00 0.00 C +ATOM 1359 C GLU A 178 -13.473 5.263 -15.313 1.00 0.00 C +ATOM 1360 CB GLU A 178 -13.508 4.211 -17.586 1.00 0.00 C +ATOM 1361 O GLU A 178 -14.584 5.686 -14.990 1.00 0.00 O +ATOM 1362 CG GLU A 178 -13.379 4.417 -19.089 1.00 0.00 C +ATOM 1363 CD GLU A 178 -13.985 3.285 -19.903 1.00 0.00 C +ATOM 1364 OE1 GLU A 178 -14.377 2.254 -19.312 1.00 0.00 O +ATOM 1365 OE2 GLU A 178 -14.069 3.431 -21.143 1.00 0.00 O +ATOM 1366 N HIS A 179 -12.602 4.539 -14.596 1.00 0.00 N +ATOM 1367 CA HIS A 179 -13.083 4.370 -13.230 1.00 0.00 C +ATOM 1368 C HIS A 179 -12.913 5.654 -12.423 1.00 0.00 C +ATOM 1369 CB HIS A 179 -12.350 3.217 -12.542 1.00 0.00 C +ATOM 1370 O HIS A 179 -13.259 5.699 -11.241 1.00 0.00 O +ATOM 1371 CG HIS A 179 -12.672 1.874 -13.117 1.00 0.00 C +ATOM 1372 CD2 HIS A 179 -11.913 1.007 -13.828 1.00 0.00 C +ATOM 1373 ND1 HIS A 179 -13.911 1.286 -12.986 1.00 0.00 N +ATOM 1374 CE1 HIS A 179 -13.900 0.111 -13.593 1.00 0.00 C +ATOM 1375 NE2 HIS A 179 -12.700 -0.082 -14.113 1.00 0.00 N +ATOM 1376 N SER A 180 -12.761 6.762 -13.153 1.00 0.00 N +ATOM 1377 CA SER A 180 -12.625 8.074 -12.529 1.00 0.00 C +ATOM 1378 C SER A 180 -13.967 8.797 -12.465 1.00 0.00 C +ATOM 1379 CB SER A 180 -11.612 8.928 -13.291 1.00 0.00 C +ATOM 1380 O SER A 180 -14.740 8.767 -13.424 1.00 0.00 O +ATOM 1381 OG SER A 180 -12.114 9.284 -14.568 1.00 0.00 O +ATOM 1382 N PRO A 181 -14.719 8.802 -11.393 1.00 0.00 N +ATOM 1383 CA PRO A 181 -15.790 9.799 -11.316 1.00 0.00 C +ATOM 1384 C PRO A 181 -15.334 11.190 -11.748 1.00 0.00 C +ATOM 1385 CB PRO A 181 -16.178 9.786 -9.836 1.00 0.00 C +ATOM 1386 O PRO A 181 -14.337 11.704 -11.233 1.00 0.00 O +ATOM 1387 CG PRO A 181 -14.965 9.275 -9.127 1.00 0.00 C +ATOM 1388 CD PRO A 181 -14.184 8.416 -10.079 1.00 0.00 C +ATOM 1389 N GLY A 182 -15.240 11.453 -13.029 1.00 0.00 N +ATOM 1390 CA GLY A 182 -15.037 12.822 -13.476 1.00 0.00 C +ATOM 1391 C GLY A 182 -15.937 13.820 -12.770 1.00 0.00 C +ATOM 1392 O GLY A 182 -16.871 13.431 -12.066 1.00 0.00 O +ATOM 1393 N PRO A 183 -15.396 14.822 -12.165 1.00 0.00 N +ATOM 1394 CA PRO A 183 -16.219 15.888 -11.589 1.00 0.00 C +ATOM 1395 C PRO A 183 -17.636 15.913 -12.158 1.00 0.00 C +ATOM 1396 CB PRO A 183 -15.458 17.162 -11.964 1.00 0.00 C +ATOM 1397 O PRO A 183 -17.838 15.604 -13.335 1.00 0.00 O +ATOM 1398 CG PRO A 183 -14.695 16.803 -13.198 1.00 0.00 C +ATOM 1399 CD PRO A 183 -14.401 15.330 -13.164 1.00 0.00 C +ATOM 1400 N SER A 184 -18.521 15.085 -11.531 1.00 0.00 N +ATOM 1401 CA SER A 184 -19.918 15.360 -11.852 1.00 0.00 C +ATOM 1402 C SER A 184 -20.093 16.779 -12.385 1.00 0.00 C +ATOM 1403 CB SER A 184 -20.801 15.157 -10.620 1.00 0.00 C +ATOM 1404 O SER A 184 -19.543 17.730 -11.826 1.00 0.00 O +ATOM 1405 OG SER A 184 -20.375 15.985 -9.553 1.00 0.00 O +ATOM 1406 N GLU A 185 -19.658 16.958 -13.662 1.00 0.00 N +ATOM 1407 CA GLU A 185 -20.167 18.200 -14.237 1.00 0.00 C +ATOM 1408 C GLU A 185 -21.492 18.603 -13.597 1.00 0.00 C +ATOM 1409 CB GLU A 185 -20.336 18.061 -15.752 1.00 0.00 C +ATOM 1410 O GLU A 185 -22.450 17.827 -13.598 1.00 0.00 O +ATOM 1411 CG GLU A 185 -19.029 17.836 -16.499 1.00 0.00 C +ATOM 1412 CD GLU A 185 -18.110 19.046 -16.478 1.00 0.00 C +ATOM 1413 OE1 GLU A 185 -18.546 20.132 -16.032 1.00 0.00 O +ATOM 1414 OE2 GLU A 185 -16.944 18.908 -16.911 1.00 0.00 O +ATOM 1415 N HIS A 186 -21.419 18.961 -12.324 1.00 0.00 N +ATOM 1416 CA HIS A 186 -22.672 19.612 -11.958 1.00 0.00 C +ATOM 1417 C HIS A 186 -23.102 20.617 -13.022 1.00 0.00 C +ATOM 1418 CB HIS A 186 -22.539 20.307 -10.602 1.00 0.00 C +ATOM 1419 O HIS A 186 -22.311 21.471 -13.430 1.00 0.00 O +ATOM 1420 CG HIS A 186 -22.402 19.359 -9.453 1.00 0.00 C +ATOM 1421 CD2 HIS A 186 -21.354 19.097 -8.637 1.00 0.00 C +ATOM 1422 ND1 HIS A 186 -23.431 18.543 -9.034 1.00 0.00 N +ATOM 1423 CE1 HIS A 186 -23.020 17.819 -8.007 1.00 0.00 C +ATOM 1424 NE2 HIS A 186 -21.763 18.136 -7.746 1.00 0.00 N +ATOM 1425 N HIS A 187 -23.592 20.072 -14.139 1.00 0.00 N +ATOM 1426 CA HIS A 187 -24.308 20.983 -15.025 1.00 0.00 C +ATOM 1427 C HIS A 187 -24.996 22.092 -14.235 1.00 0.00 C +ATOM 1428 CB HIS A 187 -25.335 20.219 -15.862 1.00 0.00 C +ATOM 1429 O HIS A 187 -25.860 21.819 -13.399 1.00 0.00 O +ATOM 1430 CG HIS A 187 -24.723 19.267 -16.840 1.00 0.00 C +ATOM 1431 CD2 HIS A 187 -24.703 17.913 -16.868 1.00 0.00 C +ATOM 1432 ND1 HIS A 187 -24.026 19.687 -17.952 1.00 0.00 N +ATOM 1433 CE1 HIS A 187 -23.603 18.630 -18.624 1.00 0.00 C +ATOM 1434 NE2 HIS A 187 -24.000 17.541 -17.988 1.00 0.00 N +ATOM 1435 N HIS A 188 -24.187 22.915 -13.610 1.00 0.00 N +ATOM 1436 CA HIS A 188 -24.905 24.094 -13.140 1.00 0.00 C +ATOM 1437 C HIS A 188 -25.814 24.656 -14.228 1.00 0.00 C +ATOM 1438 CB HIS A 188 -23.923 25.168 -12.669 1.00 0.00 C +ATOM 1439 O HIS A 188 -25.380 24.849 -15.366 1.00 0.00 O +ATOM 1440 CG HIS A 188 -23.207 24.814 -11.404 1.00 0.00 C +ATOM 1441 CD2 HIS A 188 -21.913 24.489 -11.176 1.00 0.00 C +ATOM 1442 ND1 HIS A 188 -23.839 24.765 -10.181 1.00 0.00 N +ATOM 1443 CE1 HIS A 188 -22.961 24.425 -9.252 1.00 0.00 C +ATOM 1444 NE2 HIS A 188 -21.785 24.251 -9.830 1.00 0.00 N +ATOM 1445 N HIS A 189 -26.993 24.045 -14.412 1.00 0.00 N +ATOM 1446 CA HIS A 189 -28.031 24.708 -15.193 1.00 0.00 C +ATOM 1447 C HIS A 189 -28.031 26.213 -14.944 1.00 0.00 C +ATOM 1448 CB HIS A 189 -29.406 24.122 -14.865 1.00 0.00 C +ATOM 1449 O HIS A 189 -27.980 26.656 -13.795 1.00 0.00 O +ATOM 1450 CG HIS A 189 -29.586 22.714 -15.335 1.00 0.00 C +ATOM 1451 CD2 HIS A 189 -29.619 21.546 -14.652 1.00 0.00 C +ATOM 1452 ND1 HIS A 189 -29.755 22.390 -16.664 1.00 0.00 N +ATOM 1453 CE1 HIS A 189 -29.887 21.079 -16.778 1.00 0.00 C +ATOM 1454 NE2 HIS A 189 -29.808 20.543 -15.572 1.00 0.00 N +ATOM 1455 N HIS A 190 -27.150 26.911 -15.639 1.00 0.00 N +ATOM 1456 CA HIS A 190 -27.271 28.363 -15.688 1.00 0.00 C +ATOM 1457 C HIS A 190 -28.733 28.796 -15.667 1.00 0.00 C +ATOM 1458 CB HIS A 190 -26.577 28.917 -16.934 1.00 0.00 C +ATOM 1459 O HIS A 190 -29.546 28.288 -16.443 1.00 0.00 O +ATOM 1460 CG HIS A 190 -25.087 28.794 -16.896 1.00 0.00 C +ATOM 1461 CD2 HIS A 190 -24.243 27.997 -17.592 1.00 0.00 C +ATOM 1462 ND1 HIS A 190 -24.299 29.553 -16.058 1.00 0.00 N +ATOM 1463 CE1 HIS A 190 -23.030 29.227 -16.242 1.00 0.00 C +ATOM 1464 NE2 HIS A 190 -22.969 28.285 -17.168 1.00 0.00 N +ATOM 1465 N HIS A 191 -29.301 28.820 -14.496 1.00 0.00 N +ATOM 1466 CA HIS A 191 -30.497 29.651 -14.423 1.00 0.00 C +ATOM 1467 C HIS A 191 -30.240 31.039 -15.001 1.00 0.00 C +ATOM 1468 CB HIS A 191 -30.981 29.766 -12.976 1.00 0.00 C +ATOM 1469 O HIS A 191 -29.144 31.584 -14.855 1.00 0.00 O +ATOM 1470 CG HIS A 191 -31.644 28.528 -12.465 1.00 0.00 C +ATOM 1471 CD2 HIS A 191 -31.230 27.603 -11.566 1.00 0.00 C +ATOM 1472 ND1 HIS A 191 -32.892 28.123 -12.888 1.00 0.00 N +ATOM 1473 CE1 HIS A 191 -33.217 27.000 -12.270 1.00 0.00 C +ATOM 1474 NE2 HIS A 191 -32.226 26.664 -11.462 1.00 0.00 N +TER 1475 HIS A 191 +ENDMDL +END diff --git a/alphafold/alphafold/relax/testdata/with_violations.pdb b/alphafold/alphafold/relax/testdata/with_violations.pdb new file mode 100644 index 0000000000000000000000000000000000000000..92f4a2a8703956bbd56642da6ebb518c7a588ef0 --- /dev/null +++ b/alphafold/alphafold/relax/testdata/with_violations.pdb @@ -0,0 +1,1193 @@ +MODEL 0 +ATOM 1 N SER A 1 23.291 1.505 0.613 1.00 6.08 N +ATOM 2 CA SER A 1 22.518 0.883 -0.457 1.00 6.08 C +ATOM 3 C SER A 1 21.020 1.015 -0.206 1.00 6.08 C +ATOM 4 CB SER A 1 22.891 -0.593 -0.601 1.00 6.08 C +ATOM 5 O SER A 1 20.593 1.246 0.928 1.00 6.08 O +ATOM 6 OG SER A 1 22.364 -1.352 0.474 1.00 6.08 O +ATOM 7 N PHE A 2 20.180 1.317 -1.280 1.00 6.08 N +ATOM 8 CA PHE A 2 18.725 1.321 -1.187 1.00 6.08 C +ATOM 9 C PHE A 2 18.244 0.288 -0.175 1.00 6.08 C +ATOM 10 CB PHE A 2 18.097 1.046 -2.557 1.00 6.08 C +ATOM 11 O PHE A 2 17.437 0.600 0.703 1.00 6.08 O +ATOM 12 CG PHE A 2 16.601 0.880 -2.517 1.00 6.08 C +ATOM 13 CD1 PHE A 2 15.765 1.989 -2.519 1.00 6.08 C +ATOM 14 CD2 PHE A 2 16.033 -0.386 -2.478 1.00 6.08 C +ATOM 15 CE1 PHE A 2 14.380 1.838 -2.482 1.00 6.08 C +ATOM 16 CE2 PHE A 2 14.650 -0.545 -2.441 1.00 6.08 C +ATOM 17 CZ PHE A 2 13.826 0.569 -2.442 1.00 6.08 C +ATOM 18 N GLU A 3 18.695 -0.904 -0.178 1.00 6.08 N +ATOM 19 CA GLU A 3 18.305 -2.028 0.668 1.00 6.08 C +ATOM 20 C GLU A 3 18.535 -1.714 2.144 1.00 6.08 C +ATOM 21 CB GLU A 3 19.073 -3.291 0.273 1.00 6.08 C +ATOM 22 O GLU A 3 17.664 -1.961 2.980 1.00 6.08 O +ATOM 23 CG GLU A 3 18.413 -4.088 -0.843 1.00 6.08 C +ATOM 24 CD GLU A 3 19.408 -4.840 -1.713 1.00 6.08 C +ATOM 25 OE1 GLU A 3 18.977 -5.585 -2.622 1.00 6.08 O +ATOM 26 OE2 GLU A 3 20.628 -4.683 -1.482 1.00 6.08 O +ATOM 27 N GLU A 4 19.823 -1.305 2.459 1.00 6.08 N +ATOM 28 CA GLU A 4 20.190 -1.047 3.848 1.00 6.08 C +ATOM 29 C GLU A 4 19.315 0.044 4.456 1.00 6.08 C +ATOM 30 CB GLU A 4 21.666 -0.656 3.950 1.00 6.08 C +ATOM 31 O GLU A 4 18.868 -0.076 5.599 1.00 6.08 O +ATOM 32 CG GLU A 4 22.621 -1.841 3.913 1.00 6.08 C +ATOM 33 CD GLU A 4 24.085 -1.434 3.973 1.00 6.08 C +ATOM 34 OE1 GLU A 4 24.957 -2.324 4.094 1.00 6.08 O +ATOM 35 OE2 GLU A 4 24.361 -0.216 3.899 1.00 6.08 O +ATOM 36 N GLN A 5 19.061 1.102 3.590 1.00 6.08 N +ATOM 37 CA GLN A 5 18.207 2.189 4.056 1.00 6.08 C +ATOM 38 C GLN A 5 16.771 1.714 4.255 1.00 6.08 C +ATOM 39 CB GLN A 5 18.241 3.359 3.071 1.00 6.08 C +ATOM 40 O GLN A 5 16.113 2.097 5.225 1.00 6.08 O +ATOM 41 CG GLN A 5 19.395 4.326 3.304 1.00 6.08 C +ATOM 42 CD GLN A 5 19.384 5.496 2.338 1.00 6.08 C +ATOM 43 NE2 GLN A 5 20.565 6.022 2.031 1.00 6.08 N +ATOM 44 OE1 GLN A 5 18.323 5.922 1.871 1.00 6.08 O +ATOM 45 N PHE A 6 16.354 0.831 3.208 1.00 5.36 N +ATOM 46 CA PHE A 6 15.014 0.260 3.283 1.00 5.36 C +ATOM 47 C PHE A 6 14.844 -0.555 4.559 1.00 5.36 C +ATOM 48 CB PHE A 6 14.732 -0.616 2.059 1.00 5.36 C +ATOM 49 O PHE A 6 13.859 -0.388 5.282 1.00 5.36 O +ATOM 50 CG PHE A 6 13.331 -1.164 2.014 1.00 5.36 C +ATOM 51 CD1 PHE A 6 12.278 -0.379 1.561 1.00 5.36 C +ATOM 52 CD2 PHE A 6 13.068 -2.464 2.424 1.00 5.36 C +ATOM 53 CE1 PHE A 6 10.980 -0.884 1.518 1.00 5.36 C +ATOM 54 CE2 PHE A 6 11.774 -2.975 2.384 1.00 5.36 C +ATOM 55 CZ PHE A 6 10.731 -2.183 1.932 1.00 5.36 C +ATOM 56 N ILE A 7 15.772 -1.382 4.937 1.00 6.08 N +ATOM 57 CA ILE A 7 15.726 -2.220 6.131 1.00 6.08 C +ATOM 58 C ILE A 7 15.811 -1.345 7.379 1.00 6.08 C +ATOM 59 CB ILE A 7 16.864 -3.266 6.130 1.00 6.08 C +ATOM 60 O ILE A 7 15.052 -1.538 8.332 1.00 6.08 O +ATOM 61 CG1 ILE A 7 16.652 -4.286 5.006 1.00 6.08 C +ATOM 62 CG2 ILE A 7 16.957 -3.962 7.491 1.00 6.08 C +ATOM 63 CD1 ILE A 7 17.837 -5.214 4.781 1.00 6.08 C +ATOM 64 N LYS A 8 16.750 -0.406 7.403 1.00 6.08 N +ATOM 65 CA LYS A 8 16.953 0.493 8.535 1.00 6.08 C +ATOM 66 C LYS A 8 15.689 1.294 8.836 1.00 6.08 C +ATOM 67 CB LYS A 8 18.122 1.442 8.265 1.00 6.08 C +ATOM 68 O LYS A 8 15.304 1.443 9.997 1.00 6.08 O +ATOM 69 CG LYS A 8 18.564 2.242 9.481 1.00 6.08 C +ATOM 70 CD LYS A 8 19.735 3.159 9.151 1.00 6.08 C +ATOM 71 CE LYS A 8 20.102 4.046 10.333 1.00 6.08 C +ATOM 72 NZ LYS A 8 21.192 5.007 9.987 1.00 6.08 N +ATOM 73 N ASN A 9 14.988 1.804 7.750 1.00 6.08 N +ATOM 74 CA ASN A 9 13.799 2.629 7.937 1.00 6.08 C +ATOM 75 C ASN A 9 12.593 1.788 8.349 1.00 6.08 C +ATOM 76 CB ASN A 9 13.486 3.416 6.663 1.00 6.08 C +ATOM 77 O ASN A 9 11.581 2.327 8.801 1.00 6.08 O +ATOM 78 CG ASN A 9 14.404 4.608 6.473 1.00 6.08 C +ATOM 79 ND2 ASN A 9 14.484 5.105 5.244 1.00 6.08 N +ATOM 80 OD1 ASN A 9 15.036 5.078 7.423 1.00 6.08 O +ATOM 81 N ASN A 10 12.800 0.438 8.337 1.00 6.08 N +ATOM 82 CA ASN A 10 11.572 -0.311 8.581 1.00 6.08 C +ATOM 83 C ASN A 10 11.753 -1.335 9.699 1.00 6.08 C +ATOM 84 CB ASN A 10 11.100 -1.002 7.300 1.00 6.08 C +ATOM 85 O ASN A 10 10.808 -2.039 10.060 1.00 6.08 O +ATOM 86 CG ASN A 10 10.549 -0.025 6.280 1.00 6.08 C +ATOM 87 ND2 ASN A 10 11.285 0.176 5.193 1.00 6.08 N +ATOM 88 OD1 ASN A 10 9.471 0.545 6.467 1.00 6.08 O +ATOM 89 N SER A 11 12.959 -1.512 10.211 1.00 6.08 N +ATOM 90 CA SER A 11 13.197 -2.465 11.291 1.00 6.08 C +ATOM 91 C SER A 11 12.666 -1.938 12.620 1.00 6.08 C +ATOM 92 CB SER A 11 14.690 -2.772 11.415 1.00 6.08 C +ATOM 93 O SER A 11 12.451 -2.709 13.557 1.00 6.08 O +ATOM 94 OG SER A 11 15.435 -1.581 11.601 1.00 6.08 O +ATOM 95 N ASP A 12 12.220 -0.675 12.710 1.00 6.08 N +ATOM 96 CA ASP A 12 11.747 -0.267 14.029 1.00 6.08 C +ATOM 97 C ASP A 12 10.304 -0.711 14.256 1.00 6.08 C +ATOM 98 CB ASP A 12 11.864 1.249 14.196 1.00 6.08 C +ATOM 99 O ASP A 12 9.847 -0.792 15.398 1.00 6.08 O +ATOM 100 CG ASP A 12 13.206 1.682 14.760 1.00 6.08 C +ATOM 101 OD1 ASP A 12 13.586 2.861 14.592 1.00 6.08 O +ATOM 102 OD2 ASP A 12 13.890 0.837 15.376 1.00 6.08 O +ATOM 103 N SER A 13 9.678 -1.277 13.274 1.00 6.08 N +ATOM 104 CA SER A 13 8.274 -1.520 13.587 1.00 6.08 C +ATOM 105 C SER A 13 8.041 -2.973 13.988 1.00 6.08 C +ATOM 106 CB SER A 13 7.389 -1.164 12.393 1.00 6.08 C +ATOM 107 O SER A 13 8.569 -3.889 13.355 1.00 6.08 O +ATOM 108 OG SER A 13 7.871 -1.776 11.209 1.00 6.08 O +ATOM 109 N ASN A 14 8.368 -3.385 15.178 1.00 6.08 N +ATOM 110 CA ASN A 14 7.591 -4.466 15.775 1.00 6.08 C +ATOM 111 C ASN A 14 6.843 -5.271 14.716 1.00 6.08 C +ATOM 112 CB ASN A 14 6.610 -3.912 16.812 1.00 6.08 C +ATOM 113 O ASN A 14 6.016 -6.122 15.047 1.00 6.08 O +ATOM 114 CG ASN A 14 7.250 -3.709 18.171 1.00 6.08 C +ATOM 115 ND2 ASN A 14 6.608 -2.910 19.015 1.00 6.08 N +ATOM 116 OD1 ASN A 14 8.313 -4.265 18.460 1.00 6.08 O +ATOM 117 N ILE A 15 7.204 -5.229 13.474 1.00 6.08 N +ATOM 118 CA ILE A 15 6.430 -5.995 12.502 1.00 6.08 C +ATOM 119 C ILE A 15 7.095 -7.349 12.265 1.00 6.08 C +ATOM 120 CB ILE A 15 6.282 -5.229 11.168 1.00 6.08 C +ATOM 121 O ILE A 15 8.306 -7.422 12.045 1.00 6.08 O +ATOM 122 CG1 ILE A 15 5.583 -3.885 11.398 1.00 6.08 C +ATOM 123 CG2 ILE A 15 5.520 -6.074 10.143 1.00 6.08 C +ATOM 124 CD1 ILE A 15 5.473 -3.022 10.149 1.00 6.08 C +ATOM 125 N LEU A 16 6.669 -8.397 13.068 1.00 6.08 N +ATOM 126 CA LEU A 16 6.808 -9.846 12.972 1.00 6.08 C +ATOM 127 C LEU A 16 6.967 -10.281 11.519 1.00 6.08 C +ATOM 128 CB LEU A 16 5.597 -10.544 13.596 1.00 6.08 C +ATOM 129 O LEU A 16 6.238 -9.812 10.643 1.00 6.08 O +ATOM 130 CG LEU A 16 5.559 -10.598 15.125 1.00 6.08 C +ATOM 131 CD1 LEU A 16 4.134 -10.839 15.611 1.00 6.08 C +ATOM 132 CD2 LEU A 16 6.498 -11.682 15.644 1.00 6.08 C +ATOM 133 N ALA A 17 8.248 -10.386 11.036 1.00 6.08 N +ATOM 134 CA ALA A 17 8.700 -10.996 9.788 1.00 6.08 C +ATOM 135 C ALA A 17 7.863 -12.224 9.444 1.00 6.08 C +ATOM 136 CB ALA A 17 10.177 -11.372 9.884 1.00 6.08 C +ATOM 137 O ALA A 17 7.473 -12.986 10.332 1.00 6.08 O +ATOM 138 N PRO A 18 7.023 -12.218 8.206 1.00 6.08 N +ATOM 139 CA PRO A 18 6.298 -13.437 7.841 1.00 6.08 C +ATOM 140 C PRO A 18 7.204 -14.499 7.222 1.00 6.08 C +ATOM 141 CB PRO A 18 5.264 -12.942 6.826 1.00 6.08 C +ATOM 142 O PRO A 18 8.307 -14.186 6.767 1.00 6.08 O +ATOM 143 CG PRO A 18 5.663 -11.532 6.531 1.00 6.08 C +ATOM 144 CD PRO A 18 6.762 -11.140 7.476 1.00 6.08 C +ATOM 145 N LYS A 19 6.910 -15.813 7.261 1.00 6.08 N +ATOM 146 CA LYS A 19 7.401 -17.032 6.627 1.00 6.08 C +ATOM 147 C LYS A 19 6.700 -17.279 5.294 1.00 6.08 C +ATOM 148 CB LYS A 19 7.206 -18.235 7.552 1.00 6.08 C +ATOM 149 O LYS A 19 5.494 -17.054 5.170 1.00 6.08 O +ATOM 150 CG LYS A 19 8.289 -18.383 8.610 1.00 6.08 C +ATOM 151 CD LYS A 19 8.149 -19.695 9.372 1.00 6.08 C +ATOM 152 CE LYS A 19 9.213 -19.830 10.454 1.00 6.08 C +ATOM 153 NZ LYS A 19 9.104 -21.132 11.178 1.00 6.08 N +ATOM 154 N VAL A 20 7.272 -17.218 4.055 1.00 6.08 N +ATOM 155 CA VAL A 20 6.741 -17.404 2.708 1.00 6.08 C +ATOM 156 C VAL A 20 7.061 -18.814 2.217 1.00 6.08 C +ATOM 157 CB VAL A 20 7.307 -16.355 1.725 1.00 6.08 C +ATOM 158 O VAL A 20 8.148 -19.336 2.476 1.00 6.08 O +ATOM 159 CG1 VAL A 20 6.686 -16.524 0.339 1.00 6.08 C +ATOM 160 CG2 VAL A 20 7.064 -14.943 2.254 1.00 6.08 C +ATOM 161 N SER A 21 6.082 -19.480 1.504 1.00 6.08 N +ATOM 162 CA SER A 21 6.281 -20.787 0.888 1.00 6.08 C +ATOM 163 C SER A 21 7.315 -20.720 -0.230 1.00 6.08 C +ATOM 164 CB SER A 21 4.960 -21.329 0.340 1.00 6.08 C +ATOM 165 O SER A 21 7.458 -19.688 -0.889 1.00 6.08 O +ATOM 166 OG SER A 21 4.811 -20.999 -1.030 1.00 6.08 O +ATOM 167 N GLN A 22 8.094 -21.778 -0.457 1.00 6.08 N +ATOM 168 CA GLN A 22 9.146 -22.023 -1.437 1.00 6.08 C +ATOM 169 C GLN A 22 8.608 -21.912 -2.861 1.00 6.08 C +ATOM 170 CB GLN A 22 9.774 -23.400 -1.218 1.00 6.08 C +ATOM 171 O GLN A 22 9.307 -21.436 -3.758 1.00 6.08 O +ATOM 172 CG GLN A 22 11.028 -23.375 -0.356 1.00 6.08 C +ATOM 173 CD GLN A 22 11.900 -24.601 -0.550 1.00 6.08 C +ATOM 174 NE2 GLN A 22 13.017 -24.654 0.167 1.00 6.08 N +ATOM 175 OE1 GLN A 22 11.570 -25.495 -1.337 1.00 6.08 O +ATOM 176 N SER A 23 7.326 -22.350 -3.087 1.00 6.08 N +ATOM 177 CA SER A 23 6.818 -22.344 -4.455 1.00 6.08 C +ATOM 178 C SER A 23 6.627 -20.921 -4.968 1.00 6.08 C +ATOM 179 CB SER A 23 5.494 -23.106 -4.539 1.00 6.08 C +ATOM 180 O SER A 23 6.916 -20.631 -6.131 1.00 6.08 O +ATOM 181 OG SER A 23 4.496 -22.467 -3.762 1.00 6.08 O +ATOM 182 N VAL A 24 6.156 -19.987 -4.125 1.00 6.08 N +ATOM 183 CA VAL A 24 5.987 -18.582 -4.483 1.00 6.08 C +ATOM 184 C VAL A 24 7.353 -17.938 -4.708 1.00 6.08 C +ATOM 185 CB VAL A 24 5.206 -17.809 -3.397 1.00 6.08 C +ATOM 186 O VAL A 24 7.534 -17.165 -5.652 1.00 6.08 O +ATOM 187 CG1 VAL A 24 5.211 -16.310 -3.691 1.00 6.08 C +ATOM 188 CG2 VAL A 24 3.775 -18.332 -3.296 1.00 6.08 C +ATOM 189 N ILE A 25 8.365 -18.356 -3.827 1.00 6.08 N +ATOM 190 CA ILE A 25 9.724 -17.836 -3.937 1.00 6.08 C +ATOM 191 C ILE A 25 10.325 -18.244 -5.280 1.00 6.08 C +ATOM 192 CB ILE A 25 10.616 -18.332 -2.777 1.00 6.08 C +ATOM 193 O ILE A 25 11.011 -17.450 -5.928 1.00 6.08 O +ATOM 194 CG1 ILE A 25 10.127 -17.755 -1.444 1.00 6.08 C +ATOM 195 CG2 ILE A 25 12.081 -17.966 -3.028 1.00 6.08 C +ATOM 196 CD1 ILE A 25 10.848 -18.316 -0.226 1.00 6.08 C +ATOM 197 N LYS A 26 9.942 -19.394 -5.728 1.00 6.08 N +ATOM 198 CA LYS A 26 10.533 -19.885 -6.969 1.00 6.08 C +ATOM 199 C LYS A 26 9.961 -19.150 -8.178 1.00 6.08 C +ATOM 200 CB LYS A 26 10.303 -21.391 -7.115 1.00 6.08 C +ATOM 201 O LYS A 26 10.615 -19.055 -9.219 1.00 6.08 O +ATOM 202 CG LYS A 26 11.247 -22.244 -6.281 1.00 6.08 C +ATOM 203 CD LYS A 26 11.022 -23.730 -6.527 1.00 6.08 C +ATOM 204 CE LYS A 26 11.909 -24.587 -5.634 1.00 6.08 C +ATOM 205 NZ LYS A 26 11.672 -26.045 -5.852 1.00 6.08 N +ATOM 206 N SER A 27 8.716 -18.585 -8.016 1.00 6.08 N +ATOM 207 CA SER A 27 8.115 -17.884 -9.146 1.00 6.08 C +ATOM 208 C SER A 27 8.597 -16.439 -9.220 1.00 6.08 C +ATOM 209 CB SER A 27 6.589 -17.917 -9.047 1.00 6.08 C +ATOM 210 O SER A 27 8.389 -15.761 -10.229 1.00 6.08 O +ATOM 211 OG SER A 27 6.145 -17.239 -7.885 1.00 6.08 O +ATOM 212 N ILE A 28 9.326 -16.021 -8.127 1.00 6.08 N +ATOM 213 CA ILE A 28 9.655 -14.600 -8.095 1.00 6.08 C +ATOM 214 C ILE A 28 11.013 -14.370 -8.753 1.00 6.08 C +ATOM 215 CB ILE A 28 9.660 -14.055 -6.649 1.00 6.08 C +ATOM 216 O ILE A 28 12.005 -15.000 -8.381 1.00 6.08 O +ATOM 217 CG1 ILE A 28 8.282 -14.238 -6.004 1.00 6.08 C +ATOM 218 CG2 ILE A 28 10.082 -12.583 -6.629 1.00 6.08 C +ATOM 219 CD1 ILE A 28 8.241 -13.892 -4.522 1.00 6.08 C +ATOM 220 N LYS A 29 11.102 -13.748 -9.982 1.00 6.08 N +ATOM 221 CA LYS A 29 12.253 -13.354 -10.790 1.00 6.08 C +ATOM 222 C LYS A 29 12.954 -12.137 -10.192 1.00 6.08 C +ATOM 223 CB LYS A 29 11.825 -13.058 -12.228 1.00 6.08 C +ATOM 224 O LYS A 29 12.302 -11.156 -9.829 1.00 6.08 O +ATOM 225 CG LYS A 29 11.657 -14.299 -13.092 1.00 6.08 C +ATOM 226 CD LYS A 29 11.456 -13.937 -14.557 1.00 6.08 C +ATOM 227 CE LYS A 29 11.272 -15.178 -15.421 1.00 6.08 C +ATOM 228 NZ LYS A 29 11.145 -14.832 -16.868 1.00 6.08 N +ATOM 229 N GLY A 30 13.888 -12.322 -9.217 1.00 6.08 N +ATOM 230 CA GLY A 30 14.719 -11.185 -8.854 1.00 6.08 C +ATOM 231 C GLY A 30 14.960 -11.074 -7.361 1.00 6.08 C +ATOM 232 O GLY A 30 14.940 -9.975 -6.804 1.00 6.08 O +ATOM 233 N ILE A 31 15.279 -12.138 -6.638 1.00 6.08 N +ATOM 234 CA ILE A 31 15.591 -12.164 -5.214 1.00 6.08 C +ATOM 235 C ILE A 31 16.885 -11.396 -4.954 1.00 6.08 C +ATOM 236 CB ILE A 31 15.713 -13.612 -4.689 1.00 6.08 C +ATOM 237 O ILE A 31 17.945 -11.761 -5.468 1.00 6.08 O +ATOM 238 CG1 ILE A 31 14.396 -14.369 -4.897 1.00 6.08 C +ATOM 239 CG2 ILE A 31 16.121 -13.619 -3.212 1.00 6.08 C +ATOM 240 CD1 ILE A 31 14.475 -15.853 -4.565 1.00 6.08 C +ATOM 241 N LYS A 32 16.933 -10.089 -4.574 1.00 6.08 N +ATOM 242 CA LYS A 32 18.183 -9.378 -4.323 1.00 6.08 C +ATOM 243 C LYS A 32 18.755 -9.738 -2.954 1.00 6.08 C +ATOM 244 CB LYS A 32 17.970 -7.867 -4.420 1.00 6.08 C +ATOM 245 O LYS A 32 19.969 -9.892 -2.804 1.00 6.08 O +ATOM 246 CG LYS A 32 18.023 -7.324 -5.841 1.00 6.08 C +ATOM 247 CD LYS A 32 18.626 -5.926 -5.883 1.00 6.08 C +ATOM 248 CE LYS A 32 18.645 -5.367 -7.300 1.00 6.08 C +ATOM 249 NZ LYS A 32 19.320 -4.036 -7.361 1.00 6.08 N +ATOM 250 N SER A 33 17.909 -10.205 -1.893 1.00 6.08 N +ATOM 251 CA SER A 33 18.320 -10.572 -0.542 1.00 6.08 C +ATOM 252 C SER A 33 17.215 -11.331 0.185 1.00 6.08 C +ATOM 253 CB SER A 33 18.707 -9.328 0.258 1.00 6.08 C +ATOM 254 O SER A 33 16.099 -11.450 -0.324 1.00 6.08 O +ATOM 255 OG SER A 33 17.560 -8.560 0.581 1.00 6.08 O +ATOM 256 N LYS A 34 17.506 -12.068 1.188 1.00 6.08 N +ATOM 257 CA LYS A 34 16.610 -12.918 1.967 1.00 6.08 C +ATOM 258 C LYS A 34 15.403 -12.131 2.468 1.00 6.08 C +ATOM 259 CB LYS A 34 17.356 -13.542 3.148 1.00 6.08 C +ATOM 260 O LYS A 34 14.341 -12.706 2.718 1.00 6.08 O +ATOM 261 CG LYS A 34 18.074 -14.840 2.810 1.00 6.08 C +ATOM 262 CD LYS A 34 18.733 -15.451 4.040 1.00 6.08 C +ATOM 263 CE LYS A 34 19.519 -16.707 3.689 1.00 6.08 C +ATOM 264 NZ LYS A 34 20.155 -17.318 4.894 1.00 6.08 N +ATOM 265 N HIS A 35 15.371 -10.863 2.266 1.00 5.36 N +ATOM 266 CA HIS A 35 14.261 -10.259 2.994 1.00 5.36 C +ATOM 267 C HIS A 35 13.500 -9.270 2.117 1.00 5.36 C +ATOM 268 CB HIS A 35 14.765 -9.560 4.258 1.00 5.36 C +ATOM 269 O HIS A 35 12.451 -8.760 2.515 1.00 5.36 O +ATOM 270 CG HIS A 35 15.436 -10.482 5.225 1.00 5.36 C +ATOM 271 CD2 HIS A 35 16.730 -10.574 5.614 1.00 5.36 C +ATOM 272 ND1 HIS A 35 14.755 -11.461 5.916 1.00 5.36 N +ATOM 273 CE1 HIS A 35 15.604 -12.116 6.691 1.00 5.36 C +ATOM 274 NE2 HIS A 35 16.808 -11.597 6.526 1.00 5.36 N +ATOM 275 N VAL A 36 14.059 -8.954 0.978 1.00 5.36 N +ATOM 276 CA VAL A 36 13.407 -7.973 0.118 1.00 5.36 C +ATOM 277 C VAL A 36 13.086 -8.603 -1.235 1.00 5.36 C +ATOM 278 CB VAL A 36 14.284 -6.715 -0.074 1.00 5.36 C +ATOM 279 O VAL A 36 13.962 -9.187 -1.878 1.00 5.36 O +ATOM 280 CG1 VAL A 36 13.591 -5.709 -0.992 1.00 5.36 C +ATOM 281 CG2 VAL A 36 14.605 -6.078 1.277 1.00 5.36 C +ATOM 282 N PHE A 37 11.770 -8.603 -1.484 1.00 5.36 N +ATOM 283 CA PHE A 37 11.361 -9.204 -2.749 1.00 5.36 C +ATOM 284 C PHE A 37 10.980 -8.129 -3.760 1.00 5.36 C +ATOM 285 CB PHE A 37 10.186 -10.163 -2.535 1.00 5.36 C +ATOM 286 O PHE A 37 10.245 -7.195 -3.434 1.00 5.36 O +ATOM 287 CG PHE A 37 10.500 -11.311 -1.614 1.00 5.36 C +ATOM 288 CD1 PHE A 37 10.346 -11.180 -0.239 1.00 5.36 C +ATOM 289 CD2 PHE A 37 10.949 -12.522 -2.124 1.00 5.36 C +ATOM 290 CE1 PHE A 37 10.636 -12.242 0.616 1.00 5.36 C +ATOM 291 CE2 PHE A 37 11.241 -13.587 -1.276 1.00 5.36 C +ATOM 292 CZ PHE A 37 11.084 -13.445 0.093 1.00 5.36 C +ATOM 293 N GLU A 38 11.560 -8.160 -4.884 1.00 5.36 N +ATOM 294 CA GLU A 38 11.250 -7.279 -6.006 1.00 5.36 C +ATOM 295 C GLU A 38 10.193 -7.897 -6.917 1.00 5.36 C +ATOM 296 CB GLU A 38 12.516 -6.965 -6.808 1.00 5.36 C +ATOM 297 O GLU A 38 10.363 -9.016 -7.405 1.00 5.36 O +ATOM 298 CG GLU A 38 12.298 -5.965 -7.934 1.00 5.36 C +ATOM 299 CD GLU A 38 13.552 -5.698 -8.751 1.00 5.36 C +ATOM 300 OE1 GLU A 38 13.571 -6.025 -9.960 1.00 5.36 O +ATOM 301 OE2 GLU A 38 14.525 -5.158 -8.178 1.00 5.36 O +ATOM 302 N LEU A 39 9.040 -7.269 -6.940 1.00 5.36 N +ATOM 303 CA LEU A 39 7.988 -7.741 -7.834 1.00 5.36 C +ATOM 304 C LEU A 39 7.842 -6.816 -9.038 1.00 5.36 C +ATOM 305 CB LEU A 39 6.655 -7.839 -7.087 1.00 5.36 C +ATOM 306 O LEU A 39 7.250 -5.740 -8.931 1.00 5.36 O +ATOM 307 CG LEU A 39 6.571 -8.896 -5.984 1.00 5.36 C +ATOM 308 CD1 LEU A 39 5.425 -8.577 -5.030 1.00 5.36 C +ATOM 309 CD2 LEU A 39 6.401 -10.286 -6.587 1.00 5.36 C +ATOM 310 N PRO A 40 8.487 -7.251 -10.143 1.00 6.08 N +ATOM 311 CA PRO A 40 8.346 -6.359 -11.296 1.00 6.08 C +ATOM 312 C PRO A 40 6.896 -6.208 -11.751 1.00 6.08 C +ATOM 313 CB PRO A 40 9.189 -7.043 -12.376 1.00 6.08 C +ATOM 314 O PRO A 40 6.198 -7.207 -11.942 1.00 6.08 O +ATOM 315 CG PRO A 40 9.550 -8.371 -11.794 1.00 6.08 C +ATOM 316 CD PRO A 40 9.068 -8.416 -10.373 1.00 6.08 C +ATOM 317 N ILE A 41 6.243 -4.982 -11.734 1.00 6.08 N +ATOM 318 CA ILE A 41 4.884 -4.747 -12.210 1.00 6.08 C +ATOM 319 C ILE A 41 4.900 -4.508 -13.718 1.00 6.08 C +ATOM 320 CB ILE A 41 4.229 -3.551 -11.484 1.00 6.08 C +ATOM 321 O ILE A 41 4.158 -5.153 -14.463 1.00 6.08 O +ATOM 322 CG1 ILE A 41 4.176 -3.807 -9.974 1.00 6.08 C +ATOM 323 CG2 ILE A 41 2.829 -3.280 -12.044 1.00 6.08 C +ATOM 324 CD1 ILE A 41 3.647 -2.630 -9.165 1.00 6.08 C +ATOM 325 N ASN A 42 5.810 -3.703 -14.250 1.00 6.08 N +ATOM 326 CA ASN A 42 6.141 -3.456 -15.649 1.00 6.08 C +ATOM 327 C ASN A 42 7.598 -3.034 -15.814 1.00 6.08 C +ATOM 328 CB ASN A 42 5.210 -2.396 -16.242 1.00 6.08 C +ATOM 329 O ASN A 42 8.396 -3.167 -14.885 1.00 6.08 O +ATOM 330 CG ASN A 42 5.303 -1.067 -15.518 1.00 6.08 C +ATOM 331 ND2 ASN A 42 4.156 -0.448 -15.267 1.00 6.08 N +ATOM 332 OD1 ASN A 42 6.397 -0.600 -15.189 1.00 6.08 O +ATOM 333 N ASP A 43 7.989 -2.622 -17.089 1.00 6.08 N +ATOM 334 CA ASP A 43 9.387 -2.328 -17.387 1.00 6.08 C +ATOM 335 C ASP A 43 9.898 -1.169 -16.534 1.00 6.08 C +ATOM 336 CB ASP A 43 9.563 -2.005 -18.873 1.00 6.08 C +ATOM 337 O ASP A 43 11.101 -1.051 -16.294 1.00 6.08 O +ATOM 338 CG ASP A 43 9.350 -3.211 -19.771 1.00 6.08 C +ATOM 339 OD1 ASP A 43 9.124 -3.033 -20.987 1.00 6.08 O +ATOM 340 OD2 ASP A 43 9.406 -4.349 -19.257 1.00 6.08 O +ATOM 341 N LYS A 44 8.964 -0.340 -16.036 1.00 6.08 N +ATOM 342 CA LYS A 44 9.421 0.879 -15.374 1.00 6.08 C +ATOM 343 C LYS A 44 9.078 0.858 -13.887 1.00 6.08 C +ATOM 344 CB LYS A 44 8.806 2.113 -16.036 1.00 6.08 C +ATOM 345 O LYS A 44 9.523 1.723 -13.130 1.00 6.08 O +ATOM 346 CG LYS A 44 9.329 2.388 -17.438 1.00 6.08 C +ATOM 347 CD LYS A 44 8.792 3.704 -17.986 1.00 6.08 C +ATOM 348 CE LYS A 44 9.281 3.960 -19.405 1.00 6.08 C +ATOM 349 NZ LYS A 44 8.775 5.260 -19.939 1.00 6.08 N +ATOM 350 N THR A 45 8.261 -0.019 -13.522 1.00 6.08 N +ATOM 351 CA THR A 45 7.740 0.030 -12.161 1.00 6.08 C +ATOM 352 C THR A 45 8.037 -1.272 -11.421 1.00 6.08 C +ATOM 353 CB THR A 45 6.223 0.293 -12.152 1.00 6.08 C +ATOM 354 O THR A 45 7.755 -2.359 -11.929 1.00 6.08 O +ATOM 355 CG2 THR A 45 5.716 0.544 -10.736 1.00 6.08 C +ATOM 356 OG1 THR A 45 5.938 1.442 -12.960 1.00 6.08 O +ATOM 357 N LYS A 46 8.731 -1.136 -10.322 1.00 5.36 N +ATOM 358 CA LYS A 46 9.040 -2.324 -9.532 1.00 5.36 C +ATOM 359 C LYS A 46 8.519 -2.186 -8.104 1.00 5.36 C +ATOM 360 CB LYS A 46 10.548 -2.581 -9.517 1.00 5.36 C +ATOM 361 O LYS A 46 8.374 -1.073 -7.595 1.00 5.36 O +ATOM 362 CG LYS A 46 11.163 -2.738 -10.899 1.00 5.36 C +ATOM 363 CD LYS A 46 12.677 -2.883 -10.824 1.00 5.36 C +ATOM 364 CE LYS A 46 13.302 -2.960 -12.211 1.00 5.36 C +ATOM 365 NZ LYS A 46 14.790 -2.843 -12.156 1.00 5.36 N +ATOM 366 N ARG A 47 8.105 -3.267 -7.558 1.00 5.36 N +ATOM 367 CA ARG A 47 7.620 -3.302 -6.182 1.00 5.36 C +ATOM 368 C ARG A 47 8.642 -3.956 -5.258 1.00 5.36 C +ATOM 369 CB ARG A 47 6.286 -4.047 -6.100 1.00 5.36 C +ATOM 370 O ARG A 47 9.291 -4.934 -5.635 1.00 5.36 O +ATOM 371 CG ARG A 47 5.588 -3.915 -4.756 1.00 5.36 C +ATOM 372 CD ARG A 47 4.227 -4.596 -4.758 1.00 5.36 C +ATOM 373 NE ARG A 47 3.162 -3.674 -4.374 1.00 5.36 N +ATOM 374 NH1 ARG A 47 1.449 -5.188 -4.705 1.00 5.36 N +ATOM 375 NH2 ARG A 47 0.983 -3.060 -3.991 1.00 5.36 N +ATOM 376 CZ ARG A 47 1.867 -3.976 -4.358 1.00 5.36 C +ATOM 377 N TYR A 48 8.748 -3.477 -3.978 1.00 5.36 N +ATOM 378 CA TYR A 48 9.593 -4.175 -3.016 1.00 5.36 C +ATOM 379 C TYR A 48 8.779 -4.649 -1.818 1.00 5.36 C +ATOM 380 CB TYR A 48 10.734 -3.268 -2.546 1.00 5.36 C +ATOM 381 O TYR A 48 7.943 -3.908 -1.295 1.00 5.36 O +ATOM 382 CG TYR A 48 11.694 -2.881 -3.645 1.00 5.36 C +ATOM 383 CD1 TYR A 48 11.441 -1.781 -4.462 1.00 5.36 C +ATOM 384 CD2 TYR A 48 12.854 -3.613 -3.869 1.00 5.36 C +ATOM 385 CE1 TYR A 48 12.321 -1.421 -5.477 1.00 5.36 C +ATOM 386 CE2 TYR A 48 13.742 -3.263 -4.881 1.00 5.36 C +ATOM 387 OH TYR A 48 14.342 -1.815 -6.682 1.00 5.36 O +ATOM 388 CZ TYR A 48 13.467 -2.167 -5.678 1.00 5.36 C +ATOM 389 N ILE A 49 8.717 -5.888 -1.613 1.00 5.36 N +ATOM 390 CA ILE A 49 7.989 -6.430 -0.471 1.00 5.36 C +ATOM 391 C ILE A 49 8.975 -6.856 0.614 1.00 5.36 C +ATOM 392 CB ILE A 49 7.097 -7.622 -0.882 1.00 5.36 C +ATOM 393 O ILE A 49 10.017 -7.445 0.318 1.00 5.36 O +ATOM 394 CG1 ILE A 49 6.166 -7.220 -2.032 1.00 5.36 C +ATOM 395 CG2 ILE A 49 6.296 -8.136 0.317 1.00 5.36 C +ATOM 396 CD1 ILE A 49 5.367 -8.378 -2.615 1.00 5.36 C +ATOM 397 N LEU A 50 8.862 -6.262 1.857 1.00 5.36 N +ATOM 398 CA LEU A 50 9.614 -6.778 2.996 1.00 5.36 C +ATOM 399 C LEU A 50 8.946 -8.023 3.570 1.00 5.36 C +ATOM 400 CB LEU A 50 9.742 -5.707 4.083 1.00 5.36 C +ATOM 401 O LEU A 50 7.743 -8.018 3.842 1.00 5.36 O +ATOM 402 CG LEU A 50 11.100 -5.606 4.779 1.00 5.36 C +ATOM 403 CD1 LEU A 50 11.885 -4.416 4.238 1.00 5.36 C +ATOM 404 CD2 LEU A 50 10.920 -5.493 6.289 1.00 5.36 C +ATOM 405 N GLY A 51 9.463 -9.224 3.543 1.00 5.36 N +ATOM 406 CA GLY A 51 9.015 -10.310 4.400 1.00 5.36 C +ATOM 407 C GLY A 51 7.865 -11.102 3.807 1.00 5.36 C +ATOM 408 O GLY A 51 6.957 -10.529 3.200 1.00 5.36 O +ATOM 409 N ALA A 52 8.049 -12.344 3.364 1.00 5.36 N +ATOM 410 CA ALA A 52 6.949 -13.257 3.063 1.00 5.36 C +ATOM 411 C ALA A 52 6.954 -14.454 4.009 1.00 5.36 C +ATOM 412 CB ALA A 52 7.031 -13.728 1.613 1.00 5.36 C +ATOM 413 O ALA A 52 8.016 -14.901 4.449 1.00 5.36 O +ATOM 414 N THR A 53 5.741 -14.626 4.821 1.00 6.08 N +ATOM 415 CA THR A 53 5.638 -15.818 5.655 1.00 6.08 C +ATOM 416 C THR A 53 4.816 -16.898 4.956 1.00 6.08 C +ATOM 417 CB THR A 53 5.005 -15.492 7.020 1.00 6.08 C +ATOM 418 O THR A 53 4.163 -16.631 3.944 1.00 6.08 O +ATOM 419 CG2 THR A 53 5.758 -14.364 7.719 1.00 6.08 C +ATOM 420 OG1 THR A 53 3.643 -15.093 6.826 1.00 6.08 O +ATOM 421 N GLU A 54 4.971 -18.204 5.377 1.00 6.08 N +ATOM 422 CA GLU A 54 4.419 -19.510 5.031 1.00 6.08 C +ATOM 423 C GLU A 54 2.894 -19.498 5.093 1.00 6.08 C +ATOM 424 CB GLU A 54 4.974 -20.593 5.960 1.00 6.08 C +ATOM 425 O GLU A 54 2.229 -20.148 4.283 1.00 6.08 O +ATOM 426 CG GLU A 54 6.145 -21.367 5.371 1.00 6.08 C +ATOM 427 CD GLU A 54 6.620 -22.505 6.261 1.00 6.08 C +ATOM 428 OE1 GLU A 54 7.586 -23.207 5.885 1.00 6.08 O +ATOM 429 OE2 GLU A 54 6.021 -22.696 7.343 1.00 6.08 O +ATOM 430 N THR A 55 2.284 -18.768 6.100 1.00 6.08 N +ATOM 431 CA THR A 55 0.931 -19.163 6.472 1.00 6.08 C +ATOM 432 C THR A 55 -0.065 -18.051 6.153 1.00 6.08 C +ATOM 433 CB THR A 55 0.844 -19.519 7.968 1.00 6.08 C +ATOM 434 O THR A 55 -1.275 -18.282 6.132 1.00 6.08 O +ATOM 435 CG2 THR A 55 1.686 -20.749 8.290 1.00 6.08 C +ATOM 436 OG1 THR A 55 1.318 -18.412 8.745 1.00 6.08 O +ATOM 437 N LYS A 56 0.188 -16.955 5.564 1.00 6.08 N +ATOM 438 CA LYS A 56 -0.870 -15.980 5.311 1.00 6.08 C +ATOM 439 C LYS A 56 -0.294 -14.671 4.777 1.00 6.08 C +ATOM 440 CB LYS A 56 -1.676 -15.719 6.584 1.00 6.08 C +ATOM 441 O LYS A 56 0.578 -14.069 5.406 1.00 6.08 O +ATOM 442 CG LYS A 56 -2.640 -16.838 6.947 1.00 6.08 C +ATOM 443 CD LYS A 56 -3.584 -16.421 8.067 1.00 6.08 C +ATOM 444 CE LYS A 56 -4.524 -17.554 8.458 1.00 6.08 C +ATOM 445 NZ LYS A 56 -5.505 -17.125 9.499 1.00 6.08 N +ATOM 446 N GLU A 57 -0.274 -14.530 3.508 1.00 6.08 N +ATOM 447 CA GLU A 57 -0.600 -13.449 2.582 1.00 6.08 C +ATOM 448 C GLU A 57 -0.543 -12.092 3.276 1.00 6.08 C +ATOM 449 CB GLU A 57 -1.984 -13.668 1.966 1.00 6.08 C +ATOM 450 O GLU A 57 -0.932 -11.075 2.696 1.00 6.08 O +ATOM 451 CG GLU A 57 -1.976 -14.563 0.735 1.00 6.08 C +ATOM 452 CD GLU A 57 -3.338 -14.683 0.071 1.00 6.08 C +ATOM 453 OE1 GLU A 57 -3.423 -15.253 -1.040 1.00 6.08 O +ATOM 454 OE2 GLU A 57 -4.328 -14.203 0.667 1.00 6.08 O +ATOM 455 N GLU A 58 0.126 -11.928 4.480 1.00 6.08 N +ATOM 456 CA GLU A 58 -0.009 -10.492 4.706 1.00 6.08 C +ATOM 457 C GLU A 58 1.168 -9.726 4.108 1.00 6.08 C +ATOM 458 CB GLU A 58 -0.125 -10.192 6.203 1.00 6.08 C +ATOM 459 O GLU A 58 2.323 -10.126 4.271 1.00 6.08 O +ATOM 460 CG GLU A 58 -1.553 -9.953 6.673 1.00 6.08 C +ATOM 461 CD GLU A 58 -1.648 -9.595 8.147 1.00 6.08 C +ATOM 462 OE1 GLU A 58 -2.761 -9.279 8.625 1.00 6.08 O +ATOM 463 OE2 GLU A 58 -0.600 -9.629 8.830 1.00 6.08 O +ATOM 464 N VAL A 59 0.923 -8.970 3.115 1.00 5.36 N +ATOM 465 CA VAL A 59 1.676 -8.056 2.262 1.00 5.36 C +ATOM 466 C VAL A 59 1.616 -6.644 2.838 1.00 5.36 C +ATOM 467 CB VAL A 59 1.141 -8.064 0.812 1.00 5.36 C +ATOM 468 O VAL A 59 0.550 -6.026 2.875 1.00 5.36 O +ATOM 469 CG1 VAL A 59 2.113 -7.351 -0.126 1.00 5.36 C +ATOM 470 CG2 VAL A 59 0.894 -9.496 0.342 1.00 5.36 C +ATOM 471 N LEU A 60 2.134 -6.382 4.062 1.00 5.36 N +ATOM 472 CA LEU A 60 2.206 -4.926 4.093 1.00 5.36 C +ATOM 473 C LEU A 60 3.467 -4.459 4.813 1.00 5.36 C +ATOM 474 CB LEU A 60 0.968 -4.342 4.778 1.00 5.36 C +ATOM 475 O LEU A 60 3.645 -4.732 6.002 1.00 5.36 O +ATOM 476 CG LEU A 60 -0.362 -4.523 4.044 1.00 5.36 C +ATOM 477 CD1 LEU A 60 -1.528 -4.217 4.977 1.00 5.36 C +ATOM 478 CD2 LEU A 60 -0.414 -3.635 2.805 1.00 5.36 C +ATOM 479 N PRO A 61 4.690 -3.899 4.294 1.00 5.36 N +ATOM 480 CA PRO A 61 4.413 -2.559 3.771 1.00 5.36 C +ATOM 481 C PRO A 61 4.305 -2.531 2.248 1.00 5.36 C +ATOM 482 CB PRO A 61 5.614 -1.739 4.248 1.00 5.36 C +ATOM 483 O PRO A 61 4.930 -3.348 1.566 1.00 5.36 O +ATOM 484 CG PRO A 61 6.588 -2.750 4.760 1.00 5.36 C +ATOM 485 CD PRO A 61 5.908 -4.089 4.803 1.00 5.36 C +ATOM 486 N ASN A 62 3.352 -1.777 1.774 1.00 4.42 N +ATOM 487 CA ASN A 62 2.773 -1.209 0.561 1.00 4.42 C +ATOM 488 C ASN A 62 3.673 -0.134 -0.041 1.00 4.42 C +ATOM 489 CB ASN A 62 1.382 -0.637 0.847 1.00 4.42 C +ATOM 490 O ASN A 62 3.461 1.058 0.186 1.00 4.42 O +ATOM 491 CG ASN A 62 0.321 -1.714 0.963 1.00 4.42 C +ATOM 492 ND2 ASN A 62 -0.756 -1.410 1.679 1.00 4.42 N +ATOM 493 OD1 ASN A 62 0.468 -2.809 0.415 1.00 4.42 O +ATOM 494 N TYR A 63 4.982 -0.411 -0.311 1.00 4.42 N +ATOM 495 CA TYR A 63 5.766 0.563 -1.062 1.00 4.42 C +ATOM 496 C TYR A 63 5.569 0.381 -2.563 1.00 4.42 C +ATOM 497 CB TYR A 63 7.252 0.442 -0.712 1.00 4.42 C +ATOM 498 O TYR A 63 5.291 -0.726 -3.029 1.00 4.42 O +ATOM 499 CG TYR A 63 7.556 0.705 0.743 1.00 4.42 C +ATOM 500 CD1 TYR A 63 7.564 -0.333 1.672 1.00 4.42 C +ATOM 501 CD2 TYR A 63 7.835 1.992 1.191 1.00 4.42 C +ATOM 502 CE1 TYR A 63 7.842 -0.094 3.014 1.00 4.42 C +ATOM 503 CE2 TYR A 63 8.114 2.242 2.531 1.00 4.42 C +ATOM 504 OH TYR A 63 8.392 1.435 4.760 1.00 4.42 O +ATOM 505 CZ TYR A 63 8.116 1.194 3.433 1.00 4.42 C +ATOM 506 N VAL A 64 5.361 1.479 -3.257 1.00 4.42 N +ATOM 507 CA VAL A 64 5.323 1.484 -4.716 1.00 4.42 C +ATOM 508 C VAL A 64 6.456 2.350 -5.260 1.00 4.42 C +ATOM 509 CB VAL A 64 3.963 1.991 -5.246 1.00 4.42 C +ATOM 510 O VAL A 64 6.668 3.472 -4.794 1.00 4.42 O +ATOM 511 CG1 VAL A 64 4.005 2.161 -6.764 1.00 4.42 C +ATOM 512 CG2 VAL A 64 2.843 1.034 -4.844 1.00 4.42 C +ATOM 513 N LYS A 65 7.501 1.678 -5.944 1.00 5.36 N +ATOM 514 CA LYS A 65 8.535 2.445 -6.634 1.00 5.36 C +ATOM 515 C LYS A 65 8.078 2.847 -8.033 1.00 5.36 C +ATOM 516 CB LYS A 65 9.834 1.643 -6.717 1.00 5.36 C +ATOM 517 O LYS A 65 7.631 2.004 -8.812 1.00 5.36 O +ATOM 518 CG LYS A 65 11.017 2.434 -7.256 1.00 5.36 C +ATOM 519 CD LYS A 65 12.295 1.605 -7.245 1.00 5.36 C +ATOM 520 CE LYS A 65 13.479 2.395 -7.786 1.00 5.36 C +ATOM 521 NZ LYS A 65 14.742 1.599 -7.745 1.00 5.36 N +ATOM 522 N VAL A 66 8.093 4.091 -8.333 1.00 5.36 N +ATOM 523 CA VAL A 66 7.778 4.641 -9.647 1.00 5.36 C +ATOM 524 C VAL A 66 9.008 5.340 -10.223 1.00 5.36 C +ATOM 525 CB VAL A 66 6.589 5.625 -9.580 1.00 5.36 C +ATOM 526 O VAL A 66 9.375 6.430 -9.779 1.00 5.36 O +ATOM 527 CG1 VAL A 66 6.222 6.125 -10.977 1.00 5.36 C +ATOM 528 CG2 VAL A 66 5.385 4.962 -8.914 1.00 5.36 C +ATOM 529 N GLY A 67 9.659 4.635 -11.193 1.00 5.36 N +ATOM 530 CA GLY A 67 10.950 5.142 -11.630 1.00 5.36 C +ATOM 531 C GLY A 67 12.012 5.081 -10.548 1.00 5.36 C +ATOM 532 O GLY A 67 12.305 4.007 -10.019 1.00 5.36 O +ATOM 533 N SER A 68 12.514 6.343 -10.271 1.00 5.36 N +ATOM 534 CA SER A 68 13.526 6.411 -9.222 1.00 5.36 C +ATOM 535 C SER A 68 12.902 6.759 -7.874 1.00 5.36 C +ATOM 536 CB SER A 68 14.598 7.442 -9.577 1.00 5.36 C +ATOM 537 O SER A 68 13.608 6.894 -6.873 1.00 5.36 O +ATOM 538 OG SER A 68 14.006 8.654 -10.011 1.00 5.36 O +ATOM 539 N ASP A 69 11.527 6.878 -7.937 1.00 5.36 N +ATOM 540 CA ASP A 69 10.872 7.348 -6.720 1.00 5.36 C +ATOM 541 C ASP A 69 10.208 6.193 -5.973 1.00 5.36 C +ATOM 542 CB ASP A 69 9.837 8.425 -7.049 1.00 5.36 C +ATOM 543 O ASP A 69 9.669 5.274 -6.594 1.00 5.36 O +ATOM 544 CG ASP A 69 10.453 9.672 -7.660 1.00 5.36 C +ATOM 545 OD1 ASP A 69 9.841 10.271 -8.571 1.00 5.36 O +ATOM 546 OD2 ASP A 69 11.561 10.057 -7.229 1.00 5.36 O +ATOM 547 N LEU A 70 10.310 6.167 -4.690 1.00 4.42 N +ATOM 548 CA LEU A 70 9.712 5.170 -3.810 1.00 4.42 C +ATOM 549 C LEU A 70 8.614 5.789 -2.952 1.00 4.42 C +ATOM 550 CB LEU A 70 10.780 4.537 -2.914 1.00 4.42 C +ATOM 551 O LEU A 70 8.810 6.853 -2.359 1.00 4.42 O +ATOM 552 CG LEU A 70 10.378 3.255 -2.182 1.00 4.42 C +ATOM 553 CD1 LEU A 70 10.240 2.102 -3.170 1.00 4.42 C +ATOM 554 CD2 LEU A 70 11.395 2.918 -1.097 1.00 4.42 C +ATOM 555 N TYR A 71 7.500 5.181 -2.953 1.00 4.42 N +ATOM 556 CA TYR A 71 6.370 5.703 -2.192 1.00 4.42 C +ATOM 557 C TYR A 71 5.940 4.719 -1.110 1.00 4.42 C +ATOM 558 CB TYR A 71 5.190 6.006 -3.121 1.00 4.42 C +ATOM 559 O TYR A 71 5.994 3.504 -1.311 1.00 4.42 O +ATOM 560 CG TYR A 71 5.502 7.031 -4.184 1.00 4.42 C +ATOM 561 CD1 TYR A 71 6.112 6.661 -5.380 1.00 4.42 C +ATOM 562 CD2 TYR A 71 5.190 8.373 -3.993 1.00 4.42 C +ATOM 563 CE1 TYR A 71 6.403 7.603 -6.361 1.00 4.42 C +ATOM 564 CE2 TYR A 71 5.476 9.324 -4.967 1.00 4.42 C +ATOM 565 OH TYR A 71 6.367 9.867 -7.114 1.00 4.42 O +ATOM 566 CZ TYR A 71 6.081 8.930 -6.146 1.00 4.42 C +ATOM 567 N ARG A 72 5.750 5.231 0.077 1.00 4.42 N +ATOM 568 CA ARG A 72 5.102 4.470 1.140 1.00 4.42 C +ATOM 569 C ARG A 72 3.588 4.648 1.097 1.00 4.42 C +ATOM 570 CB ARG A 72 5.641 4.892 2.509 1.00 4.42 C +ATOM 571 O ARG A 72 3.093 5.772 0.987 1.00 4.42 O +ATOM 572 CG ARG A 72 5.185 4.000 3.652 1.00 4.42 C +ATOM 573 CD ARG A 72 5.797 4.427 4.979 1.00 4.42 C +ATOM 574 NE ARG A 72 5.284 3.630 6.090 1.00 4.42 N +ATOM 575 NH1 ARG A 72 6.305 4.890 7.736 1.00 4.42 N +ATOM 576 NH2 ARG A 72 5.019 3.079 8.304 1.00 4.42 N +ATOM 577 CZ ARG A 72 5.538 3.868 7.374 1.00 4.42 C +ATOM 578 N LEU A 73 2.852 3.545 1.039 1.00 3.21 N +ATOM 579 CA LEU A 73 1.395 3.610 1.029 1.00 3.21 C +ATOM 580 C LEU A 73 0.833 3.435 2.436 1.00 3.21 C +ATOM 581 CB LEU A 73 0.816 2.541 0.099 1.00 3.21 C +ATOM 582 O LEU A 73 1.261 2.544 3.173 1.00 3.21 O +ATOM 583 CG LEU A 73 1.212 2.639 -1.375 1.00 3.21 C +ATOM 584 CD1 LEU A 73 1.030 1.291 -2.064 1.00 3.21 C +ATOM 585 CD2 LEU A 73 0.396 3.719 -2.078 1.00 3.21 C +ATOM 586 N LYS A 74 0.064 4.404 2.921 1.00 4.42 N +ATOM 587 CA LYS A 74 -0.627 4.299 4.203 1.00 4.42 C +ATOM 588 C LYS A 74 -2.140 4.374 4.020 1.00 4.42 C +ATOM 589 CB LYS A 74 -0.159 5.400 5.156 1.00 4.42 C +ATOM 590 O LYS A 74 -2.643 5.256 3.320 1.00 4.42 O +ATOM 591 CG LYS A 74 -0.498 5.139 6.617 1.00 4.42 C +ATOM 592 CD LYS A 74 0.083 6.214 7.526 1.00 4.42 C +ATOM 593 CE LYS A 74 -0.315 5.993 8.979 1.00 4.42 C +ATOM 594 NZ LYS A 74 0.270 7.033 9.878 1.00 4.42 N +ATOM 595 N ALA A 75 -2.781 3.329 4.523 1.00 4.42 N +ATOM 596 CA ALA A 75 -4.241 3.343 4.479 1.00 4.42 C +ATOM 597 C ALA A 75 -4.826 3.741 5.831 1.00 4.42 C +ATOM 598 CB ALA A 75 -4.774 1.977 4.053 1.00 4.42 C +ATOM 599 O ALA A 75 -4.275 3.396 6.879 1.00 4.42 O +ATOM 600 N TYR A 76 -5.770 4.597 5.772 1.00 5.36 N +ATOM 601 CA TYR A 76 -6.435 4.990 7.009 1.00 5.36 C +ATOM 602 C TYR A 76 -7.924 5.215 6.781 1.00 5.36 C +ATOM 603 CB TYR A 76 -5.797 6.259 7.583 1.00 5.36 C +ATOM 604 O TYR A 76 -8.375 5.314 5.637 1.00 5.36 O +ATOM 605 CG TYR A 76 -5.887 7.453 6.665 1.00 5.36 C +ATOM 606 CD1 TYR A 76 -6.916 8.382 6.798 1.00 5.36 C +ATOM 607 CD2 TYR A 76 -4.946 7.653 5.661 1.00 5.36 C +ATOM 608 CE1 TYR A 76 -7.005 9.483 5.952 1.00 5.36 C +ATOM 609 CE2 TYR A 76 -5.024 8.750 4.809 1.00 5.36 C +ATOM 610 OH TYR A 76 -6.138 10.746 4.123 1.00 5.36 O +ATOM 611 CZ TYR A 76 -6.055 9.659 4.963 1.00 5.36 C +ATOM 612 N ARG A 77 -8.726 5.218 7.799 1.00 5.36 N +ATOM 613 CA ARG A 77 -10.169 5.419 7.723 1.00 5.36 C +ATOM 614 C ARG A 77 -10.570 6.753 8.344 1.00 5.36 C +ATOM 615 CB ARG A 77 -10.909 4.274 8.418 1.00 5.36 C +ATOM 616 O ARG A 77 -10.028 7.151 9.377 1.00 5.36 O +ATOM 617 CG ARG A 77 -12.424 4.372 8.322 1.00 5.36 C +ATOM 618 CD ARG A 77 -13.109 3.207 9.024 1.00 5.36 C +ATOM 619 NE ARG A 77 -13.016 1.977 8.244 1.00 5.36 N +ATOM 620 NH1 ARG A 77 -14.417 0.756 9.616 1.00 5.36 N +ATOM 621 NH2 ARG A 77 -13.484 -0.219 7.763 1.00 5.36 N +ATOM 622 CZ ARG A 77 -13.639 0.841 8.542 1.00 5.36 C +ATOM 623 N GLU A 78 -11.384 7.464 7.705 1.00 5.36 N +ATOM 624 CA GLU A 78 -12.045 8.659 8.221 1.00 5.36 C +ATOM 625 C GLU A 78 -13.563 8.519 8.164 1.00 5.36 C +ATOM 626 CB GLU A 78 -11.601 9.899 7.439 1.00 5.36 C +ATOM 627 O GLU A 78 -14.081 7.514 7.673 1.00 5.36 O +ATOM 628 CG GLU A 78 -10.154 10.298 7.690 1.00 5.36 C +ATOM 629 CD GLU A 78 -9.792 11.648 7.092 1.00 5.36 C +ATOM 630 OE1 GLU A 78 -8.647 12.113 7.291 1.00 5.36 O +ATOM 631 OE2 GLU A 78 -10.661 12.247 6.420 1.00 5.36 O +ATOM 632 N LYS A 79 -14.255 9.510 8.676 1.00 5.36 N +ATOM 633 CA LYS A 79 -15.715 9.478 8.716 1.00 5.36 C +ATOM 634 C LYS A 79 -16.297 9.210 7.332 1.00 5.36 C +ATOM 635 CB LYS A 79 -16.265 10.793 9.271 1.00 5.36 C +ATOM 636 O LYS A 79 -17.266 8.460 7.195 1.00 5.36 O +ATOM 637 CG LYS A 79 -16.312 10.853 10.790 1.00 5.36 C +ATOM 638 CD LYS A 79 -16.955 12.144 11.279 1.00 5.36 C +ATOM 639 CE LYS A 79 -16.920 12.247 12.798 1.00 5.36 C +ATOM 640 NZ LYS A 79 -17.524 13.525 13.281 1.00 5.36 N +ATOM 641 N SER A 80 -15.615 9.685 6.280 1.00 5.36 N +ATOM 642 CA SER A 80 -16.194 9.676 4.940 1.00 5.36 C +ATOM 643 C SER A 80 -15.768 8.435 4.163 1.00 5.36 C +ATOM 644 CB SER A 80 -15.787 10.934 4.171 1.00 5.36 C +ATOM 645 O SER A 80 -16.312 8.148 3.094 1.00 5.36 O +ATOM 646 OG SER A 80 -14.376 11.064 4.131 1.00 5.36 O +ATOM 647 N GLY A 81 -14.790 7.696 4.700 1.00 5.36 N +ATOM 648 CA GLY A 81 -14.368 6.508 3.975 1.00 5.36 C +ATOM 649 C GLY A 81 -12.932 6.112 4.264 1.00 5.36 C +ATOM 650 O GLY A 81 -12.367 6.508 5.285 1.00 5.36 O +ATOM 651 N VAL A 82 -12.402 5.137 3.681 1.00 5.36 N +ATOM 652 CA VAL A 82 -11.030 4.653 3.791 1.00 5.36 C +ATOM 653 C VAL A 82 -10.148 5.364 2.767 1.00 5.36 C +ATOM 654 CB VAL A 82 -10.951 3.123 3.591 1.00 5.36 C +ATOM 655 O VAL A 82 -10.540 5.531 1.610 1.00 5.36 O +ATOM 656 CG1 VAL A 82 -9.503 2.642 3.674 1.00 5.36 C +ATOM 657 CG2 VAL A 82 -11.816 2.405 4.626 1.00 5.36 C +ATOM 658 N TYR A 83 -9.046 5.835 3.278 1.00 5.36 N +ATOM 659 CA TYR A 83 -8.137 6.587 2.421 1.00 5.36 C +ATOM 660 C TYR A 83 -6.784 5.894 2.319 1.00 5.36 C +ATOM 661 CB TYR A 83 -7.955 8.013 2.949 1.00 5.36 C +ATOM 662 O TYR A 83 -6.401 5.132 3.211 1.00 5.36 O +ATOM 663 CG TYR A 83 -9.240 8.802 3.021 1.00 5.36 C +ATOM 664 CD1 TYR A 83 -10.101 8.671 4.108 1.00 5.36 C +ATOM 665 CD2 TYR A 83 -9.595 9.680 2.003 1.00 5.36 C +ATOM 666 CE1 TYR A 83 -11.287 9.395 4.177 1.00 5.36 C +ATOM 667 CE2 TYR A 83 -10.778 10.409 2.062 1.00 5.36 C +ATOM 668 OH TYR A 83 -12.789 10.979 3.215 1.00 5.36 O +ATOM 669 CZ TYR A 83 -11.616 10.260 3.151 1.00 5.36 C +ATOM 670 N VAL A 84 -6.217 5.977 1.159 1.00 4.42 N +ATOM 671 CA VAL A 84 -4.820 5.583 1.013 1.00 4.42 C +ATOM 672 C VAL A 84 -3.961 6.815 0.737 1.00 4.42 C +ATOM 673 CB VAL A 84 -4.638 4.544 -0.116 1.00 4.42 C +ATOM 674 O VAL A 84 -4.300 7.638 -0.117 1.00 4.42 O +ATOM 675 CG1 VAL A 84 -3.161 4.207 -0.308 1.00 4.42 C +ATOM 676 CG2 VAL A 84 -5.442 3.281 0.188 1.00 4.42 C +ATOM 677 N ARG A 85 -3.015 6.909 1.573 1.00 4.42 N +ATOM 678 CA ARG A 85 -2.052 8.001 1.472 1.00 4.42 C +ATOM 679 C ARG A 85 -0.722 7.508 0.912 1.00 4.42 C +ATOM 680 CB ARG A 85 -1.835 8.655 2.838 1.00 4.42 C +ATOM 681 O ARG A 85 -0.256 6.423 1.268 1.00 4.42 O +ATOM 682 CG ARG A 85 -1.113 9.992 2.773 1.00 4.42 C +ATOM 683 CD ARG A 85 -0.941 10.607 4.154 1.00 4.42 C +ATOM 684 NE ARG A 85 -2.049 11.496 4.491 1.00 4.42 N +ATOM 685 NH1 ARG A 85 -1.423 11.780 6.696 1.00 4.42 N +ATOM 686 NH2 ARG A 85 -3.293 12.829 5.887 1.00 4.42 N +ATOM 687 CZ ARG A 85 -2.252 12.033 5.691 1.00 4.42 C +ATOM 688 N THR A 86 -0.152 8.200 -0.153 1.00 4.42 N +ATOM 689 CA THR A 86 1.170 7.866 -0.672 1.00 4.42 C +ATOM 690 C THR A 86 2.192 8.924 -0.269 1.00 4.42 C +ATOM 691 CB THR A 86 1.148 7.726 -2.205 1.00 4.42 C +ATOM 692 O THR A 86 1.918 10.123 -0.351 1.00 4.42 O +ATOM 693 CG2 THR A 86 0.290 6.542 -2.638 1.00 4.42 C +ATOM 694 OG1 THR A 86 0.614 8.925 -2.781 1.00 4.42 O +ATOM 695 N ASN A 87 3.286 8.434 0.354 1.00 5.36 N +ATOM 696 CA ASN A 87 4.370 9.361 0.664 1.00 5.36 C +ATOM 697 C ASN A 87 5.610 9.075 -0.179 1.00 5.36 C +ATOM 698 CB ASN A 87 4.716 9.304 2.153 1.00 5.36 C +ATOM 699 O ASN A 87 6.062 7.932 -0.258 1.00 5.36 O +ATOM 700 CG ASN A 87 3.662 9.959 3.024 1.00 5.36 C +ATOM 701 ND2 ASN A 87 3.845 9.882 4.336 1.00 5.36 N +ATOM 702 OD1 ASN A 87 2.690 10.529 2.520 1.00 5.36 O +ATOM 703 N LYS A 88 6.095 10.057 -0.960 1.00 5.36 N +ATOM 704 CA LYS A 88 7.392 9.866 -1.603 1.00 5.36 C +ATOM 705 C LYS A 88 8.509 9.764 -0.569 1.00 5.36 C +ATOM 706 CB LYS A 88 7.682 11.009 -2.577 1.00 5.36 C +ATOM 707 O LYS A 88 8.639 10.630 0.299 1.00 5.36 O +ATOM 708 CG LYS A 88 8.904 10.780 -3.454 1.00 5.36 C +ATOM 709 CD LYS A 88 9.096 11.914 -4.452 1.00 5.36 C +ATOM 710 CE LYS A 88 10.325 11.692 -5.323 1.00 5.36 C +ATOM 711 NZ LYS A 88 10.494 12.781 -6.331 1.00 5.36 N +ATOM 712 N LEU A 89 9.164 8.645 -0.576 1.00 5.36 N +ATOM 713 CA LEU A 89 10.225 8.484 0.412 1.00 5.36 C +ATOM 714 C LEU A 89 11.425 9.361 0.069 1.00 5.36 C +ATOM 715 CB LEU A 89 10.658 7.018 0.498 1.00 5.36 C +ATOM 716 O LEU A 89 11.670 9.653 -1.104 1.00 5.36 O +ATOM 717 CG LEU A 89 9.718 6.077 1.253 1.00 5.36 C +ATOM 718 CD1 LEU A 89 10.100 4.624 0.990 1.00 5.36 C +ATOM 719 CD2 LEU A 89 9.744 6.380 2.747 1.00 5.36 C +ATOM 720 N GLY A 90 12.223 9.812 1.163 1.00 5.36 N +ATOM 721 CA GLY A 90 13.408 10.650 1.084 1.00 5.36 C +ATOM 722 C GLY A 90 13.092 12.133 1.100 1.00 5.36 C +ATOM 723 O GLY A 90 13.993 12.967 0.984 1.00 5.36 O +ATOM 724 N PHE A 91 11.852 12.465 1.066 1.00 6.08 N +ATOM 725 CA PHE A 91 11.399 13.841 1.233 1.00 6.08 C +ATOM 726 C PHE A 91 10.518 13.974 2.470 1.00 6.08 C +ATOM 727 CB PHE A 91 10.634 14.312 -0.008 1.00 6.08 C +ATOM 728 O PHE A 91 9.318 13.699 2.417 1.00 6.08 O +ATOM 729 CG PHE A 91 11.519 14.611 -1.188 1.00 6.08 C +ATOM 730 CD1 PHE A 91 11.797 13.630 -2.132 1.00 6.08 C +ATOM 731 CD2 PHE A 91 12.073 15.874 -1.353 1.00 6.08 C +ATOM 732 CE1 PHE A 91 12.615 13.904 -3.226 1.00 6.08 C +ATOM 733 CE2 PHE A 91 12.891 16.155 -2.443 1.00 6.08 C +ATOM 734 CZ PHE A 91 13.162 15.168 -3.378 1.00 6.08 C +ATOM 735 N GLU A 92 11.137 13.459 3.617 1.00 6.08 N +ATOM 736 CA GLU A 92 10.535 13.509 4.945 1.00 6.08 C +ATOM 737 C GLU A 92 10.313 14.950 5.397 1.00 6.08 C +ATOM 738 CB GLU A 92 11.409 12.768 5.960 1.00 6.08 C +ATOM 739 O GLU A 92 11.270 15.664 5.704 1.00 6.08 O +ATOM 740 CG GLU A 92 10.998 11.320 6.186 1.00 6.08 C +ATOM 741 CD GLU A 92 11.819 10.623 7.259 1.00 6.08 C +ATOM 742 OE1 GLU A 92 11.506 9.461 7.604 1.00 6.08 O +ATOM 743 OE2 GLU A 92 12.783 11.245 7.759 1.00 6.08 O +ATOM 744 N ASP A 93 9.620 15.891 4.677 1.00 6.08 N +ATOM 745 CA ASP A 93 9.157 16.934 5.587 1.00 6.08 C +ATOM 746 C ASP A 93 7.745 16.640 6.087 1.00 6.08 C +ATOM 747 CB ASP A 93 9.199 18.302 4.902 1.00 6.08 C +ATOM 748 O ASP A 93 6.797 16.602 5.299 1.00 6.08 O +ATOM 749 CG ASP A 93 8.970 19.454 5.864 1.00 6.08 C +ATOM 750 OD1 ASP A 93 9.176 20.624 5.475 1.00 6.08 O +ATOM 751 OD2 ASP A 93 8.583 19.190 7.023 1.00 6.08 O +ATOM 752 N PRO A 94 7.665 15.732 7.134 1.00 6.08 N +ATOM 753 CA PRO A 94 6.298 15.546 7.627 1.00 6.08 C +ATOM 754 C PRO A 94 5.438 16.798 7.468 1.00 6.08 C +ATOM 755 CB PRO A 94 6.500 15.207 9.106 1.00 6.08 C +ATOM 756 O PRO A 94 4.211 16.701 7.386 1.00 6.08 O +ATOM 757 CG PRO A 94 7.963 15.397 9.346 1.00 6.08 C +ATOM 758 CD PRO A 94 8.633 15.652 8.026 1.00 6.08 C +ATOM 759 N LYS A 95 6.057 18.015 7.264 1.00 6.08 N +ATOM 760 CA LYS A 95 5.244 19.214 7.077 1.00 6.08 C +ATOM 761 C LYS A 95 5.046 19.517 5.595 1.00 6.08 C +ATOM 762 CB LYS A 95 5.887 20.413 7.776 1.00 6.08 C +ATOM 763 O LYS A 95 4.278 20.413 5.236 1.00 6.08 O +ATOM 764 CG LYS A 95 5.879 20.321 9.295 1.00 6.08 C +ATOM 765 CD LYS A 95 6.403 21.600 9.935 1.00 6.08 C +ATOM 766 CE LYS A 95 6.462 21.483 11.452 1.00 6.08 C +ATOM 767 NZ LYS A 95 6.972 22.736 12.085 1.00 6.08 N +ATOM 768 N SER A 96 5.718 18.813 4.741 1.00 6.08 N +ATOM 769 CA SER A 96 5.637 19.195 3.335 1.00 6.08 C +ATOM 770 C SER A 96 4.505 18.459 2.626 1.00 6.08 C +ATOM 771 CB SER A 96 6.963 18.912 2.626 1.00 6.08 C +ATOM 772 O SER A 96 4.417 17.231 2.696 1.00 6.08 O +ATOM 773 OG SER A 96 6.791 17.942 1.607 1.00 6.08 O +ATOM 774 N PHE A 97 3.312 18.985 2.701 1.00 6.08 N +ATOM 775 CA PHE A 97 2.069 18.645 2.019 1.00 6.08 C +ATOM 776 C PHE A 97 2.310 18.435 0.529 1.00 6.08 C +ATOM 777 CB PHE A 97 1.020 19.741 2.232 1.00 6.08 C +ATOM 778 O PHE A 97 1.445 17.913 -0.178 1.00 6.08 O +ATOM 779 CG PHE A 97 0.311 19.653 3.556 1.00 6.08 C +ATOM 780 CD1 PHE A 97 0.741 20.404 4.643 1.00 6.08 C +ATOM 781 CD2 PHE A 97 -0.787 18.817 3.714 1.00 6.08 C +ATOM 782 CE1 PHE A 97 0.086 20.325 5.869 1.00 6.08 C +ATOM 783 CE2 PHE A 97 -1.447 18.732 4.937 1.00 6.08 C +ATOM 784 CZ PHE A 97 -1.008 19.486 6.014 1.00 6.08 C +ATOM 785 N LEU A 98 3.513 18.640 0.039 1.00 6.08 N +ATOM 786 CA LEU A 98 3.587 18.842 -1.404 1.00 6.08 C +ATOM 787 C LEU A 98 3.826 17.520 -2.126 1.00 6.08 C +ATOM 788 CB LEU A 98 4.699 19.835 -1.751 1.00 6.08 C +ATOM 789 O LEU A 98 3.478 17.377 -3.300 1.00 6.08 O +ATOM 790 CG LEU A 98 4.372 21.315 -1.552 1.00 6.08 C +ATOM 791 CD1 LEU A 98 5.651 22.145 -1.553 1.00 6.08 C +ATOM 792 CD2 LEU A 98 3.413 21.801 -2.634 1.00 6.08 C +ATOM 793 N SER A 99 3.933 16.395 -1.418 1.00 6.08 N +ATOM 794 CA SER A 99 3.847 15.299 -2.377 1.00 6.08 C +ATOM 795 C SER A 99 2.856 14.236 -1.915 1.00 6.08 C +ATOM 796 CB SER A 99 5.222 14.666 -2.593 1.00 6.08 C +ATOM 797 O SER A 99 3.126 13.039 -2.024 1.00 6.08 O +ATOM 798 OG SER A 99 6.045 14.848 -1.453 1.00 6.08 O +ATOM 799 N ILE A 100 1.863 14.672 -1.135 1.00 6.08 N +ATOM 800 CA ILE A 100 0.897 13.774 -0.510 1.00 6.08 C +ATOM 801 C ILE A 100 -0.327 13.626 -1.411 1.00 6.08 C +ATOM 802 CB ILE A 100 0.475 14.281 0.887 1.00 6.08 C +ATOM 803 O ILE A 100 -0.866 14.619 -1.905 1.00 6.08 O +ATOM 804 CG1 ILE A 100 1.693 14.364 1.815 1.00 6.08 C +ATOM 805 CG2 ILE A 100 -0.608 13.379 1.485 1.00 6.08 C +ATOM 806 CD1 ILE A 100 1.410 15.041 3.149 1.00 6.08 C +ATOM 807 N LYS A 101 -0.627 12.452 -2.003 1.00 6.08 N +ATOM 808 CA LYS A 101 -1.914 12.267 -2.668 1.00 6.08 C +ATOM 809 C LYS A 101 -2.834 11.369 -1.846 1.00 6.08 C +ATOM 810 CB LYS A 101 -1.717 11.677 -4.065 1.00 6.08 C +ATOM 811 O LYS A 101 -2.372 10.433 -1.190 1.00 6.08 O +ATOM 812 CG LYS A 101 -1.039 12.621 -5.046 1.00 6.08 C +ATOM 813 CD LYS A 101 -1.055 12.062 -6.463 1.00 6.08 C +ATOM 814 CE LYS A 101 -0.350 12.992 -7.441 1.00 6.08 C +ATOM 815 NZ LYS A 101 -0.430 12.486 -8.844 1.00 6.08 N +ATOM 816 N GLU A 102 -3.972 11.868 -1.441 1.00 6.08 N +ATOM 817 CA GLU A 102 -5.024 11.157 -0.721 1.00 6.08 C +ATOM 818 C GLU A 102 -6.074 10.605 -1.681 1.00 6.08 C +ATOM 819 CB GLU A 102 -5.686 12.076 0.310 1.00 6.08 C +ATOM 820 O GLU A 102 -6.525 11.308 -2.587 1.00 6.08 O +ATOM 821 CG GLU A 102 -6.179 11.350 1.553 1.00 6.08 C +ATOM 822 CD GLU A 102 -6.742 12.286 2.611 1.00 6.08 C +ATOM 823 OE1 GLU A 102 -7.929 12.141 2.980 1.00 6.08 O +ATOM 824 OE2 GLU A 102 -5.989 13.172 3.073 1.00 6.08 O +ATOM 825 N TYR A 103 -6.415 9.341 -1.509 1.00 5.36 N +ATOM 826 CA TYR A 103 -7.466 8.743 -2.325 1.00 5.36 C +ATOM 827 C TYR A 103 -8.614 8.244 -1.456 1.00 5.36 C +ATOM 828 CB TYR A 103 -6.906 7.589 -3.163 1.00 5.36 C +ATOM 829 O TYR A 103 -8.406 7.443 -0.541 1.00 5.36 O +ATOM 830 CG TYR A 103 -5.758 7.990 -4.057 1.00 5.36 C +ATOM 831 CD1 TYR A 103 -4.440 7.899 -3.614 1.00 5.36 C +ATOM 832 CD2 TYR A 103 -5.988 8.459 -5.345 1.00 5.36 C +ATOM 833 CE1 TYR A 103 -3.379 8.269 -4.434 1.00 5.36 C +ATOM 834 CE2 TYR A 103 -4.935 8.832 -6.174 1.00 5.36 C +ATOM 835 OH TYR A 103 -2.589 9.101 -6.526 1.00 5.36 O +ATOM 836 CZ TYR A 103 -3.636 8.733 -5.710 1.00 5.36 C +ATOM 837 N LYS A 104 -9.836 8.844 -1.571 1.00 6.08 N +ATOM 838 CA LYS A 104 -11.038 8.471 -0.832 1.00 6.08 C +ATOM 839 C LYS A 104 -11.649 7.188 -1.387 1.00 6.08 C +ATOM 840 CB LYS A 104 -12.066 9.602 -0.872 1.00 6.08 C +ATOM 841 O LYS A 104 -11.782 7.033 -2.603 1.00 6.08 O +ATOM 842 CG LYS A 104 -13.244 9.402 0.070 1.00 6.08 C +ATOM 843 CD LYS A 104 -14.209 10.579 0.017 1.00 6.08 C +ATOM 844 CE LYS A 104 -15.411 10.360 0.925 1.00 6.08 C +ATOM 845 NZ LYS A 104 -16.346 11.524 0.898 1.00 6.08 N +ATOM 846 N PHE A 105 -11.952 6.243 -0.555 1.00 6.08 N +ATOM 847 CA PHE A 105 -12.601 4.981 -0.891 1.00 6.08 C +ATOM 848 C PHE A 105 -14.029 4.948 -0.359 1.00 6.08 C +ATOM 849 CB PHE A 105 -11.804 3.799 -0.330 1.00 6.08 C +ATOM 850 O PHE A 105 -14.252 5.098 0.844 1.00 6.08 O +ATOM 851 CG PHE A 105 -11.481 2.744 -1.354 1.00 6.08 C +ATOM 852 CD1 PHE A 105 -10.418 2.913 -2.234 1.00 6.08 C +ATOM 853 CD2 PHE A 105 -12.239 1.584 -1.436 1.00 6.08 C +ATOM 854 CE1 PHE A 105 -10.116 1.938 -3.182 1.00 6.08 C +ATOM 855 CE2 PHE A 105 -11.944 0.606 -2.382 1.00 6.08 C +ATOM 856 CZ PHE A 105 -10.883 0.785 -3.254 1.00 6.08 C +ATOM 857 N GLY A 106 -15.105 4.749 -1.141 1.00 6.08 N +ATOM 858 CA GLY A 106 -16.469 4.462 -0.727 1.00 6.08 C +ATOM 859 C GLY A 106 -17.097 5.584 0.078 1.00 6.08 C +ATOM 860 O GLY A 106 -16.419 6.547 0.445 1.00 6.08 O +ATOM 861 N THR A 107 -18.460 5.770 -0.034 1.00 6.08 N +ATOM 862 CA THR A 107 -19.388 6.728 0.555 1.00 6.08 C +ATOM 863 C THR A 107 -20.150 6.098 1.717 1.00 6.08 C +ATOM 864 CB THR A 107 -20.386 7.256 -0.492 1.00 6.08 C +ATOM 865 O THR A 107 -21.036 5.267 1.507 1.00 6.08 O +ATOM 866 CG2 THR A 107 -19.699 8.182 -1.490 1.00 6.08 C +ATOM 867 OG1 THR A 107 -20.957 6.148 -1.200 1.00 6.08 O +ATOM 868 N ARG A 108 -19.518 5.476 2.709 1.00 6.08 N +ATOM 869 CA ARG A 108 -20.503 5.366 3.780 1.00 6.08 C +ATOM 870 C ARG A 108 -20.263 6.422 4.855 1.00 6.08 C +ATOM 871 CB ARG A 108 -20.469 3.968 4.402 1.00 6.08 C +ATOM 872 O ARG A 108 -19.123 6.646 5.268 1.00 6.08 O +ATOM 873 CG ARG A 108 -21.303 2.941 3.653 1.00 6.08 C +ATOM 874 CD ARG A 108 -21.351 1.609 4.389 1.00 6.08 C +ATOM 875 NE ARG A 108 -22.338 0.706 3.804 1.00 6.08 N +ATOM 876 NH1 ARG A 108 -22.022 -0.977 5.356 1.00 6.08 N +ATOM 877 NH2 ARG A 108 -23.549 -1.241 3.667 1.00 6.08 N +ATOM 878 CZ ARG A 108 -22.634 -0.502 4.277 1.00 6.08 C +ATOM 879 N THR A 109 -21.000 7.550 4.650 1.00 6.08 N +ATOM 880 CA THR A 109 -21.263 8.726 5.472 1.00 6.08 C +ATOM 881 C THR A 109 -21.852 8.323 6.821 1.00 6.08 C +ATOM 882 CB THR A 109 -22.219 9.702 4.762 1.00 6.08 C +ATOM 883 O THR A 109 -22.761 7.492 6.883 1.00 6.08 O +ATOM 884 CG2 THR A 109 -21.477 10.545 3.730 1.00 6.08 C +ATOM 885 OG1 THR A 109 -23.249 8.956 4.102 1.00 6.08 O +ATOM 886 N GLY A 110 -21.151 8.030 7.805 1.00 6.08 N +ATOM 887 CA GLY A 110 -21.715 8.302 9.117 1.00 6.08 C +ATOM 888 C GLY A 110 -20.888 7.731 10.253 1.00 6.08 C +ATOM 889 O GLY A 110 -20.720 6.514 10.354 1.00 6.08 O +ATOM 890 N GLY A 111 -20.142 8.505 10.862 1.00 6.08 N +ATOM 891 CA GLY A 111 -19.936 8.533 12.301 1.00 6.08 C +ATOM 892 C GLY A 111 -18.518 8.904 12.693 1.00 6.08 C +ATOM 893 O GLY A 111 -17.638 9.007 11.836 1.00 6.08 O +ATOM 894 N ASN A 112 -18.313 9.718 13.747 1.00 6.08 N +ATOM 895 CA ASN A 112 -17.174 10.179 14.534 1.00 6.08 C +ATOM 896 C ASN A 112 -16.127 9.082 14.702 1.00 6.08 C +ATOM 897 CB ASN A 112 -17.637 10.685 15.902 1.00 6.08 C +ATOM 898 O ASN A 112 -16.444 7.978 15.149 1.00 6.08 O +ATOM 899 CG ASN A 112 -18.364 12.013 15.817 1.00 6.08 C +ATOM 900 ND2 ASN A 112 -19.255 12.262 16.770 1.00 6.08 N +ATOM 901 OD1 ASN A 112 -18.128 12.807 14.904 1.00 6.08 O +ATOM 902 N PHE A 113 -14.987 8.972 14.050 1.00 6.08 N +ATOM 903 CA PHE A 113 -14.107 7.891 14.478 1.00 6.08 C +ATOM 904 C PHE A 113 -12.665 8.373 14.576 1.00 6.08 C +ATOM 905 CB PHE A 113 -14.201 6.706 13.512 1.00 6.08 C +ATOM 906 O PHE A 113 -12.245 9.251 13.819 1.00 6.08 O +ATOM 907 CG PHE A 113 -15.131 5.617 13.975 1.00 6.08 C +ATOM 908 CD1 PHE A 113 -16.472 5.629 13.613 1.00 6.08 C +ATOM 909 CD2 PHE A 113 -14.664 4.581 14.774 1.00 6.08 C +ATOM 910 CE1 PHE A 113 -17.336 4.623 14.040 1.00 6.08 C +ATOM 911 CE2 PHE A 113 -15.520 3.572 15.204 1.00 6.08 C +ATOM 912 CZ PHE A 113 -16.856 3.595 14.837 1.00 6.08 C +ATOM 913 N THR A 114 -11.825 7.651 15.237 1.00 6.08 N +ATOM 914 CA THR A 114 -10.413 7.467 15.554 1.00 6.08 C +ATOM 915 C THR A 114 -10.065 5.983 15.631 1.00 6.08 C +ATOM 916 CB THR A 114 -10.044 8.154 16.882 1.00 6.08 C +ATOM 917 O THR A 114 -10.307 5.336 16.652 1.00 6.08 O +ATOM 918 CG2 THR A 114 -10.124 9.672 16.757 1.00 6.08 C +ATOM 919 OG1 THR A 114 -10.951 7.722 17.904 1.00 6.08 O +ATOM 920 N GLY A 115 -10.385 5.096 14.476 1.00 6.08 N +ATOM 921 CA GLY A 115 -9.894 3.756 14.757 1.00 6.08 C +ATOM 922 C GLY A 115 -9.108 3.156 13.607 1.00 6.08 C +ATOM 923 O GLY A 115 -8.864 3.823 12.600 1.00 6.08 O +ATOM 924 N GLU A 116 -8.292 2.078 13.803 1.00 6.08 N +ATOM 925 CA GLU A 116 -7.455 1.166 13.029 1.00 6.08 C +ATOM 926 C GLU A 116 -8.271 0.435 11.966 1.00 6.08 C +ATOM 927 CB GLU A 116 -6.766 0.156 13.950 1.00 6.08 C +ATOM 928 O GLU A 116 -9.471 0.214 12.141 1.00 6.08 O +ATOM 929 CG GLU A 116 -5.620 0.745 14.760 1.00 6.08 C +ATOM 930 CD GLU A 116 -4.833 -0.301 15.533 1.00 6.08 C +ATOM 931 OE1 GLU A 116 -3.793 0.046 16.138 1.00 6.08 O +ATOM 932 OE2 GLU A 116 -5.258 -1.478 15.533 1.00 6.08 O +ATOM 933 N LEU A 117 -7.867 0.276 10.616 1.00 5.36 N +ATOM 934 CA LEU A 117 -8.515 -0.475 9.546 1.00 5.36 C +ATOM 935 C LEU A 117 -8.722 -1.930 9.952 1.00 5.36 C +ATOM 936 CB LEU A 117 -7.684 -0.404 8.263 1.00 5.36 C +ATOM 937 O LEU A 117 -7.933 -2.483 10.723 1.00 5.36 O +ATOM 938 CG LEU A 117 -7.563 0.973 7.608 1.00 5.36 C +ATOM 939 CD1 LEU A 117 -6.504 0.947 6.511 1.00 5.36 C +ATOM 940 CD2 LEU A 117 -8.910 1.418 7.048 1.00 5.36 C +ATOM 941 N THR A 118 -9.851 -2.455 9.647 1.00 5.36 N +ATOM 942 CA THR A 118 -10.035 -3.895 9.790 1.00 5.36 C +ATOM 943 C THR A 118 -9.157 -4.654 8.798 1.00 5.36 C +ATOM 944 CB THR A 118 -11.508 -4.294 9.584 1.00 5.36 C +ATOM 945 O THR A 118 -8.605 -4.060 7.869 1.00 5.36 O +ATOM 946 CG2 THR A 118 -12.428 -3.487 10.493 1.00 5.36 C +ATOM 947 OG1 THR A 118 -11.875 -4.057 8.219 1.00 5.36 O +ATOM 948 N LYS A 119 -8.889 -5.923 9.112 1.00 6.08 N +ATOM 949 CA LYS A 119 -8.123 -6.769 8.201 1.00 6.08 C +ATOM 950 C LYS A 119 -8.726 -6.753 6.799 1.00 6.08 C +ATOM 951 CB LYS A 119 -8.057 -8.204 8.727 1.00 6.08 C +ATOM 952 O LYS A 119 -8.000 -6.675 5.806 1.00 6.08 O +ATOM 953 CG LYS A 119 -7.022 -9.073 8.027 1.00 6.08 C +ATOM 954 CD LYS A 119 -6.951 -10.463 8.644 1.00 6.08 C +ATOM 955 CE LYS A 119 -6.004 -11.371 7.872 1.00 6.08 C +ATOM 956 NZ LYS A 119 -5.944 -12.741 8.463 1.00 6.08 N +ATOM 957 N GLN A 120 -10.033 -6.874 6.687 1.00 6.08 N +ATOM 958 CA GLN A 120 -10.739 -6.867 5.410 1.00 6.08 C +ATOM 959 C GLN A 120 -10.510 -5.558 4.661 1.00 6.08 C +ATOM 960 CB GLN A 120 -12.236 -7.096 5.623 1.00 6.08 C +ATOM 961 O GLN A 120 -10.287 -5.560 3.449 1.00 6.08 O +ATOM 962 CG GLN A 120 -12.965 -7.594 4.383 1.00 6.08 C +ATOM 963 CD GLN A 120 -14.269 -8.298 4.711 1.00 6.08 C +ATOM 964 NE2 GLN A 120 -14.806 -9.032 3.742 1.00 6.08 N +ATOM 965 OE1 GLN A 120 -14.788 -8.184 5.826 1.00 6.08 O +ATOM 966 N GLU A 121 -10.563 -4.457 5.339 1.00 5.36 N +ATOM 967 CA GLU A 121 -10.315 -3.150 4.738 1.00 5.36 C +ATOM 968 C GLU A 121 -8.891 -3.052 4.198 1.00 5.36 C +ATOM 969 CB GLU A 121 -10.571 -2.034 5.753 1.00 5.36 C +ATOM 970 O GLU A 121 -8.667 -2.500 3.119 1.00 5.36 O +ATOM 971 CG GLU A 121 -12.041 -1.836 6.092 1.00 5.36 C +ATOM 972 CD GLU A 121 -12.266 -0.891 7.262 1.00 5.36 C +ATOM 973 OE1 GLU A 121 -13.256 -0.126 7.243 1.00 5.36 O +ATOM 974 OE2 GLU A 121 -11.443 -0.916 8.205 1.00 5.36 O +ATOM 975 N LEU A 122 -7.942 -3.571 4.960 1.00 5.36 N +ATOM 976 CA LEU A 122 -6.554 -3.544 4.512 1.00 5.36 C +ATOM 977 C LEU A 122 -6.385 -4.331 3.217 1.00 5.36 C +ATOM 978 CB LEU A 122 -5.632 -4.115 5.593 1.00 5.36 C +ATOM 979 O LEU A 122 -5.705 -3.876 2.294 1.00 5.36 O +ATOM 980 CG LEU A 122 -5.295 -3.183 6.758 1.00 5.36 C +ATOM 981 CD1 LEU A 122 -4.667 -3.971 7.903 1.00 5.36 C +ATOM 982 CD2 LEU A 122 -4.365 -2.066 6.298 1.00 5.36 C +ATOM 983 N VAL A 123 -6.991 -5.567 3.232 1.00 5.36 N +ATOM 984 CA VAL A 123 -6.926 -6.409 2.042 1.00 5.36 C +ATOM 985 C VAL A 123 -7.518 -5.664 0.848 1.00 5.36 C +ATOM 986 CB VAL A 123 -7.667 -7.749 2.255 1.00 5.36 C +ATOM 987 O VAL A 123 -6.921 -5.633 -0.230 1.00 5.36 O +ATOM 988 CG1 VAL A 123 -7.796 -8.509 0.936 1.00 5.36 C +ATOM 989 CG2 VAL A 123 -6.942 -8.599 3.296 1.00 5.36 C +ATOM 990 N TYR A 124 -8.671 -5.070 1.043 1.00 5.36 N +ATOM 991 CA TYR A 124 -9.359 -4.338 -0.015 1.00 5.36 C +ATOM 992 C TYR A 124 -8.521 -3.160 -0.496 1.00 5.36 C +ATOM 993 CB TYR A 124 -10.724 -3.844 0.473 1.00 5.36 C +ATOM 994 O TYR A 124 -8.387 -2.937 -1.702 1.00 5.36 O +ATOM 995 CG TYR A 124 -11.884 -4.667 -0.033 1.00 5.36 C +ATOM 996 CD1 TYR A 124 -12.554 -5.552 0.808 1.00 5.36 C +ATOM 997 CD2 TYR A 124 -12.312 -4.561 -1.352 1.00 5.36 C +ATOM 998 CE1 TYR A 124 -13.622 -6.314 0.346 1.00 5.36 C +ATOM 999 CE2 TYR A 124 -13.379 -5.318 -1.825 1.00 5.36 C +ATOM 1000 OH TYR A 124 -15.084 -6.942 -1.432 1.00 5.36 O +ATOM 1001 CZ TYR A 124 -14.027 -6.190 -0.969 1.00 5.36 C +ATOM 1002 N THR A 125 -8.064 -2.317 0.476 1.00 5.36 N +ATOM 1003 CA THR A 125 -7.230 -1.175 0.117 1.00 5.36 C +ATOM 1004 C THR A 125 -6.008 -1.626 -0.679 1.00 5.36 C +ATOM 1005 CB THR A 125 -6.774 -0.402 1.368 1.00 5.36 C +ATOM 1006 O THR A 125 -5.643 -0.999 -1.675 1.00 5.36 O +ATOM 1007 CG2 THR A 125 -7.392 0.992 1.408 1.00 5.36 C +ATOM 1008 OG1 THR A 125 -7.173 -1.123 2.540 1.00 5.36 O +ATOM 1009 N ASN A 126 -5.437 -2.705 -0.271 1.00 5.36 N +ATOM 1010 CA ASN A 126 -4.265 -3.214 -0.977 1.00 5.36 C +ATOM 1011 C ASN A 126 -4.614 -3.656 -2.395 1.00 5.36 C +ATOM 1012 CB ASN A 126 -3.631 -4.370 -0.201 1.00 5.36 C +ATOM 1013 O ASN A 126 -3.866 -3.384 -3.336 1.00 5.36 O +ATOM 1014 CG ASN A 126 -2.693 -3.896 0.891 1.00 5.36 C +ATOM 1015 ND2 ASN A 126 -2.429 -4.760 1.864 1.00 5.36 N +ATOM 1016 OD1 ASN A 126 -2.209 -2.761 0.861 1.00 5.36 O +ATOM 1017 N GLN A 127 -5.691 -4.483 -2.497 1.00 5.36 N +ATOM 1018 CA GLN A 127 -6.138 -4.897 -3.823 1.00 5.36 C +ATOM 1019 C GLN A 127 -6.385 -3.689 -4.722 1.00 5.36 C +ATOM 1020 CB GLN A 127 -7.407 -5.744 -3.721 1.00 5.36 C +ATOM 1021 O GLN A 127 -5.973 -3.679 -5.884 1.00 5.36 O +ATOM 1022 CG GLN A 127 -7.729 -6.525 -4.989 1.00 5.36 C +ATOM 1023 CD GLN A 127 -8.927 -7.440 -4.826 1.00 5.36 C +ATOM 1024 NE2 GLN A 127 -9.350 -8.064 -5.921 1.00 5.36 N +ATOM 1025 OE1 GLN A 127 -9.468 -7.587 -3.726 1.00 5.36 O +ATOM 1026 N TRP A 128 -7.149 -2.688 -4.151 1.00 5.36 N +ATOM 1027 CA TRP A 128 -7.418 -1.471 -4.911 1.00 5.36 C +ATOM 1028 C TRP A 128 -6.119 -0.818 -5.371 1.00 5.36 C +ATOM 1029 CB TRP A 128 -8.232 -0.482 -4.072 1.00 5.36 C +ATOM 1030 O TRP A 128 -5.992 -0.427 -6.534 1.00 5.36 O +ATOM 1031 CG TRP A 128 -8.637 0.757 -4.813 1.00 5.36 C +ATOM 1032 CD1 TRP A 128 -9.759 0.931 -5.576 1.00 5.36 C +ATOM 1033 CD2 TRP A 128 -7.919 1.993 -4.866 1.00 5.36 C +ATOM 1034 CE2 TRP A 128 -8.665 2.875 -5.680 1.00 5.36 C +ATOM 1035 CE3 TRP A 128 -6.717 2.442 -4.304 1.00 5.36 C +ATOM 1036 NE1 TRP A 128 -9.781 2.203 -6.099 1.00 5.36 N +ATOM 1037 CH2 TRP A 128 -7.067 4.595 -5.381 1.00 5.36 C +ATOM 1038 CZ2 TRP A 128 -8.247 4.181 -5.944 1.00 5.36 C +ATOM 1039 CZ3 TRP A 128 -6.302 3.742 -4.568 1.00 5.36 C +ATOM 1040 N VAL A 129 -5.185 -0.613 -4.368 1.00 4.42 N +ATOM 1041 CA VAL A 129 -3.899 -0.000 -4.687 1.00 4.42 C +ATOM 1042 C VAL A 129 -3.213 -0.789 -5.800 1.00 4.42 C +ATOM 1043 CB VAL A 129 -2.983 0.077 -3.446 1.00 4.42 C +ATOM 1044 O VAL A 129 -2.691 -0.205 -6.753 1.00 4.42 O +ATOM 1045 CG1 VAL A 129 -1.562 0.471 -3.846 1.00 4.42 C +ATOM 1046 CG2 VAL A 129 -3.548 1.065 -2.427 1.00 4.42 C +ATOM 1047 N ASN A 130 -3.323 -2.084 -5.765 1.00 5.36 N +ATOM 1048 CA ASN A 130 -2.699 -2.948 -6.762 1.00 5.36 C +ATOM 1049 C ASN A 130 -3.320 -2.751 -8.142 1.00 5.36 C +ATOM 1050 CB ASN A 130 -2.799 -4.415 -6.339 1.00 5.36 C +ATOM 1051 O ASN A 130 -2.613 -2.751 -9.151 1.00 5.36 O +ATOM 1052 CG ASN A 130 -1.767 -4.793 -5.294 1.00 5.36 C +ATOM 1053 ND2 ASN A 130 -2.027 -5.874 -4.568 1.00 5.36 N +ATOM 1054 OD1 ASN A 130 -0.746 -4.118 -5.140 1.00 5.36 O +ATOM 1055 N GLU A 131 -4.600 -2.603 -8.153 1.00 5.36 N +ATOM 1056 CA GLU A 131 -5.337 -2.535 -9.412 1.00 5.36 C +ATOM 1057 C GLU A 131 -5.256 -1.140 -10.024 1.00 5.36 C +ATOM 1058 CB GLU A 131 -6.800 -2.932 -9.200 1.00 5.36 C +ATOM 1059 O GLU A 131 -5.324 -0.988 -11.246 1.00 5.36 O +ATOM 1060 CG GLU A 131 -7.000 -4.413 -8.911 1.00 5.36 C +ATOM 1061 CD GLU A 131 -8.445 -4.776 -8.611 1.00 5.36 C +ATOM 1062 OE1 GLU A 131 -8.733 -5.970 -8.365 1.00 5.36 O +ATOM 1063 OE2 GLU A 131 -9.297 -3.860 -8.623 1.00 5.36 O +ATOM 1064 N ASN A 132 -5.147 -0.162 -9.186 1.00 5.36 N +ATOM 1065 CA ASN A 132 -5.357 1.190 -9.693 1.00 5.36 C +ATOM 1066 C ASN A 132 -4.037 1.936 -9.863 1.00 5.36 C +ATOM 1067 CB ASN A 132 -6.292 1.971 -8.767 1.00 5.36 C +ATOM 1068 O ASN A 132 -3.931 2.838 -10.696 1.00 5.36 O +ATOM 1069 CG ASN A 132 -7.729 1.494 -8.851 1.00 5.36 C +ATOM 1070 ND2 ASN A 132 -8.165 0.745 -7.845 1.00 5.36 N +ATOM 1071 OD1 ASN A 132 -8.441 1.795 -9.813 1.00 5.36 O +ATOM 1072 N ILE A 133 -3.015 1.608 -8.992 1.00 5.36 N +ATOM 1073 CA ILE A 133 -1.781 2.384 -9.062 1.00 5.36 C +ATOM 1074 C ILE A 133 -0.907 1.861 -10.200 1.00 5.36 C +ATOM 1075 CB ILE A 133 -1.007 2.336 -7.726 1.00 5.36 C +ATOM 1076 O ILE A 133 -0.112 2.609 -10.773 1.00 5.36 O +ATOM 1077 CG1 ILE A 133 -1.777 3.089 -6.635 1.00 5.36 C +ATOM 1078 CG2 ILE A 133 0.402 2.911 -7.897 1.00 5.36 C +ATOM 1079 CD1 ILE A 133 -1.113 3.045 -5.266 1.00 5.36 C +ATOM 1080 N THR A 134 -1.214 0.937 -10.975 1.00 6.08 N +ATOM 1081 CA THR A 134 -0.412 0.479 -12.104 1.00 6.08 C +ATOM 1082 C THR A 134 -0.466 1.485 -13.250 1.00 6.08 C +ATOM 1083 CB THR A 134 -0.887 -0.898 -12.605 1.00 6.08 C +ATOM 1084 O THR A 134 0.513 1.656 -13.980 1.00 6.08 O +ATOM 1085 CG2 THR A 134 0.024 -2.012 -12.097 1.00 6.08 C +ATOM 1086 OG1 THR A 134 -2.220 -1.137 -12.137 1.00 6.08 O +ATOM 1087 N LEU A 135 -1.656 2.194 -13.502 1.00 6.08 N +ATOM 1088 CA LEU A 135 -2.187 2.386 -14.847 1.00 6.08 C +ATOM 1089 C LEU A 135 -2.051 3.841 -15.283 1.00 6.08 C +ATOM 1090 CB LEU A 135 -3.656 1.958 -14.908 1.00 6.08 C +ATOM 1091 O LEU A 135 -2.144 4.147 -16.474 1.00 6.08 O +ATOM 1092 CG LEU A 135 -3.923 0.452 -14.925 1.00 6.08 C +ATOM 1093 CD1 LEU A 135 -5.388 0.171 -14.609 1.00 6.08 C +ATOM 1094 CD2 LEU A 135 -3.538 -0.144 -16.274 1.00 6.08 C +ATOM 1095 N ALA A 136 -1.314 4.761 -14.697 1.00 6.08 N +ATOM 1096 CA ALA A 136 -1.322 5.912 -15.597 1.00 6.08 C +ATOM 1097 C ALA A 136 0.036 6.607 -15.610 1.00 6.08 C +ATOM 1098 CB ALA A 136 -2.417 6.896 -15.193 1.00 6.08 C +ATOM 1099 O ALA A 136 0.626 6.851 -14.555 1.00 6.08 O +ATOM 1100 N ASN A 137 1.001 6.147 -16.376 1.00 6.08 N +ATOM 1101 CA ASN A 137 1.962 7.100 -16.923 1.00 6.08 C +ATOM 1102 C ASN A 137 2.561 7.982 -15.832 1.00 6.08 C +ATOM 1103 CB ASN A 137 1.305 7.963 -18.003 1.00 6.08 C +ATOM 1104 O ASN A 137 2.685 9.196 -16.007 1.00 6.08 O +ATOM 1105 CG ASN A 137 1.244 7.267 -19.349 1.00 6.08 C +ATOM 1106 ND2 ASN A 137 0.354 7.734 -20.218 1.00 6.08 N +ATOM 1107 OD1 ASN A 137 1.989 6.318 -19.606 1.00 6.08 O +ATOM 1108 N GLY A 138 2.939 7.445 -14.762 1.00 6.08 N +ATOM 1109 CA GLY A 138 3.642 8.286 -13.808 1.00 6.08 C +ATOM 1110 C GLY A 138 2.721 9.212 -13.036 1.00 6.08 C +ATOM 1111 O GLY A 138 3.179 10.003 -12.209 1.00 6.08 O +ATOM 1112 N TYR A 139 1.463 9.234 -13.302 1.00 6.08 N +ATOM 1113 CA TYR A 139 0.469 10.113 -12.696 1.00 6.08 C +ATOM 1114 C TYR A 139 -0.736 9.318 -12.207 1.00 6.08 C +ATOM 1115 CB TYR A 139 0.019 11.184 -13.694 1.00 6.08 C +ATOM 1116 O TYR A 139 -1.121 8.321 -12.822 1.00 6.08 O +ATOM 1117 CG TYR A 139 0.919 12.395 -13.732 1.00 6.08 C +ATOM 1118 CD1 TYR A 139 1.986 12.467 -14.625 1.00 6.08 C +ATOM 1119 CD2 TYR A 139 0.705 13.469 -12.874 1.00 6.08 C +ATOM 1120 CE1 TYR A 139 2.819 13.580 -14.662 1.00 6.08 C +ATOM 1121 CE2 TYR A 139 1.532 14.587 -12.903 1.00 6.08 C +ATOM 1122 OH TYR A 139 3.406 15.738 -13.831 1.00 6.08 O +ATOM 1123 CZ TYR A 139 2.584 14.634 -13.799 1.00 6.08 C +ATOM 1124 N ILE A 140 -0.939 9.058 -10.837 1.00 6.08 N +ATOM 1125 CA ILE A 140 -2.155 8.654 -10.138 1.00 6.08 C +ATOM 1126 C ILE A 140 -3.276 9.645 -10.440 1.00 6.08 C +ATOM 1127 CB ILE A 140 -1.924 8.553 -8.614 1.00 6.08 C +ATOM 1128 O ILE A 140 -3.182 10.824 -10.091 1.00 6.08 O +ATOM 1129 CG1 ILE A 140 -0.789 7.569 -8.310 1.00 6.08 C +ATOM 1130 CG2 ILE A 140 -3.213 8.140 -7.899 1.00 6.08 C +ATOM 1131 CD1 ILE A 140 -0.415 7.492 -6.836 1.00 6.08 C +ATOM 1132 N SER A 141 -3.684 9.839 -11.715 1.00 6.08 N +ATOM 1133 CA SER A 141 -4.883 10.669 -11.786 1.00 6.08 C +ATOM 1134 C SER A 141 -6.105 9.922 -11.262 1.00 6.08 C +ATOM 1135 CB SER A 141 -5.133 11.127 -13.224 1.00 6.08 C +ATOM 1136 O SER A 141 -6.378 8.796 -11.682 1.00 6.08 O +ATOM 1137 OG SER A 141 -6.496 10.963 -13.574 1.00 6.08 O +ATOM 1138 N ALA A 142 -6.198 9.687 -9.878 1.00 6.08 N +ATOM 1139 CA ALA A 142 -7.356 9.155 -9.164 1.00 6.08 C +ATOM 1140 C ALA A 142 -8.656 9.539 -9.865 1.00 6.08 C +ATOM 1141 CB ALA A 142 -7.366 9.651 -7.721 1.00 6.08 C +ATOM 1142 O ALA A 142 -8.874 10.710 -10.184 1.00 6.08 O +ATOM 1143 N ASP A 143 -9.016 8.898 -10.877 1.00 6.08 N +ATOM 1144 CA ASP A 143 -10.425 8.964 -11.253 1.00 6.08 C +ATOM 1145 C ASP A 143 -11.295 9.345 -10.057 1.00 6.08 C +ATOM 1146 CB ASP A 143 -10.889 7.628 -11.836 1.00 6.08 C +ATOM 1147 O ASP A 143 -11.158 8.769 -8.975 1.00 6.08 O +ATOM 1148 CG ASP A 143 -11.385 7.746 -13.267 1.00 6.08 C +ATOM 1149 OD1 ASP A 143 -11.573 6.706 -13.934 1.00 6.08 O +ATOM 1150 OD2 ASP A 143 -11.586 8.889 -13.731 1.00 6.08 O +ATOM 1151 N SER A 144 -11.432 10.610 -9.724 1.00 6.08 N +ATOM 1152 CA SER A 144 -12.633 11.251 -9.197 1.00 6.08 C +ATOM 1153 C SER A 144 -13.803 10.274 -9.147 1.00 6.08 C +ATOM 1154 CB SER A 144 -13.009 12.466 -10.046 1.00 6.08 C +ATOM 1155 O SER A 144 -14.946 10.678 -8.919 1.00 6.08 O +ATOM 1156 OG SER A 144 -12.987 12.143 -11.426 1.00 6.08 O +ATOM 1157 N ARG A 145 -13.625 8.971 -9.055 1.00 6.08 N +ATOM 1158 CA ARG A 145 -14.877 8.231 -8.942 1.00 6.08 C +ATOM 1159 C ARG A 145 -15.517 8.442 -7.574 1.00 6.08 C +ATOM 1160 CB ARG A 145 -14.644 6.738 -9.187 1.00 6.08 C +ATOM 1161 O ARG A 145 -14.826 8.444 -6.554 1.00 6.08 O +ATOM 1162 CG ARG A 145 -14.402 6.383 -10.645 1.00 6.08 C +ATOM 1163 CD ARG A 145 -14.336 4.877 -10.856 1.00 6.08 C +ATOM 1164 NE ARG A 145 -13.186 4.497 -11.671 1.00 6.08 N +ATOM 1165 NH1 ARG A 145 -13.735 2.255 -11.769 1.00 6.08 N +ATOM 1166 NH2 ARG A 145 -11.852 3.025 -12.824 1.00 6.08 N +ATOM 1167 CZ ARG A 145 -12.927 3.260 -12.086 1.00 6.08 C +ATOM 1168 N THR A 146 -16.379 9.419 -7.415 1.00 6.08 N +ATOM 1169 CA THR A 146 -17.507 9.485 -6.494 1.00 6.08 C +ATOM 1170 C THR A 146 -18.280 8.169 -6.491 1.00 6.08 C +ATOM 1171 CB THR A 146 -18.458 10.641 -6.856 1.00 6.08 C +ATOM 1172 O THR A 146 -18.534 7.590 -7.549 1.00 6.08 O +ATOM 1173 CG2 THR A 146 -18.028 11.939 -6.180 1.00 6.08 C +ATOM 1174 OG1 THR A 146 -18.451 10.830 -8.276 1.00 6.08 O +ATOM 1175 N VAL A 147 -17.785 7.142 -5.708 1.00 6.08 N +ATOM 1176 CA VAL A 147 -18.621 5.978 -5.435 1.00 6.08 C +ATOM 1177 C VAL A 147 -20.048 6.427 -5.126 1.00 6.08 C +ATOM 1178 CB VAL A 147 -18.061 5.139 -4.264 1.00 6.08 C +ATOM 1179 O VAL A 147 -20.261 7.305 -4.287 1.00 6.08 O +ATOM 1180 CG1 VAL A 147 -18.638 3.725 -4.289 1.00 6.08 C +ATOM 1181 CG2 VAL A 147 -16.535 5.098 -4.321 1.00 6.08 C +ATOM 1182 N ASP A 148 -20.960 6.728 -6.190 1.00 6.08 N +ATOM 1183 CA ASP A 148 -22.394 6.829 -5.938 1.00 6.08 C +ATOM 1184 C ASP A 148 -22.901 5.619 -5.157 1.00 6.08 C +ATOM 1185 CB ASP A 148 -23.162 6.965 -7.254 1.00 6.08 C +ATOM 1186 O ASP A 148 -22.505 4.485 -5.432 1.00 6.08 O +ATOM 1187 CG ASP A 148 -22.902 8.285 -7.959 1.00 6.08 C +ATOM 1188 OD1 ASP A 148 -23.140 8.380 -9.182 1.00 6.08 O +ATOM 1189 OD2 ASP A 148 -22.451 9.237 -7.286 1.00 6.08 O +TER 1190 ASP A 148 +ENDMDL +END diff --git a/alphafold/alphafold/relax/testdata/with_violations_casp14.pdb b/alphafold/alphafold/relax/testdata/with_violations_casp14.pdb new file mode 100644 index 0000000000000000000000000000000000000000..1a1aeb1f3437c7e3eabff6f0b1e183f0fee05fc6 --- /dev/null +++ b/alphafold/alphafold/relax/testdata/with_violations_casp14.pdb @@ -0,0 +1,1193 @@ +MODEL 0 +ATOM 1 N SER A 1 27.311 -3.395 37.375 1.00 8.64 N +ATOM 2 CA SER A 1 26.072 -4.109 37.084 1.00 8.64 C +ATOM 3 C SER A 1 26.047 -4.608 35.643 1.00 8.64 C +ATOM 4 CB SER A 1 24.862 -3.211 37.342 1.00 8.64 C +ATOM 5 O SER A 1 26.782 -4.101 34.792 1.00 8.64 O +ATOM 6 OG SER A 1 24.740 -2.228 36.329 1.00 8.64 O +ATOM 7 N PHE A 2 25.619 -5.987 35.357 1.00 8.64 N +ATOM 8 CA PHE A 2 25.448 -6.479 33.995 1.00 8.64 C +ATOM 9 C PHE A 2 25.049 -5.347 33.056 1.00 8.64 C +ATOM 10 CB PHE A 2 24.395 -7.591 33.953 1.00 8.64 C +ATOM 11 O PHE A 2 25.590 -5.226 31.955 1.00 8.64 O +ATOM 12 CG PHE A 2 24.140 -8.134 32.573 1.00 8.64 C +ATOM 13 CD1 PHE A 2 25.003 -9.063 32.006 1.00 8.64 C +ATOM 14 CD2 PHE A 2 23.036 -7.714 31.842 1.00 8.64 C +ATOM 15 CE1 PHE A 2 24.770 -9.567 30.728 1.00 8.64 C +ATOM 16 CE2 PHE A 2 22.796 -8.214 30.565 1.00 8.64 C +ATOM 17 CZ PHE A 2 23.665 -9.139 30.010 1.00 8.64 C +ATOM 18 N GLU A 3 24.279 -4.453 33.583 1.00 8.64 N +ATOM 19 CA GLU A 3 23.756 -3.316 32.831 1.00 8.64 C +ATOM 20 C GLU A 3 24.858 -2.308 32.517 1.00 8.64 C +ATOM 21 CB GLU A 3 22.624 -2.635 33.604 1.00 8.64 C +ATOM 22 O GLU A 3 24.963 -1.828 31.387 1.00 8.64 O +ATOM 23 CG GLU A 3 21.251 -3.239 33.345 1.00 8.64 C +ATOM 24 CD GLU A 3 20.291 -3.067 34.511 1.00 8.64 C +ATOM 25 OE1 GLU A 3 19.129 -3.525 34.413 1.00 8.64 O +ATOM 26 OE2 GLU A 3 20.702 -2.469 35.530 1.00 8.64 O +ATOM 27 N GLU A 4 25.795 -2.118 33.499 1.00 8.64 N +ATOM 28 CA GLU A 4 26.873 -1.150 33.321 1.00 8.64 C +ATOM 29 C GLU A 4 27.923 -1.667 32.341 1.00 8.64 C +ATOM 30 CB GLU A 4 27.526 -0.820 34.666 1.00 8.64 C +ATOM 31 O GLU A 4 28.401 -0.920 31.485 1.00 8.64 O +ATOM 32 CG GLU A 4 26.709 0.130 35.529 1.00 8.64 C +ATOM 33 CD GLU A 4 27.351 0.416 36.878 1.00 8.64 C +ATOM 34 OE1 GLU A 4 26.801 1.234 37.650 1.00 8.64 O +ATOM 35 OE2 GLU A 4 28.412 -0.182 37.164 1.00 8.64 O +ATOM 36 N GLN A 5 28.078 -2.983 32.335 1.00 8.64 N +ATOM 37 CA GLN A 5 29.050 -3.614 31.449 1.00 8.64 C +ATOM 38 C GLN A 5 28.520 -3.696 30.020 1.00 8.64 C +ATOM 39 CB GLN A 5 29.410 -5.012 31.956 1.00 8.64 C +ATOM 40 O GLN A 5 29.268 -3.487 29.063 1.00 8.64 O +ATOM 41 CG GLN A 5 30.587 -5.031 32.922 1.00 8.64 C +ATOM 42 CD GLN A 5 30.906 -6.425 33.430 1.00 8.64 C +ATOM 43 NE2 GLN A 5 31.803 -6.509 34.407 1.00 8.64 N +ATOM 44 OE1 GLN A 5 30.350 -7.418 32.950 1.00 8.64 O +ATOM 45 N PHE A 6 27.127 -3.824 29.849 1.00 8.64 N +ATOM 46 CA PHE A 6 26.442 -3.868 28.562 1.00 8.64 C +ATOM 47 C PHE A 6 26.501 -2.512 27.870 1.00 8.64 C +ATOM 48 CB PHE A 6 24.983 -4.302 28.744 1.00 8.64 C +ATOM 49 O PHE A 6 26.819 -2.429 26.682 1.00 8.64 O +ATOM 50 CG PHE A 6 24.232 -4.461 27.450 1.00 8.64 C +ATOM 51 CD1 PHE A 6 24.326 -5.636 26.715 1.00 8.64 C +ATOM 52 CD2 PHE A 6 23.431 -3.434 26.968 1.00 8.64 C +ATOM 53 CE1 PHE A 6 23.631 -5.786 25.517 1.00 8.64 C +ATOM 54 CE2 PHE A 6 22.734 -3.576 25.771 1.00 8.64 C +ATOM 55 CZ PHE A 6 22.836 -4.753 25.047 1.00 8.64 C +ATOM 56 N ILE A 7 26.367 -1.421 28.620 1.00 8.64 N +ATOM 57 CA ILE A 7 26.395 -0.058 28.103 1.00 8.64 C +ATOM 58 C ILE A 7 27.816 0.304 27.677 1.00 8.64 C +ATOM 59 CB ILE A 7 25.874 0.954 29.148 1.00 8.64 C +ATOM 60 O ILE A 7 28.020 0.896 26.614 1.00 8.64 O +ATOM 61 CG1 ILE A 7 24.383 0.725 29.417 1.00 8.64 C +ATOM 62 CG2 ILE A 7 26.133 2.391 28.685 1.00 8.64 C +ATOM 63 CD1 ILE A 7 23.831 1.540 30.579 1.00 8.64 C +ATOM 64 N LYS A 8 28.765 -0.137 28.420 1.00 8.64 N +ATOM 65 CA LYS A 8 30.171 0.158 28.160 1.00 8.64 C +ATOM 66 C LYS A 8 30.668 -0.584 26.922 1.00 8.64 C +ATOM 67 CB LYS A 8 31.030 -0.210 29.371 1.00 8.64 C +ATOM 68 O LYS A 8 31.368 -0.008 26.086 1.00 8.64 O +ATOM 69 CG LYS A 8 32.396 0.462 29.387 1.00 8.64 C +ATOM 70 CD LYS A 8 33.170 0.123 30.655 1.00 8.64 C +ATOM 71 CE LYS A 8 34.584 0.686 30.615 1.00 8.64 C +ATOM 72 NZ LYS A 8 35.350 0.348 31.852 1.00 8.64 N +ATOM 73 N ASN A 9 30.138 -1.772 26.738 1.00 8.64 N +ATOM 74 CA ASN A 9 30.622 -2.602 25.640 1.00 8.64 C +ATOM 75 C ASN A 9 29.908 -2.274 24.332 1.00 8.64 C +ATOM 76 CB ASN A 9 30.461 -4.086 25.976 1.00 8.64 C +ATOM 77 O ASN A 9 30.396 -2.610 23.252 1.00 8.64 O +ATOM 78 CG ASN A 9 31.429 -4.551 27.046 1.00 8.64 C +ATOM 79 ND2 ASN A 9 31.123 -5.682 27.670 1.00 8.64 N +ATOM 80 OD1 ASN A 9 32.442 -3.898 27.310 1.00 8.64 O +ATOM 81 N ASN A 10 28.860 -1.389 24.447 1.00 8.64 N +ATOM 82 CA ASN A 10 28.104 -1.128 23.227 1.00 8.64 C +ATOM 83 C ASN A 10 28.029 0.366 22.923 1.00 8.64 C +ATOM 84 CB ASN A 10 26.697 -1.720 23.330 1.00 8.64 C +ATOM 85 O ASN A 10 27.356 0.778 21.977 1.00 8.64 O +ATOM 86 CG ASN A 10 26.693 -3.234 23.250 1.00 8.64 C +ATOM 87 ND2 ASN A 10 26.544 -3.888 24.396 1.00 8.64 N +ATOM 88 OD1 ASN A 10 26.823 -3.811 22.167 1.00 8.64 O +ATOM 89 N SER A 11 28.833 1.149 23.636 1.00 8.64 N +ATOM 90 CA SER A 11 28.835 2.602 23.500 1.00 8.64 C +ATOM 91 C SER A 11 29.617 3.040 22.266 1.00 8.64 C +ATOM 92 CB SER A 11 29.427 3.257 24.748 1.00 8.64 C +ATOM 93 O SER A 11 29.395 4.132 21.740 1.00 8.64 O +ATOM 94 OG SER A 11 30.701 2.712 25.046 1.00 8.64 O +ATOM 95 N ASP A 12 30.212 2.067 21.630 1.00 8.64 N +ATOM 96 CA ASP A 12 30.855 2.541 20.408 1.00 8.64 C +ATOM 97 C ASP A 12 29.975 2.284 19.188 1.00 8.64 C +ATOM 98 CB ASP A 12 32.218 1.871 20.224 1.00 8.64 C +ATOM 99 O ASP A 12 30.218 2.836 18.113 1.00 8.64 O +ATOM 100 CG ASP A 12 33.270 2.391 21.189 1.00 8.64 C +ATOM 101 OD1 ASP A 12 34.250 1.668 21.471 1.00 8.64 O +ATOM 102 OD2 ASP A 12 33.116 3.533 21.673 1.00 8.64 O +ATOM 103 N SER A 13 28.711 1.753 19.485 1.00 8.64 N +ATOM 104 CA SER A 13 27.850 1.458 18.344 1.00 8.64 C +ATOM 105 C SER A 13 26.738 2.492 18.209 1.00 8.64 C +ATOM 106 CB SER A 13 27.245 0.060 18.477 1.00 8.64 C +ATOM 107 O SER A 13 26.268 3.040 19.208 1.00 8.64 O +ATOM 108 OG SER A 13 26.522 -0.062 19.690 1.00 8.64 O +ATOM 109 N ASN A 14 26.876 3.556 17.578 1.00 8.64 N +ATOM 110 CA ASN A 14 25.876 4.507 17.103 1.00 8.64 C +ATOM 111 C ASN A 14 24.502 3.857 16.973 1.00 8.64 C +ATOM 112 CB ASN A 14 26.306 5.114 15.766 1.00 8.64 C +ATOM 113 O ASN A 14 23.638 4.361 16.252 1.00 8.64 O +ATOM 114 CG ASN A 14 27.367 6.185 15.925 1.00 8.64 C +ATOM 115 ND2 ASN A 14 28.105 6.452 14.854 1.00 8.64 N +ATOM 116 OD1 ASN A 14 27.523 6.767 17.002 1.00 8.64 O +ATOM 117 N ILE A 15 24.147 2.876 17.739 1.00 8.64 N +ATOM 118 CA ILE A 15 22.782 2.392 17.562 1.00 8.64 C +ATOM 119 C ILE A 15 21.867 3.040 18.600 1.00 8.64 C +ATOM 120 CB ILE A 15 22.709 0.853 17.670 1.00 8.64 C +ATOM 121 O ILE A 15 22.173 3.037 19.794 1.00 8.64 O +ATOM 122 CG1 ILE A 15 23.583 0.200 16.594 1.00 8.64 C +ATOM 123 CG2 ILE A 15 21.259 0.372 17.564 1.00 8.64 C +ATOM 124 CD1 ILE A 15 23.694 -1.313 16.720 1.00 8.64 C +ATOM 125 N LEU A 16 21.054 3.988 18.304 1.00 8.64 N +ATOM 126 CA LEU A 16 19.978 4.667 19.017 1.00 8.64 C +ATOM 127 C LEU A 16 18.932 3.668 19.501 1.00 8.64 C +ATOM 128 CB LEU A 16 19.320 5.718 18.120 1.00 8.64 C +ATOM 129 O LEU A 16 18.483 2.813 18.734 1.00 8.64 O +ATOM 130 CG LEU A 16 20.096 7.021 17.921 1.00 8.64 C +ATOM 131 CD1 LEU A 16 19.696 7.681 16.605 1.00 8.64 C +ATOM 132 CD2 LEU A 16 19.860 7.968 19.093 1.00 8.64 C +ATOM 133 N ALA A 17 18.869 3.238 20.703 1.00 8.64 N +ATOM 134 CA ALA A 17 17.774 2.555 21.387 1.00 8.64 C +ATOM 135 C ALA A 17 16.496 3.388 21.343 1.00 8.64 C +ATOM 136 CB ALA A 17 18.158 2.251 22.833 1.00 8.64 C +ATOM 137 O ALA A 17 16.550 4.620 21.358 1.00 8.64 O +ATOM 138 N PRO A 18 15.357 2.800 20.785 1.00 8.64 N +ATOM 139 CA PRO A 18 14.061 3.472 20.894 1.00 8.64 C +ATOM 140 C PRO A 18 13.755 3.936 22.317 1.00 8.64 C +ATOM 141 CB PRO A 18 13.067 2.397 20.446 1.00 8.64 C +ATOM 142 O PRO A 18 14.149 3.277 23.283 1.00 8.64 O +ATOM 143 CG PRO A 18 13.852 1.125 20.452 1.00 8.64 C +ATOM 144 CD PRO A 18 15.296 1.456 20.699 1.00 8.64 C +ATOM 145 N LYS A 19 13.655 5.179 22.533 1.00 8.64 N +ATOM 146 CA LYS A 19 13.091 5.770 23.743 1.00 8.64 C +ATOM 147 C LYS A 19 11.590 5.512 23.832 1.00 8.64 C +ATOM 148 CB LYS A 19 13.369 7.273 23.786 1.00 8.64 C +ATOM 149 O LYS A 19 10.851 5.783 22.884 1.00 8.64 O +ATOM 150 CG LYS A 19 14.728 7.635 24.367 1.00 8.64 C +ATOM 151 CD LYS A 19 14.887 9.143 24.519 1.00 8.64 C +ATOM 152 CE LYS A 19 16.267 9.509 25.048 1.00 8.64 C +ATOM 153 NZ LYS A 19 16.425 10.986 25.206 1.00 8.64 N +ATOM 154 N VAL A 20 11.044 4.381 24.383 1.00 8.64 N +ATOM 155 CA VAL A 20 9.629 4.231 24.706 1.00 8.64 C +ATOM 156 C VAL A 20 9.274 5.116 25.898 1.00 8.64 C +ATOM 157 CB VAL A 20 9.268 2.759 25.009 1.00 8.64 C +ATOM 158 O VAL A 20 9.977 5.115 26.911 1.00 8.64 O +ATOM 159 CG1 VAL A 20 7.753 2.575 25.067 1.00 8.64 C +ATOM 160 CG2 VAL A 20 9.882 1.833 23.960 1.00 8.64 C +ATOM 161 N SER A 21 8.650 6.317 25.693 1.00 8.64 N +ATOM 162 CA SER A 21 8.096 7.229 26.687 1.00 8.64 C +ATOM 163 C SER A 21 7.175 6.497 27.657 1.00 8.64 C +ATOM 164 CB SER A 21 7.332 8.365 26.005 1.00 8.64 C +ATOM 165 O SER A 21 6.372 5.657 27.245 1.00 8.64 O +ATOM 166 OG SER A 21 5.963 8.343 26.373 1.00 8.64 O +ATOM 167 N GLN A 22 7.597 6.311 28.856 1.00 8.64 N +ATOM 168 CA GLN A 22 6.871 5.820 30.022 1.00 8.64 C +ATOM 169 C GLN A 22 5.495 6.472 30.128 1.00 8.64 C +ATOM 170 CB GLN A 22 7.672 6.073 31.300 1.00 8.64 C +ATOM 171 O GLN A 22 4.544 5.852 30.609 1.00 8.64 O +ATOM 172 CG GLN A 22 8.650 4.958 31.644 1.00 8.64 C +ATOM 173 CD GLN A 22 9.489 5.270 32.869 1.00 8.64 C +ATOM 174 NE2 GLN A 22 10.341 4.329 33.260 1.00 8.64 N +ATOM 175 OE1 GLN A 22 9.372 6.349 33.460 1.00 8.64 O +ATOM 176 N SER A 23 5.264 7.531 29.349 1.00 8.64 N +ATOM 177 CA SER A 23 4.000 8.243 29.506 1.00 8.64 C +ATOM 178 C SER A 23 2.897 7.603 28.670 1.00 8.64 C +ATOM 179 CB SER A 23 4.160 9.713 29.115 1.00 8.64 C +ATOM 180 O SER A 23 1.719 7.671 29.029 1.00 8.64 O +ATOM 181 OG SER A 23 4.522 9.834 27.751 1.00 8.64 O +ATOM 182 N VAL A 24 3.264 6.700 27.791 1.00 8.64 N +ATOM 183 CA VAL A 24 2.305 6.038 26.913 1.00 8.64 C +ATOM 184 C VAL A 24 1.784 4.767 27.581 1.00 8.64 C +ATOM 185 CB VAL A 24 2.931 5.700 25.541 1.00 8.64 C +ATOM 186 O VAL A 24 0.599 4.443 27.474 1.00 8.64 O +ATOM 187 CG1 VAL A 24 1.954 4.895 24.686 1.00 8.64 C +ATOM 188 CG2 VAL A 24 3.350 6.979 24.818 1.00 8.64 C +ATOM 189 N ILE A 25 2.491 4.247 28.597 1.00 8.64 N +ATOM 190 CA ILE A 25 2.093 2.989 29.220 1.00 8.64 C +ATOM 191 C ILE A 25 1.071 3.261 30.322 1.00 8.64 C +ATOM 192 CB ILE A 25 3.311 2.231 29.793 1.00 8.64 C +ATOM 193 O ILE A 25 0.106 2.509 30.482 1.00 8.64 O +ATOM 194 CG1 ILE A 25 4.253 1.802 28.662 1.00 8.64 C +ATOM 195 CG2 ILE A 25 2.856 1.021 30.615 1.00 8.64 C +ATOM 196 CD1 ILE A 25 5.548 1.162 29.144 1.00 8.64 C +ATOM 197 N LYS A 26 0.966 4.583 30.669 1.00 8.64 N +ATOM 198 CA LYS A 26 0.057 4.828 31.785 1.00 8.64 C +ATOM 199 C LYS A 26 -1.334 5.210 31.288 1.00 8.64 C +ATOM 200 CB LYS A 26 0.608 5.928 32.694 1.00 8.64 C +ATOM 201 O LYS A 26 -2.335 4.927 31.951 1.00 8.64 O +ATOM 202 CG LYS A 26 1.656 5.444 33.686 1.00 8.64 C +ATOM 203 CD LYS A 26 2.100 6.562 34.621 1.00 8.64 C +ATOM 204 CE LYS A 26 3.222 6.107 35.544 1.00 8.64 C +ATOM 205 NZ LYS A 26 3.671 7.205 36.452 1.00 8.64 N +ATOM 206 N SER A 27 -1.519 5.405 29.984 1.00 8.64 N +ATOM 207 CA SER A 27 -2.818 5.830 29.472 1.00 8.64 C +ATOM 208 C SER A 27 -3.593 4.654 28.886 1.00 8.64 C +ATOM 209 CB SER A 27 -2.647 6.918 28.412 1.00 8.64 C +ATOM 210 O SER A 27 -4.818 4.714 28.757 1.00 8.64 O +ATOM 211 OG SER A 27 -1.783 7.941 28.876 1.00 8.64 O +ATOM 212 N ILE A 28 -3.005 3.525 29.012 1.00 8.64 N +ATOM 213 CA ILE A 28 -3.699 2.421 28.358 1.00 8.64 C +ATOM 214 C ILE A 28 -4.341 1.519 29.410 1.00 8.64 C +ATOM 215 CB ILE A 28 -2.741 1.603 27.463 1.00 8.64 C +ATOM 216 O ILE A 28 -5.121 0.624 29.076 1.00 8.64 O +ATOM 217 CG1 ILE A 28 -2.140 2.495 26.370 1.00 8.64 C +ATOM 218 CG2 ILE A 28 -3.468 0.402 26.851 1.00 8.64 C +ATOM 219 CD1 ILE A 28 -1.059 1.814 25.541 1.00 8.64 C +ATOM 220 N LYS A 29 -4.577 2.107 30.648 1.00 8.64 N +ATOM 221 CA LYS A 29 -5.233 1.333 31.698 1.00 8.64 C +ATOM 222 C LYS A 29 -6.750 1.358 31.533 1.00 8.64 C +ATOM 223 CB LYS A 29 -4.847 1.867 33.078 1.00 8.64 C +ATOM 224 O LYS A 29 -7.358 2.430 31.493 1.00 8.64 O +ATOM 225 CG LYS A 29 -3.666 1.147 33.712 1.00 8.64 C +ATOM 226 CD LYS A 29 -3.402 1.645 35.127 1.00 8.64 C +ATOM 227 CE LYS A 29 -2.190 0.960 35.745 1.00 8.64 C +ATOM 228 NZ LYS A 29 -1.924 1.448 37.131 1.00 8.64 N +ATOM 229 N GLY A 30 -7.229 1.083 30.294 1.00 8.64 N +ATOM 230 CA GLY A 30 -8.601 0.618 30.176 1.00 8.64 C +ATOM 231 C GLY A 30 -8.899 -0.029 28.837 1.00 8.64 C +ATOM 232 O GLY A 30 -9.937 -0.674 28.670 1.00 8.64 O +ATOM 233 N ILE A 31 -7.830 -0.266 28.050 1.00 8.64 N +ATOM 234 CA ILE A 31 -8.106 -0.892 26.762 1.00 8.64 C +ATOM 235 C ILE A 31 -7.458 -2.274 26.711 1.00 8.64 C +ATOM 236 CB ILE A 31 -7.601 -0.021 25.590 1.00 8.64 C +ATOM 237 O ILE A 31 -6.281 -2.428 27.045 1.00 8.64 O +ATOM 238 CG1 ILE A 31 -8.334 1.326 25.572 1.00 8.64 C +ATOM 239 CG2 ILE A 31 -7.773 -0.756 24.258 1.00 8.64 C +ATOM 240 CD1 ILE A 31 -7.778 2.319 24.562 1.00 8.64 C +ATOM 241 N LYS A 32 -8.177 -3.230 27.032 1.00 8.64 N +ATOM 242 CA LYS A 32 -7.883 -4.648 26.851 1.00 8.64 C +ATOM 243 C LYS A 32 -7.261 -4.910 25.482 1.00 8.64 C +ATOM 244 CB LYS A 32 -9.152 -5.485 27.018 1.00 8.64 C +ATOM 245 O LYS A 32 -7.777 -4.449 24.461 1.00 8.64 O +ATOM 246 CG LYS A 32 -9.602 -5.645 28.463 1.00 8.64 C +ATOM 247 CD LYS A 32 -10.735 -6.656 28.587 1.00 8.64 C +ATOM 248 CE LYS A 32 -11.232 -6.767 30.022 1.00 8.64 C +ATOM 249 NZ LYS A 32 -12.323 -7.777 30.154 1.00 8.64 N +ATOM 250 N SER A 33 -5.945 -4.505 25.154 1.00 8.64 N +ATOM 251 CA SER A 33 -4.816 -4.797 24.277 1.00 8.64 C +ATOM 252 C SER A 33 -5.289 -5.219 22.890 1.00 8.64 C +ATOM 253 CB SER A 33 -3.937 -5.894 24.880 1.00 8.64 C +ATOM 254 O SER A 33 -6.134 -6.107 22.759 1.00 8.64 O +ATOM 255 OG SER A 33 -4.706 -7.046 25.181 1.00 8.64 O +ATOM 256 N LYS A 34 -5.506 -4.290 21.907 1.00 8.64 N +ATOM 257 CA LYS A 34 -5.176 -4.717 20.550 1.00 8.64 C +ATOM 258 C LYS A 34 -3.963 -3.963 20.015 1.00 8.64 C +ATOM 259 CB LYS A 34 -6.372 -4.514 19.618 1.00 8.64 C +ATOM 260 O LYS A 34 -3.833 -2.755 20.227 1.00 8.64 O +ATOM 261 CG LYS A 34 -7.490 -5.528 19.815 1.00 8.64 C +ATOM 262 CD LYS A 34 -8.616 -5.321 18.811 1.00 8.64 C +ATOM 263 CE LYS A 34 -9.773 -6.278 19.062 1.00 8.64 C +ATOM 264 NZ LYS A 34 -10.875 -6.087 18.072 1.00 8.64 N +ATOM 265 N HIS A 35 -2.824 -4.493 19.949 1.00 8.64 N +ATOM 266 CA HIS A 35 -1.491 -4.114 19.495 1.00 8.64 C +ATOM 267 C HIS A 35 -1.527 -3.581 18.066 1.00 8.64 C +ATOM 268 CB HIS A 35 -0.535 -5.304 19.588 1.00 8.64 C +ATOM 269 O HIS A 35 -2.122 -4.202 17.182 1.00 8.64 O +ATOM 270 CG HIS A 35 -0.328 -5.799 20.983 1.00 8.64 C +ATOM 271 CD2 HIS A 35 -0.455 -7.038 21.515 1.00 8.64 C +ATOM 272 ND1 HIS A 35 0.057 -4.973 22.017 1.00 8.64 N +ATOM 273 CE1 HIS A 35 0.158 -5.684 23.127 1.00 8.64 C +ATOM 274 NE2 HIS A 35 -0.147 -6.940 22.850 1.00 8.64 N +ATOM 275 N VAL A 36 -1.503 -2.286 17.829 1.00 8.64 N +ATOM 276 CA VAL A 36 -1.192 -1.701 16.529 1.00 8.64 C +ATOM 277 C VAL A 36 0.304 -1.410 16.437 1.00 8.64 C +ATOM 278 CB VAL A 36 -2.002 -0.410 16.279 1.00 8.64 C +ATOM 279 O VAL A 36 0.894 -0.861 17.371 1.00 8.64 O +ATOM 280 CG1 VAL A 36 -1.660 0.188 14.915 1.00 8.64 C +ATOM 281 CG2 VAL A 36 -3.500 -0.692 16.381 1.00 8.64 C +ATOM 282 N PHE A 37 1.020 -2.124 15.486 1.00 8.64 N +ATOM 283 CA PHE A 37 2.422 -1.855 15.187 1.00 8.64 C +ATOM 284 C PHE A 37 2.551 -0.928 13.985 1.00 8.64 C +ATOM 285 CB PHE A 37 3.177 -3.162 14.926 1.00 8.64 C +ATOM 286 O PHE A 37 1.807 -1.060 13.010 1.00 8.64 O +ATOM 287 CG PHE A 37 3.251 -4.071 16.124 1.00 8.64 C +ATOM 288 CD1 PHE A 37 2.301 -5.066 16.318 1.00 8.64 C +ATOM 289 CD2 PHE A 37 4.270 -3.928 17.057 1.00 8.64 C +ATOM 290 CE1 PHE A 37 2.367 -5.908 17.426 1.00 8.64 C +ATOM 291 CE2 PHE A 37 4.342 -4.766 18.166 1.00 8.64 C +ATOM 292 CZ PHE A 37 3.389 -5.755 18.349 1.00 8.64 C +ATOM 293 N GLU A 38 3.248 0.202 14.094 1.00 8.64 N +ATOM 294 CA GLU A 38 3.645 1.092 13.007 1.00 8.64 C +ATOM 295 C GLU A 38 5.086 0.830 12.578 1.00 8.64 C +ATOM 296 CB GLU A 38 3.477 2.556 13.421 1.00 8.64 C +ATOM 297 O GLU A 38 5.981 0.731 13.419 1.00 8.64 O +ATOM 298 CG GLU A 38 2.545 3.348 12.515 1.00 8.64 C +ATOM 299 CD GLU A 38 2.381 4.798 12.943 1.00 8.64 C +ATOM 300 OE1 GLU A 38 1.724 5.575 12.214 1.00 8.64 O +ATOM 301 OE2 GLU A 38 2.914 5.159 14.016 1.00 8.64 O +ATOM 302 N LEU A 39 5.280 0.263 11.288 1.00 8.64 N +ATOM 303 CA LEU A 39 6.615 0.024 10.751 1.00 8.64 C +ATOM 304 C LEU A 39 7.133 1.253 10.013 1.00 8.64 C +ATOM 305 CB LEU A 39 6.607 -1.185 9.811 1.00 8.64 C +ATOM 306 O LEU A 39 6.371 1.936 9.324 1.00 8.64 O +ATOM 307 CG LEU A 39 6.486 -2.558 10.474 1.00 8.64 C +ATOM 308 CD1 LEU A 39 5.969 -3.586 9.473 1.00 8.64 C +ATOM 309 CD2 LEU A 39 7.829 -2.994 11.050 1.00 8.64 C +ATOM 310 N PRO A 40 8.338 1.782 10.282 1.00 8.64 N +ATOM 311 CA PRO A 40 8.943 2.928 9.599 1.00 8.64 C +ATOM 312 C PRO A 40 9.200 2.662 8.117 1.00 8.64 C +ATOM 313 CB PRO A 40 10.259 3.133 10.353 1.00 8.64 C +ATOM 314 O PRO A 40 9.522 1.534 7.735 1.00 8.64 O +ATOM 315 CG PRO A 40 10.482 1.852 11.090 1.00 8.64 C +ATOM 316 CD PRO A 40 9.238 1.017 10.981 1.00 8.64 C +ATOM 317 N ILE A 41 8.660 3.312 7.012 1.00 8.64 N +ATOM 318 CA ILE A 41 8.626 3.183 5.560 1.00 8.64 C +ATOM 319 C ILE A 41 9.887 3.798 4.958 1.00 8.64 C +ATOM 320 CB ILE A 41 7.367 3.850 4.962 1.00 8.64 C +ATOM 321 O ILE A 41 10.222 4.950 5.244 1.00 8.64 O +ATOM 322 CG1 ILE A 41 6.099 3.238 5.570 1.00 8.64 C +ATOM 323 CG2 ILE A 41 7.360 3.722 3.436 1.00 8.64 C +ATOM 324 CD1 ILE A 41 4.813 3.939 5.155 1.00 8.64 C +ATOM 325 N ASN A 42 10.941 3.063 4.710 1.00 8.64 N +ATOM 326 CA ASN A 42 11.934 3.552 3.759 1.00 8.64 C +ATOM 327 C ASN A 42 11.614 3.106 2.335 1.00 8.64 C +ATOM 328 CB ASN A 42 13.336 3.085 4.159 1.00 8.64 C +ATOM 329 O ASN A 42 10.806 2.198 2.131 1.00 8.64 O +ATOM 330 CG ASN A 42 13.525 1.591 3.986 1.00 8.64 C +ATOM 331 ND2 ASN A 42 14.569 1.051 4.604 1.00 8.64 N +ATOM 332 OD1 ASN A 42 12.741 0.928 3.303 1.00 8.64 O +ATOM 333 N ASP A 43 11.701 4.001 1.461 1.00 8.64 N +ATOM 334 CA ASP A 43 11.331 4.253 0.072 1.00 8.64 C +ATOM 335 C ASP A 43 11.757 3.096 -0.829 1.00 8.64 C +ATOM 336 CB ASP A 43 11.956 5.561 -0.421 1.00 8.64 C +ATOM 337 O ASP A 43 11.082 2.788 -1.813 1.00 8.64 O +ATOM 338 CG ASP A 43 11.313 6.793 0.191 1.00 8.64 C +ATOM 339 OD1 ASP A 43 11.900 7.893 0.108 1.00 8.64 O +ATOM 340 OD2 ASP A 43 10.210 6.661 0.764 1.00 8.64 O +ATOM 341 N LYS A 44 12.353 2.046 -0.514 1.00 8.64 N +ATOM 342 CA LYS A 44 12.727 0.989 -1.449 1.00 8.64 C +ATOM 343 C LYS A 44 11.978 -0.305 -1.142 1.00 8.64 C +ATOM 344 CB LYS A 44 14.236 0.744 -1.407 1.00 8.64 C +ATOM 345 O LYS A 44 11.810 -1.154 -2.021 1.00 8.64 O +ATOM 346 CG LYS A 44 15.059 1.832 -2.080 1.00 8.64 C +ATOM 347 CD LYS A 44 16.537 1.468 -2.124 1.00 8.64 C +ATOM 348 CE LYS A 44 17.370 2.584 -2.741 1.00 8.64 C +ATOM 349 NZ LYS A 44 18.820 2.229 -2.793 1.00 8.64 N +ATOM 350 N THR A 45 11.103 -0.291 -0.142 1.00 8.64 N +ATOM 351 CA THR A 45 10.454 -1.552 0.197 1.00 8.64 C +ATOM 352 C THR A 45 8.939 -1.437 0.054 1.00 8.64 C +ATOM 353 CB THR A 45 10.805 -1.993 1.630 1.00 8.64 C +ATOM 354 O THR A 45 8.223 -2.436 0.149 1.00 8.64 O +ATOM 355 CG2 THR A 45 12.095 -2.806 1.656 1.00 8.64 C +ATOM 356 OG1 THR A 45 10.968 -0.832 2.454 1.00 8.64 O +ATOM 357 N LYS A 46 8.412 -0.546 -0.642 1.00 8.64 N +ATOM 358 CA LYS A 46 6.961 -0.392 -0.700 1.00 8.64 C +ATOM 359 C LYS A 46 6.386 -1.066 -1.942 1.00 8.64 C +ATOM 360 CB LYS A 46 6.578 1.089 -0.682 1.00 8.64 C +ATOM 361 O LYS A 46 6.699 -0.675 -3.068 1.00 8.64 O +ATOM 362 CG LYS A 46 6.727 1.750 0.680 1.00 8.64 C +ATOM 363 CD LYS A 46 6.243 3.195 0.656 1.00 8.64 C +ATOM 364 CE LYS A 46 6.459 3.880 1.998 1.00 8.64 C +ATOM 365 NZ LYS A 46 6.003 5.302 1.974 1.00 8.64 N +ATOM 366 N ARG A 47 6.500 -2.491 -2.290 1.00 8.64 N +ATOM 367 CA ARG A 47 5.304 -2.979 -2.968 1.00 8.64 C +ATOM 368 C ARG A 47 5.112 -4.474 -2.731 1.00 8.64 C +ATOM 369 CB ARG A 47 5.382 -2.692 -4.469 1.00 8.64 C +ATOM 370 O ARG A 47 5.990 -5.276 -3.055 1.00 8.64 O +ATOM 371 CG ARG A 47 4.430 -1.603 -4.938 1.00 8.64 C +ATOM 372 CD ARG A 47 4.526 -1.379 -6.440 1.00 8.64 C +ATOM 373 NE ARG A 47 4.838 0.011 -6.759 1.00 8.64 N +ATOM 374 NH1 ARG A 47 4.576 -0.237 -9.041 1.00 8.64 N +ATOM 375 NH2 ARG A 47 5.152 1.801 -8.164 1.00 8.64 N +ATOM 376 CZ ARG A 47 4.854 0.522 -7.987 1.00 8.64 C +ATOM 377 N TYR A 48 4.776 -5.036 -1.672 1.00 8.64 N +ATOM 378 CA TYR A 48 4.245 -6.394 -1.657 1.00 8.64 C +ATOM 379 C TYR A 48 2.731 -6.390 -1.828 1.00 8.64 C +ATOM 380 CB TYR A 48 4.621 -7.104 -0.353 1.00 8.64 C +ATOM 381 O TYR A 48 2.027 -5.622 -1.168 1.00 8.64 O +ATOM 382 CG TYR A 48 6.098 -7.385 -0.219 1.00 8.64 C +ATOM 383 CD1 TYR A 48 6.931 -6.518 0.484 1.00 8.64 C +ATOM 384 CD2 TYR A 48 6.663 -8.518 -0.795 1.00 8.64 C +ATOM 385 CE1 TYR A 48 8.293 -6.772 0.609 1.00 8.64 C +ATOM 386 CE2 TYR A 48 8.024 -8.782 -0.677 1.00 8.64 C +ATOM 387 OH TYR A 48 10.177 -8.161 0.146 1.00 8.64 O +ATOM 388 CZ TYR A 48 8.829 -7.905 0.026 1.00 8.64 C +ATOM 389 N ILE A 49 2.115 -6.489 -3.067 1.00 8.64 N +ATOM 390 CA ILE A 49 0.852 -6.880 -3.684 1.00 8.64 C +ATOM 391 C ILE A 49 0.101 -7.837 -2.761 1.00 8.64 C +ATOM 392 CB ILE A 49 1.076 -7.534 -5.066 1.00 8.64 C +ATOM 393 O ILE A 49 0.588 -8.929 -2.459 1.00 8.64 O +ATOM 394 CG1 ILE A 49 1.810 -6.567 -6.002 1.00 8.64 C +ATOM 395 CG2 ILE A 49 -0.256 -7.981 -5.674 1.00 8.64 C +ATOM 396 CD1 ILE A 49 2.101 -7.142 -7.381 1.00 8.64 C +ATOM 397 N LEU A 50 -0.593 -7.592 -1.660 1.00 8.64 N +ATOM 398 CA LEU A 50 -1.573 -8.173 -0.750 1.00 8.64 C +ATOM 399 C LEU A 50 -2.949 -8.245 -1.405 1.00 8.64 C +ATOM 400 CB LEU A 50 -1.653 -7.358 0.544 1.00 8.64 C +ATOM 401 O LEU A 50 -3.384 -7.289 -2.050 1.00 8.64 O +ATOM 402 CG LEU A 50 -0.484 -7.515 1.517 1.00 8.64 C +ATOM 403 CD1 LEU A 50 -0.441 -6.339 2.488 1.00 8.64 C +ATOM 404 CD2 LEU A 50 -0.591 -8.835 2.273 1.00 8.64 C +ATOM 405 N GLY A 51 -3.407 -9.384 -2.202 1.00 8.64 N +ATOM 406 CA GLY A 51 -4.655 -10.100 -1.989 1.00 8.64 C +ATOM 407 C GLY A 51 -5.574 -10.070 -3.195 1.00 8.64 C +ATOM 408 O GLY A 51 -6.476 -9.233 -3.274 1.00 8.64 O +ATOM 409 N ALA A 52 -5.228 -10.625 -4.456 1.00 8.64 N +ATOM 410 CA ALA A 52 -6.350 -10.631 -5.391 1.00 8.64 C +ATOM 411 C ALA A 52 -6.952 -12.027 -5.518 1.00 8.64 C +ATOM 412 CB ALA A 52 -5.905 -10.121 -6.760 1.00 8.64 C +ATOM 413 O ALA A 52 -6.245 -12.989 -5.829 1.00 8.64 O +ATOM 414 N THR A 53 -7.821 -12.550 -4.658 1.00 8.64 N +ATOM 415 CA THR A 53 -8.645 -13.723 -4.929 1.00 8.64 C +ATOM 416 C THR A 53 -9.877 -13.343 -5.745 1.00 8.64 C +ATOM 417 CB THR A 53 -9.083 -14.411 -3.622 1.00 8.64 C +ATOM 418 O THR A 53 -10.285 -12.180 -5.756 1.00 8.64 O +ATOM 419 CG2 THR A 53 -7.877 -14.908 -2.831 1.00 8.64 C +ATOM 420 OG1 THR A 53 -9.815 -13.477 -2.820 1.00 8.64 O +ATOM 421 N GLU A 54 -10.028 -13.989 -6.922 1.00 8.64 N +ATOM 422 CA GLU A 54 -11.170 -13.968 -7.831 1.00 8.64 C +ATOM 423 C GLU A 54 -12.473 -13.725 -7.074 1.00 8.64 C +ATOM 424 CB GLU A 54 -11.256 -15.279 -8.618 1.00 8.64 C +ATOM 425 O GLU A 54 -13.399 -13.109 -7.604 1.00 8.64 O +ATOM 426 CG GLU A 54 -10.288 -15.357 -9.789 1.00 8.64 C +ATOM 427 CD GLU A 54 -10.430 -16.635 -10.601 1.00 8.64 C +ATOM 428 OE1 GLU A 54 -9.704 -16.798 -11.608 1.00 8.64 O +ATOM 429 OE2 GLU A 54 -11.276 -17.478 -10.228 1.00 8.64 O +ATOM 430 N THR A 55 -12.360 -13.799 -5.890 1.00 8.64 N +ATOM 431 CA THR A 55 -13.448 -13.571 -4.946 1.00 8.64 C +ATOM 432 C THR A 55 -13.101 -12.439 -3.983 1.00 8.64 C +ATOM 433 CB THR A 55 -13.771 -14.847 -4.146 1.00 8.64 C +ATOM 434 O THR A 55 -11.941 -12.282 -3.594 1.00 8.64 O +ATOM 435 CG2 THR A 55 -14.391 -15.915 -5.041 1.00 8.64 C +ATOM 436 OG1 THR A 55 -12.563 -15.363 -3.573 1.00 8.64 O +ATOM 437 N LYS A 56 -13.303 -11.292 -4.478 1.00 8.64 N +ATOM 438 CA LYS A 56 -13.121 -9.990 -3.842 1.00 8.64 C +ATOM 439 C LYS A 56 -12.513 -10.138 -2.450 1.00 8.64 C +ATOM 440 CB LYS A 56 -14.454 -9.244 -3.755 1.00 8.64 C +ATOM 441 O LYS A 56 -13.231 -10.124 -1.449 1.00 8.64 O +ATOM 442 CG LYS A 56 -15.022 -8.833 -5.105 1.00 8.64 C +ATOM 443 CD LYS A 56 -16.241 -7.932 -4.948 1.00 8.64 C +ATOM 444 CE LYS A 56 -16.839 -7.558 -6.298 1.00 8.64 C +ATOM 445 NZ LYS A 56 -18.009 -6.643 -6.150 1.00 8.64 N +ATOM 446 N GLU A 57 -11.444 -10.923 -2.365 1.00 8.64 N +ATOM 447 CA GLU A 57 -10.922 -10.869 -1.003 1.00 8.64 C +ATOM 448 C GLU A 57 -9.945 -9.710 -0.832 1.00 8.64 C +ATOM 449 CB GLU A 57 -10.241 -12.190 -0.635 1.00 8.64 C +ATOM 450 O GLU A 57 -9.129 -9.443 -1.717 1.00 8.64 O +ATOM 451 CG GLU A 57 -11.101 -13.108 0.221 1.00 8.64 C +ATOM 452 CD GLU A 57 -10.378 -14.373 0.656 1.00 8.64 C +ATOM 453 OE1 GLU A 57 -10.943 -15.149 1.461 1.00 8.64 O +ATOM 454 OE2 GLU A 57 -9.238 -14.590 0.190 1.00 8.64 O +ATOM 455 N GLU A 58 -10.407 -8.718 -0.201 1.00 8.64 N +ATOM 456 CA GLU A 58 -9.599 -7.616 0.312 1.00 8.64 C +ATOM 457 C GLU A 58 -8.294 -8.124 0.918 1.00 8.64 C +ATOM 458 CB GLU A 58 -10.384 -6.812 1.352 1.00 8.64 C +ATOM 459 O GLU A 58 -8.299 -9.054 1.728 1.00 8.64 O +ATOM 460 CG GLU A 58 -10.114 -5.315 1.303 1.00 8.64 C +ATOM 461 CD GLU A 58 -10.947 -4.523 2.298 1.00 8.64 C +ATOM 462 OE1 GLU A 58 -10.733 -3.296 2.428 1.00 8.64 O +ATOM 463 OE2 GLU A 58 -11.819 -5.134 2.955 1.00 8.64 O +ATOM 464 N VAL A 59 -7.183 -8.070 0.289 1.00 6.72 N +ATOM 465 CA VAL A 59 -5.863 -8.557 0.675 1.00 6.72 C +ATOM 466 C VAL A 59 -5.151 -7.505 1.523 1.00 6.72 C +ATOM 467 CB VAL A 59 -5.006 -8.915 -0.560 1.00 6.72 C +ATOM 468 O VAL A 59 -4.402 -7.842 2.442 1.00 6.72 O +ATOM 469 CG1 VAL A 59 -3.820 -9.790 -0.159 1.00 6.72 C +ATOM 470 CG2 VAL A 59 -5.860 -9.616 -1.615 1.00 6.72 C +ATOM 471 N LEU A 60 -5.923 -6.877 2.559 1.00 6.72 N +ATOM 472 CA LEU A 60 -5.509 -6.065 3.699 1.00 6.72 C +ATOM 473 C LEU A 60 -5.287 -4.615 3.281 1.00 6.72 C +ATOM 474 CB LEU A 60 -4.231 -6.631 4.324 1.00 6.72 C +ATOM 475 O LEU A 60 -4.724 -4.351 2.216 1.00 6.72 O +ATOM 476 CG LEU A 60 -4.398 -7.870 5.205 1.00 6.72 C +ATOM 477 CD1 LEU A 60 -3.064 -8.591 5.363 1.00 6.72 C +ATOM 478 CD2 LEU A 60 -4.969 -7.486 6.565 1.00 6.72 C +ATOM 479 N PRO A 61 -6.061 -3.706 3.745 1.00 6.72 N +ATOM 480 CA PRO A 61 -5.827 -2.294 3.434 1.00 6.72 C +ATOM 481 C PRO A 61 -4.391 -1.859 3.717 1.00 6.72 C +ATOM 482 CB PRO A 61 -6.810 -1.563 4.353 1.00 6.72 C +ATOM 483 O PRO A 61 -3.782 -2.317 4.687 1.00 6.72 O +ATOM 484 CG PRO A 61 -7.183 -2.571 5.392 1.00 6.72 C +ATOM 485 CD PRO A 61 -6.789 -3.933 4.898 1.00 6.72 C +ATOM 486 N ASN A 62 -3.671 -1.566 2.620 1.00 6.72 N +ATOM 487 CA ASN A 62 -2.420 -0.834 2.785 1.00 6.72 C +ATOM 488 C ASN A 62 -2.630 0.672 2.655 1.00 6.72 C +ATOM 489 CB ASN A 62 -1.379 -1.315 1.772 1.00 6.72 C +ATOM 490 O ASN A 62 -3.578 1.117 2.004 1.00 6.72 O +ATOM 491 CG ASN A 62 -0.729 -2.622 2.178 1.00 6.72 C +ATOM 492 ND2 ASN A 62 -0.250 -3.376 1.195 1.00 6.72 N +ATOM 493 OD1 ASN A 62 -0.659 -2.953 3.364 1.00 6.72 O +ATOM 494 N TYR A 63 -2.223 1.347 3.620 1.00 6.72 N +ATOM 495 CA TYR A 63 -2.253 2.806 3.627 1.00 6.72 C +ATOM 496 C TYR A 63 -0.969 3.381 3.043 1.00 6.72 C +ATOM 497 CB TYR A 63 -2.461 3.332 5.050 1.00 6.72 C +ATOM 498 O TYR A 63 0.099 2.774 3.157 1.00 6.72 O +ATOM 499 CG TYR A 63 -3.732 2.841 5.700 1.00 6.72 C +ATOM 500 CD1 TYR A 63 -3.747 1.663 6.442 1.00 6.72 C +ATOM 501 CD2 TYR A 63 -4.920 3.553 5.571 1.00 6.72 C +ATOM 502 CE1 TYR A 63 -4.917 1.205 7.041 1.00 6.72 C +ATOM 503 CE2 TYR A 63 -6.095 3.105 6.166 1.00 6.72 C +ATOM 504 OH TYR A 63 -7.244 1.484 7.488 1.00 6.72 O +ATOM 505 CZ TYR A 63 -6.083 1.932 6.898 1.00 6.72 C +ATOM 506 N VAL A 64 -1.142 4.342 2.173 1.00 4.66 N +ATOM 507 CA VAL A 64 -0.000 5.090 1.658 1.00 4.66 C +ATOM 508 C VAL A 64 -0.129 6.561 2.046 1.00 4.66 C +ATOM 509 CB VAL A 64 0.125 4.951 0.125 1.00 4.66 C +ATOM 510 O VAL A 64 -1.219 7.133 1.982 1.00 4.66 O +ATOM 511 CG1 VAL A 64 -1.005 5.701 -0.579 1.00 4.66 C +ATOM 512 CG2 VAL A 64 1.485 5.462 -0.348 1.00 4.66 C +ATOM 513 N LYS A 65 0.916 7.003 2.673 1.00 6.72 N +ATOM 514 CA LYS A 65 0.982 8.432 2.966 1.00 6.72 C +ATOM 515 C LYS A 65 1.692 9.190 1.848 1.00 6.72 C +ATOM 516 CB LYS A 65 1.693 8.674 4.298 1.00 6.72 C +ATOM 517 O LYS A 65 2.804 8.830 1.455 1.00 6.72 O +ATOM 518 CG LYS A 65 1.604 10.110 4.795 1.00 6.72 C +ATOM 519 CD LYS A 65 2.207 10.258 6.186 1.00 6.72 C +ATOM 520 CE LYS A 65 2.153 11.701 6.669 1.00 6.72 C +ATOM 521 NZ LYS A 65 2.726 11.848 8.040 1.00 6.72 N +ATOM 522 N VAL A 66 1.057 10.179 1.205 1.00 6.72 N +ATOM 523 CA VAL A 66 1.588 11.120 0.224 1.00 6.72 C +ATOM 524 C VAL A 66 1.485 12.544 0.766 1.00 6.72 C +ATOM 525 CB VAL A 66 0.847 11.009 -1.127 1.00 6.72 C +ATOM 526 O VAL A 66 0.389 13.105 0.851 1.00 6.72 O +ATOM 527 CG1 VAL A 66 1.477 11.935 -2.166 1.00 6.72 C +ATOM 528 CG2 VAL A 66 0.854 9.564 -1.622 1.00 6.72 C +ATOM 529 N GLY A 67 2.645 13.103 1.210 1.00 6.72 N +ATOM 530 CA GLY A 67 2.556 14.375 1.909 1.00 6.72 C +ATOM 531 C GLY A 67 1.847 14.273 3.247 1.00 6.72 C +ATOM 532 O GLY A 67 2.248 13.488 4.109 1.00 6.72 O +ATOM 533 N SER A 68 0.772 15.228 3.461 1.00 6.72 N +ATOM 534 CA SER A 68 -0.022 15.225 4.685 1.00 6.72 C +ATOM 535 C SER A 68 -1.250 14.332 4.545 1.00 6.72 C +ATOM 536 CB SER A 68 -0.453 16.647 5.048 1.00 6.72 C +ATOM 537 O SER A 68 -2.061 14.234 5.469 1.00 6.72 O +ATOM 538 OG SER A 68 -1.210 17.226 3.999 1.00 6.72 O +ATOM 539 N ASP A 69 -1.295 13.620 3.451 1.00 6.72 N +ATOM 540 CA ASP A 69 -2.507 12.844 3.203 1.00 6.72 C +ATOM 541 C ASP A 69 -2.237 11.347 3.332 1.00 6.72 C +ATOM 542 CB ASP A 69 -3.071 13.160 1.816 1.00 6.72 C +ATOM 543 O ASP A 69 -1.146 10.877 3.002 1.00 6.72 O +ATOM 544 CG ASP A 69 -3.522 14.603 1.673 1.00 6.72 C +ATOM 545 OD1 ASP A 69 -3.312 15.204 0.598 1.00 6.72 O +ATOM 546 OD2 ASP A 69 -4.090 15.144 2.646 1.00 6.72 O +ATOM 547 N LEU A 70 -3.211 10.550 3.934 1.00 4.66 N +ATOM 548 CA LEU A 70 -3.196 9.096 4.057 1.00 4.66 C +ATOM 549 C LEU A 70 -4.202 8.459 3.105 1.00 4.66 C +ATOM 550 CB LEU A 70 -3.502 8.677 5.498 1.00 4.66 C +ATOM 551 O LEU A 70 -5.357 8.886 3.039 1.00 4.66 O +ATOM 552 CG LEU A 70 -3.258 7.207 5.842 1.00 4.66 C +ATOM 553 CD1 LEU A 70 -1.767 6.890 5.788 1.00 4.66 C +ATOM 554 CD2 LEU A 70 -3.830 6.877 7.216 1.00 4.66 C +ATOM 555 N TYR A 71 -3.655 7.568 2.260 1.00 4.66 N +ATOM 556 CA TYR A 71 -4.497 6.862 1.300 1.00 4.66 C +ATOM 557 C TYR A 71 -4.630 5.390 1.671 1.00 4.66 C +ATOM 558 CB TYR A 71 -3.926 6.994 -0.115 1.00 4.66 C +ATOM 559 O TYR A 71 -3.674 4.774 2.148 1.00 4.66 O +ATOM 560 CG TYR A 71 -3.900 8.412 -0.629 1.00 4.66 C +ATOM 561 CD1 TYR A 71 -2.852 9.272 -0.307 1.00 4.66 C +ATOM 562 CD2 TYR A 71 -4.923 8.897 -1.437 1.00 4.66 C +ATOM 563 CE1 TYR A 71 -2.824 10.581 -0.777 1.00 4.66 C +ATOM 564 CE2 TYR A 71 -4.906 10.204 -1.913 1.00 4.66 C +ATOM 565 OH TYR A 71 -3.832 12.332 -2.046 1.00 4.66 O +ATOM 566 CZ TYR A 71 -3.854 11.037 -1.578 1.00 4.66 C +ATOM 567 N ARG A 72 -5.791 4.900 1.584 1.00 4.66 N +ATOM 568 CA ARG A 72 -6.044 3.465 1.655 1.00 4.66 C +ATOM 569 C ARG A 72 -5.981 2.829 0.270 1.00 4.66 C +ATOM 570 CB ARG A 72 -7.406 3.190 2.296 1.00 4.66 C +ATOM 571 O ARG A 72 -6.604 3.321 -0.674 1.00 4.66 O +ATOM 572 CG ARG A 72 -7.679 1.717 2.555 1.00 4.66 C +ATOM 573 CD ARG A 72 -9.040 1.500 3.201 1.00 4.66 C +ATOM 574 NE ARG A 72 -9.274 0.091 3.505 1.00 4.66 N +ATOM 575 NH1 ARG A 72 -11.472 0.383 4.153 1.00 4.66 N +ATOM 576 NH2 ARG A 72 -10.528 -1.705 4.194 1.00 4.66 N +ATOM 577 CZ ARG A 72 -10.424 -0.407 3.950 1.00 4.66 C +ATOM 578 N LEU A 73 -5.092 1.875 0.180 1.00 4.66 N +ATOM 579 CA LEU A 73 -4.937 1.157 -1.080 1.00 4.66 C +ATOM 580 C LEU A 73 -5.727 -0.147 -1.064 1.00 4.66 C +ATOM 581 CB LEU A 73 -3.458 0.868 -1.354 1.00 4.66 C +ATOM 582 O LEU A 73 -5.700 -0.882 -0.074 1.00 4.66 O +ATOM 583 CG LEU A 73 -2.548 2.087 -1.518 1.00 4.66 C +ATOM 584 CD1 LEU A 73 -1.084 1.663 -1.481 1.00 4.66 C +ATOM 585 CD2 LEU A 73 -2.866 2.820 -2.817 1.00 4.66 C +ATOM 586 N LYS A 74 -6.458 -0.297 -2.040 1.00 4.66 N +ATOM 587 CA LYS A 74 -7.147 -1.567 -2.251 1.00 4.66 C +ATOM 588 C LYS A 74 -6.751 -2.192 -3.586 1.00 4.66 C +ATOM 589 CB LYS A 74 -8.662 -1.371 -2.193 1.00 4.66 C +ATOM 590 O LYS A 74 -6.697 -1.504 -4.608 1.00 4.66 O +ATOM 591 CG LYS A 74 -9.189 -1.022 -0.809 1.00 4.66 C +ATOM 592 CD LYS A 74 -10.710 -0.932 -0.796 1.00 4.66 C +ATOM 593 CE LYS A 74 -11.234 -0.515 0.572 1.00 4.66 C +ATOM 594 NZ LYS A 74 -12.725 -0.424 0.589 1.00 4.66 N +ATOM 595 N ALA A 75 -6.218 -3.399 -3.444 1.00 4.66 N +ATOM 596 CA ALA A 75 -5.851 -4.111 -4.666 1.00 4.66 C +ATOM 597 C ALA A 75 -6.823 -5.253 -4.948 1.00 4.66 C +ATOM 598 CB ALA A 75 -4.424 -4.644 -4.562 1.00 4.66 C +ATOM 599 O ALA A 75 -7.332 -5.887 -4.021 1.00 4.66 O +ATOM 600 N TYR A 76 -7.207 -5.295 -6.175 1.00 6.72 N +ATOM 601 CA TYR A 76 -8.028 -6.438 -6.558 1.00 6.72 C +ATOM 602 C TYR A 76 -7.576 -7.011 -7.896 1.00 6.72 C +ATOM 603 CB TYR A 76 -9.505 -6.039 -6.633 1.00 6.72 C +ATOM 604 O TYR A 76 -6.891 -6.335 -8.668 1.00 6.72 O +ATOM 605 CG TYR A 76 -9.757 -4.799 -7.457 1.00 6.72 C +ATOM 606 CD1 TYR A 76 -10.045 -4.889 -8.817 1.00 6.72 C +ATOM 607 CD2 TYR A 76 -9.707 -3.536 -6.878 1.00 6.72 C +ATOM 608 CE1 TYR A 76 -10.276 -3.750 -9.580 1.00 6.72 C +ATOM 609 CE2 TYR A 76 -9.937 -2.389 -7.631 1.00 6.72 C +ATOM 610 OH TYR A 76 -10.448 -1.375 -9.730 1.00 6.72 O +ATOM 611 CZ TYR A 76 -10.220 -2.506 -8.979 1.00 6.72 C +ATOM 612 N ARG A 77 -7.735 -8.365 -8.035 1.00 6.72 N +ATOM 613 CA ARG A 77 -7.400 -9.083 -9.261 1.00 6.72 C +ATOM 614 C ARG A 77 -8.658 -9.466 -10.033 1.00 6.72 C +ATOM 615 CB ARG A 77 -6.578 -10.335 -8.944 1.00 6.72 C +ATOM 616 O ARG A 77 -9.624 -9.964 -9.449 1.00 6.72 O +ATOM 617 CG ARG A 77 -6.025 -11.036 -10.174 1.00 6.72 C +ATOM 618 CD ARG A 77 -5.161 -12.233 -9.800 1.00 6.72 C +ATOM 619 NE ARG A 77 -4.366 -12.698 -10.933 1.00 6.72 N +ATOM 620 NH1 ARG A 77 -3.944 -14.788 -10.043 1.00 6.72 N +ATOM 621 NH2 ARG A 77 -3.103 -14.221 -12.098 1.00 6.72 N +ATOM 622 CZ ARG A 77 -3.806 -13.901 -11.022 1.00 6.72 C +ATOM 623 N GLU A 78 -8.703 -8.968 -11.357 1.00 6.72 N +ATOM 624 CA GLU A 78 -9.710 -9.433 -12.306 1.00 6.72 C +ATOM 625 C GLU A 78 -9.072 -10.231 -13.440 1.00 6.72 C +ATOM 626 CB GLU A 78 -10.500 -8.252 -12.875 1.00 6.72 C +ATOM 627 O GLU A 78 -7.847 -10.344 -13.513 1.00 6.72 O +ATOM 628 CG GLU A 78 -11.352 -7.528 -11.842 1.00 6.72 C +ATOM 629 CD GLU A 78 -12.234 -6.446 -12.444 1.00 6.72 C +ATOM 630 OE1 GLU A 78 -12.957 -5.760 -11.686 1.00 6.72 O +ATOM 631 OE2 GLU A 78 -12.203 -6.283 -13.684 1.00 6.72 O +ATOM 632 N LYS A 79 -9.991 -10.926 -14.239 1.00 6.72 N +ATOM 633 CA LYS A 79 -9.539 -11.713 -15.383 1.00 6.72 C +ATOM 634 C LYS A 79 -8.611 -10.898 -16.279 1.00 6.72 C +ATOM 635 CB LYS A 79 -10.735 -12.221 -16.191 1.00 6.72 C +ATOM 636 O LYS A 79 -7.610 -11.415 -16.778 1.00 6.72 O +ATOM 637 CG LYS A 79 -10.419 -13.415 -17.079 1.00 6.72 C +ATOM 638 CD LYS A 79 -11.665 -13.928 -17.790 1.00 6.72 C +ATOM 639 CE LYS A 79 -11.329 -15.033 -18.782 1.00 6.72 C +ATOM 640 NZ LYS A 79 -12.556 -15.601 -19.415 1.00 6.72 N +ATOM 641 N SER A 80 -8.775 -9.596 -16.232 1.00 6.72 N +ATOM 642 CA SER A 80 -8.111 -8.740 -17.209 1.00 6.72 C +ATOM 643 C SER A 80 -6.887 -8.057 -16.606 1.00 6.72 C +ATOM 644 CB SER A 80 -9.080 -7.685 -17.745 1.00 6.72 C +ATOM 645 O SER A 80 -6.072 -7.482 -17.329 1.00 6.72 O +ATOM 646 OG SER A 80 -9.634 -6.926 -16.684 1.00 6.72 O +ATOM 647 N GLY A 81 -6.705 -8.234 -15.324 1.00 6.72 N +ATOM 648 CA GLY A 81 -5.576 -7.527 -14.740 1.00 6.72 C +ATOM 649 C GLY A 81 -5.757 -7.232 -13.263 1.00 6.72 C +ATOM 650 O GLY A 81 -6.659 -7.775 -12.622 1.00 6.72 O +ATOM 651 N VAL A 82 -4.698 -6.651 -12.655 1.00 6.72 N +ATOM 652 CA VAL A 82 -4.661 -6.238 -11.256 1.00 6.72 C +ATOM 653 C VAL A 82 -4.972 -4.747 -11.149 1.00 6.72 C +ATOM 654 CB VAL A 82 -3.292 -6.545 -10.609 1.00 6.72 C +ATOM 655 O VAL A 82 -4.465 -3.943 -11.935 1.00 6.72 O +ATOM 656 CG1 VAL A 82 -3.263 -6.076 -9.156 1.00 6.72 C +ATOM 657 CG2 VAL A 82 -2.983 -8.039 -10.698 1.00 6.72 C +ATOM 658 N TYR A 83 -5.928 -4.428 -10.292 1.00 6.72 N +ATOM 659 CA TYR A 83 -6.336 -3.045 -10.073 1.00 6.72 C +ATOM 660 C TYR A 83 -5.965 -2.583 -8.668 1.00 6.72 C +ATOM 661 CB TYR A 83 -7.843 -2.888 -10.293 1.00 6.72 C +ATOM 662 O TYR A 83 -5.976 -3.376 -7.724 1.00 6.72 O +ATOM 663 CG TYR A 83 -8.298 -3.276 -11.679 1.00 6.72 C +ATOM 664 CD1 TYR A 83 -8.526 -4.610 -12.011 1.00 6.72 C +ATOM 665 CD2 TYR A 83 -8.499 -2.311 -12.660 1.00 6.72 C +ATOM 666 CE1 TYR A 83 -8.942 -4.973 -13.287 1.00 6.72 C +ATOM 667 CE2 TYR A 83 -8.916 -2.662 -13.940 1.00 6.72 C +ATOM 668 OH TYR A 83 -9.548 -4.347 -15.509 1.00 6.72 O +ATOM 669 CZ TYR A 83 -9.135 -3.993 -14.243 1.00 6.72 C +ATOM 670 N VAL A 84 -5.503 -1.346 -8.569 1.00 4.66 N +ATOM 671 CA VAL A 84 -5.269 -0.727 -7.268 1.00 4.66 C +ATOM 672 C VAL A 84 -6.170 0.496 -7.109 1.00 4.66 C +ATOM 673 CB VAL A 84 -3.788 -0.325 -7.089 1.00 4.66 C +ATOM 674 O VAL A 84 -6.240 1.343 -8.002 1.00 4.66 O +ATOM 675 CG1 VAL A 84 -3.573 0.352 -5.737 1.00 4.66 C +ATOM 676 CG2 VAL A 84 -2.884 -1.549 -7.227 1.00 4.66 C +ATOM 677 N ARG A 85 -6.913 0.488 -6.095 1.00 6.72 N +ATOM 678 CA ARG A 85 -7.754 1.633 -5.763 1.00 6.72 C +ATOM 679 C ARG A 85 -7.206 2.383 -4.553 1.00 6.72 C +ATOM 680 CB ARG A 85 -9.192 1.183 -5.492 1.00 6.72 C +ATOM 681 O ARG A 85 -6.730 1.766 -3.597 1.00 6.72 O +ATOM 682 CG ARG A 85 -10.184 2.329 -5.379 1.00 6.72 C +ATOM 683 CD ARG A 85 -11.596 1.828 -5.108 1.00 6.72 C +ATOM 684 NE ARG A 85 -12.400 1.796 -6.326 1.00 6.72 N +ATOM 685 NH1 ARG A 85 -14.250 0.839 -5.327 1.00 6.72 N +ATOM 686 NH2 ARG A 85 -14.283 1.347 -7.562 1.00 6.72 N +ATOM 687 CZ ARG A 85 -13.643 1.327 -6.402 1.00 6.72 C +ATOM 688 N THR A 86 -7.071 3.732 -4.691 1.00 6.72 N +ATOM 689 CA THR A 86 -6.621 4.528 -3.555 1.00 6.72 C +ATOM 690 C THR A 86 -7.733 5.453 -3.068 1.00 6.72 C +ATOM 691 CB THR A 86 -5.376 5.361 -3.914 1.00 6.72 C +ATOM 692 O THR A 86 -8.527 5.952 -3.868 1.00 6.72 O +ATOM 693 CG2 THR A 86 -4.246 4.471 -4.420 1.00 6.72 C +ATOM 694 OG1 THR A 86 -5.719 6.306 -4.935 1.00 6.72 O +ATOM 695 N ASN A 87 -7.936 5.475 -1.707 1.00 6.72 N +ATOM 696 CA ASN A 87 -8.831 6.444 -1.084 1.00 6.72 C +ATOM 697 C ASN A 87 -8.087 7.347 -0.105 1.00 6.72 C +ATOM 698 CB ASN A 87 -9.985 5.730 -0.376 1.00 6.72 C +ATOM 699 O ASN A 87 -7.297 6.868 0.711 1.00 6.72 O +ATOM 700 CG ASN A 87 -10.918 5.027 -1.342 1.00 6.72 C +ATOM 701 ND2 ASN A 87 -11.709 4.093 -0.828 1.00 6.72 N +ATOM 702 OD1 ASN A 87 -10.927 5.321 -2.540 1.00 6.72 O +ATOM 703 N LYS A 88 -8.092 8.633 -0.265 1.00 6.72 N +ATOM 704 CA LYS A 88 -7.558 9.565 0.724 1.00 6.72 C +ATOM 705 C LYS A 88 -8.305 9.448 2.049 1.00 6.72 C +ATOM 706 CB LYS A 88 -7.634 11.001 0.204 1.00 6.72 C +ATOM 707 O LYS A 88 -9.536 9.505 2.081 1.00 6.72 O +ATOM 708 CG LYS A 88 -6.902 12.014 1.072 1.00 6.72 C +ATOM 709 CD LYS A 88 -6.972 13.415 0.478 1.00 6.72 C +ATOM 710 CE LYS A 88 -6.293 14.439 1.377 1.00 6.72 C +ATOM 711 NZ LYS A 88 -6.372 15.816 0.806 1.00 6.72 N +ATOM 712 N LEU A 89 -7.493 9.040 3.089 1.00 6.72 N +ATOM 713 CA LEU A 89 -8.056 8.925 4.430 1.00 6.72 C +ATOM 714 C LEU A 89 -8.211 10.298 5.074 1.00 6.72 C +ATOM 715 CB LEU A 89 -7.174 8.033 5.307 1.00 6.72 C +ATOM 716 O LEU A 89 -7.367 11.177 4.884 1.00 6.72 O +ATOM 717 CG LEU A 89 -7.197 6.537 4.993 1.00 6.72 C +ATOM 718 CD1 LEU A 89 -6.028 5.834 5.676 1.00 6.72 C +ATOM 719 CD2 LEU A 89 -8.523 5.920 5.422 1.00 6.72 C +ATOM 720 N GLY A 90 -9.340 10.708 5.578 1.00 6.72 N +ATOM 721 CA GLY A 90 -9.715 11.894 6.333 1.00 6.72 C +ATOM 722 C GLY A 90 -10.588 12.851 5.544 1.00 6.72 C +ATOM 723 O GLY A 90 -11.001 13.892 6.061 1.00 6.72 O +ATOM 724 N PHE A 91 -10.821 12.471 4.312 1.00 8.64 N +ATOM 725 CA PHE A 91 -11.769 13.293 3.569 1.00 8.64 C +ATOM 726 C PHE A 91 -12.999 12.482 3.179 1.00 8.64 C +ATOM 727 CB PHE A 91 -11.109 13.881 2.318 1.00 8.64 C +ATOM 728 O PHE A 91 -12.889 11.479 2.471 1.00 8.64 O +ATOM 729 CG PHE A 91 -10.275 15.103 2.589 1.00 8.64 C +ATOM 730 CD1 PHE A 91 -8.918 14.989 2.865 1.00 8.64 C +ATOM 731 CD2 PHE A 91 -10.848 16.368 2.568 1.00 8.64 C +ATOM 732 CE1 PHE A 91 -8.143 16.119 3.117 1.00 8.64 C +ATOM 733 CE2 PHE A 91 -10.081 17.502 2.818 1.00 8.64 C +ATOM 734 CZ PHE A 91 -8.729 17.376 3.093 1.00 8.64 C +ATOM 735 N GLU A 92 -13.879 12.165 4.125 1.00 8.64 N +ATOM 736 CA GLU A 92 -15.112 11.423 3.881 1.00 8.64 C +ATOM 737 C GLU A 92 -16.103 12.251 3.067 1.00 8.64 C +ATOM 738 CB GLU A 92 -15.750 10.990 5.203 1.00 8.64 C +ATOM 739 O GLU A 92 -16.591 13.281 3.535 1.00 8.64 O +ATOM 740 CG GLU A 92 -15.244 9.651 5.721 1.00 8.64 C +ATOM 741 CD GLU A 92 -15.990 9.164 6.954 1.00 8.64 C +ATOM 742 OE1 GLU A 92 -15.708 8.041 7.429 1.00 8.64 O +ATOM 743 OE2 GLU A 92 -16.864 9.911 7.447 1.00 8.64 O +ATOM 744 N ASP A 93 -15.801 12.461 1.827 1.00 8.64 N +ATOM 745 CA ASP A 93 -17.029 12.844 1.137 1.00 8.64 C +ATOM 746 C ASP A 93 -17.790 11.614 0.648 1.00 8.64 C +ATOM 747 CB ASP A 93 -16.717 13.772 -0.039 1.00 8.64 C +ATOM 748 O ASP A 93 -17.320 10.899 -0.240 1.00 8.64 O +ATOM 749 CG ASP A 93 -17.958 14.419 -0.628 1.00 8.64 C +ATOM 750 OD1 ASP A 93 -17.828 15.359 -1.442 1.00 8.64 O +ATOM 751 OD2 ASP A 93 -19.076 13.986 -0.274 1.00 8.64 O +ATOM 752 N PRO A 94 -18.711 11.191 1.508 1.00 8.64 N +ATOM 753 CA PRO A 94 -19.501 10.003 1.175 1.00 8.64 C +ATOM 754 C PRO A 94 -20.029 10.028 -0.257 1.00 8.64 C +ATOM 755 CB PRO A 94 -20.652 10.050 2.183 1.00 8.64 C +ATOM 756 O PRO A 94 -20.234 8.972 -0.862 1.00 8.64 O +ATOM 757 CG PRO A 94 -20.438 11.316 2.948 1.00 8.64 C +ATOM 758 CD PRO A 94 -19.181 11.969 2.449 1.00 8.64 C +ATOM 759 N LYS A 95 -19.825 11.145 -1.002 1.00 8.64 N +ATOM 760 CA LYS A 95 -20.410 11.170 -2.340 1.00 8.64 C +ATOM 761 C LYS A 95 -19.342 11.416 -3.402 1.00 8.64 C +ATOM 762 CB LYS A 95 -21.496 12.243 -2.431 1.00 8.64 C +ATOM 763 O LYS A 95 -19.636 11.407 -4.599 1.00 8.64 O +ATOM 764 CG LYS A 95 -22.740 11.936 -1.610 1.00 8.64 C +ATOM 765 CD LYS A 95 -23.832 12.972 -1.841 1.00 8.64 C +ATOM 766 CE LYS A 95 -25.054 12.701 -0.973 1.00 8.64 C +ATOM 767 NZ LYS A 95 -26.134 13.705 -1.208 1.00 8.64 N +ATOM 768 N SER A 96 -18.077 11.513 -2.983 1.00 8.64 N +ATOM 769 CA SER A 96 -17.157 11.939 -4.032 1.00 8.64 C +ATOM 770 C SER A 96 -16.418 10.749 -4.635 1.00 8.64 C +ATOM 771 CB SER A 96 -16.149 12.950 -3.483 1.00 8.64 C +ATOM 772 O SER A 96 -15.813 9.955 -3.912 1.00 8.64 O +ATOM 773 OG SER A 96 -14.940 12.907 -4.222 1.00 8.64 O +ATOM 774 N PHE A 97 -16.938 10.059 -5.545 1.00 8.64 N +ATOM 775 CA PHE A 97 -16.265 9.188 -6.501 1.00 8.64 C +ATOM 776 C PHE A 97 -14.975 9.827 -7.000 1.00 8.64 C +ATOM 777 CB PHE A 97 -17.186 8.871 -7.683 1.00 8.64 C +ATOM 778 O PHE A 97 -14.111 9.144 -7.554 1.00 8.64 O +ATOM 779 CG PHE A 97 -18.358 7.998 -7.322 1.00 8.64 C +ATOM 780 CD1 PHE A 97 -19.593 8.558 -7.018 1.00 8.64 C +ATOM 781 CD2 PHE A 97 -18.224 6.616 -7.288 1.00 8.64 C +ATOM 782 CE1 PHE A 97 -20.679 7.752 -6.684 1.00 8.64 C +ATOM 783 CE2 PHE A 97 -19.305 5.804 -6.955 1.00 8.64 C +ATOM 784 CZ PHE A 97 -20.531 6.375 -6.652 1.00 8.64 C +ATOM 785 N LEU A 98 -14.602 11.045 -6.442 1.00 8.64 N +ATOM 786 CA LEU A 98 -13.538 11.768 -7.129 1.00 8.64 C +ATOM 787 C LEU A 98 -12.193 11.530 -6.451 1.00 8.64 C +ATOM 788 CB LEU A 98 -13.845 13.267 -7.166 1.00 8.64 C +ATOM 789 O LEU A 98 -11.141 11.781 -7.043 1.00 8.64 O +ATOM 790 CG LEU A 98 -14.980 13.704 -8.094 1.00 8.64 C +ATOM 791 CD1 LEU A 98 -15.347 15.161 -7.833 1.00 8.64 C +ATOM 792 CD2 LEU A 98 -14.586 13.500 -9.553 1.00 8.64 C +ATOM 793 N SER A 99 -12.192 10.556 -5.446 1.00 8.64 N +ATOM 794 CA SER A 99 -10.815 10.410 -4.984 1.00 8.64 C +ATOM 795 C SER A 99 -10.321 8.979 -5.164 1.00 8.64 C +ATOM 796 CB SER A 99 -10.696 10.819 -3.515 1.00 8.64 C +ATOM 797 O SER A 99 -9.273 8.607 -4.630 1.00 8.64 O +ATOM 798 OG SER A 99 -11.600 10.080 -2.712 1.00 8.64 O +ATOM 799 N ILE A 100 -11.121 8.337 -6.116 1.00 6.72 N +ATOM 800 CA ILE A 100 -10.638 6.974 -6.304 1.00 6.72 C +ATOM 801 C ILE A 100 -9.891 6.870 -7.632 1.00 6.72 C +ATOM 802 CB ILE A 100 -11.796 5.953 -6.259 1.00 6.72 C +ATOM 803 O ILE A 100 -10.389 7.318 -8.668 1.00 6.72 O +ATOM 804 CG1 ILE A 100 -12.507 6.010 -4.902 1.00 6.72 C +ATOM 805 CG2 ILE A 100 -11.282 4.539 -6.549 1.00 6.72 C +ATOM 806 CD1 ILE A 100 -13.793 5.197 -4.841 1.00 6.72 C +ATOM 807 N LYS A 101 -8.620 6.701 -7.581 1.00 6.72 N +ATOM 808 CA LYS A 101 -7.845 6.403 -8.782 1.00 6.72 C +ATOM 809 C LYS A 101 -7.608 4.902 -8.924 1.00 6.72 C +ATOM 810 CB LYS A 101 -6.507 7.144 -8.756 1.00 6.72 C +ATOM 811 O LYS A 101 -7.289 4.223 -7.946 1.00 6.72 O +ATOM 812 CG LYS A 101 -6.629 8.647 -8.958 1.00 6.72 C +ATOM 813 CD LYS A 101 -5.263 9.304 -9.110 1.00 6.72 C +ATOM 814 CE LYS A 101 -5.380 10.815 -9.257 1.00 6.72 C +ATOM 815 NZ LYS A 101 -4.046 11.459 -9.443 1.00 6.72 N +ATOM 816 N GLU A 102 -8.161 4.357 -9.913 1.00 8.64 N +ATOM 817 CA GLU A 102 -7.946 2.952 -10.245 1.00 8.64 C +ATOM 818 C GLU A 102 -6.847 2.794 -11.292 1.00 8.64 C +ATOM 819 CB GLU A 102 -9.244 2.312 -10.744 1.00 8.64 C +ATOM 820 O GLU A 102 -6.808 3.537 -12.275 1.00 8.64 O +ATOM 821 CG GLU A 102 -9.192 0.793 -10.818 1.00 8.64 C +ATOM 822 CD GLU A 102 -10.515 0.167 -11.229 1.00 8.64 C +ATOM 823 OE1 GLU A 102 -10.588 -0.435 -12.325 1.00 8.64 O +ATOM 824 OE2 GLU A 102 -11.488 0.280 -10.449 1.00 8.64 O +ATOM 825 N TYR A 103 -5.920 1.999 -10.999 1.00 6.72 N +ATOM 826 CA TYR A 103 -4.857 1.671 -11.943 1.00 6.72 C +ATOM 827 C TYR A 103 -5.001 0.241 -12.451 1.00 6.72 C +ATOM 828 CB TYR A 103 -3.483 1.857 -11.292 1.00 6.72 C +ATOM 829 O TYR A 103 -5.256 -0.679 -11.670 1.00 6.72 O +ATOM 830 CG TYR A 103 -3.244 3.253 -10.767 1.00 6.72 C +ATOM 831 CD1 TYR A 103 -3.589 3.595 -9.462 1.00 6.72 C +ATOM 832 CD2 TYR A 103 -2.676 4.231 -11.576 1.00 6.72 C +ATOM 833 CE1 TYR A 103 -3.372 4.880 -8.975 1.00 6.72 C +ATOM 834 CE2 TYR A 103 -2.455 5.519 -11.100 1.00 6.72 C +ATOM 835 OH TYR A 103 -2.589 7.107 -9.323 1.00 6.72 O +ATOM 836 CZ TYR A 103 -2.805 5.833 -9.800 1.00 6.72 C +ATOM 837 N LYS A 104 -5.083 -0.004 -13.802 1.00 8.64 N +ATOM 838 CA LYS A 104 -5.140 -1.339 -14.393 1.00 8.64 C +ATOM 839 C LYS A 104 -3.759 -1.796 -14.852 1.00 8.64 C +ATOM 840 CB LYS A 104 -6.119 -1.364 -15.568 1.00 8.64 C +ATOM 841 O LYS A 104 -3.042 -1.048 -15.520 1.00 8.64 O +ATOM 842 CG LYS A 104 -6.341 -2.749 -16.158 1.00 8.64 C +ATOM 843 CD LYS A 104 -7.313 -2.708 -17.331 1.00 8.64 C +ATOM 844 CE LYS A 104 -7.429 -4.065 -18.010 1.00 8.64 C +ATOM 845 NZ LYS A 104 -8.354 -4.022 -19.181 1.00 8.64 N +ATOM 846 N PHE A 105 -3.346 -2.868 -14.276 1.00 8.64 N +ATOM 847 CA PHE A 105 -2.144 -3.522 -14.782 1.00 8.64 C +ATOM 848 C PHE A 105 -2.504 -4.749 -15.611 1.00 8.64 C +ATOM 849 CB PHE A 105 -1.221 -3.921 -13.626 1.00 8.64 C +ATOM 850 O PHE A 105 -3.367 -5.537 -15.220 1.00 8.64 O +ATOM 851 CG PHE A 105 -0.739 -2.756 -12.804 1.00 8.64 C +ATOM 852 CD1 PHE A 105 -1.429 -2.357 -11.666 1.00 8.64 C +ATOM 853 CD2 PHE A 105 0.405 -2.059 -13.171 1.00 8.64 C +ATOM 854 CE1 PHE A 105 -0.985 -1.279 -10.904 1.00 8.64 C +ATOM 855 CE2 PHE A 105 0.855 -0.981 -12.414 1.00 8.64 C +ATOM 856 CZ PHE A 105 0.158 -0.592 -11.282 1.00 8.64 C +ATOM 857 N GLY A 106 -2.172 -4.885 -16.945 1.00 8.64 N +ATOM 858 CA GLY A 106 -2.470 -5.978 -17.858 1.00 8.64 C +ATOM 859 C GLY A 106 -1.496 -7.136 -17.740 1.00 8.64 C +ATOM 860 O GLY A 106 -0.364 -6.957 -17.287 1.00 8.64 O +ATOM 861 N THR A 107 -1.964 -8.404 -17.592 1.00 8.64 N +ATOM 862 CA THR A 107 -1.518 -9.786 -17.454 1.00 8.64 C +ATOM 863 C THR A 107 -0.972 -10.313 -18.777 1.00 8.64 C +ATOM 864 CB THR A 107 -2.662 -10.696 -16.969 1.00 8.64 C +ATOM 865 O THR A 107 -0.155 -11.237 -18.794 1.00 8.64 O +ATOM 866 CG2 THR A 107 -2.988 -10.435 -15.502 1.00 8.64 C +ATOM 867 OG1 THR A 107 -3.831 -10.446 -17.758 1.00 8.64 O +ATOM 868 N ARG A 108 -0.421 -9.500 -19.707 1.00 8.64 N +ATOM 869 CA ARG A 108 0.415 -10.048 -20.770 1.00 8.64 C +ATOM 870 C ARG A 108 0.370 -9.165 -22.012 1.00 8.64 C +ATOM 871 CB ARG A 108 -0.025 -11.471 -21.121 1.00 8.64 C +ATOM 872 O ARG A 108 1.162 -9.347 -22.939 1.00 8.64 O +ATOM 873 CG ARG A 108 0.888 -12.553 -20.567 1.00 8.64 C +ATOM 874 CD ARG A 108 0.437 -13.943 -20.992 1.00 8.64 C +ATOM 875 NE ARG A 108 1.440 -14.956 -20.674 1.00 8.64 N +ATOM 876 NH1 ARG A 108 0.214 -16.728 -21.506 1.00 8.64 N +ATOM 877 NH2 ARG A 108 2.286 -17.089 -20.593 1.00 8.64 N +ATOM 878 CZ ARG A 108 1.311 -16.255 -20.925 1.00 8.64 C +ATOM 879 N THR A 109 0.007 -7.906 -21.921 1.00 8.64 N +ATOM 880 CA THR A 109 0.199 -7.193 -23.179 1.00 8.64 C +ATOM 881 C THR A 109 0.557 -5.731 -22.923 1.00 8.64 C +ATOM 882 CB THR A 109 -1.060 -7.269 -24.063 1.00 8.64 C +ATOM 883 O THR A 109 -0.113 -5.050 -22.143 1.00 8.64 O +ATOM 884 CG2 THR A 109 -1.194 -8.643 -24.711 1.00 8.64 C +ATOM 885 OG1 THR A 109 -2.218 -7.018 -23.257 1.00 8.64 O +ATOM 886 N GLY A 110 1.725 -5.448 -22.409 1.00 8.64 N +ATOM 887 CA GLY A 110 2.620 -4.305 -22.494 1.00 8.64 C +ATOM 888 C GLY A 110 1.933 -3.044 -22.984 1.00 8.64 C +ATOM 889 O GLY A 110 1.499 -2.976 -24.136 1.00 8.64 O +ATOM 890 N GLY A 111 0.749 -2.551 -22.421 1.00 8.64 N +ATOM 891 CA GLY A 111 0.179 -1.258 -22.766 1.00 8.64 C +ATOM 892 C GLY A 111 1.093 -0.094 -22.431 1.00 8.64 C +ATOM 893 O GLY A 111 1.993 -0.225 -21.598 1.00 8.64 O +ATOM 894 N ASN A 112 1.646 0.666 -23.583 1.00 8.64 N +ATOM 895 CA ASN A 112 2.351 1.904 -23.896 1.00 8.64 C +ATOM 896 C ASN A 112 2.500 2.792 -22.664 1.00 8.64 C +ATOM 897 CB ASN A 112 1.633 2.664 -25.014 1.00 8.64 C +ATOM 898 O ASN A 112 1.528 3.028 -21.943 1.00 8.64 O +ATOM 899 CG ASN A 112 1.795 2.002 -26.368 1.00 8.64 C +ATOM 900 ND2 ASN A 112 0.868 2.277 -27.278 1.00 8.64 N +ATOM 901 OD1 ASN A 112 2.746 1.248 -26.594 1.00 8.64 O +ATOM 902 N PHE A 113 3.510 2.618 -21.947 1.00 8.64 N +ATOM 903 CA PHE A 113 4.082 3.644 -21.083 1.00 8.64 C +ATOM 904 C PHE A 113 4.194 4.972 -21.821 1.00 8.64 C +ATOM 905 CB PHE A 113 5.459 3.211 -20.570 1.00 8.64 C +ATOM 906 O PHE A 113 4.651 5.016 -22.966 1.00 8.64 O +ATOM 907 CG PHE A 113 5.526 3.047 -19.075 1.00 8.64 C +ATOM 908 CD1 PHE A 113 5.224 1.827 -18.482 1.00 8.64 C +ATOM 909 CD2 PHE A 113 5.890 4.113 -18.264 1.00 8.64 C +ATOM 910 CE1 PHE A 113 5.285 1.672 -17.099 1.00 8.64 C +ATOM 911 CE2 PHE A 113 5.953 3.966 -16.881 1.00 8.64 C +ATOM 912 CZ PHE A 113 5.649 2.745 -16.300 1.00 8.64 C +ATOM 913 N THR A 114 3.305 5.791 -21.704 1.00 8.64 N +ATOM 914 CA THR A 114 3.524 7.113 -22.280 1.00 8.64 C +ATOM 915 C THR A 114 4.409 7.959 -21.369 1.00 8.64 C +ATOM 916 CB THR A 114 2.190 7.843 -22.526 1.00 8.64 C +ATOM 917 O THR A 114 4.850 9.044 -21.756 1.00 8.64 O +ATOM 918 CG2 THR A 114 1.348 7.113 -23.568 1.00 8.64 C +ATOM 919 OG1 THR A 114 1.456 7.913 -21.298 1.00 8.64 O +ATOM 920 N GLY A 115 5.268 7.248 -20.677 1.00 8.64 N +ATOM 921 CA GLY A 115 6.263 8.086 -20.027 1.00 8.64 C +ATOM 922 C GLY A 115 7.507 7.322 -19.614 1.00 8.64 C +ATOM 923 O GLY A 115 7.525 6.090 -19.647 1.00 8.64 O +ATOM 924 N GLU A 116 8.641 7.657 -20.084 1.00 8.64 N +ATOM 925 CA GLU A 116 9.970 7.216 -19.672 1.00 8.64 C +ATOM 926 C GLU A 116 10.120 7.260 -18.154 1.00 8.64 C +ATOM 927 CB GLU A 116 11.051 8.077 -20.332 1.00 8.64 C +ATOM 928 O GLU A 116 9.646 8.194 -17.505 1.00 8.64 O +ATOM 929 CG GLU A 116 11.400 7.645 -21.749 1.00 8.64 C +ATOM 930 CD GLU A 116 12.569 8.417 -22.341 1.00 8.64 C +ATOM 931 OE1 GLU A 116 12.995 8.099 -23.474 1.00 8.64 O +ATOM 932 OE2 GLU A 116 13.062 9.347 -21.665 1.00 8.64 O +ATOM 933 N LEU A 117 10.088 5.989 -17.564 1.00 8.64 N +ATOM 934 CA LEU A 117 10.578 5.973 -16.190 1.00 8.64 C +ATOM 935 C LEU A 117 12.036 6.415 -16.127 1.00 8.64 C +ATOM 936 CB LEU A 117 10.430 4.575 -15.584 1.00 8.64 C +ATOM 937 O LEU A 117 12.809 6.155 -17.053 1.00 8.64 O +ATOM 938 CG LEU A 117 9.001 4.097 -15.323 1.00 8.64 C +ATOM 939 CD1 LEU A 117 8.989 2.601 -15.025 1.00 8.64 C +ATOM 940 CD2 LEU A 117 8.376 4.881 -14.175 1.00 8.64 C +ATOM 941 N THR A 118 12.196 7.278 -15.327 1.00 8.64 N +ATOM 942 CA THR A 118 13.590 7.626 -15.076 1.00 8.64 C +ATOM 943 C THR A 118 14.353 6.432 -14.511 1.00 8.64 C +ATOM 944 CB THR A 118 13.702 8.816 -14.105 1.00 8.64 C +ATOM 945 O THR A 118 13.747 5.457 -14.061 1.00 8.64 O +ATOM 946 CG2 THR A 118 12.896 10.011 -14.604 1.00 8.64 C +ATOM 947 OG1 THR A 118 13.207 8.424 -12.818 1.00 8.64 O +ATOM 948 N LYS A 119 15.698 6.199 -14.938 1.00 8.64 N +ATOM 949 CA LYS A 119 16.574 5.167 -14.391 1.00 8.64 C +ATOM 950 C LYS A 119 16.371 5.015 -12.886 1.00 8.64 C +ATOM 951 CB LYS A 119 18.038 5.489 -14.693 1.00 8.64 C +ATOM 952 O LYS A 119 16.303 3.897 -12.373 1.00 8.64 O +ATOM 953 CG LYS A 119 18.973 4.296 -14.566 1.00 8.64 C +ATOM 954 CD LYS A 119 20.389 4.646 -15.006 1.00 8.64 C +ATOM 955 CE LYS A 119 21.344 3.477 -14.803 1.00 8.64 C +ATOM 956 NZ LYS A 119 22.724 3.802 -15.272 1.00 8.64 N +ATOM 957 N GLN A 120 16.211 6.129 -12.176 1.00 8.64 N +ATOM 958 CA GLN A 120 16.025 6.126 -10.729 1.00 8.64 C +ATOM 959 C GLN A 120 14.683 5.507 -10.349 1.00 8.64 C +ATOM 960 CB GLN A 120 16.124 7.547 -10.171 1.00 8.64 C +ATOM 961 O GLN A 120 14.600 4.729 -9.396 1.00 8.64 O +ATOM 962 CG GLN A 120 17.540 7.960 -9.792 1.00 8.64 C +ATOM 963 CD GLN A 120 17.891 9.357 -10.270 1.00 8.64 C +ATOM 964 NE2 GLN A 120 19.145 9.751 -10.077 1.00 8.64 N +ATOM 965 OE1 GLN A 120 17.043 10.074 -10.809 1.00 8.64 O +ATOM 966 N GLU A 121 13.628 5.733 -11.076 1.00 8.64 N +ATOM 967 CA GLU A 121 12.298 5.200 -10.795 1.00 8.64 C +ATOM 968 C GLU A 121 12.253 3.689 -11.006 1.00 8.64 C +ATOM 969 CB GLU A 121 11.248 5.885 -11.674 1.00 8.64 C +ATOM 970 O GLU A 121 11.648 2.965 -10.213 1.00 8.64 O +ATOM 971 CG GLU A 121 10.953 7.323 -11.272 1.00 8.64 C +ATOM 972 CD GLU A 121 10.094 8.064 -12.284 1.00 8.64 C +ATOM 973 OE1 GLU A 121 9.364 9.002 -11.889 1.00 8.64 O +ATOM 974 OE2 GLU A 121 10.149 7.704 -13.481 1.00 8.64 O +ATOM 975 N LEU A 122 12.979 3.340 -12.063 1.00 8.64 N +ATOM 976 CA LEU A 122 13.046 1.913 -12.359 1.00 8.64 C +ATOM 977 C LEU A 122 13.813 1.168 -11.272 1.00 8.64 C +ATOM 978 CB LEU A 122 13.709 1.678 -13.719 1.00 8.64 C +ATOM 979 O LEU A 122 13.397 0.090 -10.840 1.00 8.64 O +ATOM 980 CG LEU A 122 12.936 0.805 -14.709 1.00 8.64 C +ATOM 981 CD1 LEU A 122 12.751 1.540 -16.032 1.00 8.64 C +ATOM 982 CD2 LEU A 122 13.653 -0.523 -14.925 1.00 8.64 C +ATOM 983 N VAL A 123 14.840 1.780 -10.710 1.00 8.64 N +ATOM 984 CA VAL A 123 15.653 1.191 -9.651 1.00 8.64 C +ATOM 985 C VAL A 123 14.832 1.085 -8.368 1.00 8.64 C +ATOM 986 CB VAL A 123 16.936 2.013 -9.397 1.00 8.64 C +ATOM 987 O VAL A 123 14.826 0.040 -7.712 1.00 8.64 O +ATOM 988 CG1 VAL A 123 17.646 1.529 -8.134 1.00 8.64 C +ATOM 989 CG2 VAL A 123 17.870 1.931 -10.603 1.00 8.64 C +ATOM 990 N TYR A 124 14.059 2.039 -8.098 1.00 8.64 N +ATOM 991 CA TYR A 124 13.254 2.069 -6.881 1.00 8.64 C +ATOM 992 C TYR A 124 12.121 1.051 -6.952 1.00 8.64 C +ATOM 993 CB TYR A 124 12.683 3.471 -6.649 1.00 8.64 C +ATOM 994 O TYR A 124 11.855 0.342 -5.979 1.00 8.64 O +ATOM 995 CG TYR A 124 13.673 4.438 -6.047 1.00 8.64 C +ATOM 996 CD1 TYR A 124 13.975 5.640 -6.682 1.00 8.64 C +ATOM 997 CD2 TYR A 124 14.309 4.151 -4.844 1.00 8.64 C +ATOM 998 CE1 TYR A 124 14.889 6.534 -6.133 1.00 8.64 C +ATOM 999 CE2 TYR A 124 15.225 5.037 -4.286 1.00 8.64 C +ATOM 1000 OH TYR A 124 16.413 7.105 -4.387 1.00 8.64 O +ATOM 1001 CZ TYR A 124 15.507 6.224 -4.936 1.00 8.64 C +ATOM 1002 N THR A 125 11.428 1.001 -8.096 1.00 6.72 N +ATOM 1003 CA THR A 125 10.313 0.078 -8.276 1.00 6.72 C +ATOM 1004 C THR A 125 10.789 -1.369 -8.188 1.00 6.72 C +ATOM 1005 CB THR A 125 9.609 0.308 -9.626 1.00 6.72 C +ATOM 1006 O THR A 125 10.169 -2.192 -7.510 1.00 6.72 O +ATOM 1007 CG2 THR A 125 8.382 -0.585 -9.767 1.00 6.72 C +ATOM 1008 OG1 THR A 125 9.202 1.679 -9.718 1.00 6.72 O +ATOM 1009 N ASN A 126 11.985 -1.576 -8.827 1.00 8.64 N +ATOM 1010 CA ASN A 126 12.563 -2.916 -8.803 1.00 8.64 C +ATOM 1011 C ASN A 126 13.002 -3.311 -7.396 1.00 8.64 C +ATOM 1012 CB ASN A 126 13.742 -3.009 -9.773 1.00 8.64 C +ATOM 1013 O ASN A 126 12.771 -4.442 -6.965 1.00 8.64 O +ATOM 1014 CG ASN A 126 13.310 -3.334 -11.189 1.00 8.64 C +ATOM 1015 ND2 ASN A 126 14.170 -3.035 -12.156 1.00 8.64 N +ATOM 1016 OD1 ASN A 126 12.211 -3.848 -11.413 1.00 8.64 O +ATOM 1017 N GLN A 127 13.590 -2.342 -6.627 1.00 8.64 N +ATOM 1018 CA GLN A 127 14.004 -2.576 -5.247 1.00 8.64 C +ATOM 1019 C GLN A 127 12.798 -2.827 -4.346 1.00 8.64 C +ATOM 1020 CB GLN A 127 14.814 -1.390 -4.721 1.00 8.64 C +ATOM 1021 O GLN A 127 12.824 -3.725 -3.501 1.00 8.64 O +ATOM 1022 CG GLN A 127 16.303 -1.478 -5.029 1.00 8.64 C +ATOM 1023 CD GLN A 127 17.083 -0.291 -4.496 1.00 8.64 C +ATOM 1024 NE2 GLN A 127 18.405 -0.421 -4.454 1.00 8.64 N +ATOM 1025 OE1 GLN A 127 16.503 0.734 -4.125 1.00 8.64 O +ATOM 1026 N TRP A 128 11.824 -2.167 -4.535 1.00 6.72 N +ATOM 1027 CA TRP A 128 10.602 -2.286 -3.746 1.00 6.72 C +ATOM 1028 C TRP A 128 9.926 -3.632 -3.989 1.00 6.72 C +ATOM 1029 CB TRP A 128 9.634 -1.147 -4.077 1.00 6.72 C +ATOM 1030 O TRP A 128 9.562 -4.331 -3.040 1.00 6.72 O +ATOM 1031 CG TRP A 128 8.375 -1.162 -3.264 1.00 6.72 C +ATOM 1032 CD1 TRP A 128 8.207 -0.675 -1.997 1.00 6.72 C +ATOM 1033 CD2 TRP A 128 7.108 -1.696 -3.661 1.00 6.72 C +ATOM 1034 CE2 TRP A 128 6.216 -1.497 -2.584 1.00 6.72 C +ATOM 1035 CE3 TRP A 128 6.641 -2.322 -4.824 1.00 6.72 C +ATOM 1036 NE1 TRP A 128 6.910 -0.874 -1.583 1.00 6.72 N +ATOM 1037 CH2 TRP A 128 4.449 -2.515 -3.786 1.00 6.72 C +ATOM 1038 CZ2 TRP A 128 4.880 -1.904 -2.637 1.00 6.72 C +ATOM 1039 CZ3 TRP A 128 5.311 -2.726 -4.874 1.00 6.72 C +ATOM 1040 N VAL A 129 9.837 -4.041 -5.286 1.00 6.72 N +ATOM 1041 CA VAL A 129 9.170 -5.280 -5.670 1.00 6.72 C +ATOM 1042 C VAL A 129 9.963 -6.477 -5.149 1.00 6.72 C +ATOM 1043 CB VAL A 129 8.999 -5.381 -7.203 1.00 6.72 C +ATOM 1044 O VAL A 129 9.389 -7.411 -4.585 1.00 6.72 O +ATOM 1045 CG1 VAL A 129 8.505 -6.771 -7.600 1.00 6.72 C +ATOM 1046 CG2 VAL A 129 8.036 -4.306 -7.703 1.00 6.72 C +ATOM 1047 N ASN A 130 11.351 -6.333 -5.277 1.00 8.64 N +ATOM 1048 CA ASN A 130 12.247 -7.407 -4.861 1.00 8.64 C +ATOM 1049 C ASN A 130 12.259 -7.571 -3.344 1.00 8.64 C +ATOM 1050 CB ASN A 130 13.664 -7.155 -5.379 1.00 8.64 C +ATOM 1051 O ASN A 130 12.263 -8.695 -2.837 1.00 8.64 O +ATOM 1052 CG ASN A 130 13.854 -7.617 -6.810 1.00 8.64 C +ATOM 1053 ND2 ASN A 130 14.863 -7.073 -7.481 1.00 8.64 N +ATOM 1054 OD1 ASN A 130 13.100 -8.457 -7.309 1.00 8.64 O +ATOM 1055 N GLU A 131 12.069 -6.443 -2.521 1.00 8.64 N +ATOM 1056 CA GLU A 131 12.094 -6.449 -1.061 1.00 8.64 C +ATOM 1057 C GLU A 131 10.759 -6.913 -0.488 1.00 8.64 C +ATOM 1058 CB GLU A 131 12.442 -5.058 -0.524 1.00 8.64 C +ATOM 1059 O GLU A 131 10.721 -7.591 0.541 1.00 8.64 O +ATOM 1060 CG GLU A 131 13.913 -4.694 -0.665 1.00 8.64 C +ATOM 1061 CD GLU A 131 14.234 -3.292 -0.171 1.00 8.64 C +ATOM 1062 OE1 GLU A 131 15.414 -2.879 -0.244 1.00 8.64 O +ATOM 1063 OE2 GLU A 131 13.299 -2.603 0.293 1.00 8.64 O +ATOM 1064 N ASN A 132 9.736 -6.720 -1.184 1.00 8.64 N +ATOM 1065 CA ASN A 132 8.429 -6.916 -0.566 1.00 8.64 C +ATOM 1066 C ASN A 132 7.786 -8.224 -1.016 1.00 8.64 C +ATOM 1067 CB ASN A 132 7.506 -5.736 -0.876 1.00 8.64 C +ATOM 1068 O ASN A 132 7.067 -8.865 -0.247 1.00 8.64 O +ATOM 1069 CG ASN A 132 7.833 -4.505 -0.054 1.00 8.64 C +ATOM 1070 ND2 ASN A 132 8.463 -3.521 -0.684 1.00 8.64 N +ATOM 1071 OD1 ASN A 132 7.524 -4.440 1.139 1.00 8.64 O +ATOM 1072 N ILE A 133 8.282 -8.675 -2.231 1.00 8.64 N +ATOM 1073 CA ILE A 133 7.755 -9.943 -2.723 1.00 8.64 C +ATOM 1074 C ILE A 133 8.504 -11.102 -2.068 1.00 8.64 C +ATOM 1075 CB ILE A 133 7.858 -10.039 -4.261 1.00 8.64 C +ATOM 1076 O ILE A 133 7.902 -12.121 -1.721 1.00 8.64 O +ATOM 1077 CG1 ILE A 133 6.915 -9.029 -4.924 1.00 8.64 C +ATOM 1078 CG2 ILE A 133 7.555 -11.464 -4.735 1.00 8.64 C +ATOM 1079 CD1 ILE A 133 7.015 -8.993 -6.443 1.00 8.64 C +ATOM 1080 N THR A 134 9.730 -10.791 -1.686 1.00 8.64 N +ATOM 1081 CA THR A 134 10.543 -11.821 -1.050 1.00 8.64 C +ATOM 1082 C THR A 134 10.104 -12.041 0.394 1.00 8.64 C +ATOM 1083 CB THR A 134 12.038 -11.453 -1.085 1.00 8.64 C +ATOM 1084 O THR A 134 10.048 -13.179 0.865 1.00 8.64 O +ATOM 1085 CG2 THR A 134 12.910 -12.668 -0.785 1.00 8.64 C +ATOM 1086 OG1 THR A 134 12.370 -10.951 -2.386 1.00 8.64 O +ATOM 1087 N LEU A 135 9.481 -11.013 1.084 1.00 8.64 N +ATOM 1088 CA LEU A 135 9.061 -11.103 2.479 1.00 8.64 C +ATOM 1089 C LEU A 135 7.653 -11.678 2.586 1.00 8.64 C +ATOM 1090 CB LEU A 135 9.114 -9.726 3.145 1.00 8.64 C +ATOM 1091 O LEU A 135 7.369 -12.474 3.484 1.00 8.64 O +ATOM 1092 CG LEU A 135 10.480 -9.278 3.668 1.00 8.64 C +ATOM 1093 CD1 LEU A 135 10.532 -7.758 3.780 1.00 8.64 C +ATOM 1094 CD2 LEU A 135 10.777 -9.929 5.014 1.00 8.64 C +ATOM 1095 N ALA A 136 6.896 -11.485 1.503 1.00 8.64 N +ATOM 1096 CA ALA A 136 5.482 -11.826 1.637 1.00 8.64 C +ATOM 1097 C ALA A 136 5.208 -13.240 1.133 1.00 8.64 C +ATOM 1098 CB ALA A 136 4.618 -10.818 0.882 1.00 8.64 C +ATOM 1099 O ALA A 136 4.289 -13.909 1.611 1.00 8.64 O +ATOM 1100 N ASN A 137 6.194 -13.758 0.415 1.00 8.64 N +ATOM 1101 CA ASN A 137 6.057 -15.090 -0.164 1.00 8.64 C +ATOM 1102 C ASN A 137 6.849 -16.128 0.626 1.00 8.64 C +ATOM 1103 CB ASN A 137 6.499 -15.087 -1.629 1.00 8.64 C +ATOM 1104 O ASN A 137 8.055 -15.975 0.826 1.00 8.64 O +ATOM 1105 CG ASN A 137 5.464 -14.473 -2.550 1.00 8.64 C +ATOM 1106 ND2 ASN A 137 5.908 -13.993 -3.705 1.00 8.64 N +ATOM 1107 OD1 ASN A 137 4.274 -14.431 -2.226 1.00 8.64 O +ATOM 1108 N GLY A 138 6.587 -16.377 1.995 1.00 8.64 N +ATOM 1109 CA GLY A 138 6.876 -17.550 2.803 1.00 8.64 C +ATOM 1110 C GLY A 138 7.966 -18.427 2.215 1.00 8.64 C +ATOM 1111 O GLY A 138 8.031 -19.623 2.504 1.00 8.64 O +ATOM 1112 N TYR A 139 9.137 -17.824 1.543 1.00 8.64 N +ATOM 1113 CA TYR A 139 10.214 -18.693 1.080 1.00 8.64 C +ATOM 1114 C TYR A 139 11.083 -19.153 2.245 1.00 8.64 C +ATOM 1115 CB TYR A 139 11.076 -17.973 0.039 1.00 8.64 C +ATOM 1116 O TYR A 139 11.385 -18.370 3.149 1.00 8.64 O +ATOM 1117 CG TYR A 139 10.546 -18.087 -1.370 1.00 8.64 C +ATOM 1118 CD1 TYR A 139 9.749 -17.085 -1.919 1.00 8.64 C +ATOM 1119 CD2 TYR A 139 10.841 -19.197 -2.155 1.00 8.64 C +ATOM 1120 CE1 TYR A 139 9.257 -17.187 -3.216 1.00 8.64 C +ATOM 1121 CE2 TYR A 139 10.355 -19.309 -3.454 1.00 8.64 C +ATOM 1122 OH TYR A 139 9.082 -18.406 -5.260 1.00 8.64 O +ATOM 1123 CZ TYR A 139 9.566 -18.300 -3.975 1.00 8.64 C +ATOM 1124 N ILE A 140 10.744 -20.317 2.913 1.00 8.64 N +ATOM 1125 CA ILE A 140 11.618 -21.208 3.668 1.00 8.64 C +ATOM 1126 C ILE A 140 13.062 -21.031 3.204 1.00 8.64 C +ATOM 1127 CB ILE A 140 11.185 -22.684 3.518 1.00 8.64 C +ATOM 1128 O ILE A 140 13.364 -21.194 2.020 1.00 8.64 O +ATOM 1129 CG1 ILE A 140 9.748 -22.872 4.019 1.00 8.64 C +ATOM 1130 CG2 ILE A 140 12.150 -23.609 4.265 1.00 8.64 C +ATOM 1131 CD1 ILE A 140 9.252 -24.310 3.951 1.00 8.64 C +ATOM 1132 N SER A 141 13.713 -20.010 3.556 1.00 8.64 N +ATOM 1133 CA SER A 141 15.171 -20.025 3.497 1.00 8.64 C +ATOM 1134 C SER A 141 15.734 -21.319 4.073 1.00 8.64 C +ATOM 1135 CB SER A 141 15.750 -18.827 4.252 1.00 8.64 C +ATOM 1136 O SER A 141 15.479 -21.652 5.233 1.00 8.64 O +ATOM 1137 OG SER A 141 17.145 -18.982 4.447 1.00 8.64 O +ATOM 1138 N ALA A 142 15.693 -22.473 3.364 1.00 8.64 N +ATOM 1139 CA ALA A 142 16.460 -23.706 3.208 1.00 8.64 C +ATOM 1140 C ALA A 142 17.958 -23.439 3.331 1.00 8.64 C +ATOM 1141 CB ALA A 142 16.148 -24.360 1.864 1.00 8.64 C +ATOM 1142 O ALA A 142 18.474 -22.483 2.749 1.00 8.64 O +ATOM 1143 N ASP A 143 18.576 -22.902 4.585 1.00 8.64 N +ATOM 1144 CA ASP A 143 19.977 -23.243 4.809 1.00 8.64 C +ATOM 1145 C ASP A 143 20.646 -22.233 5.738 1.00 8.64 C +ATOM 1146 CB ASP A 143 20.732 -23.315 3.480 1.00 8.64 C +ATOM 1147 O ASP A 143 20.988 -21.126 5.317 1.00 8.64 O +ATOM 1148 CG ASP A 143 21.865 -24.326 3.495 1.00 8.64 C +ATOM 1149 OD1 ASP A 143 22.444 -24.609 2.424 1.00 8.64 O +ATOM 1150 OD2 ASP A 143 22.180 -24.846 4.587 1.00 8.64 O +ATOM 1151 N SER A 144 20.228 -21.957 7.002 1.00 8.64 N +ATOM 1152 CA SER A 144 21.341 -21.510 7.832 1.00 8.64 C +ATOM 1153 C SER A 144 21.253 -22.095 9.238 1.00 8.64 C +ATOM 1154 CB SER A 144 21.373 -19.983 7.908 1.00 8.64 C +ATOM 1155 O SER A 144 21.817 -21.541 10.183 1.00 8.64 O +ATOM 1156 OG SER A 144 20.155 -19.479 8.427 1.00 8.64 O +ATOM 1157 N ARG A 145 20.767 -23.335 9.468 1.00 8.64 N +ATOM 1158 CA ARG A 145 20.907 -23.823 10.836 1.00 8.64 C +ATOM 1159 C ARG A 145 22.363 -24.145 11.156 1.00 8.64 C +ATOM 1160 CB ARG A 145 20.036 -25.062 11.058 1.00 8.64 C +ATOM 1161 O ARG A 145 23.035 -24.835 10.387 1.00 8.64 O +ATOM 1162 CG ARG A 145 18.542 -24.781 11.007 1.00 8.64 C +ATOM 1163 CD ARG A 145 17.724 -26.058 11.140 1.00 8.64 C +ATOM 1164 NE ARG A 145 17.859 -26.910 9.963 1.00 8.64 N +ATOM 1165 NH1 ARG A 145 16.657 -28.674 10.846 1.00 8.64 N +ATOM 1166 NH2 ARG A 145 17.532 -28.821 8.732 1.00 8.64 N +ATOM 1167 CZ ARG A 145 17.349 -28.133 9.850 1.00 8.64 C +ATOM 1168 N THR A 146 23.240 -23.194 11.377 1.00 8.64 N +ATOM 1169 CA THR A 146 24.353 -23.445 12.287 1.00 8.64 C +ATOM 1170 C THR A 146 23.848 -23.974 13.626 1.00 8.64 C +ATOM 1171 CB THR A 146 25.186 -22.170 12.516 1.00 8.64 C +ATOM 1172 O THR A 146 22.915 -23.417 14.208 1.00 8.64 O +ATOM 1173 CG2 THR A 146 26.113 -21.899 11.336 1.00 8.64 C +ATOM 1174 OG1 THR A 146 24.303 -21.054 12.683 1.00 8.64 O +ATOM 1175 N VAL A 147 23.601 -25.297 13.669 1.00 8.64 N +ATOM 1176 CA VAL A 147 23.604 -26.015 14.940 1.00 8.64 C +ATOM 1177 C VAL A 147 25.042 -26.295 15.372 1.00 8.64 C +ATOM 1178 CB VAL A 147 22.809 -27.337 14.846 1.00 8.64 C +ATOM 1179 O VAL A 147 25.856 -26.768 14.575 1.00 8.64 O +ATOM 1180 CG1 VAL A 147 22.708 -28.004 16.217 1.00 8.64 C +ATOM 1181 CG2 VAL A 147 21.418 -27.082 14.269 1.00 8.64 C +ATOM 1182 N ASP A 148 25.801 -25.404 15.970 1.00 8.64 N +ATOM 1183 CA ASP A 148 26.582 -25.450 17.202 1.00 8.64 C +ATOM 1184 C ASP A 148 27.024 -24.051 17.625 1.00 8.64 C +ATOM 1185 CB ASP A 148 27.802 -26.358 17.031 1.00 8.64 C +ATOM 1186 O ASP A 148 27.467 -23.256 16.793 1.00 8.64 O +ATOM 1187 CG ASP A 148 27.486 -27.826 17.259 1.00 8.64 C +ATOM 1188 OD1 ASP A 148 28.258 -28.694 16.799 1.00 8.64 O +ATOM 1189 OD2 ASP A 148 26.454 -28.116 17.901 1.00 8.64 O +TER 1190 ASP A 148 +ENDMDL +END diff --git a/alphafold/alphafold/relax/utils.py b/alphafold/alphafold/relax/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..4bd4acad4e5e7f071fb0ad98e7711b4856843464 --- /dev/null +++ b/alphafold/alphafold/relax/utils.py @@ -0,0 +1,80 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Utils for minimization.""" +import io +from alphafold.common import residue_constants +from Bio import PDB +import numpy as np +from simtk.openmm import app as openmm_app +from simtk.openmm.app.internal.pdbstructure import PdbStructure + + +def overwrite_pdb_coordinates(pdb_str: str, pos) -> str: + pdb_file = io.StringIO(pdb_str) + structure = PdbStructure(pdb_file) + topology = openmm_app.PDBFile(structure).getTopology() + with io.StringIO() as f: + openmm_app.PDBFile.writeFile(topology, pos, f) + return f.getvalue() + + +def overwrite_b_factors(pdb_str: str, bfactors: np.ndarray) -> str: + """Overwrites the B-factors in pdb_str with contents of bfactors array. + + Args: + pdb_str: An input PDB string. + bfactors: A numpy array with shape [1, n_residues, 37]. We assume that the + B-factors are per residue; i.e. that the nonzero entries are identical in + [0, i, :]. + + Returns: + A new PDB string with the B-factors replaced. + """ + if bfactors.shape[-1] != residue_constants.atom_type_num: + raise ValueError( + f'Invalid final dimension size for bfactors: {bfactors.shape[-1]}.') + + parser = PDB.PDBParser(QUIET=True) + handle = io.StringIO(pdb_str) + structure = parser.get_structure('', handle) + + curr_resid = ('', '', '') + idx = -1 + for atom in structure.get_atoms(): + atom_resid = atom.parent.get_id() + if atom_resid != curr_resid: + idx += 1 + if idx >= bfactors.shape[0]: + raise ValueError('Index into bfactors exceeds number of residues. ' + 'B-factors shape: {shape}, idx: {idx}.') + curr_resid = atom_resid + atom.bfactor = bfactors[idx, residue_constants.atom_order['CA']] + + new_pdb = io.StringIO() + pdb_io = PDB.PDBIO() + pdb_io.set_structure(structure) + pdb_io.save(new_pdb) + return new_pdb.getvalue() + + +def assert_equal_nonterminal_atom_types( + atom_mask: np.ndarray, ref_atom_mask: np.ndarray): + """Checks that pre- and post-minimized proteins have same atom set.""" + # Ignore any terminal OXT atoms which may have been added by minimization. + oxt = residue_constants.atom_order['OXT'] + no_oxt_mask = np.ones(shape=atom_mask.shape, dtype=np.bool) + no_oxt_mask[..., oxt] = False + np.testing.assert_almost_equal(ref_atom_mask[no_oxt_mask], + atom_mask[no_oxt_mask]) diff --git a/alphafold/alphafold/relax/utils_test.py b/alphafold/alphafold/relax/utils_test.py new file mode 100644 index 0000000000000000000000000000000000000000..190cb3109aa92972594e55e3f80a33f902199ac4 --- /dev/null +++ b/alphafold/alphafold/relax/utils_test.py @@ -0,0 +1,55 @@ +# Copyright 2021 DeepMind Technologies Limited +# +# 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. + +"""Tests for utils.""" + +import os + +from absl.testing import absltest +from alphafold.common import protein +from alphafold.relax import utils +import numpy as np +# Internal import (7716). + + +class UtilsTest(absltest.TestCase): + + def test_overwrite_b_factors(self): + testdir = os.path.join( + absltest.get_default_test_srcdir(), + 'alphafold/relax/testdata/' + 'multiple_disulfides_target.pdb') + with open(testdir) as f: + test_pdb = f.read() + n_residues = 191 + bfactors = np.stack([np.arange(0, n_residues)] * 37, axis=-1) + + output_pdb = utils.overwrite_b_factors(test_pdb, bfactors) + + # Check that the atom lines are unchanged apart from the B-factors. + atom_lines_original = [l for l in test_pdb.split('\n') if l[:4] == ('ATOM')] + atom_lines_new = [l for l in output_pdb.split('\n') if l[:4] == ('ATOM')] + for line_original, line_new in zip(atom_lines_original, atom_lines_new): + self.assertEqual(line_original[:60].strip(), line_new[:60].strip()) + self.assertEqual(line_original[66:].strip(), line_new[66:].strip()) + + # Check B-factors are correctly set for all atoms present. + as_protein = protein.from_pdb_string(output_pdb) + np.testing.assert_almost_equal( + np.where(as_protein.atom_mask > 0, as_protein.b_factors, 0), + np.where(as_protein.atom_mask > 0, bfactors, 0)) + + +if __name__ == '__main__': + absltest.main() diff --git a/alphafold/requirements.txt b/alphafold/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..40c6539e7a2d6b1d8dbc52c09d6de26d0a8afaf1 --- /dev/null +++ b/alphafold/requirements.txt @@ -0,0 +1,12 @@ +absl-py==0.13.0 +biopython==1.79 +chex==0.0.7 +dm-haiku==0.0.4 +dm-tree==0.1.6 +docker==5.0.0 +immutabledict==2.0.0 +jax==0.2.14 +ml-collections==0.1.0 +numpy==1.19.5 +scipy==1.7.0 +tensorflow-cpu==2.5.0