diff --git a/DockerMakefiles/DockerMake.yml b/DockerMakefiles/DockerMake.yml index 58dca3f..bd3d4d0 100644 --- a/DockerMakefiles/DockerMake.yml +++ b/DockerMakefiles/DockerMake.yml @@ -114,11 +114,11 @@ deploy_requirements: python_deploy_base_py2: requires: - - miniconda + - miniconda_py2 - deploy_requirements python_deploy_base: requires: - - miniconda_py2 + - miniconda - deploy_requirements diff --git a/DockerMakefiles/NWChem.yml b/DockerMakefiles/NWChem.yml index de5826d..d6294d6 100644 --- a/DockerMakefiles/NWChem.yml +++ b/DockerMakefiles/NWChem.yml @@ -29,7 +29,7 @@ nwchem_build: build: | RUN apt-get install -y patch curl perl WORKDIR /opt - ENV NWCHEM_MODULES="nwdft driver stepper" \ + ENV NWCHEM_MODULES="nwdft driver stepper mm qmmm nwmd esp " \ PYTHONVERSION=2.7 \ PYTHONHOME="/usr" \ USE_PYTHONCONFIG=Y \ @@ -45,25 +45,32 @@ nwchem_build: && cd nwchem \ && svn co --depth empty https://svn.pnl.gov/svn/nwchem/trunk/src \ && cd src \ - && svn update GNUmakefile nwchem.F config \ - tools include basis geom inp input \ + && svn update GNUmakefile nwchem.F config mm qmmm nwmd \ + tools include basis geom inp input qhop fft cafe \ pstat rtdb task symmetry util peigs perfm bq cons blas lapack \ - NWints atomscf cphf ddscf driver gradients hessian nwdft optim property stepper symmetry vib \ + NWints atomscf cphf ddscf driver gradients hessian nwdft \ + optim property stepper symmetry vib space esp \ && rm -rf /opt/nwchem/.svn \ && cd tools \ && svn export --non-interactive --username nwchem --password nwchem \ https://svn.pnl.gov/svn/hpctools/branches/ga-5-5 \ && cd .. \ - #strip native compiler options as Fedora does && sed -i 's|-march=native||' config/makefile.h \ && sed -i 's|-mtune=native|-mtune=generic|' config/makefile.h \ && sed -i 's|-mfpmath=sse||' config/makefile.h \ - && sed -i 's|-msse3||' config/makefile.h \ - && make nwchem_config && make -j3 \ - #clean unnecessary source to reduce docker size - && rm -rf tce tools nwdft NWints geom symmetry util nwxc ddscf lapack blas rism \ - argos peigs rmdft gradients symmetry property smd lucia dplot propery \ - hessian ccsd mp2_grad moints cafe analyz dimqm /opt/nwchem/lib + && sed -i 's|-msse3||' config/makefile.h + + RUN cd /opt/nwchem/src \ + && make nwchem_config \ + && make -j 8 + + RUN mkdir nwchem/contrib \ + && cd nwchem/contrib \ + && svn co https://svn.pnl.gov/svn/nwchem/trunk/contrib/mov2asc \ + && cd mov2asc \ + && FC=gfortran make \ + && mv mov2asc asc2mov /opt/nwchem/bin/LINUX64 + RUN git clone https://github.com/NWChem-Python/nwapi \ && cd nwapi \ && make -f makefile.linux \ @@ -76,19 +83,62 @@ nwchem: description: Deployable NWChem image build_directory: buildfiles/nwchem/ requires: - - python_deploy_base + - python_deploy_base_py2 - nwchem_requirements build: | - COPY run.sh run.py getresults.py /usr/bin/ - RUN chmod +x /usr/bin/getresults.py /usr/bin/run.py /usr/bin/run.sh - RUN pip install pint + RUN pip install pint cclib ENV NWCHEMFILE="From https://svn.pnl.gov/svn/nwchem/trunk/src" - ENV PYTHONPATH=$PYTHONPATH:/opt + ENV PYTHONPATH=$PYTHONPATH:/opt/nwapi + COPY run.py runqmmm.py getresults.py /usr/local/bin/ + RUN chmod +x /usr/local/bin/getresults.py \ + /usr/local/bin/run.py \ + /usr/local/bin/runqmmm.py copy_from: nwchem_build: /usr/local/lib/python2.7/dist-packages: /usr/local/lib/python2.7/ /opt/nwchem: /opt /opt/lib: /opt - copy_from: + /opt/nwapi: /opt openblas: /opt/lib: /opt + +################################# +# Experimental QM/MM images below +nwchem_amber_qmmmm: + description: Image with Amber and NWChem for QM/MM + requires: + - nwchem + build: | + RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + gcc \ + gfortran \ + && cleanapt + copy_from: + amber_dev_branch_build: + /opt/amber16: /opt + /root/.bash_profile: /root + + +amber_dev_branch_build: + build_directory: buildfiles/nwchem + requires: + - buildbase + - ambertools_requirements + build: | + ADD amber-dev.tgz /opt + RUN apt-get install -y \ + flex \ + bison \ + csh \ + gfortran \ + g++ \ + make \ + patch \ + python-dev + WORKDIR /opt/amber16 + RUN echo N | ./configure -noX11 --with-python /usr/bin/python --with-netcdf /usr/ gnu \ + && make -j6 install \ + && rm -rf test AmberTools doc # reduce image size for copying to deployment image + RUN echo "test -f /opt/amber16/amber.sh && source /opt/amber16/amber.sh" >> /root/.bash_profile + diff --git a/DockerMakefiles/PythonTools.yml b/DockerMakefiles/PythonTools.yml index d798b66..5e69332 100644 --- a/DockerMakefiles/PythonTools.yml +++ b/DockerMakefiles/PythonTools.yml @@ -27,8 +27,11 @@ chem_python_conda: description: All of the external python chemistry libraries in one place build: | RUN conda install -qy -c openbabel openbabel=2.4.1 - RUN conda install -qy -c omnia biopython openmm parmed pdbfixer - + RUN conda install -qy -c omnia \ + biopython=1.68 \ + openmm=7.1.1 \ + parmed=2.7.3 \ + pdbfixer=1.4 chem_python_requirements: requires: diff --git a/DockerMakefiles/README.md b/DockerMakefiles/README.md index cac7410..ef9130c 100644 --- a/DockerMakefiles/README.md +++ b/DockerMakefiles/README.md @@ -1,21 +1,51 @@ # Docker images for MDT -The Molecular Design Toolkit uses a lot of functionality from other open source chemistry packages, such as molecular dynamics from OpenMM, Quantum chemistry from OpenMM, etc., etc. +The Molecular Design Toolkit does NOT implement molecular modeling algorithms - it instead provides an intuitive, general interface for running calculations with other open source chemistry packages, such as molecular dynamics from OpenMM, Quantum chemistry from PySCF, etc., etc. -To make these calculations 1) easy, 2) portable, and 3) reproducible, users don't need to compile any of these by themselves. Instead, they're provided as docker images, which (as of this writing) are freely available from a Dockerhub repository (see https://hub.docker.com/r/autodesk/moldesign/). Users probably won't need to pull the images manually - they'll be automatically pulled whenever they're needed. +To make these calculations 1) easy, 2) portable, and 3) reproducible, users don't need to compile any other software. Instead, external open source packages are provided as docker images, which MDT automatically downloads from a public [DockerHub repository](https://hub.docker.com/r/autodesk/moldesign/). +These images are built from definitions contained in the DockerMakefiles in this directory (everythign with a `.yml` extension). -# About the images +MDT relies on two types of dependencies: -`docker-make` is used to build and push the images to the public repositories. The Dockerfiles for all images are defined in the `DockerMake.yml` and its associates YAML sources in this directory. +1. CLI executables (e.g., NWChem, AmberTools utilities, etc.). CLI executables come in their own lightweight images. These images let you run the executables without compiling or installing them yourself. +2. Python libraries (OpenMM, PySCF, etc.). To interact with these, we build a rather large docker image named `moldesign_complete` that includes MDT _and_ all interfaced Python libraries. When MDT needs to use a Python library that isn't installed on your machine, it will run the necessary code in a `moldesign_complete` docker container instead. -If you're just *using* MDT, you'll be relying on the prebuilt MDT images hosted on [DockerHub](https://hub.docker.com/r/autodesk/moldesign/). However, if you are developing MDT, you may need to install docker-make by running `pip install dockermake>=0.5`. +# Development and building images -MDT relies on two types of dependencies: +**NOTE**: If you're just *using* MDT, you don't need to do this - MDT will automatically download the images hosted on [DockerHub](https://hub.docker.com/r/autodesk/moldesign/). + +##### Install DockerMake: +We use the `docker-make` command line utility to build and manage MDT's docker images. To install it: +```bash +pip install "DockerMake>=0.5.6" +``` + +##### Activate MDT "devmode": +To tell MDT to use your own, locally built docker images, run: +```bash +echo "devmode:true" >> ~/.moldesign/moldesign.yml +``` + +Use the following commands to build and manage the docker images. They should be run in this directory (`[...]/molecular-design-toolkit/DockerMakefiles`) + +##### List docker images: +```bash +docker-make --list +``` -1. CLI executables (e.g., ambertools utilities like antechamber, tleap). CLI executables come in their own lightweight images. -2. Python libraries (openmm, pyscf, etc.). To interact with these, we build a rather large docker image named "moldesign_complete" that includes both moldesign and all of its dependencies. This allows MDT to call functions from libraries that aren't installed on your machine! Instead, those function calls will be evaluated in the moldesign_complete docker image, and the results will be returned. +##### Build all docker images: +```bash +docker-make --tag dev --all +``` -In the future, we plan to isolate the python dependencies into smaller, lightweight installations that don't include MDT. This will require a common data format with translation layers for each dependency. +##### Build the MDT docker image for python 3: +```bash +docker-make --tag dev moldesign_complete +``` +##### Build the MDT docker image for python 2: +```bash +docker-make --tag dev moldesign_complete_py2 +``` diff --git a/DockerMakefiles/buildfiles/ambertools/runsander.py b/DockerMakefiles/buildfiles/ambertools/runsander.py new file mode 100644 index 0000000..a16aa44 --- /dev/null +++ b/DockerMakefiles/buildfiles/ambertools/runsander.py @@ -0,0 +1,254 @@ +#!/usr/bin/env python +""" +This script drives an NWChem calculation given a generic QM specification +""" +import json +import os +import pint + +ureg = pint.UnitRegistry() +ureg.define('bohr = a0 = hbar/(m_e * c * fine_structure_constant') + +""" + &cntrl + ntb=1, ! use PBC + imin=1, ! run minimization + ntmin=5 ! run steepest descent + maxcyc=10, ! minimize for 10 steps + ncyc=0, ! no switch to congugate gradient + cut=8.0, ! MM cutoff + ntc=2, ntf=2, ! SHAKE + ioutfmt=1 ! netcdf output + / +""" + +FILENAME_DEFAULTS = {x+"_file":x for x in "inpcrd mdcrd prmtop mdvel".split()} + +def run_calculation(parameters): + """ Drive the calculation, based on passed parameters + + Args: + parameters (dict): dictionary describing this run (see + https://github.com/Autodesk/molecular-design-toolkit/wiki/Generic-parameter-names ) + """ + for key, val in FILENAME_DEFAULTS: + parameters.setdefault(key, val) + + if parameters.get('num_processors', 1) > 1: + cmd = 'mpirun -n %d sander.MPI' % parameters['num_processors'] + else: + cmd = ('sander -i {inpcrd_file} -o {mdcrd_file} -p {prmtop_file} ' + '-v {mdvel_file} ').format(**parameters) + + os.system(cmd) + + +def write_inputs(parameters): + """ Write input files using passed parameters + + Args: + parameters (dict): dictionary describing this run (see + https://github.com/Autodesk/molecular-design-toolkit/wiki/Generic-parameter-names ) + """ + + # check that coordinates were passed + assert os.path.isfile('input.xyz'), 'Expecting input coordinates at input.xyz' + os.mkdir('./perm') + + inputs = _make_input_files(parameters) + for filename, contents in inputs.iteritems(): + with open(filename, 'w') as inputfile: + inputfile.write(contents) + + +def convert(q, units): + """ + Convert a javascript quantity description into a floating point number in the desired units + + Args: + q (dict): Quantity to convert (of form ``{value: , units: }`` ) + units (str): name of the units + + Returns: + float: value of the quantity in the passed unit system + + Raises: + pint.DimensionalityError: If the units are incompatible with the desired quantity + + Examples: + >>> q = {'value':1.0, 'units':'nm'} + >>> convert(q, 'angstrom') + 10.0 + """ + quantity = q['value'] * ureg(q['units']) + return quantity.value_in(units) + + +##### helper routines below ###### + +def _make_input_files(calc): + nwin = [_header(calc), + _geom_block(calc), + _basisblock(calc), + _chargeblock(calc), + _theoryblock(calc), + _otherblocks(calc), + _taskblock(calc)] + + return {'nw.in': '\n'.join(nwin)} + + +def _header(calc): + return '\nstart mol\n\npermanent_dir ./perm\n' + + +def _geom_block(calc): + lines = ['geometry units angstrom noautoz noautosym nocenter', + ' load format xyz input.xyz', + 'end'] + return '\n'.join(lines) + + +def _basisblock(calc): + return 'basis\n * library %s\nend' % calc['basis'] # TODO: translate names + + +def _theoryblock(calc): + lines = [_taskname(calc), + _multiplicityline(calc), + _theorylines(calc), + 'end' + ] + return '\n'.join(lines) + + +def _otherblocks(calc): + lines = [] + if calc['runType'] == 'minimization': + lines.append('driver\n xyz opt\n print high\n') + if 'minimization_steps' in calc: + lines.append('maxiter %d' % calc['minimization_steps']) + lines.append('end') + + return '\n'.join(lines) + + +TASKNAMES = {'rhf': 'scf', + 'uhf': 'scf', + 'rks': 'dft', + 'uks': 'dft'} + + +def _taskname(calc): + return TASKNAMES[calc['theory']] + + +SCFNAMES = {'rhf': 'rhf', + 'uhf': 'uhf', + 'rks': 'rhf', + 'uks': 'uhf'} + + +def _scfname(calc): + return SCFNAMES[calc['theory']] + + +def _taskblock(calc): + if calc['runType'] == 'minimization': + tasktype = 'optimize' + elif 'forces' in calc['properties']: + tasktype = 'gradient' + else: + tasktype = 'energy' + + return 'task %s %s' % (_taskname(calc), tasktype) + + +STATENAMES = {1: "SINGLET", + 2: "DOUBLET", + 3: "TRIPLET", + 4: "QUARTET", + 5: "QUINTET", + 6: "SEXTET", + 7: "SEPTET", + 8: "OCTET"} + + +def _multiplicityline(calc): + if calc['theory'] in ('rks', 'uks'): + return 'mult %s' % calc.get('multiplicity', 1) + else: + return STATENAMES[calc.get('multiplicity', 1)] + + +def _constraintblock(calc): + """ + Constraints / restraints are specified in JSON objects at calc.constraints and calc.restraints. + + "Constraints" describe a specific degree of freedom and its value. This value is expected to be + rigorously conserved by any dynamics or optimization algorithms. + + A "restraint", in constrast, is a harmonic restoring force applied to a degree of freedom. + Restraint forces should be added to the nuclear hamiltonian. A restraint's "value" is the + spring's equilibrium position. + + The list at calc['constraints'] has the form: + [{type: , + restraint: , + value: {value: , units: } + atomIdx0: ...} ...] + + For example, fixes atom constraints have the form: + {type: 'atomPosition', + restraint: False, + atomIdx: } + + Restraints are described similary, but include a spring constant (of the appropriate units): + {type: 'bond', + restraint: True, + atomIdx1: , + atomIdx2: , + springConstant: {value: , units: }, + value: {value: , units: }} + """ + clist = calc.get('constraints', None) + if clist is None: return + + lines = ['constraints'] + + for constraint in clist: + if constraint['type'] == 'position': + lines.append(' fix atom %d' % constraint['atomIdx']) + elif constraint['type'] == 'distance' and constraint['restraint']: + k = convert(constraint['springConstant'], 'hartree/(a0*a0)') + d0 = convert(constraint('value', 'a0')) + lines.append(' spring bond %d %d %20.10f %20.10f' % + (constraint['atomIdx1']+1, constraint['atomIdx2']+1, k, d0)) + else: + raise NotImplementedError('Constraint type %s (as restraint: %b) not implemented' % + (constraint['type'], constraint['restraint'])) + + lines.append('end') + + return '\n'.join(lines) + + + + +def _chargeblock(calc): + return '\ncharge %s\n' % calc.get('charge', 0) + + +def _theorylines(calc): + lines = ['direct'] + if _taskname(calc) == 'dft': + lines.append('XC %s' % calc['functional']) + return '\n'.join(lines) + + +if __name__ == '__main__': + with open('params.json','r') as pjson: + parameters = json.load(pjson) + + write_inputs(parameters) + run_calculation(parameters) diff --git a/DockerMakefiles/buildfiles/nwchem/getresults.py b/DockerMakefiles/buildfiles/nwchem/getresults.py index 4fda9e7..2b018bc 100644 --- a/DockerMakefiles/buildfiles/nwchem/getresults.py +++ b/DockerMakefiles/buildfiles/nwchem/getresults.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python2.7 """ This script extracts data from the NWChem DB and outputs it in a standardized JSON format. It uses Marat Valiev's simple API from https://github.com/nwchem-python/nwapi @@ -11,6 +11,9 @@ import json import os import nwchem +import numpy +import subprocess +import collections FORMAT = {'format': 'MolecularDesignInterchange', 'version': '0.8alpha'} @@ -36,14 +39,10 @@ def get_docker_image(): # TODO: do this properly def prep(): global _PROPERTYGROUP - nwchem.rtdb_open('perm/mol.db', 'old') - _PROPERTYGROUP = nwchem.rtdb_get('task:theory') - ##### Units ##### - def get_position_units(): return 'a0' @@ -89,24 +88,101 @@ def get_scftype(): else: return nwchem.rtdb_get('scf:scftype') -def get_basis(): +def get_basisname(): return nwchem.rtdb_get('basis:ao basis:star bas type') - ##### Molecular information ##### def get_symmetry(): return nwchem.rtdb_get('geometry:geometry:group name') def get_spin_multiplicity(): - return nwchem.rtdb_get('dft:mult') + try: + return nwchem.rtdb_get('dft:mult') + except SystemError: + return None + +def get_orbitals(): + # using https://github.com/jeffhammond/nwchem/blob/master/contrib/mov2asc/asc2mov.F + # as a format reference + _convert_movecs() + with open('./perm/mol.movecs.txt', 'r') as movfile: + lines = iter(movfile) + for i in xrange(10): + # reads: basissum, geomsum, bqsum, scftype20, date, scftype20, + # lentit, title, lenbas (length of the NAME, not basis length) + lines.next() + + basis_name = lines.next().strip() + nsets = int(lines.next().strip()) + nbf = int(lines.next().strip()) + + nmo = map(int, lines.next().split()) + assert len(nmo) == nsets + + orbital_sets = {} + + for iset, num_mo in enumerate(nmo): + orbset = {} + orbital_sets['canonical'] = orbset + + orbset['occupations'] = _read_float_fields(lines, num_mo) + orbset['energies'] = {'value':_read_float_fields(lines, num_mo), + 'units': get_energy_units()} + mymos = [] + for i in xrange(num_mo): + mymos.append(_read_float_fields(lines, nbf)) + orbset['coefficients'] = mymos + + return orbital_sets + +BasisFn = collections.namedtuple('BasisFn', 'atomidx shell coeff alpha') + + +SHELLS = {'s': 0, + 'p': 1, + 'd': 2, + 'f': 3, + 'g': 4} + +def get_aobasis_cartesian(): + cclibobj = _get_cclib_object() + basis_fns = [] + numbasis = 0 + for iatom, atombasis in enumerate(cclibobj.gbasis): + energylevels = {} + for shell in atombasis: + + shellname = shell[0] + if shellname not in energylevels: + energylevels[shellname] = 0 + energylevels[shellname] += 1 + + primitives = [] + for fn in shell[1]: + primitives.append({'alpha': fn[0], + 'coeff': fn[1]}) + l = SHELLS[shellname.lower()] + for m in xrange(-l, l+1): + basis_fns.append({'n': energylevels[shellname], + 'l': l, + 'powers': [m == i for i in xrange(3)], + 'atomIdx': iatom, + 'primitives': primitives, + 'type': 'cartesian', + 'name': cclobobj.aonames[numbasis]}) + numbasis += 1 + return basis_fns + def get_total_charge(): return int(nwchem.rtdb_get('charge')) + def get_positions(): return _reshape_atom_vector(nwchem.rtdb_get('geometry:geometry:coords')) + def get_atomic_numbers(): return map(int, nwchem.rtdb_get('geometry:geometry:charges')) @@ -117,7 +193,10 @@ def get_atom_names(): return nwchem.rtdb_get('geometry:geometry:tags') def get_functional(): - return nwchem.rtdb_get('dft:xc_spec') + try: + return nwchem.rtdb_get('dft:xc_spec') + except SystemError: + return None ##### Caculated quantities ##### @@ -129,13 +208,16 @@ def get_converged(): return 1 == nwchem.rtdb_get('%s:converged' % _PROPERTYGROUP) def get_dipole(): - return nwchem.rtdb_get('%s:dipole' % _PROPERTYGROUP) + try: + return nwchem.rtdb_get('%s:dipole' % _PROPERTYGROUP) + except SystemError: + return None def get_forces(): try: forces = nwchem.rtdb_get('%s:gradient' % _PROPERTYGROUP) return _reshape_atom_vector([-f for f in forces]) - except: + except SystemError: return None def get_potential_energy(): @@ -148,7 +230,7 @@ def get_potential_energy(): ################################# helper functions below ########################### def _reshape_atom_vector(v): assert len(v) % 3 == 0 - return [v[i:i+3] for i in xrange(0,len(v), 3)] + return [v[i:i+3] for i in xrange(0, len(v), 3)] def _get_method_description(): @@ -156,25 +238,48 @@ def _get_method_description(): 'package': {'name': get_package_name(), 'version': get_package_version(), 'citation': get_package_citation()}, - 'basis': get_basis(), + 'basis': get_basisname(), 'scf': get_scftype(), - 'theory': get_theory()} + 'theory': get_theory(), + #'aobasis': get_aobasis_cartesian() + } if result['theory'] == 'dft': result['functional'] = get_functional() return result + def _get_calculated_properties(): props = {'method': _get_method_description()} _insert_if_present(props, 'dipole', get_dipole(), get_dipole_units()) _insert_if_present(props, 'forces', get_forces(), get_force_units()) _insert_if_present(props, 'potential_energy', get_potential_energy(), get_energy_units()) + props['orbitals'] = get_orbitals() return props +def _read_float_fields(lineiter, numfields): + fields = [] + while len(fields) < numfields: + fields.extend(map(float, lineiter.next().split())) + assert len(fields) == numfields + return fields + + +def _convert_movecs(): + try: + subprocess.check_call('mov2asc 1000 mol.movecs mol.movecs.txt'.split(), + cwd='./perm/') + except subprocess.CalledProcessError as exc: + fields = exc.output.strip() + assert fields[:7] == 'Guessed too small for NBF. Actual is'.split() + subprocess.check_call(('mov2asc %d mol.movecs mol.movecs.txt' % int(fields[7])).split(), + cwd='./perm/') + + def _insert_if_present(d, key, val, unitval=None): if val is not None: if unitval is None: @@ -192,7 +297,7 @@ def _main(): 'charge': get_total_charge(), 'spin_multiplicity': get_spin_multiplicity(), - 'symmetry': get_symmetry() + 'symmetry': get_symmetry(), } topology = {'atomArray': @@ -210,5 +315,11 @@ def _main(): json.dump(result, outfile) +def _get_cclib_object(): + import cclib + data = cclib.parser.NWChem('nw.out').parse() + return data + + if __name__ == '__main__': - _main() + _main() \ No newline at end of file diff --git a/DockerMakefiles/buildfiles/nwchem/run.py b/DockerMakefiles/buildfiles/nwchem/run.py index b1d5319..817ed3e 100644 --- a/DockerMakefiles/buildfiles/nwchem/run.py +++ b/DockerMakefiles/buildfiles/nwchem/run.py @@ -10,38 +10,6 @@ ureg.define('bohr = a0 = hbar/(m_e * c * fine_structure_constant') -def run_calculation(parameters): - """ Drive the calculation, based on passed parameters - - Args: - parameters (dict): dictionary describing this run (see - https://github.com/Autodesk/molecular-design-toolkit/wiki/Generic-parameter-names ) - """ - cmd = 'nwchem nw.in > nw.out' - if 'num_processors' in parameters: - cmd += 'mpirun -n %d' % parameters['num_processors'] - - os.system(cmd) - - -def write_inputs(parameters): - """ Write input files using passed parameters - - Args: - parameters (dict): dictionary describing this run (see - https://github.com/Autodesk/molecular-design-toolkit/wiki/Generic-parameter-names ) - """ - - # check that coordinates were passed - assert os.path.isfile('input.xyz'), 'Expecting input coordinates at input.xyz' - os.mkdir('./perm') - - inputs = _make_input_files(parameters) - for filename, contents in inputs.iteritems(): - with open(filename, 'w') as inputfile: - inputfile.write(contents) - - def convert(q, units): """ Convert a javascript quantity description into a floating point number in the desired units @@ -61,177 +29,214 @@ def convert(q, units): >>> convert(q, 'angstrom') 10.0 """ - quantity = q['value'] * ureg(q['units']) + quantity = q['value']*ureg(q['units']) return quantity.m_as(units) +class QMRunner(object): + + def __init__(self, parameters): + self.parameters = parameters + + def run_calculation(self): + """ Drive the calculation, based on passed parameters + + Args: + parameters (dict): dictionary describing this run (see + https://github.com/Autodesk/molecular-design-toolkit/wiki/Generic-parameter-names ) + """ + cmd = 'nwchem nw.in > nw.out' + if 'num_processors' in self.parameters: + cmd += 'mpirun -n %d' % self.parameters['num_processors'] + + os.system(cmd) + + def write_inputs(self): + """ Write input files using passed parameters + + Args: + parameters (dict): dictionary describing this run (see + https://github.com/Autodesk/molecular-design-toolkit/wiki/Generic-parameter-names ) + """ + os.mkdir('./perm') + inputs = self._make_input_files() + for filename, contents in inputs.iteritems(): + with open(filename, 'w') as inputfile: + inputfile.write(contents) + + + ##### helper routines below ###### + def _make_input_files(self): + nwin = [self._header(), + self._geom_block(), + self._basisblock(), + self._chargeblock(), + self._scfblock(), + self._otherblocks(), + self._taskblock()] + + return {'nw.in': '\n'.join(nwin)} + + def _header(self): + return '\nstart mol\n\npermanent_dir ./perm\nprint medium\n' + + def _geom_block(self): + if not os.path.isfile('input.xyz'): + raise IOError('Expecting input coordinates at input.xyz') + lines = ['geometry units angstrom noautoz noautosym nocenter', + ' load format xyz input.xyz', + 'end'] + return '\n'.join(lines) + + def _basisblock(self): + return 'basis\n * library %s\nend' % self.parameters['basis'] # TODO: translate names + + def _scfblock(self): + lines = [self.SCFTYPES[self.parameters['theory']], + self._multiplicityline(), + self._theorylines(), + 'end' + ] + return '\n'.join(lines) + + def _otherblocks(self): + lines = [] + if self.parameters['runType'] == 'minimization': + lines.append('driver\n xyz opt\n print high\n') + if 'minimization_steps' in self.parameters: + lines.append('maxiter %d' % self.parameters['minimization_steps']) + lines.append('end\n') + + if 'esp' in self.parameters['properties']: + lines.append(self._espblock()) + + return '\n'.join(lines) + + SCFTYPES = {'rhf': 'scf', + 'uhf': 'scf', + 'rks': 'dft', + 'uks': 'dft', + 'mp2': 'scf'} # TODO: Not sure if true!!! How do we use DFT reference? + + SCFNAMES = {'rhf': 'rhf', + 'uhf': 'uhf', + 'rks': 'rhf', + 'uks': 'uhf', + 'mp2': 'rhf'} + + TASKNAMES = {'rhf': 'scf', + 'uhf': 'scf', + 'rks': 'dft', + 'uks': 'dft', + 'mp2': 'mp2'} + + def _scfname(self): + return self.SCFNAMES[self.parameters['theory']] + + def _taskblock(self): + if self.parameters['runType'] == 'minimization': + tasktype = 'optimize' + elif 'forces' in self.parameters['properties']: + tasktype = 'gradient' + else: + tasktype = 'energy' + + return 'task %s %s' % (self.TASKNAMES[self.parameters['theory']], tasktype) + + STATENAMES = {1: "SINGLET", + 2: "DOUBLET", + 3: "TRIPLET", + 4: "QUARTET", + 5: "QUINTET", + 6: "SEXTET", + 7: "SEPTET", + 8: "OCTET"} + + def _multiplicityline(self): + if self.parameters['theory'] in ('rks', 'uks'): + return 'mult %s' % self.parameters.get('multiplicity', 1) + else: + return self.STATENAMES[self.parameters.get('multiplicity', 1)] + + def _constraintblock(self): + """ + Constraints / restraints are specified in JSON objects at calc.constraints and calc.restraints. + + "Constraints" describe a specific degree of freedom and its value. This value is expected to be + rigorously conserved by any dynamics or optimization algorithms. + + A "restraint", in constrast, is a harmonic restoring force applied to a degree of freedom. + Restraint forces should be added to the nuclear hamiltonian. A restraint's "value" is the + spring's equilibrium position. + + The list at calc['constraints'] has the form: + [{type: , + restraint: , + value: {value: , units: } + atomIdx0: ...} ...] + + For example, fixed atom constraints have the form: + {type: 'atomPosition', + restraint: False, + atomIdx: } + + Restraints are described similarly, but include a spring constant (of the appropriate units): + {type: 'bond', + restraint: True, + atomIdx1: , + atomIdx2: , + springConstant: {value: , units: }, + value: {value: , units: }} + """ + clist = self.parameters.get('constraints', None) + if clist is None: return + + lines = ['constraints'] + + for constraint in clist: + if constraint['type'] == 'position': + lines.append(' fix atom %d' % constraint['atomIdx']) + elif constraint['type'] == 'distance' and constraint['restraint']: + k = convert(constraint['springConstant'], 'hartree/(a0*a0)') + d0 = convert(constraint('value', 'a0')) + lines.append(' spring bond %d %d %20.10f %20.10f' % + (constraint['atomIdx1']+1, constraint['atomIdx2']+1, k, d0)) + else: + raise NotImplementedError('Constraint type %s (as restraint: %b) not implemented' % + (constraint['type'], constraint['restraint'])) - -##### helper routines below ###### - -def _make_input_files(calc): - nwin = [_header(calc), - _geom_block(calc), - _basisblock(calc), - _chargeblock(calc), - _theoryblock(calc), - _otherblocks(calc), - _taskblock(calc)] - - return {'nw.in': '\n'.join(nwin)} - - -def _header(calc): - return '\nstart mol\n\npermanent_dir ./perm\n' - - -def _geom_block(calc): - lines = ['geometry units angstrom noautoz noautosym nocenter', - ' load format xyz input.xyz', - 'end'] - return '\n'.join(lines) - - -def _basisblock(calc): - return 'basis\n * library %s\nend' % calc['basis'] # TODO: translate names - - -def _theoryblock(calc): - lines = [_taskname(calc), - _multiplicityline(calc), - _theorylines(calc), - 'end' - ] - return '\n'.join(lines) - - -def _otherblocks(calc): - lines = [] - if calc['runType'] == 'minimization': - lines.append('driver\n xyz opt\n print high\n') - if 'minimization_steps' in calc: - lines.append('maxiter %d' % calc['minimization_steps']) lines.append('end') - return '\n'.join(lines) - - -TASKNAMES = {'rhf': 'scf', - 'uhf': 'scf', - 'rks': 'dft', - 'uks': 'dft'} - - -def _taskname(calc): - return TASKNAMES[calc['theory']] - - -SCFNAMES = {'rhf': 'rhf', - 'uhf': 'uhf', - 'rks': 'rhf', - 'uks': 'uhf'} - - -def _scfname(calc): - return SCFNAMES[calc['theory']] - - -def _taskblock(calc): - if calc['runType'] == 'minimization': - tasktype = 'optimize' - elif 'forces' in calc['properties']: - tasktype = 'gradient' - else: - tasktype = 'energy' - - return 'task %s %s' % (_taskname(calc), tasktype) + return '\n'.join(lines) + def _espblock(self): + return "esp\nrecalculate\nend" -STATENAMES = {1: "SINGLET", - 2: "DOUBLET", - 3: "TRIPLET", - 4: "QUARTET", - 5: "QUINTET", - 6: "SEXTET", - 7: "SEPTET", - 8: "OCTET"} + def _chargeblock(self): + return '\ncharge %s\n' % self.parameters.get('charge', 0) - -def _multiplicityline(calc): - if calc['theory'] in ('rks', 'uks'): - return 'mult %s' % calc.get('multiplicity', 1) - else: - return STATENAMES[calc.get('multiplicity', 1)] - - -def _constraintblock(calc): - """ - Constraints / restraints are specified in JSON objects at calc.constraints and calc.restraints. - - "Constraints" describe a specific degree of freedom and its value. This value is expected to be - rigorously conserved by any dynamics or optimization algorithms. - - A "restraint", in constrast, is a harmonic restoring force applied to a degree of freedom. - Restraint forces should be added to the nuclear hamiltonian. A restraint's "value" is the - spring's equilibrium position. - - The list at calc['constraints'] has the form: - [{type: , - restraint: , - value: {value: , units: } - atomIdx0: ...} ...] - - For example, fixes atom constraints have the form: - {type: 'atomPosition', - restraint: False, - atomIdx: } - - Restraints are described similary, but include a spring constant (of the appropriate units): - {type: 'bond', - restraint: True, - atomIdx1: , - atomIdx2: , - springConstant: {value: , units: }, - value: {value: , units: }} - """ - clist = calc.get('constraints', None) - if clist is None: return - - lines = ['constraints'] - - for constraint in clist: - if constraint['type'] == 'position': - lines.append(' fix atom %d' % constraint['atomIdx']) - elif constraint['type'] == 'distance' and constraint['restraint']: - k = convert(constraint['springConstant'], 'hartree/(a0*a0)') - d0 = convert(constraint('value', 'a0')) - lines.append(' spring bond %d %d %20.10f %20.10f' % - (constraint['atomIdx1']+1, constraint['atomIdx2']+1, k, d0)) + def _isdft(self): + if self.parameters['theory'] in ('rks', 'uks'): + return True + elif self.parameters.get('reference', None) in ('rks', 'uks'): + return True else: - raise NotImplementedError('Constraint type %s (as restraint: %b) not implemented' % - (constraint['type'], constraint['restraint'])) - - lines.append('end') - - return '\n'.join(lines) + return False + def _theorylines(self): + lines = ['direct'] + if self._isdft(): + lines.append('XC %s' % self.parameters['functional']) + return '\n'.join(lines) - -def _chargeblock(calc): - return '\ncharge %s\n' % calc.get('charge', 0) - - -def _theorylines(calc): - if _taskname(calc) == 'dft': - return 'XC %s' % calc['functional'] - else: - return '' +def main(cls): + with open('params.json', 'r') as pjson: + parameters = json.load(pjson) + runner = cls(parameters) + runner.write_inputs() + runner.run_calculation() if __name__ == '__main__': - with open('params.json','r') as pjson: - parameters = json.load(pjson) - - write_inputs(parameters) - run_calculation(parameters) + main(QMRunner) diff --git a/DockerMakefiles/buildfiles/nwchem/run.sh b/DockerMakefiles/buildfiles/nwchem/run.sh deleted file mode 100644 index c2d616f..0000000 --- a/DockerMakefiles/buildfiles/nwchem/run.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash - -cp $1 ./params.json -cp $2 ./input.xyz -run.py -getresults.py diff --git a/DockerMakefiles/buildfiles/nwchem/runqmmm.py b/DockerMakefiles/buildfiles/nwchem/runqmmm.py new file mode 100644 index 0000000..5e06787 --- /dev/null +++ b/DockerMakefiles/buildfiles/nwchem/runqmmm.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python +""" +This script drives an NWChem calculation given a generic QM specification +""" +import json +import os +import pint + +from run import * + +CRDPARAMS = "nwchem.crdparams" + + +class QMMMRunner(QMRunner): + def _geom_block(self): + if not os.path.isfile(CRDPARAMS): + raise IOError('Required input file %s not found' % CRDPARAMS) + return "mm\ncrdparms load %s\nend" % CRDPARAMS + + def _taskblock(self): + fields = super(QMMMRunner, self)._taskblock().split() + fields.insert(1, 'mm') + fields.append('ignore') + return ' '.join(fields) + +if __name__ == '__main__': + main(QMMMRunner) diff --git a/codeship-services.yml b/codeship-services.yml index a982da2..4f38acf 100644 --- a/codeship-services.yml +++ b/codeship-services.yml @@ -28,6 +28,7 @@ test_moldesign_minimal: environment: TESTENV: minimal PYVERSION: 3 + OPENMM_CPU_THREADS: 1 volumes: - ./tmp/reports:/opt/reports @@ -42,6 +43,7 @@ test_moldesign_minimal_py2: environment: TESTENV: minimal PYVERSION: 2 + OPENMM_CPU_THREADS: 1 volumes: - ./tmp/reports:/opt/reports @@ -56,6 +58,7 @@ test_moldesign_complete: environment: TESTENV: complete PYVERSION: 3 + OPENMM_CPU_THREADS: 1 volumes: - ./tmp/reports:/opt/reports @@ -70,6 +73,7 @@ test_moldesign_complete_py2: environment: TESTENV: complete PYVERSION: 2 + OPENMM_CPU_THREADS: 1 volumes: - ./tmp/reports:/opt/reports diff --git a/codeship-steps.yml b/codeship-steps.yml index 14cf2ed..cfed658 100644 --- a/codeship-steps.yml +++ b/codeship-steps.yml @@ -60,18 +60,31 @@ service: docker_make command: docker-make --all --tag dev -- command: deployment/codeship_runtests.sh - service: test_moldesign_complete - name: complete_test_py3 -- command: deployment/codeship_runtests.sh - service: test_moldesign_minimal - name: minimal_test_py3 -- command: deployment/codeship_runtests.sh - service: test_moldesign_complete_py2 - name: complete_test_py2 -- command: deployment/codeship_runtests.sh - service: test_moldesign_minimal_py2 - name: minimal_test_py2 +- type: parallel + name: environments + services: + - test_moldesign_complete + - test_moldesign_complete_py2 + - test_moldesign_minimal + - test_moldesign_minimal_py2 + steps: + - command: deployment/print_environment.sh + +- type: parallel + name: complete_tests + services: + - test_moldesign_complete + - test_moldesign_complete_py2 + steps: + - command: deployment/codeship_runtests.sh + +- type: parallel + name: minimal_tests + services: + - test_moldesign_minimal + - test_moldesign_minimal_py2 + steps: + - command: deployment/codeship_runtests.sh - name: publish service: publisher diff --git a/deployment/codeship_runtests.sh b/deployment/codeship_runtests.sh index 7fa7dcd..4e3e987 100755 --- a/deployment/codeship_runtests.sh +++ b/deployment/codeship_runtests.sh @@ -1,11 +1,11 @@ #!/usr/bin/env bash # this script expects to run from the root of the repository -# fail immediately if any command fails: -set -e +set -e # fail immediately if any command fails + VERSION="${TESTENV}.py${PYVERSION}" -PYTESTFLAGS="-n 5 --durations=20 --junit-xml=/opt/reports/junit.${VERSION}.xml --timeout=1800 --tb=short" +PYTESTFLAGS="-n 2 --spec --disable-warnings --durations=20 --junit-xml=/opt/reports/junit.${VERSION}.xml --timeout=1800 --tb=short" if [ "${VERSION}" == "complete.py3" ]; then PYTESTFLAGS="--cov moldesign ${PYTESTFLAGS}" fi diff --git a/deployment/print_environment.sh b/deployment/print_environment.sh new file mode 100755 index 0000000..b8a10ea --- /dev/null +++ b/deployment/print_environment.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash + +echo +echo " ==== ${TESTENV} Test Environment for Python ${PYVERSION} ==== " +echo +echo " * Python interpreter: $(python -c "import sys; print(sys.version)")" +echo +echo " * Conda version: $(conda --version 2>/dev/null || echo 'not installed')" +echo +echo " * Missing optional interfaces:" + +# This will print logging messages about optional interfaces +plats=$(python -c "import moldesign; +if not moldesign.interfaces.openmm.force_remote: print(moldesign.interfaces.openmm.list_openmmplatforms())" +) + +if [ "$?" != "0" ]; then + plats="None (OpenMM not installed)" +fi + +echo +echo " * OpenMM platforms:" +echo ${plats} +echo +echo " * Conda environment: $(conda list 2>/dev/null || echo "not installed")" +echo +echo " * Installed python packages: " +pip freeze diff --git a/deployment/requirements.txt b/deployment/requirements.txt index f64d5a6..a9130ea 100644 --- a/deployment/requirements.txt +++ b/deployment/requirements.txt @@ -1,9 +1,11 @@ # Python dependencies for the build/test environment coveralls nbformat -pathlib ; python_version < '3.5' +pathlib ; python_version < '3.3' PyGithub +pyccc >= 0.7.10 pytest-cov pytest-xdist != 1.17.0 pytest-timeout +pytest-spec diff --git a/moldesign/__init__.py b/moldesign/__init__.py index ec0afb8..0139292 100644 --- a/moldesign/__init__.py +++ b/moldesign/__init__.py @@ -56,6 +56,7 @@ from .tools import * # Set up cloud computing +_lastjobs = [] compute.init_config() # package metadata diff --git a/moldesign/_notebooks/3AID.cif b/moldesign/_notebooks/3AID.cif new file mode 100644 index 0000000..9ffb439 --- /dev/null +++ b/moldesign/_notebooks/3AID.cif @@ -0,0 +1,3108 @@ +data_3AID +# +_entry.id 3AID +# +_audit_conform.dict_name mmcif_pdbx.dic +_audit_conform.dict_version 4.007 +_audit_conform.dict_location http://mmcif.pdb.org/dictionaries/ascii/mmcif_pdbx.dic +# +_database_2.database_id PDB +_database_2.database_code 3AID +# +loop_ +_database_PDB_rev.num +_database_PDB_rev.date +_database_PDB_rev.date_original +_database_PDB_rev.status +_database_PDB_rev.replaces +_database_PDB_rev.mod_type +1 1997-09-17 1997-05-15 ? 3AID 0 +2 2003-04-01 ? ? 3AID 1 +3 2009-02-24 ? ? 3AID 1 +# +loop_ +_database_PDB_rev_record.rev_num +_database_PDB_rev_record.type +_database_PDB_rev_record.details +2 JRNL ? +3 VERSN ? +# +_pdbx_database_status.status_code REL +_pdbx_database_status.entry_id 3AID +_pdbx_database_status.deposit_site ? +_pdbx_database_status.process_site ? +_pdbx_database_status.SG_entry . +# +loop_ +_audit_author.name +_audit_author.pdbx_ordinal +'Rutenber, E.E.' 1 +'Stroud, R.M.' 2 +# +_citation.id primary +_citation.title +;A new class of HIV-1 protease inhibitor: the crystallographic structure, inhibition and chemical synthesis of an aminimide peptide isostere. +; +_citation.journal_abbrev Bioorg.Med.Chem. +_citation.journal_volume 4 +_citation.page_first 1545 +_citation.page_last 1558 +_citation.year 1996 +_citation.journal_id_ASTM BMECEP +_citation.country UK +_citation.journal_id_ISSN 0968-0896 +_citation.journal_id_CSD 1200 +_citation.book_publisher ? +_citation.pdbx_database_id_PubMed 8894111 +_citation.pdbx_database_id_DOI '10.1016/0968-0896(96)00147-2' +# +loop_ +_citation_author.citation_id +_citation_author.name +_citation_author.ordinal +primary 'Rutenber, E.E.' 1 +primary 'McPhee, F.' 2 +primary 'Kaplan, A.P.' 3 +primary 'Gallion, S.L.' 4 +primary 'Hogan Jr., J.C.' 5 +primary 'Craik, C.S.' 6 +primary 'Stroud, R.M.' 7 +# +_cell.entry_id 3AID +_cell.length_a 53.100 +_cell.length_b 61.000 +_cell.length_c 63.200 +_cell.angle_alpha 90.00 +_cell.angle_beta 90.00 +_cell.angle_gamma 90.00 +_cell.Z_PDB 8 +_cell.pdbx_unique_axis ? +# +_symmetry.entry_id 3AID +_symmetry.space_group_name_H-M 'P 21 21 21' +_symmetry.pdbx_full_space_group_name_H-M ? +_symmetry.cell_setting ? +_symmetry.Int_Tables_number ? +# +loop_ +_entity.id +_entity.type +_entity.src_method +_entity.pdbx_description +_entity.formula_weight +_entity.pdbx_number_of_molecules +_entity.details +_entity.pdbx_mutation +_entity.pdbx_fragment +_entity.pdbx_ec +1 polymer man 'HUMAN IMMUNODEFICIENCY VIRUS PROTEASE' 10801.857 2 +? Q7K ? 3.4.23.16 +2 non-polymer syn 'BENZOYLAMINO-BENZYL-METHYL-[2-HYDROXY-3-[1-METHYL-ETHYL-OXY-N-FORMAMIDYL]-4-PHENYL-BUTYL]-AMMONIUM' 504.648 1 +? ? ? ? +3 water nat water 18.015 8 +? ? ? ? +# +loop_ +_entity_keywords.entity_id +_entity_keywords.text +1 ? +2 ? +3 ? +# +loop_ +_entity_name_com.entity_id +_entity_name_com.name +1 'HIV PROTEASE, HIV PR' +2 ? +3 ? +# +_entity_poly.entity_id 1 +_entity_poly.type 'polypeptide(L)' +_entity_poly.nstd_linkage no +_entity_poly.nstd_monomer no +_entity_poly.pdbx_seq_one_letter_code +;PQITLWKRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGKWKPKMIGGIGGFIKVRQYDQIPVEICGHKAIGTVLVGPT +PVNIIGRNLLTQIGCTLNF +; +_entity_poly.pdbx_seq_one_letter_code_can +;PQITLWKRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGKWKPKMIGGIGGFIKVRQYDQIPVEICGHKAIGTVLVGPT +PVNIIGRNLLTQIGCTLNF +; +_entity_poly.pdbx_strand_id A,B +# +loop_ +_entity_poly_seq.entity_id +_entity_poly_seq.num +_entity_poly_seq.mon_id +_entity_poly_seq.hetero +1 1 PRO n +1 2 GLN n +1 3 ILE n +1 4 THR n +1 5 LEU n +1 6 TRP n +1 7 LYS n +1 8 ARG n +1 9 PRO n +1 10 LEU n +1 11 VAL n +1 12 THR n +1 13 ILE n +1 14 ARG n +1 15 ILE n +1 16 GLY n +1 17 GLY n +1 18 GLN n +1 19 LEU n +1 20 LYS n +1 21 GLU n +1 22 ALA n +1 23 LEU n +1 24 LEU n +1 25 ASP n +1 26 THR n +1 27 GLY n +1 28 ALA n +1 29 ASP n +1 30 ASP n +1 31 THR n +1 32 VAL n +1 33 LEU n +1 34 GLU n +1 35 GLU n +1 36 MET n +1 37 ASN n +1 38 LEU n +1 39 PRO n +1 40 GLY n +1 41 LYS n +1 42 TRP n +1 43 LYS n +1 44 PRO n +1 45 LYS n +1 46 MET n +1 47 ILE n +1 48 GLY n +1 49 GLY n +1 50 ILE n +1 51 GLY n +1 52 GLY n +1 53 PHE n +1 54 ILE n +1 55 LYS n +1 56 VAL n +1 57 ARG n +1 58 GLN n +1 59 TYR n +1 60 ASP n +1 61 GLN n +1 62 ILE n +1 63 PRO n +1 64 VAL n +1 65 GLU n +1 66 ILE n +1 67 CYS n +1 68 GLY n +1 69 HIS n +1 70 LYS n +1 71 ALA n +1 72 ILE n +1 73 GLY n +1 74 THR n +1 75 VAL n +1 76 LEU n +1 77 VAL n +1 78 GLY n +1 79 PRO n +1 80 THR n +1 81 PRO n +1 82 VAL n +1 83 ASN n +1 84 ILE n +1 85 ILE n +1 86 GLY n +1 87 ARG n +1 88 ASN n +1 89 LEU n +1 90 LEU n +1 91 THR n +1 92 GLN n +1 93 ILE n +1 94 GLY n +1 95 CYS n +1 96 THR n +1 97 LEU n +1 98 ASN n +1 99 PHE n +# +_entity_src_gen.entity_id 1 +_entity_src_gen.gene_src_common_name ? +_entity_src_gen.gene_src_genus Lentivirus +_entity_src_gen.pdbx_gene_src_gene ? +_entity_src_gen.gene_src_species ? +_entity_src_gen.gene_src_strain ? +_entity_src_gen.gene_src_tissue ? +_entity_src_gen.gene_src_tissue_fraction ? +_entity_src_gen.gene_src_details ? +_entity_src_gen.pdbx_gene_src_fragment ? +_entity_src_gen.pdbx_gene_src_scientific_name 'Human immunodeficiency virus 1' +_entity_src_gen.pdbx_gene_src_ncbi_taxonomy_id 11676 +_entity_src_gen.pdbx_gene_src_variant 'SF1 ISOLATE' +_entity_src_gen.pdbx_gene_src_cell_line ? +_entity_src_gen.pdbx_gene_src_atcc ? +_entity_src_gen.pdbx_gene_src_organ ? +_entity_src_gen.pdbx_gene_src_organelle ? +_entity_src_gen.pdbx_gene_src_cell ? +_entity_src_gen.pdbx_gene_src_cellular_location ? +_entity_src_gen.host_org_common_name ? +_entity_src_gen.pdbx_host_org_scientific_name 'Escherichia coli' +_entity_src_gen.pdbx_host_org_ncbi_taxonomy_id 562 +_entity_src_gen.host_org_genus Escherichia +_entity_src_gen.pdbx_host_org_gene ? +_entity_src_gen.pdbx_host_org_organ ? +_entity_src_gen.host_org_species ? +_entity_src_gen.pdbx_host_org_tissue ? +_entity_src_gen.pdbx_host_org_tissue_fraction ? +_entity_src_gen.pdbx_host_org_strain ? +_entity_src_gen.pdbx_host_org_variant ? +_entity_src_gen.pdbx_host_org_cell_line ? +_entity_src_gen.pdbx_host_org_atcc ? +_entity_src_gen.pdbx_host_org_culture_collection ? +_entity_src_gen.pdbx_host_org_cell ? +_entity_src_gen.pdbx_host_org_organelle ? +_entity_src_gen.pdbx_host_org_cellular_location ? +_entity_src_gen.pdbx_host_org_vector_type ? +_entity_src_gen.pdbx_host_org_vector ? +_entity_src_gen.plasmid_name ? +_entity_src_gen.plasmid_details ? +_entity_src_gen.pdbx_description ? +# +_struct_ref.id 1 +_struct_ref.db_name UNP +_struct_ref.db_code POL_HV1A2 +_struct_ref.entity_id 1 +_struct_ref.pdbx_db_accession P03369 +_struct_ref.pdbx_align_begin 1 +_struct_ref.pdbx_seq_one_letter_code +;FFREDLAFLQGKAREFSSEQTRANSPTRRELQVWGGENNSLSEAGADRQGTVSFNFPQITLWQRPLVTIRIGGQLKEALL +DTGADDTVLEEMNLPGKWKPKMIGGIGGFIKVRQYDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNFPISPI +ETVPVKLKPGMDGPKVKQWPLTEEKIKALVEICTEMEKEGKISKIGPENPYNTPVFAIKKKDSTKWRKLVDFRELNKRTQ +DFWEVQLGIPHPAGLKKKKSVTVLDVGDAYFSVPLDKDFRKYTAFTIPSINNETPGIRYQYNVLPQGWKGSPAIFQSSMT +KILEPFRKQNPDIVIYQYMDDLYVGSDLEIGQHRTKIEELRQHLLRWGFTTPDKKHQKEPPFLWMGYELHPDKWTVQPIM +LPEKDSWTVNDIQKLVGKLNWASQIYAGIKVKQLCKLLRGTKALTEVIPLTEEAELELAENREILKEPVHEVYYDPSKDL +VAEIQKQGQGQWTYQIYQEPFKNLKTGKYARMRGAHTNDVKQLTEAVQKVSTESIVIWGKIPKFKLPIQKETWEAWWMEY +WQATWIPEWEFVNTPPLVKLWYQLEKEPIVGAETFYVDGAANRETKLGKAGYVTDRGRQKVVSIADTTNQKTELQAIHLA +LQDSGLEVNIVTDSQYALGIIQAQPDKSESELVSQIIEQLIKKEKVYLAWVPAHKGIGGNEQVDKLVSAGIRKVLFLNGI +DKAQEEHEKYHSNWRAMASDFNLPPVVAKEIVASCDKCQLKGEAMHGQVDCSPGIWQLDCTHLEGKIILVAVHVASGYIE +AEVIPAETGQETAYFLLKLAGRWPVKTIHTDNGSNFTSTTVKAACWWAGIKQEFGIPYNPQSQGVVESMNNELKKIIGQV +RDQAEHLKTAVQMAVFIHNFKRKGGIGGYSAGERIVDIIATDIQTKELQKQITKIQNFRVYYRDNKDPLWKGPAKLLWKG +EGAVVIQDNSDIKVVPRRKAKIIRDYGKQMAGDDCVASRQDED +; +_struct_ref.biol_id . +# +loop_ +_struct_ref_seq.align_id +_struct_ref_seq.ref_id +_struct_ref_seq.pdbx_PDB_id_code +_struct_ref_seq.pdbx_strand_id +_struct_ref_seq.seq_align_beg +_struct_ref_seq.pdbx_seq_align_beg_ins_code +_struct_ref_seq.seq_align_end +_struct_ref_seq.pdbx_seq_align_end_ins_code +_struct_ref_seq.pdbx_db_accession +_struct_ref_seq.db_align_beg +_struct_ref_seq.pdbx_db_align_beg_ins_code +_struct_ref_seq.db_align_end +_struct_ref_seq.pdbx_db_align_end_ins_code +_struct_ref_seq.pdbx_auth_seq_align_beg +_struct_ref_seq.pdbx_auth_seq_align_end +1 1 3AID A 1 ? 99 ? P03369 57 ? 155 ? 1 99 +2 1 3AID B 1 ? 99 ? P03369 57 ? 155 ? 1 99 +# +loop_ +_struct_ref_seq_dif.align_id +_struct_ref_seq_dif.pdbx_pdb_id_code +_struct_ref_seq_dif.mon_id +_struct_ref_seq_dif.pdbx_pdb_strand_id +_struct_ref_seq_dif.seq_num +_struct_ref_seq_dif.pdbx_pdb_ins_code +_struct_ref_seq_dif.pdbx_seq_db_name +_struct_ref_seq_dif.pdbx_seq_db_accession_code +_struct_ref_seq_dif.db_mon_id +_struct_ref_seq_dif.pdbx_seq_db_seq_num +_struct_ref_seq_dif.details +_struct_ref_seq_dif.pdbx_auth_seq_num +_struct_ref_seq_dif.pdbx_ordinal +1 3AID LYS A 7 ? UNP P03369 GLN 63 ENGINEERED 7 1 +2 3AID LYS B 7 ? UNP P03369 GLN 63 ENGINEERED 7 2 +# +loop_ +_chem_comp.id +_chem_comp.type +_chem_comp.mon_nstd_flag +_chem_comp.name +_chem_comp.pdbx_synonyms +_chem_comp.formula +_chem_comp.formula_weight +PRO 'L-peptide linking' y PROLINE ? +'C5 H9 N O2' 115.132 +GLN 'L-peptide linking' y GLUTAMINE ? +'C5 H10 N2 O3' 146.146 +ILE 'L-peptide linking' y ISOLEUCINE ? +'C6 H13 N O2' 131.174 +THR 'L-peptide linking' y THREONINE ? +'C4 H9 N O3' 119.120 +LEU 'L-peptide linking' y LEUCINE ? +'C6 H13 N O2' 131.174 +TRP 'L-peptide linking' y TRYPTOPHAN ? +'C11 H12 N2 O2' 204.228 +LYS 'L-peptide linking' y LYSINE ? +'C6 H15 N2 O2 1' 147.197 +ARG 'L-peptide linking' y ARGININE ? +'C6 H15 N4 O2 1' 175.210 +VAL 'L-peptide linking' y VALINE ? +'C5 H11 N O2' 117.147 +GLY 'PEPTIDE LINKING' y GLYCINE ? +'C2 H5 N O2' 75.067 +GLU 'L-peptide linking' y 'GLUTAMIC ACID' ? +'C5 H9 N O4' 147.130 +ALA 'L-peptide linking' y ALANINE ? +'C3 H7 N O2' 89.094 +ASP 'L-peptide linking' y 'ASPARTIC ACID' ? +'C4 H7 N O4' 133.104 +MET 'L-peptide linking' y METHIONINE ? +'C5 H11 N O2 S' 149.207 +ASN 'L-peptide linking' y ASPARAGINE ? +'C4 H8 N2 O3' 132.119 +PHE 'L-peptide linking' y PHENYLALANINE ? +'C9 H11 N O2' 165.191 +TYR 'L-peptide linking' y TYROSINE ? +'C9 H11 N O3' 181.191 +CYS 'L-peptide linking' y CYSTEINE ? +'C3 H7 N O2 S' 121.154 +HIS 'L-peptide linking' y HISTIDINE ? +'C6 H10 N3 O2 1' 156.164 +ARQ NON-POLYMER . 'BENZOYLAMINO-BENZYL-METHYL-[2-HYDROXY-3-[1-METHYL-ETHYL-OXY-N-FORMAMIDYL]-4-PHENYL-BUTYL]-AMMONIUM' ? +'C30 H38 N3 O4 1' 504.648 +HOH NON-POLYMER . WATER ? +'H2 O' 18.015 +# +_exptl.entry_id 3AID +_exptl.method 'X-RAY DIFFRACTION' +_exptl.crystals_number 1 +# +_exptl_crystal.id 1 +_exptl_crystal.density_meas ? +_exptl_crystal.density_Matthews 2.37 +_exptl_crystal.density_percent_sol 48.04 +_exptl_crystal.description ? +# +_exptl_crystal_grow.crystal_id 1 +_exptl_crystal_grow.method ? +_exptl_crystal_grow.temp ? +_exptl_crystal_grow.temp_details ? +_exptl_crystal_grow.pH 5.4 +_exptl_crystal_grow.pdbx_pH_range ? +_exptl_crystal_grow.pdbx_details 'pH 5.4' +# +_diffrn.id 1 +_diffrn.ambient_temp 287 +_diffrn.ambient_temp_details ? +_diffrn.crystal_id 1 +# +_diffrn_detector.diffrn_id 1 +_diffrn_detector.detector 'AREA DETECTOR' +_diffrn_detector.type SIEMENS +_diffrn_detector.pdbx_collection_date 1995-01 +_diffrn_detector.details ? +# +_diffrn_radiation.diffrn_id 1 +_diffrn_radiation.wavelength_id 1 +_diffrn_radiation.pdbx_monochromatic_or_laue_m_l M +_diffrn_radiation.monochromator 'GRAPHITE(002)' +_diffrn_radiation.pdbx_diffrn_protocol ? +_diffrn_radiation.pdbx_scattering_type x-ray +# +_diffrn_radiation_wavelength.id 1 +_diffrn_radiation_wavelength.wavelength 1.5418 +_diffrn_radiation_wavelength.wt 1.0 +# +_diffrn_source.diffrn_id 1 +_diffrn_source.source 'ROTATING ANODE' +_diffrn_source.type 'RIGAKU RUH3R' +_diffrn_source.pdbx_synchrotron_site ? +_diffrn_source.pdbx_synchrotron_beamline ? +_diffrn_source.pdbx_wavelength 1.5418 +_diffrn_source.pdbx_wavelength_list ? +# +_reflns.entry_id 3AID +_reflns.observed_criterion_sigma_I 0.0 +_reflns.observed_criterion_sigma_F ? +_reflns.d_resolution_low 100. +_reflns.d_resolution_high 2.5 +_reflns.number_obs 14215 +_reflns.number_all ? +_reflns.percent_possible_obs 87. +_reflns.pdbx_Rmerge_I_obs 0.0810000 +_reflns.pdbx_Rsym_value 0.0810000 +_reflns.pdbx_netI_over_sigmaI ? +_reflns.B_iso_Wilson_estimate ? +_reflns.pdbx_redundancy 2.2 +_reflns.pdbx_ordinal 1 +_reflns.pdbx_diffrn_id 1 +# +_computing.entry_id 3AID +_computing.pdbx_data_reduction_ii SIEMENS +_computing.pdbx_data_reduction_ds SIEMENS +_computing.data_collection ? +_computing.structure_solution 'X-PLOR 2.0' +_computing.structure_refinement 'X-PLOR 2.0' +_computing.pdbx_structure_refinement_method ? +# +_refine.entry_id 3AID +_refine.ls_number_reflns_obs 6864 +_refine.ls_number_reflns_all ? +_refine.pdbx_ls_sigma_I ? +_refine.pdbx_ls_sigma_F 0.0 +_refine.pdbx_data_cutoff_high_absF ? +_refine.pdbx_data_cutoff_low_absF ? +_refine.pdbx_data_cutoff_high_rms_absF ? +_refine.ls_d_res_low 7.0 +_refine.ls_d_res_high 2.5 +_refine.ls_percent_reflns_obs 88. +_refine.ls_R_factor_obs 0.1800000 +_refine.ls_R_factor_all ? +_refine.ls_R_factor_R_work 0.1800000 +_refine.ls_R_factor_R_free ? +_refine.ls_R_factor_R_free_error ? +_refine.ls_R_factor_R_free_error_details ? +_refine.ls_percent_reflns_R_free ? +_refine.ls_number_reflns_R_free ? +_refine.ls_number_parameters ? +_refine.ls_number_restraints ? +_refine.occupancy_min ? +_refine.occupancy_max ? +_refine.B_iso_mean ? +_refine.aniso_B[1][1] ? +_refine.aniso_B[2][2] ? +_refine.aniso_B[3][3] ? +_refine.aniso_B[1][2] ? +_refine.aniso_B[1][3] ? +_refine.aniso_B[2][3] ? +_refine.solvent_model_details ? +_refine.solvent_model_param_ksol ? +_refine.solvent_model_param_bsol ? +_refine.pdbx_ls_cross_valid_method ? +_refine.details ? +_refine.pdbx_starting_model 'PDB ENTRY 3HVP' +_refine.pdbx_method_to_determine_struct 'MOLECULAR REPLACEMENT' +_refine.pdbx_isotropic_thermal_model ? +_refine.pdbx_stereochemistry_target_values ? +_refine.pdbx_stereochem_target_val_spec_case ? +_refine.pdbx_R_Free_selection_details ? +_refine.pdbx_overall_ESU_R ? +_refine.pdbx_overall_ESU_R_Free ? +_refine.overall_SU_ML ? +_refine.overall_SU_B ? +_refine.pdbx_refine_id 'X-RAY DIFFRACTION' +_refine.pdbx_diffrn_id 1 +# +_refine_hist.pdbx_refine_id 'X-RAY DIFFRACTION' +_refine_hist.cycle_id LAST +_refine_hist.pdbx_number_atoms_protein 1516 +_refine_hist.pdbx_number_atoms_nucleic_acid 0 +_refine_hist.pdbx_number_atoms_ligand 37 +_refine_hist.number_atoms_solvent 8 +_refine_hist.number_atoms_total 1561 +_refine_hist.d_res_high 2.5 +_refine_hist.d_res_low 7.0 +# +loop_ +_refine_ls_restr.type +_refine_ls_restr.dev_ideal +_refine_ls_restr.dev_ideal_target +_refine_ls_restr.weight +_refine_ls_restr.number +_refine_ls_restr.pdbx_refine_id +x_bond_d 0.021 ? ? ? 'X-RAY DIFFRACTION' +x_bond_d_na ? ? ? ? 'X-RAY DIFFRACTION' +x_bond_d_prot ? ? ? ? 'X-RAY DIFFRACTION' +x_angle_d ? ? ? ? 'X-RAY DIFFRACTION' +x_angle_d_na ? ? ? ? 'X-RAY DIFFRACTION' +x_angle_d_prot ? ? ? ? 'X-RAY DIFFRACTION' +x_angle_deg 3.50 ? ? ? 'X-RAY DIFFRACTION' +x_angle_deg_na ? ? ? ? 'X-RAY DIFFRACTION' +x_angle_deg_prot ? ? ? ? 'X-RAY DIFFRACTION' +x_dihedral_angle_d 30.1 ? ? ? 'X-RAY DIFFRACTION' +x_dihedral_angle_d_na ? ? ? ? 'X-RAY DIFFRACTION' +x_dihedral_angle_d_prot ? ? ? ? 'X-RAY DIFFRACTION' +x_improper_angle_d 16.4 ? ? ? 'X-RAY DIFFRACTION' +x_improper_angle_d_na ? ? ? ? 'X-RAY DIFFRACTION' +x_improper_angle_d_prot ? ? ? ? 'X-RAY DIFFRACTION' +x_mcbond_it ? ? ? ? 'X-RAY DIFFRACTION' +x_mcangle_it ? ? ? ? 'X-RAY DIFFRACTION' +x_scbond_it ? ? ? ? 'X-RAY DIFFRACTION' +x_scangle_it ? ? ? ? 'X-RAY DIFFRACTION' +# +loop_ +_pdbx_xplor_file.serial_no +_pdbx_xplor_file.param_file +_pdbx_xplor_file.topol_file +_pdbx_xplor_file.pdbx_refine_id +1 PARAM19X.PRO TOPH19X.PRO 'X-RAY DIFFRACTION' +2 ? ? 'X-RAY DIFFRACTION' +# +_struct.entry_id 3AID +_struct.title +;A NEW CLASS OF HIV-1 PROTEASE INHIBITOR: THE CRYSTALLOGRAPHIC STRUCTURE, INHIBITION AND CHEMICAL SYNTHESIS OF AN AMINIMIDE PEPTIDE ISOSTERE +; +_struct.pdbx_descriptor +;HUMAN IMMUNODEFICIENCY VIRUS PROTEASE, BENZOYLAMINO-BENZYL-METHYL-[2-HYDROXY-3-[1-METHYL-ETHYL-OXY-N-FORMAMIDYL]-4-PHENYL-BUTYL]-AMMONIUM +; +_struct.pdbx_model_details ? +_struct.pdbx_CASP_flag ? +_struct.pdbx_model_type_details ? +# +_struct_keywords.entry_id 3AID +_struct_keywords.pdbx_keywords 'ASPARTYL PROTEASE' +_struct_keywords.text 'ASPARTYL PROTEASE, PROTEASE, HIV, PEPTIDE ISOSTERE INHIBITOR, DRUG DESIGN' +# +loop_ +_struct_asym.id +_struct_asym.pdbx_blank_PDB_chainid_flag +_struct_asym.pdbx_modified +_struct_asym.entity_id +_struct_asym.details +A N N 1 ? +B N N 1 ? +C N N 2 ? +D N N 3 ? +E N N 3 ? +# +_struct_biol.id 1 +# +loop_ +_struct_conf.conf_type_id +_struct_conf.id +_struct_conf.pdbx_PDB_helix_id +_struct_conf.beg_label_comp_id +_struct_conf.beg_label_asym_id +_struct_conf.beg_label_seq_id +_struct_conf.pdbx_beg_PDB_ins_code +_struct_conf.end_label_comp_id +_struct_conf.end_label_asym_id +_struct_conf.end_label_seq_id +_struct_conf.pdbx_end_PDB_ins_code +_struct_conf.beg_auth_comp_id +_struct_conf.beg_auth_asym_id +_struct_conf.beg_auth_seq_id +_struct_conf.end_auth_comp_id +_struct_conf.end_auth_asym_id +_struct_conf.end_auth_seq_id +_struct_conf.pdbx_PDB_helix_class +_struct_conf.details +_struct_conf.pdbx_PDB_helix_length +HELX_P HELX_P1 1 ARG A 87 ? LEU A 90 ? ARG A 87 LEU A 90 1 ? 4 +HELX_P HELX_P2 2 ARG B 87 ? LEU B 90 ? ARG B 87 LEU B 90 1 ? 4 +# +_struct_conf_type.id HELX_P +_struct_conf_type.criteria ? +_struct_conf_type.reference ? +# +loop_ +_struct_sheet.id +_struct_sheet.type +_struct_sheet.number_strands +_struct_sheet.details +A ? 4 ? +B ? 3 ? +C ? 2 ? +D ? 2 ? +E ? 3 ? +F ? 2 ? +# +loop_ +_struct_sheet_order.sheet_id +_struct_sheet_order.range_id_1 +_struct_sheet_order.range_id_2 +_struct_sheet_order.offset +_struct_sheet_order.sense +A 1 2 ? anti-parallel +A 2 3 ? anti-parallel +A 3 4 ? anti-parallel +B 1 2 ? anti-parallel +B 2 3 ? anti-parallel +C 1 2 ? anti-parallel +D 1 2 ? anti-parallel +E 1 2 ? anti-parallel +E 2 3 ? anti-parallel +F 1 2 ? anti-parallel +# +loop_ +_struct_sheet_range.sheet_id +_struct_sheet_range.id +_struct_sheet_range.beg_label_comp_id +_struct_sheet_range.beg_label_asym_id +_struct_sheet_range.beg_label_seq_id +_struct_sheet_range.pdbx_beg_PDB_ins_code +_struct_sheet_range.end_label_comp_id +_struct_sheet_range.end_label_asym_id +_struct_sheet_range.end_label_seq_id +_struct_sheet_range.pdbx_end_PDB_ins_code +_struct_sheet_range.symmetry +_struct_sheet_range.beg_auth_comp_id +_struct_sheet_range.beg_auth_asym_id +_struct_sheet_range.beg_auth_seq_id +_struct_sheet_range.end_auth_comp_id +_struct_sheet_range.end_auth_asym_id +_struct_sheet_range.end_auth_seq_id +A 1 GLN A 18 ? LEU A 23 ? ? GLN A 18 LEU A 23 +A 2 LEU A 10 ? ILE A 15 ? ? LEU A 10 ILE A 15 +A 3 ILE A 62 ? ILE A 66 ? ? ILE A 62 ILE A 66 +A 4 HIS A 69 ? GLY A 73 ? ? HIS A 69 GLY A 73 +B 1 LYS A 43 ? GLY A 49 ? ? LYS A 43 GLY A 49 +B 2 GLY A 52 ? TYR A 59 ? ? GLY A 52 TYR A 59 +B 3 VAL A 75 ? GLY A 78 ? ? VAL A 75 GLY A 78 +C 1 THR A 96 ? ASN A 98 ? ? THR A 96 ASN A 98 +C 2 THR B 96 ? ASN B 98 ? ? THR B 96 ASN B 98 +D 1 LEU B 10 ? ILE B 15 ? ? LEU B 10 ILE B 15 +D 2 GLN B 18 ? LEU B 23 ? ? GLN B 18 LEU B 23 +E 1 TRP B 42 ? GLY B 49 ? ? TRP B 42 GLY B 49 +E 2 GLY B 52 ? TYR B 59 ? ? GLY B 52 TYR B 59 +E 3 VAL B 75 ? GLY B 78 ? ? VAL B 75 GLY B 78 +F 1 ILE B 62 ? ILE B 66 ? ? ILE B 62 ILE B 66 +F 2 HIS B 69 ? GLY B 73 ? ? HIS B 69 GLY B 73 +# +loop_ +_pdbx_struct_sheet_hbond.sheet_id +_pdbx_struct_sheet_hbond.range_id_1 +_pdbx_struct_sheet_hbond.range_id_2 +_pdbx_struct_sheet_hbond.range_1_label_atom_id +_pdbx_struct_sheet_hbond.range_1_label_comp_id +_pdbx_struct_sheet_hbond.range_1_label_asym_id +_pdbx_struct_sheet_hbond.range_1_label_seq_id +_pdbx_struct_sheet_hbond.range_1_PDB_ins_code +_pdbx_struct_sheet_hbond.range_1_auth_atom_id +_pdbx_struct_sheet_hbond.range_1_auth_comp_id +_pdbx_struct_sheet_hbond.range_1_auth_asym_id +_pdbx_struct_sheet_hbond.range_1_auth_seq_id +_pdbx_struct_sheet_hbond.range_2_label_atom_id +_pdbx_struct_sheet_hbond.range_2_label_comp_id +_pdbx_struct_sheet_hbond.range_2_label_asym_id +_pdbx_struct_sheet_hbond.range_2_label_seq_id +_pdbx_struct_sheet_hbond.range_2_PDB_ins_code +_pdbx_struct_sheet_hbond.range_2_auth_atom_id +_pdbx_struct_sheet_hbond.range_2_auth_comp_id +_pdbx_struct_sheet_hbond.range_2_auth_asym_id +_pdbx_struct_sheet_hbond.range_2_auth_seq_id +A 1 2 O GLN A 18 ? O GLN A 18 N ILE A 15 ? N ILE A 15 +A 2 3 O ARG A 14 ? O ARG A 14 N GLU A 65 ? N GLU A 65 +A 3 4 O ILE A 62 ? O ILE A 62 N GLY A 73 ? N GLY A 73 +B 1 2 O LYS A 43 ? O LYS A 43 N GLN A 58 ? N GLN A 58 +B 2 3 O ARG A 57 ? O ARG A 57 N VAL A 77 ? N VAL A 77 +C 1 2 O THR A 96 ? O THR A 96 N ASN B 98 ? N ASN B 98 +D 1 2 O VAL B 11 ? O VAL B 11 N ALA B 22 ? N ALA B 22 +E 1 2 O LYS B 43 ? O LYS B 43 N GLN B 58 ? N GLN B 58 +E 2 3 O ARG B 57 ? O ARG B 57 N VAL B 77 ? N VAL B 77 +F 1 2 O ILE B 62 ? O ILE B 62 N GLY B 73 ? N GLY B 73 +# +_struct_site.id AC1 +_struct_site.details 'BINDING SITE FOR RESIDUE ARQ A 401' +_struct_site.pdbx_evidence_code SOFTWARE +# +loop_ +_struct_site_gen.id +_struct_site_gen.site_id +_struct_site_gen.pdbx_num_res +_struct_site_gen.label_comp_id +_struct_site_gen.label_asym_id +_struct_site_gen.label_seq_id +_struct_site_gen.pdbx_auth_ins_code +_struct_site_gen.auth_comp_id +_struct_site_gen.auth_asym_id +_struct_site_gen.auth_seq_id +_struct_site_gen.label_atom_id +_struct_site_gen.label_alt_id +_struct_site_gen.symmetry +_struct_site_gen.details +1 AC1 10 ASP A 25 ? ASP A 25 . . 1_555 ? +2 AC1 10 GLY A 27 ? GLY A 27 . . 1_555 ? +3 AC1 10 ALA A 28 ? ALA A 28 . . 1_555 ? +4 AC1 10 ILE A 50 ? ILE A 50 . . 1_555 ? +5 AC1 10 HOH D . ? HOH A 402 . . 1_555 ? +6 AC1 10 LEU B 23 ? LEU B 23 . . 1_555 ? +7 AC1 10 ASP B 25 ? ASP B 25 . . 1_555 ? +8 AC1 10 GLY B 27 ? GLY B 27 . . 1_555 ? +9 AC1 10 GLY B 49 ? GLY B 49 . . 1_555 ? +10 AC1 10 ILE B 50 ? ILE B 50 . . 1_555 ? +# +_database_PDB_matrix.entry_id 3AID +_database_PDB_matrix.origx[1][1] 1.000000 +_database_PDB_matrix.origx[1][2] 0.000000 +_database_PDB_matrix.origx[1][3] 0.000000 +_database_PDB_matrix.origx[2][1] 0.000000 +_database_PDB_matrix.origx[2][2] 1.000000 +_database_PDB_matrix.origx[2][3] 0.000000 +_database_PDB_matrix.origx[3][1] 0.000000 +_database_PDB_matrix.origx[3][2] 0.000000 +_database_PDB_matrix.origx[3][3] 1.000000 +_database_PDB_matrix.origx_vector[1] 0.00000 +_database_PDB_matrix.origx_vector[2] 0.00000 +_database_PDB_matrix.origx_vector[3] 0.00000 +# +_atom_sites.entry_id 3AID +_atom_sites.Cartn_transform_axes ? +_atom_sites.fract_transf_matrix[1][1] 0.018832 +_atom_sites.fract_transf_matrix[1][2] 0.000000 +_atom_sites.fract_transf_matrix[1][3] 0.000000 +_atom_sites.fract_transf_matrix[2][1] 0.000000 +_atom_sites.fract_transf_matrix[2][2] 0.016393 +_atom_sites.fract_transf_matrix[2][3] 0.000000 +_atom_sites.fract_transf_matrix[3][1] 0.000000 +_atom_sites.fract_transf_matrix[3][2] 0.000000 +_atom_sites.fract_transf_matrix[3][3] 0.015823 +_atom_sites.fract_transf_vector[1] 0.00000 +_atom_sites.fract_transf_vector[2] 0.00000 +_atom_sites.fract_transf_vector[3] 0.00000 +# +loop_ +_atom_type.symbol +N +C +O +H +S +# +loop_ +_atom_site.group_PDB +_atom_site.id +_atom_site.type_symbol +_atom_site.label_atom_id +_atom_site.label_alt_id +_atom_site.label_comp_id +_atom_site.label_asym_id +_atom_site.label_entity_id +_atom_site.label_seq_id +_atom_site.pdbx_PDB_ins_code +_atom_site.Cartn_x +_atom_site.Cartn_y +_atom_site.Cartn_z +_atom_site.occupancy +_atom_site.B_iso_or_equiv +_atom_site.Cartn_x_esd +_atom_site.Cartn_y_esd +_atom_site.Cartn_z_esd +_atom_site.occupancy_esd +_atom_site.B_iso_or_equiv_esd +_atom_site.pdbx_formal_charge +_atom_site.auth_seq_id +_atom_site.auth_comp_id +_atom_site.auth_asym_id +_atom_site.auth_atom_id +_atom_site.pdbx_PDB_model_num +ATOM 1 N N . PRO A 1 1 ? -2.555 9.253 34.411 1.00 30.60 ? ? ? ? ? ? 1 PRO A N 1 +ATOM 2 C CA . PRO A 1 1 ? -1.620 8.250 33.848 1.00 28.31 ? ? ? ? ? ? 1 PRO A CA 1 +ATOM 3 C C . PRO A 1 1 ? -0.108 8.328 33.944 1.00 23.58 ? ? ? ? ? ? 1 PRO A C 1 +ATOM 4 O O . PRO A 1 1 ? 0.501 8.910 33.067 1.00 29.57 ? ? ? ? ? ? 1 PRO A O 1 +ATOM 5 C CB . PRO A 1 1 ? -2.238 6.879 33.989 1.00 28.94 ? ? ? ? ? ? 1 PRO A CB 1 +ATOM 6 C CG . PRO A 1 1 ? -3.624 7.314 33.540 1.00 32.55 ? ? ? ? ? ? 1 PRO A CG 1 +ATOM 7 C CD . PRO A 1 1 ? -3.859 8.575 34.395 1.00 34.64 ? ? ? ? ? ? 1 PRO A CD 1 +ATOM 8 H H2 . PRO A 1 1 ? -2.308 9.752 35.280 0.00 0.00 ? ? ? ? ? ? 1 PRO A H2 1 +ATOM 9 H H3 . PRO A 1 1 ? -2.623 10.035 33.697 0.00 0.00 ? ? ? ? ? ? 1 PRO A H3 1 +ATOM 10 N N . GLN A 1 2 ? 0.519 7.674 34.926 1.00 20.68 ? ? ? ? ? ? 2 GLN A N 1 +ATOM 11 C CA . GLN A 1 2 ? 1.942 7.366 34.601 1.00 22.20 ? ? ? ? ? ? 2 GLN A CA 1 +ATOM 12 C C . GLN A 1 2 ? 2.286 5.899 34.319 1.00 22.20 ? ? ? ? ? ? 2 GLN A C 1 +ATOM 13 O O . GLN A 1 2 ? 2.239 5.053 35.212 1.00 24.91 ? ? ? ? ? ? 2 GLN A O 1 +ATOM 14 C CB . GLN A 1 2 ? 3.002 7.941 35.586 1.00 22.73 ? ? ? ? ? ? 2 GLN A CB 1 +ATOM 15 C CG . GLN A 1 2 ? 4.462 7.592 35.145 1.00 23.29 ? ? ? ? ? ? 2 GLN A CG 1 +ATOM 16 C CD . GLN A 1 2 ? 5.541 8.058 36.132 1.00 23.86 ? ? ? ? ? ? 2 GLN A CD 1 +ATOM 17 O OE1 . GLN A 1 2 ? 6.166 9.080 35.963 1.00 21.61 ? ? ? ? ? ? 2 GLN A OE1 1 +ATOM 18 N NE2 . GLN A 1 2 ? 5.815 7.280 37.164 1.00 21.66 ? ? ? ? ? ? 2 GLN A NE2 1 +ATOM 19 H H . GLN A 1 2 ? 0.038 7.260 35.695 1.00 15.00 ? ? ? ? ? ? 2 GLN A H 1 +ATOM 20 H HE21 . GLN A 1 2 ? 6.517 7.687 37.741 1.00 15.00 ? ? ? ? ? ? 2 GLN A HE21 1 +ATOM 21 H HE22 . GLN A 1 2 ? 5.386 6.401 37.335 1.00 15.00 ? ? ? ? ? ? 2 GLN A HE22 1 +ATOM 22 N N . ILE A 1 3 ? 2.606 5.658 33.030 1.00 18.27 ? ? ? ? ? ? 3 ILE A N 1 +ATOM 23 C CA . ILE A 1 3 ? 2.930 4.304 32.526 1.00 14.22 ? ? ? ? ? ? 3 ILE A CA 1 +ATOM 24 C C . ILE A 1 3 ? 4.436 4.069 32.273 1.00 15.16 ? ? ? ? ? ? 3 ILE A C 1 +ATOM 25 O O . ILE A 1 3 ? 5.020 4.591 31.332 1.00 20.12 ? ? ? ? ? ? 3 ILE A O 1 +ATOM 26 C CB . ILE A 1 3 ? 2.076 3.977 31.276 1.00 8.81 ? ? ? ? ? ? 3 ILE A CB 1 +ATOM 27 C CG1 . ILE A 1 3 ? 0.614 4.286 31.565 1.00 6.38 ? ? ? ? ? ? 3 ILE A CG1 1 +ATOM 28 C CG2 . ILE A 1 3 ? 2.170 2.509 30.873 1.00 3.08 ? ? ? ? ? ? 3 ILE A CG2 1 +ATOM 29 C CD1 . ILE A 1 3 ? -0.351 3.719 30.518 1.00 10.97 ? ? ? ? ? ? 3 ILE A CD1 1 +ATOM 30 H H . ILE A 1 3 ? 2.634 6.454 32.436 1.00 15.00 ? ? ? ? ? ? 3 ILE A H 1 +ATOM 31 N N . THR A 1 4 ? 5.050 3.270 33.166 1.00 10.39 ? ? ? ? ? ? 4 THR A N 1 +ATOM 32 C CA . THR A 1 4 ? 6.416 2.743 32.935 1.00 10.00 ? ? ? ? ? ? 4 THR A CA 1 +ATOM 33 C C . THR A 1 4 ? 6.599 1.452 32.068 1.00 11.66 ? ? ? ? ? ? 4 THR A C 1 +ATOM 34 O O . THR A 1 4 ? 5.793 0.527 32.112 1.00 15.69 ? ? ? ? ? ? 4 THR A O 1 +ATOM 35 C CB . THR A 1 4 ? 7.056 2.437 34.248 1.00 4.39 ? ? ? ? ? ? 4 THR A CB 1 +ATOM 36 O OG1 . THR A 1 4 ? 6.473 1.231 34.804 1.00 5.25 ? ? ? ? ? ? 4 THR A OG1 1 +ATOM 37 C CG2 . THR A 1 4 ? 6.920 3.635 35.165 1.00 2.00 ? ? ? ? ? ? 4 THR A CG2 1 +ATOM 38 H H . THR A 1 4 ? 4.492 2.965 33.935 1.00 15.00 ? ? ? ? ? ? 4 THR A H 1 +ATOM 39 H HG1 . THR A 1 4 ? 5.929 0.815 34.136 1.00 15.00 ? ? ? ? ? ? 4 THR A HG1 1 +ATOM 40 N N . LEU A 1 5 ? 7.715 1.398 31.321 1.00 8.84 ? ? ? ? ? ? 5 LEU A N 1 +ATOM 41 C CA . LEU A 1 5 ? 7.870 0.420 30.235 1.00 7.65 ? ? ? ? ? ? 5 LEU A CA 1 +ATOM 42 C C . LEU A 1 5 ? 8.606 -0.903 30.466 1.00 8.47 ? ? ? ? ? ? 5 LEU A C 1 +ATOM 43 O O . LEU A 1 5 ? 9.134 -1.511 29.545 1.00 9.06 ? ? ? ? ? ? 5 LEU A O 1 +ATOM 44 C CB . LEU A 1 5 ? 8.534 1.094 29.034 1.00 6.66 ? ? ? ? ? ? 5 LEU A CB 1 +ATOM 45 C CG . LEU A 1 5 ? 7.818 2.230 28.311 1.00 9.11 ? ? ? ? ? ? 5 LEU A CG 1 +ATOM 46 C CD1 . LEU A 1 5 ? 6.305 2.030 28.315 1.00 10.52 ? ? ? ? ? ? 5 LEU A CD1 1 +ATOM 47 C CD2 . LEU A 1 5 ? 8.236 3.611 28.775 1.00 10.50 ? ? ? ? ? ? 5 LEU A CD2 1 +ATOM 48 H H . LEU A 1 5 ? 8.405 2.109 31.468 1.00 15.00 ? ? ? ? ? ? 5 LEU A H 1 +ATOM 49 N N . TRP A 1 6 ? 8.646 -1.381 31.725 1.00 13.00 ? ? ? ? ? ? 6 TRP A N 1 +ATOM 50 C CA . TRP A 1 6 ? 9.213 -2.750 31.877 1.00 14.24 ? ? ? ? ? ? 6 TRP A CA 1 +ATOM 51 C C . TRP A 1 6 ? 8.280 -3.867 31.412 1.00 14.81 ? ? ? ? ? ? 6 TRP A C 1 +ATOM 52 O O . TRP A 1 6 ? 8.651 -5.001 31.168 1.00 16.96 ? ? ? ? ? ? 6 TRP A O 1 +ATOM 53 C CB . TRP A 1 6 ? 9.687 -3.124 33.289 1.00 14.28 ? ? ? ? ? ? 6 TRP A CB 1 +ATOM 54 C CG . TRP A 1 6 ? 10.074 -1.910 34.088 1.00 20.68 ? ? ? ? ? ? 6 TRP A CG 1 +ATOM 55 C CD1 . TRP A 1 6 ? 9.182 -1.145 34.863 1.00 27.93 ? ? ? ? ? ? 6 TRP A CD1 1 +ATOM 56 C CD2 . TRP A 1 6 ? 11.333 -1.208 34.201 1.00 21.72 ? ? ? ? ? ? 6 TRP A CD2 1 +ATOM 57 N NE1 . TRP A 1 6 ? 9.777 -0.041 35.406 1.00 26.52 ? ? ? ? ? ? 6 TRP A NE1 1 +ATOM 58 C CE2 . TRP A 1 6 ? 11.101 -0.027 35.017 1.00 22.61 ? ? ? ? ? ? 6 TRP A CE2 1 +ATOM 59 C CE3 . TRP A 1 6 ? 12.617 -1.473 33.714 1.00 16.16 ? ? ? ? ? ? 6 TRP A CE3 1 +ATOM 60 C CZ2 . TRP A 1 6 ? 12.128 0.887 35.290 1.00 20.31 ? ? ? ? ? ? 6 TRP A CZ2 1 +ATOM 61 C CZ3 . TRP A 1 6 ? 13.644 -0.553 34.018 1.00 17.45 ? ? ? ? ? ? 6 TRP A CZ3 1 +ATOM 62 C CH2 . TRP A 1 6 ? 13.406 0.616 34.778 1.00 18.71 ? ? ? ? ? ? 6 TRP A CH2 1 +ATOM 63 H H . TRP A 1 6 ? 8.228 -0.834 32.447 1.00 15.00 ? ? ? ? ? ? 6 TRP A H 1 +ATOM 64 H HE1 . TRP A 1 6 ? 9.317 0.632 35.960 1.00 15.00 ? ? ? ? ? ? 6 TRP A HE1 1 +ATOM 65 N N . LYS A 1 7 ? 7.017 -3.454 31.284 1.00 12.93 ? ? ? ? ? ? 7 LYS A N 1 +ATOM 66 C CA . LYS A 1 7 ? 5.990 -4.250 30.643 1.00 9.56 ? ? ? ? ? ? 7 LYS A CA 1 +ATOM 67 C C . LYS A 1 7 ? 5.420 -3.525 29.460 1.00 11.55 ? ? ? ? ? ? 7 LYS A C 1 +ATOM 68 O O . LYS A 1 7 ? 5.478 -2.299 29.399 1.00 12.41 ? ? ? ? ? ? 7 LYS A O 1 +ATOM 69 C CB . LYS A 1 7 ? 4.841 -4.432 31.607 1.00 18.71 ? ? ? ? ? ? 7 LYS A CB 1 +ATOM 70 C CG . LYS A 1 7 ? 5.137 -5.278 32.839 1.00 28.83 ? ? ? ? ? ? 7 LYS A CG 1 +ATOM 71 C CD . LYS A 1 7 ? 3.948 -5.219 33.795 1.00 36.81 ? ? ? ? ? ? 7 LYS A CD 1 +ATOM 72 C CE . LYS A 1 7 ? 4.209 -5.975 35.117 1.00 43.42 ? ? ? ? ? ? 7 LYS A CE 1 +ATOM 73 N NZ . LYS A 1 7 ? 3.160 -5.652 36.107 1.00 42.34 ? ? ? ? ? ? 7 LYS A NZ 1 +ATOM 74 H H . LYS A 1 7 ? 6.799 -2.518 31.545 1.00 15.00 ? ? ? ? ? ? 7 LYS A H 1 +ATOM 75 H HZ1 . LYS A 1 7 ? 2.887 -4.655 35.991 1.00 15.00 ? ? ? ? ? ? 7 LYS A HZ1 1 +ATOM 76 H HZ2 . LYS A 1 7 ? 2.331 -6.260 35.944 1.00 15.00 ? ? ? ? ? ? 7 LYS A HZ2 1 +ATOM 77 H HZ3 . LYS A 1 7 ? 3.527 -5.810 37.067 1.00 15.00 ? ? ? ? ? ? 7 LYS A HZ3 1 +ATOM 78 N N . ARG A 1 8 ? 4.801 -4.305 28.535 1.00 12.42 ? ? ? ? ? ? 8 ARG A N 1 +ATOM 79 C CA . ARG A 1 8 ? 4.091 -3.587 27.449 1.00 10.97 ? ? ? ? ? ? 8 ARG A CA 1 +ATOM 80 C C . ARG A 1 8 ? 3.003 -2.612 27.887 1.00 11.55 ? ? ? ? ? ? 8 ARG A C 1 +ATOM 81 O O . ARG A 1 8 ? 2.184 -2.938 28.746 1.00 13.27 ? ? ? ? ? ? 8 ARG A O 1 +ATOM 82 C CB . ARG A 1 8 ? 3.384 -4.517 26.488 1.00 9.39 ? ? ? ? ? ? 8 ARG A CB 1 +ATOM 83 C CG . ARG A 1 8 ? 4.144 -5.748 26.107 1.00 6.80 ? ? ? ? ? ? 8 ARG A CG 1 +ATOM 84 C CD . ARG A 1 8 ? 3.297 -6.581 25.184 1.00 12.73 ? ? ? ? ? ? 8 ARG A CD 1 +ATOM 85 N NE . ARG A 1 8 ? 4.151 -7.669 24.790 1.00 28.15 ? ? ? ? ? ? 8 ARG A NE 1 +ATOM 86 C CZ . ARG A 1 8 ? 4.343 -8.083 23.521 1.00 36.60 ? ? ? ? ? ? 8 ARG A CZ 1 +ATOM 87 N NH1 . ARG A 1 8 ? 3.598 -7.690 22.490 1.00 33.53 ? ? ? ? ? ? 8 ARG A NH1 1 +ATOM 88 N NH2 . ARG A 1 8 ? 5.334 -8.947 23.322 1.00 45.16 ? ? ? ? ? ? 8 ARG A NH2 1 +ATOM 89 H H . ARG A 1 8 ? 4.761 -5.287 28.694 1.00 15.00 ? ? ? ? ? ? 8 ARG A H 1 +ATOM 90 H HE . ARG A 1 8 ? 4.684 -8.129 25.500 1.00 15.00 ? ? ? ? ? ? 8 ARG A HE 1 +ATOM 91 H HH11 . ARG A 1 8 ? 2.832 -7.063 22.626 1.00 15.00 ? ? ? ? ? ? 8 ARG A HH11 1 +ATOM 92 H HH12 . ARG A 1 8 ? 3.812 -8.029 21.574 1.00 15.00 ? ? ? ? ? ? 8 ARG A HH12 1 +ATOM 93 H HH21 . ARG A 1 8 ? 5.883 -9.253 24.101 1.00 15.00 ? ? ? ? ? ? 8 ARG A HH21 1 +ATOM 94 H HH22 . ARG A 1 8 ? 5.536 -9.289 22.407 1.00 15.00 ? ? ? ? ? ? 8 ARG A HH22 1 +ATOM 95 N N . PRO A 1 9 ? 2.957 -1.418 27.265 1.00 10.22 ? ? ? ? ? ? 9 PRO A N 1 +ATOM 96 C CA . PRO A 1 9 ? 1.838 -0.522 27.644 1.00 9.31 ? ? ? ? ? ? 9 PRO A CA 1 +ATOM 97 C C . PRO A 1 9 ? 0.443 -0.973 27.113 1.00 9.47 ? ? ? ? ? ? 9 PRO A C 1 +ATOM 98 O O . PRO A 1 9 ? -0.016 -0.531 26.071 1.00 12.70 ? ? ? ? ? ? 9 PRO A O 1 +ATOM 99 C CB . PRO A 1 9 ? 2.350 0.830 27.118 1.00 7.49 ? ? ? ? ? ? 9 PRO A CB 1 +ATOM 100 C CG . PRO A 1 9 ? 3.309 0.489 25.949 1.00 10.39 ? ? ? ? ? ? 9 PRO A CG 1 +ATOM 101 C CD . PRO A 1 9 ? 3.886 -0.881 26.272 1.00 7.83 ? ? ? ? ? ? 9 PRO A CD 1 +ATOM 102 N N . LEU A 1 10 ? -0.222 -1.893 27.855 1.00 10.28 ? ? ? ? ? ? 10 LEU A N 1 +ATOM 103 C CA . LEU A 1 10 ? -1.555 -2.420 27.472 1.00 5.59 ? ? ? ? ? ? 10 LEU A CA 1 +ATOM 104 C C . LEU A 1 10 ? -2.725 -1.865 28.254 1.00 6.30 ? ? ? ? ? ? 10 LEU A C 1 +ATOM 105 O O . LEU A 1 10 ? -2.737 -1.938 29.472 1.00 9.79 ? ? ? ? ? ? 10 LEU A O 1 +ATOM 106 C CB . LEU A 1 10 ? -1.653 -3.892 27.745 1.00 2.00 ? ? ? ? ? ? 10 LEU A CB 1 +ATOM 107 C CG . LEU A 1 10 ? -1.056 -4.838 26.734 1.00 2.00 ? ? ? ? ? ? 10 LEU A CG 1 +ATOM 108 C CD1 . LEU A 1 10 ? -1.127 -6.225 27.327 1.00 2.00 ? ? ? ? ? ? 10 LEU A CD1 1 +ATOM 109 C CD2 . LEU A 1 10 ? -1.725 -4.792 25.361 1.00 2.00 ? ? ? ? ? ? 10 LEU A CD2 1 +ATOM 110 H H . LEU A 1 10 ? 0.241 -2.213 28.683 1.00 15.00 ? ? ? ? ? ? 10 LEU A H 1 +ATOM 111 N N . VAL A 1 11 ? -3.701 -1.304 27.534 1.00 8.40 ? ? ? ? ? ? 11 VAL A N 1 +ATOM 112 C CA . VAL A 1 11 ? -4.916 -0.688 28.141 1.00 13.91 ? ? ? ? ? ? 11 VAL A CA 1 +ATOM 113 C C . VAL A 1 11 ? -6.236 -1.349 27.788 1.00 13.86 ? ? ? ? ? ? 11 VAL A C 1 +ATOM 114 O O . VAL A 1 11 ? -6.351 -2.140 26.860 1.00 17.89 ? ? ? ? ? ? 11 VAL A O 1 +ATOM 115 C CB . VAL A 1 11 ? -5.114 0.850 27.856 1.00 12.10 ? ? ? ? ? ? 11 VAL A CB 1 +ATOM 116 C CG1 . VAL A 1 11 ? -4.279 1.777 28.747 1.00 7.44 ? ? ? ? ? ? 11 VAL A CG1 1 +ATOM 117 C CG2 . VAL A 1 11 ? -5.022 1.221 26.378 1.00 11.10 ? ? ? ? ? ? 11 VAL A CG2 1 +ATOM 118 H H . VAL A 1 11 ? -3.481 -1.176 26.579 1.00 15.00 ? ? ? ? ? ? 11 VAL A H 1 +ATOM 119 N N . THR A 1 12 ? -7.266 -0.967 28.535 1.00 10.31 ? ? ? ? ? ? 12 THR A N 1 +ATOM 120 C CA . THR A 1 12 ? -8.564 -1.409 28.023 1.00 10.43 ? ? ? ? ? ? 12 THR A CA 1 +ATOM 121 C C . THR A 1 12 ? -9.308 -0.344 27.224 1.00 11.24 ? ? ? ? ? ? 12 THR A C 1 +ATOM 122 O O . THR A 1 12 ? -9.366 0.823 27.604 1.00 10.44 ? ? ? ? ? ? 12 THR A O 1 +ATOM 123 C CB . THR A 1 12 ? -9.457 -1.922 29.145 1.00 12.18 ? ? ? ? ? ? 12 THR A CB 1 +ATOM 124 O OG1 . THR A 1 12 ? -8.702 -2.710 30.069 1.00 17.40 ? ? ? ? ? ? 12 THR A OG1 1 +ATOM 125 C CG2 . THR A 1 12 ? -10.631 -2.754 28.609 1.00 17.57 ? ? ? ? ? ? 12 THR A CG2 1 +ATOM 126 H H . THR A 1 12 ? -7.147 -0.445 29.378 1.00 15.00 ? ? ? ? ? ? 12 THR A H 1 +ATOM 127 H HG1 . THR A 1 12 ? -8.439 -3.503 29.623 1.00 15.00 ? ? ? ? ? ? 12 THR A HG1 1 +ATOM 128 N N . ILE A 1 13 ? -9.871 -0.754 26.084 1.00 9.17 ? ? ? ? ? ? 13 ILE A N 1 +ATOM 129 C CA . ILE A 1 13 ? -10.756 0.212 25.415 1.00 12.06 ? ? ? ? ? ? 13 ILE A CA 1 +ATOM 130 C C . ILE A 1 13 ? -12.234 -0.216 25.366 1.00 10.83 ? ? ? ? ? ? 13 ILE A C 1 +ATOM 131 O O . ILE A 1 13 ? -12.538 -1.399 25.368 1.00 9.79 ? ? ? ? ? ? 13 ILE A O 1 +ATOM 132 C CB . ILE A 1 13 ? -10.210 0.567 24.013 1.00 12.82 ? ? ? ? ? ? 13 ILE A CB 1 +ATOM 133 C CG1 . ILE A 1 13 ? -10.268 -0.673 23.102 1.00 13.26 ? ? ? ? ? ? 13 ILE A CG1 1 +ATOM 134 C CG2 . ILE A 1 13 ? -8.775 1.089 24.152 1.00 10.61 ? ? ? ? ? ? 13 ILE A CG2 1 +ATOM 135 C CD1 . ILE A 1 13 ? -9.741 -0.448 21.680 1.00 8.04 ? ? ? ? ? ? 13 ILE A CD1 1 +ATOM 136 H H . ILE A 1 13 ? -9.726 -1.672 25.742 1.00 15.00 ? ? ? ? ? ? 13 ILE A H 1 +ATOM 137 N N . ARG A 1 14 ? -13.131 0.779 25.310 1.00 11.30 ? ? ? ? ? ? 14 ARG A N 1 +ATOM 138 C CA . ARG A 1 14 ? -14.522 0.471 24.896 1.00 12.92 ? ? ? ? ? ? 14 ARG A CA 1 +ATOM 139 C C . ARG A 1 14 ? -15.041 1.080 23.583 1.00 10.44 ? ? ? ? ? ? 14 ARG A C 1 +ATOM 140 O O . ARG A 1 14 ? -15.093 2.293 23.409 1.00 7.41 ? ? ? ? ? ? 14 ARG A O 1 +ATOM 141 C CB . ARG A 1 14 ? -15.504 0.807 26.012 1.00 14.22 ? ? ? ? ? ? 14 ARG A CB 1 +ATOM 142 C CG . ARG A 1 14 ? -16.864 0.177 25.793 1.00 17.00 ? ? ? ? ? ? 14 ARG A CG 1 +ATOM 143 C CD . ARG A 1 14 ? -17.694 0.101 27.077 1.00 26.96 ? ? ? ? ? ? 14 ARG A CD 1 +ATOM 144 N NE . ARG A 1 14 ? -18.008 1.437 27.592 1.00 36.17 ? ? ? ? ? ? 14 ARG A NE 1 +ATOM 145 C CZ . ARG A 1 14 ? -19.298 1.876 27.717 1.00 37.70 ? ? ? ? ? ? 14 ARG A CZ 1 +ATOM 146 N NH1 . ARG A 1 14 ? -20.333 1.094 27.387 1.00 32.95 ? ? ? ? ? ? 14 ARG A NH1 1 +ATOM 147 N NH2 . ARG A 1 14 ? -19.525 3.107 28.183 1.00 36.64 ? ? ? ? ? ? 14 ARG A NH2 1 +ATOM 148 H H . ARG A 1 14 ? -12.790 1.708 25.451 1.00 15.00 ? ? ? ? ? ? 14 ARG A H 1 +ATOM 149 H HE . ARG A 1 14 ? -17.264 2.048 27.861 1.00 15.00 ? ? ? ? ? ? 14 ARG A HE 1 +ATOM 150 H HH11 . ARG A 1 14 ? -20.172 0.168 27.046 1.00 15.00 ? ? ? ? ? ? 14 ARG A HH11 1 +ATOM 151 H HH12 . ARG A 1 14 ? -21.270 1.431 27.484 1.00 15.00 ? ? ? ? ? ? 14 ARG A HH12 1 +ATOM 152 H HH21 . ARG A 1 14 ? -18.757 3.696 28.432 1.00 15.00 ? ? ? ? ? ? 14 ARG A HH21 1 +ATOM 153 H HH22 . ARG A 1 14 ? -20.463 3.436 28.281 1.00 15.00 ? ? ? ? ? ? 14 ARG A HH22 1 +ATOM 154 N N . ILE A 1 15 ? -15.430 0.176 22.675 1.00 12.87 ? ? ? ? ? ? 15 ILE A N 1 +ATOM 155 C CA . ILE A 1 15 ? -15.898 0.493 21.290 1.00 15.53 ? ? ? ? ? ? 15 ILE A CA 1 +ATOM 156 C C . ILE A 1 15 ? -17.205 -0.298 20.877 1.00 18.97 ? ? ? ? ? ? 15 ILE A C 1 +ATOM 157 O O . ILE A 1 15 ? -17.352 -1.513 21.048 1.00 18.58 ? ? ? ? ? ? 15 ILE A O 1 +ATOM 158 C CB . ILE A 1 15 ? -14.683 0.289 20.287 1.00 11.75 ? ? ? ? ? ? 15 ILE A CB 1 +ATOM 159 C CG1 . ILE A 1 15 ? -14.865 0.767 18.845 1.00 16.54 ? ? ? ? ? ? 15 ILE A CG1 1 +ATOM 160 C CG2 . ILE A 1 15 ? -14.203 -1.165 20.176 1.00 8.01 ? ? ? ? ? ? 15 ILE A CG2 1 +ATOM 161 C CD1 . ILE A 1 15 ? -13.597 0.580 17.968 1.00 8.82 ? ? ? ? ? ? 15 ILE A CD1 1 +ATOM 162 H H . ILE A 1 15 ? -15.304 -0.768 22.981 1.00 15.00 ? ? ? ? ? ? 15 ILE A H 1 +ATOM 163 N N . GLY A 1 16 ? -18.222 0.426 20.372 1.00 17.76 ? ? ? ? ? ? 16 GLY A N 1 +ATOM 164 C CA . GLY A 1 16 ? -19.516 -0.259 20.088 1.00 19.38 ? ? ? ? ? ? 16 GLY A CA 1 +ATOM 165 C C . GLY A 1 16 ? -20.301 -1.000 21.233 1.00 24.46 ? ? ? ? ? ? 16 GLY A C 1 +ATOM 166 O O . GLY A 1 16 ? -20.991 -1.996 21.018 1.00 24.31 ? ? ? ? ? ? 16 GLY A O 1 +ATOM 167 H H . GLY A 1 16 ? -18.033 1.383 20.158 1.00 15.00 ? ? ? ? ? ? 16 GLY A H 1 +ATOM 168 N N . GLY A 1 17 ? -20.087 -0.491 22.484 1.00 24.55 ? ? ? ? ? ? 17 GLY A N 1 +ATOM 169 C CA . GLY A 1 17 ? -20.430 -1.299 23.661 1.00 24.34 ? ? ? ? ? ? 17 GLY A CA 1 +ATOM 170 C C . GLY A 1 17 ? -19.445 -2.433 24.070 1.00 27.45 ? ? ? ? ? ? 17 GLY A C 1 +ATOM 171 O O . GLY A 1 17 ? -19.508 -2.983 25.156 1.00 29.91 ? ? ? ? ? ? 17 GLY A O 1 +ATOM 172 H H . GLY A 1 17 ? -19.559 0.351 22.553 1.00 15.00 ? ? ? ? ? ? 17 GLY A H 1 +ATOM 173 N N . GLN A 1 18 ? -18.495 -2.765 23.170 1.00 26.11 ? ? ? ? ? ? 18 GLN A N 1 +ATOM 174 C CA . GLN A 1 18 ? -17.478 -3.803 23.456 1.00 20.99 ? ? ? ? ? ? 18 GLN A CA 1 +ATOM 175 C C . GLN A 1 18 ? -16.203 -3.371 24.218 1.00 15.25 ? ? ? ? ? ? 18 GLN A C 1 +ATOM 176 O O . GLN A 1 18 ? -15.635 -2.312 23.997 1.00 11.39 ? ? ? ? ? ? 18 GLN A O 1 +ATOM 177 C CB . GLN A 1 18 ? -17.005 -4.489 22.166 1.00 23.80 ? ? ? ? ? ? 18 GLN A CB 1 +ATOM 178 C CG . GLN A 1 18 ? -18.029 -4.623 21.041 1.00 32.40 ? ? ? ? ? ? 18 GLN A CG 1 +ATOM 179 C CD . GLN A 1 18 ? -19.152 -5.530 21.478 1.00 38.02 ? ? ? ? ? ? 18 GLN A CD 1 +ATOM 180 O OE1 . GLN A 1 18 ? -18.938 -6.689 21.796 1.00 37.03 ? ? ? ? ? ? 18 GLN A OE1 1 +ATOM 181 N NE2 . GLN A 1 18 ? -20.364 -4.962 21.485 1.00 39.34 ? ? ? ? ? ? 18 GLN A NE2 1 +ATOM 182 H H . GLN A 1 18 ? -18.474 -2.254 22.318 1.00 15.00 ? ? ? ? ? ? 18 GLN A H 1 +ATOM 183 H HE21 . GLN A 1 18 ? -21.093 -5.567 21.790 1.00 15.00 ? ? ? ? ? ? 18 GLN A HE21 1 +ATOM 184 H HE22 . GLN A 1 18 ? -20.563 -4.026 21.197 1.00 15.00 ? ? ? ? ? ? 18 GLN A HE22 1 +ATOM 185 N N . LEU A 1 19 ? -15.782 -4.293 25.086 1.00 11.19 ? ? ? ? ? ? 19 LEU A N 1 +ATOM 186 C CA . LEU A 1 19 ? -14.556 -4.231 25.893 1.00 13.09 ? ? ? ? ? ? 19 LEU A CA 1 +ATOM 187 C C . LEU A 1 19 ? -13.336 -5.013 25.346 1.00 15.36 ? ? ? ? ? ? 19 LEU A C 1 +ATOM 188 O O . LEU A 1 19 ? -13.250 -6.240 25.418 1.00 17.95 ? ? ? ? ? ? 19 LEU A O 1 +ATOM 189 C CB . LEU A 1 19 ? -14.906 -4.687 27.338 1.00 11.59 ? ? ? ? ? ? 19 LEU A CB 1 +ATOM 190 C CG . LEU A 1 19 ? -14.624 -3.661 28.457 1.00 12.93 ? ? ? ? ? ? 19 LEU A CG 1 +ATOM 191 C CD1 . LEU A 1 19 ? -14.946 -2.235 28.030 1.00 11.72 ? ? ? ? ? ? 19 LEU A CD1 1 +ATOM 192 C CD2 . LEU A 1 19 ? -15.342 -3.985 29.758 1.00 11.09 ? ? ? ? ? ? 19 LEU A CD2 1 +ATOM 193 H H . LEU A 1 19 ? -16.371 -5.096 25.148 1.00 15.00 ? ? ? ? ? ? 19 LEU A H 1 +ATOM 194 N N . LYS A 1 20 ? -12.370 -4.247 24.790 1.00 14.09 ? ? ? ? ? ? 20 LYS A N 1 +ATOM 195 C CA . LYS A 1 20 ? -11.142 -4.882 24.258 1.00 14.64 ? ? ? ? ? ? 20 LYS A CA 1 +ATOM 196 C C . LYS A 1 20 ? -9.802 -4.451 24.908 1.00 14.53 ? ? ? ? ? ? 20 LYS A C 1 +ATOM 197 O O . LYS A 1 20 ? -9.642 -3.401 25.505 1.00 12.98 ? ? ? ? ? ? 20 LYS A O 1 +ATOM 198 C CB . LYS A 1 20 ? -11.043 -4.676 22.726 1.00 17.47 ? ? ? ? ? ? 20 LYS A CB 1 +ATOM 199 C CG . LYS A 1 20 ? -12.017 -5.389 21.788 1.00 19.14 ? ? ? ? ? ? 20 LYS A CG 1 +ATOM 200 C CD . LYS A 1 20 ? -11.772 -5.048 20.311 1.00 24.53 ? ? ? ? ? ? 20 LYS A CD 1 +ATOM 201 C CE . LYS A 1 20 ? -11.560 -6.280 19.383 1.00 29.82 ? ? ? ? ? ? 20 LYS A CE 1 +ATOM 202 N NZ . LYS A 1 20 ? -11.034 -5.893 18.044 1.00 29.67 ? ? ? ? ? ? 20 LYS A NZ 1 +ATOM 203 H H . LYS A 1 20 ? -12.518 -3.255 24.813 1.00 15.00 ? ? ? ? ? ? 20 LYS A H 1 +ATOM 204 H HZ1 . LYS A 1 20 ? -11.563 -5.071 17.687 1.00 15.00 ? ? ? ? ? ? 20 LYS A HZ1 1 +ATOM 205 H HZ2 . LYS A 1 20 ? -10.029 -5.641 18.136 1.00 15.00 ? ? ? ? ? ? 20 LYS A HZ2 1 +ATOM 206 H HZ3 . LYS A 1 20 ? -11.132 -6.685 17.378 1.00 15.00 ? ? ? ? ? ? 20 LYS A HZ3 1 +ATOM 207 N N . GLU A 1 21 ? -8.793 -5.297 24.735 1.00 17.16 ? ? ? ? ? ? 21 GLU A N 1 +ATOM 208 C CA . GLU A 1 21 ? -7.435 -4.835 25.101 1.00 19.20 ? ? ? ? ? ? 21 GLU A CA 1 +ATOM 209 C C . GLU A 1 21 ? -6.558 -4.227 23.984 1.00 16.65 ? ? ? ? ? ? 21 GLU A C 1 +ATOM 210 O O . GLU A 1 21 ? -6.418 -4.773 22.892 1.00 14.72 ? ? ? ? ? ? 21 GLU A O 1 +ATOM 211 C CB . GLU A 1 21 ? -6.673 -5.991 25.757 1.00 27.98 ? ? ? ? ? ? 21 GLU A CB 1 +ATOM 212 C CG . GLU A 1 21 ? -5.828 -5.575 26.971 1.00 36.72 ? ? ? ? ? ? 21 GLU A CG 1 +ATOM 213 C CD . GLU A 1 21 ? -6.619 -5.622 28.289 1.00 40.40 ? ? ? ? ? ? 21 GLU A CD 1 +ATOM 214 O OE1 . GLU A 1 21 ? -7.802 -5.261 28.334 1.00 40.04 ? ? ? ? ? ? 21 GLU A OE1 1 +ATOM 215 O OE2 . GLU A 1 21 ? -6.026 -6.027 29.287 1.00 43.31 ? ? ? ? ? ? 21 GLU A OE2 1 +ATOM 216 H H . GLU A 1 21 ? -8.967 -6.156 24.259 1.00 15.00 ? ? ? ? ? ? 21 GLU A H 1 +ATOM 217 N N . ALA A 1 22 ? -5.972 -3.066 24.276 1.00 14.75 ? ? ? ? ? ? 22 ALA A N 1 +ATOM 218 C CA . ALA A 1 22 ? -5.100 -2.434 23.260 1.00 11.83 ? ? ? ? ? ? 22 ALA A CA 1 +ATOM 219 C C . ALA A 1 22 ? -3.705 -1.932 23.759 1.00 9.55 ? ? ? ? ? ? 22 ALA A C 1 +ATOM 220 O O . ALA A 1 22 ? -3.453 -1.775 24.948 1.00 7.28 ? ? ? ? ? ? 22 ALA A O 1 +ATOM 221 C CB . ALA A 1 22 ? -5.865 -1.280 22.617 1.00 11.78 ? ? ? ? ? ? 22 ALA A CB 1 +ATOM 222 H H . ALA A 1 22 ? -6.107 -2.677 25.179 1.00 15.00 ? ? ? ? ? ? 22 ALA A H 1 +ATOM 223 N N . LEU A 1 23 ? -2.787 -1.711 22.805 1.00 5.96 ? ? ? ? ? ? 23 LEU A N 1 +ATOM 224 C CA . LEU A 1 23 ? -1.397 -1.289 23.114 1.00 4.12 ? ? ? ? ? ? 23 LEU A CA 1 +ATOM 225 C C . LEU A 1 23 ? -1.118 0.146 22.698 1.00 2.00 ? ? ? ? ? ? 23 LEU A C 1 +ATOM 226 O O . LEU A 1 23 ? -1.441 0.552 21.586 1.00 2.00 ? ? ? ? ? ? 23 LEU A O 1 +ATOM 227 C CB . LEU A 1 23 ? -0.438 -2.253 22.366 1.00 4.90 ? ? ? ? ? ? 23 LEU A CB 1 +ATOM 228 C CG . LEU A 1 23 ? 1.083 -2.186 22.476 1.00 2.00 ? ? ? ? ? ? 23 LEU A CG 1 +ATOM 229 C CD1 . LEU A 1 23 ? 1.571 -2.706 23.809 1.00 7.34 ? ? ? ? ? ? 23 LEU A CD1 1 +ATOM 230 C CD2 . LEU A 1 23 ? 1.744 -3.023 21.405 1.00 3.18 ? ? ? ? ? ? 23 LEU A CD2 1 +ATOM 231 H H . LEU A 1 23 ? -3.068 -1.872 21.862 1.00 15.00 ? ? ? ? ? ? 23 LEU A H 1 +ATOM 232 N N . LEU A 1 24 ? -0.537 0.896 23.624 1.00 2.00 ? ? ? ? ? ? 24 LEU A N 1 +ATOM 233 C CA . LEU A 1 24 ? -0.196 2.267 23.300 1.00 2.00 ? ? ? ? ? ? 24 LEU A CA 1 +ATOM 234 C C . LEU A 1 24 ? 1.124 2.367 22.612 1.00 3.88 ? ? ? ? ? ? 24 LEU A C 1 +ATOM 235 O O . LEU A 1 24 ? 2.176 2.052 23.152 1.00 6.52 ? ? ? ? ? ? 24 LEU A O 1 +ATOM 236 C CB . LEU A 1 24 ? -0.090 3.152 24.536 1.00 9.50 ? ? ? ? ? ? 24 LEU A CB 1 +ATOM 237 C CG . LEU A 1 24 ? -1.255 3.055 25.535 1.00 15.22 ? ? ? ? ? ? 24 LEU A CG 1 +ATOM 238 C CD1 . LEU A 1 24 ? -0.973 3.913 26.770 1.00 12.11 ? ? ? ? ? ? 24 LEU A CD1 1 +ATOM 239 C CD2 . LEU A 1 24 ? -2.622 3.353 24.899 1.00 12.26 ? ? ? ? ? ? 24 LEU A CD2 1 +ATOM 240 H H . LEU A 1 24 ? -0.281 0.454 24.486 1.00 15.00 ? ? ? ? ? ? 24 LEU A H 1 +ATOM 241 N N . ASP A 1 25 ? 1.038 2.790 21.357 1.00 7.69 ? ? ? ? ? ? 25 ASP A N 1 +ATOM 242 C CA . ASP A 1 25 ? 2.150 2.485 20.441 1.00 7.59 ? ? ? ? ? ? 25 ASP A CA 1 +ATOM 243 C C . ASP A 1 25 ? 2.638 3.731 19.715 1.00 7.44 ? ? ? ? ? ? 25 ASP A C 1 +ATOM 244 O O . ASP A 1 25 ? 2.305 3.987 18.574 1.00 8.42 ? ? ? ? ? ? 25 ASP A O 1 +ATOM 245 C CB . ASP A 1 25 ? 1.693 1.332 19.491 1.00 10.29 ? ? ? ? ? ? 25 ASP A CB 1 +ATOM 246 C CG . ASP A 1 25 ? 2.634 0.934 18.354 1.00 14.25 ? ? ? ? ? ? 25 ASP A CG 1 +ATOM 247 O OD1 . ASP A 1 25 ? 3.520 1.687 17.966 1.00 15.67 ? ? ? ? ? ? 25 ASP A OD1 1 +ATOM 248 O OD2 . ASP A 1 25 ? 2.465 -0.161 17.838 1.00 16.99 ? ? ? ? ? ? 25 ASP A OD2 1 +ATOM 249 H H . ASP A 1 25 ? 0.142 3.095 21.017 1.00 15.00 ? ? ? ? ? ? 25 ASP A H 1 +ATOM 250 N N . THR A 1 26 ? 3.487 4.495 20.404 1.00 5.41 ? ? ? ? ? ? 26 THR A N 1 +ATOM 251 C CA . THR A 1 26 ? 3.974 5.754 19.819 1.00 2.13 ? ? ? ? ? ? 26 THR A CA 1 +ATOM 252 C C . THR A 1 26 ? 4.681 5.739 18.455 1.00 2.64 ? ? ? ? ? ? 26 THR A C 1 +ATOM 253 O O . THR A 1 26 ? 4.739 6.713 17.725 1.00 4.71 ? ? ? ? ? ? 26 THR A O 1 +ATOM 254 C CB . THR A 1 26 ? 4.908 6.402 20.819 1.00 3.16 ? ? ? ? ? ? 26 THR A CB 1 +ATOM 255 O OG1 . THR A 1 26 ? 6.075 5.582 21.010 1.00 10.74 ? ? ? ? ? ? 26 THR A OG1 1 +ATOM 256 C CG2 . THR A 1 26 ? 4.172 6.524 22.144 1.00 6.50 ? ? ? ? ? ? 26 THR A CG2 1 +ATOM 257 H H . THR A 1 26 ? 3.761 4.193 21.320 1.00 15.00 ? ? ? ? ? ? 26 THR A H 1 +ATOM 258 H HG1 . THR A 1 26 ? 6.833 6.097 20.712 1.00 15.00 ? ? ? ? ? ? 26 THR A HG1 1 +ATOM 259 N N . GLY A 1 27 ? 5.240 4.582 18.101 1.00 3.99 ? ? ? ? ? ? 27 GLY A N 1 +ATOM 260 C CA . GLY A 1 27 ? 5.764 4.489 16.717 1.00 5.22 ? ? ? ? ? ? 27 GLY A CA 1 +ATOM 261 C C . GLY A 1 27 ? 4.807 4.080 15.556 1.00 4.61 ? ? ? ? ? ? 27 GLY A C 1 +ATOM 262 O O . GLY A 1 27 ? 5.169 3.927 14.399 1.00 3.35 ? ? ? ? ? ? 27 GLY A O 1 +ATOM 263 H H . GLY A 1 27 ? 5.207 3.817 18.736 1.00 15.00 ? ? ? ? ? ? 27 GLY A H 1 +ATOM 264 N N . ALA A 1 28 ? 3.519 3.982 15.911 1.00 6.91 ? ? ? ? ? ? 28 ALA A N 1 +ATOM 265 C CA . ALA A 1 28 ? 2.455 3.921 14.904 1.00 3.02 ? ? ? ? ? ? 28 ALA A CA 1 +ATOM 266 C C . ALA A 1 28 ? 1.731 5.256 14.687 1.00 3.42 ? ? ? ? ? ? 28 ALA A C 1 +ATOM 267 O O . ALA A 1 28 ? 1.156 5.870 15.572 1.00 3.02 ? ? ? ? ? ? 28 ALA A O 1 +ATOM 268 C CB . ALA A 1 28 ? 1.433 2.831 15.275 1.00 2.00 ? ? ? ? ? ? 28 ALA A CB 1 +ATOM 269 H H . ALA A 1 28 ? 3.297 4.070 16.878 1.00 15.00 ? ? ? ? ? ? 28 ALA A H 1 +ATOM 270 N N . ASP A 1 29 ? 1.735 5.695 13.417 1.00 3.92 ? ? ? ? ? ? 29 ASP A N 1 +ATOM 271 C CA . ASP A 1 29 ? 0.961 6.906 13.082 1.00 6.42 ? ? ? ? ? ? 29 ASP A CA 1 +ATOM 272 C C . ASP A 1 29 ? -0.564 6.870 13.321 1.00 6.90 ? ? ? ? ? ? 29 ASP A C 1 +ATOM 273 O O . ASP A 1 29 ? -1.237 7.831 13.680 1.00 7.18 ? ? ? ? ? ? 29 ASP A O 1 +ATOM 274 C CB . ASP A 1 29 ? 1.214 7.334 11.621 1.00 10.78 ? ? ? ? ? ? 29 ASP A CB 1 +ATOM 275 C CG . ASP A 1 29 ? 2.652 7.723 11.241 1.00 16.60 ? ? ? ? ? ? 29 ASP A CG 1 +ATOM 276 O OD1 . ASP A 1 29 ? 3.473 8.024 12.119 1.00 16.61 ? ? ? ? ? ? 29 ASP A OD1 1 +ATOM 277 O OD2 . ASP A 1 29 ? 2.937 7.729 10.035 1.00 19.82 ? ? ? ? ? ? 29 ASP A OD2 1 +ATOM 278 H H . ASP A 1 29 ? 2.329 5.189 12.788 1.00 15.00 ? ? ? ? ? ? 29 ASP A H 1 +ATOM 279 N N . ASP A 1 30 ? -1.060 5.654 13.068 1.00 10.14 ? ? ? ? ? ? 30 ASP A N 1 +ATOM 280 C CA . ASP A 1 30 ? -2.488 5.277 13.093 1.00 9.04 ? ? ? ? ? ? 30 ASP A CA 1 +ATOM 281 C C . ASP A 1 30 ? -2.819 4.094 14.037 1.00 10.66 ? ? ? ? ? ? 30 ASP A C 1 +ATOM 282 O O . ASP A 1 30 ? -1.961 3.353 14.529 1.00 10.32 ? ? ? ? ? ? 30 ASP A O 1 +ATOM 283 C CB . ASP A 1 30 ? -3.013 4.874 11.694 1.00 8.49 ? ? ? ? ? ? 30 ASP A CB 1 +ATOM 284 C CG . ASP A 1 30 ? -2.604 5.771 10.511 1.00 12.48 ? ? ? ? ? ? 30 ASP A CG 1 +ATOM 285 O OD1 . ASP A 1 30 ? -2.969 6.951 10.471 1.00 13.46 ? ? ? ? ? ? 30 ASP A OD1 1 +ATOM 286 O OD2 . ASP A 1 30 ? -1.929 5.277 9.606 1.00 14.26 ? ? ? ? ? ? 30 ASP A OD2 1 +ATOM 287 H H . ASP A 1 30 ? -0.378 4.955 12.866 1.00 15.00 ? ? ? ? ? ? 30 ASP A H 1 +ATOM 288 N N . THR A 1 31 ? -4.147 3.987 14.228 1.00 10.75 ? ? ? ? ? ? 31 THR A N 1 +ATOM 289 C CA . THR A 1 31 ? -4.846 3.005 15.081 1.00 8.58 ? ? ? ? ? ? 31 THR A CA 1 +ATOM 290 C C . THR A 1 31 ? -5.458 1.897 14.250 1.00 14.08 ? ? ? ? ? ? 31 THR A C 1 +ATOM 291 O O . THR A 1 31 ? -6.255 2.173 13.366 1.00 17.64 ? ? ? ? ? ? 31 THR A O 1 +ATOM 292 C CB . THR A 1 31 ? -5.964 3.748 15.851 1.00 8.52 ? ? ? ? ? ? 31 THR A CB 1 +ATOM 293 O OG1 . THR A 1 31 ? -5.386 4.814 16.619 1.00 5.59 ? ? ? ? ? ? 31 THR A OG1 1 +ATOM 294 C CG2 . THR A 1 31 ? -6.900 2.920 16.750 1.00 5.14 ? ? ? ? ? ? 31 THR A CG2 1 +ATOM 295 H H . THR A 1 31 ? -4.696 4.667 13.750 1.00 15.00 ? ? ? ? ? ? 31 THR A H 1 +ATOM 296 H HG1 . THR A 1 31 ? -5.542 5.620 16.140 1.00 15.00 ? ? ? ? ? ? 31 THR A HG1 1 +ATOM 297 N N . VAL A 1 32 ? -5.041 0.651 14.549 1.00 14.57 ? ? ? ? ? ? 32 VAL A N 1 +ATOM 298 C CA . VAL A 1 32 ? -5.394 -0.599 13.818 1.00 11.51 ? ? ? ? ? ? 32 VAL A CA 1 +ATOM 299 C C . VAL A 1 32 ? -5.834 -1.722 14.783 1.00 12.42 ? ? ? ? ? ? 32 VAL A C 1 +ATOM 300 O O . VAL A 1 32 ? -5.219 -2.060 15.809 1.00 9.55 ? ? ? ? ? ? 32 VAL A O 1 +ATOM 301 C CB . VAL A 1 32 ? -4.226 -1.172 12.961 1.00 11.77 ? ? ? ? ? ? 32 VAL A CB 1 +ATOM 302 C CG1 . VAL A 1 32 ? -4.659 -2.391 12.146 1.00 7.51 ? ? ? ? ? ? 32 VAL A CG1 1 +ATOM 303 C CG2 . VAL A 1 32 ? -3.615 -0.156 11.996 1.00 9.56 ? ? ? ? ? ? 32 VAL A CG2 1 +ATOM 304 H H . VAL A 1 32 ? -4.480 0.606 15.379 1.00 15.00 ? ? ? ? ? ? 32 VAL A H 1 +ATOM 305 N N . LEU A 1 33 ? -6.996 -2.262 14.399 1.00 8.46 ? ? ? ? ? ? 33 LEU A N 1 +ATOM 306 C CA . LEU A 1 33 ? -7.736 -3.086 15.361 1.00 6.71 ? ? ? ? ? ? 33 LEU A CA 1 +ATOM 307 C C . LEU A 1 33 ? -8.115 -4.411 14.697 1.00 5.60 ? ? ? ? ? ? 33 LEU A C 1 +ATOM 308 O O . LEU A 1 33 ? -8.200 -4.467 13.472 1.00 5.00 ? ? ? ? ? ? 33 LEU A O 1 +ATOM 309 C CB . LEU A 1 33 ? -8.939 -2.216 15.805 1.00 9.14 ? ? ? ? ? ? 33 LEU A CB 1 +ATOM 310 C CG . LEU A 1 33 ? -9.079 -1.598 17.233 1.00 11.97 ? ? ? ? ? ? 33 LEU A CG 1 +ATOM 311 C CD1 . LEU A 1 33 ? -7.885 -0.913 17.897 1.00 8.88 ? ? ? ? ? ? 33 LEU A CD1 1 +ATOM 312 C CD2 . LEU A 1 33 ? -10.185 -0.573 17.172 1.00 15.65 ? ? ? ? ? ? 33 LEU A CD2 1 +ATOM 313 H H . LEU A 1 33 ? -7.396 -1.982 13.525 1.00 15.00 ? ? ? ? ? ? 33 LEU A H 1 +ATOM 314 N N . GLU A 1 34 ? -8.299 -5.481 15.493 1.00 6.68 ? ? ? ? ? ? 34 GLU A N 1 +ATOM 315 C CA . GLU A 1 34 ? -8.591 -6.789 14.850 1.00 10.45 ? ? ? ? ? ? 34 GLU A CA 1 +ATOM 316 C C . GLU A 1 34 ? -9.937 -6.870 14.168 1.00 11.56 ? ? ? ? ? ? 34 GLU A C 1 +ATOM 317 O O . GLU A 1 34 ? -10.780 -6.017 14.371 1.00 13.54 ? ? ? ? ? ? 34 GLU A O 1 +ATOM 318 C CB . GLU A 1 34 ? -8.470 -7.969 15.820 1.00 14.09 ? ? ? ? ? ? 34 GLU A CB 1 +ATOM 319 C CG . GLU A 1 34 ? -7.056 -8.084 16.443 1.00 24.30 ? ? ? ? ? ? 34 GLU A CG 1 +ATOM 320 C CD . GLU A 1 34 ? -7.025 -8.905 17.749 1.00 33.54 ? ? ? ? ? ? 34 GLU A CD 1 +ATOM 321 O OE1 . GLU A 1 34 ? -8.068 -9.169 18.379 1.00 35.23 ? ? ? ? ? ? 34 GLU A OE1 1 +ATOM 322 O OE2 . GLU A 1 34 ? -5.919 -9.262 18.145 1.00 34.97 ? ? ? ? ? ? 34 GLU A OE2 1 +ATOM 323 H H . GLU A 1 34 ? -8.257 -5.324 16.478 1.00 15.00 ? ? ? ? ? ? 34 GLU A H 1 +ATOM 324 N N . GLU A 1 35 ? -10.144 -7.918 13.360 1.00 15.87 ? ? ? ? ? ? 35 GLU A N 1 +ATOM 325 C CA . GLU A 1 35 ? -11.484 -8.118 12.720 1.00 20.76 ? ? ? ? ? ? 35 GLU A CA 1 +ATOM 326 C C . GLU A 1 35 ? -12.751 -7.880 13.549 1.00 19.68 ? ? ? ? ? ? 35 GLU A C 1 +ATOM 327 O O . GLU A 1 35 ? -13.089 -8.704 14.391 1.00 23.35 ? ? ? ? ? ? 35 GLU A O 1 +ATOM 328 C CB . GLU A 1 35 ? -11.714 -9.549 12.214 1.00 20.31 ? ? ? ? ? ? 35 GLU A CB 1 +ATOM 329 C CG . GLU A 1 35 ? -11.549 -9.697 10.718 1.00 30.20 ? ? ? ? ? ? 35 GLU A CG 1 +ATOM 330 C CD . GLU A 1 35 ? -12.383 -8.701 9.949 1.00 39.71 ? ? ? ? ? ? 35 GLU A CD 1 +ATOM 331 O OE1 . GLU A 1 35 ? -13.609 -8.709 10.089 1.00 43.68 ? ? ? ? ? ? 35 GLU A OE1 1 +ATOM 332 O OE2 . GLU A 1 35 ? -11.784 -7.927 9.198 1.00 46.22 ? ? ? ? ? ? 35 GLU A OE2 1 +ATOM 333 H H . GLU A 1 35 ? -9.364 -8.507 13.177 1.00 15.00 ? ? ? ? ? ? 35 GLU A H 1 +ATOM 334 N N . MET A 1 36 ? -13.447 -6.776 13.230 1.00 13.95 ? ? ? ? ? ? 36 MET A N 1 +ATOM 335 C CA . MET A 1 36 ? -14.799 -6.605 13.769 1.00 10.73 ? ? ? ? ? ? 36 MET A CA 1 +ATOM 336 C C . MET A 1 36 ? -15.834 -5.918 12.828 1.00 13.63 ? ? ? ? ? ? 36 MET A C 1 +ATOM 337 O O . MET A 1 36 ? -15.547 -5.316 11.794 1.00 11.97 ? ? ? ? ? ? 36 MET A O 1 +ATOM 338 C CB . MET A 1 36 ? -14.754 -5.925 15.136 1.00 6.21 ? ? ? ? ? ? 36 MET A CB 1 +ATOM 339 C CG . MET A 1 36 ? -14.475 -4.427 14.916 1.00 14.27 ? ? ? ? ? ? 36 MET A CG 1 +ATOM 340 S SD . MET A 1 36 ? -14.218 -3.469 16.396 1.00 15.34 ? ? ? ? ? ? 36 MET A SD 1 +ATOM 341 C CE . MET A 1 36 ? -15.640 -3.903 17.405 1.00 13.96 ? ? ? ? ? ? 36 MET A CE 1 +ATOM 342 H H . MET A 1 36 ? -13.002 -6.089 12.656 1.00 15.00 ? ? ? ? ? ? 36 MET A H 1 +ATOM 343 N N . ASN A 1 37 ? -17.086 -6.053 13.291 1.00 11.98 ? ? ? ? ? ? 37 ASN A N 1 +ATOM 344 C CA . ASN A 1 37 ? -18.179 -5.371 12.623 1.00 13.42 ? ? ? ? ? ? 37 ASN A CA 1 +ATOM 345 C C . ASN A 1 37 ? -18.578 -4.047 13.255 1.00 16.43 ? ? ? ? ? ? 37 ASN A C 1 +ATOM 346 O O . ASN A 1 37 ? -19.012 -3.954 14.394 1.00 16.51 ? ? ? ? ? ? 37 ASN A O 1 +ATOM 347 C CB . ASN A 1 37 ? -19.375 -6.301 12.537 1.00 16.24 ? ? ? ? ? ? 37 ASN A CB 1 +ATOM 348 C CG . ASN A 1 37 ? -18.994 -7.301 11.471 1.00 23.68 ? ? ? ? ? ? 37 ASN A CG 1 +ATOM 349 O OD1 . ASN A 1 37 ? -18.624 -6.954 10.357 1.00 32.36 ? ? ? ? ? ? 37 ASN A OD1 1 +ATOM 350 N ND2 . ASN A 1 37 ? -19.029 -8.579 11.848 1.00 18.92 ? ? ? ? ? ? 37 ASN A ND2 1 +ATOM 351 H H . ASN A 1 37 ? -17.210 -6.545 14.147 1.00 15.00 ? ? ? ? ? ? 37 ASN A H 1 +ATOM 352 H HD21 . ASN A 1 37 ? -18.634 -9.172 11.152 1.00 15.00 ? ? ? ? ? ? 37 ASN A HD21 1 +ATOM 353 H HD22 . ASN A 1 37 ? -19.424 -8.895 12.704 1.00 15.00 ? ? ? ? ? ? 37 ASN A HD22 1 +ATOM 354 N N . LEU A 1 38 ? -18.379 -3.018 12.440 1.00 16.56 ? ? ? ? ? ? 38 LEU A N 1 +ATOM 355 C CA . LEU A 1 38 ? -18.704 -1.681 12.902 1.00 15.78 ? ? ? ? ? ? 38 LEU A CA 1 +ATOM 356 C C . LEU A 1 38 ? -19.693 -1.009 11.938 1.00 19.85 ? ? ? ? ? ? 38 LEU A C 1 +ATOM 357 O O . LEU A 1 38 ? -19.680 -1.251 10.724 1.00 20.78 ? ? ? ? ? ? 38 LEU A O 1 +ATOM 358 C CB . LEU A 1 38 ? -17.348 -0.970 13.021 1.00 14.49 ? ? ? ? ? ? 38 LEU A CB 1 +ATOM 359 C CG . LEU A 1 38 ? -16.858 -0.246 14.307 1.00 8.64 ? ? ? ? ? ? 38 LEU A CG 1 +ATOM 360 C CD1 . LEU A 1 38 ? -17.074 -0.915 15.666 1.00 5.75 ? ? ? ? ? ? 38 LEU A CD1 1 +ATOM 361 C CD2 . LEU A 1 38 ? -15.366 -0.009 14.154 1.00 5.18 ? ? ? ? ? ? 38 LEU A CD2 1 +ATOM 362 H H . LEU A 1 38 ? -17.966 -3.206 11.549 1.00 15.00 ? ? ? ? ? ? 38 LEU A H 1 +ATOM 363 N N . PRO A 1 39 ? -20.594 -0.180 12.534 1.00 22.42 ? ? ? ? ? ? 39 PRO A N 1 +ATOM 364 C CA . PRO A 1 39 ? -21.611 0.588 11.771 1.00 26.77 ? ? ? ? ? ? 39 PRO A CA 1 +ATOM 365 C C . PRO A 1 39 ? -21.130 1.539 10.665 1.00 29.54 ? ? ? ? ? ? 39 PRO A C 1 +ATOM 366 O O . PRO A 1 39 ? -20.396 2.503 10.868 1.00 29.99 ? ? ? ? ? ? 39 PRO A O 1 +ATOM 367 C CB . PRO A 1 39 ? -22.332 1.421 12.823 1.00 24.85 ? ? ? ? ? ? 39 PRO A CB 1 +ATOM 368 C CG . PRO A 1 39 ? -22.072 0.681 14.122 1.00 28.76 ? ? ? ? ? ? 39 PRO A CG 1 +ATOM 369 C CD . PRO A 1 39 ? -20.699 0.052 13.959 1.00 21.86 ? ? ? ? ? ? 39 PRO A CD 1 +ATOM 370 N N . GLY A 1 40 ? -21.657 1.274 9.478 1.00 28.51 ? ? ? ? ? ? 40 GLY A N 1 +ATOM 371 C CA . GLY A 1 40 ? -21.516 2.378 8.526 1.00 28.87 ? ? ? ? ? ? 40 GLY A CA 1 +ATOM 372 C C . GLY A 1 40 ? -20.618 2.162 7.311 1.00 30.87 ? ? ? ? ? ? 40 GLY A C 1 +ATOM 373 O O . GLY A 1 40 ? -20.231 1.070 6.911 1.00 29.78 ? ? ? ? ? ? 40 GLY A O 1 +ATOM 374 H H . GLY A 1 40 ? -22.057 0.383 9.286 1.00 15.00 ? ? ? ? ? ? 40 GLY A H 1 +ATOM 375 N N . LYS A 1 41 ? -20.343 3.293 6.680 1.00 33.12 ? ? ? ? ? ? 41 LYS A N 1 +ATOM 376 C CA . LYS A 1 41 ? -19.625 3.137 5.415 1.00 37.91 ? ? ? ? ? ? 41 LYS A CA 1 +ATOM 377 C C . LYS A 1 41 ? -18.101 3.232 5.504 1.00 38.30 ? ? ? ? ? ? 41 LYS A C 1 +ATOM 378 O O . LYS A 1 41 ? -17.526 4.054 6.207 1.00 42.40 ? ? ? ? ? ? 41 LYS A O 1 +ATOM 379 C CB . LYS A 1 41 ? -20.195 4.083 4.341 1.00 41.89 ? ? ? ? ? ? 41 LYS A CB 1 +ATOM 380 C CG . LYS A 1 41 ? -21.035 3.347 3.297 1.00 42.36 ? ? ? ? ? ? 41 LYS A CG 1 +ATOM 381 C CD . LYS A 1 41 ? -20.669 3.854 1.902 1.00 48.74 ? ? ? ? ? ? 41 LYS A CD 1 +ATOM 382 C CE . LYS A 1 41 ? -21.210 3.011 0.734 1.00 51.48 ? ? ? ? ? ? 41 LYS A CE 1 +ATOM 383 N NZ . LYS A 1 41 ? -20.639 3.508 -0.530 1.00 50.33 ? ? ? ? ? ? 41 LYS A NZ 1 +ATOM 384 H H . LYS A 1 41 ? -20.527 4.159 7.137 1.00 15.00 ? ? ? ? ? ? 41 LYS A H 1 +ATOM 385 H HZ1 . LYS A 1 41 ? -20.796 4.534 -0.598 1.00 15.00 ? ? ? ? ? ? 41 LYS A HZ1 1 +ATOM 386 H HZ2 . LYS A 1 41 ? -19.617 3.316 -0.550 1.00 15.00 ? ? ? ? ? ? 41 LYS A HZ2 1 +ATOM 387 H HZ3 . LYS A 1 41 ? -21.094 3.036 -1.338 1.00 15.00 ? ? ? ? ? ? 41 LYS A HZ3 1 +ATOM 388 N N . TRP A 1 42 ? -17.466 2.327 4.774 1.00 34.90 ? ? ? ? ? ? 42 TRP A N 1 +ATOM 389 C CA . TRP A 1 42 ? -16.020 2.225 4.935 1.00 30.92 ? ? ? ? ? ? 42 TRP A CA 1 +ATOM 390 C C . TRP A 1 42 ? -15.259 2.241 3.615 1.00 33.72 ? ? ? ? ? ? 42 TRP A C 1 +ATOM 391 O O . TRP A 1 42 ? -15.677 1.739 2.572 1.00 35.04 ? ? ? ? ? ? 42 TRP A O 1 +ATOM 392 C CB . TRP A 1 42 ? -15.640 0.985 5.734 1.00 24.59 ? ? ? ? ? ? 42 TRP A CB 1 +ATOM 393 C CG . TRP A 1 42 ? -16.258 -0.178 5.014 1.00 26.07 ? ? ? ? ? ? 42 TRP A CG 1 +ATOM 394 C CD1 . TRP A 1 42 ? -17.588 -0.603 5.142 1.00 27.36 ? ? ? ? ? ? 42 TRP A CD1 1 +ATOM 395 C CD2 . TRP A 1 42 ? -15.682 -1.014 3.985 1.00 28.61 ? ? ? ? ? ? 42 TRP A CD2 1 +ATOM 396 N NE1 . TRP A 1 42 ? -17.863 -1.611 4.282 1.00 31.74 ? ? ? ? ? ? 42 TRP A NE1 1 +ATOM 397 C CE2 . TRP A 1 42 ? -16.714 -1.914 3.550 1.00 31.16 ? ? ? ? ? ? 42 TRP A CE2 1 +ATOM 398 C CE3 . TRP A 1 42 ? -14.401 -1.100 3.396 1.00 28.02 ? ? ? ? ? ? 42 TRP A CE3 1 +ATOM 399 C CZ2 . TRP A 1 42 ? -16.443 -2.867 2.537 1.00 24.44 ? ? ? ? ? ? 42 TRP A CZ2 1 +ATOM 400 C CZ3 . TRP A 1 42 ? -14.145 -2.056 2.386 1.00 22.00 ? ? ? ? ? ? 42 TRP A CZ3 1 +ATOM 401 C CH2 . TRP A 1 42 ? -15.154 -2.938 1.967 1.00 21.98 ? ? ? ? ? ? 42 TRP A CH2 1 +ATOM 402 H H . TRP A 1 42 ? -17.981 1.727 4.167 1.00 15.00 ? ? ? ? ? ? 42 TRP A H 1 +ATOM 403 H HE1 . TRP A 1 42 ? -18.729 -2.063 4.206 1.00 15.00 ? ? ? ? ? ? 42 TRP A HE1 1 +ATOM 404 N N . LYS A 1 43 ? -14.085 2.847 3.741 1.00 32.75 ? ? ? ? ? ? 43 LYS A N 1 +ATOM 405 C CA . LYS A 1 43 ? -13.177 2.907 2.604 1.00 30.62 ? ? ? ? ? ? 43 LYS A CA 1 +ATOM 406 C C . LYS A 1 43 ? -12.023 1.867 2.694 1.00 27.14 ? ? ? ? ? ? 43 LYS A C 1 +ATOM 407 O O . LYS A 1 43 ? -11.369 1.726 3.716 1.00 22.53 ? ? ? ? ? ? 43 LYS A O 1 +ATOM 408 C CB . LYS A 1 43 ? -12.716 4.372 2.591 1.00 33.09 ? ? ? ? ? ? 43 LYS A CB 1 +ATOM 409 C CG . LYS A 1 43 ? -11.786 4.732 1.446 1.00 41.34 ? ? ? ? ? ? 43 LYS A CG 1 +ATOM 410 C CD . LYS A 1 43 ? -10.974 5.998 1.713 1.00 49.18 ? ? ? ? ? ? 43 LYS A CD 1 +ATOM 411 C CE . LYS A 1 43 ? -9.514 5.868 1.216 1.00 54.01 ? ? ? ? ? ? 43 LYS A CE 1 +ATOM 412 N NZ . LYS A 1 43 ? -8.786 4.797 1.932 1.00 50.64 ? ? ? ? ? ? 43 LYS A NZ 1 +ATOM 413 H H . LYS A 1 43 ? -13.846 3.198 4.649 1.00 15.00 ? ? ? ? ? ? 43 LYS A H 1 +ATOM 414 H HZ1 . LYS A 1 43 ? -8.763 5.005 2.951 1.00 15.00 ? ? ? ? ? ? 43 LYS A HZ1 1 +ATOM 415 H HZ2 . LYS A 1 43 ? -9.264 3.887 1.778 1.00 15.00 ? ? ? ? ? ? 43 LYS A HZ2 1 +ATOM 416 H HZ3 . LYS A 1 43 ? -7.812 4.735 1.574 1.00 15.00 ? ? ? ? ? ? 43 LYS A HZ3 1 +ATOM 417 N N . PRO A 1 44 ? -11.769 1.125 1.599 1.00 23.46 ? ? ? ? ? ? 44 PRO A N 1 +ATOM 418 C CA . PRO A 1 44 ? -10.508 0.364 1.498 1.00 23.08 ? ? ? ? ? ? 44 PRO A CA 1 +ATOM 419 C C . PRO A 1 44 ? -9.215 1.173 1.381 1.00 22.15 ? ? ? ? ? ? 44 PRO A C 1 +ATOM 420 O O . PRO A 1 44 ? -9.090 2.205 0.739 1.00 18.72 ? ? ? ? ? ? 44 PRO A O 1 +ATOM 421 C CB . PRO A 1 44 ? -10.712 -0.506 0.266 1.00 23.78 ? ? ? ? ? ? 44 PRO A CB 1 +ATOM 422 C CG . PRO A 1 44 ? -11.689 0.298 -0.581 1.00 24.22 ? ? ? ? ? ? 44 PRO A CG 1 +ATOM 423 C CD . PRO A 1 44 ? -12.609 0.980 0.436 1.00 23.63 ? ? ? ? ? ? 44 PRO A CD 1 +ATOM 424 N N . LYS A 1 45 ? -8.216 0.598 2.050 1.00 25.28 ? ? ? ? ? ? 45 LYS A N 1 +ATOM 425 C CA . LYS A 1 45 ? -6.884 1.223 2.149 1.00 23.40 ? ? ? ? ? ? 45 LYS A CA 1 +ATOM 426 C C . LYS A 1 45 ? -5.758 0.172 2.280 1.00 20.00 ? ? ? ? ? ? 45 LYS A C 1 +ATOM 427 O O . LYS A 1 45 ? -5.897 -0.785 3.026 1.00 20.10 ? ? ? ? ? ? 45 LYS A O 1 +ATOM 428 C CB . LYS A 1 45 ? -6.924 2.167 3.363 1.00 21.78 ? ? ? ? ? ? 45 LYS A CB 1 +ATOM 429 C CG . LYS A 1 45 ? -5.932 3.322 3.377 1.00 24.75 ? ? ? ? ? ? 45 LYS A CG 1 +ATOM 430 C CD . LYS A 1 45 ? -5.897 3.959 4.769 1.00 35.26 ? ? ? ? ? ? 45 LYS A CD 1 +ATOM 431 C CE . LYS A 1 45 ? -5.082 5.271 4.942 1.00 38.29 ? ? ? ? ? ? 45 LYS A CE 1 +ATOM 432 N NZ . LYS A 1 45 ? -5.054 5.680 6.371 1.00 38.89 ? ? ? ? ? ? 45 LYS A NZ 1 +ATOM 433 H H . LYS A 1 45 ? -8.468 -0.179 2.630 1.00 15.00 ? ? ? ? ? ? 45 LYS A H 1 +ATOM 434 H HZ1 . LYS A 1 45 ? -4.624 4.919 6.935 1.00 15.00 ? ? ? ? ? ? 45 LYS A HZ1 1 +ATOM 435 H HZ2 . LYS A 1 45 ? -4.492 6.549 6.476 1.00 15.00 ? ? ? ? ? ? 45 LYS A HZ2 1 +ATOM 436 H HZ3 . LYS A 1 45 ? -6.024 5.850 6.706 1.00 15.00 ? ? ? ? ? ? 45 LYS A HZ3 1 +ATOM 437 N N . MET A 1 46 ? -4.644 0.367 1.567 1.00 20.42 ? ? ? ? ? ? 46 MET A N 1 +ATOM 438 C CA . MET A 1 46 ? -3.404 -0.401 1.915 1.00 22.45 ? ? ? ? ? ? 46 MET A CA 1 +ATOM 439 C C . MET A 1 46 ? -2.345 0.337 2.775 1.00 22.01 ? ? ? ? ? ? 46 MET A C 1 +ATOM 440 O O . MET A 1 46 ? -1.871 1.427 2.447 1.00 22.84 ? ? ? ? ? ? 46 MET A O 1 +ATOM 441 C CB . MET A 1 46 ? -2.621 -0.857 0.685 1.00 21.43 ? ? ? ? ? ? 46 MET A CB 1 +ATOM 442 C CG . MET A 1 46 ? -3.433 -1.507 -0.429 1.00 26.00 ? ? ? ? ? ? 46 MET A CG 1 +ATOM 443 S SD . MET A 1 46 ? -3.572 -3.280 -0.248 1.00 33.71 ? ? ? ? ? ? 46 MET A SD 1 +ATOM 444 C CE . MET A 1 46 ? -1.806 -3.607 -0.201 1.00 33.67 ? ? ? ? ? ? 46 MET A CE 1 +ATOM 445 H H . MET A 1 46 ? -4.635 1.130 0.924 1.00 15.00 ? ? ? ? ? ? 46 MET A H 1 +ATOM 446 N N . ILE A 1 47 ? -1.967 -0.307 3.889 1.00 19.66 ? ? ? ? ? ? 47 ILE A N 1 +ATOM 447 C CA . ILE A 1 47 ? -0.898 0.272 4.742 1.00 13.85 ? ? ? ? ? ? 47 ILE A CA 1 +ATOM 448 C C . ILE A 1 47 ? 0.461 -0.453 4.862 1.00 10.43 ? ? ? ? ? ? 47 ILE A C 1 +ATOM 449 O O . ILE A 1 47 ? 0.579 -1.641 5.090 1.00 13.68 ? ? ? ? ? ? 47 ILE A O 1 +ATOM 450 C CB . ILE A 1 47 ? -1.466 0.587 6.123 1.00 13.67 ? ? ? ? ? ? 47 ILE A CB 1 +ATOM 451 C CG1 . ILE A 1 47 ? -1.712 -0.683 6.942 1.00 10.96 ? ? ? ? ? ? 47 ILE A CG1 1 +ATOM 452 C CG2 . ILE A 1 47 ? -2.734 1.446 5.944 1.00 9.75 ? ? ? ? ? ? 47 ILE A CG2 1 +ATOM 453 C CD1 . ILE A 1 47 ? -1.279 -0.564 8.399 1.00 9.43 ? ? ? ? ? ? 47 ILE A CD1 1 +ATOM 454 H H . ILE A 1 47 ? -2.401 -1.189 4.069 1.00 15.00 ? ? ? ? ? ? 47 ILE A H 1 +ATOM 455 N N . GLY A 1 48 ? 1.541 0.287 4.685 1.00 12.48 ? ? ? ? ? ? 48 GLY A N 1 +ATOM 456 C CA . GLY A 1 48 ? 2.810 -0.455 4.774 1.00 10.79 ? ? ? ? ? ? 48 GLY A CA 1 +ATOM 457 C C . GLY A 1 48 ? 3.501 -0.450 6.124 1.00 8.62 ? ? ? ? ? ? 48 GLY A C 1 +ATOM 458 O O . GLY A 1 48 ? 3.690 0.611 6.685 1.00 10.71 ? ? ? ? ? ? 48 GLY A O 1 +ATOM 459 H H . GLY A 1 48 ? 1.467 1.275 4.566 1.00 15.00 ? ? ? ? ? ? 48 GLY A H 1 +ATOM 460 N N . GLY A 1 49 ? 3.872 -1.638 6.630 1.00 9.15 ? ? ? ? ? ? 49 GLY A N 1 +ATOM 461 C CA . GLY A 1 49 ? 4.667 -1.717 7.878 1.00 8.64 ? ? ? ? ? ? 49 GLY A CA 1 +ATOM 462 C C . GLY A 1 49 ? 6.032 -2.371 7.671 1.00 13.08 ? ? ? ? ? ? 49 GLY A C 1 +ATOM 463 O O . GLY A 1 49 ? 6.401 -2.675 6.548 1.00 11.27 ? ? ? ? ? ? 49 GLY A O 1 +ATOM 464 H H . GLY A 1 49 ? 3.656 -2.448 6.091 1.00 15.00 ? ? ? ? ? ? 49 GLY A H 1 +ATOM 465 N N . ILE A 1 50 ? 6.824 -2.604 8.737 1.00 16.21 ? ? ? ? ? ? 50 ILE A N 1 +ATOM 466 C CA . ILE A 1 50 ? 8.168 -3.023 8.290 1.00 18.38 ? ? ? ? ? ? 50 ILE A CA 1 +ATOM 467 C C . ILE A 1 50 ? 8.324 -4.364 7.545 1.00 19.29 ? ? ? ? ? ? 50 ILE A C 1 +ATOM 468 O O . ILE A 1 50 ? 9.159 -4.511 6.670 1.00 21.57 ? ? ? ? ? ? 50 ILE A O 1 +ATOM 469 C CB . ILE A 1 50 ? 9.340 -2.791 9.305 1.00 19.61 ? ? ? ? ? ? 50 ILE A CB 1 +ATOM 470 C CG1 . ILE A 1 50 ? 9.950 -4.057 9.888 1.00 21.42 ? ? ? ? ? ? 50 ILE A CG1 1 +ATOM 471 C CG2 . ILE A 1 50 ? 9.056 -1.788 10.438 1.00 13.44 ? ? ? ? ? ? 50 ILE A CG2 1 +ATOM 472 C CD1 . ILE A 1 50 ? 11.321 -3.759 10.485 1.00 27.01 ? ? ? ? ? ? 50 ILE A CD1 1 +ATOM 473 H H . ILE A 1 50 ? 6.487 -2.493 9.676 1.00 15.00 ? ? ? ? ? ? 50 ILE A H 1 +ATOM 474 N N . GLY A 1 51 ? 7.463 -5.341 7.897 1.00 19.71 ? ? ? ? ? ? 51 GLY A N 1 +ATOM 475 C CA . GLY A 1 51 ? 7.553 -6.613 7.154 1.00 14.98 ? ? ? ? ? ? 51 GLY A CA 1 +ATOM 476 C C . GLY A 1 51 ? 6.710 -6.733 5.871 1.00 14.89 ? ? ? ? ? ? 51 GLY A C 1 +ATOM 477 O O . GLY A 1 51 ? 6.612 -7.796 5.302 1.00 15.83 ? ? ? ? ? ? 51 GLY A O 1 +ATOM 478 H H . GLY A 1 51 ? 6.725 -5.156 8.547 1.00 15.00 ? ? ? ? ? ? 51 GLY A H 1 +ATOM 479 N N . GLY A 1 52 ? 6.075 -5.619 5.421 1.00 18.52 ? ? ? ? ? ? 52 GLY A N 1 +ATOM 480 C CA . GLY A 1 52 ? 5.285 -5.622 4.169 1.00 13.59 ? ? ? ? ? ? 52 GLY A CA 1 +ATOM 481 C C . GLY A 1 52 ? 3.992 -4.783 4.145 1.00 13.84 ? ? ? ? ? ? 52 GLY A C 1 +ATOM 482 O O . GLY A 1 52 ? 3.774 -3.944 5.001 1.00 14.07 ? ? ? ? ? ? 52 GLY A O 1 +ATOM 483 H H . GLY A 1 52 ? 6.253 -4.766 5.912 1.00 15.00 ? ? ? ? ? ? 52 GLY A H 1 +ATOM 484 N N . PHE A 1 53 ? 3.129 -5.045 3.137 1.00 15.75 ? ? ? ? ? ? 53 PHE A N 1 +ATOM 485 C CA . PHE A 1 53 ? 1.825 -4.369 2.984 1.00 17.32 ? ? ? ? ? ? 53 PHE A CA 1 +ATOM 486 C C . PHE A 1 53 ? 0.629 -5.087 3.565 1.00 23.07 ? ? ? ? ? ? 53 PHE A C 1 +ATOM 487 O O . PHE A 1 53 ? 0.349 -6.209 3.169 1.00 29.18 ? ? ? ? ? ? 53 PHE A O 1 +ATOM 488 C CB . PHE A 1 53 ? 1.380 -4.225 1.535 1.00 15.75 ? ? ? ? ? ? 53 PHE A CB 1 +ATOM 489 C CG . PHE A 1 53 ? 1.930 -2.972 0.914 1.00 17.91 ? ? ? ? ? ? 53 PHE A CG 1 +ATOM 490 C CD1 . PHE A 1 53 ? 1.601 -1.710 1.440 1.00 23.67 ? ? ? ? ? ? 53 PHE A CD1 1 +ATOM 491 C CD2 . PHE A 1 53 ? 2.811 -3.091 -0.166 1.00 21.23 ? ? ? ? ? ? 53 PHE A CD2 1 +ATOM 492 C CE1 . PHE A 1 53 ? 2.265 -0.559 0.964 1.00 25.07 ? ? ? ? ? ? 53 PHE A CE1 1 +ATOM 493 C CE2 . PHE A 1 53 ? 3.469 -1.951 -0.659 1.00 24.15 ? ? ? ? ? ? 53 PHE A CE2 1 +ATOM 494 C CZ . PHE A 1 53 ? 3.232 -0.704 -0.047 1.00 26.52 ? ? ? ? ? ? 53 PHE A CZ 1 +ATOM 495 H H . PHE A 1 53 ? 3.394 -5.798 2.536 1.00 15.00 ? ? ? ? ? ? 53 PHE A H 1 +ATOM 496 N N . ILE A 1 54 ? -0.129 -4.404 4.444 1.00 22.84 ? ? ? ? ? ? 54 ILE A N 1 +ATOM 497 C CA . ILE A 1 54 ? -1.485 -4.944 4.682 1.00 19.56 ? ? ? ? ? ? 54 ILE A CA 1 +ATOM 498 C C . ILE A 1 54 ? -2.705 -4.183 4.103 1.00 20.37 ? ? ? ? ? ? 54 ILE A C 1 +ATOM 499 O O . ILE A 1 54 ? -2.698 -3.007 3.755 1.00 21.02 ? ? ? ? ? ? 54 ILE A O 1 +ATOM 500 C CB . ILE A 1 54 ? -1.731 -5.333 6.163 1.00 18.04 ? ? ? ? ? ? 54 ILE A CB 1 +ATOM 501 C CG1 . ILE A 1 54 ? -1.860 -4.152 7.112 1.00 14.47 ? ? ? ? ? ? 54 ILE A CG1 1 +ATOM 502 C CG2 . ILE A 1 54 ? -0.682 -6.319 6.686 1.00 12.60 ? ? ? ? ? ? 54 ILE A CG2 1 +ATOM 503 C CD1 . ILE A 1 54 ? -2.069 -4.596 8.565 1.00 17.81 ? ? ? ? ? ? 54 ILE A CD1 1 +ATOM 504 H H . ILE A 1 54 ? 0.185 -3.510 4.767 1.00 15.00 ? ? ? ? ? ? 54 ILE A H 1 +ATOM 505 N N . LYS A 1 55 ? -3.800 -4.939 4.016 1.00 19.34 ? ? ? ? ? ? 55 LYS A N 1 +ATOM 506 C CA . LYS A 1 55 ? -5.043 -4.305 3.566 1.00 18.48 ? ? ? ? ? ? 55 LYS A CA 1 +ATOM 507 C C . LYS A 1 55 ? -6.107 -4.126 4.665 1.00 17.27 ? ? ? ? ? ? 55 LYS A C 1 +ATOM 508 O O . LYS A 1 55 ? -6.276 -4.956 5.550 1.00 14.14 ? ? ? ? ? ? 55 LYS A O 1 +ATOM 509 C CB . LYS A 1 55 ? -5.582 -5.052 2.347 1.00 22.23 ? ? ? ? ? ? 55 LYS A CB 1 +ATOM 510 C CG . LYS A 1 55 ? -6.899 -4.551 1.755 1.00 33.21 ? ? ? ? ? ? 55 LYS A CG 1 +ATOM 511 C CD . LYS A 1 55 ? -7.404 -5.499 0.663 1.00 43.72 ? ? ? ? ? ? 55 LYS A CD 1 +ATOM 512 C CE . LYS A 1 55 ? -8.898 -5.297 0.373 1.00 50.72 ? ? ? ? ? ? 55 LYS A CE 1 +ATOM 513 N NZ . LYS A 1 55 ? -9.336 -6.204 -0.702 1.00 52.98 ? ? ? ? ? ? 55 LYS A NZ 1 +ATOM 514 H H . LYS A 1 55 ? -3.763 -5.884 4.331 1.00 15.00 ? ? ? ? ? ? 55 LYS A H 1 +ATOM 515 H HZ1 . LYS A 1 55 ? -9.059 -7.180 -0.474 1.00 15.00 ? ? ? ? ? ? 55 LYS A HZ1 1 +ATOM 516 H HZ2 . LYS A 1 55 ? -10.370 -6.152 -0.805 1.00 15.00 ? ? ? ? ? ? 55 LYS A HZ2 1 +ATOM 517 H HZ3 . LYS A 1 55 ? -8.888 -5.919 -1.596 1.00 15.00 ? ? ? ? ? ? 55 LYS A HZ3 1 +ATOM 518 N N . VAL A 1 56 ? -6.764 -2.942 4.573 1.00 18.67 ? ? ? ? ? ? 56 VAL A N 1 +ATOM 519 C CA . VAL A 1 56 ? -7.550 -2.360 5.673 1.00 12.05 ? ? ? ? ? ? 56 VAL A CA 1 +ATOM 520 C C . VAL A 1 56 ? -8.917 -1.786 5.308 1.00 8.82 ? ? ? ? ? ? 56 VAL A C 1 +ATOM 521 O O . VAL A 1 56 ? -9.168 -1.353 4.196 1.00 11.63 ? ? ? ? ? ? 56 VAL A O 1 +ATOM 522 C CB . VAL A 1 56 ? -6.603 -1.392 6.391 1.00 7.83 ? ? ? ? ? ? 56 VAL A CB 1 +ATOM 523 C CG1 . VAL A 1 56 ? -6.834 0.091 6.224 1.00 2.00 ? ? ? ? ? ? 56 VAL A CG1 1 +ATOM 524 C CG2 . VAL A 1 56 ? -6.395 -1.903 7.799 1.00 6.80 ? ? ? ? ? ? 56 VAL A CG2 1 +ATOM 525 H H . VAL A 1 56 ? -6.551 -2.385 3.770 1.00 15.00 ? ? ? ? ? ? 56 VAL A H 1 +ATOM 526 N N . ARG A 1 57 ? -9.815 -1.814 6.286 1.00 10.78 ? ? ? ? ? ? 57 ARG A N 1 +ATOM 527 C CA . ARG A 1 57 ? -11.066 -1.048 6.164 1.00 8.48 ? ? ? ? ? ? 57 ARG A CA 1 +ATOM 528 C C . ARG A 1 57 ? -11.091 0.197 7.039 1.00 8.76 ? ? ? ? ? ? 57 ARG A C 1 +ATOM 529 O O . ARG A 1 57 ? -11.111 0.145 8.266 1.00 8.67 ? ? ? ? ? ? 57 ARG A O 1 +ATOM 530 C CB . ARG A 1 57 ? -12.279 -1.893 6.531 1.00 7.92 ? ? ? ? ? ? 57 ARG A CB 1 +ATOM 531 C CG . ARG A 1 57 ? -12.585 -3.018 5.549 1.00 9.23 ? ? ? ? ? ? 57 ARG A CG 1 +ATOM 532 C CD . ARG A 1 57 ? -13.825 -3.819 5.947 1.00 12.88 ? ? ? ? ? ? 57 ARG A CD 1 +ATOM 533 N NE . ARG A 1 57 ? -13.522 -4.972 6.797 1.00 19.41 ? ? ? ? ? ? 57 ARG A NE 1 +ATOM 534 C CZ . ARG A 1 57 ? -14.057 -5.084 8.049 1.00 28.57 ? ? ? ? ? ? 57 ARG A CZ 1 +ATOM 535 N NH1 . ARG A 1 57 ? -14.670 -4.055 8.653 1.00 29.23 ? ? ? ? ? ? 57 ARG A NH1 1 +ATOM 536 N NH2 . ARG A 1 57 ? -14.002 -6.251 8.702 1.00 25.99 ? ? ? ? ? ? 57 ARG A NH2 1 +ATOM 537 H H . ARG A 1 57 ? -9.580 -2.337 7.110 1.00 15.00 ? ? ? ? ? ? 57 ARG A H 1 +ATOM 538 H HE . ARG A 1 57 ? -13.012 -5.747 6.424 1.00 15.00 ? ? ? ? ? ? 57 ARG A HE 1 +ATOM 539 H HH11 . ARG A 1 57 ? -14.734 -3.165 8.198 1.00 15.00 ? ? ? ? ? ? 57 ARG A HH11 1 +ATOM 540 H HH12 . ARG A 1 57 ? -15.067 -4.176 9.562 1.00 15.00 ? ? ? ? ? ? 57 ARG A HH12 1 +ATOM 541 H HH21 . ARG A 1 57 ? -13.559 -7.042 8.279 1.00 15.00 ? ? ? ? ? ? 57 ARG A HH21 1 +ATOM 542 H HH22 . ARG A 1 57 ? -14.403 -6.332 9.613 1.00 15.00 ? ? ? ? ? ? 57 ARG A HH22 1 +ATOM 543 N N . GLN A 1 58 ? -11.083 1.339 6.349 1.00 9.36 ? ? ? ? ? ? 58 GLN A N 1 +ATOM 544 C CA . GLN A 1 58 ? -11.207 2.635 7.013 1.00 7.13 ? ? ? ? ? ? 58 GLN A CA 1 +ATOM 545 C C . GLN A 1 58 ? -12.595 3.074 7.512 1.00 7.78 ? ? ? ? ? ? 58 GLN A C 1 +ATOM 546 O O . GLN A 1 58 ? -13.454 3.367 6.691 1.00 9.82 ? ? ? ? ? ? 58 GLN A O 1 +ATOM 547 C CB . GLN A 1 58 ? -10.584 3.683 6.087 1.00 9.03 ? ? ? ? ? ? 58 GLN A CB 1 +ATOM 548 C CG . GLN A 1 58 ? -10.344 5.049 6.766 1.00 15.66 ? ? ? ? ? ? 58 GLN A CG 1 +ATOM 549 C CD . GLN A 1 58 ? -9.510 5.977 5.891 1.00 16.91 ? ? ? ? ? ? 58 GLN A CD 1 +ATOM 550 O OE1 . GLN A 1 58 ? -9.023 5.669 4.822 1.00 22.25 ? ? ? ? ? ? 58 GLN A OE1 1 +ATOM 551 N NE2 . GLN A 1 58 ? -9.320 7.175 6.380 1.00 13.90 ? ? ? ? ? ? 58 GLN A NE2 1 +ATOM 552 H H . GLN A 1 58 ? -10.980 1.249 5.365 1.00 15.00 ? ? ? ? ? ? 58 GLN A H 1 +ATOM 553 H HE21 . GLN A 1 58 ? -8.751 7.678 5.735 1.00 15.00 ? ? ? ? ? ? 58 GLN A HE21 1 +ATOM 554 H HE22 . GLN A 1 58 ? -9.668 7.526 7.238 1.00 15.00 ? ? ? ? ? ? 58 GLN A HE22 1 +ATOM 555 N N . TYR A 1 59 ? -12.765 3.179 8.860 1.00 4.58 ? ? ? ? ? ? 59 TYR A N 1 +ATOM 556 C CA . TYR A 1 59 ? -13.942 3.885 9.422 1.00 5.07 ? ? ? ? ? ? 59 TYR A CA 1 +ATOM 557 C C . TYR A 1 59 ? -13.682 5.245 10.081 1.00 7.84 ? ? ? ? ? ? 59 TYR A C 1 +ATOM 558 O O . TYR A 1 59 ? -12.843 5.379 10.961 1.00 10.41 ? ? ? ? ? ? 59 TYR A O 1 +ATOM 559 C CB . TYR A 1 59 ? -14.720 3.072 10.477 1.00 5.28 ? ? ? ? ? ? 59 TYR A CB 1 +ATOM 560 C CG . TYR A 1 59 ? -15.178 1.717 9.985 1.00 7.61 ? ? ? ? ? ? 59 TYR A CG 1 +ATOM 561 C CD1 . TYR A 1 59 ? -16.429 1.595 9.367 1.00 7.43 ? ? ? ? ? ? 59 TYR A CD1 1 +ATOM 562 C CD2 . TYR A 1 59 ? -14.333 0.601 10.167 1.00 15.35 ? ? ? ? ? ? 59 TYR A CD2 1 +ATOM 563 C CE1 . TYR A 1 59 ? -16.870 0.332 8.951 1.00 10.12 ? ? ? ? ? ? 59 TYR A CE1 1 +ATOM 564 C CE2 . TYR A 1 59 ? -14.755 -0.666 9.736 1.00 16.82 ? ? ? ? ? ? 59 TYR A CE2 1 +ATOM 565 C CZ . TYR A 1 59 ? -16.046 -0.793 9.181 1.00 16.20 ? ? ? ? ? ? 59 TYR A CZ 1 +ATOM 566 O OH . TYR A 1 59 ? -16.537 -2.052 8.909 1.00 15.62 ? ? ? ? ? ? 59 TYR A OH 1 +ATOM 567 H H . TYR A 1 59 ? -12.060 2.784 9.452 1.00 15.00 ? ? ? ? ? ? 59 TYR A H 1 +ATOM 568 H HH . TYR A 1 59 ? -17.463 -1.979 8.709 1.00 15.00 ? ? ? ? ? ? 59 TYR A HH 1 +ATOM 569 N N . ASP A 1 60 ? -14.420 6.280 9.634 1.00 8.33 ? ? ? ? ? ? 60 ASP A N 1 +ATOM 570 C CA . ASP A 1 60 ? -14.201 7.632 10.191 1.00 8.94 ? ? ? ? ? ? 60 ASP A CA 1 +ATOM 571 C C . ASP A 1 60 ? -15.146 8.076 11.297 1.00 12.12 ? ? ? ? ? ? 60 ASP A C 1 +ATOM 572 O O . ASP A 1 60 ? -16.218 7.526 11.443 1.00 12.98 ? ? ? ? ? ? 60 ASP A O 1 +ATOM 573 C CB . ASP A 1 60 ? -14.214 8.715 9.106 1.00 7.49 ? ? ? ? ? ? 60 ASP A CB 1 +ATOM 574 C CG . ASP A 1 60 ? -13.268 8.367 7.959 1.00 11.05 ? ? ? ? ? ? 60 ASP A CG 1 +ATOM 575 O OD1 . ASP A 1 60 ? -12.124 7.999 8.231 1.00 19.89 ? ? ? ? ? ? 60 ASP A OD1 1 +ATOM 576 O OD2 . ASP A 1 60 ? -13.668 8.458 6.796 1.00 11.72 ? ? ? ? ? ? 60 ASP A OD2 1 +ATOM 577 H H . ASP A 1 60 ? -15.187 6.059 9.035 1.00 15.00 ? ? ? ? ? ? 60 ASP A H 1 +ATOM 578 N N . GLN A 1 61 ? -14.742 9.086 12.089 1.00 13.98 ? ? ? ? ? ? 61 GLN A N 1 +ATOM 579 C CA . GLN A 1 61 ? -15.664 9.514 13.179 1.00 16.08 ? ? ? ? ? ? 61 GLN A CA 1 +ATOM 580 C C . GLN A 1 61 ? -16.363 8.514 14.188 1.00 14.69 ? ? ? ? ? ? 61 GLN A C 1 +ATOM 581 O O . GLN A 1 61 ? -17.532 8.604 14.552 1.00 13.55 ? ? ? ? ? ? 61 GLN A O 1 +ATOM 582 C CB . GLN A 1 61 ? -16.653 10.548 12.637 1.00 19.49 ? ? ? ? ? ? 61 GLN A CB 1 +ATOM 583 C CG . GLN A 1 61 ? -16.031 11.796 11.980 1.00 30.71 ? ? ? ? ? ? 61 GLN A CG 1 +ATOM 584 C CD . GLN A 1 61 ? -15.203 12.627 12.959 1.00 36.70 ? ? ? ? ? ? 61 GLN A CD 1 +ATOM 585 O OE1 . GLN A 1 61 ? -15.341 12.589 14.170 1.00 40.08 ? ? ? ? ? ? 61 GLN A OE1 1 +ATOM 586 N NE2 . GLN A 1 61 ? -14.260 13.384 12.397 1.00 36.53 ? ? ? ? ? ? 61 GLN A NE2 1 +ATOM 587 H H . GLN A 1 61 ? -13.853 9.505 11.941 1.00 15.00 ? ? ? ? ? ? 61 GLN A H 1 +ATOM 588 H HE21 . GLN A 1 61 ? -13.744 13.870 13.098 1.00 15.00 ? ? ? ? ? ? 61 GLN A HE21 1 +ATOM 589 H HE22 . GLN A 1 61 ? -14.115 13.472 11.420 1.00 15.00 ? ? ? ? ? ? 61 GLN A HE22 1 +ATOM 590 N N . ILE A 1 62 ? -15.544 7.560 14.664 1.00 10.58 ? ? ? ? ? ? 62 ILE A N 1 +ATOM 591 C CA . ILE A 1 62 ? -15.963 6.587 15.673 1.00 8.91 ? ? ? ? ? ? 62 ILE A CA 1 +ATOM 592 C C . ILE A 1 62 ? -15.545 6.958 17.114 1.00 12.94 ? ? ? ? ? ? 62 ILE A C 1 +ATOM 593 O O . ILE A 1 62 ? -14.431 7.393 17.403 1.00 10.33 ? ? ? ? ? ? 62 ILE A O 1 +ATOM 594 C CB . ILE A 1 62 ? -15.376 5.225 15.295 1.00 4.78 ? ? ? ? ? ? 62 ILE A CB 1 +ATOM 595 C CG1 . ILE A 1 62 ? -15.670 4.782 13.852 1.00 5.50 ? ? ? ? ? ? 62 ILE A CG1 1 +ATOM 596 C CG2 . ILE A 1 62 ? -15.760 4.140 16.303 1.00 2.00 ? ? ? ? ? ? 62 ILE A CG2 1 +ATOM 597 C CD1 . ILE A 1 62 ? -17.080 4.296 13.470 1.00 6.02 ? ? ? ? ? ? 62 ILE A CD1 1 +ATOM 598 H H . ILE A 1 62 ? -14.604 7.557 14.327 1.00 15.00 ? ? ? ? ? ? 62 ILE A H 1 +ATOM 599 N N . PRO A 1 63 ? -16.523 6.806 18.041 1.00 14.35 ? ? ? ? ? ? 63 PRO A N 1 +ATOM 600 C CA . PRO A 1 63 ? -16.248 7.063 19.462 1.00 11.42 ? ? ? ? ? ? 63 PRO A CA 1 +ATOM 601 C C . PRO A 1 63 ? -15.550 5.916 20.180 1.00 13.82 ? ? ? ? ? ? 63 PRO A C 1 +ATOM 602 O O . PRO A 1 63 ? -16.004 4.771 20.218 1.00 13.36 ? ? ? ? ? ? 63 PRO A O 1 +ATOM 603 C CB . PRO A 1 63 ? -17.636 7.378 20.025 1.00 7.57 ? ? ? ? ? ? 63 PRO A CB 1 +ATOM 604 C CG . PRO A 1 63 ? -18.554 7.567 18.809 1.00 9.23 ? ? ? ? ? ? 63 PRO A CG 1 +ATOM 605 C CD . PRO A 1 63 ? -17.942 6.610 17.786 1.00 14.61 ? ? ? ? ? ? 63 PRO A CD 1 +ATOM 606 N N . VAL A 1 64 ? -14.379 6.277 20.750 1.00 12.69 ? ? ? ? ? ? 64 VAL A N 1 +ATOM 607 C CA . VAL A 1 64 ? -13.736 5.312 21.632 1.00 9.70 ? ? ? ? ? ? 64 VAL A CA 1 +ATOM 608 C C . VAL A 1 64 ? -13.381 5.801 23.031 1.00 8.20 ? ? ? ? ? ? 64 VAL A C 1 +ATOM 609 O O . VAL A 1 64 ? -13.052 6.949 23.305 1.00 8.01 ? ? ? ? ? ? 64 VAL A O 1 +ATOM 610 C CB . VAL A 1 64 ? -12.654 4.392 20.936 1.00 9.79 ? ? ? ? ? ? 64 VAL A CB 1 +ATOM 611 C CG1 . VAL A 1 64 ? -12.700 4.364 19.396 1.00 2.00 ? ? ? ? ? ? 64 VAL A CG1 1 +ATOM 612 C CG2 . VAL A 1 64 ? -11.241 4.495 21.474 1.00 12.10 ? ? ? ? ? ? 64 VAL A CG2 1 +ATOM 613 H H . VAL A 1 64 ? -14.000 7.170 20.528 1.00 15.00 ? ? ? ? ? ? 64 VAL A H 1 +ATOM 614 N N . GLU A 1 65 ? -13.505 4.868 23.955 1.00 7.36 ? ? ? ? ? ? 65 GLU A N 1 +ATOM 615 C CA . GLU A 1 65 ? -12.972 5.193 25.262 1.00 8.29 ? ? ? ? ? ? 65 GLU A CA 1 +ATOM 616 C C . GLU A 1 65 ? -11.712 4.464 25.650 1.00 8.72 ? ? ? ? ? ? 65 GLU A C 1 +ATOM 617 O O . GLU A 1 65 ? -11.632 3.239 25.692 1.00 7.20 ? ? ? ? ? ? 65 GLU A O 1 +ATOM 618 C CB . GLU A 1 65 ? -14.009 4.958 26.331 1.00 16.21 ? ? ? ? ? ? 65 GLU A CB 1 +ATOM 619 C CG . GLU A 1 65 ? -15.173 5.917 26.227 1.00 28.95 ? ? ? ? ? ? 65 GLU A CG 1 +ATOM 620 C CD . GLU A 1 65 ? -16.036 5.762 27.457 1.00 42.00 ? ? ? ? ? ? 65 GLU A CD 1 +ATOM 621 O OE1 . GLU A 1 65 ? -15.655 6.281 28.515 1.00 41.15 ? ? ? ? ? ? 65 GLU A OE1 1 +ATOM 622 O OE2 . GLU A 1 65 ? -17.086 5.118 27.336 1.00 47.92 ? ? ? ? ? ? 65 GLU A OE2 1 +ATOM 623 H H . GLU A 1 65 ? -13.913 3.986 23.705 1.00 15.00 ? ? ? ? ? ? 65 GLU A H 1 +ATOM 624 N N . ILE A 1 66 ? -10.718 5.287 25.964 1.00 12.31 ? ? ? ? ? ? 66 ILE A N 1 +ATOM 625 C CA . ILE A 1 66 ? -9.424 4.746 26.428 1.00 15.55 ? ? ? ? ? ? 66 ILE A CA 1 +ATOM 626 C C . ILE A 1 66 ? -9.134 5.185 27.859 1.00 17.26 ? ? ? ? ? ? 66 ILE A C 1 +ATOM 627 O O . ILE A 1 66 ? -8.955 6.366 28.160 1.00 14.67 ? ? ? ? ? ? 66 ILE A O 1 +ATOM 628 C CB . ILE A 1 66 ? -8.240 5.161 25.497 1.00 14.67 ? ? ? ? ? ? 66 ILE A CB 1 +ATOM 629 C CG1 . ILE A 1 66 ? -8.601 5.198 24.012 1.00 14.16 ? ? ? ? ? ? 66 ILE A CG1 1 +ATOM 630 C CG2 . ILE A 1 66 ? -7.004 4.253 25.635 1.00 12.13 ? ? ? ? ? ? 66 ILE A CG2 1 +ATOM 631 C CD1 . ILE A 1 66 ? -7.499 5.896 23.204 1.00 12.50 ? ? ? ? ? ? 66 ILE A CD1 1 +ATOM 632 H H . ILE A 1 66 ? -10.882 6.267 25.831 1.00 15.00 ? ? ? ? ? ? 66 ILE A H 1 +ATOM 633 N N . CYS A 1 67 ? -9.142 4.196 28.776 1.00 20.80 ? ? ? ? ? ? 67 CYS A N 1 +ATOM 634 C CA . CYS A 1 67 ? -8.903 4.595 30.199 1.00 24.96 ? ? ? ? ? ? 67 CYS A CA 1 +ATOM 635 C C . CYS A 1 67 ? -9.762 5.707 30.862 1.00 25.05 ? ? ? ? ? ? 67 CYS A C 1 +ATOM 636 O O . CYS A 1 67 ? -9.280 6.561 31.606 1.00 25.64 ? ? ? ? ? ? 67 CYS A O 1 +ATOM 637 C CB . CYS A 1 67 ? -7.455 5.015 30.442 1.00 24.85 ? ? ? ? ? ? 67 CYS A CB 1 +ATOM 638 S SG . CYS A 1 67 ? -6.469 3.587 30.789 1.00 34.14 ? ? ? ? ? ? 67 CYS A SG 1 +ATOM 639 H H . CYS A 1 67 ? -9.210 3.247 28.455 1.00 15.00 ? ? ? ? ? ? 67 CYS A H 1 +ATOM 640 N N . GLY A 1 68 ? -11.058 5.710 30.508 1.00 22.38 ? ? ? ? ? ? 68 GLY A N 1 +ATOM 641 C CA . GLY A 1 68 ? -11.856 6.851 30.987 1.00 23.78 ? ? ? ? ? ? 68 GLY A CA 1 +ATOM 642 C C . GLY A 1 68 ? -11.771 8.182 30.210 1.00 25.98 ? ? ? ? ? ? 68 GLY A C 1 +ATOM 643 O O . GLY A 1 68 ? -12.465 9.153 30.491 1.00 30.44 ? ? ? ? ? ? 68 GLY A O 1 +ATOM 644 H H . GLY A 1 68 ? -11.411 5.002 29.905 1.00 15.00 ? ? ? ? ? ? 68 GLY A H 1 +ATOM 645 N N . HIS A 1 69 ? -10.906 8.176 29.182 1.00 22.38 ? ? ? ? ? ? 69 HIS A N 1 +ATOM 646 C CA . HIS A 1 69 ? -10.885 9.341 28.308 1.00 19.25 ? ? ? ? ? ? 69 HIS A CA 1 +ATOM 647 C C . HIS A 1 69 ? -11.555 9.024 27.002 1.00 19.72 ? ? ? ? ? ? 69 HIS A C 1 +ATOM 648 O O . HIS A 1 69 ? -11.320 7.998 26.375 1.00 21.73 ? ? ? ? ? ? 69 HIS A O 1 +ATOM 649 C CB . HIS A 1 69 ? -9.464 9.853 28.056 1.00 20.58 ? ? ? ? ? ? 69 HIS A CB 1 +ATOM 650 C CG . HIS A 1 69 ? -8.777 10.135 29.370 1.00 24.61 ? ? ? ? ? ? 69 HIS A CG 1 +ATOM 651 N ND1 . HIS A 1 69 ? -8.210 9.190 30.156 1.00 27.85 ? ? ? ? ? ? 69 HIS A ND1 1 +ATOM 652 C CD2 . HIS A 1 69 ? -8.662 11.363 30.018 1.00 25.43 ? ? ? ? ? ? 69 HIS A CD2 1 +ATOM 653 C CE1 . HIS A 1 69 ? -7.748 9.797 31.284 1.00 24.14 ? ? ? ? ? ? 69 HIS A CE1 1 +ATOM 654 N NE2 . HIS A 1 69 ? -8.034 11.130 31.196 1.00 22.87 ? ? ? ? ? ? 69 HIS A NE2 1 +ATOM 655 H H . HIS A 1 69 ? -10.316 7.394 29.003 1.00 15.00 ? ? ? ? ? ? 69 HIS A H 1 +ATOM 656 H HD1 . HIS A 1 69 ? -8.149 8.233 29.977 1.00 15.00 ? ? ? ? ? ? 69 HIS A HD1 1 +ATOM 657 N N . LYS A 1 70 ? -12.450 9.933 26.649 1.00 19.65 ? ? ? ? ? ? 70 LYS A N 1 +ATOM 658 C CA . LYS A 1 70 ? -13.221 9.826 25.406 1.00 17.22 ? ? ? ? ? ? 70 LYS A CA 1 +ATOM 659 C C . LYS A 1 70 ? -12.507 10.406 24.163 1.00 15.83 ? ? ? ? ? ? 70 LYS A C 1 +ATOM 660 O O . LYS A 1 70 ? -11.947 11.489 24.204 1.00 15.38 ? ? ? ? ? ? 70 LYS A O 1 +ATOM 661 C CB . LYS A 1 70 ? -14.508 10.605 25.650 1.00 20.19 ? ? ? ? ? ? 70 LYS A CB 1 +ATOM 662 C CG . LYS A 1 70 ? -15.789 9.845 25.956 1.00 30.72 ? ? ? ? ? ? 70 LYS A CG 1 +ATOM 663 C CD . LYS A 1 70 ? -16.197 9.005 24.735 1.00 39.08 ? ? ? ? ? ? 70 LYS A CD 1 +ATOM 664 C CE . LYS A 1 70 ? -16.223 9.752 23.395 1.00 39.55 ? ? ? ? ? ? 70 LYS A CE 1 +ATOM 665 N NZ . LYS A 1 70 ? -15.774 8.786 22.393 1.00 38.04 ? ? ? ? ? ? 70 LYS A NZ 1 +ATOM 666 H H . LYS A 1 70 ? -12.475 10.764 27.198 1.00 15.00 ? ? ? ? ? ? 70 LYS A H 1 +ATOM 667 H HZ1 . LYS A 1 70 ? -14.814 8.468 22.636 1.00 15.00 ? ? ? ? ? ? 70 LYS A HZ1 1 +ATOM 668 H HZ2 . LYS A 1 70 ? -16.418 7.970 22.384 1.00 15.00 ? ? ? ? ? ? 70 LYS A HZ2 1 +ATOM 669 H HZ3 . LYS A 1 70 ? -15.765 9.237 21.456 1.00 15.00 ? ? ? ? ? ? 70 LYS A HZ3 1 +ATOM 670 N N . ALA A 1 71 ? -12.581 9.669 23.053 1.00 14.11 ? ? ? ? ? ? 71 ALA A N 1 +ATOM 671 C CA . ALA A 1 71 ? -12.049 10.164 21.785 1.00 9.65 ? ? ? ? ? ? 71 ALA A CA 1 +ATOM 672 C C . ALA A 1 71 ? -12.950 9.871 20.542 1.00 14.05 ? ? ? ? ? ? 71 ALA A C 1 +ATOM 673 O O . ALA A 1 71 ? -13.774 8.960 20.525 1.00 17.33 ? ? ? ? ? ? 71 ALA A O 1 +ATOM 674 C CB . ALA A 1 71 ? -10.691 9.503 21.588 1.00 13.01 ? ? ? ? ? ? 71 ALA A CB 1 +ATOM 675 H H . ALA A 1 71 ? -12.986 8.761 23.141 1.00 15.00 ? ? ? ? ? ? 71 ALA A H 1 +ATOM 676 N N . ILE A 1 72 ? -12.793 10.673 19.468 1.00 12.13 ? ? ? ? ? ? 72 ILE A N 1 +ATOM 677 C CA . ILE A 1 72 ? -13.614 10.476 18.259 1.00 7.59 ? ? ? ? ? ? 72 ILE A CA 1 +ATOM 678 C C . ILE A 1 72 ? -12.785 10.549 16.968 1.00 7.29 ? ? ? ? ? ? 72 ILE A C 1 +ATOM 679 O O . ILE A 1 72 ? -12.084 11.503 16.658 1.00 7.41 ? ? ? ? ? ? 72 ILE A O 1 +ATOM 680 C CB . ILE A 1 72 ? -14.848 11.451 18.212 1.00 7.82 ? ? ? ? ? ? 72 ILE A CB 1 +ATOM 681 C CG1 . ILE A 1 72 ? -15.644 11.511 19.533 1.00 6.92 ? ? ? ? ? ? 72 ILE A CG1 1 +ATOM 682 C CG2 . ILE A 1 72 ? -15.821 11.024 17.111 1.00 2.99 ? ? ? ? ? ? 72 ILE A CG2 1 +ATOM 683 C CD1 . ILE A 1 72 ? -16.810 12.505 19.598 1.00 7.31 ? ? ? ? ? ? 72 ILE A CD1 1 +ATOM 684 H H . ILE A 1 72 ? -12.094 11.391 19.558 1.00 15.00 ? ? ? ? ? ? 72 ILE A H 1 +ATOM 685 N N . GLY A 1 73 ? -12.812 9.459 16.216 1.00 6.85 ? ? ? ? ? ? 73 GLY A N 1 +ATOM 686 C CA . GLY A 1 73 ? -11.802 9.477 15.165 1.00 3.66 ? ? ? ? ? ? 73 GLY A CA 1 +ATOM 687 C C . GLY A 1 73 ? -11.808 8.290 14.226 1.00 5.70 ? ? ? ? ? ? 73 GLY A C 1 +ATOM 688 O O . GLY A 1 73 ? -12.670 7.431 14.296 1.00 5.13 ? ? ? ? ? ? 73 GLY A O 1 +ATOM 689 H H . GLY A 1 73 ? -13.337 8.653 16.494 1.00 15.00 ? ? ? ? ? ? 73 GLY A H 1 +ATOM 690 N N . THR A 1 74 ? -10.814 8.304 13.326 1.00 4.83 ? ? ? ? ? ? 74 THR A N 1 +ATOM 691 C CA . THR A 1 74 ? -10.557 7.175 12.406 1.00 6.42 ? ? ? ? ? ? 74 THR A CA 1 +ATOM 692 C C . THR A 1 74 ? -9.927 5.876 12.993 1.00 8.54 ? ? ? ? ? ? 74 THR A C 1 +ATOM 693 O O . THR A 1 74 ? -8.938 5.859 13.741 1.00 11.09 ? ? ? ? ? ? 74 THR A O 1 +ATOM 694 C CB . THR A 1 74 ? -9.720 7.753 11.231 1.00 9.90 ? ? ? ? ? ? 74 THR A CB 1 +ATOM 695 O OG1 . THR A 1 74 ? -10.423 8.883 10.688 1.00 6.69 ? ? ? ? ? ? 74 THR A OG1 1 +ATOM 696 C CG2 . THR A 1 74 ? -9.271 6.796 10.104 1.00 9.55 ? ? ? ? ? ? 74 THR A CG2 1 +ATOM 697 H H . THR A 1 74 ? -10.187 9.084 13.351 1.00 15.00 ? ? ? ? ? ? 74 THR A H 1 +ATOM 698 H HG1 . THR A 1 74 ? -11.146 8.537 10.185 1.00 15.00 ? ? ? ? ? ? 74 THR A HG1 1 +ATOM 699 N N . VAL A 1 75 ? -10.581 4.751 12.619 1.00 7.45 ? ? ? ? ? ? 75 VAL A N 1 +ATOM 700 C CA . VAL A 1 75 ? -10.064 3.424 12.999 1.00 3.64 ? ? ? ? ? ? 75 VAL A CA 1 +ATOM 701 C C . VAL A 1 75 ? -10.002 2.529 11.798 1.00 5.50 ? ? ? ? ? ? 75 VAL A C 1 +ATOM 702 O O . VAL A 1 75 ? -10.908 2.484 10.966 1.00 6.60 ? ? ? ? ? ? 75 VAL A O 1 +ATOM 703 C CB . VAL A 1 75 ? -10.751 2.669 14.181 1.00 2.00 ? ? ? ? ? ? 75 VAL A CB 1 +ATOM 704 C CG1 . VAL A 1 75 ? -10.913 3.535 15.429 1.00 2.24 ? ? ? ? ? ? 75 VAL A CG1 1 +ATOM 705 C CG2 . VAL A 1 75 ? -12.074 2.028 13.818 1.00 2.67 ? ? ? ? ? ? 75 VAL A CG2 1 +ATOM 706 H H . VAL A 1 75 ? -11.433 4.856 12.105 1.00 15.00 ? ? ? ? ? ? 75 VAL A H 1 +ATOM 707 N N . LEU A 1 76 ? -8.827 1.882 11.712 1.00 7.70 ? ? ? ? ? ? 76 LEU A N 1 +ATOM 708 C CA . LEU A 1 76 ? -8.560 0.993 10.582 1.00 9.14 ? ? ? ? ? ? 76 LEU A CA 1 +ATOM 709 C C . LEU A 1 76 ? -8.758 -0.411 11.091 1.00 8.24 ? ? ? ? ? ? 76 LEU A C 1 +ATOM 710 O O . LEU A 1 76 ? -8.180 -0.689 12.133 1.00 8.98 ? ? ? ? ? ? 76 LEU A O 1 +ATOM 711 C CB . LEU A 1 76 ? -7.096 1.080 10.170 1.00 10.74 ? ? ? ? ? ? 76 LEU A CB 1 +ATOM 712 C CG . LEU A 1 76 ? -6.554 2.116 9.182 1.00 10.68 ? ? ? ? ? ? 76 LEU A CG 1 +ATOM 713 C CD1 . LEU A 1 76 ? -7.371 3.382 9.044 1.00 7.60 ? ? ? ? ? ? 76 LEU A CD1 1 +ATOM 714 C CD2 . LEU A 1 76 ? -5.065 2.380 9.472 1.00 4.59 ? ? ? ? ? ? 76 LEU A CD2 1 +ATOM 715 H H . LEU A 1 76 ? -8.164 1.978 12.458 1.00 15.00 ? ? ? ? ? ? 76 LEU A H 1 +ATOM 716 N N . VAL A 1 77 ? -9.556 -1.241 10.379 1.00 5.51 ? ? ? ? ? ? 77 VAL A N 1 +ATOM 717 C CA . VAL A 1 77 ? -9.612 -2.615 10.873 1.00 7.56 ? ? ? ? ? ? 77 VAL A CA 1 +ATOM 718 C C . VAL A 1 77 ? -9.067 -3.627 9.884 1.00 11.19 ? ? ? ? ? ? 77 VAL A C 1 +ATOM 719 O O . VAL A 1 77 ? -9.292 -3.527 8.684 1.00 15.24 ? ? ? ? ? ? 77 VAL A O 1 +ATOM 720 C CB . VAL A 1 77 ? -10.965 -3.018 11.575 1.00 10.81 ? ? ? ? ? ? 77 VAL A CB 1 +ATOM 721 C CG1 . VAL A 1 77 ? -11.992 -1.869 11.789 1.00 6.89 ? ? ? ? ? ? 77 VAL A CG1 1 +ATOM 722 C CG2 . VAL A 1 77 ? -11.605 -4.314 11.072 1.00 6.45 ? ? ? ? ? ? 77 VAL A CG2 1 +ATOM 723 H H . VAL A 1 77 ? -10.102 -0.873 9.624 1.00 15.00 ? ? ? ? ? ? 77 VAL A H 1 +ATOM 724 N N . GLY A 1 78 ? -8.247 -4.550 10.439 1.00 14.31 ? ? ? ? ? ? 78 GLY A N 1 +ATOM 725 C CA . GLY A 1 78 ? -7.421 -5.459 9.606 1.00 11.38 ? ? ? ? ? ? 78 GLY A CA 1 +ATOM 726 C C . GLY A 1 78 ? -6.549 -6.491 10.338 1.00 10.04 ? ? ? ? ? ? 78 GLY A C 1 +ATOM 727 O O . GLY A 1 78 ? -6.689 -6.696 11.536 1.00 11.54 ? ? ? ? ? ? 78 GLY A O 1 +ATOM 728 H H . GLY A 1 78 ? -8.172 -4.530 11.440 1.00 15.00 ? ? ? ? ? ? 78 GLY A H 1 +ATOM 729 N N . PRO A 1 79 ? -5.657 -7.198 9.576 1.00 10.23 ? ? ? ? ? ? 79 PRO A N 1 +ATOM 730 C CA . PRO A 1 79 ? -4.843 -8.307 10.160 1.00 8.21 ? ? ? ? ? ? 79 PRO A CA 1 +ATOM 731 C C . PRO A 1 79 ? -3.582 -7.953 10.985 1.00 13.23 ? ? ? ? ? ? 79 PRO A C 1 +ATOM 732 O O . PRO A 1 79 ? -2.449 -8.222 10.618 1.00 21.44 ? ? ? ? ? ? 79 PRO A O 1 +ATOM 733 C CB . PRO A 1 79 ? -4.516 -9.134 8.905 1.00 4.37 ? ? ? ? ? ? 79 PRO A CB 1 +ATOM 734 C CG . PRO A 1 79 ? -4.472 -8.118 7.757 1.00 2.00 ? ? ? ? ? ? 79 PRO A CG 1 +ATOM 735 C CD . PRO A 1 79 ? -5.536 -7.089 8.115 1.00 3.01 ? ? ? ? ? ? 79 PRO A CD 1 +ATOM 736 N N . THR A 1 80 ? -3.793 -7.352 12.147 1.00 16.55 ? ? ? ? ? ? 80 THR A N 1 +ATOM 737 C CA . THR A 1 80 ? -2.668 -6.967 13.039 1.00 14.33 ? ? ? ? ? ? 80 THR A CA 1 +ATOM 738 C C . THR A 1 80 ? -2.414 -7.963 14.181 1.00 14.07 ? ? ? ? ? ? 80 THR A C 1 +ATOM 739 O O . THR A 1 80 ? -3.361 -8.591 14.627 1.00 14.05 ? ? ? ? ? ? 80 THR A O 1 +ATOM 740 C CB . THR A 1 80 ? -2.984 -5.585 13.630 1.00 10.44 ? ? ? ? ? ? 80 THR A CB 1 +ATOM 741 O OG1 . THR A 1 80 ? -2.027 -5.241 14.620 1.00 12.88 ? ? ? ? ? ? 80 THR A OG1 1 +ATOM 742 C CG2 . THR A 1 80 ? -4.388 -5.503 14.223 1.00 4.82 ? ? ? ? ? ? 80 THR A CG2 1 +ATOM 743 H H . THR A 1 80 ? -4.756 -7.257 12.405 1.00 15.00 ? ? ? ? ? ? 80 THR A H 1 +ATOM 744 H HG1 . THR A 1 80 ? -2.528 -4.947 15.384 1.00 15.00 ? ? ? ? ? ? 80 THR A HG1 1 +ATOM 745 N N . PRO A 1 81 ? -1.144 -8.155 14.681 1.00 14.95 ? ? ? ? ? ? 81 PRO A N 1 +ATOM 746 C CA . PRO A 1 81 ? -0.988 -9.139 15.784 1.00 12.96 ? ? ? ? ? ? 81 PRO A CA 1 +ATOM 747 C C . PRO A 1 81 ? -1.790 -8.850 17.053 1.00 12.83 ? ? ? ? ? ? 81 PRO A C 1 +ATOM 748 O O . PRO A 1 81 ? -2.404 -9.713 17.644 1.00 16.23 ? ? ? ? ? ? 81 PRO A O 1 +ATOM 749 C CB . PRO A 1 81 ? 0.521 -9.191 16.065 1.00 7.77 ? ? ? ? ? ? 81 PRO A CB 1 +ATOM 750 C CG . PRO A 1 81 ? 1.178 -8.551 14.848 1.00 7.13 ? ? ? ? ? ? 81 PRO A CG 1 +ATOM 751 C CD . PRO A 1 81 ? 0.139 -7.587 14.270 1.00 10.90 ? ? ? ? ? ? 81 PRO A CD 1 +ATOM 752 N N . VAL A 1 82 ? -1.736 -7.570 17.453 1.00 15.40 ? ? ? ? ? ? 82 VAL A N 1 +ATOM 753 C CA . VAL A 1 82 ? -2.440 -7.017 18.624 1.00 11.41 ? ? ? ? ? ? 82 VAL A CA 1 +ATOM 754 C C . VAL A 1 82 ? -3.373 -5.845 18.241 1.00 10.53 ? ? ? ? ? ? 82 VAL A C 1 +ATOM 755 O O . VAL A 1 82 ? -3.254 -5.294 17.142 1.00 9.57 ? ? ? ? ? ? 82 VAL A O 1 +ATOM 756 C CB . VAL A 1 82 ? -1.397 -6.519 19.651 1.00 9.70 ? ? ? ? ? ? 82 VAL A CB 1 +ATOM 757 C CG1 . VAL A 1 82 ? -0.766 -7.679 20.370 1.00 5.78 ? ? ? ? ? ? 82 VAL A CG1 1 +ATOM 758 C CG2 . VAL A 1 82 ? -0.333 -5.607 19.030 1.00 10.61 ? ? ? ? ? ? 82 VAL A CG2 1 +ATOM 759 H H . VAL A 1 82 ? -1.252 -6.961 16.826 1.00 15.00 ? ? ? ? ? ? 82 VAL A H 1 +ATOM 760 N N . ASN A 1 83 ? -4.242 -5.425 19.203 1.00 5.95 ? ? ? ? ? ? 83 ASN A N 1 +ATOM 761 C CA . ASN A 1 83 ? -4.800 -4.081 18.959 1.00 3.62 ? ? ? ? ? ? 83 ASN A CA 1 +ATOM 762 C C . ASN A 1 83 ? -3.849 -2.918 19.265 1.00 3.68 ? ? ? ? ? ? 83 ASN A C 1 +ATOM 763 O O . ASN A 1 83 ? -3.264 -2.850 20.340 1.00 6.21 ? ? ? ? ? ? 83 ASN A O 1 +ATOM 764 C CB . ASN A 1 83 ? -6.103 -3.838 19.728 1.00 8.40 ? ? ? ? ? ? 83 ASN A CB 1 +ATOM 765 C CG . ASN A 1 83 ? -7.265 -4.688 19.236 1.00 9.86 ? ? ? ? ? ? 83 ASN A CG 1 +ATOM 766 O OD1 . ASN A 1 83 ? -7.744 -4.560 18.129 1.00 15.78 ? ? ? ? ? ? 83 ASN A OD1 1 +ATOM 767 N ND2 . ASN A 1 83 ? -7.765 -5.557 20.102 1.00 6.89 ? ? ? ? ? ? 83 ASN A ND2 1 +ATOM 768 H H . ASN A 1 83 ? -4.312 -5.927 20.062 1.00 15.00 ? ? ? ? ? ? 83 ASN A H 1 +ATOM 769 H HD21 . ASN A 1 83 ? -8.526 -6.068 19.715 1.00 15.00 ? ? ? ? ? ? 83 ASN A HD21 1 +ATOM 770 H HD22 . ASN A 1 83 ? -7.387 -5.635 21.026 1.00 15.00 ? ? ? ? ? ? 83 ASN A HD22 1 +ATOM 771 N N . ILE A 1 84 ? -3.733 -2.018 18.281 1.00 4.44 ? ? ? ? ? ? 84 ILE A N 1 +ATOM 772 C CA . ILE A 1 84 ? -2.820 -0.844 18.286 1.00 6.23 ? ? ? ? ? ? 84 ILE A CA 1 +ATOM 773 C C . ILE A 1 84 ? -3.530 0.548 18.348 1.00 7.54 ? ? ? ? ? ? 84 ILE A C 1 +ATOM 774 O O . ILE A 1 84 ? -4.310 0.914 17.470 1.00 10.49 ? ? ? ? ? ? 84 ILE A O 1 +ATOM 775 C CB . ILE A 1 84 ? -1.917 -0.949 17.005 1.00 9.16 ? ? ? ? ? ? 84 ILE A CB 1 +ATOM 776 C CG1 . ILE A 1 84 ? -0.878 -2.065 17.074 1.00 9.46 ? ? ? ? ? ? 84 ILE A CG1 1 +ATOM 777 C CG2 . ILE A 1 84 ? -1.171 0.325 16.564 1.00 9.37 ? ? ? ? ? ? 84 ILE A CG2 1 +ATOM 778 C CD1 . ILE A 1 84 ? -0.214 -2.279 15.708 1.00 12.32 ? ? ? ? ? ? 84 ILE A CD1 1 +ATOM 779 H H . ILE A 1 84 ? -4.302 -2.187 17.474 1.00 15.00 ? ? ? ? ? ? 84 ILE A H 1 +ATOM 780 N N . ILE A 1 85 ? -3.203 1.329 19.399 1.00 6.08 ? ? ? ? ? ? 85 ILE A N 1 +ATOM 781 C CA . ILE A 1 85 ? -3.549 2.761 19.382 1.00 3.83 ? ? ? ? ? ? 85 ILE A CA 1 +ATOM 782 C C . ILE A 1 85 ? -2.346 3.642 18.969 1.00 5.48 ? ? ? ? ? ? 85 ILE A C 1 +ATOM 783 O O . ILE A 1 85 ? -1.321 3.637 19.652 1.00 4.60 ? ? ? ? ? ? 85 ILE A O 1 +ATOM 784 C CB . ILE A 1 85 ? -4.078 3.263 20.743 1.00 3.28 ? ? ? ? ? ? 85 ILE A CB 1 +ATOM 785 C CG1 . ILE A 1 85 ? -4.993 2.265 21.468 1.00 4.75 ? ? ? ? ? ? 85 ILE A CG1 1 +ATOM 786 C CG2 . ILE A 1 85 ? -4.764 4.614 20.547 1.00 2.00 ? ? ? ? ? ? 85 ILE A CG2 1 +ATOM 787 C CD1 . ILE A 1 85 ? -6.373 2.028 20.837 1.00 10.37 ? ? ? ? ? ? 85 ILE A CD1 1 +ATOM 788 H H . ILE A 1 85 ? -2.591 0.942 20.095 1.00 15.00 ? ? ? ? ? ? 85 ILE A H 1 +ATOM 789 N N . GLY A 1 86 ? -2.519 4.356 17.827 1.00 3.63 ? ? ? ? ? ? 86 GLY A N 1 +ATOM 790 C CA . GLY A 1 86 ? -1.444 5.149 17.231 1.00 3.97 ? ? ? ? ? ? 86 GLY A CA 1 +ATOM 791 C C . GLY A 1 86 ? -1.513 6.620 17.583 1.00 6.02 ? ? ? ? ? ? 86 GLY A C 1 +ATOM 792 O O . GLY A 1 86 ? -2.415 7.044 18.307 1.00 11.53 ? ? ? ? ? ? 86 GLY A O 1 +ATOM 793 H H . GLY A 1 86 ? -3.436 4.323 17.425 1.00 15.00 ? ? ? ? ? ? 86 GLY A H 1 +ATOM 794 N N . ARG A 1 87 ? -0.582 7.434 17.053 1.00 4.10 ? ? ? ? ? ? 87 ARG A N 1 +ATOM 795 C CA . ARG A 1 87 ? -0.654 8.875 17.437 1.00 6.33 ? ? ? ? ? ? 87 ARG A CA 1 +ATOM 796 C C . ARG A 1 87 ? -1.987 9.709 17.268 1.00 6.34 ? ? ? ? ? ? 87 ARG A C 1 +ATOM 797 O O . ARG A 1 87 ? -2.248 10.670 17.993 1.00 9.00 ? ? ? ? ? ? 87 ARG A O 1 +ATOM 798 C CB . ARG A 1 87 ? 0.560 9.612 16.845 1.00 4.55 ? ? ? ? ? ? 87 ARG A CB 1 +ATOM 799 C CG . ARG A 1 87 ? 1.904 9.047 17.362 1.00 10.87 ? ? ? ? ? ? 87 ARG A CG 1 +ATOM 800 C CD . ARG A 1 87 ? 3.062 9.100 16.353 1.00 5.39 ? ? ? ? ? ? 87 ARG A CD 1 +ATOM 801 N NE . ARG A 1 87 ? 3.209 10.479 15.997 1.00 15.34 ? ? ? ? ? ? 87 ARG A NE 1 +ATOM 802 C CZ . ARG A 1 87 ? 2.792 10.872 14.795 1.00 18.04 ? ? ? ? ? ? 87 ARG A CZ 1 +ATOM 803 N NH1 . ARG A 1 87 ? 2.967 10.101 13.735 1.00 15.78 ? ? ? ? ? ? 87 ARG A NH1 1 +ATOM 804 N NH2 . ARG A 1 87 ? 2.170 12.049 14.692 1.00 19.63 ? ? ? ? ? ? 87 ARG A NH2 1 +ATOM 805 H H . ARG A 1 87 ? 0.196 7.014 16.588 1.00 15.00 ? ? ? ? ? ? 87 ARG A H 1 +ATOM 806 H HE . ARG A 1 87 ? 3.259 11.156 16.730 1.00 15.00 ? ? ? ? ? ? 87 ARG A HE 1 +ATOM 807 H HH11 . ARG A 1 87 ? 3.447 9.229 13.827 1.00 15.00 ? ? ? ? ? ? 87 ARG A HH11 1 +ATOM 808 H HH12 . ARG A 1 87 ? 2.619 10.390 12.845 1.00 15.00 ? ? ? ? ? ? 87 ARG A HH12 1 +ATOM 809 H HH21 . ARG A 1 87 ? 2.040 12.623 15.501 1.00 15.00 ? ? ? ? ? ? 87 ARG A HH21 1 +ATOM 810 H HH22 . ARG A 1 87 ? 1.829 12.357 13.805 1.00 15.00 ? ? ? ? ? ? 87 ARG A HH22 1 +ATOM 811 N N . ASN A 1 88 ? -2.846 9.320 16.284 1.00 4.71 ? ? ? ? ? ? 88 ASN A N 1 +ATOM 812 C CA . ASN A 1 88 ? -4.085 10.064 15.974 1.00 2.94 ? ? ? ? ? ? 88 ASN A CA 1 +ATOM 813 C C . ASN A 1 88 ? -5.100 10.221 17.134 1.00 8.33 ? ? ? ? ? ? 88 ASN A C 1 +ATOM 814 O O . ASN A 1 88 ? -5.814 11.204 17.328 1.00 10.61 ? ? ? ? ? ? 88 ASN A O 1 +ATOM 815 C CB . ASN A 1 88 ? -4.734 9.451 14.714 1.00 2.54 ? ? ? ? ? ? 88 ASN A CB 1 +ATOM 816 C CG . ASN A 1 88 ? -5.452 8.096 14.938 1.00 11.53 ? ? ? ? ? ? 88 ASN A CG 1 +ATOM 817 O OD1 . ASN A 1 88 ? -4.939 7.098 15.437 1.00 2.94 ? ? ? ? ? ? 88 ASN A OD1 1 +ATOM 818 N ND2 . ASN A 1 88 ? -6.728 8.083 14.558 1.00 12.71 ? ? ? ? ? ? 88 ASN A ND2 1 +ATOM 819 H H . ASN A 1 88 ? -2.520 8.580 15.694 1.00 15.00 ? ? ? ? ? ? 88 ASN A H 1 +ATOM 820 H HD21 . ASN A 1 88 ? -7.219 7.218 14.657 1.00 15.00 ? ? ? ? ? ? 88 ASN A HD21 1 +ATOM 821 H HD22 . ASN A 1 88 ? -7.217 8.883 14.213 1.00 15.00 ? ? ? ? ? ? 88 ASN A HD22 1 +ATOM 822 N N . LEU A 1 89 ? -5.100 9.142 17.928 1.00 9.42 ? ? ? ? ? ? 89 LEU A N 1 +ATOM 823 C CA . LEU A 1 89 ? -5.948 9.061 19.121 1.00 8.04 ? ? ? ? ? ? 89 LEU A CA 1 +ATOM 824 C C . LEU A 1 89 ? -5.240 9.372 20.426 1.00 5.83 ? ? ? ? ? ? 89 LEU A C 1 +ATOM 825 O O . LEU A 1 89 ? -5.720 10.079 21.282 1.00 11.22 ? ? ? ? ? ? 89 LEU A O 1 +ATOM 826 C CB . LEU A 1 89 ? -6.576 7.671 19.132 1.00 7.87 ? ? ? ? ? ? 89 LEU A CB 1 +ATOM 827 C CG . LEU A 1 89 ? -7.982 7.575 18.565 1.00 9.76 ? ? ? ? ? ? 89 LEU A CG 1 +ATOM 828 C CD1 . LEU A 1 89 ? -8.269 8.482 17.355 1.00 13.42 ? ? ? ? ? ? 89 LEU A CD1 1 +ATOM 829 C CD2 . LEU A 1 89 ? -8.334 6.110 18.331 1.00 14.63 ? ? ? ? ? ? 89 LEU A CD2 1 +ATOM 830 H H . LEU A 1 89 ? -4.531 8.374 17.626 1.00 15.00 ? ? ? ? ? ? 89 LEU A H 1 +ATOM 831 N N . LEU A 1 90 ? -4.014 8.888 20.545 1.00 8.10 ? ? ? ? ? ? 90 LEU A N 1 +ATOM 832 C CA . LEU A 1 90 ? -3.122 9.326 21.652 1.00 8.09 ? ? ? ? ? ? 90 LEU A CA 1 +ATOM 833 C C . LEU A 1 90 ? -2.996 10.851 21.908 1.00 8.64 ? ? ? ? ? ? 90 LEU A C 1 +ATOM 834 O O . LEU A 1 90 ? -2.902 11.395 23.005 1.00 9.47 ? ? ? ? ? ? 90 LEU A O 1 +ATOM 835 C CB . LEU A 1 90 ? -1.745 8.802 21.290 1.00 5.97 ? ? ? ? ? ? 90 LEU A CB 1 +ATOM 836 C CG . LEU A 1 90 ? -1.170 7.607 22.016 1.00 5.66 ? ? ? ? ? ? 90 LEU A CG 1 +ATOM 837 C CD1 . LEU A 1 90 ? -2.156 6.570 22.522 1.00 4.83 ? ? ? ? ? ? 90 LEU A CD1 1 +ATOM 838 C CD2 . LEU A 1 90 ? -0.167 6.990 21.060 1.00 7.12 ? ? ? ? ? ? 90 LEU A CD2 1 +ATOM 839 H H . LEU A 1 90 ? -3.704 8.240 19.846 1.00 15.00 ? ? ? ? ? ? 90 LEU A H 1 +ATOM 840 N N . THR A 1 91 ? -2.992 11.570 20.795 1.00 9.94 ? ? ? ? ? ? 91 THR A N 1 +ATOM 841 C CA . THR A 1 91 ? -3.029 13.029 20.978 1.00 8.71 ? ? ? ? ? ? 91 THR A CA 1 +ATOM 842 C C . THR A 1 91 ? -4.303 13.614 21.471 1.00 10.30 ? ? ? ? ? ? 91 THR A C 1 +ATOM 843 O O . THR A 1 91 ? -4.259 14.519 22.284 1.00 12.69 ? ? ? ? ? ? 91 THR A O 1 +ATOM 844 C CB . THR A 1 91 ? -2.729 13.810 19.729 1.00 10.12 ? ? ? ? ? ? 91 THR A CB 1 +ATOM 845 O OG1 . THR A 1 91 ? -3.546 13.334 18.654 1.00 9.03 ? ? ? ? ? ? 91 THR A OG1 1 +ATOM 846 C CG2 . THR A 1 91 ? -1.237 13.795 19.403 1.00 9.48 ? ? ? ? ? ? 91 THR A CG2 1 +ATOM 847 H H . THR A 1 91 ? -2.949 11.127 19.899 1.00 15.00 ? ? ? ? ? ? 91 THR A H 1 +ATOM 848 H HG1 . THR A 1 91 ? -3.051 12.631 18.233 1.00 15.00 ? ? ? ? ? ? 91 THR A HG1 1 +ATOM 849 N N . GLN A 1 92 ? -5.435 13.036 21.015 1.00 9.54 ? ? ? ? ? ? 92 GLN A N 1 +ATOM 850 C CA . GLN A 1 92 ? -6.739 13.425 21.614 1.00 8.56 ? ? ? ? ? ? 92 GLN A CA 1 +ATOM 851 C C . GLN A 1 92 ? -6.888 13.403 23.158 1.00 10.13 ? ? ? ? ? ? 92 GLN A C 1 +ATOM 852 O O . GLN A 1 92 ? -7.313 14.362 23.797 1.00 10.19 ? ? ? ? ? ? 92 GLN A O 1 +ATOM 853 C CB . GLN A 1 92 ? -7.901 12.683 20.934 1.00 7.14 ? ? ? ? ? ? 92 GLN A CB 1 +ATOM 854 C CG . GLN A 1 92 ? -8.079 13.162 19.471 1.00 4.88 ? ? ? ? ? ? 92 GLN A CG 1 +ATOM 855 C CD . GLN A 1 92 ? -9.409 12.689 18.959 1.00 4.56 ? ? ? ? ? ? 92 GLN A CD 1 +ATOM 856 O OE1 . GLN A 1 92 ? -10.324 12.409 19.699 1.00 14.03 ? ? ? ? ? ? 92 GLN A OE1 1 +ATOM 857 N NE2 . GLN A 1 92 ? -9.555 12.577 17.672 1.00 2.00 ? ? ? ? ? ? 92 GLN A NE2 1 +ATOM 858 H H . GLN A 1 92 ? -5.340 12.385 20.263 1.00 15.00 ? ? ? ? ? ? 92 GLN A H 1 +ATOM 859 H HE21 . GLN A 1 92 ? -10.464 12.281 17.383 1.00 15.00 ? ? ? ? ? ? 92 GLN A HE21 1 +ATOM 860 H HE22 . GLN A 1 92 ? -8.804 12.777 17.055 1.00 15.00 ? ? ? ? ? ? 92 GLN A HE22 1 +ATOM 861 N N . ILE A 1 93 ? -6.453 12.267 23.731 1.00 7.25 ? ? ? ? ? ? 93 ILE A N 1 +ATOM 862 C CA . ILE A 1 93 ? -6.483 12.101 25.195 1.00 7.07 ? ? ? ? ? ? 93 ILE A CA 1 +ATOM 863 C C . ILE A 1 93 ? -5.335 12.732 26.048 1.00 11.45 ? ? ? ? ? ? 93 ILE A C 1 +ATOM 864 O O . ILE A 1 93 ? -5.207 12.556 27.257 1.00 11.98 ? ? ? ? ? ? 93 ILE A O 1 +ATOM 865 C CB . ILE A 1 93 ? -6.643 10.599 25.548 1.00 8.30 ? ? ? ? ? ? 93 ILE A CB 1 +ATOM 866 C CG1 . ILE A 1 93 ? -5.341 9.820 25.286 1.00 5.63 ? ? ? ? ? ? 93 ILE A CG1 1 +ATOM 867 C CG2 . ILE A 1 93 ? -7.849 9.970 24.810 1.00 6.86 ? ? ? ? ? ? 93 ILE A CG2 1 +ATOM 868 C CD1 . ILE A 1 93 ? -5.437 8.344 25.642 1.00 6.01 ? ? ? ? ? ? 93 ILE A CD1 1 +ATOM 869 H H . ILE A 1 93 ? -6.167 11.548 23.098 1.00 15.00 ? ? ? ? ? ? 93 ILE A H 1 +ATOM 870 N N . GLY A 1 94 ? -4.464 13.486 25.366 1.00 10.82 ? ? ? ? ? ? 94 GLY A N 1 +ATOM 871 C CA . GLY A 1 94 ? -3.410 14.097 26.190 1.00 12.12 ? ? ? ? ? ? 94 GLY A CA 1 +ATOM 872 C C . GLY A 1 94 ? -2.050 13.371 26.432 1.00 15.12 ? ? ? ? ? ? 94 GLY A C 1 +ATOM 873 O O . GLY A 1 94 ? -1.236 13.833 27.223 1.00 17.26 ? ? ? ? ? ? 94 GLY A O 1 +ATOM 874 H H . GLY A 1 94 ? -4.588 13.678 24.392 1.00 15.00 ? ? ? ? ? ? 94 GLY A H 1 +ATOM 875 N N . CYS A 1 95 ? -1.790 12.267 25.687 1.00 14.55 ? ? ? ? ? ? 95 CYS A N 1 +ATOM 876 C CA . CYS A 1 95 ? -0.471 11.597 25.822 1.00 10.81 ? ? ? ? ? ? 95 CYS A CA 1 +ATOM 877 C C . CYS A 1 95 ? 0.838 12.258 25.319 1.00 11.73 ? ? ? ? ? ? 95 CYS A C 1 +ATOM 878 O O . CYS A 1 95 ? 0.949 12.839 24.228 1.00 13.70 ? ? ? ? ? ? 95 CYS A O 1 +ATOM 879 C CB . CYS A 1 95 ? -0.614 10.216 25.243 1.00 12.07 ? ? ? ? ? ? 95 CYS A CB 1 +ATOM 880 S SG . CYS A 1 95 ? 0.307 8.920 26.088 1.00 18.07 ? ? ? ? ? ? 95 CYS A SG 1 +ATOM 881 H H . CYS A 1 95 ? -2.463 12.031 24.988 1.00 15.00 ? ? ? ? ? ? 95 CYS A H 1 +ATOM 882 N N . THR A 1 96 ? 1.843 12.131 26.211 1.00 9.92 ? ? ? ? ? ? 96 THR A N 1 +ATOM 883 C CA . THR A 1 96 ? 3.255 12.544 26.016 1.00 6.70 ? ? ? ? ? ? 96 THR A CA 1 +ATOM 884 C C . THR A 1 96 ? 4.358 11.495 26.430 1.00 11.47 ? ? ? ? ? ? 96 THR A C 1 +ATOM 885 O O . THR A 1 96 ? 4.175 10.661 27.303 1.00 11.99 ? ? ? ? ? ? 96 THR A O 1 +ATOM 886 C CB . THR A 1 96 ? 3.572 13.884 26.732 1.00 3.18 ? ? ? ? ? ? 96 THR A CB 1 +ATOM 887 O OG1 . THR A 1 96 ? 3.422 13.782 28.136 1.00 2.00 ? ? ? ? ? ? 96 THR A OG1 1 +ATOM 888 C CG2 . THR A 1 96 ? 2.735 15.054 26.263 1.00 2.00 ? ? ? ? ? ? 96 THR A CG2 1 +ATOM 889 H H . THR A 1 96 ? 1.543 11.752 27.094 1.00 15.00 ? ? ? ? ? ? 96 THR A H 1 +ATOM 890 H HG1 . THR A 1 96 ? 3.325 14.669 28.470 1.00 15.00 ? ? ? ? ? ? 96 THR A HG1 1 +ATOM 891 N N . LEU A 1 97 ? 5.544 11.562 25.769 1.00 13.36 ? ? ? ? ? ? 97 LEU A N 1 +ATOM 892 C CA . LEU A 1 97 ? 6.781 10.866 26.209 1.00 11.73 ? ? ? ? ? ? 97 LEU A CA 1 +ATOM 893 C C . LEU A 1 97 ? 7.766 11.692 27.122 1.00 12.03 ? ? ? ? ? ? 97 LEU A C 1 +ATOM 894 O O . LEU A 1 97 ? 8.091 12.842 26.868 1.00 13.10 ? ? ? ? ? ? 97 LEU A O 1 +ATOM 895 C CB . LEU A 1 97 ? 7.510 10.366 24.941 1.00 12.45 ? ? ? ? ? ? 97 LEU A CB 1 +ATOM 896 C CG . LEU A 1 97 ? 7.614 8.852 24.580 1.00 12.27 ? ? ? ? ? ? 97 LEU A CG 1 +ATOM 897 C CD1 . LEU A 1 97 ? 6.313 8.199 24.173 1.00 13.18 ? ? ? ? ? ? 97 LEU A CD1 1 +ATOM 898 C CD2 . LEU A 1 97 ? 8.468 8.621 23.357 1.00 9.86 ? ? ? ? ? ? 97 LEU A CD2 1 +ATOM 899 H H . LEU A 1 97 ? 5.576 12.235 25.027 1.00 15.00 ? ? ? ? ? ? 97 LEU A H 1 +ATOM 900 N N . ASN A 1 98 ? 8.241 11.095 28.216 1.00 12.12 ? ? ? ? ? ? 98 ASN A N 1 +ATOM 901 C CA . ASN A 1 98 ? 9.072 11.924 29.137 1.00 14.38 ? ? ? ? ? ? 98 ASN A CA 1 +ATOM 902 C C . ASN A 1 98 ? 10.351 11.322 29.763 1.00 14.68 ? ? ? ? ? ? 98 ASN A C 1 +ATOM 903 O O . ASN A 1 98 ? 10.298 10.201 30.258 1.00 16.20 ? ? ? ? ? ? 98 ASN A O 1 +ATOM 904 C CB . ASN A 1 98 ? 8.278 12.403 30.337 1.00 15.85 ? ? ? ? ? ? 98 ASN A CB 1 +ATOM 905 C CG . ASN A 1 98 ? 7.192 13.386 29.979 1.00 18.15 ? ? ? ? ? ? 98 ASN A CG 1 +ATOM 906 O OD1 . ASN A 1 98 ? 7.427 14.537 29.659 1.00 17.39 ? ? ? ? ? ? 98 ASN A OD1 1 +ATOM 907 N ND2 . ASN A 1 98 ? 5.958 12.904 30.073 1.00 16.74 ? ? ? ? ? ? 98 ASN A ND2 1 +ATOM 908 H H . ASN A 1 98 ? 7.900 10.180 28.444 1.00 15.00 ? ? ? ? ? ? 98 ASN A H 1 +ATOM 909 H HD21 . ASN A 1 98 ? 5.269 13.561 29.783 1.00 15.00 ? ? ? ? ? ? 98 ASN A HD21 1 +ATOM 910 H HD22 . ASN A 1 98 ? 5.737 11.995 30.424 1.00 15.00 ? ? ? ? ? ? 98 ASN A HD22 1 +ATOM 911 N N . PHE A 1 99 ? 11.434 12.148 29.720 1.00 17.67 ? ? ? ? ? ? 99 PHE A N 1 +ATOM 912 C CA . PHE A 1 99 ? 12.828 12.065 30.252 1.00 12.46 ? ? ? ? ? ? 99 PHE A CA 1 +ATOM 913 C C . PHE A 1 99 ? 13.520 13.457 30.096 1.00 7.09 ? ? ? ? ? ? 99 PHE A C 1 +ATOM 914 O O . PHE A 1 99 ? 14.655 13.569 29.636 0.00 8.50 ? ? ? ? ? ? 99 PHE A O 1 +ATOM 915 C CB . PHE A 1 99 ? 13.592 10.871 29.623 1.00 7.80 ? ? ? ? ? ? 99 PHE A CB 1 +ATOM 916 C CG . PHE A 1 99 ? 13.829 11.100 28.161 1.00 5.94 ? ? ? ? ? ? 99 PHE A CG 1 +ATOM 917 C CD1 . PHE A 1 99 ? 12.760 11.001 27.249 1.00 12.70 ? ? ? ? ? ? 99 PHE A CD1 1 +ATOM 918 C CD2 . PHE A 1 99 ? 15.119 11.457 27.715 1.00 10.34 ? ? ? ? ? ? 99 PHE A CD2 1 +ATOM 919 C CE1 . PHE A 1 99 ? 12.961 11.344 25.896 1.00 13.79 ? ? ? ? ? ? 99 PHE A CE1 1 +ATOM 920 C CE2 . PHE A 1 99 ? 15.334 11.813 26.366 1.00 13.69 ? ? ? ? ? ? 99 PHE A CE2 1 +ATOM 921 C CZ . PHE A 1 99 ? 14.238 11.793 25.477 1.00 16.36 ? ? ? ? ? ? 99 PHE A CZ 1 +ATOM 922 O OXT . PHE A 1 99 ? 12.893 14.487 30.349 0.00 8.50 ? ? ? ? ? ? 99 PHE A OXT 1 +ATOM 923 H H . PHE A 1 99 ? 11.228 13.069 29.393 1.00 15.00 ? ? ? ? ? ? 99 PHE A H 1 +ATOM 924 N N . PRO B 1 1 ? 13.587 15.375 28.006 1.00 37.18 ? ? ? ? ? ? 1 PRO B N 1 +ATOM 925 C CA . PRO B 1 1 ? 12.429 15.782 27.190 1.00 32.66 ? ? ? ? ? ? 1 PRO B CA 1 +ATOM 926 C C . PRO B 1 1 ? 11.058 15.893 27.827 1.00 30.70 ? ? ? ? ? ? 1 PRO B C 1 +ATOM 927 O O . PRO B 1 1 ? 10.652 14.934 28.450 1.00 33.19 ? ? ? ? ? ? 1 PRO B O 1 +ATOM 928 C CB . PRO B 1 1 ? 12.884 16.920 26.297 1.00 32.98 ? ? ? ? ? ? 1 PRO B CB 1 +ATOM 929 C CG . PRO B 1 1 ? 14.194 16.250 25.886 1.00 37.01 ? ? ? ? ? ? 1 PRO B CG 1 +ATOM 930 C CD . PRO B 1 1 ? 14.771 15.729 27.210 1.00 37.71 ? ? ? ? ? ? 1 PRO B CD 1 +ATOM 931 H H2 . PRO B 1 1 ? 13.592 15.705 29.002 0.00 0.00 ? ? ? ? ? ? 1 PRO B H2 1 +ATOM 932 H H3 . PRO B 1 1 ? 13.613 14.354 28.265 0.00 0.00 ? ? ? ? ? ? 1 PRO B H3 1 +ATOM 933 N N . GLN B 1 2 ? 10.289 16.963 27.520 1.00 25.28 ? ? ? ? ? ? 2 GLN B N 1 +ATOM 934 C CA . GLN B 1 2 ? 8.951 16.454 27.183 1.00 22.03 ? ? ? ? ? ? 2 GLN B CA 1 +ATOM 935 C C . GLN B 1 2 ? 8.735 16.286 25.690 1.00 18.15 ? ? ? ? ? ? 2 GLN B C 1 +ATOM 936 O O . GLN B 1 2 ? 9.066 17.182 24.944 1.00 19.19 ? ? ? ? ? ? 2 GLN B O 1 +ATOM 937 C CB . GLN B 1 2 ? 7.858 17.317 27.754 1.00 24.59 ? ? ? ? ? ? 2 GLN B CB 1 +ATOM 938 C CG . GLN B 1 2 ? 6.487 16.636 27.780 1.00 21.41 ? ? ? ? ? ? 2 GLN B CG 1 +ATOM 939 C CD . GLN B 1 2 ? 5.550 17.497 28.592 1.00 23.66 ? ? ? ? ? ? 2 GLN B CD 1 +ATOM 940 O OE1 . GLN B 1 2 ? 5.147 17.232 29.715 1.00 17.87 ? ? ? ? ? ? 2 GLN B OE1 1 +ATOM 941 N NE2 . GLN B 1 2 ? 5.195 18.607 27.947 1.00 25.77 ? ? ? ? ? ? 2 GLN B NE2 1 +ATOM 942 H H . GLN B 1 2 ? 10.602 17.852 27.198 1.00 15.00 ? ? ? ? ? ? 2 GLN B H 1 +ATOM 943 H HE21 . GLN B 1 2 ? 4.611 19.180 28.515 1.00 15.00 ? ? ? ? ? ? 2 GLN B HE21 1 +ATOM 944 H HE22 . GLN B 1 2 ? 5.499 18.821 27.027 1.00 15.00 ? ? ? ? ? ? 2 GLN B HE22 1 +ATOM 945 N N . ILE B 1 3 ? 8.226 15.125 25.284 1.00 14.61 ? ? ? ? ? ? 3 ILE B N 1 +ATOM 946 C CA . ILE B 1 3 ? 8.003 14.894 23.853 1.00 14.42 ? ? ? ? ? ? 3 ILE B CA 1 +ATOM 947 C C . ILE B 1 3 ? 6.521 14.704 23.440 1.00 14.49 ? ? ? ? ? ? 3 ILE B C 1 +ATOM 948 O O . ILE B 1 3 ? 5.843 13.739 23.782 1.00 11.98 ? ? ? ? ? ? 3 ILE B O 1 +ATOM 949 C CB . ILE B 1 3 ? 8.908 13.730 23.358 1.00 15.82 ? ? ? ? ? ? 3 ILE B CB 1 +ATOM 950 C CG1 . ILE B 1 3 ? 10.386 13.948 23.707 1.00 17.70 ? ? ? ? ? ? 3 ILE B CG1 1 +ATOM 951 C CG2 . ILE B 1 3 ? 8.805 13.509 21.839 1.00 13.84 ? ? ? ? ? ? 3 ILE B CG2 1 +ATOM 952 C CD1 . ILE B 1 3 ? 11.258 12.860 23.102 1.00 16.91 ? ? ? ? ? ? 3 ILE B CD1 1 +ATOM 953 H H . ILE B 1 3 ? 8.033 14.449 25.996 1.00 15.00 ? ? ? ? ? ? 3 ILE B H 1 +ATOM 954 N N . THR B 1 4 ? 6.007 15.694 22.684 1.00 13.06 ? ? ? ? ? ? 4 THR B N 1 +ATOM 955 C CA . THR B 1 4 ? 4.637 15.475 22.179 1.00 11.34 ? ? ? ? ? ? 4 THR B CA 1 +ATOM 956 C C . THR B 1 4 ? 4.485 14.733 20.868 1.00 14.26 ? ? ? ? ? ? 4 THR B C 1 +ATOM 957 O O . THR B 1 4 ? 5.391 14.603 20.050 1.00 17.92 ? ? ? ? ? ? 4 THR B O 1 +ATOM 958 C CB . THR B 1 4 ? 3.842 16.757 21.981 1.00 12.43 ? ? ? ? ? ? 4 THR B CB 1 +ATOM 959 O OG1 . THR B 1 4 ? 4.477 17.558 20.973 1.00 16.86 ? ? ? ? ? ? 4 THR B OG1 1 +ATOM 960 C CG2 . THR B 1 4 ? 3.616 17.532 23.278 1.00 9.78 ? ? ? ? ? ? 4 THR B CG2 1 +ATOM 961 H H . THR B 1 4 ? 6.612 16.409 22.331 1.00 15.00 ? ? ? ? ? ? 4 THR B H 1 +ATOM 962 H HG1 . THR B 1 4 ? 4.039 18.402 20.956 1.00 15.00 ? ? ? ? ? ? 4 THR B HG1 1 +ATOM 963 N N . LEU B 1 5 ? 3.243 14.257 20.693 1.00 12.93 ? ? ? ? ? ? 5 LEU B N 1 +ATOM 964 C CA . LEU B 1 5 ? 2.994 13.361 19.550 1.00 10.05 ? ? ? ? ? ? 5 LEU B CA 1 +ATOM 965 C C . LEU B 1 5 ? 2.303 13.904 18.292 1.00 10.74 ? ? ? ? ? ? 5 LEU B C 1 +ATOM 966 O O . LEU B 1 5 ? 1.831 13.156 17.450 1.00 13.05 ? ? ? ? ? ? 5 LEU B O 1 +ATOM 967 C CB . LEU B 1 5 ? 2.233 12.124 20.046 1.00 12.05 ? ? ? ? ? ? 5 LEU B CB 1 +ATOM 968 C CG . LEU B 1 5 ? 2.952 11.008 20.841 1.00 12.23 ? ? ? ? ? ? 5 LEU B CG 1 +ATOM 969 C CD1 . LEU B 1 5 ? 4.489 11.031 20.848 1.00 11.19 ? ? ? ? ? ? 5 LEU B CD1 1 +ATOM 970 C CD2 . LEU B 1 5 ? 2.307 10.783 22.180 1.00 2.39 ? ? ? ? ? ? 5 LEU B CD2 1 +ATOM 971 H H . LEU B 1 5 ? 2.596 14.322 21.450 1.00 15.00 ? ? ? ? ? ? 5 LEU B H 1 +ATOM 972 N N . TRP B 1 6 ? 2.245 15.249 18.159 1.00 10.83 ? ? ? ? ? ? 6 TRP B N 1 +ATOM 973 C CA . TRP B 1 6 ? 1.758 15.805 16.880 1.00 8.95 ? ? ? ? ? ? 6 TRP B CA 1 +ATOM 974 C C . TRP B 1 6 ? 2.538 15.367 15.646 1.00 11.86 ? ? ? ? ? ? 6 TRP B C 1 +ATOM 975 O O . TRP B 1 6 ? 2.017 15.148 14.562 1.00 13.20 ? ? ? ? ? ? 6 TRP B O 1 +ATOM 976 C CB . TRP B 1 6 ? 1.831 17.332 16.775 1.00 9.49 ? ? ? ? ? ? 6 TRP B CB 1 +ATOM 977 C CG . TRP B 1 6 ? 1.039 18.078 17.808 1.00 7.19 ? ? ? ? ? ? 6 TRP B CG 1 +ATOM 978 C CD1 . TRP B 1 6 ? 1.619 18.811 18.841 1.00 9.16 ? ? ? ? ? ? 6 TRP B CD1 1 +ATOM 979 C CD2 . TRP B 1 6 ? -0.391 18.196 18.006 1.00 14.14 ? ? ? ? ? ? 6 TRP B CD2 1 +ATOM 980 N NE1 . TRP B 1 6 ? 0.692 19.339 19.659 1.00 7.62 ? ? ? ? ? ? 6 TRP B NE1 1 +ATOM 981 C CE2 . TRP B 1 6 ? -0.576 18.983 19.193 1.00 13.41 ? ? ? ? ? ? 6 TRP B CE2 1 +ATOM 982 C CE3 . TRP B 1 6 ? -1.528 17.737 17.295 1.00 16.58 ? ? ? ? ? ? 6 TRP B CE3 1 +ATOM 983 C CZ2 . TRP B 1 6 ? -1.887 19.274 19.659 1.00 10.89 ? ? ? ? ? ? 6 TRP B CZ2 1 +ATOM 984 C CZ3 . TRP B 1 6 ? -2.827 18.052 17.761 1.00 19.55 ? ? ? ? ? ? 6 TRP B CZ3 1 +ATOM 985 C CH2 . TRP B 1 6 ? -3.008 18.805 18.945 1.00 12.82 ? ? ? ? ? ? 6 TRP B CH2 1 +ATOM 986 H H . TRP B 1 6 ? 2.645 15.799 18.887 1.00 15.00 ? ? ? ? ? ? 6 TRP B H 1 +ATOM 987 H HE1 . TRP B 1 6 ? 0.877 19.912 20.438 1.00 15.00 ? ? ? ? ? ? 6 TRP B HE1 1 +ATOM 988 N N . LYS B 1 7 ? 3.857 15.254 15.865 1.00 15.08 ? ? ? ? ? ? 7 LYS B N 1 +ATOM 989 C CA . LYS B 1 7 ? 4.567 14.402 14.905 1.00 14.05 ? ? ? ? ? ? 7 LYS B CA 1 +ATOM 990 C C . LYS B 1 7 ? 5.265 13.130 15.437 1.00 10.87 ? ? ? ? ? ? 7 LYS B C 1 +ATOM 991 O O . LYS B 1 7 ? 5.190 12.773 16.605 1.00 8.04 ? ? ? ? ? ? 7 LYS B O 1 +ATOM 992 C CB . LYS B 1 7 ? 5.382 15.210 13.864 1.00 12.97 ? ? ? ? ? ? 7 LYS B CB 1 +ATOM 993 C CG . LYS B 1 7 ? 5.922 16.586 14.221 1.00 18.22 ? ? ? ? ? ? 7 LYS B CG 1 +ATOM 994 C CD . LYS B 1 7 ? 7.141 16.570 15.157 1.00 29.42 ? ? ? ? ? ? 7 LYS B CD 1 +ATOM 995 C CE . LYS B 1 7 ? 7.808 17.956 15.399 1.00 36.49 ? ? ? ? ? ? 7 LYS B CE 1 +ATOM 996 N NZ . LYS B 1 7 ? 8.467 18.487 14.174 1.00 41.16 ? ? ? ? ? ? 7 LYS B NZ 1 +ATOM 997 H H . LYS B 1 7 ? 4.258 15.573 16.719 1.00 15.00 ? ? ? ? ? ? 7 LYS B H 1 +ATOM 998 H HZ1 . LYS B 1 7 ? 9.010 17.725 13.719 1.00 15.00 ? ? ? ? ? ? 7 LYS B HZ1 1 +ATOM 999 H HZ2 . LYS B 1 7 ? 7.743 18.839 13.515 1.00 15.00 ? ? ? ? ? ? 7 LYS B HZ2 1 +ATOM 1000 H HZ3 . LYS B 1 7 ? 9.106 19.267 14.430 1.00 15.00 ? ? ? ? ? ? 7 LYS B HZ3 1 +ATOM 1001 N N . ARG B 1 8 ? 5.941 12.438 14.502 1.00 7.83 ? ? ? ? ? ? 8 ARG B N 1 +ATOM 1002 C CA . ARG B 1 8 ? 6.757 11.289 14.910 1.00 6.01 ? ? ? ? ? ? 8 ARG B CA 1 +ATOM 1003 C C . ARG B 1 8 ? 7.864 11.650 15.893 1.00 5.22 ? ? ? ? ? ? 8 ARG B C 1 +ATOM 1004 O O . ARG B 1 8 ? 8.538 12.670 15.755 1.00 2.00 ? ? ? ? ? ? 8 ARG B O 1 +ATOM 1005 C CB . ARG B 1 8 ? 7.392 10.626 13.672 1.00 8.34 ? ? ? ? ? ? 8 ARG B CB 1 +ATOM 1006 C CG . ARG B 1 8 ? 6.440 9.877 12.721 1.00 7.25 ? ? ? ? ? ? 8 ARG B CG 1 +ATOM 1007 C CD . ARG B 1 8 ? 7.149 9.217 11.559 1.00 4.59 ? ? ? ? ? ? 8 ARG B CD 1 +ATOM 1008 N NE . ARG B 1 8 ? 6.209 8.432 10.750 1.00 14.38 ? ? ? ? ? ? 8 ARG B NE 1 +ATOM 1009 C CZ . ARG B 1 8 ? 6.611 7.669 9.688 1.00 15.55 ? ? ? ? ? ? 8 ARG B CZ 1 +ATOM 1010 N NH1 . ARG B 1 8 ? 7.894 7.559 9.332 1.00 16.70 ? ? ? ? ? ? 8 ARG B NH1 1 +ATOM 1011 N NH2 . ARG B 1 8 ? 5.699 7.025 8.965 1.00 18.53 ? ? ? ? ? ? 8 ARG B NH2 1 +ATOM 1012 H H . ARG B 1 8 ? 5.902 12.755 13.558 1.00 15.00 ? ? ? ? ? ? 8 ARG B H 1 +ATOM 1013 H HE . ARG B 1 8 ? 5.228 8.480 10.936 1.00 15.00 ? ? ? ? ? ? 8 ARG B HE 1 +ATOM 1014 H HH11 . ARG B 1 8 ? 8.599 8.035 9.858 1.00 15.00 ? ? ? ? ? ? 8 ARG B HH11 1 +ATOM 1015 H HH12 . ARG B 1 8 ? 8.151 7.003 8.542 1.00 15.00 ? ? ? ? ? ? 8 ARG B HH12 1 +ATOM 1016 H HH21 . ARG B 1 8 ? 4.729 7.091 9.197 1.00 15.00 ? ? ? ? ? ? 8 ARG B HH21 1 +ATOM 1017 H HH22 . ARG B 1 8 ? 5.993 6.478 8.181 1.00 15.00 ? ? ? ? ? ? 8 ARG B HH22 1 +ATOM 1018 N N . PRO B 1 9 ? 8.052 10.777 16.909 1.00 7.39 ? ? ? ? ? ? 9 PRO B N 1 +ATOM 1019 C CA . PRO B 1 9 ? 9.075 11.107 17.923 1.00 8.37 ? ? ? ? ? ? 9 PRO B CA 1 +ATOM 1020 C C . PRO B 1 9 ? 10.507 10.656 17.556 1.00 5.80 ? ? ? ? ? ? 9 PRO B C 1 +ATOM 1021 O O . PRO B 1 9 ? 11.032 9.686 18.101 1.00 5.48 ? ? ? ? ? ? 9 PRO B O 1 +ATOM 1022 C CB . PRO B 1 9 ? 8.443 10.425 19.155 1.00 6.26 ? ? ? ? ? ? 9 PRO B CB 1 +ATOM 1023 C CG . PRO B 1 9 ? 7.757 9.168 18.601 1.00 3.24 ? ? ? ? ? ? 9 PRO B CG 1 +ATOM 1024 C CD . PRO B 1 9 ? 7.280 9.572 17.223 1.00 5.14 ? ? ? ? ? ? 9 PRO B CD 1 +ATOM 1025 N N . LEU B 1 10 ? 11.099 11.404 16.586 1.00 6.45 ? ? ? ? ? ? 10 LEU B N 1 +ATOM 1026 C CA . LEU B 1 10 ? 12.530 11.236 16.151 1.00 10.46 ? ? ? ? ? ? 10 LEU B CA 1 +ATOM 1027 C C . LEU B 1 10 ? 13.651 11.856 17.014 1.00 10.72 ? ? ? ? ? ? 10 LEU B C 1 +ATOM 1028 O O . LEU B 1 10 ? 13.723 13.054 17.210 1.00 11.17 ? ? ? ? ? ? 10 LEU B O 1 +ATOM 1029 C CB . LEU B 1 10 ? 12.878 11.732 14.743 1.00 7.46 ? ? ? ? ? ? 10 LEU B CB 1 +ATOM 1030 C CG . LEU B 1 10 ? 12.299 10.972 13.559 1.00 16.13 ? ? ? ? ? ? 10 LEU B CG 1 +ATOM 1031 C CD1 . LEU B 1 10 ? 12.546 9.461 13.564 1.00 18.86 ? ? ? ? ? ? 10 LEU B CD1 1 +ATOM 1032 C CD2 . LEU B 1 10 ? 10.829 11.269 13.370 1.00 23.21 ? ? ? ? ? ? 10 LEU B CD2 1 +ATOM 1033 H H . LEU B 1 10 ? 10.550 12.178 16.265 1.00 15.00 ? ? ? ? ? ? 10 LEU B H 1 +ATOM 1034 N N . VAL B 1 11 ? 14.543 11.008 17.521 1.00 12.29 ? ? ? ? ? ? 11 VAL B N 1 +ATOM 1035 C CA . VAL B 1 11 ? 15.734 11.566 18.162 1.00 12.15 ? ? ? ? ? ? 11 VAL B CA 1 +ATOM 1036 C C . VAL B 1 11 ? 17.039 11.269 17.422 1.00 14.43 ? ? ? ? ? ? 11 VAL B C 1 +ATOM 1037 O O . VAL B 1 11 ? 17.126 10.470 16.493 1.00 10.98 ? ? ? ? ? ? 11 VAL B O 1 +ATOM 1038 C CB . VAL B 1 11 ? 15.825 11.155 19.642 1.00 14.58 ? ? ? ? ? ? 11 VAL B CB 1 +ATOM 1039 C CG1 . VAL B 1 11 ? 14.809 11.938 20.469 1.00 18.20 ? ? ? ? ? ? 11 VAL B CG1 1 +ATOM 1040 C CG2 . VAL B 1 11 ? 15.703 9.641 19.871 1.00 11.13 ? ? ? ? ? ? 11 VAL B CG2 1 +ATOM 1041 H H . VAL B 1 11 ? 14.370 10.032 17.437 1.00 15.00 ? ? ? ? ? ? 11 VAL B H 1 +ATOM 1042 N N . THR B 1 12 ? 18.082 11.970 17.903 1.00 17.32 ? ? ? ? ? ? 12 THR B N 1 +ATOM 1043 C CA . THR B 1 12 ? 19.472 11.559 17.587 1.00 16.89 ? ? ? ? ? ? 12 THR B CA 1 +ATOM 1044 C C . THR B 1 12 ? 20.117 10.551 18.529 1.00 15.64 ? ? ? ? ? ? 12 THR B C 1 +ATOM 1045 O O . THR B 1 12 ? 20.067 10.620 19.752 1.00 17.75 ? ? ? ? ? ? 12 THR B O 1 +ATOM 1046 C CB . THR B 1 12 ? 20.414 12.758 17.462 1.00 18.04 ? ? ? ? ? ? 12 THR B CB 1 +ATOM 1047 O OG1 . THR B 1 12 ? 20.038 13.533 16.308 1.00 21.81 ? ? ? ? ? ? 12 THR B OG1 1 +ATOM 1048 C CG2 . THR B 1 12 ? 21.917 12.400 17.404 1.00 18.90 ? ? ? ? ? ? 12 THR B CG2 1 +ATOM 1049 H H . THR B 1 12 ? 17.865 12.659 18.592 1.00 15.00 ? ? ? ? ? ? 12 THR B H 1 +ATOM 1050 H HG1 . THR B 1 12 ? 19.091 13.514 16.241 1.00 15.00 ? ? ? ? ? ? 12 THR B HG1 1 +ATOM 1051 N N . ILE B 1 13 ? 20.736 9.600 17.861 1.00 15.87 ? ? ? ? ? ? 13 ILE B N 1 +ATOM 1052 C CA . ILE B 1 13 ? 21.551 8.582 18.500 1.00 18.13 ? ? ? ? ? ? 13 ILE B CA 1 +ATOM 1053 C C . ILE B 1 13 ? 22.966 8.447 17.862 1.00 20.14 ? ? ? ? ? ? 13 ILE B C 1 +ATOM 1054 O O . ILE B 1 13 ? 23.155 8.590 16.653 1.00 22.93 ? ? ? ? ? ? 13 ILE B O 1 +ATOM 1055 C CB . ILE B 1 13 ? 20.781 7.241 18.489 1.00 16.33 ? ? ? ? ? ? 13 ILE B CB 1 +ATOM 1056 C CG1 . ILE B 1 13 ? 20.778 6.658 17.067 1.00 14.28 ? ? ? ? ? ? 13 ILE B CG1 1 +ATOM 1057 C CG2 . ILE B 1 13 ? 19.348 7.415 19.043 1.00 7.89 ? ? ? ? ? ? 13 ILE B CG2 1 +ATOM 1058 C CD1 . ILE B 1 13 ? 20.940 5.139 17.014 1.00 14.30 ? ? ? ? ? ? 13 ILE B CD1 1 +ATOM 1059 H H . ILE B 1 13 ? 20.664 9.631 16.862 1.00 15.00 ? ? ? ? ? ? 13 ILE B H 1 +ATOM 1060 N N . ARG B 1 14 ? 23.937 8.152 18.748 1.00 18.38 ? ? ? ? ? ? 14 ARG B N 1 +ATOM 1061 C CA . ARG B 1 14 ? 25.293 7.749 18.339 1.00 18.22 ? ? ? ? ? ? 14 ARG B CA 1 +ATOM 1062 C C . ARG B 1 14 ? 25.746 6.328 18.747 1.00 19.03 ? ? ? ? ? ? 14 ARG B C 1 +ATOM 1063 O O . ARG B 1 14 ? 25.735 5.918 19.912 1.00 17.41 ? ? ? ? ? ? 14 ARG B O 1 +ATOM 1064 C CB . ARG B 1 14 ? 26.312 8.748 18.855 1.00 20.63 ? ? ? ? ? ? 14 ARG B CB 1 +ATOM 1065 C CG . ARG B 1 14 ? 25.921 10.196 18.572 1.00 19.56 ? ? ? ? ? ? 14 ARG B CG 1 +ATOM 1066 C CD . ARG B 1 14 ? 26.878 11.184 19.231 1.00 17.96 ? ? ? ? ? ? 14 ARG B CD 1 +ATOM 1067 N NE . ARG B 1 14 ? 26.288 12.520 19.271 1.00 18.75 ? ? ? ? ? ? 14 ARG B NE 1 +ATOM 1068 C CZ . ARG B 1 14 ? 26.489 13.396 18.267 1.00 17.61 ? ? ? ? ? ? 14 ARG B CZ 1 +ATOM 1069 N NH1 . ARG B 1 14 ? 27.340 13.131 17.281 1.00 21.18 ? ? ? ? ? ? 14 ARG B NH1 1 +ATOM 1070 N NH2 . ARG B 1 14 ? 25.818 14.542 18.261 1.00 13.12 ? ? ? ? ? ? 14 ARG B NH2 1 +ATOM 1071 H H . ARG B 1 14 ? 23.666 8.180 19.703 1.00 15.00 ? ? ? ? ? ? 14 ARG B H 1 +ATOM 1072 H HE . ARG B 1 14 ? 25.645 12.762 19.997 1.00 15.00 ? ? ? ? ? ? 14 ARG B HE 1 +ATOM 1073 H HH11 . ARG B 1 14 ? 27.865 12.281 17.269 1.00 15.00 ? ? ? ? ? ? 14 ARG B HH11 1 +ATOM 1074 H HH12 . ARG B 1 14 ? 27.463 13.799 16.546 1.00 15.00 ? ? ? ? ? ? 14 ARG B HH12 1 +ATOM 1075 H HH21 . ARG B 1 14 ? 25.170 14.740 18.995 1.00 15.00 ? ? ? ? ? ? 14 ARG B HH21 1 +ATOM 1076 H HH22 . ARG B 1 14 ? 25.958 15.206 17.525 1.00 15.00 ? ? ? ? ? ? 14 ARG B HH22 1 +ATOM 1077 N N . ILE B 1 15 ? 26.136 5.587 17.692 1.00 19.14 ? ? ? ? ? ? 15 ILE B N 1 +ATOM 1078 C CA . ILE B 1 15 ? 26.675 4.223 17.875 1.00 20.97 ? ? ? ? ? ? 15 ILE B CA 1 +ATOM 1079 C C . ILE B 1 15 ? 27.990 4.067 17.116 1.00 21.93 ? ? ? ? ? ? 15 ILE B C 1 +ATOM 1080 O O . ILE B 1 15 ? 28.096 4.437 15.946 1.00 21.67 ? ? ? ? ? ? 15 ILE B O 1 +ATOM 1081 C CB . ILE B 1 15 ? 25.761 3.081 17.346 1.00 21.14 ? ? ? ? ? ? 15 ILE B CB 1 +ATOM 1082 C CG1 . ILE B 1 15 ? 24.325 3.432 17.085 1.00 19.78 ? ? ? ? ? ? 15 ILE B CG1 1 +ATOM 1083 C CG2 . ILE B 1 15 ? 25.817 1.794 18.173 1.00 21.67 ? ? ? ? ? ? 15 ILE B CG2 1 +ATOM 1084 C CD1 . ILE B 1 15 ? 24.119 3.521 15.577 1.00 18.76 ? ? ? ? ? ? 15 ILE B CD1 1 +ATOM 1085 H H . ILE B 1 15 ? 26.065 6.047 16.803 1.00 15.00 ? ? ? ? ? ? 15 ILE B H 1 +ATOM 1086 N N . GLY B 1 16 ? 29.000 3.497 17.790 1.00 22.82 ? ? ? ? ? ? 16 GLY B N 1 +ATOM 1087 C CA . GLY B 1 16 ? 30.321 3.473 17.114 1.00 22.20 ? ? ? ? ? ? 16 GLY B CA 1 +ATOM 1088 C C . GLY B 1 16 ? 30.974 4.847 17.146 1.00 20.60 ? ? ? ? ? ? 16 GLY B C 1 +ATOM 1089 O O . GLY B 1 16 ? 30.938 5.546 18.147 1.00 25.71 ? ? ? ? ? ? 16 GLY B O 1 +ATOM 1090 H H . GLY B 1 16 ? 28.857 3.297 18.757 1.00 15.00 ? ? ? ? ? ? 16 GLY B H 1 +ATOM 1091 N N . GLY B 1 17 ? 31.437 5.279 15.994 1.00 18.01 ? ? ? ? ? ? 17 GLY B N 1 +ATOM 1092 C CA . GLY B 1 17 ? 31.429 6.751 15.988 1.00 19.32 ? ? ? ? ? ? 17 GLY B CA 1 +ATOM 1093 C C . GLY B 1 17 ? 30.339 7.400 15.110 1.00 23.21 ? ? ? ? ? ? 17 GLY B C 1 +ATOM 1094 O O . GLY B 1 17 ? 30.460 8.495 14.576 1.00 26.58 ? ? ? ? ? ? 17 GLY B O 1 +ATOM 1095 H H . GLY B 1 17 ? 31.595 4.698 15.200 1.00 15.00 ? ? ? ? ? ? 17 GLY B H 1 +ATOM 1096 N N . GLN B 1 18 ? 29.259 6.628 14.888 1.00 22.56 ? ? ? ? ? ? 18 GLN B N 1 +ATOM 1097 C CA . GLN B 1 18 ? 28.208 7.031 13.936 1.00 16.21 ? ? ? ? ? ? 18 GLN B CA 1 +ATOM 1098 C C . GLN B 1 18 ? 27.054 7.865 14.457 1.00 12.18 ? ? ? ? ? ? 18 GLN B C 1 +ATOM 1099 O O . GLN B 1 18 ? 26.491 7.608 15.509 1.00 9.33 ? ? ? ? ? ? 18 GLN B O 1 +ATOM 1100 C CB . GLN B 1 18 ? 27.677 5.814 13.157 1.00 18.45 ? ? ? ? ? ? 18 GLN B CB 1 +ATOM 1101 C CG . GLN B 1 18 ? 28.711 4.969 12.407 1.00 21.83 ? ? ? ? ? ? 18 GLN B CG 1 +ATOM 1102 C CD . GLN B 1 18 ? 29.484 5.767 11.340 1.00 31.86 ? ? ? ? ? ? 18 GLN B CD 1 +ATOM 1103 O OE1 . GLN B 1 18 ? 29.459 5.507 10.154 1.00 36.21 ? ? ? ? ? ? 18 GLN B OE1 1 +ATOM 1104 N NE2 . GLN B 1 18 ? 30.265 6.751 11.750 1.00 38.63 ? ? ? ? ? ? 18 GLN B NE2 1 +ATOM 1105 H H . GLN B 1 18 ? 29.143 5.839 15.481 1.00 15.00 ? ? ? ? ? ? 18 GLN B H 1 +ATOM 1106 H HE21 . GLN B 1 18 ? 30.753 7.166 10.988 1.00 15.00 ? ? ? ? ? ? 18 GLN B HE21 1 +ATOM 1107 H HE22 . GLN B 1 18 ? 30.409 7.077 12.678 1.00 15.00 ? ? ? ? ? ? 18 GLN B HE22 1 +ATOM 1108 N N . LEU B 1 19 ? 26.724 8.863 13.624 1.00 11.59 ? ? ? ? ? ? 19 LEU B N 1 +ATOM 1109 C CA . LEU B 1 19 ? 25.504 9.664 13.853 1.00 17.43 ? ? ? ? ? ? 19 LEU B CA 1 +ATOM 1110 C C . LEU B 1 19 ? 24.278 9.189 13.058 1.00 18.33 ? ? ? ? ? ? 19 LEU B C 1 +ATOM 1111 O O . LEU B 1 19 ? 24.321 9.210 11.834 1.00 15.36 ? ? ? ? ? ? 19 LEU B O 1 +ATOM 1112 C CB . LEU B 1 19 ? 25.725 11.148 13.493 1.00 19.73 ? ? ? ? ? ? 19 LEU B CB 1 +ATOM 1113 C CG . LEU B 1 19 ? 24.999 12.217 14.343 1.00 21.23 ? ? ? ? ? ? 19 LEU B CG 1 +ATOM 1114 C CD1 . LEU B 1 19 ? 25.361 13.624 13.837 1.00 21.44 ? ? ? ? ? ? 19 LEU B CD1 1 +ATOM 1115 C CD2 . LEU B 1 19 ? 23.485 12.072 14.414 1.00 18.91 ? ? ? ? ? ? 19 LEU B CD2 1 +ATOM 1116 H H . LEU B 1 19 ? 27.278 8.994 12.808 1.00 15.00 ? ? ? ? ? ? 19 LEU B H 1 +ATOM 1117 N N . LYS B 1 20 ? 23.215 8.804 13.816 1.00 16.80 ? ? ? ? ? ? 20 LYS B N 1 +ATOM 1118 C CA . LYS B 1 20 ? 21.904 8.407 13.282 1.00 15.52 ? ? ? ? ? ? 20 LYS B CA 1 +ATOM 1119 C C . LYS B 1 20 ? 20.676 9.181 13.812 1.00 17.36 ? ? ? ? ? ? 20 LYS B C 1 +ATOM 1120 O O . LYS B 1 20 ? 20.643 9.643 14.945 1.00 15.50 ? ? ? ? ? ? 20 LYS B O 1 +ATOM 1121 C CB . LYS B 1 20 ? 21.574 6.971 13.681 1.00 17.22 ? ? ? ? ? ? 20 LYS B CB 1 +ATOM 1122 C CG . LYS B 1 20 ? 22.607 5.882 13.524 1.00 13.99 ? ? ? ? ? ? 20 LYS B CG 1 +ATOM 1123 C CD . LYS B 1 20 ? 22.882 5.675 12.073 1.00 13.62 ? ? ? ? ? ? 20 LYS B CD 1 +ATOM 1124 C CE . LYS B 1 20 ? 24.025 4.717 11.895 1.00 16.99 ? ? ? ? ? ? 20 LYS B CE 1 +ATOM 1125 N NZ . LYS B 1 20 ? 24.484 4.868 10.504 1.00 24.02 ? ? ? ? ? ? 20 LYS B NZ 1 +ATOM 1126 H H . LYS B 1 20 ? 23.365 8.840 14.806 1.00 15.00 ? ? ? ? ? ? 20 LYS B H 1 +ATOM 1127 H HZ1 . LYS B 1 20 ? 24.754 5.857 10.329 1.00 15.00 ? ? ? ? ? ? 20 LYS B HZ1 1 +ATOM 1128 H HZ2 . LYS B 1 20 ? 25.303 4.247 10.342 1.00 15.00 ? ? ? ? ? ? 20 LYS B HZ2 1 +ATOM 1129 H HZ3 . LYS B 1 20 ? 23.715 4.598 9.857 1.00 15.00 ? ? ? ? ? ? 20 LYS B HZ3 1 +ATOM 1130 N N . GLU B 1 21 ? 19.602 9.192 12.983 1.00 20.16 ? ? ? ? ? ? 21 GLU B N 1 +ATOM 1131 C CA . GLU B 1 21 ? 18.268 9.421 13.598 1.00 21.51 ? ? ? ? ? ? 21 GLU B CA 1 +ATOM 1132 C C . GLU B 1 21 ? 17.361 8.190 13.818 1.00 18.01 ? ? ? ? ? ? 21 GLU B C 1 +ATOM 1133 O O . GLU B 1 21 ? 17.343 7.233 13.047 1.00 18.22 ? ? ? ? ? ? 21 GLU B O 1 +ATOM 1134 C CB . GLU B 1 21 ? 17.480 10.520 12.888 1.00 27.81 ? ? ? ? ? ? 21 GLU B CB 1 +ATOM 1135 C CG . GLU B 1 21 ? 17.066 10.131 11.457 1.00 39.64 ? ? ? ? ? ? 21 GLU B CG 1 +ATOM 1136 C CD . GLU B 1 21 ? 15.964 11.031 10.886 1.00 45.64 ? ? ? ? ? ? 21 GLU B CD 1 +ATOM 1137 O OE1 . GLU B 1 21 ? 15.654 12.058 11.515 1.00 50.60 ? ? ? ? ? ? 21 GLU B OE1 1 +ATOM 1138 O OE2 . GLU B 1 21 ? 15.421 10.685 9.817 1.00 42.07 ? ? ? ? ? ? 21 GLU B OE2 1 +ATOM 1139 H H . GLU B 1 21 ? 19.729 8.916 12.035 1.00 15.00 ? ? ? ? ? ? 21 GLU B H 1 +ATOM 1140 N N . ALA B 1 22 ? 16.616 8.230 14.925 1.00 13.80 ? ? ? ? ? ? 22 ALA B N 1 +ATOM 1141 C CA . ALA B 1 22 ? 15.823 7.055 15.287 1.00 11.87 ? ? ? ? ? ? 22 ALA B CA 1 +ATOM 1142 C C . ALA B 1 22 ? 14.518 7.381 16.019 1.00 11.18 ? ? ? ? ? ? 22 ALA B C 1 +ATOM 1143 O O . ALA B 1 22 ? 14.447 8.415 16.662 1.00 11.74 ? ? ? ? ? ? 22 ALA B O 1 +ATOM 1144 C CB . ALA B 1 22 ? 16.666 6.101 16.149 1.00 10.30 ? ? ? ? ? ? 22 ALA B CB 1 +ATOM 1145 H H . ALA B 1 22 ? 16.676 9.025 15.523 1.00 15.00 ? ? ? ? ? ? 22 ALA B H 1 +ATOM 1146 N N . LEU B 1 23 ? 13.514 6.468 15.921 1.00 10.61 ? ? ? ? ? ? 23 LEU B N 1 +ATOM 1147 C CA . LEU B 1 23 ? 12.192 6.568 16.594 1.00 9.03 ? ? ? ? ? ? 23 LEU B CA 1 +ATOM 1148 C C . LEU B 1 23 ? 12.109 6.049 18.004 1.00 4.38 ? ? ? ? ? ? 23 LEU B C 1 +ATOM 1149 O O . LEU B 1 23 ? 12.334 4.875 18.258 1.00 3.93 ? ? ? ? ? ? 23 LEU B O 1 +ATOM 1150 C CB . LEU B 1 23 ? 11.040 5.757 15.925 1.00 14.89 ? ? ? ? ? ? 23 LEU B CB 1 +ATOM 1151 C CG . LEU B 1 23 ? 10.386 6.220 14.622 1.00 15.84 ? ? ? ? ? ? 23 LEU B CG 1 +ATOM 1152 C CD1 . LEU B 1 23 ? 9.509 5.129 14.020 1.00 15.65 ? ? ? ? ? ? 23 LEU B CD1 1 +ATOM 1153 C CD2 . LEU B 1 23 ? 9.588 7.493 14.822 1.00 18.35 ? ? ? ? ? ? 23 LEU B CD2 1 +ATOM 1154 H H . LEU B 1 23 ? 13.736 5.654 15.389 1.00 15.00 ? ? ? ? ? ? 23 LEU B H 1 +ATOM 1155 N N . LEU B 1 24 ? 11.672 6.936 18.895 1.00 4.41 ? ? ? ? ? ? 24 LEU B N 1 +ATOM 1156 C CA . LEU B 1 24 ? 11.209 6.427 20.199 1.00 5.96 ? ? ? ? ? ? 24 LEU B CA 1 +ATOM 1157 C C . LEU B 1 24 ? 9.869 5.589 20.226 1.00 6.17 ? ? ? ? ? ? 24 LEU B C 1 +ATOM 1158 O O . LEU B 1 24 ? 8.750 6.062 20.072 1.00 3.94 ? ? ? ? ? ? 24 LEU B O 1 +ATOM 1159 C CB . LEU B 1 24 ? 11.234 7.643 21.120 1.00 9.00 ? ? ? ? ? ? 24 LEU B CB 1 +ATOM 1160 C CG . LEU B 1 24 ? 12.381 7.678 22.141 1.00 12.19 ? ? ? ? ? ? 24 LEU B CG 1 +ATOM 1161 C CD1 . LEU B 1 24 ? 13.719 7.199 21.578 1.00 6.06 ? ? ? ? ? ? 24 LEU B CD1 1 +ATOM 1162 C CD2 . LEU B 1 24 ? 12.451 9.015 22.873 1.00 5.03 ? ? ? ? ? ? 24 LEU B CD2 1 +ATOM 1163 H H . LEU B 1 24 ? 11.549 7.886 18.602 1.00 15.00 ? ? ? ? ? ? 24 LEU B H 1 +ATOM 1164 N N . ASP B 1 25 ? 10.009 4.262 20.364 1.00 7.45 ? ? ? ? ? ? 25 ASP B N 1 +ATOM 1165 C CA . ASP B 1 25 ? 8.798 3.452 20.120 1.00 7.91 ? ? ? ? ? ? 25 ASP B CA 1 +ATOM 1166 C C . ASP B 1 25 ? 8.248 2.587 21.300 1.00 5.74 ? ? ? ? ? ? 25 ASP B C 1 +ATOM 1167 O O . ASP B 1 25 ? 8.641 1.467 21.562 1.00 6.02 ? ? ? ? ? ? 25 ASP B O 1 +ATOM 1168 C CB . ASP B 1 25 ? 9.015 2.651 18.801 1.00 9.14 ? ? ? ? ? ? 25 ASP B CB 1 +ATOM 1169 C CG . ASP B 1 25 ? 7.778 1.925 18.308 1.00 12.45 ? ? ? ? ? ? 25 ASP B CG 1 +ATOM 1170 O OD1 . ASP B 1 25 ? 6.703 2.106 18.868 1.00 21.66 ? ? ? ? ? ? 25 ASP B OD1 1 +ATOM 1171 O OD2 . ASP B 1 25 ? 7.881 1.162 17.360 1.00 11.59 ? ? ? ? ? ? 25 ASP B OD2 1 +ATOM 1172 H H . ASP B 1 25 ? 10.914 3.852 20.515 1.00 15.00 ? ? ? ? ? ? 25 ASP B H 1 +ATOM 1173 N N . THR B 1 26 ? 7.241 3.084 22.009 1.00 6.69 ? ? ? ? ? ? 26 THR B N 1 +ATOM 1174 C CA . THR B 1 26 ? 6.714 2.258 23.143 1.00 6.27 ? ? ? ? ? ? 26 THR B CA 1 +ATOM 1175 C C . THR B 1 26 ? 6.004 0.933 22.778 1.00 7.34 ? ? ? ? ? ? 26 THR B C 1 +ATOM 1176 O O . THR B 1 26 ? 5.793 0.036 23.578 1.00 8.88 ? ? ? ? ? ? 26 THR B O 1 +ATOM 1177 C CB . THR B 1 26 ? 5.729 3.109 23.933 1.00 6.84 ? ? ? ? ? ? 26 THR B CB 1 +ATOM 1178 O OG1 . THR B 1 26 ? 4.608 3.464 23.074 1.00 9.25 ? ? ? ? ? ? 26 THR B OG1 1 +ATOM 1179 C CG2 . THR B 1 26 ? 6.425 4.368 24.451 1.00 2.00 ? ? ? ? ? ? 26 THR B CG2 1 +ATOM 1180 H H . THR B 1 26 ? 6.901 4.007 21.818 1.00 15.00 ? ? ? ? ? ? 26 THR B H 1 +ATOM 1181 H HG1 . THR B 1 26 ? 3.859 2.953 23.397 1.00 15.00 ? ? ? ? ? ? 26 THR B HG1 1 +ATOM 1182 N N . GLY B 1 27 ? 5.656 0.858 21.478 1.00 4.35 ? ? ? ? ? ? 27 GLY B N 1 +ATOM 1183 C CA . GLY B 1 27 ? 5.173 -0.400 20.906 1.00 9.46 ? ? ? ? ? ? 27 GLY B CA 1 +ATOM 1184 C C . GLY B 1 27 ? 6.203 -1.516 20.597 1.00 15.26 ? ? ? ? ? ? 27 GLY B C 1 +ATOM 1185 O O . GLY B 1 27 ? 5.877 -2.692 20.436 1.00 17.22 ? ? ? ? ? ? 27 GLY B O 1 +ATOM 1186 H H . GLY B 1 27 ? 5.801 1.683 20.945 1.00 15.00 ? ? ? ? ? ? 27 GLY B H 1 +ATOM 1187 N N . ALA B 1 28 ? 7.492 -1.103 20.522 1.00 14.40 ? ? ? ? ? ? 28 ALA B N 1 +ATOM 1188 C CA . ALA B 1 28 ? 8.551 -2.107 20.342 1.00 5.74 ? ? ? ? ? ? 28 ALA B CA 1 +ATOM 1189 C C . ALA B 1 28 ? 9.165 -2.701 21.615 1.00 2.42 ? ? ? ? ? ? 28 ALA B C 1 +ATOM 1190 O O . ALA B 1 28 ? 9.669 -2.061 22.526 1.00 2.00 ? ? ? ? ? ? 28 ALA B O 1 +ATOM 1191 C CB . ALA B 1 28 ? 9.661 -1.568 19.447 1.00 4.25 ? ? ? ? ? ? 28 ALA B CB 1 +ATOM 1192 H H . ALA B 1 28 ? 7.713 -0.156 20.744 1.00 15.00 ? ? ? ? ? ? 28 ALA B H 1 +ATOM 1193 N N . ASP B 1 29 ? 9.112 -4.029 21.619 1.00 2.74 ? ? ? ? ? ? 29 ASP B N 1 +ATOM 1194 C CA . ASP B 1 29 ? 9.838 -4.791 22.645 1.00 2.57 ? ? ? ? ? ? 29 ASP B CA 1 +ATOM 1195 C C . ASP B 1 29 ? 11.373 -4.638 22.626 1.00 3.27 ? ? ? ? ? ? 29 ASP B C 1 +ATOM 1196 O O . ASP B 1 29 ? 12.073 -4.576 23.621 1.00 7.51 ? ? ? ? ? ? 29 ASP B O 1 +ATOM 1197 C CB . ASP B 1 29 ? 9.512 -6.271 22.479 1.00 5.23 ? ? ? ? ? ? 29 ASP B CB 1 +ATOM 1198 C CG . ASP B 1 29 ? 8.133 -6.745 22.899 1.00 9.26 ? ? ? ? ? ? 29 ASP B CG 1 +ATOM 1199 O OD1 . ASP B 1 29 ? 7.455 -6.048 23.657 1.00 14.61 ? ? ? ? ? ? 29 ASP B OD1 1 +ATOM 1200 O OD2 . ASP B 1 29 ? 7.756 -7.845 22.469 1.00 8.73 ? ? ? ? ? ? 29 ASP B OD2 1 +ATOM 1201 H H . ASP B 1 29 ? 8.540 -4.432 20.905 1.00 15.00 ? ? ? ? ? ? 29 ASP B H 1 +ATOM 1202 N N . ASP B 1 30 ? 11.861 -4.594 21.390 1.00 6.36 ? ? ? ? ? ? 30 ASP B N 1 +ATOM 1203 C CA . ASP B 1 30 ? 13.280 -4.652 21.055 1.00 9.02 ? ? ? ? ? ? 30 ASP B CA 1 +ATOM 1204 C C . ASP B 1 30 ? 13.748 -3.529 20.146 1.00 8.29 ? ? ? ? ? ? 30 ASP B C 1 +ATOM 1205 O O . ASP B 1 30 ? 12.983 -2.852 19.483 1.00 11.43 ? ? ? ? ? ? 30 ASP B O 1 +ATOM 1206 C CB . ASP B 1 30 ? 13.615 -5.914 20.256 1.00 14.97 ? ? ? ? ? ? 30 ASP B CB 1 +ATOM 1207 C CG . ASP B 1 30 ? 13.403 -7.271 20.937 1.00 16.52 ? ? ? ? ? ? 30 ASP B CG 1 +ATOM 1208 O OD1 . ASP B 1 30 ? 13.879 -7.478 22.077 1.00 13.64 ? ? ? ? ? ? 30 ASP B OD1 1 +ATOM 1209 O OD2 . ASP B 1 30 ? 12.783 -8.114 20.271 1.00 16.84 ? ? ? ? ? ? 30 ASP B OD2 1 +ATOM 1210 H H . ASP B 1 30 ? 11.189 -4.560 20.656 1.00 15.00 ? ? ? ? ? ? 30 ASP B H 1 +ATOM 1211 N N . THR B 1 31 ? 15.069 -3.377 20.133 1.00 11.09 ? ? ? ? ? ? 31 THR B N 1 +ATOM 1212 C CA . THR B 1 31 ? 15.689 -2.288 19.330 1.00 10.79 ? ? ? ? ? ? 31 THR B CA 1 +ATOM 1213 C C . THR B 1 31 ? 16.168 -2.748 17.969 1.00 5.57 ? ? ? ? ? ? 31 THR B C 1 +ATOM 1214 O O . THR B 1 31 ? 16.972 -3.643 17.843 1.00 11.09 ? ? ? ? ? ? 31 THR B O 1 +ATOM 1215 C CB . THR B 1 31 ? 16.851 -1.587 20.106 1.00 7.86 ? ? ? ? ? ? 31 THR B CB 1 +ATOM 1216 O OG1 . THR B 1 31 ? 16.360 -0.962 21.300 1.00 3.89 ? ? ? ? ? ? 31 THR B OG1 1 +ATOM 1217 C CG2 . THR B 1 31 ? 17.629 -0.548 19.287 1.00 2.00 ? ? ? ? ? ? 31 THR B CG2 1 +ATOM 1218 H H . THR B 1 31 ? 15.617 -4.041 20.639 1.00 15.00 ? ? ? ? ? ? 31 THR B H 1 +ATOM 1219 H HG1 . THR B 1 31 ? 16.103 -1.648 21.915 1.00 15.00 ? ? ? ? ? ? 31 THR B HG1 1 +ATOM 1220 N N . VAL B 1 32 ? 15.612 -2.144 16.947 1.00 6.15 ? ? ? ? ? ? 32 VAL B N 1 +ATOM 1221 C CA . VAL B 1 32 ? 15.849 -2.621 15.593 1.00 6.00 ? ? ? ? ? ? 32 VAL B CA 1 +ATOM 1222 C C . VAL B 1 32 ? 16.503 -1.559 14.738 1.00 7.16 ? ? ? ? ? ? 32 VAL B C 1 +ATOM 1223 O O . VAL B 1 32 ? 15.939 -0.497 14.526 1.00 12.47 ? ? ? ? ? ? 32 VAL B O 1 +ATOM 1224 C CB . VAL B 1 32 ? 14.518 -3.116 15.014 1.00 3.33 ? ? ? ? ? ? 32 VAL B CB 1 +ATOM 1225 C CG1 . VAL B 1 32 ? 14.578 -3.566 13.547 1.00 8.75 ? ? ? ? ? ? 32 VAL B CG1 1 +ATOM 1226 C CG2 . VAL B 1 32 ? 14.063 -4.290 15.870 1.00 2.01 ? ? ? ? ? ? 32 VAL B CG2 1 +ATOM 1227 H H . VAL B 1 32 ? 15.020 -1.362 17.150 1.00 15.00 ? ? ? ? ? ? 32 VAL B H 1 +ATOM 1228 N N . LEU B 1 33 ? 17.741 -1.848 14.325 1.00 7.71 ? ? ? ? ? ? 33 LEU B N 1 +ATOM 1229 C CA . LEU B 1 33 ? 18.539 -0.837 13.600 1.00 10.06 ? ? ? ? ? ? 33 LEU B CA 1 +ATOM 1230 C C . LEU B 1 33 ? 18.820 -1.204 12.169 1.00 9.90 ? ? ? ? ? ? 33 LEU B C 1 +ATOM 1231 O O . LEU B 1 33 ? 18.788 -2.357 11.795 1.00 15.88 ? ? ? ? ? ? 33 LEU B O 1 +ATOM 1232 C CB . LEU B 1 33 ? 19.892 -0.557 14.286 1.00 11.85 ? ? ? ? ? ? 33 LEU B CB 1 +ATOM 1233 C CG . LEU B 1 33 ? 20.078 0.579 15.330 1.00 14.18 ? ? ? ? ? ? 33 LEU B CG 1 +ATOM 1234 C CD1 . LEU B 1 33 ? 18.852 0.924 16.195 1.00 13.47 ? ? ? ? ? ? 33 LEU B CD1 1 +ATOM 1235 C CD2 . LEU B 1 33 ? 21.275 0.276 16.230 1.00 12.15 ? ? ? ? ? ? 33 LEU B CD2 1 +ATOM 1236 H H . LEU B 1 33 ? 18.087 -2.770 14.499 1.00 15.00 ? ? ? ? ? ? 33 LEU B H 1 +ATOM 1237 N N . GLU B 1 34 ? 19.111 -0.206 11.360 1.00 14.19 ? ? ? ? ? ? 34 GLU B N 1 +ATOM 1238 C CA . GLU B 1 34 ? 19.536 -0.485 9.975 1.00 16.04 ? ? ? ? ? ? 34 GLU B CA 1 +ATOM 1239 C C . GLU B 1 34 ? 20.898 -1.177 9.727 1.00 15.98 ? ? ? ? ? ? 34 GLU B C 1 +ATOM 1240 O O . GLU B 1 34 ? 21.813 -1.161 10.535 1.00 15.35 ? ? ? ? ? ? 34 GLU B O 1 +ATOM 1241 C CB . GLU B 1 34 ? 19.605 0.826 9.249 1.00 19.39 ? ? ? ? ? ? 34 GLU B CB 1 +ATOM 1242 C CG . GLU B 1 34 ? 20.722 1.739 9.795 1.00 26.76 ? ? ? ? ? ? 34 GLU B CG 1 +ATOM 1243 C CD . GLU B 1 34 ? 20.801 2.877 8.814 1.00 34.63 ? ? ? ? ? ? 34 GLU B CD 1 +ATOM 1244 O OE1 . GLU B 1 34 ? 21.217 2.616 7.682 1.00 43.75 ? ? ? ? ? ? 34 GLU B OE1 1 +ATOM 1245 O OE2 . GLU B 1 34 ? 20.420 3.998 9.160 1.00 32.10 ? ? ? ? ? ? 34 GLU B OE2 1 +ATOM 1246 H H . GLU B 1 34 ? 19.139 0.709 11.757 1.00 15.00 ? ? ? ? ? ? 34 GLU B H 1 +ATOM 1247 N N . GLU B 1 35 ? 21.037 -1.752 8.535 1.00 17.85 ? ? ? ? ? ? 35 GLU B N 1 +ATOM 1248 C CA . GLU B 1 35 ? 22.295 -2.452 8.201 1.00 19.01 ? ? ? ? ? ? 35 GLU B CA 1 +ATOM 1249 C C . GLU B 1 35 ? 23.624 -1.752 8.500 1.00 20.56 ? ? ? ? ? ? 35 GLU B C 1 +ATOM 1250 O O . GLU B 1 35 ? 23.953 -0.712 7.941 1.00 22.63 ? ? ? ? ? ? 35 GLU B O 1 +ATOM 1251 C CB . GLU B 1 35 ? 22.267 -2.892 6.739 1.00 18.71 ? ? ? ? ? ? 35 GLU B CB 1 +ATOM 1252 C CG . GLU B 1 35 ? 23.137 -4.070 6.309 1.00 25.41 ? ? ? ? ? ? 35 GLU B CG 1 +ATOM 1253 C CD . GLU B 1 35 ? 23.127 -5.194 7.320 1.00 31.07 ? ? ? ? ? ? 35 GLU B CD 1 +ATOM 1254 O OE1 . GLU B 1 35 ? 22.065 -5.751 7.614 1.00 33.01 ? ? ? ? ? ? 35 GLU B OE1 1 +ATOM 1255 O OE2 . GLU B 1 35 ? 24.211 -5.505 7.809 1.00 33.12 ? ? ? ? ? ? 35 GLU B OE2 1 +ATOM 1256 H H . GLU B 1 35 ? 20.282 -1.708 7.888 1.00 15.00 ? ? ? ? ? ? 35 GLU B H 1 +ATOM 1257 N N . MET B 1 36 ? 24.359 -2.401 9.417 1.00 17.85 ? ? ? ? ? ? 36 MET B N 1 +ATOM 1258 C CA . MET B 1 36 ? 25.668 -1.889 9.802 1.00 16.22 ? ? ? ? ? ? 36 MET B CA 1 +ATOM 1259 C C . MET B 1 36 ? 26.715 -2.887 10.316 1.00 19.10 ? ? ? ? ? ? 36 MET B C 1 +ATOM 1260 O O . MET B 1 36 ? 26.436 -3.975 10.790 1.00 20.28 ? ? ? ? ? ? 36 MET B O 1 +ATOM 1261 C CB . MET B 1 36 ? 25.499 -0.745 10.786 1.00 18.45 ? ? ? ? ? ? 36 MET B CB 1 +ATOM 1262 C CG . MET B 1 36 ? 25.081 -1.138 12.201 1.00 21.13 ? ? ? ? ? ? 36 MET B CG 1 +ATOM 1263 S SD . MET B 1 36 ? 25.048 0.354 13.194 1.00 23.85 ? ? ? ? ? ? 36 MET B SD 1 +ATOM 1264 C CE . MET B 1 36 ? 23.662 1.119 12.338 1.00 23.44 ? ? ? ? ? ? 36 MET B CE 1 +ATOM 1265 H H . MET B 1 36 ? 23.929 -3.187 9.853 1.00 15.00 ? ? ? ? ? ? 36 MET B H 1 +ATOM 1266 N N . ASN B 1 37 ? 27.986 -2.485 10.207 1.00 22.03 ? ? ? ? ? ? 37 ASN B N 1 +ATOM 1267 C CA . ASN B 1 37 ? 28.949 -3.438 10.791 1.00 23.18 ? ? ? ? ? ? 37 ASN B CA 1 +ATOM 1268 C C . ASN B 1 37 ? 29.378 -3.126 12.225 1.00 19.96 ? ? ? ? ? ? 37 ASN B C 1 +ATOM 1269 O O . ASN B 1 37 ? 29.725 -2.007 12.566 1.00 20.91 ? ? ? ? ? ? 37 ASN B O 1 +ATOM 1270 C CB . ASN B 1 37 ? 30.132 -3.676 9.826 1.00 27.49 ? ? ? ? ? ? 37 ASN B CB 1 +ATOM 1271 C CG . ASN B 1 37 ? 30.702 -5.077 10.023 1.00 35.24 ? ? ? ? ? ? 37 ASN B CG 1 +ATOM 1272 O OD1 . ASN B 1 37 ? 30.397 -5.788 10.963 1.00 41.93 ? ? ? ? ? ? 37 ASN B OD1 1 +ATOM 1273 N ND2 . ASN B 1 37 ? 31.570 -5.480 9.113 1.00 36.98 ? ? ? ? ? ? 37 ASN B ND2 1 +ATOM 1274 H H . ASN B 1 37 ? 28.195 -1.569 9.874 1.00 15.00 ? ? ? ? ? ? 37 ASN B H 1 +ATOM 1275 H HD21 . ASN B 1 37 ? 31.921 -6.393 9.305 1.00 15.00 ? ? ? ? ? ? 37 ASN B HD21 1 +ATOM 1276 H HD22 . ASN B 1 37 ? 31.883 -4.926 8.350 1.00 15.00 ? ? ? ? ? ? 37 ASN B HD22 1 +ATOM 1277 N N . LEU B 1 38 ? 29.309 -4.142 13.064 1.00 16.38 ? ? ? ? ? ? 38 LEU B N 1 +ATOM 1278 C CA . LEU B 1 38 ? 29.572 -3.902 14.486 1.00 13.73 ? ? ? ? ? ? 38 LEU B CA 1 +ATOM 1279 C C . LEU B 1 38 ? 30.672 -4.815 15.041 1.00 16.59 ? ? ? ? ? ? 38 LEU B C 1 +ATOM 1280 O O . LEU B 1 38 ? 30.881 -5.966 14.639 1.00 18.31 ? ? ? ? ? ? 38 LEU B O 1 +ATOM 1281 C CB . LEU B 1 38 ? 28.261 -4.104 15.252 1.00 8.78 ? ? ? ? ? ? 38 LEU B CB 1 +ATOM 1282 C CG . LEU B 1 38 ? 27.534 -2.931 15.893 1.00 8.20 ? ? ? ? ? ? 38 LEU B CG 1 +ATOM 1283 C CD1 . LEU B 1 38 ? 27.680 -1.620 15.152 1.00 6.79 ? ? ? ? ? ? 38 LEU B CD1 1 +ATOM 1284 C CD2 . LEU B 1 38 ? 26.049 -3.255 16.082 1.00 9.67 ? ? ? ? ? ? 38 LEU B CD2 1 +ATOM 1285 H H . LEU B 1 38 ? 29.106 -5.046 12.686 1.00 15.00 ? ? ? ? ? ? 38 LEU B H 1 +ATOM 1286 N N . PRO B 1 39 ? 31.437 -4.284 16.011 1.00 16.54 ? ? ? ? ? ? 39 PRO B N 1 +ATOM 1287 C CA . PRO B 1 39 ? 32.392 -5.211 16.638 1.00 16.80 ? ? ? ? ? ? 39 PRO B CA 1 +ATOM 1288 C C . PRO B 1 39 ? 31.710 -6.381 17.333 1.00 18.98 ? ? ? ? ? ? 39 PRO B C 1 +ATOM 1289 O O . PRO B 1 39 ? 30.861 -6.185 18.187 1.00 23.65 ? ? ? ? ? ? 39 PRO B O 1 +ATOM 1290 C CB . PRO B 1 39 ? 33.194 -4.307 17.571 1.00 11.55 ? ? ? ? ? ? 39 PRO B CB 1 +ATOM 1291 C CG . PRO B 1 39 ? 32.285 -3.098 17.816 1.00 18.60 ? ? ? ? ? ? 39 PRO B CG 1 +ATOM 1292 C CD . PRO B 1 39 ? 31.499 -2.919 16.509 1.00 15.25 ? ? ? ? ? ? 39 PRO B CD 1 +ATOM 1293 N N . GLY B 1 40 ? 32.112 -7.602 16.940 1.00 19.65 ? ? ? ? ? ? 40 GLY B N 1 +ATOM 1294 C CA . GLY B 1 40 ? 31.768 -8.774 17.771 1.00 19.46 ? ? ? ? ? ? 40 GLY B CA 1 +ATOM 1295 C C . GLY B 1 40 ? 31.086 -10.008 17.131 1.00 19.70 ? ? ? ? ? ? 40 GLY B C 1 +ATOM 1296 O O . GLY B 1 40 ? 30.880 -10.132 15.928 1.00 16.77 ? ? ? ? ? ? 40 GLY B O 1 +ATOM 1297 H H . GLY B 1 40 ? 32.609 -7.655 16.081 1.00 15.00 ? ? ? ? ? ? 40 GLY B H 1 +ATOM 1298 N N . LYS B 1 41 ? 30.735 -10.942 18.032 1.00 22.02 ? ? ? ? ? ? 41 LYS B N 1 +ATOM 1299 C CA . LYS B 1 41 ? 29.912 -12.108 17.617 1.00 23.82 ? ? ? ? ? ? 41 LYS B CA 1 +ATOM 1300 C C . LYS B 1 41 ? 28.393 -11.915 17.692 1.00 21.29 ? ? ? ? ? ? 41 LYS B C 1 +ATOM 1301 O O . LYS B 1 41 ? 27.859 -11.242 18.567 1.00 25.33 ? ? ? ? ? ? 41 LYS B O 1 +ATOM 1302 C CB . LYS B 1 41 ? 30.291 -13.337 18.450 1.00 28.74 ? ? ? ? ? ? 41 LYS B CB 1 +ATOM 1303 C CG . LYS B 1 41 ? 31.518 -14.026 17.845 1.00 36.82 ? ? ? ? ? ? 41 LYS B CG 1 +ATOM 1304 C CD . LYS B 1 41 ? 32.275 -14.891 18.859 1.00 43.84 ? ? ? ? ? ? 41 LYS B CD 1 +ATOM 1305 C CE . LYS B 1 41 ? 33.584 -15.475 18.292 1.00 50.21 ? ? ? ? ? ? 41 LYS B CE 1 +ATOM 1306 N NZ . LYS B 1 41 ? 34.272 -16.305 19.307 1.00 53.29 ? ? ? ? ? ? 41 LYS B NZ 1 +ATOM 1307 H H . LYS B 1 41 ? 30.884 -10.710 18.991 1.00 15.00 ? ? ? ? ? ? 41 LYS B H 1 +ATOM 1308 H HZ1 . LYS B 1 41 ? 34.471 -15.730 20.151 1.00 15.00 ? ? ? ? ? ? 41 LYS B HZ1 1 +ATOM 1309 H HZ2 . LYS B 1 41 ? 33.664 -17.106 19.573 1.00 15.00 ? ? ? ? ? ? 41 LYS B HZ2 1 +ATOM 1310 H HZ3 . LYS B 1 41 ? 35.165 -16.665 18.913 1.00 15.00 ? ? ? ? ? ? 41 LYS B HZ3 1 +ATOM 1311 N N . TRP B 1 42 ? 27.716 -12.539 16.733 1.00 17.46 ? ? ? ? ? ? 42 TRP B N 1 +ATOM 1312 C CA . TRP B 1 42 ? 26.251 -12.403 16.649 1.00 13.49 ? ? ? ? ? ? 42 TRP B CA 1 +ATOM 1313 C C . TRP B 1 42 ? 25.510 -13.703 16.324 1.00 12.15 ? ? ? ? ? ? 42 TRP B C 1 +ATOM 1314 O O . TRP B 1 42 ? 26.051 -14.654 15.782 1.00 14.95 ? ? ? ? ? ? 42 TRP B O 1 +ATOM 1315 C CB . TRP B 1 42 ? 25.920 -11.301 15.634 1.00 12.14 ? ? ? ? ? ? 42 TRP B CB 1 +ATOM 1316 C CG . TRP B 1 42 ? 26.433 -11.709 14.276 1.00 13.33 ? ? ? ? ? ? 42 TRP B CG 1 +ATOM 1317 C CD1 . TRP B 1 42 ? 27.694 -11.399 13.751 1.00 11.85 ? ? ? ? ? ? 42 TRP B CD1 1 +ATOM 1318 C CD2 . TRP B 1 42 ? 25.816 -12.577 13.295 1.00 13.96 ? ? ? ? ? ? 42 TRP B CD2 1 +ATOM 1319 N NE1 . TRP B 1 42 ? 27.895 -12.010 12.555 1.00 15.10 ? ? ? ? ? ? 42 TRP B NE1 1 +ATOM 1320 C CE2 . TRP B 1 42 ? 26.761 -12.752 12.231 1.00 16.59 ? ? ? ? ? ? 42 TRP B CE2 1 +ATOM 1321 C CE3 . TRP B 1 42 ? 24.574 -13.230 13.225 1.00 15.64 ? ? ? ? ? ? 42 TRP B CE3 1 +ATOM 1322 C CZ2 . TRP B 1 42 ? 26.437 -13.571 11.121 1.00 13.61 ? ? ? ? ? ? 42 TRP B CZ2 1 +ATOM 1323 C CZ3 . TRP B 1 42 ? 24.267 -14.045 12.116 1.00 15.99 ? ? ? ? ? ? 42 TRP B CZ3 1 +ATOM 1324 C CH2 . TRP B 1 42 ? 25.190 -14.212 11.063 1.00 13.09 ? ? ? ? ? ? 42 TRP B CH2 1 +ATOM 1325 H H . TRP B 1 42 ? 28.224 -13.083 16.070 1.00 15.00 ? ? ? ? ? ? 42 TRP B H 1 +ATOM 1326 H HE1 . TRP B 1 42 ? 28.703 -11.932 12.009 1.00 15.00 ? ? ? ? ? ? 42 TRP B HE1 1 +ATOM 1327 N N . LYS B 1 43 ? 24.230 -13.726 16.645 1.00 14.76 ? ? ? ? ? ? 43 LYS B N 1 +ATOM 1328 C CA . LYS B 1 43 ? 23.372 -14.840 16.156 1.00 15.01 ? ? ? ? ? ? 43 LYS B CA 1 +ATOM 1329 C C . LYS B 1 43 ? 22.199 -14.340 15.321 1.00 11.60 ? ? ? ? ? ? 43 LYS B C 1 +ATOM 1330 O O . LYS B 1 43 ? 21.748 -13.221 15.518 1.00 8.57 ? ? ? ? ? ? 43 LYS B O 1 +ATOM 1331 C CB . LYS B 1 43 ? 22.767 -15.644 17.315 1.00 16.41 ? ? ? ? ? ? 43 LYS B CB 1 +ATOM 1332 C CG . LYS B 1 43 ? 23.607 -15.698 18.598 1.00 25.64 ? ? ? ? ? ? 43 LYS B CG 1 +ATOM 1333 C CD . LYS B 1 43 ? 22.793 -16.192 19.807 1.00 30.49 ? ? ? ? ? ? 43 LYS B CD 1 +ATOM 1334 C CE . LYS B 1 43 ? 23.348 -15.681 21.147 1.00 36.04 ? ? ? ? ? ? 43 LYS B CE 1 +ATOM 1335 N NZ . LYS B 1 43 ? 22.471 -16.056 22.271 1.00 38.16 ? ? ? ? ? ? 43 LYS B NZ 1 +ATOM 1336 H H . LYS B 1 43 ? 23.865 -12.950 17.161 1.00 15.00 ? ? ? ? ? ? 43 LYS B H 1 +ATOM 1337 H HZ1 . LYS B 1 43 ? 22.222 -17.062 22.183 1.00 15.00 ? ? ? ? ? ? 43 LYS B HZ1 1 +ATOM 1338 H HZ2 . LYS B 1 43 ? 22.986 -15.906 23.162 1.00 15.00 ? ? ? ? ? ? 43 LYS B HZ2 1 +ATOM 1339 H HZ3 . LYS B 1 43 ? 21.605 -15.481 22.263 1.00 15.00 ? ? ? ? ? ? 43 LYS B HZ3 1 +ATOM 1340 N N . PRO B 1 44 ? 21.685 -15.153 14.386 1.00 11.50 ? ? ? ? ? ? 44 PRO B N 1 +ATOM 1341 C CA . PRO B 1 44 ? 20.414 -14.773 13.752 1.00 10.15 ? ? ? ? ? ? 44 PRO B CA 1 +ATOM 1342 C C . PRO B 1 44 ? 19.083 -15.026 14.525 1.00 14.71 ? ? ? ? ? ? 44 PRO B C 1 +ATOM 1343 O O . PRO B 1 44 ? 18.892 -15.789 15.474 1.00 15.94 ? ? ? ? ? ? 44 PRO B O 1 +ATOM 1344 C CB . PRO B 1 44 ? 20.520 -15.507 12.434 1.00 7.39 ? ? ? ? ? ? 44 PRO B CB 1 +ATOM 1345 C CG . PRO B 1 44 ? 21.262 -16.797 12.740 1.00 10.30 ? ? ? ? ? ? 44 PRO B CG 1 +ATOM 1346 C CD . PRO B 1 44 ? 22.250 -16.379 13.839 1.00 15.80 ? ? ? ? ? ? 44 PRO B CD 1 +ATOM 1347 N N . LYS B 1 45 ? 18.106 -14.284 14.016 1.00 14.12 ? ? ? ? ? ? 45 LYS B N 1 +ATOM 1348 C CA . LYS B 1 45 ? 16.794 -14.321 14.642 1.00 7.59 ? ? ? ? ? ? 45 LYS B CA 1 +ATOM 1349 C C . LYS B 1 45 ? 15.674 -14.033 13.602 1.00 10.68 ? ? ? ? ? ? 45 LYS B C 1 +ATOM 1350 O O . LYS B 1 45 ? 15.874 -13.253 12.677 1.00 13.93 ? ? ? ? ? ? 45 LYS B O 1 +ATOM 1351 C CB . LYS B 1 45 ? 16.948 -13.268 15.700 1.00 2.27 ? ? ? ? ? ? 45 LYS B CB 1 +ATOM 1352 C CG . LYS B 1 45 ? 16.151 -13.533 16.934 1.00 10.10 ? ? ? ? ? ? 45 LYS B CG 1 +ATOM 1353 C CD . LYS B 1 45 ? 15.901 -12.228 17.660 1.00 13.52 ? ? ? ? ? ? 45 LYS B CD 1 +ATOM 1354 C CE . LYS B 1 45 ? 14.845 -12.483 18.738 1.00 22.70 ? ? ? ? ? ? 45 LYS B CE 1 +ATOM 1355 N NZ . LYS B 1 45 ? 14.288 -11.214 19.244 1.00 24.26 ? ? ? ? ? ? 45 LYS B NZ 1 +ATOM 1356 H H . LYS B 1 45 ? 18.350 -13.597 13.327 1.00 15.00 ? ? ? ? ? ? 45 LYS B H 1 +ATOM 1357 H HZ1 . LYS B 1 45 ? 13.969 -10.630 18.445 1.00 15.00 ? ? ? ? ? ? 45 LYS B HZ1 1 +ATOM 1358 H HZ2 . LYS B 1 45 ? 13.480 -11.422 19.864 1.00 15.00 ? ? ? ? ? ? 45 LYS B HZ2 1 +ATOM 1359 H HZ3 . LYS B 1 45 ? 15.017 -10.705 19.784 1.00 15.00 ? ? ? ? ? ? 45 LYS B HZ3 1 +ATOM 1360 N N . MET B 1 46 ? 14.490 -14.663 13.752 1.00 15.78 ? ? ? ? ? ? 46 MET B N 1 +ATOM 1361 C CA . MET B 1 46 ? 13.281 -14.132 13.037 1.00 13.78 ? ? ? ? ? ? 46 MET B CA 1 +ATOM 1362 C C . MET B 1 46 ? 12.336 -13.203 13.877 1.00 11.68 ? ? ? ? ? ? 46 MET B C 1 +ATOM 1363 O O . MET B 1 46 ? 11.738 -13.624 14.856 1.00 11.56 ? ? ? ? ? ? 46 MET B O 1 +ATOM 1364 C CB . MET B 1 46 ? 12.405 -15.249 12.457 1.00 7.23 ? ? ? ? ? ? 46 MET B CB 1 +ATOM 1365 C CG . MET B 1 46 ? 13.121 -16.153 11.481 1.00 10.18 ? ? ? ? ? ? 46 MET B CG 1 +ATOM 1366 S SD . MET B 1 46 ? 13.485 -15.302 9.972 1.00 15.69 ? ? ? ? ? ? 46 MET B SD 1 +ATOM 1367 C CE . MET B 1 46 ? 11.863 -15.290 9.206 1.00 8.69 ? ? ? ? ? ? 46 MET B CE 1 +ATOM 1368 H H . MET B 1 46 ? 14.423 -15.366 14.457 1.00 15.00 ? ? ? ? ? ? 46 MET B H 1 +ATOM 1369 N N . ILE B 1 47 ? 12.207 -11.923 13.471 1.00 11.05 ? ? ? ? ? ? 47 ILE B N 1 +ATOM 1370 C CA . ILE B 1 47 ? 11.224 -11.056 14.153 1.00 8.18 ? ? ? ? ? ? 47 ILE B CA 1 +ATOM 1371 C C . ILE B 1 47 ? 10.063 -10.567 13.256 1.00 6.17 ? ? ? ? ? ? 47 ILE B C 1 +ATOM 1372 O O . ILE B 1 47 ? 10.203 -10.268 12.071 1.00 4.21 ? ? ? ? ? ? 47 ILE B O 1 +ATOM 1373 C CB . ILE B 1 47 ? 11.868 -9.870 14.915 1.00 6.47 ? ? ? ? ? ? 47 ILE B CB 1 +ATOM 1374 C CG1 . ILE B 1 47 ? 12.676 -8.934 14.035 1.00 8.49 ? ? ? ? ? ? 47 ILE B CG1 1 +ATOM 1375 C CG2 . ILE B 1 47 ? 12.748 -10.294 16.084 1.00 2.00 ? ? ? ? ? ? 47 ILE B CG2 1 +ATOM 1376 C CD1 . ILE B 1 47 ? 12.795 -7.565 14.730 1.00 7.40 ? ? ? ? ? ? 47 ILE B CD1 1 +ATOM 1377 H H . ILE B 1 47 ? 12.692 -11.654 12.636 1.00 15.00 ? ? ? ? ? ? 47 ILE B H 1 +ATOM 1378 N N . GLY B 1 48 ? 8.867 -10.542 13.860 1.00 7.20 ? ? ? ? ? ? 48 GLY B N 1 +ATOM 1379 C CA . GLY B 1 48 ? 7.681 -10.220 13.032 1.00 8.57 ? ? ? ? ? ? 48 GLY B CA 1 +ATOM 1380 C C . GLY B 1 48 ? 6.758 -9.082 13.466 1.00 9.75 ? ? ? ? ? ? 48 GLY B C 1 +ATOM 1381 O O . GLY B 1 48 ? 6.748 -8.612 14.598 1.00 8.98 ? ? ? ? ? ? 48 GLY B O 1 +ATOM 1382 H H . GLY B 1 48 ? 8.821 -10.741 14.834 1.00 15.00 ? ? ? ? ? ? 48 GLY B H 1 +ATOM 1383 N N . GLY B 1 49 ? 5.941 -8.656 12.514 1.00 13.64 ? ? ? ? ? ? 49 GLY B N 1 +ATOM 1384 C CA . GLY B 1 49 ? 4.937 -7.642 12.885 1.00 12.84 ? ? ? ? ? ? 49 GLY B CA 1 +ATOM 1385 C C . GLY B 1 49 ? 4.027 -7.270 11.734 1.00 15.22 ? ? ? ? ? ? 49 GLY B C 1 +ATOM 1386 O O . GLY B 1 49 ? 3.748 -8.129 10.915 1.00 18.27 ? ? ? ? ? ? 49 GLY B O 1 +ATOM 1387 H H . GLY B 1 49 ? 5.989 -9.057 11.606 1.00 15.00 ? ? ? ? ? ? 49 GLY B H 1 +ATOM 1388 N N . ILE B 1 50 ? 3.573 -6.002 11.639 1.00 13.68 ? ? ? ? ? ? 50 ILE B N 1 +ATOM 1389 C CA . ILE B 1 50 ? 2.706 -5.646 10.491 1.00 11.58 ? ? ? ? ? ? 50 ILE B CA 1 +ATOM 1390 C C . ILE B 1 50 ? 3.278 -6.090 9.113 1.00 13.86 ? ? ? ? ? ? 50 ILE B C 1 +ATOM 1391 O O . ILE B 1 50 ? 4.400 -5.782 8.730 1.00 20.94 ? ? ? ? ? ? 50 ILE B O 1 +ATOM 1392 C CB . ILE B 1 50 ? 2.409 -4.126 10.524 1.00 10.42 ? ? ? ? ? ? 50 ILE B CB 1 +ATOM 1393 C CG1 . ILE B 1 50 ? 1.846 -3.670 11.872 1.00 7.91 ? ? ? ? ? ? 50 ILE B CG1 1 +ATOM 1394 C CG2 . ILE B 1 50 ? 1.502 -3.590 9.395 1.00 2.54 ? ? ? ? ? ? 50 ILE B CG2 1 +ATOM 1395 C CD1 . ILE B 1 50 ? 0.604 -4.431 12.287 1.00 8.46 ? ? ? ? ? ? 50 ILE B CD1 1 +ATOM 1396 H H . ILE B 1 50 ? 3.886 -5.334 12.323 1.00 15.00 ? ? ? ? ? ? 50 ILE B H 1 +ATOM 1397 N N . GLY B 1 51 ? 2.506 -6.887 8.376 1.00 12.85 ? ? ? ? ? ? 51 GLY B N 1 +ATOM 1398 C CA . GLY B 1 51 ? 3.070 -7.232 7.062 1.00 11.85 ? ? ? ? ? ? 51 GLY B CA 1 +ATOM 1399 C C . GLY B 1 51 ? 3.804 -8.561 7.004 1.00 11.64 ? ? ? ? ? ? 51 GLY B C 1 +ATOM 1400 O O . GLY B 1 51 ? 3.910 -9.207 5.975 1.00 13.97 ? ? ? ? ? ? 51 GLY B O 1 +ATOM 1401 H H . GLY B 1 51 ? 1.636 -7.226 8.725 1.00 15.00 ? ? ? ? ? ? 51 GLY B H 1 +ATOM 1402 N N . GLY B 1 52 ? 4.281 -8.956 8.192 1.00 10.16 ? ? ? ? ? ? 52 GLY B N 1 +ATOM 1403 C CA . GLY B 1 52 ? 5.063 -10.188 8.325 1.00 8.77 ? ? ? ? ? ? 52 GLY B CA 1 +ATOM 1404 C C . GLY B 1 52 ? 6.412 -10.082 9.085 1.00 10.56 ? ? ? ? ? ? 52 GLY B C 1 +ATOM 1405 O O . GLY B 1 52 ? 6.637 -9.230 9.933 1.00 11.23 ? ? ? ? ? ? 52 GLY B O 1 +ATOM 1406 H H . GLY B 1 52 ? 4.104 -8.383 8.992 1.00 15.00 ? ? ? ? ? ? 52 GLY B H 1 +ATOM 1407 N N . PHE B 1 53 ? 7.281 -11.045 8.747 1.00 11.07 ? ? ? ? ? ? 53 PHE B N 1 +ATOM 1408 C CA . PHE B 1 53 ? 8.617 -11.307 9.317 1.00 11.70 ? ? ? ? ? ? 53 PHE B CA 1 +ATOM 1409 C C . PHE B 1 53 ? 9.829 -10.842 8.488 1.00 15.80 ? ? ? ? ? ? 53 PHE B C 1 +ATOM 1410 O O . PHE B 1 53 ? 9.897 -11.013 7.274 1.00 18.07 ? ? ? ? ? ? 53 PHE B O 1 +ATOM 1411 C CB . PHE B 1 53 ? 8.808 -12.806 9.572 1.00 4.31 ? ? ? ? ? ? 53 PHE B CB 1 +ATOM 1412 C CG . PHE B 1 53 ? 8.086 -13.211 10.823 1.00 4.87 ? ? ? ? ? ? 53 PHE B CG 1 +ATOM 1413 C CD1 . PHE B 1 53 ? 6.707 -13.481 10.761 1.00 6.81 ? ? ? ? ? ? 53 PHE B CD1 1 +ATOM 1414 C CD2 . PHE B 1 53 ? 8.807 -13.338 12.023 1.00 2.00 ? ? ? ? ? ? 53 PHE B CD2 1 +ATOM 1415 C CE1 . PHE B 1 53 ? 6.043 -13.950 11.908 1.00 10.37 ? ? ? ? ? ? 53 PHE B CE1 1 +ATOM 1416 C CE2 . PHE B 1 53 ? 8.152 -13.838 13.157 1.00 4.35 ? ? ? ? ? ? 53 PHE B CE2 1 +ATOM 1417 C CZ . PHE B 1 53 ? 6.780 -14.160 13.088 1.00 4.36 ? ? ? ? ? ? 53 PHE B CZ 1 +ATOM 1418 H H . PHE B 1 53 ? 6.973 -11.592 7.970 1.00 15.00 ? ? ? ? ? ? 53 PHE B H 1 +ATOM 1419 N N . ILE B 1 54 ? 10.807 -10.278 9.234 1.00 16.52 ? ? ? ? ? ? 54 ILE B N 1 +ATOM 1420 C CA . ILE B 1 54 ? 12.170 -10.098 8.704 1.00 10.33 ? ? ? ? ? ? 54 ILE B CA 1 +ATOM 1421 C C . ILE B 1 54 ? 13.260 -10.938 9.408 1.00 9.77 ? ? ? ? ? ? 54 ILE B C 1 +ATOM 1422 O O . ILE B 1 54 ? 13.132 -11.362 10.558 1.00 7.99 ? ? ? ? ? ? 54 ILE B O 1 +ATOM 1423 C CB . ILE B 1 54 ? 12.572 -8.613 8.634 1.00 6.25 ? ? ? ? ? ? 54 ILE B CB 1 +ATOM 1424 C CG1 . ILE B 1 54 ? 12.653 -7.928 10.004 1.00 9.81 ? ? ? ? ? ? 54 ILE B CG1 1 +ATOM 1425 C CG2 . ILE B 1 54 ? 11.639 -7.857 7.703 1.00 2.00 ? ? ? ? ? ? 54 ILE B CG2 1 +ATOM 1426 C CD1 . ILE B 1 54 ? 13.384 -6.579 9.991 1.00 2.88 ? ? ? ? ? ? 54 ILE B CD1 1 +ATOM 1427 H H . ILE B 1 54 ? 10.591 -10.082 10.192 1.00 15.00 ? ? ? ? ? ? 54 ILE B H 1 +ATOM 1428 N N . LYS B 1 55 ? 14.367 -11.147 8.652 1.00 10.99 ? ? ? ? ? ? 55 LYS B N 1 +ATOM 1429 C CA . LYS B 1 55 ? 15.595 -11.645 9.329 1.00 10.11 ? ? ? ? ? ? 55 LYS B CA 1 +ATOM 1430 C C . LYS B 1 55 ? 16.630 -10.591 9.723 1.00 5.92 ? ? ? ? ? ? 55 LYS B C 1 +ATOM 1431 O O . LYS B 1 55 ? 16.878 -9.611 9.044 1.00 6.28 ? ? ? ? ? ? 55 LYS B O 1 +ATOM 1432 C CB . LYS B 1 55 ? 16.267 -12.792 8.562 1.00 12.08 ? ? ? ? ? ? 55 LYS B CB 1 +ATOM 1433 C CG . LYS B 1 55 ? 17.209 -13.621 9.428 1.00 18.95 ? ? ? ? ? ? 55 LYS B CG 1 +ATOM 1434 C CD . LYS B 1 55 ? 17.995 -14.639 8.595 1.00 26.21 ? ? ? ? ? ? 55 LYS B CD 1 +ATOM 1435 C CE . LYS B 1 55 ? 19.344 -14.978 9.238 1.00 30.94 ? ? ? ? ? ? 55 LYS B CE 1 +ATOM 1436 N NZ . LYS B 1 55 ? 20.154 -15.900 8.409 1.00 35.50 ? ? ? ? ? ? 55 LYS B NZ 1 +ATOM 1437 H H . LYS B 1 55 ? 14.363 -10.794 7.720 1.00 15.00 ? ? ? ? ? ? 55 LYS B H 1 +ATOM 1438 H HZ1 . LYS B 1 55 ? 19.567 -16.713 8.131 1.00 15.00 ? ? ? ? ? ? 55 LYS B HZ1 1 +ATOM 1439 H HZ2 . LYS B 1 55 ? 20.484 -15.400 7.560 1.00 15.00 ? ? ? ? ? ? 55 LYS B HZ2 1 +ATOM 1440 H HZ3 . LYS B 1 55 ? 20.969 -16.233 8.962 1.00 15.00 ? ? ? ? ? ? 55 LYS B HZ3 1 +ATOM 1441 N N . VAL B 1 56 ? 17.170 -10.858 10.902 1.00 8.08 ? ? ? ? ? ? 56 VAL B N 1 +ATOM 1442 C CA . VAL B 1 56 ? 17.925 -9.967 11.800 1.00 8.36 ? ? ? ? ? ? 56 VAL B CA 1 +ATOM 1443 C C . VAL B 1 56 ? 19.180 -10.675 12.405 1.00 9.26 ? ? ? ? ? ? 56 VAL B C 1 +ATOM 1444 O O . VAL B 1 56 ? 19.237 -11.905 12.504 1.00 10.25 ? ? ? ? ? ? 56 VAL B O 1 +ATOM 1445 C CB . VAL B 1 56 ? 16.825 -9.604 12.832 1.00 11.67 ? ? ? ? ? ? 56 VAL B CB 1 +ATOM 1446 C CG1 . VAL B 1 56 ? 17.084 -9.976 14.294 1.00 12.60 ? ? ? ? ? ? 56 VAL B CG1 1 +ATOM 1447 C CG2 . VAL B 1 56 ? 16.255 -8.214 12.568 1.00 14.41 ? ? ? ? ? ? 56 VAL B CG2 1 +ATOM 1448 H H . VAL B 1 56 ? 16.866 -11.733 11.281 1.00 15.00 ? ? ? ? ? ? 56 VAL B H 1 +ATOM 1449 N N . ARG B 1 57 ? 20.168 -9.866 12.832 1.00 8.70 ? ? ? ? ? ? 57 ARG B N 1 +ATOM 1450 C CA . ARG B 1 57 ? 21.337 -10.349 13.610 1.00 10.33 ? ? ? ? ? ? 57 ARG B CA 1 +ATOM 1451 C C . ARG B 1 57 ? 21.395 -9.718 14.992 1.00 10.16 ? ? ? ? ? ? 57 ARG B C 1 +ATOM 1452 O O . ARG B 1 57 ? 21.362 -8.504 15.149 1.00 9.24 ? ? ? ? ? ? 57 ARG B O 1 +ATOM 1453 C CB . ARG B 1 57 ? 22.727 -10.090 12.937 1.00 8.35 ? ? ? ? ? ? 57 ARG B CB 1 +ATOM 1454 C CG . ARG B 1 57 ? 22.713 -10.404 11.425 1.00 13.65 ? ? ? ? ? ? 57 ARG B CG 1 +ATOM 1455 C CD . ARG B 1 57 ? 24.024 -10.465 10.619 1.00 11.84 ? ? ? ? ? ? 57 ARG B CD 1 +ATOM 1456 N NE . ARG B 1 57 ? 24.804 -9.225 10.674 1.00 16.18 ? ? ? ? ? ? 57 ARG B NE 1 +ATOM 1457 C CZ . ARG B 1 57 ? 24.649 -8.242 9.749 1.00 22.99 ? ? ? ? ? ? 57 ARG B CZ 1 +ATOM 1458 N NH1 . ARG B 1 57 ? 23.787 -8.366 8.737 1.00 24.07 ? ? ? ? ? ? 57 ARG B NH1 1 +ATOM 1459 N NH2 . ARG B 1 57 ? 25.371 -7.121 9.840 1.00 19.42 ? ? ? ? ? ? 57 ARG B NH2 1 +ATOM 1460 H H . ARG B 1 57 ? 20.044 -8.904 12.610 1.00 15.00 ? ? ? ? ? ? 57 ARG B H 1 +ATOM 1461 H HE . ARG B 1 57 ? 25.451 -9.064 11.420 1.00 15.00 ? ? ? ? ? ? 57 ARG B HE 1 +ATOM 1462 H HH11 . ARG B 1 57 ? 23.234 -9.194 8.644 1.00 15.00 ? ? ? ? ? ? 57 ARG B HH11 1 +ATOM 1463 H HH12 . ARG B 1 57 ? 23.691 -7.628 8.068 1.00 15.00 ? ? ? ? ? ? 57 ARG B HH12 1 +ATOM 1464 H HH21 . ARG B 1 57 ? 26.017 -7.011 10.597 1.00 15.00 ? ? ? ? ? ? 57 ARG B HH21 1 +ATOM 1465 H HH22 . ARG B 1 57 ? 25.270 -6.397 9.158 1.00 15.00 ? ? ? ? ? ? 57 ARG B HH22 1 +ATOM 1466 N N . GLN B 1 58 ? 21.486 -10.570 15.988 1.00 7.03 ? ? ? ? ? ? 58 GLN B N 1 +ATOM 1467 C CA . GLN B 1 58 ? 21.592 -10.082 17.357 1.00 10.22 ? ? ? ? ? ? 58 GLN B CA 1 +ATOM 1468 C C . GLN B 1 58 ? 22.996 -9.771 17.916 1.00 13.31 ? ? ? ? ? ? 58 GLN B C 1 +ATOM 1469 O O . GLN B 1 58 ? 23.802 -10.678 18.113 1.00 16.89 ? ? ? ? ? ? 58 GLN B O 1 +ATOM 1470 C CB . GLN B 1 58 ? 20.886 -11.120 18.237 1.00 12.64 ? ? ? ? ? ? 58 GLN B CB 1 +ATOM 1471 C CG . GLN B 1 58 ? 21.070 -10.886 19.729 1.00 17.77 ? ? ? ? ? ? 58 GLN B CG 1 +ATOM 1472 C CD . GLN B 1 58 ? 20.058 -11.736 20.440 1.00 25.70 ? ? ? ? ? ? 58 GLN B CD 1 +ATOM 1473 O OE1 . GLN B 1 58 ? 19.913 -12.907 20.192 1.00 33.64 ? ? ? ? ? ? 58 GLN B OE1 1 +ATOM 1474 N NE2 . GLN B 1 58 ? 19.283 -11.126 21.315 1.00 30.17 ? ? ? ? ? ? 58 GLN B NE2 1 +ATOM 1475 H H . GLN B 1 58 ? 21.408 -11.533 15.773 1.00 15.00 ? ? ? ? ? ? 58 GLN B H 1 +ATOM 1476 H HE21 . GLN B 1 58 ? 18.621 -11.771 21.684 1.00 15.00 ? ? ? ? ? ? 58 GLN B HE21 1 +ATOM 1477 H HE22 . GLN B 1 58 ? 19.338 -10.167 21.559 1.00 15.00 ? ? ? ? ? ? 58 GLN B HE22 1 +ATOM 1478 N N . TYR B 1 59 ? 23.236 -8.475 18.241 1.00 11.16 ? ? ? ? ? ? 59 TYR B N 1 +ATOM 1479 C CA . TYR B 1 59 ? 24.436 -8.173 19.042 1.00 7.33 ? ? ? ? ? ? 59 TYR B CA 1 +ATOM 1480 C C . TYR B 1 59 ? 24.160 -7.804 20.484 1.00 7.47 ? ? ? ? ? ? 59 TYR B C 1 +ATOM 1481 O O . TYR B 1 59 ? 23.241 -7.060 20.840 1.00 10.58 ? ? ? ? ? ? 59 TYR B O 1 +ATOM 1482 C CB . TYR B 1 59 ? 25.371 -7.105 18.436 1.00 4.61 ? ? ? ? ? ? 59 TYR B CB 1 +ATOM 1483 C CG . TYR B 1 59 ? 25.778 -7.327 16.992 1.00 2.00 ? ? ? ? ? ? 59 TYR B CG 1 +ATOM 1484 C CD1 . TYR B 1 59 ? 24.840 -7.147 15.954 1.00 3.44 ? ? ? ? ? ? 59 TYR B CD1 1 +ATOM 1485 C CD2 . TYR B 1 59 ? 27.113 -7.657 16.698 1.00 2.40 ? ? ? ? ? ? 59 TYR B CD2 1 +ATOM 1486 C CE1 . TYR B 1 59 ? 25.261 -7.249 14.608 1.00 7.27 ? ? ? ? ? ? 59 TYR B CE1 1 +ATOM 1487 C CE2 . TYR B 1 59 ? 27.540 -7.767 15.353 1.00 2.54 ? ? ? ? ? ? 59 TYR B CE2 1 +ATOM 1488 C CZ . TYR B 1 59 ? 26.618 -7.530 14.311 1.00 7.43 ? ? ? ? ? ? 59 TYR B CZ 1 +ATOM 1489 O OH . TYR B 1 59 ? 27.042 -7.529 12.985 1.00 11.55 ? ? ? ? ? ? 59 TYR B OH 1 +ATOM 1490 H H . TYR B 1 59 ? 22.548 -7.789 17.999 1.00 15.00 ? ? ? ? ? ? 59 TYR B H 1 +ATOM 1491 H HH . TYR B 1 59 ? 27.983 -7.657 12.954 1.00 15.00 ? ? ? ? ? ? 59 TYR B HH 1 +ATOM 1492 N N . ASP B 1 60 ? 25.010 -8.383 21.321 1.00 5.52 ? ? ? ? ? ? 60 ASP B N 1 +ATOM 1493 C CA . ASP B 1 60 ? 24.952 -8.043 22.752 1.00 11.07 ? ? ? ? ? ? 60 ASP B CA 1 +ATOM 1494 C C . ASP B 1 60 ? 25.991 -7.060 23.263 1.00 13.43 ? ? ? ? ? ? 60 ASP B C 1 +ATOM 1495 O O . ASP B 1 60 ? 27.047 -6.935 22.676 1.00 20.73 ? ? ? ? ? ? 60 ASP B O 1 +ATOM 1496 C CB . ASP B 1 60 ? 25.082 -9.282 23.617 1.00 15.28 ? ? ? ? ? ? 60 ASP B CB 1 +ATOM 1497 C CG . ASP B 1 60 ? 23.954 -10.241 23.296 1.00 18.44 ? ? ? ? ? ? 60 ASP B CG 1 +ATOM 1498 O OD1 . ASP B 1 60 ? 22.860 -9.744 23.015 1.00 16.85 ? ? ? ? ? ? 60 ASP B OD1 1 +ATOM 1499 O OD2 . ASP B 1 60 ? 24.181 -11.465 23.320 1.00 19.95 ? ? ? ? ? ? 60 ASP B OD2 1 +ATOM 1500 H H . ASP B 1 60 ? 25.741 -8.939 20.927 1.00 15.00 ? ? ? ? ? ? 60 ASP B H 1 +ATOM 1501 N N . GLN B 1 61 ? 25.680 -6.359 24.359 1.00 11.99 ? ? ? ? ? ? 61 GLN B N 1 +ATOM 1502 C CA . GLN B 1 61 ? 26.655 -5.387 24.929 1.00 14.03 ? ? ? ? ? ? 61 GLN B CA 1 +ATOM 1503 C C . GLN B 1 61 ? 27.100 -4.131 24.148 1.00 12.65 ? ? ? ? ? ? 61 GLN B C 1 +ATOM 1504 O O . GLN B 1 61 ? 28.092 -3.460 24.385 1.00 9.03 ? ? ? ? ? ? 61 GLN B O 1 +ATOM 1505 C CB . GLN B 1 61 ? 27.843 -6.114 25.593 1.00 24.34 ? ? ? ? ? ? 61 GLN B CB 1 +ATOM 1506 C CG . GLN B 1 61 ? 27.531 -6.962 26.835 1.00 35.39 ? ? ? ? ? ? 61 GLN B CG 1 +ATOM 1507 C CD . GLN B 1 61 ? 26.983 -6.063 27.946 1.00 47.74 ? ? ? ? ? ? 61 GLN B CD 1 +ATOM 1508 O OE1 . GLN B 1 61 ? 26.140 -5.195 27.786 1.00 51.02 ? ? ? ? ? ? 61 GLN B OE1 1 +ATOM 1509 N NE2 . GLN B 1 61 ? 27.471 -6.306 29.148 1.00 55.07 ? ? ? ? ? ? 61 GLN B NE2 1 +ATOM 1510 H H . GLN B 1 61 ? 24.795 -6.513 24.791 1.00 15.00 ? ? ? ? ? ? 61 GLN B H 1 +ATOM 1511 H HE21 . GLN B 1 61 ? 27.031 -5.678 29.788 1.00 15.00 ? ? ? ? ? ? 61 GLN B HE21 1 +ATOM 1512 H HE22 . GLN B 1 61 ? 28.160 -6.986 29.364 1.00 15.00 ? ? ? ? ? ? 61 GLN B HE22 1 +ATOM 1513 N N . ILE B 1 62 ? 26.251 -3.796 23.179 1.00 15.70 ? ? ? ? ? ? 62 ILE B N 1 +ATOM 1514 C CA . ILE B 1 62 ? 26.481 -2.555 22.443 1.00 12.03 ? ? ? ? ? ? 62 ILE B CA 1 +ATOM 1515 C C . ILE B 1 62 ? 26.180 -1.354 23.300 1.00 14.39 ? ? ? ? ? ? 62 ILE B C 1 +ATOM 1516 O O . ILE B 1 62 ? 25.092 -1.272 23.856 1.00 12.23 ? ? ? ? ? ? 62 ILE B O 1 +ATOM 1517 C CB . ILE B 1 62 ? 25.600 -2.457 21.182 1.00 5.49 ? ? ? ? ? ? 62 ILE B CB 1 +ATOM 1518 C CG1 . ILE B 1 62 ? 25.559 -3.776 20.432 1.00 5.59 ? ? ? ? ? ? 62 ILE B CG1 1 +ATOM 1519 C CG2 . ILE B 1 62 ? 26.128 -1.327 20.278 1.00 3.31 ? ? ? ? ? ? 62 ILE B CG2 1 +ATOM 1520 C CD1 . ILE B 1 62 ? 26.921 -4.324 19.958 1.00 7.41 ? ? ? ? ? ? 62 ILE B CD1 1 +ATOM 1521 H H . ILE B 1 62 ? 25.381 -4.278 23.102 1.00 15.00 ? ? ? ? ? ? 62 ILE B H 1 +ATOM 1522 N N . PRO B 1 63 ? 27.164 -0.428 23.385 1.00 15.61 ? ? ? ? ? ? 63 PRO B N 1 +ATOM 1523 C CA . PRO B 1 63 ? 26.906 0.898 23.941 1.00 13.48 ? ? ? ? ? ? 63 PRO B CA 1 +ATOM 1524 C C . PRO B 1 63 ? 26.293 1.795 22.909 1.00 13.82 ? ? ? ? ? ? 63 PRO B C 1 +ATOM 1525 O O . PRO B 1 63 ? 26.734 1.853 21.766 1.00 15.11 ? ? ? ? ? ? 63 PRO B O 1 +ATOM 1526 C CB . PRO B 1 63 ? 28.303 1.391 24.340 1.00 14.26 ? ? ? ? ? ? 63 PRO B CB 1 +ATOM 1527 C CG . PRO B 1 63 ? 29.197 0.154 24.279 1.00 19.67 ? ? ? ? ? ? 63 PRO B CG 1 +ATOM 1528 C CD . PRO B 1 63 ? 28.572 -0.618 23.111 1.00 19.48 ? ? ? ? ? ? 63 PRO B CD 1 +ATOM 1529 N N . VAL B 1 64 ? 25.233 2.488 23.357 1.00 14.77 ? ? ? ? ? ? 64 VAL B N 1 +ATOM 1530 C CA . VAL B 1 64 ? 24.634 3.508 22.485 1.00 13.40 ? ? ? ? ? ? 64 VAL B CA 1 +ATOM 1531 C C . VAL B 1 64 ? 24.339 4.803 23.230 1.00 15.46 ? ? ? ? ? ? 64 VAL B C 1 +ATOM 1532 O O . VAL B 1 64 ? 23.944 4.810 24.387 1.00 16.60 ? ? ? ? ? ? 64 VAL B O 1 +ATOM 1533 C CB . VAL B 1 64 ? 23.501 2.988 21.503 1.00 11.21 ? ? ? ? ? ? 64 VAL B CB 1 +ATOM 1534 C CG1 . VAL B 1 64 ? 22.926 1.611 21.779 1.00 3.55 ? ? ? ? ? ? 64 VAL B CG1 1 +ATOM 1535 C CG2 . VAL B 1 64 ? 22.439 4.014 21.112 1.00 8.00 ? ? ? ? ? ? 64 VAL B CG2 1 +ATOM 1536 H H . VAL B 1 64 ? 24.918 2.327 24.293 1.00 15.00 ? ? ? ? ? ? 64 VAL B H 1 +ATOM 1537 N N . GLU B 1 65 ? 24.606 5.911 22.539 1.00 16.43 ? ? ? ? ? ? 65 GLU B N 1 +ATOM 1538 C CA . GLU B 1 65 ? 24.175 7.152 23.161 1.00 18.66 ? ? ? ? ? ? 65 GLU B CA 1 +ATOM 1539 C C . GLU B 1 65 ? 22.979 7.838 22.511 1.00 19.98 ? ? ? ? ? ? 65 GLU B C 1 +ATOM 1540 O O . GLU B 1 65 ? 22.969 8.218 21.351 1.00 20.05 ? ? ? ? ? ? 65 GLU B O 1 +ATOM 1541 C CB . GLU B 1 65 ? 25.336 8.115 23.378 1.00 21.70 ? ? ? ? ? ? 65 GLU B CB 1 +ATOM 1542 C CG . GLU B 1 65 ? 24.919 9.208 24.341 1.00 29.65 ? ? ? ? ? ? 65 GLU B CG 1 +ATOM 1543 C CD . GLU B 1 65 ? 26.083 10.070 24.736 1.00 36.74 ? ? ? ? ? ? 65 GLU B CD 1 +ATOM 1544 O OE1 . GLU B 1 65 ? 26.320 11.055 24.038 1.00 38.38 ? ? ? ? ? ? 65 GLU B OE1 1 +ATOM 1545 O OE2 . GLU B 1 65 ? 26.723 9.772 25.754 1.00 42.36 ? ? ? ? ? ? 65 GLU B OE2 1 +ATOM 1546 H H . GLU B 1 65 ? 25.013 5.841 21.629 1.00 15.00 ? ? ? ? ? ? 65 GLU B H 1 +ATOM 1547 N N . ILE B 1 66 ? 21.940 7.962 23.333 1.00 18.67 ? ? ? ? ? ? 66 ILE B N 1 +ATOM 1548 C CA . ILE B 1 66 ? 20.655 8.450 22.838 1.00 21.20 ? ? ? ? ? ? 66 ILE B CA 1 +ATOM 1549 C C . ILE B 1 66 ? 20.204 9.728 23.515 1.00 22.01 ? ? ? ? ? ? 66 ILE B C 1 +ATOM 1550 O O . ILE B 1 66 ? 20.030 9.800 24.731 1.00 17.93 ? ? ? ? ? ? 66 ILE B O 1 +ATOM 1551 C CB . ILE B 1 66 ? 19.633 7.322 22.954 1.00 29.17 ? ? ? ? ? ? 66 ILE B CB 1 +ATOM 1552 C CG1 . ILE B 1 66 ? 18.184 7.765 22.953 1.00 29.67 ? ? ? ? ? ? 66 ILE B CG1 1 +ATOM 1553 C CG2 . ILE B 1 66 ? 19.883 6.414 24.176 1.00 36.07 ? ? ? ? ? ? 66 ILE B CG2 1 +ATOM 1554 C CD1 . ILE B 1 66 ? 17.378 6.470 22.919 1.00 37.39 ? ? ? ? ? ? 66 ILE B CD1 1 +ATOM 1555 H H . ILE B 1 66 ? 22.084 7.662 24.277 1.00 15.00 ? ? ? ? ? ? 66 ILE B H 1 +ATOM 1556 N N . CYS B 1 67 ? 20.130 10.773 22.653 1.00 21.67 ? ? ? ? ? ? 67 CYS B N 1 +ATOM 1557 C CA . CYS B 1 67 ? 19.868 12.129 23.183 1.00 24.86 ? ? ? ? ? ? 67 CYS B CA 1 +ATOM 1558 C C . CYS B 1 67 ? 20.683 12.628 24.398 1.00 27.18 ? ? ? ? ? ? 67 CYS B C 1 +ATOM 1559 O O . CYS B 1 67 ? 20.158 13.217 25.331 1.00 32.07 ? ? ? ? ? ? 67 CYS B O 1 +ATOM 1560 C CB . CYS B 1 67 ? 18.379 12.323 23.536 1.00 26.01 ? ? ? ? ? ? 67 CYS B CB 1 +ATOM 1561 S SG . CYS B 1 67 ? 17.441 13.262 22.312 1.00 31.34 ? ? ? ? ? ? 67 CYS B SG 1 +ATOM 1562 H H . CYS B 1 67 ? 20.189 10.569 21.672 1.00 15.00 ? ? ? ? ? ? 67 CYS B H 1 +ATOM 1563 N N . GLY B 1 68 ? 21.999 12.356 24.407 1.00 25.32 ? ? ? ? ? ? 68 GLY B N 1 +ATOM 1564 C CA . GLY B 1 68 ? 22.716 12.679 25.663 1.00 19.59 ? ? ? ? ? ? 68 GLY B CA 1 +ATOM 1565 C C . GLY B 1 68 ? 22.794 11.604 26.757 1.00 19.67 ? ? ? ? ? ? 68 GLY B C 1 +ATOM 1566 O O . GLY B 1 68 ? 23.457 11.726 27.772 1.00 20.47 ? ? ? ? ? ? 68 GLY B O 1 +ATOM 1567 H H . GLY B 1 68 ? 22.406 11.891 23.626 1.00 15.00 ? ? ? ? ? ? 68 GLY B H 1 +ATOM 1568 N N . HIS B 1 69 ? 22.110 10.491 26.512 1.00 19.22 ? ? ? ? ? ? 69 HIS B N 1 +ATOM 1569 C CA . HIS B 1 69 ? 22.143 9.499 27.575 1.00 21.19 ? ? ? ? ? ? 69 HIS B CA 1 +ATOM 1570 C C . HIS B 1 69 ? 22.852 8.196 27.168 1.00 23.33 ? ? ? ? ? ? 69 HIS B C 1 +ATOM 1571 O O . HIS B 1 69 ? 22.624 7.632 26.113 1.00 25.34 ? ? ? ? ? ? 69 HIS B O 1 +ATOM 1572 C CB . HIS B 1 69 ? 20.703 9.191 28.092 1.00 25.56 ? ? ? ? ? ? 69 HIS B CB 1 +ATOM 1573 C CG . HIS B 1 69 ? 19.843 10.386 28.515 1.00 28.62 ? ? ? ? ? ? 69 HIS B CG 1 +ATOM 1574 N ND1 . HIS B 1 69 ? 19.325 10.554 29.754 1.00 28.41 ? ? ? ? ? ? 69 HIS B ND1 1 +ATOM 1575 C CD2 . HIS B 1 69 ? 19.453 11.490 27.750 1.00 30.83 ? ? ? ? ? ? 69 HIS B CD2 1 +ATOM 1576 C CE1 . HIS B 1 69 ? 18.641 11.738 29.777 1.00 30.39 ? ? ? ? ? ? 69 HIS B CE1 1 +ATOM 1577 N NE2 . HIS B 1 69 ? 18.726 12.315 28.538 1.00 33.59 ? ? ? ? ? ? 69 HIS B NE2 1 +ATOM 1578 H H . HIS B 1 69 ? 21.463 10.446 25.757 1.00 15.00 ? ? ? ? ? ? 69 HIS B H 1 +ATOM 1579 H HD1 . HIS B 1 69 ? 19.357 9.932 30.504 1.00 15.00 ? ? ? ? ? ? 69 HIS B HD1 1 +ATOM 1580 N N . LYS B 1 70 ? 23.683 7.692 28.070 1.00 26.10 ? ? ? ? ? ? 70 LYS B N 1 +ATOM 1581 C CA . LYS B 1 70 ? 24.147 6.296 27.941 1.00 26.44 ? ? ? ? ? ? 70 LYS B CA 1 +ATOM 1582 C C . LYS B 1 70 ? 23.153 5.138 28.154 1.00 24.20 ? ? ? ? ? ? 70 LYS B C 1 +ATOM 1583 O O . LYS B 1 70 ? 22.630 4.904 29.238 1.00 22.46 ? ? ? ? ? ? 70 LYS B O 1 +ATOM 1584 C CB . LYS B 1 70 ? 25.305 5.947 28.897 1.00 32.97 ? ? ? ? ? ? 70 LYS B CB 1 +ATOM 1585 C CG . LYS B 1 70 ? 25.920 7.049 29.766 1.00 45.39 ? ? ? ? ? ? 70 LYS B CG 1 +ATOM 1586 C CD . LYS B 1 70 ? 27.070 7.863 29.144 1.00 55.83 ? ? ? ? ? ? 70 LYS B CD 1 +ATOM 1587 C CE . LYS B 1 70 ? 27.628 8.851 30.192 1.00 61.60 ? ? ? ? ? ? 70 LYS B CE 1 +ATOM 1588 N NZ . LYS B 1 70 ? 29.049 9.144 29.936 1.00 66.82 ? ? ? ? ? ? 70 LYS B NZ 1 +ATOM 1589 H H . LYS B 1 70 ? 23.780 8.222 28.908 1.00 15.00 ? ? ? ? ? ? 70 LYS B H 1 +ATOM 1590 H HZ1 . LYS B 1 70 ? 29.401 8.506 29.193 1.00 15.00 ? ? ? ? ? ? 70 LYS B HZ1 1 +ATOM 1591 H HZ2 . LYS B 1 70 ? 29.168 10.130 29.630 1.00 15.00 ? ? ? ? ? ? 70 LYS B HZ2 1 +ATOM 1592 H HZ3 . LYS B 1 70 ? 29.597 8.979 30.806 1.00 15.00 ? ? ? ? ? ? 70 LYS B HZ3 1 +ATOM 1593 N N . ALA B 1 71 ? 23.009 4.349 27.090 1.00 21.63 ? ? ? ? ? ? 71 ALA B N 1 +ATOM 1594 C CA . ALA B 1 71 ? 22.576 2.978 27.368 1.00 18.01 ? ? ? ? ? ? 71 ALA B CA 1 +ATOM 1595 C C . ALA B 1 71 ? 23.596 1.930 26.894 1.00 16.20 ? ? ? ? ? ? 71 ALA B C 1 +ATOM 1596 O O . ALA B 1 71 ? 24.524 2.199 26.131 1.00 17.84 ? ? ? ? ? ? 71 ALA B O 1 +ATOM 1597 C CB . ALA B 1 71 ? 21.223 2.724 26.702 1.00 15.87 ? ? ? ? ? ? 71 ALA B CB 1 +ATOM 1598 H H . ALA B 1 71 ? 23.336 4.643 26.191 1.00 15.00 ? ? ? ? ? ? 71 ALA B H 1 +ATOM 1599 N N . ILE B 1 72 ? 23.382 0.708 27.363 1.00 13.59 ? ? ? ? ? ? 72 ILE B N 1 +ATOM 1600 C CA . ILE B 1 72 ? 24.104 -0.478 26.873 1.00 15.46 ? ? ? ? ? ? 72 ILE B CA 1 +ATOM 1601 C C . ILE B 1 72 ? 23.229 -1.722 26.797 1.00 13.71 ? ? ? ? ? ? 72 ILE B C 1 +ATOM 1602 O O . ILE B 1 72 ? 22.621 -2.213 27.750 1.00 16.33 ? ? ? ? ? ? 72 ILE B O 1 +ATOM 1603 C CB . ILE B 1 72 ? 25.348 -0.855 27.715 1.00 20.10 ? ? ? ? ? ? 72 ILE B CB 1 +ATOM 1604 C CG1 . ILE B 1 72 ? 26.167 0.377 28.088 1.00 26.26 ? ? ? ? ? ? 72 ILE B CG1 1 +ATOM 1605 C CG2 . ILE B 1 72 ? 26.252 -1.857 26.968 1.00 20.07 ? ? ? ? ? ? 72 ILE B CG2 1 +ATOM 1606 C CD1 . ILE B 1 72 ? 27.266 0.065 29.097 1.00 32.25 ? ? ? ? ? ? 72 ILE B CD1 1 +ATOM 1607 H H . ILE B 1 72 ? 22.708 0.658 28.101 1.00 15.00 ? ? ? ? ? ? 72 ILE B H 1 +ATOM 1608 N N . GLY B 1 73 ? 23.201 -2.239 25.596 1.00 11.67 ? ? ? ? ? ? 73 GLY B N 1 +ATOM 1609 C CA . GLY B 1 73 ? 22.655 -3.574 25.482 1.00 8.87 ? ? ? ? ? ? 73 GLY B CA 1 +ATOM 1610 C C . GLY B 1 73 ? 22.522 -4.085 24.067 1.00 6.58 ? ? ? ? ? ? 73 GLY B C 1 +ATOM 1611 O O . GLY B 1 73 ? 23.303 -3.787 23.177 1.00 5.20 ? ? ? ? ? ? 73 GLY B O 1 +ATOM 1612 H H . GLY B 1 73 ? 23.670 -1.766 24.857 1.00 15.00 ? ? ? ? ? ? 73 GLY B H 1 +ATOM 1613 N N . THR B 1 74 ? 21.478 -4.898 23.926 1.00 6.84 ? ? ? ? ? ? 74 THR B N 1 +ATOM 1614 C CA . THR B 1 74 ? 21.186 -5.594 22.663 1.00 11.08 ? ? ? ? ? ? 74 THR B CA 1 +ATOM 1615 C C . THR B 1 74 ? 20.493 -4.851 21.500 1.00 14.36 ? ? ? ? ? ? 74 THR B C 1 +ATOM 1616 O O . THR B 1 74 ? 19.344 -4.398 21.562 1.00 14.96 ? ? ? ? ? ? 74 THR B O 1 +ATOM 1617 C CB . THR B 1 74 ? 20.471 -6.889 23.036 1.00 8.01 ? ? ? ? ? ? 74 THR B CB 1 +ATOM 1618 O OG1 . THR B 1 74 ? 21.331 -7.561 23.970 1.00 8.78 ? ? ? ? ? ? 74 THR B OG1 1 +ATOM 1619 C CG2 . THR B 1 74 ? 20.123 -7.812 21.873 1.00 3.87 ? ? ? ? ? ? 74 THR B CG2 1 +ATOM 1620 H H . THR B 1 74 ? 20.903 -5.031 24.731 1.00 15.00 ? ? ? ? ? ? 74 THR B H 1 +ATOM 1621 H HG1 . THR B 1 74 ? 22.051 -7.890 23.448 1.00 15.00 ? ? ? ? ? ? 74 THR B HG1 1 +ATOM 1622 N N . VAL B 1 75 ? 21.280 -4.770 20.393 1.00 14.46 ? ? ? ? ? ? 75 VAL B N 1 +ATOM 1623 C CA . VAL B 1 75 ? 20.635 -4.294 19.154 1.00 10.05 ? ? ? ? ? ? 75 VAL B CA 1 +ATOM 1624 C C . VAL B 1 75 ? 20.396 -5.411 18.134 1.00 11.79 ? ? ? ? ? ? 75 VAL B C 1 +ATOM 1625 O O . VAL B 1 75 ? 21.175 -6.357 18.057 1.00 16.56 ? ? ? ? ? ? 75 VAL B O 1 +ATOM 1626 C CB . VAL B 1 75 ? 21.386 -3.109 18.544 1.00 5.97 ? ? ? ? ? ? 75 VAL B CB 1 +ATOM 1627 C CG1 . VAL B 1 75 ? 21.650 -2.004 19.576 1.00 2.00 ? ? ? ? ? ? 75 VAL B CG1 1 +ATOM 1628 C CG2 . VAL B 1 75 ? 22.664 -3.549 17.855 1.00 7.87 ? ? ? ? ? ? 75 VAL B CG2 1 +ATOM 1629 H H . VAL B 1 75 ? 22.195 -5.175 20.425 1.00 15.00 ? ? ? ? ? ? 75 VAL B H 1 +ATOM 1630 N N . LEU B 1 76 ? 19.274 -5.301 17.401 1.00 6.91 ? ? ? ? ? ? 76 LEU B N 1 +ATOM 1631 C CA . LEU B 1 76 ? 19.017 -6.238 16.306 1.00 3.96 ? ? ? ? ? ? 76 LEU B CA 1 +ATOM 1632 C C . LEU B 1 76 ? 19.276 -5.547 14.995 1.00 5.63 ? ? ? ? ? ? 76 LEU B C 1 +ATOM 1633 O O . LEU B 1 76 ? 18.674 -4.505 14.789 1.00 6.81 ? ? ? ? ? ? 76 LEU B O 1 +ATOM 1634 C CB . LEU B 1 76 ? 17.553 -6.658 16.291 1.00 5.49 ? ? ? ? ? ? 76 LEU B CB 1 +ATOM 1635 C CG . LEU B 1 76 ? 17.041 -7.743 17.238 1.00 6.70 ? ? ? ? ? ? 76 LEU B CG 1 +ATOM 1636 C CD1 . LEU B 1 76 ? 17.919 -8.081 18.439 1.00 9.14 ? ? ? ? ? ? 76 LEU B CD1 1 +ATOM 1637 C CD2 . LEU B 1 76 ? 15.677 -7.341 17.731 1.00 3.57 ? ? ? ? ? ? 76 LEU B CD2 1 +ATOM 1638 H H . LEU B 1 76 ? 18.652 -4.536 17.575 1.00 15.00 ? ? ? ? ? ? 76 LEU B H 1 +ATOM 1639 N N . VAL B 1 77 ? 20.185 -6.095 14.140 1.00 9.13 ? ? ? ? ? ? 77 VAL B N 1 +ATOM 1640 C CA . VAL B 1 77 ? 20.380 -5.444 12.823 1.00 5.95 ? ? ? ? ? ? 77 VAL B CA 1 +ATOM 1641 C C . VAL B 1 77 ? 19.859 -6.220 11.609 1.00 8.66 ? ? ? ? ? ? 77 VAL B C 1 +ATOM 1642 O O . VAL B 1 77 ? 19.810 -7.436 11.611 1.00 12.59 ? ? ? ? ? ? 77 VAL B O 1 +ATOM 1643 C CB . VAL B 1 77 ? 21.782 -4.796 12.651 1.00 7.05 ? ? ? ? ? ? 77 VAL B CB 1 +ATOM 1644 C CG1 . VAL B 1 77 ? 22.481 -4.562 14.004 1.00 6.71 ? ? ? ? ? ? 77 VAL B CG1 1 +ATOM 1645 C CG2 . VAL B 1 77 ? 22.699 -5.406 11.601 1.00 4.38 ? ? ? ? ? ? 77 VAL B CG2 1 +ATOM 1646 H H . VAL B 1 77 ? 20.697 -6.896 14.446 1.00 15.00 ? ? ? ? ? ? 77 VAL B H 1 +ATOM 1647 N N . GLY B 1 78 ? 19.381 -5.499 10.595 1.00 8.15 ? ? ? ? ? ? 78 GLY B N 1 +ATOM 1648 C CA . GLY B 1 78 ? 18.603 -6.169 9.534 1.00 3.81 ? ? ? ? ? ? 78 GLY B CA 1 +ATOM 1649 C C . GLY B 1 78 ? 17.921 -5.111 8.659 1.00 5.65 ? ? ? ? ? ? 78 GLY B C 1 +ATOM 1650 O O . GLY B 1 78 ? 18.077 -3.923 8.917 1.00 5.08 ? ? ? ? ? ? 78 GLY B O 1 +ATOM 1651 H H . GLY B 1 78 ? 19.401 -4.503 10.690 1.00 15.00 ? ? ? ? ? ? 78 GLY B H 1 +ATOM 1652 N N . PRO B 1 79 ? 17.158 -5.518 7.614 1.00 5.18 ? ? ? ? ? ? 79 PRO B N 1 +ATOM 1653 C CA . PRO B 1 79 ? 16.657 -4.546 6.644 1.00 2.92 ? ? ? ? ? ? 79 PRO B CA 1 +ATOM 1654 C C . PRO B 1 79 ? 15.390 -3.757 7.007 1.00 9.24 ? ? ? ? ? ? 79 PRO B C 1 +ATOM 1655 O O . PRO B 1 79 ? 14.341 -3.835 6.391 1.00 14.52 ? ? ? ? ? ? 79 PRO B O 1 +ATOM 1656 C CB . PRO B 1 79 ? 16.548 -5.391 5.396 1.00 2.02 ? ? ? ? ? ? 79 PRO B CB 1 +ATOM 1657 C CG . PRO B 1 79 ? 16.054 -6.736 5.949 1.00 2.52 ? ? ? ? ? ? 79 PRO B CG 1 +ATOM 1658 C CD . PRO B 1 79 ? 16.794 -6.881 7.274 1.00 4.34 ? ? ? ? ? ? 79 PRO B CD 1 +ATOM 1659 N N . THR B 1 80 ? 15.532 -2.889 8.004 1.00 10.43 ? ? ? ? ? ? 80 THR B N 1 +ATOM 1660 C CA . THR B 1 80 ? 14.414 -1.968 8.250 1.00 10.86 ? ? ? ? ? ? 80 THR B CA 1 +ATOM 1661 C C . THR B 1 80 ? 14.497 -0.600 7.557 1.00 13.07 ? ? ? ? ? ? 80 THR B C 1 +ATOM 1662 O O . THR B 1 80 ? 15.558 0.016 7.484 1.00 19.01 ? ? ? ? ? ? 80 THR B O 1 +ATOM 1663 C CB . THR B 1 80 ? 14.277 -1.755 9.751 1.00 9.00 ? ? ? ? ? ? 80 THR B CB 1 +ATOM 1664 O OG1 . THR B 1 80 ? 13.272 -0.766 10.037 1.00 10.99 ? ? ? ? ? ? 80 THR B OG1 1 +ATOM 1665 C CG2 . THR B 1 80 ? 15.638 -1.318 10.308 1.00 12.20 ? ? ? ? ? ? 80 THR B CG2 1 +ATOM 1666 H H . THR B 1 80 ? 16.405 -2.887 8.491 1.00 15.00 ? ? ? ? ? ? 80 THR B H 1 +ATOM 1667 H HG1 . THR B 1 80 ? 13.456 -0.448 10.925 1.00 15.00 ? ? ? ? ? ? 80 THR B HG1 1 +ATOM 1668 N N . PRO B 1 81 ? 13.357 -0.063 7.046 1.00 12.42 ? ? ? ? ? ? 81 PRO B N 1 +ATOM 1669 C CA . PRO B 1 81 ? 13.412 1.341 6.572 1.00 13.21 ? ? ? ? ? ? 81 PRO B CA 1 +ATOM 1670 C C . PRO B 1 81 ? 13.581 2.406 7.662 1.00 12.96 ? ? ? ? ? ? 81 PRO B C 1 +ATOM 1671 O O . PRO B 1 81 ? 13.811 3.579 7.400 1.00 11.59 ? ? ? ? ? ? 81 PRO B O 1 +ATOM 1672 C CB . PRO B 1 81 ? 12.105 1.495 5.796 1.00 11.64 ? ? ? ? ? ? 81 PRO B CB 1 +ATOM 1673 C CG . PRO B 1 81 ? 11.143 0.471 6.400 1.00 8.50 ? ? ? ? ? ? 81 PRO B CG 1 +ATOM 1674 C CD . PRO B 1 81 ? 12.053 -0.684 6.808 1.00 11.98 ? ? ? ? ? ? 81 PRO B CD 1 +ATOM 1675 N N . VAL B 1 82 ? 13.446 1.928 8.912 1.00 13.68 ? ? ? ? ? ? 82 VAL B N 1 +ATOM 1676 C CA . VAL B 1 82 ? 13.561 2.838 10.064 1.00 13.36 ? ? ? ? ? ? 82 VAL B CA 1 +ATOM 1677 C C . VAL B 1 82 ? 14.236 2.271 11.334 1.00 13.68 ? ? ? ? ? ? 82 VAL B C 1 +ATOM 1678 O O . VAL B 1 82 ? 14.088 1.127 11.760 1.00 16.22 ? ? ? ? ? ? 82 VAL B O 1 +ATOM 1679 C CB . VAL B 1 82 ? 12.166 3.484 10.323 1.00 14.41 ? ? ? ? ? ? 82 VAL B CB 1 +ATOM 1680 C CG1 . VAL B 1 82 ? 11.063 2.448 10.552 1.00 15.43 ? ? ? ? ? ? 82 VAL B CG1 1 +ATOM 1681 C CG2 . VAL B 1 82 ? 12.195 4.590 11.382 1.00 11.95 ? ? ? ? ? ? 82 VAL B CG2 1 +ATOM 1682 H H . VAL B 1 82 ? 13.191 0.971 9.049 1.00 15.00 ? ? ? ? ? ? 82 VAL B H 1 +ATOM 1683 N N . ASN B 1 83 ? 15.025 3.157 11.932 1.00 12.01 ? ? ? ? ? ? 83 ASN B N 1 +ATOM 1684 C CA . ASN B 1 83 ? 15.666 2.791 13.194 1.00 10.29 ? ? ? ? ? ? 83 ASN B CA 1 +ATOM 1685 C C . ASN B 1 83 ? 14.749 2.975 14.382 1.00 10.32 ? ? ? ? ? ? 83 ASN B C 1 +ATOM 1686 O O . ASN B 1 83 ? 14.326 4.076 14.683 1.00 10.57 ? ? ? ? ? ? 83 ASN B O 1 +ATOM 1687 C CB . ASN B 1 83 ? 16.893 3.665 13.454 1.00 12.27 ? ? ? ? ? ? 83 ASN B CB 1 +ATOM 1688 C CG . ASN B 1 83 ? 18.006 3.484 12.423 1.00 15.73 ? ? ? ? ? ? 83 ASN B CG 1 +ATOM 1689 O OD1 . ASN B 1 83 ? 18.331 2.413 11.945 1.00 15.61 ? ? ? ? ? ? 83 ASN B OD1 1 +ATOM 1690 N ND2 . ASN B 1 83 ? 18.625 4.608 12.090 1.00 14.21 ? ? ? ? ? ? 83 ASN B ND2 1 +ATOM 1691 H H . ASN B 1 83 ? 15.112 4.055 11.508 1.00 15.00 ? ? ? ? ? ? 83 ASN B H 1 +ATOM 1692 H HD21 . ASN B 1 83 ? 19.364 4.496 11.434 1.00 15.00 ? ? ? ? ? ? 83 ASN B HD21 1 +ATOM 1693 H HD22 . ASN B 1 83 ? 18.324 5.482 12.478 1.00 15.00 ? ? ? ? ? ? 83 ASN B HD22 1 +ATOM 1694 N N . ILE B 1 84 ? 14.477 1.868 15.060 1.00 9.64 ? ? ? ? ? ? 84 ILE B N 1 +ATOM 1695 C CA . ILE B 1 84 ? 13.566 1.901 16.204 1.00 6.41 ? ? ? ? ? ? 84 ILE B CA 1 +ATOM 1696 C C . ILE B 1 84 ? 14.247 1.541 17.523 1.00 4.30 ? ? ? ? ? ? 84 ILE B C 1 +ATOM 1697 O O . ILE B 1 84 ? 14.832 0.478 17.661 1.00 2.00 ? ? ? ? ? ? 84 ILE B O 1 +ATOM 1698 C CB . ILE B 1 84 ? 12.385 0.935 15.879 1.00 10.02 ? ? ? ? ? ? 84 ILE B CB 1 +ATOM 1699 C CG1 . ILE B 1 84 ? 11.366 1.514 14.928 1.00 8.83 ? ? ? ? ? ? 84 ILE B CG1 1 +ATOM 1700 C CG2 . ILE B 1 84 ? 11.566 0.418 17.051 1.00 13.45 ? ? ? ? ? ? 84 ILE B CG2 1 +ATOM 1701 C CD1 . ILE B 1 84 ? 10.834 0.320 14.179 1.00 13.89 ? ? ? ? ? ? 84 ILE B CD1 1 +ATOM 1702 H H . ILE B 1 84 ? 14.881 1.013 14.728 1.00 15.00 ? ? ? ? ? ? 84 ILE B H 1 +ATOM 1703 N N . ILE B 1 85 ? 14.100 2.481 18.481 1.00 2.41 ? ? ? ? ? ? 85 ILE B N 1 +ATOM 1704 C CA . ILE B 1 85 ? 14.438 2.258 19.883 1.00 2.00 ? ? ? ? ? ? 85 ILE B CA 1 +ATOM 1705 C C . ILE B 1 85 ? 13.254 1.658 20.664 1.00 4.79 ? ? ? ? ? ? 85 ILE B C 1 +ATOM 1706 O O . ILE B 1 85 ? 12.239 2.291 20.911 1.00 7.52 ? ? ? ? ? ? 85 ILE B O 1 +ATOM 1707 C CB . ILE B 1 85 ? 14.902 3.586 20.555 1.00 2.00 ? ? ? ? ? ? 85 ILE B CB 1 +ATOM 1708 C CG1 . ILE B 1 85 ? 16.010 4.266 19.743 1.00 5.76 ? ? ? ? ? ? 85 ILE B CG1 1 +ATOM 1709 C CG2 . ILE B 1 85 ? 15.426 3.416 22.009 1.00 2.00 ? ? ? ? ? ? 85 ILE B CG2 1 +ATOM 1710 C CD1 . ILE B 1 85 ? 17.379 3.572 19.680 1.00 2.00 ? ? ? ? ? ? 85 ILE B CD1 1 +ATOM 1711 H H . ILE B 1 85 ? 13.583 3.301 18.224 1.00 15.00 ? ? ? ? ? ? 85 ILE B H 1 +ATOM 1712 N N . GLY B 1 86 ? 13.433 0.396 21.043 1.00 5.77 ? ? ? ? ? ? 86 GLY B N 1 +ATOM 1713 C CA . GLY B 1 86 ? 12.423 -0.340 21.815 1.00 2.16 ? ? ? ? ? ? 86 GLY B CA 1 +ATOM 1714 C C . GLY B 1 86 ? 12.550 -0.181 23.328 1.00 4.53 ? ? ? ? ? ? 86 GLY B C 1 +ATOM 1715 O O . GLY B 1 86 ? 13.503 0.392 23.860 1.00 6.76 ? ? ? ? ? ? 86 GLY B O 1 +ATOM 1716 H H . GLY B 1 86 ? 14.339 0.022 20.849 1.00 15.00 ? ? ? ? ? ? 86 GLY B H 1 +ATOM 1717 N N . ARG B 1 87 ? 11.557 -0.749 24.017 1.00 3.38 ? ? ? ? ? ? 87 ARG B N 1 +ATOM 1718 C CA . ARG B 1 87 ? 11.510 -0.755 25.479 1.00 2.44 ? ? ? ? ? ? 87 ARG B CA 1 +ATOM 1719 C C . ARG B 1 87 ? 12.725 -1.248 26.266 1.00 5.65 ? ? ? ? ? ? 87 ARG B C 1 +ATOM 1720 O O . ARG B 1 87 ? 12.956 -0.806 27.381 1.00 13.25 ? ? ? ? ? ? 87 ARG B O 1 +ATOM 1721 C CB . ARG B 1 87 ? 10.290 -1.528 25.906 1.00 7.47 ? ? ? ? ? ? 87 ARG B CB 1 +ATOM 1722 C CG . ARG B 1 87 ? 8.917 -0.959 25.491 1.00 8.87 ? ? ? ? ? ? 87 ARG B CG 1 +ATOM 1723 C CD . ARG B 1 87 ? 7.801 -2.039 25.487 1.00 7.94 ? ? ? ? ? ? 87 ARG B CD 1 +ATOM 1724 N NE . ARG B 1 87 ? 7.774 -2.654 26.794 1.00 5.94 ? ? ? ? ? ? 87 ARG B NE 1 +ATOM 1725 C CZ . ARG B 1 87 ? 8.189 -3.922 26.991 1.00 6.37 ? ? ? ? ? ? 87 ARG B CZ 1 +ATOM 1726 N NH1 . ARG B 1 87 ? 8.179 -4.849 26.041 1.00 2.00 ? ? ? ? ? ? 87 ARG B NH1 1 +ATOM 1727 N NH2 . ARG B 1 87 ? 8.637 -4.237 28.197 1.00 10.76 ? ? ? ? ? ? 87 ARG B NH2 1 +ATOM 1728 H H . ARG B 1 87 ? 10.767 -1.026 23.480 1.00 15.00 ? ? ? ? ? ? 87 ARG B H 1 +ATOM 1729 H HE . ARG B 1 87 ? 7.682 -2.071 27.601 1.00 15.00 ? ? ? ? ? ? 87 ARG B HE 1 +ATOM 1730 H HH11 . ARG B 1 87 ? 7.853 -4.627 25.123 1.00 15.00 ? ? ? ? ? ? 87 ARG B HH11 1 +ATOM 1731 H HH12 . ARG B 1 87 ? 8.503 -5.772 26.246 1.00 15.00 ? ? ? ? ? ? 87 ARG B HH12 1 +ATOM 1732 H HH21 . ARG B 1 87 ? 8.653 -3.541 28.915 1.00 15.00 ? ? ? ? ? ? 87 ARG B HH21 1 +ATOM 1733 H HH22 . ARG B 1 87 ? 8.959 -5.165 28.391 1.00 15.00 ? ? ? ? ? ? 87 ARG B HH22 1 +ATOM 1734 N N . ASN B 1 88 ? 13.552 -2.137 25.667 1.00 4.58 ? ? ? ? ? ? 88 ASN B N 1 +ATOM 1735 C CA . ASN B 1 88 ? 14.830 -2.535 26.304 1.00 4.31 ? ? ? ? ? ? 88 ASN B CA 1 +ATOM 1736 C C . ASN B 1 88 ? 15.915 -1.471 26.592 1.00 6.99 ? ? ? ? ? ? 88 ASN B C 1 +ATOM 1737 O O . ASN B 1 88 ? 16.718 -1.548 27.513 1.00 10.50 ? ? ? ? ? ? 88 ASN B O 1 +ATOM 1738 C CB . ASN B 1 88 ? 15.458 -3.730 25.561 1.00 2.00 ? ? ? ? ? ? 88 ASN B CB 1 +ATOM 1739 C CG . ASN B 1 88 ? 16.103 -3.340 24.263 1.00 4.25 ? ? ? ? ? ? 88 ASN B CG 1 +ATOM 1740 O OD1 . ASN B 1 88 ? 15.559 -2.581 23.473 1.00 6.48 ? ? ? ? ? ? 88 ASN B OD1 1 +ATOM 1741 N ND2 . ASN B 1 88 ? 17.308 -3.865 24.045 1.00 2.00 ? ? ? ? ? ? 88 ASN B ND2 1 +ATOM 1742 H H . ASN B 1 88 ? 13.264 -2.501 24.783 1.00 15.00 ? ? ? ? ? ? 88 ASN B H 1 +ATOM 1743 H HD21 . ASN B 1 88 ? 17.747 -3.648 23.174 1.00 15.00 ? ? ? ? ? ? 88 ASN B HD21 1 +ATOM 1744 H HD22 . ASN B 1 88 ? 17.759 -4.444 24.722 1.00 15.00 ? ? ? ? ? ? 88 ASN B HD22 1 +ATOM 1745 N N . LEU B 1 89 ? 15.903 -0.476 25.702 1.00 6.35 ? ? ? ? ? ? 89 LEU B N 1 +ATOM 1746 C CA . LEU B 1 89 ? 16.787 0.686 25.809 1.00 2.00 ? ? ? ? ? ? 89 LEU B CA 1 +ATOM 1747 C C . LEU B 1 89 ? 16.077 1.846 26.476 1.00 2.18 ? ? ? ? ? ? 89 LEU B C 1 +ATOM 1748 O O . LEU B 1 89 ? 16.600 2.478 27.382 1.00 4.96 ? ? ? ? ? ? 89 LEU B O 1 +ATOM 1749 C CB . LEU B 1 89 ? 17.326 1.021 24.395 1.00 3.14 ? ? ? ? ? ? 89 LEU B CB 1 +ATOM 1750 C CG . LEU B 1 89 ? 18.799 0.609 24.116 1.00 4.86 ? ? ? ? ? ? 89 LEU B CG 1 +ATOM 1751 C CD1 . LEU B 1 89 ? 19.161 -0.777 24.667 1.00 8.03 ? ? ? ? ? ? 89 LEU B CD1 1 +ATOM 1752 C CD2 . LEU B 1 89 ? 19.205 0.739 22.651 1.00 2.06 ? ? ? ? ? ? 89 LEU B CD2 1 +ATOM 1753 H H . LEU B 1 89 ? 15.259 -0.599 24.942 1.00 15.00 ? ? ? ? ? ? 89 LEU B H 1 +ATOM 1754 N N . LEU B 1 90 ? 14.800 2.061 26.082 1.00 6.66 ? ? ? ? ? ? 90 LEU B N 1 +ATOM 1755 C CA . LEU B 1 90 ? 13.932 3.133 26.689 1.00 6.20 ? ? ? ? ? ? 90 LEU B CA 1 +ATOM 1756 C C . LEU B 1 90 ? 13.854 3.200 28.214 1.00 4.35 ? ? ? ? ? ? 90 LEU B C 1 +ATOM 1757 O O . LEU B 1 90 ? 13.775 4.235 28.869 1.00 5.39 ? ? ? ? ? ? 90 LEU B O 1 +ATOM 1758 C CB . LEU B 1 90 ? 12.465 3.015 26.184 1.00 8.53 ? ? ? ? ? ? 90 LEU B CB 1 +ATOM 1759 C CG . LEU B 1 90 ? 11.936 3.857 24.981 1.00 5.53 ? ? ? ? ? ? 90 LEU B CG 1 +ATOM 1760 C CD1 . LEU B 1 90 ? 13.007 4.601 24.193 1.00 2.00 ? ? ? ? ? ? 90 LEU B CD1 1 +ATOM 1761 C CD2 . LEU B 1 90 ? 10.944 3.065 24.112 1.00 3.50 ? ? ? ? ? ? 90 LEU B CD2 1 +ATOM 1762 H H . LEU B 1 90 ? 14.483 1.528 25.293 1.00 15.00 ? ? ? ? ? ? 90 LEU B H 1 +ATOM 1763 N N . THR B 1 91 ? 13.883 2.005 28.787 1.00 5.72 ? ? ? ? ? ? 91 THR B N 1 +ATOM 1764 C CA . THR B 1 91 ? 13.936 2.005 30.248 1.00 8.62 ? ? ? ? ? ? 91 THR B CA 1 +ATOM 1765 C C . THR B 1 91 ? 15.238 2.497 30.906 1.00 12.11 ? ? ? ? ? ? 91 THR B C 1 +ATOM 1766 O O . THR B 1 91 ? 15.268 3.135 31.946 1.00 12.10 ? ? ? ? ? ? 91 THR B O 1 +ATOM 1767 C CB . THR B 1 91 ? 13.563 0.625 30.757 1.00 8.36 ? ? ? ? ? ? 91 THR B CB 1 +ATOM 1768 O OG1 . THR B 1 91 ? 14.488 -0.364 30.335 1.00 9.15 ? ? ? ? ? ? 91 THR B OG1 1 +ATOM 1769 C CG2 . THR B 1 91 ? 12.176 0.247 30.265 1.00 2.92 ? ? ? ? ? ? 91 THR B CG2 1 +ATOM 1770 H H . THR B 1 91 ? 13.883 1.154 28.259 1.00 15.00 ? ? ? ? ? ? 91 THR B H 1 +ATOM 1771 H HG1 . THR B 1 91 ? 13.997 -1.180 30.314 1.00 15.00 ? ? ? ? ? ? 91 THR B HG1 1 +ATOM 1772 N N . GLN B 1 92 ? 16.343 2.259 30.192 1.00 13.30 ? ? ? ? ? ? 92 GLN B N 1 +ATOM 1773 C CA . GLN B 1 92 ? 17.639 2.763 30.654 1.00 13.01 ? ? ? ? ? ? 92 GLN B CA 1 +ATOM 1774 C C . GLN B 1 92 ? 17.807 4.289 30.707 1.00 16.58 ? ? ? ? ? ? 92 GLN B C 1 +ATOM 1775 O O . GLN B 1 92 ? 18.555 4.840 31.504 1.00 21.33 ? ? ? ? ? ? 92 GLN B O 1 +ATOM 1776 C CB . GLN B 1 92 ? 18.749 2.149 29.811 1.00 11.12 ? ? ? ? ? ? 92 GLN B CB 1 +ATOM 1777 C CG . GLN B 1 92 ? 18.915 0.652 30.094 1.00 7.58 ? ? ? ? ? ? 92 GLN B CG 1 +ATOM 1778 C CD . GLN B 1 92 ? 20.064 0.116 29.278 1.00 7.51 ? ? ? ? ? ? 92 GLN B CD 1 +ATOM 1779 O OE1 . GLN B 1 92 ? 21.087 0.737 29.085 1.00 9.84 ? ? ? ? ? ? 92 GLN B OE1 1 +ATOM 1780 N NE2 . GLN B 1 92 ? 19.884 -1.074 28.761 1.00 6.92 ? ? ? ? ? ? 92 GLN B NE2 1 +ATOM 1781 H H . GLN B 1 92 ? 16.253 1.748 29.339 1.00 15.00 ? ? ? ? ? ? 92 GLN B H 1 +ATOM 1782 H HE21 . GLN B 1 92 ? 20.713 -1.454 28.349 1.00 15.00 ? ? ? ? ? ? 92 GLN B HE21 1 +ATOM 1783 H HE22 . GLN B 1 92 ? 18.987 -1.510 28.793 1.00 15.00 ? ? ? ? ? ? 92 GLN B HE22 1 +ATOM 1784 N N . ILE B 1 93 ? 17.045 4.968 29.837 1.00 12.87 ? ? ? ? ? ? 93 ILE B N 1 +ATOM 1785 C CA . ILE B 1 93 ? 17.188 6.422 29.880 1.00 11.98 ? ? ? ? ? ? 93 ILE B CA 1 +ATOM 1786 C C . ILE B 1 93 ? 16.200 7.226 30.748 1.00 15.56 ? ? ? ? ? ? 93 ILE B C 1 +ATOM 1787 O O . ILE B 1 93 ? 16.194 8.452 30.763 1.00 18.42 ? ? ? ? ? ? 93 ILE B O 1 +ATOM 1788 C CB . ILE B 1 93 ? 17.265 6.997 28.459 1.00 13.13 ? ? ? ? ? ? 93 ILE B CB 1 +ATOM 1789 C CG1 . ILE B 1 93 ? 15.894 6.880 27.787 1.00 8.28 ? ? ? ? ? ? 93 ILE B CG1 1 +ATOM 1790 C CG2 . ILE B 1 93 ? 18.397 6.268 27.707 1.00 11.44 ? ? ? ? ? ? 93 ILE B CG2 1 +ATOM 1791 C CD1 . ILE B 1 93 ? 15.838 7.301 26.320 1.00 2.00 ? ? ? ? ? ? 93 ILE B CD1 1 +ATOM 1792 H H . ILE B 1 93 ? 16.524 4.453 29.159 1.00 15.00 ? ? ? ? ? ? 93 ILE B H 1 +ATOM 1793 N N . GLY B 1 94 ? 15.333 6.473 31.472 1.00 18.70 ? ? ? ? ? ? 94 GLY B N 1 +ATOM 1794 C CA . GLY B 1 94 ? 14.292 7.114 32.314 1.00 15.92 ? ? ? ? ? ? 94 GLY B CA 1 +ATOM 1795 C C . GLY B 1 94 ? 12.929 7.432 31.657 1.00 20.12 ? ? ? ? ? ? 94 GLY B C 1 +ATOM 1796 O O . GLY B 1 94 ? 12.145 8.270 32.096 1.00 21.88 ? ? ? ? ? ? 94 GLY B O 1 +ATOM 1797 H H . GLY B 1 94 ? 15.472 5.483 31.470 1.00 15.00 ? ? ? ? ? ? 94 GLY B H 1 +ATOM 1798 N N . CYS B 1 95 ? 12.677 6.696 30.551 1.00 17.65 ? ? ? ? ? ? 95 CYS B N 1 +ATOM 1799 C CA . CYS B 1 95 ? 11.518 7.078 29.755 1.00 13.90 ? ? ? ? ? ? 95 CYS B CA 1 +ATOM 1800 C C . CYS B 1 95 ? 10.172 6.552 30.232 1.00 15.16 ? ? ? ? ? ? 95 CYS B C 1 +ATOM 1801 O O . CYS B 1 95 ? 9.972 5.378 30.537 1.00 15.03 ? ? ? ? ? ? 95 CYS B O 1 +ATOM 1802 C CB . CYS B 1 95 ? 11.751 6.682 28.326 1.00 17.96 ? ? ? ? ? ? 95 CYS B CB 1 +ATOM 1803 S SG . CYS B 1 95 ? 10.719 7.651 27.244 1.00 24.85 ? ? ? ? ? ? 95 CYS B SG 1 +ATOM 1804 H H . CYS B 1 95 ? 13.302 5.956 30.306 1.00 15.00 ? ? ? ? ? ? 95 CYS B H 1 +ATOM 1805 N N . THR B 1 96 ? 9.255 7.512 30.304 1.00 14.17 ? ? ? ? ? ? 96 THR B N 1 +ATOM 1806 C CA . THR B 1 96 ? 7.892 7.277 30.822 1.00 10.50 ? ? ? ? ? ? 96 THR B CA 1 +ATOM 1807 C C . THR B 1 96 ? 6.703 7.772 29.924 1.00 10.86 ? ? ? ? ? ? 96 THR B C 1 +ATOM 1808 O O . THR B 1 96 ? 6.776 8.715 29.137 1.00 10.68 ? ? ? ? ? ? 96 THR B O 1 +ATOM 1809 C CB . THR B 1 96 ? 7.876 7.836 32.244 1.00 7.42 ? ? ? ? ? ? 96 THR B CB 1 +ATOM 1810 O OG1 . THR B 1 96 ? 7.122 7.049 33.131 1.00 18.33 ? ? ? ? ? ? 96 THR B OG1 1 +ATOM 1811 C CG2 . THR B 1 96 ? 7.423 9.268 32.346 1.00 7.05 ? ? ? ? ? ? 96 THR B CG2 1 +ATOM 1812 H H . THR B 1 96 ? 9.595 8.433 30.102 1.00 15.00 ? ? ? ? ? ? 96 THR B H 1 +ATOM 1813 H HG1 . THR B 1 96 ? 7.076 7.573 33.926 1.00 15.00 ? ? ? ? ? ? 96 THR B HG1 1 +ATOM 1814 N N . LEU B 1 97 ? 5.572 7.068 30.017 1.00 12.50 ? ? ? ? ? ? 97 LEU B N 1 +ATOM 1815 C CA . LEU B 1 97 ? 4.381 7.555 29.292 1.00 9.08 ? ? ? ? ? ? 97 LEU B CA 1 +ATOM 1816 C C . LEU B 1 97 ? 3.341 8.244 30.248 1.00 10.28 ? ? ? ? ? ? 97 LEU B C 1 +ATOM 1817 O O . LEU B 1 97 ? 2.995 7.752 31.323 1.00 4.98 ? ? ? ? ? ? 97 LEU B O 1 +ATOM 1818 C CB . LEU B 1 97 ? 3.930 6.335 28.456 1.00 6.81 ? ? ? ? ? ? 97 LEU B CB 1 +ATOM 1819 C CG . LEU B 1 97 ? 2.975 6.301 27.249 1.00 2.00 ? ? ? ? ? ? 97 LEU B CG 1 +ATOM 1820 C CD1 . LEU B 1 97 ? 3.278 7.121 25.993 1.00 2.00 ? ? ? ? ? ? 97 LEU B CD1 1 +ATOM 1821 C CD2 . LEU B 1 97 ? 3.030 4.874 26.782 1.00 2.00 ? ? ? ? ? ? 97 LEU B CD2 1 +ATOM 1822 H H . LEU B 1 97 ? 5.557 6.271 30.624 1.00 15.00 ? ? ? ? ? ? 97 LEU B H 1 +ATOM 1823 N N . ASN B 1 98 ? 2.906 9.456 29.840 1.00 11.81 ? ? ? ? ? ? 98 ASN B N 1 +ATOM 1824 C CA . ASN B 1 98 ? 2.027 10.258 30.712 1.00 14.60 ? ? ? ? ? ? 98 ASN B CA 1 +ATOM 1825 C C . ASN B 1 98 ? 0.815 10.898 30.041 1.00 17.08 ? ? ? ? ? ? 98 ASN B C 1 +ATOM 1826 O O . ASN B 1 98 ? 0.770 11.025 28.820 1.00 16.80 ? ? ? ? ? ? 98 ASN B O 1 +ATOM 1827 C CB . ASN B 1 98 ? 2.741 11.428 31.309 1.00 15.57 ? ? ? ? ? ? 98 ASN B CB 1 +ATOM 1828 C CG . ASN B 1 98 ? 3.799 10.997 32.279 1.00 18.53 ? ? ? ? ? ? 98 ASN B CG 1 +ATOM 1829 O OD1 . ASN B 1 98 ? 4.988 11.013 32.015 1.00 14.88 ? ? ? ? ? ? 98 ASN B OD1 1 +ATOM 1830 N ND2 . ASN B 1 98 ? 3.330 10.741 33.486 1.00 17.86 ? ? ? ? ? ? 98 ASN B ND2 1 +ATOM 1831 H H . ASN B 1 98 ? 3.227 9.802 28.954 1.00 15.00 ? ? ? ? ? ? 98 ASN B H 1 +ATOM 1832 H HD21 . ASN B 1 98 ? 4.036 10.609 34.175 1.00 15.00 ? ? ? ? ? ? 98 ASN B HD21 1 +ATOM 1833 H HD22 . ASN B 1 98 ? 2.344 10.686 33.628 1.00 15.00 ? ? ? ? ? ? 98 ASN B HD22 1 +ATOM 1834 N N . PHE B 1 99 ? -0.104 11.294 30.941 1.00 20.23 ? ? ? ? ? ? 99 PHE B N 1 +ATOM 1835 C CA . PHE B 1 99 ? -1.522 10.899 31.041 1.00 20.55 ? ? ? ? ? ? 99 PHE B CA 1 +ATOM 1836 C C . PHE B 1 99 ? -2.234 11.277 32.355 1.00 15.56 ? ? ? ? ? ? 99 PHE B C 1 +ATOM 1837 O O . PHE B 1 99 ? -3.448 11.150 32.489 0.00 16.69 ? ? ? ? ? ? 99 PHE B O 1 +ATOM 1838 C CB . PHE B 1 99 ? -2.373 11.019 29.759 1.00 22.25 ? ? ? ? ? ? 99 PHE B CB 1 +ATOM 1839 C CG . PHE B 1 99 ? -2.820 9.586 29.541 1.00 25.51 ? ? ? ? ? ? 99 PHE B CG 1 +ATOM 1840 C CD1 . PHE B 1 99 ? -1.892 8.647 29.026 1.00 25.13 ? ? ? ? ? ? 99 PHE B CD1 1 +ATOM 1841 C CD2 . PHE B 1 99 ? -4.113 9.170 29.940 1.00 28.47 ? ? ? ? ? ? 99 PHE B CD2 1 +ATOM 1842 C CE1 . PHE B 1 99 ? -2.222 7.274 28.976 1.00 21.04 ? ? ? ? ? ? 99 PHE B CE1 1 +ATOM 1843 C CE2 . PHE B 1 99 ? -4.446 7.799 29.894 1.00 25.86 ? ? ? ? ? ? 99 PHE B CE2 1 +ATOM 1844 C CZ . PHE B 1 99 ? -3.488 6.863 29.441 1.00 24.17 ? ? ? ? ? ? 99 PHE B CZ 1 +ATOM 1845 O OXT . PHE B 1 99 ? -1.554 11.525 33.354 0.00 16.69 ? ? ? ? ? ? 99 PHE B OXT 1 +ATOM 1846 H H . PHE B 1 99 ? 0.193 11.604 31.840 1.00 15.00 ? ? ? ? ? ? 99 PHE B H 1 +HETATM 1847 C C1 . ARQ C 2 . ? 1.474 1.321 11.354 1.00 10.36 ? ? ? ? ? ? 401 ARQ A C1 1 +HETATM 1848 C C2 . ARQ C 2 . ? 0.562 0.252 12.036 1.00 10.59 ? ? ? ? ? ? 401 ARQ A C2 1 +HETATM 1849 C C3 . ARQ C 2 . ? 0.675 2.633 11.410 1.00 7.58 ? ? ? ? ? ? 401 ARQ A C3 1 +HETATM 1850 C C4 . ARQ C 2 . ? 1.852 1.006 9.891 1.00 4.50 ? ? ? ? ? ? 401 ARQ A C4 1 +HETATM 1851 O O4 . ARQ C 2 . ? 2.664 1.554 12.108 1.00 13.55 ? ? ? ? ? ? 401 ARQ A O4 1 +HETATM 1852 C C30 . ARQ C 2 . ? 3.511 0.571 12.400 1.00 11.18 ? ? ? ? ? ? 401 ARQ A C30 1 +HETATM 1853 O O3 . ARQ C 2 . ? 3.399 -0.533 11.970 1.00 9.15 ? ? ? ? ? ? 401 ARQ A O3 1 +HETATM 1854 N N1 . ARQ C 2 . ? 4.497 0.994 13.193 1.00 11.89 ? ? ? ? ? ? 401 ARQ A N1 1 +HETATM 1855 C C5 . ARQ C 2 . ? 5.716 0.269 13.558 1.00 14.02 ? ? ? ? ? ? 401 ARQ A C5 1 +HETATM 1856 C C6 . ARQ C 2 . ? 6.953 1.163 13.346 1.00 9.73 ? ? ? ? ? ? 401 ARQ A C6 1 +HETATM 1857 C C7 . ARQ C 2 . ? 6.975 1.824 11.998 1.00 9.34 ? ? ? ? ? ? 401 ARQ A C7 1 +HETATM 1858 C C8 . ARQ C 2 . ? 6.815 1.051 10.826 1.00 8.95 ? ? ? ? ? ? 401 ARQ A C8 1 +HETATM 1859 C C9 . ARQ C 2 . ? 6.791 1.701 9.574 1.00 6.26 ? ? ? ? ? ? 401 ARQ A C9 1 +HETATM 1860 C C10 . ARQ C 2 . ? 6.927 3.110 9.519 1.00 5.40 ? ? ? ? ? ? 401 ARQ A C10 1 +HETATM 1861 C C11 . ARQ C 2 . ? 7.114 3.232 11.941 1.00 8.18 ? ? ? ? ? ? 401 ARQ A C11 1 +HETATM 1862 C C12 . ARQ C 2 . ? 7.085 3.888 10.692 1.00 5.52 ? ? ? ? ? ? 401 ARQ A C12 1 +HETATM 1863 C C13 . ARQ C 2 . ? 5.642 -0.319 14.998 1.00 12.77 ? ? ? ? ? ? 401 ARQ A C13 1 +HETATM 1864 O O1 . ARQ C 2 . ? 5.248 0.651 15.980 1.00 8.69 ? ? ? ? ? ? 401 ARQ A O1 1 +HETATM 1865 C C14 . ARQ C 2 . ? 4.669 -1.525 15.008 1.00 14.15 ? ? ? ? ? ? 401 ARQ A C14 1 +HETATM 1866 N N2 . ARQ C 2 . ? 4.998 -2.669 15.910 1.00 16.35 ? ? ? ? ? ? 401 ARQ A N2 1 +HETATM 1867 C C22 . ARQ C 2 . ? 5.441 -2.219 17.249 1.00 15.50 ? ? ? ? ? ? 401 ARQ A C22 1 +HETATM 1868 C C15 . ARQ C 2 . ? 3.718 -3.441 16.024 1.00 12.33 ? ? ? ? ? ? 401 ARQ A C15 1 +HETATM 1869 C C16 . ARQ C 2 . ? 3.724 -4.695 16.883 1.00 6.95 ? ? ? ? ? ? 401 ARQ A C16 1 +HETATM 1870 C C17 . ARQ C 2 . ? 4.055 -5.940 16.308 1.00 9.51 ? ? ? ? ? ? 401 ARQ A C17 1 +HETATM 1871 C C18 . ARQ C 2 . ? 4.162 -7.106 17.109 1.00 9.70 ? ? ? ? ? ? 401 ARQ A C18 1 +HETATM 1872 C C19 . ARQ C 2 . ? 3.957 -7.006 18.505 1.00 3.77 ? ? ? ? ? ? 401 ARQ A C19 1 +HETATM 1873 C C20 . ARQ C 2 . ? 3.386 -4.632 18.248 1.00 8.21 ? ? ? ? ? ? 401 ARQ A C20 1 +HETATM 1874 C C21 . ARQ C 2 . ? 3.502 -5.791 19.063 1.00 7.45 ? ? ? ? ? ? 401 ARQ A C21 1 +HETATM 1875 N N3 . ARQ C 2 . ? 6.121 -3.333 15.291 1.00 13.41 ? ? ? ? ? ? 401 ARQ A N3 1 +HETATM 1876 C C23 . ARQ C 2 . ? 6.067 -4.033 14.140 1.00 20.01 ? ? ? ? ? ? 401 ARQ A C23 1 +HETATM 1877 O O2 . ARQ C 2 . ? 5.015 -4.224 13.523 1.00 22.49 ? ? ? ? ? ? 401 ARQ A O2 1 +HETATM 1878 C C27 . ARQ C 2 . ? 7.360 -4.579 13.674 1.00 23.08 ? ? ? ? ? ? 401 ARQ A C27 1 +HETATM 1879 C C26 . ARQ C 2 . ? 7.343 -5.490 12.582 1.00 23.69 ? ? ? ? ? ? 401 ARQ A C26 1 +HETATM 1880 C C25 . ARQ C 2 . ? 8.521 -6.101 12.123 1.00 18.68 ? ? ? ? ? ? 401 ARQ A C25 1 +HETATM 1881 C C24 . ARQ C 2 . ? 9.714 -5.796 12.796 1.00 19.95 ? ? ? ? ? ? 401 ARQ A C24 1 +HETATM 1882 C C28 . ARQ C 2 . ? 8.593 -4.222 14.279 1.00 25.64 ? ? ? ? ? ? 401 ARQ A C28 1 +HETATM 1883 C C29 . ARQ C 2 . ? 9.781 -4.839 13.838 1.00 23.32 ? ? ? ? ? ? 401 ARQ A C29 1 +HETATM 1884 H HN1 . ARQ C 2 . ? 4.325 1.941 13.433 0.00 0.00 ? ? ? ? ? ? 401 ARQ A HN1 1 +HETATM 1885 H H5 . ARQ C 2 . ? 5.812 -0.555 12.861 0.00 0.00 ? ? ? ? ? ? 401 ARQ A H5 1 +HETATM 1886 H H13 . ARQ C 2 . ? 6.691 -0.707 15.134 0.00 0.00 ? ? ? ? ? ? 401 ARQ A H13 1 +HETATM 1887 H HO1 . ARQ C 2 . ? 4.272 0.697 16.063 0.00 0.00 ? ? ? ? ? ? 401 ARQ A HO1 1 +HETATM 1888 H HN3 . ARQ C 2 . ? 7.032 -3.144 15.636 0.00 0.00 ? ? ? ? ? ? 401 ARQ A HN3 1 +HETATM 1889 O O . HOH D 3 . ? 5.120 -2.430 11.475 1.00 17.90 ? ? ? ? ? ? 402 HOH A O 1 +HETATM 1890 H H1 . HOH D 3 . ? 4.703 -2.628 12.329 0.00 20.00 ? ? ? ? ? ? 402 HOH A H1 1 +HETATM 1891 H H2 . HOH D 3 . ? 4.811 -1.521 11.387 0.00 20.00 ? ? ? ? ? ? 402 HOH A H2 1 +HETATM 1892 O O . HOH D 3 . ? 8.333 -4.450 17.823 1.00 17.83 ? ? ? ? ? ? 403 HOH A O 1 +HETATM 1893 H H1 . HOH D 3 . ? 8.259 -3.544 17.504 0.00 20.00 ? ? ? ? ? ? 403 HOH A H1 1 +HETATM 1894 H H2 . HOH D 3 . ? 7.430 -4.770 17.707 0.00 20.00 ? ? ? ? ? ? 403 HOH A H2 1 +HETATM 1895 O O . HOH D 3 . ? -1.392 10.401 12.400 1.00 25.70 ? ? ? ? ? ? 405 HOH A O 1 +HETATM 1896 H H1 . HOH D 3 . ? -1.110 9.691 12.984 0.00 20.00 ? ? ? ? ? ? 405 HOH A H1 1 +HETATM 1897 H H2 . HOH D 3 . ? -1.196 11.201 12.890 0.00 20.00 ? ? ? ? ? ? 405 HOH A H2 1 +HETATM 1898 O O . HOH D 3 . ? -8.545 10.688 13.725 1.00 4.29 ? ? ? ? ? ? 406 HOH A O 1 +HETATM 1899 H H1 . HOH D 3 . ? -8.105 11.169 13.015 0.00 20.00 ? ? ? ? ? ? 406 HOH A H1 1 +HETATM 1900 H H2 . HOH D 3 . ? -8.992 11.385 14.219 0.00 20.00 ? ? ? ? ? ? 406 HOH A H2 1 +HETATM 1901 O O . HOH D 3 . ? 7.328 3.159 38.192 1.00 63.38 ? ? ? ? ? ? 410 HOH A O 1 +HETATM 1902 H H1 . HOH D 3 . ? 7.836 2.868 38.960 0.00 20.00 ? ? ? ? ? ? 410 HOH A H1 1 +HETATM 1903 H H2 . HOH D 3 . ? 7.292 2.360 37.640 0.00 20.00 ? ? ? ? ? ? 410 HOH A H2 1 +HETATM 1904 O O . HOH E 3 . ? 18.496 0.062 6.092 1.00 58.99 ? ? ? ? ? ? 407 HOH B O 1 +HETATM 1905 H H1 . HOH E 3 . ? 18.810 0.911 5.772 0.00 20.00 ? ? ? ? ? ? 407 HOH B H1 1 +HETATM 1906 H H2 . HOH E 3 . ? 17.595 0.283 6.369 0.00 20.00 ? ? ? ? ? ? 407 HOH B H2 1 +HETATM 1907 O O . HOH E 3 . ? 18.639 -4.883 26.553 1.00 13.69 ? ? ? ? ? ? 408 HOH B O 1 +HETATM 1908 H H1 . HOH E 3 . ? 19.047 -5.595 27.057 0.00 20.00 ? ? ? ? ? ? 408 HOH B H1 1 +HETATM 1909 H H2 . HOH E 3 . ? 18.259 -4.326 27.243 0.00 20.00 ? ? ? ? ? ? 408 HOH B H2 1 +HETATM 1910 O O . HOH E 3 . ? 10.120 3.111 32.180 1.00 13.85 ? ? ? ? ? ? 409 HOH B O 1 +HETATM 1911 H H1 . HOH E 3 . ? 10.839 3.269 32.796 0.00 20.00 ? ? ? ? ? ? 409 HOH B H1 1 +HETATM 1912 H H2 . HOH E 3 . ? 10.029 3.959 31.733 0.00 20.00 ? ? ? ? ? ? 409 HOH B H2 1 +# +loop_ +_pdbx_poly_seq_scheme.asym_id +_pdbx_poly_seq_scheme.entity_id +_pdbx_poly_seq_scheme.seq_id +_pdbx_poly_seq_scheme.mon_id +_pdbx_poly_seq_scheme.ndb_seq_num +_pdbx_poly_seq_scheme.pdb_seq_num +_pdbx_poly_seq_scheme.auth_seq_num +_pdbx_poly_seq_scheme.pdb_mon_id +_pdbx_poly_seq_scheme.auth_mon_id +_pdbx_poly_seq_scheme.pdb_strand_id +_pdbx_poly_seq_scheme.pdb_ins_code +_pdbx_poly_seq_scheme.hetero +A 1 1 PRO 1 1 1 PRO PRO A . n +A 1 2 GLN 2 2 2 GLN GLN A . n +A 1 3 ILE 3 3 3 ILE ILE A . n +A 1 4 THR 4 4 4 THR THR A . n +A 1 5 LEU 5 5 5 LEU LEU A . n +A 1 6 TRP 6 6 6 TRP TRP A . n +A 1 7 LYS 7 7 7 LYS LYS A . n +A 1 8 ARG 8 8 8 ARG ARG A . n +A 1 9 PRO 9 9 9 PRO PRO A . n +A 1 10 LEU 10 10 10 LEU LEU A . n +A 1 11 VAL 11 11 11 VAL VAL A . n +A 1 12 THR 12 12 12 THR THR A . n +A 1 13 ILE 13 13 13 ILE ILE A . n +A 1 14 ARG 14 14 14 ARG ARG A . n +A 1 15 ILE 15 15 15 ILE ILE A . n +A 1 16 GLY 16 16 16 GLY GLY A . n +A 1 17 GLY 17 17 17 GLY GLY A . n +A 1 18 GLN 18 18 18 GLN GLN A . n +A 1 19 LEU 19 19 19 LEU LEU A . n +A 1 20 LYS 20 20 20 LYS LYS A . n +A 1 21 GLU 21 21 21 GLU GLU A . n +A 1 22 ALA 22 22 22 ALA ALA A . n +A 1 23 LEU 23 23 23 LEU LEU A . n +A 1 24 LEU 24 24 24 LEU LEU A . n +A 1 25 ASP 25 25 25 ASP ASP A . n +A 1 26 THR 26 26 26 THR THR A . n +A 1 27 GLY 27 27 27 GLY GLY A . n +A 1 28 ALA 28 28 28 ALA ALA A . n +A 1 29 ASP 29 29 29 ASP ASP A . n +A 1 30 ASP 30 30 30 ASP ASP A . n +A 1 31 THR 31 31 31 THR THR A . n +A 1 32 VAL 32 32 32 VAL VAL A . n +A 1 33 LEU 33 33 33 LEU LEU A . n +A 1 34 GLU 34 34 34 GLU GLU A . n +A 1 35 GLU 35 35 35 GLU GLU A . n +A 1 36 MET 36 36 36 MET MET A . n +A 1 37 ASN 37 37 37 ASN ASN A . n +A 1 38 LEU 38 38 38 LEU LEU A . n +A 1 39 PRO 39 39 39 PRO PRO A . n +A 1 40 GLY 40 40 40 GLY GLY A . n +A 1 41 LYS 41 41 41 LYS LYS A . n +A 1 42 TRP 42 42 42 TRP TRP A . n +A 1 43 LYS 43 43 43 LYS LYS A . n +A 1 44 PRO 44 44 44 PRO PRO A . n +A 1 45 LYS 45 45 45 LYS LYS A . n +A 1 46 MET 46 46 46 MET MET A . n +A 1 47 ILE 47 47 47 ILE ILE A . n +A 1 48 GLY 48 48 48 GLY GLY A . n +A 1 49 GLY 49 49 49 GLY GLY A . n +A 1 50 ILE 50 50 50 ILE ILE A . n +A 1 51 GLY 51 51 51 GLY GLY A . n +A 1 52 GLY 52 52 52 GLY GLY A . n +A 1 53 PHE 53 53 53 PHE PHE A . n +A 1 54 ILE 54 54 54 ILE ILE A . n +A 1 55 LYS 55 55 55 LYS LYS A . n +A 1 56 VAL 56 56 56 VAL VAL A . n +A 1 57 ARG 57 57 57 ARG ARG A . n +A 1 58 GLN 58 58 58 GLN GLN A . n +A 1 59 TYR 59 59 59 TYR TYR A . n +A 1 60 ASP 60 60 60 ASP ASP A . n +A 1 61 GLN 61 61 61 GLN GLN A . n +A 1 62 ILE 62 62 62 ILE ILE A . n +A 1 63 PRO 63 63 63 PRO PRO A . n +A 1 64 VAL 64 64 64 VAL VAL A . n +A 1 65 GLU 65 65 65 GLU GLU A . n +A 1 66 ILE 66 66 66 ILE ILE A . n +A 1 67 CYS 67 67 67 CYS CYS A . n +A 1 68 GLY 68 68 68 GLY GLY A . n +A 1 69 HIS 69 69 69 HIS HIS A . n +A 1 70 LYS 70 70 70 LYS LYS A . n +A 1 71 ALA 71 71 71 ALA ALA A . n +A 1 72 ILE 72 72 72 ILE ILE A . n +A 1 73 GLY 73 73 73 GLY GLY A . n +A 1 74 THR 74 74 74 THR THR A . n +A 1 75 VAL 75 75 75 VAL VAL A . n +A 1 76 LEU 76 76 76 LEU LEU A . n +A 1 77 VAL 77 77 77 VAL VAL A . n +A 1 78 GLY 78 78 78 GLY GLY A . n +A 1 79 PRO 79 79 79 PRO PRO A . n +A 1 80 THR 80 80 80 THR THR A . n +A 1 81 PRO 81 81 81 PRO PRO A . n +A 1 82 VAL 82 82 82 VAL VAL A . n +A 1 83 ASN 83 83 83 ASN ASN A . n +A 1 84 ILE 84 84 84 ILE ILE A . n +A 1 85 ILE 85 85 85 ILE ILE A . n +A 1 86 GLY 86 86 86 GLY GLY A . n +A 1 87 ARG 87 87 87 ARG ARG A . n +A 1 88 ASN 88 88 88 ASN ASN A . n +A 1 89 LEU 89 89 89 LEU LEU A . n +A 1 90 LEU 90 90 90 LEU LEU A . n +A 1 91 THR 91 91 91 THR THR A . n +A 1 92 GLN 92 92 92 GLN GLN A . n +A 1 93 ILE 93 93 93 ILE ILE A . n +A 1 94 GLY 94 94 94 GLY GLY A . n +A 1 95 CYS 95 95 95 CYS CYS A . n +A 1 96 THR 96 96 96 THR THR A . n +A 1 97 LEU 97 97 97 LEU LEU A . n +A 1 98 ASN 98 98 98 ASN ASN A . n +A 1 99 PHE 99 99 99 PHE PHE A . n +B 1 1 PRO 1 1 1 PRO PRO B . n +B 1 2 GLN 2 2 2 GLN GLN B . n +B 1 3 ILE 3 3 3 ILE ILE B . n +B 1 4 THR 4 4 4 THR THR B . n +B 1 5 LEU 5 5 5 LEU LEU B . n +B 1 6 TRP 6 6 6 TRP TRP B . n +B 1 7 LYS 7 7 7 LYS LYS B . n +B 1 8 ARG 8 8 8 ARG ARG B . n +B 1 9 PRO 9 9 9 PRO PRO B . n +B 1 10 LEU 10 10 10 LEU LEU B . n +B 1 11 VAL 11 11 11 VAL VAL B . n +B 1 12 THR 12 12 12 THR THR B . n +B 1 13 ILE 13 13 13 ILE ILE B . n +B 1 14 ARG 14 14 14 ARG ARG B . n +B 1 15 ILE 15 15 15 ILE ILE B . n +B 1 16 GLY 16 16 16 GLY GLY B . n +B 1 17 GLY 17 17 17 GLY GLY B . n +B 1 18 GLN 18 18 18 GLN GLN B . n +B 1 19 LEU 19 19 19 LEU LEU B . n +B 1 20 LYS 20 20 20 LYS LYS B . n +B 1 21 GLU 21 21 21 GLU GLU B . n +B 1 22 ALA 22 22 22 ALA ALA B . n +B 1 23 LEU 23 23 23 LEU LEU B . n +B 1 24 LEU 24 24 24 LEU LEU B . n +B 1 25 ASP 25 25 25 ASP ASP B . n +B 1 26 THR 26 26 26 THR THR B . n +B 1 27 GLY 27 27 27 GLY GLY B . n +B 1 28 ALA 28 28 28 ALA ALA B . n +B 1 29 ASP 29 29 29 ASP ASP B . n +B 1 30 ASP 30 30 30 ASP ASP B . n +B 1 31 THR 31 31 31 THR THR B . n +B 1 32 VAL 32 32 32 VAL VAL B . n +B 1 33 LEU 33 33 33 LEU LEU B . n +B 1 34 GLU 34 34 34 GLU GLU B . n +B 1 35 GLU 35 35 35 GLU GLU B . n +B 1 36 MET 36 36 36 MET MET B . n +B 1 37 ASN 37 37 37 ASN ASN B . n +B 1 38 LEU 38 38 38 LEU LEU B . n +B 1 39 PRO 39 39 39 PRO PRO B . n +B 1 40 GLY 40 40 40 GLY GLY B . n +B 1 41 LYS 41 41 41 LYS LYS B . n +B 1 42 TRP 42 42 42 TRP TRP B . n +B 1 43 LYS 43 43 43 LYS LYS B . n +B 1 44 PRO 44 44 44 PRO PRO B . n +B 1 45 LYS 45 45 45 LYS LYS B . n +B 1 46 MET 46 46 46 MET MET B . n +B 1 47 ILE 47 47 47 ILE ILE B . n +B 1 48 GLY 48 48 48 GLY GLY B . n +B 1 49 GLY 49 49 49 GLY GLY B . n +B 1 50 ILE 50 50 50 ILE ILE B . n +B 1 51 GLY 51 51 51 GLY GLY B . n +B 1 52 GLY 52 52 52 GLY GLY B . n +B 1 53 PHE 53 53 53 PHE PHE B . n +B 1 54 ILE 54 54 54 ILE ILE B . n +B 1 55 LYS 55 55 55 LYS LYS B . n +B 1 56 VAL 56 56 56 VAL VAL B . n +B 1 57 ARG 57 57 57 ARG ARG B . n +B 1 58 GLN 58 58 58 GLN GLN B . n +B 1 59 TYR 59 59 59 TYR TYR B . n +B 1 60 ASP 60 60 60 ASP ASP B . n +B 1 61 GLN 61 61 61 GLN GLN B . n +B 1 62 ILE 62 62 62 ILE ILE B . n +B 1 63 PRO 63 63 63 PRO PRO B . n +B 1 64 VAL 64 64 64 VAL VAL B . n +B 1 65 GLU 65 65 65 GLU GLU B . n +B 1 66 ILE 66 66 66 ILE ILE B . n +B 1 67 CYS 67 67 67 CYS CYS B . n +B 1 68 GLY 68 68 68 GLY GLY B . n +B 1 69 HIS 69 69 69 HIS HIS B . n +B 1 70 LYS 70 70 70 LYS LYS B . n +B 1 71 ALA 71 71 71 ALA ALA B . n +B 1 72 ILE 72 72 72 ILE ILE B . n +B 1 73 GLY 73 73 73 GLY GLY B . n +B 1 74 THR 74 74 74 THR THR B . n +B 1 75 VAL 75 75 75 VAL VAL B . n +B 1 76 LEU 76 76 76 LEU LEU B . n +B 1 77 VAL 77 77 77 VAL VAL B . n +B 1 78 GLY 78 78 78 GLY GLY B . n +B 1 79 PRO 79 79 79 PRO PRO B . n +B 1 80 THR 80 80 80 THR THR B . n +B 1 81 PRO 81 81 81 PRO PRO B . n +B 1 82 VAL 82 82 82 VAL VAL B . n +B 1 83 ASN 83 83 83 ASN ASN B . n +B 1 84 ILE 84 84 84 ILE ILE B . n +B 1 85 ILE 85 85 85 ILE ILE B . n +B 1 86 GLY 86 86 86 GLY GLY B . n +B 1 87 ARG 87 87 87 ARG ARG B . n +B 1 88 ASN 88 88 88 ASN ASN B . n +B 1 89 LEU 89 89 89 LEU LEU B . n +B 1 90 LEU 90 90 90 LEU LEU B . n +B 1 91 THR 91 91 91 THR THR B . n +B 1 92 GLN 92 92 92 GLN GLN B . n +B 1 93 ILE 93 93 93 ILE ILE B . n +B 1 94 GLY 94 94 94 GLY GLY B . n +B 1 95 CYS 95 95 95 CYS CYS B . n +B 1 96 THR 96 96 96 THR THR B . n +B 1 97 LEU 97 97 97 LEU LEU B . n +B 1 98 ASN 98 98 98 ASN ASN B . n +B 1 99 PHE 99 99 99 PHE PHE B . n +# +loop_ +_software.name +_software.classification +_software.version +_software.citation_id +_software.pdbx_ordinal +X-PLOR 'model building' 2.0 ? 1 +X-PLOR refinement 2.0 ? 2 +# +loop_ +_pdbx_version.entry_id +_pdbx_version.revision_date +_pdbx_version.major_version +_pdbx_version.minor_version +_pdbx_version.revision_type +_pdbx_version.details +3AID 2008-03-03 3 2 'Version format compliance' 'compliance with PDB format V.3.15' +3AID 2011-07-13 4 0000 'Version format compliance' 'compliance with PDB Exchange Dictionary V4' +# +loop_ +_pdbx_unobs_or_zero_occ_atoms.id +_pdbx_unobs_or_zero_occ_atoms.polymer_flag +_pdbx_unobs_or_zero_occ_atoms.occupancy_flag +_pdbx_unobs_or_zero_occ_atoms.PDB_model_num +_pdbx_unobs_or_zero_occ_atoms.auth_asym_id +_pdbx_unobs_or_zero_occ_atoms.auth_comp_id +_pdbx_unobs_or_zero_occ_atoms.auth_seq_id +_pdbx_unobs_or_zero_occ_atoms.PDB_ins_code +_pdbx_unobs_or_zero_occ_atoms.auth_atom_id +_pdbx_unobs_or_zero_occ_atoms.label_alt_id +1 Y 0 1 A PHE 99 ? O ? +2 Y 0 1 A PHE 99 ? OXT ? +3 Y 0 1 B PHE 99 ? O ? +4 Y 0 1 B PHE 99 ? OXT ? +# +_pdbx_struct_assembly.id 1 +_pdbx_struct_assembly.details author_and_software_defined_assembly +_pdbx_struct_assembly.method_details PISA +_pdbx_struct_assembly.oligomeric_details dimeric +_pdbx_struct_assembly.oligomeric_count 2 +# +_pdbx_struct_assembly_gen.assembly_id 1 +_pdbx_struct_assembly_gen.oper_expression 1 +_pdbx_struct_assembly_gen.asym_id_list A,C,D,B,E +# +loop_ +_pdbx_struct_assembly_prop.biol_id +_pdbx_struct_assembly_prop.type +_pdbx_struct_assembly_prop.value +_pdbx_struct_assembly_prop.details +1 'ABSA (A^2)' 4910 ? +1 'SSA (A^2)' 9760 ? +1 MORE -18 ? +# +_pdbx_struct_oper_list.id 1 +_pdbx_struct_oper_list.type 'identity operation' +_pdbx_struct_oper_list.name 1_555 +_pdbx_struct_oper_list.symmetry_operation x,y,z +_pdbx_struct_oper_list.matrix[1][1] 1.0000000000 +_pdbx_struct_oper_list.matrix[1][2] 0.0000000000 +_pdbx_struct_oper_list.matrix[1][3] 0.0000000000 +_pdbx_struct_oper_list.vector[1] 0.0000000000 +_pdbx_struct_oper_list.matrix[2][1] 0.0000000000 +_pdbx_struct_oper_list.matrix[2][2] 1.0000000000 +_pdbx_struct_oper_list.matrix[2][3] 0.0000000000 +_pdbx_struct_oper_list.vector[2] 0.0000000000 +_pdbx_struct_oper_list.matrix[3][1] 0.0000000000 +_pdbx_struct_oper_list.matrix[3][2] 0.0000000000 +_pdbx_struct_oper_list.matrix[3][3] 1.0000000000 +_pdbx_struct_oper_list.vector[3] 0.0000000000 +# +loop_ +_pdbx_nonpoly_scheme.asym_id +_pdbx_nonpoly_scheme.entity_id +_pdbx_nonpoly_scheme.mon_id +_pdbx_nonpoly_scheme.ndb_seq_num +_pdbx_nonpoly_scheme.pdb_seq_num +_pdbx_nonpoly_scheme.auth_seq_num +_pdbx_nonpoly_scheme.pdb_mon_id +_pdbx_nonpoly_scheme.auth_mon_id +_pdbx_nonpoly_scheme.pdb_strand_id +_pdbx_nonpoly_scheme.pdb_ins_code +C 2 ARQ 1 401 401 ARQ ARQ A . +D 3 HOH 1 402 402 HOH HOH A . +D 3 HOH 2 403 403 HOH HOH A . +D 3 HOH 3 405 405 HOH HOH A . +D 3 HOH 4 406 406 HOH HOH A . +D 3 HOH 5 410 410 HOH HOH A . +E 3 HOH 1 407 407 HOH HOH B . +E 3 HOH 2 408 408 HOH HOH B . +E 3 HOH 3 409 409 HOH HOH B . +# +loop_ +_pdbx_validate_rmsd_angle.id +_pdbx_validate_rmsd_angle.PDB_model_num +_pdbx_validate_rmsd_angle.auth_atom_id_1 +_pdbx_validate_rmsd_angle.auth_asym_id_1 +_pdbx_validate_rmsd_angle.auth_comp_id_1 +_pdbx_validate_rmsd_angle.auth_seq_id_1 +_pdbx_validate_rmsd_angle.PDB_ins_code_1 +_pdbx_validate_rmsd_angle.label_alt_id_1 +_pdbx_validate_rmsd_angle.auth_atom_id_2 +_pdbx_validate_rmsd_angle.auth_asym_id_2 +_pdbx_validate_rmsd_angle.auth_comp_id_2 +_pdbx_validate_rmsd_angle.auth_seq_id_2 +_pdbx_validate_rmsd_angle.PDB_ins_code_2 +_pdbx_validate_rmsd_angle.label_alt_id_2 +_pdbx_validate_rmsd_angle.auth_atom_id_3 +_pdbx_validate_rmsd_angle.auth_asym_id_3 +_pdbx_validate_rmsd_angle.auth_comp_id_3 +_pdbx_validate_rmsd_angle.auth_seq_id_3 +_pdbx_validate_rmsd_angle.PDB_ins_code_3 +_pdbx_validate_rmsd_angle.label_alt_id_3 +_pdbx_validate_rmsd_angle.angle_deviation +1 1 NE A ARG 8 ? ? CZ A ARG 8 ? ? NH1 A ARG 8 ? ? 3.6 +2 1 NE A ARG 8 ? ? CZ A ARG 8 ? ? NH2 A ARG 8 ? ? -3.8 +3 1 C B GLY 16 ? ? N B GLY 17 ? ? CA B GLY 17 ? ? -13.0 +4 1 NE B ARG 87 ? ? CZ B ARG 87 ? ? NH1 B ARG 87 ? ? 3.0 +# +_pdbx_validate_torsion.id 1 +_pdbx_validate_torsion.PDB_model_num 1 +_pdbx_validate_torsion.auth_comp_id GLU +_pdbx_validate_torsion.auth_asym_id A +_pdbx_validate_torsion.auth_seq_id 35 +_pdbx_validate_torsion.PDB_ins_code ? +_pdbx_validate_torsion.phi -41.76 +_pdbx_validate_torsion.psi 108.21 +# +loop_ +_pdbx_validate_peptide_omega.id +_pdbx_validate_peptide_omega.PDB_model_num +_pdbx_validate_peptide_omega.auth_comp_id_1 +_pdbx_validate_peptide_omega.auth_asym_id_1 +_pdbx_validate_peptide_omega.auth_seq_id_1 +_pdbx_validate_peptide_omega.PDB_ins_code_1 +_pdbx_validate_peptide_omega.auth_comp_id_2 +_pdbx_validate_peptide_omega.auth_asym_id_2 +_pdbx_validate_peptide_omega.auth_seq_id_2 +_pdbx_validate_peptide_omega.PDB_ins_code_2 +_pdbx_validate_peptide_omega.omega +1 1 PRO B 1 ? GLN B 2 ? 131.857 +2 1 ASN B 98 ? PHE B 99 ? -122.454 +# +loop_ +_pdbx_validate_chiral.id +_pdbx_validate_chiral.PDB_model_num +_pdbx_validate_chiral.auth_comp_id +_pdbx_validate_chiral.auth_asym_id +_pdbx_validate_chiral.auth_seq_id +_pdbx_validate_chiral.PDB_ins_code +_pdbx_validate_chiral.details +_pdbx_validate_chiral.omega +1 1 PRO A 1 ? 'Expecting L Found D WRONG HAND' -20.210 +2 1 ILE A 50 ? 'Expecting L Found L OUTSIDE RANGE' 21.813 +3 1 GLN A 61 ? 'Expecting L Found L OUTSIDE RANGE' 23.281 +4 1 VAL A 64 ? 'Expecting L Found L OUTSIDE RANGE' 22.866 +5 1 PRO B 1 ? 'Expecting L Found D WRONG HAND' -25.807 +6 1 LYS B 7 ? 'Expecting L Found L OUTSIDE RANGE' 23.439 +7 1 GLN B 61 ? 'Expecting L Found L OUTSIDE RANGE' 23.530 +8 1 VAL B 77 ? 'Expecting L Found L OUTSIDE RANGE' 24.832 +9 1 PHE B 99 ? 'Expecting L Found D WRONG HAND' -21.536 +# +loop_ +_pdbx_validate_planes.id +_pdbx_validate_planes.PDB_model_num +_pdbx_validate_planes.auth_comp_id +_pdbx_validate_planes.auth_asym_id +_pdbx_validate_planes.auth_seq_id +_pdbx_validate_planes.PDB_ins_code +_pdbx_validate_planes.rmsd +_pdbx_validate_planes.type +1 1 ARG A 87 ? 0.198 'SIDE CHAIN' +2 1 ARG B 87 ? 0.130 'SIDE CHAIN' +# +loop_ +_pdbx_entity_nonpoly.entity_id +_pdbx_entity_nonpoly.name +_pdbx_entity_nonpoly.comp_id +2 'BENZOYLAMINO-BENZYL-METHYL-[2-HYDROXY-3-[1-METHYL-ETHYL-OXY-N-FORMAMIDYL]-4-PHENYL-BUTYL]-AMMONIUM' ARQ +3 water HOH +# diff --git a/moldesign/_tests/conftest.py b/moldesign/_tests/conftest.py new file mode 100644 index 0000000..108f711 --- /dev/null +++ b/moldesign/_tests/conftest.py @@ -0,0 +1,14 @@ + + +def pytest_itemcollected(item): + if hasattr(item.module, '__PYTEST_MARK__'): + item.add_marker(item.module.__PYTEST_MARK__) + + +# TODO: nicer output strings for git commit status +# see https://docs.pytest.org/en/latest/example/simple.html#post-process-test-reports-failures +#@pytest.hookimpl(tryfirst=True, hookwrapper=True) +#def pytest_runtest_makereport(item, call):i +# pass +# Also possibly useful: item.add_report_section + diff --git a/moldesign/_tests/data/propane.pdb b/moldesign/_tests/data/propane.pdb new file mode 100644 index 0000000..3ccb075 --- /dev/null +++ b/moldesign/_tests/data/propane.pdb @@ -0,0 +1,12 @@ +HETATM 1 C0 UNL 1 1.056 0.061 0.061 0.00 0.00 C +HETATM 2 C1 UNL 1 0.562 1.363 -0.545 0.00 0.00 C +HETATM 3 C2 UNL 1 1.056 1.532 -1.972 0.00 0.00 C +HETATM 4 H3 UNL 1 0.701 -0.799 -0.516 0.00 0.00 H +HETATM 5 H4 UNL 1 0.691 -0.044 1.088 0.00 0.00 H +HETATM 6 H5 UNL 1 2.150 0.031 0.085 0.00 0.00 H +HETATM 7 H6 UNL 1 -0.534 1.380 -0.533 0.00 0.00 H +HETATM 8 H7 UNL 1 0.907 2.205 0.064 0.00 0.00 H +HETATM 9 H8 UNL 1 0.701 0.715 -2.608 0.00 0.00 H +HETATM 10 H9 UNL 1 0.691 2.474 -2.392 0.00 0.00 H +HETATM 11 H10 UNL 1 2.150 1.545 -2.008 0.00 0.00 H +END diff --git a/moldesign/_tests/helpers.py b/moldesign/_tests/helpers.py index 74aa0c0..972e688 100644 --- a/moldesign/_tests/helpers.py +++ b/moldesign/_tests/helpers.py @@ -5,6 +5,8 @@ from builtins import range from future.utils import PY2 +import pytest + import os import socket @@ -51,6 +53,9 @@ def num_grad(mol, fn, step=DEFSTEP, atoms=None, fnargs=None, fnkwargs=None): return grad +ENERGY_TOLERANCE = 1e-8 * u.hartree + + def _make_mol_with_n_hydrogens(n): return mdt.Molecule([mdt.Atom('H') for i in range(n)]) @@ -107,22 +112,114 @@ def assert_something_resembling_minimization_happened(p0, e0, traj, mol): Returns: """ + # Use assert_almost_equal to account for small numerical differences in + # convergence noise, serialization methods, etc. + import scipy.optimize.optimize assert traj.num_frames > 1 - assert traj.potential_energy[0] == e0 + assert_almost_equal(traj.potential_energy[0], + e0, decimal=9) + assert_almost_equal(traj.potential_energy[-1], + mol.potential_energy, decimal=9) assert traj.potential_energy[-1] < e0 - assert traj.potential_energy[-1] == mol.potential_energy assert (traj.positions[0] == p0).all() assert (traj.positions[-1] != p0).any() assert (traj.positions[-1] == mol.positions).all() + recalc = mol.calculate_potential_energy(usecache=False) + assert (recalc - traj.potential_energy[-1]) < 1.0e-8 * u.hartree + scipyresult = getattr(traj, 'info', None) if isinstance(scipyresult, scipy.optimize.optimize.OptimizeResult): np.testing.assert_allclose(scipyresult.x, mol.positions.defunits_value().flat) - np.testing.assert_almost_equal(scipyresult.fun, - mol.potential_energy.defunits_value()) + assert_almost_equal(scipyresult.fun, + mol.potential_energy.defunits_value()) + + if mol.constraints or mol.energy_model.params.get('constrain_hbonds', False): + assert_constraints_satisfied(traj, p0, mol) + + +def assert_something_resembling_dynamics_happened(traj, mol, p0, t0, duration): + """ Checks that dynamics routines have produced a consistent trajectory + """ + frame_interval = mol.integrator.params.frame_interval + timestep = mol.integrator.params.timestep + epsilon_t = 1e-5 * timestep # numerical noise in time + if isinstance(frame_interval, int): + frame_interval *= mol.integrator.params.timestep + + assert mol is traj.mol + assert traj.time[0] == t0 + assert mol.time == traj.time[-1] + assert_almost_equal(traj.positions[-1], mol.positions) + + # Energy test is not exact due to some non-deterministic kernels (e.g., OpenMM CPU model) + # Note: this is WAY too loose right now ... + assert abs(traj.potential_energy[-1] - mol.calculate_potential_energy()) < 1e-5 * u.eV + + # lower precision for first step due to noise from single-precision positions (i.e. OpenMM CPU) + assert_almost_equal(traj.positions[0], p0, decimal=5) + + lasttime = -np.inf * u.fs + expected_end = t0 + duration + for istep, step in enumerate(traj): + assert istep < len(traj) # I certainly hope so! + assert step.time > lasttime + + if istep == len(traj) - 1: + # last frame - it just needs + assert step.time >= expected_end - epsilon_t + break + + elif istep != 0: + assert (step.time - lasttime - frame_interval) < epsilon_t + lasttime = step.time + + # If frame_interval doesn't divide duration exactly, it's permitted to go beyond duration + assert duration <= mol.time - traj.time[0] + epsilon_t + assert mol.time - traj.time[0] < duration + frame_interval + epsilon_t + + if mol.constraints or mol.energy_model.params.get('constrain_hbonds', False): + assert_constraints_satisfied(traj, p0, mol, rigorous_constraints=True) + + +def assert_constraints_satisfied(traj, p0, mol, rigorous_constraints=False): + """ Checks that constraints were satisfied during molecular motion + """ + # TODO: check water rigidity, if called for + if mol.integrator is not None and mol.integrator.params.get('constrain_hbonds', False): + check_hbonds = True + assert mdt.geom.HBondsConstraint(mol).satisfied() # not sure what tolerance should be here + else: + check_hbonds = False + + for constraint in mol.constraints: + assert constraint.satisfied() + + if rigorous_constraints: + testmol = mol.copy() + if check_hbonds: + hbonds = mdt.HBondsConstraint(testmol) + for frame in traj.frames[1:]: # ok if starting positions don't obey constraints + testmol.positions = frame.positions + for constraint in testmol.constraints: + assert constraint.satisfied() + if check_hbonds: + assert hbonds.satisfied() + + +def assert_almost_equal(actual, desired, **kwargs): + units = mdt.units.get_units(actual) + + np.testing.assert_almost_equal(units.value_of(actual), + units.value_of(desired), + **kwargs) + +requires_internet_connection = pytest.mark.skipif(not INTERNET_ON, + reason='Network connection timed out') +""" Decorator to disable tests that need internet if we can't connect to the network """ diff --git a/moldesign/_tests/molecule_fixtures.py b/moldesign/_tests/molecule_fixtures.py index 82d1f7c..44bd31e 100644 --- a/moldesign/_tests/molecule_fixtures.py +++ b/moldesign/_tests/molecule_fixtures.py @@ -6,6 +6,8 @@ import moldesign.units as u from .helpers import get_data_path +from moldesign.interfaces.openbabel import force_remote as openbabel_missing + molecule_standards = {} @@ -23,7 +25,7 @@ def fixture_wrapper(func): ###################################### # Tests around PDB ID 3AID -@typedfixture('molecule', scope='session') +@typedfixture('molecule') def pdb3aid(): mol = mdt.read(get_data_path('3aid.pdb')) return mol @@ -60,14 +62,19 @@ def random_atoms_from_3aid(pdb3aid): return atoms -@pytest.fixture(scope='function') -def small_molecule(): +@pytest.fixture(scope='session') +def create_small_molecule(): mol = mdt.from_smiles('CNCOS(=O)C') mol.positions += 0.001*np.random.random(mol.positions.shape)*u.angstrom # move out of minimum return mol @pytest.fixture +def small_molecule(create_small_molecule): + return create_small_molecule.copy() + + +@pytest.fixture() def benzene(): return mdt.from_smiles('c1ccccc1') @@ -88,12 +95,12 @@ def ethylene(): return mdt.from_smiles('C=C') -@pytest.fixture +@pytest.fixture(scope='session') def pdb1yu8(): return mdt.read(get_data_path('1yu8.pdb')) -@pytest.fixture(scope='function') +@pytest.fixture() def mol_from_xyz(): return mdt.read("""43 c1.pdb @@ -143,7 +150,7 @@ def mol_from_xyz(): """, format='xyz') -@pytest.fixture(scope='function') +@pytest.fixture() def mol_from_sdf(): return mdt.read(""" OpenBabel02271712493D @@ -175,10 +182,75 @@ def mol_from_sdf(): """, format='sdf') -###################################### -# Tests around a piece of DNA -@typedfixture('molecule', scope='session') +@typedfixture('molecule') def nucleic(): # ACTG.pdb contains a molecule generated using mdt.build_dna('ACTG') mol = mdt.read(get_data_path('ACTG.pdb')) return mol + + +######################################################################################## +# Molecules with forcefields assigned - these use a session-scoped constructor w/ a copy factory + +@pytest.fixture(scope='session') +def create_parameterize_zeros(create_small_molecule): + return _param_small_mol(create_small_molecule.copy(), 'zero') + + +@typedfixture('hasmodel') +def parameterize_zeros(create_parameterize_zeros): + return create_parameterize_zeros.copy() + + +@pytest.fixture(scope='session') +def create_parameterize_am1bcc(create_small_molecule): + """ We don't use this fixture directly, rather use another fixture that copies these results + so that we don't have to repeatedly call tleap/antechamber + """ + return _param_small_mol(create_small_molecule.copy(), 'am1-bcc') + + +@typedfixture('hasmodel') +def parameterize_am1bcc(create_parameterize_am1bcc): + return create_parameterize_am1bcc.copy() + + +@pytest.fixture(scope='session') +def create_gaff_model_gasteiger(create_small_molecule): + """ We don't use this fixture directly, rather use another fixture that copies these results + so that we don't have to repeatedly call tleap/antechamber + """ + mol = create_small_molecule.copy() + mol.set_energy_model(mdt.models.GaffSmallMolecule, partial_charges='gasteiger') + mol.energy_model.prep() + return mol + + +@typedfixture('hasmodel') +def gaff_model_gasteiger(create_gaff_model_gasteiger): + return create_gaff_model_gasteiger.copy() + + +def _param_small_mol(create_small_molecule, chargemodel): + mol = create_small_molecule.copy() + params = mdt.create_ff_parameters(mol, charges=chargemodel, baseff='gaff2') + params.assign(mol) + mol.set_energy_model(mdt.models.ForceField) + return mol + + +@pytest.fixture(scope='session') +def create_protein_default_amber_forcefield(pdb1yu8): + """ We don't use this fixture directly, rather use another fixture that copies these results + so that we don't have to repeatedly call tleap/antechamber + """ + mol = pdb1yu8 + ff = mdt.forcefields.DefaultAmber() + newmol = ff.create_prepped_molecule(mol) + newmol.set_energy_model(mdt.models.ForceField) + return newmol + + +@typedfixture('hasmodel') +def protein_default_amber_forcefield(create_protein_default_amber_forcefield): + return create_protein_default_amber_forcefield.copy() diff --git a/moldesign/_tests/test_alignments.py b/moldesign/_tests/test_alignments.py new file mode 100644 index 0000000..8fd072a --- /dev/null +++ b/moldesign/_tests/test_alignments.py @@ -0,0 +1,148 @@ +import random + +import numpy as np +import pytest + +import moldesign as mdt +from moldesign import geom +from moldesign.mathutils import normalized +from moldesign import units as u + +from .molecule_fixtures import * +from .helpers import assert_almost_equal + + +__PYTEST_MARK__ = 'internal' # mark all tests in this module with this label (see ./conftest.py) + + +def test_bond_alignment_on_axis(benzene): + mol = benzene.copy() + directions = ['x', 'y', 'z', + [1,2,3.0], + [0,1,0], + [0.1, 0.1, 0.1] * u.angstrom] + + for i, dir in enumerate(directions): + bond = mdt.Bond(*random.sample(mol.atoms, 2)) + center = (i % 2) == 0.0 + bond.align(dir, centered=center) + + if center: + np.testing.assert_allclose(bond.midpoint, np.zeros(3), + atol=1.e-12) + np.testing.assert_allclose(bond.a1.position.defunits_value(), + -bond.a2.position.defunits_value(), + atol=1e-10) + if isinstance(dir, str): + if dir == 'x': + d = np.array([1.0, 0, 0]) + elif dir == 'y': + d = np.array([0.0, 1.0, 0.0]) + elif dir == 'z': + d = np.array([0.0, 0.0, 1.0]) + else: + raise WtfError() + else: + d = normalized(u.array(dir)) + + newvec = (bond.a2.position - bond.a1.position).normalized() + assert abs(1.0 - d.dot(newvec)) < 1e-10 + + +def test_align_two_bonds(benzene, h2): + h2 = h2.copy() + alignbond = list(h2.bonds)[0] + one_was_different = False + + for targetbond in benzene.bonds: + + # sanity checks before we start: + assert not np.allclose(alignbond.midpoint.defunits_value(), + targetbond.midpoint.defunits_value()) + vec1, vec2 = (normalized(b.a2.position - b.a1.position) + for b in (alignbond, targetbond)) + one_was_different = (one_was_different or vec1.dot(vec2) < 0.8) + + alignbond.align(targetbond) + + np.testing.assert_allclose(alignbond.midpoint, targetbond.midpoint) + vec1, vec2 = (normalized(b.a2.position - b.a1.position) + for b in (alignbond, targetbond)) + assert (1.0 - vec1.dot(vec2)) < 1e-8 + + +@pytest.mark.parametrize('fixturename', 'ligand3aid pdb3aid benzene small_molecule pdb1yu8'.split()) +def test_pmi_is_orthonormal(request, fixturename): + # test a bunch of molecules + mol = request.getfixturevalue(fixturename).copy() + pmi = geom.alignment.PrincipalMomentsOfInertia(mol) + for ivec in range(3): + assert abs(1.0 - mdt.mathutils.norm(pmi.evecs[ivec])) < 1e-12 + for jvec in range(ivec+1, 3): + assert abs(pmi.evecs[ivec].dot(pmi.evecs[jvec])) < 1e-12 + + +@pytest.mark.parametrize('fixturename', 'ligand3aid pdb3aid benzene small_molecule pdb1yu8'.split()) +def test_pmi_translational_rotational_invariance(request, fixturename): + # currently only test the eigenvalues + mol = request.getfixturevalue(fixturename).copy() + pmi = geom.alignment.PrincipalMomentsOfInertia(mol) + + _randomize_orientation(mol) + pmi2 = geom.alignment.PrincipalMomentsOfInertia(mol) + assert_almost_equal(pmi.moments, pmi2.moments) + + +def _randomize_orientation(mol): + translation = 10.0*(np.random.rand(3)-0.5)*u.angstrom + mol.translate(translation) + + axis = [random.uniform(-1.0, 1.0), + random.uniform(-1.0, 1.0), + random.uniform(0.4, 1.0)] # make sure to rotate off of x-axis + mol.rotate(axis=axis, angle=random.randrange(15.0, 170.0) * u.degrees) + + +@pytest.mark.screening +def test_pmi_reorientation_on_linear_molecule(): + # note that this will fail if the generated polymer is not perfectly linear + mol = mdt.from_smiles('C#CC#CC#C') + original_distmat = mol.calc_distance_array().defunits_value() + + for i in range(5): + _randomize_orientation(mol) + + # calculate PMI and reorient + pmi = geom.alignment.PrincipalMomentsOfInertia(mol) + pmi.reorient(mol) + + # Check that everything lies along the z-axis + np.testing.assert_allclose(mol.positions[:,:2], 0.0, atol=1e-12) + + # Check that distance matrix was unchanged under the transformation + newdistmat = mol.calc_distance_array() + np.testing.assert_allclose(newdistmat.defunits_value(), + original_distmat) + + +def test_pmi_reorientation_on_benzene(benzene): + # note that this will fail if the generated polymer is not perfectly linear + mol = benzene.copy() + original_distmat = mol.calc_distance_array().defunits_value() + + for i in range(5): + _randomize_orientation(mol) + + # calculate PMI and reorient + pmi = geom.alignment.PrincipalMomentsOfInertia(mol) + pmi.reorient(mol) + + # Check that molecule is _roughly_ in x-y plane + np.testing.assert_allclose(mol.positions[:,0].value_in(u.angstrom), 0.0, + atol=0.1) + + # Check that distance matrix was unchanged under the transformation + newdistmat = mol.calc_distance_array() + np.testing.assert_allclose(newdistmat.defunits_value(), + original_distmat) + diff --git a/moldesign/_tests/test_ambertools_xface.py b/moldesign/_tests/test_ambertools_xface.py index a5f0d91..3c5cc56 100644 --- a/moldesign/_tests/test_ambertools_xface.py +++ b/moldesign/_tests/test_ambertools_xface.py @@ -4,33 +4,11 @@ from . import helpers from .molecule_fixtures import * -registered_types = {} - -def typedfixture(*types, **kwargs): - """This is a decorator that lets us associate fixtures with one or more arbitrary types. - We'll later use this type to determine what tests to run on the result""" - - def fixture_wrapper(func): - for t in types: - registered_types.setdefault(t, []).append(func.__name__) - return pytest.fixture(**kwargs)(func) - - return fixture_wrapper - - -# TODO: tests for parameterization error detection - - -@pytest.fixture(scope='function') -def mol_from_pdb(): - mol = mdt.from_pdb('3aid') - return mdt.Molecule(mol.chains['A'].residues['ARQ401']) - - -@pytest.fixture(scope='function') -def mol_from_smiles(): - return mdt.from_smiles('CC') +@pytest.mark.parametrize('fixturename', molecule_standards['hasmodel']) +def test_model_assigned(fixturename, request): + mol = request.getfixturevalue(fixturename) + assert mol.ff is not None @pytest.mark.parametrize('objkey', @@ -43,6 +21,7 @@ def test_parameterization_from_formats(objkey, request): _test_succesful_parameterization(mol) +@pytest.mark.screening def test_parameterize_multiple_identical_small_molecules(): m1 = mdt.from_smiles('O') params = mdt.create_ff_parameters(m1, charges='am1-bcc') @@ -59,8 +38,8 @@ def test_parameterize_multiple_identical_small_molecules(): @pytest.mark.parametrize('chargemodel', 'esp gasteiger zero am1-bcc'.split()) -def test_charge_models(mol_from_smiles, chargemodel): - mol = mol_from_smiles +def test_charge_models(ethylene, chargemodel): + mol = ethylene if chargemodel == 'esp': pytest.xfail("ESP not yet implemented") assert not mol.ff @@ -77,11 +56,8 @@ def _test_succesful_parameterization(mol): assert 'forces' in mol.properties -def test_1yu8_default_amber_fix_and_assignment(pdb1yu8): - mol = pdb1yu8 - ff = mdt.forcefields.DefaultAmber() - newmol = ff.create_prepped_molecule(mol) - _test_succesful_parameterization(newmol) +def test_1yu8_default_amber_fix_and_assignment(protein_default_amber_forcefield): + _test_succesful_parameterization(protein_default_amber_forcefield) def test_ff_assignment_doesnt_change_topology(pdb3aid): @@ -115,43 +91,3 @@ def test_ff_assignment_doesnt_change_topology(pdb3aid): assert newr.chain.index == oldr.chain.index for atom in oldr: assert atom.name in newr - - - -@typedfixture('hasmodel') -def parameterize_zeros(small_molecule): - return _param_small_mol(small_molecule, 'zero') - - -@typedfixture('hasmodel') -def parameterize_am1bcc(small_molecule): - return _param_small_mol(small_molecule, 'am1-bcc') - - -@typedfixture('hasmodel') -def gaff_model_gasteiger(small_molecule): - small_molecule.set_energy_model(mdt.models.GaffSmallMolecule, partial_charges='gasteiger') - small_molecule.energy_model.prep() - return small_molecule - - -def _param_small_mol(small_molecule, chargemodel): - params = mdt.create_ff_parameters(small_molecule, charges=chargemodel, baseff='gaff2') - params.assign(small_molecule) - small_molecule.set_energy_model(mdt.models.ForceField) - return small_molecule - - -@typedfixture('hasmodel') -def protein_default_amber_forcefield(pdb1yu8): - mol = pdb1yu8 - ff = mdt.forcefields.DefaultAmber() - newmol = ff.create_prepped_molecule(mol) - newmol.set_energy_model(mdt.models.ForceField) - return newmol - - -@pytest.mark.parametrize('fixturename', registered_types['hasmodel']) -def test_model_assigned(fixturename, request): - mol = request.getfixturevalue(fixturename) - assert mol.ff is not None diff --git a/moldesign/_tests/test_atoms_and_bonds.py b/moldesign/_tests/test_atom_bond_computed_properties.py similarity index 77% rename from moldesign/_tests/test_atoms_and_bonds.py rename to moldesign/_tests/test_atom_bond_computed_properties.py index 4f2cd93..db538cb 100644 --- a/moldesign/_tests/test_atoms_and_bonds.py +++ b/moldesign/_tests/test_atom_bond_computed_properties.py @@ -4,8 +4,8 @@ from moldesign import units as u from .test_ambertools_xface import protein_default_amber_forcefield, pdb1yu8 -from .molecule_fixtures import h2 -from .test_pyscf_xface import h2_rhfwfn +from .molecule_fixtures import * +from .test_qm_xfaces import h2_rhfwfn def test_forcefield_atom_term_access(protein_default_amber_forcefield): @@ -15,13 +15,22 @@ def test_forcefield_atom_term_access(protein_default_amber_forcefield): assert atom.ff.ljsigma.dimensionality == u.angstrom.dimensionality assert atom.ff.partial_charge.dimensionality == u.q_e.dimensionality + assert atom.ff.pmdobj.idx == atom.index + assert atom.ff.pmdobj.element == atom.atnum + +@pytest.mark.screening def test_forcefield_bond_term_access(protein_default_amber_forcefield): mol = protein_default_amber_forcefield for bond in mol.bonds: assert bond.ff.equilibrium_length.dimensionality == u.angstrom.dimensionality assert bond.ff.force_constant.dimensionality == (u.kcalpermol/u.angstrom).dimensionality + pmdobj = bond.ff.pmdobj + pmdatoms = sorted((pmdobj.atom1, pmdobj.atom2), key=lambda x:x.idx) + assert (pmdatoms[0].idx, pmdatoms[1].idx) == (bond.a1.index, bond.a2.index) + assert (pmdatoms[0].element, pmdatoms[1].element) == (bond.a1.atnum, bond.a2.atnum) + def test_atom_basis_function_returns_none_if_no_wfn(h2): for atom in h2.atoms: @@ -45,6 +54,7 @@ def test_basis_function_atom_access(h2_rhfwfn): assert len(atom.basis_functions[0].primitives) == 3 +@pytest.mark.screening def test_atom_property_access_to_mulliken_charges(h2_rhfwfn): mol = h2_rhfwfn for atom in mol.atoms: diff --git a/moldesign/_tests/test_atom_containers.py b/moldesign/_tests/test_atom_containers.py index c1131da..a326499 100644 --- a/moldesign/_tests/test_atom_containers.py +++ b/moldesign/_tests/test_atom_containers.py @@ -11,6 +11,7 @@ from . import helpers from .molecule_fixtures import pdb3aid, ethylene_waterbox_2na_2cl +__PYTEST_MARK__ = 'internal' # mark all tests in this module with this label (see ./conftest.py) registered_types = {} @@ -177,6 +178,7 @@ def test_atoms_within(fixturename, request): @pytest.mark.parametrize('fixturename', ['atom', 'residue', 'atomlist']) +@pytest.mark.screening def test_residues_within(fixturename, request): obj = request.getfixturevalue(fixturename) @@ -223,6 +225,7 @@ def test_setlike_atomlist_methods(protein): assert (l1 + l2).unique() == protein.atoms[:15] +@pytest.mark.screening def test_get_atoms(protein): protein_atoms = set(protein.get_atoms('protein')) water_atoms = set(protein.get_atoms('water')) diff --git a/moldesign/_tests/test_biopython_xface.py b/moldesign/_tests/test_biopython_xface.py index 4734386..829d4b3 100644 --- a/moldesign/_tests/test_biopython_xface.py +++ b/moldesign/_tests/test_biopython_xface.py @@ -14,6 +14,7 @@ def biopy_3aid(): return structure +@pytest.mark.screening def test_biopy_to_mdt(biopy_3aid, pdb3aid): mol = mdt.interfaces.biopython_to_mol(biopy_3aid) assert mol.num_atoms == pdb3aid.num_atoms diff --git a/moldesign/_tests/test_cli.py b/moldesign/_tests/test_cli.py index 6c38dcb..ad20c0f 100644 --- a/moldesign/_tests/test_cli.py +++ b/moldesign/_tests/test_cli.py @@ -5,6 +5,9 @@ from moldesign.external import pathlib +__PYTEST_MARK__ = 'io' + + @pytest.fixture def example_path(tmpdir): path = pathlib.Path(str(tmpdir)) @@ -14,6 +17,7 @@ def example_path(tmpdir): return path +@pytest.mark.screening def test_exampled_copied(example_path): path = example_path assert (path / 'moldesign-examples').is_dir() diff --git a/moldesign/_tests/test_constraints.py b/moldesign/_tests/test_constraints.py index ba85dca..032aa5a 100644 --- a/moldesign/_tests/test_constraints.py +++ b/moldesign/_tests/test_constraints.py @@ -6,7 +6,7 @@ import moldesign as mdt from moldesign import units as u - +from .molecule_fixtures import * from . import helpers registered_types = {} @@ -106,6 +106,7 @@ def angle_constraint_unsatisfied(atom_coordinate_constraint_satisfied): return mol, c +@pytest.mark.screening def test_distance_constraint(distance_constraint_satisfied): mol, c = distance_constraint_satisfied @@ -132,7 +133,7 @@ def test_constraint_gradient(objkey, request): atol=5.0*helpers.DEFSTEP.defunits_value()) - +@pytest.mark.screening def test_dihedral_constraint_errors(four_particle_45_twist): mol = four_particle_45_twist constraint = mol.constrain_dihedral(*mol.atoms) @@ -150,7 +151,6 @@ def test_dihedral_constraint_errors(four_particle_45_twist): assert not constraint.satisfied() - def test_dihedral_constraint_errors_at_0(four_particle_45_twist): mol = four_particle_45_twist mol.atoms[3].position = [0.1, 0.0, 0.5] * u.angstrom @@ -163,3 +163,29 @@ def test_dihedral_constraint_errors_at_0(four_particle_45_twist): constraint.value = angle np.testing.assert_allclose(constraint.error().value_in(u.degrees), -angle.magnitude) + +def test_cannot_add_duplicate_constraints(parameterize_zeros): + mol = parameterize_zeros + mol.constrain_distance(*mol.atoms[:2]) + mol.constrain_angle(*mol.atoms[:3]) + mol.constrain_dihedral(*mol.atoms[:4]) + mol.constrain_atom(mol.atoms[0]) + mol.constrain_hbonds() + + # Failure on adding duplicates + with pytest.raises(KeyError): + mol.constrain_distance(*mol.atoms[:2]) + with pytest.raises(KeyError): + mol.constrain_angle(*mol.atoms[:3]) + with pytest.raises(KeyError): + mol.constrain_dihedral(*mol.atoms[:4]) + with pytest.raises(KeyError): + mol.constrain_atom(mol.atoms[0]) + with pytest.raises(KeyError): + mol.constrain_hbonds() + + # These should be ok + mol.constrain_distance(*mol.atoms[1:3]) + mol.constrain_angle(*mol.atoms[1:4]) + mol.constrain_dihedral(*mol.atoms[1:5]) + mol.constrain_atom(mol.atoms[1]) diff --git a/moldesign/_tests/test_copies.py b/moldesign/_tests/test_copies.py index 8b4b085..a71ef1d 100644 --- a/moldesign/_tests/test_copies.py +++ b/moldesign/_tests/test_copies.py @@ -9,6 +9,9 @@ from .object_fixtures import * +__PYTEST_MARK__ = 'internal' # mark all tests in this module with this label (see ./conftest.py) + + def test_carbon_copy(carbon_copy, carbon_atom): atom = carbon_copy assert atom.symbol == carbon_atom.symbol @@ -16,6 +19,7 @@ def test_carbon_copy(carbon_copy, carbon_atom): assert atom.bond_graph == {} +@pytest.mark.screening def test_copy_breaks_link(h2): h2copy = mdt.Molecule(h2) h2.atoms[0].y = 4.0 * u.bohr @@ -31,7 +35,7 @@ def test_copy_breaks_link(h2): assert h2.atoms[1].px == 0.0 * u.default.momentum -def test_h2_harmonic_copy_loses_simulation(h2_harmonic_copy, h2_harmonic): +def test_h2_harmonic_copy(h2_harmonic_copy, h2_harmonic): mol = h2_harmonic_copy assert mol.energy_model is mol.integrator is None for name in 'num_atoms num_residues positions momenta'.split(): @@ -44,6 +48,7 @@ def test_h2_harmonic_copy_loses_simulation(h2_harmonic_copy, h2_harmonic): assert mol.atoms[1].bond_graph[mol.atoms[0]] == 1 +@pytest.mark.screening def test_copying_doesnt_corrupt_original_h2_harmonic(h2_harmonic): mol = h2_harmonic integ = mol.integrator @@ -161,3 +166,45 @@ def test_chain_rename(pdb3aid): assert newmol.chains[0].name == 'A' assert newmol.chains[1].name == 'B' + +@pytest.mark.parametrize('molkey', ["create_parameterize_am1bcc", + "create_protein_default_amber_forcefield"]) +def test_forcefield_copied_with_molecule(molkey, request): + mol = request.getfixturevalue(molkey) + m2 = mol.copy() + + assert isinstance(m2.ff, mol.ff.__class__) + assert isinstance(m2.ff.parmed_obj, mol.ff.parmed_obj.__class__) + assert m2.ff.parmed_obj is not mol.ff.parmed_obj + + p1 = m2.ff.parmed_obj + p2 = m2.ff.parmed_obj + assert m2.ff.parmed_obj.LJ_depth == mol.ff.parmed_obj.LJ_depth + assert p1.bond_types == p2.bond_types + assert p1.angle_types == p2.angle_types + assert p1.dihedral_types == p2.dihedral_types + assert p1.improper_types == p2.improper_types + + +def test_constraints_copied_with_molecule(parameterize_zeros): + mol = parameterize_zeros + + mol.constrain_distance(*mol.atoms[:2]) + mol.constrain_angle(*mol.atoms[:3]) + mol.constrain_dihedral(*mol.atoms[:4]) + mol.constrain_atom(mol.atoms[0]) + mol.constrain_hbonds() + + mcpy = mol.copy() + assert isinstance(mcpy.constraints, mol.constraints.__class__) + assert mcpy.constraints[0].desc == 'distance' + assert mcpy.constraints[1].desc == 'angle' + assert mcpy.constraints[2].desc == 'dihedral' + assert mcpy.constraints[3].desc == 'position' + assert mcpy.constraints[4].desc == 'hbonds' + + for constraint in mcpy.constraints: + assert constraint.mol is mcpy + if constraint.desc != 'hbonds': + for atom in constraint.atoms: + assert atom.molecule is mcpy diff --git a/moldesign/_tests/test_dna_primary_structure.py b/moldesign/_tests/test_dna_primary_structure.py index beaabab..d1a4245 100644 --- a/moldesign/_tests/test_dna_primary_structure.py +++ b/moldesign/_tests/test_dna_primary_structure.py @@ -7,6 +7,9 @@ from moldesign import units as u +__PYTEST_MARK__ = 'internal' # mark all tests in this module with this label (see ./conftest.py) + + fixture_types = {} @@ -34,6 +37,7 @@ def test_dna_chain_properties(fixture, request): @pytest.mark.parametrize('fixture', fixture_types['dna']) +@pytest.mark.screening def test_dna_residue_iteration(fixture, request): mol = request.getfixturevalue(fixture) diff --git a/moldesign/_tests/test_gaussian_math.py b/moldesign/_tests/test_gaussian_math.py index 1dafc60..77bb9e5 100644 --- a/moldesign/_tests/test_gaussian_math.py +++ b/moldesign/_tests/test_gaussian_math.py @@ -58,6 +58,7 @@ def cart_10d_gaussian(): @pytest.mark.parametrize('objkey', registered_types['gaussian']) +@pytest.mark.screening def test_gaussian_integral_and_dimensionality(objkey, request): g = request.getfuncargvalue(objkey) assert g.ndims == len(g.center) @@ -85,6 +86,7 @@ def test_gaussian_function_values(objkey, request): @pytest.mark.parametrize('objkey', registered_types['gaussian'] + registered_types['cartesiangaussian']) +@pytest.mark.screening def test_vectorized_gaussian_function_evaluations(objkey, request): g = request.getfuncargvalue(objkey) diff --git a/moldesign/_tests/test_geometry.py b/moldesign/_tests/test_geometry.py index 714cfca..9c7bf7c 100644 --- a/moldesign/_tests/test_geometry.py +++ b/moldesign/_tests/test_geometry.py @@ -14,6 +14,10 @@ registered_types = {} + +__PYTEST_MARK__ = 'internal' # mark all tests in this module with this label (see ./conftest.py) + + # TODO: automated method testing based on its metadata - i.e. test to make sure parameters are # honored, test that it calcultes what it says it does, test that properties have the right # units and array shapes, etc. @@ -41,6 +45,7 @@ def _apply_random_offsets(mol, idim): mol.positions[:, idim] += (random.random()-0.5)*100.0*u.angstrom + @typedfixture('atomcontainer', scope='function') def three_particle_right_angle(): mol = _make_mol_with_n_hydrogens(3) @@ -69,7 +74,6 @@ def four_particle_45_twist(): return mol - ######################## # Dihedrals # ######################## @@ -98,6 +102,7 @@ def test_set_dihedral(four_particle_45_twist): decimal=8) +@pytest.mark.screening def test_set_dihedral_sign_convention(four_particle_45_twist): mol = four_particle_45_twist mdt.set_dihedral(mol.atoms[0], mol.atoms[1], mol.atoms[2], mol.atoms[3], -23.0 * u.degrees) @@ -135,6 +140,7 @@ def test_dihedral_sign_convention(four_particle_45_twist): # TODO: test behavior at discontinuities (180, -180) +@pytest.mark.screening def test_dihedral_gradient(four_particle_45_twist): mol = four_particle_45_twist @@ -169,6 +175,7 @@ def test_angle_measure(three_particle_right_angle): decimal=8) +@pytest.mark.screening def test_angle_gradient(three_particle_right_angle): mol = three_particle_right_angle diff --git a/moldesign/_tests/test_imports.py b/moldesign/_tests/test_imports.py index 77082d8..636c58b 100644 --- a/moldesign/_tests/test_imports.py +++ b/moldesign/_tests/test_imports.py @@ -2,6 +2,9 @@ import sys +__PYTEST_MARK__ = 'internal' # mark all tests in this module with this label (see ./conftest.py) + + @pytest.mark.tryfirst def test_lazy_imports(): import moldesign diff --git a/moldesign/_tests/test_io.py b/moldesign/_tests/test_io.py index 2279eb0..e463aba 100644 --- a/moldesign/_tests/test_io.py +++ b/moldesign/_tests/test_io.py @@ -19,10 +19,13 @@ mdt.compute.config.engine_type = 'docker' from moldesign import units as u -from .helpers import get_data_path, INTERNET_ON, native_str_buffer +from .helpers import get_data_path, native_str_buffer, requires_internet_connection from .object_fixtures import h2_trajectory, h2_harmonic, h2 +__PYTEST_MARK__ = 'io' + + @pytest.fixture def bipyridine_sdf(): return mdt.read(get_data_path('bipyridine.sdf')) @@ -42,6 +45,7 @@ def bipyridine_mol2(): def bipyridine_iupac(): return mdt.from_name('bipyridine') + @pytest.fixture def bipyridine_inchi(): return mdt.from_inchi('InChI=1S/C10H8N2/c1-3-7-11-9(5-1)10-6-2-4-8-12-10/h1-8H') @@ -59,6 +63,7 @@ def bipyridine_smiles(): @pytest.mark.parametrize('key', 'iupac smiles inchi xyz sdf'.split()) +@pytest.mark.screening def test_auto_unique_atom_names(key, request): mol = request.getfixturevalue('bipyridine_'+key) @@ -72,7 +77,27 @@ def test_atom_names_preserved_from_input_file_mol2(bipyridine_mol2): assert atom.name == atom.symbol + str(atom.index) +@pytest.fixture +def propane_pdb(): + return mdt.read(get_data_path('propane.pdb')) + + +def test_pdb_with_missing_chains(propane_pdb): + """ In response to an observed bug where various conversions would fail with a PDB file + that's missing chain data + """ + mol = propane_pdb + + if not mdt.interfaces.openbabel.force_remote: + pbmol = mdt.interfaces.mol_to_pybel(mol) + assert len(pbmol.atoms) == mol.num_atoms + + pmedmol = mdt.interfaces.mol_to_parmed(mol) + assert len(pmedmol.atoms) == mol.num_atoms + + @pytest.mark.parametrize('key', 'mol2 xyz sdf iupac smiles inchi'.split()) +@pytest.mark.screening def test_read_bipyridine_from_format(key, request): mol = request.getfixturevalue('bipyridine_'+key) @@ -152,7 +177,7 @@ def mmcif_1kbu(): return mdt.read(get_data_path('1KBU.cif.bz2')) -@pytest.mark.skipif(not INTERNET_ON, reason='This test requires an internet connection') +@requires_internet_connection def test_from_pdb_pdb_format(): mol = mdt.from_pdb('3aid') assert mol.metadata.pdbid == '3aid' @@ -160,7 +185,7 @@ def test_from_pdb_pdb_format(): assert mol.num_atoms == 1912 -@pytest.mark.skipif(not INTERNET_ON, reason='This test requires an internet connection') +@requires_internet_connection def test_from_pdb_mmcif_format(): mol = mdt.from_pdb('3aid', usecif=True) assert mol.metadata.pdbid == '3aid' @@ -169,6 +194,15 @@ def test_from_pdb_mmcif_format(): assert mol.num_atoms == 1912 +@requires_internet_connection +@pytest.mark.skip("Takes over 10 minutes right now ...") +def test_mmcif_fallback_if_no_pdb_file(): + mol = mdt.from_pdb('4V5X') + assert mol.metadata.pdbid.lower() == '4v5x' + assert mol.metadata.sourceformat == 'mmcif' + assert mol.metadata.sourceurl.split('.')[-1] == 'cif' + + @pytest.mark.parametrize('key', 'pdb mmcif sequence'.split()) def test_read_dna_from_format(key, request): if key == 'mmcif': @@ -203,6 +237,7 @@ def test_read_from_buffer(): @pytest.mark.parametrize('key', 'mmcif pdb'.split()) +@pytest.mark.screening def test_1kbu_assembly_data(key, request): mol = request.getfixturevalue('%s_1kbu' % key) diff --git a/moldesign/_tests/test_mathutils.py b/moldesign/_tests/test_mathutils.py new file mode 100644 index 0000000..de63195 --- /dev/null +++ b/moldesign/_tests/test_mathutils.py @@ -0,0 +1,110 @@ +import pytest + +import numpy as np + +from moldesign import mathutils +from moldesign import units as u +from . import helpers + + +__PYTEST_MARK__ = 'internal' + +CONSTRUCTORS = [] +IDS = [] + + +# Couldn't figure out a way to do this with fixtures ... +def constructor(f): + def wrapper(): + arr, norm = f() + return arr * 3.0 * u.nm, norm * 3.0 * u.nm + wrapper.__name__ = f.__name__ + '_quantity' + CONSTRUCTORS.append(f) + IDS.append(f.__name__) + CONSTRUCTORS.append(wrapper) + IDS.append(wrapper.__name__) + return wrapper + + +@constructor +def zeros(): + return np.zeros(3), 0.0 + + +@constructor +def ones(): + return np.ones(3), np.sqrt(3) + + +@constructor +def y_unit_vector(): + v = np.zeros(3) + v[1] = 1.0 + return v, 1.0 + + +@constructor +def list_of_vectors(): + return np.array(TESTARRAY), np.array(TESTARRAY_NORMS) + + +@pytest.mark.parametrize('setupfn', CONSTRUCTORS, ids=IDS) +def test_norm(setupfn): + arr, expected_norm = setupfn() + n = mathutils.norm(arr) + helpers.assert_almost_equal(n, expected_norm) + + +@pytest.mark.parametrize('setupfn', CONSTRUCTORS, ids=IDS) +def test_normalized(setupfn): + arr, expected_norm = setupfn() + vectorized = len(arr.shape) > 1 + normed = mathutils.normalized(arr) + if not vectorized: + arr, expected_norm, normed = [arr], [expected_norm], [normed] + for v, n, unitvec in zip(arr, expected_norm, normed): + if n != 0: + helpers.assert_almost_equal(unitvec, v/n) + + +@pytest.mark.parametrize('setupfn', CONSTRUCTORS, ids=IDS) +@pytest.mark.screening +def test_perpendicular(setupfn): + arr, expected_norm = setupfn() + vectorized = len(arr.shape) > 1 + + normvecs = mathutils.normalized(arr) + perpvecs = mathutils.perpendicular(arr) + assert isinstance(perpvecs, np.ndarray) + assert not hasattr(perpvecs, 'units') + + # test that vectors are indeed perpendicular + if vectorized: + assert (np.abs((normvecs * perpvecs).sum(axis=1)) < 1e-12).all() + else: + assert abs(perpvecs.dot(normvecs)) < 1e-12 + + # test that they are unit vectors (or 0 if the input vector is zero) + if not vectorized: + arr = [arr] + perpvecs = [perpvecs] + expected_norm = [expected_norm] + + for i, (vec, perpvec) in enumerate(zip(arr, perpvecs)): + if expected_norm[i] == 0.0: + assert mathutils.norm(perpvec) < 1e-12 + else: + assert np.abs(1.0 - mathutils.norm(perpvec)) < 1e-12 + + +TESTARRAY = [[1.0, 0.0, 0.0], + [0.0, 1.0, 0.0], + [0.0, 0.0, 1.0], + [0.0, 0.0, 0.0], + [1.0, -1.0, 1.0], + [2.0, 2.0, 2.0], + [0.57735027, 0.57735027, -0.57735027], + [0.70710678, 0.70710678, 0.], + [0.0, -1.0, 1.0]] + +TESTARRAY_NORMS = [1.0, 1.0, 1.0, 0.0, np.sqrt(3), np.sqrt(12.0), 1.0, 1.0, np.sqrt(2)] diff --git a/moldesign/_tests/test_minimizers.py b/moldesign/_tests/test_minimizers.py index 7f49742..2977c44 100644 --- a/moldesign/_tests/test_minimizers.py +++ b/moldesign/_tests/test_minimizers.py @@ -69,7 +69,8 @@ def test_extreme_forces_with_smart_minimizer(scrambled): @pytest.mark.skipif(mdt.models.OpenBabelPotential._CALLS_MDT_IN_DOCKER, - reason='Redundant with regular test') + reason='Redundant with regular test in this environment') +@pytest.mark.screening def test_remote_with_smart_minimizer(scrambled): mol, e0, p0 = scrambled @@ -80,7 +81,7 @@ def test_remote_with_smart_minimizer(scrambled): @pytest.mark.skipif(mdt.models.OpenBabelPotential._CALLS_MDT_IN_DOCKER, - reason='Redundant with regular test') + reason='Redundant with regular test in this environment') def test_remote_with_smart_minimizer_async(scrambled): mol, e0, p0 = scrambled job = mdt.min.minimize(mol, nsteps=500, remote=True, wait=False) @@ -94,7 +95,7 @@ def test_remote_with_smart_minimizer_async(scrambled): @pytest.mark.skipif(mdt.models.OpenBabelPotential._CALLS_MDT_IN_DOCKER, - reason='Redundant with regular test') + reason='Redundant with regular test in this environment') def test_remote_minimization_automatic_if_openbabel_not_installed(scrambled): mol, e0, p0 = scrambled @@ -122,7 +123,7 @@ def test_constrained_distance_minimization(minkey): e0 = mol.calculate_potential_energy() p0 = mol.positions.copy() - constraint = mol.constrain_distance(mol.atoms[0], mol.atoms[1]) + mol.constrain_distance(mol.atoms[0], mol.atoms[1]) if minkey == 'bfgs': # BFGS expected to fail here with pytest.raises(mdt.exceptions.NotSupportedError): @@ -132,11 +133,10 @@ def test_constrained_distance_minimization(minkey): traj = minimizer(mol) assert_something_resembling_minimization_happened(p0, e0, traj, mol) - assert abs(constraint.error()) < 1e-4 * u.angstrom - @pytest.mark.parametrize('minkey',(MINIMIZERS.keys())) +@pytest.mark.screening def test_constrained_dihedral_minimization(minkey): minimizer = MINIMIZERS[minkey] mol = mdt.from_smiles('C=C') diff --git a/moldesign/_tests/test_molecules.py b/moldesign/_tests/test_molecules.py index 3f37e5e..aab2eb0 100644 --- a/moldesign/_tests/test_molecules.py +++ b/moldesign/_tests/test_molecules.py @@ -9,7 +9,10 @@ from .object_fixtures import * from .test_ambertools_xface import protein_default_amber_forcefield -from .test_pyscf_xface import h2_rhfwfn +from .test_qm_xfaces import h2_rhfwfn + + +__PYTEST_MARK__ = 'internal' # mark all tests in this module with this label (see ./conftest.py) def test_h2_protected_atom_arrays(h2): @@ -45,6 +48,15 @@ def test_h2_array_link(h2): assert h2.atoms[1].py == 3.0*u.default.momentum +def test_h2_set_coord_slices(h2): + mol = h2.copy() + mol.positions[:] = np.zeros((2,3)) * u.angstrom + assert (mol.positions == np.zeros((2,3)) * u.angstrom).all() + mol.momenta[0:2,1:3] = np.ones((2,2)) * u.default.momentum + assert (mol.momenta[0:2, 1:3] == np.ones((2,2)) * u.default.momentum).all() + + +@pytest.mark.screening def test_h2_harmonic_oscillator(h2_harmonic): mol = h2_harmonic atoms = h2_harmonic.atoms @@ -92,6 +104,7 @@ def h2_properties_raises_not_calculated_yet(h2_harmonic): h2_harmonic.properties.potential_energy +@pytest.mark.screening def test_h2_calculation_caching(h2_harmonic): h2 = h2_harmonic h2.properties = mdt.MolecularProperties(h2) @@ -116,6 +129,7 @@ def test_h2_traj_energies(h2_trajectory): @pytest.mark.parametrize('molkey', registered_types['molecule']) +@pytest.mark.screening def test_molecule_atom_hierarchy(molkey, request): mol = request.getfixturevalue(molkey) all_residues = set(mol.residues) diff --git a/moldesign/_tests/test_objects.py b/moldesign/_tests/test_objects.py index b48bfa5..be704ba 100644 --- a/moldesign/_tests/test_objects.py +++ b/moldesign/_tests/test_objects.py @@ -1,9 +1,10 @@ -import pytest - from moldesign.utils import Alias from .object_fixtures import * +__PYTEST_MARK__ = 'internal' # mark all tests in this module with this label (see ./conftest.py) + + class ComposedClass(object): delegated = Alias('s.lower') @@ -50,6 +51,7 @@ def test_dotdict_copy(dotdict): assert 'a' in dotdict +@pytest.mark.screening def test_dotdict_removals(dotdict): dd = dotdict.copy() assert dd.pop('_a-a-a', None) is None @@ -106,3 +108,18 @@ def test_dotdict_preserves_ordering(dotdict): assert list(dotdict.keys()) == list(TESTDICT.keys()) assert list(dotdict.values()) == list(TESTDICT.values()) assert list(dotdict.items()) == list(TESTDICT.items()) + + +@pytest.mark.screening +def test_eigenspace_with_ndarray_identity_permutation(): + from moldesign.mathutils import Eigenspace + + evals = np.arange(3) + evecs = np.array([[0,1,0], + [1,0,0], + [0,0,1]], + dtype='float') + espace = Eigenspace(evals, evecs) + + assert (espace.transform([1,0,0]) == [0,1.0, 0.0]).all() + assert (espace.transform(np.identity(3)) == espace.evecs).all() diff --git a/moldesign/_tests/test_openbabel_xface.py b/moldesign/_tests/test_openbabel_xface.py index dca2ad8..ddd9d42 100644 --- a/moldesign/_tests/test_openbabel_xface.py +++ b/moldesign/_tests/test_openbabel_xface.py @@ -2,7 +2,7 @@ import moldesign as mdt -from .molecule_fixtures import small_molecule +from .molecule_fixtures import * registered_types = {} @@ -47,6 +47,7 @@ def openbabel_uff(small_molecule): @pytest.mark.parametrize('fixture', registered_types['hasmodel']) +@pytest.mark.screening def test_ob_energy_models(request, fixture): mol = request.getfixturevalue(fixture) assert mol.energy_model is not None diff --git a/moldesign/_tests/test_openmm_xface.py b/moldesign/_tests/test_openmm_xface.py index 108bffb..a67f76b 100644 --- a/moldesign/_tests/test_openmm_xface.py +++ b/moldesign/_tests/test_openmm_xface.py @@ -1,36 +1,76 @@ import random +from itertools import product import pytest +import numpy as np import moldesign as mdt from moldesign import units as u +from moldesign.interfaces.openmm import force_remote as missing_openmm from . import helpers -from .molecule_fixtures import (pdb1yu8, small_molecule) -from .test_openbabel_xface import registered_types as obtypes -from .test_ambertools_xface import registered_types as ambtypes -from .test_ambertools_xface import (gaff_model_gasteiger, protein_default_amber_forcefield, - parameterize_am1bcc, parameterize_zeros, - protein_default_amber_forcefield) +from .molecule_fixtures import * -registered_types = {} -registered_types.update(obtypes) -registered_types.update(ambtypes) +# TODO: remove constraints from dynamics parameters - they should only live in the constraints array +TESTSYTEMS = ['small_mol', 'protein', 'protein_custom_constraints', 'protein_freeze_hbonds'] +INTEGRATORS = ['verlet', 'langevin'] -def typedfixture(*types, **kwargs): - """This is a decorator that lets us associate fixtures with one or more arbitrary types. - We'll later use this type to determine what tests to run on the result""" - def fixture_wrapper(func): - for t in types: - registered_types.setdefault(t, []).append(func.__name__) - return pytest.fixture(**kwargs)(func) +@pytest.fixture +def protein(protein_default_amber_forcefield): + mol = protein_default_amber_forcefield + mol.energy_model.params.compute_platform = 'cpu' + mol.energy_model.params.num_cpus = 1 + mol.minimize(force_tolerance=0.5*u.eV/u.angstrom) # perform a very partial minimization + return mol - return fixture_wrapper +@pytest.fixture +def small_mol(gaff_model_gasteiger): + mol = gaff_model_gasteiger + mol.energy_model.params.compute_platform = 'cpu' + mol.energy_model.params.num_cpus = 1 + mol.minimize(force_tolerance=0.5*u.eV/u.angstrom) # perform a very partial minimization + return mol -@pytest.mark.parametrize('objkey', registered_types['hasmodel']) + +@pytest.fixture +def protein_custom_constraints(protein): + # constrains distance between first and last c-alpha carbons plus position of c-alpha in PHE58 + mol = protein + mol.constrain_distance(mol.chains['X'].n_terminal['CA'], + mol.chains['X'].c_terminal['CA']) + mol.constrain_atom(mol.chains['X'].residues['PHE58']['CA']) + return mol + + +@pytest.fixture +def protein_freeze_hbonds(protein): + # constrains distance between first and last c-alpha carbons plus position of c-alpha in PHE58 + mol = protein + mol.constrain_hbonds() + return mol + + +INTEGRATOR_PARAMS = dict(timestep=1.0 * u.fs, + constrain_hbonds=False, + constrain_water=False) + + +@pytest.fixture +def langevin(): + return mdt.integrators.OpenMMLangevin(frame_interval=500, + **INTEGRATOR_PARAMS) + + +@pytest.fixture +def verlet(): + return mdt.integrators.OpenMMVerlet(frame_interval=250*u.fs, + **INTEGRATOR_PARAMS) + + +@pytest.mark.parametrize('objkey', TESTSYTEMS) def test_forces_and_energy_were_calculated(objkey, request): mol = request.getfixturevalue(objkey) energy = mol.calculate_potential_energy() @@ -41,7 +81,7 @@ def test_forces_and_energy_were_calculated(objkey, request): @pytest.mark.skipif(mdt.interfaces.openmm.force_remote, reason="Numerical derivatives need to be parallelized, " "otherwise this takes too long") -@pytest.mark.parametrize('objkey', registered_types['hasmodel']) +@pytest.mark.parametrize('objkey', TESTSYTEMS) def test_analytical_vs_numerical_forces(objkey, request): mol = request.getfixturevalue(objkey) @@ -59,34 +99,133 @@ def test_analytical_vs_numerical_forces(objkey, request): assert (anagrad-numgrad).norm()/(3.0*len(atoms)) <= 5.0e-4 * u.eV / u.angstrom -@pytest.mark.parametrize('objkey', registered_types['hasmodel']) +@pytest.mark.parametrize('objkey', TESTSYTEMS) def test_minimization_reduces_energy(objkey, request): mol = request.getfixturevalue(objkey) + mol.positions += 0.01 * u.angstrom * np.random.rand(mol.num_atoms, 3) p0 = mol.positions.copy() e0 = mol.calculate_potential_energy() traj = mol.minimize() + if mol.constraints: + pytest.xfail("This will fail until we replace minimizer with a CustomIntegrator") helpers.assert_something_resembling_minimization_happened(p0, e0, traj, mol) -@pytest.mark.parametrize('objkey', registered_types['hasmodel']) -def test_openmm_langevin_integrator(objkey, request): - mol = request.getfixturevalue(objkey) - mol.set_integrator(mdt.integrators.OpenMMLangevin, temperature=300.0*u.kelvin) - traj = mol.run(10.0 * u.ps) - assert mol.time >= 4.99 * u.ps - # small molecules have a big range - assert 100 * u.kelvin <= traj.kinetic_temperature[-1] <= 500 * u.kelvin +@pytest.mark.parametrize('systemkey,integratorkey', product(TESTSYTEMS, INTEGRATORS)) +def test_openmm_dynamics(systemkey, integratorkey, request): + mol = request.getfixturevalue(systemkey) + mol.set_integrator(request.getfixturevalue(integratorkey)) + mol.integrator.prep() + if not missing_openmm: + assert mol.integrator.sim.system is mol.energy_model.sim.system -@pytest.mark.parametrize('objkey', registered_types['hasmodel']) -def test_openmm_verlet_integrator(objkey, request): - mol = request.getfixturevalue(objkey) - mol.set_integrator(mdt.integrators.OpenMMVerlet, timestep=1.0*u.fs) - mol.minimize() - traj = mol.run(5.0 * u.ps) + initially_satisfied_constraints = all(c.satisfied() for c in mol.constraints) + + p0 = mol.positions.copy() + t0 = mol.time + traj = mol.run(2.0 * u.ps) + + # Basic dynamics and constraint sanity checks: + helpers.assert_something_resembling_dynamics_happened(traj, mol, p0, t0, 2.0*u.ps) + + if 'temperature' in mol.integrator.params: + temp = mol.integrator.params.temperature + if mol.num_atoms > 50: + assert (temp / 2.0 <= traj.kinetic_temperature[-1] <= 500 * u.kelvin) + else: # small molecules have a big range, just a very loose sanity check here + assert mol.kinetic_temperature > temp / 10.0 + + else: # Assume constant energy dynamics (may need to check explicitly in future) + energy = traj.potential_energy+traj.kinetic_energy + + if initially_satisfied_constraints: + compareframe = 0 + else: + compareframe = 1 + assert abs(energy[compareframe]-energy[-1]) <= 0.01*mol.num_atoms*u.kcalpermol + + +def test_cleared_constraints_are_no_longer_applied(protein_custom_constraints, langevin): + mol = protein_custom_constraints + + langevin.frame_interval = 500 + + t0 = mol.time + p0 = mol.positions.copy() + mol.set_integrator(langevin) + traj = mol.run(2.0 * u.ps) + + helpers.assert_something_resembling_dynamics_happened(traj, mol, p0, t0, 2*u.ps) - # very rough energy conservation test - energy = traj.potential_energy + traj.kinetic_energy - assert abs(energy[0] - energy[-1]) <= 0.01 * mol.num_atoms * u.kcalpermol + for constraint in mol.constraints: + assert constraint.satisfied() + + oldconstraints = mol.constraints[:] + + assert len(mol.constraints) > 0 + mol.clear_constraints() + assert len(mol.constraints) == 0 + + t1 = mol.time + p1 = mol.positions.copy() + traj = mol.run(2.0 * u.ps) + + for constraint in oldconstraints: + assert not constraint.satisfied() # it would be very very unlikely, I think + + helpers.assert_something_resembling_dynamics_happened(traj, mol, p1, t1, 2*u.ps) + + +@pytest.mark.parametrize('integkey', INTEGRATORS) +@pytest.mark.screening +def test_unsupported_constraint_types(protein, integkey, request): + integrator = request.getfixturevalue(integkey) + protein.set_integrator(integrator) + + if not missing_openmm: + assert protein.energy_model._prepped + + protein.constrain_dihedral(*protein.atoms[:4]) + + if not missing_openmm: + assert not protein.energy_model._prepped + + protein.calculate(use_cache=False) # this should work, because there's no motion invovled + + with pytest.raises(mdt.exceptions.NotSupportedError): + traj = protein.run(1.0*u.ps) + + t0 = protein.time + p0 = protein.positions.copy() + protein.clear_constraints() + traj = protein.run(1.0*u.ps) # should NOT raise a fuss now + helpers.assert_something_resembling_dynamics_happened(traj, protein, p0, t0, 1.0*u.ps) + + protein.constrain_angle(*protein.atoms[:3]) + with pytest.raises(mdt.exceptions.NotSupportedError): + protein.run(1.0*u.ps) + + +@pytest.mark.parametrize('integkey', INTEGRATORS) +def test_fallback_to_builtin_minimizer_for_arbitrary_constraints(small_mol, integkey, request): + mol = small_mol + mol.positions += 0.01 * u.angstrom * np.random.rand(mol.num_atoms, 3) + + assert len(mol.constraints) == 0 + mol.set_integrator(request.getfixturevalue(integkey)) + + mol.constrain_angle(*mol.atoms[:3]) + assert len(mol.constraints) == 1 + + p0 = mol.positions.copy() + e0 = mol.calculate_potential_energy() + + traj = mol.minimize() + helpers.assert_something_resembling_minimization_happened(p0, e0, traj, mol) +@pytest.mark.skipif(missing_openmm, reason='OpenMM not installed') +def test_list_platforms(): # doesn't do much right now + platforms = mdt.interfaces.openmm.list_openmmplatforms() + print('Found platforms %d: ', (len(platforms), platforms)) diff --git a/moldesign/_tests/test_pdb_processing.py b/moldesign/_tests/test_pdb_processing.py index 13bf5c5..e970e78 100644 --- a/moldesign/_tests/test_pdb_processing.py +++ b/moldesign/_tests/test_pdb_processing.py @@ -64,6 +64,7 @@ def pdb_2jaj_roundtrip(pdb_2jaj): @pytest.mark.parametrize('mol', 'pdb_2jaj pdb_2jaj_roundtrip'.split()) +@pytest.mark.screening def test_negative_residue_numbers_2jaj(request, mol): if (mol == 'pdb_2jaj_roundtrip' and LooseVersion(getattr(parmed, '__version__', '0.0.0')) <= LooseVersion('2.7.3')): @@ -105,6 +106,7 @@ def pdb_1pyn_roundtrip(pdb_1pyn): @pytest.mark.parametrize('mol', 'pdb_1pyn pdb_1pyn_roundtrip'.split()) +@pytest.mark.screening def test_numeric_residue_name_1PYN(request, mol): """ The ligand in this residue is named "941", which causes a little trickiness """ diff --git a/moldesign/_tests/test_pdbfixer_xface.py b/moldesign/_tests/test_pdbfixer_xface.py index bf3aeb0..8c0e1b4 100644 --- a/moldesign/_tests/test_pdbfixer_xface.py +++ b/moldesign/_tests/test_pdbfixer_xface.py @@ -92,6 +92,7 @@ def test_mutation_nomenclature_string_only(pdb3aid): assert [r.resname for r in mut25] == ['MET', 'MET'] +@pytest.mark.screening def test_multiple_mutations(pdb3aid): mol = pdb3aid mut = mdt.mutate_residues(mol, ['A.2S', 'B.3S']) # Mutate Chain A res 2 and B 3 to SER @@ -113,6 +114,7 @@ def test_seawater_solvation_small_molecule(benzene): assert len(newmol.get_atoms(name='Na')) == 3 # TODO: check that this is correct molarity +@pytest.mark.screening def test_solvation_alternative_ions(benzene): newmol = mdt.add_water(benzene, min_box_size=20.0*u.angstrom, diff --git a/moldesign/_tests/test_protein_primary_structure.py b/moldesign/_tests/test_protein_primary_structure.py index 0a28f7c..dafb55e 100644 --- a/moldesign/_tests/test_protein_primary_structure.py +++ b/moldesign/_tests/test_protein_primary_structure.py @@ -152,6 +152,7 @@ def test_atom_lookup_by_name_and_index(fixture, request): @pytest.mark.parametrize('fixture', fixture_types['protein']) +@pytest.mark.screening def test_protein_residue_iteration(fixture, request): mol = request.getfixturevalue(fixture) @@ -233,6 +234,7 @@ def test_residues_iterate_in_order(fixture, request): @pytest.mark.parametrize('fixture', fixture_types['protein']) +@pytest.mark.screening def test_atoms_iterate_in_order(fixture, request): mol = request.getfixturevalue(fixture) diff --git a/moldesign/_tests/test_pyscf_xface.py b/moldesign/_tests/test_qm_xfaces.py similarity index 71% rename from moldesign/_tests/test_pyscf_xface.py rename to moldesign/_tests/test_qm_xfaces.py index 3b107f9..86a4aad 100644 --- a/moldesign/_tests/test_pyscf_xface.py +++ b/moldesign/_tests/test_qm_xfaces.py @@ -1,18 +1,21 @@ """ Tests basic QM functionality and data structures """ - +import itertools import pytest import numpy as np import moldesign as mdt from moldesign import units as u +from . import helpers + registered_types = {} # TODO: automated method testing based on its metadata - i.e. test to make sure parameters are # honored, test that it calcultes what it says it does, test that properties have the right # units and array shapes, etc. + def typedfixture(*types, **kwargs): """This is a decorator that lets us associate fixtures with one or more arbitrary types. We'll later use this type to determine what tests to run on the result""" @@ -25,7 +28,7 @@ def fixture_wrapper(func): return fixture_wrapper -@typedfixture('molecule') +@typedfixture('molecule', scope='function') def h2(): mol = mdt.Molecule([mdt.Atom('H'), mdt.Atom('H')]) @@ -33,7 +36,7 @@ def h2(): return mol -@typedfixture('molecule') +@typedfixture('molecule', scope='function') def heh_plus(): mol = mdt.Molecule([mdt.Atom('H'), mdt.Atom('He')]) @@ -42,6 +45,59 @@ def heh_plus(): return mol +# Note that this is an incomplete set of models +models_to_test = list(itertools.product((mdt.models.NWChemQM, mdt.models.PySCFPotential), + 'sto-3g 6-31g'.split(), + 'rhf rks mp2'.split())) +model_ids = ['/'.join((model.__name__, theory, basis)) for (model, theory, basis) in models_to_test] + + +@pytest.fixture(params=models_to_test, ids=model_ids, scope='function') +@pytest.mark.screening +def h2_with_model(request, h2): + model, basis, theory = request.param + + if model is mdt.models.NWChemQM and theory == 'mp2': + pytest.xfail('Not implemented') + + h2.set_energy_model(model, basis=basis, theory=theory) + return h2 + + +def test_minimization_trajectory(h2_with_model): + mol = h2_with_model + if mol.energy_model.params.theory == 'mp2': + pytest.skip('Not testing mp2 minimizations at this time') + + assert 'potential_energy' not in mol.properties + + e1 = mol.calculate_potential_energy() + p1 = mol.positions.copy() + + traj = mol.minimize() + helpers.assert_something_resembling_minimization_happened(p1, e1, traj, mol) + + +@typedfixture('model') +def pyscf_rhf(): + return mdt.models.PySCFPotential(basis='sto-3g', theory='rhf') + + +@typedfixture('model') +def pyscf_dft(): + return mdt.models.PySCFPotential(basis='sto-3g', theory='rks', functional='b3lyp') + + +@typedfixture('model') +def nwchem_rhf(): + return mdt.models.NWChemQM(basis='sto-3g', theory='rhf', functional='b3lyp') + + +@typedfixture('model') +def nwchem_dft(): + return mdt.models.NWChemQM(basis='sto-3g', theory='rks', functional='b3lyp') + + @pytest.fixture def h2_rhfwfn(h2): h2.set_energy_model(mdt.models.PySCFPotential, basis='sto-3g', theory='rhf') diff --git a/moldesign/_tests/test_qmmm.py b/moldesign/_tests/test_qmmm.py new file mode 100644 index 0000000..7948481 --- /dev/null +++ b/moldesign/_tests/test_qmmm.py @@ -0,0 +1,102 @@ +import pytest + +import moldesign as mdt +from moldesign import units as u + +from . import helpers + +# Tests: +# 1. internal bonds on QM region are removed in all cases +# 2. wavefunction is perturbed for electrostatic embedding +# 3. + + + +@pytest.fixture +def h2params(): + mol = mdt.from_smiles('[H][H]') + mol.atoms[0].name = 'HA' + mol.atoms[1].name = 'HB' + mol.residues[0].name = 'H2' + + params = mdt.create_ff_parameters(mol, charges='gasteiger') + return mol, params + + +@pytest.fixture(scope='function') +def h2_h2_with_ff(h2params): + ma, params = h2params + ma.residues[0].resname = 'UNL' + ma.atoms[0].name = 'HA' + ma.atoms[1].name = 'HB' + list(ma.bonds)[0].align('x') + + mb = ma.copy() + mb.translate([0.0, 2.0, 0.0]*u.angstrom) + + mol = ma.combine(mb) + params.assign(mol) + return mol + + +@pytest.fixture +def h2_mm(h2params): + mol, params = h2params + params.assign(mol) + mol.set_energy_model(mdt.models.OpenMMPotential) + return mol + + +@pytest.fixture +def h2_qm(h2params): + mol, params = h2params + mol.set_energy_model(mdt.models.RHF, basis='sto-3g') + return mol + + +@pytest.fixture +def h2_h2_mm(h2_h2_with_ff): + h2_h2_with_ff.set_energy_model(mdt.models.OpenMMPotential) + return h2_h2_with_ff + + +@pytest.fixture +def h2_h2_rhf(h2_h2_with_ff): + h2_h2_with_ff.set_energy_model(mdt.models.RHF, basis='sto-3g') + return h2_h2_with_ff + + +@pytest.fixture +def h2_h2_mechanical_embedding_rhf(h2_h2_with_ff): + mol = h2_h2_with_ff + mol.set_energy_model(mdt.models.MechanicalEmbeddingQMMM, + qm_atom_indices=[0, 1], + qm_model=mdt.models.RHF(basis='sto-3g'), + mm_model=mdt.models.OpenMMPotential) + return mol + + +@pytest.fixture +def h2_h2_mechanical_embedding_zeroqm(h2_h2_with_ff): + mol = h2_h2_with_ff + mol.set_energy_model(mdt.models.MechanicalEmbeddingQMMM, + qm_atom_indices=[0, 1], + qm_model=helpers.ZeroEnergy, + mm_model=mdt.models.OpenMMPotential) + return mol + + +def test_mechanical_embedding_wfn(h2_h2_mechanical_embedding_rhf): + mol = h2_h2_mechanical_embedding_rhf + + mol.calculate() + qmprops = mol.properties.qmprops + mmprops = mol.properties.mmprops + + h2_qm = mdt.Molecule(mol.residues[0]) + h2_qm.set_energy_model(mdt.models.RHF, basis='sto-3g') + h2_qm.calculate() + + assert abs(h2_qm.potential_energy - qmprops.potential_energy) < 1e-8 * u.hartree + helpers.assert_almost_equal(h2_qm.wfn.fock_ao, qmprops.wfn.fock_ao) + assert qmprops.potential_energy + mmprops.potential_energy == mol.potential_energy diff --git a/moldesign/_tests/test_symmetry.py b/moldesign/_tests/test_symmetry.py index 9733660..a2da7af 100644 --- a/moldesign/_tests/test_symmetry.py +++ b/moldesign/_tests/test_symmetry.py @@ -59,8 +59,6 @@ def almost_planar(planar): def test_approximate_symmetry(almost_planar): - mol = almost_planar.copy() - symmetries = mdt.get_symmetry(almost_planar) assert symmetries.rms > 0 @@ -69,6 +67,12 @@ def test_approximate_symmetry(almost_planar): assert len(symmetries.approximate) == 1 assert symmetries.approximate[0].symbol == 'Cs' + + +@pytest.mark.screening +def test_symmetrizer(almost_planar): + mol = almost_planar.copy() + symmetries = mdt.get_symmetry(almost_planar) cs = symmetries.groups['Cs'][0] mol.positions = symmetries.get_symmetrized_coords(cs) diff --git a/moldesign/_tests/test_tools.py b/moldesign/_tests/test_tools.py index e27c279..54a8537 100644 --- a/moldesign/_tests/test_tools.py +++ b/moldesign/_tests/test_tools.py @@ -7,7 +7,8 @@ import moldesign as mdt from moldesign import units as u -from .helpers import get_data_path +from .helpers import get_data_path, assert_almost_equal +from .molecule_fixtures import ligand3aid,pdb3aid,benzene,small_molecule,pdb1yu8, ligand_residue_3aid registered_types = {} @@ -24,7 +25,6 @@ def fixture_wrapper(func): return fixture_wrapper - @pytest.fixture def ammonium_nocharge(): return mdt.from_smiles('[NH4]') @@ -86,6 +86,7 @@ def test_c2_no_hydrogen_from_smiles(c2_no_hydrogen_from_smiles): assert b.a2.index == 1 +@pytest.mark.screening def test_add_hydrogen_to_c2(c2_no_hydrogen_from_smiles): newmol = mdt.add_hydrogen(c2_no_hydrogen_from_smiles) atomcounts = collections.Counter(atom.element for atom in newmol.atoms) diff --git a/moldesign/_tests/test_trajectory.py b/moldesign/_tests/test_trajectory.py index e0a616a..c1e34b2 100644 --- a/moldesign/_tests/test_trajectory.py +++ b/moldesign/_tests/test_trajectory.py @@ -6,6 +6,8 @@ from .object_fixtures import h2, h2_harmonic, h2_trajectory + +@pytest.mark.internal def test_frames_synched_with_trajectory(h2_trajectory): traj = h2_trajectory @@ -44,6 +46,8 @@ def precanned_trajectory(): return traj +@pytest.mark.internal +@pytest.mark.screening def test_geometry_analysis_precanned(precanned_trajectory): traj = precanned_trajectory a1, a2, a3 = traj.mol.atoms @@ -72,6 +76,8 @@ def test_geometry_analysis_precanned(precanned_trajectory): assert traj.someletter == list('abc') +@pytest.mark.internal +@pytest.mark.screening def test_frame_to_molecule_conversion(precanned_trajectory): traj = precanned_trajectory @@ -101,6 +107,8 @@ def test_frame_to_molecule_conversion(precanned_trajectory): assert m2.time == 2.0 * u.fs +@pytest.mark.internal +@pytest.mark.screening def test_property_backfill(precanned_trajectory): traj = precanned_trajectory oldnumframes = len(traj) @@ -111,6 +119,7 @@ def test_property_backfill(precanned_trajectory): assert traj.somenewthing == [None] * oldnumframes + [5] +@pytest.mark.internal def test_add_traj(precanned_trajectory): newtraj = precanned_trajectory + precanned_trajectory diff --git a/moldesign/_tests/test_units.py b/moldesign/_tests/test_units.py index 99ad49a..2331705 100644 --- a/moldesign/_tests/test_units.py +++ b/moldesign/_tests/test_units.py @@ -4,8 +4,12 @@ import numpy as np from moldesign import units +from moldesign import units as u +__PYTEST_MARK__ = 'internal' # mark all tests in this module with this label (see ./conftest.py) + +@pytest.mark.screening def test_scalar_comparison_dimensionality_errors(): with pytest.raises(units.DimensionalityError): x = 1.0 * units.angstrom == 1.0*units.ureg.kilograms @@ -17,6 +21,7 @@ def test_scalar_comparison_dimensionality_errors(): z = 1.0 * units.ureg.hectare >= 1.0 * units.ureg.astronomical_unit +@pytest.mark.screening def test_array_comparison_dimensionality_errors(): mylist = [0.0, -1.0, 1.0] @@ -30,6 +35,7 @@ def test_array_comparison_dimensionality_errors(): z = mylist * units.ureg.hectare >= mylist * units.ureg.astronomical_unit +@pytest.mark.screening def test_addition_dimensionality_errors(): with pytest.raises(units.DimensionalityError): x = 1.0 * units.angstrom + 1.0*units.ureg.kilograms @@ -38,6 +44,7 @@ def test_addition_dimensionality_errors(): y = 1.0 * units.fs - 1.0 * units.ureg.meter +@pytest.mark.screening def test_compatible_units_comparison(): num = 1.0*units.angstrom assert abs(num-0.1*units.nm) < 1.0e-15 * units.angstrom @@ -50,6 +57,7 @@ def test_default_units(): assert units.default.energy == units.eV +@pytest.mark.screening def test_default_unit_conversions(): my_list = [1.0*units.angstrom, 1.0*units.nm, 1.0*units.a0] my_array = units.array(my_list).defunits() @@ -103,6 +111,7 @@ def test_dimensionless_array_unit_checks(): assert (arr == np.arange(10, 15)).all() +@pytest.mark.screening def test_array_unit_checks(): arr = np.arange(5) * units.ureg.nm / units.ureg.fs @@ -123,9 +132,92 @@ def test_array_unit_checks(): np.testing.assert_allclose(arr.magnitude, np.arange(10, 15)) + +@pytest.mark.screening def test_default_unit_conversions(): assert abs(10.0 - (1.0*units.nm).defunits_value()) < 1e-10 assert abs(1000.0 - (1.0*units.ps).defunits_value()) < 1e-10 assert abs(1.0 - 6.022140857e23/((1.0*units.ureg.grams).defunits_value())) < 1e-6 assert abs(103.642685491 - (1.0*units.angstrom**2*units.dalton/units.fs**2).defunits_value() ) < 1e-7 + + +def test_getunits_doctests(): + assert units.get_units(1.0*units.angstrom) == units.MdtUnit('ang') + assert units.get_units(np.array([1.0, 2, 3.0])) == units.MdtUnit('dimensionless') + assert units.get_units([[1.0*units.dalton, 3.0*units.eV], + ['a'], 'gorilla']) == units.MdtUnit('amu') + + +@pytest.mark.screening +def test_setitem_from_quantity(): + myarray = np.arange(100) * u.angstrom + with pytest.raises(u.DimensionalityError): + myarray[:10] = np.arange(10) + + myarray[11] = 5.0 * u.ureg.meters + + myarray[:10] = np.arange(10) * u.nm + for i in range(10): + assert myarray[i].units == u.angstrom + assert abs(myarray[i].magnitude - i*10) < 1e-14 + + assert myarray[11].units == u.angstrom + assert abs(myarray[11].magnitude - (5.0*u.ureg.meters).value_in(u.angstrom)) < 1e-14 + + assert myarray.units == u.angstrom + + +@pytest.mark.screening +def test_setitem_from_list_of_quantities(): + myarray = np.arange(100) * u.angstrom + myarray[:10] = list(np.arange(10) * u.nm) + for i in range(10): + assert myarray[i].units == u.angstrom + assert abs(myarray[i].magnitude - i*10) < 1e-14 * u.angstrom + + +def test_setitem_slice_dimensionless(): + myarray = np.arange(100) * u.ureg.dimensionless + assert isinstance(myarray, u.MdtQuantity) + + myarray[:10] = np.arange(10) + assert myarray.units == u.ureg.dimensionless + assert (myarray[:10] == np.arange(10)).all() + + +@pytest.fixture +def make_test_matrices(): + randommatrix = np.random.rand(10,7) + randomvector = np.random.rand(10) + unitmatrix = randommatrix * u.kcalpermol + unitvector = randomvector * u.angstrom + expected_matvec_product = randomvector.dot(randommatrix) + return unitvector, unitmatrix, expected_matvec_product + + +def self_dot(a, b): + return a.dot(b) + + +def self_ldot(a,b): + return b.ldot(a) + + +def unit_dot(a,b): + return u.dot(a, b) + +MATRIX_MATHS = [self_dot, self_ldot, unit_dot] + + +@pytest.mark.parametrize('testfun', MATRIX_MATHS, ids=[x.__name__ for x in MATRIX_MATHS]) +@pytest.mark.screening +def test_matrix_math_with_units(make_test_matrices, testfun): + unitvector, unitmatrix, expected_matvec_product = make_test_matrices + + result = testfun(unitvector, unitmatrix) + + assert result.units == u.kcalpermol * u.angstrom + np.testing.assert_array_almost_equal(expected_matvec_product, + result.magnitude, decimal=12) + diff --git a/moldesign/compute/__init__.py b/moldesign/compute/__init__.py index 2987c1f..892a7d3 100644 --- a/moldesign/compute/__init__.py +++ b/moldesign/compute/__init__.py @@ -2,4 +2,4 @@ from .compute import * from .configuration import * -from .runsremotely import * \ No newline at end of file +from .runsremotely import * diff --git a/moldesign/compute/compute.py b/moldesign/compute/compute.py index 7a91528..bc76edd 100644 --- a/moldesign/compute/compute.py +++ b/moldesign/compute/compute.py @@ -88,7 +88,6 @@ def __init__(self, result, updated_object=None): self.updated_object = updated_object - def run_job(job, engine=None, wait=True, jobname=None, display=True, _return_result=False): """ Helper for running jobs. @@ -105,6 +104,9 @@ def run_job(job, engine=None, wait=True, jobname=None, display=True, Returns: pyccc job object OR function's return value """ + + mdt._lastjobs.append(job) # TODO: this could potentially be a memory leak + engine = utils.if_not_none(engine, mdt.compute.get_engine()) if engine is None: diff --git a/moldesign/compute/configuration.py b/moldesign/compute/configuration.py index ee6a513..6cea086 100644 --- a/moldesign/compute/configuration.py +++ b/moldesign/compute/configuration.py @@ -155,7 +155,7 @@ def init_config(): if os.path.exists(path): try: with open(path, 'r') as infile: - print('Reading configuration from %s' % path) + sys.stderr.write('Reading configuration from %s\n' % path) newconf = yaml.load(infile) if not isinstance(newconf, dict): raise TypeError('Cannot read configuration "%s" from %s.' % (newconf, path)) diff --git a/moldesign/fileio.py b/moldesign/fileio.py index 85a4d6c..1bf3de4 100644 --- a/moldesign/fileio.py +++ b/moldesign/fileio.py @@ -325,6 +325,28 @@ def read_xyz(f): return mdt.Molecule(tempmol.atoms) +def read_smiles_file(f): + return _get_mol_from_identifier_file(f, from_smiles) + + +def read_inchi_file(f): + return _get_mol_from_identifier_file(f, from_inchi) + + +def read_iupac_file(f): + return _get_mol_from_identifier_file(f, from_name) + + +def _get_mol_from_identifier_file(fileobj, mol_constructor): + for line in fileobj: + if line.strip()[0] == '#': + continue + else: + return mol_constructor(line.strip()) + else: + raise IOError("Didn't find any chemical identifiers in the passed file.") + + def write_xyz(mol, fileobj): fileobj.write(u" %d\n%s\n" % (mol.num_atoms, mol.name)) for atom in mol.atoms: @@ -335,6 +357,9 @@ def write_xyz(mol, fileobj): @utils.exports def from_pdb(pdbcode, usecif=False): """ Import the given molecular geometry from PDB.org + + By default, this will use the structure from the PDB-formatted data; however, it will fall back + to using the mmCIF data for this pdbcode if the PDB file is not present. See Also: http://pdb101.rcsb.org/learn/guide-to-understanding-pdb-data/introduction @@ -447,12 +472,17 @@ def _get_format(filename, format): READERS = {'pdb': read_pdb, 'cif': read_mmcif, 'mmcif': read_mmcif, + 'smi': read_smiles_file, + 'smiles': read_smiles_file, + 'inchi': read_inchi_file, + 'iupac': read_iupac_file, 'xyz': read_xyz} WRITERS = {'pdb': write_pdb, 'mmcif': write_mmcif, 'xyz': write_xyz} + if PY2: bzopener = bz2.BZ2File else: diff --git a/moldesign/forcefields/__init__.py b/moldesign/forcefields/__init__.py index c77f14a..1020fff 100644 --- a/moldesign/forcefields/__init__.py +++ b/moldesign/forcefields/__init__.py @@ -5,7 +5,6 @@ def toplevel(o): from . import errors -from .terms import * from .ffparams import * from .forcefieldbase import * from .amber import * diff --git a/moldesign/forcefields/ffparams.py b/moldesign/forcefields/ffparams.py index 6edeeda..5aca114 100644 --- a/moldesign/forcefields/ffparams.py +++ b/moldesign/forcefields/ffparams.py @@ -1,8 +1,8 @@ - from __future__ import print_function, absolute_import, division from future.builtins import * from future import standard_library standard_library.install_aliases() + # Copyright 2017 Autodesk Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -25,8 +25,7 @@ class ForcefieldParams(object): """ Stores the forcefield parameters for a specific molecule. - The current implementation is heavily based on a ParmEd object, - with fairly thin MDT wrappers providing an interface and handling unit conversions. + This is a shim around a parmed object. Args: mol (mdt.Molecule): Molecule this force field is for @@ -68,15 +67,18 @@ def get_bond_term(self, bond_or_atom1, atom2=None): if atom2 is None: bond = bond_or_atom1 else: - bond = mdt.Bond(bond_or_atom1, - atom2) + bond = mdt.Bond(bond_or_atom1, atom2) pmdatom = self.parmed_obj.atoms[bond.a1.index] + indices = [bond.a1.index, bond.a2.index] + + for pmdbond in pmdatom.bonds: + pmdindices = sorted((pmdbond.atom1.idx, pmdbond.atom2.idx)) + if pmdindices == indices: + assert self.parmed_obj.atoms[pmdindices[0]].element == bond.a1.atnum + assert self.parmed_obj.atoms[pmdindices[1]].element == bond.a2.atnum - for pmdbond, pmdpartner in zip(pmdatom.bonds, pmdatom.bond_partners): - if pmdpartner.idx == bond.a2.index: - return BondTerm(bond, - pmdbond) + return BondTerm(bond, pmdbond) else: raise ValueError("No ForceField term found for bond: %s" % bond) diff --git a/moldesign/forcefields/forcefieldbase.py b/moldesign/forcefields/forcefieldbase.py index a7e9d88..ac1fc4d 100644 --- a/moldesign/forcefields/forcefieldbase.py +++ b/moldesign/forcefields/forcefieldbase.py @@ -23,10 +23,11 @@ class Forcefield(object): - """ Abstract base class representing a biomolecular forcefield definition, - such as amber14sb or charm22. + """ Abstract class for biomolecular forcefield definitions such as amber14sb or charm22. - These contain both atom type templates AND forcefield parameters. + These contain both atom typing templates AND forcefield parameters. Most of this data + is not exposed through the python API (currently); internally, these are collections + of references to definition files (such as amber leaprc and lib files) """ def assign(self, mol, display=True): diff --git a/moldesign/forcefields/terms.py b/moldesign/forcefields/terms.py deleted file mode 100644 index bfb5dd6..0000000 --- a/moldesign/forcefields/terms.py +++ /dev/null @@ -1,110 +0,0 @@ -from __future__ import print_function, absolute_import, division -from future.builtins import * -from future import standard_library -standard_library.install_aliases() - -# Copyright 2017 Autodesk Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import math - -import numpy as np - -from moldesign import units as u -from moldesign.geom import coords as geo - - -# TODO: These object needs to be rationalized into the parmed-based ForceField class - -class FFTerm(object): - pass - - -class HarmonicBondTerm(FFTerm): - def __init__(self, a1, a2, k, d0): - self.atoms = [a1, a2] - self.k = k - self.d0 = d0 - self.bond = a1.bond_graph.get(a2, None) - - def __str__(self): - return 'Harmonic bond ({atoms}), k={k.magnitude:6.3f}{k.units}, equil={d0.magnitude:6.2}{d0.units}'.format( - atoms=','.join(map(str, self.atoms)), - k=self.k, - d0=self.d0) - - def coord(self): - return geo.distance(*self.atoms) - - def energy(self): - return u.default.convert(self.k * (self.coord() - self.d0)**2) - - -class HarmonicAngleTerm(FFTerm): - def __init__(self, a1, a2, a3, k, theta0): - self.atoms = [a1, a2, a3] - self.k = k - self.theta0 = theta0 - self.bonds = [a1.bond_graph.get(a2,None), - a2.bond_graph.get(a3,None)] - - def __str__(self): - return 'Harmonic angle ({atoms}), k={k.magnitude:6.3f}{k.units}, equil={d0.magnitude:6.2}{d0.units}'.format( - atoms=','.join(map(str, self.atoms)), - k=self.k.defunits(), - d0=self.theta0.defunits()) - - def coord(self): - return geo.angle(*self.atoms) - - def energy(self): - return u.default.convert(self.k * (self.coord() - self.theta0)**2) - - -class PeriodicTorsionTerm(FFTerm): - def __init__(self, a1, a2, a3, a4, n, v_n, gamma): - self.atoms = [a1, a2, a3, a4] - self.n = n - self.v_n = v_n - self.gamma = gamma - self.bonds = [a1.bond_graph.get(a2, None), - a2.bond_graph.get(a3, None), - a3.bond_graph.get(a4, None)] - - def __str__(self): - return 'Periodic torsion ({atoms}),' \ - ' n={n}, k={k.magnitude:6.3f}{k.units}, equil={d0.magnitude:6.2}{d0.units}'.format( - atoms=','.join(map(str, self.atoms)), - k=self.v_n.defunits(), - n=self.n, - d0=self.gamma) - - def coord(self): - return geo.dihedral(*self.atoms) - - def energy(self): - return u.default.convert(0.5 * self.v_n * (1.0 + np.cos(self.n * self.coord() - self.gamma))) - - -class LennardJonesSigmaEps(FFTerm): - def __init__(self, atom, sigma, epsilon): - self.atom = atom - self.sigma = sigma - self.epsilon = epsilon - - def get_sigma(self, other): - return (self.sigma + other.sigma) / 2.0 - - def get_epsilon(self, other): - return math.sqrt(self.sigma * other.sigma) \ No newline at end of file diff --git a/moldesign/geom/__init__.py b/moldesign/geom/__init__.py index cbdc202..4fad077 100644 --- a/moldesign/geom/__init__.py +++ b/moldesign/geom/__init__.py @@ -10,3 +10,4 @@ def toplevel(o): from .symmetry import * from .monitor import * from .shake import * +from .alignment import * diff --git a/moldesign/geom/alignment.py b/moldesign/geom/alignment.py new file mode 100644 index 0000000..e1069e7 --- /dev/null +++ b/moldesign/geom/alignment.py @@ -0,0 +1,103 @@ +from __future__ import print_function, absolute_import, division +from future.builtins import * +from future import standard_library +standard_library.install_aliases() + +# Copyright 2017 Autodesk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import numpy as np +from .. import units as u +from ..mathutils import Eigenspace +from .. import utils + + +@utils.exports +class PrincipalMomentsOfInertia(Eigenspace): + """ Calculates the moments of inertia of a molecule at a given position + + Notes: + This object is NOT updated if the initializing molecule's positions change. + This allows it to be used to reorient other molecules into the same coordinate system + + Args: + mol (moldesign.Molecule): molecule to calculate PMIs for + mass_centered (bool): calculate PMIs relative to molecule's center of mass (default: True) + + Attributes: + axes (List[Vector[len=3]]]): principal rotation axes + moments (Vector[length**2 * mass, len=3]): rotational inertias for the three axes + """ + def __init__(self, mol, mass_centered=True): + from scipy.linalg import eig + inertia_tensor, com = get_inertia_tensor(mol, mass_centered=mass_centered) + + evals, evecs = eig(inertia_tensor.defunits_value()) # strip units before going to scipy + evals = evals*u.default.mass*u.default.length ** 2 # reapply units to evals + + assert (abs(evecs.imag) < 1e-12).all() # hopefully everything is real? + assert (abs(evals.imag) < 1e-12 * evals.units).all() + + super().__init__(evals.real, evecs.T) + self._com = com + self.sort() + + @property + def moments(self): + return self.evals + + @property + def axes(self): + return self.evecs + + def reorient(self, mol): + """ Rotates molecular coordinates into the PMI coordinate system + + The molecule will be translated (if necessary), then rotated so that x lies along PMI 1, + y along PMI 2, and z along PMI 3. + + Args: + mol (moldesign.Molecule): molecule to re-orient - its current positinos will be changed + """ + if self._com is not None: + mol.com -= self._com + mol.positions = self.transform(mol.positions) + + +@utils.exports +def get_inertia_tensor(mol, mass_centered=True): + """ Calculates the moment of inertia for a molecule + + Args: + mol (moldesign.Molecule): calculate the inertia tensor of this molecule + mass_centered (bool): if True, calcualte tensor relative to molecule's center of mass. If + False, calculate it relative to the current origin. + + Returns: + Matrix[mass*length*length]: moment of inertia tensor + """ + inertia_tensor = np.zeros((3,3)) * u.default.mass * u.default.length**2 + com = mol.com if mass_centered else None + + pos = mol.positions + if mass_centered: + pos = pos - mol.com + + for i in range(3): + inertia_tensor[i,i] = (mol.masses * (pos[:,i-1]**2 + pos[:,i-2]**2)).sum() + for j in range(i+1,3): + di = (mol.masses * pos[:,i] * pos[:,j]).sum() + inertia_tensor[i,j] = -di + inertia_tensor[j,i] = -di + return inertia_tensor, com \ No newline at end of file diff --git a/moldesign/geom/constraints.py b/moldesign/geom/constraints.py index f1c9a2b..308c560 100644 --- a/moldesign/geom/constraints.py +++ b/moldesign/geom/constraints.py @@ -16,18 +16,18 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +import copy import moldesign as mdt -import moldesign.molecules.atomcollections -from moldesign import units as u -from moldesign.mathutils import * +from .. import units as u +from ..mathutils import * from .coords import * from .grads import * from .grads import _atom_grad_to_mol_grad -DIST_TOLERANCE = 1.0e-6 * u.angstrom +DIST_TOLERANCE = 1.0e-5 * u.angstrom DIST_FORCE_CONSTANT = 1000.0 * u.kcalpermol / (u.angstrom**2) -ANGLE_TOLERANCE = 1.0e-4 * u.degrees +ANGLE_TOLERANCE = 1.0e-2 * u.degrees ANGLE_FORCE_CONSTANT = 1500.0 * u.kcalpermol / (u.radians**2) @@ -46,7 +46,7 @@ class GeometryConstraint(object): dof = 1 # number of degrees of freedom constrained (so that we can properly calculate temperature) def __init__(self, atoms, value=None, tolerance=None, force_constant=None): - self.atoms = moldesign.molecules.atomcollections.AtomList(atoms) + self.atoms = mdt.AtomList(atoms) self.mol = self.atoms[0].molecule self.tolerance = tolerance self.force_constant = force_constant @@ -54,6 +54,24 @@ def __init__(self, atoms, value=None, tolerance=None, force_constant=None): assert atom.molecule is self.mol self.value = mdt.utils.if_not_none(value, self.current()) + def copy(self, mol=None): + """ Copy this constraint, optionally relinking to a new molecule + + Args: + mol (moldesign.Molecule): optional new molecule to track. + + Returns: + GeometryConstraint: new constraint instance + """ + if mol is None: + mol = self.mol + newatoms = [mol.atoms[atom.index] for atom in self.atoms] + + # Note: this is the call signature for most subclasses, different than this base class's + return self.__class__(*newatoms, + value=self.value, tolerance=self.tolerance, + force_constant=self.force_constant) + def current(self): """ Return the current value of the constrained quantity @@ -65,6 +83,8 @@ def gradient(self): Return the gradient of the constrained quantity Requires that self.atomgrad be implemented (or otherwise provided) + Must return an MdtQuantity object, even if dimensionless + .. math:: \nabla G(\mathbf r) """ @@ -123,7 +143,7 @@ def __init__(self, atom1, atom2, value=None, self.a1 = atom1 self.a2 = atom2 super().__init__([atom1, atom2], value=value, - tolerance=tolerance, force_constant=force_constant) + tolerance=tolerance, force_constant=force_constant) def current(self): return self.a1.distance(self.a2) @@ -141,7 +161,7 @@ def __init__(self, atom1, atom2, atom3, value=None, self.a2 = atom2 self.a3 = atom3 super().__init__([atom1, atom2, atom3], value=value, - tolerance=tolerance, force_constant=force_constant) + tolerance=tolerance, force_constant=force_constant) def current(self): return angle(*self.atoms) @@ -164,7 +184,7 @@ def __init__(self, atom1, atom2, atom3, atom4, value=None, self.a3 = atom3 self.a4 = atom4 super().__init__([atom1, atom2, atom3, atom4], value=value, - tolerance=tolerance, force_constant=force_constant) + tolerance=tolerance, force_constant=force_constant) def current(self): return dihedral(*self.atoms) @@ -196,7 +216,7 @@ def __init__(self, atom, value=None, else: self.value = value.copy() super().__init__([atom], value=self.value, - tolerance=tolerance, force_constant=force_constant) + tolerance=tolerance, force_constant=force_constant) def current(self): return self.atom.position @@ -207,6 +227,17 @@ def error(self): return np.sqrt(diff.dot(diff)) error.__doc__ = GeometryConstraint.error.__doc__ + def decompose(self): + """ Decompose this 3-d constraint into 3 1-dimensional constraints + + Single-DOF holonomic constraints tend to be much better behaved mathematically and + are thus easier for optimizers to handle. + """ + for i in range(3): + vec = np.zeros(3) + vec[i] = 1.0 + yield FixedCoordinate(self.atom, vec, value=self.value[i]) + def atomgrad(self, atom=None): """ Note: @@ -220,9 +251,89 @@ def atomgrad(self, atom=None): if atom: assert atom is self.atom diff = self.atom.position - self.value grad = normalized(diff) - if (grad.magnitude == np.zeros(3)).all(): - grad.magnitude[:] = np.ones(3) / np.sqrt(3) - return [grad] + if (grad == np.zeros(3)).all(): + grad[:] = np.ones(3) / np.sqrt(3) + return [grad] * u.dimensionless + + +class HBondsConstraint(GeometryConstraint): + """ Constraints the lengths of all bonds involving hydrogen to their equilibrium forcefield + values. + + Generally, this is used to signal to a molecular dynamics program to apply H-bond constraints. + + Note: + This constraint can only be applied to molecules with an assigned forcefield. + + Args: + mol (moldesign.Molecule): Constrain all h-bonds in this molecule + values (Vector[length]): constrained bond distances for all atoms (if not given, then + these are automatically set to their current values) + """ + desc = 'hbonds' + + def __init__(self, mol): + self.mol = mol + self.bonds = [] + self.subconstraints = [] + for bond in self.mol.bonds: + if bond.a1.atnum == 1 or bond.a2.atnum == 1: + self.bonds.append(bond) + self.subconstraints.append(DistanceConstraint(bond.a1, bond.a2, + value=bond.ff.equilibrium_length)) + self.values = [c.current() for c in self.subconstraints] + + def copy(self, mol=None): + if mol is None: + return super().copy() + else: + return self.__class__(mol) + + @property + def tolerance(self): + return len(self.bonds) * DIST_TOLERANCE**2 + + def __repr__(self): + return '<%s for %s>' % (self.__class__.__name__, self.mol) + + def __str__(self): + return 'Constraint: All h-bond lengths in %s)>' % self.mol + + def _constraintsig(self): + """ Returns a unique key that lets us figure out if we have duplicate or conflicting + constraints + """ + return self.desc + + @property + def dof(self): + return len(self.bonds) + + def current(self): + """ Current value of this constraint function. Equivalent to ``self.error()`` here. + + Returns: + Scalar[length**2]: sum of errors squared + """ + return sum(distconst.error()**2 for distconst in self.subconstraints) + current.__doc__ = GeometryConstraint.current.__doc__ + error = current # same thing here + + def gradient(self): + """ Current value of this constraint function. Equivalent to ``self.error()`` here. + + Returns: + Vector[length, shape=(*,3)]: gradient of self.error() + """ + grad = np.zeros((self.mol.num_atoms, 3)) * u.default.length + for constraint in self.subconstraints: + grad += 2.0 * constraint.gradient() * constraint.error() + return grad + + def decompose(self): + """ Decompose this constraint into a list of bond-length constraints + """ + return self.subconstraints class FixedCoordinate(GeometryConstraint): @@ -246,14 +357,40 @@ def __init__(self, atom, vector, value=None, else: self.value = value.copy() super().__init__([atom], value=self.value, - tolerance=tolerance, force_constant=force_constant) + tolerance=tolerance, force_constant=force_constant) + + def copy(self, mol=None): + """ Copy this constraint, optionally relinking to a new molecule + + Args: + mol (moldesign.Molecule): optional new molecule to track. + + Returns: + GeometryConstraint: new constraint instance + """ + if mol is None: + mol = self.mol + newatom = mol.atoms[self.atom.index] + return self.__class__(newatom, self.vector.copy(), + value=self.value, tolerance=self.tolerance, + force_constant=self.force_constant) def current(self): return self.atom.position.dot(self.vector) current.__doc__ = GeometryConstraint.current.__doc__ def atomgrad(self, atom=None): - return [self.vector] * u.ureg.dimensionless # that was easy + return [self.vector] * u.ureg.dimensionless def _constraintsig(self): return super()._constraintsig() + (self.vector,) + + +def get_base_constraints(constraintlist): + constraints = [] + for c in constraintlist: + if hasattr(c, 'decompose'): + constraints.extend(c.decompose()) + else: + constraints.append(c) + return constraints diff --git a/moldesign/geom/coords.py b/moldesign/geom/coords.py index 3a66b30..fc54735 100644 --- a/moldesign/geom/coords.py +++ b/moldesign/geom/coords.py @@ -16,23 +16,15 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -#from singledispatch import singledispatch import numpy as np -from moldesign import units as u -#from moldesign.molecules import Bond -from moldesign.mathutils import normalized, safe_arccos +from .. import units as u +from .. import mathutils from . import toplevel -# NEWFEATURE: preliminary profiling indicates that, for interactive work, the UNITS LIBRARY is -# actually the biggest bottleneck - -# NEWFEATURE: pyramidalization aka out-of-plane bending - @toplevel -#@singledispatch def distance(a1, a2): """ Return distance between two atoms @@ -51,13 +43,7 @@ def distance(a1, a2): return np.sqrt((diffvec*diffvec).sum(axis=1)) -# @distance.register(Bond) -# def distance(bond): -# return distance(bond.a1, bond.a2) - - @toplevel -#@singledispatch def angle(a1, a2, a3): """ The angle between bonds a2-a1 and a2-a3 @@ -69,23 +55,7 @@ def angle(a1, a2, a3): """ r21 = (a1.position - a2.position).defunits_value() # remove units immediately to improve speed r23 = (a3.position - a2.position).defunits_value() - e12 = normalized(r21) - e23 = normalized(r23) - - dim = len(e12.shape) - if dim == 2: - costheta = (e12*e23).sum(axis=1) - else: - assert dim == 1 - costheta = np.dot(e12, e23) - theta = safe_arccos(costheta) - return theta * u.radians - -# -# @angle.register(Bond) -# def angle(b1, b2): -# a1, a2, a3 = _join_bonds(b1, b2) -# return angle(a1, a2, a3) + return mathutils.alignment_rotation(r21, r23)[0] def _join_bonds(b1, b2): @@ -100,7 +70,6 @@ def _join_bonds(b1, b2): @toplevel -#@singledispatch def dihedral(a1, a2=None, a3=None, a4=None): """Twist angle of bonds a1-a2 and a4-a3 around around the central bond a2-a3 @@ -125,7 +94,7 @@ def dihedral(a1, a2=None, a3=None, a4=None): dim = len(r21.shape) center_bond = (a2.position - a3.position).defunits_value() - plane_normal = normalized(center_bond) + plane_normal = mathutils.normalized(center_bond) if dim == 1: r21_proj = r21 - plane_normal * r21.dot(plane_normal) @@ -135,8 +104,8 @@ def dihedral(a1, a2=None, a3=None, a4=None): r21_proj = r21 - plane_normal * (r21*plane_normal).sum(axis=1)[:, None] r34_proj = r34 - plane_normal * (r34*plane_normal).sum(axis=1)[:, None] - va = normalized(r21_proj) - vb = normalized(r34_proj) + va = mathutils.normalized(r21_proj) + vb = mathutils.normalized(r34_proj) if dim == 1: costheta = np.dot(va, vb) @@ -147,7 +116,7 @@ def dihedral(a1, a2=None, a3=None, a4=None): else: costheta = (va*vb).sum(axis=1) - abstheta = safe_arccos(costheta) + abstheta = mathutils.safe_arccos(costheta) cross = np.cross(va, vb) if dim == 1: @@ -157,6 +126,31 @@ def dihedral(a1, a2=None, a3=None, a4=None): return (theta * u.radians) % (2.0 * u.pi * u.radians) +@toplevel +def nonplanar_bend_angle(a1, a2=None, a3=None, a4=None): + """ Calculates the pyramidalization of a 4-atom system + + "Pyramidalization" is the out of plane bending around a trivalent center (usually an + sp2 carbon). This routine calculates it as the angle between two planes. The two planes + are defined by: + 1) the three substituents of a tri-valent central atom + 2) the central atom and its two single-bonded constituents + + + Can be called as ``pyramidalization(central_atom)`` in an sp2 system + OR ``pyramidalization(double_bond, single_bond1, single_bond2)`` + OR ``pyramidalization(a1, a2, a3, a4)`` where the atoms, in order are + 1. a1 - the central atom + 2. a2 - the doubly bonded neighbors + 3. a3 - one of the singly-bonded neighbors + 4. a4 - the other singly-bonded neighbor + + Returns: + (units.Scalar[angle]): angle - [0, 2 pi) radians + """ + raise NotImplementedError() + + def _infer_dihedral(a2, a3=None): """ Given two atoms defining the central bond in a dihedral, pick the first and last atoms in a heuristic way (see :meth:`_pick_atom`) to get a unique-ish definition. @@ -205,23 +199,3 @@ def _pick_atom(atom, nbr): newat = traj.atoms[newat.index] return newat - - - - -# -# @dihedral.register(Bond) -# def dihedral(b1, b2=None, b3=None): -# if b2 is b3 is None: -# return dihedral(b1.a1, b1.a2) -# -# else: -# a1, a2, a3 = _join_bonds(b1, b2) -# a22, a33, a4 = _join_bonds(b2, b3) -# -# assert a22 == a2 -# assert a33 == a3 -# -# return dihedral(a1, a2, a3, a4) -# -# diff --git a/moldesign/geom/grads.py b/moldesign/geom/grads.py index d9e328b..8c7aed2 100644 --- a/moldesign/geom/grads.py +++ b/moldesign/geom/grads.py @@ -40,7 +40,7 @@ def distance_gradient(a1, a2): Tuple[u.Vector[length], u.Vector[length]]: (gradient w.r.t. first atom, gradient w.r.t. second atom) """ - d = normalized(a1.position-a2.position) + d = normalized(a1.position-a2.position) * u.ureg.dimensionless return d, -d diff --git a/moldesign/geom/shake.py b/moldesign/geom/shake.py index 06347d4..7890ac5 100644 --- a/moldesign/geom/shake.py +++ b/moldesign/geom/shake.py @@ -20,18 +20,18 @@ import moldesign as mdt from moldesign import units as u -from .constraints import FixedCoordinate, FixedPosition - # TODO: create dynamics wrapper that uses timestep to explicitly calculate constraint forces -def shake_positions(mol, prev_positions, max_cycles=100, use_masses=True): +def shake_positions(mol, prev_positions, max_cycles=100, use_masses=True, constraints=None): """ Satisfy all molecular constraints using the SHAKE algorithm Args: mol (moldesign.Molecule): molecule with unsatisfied constraints prev_positions (mdt.units.Array[length]): positions prior to move max_cycles (int): halt and raise an exception after this many cycles + constraints (List[moldesign.geom.GeometryConstraint]): list of constraints (optional; + uses mol.constraints if not provided) Note: This algorithm does badly if constraint function gradients go to 0. @@ -41,15 +41,8 @@ def shake_positions(mol, prev_positions, max_cycles=100, use_masses=True): Eur Phys J Spec Top. 2011 Nov 1; 200(1): 211. doi:10.1140/epjst/e2011-01525-9 """ - constraints = [] - for c in mol.constraints: # Replace FixedPosition with 3 FixedCoordinates - it's better behaved - if isinstance(c, FixedPosition): - for i in range(3): - vec = np.zeros(3) - vec[i] = 1.0 - constraints.append(FixedCoordinate(c.atom, vec, value=c.value[i])) - else: - constraints.append(c) + if constraints is None: + constraints = mdt.geom.get_base_constraints(mol.constraints) # ---array shapes--- # prevgrad, currgrad: (num_constr, 3N) diff --git a/moldesign/helpers/__init__.py b/moldesign/helpers/__init__.py index bfa92d8..c408310 100644 --- a/moldesign/helpers/__init__.py +++ b/moldesign/helpers/__init__.py @@ -1,3 +1,4 @@ from .helpers import * from .pdb import * +from .qmmm import * from .widgets import * diff --git a/moldesign/helpers/helpers.py b/moldesign/helpers/helpers.py index fdd7591..2b5f026 100644 --- a/moldesign/helpers/helpers.py +++ b/moldesign/helpers/helpers.py @@ -87,7 +87,19 @@ def get_all_atoms(*objects): def kinetic_energy(momenta, masses): - return 0.5 * (momenta*momenta/masses).sum() + """ Returns kinetic energy + + This is just a helper for the KE formula, because the formula is used frequently but not + particularly recognizable or easy to read + + Args: + momenta (Matrix[momentum, shape=(*,3)]): atomic momenta + dim_masses (Vector[mass]): atomic masses + + Returns: + Scalar[energy]: kinetic energy of these atoms + """ + return 0.5 * (momenta*momenta/masses[:,None]).sum() def kinetic_temperature(ke, dof): diff --git a/moldesign/helpers/qmmm.py b/moldesign/helpers/qmmm.py new file mode 100644 index 0000000..c5ae088 --- /dev/null +++ b/moldesign/helpers/qmmm.py @@ -0,0 +1,92 @@ +# Copyright 2016 Autodesk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import moldesign as mdt + +LINKBONDRATIO = 0.709 # fixed ratio of C-C to C-H bond length for link atoms + + +def create_link_atoms(mol, qmatoms): + """ Create hydrogen caps for bonds between QM and MM regions. + + Each link atom will have ``metadata.mmatom``, ``metadata.mmpartner`` attributes to identify the + atom it replaces and the atom it's bonded to in the MM system. + + Raises: + ValueError: if any MM/QM atom is bonded to more than one QM/MM atom, or the bond + order is not one + + Returns: + List[mdt.Atom]: list of link atoms + """ + linkatoms = [] + qmset = set(qmatoms) + for qmatom in qmatoms: + mmatom = _get_mm_nbr(mol, qmatom, qmset) + if mmatom is None: + continue + + la = mdt.Atom(atnum=1, name='HL%d' % len(linkatoms), + metadata={'mmatom': mmatom, 'mmpartner': qmatom}) + linkatoms.append(la) + + set_link_atom_positions(linkatoms) + return linkatoms + + +def _get_mm_nbr(mol, qmatom, qmset): + mm_nbrs = [nbr for nbr in qmatom.bonded_atoms + if nbr not in qmset] + if len(mm_nbrs) == 0: + return None + + # everything below is sanity checks + mmatom = mm_nbrs[0] + if len(mm_nbrs) != 1: + raise ValueError('QM atom %s is bonded to more than one MM atom' % qmatom) + if mol.bond_graph[qmatom][mmatom] != 1: + raise ValueError('Bond crossing QM/MM boundary (%s - %s) does not have order 1' + % (qmatom, mmatom)) + + if qmatom.atnum != 6 or mmatom.atnum != 6: + print ('WARNING: QM/MM bond involving non-carbon atoms: %s - %s' % + (qmatom, mmatom)) + mm_qm_nbrs = [qmnbr for qmnbr in mmatom.bonded_atoms + if qmnbr in qmset] + if len(mm_qm_nbrs) != 1: + raise ValueError('MM atom %s is bonded to more than one QM atom'%mmatom) + return mmatom + + +def set_link_atom_positions(linkatoms): + """ + Set link atom positions using a fixed ratio of MM bond length to QM bond length + + Warnings: + - This is only valid for + + - Presumably, the most "correct" way to do this is to place the hydrogen in order to + match the force exterted on the QM atom by the MM atom. This is not currently supported. + + Args: + linkatoms (List[mdt.Atom]): list of link atoms to set positions for + + References: + http://www.nwchem-sw.org/index.php/Qmmm_link_atoms + """ + for atom in linkatoms: + nbr = atom.metadata.mmpartner + proxy = atom.metadata.mmatom + dist = LINKBONDRATIO * nbr.distance(proxy) + atom.position = (nbr.position + + dist * mdt.mathutils.normalized(proxy.position - nbr.position)) diff --git a/moldesign/integrators/base.py b/moldesign/integrators/base.py index 7de615d..f3e9f11 100644 --- a/moldesign/integrators/base.py +++ b/moldesign/integrators/base.py @@ -51,7 +51,7 @@ def time_to_steps(time, timestep): assert isinstance(time, int), "argument to integrator.run must have units of time or be an int" return time else: - return int(round(time / timestep)) + return int(round(float(time / timestep))) class MDBase(IntegratorBase): diff --git a/moldesign/integrators/openmm.py b/moldesign/integrators/openmm.py index 515b89d..095fff5 100644 --- a/moldesign/integrators/openmm.py +++ b/moldesign/integrators/openmm.py @@ -19,7 +19,7 @@ import pyccc import pyccc.exceptions -from moldesign import compute +from moldesign import compute, exceptions from moldesign.interfaces.openmm import force_remote, MdtReporter, pint2simtk, OpenMMPickleMixin from moldesign.utils import exports @@ -31,19 +31,17 @@ class OpenMMBaseIntegrator(IntegratorBase, OpenMMPickleMixin): _openmm_compatible = True def prep(self): - assert self.mol.energy_model._openmm_compatible - if self._prepped and self.model is self.mol.energy_model and self.model._prepped: return - self.model = self.mol.energy_model - self.model.prep() - self.sim = self.model.sim - self._prepped = True + if not self.mol.energy_model._openmm_compatible: + raise exceptions.NotSupportedError( + ("%s requires an OpenMM-based energy model (current " + "energy model '%s' is not supported with this integrator") % + (self.mol.energy_model.__class__.__name__, self.__class__.__name__)) - def run(self, run_for, wait=False): - assert self.mol.energy_model._openmm_compatible - - if not self.mol.energy_model.constraints_supported(): - raise NotImplementedError('OpenMM only supports position and bond constraints') + # For OpenMM integrators, all system setup is delegated to the energy model + # this will create values for self.energy_model, self.sim, and and self._prepped + self.mol.energy_model.prep() + def run(self, run_for, wait=False): try: traj = self._run(run_for) except pyccc.exceptions.ProgramFailure: @@ -59,8 +57,9 @@ def run(self, run_for, wait=False): @compute.runsremotely(enable=force_remote, is_imethod=True) def _run(self, run_for): self.prep() + self.energy_model._set_constraints() # calling this just to raise an exception if necessary nsteps = self.time_to_steps(run_for, self.params.timestep) - self.model._set_openmm_state() + self.energy_model._set_openmm_state() self.reporter = self._attach_reporters() self.reporter.annotation = self._describe_dynamics() @@ -68,10 +67,9 @@ def _run(self, run_for): self.sim.step(nsteps) # this is the actual dynamics loop - self.model._sync_to_openmm() + self.energy_model._sync_to_openmm() if self.reporter.last_report_time != self.mol.time: self.reporter.report_from_mol() - self.reporter.report_from_mol() return self.reporter.trajectory def _attach_reporters(self): diff --git a/moldesign/interfaces/openbabel.py b/moldesign/interfaces/openbabel.py index bcfe850..30eb808 100644 --- a/moldesign/interfaces/openbabel.py +++ b/moldesign/interfaces/openbabel.py @@ -16,7 +16,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -import os +import sys import string import moldesign.molecules.atomcollections @@ -26,10 +26,12 @@ import openbabel as ob # WARNING: this is the real library, not our interface - this works because of absolute # imports. We should probably rename this interface + except ImportError: force_remote = True -else: # this should be configurable - force_remote = False # debugging + sys.stderr.write('Info: OpenBabel not installed; will run in docker container\n') +else: + force_remote = False import moldesign as mdt from ..compute.runsremotely import runsremotely @@ -159,11 +161,9 @@ def mol_to_pybel(mdtmol): if atom.residue and atom.residue not in resmap: obres = obmol.NewResidue() resmap[atom.residue] = obres - obres.SetChain(str( - mdt.utils.if_not_none(atom.chain.name, 'Z')[0])) - obres.SetName(str( - mdt.utils.if_not_none(atom.residue.pdbname, 'UNL'))) - obres.SetNum(mdt.utils.if_not_none(atom.residue.pdbindex, '0')) + obres.SetChain(str(atom.chain.pdbname)[0] if atom.chain.pdbname else 'Z') + obres.SetName(str(atom.residue.pdbname) if atom.residue.pdbname else 'UNL') + obres.SetNum(str(atom.residue.pdbindex) if atom.residue.pdbindex else 0) else: obres = resmap[atom.residue] diff --git a/moldesign/interfaces/openmm.py b/moldesign/interfaces/openmm.py index a2e6f47..a787571 100644 --- a/moldesign/interfaces/openmm.py +++ b/moldesign/interfaces/openmm.py @@ -17,6 +17,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import sys import itertools import imp @@ -33,7 +34,7 @@ try: imp.find_module('simtk') except (ImportError, OSError) as exc: - print('OpenMM could not be imported; using remote docker container') + sys.stderr.write('Info: OpenMM not installed; will run in docker container\n') force_remote = True else: force_remote = False @@ -68,13 +69,13 @@ class MdtReporter(StateDataReporter): It's pretty basic - the assumption is that there will be more processing on the client side """ - LEN = 30 def __init__(self, mol, report_interval): self.mol = mol self.report_interval = report_interval self.trajectory = mdt.Trajectory(mol) self.annotation = None - self._row_format = ("{:<%d}" % 10) + 3*("{:>%d}" % self.LEN) + self._row_format = ("{:<10.2f}") + 3*(" {:>15.4f}") + self._header_format = self._row_format.replace('.4f','s').replace('.2f','s') self._printed_header = False self.last_report_time = None @@ -86,9 +87,10 @@ def report_from_mol(self, **kwargs): self.mol.energy_model.sim.context.getState(getEnergy=True, getForces=True, getPositions=True, - getVelocities=True)) + getVelocities=True), + settime=self.mol.time) - def report(self, simulation, state): + def report(self, simulation, state, settime=None): """ Callback for dynamics after the specified interval Args: @@ -96,11 +98,13 @@ def report(self, simulation, state): state (simtk.openmm.State): state of the simulation """ # TODO: make sure openmm masses are the same as MDT masses + settime = settime if settime is not None else simtk2pint(state.getTime()) + report = dict( positions=simtk2pint(state.getPositions()), momenta=simtk2pint(state.getVelocities())*self.mol.dim_masses, forces=simtk2pint(state.getForces()), - time=simtk2pint(state.getTime()), + time=settime, vectors=simtk2pint(state.getPeriodicBoxVectors()), potential_energy=simtk2pint(state.getPotentialEnergy())) if self.annotation is not None: report['annotation'] = self.annotation @@ -110,16 +114,17 @@ def report(self, simulation, state): peheader = 'potential / {units}'.format(units=u.default.energy) keheader = 'kinetic / {units}'.format(units=u.default.energy) temperatureheader = 'T / {units}'.format(units=u.default.temperature) - print(self._row_format.format(timeheader, peheader, keheader, temperatureheader)) + print(self._header_format.format(timeheader, peheader, keheader, temperatureheader)) self._printed_header = True - ke = mdt.helpers.kinetic_energy(report['momenta'], self.mol.dim_masses) + ke = mdt.helpers.kinetic_energy(report['momenta'], self.mol.masses) t = (2.0 * ke) / (u.k_b * self.mol.dynamic_dof) print(self._row_format.format(report['time'].defunits_value(), report['potential_energy'].defunits_value(), ke.defunits_value(), t.defunits_value())) - self.last_report_time = self.mol.time + if settime: + self.last_report_time = report['time'] self.trajectory.new_frame(properties=report) def describeNextReport(self, simulation): @@ -356,3 +361,8 @@ def mol_to_modeller(mol): return app.Modeller(mol_to_topology(mol), pint2simtk(mol.positions)) + +def list_openmmplatforms(): + from simtk import openmm + return [openmm.Platform.getPlatform(ip).getName() + for ip in range(openmm.Platform.getNumPlatforms())] diff --git a/moldesign/interfaces/parmed_interface.py b/moldesign/interfaces/parmed_interface.py index 696f7c2..79c5259 100644 --- a/moldesign/interfaces/parmed_interface.py +++ b/moldesign/interfaces/parmed_interface.py @@ -246,39 +246,6 @@ def mol_to_parmed(mol): return struc -def _parmed_to_ff(topo, atom_map): - """ Create an MDT FFParameters object from a ParmEd topology - - Args: - topo (parmed.Structure): ParmEd structure (with FF terms) - atom_map (Mapping[parmed.Atom, moldesign.Atom]): mapping between MDT and ParmEd atoms - - Returns: - moldesign.forcefields.FFParameters: parameters in MDT format - """ - bonds = [mdt.forcefields.HarmonicBondTerm(atom_map[bond.a1], - atom_map[bond.a2], - bond.type.k*u.kcalpermol/u.angstrom ** 2, - bond.type.req*u.angstrom) - for bond in topo.bonds] - - angles = [mdt.forcefields.HarmonicAngleTerm(atom_map[angle.a1], - atom_map[angle.a2], - atom_map[angle.a3], - angle.type.k*u.kcalpermol/u.radian ** 2, - angle.type.theta_eq*u.degrees) - for angle in topo.angles] - - dihedrals = [mdt.forcefields.PeriodicTorsionTerm(atom_map[dihedral.a1], - atom_map[dihedral.a2], - atom_map[dihedral.a3], - atom_map[dihedral.a4], - dihedral.type.per, - dihedral.type.phi_k*u.kcalpermol, - dihedral.type.phase*u.degrees) - for dihedral in topo.dihedrals] - - def _reassign_chains(f, mol): """ Change chain ID assignments to the mmCIF standard (parmed uses author assignments) diff --git a/moldesign/interfaces/pdbfixer_interface.py b/moldesign/interfaces/pdbfixer_interface.py index 9db94cd..a72cc03 100644 --- a/moldesign/interfaces/pdbfixer_interface.py +++ b/moldesign/interfaces/pdbfixer_interface.py @@ -24,7 +24,7 @@ import imp import io import re - +import sys import numpy as np @@ -37,7 +37,7 @@ try: imp.find_module('pdbfixer') except (ImportError, OSError) as exc: - print('PDBFixer could not be imported; using remote docker container') + sys.stderr.write('Info: PDBFixer not installed; will run in docker container\n') force_remote = True else: force_remote = False diff --git a/moldesign/interfaces/pyscf_interface.py b/moldesign/interfaces/pyscf_interface.py index 03d9942..efc0258 100644 --- a/moldesign/interfaces/pyscf_interface.py +++ b/moldesign/interfaces/pyscf_interface.py @@ -18,9 +18,11 @@ # limitations under the License. import future.utils -import numpy as np +import sys import imp +import numpy as np + import moldesign.units as u from .. import compute from ..utils import if_not_none, redirect_stderr @@ -36,7 +38,7 @@ try: imp.find_module('pyscf') except (ImportError, OSError) as exc: - print('PySCF not installed; using remote docker container') + sys.stderr.write('Info: PySCF not installed; will run in docker container\n') force_remote = True else: force_remote = False diff --git a/moldesign/interfaces/qmmm.py b/moldesign/interfaces/qmmm.py deleted file mode 100644 index 10e5863..0000000 --- a/moldesign/interfaces/qmmm.py +++ /dev/null @@ -1,92 +0,0 @@ -from __future__ import print_function, absolute_import, division -from future.builtins import * -from future import standard_library -standard_library.install_aliases() - -# Copyright 2017 Autodesk Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -import moldesign as mdt -from ..methods import basemethods - - -class NonbondedQMMM(basemethods.QMMMBase): - """ - A simple QM/MM prescription that doesn't treat bonds between the QM and MM systems. - The QM and MM subsystems are coupled via Lennard-Jones and coulombic interactions: - $$H = H_{QM} + H_{MM} + H{inter},$$ where - $$H_{inter} = H_{LJ} + H_{coulomb}$$. - In practical terms, this means that the QM calculation must include the MM atoms as point charges, - while the MM calculation must include the QM atoms as unbonded, neutral lennard-jones spheres. - """ - - def prep(self): - for atom in self.params.qm_atoms: atom.props.subsystem = 'qm' - for atom in self.params.mm_atoms: atom.props.subsystem = 'mm' - - self._build_mm_system() - self._build_qm_system() - - self._prepped = True - - - def _build_qm_system(self): - # Set up the QM system - self.qmmol = mdt.Molecule(self.mol) - for atom, subatom in zip(self.mol.atoms, self.qmmol.atoms): - subatom.molecule_atom = atom - atom.props.qm_child = subatom - - # Make the MM atoms point charges - point_charges = {atom: atom.props.mm_child.ff.charge for atom in self.qmmol.atoms - if atom.molecule_atom.params.subsystem == 'mm'} - self.qm_model.params.point_charges = point_charges - self.qmmol.set_energy_model(self.qm_model) - self._subatoms = self.qmmol.atoms + self.mmol.atoms - - - def _build_mm_system(self): - # Set up the MM subsystem - includes all atoms, - # but we remove all FF terms except LJ - self.mmmol = mdt.Molecule(self.mol) - for atom, subatom in zip(self.mol.atoms, self.mmmol.atoms): - subatom.molecule_atom = atom - atom.props.mm_child = subatom - self.mmmol.set_energy_model(self.mm_model) - # Remove charges and bonds for QM atoms - ff = self.mm_model.params.ff - forcefield = ff.get_parameters(self.mmmol) - - def prune(termlist): # remove intra-qm region forces - # TODO: what about LJ forces??? - newterms = [] - for term in termlist: - subsystems = set([atom.molecule_atom.props.subsystem for atom in termlist.atom]) - subsystems = list(subsystems) - if len(subsystems) == 1 and subsystems[0] == 'mm': - newterms.append(subsystems) - elif len(subsystems) > 1: - raise ValueError('Bond crosses boundary: %s' % term) - - forcefield.bonds = prune(forcefield.bonds) - forcefield.angles = prune(forcefield.angles) - forcefield.dihedrals = prune(forcefield.dihedrals) - forcefield.impropers = prune(forcefield.impropers) - - def calculate(self, requests=None): - for atom in self._subatoms: - atom.position = atom.molecule_atom.position - - qmprops = self.qm_model.calculate() - mmprops = self.mm_model.calculate() - diff --git a/moldesign/mathutils.py b/moldesign/mathutils.py deleted file mode 100644 index e66f6b4..0000000 --- a/moldesign/mathutils.py +++ /dev/null @@ -1,104 +0,0 @@ -from __future__ import print_function, absolute_import, division -from future.builtins import * -from future import standard_library -standard_library.install_aliases() - -# Copyright 2017 Autodesk Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -import numpy as np - -from moldesign import units as u - - -def perpendicular(vec): - assert vec.shape == (3,) - direction = normalized(vec) - if abs(direction[2]) < 0.9: - cross_axis = np.array([0.0, 0.0, 1.0]) - else: - cross_axis = np.array([0.0, 1.0, 0.0]) - perp = normalized(np.cross(direction, cross_axis)) - return perp - - -def normalized(vec): - """ Return a vector normalized in L2. - If vector is 0, return 0 - - Args: - vec (u.Vector): vector to be normalized - - Returns: - u.Vector: normalized vector - """ - if len(vec.shape) == 1: # it's just a single column vector - mag = vec.dot(vec) - if mag == 0.0: - return vec*0.0 - else: - return vec/np.sqrt(mag) - else: # treat as list of vectors - mag = (vec*vec).sum(axis=1) - mag[mag == 0.0] = 1.0 # prevent div by 0 - return vec / np.sqrt(mag)[:, None] - -def safe_arccos(costheta): - """ Version of arccos that can handle numerical noise greater than 1.0 - """ - if hasattr(costheta, 'shape') and costheta.shape: # vector version - assert (np.abs(costheta)-1.0 < 1.0e-13).all() - costheta[costheta > 1.0] = 1.0 - costheta[costheta < -1.0] = -1.0 - return np.arccos(costheta) - - else: - if abs(costheta) > 1.0: - assert abs(costheta) - 1.0 < 1.0e-14 - return u.pi - else: - return np.arccos(costheta) - - -def sub_angles(a, b): - """ Subtract two angles, keeping the result within [-180,180) - """ - c = a - b - return (c + 180.0 * u.degrees) % (360.0 * u.degrees) - (180.0 * u.degrees) - - -def apply_4x4_transform(trans, vecs): - """ - Applies a 4x4 transformation vector so one or more 3-D position vector - :param trans: - :param vecs: - :return: transformed position vector - """ - has_units = False - if hasattr(vecs, 'get_units'): - has_units = True - units = vecs.get_units() - vecs = vecs.magnitude - if len(vecs.shape) == 1: - v = np.ones(4) - v[:3] = vecs - vt = trans.dot(v) - result = vt[:3] / vt[3] - else: - v = np.ones((4, len(vecs))) - v[:3, :] = vecs.T - vt = trans.dot(v) - result = (vt[:3] / vt[3]).T - if has_units: - result = result * units - return result \ No newline at end of file diff --git a/moldesign/mathutils/__init__.py b/moldesign/mathutils/__init__.py new file mode 100644 index 0000000..2736341 --- /dev/null +++ b/moldesign/mathutils/__init__.py @@ -0,0 +1,2 @@ +from .vectormath import * +from .eigen import * diff --git a/moldesign/mathutils/eigen.py b/moldesign/mathutils/eigen.py new file mode 100644 index 0000000..2c986fb --- /dev/null +++ b/moldesign/mathutils/eigen.py @@ -0,0 +1,100 @@ +from __future__ import print_function, absolute_import, division +from future import standard_library +standard_library.install_aliases() +from future.builtins import * + +# Copyright 2017 Autodesk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from .. import units as u +from ..utils import exports +from ..mathutils import normalized + + +@exports +class Eigenspace(object): + """ Holds sets of eigenvactors and eigenvalues, offers helpful methods for organizing them. + + Args: + evals (List[Scalar]): list of eigenvalues + evecs (List[Vector]): list of eigenvectors (in the same order as eigenvalues). These will + automatically be normalized + + Note: + The eigenvectors from many eigenvector solvers - notably including scipy's - will need to be + transposed to fit the form of ``evecs`` here! + + It's generally assumed that Eigenspace objects will be subclassed to wrap various bits of + eignproblem-related functionality. + """ + def __init__(self, evals, evecs): + if len(evals) != len(evecs): + raise ValueError('Eigenvalues and eigenvectors have different lengths!') + + self.evals = u.array(evals) + self.evecs = u.array([normalized(evec, zero_as_zero=True) + for evec in evecs]) + + def __str__(self): + return "%s of dimension %s" % (self.__class__.__name__, len(self.evals)) + + def sort(self, largest_first=True, key=abs): + """ Sort the eigenvectors and values in place* + + By default, this sorts from largest to smallest by the _absolute magnitude_ of the + eigenvalues. + + Note: + *this sort is only "in place" in the sense that it mutates the data in this instance; + note that it still uses auxiliary memroy + + Args: + largest_first (bool): sort from largest to smallest (equivalent to ``reverse=True`` in a + standard python sort, except that it is true by default here) + key (callable): function of the form ``f(eigenval)`` OR ``f(eval, evec)``. + By default, sorts by the ``abs`` of the eigenvalues + """ + try: # construct the sorting function + result = key(self.evals[0], self.evecs[0]) + except TypeError: + def keyfn(t): + return key(t[0]) + else: + def keyfn(t): + return key(t[0], t[1]) + + evals, evecs = zip(*sorted(zip(self.evals.copy(), self.evecs.copy()), + key=keyfn, reverse=largest_first)) + self.evals[:] = evals + self.evecs[:] = evecs + + def transform(self, coords): + """ Transform a list of coordinates (or just a single one) into this eigenbasis + + Args: + coords (List[Vector] or Vector): coordinate(s) to transform + + Returns: + List[Vector] or vector: transformed coordinate(s) + """ + c = u.array(coords) + dims = len(c.shape) + if dims == 1: + return u.dot(self.evecs, c) + elif dims == 2: + return u.dot(self.evecs, c.T).T + else: + raise ValueError('Transform accepts only 1- or 2-dimensional arrays') + + diff --git a/moldesign/mathutils/vectormath.py b/moldesign/mathutils/vectormath.py new file mode 100644 index 0000000..251f4d6 --- /dev/null +++ b/moldesign/mathutils/vectormath.py @@ -0,0 +1,190 @@ +from __future__ import print_function, absolute_import, division +from future.builtins import * +from future import standard_library +standard_library.install_aliases() + +# Copyright 2017 Autodesk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import numpy as np + +from .. import units as u +from ..utils import exports + + +@exports +def perpendicular(vec): + """ Return arbitrary unit vector(s) perpendicular to one or more vectors. + + This obviously doesn't have a unique solution, but is useful for various computations. + + Args: + vec (Vector or List[Vector]): 3-D vector or list thereof + + Returns: + vec (np.ndarray): normalized unit vector in a perpendicular direction + """ + vectorized = len(vec.shape) > 1 + direction = normalized(vec) + if vectorized: + cross_axis = np.array([[0.0, 0.0, 1.0] if d[2] < 0.9 else [0.0, 1.0, 0.0] + for d in direction]) + else: + if abs(direction[2]) < 0.9: + cross_axis = np.array([0.0, 0.0, 1.0]) + else: + cross_axis = np.array([0.0, 1.0, 0.0]) + perp = normalized(np.cross(direction, cross_axis)) + return perp + + +@exports +def norm(vec): + """ Calculate norm of a vector or list thereof + + Args: + vec (Vector or List[Vector]): vector(s) to compute norm of + + Returns: + Scalar or List[Scalar]: norms + """ + if len(vec.shape) == 1: # it's just a single column vector + return np.sqrt(vec.dot(vec)) + else: # treat as list of vectors + return np.sqrt((vec*vec).sum(axis=1)) + + +@exports +def normalized(vector, zero_as_zero=True): + """ Create normalized versions of a vector or lists of vectors. + + Args: + vector (Vector or List[Vector]): vector(s) to be normalized + zero_as_zero (bool): if True, return a 0-vector if a 0-vector is passed; otherwise, will + follow default system behavior (depending on numpy's configuration) + + Returns: + Vector or List[Vector]: normalized vector(s) + """ + vec = getattr(vector, 'magnitude', vector) # strip units right away if necessary + mag = norm(vec) + if len(vec.shape) == 1: # it's just a single column vector + if mag == 0.0 and zero_as_zero: + return vec*0.0 + else: + return vec/mag + else: # treat as list of vectors + if zero_as_zero: + mag[mag == 0.0] = 1.0 # prevent div by 0 + return vec / mag[:, None] + + +@exports +def alignment_rotation(v1, v2, handle_linear=True): + """ Calculate rotation angle(s) and axi(e)s to make v1 parallel with v2 + + Args: + v1 (vector or List[Vector]): 3-dimensional vector(s) to create rotation for + v2 (vector or List[Vector]): 3-dimensional vector(s) to make v1 parallel to + handle_linear (bool): if v1 is parallel or anti-parallel to v2, return an arbitrary + vector perpendicular to both as the axis (otherwise, returns a 0-vector) + + Returns: + MdtQuantity[angle]: angle between the two + np.ndarray[len=3]: rotation axis (unit vector) + + References: + https://stackoverflow.com/a/10145056/1958900 + """ + e1 = normalized(v1) + e2 = normalized(v2) + + vectorize = len(e1.shape) > 1 + + normal = np.cross(e1, e2) + s = norm(normal) + if vectorize: + c = (e1*e2).sum(axis=1) + if handle_linear: + linear_indices = s == 0.0 + if linear_indices.any(): + normal[linear_indices] = perpendicular(v1[linear_indices]) + s[linear_indices] = 1.0 + else: + c = np.dot(e1, e2) + if handle_linear and s == 0.0: + normal = perpendicular(v1) + s = 1.0 + + angle = np.arctan2(s, c) + return angle*u.radian, normal / s + + +@exports +def safe_arccos(costheta): + """ Version of arccos that can handle numerical noise greater than 1.0 + """ + if hasattr(costheta, 'shape') and costheta.shape: # vector version + assert (np.abs(costheta)-1.0 < 1.0e-13).all() + costheta[costheta > 1.0] = 1.0 + costheta[costheta < -1.0] = -1.0 + return np.arccos(costheta) + + else: + if abs(costheta) > 1.0: + assert abs(costheta) - 1.0 < 1.0e-14 + return u.pi + else: + return np.arccos(costheta) + + +@exports +def sub_angles(a, b): + """ Subtract two angles, keeping the result within [-180,180) + """ + return normalize_angle(a - b) + + +@exports +def normalize_angle(c): + """ Normalize an angle to the interval [-180,180) + """ + return (c + 180.0 * u.degrees) % (360.0 * u.degrees) - (180.0 * u.degrees) + + +@exports +def apply_4x4_transform(trans, vecs): + """ + Applies a 4x4 transformation vector so one or more 3-D position vector + :param trans: + :param vecs: + :return: transformed position vector + """ + has_units = False + if hasattr(vecs, 'get_units'): + has_units = True + units = vecs.get_units() + vecs = vecs.magnitude + if len(vecs.shape) == 1: + v = np.ones(4) + v[:3] = vecs + vt = trans.dot(v) + result = vt[:3] / vt[3] + else: + v = np.ones((4, len(vecs))) + v[:3, :] = vecs.T + vt = trans.dot(v) + result = (vt[:3] / vt[3]).T + if has_units: + result = result * units + return result diff --git a/moldesign/method.py b/moldesign/method.py index 0a00095..44bf6cf 100644 --- a/moldesign/method.py +++ b/moldesign/method.py @@ -87,6 +87,13 @@ def __init__(self, **params): if param.name not in self.params: self.params[param.name] = param.default + @classmethod + def supports_parameter(cls, paramname): + for parameter in cls.PARAMETERS: + if parameter.name == paramname: + return True + else: + return False def __eq__(self, other): return self.__class__ is other.__class__ and self.params == other.params diff --git a/moldesign/min/descent.py b/moldesign/min/descent.py index 1dc313f..e6955d1 100644 --- a/moldesign/min/descent.py +++ b/moldesign/min/descent.py @@ -59,18 +59,22 @@ def __init__(self, mol, gamma=0.4, control=0.25, **kwargs): super().__init__(mol, **kwargs) - assert 'forces' in self.request_list, 'Gradient descent built-in gradients' + assert 'forces' in self.request_list, 'Gradient descent requires built-in gradients' self.max_atom_move = max_atom_move self.scaling = scaling self.gamma = gamma self.control = control self._last_energy = None + self._constraintlist = None def _run(self): print('Starting geometry optimization: built-in gradient descent') lastenergy = self.objective(self._coords_to_vector(self.mol.positions)) current = self._coords_to_vector(self.mol.positions) + if self.mol.constraints: + self._constraintlist = mdt.geom.get_base_constraints(self.mol.constraints) + for i in range(self.nsteps): grad = self.grad(current) if np.abs(grad.max()) < self.force_tolerance: # converged @@ -126,7 +130,7 @@ def _make_move(self, current, move): prev = self.mol.positions.copy() self._sync_positions(current+move) - mdt.geom.shake_positions(self.mol, prev) + mdt.geom.shake_positions(self.mol, prev, constraints=self._constraintlist) return self._coords_to_vector(self.mol.positions) else: return current + move diff --git a/moldesign/min/scipy.py b/moldesign/min/scipy.py index f822624..10f0cdb 100644 --- a/moldesign/min/scipy.py +++ b/moldesign/min/scipy.py @@ -65,13 +65,19 @@ def _run(self): else: print('WARNING: no convergence criteria for this method; using defaults') + self._optimize_kwargs = dict(method=self._METHOD_NAME, + options=options) + self._constraint_multiplier = 1.0 + result = scipy.optimize.minimize(self.objective, self._coords_to_vector(self.mol.positions), - method=self._METHOD_NAME, jac=grad, callback=self.callback, - options=options, - constraints=self._make_constraints()) + constraints=self._make_constraints(), + **self._optimize_kwargs) + + if self.mol.constraints: + result = self._force_constraint_convergence(result) self.traj.info = result @@ -79,23 +85,53 @@ def _run(self): self.mol.positions = finalprops.positions self.mol.properties = finalprops + def _force_constraint_convergence(self, result): + """ Make sure that all constraints are satisfied, ramp up the constraint functions if not + + Note - if additional iterations are necessary, this will destroy the scipy optimize results + object stored at self.traj.info. Not sure what to do about that + """ + import scipy.optimize + + for i in range(5): + for constraint in self.mol.constraints: + if not constraint.satisfied(): + break + else: + return result + + print('Constraints not satisfied; raising penalties ...') + + self._constraint_multiplier *= 10.0 + result = scipy.optimize.minimize(self.objective, + self._coords_to_vector(self.mol.positions), + jac=self.grad if self.gradtype=='analytical' else None, + callback=self.callback, + constraints=self._make_constraints(), + **self._optimize_kwargs) + return result + def _make_constraints(self): + from .. import geom + constraints = [] - for constraint in self.mol.constraints: + for constraint in geom.get_base_constraints(self.mol.constraints): fun, jac = self._make_constraint_funs(constraint) constraints.append(dict(type='eq', fun=fun, jac=jac)) return constraints + def _make_constraint_funs(self, const): def fun(v): self._sync_positions(v) - return const.error().defunits_value() + return const.error().defunits_value() * self._constraint_multiplier def jac(v): self._sync_positions(v) - return const.gradient().defunits_value().reshape(self.mol.num_atoms*3) + return (const.gradient().defunits_value().reshape(self.mol.num_atoms*3) + * self._constraint_multiplier) return fun, jac diff --git a/moldesign/models/__init__.py b/moldesign/models/__init__.py index 3288a85..ec0ab65 100644 --- a/moldesign/models/__init__.py +++ b/moldesign/models/__init__.py @@ -5,3 +5,4 @@ from .amber import * from .openbabel import * from .nwchem import * +from .qmmm import * \ No newline at end of file diff --git a/moldesign/models/base.py b/moldesign/models/base.py index cb2a1d7..514a866 100644 --- a/moldesign/models/base.py +++ b/moldesign/models/base.py @@ -156,14 +156,11 @@ def set_wfn_guess(self): class QMMMBase(EnergyModelBase): - DEFAULT_PROPERTIES = ['potential_energy', - 'qm_energy', - 'mm_energy', - 'interaction_energy' - 'qm_dipole_moment', - 'orbitals', - 'orbital_energies'] - ALL_PROPERTIES = DEFAULT_PROPERTIES + # DEFAULT_PROPERTIES = ['potential_energy', + # 'forces', + # 'qm_props', + # 'mm_props'] + # ALL_PROPERTIES = DEFAULT_PROPERTIES PARAMETERS = MMBase.PARAMETERS + QMBase.PARAMETERS diff --git a/moldesign/models/jsonmodel.py b/moldesign/models/jsonmodel.py new file mode 100644 index 0000000..aff9c00 --- /dev/null +++ b/moldesign/models/jsonmodel.py @@ -0,0 +1,166 @@ +# Copyright 2016 Autodesk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import json + +import pyccc + +import moldesign as mdt +from moldesign import units as u + +from .base import EnergyModelBase + + +class JsonModelBase(EnergyModelBase): + """ Abstract energy model interface using JSON inputs and outputs + """ + IMAGE = None # base name of the docker image + MODELNAME = 'abstract model' + + RUNNER = 'run.py' + PARSER = 'getresults.py' + + def prep(self): + parameters = self.params.copy() + + parameters['constraints'] = [] + for constraint in self.mol.constraints: + self._handle_constraint(constraint) + + parameters['charge'] = self.mol.charge.value_in(u.q_e) + self._jobparams = parameters + self._prepped = True + + def calculate(self, requests=None): + if requests is None: + requests = self.DEFAULT_PROPERTIES + job = self._make_calculation_job(requests) + + return mdt.compute.run_job(job, _return_result=True) + + def _handle_constraint(self, constraint): + raise NotImplementedError() + + def _make_calculation_job(self, requests=None): + params, inputfiles = self._prep_calculation(requests) + inputfiles['params.json'] = mdt.utils.json_dumps(dict(params)) + job = pyccc.Job(image=mdt.compute.get_image_path(self.IMAGE), + command='%s && %s' % (self.RUNNER, self.PARSER), + inputs=inputfiles, + when_finished=self.finish, + name='%s/%s' % (self.MODELNAME, self.mol.name)) + return job + + def _prep_calculation(self, requests): + self.prep() + parameters = self._jobparams.copy() + parameters['runType'] = 'singlePoint' + parameters['properties'] = list(requests) + if self.mol.constraints: + self.write_constraints(parameters) + inputfiles = self._get_inputfiles() + return parameters, inputfiles + + def finish(self, job): + results = json.loads(job.get_output('results.json').read()) + return self._process_results(results) + + def _process_results(self, results): + assert len(results['states']) == 1 + jsonprops = results['states'][0]['calculated'] + if 'orbitals' in jsonprops: + wfn = self._make_wfn(results['states'][0]) + else: + wfn = None + + result = mdt.MolecularProperties(self.mol, + **self._json_to_quantities(jsonprops)) + if wfn: + result['wfn'] = wfn + return result + + def _make_wfn(self, state): + from moldesign import orbitals + + try: + basis_fns = state['calculated']['method']['aobasis'] + except KeyError: + basis_set = None + else: + bfs = [orbitals.AtomicBasisFunction(**bdata) for bdata in basis_fns] + basis_set = orbitals.BasisSet(self.mol, + orbitals=bfs, + name=self.params.basis) + wfn = orbitals.ElectronicWfn(self.mol, + self.mol.num_electrons, + aobasis=basis_set) + + for setname, orbdata in state['calculated']['orbitals'].items(): + orbs = [] + for iorb in range(len(orbdata['coefficients'])): + orbs.append(orbitals.Orbital(orbdata['coefficients'][iorb])) + if 'occupations' in orbs: + orbs[-1].occupation = orbdata['occupations'][iorb] + wfn.add_orbitals(orbs, orbtype=setname) + + return wfn + + @staticmethod + def _json_to_quantities(jsonprops): # TODO: handle this within JSON decoder + props = {} + for name, property in jsonprops.items(): + if isinstance(property, dict) and len(property) == 2 and \ + 'units' in property and 'value' in property: + props[name] = property['value'] * u.ureg(property['units']) + else: + props[name] = property + + return props + + def _get_inputfiles(self): + """ Override this method to pass additional input files to the program + """ + return {} + + def minimize(self, nsteps=None): + job = self._make_minimization_job(nsteps) + + return mdt.compute.run_job(job, _return_result=True) + + def _make_minimization_job(self, nsteps): + params, inputfiles = self._prep_calculation([self.DEFAULT_PROPERTIES]) + params['runType'] = 'minimization' + if nsteps is not None: + params['minimization_steps'] = 100 + inputfiles['params.json'] = mdt.utils.json_dumps(dict(params)) + + job = pyccc.Job(image=mdt.compute.get_image_path(self.IMAGE), + command='%s && %s' % (self.RUNNER, self.PARSER), + inputs=inputfiles, + when_finished=self.finish_min, + name='%s/%s' % (self.MODELNAME, self.mol.name)) + return job + + def finish_min(self, job): + # TODO: parse more data than just the final minimization state + traj = mdt.Trajectory(self.mol) + traj.new_frame() + + results = json.loads(job.get_output('results.json').read()) + new_state = self._json_to_quantities(results['states'][0]) + + self.mol.positions = new_state['positions'] + self.mol.properties = self._process_results(results) + traj.new_frame() + return traj + diff --git a/moldesign/models/nwchem.py b/moldesign/models/nwchem.py index 6db7776..1226816 100644 --- a/moldesign/models/nwchem.py +++ b/moldesign/models/nwchem.py @@ -1,9 +1,4 @@ -from __future__ import print_function, absolute_import, division -from future.builtins import * -from future import standard_library -standard_library.install_aliases() - -# Copyright 2017 Autodesk Inc. +# Copyright 2016 Autodesk Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -16,62 +11,36 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +import itertools import json +import numpy as np import pyccc import moldesign as mdt -from moldesign import units as u -from moldesign.utils import exports -from .base import QMBase +from moldesign.utils import exports +from moldesign import units as u -IMAGE = 'nwchem' +from .base import QMBase, QMMMBase +from .jsonmodel import JsonModelBase @exports -class NWChemQM(QMBase): +class NWChemQM(JsonModelBase, QMBase): """ Interface with NWChem package (QM only) Note: This is the first interface based on our new wrapping strategy. This is slightly hacked, but has the potential to become very general; very few things here are NWChem-specific """ - + IMAGE = 'nwchem' + MODELNAME = 'nwchem' DEFAULT_PROPERTIES = ['potential_energy'] + ALL_PROPERTIES = DEFAULT_PROPERTIES + 'forces dipole esp'.split() - def prep(self): - parameters = self.params.copy() - - parameters['constraints'] = [] - for constraint in self.mol.constraints: - raise NotImplementedError() - - parameters['charge'] = self.mol.charge.value_in(u.q_e) - self._jobparams = parameters - self._prepped = True - - def calculate(self, requests=None): - if requests is None: requests = self.DEFAULT_PROPERTIES - job = self._make_calculation_job(requests) - - return mdt.compute.run_job(job, _return_result=True) - - def _make_calculation_job(self, requests=None): - self.prep() - parameters = self._jobparams.copy() - parameters['runType'] = 'singlePoint' - parameters['properties'] = list(requests) - if self.mol.constraints: - self.write_constraints(parameters) - job = pyccc.Job( # image=mdt.compute.get_image_path(IMAGE), - image=IMAGE, - command='run.py && getresults.py', - inputs={'input.xyz': self.mol.write(format='xyz'), - 'params.json': json.dumps(parameters)}, - when_finished=self.finish, - name='nwchem/%s'%self.mol.name) - return job + def _get_inputfiles(self): + return {'input.xyz': self.mol.write(format='xyz')} def write_constraints(self, parameters): parameters['constraints'] = [] @@ -79,7 +48,7 @@ def write_constraints(self, parameters): if not constraint.satisfied(): # TODO: factor this out into NWChem subclass raise ValueError('Constraints must be satisfied before passing to NWChem %s' - %constraint) + % constraint) cjson = {'type': constraint['desc'], 'value': constraint['value'].to_json()} @@ -90,57 +59,116 @@ def write_constraints(self, parameters): cjson['atomIdx2'] = constraint.a2.index - def finish(self, job): - results = json.loads(job.get_output('results.json').read()) - return self._process_results(results) - - def _process_results(self, results): - assert len(results['states']) == 1 - jsonprops = results['states'][0]['calculated'] - result = mdt.MolecularProperties(self.mol, - **self._get_properties(jsonprops)) - return result - - @staticmethod - def _get_properties(jsonprops): - props = {} - for name, property in jsonprops.items(): - if isinstance(property, dict) and len(property) == 2 and \ - 'units' in property and 'value' in property: - props[name] = property['value'] * u.ureg(property['units']) - else: - props[name] = property - - return props - - def minimize(self, nsteps=None): - job = self._make_minimization_job(nsteps) - - return mdt.compute.run_job(job, _return_result=True) - - def _make_minimization_job(self, nsteps): - self.prep() - parameters = self._jobparams.copy() - parameters['runType'] = 'minimization' - if nsteps is not None: - parameters['minimization_steps'] = 100 - job = pyccc.Job( # image=mdt.compute.get_image_path(IMAGE), - image=IMAGE, - command='run.py && getresults.py', - inputs={'input.xyz': self.mol.write(format='xyz'), - 'params.json': json.dumps(parameters)}, - when_finished=self.finish_min, - name='nwchem/%s' % self.mol.name) - return job +@exports +class NWChemQMMM(NWChemQM): + """ Interface with NWChem package for QM/MM only. Note that this is currently only set up for + optimizations, and only of the QM geometry - the MM region cannot move. + """ + IMAGE = 'nwchem' + MODELNAME = 'nwchem_qmmmm' + DEFAULT_PROPERTIES = ['potential_energy', 'forces', 'esp'] + ALL_PROPERTIES = DEFAULT_PROPERTIES + RUNNER = 'runqmmm.py' + PARSER = 'getresults.py' + PARAMETERS = NWChemQM.PARAMETERS + [mdt.parameters.Parameter('qm_atom_indices')] + + def _get_inputfiles(self): + crdparamfile = self._makecrdparamfile() + return {'nwchem.crdparams': crdparamfile} + + def _makecrdparamfile(self, include_mmterms=True): + pmdparms = self.mol.ff.parmed_obj + + lines = ['qm'] + qmatom_idxes = set(self.params.qm_atom_indices) + + def crosses_boundary(*atoms): + total = 0 + inqm = 0 + for atom in atoms: + total += 1 + if atom.idx in qmatom_idxes: + inqm += 1 + return inqm != 0 and inqm < total + + # write QM atoms + for atomidx in sorted(self.params.qm_atom_indices): + atom = self.mol.atoms[atomidx] + x, y, z = atom.position.value_in(u.angstrom) + lines.append(' %d %s %24.14f %24.14f %24.14f' % + (atom.index+1, atom.element, x, y, z)) + qmatom_idxes.add(atom.index) + + # write MM atoms + lines.append('end\n\nmm') + for atom, patm in zip(self.mol.atoms, pmdparms.atoms): + assert atom.index == patm.idx + assert atom.atnum == patm.element + x, y, z = atom.position.value_in(u.angstrom) + if atom.index not in qmatom_idxes: + lines.append(' %d %s %24.14f %24.14f %24.14f %24.14f' + %(atom.index+1, atom.element, x, y, z, patm.charge)) + + lines.append('end\n\nbond\n# i j k_ij r0') + if include_mmterms: + for term in pmdparms.bonds: + if crosses_boundary(term.atom1, term.atom2): + lines.append(' %d %d %20.10f %20.10f' % + (term.atom1.idx+1, term.atom2.idx+1, term.type.k, term.type.req)) + + lines.append('end\n\nangle\n# i j k k_ijk theta0') + if include_mmterms: + for term in pmdparms.angles: + if crosses_boundary(term.atom1, term.atom2, term.atom3): + lines.append(' %d %d %d %20.10f %20.10f' % + (term.atom1.idx+1, term.atom2.idx+1, term.atom3.idx+1, + term.type.k, term.type.theteq)) + + lines.append('end\n\ndihedral\n' + '# i j k l k_ijkl periodicity phase') + if include_mmterms: + for term in pmdparms.dihedrals: + if crosses_boundary(term.atom1, term.atom2, term.atom3, term.atom4): + lines.append(' %d %d %d %d %20.10f %d %20.10f' % + (term.atom1.idx+1, term.atom2.idx+1, term.atom3.idx+1, term.atom4.idx+1, + term.type.phi_k, term.type.per, term.type.phase)) + + lines.append('end\n\nvdw\n' + '# i j A_coeff B_coeff') + if include_mmterms: + for atom1idx, atom2 in itertools.product(qmatom_idxes, pmdparms.atoms): + if atom2.idx in qmatom_idxes: continue + atom1 = pmdparms.atoms[atom1idx] + epsilon = np.sqrt(atom1.epsilon * atom2.epsilon) + if epsilon == 0: continue + sigma = (atom1.sigma + atom2.sigma) / 2.0 + lj_a = 4.0 * epsilon * sigma**12 + lj_b = 4.0 * epsilon * sigma**6 + lines.append(' %d %d %20.10e %20.10e' % + (atom1.idx+1, atom2.idx+1, lj_a, lj_b)) + + lines.append('end\n\nscaled_vdw\n' + '# i j A_coeff B_coeff one_scnb') + # TODO: this part + lines.append('end') + + return pyccc.files.StringContainer('\n'.join(lines)) + def finish_min(self, job): - # TODO: parse more data than just the final minimization state - properties = self.finish(job) traj = mdt.Trajectory(self.mol) traj.new_frame() - self.mol.positions = properties.positions + + results = json.loads(job.get_output('results.json').read()) + new_state = self._json_to_quantities(results['states'][0]) + + for iatom in sorted(self.params.qm_indices): + for position in new_state['positions']: + self.mol.atoms[iatom].position = position + + properties = self._process_results(results) + properties.positions = self.mol.positions self.mol.properties = properties traj.new_frame() return traj - diff --git a/moldesign/models/openmm.py b/moldesign/models/openmm.py index c6ab6e8..4fd1852 100644 --- a/moldesign/models/openmm.py +++ b/moldesign/models/openmm.py @@ -16,14 +16,28 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +from future.utils import native_str import moldesign.molecules from moldesign import compute -from moldesign.molecules import Trajectory, MolecularProperties -from moldesign.utils import exports - -import moldesign.interfaces.openmm as opm +from ..molecules import Trajectory, MolecularProperties +from ..utils import exports +from ..interfaces import openmm as opm from .base import MMBase +from .. import parameters + +openmm_platform_selector = parameters.Parameter( + 'compute_platform', 'OpenMM computing platform', + type=str, default='cpu', choices=['opencl', 'cuda', 'cpu', 'reference', 'auto'], + help_url='http://docs.openmm.org/7.1.0/userguide/library.html#platforms') + +numcpus = parameters.num_cpus.copy() +numcpus.relevance = parameters.WhenParam('compute_platform', parameters.op.eq, 'cpu') +numcpus.help = ('Sets number of threads for OpenMM CPU platform. ' + 'If 0, uses OpenMM defaults (which can be controlled ' + 'via the OPENMM_NUM_THREADS environment variable). ') +numcpus.help_url = \ + 'http://docs.openmm.org/7.1.0/userguide/library.html#platform-specific-properties' @exports @@ -32,20 +46,27 @@ class OpenMMPotential(MMBase, opm.OpenMMPickleMixin): Note that, while a dummy integrator is assigned, a different context will be created for any MD calculations. - :ivar sim: openmm simulation object - :type sim: simtk.openmm.app.Simulation + Attributes: + sim (simtk.openmm.app.Simulation): OpenMM simulation object (once created) """ # NEWFEATURE: need to set/get platform (and properties, e.g. number of threads) DEFAULT_PROPERTIES = ['potential_energy', 'forces'] + PARAMETERS = MMBase.PARAMETERS + [openmm_platform_selector, numcpus] _CALLS_MDT_IN_DOCKER = opm.force_remote _openmm_compatible = True def __init__(self, **kwargs): super().__init__(**kwargs) + self._reset() + + def _reset(self): self.sim = None self.mm_system = None - self._prep_integrator = 'uninitialized' + self.mm_integrator = None + self._prepped_integrator = 'uninitialized' + self._constraints_set = False + self._required_tolerance = None def get_openmm_simulation(self): if opm.force_remote: @@ -74,52 +95,74 @@ def calculate(self, requests=None): forces=opm.simtk2pint(state.getForces(), flat=False)) return props - def prep(self, force=False): - """ - Drive the construction of the openmm simulation - This will rebuild this OpenMM simulation if: A) it's not built yet, or B) - there's a new integrator + def prep(self): + """ Construct the OpenMM simulation objects + + Note: + An OpenMM simulation object consists of both the system AND the integrator. This routine + therefore constructs both. If self.mol does not use an OpenMM integrator, we create + an OpenMM simulation with a "Dummy" integrator that doesn't ever get used. """ if opm.force_remote: return True + from simtk.openmm import app - # TODO: automatically set _prepped to false if the model or integration parameters change - if not force: - if self._prepped and self._prep_integrator == self.mol.integrator: - return + if getattr(self.mol.integrator, '_openmm_compatible', False): + _prepped = (self._prepped and self.mol.integrator._prepped and + self.mol.integrator is self._prepped_integrator) + setup_integrator = True + else: + _prepped = self._prepped + setup_integrator = False + if _prepped: + return + + self._reset() system_params = self._get_system_params() self.mm_system = self.mol.ff.parmed_obj.createSystem(**system_params) - if self.mol.integrator is None: - integrator = self._make_dummy_integrator() + if setup_integrator: + try: + self._set_constraints() + except moldesign.NotSupportedError as exc: + print("Warning: dynamics not supported: %s" % exc.args[0]) + self.mm_integrator = self.mol.integrator.get_openmm_integrator() else: - integrator = self.mol.integrator.get_openmm_integrator() + self.mm_integrator = self._make_dummy_integrator() + + platform, platform_properties = self._get_platform() + + if self._required_tolerance: + self.mm_integrator.setConstraintTolerance(float(self._required_tolerance)) + self.sim = app.Simulation(self.mol.ff.parmed_obj.topology, + self.mm_system, + self.mm_integrator, + platform=platform, + platformProperties=platform_properties) + + if setup_integrator: + self.mol.integrator.energy_model = self + self.mol.integrator.sim = self.sim + self.mol.integrator._prepped = True - self._set_constraints() - self.sim = app.Simulation(self.mol.ff.parmed_obj.topology, self.mm_system, integrator) self._prepped = True + self._prepped_integrator = self.mol.integrator print('Created OpenMM kernel (Platform: %s)' % self.sim.context.getPlatform().getName()) - self._prep_integrator = self.mol.integrator - - def reset_constraints(self): - self._set_constraints() def minimize(self, **kwargs): if self.constraints_supported(): traj = self._minimize(**kwargs) - if opm.force_remote or (not kwargs.get('wait', False)): self._sync_remote(traj.mol) traj.mol = self.mol - return traj else: return super().minimize(**kwargs) def _sync_remote(self, mol): - # TODO: this is a hack to update the object after a minimization + # TODO: this is a hack to update the molecule object after a minimization # We need a better pattern for this, ideally one that doesn't # require an explicit wrapper like this - we shouldn't have to copy # the properties over manually @@ -142,7 +185,7 @@ def _minimize(self, nsteps=500, [energy/length] """ - # NEWFEATURE: write/find an openmm "integrator" to do this minimization + # NEWFEATURE: write/find an openmm "integrator" to do this minimization. # openmm doesn't work with small step numbers, and doesn't support # callbacks during minimization, so frame_interval is disabled. if frame_interval is not None: @@ -164,19 +207,25 @@ def _minimize(self, nsteps=500, def constraints_supported(self): """ Check whether this molecule's constraints can be enforced in OpenMM + + This sort of overlaps with _set_constraints, but doesn't have dependencies on OpenMM """ for constraint in self.mol.constraints: - if constraint.desc not in ('position', 'distance'): + if constraint.desc not in ('position', 'distance', 'hbonds'): return False else: return True - ################################################# - # "Private" methods for managing OpenMM are below def _set_constraints(self): + if self._constraints_set: + return system = self.mm_system fixed_atoms = set() + # openmm uses a global tolerance, calculated as ``constraint_violation/constraint_dist`` + # (since only distance constraints are supported). Here we calculate the necessary value + required_tolerance = None + # Constrain atom positions for constraint in self.mol.constraints: if constraint.desc == 'position': @@ -192,6 +241,17 @@ def _set_constraints(self): constraint.a2.index, opm.pint2simtk(constraint.value)) + if required_tolerance is None: + required_tolerance = 1e-5 + required_tolerance = min(required_tolerance, constraint.tolerance/constraint.value) + + elif constraint.desc == 'hbonds': + continue # already dealt with at system creation time + + else: + raise moldesign.NotSupportedError("OpenMM does not support '%s' constraints" % + constraint.desc) + # Workaround for OpenMM issue: can't have an atom that's both # fixed *and* has a distance constraint. If both atoms in the distance constraint are # also fixed, then we can just remove the constraint @@ -211,6 +271,9 @@ def _set_constraints(self): else: ic += 1 + self._constraints_set = True + self._required_tolerance = required_tolerance + @staticmethod def _make_dummy_integrator(): from simtk import unit as stku @@ -261,7 +324,9 @@ def _get_system_params(self): nonbonded_names = {'nocutoff': app.NoCutoff, 'ewald': app.Ewald, 'pme': app.PME, - 'cutoff': app.CutoffPeriodic if self.params.periodic else app.CutoffNonPeriodic} + 'cutoff': (app.CutoffPeriodicif + if self.params.periodic + else app.CutoffNonPeriodic)} implicit_solvent_names = {'obc': app.OBC2, 'obc1': app.OBC1, None: None} @@ -270,7 +335,7 @@ def _get_system_params(self): nonbondedCutoff=opm.pint2simtk(self.params.cutoff), implicitSolvent=implicit_solvent_names[self.params.implicit_solvent]) - system_params['rigidWater'] = False + system_params['rigidWater'] = False # not currently supported (because I'm lazy) system_params['constraints'] = None if self.mol.integrator is not None: if self.mol.integrator.params.get('constrain_water', False): @@ -278,10 +343,40 @@ def _get_system_params(self): if self.mol.integrator.params.get('constrain_hbonds', False): system_params['constraints'] = app.HBonds + # Deal with h-bonds listed in molecular constraints + for constraint in self.mol.constraints: + if constraint.desc == 'hbonds': + system_params['constraints'] = app.HBonds + break + return system_params + def _get_platform(self): + from simtk import openmm + + preference = ['CUDA', 'OpenCL', 'CPU', 'Reference'] + from_lower = {x.lower(): x for x in preference} + + properties = {} + + if self.params.compute_platform.lower() == 'auto': + for platname in preference: + try: + platform = openmm.Platform.getPlatformByName(platname) + except Exception: # it just throws "Exception" unfortunately + continue + else: + self.params.compute_platform = platname.lower() + break + + raise moldesign.NotSupportedError("Likely OpenMM installation error. " + "none of the expected platforms were found: " + + ', '.join(preference)) + else: + platform = openmm.Platform.getPlatformByName(from_lower[self.params.compute_platform]) + + if self.params.compute_platform == 'cpu' and self.params.num_cpus > 0: + # need to use native_strs here or the swig interface gets confused + properties[native_str('Threads')] = native_str(self.params.num_cpus) -def list_openmmplatforms(): - from simtk import openmm - return [openmm.Platform.getPlatform(ip).getName() - for ip in range(openmm.Platform.getNumPlatforms())] + return platform, properties diff --git a/moldesign/models/pyscf.py b/moldesign/models/pyscf.py index 7b82488..7a97417 100644 --- a/moldesign/models/pyscf.py +++ b/moldesign/models/pyscf.py @@ -453,11 +453,12 @@ def _get_ao_basis_functions(self): n = int(''.join(x for x in label[2] if x.isdigit())) primitives = [orbitals.SphericalGaussian(atom.position.copy(), - exp, n, l, m, - coeff=coeff[ictr]) + exp, n, l, m, + coeff=coeff[ictr]) for exp, coeff in zip(exps, coeffs)] - bfs.append(orbitals.AtomicBasisFunction(atom, n=n, l=angular, m=m, - primitives=primitives)) + bfs.append(orbitals.AtomicBasisFunction(atom, + n=n, l=angular, m=m, + primitives=primitives)) return bfs diff --git a/moldesign/models/qmmm.py b/moldesign/models/qmmm.py new file mode 100644 index 0000000..4f0c5f6 --- /dev/null +++ b/moldesign/models/qmmm.py @@ -0,0 +1,207 @@ +# Copyright 2016 Autodesk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import moldesign as mdt +from ..molecules import MolecularProperties +from ..utils import exports + +from .base import QMMMBase + + +class QMMMEmbeddingBase(QMMMBase): + """ Abstract class for standard QM/MM embedding models. + + To use any of this classes' subclasses, the MM models must support the ability to + calculate the internal energies and interaction energies between subsystems, + using the ``calculation_groups`` parameter. + """ + + def __init__(self, *args, **kwargs): + super(QMMMEmbeddingBase, self).__init__(*args, **kwargs) + self.qmmol = None + self.mmmol = None + self.qm_atoms = None + self.qm_link_atoms = None + self._qm_index_set = None + + # TODO: add `qm_atom_indices` to QMMMBase parameters + + def calculate(self, requests): + self.prep() + + self.mmmol.positions = self.mol.positions + self._set_qm_positions() + + qmprops = self.qmmol.calculate(requests) + mmprops = self.mmmol.calculate(requests) + + potential_energy = mmprops.potential_energy+qmprops.potential_energy + forces = mmprops.forces.copy() + for iatom, realatom in enumerate(self.qm_atoms): + forces[realatom.index] = qmprops.forces[iatom] + for atom in self.qm_link_atoms: + self._distribute_linkatom_forces(forces, atom) + + properties = MolecularProperties(self.mol, + mmprops=mmprops, + qmprops=qmprops, + potential_energy=potential_energy, + forces=forces) + if 'wfn' in qmprops: + properties.wfn = qmprops.wfn + + return properties + + def prep(self): + if self._prepped: + return None + + self.params.qm_atom_indices.sort() + self.qm_atoms = [self.mol.atoms[idx] for idx in self.params.qm_atom_indices] + self._qm_index_set = set(self.params.qm_atom_indices) + + self.qmmol = self._setup_qm_subsystem() + + self.mmmol = mdt.Molecule(self.mol, + name='%s MM subsystem' % self.mol.name) + self.mol.ff.copy_to(self.mmmol) + self._turn_off_qm_forcefield(self.mmmol.ff) + self.mmmol.set_energy_model(self.params.mm_model) + + self._prepped = True + return True + + def _setup_qm_subsystem(self): + raise NotImplemented("%s is an abstract class, use one of its subclasses" + % self.__class__.__name__) + + def _turn_off_qm_forcefield(self, ff): + self._remove_internal_qm_bonds(ff.parmed_obj) + self._exclude_internal_qm_ljterms(ff.parmed_obj) + + def _exclude_internal_qm_ljterms(self, pmdobj): + # Turn off QM/QM LJ interactions (must be done AFTER _remove_internal_qm_bonds) + numqm = len(self.params.qm_atom_indices) + for i in range(numqm): + for j in range(i+1, numqm): + pmdobj.atoms[i].exclude(pmdobj.atoms[j]) + + def _remove_internal_qm_bonds(self, pmdobj): + for i, iatom in enumerate(self.params.qm_atom_indices): + pmdatom = pmdobj.atoms[iatom] + allterms = ((pmdatom.bonds, 2), (pmdatom.angles, 3), + (pmdatom.dihedrals, 4), (pmdatom.impropers, 4)) + + for termlist, numatoms in allterms: + for term in termlist[:]: # make a copy so it doesn't change during iteration + if self._term_in_qm_system(term, numatoms): + term.delete() + + @staticmethod + def _distribute_linkatom_forces(fullforces, linkatom): + """ Distribute forces according to the apparently indescribable and unciteable "lever rule" + """ + # TODO: CHECK THIS!!!! + + mmatom = linkatom.metadata.mmatom + qmatom = linkatom.metadata.mmpartner + dfull = mmatom.distance(qmatom) + d_mm = linkatom.distance(mmatom) + + p = (dfull - d_mm)/dfull + fullforces[qmatom.index] += p*linkatom.force + fullforces[mmatom.index] += (1.0-p) * linkatom.force + + def _set_qm_positions(self): + for qmatom, realatom in zip(self.qmmol.atoms, self.qm_atoms): + qmatom.position = realatom.position + mdt.helpers.qmmm.set_link_atom_positions(self.qm_link_atoms) + + def _term_in_qm_system(self, t, numatoms): + """ Check if an FF term is entirely within the QM subsystem """ + for iatom in range(numatoms): + attrname = 'atom%i' % (iatom + 1) + if not getattr(t, attrname).idx in self._qm_index_set: + return True + else: + return False + + +@exports +class MechanicalEmbeddingQMMM(QMMMEmbeddingBase): + """ + Handles _non-covalent_ QM/MM with mechanical embedding. + + No electrostatic interactions will be calculated between the QM and MM subsystems. + No covalent bonds are are allowed between the two susbystems. + """ + def prep(self): + if not super(MechanicalEmbeddingQMMM, self).prep(): + return # was already prepped + + # Set QM partial charges to 0 + self.mmmol.energy_model._prepped = False + pmdobj = self.mmmol.ff.parmed_obj + for i, iatom in enumerate(self.params.qm_atom_indices): + pmdatom = pmdobj.atoms[iatom] + pmdatom.charge = 0.0 + + def _setup_qm_subsystem(self): + """ QM subsystem for mechanical embedding is the QM atoms + any link atoms + """ + qm_atoms = [self.mol.atoms[iatom] for iatom in self.params.qm_atom_indices] + self.qm_link_atoms = mdt.helpers.qmmm.create_link_atoms(self.mol, qm_atoms) + qmmol = mdt.Molecule(qm_atoms + self.qm_link_atoms, + name='%s QM subsystem' % self.mol.name) + for real_atom, qm_atom in zip(self.qm_atoms, qmmol.atoms): + qm_atom.metadata.real_atom = real_atom + qmmol.set_energy_model(self.params.qm_model) + return qmmol + + +@exports +class ElectrostaticEmbeddingQMMM(QMMMEmbeddingBase): + """ Handles _non-covalent_ QM/MM with electrostaic embedding. + No bonds allowed across the QM/MM boundaries. + + To support this calculation type, the QM model must support the ability to denote + a subset of atoms as the "QM" atoms, using the ``qm_atom_indices`` parameter. + + To support this calculation type, the QM model must support the ability to denote + a subset of atoms as the "QM" atoms, using the ``qm_atom_indices`` parameter. + The MM models must support the ability to turn of _internal_ interactions for + a certain subset of the system, using the ``no_internal_calculations`` parameter. + """ + + def prep(self): + if not super(ElectrostaticEmbeddingQMMM, self).prep(): + return # was already prepped + + if not self.params.qm_model.supports_parameter('qm_atom_indices'): + raise TypeError('Supplied QM model ("%s") does not support QM/MM' + % self.params.qm_model.__name__) + + def _setup_qm_subsystem(self): + qmmol = mdt.Molecule(self.mol) + self.mol.ff.copy_to(qmmol) + + self.qm_link_atoms = mdt.helpers.qmmm.create_link_atoms(self.mol, self.qm_atoms) + if self.qm_link_atoms: + raise ValueError('The %s model does not support link atoms' % self.__class__.__name__) + + qmmol.set_energy_model(self.params.qm_model) + qmmol.energy_model.params.qm_atom_indices = self.params.qm_atom_indices + return qmmol + + diff --git a/moldesign/molecules/bonds.py b/moldesign/molecules/bonds.py index ad79012..530defe 100644 --- a/moldesign/molecules/bonds.py +++ b/moldesign/molecules/bonds.py @@ -1,3 +1,5 @@ +# coding: utf-8 + from __future__ import print_function, absolute_import, division from future.builtins import * from future import standard_library @@ -16,8 +18,13 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +from past.builtins import basestring + +import numpy as np from . import toplevel +from .. import units as u +from .. import mathutils @toplevel @@ -41,11 +48,11 @@ class Bond(object): a2 (Atom): Second atom in the bond; assigned so that ``self.a2.index > self.a1.index`` order (int): bond order (can be ``None``); not used in comparisons """ + SYMBOLS = {1: u'-', 2: u'=', 3: u'≡'} + def __init__(self, a1, a2, order=None): if a1.molecule is not a2.molecule: raise ValueError('Cannot create bond for atoms in different molecules.') - else: - self.molecule = a1.molecule if a1.index is not None and a2.index is not None and a1.index > a2.index: a1, a2 = a2, a1 @@ -57,6 +64,18 @@ def __init__(self, a1, a2, order=None): else: self.order = order + def __str__(self): + return "%s bond between %s and %s (order: %s)" % (self.type, + self.a1._shortstr(), self.a2._shortstr(), + self.order) + + def __repr__(self): + return "<%s>" % self + + @property + def type(self): + return self.a1.symbol + self.SYMBOLS.get(self.order, u'?̶') + self.a2.symbol + def __eq__(self, other): return (self.a1 is other.a1) and (self.a2 is other.a2) @@ -93,6 +112,61 @@ def name(self): return '{a1.name} (#{a1.index}) - {a2.name} (#{a2.index}) (order: {order})'.format( a1=self.a1, a2=self.a2, order=self.order) + @property + def molecule(self): + """moldesign.Molecule: molecule this bond belongs to (or None if not assigned + + Raises: + ValueError: if the atoms are assigned to different molecules + """ + if self.a1.molecule is not self.a2.molecule: + raise ValueError("Atoms in %s belong to different molecules" % self) + else: + return self.a1.molecule + + @property + def midpoint(self): + return (self.a1.position + self.a2.position) / 2.0 + + def align(self, other, centered=True): + """ Rotates the entire molecule to align this bond with another object. + + Args: + other (str or Vector[len=3] or Bond): Object to align this bond with, which may be: + - a string: 'x', 'y', or 'z', + - a len-3 vector, or + - another :class:`Bond` object + centered (bool): if True (default), center this bond at the origin OR the midpoint of + the other bond + """ + mol = self.molecule + + centering = -self.midpoint + + if isinstance(other, Bond): + direction = (other.a2.position - other.a1.position).normalized() + if centered: + centering += other.midpoint + + elif isinstance(other, basestring): + arr = np.zeros(3) + arr[DIMLABELS[other]] = 1.0 + direction = arr + + else: + direction = other + + target = mathutils.normalized(u.array(direction)) + vec = (self.a2.position - self.a1.position).normalized() + + angle, normal = mathutils.alignment_rotation(vec, target) + + if centered: + mol.positions += centering + + if abs(mathutils.normalize_angle(angle)) > 1e-3 * u.degrees: + mol.rotate(angle, normal, center=self.midpoint) + @property def ff(self): """mdt.forcefield.BondTerm: the force-field term for this bond (or ``None`` if no @@ -102,3 +176,5 @@ def ff(self): return self.molecule.ff.get_bond_term(self) else: return None + +DIMLABELS = {'x': 0, 'y': 1, 'z':2} diff --git a/moldesign/molecules/molecule.py b/moldesign/molecules/molecule.py index 3c7d2b5..6cb6eb1 100644 --- a/moldesign/molecules/molecule.py +++ b/moldesign/molecules/molecule.py @@ -121,6 +121,24 @@ def constrain_dihedral(self, atom1, atom2, atom3, atom4, angle=None): self._reset_methods() return self.constraints[-1] + def constrain_hbonds(self): + """ Constrain h-bonds in this molecule to their equilibrium forcefield values. + + For molecules with an associated forcefield, this method adds a constraint to the molecule + that fixes all the lengths of all bonds that involve at least one hydrogen atom. The bond + lengths are constrained to their equilibrium forcefield values. + + Note: + This can only be applied if the molecule is associated with a forcefield. + + Returns: + moldesign.geom.HBondConstraint: constraint object + """ + from moldesign import geom + self.constraints.append(geom.constraints.HBondsConstraint(self)) + self._reset_methods() + return self.constraints[-1] + class MolPropertyMixin(object): """ Functions for calculating and accessing molecular properties. @@ -399,7 +417,7 @@ class MolTopologyMixin(object): Note: This is a mixin class designed only to be mixed into the :class:`Molecule` class. Routines - are separated are here for code organization only - they could be included in the main + are here for code organization only - they could be included in the main Atom class without changing any functionality """ def copy(self, name=None): @@ -422,6 +440,9 @@ def copy(self, name=None): newintegrator = self._copy_method(newmol, 'integrator') if newintegrator is not None: newmol.set_integrator(newintegrator) + if self.ff is not None: + self.ff.copy_to(newmol) + newmol.constraints = [c.copy(newmol) for c in self.constraints] return newmol def _copy_method(self, newmol, methodname): @@ -929,7 +950,6 @@ def _reset_methods(self): need to know about """ # TODO: what should this do with the property object? - # TODO: handle duplicate constraints (this happens a lot, and is bad) if self.energy_model is not None: self.energy_model._prepped = False if self.integrator is not None: @@ -1054,8 +1074,9 @@ def __init__(self, atomcontainer, self.name = 'uninitialized molecule' self._defres = None self._defchain = None + self._constraints = None self.pdbname = pdbname - self.constraints = utils.ExclusiveList(key=utils.methodcaller('_constraintsig')) + self.constraints = [] self.energy_model = None self.integrator = None self.metadata = metadata @@ -1113,6 +1134,14 @@ def __repr__(self): def __str__(self): return 'Molecule: %s' % self.name + @property + def constraints(self): + return self._constraints + + @constraints.setter + def constraints(self, val): + self._constraints = utils.ExclusiveList(val, key=utils.methodcaller('_constraintsig')) + def _repr_markdown_(self): """A markdown description of this molecule. diff --git a/moldesign/molecules/trajectory.py b/moldesign/molecules/trajectory.py index 7b9f373..948d06d 100644 --- a/moldesign/molecules/trajectory.py +++ b/moldesign/molecules/trajectory.py @@ -54,10 +54,12 @@ class Frame(utils.DotDict): >>> assert starting_frame.minimization_step == 0 """ def __init__(self, traj, frameidx): + super().__init__() self.traj = traj self.frameidx = frameidx - super().__init__(_dynamic=False) for key in self.traj.properties: + if key == 'frameidx': + continue self[key] = getattr(traj, key)[self.frameidx] def __str__(self): @@ -101,7 +103,7 @@ def force(self): def _arrayslice(self, attr): return getattr(self.traj, attr)[:, self.index, :] - def __getattr__(self, item): # TODO: remove and replace all __getattr__ + def __getattr__(self, item): if item in ('traj', 'index', 'real_atom'): raise AttributeError('_TrajAtom.%s not assigned (pickle issue?)' % item) @@ -134,7 +136,7 @@ def kinetic_energy(self): for frame in self.frames: if 'momenta' in frame: energies.append( - helpers.kinetic_energy(frame.momenta, self.mol.dim_masses)) + helpers.kinetic_energy(frame.momenta, self.mol.masses)) else: convert_units = False energies.append(None) @@ -356,8 +358,8 @@ def _new_property(self, key, value): 2) resizeable MdtQuantity array 3) list - The list of properties will be backfilled with ``None`` if this property wasn't already - present + If this property wasn't already present, we will add it to all previous frames with a + value of ``None`` """ assert key not in self.properties @@ -367,7 +369,7 @@ def _new_property(self, key, value): else: try: proplist = self.unit_system.convert(u.array([value])) - except TypeError: + except (TypeError, u.UndefinedUnitError): proplist = [value] else: proplist.make_resizable() diff --git a/moldesign/orbitals/wfn.py b/moldesign/orbitals/wfn.py index 69e603e..2e4e929 100644 --- a/moldesign/orbitals/wfn.py +++ b/moldesign/orbitals/wfn.py @@ -21,6 +21,7 @@ from . import MolecularOrbitals from ..utils import DotDict + class ElectronicWfn(object): """ Stores the results of a quantum chemistry calculation. @@ -107,6 +108,9 @@ def run_nbo(self, **kwargs): nbo_interface.run_nbo(self.mol, **kwargs) def add_orbitals(self, orbs, orbtype='canonical', **kwargs): + for orb in orbs: + if orb.wfn is None: + orb.wfn = self mo_object = MolecularOrbitals(orbs, wfn=self, orbtype=orbtype) diff --git a/moldesign/parameters.py b/moldesign/parameters.py index d312a90..cedff6d 100644 --- a/moldesign/parameters.py +++ b/moldesign/parameters.py @@ -24,9 +24,11 @@ notebook interfaces to configure various techniques. """ import operator as op +import copy from . import units as u from . import utils +from .utils import named_dict def isin(a, b): return a in b @@ -77,7 +79,8 @@ def __init__(self, name, default=None, choices=None, help_url=None, - relevance=None): + relevance=None, + help=None): self.name = name self.displayname = utils.if_not_none(short_description, name) self.value = None @@ -85,6 +88,7 @@ def __init__(self, name, self.choices = utils.if_not_none(choices, []) self.type = type self.help_url = help_url + self.help = help if isinstance(type, u.MdtQuantity): type = type.units if isinstance(type, u.MdtUnit): @@ -106,18 +110,13 @@ def __repr__(self): except (KeyError, AttributeError): return '<%s at %x - exception in __repr__>' % (type(self), id(self)) + def copy(self): + """ Make a copy of this parameter (usually to modify it for a given method) - -# TODO - make this ordered as well as dotted -def named_dict(l): - return utils.DotDict((i.name, i) for i in l) - -model_parameters = named_dict([ - Parameter('subsystem') -]) - -FORCEFIELDS = [] -PERIODICITIES = [False, 'box'] + Returns: + Parameter: a copy of this parameter type + """ + return copy.deepcopy(self) mm_model_parameters = named_dict([ @@ -134,7 +133,7 @@ def named_dict(l): Parameter('solvent_dielectric', 'Solvent dielectric constant', default=78.5, type=float), Parameter('ewald_error', 'Ewald error tolerance', default=0.0005, type=float), - Parameter('periodic', 'Periodicity', default=False, choices=PERIODICITIES) + Parameter('periodic', 'Periodicity', default=False, choices=[False, 'box']) ]) @@ -196,6 +195,8 @@ def named_dict(l): Parameter('collision_rate', 'Thermal collision rate', default=1.0/u.ps, type=1/u.ps) ]) +num_cpus = Parameter('num_cpus', 'Number of CPUs (0=unlimited)', default=0, type=int) + ground_state_properties = ['potential_energy', 'forces', 'dipole_moment', diff --git a/moldesign/tools/__init__.py b/moldesign/tools/__init__.py index 20f3710..174cc4a 100644 --- a/moldesign/tools/__init__.py +++ b/moldesign/tools/__init__.py @@ -4,4 +4,4 @@ def toplevel(o): __all__ = [] from .topology import * -from .build import * \ No newline at end of file +from .build import * diff --git a/moldesign/units/constants.py b/moldesign/units/constants.py index b282ef3..31cd5ce 100644 --- a/moldesign/units/constants.py +++ b/moldesign/units/constants.py @@ -19,6 +19,8 @@ from .quantity import * +dimensionless = ureg.dimensionless + # Constants unity = ureg.angstrom / ureg.angstrom imi = 1.0j diff --git a/moldesign/units/quantity.py b/moldesign/units/quantity.py index abda408..2e5f98f 100644 --- a/moldesign/units/quantity.py +++ b/moldesign/units/quantity.py @@ -16,16 +16,18 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +from past.builtins import basestring + import operator import copy from os.path import join, abspath, dirname -import numbers import numpy as np -from pint import UnitRegistry, set_application_registry, DimensionalityError +from pint import UnitRegistry, set_application_registry, DimensionalityError, UndefinedUnitError from ..utils import ResizableArray + # Set up pint's unit definitions ureg = UnitRegistry() unit_def_file = join(abspath(dirname(__file__)), '../_static_data/pint_atomic_units.txt') @@ -40,6 +42,40 @@ class MdtUnit(ureg.Unit): def __reduce__(self): return _get_unit, (str(self),) + def convert(self, value): + """ Returns quantity converted to these units + + Args: + value (MdtQuantity or Numeric): value to convert + + Returns: + MdtQuantity: converted value + + Raises: + DimensionalityError: if the quantity does not have these units' dimensionality + """ + if hasattr(value, 'to'): + return value.to(self) + elif self.dimensionless: + return value * self + else: + raise DimensionalityError('Cannot convert "%s" to units of "%s"' % (value, self)) + + def value_of(self, value): + """ Returns numeric value of the quantity in these units + + Args: + value (MdtQuantity or Numeric): value to convert + + Returns: + Numeric: value in this object's units + + Raises: + DimensionalityError: if the quantity does not have these units' dimensionality + """ + v = self.convert(value) + return v.magnitude + def _get_unit(unitname): """pickle helper for deserializing MdtUnit objects""" @@ -86,32 +122,23 @@ def __deepcopy__(self, memo): def __hash__(self): return hash((self._magnitude, str(self.units))) - # This doesn't deal with length specs correctly (pint's doesn't either though) - #def __format__(self, fmt): - # fmtstring = '{m:%s} {u}' % fmt - # try: - # return fmtstring.format(m=self.magnitude, - # u=self.units) - # except: - # return super().__format__(fmt) - def __setitem__(self, key, value): - # Overrides pint's built-in version of this ... this is apparently way faster - try: + from . import array as quantityarray + + try: # Speed up item assignment by overriding pint's implementation if self.units == value.units: self.magnitude[key] = value._magnitude else: self.magnitude[key] = value.value_in(self.units) except AttributeError: - if not hasattr(value, 'value_in'): # deal with missing `value_in` method - if self.dimensionless: # case 1: this is OK if self is dimensionless - self.magnitude[key] = value - elif not isinstance(value, numbers.Number): # case 2: this is not a number - raise TypeError('"%s" is not a valid numeric value' % value) - else: # case 3: wrong units - raise DimensionalityError(self.units, ureg.dimensionless) - else: # case 3: attribute error is unrelated to this - raise + if isinstance(value, basestring): + raise TypeError("Cannot assign units to a string ('%s')"%value) + + try: # fallback to pint's implementation + super().__setitem__(key, value) + except (TypeError, ValueError): + # one last ditch effort to create a more well-behaved object + super().__setitem__(key, quantityarray(value)) def __eq__(self, other): return self.compare(other, operator.eq) @@ -155,18 +182,28 @@ def get_units(self): return 1.0 def norm(self): - """Compute norm but respect units""" + """L2-norm of this object including units + + Returns: + Scalar: L2-norm + """ units = self.get_units() return units * np.linalg.norm(self._magnitude) def normalized(self): - return self/self.norm() + """ Normalizes a vector or matrix + + Returns: + np.ndarray: L2-normalized copy of this array (no units) + """ + from ..mathutils import normalized + return normalized(self.magnitude) def dot(self, other): """ Dot product that correctly multiplies units Returns: - MdtQuantity + Array """ if hasattr(other, 'get_units'): units = self.get_units() * other.get_units() @@ -175,6 +212,12 @@ def dot(self, other): return units * np.dot(self, other) def cross(self, other): + """ Cross product that correctly multiplies units + + Returns: + Array + """ + if hasattr(other, 'get_units'): units = self.get_units() * other.get_units() else: @@ -182,10 +225,21 @@ def cross(self, other): return units * np.cross(self, other) def ldot(self, other): - """ - Left-multiplication version of dot. - Use this to preserve units (built-in numpy versions don't) - getting hackier ... + """ Left-multiplication version of dot that correctly multiplies units + + This is mathematically equivalent to ``other.dot(self)``, but preserves units even if ``other`` + is a plain numpy array + + Args: + other (MdtQuantity or np.ndarray): quantity to take the dot product with + + Examples: + >>> mat1 = np.ones((3,2)) + >>> vec1 = np.array([-3.0,2.0]) * u.angstrom + >>> vec1.ldot(mat1) + + >>> # This won't work because "mat1", a numpy array, doesn't respect units + >>> mat1.dot(vec1) """ if hasattr(other, 'get_units'): units = self.get_units() * other.get_units() @@ -260,7 +314,7 @@ def extend(self, items): ureg.Unit = MdtUnit # These synonyms are here solely so that we can write descriptive docstrings -# TODO: use typing module to turn these into real abstract types +# TODO: use typing module to turn these into real abstract types, with dimensional parameterization class Scalar(MdtQuantity): """ A scalar quantity (i.e., a single floating point number) with attached units @@ -270,24 +324,24 @@ def __init__(self, *args): class Vector(MdtQuantity): - """ A vector quantity (i.e., a list of floats) with attached units, which behaves like a - 1-dimensional numpy array + """ A vector quantity (i.e., a list of floats) with attached units that behaves like a + 1-dimensional numpy array with units """ def __init__(self, *args): raise NotImplementedError('This is an abstract class - use MdtQuantity instead') class Array(MdtQuantity): - """ A matrix quantity (i.e., a matrix of floats) with attached units, which behaves like a - 2-dimensional numpy array + """ A matrix quantity (i.e., a matrix of floats) with attached units that behaves like a + 2-dimensional numpy array with units """ def __init__(self, *args): raise NotImplementedError('This is an abstract class - use MdtQuantity instead') class Tensor(MdtQuantity): - """ A vector quantity (i.e., a list of floats) with attached units, which behaves like a - multidimensional numpy array + """ A multidimensional array of floats with attached units that behaves like a + multidimensional numpy array with units """ def __init__(self, *args): raise NotImplementedError('This is an abstract class - use MdtQuantity instead') diff --git a/moldesign/units/tools.py b/moldesign/units/tools.py index 0cddfa5..7a0f6b0 100644 --- a/moldesign/units/tools.py +++ b/moldesign/units/tools.py @@ -39,6 +39,22 @@ def unitsum(iterable): return g0 +def dot(a1, a2): + """ Dot product that respects units + + Args: + a1 (MdtQuantity or np.ndarray): First term in dot product + a2 (MdtQuantity or np.ndarray): Second term in dot product + + Returns: + MdtQuantity or np.ndarray: dot product (MdtQuantity if either input has units, ndarray else) + """ + if isinstance(a2, MdtQuantity): + return a2.ldot(a1) + else: # this will work whether or not a1 has units + return a1.dot(a2) + + def from_json(j): """ Convert a JSON description to a quantity. @@ -54,8 +70,27 @@ def from_json(j): def get_units(q): - """ - Return the base unit system of an quantity + """ Return the base unit system of an quantity or arbitrarily-nested iterables of quantities + + Note: This routine will dive on the first element of iterables until a quantity with units + until the units can be determined. It will not check the remaining elements of the iterable + for consistency + + Examples: + >>> from moldesign import units + >>> units.get_units(1.0 * units.angstrom) + + >>> units.get_units(np.array([1.0, 2, 3.0])) + + >>> # We dive on the first element of each iterable until we can determine a unit system: + >>> units.get_units([[1.0 * u.dalton, 3.0 * u.eV], ['a'], 'gorilla']) + + + Args: + q (MdtQuantity or numeric): quantity to test + + Returns: + MdtUnit: the quantity's units """ x = q while True: @@ -66,12 +101,7 @@ def get_units(q): else: if isinstance(x, str): raise TypeError('Found string data while trying to determine units') - try: - y = 1.0 * x - y._magnitude = 1.0 - return y - except AttributeError: - return 1.0 * ureg.dimensionless + return MdtQuantity(x).units def array(qlist, baseunit=None): diff --git a/moldesign/utils/__init__.py b/moldesign/utils/__init__.py index 546bf47..9f7af99 100644 --- a/moldesign/utils/__init__.py +++ b/moldesign/utils/__init__.py @@ -11,6 +11,8 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +from __future__ import absolute_import + from .exportutils import * from . import docparsers from .callsigs import * @@ -19,4 +21,4 @@ from .databases import * from .utils import * from .numerical import * - +from .json_extension import * diff --git a/moldesign/utils/_deadfunctions.py.txt b/moldesign/utils/_deadfunctions.py.txt index 87ef60b..8b4a3ce 100644 --- a/moldesign/utils/_deadfunctions.py.txt +++ b/moldesign/utils/_deadfunctions.py.txt @@ -177,3 +177,83 @@ def get_conect_records(pdbfile): atombonds[serial] = 0 atombonds[serial] += 1 return conect + + + +class HarmonicBondTerm(FFTerm): + def __init__(self, a1, a2, k, d0): + self.atoms = [a1, a2] + self.k = k + self.d0 = d0 + self.bond = a1.bond_graph.get(a2, None) + + def __str__(self): + return 'Harmonic bond ({atoms}), k={k.magnitude:6.3f}{k.units}, equil={d0.magnitude:6.2}{d0.units}'.format( + atoms=','.join(map(str, self.atoms)), + k=self.k, + d0=self.d0) + + def coord(self): + return geo.distance(*self.atoms) + + def energy(self): + return u.default.convert(self.k * (self.coord() - self.d0)**2) + + +class HarmonicAngleTerm(FFTerm): + def __init__(self, a1, a2, a3, k, theta0): + self.atoms = [a1, a2, a3] + self.k = k + self.theta0 = theta0 + self.bonds = [a1.bond_graph.get(a2,None), + a2.bond_graph.get(a3,None)] + + def __str__(self): + return 'Harmonic angle ({atoms}), k={k.magnitude:6.3f}{k.units}, equil={d0.magnitude:6.2}{d0.units}'.format( + atoms=','.join(map(str, self.atoms)), + k=self.k.defunits(), + d0=self.theta0.defunits()) + + def coord(self): + return geo.angle(*self.atoms) + + def energy(self): + return u.default.convert(self.k * (self.coord() - self.theta0)**2) + + +class PeriodicTorsionTerm(FFTerm): + def __init__(self, a1, a2, a3, a4, n, v_n, gamma): + self.atoms = [a1, a2, a3, a4] + self.n = n + self.v_n = v_n + self.gamma = gamma + self.bonds = [a1.bond_graph.get(a2, None), + a2.bond_graph.get(a3, None), + a3.bond_graph.get(a4, None)] + + def __str__(self): + return 'Periodic torsion ({atoms}),' \ + ' n={n}, k={k.magnitude:6.3f}{k.units}, equil={d0.magnitude:6.2}{d0.units}'.format( + atoms=','.join(map(str, self.atoms)), + k=self.v_n.defunits(), + n=self.n, + d0=self.gamma) + + def coord(self): + return geo.dihedral(*self.atoms) + + def energy(self): + return u.default.convert(0.5 * self.v_n * (1.0 + np.cos(self.n * self.coord() - self.gamma))) + + +class LennardJonesSigmaEps(FFTerm): + def __init__(self, atom, sigma, epsilon): + self.atom = atom + self.sigma = sigma + self.epsilon = epsilon + + def get_sigma(self, other): + return (self.sigma + other.sigma) / 2.0 + + def get_epsilon(self, other): + return math.sqrt(self.sigma * other.sigma) \ No newline at end of file diff --git a/moldesign/utils/classes.py b/moldesign/utils/classes.py index 664fe0b..498a7dd 100644 --- a/moldesign/utils/classes.py +++ b/moldesign/utils/classes.py @@ -163,6 +163,40 @@ def __bool__(self): __nonzero__ = __bool__ + for _v in ('keys values items __iter__ __getitem__ __len__ __contains__ clear ' ' __setitem__ pop setdefault get update').split(): setattr(DotDict, _v, Alias('_od.%s' % _v)) + + +def named_dict(l): + """ Creates a DotDict from a list of items that have a ``name`` attribute + + Args: + l (List[object]): list of objects that have a ``name`` or ``__name__`` attribute + + Returns: + DotDict[str, object]: mapping of objects' names to objects + + Example: + >>> import moldesign as mdt + >>> m1 = mdt.from_name('benzene') + >>> m2 = mdt.from_name('propane') + >>> d = named_dict([m1, m2, DotDict]) + >>> list(d.keys()) + ['benzene', 'propane', 'DotDict'] + >>> d.propane + + >>> d.DotDict + moldesign.utils.classes.DotDict + """ + return DotDict((_namegetter(obj), obj) for obj in l) + + +def _namegetter(obj): + try: + return obj.name + except AttributeError: + return obj.__name__ + + diff --git a/moldesign/utils/json_extension.py b/moldesign/utils/json_extension.py new file mode 100644 index 0000000..0dfbfe2 --- /dev/null +++ b/moldesign/utils/json_extension.py @@ -0,0 +1,41 @@ +# Copyright 2016 Autodesk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from __future__ import absolute_import + +import json +from . import args_from + + +# TODO: defined JSON types that we can serialize directly into MDT objects OR +# use a JSON "pickling" library (only if there's more complexity than covered here already) + +class JsonEncoder(json.JSONEncoder): + def default(self, obj): + if hasattr(obj, 'to_json'): + return obj.to_json() + elif hasattr(obj, 'tolist'): + return obj.tolist() + else: + raise TypeError('No seralizer for object "%s" (class: %s)' + % (obj,obj.__class__.__name__)) + + +@args_from(json.dump) +def json_dump(*args, **kwargs): + return json.dump(*args, cls=JsonEncoder, **kwargs) + + +@args_from(json.dumps) +def json_dumps(*args, **kwargs): + return json.dumps(*args, cls=JsonEncoder, **kwargs) diff --git a/pytest.ini b/pytest.ini index c6846c3..bd8cb45 100644 --- a/pytest.ini +++ b/pytest.ini @@ -2,5 +2,7 @@ testpaths = moldesign/_tests markers = - base: tests data structures, molecule construction - slow: heavy duty simulation and numerical tests + internal: tests MDT data structures, consistency of molecular data + io: just molecular reading and writing from various formats + screening: diverse test sample across modules to get a quick status overview +