From b4445ef26be65ea65b440d41819c5e43735e1db8 Mon Sep 17 00:00:00 2001 From: Gabriel Studer <gabriel.studer@unibas.ch> Date: Sun, 17 Feb 2019 18:52:09 +0100 Subject: [PATCH] C++ wrapper around C++ implementation of TMalign --- modules/bindings/doc/tmtools.rst | 90 +- modules/bindings/pymod/CMakeLists.txt | 10 +- modules/bindings/pymod/__init__.py | 1 + modules/bindings/pymod/export_tmalign.cc | 58 + modules/bindings/pymod/tmtools.py | 45 +- modules/bindings/pymod/wrap_bindings.cc | 31 + modules/bindings/src/CMakeLists.txt | 15 +- modules/bindings/src/tmalign/.gitignore | 17 + modules/bindings/src/tmalign/BLOSUM.h | 145 ++ modules/bindings/src/tmalign/HwRMSD.cpp | 530 ++++ modules/bindings/src/tmalign/HwRMSD.h | 204 ++ modules/bindings/src/tmalign/Kabsch.h | 334 +++ modules/bindings/src/tmalign/NW.h | 261 ++ modules/bindings/src/tmalign/NWalign.cpp | 358 +++ modules/bindings/src/tmalign/NWalign.h | 462 ++++ modules/bindings/src/tmalign/OST_INFO | 7 + modules/bindings/src/tmalign/PDB1.pdb | 2561 +++++++++++++++++++ modules/bindings/src/tmalign/PDB2.pdb | 1396 ++++++++++ modules/bindings/src/tmalign/TMalign.cpp | 569 ++++ modules/bindings/src/tmalign/TMalign.h | 2439 ++++++++++++++++++ modules/bindings/src/tmalign/align.txt | 23 + modules/bindings/src/tmalign/basic_fun.h | 763 ++++++ modules/bindings/src/tmalign/param_set.h | 77 + modules/bindings/src/tmalign/pdb2fasta.cpp | 175 ++ modules/bindings/src/tmalign/pdb2ss.cpp | 218 ++ modules/bindings/src/tmalign/pdb2xyz.cpp | 176 ++ modules/bindings/src/tmalign/pstream.h | 2255 ++++++++++++++++ modules/bindings/src/tmalign/readme.txt | 87 + modules/bindings/src/tmalign/se.cpp | 442 ++++ modules/bindings/src/tmalign/se.h | 178 ++ modules/bindings/src/tmalign/xyz_sfetch.cpp | 133 + modules/bindings/src/wrap_tmalign.cc | 191 ++ modules/bindings/src/wrap_tmalign.hh | 66 + 33 files changed, 14274 insertions(+), 43 deletions(-) create mode 100644 modules/bindings/pymod/export_tmalign.cc create mode 100644 modules/bindings/pymod/wrap_bindings.cc create mode 100644 modules/bindings/src/tmalign/.gitignore create mode 100644 modules/bindings/src/tmalign/BLOSUM.h create mode 100644 modules/bindings/src/tmalign/HwRMSD.cpp create mode 100644 modules/bindings/src/tmalign/HwRMSD.h create mode 100644 modules/bindings/src/tmalign/Kabsch.h create mode 100644 modules/bindings/src/tmalign/NW.h create mode 100644 modules/bindings/src/tmalign/NWalign.cpp create mode 100644 modules/bindings/src/tmalign/NWalign.h create mode 100644 modules/bindings/src/tmalign/OST_INFO create mode 100644 modules/bindings/src/tmalign/PDB1.pdb create mode 100644 modules/bindings/src/tmalign/PDB2.pdb create mode 100644 modules/bindings/src/tmalign/TMalign.cpp create mode 100644 modules/bindings/src/tmalign/TMalign.h create mode 100644 modules/bindings/src/tmalign/align.txt create mode 100644 modules/bindings/src/tmalign/basic_fun.h create mode 100644 modules/bindings/src/tmalign/param_set.h create mode 100644 modules/bindings/src/tmalign/pdb2fasta.cpp create mode 100644 modules/bindings/src/tmalign/pdb2ss.cpp create mode 100644 modules/bindings/src/tmalign/pdb2xyz.cpp create mode 100644 modules/bindings/src/tmalign/pstream.h create mode 100644 modules/bindings/src/tmalign/readme.txt create mode 100644 modules/bindings/src/tmalign/se.cpp create mode 100644 modules/bindings/src/tmalign/se.h create mode 100644 modules/bindings/src/tmalign/xyz_sfetch.cpp create mode 100644 modules/bindings/src/wrap_tmalign.cc create mode 100644 modules/bindings/src/wrap_tmalign.hh diff --git a/modules/bindings/doc/tmtools.rst b/modules/bindings/doc/tmtools.rst index 7192e730d..7a39ba987 100644 --- a/modules/bindings/doc/tmtools.rst +++ b/modules/bindings/doc/tmtools.rst @@ -17,6 +17,17 @@ Citation: Yang Zhang and Jeffrey Skolnick, Proteins 2004 57: 702-710 Y. Zhang and J. Skolnick, Nucl. Acids Res. 2005 33, 2302-9 +Besides using the standalone TM-align program, ost also provides a wrapper +around TM-align as published in: + + Sha Gong, Chengxin Zhang, Yang Zhang, Bioinformatics 2019 + +The advantage is that no intermediate files must be generated, a wrapper on the +c++ layer is used instead. However, only the basic TM-align superposition +functionality is available. + + + Distance measures used by TMscore -------------------------------------------------------------------------------- @@ -59,7 +70,6 @@ Usage of TMalign .. autofunction:: ost.bindings.tmtools.TMAlign -.. autoclass:: ost.bindings.tmtools.TMAlignResult Usage of TMscore -------------------------------------------------------------------------------- @@ -67,3 +77,81 @@ Usage of TMscore .. autofunction:: ost.bindings.tmtools.TMScore .. autoclass:: ost.bindings.tmtools.TMScoreResult + + +TMalign C++ wrapper +-------------------------------------------------------------------------------- + +.. module:: ost.bindings + +Instead of calling the TMalign executable, ost also provides a wrapper around +its C++ implementation. The advantage is that no intermediate files need to be +generated in order to call the executable. + +.. code-block:: python + + from ost import bindings + + pdb1=io.LoadPDB('1ake.pdb').Select("peptide=true") + pdb2=io.LoadPDB('4ake.pdb').Select("peptide=true") + result = bindings.WrappedTMAlign(pdb1.chains[0], pdb2.chains[0], + fast=True) + print result.tm_score + print result.alignment.ToString(80) + + +.. class:: TMAlignResult(rmsd, tm_score, aligned_length, transform, alignment) + + All parameters of the constructor are available as attributes of the class + + :param rmsd: RMSD of the superposed residues + :param tm_score: TMScore of the superposed residues + :param aligned_length: Number of superposed residues + :param transform: Transformation matrix to superpose first chain onto + reference + :param alignment: The sequence alignment given the structural superposition + :type rmsd: :class:`float` + :type tm_score: :class:`float` + :type aligned_length: :class:`int` + :type transform: :class:`geom.Mat4` + :type alignment: :class:`ost.seq.AlignmentHandle` + +.. method:: WrappedTMAlign(chain1, chain2, [fast=False]) + + Takes two chain views and runs TMalign with *chain2* as reference. + The positions and sequences are directly extracted from the chain + residues for every residue that fulfills: + + * peptide linking + * valid one letter code(no '?') + * valid CA atom + + :param chain1: Chain from which position and sequence are extracted + to run TMalign. + :param chain2: Chain from which position and sequence are extracted + to run TMalign, this is the reference. + :param fast: Whether to apply the *fast* flag to TMAlign + :type chain1: :class:`ost.mol.ChainView` + :type chain2: :class:`ost.mol.ChainView` + :type fast: :class:`bool` + :rtype: :class:`ost.bindings.TMAlignResult` + + +.. method:: WrappedTMAlign(pos1, pos2, seq1, seq2 [fast=False]) + + Similar as described above, but directly feeding in raw data. + + :param pos1: CA positions of the first chain + :param pos2: CA positions of the second chain, this is the reference. + :param seq1: Sequence of first chain + :param seq2: Sequence of second chain + :param fast: Whether to apply the *fast* flag to TMAlign + :type pos1: :class:`ost.geom.Vec3List` + :type pos2: :class:`ost.geom.Vec3List` + :type seq1: :class:`ost.seq.SequenceHandle` + :type seq2: :class:`ost.seq.SequenceHandle` + :type fast: :class:`bool` + :rtype: :class:`ost.bindings.TMAlignResult` + :raises: :class:`ost.Error` if pos1 and seq1, pos2 and seq2 + respectively are not consistent in size. + diff --git a/modules/bindings/pymod/CMakeLists.txt b/modules/bindings/pymod/CMakeLists.txt index ba312b609..5d91e8906 100644 --- a/modules/bindings/pymod/CMakeLists.txt +++ b/modules/bindings/pymod/CMakeLists.txt @@ -15,4 +15,12 @@ kclust.py ialign.py align_3dcomb.py ) -pymod(NAME bindings PY ${OST_BINDINGS}) + +set(OST_BINDINGS_PYMOD_SOURCES + export_tmalign.cc + wrap_bindings.cc +) + + +pymod(NAME bindings OUTPUT_DIR ost/bindings CPP ${OST_BINDINGS_PYMOD_SOURCES} + PY ${OST_BINDINGS}) diff --git a/modules/bindings/pymod/__init__.py b/modules/bindings/pymod/__init__.py index ab3668069..4510f10ef 100644 --- a/modules/bindings/pymod/__init__.py +++ b/modules/bindings/pymod/__init__.py @@ -8,3 +8,4 @@ from ost.bindings import hbplus from ost.bindings import clustalw from ost.bindings import cadscore from ost.bindings import align_3dcomb +from _ost_bindings import * diff --git a/modules/bindings/pymod/export_tmalign.cc b/modules/bindings/pymod/export_tmalign.cc new file mode 100644 index 000000000..09b08b185 --- /dev/null +++ b/modules/bindings/pymod/export_tmalign.cc @@ -0,0 +1,58 @@ +//------------------------------------------------------------------------------ +// This file is part of the OpenStructure project <www.openstructure.org> +// +// Copyright (C) 2008-2019 by the OpenStructure authors +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License as published by the Free +// Software Foundation; either version 3.0 of the License, or (at your option) +// any later version. +// This library is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +// details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this library; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +//------------------------------------------------------------------------------ + +#include <boost/python.hpp> +#include <boost/python/suite/indexing/vector_indexing_suite.hpp> +#include <ost/bindings/wrap_tmalign.hh> +using namespace boost::python; + +ost::bindings::TMAlignResult WrapTMAlignPos(const geom::Vec3List& pos_one, + const geom::Vec3List& pos_two, + const ost::seq::SequenceHandle& seq1, + const ost::seq::SequenceHandle& seq2, + bool fast) { + + return ost::bindings::WrappedTMAlign(pos_one, pos_two, seq1, seq2, fast); +} + +ost::bindings::TMAlignResult WrapTMAlignView(const ost::mol::ChainView& chain1, + const ost::mol::ChainView& chain2, + bool fast) { + + return ost::bindings::WrappedTMAlign(chain1, chain2, fast); +} + +void export_TMAlign() { + class_<ost::bindings::TMAlignResult>("TMAlignResult", init<Real, Real, int, const geom::Mat4&, + const ost::seq::AlignmentHandle&>()) + .add_property("rmsd", make_function(&ost::bindings::TMAlignResult::GetRMSD)) + .add_property("tm_score", make_function(&ost::bindings::TMAlignResult::GetTMScore)) + .add_property("aligned_length", make_function(&ost::bindings::TMAlignResult::GetAlignedLength)) + .add_property("transform", make_function(&ost::bindings::TMAlignResult::GetTransform, + return_value_policy<reference_existing_object>())) + .add_property("alignment", make_function(&ost::bindings::TMAlignResult::GetAlignment, + return_value_policy<reference_existing_object>())) + ; + + def("WrappedTMAlign", &WrapTMAlignPos, (arg("pos1"), arg("pos2"), arg("seq1"), arg("seq2"), + arg("fast")=false)); + + def("WrapedTMAlign", &WrapTMAlignView, (arg("chain1"), arg("chain2"), + arg("fast")=false)); +} diff --git a/modules/bindings/pymod/tmtools.py b/modules/bindings/pymod/tmtools.py index e2b067383..d7b465721 100644 --- a/modules/bindings/pymod/tmtools.py +++ b/modules/bindings/pymod/tmtools.py @@ -29,6 +29,7 @@ Authors: Pascal Benkert, Marco Biasini """ import subprocess, os, tempfile, platform +import ost from ost import settings, io, geom, seq def _SetupFiles(models): @@ -51,46 +52,9 @@ def _CleanupFiles(dir_name): import shutil shutil.rmtree(dir_name) -class TMAlignResult: - """ - Holds the result of running TMalign - - .. attribute:: rmsd - - The RMSD of the common Calpha atoms of both structures - - .. attribute:: transform - - The transform that superposes the model onto the reference structure. - - :type: :class:`~ost.geom.Mat4` - - .. attribute:: alignment - - The alignment of the structures, that is the pairing of Calphas of both - structures. Since the programs only read ATOM records, residues consisting - of HETATMs (MSE) are not included in the alignment. - - :type: :class:`~ost.seq.AlignmentHandle` - - .. attribute:: tm_score - - The TM-score of the structural superposition - - """ - def __init__(self, rmsd, tm_score, aligned_length, transform, - ref_sequence, alignment): - - self.rmsd=rmsd - self.tm_score=tm_score - self.aligned_length=aligned_length - self.transform=transform - self.ref_sequence =ref_sequence - self.alignment=alignment - def _ParseTmAlign(lines,lines_matrix): info_line=lines[12].split(',') - aln_length=float(info_line[0].split('=')[1].strip()) + aln_length=int(info_line[0].split('=')[1].strip()) rmsd=float(info_line[1].split('=')[1].strip()) tm_score=float(lines[14].split('=')[1].split('(')[0].strip()) tf1=[float(i.strip()) for i in lines_matrix[2].split()] @@ -105,7 +69,8 @@ def _ParseTmAlign(lines,lines_matrix): alignment = seq.CreateAlignment() alignment.AddSequence(seq2) alignment.AddSequence(seq1) - return TMAlignResult(rmsd, tm_score, aln_length, tf, seq2, alignment) + print aln_length + return ost.bindings.TMAlignResult(rmsd, tm_score, aln_length, tf, alignment) def _RunTmAlign(tmalign, tmp_dir): model1_filename=os.path.join(tmp_dir, 'model01.pdb') @@ -263,7 +228,7 @@ def TMAlign(model1, model2, tmalign=None): :type model2: :class:`~ost.mol.EntityView` or :class:`~ost.mol.EntityHandle` :param tmalign: If not None, the path to the tmalign executable. :returns: The result of the tmscore superposition - :rtype: :class:`TMAlignResult` + :rtype: :class:`ost.bindings.TMAlignResult` :raises: :class:`~ost.settings.FileNotFound` if tmalign could not be located. :raises: :class:`RuntimeError` if the superposition failed diff --git a/modules/bindings/pymod/wrap_bindings.cc b/modules/bindings/pymod/wrap_bindings.cc new file mode 100644 index 000000000..364a543a3 --- /dev/null +++ b/modules/bindings/pymod/wrap_bindings.cc @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// This file is part of the OpenStructure project <www.openstructure.org> +// +// Copyright (C) 2008-2019 by the OpenStructure authors +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License as published by the Free +// Software Foundation; either version 3.0 of the License, or (at your option) +// any later version. +// This library is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +// details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this library; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +//------------------------------------------------------------------------------ + +#include <boost/python.hpp> + + +using namespace boost::python; + + +void export_TMAlign(); + +BOOST_PYTHON_MODULE(_ost_bindings) +{ + export_TMAlign(); +} diff --git a/modules/bindings/src/CMakeLists.txt b/modules/bindings/src/CMakeLists.txt index 7dd88cfe5..e5988958a 100644 --- a/modules/bindings/src/CMakeLists.txt +++ b/modules/bindings/src/CMakeLists.txt @@ -2,4 +2,17 @@ if (COMPILE_TMTOOLS) enable_language(Fortran) executable(NAME tmalign SOURCES tmalign.f) executable(NAME tmscore SOURCES tmscore.f) -endif() \ No newline at end of file +endif() + +add_subdirectory(tmalign) + +set(OST_BINDINGS_SOURCES +wrap_tmalign.cc) + +set(OST_BINDINGS_HEADERS +wrap_tmalign.hh) + +module(NAME bindings SOURCES ${OST_BINDINGS_SOURCES} + HEADERS ${OST_BINDINGS_TMALIGN_HEADERS} IN_DIR tmalign + ${OST_BINDINGS_HEADERS} HEADER_OUTPUT_DIR ost/bindings + DEPENDS_ON ost_geom ost_mol ost_seq) diff --git a/modules/bindings/src/tmalign/.gitignore b/modules/bindings/src/tmalign/.gitignore new file mode 100644 index 000000000..4dbbc7f99 --- /dev/null +++ b/modules/bindings/src/tmalign/.gitignore @@ -0,0 +1,17 @@ +# compiled python code +*.pyc + +# vim temporary backup +.*.sw* + +# binary executables +TMalign +TMalignc +pdb2xyz +pdb2fasta +pdb2ss +xyz_sfetch +se +qTMclust +NWalign +HwRMSD diff --git a/modules/bindings/src/tmalign/BLOSUM.h b/modules/bindings/src/tmalign/BLOSUM.h new file mode 100644 index 000000000..a11659b8e --- /dev/null +++ b/modules/bindings/src/tmalign/BLOSUM.h @@ -0,0 +1,145 @@ +#ifndef TMalign_BLOSUM_H +#define TMalign_BLOSUM_H 1 + +/* This matrix contains two scoring matrices: + * [1] BLOSUM62 for protein is defined for upper case letters: + * ABCDEFGHIKLMNOPQRSTVWXYZ* excluding J + * The original BLOSUM does not have O (PYL) and U (SEC). + * In this matrix, OU values are copied from K and C, respectively. + * [2] BLASTN for RNA/DNA is defined for lower case letters: + * acgtu where matching (including t vs u) is 2 and mismatching is -3 */ + +const int BLOSUM[128][128]={ +//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 +//0 \a \b \t \n \v \f \t ' ' | " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ DEL +{ 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, 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, 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, 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, 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, 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, 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 SOH +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//2 STX +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//3 ETX +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//4 EOT +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//5 ENQ +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//6 ACK +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//7 '\a' +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//8 '\b' +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//9 '\t' +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//10 '\n' +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//11 '\v' +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//12 '\f' +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//13 '\r' +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//14 SO +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//15 SI +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//16 DLE +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//17 DC1 +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//18 DC2 +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//19 DC3 +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//20 DC4 +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//21 NAK +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//22 SYN +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//23 ETB +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//24 CAN +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//25 EM +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//26 SUB +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//27 ESC +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//28 FS +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//29 GS +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//30 RS +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//31 US +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//32 ' ' +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//33 ! +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//34 " +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//35 # +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//36 $ +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//37 % +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//38 & +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//39 ' +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//40 ( +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//41 ) +{ 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, 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,-4,-4,-4,-4,-4,-4,-4,-4,-4, 0,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, 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},//42 * +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//43 + +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//44 , +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//45 - +{ 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, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-3, 0,-3, 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, 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},//46 . +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//47 / +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//48 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//49 1 +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//50 2 +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//51 3 +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//52 4 +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//53 5 +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//54 6 +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//55 7 +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//56 8 +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//57 9 +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//58 : +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//59 ; +{ 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, 0, 0, 0, 0, 0, 0, 0,-3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,-3, 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, 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},//60 < +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//61 = +{ 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, 0, 0, 0, 0, 0, 0, 0,-3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-3, 0, 2, 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, 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},//62 > +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//63 ? +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//64 @ +{ 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, 0, 0, 0,-4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,-2, 0,-2,-1,-2, 0,-2,-1, 0,-1,-1,-1,-2,-1,-1,-1,-1, 1, 0, 0, 0,-3, 0,-2,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//65 A +{ 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, 0, 0, 0,-4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2, 4,-3, 4, 1,-3,-1, 0,-3, 0, 0,-4,-3, 3, 0,-2, 0,-1, 0,-1,-3,-3,-4,-1,-3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//66 B +{ 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, 0, 0, 0,-4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-3, 9,-3,-4,-2,-3,-3,-1, 0,-3,-1,-1,-3,-3,-3,-3,-3,-1,-1, 9,-1,-2,-2,-2,-3, 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},//67 C +{ 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, 0, 0, 0,-4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2, 4,-3, 6, 2,-3,-1,-1,-3, 0,-1,-4,-3, 1,-1,-1, 0,-2, 0,-1,-3,-3,-4,-1,-3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//68 D +{ 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, 0, 0, 0,-4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 1,-4, 2, 5,-3,-2, 0,-3, 0, 1,-3,-2, 0, 1,-1, 2, 0, 0,-1,-4,-2,-3,-1,-2, 4, 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},//69 E +{ 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, 0, 0, 0,-4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2,-3,-2,-3,-3, 6,-3,-1, 0, 0,-3, 0, 0,-3,-3,-4,-3,-3,-2,-2,-2,-1, 1,-1, 3,-3, 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},//70 F +{ 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, 0, 0, 0,-4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,-3,-1,-2,-3, 6,-2,-4, 0,-2,-4,-3, 0,-2,-2,-2,-2, 0,-2,-3,-3,-2,-1,-3,-2, 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},//71 G +{ 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, 0, 0, 0,-4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2, 0,-3,-1, 0,-1,-2, 8,-3, 0,-1,-3,-2, 1,-1,-2, 0, 0,-1,-2,-3,-3,-2,-1, 2, 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},//72 H +{ 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, 0, 0, 0,-4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,-3,-1,-3,-3, 0,-4,-3, 4, 0,-3, 2, 1,-3,-3,-3,-3,-3,-2,-1,-1, 3,-3,-1,-1,-3, 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},//73 I +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//74 J +{ 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, 0, 0, 0,-4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0,-3,-1, 1,-3,-2,-1,-3, 0, 5,-2,-1, 0, 5,-1, 1, 2, 0,-1,-3,-2,-3,-1,-2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//75 K +{ 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, 0, 0, 0,-4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,-4,-1,-4,-3, 0,-4,-3, 2, 0,-2, 4, 2,-3,-2,-3,-2,-2,-2,-1,-1, 1,-2,-1,-1,-3, 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},//76 L +{ 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, 0, 0, 0,-4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,-3,-1,-3,-2, 0,-3,-2, 1, 0,-1, 2, 5,-2,-1,-2, 0,-1,-1,-1,-1, 1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//77 M +{ 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, 0, 0, 0,-4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2, 3,-3, 1, 0,-3, 0, 1,-3, 0, 0,-3,-2, 6, 0,-2, 0, 0, 1, 0,-3,-3,-4,-1,-2, 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},//78 N +{ 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, 0, 0, 0,-4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0,-3,-1, 1,-3,-2,-1,-3, 0, 5,-2,-1, 0, 5,-1, 1, 2, 0,-1,-3,-2,-3,-1,-2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//79 O +{ 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, 0, 0, 0,-4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,-2,-3,-1,-1,-4,-2,-2,-3, 0,-1,-3,-2,-2,-1, 7,-1,-2,-1,-1,-3,-2,-4,-2,-3,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//80 P +{ 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, 0, 0, 0,-4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0,-3, 0, 2,-3,-2, 0,-3, 0, 1,-2, 0, 0, 1,-1, 5, 1, 0,-1,-3,-2,-2,-1,-1, 3, 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},//81 Q +{ 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, 0, 0, 0,-4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,-1,-3,-2, 0,-3,-2, 0,-3, 0, 2,-2,-1, 0, 2,-2, 1, 5,-1,-1,-3,-3,-3,-1,-2, 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},//82 R +{ 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, 0, 0, 0,-4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,-1, 0, 0,-2, 0,-1,-2, 0, 0,-2,-1, 1, 0,-1, 0,-1, 4, 1,-1,-2,-3, 0,-2, 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},//83 S +{ 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, 0, 0, 0,-4, 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,-1,-1,-2,-2,-2,-1, 0,-1,-1,-1, 0,-1,-1,-1,-1, 1, 5,-1, 0,-2, 0,-2,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//84 T +{ 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, 0, 0, 0,-4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-3, 9,-3,-4,-2,-3,-3,-1, 0,-3,-1,-1,-3,-3,-3,-3,-3,-1,-1, 9,-1,-2,-2,-2,-3, 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},//85 U +{ 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, 0, 0, 0,-4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-3,-1,-3,-2,-1,-3,-3, 3, 0,-2, 1, 1,-3,-2,-2,-2,-3,-2, 0,-1, 4,-3,-1,-1,-2, 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},//86 V +{ 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, 0, 0, 0,-4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-3,-4,-2,-4,-3, 1,-2,-2,-3, 0,-3,-2,-1,-4,-3,-4,-2,-3,-3,-2,-2,-3,11,-2, 2,-3, 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},//87 W +{ 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, 0, 0, 0,-4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,-2,-1,-1,-1,-1,-1,-1, 0,-1,-1,-1,-1,-1,-2,-1,-1, 0, 0,-2,-1,-2,-1,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//88 X +{ 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, 0, 0, 0,-4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2,-3,-2,-3,-2, 3,-3, 2,-1, 0,-2,-1,-1,-2,-2,-3,-1,-2,-2,-2,-2,-1, 2,-1, 7,-2, 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},//89 Y +{ 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, 0, 0, 0,-4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 1,-3, 1, 4,-3,-2, 0,-3, 0, 1,-3,-1, 0, 1,-1, 3, 0, 0,-1,-3,-2,-3,-1,-2, 4, 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},//90 Z +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//91 [ +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//92 '\' +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//93 ] +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//94 ^ +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//95 _ +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//96 ` +{ 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,-3, 0, 0, 0,-3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-3,-3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//97 a +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//98 b +{ 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-3, 0, 2, 0, 0, 0,-3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-3,-3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//99 c +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//100 d +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//101 e +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//102 f +{ 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-3, 0,-3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-3,-3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//103 g +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//104 h +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//105 i +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//106 j +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//107 k +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//108 l +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//109 m +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//110 n +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//111 o +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//112 p +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//113 q +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//114 r +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//115 s +{ 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-3, 0,-3, 0, 0, 0,-3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//116 t +{ 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-3, 0,-3, 0, 0, 0,-3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//117 u +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//118 v +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//119 w +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//120 x +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//121 y +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//122 z +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//123 { +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//124 | +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//125 } +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//126 ~ +{ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},//127 DEL +}; + +#endif diff --git a/modules/bindings/src/tmalign/HwRMSD.cpp b/modules/bindings/src/tmalign/HwRMSD.cpp new file mode 100644 index 000000000..d50607f5b --- /dev/null +++ b/modules/bindings/src/tmalign/HwRMSD.cpp @@ -0,0 +1,530 @@ +#include "HwRMSD.h" + +using namespace std; + +void print_extra_help() +{ + cout << +"Additional options:\n" +" -dir Perform all-against-all alignment among the list of PDB\n" +" chains listed by 'chain_list' under 'chain_folder'. Note\n" +" that the slash is necessary.\n" +" $ HwRMSD -dir chain_folder/ chain_list\n" +"\n" +" -dir1 Use chain2 to search a list of PDB chains listed by 'chain1_list'\n" +" under 'chain1_folder'. Note that the slash is necessary.\n" +" $ HwRMSD -dir1 chain1_folder/ chain1_list chain2\n" +"\n" +" -dir2 Use chain1 to search a list of PDB chains listed by 'chain2_list'\n" +" under 'chain2_folder'\n" +" $ HwRMSD chain1 -dir2 chain2_folder/ chain2_list\n" +"\n" +" -suffix (Only when -dir1 and/or -dir2 are set, default is empty)\n" +" add file name suffix to files listed by chain1_list or chain2_list\n" +"\n" +" -atom 4-character atom name used to represent a residue.\n" +" Default is \" C3'\" for RNA/DNA and \" CA \" for proteins\n" +" (note the spaces before and after CA).\n" +"\n" +" -mol Molecule type: RNA or protein\n" +" Default is detect molecule type automatically\n" +"\n" +" -ter Strings to mark the end of a chain\n" +" 3: (default) TER, ENDMDL, END or different chain ID\n" +" 2: ENDMDL, END, or different chain ID\n" +" 1: ENDMDL or END\n" +" 0: (default in the first C++ TMalign) end of file\n" +"\n" +" -split Whether to split PDB file into multiple chains\n" +" 0: (default) treat the whole structure as one single chain\n" +" 1: treat each MODEL as a separate chain (-ter should be 0)\n" +" 2: treat each chain as a seperate chain (-ter should be <=1)\n" +"\n" +" -outfmt Output format\n" +" 0: (default) full output\n" +" 1: fasta format compact output\n" +" 2: tabular format very compact output\n" +" -1: full output, but without version or citation information\n" +"\n" +" -byresi Whether to assume residue index correspondence between the\n" +" two structures.\n" +" 0: (default) sequence independent alignment\n" +" 1: (same as TMscore program) sequence-dependent superposition,\n" +" i.e. align by residue index\n" +" 2: (same as TMscore -c, should be used with -ter <=1)\n" +" align by residue index and chain ID\n" +" 3: (similar to TMscore -c, should be used with -ter <=1)\n" +" align by residue index and order of chain\n" +"\n" +" -glocal Global or local alignment\n" +" 0: (default) Needleman-Wunsch algorithm for global alignment\n" +" 1: glocal-query alignment\n" +" 2: glocal-both alignment\n" +" 3: Smith-Waterman algorithm for local alignment\n" +"\n" +" -iter ALignment-superposition iterations. Default is 1\n" +"\n" +" -infmt1 Input format for chain1\n" +" -infmt2 Input format for chain2\n" +" -1: (default) automatically detect PDB or PDBx/mmCIF format\n" +" 0: PDB format\n" +" 1: SPICKER format\n" +" 2: xyz format\n" +" 3: PDBx/mmCIF format\n" + <<endl; +} + +void print_help(bool h_opt=false) +{ + cout << +"Partial implement of HwRMSD method for sequence-guided structure alignment.\n" +"\n" +"Usage: HwRMSD PDB1.pdb PDB2.pdb [Options]\n" +"\n" +"Options:\n" +" -u TM-score normalized by user assigned length (the same as -L)\n" +" warning: it should be >= minimum length of the two structures\n" +" otherwise, TM-score may be >1\n" +"\n" +" -a TM-score normalized by the average length of two structures\n" +" T or F, (default F)\n" +"\n" +" -i Start with an alignment specified in fasta file 'align.txt'\n" +"\n" +" -I Stick to the alignment 'align.txt'\n" +"\n" +" -m Output HwRMSD rotation matrix\n" +"\n" +" -d TM-score scaled by an assigned d0, e.g. 5 Angstroms\n" +"\n" +" -o Output the superposition of PDB1.pdb to TM_sup.pdb\n" +" $ HwRMSD PDB1.pdb PDB2.pdb -o TM_sup.pdb\n" +" To view superposed full-atom structures:\n" +" $ pymol TM_sup.pdb PDB2.pdb\n" +"\n" +" -h Print the full help message\n" +"\n" +" (Options -u, -a, -d, -o won't change the final structure alignment)\n\n" +"Example usages:\n" +" HwRMSD PDB1.pdb PDB2.pdb\n" +" HwRMSD PDB1.pdb PDB2.pdb -u 100 -d 5.0\n" +" HwRMSD PDB1.pdb PDB2.pdb -a T -o PDB1.sup\n" +" HwRMSD PDB1.pdb PDB2.pdb -i align.txt\n" +" HwRMSD PDB1.pdb PDB2.pdb -m matrix.txt\n" + <<endl; + + if (h_opt) print_extra_help(); + + exit(EXIT_SUCCESS); +} + +int main(int argc, char *argv[]) +{ + if (argc < 2) print_help(); + + /**********************/ + /* get argument */ + /**********************/ + string xname = ""; + string yname = ""; + string fname_super = ""; // file name for superposed structure + string fname_lign = ""; // file name for user alignment + string fname_matrix= ""; // file name for output matrix + vector<string> sequence; // get value from alignment file + double Lnorm_ass, d0_scale; + + bool h_opt = false; // print full help message + bool m_opt = false; // flag for -m, output rotation matrix + bool i_opt = false; // flag for -i, with user given initial alignment + bool I_opt = false; // flag for -I, stick to user given alignment + bool o_opt = false; // flag for -o, output superposed structure + bool a_opt = false; // flag for -a, normalized by average length + bool u_opt = false; // flag for -u, normalized by user specified length + bool d_opt = false; // flag for -d, user specified d0 + + int infmt1_opt=-1; // PDB or PDBx/mmCIF format for chain_1 + int infmt2_opt=-1; // PDB or PDBx/mmCIF format for chain_2 + int ter_opt =3; // TER, END, or different chainID + int split_opt =0; // do not split chain + int outfmt_opt=0; // set -outfmt to full output + string atom_opt ="auto";// use C alpha atom for protein and C3' for RNA + string mol_opt ="auto";// auto-detect the molecule type as protein/RNA + string suffix_opt=""; // set -suffix to empty + string dir_opt =""; // set -dir to empty + string dir1_opt =""; // set -dir1 to empty + string dir2_opt =""; // set -dir2 to empty + int byresi_opt=0; // set -byresi to 0 + vector<string> chain1_list; // only when -dir1 is set + vector<string> chain2_list; // only when -dir2 is set + int glocal =0; + int iter_opt =1; + + for(int i = 1; i < argc; i++) + { + if ( !strcmp(argv[i],"-o") && i < (argc-1) ) + { + fname_super = argv[i + 1]; o_opt = true; i++; + } + else if ( (!strcmp(argv[i],"-u") || + !strcmp(argv[i],"-L")) && i < (argc-1) ) + { + Lnorm_ass = atof(argv[i + 1]); u_opt = true; i++; + } + else if ( !strcmp(argv[i],"-a") && i < (argc-1) ) + { + if (!strcmp(argv[i + 1], "T")) a_opt=true; + else if (!strcmp(argv[i + 1], "F")) a_opt=false; + else PrintErrorAndQuit("Wrong value for option -a! It should be T or F"); + i++; + } + else if ( !strcmp(argv[i],"-d") && i < (argc-1) ) + { + d0_scale = atof(argv[i + 1]); d_opt = true; i++; + } + else if ( !strcmp(argv[i],"-h") ) + { + h_opt = true; + } + else if ( !strcmp(argv[i],"-i") && i < (argc-1) ) + { + fname_lign = argv[i + 1]; i_opt = true; i++; + } + else if (!strcmp(argv[i], "-m") && i < (argc-1) ) + { + fname_matrix = argv[i + 1]; m_opt = true; i++; + }// get filename for rotation matrix + else if (!strcmp(argv[i], "-I") && i < (argc-1) ) + { + fname_lign = argv[i + 1]; I_opt = true; i++; + } + else if ( !strcmp(argv[i],"-infmt1") && i < (argc-1) ) + { + infmt1_opt=atoi(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-infmt2") && i < (argc-1) ) + { + infmt2_opt=atoi(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-ter") && i < (argc-1) ) + { + ter_opt=atoi(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-split") && i < (argc-1) ) + { + split_opt=atoi(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-atom") && i < (argc-1) ) + { + atom_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-mol") && i < (argc-1) ) + { + mol_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-dir") && i < (argc-1) ) + { + dir_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-dir1") && i < (argc-1) ) + { + dir1_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-dir2") && i < (argc-1) ) + { + dir2_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-suffix") && i < (argc-1) ) + { + suffix_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-outfmt") && i < (argc-1) ) + { + outfmt_opt=atoi(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-byresi") && i < (argc-1) ) + { + byresi_opt=atoi(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-glocal") && i < (argc-1) ) + { + glocal=atoi(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-iter") && i < (argc-1) ) + { + iter_opt=atoi(argv[i + 1]); i++; + } + else if (xname.size() == 0) xname=argv[i]; + else if (yname.size() == 0) yname=argv[i]; + else PrintErrorAndQuit(string("ERROR! Undefined option ")+argv[i]); + } + + if(xname.size()==0 || (yname.size()==0 && dir_opt.size()==0) || + (yname.size() && dir_opt.size())) + { + if (h_opt) print_help(h_opt); + if (xname.size()==0) + PrintErrorAndQuit("Please provide input structures"); + else if (yname.size()==0 && dir_opt.size()==0) + PrintErrorAndQuit("Please provide structure B"); + else if (yname.size() && dir_opt.size()) + PrintErrorAndQuit("Please provide only one file name if -dir is set"); + } + + if (suffix_opt.size() && dir_opt.size()+dir1_opt.size()+dir2_opt.size()==0) + PrintErrorAndQuit("-suffix is only valid if -dir, -dir1 or -dir2 is set"); + if ((dir_opt.size() || dir1_opt.size() || dir2_opt.size())) + { + if (m_opt || o_opt) + PrintErrorAndQuit("-m or -o cannot be set with -dir, -dir1 or -dir2"); + else if (dir_opt.size() && (dir1_opt.size() || dir2_opt.size())) + PrintErrorAndQuit("-dir cannot be set with -dir1 or -dir2"); + } + if (atom_opt.size()!=4) + PrintErrorAndQuit("ERROR! atom name must have 4 characters, including space."); + if (mol_opt!="auto" && mol_opt!="protein" && mol_opt!="RNA") + PrintErrorAndQuit("ERROR! molecule type must be either RNA or protein."); + else if (mol_opt=="protein" && atom_opt=="auto") + atom_opt=" CA "; + else if (mol_opt=="RNA" && atom_opt=="auto") + atom_opt=" C3'"; + + if (i_opt && I_opt) + PrintErrorAndQuit("ERROR! -I and -i cannot be used together"); + if (u_opt && Lnorm_ass<=0) + PrintErrorAndQuit("Wrong value for option -u! It should be >0"); + if (d_opt && d0_scale<=0) + PrintErrorAndQuit("Wrong value for option -d! It should be >0"); + if (outfmt_opt>=2 && (a_opt || u_opt || d_opt)) + PrintErrorAndQuit("-outfmt 2 cannot be used with -a, -u, -L, -d"); + if (byresi_opt!=0) + { + if (i_opt || I_opt) + PrintErrorAndQuit("-byresi >=1 cannot be used with -i or -I"); + if (byresi_opt<0 || byresi_opt>3) + PrintErrorAndQuit("-byresi can only be 0, 1, 2 or 3"); + if (byresi_opt>=2 && ter_opt>=2) + PrintErrorAndQuit("-byresi >=2 should be used with -ter <=1"); + } + if (split_opt==1 && ter_opt!=0) + PrintErrorAndQuit("-split 1 should be used with -ter 0"); + else if (split_opt==2 && ter_opt!=0 && ter_opt!=1) + PrintErrorAndQuit("-split 2 should be used with -ter 0 or 1"); + if (split_opt<0 || split_opt>2) + PrintErrorAndQuit("-split can only be 0, 1 or 2"); + if (iter_opt<=0) PrintErrorAndQuit("-iter must be >0"); + + /* read initial alignment file from 'align.txt' */ + if (i_opt || I_opt) read_user_alignment(sequence, fname_lign, I_opt); + + if (byresi_opt) I_opt=true; + + if (m_opt && fname_matrix == "") // Output rotation matrix: matrix.txt + PrintErrorAndQuit("ERROR! Please provide a file name for option -m!"); + + /* parse file list */ + if (dir1_opt.size()+dir_opt.size()==0) chain1_list.push_back(xname); + else file2chainlist(chain1_list, xname, dir_opt+dir1_opt, suffix_opt); + + if (dir_opt.size()) + for (int i=0;i<chain1_list.size();i++) + chain2_list.push_back(chain1_list[i]); + else if (dir2_opt.size()==0) chain2_list.push_back(yname); + else file2chainlist(chain2_list, yname, dir2_opt, suffix_opt); + + if (outfmt_opt==2) + cout<<"#PDBchain1\tPDBchain2\tTM1\tTM2\t" + <<"RMSD\tID1\tID2\tIDali\tL1\tL2\tLali"<<endl; + + /* declare previously global variables */ + vector<vector<string> >PDB_lines1; // text of chain1 + vector<vector<string> >PDB_lines2; // text of chain2 + vector<int> mol_vec1; // molecule type of chain1, RNA if >0 + vector<int> mol_vec2; // molecule type of chain2, RNA if >0 + vector<string> chainID_list1; // list of chainID1 + vector<string> chainID_list2; // list of chainID2 + int i,j; // file index + int chain_i,chain_j; // chain index + int xlen, ylen; // chain length + int xchainnum,ychainnum;// number of chains in a PDB file + char *seqx, *seqy; // for the protein sequence + int *secx, *secy; // for the secondary structure + double **xa, **ya; // for input vectors xa[0...xlen-1][0..2] and + // ya[0...ylen-1][0..2], in general, + // ya is regarded as native structure + // --> superpose xa onto ya + vector<string> resi_vec1; // residue index for chain1 + vector<string> resi_vec2; // residue index for chain2 + + /* loop over file names */ + for (int i=0;i<chain1_list.size();i++) + { + /* parse chain 1 */ + xname=chain1_list[i]; + xchainnum=get_PDB_lines(xname, PDB_lines1, chainID_list1, + mol_vec1, ter_opt, infmt1_opt, atom_opt, split_opt); + if (!xchainnum) + { + cerr<<"Warning! Cannot parse file: "<<xname + <<". Chain number 0."<<endl; + continue; + } + for (int chain_i=0;chain_i<xchainnum;chain_i++) + { + xlen=PDB_lines1[chain_i].size(); + if (mol_opt=="RNA") mol_vec1[chain_i]=1; + else if (mol_opt=="protein") mol_vec1[chain_i]=-1; + if (!xlen) + { + cerr<<"Warning! Cannot parse file: "<<xname + <<". Chain length 0."<<endl; + continue; + } + else if (xlen<=5) + { + cerr<<"Sequence is too short <=5!: "<<xname<<endl; + continue; + } + NewArray(&xa, xlen, 3); + seqx = new char[xlen + 1]; + xlen = read_PDB(PDB_lines1[chain_i], xa, seqx, + resi_vec1, byresi_opt); + if (iter_opt>=2) // secondary structure assignment + { + secx = new int[xlen]; + if (mol_vec1[chain_i]>0) + make_sec(seqx, xa, xlen, secx,atom_opt); + else make_sec(xa, xlen, secx); + } + + for (int j=(dir_opt.size()>0)*(i+1);j<chain2_list.size();j++) + { + /* parse chain 2 */ + if (PDB_lines2.size()==0) + { + yname=chain2_list[j]; + ychainnum=get_PDB_lines(yname, PDB_lines2, chainID_list2, + mol_vec2, ter_opt, infmt2_opt, atom_opt, split_opt); + if (!ychainnum) + { + cerr<<"Warning! Cannot parse file: "<<yname + <<". Chain number 0."<<endl; + continue; + } + } + for (int chain_j=0;chain_j<ychainnum;chain_j++) + { + ylen=PDB_lines2[chain_j].size(); + if (mol_opt=="RNA") mol_vec2[chain_j]=1; + else if (mol_opt=="protein") mol_vec2[chain_j]=-1; + if (!ylen) + { + cerr<<"Warning! Cannot parse file: "<<yname + <<". Chain length 0."<<endl; + continue; + } + else if (ylen<=5) + { + cerr<<"Sequence is too short <=5!: "<<yname<<endl; + continue; + } + NewArray(&ya, ylen, 3); + seqy = new char[ylen + 1]; + ylen = read_PDB(PDB_lines2[chain_j], ya, seqy, + resi_vec2, byresi_opt); + if (iter_opt>=2) + { + secy = new int[ylen]; + if (mol_vec2[chain_j]>0) + make_sec(seqy, ya, ylen, secy, atom_opt); + else make_sec(ya, ylen, secy); + } + + if (byresi_opt) extract_aln_from_resi(sequence, + seqx,seqy,resi_vec1,resi_vec2,byresi_opt); + + /* declare variable specific to this pair of HwRMSD */ + double t0[3], u0[3][3]; + double TM1, TM2; + double TM3, TM4, TM5; // for a_opt, u_opt, d_opt + double d0_0, TM_0; + double d0A, d0B, d0u, d0a; + double d0_out=5.0; + string seqM, seqxA, seqyA;// for output alignment + double rmsd0 = 0.0; + int L_ali; // Aligned length in standard_TMscore + double Liden=0; + double TM_ali, rmsd_ali; // TMscore and rmsd in standard_TMscore + int n_ali=0; + int n_ali8=0; + + /* entry function for structure alignment */ + HwRMSD_main(xa, ya, seqx, seqy, secx, secy, t0, u0, + TM1, TM2, TM3, TM4, TM5, d0_0, TM_0, + d0A, d0B, d0u, d0a, d0_out, seqM, seqxA, seqyA, + rmsd0, L_ali, Liden, TM_ali, + rmsd_ali, n_ali, n_ali8, xlen, ylen, sequence, + Lnorm_ass, d0_scale, i_opt, I_opt, a_opt, u_opt, d_opt, + mol_vec1[chain_i]+mol_vec2[chain_j], glocal, iter_opt); + + /* print result */ + output_results( + xname.substr(dir1_opt.size()), + yname.substr(dir2_opt.size()), + chainID_list1[chain_i].c_str(), + chainID_list2[chain_j].c_str(), + xlen, ylen, t0, u0, TM1, TM2, + TM3, TM4, TM5, rmsd0, d0_out, + seqM.c_str(), seqxA.c_str(), seqyA.c_str(), Liden, + n_ali8, n_ali, L_ali, TM_ali, rmsd_ali, + TM_0, d0_0, d0A, d0B, + Lnorm_ass, d0_scale, d0a, d0u, + (m_opt?fname_matrix+chainID_list1[chain_i]:"").c_str(), + outfmt_opt, ter_opt, + (o_opt?fname_super+chainID_list1[chain_i]:"").c_str(), + false, false, a_opt, u_opt, d_opt); + + /* Done! Free memory */ + seqM.clear(); + seqxA.clear(); + seqyA.clear(); + DeleteArray(&ya, ylen); + delete [] seqy; + if (iter_opt>=2) delete [] secy; + resi_vec2.clear(); + } // chain_j + if (chain2_list.size()>1) + { + yname.clear(); + for (int chain_j=0;chain_j<ychainnum;chain_j++) + PDB_lines2[chain_j].clear(); + PDB_lines2.clear(); + chainID_list2.clear(); + mol_vec2.clear(); + } + } // j + PDB_lines1[chain_i].clear(); + DeleteArray(&xa, xlen); + delete [] seqx; + if (iter_opt>=2) delete [] secx; + resi_vec1.clear(); + } // chain_i + xname.clear(); + PDB_lines1.clear(); + chainID_list1.clear(); + mol_vec1.clear(); + } // i + if (chain2_list.size()==1) + { + yname.clear(); + for (int chain_j=0;chain_j<ychainnum;chain_j++) + PDB_lines2[chain_j].clear(); + PDB_lines2.clear(); + resi_vec2.clear(); + chainID_list2.clear(); + mol_vec2.clear(); + } + chain1_list.clear(); + chain2_list.clear(); + sequence.clear(); + return 0; +} diff --git a/modules/bindings/src/tmalign/HwRMSD.h b/modules/bindings/src/tmalign/HwRMSD.h new file mode 100644 index 000000000..312477af1 --- /dev/null +++ b/modules/bindings/src/tmalign/HwRMSD.h @@ -0,0 +1,204 @@ +#ifndef TMalign_HwRMSD_h +#define TMalign_HwRMSD_h 1 +#include "NWalign.h" +#include "se.h" + +const char* HwRMSD_SSmapProtein=" CHTE"; +const char* HwRMSD_SSmapRNA =" .<> "; + +double Kabsch_Superpose(double **r1, double **r2, double **xt, + double **xa, double **ya, int xlen, int ylen, int invmap[], + int& L_ali, double t[3], double u[3][3], const int mol_type) +{ + L_ali = 0; + int i, j; + for (j = 0; j<ylen; j++) + { + i = invmap[j]; + if (i >= 0) + { + r1[L_ali][0] = xa[i][0]; + r1[L_ali][1] = xa[i][1]; + r1[L_ali][2] = xa[i][2]; + + r2[L_ali][0] = ya[j][0]; + r2[L_ali][1] = ya[j][1]; + r2[L_ali][2] = ya[j][2]; + + L_ali++; + } + else if (i != -1) PrintErrorAndQuit("Wrong map!\n"); + } + + double RMSD = 0; + Kabsch(r1, r2, L_ali, 1, &RMSD, t, u); + RMSD = sqrt( RMSD/(1.0*L_ali) ); + + for (i=0; i<xlen; i++) + { + xt[i][0] = xa[i][0]; + xt[i][1] = xa[i][1]; + xt[i][2] = xa[i][2]; + } + do_rotation(xa, xt, xlen, t,u); + return RMSD; +} + +int HwRMSD_main(double **xa, double **ya, const char *seqx, const char *seqy, + const int *secx, const int *secy, double t0[3], double u0[3][3], + double &TM1, double &TM2, double &TM3, double &TM4, double &TM5, + double &d0_0, double &TM_0, double &d0A, double &d0B, double &d0u, + double &d0a, double &d0_out, string &seqM, string &seqxA, string &seqyA, + double &rmsd0, int &L_ali, double &Liden, double &TM_ali, + double &rmsd_ali, int &n_ali, int &n_ali8, const int xlen, const int ylen, + const vector<string>&sequence, const double Lnorm_ass, + const double d0_scale, const bool i_opt, const bool I_opt, + const int a_opt, const bool u_opt, const bool d_opt, + const int mol_type, const int glocal=0, const int iter_opt=1) +{ + /***********************/ + /* allocate memory */ + /***********************/ + double t[3], u[3][3]; //Kabsch translation vector and rotation matrix + double **xt; //for saving the superposed version of r_1 or xtm + double **r1, **r2; // for Kabsch rotation + int minlen = min(xlen, ylen); + NewArray(&xt, xlen, 3); + NewArray(&r1, minlen, 3); + NewArray(&r2, minlen, 3); + int *invmap = new int[ylen+1]; + char *ssx; + char *ssy; + + int i, j, i1, i2, L; + double TM1_tmp,TM2_tmp,TM3_tmp,TM4_tmp,TM5_tmp,TM_ali_tmp; + string seqxA_tmp,seqyA_tmp,seqM_tmp; + double rmsd0_tmp; + int L_ali_tmp,n_ali_tmp,n_ali8_tmp; + double Liden_tmp; + double rmsd_ali_tmp; + + /* initialize alignment */ + TM1=TM2=TM1_tmp=TM2_tmp=L_ali=-1; + if (I_opt || i_opt) + { + seqxA_tmp=sequence[0]; + seqyA_tmp=sequence[1]; + } + else + NWalign(seqx, seqy, xlen, ylen, seqxA_tmp, seqyA_tmp, mol_type, glocal); + int total_iter=(I_opt || iter_opt<1)?1:iter_opt; + + /*******************************/ + /* perform iterative alignment */ + /*******************************/ + for (int iter=0;iter<total_iter;iter++) + { + /* get ss alignment for the second iteration */ + if (iter==1 && !i_opt) + { + ssx=new char[xlen+1]; + ssy=new char[ylen+1]; + for (i=0;i<xlen;i++) + { + if (mol_type>0) ssx[i]=HwRMSD_SSmapRNA[secx[i]]; + else ssx[i]=HwRMSD_SSmapProtein[secx[i]]; + } + for (i=0;i<ylen;i++) + { + if (mol_type>0) ssy[i]=HwRMSD_SSmapRNA[secy[i]]; + else ssy[i]=HwRMSD_SSmapProtein[secy[i]]; + } + ssx[xlen]=0; + ssy[ylen]=0; + NWalign(ssx, ssy, xlen, ylen, seqxA_tmp, seqyA_tmp, + mol_type, glocal); + delete [] ssx; + delete [] ssy; + } + + /* parse initial alignment */ + for (j = 0; j < ylen; j++) invmap[j] = -1; + i1 = -1; + i2 = -1; + L = min(seqxA_tmp.size(), seqyA_tmp.size()); + for (j = 0; j<L; j++) + { + if (seqxA_tmp[j] != '-') i1++; + if (seqyA_tmp[j] != '-') + { + i2++; + if (i2 >= ylen || i1 >= xlen) j = L; + else if (seqxA_tmp[j] != '-') invmap[i2] = i1; + } + } + + /* superpose */ + Kabsch_Superpose(r1, r2, xt, xa, ya, xlen, ylen, invmap, + L_ali, t, u, mol_type); + + /* derive new alignment */ + se_main(xt, ya, seqx, seqy, TM1_tmp, TM2_tmp, TM3_tmp, TM4_tmp, TM5_tmp, + d0_0, TM_0, d0A, d0B, d0u, d0a, d0_out, + seqM_tmp, seqxA_tmp, seqyA_tmp, rmsd0_tmp, L_ali_tmp, Liden_tmp, + TM_ali_tmp, rmsd_ali_tmp, n_ali_tmp, n_ali8_tmp, xlen, ylen, sequence, + Lnorm_ass, d0_scale, I_opt, a_opt, u_opt, d_opt, mol_type); + + /* accept new alignment */ + if (TM1_tmp>TM1 && TM2_tmp>TM2) + { + /* return values */ + for (i=0; i<3; i++) + { + t0[i]=t[i]; + for (j=0;j<3;j++) u0[i][j]=u[i][j]; + } + TM1=TM1_tmp; + TM2=TM2_tmp; + TM3=TM3_tmp; + TM4=TM4_tmp; + TM5=TM5_tmp; + + TM_0=TM1; + if (a_opt>0) TM_0=TM3; + else if (u_opt) TM_0=TM4; + else if (d_opt) TM_0=TM5; + + seqxA =seqxA_tmp; + seqM =seqM_tmp; + seqyA =seqyA_tmp; + + rmsd0 =rmsd0_tmp; + Liden =Liden_tmp; + n_ali =n_ali_tmp; + n_ali8=n_ali8_tmp; + + /* user specified initial alignment parameters */ + if ((i_opt || I_opt) && L_ali==-1) + { + L_ali=L_ali_tmp; + TM_ali=TM_ali_tmp; + rmsd_ali=rmsd_ali_tmp; + } + } + else + { + if (iter>=2) break; + seqxA_tmp = seqxA; + seqyA_tmp = seqyA; + } + } + + /************/ + /* clean up */ + /************/ + seqxA_tmp.clear(); + seqM_tmp.clear(); + seqyA_tmp.clear(); + delete [] invmap; + DeleteArray(&xt, xlen); + DeleteArray(&r1, minlen); + DeleteArray(&r2, minlen); + return 0; +} +#endif diff --git a/modules/bindings/src/tmalign/Kabsch.h b/modules/bindings/src/tmalign/Kabsch.h new file mode 100644 index 000000000..a4c5d6f7e --- /dev/null +++ b/modules/bindings/src/tmalign/Kabsch.h @@ -0,0 +1,334 @@ +/************************************************************************** +Implemetation of Kabsch algoritm for finding the best rotation matrix +--------------------------------------------------------------------------- +x - x(i,m) are coordinates of atom m in set x (input) +y - y(i,m) are coordinates of atom m in set y (input) +n - n is number of atom pairs (input) +mode - 0:calculate rms only (input) +1:calculate u,t only (takes medium) +2:calculate rms,u,t (takes longer) +rms - sum of w*(ux+t-y)**2 over all atom pairs (output) +u - u(i,j) is rotation matrix for best superposition (output) +t - t(i) is translation vector for best superposition (output) +**************************************************************************/ +bool Kabsch(double **x, double **y, int n, int mode, double *rms, + double t[3], double u[3][3]) +{ + int i, j, m, m1, l, k; + double e0, rms1, d, h, g; + double cth, sth, sqrth, p, det, sigma; + double xc[3], yc[3]; + double a[3][3], b[3][3], r[3][3], e[3], rr[6], ss[6]; + double sqrt3 = 1.73205080756888, tol = 0.01; + int ip[] = { 0, 1, 3, 1, 2, 4, 3, 4, 5 }; + int ip2312[] = { 1, 2, 0, 1 }; + + int a_failed = 0, b_failed = 0; + double epsilon = 0.00000001; + + //initializtation + *rms = 0; + rms1 = 0; + e0 = 0; + double c1[3], c2[3]; + double s1[3], s2[3]; + double sx[3], sy[3], sz[3]; + for (i = 0; i < 3; i++) + { + s1[i] = 0.0; + s2[i] = 0.0; + + sx[i] = 0.0; + sy[i] = 0.0; + sz[i] = 0.0; + } + + for (i = 0; i<3; i++) + { + xc[i] = 0.0; + yc[i] = 0.0; + t[i] = 0.0; + for (j = 0; j<3; j++) + { + u[i][j] = 0.0; + r[i][j] = 0.0; + a[i][j] = 0.0; + if (i == j) + { + u[i][j] = 1.0; + a[i][j] = 1.0; + } + } + } + + if (n<1) return false; + + //compute centers for vector sets x, y + for (i = 0; i<n; i++) + { + for (j = 0; j < 3; j++) + { + c1[j] = x[i][j]; + c2[j] = y[i][j]; + + s1[j] += c1[j]; + s2[j] += c2[j]; + } + + for (j = 0; j < 3; j++) + { + sx[j] += c1[0] * c2[j]; + sy[j] += c1[1] * c2[j]; + sz[j] += c1[2] * c2[j]; + } + } + for (i = 0; i < 3; i++) + { + xc[i] = s1[i] / n; + yc[i] = s2[i] / n; + } + if (mode == 2 || mode == 0) + for (int mm = 0; mm < n; mm++) + for (int nn = 0; nn < 3; nn++) + e0 += (x[mm][nn] - xc[nn]) * (x[mm][nn] - xc[nn]) + + (y[mm][nn] - yc[nn]) * (y[mm][nn] - yc[nn]); + for (j = 0; j < 3; j++) + { + r[j][0] = sx[j] - s1[0] * s2[j] / n; + r[j][1] = sy[j] - s1[1] * s2[j] / n; + r[j][2] = sz[j] - s1[2] * s2[j] / n; + } + + //compute determinat of matrix r + det = r[0][0] * (r[1][1] * r[2][2] - r[1][2] * r[2][1])\ + - r[0][1] * (r[1][0] * r[2][2] - r[1][2] * r[2][0])\ + + r[0][2] * (r[1][0] * r[2][1] - r[1][1] * r[2][0]); + sigma = det; + + //compute tras(r)*r + m = 0; + for (j = 0; j<3; j++) + { + for (i = 0; i <= j; i++) + { + rr[m] = r[0][i] * r[0][j] + r[1][i] * r[1][j] + r[2][i] * r[2][j]; + m++; + } + } + + double spur = (rr[0] + rr[2] + rr[5]) / 3.0; + double cof = (((((rr[2] * rr[5] - rr[4] * rr[4]) + rr[0] * rr[5])\ + - rr[3] * rr[3]) + rr[0] * rr[2]) - rr[1] * rr[1]) / 3.0; + det = det*det; + + for (i = 0; i<3; i++) e[i] = spur; + + if (spur>0) + { + d = spur*spur; + h = d - cof; + g = (spur*cof - det) / 2.0 - spur*h; + + if (h>0) + { + sqrth = sqrt(h); + d = h*h*h - g*g; + if (d<0.0) d = 0.0; + d = atan2(sqrt(d), -g) / 3.0; + cth = sqrth * cos(d); + sth = sqrth*sqrt3*sin(d); + e[0] = (spur + cth) + cth; + e[1] = (spur - cth) + sth; + e[2] = (spur - cth) - sth; + + if (mode != 0) + {//compute a + for (l = 0; l<3; l = l + 2) + { + d = e[l]; + ss[0] = (d - rr[2]) * (d - rr[5]) - rr[4] * rr[4]; + ss[1] = (d - rr[5]) * rr[1] + rr[3] * rr[4]; + ss[2] = (d - rr[0]) * (d - rr[5]) - rr[3] * rr[3]; + ss[3] = (d - rr[2]) * rr[3] + rr[1] * rr[4]; + ss[4] = (d - rr[0]) * rr[4] + rr[1] * rr[3]; + ss[5] = (d - rr[0]) * (d - rr[2]) - rr[1] * rr[1]; + + if (fabs(ss[0]) <= epsilon) ss[0] = 0.0; + if (fabs(ss[1]) <= epsilon) ss[1] = 0.0; + if (fabs(ss[2]) <= epsilon) ss[2] = 0.0; + if (fabs(ss[3]) <= epsilon) ss[3] = 0.0; + if (fabs(ss[4]) <= epsilon) ss[4] = 0.0; + if (fabs(ss[5]) <= epsilon) ss[5] = 0.0; + + if (fabs(ss[0]) >= fabs(ss[2])) + { + j = 0; + if (fabs(ss[0]) < fabs(ss[5])) j = 2; + } + else if (fabs(ss[2]) >= fabs(ss[5])) j = 1; + else j = 2; + + d = 0.0; + j = 3 * j; + for (i = 0; i<3; i++) + { + k = ip[i + j]; + a[i][l] = ss[k]; + d = d + ss[k] * ss[k]; + } + + + //if( d > 0.0 ) d = 1.0 / sqrt(d); + if (d > epsilon) d = 1.0 / sqrt(d); + else d = 0.0; + for (i = 0; i<3; i++) a[i][l] = a[i][l] * d; + }//for l + + d = a[0][0] * a[0][2] + a[1][0] * a[1][2] + a[2][0] * a[2][2]; + if ((e[0] - e[1]) >(e[1] - e[2])) + { + m1 = 2; + m = 0; + } + else + { + m1 = 0; + m = 2; + } + p = 0; + for (i = 0; i<3; i++) + { + a[i][m1] = a[i][m1] - d*a[i][m]; + p = p + a[i][m1] * a[i][m1]; + } + if (p <= tol) + { + p = 1.0; + for (i = 0; i<3; i++) + { + if (p < fabs(a[i][m])) continue; + p = fabs(a[i][m]); + j = i; + } + k = ip2312[j]; + l = ip2312[j + 1]; + p = sqrt(a[k][m] * a[k][m] + a[l][m] * a[l][m]); + if (p > tol) + { + a[j][m1] = 0.0; + a[k][m1] = -a[l][m] / p; + a[l][m1] = a[k][m] / p; + } + else a_failed = 1; + }//if p<=tol + else + { + p = 1.0 / sqrt(p); + for (i = 0; i<3; i++) a[i][m1] = a[i][m1] * p; + }//else p<=tol + if (a_failed != 1) + { + a[0][1] = a[1][2] * a[2][0] - a[1][0] * a[2][2]; + a[1][1] = a[2][2] * a[0][0] - a[2][0] * a[0][2]; + a[2][1] = a[0][2] * a[1][0] - a[0][0] * a[1][2]; + } + }//if(mode!=0) + }//h>0 + + //compute b anyway + if (mode != 0 && a_failed != 1)//a is computed correctly + { + //compute b + for (l = 0; l<2; l++) + { + d = 0.0; + for (i = 0; i<3; i++) + { + b[i][l] = r[i][0] * a[0][l] + + r[i][1] * a[1][l] + r[i][2] * a[2][l]; + d = d + b[i][l] * b[i][l]; + } + //if( d > 0 ) d = 1.0 / sqrt(d); + if (d > epsilon) d = 1.0 / sqrt(d); + else d = 0.0; + for (i = 0; i<3; i++) b[i][l] = b[i][l] * d; + } + d = b[0][0] * b[0][1] + b[1][0] * b[1][1] + b[2][0] * b[2][1]; + p = 0.0; + + for (i = 0; i<3; i++) + { + b[i][1] = b[i][1] - d*b[i][0]; + p += b[i][1] * b[i][1]; + } + + if (p <= tol) + { + p = 1.0; + for (i = 0; i<3; i++) + { + if (p<fabs(b[i][0])) continue; + p = fabs(b[i][0]); + j = i; + } + k = ip2312[j]; + l = ip2312[j + 1]; + p = sqrt(b[k][0] * b[k][0] + b[l][0] * b[l][0]); + if (p > tol) + { + b[j][1] = 0.0; + b[k][1] = -b[l][0] / p; + b[l][1] = b[k][0] / p; + } + else b_failed = 1; + }//if( p <= tol ) + else + { + p = 1.0 / sqrt(p); + for (i = 0; i<3; i++) b[i][1] = b[i][1] * p; + } + if (b_failed != 1) + { + b[0][2] = b[1][0] * b[2][1] - b[1][1] * b[2][0]; + b[1][2] = b[2][0] * b[0][1] - b[2][1] * b[0][0]; + b[2][2] = b[0][0] * b[1][1] - b[0][1] * b[1][0]; + //compute u + for (i = 0; i<3; i++) + for (j = 0; j<3; j++) + u[i][j] = b[i][0] * a[j][0] + + b[i][1] * a[j][1] + b[i][2] * a[j][2]; + } + + //compute t + for (i = 0; i<3; i++) + t[i] = ((yc[i] - u[i][0] * xc[0]) - u[i][1] * xc[1]) - + u[i][2] * xc[2]; + }//if(mode!=0 && a_failed!=1) + }//spur>0 + else //just compute t and errors + { + //compute t + for (i = 0; i<3; i++) + t[i] = ((yc[i] - u[i][0] * xc[0]) - u[i][1] * xc[1]) - + u[i][2] * xc[2]; + }//else spur>0 + + //compute rms + for (i = 0; i<3; i++) + { + if (e[i] < 0) e[i] = 0; + e[i] = sqrt(e[i]); + } + d = e[2]; + if (sigma < 0.0) d = -d; + d = (d + e[1]) + e[0]; + + if (mode == 2 || mode == 0) + { + rms1 = (e0 - d) - d; + if (rms1 < 0.0) rms1 = 0.0; + } + + *rms = rms1; + return true; +} diff --git a/modules/bindings/src/tmalign/NW.h b/modules/bindings/src/tmalign/NW.h new file mode 100644 index 000000000..a9dd6a519 --- /dev/null +++ b/modules/bindings/src/tmalign/NW.h @@ -0,0 +1,261 @@ +/* Partial implementation of Needleman-Wunsch (NW) dymanamic programming for + * global alignment. The three NWDP_TM functions below are not complete + * implementation of NW algorithm because gap jumping in the standard Gotoh + * algorithm is not considered. Since the gap opening and gap extension is + * the same, this is not a problem. This code was exploited in TM-align + * because it is about 1.5 times faster than a complete NW implementation. + * Nevertheless, if gap openning != gap extension shall be implemented in + * the future, the Gotoh algorithm must be implemented. In rare scenarios, + * it is also possible to have asymmetric alignment (i.e. + * TMalign A.pdb B.pdb and TMalign B.pdb A.pdb have different TM_A and TM_B + * values) caused by the NWPD_TM implement. + */ + +/* Input: score[1:len1, 1:len2], and gap_open + * Output: j2i[1:len2] \in {1:len1} U {-1} + * path[0:len1, 0:len2]=1,2,3, from diagonal, horizontal, vertical */ +void NWDP_TM(double **score, bool **path, double **val, + int len1, int len2, double gap_open, int j2i[]) +{ + + int i, j; + double h, v, d; + + //initialization + for(i=0; i<=len1; i++) + { + //val[i][0]=0; + val[i][0]=i*gap_open; + path[i][0]=false; //not from diagonal + } + + for(j=0; j<=len2; j++) + { + //val[0][j]=0; + val[0][j]=j*gap_open; + path[0][j]=false; //not from diagonal + j2i[j]=-1; //all are not aligned, only use j2i[1:len2] + } + + + //decide matrix and path + for(i=1; i<=len1; i++) + { + for(j=1; j<=len2; j++) + { + d=val[i-1][j-1]+score[i][j]; //diagonal + + //symbol insertion in horizontal (= a gap in vertical) + h=val[i-1][j]; + if(path[i-1][j]) h += gap_open; //aligned in last position + + //symbol insertion in vertical + v=val[i][j-1]; + if(path[i][j-1]) v += gap_open; //aligned in last position + + + if(d>=h && d>=v) + { + path[i][j]=true; //from diagonal + val[i][j]=d; + } + else + { + path[i][j]=false; //from horizontal + if(v>=h) val[i][j]=v; + else val[i][j]=h; + } + } //for i + } //for j + + //trace back to extract the alignment + i=len1; + j=len2; + while(i>0 && j>0) + { + if(path[i][j]) //from diagonal + { + j2i[j-1]=i-1; + i--; + j--; + } + else + { + h=val[i-1][j]; + if(path[i-1][j]) h +=gap_open; + + v=val[i][j-1]; + if(path[i][j-1]) v +=gap_open; + + if(v>=h) j--; + else i--; + } + } +} + +/* Input: vectors x, y, rotation matrix t, u, scale factor d02, and gap_open + * Output: j2i[1:len2] \in {1:len1} U {-1} + * path[0:len1, 0:len2]=1,2,3, from diagonal, horizontal, vertical */ +void NWDP_TM(bool **path, double **val, double **x, double **y, + int len1, int len2, double t[3], double u[3][3], + double d02, double gap_open, int j2i[]) +{ + int i, j; + double h, v, d; + + //initialization. use old val[i][0] and val[0][j] initialization + //to minimize difference from TMalign fortran version + for(i=0; i<=len1; i++) + { + val[i][0]=0; + //val[i][0]=i*gap_open; + path[i][0]=false; //not from diagonal + } + + for(j=0; j<=len2; j++) + { + val[0][j]=0; + //val[0][j]=j*gap_open; + path[0][j]=false; //not from diagonal + j2i[j]=-1; //all are not aligned, only use j2i[1:len2] + } + double xx[3], dij; + + + //decide matrix and path + for(i=1; i<=len1; i++) + { + transform(t, u, &x[i-1][0], xx); + for(j=1; j<=len2; j++) + { + dij=dist(xx, &y[j-1][0]); + d=val[i-1][j-1] + 1.0/(1+dij/d02); + + //symbol insertion in horizontal (= a gap in vertical) + h=val[i-1][j]; + if(path[i-1][j]) h += gap_open; //aligned in last position + + //symbol insertion in vertical + v=val[i][j-1]; + if(path[i][j-1]) v += gap_open; //aligned in last position + + + if(d>=h && d>=v) + { + path[i][j]=true; //from diagonal + val[i][j]=d; + } + else + { + path[i][j]=false; //from horizontal + if(v>=h) val[i][j]=v; + else val[i][j]=h; + } + } //for i + } //for j + + //trace back to extract the alignment + i=len1; + j=len2; + while(i>0 && j>0) + { + if(path[i][j]) //from diagonal + { + j2i[j-1]=i-1; + i--; + j--; + } + else + { + h=val[i-1][j]; + if(path[i-1][j]) h +=gap_open; + + v=val[i][j-1]; + if(path[i][j-1]) v +=gap_open; + + if(v>=h) j--; + else i--; + } + } +} + +/* +ss + * Input: secondary structure secx, secy, and gap_open + * Output: j2i[1:len2] \in {1:len1} U {-1} + * path[0:len1, 0:len2]=1,2,3, from diagonal, horizontal, vertical */ +void NWDP_TM(bool **path, double **val, const int *secx, const int *secy, + const int len1, const int len2, const double gap_open, int j2i[]) +{ + + int i, j; + double h, v, d; + + //initialization + for(i=0; i<=len1; i++) + { + //val[i][0]=0; + val[i][0]=i*gap_open; + path[i][0]=false; //not from diagonal + } + + for(j=0; j<=len2; j++) + { + //val[0][j]=0; + val[0][j]=j*gap_open; + path[0][j]=false; //not from diagonal + j2i[j]=-1; //all are not aligned, only use j2i[1:len2] + } + + //decide matrix and path + for(i=1; i<=len1; i++) + { + for(j=1; j<=len2; j++) + { + d=val[i-1][j-1] + 1.0*(secx[i-1]==secy[j-1]); + + //symbol insertion in horizontal (= a gap in vertical) + h=val[i-1][j]; + if(path[i-1][j]) h += gap_open; //aligned in last position + + //symbol insertion in vertical + v=val[i][j-1]; + if(path[i][j-1]) v += gap_open; //aligned in last position + + if(d>=h && d>=v) + { + path[i][j]=true; //from diagonal + val[i][j]=d; + } + else + { + path[i][j]=false; //from horizontal + if(v>=h) val[i][j]=v; + else val[i][j]=h; + } + } //for i + } //for j + + //trace back to extract the alignment + i=len1; + j=len2; + while(i>0 && j>0) + { + if(path[i][j]) //from diagonal + { + j2i[j-1]=i-1; + i--; + j--; + } + else + { + h=val[i-1][j]; + if(path[i-1][j]) h +=gap_open; + + v=val[i][j-1]; + if(path[i][j-1]) v +=gap_open; + + if(v>=h) j--; + else i--; + } + } +} diff --git a/modules/bindings/src/tmalign/NWalign.cpp b/modules/bindings/src/tmalign/NWalign.cpp new file mode 100644 index 000000000..269e26315 --- /dev/null +++ b/modules/bindings/src/tmalign/NWalign.cpp @@ -0,0 +1,358 @@ +#include "NWalign.h" + +using namespace std; + +void print_extra_help() +{ + cout << +"Additional options:\n" +" -dir Perform all-against-all alignment among the list of PDB\n" +" chains listed by 'chain_list' under 'chain_folder'. Note\n" +" that the slash is necessary.\n" +" $ NWalign -dir chain_folder/ chain_list\n" +"\n" +" -dir1 Use chain2 to search a list of PDB chains listed by 'chain1_list'\n" +" under 'chain1_folder'. Note that the slash is necessary.\n" +" $ NWalign -dir1 chain1_folder/ chain1_list chain2\n" +"\n" +" -dir2 Use chain1 to search a list of PDB chains listed by 'chain2_list'\n" +" under 'chain2_folder'\n" +" $ NWalign chain1 -dir2 chain2_folder/ chain2_list\n" +"\n" +" -suffix (Only when -dir1 and/or -dir2 are set, default is empty)\n" +" add file name suffix to files listed by chain1_list or chain2_list\n" +"\n" +" -atom 4-character atom name used to represent a residue.\n" +" Default is \" C3'\" for RNA/DNA and \" CA \" for proteins\n" +" (note the spaces before and after CA).\n" +"\n" +" -mol Molecule type: RNA or protein\n" +" Default is detect molecule type automatically\n" +"\n" +" -ter Strings to mark the end of a chain\n" +" 3: (default) TER, ENDMDL, END or different chain ID\n" +" 2: ENDMDL, END, or different chain ID\n" +" 1: ENDMDL or END\n" +" 0: (default in the first C++ TMalign) end of file\n" +"\n" +" For FASTA intput (-infmt1/-infmt2 4), -ter 0 means read all\n" +" sequences; -ter >=1 means read the first sequence only." +"\n" +" -split Whether to split PDB file into multiple chains\n" +" 0: (default) treat the whole structure as one single chain\n" +" 1: treat each MODEL as a separate chain (-ter should be 0)\n" +" 2: treat each chain as a seperate chain (-ter should be <=1)\n" +"\n" +" For FASTA intput, -split 0 means concatenate all sequences into\n" +" one read all sequence; -split >=1 means each sequence is an\n" +" individual entry." +"\n" +" -outfmt Output format\n" +" 0: (default) full output\n" +" 1: fasta format compact output\n" +" 2: tabular format very compact output\n" + <<endl; +} + +void print_help(bool h_opt=false) +{ + cout << +"Pairwise sequence alignment between two sequences.\n" +"\n" +"Usage: NWalign PDB1.pdb PDB2.pdb [Options]\n" +"\n" +"Options:\n" +" -h Print the full help message\n" +"\n" +" -glocal Global or local alignment\n" +" 0: (default) Needleman-Wunsch algorithm for global alignment\n" +" 1: glocal-query alignment\n" +" 2: glocal-both alignment\n" +" 3: Smith-Waterman algorithm for local alignment\n" +"\n" +" -infmt1 Input format for chain1\n" +" -infmt2 Input format for chain2\n" +" -1: (default) automatically detect PDB or PDBx/mmCIF format\n" +" 0: PDB format\n" +" 2: xyz format\n" +" 3: PDBx/mmCIF format\n" +" 4: FASTA format sequence\n" + <<endl; + + if (h_opt) print_extra_help(); + + exit(EXIT_SUCCESS); +} + +int main(int argc, char *argv[]) +{ + if (argc < 2) print_help(); + + + clock_t t1, t2; + t1 = clock(); + + /**********************/ + /* get argument */ + /**********************/ + string xname =""; + string yname =""; + bool h_opt =false; // print full help message + int infmt1_opt=-1; // FASTA sequence + int infmt2_opt=-1; // FASTA sequence + int ter_opt =3; // TER, END, or different chainID + int split_opt =0; // do not split chain + int outfmt_opt=0; // set -outfmt to full output + string atom_opt ="auto";// use C alpha atom for protein and C3' for RNA + string mol_opt ="auto";// auto-detect the molecule type as protein/RNA + string suffix_opt=""; // set -suffix to empty + string dir_opt =""; // set -dir to empty + string dir1_opt =""; // set -dir1 to empty + string dir2_opt =""; // set -dir2 to empty + vector<string> chain1_list; // only when -dir1 is set + vector<string> chain2_list; // only when -dir2 is set + int glocal =0; + + for(int i = 1; i < argc; i++) + { + if ( !strcmp(argv[i],"-h") ) + { + h_opt = true; + } + else if ( !strcmp(argv[i],"-infmt1") && i < (argc-1) ) + { + infmt1_opt=atoi(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-infmt2") && i < (argc-1) ) + { + infmt2_opt=atoi(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-ter") && i < (argc-1) ) + { + ter_opt=atoi(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-split") && i < (argc-1) ) + { + split_opt=atoi(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-atom") && i < (argc-1) ) + { + atom_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-mol") && i < (argc-1) ) + { + mol_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-dir") && i < (argc-1) ) + { + dir_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-dir1") && i < (argc-1) ) + { + dir1_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-dir2") && i < (argc-1) ) + { + dir2_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-suffix") && i < (argc-1) ) + { + suffix_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-outfmt") && i < (argc-1) ) + { + outfmt_opt=atoi(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-glocal") && i < (argc-1) ) + { + glocal=atoi(argv[i + 1]); i++; + } + else if (xname.size() == 0) xname=argv[i]; + else if (yname.size() == 0) yname=argv[i]; + else PrintErrorAndQuit(string("ERROR! Undefined option ")+argv[i]); + } + + if(xname.size()==0 || (yname.size()==0 && dir_opt.size()==0) || + (yname.size() && dir_opt.size())) + { + if (h_opt) print_help(h_opt); + if (xname.size()==0) + PrintErrorAndQuit("Please provide input sequences"); + else if (yname.size()==0 && dir_opt.size()==0) + PrintErrorAndQuit("Please provide sequence 2"); + else if (yname.size() && dir_opt.size()) + PrintErrorAndQuit("Please provide only one file name if -dir is set"); + } + + if (suffix_opt.size() && dir_opt.size()+dir1_opt.size()+dir2_opt.size()==0) + PrintErrorAndQuit("-suffix is only valid if -dir, -dir1 or -dir2 is set"); + if (dir_opt.size() && (dir1_opt.size() || dir2_opt.size())) + PrintErrorAndQuit("-dir cannot be set with -dir1 or -dir2"); + if (atom_opt.size()!=4) + PrintErrorAndQuit("ERROR! atom name must have 4 characters, including space."); + if (mol_opt!="auto" && mol_opt!="protein" && mol_opt!="RNA") + PrintErrorAndQuit("ERROR! molecule type must be either RNA or protein."); + else if (mol_opt=="protein" && atom_opt=="auto") + atom_opt=" CA "; + else if (mol_opt=="RNA" && atom_opt=="auto") + atom_opt=" C3'"; + + if (split_opt==1 && ter_opt!=0) + PrintErrorAndQuit("-split 1 should be used with -ter 0"); + else if (split_opt==2 && ter_opt!=0 && ter_opt!=1) + PrintErrorAndQuit("-split 2 should be used with -ter 0 or 1"); + if (split_opt<0 || split_opt>2) + PrintErrorAndQuit("-split can only be 0, 1 or 2"); + + /* parse file list */ + if (dir1_opt.size()+dir_opt.size()==0) chain1_list.push_back(xname); + else file2chainlist(chain1_list, xname, dir_opt+dir1_opt, suffix_opt); + + if (dir_opt.size()) + for (int i=0;i<chain1_list.size();i++) + chain2_list.push_back(chain1_list[i]); + else if (dir2_opt.size()==0) chain2_list.push_back(yname); + else file2chainlist(chain2_list, yname, dir2_opt, suffix_opt); + + if (outfmt_opt==2) + cout<<"#sequence1\tsequence2\tID1\tID2\tIDali\tL1\tL2\tLali"<<endl; + + /* declare previously global variables */ + vector<vector<string> >PDB_lines1; // text of chain1 + vector<vector<string> >PDB_lines2; // text of chain2 + vector<int> mol_vec1; // molecule type of chain1, RNA if >0 + vector<int> mol_vec2; // molecule type of chain2, RNA if >0 + vector<string> chainID_list1; // list of chainID1 + vector<string> chainID_list2; // list of chainID2 + int i,j; // file index + int chain_i,chain_j; // chain index + int xlen, ylen; // chain length + int xchainnum,ychainnum;// number of chains in a PDB file + char *seqx, *seqy; // for the protein sequence + int l; // residue index + + /* loop over file names */ + for (i=0;i<chain1_list.size();i++) + { + /* parse chain 1 */ + xname=chain1_list[i]; + if (infmt1_opt>=4) xchainnum=get_FASTA_lines(xname, PDB_lines1, + chainID_list1, mol_vec1, ter_opt, split_opt); + else xchainnum=get_PDB_lines(xname, PDB_lines1, chainID_list1, + mol_vec1, ter_opt, infmt1_opt, atom_opt, split_opt); + if (!xchainnum) + { + cerr<<"Warning! Cannot parse file: "<<xname + <<". Chain number 0."<<endl; + continue; + } + for (chain_i=0;chain_i<xchainnum;chain_i++) + { + if (infmt1_opt>=4) xlen=PDB_lines1[chain_i][0].size(); + else xlen=PDB_lines1[chain_i].size(); + if (mol_opt=="RNA") mol_vec1[chain_i]=1; + else if (mol_opt=="protein") mol_vec1[chain_i]=-1; + if (!xlen) + { + cerr<<"Warning! Cannot parse file: "<<xname + <<". Chain length 0."<<endl; + continue; + } + seqx = new char[xlen + 1]; + if (infmt1_opt>=4) strcpy(seqx,PDB_lines1[chain_i][0].c_str()); + else for (l=0;l<xlen;l++) + seqx[l]=AAmap(PDB_lines1[chain_i][l].substr(17,3)); + seqx[xlen]=0; + + for (j=(dir_opt.size()>0)*(i+1);j<chain2_list.size();j++) + { + /* parse chain 2 */ + if (PDB_lines2.size()==0) + { + yname=chain2_list[j]; + if (infmt2_opt>=4) + ychainnum=get_FASTA_lines(yname, PDB_lines2, + chainID_list2, mol_vec2, ter_opt, split_opt); + else ychainnum=get_PDB_lines(yname, PDB_lines2, + chainID_list2, mol_vec2, ter_opt, + infmt2_opt, atom_opt, split_opt); + if (!ychainnum) + { + cerr<<"Warning! Cannot parse file: "<<yname + <<". Chain number 0."<<endl; + continue; + } + } + for (chain_j=0;chain_j<ychainnum;chain_j++) + { + if (infmt2_opt>=4) ylen=PDB_lines2[chain_j][0].size(); + else ylen=PDB_lines2[chain_j].size(); + if (mol_opt=="RNA") mol_vec2[chain_j]=1; + else if (mol_opt=="protein") mol_vec2[chain_j]=-1; + if (!ylen) + { + cerr<<"Warning! Cannot parse file: "<<yname + <<". Chain length 0."<<endl; + continue; + } + seqy = new char[ylen + 1]; + if (infmt2_opt>=4) + strcpy(seqy,PDB_lines2[chain_j][0].c_str()); + else for (l=0;l<ylen;l++) + seqy[l]=AAmap(PDB_lines2[chain_j][l].substr(17,3)); + seqy[ylen]=0; + + int L_ali; // Aligned length + double Liden=0; + string seqM, seqxA, seqyA;// for output alignment + + int aln_score=NWalign(seqx, seqy, xlen, ylen, seqxA, seqyA, + mol_vec1[chain_i]+mol_vec2[chain_j], glocal); + + get_seqID(seqxA, seqyA, seqM, Liden, L_ali); + + output_NWalign_results( + xname.substr(dir1_opt.size()), + yname.substr(dir2_opt.size()), + chainID_list1[chain_i].c_str(), + chainID_list2[chain_j].c_str(), + xlen, ylen, seqM.c_str(), seqxA.c_str(), + seqyA.c_str(), Liden, L_ali, aln_score, outfmt_opt); + + /* Done! Free memory */ + seqM.clear(); + seqxA.clear(); + seqyA.clear(); + delete [] seqy; + } // chain_j + if (chain2_list.size()>1) + { + yname.clear(); + for (chain_j=0;chain_j<ychainnum;chain_j++) + PDB_lines2[chain_j].clear(); + PDB_lines2.clear(); + chainID_list2.clear(); + mol_vec2.clear(); + } + } // j + PDB_lines1[chain_i].clear(); + delete [] seqx; + } // chain_i + xname.clear(); + PDB_lines1.clear(); + chainID_list1.clear(); + mol_vec1.clear(); + } // i + if (chain2_list.size()==1) + { + yname.clear(); + for (chain_j=0;chain_j<ychainnum;chain_j++) + PDB_lines2[chain_j].clear(); + PDB_lines2.clear(); + chainID_list2.clear(); + mol_vec2.clear(); + } + chain1_list.clear(); + chain2_list.clear(); + return 0; +} diff --git a/modules/bindings/src/tmalign/NWalign.h b/modules/bindings/src/tmalign/NWalign.h new file mode 100644 index 000000000..e0125bb61 --- /dev/null +++ b/modules/bindings/src/tmalign/NWalign.h @@ -0,0 +1,462 @@ +/* header for Needleman-Wunsch global sequence alignment */ +#ifndef NWalign_H +#define NWalign_H 1 + +#include "basic_fun.h" +#include "BLOSUM.h" + +#define MAX(A,B) ((A)>(B)?(A):(B)) + +using namespace std; + +const int gapopen_blosum62=-11; +const int gapext_blosum62=-1; + +const int gapopen_blastn=-5; +const int gapext_blastn=-2; + +/* initialize matrix in gotoh algorithm */ +void init_gotoh_mat(int **S, int **JumpH, int **JumpV, int **P, + int **H, int **V, const int xlen, const int ylen, const int gapopen, + const int gapext, const int glocal=0, const int alt_init=1) +{ + // fill first row/colum of JumpH,jumpV and path matrix P + int i,j; + for (i=0;i<xlen+1;i++) + for (j=0;j<ylen+1;j++) + H[i][j]=V[i][j]=P[i][j]=JumpH[i][j]=JumpV[i][j]=0; + for (i=0;i<xlen+1;i++) + { + if (glocal<2) P[i][0]=4; // - + JumpV[i][0]=i; + } + for (j=0;j<ylen+1;j++) + { + if (glocal<1) P[0][j]=2; // | + JumpH[0][j]=j; + } + if (glocal<2) for (i=1;i<xlen+1;i++) S[i][0]=gapopen+gapext*(i-1); + if (glocal<1) for (j=1;j<ylen+1;j++) S[0][j]=gapopen+gapext*(j-1); + if (alt_init==0) + { + for (i=1;i<xlen+1;i++) H[i][0]=gapopen+gapext*(i-1); + for (j=1;j<ylen+1;j++) V[0][j]=gapopen+gapext*(j-1); + } + else + { + if (glocal<2) for (i=1;i<xlen+1;i++) V[i][0]=gapopen+gapext*(i-1); + if (glocal<1) for (j=1;j<ylen+1;j++) H[0][j]=gapopen+gapext*(j-1); + for (i=0;i<xlen+1;i++) H[i][0]=-99999; // INT_MIN cause bug on ubuntu + for (j=0;j<ylen+1;j++) V[0][j]=-99999; // INT_MIN; + } +} + +/* locate the cell with highest alignment score. reset path after + * the cell to zero */ +void find_highest_align_score( int **S, int **P, + int &aln_score, const int xlen,const int ylen) +{ + // locate the cell with highest alignment score + int max_aln_i=xlen; + int max_aln_j=ylen; + int i,j; + for (i=0;i<xlen+1;i++) + { + for (j=0;j<ylen+1;j++) + { + if (S[i][j]>=aln_score) + { + max_aln_i=i; + max_aln_j=j; + aln_score=S[i][j]; + } + } + } + + // reset all path after [max_aln_i][max_aln_j] + for (i=max_aln_i+1;i<xlen+1;i++) for (j=0;j<ylen+1;j++) P[i][j]=0; + for (i=0;i<xlen+1;i++) for (j=max_aln_j+1;j<ylen+1;j++) P[i][j]=0; +} + +/* calculate dynamic programming matrix using gotoh algorithm + * S - cumulative scorefor each cell + * P - string representation for path + * 0 : uninitialized, for gaps at N- & C- termini when glocal>0 + * 1 : \ match-mismatch + * 2 : | vertical gap (insertion) + * 4 : - horizontal gap (deletion) + * JumpH - horizontal long gap number. + * JumpV - vertical long gap number. + * all matrices are in the size of [len(seqx)+1]*[len(seqy)+1] + * + * glocal - global or local alignment + * 0 : global alignment (Needleman-Wunsch dynamic programming) + * 1 : glocal-query alignment + * 2 : glocal-both alignment + * 3 : local alignment (Smith-Waterman dynamic programming) + * + * alt_init - whether to adopt alternative matrix initialization + * 1 : use wei zheng's matrix initialization + * 0 : use yang zhang's matrix initialization, does NOT work + * for glocal alignment + */ +int calculate_score_gotoh(const int xlen,const int ylen, int **S, + int** JumpH, int** JumpV, int **P, const int gapopen,const int gapext, + const int glocal=0, const int alt_init=1) +{ + int **H; + int **V; + NewArray(&H,xlen+1,ylen+1); // penalty score for horizontal long gap + NewArray(&V,xlen+1,ylen+1); // penalty score for vertical long gap + + // fill first row/colum of JumpH,jumpV and path matrix P + int i,j; + init_gotoh_mat(S, JumpH, JumpV, P, H, V, xlen, ylen, + gapopen, gapext, glocal, alt_init); + + // fill S and P + int diag_score,left_score,up_score; + for (i=1;i<xlen+1;i++) + { + for (j=1;j<ylen+1;j++) + { + // penalty of consective deletion + if (glocal<1 || i<xlen || glocal>=3) + { + H[i][j]=MAX(S[i][j-1]+gapopen,H[i][j-1]+gapext); + JumpH[i][j]=(H[i][j]==H[i][j-1]+gapext)?(JumpH[i][j-1]+1):1; + } + else + { + H[i][j]=MAX(S[i][j-1],H[i][j-1]); + JumpH[i][j]=(H[i][j]==H[i][j-1])?(JumpH[i][j-1]+1):1; + } + // penalty of consective insertion + if (glocal<2 || j<ylen || glocal>=3) + { + V[i][j]=MAX(S[i-1][j]+gapopen,V[i-1][j]+gapext); + JumpV[i][j]=(V[i][j]==V[i-1][j]+gapext)?(JumpV[i-1][j]+1):1; + } + else + { + V[i][j]=MAX(S[i-1][j],V[i-1][j]); + JumpV[i][j]=(V[i][j]==V[i-1][j])?(JumpV[i-1][j]+1):1; + } + + diag_score=S[i-1][j-1]+S[i][j]; // match-mismatch '\' + left_score=H[i][j]; // deletion '-' + up_score =V[i][j]; // insertion '|' + + if (diag_score>=left_score && diag_score>=up_score) + { + S[i][j]=diag_score; + P[i][j]+=1; + } + if (up_score>=diag_score && up_score>=left_score) + { + S[i][j]=up_score; + P[i][j]+=2; + } + if (left_score>=diag_score && left_score>=up_score) + { + S[i][j]=left_score; + P[i][j]+=4; + } + if (glocal>=3 && S[i][j]<0) + { + S[i][j]=0; + P[i][j]=0; + H[i][j]=0; + V[i][j]=0; + JumpH[i][j]=0; + JumpV[i][j]=0; + } + } + } + int aln_score=S[xlen][ylen]; + + // re-fill first row/column of path matrix P for back-tracing + for (i=1;i<xlen+1;i++) if (glocal<3 || P[i][0]>0) P[i][0]=2; // | + for (j=1;j<ylen+1;j++) if (glocal<3 || P[0][j]>0) P[0][j]=4; // - + + // calculate alignment score and alignment path for swalign + if (glocal>=3) + find_highest_align_score(S,P,aln_score,xlen,ylen); + + // release memory + DeleteArray(&H,xlen+1); + DeleteArray(&V,xlen+1); + return aln_score; // final alignment score +} + +/* trace back dynamic programming path to diciper pairwise alignment */ +void trace_back_gotoh(const char *seqx, const char *seqy, + int ** JumpH, int ** JumpV, int ** P, + string& seqxA, string& seqyA, const int xlen, const int ylen) +{ + int i=xlen; + int j=ylen; + int gaplen,p; + char *buf=new char [MAX(xlen,ylen)+1]; + + while(i+j) + { + gaplen=0; + if (P[i][j]>=4) + { + gaplen=JumpH[i][j]; + j-=gaplen; + strncpy(buf,seqy+j,gaplen); + buf[gaplen]=0; + seqyA=buf+seqyA; + + for (p=0;p<gaplen;p++) buf[p]='-'; + seqxA=buf+seqxA; + } + else if (P[i][j] % 4 >= 2) + { + gaplen=JumpV[i][j]; + i-=gaplen; + strncpy(buf,seqx+i,gaplen); + buf[gaplen]=0; + seqxA=buf+seqxA; + + for (p=0;p<gaplen;p++) buf[p]='-'; + seqyA=buf+seqyA; + } + else + { + if (i==0 && j!=0) // only in glocal alignment + { + strncpy(buf,seqy,j); + buf[j]=0; + seqyA=buf+seqyA; + for (p=0;p<j;p++) buf[p]='-'; + seqxA=buf+seqxA; + break; + } + if (i!=0 && j==0) // only in glocal alignment + { + strncpy(buf,seqx,i); + buf[i]=0; + seqxA=buf+seqxA; + for (p=0;p<i;p++) buf[p]='-'; + seqyA=buf+seqyA; + break; + } + i--; + j--; + seqxA=seqx[i]+seqxA; + seqyA=seqy[j]+seqyA; + } + } + delete [] buf; +} + + +/* trace back Smith-Waterman dynamic programming path to diciper + * pairwise local alignment */ +void trace_back_sw(const char *seqx, const char *seqy, + int **JumpH, int **JumpV, int **P, + string& seqxA, string& seqyA, const int xlen, const int ylen) +{ + int i=xlen; + int j=ylen; + int gaplen,p; + char *buf=new char [xlen+ylen+1]; + + // find the first non-zero cell in P + bool found_start_cell=false; + for (i=xlen;i>=0;i--) + { + for (j=ylen;j>=0;j--) + { + if (P[i][j]!=0) + { + found_start_cell=true; + break; + } + } + if (found_start_cell) break; + } + + /* copy C terminal sequence */ + for (p=0;p<ylen-j;p++) buf[p]='-'; + buf[ylen-j]=0; + seqxA=buf; + strncpy(buf,seqx+i,xlen-i); + buf[xlen-i]=0; + seqxA+=buf; + + strncpy(buf,seqy+j,ylen-j); + buf[ylen-j]=0; + seqyA+=buf; + for (p=0;p<xlen-i;p++) buf[p]='-'; + buf[xlen-i]=0; + seqyA+=buf; + + if (i<0||j<0) + { + delete [] buf; + return; + } + + /* traceback aligned sequences */ + while(P[i][j]!=0) + { + gaplen=0; + if (P[i][j]>=4) + { + gaplen=JumpH[i][j]; + j-=gaplen; + strncpy(buf,seqy+j,gaplen); + buf[gaplen]=0; + seqyA=buf+seqyA; + + for (p=0;p<gaplen;p++) buf[p]='-'; + seqxA=buf+seqxA; + } + else if (P[i][j] % 4 >= 2) + { + gaplen=JumpV[i][j]; + i-=gaplen; + strncpy(buf,seqx+i,gaplen); + buf[gaplen]=0; + seqxA=buf+seqxA; + + for (p=0;p<gaplen;p++) buf[p]='-'; + seqyA=buf+seqyA; + } + else + { + i--; + j--; + seqxA=seqx[i]+seqxA; + seqyA=seqy[j]+seqyA; + } + } + /* copy N terminal sequence */ + for (p=0;p<j;p++) buf[p]='-'; + strncpy(buf+j,seqx,i); + buf[i+j]=0; + seqxA=buf+seqxA; + + strncpy(buf,seqy,j); + for (p=j;p<j+i;p++) buf[p]='-'; + buf[i+j]=0; + seqyA=buf+seqyA; + delete [] buf; +} + +/* entry function for NWalign */ +int NWalign(const char *seqx, const char *seqy, const int xlen, const int ylen, + string & seqxA,string & seqyA, const int mol_type, const int glocal=0) +{ + int **JumpH; + int **JumpV; + int **P; + int **S; + NewArray(&JumpH,xlen+1,ylen+1); + NewArray(&JumpV,xlen+1,ylen+1); + NewArray(&P,xlen+1,ylen+1); + NewArray(&S,xlen+1,ylen+1); + + int aln_score; + int gapopen=gapopen_blosum62; + int gapext =gapext_blosum62; + int i,j; + if (mol_type>0) // RNA or DNA + { + gapopen=gapopen_blastn; + gapext =gapext_blastn; + } + + for (i=0;i<xlen+1;i++) + { + for (j=0;j<ylen+1;j++) + { + if (i*j==0) S[i][j]=0; + else S[i][j]=BLOSUM[seqx[i-1]][seqy[j-1]]; + } + } + + aln_score=calculate_score_gotoh(xlen, ylen, S, JumpH, JumpV, P, + gapopen, gapext, glocal); + + if (glocal<3) trace_back_gotoh(seqx,seqy,JumpH,JumpV,P,seqxA,seqyA,xlen,ylen); + else trace_back_sw(seqx,seqy,JumpH,JumpV,P,seqxA,seqyA,xlen,ylen); + + DeleteArray(&JumpH, xlen+1); + DeleteArray(&JumpV, xlen+1); + DeleteArray(&P, xlen+1); + DeleteArray(&S, xlen+1); + return aln_score; // aligment score +} + +double get_seqID(const string& seqxA, const string& seqyA, + string &seqM,double &Liden,int &L_ali) +{ + Liden=0; + L_ali=0; + for (int i=0;i<seqxA.size();i++) + { + if (seqxA[i]==seqyA[i] && seqxA[i]!='-') + { + Liden++; + seqM+=':'; + } + else seqM+=' '; + L_ali+=(seqxA[i]!='-' && seqyA[i]!='-'); + } + return 1.*Liden/L_ali; +} + + +void output_NWalign_results( + const string xname, const string yname, + const char *chainID1, const char *chainID2, + const int xlen, const int ylen, const char *seqM, + const char *seqxA, const char *seqyA, const double Liden, + const int L_ali, const int aln_score, const int outfmt_opt) +{ + if (outfmt_opt<=0) + { + printf("\nName of Chain_1: %s%s\n", xname.c_str(), chainID1); + printf("Name of Chain_2: %s%s\n", yname.c_str(), chainID2); + printf("Length of Chain_1: %d residues\n", xlen); + printf("Length of Chain_2: %d residues\n\n", ylen); + + printf("Aligned length= %d, Alignment score= %d, Seq_ID=n_identical/n_aligned= %4.3f\n", + L_ali, aln_score, Liden/L_ali); + printf("Seq_ID= %6.5f (if normalized by length of Chain_1\n", Liden/xlen); + printf("Seq_ID= %6.5f (if normalized by length of Chain_2\n", Liden/ylen); + printf("(You should use Seq_ID normalized by length of the reference structure)\n"); + + //output alignment + printf("\n(\":\" denotes pairs with identical residue type)\n"); + printf("%s\n", seqxA); + printf("%s\n", seqM); + printf("%s\n", seqyA); + } + else if (outfmt_opt==1) + { + printf(">%s%s\tL=%d\tseqID=%.3f\n", + xname.c_str(), chainID1, xlen, Liden/xlen); + printf("%s\n", seqxA); + printf(">%s%s\tL=%d\tseqID=%.3f\n", + yname.c_str(), chainID2, ylen, Liden/ylen); + printf("%s\n", seqyA); + printf("# Lali=%d\tseqID_ali=%.3f\n", L_ali, Liden/L_ali); + printf("$$$$\n"); + } + else if (outfmt_opt==2) + { + printf("%s%s\t%s%s\t%4.3f\t%4.3f\t%4.3f\t%d\t%d\t%d", + xname.c_str(), chainID1, yname.c_str(), chainID2, + Liden/xlen, Liden/ylen, Liden/L_ali, + xlen, ylen, L_ali); + } + cout << endl; +} + +#endif diff --git a/modules/bindings/src/tmalign/OST_INFO b/modules/bindings/src/tmalign/OST_INFO new file mode 100644 index 000000000..f0a862227 --- /dev/null +++ b/modules/bindings/src/tmalign/OST_INFO @@ -0,0 +1,7 @@ +Source code has been cloned February 17 2019 from: + +https://github.com/kad-ecoli/TMalign + +last commit: +2ea5b61c6b0c8ded05ff0aea09546d45902b3741 + diff --git a/modules/bindings/src/tmalign/PDB1.pdb b/modules/bindings/src/tmalign/PDB1.pdb new file mode 100644 index 000000000..2f1294039 --- /dev/null +++ b/modules/bindings/src/tmalign/PDB1.pdb @@ -0,0 +1,2561 @@ +ATOM 1 N CYS 1 -22.970 3.802 -61.984 1.00 N +ATOM 2 CA CYS 1 -21.660 3.468 -62.582 1.00 C +ATOM 3 C CYS 1 -21.538 2.021 -62.876 1.00 C +ATOM 4 O CYS 1 -22.461 1.246 -62.650 1.00 O +ATOM 5 1H CYS 1 -23.160 4.653 -61.762 1.00 H +ATOM 6 2H CYS 1 -23.219 3.425 -61.205 1.00 H +ATOM 7 3H CYS 1 -23.728 3.633 -62.438 1.00 H +ATOM 8 CB CYS 1 -20.522 3.902 -61.656 1.00 C +ATOM 9 SG CYS 1 -20.414 5.687 -61.391 1.00 S +ATOM 10 N GLN 2 -20.417 1.652 -63.507 1.00 N +ATOM 11 CA GLN 2 -20.064 0.288 -63.738 1.00 C +ATOM 12 C GLN 2 -19.628 -0.215 -62.397 1.00 C +ATOM 13 O GLN 2 -19.747 -1.400 -62.108 1.00 O +ATOM 14 H GLN 2 -19.874 2.312 -63.791 1.00 H +ATOM 15 CB GLN 2 -18.979 0.190 -64.812 1.00 C +ATOM 16 CD GLN 2 -18.338 0.504 -67.235 1.00 C +ATOM 17 CG GLN 2 -19.449 0.571 -66.206 1.00 C +ATOM 18 OE1 GLN 2 -17.161 0.643 -66.901 1.00 O +ATOM 19 1HE2 GLN 2 -18.088 0.240 -69.142 1.00 H +ATOM 20 2HE2 GLN 2 -19.580 0.192 -68.694 1.00 H +ATOM 21 NE2 GLN 2 -18.708 0.289 -68.492 1.00 N +ATOM 22 N ASP 3 -19.085 0.688 -61.546 1.00 N +ATOM 23 CA ASP 3 -18.539 0.319 -60.263 1.00 C +ATOM 24 C ASP 3 -19.594 -0.348 -59.449 1.00 C +ATOM 25 O ASP 3 -19.368 -1.438 -58.927 1.00 O +ATOM 26 H ASP 3 -19.073 1.549 -61.809 1.00 H +ATOM 27 CB ASP 3 -17.987 1.550 -59.542 1.00 C +ATOM 28 CG ASP 3 -16.711 2.071 -60.173 1.00 C +ATOM 29 OD1 ASP 3 -16.109 1.340 -60.987 1.00 O +ATOM 30 OD2 ASP 3 -16.312 3.211 -59.853 1.00 O +ATOM 31 N VAL 4 -20.786 0.263 -59.331 1.00 N +ATOM 32 CA VAL 4 -21.799 -0.369 -58.541 1.00 C +ATOM 33 C VAL 4 -22.183 -1.670 -59.168 1.00 C +ATOM 34 O VAL 4 -22.406 -2.653 -58.467 1.00 O +ATOM 35 H VAL 4 -20.955 1.050 -59.734 1.00 H +ATOM 36 CB VAL 4 -23.032 0.538 -58.374 1.00 C +ATOM 37 CG1 VAL 4 -24.171 -0.227 -57.718 1.00 C +ATOM 38 CG2 VAL 4 -22.679 1.774 -57.562 1.00 C +ATOM 39 N VAL 5 -22.294 -1.719 -60.506 1.00 N +ATOM 40 CA VAL 5 -22.743 -2.927 -61.137 1.00 C +ATOM 41 C VAL 5 -21.743 -4.040 -61.003 1.00 C +ATOM 42 O VAL 5 -22.120 -5.174 -60.709 1.00 O +ATOM 43 H VAL 5 -22.089 -1.000 -61.006 1.00 H +ATOM 44 CB VAL 5 -23.055 -2.703 -62.628 1.00 C +ATOM 45 CG1 VAL 5 -23.356 -4.026 -63.314 1.00 C +ATOM 46 CG2 VAL 5 -24.219 -1.737 -62.790 1.00 C +ATOM 47 N GLN 6 -20.441 -3.745 -61.215 1.00 N +ATOM 48 CA GLN 6 -19.415 -4.746 -61.160 1.00 C +ATOM 49 C GLN 6 -19.464 -5.244 -59.783 1.00 C +ATOM 50 O GLN 6 -19.266 -6.429 -59.517 1.00 O +ATOM 51 H GLN 6 -20.226 -2.890 -61.395 1.00 H +ATOM 52 CB GLN 6 -18.061 -4.147 -61.547 1.00 C +ATOM 53 CD GLN 6 -16.633 -3.087 -63.340 1.00 C +ATOM 54 CG GLN 6 -17.941 -3.783 -63.017 1.00 C +ATOM 55 OE1 GLN 6 -16.054 -2.408 -62.492 1.00 O +ATOM 56 1HE2 GLN 6 -15.390 -2.865 -64.814 1.00 H +ATOM 57 2HE2 GLN 6 -16.617 -3.761 -65.161 1.00 H +ATOM 58 NE2 GLN 6 -16.163 -3.256 -64.571 1.00 N +ATOM 59 N ASP 7 -19.750 -4.292 -58.890 1.00 N +ATOM 60 CA ASP 7 -20.010 -4.542 -57.531 1.00 C +ATOM 61 C ASP 7 -18.829 -4.193 -56.646 1.00 C +ATOM 62 O ASP 7 -17.736 -3.883 -57.113 1.00 O +ATOM 63 H ASP 7 -19.771 -3.449 -59.204 1.00 H +ATOM 64 CB ASP 7 -20.389 -6.009 -57.319 1.00 C +ATOM 65 CG ASP 7 -21.733 -6.357 -57.928 1.00 C +ATOM 66 OD1 ASP 7 -22.669 -5.539 -57.810 1.00 O +ATOM 67 OD2 ASP 7 -21.850 -7.448 -58.525 1.00 O +ATOM 68 N VAL 8 -19.080 -4.262 -55.319 1.00 N +ATOM 69 CA VAL 8 -18.387 -3.842 -54.118 1.00 C +ATOM 70 C VAL 8 -17.154 -4.623 -53.696 1.00 C +ATOM 71 O VAL 8 -17.088 -4.949 -52.518 1.00 O +ATOM 72 H VAL 8 -19.876 -4.677 -55.257 1.00 H +ATOM 73 CB VAL 8 -19.324 -3.843 -52.896 1.00 C +ATOM 74 CG1 VAL 8 -18.554 -3.488 -51.634 1.00 C +ATOM 75 CG2 VAL 8 -20.479 -2.877 -53.109 1.00 C +ATOM 76 N PRO 9 -16.160 -4.936 -54.493 1.00 N +ATOM 77 CA PRO 9 -15.166 -5.962 -54.200 1.00 C +ATOM 78 C PRO 9 -14.862 -6.454 -52.828 1.00 C +ATOM 79 O PRO 9 -15.063 -7.649 -52.618 1.00 O +ATOM 80 CB PRO 9 -13.857 -5.370 -54.725 1.00 C +ATOM 81 CD PRO 9 -15.528 -3.678 -55.003 1.00 C +ATOM 82 CG PRO 9 -14.074 -3.894 -54.689 1.00 C +ATOM 83 N ASN 10 -14.394 -5.648 -51.873 1.00 N +ATOM 84 CA ASN 10 -14.250 -6.335 -50.627 1.00 C +ATOM 85 C ASN 10 -15.583 -6.198 -49.953 1.00 C +ATOM 86 O ASN 10 -16.108 -5.092 -49.843 1.00 O +ATOM 87 H ASN 10 -14.176 -4.777 -51.934 1.00 H +ATOM 88 CB ASN 10 -13.086 -5.750 -49.824 1.00 C +ATOM 89 CG ASN 10 -11.743 -5.995 -50.482 1.00 C +ATOM 90 OD1 ASN 10 -11.440 -7.112 -50.900 1.00 O +ATOM 91 1HD2 ASN 10 -10.123 -5.038 -50.959 1.00 H +ATOM 92 2HD2 ASN 10 -11.192 -4.147 -50.259 1.00 H +ATOM 93 ND2 ASN 10 -10.932 -4.947 -50.577 1.00 N +ATOM 94 N VAL 11 -16.185 -7.318 -49.492 1.00 N +ATOM 95 CA VAL 11 -17.507 -7.196 -48.941 1.00 C +ATOM 96 C VAL 11 -17.525 -7.669 -47.531 1.00 C +ATOM 97 O VAL 11 -16.831 -8.613 -47.157 1.00 O +ATOM 98 H VAL 11 -15.783 -8.122 -49.523 1.00 H +ATOM 99 CB VAL 11 -18.541 -7.974 -49.776 1.00 C +ATOM 100 CG1 VAL 11 -18.633 -7.398 -51.181 1.00 C +ATOM 101 CG2 VAL 11 -18.182 -9.452 -49.825 1.00 C +ATOM 102 N ASP 12 -18.321 -6.959 -46.711 1.00 N +ATOM 103 CA ASP 12 -18.588 -7.290 -45.350 1.00 C +ATOM 104 C ASP 12 -20.012 -6.836 -45.140 1.00 C +ATOM 105 O ASP 12 -20.246 -5.712 -44.695 1.00 O +ATOM 106 H ASP 12 -18.697 -6.228 -47.078 1.00 H +ATOM 107 CB ASP 12 -17.578 -6.608 -44.425 1.00 C +ATOM 108 CG ASP 12 -17.739 -7.027 -42.977 1.00 C +ATOM 109 OD1 ASP 12 -18.685 -7.787 -42.680 1.00 O +ATOM 110 OD2 ASP 12 -16.920 -6.595 -42.139 1.00 O +ATOM 111 N VAL 13 -20.999 -7.710 -45.452 1.00 N +ATOM 112 CA VAL 13 -22.409 -7.392 -45.407 1.00 C +ATOM 113 C VAL 13 -22.956 -8.071 -44.205 1.00 C +ATOM 114 O VAL 13 -22.367 -9.015 -43.684 1.00 O +ATOM 115 H VAL 13 -20.731 -8.533 -45.699 1.00 H +ATOM 116 CB VAL 13 -23.127 -7.824 -46.699 1.00 C +ATOM 117 CG1 VAL 13 -22.542 -7.098 -47.901 1.00 C +ATOM 118 CG2 VAL 13 -23.030 -9.331 -46.884 1.00 C +ATOM 119 N GLN 14 -24.110 -7.590 -43.725 1.00 N +ATOM 120 CA GLN 14 -24.684 -8.155 -42.554 1.00 C +ATOM 121 C GLN 14 -24.972 -9.567 -42.857 1.00 C +ATOM 122 O GLN 14 -24.978 -10.454 -42.005 1.00 O +ATOM 123 H GLN 14 -24.522 -6.909 -44.144 1.00 H +ATOM 124 CB GLN 14 -25.939 -7.381 -42.145 1.00 C +ATOM 125 CD GLN 14 -25.630 -7.597 -39.648 1.00 C +ATOM 126 CG GLN 14 -26.548 -7.837 -40.830 1.00 C +ATOM 127 OE1 GLN 14 -25.108 -6.496 -39.468 1.00 O +ATOM 128 1HE2 GLN 14 -24.892 -8.540 -38.120 1.00 H +ATOM 129 2HE2 GLN 14 -25.830 -9.417 -39.004 1.00 H +ATOM 130 NE2 GLN 14 -25.429 -8.629 -38.837 1.00 N +ATOM 131 N MET 15 -25.267 -9.805 -44.123 1.00 N +ATOM 132 CA MET 15 -25.525 -11.137 -44.474 1.00 C +ATOM 133 C MET 15 -24.315 -12.022 -44.385 1.00 C +ATOM 134 O MET 15 -24.459 -13.211 -44.110 1.00 O +ATOM 135 H MET 15 -25.306 -9.159 -44.748 1.00 H +ATOM 136 CB MET 15 -26.092 -11.217 -45.893 1.00 C +ATOM 137 SD MET 15 -28.224 -10.998 -47.649 1.00 S +ATOM 138 CE MET 15 -27.332 -9.816 -48.657 1.00 C +ATOM 139 CG MET 15 -27.505 -10.673 -46.028 1.00 C +ATOM 140 N LEU 16 -23.105 -11.490 -44.652 1.00 N +ATOM 141 CA LEU 16 -21.905 -12.290 -44.660 1.00 C +ATOM 142 C LEU 16 -21.776 -12.867 -43.307 1.00 C +ATOM 143 O LEU 16 -21.472 -14.047 -43.141 1.00 O +ATOM 144 H LEU 16 -23.059 -10.609 -44.829 1.00 H +ATOM 145 CB LEU 16 -20.696 -11.438 -45.051 1.00 C +ATOM 146 CG LEU 16 -19.350 -12.162 -45.118 1.00 C +ATOM 147 CD1 LEU 16 -19.390 -13.279 -46.150 1.00 C +ATOM 148 CD2 LEU 16 -18.229 -11.185 -45.440 1.00 C +ATOM 149 N GLU 17 -22.035 -12.033 -42.297 1.00 N +ATOM 150 CA GLU 17 -21.908 -12.491 -40.961 1.00 C +ATOM 151 C GLU 17 -22.934 -13.560 -40.719 1.00 C +ATOM 152 O GLU 17 -22.645 -14.561 -40.069 1.00 O +ATOM 153 H GLU 17 -22.289 -11.185 -42.460 1.00 H +ATOM 154 CB GLU 17 -22.071 -11.329 -39.979 1.00 C +ATOM 155 CD GLU 17 -21.146 -9.166 -39.059 1.00 C +ATOM 156 CG GLU 17 -20.914 -10.343 -39.987 1.00 C +ATOM 157 OE1 GLU 17 -22.279 -9.021 -38.556 1.00 O +ATOM 158 OE2 GLU 17 -20.193 -8.390 -38.835 1.00 O +ATOM 159 N LEU 18 -24.162 -13.385 -41.251 1.00 N +ATOM 160 CA LEU 18 -25.225 -14.313 -40.992 1.00 C +ATOM 161 C LEU 18 -24.842 -15.639 -41.590 1.00 C +ATOM 162 O LEU 18 -25.096 -16.691 -41.008 1.00 O +ATOM 163 H LEU 18 -24.308 -12.669 -41.777 1.00 H +ATOM 164 CB LEU 18 -26.543 -13.792 -41.568 1.00 C +ATOM 165 CG LEU 18 -27.147 -12.567 -40.878 1.00 C +ATOM 166 CD1 LEU 18 -28.347 -12.049 -41.656 1.00 C +ATOM 167 CD2 LEU 18 -27.546 -12.897 -39.448 1.00 C +ATOM 168 N TYR 19 -24.199 -15.608 -42.773 1.00 N +ATOM 169 CA TYR 19 -23.783 -16.764 -43.515 1.00 C +ATOM 170 C TYR 19 -22.810 -17.518 -42.668 1.00 C +ATOM 171 O TYR 19 -22.804 -18.742 -42.687 1.00 O +ATOM 172 H TYR 19 -24.033 -14.784 -43.094 1.00 H +ATOM 173 CB TYR 19 -23.173 -16.349 -44.856 1.00 C +ATOM 174 CG TYR 19 -22.712 -17.512 -45.705 1.00 C +ATOM 175 HH TYR 19 -20.709 -20.964 -47.791 1.00 H +ATOM 176 OH TYR 19 -21.456 -20.710 -48.048 1.00 O +ATOM 177 CZ TYR 19 -21.870 -19.652 -47.272 1.00 C +ATOM 178 CD1 TYR 19 -23.505 -17.999 -46.735 1.00 C +ATOM 179 CE1 TYR 19 -23.091 -19.062 -47.516 1.00 C +ATOM 180 CD2 TYR 19 -21.484 -18.119 -45.472 1.00 C +ATOM 181 CE2 TYR 19 -21.054 -19.183 -46.243 1.00 C +ATOM 182 N ASP 20 -21.910 -16.824 -41.948 1.00 N +ATOM 183 CA ASP 20 -21.012 -17.521 -41.067 1.00 C +ATOM 184 C ASP 20 -21.796 -18.091 -39.924 1.00 C +ATOM 185 O ASP 20 -21.536 -19.205 -39.476 1.00 O +ATOM 186 H ASP 20 -21.868 -15.928 -42.016 1.00 H +ATOM 187 CB ASP 20 -19.912 -16.581 -40.570 1.00 C +ATOM 188 CG ASP 20 -18.917 -16.223 -41.657 1.00 C +ATOM 189 OD1 ASP 20 -18.913 -16.901 -42.705 1.00 O +ATOM 190 OD2 ASP 20 -18.142 -15.263 -41.460 1.00 O +ATOM 191 N ARG 21 -22.788 -17.330 -39.423 1.00 N +ATOM 192 CA ARG 21 -23.560 -17.737 -38.284 1.00 C +ATOM 193 C ARG 21 -24.335 -18.997 -38.589 1.00 C +ATOM 194 O ARG 21 -24.325 -19.916 -37.773 1.00 O +ATOM 195 H ARG 21 -22.961 -16.544 -39.826 1.00 H +ATOM 196 CB ARG 21 -24.511 -16.618 -37.854 1.00 C +ATOM 197 CD ARG 21 -26.346 -15.846 -36.326 1.00 C +ATOM 198 HE ARG 21 -27.209 -15.018 -37.936 1.00 H +ATOM 199 NE ARG 21 -27.324 -15.680 -37.398 1.00 N +ATOM 200 CG ARG 21 -25.349 -16.952 -36.631 1.00 C +ATOM 201 CZ ARG 21 -28.367 -16.482 -37.589 1.00 C +ATOM 202 1HH1 ARG 21 -29.073 -15.586 -39.118 1.00 H +ATOM 203 2HH1 ARG 21 -29.880 -16.771 -38.714 1.00 H +ATOM 204 NH1 ARG 21 -29.205 -16.253 -38.591 1.00 N +ATOM 205 1HH2 ARG 21 -28.027 -17.658 -36.126 1.00 H +ATOM 206 2HH2 ARG 21 -29.245 -18.028 -36.900 1.00 H +ATOM 207 NH2 ARG 21 -28.571 -17.510 -36.777 1.00 N +ATOM 208 N MET 22 -25.026 -19.073 -39.757 1.00 N +ATOM 209 CA MET 22 -25.780 -20.245 -40.167 1.00 C +ATOM 210 C MET 22 -24.782 -21.090 -40.862 1.00 C +ATOM 211 O MET 22 -23.755 -20.601 -41.317 1.00 O +ATOM 212 H MET 22 -25.000 -18.346 -40.287 1.00 H +ATOM 213 CB MET 22 -26.964 -19.839 -41.047 1.00 C +ATOM 214 SD MET 22 -28.721 -19.622 -38.915 1.00 S +ATOM 215 CE MET 22 -29.748 -20.880 -39.672 1.00 C +ATOM 216 CG MET 22 -27.945 -18.895 -40.371 1.00 C +ATOM 217 N SER 23 -25.010 -22.403 -40.892 1.00 N +ATOM 218 CA SER 23 -24.096 -23.255 -41.578 1.00 C +ATOM 219 C SER 23 -24.769 -23.583 -42.906 1.00 C +ATOM 220 O SER 23 -25.411 -22.724 -43.494 1.00 O +ATOM 221 H SER 23 -25.732 -22.753 -40.485 1.00 H +ATOM 222 CB SER 23 -23.787 -24.496 -40.738 1.00 C +ATOM 223 HG SER 23 -22.059 -24.796 -41.373 1.00 H +ATOM 224 OG SER 23 -22.746 -25.260 -41.321 1.00 O +ATOM 225 N PHE 24 -24.654 -24.821 -43.443 1.00 N +ATOM 226 CA PHE 24 -25.094 -25.118 -44.796 1.00 C +ATOM 227 C PHE 24 -26.538 -24.927 -45.163 1.00 C +ATOM 228 O PHE 24 -26.877 -23.986 -45.881 1.00 O +ATOM 229 H PHE 24 -24.292 -25.470 -42.935 1.00 H +ATOM 230 CB PHE 24 -24.771 -26.569 -45.158 1.00 C +ATOM 231 CG PHE 24 -25.219 -26.964 -46.536 1.00 C +ATOM 232 CZ PHE 24 -26.054 -27.698 -49.084 1.00 C +ATOM 233 CD1 PHE 24 -24.482 -26.602 -47.650 1.00 C +ATOM 234 CE1 PHE 24 -24.894 -26.965 -48.918 1.00 C +ATOM 235 CD2 PHE 24 -26.378 -27.698 -46.719 1.00 C +ATOM 236 CE2 PHE 24 -26.790 -28.061 -47.987 1.00 C +ATOM 237 N LYS 25 -27.437 -25.760 -44.615 1.00 N +ATOM 238 CA LYS 25 -28.737 -25.882 -45.221 1.00 C +ATOM 239 C LYS 25 -29.572 -24.662 -45.238 1.00 C +ATOM 240 O LYS 25 -30.048 -24.237 -46.290 1.00 O +ATOM 241 H LYS 25 -27.237 -26.238 -43.879 1.00 H +ATOM 242 CB LYS 25 -29.551 -26.976 -44.527 1.00 C +ATOM 243 CD LYS 25 -31.669 -28.317 -44.413 1.00 C +ATOM 244 CE LYS 25 -33.068 -28.505 -44.978 1.00 C +ATOM 245 CG LYS 25 -30.937 -27.186 -45.116 1.00 C +ATOM 246 1HZ LYS 25 -34.610 -29.692 -44.653 1.00 H +ATOM 247 2HZ LYS 25 -33.871 -29.429 -43.430 1.00 H +ATOM 248 3HZ LYS 25 -33.350 -30.372 -44.405 1.00 H +ATOM 249 NZ LYS 25 -33.798 -29.610 -44.298 1.00 N +ATOM 250 N ASP 26 -29.793 -24.057 -44.078 1.00 N +ATOM 251 CA ASP 26 -30.688 -22.954 -44.124 1.00 C +ATOM 252 C ASP 26 -30.019 -21.782 -44.747 1.00 C +ATOM 253 O ASP 26 -30.694 -20.888 -45.248 1.00 O +ATOM 254 H ASP 26 -29.419 -24.301 -43.296 1.00 H +ATOM 255 CB ASP 26 -31.185 -22.608 -42.719 1.00 C +ATOM 256 CG ASP 26 -32.131 -23.654 -42.162 1.00 C +ATOM 257 OD1 ASP 26 -32.626 -24.487 -42.950 1.00 O +ATOM 258 OD2 ASP 26 -32.378 -23.640 -40.938 1.00 O +ATOM 259 N ILE 27 -28.666 -21.743 -44.751 1.00 N +ATOM 260 CA ILE 27 -27.963 -20.653 -45.377 1.00 C +ATOM 261 C ILE 27 -28.396 -20.571 -46.747 1.00 C +ATOM 262 O ILE 27 -28.320 -19.530 -47.394 1.00 O +ATOM 263 H ILE 27 -28.205 -22.408 -44.357 1.00 H +ATOM 264 CB ILE 27 -26.437 -20.834 -45.277 1.00 C +ATOM 265 CD1 ILE 27 -26.006 -18.384 -44.717 1.00 C +ATOM 266 CG1 ILE 27 -25.720 -19.536 -45.655 1.00 C +ATOM 267 CG2 ILE 27 -25.982 -22.004 -46.135 1.00 C +ATOM 268 N ASP 28 -28.792 -21.730 -47.224 1.00 N +ATOM 269 CA ASP 28 -29.379 -21.806 -48.471 1.00 C +ATOM 270 C ASP 28 -30.639 -20.962 -48.556 1.00 C +ATOM 271 O ASP 28 -30.554 -19.737 -48.553 1.00 O +ATOM 272 H ASP 28 -28.679 -22.476 -46.734 1.00 H +ATOM 273 CB ASP 28 -29.708 -23.259 -48.821 1.00 C +ATOM 274 CG ASP 28 -28.468 -24.089 -49.086 1.00 C +ATOM 275 OD1 ASP 28 -27.384 -23.496 -49.272 1.00 O +ATOM 276 OD2 ASP 28 -28.579 -25.333 -49.107 1.00 O +ATOM 277 N GLY 29 -31.844 -21.587 -48.674 1.00 N +ATOM 278 CA GLY 29 -33.084 -20.848 -48.833 1.00 C +ATOM 279 C GLY 29 -33.154 -19.837 -47.710 1.00 C +ATOM 280 O GLY 29 -33.103 -20.174 -46.533 1.00 O +ATOM 281 H GLY 29 -31.856 -22.487 -48.651 1.00 H +ATOM 282 N GLY 30 -33.311 -18.538 -48.020 1.00 N +ATOM 283 CA GLY 30 -33.300 -17.602 -46.925 1.00 C +ATOM 284 C GLY 30 -31.918 -17.062 -46.795 1.00 C +ATOM 285 O GLY 30 -31.094 -17.182 -47.698 1.00 O +ATOM 286 H GLY 30 -33.419 -18.243 -48.863 1.00 H +ATOM 287 N VAL 31 -31.672 -16.421 -45.640 1.00 N +ATOM 288 CA VAL 31 -30.475 -15.733 -45.259 1.00 C +ATOM 289 C VAL 31 -30.274 -14.570 -46.176 1.00 C +ATOM 290 O VAL 31 -29.253 -13.885 -46.136 1.00 O +ATOM 291 H VAL 31 -32.370 -16.456 -45.073 1.00 H +ATOM 292 CB VAL 31 -29.254 -16.671 -45.281 1.00 C +ATOM 293 CG1 VAL 31 -27.976 -15.888 -45.018 1.00 C +ATOM 294 CG2 VAL 31 -29.420 -17.785 -44.259 1.00 C +ATOM 295 N TRP 32 -31.300 -14.322 -47.006 1.00 N +ATOM 296 CA TRP 32 -31.473 -13.185 -47.859 1.00 C +ATOM 297 C TRP 32 -32.817 -12.706 -47.437 1.00 C +ATOM 298 O TRP 32 -33.736 -13.493 -47.231 1.00 O +ATOM 299 H TRP 32 -31.923 -14.971 -46.989 1.00 H +ATOM 300 CB TRP 32 -31.361 -13.596 -49.329 1.00 C +ATOM 301 1HB TRP 32 -31.243 -12.772 -49.945 1.00 H +ATOM 302 2HB TRP 32 -31.843 -14.434 -49.584 1.00 H +ATOM 303 CG TRP 32 -30.004 -14.106 -49.707 1.00 C +ATOM 304 CD1 TRP 32 -29.558 -15.393 -49.617 1.00 C +ATOM 305 HE1 TRP 32 -27.749 -16.262 -50.085 1.00 H +ATOM 306 NE1 TRP 32 -28.259 -15.476 -50.057 1.00 N +ATOM 307 CD2 TRP 32 -28.916 -13.339 -50.236 1.00 C +ATOM 308 CE2 TRP 32 -27.844 -14.226 -50.443 1.00 C +ATOM 309 CH2 TRP 32 -26.476 -12.482 -51.257 1.00 C +ATOM 310 CZ2 TRP 32 -26.616 -13.807 -50.954 1.00 C +ATOM 311 CE3 TRP 32 -28.744 -11.989 -50.556 1.00 C +ATOM 312 CZ3 TRP 32 -27.525 -11.578 -51.062 1.00 C +ATOM 313 N LYS 33 -32.979 -11.399 -47.271 1.00 N +ATOM 314 CA LYS 33 -34.233 -10.893 -46.808 1.00 C +ATOM 315 C LYS 33 -35.327 -10.967 -47.807 1.00 C +ATOM 316 O LYS 33 -36.494 -11.138 -47.461 1.00 O +ATOM 317 H LYS 33 -32.303 -10.832 -47.449 1.00 H +ATOM 318 CB LYS 33 -34.090 -9.438 -46.357 1.00 C +ATOM 319 CD LYS 33 -33.184 -7.794 -44.691 1.00 C +ATOM 320 CE LYS 33 -32.394 -7.618 -43.405 1.00 C +ATOM 321 CG LYS 33 -33.281 -9.260 -45.083 1.00 C +ATOM 322 1HZ LYS 33 -31.781 -6.116 -42.280 1.00 H +ATOM 323 2HZ LYS 33 -33.053 -5.822 -42.919 1.00 H +ATOM 324 3HZ LYS 33 -31.820 -5.751 -43.686 1.00 H +ATOM 325 NZ LYS 33 -32.247 -6.183 -43.035 1.00 N +ATOM 326 N GLN 34 -34.975 -10.829 -49.085 1.00 N +ATOM 327 CA GLN 34 -35.971 -10.686 -50.095 1.00 C +ATOM 328 C GLN 34 -36.693 -9.395 -49.989 1.00 C +ATOM 329 O GLN 34 -37.828 -9.264 -50.446 1.00 O +ATOM 330 H GLN 34 -34.103 -10.826 -49.309 1.00 H +ATOM 331 CB GLN 34 -36.974 -11.840 -50.026 1.00 C +ATOM 332 CD GLN 34 -35.838 -13.390 -51.666 1.00 C +ATOM 333 CG GLN 34 -36.358 -13.211 -50.253 1.00 C +ATOM 334 OE1 GLN 34 -36.600 -13.326 -52.630 1.00 O +ATOM 335 1HE2 GLN 34 -34.175 -13.728 -52.608 1.00 H +ATOM 336 2HE2 GLN 34 -34.013 -13.654 -51.059 1.00 H +ATOM 337 NE2 GLN 34 -34.536 -13.615 -51.791 1.00 N +ATOM 338 N GLY 35 -36.038 -8.374 -49.433 1.00 N +ATOM 339 CA GLY 35 -36.774 -7.166 -49.357 1.00 C +ATOM 340 C GLY 35 -36.502 -6.357 -50.562 1.00 C +ATOM 341 O GLY 35 -35.698 -6.696 -51.432 1.00 O +ATOM 342 H GLY 35 -35.195 -8.408 -49.119 1.00 H +ATOM 343 N TRP 36 -37.180 -5.210 -50.581 1.00 N +ATOM 344 CA TRP 36 -37.078 -4.260 -51.624 1.00 C +ATOM 345 C TRP 36 -35.704 -3.726 -51.627 1.00 C +ATOM 346 O TRP 36 -35.203 -3.210 -52.617 1.00 O +ATOM 347 H TRP 36 -37.725 -5.054 -49.882 1.00 H +ATOM 348 CB TRP 36 -38.115 -3.150 -51.441 1.00 C +ATOM 349 1HB TRP 36 -38.139 -2.515 -52.258 1.00 H +ATOM 350 2HB TRP 36 -38.291 -2.870 -50.497 1.00 H +ATOM 351 CG TRP 36 -39.521 -3.592 -51.709 1.00 C +ATOM 352 CD1 TRP 36 -40.503 -3.804 -50.786 1.00 C +ATOM 353 HE1 TRP 36 -42.466 -4.405 -50.973 1.00 H +ATOM 354 NE1 TRP 36 -41.661 -4.203 -51.409 1.00 N +ATOM 355 CD2 TRP 36 -40.102 -3.876 -52.988 1.00 C +ATOM 356 CE2 TRP 36 -41.438 -4.254 -52.763 1.00 C +ATOM 357 CH2 TRP 36 -41.805 -4.564 -55.075 1.00 C +ATOM 358 CZ2 TRP 36 -42.301 -4.601 -53.801 1.00 C +ATOM 359 CE3 TRP 36 -39.622 -3.847 -54.301 1.00 C +ATOM 360 CZ3 TRP 36 -40.481 -4.191 -55.327 1.00 C +ATOM 361 N ASN 37 -35.065 -3.779 -50.472 1.00 N +ATOM 362 CA ASN 37 -33.720 -3.355 -50.366 1.00 C +ATOM 363 C ASN 37 -32.818 -4.404 -50.916 1.00 C +ATOM 364 O ASN 37 -31.608 -4.280 -50.821 1.00 O +ATOM 365 H ASN 37 -35.497 -4.090 -49.747 1.00 H +ATOM 366 CB ASN 37 -33.374 -3.028 -48.912 1.00 C +ATOM 367 CG ASN 37 -33.412 -4.250 -48.015 1.00 C +ATOM 368 OD1 ASN 37 -33.599 -5.372 -48.486 1.00 O +ATOM 369 1HD2 ASN 37 -33.249 -4.726 -46.140 1.00 H +ATOM 370 2HD2 ASN 37 -33.102 -3.198 -46.413 1.00 H +ATOM 371 ND2 ASN 37 -33.235 -4.035 -46.717 1.00 N +ATOM 372 N ILE 38 -33.331 -5.564 -51.358 1.00 N +ATOM 373 CA ILE 38 -32.390 -6.356 -52.094 1.00 C +ATOM 374 C ILE 38 -32.531 -5.817 -53.477 1.00 C +ATOM 375 O ILE 38 -31.905 -6.265 -54.429 1.00 O +ATOM 376 H ILE 38 -34.171 -5.863 -51.234 1.00 H +ATOM 377 CB ILE 38 -32.692 -7.860 -51.960 1.00 C +ATOM 378 CD1 ILE 38 -34.309 -9.677 -52.722 1.00 C +ATOM 379 CG1 ILE 38 -34.038 -8.193 -52.606 1.00 C +ATOM 380 CG2 ILE 38 -32.642 -8.286 -50.501 1.00 C +ATOM 381 N LYS 39 -33.355 -4.763 -53.612 1.00 N +ATOM 382 CA LYS 39 -33.192 -3.946 -54.761 1.00 C +ATOM 383 C LYS 39 -31.886 -3.273 -54.476 1.00 C +ATOM 384 O LYS 39 -31.285 -2.719 -55.388 1.00 O +ATOM 385 H LYS 39 -33.992 -4.567 -53.007 1.00 H +ATOM 386 CB LYS 39 -34.383 -2.999 -54.919 1.00 C +ATOM 387 CD LYS 39 -36.823 -2.697 -55.426 1.00 C +ATOM 388 CE LYS 39 -38.119 -3.389 -55.814 1.00 C +ATOM 389 CG LYS 39 -35.685 -3.694 -55.283 1.00 C +ATOM 390 1HZ LYS 39 -39.989 -2.865 -56.162 1.00 H +ATOM 391 2HZ LYS 39 -39.058 -1.822 -56.559 1.00 H +ATOM 392 3HZ LYS 39 -39.375 -2.018 -55.154 1.00 H +ATOM 393 NZ LYS 39 -39.249 -2.427 -55.934 1.00 N +ATOM 394 N TYR 40 -31.440 -3.257 -53.187 1.00 N +ATOM 395 CA TYR 40 -30.062 -2.900 -52.908 1.00 C +ATOM 396 C TYR 40 -29.207 -3.935 -53.555 1.00 C +ATOM 397 O TYR 40 -28.119 -3.639 -54.034 1.00 O +ATOM 398 H TYR 40 -31.996 -3.467 -52.511 1.00 H +ATOM 399 CB TYR 40 -29.826 -2.812 -51.399 1.00 C +ATOM 400 CG TYR 40 -28.411 -2.439 -51.021 1.00 C +ATOM 401 HH TYR 40 -24.421 -0.578 -50.082 1.00 H +ATOM 402 OH TYR 40 -24.521 -1.396 -49.984 1.00 O +ATOM 403 CZ TYR 40 -25.808 -1.743 -50.327 1.00 C +ATOM 404 CD1 TYR 40 -27.979 -1.121 -51.095 1.00 C +ATOM 405 CE1 TYR 40 -26.687 -0.770 -50.752 1.00 C +ATOM 406 CD2 TYR 40 -27.511 -3.405 -50.590 1.00 C +ATOM 407 CE2 TYR 40 -26.215 -3.073 -50.243 1.00 C +ATOM 408 N ASP 41 -29.645 -5.219 -53.578 1.00 N +ATOM 409 CA ASP 41 -28.919 -6.203 -54.365 1.00 C +ATOM 410 C ASP 41 -29.543 -5.960 -55.728 1.00 C +ATOM 411 O ASP 41 -30.192 -4.949 -55.774 1.00 O +ATOM 412 H ASP 41 -30.376 -5.465 -53.114 1.00 H +ATOM 413 CB ASP 41 -29.115 -7.604 -53.783 1.00 C +ATOM 414 CG ASP 41 -28.035 -8.574 -54.223 1.00 C +ATOM 415 OD1 ASP 41 -27.191 -8.184 -55.057 1.00 O +ATOM 416 OD2 ASP 41 -28.033 -9.723 -53.733 1.00 O +ATOM 417 N PRO 42 -29.701 -6.546 -56.852 1.00 N +ATOM 418 CA PRO 42 -29.350 -5.818 -58.070 1.00 C +ATOM 419 C PRO 42 -28.901 -4.358 -58.085 1.00 C +ATOM 420 O PRO 42 -27.865 -4.201 -58.704 1.00 O +ATOM 421 CB PRO 42 -30.627 -5.867 -58.912 1.00 C +ATOM 422 CD PRO 42 -31.086 -7.192 -56.971 1.00 C +ATOM 423 CG PRO 42 -31.330 -7.100 -58.452 1.00 C +ATOM 424 N LEU 43 -29.555 -3.280 -57.568 1.00 N +ATOM 425 CA LEU 43 -28.912 -1.975 -57.513 1.00 C +ATOM 426 C LEU 43 -28.329 -1.702 -56.162 1.00 C +ATOM 427 O LEU 43 -29.038 -1.588 -55.164 1.00 O +ATOM 428 H LEU 43 -30.394 -3.382 -57.258 1.00 H +ATOM 429 CB LEU 43 -29.907 -0.872 -57.880 1.00 C +ATOM 430 CG LEU 43 -29.380 0.563 -57.818 1.00 C +ATOM 431 CD1 LEU 43 -28.279 0.777 -58.846 1.00 C +ATOM 432 CD2 LEU 43 -30.508 1.560 -58.036 1.00 C +ATOM 433 N LYS 44 -26.992 -1.521 -56.127 1.00 N +ATOM 434 CA LYS 44 -26.257 -1.310 -54.918 1.00 C +ATOM 435 C LYS 44 -25.951 0.140 -54.728 1.00 C +ATOM 436 O LYS 44 -26.027 0.952 -55.648 1.00 O +ATOM 437 H LYS 44 -26.562 -1.538 -56.918 1.00 H +ATOM 438 CB LYS 44 -24.963 -2.127 -54.928 1.00 C +ATOM 439 CD LYS 44 -23.856 -4.379 -54.916 1.00 C +ATOM 440 CE LYS 44 -24.072 -5.884 -54.908 1.00 C +ATOM 441 CG LYS 44 -25.179 -3.631 -54.939 1.00 C +ATOM 442 1HZ LYS 44 -22.947 -7.505 -54.930 1.00 H +ATOM 443 2HZ LYS 44 -22.300 -6.414 -54.221 1.00 H +ATOM 444 3HZ LYS 44 -22.334 -6.418 -55.674 1.00 H +ATOM 445 NZ LYS 44 -22.784 -6.630 -54.936 1.00 N +ATOM 446 N TYR 45 -25.600 0.473 -53.472 1.00 N +ATOM 447 CA TYR 45 -25.255 1.781 -52.993 1.00 C +ATOM 448 C TYR 45 -23.838 1.714 -52.493 1.00 C +ATOM 449 O TYR 45 -23.070 0.823 -52.850 1.00 O +ATOM 450 H TYR 45 -25.595 -0.229 -52.908 1.00 H +ATOM 451 CB TYR 45 -26.231 2.227 -51.902 1.00 C +ATOM 452 CG TYR 45 -27.656 2.384 -52.382 1.00 C +ATOM 453 HH TYR 45 -31.970 2.073 -53.628 1.00 H +ATOM 454 OH TYR 45 -31.578 2.801 -53.698 1.00 O +ATOM 455 CZ TYR 45 -30.280 2.665 -53.262 1.00 C +ATOM 456 CD1 TYR 45 -28.533 1.307 -52.370 1.00 C +ATOM 457 CE1 TYR 45 -29.837 1.442 -52.807 1.00 C +ATOM 458 CD2 TYR 45 -28.119 3.609 -52.844 1.00 C +ATOM 459 CE2 TYR 45 -29.420 3.762 -53.285 1.00 C +ATOM 460 N ASN 46 -23.439 2.725 -51.686 1.00 N +ATOM 461 CA ASN 46 -22.135 2.706 -51.076 1.00 C +ATOM 462 C ASN 46 -22.236 1.971 -49.782 1.00 C +ATOM 463 O ASN 46 -23.287 1.962 -49.141 1.00 O +ATOM 464 H ASN 46 -23.998 3.414 -51.532 1.00 H +ATOM 465 CB ASN 46 -21.609 4.131 -50.892 1.00 C +ATOM 466 CG ASN 46 -21.318 4.819 -52.210 1.00 C +ATOM 467 OD1 ASN 46 -20.660 4.255 -53.084 1.00 O +ATOM 468 1HD2 ASN 46 -21.664 6.498 -53.122 1.00 H +ATOM 469 2HD2 ASN 46 -22.284 6.422 -51.694 1.00 H +ATOM 470 ND2 ASN 46 -21.808 6.045 -52.358 1.00 N +ATOM 471 N ALA 47 -21.138 1.279 -49.412 1.00 N +ATOM 472 CA ALA 47 -21.083 0.505 -48.205 1.00 C +ATOM 473 C ALA 47 -20.962 1.478 -47.075 1.00 C +ATOM 474 O ALA 47 -20.208 2.444 -47.171 1.00 O +ATOM 475 H ALA 47 -20.422 1.316 -49.956 1.00 H +ATOM 476 CB ALA 47 -19.920 -0.474 -48.256 1.00 C +ATOM 477 N HIS 48 -21.669 1.226 -45.952 1.00 N +ATOM 478 CA HIS 48 -21.707 2.227 -44.927 1.00 C +ATOM 479 C HIS 48 -21.150 1.638 -43.658 1.00 C +ATOM 480 O HIS 48 -21.328 0.452 -43.387 1.00 O +ATOM 481 H HIS 48 -22.110 0.450 -45.839 1.00 H +ATOM 482 CB HIS 48 -23.136 2.735 -44.727 1.00 C +ATOM 483 CG HIS 48 -23.700 3.440 -45.921 1.00 C +ATOM 484 ND1 HIS 48 -23.257 4.678 -46.332 1.00 N +ATOM 485 CE1 HIS 48 -23.948 5.049 -47.425 1.00 C +ATOM 486 CD2 HIS 48 -24.728 3.147 -46.910 1.00 C +ATOM 487 HE2 HIS 48 -25.417 4.181 -48.498 1.00 H +ATOM 488 NE2 HIS 48 -24.832 4.136 -47.777 1.00 N +ATOM 489 N HIS 49 -20.447 2.474 -42.856 1.00 N +ATOM 490 CA HIS 49 -19.797 2.085 -41.627 1.00 C +ATOM 491 C HIS 49 -20.770 2.044 -40.479 1.00 C +ATOM 492 O HIS 49 -21.793 2.728 -40.482 1.00 O +ATOM 493 H HIS 49 -20.401 3.327 -43.139 1.00 H +ATOM 494 CB HIS 49 -18.648 3.042 -41.302 1.00 C +ATOM 495 CG HIS 49 -17.512 2.974 -42.275 1.00 C +ATOM 496 ND1 HIS 49 -16.599 1.942 -42.282 1.00 N +ATOM 497 CE1 HIS 49 -15.703 2.157 -43.262 1.00 C +ATOM 498 CD2 HIS 49 -17.030 3.805 -43.368 1.00 C +ATOM 499 HE2 HIS 49 -15.469 3.618 -44.631 1.00 H +ATOM 500 NE2 HIS 49 -15.956 3.273 -43.917 1.00 N +ATOM 501 N LYS 50 -20.471 1.205 -39.456 1.00 N +ATOM 502 CA LYS 50 -21.311 1.139 -38.288 1.00 C +ATOM 503 C LYS 50 -20.472 1.098 -37.059 1.00 C +ATOM 504 O LYS 50 -19.362 0.576 -37.083 1.00 O +ATOM 505 H LYS 50 -19.738 0.686 -39.513 1.00 H +ATOM 506 CB LYS 50 -22.229 -0.083 -38.357 1.00 C +ATOM 507 CD LYS 50 -22.461 -2.581 -38.448 1.00 C +ATOM 508 CE LYS 50 -21.733 -3.912 -38.353 1.00 C +ATOM 509 CG LYS 50 -21.494 -1.414 -38.328 1.00 C +ATOM 510 1HZ LYS 50 -22.210 -5.826 -38.412 1.00 H +ATOM 511 2HZ LYS 50 -23.084 -5.031 -39.258 1.00 H +ATOM 512 3HZ LYS 50 -23.269 -5.029 -37.816 1.00 H +ATOM 513 NZ LYS 50 -22.668 -5.065 -38.472 1.00 N +ATOM 514 N LEU 51 -20.990 1.656 -35.941 1.00 N +ATOM 515 CA LEU 51 -20.224 1.637 -34.725 1.00 C +ATOM 516 C LEU 51 -20.596 0.437 -33.930 1.00 C +ATOM 517 O LEU 51 -21.715 -0.063 -34.023 1.00 O +ATOM 518 H LEU 51 -21.806 2.037 -35.953 1.00 H +ATOM 519 CB LEU 51 -20.456 2.921 -33.925 1.00 C +ATOM 520 CG LEU 51 -20.066 4.229 -34.615 1.00 C +ATOM 521 CD1 LEU 51 -20.433 5.424 -33.749 1.00 C +ATOM 522 CD2 LEU 51 -18.580 4.245 -34.937 1.00 C +ATOM 523 N LYS 52 -19.637 -0.060 -33.123 1.00 N +ATOM 524 CA LYS 52 -19.900 -1.199 -32.297 1.00 C +ATOM 525 C LYS 52 -20.003 -0.700 -30.904 1.00 C +ATOM 526 O LYS 52 -19.051 -0.108 -30.400 1.00 O +ATOM 527 H LYS 52 -18.826 0.330 -33.106 1.00 H +ATOM 528 CB LYS 52 -18.797 -2.247 -32.462 1.00 C +ATOM 529 CD LYS 52 -17.604 -3.880 -33.947 1.00 C +ATOM 530 CE LYS 52 -17.489 -4.445 -35.354 1.00 C +ATOM 531 CG LYS 52 -18.713 -2.845 -33.857 1.00 C +ATOM 532 1HZ LYS 52 -16.340 -5.739 -36.302 1.00 H +ATOM 533 2HZ LYS 52 -16.522 -6.106 -34.907 1.00 H +ATOM 534 3HZ LYS 52 -15.608 -5.034 -35.263 1.00 H +ATOM 535 NZ LYS 52 -16.378 -5.430 -35.468 1.00 N +ATOM 536 N VAL 53 -21.173 -0.913 -30.261 1.00 N +ATOM 537 CA VAL 53 -21.350 -0.543 -28.886 1.00 C +ATOM 538 C VAL 53 -21.215 -1.772 -28.078 1.00 C +ATOM 539 O VAL 53 -21.883 -2.779 -28.307 1.00 O +ATOM 540 H VAL 53 -21.849 -1.296 -30.715 1.00 H +ATOM 541 CB VAL 53 -22.708 0.146 -28.657 1.00 C +ATOM 542 CG1 VAL 53 -22.900 0.468 -27.183 1.00 C +ATOM 543 CG2 VAL 53 -22.814 1.408 -29.500 1.00 C +ATOM 544 N PHE 54 -20.306 -1.659 -27.098 1.00 N +ATOM 545 CA PHE 54 -19.852 -2.688 -26.211 1.00 C +ATOM 546 C PHE 54 -20.547 -2.388 -24.935 1.00 C +ATOM 547 O PHE 54 -20.301 -1.336 -24.354 1.00 O +ATOM 548 H PHE 54 -19.973 -0.826 -27.029 1.00 H +ATOM 549 CB PHE 54 -18.326 -2.669 -26.105 1.00 C +ATOM 550 CG PHE 54 -17.625 -3.052 -27.377 1.00 C +ATOM 551 CZ PHE 54 -16.325 -3.765 -29.728 1.00 C +ATOM 552 CD1 PHE 54 -17.817 -2.321 -28.537 1.00 C +ATOM 553 CE1 PHE 54 -17.172 -2.673 -29.707 1.00 C +ATOM 554 CD2 PHE 54 -16.774 -4.142 -27.414 1.00 C +ATOM 555 CE2 PHE 54 -16.129 -4.494 -28.585 1.00 C +ATOM 556 N VAL 55 -21.425 -3.286 -24.458 1.00 N +ATOM 557 CA VAL 55 -22.070 -3.035 -23.197 1.00 C +ATOM 558 C VAL 55 -21.463 -3.961 -22.202 1.00 C +ATOM 559 O VAL 55 -21.585 -5.172 -22.367 1.00 O +ATOM 560 H VAL 55 -21.611 -4.037 -24.917 1.00 H +ATOM 561 CB VAL 55 -23.596 -3.218 -23.297 1.00 C +ATOM 562 CG1 VAL 55 -24.250 -2.983 -21.944 1.00 C +ATOM 563 CG2 VAL 55 -24.177 -2.280 -24.344 1.00 C +ATOM 564 N VAL 56 -20.795 -3.423 -21.148 1.00 N +ATOM 565 CA VAL 56 -20.235 -4.317 -20.157 1.00 C +ATOM 566 C VAL 56 -20.951 -4.101 -18.866 1.00 C +ATOM 567 O VAL 56 -21.020 -2.979 -18.365 1.00 O +ATOM 568 H VAL 56 -20.697 -2.533 -21.058 1.00 H +ATOM 569 CB VAL 56 -18.719 -4.102 -19.996 1.00 C +ATOM 570 CG1 VAL 56 -18.161 -5.026 -18.924 1.00 C +ATOM 571 CG2 VAL 56 -18.005 -4.325 -21.320 1.00 C +ATOM 572 N PRO 57 -21.550 -5.174 -18.387 1.00 N +ATOM 573 CA PRO 57 -22.260 -5.128 -17.133 1.00 C +ATOM 574 C PRO 57 -21.316 -5.338 -15.976 1.00 C +ATOM 575 O PRO 57 -20.484 -6.244 -16.053 1.00 O +ATOM 576 CB PRO 57 -23.280 -6.263 -17.243 1.00 C +ATOM 577 CD PRO 57 -22.050 -6.246 -19.296 1.00 C +ATOM 578 CG PRO 57 -23.408 -6.509 -18.709 1.00 C +ATOM 579 N HIS 58 -21.415 -4.548 -14.881 1.00 N +ATOM 580 CA HIS 58 -20.623 -4.900 -13.741 1.00 C +ATOM 581 C HIS 58 -21.000 -4.089 -12.547 1.00 C +ATOM 582 O HIS 58 -21.818 -3.179 -12.650 1.00 O +ATOM 583 H HIS 58 -21.951 -3.826 -14.851 1.00 H +ATOM 584 CB HIS 58 -19.135 -4.720 -14.046 1.00 C +ATOM 585 CG HIS 58 -18.745 -3.304 -14.338 1.00 C +ATOM 586 HD1 HIS 58 -19.414 -3.098 -16.278 1.00 H +ATOM 587 ND1 HIS 58 -18.994 -2.698 -15.550 1.00 N +ATOM 588 CE1 HIS 58 -18.533 -1.435 -15.512 1.00 C +ATOM 589 CD2 HIS 58 -18.085 -2.236 -13.602 1.00 C +ATOM 590 NE2 HIS 58 -17.986 -1.151 -14.346 1.00 N +ATOM 591 N SER 59 -20.503 -4.473 -11.351 1.00 N +ATOM 592 CA SER 59 -20.842 -3.732 -10.173 1.00 C +ATOM 593 C SER 59 -19.558 -3.239 -9.555 1.00 C +ATOM 594 O SER 59 -18.546 -3.932 -9.415 1.00 O +ATOM 595 H SER 59 -19.962 -5.190 -11.292 1.00 H +ATOM 596 CB SER 59 -21.643 -4.604 -9.204 1.00 C +ATOM 597 HG SER 59 -23.329 -4.308 -9.946 1.00 H +ATOM 598 OG SER 59 -22.885 -4.987 -9.770 1.00 O +ATOM 599 N HIS 60 -19.598 -1.975 -9.141 1.00 N +ATOM 600 CA HIS 60 -18.496 -1.307 -8.551 1.00 C +ATOM 601 C HIS 60 -18.715 -1.588 -7.092 1.00 C +ATOM 602 O HIS 60 -19.500 -0.908 -6.440 1.00 O +ATOM 603 H HIS 60 -20.379 -1.542 -9.253 1.00 H +ATOM 604 CB HIS 60 -18.502 0.175 -8.931 1.00 C +ATOM 605 CG HIS 60 -18.318 0.424 -10.395 1.00 C +ATOM 606 HD1 HIS 60 -19.299 2.224 -10.621 1.00 H +ATOM 607 ND1 HIS 60 -18.817 1.542 -11.029 1.00 N +ATOM 608 CE1 HIS 60 -18.493 1.486 -12.333 1.00 C +ATOM 609 CD2 HIS 60 -17.670 -0.277 -11.494 1.00 C +ATOM 610 NE2 HIS 60 -17.805 0.398 -12.620 1.00 N +ATOM 611 N ASN 61 -18.053 -2.618 -6.532 1.00 N +ATOM 612 CA ASN 61 -18.325 -2.969 -5.164 1.00 C +ATOM 613 C ASN 61 -17.318 -2.341 -4.238 1.00 C +ATOM 614 O ASN 61 -16.127 -2.648 -4.242 1.00 O +ATOM 615 H ASN 61 -17.446 -3.085 -7.004 1.00 H +ATOM 616 CB ASN 61 -18.343 -4.489 -4.994 1.00 C +ATOM 617 CG ASN 61 -18.709 -4.914 -3.586 1.00 C +ATOM 618 OD1 ASN 61 -18.189 -4.375 -2.609 1.00 O +ATOM 619 1HD2 ASN 61 -19.862 -6.175 -2.664 1.00 H +ATOM 620 2HD2 ASN 61 -19.966 -6.253 -4.217 1.00 H +ATOM 621 ND2 ASN 61 -19.609 -5.885 -3.477 1.00 N +ATOM 622 N ASP 62 -17.763 -1.413 -3.386 1.00 N +ATOM 623 CA ASP 62 -16.813 -1.005 -2.413 1.00 C +ATOM 624 C ASP 62 -17.139 -1.936 -1.303 1.00 C +ATOM 625 O ASP 62 -18.286 -1.999 -0.860 1.00 O +ATOM 626 H ASP 62 -18.586 -1.049 -3.391 1.00 H +ATOM 627 CB ASP 62 -16.978 0.482 -2.094 1.00 C +ATOM 628 CG ASP 62 -16.572 1.375 -3.250 1.00 C +ATOM 629 OD1 ASP 62 -15.900 0.876 -4.178 1.00 O +ATOM 630 OD2 ASP 62 -16.924 2.573 -3.227 1.00 O +ATOM 631 N PRO 63 -16.178 -2.709 -0.904 1.00 N +ATOM 632 CA PRO 63 -16.304 -3.667 0.147 1.00 C +ATOM 633 C PRO 63 -16.998 -3.024 1.305 1.00 C +ATOM 634 O PRO 63 -18.106 -3.454 1.617 1.00 O +ATOM 635 CB PRO 63 -14.859 -4.053 0.471 1.00 C +ATOM 636 CD PRO 63 -14.694 -2.636 -1.451 1.00 C +ATOM 637 CG PRO 63 -14.127 -3.875 -0.817 1.00 C +ATOM 638 N GLY 64 -16.466 -1.927 1.873 1.00 N +ATOM 639 CA GLY 64 -17.158 -1.317 2.969 1.00 C +ATOM 640 C GLY 64 -16.975 0.165 2.863 1.00 C +ATOM 641 O GLY 64 -15.857 0.655 2.744 1.00 O +ATOM 642 H GLY 64 -15.692 -1.576 1.578 1.00 H +ATOM 643 N TRP 65 -18.087 0.921 2.919 1.00 N +ATOM 644 CA TRP 65 -18.071 2.353 2.888 1.00 C +ATOM 645 C TRP 65 -19.027 2.869 3.898 1.00 C +ATOM 646 O TRP 65 -18.800 2.781 5.109 1.00 O +ATOM 647 H TRP 65 -18.870 0.481 2.979 1.00 H +ATOM 648 CB TRP 65 -18.417 2.863 1.487 1.00 C +ATOM 649 1HB TRP 65 -19.441 2.895 1.338 1.00 H +ATOM 650 2HB TRP 65 -17.743 2.668 0.775 1.00 H +ATOM 651 CG TRP 65 -18.323 4.351 1.351 1.00 C +ATOM 652 CD1 TRP 65 -17.182 5.100 1.302 1.00 C +ATOM 653 HE1 TRP 65 -16.870 7.128 1.119 1.00 H +ATOM 654 NE1 TRP 65 -17.494 6.431 1.173 1.00 N +ATOM 655 CD2 TRP 65 -19.414 5.274 1.245 1.00 C +ATOM 656 CE2 TRP 65 -18.860 6.562 1.135 1.00 C +ATOM 657 CH2 TRP 65 -21.004 7.542 1.004 1.00 C +ATOM 658 CZ2 TRP 65 -19.648 7.706 1.014 1.00 C +ATOM 659 CE3 TRP 65 -20.805 5.136 1.232 1.00 C +ATOM 660 CZ3 TRP 65 -21.582 6.273 1.112 1.00 C +ATOM 661 N ILE 66 -20.159 3.387 3.342 1.00 N +ATOM 662 CA ILE 66 -21.155 4.130 4.061 1.00 C +ATOM 663 C ILE 66 -21.542 3.274 5.200 1.00 C +ATOM 664 O ILE 66 -21.950 3.774 6.247 1.00 O +ATOM 665 H ILE 66 -20.260 3.235 2.461 1.00 H +ATOM 666 CB ILE 66 -22.346 4.498 3.157 1.00 C +ATOM 667 CD1 ILE 66 -22.556 6.859 4.096 1.00 C +ATOM 668 CG1 ILE 66 -23.239 5.532 3.846 1.00 C +ATOM 669 CG2 ILE 66 -23.123 3.251 2.765 1.00 C +ATOM 670 N GLN 67 -21.477 1.949 5.004 1.00 N +ATOM 671 CA GLN 67 -21.756 1.107 6.115 1.00 C +ATOM 672 C GLN 67 -20.577 0.229 6.442 1.00 C +ATOM 673 O GLN 67 -19.438 0.531 6.090 1.00 O +ATOM 674 H GLN 67 -21.267 1.588 4.207 1.00 H +ATOM 675 CB GLN 67 -22.990 0.246 5.838 1.00 C +ATOM 676 CD GLN 67 -24.731 1.806 6.795 1.00 C +ATOM 677 CG GLN 67 -24.257 1.044 5.574 1.00 C +ATOM 678 OE1 GLN 67 -24.483 1.396 7.929 1.00 O +ATOM 679 1HE2 GLN 67 -25.721 3.411 7.257 1.00 H +ATOM 680 2HE2 GLN 67 -25.576 3.185 5.722 1.00 H +ATOM 681 NE2 GLN 67 -25.416 2.920 6.567 1.00 N +ATOM 682 N THR 68 -20.873 -0.890 7.145 1.00 N +ATOM 683 CA THR 68 -20.007 -1.858 7.788 1.00 C +ATOM 684 C THR 68 -19.107 -2.553 6.844 1.00 C +ATOM 685 O THR 68 -19.232 -2.450 5.620 1.00 O +ATOM 686 H THR 68 -21.767 -0.991 7.182 1.00 H +ATOM 687 CB THR 68 -20.818 -2.922 8.551 1.00 C +ATOM 688 HG1 THR 68 -21.168 -4.017 7.064 1.00 H +ATOM 689 OG1 THR 68 -21.646 -3.645 7.632 1.00 O +ATOM 690 CG2 THR 68 -21.708 -2.266 9.595 1.00 C +ATOM 691 N PHE 69 -18.105 -3.252 7.418 1.00 N +ATOM 692 CA PHE 69 -17.395 -3.989 6.467 1.00 C +ATOM 693 C PHE 69 -17.982 -5.353 6.351 1.00 C +ATOM 694 O PHE 69 -18.883 -5.538 5.535 1.00 O +ATOM 695 H PHE 69 -17.867 -3.288 8.285 1.00 H +ATOM 696 CB PHE 69 -15.914 -4.063 6.843 1.00 C +ATOM 697 CG PHE 69 -15.079 -4.843 5.868 1.00 C +ATOM 698 CZ PHE 69 -13.532 -6.292 4.069 1.00 C +ATOM 699 CD1 PHE 69 -15.082 -4.524 4.522 1.00 C +ATOM 700 CE1 PHE 69 -14.314 -5.242 3.625 1.00 C +ATOM 701 CD2 PHE 69 -14.292 -5.897 6.297 1.00 C +ATOM 702 CE2 PHE 69 -13.524 -6.615 5.401 1.00 C +ATOM 703 N GLU 70 -17.608 -6.354 7.150 1.00 N +ATOM 704 CA GLU 70 -18.215 -7.568 6.727 1.00 C +ATOM 705 C GLU 70 -19.541 -7.775 7.298 1.00 C +ATOM 706 O GLU 70 -19.711 -8.366 8.365 1.00 O +ATOM 707 H GLU 70 -17.062 -6.349 7.865 1.00 H +ATOM 708 CB GLU 70 -17.328 -8.763 7.083 1.00 C +ATOM 709 CD GLU 70 -15.150 -9.989 6.720 1.00 C +ATOM 710 CG GLU 70 -15.996 -8.787 6.350 1.00 C +ATOM 711 OE1 GLU 70 -15.375 -11.074 6.144 1.00 O +ATOM 712 OE2 GLU 70 -14.261 -9.846 7.586 1.00 O +ATOM 713 N GLU 71 -20.536 -7.369 6.509 1.00 N +ATOM 714 CA GLU 71 -21.811 -7.474 7.074 1.00 C +ATOM 715 C GLU 71 -22.902 -7.467 6.109 1.00 C +ATOM 716 O GLU 71 -22.968 -8.323 5.230 1.00 O +ATOM 717 H GLU 71 -20.439 -7.047 5.674 1.00 H +ATOM 718 CB GLU 71 -22.049 -6.340 8.073 1.00 C +ATOM 719 CD GLU 71 -21.434 -7.598 10.175 1.00 C +ATOM 720 CG GLU 71 -21.151 -6.394 9.299 1.00 C +ATOM 721 OE1 GLU 71 -22.550 -8.151 10.084 1.00 O +ATOM 722 OE2 GLU 71 -20.539 -7.990 10.954 1.00 O +ATOM 723 N TYR 72 -23.779 -6.459 6.286 1.00 N +ATOM 724 CA TYR 72 -24.977 -6.346 5.538 1.00 C +ATOM 725 C TYR 72 -24.585 -6.447 4.092 1.00 C +ATOM 726 O TYR 72 -25.246 -7.095 3.280 1.00 O +ATOM 727 H TYR 72 -23.578 -5.842 6.910 1.00 H +ATOM 728 CB TYR 72 -25.690 -5.032 5.863 1.00 C +ATOM 729 CG TYR 72 -26.969 -4.820 5.085 1.00 C +ATOM 730 HH TYR 72 -30.355 -3.725 2.325 1.00 H +ATOM 731 OH TYR 72 -30.494 -4.247 2.955 1.00 O +ATOM 732 CZ TYR 72 -29.326 -4.435 3.659 1.00 C +ATOM 733 CD1 TYR 72 -28.144 -5.457 5.461 1.00 C +ATOM 734 CE1 TYR 72 -29.318 -5.269 4.756 1.00 C +ATOM 735 CD2 TYR 72 -26.996 -3.983 3.977 1.00 C +ATOM 736 CE2 TYR 72 -28.161 -3.783 3.259 1.00 C +ATOM 737 N TYR 73 -23.474 -5.802 3.715 1.00 N +ATOM 738 CA TYR 73 -23.153 -5.833 2.327 1.00 C +ATOM 739 C TYR 73 -22.899 -7.235 1.867 1.00 C +ATOM 740 O TYR 73 -23.189 -7.570 0.722 1.00 O +ATOM 741 H TYR 73 -22.939 -5.363 4.291 1.00 H +ATOM 742 CB TYR 73 -21.934 -4.955 2.039 1.00 C +ATOM 743 CG TYR 73 -22.217 -3.471 2.109 1.00 C +ATOM 744 HH TYR 73 -22.516 0.949 2.907 1.00 H +ATOM 745 OH TYR 73 -22.986 0.610 2.313 1.00 O +ATOM 746 CZ TYR 73 -22.733 -0.740 2.244 1.00 C +ATOM 747 CD1 TYR 73 -21.558 -2.663 3.026 1.00 C +ATOM 748 CE1 TYR 73 -21.811 -1.306 3.097 1.00 C +ATOM 749 CD2 TYR 73 -23.144 -2.883 1.257 1.00 C +ATOM 750 CE2 TYR 73 -23.410 -1.528 1.314 1.00 C +ATOM 751 N GLN 74 -22.289 -8.085 2.709 1.00 N +ATOM 752 CA GLN 74 -21.937 -9.379 2.222 1.00 C +ATOM 753 C GLN 74 -23.193 -10.126 1.877 1.00 C +ATOM 754 O GLN 74 -23.219 -10.878 0.904 1.00 O +ATOM 755 H GLN 74 -22.101 -7.858 3.559 1.00 H +ATOM 756 CB GLN 74 -21.109 -10.136 3.262 1.00 C +ATOM 757 CD GLN 74 -18.958 -10.281 4.579 1.00 C +ATOM 758 CG GLN 74 -19.707 -9.582 3.462 1.00 C +ATOM 759 OE1 GLN 74 -19.563 -10.774 5.532 1.00 O +ATOM 760 1HE2 GLN 74 -17.143 -10.731 5.101 1.00 H +ATOM 761 2HE2 GLN 74 -17.233 -9.954 3.752 1.00 H +ATOM 762 NE2 GLN 74 -17.636 -10.327 4.465 1.00 N +ATOM 763 N HIS 75 -24.269 -9.922 2.665 1.00 N +ATOM 764 CA HIS 75 -25.535 -10.573 2.464 1.00 C +ATOM 765 C HIS 75 -26.005 -10.215 1.075 1.00 C +ATOM 766 O HIS 75 -26.362 -11.090 0.288 1.00 O +ATOM 767 H HIS 75 -24.164 -9.343 3.346 1.00 H +ATOM 768 CB HIS 75 -26.535 -10.145 3.540 1.00 C +ATOM 769 CG HIS 75 -27.882 -10.783 3.402 1.00 C +ATOM 770 ND1 HIS 75 -28.113 -12.106 3.707 1.00 N +ATOM 771 CE1 HIS 75 -29.410 -12.387 3.484 1.00 C +ATOM 772 CD2 HIS 75 -29.202 -10.340 2.976 1.00 C +ATOM 773 HE2 HIS 75 -30.972 -11.295 2.826 1.00 H +ATOM 774 NE2 HIS 75 -30.068 -11.332 3.045 1.00 N +ATOM 775 N ASP 76 -25.987 -8.911 0.723 1.00 N +ATOM 776 CA ASP 76 -26.484 -8.485 -0.559 1.00 C +ATOM 777 C ASP 76 -25.593 -9.038 -1.632 1.00 C +ATOM 778 O ASP 76 -26.069 -9.372 -2.715 1.00 O +ATOM 779 H ASP 76 -25.659 -8.305 1.302 1.00 H +ATOM 780 CB ASP 76 -26.553 -6.958 -0.626 1.00 C +ATOM 781 CG ASP 76 -27.660 -6.386 0.238 1.00 C +ATOM 782 OD1 ASP 76 -28.538 -7.163 0.669 1.00 O +ATOM 783 OD2 ASP 76 -27.649 -5.162 0.484 1.00 O +ATOM 784 N THR 77 -24.269 -9.137 -1.384 1.00 N +ATOM 785 CA THR 77 -23.423 -9.645 -2.423 1.00 C +ATOM 786 C THR 77 -23.752 -11.073 -2.707 1.00 C +ATOM 787 O THR 77 -23.580 -11.492 -3.845 1.00 O +ATOM 788 H THR 77 -23.914 -8.894 -0.593 1.00 H +ATOM 789 CB THR 77 -21.934 -9.516 -2.052 1.00 C +ATOM 790 HG1 THR 77 -22.138 -9.945 -0.234 1.00 H +ATOM 791 OG1 THR 77 -21.673 -10.250 -0.849 1.00 O +ATOM 792 CG2 THR 77 -21.567 -8.058 -1.821 1.00 C +ATOM 793 N LYS 78 -24.196 -11.865 -1.704 1.00 N +ATOM 794 CA LYS 78 -24.603 -13.228 -1.941 1.00 C +ATOM 795 C LYS 78 -25.851 -13.248 -2.775 1.00 C +ATOM 796 O LYS 78 -26.030 -14.171 -3.566 1.00 O +ATOM 797 H LYS 78 -24.234 -11.522 -0.873 1.00 H +ATOM 798 CB LYS 78 -24.824 -13.959 -0.615 1.00 C +ATOM 799 CD LYS 78 -25.271 -16.121 0.580 1.00 C +ATOM 800 CE LYS 78 -25.763 -17.551 0.437 1.00 C +ATOM 801 CG LYS 78 -25.194 -15.426 -0.770 1.00 C +ATOM 802 1HZ LYS 78 -25.129 -19.221 -0.403 1.00 H +ATOM 803 2HZ LYS 78 -24.023 -18.409 0.077 1.00 H +ATOM 804 3HZ LYS 78 -24.708 -18.050 -1.154 1.00 H +ATOM 805 NZ LYS 78 -24.810 -18.392 -0.339 1.00 N +ATOM 806 N HIS 79 -26.759 -12.259 -2.588 1.00 N +ATOM 807 CA HIS 79 -27.989 -12.139 -3.341 1.00 C +ATOM 808 C HIS 79 -27.648 -11.858 -4.767 1.00 C +ATOM 809 O HIS 79 -28.162 -12.509 -5.673 1.00 O +ATOM 810 H HIS 79 -26.560 -11.655 -1.952 1.00 H +ATOM 811 CB HIS 79 -28.874 -11.039 -2.750 1.00 C +ATOM 812 CG HIS 79 -30.186 -10.878 -3.452 1.00 C +ATOM 813 ND1 HIS 79 -31.204 -11.801 -3.351 1.00 N +ATOM 814 CE1 HIS 79 -32.249 -11.384 -4.087 1.00 C +ATOM 815 CD2 HIS 79 -30.775 -9.882 -4.336 1.00 C +ATOM 816 HE2 HIS 79 -32.575 -9.761 -5.237 1.00 H +ATOM 817 NE2 HIS 79 -31.999 -10.233 -4.681 1.00 N +ATOM 818 N ILE 80 -26.711 -10.904 -4.991 1.00 N +ATOM 819 CA ILE 80 -26.078 -10.653 -6.265 1.00 C +ATOM 820 C ILE 80 -25.236 -11.902 -6.325 1.00 C +ATOM 821 O ILE 80 -25.177 -12.649 -5.383 1.00 O +ATOM 822 H ILE 80 -26.490 -10.408 -4.273 1.00 H +ATOM 823 CB ILE 80 -25.327 -9.309 -6.267 1.00 C +ATOM 824 CD1 ILE 80 -25.624 -6.823 -5.784 1.00 C +ATOM 825 CG1 ILE 80 -26.302 -8.153 -6.033 1.00 C +ATOM 826 CG2 ILE 80 -24.545 -9.137 -7.560 1.00 C +ATOM 827 N LEU 81 -24.628 -12.328 -7.403 1.00 N +ATOM 828 CA LEU 81 -23.956 -13.605 -7.362 1.00 C +ATOM 829 C LEU 81 -24.964 -14.730 -7.468 1.00 C +ATOM 830 O LEU 81 -24.874 -15.514 -8.408 1.00 O +ATOM 831 H LEU 81 -24.624 -11.841 -8.160 1.00 H +ATOM 832 CB LEU 81 -23.135 -13.738 -6.077 1.00 C +ATOM 833 CG LEU 81 -21.697 -13.218 -6.135 1.00 C +ATOM 834 CD1 LEU 81 -21.669 -11.761 -6.571 1.00 C +ATOM 835 CD2 LEU 81 -21.013 -13.381 -4.787 1.00 C +ATOM 836 N SER 82 -26.007 -14.810 -6.606 1.00 N +ATOM 837 CA SER 82 -26.975 -15.871 -6.761 1.00 C +ATOM 838 C SER 82 -27.819 -15.530 -7.949 1.00 C +ATOM 839 O SER 82 -28.152 -16.404 -8.747 1.00 O +ATOM 840 H SER 82 -26.100 -14.210 -5.942 1.00 H +ATOM 841 CB SER 82 -27.808 -16.027 -5.487 1.00 C +ATOM 842 HG SER 82 -26.404 -15.920 -4.263 1.00 H +ATOM 843 OG SER 82 -27.008 -16.472 -4.406 1.00 O +ATOM 844 N ASN 83 -28.171 -14.233 -8.108 1.00 N +ATOM 845 CA ASN 83 -29.017 -13.853 -9.202 1.00 C +ATOM 846 C ASN 83 -28.249 -13.981 -10.475 1.00 C +ATOM 847 O ASN 83 -28.822 -14.341 -11.501 1.00 O +ATOM 848 H ASN 83 -27.876 -13.610 -7.530 1.00 H +ATOM 849 CB ASN 83 -29.549 -12.433 -9.000 1.00 C +ATOM 850 CG ASN 83 -30.611 -12.357 -7.920 1.00 C +ATOM 851 OD1 ASN 83 -31.232 -13.362 -7.575 1.00 O +ATOM 852 1HD2 ASN 83 -31.442 -11.061 -6.738 1.00 H +ATOM 853 2HD2 ASN 83 -30.347 -10.451 -7.665 1.00 H +ATOM 854 ND2 ASN 83 -30.823 -11.161 -7.383 1.00 N +ATOM 855 N ALA 84 -26.933 -13.673 -10.439 1.00 N +ATOM 856 CA ALA 84 -26.122 -13.735 -11.619 1.00 C +ATOM 857 C ALA 84 -26.098 -15.153 -12.099 1.00 C +ATOM 858 O ALA 84 -26.337 -15.404 -13.278 1.00 O +ATOM 859 H ALA 84 -26.568 -13.425 -9.655 1.00 H +ATOM 860 CB ALA 84 -24.722 -13.218 -11.328 1.00 C +ATOM 861 N LEU 85 -25.881 -16.120 -11.180 1.00 N +ATOM 862 CA LEU 85 -25.769 -17.509 -11.547 1.00 C +ATOM 863 C LEU 85 -27.066 -17.932 -12.173 1.00 C +ATOM 864 O LEU 85 -27.076 -18.639 -13.179 1.00 O +ATOM 865 H LEU 85 -25.806 -15.875 -10.317 1.00 H +ATOM 866 CB LEU 85 -25.428 -18.361 -10.323 1.00 C +ATOM 867 CG LEU 85 -24.027 -18.174 -9.736 1.00 C +ATOM 868 CD1 LEU 85 -23.886 -18.937 -8.428 1.00 C +ATOM 869 CD2 LEU 85 -22.964 -18.622 -10.727 1.00 C +ATOM 870 N ARG 86 -28.204 -17.486 -11.608 1.00 N +ATOM 871 CA ARG 86 -29.481 -17.887 -12.124 1.00 C +ATOM 872 C ARG 86 -29.672 -17.350 -13.508 1.00 C +ATOM 873 O ARG 86 -30.171 -18.054 -14.385 1.00 O +ATOM 874 H ARG 86 -28.158 -16.932 -10.901 1.00 H +ATOM 875 CB ARG 86 -30.605 -17.409 -11.203 1.00 C +ATOM 876 CD ARG 86 -31.762 -17.570 -8.981 1.00 C +ATOM 877 HE ARG 86 -31.345 -18.962 -7.599 1.00 H +ATOM 878 NE ARG 86 -31.843 -18.267 -7.700 1.00 N +ATOM 879 CG ARG 86 -30.661 -18.131 -9.866 1.00 C +ATOM 880 CZ ARG 86 -32.630 -17.895 -6.695 1.00 C +ATOM 881 1HH1 ARG 86 -32.133 -19.282 -5.484 1.00 H +ATOM 882 2HH1 ARG 86 -33.147 -18.350 -4.917 1.00 H +ATOM 883 NH1 ARG 86 -32.638 -18.590 -5.566 1.00 N +ATOM 884 1HH2 ARG 86 -33.403 -16.377 -7.554 1.00 H +ATOM 885 2HH2 ARG 86 -33.917 -16.587 -6.172 1.00 H +ATOM 886 NH2 ARG 86 -33.407 -16.828 -6.822 1.00 N +ATOM 887 N HIS 87 -29.262 -16.089 -13.748 1.00 N +ATOM 888 CA HIS 87 -29.521 -15.462 -15.008 1.00 C +ATOM 889 C HIS 87 -28.750 -16.176 -16.070 1.00 C +ATOM 890 O HIS 87 -29.242 -16.362 -17.182 1.00 O +ATOM 891 H HIS 87 -28.820 -15.641 -13.105 1.00 H +ATOM 892 CB HIS 87 -29.150 -13.979 -14.955 1.00 C +ATOM 893 CG HIS 87 -30.062 -13.158 -14.096 1.00 C +ATOM 894 HD1 HIS 87 -28.800 -11.635 -13.514 1.00 H +ATOM 895 ND1 HIS 87 -29.653 -12.003 -13.467 1.00 N +ATOM 896 CE1 HIS 87 -30.686 -11.493 -12.773 1.00 C +ATOM 897 CD2 HIS 87 -31.454 -13.248 -13.679 1.00 C +ATOM 898 NE2 HIS 87 -31.770 -12.234 -12.896 1.00 N +ATOM 899 N LEU 88 -27.526 -16.621 -15.727 1.00 N +ATOM 900 CA LEU 88 -26.636 -17.319 -16.616 1.00 C +ATOM 901 C LEU 88 -27.365 -18.516 -17.145 1.00 C +ATOM 902 O LEU 88 -27.371 -18.759 -18.349 1.00 O +ATOM 903 H LEU 88 -27.276 -16.456 -14.878 1.00 H +ATOM 904 CB LEU 88 -25.349 -17.711 -15.887 1.00 C +ATOM 905 CG LEU 88 -24.410 -16.566 -15.505 1.00 C +ATOM 906 CD1 LEU 88 -23.283 -17.068 -14.616 1.00 C +ATOM 907 CD2 LEU 88 -23.845 -15.897 -16.749 1.00 C +ATOM 908 N HIS 89 -28.006 -19.299 -16.254 1.00 N +ATOM 909 CA HIS 89 -28.665 -20.509 -16.675 1.00 C +ATOM 910 C HIS 89 -29.779 -20.173 -17.621 1.00 C +ATOM 911 O HIS 89 -29.864 -20.726 -18.715 1.00 O +ATOM 912 H HIS 89 -28.019 -19.058 -15.387 1.00 H +ATOM 913 CB HIS 89 -29.192 -21.281 -15.464 1.00 C +ATOM 914 CG HIS 89 -29.891 -22.557 -15.818 1.00 C +ATOM 915 ND1 HIS 89 -29.217 -23.680 -16.247 1.00 N +ATOM 916 CE1 HIS 89 -30.108 -24.659 -16.487 1.00 C +ATOM 917 CD2 HIS 89 -31.274 -23.012 -15.842 1.00 C +ATOM 918 HE2 HIS 89 -32.115 -24.775 -16.343 1.00 H +ATOM 919 NE2 HIS 89 -31.343 -24.265 -16.246 1.00 N +ATOM 920 N ASP 90 -30.663 -19.248 -17.203 1.00 N +ATOM 921 CA ASP 90 -31.871 -18.913 -17.911 1.00 C +ATOM 922 C ASP 90 -31.692 -18.131 -19.171 1.00 C +ATOM 923 O ASP 90 -32.394 -18.381 -20.149 1.00 O +ATOM 924 H ASP 90 -30.462 -18.829 -16.432 1.00 H +ATOM 925 CB ASP 90 -32.818 -18.120 -17.009 1.00 C +ATOM 926 CG ASP 90 -33.434 -18.973 -15.917 1.00 C +ATOM 927 OD1 ASP 90 -33.351 -20.215 -16.016 1.00 O +ATOM 928 OD2 ASP 90 -34.001 -18.399 -14.963 1.00 O +ATOM 929 N ASN 91 -30.773 -17.155 -19.194 1.00 N +ATOM 930 CA ASN 91 -30.703 -16.272 -20.331 1.00 C +ATOM 931 C ASN 91 -29.469 -16.652 -21.094 1.00 C +ATOM 932 O ASN 91 -28.366 -16.666 -20.543 1.00 O +ATOM 933 H ASN 91 -30.202 -17.049 -18.506 1.00 H +ATOM 934 CB ASN 91 -30.699 -14.811 -19.876 1.00 C +ATOM 935 CG ASN 91 -31.997 -14.407 -19.203 1.00 C +ATOM 936 OD1 ASN 91 -32.933 -13.953 -19.861 1.00 O +ATOM 937 1HD2 ASN 91 -32.803 -14.348 -17.438 1.00 H +ATOM 938 2HD2 ASN 91 -31.348 -14.907 -17.443 1.00 H +ATOM 939 ND2 ASN 91 -32.056 -14.572 -17.887 1.00 N +ATOM 940 N PRO 92 -29.651 -17.070 -22.321 1.00 N +ATOM 941 CA PRO 92 -28.518 -17.393 -23.152 1.00 C +ATOM 942 C PRO 92 -27.834 -16.165 -23.658 1.00 C +ATOM 943 O PRO 92 -26.627 -16.222 -23.883 1.00 O +ATOM 944 CB PRO 92 -29.121 -18.205 -24.300 1.00 C +ATOM 945 CD PRO 92 -30.955 -17.475 -22.947 1.00 C +ATOM 946 CG PRO 92 -30.544 -17.762 -24.364 1.00 C +ATOM 947 N GLU 93 -28.574 -15.046 -23.833 1.00 N +ATOM 948 CA GLU 93 -27.975 -13.905 -24.463 1.00 C +ATOM 949 C GLU 93 -27.447 -12.935 -23.455 1.00 C +ATOM 950 O GLU 93 -27.240 -11.771 -23.792 1.00 O +ATOM 951 H GLU 93 -29.431 -15.011 -23.560 1.00 H +ATOM 952 CB GLU 93 -28.984 -13.207 -25.377 1.00 C +ATOM 953 CD GLU 93 -28.372 -14.443 -27.493 1.00 C +ATOM 954 CG GLU 93 -29.479 -14.068 -26.527 1.00 C +ATOM 955 OE1 GLU 93 -27.587 -13.549 -27.873 1.00 O +ATOM 956 OE2 GLU 93 -28.290 -15.631 -27.870 1.00 O +ATOM 957 N MET 94 -27.185 -13.358 -22.201 1.00 N +ATOM 958 CA MET 94 -26.493 -12.421 -21.361 1.00 C +ATOM 959 C MET 94 -25.088 -12.875 -21.423 1.00 C +ATOM 960 O MET 94 -24.778 -13.992 -21.014 1.00 O +ATOM 961 H MET 94 -27.414 -14.167 -21.879 1.00 H +ATOM 962 CB MET 94 -27.088 -12.424 -19.951 1.00 C +ATOM 963 SD MET 94 -27.169 -11.465 -17.353 1.00 S +ATOM 964 CE MET 94 -26.536 -13.026 -16.745 1.00 C +ATOM 965 CG MET 94 -26.446 -11.424 -19.004 1.00 C +ATOM 966 N LYS 95 -24.208 -12.064 -22.043 1.00 N +ATOM 967 CA LYS 95 -22.895 -12.621 -22.172 1.00 C +ATOM 968 C LYS 95 -21.957 -12.602 -21.024 1.00 C +ATOM 969 O LYS 95 -21.211 -13.566 -20.856 1.00 O +ATOM 970 H LYS 95 -24.381 -11.241 -22.364 1.00 H +ATOM 971 CB LYS 95 -22.135 -11.942 -23.313 1.00 C +ATOM 972 CD LYS 95 -22.712 -13.652 -25.057 1.00 C +ATOM 973 CE LYS 95 -23.225 -13.876 -26.470 1.00 C +ATOM 974 CG LYS 95 -22.738 -12.178 -24.688 1.00 C +ATOM 975 1HZ LYS 95 -23.526 -15.413 -27.671 1.00 H +ATOM 976 2HZ LYS 95 -23.743 -15.771 -26.279 1.00 H +ATOM 977 3HZ LYS 95 -22.390 -15.635 -26.792 1.00 H +ATOM 978 NZ LYS 95 -23.220 -15.319 -26.840 1.00 N +ATOM 979 N PHE 96 -21.972 -11.572 -20.174 1.00 N +ATOM 980 CA PHE 96 -20.859 -11.515 -19.279 1.00 C +ATOM 981 C PHE 96 -21.193 -10.876 -17.996 1.00 C +ATOM 982 O PHE 96 -22.107 -10.062 -17.911 1.00 O +ATOM 983 H PHE 96 -22.613 -10.942 -20.135 1.00 H +ATOM 984 CB PHE 96 -19.690 -10.767 -19.924 1.00 C +ATOM 985 CG PHE 96 -19.186 -11.405 -21.187 1.00 C +ATOM 986 CZ PHE 96 -18.248 -12.589 -23.521 1.00 C +ATOM 987 CD1 PHE 96 -19.733 -11.072 -22.414 1.00 C +ATOM 988 CE1 PHE 96 -19.269 -11.659 -23.576 1.00 C +ATOM 989 CD2 PHE 96 -18.165 -12.338 -21.148 1.00 C +ATOM 990 CE2 PHE 96 -17.701 -12.925 -22.310 1.00 C +ATOM 991 N ILE 97 -20.474 -11.318 -16.949 1.00 N +ATOM 992 CA ILE 97 -20.585 -10.763 -15.637 1.00 C +ATOM 993 C ILE 97 -19.174 -10.509 -15.290 1.00 C +ATOM 994 O ILE 97 -18.314 -11.258 -15.741 1.00 O +ATOM 995 H ILE 97 -19.902 -11.996 -17.104 1.00 H +ATOM 996 CB ILE 97 -21.321 -11.719 -14.680 1.00 C +ATOM 997 CD1 ILE 97 -23.632 -10.842 -15.302 1.00 C +ATOM 998 CG1 ILE 97 -22.716 -12.043 -15.218 1.00 C +ATOM 999 CG2 ILE 97 -21.376 -11.132 -13.278 1.00 C +ATOM 1000 N TRP 98 -18.891 -9.459 -14.503 1.00 N +ATOM 1001 CA TRP 98 -17.525 -9.062 -14.416 1.00 C +ATOM 1002 C TRP 98 -17.168 -8.469 -13.125 1.00 C +ATOM 1003 O TRP 98 -17.756 -7.474 -12.719 1.00 O +ATOM 1004 H TRP 98 -19.520 -9.011 -14.041 1.00 H +ATOM 1005 CB TRP 98 -17.185 -8.065 -15.525 1.00 C +ATOM 1006 1HB TRP 98 -17.455 -7.100 -15.264 1.00 H +ATOM 1007 2HB TRP 98 -17.201 -8.428 -16.457 1.00 H +ATOM 1008 CG TRP 98 -15.738 -7.678 -15.562 1.00 C +ATOM 1009 CD1 TRP 98 -14.682 -8.413 -15.106 1.00 C +ATOM 1010 HE1 TRP 98 -12.655 -8.043 -15.075 1.00 H +ATOM 1011 NE1 TRP 98 -13.507 -7.731 -15.310 1.00 N +ATOM 1012 CD2 TRP 98 -15.188 -6.462 -16.083 1.00 C +ATOM 1013 CE2 TRP 98 -13.793 -6.529 -15.909 1.00 C +ATOM 1014 CH2 TRP 98 -13.505 -4.401 -16.890 1.00 C +ATOM 1015 CZ2 TRP 98 -12.940 -5.502 -16.310 1.00 C +ATOM 1016 CE3 TRP 98 -15.738 -5.324 -16.679 1.00 C +ATOM 1017 CZ3 TRP 98 -14.889 -4.308 -17.075 1.00 C +ATOM 1018 N ALA 99 -16.198 -9.048 -12.411 1.00 N +ATOM 1019 CA ALA 99 -15.742 -8.165 -11.410 1.00 C +ATOM 1020 C ALA 99 -14.372 -8.580 -10.867 1.00 C +ATOM 1021 O ALA 99 -14.316 -9.085 -9.758 1.00 O +ATOM 1022 H ALA 99 -15.833 -9.867 -12.489 1.00 H +ATOM 1023 CB ALA 99 -16.746 -8.092 -10.270 1.00 C +ATOM 1024 N GLU 100 -13.258 -8.118 -11.501 1.00 N +ATOM 1025 CA GLU 100 -11.795 -8.328 -11.428 1.00 C +ATOM 1026 C GLU 100 -11.156 -8.579 -10.050 1.00 C +ATOM 1027 O GLU 100 -9.948 -8.423 -9.876 1.00 O +ATOM 1028 H GLU 100 -13.601 -7.542 -12.102 1.00 H +ATOM 1029 CB GLU 100 -11.051 -7.131 -12.025 1.00 C +ATOM 1030 CD GLU 100 -10.515 -5.755 -14.074 1.00 C +ATOM 1031 CG GLU 100 -11.246 -6.964 -13.523 1.00 C +ATOM 1032 OE1 GLU 100 -9.310 -5.607 -13.783 1.00 O +ATOM 1033 OE2 GLU 100 -11.148 -4.957 -14.797 1.00 O +ATOM 1034 N ILE 101 -11.846 -9.009 -8.991 1.00 N +ATOM 1035 CA ILE 101 -11.012 -9.299 -7.854 1.00 C +ATOM 1036 C ILE 101 -11.588 -10.547 -7.200 1.00 C +ATOM 1037 O ILE 101 -12.786 -10.666 -6.929 1.00 O +ATOM 1038 H ILE 101 -12.737 -9.124 -8.937 1.00 H +ATOM 1039 CB ILE 101 -10.948 -8.106 -6.882 1.00 C +ATOM 1040 CD1 ILE 101 -10.484 -5.602 -6.771 1.00 C +ATOM 1041 CG1 ILE 101 -10.392 -6.870 -7.592 1.00 C +ATOM 1042 CG2 ILE 101 -10.132 -8.466 -5.650 1.00 C +ATOM 1043 N SER 102 -10.692 -11.505 -6.907 1.00 N +ATOM 1044 CA SER 102 -10.935 -12.839 -6.458 1.00 C +ATOM 1045 C SER 102 -11.600 -12.964 -5.117 1.00 C +ATOM 1046 O SER 102 -12.337 -13.912 -4.818 1.00 O +ATOM 1047 H SER 102 -9.848 -11.217 -7.026 1.00 H +ATOM 1048 CB SER 102 -9.628 -13.631 -6.400 1.00 C +ATOM 1049 HG SER 102 -8.060 -13.559 -5.392 1.00 H +ATOM 1050 OG SER 102 -8.761 -13.115 -5.405 1.00 O +ATOM 1051 N TYR 103 -11.397 -11.962 -4.281 1.00 N +ATOM 1052 CA TYR 103 -11.822 -12.032 -2.938 1.00 C +ATOM 1053 C TYR 103 -13.326 -12.216 -2.943 1.00 C +ATOM 1054 O TYR 103 -13.922 -12.771 -2.014 1.00 O +ATOM 1055 H TYR 103 -10.979 -11.224 -4.583 1.00 H +ATOM 1056 CB TYR 103 -11.402 -10.773 -2.177 1.00 C +ATOM 1057 CG TYR 103 -12.219 -9.548 -2.521 1.00 C +ATOM 1058 HH TYR 103 -14.125 -5.783 -4.092 1.00 H +ATOM 1059 OH TYR 103 -14.476 -6.183 -3.455 1.00 O +ATOM 1060 CZ TYR 103 -13.728 -7.296 -3.147 1.00 C +ATOM 1061 CD1 TYR 103 -13.369 -9.237 -1.807 1.00 C +ATOM 1062 CE1 TYR 103 -14.122 -8.119 -2.115 1.00 C +ATOM 1063 CD2 TYR 103 -11.837 -8.707 -3.558 1.00 C +ATOM 1064 CE2 TYR 103 -12.577 -7.585 -3.880 1.00 C +ATOM 1065 N PHE 104 -13.990 -11.720 -4.006 1.00 N +ATOM 1066 CA PHE 104 -15.393 -11.952 -4.141 1.00 C +ATOM 1067 C PHE 104 -15.723 -13.419 -4.216 1.00 C +ATOM 1068 O PHE 104 -16.682 -13.851 -3.579 1.00 O +ATOM 1069 H PHE 104 -13.551 -11.243 -4.630 1.00 H +ATOM 1070 CB PHE 104 -15.936 -11.243 -5.383 1.00 C +ATOM 1071 CG PHE 104 -16.064 -9.755 -5.224 1.00 C +ATOM 1072 CZ PHE 104 -16.301 -7.001 -4.924 1.00 C +ATOM 1073 CD1 PHE 104 -15.801 -8.906 -6.285 1.00 C +ATOM 1074 CE1 PHE 104 -15.918 -7.537 -6.139 1.00 C +ATOM 1075 CD2 PHE 104 -16.446 -9.203 -4.014 1.00 C +ATOM 1076 CE2 PHE 104 -16.563 -7.834 -3.868 1.00 C +ATOM 1077 N ALA 105 -14.961 -14.231 -4.980 1.00 N +ATOM 1078 CA ALA 105 -15.282 -15.632 -5.093 1.00 C +ATOM 1079 C ALA 105 -15.157 -16.278 -3.746 1.00 C +ATOM 1080 O ALA 105 -16.012 -17.075 -3.373 1.00 O +ATOM 1081 H ALA 105 -14.251 -13.895 -5.419 1.00 H +ATOM 1082 CB ALA 105 -14.372 -16.304 -6.110 1.00 C +ATOM 1083 N ARG 106 -14.103 -15.962 -2.964 1.00 N +ATOM 1084 CA ARG 106 -13.980 -16.616 -1.690 1.00 C +ATOM 1085 C ARG 106 -15.096 -16.188 -0.808 1.00 C +ATOM 1086 O ARG 106 -15.643 -17.002 -0.070 1.00 O +ATOM 1087 H ARG 106 -13.486 -15.359 -3.222 1.00 H +ATOM 1088 CB ARG 106 -12.625 -16.300 -1.054 1.00 C +ATOM 1089 CD ARG 106 -12.386 -18.457 0.206 1.00 C +ATOM 1090 HE ARG 106 -12.926 -19.307 1.940 1.00 H +ATOM 1091 NE ARG 106 -12.211 -19.091 1.511 1.00 N +ATOM 1092 CG ARG 106 -12.414 -16.941 0.308 1.00 C +ATOM 1093 CZ ARG 106 -11.031 -19.347 2.065 1.00 C +ATOM 1094 1HH1 ARG 106 -11.694 -20.136 3.670 1.00 H +ATOM 1095 2HH1 ARG 106 -10.206 -20.093 3.615 1.00 H +ATOM 1096 NH1 ARG 106 -10.970 -19.927 3.256 1.00 N +ATOM 1097 1HH2 ARG 106 -9.954 -18.649 0.654 1.00 H +ATOM 1098 2HH2 ARG 106 -9.151 -19.191 1.785 1.00 H +ATOM 1099 NH2 ARG 106 -9.915 -19.025 1.426 1.00 N +ATOM 1100 N PHE 107 -15.452 -14.888 -0.848 1.00 N +ATOM 1101 CA PHE 107 -16.489 -14.433 0.024 1.00 C +ATOM 1102 C PHE 107 -17.722 -15.227 -0.275 1.00 C +ATOM 1103 O PHE 107 -18.424 -15.678 0.626 1.00 O +ATOM 1104 H PHE 107 -15.050 -14.310 -1.409 1.00 H +ATOM 1105 CB PHE 107 -16.722 -12.932 -0.158 1.00 C +ATOM 1106 CG PHE 107 -15.650 -12.074 0.453 1.00 C +ATOM 1107 CZ PHE 107 -13.671 -10.481 1.579 1.00 C +ATOM 1108 CD1 PHE 107 -14.675 -12.631 1.262 1.00 C +ATOM 1109 CE1 PHE 107 -13.689 -11.841 1.823 1.00 C +ATOM 1110 CD2 PHE 107 -15.618 -10.711 0.218 1.00 C +ATOM 1111 CE2 PHE 107 -14.632 -9.922 0.780 1.00 C +ATOM 1112 N TYR 108 -18.020 -15.442 -1.561 1.00 N +ATOM 1113 CA TYR 108 -19.247 -16.094 -1.888 1.00 C +ATOM 1114 C TYR 108 -19.211 -17.539 -1.445 1.00 C +ATOM 1115 O TYR 108 -20.204 -18.061 -0.941 1.00 O +ATOM 1116 H TYR 108 -17.460 -15.182 -2.216 1.00 H +ATOM 1117 CB TYR 108 -19.519 -16.002 -3.391 1.00 C +ATOM 1118 CG TYR 108 -20.825 -16.633 -3.817 1.00 C +ATOM 1119 HH TYR 108 -25.042 -18.042 -4.520 1.00 H +ATOM 1120 OH TYR 108 -24.426 -18.358 -4.977 1.00 O +ATOM 1121 CZ TYR 108 -23.234 -17.788 -4.595 1.00 C +ATOM 1122 CD1 TYR 108 -22.020 -16.276 -3.206 1.00 C +ATOM 1123 CE1 TYR 108 -23.219 -16.847 -3.589 1.00 C +ATOM 1124 CD2 TYR 108 -20.859 -17.584 -4.829 1.00 C +ATOM 1125 CE2 TYR 108 -22.048 -18.166 -5.225 1.00 C +ATOM 1126 N HIS 109 -18.077 -18.252 -1.621 1.00 N +ATOM 1127 CA HIS 109 -18.063 -19.626 -1.200 1.00 C +ATOM 1128 C HIS 109 -18.125 -19.734 0.289 1.00 C +ATOM 1129 O HIS 109 -18.675 -20.711 0.794 1.00 O +ATOM 1130 H HIS 109 -17.342 -17.887 -1.991 1.00 H +ATOM 1131 CB HIS 109 -16.813 -20.335 -1.726 1.00 C +ATOM 1132 CG HIS 109 -16.820 -20.551 -3.207 1.00 C +ATOM 1133 ND1 HIS 109 -15.698 -20.936 -3.909 1.00 N +ATOM 1134 CE1 HIS 109 -16.013 -21.049 -5.211 1.00 C +ATOM 1135 CD2 HIS 109 -17.815 -20.457 -4.266 1.00 C +ATOM 1136 HE2 HIS 109 -17.716 -20.775 -6.255 1.00 H +ATOM 1137 NE2 HIS 109 -17.282 -20.763 -5.433 1.00 N +ATOM 1138 N ASP 110 -17.555 -18.767 1.042 1.00 N +ATOM 1139 CA ASP 110 -17.583 -18.915 2.472 1.00 C +ATOM 1140 C ASP 110 -19.021 -19.001 2.900 1.00 C +ATOM 1141 O ASP 110 -19.362 -19.846 3.723 1.00 O +ATOM 1142 H ASP 110 -17.165 -18.045 0.672 1.00 H +ATOM 1143 CB ASP 110 -16.859 -17.748 3.146 1.00 C +ATOM 1144 CG ASP 110 -15.356 -17.809 2.960 1.00 C +ATOM 1145 OD1 ASP 110 -14.850 -18.878 2.557 1.00 O +ATOM 1146 OD2 ASP 110 -14.683 -16.789 3.218 1.00 O +ATOM 1147 N LEU 111 -19.935 -18.165 2.366 1.00 N +ATOM 1148 CA LEU 111 -21.297 -18.435 2.744 1.00 C +ATOM 1149 C LEU 111 -21.985 -18.848 1.488 1.00 C +ATOM 1150 O LEU 111 -22.559 -18.037 0.762 1.00 O +ATOM 1151 H LEU 111 -19.749 -17.480 1.813 1.00 H +ATOM 1152 CB LEU 111 -21.927 -17.202 3.394 1.00 C +ATOM 1153 CG LEU 111 -21.240 -16.674 4.655 1.00 C +ATOM 1154 CD1 LEU 111 -21.899 -15.387 5.128 1.00 C +ATOM 1155 CD2 LEU 111 -21.266 -17.719 5.759 1.00 C +ATOM 1156 N GLY 112 -21.953 -20.170 1.258 1.00 N +ATOM 1157 CA GLY 112 -22.455 -20.881 0.118 1.00 C +ATOM 1158 C GLY 112 -21.254 -21.546 -0.482 1.00 C +ATOM 1159 O GLY 112 -20.695 -21.057 -1.463 1.00 O +ATOM 1160 H GLY 112 -21.559 -20.619 1.931 1.00 H +ATOM 1161 N GLU 113 -20.785 -22.637 0.177 1.00 N +ATOM 1162 CA GLU 113 -19.719 -23.484 -0.299 1.00 C +ATOM 1163 C GLU 113 -20.234 -24.449 -1.314 1.00 C +ATOM 1164 O GLU 113 -19.499 -24.846 -2.214 1.00 O +ATOM 1165 H GLU 113 -21.187 -22.818 0.962 1.00 H +ATOM 1166 CB GLU 113 -19.067 -24.231 0.866 1.00 C +ATOM 1167 CD GLU 113 -16.723 -24.295 -0.073 1.00 C +ATOM 1168 CG GLU 113 -17.889 -25.103 0.463 1.00 C +ATOM 1169 OE1 GLU 113 -16.650 -23.086 0.230 1.00 O +ATOM 1170 OE2 GLU 113 -15.884 -24.872 -0.795 1.00 O +ATOM 1171 N ASN 114 -21.521 -24.835 -1.193 1.00 N +ATOM 1172 CA ASN 114 -22.148 -25.825 -2.027 1.00 C +ATOM 1173 C ASN 114 -22.092 -25.373 -3.457 1.00 C +ATOM 1174 O ASN 114 -21.949 -26.203 -4.352 1.00 O +ATOM 1175 H ASN 114 -21.993 -24.431 -0.542 1.00 H +ATOM 1176 CB ASN 114 -23.586 -26.077 -1.570 1.00 C +ATOM 1177 CG ASN 114 -23.657 -26.873 -0.282 1.00 C +ATOM 1178 OD1 ASN 114 -22.699 -27.547 0.096 1.00 O +ATOM 1179 1HD2 ASN 114 -24.891 -27.251 1.169 1.00 H +ATOM 1180 2HD2 ASN 114 -25.473 -26.293 0.085 1.00 H +ATOM 1181 ND2 ASN 114 -24.796 -26.797 0.397 1.00 N +ATOM 1182 N LYS 115 -22.201 -24.050 -3.711 1.00 N +ATOM 1183 CA LYS 115 -22.259 -23.515 -5.049 1.00 C +ATOM 1184 C LYS 115 -20.904 -23.441 -5.695 1.00 C +ATOM 1185 O LYS 115 -20.683 -22.594 -6.559 1.00 O +ATOM 1186 H LYS 115 -22.237 -23.496 -3.003 1.00 H +ATOM 1187 CB LYS 115 -22.895 -22.124 -5.043 1.00 C +ATOM 1188 CD LYS 115 -24.938 -20.707 -4.693 1.00 C +ATOM 1189 CE LYS 115 -26.413 -20.701 -4.325 1.00 C +ATOM 1190 CG LYS 115 -24.368 -22.117 -4.667 1.00 C +ATOM 1191 1HZ LYS 115 -27.840 -19.357 -4.101 1.00 H +ATOM 1192 2HZ LYS 115 -26.892 -18.964 -5.130 1.00 H +ATOM 1193 3HZ LYS 115 -26.541 -18.825 -3.726 1.00 H +ATOM 1194 NZ LYS 115 -26.978 -19.324 -4.320 1.00 N +ATOM 1195 N LYS 116 -19.960 -24.320 -5.328 1.00 N +ATOM 1196 CA LYS 116 -18.650 -24.276 -5.912 1.00 C +ATOM 1197 C LYS 116 -18.698 -24.747 -7.339 1.00 C +ATOM 1198 O LYS 116 -18.050 -24.162 -8.205 1.00 O +ATOM 1199 H LYS 116 -20.156 -24.942 -4.708 1.00 H +ATOM 1200 CB LYS 116 -17.672 -25.127 -5.099 1.00 C +ATOM 1201 CD LYS 116 -15.306 -25.860 -4.695 1.00 C +ATOM 1202 CE LYS 116 -13.875 -25.820 -5.206 1.00 C +ATOM 1203 CG LYS 116 -16.241 -25.087 -5.610 1.00 C +ATOM 1204 1HZ LYS 116 -12.121 -26.530 -4.647 1.00 H +ATOM 1205 2HZ LYS 116 -13.203 -27.425 -4.276 1.00 H +ATOM 1206 3HZ LYS 116 -12.962 -26.219 -3.503 1.00 H +ATOM 1207 NZ LYS 116 -12.947 -26.574 -4.319 1.00 N +ATOM 1208 N LEU 117 -19.481 -25.814 -7.619 1.00 N +ATOM 1209 CA LEU 117 -19.559 -26.407 -8.930 1.00 C +ATOM 1210 C LEU 117 -20.152 -25.402 -9.866 1.00 C +ATOM 1211 O LEU 117 -19.679 -25.238 -10.989 1.00 O +ATOM 1212 H LEU 117 -19.967 -26.154 -6.942 1.00 H +ATOM 1213 CB LEU 117 -20.386 -27.693 -8.888 1.00 C +ATOM 1214 CG LEU 117 -19.762 -28.877 -8.147 1.00 C +ATOM 1215 CD1 LEU 117 -20.757 -30.021 -8.025 1.00 C +ATOM 1216 CD2 LEU 117 -18.499 -29.347 -8.852 1.00 C +ATOM 1217 N GLN 118 -21.204 -24.692 -9.418 1.00 N +ATOM 1218 CA GLN 118 -21.867 -23.733 -10.251 1.00 C +ATOM 1219 C GLN 118 -20.900 -22.637 -10.583 1.00 C +ATOM 1220 O GLN 118 -20.837 -22.190 -11.726 1.00 O +ATOM 1221 H GLN 118 -21.489 -24.830 -8.576 1.00 H +ATOM 1222 CB GLN 118 -23.113 -23.186 -9.551 1.00 C +ATOM 1223 CD GLN 118 -24.547 -22.926 -11.614 1.00 C +ATOM 1224 CG GLN 118 -23.940 -22.240 -10.406 1.00 C +ATOM 1225 OE1 GLN 118 -25.235 -23.939 -11.484 1.00 O +ATOM 1226 1HE2 GLN 118 -24.629 -22.744 -13.545 1.00 H +ATOM 1227 2HE2 GLN 118 -23.785 -21.635 -12.847 1.00 H +ATOM 1228 NE2 GLN 118 -24.293 -22.376 -12.796 1.00 N +ATOM 1229 N MET 119 -20.111 -22.181 -9.588 1.00 N +ATOM 1230 CA MET 119 -19.236 -21.065 -9.793 1.00 C +ATOM 1231 C MET 119 -18.205 -21.448 -10.812 1.00 C +ATOM 1232 O MET 119 -17.884 -20.662 -11.702 1.00 O +ATOM 1233 H MET 119 -20.140 -22.589 -8.786 1.00 H +ATOM 1234 CB MET 119 -18.588 -20.643 -8.473 1.00 C +ATOM 1235 SD MET 119 -20.281 -18.480 -8.109 1.00 S +ATOM 1236 CE MET 119 -18.846 -17.408 -8.143 1.00 C +ATOM 1237 CG MET 119 -19.551 -20.006 -7.485 1.00 C +ATOM 1238 N LYS 120 -17.670 -22.682 -10.721 1.00 N +ATOM 1239 CA LYS 120 -16.634 -23.085 -11.622 1.00 C +ATOM 1240 C LYS 120 -17.175 -23.186 -13.013 1.00 C +ATOM 1241 O LYS 120 -16.492 -22.849 -13.979 1.00 O +ATOM 1242 H LYS 120 -17.966 -23.253 -10.091 1.00 H +ATOM 1243 CB LYS 120 -16.029 -24.419 -11.180 1.00 C +ATOM 1244 CD LYS 120 -14.643 -25.693 -9.521 1.00 C +ATOM 1245 CE LYS 120 -13.814 -25.608 -8.249 1.00 C +ATOM 1246 CG LYS 120 -15.202 -24.334 -9.907 1.00 C +ATOM 1247 1HZ LYS 120 -12.816 -26.854 -7.089 1.00 H +ATOM 1248 2HZ LYS 120 -12.780 -27.273 -8.480 1.00 H +ATOM 1249 3HZ LYS 120 -13.977 -27.492 -7.685 1.00 H +ATOM 1250 NZ LYS 120 -13.295 -26.940 -7.834 1.00 N +ATOM 1251 N SER 121 -18.425 -23.654 -13.163 1.00 N +ATOM 1252 CA SER 121 -18.982 -23.795 -14.476 1.00 C +ATOM 1253 C SER 121 -19.162 -22.451 -15.106 1.00 C +ATOM 1254 O SER 121 -18.933 -22.292 -16.304 1.00 O +ATOM 1255 H SER 121 -18.913 -23.879 -12.441 1.00 H +ATOM 1256 CB SER 121 -20.315 -24.544 -14.415 1.00 C +ATOM 1257 HG SER 121 -21.022 -23.663 -12.931 1.00 H +ATOM 1258 OG SER 121 -21.288 -23.797 -13.706 1.00 O +ATOM 1259 N ILE 122 -19.582 -21.448 -14.312 1.00 N +ATOM 1260 CA ILE 122 -19.845 -20.138 -14.827 1.00 C +ATOM 1261 C ILE 122 -18.572 -19.568 -15.349 1.00 C +ATOM 1262 O ILE 122 -18.537 -18.991 -16.435 1.00 O +ATOM 1263 H ILE 122 -19.697 -21.618 -13.436 1.00 H +ATOM 1264 CB ILE 122 -20.466 -19.224 -13.754 1.00 C +ATOM 1265 CD1 ILE 122 -22.846 -19.798 -14.467 1.00 C +ATOM 1266 CG1 ILE 122 -21.841 -19.750 -13.337 1.00 C +ATOM 1267 CG2 ILE 122 -20.536 -17.789 -14.253 1.00 C +ATOM 1268 N VAL 123 -17.481 -19.736 -14.588 1.00 N +ATOM 1269 CA VAL 123 -16.225 -19.185 -14.967 1.00 C +ATOM 1270 C VAL 123 -15.707 -19.858 -16.215 1.00 C +ATOM 1271 O VAL 123 -15.169 -19.189 -17.095 1.00 O +ATOM 1272 H VAL 123 -17.554 -20.208 -13.825 1.00 H +ATOM 1273 CB VAL 123 -15.190 -19.305 -13.833 1.00 C +ATOM 1274 CG1 VAL 123 -13.815 -18.874 -14.318 1.00 C +ATOM 1275 CG2 VAL 123 -15.619 -18.477 -12.631 1.00 C +ATOM 1276 N LYS 124 -15.876 -21.192 -16.354 1.00 N +ATOM 1277 CA LYS 124 -15.387 -21.871 -17.528 1.00 C +ATOM 1278 C LYS 124 -16.128 -21.390 -18.742 1.00 C +ATOM 1279 O LYS 124 -15.535 -21.179 -19.799 1.00 O +ATOM 1280 H LYS 124 -16.297 -21.656 -15.708 1.00 H +ATOM 1281 CB LYS 124 -15.531 -23.386 -17.370 1.00 C +ATOM 1282 CD LYS 124 -15.096 -25.681 -18.287 1.00 C +ATOM 1283 CE LYS 124 -14.578 -26.482 -19.471 1.00 C +ATOM 1284 CG LYS 124 -14.993 -24.187 -18.544 1.00 C +ATOM 1285 1HZ LYS 124 -14.364 -28.386 -19.944 1.00 H +ATOM 1286 2HZ LYS 124 -15.526 -28.172 -19.099 1.00 H +ATOM 1287 3HZ LYS 124 -14.194 -28.167 -18.518 1.00 H +ATOM 1288 NZ LYS 124 -14.676 -27.949 -19.234 1.00 N +ATOM 1289 N ASN 125 -17.452 -21.194 -18.614 1.00 N +ATOM 1290 CA ASN 125 -18.292 -20.778 -19.700 1.00 C +ATOM 1291 C ASN 125 -17.933 -19.352 -20.076 1.00 C +ATOM 1292 O ASN 125 -18.130 -18.940 -21.217 1.00 O +ATOM 1293 H ASN 125 -17.807 -21.336 -17.799 1.00 H +ATOM 1294 CB ASN 125 -19.767 -20.914 -19.318 1.00 C +ATOM 1295 CG ASN 125 -20.230 -22.357 -19.283 1.00 C +ATOM 1296 OD1 ASN 125 -19.623 -23.229 -19.905 1.00 O +ATOM 1297 1HD2 ASN 125 -21.625 -23.454 -18.496 1.00 H +ATOM 1298 2HD2 ASN 125 -21.723 -21.947 -18.111 1.00 H +ATOM 1299 ND2 ASN 125 -21.308 -22.613 -18.552 1.00 N +ATOM 1300 N GLY 126 -17.427 -18.525 -19.133 1.00 N +ATOM 1301 CA GLY 126 -17.052 -17.183 -19.515 1.00 C +ATOM 1302 C GLY 126 -18.087 -16.201 -19.048 1.00 C +ATOM 1303 O GLY 126 -17.961 -14.989 -19.228 1.00 O +ATOM 1304 H GLY 126 -17.322 -18.796 -18.281 1.00 H +ATOM 1305 N GLN 127 -19.155 -16.722 -18.436 1.00 N +ATOM 1306 CA GLN 127 -20.253 -15.948 -17.963 1.00 C +ATOM 1307 C GLN 127 -19.873 -15.138 -16.768 1.00 C +ATOM 1308 O GLN 127 -20.539 -14.141 -16.502 1.00 O +ATOM 1309 H GLN 127 -19.155 -17.616 -18.329 1.00 H +ATOM 1310 CB GLN 127 -21.440 -16.852 -17.624 1.00 C +ATOM 1311 CD GLN 127 -23.232 -18.425 -18.457 1.00 C +ATOM 1312 CG GLN 127 -22.089 -17.503 -18.835 1.00 C +ATOM 1313 OE1 GLN 127 -23.074 -19.316 -17.623 1.00 O +ATOM 1314 1HE2 GLN 127 -25.101 -18.732 -18.885 1.00 H +ATOM 1315 2HE2 GLN 127 -24.463 -17.550 -19.677 1.00 H +ATOM 1316 NE2 GLN 127 -24.390 -18.213 -19.073 1.00 N +ATOM 1317 N LEU 128 -18.876 -15.574 -15.958 1.00 N +ATOM 1318 CA LEU 128 -18.474 -14.704 -14.886 1.00 C +ATOM 1319 C LEU 128 -17.023 -14.438 -14.960 1.00 C +ATOM 1320 O LEU 128 -16.188 -15.321 -14.837 1.00 O +ATOM 1321 H LEU 128 -18.470 -16.369 -16.068 1.00 H +ATOM 1322 CB LEU 128 -18.839 -15.317 -13.533 1.00 C +ATOM 1323 CG LEU 128 -20.321 -15.287 -13.152 1.00 C +ATOM 1324 CD1 LEU 128 -21.105 -16.307 -13.964 1.00 C +ATOM 1325 CD2 LEU 128 -20.499 -15.545 -11.664 1.00 C +ATOM 1326 N GLU 129 -16.685 -13.150 -15.155 1.00 N +ATOM 1327 CA GLU 129 -15.365 -12.583 -15.099 1.00 C +ATOM 1328 C GLU 129 -15.304 -12.248 -13.678 1.00 C +ATOM 1329 O GLU 129 -14.703 -11.257 -13.277 1.00 O +ATOM 1330 H GLU 129 -17.393 -12.625 -15.337 1.00 H +ATOM 1331 CB GLU 129 -15.245 -11.407 -16.070 1.00 C +ATOM 1332 CD GLU 129 -14.320 -12.713 -18.024 1.00 C +ATOM 1333 CG GLU 129 -15.416 -11.789 -17.532 1.00 C +ATOM 1334 OE1 GLU 129 -13.159 -12.537 -17.600 1.00 O +ATOM 1335 OE2 GLU 129 -14.623 -13.614 -18.834 1.00 O +ATOM 1336 N PHE 130 -15.759 -13.216 -12.852 1.00 N +ATOM 1337 CA PHE 130 -15.834 -13.147 -11.440 1.00 C +ATOM 1338 C PHE 130 -14.440 -13.562 -11.045 1.00 C +ATOM 1339 O PHE 130 -14.159 -14.032 -9.947 1.00 O +ATOM 1340 H PHE 130 -16.031 -13.959 -13.281 1.00 H +ATOM 1341 CB PHE 130 -16.952 -14.052 -10.918 1.00 C +ATOM 1342 CG PHE 130 -17.127 -14.001 -9.427 1.00 C +ATOM 1343 CZ PHE 130 -17.450 -13.912 -6.668 1.00 C +ATOM 1344 CD1 PHE 130 -17.316 -12.792 -8.779 1.00 C +ATOM 1345 CE1 PHE 130 -17.477 -12.745 -7.407 1.00 C +ATOM 1346 CD2 PHE 130 -17.102 -15.160 -8.673 1.00 C +ATOM 1347 CE2 PHE 130 -17.263 -15.113 -7.301 1.00 C +ATOM 1348 N VAL 131 -13.492 -13.214 -11.931 1.00 N +ATOM 1349 CA VAL 131 -12.149 -13.545 -11.864 1.00 C +ATOM 1350 C VAL 131 -11.318 -12.318 -12.172 1.00 C +ATOM 1351 O VAL 131 -11.725 -11.338 -12.795 1.00 O +ATOM 1352 H VAL 131 -13.800 -12.720 -12.617 1.00 H +ATOM 1353 CB VAL 131 -11.803 -14.696 -12.826 1.00 C +ATOM 1354 CG1 VAL 131 -12.588 -15.947 -12.465 1.00 C +ATOM 1355 CG2 VAL 131 -12.077 -14.288 -14.266 1.00 C +ATOM 1356 N THR 132 -10.065 -12.499 -11.771 1.00 N +ATOM 1357 CA THR 132 -8.846 -11.848 -11.502 1.00 C +ATOM 1358 C THR 132 -8.368 -10.554 -12.002 1.00 C +ATOM 1359 O THR 132 -9.050 -9.571 -11.851 1.00 O +ATOM 1360 H THR 132 -10.133 -13.390 -11.661 1.00 H +ATOM 1361 CB THR 132 -7.641 -12.723 -11.894 1.00 C +ATOM 1362 HG1 THR 132 -7.625 -13.762 -10.328 1.00 H +ATOM 1363 OG1 THR 132 -7.664 -13.940 -11.138 1.00 O +ATOM 1364 CG2 THR 132 -6.337 -11.995 -11.603 1.00 C +ATOM 1365 N GLY 133 -7.126 -10.485 -12.523 1.00 N +ATOM 1366 CA GLY 133 -6.488 -9.199 -12.534 1.00 C +ATOM 1367 C GLY 133 -5.941 -9.222 -11.137 1.00 C +ATOM 1368 O GLY 133 -4.922 -9.872 -10.916 1.00 O +ATOM 1369 H GLY 133 -6.697 -11.203 -12.855 1.00 H +ATOM 1370 N GLY 134 -6.606 -8.573 -10.149 1.00 N +ATOM 1371 CA GLY 134 -6.087 -8.624 -8.805 1.00 C +ATOM 1372 C GLY 134 -7.099 -9.076 -7.807 1.00 C +ATOM 1373 O GLY 134 -8.296 -8.944 -8.021 1.00 O +ATOM 1374 H GLY 134 -7.361 -8.115 -10.323 1.00 H +ATOM 1375 N TRP 135 -6.585 -9.518 -6.636 1.00 N +ATOM 1376 CA TRP 135 -7.248 -10.128 -5.498 1.00 C +ATOM 1377 C TRP 135 -8.230 -9.177 -4.914 1.00 C +ATOM 1378 O TRP 135 -9.343 -9.594 -4.608 1.00 O +ATOM 1379 H TRP 135 -5.695 -9.387 -6.621 1.00 H +ATOM 1380 CB TRP 135 -6.222 -10.559 -4.448 1.00 C +ATOM 1381 1HB TRP 135 -5.910 -9.759 -3.871 1.00 H +ATOM 1382 2HB TRP 135 -5.649 -11.341 -4.695 1.00 H +ATOM 1383 CG TRP 135 -6.832 -11.219 -3.249 1.00 C +ATOM 1384 CD1 TRP 135 -7.111 -12.546 -3.097 1.00 C +ATOM 1385 HE1 TRP 135 -7.937 -13.614 -1.540 1.00 H +ATOM 1386 NE1 TRP 135 -7.666 -12.776 -1.862 1.00 N +ATOM 1387 CD2 TRP 135 -7.239 -10.581 -2.032 1.00 C +ATOM 1388 CE2 TRP 135 -7.754 -11.582 -1.190 1.00 C +ATOM 1389 CH2 TRP 135 -8.211 -10.007 0.508 1.00 C +ATOM 1390 CZ2 TRP 135 -8.245 -11.306 0.085 1.00 C +ATOM 1391 CE3 TRP 135 -7.217 -9.260 -1.574 1.00 C +ATOM 1392 CZ3 TRP 135 -7.704 -8.991 -0.309 1.00 C +ATOM 1393 N VAL 136 -7.860 -7.889 -4.769 1.00 N +ATOM 1394 CA VAL 136 -8.735 -6.879 -4.212 1.00 C +ATOM 1395 C VAL 136 -8.355 -5.626 -4.906 1.00 C +ATOM 1396 O VAL 136 -7.313 -5.611 -5.560 1.00 O +ATOM 1397 H VAL 136 -7.030 -7.667 -5.036 1.00 H +ATOM 1398 CB VAL 136 -8.593 -6.792 -2.681 1.00 C +ATOM 1399 CG1 VAL 136 -7.190 -6.345 -2.300 1.00 C +ATOM 1400 CG2 VAL 136 -9.633 -5.844 -2.103 1.00 C +ATOM 1401 N MET 137 -9.193 -4.559 -4.808 1.00 N +ATOM 1402 CA MET 137 -8.849 -3.292 -5.425 1.00 C +ATOM 1403 C MET 137 -8.333 -2.365 -4.334 1.00 C +ATOM 1404 O MET 137 -9.097 -1.894 -3.493 1.00 O +ATOM 1405 H MET 137 -9.966 -4.644 -4.356 1.00 H +ATOM 1406 CB MET 137 -10.062 -2.700 -6.146 1.00 C +ATOM 1407 SD MET 137 -11.234 -0.724 -7.693 1.00 S +ATOM 1408 CE MET 137 -12.207 -0.186 -6.289 1.00 C +ATOM 1409 CG MET 137 -9.779 -1.391 -6.865 1.00 C +ATOM 1410 N PRO 138 -7.032 -2.129 -4.319 1.00 N +ATOM 1411 CA PRO 138 -6.411 -1.283 -3.325 1.00 C +ATOM 1412 C PRO 138 -6.039 0.112 -3.690 1.00 C +ATOM 1413 O PRO 138 -5.850 0.412 -4.865 1.00 O +ATOM 1414 CB PRO 138 -5.128 -2.029 -2.953 1.00 C +ATOM 1415 CD PRO 138 -5.977 -3.137 -4.897 1.00 C +ATOM 1416 CG PRO 138 -4.709 -2.705 -4.215 1.00 C +ATOM 1417 N ASP 139 -5.755 0.899 -2.634 1.00 N +ATOM 1418 CA ASP 139 -5.489 2.312 -2.613 1.00 C +ATOM 1419 C ASP 139 -4.204 2.700 -3.325 1.00 C +ATOM 1420 O ASP 139 -4.033 3.851 -3.736 1.00 O +ATOM 1421 H ASP 139 -5.743 0.427 -1.868 1.00 H +ATOM 1422 CB ASP 139 -5.426 2.824 -1.173 1.00 C +ATOM 1423 CG ASP 139 -5.412 4.338 -1.093 1.00 C +ATOM 1424 OD1 ASP 139 -6.504 4.944 -1.110 1.00 O +ATOM 1425 OD2 ASP 139 -4.309 4.918 -1.013 1.00 O +ATOM 1426 N GLU 140 -3.220 1.787 -3.423 1.00 N +ATOM 1427 CA GLU 140 -2.003 2.078 -4.129 1.00 C +ATOM 1428 C GLU 140 -1.040 2.751 -3.171 1.00 C +ATOM 1429 O GLU 140 -0.185 2.094 -2.574 1.00 O +ATOM 1430 H GLU 140 -3.335 0.982 -3.036 1.00 H +ATOM 1431 CB GLU 140 -2.288 2.958 -5.347 1.00 C +ATOM 1432 CD GLU 140 -2.374 1.111 -7.068 1.00 C +ATOM 1433 CG GLU 140 -3.107 2.274 -6.430 1.00 C +ATOM 1434 OE1 GLU 140 -1.209 1.296 -7.477 1.00 O +ATOM 1435 OE2 GLU 140 -2.965 0.014 -7.158 1.00 O +ATOM 1436 N ALA 141 -1.140 4.089 -3.001 1.00 N +ATOM 1437 CA ALA 141 -0.211 4.796 -2.160 1.00 C +ATOM 1438 C ALA 141 -0.297 4.442 -0.696 1.00 C +ATOM 1439 O ALA 141 0.716 4.483 -0.013 1.00 O +ATOM 1440 H ALA 141 -1.797 4.537 -3.421 1.00 H +ATOM 1441 CB ALA 141 -0.406 6.298 -2.300 1.00 C +ATOM 1442 N ASN 142 -1.486 4.135 -0.152 1.00 N +ATOM 1443 CA ASN 142 -1.724 3.807 1.240 1.00 C +ATOM 1444 C ASN 142 -1.251 2.444 1.617 1.00 C +ATOM 1445 O ASN 142 -1.173 2.154 2.810 1.00 O +ATOM 1446 H ASN 142 -2.171 4.144 -0.736 1.00 H +ATOM 1447 CB ASN 142 -3.211 3.938 1.575 1.00 C +ATOM 1448 CG ASN 142 -3.480 3.878 3.065 1.00 C +ATOM 1449 OD1 ASN 142 -2.679 4.352 3.870 1.00 O +ATOM 1450 1HD2 ASN 142 -4.821 3.230 4.311 1.00 H +ATOM 1451 2HD2 ASN 142 -5.172 2.958 2.817 1.00 H +ATOM 1452 ND2 ASN 142 -4.613 3.293 3.438 1.00 N +ATOM 1453 N SER 143 -1.057 1.549 0.625 1.00 N +ATOM 1454 CA SER 143 -0.594 0.195 0.849 1.00 C +ATOM 1455 C SER 143 0.812 0.151 0.325 1.00 C +ATOM 1456 O SER 143 1.118 0.796 -0.682 1.00 O +ATOM 1457 H SER 143 -1.231 1.832 -0.211 1.00 H +ATOM 1458 CB SER 143 -1.518 -0.809 0.157 1.00 C +ATOM 1459 HG SER 143 -1.541 -2.656 -0.095 1.00 H +ATOM 1460 OG SER 143 -1.024 -2.131 0.287 1.00 O +ATOM 1461 N HIS 144 1.667 -0.632 1.033 1.00 N +ATOM 1462 CA HIS 144 3.085 -0.862 0.863 1.00 C +ATOM 1463 C HIS 144 3.368 -1.518 -0.436 1.00 C +ATOM 1464 O HIS 144 2.575 -2.324 -0.922 1.00 O +ATOM 1465 H HIS 144 1.221 -1.045 1.697 1.00 H +ATOM 1466 CB HIS 144 3.631 -1.713 2.011 1.00 C +ATOM 1467 CG HIS 144 5.124 -1.829 2.020 1.00 C +ATOM 1468 HD1 HIS 144 5.420 -3.273 0.578 1.00 H +ATOM 1469 ND1 HIS 144 5.808 -2.697 1.196 1.00 N +ATOM 1470 CE1 HIS 144 7.126 -2.576 1.432 1.00 C +ATOM 1471 CD2 HIS 144 6.210 -1.197 2.755 1.00 C +ATOM 1472 NE2 HIS 144 7.375 -1.678 2.365 1.00 N +ATOM 1473 N TRP 145 4.572 -1.221 -0.984 1.00 N +ATOM 1474 CA TRP 145 4.912 -1.713 -2.262 1.00 C +ATOM 1475 C TRP 145 4.903 -3.204 -2.306 1.00 C +ATOM 1476 O TRP 145 4.491 -3.835 -3.283 1.00 O +ATOM 1477 H TRP 145 5.155 -0.708 -0.529 1.00 H +ATOM 1478 CB TRP 145 6.287 -1.195 -2.687 1.00 C +ATOM 1479 1HB TRP 145 7.050 -1.737 -2.246 1.00 H +ATOM 1480 2HB TRP 145 6.336 -0.221 -2.910 1.00 H +ATOM 1481 CG TRP 145 6.709 -1.659 -4.048 1.00 C +ATOM 1482 CD1 TRP 145 7.782 -2.448 -4.348 1.00 C +ATOM 1483 HE1 TRP 145 8.502 -3.174 -6.137 1.00 H +ATOM 1484 NE1 TRP 145 7.847 -2.662 -5.704 1.00 N +ATOM 1485 CD2 TRP 145 6.065 -1.363 -5.293 1.00 C +ATOM 1486 CE2 TRP 145 6.802 -2.005 -6.305 1.00 C +ATOM 1487 CH2 TRP 145 5.343 -1.191 -7.973 1.00 C +ATOM 1488 CZ2 TRP 145 6.449 -1.926 -7.651 1.00 C +ATOM 1489 CE3 TRP 145 4.938 -0.618 -5.651 1.00 C +ATOM 1490 CZ3 TRP 145 4.592 -0.542 -6.987 1.00 C +ATOM 1491 N ARG 146 5.318 -3.864 -1.232 1.00 N +ATOM 1492 CA ARG 146 5.134 -5.269 -1.409 1.00 C +ATOM 1493 C ARG 146 3.692 -5.698 -1.303 1.00 C +ATOM 1494 O ARG 146 3.372 -6.775 -1.795 1.00 O +ATOM 1495 H ARG 146 5.673 -3.550 -0.467 1.00 H +ATOM 1496 CB ARG 146 5.961 -6.051 -0.386 1.00 C +ATOM 1497 CD ARG 146 6.396 -8.046 -1.845 1.00 C +ATOM 1498 HE ARG 146 6.131 -9.946 -1.259 1.00 H +ATOM 1499 NE ARG 146 6.323 -9.500 -1.970 1.00 N +ATOM 1500 CG ARG 146 5.842 -7.561 -0.516 1.00 C +ATOM 1501 CZ ARG 146 6.534 -10.164 -3.102 1.00 C +ATOM 1502 1HH1 ARG 146 6.253 -11.915 -2.400 1.00 H +ATOM 1503 2HH1 ARG 146 6.583 -11.917 -3.853 1.00 H +ATOM 1504 NH1 ARG 146 6.446 -11.487 -3.120 1.00 N +ATOM 1505 1HH2 ARG 146 6.888 -8.645 -4.200 1.00 H +ATOM 1506 2HH2 ARG 146 6.968 -9.933 -4.945 1.00 H +ATOM 1507 NH2 ARG 146 6.832 -9.503 -4.212 1.00 N +ATOM 1508 N ASN 147 2.786 -4.952 -0.621 1.00 N +ATOM 1509 CA ASN 147 1.403 -5.388 -0.592 1.00 C +ATOM 1510 C ASN 147 0.804 -5.309 -1.942 1.00 C +ATOM 1511 O ASN 147 0.021 -6.188 -2.291 1.00 O +ATOM 1512 H ASN 147 3.030 -4.199 -0.192 1.00 H +ATOM 1513 CB ASN 147 0.600 -4.557 0.411 1.00 C +ATOM 1514 CG ASN 147 -0.809 -5.082 0.607 1.00 C +ATOM 1515 OD1 ASN 147 -1.724 -4.720 -0.132 1.00 O +ATOM 1516 1HD2 ASN 147 -1.803 -6.281 1.766 1.00 H +ATOM 1517 2HD2 ASN 147 -0.289 -6.178 2.123 1.00 H +ATOM 1518 ND2 ASN 147 -0.986 -5.939 1.606 1.00 N +ATOM 1519 N VAL 148 1.159 -4.274 -2.733 1.00 N +ATOM 1520 CA VAL 148 0.590 -4.131 -4.043 1.00 C +ATOM 1521 C VAL 148 0.925 -5.380 -4.798 1.00 C +ATOM 1522 O VAL 148 0.044 -5.996 -5.392 1.00 O +ATOM 1523 H VAL 148 1.757 -3.671 -2.434 1.00 H +ATOM 1524 CB VAL 148 1.113 -2.867 -4.751 1.00 C +ATOM 1525 CG1 VAL 148 0.670 -2.850 -6.206 1.00 C +ATOM 1526 CG2 VAL 148 0.635 -1.616 -4.029 1.00 C +ATOM 1527 N LEU 149 2.197 -5.825 -4.736 1.00 N +ATOM 1528 CA LEU 149 2.654 -6.966 -5.478 1.00 C +ATOM 1529 C LEU 149 1.988 -8.204 -4.962 1.00 C +ATOM 1530 O LEU 149 1.622 -9.083 -5.733 1.00 O +ATOM 1531 H LEU 149 2.767 -5.377 -4.203 1.00 H +ATOM 1532 CB LEU 149 4.176 -7.089 -5.388 1.00 C +ATOM 1533 CG LEU 149 4.988 -6.002 -6.096 1.00 C +ATOM 1534 CD1 LEU 149 6.469 -6.146 -5.782 1.00 C +ATOM 1535 CD2 LEU 149 4.758 -6.053 -7.598 1.00 C +ATOM 1536 N LEU 150 1.784 -8.306 -3.641 1.00 N +ATOM 1537 CA LEU 150 1.137 -9.447 -3.069 1.00 C +ATOM 1538 C LEU 150 -0.274 -9.545 -3.549 1.00 C +ATOM 1539 O LEU 150 -0.758 -10.663 -3.710 1.00 O +ATOM 1540 H LEU 150 2.065 -7.635 -3.111 1.00 H +ATOM 1541 CB LEU 150 1.176 -9.375 -1.541 1.00 C +ATOM 1542 CG LEU 150 2.550 -9.550 -0.890 1.00 C +ATOM 1543 CD1 LEU 150 2.474 -9.278 0.605 1.00 C +ATOM 1544 CD2 LEU 150 3.092 -10.948 -1.145 1.00 C +ATOM 1545 N GLN 151 -0.982 -8.405 -3.749 1.00 N +ATOM 1546 CA GLN 151 -2.359 -8.481 -4.163 1.00 C +ATOM 1547 C GLN 151 -2.388 -9.141 -5.490 1.00 C +ATOM 1548 O GLN 151 -3.217 -10.017 -5.705 1.00 O +ATOM 1549 H GLN 151 -0.593 -7.603 -3.624 1.00 H +ATOM 1550 CB GLN 151 -2.985 -7.085 -4.202 1.00 C +ATOM 1551 CD GLN 151 -4.122 -7.193 -1.949 1.00 C +ATOM 1552 CG GLN 151 -3.149 -6.440 -2.836 1.00 C +ATOM 1553 OE1 GLN 151 -4.666 -8.224 -2.345 1.00 O +ATOM 1554 1HE2 GLN 151 -4.911 -7.087 -0.179 1.00 H +ATOM 1555 2HE2 GLN 151 -3.924 -5.923 -0.495 1.00 H +ATOM 1556 NE2 GLN 151 -4.343 -6.679 -0.745 1.00 N +ATOM 1557 N LEU 152 -1.441 -8.786 -6.381 1.00 N +ATOM 1558 CA LEU 152 -1.383 -9.353 -7.708 1.00 C +ATOM 1559 C LEU 152 -1.097 -10.809 -7.603 1.00 C +ATOM 1560 O LEU 152 -1.757 -11.581 -8.291 1.00 O +ATOM 1561 H LEU 152 -0.832 -8.174 -6.126 1.00 H +ATOM 1562 CB LEU 152 -0.322 -8.641 -8.549 1.00 C +ATOM 1563 CG LEU 152 -0.626 -7.193 -8.940 1.00 C +ATOM 1564 CD1 LEU 152 0.580 -6.553 -9.612 1.00 C +ATOM 1565 CD2 LEU 152 -1.838 -7.127 -9.856 1.00 C +ATOM 1566 N THR 153 -0.139 -11.223 -6.734 1.00 N +ATOM 1567 CA THR 153 0.247 -12.612 -6.678 1.00 C +ATOM 1568 C THR 153 -0.945 -13.422 -6.276 1.00 C +ATOM 1569 O THR 153 -1.240 -14.421 -6.925 1.00 O +ATOM 1570 H THR 153 0.256 -10.624 -6.191 1.00 H +ATOM 1571 CB THR 153 1.414 -12.834 -5.698 1.00 C +ATOM 1572 HG1 THR 153 2.381 -11.297 -6.180 1.00 H +ATOM 1573 OG1 THR 153 2.564 -12.106 -6.146 1.00 O +ATOM 1574 CG2 THR 153 1.773 -14.311 -5.623 1.00 C +ATOM 1575 N GLU 154 -1.692 -12.993 -5.235 1.00 N +ATOM 1576 CA GLU 154 -2.827 -13.743 -4.760 1.00 C +ATOM 1577 C GLU 154 -3.870 -13.785 -5.832 1.00 C +ATOM 1578 O GLU 154 -4.502 -14.818 -6.026 1.00 O +ATOM 1579 H GLU 154 -1.466 -12.218 -4.836 1.00 H +ATOM 1580 CB GLU 154 -3.380 -13.122 -3.476 1.00 C +ATOM 1581 CD GLU 154 -3.020 -12.600 -1.031 1.00 C +ATOM 1582 CG GLU 154 -2.477 -13.293 -2.265 1.00 C +ATOM 1583 OE1 GLU 154 -3.996 -11.831 -1.162 1.00 O +ATOM 1584 OE2 GLU 154 -2.470 -12.825 0.068 1.00 O +ATOM 1585 N GLY 155 -4.092 -12.669 -6.555 1.00 N +ATOM 1586 CA GLY 155 -5.104 -12.636 -7.567 1.00 C +ATOM 1587 C GLY 155 -4.777 -13.613 -8.645 1.00 C +ATOM 1588 O GLY 155 -5.668 -14.290 -9.147 1.00 O +ATOM 1589 H GLY 155 -3.593 -11.938 -6.394 1.00 H +ATOM 1590 N GLN 156 -3.495 -13.693 -9.043 1.00 N +ATOM 1591 CA GLN 156 -3.068 -14.587 -10.084 1.00 C +ATOM 1592 C GLN 156 -3.293 -15.988 -9.636 1.00 C +ATOM 1593 O GLN 156 -3.793 -16.791 -10.416 1.00 O +ATOM 1594 H GLN 156 -2.896 -13.161 -8.633 1.00 H +ATOM 1595 CB GLN 156 -1.598 -14.343 -10.430 1.00 C +ATOM 1596 CD GLN 156 -1.994 -12.889 -12.456 1.00 C +ATOM 1597 CG GLN 156 -1.331 -13.004 -11.098 1.00 C +ATOM 1598 OE1 GLN 156 -1.796 -13.734 -13.329 1.00 O +ATOM 1599 1HE2 GLN 156 -3.205 -11.723 -13.427 1.00 H +ATOM 1600 2HE2 GLN 156 -2.905 -11.244 -11.975 1.00 H +ATOM 1601 NE2 GLN 156 -2.787 -11.839 -12.639 1.00 N +ATOM 1602 N THR 157 -2.961 -16.307 -8.364 1.00 N +ATOM 1603 CA THR 157 -3.066 -17.659 -7.889 1.00 C +ATOM 1604 C THR 157 -4.507 -18.073 -7.949 1.00 C +ATOM 1605 O THR 157 -4.818 -19.167 -8.416 1.00 O +ATOM 1606 H THR 157 -2.671 -15.658 -7.813 1.00 H +ATOM 1607 CB THR 157 -2.515 -17.799 -6.458 1.00 C +ATOM 1608 HG1 THR 157 -1.029 -16.675 -6.700 1.00 H +ATOM 1609 OG1 THR 157 -1.123 -17.458 -6.443 1.00 O +ATOM 1610 CG2 THR 157 -2.671 -19.229 -5.964 1.00 C +ATOM 1611 N TRP 158 -5.433 -17.194 -7.517 1.00 N +ATOM 1612 CA TRP 158 -6.829 -17.523 -7.519 1.00 C +ATOM 1613 C TRP 158 -7.345 -17.732 -8.909 1.00 C +ATOM 1614 O TRP 158 -8.150 -18.624 -9.163 1.00 O +ATOM 1615 H TRP 158 -5.161 -16.388 -7.224 1.00 H +ATOM 1616 CB TRP 158 -7.639 -16.426 -6.825 1.00 C +ATOM 1617 1HB TRP 158 -8.636 -16.689 -6.738 1.00 H +ATOM 1618 2HB TRP 158 -7.305 -15.492 -6.952 1.00 H +ATOM 1619 CG TRP 158 -7.484 -16.418 -5.335 1.00 C +ATOM 1620 CD1 TRP 158 -6.897 -15.445 -4.578 1.00 C +ATOM 1621 HE1 TRP 158 -6.600 -15.270 -2.546 1.00 H +ATOM 1622 NE1 TRP 158 -6.942 -15.788 -3.248 1.00 N +ATOM 1623 CD2 TRP 158 -7.922 -17.430 -4.421 1.00 C +ATOM 1624 CE2 TRP 158 -7.568 -17.004 -3.128 1.00 C +ATOM 1625 CH2 TRP 158 -8.492 -18.952 -2.164 1.00 C +ATOM 1626 CZ2 TRP 158 -7.848 -17.758 -1.990 1.00 C +ATOM 1627 CE3 TRP 158 -8.579 -18.655 -4.570 1.00 C +ATOM 1628 CZ3 TRP 158 -8.855 -19.399 -3.439 1.00 C +ATOM 1629 N LEU 159 -6.858 -16.928 -9.853 1.00 N +ATOM 1630 CA LEU 159 -7.180 -16.974 -11.239 1.00 C +ATOM 1631 C LEU 159 -6.820 -18.322 -11.779 1.00 C +ATOM 1632 O LEU 159 -7.594 -18.906 -12.532 1.00 O +ATOM 1633 H LEU 159 -6.276 -16.314 -9.546 1.00 H +ATOM 1634 CB LEU 159 -6.451 -15.862 -11.996 1.00 C +ATOM 1635 CG LEU 159 -6.843 -15.670 -13.462 1.00 C +ATOM 1636 CD1 LEU 159 -6.427 -14.292 -13.953 1.00 C +ATOM 1637 CD2 LEU 159 -6.221 -16.751 -14.332 1.00 C +ATOM 1638 N LYS 160 -5.613 -18.810 -11.435 1.00 N +ATOM 1639 CA LYS 160 -5.055 -20.057 -11.887 1.00 C +ATOM 1640 C LYS 160 -5.837 -21.196 -11.331 1.00 C +ATOM 1641 O LYS 160 -5.930 -22.253 -11.951 1.00 O +ATOM 1642 H LYS 160 -5.145 -18.285 -10.874 1.00 H +ATOM 1643 CB LYS 160 -3.583 -20.163 -11.483 1.00 C +ATOM 1644 CD LYS 160 -1.220 -19.374 -11.783 1.00 C +ATOM 1645 CE LYS 160 -0.297 -18.437 -12.547 1.00 C +ATOM 1646 CG LYS 160 -2.664 -19.211 -12.230 1.00 C +ATOM 1647 1HZ LYS 160 1.624 -17.989 -12.551 1.00 H +ATOM 1648 2HZ LYS 160 1.401 -19.383 -12.206 1.00 H +ATOM 1649 3HZ LYS 160 1.160 -18.343 -11.220 1.00 H +ATOM 1650 NZ LYS 160 1.114 -18.549 -12.084 1.00 N +ATOM 1651 N GLN 161 -6.419 -21.002 -10.138 1.00 N +ATOM 1652 CA GLN 161 -7.019 -22.090 -9.423 1.00 C +ATOM 1653 C GLN 161 -8.435 -22.322 -9.757 1.00 C +ATOM 1654 O GLN 161 -8.778 -22.822 -10.826 1.00 O +ATOM 1655 H GLN 161 -6.429 -20.173 -9.787 1.00 H +ATOM 1656 CB GLN 161 -6.909 -21.865 -7.914 1.00 C +ATOM 1657 CD GLN 161 -5.411 -21.653 -5.891 1.00 C +ATOM 1658 CG GLN 161 -5.488 -21.938 -7.378 1.00 C +ATOM 1659 OE1 GLN 161 -6.237 -20.921 -5.346 1.00 O +ATOM 1660 1HE2 GLN 161 -4.325 -22.097 -4.344 1.00 H +ATOM 1661 2HE2 GLN 161 -3.833 -22.761 -5.665 1.00 H +ATOM 1662 NE2 GLN 161 -4.416 -22.233 -5.229 1.00 N +ATOM 1663 N PHE 162 -9.285 -21.912 -8.807 1.00 N +ATOM 1664 CA PHE 162 -10.621 -22.377 -8.725 1.00 C +ATOM 1665 C PHE 162 -11.422 -22.310 -9.935 1.00 C +ATOM 1666 O PHE 162 -11.846 -23.333 -10.457 1.00 O +ATOM 1667 H PHE 162 -8.978 -21.317 -8.205 1.00 H +ATOM 1668 CB PHE 162 -11.389 -21.612 -7.645 1.00 C +ATOM 1669 CG PHE 162 -11.016 -22.003 -6.244 1.00 C +ATOM 1670 CZ PHE 162 -10.328 -22.721 -3.648 1.00 C +ATOM 1671 CD1 PHE 162 -10.315 -23.171 -5.999 1.00 C +ATOM 1672 CE1 PHE 162 -9.972 -23.531 -4.710 1.00 C +ATOM 1673 CD2 PHE 162 -11.366 -21.203 -5.171 1.00 C +ATOM 1674 CE2 PHE 162 -11.022 -21.563 -3.881 1.00 C +ATOM 1675 N MET 163 -11.629 -21.123 -10.445 1.00 N +ATOM 1676 CA MET 163 -12.521 -21.015 -11.554 1.00 C +ATOM 1677 C MET 163 -11.986 -21.663 -12.791 1.00 C +ATOM 1678 O MET 163 -12.761 -22.198 -13.574 1.00 O +ATOM 1679 H MET 163 -11.228 -20.387 -10.117 1.00 H +ATOM 1680 CB MET 163 -12.833 -19.547 -11.850 1.00 C +ATOM 1681 SD MET 163 -15.205 -19.601 -10.419 1.00 S +ATOM 1682 CE MET 163 -14.809 -20.635 -9.011 1.00 C +ATOM 1683 CG MET 163 -13.603 -18.841 -10.745 1.00 C +ATOM 1684 N ASN 164 -10.658 -21.649 -12.993 1.00 N +ATOM 1685 CA ASN 164 -10.007 -22.120 -14.193 1.00 C +ATOM 1686 C ASN 164 -9.906 -21.031 -15.235 1.00 C +ATOM 1687 O ASN 164 -9.327 -21.271 -16.290 1.00 O +ATOM 1688 H ASN 164 -10.167 -21.317 -12.315 1.00 H +ATOM 1689 CB ASN 164 -10.745 -23.334 -14.762 1.00 C +ATOM 1690 CG ASN 164 -10.729 -24.520 -13.817 1.00 C +ATOM 1691 OD1 ASN 164 -9.679 -24.900 -13.300 1.00 O +ATOM 1692 1HD2 ASN 164 -11.945 -25.817 -13.037 1.00 H +ATOM 1693 2HD2 ASN 164 -12.643 -24.799 -13.988 1.00 H +ATOM 1694 ND2 ASN 164 -11.898 -25.109 -13.590 1.00 N +ATOM 1695 N VAL 165 -10.384 -19.785 -14.997 1.00 N +ATOM 1696 CA VAL 165 -10.083 -18.818 -16.031 1.00 C +ATOM 1697 C VAL 165 -9.850 -17.453 -15.465 1.00 C +ATOM 1698 O VAL 165 -10.183 -17.199 -14.313 1.00 O +ATOM 1699 H VAL 165 -10.854 -19.536 -14.271 1.00 H +ATOM 1700 CB VAL 165 -11.205 -18.750 -17.084 1.00 C +ATOM 1701 CG1 VAL 165 -10.888 -17.695 -18.133 1.00 C +ATOM 1702 CG2 VAL 165 -11.408 -20.109 -17.735 1.00 C +ATOM 1703 N THR 166 -9.230 -16.560 -16.279 1.00 N +ATOM 1704 CA THR 166 -8.856 -15.206 -15.920 1.00 C +ATOM 1705 C THR 166 -9.357 -14.211 -16.936 1.00 C +ATOM 1706 O THR 166 -9.827 -14.576 -18.014 1.00 O +ATOM 1707 H THR 166 -9.052 -16.872 -17.104 1.00 H +ATOM 1708 CB THR 166 -7.329 -15.061 -15.777 1.00 C +ATOM 1709 HG1 THR 166 -7.300 -13.182 -15.799 1.00 H +ATOM 1710 OG1 THR 166 -7.016 -13.757 -15.272 1.00 O +ATOM 1711 CG2 THR 166 -6.649 -15.237 -17.126 1.00 C +ATOM 1712 N PRO 167 -9.370 -12.942 -16.548 1.00 N +ATOM 1713 CA PRO 167 -9.370 -11.883 -17.540 1.00 C +ATOM 1714 C PRO 167 -7.998 -11.311 -17.710 1.00 C +ATOM 1715 O PRO 167 -7.249 -11.317 -16.734 1.00 O +ATOM 1716 CB PRO 167 -10.346 -10.848 -16.977 1.00 C +ATOM 1717 CD PRO 167 -9.988 -12.443 -15.228 1.00 C +ATOM 1718 CG PRO 167 -10.219 -10.982 -15.496 1.00 C +ATOM 1719 N THR 168 -7.670 -10.738 -18.892 1.00 N +ATOM 1720 CA THR 168 -6.338 -10.207 -19.062 1.00 C +ATOM 1721 C THR 168 -6.379 -8.714 -18.933 1.00 C +ATOM 1722 O THR 168 -5.873 -7.984 -19.785 1.00 O +ATOM 1723 H THR 168 -8.265 -10.685 -19.565 1.00 H +ATOM 1724 CB THR 168 -5.739 -10.611 -20.422 1.00 C +ATOM 1725 HG1 THR 168 -7.349 -10.529 -21.387 1.00 H +ATOM 1726 OG1 THR 168 -6.604 -10.174 -21.477 1.00 O +ATOM 1727 CG2 THR 168 -5.588 -12.122 -20.510 1.00 C +ATOM 1728 N ALA 169 -6.943 -8.208 -17.826 1.00 N +ATOM 1729 CA ALA 169 -6.937 -6.790 -17.615 1.00 C +ATOM 1730 C ALA 169 -6.443 -6.576 -16.221 1.00 C +ATOM 1731 O ALA 169 -6.399 -7.501 -15.409 1.00 O +ATOM 1732 H ALA 169 -7.323 -8.752 -17.218 1.00 H +ATOM 1733 CB ALA 169 -8.327 -6.215 -17.840 1.00 C +ATOM 1734 N SER 170 -5.964 -5.348 -15.960 1.00 N +ATOM 1735 CA SER 170 -5.564 -4.891 -14.664 1.00 C +ATOM 1736 C SER 170 -6.664 -3.941 -14.359 1.00 C +ATOM 1737 O SER 170 -6.933 -3.012 -15.124 1.00 O +ATOM 1738 H SER 170 -5.902 -4.798 -16.670 1.00 H +ATOM 1739 CB SER 170 -4.162 -4.280 -14.720 1.00 C +ATOM 1740 HG SER 170 -3.030 -3.412 -13.519 1.00 H +ATOM 1741 OG SER 170 -3.792 -3.737 -13.465 1.00 O +ATOM 1742 N TRP 171 -7.347 -4.178 -13.232 1.00 N +ATOM 1743 CA TRP 171 -8.470 -3.376 -12.869 1.00 C +ATOM 1744 C TRP 171 -8.131 -2.401 -11.806 1.00 C +ATOM 1745 O TRP 171 -7.390 -2.668 -10.866 1.00 O +ATOM 1746 H TRP 171 -7.087 -4.856 -12.700 1.00 H +ATOM 1747 CB TRP 171 -9.632 -4.258 -12.407 1.00 C +ATOM 1748 1HB TRP 171 -9.510 -4.563 -11.426 1.00 H +ATOM 1749 2HB TRP 171 -10.077 -4.799 -13.121 1.00 H +ATOM 1750 CG TRP 171 -10.863 -3.486 -12.042 1.00 C +ATOM 1751 CD1 TRP 171 -11.276 -2.302 -12.579 1.00 C +ATOM 1752 HE1 TRP 171 -12.919 -1.115 -12.203 1.00 H +ATOM 1753 NE1 TRP 171 -12.452 -1.899 -11.992 1.00 N +ATOM 1754 CD2 TRP 171 -11.841 -3.846 -11.059 1.00 C +ATOM 1755 CE2 TRP 171 -12.818 -2.834 -11.055 1.00 C +ATOM 1756 CH2 TRP 171 -14.041 -3.934 -9.361 1.00 C +ATOM 1757 CZ2 TRP 171 -13.924 -2.867 -10.208 1.00 C +ATOM 1758 CE3 TRP 171 -11.986 -4.925 -10.183 1.00 C +ATOM 1759 CZ3 TRP 171 -13.085 -4.955 -9.345 1.00 C +ATOM 1760 N ALA 172 -8.653 -1.188 -12.001 1.00 N +ATOM 1761 CA ALA 172 -8.688 -0.181 -10.993 1.00 C +ATOM 1762 C ALA 172 -9.880 0.590 -11.451 1.00 C +ATOM 1763 O ALA 172 -9.718 1.442 -12.305 1.00 O +ATOM 1764 H ALA 172 -8.994 -1.020 -12.817 1.00 H +ATOM 1765 CB ALA 172 -7.373 0.583 -10.960 1.00 C +ATOM 1766 N ILE 173 -11.130 0.290 -11.042 1.00 N +ATOM 1767 CA ILE 173 -12.093 1.205 -11.590 1.00 C +ATOM 1768 C ILE 173 -12.132 2.445 -10.740 1.00 C +ATOM 1769 O ILE 173 -12.037 3.551 -11.256 1.00 O +ATOM 1770 H ILE 173 -11.400 -0.376 -10.501 1.00 H +ATOM 1771 CB ILE 173 -13.489 0.562 -11.691 1.00 C +ATOM 1772 CD1 ILE 173 -13.961 1.534 -14.000 1.00 C +ATOM 1773 CG1 ILE 173 -14.410 1.421 -12.560 1.00 C +ATOM 1774 CG2 ILE 173 -14.070 0.331 -10.305 1.00 C +ATOM 1775 N ASP 174 -12.213 2.318 -9.394 1.00 N +ATOM 1776 CA ASP 174 -12.295 3.527 -8.611 1.00 C +ATOM 1777 C ASP 174 -11.080 3.737 -7.722 1.00 C +ATOM 1778 O ASP 174 -11.305 4.138 -6.580 1.00 O +ATOM 1779 H ASP 174 -12.217 1.516 -8.985 1.00 H +ATOM 1780 CB ASP 174 -13.556 3.520 -7.744 1.00 C +ATOM 1781 CG ASP 174 -14.828 3.588 -8.566 1.00 C +ATOM 1782 OD1 ASP 174 -14.847 4.328 -9.572 1.00 O +ATOM 1783 OD2 ASP 174 -15.806 2.901 -8.205 1.00 O +ATOM 1784 N PRO 175 -9.824 3.536 -8.070 1.00 N +ATOM 1785 CA PRO 175 -8.824 3.837 -7.085 1.00 C +ATOM 1786 C PRO 175 -8.604 5.312 -6.937 1.00 C +ATOM 1787 O PRO 175 -8.710 6.033 -7.927 1.00 O +ATOM 1788 CB PRO 175 -7.566 3.143 -7.611 1.00 C +ATOM 1789 CD PRO 175 -9.310 2.708 -9.191 1.00 C +ATOM 1790 CG PRO 175 -8.077 2.117 -8.566 1.00 C +ATOM 1791 N PHE 176 -8.253 5.782 -5.721 1.00 N +ATOM 1792 CA PHE 176 -8.064 7.187 -5.534 1.00 C +ATOM 1793 C PHE 176 -6.613 7.507 -5.798 1.00 C +ATOM 1794 O PHE 176 -5.904 7.948 -4.898 1.00 O +ATOM 1795 H PHE 176 -8.138 5.217 -5.030 1.00 H +ATOM 1796 CB PHE 176 -8.485 7.601 -4.123 1.00 C +ATOM 1797 CG PHE 176 -9.953 7.434 -3.854 1.00 C +ATOM 1798 CZ PHE 176 -12.670 7.127 -3.352 1.00 C +ATOM 1799 CD1 PHE 176 -10.782 6.851 -4.798 1.00 C +ATOM 1800 CE1 PHE 176 -12.133 6.697 -4.551 1.00 C +ATOM 1801 CD2 PHE 176 -10.506 7.859 -2.659 1.00 C +ATOM 1802 CE2 PHE 176 -11.857 7.704 -2.413 1.00 C +ATOM 1803 N GLY 177 -6.139 7.341 -7.048 1.00 N +ATOM 1804 CA GLY 177 -4.804 7.728 -7.430 1.00 C +ATOM 1805 C GLY 177 -3.997 6.498 -7.757 1.00 C +ATOM 1806 O GLY 177 -3.739 5.662 -6.893 1.00 O +ATOM 1807 H GLY 177 -6.692 6.972 -7.655 1.00 H +ATOM 1808 N HIS 178 -3.510 6.409 -9.018 1.00 N +ATOM 1809 CA HIS 178 -2.853 5.236 -9.527 1.00 C +ATOM 1810 C HIS 178 -1.363 5.360 -9.348 1.00 C +ATOM 1811 O HIS 178 -0.774 6.389 -9.670 1.00 O +ATOM 1812 H HIS 178 -3.614 7.131 -9.545 1.00 H +ATOM 1813 CB HIS 178 -3.203 5.023 -11.001 1.00 C +ATOM 1814 CG HIS 178 -4.647 4.707 -11.239 1.00 C +ATOM 1815 HD1 HIS 178 -4.935 3.140 -9.931 1.00 H +ATOM 1816 ND1 HIS 178 -5.310 3.700 -10.571 1.00 N +ATOM 1817 CE1 HIS 178 -6.585 3.659 -10.995 1.00 C +ATOM 1818 CD2 HIS 178 -5.698 5.237 -12.096 1.00 C +ATOM 1819 NE2 HIS 178 -6.825 4.578 -11.910 1.00 N +ATOM 1820 N SER 179 -0.673 4.295 -8.885 1.00 N +ATOM 1821 CA SER 179 0.735 4.496 -8.696 1.00 C +ATOM 1822 C SER 179 1.417 4.590 -10.040 1.00 C +ATOM 1823 O SER 179 1.060 3.920 -11.011 1.00 O +ATOM 1824 H SER 179 -1.043 3.496 -8.697 1.00 H +ATOM 1825 CB SER 179 1.331 3.362 -7.859 1.00 C +ATOM 1826 HG SER 179 -0.044 3.235 -6.606 1.00 H +ATOM 1827 OG SER 179 0.777 3.345 -6.555 1.00 O +ATOM 1828 N PRO 180 2.434 5.416 -10.097 1.00 N +ATOM 1829 CA PRO 180 3.189 5.650 -11.294 1.00 C +ATOM 1830 C PRO 180 3.712 4.382 -11.916 1.00 C +ATOM 1831 O PRO 180 3.858 4.322 -13.142 1.00 O +ATOM 1832 CB PRO 180 4.343 6.544 -10.835 1.00 C +ATOM 1833 CD PRO 180 3.036 6.049 -8.892 1.00 C +ATOM 1834 CG PRO 180 4.439 6.304 -9.366 1.00 C +ATOM 1835 N THR 181 3.998 3.352 -11.097 1.00 N +ATOM 1836 CA THR 181 4.586 2.160 -11.626 1.00 C +ATOM 1837 C THR 181 3.510 1.166 -11.966 1.00 C +ATOM 1838 O THR 181 3.760 -0.034 -11.901 1.00 O +ATOM 1839 H THR 181 3.819 3.413 -10.217 1.00 H +ATOM 1840 CB THR 181 5.587 1.537 -10.635 1.00 C +ATOM 1841 HG1 THR 181 7.183 2.128 -9.838 1.00 H +ATOM 1842 OG1 THR 181 6.645 2.466 -10.372 1.00 O +ATOM 1843 CG2 THR 181 6.188 0.266 -11.215 1.00 C +ATOM 1844 N MET 182 2.296 1.617 -12.360 1.00 N +ATOM 1845 CA MET 182 1.252 0.697 -12.747 1.00 C +ATOM 1846 C MET 182 1.653 0.006 -14.022 1.00 C +ATOM 1847 O MET 182 1.415 -1.194 -14.172 1.00 O +ATOM 1848 H MET 182 2.144 2.504 -12.379 1.00 H +ATOM 1849 CB MET 182 -0.078 1.435 -12.913 1.00 C +ATOM 1850 SD MET 182 -1.571 -0.644 -11.853 1.00 S +ATOM 1851 CE MET 182 -2.281 0.438 -10.616 1.00 C +ATOM 1852 CG MET 182 -1.263 0.524 -13.191 1.00 C +ATOM 1853 N PRO 183 2.219 0.709 -14.975 1.00 N +ATOM 1854 CA PRO 183 2.600 0.054 -16.199 1.00 C +ATOM 1855 C PRO 183 3.650 -0.993 -16.026 1.00 C +ATOM 1856 O PRO 183 3.528 -2.039 -16.657 1.00 O +ATOM 1857 CB PRO 183 3.125 1.190 -17.079 1.00 C +ATOM 1858 CD PRO 183 2.300 2.250 -15.098 1.00 C +ATOM 1859 CG PRO 183 2.409 2.404 -16.589 1.00 C +ATOM 1860 N TYR 184 4.679 -0.757 -15.190 1.00 N +ATOM 1861 CA TYR 184 5.682 -1.765 -14.996 1.00 C +ATOM 1862 C TYR 184 5.056 -2.924 -14.320 1.00 C +ATOM 1863 O TYR 184 5.346 -4.054 -14.691 1.00 O +ATOM 1864 H TYR 184 4.740 0.028 -14.754 1.00 H +ATOM 1865 CB TYR 184 6.853 -1.207 -14.184 1.00 C +ATOM 1866 CG TYR 184 7.977 -2.195 -13.971 1.00 C +ATOM 1867 HH TYR 184 11.676 -4.761 -13.950 1.00 H +ATOM 1868 OH TYR 184 11.076 -4.907 -13.396 1.00 O +ATOM 1869 CZ TYR 184 10.049 -4.011 -13.585 1.00 C +ATOM 1870 CD1 TYR 184 9.111 -2.167 -14.772 1.00 C +ATOM 1871 CE1 TYR 184 10.143 -3.066 -14.584 1.00 C +ATOM 1872 CD2 TYR 184 7.900 -3.154 -12.968 1.00 C +ATOM 1873 CE2 TYR 184 8.922 -4.062 -12.766 1.00 C +ATOM 1874 N ILE 185 4.212 -2.684 -13.291 1.00 N +ATOM 1875 CA ILE 185 3.696 -3.806 -12.580 1.00 C +ATOM 1876 C ILE 185 2.847 -4.633 -13.492 1.00 C +ATOM 1877 O ILE 185 2.960 -5.856 -13.459 1.00 O +ATOM 1878 H ILE 185 3.974 -1.850 -13.050 1.00 H +ATOM 1879 CB ILE 185 2.894 -3.368 -11.340 1.00 C +ATOM 1880 CD1 ILE 185 2.101 -4.184 -9.059 1.00 C +ATOM 1881 CG1 ILE 185 2.639 -4.564 -10.421 1.00 C +ATOM 1882 CG2 ILE 185 1.600 -2.687 -11.756 1.00 C +ATOM 1883 N LEU 186 2.011 -4.016 -14.360 1.00 N +ATOM 1884 CA LEU 186 1.203 -4.828 -15.224 1.00 C +ATOM 1885 C LEU 186 2.055 -5.620 -16.164 1.00 C +ATOM 1886 O LEU 186 1.803 -6.802 -16.377 1.00 O +ATOM 1887 H LEU 186 1.955 -3.119 -14.403 1.00 H +ATOM 1888 CB LEU 186 0.218 -3.959 -16.009 1.00 C +ATOM 1889 CG LEU 186 -0.907 -3.310 -15.200 1.00 C +ATOM 1890 CD1 LEU 186 -1.697 -2.338 -16.063 1.00 C +ATOM 1891 CD2 LEU 186 -1.829 -4.369 -14.616 1.00 C +ATOM 1892 N GLN 187 3.082 -5.001 -16.770 1.00 N +ATOM 1893 CA GLN 187 3.823 -5.692 -17.785 1.00 C +ATOM 1894 C GLN 187 4.543 -6.850 -17.158 1.00 C +ATOM 1895 O GLN 187 4.622 -7.917 -17.760 1.00 O +ATOM 1896 H GLN 187 3.306 -4.159 -16.543 1.00 H +ATOM 1897 CB GLN 187 4.800 -4.740 -18.477 1.00 C +ATOM 1898 CD GLN 187 3.302 -4.197 -20.436 1.00 C +ATOM 1899 CG GLN 187 4.130 -3.646 -19.292 1.00 C +ATOM 1900 OE1 GLN 187 3.788 -4.992 -21.240 1.00 O +ATOM 1901 1HE2 GLN 187 1.511 -4.071 -21.174 1.00 H +ATOM 1902 2HE2 GLN 187 1.729 -3.192 -19.905 1.00 H +ATOM 1903 NE2 GLN 187 2.045 -3.774 -20.513 1.00 N +ATOM 1904 N LYS 188 5.106 -6.690 -15.940 1.00 N +ATOM 1905 CA LYS 188 5.753 -7.829 -15.367 1.00 C +ATOM 1906 C LYS 188 4.721 -8.893 -15.099 1.00 C +ATOM 1907 O LYS 188 4.915 -10.059 -15.414 1.00 O +ATOM 1908 H LYS 188 5.087 -5.910 -15.491 1.00 H +ATOM 1909 CB LYS 188 6.492 -7.437 -14.086 1.00 C +ATOM 1910 CD LYS 188 8.808 -7.303 -15.043 1.00 C +ATOM 1911 CE LYS 188 10.062 -6.455 -15.173 1.00 C +ATOM 1912 CG LYS 188 7.706 -6.552 -14.315 1.00 C +ATOM 1913 1HZ LYS 188 11.850 -6.634 -15.989 1.00 H +ATOM 1914 2HZ LYS 188 10.840 -7.349 -16.750 1.00 H +ATOM 1915 3HZ LYS 188 11.349 -7.912 -15.511 1.00 H +ATOM 1916 NZ LYS 188 11.133 -7.158 -15.932 1.00 N +ATOM 1917 N SER 189 3.551 -8.548 -14.550 1.00 N +ATOM 1918 CA SER 189 2.619 -9.590 -14.218 1.00 C +ATOM 1919 C SER 189 2.007 -10.179 -15.466 1.00 C +ATOM 1920 O SER 189 1.095 -10.998 -15.391 1.00 O +ATOM 1921 H SER 189 3.341 -7.688 -14.388 1.00 H +ATOM 1922 CB SER 189 1.524 -9.055 -13.293 1.00 C +ATOM 1923 HG SER 189 1.187 -7.465 -14.208 1.00 H +ATOM 1924 OG SER 189 0.715 -8.101 -13.959 1.00 O +ATOM 1925 N GLY 190 2.442 -9.760 -16.665 1.00 N +ATOM 1926 CA GLY 190 1.897 -10.342 -17.867 1.00 C +ATOM 1927 C GLY 190 0.827 -9.454 -18.477 1.00 C +ATOM 1928 O GLY 190 0.467 -9.639 -19.638 1.00 O +ATOM 1929 H GLY 190 3.071 -9.119 -16.721 1.00 H +ATOM 1930 N PHE 191 0.297 -8.451 -17.743 1.00 N +ATOM 1931 CA PHE 191 -0.773 -7.623 -18.253 1.00 C +ATOM 1932 C PHE 191 -0.213 -6.606 -19.196 1.00 C +ATOM 1933 O PHE 191 0.890 -6.096 -19.001 1.00 O +ATOM 1934 H PHE 191 0.626 -8.304 -16.918 1.00 H +ATOM 1935 CB PHE 191 -1.522 -6.947 -17.103 1.00 C +ATOM 1936 CG PHE 191 -2.355 -7.892 -16.284 1.00 C +ATOM 1937 CZ PHE 191 -3.900 -9.642 -14.775 1.00 C +ATOM 1938 CD1 PHE 191 -2.209 -7.954 -14.910 1.00 C +ATOM 1939 CE1 PHE 191 -2.975 -8.823 -14.156 1.00 C +ATOM 1940 CD2 PHE 191 -3.286 -8.719 -16.889 1.00 C +ATOM 1941 CE2 PHE 191 -4.052 -9.588 -16.136 1.00 C +ATOM 1942 N LYS 192 -1.022 -6.231 -20.207 1.00 N +ATOM 1943 CA LYS 192 -0.651 -5.181 -21.117 1.00 C +ATOM 1944 C LYS 192 -1.697 -4.098 -21.053 1.00 C +ATOM 1945 O LYS 192 -1.605 -3.099 -21.771 1.00 O +ATOM 1946 H LYS 192 -1.810 -6.654 -20.306 1.00 H +ATOM 1947 CB LYS 192 -0.502 -5.731 -22.537 1.00 C +ATOM 1948 CD LYS 192 0.743 -7.210 -24.138 1.00 C +ATOM 1949 CE LYS 192 1.897 -8.184 -24.307 1.00 C +ATOM 1950 CG LYS 192 0.634 -6.728 -22.700 1.00 C +ATOM 1951 1HZ LYS 192 2.680 -9.257 -25.767 1.00 H +ATOM 1952 2HZ LYS 192 2.125 -8.007 -26.259 1.00 H +ATOM 1953 3HZ LYS 192 1.242 -9.111 -25.921 1.00 H +ATOM 1954 NZ LYS 192 1.996 -8.691 -25.704 1.00 N +ATOM 1955 N ASN 193 -2.711 -4.250 -20.173 1.00 N +ATOM 1956 CA ASN 193 -3.777 -3.286 -20.154 1.00 C +ATOM 1957 C ASN 193 -4.329 -3.089 -18.754 1.00 C +ATOM 1958 O ASN 193 -4.452 -4.026 -17.958 1.00 O +ATOM 1959 H ASN 193 -2.723 -4.946 -19.603 1.00 H +ATOM 1960 CB ASN 193 -4.894 -3.704 -21.112 1.00 C +ATOM 1961 CG ASN 193 -5.593 -4.976 -20.673 1.00 C +ATOM 1962 OD1 ASN 193 -6.540 -4.936 -19.888 1.00 O +ATOM 1963 1HD2 ASN 193 -5.505 -6.895 -20.952 1.00 H +ATOM 1964 2HD2 ASN 193 -4.431 -6.096 -21.751 1.00 H +ATOM 1965 ND2 ASN 193 -5.126 -6.111 -21.180 1.00 N +ATOM 1966 N MET 194 -4.702 -1.820 -18.454 1.00 N +ATOM 1967 CA MET 194 -5.322 -1.395 -17.221 1.00 C +ATOM 1968 C MET 194 -6.504 -0.525 -17.525 1.00 C +ATOM 1969 O MET 194 -6.528 0.203 -18.520 1.00 O +ATOM 1970 H MET 194 -4.533 -1.220 -19.103 1.00 H +ATOM 1971 CB MET 194 -4.313 -0.655 -16.341 1.00 C +ATOM 1972 SD MET 194 -2.629 1.494 -15.867 1.00 S +ATOM 1973 CE MET 194 -3.730 2.037 -14.563 1.00 C +ATOM 1974 CG MET 194 -3.784 0.633 -16.951 1.00 C +ATOM 1975 N LEU 195 -7.533 -0.600 -16.652 1.00 N +ATOM 1976 CA LEU 195 -8.711 0.205 -16.827 1.00 C +ATOM 1977 C LEU 195 -8.942 0.967 -15.555 1.00 C +ATOM 1978 O LEU 195 -8.973 0.371 -14.479 1.00 O +ATOM 1979 H LEU 195 -7.473 -1.164 -15.953 1.00 H +ATOM 1980 CB LEU 195 -9.911 -0.673 -17.189 1.00 C +ATOM 1981 CG LEU 195 -11.254 0.044 -17.342 1.00 C +ATOM 1982 CD1 LEU 195 -11.222 1.000 -18.525 1.00 C +ATOM 1983 CD2 LEU 195 -12.384 -0.960 -17.503 1.00 C +ATOM 1984 N ILE 196 -9.066 2.317 -15.634 1.00 N +ATOM 1985 CA ILE 196 -9.253 3.061 -14.414 1.00 C +ATOM 1986 C ILE 196 -10.228 4.194 -14.582 1.00 C +ATOM 1987 O ILE 196 -10.400 4.722 -15.678 1.00 O +ATOM 1988 H ILE 196 -9.034 2.748 -16.423 1.00 H +ATOM 1989 CB ILE 196 -7.919 3.615 -13.881 1.00 C +ATOM 1990 CD1 ILE 196 -7.753 6.043 -14.639 1.00 C +ATOM 1991 CG1 ILE 196 -7.320 4.613 -14.875 1.00 C +ATOM 1992 CG2 ILE 196 -6.957 2.479 -13.569 1.00 C +ATOM 1993 N GLN 197 -10.968 4.562 -13.505 1.00 N +ATOM 1994 CA GLN 197 -11.786 5.735 -13.654 1.00 C +ATOM 1995 C GLN 197 -11.562 6.709 -12.535 1.00 C +ATOM 1996 O GLN 197 -12.278 6.730 -11.534 1.00 O +ATOM 1997 H GLN 197 -10.965 4.112 -12.726 1.00 H +ATOM 1998 CB GLN 197 -13.266 5.351 -13.720 1.00 C +ATOM 1999 CD GLN 197 -14.529 7.447 -13.094 1.00 C +ATOM 2000 CG GLN 197 -14.176 6.471 -14.199 1.00 C +ATOM 2001 OE1 GLN 197 -14.908 7.044 -11.995 1.00 O +ATOM 2002 1HE2 GLN 197 -14.603 9.359 -12.765 1.00 H +ATOM 2003 2HE2 GLN 197 -14.126 8.989 -14.202 1.00 H +ATOM 2004 NE2 GLN 197 -14.406 8.737 -13.385 1.00 N +ATOM 2005 N ARG 198 -10.555 7.585 -12.731 1.00 N +ATOM 2006 CA ARG 198 -10.213 8.642 -11.820 1.00 C +ATOM 2007 C ARG 198 -8.945 9.240 -12.348 1.00 C +ATOM 2008 O ARG 198 -8.067 8.520 -12.817 1.00 O +ATOM 2009 H ARG 198 -10.084 7.476 -13.490 1.00 H +ATOM 2010 CB ARG 198 -10.067 8.097 -10.398 1.00 C +ATOM 2011 CD ARG 198 -10.976 10.002 -9.039 1.00 C +ATOM 2012 HE ARG 198 -11.847 8.409 -8.186 1.00 H +ATOM 2013 NE ARG 198 -12.044 9.210 -8.433 1.00 N +ATOM 2014 CG ARG 198 -9.752 9.158 -9.356 1.00 C +ATOM 2015 CZ ARG 198 -13.284 9.650 -8.243 1.00 C +ATOM 2016 1HH1 ARG 198 -13.974 8.061 -7.444 1.00 H +ATOM 2017 2HH1 ARG 198 -14.992 9.143 -7.561 1.00 H +ATOM 2018 NH1 ARG 198 -14.190 8.859 -7.683 1.00 N +ATOM 2019 1HH2 ARG 198 -13.029 11.392 -8.976 1.00 H +ATOM 2020 2HH2 ARG 198 -14.418 11.163 -8.490 1.00 H +ATOM 2021 NH2 ARG 198 -13.616 10.879 -8.613 1.00 N +ATOM 2022 N THR 199 -8.804 10.572 -12.205 1.00 N +ATOM 2023 CA THR 199 -7.677 11.365 -12.615 1.00 C +ATOM 2024 C THR 199 -7.291 11.185 -14.061 1.00 C +ATOM 2025 O THR 199 -6.318 10.533 -14.425 1.00 O +ATOM 2026 H THR 199 -9.510 10.965 -11.808 1.00 H +ATOM 2027 CB THR 199 -6.434 11.065 -11.757 1.00 C +ATOM 2028 HG1 THR 199 -5.188 11.862 -12.917 1.00 H +ATOM 2029 OG1 THR 199 -5.375 11.962 -12.115 1.00 O +ATOM 2030 CG2 THR 199 -5.960 9.638 -11.987 1.00 C +ATOM 2031 N HIS 200 -8.116 11.727 -14.960 1.00 N +ATOM 2032 CA HIS 200 -7.815 11.780 -16.370 1.00 C +ATOM 2033 C HIS 200 -8.948 12.588 -16.887 1.00 C +ATOM 2034 O HIS 200 -10.096 12.351 -16.506 1.00 O +ATOM 2035 H HIS 200 -8.889 12.069 -14.652 1.00 H +ATOM 2036 CB HIS 200 -7.711 10.368 -16.949 1.00 C +ATOM 2037 CG HIS 200 -8.988 9.590 -16.878 1.00 C +ATOM 2038 HD1 HIS 200 -8.826 8.728 -15.011 1.00 H +ATOM 2039 ND1 HIS 200 -9.335 8.828 -15.783 1.00 N +ATOM 2040 CE1 HIS 200 -10.529 8.252 -16.012 1.00 C +ATOM 2041 CD2 HIS 200 -10.127 9.380 -17.760 1.00 C +ATOM 2042 NE2 HIS 200 -11.010 8.579 -17.196 1.00 N +ATOM 2043 N TYR 201 -8.648 13.541 -17.781 1.00 N +ATOM 2044 CA TYR 201 -9.649 14.361 -18.401 1.00 C +ATOM 2045 C TYR 201 -9.509 14.099 -19.847 1.00 C +ATOM 2046 O TYR 201 -8.449 14.378 -20.405 1.00 O +ATOM 2047 H TYR 201 -7.780 13.657 -17.988 1.00 H +ATOM 2048 CB TYR 201 -9.445 15.831 -18.027 1.00 C +ATOM 2049 CG TYR 201 -10.473 16.764 -18.626 1.00 C +ATOM 2050 HH TYR 201 -14.027 19.240 -19.850 1.00 H +ATOM 2051 OH TYR 201 -13.311 19.324 -20.262 1.00 O +ATOM 2052 CZ TYR 201 -12.371 18.477 -19.722 1.00 C +ATOM 2053 CD1 TYR 201 -11.764 16.820 -18.117 1.00 C +ATOM 2054 CE1 TYR 201 -12.710 17.669 -18.658 1.00 C +ATOM 2055 CD2 TYR 201 -10.149 17.585 -19.698 1.00 C +ATOM 2056 CE2 TYR 201 -11.082 18.441 -20.252 1.00 C +ATOM 2057 N SER 202 -10.570 13.552 -20.473 1.00 N +ATOM 2058 CA SER 202 -10.552 13.305 -21.894 1.00 C +ATOM 2059 C SER 202 -11.108 14.518 -22.573 1.00 C +ATOM 2060 O SER 202 -11.974 15.216 -22.047 1.00 O +ATOM 2061 H SER 202 -11.298 13.340 -19.989 1.00 H +ATOM 2062 CB SER 202 -11.353 12.045 -22.229 1.00 C +ATOM 2063 HG SER 202 -11.874 11.164 -23.788 1.00 H +ATOM 2064 OG SER 202 -11.436 11.851 -23.630 1.00 O +ATOM 2065 N VAL 203 -10.608 14.789 -23.788 1.00 N +ATOM 2066 CA VAL 203 -11.034 15.903 -24.570 1.00 C +ATOM 2067 C VAL 203 -11.444 15.283 -25.873 1.00 C +ATOM 2068 O VAL 203 -10.904 14.249 -26.270 1.00 O +ATOM 2069 H VAL 203 -9.977 14.231 -24.106 1.00 H +ATOM 2070 CB VAL 203 -9.919 16.956 -24.706 1.00 C +ATOM 2071 CG1 VAL 203 -9.545 17.515 -23.342 1.00 C +ATOM 2072 CG2 VAL 203 -8.701 16.357 -25.393 1.00 C +ATOM 2073 N LYS 204 -12.421 15.903 -26.562 1.00 N +ATOM 2074 CA LYS 204 -13.021 15.350 -27.740 1.00 C +ATOM 2075 C LYS 204 -12.120 15.524 -28.921 1.00 C +ATOM 2076 O LYS 204 -11.145 16.266 -28.875 1.00 O +ATOM 2077 H LYS 204 -12.695 16.702 -26.250 1.00 H +ATOM 2078 CB LYS 204 -14.379 16.002 -28.006 1.00 C +ATOM 2079 CD LYS 204 -16.755 16.366 -27.284 1.00 C +ATOM 2080 CE LYS 204 -17.805 16.066 -26.227 1.00 C +ATOM 2081 CG LYS 204 -15.424 15.718 -26.939 1.00 C +ATOM 2082 1HZ LYS 204 -19.698 16.520 -25.900 1.00 H +ATOM 2083 2HZ LYS 204 -19.409 16.420 -27.321 1.00 H +ATOM 2084 3HZ LYS 204 -18.997 17.598 -26.577 1.00 H +ATOM 2085 NZ LYS 204 -19.108 16.716 -26.537 1.00 N +ATOM 2086 N LYS 205 -12.436 14.835 -30.036 1.00 N +ATOM 2087 CA LYS 205 -11.613 14.940 -31.205 1.00 C +ATOM 2088 C LYS 205 -11.622 16.360 -31.695 1.00 C +ATOM 2089 O LYS 205 -10.617 16.827 -32.229 1.00 O +ATOM 2090 H LYS 205 -13.166 14.308 -30.045 1.00 H +ATOM 2091 CB LYS 205 -12.102 13.981 -32.292 1.00 C +ATOM 2092 CD LYS 205 -12.375 11.620 -33.097 1.00 C +ATOM 2093 CE LYS 205 -12.124 10.152 -32.789 1.00 C +ATOM 2094 CG LYS 205 -11.862 12.513 -31.979 1.00 C +ATOM 2095 1HZ LYS 205 -12.495 8.413 -33.645 1.00 H +ATOM 2096 2HZ LYS 205 -12.263 9.456 -34.630 1.00 H +ATOM 2097 3HZ LYS 205 -13.537 9.384 -33.934 1.00 H +ATOM 2098 NZ LYS 205 -12.658 9.262 -33.857 1.00 N +ATOM 2099 N GLU 206 -12.749 17.092 -31.542 1.00 N +ATOM 2100 CA GLU 206 -12.784 18.439 -32.031 1.00 C +ATOM 2101 C GLU 206 -12.334 19.425 -30.993 1.00 C +ATOM 2102 O GLU 206 -13.144 20.073 -30.332 1.00 O +ATOM 2103 H GLU 206 -13.472 16.741 -31.138 1.00 H +ATOM 2104 CB GLU 206 -14.193 18.800 -32.506 1.00 C +ATOM 2105 CD GLU 206 -16.079 18.361 -34.128 1.00 C +ATOM 2106 CG GLU 206 -14.679 17.979 -33.689 1.00 C +ATOM 2107 OE1 GLU 206 -16.728 19.156 -33.417 1.00 O +ATOM 2108 OE2 GLU 206 -16.526 17.865 -35.183 1.00 O +ATOM 2109 N LEU 207 -11.003 19.591 -30.867 1.00 N +ATOM 2110 CA LEU 207 -10.380 20.512 -29.953 1.00 C +ATOM 2111 C LEU 207 -8.908 20.350 -30.155 1.00 C +ATOM 2112 O LEU 207 -8.448 19.310 -30.625 1.00 O +ATOM 2113 H LEU 207 -10.495 19.077 -31.404 1.00 H +ATOM 2114 CB LEU 207 -10.820 20.222 -28.517 1.00 C +ATOM 2115 CG LEU 207 -10.219 21.115 -27.430 1.00 C +ATOM 2116 CD1 LEU 207 -10.688 22.552 -27.595 1.00 C +ATOM 2117 CD2 LEU 207 -10.580 20.596 -26.046 1.00 C +ATOM 2118 N ALA 208 -8.135 21.388 -29.790 1.00 N +ATOM 2119 CA ALA 208 -6.723 21.414 -30.038 1.00 C +ATOM 2120 C ALA 208 -5.885 20.405 -29.294 1.00 C +ATOM 2121 O ALA 208 -5.103 19.701 -29.917 1.00 O +ATOM 2122 H ALA 208 -8.532 22.082 -29.377 1.00 H +ATOM 2123 CB ALA 208 -6.154 22.788 -29.719 1.00 C +ATOM 2124 N GLN 209 -6.034 20.266 -27.965 1.00 N +ATOM 2125 CA GLN 209 -5.166 19.478 -27.117 1.00 C +ATOM 2126 C GLN 209 -4.201 20.493 -26.567 1.00 C +ATOM 2127 O GLN 209 -3.475 21.148 -27.312 1.00 O +ATOM 2128 H GLN 209 -6.733 20.707 -27.608 1.00 H +ATOM 2129 CB GLN 209 -4.504 18.358 -27.922 1.00 C +ATOM 2130 CD GLN 209 -3.072 16.277 -27.905 1.00 C +ATOM 2131 CG GLN 209 -3.656 17.412 -27.087 1.00 C +ATOM 2132 OE1 GLN 209 -3.119 16.298 -29.135 1.00 O +ATOM 2133 1HE2 GLN 209 -2.155 14.583 -27.661 1.00 H +ATOM 2134 2HE2 GLN 209 -2.503 15.306 -26.324 1.00 H +ATOM 2135 NE2 GLN 209 -2.517 15.282 -27.223 1.00 N +ATOM 2136 N GLN 210 -4.189 20.635 -25.228 1.00 N +ATOM 2137 CA GLN 210 -3.560 21.708 -24.491 1.00 C +ATOM 2138 C GLN 210 -2.056 21.778 -24.445 1.00 C +ATOM 2139 O GLN 210 -1.530 22.878 -24.307 1.00 O +ATOM 2140 H GLN 210 -4.623 19.981 -24.788 1.00 H +ATOM 2141 CB GLN 210 -4.019 21.696 -23.031 1.00 C +ATOM 2142 CD GLN 210 -4.032 24.201 -22.709 1.00 C +ATOM 2143 CG GLN 210 -3.508 22.869 -22.211 1.00 C +ATOM 2144 OE1 GLN 210 -5.236 24.374 -22.899 1.00 O +ATOM 2145 1HE2 GLN 210 -3.386 25.960 -23.218 1.00 H +ATOM 2146 2HE2 GLN 210 -2.256 24.983 -22.771 1.00 H +ATOM 2147 NE2 GLN 210 -3.127 25.150 -22.922 1.00 N +ATOM 2148 N ARG 211 -1.343 20.635 -24.464 1.00 N +ATOM 2149 CA ARG 211 0.096 20.463 -24.352 1.00 C +ATOM 2150 C ARG 211 0.541 20.670 -22.928 1.00 C +ATOM 2151 O ARG 211 1.246 19.823 -22.383 1.00 O +ATOM 2152 H ARG 211 -1.876 19.916 -24.561 1.00 H +ATOM 2153 CB ARG 211 0.826 21.431 -25.286 1.00 C +ATOM 2154 CD ARG 211 1.207 22.264 -27.622 1.00 C +ATOM 2155 HE ARG 211 0.410 21.416 -29.256 1.00 H +ATOM 2156 NE ARG 211 0.924 22.074 -29.043 1.00 N +ATOM 2157 CG ARG 211 0.533 21.208 -26.761 1.00 C +ATOM 2158 CZ ARG 211 1.407 22.845 -30.011 1.00 C +ATOM 2159 1HH1 ARG 211 0.582 21.934 -31.469 1.00 H +ATOM 2160 2HH1 ARG 211 1.409 23.095 -31.902 1.00 H +ATOM 2161 NH1 ARG 211 1.096 22.596 -31.276 1.00 N +ATOM 2162 1HH2 ARG 211 2.403 24.026 -28.892 1.00 H +ATOM 2163 2HH2 ARG 211 2.514 24.364 -30.339 1.00 H +ATOM 2164 NH2 ARG 211 2.201 23.865 -29.712 1.00 N +ATOM 2165 N GLN 212 0.073 21.745 -22.261 1.00 N +ATOM 2166 CA GLN 212 0.425 22.063 -20.898 1.00 C +ATOM 2167 C GLN 212 -0.270 21.143 -19.970 1.00 C +ATOM 2168 O GLN 212 0.133 21.054 -18.814 1.00 O +ATOM 2169 H GLN 212 -0.490 22.279 -22.717 1.00 H +ATOM 2170 CB GLN 212 0.076 23.518 -20.580 1.00 C +ATOM 2171 CD GLN 212 0.534 25.966 -21.003 1.00 C +ATOM 2172 CG GLN 212 0.926 24.537 -21.322 1.00 C +ATOM 2173 OE1 GLN 212 -0.626 26.250 -20.703 1.00 O +ATOM 2174 1HE2 GLN 212 1.324 27.736 -20.886 1.00 H +ATOM 2175 2HE2 GLN 212 2.338 26.623 -21.290 1.00 H +ATOM 2176 NE2 GLN 212 1.503 26.872 -21.067 1.00 N +ATOM 2177 N LEU 213 -1.396 20.537 -20.411 1.00 N +ATOM 2178 CA LEU 213 -2.079 19.600 -19.560 1.00 C +ATOM 2179 C LEU 213 -1.361 18.300 -19.661 1.00 C +ATOM 2180 O LEU 213 -1.159 17.767 -20.753 1.00 O +ATOM 2181 H LEU 213 -1.718 20.717 -21.232 1.00 H +ATOM 2182 CB LEU 213 -3.548 19.477 -19.969 1.00 C +ATOM 2183 CG LEU 213 -4.394 20.747 -19.847 1.00 C +ATOM 2184 CD1 LEU 213 -5.797 20.512 -20.385 1.00 C +ATOM 2185 CD2 LEU 213 -4.453 21.217 -18.402 1.00 C +ATOM 2186 N GLU 214 -0.850 17.826 -18.509 1.00 N +ATOM 2187 CA GLU 214 -0.237 16.537 -18.419 1.00 C +ATOM 2188 C GLU 214 -1.306 15.473 -18.383 1.00 C +ATOM 2189 O GLU 214 -1.225 14.471 -19.094 1.00 O +ATOM 2190 H GLU 214 -0.904 18.351 -17.780 1.00 H +ATOM 2191 CB GLU 214 0.659 16.455 -17.181 1.00 C +ATOM 2192 CD GLU 214 2.736 17.262 -15.992 1.00 C +ATOM 2193 CG GLU 214 1.906 17.320 -17.259 1.00 C +ATOM 2194 OE1 GLU 214 2.141 17.207 -14.895 1.00 O +ATOM 2195 OE2 GLU 214 3.980 17.272 -16.096 1.00 O +ATOM 2196 N PHE 215 -2.346 15.696 -17.543 1.00 N +ATOM 2197 CA PHE 215 -3.442 14.800 -17.288 1.00 C +ATOM 2198 C PHE 215 -4.591 15.157 -18.157 1.00 C +ATOM 2199 O PHE 215 -5.726 15.156 -17.680 1.00 O +ATOM 2200 H PHE 215 -2.309 16.492 -17.125 1.00 H +ATOM 2201 CB PHE 215 -3.840 14.847 -15.811 1.00 C +ATOM 2202 CG PHE 215 -2.766 14.364 -14.879 1.00 C +ATOM 2203 CZ PHE 215 -0.781 13.465 -13.153 1.00 C +ATOM 2204 CD1 PHE 215 -1.960 15.264 -14.204 1.00 C +ATOM 2205 CE1 PHE 215 -0.972 14.820 -13.346 1.00 C +ATOM 2206 CD2 PHE 215 -2.563 13.011 -14.675 1.00 C +ATOM 2207 CE2 PHE 215 -1.575 12.567 -13.817 1.00 C +ATOM 2208 N LEU 216 -4.354 15.415 -19.447 1.00 N +ATOM 2209 CA LEU 216 -5.477 15.584 -20.311 1.00 C +ATOM 2210 C LEU 216 -5.399 14.435 -21.255 1.00 C +ATOM 2211 O LEU 216 -4.574 13.564 -21.048 1.00 O +ATOM 2212 H LEU 216 -3.519 15.483 -19.776 1.00 H +ATOM 2213 CB LEU 216 -5.420 16.948 -21.003 1.00 C +ATOM 2214 CG LEU 216 -4.180 17.225 -21.854 1.00 C +ATOM 2215 CD1 LEU 216 -4.299 16.552 -23.213 1.00 C +ATOM 2216 CD2 LEU 216 -3.967 18.722 -22.022 1.00 C +ATOM 2217 N TRP 217 -6.266 14.292 -22.269 1.00 N +ATOM 2218 CA TRP 217 -6.128 12.993 -22.899 1.00 C +ATOM 2219 C TRP 217 -7.004 12.843 -24.084 1.00 C +ATOM 2220 O TRP 217 -8.205 12.838 -23.921 1.00 O +ATOM 2221 H TRP 217 -6.878 14.877 -22.574 1.00 H +ATOM 2222 CB TRP 217 -6.434 11.877 -21.898 1.00 C +ATOM 2223 1HB TRP 217 -7.451 11.704 -21.821 1.00 H +ATOM 2224 2HB TRP 217 -5.780 11.774 -21.148 1.00 H +ATOM 2225 CG TRP 217 -6.215 10.501 -22.449 1.00 C +ATOM 2226 CD1 TRP 217 -5.743 10.180 -23.689 1.00 C +ATOM 2227 HE1 TRP 217 -5.384 8.368 -24.602 1.00 H +ATOM 2228 NE1 TRP 217 -5.679 8.815 -23.833 1.00 N +ATOM 2229 CD2 TRP 217 -6.460 9.259 -21.778 1.00 C +ATOM 2230 CE2 TRP 217 -6.115 8.228 -22.671 1.00 C +ATOM 2231 CH2 TRP 217 -6.701 6.576 -21.090 1.00 C +ATOM 2232 CZ2 TRP 217 -6.232 6.880 -22.337 1.00 C +ATOM 2233 CE3 TRP 217 -6.938 8.918 -20.509 1.00 C +ATOM 2234 CZ3 TRP 217 -7.053 7.580 -20.182 1.00 C +ATOM 2235 N ARG 218 -6.467 12.743 -25.305 1.00 N +ATOM 2236 CA ARG 218 -7.199 12.250 -26.423 1.00 C +ATOM 2237 C ARG 218 -7.071 10.740 -26.091 1.00 C +ATOM 2238 O ARG 218 -8.008 9.989 -26.358 1.00 O +ATOM 2239 H ARG 218 -5.611 13.001 -25.406 1.00 H +ATOM 2240 CB ARG 218 -6.568 12.731 -27.731 1.00 C +ATOM 2241 CD ARG 218 -6.018 14.642 -29.262 1.00 C +ATOM 2242 HE ARG 218 -6.187 13.275 -30.720 1.00 H +ATOM 2243 NE ARG 218 -6.576 13.992 -30.446 1.00 N +ATOM 2244 CG ARG 218 -6.733 14.220 -27.990 1.00 C +ATOM 2245 CZ ARG 218 -7.635 14.438 -31.113 1.00 C +ATOM 2246 1HH1 ARG 218 -7.671 13.067 -32.438 1.00 H +ATOM 2247 2HH1 ARG 218 -8.758 14.070 -32.610 1.00 H +ATOM 2248 NH1 ARG 218 -8.073 13.782 -32.179 1.00 N +ATOM 2249 1HH2 ARG 218 -7.972 15.966 -30.022 1.00 H +ATOM 2250 2HH2 ARG 218 -8.941 15.829 -31.145 1.00 H +ATOM 2251 NH2 ARG 218 -8.255 15.540 -30.713 1.00 N +ATOM 2252 N GLN 219 -5.888 10.268 -25.517 1.00 N +ATOM 2253 CA GLN 219 -5.745 8.981 -24.806 1.00 C +ATOM 2254 C GLN 219 -4.514 8.105 -24.898 1.00 C +ATOM 2255 O GLN 219 -4.251 7.634 -25.987 1.00 O +ATOM 2256 H GLN 219 -5.178 10.814 -25.605 1.00 H +ATOM 2257 CB GLN 219 -6.877 8.027 -25.193 1.00 C +ATOM 2258 CD GLN 219 -8.036 5.818 -24.794 1.00 C +ATOM 2259 CG GLN 219 -6.862 6.708 -24.436 1.00 C +ATOM 2260 OE1 GLN 219 -8.781 6.104 -25.732 1.00 O +ATOM 2261 1HE2 GLN 219 -8.887 4.172 -24.216 1.00 H +ATOM 2262 2HE2 GLN 219 -7.638 4.562 -23.369 1.00 H +ATOM 2263 NE2 GLN 219 -8.205 4.735 -24.046 1.00 N +ATOM 2264 N ILE 220 -3.840 7.754 -23.748 1.00 N +ATOM 2265 CA ILE 220 -2.838 6.694 -23.525 1.00 C +ATOM 2266 C ILE 220 -1.783 7.110 -22.605 1.00 C +ATOM 2267 O ILE 220 -1.437 8.286 -22.577 1.00 O +ATOM 2268 H ILE 220 -4.091 8.286 -23.067 1.00 H +ATOM 2269 CB ILE 220 -2.200 6.233 -24.849 1.00 C +ATOM 2270 CD1 ILE 220 -4.045 4.527 -25.277 1.00 C +ATOM 2271 CG1 ILE 220 -3.275 5.716 -25.807 1.00 C +ATOM 2272 CG2 ILE 220 -1.125 5.189 -24.587 1.00 C +ATOM 2273 N TRP 221 -1.397 6.148 -21.728 1.00 N +ATOM 2274 CA TRP 221 -0.390 6.355 -20.731 1.00 C +ATOM 2275 C TRP 221 0.883 5.603 -21.034 1.00 C +ATOM 2276 O TRP 221 0.848 4.563 -21.680 1.00 O +ATOM 2277 H TRP 221 -1.807 5.350 -21.795 1.00 H +ATOM 2278 CB TRP 221 -0.908 5.941 -19.352 1.00 C +ATOM 2279 1HB TRP 221 -0.267 6.246 -18.599 1.00 H +ATOM 2280 2HB TRP 221 -1.461 5.108 -19.327 1.00 H +ATOM 2281 CG TRP 221 -1.992 6.832 -18.827 1.00 C +ATOM 2282 CD1 TRP 221 -2.446 7.990 -19.389 1.00 C +ATOM 2283 HE1 TRP 221 -3.907 9.323 -18.812 1.00 H +ATOM 2284 NE1 TRP 221 -3.448 8.529 -18.620 1.00 N +ATOM 2285 CD2 TRP 221 -2.759 6.637 -17.632 1.00 C +ATOM 2286 CE2 TRP 221 -3.658 7.715 -17.535 1.00 C +ATOM 2287 CH2 TRP 221 -4.554 6.867 -15.521 1.00 C +ATOM 2288 CZ2 TRP 221 -4.562 7.840 -16.481 1.00 C +ATOM 2289 CE3 TRP 221 -2.773 5.656 -16.636 1.00 C +ATOM 2290 CZ3 TRP 221 -3.671 5.784 -15.594 1.00 C +ATOM 2291 N ASP 222 2.048 6.224 -20.695 1.00 N +ATOM 2292 CA ASP 222 3.413 5.707 -20.712 1.00 C +ATOM 2293 C ASP 222 3.868 5.933 -19.332 1.00 C +ATOM 2294 O ASP 222 3.808 7.069 -18.869 1.00 O +ATOM 2295 H ASP 222 1.890 7.070 -20.431 1.00 H +ATOM 2296 CB ASP 222 4.245 6.426 -21.776 1.00 C +ATOM 2297 CG ASP 222 5.646 5.861 -21.900 1.00 C +ATOM 2298 OD1 ASP 222 6.099 5.183 -20.953 1.00 O +ATOM 2299 OD2 ASP 222 6.292 6.096 -22.943 1.00 O +ATOM 2300 N ASN 223 4.264 4.856 -18.630 1.00 N +ATOM 2301 CA ASN 223 4.767 5.013 -17.290 1.00 C +ATOM 2302 C ASN 223 6.196 5.478 -17.423 1.00 C +ATOM 2303 O ASN 223 6.739 5.491 -18.528 1.00 O +ATOM 2304 H ASN 223 4.214 4.037 -18.999 1.00 H +ATOM 2305 CB ASN 223 4.631 3.704 -16.510 1.00 C +ATOM 2306 CG ASN 223 5.516 2.603 -17.060 1.00 C +ATOM 2307 OD1 ASN 223 6.408 2.856 -17.869 1.00 O +ATOM 2308 1HD2 ASN 223 5.767 0.683 -16.916 1.00 H +ATOM 2309 2HD2 ASN 223 4.608 1.231 -16.028 1.00 H +ATOM 2310 ND2 ASN 223 5.271 1.374 -16.621 1.00 N +ATOM 2311 N LYS 224 6.828 5.932 -16.321 1.00 N +ATOM 2312 CA LYS 224 8.209 6.363 -16.386 1.00 C +ATOM 2313 C LYS 224 9.039 5.121 -16.317 1.00 C +ATOM 2314 O LYS 224 8.809 4.253 -15.492 1.00 O +ATOM 2315 H LYS 224 6.382 5.965 -15.540 1.00 H +ATOM 2316 CB LYS 224 8.519 7.342 -15.252 1.00 C +ATOM 2317 CD LYS 224 7.925 9.422 -16.525 1.00 C +ATOM 2318 CE LYS 224 7.145 10.727 -16.500 1.00 C +ATOM 2319 CG LYS 224 7.669 8.602 -15.271 1.00 C +ATOM 2320 1HZ LYS 224 6.905 12.289 -17.682 1.00 H +ATOM 2321 2HZ LYS 224 7.116 11.069 -18.444 1.00 H +ATOM 2322 3HZ LYS 224 8.240 11.728 -17.801 1.00 H +ATOM 2323 NZ LYS 224 7.375 11.534 -17.730 1.00 N +ATOM 2324 N GLY 225 10.077 5.014 -17.145 1.00 N +ATOM 2325 CA GLY 225 10.895 3.834 -17.230 1.00 C +ATOM 2326 C GLY 225 10.703 3.288 -18.605 1.00 C +ATOM 2327 O GLY 225 11.446 2.407 -19.034 1.00 O +ATOM 2328 H GLY 225 10.257 5.725 -17.667 1.00 H +ATOM 2329 N ASP 226 9.710 3.886 -19.300 1.00 N +ATOM 2330 CA ASP 226 9.124 3.713 -20.612 1.00 C +ATOM 2331 C ASP 226 8.473 2.360 -20.807 1.00 C +ATOM 2332 O ASP 226 8.276 1.928 -21.941 1.00 O +ATOM 2333 H ASP 226 9.397 4.524 -18.748 1.00 H +ATOM 2334 CB ASP 226 10.180 3.914 -21.701 1.00 C +ATOM 2335 CG ASP 226 10.717 5.331 -21.737 1.00 C +ATOM 2336 OD1 ASP 226 9.971 6.259 -21.358 1.00 O +ATOM 2337 OD2 ASP 226 11.883 5.515 -22.145 1.00 O +ATOM 2338 N THR 227 8.042 1.679 -19.720 1.00 N +ATOM 2339 CA THR 227 7.382 0.406 -19.873 1.00 C +ATOM 2340 C THR 227 5.884 0.633 -19.879 1.00 C +ATOM 2341 O THR 227 5.234 0.586 -18.837 1.00 O +ATOM 2342 H THR 227 8.169 2.024 -18.899 1.00 H +ATOM 2343 CB THR 227 7.779 -0.574 -18.754 1.00 C +ATOM 2344 HG1 THR 227 9.588 -0.070 -18.673 1.00 H +ATOM 2345 OG1 THR 227 9.195 -0.792 -18.786 1.00 O +ATOM 2346 CG2 THR 227 7.077 -1.910 -18.941 1.00 C +ATOM 2347 N ALA 228 5.318 0.806 -21.104 1.00 N +ATOM 2348 CA ALA 228 3.972 1.244 -21.454 1.00 C +ATOM 2349 C ALA 228 2.935 0.149 -21.576 1.00 C +ATOM 2350 O ALA 228 3.262 -1.029 -21.473 1.00 O +ATOM 2351 H ALA 228 5.909 0.605 -21.753 1.00 H +ATOM 2352 CB ALA 228 3.989 2.010 -22.768 1.00 C +ATOM 2353 N LEU 229 1.623 0.540 -21.662 1.00 N +ATOM 2354 CA LEU 229 0.502 -0.371 -21.865 1.00 C +ATOM 2355 C LEU 229 -0.701 0.349 -22.351 1.00 C +ATOM 2356 O LEU 229 -0.720 1.573 -22.423 1.00 O +ATOM 2357 H LEU 229 1.476 1.424 -21.584 1.00 H +ATOM 2358 CB LEU 229 0.175 -1.116 -20.569 1.00 C +ATOM 2359 CG LEU 229 -0.154 -0.247 -19.353 1.00 C +ATOM 2360 CD1 LEU 229 -1.596 0.234 -19.410 1.00 C +ATOM 2361 CD2 LEU 229 0.098 -1.012 -18.062 1.00 C +ATOM 2362 N PHE 230 -1.739 -0.429 -22.713 1.00 N +ATOM 2363 CA PHE 230 -2.982 0.104 -23.192 1.00 C +ATOM 2364 C PHE 230 -3.680 0.639 -21.990 1.00 C +ATOM 2365 O PHE 230 -3.866 -0.065 -20.994 1.00 O +ATOM 2366 H PHE 230 -1.628 -1.319 -22.644 1.00 H +ATOM 2367 CB PHE 230 -3.785 -0.978 -23.916 1.00 C +ATOM 2368 CG PHE 230 -3.215 -1.365 -25.251 1.00 C +ATOM 2369 CZ PHE 230 -2.160 -2.074 -27.723 1.00 C +ATOM 2370 CD1 PHE 230 -3.096 -2.696 -25.609 1.00 C +ATOM 2371 CE1 PHE 230 -2.571 -3.052 -26.837 1.00 C +ATOM 2372 CD2 PHE 230 -2.799 -0.398 -26.148 1.00 C +ATOM 2373 CE2 PHE 230 -2.275 -0.754 -27.377 1.00 C +ATOM 2374 N THR 231 -4.058 1.931 -22.094 1.00 N +ATOM 2375 CA THR 231 -4.701 2.714 -21.075 1.00 C +ATOM 2376 C THR 231 -6.096 2.875 -21.500 1.00 C +ATOM 2377 O THR 231 -6.376 3.330 -22.608 1.00 O +ATOM 2378 H THR 231 -3.871 2.299 -22.894 1.00 H +ATOM 2379 CB THR 231 -3.998 4.070 -20.877 1.00 C +ATOM 2380 HG1 THR 231 -2.244 3.417 -21.049 1.00 H +ATOM 2381 OG1 THR 231 -2.643 3.853 -20.465 1.00 O +ATOM 2382 CG2 THR 231 -4.706 4.886 -19.807 1.00 C +ATOM 2383 N HIS 232 -6.982 2.487 -20.576 1.00 N +ATOM 2384 CA HIS 232 -8.406 2.450 -20.737 1.00 C +ATOM 2385 C HIS 232 -8.905 3.522 -19.832 1.00 C +ATOM 2386 O HIS 232 -8.704 3.463 -18.617 1.00 O +ATOM 2387 H HIS 232 -6.611 2.234 -19.796 1.00 H +ATOM 2388 CB HIS 232 -8.947 1.059 -20.399 1.00 C +ATOM 2389 CG HIS 232 -8.440 -0.022 -21.302 1.00 C +ATOM 2390 ND1 HIS 232 -8.991 -0.280 -22.538 1.00 N +ATOM 2391 CE1 HIS 232 -8.327 -1.300 -23.109 1.00 C +ATOM 2392 CD2 HIS 232 -7.381 -1.018 -21.234 1.00 C +ATOM 2393 HE2 HIS 232 -6.775 -2.446 -22.524 1.00 H +ATOM 2394 NE2 HIS 232 -7.360 -1.749 -22.333 1.00 N +ATOM 2395 N MET 233 -9.565 4.545 -20.408 1.00 N +ATOM 2396 CA MET 233 -10.029 5.594 -19.544 1.00 C +ATOM 2397 C MET 233 -11.512 5.643 -19.467 1.00 C +ATOM 2398 O MET 233 -12.252 5.250 -20.376 1.00 O +ATOM 2399 H MET 233 -9.720 4.590 -21.293 1.00 H +ATOM 2400 CB MET 233 -9.497 6.950 -20.014 1.00 C +ATOM 2401 SD MET 233 -9.267 8.926 -21.941 1.00 S +ATOM 2402 CE MET 233 -9.883 9.018 -23.620 1.00 C +ATOM 2403 CG MET 233 -9.903 7.319 -21.431 1.00 C +ATOM 2404 N MET 234 -11.968 6.050 -18.268 1.00 N +ATOM 2405 CA MET 234 -13.336 6.394 -18.150 1.00 C +ATOM 2406 C MET 234 -13.346 7.853 -18.585 1.00 C +ATOM 2407 O MET 234 -12.928 8.722 -17.819 1.00 O +ATOM 2408 H MET 234 -11.426 6.106 -17.551 1.00 H +ATOM 2409 CB MET 234 -13.828 6.152 -16.722 1.00 C +ATOM 2410 SD MET 234 -14.841 3.604 -17.118 1.00 S +ATOM 2411 CE MET 234 -13.744 2.862 -18.323 1.00 C +ATOM 2412 CG MET 234 -13.705 4.710 -16.259 1.00 C +ATOM 2413 N PRO 235 -13.666 8.207 -19.820 1.00 N +ATOM 2414 CA PRO 235 -14.112 9.543 -19.965 1.00 C +ATOM 2415 C PRO 235 -15.472 9.145 -19.720 1.00 C +ATOM 2416 O PRO 235 -15.719 8.028 -20.131 1.00 O +ATOM 2417 CB PRO 235 -13.699 9.919 -21.390 1.00 C +ATOM 2418 CD PRO 235 -12.964 7.669 -21.035 1.00 C +ATOM 2419 CG PRO 235 -12.613 8.954 -21.730 1.00 C +ATOM 2420 N PHE 236 -16.353 9.979 -19.178 1.00 N +ATOM 2421 CA PHE 236 -17.628 9.490 -18.764 1.00 C +ATOM 2422 C PHE 236 -17.142 8.557 -17.652 1.00 C +ATOM 2423 O PHE 236 -16.647 7.446 -17.849 1.00 O +ATOM 2424 H PHE 236 -16.148 10.849 -19.072 1.00 H +ATOM 2425 CB PHE 236 -18.360 8.840 -19.940 1.00 C +ATOM 2426 CG PHE 236 -19.742 8.357 -19.601 1.00 C +ATOM 2427 CZ PHE 236 -22.298 7.460 -18.980 1.00 C +ATOM 2428 CD1 PHE 236 -20.437 8.898 -18.534 1.00 C +ATOM 2429 CE1 PHE 236 -21.708 8.454 -18.223 1.00 C +ATOM 2430 CD2 PHE 236 -20.346 7.363 -20.350 1.00 C +ATOM 2431 CE2 PHE 236 -21.617 6.919 -20.039 1.00 C +ATOM 2432 N TYR 237 -17.213 9.024 -16.402 1.00 N +ATOM 2433 CA TYR 237 -16.747 8.249 -15.292 1.00 C +ATOM 2434 C TYR 237 -17.356 6.888 -15.259 1.00 C +ATOM 2435 O TYR 237 -18.319 6.606 -15.972 1.00 O +ATOM 2436 H TYR 237 -17.562 9.842 -16.265 1.00 H +ATOM 2437 CB TYR 237 -17.039 8.970 -13.975 1.00 C +ATOM 2438 CG TYR 237 -16.209 10.216 -13.762 1.00 C +ATOM 2439 HH TYR 237 -13.192 13.553 -13.587 1.00 H +ATOM 2440 OH TYR 237 -13.914 13.635 -13.185 1.00 O +ATOM 2441 CZ TYR 237 -14.674 12.505 -13.375 1.00 C +ATOM 2442 CD1 TYR 237 -14.947 10.336 -14.331 1.00 C +ATOM 2443 CE1 TYR 237 -14.182 11.471 -14.142 1.00 C +ATOM 2444 CD2 TYR 237 -16.689 11.268 -12.992 1.00 C +ATOM 2445 CE2 TYR 237 -15.937 12.410 -12.792 1.00 C +ATOM 2446 N SER 238 -16.750 5.981 -14.440 1.00 N +ATOM 2447 CA SER 238 -17.432 4.755 -14.135 1.00 C +ATOM 2448 C SER 238 -18.694 5.357 -13.573 1.00 C +ATOM 2449 O SER 238 -18.640 6.408 -12.957 1.00 O +ATOM 2450 H SER 238 -15.935 6.141 -14.092 1.00 H +ATOM 2451 CB SER 238 -16.594 3.898 -13.185 1.00 C +ATOM 2452 HG SER 238 -16.020 4.030 -11.415 1.00 H +ATOM 2453 OG SER 238 -16.477 4.511 -11.913 1.00 O +ATOM 2454 N TYR 239 -19.856 4.717 -13.665 1.00 N +ATOM 2455 CA TYR 239 -21.130 5.360 -13.430 1.00 C +ATOM 2456 C TYR 239 -21.749 5.922 -14.685 1.00 C +ATOM 2457 O TYR 239 -22.763 6.605 -14.598 1.00 O +ATOM 2458 H TYR 239 -19.826 3.845 -13.885 1.00 H +ATOM 2459 CB TYR 239 -20.982 6.483 -12.401 1.00 C +ATOM 2460 CG TYR 239 -20.387 6.034 -11.086 1.00 C +ATOM 2461 HH TYR 239 -19.314 4.409 -7.025 1.00 H +ATOM 2462 OH TYR 239 -18.738 4.806 -7.472 1.00 O +ATOM 2463 CZ TYR 239 -19.285 5.212 -8.667 1.00 C +ATOM 2464 CD1 TYR 239 -19.060 6.303 -10.777 1.00 C +ATOM 2465 CE1 TYR 239 -18.508 5.896 -9.576 1.00 C +ATOM 2466 CD2 TYR 239 -21.155 5.343 -10.157 1.00 C +ATOM 2467 CE2 TYR 239 -20.620 4.929 -8.952 1.00 C +ATOM 2468 N ASP 240 -21.190 5.654 -15.880 1.00 N +ATOM 2469 CA ASP 240 -21.766 6.042 -17.158 1.00 C +ATOM 2470 C ASP 240 -22.975 5.201 -17.421 1.00 C +ATOM 2471 O ASP 240 -23.932 5.706 -18.015 1.00 O +ATOM 2472 H ASP 240 -20.410 5.205 -15.856 1.00 H +ATOM 2473 CB ASP 240 -20.734 5.895 -18.278 1.00 C +ATOM 2474 CG ASP 240 -20.186 4.485 -18.383 1.00 C +ATOM 2475 OD1 ASP 240 -20.425 3.684 -17.455 1.00 O +ATOM 2476 OD2 ASP 240 -19.517 4.182 -19.394 1.00 O +ATOM 2477 N ILE 241 -22.979 3.872 -17.096 1.00 N +ATOM 2478 CA ILE 241 -24.335 3.436 -17.235 1.00 C +ATOM 2479 C ILE 241 -24.964 2.882 -15.992 1.00 C +ATOM 2480 O ILE 241 -25.385 1.728 -15.926 1.00 O +ATOM 2481 H ILE 241 -22.343 3.290 -16.838 1.00 H +ATOM 2482 CB ILE 241 -24.475 2.369 -18.337 1.00 C +ATOM 2483 CD1 ILE 241 -24.624 4.127 -20.176 1.00 C +ATOM 2484 CG1 ILE 241 -23.916 2.893 -19.661 1.00 C +ATOM 2485 CG2 ILE 241 -25.924 1.926 -18.468 1.00 C +ATOM 2486 N PRO 242 -25.075 3.747 -15.019 1.00 N +ATOM 2487 CA PRO 242 -25.708 3.484 -13.776 1.00 C +ATOM 2488 C PRO 242 -27.209 3.469 -13.941 1.00 C +ATOM 2489 O PRO 242 -27.789 4.362 -14.561 1.00 O +ATOM 2490 CB PRO 242 -25.247 4.632 -12.876 1.00 C +ATOM 2491 CD PRO 242 -24.396 5.086 -15.066 1.00 C +ATOM 2492 CG PRO 242 -24.923 5.741 -13.820 1.00 C +ATOM 2493 N HIS 243 -27.851 2.494 -13.308 1.00 N +ATOM 2494 CA HIS 243 -29.267 2.298 -13.157 1.00 C +ATOM 2495 C HIS 243 -30.096 2.173 -14.383 1.00 C +ATOM 2496 O HIS 243 -31.293 2.015 -14.199 1.00 O +ATOM 2497 H HIS 243 -27.274 1.907 -12.944 1.00 H +ATOM 2498 CB HIS 243 -29.882 3.439 -12.344 1.00 C +ATOM 2499 CG HIS 243 -29.284 3.601 -10.982 1.00 C +ATOM 2500 ND1 HIS 243 -29.101 4.832 -10.391 1.00 N +ATOM 2501 CE1 HIS 243 -28.547 4.658 -9.177 1.00 C +ATOM 2502 CD2 HIS 243 -28.768 2.701 -9.960 1.00 C +ATOM 2503 HE2 HIS 243 -27.974 3.030 -8.136 1.00 H +ATOM 2504 NE2 HIS 243 -28.345 3.382 -8.913 1.00 N +ATOM 2505 N THR 244 -29.516 2.024 -15.594 1.00 N +ATOM 2506 CA THR 244 -30.232 2.057 -16.851 1.00 C +ATOM 2507 C THR 244 -31.633 1.562 -16.805 1.00 C +ATOM 2508 O THR 244 -31.874 0.422 -16.419 1.00 O +ATOM 2509 H THR 244 -28.625 1.898 -15.587 1.00 H +ATOM 2510 CB THR 244 -29.505 1.241 -17.936 1.00 C +ATOM 2511 HG1 THR 244 -29.792 0.951 -19.771 1.00 H +ATOM 2512 OG1 THR 244 -30.186 1.392 -19.188 1.00 O +ATOM 2513 CG2 THR 244 -29.485 -0.235 -17.569 1.00 C +ATOM 2514 N CYS 245 -32.578 2.474 -17.154 1.00 N +ATOM 2515 CA CYS 245 -34.011 2.228 -17.162 1.00 C +ATOM 2516 C CYS 245 -34.217 1.143 -18.142 1.00 C +ATOM 2517 O CYS 245 -33.862 -0.004 -17.911 1.00 O +ATOM 2518 H CYS 245 -32.259 3.281 -17.393 1.00 H +ATOM 2519 CB CYS 245 -34.772 3.507 -17.514 1.00 C +ATOM 2520 SG CYS 245 -34.634 4.823 -16.281 1.00 S +ATOM 2521 N GLY 246 -34.933 1.454 -19.215 1.00 N +ATOM 2522 CA GLY 246 -35.036 0.647 -20.389 1.00 C +ATOM 2523 C GLY 246 -36.074 -0.456 -20.510 1.00 C +ATOM 2524 O GLY 246 -36.082 -1.070 -21.580 1.00 O +ATOM 2525 H GLY 246 -35.374 2.237 -19.167 1.00 H +ATOM 2526 N PRO 247 -36.956 -0.759 -19.591 1.00 N +ATOM 2527 CA PRO 247 -37.836 -1.900 -19.770 1.00 C +ATOM 2528 C PRO 247 -39.081 -2.025 -20.566 1.00 C +ATOM 2529 O PRO 247 -39.907 -2.767 -20.035 1.00 O +ATOM 2530 CB PRO 247 -38.311 -2.227 -18.353 1.00 C +ATOM 2531 CD PRO 247 -36.771 -0.408 -18.131 1.00 C +ATOM 2532 CG PRO 247 -37.251 -1.667 -17.465 1.00 C +ATOM 2533 N ASP 248 -39.359 -1.304 -21.673 1.00 N +ATOM 2534 CA ASP 248 -40.578 -1.757 -22.302 1.00 C +ATOM 2535 C ASP 248 -41.029 -0.899 -23.440 1.00 C +ATOM 2536 O ASP 248 -41.816 0.006 -23.159 1.00 O +ATOM 2537 H ASP 248 -38.895 -0.621 -22.031 1.00 H +ATOM 2538 CB ASP 248 -41.711 -1.840 -21.277 1.00 C +ATOM 2539 CG ASP 248 -42.973 -2.453 -21.852 1.00 C +ATOM 2540 OD1 ASP 248 -42.996 -2.734 -23.069 1.00 O +ATOM 2541 OD2 ASP 248 -43.939 -2.651 -21.086 1.00 O +ATOM 2542 N PRO 249 -40.651 -1.091 -24.678 1.00 N +ATOM 2543 CA PRO 249 -41.386 -0.415 -25.708 1.00 C +ATOM 2544 C PRO 249 -42.672 -1.097 -25.769 1.00 C +ATOM 2545 O PRO 249 -42.717 -2.304 -26.005 1.00 O +ATOM 2546 CB PRO 249 -40.525 -0.599 -26.959 1.00 C +ATOM 2547 CD PRO 249 -39.507 -1.872 -25.206 1.00 C +ATOM 2548 CG PRO 249 -39.736 -1.837 -26.691 1.00 C +ATOM 2549 N LYS 250 -43.718 -0.342 -25.481 1.00 N +ATOM 2550 CA LYS 250 -45.013 -0.836 -25.725 1.00 C +ATOM 2551 C LYS 250 -45.145 -0.652 -27.209 1.00 C +ATOM 2552 O LYS 250 -45.995 -1.248 -27.870 1.00 O +ATOM 2553 H LYS 250 -43.608 0.480 -25.132 1.00 H +ATOM 2554 CB LYS 250 -46.044 -0.073 -24.890 1.00 C +ATOM 2555 CD LYS 250 -46.992 0.462 -22.629 1.00 C +ATOM 2556 CE LYS 250 -46.888 0.211 -21.133 1.00 C +ATOM 2557 CG LYS 250 -45.935 -0.318 -23.394 1.00 C +ATOM 2558 1HZ LYS 250 -47.810 0.821 -19.499 1.00 H +ATOM 2559 2HZ LYS 250 -48.716 0.758 -20.633 1.00 H +ATOM 2560 3HZ LYS 250 -47.777 1.860 -20.514 1.00 H +ATOM 2561 NZ LYS 250 -47.899 0.991 -20.368 1.00 N diff --git a/modules/bindings/src/tmalign/PDB2.pdb b/modules/bindings/src/tmalign/PDB2.pdb new file mode 100644 index 000000000..afe4a7bcf --- /dev/null +++ b/modules/bindings/src/tmalign/PDB2.pdb @@ -0,0 +1,1396 @@ +ATOM 1 N CYS A 31 44.187 36.201 -18.891 1.00 25.31 N +ATOM 2 CA CYS A 31 43.428 37.449 -18.580 1.00 24.65 C +ATOM 3 C CYS A 31 41.921 37.251 -18.677 1.00 24.78 C +ATOM 4 O CYS A 31 41.430 36.634 -19.621 1.00 24.15 O +ATOM 5 CB CYS A 31 43.813 38.571 -19.545 1.00 24.27 C +ATOM 6 SG CYS A 31 45.498 39.241 -19.408 1.00 23.78 S +ATOM 7 N GLN A 32 41.193 37.784 -17.700 1.00 24.87 N +ATOM 8 CA GLN A 32 39.737 37.695 -17.703 1.00 25.04 C +ATOM 9 C GLN A 32 39.194 38.597 -18.801 1.00 24.06 C +ATOM 10 O GLN A 32 39.778 39.634 -19.114 1.00 23.51 O +ATOM 11 CB GLN A 32 39.148 38.167 -16.373 1.00 26.41 C +ATOM 12 CG GLN A 32 39.171 37.151 -15.256 1.00 29.41 C +ATOM 13 CD GLN A 32 38.255 37.550 -14.117 1.00 30.90 C +ATOM 14 OE1 GLN A 32 37.035 37.617 -14.282 1.00 31.76 O +ATOM 15 NE2 GLN A 32 38.837 37.826 -12.955 1.00 32.11 N +ATOM 16 N ASP A 33 38.075 38.196 -19.385 1.00 23.14 N +ATOM 17 CA ASP A 33 37.443 38.988 -20.426 1.00 22.18 C +ATOM 18 C ASP A 33 36.545 39.962 -19.666 1.00 21.27 C +ATOM 19 O ASP A 33 35.610 39.546 -18.990 1.00 22.14 O +ATOM 20 CB ASP A 33 36.630 38.070 -21.341 1.00 22.39 C +ATOM 21 CG ASP A 33 36.031 38.800 -22.523 1.00 23.26 C +ATOM 22 OD1 ASP A 33 35.779 38.140 -23.554 1.00 22.79 O +ATOM 23 OD2 ASP A 33 35.799 40.024 -22.418 1.00 23.65 O +ATOM 24 N VAL A 34 36.838 41.256 -19.759 1.00 19.12 N +ATOM 25 CA VAL A 34 36.061 42.256 -19.032 1.00 16.99 C +ATOM 26 C VAL A 34 34.888 42.826 -19.819 1.00 16.48 C +ATOM 27 O VAL A 34 34.205 43.735 -19.351 1.00 15.42 O +ATOM 28 CB VAL A 34 36.968 43.427 -18.570 1.00 17.13 C +ATOM 29 CG1 VAL A 34 38.130 42.890 -17.752 1.00 17.15 C +ATOM 30 CG2 VAL A 34 37.494 44.198 -19.778 1.00 16.24 C +ATOM 31 N VAL A 35 34.636 42.278 -21.002 1.00 15.15 N +ATOM 32 CA VAL A 35 33.553 42.778 -21.837 1.00 15.95 C +ATOM 33 C VAL A 35 32.379 41.828 -22.064 1.00 16.66 C +ATOM 34 O VAL A 35 31.221 42.212 -21.906 1.00 15.94 O +ATOM 35 CB VAL A 35 34.087 43.180 -23.237 1.00 15.87 C +ATOM 36 CG1 VAL A 35 32.943 43.697 -24.114 1.00 16.28 C +ATOM 37 CG2 VAL A 35 35.186 44.223 -23.096 1.00 15.14 C +ATOM 38 N GLN A 36 32.691 40.587 -22.418 1.00 18.23 N +ATOM 39 CA GLN A 36 31.673 39.595 -22.769 1.00 19.70 C +ATOM 40 C GLN A 36 31.069 38.673 -21.719 1.00 20.67 C +ATOM 41 O GLN A 36 30.123 37.948 -22.019 1.00 20.85 O +ATOM 42 CB GLN A 36 32.217 38.742 -23.912 1.00 20.01 C +ATOM 43 CG GLN A 36 32.974 39.561 -24.944 1.00 20.99 C +ATOM 44 CD GLN A 36 33.446 38.734 -26.114 1.00 21.57 C +ATOM 45 OE1 GLN A 36 32.675 38.428 -27.021 1.00 23.00 O +ATOM 46 NE2 GLN A 36 34.719 38.357 -26.097 1.00 21.92 N +ATOM 47 N ASP A 37 31.599 38.677 -20.502 1.00 21.66 N +ATOM 48 CA ASP A 37 31.059 37.813 -19.458 1.00 22.24 C +ATOM 49 C ASP A 37 30.423 38.615 -18.331 1.00 22.03 C +ATOM 50 O ASP A 37 31.125 39.195 -17.505 1.00 22.55 O +ATOM 51 CB ASP A 37 32.157 36.916 -18.868 1.00 23.53 C +ATOM 52 CG ASP A 37 32.745 35.959 -19.885 1.00 24.69 C +ATOM 53 OD1 ASP A 37 31.966 35.290 -20.593 1.00 25.81 O +ATOM 54 OD2 ASP A 37 33.988 35.867 -19.966 1.00 25.79 O +ATOM 55 N VAL A 38 29.095 38.639 -18.296 1.00 21.55 N +ATOM 56 CA VAL A 38 28.370 39.359 -17.254 1.00 21.24 C +ATOM 57 C VAL A 38 28.528 38.640 -15.915 1.00 21.28 C +ATOM 58 O VAL A 38 28.040 37.521 -15.734 1.00 20.23 O +ATOM 59 CB VAL A 38 26.867 39.458 -17.585 1.00 21.90 C +ATOM 60 CG1 VAL A 38 26.129 40.196 -16.470 1.00 21.22 C +ATOM 61 CG2 VAL A 38 26.678 40.175 -18.918 1.00 21.24 C +ATOM 62 N PRO A 39 29.218 39.274 -14.957 1.00 20.86 N +ATOM 63 CA PRO A 39 29.416 38.656 -13.644 1.00 20.83 C +ATOM 64 C PRO A 39 28.110 38.261 -12.965 1.00 21.09 C +ATOM 65 O PRO A 39 27.102 38.962 -13.068 1.00 21.03 O +ATOM 66 CB PRO A 39 30.158 39.740 -12.863 1.00 20.96 C +ATOM 67 CG PRO A 39 30.954 40.430 -13.926 1.00 20.10 C +ATOM 68 CD PRO A 39 29.938 40.558 -15.044 1.00 21.11 C +ATOM 69 N ASN A 40 28.125 37.124 -12.279 1.00 21.74 N +ATOM 70 CA ASN A 40 26.942 36.675 -11.562 1.00 21.48 C +ATOM 71 C ASN A 40 27.126 37.023 -10.091 1.00 20.38 C +ATOM 72 O ASN A 40 27.910 36.385 -9.389 1.00 19.77 O +ATOM 73 CB ASN A 40 26.751 35.167 -11.709 1.00 23.80 C +ATOM 74 CG ASN A 40 25.581 34.653 -10.894 1.00 25.81 C +ATOM 75 OD1 ASN A 40 24.460 35.149 -11.016 1.00 28.00 O +ATOM 76 ND2 ASN A 40 25.835 33.656 -10.054 1.00 27.49 N +ATOM 77 N VAL A 41 26.410 38.040 -9.628 1.00 19.22 N +ATOM 78 CA VAL A 41 26.516 38.458 -8.234 1.00 18.06 C +ATOM 79 C VAL A 41 25.156 38.457 -7.549 1.00 17.09 C +ATOM 80 O VAL A 41 24.119 38.565 -8.203 1.00 16.82 O +ATOM 81 CB VAL A 41 27.132 39.870 -8.122 1.00 17.92 C +ATOM 82 CG1 VAL A 41 28.572 39.850 -8.614 1.00 18.12 C +ATOM 83 CG2 VAL A 41 26.312 40.857 -8.937 1.00 18.31 C +ATOM 84 N ASP A 42 25.165 38.328 -6.229 1.00 16.54 N +ATOM 85 CA ASP A 42 23.927 38.313 -5.462 1.00 16.47 C +ATOM 86 C ASP A 42 23.260 39.678 -5.487 1.00 16.38 C +ATOM 87 O ASP A 42 22.033 39.783 -5.525 1.00 16.53 O +ATOM 88 CB ASP A 42 24.209 37.901 -4.015 1.00 17.26 C +ATOM 89 CG ASP A 42 24.746 36.486 -3.909 1.00 17.50 C +ATOM 90 OD1 ASP A 42 24.081 35.564 -4.425 1.00 18.85 O +ATOM 91 OD2 ASP A 42 25.823 36.294 -3.310 1.00 17.25 O +ATOM 92 N VAL A 43 24.075 40.726 -5.456 1.00 15.74 N +ATOM 93 CA VAL A 43 23.569 42.089 -5.481 1.00 15.67 C +ATOM 94 C VAL A 43 24.320 42.919 -6.516 1.00 14.97 C +ATOM 95 O VAL A 43 25.546 43.031 -6.464 1.00 14.68 O +ATOM 96 CB VAL A 43 23.733 42.781 -4.110 1.00 16.44 C +ATOM 97 CG1 VAL A 43 23.143 44.189 -4.163 1.00 15.76 C +ATOM 98 CG2 VAL A 43 23.062 41.961 -3.019 1.00 16.47 C +ATOM 99 N GLN A 44 23.582 43.479 -7.466 1.00 13.76 N +ATOM 100 CA GLN A 44 24.174 44.328 -8.491 1.00 14.03 C +ATOM 101 C GLN A 44 23.413 45.642 -8.321 1.00 13.66 C +ATOM 102 O GLN A 44 22.211 45.717 -8.580 1.00 13.67 O +ATOM 103 CB GLN A 44 23.960 43.720 -9.882 1.00 13.58 C +ATOM 104 CG GLN A 44 25.022 44.137 -10.892 1.00 12.51 C +ATOM 105 CD GLN A 44 25.125 45.646 -11.011 1.00 12.88 C +ATOM 106 OE1 GLN A 44 24.138 46.320 -11.294 1.00 12.17 O +ATOM 107 NE2 GLN A 44 26.321 46.183 -10.792 1.00 11.67 N +ATOM 108 N MET A 45 24.116 46.674 -7.869 1.00 13.47 N +ATOM 109 CA MET A 45 23.484 47.953 -7.575 1.00 13.42 C +ATOM 110 C MET A 45 22.593 48.604 -8.631 1.00 13.05 C +ATOM 111 O MET A 45 21.597 49.236 -8.278 1.00 12.84 O +ATOM 112 CB MET A 45 24.536 48.947 -7.075 1.00 13.39 C +ATOM 113 CG MET A 45 25.144 48.553 -5.727 1.00 13.23 C +ATOM 114 SD MET A 45 23.893 48.158 -4.465 1.00 15.58 S +ATOM 115 CE MET A 45 23.315 49.802 -4.036 1.00 14.06 C +ATOM 116 N LEU A 46 22.927 48.466 -9.910 1.00 13.05 N +ATOM 117 CA LEU A 46 22.085 49.063 -10.947 1.00 13.73 C +ATOM 118 C LEU A 46 20.768 48.286 -11.004 1.00 14.80 C +ATOM 119 O LEU A 46 19.686 48.871 -11.138 1.00 14.62 O +ATOM 120 CB LEU A 46 22.776 49.011 -12.315 1.00 13.11 C +ATOM 121 CG LEU A 46 22.020 49.709 -13.456 1.00 11.58 C +ATOM 122 CD1 LEU A 46 22.012 51.218 -13.226 1.00 12.67 C +ATOM 123 CD2 LEU A 46 22.678 49.382 -14.789 1.00 12.26 C +ATOM 124 N GLU A 47 20.865 46.963 -10.890 1.00 15.67 N +ATOM 125 CA GLU A 47 19.680 46.112 -10.924 1.00 17.28 C +ATOM 126 C GLU A 47 18.822 46.412 -9.701 1.00 17.04 C +ATOM 127 O GLU A 47 17.606 46.564 -9.807 1.00 17.59 O +ATOM 128 CB GLU A 47 20.085 44.633 -10.943 1.00 18.06 C +ATOM 129 CG GLU A 47 18.928 43.666 -11.192 1.00 21.12 C +ATOM 130 CD GLU A 47 18.113 43.362 -9.949 1.00 22.51 C +ATOM 131 OE1 GLU A 47 17.000 42.811 -10.091 1.00 23.59 O +ATOM 132 OE2 GLU A 47 18.582 43.655 -8.829 1.00 23.26 O +ATOM 133 N LEU A 48 19.464 46.513 -8.542 1.00 16.82 N +ATOM 134 CA LEU A 48 18.753 46.811 -7.301 1.00 16.96 C +ATOM 135 C LEU A 48 18.020 48.143 -7.416 1.00 16.52 C +ATOM 136 O LEU A 48 16.860 48.259 -7.026 1.00 16.78 O +ATOM 137 CB LEU A 48 19.734 46.867 -6.125 1.00 17.11 C +ATOM 138 CG LEU A 48 19.124 47.152 -4.747 1.00 18.11 C +ATOM 139 CD1 LEU A 48 18.088 46.088 -4.415 1.00 19.15 C +ATOM 140 CD2 LEU A 48 20.219 47.179 -3.691 1.00 19.09 C +ATOM 141 N TYR A 49 18.697 49.147 -7.964 1.00 16.16 N +ATOM 142 CA TYR A 49 18.097 50.467 -8.124 1.00 15.99 C +ATOM 143 C TYR A 49 16.854 50.417 -9.004 1.00 16.91 C +ATOM 144 O TYR A 49 15.882 51.138 -8.771 1.00 15.81 O +ATOM 145 CB TYR A 49 19.125 51.445 -8.710 1.00 15.10 C +ATOM 146 CG TYR A 49 19.679 52.399 -7.676 1.00 14.37 C +ATOM 147 CD1 TYR A 49 20.155 51.927 -6.450 1.00 13.37 C +ATOM 148 CD2 TYR A 49 19.673 53.777 -7.896 1.00 13.71 C +ATOM 149 CE1 TYR A 49 20.603 52.804 -5.464 1.00 13.51 C +ATOM 150 CE2 TYR A 49 20.120 54.664 -6.917 1.00 14.02 C +ATOM 151 CZ TYR A 49 20.578 54.172 -5.703 1.00 13.80 C +ATOM 152 OH TYR A 49 20.976 55.048 -4.720 1.00 14.00 O +ATOM 153 N ASP A 50 16.886 49.550 -10.007 1.00 18.17 N +ATOM 154 CA ASP A 50 15.765 49.404 -10.926 1.00 20.55 C +ATOM 155 C ASP A 50 14.529 48.873 -10.192 1.00 21.35 C +ATOM 156 O ASP A 50 13.406 49.302 -10.464 1.00 20.28 O +ATOM 157 CB ASP A 50 16.153 48.446 -12.058 1.00 21.59 C +ATOM 158 CG ASP A 50 15.330 48.655 -13.315 1.00 23.84 C +ATOM 159 OD1 ASP A 50 15.404 47.791 -14.214 1.00 24.47 O +ATOM 160 OD2 ASP A 50 14.626 49.683 -13.412 1.00 23.97 O +ATOM 161 N ARG A 51 14.745 47.951 -9.255 1.00 22.49 N +ATOM 162 CA ARG A 51 13.656 47.335 -8.492 1.00 23.79 C +ATOM 163 C ARG A 51 13.160 48.091 -7.259 1.00 23.42 C +ATOM 164 O ARG A 51 11.983 48.008 -6.919 1.00 23.44 O +ATOM 165 CB ARG A 51 14.051 45.915 -8.061 1.00 25.98 C +ATOM 166 CG ARG A 51 14.171 44.928 -9.198 1.00 29.02 C +ATOM 167 CD ARG A 51 14.345 43.490 -8.702 1.00 31.62 C +ATOM 168 NE ARG A 51 15.632 43.258 -8.049 1.00 33.58 N +ATOM 169 CZ ARG A 51 15.876 43.459 -6.757 1.00 34.28 C +ATOM 170 NH1 ARG A 51 14.916 43.900 -5.955 1.00 35.39 N +ATOM 171 NH2 ARG A 51 17.085 43.216 -6.268 1.00 34.27 N +ATOM 172 N MET A 52 14.049 48.816 -6.587 1.00 22.73 N +ATOM 173 CA MET A 52 13.680 49.558 -5.380 1.00 23.00 C +ATOM 174 C MET A 52 12.642 50.646 -5.616 1.00 22.34 C +ATOM 175 O MET A 52 12.605 51.260 -6.682 1.00 22.29 O +ATOM 176 CB MET A 52 14.923 50.185 -4.749 1.00 23.41 C +ATOM 177 CG MET A 52 15.891 49.186 -4.157 1.00 24.97 C +ATOM 178 SD MET A 52 17.406 50.003 -3.614 1.00 25.94 S +ATOM 179 CE MET A 52 16.774 51.018 -2.285 1.00 26.36 C +ATOM 180 N SER A 53 11.811 50.891 -4.605 1.00 21.60 N +ATOM 181 CA SER A 53 10.762 51.904 -4.698 1.00 21.57 C +ATOM 182 C SER A 53 11.155 53.235 -4.058 1.00 20.89 C +ATOM 183 O SER A 53 10.524 54.262 -4.310 1.00 20.64 O +ATOM 184 CB SER A 53 9.476 51.382 -4.051 1.00 21.98 C +ATOM 185 OG SER A 53 8.988 50.247 -4.747 1.00 23.60 O +ATOM 186 N PHE A 54 12.188 53.204 -3.222 1.00 20.48 N +ATOM 187 CA PHE A 54 12.688 54.399 -2.545 1.00 19.94 C +ATOM 188 C PHE A 54 11.648 55.187 -1.752 1.00 20.23 C +ATOM 189 O PHE A 54 11.733 56.413 -1.662 1.00 19.07 O +ATOM 190 CB PHE A 54 13.355 55.344 -3.553 1.00 19.44 C +ATOM 191 CG PHE A 54 14.604 54.789 -4.179 1.00 18.48 C +ATOM 192 CD1 PHE A 54 14.530 53.917 -5.261 1.00 18.21 C +ATOM 193 CD2 PHE A 54 15.854 55.135 -3.679 1.00 17.90 C +ATOM 194 CE1 PHE A 54 15.686 53.395 -5.839 1.00 18.22 C +ATOM 195 CE2 PHE A 54 17.020 54.621 -4.245 1.00 18.45 C +ATOM 196 CZ PHE A 54 16.938 53.748 -5.329 1.00 18.73 C +ATOM 197 N LYS A 55 10.670 54.502 -1.169 1.00 20.67 N +ATOM 198 CA LYS A 55 9.660 55.207 -0.388 1.00 21.62 C +ATOM 199 C LYS A 55 10.271 55.651 0.935 1.00 21.78 C +ATOM 200 O LYS A 55 10.930 54.870 1.617 1.00 22.38 O +ATOM 201 CB LYS A 55 8.445 54.309 -0.134 1.00 21.83 C +ATOM 202 CG LYS A 55 7.755 53.846 -1.404 1.00 22.02 C +ATOM 203 CD LYS A 55 7.336 55.018 -2.280 1.00 22.69 C +ATOM 204 CE LYS A 55 6.702 54.530 -3.576 1.00 23.08 C +ATOM 205 NZ LYS A 55 6.203 55.657 -4.416 1.00 22.45 N +ATOM 206 N ASP A 56 10.049 56.911 1.287 1.00 21.80 N +ATOM 207 CA ASP A 56 10.584 57.479 2.516 1.00 22.37 C +ATOM 208 C ASP A 56 9.523 57.493 3.618 1.00 23.20 C +ATOM 209 O ASP A 56 8.963 58.537 3.942 1.00 24.20 O +ATOM 210 CB ASP A 56 11.092 58.899 2.226 1.00 21.35 C +ATOM 211 CG ASP A 56 11.696 59.571 3.440 1.00 20.66 C +ATOM 212 OD1 ASP A 56 12.227 58.864 4.319 1.00 20.49 O +ATOM 213 OD2 ASP A 56 11.652 60.817 3.506 1.00 20.52 O +ATOM 214 N ILE A 57 9.248 56.328 4.196 1.00 23.84 N +ATOM 215 CA ILE A 57 8.244 56.243 5.249 1.00 24.73 C +ATOM 216 C ILE A 57 8.869 56.244 6.638 1.00 24.28 C +ATOM 217 O ILE A 57 10.025 55.861 6.813 1.00 24.60 O +ATOM 218 CB ILE A 57 7.368 54.973 5.105 1.00 25.86 C +ATOM 219 CG1 ILE A 57 8.174 53.730 5.472 1.00 26.51 C +ATOM 220 CG2 ILE A 57 6.852 54.853 3.673 1.00 25.42 C +ATOM 221 CD1 ILE A 57 7.342 52.466 5.533 1.00 28.01 C +ATOM 222 N ASP A 58 8.087 56.683 7.619 1.00 24.16 N +ATOM 223 CA ASP A 58 8.523 56.743 9.010 1.00 23.79 C +ATOM 224 C ASP A 58 8.550 55.332 9.592 1.00 23.19 C +ATOM 225 O ASP A 58 7.503 54.714 9.782 1.00 23.11 O +ATOM 226 CB ASP A 58 7.556 57.624 9.807 1.00 24.75 C +ATOM 227 CG ASP A 58 7.979 57.809 11.254 1.00 25.63 C +ATOM 228 OD1 ASP A 58 7.381 58.670 11.934 1.00 27.55 O +ATOM 229 OD2 ASP A 58 8.893 57.099 11.719 1.00 25.03 O +ATOM 230 N GLY A 59 9.747 54.827 9.873 1.00 21.84 N +ATOM 231 CA GLY A 59 9.872 53.484 10.414 1.00 20.61 C +ATOM 232 C GLY A 59 9.837 53.394 11.930 1.00 19.41 C +ATOM 233 O GLY A 59 10.042 52.319 12.493 1.00 19.42 O +ATOM 234 N GLY A 60 9.574 54.515 12.593 1.00 18.67 N +ATOM 235 CA GLY A 60 9.525 54.523 14.045 1.00 18.72 C +ATOM 236 C GLY A 60 10.791 55.127 14.622 1.00 17.89 C +ATOM 237 O GLY A 60 11.348 56.061 14.043 1.00 18.07 O +ATOM 238 N VAL A 61 11.259 54.607 15.754 1.00 18.07 N +ATOM 239 CA VAL A 61 12.478 55.139 16.353 1.00 17.18 C +ATOM 240 C VAL A 61 13.605 55.071 15.324 1.00 17.50 C +ATOM 241 O VAL A 61 14.430 55.982 15.243 1.00 16.79 O +ATOM 242 CB VAL A 61 12.857 54.390 17.656 1.00 17.33 C +ATOM 243 CG1 VAL A 61 11.810 54.686 18.730 1.00 17.11 C +ATOM 244 CG2 VAL A 61 12.956 52.895 17.412 1.00 17.43 C +ATOM 245 N TRP A 62 13.649 53.992 14.544 1.00 17.45 N +ATOM 246 CA TRP A 62 14.639 53.901 13.476 1.00 17.77 C +ATOM 247 C TRP A 62 13.850 54.511 12.324 1.00 18.42 C +ATOM 248 O TRP A 62 13.191 53.810 11.552 1.00 18.76 O +ATOM 249 CB TRP A 62 15.021 52.448 13.166 1.00 17.39 C +ATOM 250 CG TRP A 62 15.980 52.326 12.001 1.00 17.20 C +ATOM 251 CD1 TRP A 62 16.666 53.344 11.394 1.00 16.92 C +ATOM 252 CD2 TRP A 62 16.333 51.130 11.291 1.00 17.12 C +ATOM 253 NE1 TRP A 62 17.417 52.858 10.349 1.00 17.41 N +ATOM 254 CE2 TRP A 62 17.233 51.502 10.263 1.00 17.00 C +ATOM 255 CE3 TRP A 62 15.976 49.780 11.422 1.00 16.65 C +ATOM 256 CZ2 TRP A 62 17.779 50.573 9.371 1.00 16.39 C +ATOM 257 CZ3 TRP A 62 16.518 48.855 10.535 1.00 16.25 C +ATOM 258 CH2 TRP A 62 17.412 49.257 9.520 1.00 17.05 C +ATOM 259 N LYS A 63 13.904 55.835 12.242 1.00 18.93 N +ATOM 260 CA LYS A 63 13.159 56.592 11.243 1.00 19.51 C +ATOM 261 C LYS A 63 13.180 56.102 9.800 1.00 19.03 C +ATOM 262 O LYS A 63 12.175 56.216 9.091 1.00 19.12 O +ATOM 263 CB LYS A 63 13.588 58.061 11.291 1.00 20.61 C +ATOM 264 CG LYS A 63 13.123 58.808 12.548 1.00 23.11 C +ATOM 265 CD LYS A 63 11.601 58.967 12.573 1.00 25.37 C +ATOM 266 CE LYS A 63 11.120 59.797 13.761 1.00 26.65 C +ATOM 267 NZ LYS A 63 11.453 59.205 15.098 1.00 28.47 N +ATOM 268 N GLN A 64 14.304 55.555 9.356 1.00 18.03 N +ATOM 269 CA GLN A 64 14.403 55.100 7.974 1.00 17.35 C +ATOM 270 C GLN A 64 14.463 53.584 7.815 1.00 16.79 C +ATOM 271 O GLN A 64 14.838 53.071 6.756 1.00 16.51 O +ATOM 272 CB GLN A 64 15.614 55.766 7.319 1.00 16.88 C +ATOM 273 CG GLN A 64 15.514 57.283 7.347 1.00 16.59 C +ATOM 274 CD GLN A 64 16.855 57.967 7.159 1.00 16.74 C +ATOM 275 OE1 GLN A 64 17.819 57.671 7.870 1.00 16.63 O +ATOM 276 NE2 GLN A 64 16.920 58.892 6.206 1.00 15.31 N +ATOM 277 N GLY A 65 14.075 52.878 8.873 1.00 17.02 N +ATOM 278 CA GLY A 65 14.064 51.428 8.845 1.00 17.45 C +ATOM 279 C GLY A 65 12.717 50.880 9.287 1.00 18.41 C +ATOM 280 O GLY A 65 11.684 51.206 8.697 1.00 18.22 O +ATOM 281 N TRP A 66 12.727 50.051 10.325 1.00 18.93 N +ATOM 282 CA TRP A 66 11.500 49.452 10.852 1.00 19.84 C +ATOM 283 C TRP A 66 11.770 49.023 12.288 1.00 20.32 C +ATOM 284 O TRP A 66 12.908 49.104 12.750 1.00 20.54 O +ATOM 285 CB TRP A 66 11.106 48.231 10.009 1.00 19.43 C +ATOM 286 CG TRP A 66 12.029 47.044 10.177 1.00 19.20 C +ATOM 287 CD1 TRP A 66 11.896 46.022 11.075 1.00 19.00 C +ATOM 288 CD2 TRP A 66 13.228 46.775 9.441 1.00 18.87 C +ATOM 289 NE1 TRP A 66 12.936 45.134 10.943 1.00 19.25 N +ATOM 290 CE2 TRP A 66 13.770 45.571 9.948 1.00 18.70 C +ATOM 291 CE3 TRP A 66 13.901 47.435 8.401 1.00 18.92 C +ATOM 292 CZ2 TRP A 66 14.954 45.010 9.452 1.00 19.13 C +ATOM 293 CZ3 TRP A 66 15.078 46.879 7.907 1.00 18.67 C +ATOM 294 CH2 TRP A 66 15.594 45.676 8.434 1.00 18.98 C +ATOM 295 N ASN A 67 10.734 48.578 12.997 1.00 21.03 N +ATOM 296 CA ASN A 67 10.908 48.126 14.377 1.00 21.52 C +ATOM 297 C ASN A 67 11.529 46.736 14.367 1.00 21.49 C +ATOM 298 O ASN A 67 10.856 45.742 14.082 1.00 20.91 O +ATOM 299 CB ASN A 67 9.567 48.079 15.120 1.00 23.07 C +ATOM 300 CG ASN A 67 8.994 49.458 15.382 1.00 24.08 C +ATOM 301 OD1 ASN A 67 9.728 50.408 15.655 1.00 25.03 O +ATOM 302 ND2 ASN A 67 7.671 49.570 15.321 1.00 24.96 N +ATOM 303 N ILE A 68 12.818 46.667 14.679 1.00 21.23 N +ATOM 304 CA ILE A 68 13.522 45.394 14.679 1.00 21.06 C +ATOM 305 C ILE A 68 13.074 44.488 15.819 1.00 22.16 C +ATOM 306 O ILE A 68 12.961 44.922 16.965 1.00 21.35 O +ATOM 307 CB ILE A 68 15.046 45.603 14.794 1.00 20.60 C +ATOM 308 CG1 ILE A 68 15.541 46.485 13.642 1.00 19.51 C +ATOM 309 CG2 ILE A 68 15.755 44.257 14.772 1.00 20.32 C +ATOM 310 CD1 ILE A 68 16.995 46.906 13.772 1.00 19.01 C +ATOM 311 N LYS A 69 12.817 43.227 15.487 1.00 22.93 N +ATOM 312 CA LYS A 69 12.400 42.239 16.474 1.00 24.22 C +ATOM 313 C LYS A 69 13.399 41.089 16.441 1.00 23.83 C +ATOM 314 O LYS A 69 13.972 40.788 15.396 1.00 22.73 O +ATOM 315 CB LYS A 69 10.989 41.727 16.153 1.00 26.19 C +ATOM 316 CG LYS A 69 9.907 42.792 16.303 1.00 28.71 C +ATOM 317 CD LYS A 69 8.527 42.287 15.889 1.00 31.39 C +ATOM 318 CE LYS A 69 8.472 41.940 14.405 1.00 33.05 C +ATOM 319 NZ LYS A 69 7.072 41.697 13.934 1.00 34.34 N +ATOM 320 N TYR A 70 13.622 40.460 17.589 1.00 23.76 N +ATOM 321 CA TYR A 70 14.555 39.346 17.658 1.00 24.15 C +ATOM 322 C TYR A 70 14.068 38.291 18.641 1.00 25.10 C +ATOM 323 O TYR A 70 13.304 38.587 19.560 1.00 25.14 O +ATOM 324 CB TYR A 70 15.950 39.842 18.066 1.00 22.99 C +ATOM 325 CG TYR A 70 16.029 40.444 19.452 1.00 22.19 C +ATOM 326 CD1 TYR A 70 16.261 39.646 20.574 1.00 21.94 C +ATOM 327 CD2 TYR A 70 15.854 41.812 19.646 1.00 21.75 C +ATOM 328 CE1 TYR A 70 16.317 40.198 21.850 1.00 21.91 C +ATOM 329 CE2 TYR A 70 15.905 42.372 20.916 1.00 21.83 C +ATOM 330 CZ TYR A 70 16.136 41.562 22.013 1.00 22.08 C +ATOM 331 OH TYR A 70 16.171 42.121 23.270 1.00 21.93 O +ATOM 332 N ASP A 71 14.505 37.058 18.426 1.00 26.03 N +ATOM 333 CA ASP A 71 14.137 35.952 19.296 1.00 27.31 C +ATOM 334 C ASP A 71 15.171 35.881 20.414 1.00 27.86 C +ATOM 335 O ASP A 71 16.330 35.550 20.178 1.00 27.89 O +ATOM 336 CB ASP A 71 14.113 34.648 18.495 1.00 28.12 C +ATOM 337 CG ASP A 71 13.866 33.431 19.362 1.00 29.16 C +ATOM 338 OD1 ASP A 71 13.360 33.591 20.494 1.00 29.60 O +ATOM 339 OD2 ASP A 71 14.169 32.310 18.903 1.00 30.07 O +ATOM 340 N PRO A 72 14.764 36.204 21.651 1.00 28.75 N +ATOM 341 CA PRO A 72 15.691 36.168 22.786 1.00 29.04 C +ATOM 342 C PRO A 72 16.439 34.849 22.948 1.00 29.30 C +ATOM 343 O PRO A 72 17.552 34.819 23.476 1.00 29.22 O +ATOM 344 CB PRO A 72 14.791 36.493 23.981 1.00 29.12 C +ATOM 345 CG PRO A 72 13.446 36.002 23.545 1.00 29.91 C +ATOM 346 CD PRO A 72 13.387 36.461 22.108 1.00 28.91 C +ATOM 347 N LEU A 73 15.838 33.761 22.476 1.00 29.07 N +ATOM 348 CA LEU A 73 16.464 32.449 22.590 1.00 29.29 C +ATOM 349 C LEU A 73 17.535 32.199 21.534 1.00 29.04 C +ATOM 350 O LEU A 73 18.188 31.158 21.544 1.00 28.38 O +ATOM 351 CB LEU A 73 15.402 31.350 22.517 1.00 29.71 C +ATOM 352 CG LEU A 73 14.402 31.334 23.675 1.00 30.24 C +ATOM 353 CD1 LEU A 73 13.400 30.210 23.470 1.00 30.85 C +ATOM 354 CD2 LEU A 73 15.147 31.157 24.993 1.00 30.94 C +ATOM 355 N LYS A 74 17.720 33.153 20.628 1.00 28.90 N +ATOM 356 CA LYS A 74 18.724 33.006 19.581 1.00 29.16 C +ATOM 357 C LYS A 74 20.110 32.813 20.191 1.00 29.06 C +ATOM 358 O LYS A 74 20.906 32.006 19.713 1.00 28.48 O +ATOM 359 CB LYS A 74 18.727 34.235 18.673 1.00 29.59 C +ATOM 360 CG LYS A 74 19.677 34.129 17.492 1.00 30.89 C +ATOM 361 CD LYS A 74 19.506 35.305 16.546 1.00 31.68 C +ATOM 362 CE LYS A 74 20.368 35.144 15.306 1.00 32.74 C +ATOM 363 NZ LYS A 74 20.184 36.275 14.355 1.00 33.06 N +ATOM 364 N TYR A 75 20.394 33.560 21.250 1.00 29.64 N +ATOM 365 CA TYR A 75 21.682 33.461 21.920 1.00 30.21 C +ATOM 366 C TYR A 75 21.534 32.729 23.249 1.00 30.22 C +ATOM 367 O TYR A 75 20.530 32.886 23.943 1.00 29.48 O +ATOM 368 CB TYR A 75 22.272 34.859 22.138 1.00 30.84 C +ATOM 369 CG TYR A 75 22.559 35.585 20.842 1.00 31.74 C +ATOM 370 CD1 TYR A 75 21.675 36.540 20.336 1.00 32.75 C +ATOM 371 CD2 TYR A 75 23.686 35.268 20.087 1.00 32.40 C +ATOM 372 CE1 TYR A 75 21.907 37.157 19.104 1.00 33.07 C +ATOM 373 CE2 TYR A 75 23.925 35.875 18.857 1.00 33.57 C +ATOM 374 CZ TYR A 75 23.033 36.815 18.371 1.00 33.54 C +ATOM 375 OH TYR A 75 23.266 37.389 17.141 1.00 35.15 O +ATOM 376 N ASN A 76 22.531 31.916 23.584 1.00 30.68 N +ATOM 377 CA ASN A 76 22.521 31.154 24.828 1.00 31.98 C +ATOM 378 C ASN A 76 23.948 30.798 25.232 1.00 32.32 C +ATOM 379 O ASN A 76 24.905 31.194 24.568 1.00 32.16 O +ATOM 380 CB ASN A 76 21.695 29.875 24.670 1.00 33.03 C +ATOM 381 CG ASN A 76 22.382 28.842 23.805 1.00 34.12 C +ATOM 382 OD1 ASN A 76 22.646 29.076 22.629 1.00 35.55 O +ATOM 383 ND2 ASN A 76 22.679 27.685 24.388 1.00 36.18 N +ATOM 384 N ALA A 77 24.083 30.041 26.317 1.00 32.84 N +ATOM 385 CA ALA A 77 25.393 29.643 26.824 1.00 33.42 C +ATOM 386 C ALA A 77 26.310 29.030 25.767 1.00 33.80 C +ATOM 387 O ALA A 77 27.530 29.178 25.837 1.00 34.32 O +ATOM 388 CB ALA A 77 25.222 28.668 27.985 1.00 33.92 C +ATOM 389 N HIS A 78 25.726 28.348 24.789 1.00 33.88 N +ATOM 390 CA HIS A 78 26.515 27.703 23.743 1.00 34.26 C +ATOM 391 C HIS A 78 26.699 28.575 22.507 1.00 33.18 C +ATOM 392 O HIS A 78 27.470 28.236 21.609 1.00 33.28 O +ATOM 393 CB HIS A 78 25.859 26.378 23.345 1.00 35.96 C +ATOM 394 CG HIS A 78 25.596 25.466 24.502 1.00 37.85 C +ATOM 395 ND1 HIS A 78 26.595 25.022 25.342 1.00 39.12 N +ATOM 396 CD2 HIS A 78 24.445 24.925 24.967 1.00 38.67 C +ATOM 397 CE1 HIS A 78 26.071 24.248 26.275 1.00 39.72 C +ATOM 398 NE2 HIS A 78 24.767 24.172 26.070 1.00 39.67 N +ATOM 399 N HIS A 79 25.994 29.701 22.468 1.00 31.64 N +ATOM 400 CA HIS A 79 26.076 30.617 21.336 1.00 29.62 C +ATOM 401 C HIS A 79 25.850 32.049 21.821 1.00 27.90 C +ATOM 402 O HIS A 79 24.727 32.548 21.815 1.00 27.52 O +ATOM 403 CB HIS A 79 25.027 30.221 20.291 1.00 29.75 C +ATOM 404 CG HIS A 79 25.105 31.008 19.021 1.00 30.28 C +ATOM 405 ND1 HIS A 79 24.280 32.080 18.756 1.00 30.40 N +ATOM 406 CD2 HIS A 79 25.919 30.885 17.946 1.00 30.43 C +ATOM 407 CE1 HIS A 79 24.583 32.582 17.572 1.00 30.48 C +ATOM 408 NE2 HIS A 79 25.574 31.875 17.060 1.00 29.90 N +ATOM 409 N LYS A 80 26.931 32.698 22.243 1.00 25.92 N +ATOM 410 CA LYS A 80 26.866 34.063 22.758 1.00 24.37 C +ATOM 411 C LYS A 80 27.122 35.127 21.696 1.00 23.13 C +ATOM 412 O LYS A 80 27.748 34.861 20.669 1.00 22.12 O +ATOM 413 CB LYS A 80 27.895 34.255 23.874 1.00 25.51 C +ATOM 414 CG LYS A 80 27.769 33.297 25.051 1.00 26.96 C +ATOM 415 CD LYS A 80 28.839 33.613 26.088 1.00 28.40 C +ATOM 416 CE LYS A 80 28.788 32.653 27.266 1.00 30.05 C +ATOM 417 NZ LYS A 80 29.867 32.953 28.259 1.00 31.24 N +ATOM 418 N LEU A 81 26.631 36.335 21.964 1.00 20.95 N +ATOM 419 CA LEU A 81 26.823 37.470 21.071 1.00 19.57 C +ATOM 420 C LEU A 81 28.096 38.173 21.530 1.00 19.29 C +ATOM 421 O LEU A 81 28.169 38.661 22.659 1.00 18.46 O +ATOM 422 CB LEU A 81 25.636 38.439 21.165 1.00 18.83 C +ATOM 423 CG LEU A 81 25.716 39.696 20.290 1.00 18.83 C +ATOM 424 CD1 LEU A 81 25.670 39.301 18.815 1.00 17.98 C +ATOM 425 CD2 LEU A 81 24.564 40.636 20.621 1.00 18.24 C +ATOM 426 N LYS A 82 29.104 38.195 20.665 1.00 18.49 N +ATOM 427 CA LYS A 82 30.375 38.842 20.977 1.00 18.31 C +ATOM 428 C LYS A 82 30.281 40.289 20.515 1.00 17.70 C +ATOM 429 O LYS A 82 30.107 40.554 19.326 1.00 17.21 O +ATOM 430 CB LYS A 82 31.518 38.128 20.248 1.00 20.59 C +ATOM 431 CG LYS A 82 31.742 36.694 20.717 1.00 23.57 C +ATOM 432 CD LYS A 82 32.629 35.901 19.759 1.00 26.69 C +ATOM 433 CE LYS A 82 34.044 36.452 19.693 1.00 28.36 C +ATOM 434 NZ LYS A 82 34.870 35.693 18.710 1.00 31.00 N +ATOM 435 N VAL A 83 30.394 41.222 21.455 1.00 16.13 N +ATOM 436 CA VAL A 83 30.290 42.636 21.125 1.00 15.53 C +ATOM 437 C VAL A 83 31.620 43.373 21.232 1.00 15.44 C +ATOM 438 O VAL A 83 32.304 43.299 22.253 1.00 15.48 O +ATOM 439 CB VAL A 83 29.262 43.346 22.047 1.00 14.75 C +ATOM 440 CG1 VAL A 83 29.133 44.812 21.660 1.00 13.70 C +ATOM 441 CG2 VAL A 83 27.904 42.655 21.947 1.00 15.05 C +ATOM 442 N PHE A 84 31.978 44.085 20.168 1.00 15.25 N +ATOM 443 CA PHE A 84 33.209 44.868 20.147 1.00 14.99 C +ATOM 444 C PHE A 84 32.879 46.356 20.070 1.00 14.55 C +ATOM 445 O PHE A 84 32.345 46.823 19.065 1.00 14.61 O +ATOM 446 CB PHE A 84 34.082 44.493 18.947 1.00 16.19 C +ATOM 447 CG PHE A 84 34.769 43.167 19.083 1.00 17.36 C +ATOM 448 CD1 PHE A 84 34.326 42.060 18.365 1.00 18.12 C +ATOM 449 CD2 PHE A 84 35.867 43.024 19.928 1.00 18.57 C +ATOM 450 CE1 PHE A 84 34.972 40.826 18.485 1.00 18.75 C +ATOM 451 CE2 PHE A 84 36.520 41.799 20.056 1.00 18.94 C +ATOM 452 CZ PHE A 84 36.072 40.697 19.333 1.00 19.32 C +ATOM 453 N VAL A 85 33.189 47.085 21.140 1.00 13.43 N +ATOM 454 CA VAL A 85 32.960 48.528 21.204 1.00 13.57 C +ATOM 455 C VAL A 85 34.271 49.166 20.768 1.00 12.28 C +ATOM 456 O VAL A 85 35.286 49.052 21.454 1.00 12.57 O +ATOM 457 CB VAL A 85 32.606 48.977 22.639 1.00 13.14 C +ATOM 458 CG1 VAL A 85 32.415 50.495 22.689 1.00 13.45 C +ATOM 459 CG2 VAL A 85 31.330 48.271 23.089 1.00 13.81 C +ATOM 460 N VAL A 86 34.239 49.840 19.623 1.00 12.15 N +ATOM 461 CA VAL A 86 35.438 50.443 19.059 1.00 12.22 C +ATOM 462 C VAL A 86 35.505 51.968 19.172 1.00 11.46 C +ATOM 463 O VAL A 86 34.868 52.686 18.401 1.00 11.04 O +ATOM 464 CB VAL A 86 35.572 50.035 17.571 1.00 12.96 C +ATOM 465 CG1 VAL A 86 36.899 50.524 17.000 1.00 11.89 C +ATOM 466 CG2 VAL A 86 35.445 48.516 17.437 1.00 13.24 C +ATOM 467 N PRO A 87 36.293 52.477 20.134 1.00 10.98 N +ATOM 468 CA PRO A 87 36.449 53.922 20.345 1.00 11.12 C +ATOM 469 C PRO A 87 37.146 54.567 19.148 1.00 11.39 C +ATOM 470 O PRO A 87 38.125 54.020 18.627 1.00 11.32 O +ATOM 471 CB PRO A 87 37.307 54.000 21.610 1.00 10.81 C +ATOM 472 CG PRO A 87 37.006 52.695 22.314 1.00 10.89 C +ATOM 473 CD PRO A 87 37.013 51.722 21.172 1.00 10.89 C +ATOM 474 N HIS A 88 36.647 55.723 18.716 1.00 11.08 N +ATOM 475 CA HIS A 88 37.236 56.424 17.577 1.00 11.92 C +ATOM 476 C HIS A 88 37.017 57.931 17.663 1.00 12.62 C +ATOM 477 O HIS A 88 36.205 58.417 18.454 1.00 12.20 O +ATOM 478 CB HIS A 88 36.663 55.879 16.259 1.00 11.44 C +ATOM 479 CG HIS A 88 35.213 56.187 16.052 1.00 12.14 C +ATOM 480 ND1 HIS A 88 34.778 57.313 15.385 1.00 11.22 N +ATOM 481 CD2 HIS A 88 34.098 55.519 16.430 1.00 11.67 C +ATOM 482 CE1 HIS A 88 33.458 57.324 15.361 1.00 12.08 C +ATOM 483 NE2 HIS A 88 33.020 56.246 15.988 1.00 11.43 N +ATOM 484 N SER A 89 37.754 58.665 16.839 1.00 12.23 N +ATOM 485 CA SER A 89 37.672 60.117 16.825 1.00 11.95 C +ATOM 486 C SER A 89 37.855 60.573 15.386 1.00 12.06 C +ATOM 487 O SER A 89 38.931 60.416 14.809 1.00 12.80 O +ATOM 488 CB SER A 89 38.774 60.697 17.722 1.00 11.65 C +ATOM 489 OG SER A 89 38.737 62.112 17.756 1.00 12.47 O +ATOM 490 N HIS A 90 36.794 61.125 14.806 1.00 11.80 N +ATOM 491 CA HIS A 90 36.838 61.589 13.426 1.00 11.77 C +ATOM 492 C HIS A 90 37.495 62.965 13.354 1.00 11.83 C +ATOM 493 O HIS A 90 36.920 63.966 13.794 1.00 12.20 O +ATOM 494 CB HIS A 90 35.417 61.639 12.854 1.00 10.56 C +ATOM 495 CG HIS A 90 35.370 61.923 11.387 1.00 9.97 C +ATOM 496 ND1 HIS A 90 35.987 61.117 10.455 1.00 10.67 N +ATOM 497 CD2 HIS A 90 34.794 62.930 10.691 1.00 9.37 C +ATOM 498 CE1 HIS A 90 35.794 61.616 9.248 1.00 10.03 C +ATOM 499 NE2 HIS A 90 35.073 62.716 9.364 1.00 10.05 N +ATOM 500 N ASN A 91 38.706 63.003 12.803 1.00 11.98 N +ATOM 501 CA ASN A 91 39.469 64.242 12.678 1.00 12.08 C +ATOM 502 C ASN A 91 39.632 64.672 11.225 1.00 12.51 C +ATOM 503 O ASN A 91 40.326 64.017 10.448 1.00 12.90 O +ATOM 504 CB ASN A 91 40.860 64.080 13.302 1.00 12.43 C +ATOM 505 CG ASN A 91 40.814 63.944 14.810 1.00 12.73 C +ATOM 506 OD1 ASN A 91 40.211 63.015 15.348 1.00 14.45 O +ATOM 507 ND2 ASN A 91 41.458 64.874 15.501 1.00 10.93 N +ATOM 508 N ASP A 92 38.998 65.784 10.873 1.00 11.67 N +ATOM 509 CA ASP A 92 39.065 66.310 9.518 1.00 12.44 C +ATOM 510 C ASP A 92 40.294 67.172 9.284 1.00 12.31 C +ATOM 511 O ASP A 92 40.524 68.138 10.006 1.00 12.75 O +ATOM 512 CB ASP A 92 37.829 67.157 9.225 1.00 11.91 C +ATOM 513 CG ASP A 92 36.557 66.378 9.382 1.00 12.41 C +ATOM 514 OD1 ASP A 92 36.331 65.468 8.564 1.00 12.26 O +ATOM 515 OD2 ASP A 92 35.801 66.669 10.330 1.00 13.57 O +ATOM 516 N PRO A 93 41.114 66.814 8.283 1.00 12.88 N +ATOM 517 CA PRO A 93 42.311 67.605 7.983 1.00 13.02 C +ATOM 518 C PRO A 93 41.825 68.879 7.289 1.00 13.33 C +ATOM 519 O PRO A 93 42.161 69.147 6.133 1.00 13.80 O +ATOM 520 CB PRO A 93 43.102 66.697 7.044 1.00 12.88 C +ATOM 521 CG PRO A 93 42.680 65.312 7.476 1.00 14.10 C +ATOM 522 CD PRO A 93 41.190 65.492 7.640 1.00 12.79 C +ATOM 523 N GLY A 94 41.007 69.641 8.010 1.00 12.76 N +ATOM 524 CA GLY A 94 40.446 70.869 7.483 1.00 12.32 C +ATOM 525 C GLY A 94 38.966 70.726 7.160 1.00 12.48 C +ATOM 526 O GLY A 94 38.530 69.698 6.636 1.00 10.80 O +ATOM 527 N TRP A 95 38.193 71.752 7.506 1.00 12.40 N +ATOM 528 CA TRP A 95 36.757 71.811 7.232 1.00 13.33 C +ATOM 529 C TRP A 95 36.244 73.194 7.621 1.00 14.29 C +ATOM 530 O TRP A 95 36.123 74.071 6.769 1.00 13.32 O +ATOM 531 CB TRP A 95 35.966 70.741 7.995 1.00 12.83 C +ATOM 532 CG TRP A 95 34.484 70.811 7.671 1.00 12.67 C +ATOM 533 CD1 TRP A 95 33.929 71.144 6.466 1.00 12.27 C +ATOM 534 CD2 TRP A 95 33.383 70.522 8.550 1.00 12.58 C +ATOM 535 NE1 TRP A 95 32.557 71.081 6.538 1.00 12.83 N +ATOM 536 CE2 TRP A 95 32.195 70.700 7.804 1.00 12.25 C +ATOM 537 CE3 TRP A 95 33.286 70.126 9.893 1.00 12.59 C +ATOM 538 CZ2 TRP A 95 30.922 70.497 8.355 1.00 12.77 C +ATOM 539 CZ3 TRP A 95 32.015 69.923 10.443 1.00 12.70 C +ATOM 540 CH2 TRP A 95 30.854 70.109 9.672 1.00 13.05 C +ATOM 541 N ILE A 96 35.933 73.387 8.903 1.00 15.87 N +ATOM 542 CA ILE A 96 35.470 74.695 9.362 1.00 17.19 C +ATOM 543 C ILE A 96 36.653 75.456 9.954 1.00 17.19 C +ATOM 544 O ILE A 96 36.561 76.643 10.267 1.00 17.26 O +ATOM 545 CB ILE A 96 34.329 74.586 10.397 1.00 19.05 C +ATOM 546 CG1 ILE A 96 34.750 73.701 11.567 1.00 20.64 C +ATOM 547 CG2 ILE A 96 33.073 74.051 9.716 1.00 18.72 C +ATOM 548 CD1 ILE A 96 33.742 73.675 12.693 1.00 23.80 C +ATOM 549 N GLN A 97 37.765 74.741 10.098 1.00 16.68 N +ATOM 550 CA GLN A 97 39.025 75.293 10.579 1.00 16.58 C +ATOM 551 C GLN A 97 40.065 74.685 9.642 1.00 14.95 C +ATOM 552 O GLN A 97 39.792 73.685 8.980 1.00 14.14 O +ATOM 553 CB GLN A 97 39.324 74.856 12.018 1.00 18.41 C +ATOM 554 CG GLN A 97 38.434 75.488 13.086 1.00 22.32 C +ATOM 555 CD GLN A 97 38.927 75.196 14.498 1.00 25.03 C +ATOM 556 OE1 GLN A 97 40.057 75.538 14.858 1.00 27.69 O +ATOM 557 NE2 GLN A 97 38.082 74.559 15.304 1.00 27.33 N +ATOM 558 N THR A 98 41.247 75.283 9.569 1.00 13.85 N +ATOM 559 CA THR A 98 42.291 74.741 8.708 1.00 12.90 C +ATOM 560 C THR A 98 42.938 73.550 9.409 1.00 12.87 C +ATOM 561 O THR A 98 42.704 73.311 10.598 1.00 12.91 O +ATOM 562 CB THR A 98 43.400 75.763 8.452 1.00 12.40 C +ATOM 563 OG1 THR A 98 44.035 76.074 9.694 1.00 13.77 O +ATOM 564 CG2 THR A 98 42.838 77.040 7.832 1.00 11.59 C +ATOM 565 N PHE A 99 43.753 72.810 8.667 1.00 12.19 N +ATOM 566 CA PHE A 99 44.460 71.665 9.222 1.00 12.51 C +ATOM 567 C PHE A 99 45.210 72.087 10.487 1.00 12.91 C +ATOM 568 O PHE A 99 45.054 71.477 11.540 1.00 13.41 O +ATOM 569 CB PHE A 99 45.468 71.119 8.205 1.00 11.85 C +ATOM 570 CG PHE A 99 46.347 70.016 8.745 1.00 12.28 C +ATOM 571 CD1 PHE A 99 45.936 68.686 8.691 1.00 12.14 C +ATOM 572 CD2 PHE A 99 47.589 70.310 9.307 1.00 11.83 C +ATOM 573 CE1 PHE A 99 46.749 67.662 9.187 1.00 12.73 C +ATOM 574 CE2 PHE A 99 48.409 69.296 9.806 1.00 12.68 C +ATOM 575 CZ PHE A 99 47.987 67.966 9.745 1.00 12.58 C +ATOM 576 N GLU A 100 46.025 73.133 10.370 1.00 13.59 N +ATOM 577 CA GLU A 100 46.818 73.618 11.500 1.00 14.57 C +ATOM 578 C GLU A 100 45.974 74.136 12.664 1.00 14.84 C +ATOM 579 O GLU A 100 46.332 73.937 13.825 1.00 14.69 O +ATOM 580 CB GLU A 100 47.786 74.710 11.032 1.00 14.81 C +ATOM 581 CG GLU A 100 48.841 75.116 12.059 1.00 16.15 C +ATOM 582 CD GLU A 100 49.751 73.969 12.471 1.00 17.18 C +ATOM 583 OE1 GLU A 100 49.924 73.019 11.674 1.00 16.43 O +ATOM 584 OE2 GLU A 100 50.311 74.029 13.589 1.00 18.13 O +ATOM 585 N GLU A 101 44.860 74.799 12.362 1.00 14.90 N +ATOM 586 CA GLU A 101 43.989 75.314 13.419 1.00 14.80 C +ATOM 587 C GLU A 101 43.417 74.144 14.224 1.00 14.64 C +ATOM 588 O GLU A 101 43.413 74.168 15.456 1.00 14.01 O +ATOM 589 CB GLU A 101 42.849 76.150 12.822 1.00 15.87 C +ATOM 590 CG GLU A 101 43.309 77.447 12.156 1.00 16.98 C +ATOM 591 CD GLU A 101 42.156 78.271 11.598 1.00 17.95 C +ATOM 592 OE1 GLU A 101 41.223 77.680 11.016 1.00 16.38 O +ATOM 593 OE2 GLU A 101 42.191 79.514 11.731 1.00 18.50 O +ATOM 594 N TYR A 102 42.931 73.120 13.527 1.00 13.67 N +ATOM 595 CA TYR A 102 42.386 71.946 14.206 1.00 14.11 C +ATOM 596 C TYR A 102 43.481 71.246 15.002 1.00 14.07 C +ATOM 597 O TYR A 102 43.255 70.793 16.126 1.00 13.32 O +ATOM 598 CB TYR A 102 41.823 70.933 13.210 1.00 14.28 C +ATOM 599 CG TYR A 102 40.411 71.171 12.734 1.00 14.30 C +ATOM 600 CD1 TYR A 102 39.358 71.349 13.636 1.00 14.76 C +ATOM 601 CD2 TYR A 102 40.111 71.121 11.373 1.00 14.37 C +ATOM 602 CE1 TYR A 102 38.036 71.460 13.184 1.00 14.60 C +ATOM 603 CE2 TYR A 102 38.812 71.230 10.917 1.00 14.32 C +ATOM 604 CZ TYR A 102 37.777 71.398 11.821 1.00 14.23 C +ATOM 605 OH TYR A 102 36.495 71.491 11.336 1.00 13.76 O +ATOM 606 N TYR A 103 44.663 71.136 14.406 1.00 14.00 N +ATOM 607 CA TYR A 103 45.763 70.470 15.085 1.00 14.81 C +ATOM 608 C TYR A 103 46.087 71.149 16.408 1.00 15.61 C +ATOM 609 O TYR A 103 46.218 70.491 17.438 1.00 15.68 O +ATOM 610 CB TYR A 103 47.023 70.461 14.218 1.00 13.35 C +ATOM 611 CG TYR A 103 48.189 69.802 14.916 1.00 13.86 C +ATOM 612 CD1 TYR A 103 48.192 68.428 15.160 1.00 13.70 C +ATOM 613 CD2 TYR A 103 49.262 70.558 15.392 1.00 14.32 C +ATOM 614 CE1 TYR A 103 49.231 67.825 15.863 1.00 13.48 C +ATOM 615 CE2 TYR A 103 50.305 69.965 16.097 1.00 14.28 C +ATOM 616 CZ TYR A 103 50.282 68.599 16.331 1.00 14.10 C +ATOM 617 OH TYR A 103 51.303 68.008 17.040 1.00 14.76 O +ATOM 618 N GLN A 104 46.212 72.470 16.372 1.00 16.28 N +ATOM 619 CA GLN A 104 46.546 73.234 17.567 1.00 17.23 C +ATOM 620 C GLN A 104 45.440 73.262 18.612 1.00 17.92 C +ATOM 621 O GLN A 104 45.708 73.161 19.807 1.00 17.74 O +ATOM 622 CB GLN A 104 46.908 74.677 17.189 1.00 17.59 C +ATOM 623 CG GLN A 104 48.229 74.830 16.442 1.00 16.54 C +ATOM 624 CD GLN A 104 49.411 74.287 17.228 1.00 18.02 C +ATOM 625 OE1 GLN A 104 49.455 74.387 18.457 1.00 17.68 O +ATOM 626 NE2 GLN A 104 50.383 73.717 16.521 1.00 16.40 N +ATOM 627 N HIS A 105 44.198 73.388 18.161 1.00 18.39 N +ATOM 628 CA HIS A 105 43.068 73.476 19.077 1.00 19.49 C +ATOM 629 C HIS A 105 42.491 72.150 19.564 1.00 18.94 C +ATOM 630 O HIS A 105 42.005 72.068 20.691 1.00 18.47 O +ATOM 631 CB HIS A 105 41.935 74.280 18.428 1.00 22.28 C +ATOM 632 CG HIS A 105 42.370 75.594 17.855 1.00 25.33 C +ATOM 633 ND1 HIS A 105 41.512 76.422 17.162 1.00 27.31 N +ATOM 634 CD2 HIS A 105 43.570 76.222 17.865 1.00 26.87 C +ATOM 635 CE1 HIS A 105 42.165 77.501 16.770 1.00 27.58 C +ATOM 636 NE2 HIS A 105 43.416 77.404 17.183 1.00 27.73 N +ATOM 637 N ASP A 106 42.551 71.113 18.731 1.00 17.31 N +ATOM 638 CA ASP A 106 41.952 69.836 19.102 1.00 16.73 C +ATOM 639 C ASP A 106 42.788 68.567 18.972 1.00 15.91 C +ATOM 640 O ASP A 106 43.056 67.888 19.960 1.00 15.69 O +ATOM 641 CB ASP A 106 40.664 69.640 18.293 1.00 17.06 C +ATOM 642 CG ASP A 106 39.646 70.734 18.543 1.00 18.52 C +ATOM 643 OD1 ASP A 106 38.957 70.677 19.580 1.00 19.17 O +ATOM 644 OD2 ASP A 106 39.544 71.656 17.706 1.00 19.14 O +ATOM 645 N THR A 107 43.190 68.251 17.747 1.00 14.98 N +ATOM 646 CA THR A 107 43.930 67.027 17.469 1.00 13.55 C +ATOM 647 C THR A 107 45.182 66.711 18.285 1.00 13.77 C +ATOM 648 O THR A 107 45.368 65.567 18.701 1.00 12.64 O +ATOM 649 CB THR A 107 44.289 66.944 15.981 1.00 13.52 C +ATOM 650 OG1 THR A 107 43.104 67.151 15.201 1.00 12.29 O +ATOM 651 CG2 THR A 107 44.866 65.565 15.649 1.00 12.34 C +ATOM 652 N LYS A 108 46.051 67.688 18.516 1.00 13.50 N +ATOM 653 CA LYS A 108 47.252 67.369 19.281 1.00 14.57 C +ATOM 654 C LYS A 108 46.889 66.968 20.707 1.00 14.28 C +ATOM 655 O LYS A 108 47.587 66.175 21.330 1.00 14.34 O +ATOM 656 CB LYS A 108 48.248 68.539 19.279 1.00 14.81 C +ATOM 657 CG LYS A 108 47.853 69.755 20.094 1.00 16.00 C +ATOM 658 CD LYS A 108 48.937 70.829 19.980 1.00 16.35 C +ATOM 659 CE LYS A 108 48.697 71.987 20.935 1.00 16.81 C +ATOM 660 NZ LYS A 108 49.803 72.990 20.871 1.00 16.94 N +ATOM 661 N HIS A 109 45.788 67.508 21.215 1.00 14.87 N +ATOM 662 CA HIS A 109 45.342 67.181 22.567 1.00 15.31 C +ATOM 663 C HIS A 109 44.702 65.799 22.573 1.00 14.78 C +ATOM 664 O HIS A 109 44.872 65.025 23.515 1.00 14.27 O +ATOM 665 CB HIS A 109 44.349 68.232 23.053 1.00 16.92 C +ATOM 666 CG HIS A 109 44.916 69.615 23.083 1.00 18.62 C +ATOM 667 ND1 HIS A 109 45.933 69.982 23.940 1.00 19.72 N +ATOM 668 CD2 HIS A 109 44.640 70.709 22.334 1.00 19.06 C +ATOM 669 CE1 HIS A 109 46.258 71.243 23.717 1.00 20.16 C +ATOM 670 NE2 HIS A 109 45.489 71.706 22.748 1.00 20.28 N +ATOM 671 N ILE A 110 43.967 65.494 21.511 1.00 14.36 N +ATOM 672 CA ILE A 110 43.320 64.195 21.380 1.00 13.64 C +ATOM 673 C ILE A 110 44.379 63.096 21.353 1.00 13.50 C +ATOM 674 O ILE A 110 44.259 62.081 22.041 1.00 12.81 O +ATOM 675 CB ILE A 110 42.492 64.120 20.077 1.00 14.32 C +ATOM 676 CG1 ILE A 110 41.299 65.079 20.170 1.00 14.21 C +ATOM 677 CG2 ILE A 110 42.046 62.683 19.824 1.00 13.79 C +ATOM 678 CD1 ILE A 110 40.507 65.219 18.875 1.00 14.00 C +ATOM 679 N LEU A 111 45.422 63.300 20.559 1.00 13.09 N +ATOM 680 CA LEU A 111 46.481 62.308 20.453 1.00 13.59 C +ATOM 681 C LEU A 111 47.340 62.242 21.706 1.00 14.03 C +ATOM 682 O LEU A 111 47.783 61.162 22.106 1.00 14.42 O +ATOM 683 CB LEU A 111 47.349 62.592 19.220 1.00 13.59 C +ATOM 684 CG LEU A 111 46.620 62.276 17.909 1.00 13.18 C +ATOM 685 CD1 LEU A 111 47.447 62.733 16.713 1.00 12.48 C +ATOM 686 CD2 LEU A 111 46.342 60.775 17.844 1.00 13.68 C +ATOM 687 N SER A 112 47.569 63.389 22.333 1.00 14.45 N +ATOM 688 CA SER A 112 48.377 63.414 23.545 1.00 15.43 C +ATOM 689 C SER A 112 47.664 62.674 24.674 1.00 15.56 C +ATOM 690 O SER A 112 48.271 61.872 25.390 1.00 15.29 O +ATOM 691 CB SER A 112 48.662 64.855 23.967 1.00 16.09 C +ATOM 692 OG SER A 112 49.503 64.874 25.107 1.00 19.54 O +ATOM 693 N ASN A 113 46.371 62.934 24.835 1.00 15.44 N +ATOM 694 CA ASN A 113 45.622 62.267 25.888 1.00 15.93 C +ATOM 695 C ASN A 113 45.328 60.803 25.557 1.00 15.98 C +ATOM 696 O ASN A 113 45.141 59.986 26.460 1.00 14.90 O +ATOM 697 CB ASN A 113 44.348 63.055 26.205 1.00 16.49 C +ATOM 698 CG ASN A 113 44.662 64.406 26.832 1.00 17.39 C +ATOM 699 OD1 ASN A 113 45.654 64.540 27.545 1.00 19.42 O +ATOM 700 ND2 ASN A 113 43.830 65.402 26.575 1.00 16.88 N +ATOM 701 N ALA A 114 45.309 60.464 24.270 1.00 15.56 N +ATOM 702 CA ALA A 114 45.080 59.076 23.873 1.00 16.11 C +ATOM 703 C ALA A 114 46.297 58.265 24.311 1.00 16.35 C +ATOM 704 O ALA A 114 46.161 57.170 24.858 1.00 16.30 O +ATOM 705 CB ALA A 114 44.898 58.969 22.358 1.00 16.09 C +ATOM 706 N LEU A 115 47.487 58.810 24.068 1.00 16.40 N +ATOM 707 CA LEU A 115 48.726 58.140 24.448 1.00 17.18 C +ATOM 708 C LEU A 115 48.746 57.888 25.955 1.00 18.08 C +ATOM 709 O LEU A 115 49.032 56.778 26.410 1.00 17.12 O +ATOM 710 CB LEU A 115 49.942 58.993 24.048 1.00 17.62 C +ATOM 711 CG LEU A 115 51.322 58.484 24.487 1.00 17.69 C +ATOM 712 CD1 LEU A 115 51.541 57.068 23.971 1.00 17.85 C +ATOM 713 CD2 LEU A 115 52.409 59.412 23.974 1.00 18.21 C +ATOM 714 N ARG A 116 48.425 58.921 26.723 1.00 18.85 N +ATOM 715 CA ARG A 116 48.417 58.810 28.175 1.00 20.56 C +ATOM 716 C ARG A 116 47.382 57.809 28.678 1.00 19.55 C +ATOM 717 O ARG A 116 47.705 56.897 29.442 1.00 18.80 O +ATOM 718 CB ARG A 116 48.157 60.183 28.798 1.00 23.75 C +ATOM 719 CG ARG A 116 49.275 61.177 28.536 1.00 28.93 C +ATOM 720 CD ARG A 116 48.939 62.571 29.037 1.00 33.35 C +ATOM 721 NE ARG A 116 50.041 63.503 28.807 1.00 36.91 N +ATOM 722 CZ ARG A 116 49.991 64.804 29.076 1.00 38.94 C +ATOM 723 NH1 ARG A 116 48.888 65.336 29.585 1.00 40.21 N +ATOM 724 NH2 ARG A 116 51.047 65.574 28.841 1.00 40.22 N +ATOM 725 N HIS A 117 46.140 57.973 28.238 1.00 19.24 N +ATOM 726 CA HIS A 117 45.071 57.089 28.672 1.00 19.37 C +ATOM 727 C HIS A 117 45.205 55.633 28.266 1.00 18.60 C +ATOM 728 O HIS A 117 44.898 54.750 29.062 1.00 17.88 O +ATOM 729 CB HIS A 117 43.728 57.656 28.231 1.00 20.18 C +ATOM 730 CG HIS A 117 43.231 58.738 29.135 1.00 22.35 C +ATOM 731 ND1 HIS A 117 42.625 58.469 30.343 1.00 22.22 N +ATOM 732 CD2 HIS A 117 43.349 60.085 29.063 1.00 22.97 C +ATOM 733 CE1 HIS A 117 42.395 59.604 30.980 1.00 23.33 C +ATOM 734 NE2 HIS A 117 42.826 60.600 30.226 1.00 23.60 N +ATOM 735 N LEU A 118 45.658 55.371 27.043 1.00 18.18 N +ATOM 736 CA LEU A 118 45.834 53.990 26.605 1.00 18.16 C +ATOM 737 C LEU A 118 47.007 53.381 27.366 1.00 18.79 C +ATOM 738 O LEU A 118 46.980 52.210 27.744 1.00 19.50 O +ATOM 739 CB LEU A 118 46.094 53.928 25.094 1.00 17.70 C +ATOM 740 CG LEU A 118 44.910 54.381 24.227 1.00 17.50 C +ATOM 741 CD1 LEU A 118 45.295 54.349 22.755 1.00 17.43 C +ATOM 742 CD2 LEU A 118 43.715 53.476 24.486 1.00 17.74 C +ATOM 743 N HIS A 119 48.043 54.181 27.588 1.00 18.87 N +ATOM 744 CA HIS A 119 49.206 53.706 28.319 1.00 19.43 C +ATOM 745 C HIS A 119 48.790 53.247 29.717 1.00 19.71 C +ATOM 746 O HIS A 119 49.175 52.167 30.162 1.00 19.72 O +ATOM 747 CB HIS A 119 50.257 54.822 28.414 1.00 20.91 C +ATOM 748 CG HIS A 119 51.415 54.488 29.303 1.00 22.83 C +ATOM 749 ND1 HIS A 119 51.414 54.750 30.657 1.00 24.16 N +ATOM 750 CD2 HIS A 119 52.598 53.883 29.038 1.00 23.89 C +ATOM 751 CE1 HIS A 119 52.546 54.321 31.187 1.00 24.53 C +ATOM 752 NE2 HIS A 119 53.282 53.790 30.227 1.00 24.63 N +ATOM 753 N ASP A 120 47.978 54.060 30.388 1.00 19.22 N +ATOM 754 CA ASP A 120 47.524 53.763 31.747 1.00 19.25 C +ATOM 755 C ASP A 120 46.367 52.775 31.892 1.00 19.42 C +ATOM 756 O ASP A 120 46.124 52.273 32.989 1.00 19.09 O +ATOM 757 CB ASP A 120 47.144 55.057 32.468 1.00 18.84 C +ATOM 758 CG ASP A 120 48.322 55.987 32.657 1.00 19.37 C +ATOM 759 OD1 ASP A 120 49.473 55.502 32.675 1.00 18.78 O +ATOM 760 OD2 ASP A 120 48.092 57.205 32.802 1.00 21.18 O +ATOM 761 N ASN A 121 45.652 52.501 30.804 1.00 19.13 N +ATOM 762 CA ASN A 121 44.521 51.573 30.846 1.00 19.56 C +ATOM 763 C ASN A 121 44.679 50.514 29.756 1.00 20.42 C +ATOM 764 O ASN A 121 44.100 50.625 28.673 1.00 20.02 O +ATOM 765 CB ASN A 121 43.206 52.340 30.658 1.00 19.10 C +ATOM 766 CG ASN A 121 43.001 53.420 31.715 1.00 20.04 C +ATOM 767 OD1 ASN A 121 43.440 54.564 31.552 1.00 19.80 O +ATOM 768 ND2 ASN A 121 42.346 53.055 32.810 1.00 17.76 N +ATOM 769 N PRO A 122 45.456 49.454 30.043 1.00 20.96 N +ATOM 770 CA PRO A 122 45.736 48.349 29.119 1.00 20.73 C +ATOM 771 C PRO A 122 44.584 47.753 28.310 1.00 20.51 C +ATOM 772 O PRO A 122 44.801 47.297 27.186 1.00 20.32 O +ATOM 773 CB PRO A 122 46.435 47.315 30.012 1.00 21.89 C +ATOM 774 CG PRO A 122 45.941 47.647 31.395 1.00 22.52 C +ATOM 775 CD PRO A 122 45.975 49.145 31.388 1.00 21.57 C +ATOM 776 N GLU A 123 43.370 47.756 28.856 1.00 19.71 N +ATOM 777 CA GLU A 123 42.228 47.192 28.134 1.00 20.22 C +ATOM 778 C GLU A 123 41.508 48.170 27.213 1.00 19.10 C +ATOM 779 O GLU A 123 40.685 47.759 26.394 1.00 18.70 O +ATOM 780 CB GLU A 123 41.209 46.591 29.104 1.00 22.06 C +ATOM 781 CG GLU A 123 41.481 45.146 29.480 1.00 26.93 C +ATOM 782 CD GLU A 123 42.673 44.993 30.392 1.00 29.21 C +ATOM 783 OE1 GLU A 123 42.663 45.610 31.479 1.00 31.64 O +ATOM 784 OE2 GLU A 123 43.615 44.255 30.026 1.00 32.04 O +ATOM 785 N MET A 124 41.801 49.458 27.352 1.00 18.17 N +ATOM 786 CA MET A 124 41.167 50.464 26.506 1.00 17.41 C +ATOM 787 C MET A 124 41.742 50.353 25.092 1.00 17.17 C +ATOM 788 O MET A 124 42.918 50.023 24.918 1.00 15.97 O +ATOM 789 CB MET A 124 41.420 51.864 27.068 1.00 18.20 C +ATOM 790 CG MET A 124 40.643 52.964 26.356 1.00 18.11 C +ATOM 791 SD MET A 124 38.864 52.640 26.332 1.00 19.65 S +ATOM 792 CE MET A 124 38.254 54.161 25.589 1.00 17.72 C +ATOM 793 N LYS A 125 40.908 50.622 24.090 1.00 16.29 N +ATOM 794 CA LYS A 125 41.320 50.543 22.691 1.00 16.25 C +ATOM 795 C LYS A 125 40.980 51.841 21.954 1.00 15.56 C +ATOM 796 O LYS A 125 40.182 52.647 22.437 1.00 14.94 O +ATOM 797 CB LYS A 125 40.621 49.358 22.017 1.00 17.56 C +ATOM 798 CG LYS A 125 40.947 48.002 22.642 1.00 19.86 C +ATOM 799 CD LYS A 125 42.344 47.533 22.267 1.00 21.31 C +ATOM 800 CE LYS A 125 42.744 46.272 23.032 1.00 22.88 C +ATOM 801 NZ LYS A 125 41.818 45.132 22.794 1.00 22.89 N +ATOM 802 N PHE A 126 41.567 52.037 20.777 1.00 14.31 N +ATOM 803 CA PHE A 126 41.323 53.262 20.016 1.00 13.19 C +ATOM 804 C PHE A 126 41.824 53.079 18.582 1.00 13.17 C +ATOM 805 O PHE A 126 42.902 52.529 18.367 1.00 12.87 O +ATOM 806 CB PHE A 126 42.075 54.416 20.698 1.00 13.07 C +ATOM 807 CG PHE A 126 41.704 55.795 20.203 1.00 13.13 C +ATOM 808 CD1 PHE A 126 40.382 56.229 20.214 1.00 12.88 C +ATOM 809 CD2 PHE A 126 42.697 56.687 19.800 1.00 12.99 C +ATOM 810 CE1 PHE A 126 40.052 57.534 19.838 1.00 12.73 C +ATOM 811 CE2 PHE A 126 42.381 57.995 19.420 1.00 14.10 C +ATOM 812 CZ PHE A 126 41.054 58.420 19.441 1.00 13.20 C +ATOM 813 N ILE A 127 41.043 53.523 17.602 1.00 12.96 N +ATOM 814 CA ILE A 127 41.471 53.416 16.210 1.00 12.51 C +ATOM 815 C ILE A 127 41.733 54.808 15.639 1.00 12.40 C +ATOM 816 O ILE A 127 41.068 55.780 16.020 1.00 12.72 O +ATOM 817 CB ILE A 127 40.426 52.684 15.340 1.00 13.03 C +ATOM 818 CG1 ILE A 127 39.088 53.432 15.363 1.00 12.52 C +ATOM 819 CG2 ILE A 127 40.254 51.258 15.846 1.00 13.68 C +ATOM 820 CD1 ILE A 127 38.065 52.870 14.392 1.00 11.51 C +ATOM 821 N TRP A 128 42.713 54.907 14.743 1.00 11.53 N +ATOM 822 CA TRP A 128 43.060 56.190 14.134 1.00 11.00 C +ATOM 823 C TRP A 128 43.177 56.074 12.616 1.00 10.95 C +ATOM 824 O TRP A 128 43.819 55.158 12.103 1.00 10.31 O +ATOM 825 CB TRP A 128 44.370 56.718 14.715 1.00 10.91 C +ATOM 826 CG TRP A 128 44.608 58.144 14.353 1.00 11.82 C +ATOM 827 CD1 TRP A 128 45.345 58.618 13.306 1.00 12.38 C +ATOM 828 CD2 TRP A 128 44.050 59.289 15.004 1.00 12.05 C +ATOM 829 NE1 TRP A 128 45.282 59.993 13.265 1.00 12.35 N +ATOM 830 CE2 TRP A 128 44.492 60.429 14.297 1.00 11.66 C +ATOM 831 CE3 TRP A 128 43.215 59.463 16.119 1.00 11.84 C +ATOM 832 CZ2 TRP A 128 44.126 61.730 14.667 1.00 11.95 C +ATOM 833 CZ3 TRP A 128 42.851 60.757 16.485 1.00 12.18 C +ATOM 834 CH2 TRP A 128 43.309 61.872 15.760 1.00 11.70 C +ATOM 835 N ALA A 129 42.583 57.025 11.899 1.00 10.97 N +ATOM 836 CA ALA A 129 42.590 56.972 10.438 1.00 10.86 C +ATOM 837 C ALA A 129 43.441 57.982 9.673 1.00 11.29 C +ATOM 838 O ALA A 129 44.075 57.625 8.684 1.00 12.05 O +ATOM 839 CB ALA A 129 41.153 57.051 9.930 1.00 10.88 C +ATOM 840 N GLU A 130 43.454 59.233 10.124 1.00 11.69 N +ATOM 841 CA GLU A 130 44.181 60.297 9.428 1.00 11.76 C +ATOM 842 C GLU A 130 45.667 60.421 9.756 1.00 12.56 C +ATOM 843 O GLU A 130 46.048 61.041 10.751 1.00 11.54 O +ATOM 844 CB GLU A 130 43.490 61.639 9.688 1.00 12.79 C +ATOM 845 CG GLU A 130 41.999 61.651 9.373 1.00 13.31 C +ATOM 846 CD GLU A 130 41.152 61.053 10.486 1.00 14.75 C +ATOM 847 OE1 GLU A 130 41.706 60.749 11.565 1.00 13.73 O +ATOM 848 OE2 GLU A 130 39.928 60.897 10.284 1.00 14.94 O +ATOM 849 N ILE A 131 46.510 59.870 8.888 1.00 12.39 N +ATOM 850 CA ILE A 131 47.947 59.910 9.125 1.00 12.74 C +ATOM 851 C ILE A 131 48.568 61.305 9.006 1.00 13.30 C +ATOM 852 O ILE A 131 49.597 61.574 9.631 1.00 12.93 O +ATOM 853 CB ILE A 131 48.679 58.906 8.205 1.00 13.35 C +ATOM 854 CG1 ILE A 131 48.065 57.513 8.392 1.00 12.55 C +ATOM 855 CG2 ILE A 131 50.164 58.850 8.552 1.00 14.06 C +ATOM 856 CD1 ILE A 131 47.934 57.089 9.856 1.00 13.67 C +ATOM 857 N SER A 132 47.952 62.193 8.226 1.00 12.40 N +ATOM 858 CA SER A 132 48.467 63.557 8.089 1.00 12.80 C +ATOM 859 C SER A 132 48.608 64.163 9.488 1.00 12.95 C +ATOM 860 O SER A 132 49.628 64.777 9.814 1.00 12.50 O +ATOM 861 CB SER A 132 47.522 64.419 7.235 1.00 12.98 C +ATOM 862 OG SER A 132 46.193 64.404 7.740 1.00 12.82 O +ATOM 863 N TYR A 133 47.578 63.979 10.312 1.00 12.80 N +ATOM 864 CA TYR A 133 47.588 64.480 11.684 1.00 12.92 C +ATOM 865 C TYR A 133 48.552 63.687 12.566 1.00 13.22 C +ATOM 866 O TYR A 133 49.313 64.271 13.341 1.00 13.58 O +ATOM 867 CB TYR A 133 46.190 64.394 12.303 1.00 12.47 C +ATOM 868 CG TYR A 133 45.288 65.570 12.003 1.00 11.97 C +ATOM 869 CD1 TYR A 133 44.018 65.374 11.461 1.00 11.50 C +ATOM 870 CD2 TYR A 133 45.697 66.875 12.282 1.00 11.86 C +ATOM 871 CE1 TYR A 133 43.173 66.450 11.202 1.00 11.97 C +ATOM 872 CE2 TYR A 133 44.862 67.959 12.028 1.00 12.41 C +ATOM 873 CZ TYR A 133 43.603 67.740 11.490 1.00 12.92 C +ATOM 874 OH TYR A 133 42.775 68.813 11.252 1.00 14.26 O +ATOM 875 N PHE A 134 48.525 62.361 12.451 1.00 12.77 N +ATOM 876 CA PHE A 134 49.396 61.536 13.284 1.00 13.70 C +ATOM 877 C PHE A 134 50.874 61.827 13.057 1.00 14.52 C +ATOM 878 O PHE A 134 51.654 61.894 14.011 1.00 14.03 O +ATOM 879 CB PHE A 134 49.143 60.046 13.054 1.00 13.30 C +ATOM 880 CG PHE A 134 49.663 59.179 14.167 1.00 12.85 C +ATOM 881 CD1 PHE A 134 48.921 59.006 15.333 1.00 13.10 C +ATOM 882 CD2 PHE A 134 50.925 58.600 14.086 1.00 12.70 C +ATOM 883 CE1 PHE A 134 49.430 58.274 16.405 1.00 12.84 C +ATOM 884 CE2 PHE A 134 51.445 57.867 15.150 1.00 13.05 C +ATOM 885 CZ PHE A 134 50.695 57.704 16.315 1.00 12.90 C +ATOM 886 N ALA A 135 51.261 61.989 11.795 1.00 14.75 N +ATOM 887 CA ALA A 135 52.653 62.270 11.469 1.00 15.80 C +ATOM 888 C ALA A 135 53.068 63.618 12.062 1.00 16.47 C +ATOM 889 O ALA A 135 54.167 63.756 12.603 1.00 17.81 O +ATOM 890 CB ALA A 135 52.843 62.268 9.958 1.00 15.18 C +ATOM 891 N ARG A 136 52.180 64.602 11.958 1.00 16.38 N +ATOM 892 CA ARG A 136 52.417 65.945 12.489 1.00 17.85 C +ATOM 893 C ARG A 136 52.659 65.866 13.999 1.00 18.07 C +ATOM 894 O ARG A 136 53.549 66.524 14.540 1.00 17.96 O +ATOM 895 CB ARG A 136 51.194 66.828 12.214 1.00 18.62 C +ATOM 896 CG ARG A 136 51.233 68.221 12.851 1.00 19.63 C +ATOM 897 CD ARG A 136 51.971 69.240 11.985 1.00 21.28 C +ATOM 898 NE ARG A 136 51.889 70.590 12.550 1.00 21.22 N +ATOM 899 CZ ARG A 136 52.513 70.963 13.663 1.00 21.60 C +ATOM 900 NH1 ARG A 136 53.266 70.090 14.318 1.00 21.56 N +ATOM 901 NH2 ARG A 136 52.373 72.197 14.130 1.00 21.01 N +ATOM 902 N PHE A 137 51.856 65.044 14.667 1.00 17.06 N +ATOM 903 CA PHE A 137 51.946 64.857 16.110 1.00 16.50 C +ATOM 904 C PHE A 137 53.216 64.116 16.520 1.00 16.82 C +ATOM 905 O PHE A 137 54.007 64.599 17.336 1.00 15.91 O +ATOM 906 CB PHE A 137 50.728 64.069 16.589 1.00 16.48 C +ATOM 907 CG PHE A 137 50.709 63.817 18.065 1.00 16.50 C +ATOM 908 CD1 PHE A 137 50.399 64.842 18.954 1.00 16.68 C +ATOM 909 CD2 PHE A 137 51.000 62.553 18.570 1.00 16.93 C +ATOM 910 CE1 PHE A 137 50.376 64.612 20.324 1.00 16.87 C +ATOM 911 CE2 PHE A 137 50.980 62.313 19.944 1.00 16.89 C +ATOM 912 CZ PHE A 137 50.665 63.348 20.820 1.00 17.07 C +ATOM 913 N TYR A 138 53.399 62.934 15.943 1.00 17.33 N +ATOM 914 CA TYR A 138 54.544 62.088 16.241 1.00 19.31 C +ATOM 915 C TYR A 138 55.896 62.791 16.135 1.00 20.43 C +ATOM 916 O TYR A 138 56.738 62.662 17.027 1.00 20.11 O +ATOM 917 CB TYR A 138 54.546 60.870 15.321 1.00 19.16 C +ATOM 918 CG TYR A 138 55.573 59.832 15.707 1.00 20.39 C +ATOM 919 CD1 TYR A 138 55.322 58.931 16.737 1.00 20.40 C +ATOM 920 CD2 TYR A 138 56.797 59.750 15.041 1.00 20.04 C +ATOM 921 CE1 TYR A 138 56.262 57.966 17.095 1.00 21.70 C +ATOM 922 CE2 TYR A 138 57.745 58.787 15.393 1.00 20.96 C +ATOM 923 CZ TYR A 138 57.467 57.900 16.417 1.00 20.86 C +ATOM 924 OH TYR A 138 58.381 56.929 16.756 1.00 22.32 O +ATOM 925 N HIS A 139 56.116 63.522 15.047 1.00 21.39 N +ATOM 926 CA HIS A 139 57.391 64.212 14.872 1.00 23.26 C +ATOM 927 C HIS A 139 57.628 65.306 15.910 1.00 23.56 C +ATOM 928 O HIS A 139 58.762 65.734 16.117 1.00 24.04 O +ATOM 929 CB HIS A 139 57.494 64.791 13.459 1.00 23.86 C +ATOM 930 CG HIS A 139 57.669 63.749 12.396 1.00 25.63 C +ATOM 931 ND1 HIS A 139 58.772 62.923 12.338 1.00 26.39 N +ATOM 932 CD2 HIS A 139 56.877 63.391 11.357 1.00 25.59 C +ATOM 933 CE1 HIS A 139 58.652 62.104 11.308 1.00 26.89 C +ATOM 934 NE2 HIS A 139 57.511 62.367 10.697 1.00 25.94 N +ATOM 935 N ASP A 140 56.559 65.752 16.561 1.00 23.49 N +ATOM 936 CA ASP A 140 56.662 66.782 17.590 1.00 23.71 C +ATOM 937 C ASP A 140 56.879 66.173 18.980 1.00 23.14 C +ATOM 938 O ASP A 140 57.233 66.877 19.926 1.00 22.68 O +ATOM 939 CB ASP A 140 55.401 67.651 17.593 1.00 24.66 C +ATOM 940 CG ASP A 140 55.507 68.835 16.649 1.00 26.17 C +ATOM 941 OD1 ASP A 140 56.361 68.798 15.738 1.00 26.79 O +ATOM 942 OD2 ASP A 140 54.732 69.802 16.815 1.00 26.95 O +ATOM 943 N LEU A 141 56.675 64.863 19.093 1.00 22.45 N +ATOM 944 CA LEU A 141 56.851 64.162 20.364 1.00 22.73 C +ATOM 945 C LEU A 141 58.309 63.966 20.748 1.00 22.98 C +ATOM 946 O LEU A 141 59.182 63.860 19.890 1.00 22.46 O +ATOM 947 CB LEU A 141 56.194 62.780 20.317 1.00 22.57 C +ATOM 948 CG LEU A 141 54.676 62.622 20.381 1.00 22.78 C +ATOM 949 CD1 LEU A 141 54.334 61.132 20.284 1.00 22.33 C +ATOM 950 CD2 LEU A 141 54.140 63.203 21.682 1.00 22.26 C +ATOM 951 N GLY A 142 58.564 63.915 22.051 1.00 23.87 N +ATOM 952 CA GLY A 142 59.914 63.685 22.528 1.00 24.62 C +ATOM 953 C GLY A 142 60.197 62.205 22.353 1.00 25.34 C +ATOM 954 O GLY A 142 59.265 61.411 22.209 1.00 25.05 O +ATOM 955 N GLU A 143 61.469 61.825 22.375 1.00 26.02 N +ATOM 956 CA GLU A 143 61.857 60.431 22.194 1.00 27.00 C +ATOM 957 C GLU A 143 61.168 59.474 23.164 1.00 26.81 C +ATOM 958 O GLU A 143 60.742 58.389 22.770 1.00 26.55 O +ATOM 959 CB GLU A 143 63.376 60.290 22.318 1.00 28.32 C +ATOM 960 CG GLU A 143 63.917 58.939 21.872 1.00 30.69 C +ATOM 961 CD GLU A 143 63.531 58.595 20.442 1.00 32.34 C +ATOM 962 OE1 GLU A 143 63.731 59.442 19.545 1.00 33.73 O +ATOM 963 OE2 GLU A 143 63.031 57.475 20.212 1.00 33.41 O +ATOM 964 N ASN A 144 61.061 59.871 24.427 1.00 26.82 N +ATOM 965 CA ASN A 144 60.416 59.028 25.429 1.00 27.16 C +ATOM 966 C ASN A 144 58.973 58.725 25.031 1.00 25.97 C +ATOM 967 O ASN A 144 58.535 57.576 25.089 1.00 25.46 O +ATOM 968 CB ASN A 144 60.456 59.715 26.802 1.00 28.53 C +ATOM 969 CG ASN A 144 59.674 58.955 27.865 1.00 30.89 C +ATOM 970 OD1 ASN A 144 58.439 58.931 27.850 1.00 31.99 O +ATOM 971 ND2 ASN A 144 60.392 58.326 28.794 1.00 31.24 N +ATOM 972 N LYS A 145 58.244 59.757 24.614 1.00 25.27 N +ATOM 973 CA LYS A 145 56.850 59.592 24.208 1.00 24.54 C +ATOM 974 C LYS A 145 56.701 58.801 22.910 1.00 23.67 C +ATOM 975 O LYS A 145 55.737 58.050 22.750 1.00 23.28 O +ATOM 976 CB LYS A 145 56.172 60.960 24.077 1.00 24.90 C +ATOM 977 CG LYS A 145 55.891 61.636 25.417 1.00 26.63 C +ATOM 978 CD LYS A 145 54.932 60.797 26.254 1.00 28.26 C +ATOM 979 CE LYS A 145 54.651 61.429 27.613 1.00 29.93 C +ATOM 980 NZ LYS A 145 55.861 61.468 28.481 1.00 31.47 N +ATOM 981 N LYS A 146 57.643 58.966 21.983 1.00 23.03 N +ATOM 982 CA LYS A 146 57.591 58.224 20.726 1.00 22.22 C +ATOM 983 C LYS A 146 57.651 56.733 21.037 1.00 21.73 C +ATOM 984 O LYS A 146 56.970 55.932 20.402 1.00 21.25 O +ATOM 985 CB LYS A 146 58.762 58.599 19.806 1.00 22.23 C +ATOM 986 CG LYS A 146 58.621 59.948 19.115 1.00 22.76 C +ATOM 987 CD LYS A 146 59.761 60.193 18.134 1.00 23.90 C +ATOM 988 CE LYS A 146 59.592 61.528 17.421 1.00 24.68 C +ATOM 989 NZ LYS A 146 60.723 61.802 16.502 1.00 26.83 N +ATOM 990 N LEU A 147 58.471 56.370 22.020 1.00 21.32 N +ATOM 991 CA LEU A 147 58.618 54.977 22.425 1.00 20.74 C +ATOM 992 C LEU A 147 57.331 54.453 23.066 1.00 20.55 C +ATOM 993 O LEU A 147 56.914 53.328 22.796 1.00 19.53 O +ATOM 994 CB LEU A 147 59.795 54.830 23.396 1.00 21.37 C +ATOM 995 CG LEU A 147 61.174 55.062 22.764 1.00 21.47 C +ATOM 996 CD1 LEU A 147 62.268 54.961 23.820 1.00 22.05 C +ATOM 997 CD2 LEU A 147 61.402 54.031 21.667 1.00 22.58 C +ATOM 998 N GLN A 148 56.705 55.259 23.918 1.00 20.54 N +ATOM 999 CA GLN A 148 55.454 54.836 24.539 1.00 20.71 C +ATOM 1000 C GLN A 148 54.392 54.655 23.457 1.00 19.55 C +ATOM 1001 O GLN A 148 53.577 53.735 23.521 1.00 19.48 O +ATOM 1002 CB GLN A 148 54.958 55.869 25.553 1.00 22.42 C +ATOM 1003 CG GLN A 148 55.690 55.854 26.882 1.00 26.50 C +ATOM 1004 CD GLN A 148 55.029 56.746 27.919 1.00 28.92 C +ATOM 1005 OE1 GLN A 148 55.442 56.776 29.080 1.00 30.98 O +ATOM 1006 NE2 GLN A 148 53.996 57.478 27.504 1.00 28.96 N +ATOM 1007 N MET A 149 54.408 55.537 22.464 1.00 18.23 N +ATOM 1008 CA MET A 149 53.436 55.467 21.380 1.00 17.54 C +ATOM 1009 C MET A 149 53.634 54.195 20.561 1.00 17.52 C +ATOM 1010 O MET A 149 52.671 53.509 20.229 1.00 15.68 O +ATOM 1011 CB MET A 149 53.557 56.695 20.475 1.00 17.55 C +ATOM 1012 CG MET A 149 52.535 56.748 19.347 1.00 17.22 C +ATOM 1013 SD MET A 149 50.825 56.820 19.926 1.00 18.65 S +ATOM 1014 CE MET A 149 50.575 58.585 20.074 1.00 17.65 C +ATOM 1015 N LYS A 150 54.884 53.876 20.242 1.00 17.85 N +ATOM 1016 CA LYS A 150 55.162 52.678 19.461 1.00 19.03 C +ATOM 1017 C LYS A 150 54.741 51.427 20.216 1.00 18.85 C +ATOM 1018 O LYS A 150 54.314 50.448 19.607 1.00 18.69 O +ATOM 1019 CB LYS A 150 56.651 52.597 19.106 1.00 19.98 C +ATOM 1020 CG LYS A 150 57.119 53.722 18.195 1.00 22.90 C +ATOM 1021 CD LYS A 150 58.627 53.711 17.996 1.00 25.52 C +ATOM 1022 CE LYS A 150 59.079 52.488 17.225 1.00 27.56 C +ATOM 1023 NZ LYS A 150 60.546 52.528 16.959 1.00 30.17 N +ATOM 1024 N SER A 151 54.841 51.463 21.542 1.00 19.40 N +ATOM 1025 CA SER A 151 54.476 50.306 22.348 1.00 20.06 C +ATOM 1026 C SER A 151 52.970 50.036 22.376 1.00 19.84 C +ATOM 1027 O SER A 151 52.551 48.882 22.280 1.00 18.81 O +ATOM 1028 CB SER A 151 55.004 50.457 23.779 1.00 21.55 C +ATOM 1029 OG SER A 151 54.275 51.439 24.489 1.00 24.67 O +ATOM 1030 N ILE A 152 52.150 51.078 22.502 1.00 19.33 N +ATOM 1031 CA ILE A 152 50.710 50.851 22.525 1.00 18.89 C +ATOM 1032 C ILE A 152 50.179 50.464 21.144 1.00 19.23 C +ATOM 1033 O ILE A 152 49.076 49.937 21.023 1.00 19.09 O +ATOM 1034 CB ILE A 152 49.923 52.070 23.071 1.00 19.27 C +ATOM 1035 CG1 ILE A 152 50.241 53.330 22.270 1.00 18.37 C +ATOM 1036 CG2 ILE A 152 50.251 52.272 24.545 1.00 19.38 C +ATOM 1037 CD1 ILE A 152 49.354 54.502 22.643 1.00 20.01 C +ATOM 1038 N VAL A 153 50.965 50.723 20.103 1.00 19.03 N +ATOM 1039 CA VAL A 153 50.565 50.342 18.750 1.00 19.39 C +ATOM 1040 C VAL A 153 50.961 48.879 18.579 1.00 20.08 C +ATOM 1041 O VAL A 153 50.178 48.056 18.104 1.00 19.10 O +ATOM 1042 CB VAL A 153 51.286 51.193 17.680 1.00 19.59 C +ATOM 1043 CG1 VAL A 153 51.072 50.590 16.292 1.00 18.72 C +ATOM 1044 CG2 VAL A 153 50.757 52.619 17.716 1.00 19.20 C +ATOM 1045 N LYS A 154 52.183 48.561 18.995 1.00 20.71 N +ATOM 1046 CA LYS A 154 52.692 47.200 18.897 1.00 22.43 C +ATOM 1047 C LYS A 154 51.830 46.217 19.693 1.00 22.31 C +ATOM 1048 O LYS A 154 51.601 45.087 19.248 1.00 22.99 O +ATOM 1049 CB LYS A 154 54.141 47.148 19.396 1.00 23.60 C +ATOM 1050 CG LYS A 154 54.883 45.873 19.010 1.00 26.51 C +ATOM 1051 CD LYS A 154 56.371 45.962 19.330 1.00 28.32 C +ATOM 1052 CE LYS A 154 56.647 45.768 20.815 1.00 30.60 C +ATOM 1053 NZ LYS A 154 55.949 46.758 21.689 1.00 32.04 N +ATOM 1054 N ASN A 155 51.343 46.645 20.858 1.00 21.74 N +ATOM 1055 CA ASN A 155 50.523 45.775 21.699 1.00 21.60 C +ATOM 1056 C ASN A 155 49.048 45.707 21.292 1.00 21.26 C +ATOM 1057 O ASN A 155 48.268 44.985 21.907 1.00 21.23 O +ATOM 1058 CB ASN A 155 50.634 46.182 23.179 1.00 22.98 C +ATOM 1059 CG ASN A 155 49.828 47.429 23.519 1.00 23.68 C +ATOM 1060 OD1 ASN A 155 49.086 47.950 22.689 1.00 25.06 O +ATOM 1061 ND2 ASN A 155 49.967 47.905 24.755 1.00 22.98 N +ATOM 1062 N GLY A 156 48.664 46.470 20.274 1.00 20.62 N +ATOM 1063 CA GLY A 156 47.289 46.420 19.798 1.00 19.54 C +ATOM 1064 C GLY A 156 46.252 47.364 20.381 1.00 18.92 C +ATOM 1065 O GLY A 156 45.077 47.274 20.012 1.00 18.44 O +ATOM 1066 N GLN A 157 46.652 48.263 21.277 1.00 17.60 N +ATOM 1067 CA GLN A 157 45.695 49.198 21.872 1.00 16.41 C +ATOM 1068 C GLN A 157 45.307 50.324 20.920 1.00 15.89 C +ATOM 1069 O GLN A 157 44.142 50.704 20.842 1.00 15.45 O +ATOM 1070 CB GLN A 157 46.254 49.811 23.149 1.00 16.48 C +ATOM 1071 CG GLN A 157 46.313 48.866 24.328 1.00 16.57 C +ATOM 1072 CD GLN A 157 46.574 49.616 25.611 1.00 17.00 C +ATOM 1073 OE1 GLN A 157 45.672 50.242 26.171 1.00 18.25 O +ATOM 1074 NE2 GLN A 157 47.815 49.586 26.069 1.00 15.69 N +ATOM 1075 N LEU A 158 46.296 50.884 20.234 1.00 15.44 N +ATOM 1076 CA LEU A 158 46.044 51.940 19.266 1.00 15.69 C +ATOM 1077 C LEU A 158 46.227 51.278 17.909 1.00 15.14 C +ATOM 1078 O LEU A 158 47.304 50.772 17.597 1.00 13.89 O +ATOM 1079 CB LEU A 158 47.040 53.092 19.440 1.00 17.44 C +ATOM 1080 CG LEU A 158 46.940 54.281 18.473 1.00 19.44 C +ATOM 1081 CD1 LEU A 158 47.449 53.888 17.094 1.00 21.37 C +ATOM 1082 CD2 LEU A 158 45.507 54.763 18.390 1.00 20.34 C +ATOM 1083 N GLU A 159 45.169 51.277 17.106 1.00 14.02 N +ATOM 1084 CA GLU A 159 45.228 50.640 15.801 1.00 13.37 C +ATOM 1085 C GLU A 159 44.887 51.597 14.671 1.00 13.31 C +ATOM 1086 O GLU A 159 43.908 52.336 14.740 1.00 13.33 O +ATOM 1087 CB GLU A 159 44.275 49.444 15.770 1.00 13.62 C +ATOM 1088 CG GLU A 159 44.208 48.724 14.433 1.00 12.38 C +ATOM 1089 CD GLU A 159 43.264 47.539 14.473 1.00 13.65 C +ATOM 1090 OE1 GLU A 159 43.594 46.543 15.150 1.00 12.96 O +ATOM 1091 OE2 GLU A 159 42.191 47.608 13.835 1.00 13.40 O +ATOM 1092 N PHE A 160 45.707 51.583 13.631 1.00 12.97 N +ATOM 1093 CA PHE A 160 45.464 52.443 12.490 1.00 12.70 C +ATOM 1094 C PHE A 160 44.545 51.741 11.512 1.00 12.66 C +ATOM 1095 O PHE A 160 44.721 50.557 11.209 1.00 12.44 O +ATOM 1096 CB PHE A 160 46.778 52.816 11.808 1.00 12.38 C +ATOM 1097 CG PHE A 160 47.709 53.592 12.692 1.00 12.87 C +ATOM 1098 CD1 PHE A 160 48.750 52.954 13.361 1.00 13.11 C +ATOM 1099 CD2 PHE A 160 47.512 54.954 12.898 1.00 13.24 C +ATOM 1100 CE1 PHE A 160 49.580 53.662 14.226 1.00 13.27 C +ATOM 1101 CE2 PHE A 160 48.338 55.670 13.764 1.00 13.58 C +ATOM 1102 CZ PHE A 160 49.370 55.022 14.427 1.00 13.04 C +ATOM 1103 N VAL A 161 43.544 52.475 11.046 1.00 12.52 N +ATOM 1104 CA VAL A 161 42.592 51.948 10.085 1.00 12.57 C +ATOM 1105 C VAL A 161 42.804 52.722 8.788 1.00 12.64 C +ATOM 1106 O VAL A 161 42.876 53.956 8.795 1.00 12.94 O +ATOM 1107 CB VAL A 161 41.138 52.088 10.602 1.00 12.21 C +ATOM 1108 CG1 VAL A 161 40.918 51.127 11.772 1.00 12.32 C +ATOM 1109 CG2 VAL A 161 40.866 53.520 11.057 1.00 11.76 C +ATOM 1110 N THR A 162 42.918 51.977 7.689 1.00 12.71 N +ATOM 1111 CA THR A 162 43.182 52.517 6.357 1.00 12.53 C +ATOM 1112 C THR A 162 44.643 52.973 6.312 1.00 12.55 C +ATOM 1113 O THR A 162 45.455 52.417 5.572 1.00 13.03 O +ATOM 1114 CB THR A 162 42.268 53.713 5.989 1.00 12.27 C +ATOM 1115 OG1 THR A 162 40.895 53.302 6.014 1.00 12.19 O +ATOM 1116 CG2 THR A 162 42.597 54.205 4.579 1.00 12.13 C +ATOM 1117 N GLY A 163 44.978 53.978 7.112 1.00 12.23 N +ATOM 1118 CA GLY A 163 46.352 54.453 7.147 1.00 12.18 C +ATOM 1119 C GLY A 163 46.721 55.413 6.035 1.00 12.70 C +ATOM 1120 O GLY A 163 47.896 55.565 5.707 1.00 12.54 O +ATOM 1121 N GLY A 164 45.718 56.052 5.444 1.00 12.35 N +ATOM 1122 CA GLY A 164 45.980 57.013 4.392 1.00 11.82 C +ATOM 1123 C GLY A 164 46.273 58.378 4.991 1.00 11.35 C +ATOM 1124 O GLY A 164 45.991 58.626 6.166 1.00 10.66 O +ATOM 1125 N TRP A 165 46.847 59.267 4.188 1.00 10.91 N +ATOM 1126 CA TRP A 165 47.160 60.611 4.659 1.00 11.06 C +ATOM 1127 C TRP A 165 45.851 61.229 5.156 1.00 10.60 C +ATOM 1128 O TRP A 165 45.828 61.962 6.147 1.00 10.80 O +ATOM 1129 CB TRP A 165 47.744 61.439 3.510 1.00 10.61 C +ATOM 1130 CG TRP A 165 48.536 62.645 3.941 1.00 11.31 C +ATOM 1131 CD1 TRP A 165 48.295 63.948 3.604 1.00 11.10 C +ATOM 1132 CD2 TRP A 165 49.722 62.654 4.749 1.00 11.26 C +ATOM 1133 NE1 TRP A 165 49.258 64.767 4.150 1.00 11.53 N +ATOM 1134 CE2 TRP A 165 50.146 64.001 4.855 1.00 11.38 C +ATOM 1135 CE3 TRP A 165 50.470 61.658 5.388 1.00 11.20 C +ATOM 1136 CZ2 TRP A 165 51.287 64.376 5.581 1.00 11.13 C +ATOM 1137 CZ3 TRP A 165 51.608 62.033 6.111 1.00 12.07 C +ATOM 1138 CH2 TRP A 165 52.001 63.381 6.197 1.00 11.73 C +ATOM 1139 N VAL A 166 44.758 60.901 4.470 1.00 10.33 N +ATOM 1140 CA VAL A 166 43.427 61.401 4.824 1.00 10.39 C +ATOM 1141 C VAL A 166 42.396 60.295 4.592 1.00 10.34 C +ATOM 1142 O VAL A 166 42.753 59.161 4.283 1.00 11.04 O +ATOM 1143 CB VAL A 166 43.020 62.613 3.931 1.00 10.12 C +ATOM 1144 CG1 VAL A 166 44.062 63.729 4.039 1.00 9.61 C +ATOM 1145 CG2 VAL A 166 42.881 62.166 2.466 1.00 10.51 C +ATOM 1146 N MET A 167 41.123 60.636 4.778 1.00 10.46 N +ATOM 1147 CA MET A 167 39.999 59.737 4.502 1.00 10.79 C +ATOM 1148 C MET A 167 39.455 60.494 3.296 1.00 10.84 C +ATOM 1149 O MET A 167 38.657 61.424 3.435 1.00 11.16 O +ATOM 1150 CB MET A 167 38.982 59.751 5.643 1.00 10.60 C +ATOM 1151 CG MET A 167 37.732 58.925 5.362 1.00 10.61 C +ATOM 1152 SD MET A 167 36.559 58.988 6.729 1.00 12.95 S +ATOM 1153 CE MET A 167 37.543 58.160 8.030 1.00 9.81 C +ATOM 1154 N PRO A 168 39.881 60.101 2.086 1.00 10.28 N +ATOM 1155 CA PRO A 168 39.448 60.779 0.866 1.00 10.67 C +ATOM 1156 C PRO A 168 38.005 60.755 0.403 1.00 10.67 C +ATOM 1157 O PRO A 168 37.235 59.845 0.705 1.00 9.88 O +ATOM 1158 CB PRO A 168 40.366 60.180 -0.193 1.00 10.26 C +ATOM 1159 CG PRO A 168 40.433 58.744 0.244 1.00 10.47 C +ATOM 1160 CD PRO A 168 40.634 58.872 1.760 1.00 10.20 C +ATOM 1161 N ASP A 169 37.672 61.796 -0.351 1.00 10.52 N +ATOM 1162 CA ASP A 169 36.378 61.909 -0.984 1.00 10.65 C +ATOM 1163 C ASP A 169 36.460 60.738 -1.958 1.00 11.03 C +ATOM 1164 O ASP A 169 37.558 60.359 -2.367 1.00 10.54 O +ATOM 1165 CB ASP A 169 36.291 63.223 -1.761 1.00 9.53 C +ATOM 1166 CG ASP A 169 35.172 63.223 -2.781 1.00 9.60 C +ATOM 1167 OD1 ASP A 169 34.080 62.707 -2.466 1.00 9.07 O +ATOM 1168 OD2 ASP A 169 35.380 63.753 -3.890 1.00 9.49 O +ATOM 1169 N GLU A 170 35.325 60.153 -2.321 1.00 11.28 N +ATOM 1170 CA GLU A 170 35.357 59.027 -3.245 1.00 11.38 C +ATOM 1171 C GLU A 170 34.654 59.324 -4.563 1.00 11.01 C +ATOM 1172 O GLU A 170 34.631 58.487 -5.464 1.00 11.28 O +ATOM 1173 CB GLU A 170 34.758 57.782 -2.570 1.00 11.52 C +ATOM 1174 CG GLU A 170 35.632 57.262 -1.424 1.00 11.42 C +ATOM 1175 CD GLU A 170 35.031 56.070 -0.691 1.00 11.56 C +ATOM 1176 OE1 GLU A 170 34.234 55.329 -1.305 1.00 10.57 O +ATOM 1177 OE2 GLU A 170 35.380 55.863 0.496 1.00 11.41 O +ATOM 1178 N ALA A 171 34.110 60.531 -4.685 1.00 11.08 N +ATOM 1179 CA ALA A 171 33.400 60.919 -5.900 1.00 11.05 C +ATOM 1180 C ALA A 171 34.239 61.695 -6.916 1.00 11.31 C +ATOM 1181 O ALA A 171 34.296 61.335 -8.092 1.00 11.52 O +ATOM 1182 CB ALA A 171 32.167 61.733 -5.534 1.00 11.81 C +ATOM 1183 N ASN A 172 34.884 62.761 -6.452 1.00 11.31 N +ATOM 1184 CA ASN A 172 35.682 63.637 -7.306 1.00 10.86 C +ATOM 1185 C ASN A 172 37.143 63.225 -7.469 1.00 11.09 C +ATOM 1186 O ASN A 172 37.802 63.594 -8.437 1.00 11.02 O +ATOM 1187 CB ASN A 172 35.641 65.053 -6.732 1.00 10.31 C +ATOM 1188 CG ASN A 172 34.229 65.593 -6.612 1.00 11.30 C +ATOM 1189 OD1 ASN A 172 33.570 65.858 -7.618 1.00 11.17 O +ATOM 1190 ND2 ASN A 172 33.758 65.757 -5.379 1.00 10.93 N +ATOM 1191 N SER A 173 37.642 62.462 -6.512 1.00 10.96 N +ATOM 1192 CA SER A 173 39.038 62.036 -6.520 1.00 12.32 C +ATOM 1193 C SER A 173 39.433 61.112 -7.658 1.00 11.10 C +ATOM 1194 O SER A 173 38.674 60.218 -8.034 1.00 10.01 O +ATOM 1195 CB SER A 173 39.351 61.352 -5.198 1.00 13.01 C +ATOM 1196 OG SER A 173 39.238 62.295 -4.144 1.00 22.67 O +ATOM 1197 N HIS A 174 40.625 61.336 -8.209 1.00 11.04 N +ATOM 1198 CA HIS A 174 41.122 60.474 -9.272 1.00 10.88 C +ATOM 1199 C HIS A 174 41.790 59.294 -8.564 1.00 10.47 C +ATOM 1200 O HIS A 174 42.426 59.480 -7.527 1.00 9.37 O +ATOM 1201 CB HIS A 174 42.137 61.214 -10.138 1.00 11.97 C +ATOM 1202 CG HIS A 174 42.382 60.554 -11.456 1.00 11.73 C +ATOM 1203 ND1 HIS A 174 43.067 59.363 -11.575 1.00 11.80 N +ATOM 1204 CD2 HIS A 174 41.967 60.878 -12.703 1.00 11.03 C +ATOM 1205 CE1 HIS A 174 43.059 58.980 -12.839 1.00 12.03 C +ATOM 1206 NE2 HIS A 174 42.397 59.881 -13.544 1.00 11.53 N +ATOM 1207 N TRP A 175 41.648 58.087 -9.106 1.00 9.98 N +ATOM 1208 CA TRP A 175 42.233 56.920 -8.453 1.00 10.04 C +ATOM 1209 C TRP A 175 43.724 57.085 -8.219 1.00 10.08 C +ATOM 1210 O TRP A 175 44.259 56.585 -7.231 1.00 9.95 O +ATOM 1211 CB TRP A 175 41.964 55.631 -9.250 1.00 9.79 C +ATOM 1212 CG TRP A 175 42.794 55.452 -10.499 1.00 9.87 C +ATOM 1213 CD1 TRP A 175 42.465 55.826 -11.771 1.00 9.70 C +ATOM 1214 CD2 TRP A 175 44.087 54.838 -10.582 1.00 9.81 C +ATOM 1215 NE1 TRP A 175 43.475 55.480 -12.645 1.00 9.50 N +ATOM 1216 CE2 TRP A 175 44.481 54.871 -11.940 1.00 9.87 C +ATOM 1217 CE3 TRP A 175 44.951 54.262 -9.638 1.00 9.77 C +ATOM 1218 CZ2 TRP A 175 45.706 54.348 -12.380 1.00 9.19 C +ATOM 1219 CZ3 TRP A 175 46.170 53.742 -10.075 1.00 9.97 C +ATOM 1220 CH2 TRP A 175 46.534 53.790 -11.438 1.00 10.26 C +ATOM 1221 N ARG A 176 44.400 57.788 -9.122 1.00 9.90 N +ATOM 1222 CA ARG A 176 45.830 58.003 -8.972 1.00 9.73 C +ATOM 1223 C ARG A 176 46.145 58.757 -7.676 1.00 9.68 C +ATOM 1224 O ARG A 176 47.116 58.433 -6.982 1.00 10.18 O +ATOM 1225 CB ARG A 176 46.371 58.761 -10.190 1.00 10.41 C +ATOM 1226 CG ARG A 176 46.433 57.891 -11.444 1.00 10.38 C +ATOM 1227 CD ARG A 176 46.405 58.708 -12.722 1.00 10.68 C +ATOM 1228 NE ARG A 176 47.504 59.664 -12.821 1.00 11.00 N +ATOM 1229 CZ ARG A 176 47.661 60.499 -13.845 1.00 10.86 C +ATOM 1230 NH1 ARG A 176 46.790 60.488 -14.851 1.00 10.95 N +ATOM 1231 NH2 ARG A 176 48.678 61.348 -13.865 1.00 10.81 N +ATOM 1232 N ASN A 177 45.326 59.750 -7.338 1.00 9.32 N +ATOM 1233 CA ASN A 177 45.558 60.513 -6.112 1.00 9.19 C +ATOM 1234 C ASN A 177 45.076 59.760 -4.875 1.00 9.29 C +ATOM 1235 O ASN A 177 45.582 59.976 -3.769 1.00 9.08 O +ATOM 1236 CB ASN A 177 44.898 61.893 -6.197 1.00 9.09 C +ATOM 1237 CG ASN A 177 45.571 62.786 -7.219 1.00 10.22 C +ATOM 1238 OD1 ASN A 177 46.752 62.615 -7.514 1.00 10.54 O +ATOM 1239 ND2 ASN A 177 44.827 63.747 -7.758 1.00 11.17 N +ATOM 1240 N VAL A 178 44.096 58.882 -5.055 1.00 9.46 N +ATOM 1241 CA VAL A 178 43.619 58.079 -3.936 1.00 9.57 C +ATOM 1242 C VAL A 178 44.797 57.175 -3.557 1.00 9.41 C +ATOM 1243 O VAL A 178 45.094 56.980 -2.377 1.00 9.85 O +ATOM 1244 CB VAL A 178 42.400 57.206 -4.337 1.00 10.85 C +ATOM 1245 CG1 VAL A 178 42.063 56.219 -3.216 1.00 10.89 C +ATOM 1246 CG2 VAL A 178 41.202 58.098 -4.639 1.00 11.12 C +ATOM 1247 N LEU A 179 45.477 56.635 -4.569 1.00 9.20 N +ATOM 1248 CA LEU A 179 46.630 55.769 -4.324 1.00 9.06 C +ATOM 1249 C LEU A 179 47.785 56.572 -3.738 1.00 9.03 C +ATOM 1250 O LEU A 179 48.486 56.100 -2.836 1.00 9.82 O +ATOM 1251 CB LEU A 179 47.100 55.095 -5.619 1.00 9.32 C +ATOM 1252 CG LEU A 179 48.403 54.281 -5.498 1.00 10.09 C +ATOM 1253 CD1 LEU A 179 48.240 53.160 -4.470 1.00 9.73 C +ATOM 1254 CD2 LEU A 179 48.764 53.707 -6.863 1.00 10.39 C +ATOM 1255 N LEU A 180 47.982 57.785 -4.250 1.00 8.67 N +ATOM 1256 CA LEU A 180 49.062 58.639 -3.764 1.00 8.60 C +ATOM 1257 C LEU A 180 48.924 58.902 -2.262 1.00 8.58 C +ATOM 1258 O LEU A 180 49.879 58.711 -1.501 1.00 9.49 O +ATOM 1259 CB LEU A 180 49.068 59.974 -4.524 1.00 8.74 C +ATOM 1260 CG LEU A 180 50.208 60.940 -4.177 1.00 9.14 C +ATOM 1261 CD1 LEU A 180 51.516 60.391 -4.745 1.00 9.34 C +ATOM 1262 CD2 LEU A 180 49.919 62.329 -4.741 1.00 9.43 C +ATOM 1263 N GLN A 181 47.740 59.325 -1.826 1.00 8.27 N +ATOM 1264 CA GLN A 181 47.547 59.620 -0.410 1.00 8.75 C +ATOM 1265 C GLN A 181 47.592 58.378 0.475 1.00 8.99 C +ATOM 1266 O GLN A 181 48.072 58.447 1.603 1.00 9.46 O +ATOM 1267 CB GLN A 181 46.250 60.421 -0.186 1.00 8.36 C +ATOM 1268 CG GLN A 181 44.932 59.684 -0.427 1.00 9.43 C +ATOM 1269 CD GLN A 181 44.564 58.745 0.710 1.00 9.81 C +ATOM 1270 OE1 GLN A 181 44.821 59.036 1.884 1.00 10.55 O +ATOM 1271 NE2 GLN A 181 43.946 57.618 0.370 1.00 9.03 N +ATOM 1272 N LEU A 182 47.107 57.244 -0.030 1.00 9.16 N +ATOM 1273 CA LEU A 182 47.155 56.011 0.749 1.00 9.23 C +ATOM 1274 C LEU A 182 48.627 55.645 0.938 1.00 9.77 C +ATOM 1275 O LEU A 182 49.061 55.308 2.039 1.00 9.83 O +ATOM 1276 CB LEU A 182 46.435 54.867 0.019 1.00 9.06 C +ATOM 1277 CG LEU A 182 46.499 53.481 0.680 1.00 9.28 C +ATOM 1278 CD1 LEU A 182 45.751 53.490 2.014 1.00 8.74 C +ATOM 1279 CD2 LEU A 182 45.890 52.439 -0.262 1.00 10.15 C +ATOM 1280 N THR A 183 49.393 55.735 -0.146 1.00 10.03 N +ATOM 1281 CA THR A 183 50.814 55.409 -0.114 1.00 10.34 C +ATOM 1282 C THR A 183 51.568 56.352 0.827 1.00 10.54 C +ATOM 1283 O THR A 183 52.432 55.921 1.599 1.00 10.55 O +ATOM 1284 CB THR A 183 51.436 55.490 -1.538 1.00 11.14 C +ATOM 1285 OG1 THR A 183 50.711 54.631 -2.431 1.00 9.99 O +ATOM 1286 CG2 THR A 183 52.902 55.057 -1.511 1.00 11.69 C +ATOM 1287 N GLU A 184 51.240 57.638 0.774 1.00 10.40 N +ATOM 1288 CA GLU A 184 51.914 58.613 1.626 1.00 10.88 C +ATOM 1289 C GLU A 184 51.714 58.250 3.100 1.00 11.01 C +ATOM 1290 O GLU A 184 52.663 58.256 3.887 1.00 10.99 O +ATOM 1291 CB GLU A 184 51.371 60.018 1.345 1.00 11.56 C +ATOM 1292 CG GLU A 184 52.227 61.164 1.883 1.00 12.09 C +ATOM 1293 CD GLU A 184 53.622 61.218 1.269 1.00 13.16 C +ATOM 1294 OE1 GLU A 184 53.772 60.904 0.070 1.00 12.72 O +ATOM 1295 OE2 GLU A 184 54.568 61.597 1.990 1.00 13.92 O +ATOM 1296 N GLY A 185 50.479 57.921 3.463 1.00 11.02 N +ATOM 1297 CA GLY A 185 50.183 57.558 4.840 1.00 11.05 C +ATOM 1298 C GLY A 185 50.769 56.223 5.271 1.00 11.42 C +ATOM 1299 O GLY A 185 51.357 56.112 6.354 1.00 10.33 O +ATOM 1300 N GLN A 186 50.623 55.202 4.433 1.00 11.05 N +ATOM 1301 CA GLN A 186 51.143 53.885 4.789 1.00 11.77 C +ATOM 1302 C GLN A 186 52.667 53.803 4.782 1.00 12.24 C +ATOM 1303 O GLN A 186 53.256 53.044 5.552 1.00 12.03 O +ATOM 1304 CB GLN A 186 50.561 52.806 3.872 1.00 11.77 C +ATOM 1305 CG GLN A 186 49.047 52.630 4.000 1.00 13.37 C +ATOM 1306 CD GLN A 186 48.617 51.189 3.793 1.00 14.28 C +ATOM 1307 OE1 GLN A 186 49.193 50.476 2.978 1.00 16.36 O +ATOM 1308 NE2 GLN A 186 47.593 50.757 4.526 1.00 14.09 N +ATOM 1309 N THR A 187 53.313 54.573 3.915 1.00 12.35 N +ATOM 1310 CA THR A 187 54.768 54.551 3.874 1.00 11.70 C +ATOM 1311 C THR A 187 55.288 55.133 5.189 1.00 12.42 C +ATOM 1312 O THR A 187 56.253 54.630 5.766 1.00 11.77 O +ATOM 1313 CB THR A 187 55.299 55.355 2.673 1.00 12.06 C +ATOM 1314 OG1 THR A 187 54.840 54.744 1.459 1.00 10.71 O +ATOM 1315 CG2 THR A 187 56.828 55.372 2.666 1.00 11.14 C +ATOM 1316 N TRP A 188 54.630 56.181 5.675 1.00 12.42 N +ATOM 1317 CA TRP A 188 55.033 56.790 6.937 1.00 12.91 C +ATOM 1318 C TRP A 188 54.838 55.762 8.054 1.00 12.44 C +ATOM 1319 O TRP A 188 55.726 55.556 8.877 1.00 12.28 O +ATOM 1320 CB TRP A 188 54.189 58.035 7.240 1.00 13.70 C +ATOM 1321 CG TRP A 188 54.654 58.787 8.463 1.00 14.71 C +ATOM 1322 CD1 TRP A 188 55.574 59.800 8.505 1.00 15.26 C +ATOM 1323 CD2 TRP A 188 54.295 58.516 9.825 1.00 14.94 C +ATOM 1324 NE1 TRP A 188 55.815 60.170 9.810 1.00 15.10 N +ATOM 1325 CE2 TRP A 188 55.044 59.397 10.639 1.00 15.92 C +ATOM 1326 CE3 TRP A 188 53.420 57.609 10.436 1.00 15.07 C +ATOM 1327 CZ2 TRP A 188 54.942 59.397 12.034 1.00 15.07 C +ATOM 1328 CZ3 TRP A 188 53.321 57.606 11.829 1.00 16.08 C +ATOM 1329 CH2 TRP A 188 54.078 58.496 12.610 1.00 16.04 C +ATOM 1330 N LEU A 189 53.674 55.114 8.073 1.00 12.36 N +ATOM 1331 CA LEU A 189 53.378 54.112 9.096 1.00 12.63 C +ATOM 1332 C LEU A 189 54.378 52.961 9.115 1.00 12.98 C +ATOM 1333 O LEU A 189 54.797 52.515 10.186 1.00 13.11 O +ATOM 1334 CB LEU A 189 51.967 53.541 8.905 1.00 12.03 C +ATOM 1335 CG LEU A 189 50.799 54.434 9.328 1.00 11.18 C +ATOM 1336 CD1 LEU A 189 49.478 53.722 9.017 1.00 10.90 C +ATOM 1337 CD2 LEU A 189 50.908 54.744 10.823 1.00 11.01 C +ATOM 1338 N LYS A 190 54.755 52.469 7.940 1.00 13.15 N +ATOM 1339 CA LYS A 190 55.706 51.364 7.884 1.00 15.49 C +ATOM 1340 C LYS A 190 57.048 51.789 8.467 1.00 16.12 C +ATOM 1341 O LYS A 190 57.647 51.067 9.263 1.00 15.59 O +ATOM 1342 CB LYS A 190 55.916 50.885 6.445 1.00 16.77 C +ATOM 1343 CG LYS A 190 56.750 49.602 6.348 1.00 19.16 C +ATOM 1344 CD LYS A 190 56.965 49.176 4.903 1.00 21.67 C +ATOM 1345 CE LYS A 190 57.526 47.759 4.814 1.00 24.05 C +ATOM 1346 NZ LYS A 190 58.694 47.576 5.721 1.00 26.01 N +ATOM 1347 N GLN A 191 57.512 52.967 8.070 1.00 16.47 N +ATOM 1348 CA GLN A 191 58.791 53.472 8.541 1.00 18.20 C +ATOM 1349 C GLN A 191 58.846 53.798 10.033 1.00 18.19 C +ATOM 1350 O GLN A 191 59.809 53.434 10.710 1.00 18.72 O +ATOM 1351 CB GLN A 191 59.194 54.717 7.741 1.00 19.41 C +ATOM 1352 CG GLN A 191 60.525 55.315 8.185 1.00 23.36 C +ATOM 1353 CD GLN A 191 60.940 56.530 7.371 1.00 24.84 C +ATOM 1354 OE1 GLN A 191 61.983 57.134 7.634 1.00 27.37 O +ATOM 1355 NE2 GLN A 191 60.129 56.895 6.381 1.00 25.62 N +ATOM 1356 N PHE A 192 57.823 54.470 10.556 1.00 17.55 N +ATOM 1357 CA PHE A 192 57.838 54.852 11.966 1.00 17.32 C +ATOM 1358 C PHE A 192 57.041 54.008 12.966 1.00 18.08 C +ATOM 1359 O PHE A 192 57.392 53.971 14.147 1.00 18.30 O +ATOM 1360 CB PHE A 192 57.418 56.319 12.108 1.00 16.53 C +ATOM 1361 CG PHE A 192 58.326 57.278 11.397 1.00 16.66 C +ATOM 1362 CD1 PHE A 192 58.029 57.716 10.109 1.00 15.84 C +ATOM 1363 CD2 PHE A 192 59.493 57.727 12.006 1.00 16.59 C +ATOM 1364 CE1 PHE A 192 58.878 58.588 9.438 1.00 16.74 C +ATOM 1365 CE2 PHE A 192 60.355 58.603 11.342 1.00 17.54 C +ATOM 1366 CZ PHE A 192 60.046 59.034 10.056 1.00 17.19 C +ATOM 1367 N MET A 193 55.983 53.342 12.514 1.00 17.73 N +ATOM 1368 CA MET A 193 55.163 52.520 13.413 1.00 19.14 C +ATOM 1369 C MET A 193 55.332 51.025 13.148 1.00 19.53 C +ATOM 1370 O MET A 193 54.858 50.189 13.924 1.00 18.11 O +ATOM 1371 CB MET A 193 53.678 52.880 13.275 1.00 20.34 C +ATOM 1372 CG MET A 193 53.268 54.222 13.862 1.00 21.40 C +ATOM 1373 SD MET A 193 53.643 54.391 15.630 1.00 25.49 S +ATOM 1374 CE MET A 193 54.971 55.537 15.481 1.00 23.36 C +ATOM 1375 N ASN A 194 55.996 50.699 12.044 1.00 20.19 N +ATOM 1376 CA ASN A 194 56.234 49.314 11.656 1.00 22.50 C +ATOM 1377 C ASN A 194 54.931 48.522 11.529 1.00 20.91 C +ATOM 1378 O ASN A 194 54.839 47.376 11.969 1.00 19.47 O +ATOM 1379 CB ASN A 194 57.166 48.641 12.672 1.00 28.58 C +ATOM 1380 CG ASN A 194 57.623 47.263 12.226 1.00 35.23 C +ATOM 1381 OD1 ASN A 194 57.755 47.001 11.029 1.00 35.45 O +ATOM 1382 ND2 ASN A 194 57.879 46.390 13.197 1.00 42.54 N +ATOM 1383 N VAL A 195 53.919 49.143 10.933 1.00 18.77 N +ATOM 1384 CA VAL A 195 52.634 48.480 10.739 1.00 17.69 C +ATOM 1385 C VAL A 195 52.006 48.928 9.424 1.00 16.28 C +ATOM 1386 O VAL A 195 52.233 50.050 8.971 1.00 15.37 O +ATOM 1387 CB VAL A 195 51.627 48.792 11.885 1.00 17.63 C +ATOM 1388 CG1 VAL A 195 52.177 48.308 13.225 1.00 18.95 C +ATOM 1389 CG2 VAL A 195 51.329 50.284 11.932 1.00 17.73 C +ATOM 1390 N THR A 196 51.231 48.034 8.819 1.00 14.92 N +ATOM 1391 CA THR A 196 50.531 48.307 7.566 1.00 14.60 C +ATOM 1392 C THR A 196 49.098 47.815 7.737 1.00 14.09 C +ATOM 1393 O THR A 196 48.851 46.610 7.778 1.00 13.92 O +ATOM 1394 CB THR A 196 51.164 47.549 6.371 1.00 14.25 C +ATOM 1395 OG1 THR A 196 52.521 47.974 6.189 1.00 14.63 O +ATOM 1396 CG2 THR A 196 50.380 47.822 5.096 1.00 15.08 C diff --git a/modules/bindings/src/tmalign/TMalign.cpp b/modules/bindings/src/tmalign/TMalign.cpp new file mode 100644 index 000000000..f62fc4584 --- /dev/null +++ b/modules/bindings/src/tmalign/TMalign.cpp @@ -0,0 +1,569 @@ +/* command line argument parsing and document of TMalign main program */ + +#include "TMalign.h" + +using namespace std; + +void print_version() +{ + cout << +"\n" +" *********************************************************************\n" +" * TM-align (Version 20190209): protein and RNA structure alignment *\n" +" * References: Y Zhang, J Skolnick. Nucl Acids Res 33, 2302-9 (2005) *\n" +" * S Gong, C Zhang, Y Zhang. Bioinformatics (2019) *\n" +" * Please email comments and suggestions to yangzhanglab@umich.edu *\n" +" *********************************************************************" + << endl; +} + +void print_extra_help() +{ + cout << +"Additional options:\n" +" -fast Fast but slightly inaccurate alignment\n" +"\n" +" -dir Perform all-against-all alignment among the list of PDB\n" +" chains listed by 'chain_list' under 'chain_folder'. Note\n" +" that the slash is necessary.\n" +" $ TMalign -dir chain_folder/ chain_list\n" +"\n" +" -dir1 Use chain2 to search a list of PDB chains listed by 'chain1_list'\n" +" under 'chain1_folder'. Note that the slash is necessary.\n" +" $ TMalign -dir1 chain1_folder/ chain1_list chain2\n" +"\n" +" -dir2 Use chain1 to search a list of PDB chains listed by 'chain2_list'\n" +" under 'chain2_folder'\n" +" $ TMalign chain1 -dir2 chain2_folder/ chain2_list\n" +"\n" +" -suffix (Only when -dir1 and/or -dir2 are set, default is empty)\n" +" add file name suffix to files listed by chain1_list or chain2_list\n" +"\n" +" -atom 4-character atom name used to represent a residue.\n" +" Default is \" C3'\" for RNA/DNA and \" CA \" for proteins\n" +" (note the spaces before and after CA).\n" +"\n" +" -mol Molecule type: RNA or protein\n" +" Default is detect molecule type automatically\n" +"\n" +" -ter Strings to mark the end of a chain\n" +" 3: (default) TER, ENDMDL, END or different chain ID\n" +" 2: ENDMDL, END, or different chain ID\n" +" 1: ENDMDL or END\n" +" 0: (default in the first C++ TMalign) end of file\n" +"\n" +" -split Whether to split PDB file into multiple chains\n" +" 0: (default) treat the whole structure as one single chain\n" +" 1: treat each MODEL as a separate chain (-ter should be 0)\n" +" 2: treat each chain as a seperate chain (-ter should be <=1)\n" +"\n" +" -outfmt Output format\n" +" 0: (default) full output\n" +" 1: fasta format compact output\n" +" 2: tabular format very compact output\n" +" -1: full output, but without version or citation information\n" +"\n" +" -byresi Whether to assume residue index correspondence between the\n" +" two structures.\n" +" 0: (default) sequence independent alignment\n" +" 1: (same as TMscore program) sequence-dependent superposition,\n" +" i.e. align by residue index\n" +" 2: (same as TMscore -c, should be used with -ter <=1)\n" +" align by residue index and chain ID\n" +" 3: (similar to TMscore -c, should be used with -ter <=1)\n" +" align by residue index and order of chain\n" +"\n" +" -TMcut -1: (default) do not consider TMcut\n" +" Values in [0.5,1): Do not proceed with TM-align for this\n" +" structure pair if TM-score is unlikely to reach TMcut.\n" +" TMcut is normalized is set by -a option:\n" +" -2: normalized by longer structure length\n" +" -1: normalized by shorter structure length\n" +" 0: (default, same as F) normalized by second structure\n" +" 1: same as T, normalized by average structure length\n" +"\n" +" -infmt1 Input format for chain1\n" +" -infmt2 Input format for chain2\n" +" -1: (default) automatically detect PDB or PDBx/mmCIF format\n" +" 0: PDB format\n" +" 1: SPICKER format\n" +" 2: xyz format\n" +" 3: PDBx/mmCIF format\n" + <<endl; +} + +void print_help(bool h_opt=false) +{ + print_version(); + cout << +"\n" +"Usage: TMalign PDB1.pdb PDB2.pdb [Options]\n" +"\n" +"Options:\n" +" -u TM-score normalized by user assigned length (the same as -L)\n" +" warning: it should be >= minimum length of the two structures\n" +" otherwise, TM-score may be >1\n" +"\n" +" -a TM-score normalized by the average length of two structures\n" +" T or F, (default F)\n" +"\n" +" -i Start with an alignment specified in fasta file 'align.txt'\n" +"\n" +" -I Stick to the alignment 'align.txt'\n" +"\n" +" -m Output TM-align rotation matrix\n" +"\n" +" -d TM-score scaled by an assigned d0, e.g. 5 Angstroms\n" +"\n" +" -o Output the superposition of PDB1.pdb to TM_sup.pdb\n" +" $ TMalign PDB1.pdb PDB2.pdb -o TM_sup.pdb\n" +" To view superposed full-atom structures:\n" +" $ pymol TM_sup.pdb PDB2.pdb\n" +"\n" +" -v Print the version of TM-align\n" +"\n" +" -h Print the full help message, including options not available\n" +" in standard TM-align program\n" +"\n" +" (Options -u, -a, -d, -o won't change the final structure alignment)\n\n" +"Example usages:\n" +" TMalign PDB1.pdb PDB2.pdb\n" +" TMalign PDB1.pdb PDB2.pdb -u 100 -d 5.0\n" +" TMalign PDB1.pdb PDB2.pdb -a T -o PDB1.sup\n" +" TMalign PDB1.pdb PDB2.pdb -i align.txt\n" +" TMalign PDB1.pdb PDB2.pdb -m matrix.txt\n" + <<endl; + + if (h_opt) print_extra_help(); + + exit(EXIT_SUCCESS); +} + +int main(int argc, char *argv[]) +{ + if (argc < 2) print_help(); + + + clock_t t1, t2; + t1 = clock(); + + /**********************/ + /* get argument */ + /**********************/ + string xname = ""; + string yname = ""; + string fname_super = ""; // file name for superposed structure + string fname_lign = ""; // file name for user alignment + string fname_matrix= ""; // file name for output matrix + vector<string> sequence; // get value from alignment file + double Lnorm_ass, d0_scale; + + bool h_opt = false; // print full help message + bool v_opt = false; // print version + bool m_opt = false; // flag for -m, output rotation matrix + bool i_opt = false; // flag for -i, with user given initial alignment + bool I_opt = false; // flag for -I, stick to user given alignment + bool o_opt = false; // flag for -o, output superposed structure + int a_opt = 0; // flag for -a, do not normalized by average length + bool u_opt = false; // flag for -u, normalized by user specified length + bool d_opt = false; // flag for -d, user specified d0 + + double TMcut =-1; + int infmt1_opt=-1; // PDB or PDBx/mmCIF format for chain_1 + int infmt2_opt=-1; // PDB or PDBx/mmCIF format for chain_2 + int ter_opt =3; // TER, END, or different chainID + int split_opt =0; // do not split chain + int outfmt_opt=0; // set -outfmt to full output + bool fast_opt =false; // flags for -fast, fTM-align algorithm + string atom_opt ="auto";// use C alpha atom for protein and C3' for RNA + string mol_opt ="auto";// auto-detect the molecule type as protein/RNA + string suffix_opt=""; // set -suffix to empty + string dir_opt =""; // set -dir to empty + string dir1_opt =""; // set -dir1 to empty + string dir2_opt =""; // set -dir2 to empty + int byresi_opt=0; // set -byresi to 0 + vector<string> chain1_list; // only when -dir1 is set + vector<string> chain2_list; // only when -dir2 is set + + for(int i = 1; i < argc; i++) + { + if ( !strcmp(argv[i],"-o") && i < (argc-1) ) + { + fname_super = argv[i + 1]; o_opt = true; i++; + } + else if ( (!strcmp(argv[i],"-u") || + !strcmp(argv[i],"-L")) && i < (argc-1) ) + { + Lnorm_ass = atof(argv[i + 1]); u_opt = true; i++; + } + else if ( !strcmp(argv[i],"-a") && i < (argc-1) ) + { + if (!strcmp(argv[i + 1], "T")) a_opt=true; + else if (!strcmp(argv[i + 1], "F")) a_opt=false; + else + { + a_opt=atoi(argv[i + 1]); + if (a_opt!=-2 && a_opt!=-1 && a_opt!=1) + PrintErrorAndQuit("-a must be -2, -1, 1, T or F"); + } + i++; + } + else if ( !strcmp(argv[i],"-d") && i < (argc-1) ) + { + d0_scale = atof(argv[i + 1]); d_opt = true; i++; + } + else if ( !strcmp(argv[i],"-v") ) + { + v_opt = true; + } + else if ( !strcmp(argv[i],"-h") ) + { + h_opt = true; + } + else if ( !strcmp(argv[i],"-i") && i < (argc-1) ) + { + fname_lign = argv[i + 1]; i_opt = true; i++; + } + else if (!strcmp(argv[i], "-m") && i < (argc-1) ) + { + fname_matrix = argv[i + 1]; m_opt = true; i++; + }// get filename for rotation matrix + else if (!strcmp(argv[i], "-I") && i < (argc-1) ) + { + fname_lign = argv[i + 1]; I_opt = true; i++; + } + else if (!strcmp(argv[i], "-fast")) + { + fast_opt = true; + } + else if ( !strcmp(argv[i],"-infmt1") && i < (argc-1) ) + { + infmt1_opt=atoi(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-infmt2") && i < (argc-1) ) + { + infmt2_opt=atoi(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-ter") && i < (argc-1) ) + { + ter_opt=atoi(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-split") && i < (argc-1) ) + { + split_opt=atoi(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-atom") && i < (argc-1) ) + { + atom_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-mol") && i < (argc-1) ) + { + mol_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-dir") && i < (argc-1) ) + { + dir_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-dir1") && i < (argc-1) ) + { + dir1_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-dir2") && i < (argc-1) ) + { + dir2_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-suffix") && i < (argc-1) ) + { + suffix_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-outfmt") && i < (argc-1) ) + { + outfmt_opt=atoi(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-TMcut") && i < (argc-1) ) + { + TMcut=atof(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-byresi") && i < (argc-1) ) + { + byresi_opt=atoi(argv[i + 1]); i++; + } + else if (xname.size() == 0) xname=argv[i]; + else if (yname.size() == 0) yname=argv[i]; + else PrintErrorAndQuit(string("ERROR! Undefined option ")+argv[i]); + } + + if(xname.size()==0 || (yname.size()==0 && dir_opt.size()==0) || + (yname.size() && dir_opt.size())) + { + if (h_opt) print_help(h_opt); + if (v_opt) + { + print_version(); + exit(EXIT_FAILURE); + } + if (xname.size()==0) + PrintErrorAndQuit("Please provide input structures"); + else if (yname.size()==0 && dir_opt.size()==0) + PrintErrorAndQuit("Please provide structure B"); + else if (yname.size() && dir_opt.size()) + PrintErrorAndQuit("Please provide only one file name if -dir is set"); + } + + if (suffix_opt.size() && dir_opt.size()+dir1_opt.size()+dir2_opt.size()==0) + PrintErrorAndQuit("-suffix is only valid if -dir, -dir1 or -dir2 is set"); + if ((dir_opt.size() || dir1_opt.size() || dir2_opt.size())) + { + if (m_opt || o_opt) + PrintErrorAndQuit("-m or -o cannot be set with -dir, -dir1 or -dir2"); + else if (dir_opt.size() && (dir1_opt.size() || dir2_opt.size())) + PrintErrorAndQuit("-dir cannot be set with -dir1 or -dir2"); + } + if (atom_opt.size()!=4) + PrintErrorAndQuit("ERROR! atom name must have 4 characters, including space."); + if (mol_opt!="auto" && mol_opt!="protein" && mol_opt!="RNA") + PrintErrorAndQuit("ERROR! molecule type must be either RNA or protein."); + else if (mol_opt=="protein" && atom_opt=="auto") + atom_opt=" CA "; + else if (mol_opt=="RNA" && atom_opt=="auto") + atom_opt=" C3'"; + + if (i_opt && I_opt) + PrintErrorAndQuit("ERROR! -I and -i cannot be used together"); + if (u_opt && Lnorm_ass<=0) + PrintErrorAndQuit("Wrong value for option -u! It should be >0"); + if (d_opt && d0_scale<=0) + PrintErrorAndQuit("Wrong value for option -d! It should be >0"); + if (outfmt_opt>=2 && (a_opt || u_opt || d_opt)) + PrintErrorAndQuit("-outfmt 2 cannot be used with -a, -u, -L, -d"); + if (byresi_opt!=0) + { + if (i_opt || I_opt) + PrintErrorAndQuit("-byresi >=1 cannot be used with -i or -I"); + if (byresi_opt<0 || byresi_opt>3) + PrintErrorAndQuit("-byresi can only be 0, 1, 2 or 3"); + if (byresi_opt>=2 && ter_opt>=2) + PrintErrorAndQuit("-byresi >=2 should be used with -ter <=1"); + } + if (split_opt==1 && ter_opt!=0) + PrintErrorAndQuit("-split 1 should be used with -ter 0"); + else if (split_opt==2 && ter_opt!=0 && ter_opt!=1) + PrintErrorAndQuit("-split 2 should be used with -ter 0 or 1"); + if (split_opt<0 || split_opt>2) + PrintErrorAndQuit("-split can only be 0, 1 or 2"); + + /* read initial alignment file from 'align.txt' */ + if (i_opt || I_opt) read_user_alignment(sequence, fname_lign, I_opt); + + if (byresi_opt) I_opt=true; + + if (m_opt && fname_matrix == "") // Output rotation matrix: matrix.txt + PrintErrorAndQuit("ERROR! Please provide a file name for option -m!"); + + /* parse file list */ + if (dir1_opt.size()+dir_opt.size()==0) chain1_list.push_back(xname); + else file2chainlist(chain1_list, xname, dir_opt+dir1_opt, suffix_opt); + + if (dir_opt.size()) + for (int i=0;i<chain1_list.size();i++) + chain2_list.push_back(chain1_list[i]); + else if (dir2_opt.size()==0) chain2_list.push_back(yname); + else file2chainlist(chain2_list, yname, dir2_opt, suffix_opt); + + if (outfmt_opt==2) + cout<<"#PDBchain1\tPDBchain2\tTM1\tTM2\t" + <<"RMSD\tID1\tID2\tIDali\tL1\tL2\tLali"<<endl; + + /* declare previously global variables */ + vector<vector<string> >PDB_lines1; // text of chain1 + vector<vector<string> >PDB_lines2; // text of chain2 + vector<int> mol_vec1; // molecule type of chain1, RNA if >0 + vector<int> mol_vec2; // molecule type of chain2, RNA if >0 + vector<string> chainID_list1; // list of chainID1 + vector<string> chainID_list2; // list of chainID2 + int i,j; // file index + int chain_i,chain_j; // chain index + int xlen, ylen; // chain length + int xchainnum,ychainnum;// number of chains in a PDB file + char *seqx, *seqy; // for the protein sequence + int *secx, *secy; // for the secondary structure + double **xa, **ya; // for input vectors xa[0...xlen-1][0..2] and + // ya[0...ylen-1][0..2], in general, + // ya is regarded as native structure + // --> superpose xa onto ya + vector<string> resi_vec1; // residue index for chain1 + vector<string> resi_vec2; // residue index for chain2 + + /* loop over file names */ + for (i=0;i<chain1_list.size();i++) + { + /* parse chain 1 */ + xname=chain1_list[i]; + xchainnum=get_PDB_lines(xname, PDB_lines1, chainID_list1, + mol_vec1, ter_opt, infmt1_opt, atom_opt, split_opt); + if (!xchainnum) + { + cerr<<"Warning! Cannot parse file: "<<xname + <<". Chain number 0."<<endl; + continue; + } + for (chain_i=0;chain_i<xchainnum;chain_i++) + { + xlen=PDB_lines1[chain_i].size(); + if (mol_opt=="RNA") mol_vec1[chain_i]=1; + else if (mol_opt=="protein") mol_vec1[chain_i]=-1; + if (!xlen) + { + cerr<<"Warning! Cannot parse file: "<<xname + <<". Chain length 0."<<endl; + continue; + } + else if (xlen<=5) + { + cerr<<"Sequence is too short <=5!: "<<xname<<endl; + continue; + } + NewArray(&xa, xlen, 3); + seqx = new char[xlen + 1]; + secx = new int[xlen]; + xlen = read_PDB(PDB_lines1[chain_i], xa, seqx, + resi_vec1, byresi_opt); + if (mol_vec1[chain_i]>0) make_sec(seqx,xa, xlen, secx,atom_opt); + else make_sec(xa, xlen, secx); // secondary structure assignment + + for (j=(dir_opt.size()>0)*(i+1);j<chain2_list.size();j++) + { + /* parse chain 2 */ + if (PDB_lines2.size()==0) + { + yname=chain2_list[j]; + ychainnum=get_PDB_lines(yname, PDB_lines2, chainID_list2, + mol_vec2, ter_opt, infmt2_opt, atom_opt, split_opt); + if (!ychainnum) + { + cerr<<"Warning! Cannot parse file: "<<yname + <<". Chain number 0."<<endl; + continue; + } + } + for (chain_j=0;chain_j<ychainnum;chain_j++) + { + ylen=PDB_lines2[chain_j].size(); + if (mol_opt=="RNA") mol_vec2[chain_j]=1; + else if (mol_opt=="protein") mol_vec2[chain_j]=-1; + if (!ylen) + { + cerr<<"Warning! Cannot parse file: "<<yname + <<". Chain length 0."<<endl; + continue; + } + else if (ylen<=5) + { + cerr<<"Sequence is too short <=5!: "<<yname<<endl; + continue; + } + NewArray(&ya, ylen, 3); + seqy = new char[ylen + 1]; + secy = new int[ylen]; + ylen = read_PDB(PDB_lines2[chain_j], ya, seqy, + resi_vec2, byresi_opt); + if (mol_vec2[chain_j]>0) + make_sec(seqy, ya, ylen, secy, atom_opt); + else make_sec(ya, ylen, secy); + + if (byresi_opt) extract_aln_from_resi(sequence, + seqx,seqy,resi_vec1,resi_vec2,byresi_opt); + + /* declare variable specific to this pair of TMalign */ + double t0[3], u0[3][3]; + double TM1, TM2; + double TM3, TM4, TM5; // for a_opt, u_opt, d_opt + double d0_0, TM_0; + double d0A, d0B, d0u, d0a; + double d0_out=5.0; + string seqM, seqxA, seqyA;// for output alignment + double rmsd0 = 0.0; + int L_ali; // Aligned length in standard_TMscore + double Liden=0; + double TM_ali, rmsd_ali; // TMscore and rmsd in standard_TMscore + int n_ali=0; + int n_ali8=0; + + /* entry function for structure alignment */ + TMalign_main( + xa, ya, seqx, seqy, secx, secy, + t0, u0, TM1, TM2, TM3, TM4, TM5, + d0_0, TM_0, d0A, d0B, d0u, d0a, d0_out, + seqM, seqxA, seqyA, + rmsd0, L_ali, Liden, TM_ali, rmsd_ali, n_ali, n_ali8, + xlen, ylen, sequence, Lnorm_ass, d0_scale, + i_opt, I_opt, a_opt, u_opt, d_opt, fast_opt, + mol_vec1[chain_i]+mol_vec2[chain_j],TMcut); + + /* print result */ + if (outfmt_opt==0) print_version(); + output_results( + xname.substr(dir1_opt.size()), + yname.substr(dir2_opt.size()), + chainID_list1[chain_i].c_str(), + chainID_list2[chain_j].c_str(), + xlen, ylen, t0, u0, TM1, TM2, + TM3, TM4, TM5, rmsd0, d0_out, + seqM.c_str(), seqxA.c_str(), seqyA.c_str(), Liden, + n_ali8, n_ali, L_ali, TM_ali, rmsd_ali, + TM_0, d0_0, d0A, d0B, + Lnorm_ass, d0_scale, d0a, d0u, + (m_opt?fname_matrix+chainID_list1[chain_i]:"").c_str(), + outfmt_opt, ter_opt, + (o_opt?fname_super+chainID_list1[chain_i]:"").c_str(), + i_opt, I_opt, a_opt, u_opt, d_opt); + + /* Done! Free memory */ + seqM.clear(); + seqxA.clear(); + seqyA.clear(); + DeleteArray(&ya, ylen); + delete [] seqy; + delete [] secy; + resi_vec2.clear(); + } // chain_j + if (chain2_list.size()>1) + { + yname.clear(); + for (chain_j=0;chain_j<ychainnum;chain_j++) + PDB_lines2[chain_j].clear(); + PDB_lines2.clear(); + chainID_list2.clear(); + mol_vec2.clear(); + } + } // j + PDB_lines1[chain_i].clear(); + DeleteArray(&xa, xlen); + delete [] seqx; + delete [] secx; + resi_vec1.clear(); + } // chain_i + xname.clear(); + PDB_lines1.clear(); + chainID_list1.clear(); + mol_vec1.clear(); + } // i + if (chain2_list.size()==1) + { + yname.clear(); + for (chain_j=0;chain_j<ychainnum;chain_j++) + PDB_lines2[chain_j].clear(); + PDB_lines2.clear(); + resi_vec2.clear(); + chainID_list2.clear(); + mol_vec2.clear(); + } + chain1_list.clear(); + chain2_list.clear(); + sequence.clear(); + + t2 = clock(); + float diff = ((float)t2 - (float)t1)/CLOCKS_PER_SEC; + printf("Total CPU time is %5.2f seconds\n", diff); + return 0; +} diff --git a/modules/bindings/src/tmalign/TMalign.h b/modules/bindings/src/tmalign/TMalign.h new file mode 100644 index 000000000..79abc61af --- /dev/null +++ b/modules/bindings/src/tmalign/TMalign.h @@ -0,0 +1,2439 @@ +/* Functions for the core TMalign algorithm, including the entry function + * TMalign_main */ + +#include "param_set.h" +#include "NW.h" +#include "Kabsch.h" + +// 1, collect those residues with dis<d; +// 2, calculate TMscore +int score_fun8( double **xa, double **ya, int n_ali, double d, int i_ali[], + double *score1, int score_sum_method, const double Lnorm, + const double score_d8, const double d0) +{ + double score_sum=0, di; + double d_tmp=d*d; + double d02=d0*d0; + double score_d8_cut = score_d8*score_d8; + + int i, n_cut, inc=0; + + while(1) + { + n_cut=0; + score_sum=0; + for(i=0; i<n_ali; i++) + { + di = dist(xa[i], ya[i]); + if(di<d_tmp) + { + i_ali[n_cut]=i; + n_cut++; + } + if(score_sum_method==8) + { + if(di<=score_d8_cut) score_sum += 1/(1+di/d02); + } + else score_sum += 1/(1+di/d02); + } + //there are not enough feasible pairs, reliefe the threshold + if(n_cut<3 && n_ali>3) + { + inc++; + double dinc=(d+inc*0.5); + d_tmp = dinc * dinc; + } + else break; + } + + *score1=score_sum/Lnorm; + return n_cut; +} + +int score_fun8_standard(double **xa, double **ya, int n_ali, double d, + int i_ali[], double *score1, int score_sum_method, + double score_d8, double d0) +{ + double score_sum = 0, di; + double d_tmp = d*d; + double d02 = d0*d0; + double score_d8_cut = score_d8*score_d8; + + int i, n_cut, inc = 0; + while (1) + { + n_cut = 0; + score_sum = 0; + for (i = 0; i<n_ali; i++) + { + di = dist(xa[i], ya[i]); + if (di<d_tmp) + { + i_ali[n_cut] = i; + n_cut++; + } + if (score_sum_method == 8) + { + if (di <= score_d8_cut) score_sum += 1 / (1 + di / d02); + } + else + { + score_sum += 1 / (1 + di / d02); + } + } + //there are not enough feasible pairs, reliefe the threshold + if (n_cut<3 && n_ali>3) + { + inc++; + double dinc = (d + inc*0.5); + d_tmp = dinc * dinc; + } + else break; + } + + *score1 = score_sum / n_ali; + return n_cut; +} + +double TMscore8_search(double **r1, double **r2, double **xtm, double **ytm, + double **xt, int Lali, double t0[3], double u0[3][3], int simplify_step, + int score_sum_method, double *Rcomm, double local_d0_search, double Lnorm, + double score_d8, double d0) +{ + int i, m; + double score_max, score, rmsd; + const int kmax=Lali; + int k_ali[kmax], ka, k; + double t[3]; + double u[3][3]; + double d; + + + //iterative parameters + int n_it=20; //maximum number of iterations + int n_init_max=6; //maximum number of different fragment length + int L_ini[n_init_max]; //fragment lengths, Lali, Lali/2, Lali/4 ... 4 + int L_ini_min=4; + if(Lali<L_ini_min) L_ini_min=Lali; + + int n_init=0, i_init; + for(i=0; i<n_init_max-1; i++) + { + n_init++; + L_ini[i]=(int) (Lali/pow(2.0, (double) i)); + if(L_ini[i]<=L_ini_min) + { + L_ini[i]=L_ini_min; + break; + } + } + if(i==n_init_max-1) + { + n_init++; + L_ini[i]=L_ini_min; + } + + score_max=-1; + //find the maximum score starting from local structures superposition + int i_ali[kmax], n_cut; + int L_frag; //fragment length + int iL_max; //maximum starting postion for the fragment + + for(i_init=0; i_init<n_init; i_init++) + { + L_frag=L_ini[i_init]; + iL_max=Lali-L_frag; + + i=0; + while(1) + { + //extract the fragment starting from position i + ka=0; + for(k=0; k<L_frag; k++) + { + int kk=k+i; + r1[k][0]=xtm[kk][0]; + r1[k][1]=xtm[kk][1]; + r1[k][2]=xtm[kk][2]; + + r2[k][0]=ytm[kk][0]; + r2[k][1]=ytm[kk][1]; + r2[k][2]=ytm[kk][2]; + + k_ali[ka]=kk; + ka++; + } + + //extract rotation matrix based on the fragment + Kabsch(r1, r2, L_frag, 1, &rmsd, t, u); + if (simplify_step != 1) + *Rcomm = 0; + do_rotation(xtm, xt, Lali, t, u); + + //get subsegment of this fragment + d = local_d0_search - 1; + n_cut=score_fun8(xt, ytm, Lali, d, i_ali, &score, + score_sum_method, Lnorm, score_d8, d0); + if(score>score_max) + { + score_max=score; + + //save the rotation matrix + for(k=0; k<3; k++) + { + t0[k]=t[k]; + u0[k][0]=u[k][0]; + u0[k][1]=u[k][1]; + u0[k][2]=u[k][2]; + } + } + + //try to extend the alignment iteratively + d = local_d0_search + 1; + for(int it=0; it<n_it; it++) + { + ka=0; + for(k=0; k<n_cut; k++) + { + m=i_ali[k]; + r1[k][0]=xtm[m][0]; + r1[k][1]=xtm[m][1]; + r1[k][2]=xtm[m][2]; + + r2[k][0]=ytm[m][0]; + r2[k][1]=ytm[m][1]; + r2[k][2]=ytm[m][2]; + + k_ali[ka]=m; + ka++; + } + //extract rotation matrix based on the fragment + Kabsch(r1, r2, n_cut, 1, &rmsd, t, u); + do_rotation(xtm, xt, Lali, t, u); + n_cut=score_fun8(xt, ytm, Lali, d, i_ali, &score, + score_sum_method, Lnorm, score_d8, d0); + if(score>score_max) + { + score_max=score; + + //save the rotation matrix + for(k=0; k<3; k++) + { + t0[k]=t[k]; + u0[k][0]=u[k][0]; + u0[k][1]=u[k][1]; + u0[k][2]=u[k][2]; + } + } + + //check if it converges + if(n_cut==ka) + { + for(k=0; k<n_cut; k++) + { + if(i_ali[k]!=k_ali[k]) break; + } + if(k==n_cut) break; + } + } //for iteration + + if(i<iL_max) + { + i=i+simplify_step; //shift the fragment + if(i>iL_max) i=iL_max; //do this to use the last missed fragment + } + else if(i>=iL_max) break; + }//while(1) + //end of one fragment + }//for(i_init + return score_max; +} + + +double TMscore8_search_standard( double **r1, double **r2, + double **xtm, double **ytm, double **xt, int Lali, + double t0[3], double u0[3][3], int simplify_step, int score_sum_method, + double *Rcomm, double local_d0_search, double score_d8, double d0) +{ + int i, m; + double score_max, score, rmsd; + const int kmax = Lali; + int k_ali[kmax], ka, k; + double t[3]; + double u[3][3]; + double d; + + //iterative parameters + int n_it = 20; //maximum number of iterations + int n_init_max = 6; //maximum number of different fragment length + int L_ini[n_init_max]; //fragment lengths, Lali, Lali/2, Lali/4 ... 4 + int L_ini_min = 4; + if (Lali<L_ini_min) L_ini_min = Lali; + + int n_init = 0, i_init; + for (i = 0; i<n_init_max - 1; i++) + { + n_init++; + L_ini[i] = (int)(Lali / pow(2.0, (double)i)); + if (L_ini[i] <= L_ini_min) + { + L_ini[i] = L_ini_min; + break; + } + } + if (i == n_init_max - 1) + { + n_init++; + L_ini[i] = L_ini_min; + } + + score_max = -1; + //find the maximum score starting from local structures superposition + int i_ali[kmax], n_cut; + int L_frag; //fragment length + int iL_max; //maximum starting postion for the fragment + + for (i_init = 0; i_init<n_init; i_init++) + { + L_frag = L_ini[i_init]; + iL_max = Lali - L_frag; + + i = 0; + while (1) + { + //extract the fragment starting from position i + ka = 0; + for (k = 0; k<L_frag; k++) + { + int kk = k + i; + r1[k][0] = xtm[kk][0]; + r1[k][1] = xtm[kk][1]; + r1[k][2] = xtm[kk][2]; + + r2[k][0] = ytm[kk][0]; + r2[k][1] = ytm[kk][1]; + r2[k][2] = ytm[kk][2]; + + k_ali[ka] = kk; + ka++; + } + //extract rotation matrix based on the fragment + Kabsch(r1, r2, L_frag, 1, &rmsd, t, u); + if (simplify_step != 1) + *Rcomm = 0; + do_rotation(xtm, xt, Lali, t, u); + + //get subsegment of this fragment + d = local_d0_search - 1; + n_cut = score_fun8_standard(xt, ytm, Lali, d, i_ali, &score, + score_sum_method, score_d8, d0); + + if (score>score_max) + { + score_max = score; + + //save the rotation matrix + for (k = 0; k<3; k++) + { + t0[k] = t[k]; + u0[k][0] = u[k][0]; + u0[k][1] = u[k][1]; + u0[k][2] = u[k][2]; + } + } + + //try to extend the alignment iteratively + d = local_d0_search + 1; + for (int it = 0; it<n_it; it++) + { + ka = 0; + for (k = 0; k<n_cut; k++) + { + m = i_ali[k]; + r1[k][0] = xtm[m][0]; + r1[k][1] = xtm[m][1]; + r1[k][2] = xtm[m][2]; + + r2[k][0] = ytm[m][0]; + r2[k][1] = ytm[m][1]; + r2[k][2] = ytm[m][2]; + + k_ali[ka] = m; + ka++; + } + //extract rotation matrix based on the fragment + Kabsch(r1, r2, n_cut, 1, &rmsd, t, u); + do_rotation(xtm, xt, Lali, t, u); + n_cut = score_fun8_standard(xt, ytm, Lali, d, i_ali, &score, + score_sum_method, score_d8, d0); + if (score>score_max) + { + score_max = score; + + //save the rotation matrix + for (k = 0; k<3; k++) + { + t0[k] = t[k]; + u0[k][0] = u[k][0]; + u0[k][1] = u[k][1]; + u0[k][2] = u[k][2]; + } + } + + //check if it converges + if (n_cut == ka) + { + for (k = 0; k<n_cut; k++) + { + if (i_ali[k] != k_ali[k]) break; + } + if (k == n_cut) break; + } + } //for iteration + + if (i<iL_max) + { + i = i + simplify_step; //shift the fragment + if (i>iL_max) i = iL_max; //do this to use the last missed fragment + } + else if (i >= iL_max) break; + }//while(1) + //end of one fragment + }//for(i_init + return score_max; +} + +//Comprehensive TMscore search engine +// input: two vector sets: x, y +// an alignment invmap0[] between x and y +// simplify_step: 1 or 40 or other integers +// score_sum_method: 0 for score over all pairs +// 8 for socre over the pairs with dist<score_d8 +// output: the best rotaion matrix t, u that results in highest TMscore +double detailed_search(double **r1, double **r2, double **xtm, double **ytm, + double **xt, double **x, double **y, int xlen, int ylen, + int invmap0[], double t[3], double u[3][3], int simplify_step, + int score_sum_method, double local_d0_search, double Lnorm, + double score_d8, double d0) +{ + //x is model, y is template, try to superpose onto y + int i, j, k; + double tmscore; + double rmsd; + + k=0; + for(i=0; i<ylen; i++) + { + j=invmap0[i]; + if(j>=0) //aligned + { + xtm[k][0]=x[j][0]; + xtm[k][1]=x[j][1]; + xtm[k][2]=x[j][2]; + + ytm[k][0]=y[i][0]; + ytm[k][1]=y[i][1]; + ytm[k][2]=y[i][2]; + k++; + } + } + + //detailed search 40-->1 + tmscore = TMscore8_search(r1, r2, xtm, ytm, xt, k, t, u, simplify_step, + score_sum_method, &rmsd, local_d0_search, Lnorm, score_d8, d0); + return tmscore; +} + +double detailed_search_standard( double **r1, double **r2, + double **xtm, double **ytm, double **xt, double **x, double **y, + int xlen, int ylen, int invmap0[], double t[3], double u[3][3], + int simplify_step, int score_sum_method, double local_d0_search, + const bool& bNormalize, double Lnorm, double score_d8, double d0) +{ + //x is model, y is template, try to superpose onto y + int i, j, k; + double tmscore; + double rmsd; + + k=0; + for(i=0; i<ylen; i++) + { + j=invmap0[i]; + if(j>=0) //aligned + { + xtm[k][0]=x[j][0]; + xtm[k][1]=x[j][1]; + xtm[k][2]=x[j][2]; + + ytm[k][0]=y[i][0]; + ytm[k][1]=y[i][1]; + ytm[k][2]=y[i][2]; + k++; + } + } + + //detailed search 40-->1 + tmscore = TMscore8_search_standard( r1, r2, xtm, ytm, xt, k, t, u, + simplify_step, score_sum_method, &rmsd, local_d0_search, score_d8, d0); + if (bNormalize)// "-i", to use standard_TMscore, then bNormalize=true, else bNormalize=false; + tmscore = tmscore * k / Lnorm; + + return tmscore; +} + +//compute the score quickly in three iterations +double get_score_fast( double **r1, double **r2, double **xtm, double **ytm, + double **x, double **y, int xlen, int ylen, int invmap[], + double d0, double d0_search, double t[3], double u[3][3]) +{ + double rms, tmscore, tmscore1, tmscore2; + int i, j, k; + + k=0; + for(j=0; j<ylen; j++) + { + i=invmap[j]; + if(i>=0) + { + r1[k][0]=x[i][0]; + r1[k][1]=x[i][1]; + r1[k][2]=x[i][2]; + + r2[k][0]=y[j][0]; + r2[k][1]=y[j][1]; + r2[k][2]=y[j][2]; + + xtm[k][0]=x[i][0]; + xtm[k][1]=x[i][1]; + xtm[k][2]=x[i][2]; + + ytm[k][0]=y[j][0]; + ytm[k][1]=y[j][1]; + ytm[k][2]=y[j][2]; + + k++; + } + else if(i!=-1) PrintErrorAndQuit("Wrong map!\n"); + } + Kabsch(r1, r2, k, 1, &rms, t, u); + + //evaluate score + double di; + const int len=k; + double dis[len]; + double d00=d0_search; + double d002=d00*d00; + double d02=d0*d0; + + int n_ali=k; + double xrot[3]; + tmscore=0; + for(k=0; k<n_ali; k++) + { + transform(t, u, &xtm[k][0], xrot); + di=dist(xrot, &ytm[k][0]); + dis[k]=di; + tmscore += 1/(1+di/d02); + } + + + + //second iteration + double d002t=d002; + while(1) + { + j=0; + for(k=0; k<n_ali; k++) + { + if(dis[k]<=d002t) + { + r1[j][0]=xtm[k][0]; + r1[j][1]=xtm[k][1]; + r1[j][2]=xtm[k][2]; + + r2[j][0]=ytm[k][0]; + r2[j][1]=ytm[k][1]; + r2[j][2]=ytm[k][2]; + + j++; + } + } + //there are not enough feasible pairs, relieve the threshold + if(j<3 && n_ali>3) d002t += 0.5; + else break; + } + + if(n_ali!=j) + { + Kabsch(r1, r2, j, 1, &rms, t, u); + tmscore1=0; + for(k=0; k<n_ali; k++) + { + transform(t, u, &xtm[k][0], xrot); + di=dist(xrot, &ytm[k][0]); + dis[k]=di; + tmscore1 += 1/(1+di/d02); + } + + //third iteration + d002t=d002+1; + + while(1) + { + j=0; + for(k=0; k<n_ali; k++) + { + if(dis[k]<=d002t) + { + r1[j][0]=xtm[k][0]; + r1[j][1]=xtm[k][1]; + r1[j][2]=xtm[k][2]; + + r2[j][0]=ytm[k][0]; + r2[j][1]=ytm[k][1]; + r2[j][2]=ytm[k][2]; + + j++; + } + } + //there are not enough feasible pairs, relieve the threshold + if(j<3 && n_ali>3) d002t += 0.5; + else break; + } + + //evaluate the score + Kabsch(r1, r2, j, 1, &rms, t, u); + tmscore2=0; + for(k=0; k<n_ali; k++) + { + transform(t, u, &xtm[k][0], xrot); + di=dist(xrot, &ytm[k][0]); + tmscore2 += 1/(1+di/d02); + } + } + else + { + tmscore1=tmscore; + tmscore2=tmscore; + } + + if(tmscore1>=tmscore) tmscore=tmscore1; + if(tmscore2>=tmscore) tmscore=tmscore2; + return tmscore; // no need to normalize this score because it will not be used for latter scoring +} + + +//perform gapless threading to find the best initial alignment +//input: x, y, xlen, ylen +//output: y2x0 stores the best alignment: e.g., +//y2x0[j]=i means: +//the jth element in y is aligned to the ith element in x if i>=0 +//the jth element in y is aligned to a gap in x if i==-1 +double get_initial(double **r1, double **r2, double **xtm, double **ytm, + double **x, double **y, int xlen, int ylen, int *y2x, + double d0, double d0_search, const bool fast_opt, + double t[3], double u[3][3]) +{ + int min_len=getmin(xlen, ylen); + if(min_len<=5) PrintErrorAndQuit("Sequence is too short <=5!\n"); + + int min_ali= min_len/2; //minimum size of considered fragment + if(min_ali<=5) min_ali=5; + int n1, n2; + n1 = -ylen+min_ali; + n2 = xlen-min_ali; + + int i, j, k, k_best; + double tmscore, tmscore_max=-1; + + k_best=n1; + for(k=n1; k<=n2; k+=(fast_opt)?5:1) + { + //get the map + for(j=0; j<ylen; j++) + { + i=j+k; + if(i>=0 && i<xlen) y2x[j]=i; + else y2x[j]=-1; + } + + //evaluate the map quickly in three iterations + //this is not real tmscore, it is used to evaluate the goodness of the initial alignment + tmscore=get_score_fast(r1, r2, xtm, ytm, + x, y, xlen, ylen, y2x, d0,d0_search, t, u); + if(tmscore>=tmscore_max) + { + tmscore_max=tmscore; + k_best=k; + } + } + + //extract the best map + k=k_best; + for(j=0; j<ylen; j++) + { + i=j+k; + if(i>=0 && i<xlen) y2x[j]=i; + else y2x[j]=-1; + } + + return tmscore_max; +} + +void smooth(int *sec, int len) +{ + int i, j; + //smooth single --x-- => ----- + for (i=2; i<len-2; i++) + { + if(sec[i]==2 || sec[i]==4) + { + j=sec[i]; + if (sec[i-2]!=j && sec[i-1]!=j && sec[i+1]!=j && sec[i+2]!=j) + sec[i]=1; + } + } + + // smooth double + // --xx-- => ------ + for (i=0; i<len-5; i++) + { + //helix + if (sec[i]!=2 && sec[i+1]!=2 && sec[i+2]==2 && sec[i+3]==2 && + sec[i+4]!=2 && sec[i+5]!= 2) + { + sec[i+2]=1; + sec[i+3]=1; + } + + //beta + if (sec[i]!=4 && sec[i+1]!=4 && sec[i+2]==4 && sec[i+3]==4 && + sec[i+4]!=4 && sec[i+5]!= 4) + { + sec[i+2]=1; + sec[i+3]=1; + } + } + + //smooth connect + for (i=0; i<len-2; i++) + { + if (sec[i]==2 && sec[i+1]!=2 && sec[i+2]==2) sec[i+1]=2; + else if(sec[i]==4 && sec[i+1]!=4 && sec[i+2]==4) sec[i+1]=4; + } + +} + +int sec_str(double dis13, double dis14, double dis15, + double dis24, double dis25, double dis35) +{ + int s=1; + + double delta=2.1; + if (fabs(dis15-6.37)<delta && fabs(dis14-5.18)<delta && + fabs(dis25-5.18)<delta && fabs(dis13-5.45)<delta && + fabs(dis24-5.45)<delta && fabs(dis35-5.45)<delta) + { + s=2; //helix + return s; + } + + delta=1.42; + if (fabs(dis15-13 )<delta && fabs(dis14-10.4)<delta && + fabs(dis25-10.4)<delta && fabs(dis13-6.1 )<delta && + fabs(dis24-6.1 )<delta && fabs(dis35-6.1 )<delta) + { + s=4; //strand + return s; + } + + if (dis15 < 8) s=3; //turn + return s; +} + + +/* secondary stucture assignment for protein: + * 1->coil, 2->helix, 3->turn, 4->strand */ +void make_sec(double **x, int len, int *sec) +{ + int j1, j2, j3, j4, j5; + double d13, d14, d15, d24, d25, d35; + for(int i=0; i<len; i++) + { + sec[i]=1; + j1=i-2; + j2=i-1; + j3=i; + j4=i+1; + j5=i+2; + + if(j1>=0 && j5<len) + { + d13=sqrt(dist(x[j1], x[j3])); + d14=sqrt(dist(x[j1], x[j4])); + d15=sqrt(dist(x[j1], x[j5])); + d24=sqrt(dist(x[j2], x[j4])); + d25=sqrt(dist(x[j2], x[j5])); + d35=sqrt(dist(x[j3], x[j5])); + sec[i]=sec_str(d13, d14, d15, d24, d25, d35); + } + } +} + +/* a c d b: a paired to b, c paired to d */ +bool overlap(const int a1,const int b1,const int c1,const int d1, + const int a2,const int b2,const int c2,const int d2) +{ + return (a2>=a1&&a2<=c1)||(c2>=a1&&c2<=c1)|| + (d2>=a1&&d2<=c1)||(b2>=a1&&b2<=c1)|| + (a2>=d1&&a2<=b1)||(c2>=d1&&c2<=b1)|| + (d2>=d1&&d2<=b1)||(b2>=d1&&b2<=b1); +} + +/* find base pairing stacks in RNA*/ +void sec_str(int len,char *seq, const vector<vector<bool> >&bp, + int a, int b,int &c, int &d) +{ + int i,j; + + for (i=0;i<len;i++) + { + if (a+i<len-3 && b-i>0) + { + if (a+i<b-i && bp[a+i][b-i]) continue; + break; + } + } + c=a+i-1;d=b-i+1; +} + +/* secondary structure assignment for RNA: + * 1->unpair, 2->paired with upstream, 3->paired with downstream */ +void make_sec(char *seq, double **x, int len, int *sec,const string atom_opt) +{ + int ii,jj,i,j; + + float lb=12.5; // lower bound for " C3'" + float ub=15.0; // upper bound for " C3'" + if (atom_opt==" C4'") {lb=14.0;ub=16.0;} + else if(atom_opt==" C5'") {lb=16.0;ub=18.0;} + else if(atom_opt==" O3'") {lb=13.5;ub=16.5;} + else if(atom_opt==" O5'") {lb=15.5;ub=18.5;} + else if(atom_opt==" P ") {lb=16.5;ub=21.0;} + + float dis; + vector<bool> bp_tmp(len,false); + vector<vector<bool> > bp(len,bp_tmp); + bp_tmp.clear(); + for (i=0; i<len; i++) + { + sec[i]=1; + for (j=i+1; j<len; j++) + { + if (((seq[i]=='u'||seq[i]=='t')&&(seq[j]=='a' ))|| + ((seq[i]=='a' )&&(seq[j]=='u'||seq[j]=='t'))|| + ((seq[i]=='g' )&&(seq[j]=='c'||seq[j]=='u'))|| + ((seq[i]=='c'||seq[i]=='u')&&(seq[j]=='g' ))) + { + dis=sqrt(dist(x[i], x[j])); + bp[j][i]=bp[i][j]=(dis>lb && dis<ub); + } + } + } + + // From 5' to 3': A0 C0 D0 B0: A0 paired to B0, C0 paired to D0 + vector<int> A0,B0,C0,D0; + for (i=0; i<len-2; i++) + { + for (j=i+3; j<len; j++) + { + if (!bp[i][j]) continue; + if (i>0 && j+1<len && bp[i-1][j+1]) continue; + if (!bp[i+1][j-1]) continue; + sec_str(len,seq, bp, i,j,ii,jj); + A0.push_back(i); + B0.push_back(j); + C0.push_back(ii); + D0.push_back(jj); + } + } + + int sign; + for (i=0;i<A0.size();i++) + { + /* + sign=0; + if(C0[i]-A0[i]<=1) + { + for(j=0;j<A0.size();j++) + { + if(i==j) continue; + + if((A0[j]>=A0[i]&&A0[j]<=C0[i])|| + (C0[j]>=A0[i]&&C0[j]<=C0[i])|| + (D0[j]>=A0[i]&&D0[j]<=C0[i])|| + (B0[j]>=A0[i]&&B0[j]<=C0[i])|| + (A0[j]>=D0[i]&&A0[j]<=B0[i])|| + (C0[j]>=D0[i]&&C0[j]<=B0[i])|| + (D0[j]>=D0[i]&&D0[j]<=B0[i])|| + (B0[j]>=D0[i]&&B0[j]<=B0[i])) + { + sign=-1; + break; + } + } + } + if(sign!=0) continue; + */ + + for (j=0;;j++) + { + if(A0[i]+j>C0[i]) break; + sec[A0[i]+j]=2; + sec[D0[i]+j]=3; + } + } + + /* clean up */ + A0.clear(); + B0.clear(); + C0.clear(); + D0.clear(); + bp.clear(); +} + +//get initial alignment from secondary structure alignment +//input: x, y, xlen, ylen +//output: y2x stores the best alignment: e.g., +//y2x[j]=i means: +//the jth element in y is aligned to the ith element in x if i>=0 +//the jth element in y is aligned to a gap in x if i==-1 +void get_initial_ss(bool **path, double **val, + const int *secx, const int *secy, int xlen, int ylen, int *y2x) +{ + double gap_open=-1.0; + NWDP_TM(path, val, secx, secy, xlen, ylen, gap_open, y2x); +} + + +// get_initial5 in TMalign fortran, get_initial_local in TMalign c by yangji +//get initial alignment of local structure superposition +//input: x, y, xlen, ylen +//output: y2x stores the best alignment: e.g., +//y2x[j]=i means: +//the jth element in y is aligned to the ith element in x if i>=0 +//the jth element in y is aligned to a gap in x if i==-1 +bool get_initial5( double **r1, double **r2, double **xtm, double **ytm, + bool **path, double **val, + double **x, double **y, int xlen, int ylen, int *y2x, + double d0, double d0_search, const bool fast_opt, const double D0_MIN) +{ + double GL, rmsd; + double t[3]; + double u[3][3]; + + double d01 = d0 + 1.5; + if (d01 < D0_MIN) d01 = D0_MIN; + double d02 = d01*d01; + + double GLmax = 0; + int aL = getmin(xlen, ylen); + int *invmap = new int[ylen + 1]; + + // jump on sequence1--------------> + int n_jump1 = 0; + if (xlen > 250) + n_jump1 = 45; + else if (xlen > 200) + n_jump1 = 35; + else if (xlen > 150) + n_jump1 = 25; + else + n_jump1 = 15; + if (n_jump1 > (xlen / 3)) + n_jump1 = xlen / 3; + + // jump on sequence2--------------> + int n_jump2 = 0; + if (ylen > 250) + n_jump2 = 45; + else if (ylen > 200) + n_jump2 = 35; + else if (ylen > 150) + n_jump2 = 25; + else + n_jump2 = 15; + if (n_jump2 > (ylen / 3)) + n_jump2 = ylen / 3; + + // fragment to superimpose--------------> + int n_frag[2] = { 20, 100 }; + if (n_frag[0] > (aL / 3)) + n_frag[0] = aL / 3; + if (n_frag[1] > (aL / 2)) + n_frag[1] = aL / 2; + + // start superimpose search--------------> + if (fast_opt) + { + n_jump1*=5; + n_jump2*=5; + } + bool flag = false; + for (int i_frag = 0; i_frag < 2; i_frag++) + { + int m1 = xlen - n_frag[i_frag] + 1; + int m2 = ylen - n_frag[i_frag] + 1; + + for (int i = 0; i<m1; i = i + n_jump1) //index starts from 0, different from FORTRAN + { + for (int j = 0; j<m2; j = j + n_jump2) + { + for (int k = 0; k<n_frag[i_frag]; k++) //fragment in y + { + r1[k][0] = x[k + i][0]; + r1[k][1] = x[k + i][1]; + r1[k][2] = x[k + i][2]; + + r2[k][0] = y[k + j][0]; + r2[k][1] = y[k + j][1]; + r2[k][2] = y[k + j][2]; + } + + // superpose the two structures and rotate it + Kabsch(r1, r2, n_frag[i_frag], 1, &rmsd, t, u); + + double gap_open = 0.0; + NWDP_TM(path, val, x, y, xlen, ylen, + t, u, d02, gap_open, invmap); + GL = get_score_fast(r1, r2, xtm, ytm, x, y, xlen, ylen, + invmap, d0, d0_search, t, u); + if (GL>GLmax) + { + GLmax = GL; + for (int ii = 0; ii<ylen; ii++) y2x[ii] = invmap[ii]; + flag = true; + } + } + } + } + + delete[] invmap; + return flag; +} + +void score_matrix_rmsd_sec( double **r1, double **r2, + double **score, const int *secx, const int *secy, + double **x, double **y, int xlen, int ylen, + int *y2x, const double D0_MIN, double d0) +{ + double t[3], u[3][3]; + double rmsd, dij; + double d01=d0+1.5; + if(d01 < D0_MIN) d01=D0_MIN; + double d02=d01*d01; + + double xx[3]; + int i, k=0; + for(int j=0; j<ylen; j++) + { + i=y2x[j]; + if(i>=0) + { + r1[k][0]=x[i][0]; + r1[k][1]=x[i][1]; + r1[k][2]=x[i][2]; + + r2[k][0]=y[j][0]; + r2[k][1]=y[j][1]; + r2[k][2]=y[j][2]; + + k++; + } + } + Kabsch(r1, r2, k, 1, &rmsd, t, u); + + + for(int ii=0; ii<xlen; ii++) + { + transform(t, u, &x[ii][0], xx); + for(int jj=0; jj<ylen; jj++) + { + dij=dist(xx, &y[jj][0]); + if (secx[ii]==secy[jj]) + score[ii+1][jj+1] = 1.0/(1+dij/d02) + 0.5; + else + score[ii+1][jj+1] = 1.0/(1+dij/d02); + } + } +} + + +//get initial alignment from secondary structure and previous alignments +//input: x, y, xlen, ylen +//output: y2x stores the best alignment: e.g., +//y2x[j]=i means: +//the jth element in y is aligned to the ith element in x if i>=0 +//the jth element in y is aligned to a gap in x if i==-1 +void get_initial_ssplus(double **r1, double **r2, double **score, bool **path, + double **val, const int *secx, const int *secy, double **x, double **y, + int xlen, int ylen, int *y2x0, int *y2x, const double D0_MIN, double d0) +{ + //create score matrix for DP + score_matrix_rmsd_sec(r1, r2, score, secx, secy, x, y, xlen, ylen, + y2x0, D0_MIN,d0); + + double gap_open=-1.0; + NWDP_TM(score, path, val, xlen, ylen, gap_open, y2x); +} + + +void find_max_frag(double **x, int len, int *start_max, + int *end_max, double dcu0, const bool fast_opt) +{ + int r_min, fra_min=4; //minimum fragment for search + if (fast_opt) fra_min=8; + int start; + int Lfr_max=0; + + r_min= (int) (len*1.0/3.0); //minimum fragment, in case too small protein + if(r_min > fra_min) r_min=fra_min; + + int inc=0; + double dcu0_cut=dcu0*dcu0;; + double dcu_cut=dcu0_cut; + + while(Lfr_max < r_min) + { + Lfr_max=0; + int j=1; //number of residues at nf-fragment + start=0; + for(int i=1; i<len; i++) + { + if(dist(x[i-1], x[i]) < dcu_cut) + { + j++; + + if(i==(len-1)) + { + if(j > Lfr_max) + { + Lfr_max=j; + *start_max=start; + *end_max=i; + } + j=1; + } + } + else + { + if(j>Lfr_max) + { + Lfr_max=j; + *start_max=start; + *end_max=i-1; + } + + j=1; + start=i; + } + }// for i; + + if(Lfr_max < r_min) + { + inc++; + double dinc=pow(1.1, (double) inc) * dcu0; + dcu_cut= dinc*dinc; + } + }//while <; +} + +//perform fragment gapless threading to find the best initial alignment +//input: x, y, xlen, ylen +//output: y2x0 stores the best alignment: e.g., +//y2x0[j]=i means: +//the jth element in y is aligned to the ith element in x if i>=0 +//the jth element in y is aligned to a gap in x if i==-1 +double get_initial_fgt(double **r1, double **r2, double **xtm, double **ytm, + double **x, double **y, int xlen, int ylen, + int *y2x, double d0, double d0_search, + double dcu0, const bool fast_opt, double t[3], double u[3][3]) +{ + int fra_min=4; //minimum fragment for search + if (fast_opt) fra_min=8; + int fra_min1=fra_min-1; //cutoff for shift, save time + + int xstart=0, ystart=0, xend=0, yend=0; + + find_max_frag(x, xlen, &xstart, &xend, dcu0, fast_opt); + find_max_frag(y, ylen, &ystart, ¥d, dcu0, fast_opt); + + + int Lx = xend-xstart+1; + int Ly = yend-ystart+1; + int *ifr, *y2x_; + int L_fr=getmin(Lx, Ly); + ifr= new int[L_fr]; + y2x_= new int[ylen+1]; + + //select what piece will be used. The original implement may cause + //asymetry, but only when xlen==ylen and Lx==Ly + //if L1=Lfr1 and L2=Lfr2 (normal proteins), it will be the same as initial1 + + if(Lx<Ly || (Lx==Ly && xlen<ylen)) + { + for(int i=0; i<L_fr; i++) ifr[i]=xstart+i; + } + else if(Lx>Ly || (Lx==Ly && xlen>ylen)) + { + for(int i=0; i<L_fr; i++) ifr[i]=ystart+i; + } + else // solve asymetric for 1x5gA vs 2q7nA5 + { + /* In this case, L0==xlen==ylen; L_fr==Lx==Ly */ + int L0=xlen; + double tmscore, tmscore_max=-1; + int i, j, k; + int n1, n2; + int min_len; + int min_ali; + + /* part 1, normalized by xlen */ + for(i=0; i<L_fr; i++) ifr[i]=xstart+i; + + if(L_fr==L0) + { + n1= (int)(L0*0.1); //my index starts from 0 + n2= (int)(L0*0.89); + j=0; + for(i=n1; i<= n2; i++) + { + ifr[j]=ifr[i]; + j++; + } + L_fr=j; + } + + int L1=L_fr; + min_len=getmin(L1, ylen); + min_ali= (int) (min_len/2.5); //minimum size of considered fragment + if(min_ali<=fra_min1) min_ali=fra_min1; + n1 = -ylen+min_ali; + n2 = L1-min_ali; + + for(k=n1; k<=n2; k+=(fast_opt)?3:1) + { + //get the map + for(j=0; j<ylen; j++) + { + i=j+k; + if(i>=0 && i<L1) y2x_[j]=ifr[i]; + else y2x_[j]=-1; + } + + //evaluate the map quickly in three iterations + tmscore=get_score_fast(r1, r2, xtm, ytm, x, y, xlen, ylen, y2x_, + d0, d0_search, t, u); + + if(tmscore>=tmscore_max) + { + tmscore_max=tmscore; + for(j=0; j<ylen; j++) y2x[j]=y2x_[j]; + } + } + + /* part 2, normalized by ylen */ + L_fr=Ly; + for(i=0; i<L_fr; i++) ifr[i]=ystart+i; + + if (L_fr==L0) + { + n1= (int)(L0*0.1); //my index starts from 0 + n2= (int)(L0*0.89); + + j=0; + for(i=n1; i<= n2; i++) + { + ifr[j]=ifr[i]; + j++; + } + L_fr=j; + } + + int L2=L_fr; + min_len=getmin(xlen, L2); + min_ali= (int) (min_len/2.5); //minimum size of considered fragment + if(min_ali<=fra_min1) min_ali=fra_min1; + n1 = -L2+min_ali; + n2 = xlen-min_ali; + + for(k=n1; k<=n2; k++) + { + //get the map + for(j=0; j<ylen; j++) y2x_[j]=-1; + + for(j=0; j<L2; j++) + { + i=j+k; + if(i>=0 && i<xlen) y2x_[ifr[j]]=i; + } + + //evaluate the map quickly in three iterations + tmscore=get_score_fast(r1, r2, xtm, ytm, + x, y, xlen, ylen, y2x_, d0,d0_search, t, u); + if(tmscore>=tmscore_max) + { + tmscore_max=tmscore; + for(j=0; j<ylen; j++) y2x[j]=y2x_[j]; + } + } + + delete [] ifr; + delete [] y2x_; + return tmscore_max; + } + + + int L0=getmin(xlen, ylen); //non-redundant to get_initial1 + if(L_fr==L0) + { + int n1= (int)(L0*0.1); //my index starts from 0 + int n2= (int)(L0*0.89); + + int j=0; + for(int i=n1; i<= n2; i++) + { + ifr[j]=ifr[i]; + j++; + } + L_fr=j; + } + + + //gapless threading for the extracted fragment + double tmscore, tmscore_max=-1; + + if(Lx<Ly || (Lx==Ly && xlen<=ylen)) + { + int L1=L_fr; + int min_len=getmin(L1, ylen); + int min_ali= (int) (min_len/2.5); //minimum size of considered fragment + if(min_ali<=fra_min1) min_ali=fra_min1; + int n1, n2; + n1 = -ylen+min_ali; + n2 = L1-min_ali; + + int i, j, k; + for(k=n1; k<=n2; k+=(fast_opt)?3:1) + { + //get the map + for(j=0; j<ylen; j++) + { + i=j+k; + if(i>=0 && i<L1) y2x_[j]=ifr[i]; + else y2x_[j]=-1; + } + + //evaluate the map quickly in three iterations + tmscore=get_score_fast(r1, r2, xtm, ytm, x, y, xlen, ylen, y2x_, + d0, d0_search, t, u); + + if(tmscore>=tmscore_max) + { + tmscore_max=tmscore; + for(j=0; j<ylen; j++) y2x[j]=y2x_[j]; + } + } + } + else + { + int L2=L_fr; + int min_len=getmin(xlen, L2); + int min_ali= (int) (min_len/2.5); //minimum size of considered fragment + if(min_ali<=fra_min1) min_ali=fra_min1; + int n1, n2; + n1 = -L2+min_ali; + n2 = xlen-min_ali; + + int i, j, k; + + for(k=n1; k<=n2; k++) + { + //get the map + for(j=0; j<ylen; j++) y2x_[j]=-1; + + for(j=0; j<L2; j++) + { + i=j+k; + if(i>=0 && i<xlen) y2x_[ifr[j]]=i; + } + + //evaluate the map quickly in three iterations + tmscore=get_score_fast(r1, r2, xtm, ytm, + x, y, xlen, ylen, y2x_, d0,d0_search, t, u); + if(tmscore>=tmscore_max) + { + tmscore_max=tmscore; + for(j=0; j<ylen; j++) y2x[j]=y2x_[j]; + } + } + } + + + delete [] ifr; + delete [] y2x_; + return tmscore_max; +} + +//heuristic run of dynamic programing iteratively to find the best alignment +//input: initial rotation matrix t, u +// vectors x and y, d0 +//output: best alignment that maximizes the TMscore, will be stored in invmap +double DP_iter(double **r1, double **r2, double **xtm, double **ytm, + double **xt, bool **path, double **val, double **x, double **y, + int xlen, int ylen, double t[3], double u[3][3], int invmap0[], + int g1, int g2, int iteration_max, double local_d0_search, + double D0_MIN, double Lnorm, double d0, double score_d8) +{ + double gap_open[2]={-0.6, 0}; + double rmsd; + int *invmap=new int[ylen+1]; + + int iteration, i, j, k; + double tmscore, tmscore_max, tmscore_old=0; + int score_sum_method=8, simplify_step=40; + tmscore_max=-1; + + //double d01=d0+1.5; + double d02=d0*d0; + for(int g=g1; g<g2; g++) + { + for(iteration=0; iteration<iteration_max; iteration++) + { + NWDP_TM(path, val, x, y, xlen, ylen, + t, u, d02, gap_open[g], invmap); + + k=0; + for(j=0; j<ylen; j++) + { + i=invmap[j]; + + if(i>=0) //aligned + { + xtm[k][0]=x[i][0]; + xtm[k][1]=x[i][1]; + xtm[k][2]=x[i][2]; + + ytm[k][0]=y[j][0]; + ytm[k][1]=y[j][1]; + ytm[k][2]=y[j][2]; + k++; + } + } + + tmscore = TMscore8_search(r1, r2, xtm, ytm, xt, k, t, u, + simplify_step, score_sum_method, &rmsd, local_d0_search, + Lnorm, score_d8, d0); + + + if(tmscore>tmscore_max) + { + tmscore_max=tmscore; + for(i=0; i<ylen; i++) invmap0[i]=invmap[i]; + } + + if(iteration>0) + { + if(fabs(tmscore_old-tmscore)<0.000001) break; + } + tmscore_old=tmscore; + }// for iteration + + }//for gapopen + + + delete []invmap; + return tmscore_max; +} + + +void output_superpose(const string filename, const char *fname_super, + double t[3], double u[3][3], const int ter_opt=3) +{ + int compress_type=0; // uncompressed file + ifstream fin; + redi::ipstream fin_gz; // if file is compressed + if (filename.size()>=3 && + filename.substr(filename.size()-3,3)==".gz") + { + fin_gz.open("zcat "+filename); + compress_type=1; + } + else if (filename.size()>=4 && + filename.substr(filename.size()-4,4)==".bz2") + { + fin_gz.open("bzcat "+filename); + compress_type=2; + } + else fin.open(filename.c_str()); + + stringstream buf; + string line; + double x[3]; // before transform + double x1[3]; // after transform + + /* for PDBx/mmCIF only */ + map<string,int> _atom_site; + int atom_site_pos; + vector<string> line_vec; + + while (compress_type?fin_gz.good():fin.good()) + { + if (compress_type) getline(fin_gz, line); + else getline(fin, line); + if (line.compare(0, 6, "ATOM ")==0 || + line.compare(0, 6, "HETATM")==0) // PDB format + { + x[0]=atof(line.substr(30,8).c_str()); + x[1]=atof(line.substr(38,8).c_str()); + x[2]=atof(line.substr(46,8).c_str()); + transform(t, u, x, x1); + buf<<line.substr(0,30)<<setiosflags(ios::fixed) + <<setprecision(3) + <<setw(8)<<x1[0] <<setw(8)<<x1[1] <<setw(8)<<x1[2] + <<line.substr(54)<<'\n'; + } + else if (line.compare(0,5,"loop_")==0) // PDBx/mmCIF + { + buf<<line<<'\n'; + if (compress_type) getline(fin_gz, line); + else getline(fin, line); + buf<<line<<'\n'; + if (line.compare(0,11,"_atom_site.")) continue; + _atom_site.clear(); + atom_site_pos=0; + _atom_site[line.substr(11,line.size()-12)]=atom_site_pos; + while(1) + { + if (compress_type) getline(fin_gz, line); + else getline(fin, line); + if (line.compare(0,11,"_atom_site.")) break; + _atom_site[line.substr(11,line.size()-12)]=++atom_site_pos; + buf<<line<<'\n'; + } + + if (_atom_site.count("group_PDB")* + _atom_site.count("Cartn_x")* + _atom_site.count("Cartn_y")* + _atom_site.count("Cartn_z")==0) + { + buf<<line<<'\n'; + cerr<<"Warning! Missing one of the following _atom_site data items: group_PDB, Cartn_x, Cartn_y, Cartn_z"<<endl; + continue; + } + + while(1) + { + line_vec.clear(); + split(line,line_vec); + if (line_vec[_atom_site["group_PDB"]]!="ATOM" && + line_vec[_atom_site["group_PDB"]]!="HETATM") break; + + x[0]=atof(line_vec[_atom_site["Cartn_x"]].c_str()); + x[1]=atof(line_vec[_atom_site["Cartn_y"]].c_str()); + x[2]=atof(line_vec[_atom_site["Cartn_z"]].c_str()); + transform(t, u, x, x1); + + for (atom_site_pos=0; atom_site_pos<_atom_site.size(); atom_site_pos++) + { + if (atom_site_pos==_atom_site["Cartn_x"]) + buf<<setiosflags(ios::fixed)<<setprecision(3) + <<setw(8)<<x1[0]<<' '; + else if (atom_site_pos==_atom_site["Cartn_y"]) + buf<<setiosflags(ios::fixed)<<setprecision(3) + <<setw(8)<<x1[1]<<' '; + else if (atom_site_pos==_atom_site["Cartn_z"]) + buf<<setiosflags(ios::fixed)<<setprecision(3) + <<setw(8)<<x1[2]<<' '; + else buf<<line_vec[atom_site_pos]<<' '; + } + buf<<'\n'; + + if (compress_type && fin_gz.good()) getline(fin_gz, line); + else if (!compress_type && fin.good()) getline(fin, line); + else break; + } + if (compress_type?fin_gz.good():fin.good()) buf<<line<<'\n'; + } + else if (line.size()) + { + buf<<line<<'\n'; + if (ter_opt>=1 && line.compare(0,3,"END")==0) break; + } + } + if (compress_type) fin_gz.close(); + else fin.close(); + + ofstream fp(fname_super); + fp<<buf.str(); + fp.close(); + buf.str(string()); // clear stream +} + +/* extract rotation matrix based on TMscore8 */ +void output_rotation_matrix(const char* fname_matrix, + const double t[3], const double u[3][3]) +{ + fstream fout; + fout.open(fname_matrix, ios::out | ios::trunc); + if (fout)// succeed + { + fout << "------ The rotation matrix to rotate Chain_1 to Chain_2 ------\n"; + char dest[1000]; + sprintf(dest, "m %18s %14s %14s %14s\n", "t[m]", "u[m][0]", "u[m][1]", "u[m][2]"); + fout << string(dest); + for (int k = 0; k < 3; k++) + { + sprintf(dest, "%d %18.10f %14.10f %14.10f %14.10f\n", k, t[k], u[k][0], u[k][1], u[k][2]); + fout << string(dest); + } + fout << "\nCode for rotating Structure A from (x,y,z) to (X,Y,Z):\n" + "for(i=0; i<L; i++)\n" + "{\n" + " X[i] = t[0] + u[0][0]*x[i] + u[0][1]*y[i] + u[0][2]*z[i]\n" + " Y[i] = t[1] + u[1][0]*x[i] + u[1][1]*y[i] + u[1][2]*z[i]\n" + " Z[i] = t[2] + u[2][0]*x[i] + u[2][1]*y[i] + u[2][2]*z[i]\n" + "}\n"; + fout.close(); + } + else + cout << "Open file to output rotation matrix fail.\n"; +} + +//output the final results +void output_results( + const string xname, const string yname, + const char *chainID1, const char *chainID2, + const int xlen, const int ylen, double t[3], double u[3][3], + const double TM1, const double TM2, + const double TM3, const double TM4, const double TM5, + const double rmsd, const double d0_out, + const char *seqM, const char *seqxA, const char *seqyA, const double Liden, + const int n_ali8, const int n_ali, const int L_ali, + const double TM_ali, const double rmsd_ali, const double TM_0, + const double d0_0, const double d0A, const double d0B, + const double Lnorm_ass, const double d0_scale, + const double d0a, const double d0u, const char* fname_matrix, + const int outfmt_opt, const int ter_opt, const char *fname_super, + const bool i_opt, const bool I_opt, const int a_opt, + const bool u_opt, const bool d_opt) +{ + if (outfmt_opt<=0) + { + printf("\nName of Chain_1: %s%s (to be superimposed onto Chain_2)\n", + xname.c_str(), chainID1); + printf("Name of Chain_2: %s%s\n", yname.c_str(), chainID2); + printf("Length of Chain_1: %d residues\n", xlen); + printf("Length of Chain_2: %d residues\n\n", ylen); + + if (i_opt || I_opt) + printf("User-specified initial alignment: TM/Lali/rmsd = %7.5lf, %4d, %6.3lf\n", TM_ali, L_ali, rmsd_ali); + + printf("Aligned length= %d, RMSD= %6.2f, Seq_ID=n_identical/n_aligned= %4.3f\n", n_ali8, rmsd, Liden/(n_ali8+0.00000001)); + printf("TM-score= %6.5f (if normalized by length of Chain_1, i.e., LN=%d, d0=%.2f)\n", TM2, xlen, d0B); + printf("TM-score= %6.5f (if normalized by length of Chain_2, i.e., LN=%d, d0=%.2f)\n", TM1, ylen, d0A); + + if (a_opt==1) + printf("TM-score= %6.5f (if normalized by average length of two structures, i.e., LN= %.1f, d0= %.2f)\n", TM3, (xlen+ylen)*0.5, d0a); + if (u_opt) + printf("TM-score= %6.5f (if normalized by user-specified LN=%.2f and d0=%.2f)\n", TM4, Lnorm_ass, d0u); + if (d_opt) + printf("TM-score= %6.5f (if scaled by user-specified d0= %.2f, and LN= %d)\n", TM5, d0_scale, ylen); + printf("(You should use TM-score normalized by length of the reference structure)\n"); + + //output alignment + printf("\n(\":\" denotes residue pairs of d < %4.1f Angstrom, ", d0_out); + printf("\".\" denotes other aligned residues)\n"); + printf("%s\n", seqxA); + printf("%s\n", seqM); + printf("%s\n", seqyA); + } + else if (outfmt_opt==1) + { + printf(">%s%s\tL=%d\td0=%.2f\tseqID=%.3f\tTM-score=%.5f\n", + xname.c_str(), chainID1, xlen, d0B, Liden/xlen, TM2); + printf("%s\n", seqxA); + printf(">%s%s\tL=%d\td0=%.2f\tseqID=%.3f\tTM-score=%.5f\n", + yname.c_str(), chainID2, ylen, d0A, Liden/ylen, TM1); + printf("%s\n", seqyA); + + printf("# Lali=%d\tRMSD=%.2f\tseqID_ali=%.3f\n", + n_ali8, rmsd, Liden/(n_ali8+0.00000001)); + + if (i_opt || I_opt) + printf("# User-specified initial alignment: TM=%.5lf\tLali=%4d\trmsd=%.3lf\n", TM_ali, L_ali, rmsd_ali); + + if(a_opt) + printf("# TM-score=%.5f (normalized by average length of two structures: L=%.1f\td0=%.2f)\n", TM3, (xlen+ylen)*0.5, d0a); + + if(u_opt) + printf("# TM-score=%.5f (normalized by user-specified L=%.2f\td0=%.2f)\n", TM4, Lnorm_ass, d0u); + + if(d_opt) + printf("# TM-score=%.5f (scaled by user-specified d0=%.2f\tL=%d)\n", TM5, d0_scale, ylen); + + printf("$$$$\n"); + } + else if (outfmt_opt==2) + { + printf("%s%s\t%s%s\t%.4f\t%.4f\t%.2f\t%4.3f\t%4.3f\t%4.3f\t%d\t%d\t%d", + xname.c_str(), chainID1, yname.c_str(), chainID2, TM2, TM1, rmsd, + Liden/xlen, Liden/ylen, Liden/(n_ali8+0.00000001), + xlen, ylen, n_ali8); + } + cout << endl; + + if (strlen(fname_matrix)) + output_rotation_matrix(fname_matrix, t, u); + if (strlen(fname_super)) + output_superpose(xname, fname_super, t, u, ter_opt); +} + +double standard_TMscore(double **r1, double **r2, double **xtm, double **ytm, + double **xt, double **x, double **y, int xlen, int ylen, int invmap[], + int& L_ali, double& RMSD, double D0_MIN, double Lnorm, double d0, + double d0_search, double score_d8, double t[3], double u[3][3], + const int mol_type) +{ + D0_MIN = 0.5; + Lnorm = ylen; + if (mol_type>0) // RNA + { + if (Lnorm<=11) d0=0.3; + else if(Lnorm>11 && Lnorm<=15) d0=0.4; + else if(Lnorm>15 && Lnorm<=19) d0=0.5; + else if(Lnorm>19 && Lnorm<=23) d0=0.6; + else if(Lnorm>23 && Lnorm<30) d0=0.7; + else d0=(0.6*pow((Lnorm*1.0-0.5), 1.0/2)-2.5); + } + else + { + if (Lnorm > 21) d0=(1.24*pow((Lnorm*1.0-15), 1.0/3) -1.8); + else d0 = D0_MIN; + if (d0 < D0_MIN) d0 = D0_MIN; + } + double d0_input = d0;// Scaled by seq_min + + double tmscore;// collected alined residues from invmap + int n_al = 0; + int i; + for (int j = 0; j<ylen; j++) + { + i = invmap[j]; + if (i >= 0) + { + xtm[n_al][0] = x[i][0]; + xtm[n_al][1] = x[i][1]; + xtm[n_al][2] = x[i][2]; + + ytm[n_al][0] = y[j][0]; + ytm[n_al][1] = y[j][1]; + ytm[n_al][2] = y[j][2]; + + r1[n_al][0] = x[i][0]; + r1[n_al][1] = x[i][1]; + r1[n_al][2] = x[i][2]; + + r2[n_al][0] = y[j][0]; + r2[n_al][1] = y[j][1]; + r2[n_al][2] = y[j][2]; + + n_al++; + } + else if (i != -1) PrintErrorAndQuit("Wrong map!\n"); + } + L_ali = n_al; + + Kabsch(r1, r2, n_al, 0, &RMSD, t, u); + RMSD = sqrt( RMSD/(1.0*n_al) ); + + int temp_simplify_step = 1; + int temp_score_sum_method = 0; + d0_search = d0_input; + double rms = 0.0; + tmscore = TMscore8_search_standard(r1, r2, xtm, ytm, xt, n_al, t, u, + temp_simplify_step, temp_score_sum_method, &rms, d0_input, + score_d8, d0); + tmscore = tmscore * n_al / (1.0*Lnorm); + + return tmscore; +} + +/* copy the value of t and u into t0,u0 */ +void copy_t_u(double t[3], double u[3][3], double t0[3], double u0[3][3]) +{ + int i,j; + for (i=0;i<3;i++) + { + t0[i]=t[i]; + for (j=0;j<3;j++) u0[i][j]=u[i][j]; + } +} + +/* calculate approximate TM-score given rotation matrix */ +double approx_TM(const int xlen, const int ylen, const int a_opt, + double **xa, double **ya, double t[3], double u[3][3], + const int invmap0[], const int mol_type) +{ + double Lnorm_0=ylen; // normalized by the second protein + if (a_opt==-2 && xlen>ylen) Lnorm_0=xlen; // longer + else if (a_opt==-1 && xlen<ylen) Lnorm_0=xlen; // shorter + else if (a_opt==1) Lnorm_0=(xlen+ylen)/2.; // average + + double D0_MIN; + double Lnorm; + double d0; + double d0_search; + parameter_set4final(Lnorm_0, D0_MIN, Lnorm, d0, d0_search, mol_type); + double TMtmp=0; + double d; + double xtmp[3]={0,0,0}; + + for(int i=0,j=0; j<ylen; j++) + { + i=invmap0[j]; + if(i>=0)//aligned + { + transform(t, u, &xa[i][0], &xtmp[0]); + d=sqrt(dist(&xtmp[0], &ya[j][0])); + TMtmp+=1/(1+(d/d0)*(d/d0)); + //if (d <= score_d8) TMtmp+=1/(1+(d/d0)*(d/d0)); + } + } + TMtmp/=Lnorm_0; + return TMtmp; +} + +void clean_up_after_approx_TM(int *invmap0, int *invmap, + double **score, bool **path, double **val, double **xtm, double **ytm, + double **xt, double **r1, double **r2, const int xlen, const int minlen) +{ + delete [] invmap0; + delete [] invmap; + DeleteArray(&score, xlen+1); + DeleteArray(&path, xlen+1); + DeleteArray(&val, xlen+1); + DeleteArray(&xtm, minlen); + DeleteArray(&ytm, minlen); + DeleteArray(&xt, xlen); + DeleteArray(&r1, minlen); + DeleteArray(&r2, minlen); + return; +} + +/* Entry function for TM-align. Return TM-score calculation status: + * 0 - full TM-score calculation + * 1 - terminated due to exception + * 2-7 - pre-terminated due to low TM-score */ +int TMalign_main(double **xa, double **ya, + const char *seqx, const char *seqy, const int *secx, const int *secy, + double t0[3], double u0[3][3], + double &TM1, double &TM2, double &TM3, double &TM4, double &TM5, + double &d0_0, double &TM_0, + double &d0A, double &d0B, double &d0u, double &d0a, double &d0_out, + string &seqM, string &seqxA, string &seqyA, + double &rmsd0, int &L_ali, double &Liden, + double &TM_ali, double &rmsd_ali, int &n_ali, int &n_ali8, + const int xlen, const int ylen, + const vector<string> sequence, const double Lnorm_ass, + const double d0_scale, + const bool i_opt, const bool I_opt, const int a_opt, + const bool u_opt, const bool d_opt, const bool fast_opt, + const int mol_type, const double TMcut=-1) +{ + double D0_MIN; //for d0 + double Lnorm; //normalization length + double score_d8,d0,d0_search,dcu0;//for TMscore search + double t[3], u[3][3]; //Kabsch translation vector and rotation matrix + double **score; // Input score table for dynamic programming + bool **path; // for dynamic programming + double **val; // for dynamic programming + double **xtm, **ytm; // for TMscore search engine + double **xt; //for saving the superposed version of r_1 or xtm + double **r1, **r2; // for Kabsch rotation + + /***********************/ + /* allocate memory */ + /***********************/ + int minlen = min(xlen, ylen); + NewArray(&score, xlen+1, ylen+1); + NewArray(&path, xlen+1, ylen+1); + NewArray(&val, xlen+1, ylen+1); + NewArray(&xtm, minlen, 3); + NewArray(&ytm, minlen, 3); + NewArray(&xt, xlen, 3); + NewArray(&r1, minlen, 3); + NewArray(&r2, minlen, 3); + + /***********************/ + /* parameter set */ + /***********************/ + parameter_set4search(xlen, ylen, D0_MIN, Lnorm, + score_d8, d0, d0_search, dcu0); + int simplify_step = 40; //for similified search engine + int score_sum_method = 8; //for scoring method, whether only sum over pairs with dis<score_d8 + + int i; + int *invmap0 = new int[ylen+1]; + int *invmap = new int[ylen+1]; + double TM, TMmax=-1; + for(i=0; i<ylen; i++) invmap0[i]=-1; + + double ddcc=0.4; + if (Lnorm <= 40) ddcc=0.1; //Lnorm was setted in parameter_set4search + double local_d0_search = d0_search; + + //************************************************// + // get initial alignment from user's input: // + // Stick to the initial alignment // + //************************************************// + bool bAlignStick = false; + if (I_opt)// if input has set parameter for "-I" + { + // In the original code, this loop starts from 1, which is + // incorrect. Fortran starts from 1 but C++ should starts from 0. + for (int j = 0; j < ylen; j++)// Set aligned position to be "-1" + invmap[j] = -1; + + int i1 = -1;// in C version, index starts from zero, not from one + int i2 = -1; + int L1 = sequence[0].size(); + int L2 = sequence[1].size(); + int L = min(L1, L2);// Get positions for aligned residues + for (int kk1 = 0; kk1 < L; kk1++) + { + if (sequence[0][kk1] != '-') i1++; + if (sequence[1][kk1] != '-') + { + i2++; + if (i2 >= ylen || i1 >= xlen) kk1 = L; + else if (sequence[0][kk1] != '-') invmap[i2] = i1; + } + } + + //--------------- 2. Align proteins from original alignment + double prevD0_MIN = D0_MIN;// stored for later use + int prevLnorm = Lnorm; + double prevd0 = d0; + TM_ali = standard_TMscore(r1, r2, xtm, ytm, xt, xa, ya, xlen, ylen, + invmap, L_ali, rmsd_ali, D0_MIN, Lnorm, d0, d0_search, score_d8, + t, u, mol_type); + D0_MIN = prevD0_MIN; + Lnorm = prevLnorm; + d0 = prevd0; + TM = detailed_search_standard(r1, r2, xtm, ytm, xt, xa, ya, xlen, ylen, + invmap, t, u, 40, 8, local_d0_search, true, Lnorm, score_d8, d0); + if (TM > TMmax) + { + TMmax = TM; + for (i = 0; i<ylen; i++) invmap0[i] = invmap[i]; + } + bAlignStick = true; + } + + /******************************************************/ + /* get initial alignment with gapless threading */ + /******************************************************/ + if (!bAlignStick) + { + get_initial(r1, r2, xtm, ytm, xa, ya, xlen, ylen, invmap0, d0, + d0_search, fast_opt, t, u); + TM = detailed_search(r1, r2, xtm, ytm, xt, xa, ya, xlen, ylen, invmap0, + t, u, simplify_step, score_sum_method, local_d0_search, Lnorm, + score_d8, d0); + if (TM>TMmax) TMmax = TM; + if (TMcut>0) copy_t_u(t, u, t0, u0); + //run dynamic programing iteratively to find the best alignment + TM = DP_iter(r1, r2, xtm, ytm, xt, path, val, xa, ya, xlen, ylen, + t, u, invmap, 0, 2, (fast_opt)?2:30, local_d0_search, + D0_MIN, Lnorm, d0, score_d8); + if (TM>TMmax) + { + TMmax = TM; + for (int i = 0; i<ylen; i++) invmap0[i] = invmap[i]; + if (TMcut>0) copy_t_u(t, u, t0, u0); + } + + if (TMcut>0) // pre-terminate if TM-score is too low + { + double TMtmp=approx_TM(xlen, ylen, a_opt, + xa, ya, t0, u0, invmap0, mol_type); + + if (TMtmp<0.5*TMcut) + { + TM1=TM2=TM3=TM4=TM5=TMtmp; + clean_up_after_approx_TM(invmap0, invmap, score, path, val, + xtm, ytm, xt, r1, r2, xlen, minlen); + return 2; + } + } + + /************************************************************/ + /* get initial alignment based on secondary structure */ + /************************************************************/ + get_initial_ss(path, val, secx, secy, xlen, ylen, invmap); + TM = detailed_search(r1, r2, xtm, ytm, xt, xa, ya, xlen, ylen, invmap, + t, u, simplify_step, score_sum_method, local_d0_search, Lnorm, + score_d8, d0); + if (TM>TMmax) + { + TMmax = TM; + for (int i = 0; i<ylen; i++) invmap0[i] = invmap[i]; + if (TMcut>0) copy_t_u(t, u, t0, u0); + } + if (TM > TMmax*0.2) + { + TM = DP_iter(r1, r2, xtm, ytm, xt, path, val, xa, ya, + xlen, ylen, t, u, invmap, 0, 2, (fast_opt)?2:30, + local_d0_search, D0_MIN, Lnorm, d0, score_d8); + if (TM>TMmax) + { + TMmax = TM; + for (int i = 0; i<ylen; i++) invmap0[i] = invmap[i]; + if (TMcut>0) copy_t_u(t, u, t0, u0); + } + } + + if (TMcut>0) // pre-terminate if TM-score is too low + { + double TMtmp=approx_TM(xlen, ylen, a_opt, + xa, ya, t0, u0, invmap0, mol_type); + + if (TMtmp<0.52*TMcut) + { + TM1=TM2=TM3=TM4=TM5=TMtmp; + clean_up_after_approx_TM(invmap0, invmap, score, path, val, + xtm, ytm, xt, r1, r2, xlen, minlen); + return 3; + } + } + + /************************************************************/ + /* get initial alignment based on local superposition */ + /************************************************************/ + //=initial5 in original TM-align + if (get_initial5( r1, r2, xtm, ytm, path, val, xa, ya, + xlen, ylen, invmap, d0, d0_search, fast_opt, D0_MIN)) + { + TM = detailed_search(r1, r2, xtm, ytm, xt, xa, ya, xlen, ylen, + invmap, t, u, simplify_step, score_sum_method, + local_d0_search, Lnorm, score_d8, d0); + if (TM>TMmax) + { + TMmax = TM; + for (int i = 0; i<ylen; i++) invmap0[i] = invmap[i]; + if (TMcut>0) copy_t_u(t, u, t0, u0); + } + if (TM > TMmax*ddcc) + { + TM = DP_iter(r1, r2, xtm, ytm, xt, path, val, xa, ya, + xlen, ylen, t, u, invmap, 0, 2, 2, local_d0_search, + D0_MIN, Lnorm, d0, score_d8); + if (TM>TMmax) + { + TMmax = TM; + for (int i = 0; i<ylen; i++) invmap0[i] = invmap[i]; + if (TMcut>0) copy_t_u(t, u, t0, u0); + } + } + } + else + cerr << "\n\nWarning: initial alignment from local superposition fail!\n\n" << endl; + + if (TMcut>0) // pre-terminate if TM-score is too low + { + double TMtmp=approx_TM(xlen, ylen, a_opt, + xa, ya, t0, u0, invmap0, mol_type); + + if (TMtmp<0.54*TMcut) + { + TM1=TM2=TM3=TM4=TM5=TMtmp; + clean_up_after_approx_TM(invmap0, invmap, score, path, val, + xtm, ytm, xt, r1, r2, xlen, minlen); + return 4; + } + } + + /********************************************************************/ + /* get initial alignment by local superposition+secondary structure */ + /********************************************************************/ + //=initial3 in original TM-align + get_initial_ssplus(r1, r2, score, path, val, secx, secy, xa, ya, + xlen, ylen, invmap0, invmap, D0_MIN, d0); + TM = detailed_search(r1, r2, xtm, ytm, xt, xa, ya, xlen, ylen, invmap, + t, u, simplify_step, score_sum_method, local_d0_search, Lnorm, + score_d8, d0); + if (TM>TMmax) + { + TMmax = TM; + for (i = 0; i<ylen; i++) invmap0[i] = invmap[i]; + if (TMcut>0) copy_t_u(t, u, t0, u0); + } + if (TM > TMmax*ddcc) + { + TM = DP_iter(r1, r2, xtm, ytm, xt, path, val, xa, ya, + xlen, ylen, t, u, invmap, 0, 2, (fast_opt)?2:30, + local_d0_search, D0_MIN, Lnorm, d0, score_d8); + if (TM>TMmax) + { + TMmax = TM; + for (i = 0; i<ylen; i++) invmap0[i] = invmap[i]; + if (TMcut>0) copy_t_u(t, u, t0, u0); + } + } + + if (TMcut>0) // pre-terminate if TM-score is too low + { + double TMtmp=approx_TM(xlen, ylen, a_opt, + xa, ya, t0, u0, invmap0, mol_type); + + if (TMtmp<0.56*TMcut) + { + TM1=TM2=TM3=TM4=TM5=TMtmp; + clean_up_after_approx_TM(invmap0, invmap, score, path, val, + xtm, ytm, xt, r1, r2, xlen, minlen); + return 5; + } + } + + /*******************************************************************/ + /* get initial alignment based on fragment gapless threading */ + /*******************************************************************/ + //=initial4 in original TM-align + get_initial_fgt(r1, r2, xtm, ytm, xa, ya, xlen, ylen, + invmap, d0, d0_search, dcu0, fast_opt, t, u); + TM = detailed_search(r1, r2, xtm, ytm, xt, xa, ya, xlen, ylen, invmap, + t, u, simplify_step, score_sum_method, local_d0_search, Lnorm, + score_d8, d0); + if (TM>TMmax) + { + TMmax = TM; + for (i = 0; i<ylen; i++) invmap0[i] = invmap[i]; + if (TMcut>0) copy_t_u(t, u, t0, u0); + } + if (TM > TMmax*ddcc) + { + TM = DP_iter(r1, r2, xtm, ytm, xt, path, val, xa, ya, + xlen, ylen, t, u, invmap, 1, 2, 2, local_d0_search, D0_MIN, + Lnorm, d0, score_d8); + if (TM>TMmax) + { + TMmax = TM; + for (i = 0; i<ylen; i++) invmap0[i] = invmap[i]; + if (TMcut>0) copy_t_u(t, u, t0, u0); + } + } + + if (TMcut>0) // pre-terminate if TM-score is too low + { + double TMtmp=approx_TM(xlen, ylen, a_opt, + xa, ya, t0, u0, invmap0, mol_type); + + if (TMtmp<0.58*TMcut) + { + TM1=TM2=TM3=TM4=TM5=TMtmp; + clean_up_after_approx_TM(invmap0, invmap, score, path, val, + xtm, ytm, xt, r1, r2, xlen, minlen); + return 6; + } + } + + //************************************************// + // get initial alignment from user's input: // + //************************************************// + if (i_opt)// if input has set parameter for "-i" + { + for (int j = 0; j < ylen; j++)// Set aligned position to be "-1" + invmap[j] = -1; + + int i1 = -1;// in C version, index starts from zero, not from one + int i2 = -1; + int L1 = sequence[0].size(); + int L2 = sequence[1].size(); + int L = min(L1, L2);// Get positions for aligned residues + for (int kk1 = 0; kk1 < L; kk1++) + { + if (sequence[0][kk1] != '-') + i1++; + if (sequence[1][kk1] != '-') + { + i2++; + if (i2 >= ylen || i1 >= xlen) kk1 = L; + else if (sequence[0][kk1] != '-') invmap[i2] = i1; + } + } + + //--------------- 2. Align proteins from original alignment + double prevD0_MIN = D0_MIN;// stored for later use + int prevLnorm = Lnorm; + double prevd0 = d0; + TM_ali = standard_TMscore(r1, r2, xtm, ytm, xt, xa, ya, + xlen, ylen, invmap, L_ali, rmsd_ali, D0_MIN, Lnorm, d0, + d0_search, score_d8, t, u, mol_type); + D0_MIN = prevD0_MIN; + Lnorm = prevLnorm; + d0 = prevd0; + + TM = detailed_search_standard(r1, r2, xtm, ytm, xt, xa, ya, + xlen, ylen, invmap, t, u, 40, 8, local_d0_search, true, Lnorm, + score_d8, d0); + if (TM > TMmax) + { + TMmax = TM; + for (i = 0; i<ylen; i++) invmap0[i] = invmap[i]; + } + // Different from get_initial, get_initial_ss and get_initial_ssplus + TM = DP_iter(r1, r2, xtm, ytm, xt, path, val, xa, ya, + xlen, ylen, t, u, invmap, 0, 2, (fast_opt)?2:30, + local_d0_search, D0_MIN, Lnorm, d0, score_d8); + if (TM>TMmax) + { + TMmax = TM; + for (i = 0; i<ylen; i++) invmap0[i] = invmap[i]; + } + } + } + + + + //*******************************************************************// + // The alignment will not be changed any more in the following // + //*******************************************************************// + //check if the initial alignment is generated approriately + bool flag=false; + for(i=0; i<ylen; i++) + { + if(invmap0[i]>=0) + { + flag=true; + break; + } + } + if(!flag) + { + cout << "There is no alignment between the two proteins!" << endl; + cout << "Program stop with no result!" << endl; + return 1; + } + + /* last TM-score pre-termination */ + if (TMcut>0) + { + double TMtmp=approx_TM(xlen, ylen, a_opt, + xa, ya, t0, u0, invmap0, mol_type); + + if (TMtmp<0.6*TMcut) + { + TM1=TM2=TM3=TM4=TM5=TMtmp; + clean_up_after_approx_TM(invmap0, invmap, score, path, val, + xtm, ytm, xt, r1, r2, xlen, minlen); + return 7; + } + } + + //********************************************************************// + // Detailed TMscore search engine --> prepare for final TMscore // + //********************************************************************// + //run detailed TMscore search engine for the best alignment, and + //extract the best rotation matrix (t, u) for the best alginment + simplify_step=1; + if (fast_opt) simplify_step=40; + score_sum_method=8; + TM = detailed_search_standard(r1, r2, xtm, ytm, xt, xa, ya, xlen, ylen, + invmap0, t, u, simplify_step, score_sum_method, local_d0_search, + false, Lnorm, score_d8, d0); + + //select pairs with dis<d8 for final TMscore computation and output alignment + int k=0; + int *m1, *m2; + double d; + m1=new int[xlen]; //alignd index in x + m2=new int[ylen]; //alignd index in y + do_rotation(xa, xt, xlen, t, u); + k=0; + for(int j=0; j<ylen; j++) + { + i=invmap0[j]; + if(i>=0)//aligned + { + n_ali++; + d=sqrt(dist(&xt[i][0], &ya[j][0])); + if (d <= score_d8 || (I_opt == true)) + { + m1[k]=i; + m2[k]=j; + + xtm[k][0]=xa[i][0]; + xtm[k][1]=xa[i][1]; + xtm[k][2]=xa[i][2]; + + ytm[k][0]=ya[j][0]; + ytm[k][1]=ya[j][1]; + ytm[k][2]=ya[j][2]; + + r1[k][0] = xt[i][0]; + r1[k][1] = xt[i][1]; + r1[k][2] = xt[i][2]; + r2[k][0] = ya[j][0]; + r2[k][1] = ya[j][1]; + r2[k][2] = ya[j][2]; + + k++; + } + } + } + n_ali8=k; + + Kabsch(r1, r2, n_ali8, 0, &rmsd0, t, u);// rmsd0 is used for final output, only recalculate rmsd0, not t & u + rmsd0 = sqrt(rmsd0 / n_ali8); + + + //****************************************// + // Final TMscore // + // Please set parameters for output // + //****************************************// + double rmsd; + simplify_step=1; + score_sum_method=0; + double Lnorm_0=ylen; + + + //normalized by length of structure A + parameter_set4final(Lnorm_0, D0_MIN, Lnorm, d0, d0_search, mol_type); + d0A=d0; + d0_0=d0A; + local_d0_search = d0_search; + TM1 = TMscore8_search(r1, r2, xtm, ytm, xt, n_ali8, t0, u0, simplify_step, + score_sum_method, &rmsd, local_d0_search, Lnorm, score_d8, d0); + TM_0 = TM1; + + //normalized by length of structure B + parameter_set4final(xlen+0.0, D0_MIN, Lnorm, d0, d0_search, mol_type); + d0B=d0; + local_d0_search = d0_search; + TM2 = TMscore8_search(r1, r2, xtm, ytm, xt, n_ali8, t, u, simplify_step, + score_sum_method, &rmsd, local_d0_search, Lnorm, score_d8, d0); + + double Lnorm_d0; + if (a_opt>0) + { + //normalized by average length of structures A, B + Lnorm_0=(xlen+ylen)*0.5; + parameter_set4final(Lnorm_0, D0_MIN, Lnorm, d0, d0_search, mol_type); + d0a=d0; + d0_0=d0a; + local_d0_search = d0_search; + + TM3 = TMscore8_search(r1, r2, xtm, ytm, xt, n_ali8, t0, u0, + simplify_step, score_sum_method, &rmsd, local_d0_search, Lnorm, + score_d8, d0); + TM_0=TM3; + } + if (u_opt) + { + //normalized by user assigned length + parameter_set4final(Lnorm_ass, D0_MIN, Lnorm, + d0, d0_search, mol_type); + d0u=d0; + d0_0=d0u; + Lnorm_0=Lnorm_ass; + local_d0_search = d0_search; + TM4 = TMscore8_search(r1, r2, xtm, ytm, xt, n_ali8, t0, u0, + simplify_step, score_sum_method, &rmsd, local_d0_search, Lnorm, + score_d8, d0); + TM_0=TM4; + } + if (d_opt) + { + //scaled by user assigned d0 + parameter_set4scale(ylen, d0_scale, Lnorm, d0, d0_search); + d0_out=d0_scale; + d0_0=d0_scale; + //Lnorm_0=ylen; + Lnorm_d0=Lnorm_0; + local_d0_search = d0_search; + TM5 = TMscore8_search(r1, r2, xtm, ytm, xt, n_ali8, t0, u0, + simplify_step, score_sum_method, &rmsd, local_d0_search, Lnorm, + score_d8, d0); + TM_0=TM5; + } + + /* derive alignment from superposition */ + int ali_len=xlen+ylen; //maximum length of alignment + seqxA.assign(ali_len,'-'); + seqM.assign( ali_len,' '); + seqyA.assign(ali_len,'-'); + + do_rotation(xa, xt, xlen, t, u); + + int kk=0, i_old=0, j_old=0; + d=0; + for(int k=0; k<n_ali8; k++) + { + for(int i=i_old; i<m1[k]; i++) + { + //align x to gap + seqxA[kk]=seqx[i]; + seqyA[kk]='-'; + seqM[kk]=' '; + kk++; + } + + for(int j=j_old; j<m2[k]; j++) + { + //align y to gap + seqxA[kk]='-'; + seqyA[kk]=seqy[j]; + seqM[kk]=' '; + kk++; + } + + seqxA[kk]=seqx[m1[k]]; + seqyA[kk]=seqy[m2[k]]; + Liden+=(seqxA[kk]==seqyA[kk]); + d=sqrt(dist(&xt[m1[k]][0], &ya[m2[k]][0])); + if(d<d0_out) seqM[kk]=':'; + else seqM[kk]='.'; + kk++; + i_old=m1[k]+1; + j_old=m2[k]+1; + } + + //tail + for(int i=i_old; i<xlen; i++) + { + //align x to gap + seqxA[kk]=seqx[i]; + seqyA[kk]='-'; + seqM[kk]=' '; + kk++; + } + for(int j=j_old; j<ylen; j++) + { + //align y to gap + seqxA[kk]='-'; + seqyA[kk]=seqy[j]; + seqM[kk]=' '; + kk++; + } + seqxA=seqxA.substr(0,kk); + seqyA=seqyA.substr(0,kk); + seqM =seqM.substr(0,kk); + + /* free memory */ + clean_up_after_approx_TM(invmap0, invmap, score, path, val, + xtm, ytm, xt, r1, r2, xlen, minlen); + delete [] m1; + delete [] m2; + return 0; // zero for no exception +} diff --git a/modules/bindings/src/tmalign/align.txt b/modules/bindings/src/tmalign/align.txt new file mode 100644 index 000000000..0c9e2fdbd --- /dev/null +++ b/modules/bindings/src/tmalign/align.txt @@ -0,0 +1,23 @@ +> model1 (this line should start with '>') +TNQKTKELSNLIETFAEQSRVLEKECT-KIGSKRDSKELRYKIETELIPNCTSVRDKIESN-I-L +IH-----QNGKLSADFKNLKTKYQSLQQSYNQRKSLFPLK + +> model2 (this line should start with '>') +--E--DPFQQVVKDTKEQLNRINNYITRHNT---AD-DQEEEIQD-ILKDVEETIVDLDRSIIVM +K-RDENEDVSGREAQVKNIKQQLDALKLRFDRR--I---- + +>>>> the following lines (starting from third '>') will be ignored by TM-align: <<<<< + +1, this is an example of fasta-format file to specify seed alignment used + by TM-align structure alignment program. + +2, This file should include alignments for two protein sequences. The + alignment entry can have any width (but should be <5,000). + +3, Each alignment should start from the first amino acid of the target + sequences. The ending unaligned residure can be ignored. + +4, There should be at least three pairs of aligned residues, because + superposition for <3 pairs of atoms is not mathematically defined. + +5, More explanation on FASTA format can be seen at http://zhanglab.ccmb.med.umich.edu/FASTA diff --git a/modules/bindings/src/tmalign/basic_fun.h b/modules/bindings/src/tmalign/basic_fun.h new file mode 100644 index 000000000..57f000d08 --- /dev/null +++ b/modules/bindings/src/tmalign/basic_fun.h @@ -0,0 +1,763 @@ +/* File parsing and basic geometry operations */ +#ifndef TMalign_basic_fun_h +#define TMalign_basic_fun_h 1 + +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <time.h> +#include <string.h> +#include <malloc.h> + +#include <sstream> +#include <iostream> +#include <iomanip> +#include <fstream> +#include <vector> +#include <iterator> +#include <algorithm> +#include <string> +#include <iomanip> +#include <map> + +#include "pstream.h" // For reading gzip and bz2 compressed files + +using namespace std; + + +void PrintErrorAndQuit(const string sErrorString) +{ + cout << sErrorString << endl; + exit(1); +} + +template <typename T> inline T getmin(const T &a, const T &b) +{ + return b<a?b:a; +} + +template <class A> void NewArray(A *** array, int Narray1, int Narray2) +{ + *array=new A* [Narray1]; + for(int i=0; i<Narray1; i++) *(*array+i)=new A [Narray2]; +} + +template <class A> void DeleteArray(A *** array, int Narray) +{ + for(int i=0; i<Narray; i++) + if(*(*array+i)) delete [] *(*array+i); + if(Narray) delete [] (*array); + (*array)=NULL; +} + +string AAmap(char A) +{ + if (A=='A') return "ALA"; + if (A=='B') return "ASX"; + if (A=='C') return "CYS"; + if (A=='D') return "ASP"; + if (A=='E') return "GLU"; + if (A=='F') return "PHE"; + if (A=='G') return "GLY"; + if (A=='H') return "HIS"; + if (A=='I') return "ILE"; + if (A=='K') return "LYS"; + if (A=='L') return "LEU"; + if (A=='M') return "MET"; + if (A=='N') return "ASN"; + if (A=='O') return "PYL"; + if (A=='P') return "PRO"; + if (A=='Q') return "GLN"; + if (A=='R') return "ARG"; + if (A=='S') return "SER"; + if (A=='T') return "THR"; + if (A=='U') return "SEC"; + if (A=='V') return "VAL"; + if (A=='W') return "TRP"; + if (A=='Y') return "TYR"; + if (A=='Z') return "GLX"; + if ('a'<=A && A<='z') return " "+toupper(A); + return "UNK"; +} + +char AAmap(const string &AA) +{ + if (AA.compare("ALA")==0) return 'A'; + if (AA.compare("ASX")==0) return 'B'; + if (AA.compare("CYS")==0) return 'C'; + if (AA.compare("ASP")==0) return 'D'; + if (AA.compare("GLU")==0) return 'E'; + if (AA.compare("PHE")==0) return 'F'; + if (AA.compare("GLY")==0) return 'G'; + if (AA.compare("HIS")==0) return 'H'; + if (AA.compare("ILE")==0) return 'I'; + if (AA.compare("LYS")==0) return 'K'; + if (AA.compare("LEU")==0) return 'L'; + if (AA.compare("MET")==0 || AA.compare("MSE")==0) return 'M'; + if (AA.compare("ASN")==0) return 'N'; + if (AA.compare("PYL")==0) return 'O'; + if (AA.compare("PRO")==0) return 'P'; + if (AA.compare("GLN")==0) return 'Q'; + if (AA.compare("ARG")==0) return 'R'; + if (AA.compare("SER")==0) return 'S'; + if (AA.compare("THR")==0) return 'T'; + if (AA.compare("SEC")==0) return 'U'; + if (AA.compare("VAL")==0) return 'V'; + if (AA.compare("TRP")==0) return 'W'; + if (AA.compare("TYR")==0) return 'Y'; + if (AA.compare("GLX")==0) return 'Z'; + + if (AA.compare(0,2," D")==0) return tolower(AA[2]); + if (AA.compare(0,2," ")==0) return tolower(AA[2]); + return 'X'; +} + +/* split a long string into vectors by whitespace + * line - input string + * line_vec - output vector + * delimiter - delimiter */ +void split(const string &line, vector<string> &line_vec, + const char delimiter=' ') +{ + bool within_word = false; + for (int pos=0;pos<line.size();pos++) + { + if (line[pos]==delimiter) + { + within_word = false; + continue; + } + if (!within_word) + { + within_word = true; + line_vec.push_back(""); + } + line_vec.back()+=line[pos]; + } +} + +size_t get_PDB_lines(const string filename, + vector<vector<string> >&PDB_lines, vector<string> &chainID_list, + vector<int> &mol_vec, const int ter_opt=3, const int infmt_opt=-1, + const string atom_opt="auto", const int split_opt=0) +{ + size_t i=0; // resi i.e. atom index + string line; + char chainID=0; + string resi=""; + bool select_atom=false; + size_t model_idx=0; + vector<string> tmp_str_vec; + + int compress_type=0; // uncompressed file + ifstream fin; + redi::ipstream fin_gz; // if file is compressed + if (filename.size()>=3 && + filename.substr(filename.size()-3,3)==".gz") + { + fin_gz.open("zcat "+filename); + compress_type=1; + } + else if (filename.size()>=4 && + filename.substr(filename.size()-4,4)==".bz2") + { + fin_gz.open("bzcat "+filename); + compress_type=2; + } + else fin.open(filename.c_str()); + + if (infmt_opt==0||infmt_opt==-1) // PDB format + { + while (compress_type?fin_gz.good():fin.good()) + { + if (compress_type) getline(fin_gz, line); + else getline(fin, line); + if (infmt_opt==-1 && line.compare(0,5,"loop_")==0) // PDBx/mmCIF + return get_PDB_lines(filename,PDB_lines,chainID_list, + mol_vec, ter_opt, 3, atom_opt, split_opt); + if (i > 0) + { + if (ter_opt>=1 && line.compare(0,3,"END")==0) break; + else if (ter_opt>=3 && line.compare(0,3,"TER")==0) break; + } + if (split_opt && line.compare(0,3,"END")==0) chainID=0; + if (line.compare(0, 6, "ATOM ")==0 && line.size()>=54 && + (line[16]==' ' || line[16]=='A')) + { + if (atom_opt=="auto") + { + if (line[17]==' ' && (line[18]=='D'||line[18]==' ')) + select_atom=(line.compare(12,4," C3'")==0); + else select_atom=(line.compare(12,4," CA ")==0); + } + else select_atom=(line.compare(12,4,atom_opt)==0); + if (select_atom) + { + if (!chainID) + { + chainID=line[21]; + model_idx++; + stringstream i8_stream; + i=0; + if (split_opt==2) // split by chain + { + if (chainID==' ') + { + if (ter_opt>=1) i8_stream << ":_"; + else i8_stream<<':'<<model_idx<<":_"; + } + else + { + if (ter_opt>=1) i8_stream << ':' << chainID; + else i8_stream<<':'<<model_idx<<':'<<chainID; + } + chainID_list.push_back(i8_stream.str()); + } + else if (split_opt==1) // split by model + { + i8_stream << ':' << model_idx; + chainID_list.push_back(i8_stream.str()); + } + PDB_lines.push_back(tmp_str_vec); + mol_vec.push_back(0); + } + else if (ter_opt>=2 && chainID!=line[21]) break; + if (split_opt==2 && chainID!=line[21]) + { + chainID=line[21]; + i=0; + stringstream i8_stream; + if (chainID==' ') + { + if (ter_opt>=1) i8_stream << ":_"; + else i8_stream<<':'<<model_idx<<":_"; + } + else + { + if (ter_opt>=1) i8_stream << ':' << chainID; + else i8_stream<<':'<<model_idx<<':'<<chainID; + } + chainID_list.push_back(i8_stream.str()); + PDB_lines.push_back(tmp_str_vec); + mol_vec.push_back(0); + } + + if (resi==line.substr(22,5)) + cerr<<"Warning! Duplicated residue "<<resi<<endl; + resi=line.substr(22,5); // including insertion code + + PDB_lines.back().push_back(line); + if (line[17]==' ' && (line[18]=='D'||line[18]==' ')) mol_vec.back()++; + else mol_vec.back()--; + i++; + } + } + } + } + else if (infmt_opt==1) // SPICKER format + { + int L=0; + float x,y,z; + stringstream i8_stream; + while (compress_type?fin_gz.good():fin.good()) + { + if (compress_type) fin_gz>>L>>x>>y>>z; + else fin >>L>>x>>y>>z; + if (compress_type) getline(fin_gz, line); + else getline(fin, line); + if (!(compress_type?fin_gz.good():fin.good())) break; + model_idx++; + stringstream i8_stream; + i8_stream << ':' << model_idx; + chainID_list.push_back(i8_stream.str()); + PDB_lines.push_back(tmp_str_vec); + mol_vec.push_back(0); + for (i=0;i<L;i++) + { + if (compress_type) fin_gz>>x>>y>>z; + else fin >>x>>y>>z; + i8_stream<<"ATOM "<<setw(4)<<i+1<<" CA UNK "<<setw(4) + <<i+1<<" "<<setiosflags(ios::fixed)<<setprecision(3) + <<setw(8)<<x<<setw(8)<<y<<setw(8)<<z; + line=i8_stream.str(); + i8_stream.str(string()); + PDB_lines.back().push_back(line); + } + if (compress_type) getline(fin_gz, line); + else getline(fin, line); + } + } + else if (infmt_opt==2) // xyz format + { + int L=0; + char A; + stringstream i8_stream; + while (compress_type?fin_gz.good():fin.good()) + { + if (compress_type) getline(fin_gz, line); + else getline(fin, line); + L=atoi(line.c_str()); + if (compress_type) getline(fin_gz, line); + else getline(fin, line); + for (i=0;i<line.size();i++) + if (line[i]==' '||line[i]=='\t') break; + if (!(compress_type?fin_gz.good():fin.good())) break; + chainID_list.push_back(':'+line.substr(0,i)); + PDB_lines.push_back(tmp_str_vec); + mol_vec.push_back(0); + for (i=0;i<L;i++) + { + if (compress_type) getline(fin_gz, line); + else getline(fin, line); + i8_stream<<"ATOM "<<setw(4)<<i+1<<" CA " + <<AAmap(line[0])<<" "<<setw(4)<<i+1<<" " + <<line.substr(2,8)<<line.substr(11,8)<<line.substr(20,8); + line=i8_stream.str(); + i8_stream.str(string()); + PDB_lines.back().push_back(line); + if (line[0]>='a' && line[0]<='z') mol_vec.back()++; // RNA + else mol_vec.back()--; + } + } + } + else if (infmt_opt==3) // PDBx/mmCIF format + { + bool loop_ = false; // not reading following content + map<string,int> _atom_site; + int atom_site_pos; + vector<string> line_vec; + string alt_id="."; // alternative location indicator + string asym_id="."; // this is similar to chainID, except that + // chainID is char while asym_id is a string + // with possibly multiple char + string prev_asym_id=""; + string AA=""; // residue name + string atom=""; + string prev_resi=""; + string model_index=""; // the same as model_idx but type is string + stringstream i8_stream; + while (compress_type?fin_gz.good():fin.good()) + { + if (compress_type) getline(fin_gz, line); + else getline(fin, line); + if (loop_) loop_ = line.compare(0,2,"# "); + if (!loop_) + { + if (line.compare(0,5,"loop_")) continue; + if (compress_type) getline(fin_gz, line); + else getline(fin, line); + if (line.compare(0,11,"_atom_site.")) continue; + + loop_=true; + _atom_site.clear(); + atom_site_pos=0; + _atom_site[line.substr(11,line.size()-12)]=atom_site_pos; + + while(1) + { + if (compress_type) getline(fin_gz, line); + else getline(fin, line); + if (line.compare(0,11,"_atom_site.")) break; + _atom_site[line.substr(11,line.size()-12)]=++atom_site_pos; + } + + + if (_atom_site.count("group_PDB")* + _atom_site.count("label_atom_id")* + _atom_site.count("label_comp_id")* + (_atom_site.count("auth_asym_id")+ + _atom_site.count("label_asym_id"))* + (_atom_site.count("auth_seq_id")+ + _atom_site.count("label_seq_id"))* + _atom_site.count("Cartn_x")* + _atom_site.count("Cartn_y")* + _atom_site.count("Cartn_z")==0) + { + loop_ = false; + cerr<<"Warning! Missing one of the following _atom_site data items: group_PDB, label_atom_id, label_atom_id, auth_asym_id/label_asym_id, auth_seq_id/label_seq_id, Cartn_x, Cartn_y, Cartn_z"<<endl; + continue; + } + } + + line_vec.clear(); + split(line,line_vec); + if (line_vec[_atom_site["group_PDB"]]!="ATOM") continue; + + alt_id="."; + if (_atom_site.count("label_alt_id")) // in 39.4 % of entries + alt_id=line_vec[_atom_site["label_alt_id"]]; + if (alt_id!="." && alt_id!="A") continue; + + atom=line_vec[_atom_site["label_atom_id"]]; + if (atom[0]=='"') atom=atom.substr(1); + if (atom.size() && atom[atom.size()-1]=='"') + atom=atom.substr(0,atom.size()-1); + if (atom.size()==0) continue; + if (atom.size()==1) atom=" "+atom+" "; + else if (atom.size()==2) atom=" "+atom+" "; // wrong for sidechain H + else if (atom.size()==3) atom=" "+atom; + else if (atom.size()>=5) continue; + + AA=line_vec[_atom_site["label_comp_id"]]; // residue name + if (AA.size()==1) AA=" "+AA; + else if (AA.size()==2) AA=" " +AA; + else if (AA.size()>=4) continue; + + if (atom_opt=="auto") + { + if (AA[0]==' ' && (AA[1]=='D'||AA[1]==' ')) // DNA || RNA + select_atom=(atom==" C3'"); + else select_atom=(atom==" CA "); + } + else select_atom=(atom==atom_opt); + + if (!select_atom) continue; + + if (_atom_site.count("auth_asym_id")) + asym_id=line_vec[_atom_site["auth_asym_id"]]; + else asym_id=line_vec[_atom_site["label_asym_id"]]; + if (asym_id==".") asym_id=" "; + + if (_atom_site.count("pdbx_PDB_model_num") && + model_index!=line_vec[_atom_site["pdbx_PDB_model_num"]]) + { + model_index=line_vec[_atom_site["pdbx_PDB_model_num"]]; + if (PDB_lines.size() && ter_opt>=1) break; + if (PDB_lines.size()==0 || split_opt>=1) + { + PDB_lines.push_back(tmp_str_vec); + mol_vec.push_back(0); + prev_asym_id=asym_id; + + if (split_opt==1 && ter_opt==0) chainID_list.push_back( + ':'+model_index); + else if (split_opt==2 && ter_opt==0) + chainID_list.push_back(':'+model_index+':'+asym_id); + else if (split_opt==2 && ter_opt==1) + chainID_list.push_back(':'+asym_id); + } + } + + if (prev_asym_id!=asym_id) + { + if (prev_asym_id!="" && ter_opt>=2) break; + if (split_opt>=2) + { + PDB_lines.push_back(tmp_str_vec); + mol_vec.push_back(0); + + if (split_opt==1 && ter_opt==0) chainID_list.push_back( + ':'+model_index); + else if (split_opt==2 && ter_opt==0) + chainID_list.push_back(':'+model_index+':'+asym_id); + else if (split_opt==2 && ter_opt==1) + chainID_list.push_back(':'+asym_id); + } + } + if (prev_asym_id!=asym_id) prev_asym_id=asym_id; + + if (AA[0]==' ' && (AA[1]=='D'||AA[1]==' ')) mol_vec.back()++; + else mol_vec.back()--; + + if (_atom_site.count("auth_seq_id")) + resi=line_vec[_atom_site["auth_seq_id"]]; + else resi=line_vec[_atom_site["label_seq_id"]]; + if (_atom_site.count("pdbx_PDB_ins_code") && + line_vec[_atom_site["pdbx_PDB_ins_code"]]!="?") + resi+=line_vec[_atom_site["pdbx_PDB_ins_code"]][0]; + else resi+=" "; + + if (prev_resi==resi) + cerr<<"Warning! Duplicated residue "<<resi<<endl; + prev_resi=resi; + + i++; + i8_stream<<"ATOM " + <<setw(5)<<i<<" "<<atom<<" "<<AA<<" "<<asym_id[0] + <<setw(5)<<resi.substr(0,5)<<" " + <<setw(8)<<line_vec[_atom_site["Cartn_x"]] + <<setw(8)<<line_vec[_atom_site["Cartn_y"]] + <<setw(8)<<line_vec[_atom_site["Cartn_z"]]; + PDB_lines.back().push_back(i8_stream.str()); + i8_stream.str(string()); + } + _atom_site.clear(); + line_vec.clear(); + alt_id.clear(); + asym_id.clear(); + AA.clear(); + } + + if (compress_type) fin_gz.close(); + else fin.close(); + line.clear(); + if (!split_opt) chainID_list.push_back(""); + return PDB_lines.size(); +} + +/* read fasta file from filename. sequence is stored into FASTA_lines + * while sequence name is stored into chainID_list. + * if ter_opt >=1, only read the first sequence. + * if ter_opt ==0, read all sequences. + * if split_opt >=1 and ter_opt ==0, each sequence is a separate entry. + * if split_opt ==0 and ter_opt ==0, all sequences are combined into one */ +size_t get_FASTA_lines(const string filename, + vector<vector<string> >&FASTA_lines, vector<string> &chainID_list, + vector<int> &mol_vec, const int ter_opt=3, const int split_opt=0) +{ + string line; + vector<string> tmp_str_vec; + int l; + + int compress_type=0; // uncompressed file + ifstream fin; + redi::ipstream fin_gz; // if file is compressed + if (filename.size()>=3 && + filename.substr(filename.size()-3,3)==".gz") + { + fin_gz.open("zcat "+filename); + compress_type=1; + } + else if (filename.size()>=4 && + filename.substr(filename.size()-4,4)==".bz2") + { + fin_gz.open("bzcat "+filename); + compress_type=2; + } + else fin.open(filename.c_str()); + + while (compress_type?fin_gz.good():fin.good()) + { + if (compress_type) getline(fin_gz, line); + else getline(fin, line); + if (line.size()==0 || line[0]=='#') continue; + + if (line[0]=='>') + { + if (FASTA_lines.size()) + { + if (ter_opt) break; + if (split_opt==0) continue; + } + FASTA_lines.push_back(tmp_str_vec); + FASTA_lines.back().push_back(""); + mol_vec.push_back(0); + if (ter_opt==0 && split_opt) + { + line[0]=':'; + chainID_list.push_back(line); + } + else chainID_list.push_back(""); + } + else + { + FASTA_lines.back()[0]+=line; + for (l=0;l<line.size();l++) mol_vec.back()+= + ('a'<=line[l] && line[l]<='z')-('A'<=line[l] && line[l]<='Z'); + } + } + + line.clear(); + if (compress_type) fin_gz.close(); + else fin.close(); + return FASTA_lines.size(); +} + + +/* extract pairwise sequence alignment from residue index vectors, + * assuming that "sequence" contains two empty strings. + * return length of alignment, including gap. */ +int extract_aln_from_resi(vector<string> &sequence, char *seqx, char *seqy, + const vector<string> resi_vec1, const vector<string> resi_vec2, + const int byresi_opt) +{ + sequence.clear(); + sequence.push_back(""); + sequence.push_back(""); + + int i1=0; // positions in resi_vec1 + int i2=0; // positions in resi_vec2 + int xlen=resi_vec1.size(); + int ylen=resi_vec2.size(); + map<char,int> chainID_map1; + map<char,int> chainID_map2; + if (byresi_opt==3) + { + vector<char> chainID_vec; + char chainID; + int i; + for (i=0;i<xlen;i++) + { + chainID=resi_vec1[i][5]; + if (!chainID_vec.size()|| chainID_vec.back()!=chainID) + { + chainID_vec.push_back(chainID); + chainID_map1[chainID]=chainID_vec.size(); + } + } + chainID_vec.clear(); + for (i=0;i<ylen;i++) + { + chainID=resi_vec2[i][5]; + if (!chainID_vec.size()|| chainID_vec.back()!=chainID) + { + chainID_vec.push_back(chainID); + chainID_map2[chainID]=chainID_vec.size(); + } + } + chainID_vec.clear(); + } + while(i1<xlen && i2<ylen) + { + if ((byresi_opt<=2 && resi_vec1[i1]==resi_vec2[i2]) || (byresi_opt==3 + && resi_vec1[i1].substr(0,5)==resi_vec2[i2].substr(0,5) + && chainID_map1[resi_vec1[i1][5]]==chainID_map2[resi_vec2[i2][5]])) + { + sequence[0]+=seqx[i1++]; + sequence[1]+=seqy[i2++]; + } + else if (atoi(resi_vec1[i1].substr(0,4).c_str())<= + atoi(resi_vec2[i2].substr(0,4).c_str())) + { + sequence[0]+=seqx[i1++]; + sequence[1]+='-'; + } + else + { + sequence[0]+='-'; + sequence[1]+=seqy[i2++]; + } + } + chainID_map1.clear(); + chainID_map2.clear(); + return sequence[0].size(); +} + +int read_PDB(const vector<string> &PDB_lines, double **a, char *seq, + vector<string> &resi_vec, const int byresi_opt) +{ + int i; + for (i=0;i<PDB_lines.size();i++) + { + a[i][0] = atof(PDB_lines[i].substr(30, 8).c_str()); + a[i][1] = atof(PDB_lines[i].substr(38, 8).c_str()); + a[i][2] = atof(PDB_lines[i].substr(46, 8).c_str()); + seq[i] = AAmap(PDB_lines[i].substr(17, 3)); + + if (byresi_opt>=2) resi_vec.push_back(PDB_lines[i].substr(22,5)+ + PDB_lines[i][21]); + if (byresi_opt==1) resi_vec.push_back(PDB_lines[i].substr(22,5)); + } + seq[i]='\0'; + return i; +} + +double dist(double x[3], double y[3]) +{ + double d1=x[0]-y[0]; + double d2=x[1]-y[1]; + double d3=x[2]-y[2]; + + return (d1*d1 + d2*d2 + d3*d3); +} + +double dot(double *a, double *b) +{ + return (a[0] * b[0] + a[1] * b[1] + a[2] * b[2]); +} + +void transform(double t[3], double u[3][3], double *x, double *x1) +{ + x1[0]=t[0]+dot(&u[0][0], x); + x1[1]=t[1]+dot(&u[1][0], x); + x1[2]=t[2]+dot(&u[2][0], x); +} + +void do_rotation(double **x, double **x1, int len, double t[3], double u[3][3]) +{ + for(int i=0; i<len; i++) + { + transform(t, u, &x[i][0], &x1[i][0]); + } +} + +/* strip white space at the begining or end of string */ +string Trim(const string &inputString) +{ + string result = inputString; + int idxBegin = inputString.find_first_not_of(" \n\r\t"); + int idxEnd = inputString.find_last_not_of(" \n\r\t"); + if (idxBegin >= 0 && idxEnd >= 0) + result = inputString.substr(idxBegin, idxEnd + 1 - idxBegin); + return result; +} + +/* read user specified pairwise alignment from 'fname_lign' to 'sequence'. + * This function should only be called by main function, as it will + * terminate a program if wrong alignment is given */ +void read_user_alignment(vector<string>&sequence, const string &fname_lign, + const bool I_opt) +{ + if (fname_lign == "") + PrintErrorAndQuit("Please provide a file name for option -i!"); + // open alignment file + int n_p = 0;// number of structures in alignment file + string line; + + ifstream fileIn(fname_lign.c_str()); + if (fileIn.is_open()) + { + while (fileIn.good()) + { + getline(fileIn, line); + if (line.compare(0, 1, ">") == 0)// Flag for a new structure + { + if (n_p >= 2) break; + sequence.push_back(""); + n_p++; + } + else if (n_p > 0 && line!="") sequence.back()+=line; + } + fileIn.close(); + } + else PrintErrorAndQuit("ERROR! Alignment file does not exist."); + + if (n_p < 2) + PrintErrorAndQuit("ERROR: Fasta format is wrong, two proteins should be included."); + if (sequence[0].size() != sequence[1].size()) + PrintErrorAndQuit("ERROR! FASTA file is wrong. The length in alignment should be equal for the two aligned proteins."); + if (I_opt) + { + int aligned_resNum=0; + for (int i=0;i<sequence[0].size();i++) + aligned_resNum+=(sequence[0][i]!='-' && sequence[1][i]!='-'); + if (aligned_resNum<3) + PrintErrorAndQuit("ERROR! Superposition is undefined for <3 aligned residues."); + } + line.clear(); + return; +} + +/* read list of entries from 'name' to 'chain_list'. + * dir_opt is the folder name (prefix). + * suffix_opt is the file name extension (suffix_opt). + * This function should only be called by main function, as it will + * terminate a program if wrong alignment is given */ +void file2chainlist(vector<string>&chain_list, const string &name, + const string &dir_opt, const string &suffix_opt) +{ + ifstream fp(name.c_str()); + if (! fp.is_open()) + PrintErrorAndQuit(("Can not open file: "+name+'\n').c_str()); + string line; + while (fp.good()) + { + getline(fp, line); + if (! line.size()) continue; + chain_list.push_back(dir_opt+Trim(line)+suffix_opt); + } + fp.close(); + line.clear(); +} + +#endif diff --git a/modules/bindings/src/tmalign/param_set.h b/modules/bindings/src/tmalign/param_set.h new file mode 100644 index 000000000..31ac26866 --- /dev/null +++ b/modules/bindings/src/tmalign/param_set.h @@ -0,0 +1,77 @@ +/* These functions implement d0 normalization. The d0 for final TM-score + * output is implemented by parameter_set4final. For both RNA alignment + * and protein alignment, using d0 set by parameter_set4search yields + * slightly better results during initial alignment-superposition iteration. + */ +#include <math.h> +#include "basic_fun.h" + +void parameter_set4search(const int xlen, const int ylen, + double &D0_MIN, double &Lnorm, + double &score_d8, double &d0, double &d0_search, double &dcu0) +{ + //parameter initilization for searching: D0_MIN, Lnorm, d0, d0_search, score_d8 + D0_MIN=0.5; + dcu0=4.25; //update 3.85-->4.25 + + Lnorm=getmin(xlen, ylen); //normaliz TMscore by this in searching + if (Lnorm<=19) //update 15-->19 + d0=0.168; //update 0.5-->0.168 + else d0=(1.24*pow((Lnorm*1.0-15), 1.0/3)-1.8); + D0_MIN=d0+0.8; //this should be moved to above + d0=D0_MIN; //update: best for search + + d0_search=d0; + if (d0_search>8) d0_search=8; + if (d0_search<4.5) d0_search=4.5; + + score_d8=1.5*pow(Lnorm*1.0, 0.3)+3.5; //remove pairs with dis>d8 during search & final +} + +void parameter_set4final_C3prime(const double len, double &D0_MIN, + double &Lnorm, double &d0, double &d0_search) +{ + D0_MIN=0.3; + + Lnorm=len; //normaliz TMscore by this in searching + if(Lnorm<=11) d0=0.3; + else if(Lnorm>11&&Lnorm<=15) d0=0.4; + else if(Lnorm>15&&Lnorm<=19) d0=0.5; + else if(Lnorm>19&&Lnorm<=23) d0=0.6; + else if(Lnorm>23&&Lnorm<30) d0=0.7; + else d0=(0.6*pow((Lnorm*1.0-0.5), 1.0/2)-2.5); + + d0_search=d0; + if (d0_search>8) d0_search=8; + if (d0_search<4.5) d0_search=4.5; +} + +void parameter_set4final(const double len, double &D0_MIN, double &Lnorm, + double &d0, double &d0_search, const int mol_type) +{ + if (mol_type>0) // RNA + { + parameter_set4final_C3prime(len, D0_MIN, Lnorm, + d0, d0_search); + return; + } + D0_MIN=0.5; + + Lnorm=len; //normaliz TMscore by this in searching + if (Lnorm<=21) d0=0.5; + else d0=(1.24*pow((Lnorm*1.0-15), 1.0/3)-1.8); + if (d0<D0_MIN) d0=D0_MIN; + d0_search=d0; + if (d0_search>8) d0_search=8; + if (d0_search<4.5) d0_search=4.5; +} + +void parameter_set4scale(const int len, const double d_s, double &Lnorm, + double &d0, double &d0_search) +{ + d0=d_s; + Lnorm=len; //normaliz TMscore by this in searching + d0_search=d0; + if (d0_search>8) d0_search=8; + if (d0_search<4.5) d0_search=4.5; +} diff --git a/modules/bindings/src/tmalign/pdb2fasta.cpp b/modules/bindings/src/tmalign/pdb2fasta.cpp new file mode 100644 index 000000000..420514205 --- /dev/null +++ b/modules/bindings/src/tmalign/pdb2fasta.cpp @@ -0,0 +1,175 @@ +#include "basic_fun.h" + +using namespace std; + +void print_help() +{ + cout << +"Converting PDB file(s) into FASTA format sequence.\n" +"\n" +"Usage: pdb2fasta pdb.pdb > seq.fasta\n" +"\n" +" -dir Convert all chains listed by 'chain_list' under 'chain_folder'.\n" +" Note that the slash is necessary.\n" +" $ pdb2xyz -dir chain_folder/ chain_list\n" +"\n" +" -suffix (Only when -dir is set, default is empty)\n" +" add file name suffix to files listed by chain_list\n" +"\n" +" -atom 4-character atom name used to represent a residue.\n" +" Default is \" C3'\" for RNA/DNA and \" CA \" for proteins\n" +" (note the spaces before and after CA).\n" +"\n" +" -ter Strings to mark the end of a chain\n" +" 3: (default) TER, ENDMDL, END or different chain ID\n" +" 2: ENDMDL, END, or different chain ID\n" +" 1: ENDMDL or END\n" +" 0: end of file\n" +"\n" +" -split Whether to split PDB file into multiple chains\n" +" 0: (default) treat the whole structure as one single chain\n" +" 1: treat each MODEL as a separate chain (-ter should be 0)\n" +" 2: treat each chain as a seperate chain (-ter should be <=1)\n" +"\n" +" -infmt Input format for chain\n" +" -1: (default) automatically detect PDB or PDBx/mmCIF format\n" +" 0: PDB format\n" +" 2: xyz format\n" +" 3: PDBx/mmCIF format\n" + <<endl; + exit(EXIT_SUCCESS); +} + +int main(int argc, char *argv[]) +{ + if (argc < 2) print_help(); + + + /**********************/ + /* get argument */ + /**********************/ + string xname = ""; + int ter_opt =3; // TER, END, or different chainID + int infmt_opt =-1; // PDB or PDBx/mmCIF format + int split_opt =0; // do not split chain + string atom_opt ="auto";// use C alpha atom for protein and C3' for RNA + string suffix_opt=""; // set -suffix to empty + string dir_opt =""; // set -dir to empty + vector<string> chain_list; // only when -dir1 is set + + int nameIdx = 0; + for(int i = 1; i < argc; i++) + { + if ( !strcmp(argv[i],"-ter") && i < (argc-1) ) + { + ter_opt=atoi(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-split") && i < (argc-1) ) + { + split_opt=atoi(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-atom") && i < (argc-1) ) + { + atom_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-dir") && i < (argc-1) ) + { + dir_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-suffix") && i < (argc-1) ) + { + suffix_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-infmt") && i < (argc-1) ) + { + infmt_opt=atoi(argv[i + 1]); i++; + } + else xname=argv[i]; + } + + if(xname.size()==0||xname=="-h") print_help(); + + if (suffix_opt.size() && dir_opt.size()==0) + PrintErrorAndQuit("-suffix is only valid if -dir is set"); + if (atom_opt.size()!=4) + PrintErrorAndQuit("ERROR! atom name must have 4 characters, including space."); + if (split_opt==1 && ter_opt!=0) + PrintErrorAndQuit("-split 1 should be used with -ter 0"); + else if (split_opt==2 && ter_opt!=0 && ter_opt!=1) + PrintErrorAndQuit("-split 2 should be used with -ter 0 or 1"); + if (split_opt<0 || split_opt>2) + PrintErrorAndQuit("-split can only be 0, 1 or 2"); + + /* parse file list */ + if (dir_opt.size()==0) + chain_list.push_back(xname); + else + { + ifstream fp(xname.c_str()); + if (! fp.is_open()) + { + char message[5000]; + sprintf(message, "Can not open file: %s\n", xname.c_str()); + PrintErrorAndQuit(message); + } + string line; + while (fp.good()) + { + getline(fp, line); + if (! line.size()) continue; + chain_list.push_back(dir_opt+Trim(line)+suffix_opt); + } + fp.close(); + line.clear(); + } + + /* declare previously global variables */ + vector<vector<string> >PDB_lines; // text of chain + vector<int> mol_vec; // molecule type of chain + vector<string> chainID_list; // list of chainID1 + vector<string> resi_vec; // residue index for chain + int i; // file index + int l; // residue index + int chain_i; // chain index + int xlen; // chain length + int xchainnum; // number of chains in a PDB file + string sequence; // amino acid sequence + + /* loop over file names */ + for (i=0;i<chain_list.size();i++) + { + xname=chain_list[i]; + xchainnum=get_PDB_lines(xname, PDB_lines, chainID_list, + mol_vec, ter_opt, infmt_opt, atom_opt, split_opt); + if (!xchainnum) + { + cerr<<"Warning! Cannot parse file: "<<xname + <<". Chain number 0."<<endl; + continue; + } + for (chain_i=0;chain_i<xchainnum;chain_i++) + { + xlen=PDB_lines[chain_i].size(); + if (!xlen) + { + cerr<<"Warning! Cannot parse file: "<<xname + <<". Chain length 0."<<endl; + continue; + } + + for (l=0;l<PDB_lines[chain_i].size();l++) + sequence+=AAmap(PDB_lines[chain_i][l].substr(17,3)); + cout<<'>'<<xname.substr(dir_opt.size(), + xname.size()-dir_opt.size()-suffix_opt.size()) + <<chainID_list[chain_i]<<'\t'<<xlen<<'\n'<<sequence<<endl; + sequence.clear(); + PDB_lines[chain_i].clear(); + } // chain_i + xname.clear(); + PDB_lines.clear(); + resi_vec.clear(); + mol_vec.clear(); + } // i + chain_list.clear(); + return 0; +} diff --git a/modules/bindings/src/tmalign/pdb2ss.cpp b/modules/bindings/src/tmalign/pdb2ss.cpp new file mode 100644 index 000000000..a346cad36 --- /dev/null +++ b/modules/bindings/src/tmalign/pdb2ss.cpp @@ -0,0 +1,218 @@ +#include "TMalign.h" + +using namespace std; + +// secondary structure 01234 +const char* SSmapProtein=" CHTE"; +const char* SSmapRNA =" .<>"; + +void print_help() +{ + cout << +"Converting PDB file(s) into FASTA format secondary structure sequence.\n" +"Proteins have four states: H E C T (helix, strand, coil, turn)\n" +"RNA have three states: < > . (paired with 3', paired with 5', unpaired)\n" +"\n" +"Usage: pdb2ss pdb.pdb > seq.ss\n" +"\n" +" -dir Convert all chains listed by 'chain_list' under 'chain_folder'.\n" +" Note that the slash is necessary.\n" +" $ pdb2xyz -dir chain_folder/ chain_list\n" +"\n" +" -suffix (Only when -dir is set, default is empty)\n" +" add file name suffix to files listed by chain_list\n" +"\n" +" -atom 4-character atom name used to represent a residue.\n" +" Default is \" C3'\" for RNA/DNA and \" CA \" for proteins\n" +" (note the spaces before and after CA).\n" +"\n" +" -mol Molecule type: RNA or protein\n" +" Default is detect molecule type automatically\n" +"\n" +" -ter Strings to mark the end of a chain\n" +" 3: (default) TER, ENDMDL, END or different chain ID\n" +" 2: ENDMDL, END, or different chain ID\n" +" 1: ENDMDL or END\n" +" 0: end of file\n" +"\n" +" -split Whether to split PDB file into multiple chains\n" +" 0: (default) treat the whole structure as one single chain\n" +" 1: treat each MODEL as a separate chain (-ter should be 0)\n" +" 2: treat each chain as a seperate chain (-ter should be <=1)\n" +"\n" +" -infmt Input format for chain\n" +" -1: (default) automatically detect PDB or PDBx/mmCIF format\n" +" 0: PDB format\n" +" 2: xyz format\n" +" 3: PDBx/mmCIF format\n" + <<endl; + exit(EXIT_SUCCESS); +} + +int main(int argc, char *argv[]) +{ + if (argc < 2) print_help(); + + + /**********************/ + /* get argument */ + /**********************/ + string xname = ""; + int ter_opt =3; // TER, END, or different chainID + int infmt_opt =-1; // PDB format + int split_opt =0; // do not split chain + string atom_opt ="auto";// use C alpha atom for protein and C3' for RNA + string mol_opt ="auto";// auto-detect the molecule type as protein/RNA + string suffix_opt=""; // set -suffix to empty + string dir_opt =""; // set -dir to empty + vector<string> chain_list; // only when -dir1 is set + + int nameIdx = 0; + for(int i = 1; i < argc; i++) + { + if ( !strcmp(argv[i],"-ter") && i < (argc-1) ) + { + ter_opt=atoi(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-split") && i < (argc-1) ) + { + split_opt=atoi(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-atom") && i < (argc-1) ) + { + atom_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-mol") && i < (argc-1) ) + { + mol_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-dir") && i < (argc-1) ) + { + dir_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-suffix") && i < (argc-1) ) + { + suffix_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-infmt") && i < (argc-1) ) + { + infmt_opt=atoi(argv[i + 1]); i++; + } + else xname=argv[i]; + } + + if(xname.size()==0||xname=="-h") print_help(); + + if (suffix_opt.size() && dir_opt.size()==0) + PrintErrorAndQuit("-suffix is only valid if -dir is set"); + if (atom_opt.size()!=4) + PrintErrorAndQuit("ERROR! atom name must have 4 characters, including space."); + if (mol_opt!="auto" && mol_opt!="protein" && mol_opt!="RNA") + PrintErrorAndQuit("ERROR! molecule type must be either RNA or protein."); + else if (mol_opt=="protein" && atom_opt=="auto") + atom_opt=" CA "; + else if (mol_opt=="RNA" && atom_opt=="auto") + atom_opt=" C3'"; + if (split_opt==1 && ter_opt!=0) + PrintErrorAndQuit("-split 1 should be used with -ter 0"); + else if (split_opt==2 && ter_opt!=0 && ter_opt!=1) + PrintErrorAndQuit("-split 2 should be used with -ter 0 or 1"); + if (split_opt<0 || split_opt>2) + PrintErrorAndQuit("-split can only be 0, 1 or 2"); + + /* parse file list */ + if (dir_opt.size()==0) + chain_list.push_back(xname); + else + { + ifstream fp(xname.c_str()); + if (! fp.is_open()) + { + char message[5000]; + sprintf(message, "Can not open file: %s\n", xname.c_str()); + PrintErrorAndQuit(message); + } + string line; + while (fp.good()) + { + getline(fp, line); + if (! line.size()) continue; + chain_list.push_back(dir_opt+Trim(line)+suffix_opt); + } + fp.close(); + line.clear(); + } + + /* declare previously global variables */ + vector<vector<string> >PDB_lines; // text of chain + vector<int> mol_vec; // molecule type of chain + vector<string> chainID_list; // list of chainID1 + int i; // file index + int l; // residue index + int chain_i; // chain index + int xlen; // chain length + int xchainnum; // number of chains in a PDB file + char *seqx; // for the protein sequence + int *secx; // for the secondary structure + double **xa; // for input vectors xa[0...xlen-1][0..2] and + vector<string> resi_vec; // residue index for chain + string sequence; // secondary structure sequence + + /* loop over file names */ + for (i=0;i<chain_list.size();i++) + { + xname=chain_list[i]; + xchainnum=get_PDB_lines(xname, PDB_lines, chainID_list, + mol_vec, ter_opt, infmt_opt, atom_opt, split_opt); + if (!xchainnum) + { + cerr<<"Warning! Cannot parse file: "<<xname + <<". Chain number 0."<<endl; + continue; + } + for (chain_i=0;chain_i<xchainnum;chain_i++) + { + xlen=PDB_lines[chain_i].size(); + if (mol_opt=="RNA") mol_vec[chain_i]=1; + else if (mol_opt=="protein") mol_vec[chain_i]=-1; + if (!xlen) + { + cerr<<"Warning! Cannot parse file: "<<xname + <<". Chain length 0."<<endl; + continue; + } + NewArray(&xa, xlen, 3); + seqx = new char[xlen + 1]; + secx = new int[xlen]; + xlen = read_PDB(PDB_lines[chain_i], xa, seqx, resi_vec, 0); + if (mol_vec[chain_i]>0) // RNA + { + make_sec(seqx,xa, xlen, secx,atom_opt); + for (l=0;l<PDB_lines[chain_i].size();l++) + sequence+=SSmapRNA[secx[l]]; + } + else //protein + { + make_sec(xa, xlen, secx); + for (l=0;l<PDB_lines[chain_i].size();l++) + sequence+=SSmapProtein[secx[l]]; + } + + cout<<'>'<<xname.substr(dir_opt.size(), + xname.size()-dir_opt.size()-suffix_opt.size()) + <<chainID_list[chain_i]<<'\t'<<xlen<<'\n'<<sequence<<endl; + + sequence.clear(); + PDB_lines[chain_i].clear(); + DeleteArray(&xa, xlen); + delete [] seqx; + delete [] secx; + } // chain_i + xname.clear(); + PDB_lines.clear(); + resi_vec.clear(); + mol_vec.clear(); + } // i + chain_list.clear(); + return 0; +} diff --git a/modules/bindings/src/tmalign/pdb2xyz.cpp b/modules/bindings/src/tmalign/pdb2xyz.cpp new file mode 100644 index 000000000..6fd235f6e --- /dev/null +++ b/modules/bindings/src/tmalign/pdb2xyz.cpp @@ -0,0 +1,176 @@ +#include "basic_fun.h" + +using namespace std; + +void print_help() +{ + cout << +"Converting PDB or PDBx/mmCIF file(s) into xyz format.\n" +"\n" +"Usage: pdb2xyz pdb.pdb > ca.xyz\n" +"\n" +" -dir Convert all chains listed by 'chain_list' under 'chain_folder'.\n" +" Note that the slash is necessary.\n" +" $ pdb2xyz -dir chain_folder/ chain_list\n" +"\n" +" -suffix (Only when -dir is set, default is empty)\n" +" add file name suffix to files listed by chain_list\n" +"\n" +" -atom 4-character atom name used to represent a residue.\n" +" Default is \" C3'\" for RNA/DNA and \" CA \" for proteins\n" +" (note the spaces before and after CA).\n" +"\n" +" -ter Strings to mark the end of a chain\n" +" 3: (default) TER, ENDMDL, END or different chain ID\n" +" 2: ENDMDL, END, or different chain ID\n" +" 1: ENDMDL or END\n" +" 0: end of file\n" +"\n" +" -split Whether to split PDB file into multiple chains\n" +" 0: (default) treat the whole structure as one single chain\n" +" 1: treat each MODEL as a separate chain (-ter should be 0)\n" +" 2: treat each chain as a seperate chain (-ter should be <=1)\n" +"\n" +" -infmt Input format for chain2\n" +" -1: (default) automatically detect PDB or PDBx/mmCIF format\n" +" 3: PDBx/mmCIF format\n" + <<endl; + exit(EXIT_SUCCESS); +} + +int main(int argc, char *argv[]) +{ + if (argc < 2) print_help(); + + + /**********************/ + /* get argument */ + /**********************/ + string xname = ""; + int ter_opt =3; // TER, END, or different chainID + int infmt_opt =-1; // PDB or PDBx/mmCIF format + int split_opt =0; // do not split chain + string atom_opt ="auto";// use C alpha atom for protein and C3' for RNA + string suffix_opt=""; // set -suffix to empty + string dir_opt =""; // set -dir to empty + vector<string> chain_list; // only when -dir1 is set + + int nameIdx = 0; + for(int i = 1; i < argc; i++) + { + if ( !strcmp(argv[i],"-ter") && i < (argc-1) ) + { + ter_opt=atoi(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-split") && i < (argc-1) ) + { + split_opt=atoi(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-atom") && i < (argc-1) ) + { + atom_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-dir") && i < (argc-1) ) + { + dir_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-suffix") && i < (argc-1) ) + { + suffix_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-infmt") && i < (argc-1) ) + { + infmt_opt=atoi(argv[i + 1]); i++; + } + else xname=argv[i]; + } + + if(xname.size()==0||xname=="-h") print_help(); + + if (suffix_opt.size() && dir_opt.size()==0) + PrintErrorAndQuit("-suffix is only valid if -dir is set"); + if (atom_opt.size()!=4) + PrintErrorAndQuit("ERROR! atom name must have 4 characters, including space."); + if (split_opt==1 && ter_opt!=0) + PrintErrorAndQuit("-split 1 should be used with -ter 0"); + else if (split_opt==2 && ter_opt!=0 && ter_opt!=1) + PrintErrorAndQuit("-split 2 should be used with -ter 0 or 1"); + + /* parse file list */ + if (dir_opt.size()==0) + chain_list.push_back(xname); + else + { + ifstream fp(xname.c_str()); + if (! fp.is_open()) + { + char message[5000]; + sprintf(message, "Can not open file: %s\n", xname.c_str()); + PrintErrorAndQuit(message); + } + string line; + while (fp.good()) + { + getline(fp, line); + if (! line.size()) continue; + chain_list.push_back(dir_opt+Trim(line)+suffix_opt); + } + fp.close(); + line.clear(); + } + + /* declare previously global variables */ + vector<vector<string> >PDB_lines; // text of chain + vector<int> mol_vec; // molecule type of chain + vector<string> chainID_list; // list of chainID1 + vector<string> resi_vec; // residue index for chain + int i; // file index + int l; // residue index + int chain_i; // chain index + int xlen; // chain length + int xchainnum; // number of chains in a PDB file + + /* loop over file names */ + for (i=0;i<chain_list.size();i++) + { + xname=chain_list[i]; + xchainnum=get_PDB_lines(xname, PDB_lines, chainID_list, + mol_vec, ter_opt, infmt_opt, atom_opt, split_opt); + if (!xchainnum) + { + cerr<<"Warning! Cannot parse file: "<<xname + <<". Chain number 0."<<endl; + continue; + } + for (chain_i=0;chain_i<xchainnum;chain_i++) + { + xlen=PDB_lines[chain_i].size(); + if (!xlen) + { + cerr<<"Warning! Cannot parse file: "<<xname + <<". Chain length 0."<<endl; + continue; + } + + cout<<xlen<<'\n'<<xname.substr(dir_opt.size(), + xname.size()-dir_opt.size()-suffix_opt.size()) + <<chainID_list[chain_i]; + for (l=0;l<PDB_lines[chain_i].size();l++) + { + cout<<'\n'<<AAmap(PDB_lines[chain_i][l].substr(17,3))<<' ' + <<PDB_lines[chain_i][l].substr(30,8)<<' ' + <<PDB_lines[chain_i][l].substr(38,8)<<' ' + <<PDB_lines[chain_i][l].substr(46,8); + } + cout<<endl; + + PDB_lines[chain_i].clear(); + } // chain_i + xname.clear(); + PDB_lines.clear(); + resi_vec.clear(); + mol_vec.clear(); + } // i + chain_list.clear(); + return 0; +} diff --git a/modules/bindings/src/tmalign/pstream.h b/modules/bindings/src/tmalign/pstream.h new file mode 100644 index 000000000..28cbeadb1 --- /dev/null +++ b/modules/bindings/src/tmalign/pstream.h @@ -0,0 +1,2255 @@ +// PStreams - POSIX Process I/O for C++ + +// Copyright (C) 2001 - 2017 Jonathan Wakely +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +/** + * @file pstream.h + * @brief Declares all PStreams classes. + * @author Jonathan Wakely + * + * Defines classes redi::ipstream, redi::opstream, redi::pstream + * and redi::rpstream. + */ + +#ifndef REDI_PSTREAM_H_SEEN +#define REDI_PSTREAM_H_SEEN + +#include <ios> +#include <streambuf> +#include <istream> +#include <ostream> +#include <string> +#include <vector> +#include <algorithm> // for min() +#include <cerrno> // for errno +#include <cstddef> // for size_t, NULL +#include <cstdlib> // for exit() +#include <sys/types.h> // for pid_t +#include <sys/wait.h> // for waitpid() +#include <sys/ioctl.h> // for ioctl() and FIONREAD +#if defined(__sun) +# include <sys/filio.h> // for FIONREAD on Solaris 2.5 +#endif +#include <unistd.h> // for pipe() fork() exec() and filedes functions +#include <signal.h> // for kill() +#include <fcntl.h> // for fcntl() +#if REDI_EVISCERATE_PSTREAMS +# include <stdio.h> // for FILE, fdopen() +#endif + + +/// The library version. +#define PSTREAMS_VERSION 0x0101 // 1.0.1 + +/** + * @namespace redi + * @brief All PStreams classes are declared in namespace redi. + * + * Like the standard iostreams, PStreams is a set of class templates, + * taking a character type and traits type. As with the standard streams + * they are most likely to be used with @c char and the default + * traits type, so typedefs for this most common case are provided. + * + * The @c pstream_common class template is not intended to be used directly, + * it is used internally to provide the common functionality for the + * other stream classes. + */ +namespace redi +{ + /// Common base class providing constants and typenames. + struct pstreams + { + /// Type used to specify how to connect to the process. + typedef std::ios_base::openmode pmode; + + /// Type used to hold the arguments for a command. + typedef std::vector<std::string> argv_type; + + /// Type used for file descriptors. + typedef int fd_type; + + static const pmode pstdin = std::ios_base::out; ///< Write to stdin + static const pmode pstdout = std::ios_base::in; ///< Read from stdout + static const pmode pstderr = std::ios_base::app; ///< Read from stderr + + /// Create a new process group for the child process. + static const pmode newpg = std::ios_base::trunc; + + protected: + enum { bufsz = 32 }; ///< Size of pstreambuf buffers. + enum { pbsz = 2 }; ///< Number of putback characters kept. + }; + + /// Class template for stream buffer. + template <typename CharT, typename Traits = std::char_traits<CharT> > + class basic_pstreambuf + : public std::basic_streambuf<CharT, Traits> + , public pstreams + { + public: + // Type definitions for dependent types + typedef CharT char_type; + typedef Traits traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::off_type off_type; + typedef typename traits_type::pos_type pos_type; + /** @deprecated use pstreams::fd_type instead. */ + typedef fd_type fd_t; + + /// Default constructor. + basic_pstreambuf(); + + /// Constructor that initialises the buffer with @a cmd. + basic_pstreambuf(const std::string& cmd, pmode mode); + + /// Constructor that initialises the buffer with @a file and @a argv. + basic_pstreambuf( const std::string& file, + const argv_type& argv, + pmode mode ); + + /// Destructor. + ~basic_pstreambuf(); + + /// Initialise the stream buffer with @a cmd. + basic_pstreambuf* + open(const std::string& cmd, pmode mode); + + /// Initialise the stream buffer with @a file and @a argv. + basic_pstreambuf* + open(const std::string& file, const argv_type& argv, pmode mode); + + /// Close the stream buffer and wait for the process to exit. + basic_pstreambuf* + close(); + + /// Send a signal to the process. + basic_pstreambuf* + kill(int signal = SIGTERM); + + /// Send a signal to the process' process group. + basic_pstreambuf* + killpg(int signal = SIGTERM); + + /// Close the pipe connected to the process' stdin. + void + peof(); + + /// Change active input source. + bool + read_err(bool readerr = true); + + /// Report whether the stream buffer has been initialised. + bool + is_open() const; + + /// Report whether the process has exited. + bool + exited(); + +#if REDI_EVISCERATE_PSTREAMS + /// Obtain FILE pointers for each of the process' standard streams. + std::size_t + fopen(FILE*& in, FILE*& out, FILE*& err); +#endif + + /// Return the exit status of the process. + int + status() const; + + /// Return the error number (errno) for the most recent failed operation. + int + error() const; + + protected: + /// Transfer characters to the pipe when character buffer overflows. + int_type + overflow(int_type c); + + /// Transfer characters from the pipe when the character buffer is empty. + int_type + underflow(); + + /// Make a character available to be returned by the next extraction. + int_type + pbackfail(int_type c = traits_type::eof()); + + /// Write any buffered characters to the stream. + int + sync(); + + /// Insert multiple characters into the pipe. + std::streamsize + xsputn(const char_type* s, std::streamsize n); + + /// Insert a sequence of characters into the pipe. + std::streamsize + write(const char_type* s, std::streamsize n); + + /// Extract a sequence of characters from the pipe. + std::streamsize + read(char_type* s, std::streamsize n); + + /// Report how many characters can be read from active input without blocking. + std::streamsize + showmanyc(); + + protected: + /// Enumerated type to indicate whether stdout or stderr is to be read. + enum buf_read_src { rsrc_out = 0, rsrc_err = 1 }; + + /// Initialise pipes and fork process. + pid_t + fork(pmode mode); + + /// Wait for the child process to exit. + int + wait(bool nohang = false); + + /// Return the file descriptor for the output pipe. + fd_type& + wpipe(); + + /// Return the file descriptor for the active input pipe. + fd_type& + rpipe(); + + /// Return the file descriptor for the specified input pipe. + fd_type& + rpipe(buf_read_src which); + + void + create_buffers(pmode mode); + + void + destroy_buffers(pmode mode); + + /// Writes buffered characters to the process' stdin pipe. + bool + empty_buffer(); + + bool + fill_buffer(bool non_blocking = false); + + /// Return the active input buffer. + char_type* + rbuffer(); + + buf_read_src + switch_read_buffer(buf_read_src); + + private: + basic_pstreambuf(const basic_pstreambuf&); + basic_pstreambuf& operator=(const basic_pstreambuf&); + + void + init_rbuffers(); + + pid_t ppid_; // pid of process + fd_type wpipe_; // pipe used to write to process' stdin + fd_type rpipe_[2]; // two pipes to read from, stdout and stderr + char_type* wbuffer_; + char_type* rbuffer_[2]; + char_type* rbufstate_[3]; + /// Index into rpipe_[] to indicate active source for read operations. + buf_read_src rsrc_; + int status_; // hold exit status of child process + int error_; // hold errno if fork() or exec() fails + }; + + /// Class template for common base class. + template <typename CharT, typename Traits = std::char_traits<CharT> > + class pstream_common + : virtual public std::basic_ios<CharT, Traits> + , virtual public pstreams + { + protected: + typedef basic_pstreambuf<CharT, Traits> streambuf_type; + + typedef pstreams::pmode pmode; + typedef pstreams::argv_type argv_type; + + /// Default constructor. + pstream_common(); + + /// Constructor that initialises the stream by starting a process. + pstream_common(const std::string& cmd, pmode mode); + + /// Constructor that initialises the stream by starting a process. + pstream_common(const std::string& file, const argv_type& argv, pmode mode); + + /// Pure virtual destructor. + virtual + ~pstream_common() = 0; + + /// Start a process. + void + do_open(const std::string& cmd, pmode mode); + + /// Start a process. + void + do_open(const std::string& file, const argv_type& argv, pmode mode); + + public: + /// Close the pipe. + void + close(); + + /// Report whether the stream's buffer has been initialised. + bool + is_open() const; + + /// Return the command used to initialise the stream. + const std::string& + command() const; + + /// Return a pointer to the stream buffer. + streambuf_type* + rdbuf() const; + +#if REDI_EVISCERATE_PSTREAMS + /// Obtain FILE pointers for each of the process' standard streams. + std::size_t + fopen(FILE*& in, FILE*& out, FILE*& err); +#endif + + protected: + std::string command_; ///< The command used to start the process. + streambuf_type buf_; ///< The stream buffer. + }; + + + /** + * @class basic_ipstream + * @brief Class template for Input PStreams. + * + * Reading from an ipstream reads the command's standard output and/or + * standard error (depending on how the ipstream is opened) + * and the command's standard input is the same as that of the process + * that created the object, unless altered by the command itself. + */ + + template <typename CharT, typename Traits = std::char_traits<CharT> > + class basic_ipstream + : public std::basic_istream<CharT, Traits> + , public pstream_common<CharT, Traits> + , virtual public pstreams + { + typedef std::basic_istream<CharT, Traits> istream_type; + typedef pstream_common<CharT, Traits> pbase_type; + + using pbase_type::buf_; // declare name in this scope + + // Ensure a basic_ipstream will read from at least one pipe + pmode readable(pmode mode) + { + if (!(mode & (pstdout|pstderr))) + mode |= pstdout; + return mode; + } + + public: + /// Type used to specify how to connect to the process. + typedef typename pbase_type::pmode pmode; + + /// Type used to hold the arguments for a command. + typedef typename pbase_type::argv_type argv_type; + + /// Default constructor, creates an uninitialised stream. + basic_ipstream() + : istream_type(NULL), pbase_type() + { } + + /** + * @brief Constructor that initialises the stream by starting a process. + * + * Initialises the stream buffer by calling do_open() with the supplied + * arguments. + * + * @param cmd a string containing a shell command. + * @param mode the I/O mode to use when opening the pipe. + * @see do_open(const std::string&, pmode) + */ + explicit + basic_ipstream(const std::string& cmd, pmode mode = pstdout) + : istream_type(NULL), pbase_type(cmd, readable(mode)) + { } + + /** + * @brief Constructor that initialises the stream by starting a process. + * + * Initialises the stream buffer by calling do_open() with the supplied + * arguments. + * + * @param file a string containing the pathname of a program to execute. + * @param argv a vector of argument strings passed to the new program. + * @param mode the I/O mode to use when opening the pipe. + * @see do_open(const std::string&, const argv_type&, pmode) + */ + basic_ipstream( const std::string& file, + const argv_type& argv, + pmode mode = pstdout ) + : istream_type(NULL), pbase_type(file, argv, readable(mode)) + { } + + /** + * @brief Constructor that initialises the stream by starting a process. + * + * Initialises the stream buffer by calling + * @c do_open(argv[0],argv,mode|pstdout) + * + * @param argv a vector of argument strings passed to the new program. + * @param mode the I/O mode to use when opening the pipe. + * @see do_open(const std::string&, const argv_type&, pmode) + */ + explicit + basic_ipstream(const argv_type& argv, pmode mode = pstdout) + : istream_type(NULL), pbase_type(argv.at(0), argv, readable(mode)) + { } + +#if __cplusplus >= 201103L + template<typename T> + explicit + basic_ipstream(std::initializer_list<T> args, pmode mode = pstdout) + : basic_ipstream(argv_type(args.begin(), args.end()), mode) + { } +#endif + + /** + * @brief Destructor. + * + * Closes the stream and waits for the child to exit. + */ + ~basic_ipstream() + { } + + /** + * @brief Start a process. + * + * Calls do_open( @a cmd , @a mode|pstdout ). + * + * @param cmd a string containing a shell command. + * @param mode the I/O mode to use when opening the pipe. + * @see do_open(const std::string&, pmode) + */ + void + open(const std::string& cmd, pmode mode = pstdout) + { + this->do_open(cmd, readable(mode)); + } + + /** + * @brief Start a process. + * + * Calls do_open( @a file , @a argv , @a mode|pstdout ). + * + * @param file a string containing the pathname of a program to execute. + * @param argv a vector of argument strings passed to the new program. + * @param mode the I/O mode to use when opening the pipe. + * @see do_open(const std::string&, const argv_type&, pmode) + */ + void + open( const std::string& file, + const argv_type& argv, + pmode mode = pstdout ) + { + this->do_open(file, argv, readable(mode)); + } + + /** + * @brief Set streambuf to read from process' @c stdout. + * @return @c *this + */ + basic_ipstream& + out() + { + this->buf_.read_err(false); + return *this; + } + + /** + * @brief Set streambuf to read from process' @c stderr. + * @return @c *this + */ + basic_ipstream& + err() + { + this->buf_.read_err(true); + return *this; + } + }; + + + /** + * @class basic_opstream + * @brief Class template for Output PStreams. + * + * Writing to an open opstream writes to the standard input of the command; + * the command's standard output is the same as that of the process that + * created the pstream object, unless altered by the command itself. + */ + + template <typename CharT, typename Traits = std::char_traits<CharT> > + class basic_opstream + : public std::basic_ostream<CharT, Traits> + , public pstream_common<CharT, Traits> + , virtual public pstreams + { + typedef std::basic_ostream<CharT, Traits> ostream_type; + typedef pstream_common<CharT, Traits> pbase_type; + + using pbase_type::buf_; // declare name in this scope + + public: + /// Type used to specify how to connect to the process. + typedef typename pbase_type::pmode pmode; + + /// Type used to hold the arguments for a command. + typedef typename pbase_type::argv_type argv_type; + + /// Default constructor, creates an uninitialised stream. + basic_opstream() + : ostream_type(NULL), pbase_type() + { } + + /** + * @brief Constructor that initialises the stream by starting a process. + * + * Initialises the stream buffer by calling do_open() with the supplied + * arguments. + * + * @param cmd a string containing a shell command. + * @param mode the I/O mode to use when opening the pipe. + * @see do_open(const std::string&, pmode) + */ + explicit + basic_opstream(const std::string& cmd, pmode mode = pstdin) + : ostream_type(NULL), pbase_type(cmd, mode|pstdin) + { } + + /** + * @brief Constructor that initialises the stream by starting a process. + * + * Initialises the stream buffer by calling do_open() with the supplied + * arguments. + * + * @param file a string containing the pathname of a program to execute. + * @param argv a vector of argument strings passed to the new program. + * @param mode the I/O mode to use when opening the pipe. + * @see do_open(const std::string&, const argv_type&, pmode) + */ + basic_opstream( const std::string& file, + const argv_type& argv, + pmode mode = pstdin ) + : ostream_type(NULL), pbase_type(file, argv, mode|pstdin) + { } + + /** + * @brief Constructor that initialises the stream by starting a process. + * + * Initialises the stream buffer by calling + * @c do_open(argv[0],argv,mode|pstdin) + * + * @param argv a vector of argument strings passed to the new program. + * @param mode the I/O mode to use when opening the pipe. + * @see do_open(const std::string&, const argv_type&, pmode) + */ + explicit + basic_opstream(const argv_type& argv, pmode mode = pstdin) + : ostream_type(NULL), pbase_type(argv.at(0), argv, mode|pstdin) + { } + +#if __cplusplus >= 201103L + /** + * @brief Constructor that initialises the stream by starting a process. + * + * @param args a list of argument strings passed to the new program. + * @param mode the I/O mode to use when opening the pipe. + * @see do_open(const std::string&, const argv_type&, pmode) + */ + template<typename T> + explicit + basic_opstream(std::initializer_list<T> args, pmode mode = pstdin) + : basic_opstream(argv_type(args.begin(), args.end()), mode) + { } +#endif + + /** + * @brief Destructor + * + * Closes the stream and waits for the child to exit. + */ + ~basic_opstream() { } + + /** + * @brief Start a process. + * + * Calls do_open( @a cmd , @a mode|pstdin ). + * + * @param cmd a string containing a shell command. + * @param mode the I/O mode to use when opening the pipe. + * @see do_open(const std::string&, pmode) + */ + void + open(const std::string& cmd, pmode mode = pstdin) + { + this->do_open(cmd, mode|pstdin); + } + + /** + * @brief Start a process. + * + * Calls do_open( @a file , @a argv , @a mode|pstdin ). + * + * @param file a string containing the pathname of a program to execute. + * @param argv a vector of argument strings passed to the new program. + * @param mode the I/O mode to use when opening the pipe. + * @see do_open(const std::string&, const argv_type&, pmode) + */ + void + open( const std::string& file, + const argv_type& argv, + pmode mode = pstdin) + { + this->do_open(file, argv, mode|pstdin); + } + }; + + + /** + * @class basic_pstream + * @brief Class template for Bidirectional PStreams. + * + * Writing to a pstream opened with @c pmode @c pstdin writes to the + * standard input of the command. + * Reading from a pstream opened with @c pmode @c pstdout and/or @c pstderr + * reads the command's standard output and/or standard error. + * Any of the process' @c stdin, @c stdout or @c stderr that is not + * connected to the pstream (as specified by the @c pmode) + * will be the same as the process that created the pstream object, + * unless altered by the command itself. + */ + template <typename CharT, typename Traits = std::char_traits<CharT> > + class basic_pstream + : public std::basic_iostream<CharT, Traits> + , public pstream_common<CharT, Traits> + , virtual public pstreams + { + typedef std::basic_iostream<CharT, Traits> iostream_type; + typedef pstream_common<CharT, Traits> pbase_type; + + using pbase_type::buf_; // declare name in this scope + + public: + /// Type used to specify how to connect to the process. + typedef typename pbase_type::pmode pmode; + + /// Type used to hold the arguments for a command. + typedef typename pbase_type::argv_type argv_type; + + /// Default constructor, creates an uninitialised stream. + basic_pstream() + : iostream_type(NULL), pbase_type() + { } + + /** + * @brief Constructor that initialises the stream by starting a process. + * + * Initialises the stream buffer by calling do_open() with the supplied + * arguments. + * + * @param cmd a string containing a shell command. + * @param mode the I/O mode to use when opening the pipe. + * @see do_open(const std::string&, pmode) + */ + explicit + basic_pstream(const std::string& cmd, pmode mode = pstdout|pstdin) + : iostream_type(NULL), pbase_type(cmd, mode) + { } + + /** + * @brief Constructor that initialises the stream by starting a process. + * + * Initialises the stream buffer by calling do_open() with the supplied + * arguments. + * + * @param file a string containing the pathname of a program to execute. + * @param argv a vector of argument strings passed to the new program. + * @param mode the I/O mode to use when opening the pipe. + * @see do_open(const std::string&, const argv_type&, pmode) + */ + basic_pstream( const std::string& file, + const argv_type& argv, + pmode mode = pstdout|pstdin ) + : iostream_type(NULL), pbase_type(file, argv, mode) + { } + + /** + * @brief Constructor that initialises the stream by starting a process. + * + * Initialises the stream buffer by calling + * @c do_open(argv[0],argv,mode) + * + * @param argv a vector of argument strings passed to the new program. + * @param mode the I/O mode to use when opening the pipe. + * @see do_open(const std::string&, const argv_type&, pmode) + */ + explicit + basic_pstream(const argv_type& argv, pmode mode = pstdout|pstdin) + : iostream_type(NULL), pbase_type(argv.at(0), argv, mode) + { } + +#if __cplusplus >= 201103L + /** + * @brief Constructor that initialises the stream by starting a process. + * + * @param l a list of argument strings passed to the new program. + * @param mode the I/O mode to use when opening the pipe. + * @see do_open(const std::string&, const argv_type&, pmode) + */ + template<typename T> + explicit + basic_pstream(std::initializer_list<T> l, pmode mode = pstdout|pstdin) + : basic_pstream(argv_type(l.begin(), l.end()), mode) + { } +#endif + + /** + * @brief Destructor + * + * Closes the stream and waits for the child to exit. + */ + ~basic_pstream() { } + + /** + * @brief Start a process. + * + * Calls do_open( @a cnd , @a mode ). + * + * @param cmd a string containing a shell command. + * @param mode the I/O mode to use when opening the pipe. + * @see do_open(const std::string&, pmode) + */ + void + open(const std::string& cmd, pmode mode = pstdout|pstdin) + { + this->do_open(cmd, mode); + } + + /** + * @brief Start a process. + * + * Calls do_open( @a file , @a argv , @a mode ). + * + * @param file a string containing the pathname of a program to execute. + * @param argv a vector of argument strings passed to the new program. + * @param mode the I/O mode to use when opening the pipe. + * @see do_open(const std::string&, const argv_type&, pmode) + */ + void + open( const std::string& file, + const argv_type& argv, + pmode mode = pstdout|pstdin ) + { + this->do_open(file, argv, mode); + } + + /** + * @brief Set streambuf to read from process' @c stdout. + * @return @c *this + */ + basic_pstream& + out() + { + this->buf_.read_err(false); + return *this; + } + + /** + * @brief Set streambuf to read from process' @c stderr. + * @return @c *this + */ + basic_pstream& + err() + { + this->buf_.read_err(true); + return *this; + } + }; + + + /** + * @class basic_rpstream + * @brief Class template for Restricted PStreams. + * + * Writing to an rpstream opened with @c pmode @c pstdin writes to the + * standard input of the command. + * It is not possible to read directly from an rpstream object, to use + * an rpstream as in istream you must call either basic_rpstream::out() + * or basic_rpstream::err(). This is to prevent accidental reads from + * the wrong input source. If the rpstream was not opened with @c pmode + * @c pstderr then the class cannot read the process' @c stderr, and + * basic_rpstream::err() will return an istream that reads from the + * process' @c stdout, and vice versa. + * Reading from an rpstream opened with @c pmode @c pstdout and/or + * @c pstderr reads the command's standard output and/or standard error. + * Any of the process' @c stdin, @c stdout or @c stderr that is not + * connected to the pstream (as specified by the @c pmode) + * will be the same as the process that created the pstream object, + * unless altered by the command itself. + */ + + template <typename CharT, typename Traits = std::char_traits<CharT> > + class basic_rpstream + : public std::basic_ostream<CharT, Traits> + , private std::basic_istream<CharT, Traits> + , private pstream_common<CharT, Traits> + , virtual public pstreams + { + typedef std::basic_ostream<CharT, Traits> ostream_type; + typedef std::basic_istream<CharT, Traits> istream_type; + typedef pstream_common<CharT, Traits> pbase_type; + + using pbase_type::buf_; // declare name in this scope + + public: + /// Type used to specify how to connect to the process. + typedef typename pbase_type::pmode pmode; + + /// Type used to hold the arguments for a command. + typedef typename pbase_type::argv_type argv_type; + + /// Default constructor, creates an uninitialised stream. + basic_rpstream() + : ostream_type(NULL), istream_type(NULL), pbase_type() + { } + + /** + * @brief Constructor that initialises the stream by starting a process. + * + * Initialises the stream buffer by calling do_open() with the supplied + * arguments. + * + * @param cmd a string containing a shell command. + * @param mode the I/O mode to use when opening the pipe. + * @see do_open(const std::string&, pmode) + */ + explicit + basic_rpstream(const std::string& cmd, pmode mode = pstdout|pstdin) + : ostream_type(NULL) , istream_type(NULL) , pbase_type(cmd, mode) + { } + + /** + * @brief Constructor that initialises the stream by starting a process. + * + * Initialises the stream buffer by calling do_open() with the supplied + * arguments. + * + * @param file a string containing the pathname of a program to execute. + * @param argv a vector of argument strings passed to the new program. + * @param mode the I/O mode to use when opening the pipe. + * @see do_open(const std::string&, const argv_type&, pmode) + */ + basic_rpstream( const std::string& file, + const argv_type& argv, + pmode mode = pstdout|pstdin ) + : ostream_type(NULL), istream_type(NULL), pbase_type(file, argv, mode) + { } + + /** + * @brief Constructor that initialises the stream by starting a process. + * + * Initialises the stream buffer by calling + * @c do_open(argv[0],argv,mode) + * + * @param argv a vector of argument strings passed to the new program. + * @param mode the I/O mode to use when opening the pipe. + * @see do_open(const std::string&, const argv_type&, pmode) + */ + explicit + basic_rpstream(const argv_type& argv, pmode mode = pstdout|pstdin) + : ostream_type(NULL), istream_type(NULL), + pbase_type(argv.at(0), argv, mode) + { } + +#if __cplusplus >= 201103L + /** + * @brief Constructor that initialises the stream by starting a process. + * + * @param l a list of argument strings passed to the new program. + * @param mode the I/O mode to use when opening the pipe. + * @see do_open(const std::string&, const argv_type&, pmode) + */ + template<typename T> + explicit + basic_rpstream(std::initializer_list<T> l, pmode mode = pstdout|pstdin) + : basic_rpstream(argv_type(l.begin(), l.end()), mode) + { } +#endif + + /// Destructor + ~basic_rpstream() { } + + /** + * @brief Start a process. + * + * Calls do_open( @a cmd , @a mode ). + * + * @param cmd a string containing a shell command. + * @param mode the I/O mode to use when opening the pipe. + * @see do_open(const std::string&, pmode) + */ + void + open(const std::string& cmd, pmode mode = pstdout|pstdin) + { + this->do_open(cmd, mode); + } + + /** + * @brief Start a process. + * + * Calls do_open( @a file , @a argv , @a mode ). + * + * @param file a string containing the pathname of a program to execute. + * @param argv a vector of argument strings passed to the new program. + * @param mode the I/O mode to use when opening the pipe. + * @see do_open(const std::string&, const argv_type&, pmode) + */ + void + open( const std::string& file, + const argv_type& argv, + pmode mode = pstdout|pstdin ) + { + this->do_open(file, argv, mode); + } + + /** + * @brief Obtain a reference to the istream that reads + * the process' @c stdout. + * @return @c *this + */ + istream_type& + out() + { + this->buf_.read_err(false); + return *this; + } + + /** + * @brief Obtain a reference to the istream that reads + * the process' @c stderr. + * @return @c *this + */ + istream_type& + err() + { + this->buf_.read_err(true); + return *this; + } + }; + + + /// Type definition for common template specialisation. + typedef basic_pstreambuf<char> pstreambuf; + /// Type definition for common template specialisation. + typedef basic_ipstream<char> ipstream; + /// Type definition for common template specialisation. + typedef basic_opstream<char> opstream; + /// Type definition for common template specialisation. + typedef basic_pstream<char> pstream; + /// Type definition for common template specialisation. + typedef basic_rpstream<char> rpstream; + + + /** + * When inserted into an output pstream the manipulator calls + * basic_pstreambuf<C,T>::peof() to close the output pipe, + * causing the child process to receive the end-of-file indicator + * on subsequent reads from its @c stdin stream. + * + * @brief Manipulator to close the pipe connected to the process' stdin. + * @param s An output PStream class. + * @return The stream object the manipulator was invoked on. + * @see basic_pstreambuf<C,T>::peof() + * @relates basic_opstream basic_pstream basic_rpstream + */ + template <typename C, typename T> + inline std::basic_ostream<C,T>& + peof(std::basic_ostream<C,T>& s) + { + typedef basic_pstreambuf<C,T> pstreambuf_type; + if (pstreambuf_type* p = dynamic_cast<pstreambuf_type*>(s.rdbuf())) + p->peof(); + return s; + } + + + /* + * member definitions for pstreambuf + */ + + + /** + * @class basic_pstreambuf + * Provides underlying streambuf functionality for the PStreams classes. + */ + + /** Creates an uninitialised stream buffer. */ + template <typename C, typename T> + inline + basic_pstreambuf<C,T>::basic_pstreambuf() + : ppid_(-1) // initialise to -1 to indicate no process run yet. + , wpipe_(-1) + , wbuffer_(NULL) + , rsrc_(rsrc_out) + , status_(-1) + , error_(0) + { + init_rbuffers(); + } + + /** + * Initialises the stream buffer by calling open() with the supplied + * arguments. + * + * @param cmd a string containing a shell command. + * @param mode the I/O mode to use when opening the pipe. + * @see open() + */ + template <typename C, typename T> + inline + basic_pstreambuf<C,T>::basic_pstreambuf(const std::string& cmd, pmode mode) + : ppid_(-1) // initialise to -1 to indicate no process run yet. + , wpipe_(-1) + , wbuffer_(NULL) + , rsrc_(rsrc_out) + , status_(-1) + , error_(0) + { + init_rbuffers(); + open(cmd, mode); + } + + /** + * Initialises the stream buffer by calling open() with the supplied + * arguments. + * + * @param file a string containing the name of a program to execute. + * @param argv a vector of argument strings passsed to the new program. + * @param mode the I/O mode to use when opening the pipe. + * @see open() + */ + template <typename C, typename T> + inline + basic_pstreambuf<C,T>::basic_pstreambuf( const std::string& file, + const argv_type& argv, + pmode mode ) + : ppid_(-1) // initialise to -1 to indicate no process run yet. + , wpipe_(-1) + , wbuffer_(NULL) + , rsrc_(rsrc_out) + , status_(-1) + , error_(0) + { + init_rbuffers(); + open(file, argv, mode); + } + + /** + * Closes the stream by calling close(). + * @see close() + */ + template <typename C, typename T> + inline + basic_pstreambuf<C,T>::~basic_pstreambuf() + { + close(); + } + + /** + * Starts a new process by passing @a command to the shell (/bin/sh) + * and opens pipes to the process with the specified @a mode. + * + * If @a mode contains @c pstdout the initial read source will be + * the child process' stdout, otherwise if @a mode contains @c pstderr + * the initial read source will be the child's stderr. + * + * Will duplicate the actions of the shell in searching for an + * executable file if the specified file name does not contain a slash (/) + * character. + * + * @warning + * There is no way to tell whether the shell command succeeded, this + * function will always succeed unless resource limits (such as + * memory usage, or number of processes or open files) are exceeded. + * This means is_open() will return true even if @a command cannot + * be executed. + * Use pstreambuf::open(const std::string&, const argv_type&, pmode) + * if you need to know whether the command failed to execute. + * + * @param command a string containing a shell command. + * @param mode a bitwise OR of one or more of @c out, @c in, @c err. + * @return NULL if the shell could not be started or the + * pipes could not be opened, @c this otherwise. + * @see <b>execl</b>(3) + */ + template <typename C, typename T> + basic_pstreambuf<C,T>* + basic_pstreambuf<C,T>::open(const std::string& command, pmode mode) + { + const char * shell_path = "/bin/sh"; +#if 0 + const std::string argv[] = { "sh", "-c", command }; + return this->open(shell_path, argv_type(argv, argv+3), mode); +#else + basic_pstreambuf<C,T>* ret = NULL; + + if (!is_open()) + { + switch(fork(mode)) + { + case 0 : + // this is the new process, exec command + ::execl(shell_path, "sh", "-c", command.c_str(), (char*)NULL); + + // can only reach this point if exec() failed + + // parent can get exit code from waitpid() + ::_exit(errno); + // using std::exit() would make static dtors run twice + + case -1 : + // couldn't fork, error already handled in pstreambuf::fork() + break; + + default : + // this is the parent process + // activate buffers + create_buffers(mode); + ret = this; + } + } + return ret; +#endif + } + + /** + * @brief Helper function to close a file descriptor. + * + * Inspects @a fd and calls <b>close</b>(3) if it has a non-negative value. + * + * @param fd a file descriptor. + * @relates basic_pstreambuf + */ + inline void + close_fd(pstreams::fd_type& fd) + { + if (fd >= 0 && ::close(fd) == 0) + fd = -1; + } + + /** + * @brief Helper function to close an array of file descriptors. + * + * Calls @c close_fd() on each member of the array. + * The length of the array is determined automatically by + * template argument deduction to avoid errors. + * + * @param fds an array of file descriptors. + * @relates basic_pstreambuf + */ + template <int N> + inline void + close_fd_array(pstreams::fd_type (&fds)[N]) + { + for (std::size_t i = 0; i < N; ++i) + close_fd(fds[i]); + } + + /** + * Starts a new process by executing @a file with the arguments in + * @a argv and opens pipes to the process with the specified @a mode. + * + * By convention @c argv[0] should be the file name of the file being + * executed. + * + * If @a mode contains @c pstdout the initial read source will be + * the child process' stdout, otherwise if @a mode contains @c pstderr + * the initial read source will be the child's stderr. + * + * Will duplicate the actions of the shell in searching for an + * executable file if the specified file name does not contain a slash (/) + * character. + * + * Iff @a file is successfully executed then is_open() will return true. + * Otherwise, pstreambuf::error() can be used to obtain the value of + * @c errno that was set by <b>execvp</b>(3) in the child process. + * + * The exit status of the new process will be returned by + * pstreambuf::status() after pstreambuf::exited() returns true. + * + * @param file a string containing the pathname of a program to execute. + * @param argv a vector of argument strings passed to the new program. + * @param mode a bitwise OR of one or more of @c out, @c in and @c err. + * @return NULL if a pipe could not be opened or if the program could + * not be executed, @c this otherwise. + * @see <b>execvp</b>(3) + */ + template <typename C, typename T> + basic_pstreambuf<C,T>* + basic_pstreambuf<C,T>::open( const std::string& file, + const argv_type& argv, + pmode mode ) + { + basic_pstreambuf<C,T>* ret = NULL; + + if (!is_open()) + { + // constants for read/write ends of pipe + enum { RD, WR }; + + // open another pipe and set close-on-exec + fd_type ck_exec[] = { -1, -1 }; + if (-1 == ::pipe(ck_exec) + || -1 == ::fcntl(ck_exec[RD], F_SETFD, FD_CLOEXEC) + || -1 == ::fcntl(ck_exec[WR], F_SETFD, FD_CLOEXEC)) + { + error_ = errno; + close_fd_array(ck_exec); + } + else + { + switch(fork(mode)) + { + case 0 : + // this is the new process, exec command + { + char** arg_v = new char*[argv.size()+1]; + for (std::size_t i = 0; i < argv.size(); ++i) + { + const std::string& src = argv[i]; + char*& dest = arg_v[i]; + dest = new char[src.size()+1]; + dest[ src.copy(dest, src.size()) ] = '\0'; + } + arg_v[argv.size()] = NULL; + + ::execvp(file.c_str(), arg_v); + + // can only reach this point if exec() failed + + // parent can get error code from ck_exec pipe + error_ = errno; + + while (::write(ck_exec[WR], &error_, sizeof(error_)) == -1 + && errno == EINTR) + { } + + ::close(ck_exec[WR]); + ::close(ck_exec[RD]); + + ::_exit(error_); + // using std::exit() would make static dtors run twice + } + + case -1 : + // couldn't fork, error already handled in pstreambuf::fork() + close_fd_array(ck_exec); + break; + + default : + // this is the parent process + + // check child called exec() successfully + ::close(ck_exec[WR]); + switch (::read(ck_exec[RD], &error_, sizeof(error_))) + { + case 0: + // activate buffers + create_buffers(mode); + ret = this; + break; + case -1: + error_ = errno; + break; + default: + // error_ contains error code from child + // call wait() to clean up and set ppid_ to 0 + this->wait(); + break; + } + ::close(ck_exec[RD]); + } + } + } + return ret; + } + + /** + * Creates pipes as specified by @a mode and calls @c fork() to create + * a new process. If the fork is successful the parent process stores + * the child's PID and the opened pipes and the child process replaces + * its standard streams with the opened pipes. + * + * If an error occurs the error code will be set to one of the possible + * errors for @c pipe() or @c fork(). + * See your system's documentation for these error codes. + * + * @param mode an OR of pmodes specifying which of the child's + * standard streams to connect to. + * @return On success the PID of the child is returned in the parent's + * context and zero is returned in the child's context. + * On error -1 is returned and the error code is set appropriately. + */ + template <typename C, typename T> + pid_t + basic_pstreambuf<C,T>::fork(pmode mode) + { + pid_t pid = -1; + + // Three pairs of file descriptors, for pipes connected to the + // process' stdin, stdout and stderr + // (stored in a single array so close_fd_array() can close all at once) + fd_type fd[] = { -1, -1, -1, -1, -1, -1 }; + fd_type* const pin = fd; + fd_type* const pout = fd+2; + fd_type* const perr = fd+4; + + // constants for read/write ends of pipe + enum { RD, WR }; + + // N.B. + // For the pstreambuf pin is an output stream and + // pout and perr are input streams. + + if (!error_ && mode&pstdin && ::pipe(pin)) + error_ = errno; + + if (!error_ && mode&pstdout && ::pipe(pout)) + error_ = errno; + + if (!error_ && mode&pstderr && ::pipe(perr)) + error_ = errno; + + if (!error_) + { + pid = ::fork(); + switch (pid) + { + case 0 : + { + // this is the new process + + // for each open pipe close one end and redirect the + // respective standard stream to the other end + + if (*pin >= 0) + { + ::close(pin[WR]); + ::dup2(pin[RD], STDIN_FILENO); + ::close(pin[RD]); + } + if (*pout >= 0) + { + ::close(pout[RD]); + ::dup2(pout[WR], STDOUT_FILENO); + ::close(pout[WR]); + } + if (*perr >= 0) + { + ::close(perr[RD]); + ::dup2(perr[WR], STDERR_FILENO); + ::close(perr[WR]); + } + +#ifdef _POSIX_JOB_CONTROL + if (mode&newpg) + ::setpgid(0, 0); // Change to a new process group +#endif + + break; + } + case -1 : + { + // couldn't fork for some reason + error_ = errno; + // close any open pipes + close_fd_array(fd); + break; + } + default : + { + // this is the parent process, store process' pid + ppid_ = pid; + + // store one end of open pipes and close other end + if (*pin >= 0) + { + wpipe_ = pin[WR]; + ::close(pin[RD]); + } + if (*pout >= 0) + { + rpipe_[rsrc_out] = pout[RD]; + ::close(pout[WR]); + } + if (*perr >= 0) + { + rpipe_[rsrc_err] = perr[RD]; + ::close(perr[WR]); + } + } + } + } + else + { + // close any pipes we opened before failure + close_fd_array(fd); + } + return pid; + } + + /** + * Closes all pipes and calls wait() to wait for the process to finish. + * If an error occurs the error code will be set to one of the possible + * errors for @c waitpid(). + * See your system's documentation for these errors. + * + * @return @c this on successful close or @c NULL if there is no + * process to close or if an error occurs. + */ + template <typename C, typename T> + basic_pstreambuf<C,T>* + basic_pstreambuf<C,T>::close() + { + const bool running = is_open(); + + sync(); // this might call wait() and reap the child process + + // rather than trying to work out whether or not we need to clean up + // just do it anyway, all cleanup functions are safe to call twice. + + destroy_buffers(pstdin|pstdout|pstderr); + + // close pipes before wait() so child gets EOF/SIGPIPE + close_fd(wpipe_); + close_fd_array(rpipe_); + + do + { + error_ = 0; + } while (wait() == -1 && error() == EINTR); + + return running ? this : NULL; + } + + /** + * Called on construction to initialise the arrays used for reading. + */ + template <typename C, typename T> + inline void + basic_pstreambuf<C,T>::init_rbuffers() + { + rpipe_[rsrc_out] = rpipe_[rsrc_err] = -1; + rbuffer_[rsrc_out] = rbuffer_[rsrc_err] = NULL; + rbufstate_[0] = rbufstate_[1] = rbufstate_[2] = NULL; + } + + template <typename C, typename T> + void + basic_pstreambuf<C,T>::create_buffers(pmode mode) + { + if (mode & pstdin) + { + delete[] wbuffer_; + wbuffer_ = new char_type[bufsz]; + this->setp(wbuffer_, wbuffer_ + bufsz); + } + if (mode & pstdout) + { + delete[] rbuffer_[rsrc_out]; + rbuffer_[rsrc_out] = new char_type[bufsz]; + rsrc_ = rsrc_out; + this->setg(rbuffer_[rsrc_out] + pbsz, rbuffer_[rsrc_out] + pbsz, + rbuffer_[rsrc_out] + pbsz); + } + if (mode & pstderr) + { + delete[] rbuffer_[rsrc_err]; + rbuffer_[rsrc_err] = new char_type[bufsz]; + if (!(mode & pstdout)) + { + rsrc_ = rsrc_err; + this->setg(rbuffer_[rsrc_err] + pbsz, rbuffer_[rsrc_err] + pbsz, + rbuffer_[rsrc_err] + pbsz); + } + } + } + + template <typename C, typename T> + void + basic_pstreambuf<C,T>::destroy_buffers(pmode mode) + { + if (mode & pstdin) + { + this->setp(NULL, NULL); + delete[] wbuffer_; + wbuffer_ = NULL; + } + if (mode & pstdout) + { + if (rsrc_ == rsrc_out) + this->setg(NULL, NULL, NULL); + delete[] rbuffer_[rsrc_out]; + rbuffer_[rsrc_out] = NULL; + } + if (mode & pstderr) + { + if (rsrc_ == rsrc_err) + this->setg(NULL, NULL, NULL); + delete[] rbuffer_[rsrc_err]; + rbuffer_[rsrc_err] = NULL; + } + } + + template <typename C, typename T> + typename basic_pstreambuf<C,T>::buf_read_src + basic_pstreambuf<C,T>::switch_read_buffer(buf_read_src src) + { + if (rsrc_ != src) + { + char_type* tmpbufstate[] = {this->eback(), this->gptr(), this->egptr()}; + this->setg(rbufstate_[0], rbufstate_[1], rbufstate_[2]); + for (std::size_t i = 0; i < 3; ++i) + rbufstate_[i] = tmpbufstate[i]; + rsrc_ = src; + } + return rsrc_; + } + + /** + * Suspends execution and waits for the associated process to exit, or + * until a signal is delivered whose action is to terminate the current + * process or to call a signal handling function. If the process has + * already exited (i.e. it is a "zombie" process) then wait() returns + * immediately. Waiting for the child process causes all its system + * resources to be freed. + * + * error() will return EINTR if wait() is interrupted by a signal. + * + * @param nohang true to return immediately if the process has not exited. + * @return 1 if the process has exited and wait() has not yet been called. + * 0 if @a nohang is true and the process has not exited yet. + * -1 if no process has been started or if an error occurs, + * in which case the error can be found using error(). + */ + template <typename C, typename T> + int + basic_pstreambuf<C,T>::wait(bool nohang) + { + int child_exited = -1; + if (is_open()) + { + int exit_status; + switch(::waitpid(ppid_, &exit_status, nohang ? WNOHANG : 0)) + { + case 0 : + // nohang was true and process has not exited + child_exited = 0; + break; + case -1 : + error_ = errno; + break; + default : + // process has exited + ppid_ = 0; + status_ = exit_status; + child_exited = 1; + // Close wpipe, would get SIGPIPE if we used it. + destroy_buffers(pstdin); + close_fd(wpipe_); + // Must free read buffers and pipes on destruction + // or next call to open()/close() + break; + } + } + return child_exited; + } + + /** + * Sends the specified signal to the process. A signal can be used to + * terminate a child process that would not exit otherwise. + * + * If an error occurs the error code will be set to one of the possible + * errors for @c kill(). See your system's documentation for these errors. + * + * @param signal A signal to send to the child process. + * @return @c this or @c NULL if @c kill() fails. + */ + template <typename C, typename T> + inline basic_pstreambuf<C,T>* + basic_pstreambuf<C,T>::kill(int signal) + { + basic_pstreambuf<C,T>* ret = NULL; + if (is_open()) + { + if (::kill(ppid_, signal)) + error_ = errno; + else + { +#if 0 + // TODO call exited() to check for exit and clean up? leave to user? + if (signal==SIGTERM || signal==SIGKILL) + this->exited(); +#endif + ret = this; + } + } + return ret; + } + + /** + * Sends the specified signal to the process group of the child process. + * A signal can be used to terminate a child process that would not exit + * otherwise, or to kill the process and its own children. + * + * If an error occurs the error code will be set to one of the possible + * errors for @c getpgid() or @c kill(). See your system's documentation + * for these errors. If the child is in the current process group then + * NULL will be returned and the error code set to EPERM. + * + * @param signal A signal to send to the child process. + * @return @c this on success or @c NULL on failure. + */ + template <typename C, typename T> + inline basic_pstreambuf<C,T>* + basic_pstreambuf<C,T>::killpg(int signal) + { + basic_pstreambuf<C,T>* ret = NULL; +#ifdef _POSIX_JOB_CONTROL + if (is_open()) + { + pid_t pgid = ::getpgid(ppid_); + if (pgid == -1) + error_ = errno; + else if (pgid == ::getpgrp()) + error_ = EPERM; // Don't commit suicide + else if (::killpg(pgid, signal)) + error_ = errno; + else + ret = this; + } +#else + error_ = ENOTSUP; +#endif + return ret; + } + + /** + * This function can call pstreambuf::wait() and so may change the + * object's state if the child process has already exited. + * + * @return True if the associated process has exited, false otherwise. + * @see basic_pstreambuf<C,T>::wait() + */ + template <typename C, typename T> + inline bool + basic_pstreambuf<C,T>::exited() + { + return ppid_ == 0 || wait(true)==1; + } + + + /** + * @return The exit status of the child process, or -1 if wait() + * has not yet been called to wait for the child to exit. + * @see basic_pstreambuf<C,T>::wait() + */ + template <typename C, typename T> + inline int + basic_pstreambuf<C,T>::status() const + { + return status_; + } + + /** + * @return The error code of the most recently failed operation, or zero. + */ + template <typename C, typename T> + inline int + basic_pstreambuf<C,T>::error() const + { + return error_; + } + + /** + * Closes the output pipe, causing the child process to receive the + * end-of-file indicator on subsequent reads from its @c stdin stream. + */ + template <typename C, typename T> + inline void + basic_pstreambuf<C,T>::peof() + { + sync(); + destroy_buffers(pstdin); + close_fd(wpipe_); + } + + /** + * Unlike pstreambuf::exited(), this function will not call wait() and + * so will not change the object's state. This means that once a child + * process is executed successfully this function will continue to + * return true even after the process exits (until wait() is called.) + * + * @return true if a previous call to open() succeeded and wait() has + * not been called and determined that the process has exited, + * false otherwise. + */ + template <typename C, typename T> + inline bool + basic_pstreambuf<C,T>::is_open() const + { + return ppid_ > 0; + } + + /** + * Toggle the stream used for reading. If @a readerr is @c true then the + * process' @c stderr output will be used for subsequent extractions, if + * @a readerr is false the the process' stdout will be used. + * @param readerr @c true to read @c stderr, @c false to read @c stdout. + * @return @c true if the requested stream is open and will be used for + * subsequent extractions, @c false otherwise. + */ + template <typename C, typename T> + inline bool + basic_pstreambuf<C,T>::read_err(bool readerr) + { + buf_read_src src = readerr ? rsrc_err : rsrc_out; + if (rpipe_[src]>=0) + { + switch_read_buffer(src); + return true; + } + return false; + } + + /** + * Called when the internal character buffer is not present or is full, + * to transfer the buffer contents to the pipe. + * + * @param c a character to be written to the pipe. + * @return @c traits_type::eof() if an error occurs, otherwise if @a c + * is not equal to @c traits_type::eof() it will be buffered and + * a value other than @c traits_type::eof() returned to indicate + * success. + */ + template <typename C, typename T> + typename basic_pstreambuf<C,T>::int_type + basic_pstreambuf<C,T>::overflow(int_type c) + { + if (!empty_buffer()) + return traits_type::eof(); + else if (!traits_type::eq_int_type(c, traits_type::eof())) + return this->sputc(c); + else + return traits_type::not_eof(c); + } + + + template <typename C, typename T> + int + basic_pstreambuf<C,T>::sync() + { + return !exited() && empty_buffer() ? 0 : -1; + } + + /** + * @param s character buffer. + * @param n buffer length. + * @return the number of characters written. + */ + template <typename C, typename T> + std::streamsize + basic_pstreambuf<C,T>::xsputn(const char_type* s, std::streamsize n) + { + std::streamsize done = 0; + while (done < n) + { + if (std::streamsize nbuf = this->epptr() - this->pptr()) + { + nbuf = std::min(nbuf, n - done); + traits_type::copy(this->pptr(), s + done, nbuf); + this->pbump(nbuf); + done += nbuf; + } + else if (!empty_buffer()) + break; + } + return done; + } + + /** + * @return true if the buffer was emptied, false otherwise. + */ + template <typename C, typename T> + bool + basic_pstreambuf<C,T>::empty_buffer() + { + const std::streamsize count = this->pptr() - this->pbase(); + if (count > 0) + { + const std::streamsize written = this->write(this->wbuffer_, count); + if (written > 0) + { + if (const std::streamsize unwritten = count - written) + traits_type::move(this->pbase(), this->pbase()+written, unwritten); + this->pbump(-written); + return true; + } + } + return false; + } + + /** + * Called when the internal character buffer is is empty, to re-fill it + * from the pipe. + * + * @return The first available character in the buffer, + * or @c traits_type::eof() in case of failure. + */ + template <typename C, typename T> + typename basic_pstreambuf<C,T>::int_type + basic_pstreambuf<C,T>::underflow() + { + if (this->gptr() < this->egptr() || fill_buffer()) + return traits_type::to_int_type(*this->gptr()); + else + return traits_type::eof(); + } + + /** + * Attempts to make @a c available as the next character to be read by + * @c sgetc(). + * + * @param c a character to make available for extraction. + * @return @a c if the character can be made available, + * @c traits_type::eof() otherwise. + */ + template <typename C, typename T> + typename basic_pstreambuf<C,T>::int_type + basic_pstreambuf<C,T>::pbackfail(int_type c) + { + if (this->gptr() != this->eback()) + { + this->gbump(-1); + if (!traits_type::eq_int_type(c, traits_type::eof())) + *this->gptr() = traits_type::to_char_type(c); + return traits_type::not_eof(c); + } + else + return traits_type::eof(); + } + + template <typename C, typename T> + std::streamsize + basic_pstreambuf<C,T>::showmanyc() + { + int avail = 0; + if (sizeof(char_type) == 1) + avail = fill_buffer(true) ? this->egptr() - this->gptr() : -1; +#ifdef FIONREAD + else + { + if (::ioctl(rpipe(), FIONREAD, &avail) == -1) + avail = -1; + else if (avail) + avail /= sizeof(char_type); + } +#endif + return std::streamsize(avail); + } + + /** + * @return true if the buffer was filled, false otherwise. + */ + template <typename C, typename T> + bool + basic_pstreambuf<C,T>::fill_buffer(bool non_blocking) + { + const std::streamsize pb1 = this->gptr() - this->eback(); + const std::streamsize pb2 = pbsz; + const std::streamsize npb = std::min(pb1, pb2); + + char_type* const rbuf = rbuffer(); + + if (npb) + traits_type::move(rbuf + pbsz - npb, this->gptr() - npb, npb); + + std::streamsize rc = -1; + + if (non_blocking) + { + const int flags = ::fcntl(rpipe(), F_GETFL); + if (flags != -1) + { + const bool blocking = !(flags & O_NONBLOCK); + if (blocking) + ::fcntl(rpipe(), F_SETFL, flags | O_NONBLOCK); // set non-blocking + + error_ = 0; + rc = read(rbuf + pbsz, bufsz - pbsz); + + if (rc == -1 && error_ == EAGAIN) // nothing available + rc = 0; + else if (rc == 0) // EOF + rc = -1; + + if (blocking) + ::fcntl(rpipe(), F_SETFL, flags); // restore + } + } + else + rc = read(rbuf + pbsz, bufsz - pbsz); + + if (rc > 0 || (rc == 0 && non_blocking)) + { + this->setg( rbuf + pbsz - npb, + rbuf + pbsz, + rbuf + pbsz + rc ); + return true; + } + else + { + this->setg(NULL, NULL, NULL); + return false; + } + } + + /** + * Writes up to @a n characters to the pipe from the buffer @a s. + * + * @param s character buffer. + * @param n buffer length. + * @return the number of characters written. + */ + template <typename C, typename T> + inline std::streamsize + basic_pstreambuf<C,T>::write(const char_type* s, std::streamsize n) + { + std::streamsize nwritten = 0; + if (wpipe() >= 0) + { + nwritten = ::write(wpipe(), s, n * sizeof(char_type)); + if (nwritten == -1) + error_ = errno; + else + nwritten /= sizeof(char_type); + } + return nwritten; + } + + /** + * Reads up to @a n characters from the pipe to the buffer @a s. + * + * @param s character buffer. + * @param n buffer length. + * @return the number of characters read. + */ + template <typename C, typename T> + inline std::streamsize + basic_pstreambuf<C,T>::read(char_type* s, std::streamsize n) + { + std::streamsize nread = 0; + if (rpipe() >= 0) + { + nread = ::read(rpipe(), s, n * sizeof(char_type)); + if (nread == -1) + error_ = errno; + else + nread /= sizeof(char_type); + } + return nread; + } + + /** @return a reference to the output file descriptor */ + template <typename C, typename T> + inline pstreams::fd_type& + basic_pstreambuf<C,T>::wpipe() + { + return wpipe_; + } + + /** @return a reference to the active input file descriptor */ + template <typename C, typename T> + inline pstreams::fd_type& + basic_pstreambuf<C,T>::rpipe() + { + return rpipe_[rsrc_]; + } + + /** @return a reference to the specified input file descriptor */ + template <typename C, typename T> + inline pstreams::fd_type& + basic_pstreambuf<C,T>::rpipe(buf_read_src which) + { + return rpipe_[which]; + } + + /** @return a pointer to the start of the active input buffer area. */ + template <typename C, typename T> + inline typename basic_pstreambuf<C,T>::char_type* + basic_pstreambuf<C,T>::rbuffer() + { + return rbuffer_[rsrc_]; + } + + + /* + * member definitions for pstream_common + */ + + /** + * @class pstream_common + * Abstract Base Class providing common functionality for basic_ipstream, + * basic_opstream and basic_pstream. + * pstream_common manages the basic_pstreambuf stream buffer that is used + * by the derived classes to initialise an iostream class. + */ + + /** Creates an uninitialised stream. */ + template <typename C, typename T> + inline + pstream_common<C,T>::pstream_common() + : std::basic_ios<C,T>(NULL) + , command_() + , buf_() + { + this->std::basic_ios<C,T>::rdbuf(&buf_); + } + + /** + * Initialises the stream buffer by calling + * do_open( @a command , @a mode ) + * + * @param cmd a string containing a shell command. + * @param mode the I/O mode to use when opening the pipe. + * @see do_open(const std::string&, pmode) + */ + template <typename C, typename T> + inline + pstream_common<C,T>::pstream_common(const std::string& cmd, pmode mode) + : std::basic_ios<C,T>(NULL) + , command_(cmd) + , buf_() + { + this->std::basic_ios<C,T>::rdbuf(&buf_); + do_open(cmd, mode); + } + + /** + * Initialises the stream buffer by calling + * do_open( @a file , @a argv , @a mode ) + * + * @param file a string containing the pathname of a program to execute. + * @param argv a vector of argument strings passed to the new program. + * @param mode the I/O mode to use when opening the pipe. + * @see do_open(const std::string&, const argv_type&, pmode) + */ + template <typename C, typename T> + inline + pstream_common<C,T>::pstream_common( const std::string& file, + const argv_type& argv, + pmode mode ) + : std::basic_ios<C,T>(NULL) + , command_(file) + , buf_() + { + this->std::basic_ios<C,T>::rdbuf(&buf_); + do_open(file, argv, mode); + } + + /** + * This is a pure virtual function to make @c pstream_common abstract. + * Because it is the destructor it will be called by derived classes + * and so must be defined. It is also protected, to discourage use of + * the PStreams classes through pointers or references to the base class. + * + * @sa If defining a pure virtual seems odd you should read + * http://www.gotw.ca/gotw/031.htm (and the rest of the site as well!) + */ + template <typename C, typename T> + inline + pstream_common<C,T>::~pstream_common() + { + } + + /** + * Calls rdbuf()->open( @a command , @a mode ) + * and sets @c failbit on error. + * + * @param cmd a string containing a shell command. + * @param mode the I/O mode to use when opening the pipe. + * @see basic_pstreambuf::open(const std::string&, pmode) + */ + template <typename C, typename T> + inline void + pstream_common<C,T>::do_open(const std::string& cmd, pmode mode) + { + if (!buf_.open((command_=cmd), mode)) + this->setstate(std::ios_base::failbit); + } + + /** + * Calls rdbuf()->open( @a file, @a argv, @a mode ) + * and sets @c failbit on error. + * + * @param file a string containing the pathname of a program to execute. + * @param argv a vector of argument strings passed to the new program. + * @param mode the I/O mode to use when opening the pipe. + * @see basic_pstreambuf::open(const std::string&, const argv_type&, pmode) + */ + template <typename C, typename T> + inline void + pstream_common<C,T>::do_open( const std::string& file, + const argv_type& argv, + pmode mode ) + { + if (!buf_.open((command_=file), argv, mode)) + this->setstate(std::ios_base::failbit); + } + + /** Calls rdbuf->close() and sets @c failbit on error. */ + template <typename C, typename T> + inline void + pstream_common<C,T>::close() + { + if (!buf_.close()) + this->setstate(std::ios_base::failbit); + } + + /** + * @return rdbuf()->is_open(). + * @see basic_pstreambuf::is_open() + */ + template <typename C, typename T> + inline bool + pstream_common<C,T>::is_open() const + { + return buf_.is_open(); + } + + /** @return a string containing the command used to initialise the stream. */ + template <typename C, typename T> + inline const std::string& + pstream_common<C,T>::command() const + { + return command_; + } + + /** @return a pointer to the private stream buffer member. */ + // TODO document behaviour if buffer replaced. + template <typename C, typename T> + inline typename pstream_common<C,T>::streambuf_type* + pstream_common<C,T>::rdbuf() const + { + return const_cast<streambuf_type*>(&buf_); + } + + +#if REDI_EVISCERATE_PSTREAMS + /** + * @def REDI_EVISCERATE_PSTREAMS + * If this macro has a non-zero value then certain internals of the + * @c basic_pstreambuf template class are exposed. In general this is + * a Bad Thing, as the internal implementation is largely undocumented + * and may be subject to change at any time, so this feature is only + * provided because it might make PStreams useful in situations where + * it is necessary to do Bad Things. + */ + + /** + * @warning This function exposes the internals of the stream buffer and + * should be used with caution. It is the caller's responsibility + * to flush streams etc. in order to clear any buffered data. + * The POSIX.1 function <b>fdopen</b>(3) is used to obtain the + * @c FILE pointers from the streambuf's private file descriptor + * members so consult your system's documentation for + * <b>fdopen</b>(3). + * + * @param in A FILE* that will refer to the process' stdin. + * @param out A FILE* that will refer to the process' stdout. + * @param err A FILE* that will refer to the process' stderr. + * @return An OR of zero or more of @c pstdin, @c pstdout, @c pstderr. + * + * For each open stream shared with the child process a @c FILE* is + * obtained and assigned to the corresponding parameter. For closed + * streams @c NULL is assigned to the parameter. + * The return value can be tested to see which parameters should be + * @c !NULL by masking with the corresponding @c pmode value. + * + * @see <b>fdopen</b>(3) + */ + template <typename C, typename T> + std::size_t + basic_pstreambuf<C,T>::fopen(FILE*& in, FILE*& out, FILE*& err) + { + in = out = err = NULL; + std::size_t open_files = 0; + if (wpipe() > -1) + { + if ((in = ::fdopen(wpipe(), "w"))) + { + open_files |= pstdin; + } + } + if (rpipe(rsrc_out) > -1) + { + if ((out = ::fdopen(rpipe(rsrc_out), "r"))) + { + open_files |= pstdout; + } + } + if (rpipe(rsrc_err) > -1) + { + if ((err = ::fdopen(rpipe(rsrc_err), "r"))) + { + open_files |= pstderr; + } + } + return open_files; + } + + /** + * @warning This function exposes the internals of the stream buffer and + * should be used with caution. + * + * @param in A FILE* that will refer to the process' stdin. + * @param out A FILE* that will refer to the process' stdout. + * @param err A FILE* that will refer to the process' stderr. + * @return A bitwise-or of zero or more of @c pstdin, @c pstdout, @c pstderr. + * @see basic_pstreambuf::fopen() + */ + template <typename C, typename T> + inline std::size_t + pstream_common<C,T>::fopen(FILE*& fin, FILE*& fout, FILE*& ferr) + { + return buf_.fopen(fin, fout, ferr); + } + +#endif // REDI_EVISCERATE_PSTREAMS + + +} // namespace redi + +/** + * @mainpage PStreams Reference + * @htmlinclude mainpage.html + */ + +#endif // REDI_PSTREAM_H_SEEN + +// vim: ts=2 sw=2 expandtab + diff --git a/modules/bindings/src/tmalign/readme.txt b/modules/bindings/src/tmalign/readme.txt new file mode 100644 index 000000000..ea276da42 --- /dev/null +++ b/modules/bindings/src/tmalign/readme.txt @@ -0,0 +1,87 @@ +============================================================================== + TM-align: protein and RNA structure alignment by TM-score superposition. + + This program was written by (in reverse chronological order) + Chengxin Zhang, Sha Gong, Jianjie Wu, and Jianyi Yang + at Yang Zhang lab, Department of Computational Medicine and Bioinformatics, + University of Michigan, 100 Washtenaw Ave, Ann Arbor, MI 48109-2218. + Please report issues to yangzhanglab@umich.edu + + References to cite: + S Gong, C Zhang, Y Zhang. Bioinformatics (2019) + Y Zhang, J Skolnick. Nucl Acids Res 33, 2302-9 (2005) + + DISCLAIMER: + Permission to use, copy, modify, and distribute this program for + any purpose, with or without fee, is hereby granted, provided that + the notices on the head, the reference information, and this + copyright notice appear in all copies or substantial portions of + the Software. It is provided "as is" without express or implied + warranty. + + *************** updating history ******************************** + 2012/01/24: A C/C++ code of TM-align was constructed by J Yang + 2016/05/21: Several updates of this program were made by J Wu, including + (1) fixed several compiling bugs + (2) made I/O of C/C++ version consistent with the Fortran version + (3) added outputs including full-atom and ligand structures + (4) added options of '-i', '-I' and '-m' + 2016/05/25: fixed a bug on PDB file reading + 2018/06/04: Several updates were made by C Zhang, including + (1) Fixed bug in reading PDB files with negative residue index, + at the expense of the '-o' option now only being able to + output superposed structure instead of full rasmol script. + (2) Implemented the fTM-align algorithm (by the '-fast' option) + as described in R Dong, S Pan, Z Peng, Y Zhang, J Yang + (2018) Nucleic acids research. gky430. + (3) Included option to perform TM-align against a whole + folder of PDB files. A full list of options not available + in the Fortran version can be explored by TMalign -h + 2018/07/27: Added the -byresi option for TM-score superposition without + re-alignment as in TMscore and TMscore -c + 2018/08/07: Added the -dir option + 2018/08/14: Added the -split option + 2018/08/16: Added the -infmt1, -infmt2 options. + TMalign can now read .gz and .bz2 compressed files. + 2018/10/20: C Zhang and S Gong updated the RNA alignment part of + the program. Changes include: + (1) new d0 calculation for RNA. + (2) secondary structure assignment for RNA. + (3) automatic detection of molecule type (protein vs RNA). + 2019/01/07: C Zhang added support for PDBx/mmCIF format. + 2019/02/09: Fixed asymmetric alignment bug. +=============================================================================== + +========================= + How to install TM-align +========================= +To compile the program in your Linux computer, simply enter + + make + +or + + g++ -static -O3 -ffast-math -lm -o TMalign TMalign.cpp + +The '-static' flag should be removed on Mac OS, which does not support +building static executables. + +===================== + How to use TM-align +===================== +You can run the program without arguments to obtain a brief instruction + + ./TMalign structure1.pdb structure2.pdb + +=================== + Fortran version +=================== +You can download the fortran version of TM-align from +https://zhanglab.ccmb.med.umich.edu/TM-align/ + +This C++ version of TM-align implemented several features not available in the +fortran version, including RNA alignment and batch alignment of multiple +structures. A full list of available options can be explored by: + ./TMalign -h + +02/09/2019 diff --git a/modules/bindings/src/tmalign/se.cpp b/modules/bindings/src/tmalign/se.cpp new file mode 100644 index 000000000..aa22b07f7 --- /dev/null +++ b/modules/bindings/src/tmalign/se.cpp @@ -0,0 +1,442 @@ +#include "se.h" + +using namespace std; + +void print_extra_help() +{ + cout << +"Additional options: \n" +" -dir Perform all-against-all alignment extraction among the list\n" +" of PDB chains listed by 'chain_list' under 'chain_folder'.\n" +" Note that the slash is necessary.\n" +" $ se -dir chain1_folder/ chain_list\n" +"\n" +" -dir1 Use chain2 to perform alignment extraction from a list of\n" +" PDB chains listed by 'chain1_list' under 'chain1_folder'.\n" +" Note that the slash is necessary.\n" +" $ se -dir1 chain1_folder/ chain1_list chain2\n" +"\n" +" -dir2 Use chain2 to perform alignment extraction from a list of\n" +" PDB chains listed by 'chain2_list' under 'chain2_folder'\n" +" $ se chain1 -dir2 chain2_folder/ chain2_list\n" +"\n" +" -suffix (Only when -dir1 and/or -dir2 are set, default is empty)\n" +" add file name suffix to files listed by chain1_list or chain2_list\n" +"\n" +" -atom 4-character atom name used to represent a residue.\n" +" Default is \" C3'\" for RNA/DNA and \" CA \" for proteins\n" +" (note the spaces before and after CA).\n" +"\n" +" -mol Molecule type: RNA or protein\n" +" Default is detect molecule type automatically\n" +"\n" +" -ter Strings to mark the end of a chain\n" +" 3: (default) TER, ENDMDL, END or different chain ID\n" +" 2: ENDMDL, END, or different chain ID\n" +" 1: ENDMDL or END\n" +" 0: (default in the first C++ TMalign) end of file\n" +"\n" +" -split Whether to split PDB file into multiple chains\n" +" 0: (default) treat the whole structure as one single chain\n" +" 1: treat each MODEL as a separate chain (-ter should be 0)\n" +" 2: treat each chain as a seperate chain (-ter should be <=1)\n" +"\n" +" -outfmt Output format\n" +" 0: (default) full output\n" +" 1: fasta format compact output\n" +" 2: tabular format very compact output\n" +"\n" +" -byresi Whether to align two structures by residue index.\n" +" 0: (default) do not align by residue index\n" +" 1: (same as TMscore program) align by residue index\n" +" 2: (same as TMscore -c, should be used with -ter <=1)\n" +" align by residue index and chain ID\n" +" 3: (similar to TMscore -c, should be used with -ter <=1)\n" +" align by residue index and order of chain\n" +"\n" +" -infmt1 Input format for chain1\n" +" -infmt2 Input format for chain2\n" +" -1: (default) automatically detect PDB or PDBx/mmCIF format\n" +" 0: PDB format\n" +" 1: SPICKER format\n" +" 2: xyz format\n" +" 3: PDBx/mmCIF format\n" + <<endl; +} + +void print_help(bool h_opt=false) +{ + cout << +"Extract sequence alignment from a pair of superposed structures.\n" +"\n" +"Usage: se PDB1.pdb PDB2.pdb [Options]\n" +"\n" +"Options:\n" +" -u TM-score normalized by user assigned length (the same as -L)\n" +" warning: it should be >= minimum length of the two structures\n" +" otherwise, TM-score may be >1\n" +"\n" +" -a TM-score normalized by the average length of two structures\n" +" T or F, (default F)\n" +"\n" +" -i (Same as -I) use alignment specified in fasta file 'align.txt'\n" +"\n" +" -d TM-score scaled by an assigned d0, e.g. 5 Angstroms\n" +"\n" +" -h Print the full help message.\n" +"\n" +" (Options -u, -a, -d won't change the final structure alignment)\n" +"\n" +"Example usages:\n" +" se PDB1.pdb PDB2.pdb\n" +" se PDB1.pdb PDB2.pdb -u 100 -d 5.0 -a T\n" +" se PDB1.pdb PDB2.pdb -i align.txt\n" + <<endl; + + if (h_opt) print_extra_help(); + + exit(EXIT_SUCCESS); +} + +int main(int argc, char *argv[]) +{ + if (argc < 2) print_help(); + + /**********************/ + /* get argument */ + /**********************/ + string xname = ""; + string yname = ""; + string fname_lign = ""; // file name for user alignment + vector<string> sequence; // get value from alignment file + double Lnorm_ass, d0_scale; + + bool h_opt = false; // print full help message + bool i_opt = false; // flag for -i, stick to user given alignment + bool a_opt = false; // flag for -a, normalized by average length + bool u_opt = false; // flag for -u, normalized by user specified length + bool d_opt = false; // flag for -d, user specified d0 + + int infmt1_opt=-1; // PDB or PDBx/mmCIF format for chain_1 + int infmt2_opt=-1; // PDB or PDBx/mmCIF format for chain_2 + int ter_opt =3; // TER, END, or different chainID + int split_opt =0; // do not split chain + int outfmt_opt=0; // set -outfmt to full output + string atom_opt ="auto";// use C alpha atom for protein and C3' for RNA + string mol_opt ="auto";// auto-detect the molecule type as protein/RNA + string suffix_opt=""; // set -suffix to empty + string dir_opt =""; // set -dir to empty + string dir1_opt =""; // set -dir1 to empty + string dir2_opt =""; // set -dir2 to empty + int byresi_opt=0; // set -byresi to 0 + vector<string> chain1_list; // only when -dir1 is set + vector<string> chain2_list; // only when -dir2 is set + + for(int i = 1; i < argc; i++) + { + if ( (!strcmp(argv[i],"-u") || + !strcmp(argv[i],"-L")) && i < (argc-1) ) + { + Lnorm_ass = atof(argv[i + 1]); u_opt = true; i++; + } + else if ( !strcmp(argv[i],"-a") && i < (argc-1) ) + { + if (!strcmp(argv[i + 1], "T")) a_opt=true; + else if (!strcmp(argv[i + 1], "F")) a_opt=false; + else PrintErrorAndQuit("Wrong value for option -a! It should be T or F"); + i++; + } + else if ( !strcmp(argv[i],"-d") && i < (argc-1) ) + { + d0_scale = atof(argv[i + 1]); d_opt = true; i++; + } + else if ( !strcmp(argv[i],"-h") ) + { + h_opt = true; + } + else if ((!strcmp(argv[i],"-i")||!strcmp(argv[i],"-I")) && i<(argc-1)) + { + fname_lign = argv[i + 1]; i_opt = true; i++; + } + else if ( !strcmp(argv[i],"-infmt1") && i < (argc-1) ) + { + infmt1_opt=atoi(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-infmt2") && i < (argc-1) ) + { + infmt2_opt=atoi(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-ter") && i < (argc-1) ) + { + ter_opt=atoi(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-split") && i < (argc-1) ) + { + split_opt=atoi(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-atom") && i < (argc-1) ) + { + atom_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-mol") && i < (argc-1) ) + { + mol_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-dir") && i < (argc-1) ) + { + dir_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-dir1") && i < (argc-1) ) + { + dir1_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-dir2") && i < (argc-1) ) + { + dir2_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-suffix") && i < (argc-1) ) + { + suffix_opt=argv[i + 1]; i++; + } + else if ( !strcmp(argv[i],"-outfmt") && i < (argc-1) ) + { + outfmt_opt=atoi(argv[i + 1]); i++; + } + else if ( !strcmp(argv[i],"-byresi") && i < (argc-1) ) + { + byresi_opt=atoi(argv[i + 1]); i++; + } + else if (xname.size() == 0) xname=argv[i]; + else if (yname.size() == 0) yname=argv[i]; + else PrintErrorAndQuit(string("ERROR! Undefined option ")+argv[i]); + } + + if(xname.size()==0 || (yname.size()==0 && dir_opt.size()==0) || + (yname.size() && dir_opt.size())) + { + if (h_opt) print_help(h_opt); + if (xname.size()==0) + PrintErrorAndQuit("Please provide input structures"); + else if (yname.size()==0 && dir_opt.size()==0) + PrintErrorAndQuit("Please provide structure B"); + else if (yname.size() && dir_opt.size()) + PrintErrorAndQuit("Please provide only one file name if -dir is set"); + } + + if (suffix_opt.size() && dir_opt.size()+dir1_opt.size()+dir2_opt.size()==0) + PrintErrorAndQuit("-suffix is only valid if -dir1 or -dir2 is set"); + if (dir_opt.size() && (dir1_opt.size() || dir2_opt.size())) + PrintErrorAndQuit("-dir cannot be set with -dir1 or -dir2"); + if (atom_opt.size()!=4) + PrintErrorAndQuit("ERROR! atom name must have 4 characters, including space."); + if (mol_opt!="auto" && mol_opt!="protein" && mol_opt!="RNA") + PrintErrorAndQuit("ERROR! molecule type must be either RNA or protein."); + else if (mol_opt=="protein" && atom_opt=="auto") + atom_opt=" CA "; + else if (mol_opt=="RNA" && atom_opt=="auto") + atom_opt=" C3'"; + if (u_opt && Lnorm_ass<=0) + PrintErrorAndQuit("Wrong value for option -u! It should be >0"); + if (d_opt && d0_scale<=0) + PrintErrorAndQuit("Wrong value for option -d! It should be >0"); + if (outfmt_opt>=2 && (a_opt || u_opt || d_opt)) + PrintErrorAndQuit("-outfmt 2 cannot be used with -a, -u, -L, -d"); + if (byresi_opt!=0) + { + if (i_opt) + PrintErrorAndQuit("-byresi >=1 cannot be used with -i or -I"); + if (byresi_opt<0 || byresi_opt>3) + PrintErrorAndQuit("-byresi can only be 0, 1, 2 or 3"); + if (byresi_opt>=2 && ter_opt>=2) + PrintErrorAndQuit("-byresi >=2 should be used with -ter <=1"); + } + if (split_opt==1 && ter_opt!=0) + PrintErrorAndQuit("-split 1 should be used with -ter 0"); + else if (split_opt==2 && ter_opt!=0 && ter_opt!=1) + PrintErrorAndQuit("-split 2 should be used with -ter 0 or 1"); + if (split_opt<0 || split_opt>2) + PrintErrorAndQuit("-split can only be 0, 1 or 2"); + + /* read initial alignment file from 'align.txt' */ + if (i_opt) read_user_alignment(sequence, fname_lign, false); + + if (byresi_opt) i_opt=true; + + /* parse file list */ + if (dir1_opt.size()+dir_opt.size()==0) chain1_list.push_back(xname); + else file2chainlist(chain1_list, xname, dir_opt+dir1_opt, suffix_opt); + + if (dir_opt.size()) + for (int i=0;i<chain1_list.size();i++) + chain2_list.push_back(chain1_list[i]); + else if (dir2_opt.size()==0) chain2_list.push_back(yname); + else file2chainlist(chain2_list, yname, dir2_opt, suffix_opt); + + if (outfmt_opt==2) + cout<<"#PDBchain1\tPDBchain2\tTM1\tTM2\t" + <<"RMSD\tID1\tID2\tIDali\tL1\tL2\tLali"<<endl; + + /* declare previously global variables */ + vector<vector<string> >PDB_lines1; // text of chain1 + vector<vector<string> >PDB_lines2; // text of chain2 + vector<int> mol_vec1; // molecule type of chain1, RNA if >0 + vector<int> mol_vec2; // molecule type of chain2, RNA if >0 + vector<string> chainID_list1; // list of chainID1 + vector<string> chainID_list2; // list of chainID2 + int i,j; // file index + int chain_i,chain_j; // chain index + int xlen, ylen; // chain length + int xchainnum,ychainnum;// number of chains in a PDB file + char *seqx, *seqy; // for the protein sequence + double **xa, **ya; // for input vectors xa[0...xlen-1][0..2] and + // ya[0...ylen-1][0..2], in general, + // ya is regarded as native structure + // --> superpose xa onto ya + vector<string> resi_vec1; // residue index for chain1 + vector<string> resi_vec2; // residue index for chain2 + double t0[3]={0,0,0}; + double u0[3][3]={{1,0,0},{0,1,0},{0,0,1}}; + + /* loop over file names */ + for (int i=0;i<chain1_list.size();i++) + { + /* parse chain 1 */ + xname=chain1_list[i]; + xchainnum=get_PDB_lines(xname, PDB_lines1, chainID_list1, + mol_vec1, ter_opt, infmt1_opt, atom_opt, split_opt); + if (!xchainnum) + { + cerr<<"Warning! Cannot parse file: "<<xname + <<". Chain number 0."<<endl; + continue; + } + for (int chain_i=0;chain_i<xchainnum;chain_i++) + { + xlen=PDB_lines1[chain_i].size(); + if (mol_opt=="RNA") mol_vec1[chain_i]=1; + else if (mol_opt=="protein") mol_vec1[chain_i]=-1; + if (!xlen) + { + cerr<<"Warning! Cannot parse file: "<<xname + <<". Chain length 0."<<endl; + continue; + } + NewArray(&xa, xlen, 3); + seqx = new char[xlen + 1]; + xlen = read_PDB(PDB_lines1[chain_i], xa, seqx, + resi_vec1, byresi_opt); + + for (int j=(dir_opt.size()>0)*(i+1);j<chain2_list.size();j++) + { + /* parse chain 2 */ + if (PDB_lines2.size()==0) + { + yname=chain2_list[j]; + ychainnum=get_PDB_lines(yname, PDB_lines2, chainID_list2, + mol_vec2, ter_opt, infmt2_opt, atom_opt, split_opt); + if (!ychainnum) + { + cerr<<"Warning! Cannot parse file: "<<yname + <<". Chain number 0."<<endl; + continue; + } + } + for (int chain_j=0;chain_j<ychainnum;chain_j++) + { + ylen=PDB_lines2[chain_j].size(); + if (mol_opt=="RNA") mol_vec2[chain_j]=1; + else if (mol_opt=="protein") mol_vec2[chain_j]=-1; + if (!ylen) + { + cerr<<"Warning! Cannot parse file: "<<yname + <<". Chain length 0."<<endl; + continue; + } + NewArray(&ya, ylen, 3); + seqy = new char[ylen + 1]; + ylen = read_PDB(PDB_lines2[chain_j], ya, seqy, + resi_vec2, byresi_opt); + + if (byresi_opt) extract_aln_from_resi(sequence, + seqx,seqy,resi_vec1,resi_vec2,byresi_opt); + + /* declare variable specific to this pair of TMalign */ + double TM1, TM2; + double TM3, TM4, TM5; // for a_opt, u_opt, d_opt + double d0_0, TM_0; + double d0A, d0B, d0u, d0a; + double d0_out=5.0; + string seqM, seqxA, seqyA;// for output alignment + double rmsd0 = 0.0; + int L_ali; // Aligned length in standard_TMscore + double Liden=0; + double TM_ali, rmsd_ali; // TMscore and rmsd in standard_TMscore + int n_ali=0; + int n_ali8=0; + + /* entry function for structure alignment */ + se_main( + xa, ya, seqx, seqy, TM1, TM2, TM3, TM4, TM5, + d0_0, TM_0, d0A, d0B, d0u, d0a, d0_out, + seqM, seqxA, seqyA, + rmsd0, L_ali, Liden, TM_ali, rmsd_ali, n_ali, n_ali8, + xlen, ylen, sequence, Lnorm_ass, d0_scale, + i_opt, a_opt, u_opt, d_opt, + mol_vec1[chain_i]+mol_vec2[chain_j]); + + /* print result */ + output_results( + xname.substr(dir1_opt.size()).c_str(), + yname.substr(dir2_opt.size()).c_str(), + chainID_list1[chain_i].c_str(), + chainID_list2[chain_j].c_str(), + xlen, ylen, t0, u0, TM1, TM2, + TM3, TM4, TM5, rmsd0, d0_out, + seqM.c_str(), seqxA.c_str(), seqyA.c_str(), Liden, + n_ali8, n_ali, L_ali, TM_ali, rmsd_ali, + TM_0, d0_0, d0A, d0B, + Lnorm_ass, d0_scale, d0a, d0u, + "", outfmt_opt, ter_opt, "", + false, false, a_opt, u_opt, d_opt); + + /* Done! Free memory */ + seqM.clear(); + seqxA.clear(); + seqyA.clear(); + DeleteArray(&ya, ylen); + delete [] seqy; + resi_vec2.clear(); + } // chain_j + if (chain2_list.size()>1) + { + yname.clear(); + for (int chain_j=0;chain_j<ychainnum;chain_j++) + PDB_lines2[chain_j].clear(); + PDB_lines2.clear(); + chainID_list2.clear(); + mol_vec2.clear(); + } + } // j + DeleteArray(&xa, xlen); + delete [] seqx; + resi_vec1.clear(); + } // chain_i + xname.clear(); + PDB_lines1.clear(); + chainID_list1.clear(); + mol_vec1.clear(); + } // i + if (chain2_list.size()==1) + { + yname.clear(); + for (int chain_j=0;chain_j<ychainnum;chain_j++) + PDB_lines2[chain_j].clear(); + PDB_lines2.clear(); + resi_vec2.clear(); + chainID_list2.clear(); + mol_vec2.clear(); + } + chain1_list.clear(); + chain2_list.clear(); + return 0; +} diff --git a/modules/bindings/src/tmalign/se.h b/modules/bindings/src/tmalign/se.h new file mode 100644 index 000000000..0021dd6d4 --- /dev/null +++ b/modules/bindings/src/tmalign/se.h @@ -0,0 +1,178 @@ +#include "TMalign.h" + +/* entry function for se */ +int se_main( + double **xa, double **ya, const char *seqx, const char *seqy, + double &TM1, double &TM2, double &TM3, double &TM4, double &TM5, + double &d0_0, double &TM_0, + double &d0A, double &d0B, double &d0u, double &d0a, double &d0_out, + string &seqM, string &seqxA, string &seqyA, + double &rmsd0, int &L_ali, double &Liden, + double &TM_ali, double &rmsd_ali, int &n_ali, int &n_ali8, + const int xlen, const int ylen, const vector<string> &sequence, + const double Lnorm_ass, const double d0_scale, const bool i_opt, + const bool a_opt, const bool u_opt, const bool d_opt, const int mol_type) +{ + double D0_MIN; //for d0 + double Lnorm; //normalization length + double score_d8,d0,d0_search,dcu0;//for TMscore search + double t[3]={0,0,0}; // dummy translation vection + double u[3][3]={{1,0,0},{0,1,0},{0,0,1}}; // dummy rotation matrix + double **score; // Input score table for dynamic programming + bool **path; // for dynamic programming + double **val; // for dynamic programming + + int *m1, *m2; + double d; + m1=new int[xlen]; //alignd index in x + m2=new int[ylen]; //alignd index in y + + /***********************/ + /* allocate memory */ + /***********************/ + int minlen = min(xlen, ylen); + NewArray(&score, xlen+1, ylen+1); + NewArray(&path, xlen+1, ylen+1); + NewArray(&val, xlen+1, ylen+1); + int *invmap = new int[ylen+1]; + for(int i=0; i<ylen; i++) invmap[i]=-1; + + /* set d0 */ + parameter_set4search(xlen, ylen, D0_MIN, Lnorm, + score_d8, d0, d0_search, dcu0); // set score_d8 + parameter_set4final(xlen, D0_MIN, Lnorm, + d0B, d0_search, mol_type); // set d0B + parameter_set4final(ylen, D0_MIN, Lnorm, + d0A, d0_search, mol_type); // set d0A + if (a_opt) + parameter_set4final((xlen+ylen)*0.5, D0_MIN, Lnorm, + d0a, d0_search, mol_type); // set d0a + if (u_opt) + parameter_set4final(Lnorm_ass, D0_MIN, Lnorm, + d0u, d0_search, mol_type); // set d0u + + /* perform alignment */ + if (!i_opt) + NWDP_TM(path, val, xa, ya, xlen, ylen, t, u, d0*d0, 0, invmap); + else + { + for (int j = 0; j < ylen; j++)// Set aligned position to be "-1" + invmap[j] = -1; + + int i1 = -1;// in C version, index starts from zero, not from one + int i2 = -1; + int L1 = sequence[0].size(); + int L2 = sequence[1].size(); + int L = min(L1, L2);// Get positions for aligned residues + for (int kk1 = 0; kk1 < L; kk1++) + { + if (sequence[0][kk1] != '-') i1++; + if (sequence[1][kk1] != '-') + { + i2++; + if (i2 >= ylen || i1 >= xlen) kk1 = L; + else if (sequence[0][kk1] != '-') invmap[i2] = i1; + } + } + } + + rmsd0=TM1=TM2=TM3=TM4=TM5=0; + int k=0; + for(int i=0,j=0; j<ylen; j++) + { + i=invmap[j]; + if(i>=0)//aligned + { + n_ali++; + d=sqrt(dist(&xa[i][0], &ya[j][0])); + if (d <= score_d8) + { + m1[k]=i; + m2[k]=j; + k++; + TM2+=1/(1+(d/d0B)*(d/d0B)); // chain_1 + TM1+=1/(1+(d/d0A)*(d/d0A)); // chain_2 + if (a_opt) TM3+=1/(1+(d/d0a)*(d/d0a)); // -a + if (u_opt) TM4+=1/(1+(d/d0u)*(d/d0u)); // -u + if (d_opt) TM5+=1/(1+(d/d0_scale)*(d/d0_scale)); // -d + rmsd0+=d*d; + } + } + } + n_ali8=k; + TM2/=xlen; + TM1/=ylen; + TM3/=(xlen+ylen)*0.5; + TM4/=Lnorm_ass; + TM5/=ylen; + if (n_ali8) rmsd0=sqrt(rmsd0/n_ali8); + + /* extract aligned sequence */ + int ali_len=xlen+ylen; //maximum length of alignment + seqxA.assign(ali_len,'-'); + seqM.assign( ali_len,' '); + seqyA.assign(ali_len,'-'); + + int kk=0, i_old=0, j_old=0; + d=0; + for(int k=0; k<n_ali8; k++) + { + for(int i=i_old; i<m1[k]; i++) + { + //align x to gap + seqxA[kk]=seqx[i]; + seqyA[kk]='-'; + seqM[kk]=' '; + kk++; + } + + for(int j=j_old; j<m2[k]; j++) + { + //align y to gap + seqxA[kk]='-'; + seqyA[kk]=seqy[j]; + seqM[kk]=' '; + kk++; + } + + seqxA[kk]=seqx[m1[k]]; + seqyA[kk]=seqy[m2[k]]; + Liden+=(seqxA[kk]==seqyA[kk]); + d=sqrt(dist(&xa[m1[k]][0], &ya[m2[k]][0])); + if(d<d0_out) seqM[kk]=':'; + else seqM[kk]='.'; + kk++; + i_old=m1[k]+1; + j_old=m2[k]+1; + } + + //tail + for(int i=i_old; i<xlen; i++) + { + //align x to gap + seqxA[kk]=seqx[i]; + seqyA[kk]='-'; + seqM[kk]=' '; + kk++; + } + for(int j=j_old; j<ylen; j++) + { + //align y to gap + seqxA[kk]='-'; + seqyA[kk]=seqy[j]; + seqM[kk]=' '; + kk++; + } + seqxA=seqxA.substr(0,kk); + seqyA=seqyA.substr(0,kk); + seqM =seqM.substr(0,kk); + + /* free memory */ + delete [] invmap; + delete [] m1; + delete [] m2; + DeleteArray(&score, xlen+1); + DeleteArray(&path, xlen+1); + DeleteArray(&val, xlen+1); + return 0; // zero for no exception +} diff --git a/modules/bindings/src/tmalign/xyz_sfetch.cpp b/modules/bindings/src/tmalign/xyz_sfetch.cpp new file mode 100644 index 000000000..5d413d5c5 --- /dev/null +++ b/modules/bindings/src/tmalign/xyz_sfetch.cpp @@ -0,0 +1,133 @@ +/* xyz_sfetch - index and fetch entries from multi-chain xyz file. + * The time of indexing operation scales linearly with the size of xyz + * file. Indexing is very fast (~2 s for PDB70 library with ~70000 entries). + * The time of fetching operation scales linearly with the length of + * entry list, but is almost unrelated to the size of xyz file. Therefore, + * this program is designed for fetch a small number of entries from a + * big xyz file. Fetching the whole PDB70 from PDB70 itself take ~0.5 min; + * fetching 1000 entries from PDB70 only takes 1~2 s */ +#include <iostream> +#include <fstream> +#include <cstdlib> +#include <vector> +#include <algorithm> + +using namespace std; + +void print_help() +{ + cout << +"Usage: xyz_sfetch ca.xyz\n" +" Index all entries in xyz file 'ca.xyz' into 'ca.xyz.index'.\n" +" Output file name inferred from input file name.\n" +"\n" +"Usage: xyz_sfetch ca.xyz list > subset.xyz\n" +" From xyz file 'ca.xyz' and respective index file 'ca.xyz.index',\n" +" fetch all entries listed by 'list'. Output them to 'subset.xyz'.\n" + <<endl; + exit(EXIT_SUCCESS); +} + +int main(int argc, char *argv[]) +{ + if (argc < 2) print_help(); + + /* get argument */ + string filename=""; + string list_opt=""; + + for(int i=1; i<argc; i++) + { + if (filename.size()==0) filename=argv[i]; + else list_opt=argv[i]; + } + + if(filename.size()==0||filename=="-h") print_help(); + if ((filename.size()>=3 && filename.substr(filename.size()-3,3)==".gz")|| + (filename.size()>=4 && filename.substr(filename.size()-4,4)==".bz2")) + { + cerr<<"ERROR! This program does not support .gz or .bz2 file"<<endl; + exit(EXIT_SUCCESS); + } + + ifstream fin(filename.c_str()); + + /* list all entries in xyz file */ + string line; + int L,i; + int start_pos,end_pos; // position of starting and ending character + if (list_opt.size()==0) + { + ofstream fp((filename+".index").c_str()); + while (fin.good()) + { + start_pos=fin.tellg(); + getline(fin, line); + L=atoi(line.c_str()); + getline(fin, line); + if (!fin.good()) break; + for(i=0;i<line.size();i++) if(line[i]==' '||line[i]=='\t') break; + cout<<line.substr(0,i)<<'\t'<<L<<endl; + fp<<line.substr(0,i)<<'\t'<<start_pos; + for (i=0;i<L;i++) getline(fin, line); + end_pos=fin.tellg(); + fp<<'\t'<<end_pos<<endl; + } + fin.close(); + fp.close(); + /* clean up */ + line.clear(); + filename.clear(); + list_opt.clear(); + return 0; + } + + /* read entry list */ + vector<string> chain_list; + ifstream fp(list_opt.c_str()); + while (fp.good()) + { + getline(fp, line); + for (i=0;i<line.size();i++) + if (line[i]==' '||line[i]=='\t') break; + if (line.size() && i) chain_list.push_back(line.substr(0,i)); + } + fp.close(); + + /* read xyz index */ + /* In xyz file, each line has 28 chacters plus an additional '\n'. In PDB + * file, a residue number has up to 4 digits, which means a PDB chain + * usually has up to 9999 residues. 29*9999 == 289971 < 300000 */ + fp.open((filename+".index").c_str()); + if (!fp.is_open()) + { + cerr<<"ERROR! No index file at "+filename+".index"<<endl; + cerr<<"Run the following command to create the index file:"<<endl; + cerr<<argv[0]<<" "<<filename<<endl; + exit(EXIT_SUCCESS); + } + char *buf=new char [300000]; + string chain; + while (fp.good()) + { + fp>>chain>>start_pos>>end_pos; + if (!fp.good()) break; + if (find(chain_list.begin(), chain_list.end(), + chain)==chain_list.end()) continue; + fin.seekg(start_pos); + fin.read(buf,end_pos-start_pos); + buf[end_pos-start_pos]=0; // ensures old text beyond this is ignored + cout<<buf; + } + fp.close(); + fin.close(); + + /* clean up */ + /* No need to flush, because any input from cin, output to cerr, or + * or program termination forces cout.flush() */ + delete[]buf; + filename.clear(); + list_opt.clear(); + chain_list.clear(); + return 0; +} diff --git a/modules/bindings/src/wrap_tmalign.cc b/modules/bindings/src/wrap_tmalign.cc new file mode 100644 index 000000000..7fe81be31 --- /dev/null +++ b/modules/bindings/src/wrap_tmalign.cc @@ -0,0 +1,191 @@ +//------------------------------------------------------------------------------ +// This file is part of the OpenStructure project <www.openstructure.org> +// +// Copyright (C) 2008-2019 by the OpenStructure authors +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License as published by the Free +// Software Foundation; either version 3.0 of the License, or (at your option) +// any later version. +// This library is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +// details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this library; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +//------------------------------------------------------------------------------ + +#include "tmalign/TMalign.h" // include for the external TMalign + +#include <ost/mol/atom_view.hh> +#include <ost/message.hh> +#include <ost/bindings/wrap_tmalign.hh> + +namespace ost{ namespace bindings{ + +TMAlignResult WrappedTMAlign(const geom::Vec3List& pos_one, + const geom::Vec3List& pos_two, + const ost::seq::SequenceHandle& seq1, + const ost::seq::SequenceHandle& seq2, + bool fast) { + + int xlen = pos_one.size(); + int ylen = pos_two.size(); + + if(xlen <= 5 || ylen <= 5) { + throw ost::Error("Input sequence to short!"); + } + + if(xlen != seq1.GetLength() || ylen != seq2.GetLength()) { + throw ost::Error("Positions and Sequence must have consistent size " + "to run TMAlign!"); + } + + // squeeze input into right format + char* seqx = new char[xlen+1]; + char* seqy = new char[ylen+1]; + seqx[xlen] = '\0'; + seqy[ylen] = '\0'; + int* secx = new int[xlen]; + int* secy = new int[ylen]; + + // use TMalign functionality to generate position arrays + double** xa; + double** ya; + NewArray(&xa, xlen, 3); + NewArray(&ya, ylen, 3); + + for(int i = 0; i < xlen; ++i) { + xa[i][0] = pos_one[i][0]; + xa[i][1] = pos_one[i][1]; + xa[i][2] = pos_one[i][2]; + seqx[i] = seq1[i]; + } + + for(int i = 0; i < ylen; ++i) { + ya[i][0] = pos_two[i][0]; + ya[i][1] = pos_two[i][1]; + ya[i][2] = pos_two[i][2]; + seqy[i] = seq2[i]; + } + + make_sec(xa, xlen, secx); + make_sec(ya, ylen, secy); + + // these variables are chosen such that running TMalign_main is the same as + // you would call the executable without any additional parameters + double Lnorm_ass = -1.0; + double d0_scale = -1.0; + bool u_opt = false; + bool d_opt = false; + int a_opt = 0; + std::vector<String> sequence; + bool i_opt = false; + bool I_opt = false; + double TMcut = -1; + + // following variables are copied from the TMAlign source code + double t0[3], u0[3][3]; + double TM1, TM2; + double TM3, TM4, TM5; // for a_opt, u_opt, d_opt + double d0_0, TM_0; + double d0A, d0B, d0u, d0a; + double d0_out=5.0; + String seqM, seqxA, seqyA;// for output alignment + double rmsd0 = 0.0; + int L_ali; // Aligned length in standard_TMscore + double Liden=0; + double TM_ali, rmsd_ali; // TMscore and rmsd in standard_TMscore + int n_ali=0; + int n_ali8=0; + + TMalign_main(xa, ya, seqx, seqy, secx, secy, t0, u0, TM1, TM2, TM3, TM4, TM5, + d0_0, TM_0, d0A, d0B, d0u, d0a, d0_out, seqM, seqxA, seqyA, + rmsd0, L_ali, Liden, TM_ali, rmsd_ali, n_ali, n_ali8, xlen, ylen, + sequence, Lnorm_ass, d0_scale, i_opt, I_opt, a_opt, u_opt, d_opt, + fast, 0, TMcut); + + // cleanup + DeleteArray(&xa, xlen); + DeleteArray(&ya, ylen); + delete [] seqx; + delete [] seqy; + delete [] secx; + delete [] secy; + + // collect results and return + TMAlignResult res; + res.tm_score = TM1; + res.rmsd = rmsd0; + res.aligned_length = n_ali8; + res.transform = geom::Mat4(u0[0][0], u0[0][1], u0[0][2], t0[0], + u0[1][0], u0[1][1], u0[1][2], t0[1], + u0[2][0], u0[2][1], u0[2][2], t0[2], + 0.0, 0.0, 0.0, 1.0); + res.alignment = ost::seq::CreateAlignment(); + ost::seq::SequenceHandle aligned_seq1 = ost::seq::CreateSequence("seq1", seqxA); + ost::seq::SequenceHandle aligned_seq2 = ost::seq::CreateSequence("seq2", seqyA); + res.alignment.AddSequence(aligned_seq1); + res.alignment.AddSequence(aligned_seq2); + return res; +} + + +TMAlignResult WrappedTMAlign(const ost::mol::ChainView& chain1, + const ost::mol::ChainView& chain2, + bool fast) { + + geom::Vec3List pos1; + geom::Vec3List pos2; + std::vector<char> s1; + std::vector<char> s2; + + ost::mol::ResidueViewList res_list_1 = chain1.GetResidueList(); + ost::mol::ResidueViewList res_list_2 = chain2.GetResidueList(); + + for(ost::mol::ResidueViewList::iterator it = res_list_1.begin(); + it != res_list_1.end(); ++it) { + if(!it->IsPeptideLinking()) { + continue; + } + ost::mol::AtomView ca = it->FindAtom("CA"); + if(!ca.IsValid()) { + continue; + } + char olc = it->GetOneLetterCode(); + if(olc == '?') { + continue; + } + pos1.push_back(ca.GetPos()); + s1.push_back(olc); + } + + for(ost::mol::ResidueViewList::iterator it = res_list_2.begin(); + it != res_list_2.end(); ++it) { + if(!it->IsPeptideLinking()) { + continue; + } + ost::mol::AtomView ca = it->FindAtom("CA"); + if(!ca.IsValid()) { + continue; + } + char olc = it->GetOneLetterCode(); + if(olc == '?') { + continue; + } + pos2.push_back(ca.GetPos()); + s2.push_back(olc); + } + + String str_s1(s1.begin(), s1.end()); + String str_s2(s2.begin(), s2.end()); + + ost::seq::SequenceHandle seq_s1 = ost::seq::CreateSequence("one", str_s1); + ost::seq::SequenceHandle seq_s2 = ost::seq::CreateSequence("two", str_s2); + + return WrappedTMAlign(pos1, pos2, seq_s1, seq_s2, fast); +} + +}} //ns diff --git a/modules/bindings/src/wrap_tmalign.hh b/modules/bindings/src/wrap_tmalign.hh new file mode 100644 index 000000000..124f51f05 --- /dev/null +++ b/modules/bindings/src/wrap_tmalign.hh @@ -0,0 +1,66 @@ +//------------------------------------------------------------------------------ +// This file is part of the OpenStructure project <www.openstructure.org> +// +// Copyright (C) 2008-2019 by the OpenStructure authors +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License as published by the Free +// Software Foundation; either version 3.0 of the License, or (at your option) +// any later version. +// This library is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +// details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this library; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +//------------------------------------------------------------------------------ +#ifndef OST_BINDINGS_TMALIGN_H +#define OST_BINDINGS_TMALIGN_H + +#include <ost/geom/mat4.hh> +#include <ost/geom/vec3.hh> +#include <ost/seq/alignment_handle.hh> +#include <ost/mol/chain_view.hh> +#include <ost/mol/chain_handle.hh> + +namespace ost { namespace bindings { + +struct TMAlignResult { + + TMAlignResult() { } + + TMAlignResult(Real rm, Real tm, int aln_l, const geom::Mat4& t, + const ost::seq::AlignmentHandle& aln): rmsd(rm), + tm_score(tm), + aligned_length(aln_l), + transform(t), + alignment(aln) { } + + + Real rmsd; + Real tm_score; + int aligned_length; + geom::Mat4 transform; + ost::seq::AlignmentHandle alignment; + + Real GetTMScore() { return tm_score; } + Real GetRMSD() { return rmsd; } + int GetAlignedLength() { return aligned_length; } + const geom::Mat4& GetTransform() { return transform; } + const ost::seq::AlignmentHandle& GetAlignment() { return alignment; } +}; + +TMAlignResult WrappedTMAlign(const geom::Vec3List& pos_one, + const geom::Vec3List& pos_two, + const ost::seq::SequenceHandle& seq1, + const ost::seq::SequenceHandle& seq2, + bool fast = false); + +TMAlignResult WrappedTMAlign(const ost::mol::ChainView& ent1, + const ost::mol::ChainView& ent2, + bool fast = false); +}} //ns + +#endif -- GitLab