Commit 1109480e authored by Augustin-Zidek's avatar Augustin-Zidek
Browse files

Initial release of AlphaFold.

PiperOrigin-RevId: 384954738
parents
# 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
import jax.numpy as jnp
import tree
from alphafold.model import quat_affine
# 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)
# 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."""
import numpy as np
import tensorflow.compat.v1 as tf
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
# 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
# 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."""
import tensorflow.compat.v1 as tf
import tree
from alphafold.model.tf import data_transforms
from alphafold.model.tf import shape_placeholders
# 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:
dtype = tree.map_structure(lambda x: x.dtype,
tensors_0)
tensors = tf.map_fn(
lambda x: wrap_ensemble_fn(tensors, x),
tf.range(num_ensemble),
parallel_iterations=1,
dtype=dtype)
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
# 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
import tensorflow.compat.v1 as tf
from alphafold.common import residue_constants
# 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 <NUM_RES, 3> 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", theis 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
# 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
import tensorflow.compat.v1 as tf
from alphafold.model.tf import protein_features
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()
# 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
import numpy as np
import tensorflow.compat.v1 as tf
from alphafold.model.tf import protein_features
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
# 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
# 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."""
import numpy as np
import tensorflow.compat.v1 as tf
from alphafold.model.tf import shape_helpers
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()
# 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'
# 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())
# 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
# 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."""
# 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
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
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
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 end-to-end distance."""
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
# 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
import numpy as np
from alphafold.common import protein
from alphafold.relax import amber_minimize
# 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):
# This test can occasionally fail because of nondeterminism in OpenMM.
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()
# 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
# 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 simtk.openmm.app.internal import pdbstructure
from alphafold.relax import cleanup
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()
# 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
import numpy as np
from alphafold.common import protein
from alphafold.relax import amber_minimize
from alphafold.relax import utils
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
# 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
import numpy as np
from alphafold.common import protein
from alphafold.relax import relax
# 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()
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
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
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment