diff --git a/CHANGELOG.md b/CHANGELOG.md index a9e5859e..29320ee9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,26 @@ ## Unreleased +### Fixed +- **AF3 interface scores no longer use chain-pair minimum PAE when the confidence matrices carry extra tokens** (#30). AF3x crosslinkers, ligands and ions add tokens to `confidences.json`, so its token-by-token PAE no longer matched the number of scored residues, and AlphaJudge filled every residue pair of a chain pair with that block's minimum. On a 4G3Y B–C prediction with one DSSO crosslink this reported a mean B→C PAE of 5.8 Å where the prediction's own is 21.1 Å, inflating ipSAE, LIS and pDockQ2. PAE and contact probabilities are now aligned to the scored residues by token chain and residue identifiers, keeping both directions of every residue pair. +- Per-interface ipTM for AF3 is looked up by chain ID in the chain order of `chain_pair_iptm`, not by position among the scored chains. AF3x names each crosslinker ligand with the first unused chain letter, so a crosslinker can precede or sit between the proteins; on the same 4G3Y prediction (crosslinker chain A, proteins B and C) the B–C interface reported the crosslinker–B ipTM of 0.78 instead of 0.25. A `chain_pair_iptm` whose size does not match the chains is ignored with a warning, and global ipTM is used instead. +- **Boltz-2 PAE, pLDDT and pair ipTM are aligned to residues by token and chain.** Boltz-2 adds one token per ligand atom, and AlphaJudge kept the leading block of its PAE and pLDDT arrays and indexed `pair_chains_iptm` by position among the scored chains. Both were right only when every ligand chain came after the proteins; a ligand chain first or between them shifted every PAE entry and could report another chain pair's ipTM. The token layout is now rebuilt from the structure (one token per standard residue, one per atom otherwise) and pair ipTM is looked up by chain ID in structure order. A `pair_chains_iptm` whose size does not match the chains is ignored with a warning. Runs with ligands last, such as the bundled 6OGE prediction, are unchanged. +- Report fixes: an empty `model_used` no longer crashes the aggregate report (an invalid `**` glob on Python 3.10-3.12) and model names are matched literally when looking for PAE images; the per-interface table caption gives the actual number of metascore features (11, not 10); the aggregate cover's median is the true median for an even number of interfaces instead of the upper middle value; and appendix sections are numbered A.1, A.2, ... instead of `A.` cut to eight characters. +- The shared ProSurf result behind interface area, H-bonds, salt bridges and solvation energy was cached under each residue's ID and first-atom position. Every structure is loaded under the same ID, so another model of the same chain pair whose residues started at the same N atoms could reuse a stale result. The cache is now keyed on all atom identities and coordinates and holds four entries instead of up to 33 structures. +- AF3 runs: a missing or unparsable `ranking_score` in `ranking_scores.csv` no longer scrambles the model order (NaN sort keys), so the best model is still picked correctly, with unscored models last. In a flat output layout, looking up `seed-1_sample-1` no longer picks up `seed-1_sample-10`'s structure. A run whose ranking file lists no models writes the usual explained empty CSV in `best` mode instead of failing with `IndexError`. +- **Interface solvation energy now matches PISA.** Per-atom solvent-accessible area was computed only for atoms with a partner-chain atom nearby, so sibling atoms of the same residue kept zero area and charged groups (Arg NE/NH1/NH2, His ND1/NE2, carboxylate O1/O2) could be typed charged in one state and neutral in the other. `interface_solv_en` was off by +0.02 to +1.09 kcal/mol on the six CCP4 references and now agrees to within 1e-4; buried area, H-bonds and salt bridges are unchanged. `interface_meta_score` moves slightly with it. The frozen solvation percentile ladder was built from the previous values; the shift is small next to its decile spacing (about 3 to 5 kcal/mol in the lower half). + +### Added +- `global_confidence_scope` and `iptm_scope` columns in the per-interface score table. `global_confidence_scope` is `includes_excluded_tokens` when AF3's global confidences also cover tokens excluded from interface scoring, `scored_residues` when they do not, and `unknown` for AF2 and Boltz-2. `iptm_scope` says whether `iptm` is the chain-pair value or the global fallback. + +### Changed +- AF3 models whose PAE cannot be mapped to residues are skipped with an explicit error instead of being scored with a substitute. This covers summary-only runs (`chain_pair_pae_min` without `confidences.json`), PAE matrices of the wrong shape without token identifiers (previously filled with 100 Å), and tokens that cannot be matched unambiguously to scored residues. A modified residue, which AF3 tokenizes per atom, is matched through the token of its CA (or C1') atom. +- For AF3 predictions whose global confidences include excluded tokens (AF3x crosslinkers, but also ligands and ions in plain AF3), `confidence_score` and a global-ipTM fallback are kept in the score table but left out of `interface_meta_score` and the report percentiles, because they no longer describe the scored residues alone. The metascore is the mean of the remaining percentiles, so it changes for such predictions relative to 1.4.2. Boltz-2 global confidences are not labelled and are used as before. +- Cached per-run CSVs without the two new columns are recomputed once, AF2 and Boltz-2 caches included. + +### Removed +- Helpers that nothing called: `ParserManager.unregister`, `enable_only`, `set_precedence` and `list_parsers`; `confident_contacts.representative_atom_contact_pairs`; `biophysics.connolly.trim`; and the ignored `residue_names` argument of `biophysics.connolly.mds`. This is part of a simplification pass over scoring, parsing, report rendering and the biophysics ports that leaves scores, CSVs, reports and PAE images byte-identical on the bundled AF2, AF3, AF3x and Boltz-2 test runs. + ## 1.4.2 - 2026-08-10 ### Fixed diff --git a/README.md b/README.md index fc43f71e..cc20b7a6 100644 --- a/README.md +++ b/README.md @@ -195,6 +195,26 @@ AlphaJudge expects standard prediction run outputs. The tool searches for `model.cif` inside each model subdirectory first; otherwise it tries to match `**.cif` or `**.pdb` at the run root. AlphaJudge currently scores protein and nucleic-acid interfaces; ligands present in AF3 or Boltz-2 structures are ignored for interface construction. When confidence arrays include ligand tokens, supported parsers align or trim them to the scored protein/nucleic-acid residue block. +For AF3 and AF3x, PAE and contact probabilities are aligned using token chain and +residue identifiers, preserving both directions of each residue-pair value while +discarding ligand tokens. If residue identifiers are absent, alignment requires +matching chain IDs and exactly one token per scored residue within each retained +chain. Unmappable PAE, ambiguous tokens on a retained residue, and summary-only +`chain_pair_pae_min` data cause the model to be skipped with an explicit error; +chain minima are never substituted for residue-level PAE. Full +`confidences.json` data are required (compressed `.xz`/`.gz` files are supported). +A modified residue, which AF3 tokenizes per atom, is represented by the token of +its CA (or C1') atom. +Per-interface ipTM is looked up in `chain_pair_iptm` by chain ID, so ligand or +crosslinker chains listed before or between the proteins do not shift it. + +AF3 global confidences (pTM, ipTM, ranking score) are computed over every token, +including the ligands, ions and AF3x crosslinkers that AlphaJudge excludes from +interface scoring. AlphaJudge preserves these raw values, but for such +predictions it omits `confidence_score` (and any global ipTM fallback) from the +metascore and report percentiles. The remaining metascore features use the +existing calibration; this is not an AF3x-specific calibration. + --- ## Output schema (CSV) @@ -205,6 +225,11 @@ AlphaJudge writes `interfaces.csv` with one row per interface (and includes the - **model_used**: selected model identifier - **interface**: chain-pair label (e.g., `A_B`) - **iptm_ptm, iptm, ptm, confidence_score**: unified AF confidences +- **global_confidence_scope**: `scored_residues` for AF3 confidence covering only + scored residues, `includes_excluded_tokens` when it also covers ligand/other + discarded tokens, or `unknown` for parsers without this metadata. Applies to + `ptm`, `iptm_ptm`, `confidence_score`, and global ipTM. +- **iptm_scope**: `chain_pair` for per-interface ipTM, otherwise `global`. - **pDockQ/mpDockQ**: global dockQ-like score (mpDockQ if multimer; pDockQ if dimer) - **average_interface_pae, interface_average_plddt, interface_num_intf_residues** - **interface_contact_pairs, interface_ccc, interface_score, interface_pDockQ2, interface_ipSAE, interface_LIS, interface_cLIS, interface_iLIS**: CCC counts Interactome3D-defined inter-chain residue contacts whose chain1→chain2 PAE is strictly below 4 Å. Alternative geometry, direction and boundary conventions are available through `Interface.confident_contacts(...)`. @@ -225,7 +250,12 @@ pip install -e ".[test]" pytest -q ``` -Tests exercise AF2, AF3, and Boltz-2 parsers and validate the CSV fields against bundled fixtures in `test_data/`. The slow CCP4 SC regression suite is opt-in and can be enabled with `ALPHAJUDGE_RUN_SLOW_SC_REFERENCE=1`; CI always runs it across Python 3.10–3.13. +Tests exercise AF2, AF3, AF3x, and Boltz-2 parsers and validate the CSV fields +against bundled fixtures in `test_data/` and `test/fixtures/`. The AF3x fixture +contains a real 4G3Y B–C prediction with a DSSO crosslink; its provenance and +regeneration instructions are included, and regression tests require no GPU. +The slow CCP4 SC regression suite is opt-in and can be enabled with +`ALPHAJUDGE_RUN_SLOW_SC_REFERENCE=1`; CI always runs it across Python 3.10–3.13. --- diff --git a/scripts/extract_pisa_molref.py b/scripts/extract_pisa_molref.py index bb303c58..c1d14c40 100644 --- a/scripts/extract_pisa_molref.py +++ b/scripts/extract_pisa_molref.py @@ -23,27 +23,8 @@ import struct from pathlib import Path -STANDARD_AA = ( - "ALA", - "ARG", - "ASN", - "ASP", - "CYS", - "GLN", - "GLU", - "GLY", - "HIS", - "ILE", - "LEU", - "LYS", - "MET", - "PHE", - "PRO", - "SER", - "THR", - "TRP", - "TYR", - "VAL", +STANDARD_AA = tuple( + "ALA ARG ASN ASP CYS GLN GLU GLY HIS ILE LEU LYS MET PHE PRO SER THR TRP TYR VAL".split() ) diff --git a/scripts/validate_ccp4_biophysics.py b/scripts/validate_ccp4_biophysics.py index 16fe2921..c8b7c63b 100644 --- a/scripts/validate_ccp4_biophysics.py +++ b/scripts/validate_ccp4_biophysics.py @@ -17,9 +17,9 @@ import subprocess import tempfile import xml.etree.ElementTree as ET +from collections.abc import Iterable from dataclasses import dataclass from pathlib import Path -from typing import Iterable from Bio.PDB import MMCIFParser, PDBIO, PDBParser @@ -100,26 +100,24 @@ def _text(node: ET.Element, name: str, default: str = "") -> str: return found.text.strip() -def _parse_bonds(interface: ET.Element, tag: str) -> list[dict[str, str | float]]: +_BOND_FIELDS = { + f"{field}_{side}": f"{tag}-{side}" + for side in (1, 2) + for field, tag in (("chain", "chain"), ("res", "res"), ("seqnum", "seqnum"), ("atom", "atname")) +} + + +def _parse_bonds(interface: ET.Element, tag: str) -> tuple[int, list[dict[str, str | float]]]: + """Reported bond count and per-bond records of one PISA bond section.""" section = interface.find(tag) if section is None: - return [] - bonds = [] - for bond in section.findall("bond"): - bonds.append( - { - "chain_1": _text(bond, "chain-1"), - "res_1": _text(bond, "res-1"), - "seqnum_1": _text(bond, "seqnum-1"), - "atom_1": _text(bond, "atname-1"), - "chain_2": _text(bond, "chain-2"), - "res_2": _text(bond, "res-2"), - "seqnum_2": _text(bond, "seqnum-2"), - "atom_2": _text(bond, "atname-2"), - "dist": float(_text(bond, "dist", "nan")), - } - ) - return bonds + return 0, [] + bonds = [ + {**{key: _text(bond, xml_tag) for key, xml_tag in _BOND_FIELDS.items()}, + "dist": float(_text(bond, "dist", "nan"))} + for bond in section.findall("bond") + ] + return int(_text(section, "n_bonds", "0")), bonds def _parse_pisa_xml(xml_text: str) -> dict: @@ -138,17 +136,14 @@ def _parse_pisa_xml(xml_text: str) -> dict: "bonds": {"hb": [], "sb": [], "ss": []}, } - hb = _parse_bonds(interface, "h-bonds") - sb = _parse_bonds(interface, "salt-bridges") - ss = _parse_bonds(interface, "ss-bonds") - h_section = interface.find("h-bonds") - sb_section = interface.find("salt-bridges") - ss_section = interface.find("ss-bonds") + n_hb, hb = _parse_bonds(interface, "h-bonds") + n_sb, sb = _parse_bonds(interface, "salt-bridges") + n_ss, ss = _parse_bonds(interface, "ss-bonds") return { "area": float(_text(interface, "int_area", "0")), - "hb": int(_text(h_section if h_section is not None else ET.Element("x"), "n_bonds", "0")), - "sb": int(_text(sb_section if sb_section is not None else ET.Element("x"), "n_bonds", "0")), - "ss": int(_text(ss_section if ss_section is not None else ET.Element("x"), "n_bonds", "0")), + "hb": n_hb, + "sb": n_sb, + "ss": n_ss, "int_solv_en": float(_text(interface, "int_solv_en", "0")), "bonds": {"hb": hb, "sb": sb, "ss": ss}, } @@ -159,12 +154,11 @@ def _run_pisa(fixture: Fixture, pdb_path: Path, out_dir: Path) -> dict: session = f"aj_{digest}" work = out_dir / fixture.id work.mkdir(parents=True, exist_ok=True) - analyse = _run_ccp4(f"pisa {session} -analyse {pdb_path}", cwd=work) - (work / "pisa_analyse.log").write_text(analyse.stdout + analyse.stderr) - xml_result = _run_ccp4(f"pisa {session} -xml interfaces", cwd=work) - xml = xml_result.stdout - (work / "pisa_interfaces.xml").write_text(xml) try: + analyse = _run_ccp4(f"pisa {session} -analyse {pdb_path}", cwd=work) + (work / "pisa_analyse.log").write_text(analyse.stdout + analyse.stderr) + xml = _run_ccp4(f"pisa {session} -xml interfaces", cwd=work).stdout + (work / "pisa_interfaces.xml").write_text(xml) listing = _run_ccp4(f"pisa {session} -list interfaces", cwd=work).stdout (work / "pisa_interfaces.txt").write_text(listing) finally: diff --git a/src/alphajudge/biophysics/__init__.py b/src/alphajudge/biophysics/__init__.py index a945dd3b..48c69588 100644 --- a/src/alphajudge/biophysics/__init__.py +++ b/src/alphajudge/biophysics/__init__.py @@ -1,19 +1,4 @@ from __future__ import annotations -from .scoring import ( - buried_surface_area, - shape_complementarity, - hydrogen_bonds, - interface_solvation_energy, - salt_bridges, - disulfide_bonds, -) - -__all__ = [ - "buried_surface_area", - "shape_complementarity", - "hydrogen_bonds", - "interface_solvation_energy", - "salt_bridges", - "disulfide_bonds", -] +from .scoring import * # noqa: F401,F403 +from .scoring import __all__ # noqa: F401 diff --git a/src/alphajudge/biophysics/bonds.py b/src/alphajudge/biophysics/bonds.py index c015e98e..7f5200dd 100644 --- a/src/alphajudge/biophysics/bonds.py +++ b/src/alphajudge/biophysics/bonds.py @@ -33,57 +33,40 @@ def _atom_is_hydrogen_candidate(resname: str, atom_name: str) -> bool: return _srs_hb_type(resname, atom_name) == "H" -def _select_coords(residues, predicate) -> np.ndarray: - """Coords of atoms in `residues` matching predicate(resname, atom_name).""" - out = [] - for r in residues: - rn = r.get_resname().strip().upper() - for a in r: - if predicate(rn, a.id.strip().upper()): - out.append(a.coord) - return np.asarray(out, dtype=float) if out else np.empty((0, 3)) - - -def _select_atom_coords(residues, predicate) -> tuple[list, np.ndarray]: - atoms = [] - coords = [] - for r in residues: - rn = r.get_resname().strip().upper() - for a in r: - if predicate(rn, a.id.strip().upper()): - atoms.append(a) - coords.append(a.coord) - arr = np.asarray(coords, dtype=float) if coords else np.empty((0, 3)) - return atoms, arr - - -def _count_pairs_within(pts_a: np.ndarray, pts_b: np.ndarray, dmin: float, dmax: float) -> int: - if len(pts_a) == 0 or len(pts_b) == 0: - return 0 - tree = cKDTree(pts_b) - cnt = 0 - for c in pts_a: - for j in tree.query_ball_point(c, dmax): - d = float(np.linalg.norm(c - pts_b[j])) - if dmin <= d <= dmax: - cnt += 1 - return cnt - - -def _residue_seqid(residue) -> str: - seqid = str(residue.id[1]) - insertion = residue.id[2].strip() - return seqid + insertion if insertion else seqid - - -def _atom_pair_key(atom1, atom2) -> tuple[tuple[str, str, str, str], tuple[str, str, str, str]]: +_AtomKey = tuple[str, str, str, str] +_PairKey = tuple[_AtomKey, _AtomKey] + + +def _select_atoms(residues, predicate) -> tuple[list, np.ndarray]: + """Atoms of ``residues`` matching predicate(resname, atom_name), with their coords.""" + atoms = [ + a + for r in residues + for a in r + if predicate(r.get_resname().strip().upper(), a.id.strip().upper()) + ] + coords = np.asarray([a.coord for a in atoms], dtype=float) if atoms else np.empty((0, 3)) + return atoms, coords + + +def _contacts(atoms_a, coords_a, atoms_b, coords_b, dmin: float, dmax: float): + """Yield (atom_a, atom_b) pairs whose distance lies in [dmin, dmax].""" + if len(coords_a) == 0 or len(coords_b) == 0: + return + tree = cKDTree(coords_b) + for i, coord in enumerate(coords_a): + for j in tree.query_ball_point(coord, dmax): + if dmin <= float(np.linalg.norm(coord - coords_b[j])) <= dmax: + yield atoms_a[i], atoms_b[j] + + +def _atom_pair_key(atom1, atom2) -> _PairKey: def one(atom): residue = atom.get_parent() - chain = residue.get_parent() return ( - chain.id, + residue.get_parent().id, residue.get_resname().strip().upper(), - _residue_seqid(residue), + f"{residue.id[1]}{residue.id[2].strip()}", atom.id.strip().upper(), ) @@ -130,20 +113,11 @@ def _standard_chain_residues(chain) -> list: ] -def _is_n_terminus(atom) -> bool: +def _is_chain_terminus(atom, position: int) -> bool: + """Whether the atom's residue is the first (0) or last (-1) standard residue.""" residue = atom.get_parent() - if atom.id.strip().upper() != "N": - return False residues = _standard_chain_residues(residue.get_parent()) - return bool(residues) and residues[0] is residue - - -def _is_c_terminus(atom) -> bool: - residue = atom.get_parent() - if atom.id.strip().upper() not in {"O", "OXT"}: - return False - residues = _standard_chain_residues(residue.get_parent()) - return bool(residues) and residues[-1] is residue + return bool(residues) and residues[position] is residue def _is_salt_bridge_pair(donor_atom, acceptor_atom) -> bool: @@ -155,7 +129,7 @@ def _is_salt_bridge_pair(donor_atom, acceptor_atom) -> bool: donor_resname = donor_atom.get_parent().get_resname().strip().upper() donor_name = donor_atom.id.strip().upper() if donor_name == "N": - donor_ok = _is_n_terminus(donor_atom) + donor_ok = _is_chain_terminus(donor_atom, 0) else: donor_ok = donor_resname in {"LYS", "ARG", "HIS"} if not donor_ok: @@ -164,7 +138,7 @@ def _is_salt_bridge_pair(donor_atom, acceptor_atom) -> bool: acceptor_resname = acceptor_atom.get_parent().get_resname().strip().upper() acceptor_name = acceptor_atom.id.strip().upper() if acceptor_name in {"O", "OXT"}: - return _is_c_terminus(acceptor_atom) + return _is_chain_terminus(acceptor_atom, -1) return acceptor_resname in {"GLU", "ASP"} @@ -208,34 +182,25 @@ def _hydrogen_bond_pairs_for_contact(donor_atom, acceptor_atom) -> list[tuple[ob return [(donor_atom, acceptor_atom)] -def _donor_acceptor_contacts(residues1, residues2, max_dist: float): - donors1, d1 = _select_atom_coords(residues1, _atom_is_donor) - acceptors2, a2 = _select_atom_coords(residues2, _atom_is_acceptor) - donors2, d2 = _select_atom_coords(residues2, _atom_is_donor) - acceptors1, a1 = _select_atom_coords(residues1, _atom_is_acceptor) - - for donor_atoms, donor_coords, acceptor_atoms, acceptor_coords in ( - (donors1, d1, acceptors2, a2), - (donors2, d2, acceptors1, a1), - ): - if len(donor_coords) == 0 or len(acceptor_coords) == 0: - continue - tree = cKDTree(acceptor_coords) - for i, donor_coord in enumerate(donor_coords): - for j in tree.query_ball_point(donor_coord, max_dist): - dist = float(np.linalg.norm(donor_coord - acceptor_coords[j])) - if HB_MIN_DIST <= dist <= max_dist: - yield donor_atoms[i], acceptor_atoms[j], dist +def _donor_acceptor_contacts(residues1, residues2, min_dist: float, max_dist: float): + """Yield (donor, acceptor) atom pairs across the two sides, in both directions.""" + for donor_side, acceptor_side in ((residues1, residues2), (residues2, residues1)): + yield from _contacts( + *_select_atoms(donor_side, _atom_is_donor), + *_select_atoms(acceptor_side, _atom_is_acceptor), + min_dist, + max_dist, + ) -def _salt_bridge_pairs(residues1, residues2) -> set[ - tuple[tuple[str, str, str, str], tuple[str, str, str, str]] -]: - pairs = set() - for donor_atom, acceptor_atom, dist in _donor_acceptor_contacts(residues1, residues2, SB_MAX_DIST): - if SB_MIN_DIST <= dist <= SB_MAX_DIST and _is_salt_bridge_pair(donor_atom, acceptor_atom): - pairs.add(_atom_pair_key(donor_atom, acceptor_atom)) - return pairs +def _salt_bridge_pairs(residues1, residues2) -> set[_PairKey]: + return { + _atom_pair_key(donor_atom, acceptor_atom) + for donor_atom, acceptor_atom in _donor_acceptor_contacts( + residues1, residues2, SB_MIN_DIST, SB_MAX_DIST + ) + if _is_salt_bridge_pair(donor_atom, acceptor_atom) + } def hydrogen_bonds(residues1, residues2) -> int: @@ -248,13 +213,12 @@ def hydrogen_bonds(residues1, residues2) -> int: """ residues1, residues2 = _pisa_interface_residues(residues1, residues2) salt_pairs = _salt_bridge_pairs(residues1, residues2) - pairs: set[tuple[tuple[str, str, str, str], tuple[str, str, str, str]]] = set() + pairs: set[_PairKey] = set() - for donor_atom, acceptor_atom, dist in _donor_acceptor_contacts(residues1, residues2, HB_MAX_DIST): - if not (HB_MIN_DIST <= dist <= HB_MAX_DIST): - continue - pair_key = _atom_pair_key(donor_atom, acceptor_atom) - if pair_key in salt_pairs: + for donor_atom, acceptor_atom in _donor_acceptor_contacts( + residues1, residues2, HB_MIN_DIST, HB_MAX_DIST + ): + if _atom_pair_key(donor_atom, acceptor_atom) in salt_pairs: continue for atom1, atom2 in _hydrogen_bond_pairs_for_contact(donor_atom, acceptor_atom): pairs.add(_atom_pair_key(atom1, atom2)) @@ -269,10 +233,11 @@ def salt_bridges(residues1, residues2) -> int: def disulfide_bonds(residues1, residues2) -> int: """Count inter-chain Cys SG-Cys SG disulfide bonds.""" - sg = lambda rn, an: rn == "CYS" and an == "SG" - s1 = _select_coords(residues1, sg) - s2 = _select_coords(residues2, sg) - return _count_pairs_within(s1, s2, 0.0, SS_MAX_DIST) + def is_sg(resname: str, atom_name: str) -> bool: + return resname == "CYS" and atom_name == "SG" + + pairs = _contacts(*_select_atoms(residues1, is_sg), *_select_atoms(residues2, is_sg), 0.0, SS_MAX_DIST) + return sum(1 for _ in pairs) __all__ = ["disulfide_bonds", "hydrogen_bonds", "salt_bridges"] diff --git a/src/alphajudge/biophysics/connolly.py b/src/alphajudge/biophysics/connolly.py index 025ae16b..b87838d1 100644 --- a/src/alphajudge/biophysics/connolly.py +++ b/src/alphajudge/biophysics/connolly.py @@ -19,8 +19,7 @@ from __future__ import annotations import math -from functools import lru_cache -from typing import Sequence +from functools import cache import numpy as np from scipy.spatial import cKDTree @@ -131,15 +130,13 @@ def _sc_match_atom(atom_name: str, pattern: str) -> bool: Match atom_name against pattern, where trailing '*' is a prefix wildcard. Mirrors the Fortran match() function. """ - if pattern == "*": - return True star = pattern.find("*") if star == -1: return atom_name == pattern return atom_name.startswith(pattern[:star]) -@lru_cache(maxsize=None) +@cache def get_radius(residue_name: str, atom_name: str) -> float: """ Look up the CCP4 sc_radii radius for a (residue, atom) pair. Later entries @@ -150,7 +147,7 @@ def get_radius(residue_name: str, atom_name: str) -> float: radius = 1.80 for res_pat, atom_pat, r in _SC_RADII_TABLE: - if (res_pat == "***" or res_pat.upper() == res) and _sc_match_atom(atom, atom_pat.upper()): + if res_pat in ("***", res) and _sc_match_atom(atom, atom_pat): radius = r return radius @@ -182,7 +179,7 @@ def _dis2(a: np.ndarray, b: np.ndarray) -> float: def _dis(a: np.ndarray, b: np.ndarray) -> float: - return math.sqrt(max(0.0, _dis2(a, b))) + return math.sqrt(_dis2(a, b)) def _norm(a: np.ndarray) -> np.ndarray: @@ -192,12 +189,6 @@ def _norm(a: np.ndarray) -> np.ndarray: return a / n -def _disptl(cen: np.ndarray, axis: np.ndarray, pnt: np.ndarray) -> float: - vec = pnt - cen - dt = _dot(vec, axis) - return math.sqrt(max(0.0, float(np.dot(vec, vec)) - dt * dt)) - - # --------------------------------------------------------------------------- # Sampling helpers # --------------------------------------------------------------------------- @@ -213,34 +204,25 @@ def _subdiv( y: np.ndarray, angle: float, density: float, -) -> tuple[np.ndarray, float]: +) -> np.ndarray: """ - Sample points along an arc in the plane spanned by orthonormal x/y. - - Returns - ------- - points : (n, 3) ndarray - spacing : float - Arc length divided by number of returned points. + Sample (n, 3) points along an arc in the plane spanned by orthonormal x/y. - Notes - ----- This preserves the original Fortran/Python sampling phase offset: points are placed at delta/2, 3*delta/2, 5*delta/2, ... """ if density <= 0.0 or rad <= 0.0 or angle <= 0.0: - return _empty_points(), 0.0 + return _empty_points() delta = 1.0 / (math.sqrt(density) * rad) n_points = int(math.floor(angle / delta + 0.5)) if n_points <= 0: - return _empty_points(), 0.0 + return _empty_points() angles = delta * (0.5 + np.arange(n_points, dtype=float)) cos_a = np.cos(angles)[:, None] sin_a = np.sin(angles)[:, None] - points = cen + rad * (cos_a * x + sin_a * y) - return points, (rad * angle / n_points) + return cen + rad * (cos_a * x + sin_a * y) def _subarc( @@ -250,7 +232,7 @@ def _subarc( density: float, x: np.ndarray, v: np.ndarray, -) -> tuple[np.ndarray, float]: +) -> np.ndarray: y = _cross(axis, x) angle = math.atan2(_dot(v, y), _dot(v, x)) if angle < 0.0: @@ -259,7 +241,6 @@ def _subarc( def _axis_seed(axis: np.ndarray) -> np.ndarray: - axis = np.asarray(axis, dtype=float) v1 = np.array( [ axis[1] ** 2 + axis[2] ** 2, @@ -276,15 +257,6 @@ def _axis_seed(axis: np.ndarray) -> np.ndarray: return v1 -def _basis_from_axis(axis: np.ndarray) -> tuple[np.ndarray, np.ndarray]: - axis = np.asarray(axis, dtype=float) - v1 = _axis_seed(axis) - v2 = _norm(_cross(axis, v1)) - x = _norm(_cross(axis, v2)) - y = _cross(axis, x) - return x, y - - def _equatorial_vector(axis: np.ndarray) -> np.ndarray: return _norm(_cross(axis, _axis_seed(axis))) @@ -294,9 +266,9 @@ def _subcir( rad: float, axis: np.ndarray, density: float, -) -> tuple[np.ndarray, float]: - x, y = _basis_from_axis(axis) - return _subdiv(cen, rad, x, y, 2.0 * math.pi, density) +) -> np.ndarray: + x = _norm(_cross(axis, _equatorial_vector(axis))) + return _subdiv(cen, rad, x, _cross(axis, x), 2.0 * math.pi, density) # --------------------------------------------------------------------------- @@ -350,20 +322,10 @@ def _points_outside_spheres( return keep -def _point_outside_spheres( - point: np.ndarray, - centers: np.ndarray, - radii2: np.ndarray, - inclusive: bool = True, -) -> bool: - """Single-point fast path for `_points_outside_spheres`.""" - if centers.size == 0: - return True +def _point_outside_spheres(point: np.ndarray, centers: np.ndarray, radii2: np.ndarray) -> bool: + """Single-point fast path for `_points_outside_spheres` (inclusive blocking).""" diff = centers - point - d2 = np.einsum("ij,ij->i", diff, diff) - if inclusive: - return bool(np.all(d2 > radii2)) - return bool(np.all(d2 >= radii2)) + return bool(np.all(np.einsum("ij,ij->i", diff, diff) > radii2)) def _check_buried( @@ -385,67 +347,27 @@ def _check_buried( return bool(np.any(d2 <= burrad2_with_probe[atom_idx])) -def _check_buried_many( - pcen: np.ndarray, - atom_indices: np.ndarray, - burco: list[np.ndarray], - burrad2_with_probe: list[np.ndarray], -) -> np.ndarray: +def _buried_mask(pcen: np.ndarray, centers: np.ndarray, radii2: np.ndarray) -> np.ndarray: """ - Vectorized form of `_check_buried` for many probe centres. + Vectorized `_check_buried` for many probe centres of one supporting atom. - Probe centres are grouped by their supporting atom. That keeps the logic - identical to the scalar helper, but avoids thousands of tiny Python calls - in the convex-surface pass. + Keep the same arithmetic as `_check_buried` (`diff dot diff`) rather than + the expanded distance formula used by `_points_outside_spheres`: some + Connolly dots lie exactly on sphere boundaries, so tiny round-off changes + can flip ACCESSIBLE/BURIED labels. """ - pcen = np.asarray(pcen, dtype=float) - atom_indices = np.asarray(atom_indices, dtype=int) buried = np.zeros(len(pcen), dtype=bool) - if len(pcen) == 0: - return buried - - for atom_idx in np.unique(atom_indices): - mask = atom_indices == atom_idx - centers = burco[atom_idx] - if centers.size == 0: - continue - radii2 = burrad2_with_probe[atom_idx] - - # Keep the same arithmetic as `_check_buried` (`diff dot diff`) rather - # than the expanded distance formula used by `_points_outside_spheres`. - # Some Connolly dots lie exactly on sphere boundaries, so tiny - # round-off changes can flip ACCESSIBLE/BURIED labels. - pts = pcen[mask] - point_buried = np.zeros(len(pts), dtype=bool) - for start in range(0, len(pts), 256): - stop = min(start + 256, len(pts)) - diff = pts[start:stop, None, :] - centers[None, :, :] - d2 = np.einsum("ijk,ijk->ij", diff, diff) - point_buried[start:stop] = np.any(d2 <= radii2[None, :], axis=1) - buried[mask] = point_buried + for start in range(0, len(pcen), 256): + diff = pcen[start:start + 256, None, :] - centers[None, :, :] + d2 = np.einsum("ijk,ijk->ij", diff, diff) + buried[start:start + 256] = np.any(d2 <= radii2[None, :], axis=1) return buried -# --------------------------------------------------------------------------- -# Surface append helper -# --------------------------------------------------------------------------- - -def _append_points( - out_dots: list[np.ndarray], - out_normals: list[np.ndarray], - out_flags: list[np.ndarray], - out_mol: list[np.ndarray], - dots: np.ndarray, - normals: np.ndarray, - buried_mask: np.ndarray, - mol_label: int, -) -> None: - if len(dots) == 0: - return - out_dots.append(np.asarray(dots, dtype=float)) - out_normals.append(np.asarray(normals, dtype=float)) - out_flags.append(np.where(buried_mask, BURIED_FLAG, ACCESSIBLE_FLAG).astype(int, copy=False)) - out_mol.append(np.full(len(dots), int(mol_label), dtype=int)) +def _append_points(out: list, dots: np.ndarray, normals: np.ndarray, buried_mask, mol_label: int) -> None: + if len(dots): + flags = np.where(buried_mask, BURIED_FLAG, ACCESSIBLE_FLAG).astype(int, copy=False) + out.append((dots, normals, flags, np.full(len(dots), int(mol_label), dtype=int))) # --------------------------------------------------------------------------- @@ -458,7 +380,6 @@ def mds( radii: np.ndarray, mol: np.ndarray, density: float = DOT_DENSITY, - residue_names: Sequence[str] | None = None, ) -> tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]: """ Generate a Connolly molecular dot surface. @@ -470,8 +391,6 @@ def mds( radii : np.array (N,) VdW radii mol : np.array (N,) int, molecule label (1 or 2) density : float, dots per Ų - residue_names : list of str, residue names per atom (unused, kept for - API compatibility — radii are passed in directly) Returns ------- @@ -493,46 +412,48 @@ def mds( atom_tree = cKDTree(atoms) max_radius = float(np.max(radii)) - out_dots: list[np.ndarray] = [] - out_normals: list[np.ndarray] = [] - out_flags: list[np.ndarray] = [] - out_mol: list[np.ndarray] = [] + out: list[tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]] = [] burco: list[np.ndarray] = [_empty_points() for _ in range(natom)] burrad2_with_probe: list[np.ndarray] = [np.empty(0, dtype=float) for _ in range(natom)] access = np.zeros(natom, dtype=bool) probes: list[tuple[np.ndarray, np.ndarray, float, int, int, int]] = [] same_neighbors: list[np.ndarray] = [] - candidate_neighbors: list[np.ndarray] = [] for i1 in range(natom): reach = float(radii[i1] + max_radius + 2.0 * rp) candidates = np.asarray(atom_tree.query_ball_point(atoms[i1], reach), dtype=int) - candidate_neighbors.append(candidates) - - same_mask = (candidates != i1) & (mol[candidates] == mol[i1]) - same = candidates[same_mask] - if same.size: - bridge2 = (radii[i1] + radii[same] + 2.0 * rp) ** 2 - diff = atoms[same] - atoms[i1] - d2 = np.einsum("ij,ij->i", diff, diff) - within = d2 < bridge2 - same = same[within] - if same.size: - same = same[np.argsort(d2[within])] - same_neighbors.append(same) - - other_mask = (candidates != i1) & (mol[candidates] != mol[i1]) - other = candidates[other_mask] - if other.size: - bridge2 = (radii[i1] + radii[other] + 2.0 * rp) ** 2 - diff = atoms[other] - atoms[i1] - d2 = np.einsum("ij,ij->i", diff, diff) - other = other[d2 < bridge2] + nbrs = candidates[candidates != i1] + diff = atoms[nbrs] - atoms[i1] + d2 = np.einsum("ij,ij->i", diff, diff) + near = d2 < (radii[i1] + radii[nbrs] + 2.0 * rp) ** 2 + same_mol = mol[nbrs] == mol[i1] + + within = near & same_mol + same_neighbors.append(nbrs[within][np.argsort(d2[within])]) + + other = nbrs[near & ~same_mol] if other.size: - burco[i1] = atoms[other].copy() + burco[i1] = atoms[other] burrad2_with_probe[i1] = (radii[other] + rp) ** 2 + def torus(i1: int, i2: int): + """Probe torus between atoms i1, i2: (dij, uij, asymm, tij, rij), or None.""" + ri, rj = float(radii[i1]), float(radii[i2]) + eri, erj = float(eradii[i1]), float(eradii[i2]) + dij = _dis(atoms[i1], atoms[i2]) + uij = (atoms[i2] - atoms[i1]) / dij + asymm = (eri * eri - erj * erj) / dij + tij = 0.5 * (atoms[i1] + atoms[i2]) + 0.5 * asymm * uij + + far = (eri + erj) ** 2 - dij ** 2 + if far <= 0.0: + return None + contain = dij ** 2 - (ri - rj) ** 2 + if contain <= 0.0: + return None + return dij, uij, asymm, tij, 0.5 * math.sqrt(far) * math.sqrt(contain) / dij + # ── First loop: build probes and toroidal surface ──────────────────────── for i1 in range(natom): ri = float(radii[i1]) @@ -550,19 +471,11 @@ def mds( rj = float(radii[i2]) erj = float(eradii[i2]) - dij = _dis(atoms[i1], atoms[i2]) - uij = (atoms[i2] - atoms[i1]) / dij - asymm = (eri * eri - erj * erj) / dij - between = abs(asymm) < dij - tij = 0.5 * (atoms[i1] + atoms[i2]) + 0.5 * asymm * uij - - far = (eri + erj) ** 2 - dij ** 2 - if far <= 0.0: - continue - contain = dij ** 2 - (ri - rj) ** 2 - if contain <= 0.0: + geometry = torus(i1, i2) + if geometry is None: continue - rij = 0.5 * math.sqrt(far) * math.sqrt(contain) / dij + dij, uij, asymm, tij, rij = geometry + between = abs(asymm) < dij if nnbr <= 1: access[i1] = access[i2] = True @@ -571,7 +484,6 @@ def mds( if i3 <= i2: continue - rk = float(radii[i3]) erk = float(eradii[i3]) if _dis(atoms[i2], atoms[i3]) >= erj + erk: @@ -606,21 +518,16 @@ def mds( continue hijk = math.sqrt(h2) - blockers = np.array([i4 for i4 in same_nbrs if i4 != i2 and i4 != i3], dtype=int) - blocker_centers = atoms[blockers] if blockers.size else _empty_points() - blocker_radii2 = (eradii[blockers] ** 2) if blockers.size else np.empty(0, dtype=float) + blockers = same_nbrs[(same_nbrs != i2) & (same_nbrs != i3)] + blocker_centers = atoms[blockers] + blocker_radii2 = eradii[blockers] ** 2 for isign in (1, -1): pijk = bijk + isign * hijk * uijk - if blockers.size and not _point_outside_spheres( - pijk, - blocker_centers, - blocker_radii2, - ): + if not _point_outside_spheres(pijk, blocker_centers, blocker_radii2): continue - - pi1_, pi2_, pi3_ = (i1, i2, i3) if isign > 0 else (i2, i1, i3) - probes.append((pijk.copy(), isign * uijk.copy(), hijk, pi1_, pi2_, pi3_)) + pi1_, pi2_ = (i1, i2) if isign > 0 else (i2, i1) + probes.append((pijk, isign * uijk, hijk, pi1_, pi2_, i3)) access[i1] = access[i2] = access[i3] = True # Toroidal surface @@ -629,14 +536,12 @@ def mds( rb = max(0.0, rij - rp) edens = ((rci + 2.0 * rb + rcj) / (4.0 * rij)) ** 2 * density - circ_pnts, _ = _subcir(tij, rij, uij, edens) + circ_pnts = _subcir(tij, rij, uij, edens) if len(circ_pnts) == 0: continue - blockers = np.array([i4 for i4 in same_nbrs if i4 != i2], dtype=int) - if blockers.size: - keep = _points_outside_spheres(circ_pnts, atoms[blockers], eradii[blockers] ** 2) - circ_pnts = circ_pnts[keep] + blockers = same_nbrs[same_nbrs != i2] + circ_pnts = circ_pnts[_points_outside_spheres(circ_pnts, atoms[blockers], eradii[blockers] ** 2)] if len(circ_pnts) == 0: continue @@ -675,32 +580,22 @@ def mds( pqi = sum_vecs[valid_sum] / sum_norms[valid_sum][:, None] pqj = pqi.copy() - for half_index, (start_vecs, end_vecs, atom_i) in enumerate(( - (pi_vecs, pqi, i1), - (pqj, pj_vecs, i2), - )): - # SCASA / CCP4 sc.f build burco[j] only when the outer atom - # loop reaches j, so at this point burco[i2] is still empty - # and the i2 half of the torus is always accessible in the - # reference. Mirror that here so flag output matches sc.f. - check_burial = half_index == 0 + # SCASA / CCP4 sc.f build burco[j] only when the outer atom loop + # reaches j, so at this point burco[i2] is still empty and the i2 + # half of the torus is always accessible in the reference. Mirror + # that here so flag output matches sc.f. + for start_vecs, end_vecs, check_burial in ((pi_vecs, pqi, True), (pqj, pj_vecs, False)): for center, axis, start_v, end_v in zip(circ_pnts, axes, start_vecs, end_vecs): dt = float(np.clip(_dot(start_v, end_v), -1.0, 1.0)) if abs(dt) >= 1.0: continue - arc, _ = _subarc(center, rp, axis, density, start_v, end_v) + arc = _subarc(center, rp, axis, density, start_v, end_v) if len(arc) == 0: continue - normals = (center - arc) / rp - is_buried = ( - _check_buried(center, atom_i, burco, burrad2_with_probe) - if check_burial - else False - ) - buried = np.full(len(arc), is_buried, dtype=bool) - _append_points(out_dots, out_normals, out_flags, out_mol, arc, normals, buried, m1) + is_buried = check_burial and _check_buried(center, i1, burco, burrad2_with_probe) + _append_points(out, arc, (center - arc) / rp, np.full(len(arc), is_buried, dtype=bool), m1) # ── Concave (re-entrant) surface ────────────────────────────────────────── if probes: @@ -717,7 +612,8 @@ def mds( m1 = int(mol[i1]) if hijk < rp and len(low_coords): - near_mask = np.einsum("ij,ij->i", low_coords - pijk, low_coords - pijk) < (4.0 * rp * rp) + offsets = low_coords - pijk + near_mask = np.einsum("ij,ij->i", offsets, offsets) < (4.0 * rp * rp) near_mask &= low_idx != iprb near_low = low_coords[near_mask] else: @@ -744,7 +640,7 @@ def mds( except ValueError: continue - lats, _ = _subarc(np.zeros(3), rp, axis, density, vp[mm], south) + lats = _subarc(np.zeros(3), rp, axis, density, vp[mm], south) for lat in lats: dt = _dot(lat, south) cen = dt * south @@ -752,7 +648,7 @@ def mds( if rad2 <= 0.0: continue - circle_pnts, _ = _subcir(cen, math.sqrt(rad2), south, density) + circle_pnts = _subcir(cen, math.sqrt(rad2), south, density) if len(circle_pnts) == 0: continue @@ -787,12 +683,11 @@ def mds( mc = atom_idx support_idx[j] = mc - normals = (pijk - pts) / rp buried = np.array( [_check_buried(pijk, atom_idx, burco, burrad2_with_probe) for atom_idx in support_idx], dtype=bool, ) - _append_points(out_dots, out_normals, out_flags, out_mol, pts, normals, buried, m1) + _append_points(out, pts, (pijk - pts) / rp, buried, m1) # ── Convex (contact) surface ────────────────────────────────────────────── for i1 in range(natom): @@ -812,25 +707,13 @@ def mds( i2 = int(same_nbrs[0]) north = _norm(atoms[i1] - atoms[i2]) eqvec = _equatorial_vector(north) - vql = _cross(eqvec, north) - - rj = float(radii[i2]) - erj = float(eradii[i2]) - dij = _dis(atoms[i1], atoms[i2]) - uij = (atoms[i2] - atoms[i1]) / dij - asymm = (eri * eri - erj * erj) / dij - tij = 0.5 * (atoms[i1] + atoms[i2]) + 0.5 * asymm * uij - - far = (eri + erj) ** 2 - dij ** 2 - if far <= 0.0: - continue - contain = dij ** 2 - (ri - rj) ** 2 - if contain <= 0.0: + geometry = torus(i1, i2) + if geometry is None: continue - rij = 0.5 * math.sqrt(far) * math.sqrt(contain) / dij - south = (tij + rij * vql - atoms[i1]) / eri + _, _, _, tij, rij = geometry + south = (tij + rij * _cross(eqvec, north) - atoms[i1]) / eri - lats, _ = _subarc(np.zeros(3), ri, eqvec, density, north, south) + lats = _subarc(np.zeros(3), ri, eqvec, density, north, south) for lat in lats: dt = _dot(lat, north) cen = atoms[i1] + dt * north @@ -838,7 +721,7 @@ def mds( if rad2 <= 0.0: continue - circle_pnts, _ = _subcir(cen, math.sqrt(rad2), north, density) + circle_pnts = _subcir(cen, math.sqrt(rad2), north, density) if len(circle_pnts) == 0: continue @@ -855,56 +738,13 @@ def mds( normals = circle_pnts - atoms[i1] normals /= np.linalg.norm(normals, axis=1)[:, None] - buried = np.zeros(len(circle_pnts), dtype=bool) if burco[i1].size: - buried[:] = _check_buried_many( - pcen, - np.full(len(circle_pnts), i1, dtype=int), - burco, - burrad2_with_probe, - ) - - _append_points(out_dots, out_normals, out_flags, out_mol, circle_pnts, normals, buried, m1) + buried = _buried_mask(pcen, burco[i1], burrad2_with_probe[i1]) + else: + buried = np.zeros(len(circle_pnts), dtype=bool) + _append_points(out, circle_pnts, normals, buried, m1) - if not out_dots: + if not out: return _empty_points(), _empty_points(), np.empty(0, dtype=int), np.empty(0, dtype=int) - - return ( - np.concatenate(out_dots, axis=0), - np.concatenate(out_normals, axis=0), - np.concatenate(out_flags, axis=0).astype(int, copy=False), - np.concatenate(out_mol, axis=0).astype(int, copy=False), - ) - - -# --------------------------------------------------------------------------- -# Trim band (mirrors Fortran trim subroutine exactly) -# --------------------------------------------------------------------------- - -def trim(dots: np.ndarray, flags: np.ndarray, band: float) -> np.ndarray: - """ - Remove buried dots within `band` Å of any accessible dot on the same surface. - Returns boolean mask — True = dot survives. - """ - dots = np.asarray(dots, dtype=float) - flags = np.asarray(flags) - - buried_mask = flags == BURIED_FLAG - acc_mask = flags == ACCESSIBLE_FLAG - - keep = np.zeros(len(dots), dtype=bool) - if not buried_mask.any(): - return keep - if not acc_mask.any(): - keep[buried_mask] = True - return keep - - acc_tree = cKDTree(dots[acc_mask]) - buried_idx = np.flatnonzero(buried_mask) - neighbour_lists = acc_tree.query_ball_point(dots[buried_mask], band) - keep[buried_idx] = np.fromiter( - (len(nbrs) == 0 for nbrs in neighbour_lists), - dtype=bool, - count=len(neighbour_lists), - ) - return keep + dots, normals, flags, dot_mol = (np.concatenate(parts, axis=0) for parts in zip(*out)) + return dots, normals, flags, dot_mol diff --git a/src/alphajudge/biophysics/prosurf.py b/src/alphajudge/biophysics/prosurf.py index ca5f7694..694a4124 100644 --- a/src/alphajudge/biophysics/prosurf.py +++ b/src/alphajudge/biophysics/prosurf.py @@ -3,6 +3,7 @@ from __future__ import annotations import math +from collections.abc import Iterable from dataclasses import dataclass from functools import lru_cache import numpy as np @@ -56,21 +57,14 @@ def _pisa_radius(atom) -> float: return get_radius(resname, atom_name) -def _collect_surface_atoms_with_residues( - residues: Iterable, -) -> tuple[np.ndarray, np.ndarray, list, list]: - coords, radii, atom_residues, atoms = [], [], [], [] - for residue in residues: - for atom in residue: - if _atom_element(atom) == "H": - continue - coords.append(atom.coord) - radii.append(_pisa_radius(atom)) - atom_residues.append(residue) - atoms.append(atom) - if not coords: - return np.empty((0, 3), dtype=float), np.empty(0, dtype=float), [], [] - return np.asarray(coords, dtype=float), np.asarray(radii, dtype=float), atom_residues, atoms +def _collect_surface_atoms(residues: Iterable) -> tuple[np.ndarray, np.ndarray, list]: + """Heavy atoms of ``residues`` with their coordinates and PISA radii.""" + atoms = [atom for residue in residues for atom in residue if _atom_element(atom) != "H"] + if not atoms: + return np.empty((0, 3), dtype=float), np.empty(0, dtype=float), [] + coords = np.asarray([atom.coord for atom in atoms], dtype=float) + radii = np.asarray([_pisa_radius(atom) for atom in atoms], dtype=float) + return coords, radii, atoms def _mround(value: float) -> int: @@ -87,11 +81,8 @@ def _pisa_spherical_code(code_no: int = PISA_CODE_NO) -> tuple[np.ndarray, np.nd points = [] areas = [] for i in range(1, code_no + 1): - if i == 1: - points.append((0.0, 0.0, 1.0)) - areas.append(2.0 * math.pi * (1.0 - math.cos(dalpha / 2.0))) - elif i == code_no: - points.append((0.0, 0.0, -1.0)) + if i in (1, code_no): + points.append((0.0, 0.0, 1.0 if i == 1 else -1.0)) areas.append(2.0 * math.pi * (1.0 - math.cos(dalpha / 2.0))) else: beta = (i - 1) * dalpha @@ -121,7 +112,10 @@ class _PisaInterfaceResult: atom_int_sas2: tuple[float, ...] +# Area, H-bonds, salt bridges and solvation energy of one interface all need +# the same ProSurf result, and are computed back to back. _PISA_INTERFACE_CACHE: dict[tuple, _PisaInterfaceResult] = {} +_PISA_INTERFACE_CACHE_SIZE = 4 def _residue_fingerprint(residue) -> tuple: @@ -133,15 +127,21 @@ def _residue_fingerprint(residue) -> tuple: return (residue.full_id, (float(coord[0]), float(coord[1]), float(coord[2]))) -def _interface_cache_key(residues1, residues2, probe_radius: float, code_no: int) -> tuple: +def _side_signature(residues) -> tuple: + """Everything ProSurf reads from one side: residue and atom identities and all coordinates.""" return ( - tuple(_residue_fingerprint(residue) for residue in residues1), - tuple(_residue_fingerprint(residue) for residue in residues2), - float(probe_radius), - int(code_no), + tuple( + (residue.full_id, residue.get_resname(), tuple((a.get_id(), a.element) for a in residue)) + for residue in residues + ), + np.asarray([a.coord for residue in residues for a in residue], dtype=float).tobytes(), ) +def _interface_cache_key(residues1, residues2, probe_radius: float, code_no: int) -> tuple: + return (_side_signature(residues1), _side_signature(residues2), float(probe_radius), int(code_no)) + + def _pisa_interface_result( residues1, residues2, @@ -163,123 +163,90 @@ def _pisa_interface_result( if cached is not None: return cached - coords1, radii1, atom_residues1, atoms1 = _collect_surface_atoms_with_residues(residues1) - coords2, radii2, atom_residues2, atoms2 = _collect_surface_atoms_with_residues(residues2) + coords1, radii1, atoms1 = _collect_surface_atoms(residues1) + coords2, radii2, atoms2 = _collect_surface_atoms(residues2) if len(coords1) == 0 or len(coords2) == 0: + result = _PisaInterfaceResult(0.0, frozenset(), frozenset(), tuple(atoms1), (), (), tuple(atoms2), (), ()) + else: + code_points, code_areas = _pisa_spherical_code(code_no) + side1 = (coords1, radii1 + float(probe_radius), atoms1) + side2 = (coords2, radii2 + float(probe_radius), atoms2) + area1, keys1, sas1, int_sas1 = _side_interface_area(side1, side2, code_points, code_areas) + area2, keys2, sas2, int_sas2 = _side_interface_area(side2, side1, code_points, code_areas) result = _PisaInterfaceResult( - 0.0, - frozenset(), - frozenset(), - tuple(atoms1), - tuple(), - tuple(), - tuple(atoms2), - tuple(), - tuple(), + float((area1 + area2) / 2.0), + keys1, keys2, + tuple(atoms1), sas1, int_sas1, + tuple(atoms2), sas2, int_sas2, ) - _PISA_INTERFACE_CACHE[key] = result - return result - - code_points, code_areas = _pisa_spherical_code(code_no) - radii1 = radii1 + float(probe_radius) - radii2 = radii2 + float(probe_radius) - - tree1 = cKDTree(coords1) - tree2 = cKDTree(coords2) - max_r1 = float(np.max(radii1)) - max_r2 = float(np.max(radii2)) - - def side_area( - own_coords: np.ndarray, - own_radii: np.ndarray, - own_tree: cKDTree, - other_coords: np.ndarray, - other_radii: np.ndarray, - other_tree: cKDTree, - other_max_radius: float, - own_atom_residues: list, - ) -> tuple[float, frozenset[tuple], tuple[float, ...], tuple[float, ...]]: - area = 0.0 - interface_residue_keys: set[tuple] = set() - own_residue_keys = [_residue_fingerprint(residue) for residue in own_atom_residues] - own_max_radius = float(np.max(own_radii)) - atom_sas = [0.0] * len(own_coords) - atom_int_sas = [0.0] * len(own_coords) - for i, coord in enumerate(own_coords): - ri = float(own_radii[i]) - other_neighbours = other_tree.query_ball_point(coord, ri + other_max_radius) - if not other_neighbours: - continue - - own_mask = np.ones(len(code_points), dtype=bool) - other_mask = np.ones(len(code_points), dtype=bool) - - for j in own_tree.query_ball_point(coord, ri + own_max_radius): - if j == i: - continue - rj = float(own_radii[j]) - delta = coord - own_coords[j] - if float(np.dot(delta, delta)) > (ri + rj) ** 2: - continue - surface_vectors = delta + ri * code_points - covered = ( - np.einsum("ij,ij->i", surface_vectors, surface_vectors) - <= (rj * rj + 0.00001) - ) - own_mask &= ~covered - if not own_mask.any(): - break - - if not own_mask.any(): - continue - - for j in other_neighbours: - rj = float(other_radii[j]) - delta = coord - other_coords[j] - if float(np.dot(delta, delta)) > (ri + rj) ** 2: - continue - surface_vectors = delta + ri * code_points - covered = ( - np.einsum("ij,ij->i", surface_vectors, surface_vectors) - <= (rj * rj + 0.00001) - ) - other_mask &= ~covered - if not other_mask.any(): - break - - atom_surface_area = float(np.sum(code_areas[own_mask]) * ri * ri) - atom_interface_area = float(np.sum(code_areas[own_mask & ~other_mask]) * ri * ri) - atom_sas[i] = atom_surface_area - atom_int_sas[i] = atom_interface_area - area += atom_interface_area - if atom_interface_area > 0.0: - interface_residue_keys.add(own_residue_keys[i]) - return area, frozenset(interface_residue_keys), tuple(atom_sas), tuple(atom_int_sas) - - int_area1, int_residue_keys1, atom_sas1, atom_int_sas1 = side_area( - coords1, radii1, tree1, coords2, radii2, tree2, max_r2, atom_residues1 - ) - int_area2, int_residue_keys2, atom_sas2, atom_int_sas2 = side_area( - coords2, radii2, tree2, coords1, radii1, tree1, max_r1, atom_residues2 - ) - - result = _PisaInterfaceResult( - float((int_area1 + int_area2) / 2.0), - int_residue_keys1, - int_residue_keys2, - tuple(atoms1), - atom_sas1, - atom_int_sas1, - tuple(atoms2), - atom_sas2, - atom_int_sas2, - ) - if len(_PISA_INTERFACE_CACHE) > 32: - _PISA_INTERFACE_CACHE.clear() + while len(_PISA_INTERFACE_CACHE) >= _PISA_INTERFACE_CACHE_SIZE: + del _PISA_INTERFACE_CACHE[next(iter(_PISA_INTERFACE_CACHE))] _PISA_INTERFACE_CACHE[key] = result return result +def _uncovered_code_points(coord, ri, code_points, coords, radii, neighbours, skip: int = -1) -> np.ndarray: + """Mask of the atom's spherical-code points not covered by any neighbour sphere.""" + mask = np.ones(len(code_points), dtype=bool) + for j in neighbours: + if j == skip: + continue + rj = float(radii[j]) + delta = coord - coords[j] + if float(np.dot(delta, delta)) > (ri + rj) ** 2: + continue + surface_vectors = delta + ri * code_points + mask &= ~(np.einsum("ij,ij->i", surface_vectors, surface_vectors) <= (rj * rj + 0.00001)) + if not mask.any(): + break + return mask + + +def _side_interface_area(own, other, code_points, code_areas): + """Interface area of one side: its accessible surface that the other side covers. + + Each side is (coords, probe-extended radii, atoms). Returns the area, the + fingerprints of residues with interface area, and per-atom SAS and + interface SAS. + + Like ProSurf, SAS is computed for every atom of a residue that has any atom + near the other side, not only for the atoms that are: the solvation energy + types charged groups by comparing SAS between sibling atoms of a residue. + Residues wholly away from the interface keep SAS 0; their contribution is + the same in the free and bound states and cancels. + """ + own_coords, own_radii, own_atoms = own + other_coords, other_radii, _ = other + own_tree, other_tree = cKDTree(own_coords), cKDTree(other_coords) + own_max_radius, other_max_radius = float(np.max(own_radii)), float(np.max(other_radii)) + other_neighbours = [ + other_tree.query_ball_point(coord, float(ri) + other_max_radius) + for coord, ri in zip(own_coords, own_radii) + ] + near_residues = {id(atom.get_parent()) for atom, nbrs in zip(own_atoms, other_neighbours) if nbrs} + + area = 0.0 + interface_residue_keys: set[tuple] = set() + atom_sas = [0.0] * len(own_coords) + atom_int_sas = [0.0] * len(own_coords) + for i, coord in enumerate(own_coords): + if id(own_atoms[i].get_parent()) not in near_residues: + continue + ri = float(own_radii[i]) + own_neighbours = own_tree.query_ball_point(coord, ri + own_max_radius) + own_mask = _uncovered_code_points(coord, ri, code_points, own_coords, own_radii, own_neighbours, skip=i) + if not own_mask.any(): + continue + other_mask = _uncovered_code_points(coord, ri, code_points, other_coords, other_radii, other_neighbours[i]) + + atom_sas[i] = float(np.sum(code_areas[own_mask]) * ri * ri) + atom_int_sas[i] = float(np.sum(code_areas[own_mask & ~other_mask]) * ri * ri) + area += atom_int_sas[i] + if atom_int_sas[i] > 0.0: + interface_residue_keys.add(_residue_fingerprint(own_atoms[i].get_parent())) + return area, frozenset(interface_residue_keys), tuple(atom_sas), tuple(atom_int_sas) + + def _pisa_interface_residues(residues1, residues2) -> tuple[list, list]: residues1 = list(residues1) residues2 = list(residues2) diff --git a/src/alphajudge/biophysics/sc.py b/src/alphajudge/biophysics/sc.py index da587f00..425049a6 100644 --- a/src/alphajudge/biophysics/sc.py +++ b/src/alphajudge/biophysics/sc.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import Iterable +from collections.abc import Iterable import numpy as np from scipy.spatial import cKDTree @@ -10,17 +10,27 @@ from .connolly import BURIED_FLAG, PROBE_RADIUS, get_radius, mds as _connolly_mds -def _collect_atoms(residues: Iterable) -> tuple[list, np.ndarray, list[str], list[str]]: - atoms, coords, resnames, atom_names = [], [], [], [] +def _collect_atoms(residues: Iterable) -> tuple[np.ndarray, np.ndarray]: + """Coordinates and CCP4 SC radii of every atom in ``residues``.""" + coords, radii = [], [] for r in residues: rn = r.get_resname().strip().upper() for a in r: - atoms.append(a) coords.append(a.coord) - resnames.append(rn) - atom_names.append(a.id.strip().upper()) - arr = np.asarray(coords, dtype=float) if coords else np.empty((0, 3)) - return atoms, arr, resnames, atom_names + radii.append(get_radius(rn, a.id.strip().upper())) + if not coords: + return np.empty((0, 3)), np.empty(0) + return np.asarray(coords, dtype=float), np.asarray(radii, dtype=float) + + +def _has_neighbour(points: np.ndarray, others: np.ndarray, distance: float) -> np.ndarray: + return cKDTree(others).query_ball_point(points, distance, return_length=True) > 0 + + +def _nearest(points: np.ndarray, others: np.ndarray) -> tuple[np.ndarray, np.ndarray]: + """Index of, and distance to, each point's nearest neighbour in ``others``.""" + _, idx = cKDTree(others).query(points) + return idx, np.linalg.norm(points - others[idx], axis=1) def shape_complementarity( @@ -37,38 +47,24 @@ def shape_complementarity( Ported from SCASA (Lawrence & Colman, 1993; Connolly, 1983). Returns SC in [-1, 1]; 0 on failure. """ - _, coords1, rn1, an1 = _collect_atoms(residues1) - _, coords2, rn2, an2 = _collect_atoms(residues2) + coords1, radii1 = _collect_atoms(residues1) + coords2, radii2 = _collect_atoms(residues2) if coords1.size == 0 or coords2.size == 0: return 0.0 # SCASA filters side 1 against side 2, then side 2 against the filtered # side 1. This slightly asymmetric ordering matches its CLI/reference path. - t2 = cKDTree(coords2) - neighbours1 = t2.query_ball_point(coords1, distance) - mask1 = np.fromiter((len(nbrs) > 0 for nbrs in neighbours1), dtype=bool, count=len(coords1)) - + mask1 = _has_neighbour(coords1, coords2, distance) c1 = coords1[mask1] - n1_rn = [rn1[i] for i in np.where(mask1)[0]] - n1_an = [an1[i] for i in np.where(mask1)[0]] if c1.size == 0: return 0.0 - - t1_filtered = cKDTree(c1) - neighbours2 = t1_filtered.query_ball_point(coords2, distance) - mask2 = np.fromiter((len(nbrs) > 0 for nbrs in neighbours2), dtype=bool, count=len(coords2)) - + mask2 = _has_neighbour(coords2, c1, distance) c2 = coords2[mask2] - n2_rn = [rn2[i] for i in np.where(mask2)[0]] - n2_an = [an2[i] for i in np.where(mask2)[0]] - if c1.size == 0 or c2.size == 0: + if c2.size == 0: return 0.0 atoms = np.vstack([c1, c2]) - radii = np.array( - [get_radius(r, a) for r, a in zip(n1_rn + n2_rn, n1_an + n2_an)], - dtype=float, - ) + radii = np.concatenate([radii1[mask1], radii2[mask2]]) mol = np.array([1] * len(c1) + [2] * len(c2), dtype=int) dots, normals, flags, dot_mol = _connolly_mds( @@ -88,23 +84,17 @@ def shape_complementarity( # This is the SCASA/CCP4-compatible edge trim used by the frozen # references. Applying Connolly's same-surface trim directly removes too # many buried dots on AlphaFold interfaces. - _, i2 = cKDTree(d2).query(d1) - _, i1 = cKDTree(d1).query(d2) - dist1 = np.linalg.norm(d1 - d2[i2], axis=1) - dist2 = np.linalg.norm(d2 - d1[i1], axis=1) + _, dist1 = _nearest(d1, d2) + _, dist2 = _nearest(d2, d1) m1 = dist1 <= trim_cutoff m2 = dist2 <= trim_cutoff - d1 = d1[m1] - nA = nA[m1] - d2 = d2[m2] - nB = nB[m2] + d1, nA = d1[m1], nA[m1] + d2, nB = d2[m2], nB[m2] if len(d1) == 0 or len(d2) == 0: return 0.0 - _, i2 = cKDTree(d2).query(d1) - _, i1 = cKDTree(d1).query(d2) - dist1 = np.linalg.norm(d1 - d2[i2], axis=1) - dist2 = np.linalg.norm(d2 - d1[i1], axis=1) + i2, dist1 = _nearest(d1, d2) + i1, dist2 = _nearest(d2, d1) dot1 = -(np.einsum("ij,ij->i", nA, nB[i2])) dot2 = -(np.einsum("ij,ij->i", nB, nA[i1])) diff --git a/src/alphajudge/biophysics/solvation.py b/src/alphajudge/biophysics/solvation.py index 6f8291dd..d28378d9 100644 --- a/src/alphajudge/biophysics/solvation.py +++ b/src/alphajudge/biophysics/solvation.py @@ -28,57 +28,55 @@ def _state_sas_lookup(atoms, state_sas: np.ndarray) -> dict[tuple[int, str], flo } +# Charged nitrogens whose charge PISA assigns to the most exposed of the group. +_CHARGED_N_PARTNERS = { + "NE2": ("ND1",), + "ND1": ("NE2",), + "NE": ("NH1", "NH2"), + "NH1": ("NE", "NH2"), + "NH2": ("NE", "NH1"), +} + + def _asp_type_pair( atom, paired_names: tuple[str, ...], charged: int, - neutral: int, state_sas: dict[tuple[int, str], float], ) -> int: - current = state_sas.get((id(atom.get_parent()), atom.id.strip().upper()), 0.0) - paired = [ - state_sas[(id(atom.get_parent()), name)] - for name in paired_names - if (id(atom.get_parent()), name) in state_sas - ] + residue_id = id(atom.get_parent()) + current = state_sas.get((residue_id, atom.id.strip().upper()), 0.0) + paired = [state_sas[(residue_id, name)] for name in paired_names if (residue_id, name) in state_sas] if not paired: return charged if len(paired) == 1: - return charged if current > paired[0] else neutral - return charged if current == max([current] + paired) else neutral + return charged if current > paired[0] else ASP_NEUTRAL_NO + return charged if current == max([current] + paired) else ASP_NEUTRAL_NO def _special_asp_type(atom, state_sas: dict[tuple[int, str], float]) -> int: element = _atom_element(atom) atom_name = atom.id.strip().upper() - resname = atom.get_parent().get_resname().strip().upper() if element == "N": - if atom_name == "NE2": - if resname != "HIS": - return ASP_NEUTRAL_NO - return _asp_type_pair(atom, ("ND1",), ASP_CHARGED_N, ASP_NEUTRAL_NO, state_sas) - if atom_name == "ND1": - return _asp_type_pair(atom, ("NE2",), ASP_CHARGED_N, ASP_NEUTRAL_NO, state_sas) - if atom_name == "NE": - return _asp_type_pair(atom, ("NH1", "NH2"), ASP_CHARGED_N, ASP_NEUTRAL_NO, state_sas) - if atom_name == "NH1": - return _asp_type_pair(atom, ("NE", "NH2"), ASP_CHARGED_N, ASP_NEUTRAL_NO, state_sas) - if atom_name == "NH2": - return _asp_type_pair(atom, ("NE", "NH1"), ASP_CHARGED_N, ASP_NEUTRAL_NO, state_sas) - return ASP_CHARGED_N + if atom_name == "NE2" and atom.get_parent().get_resname().strip().upper() != "HIS": + return ASP_NEUTRAL_NO + partners = _CHARGED_N_PARTNERS.get(atom_name) + return _asp_type_pair(atom, partners, ASP_CHARGED_N, state_sas) if partners else ASP_CHARGED_N if element == "O": if atom_name.endswith("1"): - return _asp_type_pair(atom, (atom_name[:-1] + "2",), ASP_CHARGED_O, ASP_NEUTRAL_NO, state_sas) - if atom_name.endswith("2"): - return _asp_type_pair(atom, (atom_name[:-1] + "1",), ASP_CHARGED_O, ASP_NEUTRAL_NO, state_sas) - return ASP_NEUTRAL_NO + partner = atom_name[:-1] + "2" + elif atom_name.endswith("2"): + partner = atom_name[:-1] + "1" + else: + return ASP_NEUTRAL_NO + return _asp_type_pair(atom, (partner,), ASP_CHARGED_O, state_sas) return ASP_OTHER -def _pisa_solvation_energy_for_state(atoms, state_sas: np.ndarray) -> tuple[float, tuple[float, ...]]: +def _pisa_solvation_energy_for_state(atoms, state_sas: np.ndarray) -> float: state_lookup = _state_sas_lookup(atoms, state_sas) asp_area = [0.0] * len(PISA_ASP_PARAMETERS) energy = 0.0 @@ -104,7 +102,7 @@ def _pisa_solvation_energy_for_state(atoms, state_sas: np.ndarray) -> tuple[floa for asp_type, area in enumerate(asp_area): energy += area * PISA_ASP_PARAMETERS[asp_type] - return float(energy), tuple(asp_area) + return float(energy) def _side_interface_solvation_energy(atoms, atom_sas, atom_int_sas) -> float: @@ -112,10 +110,10 @@ def _side_interface_solvation_energy(atoms, atom_sas, atom_int_sas) -> float: atom_int_sas_arr = np.asarray(atom_int_sas, dtype=float) if len(atom_sas_arr) == 0: return 0.0 - free_energy, _ = _pisa_solvation_energy_for_state(atoms, atom_sas_arr) + free_energy = _pisa_solvation_energy_for_state(atoms, atom_sas_arr) bound_sas = atom_sas_arr - atom_int_sas_arr bound_sas[bound_sas < 1.0e-8] = 0.0 - bound_energy, _ = _pisa_solvation_energy_for_state(atoms, bound_sas) + bound_energy = _pisa_solvation_energy_for_state(atoms, bound_sas) return float(bound_energy - free_energy) diff --git a/src/alphajudge/biophysics/srs_chemistry.py b/src/alphajudge/biophysics/srs_chemistry.py index 3ffadefe..e6d64a7f 100644 --- a/src/alphajudge/biophysics/srs_chemistry.py +++ b/src/alphajudge/biophysics/srs_chemistry.py @@ -126,7 +126,7 @@ "HG1": "H", "HXT": "H", }, - "TRP": {}, + "TRP": {}, # CCP4 7.1 SRS assigns TRP no hb_type, so PISA never counts its H-bonds "TYR": {"N": "D", "O": "A", "OH": "B", "OXT": "A", "H": "H", "H2": "H", "HH": "H", "HXT": "H"}, "VAL": {"N": "D", "O": "A", "OXT": "A", "H": "H", "H2": "H", "HXT": "H"}, } diff --git a/src/alphajudge/complex.py b/src/alphajudge/complex.py index 9b7e0c5f..deeff7d6 100644 --- a/src/alphajudge/complex.py +++ b/src/alphajudge/complex.py @@ -5,12 +5,11 @@ from functools import cached_property from typing import Any -import numpy as np -from Bio.PDB import Chain, NeighborSearch +from Bio.PDB import Chain from .confidence import Confidence from .docking_scores import MPDOCKQ -from .geometry import is_pae_token_residue, representative_atom +from .geometry import is_pae_token_residue from .interface import Interface logger = logging.getLogger(__name__) @@ -38,8 +37,6 @@ def __init__( self._res_index_map, self._chain_indices_by_id, self._chains = self._build_maps() - self._contact_ns_cache: dict[tuple[str, str], tuple[list, list, np.ndarray, np.ndarray]] = {} - self.interfaces: list[Interface] = [] for i in range(len(self._chains)): for j in range(i + 1, len(self._chains)): @@ -86,47 +83,21 @@ def _build_maps(self) -> tuple[dict[tuple[str, Any], int], dict[str, list[int]], def num_chains(self) -> int: return len(self._chains) - @cached_property - def average_interface_pae(self) -> float: - vals = [ - i.average_interface_pae for i in self.interfaces - if not math.isnan(i.average_interface_pae) and i.average_interface_pae <= self.pae_filter - ] - return sum(vals) / len(vals) if vals else float(0.0) + @property + def chain_boundaries(self) -> list[float]: + """PAE-matrix positions between consecutive chains (heatmap separators).""" + ends = sorted(max(idxs) + 0.5 for idxs in self._chain_indices_by_id.values() if idxs) + return ends[:-1] @cached_property def average_interface_plddt(self) -> float: vals = [i.average_interface_plddt for i in self.interfaces] - return sum(vals) / len(vals) if vals else float(0.0) + return sum(vals) / len(vals) if vals else 0.0 @cached_property def contact_pairs_global(self) -> int: - reps = [] - for chain in self._chains: - for residue in chain: - try: - reps.append((representative_atom(residue), residue)) - except Exception: - continue - if not reps: - return 0 - - ns = NeighborSearch([atom for atom, _ in reps]) - seen, count = set(), 0 - for atom1, residue1 in reps: - for atom2 in ns.search(atom1.coord, self.contact_thresh): - if atom2 is atom1: - continue - residue2 = atom2.get_parent() - chain1 = residue1.get_parent().id - chain2 = residue2.get_parent().id - if chain1 == chain2: - continue - key = tuple(sorted([(chain1, residue1.id), (chain2, residue2.id)])) - if key not in seen: - seen.add(key) - count += 1 - return count + """Inter-chain residue contacts summed over every chain pair.""" + return sum(i.contact_pairs for i in self.interfaces) @cached_property def mpDockQ(self) -> float: diff --git a/src/alphajudge/confidence.py b/src/alphajudge/confidence.py index 58db9d04..c6e5c7e4 100644 --- a/src/alphajudge/confidence.py +++ b/src/alphajudge/confidence.py @@ -1,9 +1,23 @@ from __future__ import annotations +import math +from collections.abc import Sequence from dataclasses import dataclass import numpy as np +# Values of Confidence.global_confidence_scope (and the CSV column of that +# name): whether the global scores (ptm, iptm, iptm_ptm, confidence_score) +# cover only the scored residues or also tokens excluded from interface +# scoring, such as ligands, ions and AF3x crosslinkers. +SCOPE_SCORED_RESIDUES = "scored_residues" +SCOPE_INCLUDES_EXCLUDED_TOKENS = "includes_excluded_tokens" +SCOPE_UNKNOWN = "unknown" +# Values of the iptm_scope column: whether a row's iptm is the chain-pair +# value or the global fallback. +IPTM_SCOPE_CHAIN_PAIR = "chain_pair" +IPTM_SCOPE_GLOBAL = "global" + @dataclass(frozen=True) class Confidence: @@ -14,8 +28,50 @@ class Confidence: iptm_ptm: float | None confidence_score: float | None plddt_residue: list[float] - # AF3 only: per-chain-pair ipTM matrix (indexed by chain order). - # When present, use this for per-interface iptm instead of global iptm. + # Per-chain-pair ipTM matrix, read through pair_iptm(). When present, use + # it for per-interface iptm instead of global iptm. chain_pair_iptm: list[list[float]] | None = None contact_prob_matrix: np.ndarray | None = None contact_prob_source: str | None = None + # Chain order of chain_pair_iptm as the source wrote it, including + # ligand-only chains (recorded by the AF3 and Boltz-2 parsers). + chain_pair_iptm_chain_ids: list[str] | None = None + # AF3 global scores can include tokens excluded from interface scoring. + global_confidence_scope: str = SCOPE_UNKNOWN + + def pair_iptm( + self, chain_a: str, chain_b: str, default_chain_ids: Sequence[str] + ) -> float | None: + """ipTM of one chain pair from ``chain_pair_iptm``, or None if unavailable. + + The matrix is indexed in ``chain_pair_iptm_chain_ids`` order. A + Confidence that does not record the order (one built directly) is taken + to index it by ``default_chain_ids``. + """ + matrix = self.chain_pair_iptm + if matrix is None or not matrix: + return None + chain_ids = self.chain_pair_iptm_chain_ids + if chain_ids is None: + chain_ids = default_chain_ids + try: + i, j = chain_ids.index(chain_a), chain_ids.index(chain_b) + except ValueError: + return None + # Read [i][j], or [j][i] when a ragged matrix lacks the former. + for row, col in ((i, j), (j, i)): + try: + entry = matrix[row] + value = entry[col] if isinstance(entry, (list, tuple)) else math.nan + break + except (IndexError, TypeError): + continue + else: + return None + if value is None: + return None + try: + value = float(value) + except (TypeError, ValueError): + return None + return value if math.isfinite(value) else None diff --git a/src/alphajudge/confident_contacts.py b/src/alphajudge/confident_contacts.py index 08ae3ed0..301242ef 100644 --- a/src/alphajudge/confident_contacts.py +++ b/src/alphajudge/confident_contacts.py @@ -54,8 +54,7 @@ from enum import Enum import numpy as np - -from .geometry import representative_atom +from Bio.PDB import NeighborSearch #: Published PAE cutoff, in Angstroms. A pair counts when its PAE is strictly @@ -119,8 +118,6 @@ def interactome3d_contact_pairs(chain1, chain2) -> set[tuple[object, object]]: directional PAE convention without re-deriving which residue came from which chain. """ - from Bio.PDB import NeighborSearch - residues1, residues2 = list(chain1), list(chain2) if not residues1 or not residues2: return set() @@ -151,22 +148,6 @@ def interactome3d_contact_pairs(chain1, chain2) -> set[tuple[object, object]]: return pairs -def representative_atom_contact_pairs(chain1, chain2, contact_thresh: float): - """Unique (chain1, chain2) pairs within ``contact_thresh`` on CB (CA for Gly).""" - reps1 = [(res, representative_atom(res)) for res in chain1] - reps2 = [(res, representative_atom(res)) for res in chain2] - pairs: set[tuple[object, object]] = set() - for res1, atom1 in reps1: - if atom1 is None: - continue - for res2, atom2 in reps2: - if atom2 is None: - continue - if float(atom1 - atom2) <= float(contact_thresh): - pairs.add((res1, res2)) - return pairs - - def _gated_pae(pae, i: int, j: int, direction: PaeDirection) -> float: ab, ba = float(pae[i, j]), float(pae[j, i]) if direction is PaeDirection.AB: diff --git a/src/alphajudge/contact_probs.py b/src/alphajudge/contact_probs.py index 786ab674..73f43f59 100644 --- a/src/alphajudge/contact_probs.py +++ b/src/alphajudge/contact_probs.py @@ -57,18 +57,14 @@ def symmetrize_contact_probs(matrix) -> tuple[np.ndarray, float]: if arr.ndim != 2 or arr.shape[0] != arr.shape[1]: raise ValueError(f"contact probability matrix must be square, got {arr.shape}") - finite = np.isfinite(arr) & np.isfinite(arr.T) - max_delta = ( - float(np.max(np.abs(arr[finite] - arr.T[finite]))) if np.any(finite) else 0.0 - ) - - both = np.isfinite(arr) & np.isfinite(arr.T) - only_forward = np.isfinite(arr) & ~np.isfinite(arr.T) - only_reverse = ~np.isfinite(arr) & np.isfinite(arr.T) + forward, reverse = np.isfinite(arr), np.isfinite(arr.T) + both = forward & reverse + max_delta = float(np.max(np.abs(arr[both] - arr.T[both]))) if np.any(both) else 0.0 + sym = np.full(arr.shape, np.nan, dtype=float) sym[both] = 0.5 * (arr[both] + arr.T[both]) - sym[only_forward] = arr[only_forward] - sym[only_reverse] = arr.T[only_reverse] + sym[forward & ~reverse] = arr[forward & ~reverse] + sym[reverse & ~forward] = arr.T[reverse & ~forward] return sym, max_delta @@ -80,27 +76,23 @@ def summarize_contact_prob_block( top_n: int = 10, ) -> tuple[float, float, float]: """Return max, top-N mean, and expected contacts for one inter-chain block.""" + missing = (float("nan"),) * 3 if matrix is None: - nan = float("nan") - return nan, nan, nan + return missing idx1_arr = np.asarray(idx1, dtype=int) idx2_arr = np.asarray(idx2, dtype=int) if idx1_arr.size == 0 or idx2_arr.size == 0: - nan = float("nan") - return nan, nan, nan + return missing - arr = np.asarray(matrix, dtype=float) try: - vals = arr[np.ix_(idx1_arr, idx2_arr)].ravel() - except Exception: - nan = float("nan") - return nan, nan, nan + vals = np.asarray(matrix, dtype=float)[np.ix_(idx1_arr, idx2_arr)].ravel() + except IndexError: + return missing vals = vals[np.isfinite(vals)] if vals.size == 0: - nan = float("nan") - return nan, nan, nan + return missing max_prob = float(np.max(vals)) n = min(int(top_n), vals.size) diff --git a/src/alphajudge/core.py b/src/alphajudge/core.py index d9c0199a..ed15e850 100644 --- a/src/alphajudge/core.py +++ b/src/alphajudge/core.py @@ -2,37 +2,5 @@ from __future__ import annotations -from .complex import Complex -from .confidence import Confidence -from .docking_scores import D0, MPDOCKQ, PDOCKQ, PDOCKQ2, DockQParams, _sigmoid -from .geometry import ( - CHARGED_ATOMS, - CHARGED_RES, - HYDROPHOBIC_RES, - NA_RES, - POLAR_RES, - _repr_atom, - is_pae_token_residue, - representative_atom, -) -from .interface import Interface - -__all__ = [ - "CHARGED_ATOMS", - "CHARGED_RES", - "Complex", - "Confidence", - "D0", - "DockQParams", - "HYDROPHOBIC_RES", - "Interface", - "MPDOCKQ", - "NA_RES", - "PDOCKQ", - "PDOCKQ2", - "POLAR_RES", - "_repr_atom", - "_sigmoid", - "is_pae_token_residue", - "representative_atom", -] +from . import * # noqa: F401,F403 +from . import __all__ # noqa: F401 diff --git a/src/alphajudge/interface.py b/src/alphajudge/interface.py index 4aa38758..a427d4fc 100644 --- a/src/alphajudge/interface.py +++ b/src/alphajudge/interface.py @@ -5,7 +5,6 @@ from typing import TYPE_CHECKING, Any import numpy as np -from Bio.PDB import NeighborSearch from .biophysics import ( buried_surface_area as _pisa_buried_surface_area, @@ -35,108 +34,95 @@ if TYPE_CHECKING: from .complex import Complex +#: PAE (Angstrom) below which a residue pair contributes to LIS / cLIS. +LIS_PAE_CUTOFF = 12.0 + + +def _representative_atoms(residues) -> tuple[list, np.ndarray]: + atoms = [] + for residue in residues: + try: + atoms.append(representative_atom(residue)) + except KeyError: + pass + coords = np.array([a.coord for a in atoms], dtype=float) if atoms else np.empty((0, 3)) + return atoms, coords + class Interface: def __init__(self, chain1, chain2, complex_ctx: Complex): self.c = complex_ctx self.chain1 = list(chain1) self.chain2 = list(chain2) + # pae_matrix is already a numpy array for memory efficiency + self._pae = self.c.conf.pae_matrix + self._contact_prob = self.c.conf.contact_prob_matrix + self._rim = self.c._res_index_map if not self.chain1 or not self.chain2: - # pae_matrix is already a numpy array for memory efficiency - self._pae = self.c.conf.pae_matrix - self._contact_prob = self.c.conf.contact_prob_matrix - self._rim = self.c._res_index_map - self._cid = self.c._chain_indices_by_id - self._cid1_id = "" - self._cid2_id = "" - self._idx1 = np.array([], dtype=int) - self._idx2 = np.array([], dtype=int) + self._cid1_id = self._cid2_id = "" + self._idx1 = self._idx2 = np.array([], dtype=int) self._has_na = False self._res1, self._res2, self._pairs = set(), set(), set() - self._avg_plddt = 0.0 - self._avg_pae = 0.0 + self.average_interface_plddt = self.average_interface_pae = 0.0 return - # pae_matrix is already a numpy array for memory efficiency - self._pae = self.c.conf.pae_matrix - self._contact_prob = self.c.conf.contact_prob_matrix - self._rim = self.c._res_index_map - self._cid = self.c._chain_indices_by_id - + cid = self.c._chain_indices_by_id self._cid1_id = self.chain1[0].get_parent().id self._cid2_id = self.chain2[0].get_parent().id - self._idx1 = np.asarray(self._cid.get(self._cid1_id, []), dtype=int) - self._idx2 = np.asarray(self._cid.get(self._cid2_id, []), dtype=int) + self._idx1 = np.asarray(cid.get(self._cid1_id, []), dtype=int) + self._idx2 = np.asarray(cid.get(self._cid2_id, []), dtype=int) self._has_na = any( r.get_resname().strip().upper() in NA_RES for r in (self.chain1 + self.chain2) ) self._res1, self._res2, self._pairs = self._get_pairs() - self._avg_plddt = self._avg_plddt_union() - self._avg_pae = self._avg_pae_over_pairs() + self.average_interface_plddt = self._avg_plddt_union() + self.average_interface_pae = self._avg_pae_over_pairs() + + @property + def label(self) -> str: + return f"{self._cid1_id}_{self._cid2_id}" @property def num_intf_residues(self) -> int: return len(self._res1 | self._res2) - @cached_property - def average_interface_plddt(self) -> float: - return self._avg_plddt - - @cached_property - def average_interface_pae(self) -> float: - return self._avg_pae - @cached_property def iptm_chainpair(self) -> float | None: """ - Per-interface ipTM from AF3 chain_pair_iptm when available. + Per-interface ipTM from chain_pair_iptm when available. Returns None for AF2 (no per-interface ipTM). """ - cpi = getattr(self.c.conf, "chain_pair_iptm", None) - if cpi is None or not cpi: - return None - chain_ids = [ch.id for ch in self.c._chains] - try: - i = chain_ids.index(self._cid1_id) - j = chain_ids.index(self._cid2_id) - except ValueError: - return None - try: - row = cpi[i] - val = row[j] if isinstance(row, (list, tuple)) else float("nan") - except (IndexError, TypeError): - try: - row = cpi[j] - val = row[i] if isinstance(row, (list, tuple)) else float("nan") - except (IndexError, TypeError): - return None - if val is None: - return None - try: - return float(val) - except (TypeError, ValueError): - return None + return self.c.conf.pair_iptm( + self._cid1_id, self._cid2_id, [ch.id for ch in self.c._chains] + ) @cached_property def contact_pairs(self) -> int: return len(self._pairs) + def _no_contacts(self) -> bool: + return self.contact_pairs <= 0 or math.isnan(self.average_interface_plddt) + @cached_property def pDockQ(self) -> float: - if self.contact_pairs <= 0 or math.isnan(self._avg_plddt): + if self._no_contacts(): return 0.0 - return PDOCKQ.score(self._avg_plddt * math.log10(self.contact_pairs)) + return PDOCKQ.score(self.average_interface_plddt * math.log10(self.contact_pairs)) - def _mean_ptm_dir(self, reverse: bool) -> float: - vals = [] + def _pair_indices(self): + """PAE indices (i, j) of each contacting pair whose residues both carry a token.""" for r1, r2 in self._pairs: i = self._rim.get((r1.get_parent().id, r1.id)) j = self._rim.get((r2.get_parent().id, r2.id)) - if i is None or j is None: - continue + if i is not None and j is not None: + yield i, j + + def _mean_ptm_dir(self, reverse: bool) -> float: + vals = [] + for i, j in self._pair_indices(): pae = float(self._pae[j, i] if reverse else self._pae[i, j]) vals.append(1.0 / (1.0 + (pae / D0) ** 2)) return float(np.mean(vals)) if vals else float("nan") @@ -146,28 +132,41 @@ def pDockQ2(self) -> tuple[float, float]: Return (score_max, mean_ptm_for_direction_that_won). Returns (0.0, 0.0) when interface is not found. """ - if self.contact_pairs <= 0 or math.isnan(self._avg_plddt): - return 0.0, 0.0 - - m_ab = self._mean_ptm_dir(reverse=False) - m_ba = self._mean_ptm_dir(reverse=True) - - s_ab = PDOCKQ2.score(self._avg_plddt * m_ab) if not math.isnan(m_ab) else float("nan") - s_ba = PDOCKQ2.score(self._avg_plddt * m_ba) if not math.isnan(m_ba) else float("nan") - - if math.isnan(s_ab) and math.isnan(s_ba): + if self._no_contacts(): return 0.0, 0.0 - if math.isnan(s_ba) or (not math.isnan(s_ab) and s_ab >= s_ba): - return s_ab, (0.0 if math.isnan(m_ab) else m_ab) - return s_ba, (0.0 if math.isnan(m_ba) else m_ba) - - def ipsae(self, pae_cutoff=10.0) -> float: + # Ties go to the chain1 -> chain2 direction. + scored = [ + (PDOCKQ2.score(self.average_interface_plddt * m), m) + for m in (self._mean_ptm_dir(reverse=False), self._mean_ptm_dir(reverse=True)) + if not math.isnan(m) + ] + return max(scored, key=lambda s: s[0]) if scored else (0.0, 0.0) + + def ipsae(self, pae_cutoff: float = 10.0) -> float: """ - Interface pTM-based Surface Accuracy Estimation (ipSAE). + Interface pTM-based Surface Accuracy Estimation (ipSAE), the larger of + the two chain directions. The complex's ``ipsae_pae_cutoff``, when set, + takes precedence over ``pae_cutoff``. """ - if getattr(self.c, "ipsae_pae_cutoff", None) is not None: - pae_cutoff = float(self.c.ipsae_pae_cutoff) - return self._ipsae_asym(float(pae_cutoff)) + if self.c.ipsae_pae_cutoff is not None: + pae_cutoff = self.c.ipsae_pae_cutoff + cutoff = float(pae_cutoff) + min_d0 = 2.0 if self._has_na else 1.0 + + def calc(idx_src: np.ndarray, idx_dst: np.ndarray) -> float: + best = 0.0 + for i in idx_src: + row = self._pae[i, idx_dst] + valid = row < cutoff + n = int(np.count_nonzero(valid)) + if n == 0: + continue + d0 = max(min_d0, 1.24 * (max(27.0, float(n)) - 15.0) ** (1.0 / 3.0) - 1.8) + ptm = 1.0 / (1.0 + (row[valid] / d0) ** 2) + best = max(best, float(np.mean(ptm))) + return best + + return max(calc(self._idx1, self._idx2), calc(self._idx2, self._idx1)) def lis(self) -> float: """Returns 0.0 when interface is not found or no valid PAE pairs.""" @@ -175,10 +174,10 @@ def _lis_dir(idx_src: np.ndarray, idx_dst: np.ndarray) -> float: if idx_src.size == 0 or idx_dst.size == 0: return 0.0 sub = self._pae[np.ix_(idx_src, idx_dst)].ravel() - valid = sub[sub < 12.0] + valid = sub[sub < LIS_PAE_CUTOFF] if valid.size == 0: return 0.0 - return float(np.mean((12.0 - valid) / 12.0)) + return float(np.mean((LIS_PAE_CUTOFF - valid) / LIS_PAE_CUTOFF)) a = _lis_dir(self._idx1, self._idx2) b = _lis_dir(self._idx2, self._idx1) @@ -192,21 +191,15 @@ def clis(self) -> float: chain directions are scored separately and averaged, mirroring lis(). Returns 0.0 when no contacts or no valid PAE pairs. """ - if not self._pairs: - return 0.0 ab: list[float] = [] ba: list[float] = [] - for r1, r2 in self._pairs: - i = self._rim.get((r1.get_parent().id, r1.id)) - j = self._rim.get((r2.get_parent().id, r2.id)) - if i is None or j is None: - continue + for i, j in self._pair_indices(): p_ab = float(self._pae[i, j]) p_ba = float(self._pae[j, i]) - if p_ab < 12.0: - ab.append((12.0 - p_ab) / 12.0) - if p_ba < 12.0: - ba.append((12.0 - p_ba) / 12.0) + if p_ab < LIS_PAE_CUTOFF: + ab.append((LIS_PAE_CUTOFF - p_ab) / LIS_PAE_CUTOFF) + if p_ba < LIS_PAE_CUTOFF: + ba.append((LIS_PAE_CUTOFF - p_ba) / LIS_PAE_CUTOFF) a = float(np.mean(ab)) if ab else 0.0 b = float(np.mean(ba)) if ba else 0.0 return float(0.5 * (a + b)) @@ -269,15 +262,15 @@ def ccc(self) -> int: def contact_probability_scores(self) -> tuple[float, float, float]: return summarize_contact_prob_block(self._contact_prob, self._idx1, self._idx2) - @cached_property + @property def contact_prob_max(self) -> float: return self.contact_probability_scores[0] - @cached_property + @property def contact_prob_top10_mean(self) -> float: return self.contact_probability_scores[1] - @cached_property + @property def expected_contacts(self) -> float: return self.contact_probability_scores[2] @@ -295,9 +288,9 @@ def charged(self) -> float: @cached_property def score_complex(self) -> float: - if self.contact_pairs <= 0 or math.isnan(self._avg_plddt): + if self._no_contacts(): return float("nan") - return self._avg_plddt * math.log10(self.contact_pairs) + return self.average_interface_plddt * math.log10(self.contact_pairs) @cached_property def hb(self) -> int: @@ -324,97 +317,40 @@ def int_solv_en(self) -> float: return _pisa_interface_solvation_energy(self.chain1, self.chain2) def _get_pairs(self): - res_pairs: set[tuple[Any, Any]] = set() - a1, a2, coords1, coords2 = self._contact_atom_data() - if not len(a1) or not len(a2): - return set(), set(), res_pairs + """Residue pairs whose representative atoms lie within contact_thresh.""" + a1, coords1 = _representative_atoms(self.chain1) + a2, coords2 = _representative_atoms(self.chain2) + if not a1 or not a2: + return set(), set(), set() diff = coords1[:, None, :] - coords2[None, :, :] dist2 = np.sum(diff * diff, axis=2) - mask = dist2 <= (self.c.contact_thresh ** 2) - idx_i, idx_j = np.where(mask) - - for i, j in zip(idx_i.tolist(), idx_j.tolist()): - res_pairs.add((a1[i].get_parent(), a2[j].get_parent())) - - r1 = {p[0] for p in res_pairs} - r2 = {p[1] for p in res_pairs} - return r1, r2, res_pairs - - def _contact_atom_data(self) -> tuple[list, list, np.ndarray, np.ndarray]: - key = (self._cid1_id, self._cid2_id) - cached = self.c._contact_ns_cache.get(key) - if cached is None: - a1, a2 = [], [] - for residue in self.chain1: - try: - a1.append(representative_atom(residue)) - except Exception: - pass - for residue in self.chain2: - try: - a2.append(representative_atom(residue)) - except Exception: - pass - - coords1 = np.array([a.coord for a in a1], dtype=float) if a1 else np.empty((0, 3)) - coords2 = np.array([a.coord for a in a2], dtype=float) if a2 else np.empty((0, 3)) - cached = (a1, a2, coords1, coords2) - self.c._contact_ns_cache[key] = cached - return cached + idx_i, idx_j = np.where(dist2 <= self.c.contact_thresh ** 2) - def _avg_plddt_union(self) -> float: - res_set = self._res1 | self._res2 - if not res_set: - return float("nan") + res_pairs: set[tuple[Any, Any]] = { + (a1[i].get_parent(), a2[j].get_parent()) + for i, j in zip(idx_i.tolist(), idx_j.tolist()) + } + return {p[0] for p in res_pairs}, {p[1] for p in res_pairs}, res_pairs + def _avg_plddt_union(self) -> float: vals = [] - for residue in res_set: + for residue in self._res1 | self._res2: try: vals.append(float(representative_atom(residue).get_bfactor())) - except Exception: + except KeyError: continue return float(sum(vals) / len(vals)) if vals else float("nan") def _avg_pae_over_pairs(self) -> float: vals = [] - for r1, r2 in self._pairs: - i = self._rim.get((r1.get_parent().id, r1.id)) - j = self._rim.get((r2.get_parent().id, r2.id)) - if i is None or j is None: - continue + for i, j in self._pair_indices(): try: - vals.append(float(self._pae[i, j])) - vals.append(float(self._pae[j, i])) - except Exception: + vals.extend((float(self._pae[i, j]), float(self._pae[j, i]))) + except IndexError: # PAE smaller than the scored residues continue return sum(vals) / len(vals) if vals else float("nan") - def _ipsae_asym(self, cutoff: float) -> float: - def calc(idx_src: np.ndarray, idx_dst: np.ndarray) -> float: - if idx_src.size == 0 or idx_dst.size == 0: - return 0.0 - - min_d0 = 2.0 if self._has_na else 1.0 - - best, found = 0.0, False - for i in idx_src: - row = self._pae[i, idx_dst] - valid = row < cutoff - if not np.any(valid): - continue - n = int(np.count_nonzero(valid)) - length = max(27.0, float(n)) - d0 = max(min_d0, 1.24 * (length - 15.0) ** (1.0 / 3.0) - 1.8) - ptm = 1.0 / (1.0 + (row[valid] / d0) ** 2) - best = max(best, float(np.mean(ptm))) - found = True - return best if found else 0.0 - - a = calc(self._idx1, self._idx2) - b = calc(self._idx2, self._idx1) - return max(a, b) - def _frac(self, names: set[str]) -> float: residues = self._res1 | self._res2 if not residues: diff --git a/src/alphajudge/meta_score.py b/src/alphajudge/meta_score.py index 9a623396..fece51a3 100644 --- a/src/alphajudge/meta_score.py +++ b/src/alphajudge/meta_score.py @@ -5,6 +5,8 @@ from collections.abc import Mapping from typing import Any +from .confidence import IPTM_SCOPE_CHAIN_PAIR, SCOPE_INCLUDES_EXCLUDED_TOKENS + META_SCORE_FEATURES = ( "interface_LIS", "interface_ipSAE", @@ -577,24 +579,16 @@ def calibrated_feature_percentile( quantiles = BENCHMARK_QUANTILES_BY_BACKEND.get(backend, {}).get( feature, BENCHMARK_QUANTILES[feature] ) - levels = CALIBRATION_LEVELS - if oriented <= quantiles[0]: - return levels[0] + return CALIBRATION_LEVELS[0] if oriented >= quantiles[-1]: - return levels[-1] + return CALIBRATION_LEVELS[-1] - lower_idx = bisect_right(quantiles, oriented) - 1 - lower_idx = max(0, min(lower_idx, len(quantiles) - 2)) - q0 = quantiles[lower_idx] - q1 = quantiles[lower_idx + 1] - p0 = levels[lower_idx] - p1 = levels[lower_idx + 1] - - if oriented == q0 or q1 <= q0: - return p0 - fraction = (oriented - q0) / (q1 - q0) - return p0 + fraction * (p1 - p0) + # quantiles[i] <= oriented < quantiles[i + 1], so the bracket is never empty. + i = bisect_right(quantiles, oriented) - 1 + q0, q1 = quantiles[i], quantiles[i + 1] + p0, p1 = CALIBRATION_LEVELS[i], CALIBRATION_LEVELS[i + 1] + return p0 + (oriented - q0) / (q1 - q0) * (p1 - p0) def infer_backend(row: Mapping[str, Any]) -> str | None: @@ -612,24 +606,37 @@ def infer_backend(row: Mapping[str, Any]) -> str | None: return None +def feature_is_comparable(row: Mapping[str, Any], feature: str) -> bool: + """Whether the feature has the scope used by the frozen calibration. + + Keep native global confidences in the CSV, but do not calibrate them as + polymer-only evidence when AF3 also scored discarded ligand/other tokens. + Older rows without scope metadata retain their existing interpretation. + """ + if row.get("global_confidence_scope") != SCOPE_INCLUDES_EXCLUDED_TOKENS: + return True + if feature in {"confidence_score", "ptm", "iptm_ptm"}: + return False + return feature != "iptm" or row.get("iptm_scope") == IPTM_SCOPE_CHAIN_PAIR + + def interface_meta_score(row: Mapping[str, Any]) -> float: """ Transparent rank-style interface metascore. Each selected AlphaJudge feature is converted to a frozen benchmark percentile where higher means stronger interaction evidence. Missing or - non-finite inputs are ignored. The final score is the mean percentile. + non-finite and scope-incompatible inputs are ignored. The final score is + the mean of the remaining percentiles; no AF3x-specific calibration is implied. """ - percentiles = [ - percentile - for feature in META_SCORE_FEATURES - if ( - percentile := calibrated_feature_percentile( - feature, row.get(feature), infer_backend(row) - ) - ) - is not None - ] + backend = infer_backend(row) + percentiles = [] + for feature in META_SCORE_FEATURES: + if not feature_is_comparable(row, feature): + continue + percentile = calibrated_feature_percentile(feature, row.get(feature), backend) + if percentile is not None: + percentiles.append(percentile) if not percentiles: return float("nan") return float(sum(percentiles) / len(percentiles)) diff --git a/src/alphajudge/parsers/__init__.py b/src/alphajudge/parsers/__init__.py index 5ee827f8..b2ca61f0 100644 --- a/src/alphajudge/parsers/__init__.py +++ b/src/alphajudge/parsers/__init__.py @@ -1,8 +1,9 @@ from __future__ import annotations +from abc import ABC, abstractmethod +from collections.abc import Callable from dataclasses import dataclass from pathlib import Path -from typing import Any, Callable -from abc import ABC, abstractmethod +from typing import Any import gzip import json import lzma @@ -10,12 +11,14 @@ from ..confidence import Confidence from ..geometry import is_pae_token_residue, representative_atom + @dataclass class Run: order: list[str] source: str load_model: Callable[[str], tuple[Any, Confidence]] + class BaseParser(ABC): name: str = "base" @@ -29,8 +32,8 @@ def parse_run(self, d: Path) -> Run: ... _MAGIC = ((b"\xfd7zXZ\x00", lzma.open), (b"\x1f\x8b", gzip.open)) @classmethod - def _open_maybe_compressed(cls, p: Path): - """Open ``p`` for text reading, detecting xz/gz by its magic bytes. + def _open_maybe_compressed(cls, p: Path, mode: str = "rt"): + """Open ``p`` for reading, detecting xz/gz by its magic bytes. Compression is identified from the file header rather than the extension, so a compressed file is handled regardless of how it is @@ -40,8 +43,8 @@ def _open_maybe_compressed(cls, p: Path): head = fh.read(6) for magic, opener in cls._MAGIC: if head.startswith(magic): - return opener(p, "rt") - return p.open("rt") + return opener(p, mode) + return p.open(mode) @classmethod def _read_json(cls, p: Path) -> dict: @@ -54,34 +57,35 @@ def _read_json(cls, p: Path) -> dict: the file's magic bytes, not its extension. """ try: - target = p - if not target.exists(): - # Plain path absent: try a compressed sibling from slim/minimal. - for ext in (".xz", ".gz"): - cp = p.with_name(p.name + ext) - if cp.exists(): - target = cp - break - else: - return {} + # Plain path absent: try a compressed sibling from slim/minimal. + target = cls._first_existing( + [p, p.with_name(p.name + ".xz"), p.with_name(p.name + ".gz")] + ) + if target is None: + return {} with cls._open_maybe_compressed(target) as fh: return json.load(fh) except Exception: return {} + @staticmethod + def _first_existing(paths) -> Path | None: + return next((p for p in paths if p.exists()), None) + @staticmethod def _load_structure(path: str): p = Path(path) - parser = MMCIFParser(QUIET=True) if p.suffix.lower()==".cif" else PDBParser(QUIET=True) + parser = MMCIFParser(QUIET=True) if p.suffix.lower() == ".cif" else PDBParser(QUIET=True) return parser.get_structure("complex", str(p)) @staticmethod def _guess_struct(d: Path, model: str) -> str: - md = d / model - if (md / "model.cif").exists(): return str(md / "model.cif") - for ext in ("*.cif","*.pdb"): - hits = list(d.glob(f"*{model}*{ext[1:]}")) - if hits: return str(hits[0]) + if (d / model / "model.cif").exists(): + return str(d / model / "model.cif") + for ext in ("cif", "pdb"): + hits = list(d.glob(f"*{model}*.{ext}")) + if hits: + return str(hits[0]) raise ValueError(f"struct for model {model} not found") @staticmethod @@ -123,43 +127,51 @@ def _plddt(chains, rim) -> list[float]: continue return out + @staticmethod + def _residue_token(residue, token_indices: list[int]) -> int | None: + """The token carrying a scored residue's PAE row, or None if ambiguous. + + AF3 and Boltz-2 give a standard residue one token centred on CA + (protein) or C1' (nucleic acid), but a modified residue one token per + atom, in the residue's atom order. Take the per-atom token of that same + centre atom, and only when the tokens and the residue's atoms + correspond one to one. + """ + if len(token_indices) == 1: + return token_indices[0] + atom_names = [atom.get_id() for atom in residue] + if len(token_indices) != len(atom_names): + return None + for centre in ("CA", "C1'"): + if centre in atom_names: + return token_indices[atom_names.index(centre)] + return None + @staticmethod def _safe_float(x): - try: return float(x) - except Exception: return None + try: + return float(x) + except Exception: + return None class ParserManager: + """Registered parsers, tried in registration order.""" + def __init__(self): - self._order: list[str] = [] self._parsers: dict[str, BaseParser] = {} def register(self, parser_cls: type[BaseParser]) -> None: inst = parser_cls() self._parsers[inst.name] = inst - if inst.name not in self._order: - self._order.append(inst.name) - - def unregister(self, name: str) -> None: - self._parsers.pop(name, None) - if name in self._order: self._order.remove(name) - - def enable_only(self, names: list[str]) -> None: - self._order = [n for n in names if n in self._parsers] - - def set_precedence(self, names: list[str]) -> None: - remaining = [n for n in self._order if n not in names] - self._order = [n for n in names if n in self._parsers] + remaining - - def list_parsers(self) -> list[str]: - return [n for n in self._order if n in self._parsers] def pick(self, d: Path) -> BaseParser: - for n in self._order: - p = self._parsers.get(n) - if p and p.detect(d): return p + for p in self._parsers.values(): + if p.detect(d): + return p raise ValueError("no supported parser detected") + manager = ParserManager() # import concrete parsers and register diff --git a/src/alphajudge/parsers/af2.py b/src/alphajudge/parsers/af2.py index 33b68d42..731fd143 100644 --- a/src/alphajudge/parsers/af2.py +++ b/src/alphajudge/parsers/af2.py @@ -1,7 +1,5 @@ from __future__ import annotations -import gzip import logging -import lzma import pickle from pathlib import Path import numpy as np @@ -43,17 +41,14 @@ def load_model(model: str): iptm_ptm = self._safe_float(rj["iptm+ptm"].get(model)) # Backfill when PTM is not provided in AF2 multimer JSON if ptm is None and (iptm_ptm is not None) and (iptm is not None): - try: - ptm = (iptm_ptm - 0.8 * iptm) / 0.2 - except Exception: - ptm = None + ptm = (iptm_ptm - 0.8 * iptm) / 0.2 # If iptm+ptm itself is missing but both iptm and ptm exist, derive it if iptm_ptm is None and (iptm is not None) and (ptm is not None): iptm_ptm = 0.8 * iptm + 0.2 * ptm conf = iptm_ptm else: iptm, ptm = 0.0, self._safe_float(rj["ptm"][model]) - iptm_ptm = ptm; conf = ptm + iptm_ptm = conf = ptm plddt = self._plddt(chains, rim) return struct, Confidence( @@ -78,7 +73,8 @@ def _load_contact_probs_from_result_pkl( return None try: - payload = cls._read_pickle(result_pkl) + with cls._open_maybe_compressed(result_pkl, "rb") as f: + payload = pickle.load(f) except Exception as e: logger.warning(f"could not read AF2 result pickle {result_pkl}: {e}") return None @@ -125,36 +121,17 @@ def _load_contact_probs_from_result_pkl( return contact_probs - @staticmethod - def _find_result_pkl(d: Path, model: str) -> Path | None: - suffixes = ("", ".gz", ".xz") + @classmethod + def _find_result_pkl(cls, d: Path, model: str) -> Path | None: stems = [ d / f"result_{model}.pkl", d / model / "result.pkl", d / model / f"result_{model}.pkl", ] - candidates: list[Path] = [] - for stem in stems: - candidates.extend(stem.with_name(stem.name + suffix) for suffix in suffixes) + candidates = [ + stem.with_name(stem.name + suffix) for stem in stems for suffix in ("", ".gz", ".xz") + ] candidates.extend(sorted(d.glob(f"result*{model}*.pkl*"))) - candidates.extend(sorted((d / model).glob("result*.pkl*")) if (d / model).is_dir() else []) - - seen: set[Path] = set() - for candidate in candidates: - if candidate in seen: - continue - seen.add(candidate) - if candidate.exists(): - return candidate - return None - - @staticmethod - def _read_pickle(path: Path): - if path.suffix == ".gz": - with gzip.open(path, "rb") as f: - return pickle.load(f) - if path.suffix == ".xz": - with lzma.open(path, "rb") as f: - return pickle.load(f) - with path.open("rb") as f: - return pickle.load(f) + if (d / model).is_dir(): + candidates.extend(sorted((d / model).glob("result*.pkl*"))) + return cls._first_existing(candidates) diff --git a/src/alphajudge/parsers/af3.py b/src/alphajudge/parsers/af3.py index 9196bb6c..8384af8c 100644 --- a/src/alphajudge/parsers/af3.py +++ b/src/alphajudge/parsers/af3.py @@ -1,15 +1,40 @@ from __future__ import annotations +from dataclasses import dataclass from pathlib import Path -from typing import Any import csv import logging +import re import numpy as np from . import BaseParser, Run -from ..confidence import Confidence +from ..confidence import SCOPE_INCLUDES_EXCLUDED_TOKENS, SCOPE_SCORED_RESIDUES, Confidence from ..geometry import is_pae_token_residue logger = logging.getLogger(__name__) + +@dataclass(frozen=True) +class _ResidueTokens: + """Where each scored residue sits in AF3's token-by-token matrices.""" + + residue_count: int + # Size the token matrices must have; None when token metadata is unusable. + token_count: int | None + # Token of each scored residue in cid order; None when unmappable. + index: np.ndarray | None + + @property + def excludes_tokens(self) -> bool: + """Whether the token matrices also carry tokens that are not scored.""" + return self.token_count is not None and self.token_count > self.residue_count + + def select(self, token_matrix: np.ndarray) -> np.ndarray | None: + """The residue-by-residue block of a token matrix, or None.""" + n = self.token_count + if self.index is None or token_matrix.shape != (n, n): + return None + return token_matrix[np.ix_(self.index, self.index)] + + class AF3Parser(BaseParser): name = "af3" @@ -25,7 +50,6 @@ def parse_run(self, d: Path) -> Run: job_prefix = self._job_prefix_from_ranking_file(ranking_file) def load_model(model: str): - model_dir = d / model is_best_model = bool(order and model == order[0]) struct = self._load_structure( self._guess_af3_struct(d, model, job_prefix, is_best_model) @@ -42,7 +66,7 @@ def load_model(model: str): ) or summary iptm = self._safe_float(summary.get("iptm")) - ptm = self._safe_float(summary.get("ptm")) + ptm = self._safe_float(summary.get("ptm")) ranking_score = self._safe_float(summary.get("ranking_score")) if ranking_score is None: ranking_score = ranking_scores.get(model) @@ -53,9 +77,27 @@ def load_model(model: str): if isinstance(chain_pair_iptm_raw, (list, tuple)): chain_pair_iptm = [list(r) if isinstance(r, (list, tuple)) else [] for r in chain_pair_iptm_raw] - pae, max_pae = self._normalize_pae_af3(matrix, chains, cid) - contact_probs = self._normalize_contact_probs_af3(matrix, chains, cid) + token_chain_ids = matrix.get("token_chain_ids") + summary_chain_ids = ( + list(dict.fromkeys(str(c) for c in token_chain_ids)) + if isinstance(token_chain_ids, (list, tuple)) + else [str(c.id) for c in chains] + ) + if chain_pair_iptm is not None and ( + len(chain_pair_iptm) != len(summary_chain_ids) + or any(len(row) != len(summary_chain_ids) for row in chain_pair_iptm) + ): + logger.warning("chain_pair_iptm dimensions do not match the source chains; skipping pair ipTM.") + chain_pair_iptm = None + + pae, max_pae, residue_tokens = self._normalize_pae_af3(matrix, chains, cid) + contact_probs = self._normalize_contact_probs_af3(matrix, residue_tokens) plddt = self._plddt(chains, rim) + global_scope = ( + SCOPE_INCLUDES_EXCLUDED_TOKENS + if residue_tokens.excludes_tokens + else SCOPE_SCORED_RESIDUES + ) return struct, Confidence( pae_matrix=pae, max_pae=max_pae, @@ -63,6 +105,8 @@ def load_model(model: str): plddt_residue=plddt, chain_pair_iptm=chain_pair_iptm, contact_prob_matrix=contact_probs, contact_prob_source="af3_contact_probs" if contact_probs is not None else None, + chain_pair_iptm_chain_ids=summary_chain_ids, + global_confidence_scope=global_scope, ) return Run(order=order, source="af3", load_model=load_model) @@ -86,31 +130,33 @@ def _job_prefix_from_ranking_file(p: Path) -> str | None: @staticmethod def _read_csv_order(p: Path) -> tuple[list[str], dict[str, float]]: + """Models in a ranking_scores CSV, best first, and their finite scores.""" with p.open(newline="") as f: - rows = [r for r in csv.DictReader(f) if r] - def pf(x: str | None) -> float: - try: return float(x) # type: ignore[arg-type] - except Exception: return float("nan") - rows.sort(key=lambda r: pf(r.get("ranking_score")), reverse=True) + rows = list(csv.DictReader(f)) + + def score(row: dict) -> float: + try: + return float(row.get("ranking_score")) + except (TypeError, ValueError): + return float("nan") + + def rank(row: dict) -> float: + # Missing and non-finite scores rank last, matching the scores below. + value = score(row) + return value if np.isfinite(value) else -np.inf + order: list[str] = [] scores: dict[str, float] = {} - for r in rows: + for r in sorted(rows, key=rank, reverse=True): if "seed" not in r or "sample" not in r: continue model = f"seed-{r['seed']}_sample-{r['sample']}" order.append(model) - score = pf(r.get("ranking_score")) - if np.isfinite(score): - scores[model] = score + value = score(r) + if np.isfinite(value): + scores[model] = value return order, scores - @staticmethod - def _find_existing(paths: list[Path]) -> Path | None: - for p in paths: - if p.exists(): - return p - return None - @classmethod def _find_af3_json( cls, @@ -159,7 +205,7 @@ def _is_summary(name: str) -> bool: continue candidates.append(hit) - return cls._find_existing(candidates) or candidates[0] + return cls._first_existing(candidates) or candidates[0] @classmethod def _guess_af3_struct( @@ -170,6 +216,12 @@ def _guess_af3_struct( is_best_model: bool, ) -> str: model_dir = d / model + # "seed-1_sample-1" must not pick up "seed-1_sample-10". + this_model = re.compile(rf"{re.escape(model)}(?!\d)") + + def model_files(directory: Path, pattern: str) -> list[Path]: + return sorted(p for p in directory.glob(pattern) if this_model.search(p.name)) + candidates: list[Path] = [] for ext in ("cif", "pdb"): candidates.append(model_dir / f"model.{ext}") @@ -177,93 +229,68 @@ def _guess_af3_struct( candidates.append(model_dir / f"{job_prefix}_{model}_model.{ext}") if model_dir.is_dir(): for ext in ("cif", "pdb"): - candidates.extend(sorted(model_dir.glob(f"*{model}*_model.{ext}"))) + candidates.extend(model_files(model_dir, f"*{model}*_model.{ext}")) candidates.extend(sorted(model_dir.glob(f"*.{ext}"))) if job_prefix and is_best_model: for ext in ("cif", "pdb"): candidates.append(d / f"{job_prefix}_model.{ext}") for ext in ("cif", "pdb"): - candidates.extend(sorted(d.glob(f"*{model}*.{ext}"))) - found = cls._find_existing(candidates) + candidates.extend(model_files(d, f"*{model}*.{ext}")) + found = cls._first_existing(candidates) if found is not None: return str(found) raise ValueError(f"struct for model {model} not found") @staticmethod - def _normalize_pae_af3(matrix: dict, chains, cid) -> tuple[np.ndarray, float]: - total = sum(len(cid[c.id]) for c in chains) - pae = np.full((total, total), 100.0, dtype=float) - max_pae = float('nan') - - if "predicted_aligned_error" in matrix: - # some AF3 builds still store a full matrix in confidences.json - m = np.array(matrix["predicted_aligned_error"], dtype=float) - if m.size: - if m.shape == pae.shape: - pae[:, :] = m - else: - logger.warning( - f"predicted_aligned_error shape {m.shape} != expected {pae.shape}; " - "skipping PAE assignment." - ) - max_pae = float(matrix.get("max_predicted_aligned_error", np.nan)) - if not np.isfinite(max_pae): - max_pae = float(np.nanmax(m)) if m.size else float('nan') - - elif "pae" in matrix and "token_chain_ids" in matrix: - # Prefer to use the full token×token PAE matrix directly when it - # matches the residue×residue layout, to retain per-residue detail. - tokens = np.array(matrix["pae"], dtype=float) - max_pae = float(np.nanmax(tokens)) if tokens.size else float('nan') - - if tokens.shape == pae.shape: - # 1:1 correspondence between tokens and residues; assume that - # token order matches the global residue order used for cid. - pae[:, :] = tokens - else: - # Fallback to coarse chain-pair mapping using token_chain_ids. - ids = matrix["token_chain_ids"] - # map token groups → chain indices - seen: list[Any] = [] - for c in ids: - if c not in seen: - seen.append(c) - group = {v: i for i, v in enumerate(seen)} - for i, chi in enumerate(chains): - ti = [k for k, c in enumerate(ids) if group.get(c, -1) == i]; ri = cid.get(chi.id, []) - for j, chj in enumerate(chains): - tj = [k for k, c in enumerate(ids) if group.get(c, -1) == j]; rj = cid.get(chj.id, []) - if ti and tj and ri and rj: - block = tokens[np.ix_(ti, tj)] - val = float(np.nanmin(block)) if block.size else 100.0 - pae[np.ix_(ri, rj)] = val - - elif "chain_pair_pae_min" in matrix: - cp = np.array(matrix["chain_pair_pae_min"], dtype=float) - max_pae = float(np.nanmax(cp)) if cp.size else float('nan') - for i, chi in enumerate(chains): - ri = cid.get(chi.id, []) - for j, chj in enumerate(chains): - rj = cid.get(chj.id, []) - try: val = float(cp[i][j]) - except Exception: val = None - if ri and rj: - pae[np.ix_(ri, rj)] = 100.0 if val is None else val - else: + def _normalize_pae_af3(matrix: dict, chains, cid) -> tuple[np.ndarray, float, _ResidueTokens]: + """Residue-level PAE, its maximum, and the residue-to-token map used. + + The map is returned so the other token matrices reuse it. + """ + raw = matrix.get("predicted_aligned_error", matrix.get("pae")) + if raw is None: + if "chain_pair_pae_min" in matrix: + raise ValueError( + "AF3 confidences contain only chain-pair minima, not residue-level PAE; " + "provide the full confidences.json to compute interface scores." + ) raise ValueError( - "unknown AF3 confidences schema: expected predicted_aligned_error, " - "pae with token_chain_ids, or chain_pair_pae_min" + "unknown AF3 confidences schema: expected residue-level PAE " + "in predicted_aligned_error or pae" ) - return pae, float(max_pae) + tokens = np.asarray(raw, dtype=float) + if tokens.ndim != 2 or tokens.shape[0] != tokens.shape[1] or not tokens.size: + raise ValueError(f"AF3 PAE must be a nonempty square matrix, got {tokens.shape}.") + residue_tokens = AF3Parser._residue_tokens_af3(matrix, chains, cid) + total = residue_tokens.residue_count + expected_shape = (total, total) + pae = residue_tokens.select(tokens) + if pae is None: + raise ValueError( + f"Cannot align AF3 PAE shape {tokens.shape} to {expected_shape}: " + "token chain/residue identifiers must map each scored residue unambiguously. " + "Chain-pair minima cannot substitute for residue-level PAE." + ) + if not np.all(np.isfinite(pae)) or np.any(pae < 0): + raise ValueError("Aligned AF3 PAE contains non-finite or negative values.") + if tokens.shape != expected_shape: + logger.info( + "Aligned %d AF3 PAE tokens to %d scored residues; excluded %d tokens.", + len(tokens), total, len(tokens) - total, + ) + max_pae = float(matrix.get("max_predicted_aligned_error", np.nan)) + if not np.isfinite(max_pae): + max_pae = float(np.max(pae)) + return pae, float(max_pae), residue_tokens - @classmethod - def _normalize_contact_probs_af3(cls, matrix: dict, chains, cid) -> np.ndarray | None: + @staticmethod + def _normalize_contact_probs_af3(matrix: dict, residue_tokens: _ResidueTokens) -> np.ndarray | None: raw = matrix.get("contact_probs") if raw is None: return None - expected_shape = (sum(len(cid[c.id]) for c in chains),) * 2 + expected_shape = (residue_tokens.residue_count,) * 2 contact_probs = np.asarray(raw, dtype=float) if contact_probs.ndim != 2: logger.warning( @@ -272,136 +299,74 @@ def _normalize_contact_probs_af3(cls, matrix: dict, chains, cid) -> np.ndarray | ) return None - if contact_probs.shape == expected_shape: - aligned = contact_probs - else: - aligned = cls._align_token_pair_matrix_to_residues( - contact_probs, - matrix.get("token_chain_ids"), - matrix.get("token_res_ids") or matrix.get("token_residue_ids"), - chains, - cid, - expected_shape, + aligned = residue_tokens.select(contact_probs) + if aligned is None: + logger.warning( + f"Cannot align contact_probs shape {contact_probs.shape} to {expected_shape}; " + "skipping contact probabilities." ) - if aligned is None: - logger.warning( - f"contact_probs shape {contact_probs.shape} != expected {expected_shape}; " - "skipping contact probabilities." - ) - return None - return aligned @staticmethod - def _align_token_pair_matrix_to_residues( - token_matrix: np.ndarray, - token_chain_ids, - token_res_ids, - chains, - cid, - expected_shape: tuple[int, int], - ) -> np.ndarray | None: + def _residue_tokens_af3(matrix: dict, chains, cid) -> _ResidueTokens: + """Find the token of each scored residue in AF3's token matrices. + + Supplied residue identifiers are authoritative: a failed match never + falls back to positional assignment. Without them each retained chain + must match by chain ID with one token per residue, and without any + token metadata the matrices must already be in residue order. + """ + total = sum(len(cid[c.id]) for c in chains) + if "token_chain_ids" not in matrix: + # Legacy residue matrices without token metadata are already ordered. + return _ResidueTokens(total, total, np.arange(total)) + token_chain_ids = matrix["token_chain_ids"] if not isinstance(token_chain_ids, (list, tuple)): - return None - if len(token_chain_ids) != token_matrix.shape[0] or token_matrix.shape[0] != token_matrix.shape[1]: - return None - + return _ResidueTokens(total, None, None) ids = [str(x) for x in token_chain_ids] - if isinstance(token_res_ids, (list, tuple)) and len(token_res_ids) == len(ids): - residue_matrix = AF3Parser._align_token_pair_matrix_by_residue_ids( - token_matrix, - ids, - token_res_ids, - chains, - cid, - expected_shape, - ) - if residue_matrix is not None: - return residue_matrix - - seen: list[str] = [] - for chain_id in ids: - if chain_id not in seen: - seen.append(chain_id) - - token_indices_by_chain: dict[str, np.ndarray] = {} - for i, chain in enumerate(chains): - residue_indices = np.asarray(cid.get(chain.id, []), dtype=int) - if residue_indices.size == 0: - token_indices_by_chain[chain.id] = np.array([], dtype=int) - continue - - exact = np.asarray([k for k, chain_id in enumerate(ids) if chain_id == str(chain.id)], dtype=int) - ordered = ( - np.asarray([k for k, chain_id in enumerate(ids) if chain_id == seen[i]], dtype=int) - if i < len(seen) - else np.array([], dtype=int) - ) - token_indices = exact if exact.size == residue_indices.size else ordered - if token_indices.size != residue_indices.size: - return None - token_indices_by_chain[chain.id] = token_indices - - residue_matrix = np.full(expected_shape, np.nan, dtype=float) - for chi in chains: - ri = np.asarray(cid.get(chi.id, []), dtype=int) - ti = token_indices_by_chain.get(chi.id, np.array([], dtype=int)) - if ri.size == 0: - continue - for chj in chains: - rj = np.asarray(cid.get(chj.id, []), dtype=int) - tj = token_indices_by_chain.get(chj.id, np.array([], dtype=int)) - if rj.size == 0: + unmappable = _ResidueTokens(total, len(ids), None) + token_res_ids = matrix.get("token_res_ids", matrix.get("token_residue_ids")) + if token_res_ids is not None and ( + not isinstance(token_res_ids, (list, tuple)) or len(token_res_ids) != len(ids) + ): + return unmappable + + index = np.full(total, -1, dtype=int) + if token_res_ids is None: + for chain in chains: + residues = cid.get(chain.id, []) + if not residues: continue - residue_matrix[np.ix_(ri, rj)] = token_matrix[np.ix_(ti, tj)] - return residue_matrix - - @staticmethod - def _align_token_pair_matrix_by_residue_ids( - token_matrix: np.ndarray, - token_chain_ids: list[str], - token_res_ids, - chains, - cid, - expected_shape: tuple[int, int], - ) -> np.ndarray | None: - token_lookup: dict[tuple[str, int], int] = {} - for token_idx, (chain_id, raw_res_id) in enumerate(zip(token_chain_ids, token_res_ids)): - try: - res_id = int(raw_res_id) - except (TypeError, ValueError): - continue - token_lookup.setdefault((chain_id, res_id), token_idx) - - token_indices_by_chain: dict[str, np.ndarray] = {} - for chain in chains: - residue_indices = np.asarray(cid.get(chain.id, []), dtype=int) - if residue_indices.size == 0: - token_indices_by_chain[chain.id] = np.array([], dtype=int) - continue - - kept = [res for res in chain if is_pae_token_residue(res)] - if len(kept) != residue_indices.size: - return None - - token_indices: list[int] = [] - for residue in kept: - token_idx = token_lookup.get((str(chain.id), int(residue.id[1]))) - if token_idx is None: - return None - token_indices.append(token_idx) - token_indices_by_chain[chain.id] = np.asarray(token_indices, dtype=int) - - residue_matrix = np.full(expected_shape, np.nan, dtype=float) - for chi in chains: - ri = np.asarray(cid.get(chi.id, []), dtype=int) - ti = token_indices_by_chain.get(chi.id, np.array([], dtype=int)) - if ri.size == 0: - continue - for chj in chains: - rj = np.asarray(cid.get(chj.id, []), dtype=int) - tj = token_indices_by_chain.get(chj.id, np.array([], dtype=int)) - if rj.size == 0: + tokens = [k for k, chain_id in enumerate(ids) if chain_id == str(chain.id)] + if len(tokens) != len(residues): + return unmappable + index[residues] = tokens + else: + # Several tokens share an ID on ligands (discarded) and on modified + # residues, which AF3 tokenizes per atom (resolved by _residue_token). + tokens_by_residue: dict[tuple[str, int], list[int]] = {} + for token, (chain_id, raw_res_id) in enumerate(zip(ids, token_res_ids)): + try: + res_id = int(raw_res_id) + except (TypeError, ValueError): + continue + tokens_by_residue.setdefault((chain_id, res_id), []).append(token) + for chain in chains: + residues = cid.get(chain.id, []) + if not residues: continue - residue_matrix[np.ix_(ri, rj)] = token_matrix[np.ix_(ti, tj)] - return residue_matrix + kept = [res for res in chain if is_pae_token_residue(res)] + if len(kept) != len(residues): + return unmappable + tokens = [ + AF3Parser._residue_token( + res, tokens_by_residue.get((str(chain.id), int(res.id[1])), []) + ) + for res in kept + ] + if None in tokens or len(set(tokens)) != len(tokens): + return unmappable + index[residues] = tokens + if (index < 0).any(): + return unmappable + return _ResidueTokens(total, len(ids), index) diff --git a/src/alphajudge/parsers/boltz.py b/src/alphajudge/parsers/boltz.py index 79f370b0..b3e09fea 100644 --- a/src/alphajudge/parsers/boltz.py +++ b/src/alphajudge/parsers/boltz.py @@ -7,12 +7,18 @@ from typing import Any import numpy as np +from Bio.PDB.Polypeptide import is_aa from . import BaseParser, Run from ..confidence import Confidence +from ..geometry import is_pae_token_residue logger = logging.getLogger(__name__) +# Residue names Boltz-2 tokenizes as one token; every other residue gets one +# token per atom (besides the 20 standard amino acids). +_BOLTZ_STANDARD_NON_AA = frozenset({"UNK", "A", "C", "G", "U", "N", "DA", "DC", "DG", "DT", "DN"}) + @dataclass(frozen=True) class _BoltzModel: @@ -44,14 +50,30 @@ def load_model(model: str): chains, rim, cid = self._maps(struct) summary = self._read_json(entry.confidence_file) - pae, max_pae = self._load_pae(entry.pae_file, chains, cid) - plddt = self._load_plddt(entry.plddt_file, rim) or self._plddt(chains, rim) + token_count, token_index = self._residue_tokens(chains, cid) + pae, max_pae = self._load_pae(entry.pae_file, len(rim), token_count, token_index) + plddt = ( + self._load_plddt(entry.plddt_file, len(rim), token_count, token_index) + or self._plddt(chains, rim) + ) iptm = self._safe_float(summary.get("iptm")) ptm = self._safe_float(summary.get("ptm")) confidence_score = self._safe_float(summary.get("confidence_score")) iptm_ptm = 0.8 * iptm + 0.2 * ptm if (iptm is not None and ptm is not None) else None + # Boltz-2 indexes pair_chains_iptm by chain in structure order, + # ligand chains included. + chain_ids = [str(c.id) for c in chains] chain_pair_iptm = self._chain_pair_matrix(summary.get("pair_chains_iptm")) + if chain_pair_iptm is not None and ( + len(chain_pair_iptm) != len(chain_ids) + or any(len(row) != len(chain_ids) for row in chain_pair_iptm) + ): + logger.warning( + "Boltz-2 pair_chains_iptm dimensions do not match the structure's " + "chains; skipping pair ipTM." + ) + chain_pair_iptm = None return struct, Confidence( pae_matrix=pae, @@ -62,6 +84,7 @@ def load_model(model: str): confidence_score=confidence_score, plddt_residue=plddt, chain_pair_iptm=chain_pair_iptm, + chain_pair_iptm_chain_ids=chain_ids, ) return Run(order=order, source="boltz2", load_model=load_model) @@ -93,13 +116,6 @@ def _model_entries(d: Path) -> list[_BoltzModel]: return sorted(entries, key=lambda entry: (entry.rank, entry.name)) - @staticmethod - def _first_existing(paths: list[Path]) -> Path | None: - for path in paths: - if path.exists(): - return path - return None - @staticmethod def _rank_from_model_name(model_name: str) -> int: match = re.search(r"_model_(\d+)$", model_name) @@ -118,8 +134,35 @@ def _load_npz_array(path: Path, preferred_key: str) -> np.ndarray | None: return None @classmethod - def _load_pae(cls, pae_file: Path | None, chains, cid) -> tuple[np.ndarray, float]: - total = sum(len(cid[c.id]) for c in chains) + def _residue_tokens(cls, chains, cid) -> tuple[int, np.ndarray | None]: + """Boltz-2 token count and the token of each scored residue, in cid order. + + Rebuilt from the structure: Boltz-2 gives a standard residue one token + and any other residue (ligands, modified residues) one token per atom, + chain by chain in structure order. The index is None when a scored + residue's token is ambiguous. + """ + index = np.full(sum(len(cid[c.id]) for c in chains), -1, dtype=int) + token = 0 + for chain in chains: + scored = iter(cid[chain.id]) + for residue in chain: + standard = is_aa(residue, standard=True) or ( + residue.get_resname().strip().upper() in _BOLTZ_STANDARD_NON_AA + ) + n_tokens = 1 if standard else len(residue) + if is_pae_token_residue(residue): + residue_token = cls._residue_token(residue, list(range(token, token + n_tokens))) + if residue_token is None: + return token, None + index[next(scored)] = residue_token + token += n_tokens + return token, index + + @classmethod + def _load_pae( + cls, pae_file: Path | None, total: int, token_count: int, token_index: np.ndarray | None + ) -> tuple[np.ndarray, float]: pae = np.full((total, total), 100.0, dtype=float) if pae_file is None: return pae, 100.0 @@ -128,11 +171,16 @@ def _load_pae(cls, pae_file: Path | None, chains, cid) -> tuple[np.ndarray, floa if matrix is None or not matrix.size: return pae, 100.0 - max_pae = float(np.nanmax(matrix)) + if token_index is not None and matrix.shape == (token_count, token_count): + selected = matrix[np.ix_(token_index, token_index)] + return selected, float(np.nanmax(selected)) if selected.size else 100.0 if matrix.shape == pae.shape: - return matrix, max_pae - + return matrix, float(np.nanmax(matrix)) if matrix.ndim == 2 and matrix.shape[0] >= total and matrix.shape[1] >= total: + logger.warning( + f"Cannot map Boltz-2 PAE shape {matrix.shape} to the structure's tokens; " + f"using its leading {total}x{total} block." + ) trimmed = matrix[:total, :total] return trimmed, float(np.nanmax(trimmed)) if trimmed.size else 100.0 @@ -140,25 +188,27 @@ def _load_pae(cls, pae_file: Path | None, chains, cid) -> tuple[np.ndarray, floa f"Boltz-2 PAE shape {matrix.shape} != expected {pae.shape}; " "using default PAE=100 for all residue pairs." ) - return pae, max_pae + return pae, float(np.nanmax(matrix)) @classmethod - def _load_plddt(cls, plddt_file: Path | None, rim: dict[tuple[str, Any], int]) -> list[float] | None: + def _load_plddt( + cls, plddt_file: Path | None, total: int, token_count: int, token_index: np.ndarray | None + ) -> list[float] | None: if plddt_file is None: return None values = cls._load_npz_array(plddt_file, "plddt") if values is None: return None flat = values.ravel() - if flat.size != len(rim): - if flat.size > len(rim): - return [float(v) for v in flat[:len(rim)]] + if token_index is not None and flat.size == token_count: + return [float(v) for v in flat[token_index]] + if flat.size < total: logger.warning( - f"Boltz-2 pLDDT length {flat.size} != expected {len(rim)}; " + f"Boltz-2 pLDDT length {flat.size} != expected {total}; " "using structure B-factors instead." ) return None - return [float(v) for v in flat] + return [float(v) for v in flat[:total]] @staticmethod def _chain_pair_matrix(raw: Any) -> list[list[float]] | None: diff --git a/src/alphajudge/report.py b/src/alphajudge/report.py index 6104c759..c6506a54 100644 --- a/src/alphajudge/report.py +++ b/src/alphajudge/report.py @@ -14,9 +14,11 @@ from __future__ import annotations import csv +import glob import logging import math -from collections import OrderedDict +import statistics +from collections import Counter from collections.abc import Mapping, Sequence from datetime import datetime from pathlib import Path @@ -30,16 +32,15 @@ import numpy as np from matplotlib.backends.backend_pdf import PdfPages from matplotlib.colors import LinearSegmentedColormap -from matplotlib.patches import Circle, Rectangle +from matplotlib.patches import Rectangle from matplotlib.ticker import FuncFormatter, MaxNLocator +from .confidence import SCOPE_INCLUDES_EXCLUDED_TOKENS from .meta_score import ( - infer_backend, - BENCHMARK_QUANTILES, - CALIBRATION_LEVELS, - FEATURE_DIRECTIONS, META_SCORE_FEATURES, calibrated_feature_percentile, + feature_is_comparable, + infer_backend, interface_meta_score, ) @@ -75,11 +76,7 @@ _INFO_EDGE = "#ff0000" _HEADER_RULE = "#303030" _TABLE_RULE = "#202020" - -_AJ_BLUE = "#1f4e79" -_AJ_GREEN = "#2e8b57" -_AJ_GOLD = "#d08c00" -_AJ_DARK = "#111111" +_MARKER = "#0b0b0b" _REPORT_TITLE = "AlphaJudge Interface validation Report" _BENCHMARK_TAG = ( @@ -92,23 +89,19 @@ _FEATURE_DISPLAY = { "interface_contact_prob_top10_mean": "Contact probability", "interface_ccc": "Confident contacts", - "interface_LIS": "Interface LIS", "interface_ipSAE": "Interface ipSAE", - "interface_pDockQ2": "Interface pDockQ2", "iptm": "ipTM", "confidence_score": "Confidence score", "average_interface_pae": "Avg. interface PAE", "pDockQ/mpDockQ": "pDockQ / mpDockQ", "interface_sc": "Shape complementarity", "interface_hb": "Hydrogen bonds", - "interface_area": "Interface area", "interface_solv_en": "Solvation energy", } _FEATURE_UNITS = { "interface_ccc": "contacts, PAE < 4 Å", "average_interface_pae": "Å", - "interface_area": "Ų", "interface_solv_en": "kcal/mol", } @@ -204,48 +197,43 @@ def _row_meta_score(row: Mapping[str, Any]) -> float | None: # externally merged CSV could carry the legacy all-rows calibration; only # fall back to it when the raw feature columns are unavailable. computed = interface_meta_score(row) - if isinstance(computed, float) and math.isfinite(computed): + if math.isfinite(computed): return computed + if row.get("global_confidence_scope") == SCOPE_INCLUDES_EXCLUDED_TOKENS: + # A stale precomputed value may include the global scores just excluded. + return None return _safe_float(row.get("interface_meta_score")) -def _feature_view(row: Mapping[str, Any]) -> "OrderedDict[str, tuple[float | None, float | None]]": - view: "OrderedDict[str, tuple[float | None, float | None]]" = OrderedDict() +def _meta_sort_key(row: Mapping[str, Any]) -> float: + score = _row_meta_score(row) + return score if score is not None else -1.0 + + +def _raw_and_pct(row: Mapping[str, Any], feat: str, backend: str | None) -> tuple[float | None, float | None]: + """Raw feature value and its calibrated percentile (None when unavailable).""" + raw = _safe_float(row.get(feat)) + pct = ( + calibrated_feature_percentile(feat, raw, backend) + if raw is not None and feature_is_comparable(row, feat) + else None + ) + return raw, pct + + +def _feature_view(row: Mapping[str, Any]) -> dict[str, tuple[float | None, float | None]]: backend = infer_backend(row) - for feat in META_SCORE_FEATURES: - raw = _safe_float(row.get(feat)) - pct = ( - calibrated_feature_percentile(feat, raw, backend) - if raw is not None - else None - ) - view[feat] = (raw, pct) - return view + return {feat: _raw_and_pct(row, feat, backend) for feat in META_SCORE_FEATURES} def _best_row(rows: Sequence[Mapping[str, Any]]) -> Mapping[str, Any] | None: - best: tuple[float, Mapping[str, Any]] | None = None - for r in rows: - s = _row_meta_score(r) - if s is None: - continue - if best is None or s > best[0]: - best = (s, r) - if best is not None: - return best[1] + """Highest-metascore row (first on ties), else the first row.""" + scored = [(s, r) for r in rows if (s := _row_meta_score(r)) is not None] + if scored: + return max(scored, key=lambda sr: sr[0])[1] return rows[0] if rows else None -def _group_complex_rows(rows: Sequence[Mapping[str, Any]]) -> "OrderedDict[str, list[Mapping[str, Any]]]": - grouped: "OrderedDict[str, list[Mapping[str, Any]]]" = OrderedDict() - for r in rows: - key = str(r.get("jobs") or r.get("pair") or r.get("complex") or "") - if not key: - continue - grouped.setdefault(key, []).append(r) - return grouped - - def _format_raw(value: float | None, *, decimals: int = 3) -> str: if value is None: return "—" @@ -317,247 +305,76 @@ def _new_figure() -> plt.Figure: return plt.figure(figsize=_A4, facecolor="white") -def _draw_info_icon(fig: plt.Figure, *, x: float, y: float, r: float = 0.010) -> None: - """Small circled 'i' marker using AlphaJudge brand colour.""" - ax = fig.add_axes((x - r, y - r, 2 * r, 2 * r)) +def _text_axes(fig: plt.Figure, rect: tuple[float, float, float, float]): + """Invisible unit-square axes for placing text and shapes in ``transAxes``.""" + ax = fig.add_axes(rect) ax.set_xlim(0, 1) ax.set_ylim(0, 1) - ax.set_aspect("equal") ax.axis("off") - ax.add_patch( - Circle( - (0.5, 0.5), - 0.47, - facecolor="white", - edgecolor=_AJ_BLUE, - linewidth=1.0, - transform=ax.transAxes, - ) - ) - ax.text( - 0.5, - 0.48, - "i", - ha="center", - va="center", - fontsize=8, - color=_AJ_BLUE, - fontweight="bold", - transform=ax.transAxes, - ) + return ax -def _draw_alphajudge_logo( - fig: plt.Figure, - *, - x: float = 0.5, - y: float = 0.93, - w: float = 0.30, - h: float = 0.080, - compact: bool = False, -) -> None: - """Plain-text AlphaJudge mark. +def _label_axes(fig: plt.Figure, rect: tuple[float, float, float, float], text: str, **kwargs) -> None: + """A single line of text centred in its own invisible axes.""" + ax = _text_axes(fig, rect) + ax.text(0.5, 0.5, text, ha="center", va="center", transform=ax.transAxes, **kwargs) - Renders just "AlphaJudge report" (and a small "interface validation" - sub-line in the non-compact form). Intentionally text-only to avoid - any resemblance to third-party logos. - """ - ax = fig.add_axes((x - w / 2, y - h / 2, w, h)) - ax.set_xlim(0, 1) - ax.set_ylim(0, 1) - ax.axis("off") - if compact: - ax.text( - 0.5, - 0.5, - "AlphaJudge report", - ha="center", - va="center", - fontsize=9, - fontweight="bold", - color=_AJ_DARK, - transform=ax.transAxes, - ) - return - - ax.text( - 0.5, - 0.62, - "AlphaJudge report", - ha="center", - va="center", - fontsize=22, - fontweight="bold", - color=_AJ_DARK, - transform=ax.transAxes, - ) - ax.text( - 0.5, - 0.28, - "interface validation", - ha="center", - va="center", - fontsize=9, - color="#444444", - transform=ax.transAxes, - ) +def _kv_rows(ax, pairs: Sequence[tuple[str, str]], *, xs: tuple[float, float, float], + top: float, line_h: float, fontsize: float) -> None: + """Right-aligned label, centred colon, then left-aligned value per line.""" + for i, (label, value) in enumerate(pairs): + ypos = top - i * line_h + for x, text, ha in zip(xs, (label, ":", value), ("right", "center", "left")): + ax.text(x, ypos, text, fontsize=fontsize, ha=ha, va="top", transform=ax.transAxes) -def _add_page_header(fig: plt.Figure, *, page_no: int, total: int, title: str, entry: str) -> None: - """RCSB-style running header. +def _save_page(pdf: PdfPages, fig: plt.Figure) -> None: + pdf.savefig(fig) + plt.close(fig) - The cover page in wwPDB reports has no running header; page 2 onward does. - """ - if page_no <= 1: - return - ax = fig.add_axes((0.07, 0.952, 0.86, 0.036)) - ax.set_xlim(0, 1) - ax.set_ylim(0, 1) - ax.axis("off") - ax.text( - 0.0, - 0.62, - f"Page {page_no}", - fontsize=10, - ha="left", - va="center", - color="#111111", - transform=ax.transAxes, - ) - ax.text( - 0.5, - 0.62, - title, - fontsize=10, - ha="center", - va="center", - color="#111111", - transform=ax.transAxes, - ) - ax.text( - 1.0, - 0.62, - entry, - fontsize=10, - ha="right", - va="center", - color="#111111", - transform=ax.transAxes, - ) +def _add_page_header(fig: plt.Figure, *, page_no: int, entry: str) -> None: + """RCSB-style running header (the cover page has none).""" + ax = _text_axes(fig, (0.07, 0.952, 0.86, 0.036)) + for x, text, ha in ((0.0, f"Page {page_no}", "left"), (0.5, _REPORT_TITLE, "center"), (1.0, entry, "right")): + ax.text(x, 0.62, text, fontsize=10, ha=ha, va="center", color="#111111", transform=ax.transAxes) ax.plot([0.0, 1.0], [0.18, 0.18], color=_HEADER_RULE, linewidth=0.6, transform=ax.transAxes) -def _add_page_footer(fig: plt.Figure, *, page_no: int, total: int, last: bool) -> None: - """No footer mark; the running header already identifies the report.""" - return - - def _draw_info_box(fig: plt.Figure, *, x: float, y: float, w: float, h: float, lines: Sequence[str]) -> None: """Square-corner pink/red cover callout, closer to wwPDB style.""" - ax = fig.add_axes((x, y, w, h)) - ax.set_xlim(0, 1) - ax.set_ylim(0, 1) - ax.axis("off") + ax = _text_axes(fig, (x, y, w, h)) ax.add_patch( Rectangle( - (0.0, 0.0), - 1.0, - 1.0, - linewidth=0.8, - edgecolor=_INFO_EDGE, - facecolor=_INFO_BG, - transform=ax.transAxes, + (0.0, 0.0), 1.0, 1.0, + linewidth=0.8, edgecolor=_INFO_EDGE, facecolor=_INFO_BG, transform=ax.transAxes, ) ) - if not lines: - return - n = len(lines) - top = 0.83 - line_h = 0.68 / max(1, n - 1) if n > 1 else 0.0 + line_h = 0.68 / (n - 1) if n > 1 else 0.0 for i, line in enumerate(lines): - ax.text( - 0.5, - top - i * line_h, - line, - ha="center", - va="top", - fontsize=10.5, - color="#111111", - transform=ax.transAxes, - ) + ax.text(0.5, 0.83 - i * line_h, line, ha="center", va="top", fontsize=10.5, + color="#111111", transform=ax.transAxes) def _draw_meta_block(fig: plt.Figure, *, x: float, y: float, w: float, h: float, pairs: Sequence[tuple[str, str]]) -> None: """Right-aligned label, colon, then value (RCSB style).""" - ax = fig.add_axes((x, y, w, h)) - ax.set_xlim(0, 1) - ax.set_ylim(0, 1) - ax.axis("off") - n = len(pairs) - if n == 0: - return - top = 0.92 - line_h = 0.85 / max(1, n) - label_x = 0.36 - sep_x = 0.40 - val_x = 0.44 - for i, (label, value) in enumerate(pairs): - ypos = top - i * line_h - ax.text(label_x, ypos, label, fontsize=10.5, ha="right", va="top", transform=ax.transAxes) - ax.text(sep_x, ypos, ":", fontsize=10.5, ha="center", va="top", transform=ax.transAxes) - ax.text(val_x, ypos, value, fontsize=10.5, ha="left", va="top", transform=ax.transAxes) + ax = _text_axes(fig, (x, y, w, h)) + if pairs: + _kv_rows(ax, pairs, xs=(0.36, 0.40, 0.44), top=0.92, line_h=0.85 / len(pairs), fontsize=10.5) def _draw_section_heading( - fig: plt.Figure, - *, - x: float, - y: float, - w: float, - h: float, - number: str, - title: str, - show_info: bool = False, + fig: plt.Figure, *, x: float, y: float, w: float, h: float, number: str, title: str ) -> None: """Large numbered section heading with RCSB-like spacing.""" - ax = fig.add_axes((x, y, w, h)) - ax.set_xlim(0, 1) - ax.set_ylim(0, 1) - ax.axis("off") - + ax = _text_axes(fig, (x, y, w, h)) number_text = _truncate(str(number), 8) title_x = 0.060 + max(0, len(number_text) - 2) * 0.010 - - ax.text( - 0.0, - 0.50, - number_text, - fontsize=17, - fontweight="bold", - ha="left", - va="center", - color="#101010", - transform=ax.transAxes, - ) - ax.text( - title_x, - 0.50, - title, - fontsize=17, - fontweight="bold", - ha="left", - va="center", - color="#101010", - transform=ax.transAxes, - ) - - if show_info: - # Approximate icon placement immediately after the heading. - icon_x = min(x + w - 0.020, x + title_x * w + 0.0120 * len(title) + 0.020) - _draw_info_icon(fig, x=icon_x, y=y + h * 0.52, r=0.011) + for tx, text in ((0.0, number_text), (title_x, title)): + ax.text(tx, 0.50, text, fontsize=17, fontweight="bold", ha="left", va="center", + color="#101010", transform=ax.transAxes) # --------------------------------------------------------------------------- @@ -570,7 +387,6 @@ def _draw_section_heading( "bar_x": 0.240, "bar_width": 0.382, "value_x": 0.632, - "value_width": 0.120, "bar_height": 0.0105, "row_height": 0.0315, } @@ -582,41 +398,6 @@ def _clip_pct(pct: float | None) -> float | None: return max(0.0, min(1.0, pct)) -def _draw_slider_bar( - ax, - percentile: float | None = None, - *, - cmap=_SLIDER_CMAP, - draw_marker: bool = True, -) -> None: - """Thin wwPDB-style red-white-blue percentile bar.""" - ax.imshow( - _GRADIENT, - aspect="auto", - cmap=cmap, - extent=(0.0, 1.0, 0.0, 1.0), - interpolation="bilinear", - ) - ax.set_xlim(0.0, 1.0) - ax.set_ylim(0.0, 1.0) - ax.axis("off") - - pct = _clip_pct(percentile) - if draw_marker and pct is not None: - ax.add_patch( - Rectangle( - (pct - 0.006, -0.15), - 0.012, - 1.30, - facecolor="#0b0b0b", - edgecolor="#0b0b0b", - linewidth=0.4, - clip_on=False, - zorder=5, - ) - ) - - def _metric_rows_for_slider_panel( row: Mapping[str, Any], *, @@ -643,37 +424,19 @@ def _metric_rows_for_slider_panel( score = _row_meta_score(row) rows.append(("Meta score", score, score, "", "overall")) - fv = _feature_view(row) backend = infer_backend(row) for group_tag, features in groups: for feat in features: - if feat in fv: - raw, pct = fv[feat] - else: - # Compute percentile even when feature isn't in METASCORE - # (e.g. complex-level features were dropped from the metascore - # but still need a slider bar). - raw = _safe_float(row.get(feat)) - try: - pct = ( - calibrated_feature_percentile(feat, raw, backend) - if raw is not None - else None - ) - except KeyError: - # No frozen benchmark ladder for this feature yet. A slider - # with no percentile would be misleading rather than merely - # empty, so the row is omitted until the deciles exist; it - # appears automatically once they are frozen. - continue + try: + raw, pct = _raw_and_pct(row, feat, backend) + except KeyError: + # No frozen benchmark ladder for this feature yet. A slider + # with no percentile would be misleading rather than merely + # empty, so the row is omitted until the deciles exist; it + # appears automatically once they are frozen. + continue rows.append( - ( - _FEATURE_DISPLAY.get(feat, feat), - raw, - pct, - _FEATURE_UNITS.get(feat, ""), - group_tag, - ) + (_FEATURE_DISPLAY.get(feat, feat), raw, pct, _FEATURE_UNITS.get(feat, ""), group_tag) ) return rows @@ -687,32 +450,15 @@ def _draw_percentile_legend( w: float, label: str = "Percentile vs interacting (positive) benchmark pairs", ) -> None: - ax = fig.add_axes((x, y, w, 0.032)) - ax.set_xlim(0, 1) - ax.set_ylim(0, 1) - ax.axis("off") - + ax = _text_axes(fig, (x, y, w, 0.032)) ax.add_patch( Rectangle( - (0.000, 0.55), - 0.010, - 0.30, - facecolor="#0b0b0b", - edgecolor="#0b0b0b", - linewidth=0.4, - transform=ax.transAxes, + (0.000, 0.55), 0.010, 0.30, + facecolor=_MARKER, edgecolor=_MARKER, linewidth=0.4, transform=ax.transAxes, ) ) - ax.text( - 0.018, - 0.70, - label, - ha="left", - va="center", - fontsize=7.2, - color="#111111", - transform=ax.transAxes, - ) + ax.text(0.018, 0.70, label, ha="left", va="center", fontsize=7.2, color="#111111", + transform=ax.transAxes) def _draw_slider_panel( @@ -749,7 +495,7 @@ def _draw_slider_panel( bar_h = L["bar_height"] # Vertical layout: row height shrinks if the panel has to fit many rows. - # Inter-group gap pushes Q-score / AF / biophys apart. + # Inter-group gap pushes the metascore / AF / biophys blocks apart. group_gap = 0.012 n_group_changes = sum( 1 for i in range(1, n_rows) if rows[i][4] != rows[i - 1][4] @@ -759,38 +505,13 @@ def _draw_slider_panel( header_y = top - 0.012 # Column headers - no beige band, no boxed cells. - fig.text( - label_right - 0.020, - header_y, - "Metric", - ha="center", - va="center", - fontsize=10, - color="#111111", - ) - fig.text( - bar_x + bar_w / 2, - header_y, - "Percentile Ranks", - ha="center", - va="center", - fontsize=10, - color="#111111", - ) - fig.text( - value_x + 0.035, - header_y, - "Value", - ha="center", - va="center", - fontsize=10, - color="#111111", - ) + for hx, text in ((label_right - 0.020, "Metric"), (bar_x + bar_w / 2, "Percentile Ranks"), + (value_x + 0.035, "Value")): + fig.text(hx, header_y, text, ha="center", va="center", fontsize=10, color="#111111") # Compute per-row centres with extra spacing at group transitions. - first_center = top - 0.048 centers: list[float] = [] - cur_y = first_center + cur_y = top - 0.048 prev_group: str | None = None for _label, _raw, _pct, _units, group in rows: if prev_group is not None and group != prev_group: @@ -802,39 +523,20 @@ def _draw_slider_panel( # Rows: label, thin gradient bar, raw value. All rows share the same # typography (PDB-validation-style uniform treatment); the inter-group # gap is what separates the overall metascore from the feature rows. - pct_positions: list[tuple[int, float, str]] = [] - for i, ((label, raw, pct, units, group), center_y) in enumerate(zip(rows, centers)): - pct_clipped = _clip_pct(pct) - - fig.text( - label_right, - center_y, - label, - ha="right", - va="center", - fontsize=9.2, - color="#111111", - ) + for (label, raw, _pct, units, _group), center_y in zip(rows, centers): + fig.text(label_right, center_y, label, ha="right", va="center", fontsize=9.2, color="#111111") bar_ax = fig.add_axes((bar_x, center_y - bar_h / 2, bar_w, bar_h), zorder=2) - _draw_slider_bar(bar_ax, None, draw_marker=False) + bar_ax.imshow(_GRADIENT, aspect="auto", cmap=_SLIDER_CMAP, extent=(0.0, 1.0, 0.0, 1.0), + interpolation="bilinear") + bar_ax.set_xlim(0.0, 1.0) + bar_ax.set_ylim(0.0, 1.0) + bar_ax.axis("off") raw_text = _format_raw(raw) if units and raw_text != "—": raw_text = f"{raw_text} {units}" - - fig.text( - value_x, - center_y, - raw_text, - ha="left", - va="center", - fontsize=9.2, - color="#111111", - ) - - if pct_clipped is not None: - pct_positions.append((i, pct_clipped, group)) + fig.text(value_x, center_y, raw_text, ha="left", va="center", fontsize=9.2, color="#111111") chart_top = centers[0] + row_h * 0.50 chart_bottom = centers[-1] - row_h * 0.50 @@ -845,48 +547,23 @@ def _draw_slider_panel( line_ax.axis("off") line_ax.patch.set_alpha(0.0) - def _row_y(idx: int) -> float: - return centers[idx] - marker_w = 0.012 marker_h = max(0.0042, min(0.0070, bar_h * 1.35)) - for idx, pct, group in pct_positions: - y = _row_y(idx) + for (_label, _raw, pct, _units, _group), y in zip(rows, centers): + pct = _clip_pct(pct) + if pct is None: + continue line_ax.add_patch( Rectangle( - (pct - marker_w / 2, y - marker_h / 2), - marker_w, - marker_h, - facecolor="#0b0b0b", - edgecolor="#0b0b0b", - linewidth=0.45, - zorder=6, - clip_on=False, + (pct - marker_w / 2, y - marker_h / 2), marker_w, marker_h, + facecolor=_MARKER, edgecolor=_MARKER, linewidth=0.45, zorder=6, clip_on=False, ) ) # Worse / Better labels directly beneath the bars. wb_y = chart_bottom - 0.011 - fig.text( - bar_x, - wb_y, - "Worse", - ha="left", - va="center", - fontsize=6.8, - fontstyle="italic", - color="#111111", - ) - fig.text( - bar_x + bar_w, - wb_y, - "Better", - ha="right", - va="center", - fontsize=6.8, - fontstyle="italic", - color="#111111", - ) + for wx, text, ha in ((bar_x, "Worse", "left"), (bar_x + bar_w, "Better", "right")): + fig.text(wx, wb_y, text, ha=ha, va="center", fontsize=6.8, fontstyle="italic", color="#111111") legend_y = chart_bottom - 0.045 _draw_percentile_legend(fig, x=bar_x - 0.002, y=legend_y, w=0.55) @@ -908,8 +585,6 @@ def _draw_fixed_table( rows: Sequence[Sequence[str]], col_fracs: Sequence[float], row_height: float = 0.024, - header_color: str = "#efe9d8", - font_size: float = 8.5, ) -> float: """Draw a table anchored at top ``y_top``, growing downward. @@ -918,12 +593,10 @@ def _draw_fixed_table( assert abs(sum(col_fracs) - 1.0) < 1e-6, "col_fracs must sum to 1" + font_size = 8.5 n_rows = len(rows) table_h = row_height * (n_rows + 1) - ax = fig.add_axes((x, y_top - table_h, w, table_h)) - ax.set_xlim(0, 1) - ax.set_ylim(0, 1) - ax.axis("off") + ax = _text_axes(fig, (x, y_top - table_h, w, table_h)) if not rows: ax.text(0.5, 0.5, "no data", ha="center", va="center", fontsize=10, color="#555") return y_top - table_h @@ -931,31 +604,15 @@ def _draw_fixed_table( # Header row at the top of the axes cell_h = 1.0 / (n_rows + 1) header_top = 1.0 - ax.add_patch(Rectangle((0.0, header_top - cell_h), 1.0, cell_h, color=header_color, zorder=1)) + ax.add_patch(Rectangle((0.0, header_top - cell_h), 1.0, cell_h, color="#efe9d8", zorder=1)) x_left = 0.0 for frac, label in zip(col_fracs, headers): ax.add_patch( - Rectangle( - (x_left, header_top - cell_h), - frac, - cell_h, - fill=False, - edgecolor=_TABLE_RULE, - linewidth=0.5, - zorder=2, - ) - ) - ax.text( - x_left + frac / 2, - header_top - cell_h / 2, - label, - ha="center", - va="center", - fontsize=font_size + 0.5, - fontweight="bold", - color="#111111", - transform=ax.transAxes, + Rectangle((x_left, header_top - cell_h), frac, cell_h, + fill=False, edgecolor=_TABLE_RULE, linewidth=0.5, zorder=2) ) + ax.text(x_left + frac / 2, header_top - cell_h / 2, label, ha="center", va="center", + fontsize=font_size + 0.5, fontweight="bold", color="#111111", transform=ax.transAxes) x_left += frac # Approx max characters per column based on width and font size @@ -970,26 +627,12 @@ def _draw_fixed_table( x_left = 0.0 for frac, cell, max_chars in zip(col_fracs, row_vals, max_chars_per_col): ax.add_patch( - Rectangle( - (x_left, cell_bot), - frac, - cell_h, - fill=False, - edgecolor=_TABLE_RULE, - linewidth=0.4, - zorder=2, - ) - ) - ax.text( - x_left + frac / 2, - cell_bot + cell_h / 2, - _truncate(str(cell), max_chars), - ha="center", - va="center", - fontsize=font_size, - color="#1a1a1a", - transform=ax.transAxes, + Rectangle((x_left, cell_bot), frac, cell_h, + fill=False, edgecolor=_TABLE_RULE, linewidth=0.4, zorder=2) ) + ax.text(x_left + frac / 2, cell_bot + cell_h / 2, _truncate(str(cell), max_chars), + ha="center", va="center", fontsize=font_size, color="#1a1a1a", + transform=ax.transAxes) x_left += frac cur_y = cell_bot @@ -1003,216 +646,108 @@ def _draw_fixed_table( def _cover_page( pdf: PdfPages, *, - title: str, subtitle_lines: Sequence[str], - entry_id: str, meta_pairs: Sequence[tuple[str, str]], info_lines: Sequence[str], software_lines: Sequence[tuple[str, str]], - page_no: int, - total: int, ) -> None: fig = _new_figure() # Cover: no running header. Just the report title (no separate logo/wordmark). - title_ax = fig.add_axes((0.07, 0.830, 0.86, 0.060)) - title_ax.axis("off") - title_ax.text( - 0.5, - 0.5, - title, - ha="center", - va="center", - fontsize=22, - fontweight="bold", - color="#101010", - transform=title_ax.transAxes, - ) - - sub_ax = fig.add_axes((0.07, 0.690, 0.86, 0.040)) - sub_ax.axis("off") - sub_ax.text( - 0.5, - 0.5, - " - ".join(subtitle_lines), - ha="center", - va="center", - fontsize=13, - color="#1f1f1f", - transform=sub_ax.transAxes, - ) + _label_axes(fig, (0.07, 0.830, 0.86, 0.060), _REPORT_TITLE, + fontsize=22, fontweight="bold", color="#101010") + _label_axes(fig, (0.07, 0.690, 0.86, 0.040), " - ".join(subtitle_lines), + fontsize=13, color="#1f1f1f") _draw_meta_block(fig, x=0.10, y=0.535, w=0.80, h=0.135, pairs=meta_pairs) _draw_info_box(fig, x=0.09, y=0.350, w=0.82, h=0.135, lines=info_lines) - sw_ax = fig.add_axes((0.10, 0.090, 0.80, 0.210)) - sw_ax.set_xlim(0, 1) - sw_ax.set_ylim(0, 1) - sw_ax.axis("off") - + sw_ax = _text_axes(fig, (0.10, 0.090, 0.80, 0.210)) # Short horizontal rule above the software block, as on the wwPDB cover. sw_ax.plot([0.0, 0.42], [0.98, 0.98], color=_HEADER_RULE, linewidth=0.6, transform=sw_ax.transAxes) - - sw_ax.text( - 0.0, - 0.84, - "The following software and reference data were used in this report:", - fontsize=10, - ha="left", - va="top", - transform=sw_ax.transAxes, - ) - + sw_ax.text(0.0, 0.84, "The following software and reference data were used in this report:", + fontsize=10, ha="left", va="top", transform=sw_ax.transAxes) n = len(software_lines) - if n: - top = 0.66 - line_h = 0.56 / max(1, n - 1) if n > 1 else 0.0 - for i, (k, v) in enumerate(software_lines): - ypos = top - i * line_h - sw_ax.text(0.39, ypos, k, fontsize=10, ha="right", va="top", transform=sw_ax.transAxes) - sw_ax.text(0.415, ypos, ":", fontsize=10, ha="center", va="top", transform=sw_ax.transAxes) - sw_ax.text(0.445, ypos, v, fontsize=10, ha="left", va="top", transform=sw_ax.transAxes) + _kv_rows(sw_ax, software_lines, xs=(0.39, 0.415, 0.445), top=0.66, + line_h=0.56 / (n - 1) if n > 1 else 0.0, fontsize=10) - pdf.savefig(fig) - plt.close(fig) + _save_page(pdf, fig) def _quality_page( pdf: PdfPages, *, - title: str, entry_id: str, section_no: str, section_title: str, pre_lines: Sequence[str], row: Mapping[str, Any], page_no: int, - total: int, - last: bool = False, ) -> None: fig = _new_figure() - _add_page_header(fig, page_no=page_no, total=total, title=title, entry=entry_id) - - _draw_section_heading( - fig, - x=0.07, - y=0.895, - w=0.86, - h=0.045, - number=section_no, - title=section_title, - ) + _add_page_header(fig, page_no=page_no, entry=entry_id) + _draw_section_heading(fig, x=0.07, y=0.895, w=0.86, h=0.045, number=section_no, title=section_title) - intro_ax = fig.add_axes((0.10, 0.810, 0.80, 0.070)) - intro_ax.axis("off") + intro_ax = _text_axes(fig, (0.10, 0.810, 0.80, 0.070)) for i, line in enumerate(pre_lines): - intro_ax.text( - 0.0, - 0.95 - i * 0.32, - line, - fontsize=10, - ha="left", - va="top", - transform=intro_ax.transAxes, - ) - + intro_ax.text(0.0, 0.95 - i * 0.32, line, fontsize=10, ha="left", va="top", + transform=intro_ax.transAxes) intro_ax.text( - 0.0, - 0.05, + 0.0, 0.05, "Percentile scores ranging between 0-100 for AlphaJudge interface metrics are shown in " "the following graphic.", - fontsize=10, - ha="left", - va="bottom", - transform=intro_ax.transAxes, + fontsize=10, ha="left", va="bottom", transform=intro_ax.transAxes, ) _draw_slider_panel(fig, top=0.775, height=0.56, row=row, include_overall=True) + _save_page(pdf, fig) - _add_page_footer(fig, page_no=page_no, total=total, last=last) - pdf.savefig(fig) - plt.close(fig) + +def _raw_cells(row: Mapping[str, Any], columns: Sequence[str]) -> list[str]: + return [_format_raw(_safe_float(row.get(c))) for c in columns] def _per_interface_page( pdf: PdfPages, *, - title: str, entry_id: str, section_no: str, rows: Sequence[Mapping[str, Any]], page_no: int, - total: int, - last: bool = False, ) -> None: fig = _new_figure() - _add_page_header(fig, page_no=page_no, total=total, title=title, entry=entry_id) - _draw_section_heading( - fig, x=0.07, y=0.91, w=0.86, h=0.03, - number=section_no, title="Per-interface raw scores", - ) - - intro_ax = fig.add_axes((0.10, 0.83, 0.80, 0.06)) - intro_ax.axis("off") - intro_ax.text( - 0.0, - 1.0, - "Each row is one chain pair detected by AlphaJudge.", - fontsize=9, - ha="left", - va="top", - transform=intro_ax.transAxes, - ) - intro_ax.text( - 0.0, - 0.55, - "The Meta column is the averaged percentile across the 10 metascore " - "features (higher is better).", - fontsize=9, - ha="left", - va="top", - transform=intro_ax.transAxes, - ) + _add_page_header(fig, page_no=page_no, entry=entry_id) + _draw_section_heading(fig, x=0.07, y=0.91, w=0.86, h=0.03, + number=section_no, title="Per-interface raw scores") + + intro_ax = _text_axes(fig, (0.10, 0.83, 0.80, 0.06)) + for y, line in ( + (1.0, "Each row is one chain pair detected by AlphaJudge."), + (0.55, f"The Meta column is the averaged percentile across the {len(META_SCORE_FEATURES)} " + "metascore features (higher is better)."), + ): + intro_ax.text(0.0, y, line, fontsize=9, ha="left", va="top", transform=intro_ax.transAxes) headers = ["Model", "Interface", "Residues", "Meta", "LIS", "ipSAE", "pDockQ2", "ipTM", "PAE", "Sc"] - sorted_rows = sorted( - rows, - key=lambda r: (_row_meta_score(r) if _row_meta_score(r) is not None else -1.0), - reverse=True, - ) - body: list[list[str]] = [] - for r in sorted_rows: - body.append( - [ - _truncate(str(r.get("model_used") or ""), 26), - str(r.get("interface") or ""), - str(r.get("interface_num_intf_residues") or ""), - _format_raw(_row_meta_score(r)), - _format_raw(_safe_float(r.get("interface_LIS"))), - _format_raw(_safe_float(r.get("interface_ipSAE"))), - _format_raw(_safe_float(r.get("interface_pDockQ2"))), - _format_raw(_safe_float(r.get("iptm"))), - _format_raw(_safe_float(r.get("average_interface_pae"))), - _format_raw(_safe_float(r.get("interface_sc"))), - ] - ) - - col_fracs = [0.18, 0.10, 0.10, 0.08, 0.08, 0.09, 0.10, 0.07, 0.08, 0.12] + raw_columns = ("interface_LIS", "interface_ipSAE", "interface_pDockQ2", "iptm", + "average_interface_pae", "interface_sc") + body = [ + [ + _truncate(str(r.get("model_used") or ""), 26), + str(r.get("interface") or ""), + str(r.get("interface_num_intf_residues") or ""), + _format_raw(_row_meta_score(r)), + *_raw_cells(r, raw_columns), + ] + for r in sorted(rows, key=_meta_sort_key, reverse=True) + ] _draw_fixed_table( - fig, - x=0.07, - y_top=0.78, - w=0.86, - headers=headers, - rows=body, - col_fracs=col_fracs, + fig, x=0.07, y_top=0.78, w=0.86, headers=headers, rows=body, + col_fracs=[0.18, 0.10, 0.10, 0.08, 0.08, 0.09, 0.10, 0.07, 0.08, 0.12], row_height=0.024, ) - - _add_page_footer(fig, page_no=page_no, total=total, last=last) - pdf.savefig(fig) - plt.close(fig) + _save_page(pdf, fig) def _format_residue_tick(value: float, _pos: int | None = None) -> str: @@ -1333,15 +868,12 @@ def render_pae_png( def _complex_evidence_page( pdf: PdfPages, *, - title: str, entry_id: str, section_no: str, row: Mapping[str, Any] | None, pae_path: Path | None, model_label: str, page_no: int, - total: int, - last: bool = False, complex_label: str | None = None, ) -> None: """One end-of-report page that combines: @@ -1352,18 +884,9 @@ def _complex_evidence_page( - The PAE heatmap for the same model (when a PNG is available). """ fig = _new_figure() - _add_page_header(fig, page_no=page_no, total=total, title=title, entry=entry_id) - - _draw_section_heading( - fig, - x=0.07, - y=0.895, - w=0.86, - h=0.045, - number=section_no, - title="Complex-level confidence & PAE", - show_info=False, - ) + _add_page_header(fig, page_no=page_no, entry=entry_id) + _draw_section_heading(fig, x=0.07, y=0.895, w=0.86, h=0.045, + number=section_no, title="Complex-level confidence & PAE") sub_bits: list[str] = [] if complex_label: @@ -1371,18 +894,8 @@ def _complex_evidence_page( if model_label: sub_bits.append(f"Model {model_label}") if sub_bits: - sub_ax = fig.add_axes((0.10, 0.855, 0.80, 0.030)) - sub_ax.axis("off") - sub_ax.text( - 0.5, - 0.5, - " • ".join(sub_bits), - ha="center", - va="center", - fontsize=10, - color="#1f1f1f", - transform=sub_ax.transAxes, - ) + _label_axes(fig, (0.10, 0.855, 0.80, 0.030), " • ".join(sub_bits), + fontsize=10, color="#1f1f1f") # Top half: complex-level slider mini-panel. if row is not None: @@ -1394,34 +907,31 @@ def _complex_evidence_page( include_overall=False, groups=[("complex", _COMPLEX_LEVEL_FEATURES)], ) + if row.get("global_confidence_scope") == SCOPE_INCLUDES_EXCLUDED_TOKENS: + fig.text( + 0.5, 0.615, + "Global AF confidence includes unscored ligand/other tokens.\n" + "Raw values are retained; excluded from percentiles and the metascore.", + ha="center", va="center", fontsize=8, color="#666", + ) # Bottom half: PAE heatmap, or a small inline note if no PNG was found. img_ax = fig.add_axes((0.10, 0.075, 0.80, 0.530)) if pae_path is not None and Path(pae_path).exists(): try: - img = mpimg.imread(str(pae_path)) - img_ax.imshow(img) + img_ax.imshow(mpimg.imread(str(pae_path))) except Exception as e: img_ax.text(0.5, 0.5, f"PAE image unavailable\n({e})", ha="center", va="center", fontsize=10, color="#666") else: - img_ax.text( - 0.5, - 0.5, - "No PAE heatmap available for this model.", - ha="center", - va="center", - fontsize=10, - color="#666", - ) + img_ax.text(0.5, 0.5, "No PAE heatmap available for this model.", + ha="center", va="center", fontsize=10, color="#666") img_ax.set_xticks([]) img_ax.set_yticks([]) for spine in img_ax.spines.values(): spine.set_visible(False) - _add_page_footer(fig, page_no=page_no, total=total, last=last) - pdf.savefig(fig) - plt.close(fig) + _save_page(pdf, fig) # --------------------------------------------------------------------------- @@ -1437,39 +947,13 @@ def _aggregate_cover_page( scores: Sequence[float], top_rows: Sequence[tuple[str, float, Mapping[str, Any]]], backends: Mapping[str, int], - page_no: int, - total: int, ) -> None: fig = _new_figure() - _add_page_header( - fig, page_no=page_no, total=total, - title=_REPORT_TITLE, entry="Aggregate report", - ) - title_ax = fig.add_axes((0.07, 0.87, 0.86, 0.06)) - title_ax.axis("off") - title_ax.text( - 0.5, - 0.5, - _REPORT_TITLE, - fontsize=22, - fontweight="bold", - ha="center", - va="center", - transform=title_ax.transAxes, - ) - sub_ax = fig.add_axes((0.07, 0.835, 0.86, 0.025)) - sub_ax.axis("off") - sub_ax.text( - 0.5, - 0.5, - f"Aggregate report – {n_interfaces} interfaces across {n_complexes} complexes", - ha="center", - va="center", - fontsize=11, - color="#1f1f1f", - transform=sub_ax.transAxes, - ) + _label_axes(fig, (0.07, 0.87, 0.86, 0.06), _REPORT_TITLE, fontsize=22, fontweight="bold") + _label_axes(fig, (0.07, 0.835, 0.86, 0.025), + f"Aggregate report – {n_interfaces} interfaces across {n_complexes} complexes", + fontsize=11, color="#1f1f1f") meta = [ ("Source", _shorten_path(str(summary_csv), max_len=58)), @@ -1497,65 +981,38 @@ def _aggregate_cover_page( hist_ax.set_title("Distribution across cohort", fontsize=10, loc="left") hist_ax.tick_params(labelsize=8) - stats_ax = fig.add_axes((0.64, 0.36, 0.26, 0.14)) - stats_ax.axis("off") + stats_ax = _text_axes(fig, (0.64, 0.36, 0.26, 0.14)) if scores: - median = sorted(scores)[len(scores) // 2] + median = statistics.median(scores) mean = sum(scores) / len(scores) + n_05 = sum(1 for s in scores if s >= 0.5) + n_07 = sum(1 for s in scores if s >= 0.7) stats_ax.text(0.0, 0.95, "Cohort statistics", fontsize=11, fontweight="bold", transform=stats_ax.transAxes) lines = [ f"min = {min(scores):.3f}", f"median = {median:.3f}", f"mean = {mean:.3f}", f"max = {max(scores):.3f}", - f"≥ 0.5 = {sum(1 for s in scores if s >= 0.5)} ({100*sum(1 for s in scores if s >= 0.5)/len(scores):.0f}%)", - f"≥ 0.7 = {sum(1 for s in scores if s >= 0.7)} ({100*sum(1 for s in scores if s >= 0.7)/len(scores):.0f}%)", + f"≥ 0.5 = {n_05} ({100*n_05/len(scores):.0f}%)", + f"≥ 0.7 = {n_07} ({100*n_07/len(scores):.0f}%)", ] for i, line in enumerate(lines): stats_ax.text(0.0, 0.78 - i * 0.12, line, fontsize=10, family="monospace", transform=stats_ax.transAxes) - title2_ax = fig.add_axes((0.07, 0.305, 0.86, 0.020)) - title2_ax.axis("off") - title2_ax.text( - 0.5, - 0.5, - f"Top {len(top_rows)} interfaces by meta score", - ha="center", - va="center", - fontsize=11, - fontweight="bold", - transform=title2_ax.transAxes, - ) + _label_axes(fig, (0.07, 0.305, 0.86, 0.020), f"Top {len(top_rows)} interfaces by meta score", + fontsize=11, fontweight="bold") headers = ["Rank", "Complex / interface", "Meta", "LIS", "ipSAE", "ipTM", "PAE", "Sc"] - body: list[list[str]] = [] - for i, (name, score, row) in enumerate(top_rows, start=1): - body.append( - [ - str(i), - _truncate(name, 34), - _format_raw(score), - _format_raw(_safe_float(row.get("interface_LIS"))), - _format_raw(_safe_float(row.get("interface_ipSAE"))), - _format_raw(_safe_float(row.get("iptm"))), - _format_raw(_safe_float(row.get("average_interface_pae"))), - _format_raw(_safe_float(row.get("interface_sc"))), - ] - ) - col_fracs = [0.07, 0.34, 0.09, 0.09, 0.10, 0.09, 0.10, 0.12] + raw_columns = ("interface_LIS", "interface_ipSAE", "iptm", "average_interface_pae", "interface_sc") + body = [ + [str(i), _truncate(name, 34), _format_raw(score), *_raw_cells(row, raw_columns)] + for i, (name, score, row) in enumerate(top_rows, start=1) + ] _draw_fixed_table( - fig, - x=0.07, - y_top=0.285, - w=0.86, - headers=headers, - rows=body, - col_fracs=col_fracs, + fig, x=0.07, y_top=0.285, w=0.86, headers=headers, rows=body, + col_fracs=[0.07, 0.34, 0.09, 0.09, 0.10, 0.09, 0.10, 0.12], row_height=0.020, ) - - _add_page_footer(fig, page_no=page_no, total=total, last=False) - pdf.savefig(fig) - plt.close(fig) + _save_page(pdf, fig) def _interface_summary_page( @@ -1566,31 +1023,14 @@ def _interface_summary_page( row: Mapping[str, Any], cohort_position: tuple[int, int] | None, page_no: int, - total: int, - last: bool, ) -> None: fig = _new_figure() entry = f"{_truncate(complex_name, 26)} / {interface_label}" - _add_page_header( - fig, page_no=page_no, total=total, - title=_REPORT_TITLE, entry=_truncate(entry, 40), - ) + _add_page_header(fig, page_no=page_no, entry=_truncate(entry, 40)) - title_ax = fig.add_axes((0.07, 0.91, 0.86, 0.05)) - title_ax.axis("off") - title_ax.text( - 0.5, - 0.5, - _truncate(complex_name, 60), - ha="center", - va="center", - fontsize=17, - fontweight="bold", - transform=title_ax.transAxes, - ) + _label_axes(fig, (0.07, 0.91, 0.86, 0.05), _truncate(complex_name, 60), + fontsize=17, fontweight="bold") - sub_ax = fig.add_axes((0.07, 0.875, 0.86, 0.025)) - sub_ax.axis("off") bits = [ f"Interface {interface_label}", f"Model {row.get('model_used', '?')}", @@ -1600,32 +1040,21 @@ def _interface_summary_page( n_res = row.get("interface_num_intf_residues") if n_res: bits.append(f"{n_res} interface residues") - sub_ax.text(0.5, 0.5, " • ".join(bits), ha="center", va="center", fontsize=10, color="#222", transform=sub_ax.transAxes) + _label_axes(fig, (0.07, 0.875, 0.86, 0.025), " • ".join(bits), fontsize=10, color="#222") - _draw_section_heading( - fig, x=0.07, y=0.83, w=0.86, h=0.025, - number="1", title="Overall quality at a glance", - ) + _draw_section_heading(fig, x=0.07, y=0.83, w=0.86, h=0.025, + number="1", title="Overall quality at a glance") _draw_slider_panel(fig, top=0.79, height=0.62, row=row, include_overall=True) - note_ax = fig.add_axes((0.10, 0.07, 0.80, 0.06)) - note_ax.axis("off") + note_ax = _text_axes(fig, (0.10, 0.07, 0.80, 0.06)) note_ax.text( - 0.5, - 1.0, + 0.5, 1.0, "Black marker shows this interface's percentile rank against the AlphaJudge " "interacting (positive) benchmark pairs (higher = better).", - ha="center", - va="top", - fontsize=9, - color="#555", - transform=note_ax.transAxes, + ha="center", va="top", fontsize=9, color="#555", transform=note_ax.transAxes, ) - - _add_page_footer(fig, page_no=page_no, total=total, last=last) - pdf.savefig(fig) - plt.close(fig) + _save_page(pdf, fig) # --------------------------------------------------------------------------- @@ -1635,20 +1064,16 @@ def _interface_summary_page( def _find_pae_png(run_dir: Path, model_used: str) -> Path | None: if not run_dir.is_dir(): return None - candidates = [ - run_dir / f"pae_{model_used}.png", - *run_dir.glob(f"*{model_used}*PAE*plot*.png"), - *run_dir.glob(f"*{model_used}*.png"), - *run_dir.glob("*PAE*plot*ranked_0*.png"), - ] - seen: set[Path] = set() - for cand in candidates: - if cand in seen: - continue - seen.add(cand) - if cand.exists() and cand.is_file(): - return cand - return None + candidates = [] + if model_used: + model = glob.escape(model_used) + candidates += [ + run_dir / f"pae_{model_used}.png", + *run_dir.glob(f"*{model}*PAE*plot*.png"), + *run_dir.glob(f"*{model}*.png"), + ] + candidates += run_dir.glob("*PAE*plot*ranked_0*.png") + return next((c for c in candidates if c.is_file()), None) def generate_per_run_report( @@ -1673,11 +1098,8 @@ def generate_per_run_report( out_pdf = Path(out_pdf) if out_pdf is not None else run_dir / "report.pdf" best = _best_row(rows) - if best is None: - logger.warning("no usable rows in %s; skipping report", interfaces_csv) - return None - by_model: "OrderedDict[str, list[Mapping[str, Any]]]" = OrderedDict() + by_model: dict[str, list[Mapping[str, Any]]] = {} for r in rows: by_model.setdefault(str(r.get("model_used") or ""), []).append(r) best_model = str(best.get("model_used") or "") @@ -1686,24 +1108,10 @@ def generate_per_run_report( pae_path = _find_pae_png(run_dir, best_model) # Pick the best model's rows for the per-interface slider pages; sort by # metascore descending so the strongest interface comes first. - best_model_rows = by_model.get(best_model, list(rows)) - interface_rows = sorted( - best_model_rows, - key=lambda r: (_row_meta_score(r) if _row_meta_score(r) is not None else -1.0), - reverse=True, - ) + interface_rows = sorted(by_model.get(best_model, rows), key=_meta_sort_key, reverse=True) show_interface_table = len(interface_rows) > 1 - total = ( - 1 # cover - + (1 if show_interface_table else 0) # overview table - + len(interface_rows) # one slider page per interface - + 1 # complex-level confidence + PAE evidence - + len(other_models) # non-best-model appendix - ) - entry_id = _truncate(run_dir.name, 36) - chains = _detect_chain_set(rows) backend = _detect_backend(rows) score = _row_meta_score(best) score_label = "n/a" if score is None else f"{score:.3f} ({_decile_label(score)})" @@ -1712,7 +1120,7 @@ def generate_per_run_report( ("Complex", run_dir.name), ("Date", datetime.now().strftime("%Y-%m-%d %H:%M")), ("Backend", backend), - ("Chains", ", ".join(sorted(chains)) or "?"), + ("Chains", ", ".join(sorted(_detect_chain_set(rows))) or "?"), ("Interface rows", str(len(rows))), ("Best model", best_model or "?"), ("Best meta score", score_label), @@ -1726,40 +1134,26 @@ def generate_per_run_report( software_lines: list[tuple[str, str]] = [ ("Reference distribution", _BENCHMARK_TAG), ("Source CSV", _shorten_path(str(interfaces_csv), max_len=62)), - ("Models analysed", _truncate(", ".join(by_model.keys()) or "?", 60)), + ("Models analysed", _truncate(", ".join(by_model) or "?", 60)), ] out_pdf.parent.mkdir(parents=True, exist_ok=True) with PdfPages(str(out_pdf)) as pdf: - page_no = 1 _cover_page( pdf, - title=_REPORT_TITLE, subtitle_lines=[run_dir.name, backend], - entry_id=entry_id, meta_pairs=meta_pairs, info_lines=info_lines, software_lines=software_lines, - page_no=page_no, - total=total, ) + page_no = 1 - next_section = 1 + quality_section_no = 1 if show_interface_table: page_no += 1 - _per_interface_page( - pdf, - title=_REPORT_TITLE, - entry_id=entry_id, - section_no=str(next_section), - rows=rows, - page_no=page_no, - total=total, - last=(page_no == total), - ) - next_section += 1 + _per_interface_page(pdf, entry_id=entry_id, section_no="1", rows=rows, page_no=page_no) + quality_section_no = 2 - quality_section_no = next_section for i, row in enumerate(interface_rows): page_no += 1 iface_label = str(row.get("interface") or "?") @@ -1772,7 +1166,6 @@ def generate_per_run_report( section_no = str(quality_section_no) _quality_page( pdf, - title=_REPORT_TITLE, entry_id=entry_id, section_no=section_no, section_title=section_title, @@ -1782,36 +1175,27 @@ def generate_per_run_report( ], row=row, page_no=page_no, - total=total, - last=(page_no == total), ) - next_section = quality_section_no + 1 page_no += 1 _complex_evidence_page( pdf, - title=_REPORT_TITLE, entry_id=entry_id, - section_no=str(next_section), + section_no=str(quality_section_no + 1), row=best, pae_path=pae_path, model_label=best_model, page_no=page_no, - total=total, - last=(page_no == total), complex_label=run_dir.name, ) - next_section += 1 - for m in other_models: - m_rows = by_model[m] - m_best = _best_row(m_rows) or m_rows[0] + for appendix_no, m in enumerate(other_models, start=1): + m_best = _best_row(by_model[m]) page_no += 1 _quality_page( pdf, - title=_REPORT_TITLE, entry_id=entry_id, - section_no=f"A.{m}", + section_no=f"A.{appendix_no}", section_title=f"Appendix – model {m}", pre_lines=[ f"Interface: {m_best.get('interface', '?')}", @@ -1819,8 +1203,6 @@ def generate_per_run_report( ], row=m_best, page_no=page_no, - total=total, - last=(page_no == total), ) logger.info("wrote %s", out_pdf) @@ -1885,35 +1267,18 @@ def generate_aggregate_report( seen_complex.add(cname) ranked_per_page.append(entry) - # Backends counted per complex (so a multimer doesn't multi-count). - seen_backend: dict[str, str] = {} + # ``ranked`` is sorted by descending metascore, so the first row seen for + # each complex is its best, and complexes appear in best-score order. + best_per_complex: dict[str, Mapping[str, Any]] = {} for _label, cname, _iface, _score, r in ranked: - if cname not in seen_backend: - seen_backend[cname] = _detect_backend([r]) - backends: dict[str, int] = {} - for b in seen_backend.values(): - backends[b] = backends.get(b, 0) + 1 - - scores = [s for _, _, _, s, _ in ranked] - n_complexes = len(seen_backend) - n_interfaces = len(ranked) - - # Pick a best-row per complex for the "Per-complex evidence" section so - # we can render one PAE+complex-level slider page per complex. Limit to - # the same top_n the cover table shows so the aggregate PDF stays bounded. - best_per_complex: "OrderedDict[str, tuple[float, Mapping[str, Any]]]" = OrderedDict() - for _label, cname, _iface, score, r in ranked: - cur = best_per_complex.get(cname) - if cur is None or score > cur[0]: - best_per_complex[cname] = (score, r) - evidence_cap = top_n if max_complexes is None else min(top_n, max_complexes) - complex_evidence = sorted( - best_per_complex.items(), - key=lambda kv: kv[1][0], - reverse=True, - )[:evidence_cap] + best_per_complex.setdefault(cname, r) + # Backends counted per complex (so a multimer doesn't multi-count). + backends = dict(Counter(_detect_backend([r]) for r in best_per_complex.values())) - total = 1 + len(ranked_per_page) + len(complex_evidence) + # One PAE + complex-level slider page per complex, limited to the same + # top_n the cover table shows so the aggregate PDF stays bounded. + evidence_cap = top_n if max_complexes is None else min(top_n, max_complexes) + complex_evidence = list(best_per_complex.items())[:evidence_cap] out_pdf = Path(out_pdf) out_pdf.parent.mkdir(parents=True, exist_ok=True) @@ -1921,13 +1286,11 @@ def generate_aggregate_report( _aggregate_cover_page( pdf, summary_csv=summary_csv, - n_complexes=n_complexes, - n_interfaces=n_interfaces, - scores=scores, + n_complexes=len(best_per_complex), + n_interfaces=len(ranked), + scores=[score for _, _, _, score, _ in ranked], top_rows=top_rows, backends=backends, - page_no=1, - total=total, ) for rank, (_label, cname, iface, _score, r) in enumerate(ranked_per_page, start=1): _interface_summary_page( @@ -1937,29 +1300,20 @@ def generate_aggregate_report( row=r, cohort_position=(rank, len(ranked_per_page)), page_no=1 + rank, - total=total, - last=False, # not last; complex evidence pages follow ) - ev_page = 1 + len(ranked_per_page) - for ev_rank, (cname, (cscore, crow)) in enumerate(complex_evidence, start=1): - ev_page += 1 + for ev_rank, (cname, crow) in enumerate(complex_evidence, start=1): source_dir = str(crow.get("source_dir") or "") model_label = str(crow.get("model_used") or "") - pae_path = None - if source_dir: - pae_path = _find_pae_png(Path(source_dir), model_label) + pae_path = _find_pae_png(Path(source_dir), model_label) if source_dir else None _complex_evidence_page( pdf, - title=_REPORT_TITLE, entry_id=_truncate(cname, 40), section_no=f"{ev_rank}", row=crow, pae_path=pae_path, model_label=model_label, - page_no=ev_page, - total=total, - last=(ev_rank == len(complex_evidence)), + page_no=1 + len(ranked_per_page) + ev_rank, complex_label=cname, ) diff --git a/src/alphajudge/runner.py b/src/alphajudge/runner.py index 9d45b920..9be8331a 100644 --- a/src/alphajudge/runner.py +++ b/src/alphajudge/runner.py @@ -5,56 +5,75 @@ import logging import os from concurrent.futures import ProcessPoolExecutor, as_completed - -import matplotlib - -matplotlib.use("Agg") -import matplotlib.pyplot as plt -import numpy as np +from functools import partial from .parsers import pick_parser from .complex import Complex +from .confidence import IPTM_SCOPE_CHAIN_PAIR, IPTM_SCOPE_GLOBAL from .meta_score import interface_meta_score -from .report import render_pae_png +from .report import generate_per_run_report, render_pae_png logger = logging.getLogger(__name__) # Cached per-run CSVs from older releases are safe to reuse only when they # contain every field introduced by the current output contract. -_REQUIRED_CACHE_COLUMNS = frozenset({"interface_ccc", "interface_expected_contacts"}) - - -def _save_pae_heatmap( - pae_matrix, - out_file: Path, - chain_boundaries: list[float] | None = None, - figsize: tuple[int, int] = (8, 8), - model_label: str | None = None, -) -> None: - """ - Save a PAE heatmap PNG for a given residue×residue PAE matrix. - - Uses ``alphajudge.report.render_pae_png`` so the standalone PNG matches - the in-report PAE page exactly (AlphaFold-DB-like green palette, horizontal - "Expected position error (Å)" colour bar, Scored/Aligned residue axes). - - Optionally draws thin grey separator lines at positions provided in - ``chain_boundaries`` (between different chains). - """ - if pae_matrix is None: - return - try: - render_pae_png( - out_file, - pae_matrix, - model_label=model_label, - chain_boundaries=chain_boundaries, - figsize=figsize, - ) - logger.info(f"wrote {out_file}") - except Exception as e: - logger.error(f"Could not create PAE heatmap {out_file}: {e}") +_REQUIRED_CACHE_COLUMNS = frozenset({ + "interface_ccc", "interface_expected_contacts", "global_confidence_scope", "iptm_scope", +}) + + +def _float_or_nan(value) -> float: + return float(value) if value is not None else float("nan") + + +def _interface_row( + job: str, model: str, iface, confidence, global_score: float, skip_biophysical_scores: bool +) -> dict: + """One output CSV row for a scored interface.""" + pd2, _ = iface.pDockQ2() + pair_iptm = iface.iptm_chainpair + row = { + "jobs": job, + "model_used": model, + "interface": iface.label, + "global_confidence_scope": confidence.global_confidence_scope, + "iptm_scope": IPTM_SCOPE_CHAIN_PAIR if pair_iptm is not None else IPTM_SCOPE_GLOBAL, + "iptm_ptm": _float_or_nan(confidence.iptm_ptm), + "iptm": _float_or_nan(pair_iptm if pair_iptm is not None else confidence.iptm), + "ptm": _float_or_nan(confidence.ptm), + "confidence_score": _float_or_nan(confidence.confidence_score), + "pDockQ/mpDockQ": global_score, + "average_interface_pae": iface.average_interface_pae, + "interface_average_plddt": iface.average_interface_plddt, + "interface_num_intf_residues": iface.num_intf_residues, + "interface_polar": iface.polar, + "interface_hydrophobic": iface.hydrophobic, + "interface_charged": iface.charged, + "interface_contact_pairs": iface.contact_pairs, + "interface_contact_prob_source": confidence.contact_prob_source or "", + "interface_contact_prob_max": iface.contact_prob_max, + "interface_contact_prob_top10_mean": iface.contact_prob_top10_mean, + "interface_expected_contacts": iface.expected_contacts, + "interface_ccc": iface.ccc, + "interface_score": iface.score_complex, + "interface_pDockQ2": pd2, + "interface_ipSAE": iface.ipsae(), + "interface_LIS": iface.lis(), + "interface_cLIS": iface.clis(), + "interface_iLIS": iface.ilis(), + } + if not skip_biophysical_scores: + row.update({ + "interface_hb": iface.hb, + "interface_sb": iface.sb, + "interface_ss": iface.ss, + "interface_sc": iface.sc, + "interface_area": iface.int_area, + "interface_solv_en": iface.int_solv_en, + }) + row["interface_meta_score"] = interface_meta_score(row) + return row def process( @@ -67,11 +86,11 @@ def process( per_run_csv_name: str = "interfaces.csv", skip_pae_png: bool = False, skip_biophysical_scores: bool = False, -) -> Path | None: +) -> Path: d = Path(directory) parser = pick_parser(d) run = parser.parse_run(d) - models = [run.order[0]] if models_to_analyse == "best" else run.order + models = run.order[:1] if models_to_analyse == "best" else run.order job = d.resolve().name rows: list[dict] = [] @@ -98,87 +117,29 @@ def process( if iface.average_interface_pae > pae_filter: dropped_by_pae += 1 continue - pd2, _ = iface.pDockQ2() - label = ( - f"{iface.chain1[0].get_parent().id}_{iface.chain2[0].get_parent().id}" + rows.append( + _interface_row(job, m, iface, confidence, global_score, skip_biophysical_scores) ) - iptm_val = iface.iptm_chainpair if iface.iptm_chainpair is not None else confidence.iptm - row = { - "jobs": job, - "model_used": m, - "interface": label, - "iptm_ptm": float(confidence.iptm_ptm) - if confidence.iptm_ptm is not None - else float("nan"), - "iptm": float(iptm_val) if iptm_val is not None else float("nan"), - "ptm": float(confidence.ptm) - if confidence.ptm is not None - else float("nan"), - "confidence_score": float(confidence.confidence_score) - if confidence.confidence_score is not None - else float("nan"), - "pDockQ/mpDockQ": global_score, - "average_interface_pae": iface.average_interface_pae, - "interface_average_plddt": iface.average_interface_plddt, - "interface_num_intf_residues": iface.num_intf_residues, - "interface_polar": iface.polar, - "interface_hydrophobic": iface.hydrophobic, - "interface_charged": iface.charged, - "interface_contact_pairs": iface.contact_pairs, - "interface_contact_prob_source": confidence.contact_prob_source or "", - "interface_contact_prob_max": iface.contact_prob_max, - "interface_contact_prob_top10_mean": iface.contact_prob_top10_mean, - "interface_expected_contacts": iface.expected_contacts, - "interface_ccc": iface.ccc, - "interface_score": iface.score_complex, - "interface_pDockQ2": pd2, - "interface_ipSAE": iface.ipsae(), - "interface_LIS": iface.lis(), - "interface_cLIS": iface.clis(), - "interface_iLIS": iface.ilis(), - } - - # Add expensive metrics only if not skipped - if not skip_biophysical_scores: - row.update({ - "interface_hb": iface.hb, - "interface_sb": iface.sb, - "interface_ss": iface.ss, - "interface_sc": iface.sc, - "interface_area": iface.int_area, - "interface_solv_en": iface.int_solv_en, - }) - - row["interface_meta_score"] = interface_meta_score(row) - rows.append(row) - - # Compute chain boundaries for separator lines on PAE heatmap - chain_boundaries: list[float] = [] - try: - idx_lists = [ - idxs - for idxs in comp._chain_indices_by_id.values() # type: ignore[attr-defined] - if idxs - ] - if idx_lists: - sorted_bounds = sorted(max(idxs) + 0.5 for idxs in idx_lists) - chain_boundaries = sorted_bounds[:-1] if len(sorted_bounds) > 1 else [] - except Exception: - chain_boundaries = [] if not skip_pae_png: pae_png = d / f"pae_{m}.png" - _save_pae_heatmap( - confidence.pae_matrix, pae_png, chain_boundaries=chain_boundaries - ) + try: + render_pae_png( + pae_png, + confidence.pae_matrix, + chain_boundaries=comp.chain_boundaries, + figsize=(8, 8), + ) + logger.info(f"wrote {pae_png}") + except Exception as e: + logger.error(f"Could not create PAE heatmap {pae_png}: {e}") logger.info(f"processed model: {m} via {parser.name}") except Exception as e: logger.error(f"error processing model {m}: {e}") out = d / per_run_csv_name - out.parent.mkdir(parents=True, exist_ok=True) - + out.parent.mkdir(parents=True, exist_ok=True) # per_run_csv_name may hold a subdir if not rows: # Explain *why* the CSV is empty instead of writing a silent zero-byte file # (see https://github.com/KosinskiLab/AlphaJudge/issues/17). The common case @@ -203,34 +164,29 @@ def process( with out.open("w", newline="") as f: if rows: - w = csv.DictWriter(f, fieldnames=list(rows[0].keys())) + w = csv.DictWriter(f, fieldnames=list(rows[0])) w.writeheader() w.writerows(rows) - else: - f.write("") logger.info(f"wrote {out}") return out -def _discover_run_dirs(root: Path) -> list[Path]: - """Walk a directory tree and collect directories that look like supported runs.""" - results: list[Path] = [] - - # include root too (rglob doesn't include it) - candidates = [root] if root.is_dir() else [] - if root.is_dir(): - candidates.extend([p for p in root.rglob("*") if p.is_dir()]) +def _is_run_dir(d: Path) -> bool: + try: + pick_parser(d) + except Exception: + return False + return True - for d in candidates: - try: - pick_parser(d) # raises if not supported - results.append(d) - except Exception: - continue - # De-dupe + stable sort (shallow first) - uniq = sorted(set(p.resolve() for p in results), key=lambda p: (len(p.parts), str(p))) - return [Path(p) for p in uniq] +def _discover_run_dirs(root: Path) -> list[Path]: + """Walk a directory tree and collect directories that look like supported runs.""" + if not root.is_dir(): + return [] + candidates = [root, *(p for p in root.rglob("*") if p.is_dir())] + runs = {p.resolve() for p in candidates if _is_run_dir(p)} + # Stable order, shallow first + return sorted(runs, key=lambda p: (len(p.parts), str(p))) def _read_csv_rows(path: Path) -> list[dict]: @@ -269,71 +225,65 @@ def _process_one_run( write_per_run_report: bool = False, ) -> tuple[str, list[dict]]: """ - Worker: process a single run dir (or reuse interfaces.csv) and optionally return rows for aggregation. - Returns (run_dir, rows_for_summary). + Worker: process a single run dir (or reuse its per-run CSV) and return + (run_dir, rows_for_summary); rows are only collected when summary_csv is set. """ d = Path(d_str) - existing_csv = d / per_run_csv_name - - want_summary = summary_csv is not None - - source_dir = str(d.resolve()) - - def _stamp(rows: list[dict]) -> list[dict]: - """Add an absolute ``source_dir`` to every row so the aggregate report - can locate per-run side files (PAE PNGs, etc.) from the summary CSV.""" - for r in rows: - r.setdefault("source_dir", source_dir) - return rows + csv_path = d / per_run_csv_name # Reuse a precomputed CSV only if its header satisfies the current output # contract. This prevents an upgrade from silently aggregating stale rows. - if existing_csv.exists() and not force_recompute: + rows = None + if csv_path.exists() and not force_recompute: try: - rows = _read_reusable_csv(existing_csv) - if rows is not None: - if want_summary: - logger.info(f"reused existing {existing_csv} for aggregation") - else: - logger.info(f"reused existing {existing_csv}; skipping recompute") - if write_per_run_report: - _safe_write_per_run_report(d, csv_name=per_run_csv_name) - return (d_str, _stamp(rows) if want_summary else []) + rows = _read_reusable_csv(csv_path) except Exception as e: - logger.warning(f"could not reuse {existing_csv}; recomputing: {e}") - - out_path = process( - d_str, - contact_thresh, - pae_filter, - models_to_analyse, - ipsae_pae_cutoff, - per_run_csv_name=per_run_csv_name, - skip_pae_png=skip_pae_png, - skip_biophysical_scores=skip_biophysical_scores, - ) + logger.warning(f"could not reuse {csv_path}; recomputing: {e}") + if rows is not None and summary_csv is not None: + logger.info(f"reused existing {csv_path} for aggregation") + elif rows is not None: + logger.info(f"reused existing {csv_path}; skipping recompute") + + if rows is None: + csv_path = process( + d_str, + contact_thresh, + pae_filter, + models_to_analyse, + ipsae_pae_cutoff, + per_run_csv_name=per_run_csv_name, + skip_pae_png=skip_pae_png, + skip_biophysical_scores=skip_biophysical_scores, + ) - if write_per_run_report and out_path is not None: - _safe_write_per_run_report(d, csv_name=per_run_csv_name) + if write_per_run_report: + try: + generate_per_run_report(d, csv_name=per_run_csv_name) + except Exception as e: # pragma: no cover - defensive + logger.warning(f"per-run report failed for {d}: {e}") - if want_summary and out_path is not None: + if summary_csv is None: + return d_str, [] + if rows is None: try: - return (d_str, _stamp(_read_csv_rows(Path(out_path)))) + rows = _read_csv_rows(csv_path) except Exception as e: - logger.error(f"failed reading {out_path} for aggregation: {e}") - - return (d_str, []) + logger.error(f"failed reading {csv_path} for aggregation: {e}") + return d_str, [] + # Absolute source_dir lets the aggregate report locate per-run side files + # (PAE PNGs, etc.) from the summary CSV. + source_dir = str(d.resolve()) + for r in rows: + r.setdefault("source_dir", source_dir) + return d_str, rows -def _safe_write_per_run_report(run_dir: Path, *, csv_name: str = "interfaces.csv") -> None: - """Generate report.pdf next to the per-run CSV, swallowing import/runtime errors.""" +def _iptm_sort_key(row: dict) -> float: try: - # Import here so a missing matplotlib backend, etc., never blocks scoring. - from .report import generate_per_run_report - - generate_per_run_report(run_dir, csv_name=csv_name) - except Exception as e: # pragma: no cover - defensive - logger.warning(f"per-run report failed for {run_dir}: {e}") + val = float(row.get("iptm")) + except (TypeError, ValueError): + return float("-inf") + return val if val == val else float("-inf") # NaN -> -inf def process_many( @@ -365,137 +315,77 @@ def process_many( logger.warning("no input paths provided") return None - # Resolve set of run directories to process - run_dirs: list[Path] = [] + # Resolve set of run directories to process (dict keeps first-seen order) + run_dirs: dict[Path, None] = {} for p in paths: rp = Path(p).resolve() if not rp.exists(): logger.warning(f"path does not exist: {rp}") - continue - - if recursive and rp.is_dir(): - run_dirs.extend(_discover_run_dirs(rp)) - continue - - # Try direct path as a run directory - try: - pick_parser(rp) - run_dirs.append(rp) - except Exception: + elif recursive and rp.is_dir(): + run_dirs.update(dict.fromkeys(_discover_run_dirs(rp))) + elif _is_run_dir(rp): + run_dirs[rp] = None + else: logger.warning( f"no supported run detected at {rp} (use --recursive to search within)" ) - # Deduplicate - seen: set[Path] = set() - unique_run_dirs: list[Path] = [] - for d in run_dirs: - r = d.resolve() - if r not in seen: - seen.add(r) - unique_run_dirs.append(d) - - if not unique_run_dirs: + if not run_dirs: logger.warning("no runnable directories found") return None - # Normalize cores if cores <= 0: cores = os.cpu_count() or 1 - if cores > len(unique_run_dirs): - cores = len(unique_run_dirs) - + cores = min(cores, len(run_dirs)) + + worker = partial( + _process_one_run, + contact_thresh=contact_thresh, + pae_filter=pae_filter, + models_to_analyse=models_to_analyse, + summary_csv=summary_csv, + ipsae_pae_cutoff=ipsae_pae_cutoff, + force_recompute=force_recompute, + per_run_csv_name=per_run_csv_name, + skip_pae_png=skip_pae_png, + skip_biophysical_scores=skip_biophysical_scores, + write_per_run_report=write_per_run_report, + ) aggregated_rows: list[dict] = [] - logger.info(f"Processing {len(unique_run_dirs)} runs with {cores} cores") - # Serial + logger.info(f"Processing {len(run_dirs)} runs with {cores} cores") if cores == 1: - for d in unique_run_dirs: + for d in run_dirs: try: - _, rows = _process_one_run( - str(d), - contact_thresh, - pae_filter, - models_to_analyse, - summary_csv, - ipsae_pae_cutoff, - force_recompute, - per_run_csv_name, - skip_pae_png, - skip_biophysical_scores, - write_per_run_report, - ) - if summary_csv and rows: - aggregated_rows.extend(rows) + aggregated_rows.extend(worker(str(d))[1]) except Exception as e: logger.error(f"failed processing {d}: {e}") - - # Parallel else: # Important: logging from multiple processes can interleave; acceptable. with ProcessPoolExecutor(max_workers=cores) as ex: - futures = [ - ex.submit( - _process_one_run, - str(d), - contact_thresh, - pae_filter, - models_to_analyse, - summary_csv, - ipsae_pae_cutoff, - force_recompute, - per_run_csv_name, - skip_pae_png, - skip_biophysical_scores, - write_per_run_report, - ) - for d in unique_run_dirs - ] - for fut in as_completed(futures): + for fut in as_completed([ex.submit(worker, str(d)) for d in run_dirs]): try: - _, rows = fut.result() - if summary_csv and rows: - aggregated_rows.extend(rows) + aggregated_rows.extend(fut.result()[1]) except Exception as e: logger.error(f"worker failed: {e}") - if summary_csv: - if not aggregated_rows: - logger.info("no rows to write to summary; skipping creation") - return None - - # Compute union of all keys to accommodate AF2/AF3 variations - fieldnames: list[str] = [] - seen_fields: set[str] = set() - for row in aggregated_rows: - for k in row.keys(): - if k not in seen_fields: - seen_fields.add(k) - fieldnames.append(k) - - def _iptm_sort_key(row: dict) -> float: - v = row.get("iptm") - if v is None or v == "": - return float("-inf") - try: - val = float(v) - except Exception: - return float("-inf") - return val if val == val else float("-inf") # NaN -> -inf - - aggregated_rows = sorted(aggregated_rows, key=_iptm_sort_key, reverse=True) + if not summary_csv: + return None + if not aggregated_rows: + logger.info("no rows to write to summary; skipping creation") + return None - summary_path = Path(summary_csv).resolve() - summary_path.parent.mkdir(parents=True, exist_ok=True) + # Union of all keys to accommodate AF2/AF3 variations + fieldnames = list(dict.fromkeys(k for row in aggregated_rows for k in row)) + aggregated_rows.sort(key=_iptm_sort_key, reverse=True) - with summary_path.open("w", newline="") as f: - w = csv.DictWriter(f, fieldnames=fieldnames) - w.writeheader() - for row in aggregated_rows: - w.writerow({k: row.get(k, "") for k in fieldnames}) + summary_path = Path(summary_csv).resolve() + summary_path.parent.mkdir(parents=True, exist_ok=True) + with summary_path.open("w", newline="") as f: + w = csv.DictWriter(f, fieldnames=fieldnames, restval="") + w.writeheader() + w.writerows(aggregated_rows) - logger.info( - f"wrote summary {summary_path} ({len(aggregated_rows)} rows from {len(unique_run_dirs)} runs)" - ) - return summary_path - - return None + logger.info( + f"wrote summary {summary_path} ({len(aggregated_rows)} rows from {len(run_dirs)} runs)" + ) + return summary_path diff --git a/test/fixtures/af3x_4g3y_bc_dsso/README.md b/test/fixtures/af3x_4g3y_bc_dsso/README.md new file mode 100644 index 00000000..3f930449 --- /dev/null +++ b/test/fixtures/af3x_4g3y_bc_dsso/README.md @@ -0,0 +1,25 @@ +# Real AF3x crosslink prediction + +Generated by AF3x inference for AlphaJudge issue #30 from the 4G3Y input. + +Input preparation: retain the complete B (226 residues) and C (158 residues) +protein entries, including their supplied MSAs/templates; retain one DSSO link +between B53 and C66; set `modelSeeds` to `[30]` and the job name to +`alphajudge_issue30_4g3y_bc_dsso`. Other input fields are unchanged. + +Run with the AF3x revision recorded in `provenance.json`: + +```bash +python run_alphafold.py --json_path=input.json --model_dir=MODEL_DIR \ + --output_dir=prediction --norun_data_pipeline \ + --num_recycles=1 --num_diffusion_samples=1 +``` + +The single seed/sample is retained here in AlphaJudge's supported unprefixed +layout. `confidences.json.xz` is a lossless compression of the original complete +confidence JSON. Structure and summary bytes are unchanged. Source hashes, +token counts and inference settings are recorded in `provenance.json`. + +This small one-recycle run is a parser/scoring regression fixture, not a +benchmark of AF3x prediction quality. Tests also reorder its original token +matrices and chain summary consistently to exercise ligand-first indexing. diff --git a/test/fixtures/af3x_4g3y_bc_dsso/TERMS_OF_USE.md b/test/fixtures/af3x_4g3y_bc_dsso/TERMS_OF_USE.md new file mode 100644 index 00000000..01ea9304 --- /dev/null +++ b/test/fixtures/af3x_4g3y_bc_dsso/TERMS_OF_USE.md @@ -0,0 +1,246 @@ +# ALPHAFOLD 3 OUTPUT TERMS OF USE + +Last Modified: 2024-11-09 + +By using AlphaFold 3 Output (as defined below), without having agreed to +[AlphaFold 3 Model Parameters Terms of Use](https://github.com/google-deepmind/alphafold3/blob/main/WEIGHTS_TERMS_OF_USE.md), +you agree to be bound by these AlphaFold 3 Output Terms of Use between you (or +your organization, as applicable) and Google LLC (these "**Terms**"). + +If you are using Output on behalf of an organization, you confirm you are +authorized either explicitly or implicitly to agree to, and are agreeing to, +these Terms as an employee on behalf of, or otherwise on behalf of, your +organization. + +If you have agreed to +[AlphaFold 3 Model Parameters Terms of Use](https://github.com/google-deepmind/alphafold3/blob/main/WEIGHTS_TERMS_OF_USE.md), +your use of Output are governed by those terms. **If you have not agreed to +[AlphaFold 3 Model Parameters Terms of Use](https://github.com/google-deepmind/alphafold3/blob/main/WEIGHTS_TERMS_OF_USE.md) +and do not agree to these Terms, do not use Output or permit any third party to +do so on your behalf.** + +When we say "**you**", we mean the individual or organization using Output. When +we say "**we**", "**us**" or "**Google**", we mean the entities that belong to +the Google group of companies, which means Google LLC and its affiliates. + +## Key Definitions + +As used in these Terms: + +"**AlphaFold 3**" means the AlphaFold 3 Code and Model Parameters. + +"**AlphaFold 3 Code**" means the AlphaFold 3 source code: (a) identified at +[public GitHub repo](https://github.com/google-deepmind/alphafold3/), or such +other location in which we may make it available from time to time, regardless +of the source that it was obtained from; and (b) made available by Google to +organizations for their use in accordance with the +[AlphaFold 3 Model Parameters Terms of Use](https://github.com/google-deepmind/alphafold3/blob/main/WEIGHTS_TERMS_OF_USE.md) +(not these Terms) together with (i) modifications to that code, (ii) works based +on that code, or (iii) other code or machine learning model which incorporates, +in full or in part, that code. + +"**Model Parameters**" means the trained model weights and parameters made +available by Google to organizations (at its sole discretion) for their use in +accordance with the +[AlphaFold 3 Model Parameters Terms of Use](https://github.com/google-deepmind/alphafold3/blob/main/WEIGHTS_TERMS_OF_USE.md) +(not these Terms), together with (a) modifications to those weights and +parameters, (b) works based on those weights and parameters, or (c) other code +or machine learning model which incorporates, in full or in part, those weights +and parameters. + +"**Output**" means the structure predictions and all related information +provided by AlphaFold 3, together with any visual representations, computational +predictions, descriptions, modifications, copies, or adaptations that are +substantially derived from Output. + +## Use restrictions + +[AlphaFold 3](https://blog.google/technology/ai/google-deepmind-isomorphic-alphafold-3-ai-model/) +belongs to us. Output are made available free of charge, for non-commercial use +only, in accordance with the following use restrictions. You must not use nor +allow others to use Output: + +1. **On behalf of a commercial organization or in connection with any + commercial activities, including research on behalf of commercial + organizations.** + + 1. This means that only non-commercial organizations (*i.e.*, universities, + non-profit organizations and research institutes, educational, + journalism and government bodies) may use Output for their + non-commercial activities. Output are not available for use by any other + types of organization, even if conducting non-commercial work. + + 2. If you are a researcher affiliated with a non-commercial organization, + provided **you are not a commercial organisation or acting on behalf of + a commercial organisation**, you can use Output for your non-commercial + affiliated research. + + 3. You must not share Output with any commercial organization. The only + exception is making Output publicly available (including, indirectly, to + commercial organizations) via a scientific publication or open source + release or using these to support journalism, each of which are + permitted. + +2. **To misinform, misrepresent or mislead**, including: + + 1. providing false or inaccurate information in relation to your access to + or use of Output; + + 2. misrepresenting your relationship with Google - including by using + Google’s trademarks, trade names, logos or suggesting endorsement by + Google without Google’s permission to do so - nothing in these Terms + grants such permission; + + 3. misrepresenting the origin of Output; + + 4. distributing misleading claims of expertise or capability, or engaging + in the unauthorized or unlicensed practice of any profession, + particularly in sensitive areas (*e.g.*, health); or + + 5. making decisions in domains that affect material or individual rights or + well-being (*e.g.*, healthcare). + +3. **To perform, promote or facilitate dangerous, illegal or malicious + activities**, including: + + 1. promoting or facilitating the sale of, or providing instructions for + synthesizing or accessing, illegal substances, goods or services; + + 2. abusing, harming, interfering, or disrupting any services, including + generating or distributing content for deceptive or fraudulent + activities or malware; + + 3. generating or distributing any content that infringes, misappropriates, + or otherwise violates any individual’s or entity’s rights (including, + but not limited to rights in copyrighted content); or + + 4. attempting to circumvent these Terms. + +4. **To train or create machine learning models or related technology for + biomolecular structure prediction similar to AlphaFold 3 as made available + by Google ("Derived Models"),** including via distillation or other + methods**.** For the avoidance of doubt, the use restrictions set out in + these Terms would apply in full to any Derived Models created in breach of + these Terms. + +5. **Without providing conspicuous notice that published or distributed Output + is provided under and subject to these Terms and of any modifications you + make to Output.** + + 1. This means if you remove, or cause to be removed (for example by using + third-party software), these Terms, or any notice of these Terms, from + Output, you must ensure further distribution or publication is + accompanied by a copy of the + [AlphaFold 3 Output Terms of Use](https://github.com/google-deepmind/alphafold3/blob/main/OUTPUT_TERMS_OF_USE.md) + and a "*Legally Binding Terms of Use*" text file that contains the + following notice: + + "*By using this information, you agree to AlphaFold 3 Output Terms of + Use found at + https://github.com/google-deepmind/alphafold3/blob/main/OUTPUT_TERMS_OF_USE.md.* + + *To request access to the AlphaFold 3 model parameters, follow the + process set out at https://github.com/google-deepmind/alphafold3. You + may only use these if received directly from Google. Use is subject to + terms of use available at + https://github.com/google-deepmind/alphafold3/blob/main/WEIGHTS_TERMS_OF_USE.md.*" + + 2. You must not include any additional or different terms that conflict + with the + [AlphaFold 3 Output Terms of Use](https://github.com/google-deepmind/alphafold3/blob/main/OUTPUT_TERMS_OF_USE.md). + +6. **Distribute Output, or disclose findings arising from using AlphaFold 3 + without citing our paper:** [Abramson, J et al. Accurate structure + prediction of biomolecular interactions with AlphaFold 3. *Nature* + (2024)](https://www.nature.com/articles/s41586-024-07487-w). For the + avoidance of doubt, this is an additional requirement to the notice + requirements set out above. + +We grant you a non-exclusive, royalty-free, revocable, non-transferable and +non-sublicensable (except as expressly permitted in these Terms) license to any +intellectual property rights we have in Output to the extent necessary for these +purposes. You agree that your right to use and share Output is subject to your +compliance with these Terms. If you breach these Terms, Google reserves the +right to request that you delete and cease use or sharing of Output in your +possession or control and prohibit you from using the AlphaFold 3 Assets +(including as made available via +[AlphaFold Server](https://alphafoldserver.com/about)). You agree to immediately +comply with any such request. + +## Disclaimers + +Nothing in these Terms restricts any rights that cannot be restricted under +applicable law or limits Google’s responsibilities except as allowed by +applicable law. + +**Output are provided on an "as is" basis, without warranties or conditions of +any kind, either express or implied, including any warranties or conditions of +title, non-infringement, merchantability, or fitness for a particular purpose. +You are solely responsible for determining the appropriateness of using or +distributing any of the Output and assume any and all risks associated with your +use or distribution of any Output and your exercise of rights and obligations +under these Terms. You and anyone you share Output with are solely responsible +for these and their subsequent uses.** + +**Output are predictions with varying levels of confidence and should be +interpreted carefully. Use discretion before relying on, publishing, downloading +or otherwise using Output.** + +**Output are for theoretical modeling only. These are not intended, validated, +or approved for clinical use. You should not use these for clinical purposes or +rely on them for medical or other professional advice. Any content regarding +those topics is provided for informational purposes only and is not a substitute +for advice from a qualified professional.** + +## Liabilities + +To the extent allowed by applicable law, you will indemnify Google and its +directors, officers, employees, and contractors for any third-party legal +proceedings (including actions by government authorities) arising out of or +relating to your unlawful use of Output or violation of these Terms. This +indemnity covers any liability or expense arising from claims, losses, damages, +judgments, fines, litigation costs, and legal fees, except to the extent a +liability or expense is caused by Google's breach, negligence, or willful +misconduct. If you are legally exempt from certain responsibilities, including +indemnification, then those responsibilities don’t apply to you under these +terms. + +In no circumstances will Google be responsible for any indirect, special, +incidental, exemplary, consequential, or punitive damages, or lost profits of +any kind, even if Google has been advised of the possibility of such damages. +Google’s total, aggregate liability for all claims arising out of or in +connection with these Terms or Output, including for its own negligence, is +limited to $500. + +## Governing law and disputes + +These Terms will be governed by the laws of the State of California. The state +or federal courts of Santa Clara County, California shall have exclusive +jurisdiction of any dispute arising out of these Terms. + +Given the nature of scientific research, it may take some time for any breach of +these Terms to become apparent. To the extent allowed by applicable law, any +legal claims relating to these Terms or Output can be initiated until the later +of (a) the cut-off date under applicable law for bringing the legal claim; or +(b) two years from the date you or Google (as applicable) became aware, or +should reasonably have become aware, of the facts giving rise to that claim. You +will not argue limitation, time bar, delay, waiver or the like in an attempt to +bar an action filed within that time period, and neither will we. + +All rights not specifically and expressly granted to you by these Terms are +reserved to Google. No delay, act or omission by Google in exercising any right +or remedy will be deemed a waiver of any breach of these Terms and Google +expressly reserves any and all rights and remedies available under these Terms +or at law or in equity or otherwise, including the remedy of injunctive relief +against any threatened or actual breach of these Terms without the necessity of +proving actual damages. + +## Miscellaneous + +Google may update these Terms (1) to reflect changes in how it does business, +(2) for legal, regulatory or security reasons, or (3) to prevent abuse or harm. +The version of these Terms that were effective on the date the relevant Output +was generated will apply to your use of that Output. + +If it turns out that a particular provision of these Terms is not valid or +enforceable, this will not affect any other provisions. diff --git a/test/fixtures/af3x_4g3y_bc_dsso/provenance.json b/test/fixtures/af3x_4g3y_bc_dsso/provenance.json new file mode 100644 index 00000000..4237c5d3 --- /dev/null +++ b/test/fixtures/af3x_4g3y_bc_dsso/provenance.json @@ -0,0 +1,37 @@ +{ + "af3x_commit": "374cb352936e57a27ad43bea7fa191e81d78dc7d", + "input_source": "af3x/src/alphafold3/test_data/crosslinks/4G3Y/4g3y_input.json", + "input_sha256": "4165a0943457de619e25907d77c5f30640337dd48614effdc484b0ebfd5075e4", + "chains": { + "B": 226, + "C": 158 + }, + "crosslinks": [ + { + "name": "DSSO", + "residue_pairs": [ + [ + [ + "B", + 53 + ], + [ + "C", + 66 + ] + ] + ] + } + ], + "model_seed": 30, + "num_recycles": 1, + "num_diffusion_samples": 1, + "run_data_pipeline": false, + "total_tokens": 394, + "scored_residues": 384, + "source_sha256": { + "model.cif": "a2aa7857af980b287c72058dfe22050021716592d439e06f6361b0aea86113ee", + "summary_confidences.json": "39afefd0416a978800ccd8c77bc9858f3aa34d49574e7f742522202127f1fdad", + "confidences.json": "271457ef85ab6b07e58ee2b906ee64fd11056e59351934f1f516d2c02782ac49" + } +} diff --git a/test/fixtures/af3x_4g3y_bc_dsso/ranking_scores.csv b/test/fixtures/af3x_4g3y_bc_dsso/ranking_scores.csv new file mode 100644 index 00000000..78f77653 --- /dev/null +++ b/test/fixtures/af3x_4g3y_bc_dsso/ranking_scores.csv @@ -0,0 +1,2 @@ +seed,sample,ranking_score +30,0,0.36425535986162083 diff --git a/test/fixtures/af3x_4g3y_bc_dsso/seed-30_sample-0/confidences.json.xz b/test/fixtures/af3x_4g3y_bc_dsso/seed-30_sample-0/confidences.json.xz new file mode 100644 index 00000000..c5daf22a Binary files /dev/null and b/test/fixtures/af3x_4g3y_bc_dsso/seed-30_sample-0/confidences.json.xz differ diff --git a/test/fixtures/af3x_4g3y_bc_dsso/seed-30_sample-0/model.cif b/test/fixtures/af3x_4g3y_bc_dsso/seed-30_sample-0/model.cif new file mode 100644 index 00000000..64567b58 --- /dev/null +++ b/test/fixtures/af3x_4g3y_bc_dsso/seed-30_sample-0/model.cif @@ -0,0 +1,4374 @@ +# By using this file you agree to the legally binding terms of use found at +# https://github.com/google-deepmind/alphafold3/blob/main/OUTPUT_TERMS_OF_USE.md. +# To request access to the AlphaFold 3 model parameters, follow the process set +# out at https://github.com/google-deepmind/alphafold3. You may only use these if +# received directly from Google. Use is subject to terms of use available at +# https://github.com/google-deepmind/alphafold3/blob/main/WEIGHTS_TERMS_OF_USE.md. +data_alphajudge_issue30_4g3y_bc_dsso +# +_entry.id alphajudge_issue30_4g3y_bc_dsso +# +loop_ +_atom_type.symbol +C +N +O +S +# +loop_ +_audit_author.name +_audit_author.pdbx_ordinal +"Google DeepMind" 1 +"Isomorphic Labs" 2 +# +_audit_conform.dict_location https://raw.githubusercontent.com/ihmwg/ModelCIF/master/dist/mmcif_ma.dic +_audit_conform.dict_name mmcif_ma.dic +_audit_conform.dict_version 1.4.5 +# +loop_ +_chem_comp.formula +_chem_comp.formula_weight +_chem_comp.id +_chem_comp.mon_nstd_flag +_chem_comp.name +_chem_comp.pdbx_smiles +_chem_comp.pdbx_synonyms +_chem_comp.type +"C3 H7 N O2" 89.093 ALA y ALANINE C[C@@H](C(=O)O)N ? "L-PEPTIDE LINKING" +"C6 H15 N4 O2" 175.209 ARG y ARGININE C(C[C@@H](C(=O)O)N)CNC(=[NH2+])N ? "L-PEPTIDE LINKING" +"C4 H8 N2 O3" 132.118 ASN y ASPARAGINE C([C@@H](C(=O)O)N)C(=O)N ? "L-PEPTIDE LINKING" +"C4 H7 N O4" 133.103 ASP y "ASPARTIC ACID" C([C@@H](C(=O)O)N)C(=O)O ? "L-PEPTIDE LINKING" +"C3 H7 N O2 S" 121.158 CYS y CYSTEINE C([C@@H](C(=O)O)N)S ? "L-PEPTIDE LINKING" +"C6 H8 O3 S" XXX DSSO . "Disuccinimidyl sulfoxide, DSSO crosslinker" ? ? non-polymer +"C5 H10 N2 O3" 146.144 GLN y GLUTAMINE C(CC(=O)N)[C@@H](C(=O)O)N ? "L-PEPTIDE LINKING" +"C5 H9 N O4" 147.129 GLU y "GLUTAMIC ACID" C(CC(=O)O)[C@@H](C(=O)O)N ? "L-PEPTIDE LINKING" +"C2 H5 N O2" 75.067 GLY y GLYCINE C(C(=O)O)N ? "PEPTIDE LINKING" +"C6 H10 N3 O2" 156.162 HIS y HISTIDINE c1c([nH+]c[nH]1)C[C@@H](C(=O)O)N ? "L-PEPTIDE LINKING" +"C6 H13 N O2" 131.173 ILE y ISOLEUCINE CC[C@H](C)[C@@H](C(=O)O)N ? "L-PEPTIDE LINKING" +"C6 H13 N O2" 131.173 LEU y LEUCINE CC(C)C[C@@H](C(=O)O)N ? "L-PEPTIDE LINKING" +"C6 H15 N2 O2" 147.195 LYS y LYSINE C(CC[NH3+])C[C@@H](C(=O)O)N ? "L-PEPTIDE LINKING" +"C5 H11 N O2 S" 149.211 MET y METHIONINE CSCC[C@@H](C(=O)O)N ? "L-PEPTIDE LINKING" +"C9 H11 N O2" 165.189 PHE y PHENYLALANINE c1ccc(cc1)C[C@@H](C(=O)O)N ? "L-PEPTIDE LINKING" +"C5 H9 N O2" 115.130 PRO y PROLINE C1C[C@H](NC1)C(=O)O ? "L-PEPTIDE LINKING" +"C3 H7 N O3" 105.093 SER y SERINE C([C@@H](C(=O)O)N)O ? "L-PEPTIDE LINKING" +"C4 H9 N O3" 119.119 THR y THREONINE C[C@H]([C@@H](C(=O)O)N)O ? "L-PEPTIDE LINKING" +"C11 H12 N2 O2" 204.225 TRP y TRYPTOPHAN c1ccc2c(c1)c(c[nH]2)C[C@@H](C(=O)O)N ? "L-PEPTIDE LINKING" +"C9 H11 N O3" 181.189 TYR y TYROSINE c1cc(ccc1C[C@@H](C(=O)O)N)O ? "L-PEPTIDE LINKING" +"C5 H11 N O2" 117.146 VAL y VALINE CC(C)[C@@H](C(=O)O)N ? "L-PEPTIDE LINKING" +# +_citation.book_publisher ? +_citation.country UK +_citation.id primary +_citation.journal_full Nature +_citation.journal_id_ASTM NATUAS +_citation.journal_id_CSD 0006 +_citation.journal_id_ISSN 0028-0836 +_citation.journal_volume 630 +_citation.page_first 493 +_citation.page_last 500 +_citation.pdbx_database_id_DOI 10.1038/s41586-024-07487-w +_citation.pdbx_database_id_PubMed 38718835 +_citation.title "Accurate structure prediction of biomolecular interactions with AlphaFold 3" +_citation.year 2024 +# +loop_ +_citation_author.citation_id +_citation_author.name +_citation_author.ordinal +primary "Google DeepMind" 1 +primary "Isomorphic Labs" 2 +# +loop_ +_entity.id +_entity.pdbx_description +_entity.type +1 . non-polymer +2 . polymer +3 . polymer +# +loop_ +_entity_poly.entity_id +_entity_poly.pdbx_strand_id +_entity_poly.type +2 B polypeptide(L) +3 C polypeptide(L) +# +loop_ +_entity_poly_seq.entity_id +_entity_poly_seq.hetero +_entity_poly_seq.mon_id +_entity_poly_seq.num +2 n GLU 1 +2 n VAL 2 +2 n LYS 3 +2 n LEU 4 +2 n GLU 5 +2 n GLU 6 +2 n SER 7 +2 n GLY 8 +2 n GLY 9 +2 n GLY 10 +2 n LEU 11 +2 n VAL 12 +2 n GLN 13 +2 n PRO 14 +2 n GLY 15 +2 n GLY 16 +2 n SER 17 +2 n MET 18 +2 n LYS 19 +2 n LEU 20 +2 n SER 21 +2 n CYS 22 +2 n VAL 23 +2 n ALA 24 +2 n SER 25 +2 n GLY 26 +2 n PHE 27 +2 n ILE 28 +2 n PHE 29 +2 n SER 30 +2 n ASN 31 +2 n HIS 32 +2 n TRP 33 +2 n MET 34 +2 n ASN 35 +2 n TRP 36 +2 n VAL 37 +2 n ARG 38 +2 n GLN 39 +2 n SER 40 +2 n PRO 41 +2 n GLU 42 +2 n LYS 43 +2 n GLY 44 +2 n LEU 45 +2 n GLU 46 +2 n TRP 47 +2 n VAL 48 +2 n ALA 49 +2 n GLU 50 +2 n ILE 51 +2 n ARG 52 +2 n SER 53 +2 n LYS 54 +2 n SER 55 +2 n ILE 56 +2 n ASN 57 +2 n SER 58 +2 n ALA 59 +2 n THR 60 +2 n HIS 61 +2 n TYR 62 +2 n ALA 63 +2 n GLU 64 +2 n SER 65 +2 n VAL 66 +2 n LYS 67 +2 n GLY 68 +2 n ARG 69 +2 n PHE 70 +2 n THR 71 +2 n ILE 72 +2 n SER 73 +2 n ARG 74 +2 n ASP 75 +2 n ASP 76 +2 n SER 77 +2 n LYS 78 +2 n SER 79 +2 n ALA 80 +2 n VAL 81 +2 n TYR 82 +2 n LEU 83 +2 n GLN 84 +2 n MET 85 +2 n THR 86 +2 n ASP 87 +2 n LEU 88 +2 n ARG 89 +2 n THR 90 +2 n GLU 91 +2 n ASP 92 +2 n THR 93 +2 n GLY 94 +2 n VAL 95 +2 n TYR 96 +2 n TYR 97 +2 n CYS 98 +2 n SER 99 +2 n ARG 100 +2 n ASN 101 +2 n TYR 102 +2 n TYR 103 +2 n GLY 104 +2 n SER 105 +2 n THR 106 +2 n TYR 107 +2 n ASP 108 +2 n TYR 109 +2 n TRP 110 +2 n GLY 111 +2 n GLN 112 +2 n GLY 113 +2 n THR 114 +2 n THR 115 +2 n LEU 116 +2 n THR 117 +2 n VAL 118 +2 n SER 119 +2 n SER 120 +2 n ALA 121 +2 n SER 122 +2 n THR 123 +2 n LYS 124 +2 n GLY 125 +2 n PRO 126 +2 n SER 127 +2 n VAL 128 +2 n PHE 129 +2 n PRO 130 +2 n LEU 131 +2 n ALA 132 +2 n PRO 133 +2 n SER 134 +2 n SER 135 +2 n LYS 136 +2 n SER 137 +2 n THR 138 +2 n SER 139 +2 n GLY 140 +2 n GLY 141 +2 n THR 142 +2 n ALA 143 +2 n ALA 144 +2 n LEU 145 +2 n GLY 146 +2 n CYS 147 +2 n LEU 148 +2 n VAL 149 +2 n LYS 150 +2 n ASP 151 +2 n TYR 152 +2 n PHE 153 +2 n PRO 154 +2 n GLU 155 +2 n PRO 156 +2 n VAL 157 +2 n THR 158 +2 n VAL 159 +2 n SER 160 +2 n TRP 161 +2 n ASN 162 +2 n SER 163 +2 n GLY 164 +2 n ALA 165 +2 n LEU 166 +2 n THR 167 +2 n SER 168 +2 n GLY 169 +2 n VAL 170 +2 n HIS 171 +2 n THR 172 +2 n PHE 173 +2 n PRO 174 +2 n ALA 175 +2 n VAL 176 +2 n LEU 177 +2 n GLN 178 +2 n SER 179 +2 n SER 180 +2 n GLY 181 +2 n LEU 182 +2 n TYR 183 +2 n SER 184 +2 n LEU 185 +2 n SER 186 +2 n SER 187 +2 n VAL 188 +2 n VAL 189 +2 n THR 190 +2 n VAL 191 +2 n PRO 192 +2 n SER 193 +2 n SER 194 +2 n SER 195 +2 n LEU 196 +2 n GLY 197 +2 n THR 198 +2 n GLN 199 +2 n THR 200 +2 n TYR 201 +2 n ILE 202 +2 n CYS 203 +2 n ASN 204 +2 n VAL 205 +2 n ASN 206 +2 n HIS 207 +2 n LYS 208 +2 n PRO 209 +2 n SER 210 +2 n ASN 211 +2 n THR 212 +2 n LYS 213 +2 n VAL 214 +2 n ASP 215 +2 n LYS 216 +2 n LYS 217 +2 n VAL 218 +2 n GLU 219 +2 n PRO 220 +2 n LYS 221 +2 n SER 222 +2 n CYS 223 +2 n ASP 224 +2 n LYS 225 +2 n THR 226 +3 n ALA 1 +3 n VAL 2 +3 n ARG 3 +3 n SER 4 +3 n SER 5 +3 n SER 6 +3 n ARG 7 +3 n THR 8 +3 n PRO 9 +3 n SER 10 +3 n ASP 11 +3 n LYS 12 +3 n PRO 13 +3 n VAL 14 +3 n ALA 15 +3 n HIS 16 +3 n VAL 17 +3 n VAL 18 +3 n ALA 19 +3 n ASN 20 +3 n PRO 21 +3 n GLN 22 +3 n ALA 23 +3 n GLU 24 +3 n GLY 25 +3 n GLN 26 +3 n LEU 27 +3 n GLN 28 +3 n TRP 29 +3 n LEU 30 +3 n ASN 31 +3 n ARG 32 +3 n ARG 33 +3 n ALA 34 +3 n ASN 35 +3 n ALA 36 +3 n LEU 37 +3 n LEU 38 +3 n ALA 39 +3 n ASN 40 +3 n GLY 41 +3 n VAL 42 +3 n GLU 43 +3 n LEU 44 +3 n ARG 45 +3 n ASP 46 +3 n ASN 47 +3 n GLN 48 +3 n LEU 49 +3 n VAL 50 +3 n VAL 51 +3 n PRO 52 +3 n SER 53 +3 n GLU 54 +3 n GLY 55 +3 n LEU 56 +3 n TYR 57 +3 n LEU 58 +3 n ILE 59 +3 n TYR 60 +3 n SER 61 +3 n GLN 62 +3 n VAL 63 +3 n LEU 64 +3 n PHE 65 +3 n LYS 66 +3 n GLY 67 +3 n GLN 68 +3 n GLY 69 +3 n CYS 70 +3 n PRO 71 +3 n SER 72 +3 n THR 73 +3 n HIS 74 +3 n VAL 75 +3 n LEU 76 +3 n LEU 77 +3 n THR 78 +3 n HIS 79 +3 n THR 80 +3 n ILE 81 +3 n SER 82 +3 n ARG 83 +3 n ILE 84 +3 n ALA 85 +3 n VAL 86 +3 n SER 87 +3 n TYR 88 +3 n GLN 89 +3 n THR 90 +3 n LYS 91 +3 n VAL 92 +3 n ASN 93 +3 n LEU 94 +3 n LEU 95 +3 n SER 96 +3 n ALA 97 +3 n ILE 98 +3 n LYS 99 +3 n SER 100 +3 n PRO 101 +3 n CYS 102 +3 n GLN 103 +3 n ARG 104 +3 n GLU 105 +3 n THR 106 +3 n PRO 107 +3 n GLU 108 +3 n GLY 109 +3 n ALA 110 +3 n GLU 111 +3 n ALA 112 +3 n LYS 113 +3 n PRO 114 +3 n TRP 115 +3 n TYR 116 +3 n GLU 117 +3 n PRO 118 +3 n ILE 119 +3 n TYR 120 +3 n LEU 121 +3 n GLY 122 +3 n GLY 123 +3 n VAL 124 +3 n PHE 125 +3 n GLN 126 +3 n LEU 127 +3 n GLU 128 +3 n LYS 129 +3 n GLY 130 +3 n ASP 131 +3 n ARG 132 +3 n LEU 133 +3 n SER 134 +3 n ALA 135 +3 n GLU 136 +3 n ILE 137 +3 n ASN 138 +3 n ARG 139 +3 n PRO 140 +3 n ASP 141 +3 n TYR 142 +3 n LEU 143 +3 n ASP 144 +3 n PHE 145 +3 n ALA 146 +3 n GLU 147 +3 n SER 148 +3 n GLY 149 +3 n GLN 150 +3 n VAL 151 +3 n TYR 152 +3 n PHE 153 +3 n GLY 154 +3 n ILE 155 +3 n ILE 156 +3 n ALA 157 +3 n LEU 158 +# +_ma_data.content_type "model coordinates" +_ma_data.id 1 +_ma_data.name Model +# +_ma_model_list.data_id 1 +_ma_model_list.model_group_id 1 +_ma_model_list.model_group_name "AlphaFold-beta-20231127 (3.0.1 @ 2026-09-25 13:14:12)" +_ma_model_list.model_id 1 +_ma_model_list.model_name "Top ranked model" +_ma_model_list.model_type "Ab initio model" +_ma_model_list.ordinal_id 1 +# +loop_ +_ma_protocol_step.method_type +_ma_protocol_step.ordinal_id +_ma_protocol_step.protocol_id +_ma_protocol_step.step_id +"coevolution MSA" 1 1 1 +"template search" 2 1 2 +modeling 3 1 3 +# +loop_ +_ma_qa_metric.id +_ma_qa_metric.mode +_ma_qa_metric.name +_ma_qa_metric.software_group_id +_ma_qa_metric.type +1 global pLDDT 1 pLDDT +2 local pLDDT 1 pLDDT +# +_ma_qa_metric_global.metric_id 1 +_ma_qa_metric_global.metric_value 86.28 +_ma_qa_metric_global.model_id 1 +_ma_qa_metric_global.ordinal_id 1 +# +loop_ +_ma_qa_metric_local.label_asym_id +_ma_qa_metric_local.label_comp_id +_ma_qa_metric_local.label_seq_id +_ma_qa_metric_local.metric_id +_ma_qa_metric_local.metric_value +_ma_qa_metric_local.model_id +_ma_qa_metric_local.ordinal_id +A DSSO . 2 63.42 1 1 +B GLU 1 2 69.59 1 2 +B VAL 2 2 83.82 1 3 +B LYS 3 2 84.69 1 4 +B LEU 4 2 94.55 1 5 +B GLU 5 2 89.44 1 6 +B GLU 6 2 95.69 1 7 +B SER 7 2 95.88 1 8 +B GLY 8 2 94.17 1 9 +B GLY 9 2 92.84 1 10 +B GLY 10 2 92.68 1 11 +B LEU 11 2 93.31 1 12 +B VAL 12 2 93.70 1 13 +B GLN 13 2 86.85 1 14 +B PRO 14 2 96.32 1 15 +B GLY 15 2 97.96 1 16 +B GLY 16 2 98.23 1 17 +B SER 17 2 96.20 1 18 +B MET 18 2 91.62 1 19 +B LYS 19 2 93.85 1 20 +B LEU 20 2 98.24 1 21 +B SER 21 2 96.14 1 22 +B CYS 22 2 97.81 1 23 +B VAL 23 2 96.52 1 24 +B ALA 24 2 95.97 1 25 +B SER 25 2 91.17 1 26 +B GLY 26 2 85.28 1 27 +B PHE 27 2 83.37 1 28 +B ILE 28 2 74.78 1 29 +B PHE 29 2 90.45 1 30 +B SER 30 2 81.96 1 31 +B ASN 31 2 69.92 1 32 +B HIS 32 2 78.27 1 33 +B TRP 33 2 72.40 1 34 +B MET 34 2 92.35 1 35 +B ASN 35 2 88.14 1 36 +B TRP 36 2 97.23 1 37 +B VAL 37 2 93.70 1 38 +B ARG 38 2 96.65 1 39 +B GLN 39 2 90.51 1 40 +B SER 40 2 92.05 1 41 +B PRO 41 2 85.56 1 42 +B GLU 42 2 77.66 1 43 +B LYS 43 2 81.65 1 44 +B GLY 44 2 92.60 1 45 +B LEU 45 2 87.37 1 46 +B GLU 46 2 88.49 1 47 +B TRP 47 2 86.64 1 48 +B VAL 48 2 95.07 1 49 +B ALA 49 2 94.81 1 50 +B GLU 50 2 83.06 1 51 +B ILE 51 2 92.06 1 52 +B ARG 52 2 73.99 1 53 +B SER 53 2 77.68 1 54 +B LYS 54 2 58.19 1 55 +B SER 55 2 57.11 1 56 +B ILE 56 2 53.48 1 57 +B ASN 57 2 52.77 1 58 +B SER 58 2 72.77 1 59 +B ALA 59 2 77.04 1 60 +B THR 60 2 87.37 1 61 +B HIS 61 2 76.05 1 62 +B TYR 62 2 93.88 1 63 +B ALA 63 2 94.36 1 64 +B GLU 64 2 84.70 1 65 +B SER 65 2 94.38 1 66 +B VAL 66 2 97.18 1 67 +B LYS 67 2 87.39 1 68 +B GLY 68 2 97.19 1 69 +B ARG 69 2 97.34 1 70 +B PHE 70 2 98.35 1 71 +B THR 71 2 96.68 1 72 +B ILE 72 2 96.92 1 73 +B SER 73 2 97.36 1 74 +B ARG 74 2 92.20 1 75 +B ASP 75 2 95.80 1 76 +B ASP 76 2 91.65 1 77 +B SER 77 2 94.28 1 78 +B LYS 78 2 92.34 1 79 +B SER 79 2 95.57 1 80 +B ALA 80 2 97.82 1 81 +B VAL 81 2 95.66 1 82 +B TYR 82 2 97.84 1 83 +B LEU 83 2 98.46 1 84 +B GLN 84 2 92.63 1 85 +B MET 85 2 97.63 1 86 +B THR 86 2 95.56 1 87 +B ASP 87 2 95.30 1 88 +B LEU 88 2 98.03 1 89 +B ARG 89 2 91.79 1 90 +B THR 90 2 90.87 1 91 +B GLU 91 2 87.47 1 92 +B ASP 92 2 97.25 1 93 +B THR 93 2 95.02 1 94 +B GLY 94 2 96.43 1 95 +B VAL 95 2 96.05 1 96 +B TYR 96 2 98.09 1 97 +B TYR 97 2 95.71 1 98 +B CYS 98 2 93.87 1 99 +B SER 99 2 89.81 1 100 +B ARG 100 2 79.67 1 101 +B ASN 101 2 64.96 1 102 +B TYR 102 2 46.80 1 103 +B TYR 103 2 43.78 1 104 +B GLY 104 2 46.08 1 105 +B SER 105 2 46.11 1 106 +B THR 106 2 47.46 1 107 +B TYR 107 2 50.81 1 108 +B ASP 108 2 58.88 1 109 +B TYR 109 2 73.81 1 110 +B TRP 110 2 82.96 1 111 +B GLY 111 2 95.45 1 112 +B GLN 112 2 80.76 1 113 +B GLY 113 2 96.26 1 114 +B THR 114 2 96.05 1 115 +B THR 115 2 93.24 1 116 +B LEU 116 2 95.44 1 117 +B THR 117 2 94.08 1 118 +B VAL 118 2 95.53 1 119 +B SER 119 2 93.08 1 120 +B SER 120 2 91.34 1 121 +B ALA 121 2 92.19 1 122 +B SER 122 2 92.30 1 123 +B THR 123 2 92.39 1 124 +B LYS 124 2 93.84 1 125 +B GLY 125 2 98.00 1 126 +B PRO 126 2 98.20 1 127 +B SER 127 2 97.37 1 128 +B VAL 128 2 98.10 1 129 +B PHE 129 2 95.98 1 130 +B PRO 130 2 97.04 1 131 +B LEU 131 2 96.16 1 132 +B ALA 132 2 94.00 1 133 +B PRO 133 2 90.73 1 134 +B SER 134 2 81.68 1 135 +B SER 135 2 72.61 1 136 +B LYS 136 2 67.26 1 137 +B SER 137 2 71.00 1 138 +B THR 138 2 67.19 1 139 +B SER 139 2 77.64 1 140 +B GLY 140 2 81.61 1 141 +B GLY 141 2 89.70 1 142 +B THR 142 2 89.76 1 143 +B ALA 143 2 94.08 1 144 +B ALA 144 2 94.35 1 145 +B LEU 145 2 95.78 1 146 +B GLY 146 2 98.10 1 147 +B CYS 147 2 98.03 1 148 +B LEU 148 2 97.52 1 149 +B VAL 149 2 98.29 1 150 +B LYS 150 2 93.02 1 151 +B ASP 151 2 97.02 1 152 +B TYR 152 2 97.47 1 153 +B PHE 153 2 95.77 1 154 +B PRO 154 2 94.66 1 155 +B GLU 155 2 91.29 1 156 +B PRO 156 2 93.02 1 157 +B VAL 157 2 94.64 1 158 +B THR 158 2 95.29 1 159 +B VAL 159 2 98.00 1 160 +B SER 160 2 97.98 1 161 +B TRP 161 2 98.45 1 162 +B ASN 162 2 96.89 1 163 +B SER 163 2 97.47 1 164 +B GLY 164 2 97.92 1 165 +B ALA 165 2 98.01 1 166 +B LEU 166 2 97.14 1 167 +B THR 167 2 96.34 1 168 +B SER 168 2 94.37 1 169 +B GLY 169 2 97.15 1 170 +B VAL 170 2 97.44 1 171 +B HIS 171 2 89.87 1 172 +B THR 172 2 97.05 1 173 +B PHE 173 2 94.59 1 174 +B PRO 174 2 94.35 1 175 +B ALA 175 2 95.53 1 176 +B VAL 176 2 93.07 1 177 +B LEU 177 2 88.91 1 178 +B GLN 178 2 93.37 1 179 +B SER 179 2 90.70 1 180 +B SER 180 2 92.31 1 181 +B GLY 181 2 90.80 1 182 +B LEU 182 2 94.95 1 183 +B TYR 183 2 94.46 1 184 +B SER 184 2 95.77 1 185 +B LEU 185 2 96.87 1 186 +B SER 186 2 95.46 1 187 +B SER 187 2 98.43 1 188 +B VAL 188 2 96.46 1 189 +B VAL 189 2 96.39 1 190 +B THR 190 2 93.89 1 191 +B VAL 191 2 95.21 1 192 +B PRO 192 2 94.04 1 193 +B SER 193 2 89.80 1 194 +B SER 194 2 90.74 1 195 +B SER 195 2 92.98 1 196 +B LEU 196 2 90.58 1 197 +B GLY 197 2 90.13 1 198 +B THR 198 2 91.11 1 199 +B GLN 199 2 87.60 1 200 +B THR 200 2 92.87 1 201 +B TYR 201 2 96.73 1 202 +B ILE 202 2 97.45 1 203 +B CYS 203 2 98.22 1 204 +B ASN 204 2 96.31 1 205 +B VAL 205 2 98.37 1 206 +B ASN 206 2 93.91 1 207 +B HIS 207 2 95.77 1 208 +B LYS 208 2 84.26 1 209 +B PRO 209 2 92.02 1 210 +B SER 210 2 95.45 1 211 +B ASN 211 2 89.74 1 212 +B THR 212 2 96.44 1 213 +B LYS 213 2 89.05 1 214 +B VAL 214 2 97.00 1 215 +B ASP 215 2 97.06 1 216 +B LYS 216 2 92.46 1 217 +B LYS 217 2 92.09 1 218 +B VAL 218 2 96.22 1 219 +B GLU 219 2 89.05 1 220 +B PRO 220 2 89.13 1 221 +B LYS 221 2 69.52 1 222 +B SER 222 2 67.12 1 223 +B CYS 223 2 59.88 1 224 +B ASP 224 2 37.91 1 225 +B LYS 225 2 35.08 1 226 +B THR 226 2 28.35 1 227 +C ALA 1 2 38.69 1 228 +C VAL 2 2 30.07 1 229 +C ARG 3 2 30.97 1 230 +C SER 4 2 30.64 1 231 +C SER 5 2 33.78 1 232 +C SER 6 2 34.16 1 233 +C ARG 7 2 42.99 1 234 +C THR 8 2 39.06 1 235 +C PRO 9 2 60.02 1 236 +C SER 10 2 77.30 1 237 +C ASP 11 2 83.73 1 238 +C LYS 12 2 87.06 1 239 +C PRO 13 2 97.07 1 240 +C VAL 14 2 94.26 1 241 +C ALA 15 2 97.55 1 242 +C HIS 16 2 94.74 1 243 +C VAL 17 2 96.08 1 244 +C VAL 18 2 92.37 1 245 +C ALA 19 2 90.22 1 246 +C ASN 20 2 81.88 1 247 +C PRO 21 2 71.23 1 248 +C GLN 22 2 57.47 1 249 +C ALA 23 2 66.21 1 250 +C GLU 24 2 49.54 1 251 +C GLY 25 2 64.83 1 252 +C GLN 26 2 69.73 1 253 +C LEU 27 2 92.93 1 254 +C GLN 28 2 86.93 1 255 +C TRP 29 2 95.91 1 256 +C LEU 30 2 90.02 1 257 +C ASN 31 2 86.38 1 258 +C ARG 32 2 70.17 1 259 +C ARG 33 2 69.78 1 260 +C ALA 34 2 77.09 1 261 +C ASN 35 2 74.98 1 262 +C ALA 36 2 89.35 1 263 +C LEU 37 2 87.85 1 264 +C LEU 38 2 91.62 1 265 +C ALA 39 2 95.50 1 266 +C ASN 40 2 93.74 1 267 +C GLY 41 2 96.84 1 268 +C VAL 42 2 96.58 1 269 +C GLU 43 2 92.18 1 270 +C LEU 44 2 96.00 1 271 +C ARG 45 2 81.59 1 272 +C ASP 46 2 91.76 1 273 +C ASN 47 2 95.99 1 274 +C GLN 48 2 94.51 1 275 +C LEU 49 2 97.78 1 276 +C VAL 50 2 97.15 1 277 +C VAL 51 2 97.00 1 278 +C PRO 52 2 97.62 1 279 +C SER 53 2 95.47 1 280 +C GLU 54 2 91.72 1 281 +C GLY 55 2 97.69 1 282 +C LEU 56 2 94.37 1 283 +C TYR 57 2 97.75 1 284 +C LEU 58 2 96.64 1 285 +C ILE 59 2 98.16 1 286 +C TYR 60 2 97.88 1 287 +C SER 61 2 97.41 1 288 +C GLN 62 2 93.30 1 289 +C VAL 63 2 96.11 1 290 +C LEU 64 2 92.47 1 291 +C PHE 65 2 93.29 1 292 +C LYS 66 2 80.09 1 293 +C GLY 67 2 80.56 1 294 +C GLN 68 2 66.64 1 295 +C GLY 69 2 76.47 1 296 +C CYS 70 2 80.62 1 297 +C PRO 71 2 72.48 1 298 +C SER 72 2 76.35 1 299 +C THR 73 2 79.45 1 300 +C HIS 74 2 75.47 1 301 +C VAL 75 2 84.09 1 302 +C LEU 76 2 87.98 1 303 +C LEU 77 2 94.72 1 304 +C THR 78 2 95.45 1 305 +C HIS 79 2 97.18 1 306 +C THR 80 2 94.29 1 307 +C ILE 81 2 98.10 1 308 +C SER 82 2 96.34 1 309 +C ARG 83 2 92.35 1 310 +C ILE 84 2 91.72 1 311 +C ALA 85 2 92.08 1 312 +C VAL 86 2 83.36 1 313 +C SER 87 2 83.32 1 314 +C TYR 88 2 71.76 1 315 +C GLN 89 2 79.72 1 316 +C THR 90 2 87.66 1 317 +C LYS 91 2 90.32 1 318 +C VAL 92 2 94.31 1 319 +C ASN 93 2 93.71 1 320 +C LEU 94 2 97.09 1 321 +C LEU 95 2 98.03 1 322 +C SER 96 2 95.12 1 323 +C ALA 97 2 98.37 1 324 +C ILE 98 2 92.96 1 325 +C LYS 99 2 90.93 1 326 +C SER 100 2 91.91 1 327 +C PRO 101 2 91.18 1 328 +C CYS 102 2 88.52 1 329 +C GLN 103 2 77.75 1 330 +C ARG 104 2 70.68 1 331 +C GLU 105 2 74.13 1 332 +C THR 106 2 72.82 1 333 +C PRO 107 2 71.75 1 334 +C GLU 108 2 54.84 1 335 +C GLY 109 2 59.21 1 336 +C ALA 110 2 67.27 1 337 +C GLU 111 2 56.79 1 338 +C ALA 112 2 68.56 1 339 +C LYS 113 2 67.41 1 340 +C PRO 114 2 77.43 1 341 +C TRP 115 2 87.70 1 342 +C TYR 116 2 85.94 1 343 +C GLU 117 2 90.90 1 344 +C PRO 118 2 95.82 1 345 +C ILE 119 2 97.41 1 346 +C TYR 120 2 95.24 1 347 +C LEU 121 2 97.86 1 348 +C GLY 122 2 98.39 1 349 +C GLY 123 2 98.57 1 350 +C VAL 124 2 97.53 1 351 +C PHE 125 2 97.62 1 352 +C GLN 126 2 91.96 1 353 +C LEU 127 2 96.67 1 354 +C GLU 128 2 86.74 1 355 +C LYS 129 2 92.52 1 356 +C GLY 130 2 96.94 1 357 +C ASP 131 2 96.29 1 358 +C ARG 132 2 85.17 1 359 +C LEU 133 2 97.46 1 360 +C SER 134 2 95.06 1 361 +C ALA 135 2 98.19 1 362 +C GLU 136 2 94.27 1 363 +C ILE 137 2 95.26 1 364 +C ASN 138 2 92.63 1 365 +C ARG 139 2 82.50 1 366 +C PRO 140 2 80.47 1 367 +C ASP 141 2 70.99 1 368 +C TYR 142 2 81.02 1 369 +C LEU 143 2 82.63 1 370 +C ASP 144 2 80.90 1 371 +C PHE 145 2 67.90 1 372 +C ALA 146 2 68.34 1 373 +C GLU 147 2 57.55 1 374 +C SER 148 2 60.77 1 375 +C GLY 149 2 80.26 1 376 +C GLN 150 2 76.32 1 377 +C VAL 151 2 93.29 1 378 +C TYR 152 2 95.78 1 379 +C PHE 153 2 97.70 1 380 +C GLY 154 2 98.35 1 381 +C ILE 155 2 97.30 1 382 +C ILE 156 2 90.99 1 383 +C ALA 157 2 97.41 1 384 +C LEU 158 2 92.27 1 385 +# +_ma_software_group.group_id 1 +_ma_software_group.ordinal_id 1 +_ma_software_group.software_id 1 +# +loop_ +_ma_target_entity.data_id +_ma_target_entity.entity_id +_ma_target_entity.origin +1 1 . +1 2 . +1 3 . +# +loop_ +_ma_target_entity_instance.asym_id +_ma_target_entity_instance.details +_ma_target_entity_instance.entity_id +A . 1 +B . 2 +C . 3 +# +loop_ +_pdbx_data_usage.details +_pdbx_data_usage.id +_pdbx_data_usage.type +_pdbx_data_usage.url +;Non-commercial use only, by using this file you agree to the terms of use found +at https://github.com/google-deepmind/alphafold3/blob/main/OUTPUT_TERMS_OF_USE.md. +To request access to the AlphaFold 3 model parameters, follow the process set +out at https://github.com/google-deepmind/alphafold3. You may only use these if +received directly from Google. Use is subject to terms of use available at +https://github.com/google-deepmind/alphafold3/blob/main/WEIGHTS_TERMS_OF_USE.md. +; +1 license https://github.com/google-deepmind/alphafold3/blob/main/OUTPUT_TERMS_OF_USE.md +;AlphaFold 3 and its output are not intended for, have not been validated for, +and are not approved for clinical use. They are provided "as-is" without any +warranty of any kind, whether expressed or implied. No warranty is given that +use shall not infringe the rights of any third party. +; +2 disclaimer ? +# +_pdbx_nonpoly_scheme.asym_id A +_pdbx_nonpoly_scheme.auth_seq_num 1 +_pdbx_nonpoly_scheme.entity_id 1 +_pdbx_nonpoly_scheme.mon_id DSSO +_pdbx_nonpoly_scheme.pdb_ins_code . +_pdbx_nonpoly_scheme.pdb_seq_num 1 +_pdbx_nonpoly_scheme.pdb_strand_id A +# +loop_ +_pdbx_poly_seq_scheme.asym_id +_pdbx_poly_seq_scheme.auth_seq_num +_pdbx_poly_seq_scheme.entity_id +_pdbx_poly_seq_scheme.hetero +_pdbx_poly_seq_scheme.mon_id +_pdbx_poly_seq_scheme.pdb_ins_code +_pdbx_poly_seq_scheme.pdb_seq_num +_pdbx_poly_seq_scheme.pdb_strand_id +_pdbx_poly_seq_scheme.seq_id +B 1 2 n GLU . 1 B 1 +B 2 2 n VAL . 2 B 2 +B 3 2 n LYS . 3 B 3 +B 4 2 n LEU . 4 B 4 +B 5 2 n GLU . 5 B 5 +B 6 2 n GLU . 6 B 6 +B 7 2 n SER . 7 B 7 +B 8 2 n GLY . 8 B 8 +B 9 2 n GLY . 9 B 9 +B 10 2 n GLY . 10 B 10 +B 11 2 n LEU . 11 B 11 +B 12 2 n VAL . 12 B 12 +B 13 2 n GLN . 13 B 13 +B 14 2 n PRO . 14 B 14 +B 15 2 n GLY . 15 B 15 +B 16 2 n GLY . 16 B 16 +B 17 2 n SER . 17 B 17 +B 18 2 n MET . 18 B 18 +B 19 2 n LYS . 19 B 19 +B 20 2 n LEU . 20 B 20 +B 21 2 n SER . 21 B 21 +B 22 2 n CYS . 22 B 22 +B 23 2 n VAL . 23 B 23 +B 24 2 n ALA . 24 B 24 +B 25 2 n SER . 25 B 25 +B 26 2 n GLY . 26 B 26 +B 27 2 n PHE . 27 B 27 +B 28 2 n ILE . 28 B 28 +B 29 2 n PHE . 29 B 29 +B 30 2 n SER . 30 B 30 +B 31 2 n ASN . 31 B 31 +B 32 2 n HIS . 32 B 32 +B 33 2 n TRP . 33 B 33 +B 34 2 n MET . 34 B 34 +B 35 2 n ASN . 35 B 35 +B 36 2 n TRP . 36 B 36 +B 37 2 n VAL . 37 B 37 +B 38 2 n ARG . 38 B 38 +B 39 2 n GLN . 39 B 39 +B 40 2 n SER . 40 B 40 +B 41 2 n PRO . 41 B 41 +B 42 2 n GLU . 42 B 42 +B 43 2 n LYS . 43 B 43 +B 44 2 n GLY . 44 B 44 +B 45 2 n LEU . 45 B 45 +B 46 2 n GLU . 46 B 46 +B 47 2 n TRP . 47 B 47 +B 48 2 n VAL . 48 B 48 +B 49 2 n ALA . 49 B 49 +B 50 2 n GLU . 50 B 50 +B 51 2 n ILE . 51 B 51 +B 52 2 n ARG . 52 B 52 +B 53 2 n SER . 53 B 53 +B 54 2 n LYS . 54 B 54 +B 55 2 n SER . 55 B 55 +B 56 2 n ILE . 56 B 56 +B 57 2 n ASN . 57 B 57 +B 58 2 n SER . 58 B 58 +B 59 2 n ALA . 59 B 59 +B 60 2 n THR . 60 B 60 +B 61 2 n HIS . 61 B 61 +B 62 2 n TYR . 62 B 62 +B 63 2 n ALA . 63 B 63 +B 64 2 n GLU . 64 B 64 +B 65 2 n SER . 65 B 65 +B 66 2 n VAL . 66 B 66 +B 67 2 n LYS . 67 B 67 +B 68 2 n GLY . 68 B 68 +B 69 2 n ARG . 69 B 69 +B 70 2 n PHE . 70 B 70 +B 71 2 n THR . 71 B 71 +B 72 2 n ILE . 72 B 72 +B 73 2 n SER . 73 B 73 +B 74 2 n ARG . 74 B 74 +B 75 2 n ASP . 75 B 75 +B 76 2 n ASP . 76 B 76 +B 77 2 n SER . 77 B 77 +B 78 2 n LYS . 78 B 78 +B 79 2 n SER . 79 B 79 +B 80 2 n ALA . 80 B 80 +B 81 2 n VAL . 81 B 81 +B 82 2 n TYR . 82 B 82 +B 83 2 n LEU . 83 B 83 +B 84 2 n GLN . 84 B 84 +B 85 2 n MET . 85 B 85 +B 86 2 n THR . 86 B 86 +B 87 2 n ASP . 87 B 87 +B 88 2 n LEU . 88 B 88 +B 89 2 n ARG . 89 B 89 +B 90 2 n THR . 90 B 90 +B 91 2 n GLU . 91 B 91 +B 92 2 n ASP . 92 B 92 +B 93 2 n THR . 93 B 93 +B 94 2 n GLY . 94 B 94 +B 95 2 n VAL . 95 B 95 +B 96 2 n TYR . 96 B 96 +B 97 2 n TYR . 97 B 97 +B 98 2 n CYS . 98 B 98 +B 99 2 n SER . 99 B 99 +B 100 2 n ARG . 100 B 100 +B 101 2 n ASN . 101 B 101 +B 102 2 n TYR . 102 B 102 +B 103 2 n TYR . 103 B 103 +B 104 2 n GLY . 104 B 104 +B 105 2 n SER . 105 B 105 +B 106 2 n THR . 106 B 106 +B 107 2 n TYR . 107 B 107 +B 108 2 n ASP . 108 B 108 +B 109 2 n TYR . 109 B 109 +B 110 2 n TRP . 110 B 110 +B 111 2 n GLY . 111 B 111 +B 112 2 n GLN . 112 B 112 +B 113 2 n GLY . 113 B 113 +B 114 2 n THR . 114 B 114 +B 115 2 n THR . 115 B 115 +B 116 2 n LEU . 116 B 116 +B 117 2 n THR . 117 B 117 +B 118 2 n VAL . 118 B 118 +B 119 2 n SER . 119 B 119 +B 120 2 n SER . 120 B 120 +B 121 2 n ALA . 121 B 121 +B 122 2 n SER . 122 B 122 +B 123 2 n THR . 123 B 123 +B 124 2 n LYS . 124 B 124 +B 125 2 n GLY . 125 B 125 +B 126 2 n PRO . 126 B 126 +B 127 2 n SER . 127 B 127 +B 128 2 n VAL . 128 B 128 +B 129 2 n PHE . 129 B 129 +B 130 2 n PRO . 130 B 130 +B 131 2 n LEU . 131 B 131 +B 132 2 n ALA . 132 B 132 +B 133 2 n PRO . 133 B 133 +B 134 2 n SER . 134 B 134 +B 135 2 n SER . 135 B 135 +B 136 2 n LYS . 136 B 136 +B 137 2 n SER . 137 B 137 +B 138 2 n THR . 138 B 138 +B 139 2 n SER . 139 B 139 +B 140 2 n GLY . 140 B 140 +B 141 2 n GLY . 141 B 141 +B 142 2 n THR . 142 B 142 +B 143 2 n ALA . 143 B 143 +B 144 2 n ALA . 144 B 144 +B 145 2 n LEU . 145 B 145 +B 146 2 n GLY . 146 B 146 +B 147 2 n CYS . 147 B 147 +B 148 2 n LEU . 148 B 148 +B 149 2 n VAL . 149 B 149 +B 150 2 n LYS . 150 B 150 +B 151 2 n ASP . 151 B 151 +B 152 2 n TYR . 152 B 152 +B 153 2 n PHE . 153 B 153 +B 154 2 n PRO . 154 B 154 +B 155 2 n GLU . 155 B 155 +B 156 2 n PRO . 156 B 156 +B 157 2 n VAL . 157 B 157 +B 158 2 n THR . 158 B 158 +B 159 2 n VAL . 159 B 159 +B 160 2 n SER . 160 B 160 +B 161 2 n TRP . 161 B 161 +B 162 2 n ASN . 162 B 162 +B 163 2 n SER . 163 B 163 +B 164 2 n GLY . 164 B 164 +B 165 2 n ALA . 165 B 165 +B 166 2 n LEU . 166 B 166 +B 167 2 n THR . 167 B 167 +B 168 2 n SER . 168 B 168 +B 169 2 n GLY . 169 B 169 +B 170 2 n VAL . 170 B 170 +B 171 2 n HIS . 171 B 171 +B 172 2 n THR . 172 B 172 +B 173 2 n PHE . 173 B 173 +B 174 2 n PRO . 174 B 174 +B 175 2 n ALA . 175 B 175 +B 176 2 n VAL . 176 B 176 +B 177 2 n LEU . 177 B 177 +B 178 2 n GLN . 178 B 178 +B 179 2 n SER . 179 B 179 +B 180 2 n SER . 180 B 180 +B 181 2 n GLY . 181 B 181 +B 182 2 n LEU . 182 B 182 +B 183 2 n TYR . 183 B 183 +B 184 2 n SER . 184 B 184 +B 185 2 n LEU . 185 B 185 +B 186 2 n SER . 186 B 186 +B 187 2 n SER . 187 B 187 +B 188 2 n VAL . 188 B 188 +B 189 2 n VAL . 189 B 189 +B 190 2 n THR . 190 B 190 +B 191 2 n VAL . 191 B 191 +B 192 2 n PRO . 192 B 192 +B 193 2 n SER . 193 B 193 +B 194 2 n SER . 194 B 194 +B 195 2 n SER . 195 B 195 +B 196 2 n LEU . 196 B 196 +B 197 2 n GLY . 197 B 197 +B 198 2 n THR . 198 B 198 +B 199 2 n GLN . 199 B 199 +B 200 2 n THR . 200 B 200 +B 201 2 n TYR . 201 B 201 +B 202 2 n ILE . 202 B 202 +B 203 2 n CYS . 203 B 203 +B 204 2 n ASN . 204 B 204 +B 205 2 n VAL . 205 B 205 +B 206 2 n ASN . 206 B 206 +B 207 2 n HIS . 207 B 207 +B 208 2 n LYS . 208 B 208 +B 209 2 n PRO . 209 B 209 +B 210 2 n SER . 210 B 210 +B 211 2 n ASN . 211 B 211 +B 212 2 n THR . 212 B 212 +B 213 2 n LYS . 213 B 213 +B 214 2 n VAL . 214 B 214 +B 215 2 n ASP . 215 B 215 +B 216 2 n LYS . 216 B 216 +B 217 2 n LYS . 217 B 217 +B 218 2 n VAL . 218 B 218 +B 219 2 n GLU . 219 B 219 +B 220 2 n PRO . 220 B 220 +B 221 2 n LYS . 221 B 221 +B 222 2 n SER . 222 B 222 +B 223 2 n CYS . 223 B 223 +B 224 2 n ASP . 224 B 224 +B 225 2 n LYS . 225 B 225 +B 226 2 n THR . 226 B 226 +C 1 3 n ALA . 1 C 1 +C 2 3 n VAL . 2 C 2 +C 3 3 n ARG . 3 C 3 +C 4 3 n SER . 4 C 4 +C 5 3 n SER . 5 C 5 +C 6 3 n SER . 6 C 6 +C 7 3 n ARG . 7 C 7 +C 8 3 n THR . 8 C 8 +C 9 3 n PRO . 9 C 9 +C 10 3 n SER . 10 C 10 +C 11 3 n ASP . 11 C 11 +C 12 3 n LYS . 12 C 12 +C 13 3 n PRO . 13 C 13 +C 14 3 n VAL . 14 C 14 +C 15 3 n ALA . 15 C 15 +C 16 3 n HIS . 16 C 16 +C 17 3 n VAL . 17 C 17 +C 18 3 n VAL . 18 C 18 +C 19 3 n ALA . 19 C 19 +C 20 3 n ASN . 20 C 20 +C 21 3 n PRO . 21 C 21 +C 22 3 n GLN . 22 C 22 +C 23 3 n ALA . 23 C 23 +C 24 3 n GLU . 24 C 24 +C 25 3 n GLY . 25 C 25 +C 26 3 n GLN . 26 C 26 +C 27 3 n LEU . 27 C 27 +C 28 3 n GLN . 28 C 28 +C 29 3 n TRP . 29 C 29 +C 30 3 n LEU . 30 C 30 +C 31 3 n ASN . 31 C 31 +C 32 3 n ARG . 32 C 32 +C 33 3 n ARG . 33 C 33 +C 34 3 n ALA . 34 C 34 +C 35 3 n ASN . 35 C 35 +C 36 3 n ALA . 36 C 36 +C 37 3 n LEU . 37 C 37 +C 38 3 n LEU . 38 C 38 +C 39 3 n ALA . 39 C 39 +C 40 3 n ASN . 40 C 40 +C 41 3 n GLY . 41 C 41 +C 42 3 n VAL . 42 C 42 +C 43 3 n GLU . 43 C 43 +C 44 3 n LEU . 44 C 44 +C 45 3 n ARG . 45 C 45 +C 46 3 n ASP . 46 C 46 +C 47 3 n ASN . 47 C 47 +C 48 3 n GLN . 48 C 48 +C 49 3 n LEU . 49 C 49 +C 50 3 n VAL . 50 C 50 +C 51 3 n VAL . 51 C 51 +C 52 3 n PRO . 52 C 52 +C 53 3 n SER . 53 C 53 +C 54 3 n GLU . 54 C 54 +C 55 3 n GLY . 55 C 55 +C 56 3 n LEU . 56 C 56 +C 57 3 n TYR . 57 C 57 +C 58 3 n LEU . 58 C 58 +C 59 3 n ILE . 59 C 59 +C 60 3 n TYR . 60 C 60 +C 61 3 n SER . 61 C 61 +C 62 3 n GLN . 62 C 62 +C 63 3 n VAL . 63 C 63 +C 64 3 n LEU . 64 C 64 +C 65 3 n PHE . 65 C 65 +C 66 3 n LYS . 66 C 66 +C 67 3 n GLY . 67 C 67 +C 68 3 n GLN . 68 C 68 +C 69 3 n GLY . 69 C 69 +C 70 3 n CYS . 70 C 70 +C 71 3 n PRO . 71 C 71 +C 72 3 n SER . 72 C 72 +C 73 3 n THR . 73 C 73 +C 74 3 n HIS . 74 C 74 +C 75 3 n VAL . 75 C 75 +C 76 3 n LEU . 76 C 76 +C 77 3 n LEU . 77 C 77 +C 78 3 n THR . 78 C 78 +C 79 3 n HIS . 79 C 79 +C 80 3 n THR . 80 C 80 +C 81 3 n ILE . 81 C 81 +C 82 3 n SER . 82 C 82 +C 83 3 n ARG . 83 C 83 +C 84 3 n ILE . 84 C 84 +C 85 3 n ALA . 85 C 85 +C 86 3 n VAL . 86 C 86 +C 87 3 n SER . 87 C 87 +C 88 3 n TYR . 88 C 88 +C 89 3 n GLN . 89 C 89 +C 90 3 n THR . 90 C 90 +C 91 3 n LYS . 91 C 91 +C 92 3 n VAL . 92 C 92 +C 93 3 n ASN . 93 C 93 +C 94 3 n LEU . 94 C 94 +C 95 3 n LEU . 95 C 95 +C 96 3 n SER . 96 C 96 +C 97 3 n ALA . 97 C 97 +C 98 3 n ILE . 98 C 98 +C 99 3 n LYS . 99 C 99 +C 100 3 n SER . 100 C 100 +C 101 3 n PRO . 101 C 101 +C 102 3 n CYS . 102 C 102 +C 103 3 n GLN . 103 C 103 +C 104 3 n ARG . 104 C 104 +C 105 3 n GLU . 105 C 105 +C 106 3 n THR . 106 C 106 +C 107 3 n PRO . 107 C 107 +C 108 3 n GLU . 108 C 108 +C 109 3 n GLY . 109 C 109 +C 110 3 n ALA . 110 C 110 +C 111 3 n GLU . 111 C 111 +C 112 3 n ALA . 112 C 112 +C 113 3 n LYS . 113 C 113 +C 114 3 n PRO . 114 C 114 +C 115 3 n TRP . 115 C 115 +C 116 3 n TYR . 116 C 116 +C 117 3 n GLU . 117 C 117 +C 118 3 n PRO . 118 C 118 +C 119 3 n ILE . 119 C 119 +C 120 3 n TYR . 120 C 120 +C 121 3 n LEU . 121 C 121 +C 122 3 n GLY . 122 C 122 +C 123 3 n GLY . 123 C 123 +C 124 3 n VAL . 124 C 124 +C 125 3 n PHE . 125 C 125 +C 126 3 n GLN . 126 C 126 +C 127 3 n LEU . 127 C 127 +C 128 3 n GLU . 128 C 128 +C 129 3 n LYS . 129 C 129 +C 130 3 n GLY . 130 C 130 +C 131 3 n ASP . 131 C 131 +C 132 3 n ARG . 132 C 132 +C 133 3 n LEU . 133 C 133 +C 134 3 n SER . 134 C 134 +C 135 3 n ALA . 135 C 135 +C 136 3 n GLU . 136 C 136 +C 137 3 n ILE . 137 C 137 +C 138 3 n ASN . 138 C 138 +C 139 3 n ARG . 139 C 139 +C 140 3 n PRO . 140 C 140 +C 141 3 n ASP . 141 C 141 +C 142 3 n TYR . 142 C 142 +C 143 3 n LEU . 143 C 143 +C 144 3 n ASP . 144 C 144 +C 145 3 n PHE . 145 C 145 +C 146 3 n ALA . 146 C 146 +C 147 3 n GLU . 147 C 147 +C 148 3 n SER . 148 C 148 +C 149 3 n GLY . 149 C 149 +C 150 3 n GLN . 150 C 150 +C 151 3 n VAL . 151 C 151 +C 152 3 n TYR . 152 C 152 +C 153 3 n PHE . 153 C 153 +C 154 3 n GLY . 154 C 154 +C 155 3 n ILE . 155 C 155 +C 156 3 n ILE . 156 C 156 +C 157 3 n ALA . 157 C 157 +C 158 3 n LEU . 158 C 158 +# +_software.classification other +_software.date ? +_software.description "Structure prediction" +_software.name AlphaFold +_software.pdbx_ordinal 1 +_software.type package +_software.version "AlphaFold-beta-20231127 (d3c3616777786d5c2fde0eec32f194ddbf1e3af0aeae51a7335bf26f1c13bd35)" +# +loop_ +_struct_asym.entity_id +_struct_asym.id +1 A +2 B +3 C +# +loop_ +_struct_conn.conn_type_id +_struct_conn.id +_struct_conn.pdbx_ptnr1_PDB_ins_code +_struct_conn.pdbx_ptnr1_label_alt_id +_struct_conn.pdbx_ptnr2_PDB_ins_code +_struct_conn.pdbx_ptnr2_label_alt_id +_struct_conn.pdbx_role +_struct_conn.pdbx_value_order +_struct_conn.ptnr1_auth_asym_id +_struct_conn.ptnr1_auth_seq_id +_struct_conn.ptnr1_label_asym_id +_struct_conn.ptnr1_label_atom_id +_struct_conn.ptnr1_label_comp_id +_struct_conn.ptnr1_label_seq_id +_struct_conn.ptnr1_symmetry +_struct_conn.ptnr2_auth_asym_id +_struct_conn.ptnr2_auth_seq_id +_struct_conn.ptnr2_label_asym_id +_struct_conn.ptnr2_label_atom_id +_struct_conn.ptnr2_label_comp_id +_struct_conn.ptnr2_label_seq_id +_struct_conn.ptnr2_symmetry +covale covale1 ? ? ? ? ? ? B 53 B OG SER 53 1_555 A 1 A C2 DSSO . 1_555 +covale covale2 ? ? ? ? ? ? C 66 C NZ LYS 66 1_555 A 1 A C16 DSSO . 1_555 +# +_struct_conn_type.criteria ? +_struct_conn_type.id covale +_struct_conn_type.reference ? +# +loop_ +_atom_site.group_PDB +_atom_site.id +_atom_site.type_symbol +_atom_site.label_atom_id +_atom_site.label_alt_id +_atom_site.label_comp_id +_atom_site.label_asym_id +_atom_site.label_entity_id +_atom_site.label_seq_id +_atom_site.pdbx_PDB_ins_code +_atom_site.Cartn_x +_atom_site.Cartn_y +_atom_site.Cartn_z +_atom_site.occupancy +_atom_site.B_iso_or_equiv +_atom_site.auth_seq_id +_atom_site.auth_asym_id +_atom_site.pdbx_PDB_model_num +HETATM 1 O O1 . DSSO A 1 . ? 9.261 -10.044 -8.374 1.00 64.63 1 A 1 +HETATM 2 C C2 . DSSO A 1 . ? 9.991 -9.578 -9.423 1.00 70.98 1 A 1 +HETATM 3 C C11 . DSSO A 1 . ? 11.249 -9.277 -9.318 1.00 70.35 1 A 1 +HETATM 4 C C12 . DSSO A 1 . ? 11.978 -10.522 -9.039 1.00 65.17 1 A 1 +HETATM 5 S S13 . DSSO A 1 . ? 13.670 -10.311 -9.180 1.00 60.07 1 A 1 +HETATM 6 C C14 . DSSO A 1 . ? 14.304 -11.640 -8.398 1.00 62.09 1 A 1 +HETATM 7 C C15 . DSSO A 1 . ? 15.194 -11.178 -7.388 1.00 63.74 1 A 1 +HETATM 8 C C16 . DSSO A 1 . ? 14.799 -11.400 -6.054 1.00 66.16 1 A 1 +HETATM 9 O O25 . DSSO A 1 . ? 13.752 -12.272 -5.879 1.00 56.49 1 A 1 +HETATM 10 O O26 . DSSO A 1 . ? 14.011 -10.439 -10.578 1.00 54.53 1 A 1 +ATOM 11 N N . GLU B 2 1 ? 9.431 9.450 -16.701 1.00 78.61 1 B 1 +ATOM 12 C CA . GLU B 2 1 ? 8.497 9.562 -15.567 1.00 85.71 1 B 1 +ATOM 13 C C . GLU B 2 1 ? 7.717 8.266 -15.429 1.00 87.93 1 B 1 +ATOM 14 O O . GLU B 2 1 ? 7.306 7.704 -16.447 1.00 84.58 1 B 1 +ATOM 15 C CB . GLU B 2 1 ? 7.573 10.759 -15.787 1.00 78.02 1 B 1 +ATOM 16 C CG . GLU B 2 1 ? 6.685 11.070 -14.577 1.00 63.34 1 B 1 +ATOM 17 C CD . GLU B 2 1 ? 5.780 12.292 -14.815 1.00 54.90 1 B 1 +ATOM 18 O OE1 . GLU B 2 1 ? 5.044 12.646 -13.880 1.00 45.12 1 B 1 +ATOM 19 O OE2 . GLU B 2 1 ? 5.812 12.848 -15.942 1.00 48.12 1 B 1 +ATOM 20 N N . VAL B 2 2 ? 7.543 7.757 -14.218 1.00 85.71 2 B 1 +ATOM 21 C CA . VAL B 2 2 ? 6.732 6.561 -13.962 1.00 86.32 2 B 1 +ATOM 22 C C . VAL B 2 2 ? 5.264 6.932 -14.095 1.00 88.98 2 B 1 +ATOM 23 O O . VAL B 2 2 ? 4.800 7.866 -13.444 1.00 88.51 2 B 1 +ATOM 24 C CB . VAL B 2 2 ? 7.019 5.955 -12.581 1.00 81.85 2 B 1 +ATOM 25 C CG1 . VAL B 2 2 ? 6.093 4.777 -12.275 1.00 77.95 2 B 1 +ATOM 26 C CG2 . VAL B 2 2 ? 8.471 5.469 -12.496 1.00 77.42 2 B 1 +ATOM 27 N N . LYS B 2 3 ? 4.520 6.183 -14.908 1.00 92.09 3 B 1 +ATOM 28 C CA . LYS B 2 3 ? 3.097 6.401 -15.131 1.00 93.38 3 B 1 +ATOM 29 C C . LYS B 2 3 ? 2.342 5.079 -15.099 1.00 94.11 3 B 1 +ATOM 30 O O . LYS B 2 3 ? 2.781 4.099 -15.702 1.00 93.89 3 B 1 +ATOM 31 C CB . LYS B 2 3 ? 2.909 7.145 -16.457 1.00 92.73 3 B 1 +ATOM 32 C CG . LYS B 2 3 ? 1.528 7.794 -16.557 1.00 81.66 3 B 1 +ATOM 33 C CD . LYS B 2 3 ? 1.342 8.445 -17.923 1.00 81.22 3 B 1 +ATOM 34 C CE . LYS B 2 3 ? 0.046 9.241 -17.930 1.00 70.59 3 B 1 +ATOM 35 N NZ . LYS B 2 3 ? -0.378 9.571 -19.305 1.00 62.58 3 B 1 +ATOM 36 N N . LEU B 2 4 ? 1.206 5.075 -14.411 1.00 96.22 4 B 1 +ATOM 37 C CA . LEU B 2 4 ? 0.249 3.977 -14.360 1.00 96.55 4 B 1 +ATOM 38 C C . LEU B 2 4 ? -1.110 4.519 -14.802 1.00 97.01 4 B 1 +ATOM 39 O O . LEU B 2 4 ? -1.569 5.530 -14.274 1.00 96.32 4 B 1 +ATOM 40 C CB . LEU B 2 4 ? 0.192 3.396 -12.937 1.00 95.51 4 B 1 +ATOM 41 C CG . LEU B 2 4 ? 1.512 2.807 -12.402 1.00 93.66 4 B 1 +ATOM 42 C CD1 . LEU B 2 4 ? 1.329 2.321 -10.968 1.00 90.99 4 B 1 +ATOM 43 C CD2 . LEU B 2 4 ? 1.989 1.617 -13.231 1.00 90.14 4 B 1 +ATOM 44 N N . GLU B 2 5 ? -1.740 3.879 -15.783 1.00 97.31 5 B 1 +ATOM 45 C CA . GLU B 2 5 ? -3.026 4.305 -16.337 1.00 97.52 5 B 1 +ATOM 46 C C . GLU B 2 5 ? -4.034 3.161 -16.296 1.00 97.86 5 B 1 +ATOM 47 O O . GLU B 2 5 ? -3.942 2.195 -17.065 1.00 97.40 5 B 1 +ATOM 48 C CB . GLU B 2 5 ? -2.871 4.834 -17.770 1.00 96.73 5 B 1 +ATOM 49 C CG . GLU B 2 5 ? -2.093 6.148 -17.828 1.00 87.53 5 B 1 +ATOM 50 C CD . GLU B 2 5 ? -2.097 6.771 -19.233 1.00 81.00 5 B 1 +ATOM 51 O OE1 . GLU B 2 5 ? -2.404 7.980 -19.340 1.00 75.16 5 B 1 +ATOM 52 O OE2 . GLU B 2 5 ? -1.721 6.098 -20.210 1.00 74.49 5 B 1 +ATOM 53 N N . GLU B 2 6 ? -5.024 3.290 -15.430 1.00 97.75 6 B 1 +ATOM 54 C CA . GLU B 2 6 ? -6.116 2.339 -15.316 1.00 97.74 6 B 1 +ATOM 55 C C . GLU B 2 6 ? -7.232 2.607 -16.331 1.00 97.60 6 B 1 +ATOM 56 O O . GLU B 2 6 ? -7.544 3.733 -16.716 1.00 96.47 6 B 1 +ATOM 57 C CB . GLU B 2 6 ? -6.704 2.301 -13.897 1.00 96.82 6 B 1 +ATOM 58 C CG . GLU B 2 6 ? -5.685 1.992 -12.793 1.00 94.13 6 B 1 +ATOM 59 C CD . GLU B 2 6 ? -5.053 3.244 -12.176 1.00 95.85 6 B 1 +ATOM 60 O OE1 . GLU B 2 6 ? -4.632 3.157 -11.004 1.00 91.97 6 B 1 +ATOM 61 O OE2 . GLU B 2 6 ? -5.006 4.309 -12.831 1.00 92.87 6 B 1 +ATOM 62 N N . SER B 2 7 ? -7.881 1.520 -16.752 1.00 97.17 7 B 1 +ATOM 63 C CA . SER B 2 7 ? -9.045 1.562 -17.632 1.00 96.85 7 B 1 +ATOM 64 C C . SER B 2 7 ? -9.950 0.349 -17.410 1.00 96.98 7 B 1 +ATOM 65 O O . SER B 2 7 ? -9.576 -0.618 -16.745 1.00 96.17 7 B 1 +ATOM 66 C CB . SER B 2 7 ? -8.587 1.656 -19.094 1.00 95.82 7 B 1 +ATOM 67 O OG . SER B 2 7 ? -7.776 0.546 -19.445 1.00 92.32 7 B 1 +ATOM 68 N N . GLY B 2 8 ? -11.146 0.378 -17.992 1.00 95.46 8 B 1 +ATOM 69 C CA . GLY B 2 8 ? -12.106 -0.734 -17.946 1.00 94.96 8 B 1 +ATOM 70 C C . GLY B 2 8 ? -13.169 -0.629 -16.853 1.00 94.92 8 B 1 +ATOM 71 O O . GLY B 2 8 ? -14.075 -1.462 -16.829 1.00 91.33 8 B 1 +ATOM 72 N N . GLY B 2 9 ? -13.104 0.378 -16.003 1.00 93.85 9 B 1 +ATOM 73 C CA . GLY B 2 9 ? -14.175 0.689 -15.062 1.00 93.30 9 B 1 +ATOM 74 C C . GLY B 2 9 ? -15.474 1.117 -15.761 1.00 93.34 9 B 1 +ATOM 75 O O . GLY B 2 9 ? -15.502 1.429 -16.954 1.00 90.88 9 B 1 +ATOM 76 N N . GLY B 2 10 ? -16.562 1.121 -15.011 1.00 92.51 10 B 1 +ATOM 77 C CA . GLY B 2 10 ? -17.886 1.469 -15.507 1.00 91.90 10 B 1 +ATOM 78 C C . GLY B 2 10 ? -19.004 0.880 -14.650 1.00 93.38 10 B 1 +ATOM 79 O O . GLY B 2 10 ? -18.777 0.408 -13.538 1.00 92.94 10 B 1 +ATOM 80 N N . LEU B 2 11 ? -20.216 0.915 -15.200 1.00 93.40 11 B 1 +ATOM 81 C CA . LEU B 2 11 ? -21.387 0.314 -14.572 1.00 94.28 11 B 1 +ATOM 82 C C . LEU B 2 11 ? -21.518 -1.151 -14.998 1.00 94.73 11 B 1 +ATOM 83 O O . LEU B 2 11 ? -21.453 -1.466 -16.185 1.00 94.11 11 B 1 +ATOM 84 C CB . LEU B 2 11 ? -22.629 1.139 -14.939 1.00 93.93 11 B 1 +ATOM 85 C CG . LEU B 2 11 ? -23.944 0.634 -14.310 1.00 93.51 11 B 1 +ATOM 86 C CD1 . LEU B 2 11 ? -23.924 0.701 -12.782 1.00 91.42 11 B 1 +ATOM 87 C CD2 . LEU B 2 11 ? -25.103 1.498 -14.806 1.00 91.13 11 B 1 +ATOM 88 N N . VAL B 2 12 ? -21.750 -2.031 -14.026 1.00 95.15 12 B 1 +ATOM 89 C CA . VAL B 2 12 ? -22.040 -3.449 -14.240 1.00 95.67 12 B 1 +ATOM 90 C C . VAL B 2 12 ? -23.149 -3.887 -13.287 1.00 95.67 12 B 1 +ATOM 91 O O . VAL B 2 12 ? -23.304 -3.331 -12.198 1.00 95.11 12 B 1 +ATOM 92 C CB . VAL B 2 12 ? -20.752 -4.281 -14.101 1.00 95.40 12 B 1 +ATOM 93 C CG1 . VAL B 2 12 ? -20.175 -4.231 -12.686 1.00 90.66 12 B 1 +ATOM 94 C CG2 . VAL B 2 12 ? -20.952 -5.736 -14.515 1.00 88.25 12 B 1 +ATOM 95 N N . GLN B 2 13 ? -23.955 -4.860 -13.702 1.00 95.65 13 B 1 +ATOM 96 C CA . GLN B 2 13 ? -25.001 -5.401 -12.838 1.00 95.74 13 B 1 +ATOM 97 C C . GLN B 2 13 ? -24.422 -6.381 -11.807 1.00 96.58 13 B 1 +ATOM 98 O O . GLN B 2 13 ? -23.417 -7.040 -12.098 1.00 96.46 13 B 1 +ATOM 99 C CB . GLN B 2 13 ? -26.113 -6.056 -13.662 1.00 94.24 13 B 1 +ATOM 100 C CG . GLN B 2 13 ? -26.864 -5.027 -14.524 1.00 85.96 13 B 1 +ATOM 101 C CD . GLN B 2 13 ? -28.354 -5.316 -14.681 1.00 80.21 13 B 1 +ATOM 102 O OE1 . GLN B 2 13 ? -28.871 -6.364 -14.343 1.00 71.07 13 B 1 +ATOM 103 N NE2 . GLN B 2 13 ? -29.116 -4.366 -15.181 1.00 65.77 13 B 1 +ATOM 104 N N . PRO B 2 14 ? -25.060 -6.532 -10.626 1.00 96.86 14 B 1 +ATOM 105 C CA . PRO B 2 14 ? -24.727 -7.593 -9.685 1.00 97.14 14 B 1 +ATOM 106 C C . PRO B 2 14 ? -24.736 -8.972 -10.363 1.00 97.50 14 B 1 +ATOM 107 O O . PRO B 2 14 ? -25.599 -9.257 -11.190 1.00 96.79 14 B 1 +ATOM 108 C CB . PRO B 2 14 ? -25.782 -7.502 -8.573 1.00 95.91 14 B 1 +ATOM 109 C CG . PRO B 2 14 ? -26.227 -6.044 -8.627 1.00 93.83 14 B 1 +ATOM 110 C CD . PRO B 2 14 ? -26.143 -5.711 -10.110 1.00 96.20 14 B 1 +ATOM 111 N N . GLY B 2 15 ? -23.744 -9.803 -10.042 1.00 98.00 15 B 1 +ATOM 112 C CA . GLY B 2 15 ? -23.494 -11.089 -10.698 1.00 98.07 15 B 1 +ATOM 113 C C . GLY B 2 15 ? -22.744 -10.992 -12.033 1.00 98.34 15 B 1 +ATOM 114 O O . GLY B 2 15 ? -22.305 -12.008 -12.570 1.00 97.42 15 B 1 +ATOM 115 N N . GLY B 2 16 ? -22.562 -9.784 -12.563 1.00 98.18 16 B 1 +ATOM 116 C CA . GLY B 2 16 ? -21.849 -9.541 -13.807 1.00 98.13 16 B 1 +ATOM 117 C C . GLY B 2 16 ? -20.332 -9.722 -13.705 1.00 98.46 16 B 1 +ATOM 118 O O . GLY B 2 16 ? -19.764 -10.046 -12.659 1.00 98.16 16 B 1 +ATOM 119 N N . SER B 2 17 ? -19.673 -9.486 -14.837 1.00 98.47 17 B 1 +ATOM 120 C CA . SER B 2 17 ? -18.215 -9.558 -14.959 1.00 98.46 17 B 1 +ATOM 121 C C . SER B 2 17 ? -17.650 -8.274 -15.558 1.00 98.43 17 B 1 +ATOM 122 O O . SER B 2 17 ? -18.282 -7.633 -16.396 1.00 97.61 17 B 1 +ATOM 123 C CB . SER B 2 17 ? -17.797 -10.760 -15.811 1.00 97.85 17 B 1 +ATOM 124 O OG . SER B 2 17 ? -18.236 -11.970 -15.222 1.00 86.40 17 B 1 +ATOM 125 N N . MET B 2 18 ? -16.425 -7.916 -15.160 1.00 98.29 18 B 1 +ATOM 126 C CA . MET B 2 18 ? -15.703 -6.760 -15.684 1.00 98.06 18 B 1 +ATOM 127 C C . MET B 2 18 ? -14.209 -7.063 -15.701 1.00 98.44 18 B 1 +ATOM 128 O O . MET B 2 18 ? -13.705 -7.794 -14.847 1.00 98.08 18 B 1 +ATOM 129 C CB . MET B 2 18 ? -16.014 -5.527 -14.817 1.00 96.46 18 B 1 +ATOM 130 C CG . MET B 2 18 ? -15.540 -4.210 -15.448 1.00 87.48 18 B 1 +ATOM 131 S SD . MET B 2 18 ? -16.506 -3.679 -16.894 1.00 82.19 18 B 1 +ATOM 132 C CE . MET B 2 18 ? -17.898 -2.870 -16.077 1.00 73.95 18 B 1 +ATOM 133 N N . LYS B 2 19 ? -13.477 -6.501 -16.670 1.00 98.53 19 B 1 +ATOM 134 C CA . LYS B 2 19 ? -12.019 -6.610 -16.730 1.00 98.55 19 B 1 +ATOM 135 C C . LYS B 2 19 ? -11.400 -5.226 -16.654 1.00 98.53 19 B 1 +ATOM 136 O O . LYS B 2 19 ? -11.588 -4.424 -17.564 1.00 98.10 19 B 1 +ATOM 137 C CB . LYS B 2 19 ? -11.593 -7.379 -17.989 1.00 98.20 19 B 1 +ATOM 138 C CG . LYS B 2 19 ? -10.073 -7.614 -18.005 1.00 95.94 19 B 1 +ATOM 139 C CD . LYS B 2 19 ? -9.643 -8.406 -19.250 1.00 93.55 19 B 1 +ATOM 140 C CE . LYS B 2 19 ? -8.125 -8.594 -19.206 1.00 84.95 19 B 1 +ATOM 141 N NZ . LYS B 2 19 ? -7.600 -9.318 -20.391 1.00 78.26 19 B 1 +ATOM 142 N N . LEU B 2 20 ? -10.631 -4.985 -15.611 1.00 98.72 20 B 1 +ATOM 143 C CA . LEU B 2 20 ? -9.812 -3.785 -15.492 1.00 98.73 20 B 1 +ATOM 144 C C . LEU B 2 20 ? -8.442 -4.020 -16.127 1.00 98.75 20 B 1 +ATOM 145 O O . LEU B 2 20 ? -7.915 -5.135 -16.109 1.00 98.49 20 B 1 +ATOM 146 C CB . LEU B 2 20 ? -9.686 -3.344 -14.025 1.00 98.58 20 B 1 +ATOM 147 C CG . LEU B 2 20 ? -11.008 -3.212 -13.253 1.00 97.99 20 B 1 +ATOM 148 C CD1 . LEU B 2 20 ? -10.724 -2.683 -11.850 1.00 97.45 20 B 1 +ATOM 149 C CD2 . LEU B 2 20 ? -11.996 -2.269 -13.942 1.00 97.20 20 B 1 +ATOM 150 N N . SER B 2 21 ? -7.877 -2.962 -16.680 1.00 98.62 21 B 1 +ATOM 151 C CA . SER B 2 21 ? -6.528 -2.955 -17.240 1.00 98.55 21 B 1 +ATOM 152 C C . SER B 2 21 ? -5.755 -1.773 -16.676 1.00 98.55 21 B 1 +ATOM 153 O O . SER B 2 21 ? -6.325 -0.698 -16.511 1.00 97.93 21 B 1 +ATOM 154 C CB . SER B 2 21 ? -6.573 -2.863 -18.770 1.00 97.95 21 B 1 +ATOM 155 O OG . SER B 2 21 ? -7.375 -3.903 -19.316 1.00 85.23 21 B 1 +ATOM 156 N N . CYS B 2 22 ? -4.472 -1.976 -16.419 1.00 98.61 22 B 1 +ATOM 157 C CA . CYS B 2 22 ? -3.540 -0.915 -16.071 1.00 98.44 22 B 1 +ATOM 158 C C . CYS B 2 22 ? -2.317 -1.048 -16.966 1.00 98.46 22 B 1 +ATOM 159 O O . CYS B 2 22 ? -1.725 -2.124 -17.036 1.00 97.85 22 B 1 +ATOM 160 C CB . CYS B 2 22 ? -3.202 -1.013 -14.580 1.00 97.69 22 B 1 +ATOM 161 S SG . CYS B 2 22 ? -1.705 -0.121 -14.087 1.00 95.84 22 B 1 +ATOM 162 N N . VAL B 2 23 ? -1.960 0.025 -17.658 1.00 98.19 23 B 1 +ATOM 163 C CA . VAL B 2 23 ? -0.770 0.092 -18.506 1.00 98.14 23 B 1 +ATOM 164 C C . VAL B 2 23 ? 0.271 0.954 -17.812 1.00 97.83 23 B 1 +ATOM 165 O O . VAL B 2 23 ? -0.013 2.074 -17.388 1.00 96.98 23 B 1 +ATOM 166 C CB . VAL B 2 23 ? -1.097 0.605 -19.918 1.00 97.78 23 B 1 +ATOM 167 C CG1 . VAL B 2 23 ? 0.157 0.640 -20.793 1.00 93.58 23 B 1 +ATOM 168 C CG2 . VAL B 2 23 ? -2.119 -0.311 -20.603 1.00 93.16 23 B 1 +ATOM 169 N N . ALA B 2 24 ? 1.476 0.411 -17.705 1.00 97.06 24 B 1 +ATOM 170 C CA . ALA B 2 24 ? 2.605 1.039 -17.052 1.00 96.33 24 B 1 +ATOM 171 C C . ALA B 2 24 ? 3.609 1.582 -18.076 1.00 96.47 24 B 1 +ATOM 172 O O . ALA B 2 24 ? 3.804 1.009 -19.149 1.00 95.52 24 B 1 +ATOM 173 C CB . ALA B 2 24 ? 3.233 0.011 -16.110 1.00 94.49 24 B 1 +ATOM 174 N N . SER B 2 25 ? 4.278 2.671 -17.727 1.00 94.16 25 B 1 +ATOM 175 C CA . SER B 2 25 ? 5.370 3.248 -18.513 1.00 93.10 25 B 1 +ATOM 176 C C . SER B 2 25 ? 6.416 3.917 -17.620 1.00 91.60 25 B 1 +ATOM 177 O O . SER B 2 25 ? 6.172 4.172 -16.441 1.00 89.50 25 B 1 +ATOM 178 C CB . SER B 2 25 ? 4.812 4.227 -19.554 1.00 92.10 25 B 1 +ATOM 179 O OG . SER B 2 25 ? 4.108 5.292 -18.938 1.00 86.58 25 B 1 +ATOM 180 N N . GLY B 2 26 ? 7.593 4.181 -18.179 1.00 88.55 26 B 1 +ATOM 181 C CA . GLY B 2 26 ? 8.674 4.892 -17.483 1.00 86.04 26 B 1 +ATOM 182 C C . GLY B 2 26 ? 9.539 4.033 -16.556 1.00 84.94 26 B 1 +ATOM 183 O O . GLY B 2 26 ? 10.416 4.570 -15.889 1.00 81.61 26 B 1 +ATOM 184 N N . PHE B 2 27 ? 9.328 2.714 -16.523 1.00 82.27 27 B 1 +ATOM 185 C CA . PHE B 2 27 ? 10.158 1.779 -15.758 1.00 82.46 27 B 1 +ATOM 186 C C . PHE B 2 27 ? 10.138 0.371 -16.365 1.00 81.97 27 B 1 +ATOM 187 O O . PHE B 2 27 ? 9.298 0.049 -17.201 1.00 82.25 27 B 1 +ATOM 188 C CB . PHE B 2 27 ? 9.695 1.746 -14.295 1.00 83.44 27 B 1 +ATOM 189 C CG . PHE B 2 27 ? 8.326 1.136 -14.063 1.00 83.89 27 B 1 +ATOM 190 C CD1 . PHE B 2 27 ? 7.161 1.910 -14.229 1.00 84.20 27 B 1 +ATOM 191 C CD2 . PHE B 2 27 ? 8.206 -0.199 -13.642 1.00 84.51 27 B 1 +ATOM 192 C CE1 . PHE B 2 27 ? 5.898 1.360 -13.965 1.00 83.99 27 B 1 +ATOM 193 C CE2 . PHE B 2 27 ? 6.944 -0.756 -13.376 1.00 83.63 27 B 1 +ATOM 194 C CZ . PHE B 2 27 ? 5.791 0.026 -13.533 1.00 84.43 27 B 1 +ATOM 195 N N . ILE B 2 28 ? 11.045 -0.494 -15.916 1.00 79.85 28 B 1 +ATOM 196 C CA . ILE B 2 28 ? 11.093 -1.901 -16.340 1.00 78.77 28 B 1 +ATOM 197 C C . ILE B 2 28 ? 9.995 -2.679 -15.608 1.00 79.94 28 B 1 +ATOM 198 O O . ILE B 2 28 ? 10.182 -3.164 -14.496 1.00 79.51 28 B 1 +ATOM 199 C CB . ILE B 2 28 ? 12.497 -2.506 -16.143 1.00 75.58 28 B 1 +ATOM 200 C CG1 . ILE B 2 28 ? 13.549 -1.674 -16.917 1.00 70.70 28 B 1 +ATOM 201 C CG2 . ILE B 2 28 ? 12.507 -3.965 -16.630 1.00 70.29 28 B 1 +ATOM 202 C CD1 . ILE B 2 28 ? 14.978 -2.153 -16.714 1.00 63.60 28 B 1 +ATOM 203 N N . PHE B 2 29 ? 8.843 -2.818 -16.259 1.00 87.20 29 B 1 +ATOM 204 C CA . PHE B 2 29 ? 7.651 -3.448 -15.692 1.00 88.56 29 B 1 +ATOM 205 C C . PHE B 2 29 ? 7.887 -4.890 -15.211 1.00 86.83 29 B 1 +ATOM 206 O O . PHE B 2 29 ? 7.420 -5.276 -14.143 1.00 85.41 29 B 1 +ATOM 207 C CB . PHE B 2 29 ? 6.546 -3.410 -16.749 1.00 90.69 29 B 1 +ATOM 208 C CG . PHE B 2 29 ? 5.252 -4.044 -16.301 1.00 92.27 29 B 1 +ATOM 209 C CD1 . PHE B 2 29 ? 4.926 -5.353 -16.696 1.00 91.97 29 B 1 +ATOM 210 C CD2 . PHE B 2 29 ? 4.356 -3.318 -15.499 1.00 92.39 29 B 1 +ATOM 211 C CE1 . PHE B 2 29 ? 3.708 -5.923 -16.302 1.00 92.72 29 B 1 +ATOM 212 C CE2 . PHE B 2 29 ? 3.141 -3.882 -15.108 1.00 92.84 29 B 1 +ATOM 213 C CZ . PHE B 2 29 ? 2.813 -5.186 -15.511 1.00 94.03 29 B 1 +ATOM 214 N N . SER B 2 30 ? 8.647 -5.674 -15.965 1.00 86.19 30 B 1 +ATOM 215 C CA . SER B 2 30 ? 8.941 -7.077 -15.652 1.00 83.52 30 B 1 +ATOM 216 C C . SER B 2 30 ? 9.675 -7.288 -14.326 1.00 81.63 30 B 1 +ATOM 217 O O . SER B 2 30 ? 9.649 -8.393 -13.790 1.00 79.17 30 B 1 +ATOM 218 C CB . SER B 2 30 ? 9.768 -7.689 -16.781 1.00 82.57 30 B 1 +ATOM 219 O OG . SER B 2 30 ? 10.957 -6.951 -16.987 1.00 78.67 30 B 1 +ATOM 220 N N . ASN B 2 31 ? 10.296 -6.250 -13.789 1.00 76.85 31 B 1 +ATOM 221 C CA . ASN B 2 31 ? 11.071 -6.293 -12.554 1.00 74.22 31 B 1 +ATOM 222 C C . ASN B 2 31 ? 10.272 -5.893 -11.308 1.00 74.84 31 B 1 +ATOM 223 O O . ASN B 2 31 ? 10.833 -5.855 -10.218 1.00 73.10 31 B 1 +ATOM 224 C CB . ASN B 2 31 ? 12.314 -5.410 -12.734 1.00 70.89 31 B 1 +ATOM 225 C CG . ASN B 2 31 ? 13.358 -6.025 -13.651 1.00 66.45 31 B 1 +ATOM 226 O OD1 . ASN B 2 31 ? 13.282 -7.165 -14.068 1.00 62.37 31 B 1 +ATOM 227 N ND2 . ASN B 2 31 ? 14.393 -5.277 -13.969 1.00 60.62 31 B 1 +ATOM 228 N N . HIS B 2 32 ? 8.988 -5.584 -11.451 1.00 82.76 32 B 1 +ATOM 229 C CA . HIS B 2 32 ? 8.185 -5.083 -10.341 1.00 83.53 32 B 1 +ATOM 230 C C . HIS B 2 32 ? 6.996 -5.988 -10.032 1.00 85.63 32 B 1 +ATOM 231 O O . HIS B 2 32 ? 6.457 -6.670 -10.907 1.00 85.63 32 B 1 +ATOM 232 C CB . HIS B 2 32 ? 7.752 -3.643 -10.633 1.00 81.94 32 B 1 +ATOM 233 C CG . HIS B 2 32 ? 8.917 -2.698 -10.669 1.00 79.66 32 B 1 +ATOM 234 N ND1 . HIS B 2 32 ? 9.769 -2.490 -11.734 1.00 71.26 32 B 1 +ATOM 235 C CD2 . HIS B 2 32 ? 9.369 -1.908 -9.644 1.00 71.07 32 B 1 +ATOM 236 C CE1 . HIS B 2 32 ? 10.701 -1.603 -11.359 1.00 70.13 32 B 1 +ATOM 237 N NE2 . HIS B 2 32 ? 10.494 -1.223 -10.098 1.00 71.04 32 B 1 +ATOM 238 N N . TRP B 2 33 ? 6.582 -5.975 -8.774 1.00 84.19 33 B 1 +ATOM 239 C CA . TRP B 2 33 ? 5.285 -6.499 -8.378 1.00 84.18 33 B 1 +ATOM 240 C C . TRP B 2 33 ? 4.221 -5.462 -8.716 1.00 86.68 33 B 1 +ATOM 241 O O . TRP B 2 33 ? 4.471 -4.257 -8.681 1.00 86.47 33 B 1 +ATOM 242 C CB . TRP B 2 33 ? 5.277 -6.860 -6.888 1.00 80.45 33 B 1 +ATOM 243 C CG . TRP B 2 33 ? 6.284 -7.868 -6.426 1.00 76.45 33 B 1 +ATOM 244 C CD1 . TRP B 2 33 ? 7.309 -8.378 -7.142 1.00 68.10 33 B 1 +ATOM 245 C CD2 . TRP B 2 33 ? 6.376 -8.495 -5.108 1.00 71.38 33 B 1 +ATOM 246 N NE1 . TRP B 2 33 ? 8.038 -9.272 -6.360 1.00 65.55 33 B 1 +ATOM 247 C CE2 . TRP B 2 33 ? 7.501 -9.366 -5.106 1.00 68.18 33 B 1 +ATOM 248 C CE3 . TRP B 2 33 ? 5.627 -8.394 -3.920 1.00 62.46 33 B 1 +ATOM 249 C CZ2 . TRP B 2 33 ? 7.867 -10.115 -3.964 1.00 59.22 33 B 1 +ATOM 250 C CZ3 . TRP B 2 33 ? 5.993 -9.139 -2.784 1.00 59.79 33 B 1 +ATOM 251 C CH2 . TRP B 2 33 ? 7.102 -9.987 -2.811 1.00 60.49 33 B 1 +ATOM 252 N N . MET B 2 34 ? 3.036 -5.925 -9.064 1.00 91.73 34 B 1 +ATOM 253 C CA . MET B 2 34 ? 1.911 -5.052 -9.365 1.00 93.05 34 B 1 +ATOM 254 C C . MET B 2 34 ? 0.724 -5.437 -8.497 1.00 93.30 34 B 1 +ATOM 255 O O . MET B 2 34 ? 0.481 -6.623 -8.259 1.00 92.85 34 B 1 +ATOM 256 C CB . MET B 2 34 ? 1.556 -5.122 -10.852 1.00 93.75 34 B 1 +ATOM 257 C CG . MET B 2 34 ? 2.683 -4.643 -11.774 1.00 92.70 34 B 1 +ATOM 258 S SD . MET B 2 34 ? 3.245 -2.932 -11.547 1.00 92.55 34 B 1 +ATOM 259 C CE . MET B 2 34 ? 1.729 -2.011 -11.853 1.00 88.88 34 B 1 +ATOM 260 N N . ASN B 2 35 ? -0.022 -4.442 -8.052 1.00 94.02 35 B 1 +ATOM 261 C CA . ASN B 2 35 ? -1.167 -4.627 -7.178 1.00 93.87 35 B 1 +ATOM 262 C C . ASN B 2 35 ? -2.395 -3.919 -7.727 1.00 95.59 35 B 1 +ATOM 263 O O . ASN B 2 35 ? -2.300 -2.919 -8.439 1.00 95.55 35 B 1 +ATOM 264 C CB . ASN B 2 35 ? -0.836 -4.137 -5.756 1.00 90.82 35 B 1 +ATOM 265 C CG . ASN B 2 35 ? 0.379 -4.837 -5.176 1.00 85.70 35 B 1 +ATOM 266 O OD1 . ASN B 2 35 ? 0.280 -5.882 -4.566 1.00 75.98 35 B 1 +ATOM 267 N ND2 . ASN B 2 35 ? 1.555 -4.277 -5.373 1.00 73.59 35 B 1 +ATOM 268 N N . TRP B 2 36 ? -3.552 -4.430 -7.335 1.00 95.67 36 B 1 +ATOM 269 C CA . TRP B 2 36 ? -4.810 -3.709 -7.372 1.00 96.52 36 B 1 +ATOM 270 C C . TRP B 2 36 ? -5.241 -3.405 -5.944 1.00 95.83 36 B 1 +ATOM 271 O O . TRP B 2 36 ? -5.284 -4.293 -5.088 1.00 94.98 36 B 1 +ATOM 272 C CB . TRP B 2 36 ? -5.857 -4.504 -8.135 1.00 97.32 36 B 1 +ATOM 273 C CG . TRP B 2 36 ? -5.624 -4.519 -9.615 1.00 97.71 36 B 1 +ATOM 274 C CD1 . TRP B 2 36 ? -4.994 -5.497 -10.305 1.00 97.41 36 B 1 +ATOM 275 C CD2 . TRP B 2 36 ? -5.993 -3.495 -10.593 1.00 97.94 36 B 1 +ATOM 276 N NE1 . TRP B 2 36 ? -4.957 -5.161 -11.655 1.00 97.78 36 B 1 +ATOM 277 C CE2 . TRP B 2 36 ? -5.563 -3.942 -11.870 1.00 98.01 36 B 1 +ATOM 278 C CE3 . TRP B 2 36 ? -6.650 -2.250 -10.513 1.00 98.19 36 B 1 +ATOM 279 C CZ2 . TRP B 2 36 ? -5.785 -3.181 -13.041 1.00 98.13 36 B 1 +ATOM 280 C CZ3 . TRP B 2 36 ? -6.871 -1.491 -11.678 1.00 97.88 36 B 1 +ATOM 281 C CH2 . TRP B 2 36 ? -6.440 -1.954 -12.927 1.00 97.92 36 B 1 +ATOM 282 N N . VAL B 2 37 ? -5.579 -2.144 -5.721 1.00 96.21 37 B 1 +ATOM 283 C CA . VAL B 2 37 ? -6.120 -1.637 -4.459 1.00 95.72 37 B 1 +ATOM 284 C C . VAL B 2 37 ? -7.412 -0.905 -4.791 1.00 96.42 37 B 1 +ATOM 285 O O . VAL B 2 37 ? -7.507 -0.274 -5.839 1.00 96.31 37 B 1 +ATOM 286 C CB . VAL B 2 37 ? -5.107 -0.717 -3.753 1.00 93.76 37 B 1 +ATOM 287 C CG1 . VAL B 2 37 ? -5.608 -0.294 -2.376 1.00 89.04 37 B 1 +ATOM 288 C CG2 . VAL B 2 37 ? -3.753 -1.407 -3.559 1.00 88.44 37 B 1 +ATOM 289 N N . ARG B 2 38 ? -8.417 -0.990 -3.941 1.00 96.85 38 B 1 +ATOM 290 C CA . ARG B 2 38 ? -9.674 -0.262 -4.145 1.00 97.25 38 B 1 +ATOM 291 C C . ARG B 2 38 ? -9.977 0.664 -2.981 1.00 96.82 38 B 1 +ATOM 292 O O . ARG B 2 38 ? -9.586 0.395 -1.849 1.00 95.86 38 B 1 +ATOM 293 C CB . ARG B 2 38 ? -10.822 -1.235 -4.455 1.00 97.22 38 B 1 +ATOM 294 C CG . ARG B 2 38 ? -11.238 -2.098 -3.256 1.00 97.31 38 B 1 +ATOM 295 C CD . ARG B 2 38 ? -12.317 -3.091 -3.696 1.00 96.64 38 B 1 +ATOM 296 N NE . ARG B 2 38 ? -12.744 -3.958 -2.592 1.00 96.78 38 B 1 +ATOM 297 C CZ . ARG B 2 38 ? -13.536 -5.011 -2.688 1.00 96.94 38 B 1 +ATOM 298 N NH1 . ARG B 2 38 ? -14.057 -5.382 -3.824 1.00 95.68 38 B 1 +ATOM 299 N NH2 . ARG B 2 38 ? -13.812 -5.710 -1.631 1.00 95.83 38 B 1 +ATOM 300 N N . GLN B 2 39 ? -10.720 1.720 -3.267 1.00 96.56 39 B 1 +ATOM 301 C CA . GLN B 2 39 ? -11.223 2.648 -2.267 1.00 96.41 39 B 1 +ATOM 302 C C . GLN B 2 39 ? -12.736 2.763 -2.388 1.00 96.64 39 B 1 +ATOM 303 O O . GLN B 2 39 ? -13.261 3.058 -3.461 1.00 96.03 39 B 1 +ATOM 304 C CB . GLN B 2 39 ? -10.518 3.997 -2.415 1.00 95.06 39 B 1 +ATOM 305 C CG . GLN B 2 39 ? -10.822 4.930 -1.238 1.00 90.51 39 B 1 +ATOM 306 C CD . GLN B 2 39 ? -10.053 6.251 -1.325 1.00 87.57 39 B 1 +ATOM 307 O OE1 . GLN B 2 39 ? -9.574 6.669 -2.365 1.00 79.72 39 B 1 +ATOM 308 N NE2 . GLN B 2 39 ? -9.912 6.958 -0.226 1.00 76.11 39 B 1 +ATOM 309 N N . SER B 2 40 ? -13.428 2.550 -1.277 1.00 94.56 40 B 1 +ATOM 310 C CA . SER B 2 40 ? -14.866 2.776 -1.156 1.00 93.90 40 B 1 +ATOM 311 C C . SER B 2 40 ? -15.155 3.666 0.053 1.00 93.14 40 B 1 +ATOM 312 O O . SER B 2 40 ? -14.373 3.666 1.008 1.00 90.94 40 B 1 +ATOM 313 C CB . SER B 2 40 ? -15.623 1.445 -1.064 1.00 92.69 40 B 1 +ATOM 314 O OG . SER B 2 40 ? -15.371 0.776 0.157 1.00 87.06 40 B 1 +ATOM 315 N N . PRO B 2 41 ? -16.287 4.408 0.047 1.00 89.63 41 B 1 +ATOM 316 C CA . PRO B 2 41 ? -16.660 5.234 1.199 1.00 87.04 41 B 1 +ATOM 317 C C . PRO B 2 41 ? -16.836 4.431 2.495 1.00 87.96 41 B 1 +ATOM 318 O O . PRO B 2 41 ? -16.540 4.930 3.575 1.00 84.37 41 B 1 +ATOM 319 C CB . PRO B 2 41 ? -17.972 5.921 0.792 1.00 83.78 41 B 1 +ATOM 320 C CG . PRO B 2 41 ? -17.924 5.923 -0.738 1.00 81.65 41 B 1 +ATOM 321 C CD . PRO B 2 41 ? -17.206 4.615 -1.056 1.00 84.48 41 B 1 +ATOM 322 N N . GLU B 2 42 ? -17.304 3.183 2.385 1.00 87.28 42 B 1 +ATOM 323 C CA . GLU B 2 42 ? -17.619 2.339 3.545 1.00 88.69 42 B 1 +ATOM 324 C C . GLU B 2 42 ? -16.388 1.665 4.159 1.00 90.85 42 B 1 +ATOM 325 O O . GLU B 2 42 ? -16.274 1.565 5.379 1.00 88.07 42 B 1 +ATOM 326 C CB . GLU B 2 42 ? -18.622 1.254 3.130 1.00 85.63 42 B 1 +ATOM 327 C CG . GLU B 2 42 ? -19.983 1.827 2.715 1.00 75.43 42 B 1 +ATOM 328 C CD . GLU B 2 42 ? -21.004 0.747 2.328 1.00 66.80 42 B 1 +ATOM 329 O OE1 . GLU B 2 42 ? -22.167 1.129 2.081 1.00 58.03 42 B 1 +ATOM 330 O OE2 . GLU B 2 42 ? -20.621 -0.448 2.266 1.00 58.16 42 B 1 +ATOM 331 N N . LYS B 2 43 ? -15.472 1.176 3.320 1.00 89.90 43 B 1 +ATOM 332 C CA . LYS B 2 43 ? -14.321 0.367 3.761 1.00 91.25 43 B 1 +ATOM 333 C C . LYS B 2 43 ? -12.990 1.119 3.724 1.00 92.63 43 B 1 +ATOM 334 O O . LYS B 2 43 ? -11.977 0.594 4.186 1.00 89.15 43 B 1 +ATOM 335 C CB . LYS B 2 43 ? -14.249 -0.928 2.944 1.00 88.88 43 B 1 +ATOM 336 C CG . LYS B 2 43 ? -15.476 -1.833 3.150 1.00 83.06 43 B 1 +ATOM 337 C CD . LYS B 2 43 ? -15.269 -3.131 2.370 1.00 75.30 43 B 1 +ATOM 338 C CE . LYS B 2 43 ? -16.477 -4.058 2.502 1.00 66.12 43 B 1 +ATOM 339 N NZ . LYS B 2 43 ? -16.283 -5.264 1.663 1.00 58.56 43 B 1 +ATOM 340 N N . GLY B 2 44 ? -12.978 2.324 3.174 1.00 92.63 44 B 1 +ATOM 341 C CA . GLY B 2 44 ? -11.745 3.055 2.927 1.00 92.73 44 B 1 +ATOM 342 C C . GLY B 2 44 ? -10.886 2.362 1.865 1.00 93.58 44 B 1 +ATOM 343 O O . GLY B 2 44 ? -11.395 1.880 0.851 1.00 91.46 44 B 1 +ATOM 344 N N . LEU B 2 45 ? -9.578 2.343 2.094 1.00 93.32 45 B 1 +ATOM 345 C CA . LEU B 2 45 ? -8.601 1.738 1.193 1.00 92.62 45 B 1 +ATOM 346 C C . LEU B 2 45 ? -8.408 0.255 1.541 1.00 92.79 45 B 1 +ATOM 347 O O . LEU B 2 45 ? -8.066 -0.084 2.672 1.00 90.89 45 B 1 +ATOM 348 C CB . LEU B 2 45 ? -7.292 2.549 1.283 1.00 90.06 45 B 1 +ATOM 349 C CG . LEU B 2 45 ? -6.373 2.357 0.064 1.00 82.89 45 B 1 +ATOM 350 C CD1 . LEU B 2 45 ? -6.895 3.124 -1.153 1.00 78.73 45 B 1 +ATOM 351 C CD2 . LEU B 2 45 ? -4.972 2.884 0.374 1.00 77.63 45 B 1 +ATOM 352 N N . GLU B 2 46 ? -8.618 -0.624 0.563 1.00 93.64 46 B 1 +ATOM 353 C CA . GLU B 2 46 ? -8.530 -2.076 0.713 1.00 93.56 46 B 1 +ATOM 354 C C . GLU B 2 46 ? -7.631 -2.661 -0.386 1.00 93.73 46 B 1 +ATOM 355 O O . GLU B 2 46 ? -7.866 -2.447 -1.578 1.00 92.74 46 B 1 +ATOM 356 C CB . GLU B 2 46 ? -9.960 -2.675 0.677 1.00 91.49 46 B 1 +ATOM 357 C CG . GLU B 2 46 ? -10.017 -4.184 0.966 1.00 83.99 46 B 1 +ATOM 358 C CD . GLU B 2 46 ? -11.411 -4.820 0.761 1.00 84.82 46 B 1 +ATOM 359 O OE1 . GLU B 2 46 ? -11.607 -5.996 1.143 1.00 80.36 46 B 1 +ATOM 360 O OE2 . GLU B 2 46 ? -12.310 -4.188 0.156 1.00 82.07 46 B 1 +ATOM 361 N N . TRP B 2 47 ? -6.614 -3.414 0.008 1.00 92.09 47 B 1 +ATOM 362 C CA . TRP B 2 47 ? -5.833 -4.206 -0.939 1.00 91.81 47 B 1 +ATOM 363 C C . TRP B 2 47 ? -6.699 -5.341 -1.513 1.00 93.14 47 B 1 +ATOM 364 O O . TRP B 2 47 ? -7.441 -6.001 -0.786 1.00 92.88 47 B 1 +ATOM 365 C CB . TRP B 2 47 ? -4.572 -4.737 -0.263 1.00 89.50 47 B 1 +ATOM 366 C CG . TRP B 2 47 ? -3.801 -5.719 -1.095 1.00 87.64 47 B 1 +ATOM 367 C CD1 . TRP B 2 47 ? -2.932 -5.421 -2.086 1.00 84.72 47 B 1 +ATOM 368 C CD2 . TRP B 2 47 ? -3.858 -7.175 -1.027 1.00 86.61 47 B 1 +ATOM 369 N NE1 . TRP B 2 47 ? -2.428 -6.597 -2.635 1.00 83.36 47 B 1 +ATOM 370 C CE2 . TRP B 2 47 ? -2.968 -7.699 -2.006 1.00 84.50 47 B 1 +ATOM 371 C CE3 . TRP B 2 47 ? -4.566 -8.097 -0.222 1.00 83.08 47 B 1 +ATOM 372 C CZ2 . TRP B 2 47 ? -2.772 -9.084 -2.174 1.00 80.37 47 B 1 +ATOM 373 C CZ3 . TRP B 2 47 ? -4.376 -9.479 -0.394 1.00 81.95 47 B 1 +ATOM 374 C CH2 . TRP B 2 47 ? -3.485 -9.967 -1.359 1.00 81.32 47 B 1 +ATOM 375 N N . VAL B 2 48 ? -6.621 -5.567 -2.819 1.00 94.54 48 B 1 +ATOM 376 C CA . VAL B 2 48 ? -7.457 -6.530 -3.546 1.00 95.67 48 B 1 +ATOM 377 C C . VAL B 2 48 ? -6.643 -7.721 -4.027 1.00 95.34 48 B 1 +ATOM 378 O O . VAL B 2 48 ? -7.010 -8.865 -3.756 1.00 94.52 48 B 1 +ATOM 379 C CB . VAL B 2 48 ? -8.177 -5.846 -4.723 1.00 96.17 48 B 1 +ATOM 380 C CG1 . VAL B 2 48 ? -8.996 -6.832 -5.561 1.00 94.60 48 B 1 +ATOM 381 C CG2 . VAL B 2 48 ? -9.126 -4.748 -4.234 1.00 94.65 48 B 1 +ATOM 382 N N . ALA B 2 49 ? -5.565 -7.469 -4.764 1.00 95.18 49 B 1 +ATOM 383 C CA . ALA B 2 49 ? -4.748 -8.525 -5.338 1.00 95.19 49 B 1 +ATOM 384 C C . ALA B 2 49 ? -3.316 -8.058 -5.603 1.00 94.36 49 B 1 +ATOM 385 O O . ALA B 2 49 ? -3.081 -6.903 -5.942 1.00 93.57 49 B 1 +ATOM 386 C CB . ALA B 2 49 ? -5.406 -9.011 -6.637 1.00 95.76 49 B 1 +ATOM 387 N N . GLU B 2 50 ? -2.382 -8.993 -5.522 1.00 92.84 50 B 1 +ATOM 388 C CA . GLU B 2 50 ? -0.972 -8.833 -5.874 1.00 91.57 50 B 1 +ATOM 389 C C . GLU B 2 50 ? -0.601 -9.840 -6.966 1.00 92.69 50 B 1 +ATOM 390 O O . GLU B 2 50 ? -1.030 -10.999 -6.931 1.00 91.86 50 B 1 +ATOM 391 C CB . GLU B 2 50 ? -0.110 -9.056 -4.614 1.00 87.45 50 B 1 +ATOM 392 C CG . GLU B 2 50 ? 1.403 -8.967 -4.836 1.00 78.28 50 B 1 +ATOM 393 C CD . GLU B 2 50 ? 2.244 -9.629 -3.727 1.00 75.00 50 B 1 +ATOM 394 O OE1 . GLU B 2 50 ? 3.471 -9.434 -3.733 1.00 68.73 50 B 1 +ATOM 395 O OE2 . GLU B 2 50 ? 1.724 -10.458 -2.957 1.00 69.14 50 B 1 +ATOM 396 N N . ILE B 2 51 ? 0.230 -9.423 -7.910 1.00 91.37 51 B 1 +ATOM 397 C CA . ILE B 2 51 ? 0.951 -10.322 -8.807 1.00 91.87 51 B 1 +ATOM 398 C C . ILE B 2 51 ? 2.438 -9.986 -8.804 1.00 89.90 51 B 1 +ATOM 399 O O . ILE B 2 51 ? 2.862 -8.869 -9.103 1.00 88.26 51 B 1 +ATOM 400 C CB . ILE B 2 51 ? 0.340 -10.362 -10.217 1.00 93.64 51 B 1 +ATOM 401 C CG1 . ILE B 2 51 ? 1.009 -11.481 -11.052 1.00 93.96 51 B 1 +ATOM 402 C CG2 . ILE B 2 51 ? 0.407 -9.005 -10.940 1.00 93.47 51 B 1 +ATOM 403 C CD1 . ILE B 2 51 ? 0.234 -11.837 -12.326 1.00 94.04 51 B 1 +ATOM 404 N N . ARG B 2 52 ? 3.232 -10.996 -8.508 1.00 85.97 52 B 1 +ATOM 405 C CA . ARG B 2 52 ? 4.689 -10.899 -8.504 1.00 83.50 52 B 1 +ATOM 406 C C . ARG B 2 52 ? 5.252 -10.982 -9.922 1.00 85.08 52 B 1 +ATOM 407 O O . ARG B 2 52 ? 4.548 -11.268 -10.889 1.00 84.36 52 B 1 +ATOM 408 C CB . ARG B 2 52 ? 5.265 -11.962 -7.564 1.00 79.45 52 B 1 +ATOM 409 C CG . ARG B 2 52 ? 4.747 -11.757 -6.139 1.00 74.82 52 B 1 +ATOM 410 C CD . ARG B 2 52 ? 5.430 -12.702 -5.148 1.00 70.86 52 B 1 +ATOM 411 N NE . ARG B 2 52 ? 4.926 -12.431 -3.802 1.00 66.65 52 B 1 +ATOM 412 C CZ . ARG B 2 52 ? 5.289 -12.986 -2.667 1.00 62.46 52 B 1 +ATOM 413 N NH1 . ARG B 2 52 ? 6.194 -13.931 -2.613 1.00 61.66 52 B 1 +ATOM 414 N NH2 . ARG B 2 52 ? 4.723 -12.582 -1.565 1.00 59.13 52 B 1 +ATOM 415 N N . SER B 2 53 ? 6.595 -10.667 -10.074 1.00 79.84 53 B 1 +ATOM 416 C CA . SER B 2 53 ? 7.255 -10.686 -11.290 1.00 79.10 53 B 1 +ATOM 417 C C . SER B 2 53 ? 7.406 -12.075 -11.796 1.00 78.55 53 B 1 +ATOM 418 O O . SER B 2 53 ? 7.419 -13.017 -11.118 1.00 76.66 53 B 1 +ATOM 419 C CB . SER B 2 53 ? 8.527 -9.942 -11.192 1.00 77.25 53 B 1 +ATOM 420 O OG . SER B 2 53 ? 9.155 -10.016 -10.186 1.00 74.68 53 B 1 +ATOM 421 N N . LYS B 2 54 ? 7.580 -12.229 -13.114 1.00 70.58 54 B 1 +ATOM 422 C CA . LYS B 2 54 ? 7.752 -13.502 -13.822 1.00 68.06 54 B 1 +ATOM 423 C C . LYS B 2 54 ? 8.929 -14.331 -13.299 1.00 68.59 54 B 1 +ATOM 424 O O . LYS B 2 54 ? 8.848 -15.552 -13.292 1.00 64.41 54 B 1 +ATOM 425 C CB . LYS B 2 54 ? 7.890 -13.197 -15.315 1.00 63.07 54 B 1 +ATOM 426 C CG . LYS B 2 54 ? 7.878 -14.461 -16.179 1.00 55.21 54 B 1 +ATOM 427 C CD . LYS B 2 54 ? 7.947 -14.074 -17.656 1.00 51.09 54 B 1 +ATOM 428 C CE . LYS B 2 54 ? 7.928 -15.322 -18.535 1.00 43.55 54 B 1 +ATOM 429 N NZ . LYS B 2 54 ? 7.994 -14.966 -19.971 1.00 39.13 54 B 1 +ATOM 430 N N . SER B 2 55 ? 9.991 -13.686 -12.844 1.00 61.94 55 B 1 +ATOM 431 C CA . SER B 2 55 ? 11.169 -14.356 -12.282 1.00 59.37 55 B 1 +ATOM 432 C C . SER B 2 55 ? 10.874 -15.165 -11.016 1.00 59.93 55 B 1 +ATOM 433 O O . SER B 2 55 ? 11.580 -16.127 -10.739 1.00 56.60 55 B 1 +ATOM 434 C CB . SER B 2 55 ? 12.267 -13.333 -11.982 1.00 54.96 55 B 1 +ATOM 435 O OG . SER B 2 55 ? 11.781 -12.318 -11.133 1.00 49.87 55 B 1 +ATOM 436 N N . ILE B 2 56 ? 9.816 -14.825 -10.296 1.00 59.96 56 B 1 +ATOM 437 C CA . ILE B 2 56 ? 9.296 -15.554 -9.132 1.00 57.48 56 B 1 +ATOM 438 C C . ILE B 2 56 ? 7.925 -16.167 -9.435 1.00 57.58 56 B 1 +ATOM 439 O O . ILE B 2 56 ? 6.993 -16.116 -8.636 1.00 52.35 56 B 1 +ATOM 440 C CB . ILE B 2 56 ? 9.361 -14.689 -7.853 1.00 52.99 56 B 1 +ATOM 441 C CG1 . ILE B 2 56 ? 8.733 -13.298 -8.063 1.00 50.49 56 B 1 +ATOM 442 C CG2 . ILE B 2 56 ? 10.825 -14.566 -7.400 1.00 50.17 56 B 1 +ATOM 443 C CD1 . ILE B 2 56 ? 8.655 -12.484 -6.777 1.00 46.80 56 B 1 +ATOM 444 N N . ASN B 2 57 ? 7.799 -16.745 -10.621 1.00 60.58 57 B 1 +ATOM 445 C CA . ASN B 2 57 ? 6.648 -17.512 -11.113 1.00 60.12 57 B 1 +ATOM 446 C C . ASN B 2 57 ? 5.323 -16.738 -11.202 1.00 64.32 57 B 1 +ATOM 447 O O . ASN B 2 57 ? 4.266 -17.356 -11.276 1.00 60.07 57 B 1 +ATOM 448 C CB . ASN B 2 57 ? 6.527 -18.829 -10.322 1.00 53.07 57 B 1 +ATOM 449 C CG . ASN B 2 57 ? 7.740 -19.725 -10.494 1.00 45.89 57 B 1 +ATOM 450 O OD1 . ASN B 2 57 ? 8.402 -19.726 -11.517 1.00 39.64 57 B 1 +ATOM 451 N ND2 . ASN B 2 57 ? 8.058 -20.525 -9.501 1.00 38.45 57 B 1 +ATOM 452 N N . SER B 2 58 ? 5.362 -15.412 -11.227 1.00 71.76 58 B 1 +ATOM 453 C CA . SER B 2 58 ? 4.153 -14.577 -11.246 1.00 74.04 58 B 1 +ATOM 454 C C . SER B 2 58 ? 3.145 -14.990 -10.165 1.00 77.06 58 B 1 +ATOM 455 O O . SER B 2 58 ? 1.945 -15.053 -10.421 1.00 75.07 58 B 1 +ATOM 456 C CB . SER B 2 58 ? 3.521 -14.550 -12.646 1.00 71.75 58 B 1 +ATOM 457 O OG . SER B 2 58 ? 4.461 -14.117 -13.613 1.00 66.95 58 B 1 +ATOM 458 N N . ALA B 2 59 ? 3.642 -15.312 -8.966 1.00 77.06 59 B 1 +ATOM 459 C CA . ALA B 2 59 ? 2.801 -15.729 -7.850 1.00 76.48 59 B 1 +ATOM 460 C C . ALA B 2 59 ? 1.725 -14.674 -7.567 1.00 80.24 59 B 1 +ATOM 461 O O . ALA B 2 59 ? 2.004 -13.475 -7.583 1.00 80.34 59 B 1 +ATOM 462 C CB . ALA B 2 59 ? 3.677 -15.992 -6.623 1.00 71.08 59 B 1 +ATOM 463 N N . THR B 2 60 ? 0.497 -15.137 -7.326 1.00 85.60 60 B 1 +ATOM 464 C CA . THR B 2 60 ? -0.656 -14.267 -7.098 1.00 87.72 60 B 1 +ATOM 465 C C . THR B 2 60 ? -1.203 -14.455 -5.694 1.00 86.03 60 B 1 +ATOM 466 O O . THR B 2 60 ? -1.294 -15.582 -5.206 1.00 84.49 60 B 1 +ATOM 467 C CB . THR B 2 60 ? -1.772 -14.508 -8.122 1.00 90.06 60 B 1 +ATOM 468 O OG1 . THR B 2 60 ? -2.174 -15.863 -8.110 1.00 89.20 60 B 1 +ATOM 469 C CG2 . THR B 2 60 ? -1.340 -14.173 -9.546 1.00 88.47 60 B 1 +ATOM 470 N N . HIS B 2 61 ? -1.625 -13.360 -5.079 1.00 87.29 61 B 1 +ATOM 471 C CA . HIS B 2 61 ? -2.323 -13.362 -3.795 1.00 86.65 61 B 1 +ATOM 472 C C . HIS B 2 61 ? -3.563 -12.479 -3.887 1.00 90.13 61 B 1 +ATOM 473 O O . HIS B 2 61 ? -3.596 -11.516 -4.651 1.00 90.40 61 B 1 +ATOM 474 C CB . HIS B 2 61 ? -1.386 -12.897 -2.674 1.00 81.75 61 B 1 +ATOM 475 C CG . HIS B 2 61 ? -0.107 -13.682 -2.585 1.00 76.17 61 B 1 +ATOM 476 N ND1 . HIS B 2 61 ? 1.095 -13.311 -3.140 1.00 64.47 61 B 1 +ATOM 477 C CD2 . HIS B 2 61 ? 0.096 -14.901 -1.993 1.00 63.66 61 B 1 +ATOM 478 C CE1 . HIS B 2 61 ? 1.993 -14.275 -2.889 1.00 59.19 61 B 1 +ATOM 479 N NE2 . HIS B 2 61 ? 1.432 -15.270 -2.188 1.00 60.80 61 B 1 +ATOM 480 N N . TYR B 2 62 ? -4.580 -12.813 -3.106 1.00 89.73 62 B 1 +ATOM 481 C CA . TYR B 2 62 ? -5.878 -12.142 -3.124 1.00 92.82 62 B 1 +ATOM 482 C C . TYR B 2 62 ? -6.364 -11.876 -1.705 1.00 92.41 62 B 1 +ATOM 483 O O . TYR B 2 62 ? -6.179 -12.714 -0.816 1.00 90.91 62 B 1 +ATOM 484 C CB . TYR B 2 62 ? -6.905 -13.000 -3.867 1.00 94.09 62 B 1 +ATOM 485 C CG . TYR B 2 62 ? -6.537 -13.301 -5.303 1.00 95.13 62 B 1 +ATOM 486 C CD1 . TYR B 2 62 ? -6.847 -12.383 -6.319 1.00 94.45 62 B 1 +ATOM 487 C CD2 . TYR B 2 62 ? -5.851 -14.491 -5.630 1.00 94.53 62 B 1 +ATOM 488 C CE1 . TYR B 2 62 ? -6.486 -12.645 -7.649 1.00 94.77 62 B 1 +ATOM 489 C CE2 . TYR B 2 62 ? -5.481 -14.762 -6.960 1.00 95.10 62 B 1 +ATOM 490 C CZ . TYR B 2 62 ? -5.802 -13.834 -7.967 1.00 96.27 62 B 1 +ATOM 491 O OH . TYR B 2 62 ? -5.439 -14.090 -9.265 1.00 96.32 62 B 1 +ATOM 492 N N . ALA B 2 63 ? -7.045 -10.752 -1.523 1.00 93.91 63 B 1 +ATOM 493 C CA . ALA B 2 63 ? -7.823 -10.515 -0.319 1.00 94.20 63 B 1 +ATOM 494 C C . ALA B 2 63 ? -8.933 -11.572 -0.190 1.00 95.18 63 B 1 +ATOM 495 O O . ALA B 2 63 ? -9.525 -11.999 -1.188 1.00 95.08 63 B 1 +ATOM 496 C CB . ALA B 2 63 ? -8.399 -9.101 -0.358 1.00 93.45 63 B 1 +ATOM 497 N N . GLU B 2 64 ? -9.240 -11.972 1.028 1.00 93.49 64 B 1 +ATOM 498 C CA . GLU B 2 64 ? -10.227 -13.034 1.272 1.00 93.79 64 B 1 +ATOM 499 C C . GLU B 2 64 ? -11.625 -12.665 0.733 1.00 94.64 64 B 1 +ATOM 500 O O . GLU B 2 64 ? -12.357 -13.522 0.246 1.00 94.47 64 B 1 +ATOM 501 C CB . GLU B 2 64 ? -10.248 -13.367 2.773 1.00 93.15 64 B 1 +ATOM 502 C CG . GLU B 2 64 ? -10.810 -14.766 3.085 1.00 82.58 64 B 1 +ATOM 503 C CD . GLU B 2 64 ? -9.979 -15.934 2.500 1.00 74.20 64 B 1 +ATOM 504 O OE1 . GLU B 2 64 ? -10.542 -17.027 2.282 1.00 67.40 64 B 1 +ATOM 505 O OE2 . GLU B 2 64 ? -8.768 -15.784 2.215 1.00 68.60 64 B 1 +ATOM 506 N N . SER B 2 65 ? -11.959 -11.372 0.713 1.00 95.51 65 B 1 +ATOM 507 C CA . SER B 2 65 ? -13.233 -10.846 0.198 1.00 95.59 65 B 1 +ATOM 508 C C . SER B 2 65 ? -13.443 -11.054 -1.310 1.00 96.66 65 B 1 +ATOM 509 O O . SER B 2 65 ? -14.585 -11.060 -1.774 1.00 96.01 65 B 1 +ATOM 510 C CB . SER B 2 65 ? -13.329 -9.348 0.534 1.00 93.99 65 B 1 +ATOM 511 O OG . SER B 2 65 ? -12.241 -8.622 -0.010 1.00 88.55 65 B 1 +ATOM 512 N N . VAL B 2 66 ? -12.366 -11.236 -2.085 1.00 97.07 66 B 1 +ATOM 513 C CA . VAL B 2 66 ? -12.420 -11.364 -3.556 1.00 97.75 66 B 1 +ATOM 514 C C . VAL B 2 66 ? -11.921 -12.715 -4.072 1.00 98.14 66 B 1 +ATOM 515 O O . VAL B 2 66 ? -12.034 -13.016 -5.264 1.00 97.90 66 B 1 +ATOM 516 C CB . VAL B 2 66 ? -11.671 -10.210 -4.245 1.00 97.41 66 B 1 +ATOM 517 C CG1 . VAL B 2 66 ? -12.208 -8.847 -3.802 1.00 96.30 66 B 1 +ATOM 518 C CG2 . VAL B 2 66 ? -10.158 -10.243 -4.013 1.00 95.67 66 B 1 +ATOM 519 N N . LYS B 2 67 ? -11.377 -13.537 -3.198 1.00 96.30 67 B 1 +ATOM 520 C CA . LYS B 2 67 ? -10.780 -14.825 -3.528 1.00 96.29 67 B 1 +ATOM 521 C C . LYS B 2 67 ? -11.789 -15.752 -4.204 1.00 96.82 67 B 1 +ATOM 522 O O . LYS B 2 67 ? -12.933 -15.872 -3.786 1.00 96.13 67 B 1 +ATOM 523 C CB . LYS B 2 67 ? -10.223 -15.412 -2.231 1.00 94.11 67 B 1 +ATOM 524 C CG . LYS B 2 67 ? -9.277 -16.612 -2.418 1.00 84.79 67 B 1 +ATOM 525 C CD . LYS B 2 67 ? -8.816 -16.940 -1.003 1.00 83.30 67 B 1 +ATOM 526 C CE . LYS B 2 67 ? -7.812 -18.057 -0.831 1.00 73.16 67 B 1 +ATOM 527 N NZ . LYS B 2 67 ? -7.559 -18.143 0.628 1.00 65.61 67 B 1 +ATOM 528 N N . GLY B 2 68 ? -11.345 -16.391 -5.287 1.00 96.64 68 B 1 +ATOM 529 C CA . GLY B 2 68 ? -12.200 -17.236 -6.125 1.00 97.13 68 B 1 +ATOM 530 C C . GLY B 2 68 ? -13.092 -16.487 -7.125 1.00 97.94 68 B 1 +ATOM 531 O O . GLY B 2 68 ? -13.573 -17.102 -8.071 1.00 97.05 68 B 1 +ATOM 532 N N . ARG B 2 69 ? -13.281 -15.170 -6.967 1.00 98.56 69 B 1 +ATOM 533 C CA . ARG B 2 69 ? -14.064 -14.325 -7.885 1.00 98.69 69 B 1 +ATOM 534 C C . ARG B 2 69 ? -13.183 -13.475 -8.799 1.00 98.76 69 B 1 +ATOM 535 O O . ARG B 2 69 ? -13.544 -13.228 -9.946 1.00 98.58 69 B 1 +ATOM 536 C CB . ARG B 2 69 ? -15.014 -13.418 -7.085 1.00 98.42 69 B 1 +ATOM 537 C CG . ARG B 2 69 ? -15.983 -14.205 -6.187 1.00 97.93 69 B 1 +ATOM 538 C CD . ARG B 2 69 ? -17.054 -13.310 -5.556 1.00 97.52 69 B 1 +ATOM 539 N NE . ARG B 2 69 ? -16.496 -12.219 -4.744 1.00 96.89 69 B 1 +ATOM 540 C CZ . ARG B 2 69 ? -16.599 -10.904 -4.978 1.00 97.67 69 B 1 +ATOM 541 N NH1 . ARG B 2 69 ? -17.221 -10.413 -6.010 1.00 93.00 69 B 1 +ATOM 542 N NH2 . ARG B 2 69 ? -16.077 -10.047 -4.160 1.00 94.69 69 B 1 +ATOM 543 N N . PHE B 2 70 ? -12.046 -13.023 -8.291 1.00 98.74 70 B 1 +ATOM 544 C CA . PHE B 2 70 ? -11.142 -12.144 -9.024 1.00 98.74 70 B 1 +ATOM 545 C C . PHE B 2 70 ? -9.881 -12.901 -9.449 1.00 98.65 70 B 1 +ATOM 546 O O . PHE B 2 70 ? -9.410 -13.803 -8.758 1.00 97.98 70 B 1 +ATOM 547 C CB . PHE B 2 70 ? -10.802 -10.890 -8.200 1.00 98.67 70 B 1 +ATOM 548 C CG . PHE B 2 70 ? -11.915 -9.880 -7.948 1.00 98.71 70 B 1 +ATOM 549 C CD1 . PHE B 2 70 ? -13.277 -10.169 -8.161 1.00 98.17 70 B 1 +ATOM 550 C CD2 . PHE B 2 70 ? -11.562 -8.606 -7.467 1.00 98.16 70 B 1 +ATOM 551 C CE1 . PHE B 2 70 ? -14.269 -9.212 -7.885 1.00 97.98 70 B 1 +ATOM 552 C CE2 . PHE B 2 70 ? -12.549 -7.648 -7.189 1.00 97.84 70 B 1 +ATOM 553 C CZ . PHE B 2 70 ? -13.903 -7.951 -7.391 1.00 98.21 70 B 1 +ATOM 554 N N . THR B 2 71 ? -9.334 -12.525 -10.598 1.00 98.53 71 B 1 +ATOM 555 C CA . THR B 2 71 ? -8.083 -13.072 -11.129 1.00 98.53 71 B 1 +ATOM 556 C C . THR B 2 71 ? -7.197 -11.934 -11.613 1.00 98.60 71 B 1 +ATOM 557 O O . THR B 2 71 ? -7.531 -11.248 -12.581 1.00 98.31 71 B 1 +ATOM 558 C CB . THR B 2 71 ? -8.346 -14.075 -12.262 1.00 98.14 71 B 1 +ATOM 559 O OG1 . THR B 2 71 ? -9.219 -15.092 -11.823 1.00 93.08 71 B 1 +ATOM 560 C CG2 . THR B 2 71 ? -7.070 -14.766 -12.732 1.00 91.55 71 B 1 +ATOM 561 N N . ILE B 2 72 ? -6.062 -11.747 -10.950 1.00 98.27 72 B 1 +ATOM 562 C CA . ILE B 2 72 ? -5.012 -10.841 -11.417 1.00 97.94 72 B 1 +ATOM 563 C C . ILE B 2 72 ? -4.113 -11.569 -12.423 1.00 97.94 72 B 1 +ATOM 564 O O . ILE B 2 72 ? -3.780 -12.743 -12.259 1.00 97.36 72 B 1 +ATOM 565 C CB . ILE B 2 72 ? -4.249 -10.210 -10.233 1.00 97.12 72 B 1 +ATOM 566 C CG1 . ILE B 2 72 ? -3.329 -9.065 -10.718 1.00 96.21 72 B 1 +ATOM 567 C CG2 . ILE B 2 72 ? -3.478 -11.253 -9.415 1.00 95.74 72 B 1 +ATOM 568 C CD1 . ILE B 2 72 ? -2.720 -8.229 -9.583 1.00 94.82 72 B 1 +ATOM 569 N N . SER B 2 73 ? -3.729 -10.879 -13.480 1.00 97.65 73 B 1 +ATOM 570 C CA . SER B 2 73 ? -2.787 -11.376 -14.482 1.00 97.63 73 B 1 +ATOM 571 C C . SER B 2 73 ? -1.930 -10.234 -15.010 1.00 97.63 73 B 1 +ATOM 572 O O . SER B 2 73 ? -2.284 -9.065 -14.857 1.00 97.38 73 B 1 +ATOM 573 C CB . SER B 2 73 ? -3.536 -12.086 -15.619 1.00 97.46 73 B 1 +ATOM 574 O OG . SER B 2 73 ? -4.434 -11.206 -16.272 1.00 96.41 73 B 1 +ATOM 575 N N . ARG B 2 74 ? -0.803 -10.560 -15.643 1.00 97.32 74 B 1 +ATOM 576 C CA . ARG B 2 74 ? 0.111 -9.573 -16.226 1.00 96.79 74 B 1 +ATOM 577 C C . ARG B 2 74 ? 0.584 -9.995 -17.612 1.00 96.89 74 B 1 +ATOM 578 O O . ARG B 2 74 ? 0.691 -11.187 -17.901 1.00 95.94 74 B 1 +ATOM 579 C CB . ARG B 2 74 ? 1.279 -9.294 -15.261 1.00 94.95 74 B 1 +ATOM 580 C CG . ARG B 2 74 ? 2.204 -10.510 -15.027 1.00 92.62 74 B 1 +ATOM 581 C CD . ARG B 2 74 ? 3.247 -10.236 -13.930 1.00 91.62 74 B 1 +ATOM 582 N NE . ARG B 2 74 ? 4.211 -9.209 -14.341 1.00 89.43 74 B 1 +ATOM 583 C CZ . ARG B 2 74 ? 4.865 -8.363 -13.561 1.00 90.73 74 B 1 +ATOM 584 N NH1 . ARG B 2 74 ? 4.740 -8.366 -12.266 1.00 83.19 74 B 1 +ATOM 585 N NH2 . ARG B 2 74 ? 5.668 -7.499 -14.086 1.00 84.70 74 B 1 +ATOM 586 N N . ASP B 2 75 ? 0.863 -9.011 -18.443 1.00 96.84 75 B 1 +ATOM 587 C CA . ASP B 2 75 ? 1.509 -9.176 -19.744 1.00 96.73 75 B 1 +ATOM 588 C C . ASP B 2 75 ? 2.716 -8.236 -19.792 1.00 96.41 75 B 1 +ATOM 589 O O . ASP B 2 75 ? 2.585 -7.035 -20.032 1.00 95.81 75 B 1 +ATOM 590 C CB . ASP B 2 75 ? 0.492 -8.920 -20.867 1.00 96.73 75 B 1 +ATOM 591 C CG . ASP B 2 75 ? 1.037 -9.167 -22.278 1.00 96.19 75 B 1 +ATOM 592 O OD1 . ASP B 2 75 ? 2.274 -9.246 -22.453 1.00 94.31 75 B 1 +ATOM 593 O OD2 . ASP B 2 75 ? 0.209 -9.249 -23.217 1.00 93.37 75 B 1 +ATOM 594 N N . ASP B 2 76 ? 3.893 -8.791 -19.539 1.00 94.84 76 B 1 +ATOM 595 C CA . ASP B 2 76 ? 5.139 -8.022 -19.484 1.00 94.06 76 B 1 +ATOM 596 C C . ASP B 2 76 ? 5.503 -7.426 -20.852 1.00 94.69 76 B 1 +ATOM 597 O O . ASP B 2 76 ? 6.115 -6.366 -20.913 1.00 94.00 76 B 1 +ATOM 598 C CB . ASP B 2 76 ? 6.282 -8.907 -18.946 1.00 91.96 76 B 1 +ATOM 599 C CG . ASP B 2 76 ? 6.150 -9.293 -17.464 1.00 90.15 76 B 1 +ATOM 600 O OD1 . ASP B 2 76 ? 5.362 -8.668 -16.724 1.00 87.63 76 B 1 +ATOM 601 O OD2 . ASP B 2 76 ? 6.871 -10.218 -17.026 1.00 85.88 76 B 1 +ATOM 602 N N . SER B 2 77 ? 5.075 -8.054 -21.957 1.00 94.77 77 B 1 +ATOM 603 C CA . SER B 2 77 ? 5.320 -7.537 -23.311 1.00 95.05 77 B 1 +ATOM 604 C C . SER B 2 77 ? 4.564 -6.235 -23.601 1.00 95.59 77 B 1 +ATOM 605 O O . SER B 2 77 ? 4.983 -5.441 -24.437 1.00 95.08 77 B 1 +ATOM 606 C CB . SER B 2 77 ? 4.967 -8.602 -24.359 1.00 94.95 77 B 1 +ATOM 607 O OG . SER B 2 77 ? 3.574 -8.742 -24.562 1.00 90.25 77 B 1 +ATOM 608 N N . LYS B 2 78 ? 3.458 -6.013 -22.892 1.00 96.44 78 B 1 +ATOM 609 C CA . LYS B 2 78 ? 2.621 -4.808 -22.992 1.00 97.00 78 B 1 +ATOM 610 C C . LYS B 2 78 ? 2.773 -3.877 -21.791 1.00 97.20 78 B 1 +ATOM 611 O O . LYS B 2 78 ? 2.079 -2.868 -21.741 1.00 96.68 78 B 1 +ATOM 612 C CB . LYS B 2 78 ? 1.160 -5.218 -23.175 1.00 97.03 78 B 1 +ATOM 613 C CG . LYS B 2 78 ? 0.942 -5.972 -24.489 1.00 94.94 78 B 1 +ATOM 614 C CD . LYS B 2 78 ? -0.528 -6.370 -24.608 1.00 91.30 78 B 1 +ATOM 615 C CE . LYS B 2 78 ? -0.686 -7.303 -25.802 1.00 84.94 78 B 1 +ATOM 616 N NZ . LYS B 2 78 ? -1.816 -8.225 -25.579 1.00 75.50 78 B 1 +ATOM 617 N N . SER B 2 79 ? 3.622 -4.229 -20.830 1.00 96.55 79 B 1 +ATOM 618 C CA . SER B 2 79 ? 3.715 -3.541 -19.538 1.00 96.61 79 B 1 +ATOM 619 C C . SER B 2 79 ? 2.342 -3.345 -18.891 1.00 97.19 79 B 1 +ATOM 620 O O . SER B 2 79 ? 2.015 -2.264 -18.410 1.00 96.74 79 B 1 +ATOM 621 C CB . SER B 2 79 ? 4.500 -2.233 -19.677 1.00 95.32 79 B 1 +ATOM 622 O OG . SER B 2 79 ? 5.801 -2.504 -20.167 1.00 90.99 79 B 1 +ATOM 623 N N . ALA B 2 80 ? 1.500 -4.390 -18.924 1.00 97.72 80 B 1 +ATOM 624 C CA . ALA B 2 80 ? 0.119 -4.308 -18.475 1.00 98.01 80 B 1 +ATOM 625 C C . ALA B 2 80 ? -0.194 -5.324 -17.371 1.00 97.95 80 B 1 +ATOM 626 O O . ALA B 2 80 ? 0.227 -6.480 -17.416 1.00 97.51 80 B 1 +ATOM 627 C CB . ALA B 2 80 ? -0.814 -4.444 -19.682 1.00 97.93 80 B 1 +ATOM 628 N N . VAL B 2 81 ? -0.995 -4.895 -16.408 1.00 97.88 81 B 1 +ATOM 629 C CA . VAL B 2 81 ? -1.618 -5.749 -15.394 1.00 97.87 81 B 1 +ATOM 630 C C . VAL B 2 81 ? -3.133 -5.665 -15.530 1.00 98.35 81 B 1 +ATOM 631 O O . VAL B 2 81 ? -3.689 -4.614 -15.846 1.00 98.25 81 B 1 +ATOM 632 C CB . VAL B 2 81 ? -1.096 -5.430 -13.978 1.00 96.48 81 B 1 +ATOM 633 C CG1 . VAL B 2 81 ? -1.457 -4.022 -13.502 1.00 90.50 81 B 1 +ATOM 634 C CG2 . VAL B 2 81 ? -1.603 -6.432 -12.940 1.00 90.27 81 B 1 +ATOM 635 N N . TYR B 2 82 ? -3.799 -6.788 -15.336 1.00 98.50 82 B 1 +ATOM 636 C CA . TYR B 2 82 ? -5.240 -6.924 -15.495 1.00 98.62 82 B 1 +ATOM 637 C C . TYR B 2 82 ? -5.872 -7.461 -14.216 1.00 98.60 82 B 1 +ATOM 638 O O . TYR B 2 82 ? -5.256 -8.239 -13.494 1.00 98.36 82 B 1 +ATOM 639 C CB . TYR B 2 82 ? -5.552 -7.853 -16.670 1.00 98.59 82 B 1 +ATOM 640 C CG . TYR B 2 82 ? -4.841 -7.509 -17.959 1.00 98.51 82 B 1 +ATOM 641 C CD1 . TYR B 2 82 ? -5.260 -6.412 -18.736 1.00 97.62 82 B 1 +ATOM 642 C CD2 . TYR B 2 82 ? -3.732 -8.271 -18.380 1.00 97.51 82 B 1 +ATOM 643 C CE1 . TYR B 2 82 ? -4.595 -6.083 -19.927 1.00 96.97 82 B 1 +ATOM 644 C CE2 . TYR B 2 82 ? -3.058 -7.950 -19.570 1.00 96.93 82 B 1 +ATOM 645 C CZ . TYR B 2 82 ? -3.496 -6.855 -20.344 1.00 97.54 82 B 1 +ATOM 646 O OH . TYR B 2 82 ? -2.845 -6.542 -21.513 1.00 96.34 82 B 1 +ATOM 647 N N . LEU B 2 83 ? -7.135 -7.103 -13.992 1.00 98.74 83 B 1 +ATOM 648 C CA . LEU B 2 83 ? -7.985 -7.693 -12.966 1.00 98.77 83 B 1 +ATOM 649 C C . LEU B 2 83 ? -9.284 -8.161 -13.623 1.00 98.80 83 B 1 +ATOM 650 O O . LEU B 2 83 ? -10.153 -7.348 -13.943 1.00 98.63 83 B 1 +ATOM 651 C CB . LEU B 2 83 ? -8.213 -6.668 -11.845 1.00 98.68 83 B 1 +ATOM 652 C CG . LEU B 2 83 ? -8.919 -7.252 -10.607 1.00 98.44 83 B 1 +ATOM 653 C CD1 . LEU B 2 83 ? -8.023 -8.245 -9.867 1.00 97.83 83 B 1 +ATOM 654 C CD2 . LEU B 2 83 ? -9.278 -6.117 -9.646 1.00 97.76 83 B 1 +ATOM 655 N N . GLN B 2 84 ? -9.401 -9.465 -13.863 1.00 98.74 84 B 1 +ATOM 656 C CA . GLN B 2 84 ? -10.661 -10.074 -14.268 1.00 98.73 84 B 1 +ATOM 657 C C . GLN B 2 84 ? -11.516 -10.283 -13.025 1.00 98.75 84 B 1 +ATOM 658 O O . GLN B 2 84 ? -11.101 -10.984 -12.102 1.00 98.56 84 B 1 +ATOM 659 C CB . GLN B 2 84 ? -10.392 -11.394 -15.009 1.00 98.47 84 B 1 +ATOM 660 C CG . GLN B 2 84 ? -11.672 -12.075 -15.506 1.00 94.36 84 B 1 +ATOM 661 C CD . GLN B 2 84 ? -12.410 -11.231 -16.555 1.00 88.99 84 B 1 +ATOM 662 O OE1 . GLN B 2 84 ? -11.845 -10.802 -17.548 1.00 81.57 84 B 1 +ATOM 663 N NE2 . GLN B 2 84 ? -13.684 -10.965 -16.362 1.00 75.52 84 B 1 +ATOM 664 N N . MET B 2 85 ? -12.702 -9.694 -13.015 1.00 98.82 85 B 1 +ATOM 665 C CA . MET B 2 85 ? -13.656 -9.797 -11.916 1.00 98.82 85 B 1 +ATOM 666 C C . MET B 2 85 ? -14.908 -10.524 -12.398 1.00 98.82 85 B 1 +ATOM 667 O O . MET B 2 85 ? -15.423 -10.222 -13.479 1.00 98.53 85 B 1 +ATOM 668 C CB . MET B 2 85 ? -13.998 -8.398 -11.400 1.00 98.65 85 B 1 +ATOM 669 C CG . MET B 2 85 ? -12.772 -7.599 -10.937 1.00 98.22 85 B 1 +ATOM 670 S SD . MET B 2 85 ? -13.134 -5.884 -10.466 1.00 97.09 85 B 1 +ATOM 671 C CE . MET B 2 85 ? -13.580 -5.214 -12.071 1.00 92.08 85 B 1 +ATOM 672 N N . THR B 2 86 ? -15.389 -11.479 -11.607 1.00 98.68 86 B 1 +ATOM 673 C CA . THR B 2 86 ? -16.615 -12.248 -11.853 1.00 98.61 86 B 1 +ATOM 674 C C . THR B 2 86 ? -17.464 -12.287 -10.585 1.00 98.66 86 B 1 +ATOM 675 O O . THR B 2 86 ? -16.952 -12.019 -9.497 1.00 98.24 86 B 1 +ATOM 676 C CB . THR B 2 86 ? -16.307 -13.683 -12.321 1.00 97.91 86 B 1 +ATOM 677 O OG1 . THR B 2 86 ? -15.515 -14.367 -11.376 1.00 90.17 86 B 1 +ATOM 678 C CG2 . THR B 2 86 ? -15.555 -13.723 -13.649 1.00 86.68 86 B 1 +ATOM 679 N N . ASP B 2 87 ? -18.749 -12.624 -10.723 1.00 98.65 87 B 1 +ATOM 680 C CA . ASP B 2 87 ? -19.692 -12.654 -9.593 1.00 98.55 87 B 1 +ATOM 681 C C . ASP B 2 87 ? -19.639 -11.350 -8.767 1.00 98.50 87 B 1 +ATOM 682 O O . ASP B 2 87 ? -19.454 -11.344 -7.547 1.00 97.56 87 B 1 +ATOM 683 C CB . ASP B 2 87 ? -19.490 -13.939 -8.764 1.00 98.14 87 B 1 +ATOM 684 C CG . ASP B 2 87 ? -20.577 -14.133 -7.703 1.00 94.34 87 B 1 +ATOM 685 O OD1 . ASP B 2 87 ? -21.752 -13.859 -8.038 1.00 89.34 87 B 1 +ATOM 686 O OD2 . ASP B 2 87 ? -20.234 -14.547 -6.566 1.00 87.35 87 B 1 +ATOM 687 N N . LEU B 2 88 ? -19.710 -10.221 -9.484 1.00 98.51 88 B 1 +ATOM 688 C CA . LEU B 2 88 ? -19.585 -8.898 -8.884 1.00 98.49 88 B 1 +ATOM 689 C C . LEU B 2 88 ? -20.755 -8.599 -7.948 1.00 98.32 88 B 1 +ATOM 690 O O . LEU B 2 88 ? -21.909 -8.911 -8.229 1.00 97.59 88 B 1 +ATOM 691 C CB . LEU B 2 88 ? -19.453 -7.829 -9.979 1.00 98.38 88 B 1 +ATOM 692 C CG . LEU B 2 88 ? -18.026 -7.733 -10.560 1.00 98.11 88 B 1 +ATOM 693 C CD1 . LEU B 2 88 ? -18.027 -6.880 -11.820 1.00 97.56 88 B 1 +ATOM 694 C CD2 . LEU B 2 88 ? -17.042 -7.106 -9.565 1.00 97.26 88 B 1 +ATOM 695 N N . ARG B 2 89 ? -20.434 -7.936 -6.844 1.00 97.56 89 B 1 +ATOM 696 C CA . ARG B 2 89 ? -21.363 -7.583 -5.772 1.00 97.28 89 B 1 +ATOM 697 C C . ARG B 2 89 ? -21.367 -6.073 -5.554 1.00 97.02 89 B 1 +ATOM 698 O O . ARG B 2 89 ? -20.432 -5.376 -5.939 1.00 96.35 89 B 1 +ATOM 699 C CB . ARG B 2 89 ? -20.962 -8.326 -4.491 1.00 96.60 89 B 1 +ATOM 700 C CG . ARG B 2 89 ? -20.914 -9.847 -4.693 1.00 95.07 89 B 1 +ATOM 701 C CD . ARG B 2 89 ? -20.389 -10.530 -3.430 1.00 93.57 89 B 1 +ATOM 702 N NE . ARG B 2 89 ? -20.263 -11.971 -3.657 1.00 89.80 89 B 1 +ATOM 703 C CZ . ARG B 2 89 ? -19.768 -12.856 -2.817 1.00 84.92 89 B 1 +ATOM 704 N NH1 . ARG B 2 89 ? -19.328 -12.507 -1.632 1.00 81.57 89 B 1 +ATOM 705 N NH2 . ARG B 2 89 ? -19.709 -14.106 -3.177 1.00 79.91 89 B 1 +ATOM 706 N N . THR B 2 90 ? -22.418 -5.571 -4.910 1.00 96.00 90 B 1 +ATOM 707 C CA . THR B 2 90 ? -22.524 -4.138 -4.602 1.00 95.14 90 B 1 +ATOM 708 C C . THR B 2 90 ? -21.364 -3.642 -3.741 1.00 95.41 90 B 1 +ATOM 709 O O . THR B 2 90 ? -20.874 -2.538 -3.963 1.00 94.53 90 B 1 +ATOM 710 C CB . THR B 2 90 ? -23.856 -3.832 -3.906 1.00 93.38 90 B 1 +ATOM 711 O OG1 . THR B 2 90 ? -24.098 -4.774 -2.877 1.00 82.53 90 B 1 +ATOM 712 C CG2 . THR B 2 90 ? -25.027 -3.936 -4.885 1.00 79.10 90 B 1 +ATOM 713 N N . GLU B 2 91 ? -20.864 -4.468 -2.837 1.00 95.71 91 B 1 +ATOM 714 C CA . GLU B 2 91 ? -19.708 -4.158 -1.993 1.00 95.74 91 B 1 +ATOM 715 C C . GLU B 2 91 ? -18.360 -4.125 -2.739 1.00 96.25 91 B 1 +ATOM 716 O O . GLU B 2 91 ? -17.358 -3.706 -2.154 1.00 95.60 91 B 1 +ATOM 717 C CB . GLU B 2 91 ? -19.641 -5.115 -0.791 1.00 94.49 91 B 1 +ATOM 718 C CG . GLU B 2 91 ? -19.343 -6.594 -1.107 1.00 84.71 91 B 1 +ATOM 719 C CD . GLU B 2 91 ? -20.581 -7.483 -1.316 1.00 79.16 91 B 1 +ATOM 720 O OE1 . GLU B 2 91 ? -20.442 -8.712 -1.099 1.00 72.38 91 B 1 +ATOM 721 O OE2 . GLU B 2 91 ? -21.651 -6.963 -1.694 1.00 73.23 91 B 1 +ATOM 722 N N . ASP B 2 92 ? -18.327 -4.530 -4.015 1.00 96.92 92 B 1 +ATOM 723 C CA . ASP B 2 92 ? -17.157 -4.366 -4.880 1.00 97.36 92 B 1 +ATOM 724 C C . ASP B 2 92 ? -17.111 -2.972 -5.543 1.00 97.24 92 B 1 +ATOM 725 O O . ASP B 2 92 ? -16.128 -2.643 -6.211 1.00 96.89 92 B 1 +ATOM 726 C CB . ASP B 2 92 ? -17.113 -5.467 -5.956 1.00 97.79 92 B 1 +ATOM 727 C CG . ASP B 2 92 ? -17.032 -6.902 -5.413 1.00 97.85 92 B 1 +ATOM 728 O OD1 . ASP B 2 92 ? -16.208 -7.202 -4.523 1.00 96.90 92 B 1 +ATOM 729 O OD2 . ASP B 2 92 ? -17.743 -7.781 -5.950 1.00 97.03 92 B 1 +ATOM 730 N N . THR B 2 93 ? -18.142 -2.151 -5.373 1.00 96.38 93 B 1 +ATOM 731 C CA . THR B 2 93 ? -18.184 -0.771 -5.875 1.00 96.00 93 B 1 +ATOM 732 C C . THR B 2 93 ? -17.066 0.064 -5.251 1.00 96.21 93 B 1 +ATOM 733 O O . THR B 2 93 ? -16.880 0.066 -4.035 1.00 95.53 93 B 1 +ATOM 734 C CB . THR B 2 93 ? -19.543 -0.114 -5.584 1.00 95.02 93 B 1 +ATOM 735 O OG1 . THR B 2 93 ? -20.553 -0.824 -6.273 1.00 92.85 93 B 1 +ATOM 736 C CG2 . THR B 2 93 ? -19.636 1.342 -6.043 1.00 93.17 93 B 1 +ATOM 737 N N . GLY B 2 94 ? -16.339 0.806 -6.087 1.00 96.53 94 B 1 +ATOM 738 C CA . GLY B 2 94 ? -15.270 1.679 -5.625 1.00 96.48 94 B 1 +ATOM 739 C C . GLY B 2 94 ? -14.365 2.165 -6.750 1.00 96.65 94 B 1 +ATOM 740 O O . GLY B 2 94 ? -14.537 1.819 -7.924 1.00 96.07 94 B 1 +ATOM 741 N N . VAL B 2 95 ? -13.382 2.969 -6.384 1.00 96.53 95 B 1 +ATOM 742 C CA . VAL B 2 95 ? -12.290 3.361 -7.279 1.00 96.72 95 B 1 +ATOM 743 C C . VAL B 2 95 ? -11.178 2.332 -7.145 1.00 96.91 95 B 1 +ATOM 744 O O . VAL B 2 95 ? -10.679 2.105 -6.048 1.00 96.51 95 B 1 +ATOM 745 C CB . VAL B 2 95 ? -11.780 4.779 -6.981 1.00 96.26 95 B 1 +ATOM 746 C CG1 . VAL B 2 95 ? -10.759 5.205 -8.037 1.00 94.68 95 B 1 +ATOM 747 C CG2 . VAL B 2 95 ? -12.922 5.804 -6.987 1.00 94.72 95 B 1 +ATOM 748 N N . TYR B 2 96 ? -10.800 1.712 -8.256 1.00 97.82 96 B 1 +ATOM 749 C CA . TYR B 2 96 ? -9.733 0.721 -8.327 1.00 98.07 96 B 1 +ATOM 750 C C . TYR B 2 96 ? -8.465 1.377 -8.849 1.00 97.94 96 B 1 +ATOM 751 O O . TYR B 2 96 ? -8.462 1.938 -9.945 1.00 97.53 96 B 1 +ATOM 752 C CB . TYR B 2 96 ? -10.157 -0.450 -9.215 1.00 98.23 96 B 1 +ATOM 753 C CG . TYR B 2 96 ? -11.127 -1.404 -8.560 1.00 98.38 96 B 1 +ATOM 754 C CD1 . TYR B 2 96 ? -10.701 -2.683 -8.146 1.00 98.17 96 B 1 +ATOM 755 C CD2 . TYR B 2 96 ? -12.466 -1.019 -8.337 1.00 98.21 96 B 1 +ATOM 756 C CE1 . TYR B 2 96 ? -11.589 -3.566 -7.516 1.00 98.16 96 B 1 +ATOM 757 C CE2 . TYR B 2 96 ? -13.362 -1.890 -7.696 1.00 98.14 96 B 1 +ATOM 758 C CZ . TYR B 2 96 ? -12.917 -3.166 -7.287 1.00 98.35 96 B 1 +ATOM 759 O OH . TYR B 2 96 ? -13.787 -4.013 -6.651 1.00 98.06 96 B 1 +ATOM 760 N N . TYR B 2 97 ? -7.407 1.278 -8.069 1.00 97.35 97 B 1 +ATOM 761 C CA . TYR B 2 97 ? -6.084 1.793 -8.367 1.00 97.20 97 B 1 +ATOM 762 C C . TYR B 2 97 ? -5.147 0.634 -8.685 1.00 97.21 97 B 1 +ATOM 763 O O . TYR B 2 97 ? -5.123 -0.381 -7.986 1.00 96.81 97 B 1 +ATOM 764 C CB . TYR B 2 97 ? -5.555 2.601 -7.183 1.00 96.89 97 B 1 +ATOM 765 C CG . TYR B 2 97 ? -6.433 3.770 -6.795 1.00 96.57 97 B 1 +ATOM 766 C CD1 . TYR B 2 97 ? -6.284 5.013 -7.435 1.00 95.33 97 B 1 +ATOM 767 C CD2 . TYR B 2 97 ? -7.415 3.619 -5.794 1.00 95.26 97 B 1 +ATOM 768 C CE1 . TYR B 2 97 ? -7.097 6.101 -7.080 1.00 94.30 97 B 1 +ATOM 769 C CE2 . TYR B 2 97 ? -8.240 4.701 -5.435 1.00 94.20 97 B 1 +ATOM 770 C CZ . TYR B 2 97 ? -8.075 5.943 -6.082 1.00 94.64 97 B 1 +ATOM 771 O OH . TYR B 2 97 ? -8.882 6.998 -5.731 1.00 92.81 97 B 1 +ATOM 772 N N . CYS B 2 98 ? -4.357 0.820 -9.717 1.00 96.30 98 B 1 +ATOM 773 C CA . CYS B 2 98 ? -3.180 0.013 -9.973 1.00 95.99 98 B 1 +ATOM 774 C C . CYS B 2 98 ? -2.007 0.637 -9.220 1.00 96.11 98 B 1 +ATOM 775 O O . CYS B 2 98 ? -1.828 1.853 -9.250 1.00 94.69 98 B 1 +ATOM 776 C CB . CYS B 2 98 ? -2.981 -0.003 -11.481 1.00 93.19 98 B 1 +ATOM 777 S SG . CYS B 2 98 ? -1.454 -0.717 -12.094 1.00 86.94 98 B 1 +ATOM 778 N N . SER B 2 99 ? -1.206 -0.178 -8.573 1.00 94.57 99 B 1 +ATOM 779 C CA . SER B 2 99 ? -0.011 0.290 -7.888 1.00 93.34 99 B 1 +ATOM 780 C C . SER B 2 99 ? 1.181 -0.604 -8.183 1.00 93.08 99 B 1 +ATOM 781 O O . SER B 2 99 ? 1.057 -1.821 -8.337 1.00 91.30 99 B 1 +ATOM 782 C CB . SER B 2 99 ? -0.250 0.429 -6.379 1.00 90.76 99 B 1 +ATOM 783 O OG . SER B 2 99 ? -0.522 -0.828 -5.795 1.00 75.82 99 B 1 +ATOM 784 N N . ARG B 2 100 ? 2.334 0.008 -8.256 1.00 89.91 100 B 1 +ATOM 785 C CA . ARG B 2 100 ? 3.611 -0.684 -8.275 1.00 87.16 100 B 1 +ATOM 786 C C . ARG B 2 100 ? 4.056 -0.917 -6.844 1.00 84.67 100 B 1 +ATOM 787 O O . ARG B 2 100 ? 4.082 0.021 -6.046 1.00 80.33 100 B 1 +ATOM 788 C CB . ARG B 2 100 ? 4.620 0.152 -9.067 1.00 83.51 100 B 1 +ATOM 789 C CG . ARG B 2 100 ? 5.957 -0.565 -9.219 1.00 79.01 100 B 1 +ATOM 790 C CD . ARG B 2 100 ? 6.945 0.288 -10.013 1.00 78.65 100 B 1 +ATOM 791 N NE . ARG B 2 100 ? 7.575 1.313 -9.177 1.00 76.17 100 B 1 +ATOM 792 C CZ . ARG B 2 100 ? 8.584 2.086 -9.542 1.00 75.61 100 B 1 +ATOM 793 N NH1 . ARG B 2 100 ? 9.042 2.076 -10.759 1.00 70.86 100 B 1 +ATOM 794 N NH2 . ARG B 2 100 ? 9.169 2.872 -8.697 1.00 70.49 100 B 1 +ATOM 795 N N . ASN B 2 101 ? 4.445 -2.149 -6.557 1.00 77.55 101 B 1 +ATOM 796 C CA . ASN B 2 101 ? 5.154 -2.470 -5.335 1.00 72.22 101 B 1 +ATOM 797 C C . ASN B 2 101 ? 6.644 -2.530 -5.666 1.00 69.09 101 B 1 +ATOM 798 O O . ASN B 2 101 ? 7.069 -3.342 -6.497 1.00 61.82 101 B 1 +ATOM 799 C CB . ASN B 2 101 ? 4.583 -3.779 -4.758 1.00 67.63 101 B 1 +ATOM 800 C CG . ASN B 2 101 ? 4.722 -3.853 -3.251 1.00 60.69 101 B 1 +ATOM 801 O OD1 . ASN B 2 101 ? 5.294 -2.995 -2.626 1.00 54.96 101 B 1 +ATOM 802 N ND2 . ASN B 2 101 ? 4.157 -4.871 -2.629 1.00 55.73 101 B 1 +ATOM 803 N N . TYR B 2 102 ? 7.432 -1.644 -5.070 1.00 59.20 102 B 1 +ATOM 804 C CA . TYR B 2 102 ? 8.870 -1.823 -5.133 1.00 55.80 102 B 1 +ATOM 805 C C . TYR B 2 102 ? 9.225 -3.121 -4.411 1.00 55.45 102 B 1 +ATOM 806 O O . TYR B 2 102 ? 8.486 -3.580 -3.530 1.00 50.66 102 B 1 +ATOM 807 C CB . TYR B 2 102 ? 9.591 -0.602 -4.561 1.00 50.77 102 B 1 +ATOM 808 C CG . TYR B 2 102 ? 11.008 -0.469 -5.073 1.00 46.67 102 B 1 +ATOM 809 C CD1 . TYR B 2 102 ? 12.100 -0.921 -4.308 1.00 42.98 102 B 1 +ATOM 810 C CD2 . TYR B 2 102 ? 11.247 0.100 -6.343 1.00 42.73 102 B 1 +ATOM 811 C CE1 . TYR B 2 102 ? 13.410 -0.805 -4.798 1.00 40.36 102 B 1 +ATOM 812 C CE2 . TYR B 2 102 ? 12.557 0.218 -6.840 1.00 40.51 102 B 1 +ATOM 813 C CZ . TYR B 2 102 ? 13.635 -0.234 -6.064 1.00 40.62 102 B 1 +ATOM 814 O OH . TYR B 2 102 ? 14.918 -0.116 -6.551 1.00 35.84 102 B 1 +ATOM 815 N N . TYR B 2 103 ? 10.330 -3.749 -4.790 1.00 52.69 103 B 1 +ATOM 816 C CA . TYR B 2 103 ? 10.781 -4.939 -4.090 1.00 50.15 103 B 1 +ATOM 817 C C . TYR B 2 103 ? 10.982 -4.589 -2.613 1.00 50.51 103 B 1 +ATOM 818 O O . TYR B 2 103 ? 11.904 -3.852 -2.273 1.00 46.90 103 B 1 +ATOM 819 C CB . TYR B 2 103 ? 12.050 -5.472 -4.761 1.00 46.06 103 B 1 +ATOM 820 C CG . TYR B 2 103 ? 12.348 -6.898 -4.368 1.00 44.09 103 B 1 +ATOM 821 C CD1 . TYR B 2 103 ? 13.101 -7.175 -3.215 1.00 41.45 103 B 1 +ATOM 822 C CD2 . TYR B 2 103 ? 11.822 -7.962 -5.128 1.00 41.14 103 B 1 +ATOM 823 C CE1 . TYR B 2 103 ? 13.311 -8.504 -2.813 1.00 39.45 103 B 1 +ATOM 824 C CE2 . TYR B 2 103 ? 12.027 -9.291 -4.729 1.00 39.13 103 B 1 +ATOM 825 C CZ . TYR B 2 103 ? 12.764 -9.557 -3.565 1.00 39.16 103 B 1 +ATOM 826 O OH . TYR B 2 103 ? 12.934 -10.857 -3.152 1.00 34.64 103 B 1 +ATOM 827 N N . GLY B 2 104 ? 10.059 -5.053 -1.780 1.00 48.05 104 B 1 +ATOM 828 C CA . GLY B 2 104 ? 9.934 -4.575 -0.416 1.00 45.70 104 B 1 +ATOM 829 C C . GLY B 2 104 ? 8.802 -3.562 -0.211 1.00 47.08 104 B 1 +ATOM 830 O O . GLY B 2 104 ? 9.063 -2.379 -0.031 1.00 43.51 104 B 1 +ATOM 831 N N . SER B 2 105 ? 7.568 -4.073 -0.220 1.00 49.68 105 B 1 +ATOM 832 C CA . SER B 2 105 ? 6.329 -3.606 0.441 1.00 48.30 105 B 1 +ATOM 833 C C . SER B 2 105 ? 5.816 -2.171 0.314 1.00 50.66 105 B 1 +ATOM 834 O O . SER B 2 105 ? 4.642 -1.957 0.629 1.00 47.02 105 B 1 +ATOM 835 C CB . SER B 2 105 ? 6.363 -3.975 1.919 1.00 42.69 105 B 1 +ATOM 836 O OG . SER B 2 105 ? 7.284 -3.166 2.613 1.00 38.31 105 B 1 +ATOM 837 N N . THR B 2 106 ? 6.586 -1.188 -0.101 1.00 51.03 106 B 1 +ATOM 838 C CA . THR B 2 106 ? 6.059 0.169 -0.219 1.00 50.28 106 B 1 +ATOM 839 C C . THR B 2 106 ? 5.439 0.388 -1.598 1.00 51.62 106 B 1 +ATOM 840 O O . THR B 2 106 ? 6.107 0.283 -2.626 1.00 48.66 106 B 1 +ATOM 841 C CB . THR B 2 106 ? 7.087 1.251 0.142 1.00 46.43 106 B 1 +ATOM 842 O OG1 . THR B 2 106 ? 8.333 1.020 -0.458 1.00 43.01 106 B 1 +ATOM 843 C CG2 . THR B 2 106 ? 7.311 1.296 1.654 1.00 41.17 106 B 1 +ATOM 844 N N . TYR B 2 107 ? 4.140 0.703 -1.602 1.00 58.52 107 B 1 +ATOM 845 C CA . TYR B 2 107 ? 3.454 1.209 -2.780 1.00 58.35 107 B 1 +ATOM 846 C C . TYR B 2 107 ? 4.018 2.595 -3.096 1.00 60.75 107 B 1 +ATOM 847 O O . TYR B 2 107 ? 3.705 3.565 -2.408 1.00 57.51 107 B 1 +ATOM 848 C CB . TYR B 2 107 ? 1.951 1.277 -2.521 1.00 53.76 107 B 1 +ATOM 849 C CG . TYR B 2 107 ? 1.320 -0.037 -2.131 1.00 51.82 107 B 1 +ATOM 850 C CD1 . TYR B 2 107 ? 1.251 -1.095 -3.053 1.00 47.73 107 B 1 +ATOM 851 C CD2 . TYR B 2 107 ? 0.798 -0.214 -0.833 1.00 47.75 107 B 1 +ATOM 852 C CE1 . TYR B 2 107 ? 0.675 -2.320 -2.689 1.00 45.50 107 B 1 +ATOM 853 C CE2 . TYR B 2 107 ? 0.220 -1.437 -0.459 1.00 45.16 107 B 1 +ATOM 854 C CZ . TYR B 2 107 ? 0.163 -2.489 -1.392 1.00 44.71 107 B 1 +ATOM 855 O OH . TYR B 2 107 ? -0.397 -3.688 -1.026 1.00 38.21 107 B 1 +ATOM 856 N N . ASP B 2 108 ? 4.869 2.687 -4.091 1.00 64.19 108 B 1 +ATOM 857 C CA . ASP B 2 108 ? 5.592 3.919 -4.402 1.00 64.75 108 B 1 +ATOM 858 C C . ASP B 2 108 ? 4.946 4.741 -5.527 1.00 68.90 108 B 1 +ATOM 859 O O . ASP B 2 108 ? 5.015 5.972 -5.511 1.00 66.26 108 B 1 +ATOM 860 C CB . ASP B 2 108 ? 7.067 3.591 -4.669 1.00 58.06 108 B 1 +ATOM 861 C CG . ASP B 2 108 ? 7.339 2.648 -5.847 1.00 52.03 108 B 1 +ATOM 862 O OD1 . ASP B 2 108 ? 6.413 2.052 -6.438 1.00 48.07 108 B 1 +ATOM 863 O OD2 . ASP B 2 108 ? 8.520 2.542 -6.224 1.00 48.74 108 B 1 +ATOM 864 N N . TYR B 2 109 ? 4.273 4.077 -6.469 1.00 81.57 109 B 1 +ATOM 865 C CA . TYR B 2 109 ? 3.530 4.736 -7.539 1.00 84.73 109 B 1 +ATOM 866 C C . TYR B 2 109 ? 2.127 4.151 -7.674 1.00 87.89 109 B 1 +ATOM 867 O O . TYR B 2 109 ? 1.925 2.940 -7.621 1.00 87.22 109 B 1 +ATOM 868 C CB . TYR B 2 109 ? 4.292 4.641 -8.864 1.00 81.31 109 B 1 +ATOM 869 C CG . TYR B 2 109 ? 5.549 5.479 -8.889 1.00 75.74 109 B 1 +ATOM 870 C CD1 . TYR B 2 109 ? 5.511 6.826 -9.297 1.00 71.65 109 B 1 +ATOM 871 C CD2 . TYR B 2 109 ? 6.774 4.925 -8.460 1.00 69.41 109 B 1 +ATOM 872 C CE1 . TYR B 2 109 ? 6.678 7.605 -9.292 1.00 64.61 109 B 1 +ATOM 873 C CE2 . TYR B 2 109 ? 7.944 5.700 -8.447 1.00 62.91 109 B 1 +ATOM 874 C CZ . TYR B 2 109 ? 7.890 7.039 -8.866 1.00 62.14 109 B 1 +ATOM 875 O OH . TYR B 2 109 ? 9.038 7.790 -8.859 1.00 56.50 109 B 1 +ATOM 876 N N . TRP B 2 110 ? 1.179 5.050 -7.911 1.00 90.15 110 B 1 +ATOM 877 C CA . TRP B 2 110 ? -0.238 4.755 -8.077 1.00 91.69 110 B 1 +ATOM 878 C C . TRP B 2 110 ? -0.741 5.394 -9.369 1.00 93.21 110 B 1 +ATOM 879 O O . TRP B 2 110 ? -0.274 6.469 -9.755 1.00 92.22 110 B 1 +ATOM 880 C CB . TRP B 2 110 ? -1.014 5.283 -6.866 1.00 89.44 110 B 1 +ATOM 881 C CG . TRP B 2 110 ? -0.676 4.632 -5.552 1.00 86.84 110 B 1 +ATOM 882 C CD1 . TRP B 2 110 ? 0.499 4.733 -4.894 1.00 79.62 110 B 1 +ATOM 883 C CD2 . TRP B 2 110 ? -1.515 3.755 -4.742 1.00 82.56 110 B 1 +ATOM 884 N NE1 . TRP B 2 110 ? 0.456 3.975 -3.726 1.00 76.62 110 B 1 +ATOM 885 C CE2 . TRP B 2 110 ? -0.773 3.368 -3.592 1.00 79.95 110 B 1 +ATOM 886 C CE3 . TRP B 2 110 ? -2.831 3.264 -4.874 1.00 74.74 110 B 1 +ATOM 887 C CZ2 . TRP B 2 110 ? -1.311 2.530 -2.600 1.00 75.51 110 B 1 +ATOM 888 C CZ3 . TRP B 2 110 ? -3.370 2.431 -3.881 1.00 74.25 110 B 1 +ATOM 889 C CH2 . TRP B 2 110 ? -2.617 2.068 -2.758 1.00 74.59 110 B 1 +ATOM 890 N N . GLY B 2 111 ? -1.705 4.752 -10.021 1.00 95.33 111 B 1 +ATOM 891 C CA . GLY B 2 111 ? -2.467 5.387 -11.081 1.00 95.72 111 B 1 +ATOM 892 C C . GLY B 2 111 ? -3.500 6.376 -10.541 1.00 95.81 111 B 1 +ATOM 893 O O . GLY B 2 111 ? -3.624 6.603 -9.332 1.00 94.93 111 B 1 +ATOM 894 N N . GLN B 2 112 ? -4.260 6.964 -11.471 1.00 95.54 112 B 1 +ATOM 895 C CA . GLN B 2 112 ? -5.349 7.890 -11.131 1.00 94.82 112 B 1 +ATOM 896 C C . GLN B 2 112 ? -6.615 7.160 -10.669 1.00 95.61 112 B 1 +ATOM 897 O O . GLN B 2 112 ? -7.528 7.778 -10.123 1.00 94.27 112 B 1 +ATOM 898 C CB . GLN B 2 112 ? -5.655 8.786 -12.342 1.00 92.55 112 B 1 +ATOM 899 C CG . GLN B 2 112 ? -4.470 9.670 -12.754 1.00 79.91 112 B 1 +ATOM 900 C CD . GLN B 2 112 ? -4.036 10.631 -11.641 1.00 64.26 112 B 1 +ATOM 901 O OE1 . GLN B 2 112 ? -4.821 11.358 -11.059 1.00 57.50 112 B 1 +ATOM 902 N NE2 . GLN B 2 112 ? -2.768 10.671 -11.307 1.00 52.41 112 B 1 +ATOM 903 N N . GLY B 2 113 ? -6.687 5.849 -10.895 1.00 96.09 113 B 1 +ATOM 904 C CA . GLY B 2 113 ? -7.826 5.013 -10.574 1.00 96.45 113 B 1 +ATOM 905 C C . GLY B 2 113 ? -8.866 4.929 -11.693 1.00 96.76 113 B 1 +ATOM 906 O O . GLY B 2 113 ? -9.000 5.789 -12.562 1.00 95.74 113 B 1 +ATOM 907 N N . THR B 2 114 ? -9.655 3.863 -11.640 1.00 96.22 114 B 1 +ATOM 908 C CA . THR B 2 114 ? -10.829 3.661 -12.492 1.00 96.44 114 B 1 +ATOM 909 C C . THR B 2 114 ? -12.028 3.274 -11.632 1.00 96.39 114 B 1 +ATOM 910 O O . THR B 2 114 ? -11.930 2.417 -10.754 1.00 96.10 114 B 1 +ATOM 911 C CB . THR B 2 114 ? -10.538 2.653 -13.615 1.00 96.48 114 B 1 +ATOM 912 O OG1 . THR B 2 114 ? -11.594 2.664 -14.552 1.00 95.40 114 B 1 +ATOM 913 C CG2 . THR B 2 114 ? -10.334 1.212 -13.155 1.00 95.29 114 B 1 +ATOM 914 N N . THR B 2 115 ? -13.163 3.912 -11.861 1.00 94.83 115 B 1 +ATOM 915 C CA . THR B 2 115 ? -14.362 3.703 -11.043 1.00 94.41 115 B 1 +ATOM 916 C C . THR B 2 115 ? -15.159 2.506 -11.542 1.00 94.75 115 B 1 +ATOM 917 O O . THR B 2 115 ? -15.614 2.488 -12.687 1.00 93.86 115 B 1 +ATOM 918 C CB . THR B 2 115 ? -15.240 4.958 -11.006 1.00 93.26 115 B 1 +ATOM 919 O OG1 . THR B 2 115 ? -14.468 6.071 -10.613 1.00 90.77 115 B 1 +ATOM 920 C CG2 . THR B 2 115 ? -16.393 4.835 -10.008 1.00 90.81 115 B 1 +ATOM 921 N N . LEU B 2 116 ? -15.370 1.526 -10.669 1.00 95.97 116 B 1 +ATOM 922 C CA . LEU B 2 116 ? -16.300 0.424 -10.855 1.00 96.33 116 B 1 +ATOM 923 C C . LEU B 2 116 ? -17.551 0.681 -10.014 1.00 96.25 116 B 1 +ATOM 924 O O . LEU B 2 116 ? -17.458 0.875 -8.803 1.00 95.74 116 B 1 +ATOM 925 C CB . LEU B 2 116 ? -15.613 -0.888 -10.443 1.00 96.57 116 B 1 +ATOM 926 C CG . LEU B 2 116 ? -16.523 -2.128 -10.570 1.00 96.11 116 B 1 +ATOM 927 C CD1 . LEU B 2 116 ? -16.804 -2.474 -12.028 1.00 93.41 116 B 1 +ATOM 928 C CD2 . LEU B 2 116 ? -15.861 -3.329 -9.906 1.00 93.16 116 B 1 +ATOM 929 N N . THR B 2 117 ? -18.717 0.629 -10.646 1.00 94.74 117 B 1 +ATOM 930 C CA . THR B 2 117 ? -20.003 0.692 -9.946 1.00 94.70 117 B 1 +ATOM 931 C C . THR B 2 117 ? -20.795 -0.573 -10.232 1.00 95.11 117 B 1 +ATOM 932 O O . THR B 2 117 ? -21.128 -0.851 -11.382 1.00 94.49 117 B 1 +ATOM 933 C CB . THR B 2 117 ? -20.801 1.936 -10.350 1.00 94.18 117 B 1 +ATOM 934 O OG1 . THR B 2 117 ? -20.035 3.096 -10.142 1.00 92.48 117 B 1 +ATOM 935 C CG2 . THR B 2 117 ? -22.080 2.086 -9.529 1.00 92.89 117 B 1 +ATOM 936 N N . VAL B 2 118 ? -21.110 -1.336 -9.191 1.00 95.88 118 B 1 +ATOM 937 C CA . VAL B 2 118 ? -21.954 -2.533 -9.269 1.00 96.13 118 B 1 +ATOM 938 C C . VAL B 2 118 ? -23.350 -2.161 -8.784 1.00 95.54 118 B 1 +ATOM 939 O O . VAL B 2 118 ? -23.573 -1.958 -7.592 1.00 94.59 118 B 1 +ATOM 940 C CB . VAL B 2 118 ? -21.366 -3.709 -8.475 1.00 96.34 118 B 1 +ATOM 941 C CG1 . VAL B 2 118 ? -22.179 -4.979 -8.738 1.00 95.46 118 B 1 +ATOM 942 C CG2 . VAL B 2 118 ? -19.906 -3.983 -8.857 1.00 94.76 118 B 1 +ATOM 943 N N . SER B 2 119 ? -24.280 -2.032 -9.710 1.00 93.77 119 B 1 +ATOM 944 C CA . SER B 2 119 ? -25.645 -1.600 -9.415 1.00 93.37 119 B 1 +ATOM 945 C C . SER B 2 119 ? -26.615 -2.078 -10.494 1.00 93.82 119 B 1 +ATOM 946 O O . SER B 2 119 ? -26.268 -2.169 -11.671 1.00 94.10 119 B 1 +ATOM 947 C CB . SER B 2 119 ? -25.686 -0.070 -9.320 1.00 92.78 119 B 1 +ATOM 948 O OG . SER B 2 119 ? -26.987 0.384 -8.989 1.00 90.66 119 B 1 +ATOM 949 N N . SER B 2 120 ? -27.865 -2.323 -10.111 1.00 93.62 120 B 1 +ATOM 950 C CA . SER B 2 120 ? -28.970 -2.571 -11.045 1.00 93.25 120 B 1 +ATOM 951 C C . SER B 2 120 ? -29.569 -1.288 -11.631 1.00 93.38 120 B 1 +ATOM 952 O O . SER B 2 120 ? -30.411 -1.360 -12.526 1.00 91.07 120 B 1 +ATOM 953 C CB . SER B 2 120 ? -30.056 -3.386 -10.342 1.00 91.55 120 B 1 +ATOM 954 O OG . SER B 2 120 ? -30.482 -2.721 -9.166 1.00 85.19 120 B 1 +ATOM 955 N N . ALA B 2 121 ? -29.173 -0.107 -11.136 1.00 92.81 121 B 1 +ATOM 956 C CA . ALA B 2 121 ? -29.643 1.175 -11.649 1.00 92.26 121 B 1 +ATOM 957 C C . ALA B 2 121 ? -29.132 1.425 -13.082 1.00 92.91 121 B 1 +ATOM 958 O O . ALA B 2 121 ? -28.086 0.936 -13.494 1.00 92.22 121 B 1 +ATOM 959 C CB . ALA B 2 121 ? -29.231 2.295 -10.686 1.00 90.76 121 B 1 +ATOM 960 N N . SER B 2 122 ? -29.882 2.223 -13.843 1.00 94.58 122 B 1 +ATOM 961 C CA . SER B 2 122 ? -29.523 2.571 -15.217 1.00 94.85 122 B 1 +ATOM 962 C C . SER B 2 122 ? -28.570 3.763 -15.277 1.00 95.91 122 B 1 +ATOM 963 O O . SER B 2 122 ? -28.664 4.697 -14.479 1.00 94.58 122 B 1 +ATOM 964 C CB . SER B 2 122 ? -30.785 2.850 -16.039 1.00 92.31 122 B 1 +ATOM 965 O OG . SER B 2 122 ? -31.555 3.870 -15.436 1.00 81.55 122 B 1 +ATOM 966 N N . THR B 2 123 ? -27.711 3.773 -16.299 1.00 95.23 123 B 1 +ATOM 967 C CA . THR B 2 123 ? -26.888 4.941 -16.635 1.00 95.60 123 B 1 +ATOM 968 C C . THR B 2 123 ? -27.766 6.144 -16.981 1.00 96.17 123 B 1 +ATOM 969 O O . THR B 2 123 ? -28.722 6.032 -17.751 1.00 95.37 123 B 1 +ATOM 970 C CB . THR B 2 123 ? -25.962 4.629 -17.819 1.00 94.36 123 B 1 +ATOM 971 O OG1 . THR B 2 123 ? -25.213 3.465 -17.551 1.00 85.63 123 B 1 +ATOM 972 C CG2 . THR B 2 123 ? -24.956 5.739 -18.095 1.00 84.37 123 B 1 +ATOM 973 N N . LYS B 2 124 ? -27.404 7.316 -16.460 1.00 97.09 124 B 1 +ATOM 974 C CA . LYS B 2 124 ? -28.041 8.587 -16.803 1.00 97.56 124 B 1 +ATOM 975 C C . LYS B 2 124 ? -26.983 9.664 -17.028 1.00 97.80 124 B 1 +ATOM 976 O O . LYS B 2 124 ? -26.143 9.898 -16.168 1.00 97.50 124 B 1 +ATOM 977 C CB . LYS B 2 124 ? -29.044 8.971 -15.708 1.00 97.25 124 B 1 +ATOM 978 C CG . LYS B 2 124 ? -29.787 10.273 -16.039 1.00 95.08 124 B 1 +ATOM 979 C CD . LYS B 2 124 ? -30.781 10.659 -14.934 1.00 92.38 124 B 1 +ATOM 980 C CE . LYS B 2 124 ? -31.463 12.000 -15.237 1.00 88.30 124 B 1 +ATOM 981 N NZ . LYS B 2 124 ? -30.508 13.137 -15.223 1.00 81.60 124 B 1 +ATOM 982 N N . GLY B 2 125 ? -27.040 10.334 -18.182 1.00 97.75 125 B 1 +ATOM 983 C CA . GLY B 2 125 ? -26.170 11.475 -18.467 1.00 98.05 125 B 1 +ATOM 984 C C . GLY B 2 125 ? -26.545 12.715 -17.649 1.00 98.37 125 B 1 +ATOM 985 O O . GLY B 2 125 ? -27.722 12.901 -17.325 1.00 97.85 125 B 1 +ATOM 986 N N . PRO B 2 126 ? -25.565 13.584 -17.339 1.00 98.44 126 B 1 +ATOM 987 C CA . PRO B 2 126 ? -25.810 14.786 -16.548 1.00 98.52 126 B 1 +ATOM 988 C C . PRO B 2 126 ? -26.547 15.872 -17.336 1.00 98.55 126 B 1 +ATOM 989 O O . PRO B 2 126 ? -26.400 16.012 -18.550 1.00 98.06 126 B 1 +ATOM 990 C CB . PRO B 2 126 ? -24.428 15.268 -16.110 1.00 98.15 126 B 1 +ATOM 991 C CG . PRO B 2 126 ? -23.517 14.808 -17.251 1.00 97.61 126 B 1 +ATOM 992 C CD . PRO B 2 126 ? -24.153 13.484 -17.673 1.00 98.09 126 B 1 +ATOM 993 N N . SER B 2 127 ? -27.251 16.725 -16.609 1.00 98.52 127 B 1 +ATOM 994 C CA . SER B 2 127 ? -27.662 18.048 -17.077 1.00 98.51 127 B 1 +ATOM 995 C C . SER B 2 127 ? -26.636 19.081 -16.611 1.00 98.64 127 B 1 +ATOM 996 O O . SER B 2 127 ? -26.299 19.122 -15.428 1.00 98.10 127 B 1 +ATOM 997 C CB . SER B 2 127 ? -29.052 18.396 -16.548 1.00 97.96 127 B 1 +ATOM 998 O OG . SER B 2 127 ? -30.006 17.467 -17.044 1.00 92.51 127 B 1 +ATOM 999 N N . VAL B 2 128 ? -26.145 19.922 -17.527 1.00 98.62 128 B 1 +ATOM 1000 C CA . VAL B 2 128 ? -25.127 20.937 -17.216 1.00 98.66 128 B 1 +ATOM 1001 C C . VAL B 2 128 ? -25.749 22.328 -17.246 1.00 98.59 128 B 1 +ATOM 1002 O O . VAL B 2 128 ? -26.253 22.777 -18.278 1.00 97.95 128 B 1 +ATOM 1003 C CB . VAL B 2 128 ? -23.907 20.835 -18.149 1.00 98.44 128 B 1 +ATOM 1004 C CG1 . VAL B 2 128 ? -22.813 21.823 -17.726 1.00 97.35 128 B 1 +ATOM 1005 C CG2 . VAL B 2 128 ? -23.310 19.423 -18.125 1.00 97.12 128 B 1 +ATOM 1006 N N . PHE B 2 129 ? -25.684 23.022 -16.121 1.00 98.64 129 B 1 +ATOM 1007 C CA . PHE B 2 129 ? -26.210 24.373 -15.948 1.00 98.52 129 B 1 +ATOM 1008 C C . PHE B 2 129 ? -25.064 25.364 -15.729 1.00 98.55 129 B 1 +ATOM 1009 O O . PHE B 2 129 ? -24.211 25.121 -14.877 1.00 98.01 129 B 1 +ATOM 1010 C CB . PHE B 2 129 ? -27.192 24.408 -14.771 1.00 98.13 129 B 1 +ATOM 1011 C CG . PHE B 2 129 ? -28.392 23.501 -14.947 1.00 97.45 129 B 1 +ATOM 1012 C CD1 . PHE B 2 129 ? -29.526 23.947 -15.646 1.00 93.88 129 B 1 +ATOM 1013 C CD2 . PHE B 2 129 ? -28.377 22.200 -14.419 1.00 94.17 129 B 1 +ATOM 1014 C CE1 . PHE B 2 129 ? -30.635 23.104 -15.811 1.00 92.39 129 B 1 +ATOM 1015 C CE2 . PHE B 2 129 ? -29.484 21.349 -14.584 1.00 92.18 129 B 1 +ATOM 1016 C CZ . PHE B 2 129 ? -30.614 21.805 -15.279 1.00 93.84 129 B 1 +ATOM 1017 N N . PRO B 2 130 ? -25.032 26.493 -16.468 1.00 98.41 130 B 1 +ATOM 1018 C CA . PRO B 2 130 ? -24.043 27.532 -16.219 1.00 98.08 130 B 1 +ATOM 1019 C C . PRO B 2 130 ? -24.377 28.285 -14.922 1.00 97.84 130 B 1 +ATOM 1020 O O . PRO B 2 130 ? -25.522 28.688 -14.696 1.00 96.24 130 B 1 +ATOM 1021 C CB . PRO B 2 130 ? -24.103 28.434 -17.455 1.00 97.02 130 B 1 +ATOM 1022 C CG . PRO B 2 130 ? -25.560 28.318 -17.907 1.00 94.69 130 B 1 +ATOM 1023 C CD . PRO B 2 130 ? -25.945 26.891 -17.527 1.00 96.97 130 B 1 +ATOM 1024 N N . LEU B 2 131 ? -23.361 28.516 -14.106 1.00 97.97 131 B 1 +ATOM 1025 C CA . LEU B 2 131 ? -23.412 29.374 -12.921 1.00 97.65 131 B 1 +ATOM 1026 C C . LEU B 2 131 ? -22.776 30.717 -13.286 1.00 97.23 131 B 1 +ATOM 1027 O O . LEU B 2 131 ? -21.564 30.903 -13.166 1.00 96.17 131 B 1 +ATOM 1028 C CB . LEU B 2 131 ? -22.714 28.682 -11.738 1.00 97.30 131 B 1 +ATOM 1029 C CG . LEU B 2 131 ? -23.287 27.306 -11.338 1.00 96.18 131 B 1 +ATOM 1030 C CD1 . LEU B 2 131 ? -22.463 26.724 -10.193 1.00 93.75 131 B 1 +ATOM 1031 C CD2 . LEU B 2 131 ? -24.748 27.395 -10.894 1.00 93.05 131 B 1 +ATOM 1032 N N . ALA B 2 132 ? -23.604 31.625 -13.797 1.00 96.00 132 B 1 +ATOM 1033 C CA . ALA B 2 132 ? -23.142 32.910 -14.309 1.00 94.97 132 B 1 +ATOM 1034 C C . ALA B 2 132 ? -22.575 33.799 -13.187 1.00 94.46 132 B 1 +ATOM 1035 O O . ALA B 2 132 ? -23.163 33.852 -12.098 1.00 91.70 132 B 1 +ATOM 1036 C CB . ALA B 2 132 ? -24.299 33.600 -15.040 1.00 92.86 132 B 1 +ATOM 1037 N N . PRO B 2 133 ? -21.479 34.531 -13.455 1.00 93.83 133 B 1 +ATOM 1038 C CA . PRO B 2 133 ? -20.994 35.530 -12.519 1.00 92.05 133 B 1 +ATOM 1039 C C . PRO B 2 133 ? -22.035 36.644 -12.364 1.00 90.19 133 B 1 +ATOM 1040 O O . PRO B 2 133 ? -22.762 37.000 -13.296 1.00 86.28 133 B 1 +ATOM 1041 C CB . PRO B 2 133 ? -19.670 36.032 -13.096 1.00 90.22 133 B 1 +ATOM 1042 C CG . PRO B 2 133 ? -19.853 35.842 -14.603 1.00 90.16 133 B 1 +ATOM 1043 C CD . PRO B 2 133 ? -20.726 34.599 -14.705 1.00 92.35 133 B 1 +ATOM 1044 N N . SER B 2 134 ? -22.096 37.199 -11.160 1.00 88.19 134 B 1 +ATOM 1045 C CA . SER B 2 134 ? -22.976 38.320 -10.840 1.00 85.30 134 B 1 +ATOM 1046 C C . SER B 2 134 ? -22.193 39.400 -10.103 1.00 84.34 134 B 1 +ATOM 1047 O O . SER B 2 134 ? -21.119 39.144 -9.561 1.00 79.24 134 B 1 +ATOM 1048 C CB . SER B 2 134 ? -24.169 37.828 -10.007 1.00 80.28 134 B 1 +ATOM 1049 O OG . SER B 2 134 ? -23.785 37.528 -8.676 1.00 72.74 134 B 1 +ATOM 1050 N N . SER B 2 135 ? -22.748 40.596 -10.013 1.00 78.17 135 B 1 +ATOM 1051 C CA . SER B 2 135 ? -22.164 41.673 -9.205 1.00 75.66 135 B 1 +ATOM 1052 C C . SER B 2 135 ? -21.993 41.292 -7.729 1.00 75.36 135 B 1 +ATOM 1053 O O . SER B 2 135 ? -21.130 41.830 -7.046 1.00 70.37 135 B 1 +ATOM 1054 C CB . SER B 2 135 ? -23.045 42.920 -9.307 1.00 71.17 135 B 1 +ATOM 1055 O OG . SER B 2 135 ? -24.384 42.603 -8.958 1.00 64.91 135 B 1 +ATOM 1056 N N . LYS B 2 136 ? -22.788 40.342 -7.246 1.00 74.38 136 B 1 +ATOM 1057 C CA . LYS B 2 136 ? -22.678 39.807 -5.879 1.00 74.55 136 B 1 +ATOM 1058 C C . LYS B 2 136 ? -21.596 38.731 -5.731 1.00 75.27 136 B 1 +ATOM 1059 O O . LYS B 2 136 ? -21.186 38.462 -4.610 1.00 69.73 136 B 1 +ATOM 1060 C CB . LYS B 2 136 ? -24.031 39.259 -5.411 1.00 70.62 136 B 1 +ATOM 1061 C CG . LYS B 2 136 ? -25.112 40.345 -5.298 1.00 67.53 136 B 1 +ATOM 1062 C CD . LYS B 2 136 ? -26.390 39.755 -4.686 1.00 63.04 136 B 1 +ATOM 1063 C CE . LYS B 2 136 ? -27.460 40.838 -4.538 1.00 57.88 136 B 1 +ATOM 1064 N NZ . LYS B 2 136 ? -28.684 40.322 -3.883 1.00 52.31 136 B 1 +ATOM 1065 N N . SER B 2 137 ? -21.173 38.108 -6.822 1.00 74.06 137 B 1 +ATOM 1066 C CA . SER B 2 137 ? -20.100 37.106 -6.833 1.00 71.94 137 B 1 +ATOM 1067 C C . SER B 2 137 ? -18.727 37.706 -7.147 1.00 74.11 137 B 1 +ATOM 1068 O O . SER B 2 137 ? -17.806 36.964 -7.484 1.00 70.99 137 B 1 +ATOM 1069 C CB . SER B 2 137 ? -20.440 35.952 -7.781 1.00 69.65 137 B 1 +ATOM 1070 O OG . SER B 2 137 ? -20.504 36.391 -9.125 1.00 65.28 137 B 1 +ATOM 1071 N N . THR B 2 138 ? -18.597 39.023 -7.092 1.00 71.40 138 B 1 +ATOM 1072 C CA . THR B 2 138 ? -17.335 39.741 -7.272 1.00 71.59 138 B 1 +ATOM 1073 C C . THR B 2 138 ? -16.825 40.267 -5.933 1.00 73.04 138 B 1 +ATOM 1074 O O . THR B 2 138 ? -17.574 40.870 -5.163 1.00 69.91 138 B 1 +ATOM 1075 C CB . THR B 2 138 ? -17.449 40.875 -8.306 1.00 66.33 138 B 1 +ATOM 1076 O OG1 . THR B 2 138 ? -18.600 41.652 -8.100 1.00 59.59 138 B 1 +ATOM 1077 C CG2 . THR B 2 138 ? -17.550 40.334 -9.725 1.00 58.46 138 B 1 +ATOM 1078 N N . SER B 2 139 ? -15.536 40.032 -5.661 1.00 80.15 139 B 1 +ATOM 1079 C CA . SER B 2 139 ? -14.843 40.545 -4.483 1.00 81.40 139 B 1 +ATOM 1080 C C . SER B 2 139 ? -13.418 40.938 -4.861 1.00 83.17 139 B 1 +ATOM 1081 O O . SER B 2 139 ? -12.710 40.158 -5.502 1.00 77.64 139 B 1 +ATOM 1082 C CB . SER B 2 139 ? -14.833 39.496 -3.366 1.00 75.79 139 B 1 +ATOM 1083 O OG . SER B 2 139 ? -14.182 40.032 -2.224 1.00 67.67 139 B 1 +ATOM 1084 N N . GLY B 2 140 ? -13.008 42.168 -4.528 1.00 82.51 140 B 1 +ATOM 1085 C CA . GLY B 2 140 ? -11.640 42.634 -4.788 1.00 82.24 140 B 1 +ATOM 1086 C C . GLY B 2 140 ? -11.187 42.560 -6.257 1.00 84.22 140 B 1 +ATOM 1087 O O . GLY B 2 140 ? -10.034 42.246 -6.526 1.00 77.46 140 B 1 +ATOM 1088 N N . GLY B 2 141 ? -12.106 42.784 -7.215 1.00 88.04 141 B 1 +ATOM 1089 C CA . GLY B 2 141 ? -11.795 42.687 -8.652 1.00 89.67 141 B 1 +ATOM 1090 C C . GLY B 2 141 ? -11.768 41.258 -9.216 1.00 91.74 141 B 1 +ATOM 1091 O O . GLY B 2 141 ? -11.444 41.069 -10.393 1.00 89.35 141 B 1 +ATOM 1092 N N . THR B 2 142 ? -12.135 40.260 -8.423 1.00 92.81 142 B 1 +ATOM 1093 C CA . THR B 2 142 ? -12.257 38.853 -8.821 1.00 93.37 142 B 1 +ATOM 1094 C C . THR B 2 142 ? -13.729 38.461 -8.933 1.00 93.61 142 B 1 +ATOM 1095 O O . THR B 2 142 ? -14.530 38.796 -8.060 1.00 91.81 142 B 1 +ATOM 1096 C CB . THR B 2 142 ? -11.534 37.942 -7.820 1.00 92.06 142 B 1 +ATOM 1097 O OG1 . THR B 2 142 ? -10.215 38.403 -7.628 1.00 83.30 142 B 1 +ATOM 1098 C CG2 . THR B 2 142 ? -11.428 36.500 -8.301 1.00 81.36 142 B 1 +ATOM 1099 N N . ALA B 2 143 ? -14.085 37.743 -9.997 1.00 94.11 143 B 1 +ATOM 1100 C CA . ALA B 2 143 ? -15.405 37.171 -10.204 1.00 94.10 143 B 1 +ATOM 1101 C C . ALA B 2 143 ? -15.355 35.648 -10.066 1.00 94.87 143 B 1 +ATOM 1102 O O . ALA B 2 143 ? -14.435 35.010 -10.573 1.00 94.43 143 B 1 +ATOM 1103 C CB . ALA B 2 143 ? -15.930 37.594 -11.575 1.00 92.87 143 B 1 +ATOM 1104 N N . ALA B 2 144 ? -16.367 35.061 -9.424 1.00 94.65 144 B 1 +ATOM 1105 C CA . ALA B 2 144 ? -16.582 33.622 -9.398 1.00 94.55 144 B 1 +ATOM 1106 C C . ALA B 2 144 ? -17.679 33.231 -10.398 1.00 95.03 144 B 1 +ATOM 1107 O O . ALA B 2 144 ? -18.759 33.826 -10.426 1.00 94.29 144 B 1 +ATOM 1108 C CB . ALA B 2 144 ? -16.909 33.187 -7.966 1.00 93.23 144 B 1 +ATOM 1109 N N . LEU B 2 145 ? -17.394 32.220 -11.217 1.00 96.50 145 B 1 +ATOM 1110 C CA . LEU B 2 145 ? -18.342 31.588 -12.130 1.00 96.79 145 B 1 +ATOM 1111 C C . LEU B 2 145 ? -18.168 30.071 -12.075 1.00 97.37 145 B 1 +ATOM 1112 O O . LEU B 2 145 ? -17.197 29.571 -11.507 1.00 97.23 145 B 1 +ATOM 1113 C CB . LEU B 2 145 ? -18.180 32.202 -13.536 1.00 96.28 145 B 1 +ATOM 1114 C CG . LEU B 2 145 ? -16.809 31.977 -14.210 1.00 95.93 145 B 1 +ATOM 1115 C CD1 . LEU B 2 145 ? -16.755 30.673 -15.004 1.00 93.15 145 B 1 +ATOM 1116 C CD2 . LEU B 2 145 ? -16.514 33.109 -15.195 1.00 93.02 145 B 1 +ATOM 1117 N N . GLY B 2 146 ? -19.107 29.315 -12.650 1.00 98.03 146 B 1 +ATOM 1118 C CA . GLY B 2 146 ? -19.034 27.868 -12.571 1.00 98.15 146 B 1 +ATOM 1119 C C . GLY B 2 146 ? -20.002 27.123 -13.478 1.00 98.38 146 B 1 +ATOM 1120 O O . GLY B 2 146 ? -20.728 27.704 -14.283 1.00 97.83 146 B 1 +ATOM 1121 N N . CYS B 2 147 ? -20.011 25.807 -13.313 1.00 98.52 147 B 1 +ATOM 1122 C CA . CYS B 2 147 ? -20.966 24.892 -13.912 1.00 98.61 147 B 1 +ATOM 1123 C C . CYS B 2 147 ? -21.479 23.910 -12.857 1.00 98.73 147 B 1 +ATOM 1124 O O . CYS B 2 147 ? -20.692 23.307 -12.129 1.00 98.31 147 B 1 +ATOM 1125 C CB . CYS B 2 147 ? -20.321 24.161 -15.091 1.00 98.07 147 B 1 +ATOM 1126 S SG . CYS B 2 147 ? -20.171 25.226 -16.557 1.00 95.94 147 B 1 +ATOM 1127 N N . LEU B 2 148 ? -22.797 23.737 -12.807 1.00 98.69 148 B 1 +ATOM 1128 C CA . LEU B 2 148 ? -23.450 22.680 -12.044 1.00 98.69 148 B 1 +ATOM 1129 C C . LEU B 2 148 ? -23.681 21.482 -12.968 1.00 98.73 148 B 1 +ATOM 1130 O O . LEU B 2 148 ? -24.347 21.614 -13.996 1.00 98.54 148 B 1 +ATOM 1131 C CB . LEU B 2 148 ? -24.762 23.224 -11.452 1.00 98.50 148 B 1 +ATOM 1132 C CG . LEU B 2 148 ? -25.642 22.173 -10.747 1.00 97.60 148 B 1 +ATOM 1133 C CD1 . LEU B 2 148 ? -24.980 21.609 -9.492 1.00 94.67 148 B 1 +ATOM 1134 C CD2 . LEU B 2 148 ? -26.974 22.805 -10.342 1.00 94.73 148 B 1 +ATOM 1135 N N . VAL B 2 149 ? -23.150 20.314 -12.590 1.00 98.74 149 B 1 +ATOM 1136 C CA . VAL B 2 149 ? -23.321 19.035 -13.284 1.00 98.72 149 B 1 +ATOM 1137 C C . VAL B 2 149 ? -24.279 18.200 -12.451 1.00 98.65 149 B 1 +ATOM 1138 O O . VAL B 2 149 ? -23.900 17.681 -11.401 1.00 98.18 149 B 1 +ATOM 1139 C CB . VAL B 2 149 ? -21.968 18.330 -13.472 1.00 98.59 149 B 1 +ATOM 1140 C CG1 . VAL B 2 149 ? -22.136 17.069 -14.311 1.00 97.71 149 B 1 +ATOM 1141 C CG2 . VAL B 2 149 ? -20.940 19.236 -14.165 1.00 97.47 149 B 1 +ATOM 1142 N N . LYS B 2 150 ? -25.536 18.112 -12.879 1.00 98.71 150 B 1 +ATOM 1143 C CA . LYS B 2 150 ? -26.642 17.617 -12.065 1.00 98.62 150 B 1 +ATOM 1144 C C . LYS B 2 150 ? -27.222 16.308 -12.587 1.00 98.62 150 B 1 +ATOM 1145 O O . LYS B 2 150 ? -27.402 16.152 -13.793 1.00 98.28 150 B 1 +ATOM 1146 C CB . LYS B 2 150 ? -27.706 18.716 -11.939 1.00 98.16 150 B 1 +ATOM 1147 C CG . LYS B 2 150 ? -28.765 18.376 -10.878 1.00 95.35 150 B 1 +ATOM 1148 C CD . LYS B 2 150 ? -29.779 19.509 -10.668 1.00 90.94 150 B 1 +ATOM 1149 C CE . LYS B 2 150 ? -30.756 19.169 -9.526 1.00 84.72 150 B 1 +ATOM 1150 N NZ . LYS B 2 150 ? -31.772 18.174 -9.921 1.00 73.79 150 B 1 +ATOM 1151 N N . ASP B 2 151 ? -27.595 15.426 -11.652 1.00 98.19 151 B 1 +ATOM 1152 C CA . ASP B 2 151 ? -28.413 14.230 -11.859 1.00 98.14 151 B 1 +ATOM 1153 C C . ASP B 2 151 ? -27.811 13.235 -12.861 1.00 97.95 151 B 1 +ATOM 1154 O O . ASP B 2 151 ? -28.435 12.910 -13.883 1.00 96.72 151 B 1 +ATOM 1155 C CB . ASP B 2 151 ? -29.859 14.613 -12.223 1.00 97.90 151 B 1 +ATOM 1156 C CG . ASP B 2 151 ? -30.579 15.453 -11.171 1.00 97.46 151 B 1 +ATOM 1157 O OD1 . ASP B 2 151 ? -30.239 15.383 -9.973 1.00 94.99 151 B 1 +ATOM 1158 O OD2 . ASP B 2 151 ? -31.496 16.207 -11.560 1.00 94.82 151 B 1 +ATOM 1159 N N . TYR B 2 152 ? -26.610 12.737 -12.578 1.00 98.04 152 B 1 +ATOM 1160 C CA . TYR B 2 152 ? -25.947 11.706 -13.374 1.00 97.98 152 B 1 +ATOM 1161 C C . TYR B 2 152 ? -25.716 10.418 -12.580 1.00 97.75 152 B 1 +ATOM 1162 O O . TYR B 2 152 ? -25.710 10.408 -11.349 1.00 97.08 152 B 1 +ATOM 1163 C CB . TYR B 2 152 ? -24.646 12.248 -13.978 1.00 97.89 152 B 1 +ATOM 1164 C CG . TYR B 2 152 ? -23.563 12.552 -12.963 1.00 98.02 152 B 1 +ATOM 1165 C CD1 . TYR B 2 152 ? -23.487 13.834 -12.377 1.00 97.33 152 B 1 +ATOM 1166 C CD2 . TYR B 2 152 ? -22.624 11.568 -12.596 1.00 97.32 152 B 1 +ATOM 1167 C CE1 . TYR B 2 152 ? -22.488 14.129 -11.441 1.00 97.12 152 B 1 +ATOM 1168 C CE2 . TYR B 2 152 ? -21.620 11.852 -11.657 1.00 96.91 152 B 1 +ATOM 1169 C CZ . TYR B 2 152 ? -21.555 13.138 -11.081 1.00 97.46 152 B 1 +ATOM 1170 O OH . TYR B 2 152 ? -20.581 13.431 -10.168 1.00 96.69 152 B 1 +ATOM 1171 N N . PHE B 2 153 ? -25.523 9.320 -13.315 1.00 97.29 153 B 1 +ATOM 1172 C CA . PHE B 2 153 ? -25.166 8.018 -12.754 1.00 97.08 153 B 1 +ATOM 1173 C C . PHE B 2 153 ? -24.495 7.148 -13.821 1.00 96.86 153 B 1 +ATOM 1174 O O . PHE B 2 153 ? -24.955 7.152 -14.969 1.00 96.06 153 B 1 +ATOM 1175 C CB . PHE B 2 153 ? -26.428 7.334 -12.211 1.00 96.55 153 B 1 +ATOM 1176 C CG . PHE B 2 153 ? -26.138 6.058 -11.454 1.00 96.44 153 B 1 +ATOM 1177 C CD1 . PHE B 2 153 ? -26.206 4.812 -12.106 1.00 95.06 153 B 1 +ATOM 1178 C CD2 . PHE B 2 153 ? -25.746 6.109 -10.102 1.00 95.01 153 B 1 +ATOM 1179 C CE1 . PHE B 2 153 ? -25.887 3.633 -11.415 1.00 94.39 153 B 1 +ATOM 1180 C CE2 . PHE B 2 153 ? -25.429 4.931 -9.403 1.00 94.19 153 B 1 +ATOM 1181 C CZ . PHE B 2 153 ? -25.499 3.694 -10.063 1.00 94.56 153 B 1 +ATOM 1182 N N . PRO B 2 154 ? -23.463 6.354 -13.486 1.00 95.80 154 B 1 +ATOM 1183 C CA . PRO B 2 154 ? -22.715 6.355 -12.224 1.00 95.63 154 B 1 +ATOM 1184 C C . PRO B 2 154 ? -21.661 7.471 -12.181 1.00 95.82 154 B 1 +ATOM 1185 O O . PRO B 2 154 ? -21.569 8.289 -13.094 1.00 95.06 154 B 1 +ATOM 1186 C CB . PRO B 2 154 ? -22.089 4.958 -12.182 1.00 94.51 154 B 1 +ATOM 1187 C CG . PRO B 2 154 ? -21.741 4.706 -13.654 1.00 92.30 154 B 1 +ATOM 1188 C CD . PRO B 2 154 ? -22.909 5.349 -14.392 1.00 93.50 154 B 1 +ATOM 1189 N N . GLU B 2 155 ? -20.841 7.484 -11.149 1.00 94.85 155 B 1 +ATOM 1190 C CA . GLU B 2 155 ? -19.558 8.197 -11.166 1.00 94.29 155 B 1 +ATOM 1191 C C . GLU B 2 155 ? -18.583 7.576 -12.196 1.00 94.00 155 B 1 +ATOM 1192 O O . GLU B 2 155 ? -18.720 6.399 -12.549 1.00 92.59 155 B 1 +ATOM 1193 C CB . GLU B 2 155 ? -18.954 8.177 -9.748 1.00 93.24 155 B 1 +ATOM 1194 C CG . GLU B 2 155 ? -19.584 9.186 -8.775 1.00 90.53 155 B 1 +ATOM 1195 C CD . GLU B 2 155 ? -18.890 10.549 -8.852 1.00 91.13 155 B 1 +ATOM 1196 O OE1 . GLU B 2 155 ? -19.119 11.288 -9.837 1.00 84.39 155 B 1 +ATOM 1197 O OE2 . GLU B 2 155 ? -18.103 10.874 -7.948 1.00 86.63 155 B 1 +ATOM 1198 N N . PRO B 2 156 ? -17.572 8.303 -12.701 1.00 93.42 156 B 1 +ATOM 1199 C CA . PRO B 2 156 ? -17.304 9.718 -12.467 1.00 93.94 156 B 1 +ATOM 1200 C C . PRO B 2 156 ? -17.717 10.608 -13.648 1.00 95.05 156 B 1 +ATOM 1201 O O . PRO B 2 156 ? -17.904 10.153 -14.777 1.00 94.63 156 B 1 +ATOM 1202 C CB . PRO B 2 156 ? -15.792 9.769 -12.249 1.00 92.40 156 B 1 +ATOM 1203 C CG . PRO B 2 156 ? -15.275 8.738 -13.262 1.00 90.51 156 B 1 +ATOM 1204 C CD . PRO B 2 156 ? -16.392 7.697 -13.336 1.00 91.22 156 B 1 +ATOM 1205 N N . VAL B 2 157 ? -17.736 11.924 -13.403 1.00 96.81 157 B 1 +ATOM 1206 C CA . VAL B 2 157 ? -17.630 12.935 -14.463 1.00 97.40 157 B 1 +ATOM 1207 C C . VAL B 2 157 ? -16.278 13.637 -14.388 1.00 97.39 157 B 1 +ATOM 1208 O O . VAL B 2 157 ? -15.699 13.804 -13.317 1.00 96.60 157 B 1 +ATOM 1209 C CB . VAL B 2 157 ? -18.771 13.970 -14.442 1.00 96.76 157 B 1 +ATOM 1210 C CG1 . VAL B 2 157 ? -20.121 13.315 -14.713 1.00 89.25 157 B 1 +ATOM 1211 C CG2 . VAL B 2 157 ? -18.835 14.756 -13.143 1.00 88.24 157 B 1 +ATOM 1212 N N . THR B 2 158 ? -15.788 14.102 -15.534 1.00 97.11 158 B 1 +ATOM 1213 C CA . THR B 2 158 ? -14.635 15.005 -15.596 1.00 97.19 158 B 1 +ATOM 1214 C C . THR B 2 158 ? -15.089 16.386 -16.045 1.00 98.08 158 B 1 +ATOM 1215 O O . THR B 2 158 ? -15.909 16.504 -16.964 1.00 98.12 158 B 1 +ATOM 1216 C CB . THR B 2 158 ? -13.509 14.473 -16.488 1.00 95.85 158 B 1 +ATOM 1217 O OG1 . THR B 2 158 ? -13.960 14.233 -17.803 1.00 90.70 158 B 1 +ATOM 1218 C CG2 . THR B 2 158 ? -12.934 13.163 -15.952 1.00 89.95 158 B 1 +ATOM 1219 N N . VAL B 2 159 ? -14.547 17.427 -15.419 1.00 98.29 159 B 1 +ATOM 1220 C CA . VAL B 2 159 ? -14.794 18.820 -15.792 1.00 98.55 159 B 1 +ATOM 1221 C C . VAL B 2 159 ? -13.459 19.500 -16.046 1.00 98.59 159 B 1 +ATOM 1222 O O . VAL B 2 159 ? -12.573 19.474 -15.198 1.00 98.30 159 B 1 +ATOM 1223 C CB . VAL B 2 159 ? -15.612 19.580 -14.730 1.00 98.43 159 B 1 +ATOM 1224 C CG1 . VAL B 2 159 ? -15.988 20.973 -15.243 1.00 97.24 159 B 1 +ATOM 1225 C CG2 . VAL B 2 159 ? -16.909 18.846 -14.365 1.00 96.58 159 B 1 +ATOM 1226 N N . SER B 2 160 ? -13.324 20.128 -17.212 1.00 98.64 160 B 1 +ATOM 1227 C CA . SER B 2 160 ? -12.230 21.040 -17.531 1.00 98.60 160 B 1 +ATOM 1228 C C . SER B 2 160 ? -12.788 22.407 -17.918 1.00 98.70 160 B 1 +ATOM 1229 O O . SER B 2 160 ? -13.994 22.565 -18.133 1.00 98.49 160 B 1 +ATOM 1230 C CB . SER B 2 160 ? -11.323 20.442 -18.612 1.00 98.10 160 B 1 +ATOM 1231 O OG . SER B 2 160 ? -11.989 20.337 -19.856 1.00 95.34 160 B 1 +ATOM 1232 N N . TRP B 2 161 ? -11.925 23.412 -17.989 1.00 98.74 161 B 1 +ATOM 1233 C CA . TRP B 2 161 ? -12.273 24.763 -18.405 1.00 98.76 161 B 1 +ATOM 1234 C C . TRP B 2 161 ? -11.435 25.182 -19.603 1.00 98.72 161 B 1 +ATOM 1235 O O . TRP B 2 161 ? -10.215 24.992 -19.607 1.00 98.34 161 B 1 +ATOM 1236 C CB . TRP B 2 161 ? -12.113 25.721 -17.230 1.00 98.67 161 B 1 +ATOM 1237 C CG . TRP B 2 161 ? -13.179 25.583 -16.187 1.00 98.68 161 B 1 +ATOM 1238 C CD1 . TRP B 2 161 ? -13.131 24.763 -15.109 1.00 98.40 161 B 1 +ATOM 1239 C CD2 . TRP B 2 161 ? -14.467 26.260 -16.138 1.00 98.63 161 B 1 +ATOM 1240 N NE1 . TRP B 2 161 ? -14.308 24.896 -14.381 1.00 98.31 161 B 1 +ATOM 1241 C CE2 . TRP B 2 161 ? -15.153 25.804 -14.981 1.00 98.46 161 B 1 +ATOM 1242 C CE3 . TRP B 2 161 ? -15.108 27.213 -16.959 1.00 98.48 161 B 1 +ATOM 1243 C CZ2 . TRP B 2 161 ? -16.439 26.279 -14.643 1.00 98.19 161 B 1 +ATOM 1244 C CZ3 . TRP B 2 161 ? -16.390 27.686 -16.617 1.00 98.01 161 B 1 +ATOM 1245 C CH2 . TRP B 2 161 ? -17.045 27.218 -15.471 1.00 97.92 161 B 1 +ATOM 1246 N N . ASN B 2 162 ? -12.081 25.721 -20.619 1.00 98.58 162 B 1 +ATOM 1247 C CA . ASN B 2 162 ? -11.457 26.153 -21.876 1.00 98.53 162 B 1 +ATOM 1248 C C . ASN B 2 162 ? -10.540 25.068 -22.477 1.00 98.51 162 B 1 +ATOM 1249 O O . ASN B 2 162 ? -9.390 25.326 -22.823 1.00 97.61 162 B 1 +ATOM 1250 C CB . ASN B 2 162 ? -10.767 27.514 -21.667 1.00 98.26 162 B 1 +ATOM 1251 C CG . ASN B 2 162 ? -11.735 28.641 -21.352 1.00 98.05 162 B 1 +ATOM 1252 O OD1 . ASN B 2 162 ? -12.944 28.524 -21.434 1.00 93.25 162 B 1 +ATOM 1253 N ND2 . ASN B 2 162 ? -11.217 29.797 -21.003 1.00 92.32 162 B 1 +ATOM 1254 N N . SER B 2 163 ? -11.051 23.841 -22.542 1.00 98.45 163 B 1 +ATOM 1255 C CA . SER B 2 163 ? -10.323 22.659 -23.033 1.00 98.37 163 B 1 +ATOM 1256 C C . SER B 2 163 ? -8.999 22.377 -22.291 1.00 98.40 163 B 1 +ATOM 1257 O O . SER B 2 163 ? -8.049 21.866 -22.876 1.00 97.23 163 B 1 +ATOM 1258 C CB . SER B 2 163 ? -10.138 22.720 -24.555 1.00 97.91 163 B 1 +ATOM 1259 O OG . SER B 2 163 ? -11.399 22.903 -25.183 1.00 94.47 163 B 1 +ATOM 1260 N N . GLY B 2 164 ? -8.935 22.712 -21.008 1.00 98.22 164 B 1 +ATOM 1261 C CA . GLY B 2 164 ? -7.749 22.537 -20.159 1.00 98.02 164 B 1 +ATOM 1262 C C . GLY B 2 164 ? -6.794 23.733 -20.125 1.00 98.27 164 B 1 +ATOM 1263 O O . GLY B 2 164 ? -5.853 23.724 -19.334 1.00 97.19 164 B 1 +ATOM 1264 N N . ALA B 2 165 ? -7.038 24.778 -20.919 1.00 98.31 165 B 1 +ATOM 1265 C CA . ALA B 2 165 ? -6.209 25.987 -20.916 1.00 98.23 165 B 1 +ATOM 1266 C C . ALA B 2 165 ? -6.377 26.830 -19.635 1.00 98.31 165 B 1 +ATOM 1267 O O . ALA B 2 165 ? -5.459 27.547 -19.241 1.00 97.46 165 B 1 +ATOM 1268 C CB . ALA B 2 165 ? -6.550 26.807 -22.163 1.00 97.73 165 B 1 +ATOM 1269 N N . LEU B 2 166 ? -7.522 26.737 -18.980 1.00 98.14 166 B 1 +ATOM 1270 C CA . LEU B 2 166 ? -7.780 27.383 -17.698 1.00 98.24 166 B 1 +ATOM 1271 C C . LEU B 2 166 ? -7.723 26.338 -16.576 1.00 98.36 166 B 1 +ATOM 1272 O O . LEU B 2 166 ? -8.619 25.501 -16.459 1.00 97.88 166 B 1 +ATOM 1273 C CB . LEU B 2 166 ? -9.124 28.123 -17.767 1.00 97.90 166 B 1 +ATOM 1274 C CG . LEU B 2 166 ? -9.515 28.859 -16.474 1.00 97.29 166 B 1 +ATOM 1275 C CD1 . LEU B 2 166 ? -8.520 29.955 -16.101 1.00 94.80 166 B 1 +ATOM 1276 C CD2 . LEU B 2 166 ? -10.891 29.500 -16.661 1.00 94.52 166 B 1 +ATOM 1277 N N . THR B 2 167 ? -6.682 26.414 -15.754 1.00 98.23 167 B 1 +ATOM 1278 C CA . THR B 2 167 ? -6.468 25.538 -14.590 1.00 97.93 167 B 1 +ATOM 1279 C C . THR B 2 167 ? -6.317 26.329 -13.291 1.00 97.96 167 B 1 +ATOM 1280 O O . THR B 2 167 ? -6.753 25.878 -12.234 1.00 97.09 167 B 1 +ATOM 1281 C CB . THR B 2 167 ? -5.229 24.653 -14.793 1.00 97.27 167 B 1 +ATOM 1282 O OG1 . THR B 2 167 ? -4.102 25.456 -15.082 1.00 93.91 167 B 1 +ATOM 1283 C CG2 . THR B 2 167 ? -5.400 23.672 -15.952 1.00 91.96 167 B 1 +ATOM 1284 N N . SER B 2 168 ? -5.751 27.528 -13.357 1.00 97.71 168 B 1 +ATOM 1285 C CA . SER B 2 168 ? -5.568 28.388 -12.191 1.00 97.05 168 B 1 +ATOM 1286 C C . SER B 2 168 ? -6.914 28.869 -11.634 1.00 97.14 168 B 1 +ATOM 1287 O O . SER B 2 168 ? -7.770 29.348 -12.377 1.00 95.65 168 B 1 +ATOM 1288 C CB . SER B 2 168 ? -4.680 29.582 -12.541 1.00 95.76 168 B 1 +ATOM 1289 O OG . SER B 2 168 ? -4.358 30.289 -11.357 1.00 82.91 168 B 1 +ATOM 1290 N N . GLY B 2 169 ? -7.090 28.734 -10.316 1.00 96.98 169 B 1 +ATOM 1291 C CA . GLY B 2 169 ? -8.320 29.145 -9.630 1.00 96.94 169 B 1 +ATOM 1292 C C . GLY B 2 169 ? -9.529 28.230 -9.863 1.00 97.80 169 B 1 +ATOM 1293 O O . GLY B 2 169 ? -10.630 28.587 -9.445 1.00 96.89 169 B 1 +ATOM 1294 N N . VAL B 2 170 ? -9.350 27.075 -10.524 1.00 98.04 170 B 1 +ATOM 1295 C CA . VAL B 2 170 ? -10.405 26.072 -10.720 1.00 98.29 170 B 1 +ATOM 1296 C C . VAL B 2 170 ? -10.522 25.189 -9.480 1.00 98.23 170 B 1 +ATOM 1297 O O . VAL B 2 170 ? -9.534 24.619 -9.017 1.00 97.72 170 B 1 +ATOM 1298 C CB . VAL B 2 170 ? -10.158 25.214 -11.973 1.00 98.08 170 B 1 +ATOM 1299 C CG1 . VAL B 2 170 ? -11.219 24.125 -12.152 1.00 96.49 170 B 1 +ATOM 1300 C CG2 . VAL B 2 170 ? -10.169 26.077 -13.242 1.00 95.26 170 B 1 +ATOM 1301 N N . HIS B 2 171 ? -11.752 25.017 -8.995 1.00 98.50 171 B 1 +ATOM 1302 C CA . HIS B 2 171 ? -12.102 24.077 -7.938 1.00 98.32 171 B 1 +ATOM 1303 C C . HIS B 2 171 ? -13.311 23.251 -8.373 1.00 98.44 171 B 1 +ATOM 1304 O O . HIS B 2 171 ? -14.428 23.760 -8.459 1.00 97.89 171 B 1 +ATOM 1305 C CB . HIS B 2 171 ? -12.376 24.830 -6.630 1.00 97.58 171 B 1 +ATOM 1306 C CG . HIS B 2 171 ? -11.151 25.495 -6.060 1.00 92.21 171 B 1 +ATOM 1307 N ND1 . HIS B 2 171 ? -10.104 24.855 -5.435 1.00 78.01 171 B 1 +ATOM 1308 C CD2 . HIS B 2 171 ? -10.853 26.832 -6.080 1.00 78.36 171 B 1 +ATOM 1309 C CE1 . HIS B 2 171 ? -9.192 25.782 -5.082 1.00 79.18 171 B 1 +ATOM 1310 N NE2 . HIS B 2 171 ? -9.615 26.998 -5.455 1.00 80.21 171 B 1 +ATOM 1311 N N . THR B 2 172 ? -13.093 21.964 -8.640 1.00 98.17 172 B 1 +ATOM 1312 C CA . THR B 2 172 ? -14.168 20.998 -8.876 1.00 98.08 172 B 1 +ATOM 1313 C C . THR B 2 172 ? -14.428 20.243 -7.580 1.00 97.96 172 B 1 +ATOM 1314 O O . THR B 2 172 ? -13.541 19.558 -7.076 1.00 97.22 172 B 1 +ATOM 1315 C CB . THR B 2 172 ? -13.837 20.049 -10.032 1.00 97.87 172 B 1 +ATOM 1316 O OG1 . THR B 2 172 ? -13.580 20.815 -11.192 1.00 96.13 172 B 1 +ATOM 1317 C CG2 . THR B 2 172 ? -15.001 19.118 -10.365 1.00 93.93 172 B 1 +ATOM 1318 N N . PHE B 2 173 ? -15.629 20.399 -7.035 1.00 98.27 173 B 1 +ATOM 1319 C CA . PHE B 2 173 ? -16.009 19.763 -5.778 1.00 98.02 173 B 1 +ATOM 1320 C C . PHE B 2 173 ? -16.319 18.277 -5.980 1.00 97.85 173 B 1 +ATOM 1321 O O . PHE B 2 173 ? -16.780 17.895 -7.058 1.00 97.02 173 B 1 +ATOM 1322 C CB . PHE B 2 173 ? -17.189 20.514 -5.151 1.00 97.55 173 B 1 +ATOM 1323 C CG . PHE B 2 173 ? -16.835 21.929 -4.741 1.00 96.75 173 B 1 +ATOM 1324 C CD1 . PHE B 2 173 ? -16.111 22.160 -3.559 1.00 92.20 173 B 1 +ATOM 1325 C CD2 . PHE B 2 173 ? -17.186 23.018 -5.557 1.00 91.76 173 B 1 +ATOM 1326 C CE1 . PHE B 2 173 ? -15.751 23.466 -3.193 1.00 89.95 173 B 1 +ATOM 1327 C CE2 . PHE B 2 173 ? -16.826 24.326 -5.197 1.00 89.58 173 B 1 +ATOM 1328 C CZ . PHE B 2 173 ? -16.107 24.547 -4.014 1.00 91.58 173 B 1 +ATOM 1329 N N . PRO B 2 174 ? -16.110 17.436 -4.947 1.00 96.29 174 B 1 +ATOM 1330 C CA . PRO B 2 174 ? -16.556 16.048 -4.961 1.00 95.38 174 B 1 +ATOM 1331 C C . PRO B 2 174 ? -18.061 15.946 -5.225 1.00 95.91 174 B 1 +ATOM 1332 O O . PRO B 2 174 ? -18.841 16.805 -4.799 1.00 95.13 174 B 1 +ATOM 1333 C CB . PRO B 2 174 ? -16.192 15.476 -3.585 1.00 93.23 174 B 1 +ATOM 1334 C CG . PRO B 2 174 ? -15.068 16.385 -3.104 1.00 90.47 174 B 1 +ATOM 1335 C CD . PRO B 2 174 ? -15.443 17.741 -3.694 1.00 94.03 174 B 1 +ATOM 1336 N N . ALA B 2 175 ? -18.468 14.878 -5.913 1.00 96.32 175 B 1 +ATOM 1337 C CA . ALA B 2 175 ? -19.875 14.605 -6.137 1.00 96.03 175 B 1 +ATOM 1338 C C . ALA B 2 175 ? -20.591 14.266 -4.822 1.00 95.68 175 B 1 +ATOM 1339 O O . ALA B 2 175 ? -20.039 13.631 -3.925 1.00 94.35 175 B 1 +ATOM 1340 C CB . ALA B 2 175 ? -20.022 13.483 -7.157 1.00 95.26 175 B 1 +ATOM 1341 N N . VAL B 2 176 ? -21.857 14.665 -4.743 1.00 96.17 176 B 1 +ATOM 1342 C CA . VAL B 2 176 ? -22.771 14.257 -3.679 1.00 96.16 176 B 1 +ATOM 1343 C C . VAL B 2 176 ? -23.806 13.299 -4.252 1.00 96.10 176 B 1 +ATOM 1344 O O . VAL B 2 176 ? -24.416 13.576 -5.289 1.00 95.38 176 B 1 +ATOM 1345 C CB . VAL B 2 176 ? -23.422 15.456 -2.969 1.00 95.32 176 B 1 +ATOM 1346 C CG1 . VAL B 2 176 ? -22.369 16.232 -2.166 1.00 86.38 176 B 1 +ATOM 1347 C CG2 . VAL B 2 176 ? -24.124 16.433 -3.912 1.00 85.99 176 B 1 +ATOM 1348 N N . LEU B 2 177 ? -24.009 12.177 -3.566 1.00 92.57 177 B 1 +ATOM 1349 C CA . LEU B 2 177 ? -25.103 11.257 -3.858 1.00 91.67 177 B 1 +ATOM 1350 C C . LEU B 2 177 ? -26.397 11.821 -3.261 1.00 92.86 177 B 1 +ATOM 1351 O O . LEU B 2 177 ? -26.520 11.997 -2.052 1.00 92.21 177 B 1 +ATOM 1352 C CB . LEU B 2 177 ? -24.755 9.858 -3.323 1.00 89.38 177 B 1 +ATOM 1353 C CG . LEU B 2 177 ? -25.816 8.785 -3.638 1.00 87.37 177 B 1 +ATOM 1354 C CD1 . LEU B 2 177 ? -26.007 8.582 -5.137 1.00 83.26 177 B 1 +ATOM 1355 C CD2 . LEU B 2 177 ? -25.395 7.454 -3.021 1.00 82.00 177 B 1 +ATOM 1356 N N . GLN B 2 178 ? -27.357 12.115 -4.123 1.00 93.90 178 B 1 +ATOM 1357 C CA . GLN B 2 178 ? -28.660 12.640 -3.729 1.00 94.42 178 B 1 +ATOM 1358 C C . GLN B 2 178 ? -29.605 11.498 -3.321 1.00 94.52 178 B 1 +ATOM 1359 O O . GLN B 2 178 ? -29.422 10.343 -3.702 1.00 93.88 178 B 1 +ATOM 1360 C CB . GLN B 2 178 ? -29.242 13.473 -4.882 1.00 94.63 178 B 1 +ATOM 1361 C CG . GLN B 2 178 ? -28.367 14.673 -5.281 1.00 94.58 178 B 1 +ATOM 1362 C CD . GLN B 2 178 ? -28.842 15.285 -6.597 1.00 95.35 178 B 1 +ATOM 1363 O OE1 . GLN B 2 178 ? -29.461 16.327 -6.660 1.00 90.70 178 B 1 +ATOM 1364 N NE2 . GLN B 2 178 ? -28.571 14.626 -7.711 1.00 88.37 178 B 1 +ATOM 1365 N N . SER B 2 179 ? -30.689 11.834 -2.624 1.00 92.24 179 B 1 +ATOM 1366 C CA . SER B 2 179 ? -31.731 10.867 -2.237 1.00 92.08 179 B 1 +ATOM 1367 C C . SER B 2 179 ? -32.406 10.167 -3.426 1.00 91.62 179 B 1 +ATOM 1368 O O . SER B 2 179 ? -32.975 9.094 -3.267 1.00 89.24 179 B 1 +ATOM 1369 C CB . SER B 2 179 ? -32.798 11.580 -1.402 1.00 92.05 179 B 1 +ATOM 1370 O OG . SER B 2 179 ? -33.313 12.694 -2.116 1.00 86.94 179 B 1 +ATOM 1371 N N . SER B 2 180 ? -32.321 10.745 -4.624 1.00 92.87 180 B 1 +ATOM 1372 C CA . SER B 2 180 ? -32.777 10.136 -5.880 1.00 92.64 180 B 1 +ATOM 1373 C C . SER B 2 180 ? -31.886 8.984 -6.375 1.00 92.28 180 B 1 +ATOM 1374 O O . SER B 2 180 ? -32.227 8.350 -7.372 1.00 89.62 180 B 1 +ATOM 1375 C CB . SER B 2 180 ? -32.845 11.218 -6.960 1.00 92.95 180 B 1 +ATOM 1376 O OG . SER B 2 180 ? -31.575 11.822 -7.138 1.00 93.53 180 B 1 +ATOM 1377 N N . GLY B 2 181 ? -30.731 8.744 -5.747 1.00 91.03 181 B 1 +ATOM 1378 C CA . GLY B 2 181 ? -29.712 7.808 -6.225 1.00 90.06 181 B 1 +ATOM 1379 C C . GLY B 2 181 ? -28.841 8.361 -7.357 1.00 92.15 181 B 1 +ATOM 1380 O O . GLY B 2 181 ? -28.042 7.623 -7.927 1.00 89.96 181 B 1 +ATOM 1381 N N . LEU B 2 182 ? -28.990 9.647 -7.704 1.00 94.43 182 B 1 +ATOM 1382 C CA . LEU B 2 182 ? -28.202 10.328 -8.730 1.00 95.83 182 B 1 +ATOM 1383 C C . LEU B 2 182 ? -27.147 11.229 -8.089 1.00 95.78 182 B 1 +ATOM 1384 O O . LEU B 2 182 ? -27.395 11.869 -7.065 1.00 94.98 182 B 1 +ATOM 1385 C CB . LEU B 2 182 ? -29.126 11.137 -9.655 1.00 95.96 182 B 1 +ATOM 1386 C CG . LEU B 2 182 ? -30.203 10.315 -10.383 1.00 95.78 182 B 1 +ATOM 1387 C CD1 . LEU B 2 182 ? -31.109 11.249 -11.178 1.00 93.79 182 B 1 +ATOM 1388 C CD2 . LEU B 2 182 ? -29.609 9.290 -11.345 1.00 93.05 182 B 1 +ATOM 1389 N N . TYR B 2 183 ? -25.990 11.332 -8.736 1.00 96.51 183 B 1 +ATOM 1390 C CA . TYR B 2 183 ? -24.916 12.218 -8.308 1.00 96.85 183 B 1 +ATOM 1391 C C . TYR B 2 183 ? -25.096 13.636 -8.846 1.00 97.61 183 B 1 +ATOM 1392 O O . TYR B 2 183 ? -25.692 13.868 -9.901 1.00 97.61 183 B 1 +ATOM 1393 C CB . TYR B 2 183 ? -23.564 11.627 -8.709 1.00 96.13 183 B 1 +ATOM 1394 C CG . TYR B 2 183 ? -23.241 10.333 -8.002 1.00 95.25 183 B 1 +ATOM 1395 C CD1 . TYR B 2 183 ? -22.628 10.353 -6.736 1.00 93.09 183 B 1 +ATOM 1396 C CD2 . TYR B 2 183 ? -23.552 9.097 -8.603 1.00 93.01 183 B 1 +ATOM 1397 C CE1 . TYR B 2 183 ? -22.319 9.154 -6.074 1.00 92.09 183 B 1 +ATOM 1398 C CE2 . TYR B 2 183 ? -23.253 7.891 -7.948 1.00 91.74 183 B 1 +ATOM 1399 C CZ . TYR B 2 183 ? -22.632 7.924 -6.681 1.00 92.68 183 B 1 +ATOM 1400 O OH . TYR B 2 183 ? -22.339 6.748 -6.040 1.00 90.94 183 B 1 +ATOM 1401 N N . SER B 2 184 ? -24.548 14.603 -8.129 1.00 97.79 184 B 1 +ATOM 1402 C CA . SER B 2 184 ? -24.378 15.970 -8.616 1.00 98.11 184 B 1 +ATOM 1403 C C . SER B 2 184 ? -23.082 16.570 -8.083 1.00 98.19 184 B 1 +ATOM 1404 O O . SER B 2 184 ? -22.727 16.346 -6.927 1.00 97.66 184 B 1 +ATOM 1405 C CB . SER B 2 184 ? -25.560 16.858 -8.224 1.00 97.66 184 B 1 +ATOM 1406 O OG . SER B 2 184 ? -26.744 16.400 -8.870 1.00 85.24 184 B 1 +ATOM 1407 N N . LEU B 2 185 ? -22.393 17.356 -8.910 1.00 98.17 185 B 1 +ATOM 1408 C CA . LEU B 2 185 ? -21.239 18.143 -8.487 1.00 98.31 185 B 1 +ATOM 1409 C C . LEU B 2 185 ? -21.270 19.539 -9.108 1.00 98.55 185 B 1 +ATOM 1410 O O . LEU B 2 185 ? -22.039 19.825 -10.026 1.00 98.28 185 B 1 +ATOM 1411 C CB . LEU B 2 185 ? -19.926 17.366 -8.744 1.00 97.37 185 B 1 +ATOM 1412 C CG . LEU B 2 185 ? -19.467 17.158 -10.204 1.00 96.98 185 B 1 +ATOM 1413 C CD1 . LEU B 2 185 ? -18.923 18.411 -10.891 1.00 93.89 185 B 1 +ATOM 1414 C CD2 . LEU B 2 185 ? -18.320 16.140 -10.205 1.00 93.43 185 B 1 +ATOM 1415 N N . SER B 2 186 ? -20.394 20.407 -8.615 1.00 98.73 186 B 1 +ATOM 1416 C CA . SER B 2 186 ? -20.135 21.705 -9.228 1.00 98.63 186 B 1 +ATOM 1417 C C . SER B 2 186 ? -18.644 21.909 -9.454 1.00 98.74 186 B 1 +ATOM 1418 O O . SER B 2 186 ? -17.809 21.448 -8.679 1.00 98.34 186 B 1 +ATOM 1419 C CB . SER B 2 186 ? -20.745 22.841 -8.402 1.00 97.55 186 B 1 +ATOM 1420 O OG . SER B 2 186 ? -20.248 22.849 -7.080 1.00 80.77 186 B 1 +ATOM 1421 N N . SER B 2 187 ? -18.305 22.621 -10.531 1.00 98.66 187 B 1 +ATOM 1422 C CA . SER B 2 187 ? -16.969 23.158 -10.750 1.00 98.65 187 B 1 +ATOM 1423 C C . SER B 2 187 ? -17.066 24.671 -10.789 1.00 98.60 187 B 1 +ATOM 1424 O O . SER B 2 187 ? -17.925 25.213 -11.488 1.00 98.18 187 B 1 +ATOM 1425 C CB . SER B 2 187 ? -16.362 22.603 -12.035 1.00 98.55 187 B 1 +ATOM 1426 O OG . SER B 2 187 ? -15.013 23.007 -12.153 1.00 97.94 187 B 1 +ATOM 1427 N N . VAL B 2 188 ? -16.206 25.347 -10.044 1.00 98.47 188 B 1 +ATOM 1428 C CA . VAL B 2 188 ? -16.143 26.807 -9.990 1.00 98.37 188 B 1 +ATOM 1429 C C . VAL B 2 188 ? -14.747 27.282 -10.352 1.00 98.46 188 B 1 +ATOM 1430 O O . VAL B 2 188 ? -13.766 26.562 -10.173 1.00 98.04 188 B 1 +ATOM 1431 C CB . VAL B 2 188 ? -16.598 27.374 -8.633 1.00 97.45 188 B 1 +ATOM 1432 C CG1 . VAL B 2 188 ? -18.042 26.959 -8.320 1.00 92.92 188 B 1 +ATOM 1433 C CG2 . VAL B 2 188 ? -15.694 26.946 -7.473 1.00 91.51 188 B 1 +ATOM 1434 N N . VAL B 2 189 ? -14.657 28.500 -10.871 1.00 97.80 189 B 1 +ATOM 1435 C CA . VAL B 2 189 ? -13.389 29.159 -11.164 1.00 97.67 189 B 1 +ATOM 1436 C C . VAL B 2 189 ? -13.477 30.630 -10.791 1.00 97.30 189 B 1 +ATOM 1437 O O . VAL B 2 189 ? -14.499 31.285 -11.013 1.00 96.67 189 B 1 +ATOM 1438 C CB . VAL B 2 189 ? -12.955 28.919 -12.621 1.00 97.45 189 B 1 +ATOM 1439 C CG1 . VAL B 2 189 ? -13.924 29.490 -13.657 1.00 94.27 189 B 1 +ATOM 1440 C CG2 . VAL B 2 189 ? -11.558 29.463 -12.894 1.00 93.60 189 B 1 +ATOM 1441 N N . THR B 2 190 ? -12.398 31.144 -10.218 1.00 96.85 190 B 1 +ATOM 1442 C CA . THR B 2 190 ? -12.227 32.572 -9.960 1.00 96.40 190 B 1 +ATOM 1443 C C . THR B 2 190 ? -11.377 33.202 -11.054 1.00 96.36 190 B 1 +ATOM 1444 O O . THR B 2 190 ? -10.297 32.714 -11.376 1.00 95.63 190 B 1 +ATOM 1445 C CB . THR B 2 190 ? -11.632 32.846 -8.576 1.00 95.17 190 B 1 +ATOM 1446 O OG1 . THR B 2 190 ? -10.474 32.075 -8.361 1.00 89.02 190 B 1 +ATOM 1447 C CG2 . THR B 2 190 ? -12.626 32.511 -7.466 1.00 87.78 190 B 1 +ATOM 1448 N N . VAL B 2 191 ? -11.872 34.298 -11.637 1.00 96.05 191 B 1 +ATOM 1449 C CA . VAL B 2 191 ? -11.244 35.003 -12.764 1.00 95.82 191 B 1 +ATOM 1450 C C . VAL B 2 191 ? -11.245 36.516 -12.515 1.00 95.53 191 B 1 +ATOM 1451 O O . VAL B 2 191 ? -12.073 37.007 -11.743 1.00 95.02 191 B 1 +ATOM 1452 C CB . VAL B 2 191 ? -11.942 34.662 -14.092 1.00 95.58 191 B 1 +ATOM 1453 C CG1 . VAL B 2 191 ? -11.873 33.161 -14.390 1.00 94.42 191 B 1 +ATOM 1454 C CG2 . VAL B 2 191 ? -13.411 35.106 -14.146 1.00 94.02 191 B 1 +ATOM 1455 N N . PRO B 2 192 ? -10.362 37.287 -13.170 1.00 95.10 192 B 1 +ATOM 1456 C CA . PRO B 2 192 ? -10.415 38.742 -13.065 1.00 94.59 192 B 1 +ATOM 1457 C C . PRO B 2 192 ? -11.757 39.281 -13.578 1.00 94.22 192 B 1 +ATOM 1458 O O . PRO B 2 192 ? -12.159 38.970 -14.698 1.00 93.21 192 B 1 +ATOM 1459 C CB . PRO B 2 192 ? -9.237 39.257 -13.895 1.00 93.84 192 B 1 +ATOM 1460 C CG . PRO B 2 192 ? -8.286 38.060 -13.970 1.00 92.51 192 B 1 +ATOM 1461 C CD . PRO B 2 192 ? -9.237 36.869 -13.984 1.00 94.81 192 B 1 +ATOM 1462 N N . SER B 2 193 ? -12.431 40.144 -12.819 1.00 93.31 193 B 1 +ATOM 1463 C CA . SER B 2 193 ? -13.713 40.741 -13.240 1.00 92.33 193 B 1 +ATOM 1464 C C . SER B 2 193 ? -13.600 41.509 -14.562 1.00 92.19 193 B 1 +ATOM 1465 O O . SER B 2 193 ? -14.530 41.506 -15.363 1.00 90.44 193 B 1 +ATOM 1466 C CB . SER B 2 193 ? -14.240 41.693 -12.165 1.00 90.31 193 B 1 +ATOM 1467 O OG . SER B 2 193 ? -14.374 41.013 -10.932 1.00 80.21 193 B 1 +ATOM 1468 N N . SER B 2 194 ? -12.447 42.115 -14.830 1.00 91.90 194 B 1 +ATOM 1469 C CA . SER B 2 194 ? -12.150 42.823 -16.080 1.00 91.58 194 B 1 +ATOM 1470 C C . SER B 2 194 ? -12.129 41.917 -17.317 1.00 91.85 194 B 1 +ATOM 1471 O O . SER B 2 194 ? -12.321 42.407 -18.424 1.00 90.21 194 B 1 +ATOM 1472 C CB . SER B 2 194 ? -10.794 43.524 -15.954 1.00 90.98 194 B 1 +ATOM 1473 O OG . SER B 2 194 ? -9.784 42.597 -15.588 1.00 87.91 194 B 1 +ATOM 1474 N N . SER B 2 195 ? -11.921 40.604 -17.152 1.00 92.76 195 B 1 +ATOM 1475 C CA . SER B 2 195 ? -11.872 39.651 -18.266 1.00 93.23 195 B 1 +ATOM 1476 C C . SER B 2 195 ? -13.250 39.180 -18.738 1.00 93.40 195 B 1 +ATOM 1477 O O . SER B 2 195 ? -13.357 38.651 -19.841 1.00 92.32 195 B 1 +ATOM 1478 C CB . SER B 2 195 ? -10.994 38.450 -17.901 1.00 93.42 195 B 1 +ATOM 1479 O OG . SER B 2 195 ? -11.629 37.624 -16.948 1.00 92.75 195 B 1 +ATOM 1480 N N . LEU B 2 196 ? -14.314 39.394 -17.966 1.00 93.32 196 B 1 +ATOM 1481 C CA . LEU B 2 196 ? -15.651 38.860 -18.257 1.00 92.50 196 B 1 +ATOM 1482 C C . LEU B 2 196 ? -16.245 39.354 -19.584 1.00 91.20 196 B 1 +ATOM 1483 O O . LEU B 2 196 ? -17.050 38.651 -20.193 1.00 87.59 196 B 1 +ATOM 1484 C CB . LEU B 2 196 ? -16.609 39.216 -17.107 1.00 91.83 196 B 1 +ATOM 1485 C CG . LEU B 2 196 ? -16.287 38.548 -15.758 1.00 91.46 196 B 1 +ATOM 1486 C CD1 . LEU B 2 196 ? -17.256 39.075 -14.698 1.00 88.66 196 B 1 +ATOM 1487 C CD2 . LEU B 2 196 ? -16.414 37.029 -15.824 1.00 88.08 196 B 1 +ATOM 1488 N N . GLY B 2 197 ? -15.873 40.542 -20.034 1.00 90.53 197 B 1 +ATOM 1489 C CA . GLY B 2 197 ? -16.337 41.101 -21.310 1.00 90.05 197 B 1 +ATOM 1490 C C . GLY B 2 197 ? -15.507 40.687 -22.530 1.00 91.31 197 B 1 +ATOM 1491 O O . GLY B 2 197 ? -15.938 40.909 -23.658 1.00 88.63 197 B 1 +ATOM 1492 N N . THR B 2 198 ? -14.320 40.106 -22.331 1.00 93.71 198 B 1 +ATOM 1493 C CA . THR B 2 198 ? -13.358 39.820 -23.409 1.00 94.34 198 B 1 +ATOM 1494 C C . THR B 2 198 ? -12.985 38.344 -23.504 1.00 95.00 198 B 1 +ATOM 1495 O O . THR B 2 198 ? -12.800 37.825 -24.602 1.00 92.97 198 B 1 +ATOM 1496 C CB . THR B 2 198 ? -12.076 40.645 -23.231 1.00 92.76 198 B 1 +ATOM 1497 O OG1 . THR B 2 198 ? -11.524 40.438 -21.944 1.00 86.03 198 B 1 +ATOM 1498 C CG2 . THR B 2 198 ? -12.327 42.146 -23.370 1.00 82.94 198 B 1 +ATOM 1499 N N . GLN B 2 199 ? -12.879 37.650 -22.373 1.00 95.04 199 B 1 +ATOM 1500 C CA . GLN B 2 199 ? -12.532 36.240 -22.303 1.00 95.52 199 B 1 +ATOM 1501 C C . GLN B 2 199 ? -13.793 35.375 -22.272 1.00 95.94 199 B 1 +ATOM 1502 O O . GLN B 2 199 ? -14.686 35.561 -21.450 1.00 94.78 199 B 1 +ATOM 1503 C CB . GLN B 2 199 ? -11.620 36.002 -21.084 1.00 94.49 199 B 1 +ATOM 1504 C CG . GLN B 2 199 ? -11.130 34.551 -20.962 1.00 86.17 199 B 1 +ATOM 1505 C CD . GLN B 2 199 ? -10.331 34.102 -22.185 1.00 82.86 199 B 1 +ATOM 1506 O OE1 . GLN B 2 199 ? -9.461 34.796 -22.681 1.00 74.56 199 B 1 +ATOM 1507 N NE2 . GLN B 2 199 ? -10.617 32.941 -22.722 1.00 69.07 199 B 1 +ATOM 1508 N N . THR B 2 200 ? -13.844 34.376 -23.155 1.00 96.88 200 B 1 +ATOM 1509 C CA . THR B 2 200 ? -14.885 33.343 -23.113 1.00 97.10 200 B 1 +ATOM 1510 C C . THR B 2 200 ? -14.514 32.277 -22.087 1.00 97.43 200 B 1 +ATOM 1511 O O . THR B 2 200 ? -13.388 31.780 -22.091 1.00 96.55 200 B 1 +ATOM 1512 C CB . THR B 2 200 ? -15.086 32.718 -24.497 1.00 95.96 200 B 1 +ATOM 1513 O OG1 . THR B 2 200 ? -15.448 33.731 -25.417 1.00 85.21 200 B 1 +ATOM 1514 C CG2 . THR B 2 200 ? -16.214 31.696 -24.527 1.00 80.95 200 B 1 +ATOM 1515 N N . TYR B 2 201 ? -15.473 31.886 -21.256 1.00 97.68 201 B 1 +ATOM 1516 C CA . TYR B 2 201 ? -15.337 30.787 -20.306 1.00 97.74 201 B 1 +ATOM 1517 C C . TYR B 2 201 ? -16.291 29.655 -20.679 1.00 97.87 201 B 1 +ATOM 1518 O O . TYR B 2 201 ? -17.502 29.853 -20.767 1.00 97.33 201 B 1 +ATOM 1519 C CB . TYR B 2 201 ? -15.564 31.296 -18.880 1.00 97.44 201 B 1 +ATOM 1520 C CG . TYR B 2 201 ? -14.524 32.306 -18.449 1.00 97.33 201 B 1 +ATOM 1521 C CD1 . TYR B 2 201 ? -13.215 31.883 -18.151 1.00 96.15 201 B 1 +ATOM 1522 C CD2 . TYR B 2 201 ? -14.837 33.681 -18.387 1.00 96.28 201 B 1 +ATOM 1523 C CE1 . TYR B 2 201 ? -12.222 32.812 -17.804 1.00 95.75 201 B 1 +ATOM 1524 C CE2 . TYR B 2 201 ? -13.848 34.621 -18.041 1.00 95.63 201 B 1 +ATOM 1525 C CZ . TYR B 2 201 ? -12.540 34.177 -17.757 1.00 96.32 201 B 1 +ATOM 1526 O OH . TYR B 2 201 ? -11.555 35.082 -17.440 1.00 95.29 201 B 1 +ATOM 1527 N N . ILE B 2 202 ? -15.740 28.460 -20.924 1.00 98.34 202 B 1 +ATOM 1528 C CA . ILE B 2 202 ? -16.481 27.262 -21.302 1.00 98.52 202 B 1 +ATOM 1529 C C . ILE B 2 202 ? -16.085 26.150 -20.338 1.00 98.59 202 B 1 +ATOM 1530 O O . ILE B 2 202 ? -14.899 25.854 -20.203 1.00 98.37 202 B 1 +ATOM 1531 C CB . ILE B 2 202 ? -16.216 26.877 -22.776 1.00 98.38 202 B 1 +ATOM 1532 C CG1 . ILE B 2 202 ? -16.641 28.019 -23.730 1.00 97.30 202 B 1 +ATOM 1533 C CG2 . ILE B 2 202 ? -16.952 25.572 -23.131 1.00 97.19 202 B 1 +ATOM 1534 C CD1 . ILE B 2 202 ? -16.264 27.801 -25.201 1.00 92.87 202 B 1 +ATOM 1535 N N . CYS B 2 203 ? -17.060 25.517 -19.687 1.00 98.63 203 B 1 +ATOM 1536 C CA . CYS B 2 203 ? -16.817 24.269 -18.975 1.00 98.66 203 B 1 +ATOM 1537 C C . CYS B 2 203 ? -17.039 23.086 -19.919 1.00 98.74 203 B 1 +ATOM 1538 O O . CYS B 2 203 ? -18.075 22.996 -20.588 1.00 98.44 203 B 1 +ATOM 1539 C CB . CYS B 2 203 ? -17.664 24.179 -17.697 1.00 98.06 203 B 1 +ATOM 1540 S SG . CYS B 2 203 ? -19.452 24.031 -17.964 1.00 96.78 203 B 1 +ATOM 1541 N N . ASN B 2 204 ? -16.068 22.170 -19.957 1.00 98.77 204 B 1 +ATOM 1542 C CA . ASN B 2 204 ? -16.122 20.944 -20.744 1.00 98.76 204 B 1 +ATOM 1543 C C . ASN B 2 204 ? -16.430 19.790 -19.786 1.00 98.74 204 B 1 +ATOM 1544 O O . ASN B 2 204 ? -15.586 19.434 -18.959 1.00 98.48 204 B 1 +ATOM 1545 C CB . ASN B 2 204 ? -14.789 20.729 -21.474 1.00 98.63 204 B 1 +ATOM 1546 C CG . ASN B 2 204 ? -14.194 21.993 -22.065 1.00 98.27 204 B 1 +ATOM 1547 O OD1 . ASN B 2 204 ? -13.236 22.542 -21.537 1.00 89.54 204 B 1 +ATOM 1548 N ND2 . ASN B 2 204 ? -14.740 22.488 -23.151 1.00 89.26 204 B 1 +ATOM 1549 N N . VAL B 2 205 ? -17.630 19.235 -19.887 1.00 98.77 205 B 1 +ATOM 1550 C CA . VAL B 2 205 ? -18.090 18.133 -19.037 1.00 98.78 205 B 1 +ATOM 1551 C C . VAL B 2 205 ? -18.092 16.850 -19.850 1.00 98.73 205 B 1 +ATOM 1552 O O . VAL B 2 205 ? -18.671 16.802 -20.935 1.00 98.36 205 B 1 +ATOM 1553 C CB . VAL B 2 205 ? -19.477 18.420 -18.440 1.00 98.64 205 B 1 +ATOM 1554 C CG1 . VAL B 2 205 ? -19.919 17.287 -17.507 1.00 97.79 205 B 1 +ATOM 1555 C CG2 . VAL B 2 205 ? -19.486 19.734 -17.652 1.00 97.53 205 B 1 +ATOM 1556 N N . ASN B 2 206 ? -17.473 15.786 -19.324 1.00 98.47 206 B 1 +ATOM 1557 C CA . ASN B 2 206 ? -17.456 14.471 -19.954 1.00 98.11 206 B 1 +ATOM 1558 C C . ASN B 2 206 ? -17.904 13.395 -18.962 1.00 97.69 206 B 1 +ATOM 1559 O O . ASN B 2 206 ? -17.240 13.152 -17.957 1.00 96.65 206 B 1 +ATOM 1560 C CB . ASN B 2 206 ? -16.049 14.225 -20.521 1.00 97.50 206 B 1 +ATOM 1561 C CG . ASN B 2 206 ? -15.914 12.921 -21.290 1.00 94.33 206 B 1 +ATOM 1562 O OD1 . ASN B 2 206 ? -16.858 12.294 -21.741 1.00 85.00 206 B 1 +ATOM 1563 N ND2 . ASN B 2 206 ? -14.697 12.480 -21.508 1.00 83.50 206 B 1 +ATOM 1564 N N . HIS B 2 207 ? -19.003 12.727 -19.290 1.00 97.60 207 B 1 +ATOM 1565 C CA . HIS B 2 207 ? -19.512 11.568 -18.568 1.00 97.24 207 B 1 +ATOM 1566 C C . HIS B 2 207 ? -19.392 10.330 -19.465 1.00 96.40 207 B 1 +ATOM 1567 O O . HIS B 2 207 ? -20.304 9.994 -20.229 1.00 95.30 207 B 1 +ATOM 1568 C CB . HIS B 2 207 ? -20.949 11.837 -18.101 1.00 97.21 207 B 1 +ATOM 1569 C CG . HIS B 2 207 ? -21.531 10.705 -17.297 1.00 97.24 207 B 1 +ATOM 1570 N ND1 . HIS B 2 207 ? -22.700 10.024 -17.577 1.00 93.89 207 B 1 +ATOM 1571 C CD2 . HIS B 2 207 ? -21.013 10.166 -16.152 1.00 94.48 207 B 1 +ATOM 1572 C CE1 . HIS B 2 207 ? -22.884 9.110 -16.618 1.00 93.96 207 B 1 +ATOM 1573 N NE2 . HIS B 2 207 ? -21.880 9.162 -15.737 1.00 94.37 207 B 1 +ATOM 1574 N N . LYS B 2 208 ? -18.241 9.660 -19.401 1.00 94.53 208 B 1 +ATOM 1575 C CA . LYS B 2 208 ? -17.925 8.490 -20.236 1.00 92.85 208 B 1 +ATOM 1576 C C . LYS B 2 208 ? -18.979 7.371 -20.156 1.00 92.71 208 B 1 +ATOM 1577 O O . LYS B 2 208 ? -19.321 6.853 -21.217 1.00 91.35 208 B 1 +ATOM 1578 C CB . LYS B 2 208 ? -16.530 7.938 -19.907 1.00 91.42 208 B 1 +ATOM 1579 C CG . LYS B 2 208 ? -15.375 8.866 -20.314 1.00 84.81 208 B 1 +ATOM 1580 C CD . LYS B 2 208 ? -14.034 8.213 -19.943 1.00 79.15 208 B 1 +ATOM 1581 C CE . LYS B 2 208 ? -12.845 9.105 -20.308 1.00 69.92 208 B 1 +ATOM 1582 N NZ . LYS B 2 208 ? -11.555 8.513 -19.863 1.00 61.57 208 B 1 +ATOM 1583 N N . PRO B 2 209 ? -19.542 7.020 -18.976 1.00 92.62 209 B 1 +ATOM 1584 C CA . PRO B 2 209 ? -20.525 5.934 -18.884 1.00 92.52 209 B 1 +ATOM 1585 C C . PRO B 2 209 ? -21.777 6.118 -19.756 1.00 93.54 209 B 1 +ATOM 1586 O O . PRO B 2 209 ? -22.330 5.135 -20.240 1.00 92.97 209 B 1 +ATOM 1587 C CB . PRO B 2 209 ? -20.895 5.852 -17.399 1.00 91.25 209 B 1 +ATOM 1588 C CG . PRO B 2 209 ? -19.657 6.390 -16.689 1.00 89.64 209 B 1 +ATOM 1589 C CD . PRO B 2 209 ? -19.180 7.480 -17.646 1.00 91.61 209 B 1 +ATOM 1590 N N . SER B 2 210 ? -22.219 7.361 -19.986 1.00 94.25 210 B 1 +ATOM 1591 C CA . SER B 2 210 ? -23.366 7.677 -20.853 1.00 95.40 210 B 1 +ATOM 1592 C C . SER B 2 210 ? -22.969 8.220 -22.233 1.00 95.71 210 B 1 +ATOM 1593 O O . SER B 2 210 ? -23.840 8.677 -22.975 1.00 95.12 210 B 1 +ATOM 1594 C CB . SER B 2 210 ? -24.312 8.648 -20.142 1.00 96.07 210 B 1 +ATOM 1595 O OG . SER B 2 210 ? -23.717 9.929 -20.033 1.00 96.14 210 B 1 +ATOM 1596 N N . ASN B 2 211 ? -21.674 8.241 -22.577 1.00 94.97 211 B 1 +ATOM 1597 C CA . ASN B 2 211 ? -21.127 8.922 -23.758 1.00 95.87 211 B 1 +ATOM 1598 C C . ASN B 2 211 ? -21.558 10.399 -23.887 1.00 96.90 211 B 1 +ATOM 1599 O O . ASN B 2 211 ? -21.681 10.928 -24.993 1.00 96.30 211 B 1 +ATOM 1600 C CB . ASN B 2 211 ? -21.377 8.077 -25.023 1.00 94.92 211 B 1 +ATOM 1601 C CG . ASN B 2 211 ? -20.478 6.859 -25.105 1.00 86.59 211 B 1 +ATOM 1602 O OD1 . ASN B 2 211 ? -19.323 6.881 -24.725 1.00 77.59 211 B 1 +ATOM 1603 N ND2 . ASN B 2 211 ? -20.968 5.775 -25.657 1.00 74.81 211 B 1 +ATOM 1604 N N . THR B 2 212 ? -21.792 11.083 -22.776 1.00 97.25 212 B 1 +ATOM 1605 C CA . THR B 2 212 ? -22.229 12.481 -22.771 1.00 97.72 212 B 1 +ATOM 1606 C C . THR B 2 212 ? -21.023 13.405 -22.694 1.00 98.09 212 B 1 +ATOM 1607 O O . THR B 2 212 ? -20.282 13.387 -21.716 1.00 97.68 212 B 1 +ATOM 1608 C CB . THR B 2 212 ? -23.207 12.758 -21.623 1.00 97.28 212 B 1 +ATOM 1609 O OG1 . THR B 2 212 ? -24.300 11.867 -21.692 1.00 93.88 212 B 1 +ATOM 1610 C CG2 . THR B 2 212 ? -23.784 14.173 -21.683 1.00 93.19 212 B 1 +ATOM 1611 N N . LYS B 2 213 ? -20.854 14.252 -23.725 1.00 98.33 213 B 1 +ATOM 1612 C CA . LYS B 2 213 ? -19.928 15.386 -23.723 1.00 98.36 213 B 1 +ATOM 1613 C C . LYS B 2 213 ? -20.730 16.667 -23.904 1.00 98.41 213 B 1 +ATOM 1614 O O . LYS B 2 213 ? -21.528 16.760 -24.837 1.00 97.64 213 B 1 +ATOM 1615 C CB . LYS B 2 213 ? -18.873 15.247 -24.824 1.00 97.59 213 B 1 +ATOM 1616 C CG . LYS B 2 213 ? -17.884 14.103 -24.546 1.00 87.02 213 B 1 +ATOM 1617 C CD . LYS B 2 213 ? -16.810 14.082 -25.636 1.00 85.70 213 B 1 +ATOM 1618 C CE . LYS B 2 213 ? -15.801 12.969 -25.376 1.00 73.31 213 B 1 +ATOM 1619 N NZ . LYS B 2 213 ? -14.735 12.973 -26.408 1.00 65.11 213 B 1 +ATOM 1620 N N . VAL B 2 214 ? -20.533 17.629 -23.015 1.00 98.53 214 B 1 +ATOM 1621 C CA . VAL B 2 214 ? -21.236 18.913 -23.048 1.00 98.47 214 B 1 +ATOM 1622 C C . VAL B 2 214 ? -20.229 20.026 -22.825 1.00 98.67 214 B 1 +ATOM 1623 O O . VAL B 2 214 ? -19.567 20.059 -21.791 1.00 98.24 214 B 1 +ATOM 1624 C CB . VAL B 2 214 ? -22.359 18.977 -21.992 1.00 97.28 214 B 1 +ATOM 1625 C CG1 . VAL B 2 214 ? -23.063 20.338 -22.004 1.00 93.41 214 B 1 +ATOM 1626 C CG2 . VAL B 2 214 ? -23.429 17.906 -22.230 1.00 94.40 214 B 1 +ATOM 1627 N N . ASP B 2 215 ? -20.186 20.966 -23.770 1.00 98.69 215 B 1 +ATOM 1628 C CA . ASP B 2 215 ? -19.468 22.222 -23.613 1.00 98.61 215 B 1 +ATOM 1629 C C . ASP B 2 215 ? -20.486 23.322 -23.325 1.00 98.49 215 B 1 +ATOM 1630 O O . ASP B 2 215 ? -21.395 23.580 -24.122 1.00 97.56 215 B 1 +ATOM 1631 C CB . ASP B 2 215 ? -18.629 22.508 -24.862 1.00 98.30 215 B 1 +ATOM 1632 C CG . ASP B 2 215 ? -17.537 21.450 -25.061 1.00 97.61 215 B 1 +ATOM 1633 O OD1 . ASP B 2 215 ? -16.874 21.101 -24.062 1.00 93.79 215 B 1 +ATOM 1634 O OD2 . ASP B 2 215 ? -17.382 20.983 -26.207 1.00 93.43 215 B 1 +ATOM 1635 N N . LYS B 2 216 ? -20.365 23.963 -22.162 1.00 98.50 216 B 1 +ATOM 1636 C CA . LYS B 2 216 ? -21.299 25.005 -21.737 1.00 98.37 216 B 1 +ATOM 1637 C C . LYS B 2 216 ? -20.574 26.323 -21.545 1.00 98.32 216 B 1 +ATOM 1638 O O . LYS B 2 216 ? -19.745 26.464 -20.656 1.00 97.55 216 B 1 +ATOM 1639 C CB . LYS B 2 216 ? -22.063 24.551 -20.482 1.00 97.75 216 B 1 +ATOM 1640 C CG . LYS B 2 216 ? -23.407 25.277 -20.305 1.00 89.92 216 B 1 +ATOM 1641 C CD . LYS B 2 216 ? -24.431 24.812 -21.343 1.00 88.04 216 B 1 +ATOM 1642 C CE . LYS B 2 216 ? -25.802 25.440 -21.102 1.00 85.30 216 B 1 +ATOM 1643 N NZ . LYS B 2 216 ? -26.806 24.910 -22.051 1.00 78.42 216 B 1 +ATOM 1644 N N . LYS B 2 217 ? -20.933 27.306 -22.384 1.00 98.05 217 B 1 +ATOM 1645 C CA . LYS B 2 217 ? -20.463 28.681 -22.225 1.00 97.88 217 B 1 +ATOM 1646 C C . LYS B 2 217 ? -21.125 29.316 -21.002 1.00 97.71 217 B 1 +ATOM 1647 O O . LYS B 2 217 ? -22.340 29.203 -20.830 1.00 96.75 217 B 1 +ATOM 1648 C CB . LYS B 2 217 ? -20.729 29.462 -23.516 1.00 97.27 217 B 1 +ATOM 1649 C CG . LYS B 2 217 ? -19.947 30.780 -23.555 1.00 93.51 217 B 1 +ATOM 1650 C CD . LYS B 2 217 ? -20.204 31.505 -24.883 1.00 90.60 217 B 1 +ATOM 1651 C CE . LYS B 2 217 ? -19.406 32.809 -24.933 1.00 81.75 217 B 1 +ATOM 1652 N NZ . LYS B 2 217 ? -19.930 33.724 -25.973 1.00 75.32 217 B 1 +ATOM 1653 N N . VAL B 2 218 ? -20.320 29.961 -20.167 1.00 97.69 218 B 1 +ATOM 1654 C CA . VAL B 2 218 ? -20.769 30.674 -18.969 1.00 97.32 218 B 1 +ATOM 1655 C C . VAL B 2 218 ? -20.591 32.161 -19.219 1.00 96.33 218 B 1 +ATOM 1656 O O . VAL B 2 218 ? -19.470 32.655 -19.299 1.00 94.16 218 B 1 +ATOM 1657 C CB . VAL B 2 218 ? -20.019 30.213 -17.710 1.00 97.04 218 B 1 +ATOM 1658 C CG1 . VAL B 2 218 ? -20.635 30.857 -16.469 1.00 95.26 218 B 1 +ATOM 1659 C CG2 . VAL B 2 218 ? -20.091 28.692 -17.535 1.00 95.77 218 B 1 +ATOM 1660 N N . GLU B 2 219 ? -21.701 32.865 -19.380 1.00 95.64 219 B 1 +ATOM 1661 C CA . GLU B 2 219 ? -21.725 34.292 -19.700 1.00 94.55 219 B 1 +ATOM 1662 C C . GLU B 2 219 ? -22.271 35.094 -18.518 1.00 94.36 219 B 1 +ATOM 1663 O O . GLU B 2 219 ? -23.142 34.603 -17.791 1.00 92.76 219 B 1 +ATOM 1664 C CB . GLU B 2 219 ? -22.548 34.539 -20.969 1.00 92.25 219 B 1 +ATOM 1665 C CG . GLU B 2 219 ? -21.917 33.861 -22.191 1.00 86.45 219 B 1 +ATOM 1666 C CD . GLU B 2 219 ? -22.669 34.115 -23.500 1.00 85.40 219 B 1 +ATOM 1667 O OE1 . GLU B 2 219 ? -21.987 34.149 -24.554 1.00 79.12 219 B 1 +ATOM 1668 O OE2 . GLU B 2 219 ? -23.913 34.208 -23.481 1.00 80.91 219 B 1 +ATOM 1669 N N . PRO B 2 220 ? -21.798 36.341 -18.322 1.00 92.28 220 B 1 +ATOM 1670 C CA . PRO B 2 220 ? -22.439 37.253 -17.393 1.00 90.80 220 B 1 +ATOM 1671 C C . PRO B 2 220 ? -23.911 37.428 -17.780 1.00 89.96 220 B 1 +ATOM 1672 O O . PRO B 2 220 ? -24.236 37.535 -18.962 1.00 86.53 220 B 1 +ATOM 1673 C CB . PRO B 2 220 ? -21.672 38.579 -17.491 1.00 88.18 220 B 1 +ATOM 1674 C CG . PRO B 2 220 ? -20.349 38.193 -18.152 1.00 86.38 220 B 1 +ATOM 1675 C CD . PRO B 2 220 ? -20.711 37.001 -19.022 1.00 89.79 220 B 1 +ATOM 1676 N N . LYS B 2 221 ? -24.803 37.485 -16.795 1.00 83.85 221 B 1 +ATOM 1677 C CA . LYS B 2 221 ? -26.178 37.900 -17.078 1.00 81.77 221 B 1 +ATOM 1678 C C . LYS B 2 221 ? -26.137 39.325 -17.618 1.00 80.42 221 B 1 +ATOM 1679 O O . LYS B 2 221 ? -25.660 40.221 -16.925 1.00 72.94 221 B 1 +ATOM 1680 C CB . LYS B 2 221 ? -27.076 37.803 -15.840 1.00 76.02 221 B 1 +ATOM 1681 C CG . LYS B 2 221 ? -27.451 36.348 -15.528 1.00 67.41 221 B 1 +ATOM 1682 C CD . LYS B 2 221 ? -28.467 36.297 -14.377 1.00 61.33 221 B 1 +ATOM 1683 C CE . LYS B 2 221 ? -28.898 34.853 -14.138 1.00 53.81 221 B 1 +ATOM 1684 N NZ . LYS B 2 221 ? -29.930 34.757 -13.082 1.00 48.09 221 B 1 +ATOM 1685 N N . SER B 2 222 ? -26.657 39.532 -18.830 1.00 73.24 222 B 1 +ATOM 1686 C CA . SER B 2 222 ? -27.000 40.868 -19.287 1.00 71.63 222 B 1 +ATOM 1687 C C . SER B 2 222 ? -28.036 41.410 -18.309 1.00 70.40 222 B 1 +ATOM 1688 O O . SER B 2 222 ? -29.155 40.904 -18.233 1.00 64.26 222 B 1 +ATOM 1689 C CB . SER B 2 222 ? -27.528 40.847 -20.731 1.00 65.48 222 B 1 +ATOM 1690 O OG . SER B 2 222 ? -28.506 39.844 -20.899 1.00 57.68 222 B 1 +ATOM 1691 N N . CYS B 2 223 ? -27.653 42.409 -17.517 1.00 64.66 223 B 1 +ATOM 1692 C CA . CYS B 2 223 ? -28.661 43.294 -16.963 1.00 63.06 223 B 1 +ATOM 1693 C C . CYS B 2 223 ? -29.275 43.994 -18.174 1.00 60.74 223 B 1 +ATOM 1694 O O . CYS B 2 223 ? -28.617 44.850 -18.776 1.00 55.24 223 B 1 +ATOM 1695 C CB . CYS B 2 223 ? -28.027 44.294 -15.991 1.00 59.93 223 B 1 +ATOM 1696 S SG . CYS B 2 223 ? -27.548 43.450 -14.447 1.00 55.64 223 B 1 +ATOM 1697 N N . ASP B 2 224 ? -30.496 43.602 -18.554 1.00 43.05 224 B 1 +ATOM 1698 C CA . ASP B 2 224 ? -31.297 44.439 -19.430 1.00 42.36 224 B 1 +ATOM 1699 C C . ASP B 2 224 ? -31.352 45.810 -18.771 1.00 39.61 224 B 1 +ATOM 1700 O O . ASP B 2 224 ? -31.838 45.964 -17.643 1.00 35.77 224 B 1 +ATOM 1701 C CB . ASP B 2 224 ? -32.696 43.845 -19.651 1.00 39.85 224 B 1 +ATOM 1702 C CG . ASP B 2 224 ? -32.708 42.695 -20.664 1.00 35.78 224 B 1 +ATOM 1703 O OD1 . ASP B 2 224 ? -31.858 42.709 -21.582 1.00 34.24 224 B 1 +ATOM 1704 O OD2 . ASP B 2 224 ? -33.562 41.801 -20.503 1.00 32.61 224 B 1 +ATOM 1705 N N . LYS B 2 225 ? -30.754 46.794 -19.445 1.00 37.66 225 B 1 +ATOM 1706 C CA . LYS B 2 225 ? -31.018 48.188 -19.120 1.00 40.77 225 B 1 +ATOM 1707 C C . LYS B 2 225 ? -32.470 48.436 -19.526 1.00 38.73 225 B 1 +ATOM 1708 O O . LYS B 2 225 ? -32.729 48.731 -20.688 1.00 35.87 225 B 1 +ATOM 1709 C CB . LYS B 2 225 ? -30.077 49.142 -19.871 1.00 39.20 225 B 1 +ATOM 1710 C CG . LYS B 2 225 ? -28.643 49.163 -19.338 1.00 35.47 225 B 1 +ATOM 1711 C CD . LYS B 2 225 ? -27.856 50.228 -20.117 1.00 33.34 225 B 1 +ATOM 1712 C CE . LYS B 2 225 ? -26.433 50.349 -19.591 1.00 28.67 225 B 1 +ATOM 1713 N NZ . LYS B 2 225 ? -25.683 51.402 -20.322 1.00 26.02 225 B 1 +ATOM 1714 N N . THR B 2 226 ? -33.372 48.259 -18.602 1.00 29.48 226 B 1 +ATOM 1715 C CA . THR B 2 226 ? -34.580 49.080 -18.591 1.00 30.79 226 B 1 +ATOM 1716 C C . THR B 2 226 ? -34.202 50.483 -18.147 1.00 28.13 226 B 1 +ATOM 1717 O O . THR B 2 226 ? -33.372 50.609 -17.219 1.00 25.93 226 B 1 +ATOM 1718 C CB . THR B 2 226 ? -35.668 48.526 -17.663 1.00 28.73 226 B 1 +ATOM 1719 O OG1 . THR B 2 226 ? -35.081 48.031 -16.489 1.00 27.21 226 B 1 +ATOM 1720 C CG2 . THR B 2 226 ? -36.442 47.402 -18.348 1.00 29.01 226 B 1 +ATOM 1721 O OXT . THR B 2 226 ? -34.777 51.419 -18.766 1.00 27.51 226 B 1 +ATOM 1722 N N . ALA C 3 1 ? 22.842 -52.565 16.890 1.00 29.87 1 C 1 +ATOM 1723 C CA . ALA C 3 1 ? 21.967 -51.732 17.721 1.00 39.55 1 C 1 +ATOM 1724 C C . ALA C 3 1 ? 22.403 -50.281 17.545 1.00 43.13 1 C 1 +ATOM 1725 O O . ALA C 3 1 ? 23.429 -49.897 18.089 1.00 42.89 1 C 1 +ATOM 1726 C CB . ALA C 3 1 ? 22.062 -52.181 19.181 1.00 38.01 1 C 1 +ATOM 1727 N N . VAL C 3 2 ? 21.692 -49.526 16.730 1.00 30.34 2 C 1 +ATOM 1728 C CA . VAL C 3 2 ? 21.959 -48.088 16.582 1.00 32.00 2 C 1 +ATOM 1729 C C . VAL C 3 2 ? 21.598 -47.464 17.926 1.00 32.96 2 C 1 +ATOM 1730 O O . VAL C 3 2 ? 20.435 -47.501 18.321 1.00 31.61 2 C 1 +ATOM 1731 C CB . VAL C 3 2 ? 21.152 -47.475 15.422 1.00 29.66 2 C 1 +ATOM 1732 C CG1 . VAL C 3 2 ? 21.449 -45.984 15.265 1.00 25.11 2 C 1 +ATOM 1733 C CG2 . VAL C 3 2 ? 21.504 -48.174 14.094 1.00 28.79 2 C 1 +ATOM 1734 N N . ARG C 3 3 ? 22.602 -47.009 18.700 1.00 31.54 3 C 1 +ATOM 1735 C CA . ARG C 3 3 ? 22.349 -46.310 19.957 1.00 36.22 3 C 1 +ATOM 1736 C C . ARG C 3 3 ? 21.548 -45.062 19.593 1.00 36.42 3 C 1 +ATOM 1737 O O . ARG C 3 3 ? 22.108 -44.120 19.042 1.00 36.10 3 C 1 +ATOM 1738 C CB . ARG C 3 3 ? 23.652 -45.946 20.692 1.00 35.69 3 C 1 +ATOM 1739 C CG . ARG C 3 3 ? 24.285 -47.137 21.428 1.00 32.87 3 C 1 +ATOM 1740 C CD . ARG C 3 3 ? 25.518 -46.680 22.225 1.00 32.02 3 C 1 +ATOM 1741 N NE . ARG C 3 3 ? 26.142 -47.797 22.963 1.00 28.12 3 C 1 +ATOM 1742 C CZ . ARG C 3 3 ? 27.164 -47.719 23.813 1.00 24.68 3 C 1 +ATOM 1743 N NH1 . ARG C 3 3 ? 27.749 -46.583 24.075 1.00 22.68 3 C 1 +ATOM 1744 N NH2 . ARG C 3 3 ? 27.618 -48.783 24.411 1.00 24.28 3 C 1 +ATOM 1745 N N . SER C 3 4 ? 20.244 -45.083 19.892 1.00 31.84 4 C 1 +ATOM 1746 C CA . SER C 3 4 ? 19.461 -43.864 20.035 1.00 31.77 4 C 1 +ATOM 1747 C C . SER C 3 4 ? 20.146 -43.065 21.141 1.00 32.32 4 C 1 +ATOM 1748 O O . SER C 3 4 ? 19.948 -43.349 22.318 1.00 30.70 4 C 1 +ATOM 1749 C CB . SER C 3 4 ? 18.009 -44.207 20.397 1.00 29.99 4 C 1 +ATOM 1750 O OG . SER C 3 4 ? 17.275 -43.035 20.641 1.00 27.21 4 C 1 +ATOM 1751 N N . SER C 3 5 ? 21.048 -42.153 20.790 1.00 33.69 5 C 1 +ATOM 1752 C CA . SER C 3 5 ? 21.548 -41.175 21.735 1.00 34.90 5 C 1 +ATOM 1753 C C . SER C 3 5 ? 20.328 -40.351 22.121 1.00 35.97 5 C 1 +ATOM 1754 O O . SER C 3 5 ? 19.906 -39.479 21.360 1.00 34.57 5 C 1 +ATOM 1755 C CB . SER C 3 5 ? 22.665 -40.313 21.123 1.00 32.98 5 C 1 +ATOM 1756 O OG . SER C 3 5 ? 22.267 -39.711 19.913 1.00 30.56 5 C 1 +ATOM 1757 N N . SER C 3 6 ? 19.725 -40.663 23.279 1.00 33.76 6 C 1 +ATOM 1758 C CA . SER C 3 6 ? 18.767 -39.801 23.943 1.00 34.97 6 C 1 +ATOM 1759 C C . SER C 3 6 ? 19.513 -38.498 24.207 1.00 36.79 6 C 1 +ATOM 1760 O O . SER C 3 6 ? 20.276 -38.403 25.162 1.00 35.78 6 C 1 +ATOM 1761 C CB . SER C 3 6 ? 18.282 -40.451 25.246 1.00 32.99 6 C 1 +ATOM 1762 O OG . SER C 3 6 ? 19.375 -40.850 26.048 1.00 30.67 6 C 1 +ATOM 1763 N N . ARG C 3 7 ? 19.388 -37.526 23.305 1.00 51.32 7 C 1 +ATOM 1764 C CA . ARG C 3 7 ? 19.802 -36.156 23.577 1.00 53.22 7 C 1 +ATOM 1765 C C . ARG C 3 7 ? 18.949 -35.737 24.762 1.00 54.76 7 C 1 +ATOM 1766 O O . ARG C 3 7 ? 17.761 -35.483 24.580 1.00 51.77 7 C 1 +ATOM 1767 C CB . ARG C 3 7 ? 19.580 -35.235 22.366 1.00 49.07 7 C 1 +ATOM 1768 C CG . ARG C 3 7 ? 20.633 -35.428 21.269 1.00 43.34 7 C 1 +ATOM 1769 C CD . ARG C 3 7 ? 20.419 -34.394 20.147 1.00 40.36 7 C 1 +ATOM 1770 N NE . ARG C 3 7 ? 21.422 -34.541 19.073 1.00 35.71 7 C 1 +ATOM 1771 C CZ . ARG C 3 7 ? 21.537 -33.765 17.997 1.00 32.30 7 C 1 +ATOM 1772 N NH1 . ARG C 3 7 ? 20.724 -32.767 17.783 1.00 31.01 7 C 1 +ATOM 1773 N NH2 . ARG C 3 7 ? 22.473 -33.986 17.122 1.00 30.07 7 C 1 +ATOM 1774 N N . THR C 3 8 ? 19.512 -35.771 25.960 1.00 40.12 8 C 1 +ATOM 1775 C CA . THR C 3 8 ? 18.914 -35.159 27.134 1.00 42.42 8 C 1 +ATOM 1776 C C . THR C 3 8 ? 18.579 -33.731 26.727 1.00 44.93 8 C 1 +ATOM 1777 O O . THR C 3 8 ? 19.493 -33.013 26.307 1.00 42.35 8 C 1 +ATOM 1778 C CB . THR C 3 8 ? 19.878 -35.161 28.334 1.00 37.82 8 C 1 +ATOM 1779 O OG1 . THR C 3 8 ? 21.214 -35.379 27.925 1.00 33.58 8 C 1 +ATOM 1780 C CG2 . THR C 3 8 ? 19.529 -36.291 29.301 1.00 32.18 8 C 1 +ATOM 1781 N N . PRO C 3 9 ? 17.285 -33.358 26.698 1.00 61.09 9 C 1 +ATOM 1782 C CA . PRO C 3 9 ? 16.908 -32.000 26.362 1.00 63.13 9 C 1 +ATOM 1783 C C . PRO C 3 9 ? 17.674 -31.085 27.319 1.00 67.47 9 C 1 +ATOM 1784 O O . PRO C 3 9 ? 17.681 -31.309 28.527 1.00 63.56 9 C 1 +ATOM 1785 C CB . PRO C 3 9 ? 15.384 -31.933 26.510 1.00 56.56 9 C 1 +ATOM 1786 C CG . PRO C 3 9 ? 15.042 -33.107 27.422 1.00 53.37 9 C 1 +ATOM 1787 C CD . PRO C 3 9 ? 16.134 -34.126 27.141 1.00 54.98 9 C 1 +ATOM 1788 N N . SER C 3 10 ? 18.408 -30.126 26.780 1.00 76.19 10 C 1 +ATOM 1789 C CA . SER C 3 10 ? 19.149 -29.181 27.605 1.00 82.01 10 C 1 +ATOM 1790 C C . SER C 3 10 ? 18.138 -28.383 28.419 1.00 85.80 10 C 1 +ATOM 1791 O O . SER C 3 10 ? 17.252 -27.766 27.832 1.00 81.58 10 C 1 +ATOM 1792 C CB . SER C 3 10 ? 19.984 -28.265 26.710 1.00 74.02 10 C 1 +ATOM 1793 O OG . SER C 3 10 ? 20.623 -27.256 27.466 1.00 64.23 10 C 1 +ATOM 1794 N N . ASP C 3 11 ? 18.294 -28.355 29.750 1.00 89.49 11 C 1 +ATOM 1795 C CA . ASP C 3 11 ? 17.452 -27.531 30.627 1.00 92.07 11 C 1 +ATOM 1796 C C . ASP C 3 11 ? 17.764 -26.030 30.508 1.00 94.22 11 C 1 +ATOM 1797 O O . ASP C 3 11 ? 17.163 -25.189 31.176 1.00 91.51 11 C 1 +ATOM 1798 C CB . ASP C 3 11 ? 17.607 -28.011 32.075 1.00 87.32 11 C 1 +ATOM 1799 C CG . ASP C 3 11 ? 17.107 -29.442 32.300 1.00 78.12 11 C 1 +ATOM 1800 O OD1 . ASP C 3 11 ? 16.162 -29.855 31.597 1.00 68.20 11 C 1 +ATOM 1801 O OD2 . ASP C 3 11 ? 17.692 -30.116 33.172 1.00 68.88 11 C 1 +ATOM 1802 N N . LYS C 3 12 ? 18.708 -25.674 29.653 1.00 94.56 12 C 1 +ATOM 1803 C CA . LYS C 3 12 ? 19.131 -24.297 29.442 1.00 95.57 12 C 1 +ATOM 1804 C C . LYS C 3 12 ? 18.075 -23.517 28.654 1.00 96.66 12 C 1 +ATOM 1805 O O . LYS C 3 12 ? 17.577 -24.024 27.645 1.00 95.58 12 C 1 +ATOM 1806 C CB . LYS C 3 12 ? 20.482 -24.255 28.724 1.00 93.11 12 C 1 +ATOM 1807 C CG . LYS C 3 12 ? 21.612 -24.830 29.591 1.00 87.82 12 C 1 +ATOM 1808 C CD . LYS C 3 12 ? 22.944 -24.707 28.852 1.00 81.71 12 C 1 +ATOM 1809 C CE . LYS C 3 12 ? 24.105 -25.146 29.733 1.00 72.94 12 C 1 +ATOM 1810 N NZ . LYS C 3 12 ? 25.395 -24.734 29.142 1.00 65.58 12 C 1 +ATOM 1811 N N . PRO C 3 13 ? 17.777 -22.272 29.067 1.00 97.30 13 C 1 +ATOM 1812 C CA . PRO C 3 13 ? 16.949 -21.368 28.280 1.00 97.71 13 C 1 +ATOM 1813 C C . PRO C 3 13 ? 17.475 -21.209 26.851 1.00 97.82 13 C 1 +ATOM 1814 O O . PRO C 3 13 ? 18.647 -20.887 26.645 1.00 97.13 13 C 1 +ATOM 1815 C CB . PRO C 3 13 ? 16.968 -20.038 29.035 1.00 97.28 13 C 1 +ATOM 1816 C CG . PRO C 3 13 ? 17.213 -20.454 30.483 1.00 95.23 13 C 1 +ATOM 1817 C CD . PRO C 3 13 ? 18.134 -21.657 30.332 1.00 97.00 13 C 1 +ATOM 1818 N N . VAL C 3 14 ? 16.605 -21.434 25.875 1.00 97.52 14 C 1 +ATOM 1819 C CA . VAL C 3 14 ? 16.920 -21.258 24.455 1.00 97.35 14 C 1 +ATOM 1820 C C . VAL C 3 14 ? 15.735 -20.668 23.704 1.00 97.45 14 C 1 +ATOM 1821 O O . VAL C 3 14 ? 14.577 -20.971 23.984 1.00 96.76 14 C 1 +ATOM 1822 C CB . VAL C 3 14 ? 17.387 -22.559 23.768 1.00 95.87 14 C 1 +ATOM 1823 C CG1 . VAL C 3 14 ? 18.742 -23.023 24.295 1.00 87.59 14 C 1 +ATOM 1824 C CG2 . VAL C 3 14 ? 16.400 -23.715 23.917 1.00 87.29 14 C 1 +ATOM 1825 N N . ALA C 3 15 ? 16.036 -19.857 22.714 1.00 97.57 15 C 1 +ATOM 1826 C CA . ALA C 3 15 ? 15.061 -19.381 21.750 1.00 97.74 15 C 1 +ATOM 1827 C C . ALA C 3 15 ? 15.685 -19.298 20.360 1.00 97.84 15 C 1 +ATOM 1828 O O . ALA C 3 15 ? 16.835 -18.892 20.217 1.00 97.28 15 C 1 +ATOM 1829 C CB . ALA C 3 15 ? 14.522 -18.022 22.189 1.00 97.32 15 C 1 +ATOM 1830 N N . HIS C 3 16 ? 14.903 -19.643 19.359 1.00 97.17 16 C 1 +ATOM 1831 C CA . HIS C 3 16 ? 15.190 -19.359 17.961 1.00 96.78 16 C 1 +ATOM 1832 C C . HIS C 3 16 ? 13.879 -18.962 17.289 1.00 96.57 16 C 1 +ATOM 1833 O O . HIS C 3 16 ? 12.983 -19.787 17.119 1.00 95.55 16 C 1 +ATOM 1834 C CB . HIS C 3 16 ? 15.839 -20.578 17.302 1.00 96.06 16 C 1 +ATOM 1835 C CG . HIS C 3 16 ? 16.289 -20.299 15.893 1.00 95.70 16 C 1 +ATOM 1836 N ND1 . HIS C 3 16 ? 17.537 -19.831 15.523 1.00 92.50 16 C 1 +ATOM 1837 C CD2 . HIS C 3 16 ? 15.563 -20.452 14.747 1.00 92.69 16 C 1 +ATOM 1838 C CE1 . HIS C 3 16 ? 17.557 -19.712 14.188 1.00 92.04 16 C 1 +ATOM 1839 N NE2 . HIS C 3 16 ? 16.374 -20.079 13.681 1.00 92.31 16 C 1 +ATOM 1840 N N . VAL C 3 17 ? 13.737 -17.690 16.960 1.00 96.79 17 C 1 +ATOM 1841 C CA . VAL C 3 17 ? 12.551 -17.143 16.298 1.00 96.78 17 C 1 +ATOM 1842 C C . VAL C 3 17 ? 12.901 -16.739 14.873 1.00 96.26 17 C 1 +ATOM 1843 O O . VAL C 3 17 ? 14.039 -16.380 14.583 1.00 95.63 17 C 1 +ATOM 1844 C CB . VAL C 3 17 ? 11.901 -16.001 17.096 1.00 96.91 17 C 1 +ATOM 1845 C CG1 . VAL C 3 17 ? 11.414 -16.504 18.458 1.00 95.90 17 C 1 +ATOM 1846 C CG2 . VAL C 3 17 ? 12.822 -14.798 17.325 1.00 94.26 17 C 1 +ATOM 1847 N N . VAL C 3 18 ? 11.924 -16.812 13.980 1.00 95.11 18 C 1 +ATOM 1848 C CA . VAL C 3 18 ? 12.093 -16.523 12.552 1.00 94.32 18 C 1 +ATOM 1849 C C . VAL C 3 18 ? 11.148 -15.410 12.121 1.00 93.85 18 C 1 +ATOM 1850 O O . VAL C 3 18 ? 10.086 -15.239 12.715 1.00 92.87 18 C 1 +ATOM 1851 C CB . VAL C 3 18 ? 11.906 -17.779 11.685 1.00 93.16 18 C 1 +ATOM 1852 C CG1 . VAL C 3 18 ? 12.962 -18.839 12.019 1.00 88.84 18 C 1 +ATOM 1853 C CG2 . VAL C 3 18 ? 10.515 -18.410 11.831 1.00 88.45 18 C 1 +ATOM 1854 N N . ALA C 3 19 ? 11.511 -14.667 11.091 1.00 92.27 19 C 1 +ATOM 1855 C CA . ALA C 3 19 ? 10.659 -13.606 10.572 1.00 91.15 19 C 1 +ATOM 1856 C C . ALA C 3 19 ? 9.354 -14.158 9.974 1.00 89.57 19 C 1 +ATOM 1857 O O . ALA C 3 19 ? 9.319 -15.225 9.351 1.00 87.20 19 C 1 +ATOM 1858 C CB . ALA C 3 19 ? 11.437 -12.779 9.557 1.00 90.90 19 C 1 +ATOM 1859 N N . ASN C 3 20 ? 8.271 -13.410 10.153 1.00 87.17 20 C 1 +ATOM 1860 C CA . ASN C 3 20 ? 6.996 -13.671 9.501 1.00 84.51 20 C 1 +ATOM 1861 C C . ASN C 3 20 ? 7.002 -13.089 8.079 1.00 81.73 20 C 1 +ATOM 1862 O O . ASN C 3 20 ? 6.882 -11.873 7.942 1.00 78.97 20 C 1 +ATOM 1863 C CB . ASN C 3 20 ? 5.865 -13.057 10.330 1.00 83.23 20 C 1 +ATOM 1864 C CG . ASN C 3 20 ? 4.494 -13.355 9.744 1.00 82.86 20 C 1 +ATOM 1865 O OD1 . ASN C 3 20 ? 4.333 -14.158 8.835 1.00 78.84 20 C 1 +ATOM 1866 N ND2 . ASN C 3 20 ? 3.462 -12.745 10.286 1.00 77.70 20 C 1 +ATOM 1867 N N . PRO C 3 21 ? 7.050 -13.912 7.018 1.00 78.32 21 C 1 +ATOM 1868 C CA . PRO C 3 21 ? 7.040 -13.408 5.647 1.00 72.62 21 C 1 +ATOM 1869 C C . PRO C 3 21 ? 5.682 -12.865 5.198 1.00 70.34 21 C 1 +ATOM 1870 O O . PRO C 3 21 ? 5.575 -12.342 4.102 1.00 67.26 21 C 1 +ATOM 1871 C CB . PRO C 3 21 ? 7.476 -14.601 4.795 1.00 70.30 21 C 1 +ATOM 1872 C CG . PRO C 3 21 ? 6.918 -15.773 5.573 1.00 69.00 21 C 1 +ATOM 1873 C CD . PRO C 3 21 ? 7.119 -15.350 7.029 1.00 70.74 21 C 1 +ATOM 1874 N N . GLN C 3 22 ? 4.637 -13.016 6.005 1.00 67.38 22 C 1 +ATOM 1875 C CA . GLN C 3 22 ? 3.321 -12.414 5.753 1.00 64.35 22 C 1 +ATOM 1876 C C . GLN C 3 22 ? 3.178 -11.026 6.394 1.00 64.82 22 C 1 +ATOM 1877 O O . GLN C 3 22 ? 2.211 -10.332 6.109 1.00 61.79 22 C 1 +ATOM 1878 C CB . GLN C 3 22 ? 2.213 -13.347 6.260 1.00 60.47 22 C 1 +ATOM 1879 C CG . GLN C 3 22 ? 2.173 -14.684 5.513 1.00 54.82 22 C 1 +ATOM 1880 C CD . GLN C 3 22 ? 1.088 -15.621 6.040 1.00 50.65 22 C 1 +ATOM 1881 O OE1 . GLN C 3 22 ? 0.725 -15.623 7.202 1.00 47.12 22 C 1 +ATOM 1882 N NE2 . GLN C 3 22 ? 0.564 -16.491 5.208 1.00 45.81 22 C 1 +ATOM 1883 N N . ALA C 3 23 ? 4.104 -10.636 7.256 1.00 68.11 23 C 1 +ATOM 1884 C CA . ALA C 3 23 ? 4.122 -9.305 7.849 1.00 67.39 23 C 1 +ATOM 1885 C C . ALA C 3 23 ? 4.920 -8.351 6.945 1.00 65.70 23 C 1 +ATOM 1886 O O . ALA C 3 23 ? 6.034 -7.952 7.268 1.00 62.62 23 C 1 +ATOM 1887 C CB . ALA C 3 23 ? 4.653 -9.399 9.281 1.00 67.24 23 C 1 +ATOM 1888 N N . GLU C 3 24 ? 4.351 -8.027 5.791 1.00 60.53 24 C 1 +ATOM 1889 C CA . GLU C 3 24 ? 4.992 -7.116 4.844 1.00 58.19 24 C 1 +ATOM 1890 C C . GLU C 3 24 ? 5.287 -5.754 5.484 1.00 60.57 24 C 1 +ATOM 1891 O O . GLU C 3 24 ? 4.490 -5.205 6.241 1.00 56.19 24 C 1 +ATOM 1892 C CB . GLU C 3 24 ? 4.145 -6.943 3.577 1.00 52.06 24 C 1 +ATOM 1893 C CG . GLU C 3 24 ? 4.071 -8.228 2.747 1.00 44.58 24 C 1 +ATOM 1894 C CD . GLU C 3 24 ? 3.407 -8.024 1.375 1.00 40.62 24 C 1 +ATOM 1895 O OE1 . GLU C 3 24 ? 3.463 -8.984 0.575 1.00 36.45 24 C 1 +ATOM 1896 O OE2 . GLU C 3 24 ? 2.863 -6.924 1.129 1.00 36.68 24 C 1 +ATOM 1897 N N . GLY C 3 25 ? 6.465 -5.228 5.189 1.00 62.99 25 C 1 +ATOM 1898 C CA . GLY C 3 25 ? 6.908 -3.945 5.742 1.00 62.67 25 C 1 +ATOM 1899 C C . GLY C 3 25 ? 7.274 -3.955 7.224 1.00 67.74 25 C 1 +ATOM 1900 O O . GLY C 3 25 ? 7.574 -2.895 7.777 1.00 65.91 25 C 1 +ATOM 1901 N N . GLN C 3 26 ? 7.284 -5.129 7.883 1.00 75.62 26 C 1 +ATOM 1902 C CA . GLN C 3 26 ? 7.647 -5.242 9.291 1.00 77.91 26 C 1 +ATOM 1903 C C . GLN C 3 26 ? 8.530 -6.467 9.552 1.00 81.49 26 C 1 +ATOM 1904 O O . GLN C 3 26 ? 8.368 -7.524 8.941 1.00 81.65 26 C 1 +ATOM 1905 C CB . GLN C 3 26 ? 6.385 -5.297 10.163 1.00 74.94 26 C 1 +ATOM 1906 C CG . GLN C 3 26 ? 5.523 -4.027 10.035 1.00 66.02 26 C 1 +ATOM 1907 C CD . GLN C 3 26 ? 4.339 -3.993 11.002 1.00 61.75 26 C 1 +ATOM 1908 O OE1 . GLN C 3 26 ? 4.098 -4.892 11.787 1.00 55.92 26 C 1 +ATOM 1909 N NE2 . GLN C 3 26 ? 3.552 -2.938 10.980 1.00 52.27 26 C 1 +ATOM 1910 N N . LEU C 3 27 ? 9.427 -6.350 10.515 1.00 90.89 27 C 1 +ATOM 1911 C CA . LEU C 3 27 ? 10.164 -7.489 11.049 1.00 93.18 27 C 1 +ATOM 1912 C C . LEU C 3 27 ? 9.419 -8.042 12.270 1.00 93.65 27 C 1 +ATOM 1913 O O . LEU C 3 27 ? 9.697 -7.668 13.408 1.00 92.79 27 C 1 +ATOM 1914 C CB . LEU C 3 27 ? 11.619 -7.076 11.333 1.00 93.95 27 C 1 +ATOM 1915 C CG . LEU C 3 27 ? 12.498 -8.225 11.861 1.00 94.38 27 C 1 +ATOM 1916 C CD1 . LEU C 3 27 ? 12.542 -9.419 10.916 1.00 92.38 27 C 1 +ATOM 1917 C CD2 . LEU C 3 27 ? 13.926 -7.713 12.062 1.00 92.21 27 C 1 +ATOM 1918 N N . GLN C 3 28 ? 8.471 -8.935 12.029 1.00 93.80 28 C 1 +ATOM 1919 C CA . GLN C 3 28 ? 7.739 -9.626 13.089 1.00 93.26 28 C 1 +ATOM 1920 C C . GLN C 3 28 ? 8.344 -11.006 13.347 1.00 93.27 28 C 1 +ATOM 1921 O O . GLN C 3 28 ? 8.382 -11.857 12.454 1.00 92.59 28 C 1 +ATOM 1922 C CB . GLN C 3 28 ? 6.255 -9.725 12.723 1.00 91.91 28 C 1 +ATOM 1923 C CG . GLN C 3 28 ? 5.433 -10.280 13.894 1.00 87.24 28 C 1 +ATOM 1924 C CD . GLN C 3 28 ? 3.958 -10.487 13.548 1.00 83.23 28 C 1 +ATOM 1925 O OE1 . GLN C 3 28 ? 3.601 -10.958 12.479 1.00 75.58 28 C 1 +ATOM 1926 N NE2 . GLN C 3 28 ? 3.060 -10.181 14.452 1.00 71.52 28 C 1 +ATOM 1927 N N . TRP C 3 29 ? 8.766 -11.257 14.581 1.00 94.98 29 C 1 +ATOM 1928 C CA . TRP C 3 29 ? 9.293 -12.552 14.995 1.00 95.71 29 C 1 +ATOM 1929 C C . TRP C 3 29 ? 8.175 -13.552 15.304 1.00 95.41 29 C 1 +ATOM 1930 O O . TRP C 3 29 ? 7.177 -13.223 15.942 1.00 94.40 29 C 1 +ATOM 1931 C CB . TRP C 3 29 ? 10.238 -12.364 16.179 1.00 96.21 29 C 1 +ATOM 1932 C CG . TRP C 3 29 ? 11.424 -11.487 15.875 1.00 96.31 29 C 1 +ATOM 1933 C CD1 . TRP C 3 29 ? 11.679 -10.286 16.442 1.00 95.77 29 C 1 +ATOM 1934 C CD2 . TRP C 3 29 ? 12.497 -11.720 14.909 1.00 96.41 29 C 1 +ATOM 1935 N NE1 . TRP C 3 29 ? 12.844 -9.754 15.902 1.00 96.02 29 C 1 +ATOM 1936 C CE2 . TRP C 3 29 ? 13.375 -10.604 14.953 1.00 96.29 29 C 1 +ATOM 1937 C CE3 . TRP C 3 29 ? 12.800 -12.760 14.002 1.00 96.60 29 C 1 +ATOM 1938 C CZ2 . TRP C 3 29 ? 14.516 -10.517 14.125 1.00 96.27 29 C 1 +ATOM 1939 C CZ3 . TRP C 3 29 ? 13.941 -12.670 13.178 1.00 96.17 29 C 1 +ATOM 1940 C CH2 . TRP C 3 29 ? 14.785 -11.556 13.240 1.00 96.15 29 C 1 +ATOM 1941 N N . LEU C 3 30 ? 8.353 -14.793 14.864 1.00 94.63 30 C 1 +ATOM 1942 C CA . LEU C 3 30 ? 7.432 -15.899 15.105 1.00 94.02 30 C 1 +ATOM 1943 C C . LEU C 3 30 ? 8.151 -17.075 15.762 1.00 94.71 30 C 1 +ATOM 1944 O O . LEU C 3 30 ? 9.251 -17.449 15.369 1.00 93.80 30 C 1 +ATOM 1945 C CB . LEU C 3 30 ? 6.795 -16.362 13.789 1.00 91.36 30 C 1 +ATOM 1946 C CG . LEU C 3 30 ? 5.883 -15.352 13.079 1.00 87.40 30 C 1 +ATOM 1947 C CD1 . LEU C 3 30 ? 5.343 -16.020 11.814 1.00 82.67 30 C 1 +ATOM 1948 C CD2 . LEU C 3 30 ? 4.691 -14.928 13.937 1.00 81.61 30 C 1 +ATOM 1949 N N . ASN C 3 31 ? 7.463 -17.729 16.698 1.00 92.99 31 C 1 +ATOM 1950 C CA . ASN C 3 31 ? 7.918 -18.957 17.359 1.00 92.02 31 C 1 +ATOM 1951 C C . ASN C 3 31 ? 7.202 -20.225 16.865 1.00 90.58 31 C 1 +ATOM 1952 O O . ASN C 3 31 ? 7.656 -21.329 17.135 1.00 83.97 31 C 1 +ATOM 1953 C CB . ASN C 3 31 ? 7.748 -18.780 18.876 1.00 89.54 31 C 1 +ATOM 1954 C CG . ASN C 3 31 ? 6.296 -18.680 19.326 1.00 88.19 31 C 1 +ATOM 1955 O OD1 . ASN C 3 31 ? 5.400 -18.331 18.588 1.00 76.00 31 C 1 +ATOM 1956 N ND2 . ASN C 3 31 ? 6.015 -19.001 20.570 1.00 77.71 31 C 1 +ATOM 1957 N N . ARG C 3 32 ? 6.068 -20.098 16.163 1.00 88.28 32 C 1 +ATOM 1958 C CA . ARG C 3 32 ? 5.211 -21.226 15.745 1.00 86.05 32 C 1 +ATOM 1959 C C . ARG C 3 32 ? 5.503 -21.730 14.324 1.00 84.39 32 C 1 +ATOM 1960 O O . ARG C 3 32 ? 4.626 -22.322 13.695 1.00 78.72 32 C 1 +ATOM 1961 C CB . ARG C 3 32 ? 3.727 -20.876 15.938 1.00 83.30 32 C 1 +ATOM 1962 C CG . ARG C 3 32 ? 3.353 -20.645 17.406 1.00 75.23 32 C 1 +ATOM 1963 C CD . ARG C 3 32 ? 1.835 -20.444 17.512 1.00 70.46 32 C 1 +ATOM 1964 N NE . ARG C 3 32 ? 1.421 -20.177 18.900 1.00 60.44 32 C 1 +ATOM 1965 C CZ . ARG C 3 32 ? 0.171 -20.043 19.325 1.00 52.13 32 C 1 +ATOM 1966 N NH1 . ARG C 3 32 ? -0.844 -20.149 18.513 1.00 47.73 32 C 1 +ATOM 1967 N NH2 . ARG C 3 32 ? -0.068 -19.791 20.580 1.00 45.18 32 C 1 +ATOM 1968 N N . ARG C 3 33 ? 6.692 -21.483 13.812 1.00 84.99 33 C 1 +ATOM 1969 C CA . ARG C 3 33 ? 7.106 -21.997 12.501 1.00 83.37 33 C 1 +ATOM 1970 C C . ARG C 3 33 ? 8.032 -23.198 12.628 1.00 83.60 33 C 1 +ATOM 1971 O O . ARG C 3 33 ? 8.624 -23.432 13.678 1.00 79.41 33 C 1 +ATOM 1972 C CB . ARG C 3 33 ? 7.723 -20.886 11.649 1.00 79.56 33 C 1 +ATOM 1973 C CG . ARG C 3 33 ? 6.608 -20.053 10.994 1.00 72.34 33 C 1 +ATOM 1974 C CD . ARG C 3 33 ? 7.180 -19.193 9.867 1.00 68.87 33 C 1 +ATOM 1975 N NE . ARG C 3 33 ? 6.098 -18.554 9.099 1.00 60.65 33 C 1 +ATOM 1976 C CZ . ARG C 3 33 ? 6.068 -18.371 7.789 1.00 55.50 33 C 1 +ATOM 1977 N NH1 . ARG C 3 33 ? 7.071 -18.701 7.030 1.00 50.54 33 C 1 +ATOM 1978 N NH2 . ARG C 3 33 ? 5.021 -17.840 7.225 1.00 48.79 33 C 1 +ATOM 1979 N N . ALA C 3 34 ? 8.157 -23.939 11.535 1.00 80.85 34 C 1 +ATOM 1980 C CA . ALA C 3 34 ? 9.181 -24.963 11.419 1.00 78.16 34 C 1 +ATOM 1981 C C . ALA C 3 34 ? 10.557 -24.359 11.756 1.00 78.72 34 C 1 +ATOM 1982 O O . ALA C 3 34 ? 10.876 -23.252 11.329 1.00 73.36 34 C 1 +ATOM 1983 C CB . ALA C 3 34 ? 9.145 -25.543 10.000 1.00 74.36 34 C 1 +ATOM 1984 N N . ASN C 3 35 ? 11.335 -25.093 12.553 1.00 82.16 35 C 1 +ATOM 1985 C CA . ASN C 3 35 ? 12.654 -24.693 13.061 1.00 82.81 35 C 1 +ATOM 1986 C C . ASN C 3 35 ? 12.671 -23.544 14.085 1.00 85.40 35 C 1 +ATOM 1987 O O . ASN C 3 35 ? 13.743 -23.230 14.597 1.00 80.87 35 C 1 +ATOM 1988 C CB . ASN C 3 35 ? 13.625 -24.451 11.898 1.00 77.27 35 C 1 +ATOM 1989 C CG . ASN C 3 35 ? 13.638 -25.591 10.891 1.00 69.79 35 C 1 +ATOM 1990 O OD1 . ASN C 3 35 ? 13.412 -26.748 11.215 1.00 60.69 35 C 1 +ATOM 1991 N ND2 . ASN C 3 35 ? 13.884 -25.290 9.636 1.00 60.89 35 C 1 +ATOM 1992 N N . ALA C 3 36 ? 11.535 -22.944 14.426 1.00 89.18 36 C 1 +ATOM 1993 C CA . ALA C 3 36 ? 11.477 -22.004 15.535 1.00 90.11 36 C 1 +ATOM 1994 C C . ALA C 3 36 ? 11.365 -22.746 16.878 1.00 90.66 36 C 1 +ATOM 1995 O O . ALA C 3 36 ? 10.738 -23.801 16.975 1.00 88.52 36 C 1 +ATOM 1996 C CB . ALA C 3 36 ? 10.338 -21.011 15.308 1.00 88.30 36 C 1 +ATOM 1997 N N . LEU C 3 37 ? 11.967 -22.177 17.919 1.00 93.44 37 C 1 +ATOM 1998 C CA . LEU C 3 37 ? 12.050 -22.776 19.242 1.00 93.61 37 C 1 +ATOM 1999 C C . LEU C 3 37 ? 11.908 -21.698 20.319 1.00 95.05 37 C 1 +ATOM 2000 O O . LEU C 3 37 ? 12.570 -20.668 20.274 1.00 93.50 37 C 1 +ATOM 2001 C CB . LEU C 3 37 ? 13.398 -23.521 19.339 1.00 89.34 37 C 1 +ATOM 2002 C CG . LEU C 3 37 ? 13.644 -24.255 20.666 1.00 85.25 37 C 1 +ATOM 2003 C CD1 . LEU C 3 37 ? 12.691 -25.434 20.862 1.00 77.16 37 C 1 +ATOM 2004 C CD2 . LEU C 3 37 ? 15.076 -24.780 20.703 1.00 75.47 37 C 1 +ATOM 2005 N N . LEU C 3 38 ? 11.071 -21.980 21.318 1.00 95.08 38 C 1 +ATOM 2006 C CA . LEU C 3 38 ? 11.038 -21.277 22.600 1.00 95.29 38 C 1 +ATOM 2007 C C . LEU C 3 38 ? 10.987 -22.344 23.684 1.00 94.97 38 C 1 +ATOM 2008 O O . LEU C 3 38 ? 10.017 -23.105 23.743 1.00 92.35 38 C 1 +ATOM 2009 C CB . LEU C 3 38 ? 9.809 -20.355 22.685 1.00 93.79 38 C 1 +ATOM 2010 C CG . LEU C 3 38 ? 9.981 -18.984 22.011 1.00 90.13 38 C 1 +ATOM 2011 C CD1 . LEU C 3 38 ? 8.635 -18.271 21.938 1.00 85.91 38 C 1 +ATOM 2012 C CD2 . LEU C 3 38 ? 10.918 -18.076 22.800 1.00 85.41 38 C 1 +ATOM 2013 N N . ALA C 3 39 ? 12.019 -22.432 24.513 1.00 95.55 39 C 1 +ATOM 2014 C CA . ALA C 3 39 ? 12.132 -23.472 25.523 1.00 95.65 39 C 1 +ATOM 2015 C C . ALA C 3 39 ? 12.718 -22.945 26.835 1.00 96.55 39 C 1 +ATOM 2016 O O . ALA C 3 39 ? 13.410 -21.924 26.869 1.00 95.91 39 C 1 +ATOM 2017 C CB . ALA C 3 39 ? 12.948 -24.636 24.953 1.00 93.83 39 C 1 +ATOM 2018 N N . ASN C 3 40 ? 12.441 -23.665 27.910 1.00 96.24 40 C 1 +ATOM 2019 C CA . ASN C 3 40 ? 12.998 -23.452 29.246 1.00 96.99 40 C 1 +ATOM 2020 C C . ASN C 3 40 ? 12.806 -22.016 29.766 1.00 97.29 40 C 1 +ATOM 2021 O O . ASN C 3 40 ? 13.715 -21.394 30.309 1.00 96.21 40 C 1 +ATOM 2022 C CB . ASN C 3 40 ? 14.445 -23.968 29.267 1.00 96.62 40 C 1 +ATOM 2023 C CG . ASN C 3 40 ? 14.549 -25.422 28.820 1.00 95.35 40 C 1 +ATOM 2024 O OD1 . ASN C 3 40 ? 13.641 -26.220 28.976 1.00 86.37 40 C 1 +ATOM 2025 N ND2 . ASN C 3 40 ? 15.652 -25.799 28.212 1.00 84.86 40 C 1 +ATOM 2026 N N . GLY C 3 41 ? 11.599 -21.488 29.598 1.00 97.03 41 C 1 +ATOM 2027 C CA . GLY C 3 41 ? 11.152 -20.223 30.182 1.00 96.98 41 C 1 +ATOM 2028 C C . GLY C 3 41 ? 11.411 -18.971 29.347 1.00 97.40 41 C 1 +ATOM 2029 O O . GLY C 3 41 ? 10.963 -17.900 29.753 1.00 95.97 41 C 1 +ATOM 2030 N N . VAL C 3 42 ? 12.077 -19.065 28.204 1.00 97.64 42 C 1 +ATOM 2031 C CA . VAL C 3 42 ? 12.184 -17.912 27.297 1.00 97.76 42 C 1 +ATOM 2032 C C . VAL C 3 42 ? 10.817 -17.624 26.685 1.00 97.58 42 C 1 +ATOM 2033 O O . VAL C 3 42 ? 10.159 -18.519 26.155 1.00 96.81 42 C 1 +ATOM 2034 C CB . VAL C 3 42 ? 13.232 -18.102 26.189 1.00 97.61 42 C 1 +ATOM 2035 C CG1 . VAL C 3 42 ? 13.430 -16.800 25.405 1.00 95.30 42 C 1 +ATOM 2036 C CG2 . VAL C 3 42 ? 14.597 -18.504 26.758 1.00 93.34 42 C 1 +ATOM 2037 N N . GLU C 3 43 ? 10.399 -16.368 26.723 1.00 97.81 43 C 1 +ATOM 2038 C CA . GLU C 3 43 ? 9.138 -15.919 26.147 1.00 97.62 43 C 1 +ATOM 2039 C C . GLU C 3 43 ? 9.373 -14.944 24.992 1.00 97.75 43 C 1 +ATOM 2040 O O . GLU C 3 43 ? 10.354 -14.205 24.970 1.00 97.23 43 C 1 +ATOM 2041 C CB . GLU C 3 43 ? 8.251 -15.281 27.221 1.00 96.90 43 C 1 +ATOM 2042 C CG . GLU C 3 43 ? 7.837 -16.257 28.336 1.00 90.98 43 C 1 +ATOM 2043 C CD . GLU C 3 43 ? 6.827 -15.625 29.308 1.00 88.03 43 C 1 +ATOM 2044 O OE1 . GLU C 3 43 ? 6.535 -16.204 30.376 1.00 80.71 43 C 1 +ATOM 2045 O OE2 . GLU C 3 43 ? 6.284 -14.537 28.995 1.00 82.63 43 C 1 +ATOM 2046 N N . LEU C 3 44 ? 8.441 -14.913 24.053 1.00 97.62 44 C 1 +ATOM 2047 C CA . LEU C 3 44 ? 8.351 -13.877 23.029 1.00 97.48 44 C 1 +ATOM 2048 C C . LEU C 3 44 ? 7.134 -13.004 23.345 1.00 97.13 44 C 1 +ATOM 2049 O O . LEU C 3 44 ? 5.997 -13.466 23.235 1.00 95.81 44 C 1 +ATOM 2050 C CB . LEU C 3 44 ? 8.273 -14.540 21.645 1.00 97.12 44 C 1 +ATOM 2051 C CG . LEU C 3 44 ? 8.159 -13.547 20.468 1.00 96.43 44 C 1 +ATOM 2052 C CD1 . LEU C 3 44 ? 9.421 -12.709 20.288 1.00 93.56 44 C 1 +ATOM 2053 C CD2 . LEU C 3 44 ? 7.918 -14.323 19.169 1.00 92.88 44 C 1 +ATOM 2054 N N . ARG C 3 45 ? 7.367 -11.752 23.756 1.00 96.81 45 C 1 +ATOM 2055 C CA . ARG C 3 45 ? 6.336 -10.754 24.065 1.00 96.57 45 C 1 +ATOM 2056 C C . ARG C 3 45 ? 6.664 -9.441 23.372 1.00 96.73 45 C 1 +ATOM 2057 O O . ARG C 3 45 ? 7.813 -9.023 23.377 1.00 95.67 45 C 1 +ATOM 2058 C CB . ARG C 3 45 ? 6.229 -10.522 25.579 1.00 95.07 45 C 1 +ATOM 2059 C CG . ARG C 3 45 ? 5.677 -11.726 26.352 1.00 83.35 45 C 1 +ATOM 2060 C CD . ARG C 3 45 ? 5.439 -11.316 27.813 1.00 81.56 45 C 1 +ATOM 2061 N NE . ARG C 3 45 ? 4.987 -12.445 28.635 1.00 71.44 45 C 1 +ATOM 2062 C CZ . ARG C 3 45 ? 4.615 -12.410 29.900 1.00 64.69 45 C 1 +ATOM 2063 N NH1 . ARG C 3 45 ? 4.524 -11.292 30.560 1.00 59.51 45 C 1 +ATOM 2064 N NH2 . ARG C 3 45 ? 4.352 -13.509 30.521 1.00 56.09 45 C 1 +ATOM 2065 N N . ASP C 3 46 ? 5.667 -8.793 22.793 1.00 96.32 46 C 1 +ATOM 2066 C CA . ASP C 3 46 ? 5.813 -7.501 22.104 1.00 96.33 46 C 1 +ATOM 2067 C C . ASP C 3 46 ? 7.002 -7.463 21.122 1.00 96.75 46 C 1 +ATOM 2068 O O . ASP C 3 46 ? 7.777 -6.509 21.062 1.00 95.57 46 C 1 +ATOM 2069 C CB . ASP C 3 46 ? 5.808 -6.347 23.127 1.00 95.41 46 C 1 +ATOM 2070 C CG . ASP C 3 46 ? 4.545 -6.345 23.987 1.00 90.03 46 C 1 +ATOM 2071 O OD1 . ASP C 3 46 ? 3.471 -6.674 23.433 1.00 83.06 46 C 1 +ATOM 2072 O OD2 . ASP C 3 46 ? 4.669 -6.055 25.195 1.00 80.62 46 C 1 +ATOM 2073 N N . ASN C 3 47 ? 7.157 -8.546 20.373 1.00 97.34 47 C 1 +ATOM 2074 C CA . ASN C 3 47 ? 8.250 -8.746 19.423 1.00 97.65 47 C 1 +ATOM 2075 C C . ASN C 3 47 ? 9.668 -8.764 20.052 1.00 97.92 47 C 1 +ATOM 2076 O O . ASN C 3 47 ? 10.668 -8.566 19.365 1.00 97.37 47 C 1 +ATOM 2077 C CB . ASN C 3 47 ? 8.077 -7.744 18.264 1.00 97.15 47 C 1 +ATOM 2078 C CG . ASN C 3 47 ? 8.651 -8.234 16.954 1.00 96.66 47 C 1 +ATOM 2079 O OD1 . ASN C 3 47 ? 8.524 -9.395 16.598 1.00 92.02 47 C 1 +ATOM 2080 N ND2 . ASN C 3 47 ? 9.246 -7.353 16.176 1.00 91.81 47 C 1 +ATOM 2081 N N . GLN C 3 48 ? 9.758 -9.034 21.358 1.00 98.10 48 C 1 +ATOM 2082 C CA . GLN C 3 48 ? 10.999 -9.091 22.134 1.00 98.10 48 C 1 +ATOM 2083 C C . GLN C 3 48 ? 11.141 -10.446 22.832 1.00 98.14 48 C 1 +ATOM 2084 O O . GLN C 3 48 ? 10.159 -11.031 23.290 1.00 97.69 48 C 1 +ATOM 2085 C CB . GLN C 3 48 ? 11.028 -7.947 23.161 1.00 97.65 48 C 1 +ATOM 2086 C CG . GLN C 3 48 ? 11.003 -6.567 22.490 1.00 96.36 48 C 1 +ATOM 2087 C CD . GLN C 3 48 ? 10.962 -5.396 23.472 1.00 94.85 48 C 1 +ATOM 2088 O OE1 . GLN C 3 48 ? 10.617 -5.500 24.637 1.00 86.85 48 C 1 +ATOM 2089 N NE2 . GLN C 3 48 ? 11.318 -4.216 23.022 1.00 82.87 48 C 1 +ATOM 2090 N N . LEU C 3 49 ? 12.376 -10.933 22.960 1.00 98.31 49 C 1 +ATOM 2091 C CA . LEU C 3 49 ? 12.676 -12.103 23.783 1.00 98.42 49 C 1 +ATOM 2092 C C . LEU C 3 49 ? 12.858 -11.676 25.240 1.00 98.38 49 C 1 +ATOM 2093 O O . LEU C 3 49 ? 13.623 -10.756 25.525 1.00 98.01 49 C 1 +ATOM 2094 C CB . LEU C 3 49 ? 13.911 -12.844 23.249 1.00 98.41 49 C 1 +ATOM 2095 C CG . LEU C 3 49 ? 13.721 -13.498 21.867 1.00 97.97 49 C 1 +ATOM 2096 C CD1 . LEU C 3 49 ? 15.032 -14.146 21.422 1.00 96.44 49 C 1 +ATOM 2097 C CD2 . LEU C 3 49 ? 12.642 -14.584 21.877 1.00 96.32 49 C 1 +ATOM 2098 N N . VAL C 3 50 ? 12.173 -12.364 26.157 1.00 98.14 50 C 1 +ATOM 2099 C CA . VAL C 3 50 ? 12.254 -12.133 27.602 1.00 98.12 50 C 1 +ATOM 2100 C C . VAL C 3 50 ? 13.127 -13.209 28.231 1.00 98.19 50 C 1 +ATOM 2101 O O . VAL C 3 50 ? 12.865 -14.403 28.084 1.00 97.81 50 C 1 +ATOM 2102 C CB . VAL C 3 50 ? 10.864 -12.081 28.258 1.00 97.70 50 C 1 +ATOM 2103 C CG1 . VAL C 3 50 ? 10.974 -11.636 29.722 1.00 95.42 50 C 1 +ATOM 2104 C CG2 . VAL C 3 50 ? 9.925 -11.107 27.536 1.00 94.69 50 C 1 +ATOM 2105 N N . VAL C 3 51 ? 14.166 -12.780 28.949 1.00 97.99 51 C 1 +ATOM 2106 C CA . VAL C 3 51 ? 15.157 -13.657 29.584 1.00 98.06 51 C 1 +ATOM 2107 C C . VAL C 3 51 ? 14.591 -14.231 30.891 1.00 98.12 51 C 1 +ATOM 2108 O O . VAL C 3 51 ? 14.169 -13.471 31.761 1.00 97.67 51 C 1 +ATOM 2109 C CB . VAL C 3 51 ? 16.462 -12.877 29.829 1.00 97.63 51 C 1 +ATOM 2110 C CG1 . VAL C 3 51 ? 17.523 -13.741 30.509 1.00 95.35 51 C 1 +ATOM 2111 C CG2 . VAL C 3 51 ? 17.057 -12.364 28.507 1.00 94.17 51 C 1 +ATOM 2112 N N . PRO C 3 52 ? 14.590 -15.567 31.085 1.00 98.03 52 C 1 +ATOM 2113 C CA . PRO C 3 52 ? 13.946 -16.174 32.254 1.00 97.96 52 C 1 +ATOM 2114 C C . PRO C 3 52 ? 14.818 -16.198 33.513 1.00 97.84 52 C 1 +ATOM 2115 O O . PRO C 3 52 ? 14.299 -16.287 34.629 1.00 96.90 52 C 1 +ATOM 2116 C CB . PRO C 3 52 ? 13.592 -17.586 31.794 1.00 97.62 52 C 1 +ATOM 2117 C CG . PRO C 3 52 ? 14.699 -17.915 30.792 1.00 97.19 52 C 1 +ATOM 2118 C CD . PRO C 3 52 ? 14.958 -16.577 30.110 1.00 97.83 52 C 1 +ATOM 2119 N N . SER C 3 53 ? 16.142 -16.163 33.355 1.00 97.69 53 C 1 +ATOM 2120 C CA . SER C 3 53 ? 17.103 -16.285 34.449 1.00 97.47 53 C 1 +ATOM 2121 C C . SER C 3 53 ? 18.389 -15.524 34.156 1.00 97.61 53 C 1 +ATOM 2122 O O . SER C 3 53 ? 18.784 -15.383 33.001 1.00 96.90 53 C 1 +ATOM 2123 C CB . SER C 3 53 ? 17.420 -17.762 34.719 1.00 96.27 53 C 1 +ATOM 2124 O OG . SER C 3 53 ? 17.885 -18.410 33.555 1.00 86.86 53 C 1 +ATOM 2125 N N . GLU C 3 54 ? 19.056 -15.084 35.207 1.00 97.55 54 C 1 +ATOM 2126 C CA . GLU C 3 54 ? 20.388 -14.496 35.110 1.00 97.43 54 C 1 +ATOM 2127 C C . GLU C 3 54 ? 21.405 -15.505 34.566 1.00 97.54 54 C 1 +ATOM 2128 O O . GLU C 3 54 ? 21.356 -16.696 34.891 1.00 96.40 54 C 1 +ATOM 2129 C CB . GLU C 3 54 ? 20.795 -13.993 36.500 1.00 96.20 54 C 1 +ATOM 2130 C CG . GLU C 3 54 ? 22.077 -13.157 36.488 1.00 91.32 54 C 1 +ATOM 2131 C CD . GLU C 3 54 ? 22.530 -12.730 37.894 1.00 87.36 54 C 1 +ATOM 2132 O OE1 . GLU C 3 54 ? 23.694 -12.286 37.997 1.00 80.69 54 C 1 +ATOM 2133 O OE2 . GLU C 3 54 ? 21.729 -12.882 38.848 1.00 80.95 54 C 1 +ATOM 2134 N N . GLY C 3 55 ? 22.334 -15.033 33.750 1.00 97.69 55 C 1 +ATOM 2135 C CA . GLY C 3 55 ? 23.431 -15.840 33.246 1.00 97.69 55 C 1 +ATOM 2136 C C . GLY C 3 55 ? 24.097 -15.275 32.002 1.00 97.96 55 C 1 +ATOM 2137 O O . GLY C 3 55 ? 23.723 -14.225 31.470 1.00 97.41 55 C 1 +ATOM 2138 N N . LEU C 3 56 ? 25.095 -16.003 31.524 1.00 98.23 56 C 1 +ATOM 2139 C CA . LEU C 3 56 ? 25.717 -15.729 30.234 1.00 98.35 56 C 1 +ATOM 2140 C C . LEU C 3 56 ? 24.860 -16.309 29.110 1.00 98.43 56 C 1 +ATOM 2141 O O . LEU C 3 56 ? 24.494 -17.485 29.139 1.00 97.80 56 C 1 +ATOM 2142 C CB . LEU C 3 56 ? 27.143 -16.299 30.197 1.00 97.88 56 C 1 +ATOM 2143 C CG . LEU C 3 56 ? 28.167 -15.484 31.006 1.00 91.62 56 C 1 +ATOM 2144 C CD1 . LEU C 3 56 ? 29.475 -16.267 31.127 1.00 86.31 56 C 1 +ATOM 2145 C CD2 . LEU C 3 56 ? 28.490 -14.146 30.341 1.00 86.36 56 C 1 +ATOM 2146 N N . TYR C 3 57 ? 24.593 -15.508 28.103 1.00 98.54 57 C 1 +ATOM 2147 C CA . TYR C 3 57 ? 23.853 -15.902 26.910 1.00 98.61 57 C 1 +ATOM 2148 C C . TYR C 3 57 ? 24.658 -15.583 25.655 1.00 98.65 57 C 1 +ATOM 2149 O O . TYR C 3 57 ? 25.179 -14.473 25.502 1.00 98.34 57 C 1 +ATOM 2150 C CB . TYR C 3 57 ? 22.491 -15.200 26.869 1.00 98.50 57 C 1 +ATOM 2151 C CG . TYR C 3 57 ? 21.502 -15.690 27.904 1.00 98.47 57 C 1 +ATOM 2152 C CD1 . TYR C 3 57 ? 20.494 -16.607 27.552 1.00 96.58 57 C 1 +ATOM 2153 C CD2 . TYR C 3 57 ? 21.579 -15.239 29.233 1.00 96.73 57 C 1 +ATOM 2154 C CE1 . TYR C 3 57 ? 19.579 -17.074 28.506 1.00 96.89 57 C 1 +ATOM 2155 C CE2 . TYR C 3 57 ? 20.676 -15.705 30.205 1.00 96.73 57 C 1 +ATOM 2156 C CZ . TYR C 3 57 ? 19.675 -16.624 29.834 1.00 97.89 57 C 1 +ATOM 2157 O OH . TYR C 3 57 ? 18.795 -17.087 30.781 1.00 97.09 57 C 1 +ATOM 2158 N N . LEU C 3 58 ? 24.718 -16.542 24.733 1.00 98.67 58 C 1 +ATOM 2159 C CA . LEU C 3 58 ? 25.011 -16.238 23.341 1.00 98.68 58 C 1 +ATOM 2160 C C . LEU C 3 58 ? 23.755 -15.626 22.716 1.00 98.68 58 C 1 +ATOM 2161 O O . LEU C 3 58 ? 22.712 -16.271 22.685 1.00 98.33 58 C 1 +ATOM 2162 C CB . LEU C 3 58 ? 25.448 -17.522 22.617 1.00 98.48 58 C 1 +ATOM 2163 C CG . LEU C 3 58 ? 25.651 -17.352 21.098 1.00 96.75 58 C 1 +ATOM 2164 C CD1 . LEU C 3 58 ? 26.804 -16.402 20.772 1.00 91.87 58 C 1 +ATOM 2165 C CD2 . LEU C 3 58 ? 25.961 -18.706 20.467 1.00 91.68 58 C 1 +ATOM 2166 N N . ILE C 3 59 ? 23.861 -14.406 22.219 1.00 98.79 59 C 1 +ATOM 2167 C CA . ILE C 3 59 ? 22.825 -13.726 21.445 1.00 98.81 59 C 1 +ATOM 2168 C C . ILE C 3 59 ? 23.281 -13.715 19.995 1.00 98.80 59 C 1 +ATOM 2169 O O . ILE C 3 59 ? 24.429 -13.359 19.720 1.00 98.49 59 C 1 +ATOM 2170 C CB . ILE C 3 59 ? 22.575 -12.297 21.964 1.00 98.67 59 C 1 +ATOM 2171 C CG1 . ILE C 3 59 ? 22.344 -12.284 23.493 1.00 97.64 59 C 1 +ATOM 2172 C CG2 . ILE C 3 59 ? 21.388 -11.680 21.211 1.00 97.46 59 C 1 +ATOM 2173 C CD1 . ILE C 3 59 ? 22.097 -10.886 24.075 1.00 96.60 59 C 1 +ATOM 2174 N N . TYR C 3 60 ? 22.399 -14.081 19.075 1.00 98.71 60 C 1 +ATOM 2175 C CA . TYR C 3 60 ? 22.695 -14.056 17.650 1.00 98.61 60 C 1 +ATOM 2176 C C . TYR C 3 60 ? 21.470 -13.647 16.833 1.00 98.54 60 C 1 +ATOM 2177 O O . TYR C 3 60 ? 20.330 -13.874 17.227 1.00 98.24 60 C 1 +ATOM 2178 C CB . TYR C 3 60 ? 23.248 -15.417 17.203 1.00 98.39 60 C 1 +ATOM 2179 C CG . TYR C 3 60 ? 22.245 -16.550 17.278 1.00 98.32 60 C 1 +ATOM 2180 C CD1 . TYR C 3 60 ? 22.057 -17.263 18.486 1.00 97.98 60 C 1 +ATOM 2181 C CD2 . TYR C 3 60 ? 21.468 -16.886 16.156 1.00 97.80 60 C 1 +ATOM 2182 C CE1 . TYR C 3 60 ? 21.107 -18.287 18.570 1.00 97.41 60 C 1 +ATOM 2183 C CE2 . TYR C 3 60 ? 20.509 -17.909 16.229 1.00 97.22 60 C 1 +ATOM 2184 C CZ . TYR C 3 60 ? 20.331 -18.606 17.438 1.00 97.28 60 C 1 +ATOM 2185 O OH . TYR C 3 60 ? 19.387 -19.601 17.515 1.00 96.07 60 C 1 +ATOM 2186 N N . SER C 3 61 ? 21.711 -13.051 15.680 1.00 98.46 61 C 1 +ATOM 2187 C CA . SER C 3 61 ? 20.665 -12.740 14.714 1.00 98.38 61 C 1 +ATOM 2188 C C . SER C 3 61 ? 21.253 -12.631 13.318 1.00 98.32 61 C 1 +ATOM 2189 O O . SER C 3 61 ? 22.379 -12.162 13.150 1.00 97.81 61 C 1 +ATOM 2190 C CB . SER C 3 61 ? 19.961 -11.440 15.096 1.00 97.92 61 C 1 +ATOM 2191 O OG . SER C 3 61 ? 18.890 -11.171 14.220 1.00 93.58 61 C 1 +ATOM 2192 N N . GLN C 3 62 ? 20.481 -13.036 12.331 1.00 97.94 62 C 1 +ATOM 2193 C CA . GLN C 3 62 ? 20.766 -12.761 10.932 1.00 97.46 62 C 1 +ATOM 2194 C C . GLN C 3 62 ? 19.553 -12.131 10.271 1.00 97.24 62 C 1 +ATOM 2195 O O . GLN C 3 62 ? 18.420 -12.562 10.479 1.00 96.55 62 C 1 +ATOM 2196 C CB . GLN C 3 62 ? 21.202 -14.036 10.207 1.00 96.54 62 C 1 +ATOM 2197 C CG . GLN C 3 62 ? 21.659 -13.768 8.768 1.00 94.60 62 C 1 +ATOM 2198 C CD . GLN C 3 62 ? 22.175 -15.038 8.097 1.00 92.36 62 C 1 +ATOM 2199 O OE1 . GLN C 3 62 ? 23.259 -15.510 8.381 1.00 85.08 62 C 1 +ATOM 2200 N NE2 . GLN C 3 62 ? 21.418 -15.629 7.210 1.00 81.90 62 C 1 +ATOM 2201 N N . VAL C 3 63 ? 19.814 -11.148 9.438 1.00 97.08 63 C 1 +ATOM 2202 C CA . VAL C 3 63 ? 18.853 -10.640 8.463 1.00 97.05 63 C 1 +ATOM 2203 C C . VAL C 3 63 ? 19.480 -10.713 7.081 1.00 96.84 63 C 1 +ATOM 2204 O O . VAL C 3 63 ? 20.689 -10.527 6.935 1.00 96.17 63 C 1 +ATOM 2205 C CB . VAL C 3 63 ? 18.369 -9.221 8.800 1.00 96.74 63 C 1 +ATOM 2206 C CG1 . VAL C 3 63 ? 17.656 -9.202 10.161 1.00 94.80 63 C 1 +ATOM 2207 C CG2 . VAL C 3 63 ? 19.495 -8.184 8.830 1.00 94.10 63 C 1 +ATOM 2208 N N . LEU C 3 64 ? 18.667 -10.987 6.067 1.00 95.75 64 C 1 +ATOM 2209 C CA . LEU C 3 64 ? 19.067 -10.903 4.671 1.00 94.81 64 C 1 +ATOM 2210 C C . LEU C 3 64 ? 18.268 -9.789 4.011 1.00 94.17 64 C 1 +ATOM 2211 O O . LEU C 3 64 ? 17.041 -9.840 3.957 1.00 92.96 64 C 1 +ATOM 2212 C CB . LEU C 3 64 ? 18.864 -12.261 3.987 1.00 93.80 64 C 1 +ATOM 2213 C CG . LEU C 3 64 ? 19.278 -12.269 2.503 1.00 91.99 64 C 1 +ATOM 2214 C CD1 . LEU C 3 64 ? 20.770 -12.008 2.316 1.00 88.62 64 C 1 +ATOM 2215 C CD2 . LEU C 3 64 ? 18.963 -13.623 1.887 1.00 87.62 64 C 1 +ATOM 2216 N N . PHE C 3 65 ? 18.967 -8.793 3.507 1.00 93.30 65 C 1 +ATOM 2217 C CA . PHE C 3 65 ? 18.378 -7.768 2.671 1.00 93.12 65 C 1 +ATOM 2218 C C . PHE C 3 65 ? 18.533 -8.145 1.203 1.00 92.11 65 C 1 +ATOM 2219 O O . PHE C 3 65 ? 19.564 -8.660 0.782 1.00 91.17 65 C 1 +ATOM 2220 C CB . PHE C 3 65 ? 19.007 -6.415 2.971 1.00 93.90 65 C 1 +ATOM 2221 C CG . PHE C 3 65 ? 18.801 -5.939 4.390 1.00 94.25 65 C 1 +ATOM 2222 C CD1 . PHE C 3 65 ? 17.580 -5.355 4.765 1.00 93.32 65 C 1 +ATOM 2223 C CD2 . PHE C 3 65 ? 19.837 -6.045 5.332 1.00 93.68 65 C 1 +ATOM 2224 C CE1 . PHE C 3 65 ? 17.400 -4.856 6.064 1.00 93.48 65 C 1 +ATOM 2225 C CE2 . PHE C 3 65 ? 19.663 -5.549 6.631 1.00 93.51 65 C 1 +ATOM 2226 C CZ . PHE C 3 65 ? 18.447 -4.947 6.996 1.00 94.35 65 C 1 +ATOM 2227 N N . LYS C 3 66 ? 17.494 -7.858 0.348 1.00 86.47 66 C 1 +ATOM 2228 C CA . LYS C 3 66 ? 17.462 -7.952 -1.073 1.00 84.30 66 C 1 +ATOM 2229 C C . LYS C 3 66 ? 16.888 -6.716 -1.644 1.00 83.27 66 C 1 +ATOM 2230 O O . LYS C 3 66 ? 15.856 -6.280 -1.266 1.00 80.68 66 C 1 +ATOM 2231 C CB . LYS C 3 66 ? 16.690 -9.197 -1.515 1.00 81.31 66 C 1 +ATOM 2232 C CG . LYS C 3 66 ? 16.679 -9.390 -2.960 1.00 78.22 66 C 1 +ATOM 2233 C CD . LYS C 3 66 ? 15.927 -10.564 -3.290 1.00 77.27 66 C 1 +ATOM 2234 C CE . LYS C 3 66 ? 15.926 -10.643 -4.756 1.00 75.93 66 C 1 +ATOM 2235 N NZ . LYS C 3 66 ? 15.168 -11.172 -5.197 1.00 73.35 66 C 1 +ATOM 2236 N N . GLY C 3 67 ? 17.561 -6.139 -2.565 1.00 81.31 67 C 1 +ATOM 2237 C CA . GLY C 3 67 ? 17.049 -5.033 -3.359 1.00 80.03 67 C 1 +ATOM 2238 C C . GLY C 3 67 ? 17.147 -5.335 -4.844 1.00 80.66 67 C 1 +ATOM 2239 O O . GLY C 3 67 ? 17.864 -6.240 -5.274 1.00 80.24 67 C 1 +ATOM 2240 N N . GLN C 3 68 ? 16.435 -4.556 -5.629 1.00 76.58 68 C 1 +ATOM 2241 C CA . GLN C 3 68 ? 16.502 -4.605 -7.080 1.00 74.10 68 C 1 +ATOM 2242 C C . GLN C 3 68 ? 16.854 -3.216 -7.599 1.00 74.59 68 C 1 +ATOM 2243 O O . GLN C 3 68 ? 16.058 -2.287 -7.498 1.00 72.44 68 C 1 +ATOM 2244 C CB . GLN C 3 68 ? 15.186 -5.167 -7.617 1.00 70.18 68 C 1 +ATOM 2245 C CG . GLN C 3 68 ? 15.337 -5.609 -9.073 1.00 62.82 68 C 1 +ATOM 2246 C CD . GLN C 3 68 ? 14.157 -6.448 -9.544 1.00 60.84 68 C 1 +ATOM 2247 O OE1 . GLN C 3 68 ? 13.137 -6.578 -8.908 1.00 55.18 68 C 1 +ATOM 2248 N NE2 . GLN C 3 68 ? 14.274 -7.080 -10.683 1.00 53.03 68 C 1 +ATOM 2249 N N . GLY C 3 69 ? 18.064 -3.084 -8.107 1.00 74.90 69 C 1 +ATOM 2250 C CA . GLY C 3 69 ? 18.644 -1.790 -8.421 1.00 75.31 69 C 1 +ATOM 2251 C C . GLY C 3 69 ? 18.982 -0.961 -7.184 1.00 78.07 69 C 1 +ATOM 2252 O O . GLY C 3 69 ? 18.919 -1.421 -6.046 1.00 77.61 69 C 1 +ATOM 2253 N N . CYS C 3 70 ? 19.385 0.269 -7.443 1.00 78.90 70 C 1 +ATOM 2254 C CA . CYS C 3 70 ? 19.797 1.232 -6.439 1.00 81.17 70 C 1 +ATOM 2255 C C . CYS C 3 70 ? 19.083 2.561 -6.696 1.00 80.18 70 C 1 +ATOM 2256 O O . CYS C 3 70 ? 19.467 3.287 -7.612 1.00 77.77 70 C 1 +ATOM 2257 C CB . CYS C 3 70 ? 21.319 1.360 -6.495 1.00 82.86 70 C 1 +ATOM 2258 S SG . CYS C 3 70 ? 22.142 -0.015 -5.634 1.00 82.85 70 C 1 +ATOM 2259 N N . PRO C 3 71 ? 18.054 2.888 -5.881 1.00 75.34 71 C 1 +ATOM 2260 C CA . PRO C 3 71 ? 17.298 4.130 -6.052 1.00 73.27 71 C 1 +ATOM 2261 C C . PRO C 3 71 ? 18.123 5.371 -5.713 1.00 75.05 71 C 1 +ATOM 2262 O O . PRO C 3 71 ? 17.829 6.465 -6.176 1.00 73.01 71 C 1 +ATOM 2263 C CB . PRO C 3 71 ? 16.094 3.982 -5.118 1.00 70.35 71 C 1 +ATOM 2264 C CG . PRO C 3 71 ? 16.614 3.071 -4.011 1.00 69.14 71 C 1 +ATOM 2265 C CD . PRO C 3 71 ? 17.551 2.128 -4.756 1.00 71.17 71 C 1 +ATOM 2266 N N . SER C 3 72 ? 19.135 5.204 -4.876 1.00 75.70 72 C 1 +ATOM 2267 C CA . SER C 3 72 ? 20.139 6.218 -4.570 1.00 78.03 72 C 1 +ATOM 2268 C C . SER C 3 72 ? 21.397 5.552 -4.009 1.00 80.94 72 C 1 +ATOM 2269 O O . SER C 3 72 ? 21.391 4.377 -3.641 1.00 79.79 72 C 1 +ATOM 2270 C CB . SER C 3 72 ? 19.575 7.239 -3.566 1.00 74.85 72 C 1 +ATOM 2271 O OG . SER C 3 72 ? 19.455 6.674 -2.273 1.00 68.78 72 C 1 +ATOM 2272 N N . THR C 3 73 ? 22.462 6.308 -3.875 1.00 80.42 73 C 1 +ATOM 2273 C CA . THR C 3 73 ? 23.681 5.881 -3.164 1.00 82.34 73 C 1 +ATOM 2274 C C . THR C 3 73 ? 23.529 5.897 -1.638 1.00 83.74 73 C 1 +ATOM 2275 O O . THR C 3 73 ? 24.391 5.394 -0.925 1.00 80.38 73 C 1 +ATOM 2276 C CB . THR C 3 73 ? 24.869 6.764 -3.565 1.00 80.21 73 C 1 +ATOM 2277 O OG1 . THR C 3 73 ? 24.549 8.123 -3.359 1.00 75.54 73 C 1 +ATOM 2278 C CG2 . THR C 3 73 ? 25.229 6.599 -5.039 1.00 73.53 73 C 1 +ATOM 2279 N N . HIS C 3 74 ? 22.434 6.448 -1.120 1.00 84.87 74 C 1 +ATOM 2280 C CA . HIS C 3 74 ? 22.189 6.646 0.310 1.00 85.98 74 C 1 +ATOM 2281 C C . HIS C 3 74 ? 21.338 5.540 0.949 1.00 87.72 74 C 1 +ATOM 2282 O O . HIS C 3 74 ? 20.776 5.724 2.028 1.00 84.28 74 C 1 +ATOM 2283 C CB . HIS C 3 74 ? 21.600 8.042 0.543 1.00 82.19 74 C 1 +ATOM 2284 C CG . HIS C 3 74 ? 22.503 9.142 0.057 1.00 76.03 74 C 1 +ATOM 2285 N ND1 . HIS C 3 74 ? 23.769 9.410 0.527 1.00 65.95 74 C 1 +ATOM 2286 C CD2 . HIS C 3 74 ? 22.246 10.041 -0.943 1.00 64.97 74 C 1 +ATOM 2287 C CE1 . HIS C 3 74 ? 24.262 10.447 -0.171 1.00 60.91 74 C 1 +ATOM 2288 N NE2 . HIS C 3 74 ? 23.364 10.857 -1.070 1.00 61.76 74 C 1 +ATOM 2289 N N . VAL C 3 75 ? 21.239 4.372 0.309 1.00 85.97 75 C 1 +ATOM 2290 C CA . VAL C 3 75 ? 20.598 3.210 0.925 1.00 86.66 75 C 1 +ATOM 2291 C C . VAL C 3 75 ? 21.493 2.704 2.052 1.00 89.20 75 C 1 +ATOM 2292 O O . VAL C 3 75 ? 22.531 2.087 1.820 1.00 89.28 75 C 1 +ATOM 2293 C CB . VAL C 3 75 ? 20.280 2.105 -0.096 1.00 83.39 75 C 1 +ATOM 2294 C CG1 . VAL C 3 75 ? 19.605 0.913 0.583 1.00 76.99 75 C 1 +ATOM 2295 C CG2 . VAL C 3 75 ? 19.325 2.623 -1.177 1.00 77.12 75 C 1 +ATOM 2296 N N . LEU C 3 76 ? 21.072 2.965 3.287 1.00 92.80 76 C 1 +ATOM 2297 C CA . LEU C 3 76 ? 21.704 2.471 4.502 1.00 93.73 76 C 1 +ATOM 2298 C C . LEU C 3 76 ? 20.832 1.379 5.111 1.00 94.19 76 C 1 +ATOM 2299 O O . LEU C 3 76 ? 19.667 1.617 5.440 1.00 92.86 76 C 1 +ATOM 2300 C CB . LEU C 3 76 ? 21.926 3.624 5.494 1.00 92.46 76 C 1 +ATOM 2301 C CG . LEU C 3 76 ? 22.968 4.662 5.030 1.00 83.80 76 C 1 +ATOM 2302 C CD1 . LEU C 3 76 ? 22.990 5.832 6.008 1.00 77.16 76 C 1 +ATOM 2303 C CD2 . LEU C 3 76 ? 24.379 4.067 4.972 1.00 76.84 76 C 1 +ATOM 2304 N N . LEU C 3 77 ? 21.405 0.204 5.289 1.00 95.87 77 C 1 +ATOM 2305 C CA . LEU C 3 77 ? 20.782 -0.928 5.958 1.00 96.23 77 C 1 +ATOM 2306 C C . LEU C 3 77 ? 21.408 -1.070 7.337 1.00 97.11 77 C 1 +ATOM 2307 O O . LEU C 3 77 ? 22.630 -1.160 7.457 1.00 96.93 77 C 1 +ATOM 2308 C CB . LEU C 3 77 ? 20.983 -2.200 5.129 1.00 95.22 77 C 1 +ATOM 2309 C CG . LEU C 3 77 ? 20.522 -2.094 3.669 1.00 93.74 77 C 1 +ATOM 2310 C CD1 . LEU C 3 77 ? 20.939 -3.357 2.929 1.00 91.65 77 C 1 +ATOM 2311 C CD2 . LEU C 3 77 ? 19.006 -1.916 3.560 1.00 91.00 77 C 1 +ATOM 2312 N N . THR C 3 78 ? 20.582 -1.106 8.371 1.00 97.39 78 C 1 +ATOM 2313 C CA . THR C 3 78 ? 21.051 -1.299 9.744 1.00 97.69 78 C 1 +ATOM 2314 C C . THR C 3 78 ? 20.371 -2.495 10.375 1.00 97.77 78 C 1 +ATOM 2315 O O . THR C 3 78 ? 19.167 -2.698 10.206 1.00 97.48 78 C 1 +ATOM 2316 C CB . THR C 3 78 ? 20.889 -0.052 10.624 1.00 97.35 78 C 1 +ATOM 2317 O OG1 . THR C 3 78 ? 19.542 0.205 10.934 1.00 90.88 78 C 1 +ATOM 2318 C CG2 . THR C 3 78 ? 21.449 1.212 9.977 1.00 89.57 78 C 1 +ATOM 2319 N N . HIS C 3 79 ? 21.130 -3.255 11.141 1.00 98.18 79 C 1 +ATOM 2320 C CA . HIS C 3 79 ? 20.620 -4.289 12.024 1.00 98.45 79 C 1 +ATOM 2321 C C . HIS C 3 79 ? 21.177 -4.064 13.420 1.00 98.51 79 C 1 +ATOM 2322 O O . HIS C 3 79 ? 22.370 -3.815 13.579 1.00 98.35 79 C 1 +ATOM 2323 C CB . HIS C 3 79 ? 20.965 -5.671 11.470 1.00 98.40 79 C 1 +ATOM 2324 C CG . HIS C 3 79 ? 20.318 -6.792 12.241 1.00 98.40 79 C 1 +ATOM 2325 N ND1 . HIS C 3 79 ? 19.082 -6.743 12.867 1.00 93.84 79 C 1 +ATOM 2326 C CD2 . HIS C 3 79 ? 20.838 -8.044 12.438 1.00 94.85 79 C 1 +ATOM 2327 C CE1 . HIS C 3 79 ? 18.871 -7.942 13.424 1.00 96.27 79 C 1 +ATOM 2328 N NE2 . HIS C 3 79 ? 19.907 -8.754 13.176 1.00 96.56 79 C 1 +ATOM 2329 N N . THR C 3 80 ? 20.313 -4.109 14.433 1.00 98.59 80 C 1 +ATOM 2330 C CA . THR C 3 80 ? 20.672 -3.799 15.815 1.00 98.59 80 C 1 +ATOM 2331 C C . THR C 3 80 ? 19.974 -4.753 16.769 1.00 98.62 80 C 1 +ATOM 2332 O O . THR C 3 80 ? 18.759 -4.908 16.720 1.00 98.21 80 C 1 +ATOM 2333 C CB . THR C 3 80 ? 20.315 -2.346 16.164 1.00 98.13 80 C 1 +ATOM 2334 O OG1 . THR C 3 80 ? 20.934 -1.458 15.258 1.00 84.94 80 C 1 +ATOM 2335 C CG2 . THR C 3 80 ? 20.803 -1.943 17.552 1.00 82.94 80 C 1 +ATOM 2336 N N . ILE C 3 81 ? 20.744 -5.353 17.673 1.00 98.70 81 C 1 +ATOM 2337 C CA . ILE C 3 81 ? 20.227 -6.059 18.844 1.00 98.72 81 C 1 +ATOM 2338 C C . ILE C 3 81 ? 20.380 -5.133 20.042 1.00 98.66 81 C 1 +ATOM 2339 O O . ILE C 3 81 ? 21.476 -4.640 20.321 1.00 98.36 81 C 1 +ATOM 2340 C CB . ILE C 3 81 ? 20.917 -7.414 19.065 1.00 98.66 81 C 1 +ATOM 2341 C CG1 . ILE C 3 81 ? 20.718 -8.325 17.837 1.00 97.95 81 C 1 +ATOM 2342 C CG2 . ILE C 3 81 ? 20.365 -8.085 20.339 1.00 97.87 81 C 1 +ATOM 2343 C CD1 . ILE C 3 81 ? 21.490 -9.646 17.909 1.00 95.87 81 C 1 +ATOM 2344 N N . SER C 3 82 ? 19.284 -4.916 20.760 1.00 98.49 82 C 1 +ATOM 2345 C CA . SER C 3 82 ? 19.242 -4.048 21.933 1.00 98.35 82 C 1 +ATOM 2346 C C . SER C 3 82 ? 18.745 -4.804 23.157 1.00 98.39 82 C 1 +ATOM 2347 O O . SER C 3 82 ? 17.892 -5.686 23.050 1.00 97.97 82 C 1 +ATOM 2348 C CB . SER C 3 82 ? 18.351 -2.829 21.689 1.00 97.62 82 C 1 +ATOM 2349 O OG . SER C 3 82 ? 18.668 -2.176 20.471 1.00 87.23 82 C 1 +ATOM 2350 N N . ARG C 3 83 ? 19.245 -4.421 24.329 1.00 98.14 83 C 1 +ATOM 2351 C CA . ARG C 3 83 ? 18.782 -4.858 25.647 1.00 98.07 83 C 1 +ATOM 2352 C C . ARG C 3 83 ? 18.005 -3.732 26.316 1.00 98.01 83 C 1 +ATOM 2353 O O . ARG C 3 83 ? 18.466 -2.591 26.341 1.00 97.25 83 C 1 +ATOM 2354 C CB . ARG C 3 83 ? 19.999 -5.296 26.482 1.00 97.46 83 C 1 +ATOM 2355 C CG . ARG C 3 83 ? 19.664 -5.713 27.926 1.00 95.90 83 C 1 +ATOM 2356 C CD . ARG C 3 83 ? 20.946 -6.078 28.686 1.00 93.21 83 C 1 +ATOM 2357 N NE . ARG C 3 83 ? 20.685 -6.416 30.091 1.00 88.70 83 C 1 +ATOM 2358 C CZ . ARG C 3 83 ? 21.531 -6.383 31.114 1.00 87.06 83 C 1 +ATOM 2359 N NH1 . ARG C 3 83 ? 22.769 -6.018 30.981 1.00 79.79 83 C 1 +ATOM 2360 N NH2 . ARG C 3 83 ? 21.144 -6.720 32.297 1.00 82.21 83 C 1 +ATOM 2361 N N . ILE C 3 84 ? 16.862 -4.068 26.913 1.00 97.41 84 C 1 +ATOM 2362 C CA . ILE C 3 84 ? 16.138 -3.221 27.856 1.00 97.03 84 C 1 +ATOM 2363 C C . ILE C 3 84 ? 16.213 -3.919 29.210 1.00 96.73 84 C 1 +ATOM 2364 O O . ILE C 3 84 ? 15.517 -4.911 29.439 1.00 95.30 84 C 1 +ATOM 2365 C CB . ILE C 3 84 ? 14.691 -2.956 27.402 1.00 96.06 84 C 1 +ATOM 2366 C CG1 . ILE C 3 84 ? 14.647 -2.333 25.985 1.00 88.58 84 C 1 +ATOM 2367 C CG2 . ILE C 3 84 ? 14.002 -2.029 28.422 1.00 86.28 84 C 1 +ATOM 2368 C CD1 . ILE C 3 84 ? 13.237 -2.254 25.384 1.00 76.41 84 C 1 +ATOM 2369 N N . ALA C 3 85 ? 17.085 -3.417 30.090 1.00 94.72 85 C 1 +ATOM 2370 C CA . ALA C 3 85 ? 17.233 -3.940 31.440 1.00 93.23 85 C 1 +ATOM 2371 C C . ALA C 3 85 ? 16.004 -3.591 32.291 1.00 92.79 85 C 1 +ATOM 2372 O O . ALA C 3 85 ? 15.479 -2.479 32.211 1.00 89.43 85 C 1 +ATOM 2373 C CB . ALA C 3 85 ? 18.524 -3.393 32.050 1.00 90.22 85 C 1 +ATOM 2374 N N . VAL C 3 86 ? 15.571 -4.529 33.134 1.00 90.42 86 C 1 +ATOM 2375 C CA . VAL C 3 86 ? 14.410 -4.337 34.029 1.00 89.07 86 C 1 +ATOM 2376 C C . VAL C 3 86 ? 14.609 -3.147 34.964 1.00 88.39 86 C 1 +ATOM 2377 O O . VAL C 3 86 ? 13.671 -2.385 35.204 1.00 81.86 86 C 1 +ATOM 2378 C CB . VAL C 3 86 ? 14.159 -5.609 34.858 1.00 86.05 86 C 1 +ATOM 2379 C CG1 . VAL C 3 86 ? 12.985 -5.464 35.833 1.00 72.86 86 C 1 +ATOM 2380 C CG2 . VAL C 3 86 ? 13.836 -6.780 33.944 1.00 74.85 86 C 1 +ATOM 2381 N N . SER C 3 87 ? 15.825 -2.987 35.484 1.00 87.98 87 C 1 +ATOM 2382 C CA . SER C 3 87 ? 16.179 -1.967 36.473 1.00 86.92 87 C 1 +ATOM 2383 C C . SER C 3 87 ? 16.120 -0.536 35.927 1.00 86.91 87 C 1 +ATOM 2384 O O . SER C 3 87 ? 15.620 0.360 36.606 1.00 81.69 87 C 1 +ATOM 2385 C CB . SER C 3 87 ? 17.579 -2.280 37.016 1.00 82.98 87 C 1 +ATOM 2386 O OG . SER C 3 87 ? 18.489 -2.531 35.955 1.00 73.45 87 C 1 +ATOM 2387 N N . TYR C 3 88 ? 16.585 -0.322 34.700 1.00 87.26 88 C 1 +ATOM 2388 C CA . TYR C 3 88 ? 16.698 1.027 34.120 1.00 87.44 88 C 1 +ATOM 2389 C C . TYR C 3 88 ? 15.686 1.330 33.005 1.00 89.08 88 C 1 +ATOM 2390 O O . TYR C 3 88 ? 15.563 2.490 32.603 1.00 84.19 88 C 1 +ATOM 2391 C CB . TYR C 3 88 ? 18.137 1.249 33.643 1.00 81.50 88 C 1 +ATOM 2392 C CG . TYR C 3 88 ? 19.129 1.326 34.782 1.00 74.57 88 C 1 +ATOM 2393 C CD1 . TYR C 3 88 ? 19.258 2.518 35.524 1.00 66.95 88 C 1 +ATOM 2394 C CD2 . TYR C 3 88 ? 19.909 0.210 35.138 1.00 64.92 88 C 1 +ATOM 2395 C CE1 . TYR C 3 88 ? 20.151 2.593 36.603 1.00 58.27 88 C 1 +ATOM 2396 C CE2 . TYR C 3 88 ? 20.805 0.272 36.220 1.00 57.59 88 C 1 +ATOM 2397 C CZ . TYR C 3 88 ? 20.920 1.466 36.949 1.00 55.68 88 C 1 +ATOM 2398 O OH . TYR C 3 88 ? 21.789 1.532 38.007 1.00 53.63 88 C 1 +ATOM 2399 N N . GLN C 3 89 ? 14.967 0.323 32.487 1.00 86.61 89 C 1 +ATOM 2400 C CA . GLN C 3 89 ? 14.049 0.445 31.338 1.00 89.22 89 C 1 +ATOM 2401 C C . GLN C 3 89 ? 14.659 1.159 30.106 1.00 90.45 89 C 1 +ATOM 2402 O O . GLN C 3 89 ? 13.942 1.572 29.192 1.00 85.84 89 C 1 +ATOM 2403 C CB . GLN C 3 89 ? 12.706 1.060 31.780 1.00 85.23 89 C 1 +ATOM 2404 C CG . GLN C 3 89 ? 11.923 0.159 32.753 1.00 78.53 89 C 1 +ATOM 2405 C CD . GLN C 3 89 ? 11.387 -1.121 32.091 1.00 72.78 89 C 1 +ATOM 2406 O OE1 . GLN C 3 89 ? 11.031 -1.178 30.918 1.00 65.96 89 C 1 +ATOM 2407 N NE2 . GLN C 3 89 ? 11.300 -2.203 32.832 1.00 62.84 89 C 1 +ATOM 2408 N N . THR C 3 90 ? 15.977 1.299 30.075 1.00 93.15 90 C 1 +ATOM 2409 C CA . THR C 3 90 ? 16.693 2.021 29.023 1.00 93.24 90 C 1 +ATOM 2410 C C . THR C 3 90 ? 17.135 1.043 27.944 1.00 94.52 90 C 1 +ATOM 2411 O O . THR C 3 90 ? 17.704 -0.007 28.239 1.00 92.89 90 C 1 +ATOM 2412 C CB . THR C 3 90 ? 17.891 2.794 29.585 1.00 89.52 90 C 1 +ATOM 2413 O OG1 . THR C 3 90 ? 17.488 3.576 30.685 1.00 77.01 90 C 1 +ATOM 2414 C CG2 . THR C 3 90 ? 18.471 3.764 28.557 1.00 73.26 90 C 1 +ATOM 2415 N N . LYS C 3 91 ? 16.880 1.397 26.696 1.00 95.07 91 C 1 +ATOM 2416 C CA . LYS C 3 91 ? 17.295 0.610 25.535 1.00 95.84 91 C 1 +ATOM 2417 C C . LYS C 3 91 ? 18.778 0.858 25.248 1.00 96.19 91 C 1 +ATOM 2418 O O . LYS C 3 91 ? 19.159 1.973 24.906 1.00 94.91 91 C 1 +ATOM 2419 C CB . LYS C 3 91 ? 16.384 0.953 24.354 1.00 94.31 91 C 1 +ATOM 2420 C CG . LYS C 3 91 ? 16.601 0.028 23.145 1.00 91.26 91 C 1 +ATOM 2421 C CD . LYS C 3 91 ? 15.535 0.319 22.079 1.00 88.53 91 C 1 +ATOM 2422 C CE . LYS C 3 91 ? 15.655 -0.652 20.906 1.00 81.28 91 C 1 +ATOM 2423 N NZ . LYS C 3 91 ? 14.513 -0.522 19.965 1.00 75.49 91 C 1 +ATOM 2424 N N . VAL C 3 92 ? 19.590 -0.187 25.357 1.00 96.64 92 C 1 +ATOM 2425 C CA . VAL C 3 92 ? 21.033 -0.145 25.094 1.00 96.61 92 C 1 +ATOM 2426 C C . VAL C 3 92 ? 21.357 -1.085 23.939 1.00 97.26 92 C 1 +ATOM 2427 O O . VAL C 3 92 ? 20.954 -2.245 23.952 1.00 97.00 92 C 1 +ATOM 2428 C CB . VAL C 3 92 ? 21.844 -0.500 26.352 1.00 95.22 92 C 1 +ATOM 2429 C CG1 . VAL C 3 92 ? 23.350 -0.438 26.084 1.00 89.48 92 C 1 +ATOM 2430 C CG2 . VAL C 3 92 ? 21.537 0.468 27.501 1.00 87.93 92 C 1 +ATOM 2431 N N . ASN C 3 93 ? 22.100 -0.599 22.956 1.00 97.59 93 C 1 +ATOM 2432 C CA . ASN C 3 93 ? 22.548 -1.430 21.841 1.00 97.71 93 C 1 +ATOM 2433 C C . ASN C 3 93 ? 23.659 -2.378 22.304 1.00 97.82 93 C 1 +ATOM 2434 O O . ASN C 3 93 ? 24.658 -1.931 22.863 1.00 97.07 93 C 1 +ATOM 2435 C CB . ASN C 3 93 ? 23.018 -0.541 20.679 1.00 97.03 93 C 1 +ATOM 2436 C CG . ASN C 3 93 ? 21.905 0.291 20.059 1.00 93.18 93 C 1 +ATOM 2437 O OD1 . ASN C 3 93 ? 20.733 0.163 20.360 1.00 84.89 93 C 1 +ATOM 2438 N ND2 . ASN C 3 93 ? 22.253 1.182 19.159 1.00 84.37 93 C 1 +ATOM 2439 N N . LEU C 3 94 ? 23.485 -3.668 22.060 1.00 98.25 94 C 1 +ATOM 2440 C CA . LEU C 3 94 ? 24.490 -4.694 22.347 1.00 98.25 94 C 1 +ATOM 2441 C C . LEU C 3 94 ? 25.346 -4.984 21.116 1.00 98.44 94 C 1 +ATOM 2442 O O . LEU C 3 94 ? 26.566 -5.075 21.203 1.00 97.64 94 C 1 +ATOM 2443 C CB . LEU C 3 94 ? 23.798 -5.981 22.819 1.00 97.79 94 C 1 +ATOM 2444 C CG . LEU C 3 94 ? 22.967 -5.872 24.111 1.00 96.97 94 C 1 +ATOM 2445 C CD1 . LEU C 3 94 ? 22.408 -7.255 24.449 1.00 94.85 94 C 1 +ATOM 2446 C CD2 . LEU C 3 94 ? 23.796 -5.373 25.293 1.00 94.51 94 C 1 +ATOM 2447 N N . LEU C 3 95 ? 24.690 -5.134 19.974 1.00 98.63 95 C 1 +ATOM 2448 C CA . LEU C 3 95 ? 25.312 -5.445 18.695 1.00 98.67 95 C 1 +ATOM 2449 C C . LEU C 3 95 ? 24.635 -4.609 17.614 1.00 98.71 95 C 1 +ATOM 2450 O O . LEU C 3 95 ? 23.408 -4.537 17.573 1.00 98.38 95 C 1 +ATOM 2451 C CB . LEU C 3 95 ? 25.150 -6.943 18.389 1.00 98.51 95 C 1 +ATOM 2452 C CG . LEU C 3 95 ? 25.878 -7.900 19.353 1.00 98.01 95 C 1 +ATOM 2453 C CD1 . LEU C 3 95 ? 25.385 -9.324 19.130 1.00 96.78 95 C 1 +ATOM 2454 C CD2 . LEU C 3 95 ? 27.392 -7.869 19.135 1.00 96.51 95 C 1 +ATOM 2455 N N . SER C 3 96 ? 25.416 -4.009 16.732 1.00 98.52 96 C 1 +ATOM 2456 C CA . SER C 3 96 ? 24.882 -3.288 15.580 1.00 98.36 96 C 1 +ATOM 2457 C C . SER C 3 96 ? 25.824 -3.372 14.389 1.00 98.53 96 C 1 +ATOM 2458 O O . SER C 3 96 ? 27.042 -3.458 14.544 1.00 97.94 96 C 1 +ATOM 2459 C CB . SER C 3 96 ? 24.569 -1.828 15.932 1.00 96.83 96 C 1 +ATOM 2460 O OG . SER C 3 96 ? 25.736 -1.123 16.314 1.00 80.54 96 C 1 +ATOM 2461 N N . ALA C 3 97 ? 25.248 -3.333 13.193 1.00 98.63 97 C 1 +ATOM 2462 C CA . ALA C 3 97 ? 25.987 -3.238 11.946 1.00 98.56 97 C 1 +ATOM 2463 C C . ALA C 3 97 ? 25.243 -2.351 10.946 1.00 98.52 97 C 1 +ATOM 2464 O O . ALA C 3 97 ? 24.014 -2.245 10.976 1.00 97.96 97 C 1 +ATOM 2465 C CB . ALA C 3 97 ? 26.237 -4.639 11.390 1.00 98.18 97 C 1 +ATOM 2466 N N . ILE C 3 98 ? 26.013 -1.733 10.064 1.00 97.96 98 C 1 +ATOM 2467 C CA . ILE C 3 98 ? 25.517 -0.895 8.973 1.00 97.61 98 C 1 +ATOM 2468 C C . ILE C 3 98 ? 26.114 -1.417 7.670 1.00 97.51 98 C 1 +ATOM 2469 O O . ILE C 3 98 ? 27.299 -1.749 7.611 1.00 96.62 98 C 1 +ATOM 2470 C CB . ILE C 3 98 ? 25.850 0.597 9.207 1.00 96.69 98 C 1 +ATOM 2471 C CG1 . ILE C 3 98 ? 25.296 1.081 10.570 1.00 88.72 98 C 1 +ATOM 2472 C CG2 . ILE C 3 98 ? 25.306 1.453 8.049 1.00 86.72 98 C 1 +ATOM 2473 C CD1 . ILE C 3 98 ? 25.616 2.545 10.914 1.00 81.84 98 C 1 +ATOM 2474 N N . LYS C 3 99 ? 25.287 -1.474 6.629 1.00 96.85 99 C 1 +ATOM 2475 C CA . LYS C 3 99 ? 25.677 -1.828 5.262 1.00 96.46 99 C 1 +ATOM 2476 C C . LYS C 3 99 ? 25.196 -0.760 4.288 1.00 96.27 99 C 1 +ATOM 2477 O O . LYS C 3 99 ? 24.108 -0.218 4.446 1.00 95.14 99 C 1 +ATOM 2478 C CB . LYS C 3 99 ? 25.091 -3.201 4.904 1.00 95.50 99 C 1 +ATOM 2479 C CG . LYS C 3 99 ? 25.753 -4.386 5.633 1.00 91.28 99 C 1 +ATOM 2480 C CD . LYS C 3 99 ? 27.130 -4.697 5.058 1.00 86.04 99 C 1 +ATOM 2481 C CE . LYS C 3 99 ? 27.548 -6.125 5.440 1.00 83.92 99 C 1 +ATOM 2482 N NZ . LYS C 3 99 ? 28.325 -6.758 4.345 1.00 76.92 99 C 1 +ATOM 2483 N N . SER C 3 100 ? 26.010 -0.482 3.282 1.00 95.16 100 C 1 +ATOM 2484 C CA . SER C 3 100 ? 25.688 0.433 2.186 1.00 94.52 100 C 1 +ATOM 2485 C C . SER C 3 100 ? 25.785 -0.333 0.861 1.00 94.60 100 C 1 +ATOM 2486 O O . SER C 3 100 ? 26.853 -0.347 0.251 1.00 92.82 100 C 1 +ATOM 2487 C CB . SER C 3 100 ? 26.624 1.647 2.196 1.00 92.59 100 C 1 +ATOM 2488 O OG . SER C 3 100 ? 26.520 2.349 3.415 1.00 81.80 100 C 1 +ATOM 2489 N N . PRO C 3 101 ? 24.707 -1.025 0.426 1.00 92.92 101 C 1 +ATOM 2490 C CA . PRO C 3 101 ? 24.750 -1.902 -0.747 1.00 92.24 101 C 1 +ATOM 2491 C C . PRO C 3 101 ? 24.911 -1.148 -2.066 1.00 91.87 101 C 1 +ATOM 2492 O O . PRO C 3 101 ? 25.437 -1.682 -3.038 1.00 89.31 101 C 1 +ATOM 2493 C CB . PRO C 3 101 ? 23.423 -2.669 -0.702 1.00 90.95 101 C 1 +ATOM 2494 C CG . PRO C 3 101 ? 22.479 -1.704 0.007 1.00 89.42 101 C 1 +ATOM 2495 C CD . PRO C 3 101 ? 23.384 -1.033 1.028 1.00 91.56 101 C 1 +ATOM 2496 N N . CYS C 3 102 ? 24.468 0.101 -2.107 1.00 90.75 102 C 1 +ATOM 2497 C CA . CYS C 3 102 ? 24.394 0.898 -3.319 1.00 90.38 102 C 1 +ATOM 2498 C C . CYS C 3 102 ? 25.577 1.864 -3.432 1.00 90.17 102 C 1 +ATOM 2499 O O . CYS C 3 102 ? 25.593 2.930 -2.826 1.00 86.43 102 C 1 +ATOM 2500 C CB . CYS C 3 102 ? 23.043 1.612 -3.340 1.00 88.13 102 C 1 +ATOM 2501 S SG . CYS C 3 102 ? 21.686 0.465 -3.707 1.00 85.28 102 C 1 +ATOM 2502 N N . GLN C 3 103 ? 26.553 1.491 -4.267 1.00 89.02 103 C 1 +ATOM 2503 C CA . GLN C 3 103 ? 27.681 2.383 -4.585 1.00 87.80 103 C 1 +ATOM 2504 C C . GLN C 3 103 ? 27.407 3.319 -5.762 1.00 88.20 103 C 1 +ATOM 2505 O O . GLN C 3 103 ? 28.092 4.324 -5.935 1.00 84.06 103 C 1 +ATOM 2506 C CB . GLN C 3 103 ? 28.936 1.562 -4.880 1.00 84.90 103 C 1 +ATOM 2507 C CG . GLN C 3 103 ? 29.383 0.739 -3.670 1.00 76.63 103 C 1 +ATOM 2508 C CD . GLN C 3 103 ? 30.879 0.451 -3.654 1.00 69.72 103 C 1 +ATOM 2509 O OE1 . GLN C 3 103 ? 31.621 0.743 -4.578 1.00 61.42 103 C 1 +ATOM 2510 N NE2 . GLN C 3 103 ? 31.381 -0.122 -2.584 1.00 58.02 103 C 1 +ATOM 2511 N N . ARG C 3 104 ? 26.443 2.960 -6.613 1.00 84.84 104 C 1 +ATOM 2512 C CA . ARG C 3 104 ? 26.007 3.754 -7.761 1.00 85.63 104 C 1 +ATOM 2513 C C . ARG C 3 104 ? 24.496 3.675 -7.858 1.00 85.80 104 C 1 +ATOM 2514 O O . ARG C 3 104 ? 23.931 2.598 -7.705 1.00 82.24 104 C 1 +ATOM 2515 C CB . ARG C 3 104 ? 26.648 3.257 -9.065 1.00 83.38 104 C 1 +ATOM 2516 C CG . ARG C 3 104 ? 28.166 3.468 -9.076 1.00 74.38 104 C 1 +ATOM 2517 C CD . ARG C 3 104 ? 28.749 3.082 -10.434 1.00 71.61 104 C 1 +ATOM 2518 N NE . ARG C 3 104 ? 30.210 3.244 -10.437 1.00 60.94 104 C 1 +ATOM 2519 C CZ . ARG C 3 104 ? 31.022 3.015 -11.456 1.00 52.66 104 C 1 +ATOM 2520 N NH1 . ARG C 3 104 ? 30.568 2.606 -12.607 1.00 49.41 104 C 1 +ATOM 2521 N NH2 . ARG C 3 104 ? 32.305 3.191 -11.322 1.00 46.64 104 C 1 +ATOM 2522 N N . GLU C 3 105 ? 23.894 4.802 -8.164 1.00 82.17 105 C 1 +ATOM 2523 C CA . GLU C 3 105 ? 22.482 4.854 -8.516 1.00 82.38 105 C 1 +ATOM 2524 C C . GLU C 3 105 ? 22.243 4.131 -9.842 1.00 81.01 105 C 1 +ATOM 2525 O O . GLU C 3 105 ? 23.046 4.230 -10.779 1.00 78.23 105 C 1 +ATOM 2526 C CB . GLU C 3 105 ? 22.051 6.322 -8.562 1.00 79.18 105 C 1 +ATOM 2527 C CG . GLU C 3 105 ? 20.540 6.494 -8.713 1.00 70.96 105 C 1 +ATOM 2528 C CD . GLU C 3 105 ? 20.114 7.968 -8.615 1.00 67.71 105 C 1 +ATOM 2529 O OE1 . GLU C 3 105 ? 18.932 8.239 -8.919 1.00 61.81 105 C 1 +ATOM 2530 O OE2 . GLU C 3 105 ? 20.962 8.809 -8.231 1.00 63.68 105 C 1 +ATOM 2531 N N . THR C 3 106 ? 21.170 3.356 -9.912 1.00 76.61 106 C 1 +ATOM 2532 C CA . THR C 3 106 ? 20.725 2.743 -11.163 1.00 75.80 106 C 1 +ATOM 2533 C C . THR C 3 106 ? 20.092 3.836 -12.019 1.00 75.14 106 C 1 +ATOM 2534 O O . THR C 3 106 ? 19.107 4.424 -11.579 1.00 73.18 106 C 1 +ATOM 2535 C CB . THR C 3 106 ? 19.726 1.610 -10.911 1.00 73.31 106 C 1 +ATOM 2536 O OG1 . THR C 3 106 ? 20.329 0.649 -10.075 1.00 68.66 106 C 1 +ATOM 2537 C CG2 . THR C 3 106 ? 19.331 0.893 -12.197 1.00 67.05 106 C 1 +ATOM 2538 N N . PRO C 3 107 ? 20.615 4.104 -13.226 1.00 72.89 107 C 1 +ATOM 2539 C CA . PRO C 3 107 ? 20.023 5.110 -14.097 1.00 72.42 107 C 1 +ATOM 2540 C C . PRO C 3 107 ? 18.564 4.785 -14.419 1.00 71.38 107 C 1 +ATOM 2541 O O . PRO C 3 107 ? 18.188 3.615 -14.532 1.00 68.74 107 C 1 +ATOM 2542 C CB . PRO C 3 107 ? 20.881 5.131 -15.364 1.00 71.19 107 C 1 +ATOM 2543 C CG . PRO C 3 107 ? 22.213 4.554 -14.905 1.00 71.09 107 C 1 +ATOM 2544 C CD . PRO C 3 107 ? 21.815 3.558 -13.822 1.00 74.53 107 C 1 +ATOM 2545 N N . GLU C 3 108 ? 17.754 5.809 -14.619 1.00 64.82 108 C 1 +ATOM 2546 C CA . GLU C 3 108 ? 16.364 5.637 -15.021 1.00 62.83 108 C 1 +ATOM 2547 C C . GLU C 3 108 ? 16.273 4.867 -16.351 1.00 62.61 108 C 1 +ATOM 2548 O O . GLU C 3 108 ? 17.024 5.111 -17.297 1.00 59.21 108 C 1 +ATOM 2549 C CB . GLU C 3 108 ? 15.684 7.011 -15.079 1.00 59.40 108 C 1 +ATOM 2550 C CG . GLU C 3 108 ? 14.159 6.893 -15.044 1.00 52.02 108 C 1 +ATOM 2551 C CD . GLU C 3 108 ? 13.445 8.250 -14.973 1.00 47.07 108 C 1 +ATOM 2552 O OE1 . GLU C 3 108 ? 12.223 8.232 -14.699 1.00 41.94 108 C 1 +ATOM 2553 O OE2 . GLU C 3 108 ? 14.107 9.288 -15.203 1.00 43.67 108 C 1 +ATOM 2554 N N . GLY C 3 109 ? 15.382 3.869 -16.404 1.00 59.39 109 C 1 +ATOM 2555 C CA . GLY C 3 109 ? 15.237 2.972 -17.551 1.00 58.26 109 C 1 +ATOM 2556 C C . GLY C 3 109 ? 16.309 1.883 -17.687 1.00 60.61 109 C 1 +ATOM 2557 O O . GLY C 3 109 ? 16.141 0.979 -18.510 1.00 58.57 109 C 1 +ATOM 2558 N N . ALA C 3 110 ? 17.375 1.908 -16.897 1.00 66.15 110 C 1 +ATOM 2559 C CA . ALA C 3 110 ? 18.366 0.837 -16.883 1.00 68.45 110 C 1 +ATOM 2560 C C . ALA C 3 110 ? 17.851 -0.401 -16.133 1.00 67.94 110 C 1 +ATOM 2561 O O . ALA C 3 110 ? 16.996 -0.324 -15.254 1.00 65.86 110 C 1 +ATOM 2562 C CB . ALA C 3 110 ? 19.685 1.349 -16.293 1.00 67.93 110 C 1 +ATOM 2563 N N . GLU C 3 111 ? 18.403 -1.567 -16.471 1.00 64.22 111 C 1 +ATOM 2564 C CA . GLU C 3 111 ? 18.061 -2.806 -15.784 1.00 65.11 111 C 1 +ATOM 2565 C C . GLU C 3 111 ? 18.513 -2.758 -14.321 1.00 66.98 111 C 1 +ATOM 2566 O O . GLU C 3 111 ? 19.702 -2.633 -14.012 1.00 65.37 111 C 1 +ATOM 2567 C CB . GLU C 3 111 ? 18.652 -4.006 -16.534 1.00 61.24 111 C 1 +ATOM 2568 C CG . GLU C 3 111 ? 18.107 -5.335 -16.003 1.00 52.50 111 C 1 +ATOM 2569 C CD . GLU C 3 111 ? 18.676 -6.561 -16.732 1.00 47.63 111 C 1 +ATOM 2570 O OE1 . GLU C 3 111 ? 18.225 -7.678 -16.402 1.00 43.45 111 C 1 +ATOM 2571 O OE2 . GLU C 3 111 ? 19.585 -6.395 -17.586 1.00 44.65 111 C 1 +ATOM 2572 N N . ALA C 3 112 ? 17.564 -2.895 -13.421 1.00 68.60 112 C 1 +ATOM 2573 C CA . ALA C 3 112 ? 17.804 -2.949 -11.994 1.00 68.58 112 C 1 +ATOM 2574 C C . ALA C 3 112 ? 18.384 -4.319 -11.618 1.00 70.68 112 C 1 +ATOM 2575 O O . ALA C 3 112 ? 17.670 -5.316 -11.547 1.00 69.56 112 C 1 +ATOM 2576 C CB . ALA C 3 112 ? 16.486 -2.632 -11.281 1.00 65.37 112 C 1 +ATOM 2577 N N . LYS C 3 113 ? 19.690 -4.384 -11.361 1.00 72.83 113 C 1 +ATOM 2578 C CA . LYS C 3 113 ? 20.345 -5.626 -10.942 1.00 74.52 113 C 1 +ATOM 2579 C C . LYS C 3 113 ? 19.972 -5.964 -9.500 1.00 76.33 113 C 1 +ATOM 2580 O O . LYS C 3 113 ? 20.035 -5.078 -8.647 1.00 76.48 113 C 1 +ATOM 2581 C CB . LYS C 3 113 ? 21.866 -5.542 -11.118 1.00 73.07 113 C 1 +ATOM 2582 C CG . LYS C 3 113 ? 22.228 -5.468 -12.606 1.00 66.95 113 C 1 +ATOM 2583 C CD . LYS C 3 113 ? 23.745 -5.534 -12.807 1.00 62.41 113 C 1 +ATOM 2584 C CE . LYS C 3 113 ? 24.019 -5.465 -14.310 1.00 54.87 113 C 1 +ATOM 2585 N NZ . LYS C 3 113 ? 25.459 -5.590 -14.622 1.00 49.21 113 C 1 +ATOM 2586 N N . PRO C 3 114 ? 19.628 -7.233 -9.213 1.00 78.37 114 C 1 +ATOM 2587 C CA . PRO C 3 114 ? 19.404 -7.652 -7.842 1.00 78.62 114 C 1 +ATOM 2588 C C . PRO C 3 114 ? 20.722 -7.660 -7.061 1.00 81.38 114 C 1 +ATOM 2589 O O . PRO C 3 114 ? 21.779 -8.027 -7.584 1.00 81.59 114 C 1 +ATOM 2590 C CB . PRO C 3 114 ? 18.766 -9.039 -7.934 1.00 75.88 114 C 1 +ATOM 2591 C CG . PRO C 3 114 ? 19.336 -9.595 -9.241 1.00 72.22 114 C 1 +ATOM 2592 C CD . PRO C 3 114 ? 19.475 -8.354 -10.123 1.00 73.94 114 C 1 +ATOM 2593 N N . TRP C 3 115 ? 20.646 -7.290 -5.797 1.00 84.99 115 C 1 +ATOM 2594 C CA . TRP C 3 115 ? 21.724 -7.420 -4.826 1.00 86.73 115 C 1 +ATOM 2595 C C . TRP C 3 115 ? 21.196 -8.076 -3.554 1.00 86.88 115 C 1 +ATOM 2596 O O . TRP C 3 115 ? 20.012 -7.984 -3.235 1.00 86.59 115 C 1 +ATOM 2597 C CB . TRP C 3 115 ? 22.372 -6.053 -4.564 1.00 87.51 115 C 1 +ATOM 2598 C CG . TRP C 3 115 ? 21.436 -4.957 -4.135 1.00 88.54 115 C 1 +ATOM 2599 C CD1 . TRP C 3 115 ? 20.954 -3.987 -4.943 1.00 88.05 115 C 1 +ATOM 2600 C CD2 . TRP C 3 115 ? 20.866 -4.703 -2.816 1.00 88.73 115 C 1 +ATOM 2601 N NE1 . TRP C 3 115 ? 20.116 -3.147 -4.220 1.00 88.04 115 C 1 +ATOM 2602 C CE2 . TRP C 3 115 ? 20.029 -3.553 -2.910 1.00 88.59 115 C 1 +ATOM 2603 C CE3 . TRP C 3 115 ? 20.967 -5.336 -1.556 1.00 88.77 115 C 1 +ATOM 2604 C CZ2 . TRP C 3 115 ? 19.304 -3.059 -1.802 1.00 87.97 115 C 1 +ATOM 2605 C CZ3 . TRP C 3 115 ? 20.245 -4.842 -0.449 1.00 88.56 115 C 1 +ATOM 2606 C CH2 . TRP C 3 115 ? 19.419 -3.719 -0.579 1.00 87.85 115 C 1 +ATOM 2607 N N . TYR C 3 116 ? 22.094 -8.744 -2.836 1.00 91.25 116 C 1 +ATOM 2608 C CA . TYR C 3 116 ? 21.816 -9.388 -1.558 1.00 91.71 116 C 1 +ATOM 2609 C C . TYR C 3 116 ? 22.845 -8.916 -0.538 1.00 93.15 116 C 1 +ATOM 2610 O O . TYR C 3 116 ? 24.040 -8.894 -0.829 1.00 92.88 116 C 1 +ATOM 2611 C CB . TYR C 3 116 ? 21.858 -10.910 -1.700 1.00 89.64 116 C 1 +ATOM 2612 C CG . TYR C 3 116 ? 20.799 -11.490 -2.612 1.00 87.44 116 C 1 +ATOM 2613 C CD1 . TYR C 3 116 ? 19.599 -11.992 -2.075 1.00 83.25 116 C 1 +ATOM 2614 C CD2 . TYR C 3 116 ? 21.019 -11.554 -4.001 1.00 82.71 116 C 1 +ATOM 2615 C CE1 . TYR C 3 116 ? 18.631 -12.566 -2.912 1.00 80.78 116 C 1 +ATOM 2616 C CE2 . TYR C 3 116 ? 20.054 -12.118 -4.850 1.00 80.14 116 C 1 +ATOM 2617 C CZ . TYR C 3 116 ? 18.864 -12.630 -4.299 1.00 80.87 116 C 1 +ATOM 2618 O OH . TYR C 3 116 ? 17.929 -13.202 -5.127 1.00 77.50 116 C 1 +ATOM 2619 N N . GLU C 3 117 ? 22.389 -8.555 0.646 1.00 94.70 117 C 1 +ATOM 2620 C CA . GLU C 3 117 ? 23.261 -8.074 1.707 1.00 95.26 117 C 1 +ATOM 2621 C C . GLU C 3 117 ? 22.883 -8.740 3.037 1.00 95.85 117 C 1 +ATOM 2622 O O . GLU C 3 117 ? 21.949 -8.310 3.715 1.00 95.30 117 C 1 +ATOM 2623 C CB . GLU C 3 117 ? 23.203 -6.540 1.757 1.00 94.48 117 C 1 +ATOM 2624 C CG . GLU C 3 117 ? 24.449 -5.944 2.421 1.00 85.60 117 C 1 +ATOM 2625 C CD . GLU C 3 117 ? 25.732 -6.044 1.571 1.00 88.90 117 C 1 +ATOM 2626 O OE1 . GLU C 3 117 ? 26.829 -6.143 2.186 1.00 83.69 117 C 1 +ATOM 2627 O OE2 . GLU C 3 117 ? 25.646 -5.981 0.329 1.00 84.35 117 C 1 +ATOM 2628 N N . PRO C 3 118 ? 23.586 -9.823 3.433 1.00 96.33 118 C 1 +ATOM 2629 C CA . PRO C 3 118 ? 23.396 -10.425 4.741 1.00 96.62 118 C 1 +ATOM 2630 C C . PRO C 3 118 ? 24.095 -9.601 5.829 1.00 97.32 118 C 1 +ATOM 2631 O O . PRO C 3 118 ? 25.234 -9.140 5.670 1.00 97.15 118 C 1 +ATOM 2632 C CB . PRO C 3 118 ? 23.965 -11.839 4.625 1.00 95.38 118 C 1 +ATOM 2633 C CG . PRO C 3 118 ? 25.074 -11.677 3.583 1.00 93.06 118 C 1 +ATOM 2634 C CD . PRO C 3 118 ? 24.544 -10.585 2.654 1.00 94.91 118 C 1 +ATOM 2635 N N . ILE C 3 119 ? 23.437 -9.479 6.977 1.00 97.56 119 C 1 +ATOM 2636 C CA . ILE C 3 119 ? 24.038 -8.984 8.215 1.00 97.92 119 C 1 +ATOM 2637 C C . ILE C 3 119 ? 23.852 -10.053 9.286 1.00 97.89 119 C 1 +ATOM 2638 O O . ILE C 3 119 ? 22.726 -10.375 9.658 1.00 97.49 119 C 1 +ATOM 2639 C CB . ILE C 3 119 ? 23.450 -7.625 8.650 1.00 98.02 119 C 1 +ATOM 2640 C CG1 . ILE C 3 119 ? 23.688 -6.549 7.561 1.00 97.15 119 C 1 +ATOM 2641 C CG2 . ILE C 3 119 ? 24.070 -7.204 9.996 1.00 96.83 119 C 1 +ATOM 2642 C CD1 . ILE C 3 119 ? 23.130 -5.154 7.912 1.00 96.39 119 C 1 +ATOM 2643 N N . TYR C 3 120 ? 24.962 -10.580 9.798 1.00 98.02 120 C 1 +ATOM 2644 C CA . TYR C 3 120 ? 24.992 -11.467 10.954 1.00 98.14 120 C 1 +ATOM 2645 C C . TYR C 3 120 ? 25.548 -10.723 12.166 1.00 98.27 120 C 1 +ATOM 2646 O O . TYR C 3 120 ? 26.585 -10.057 12.076 1.00 98.06 120 C 1 +ATOM 2647 C CB . TYR C 3 120 ? 25.808 -12.720 10.635 1.00 97.81 120 C 1 +ATOM 2648 C CG . TYR C 3 120 ? 25.822 -13.719 11.776 1.00 96.55 120 C 1 +ATOM 2649 C CD1 . TYR C 3 120 ? 26.882 -13.735 12.707 1.00 94.23 120 C 1 +ATOM 2650 C CD2 . TYR C 3 120 ? 24.750 -14.619 11.937 1.00 94.14 120 C 1 +ATOM 2651 C CE1 . TYR C 3 120 ? 26.878 -14.645 13.774 1.00 91.68 120 C 1 +ATOM 2652 C CE2 . TYR C 3 120 ? 24.734 -15.532 13.001 1.00 91.91 120 C 1 +ATOM 2653 C CZ . TYR C 3 120 ? 25.801 -15.540 13.918 1.00 92.58 120 C 1 +ATOM 2654 O OH . TYR C 3 120 ? 25.790 -16.436 14.963 1.00 91.47 120 C 1 +ATOM 2655 N N . LEU C 3 121 ? 24.865 -10.852 13.287 1.00 98.48 121 C 1 +ATOM 2656 C CA . LEU C 3 121 ? 25.275 -10.339 14.585 1.00 98.62 121 C 1 +ATOM 2657 C C . LEU C 3 121 ? 25.394 -11.510 15.554 1.00 98.61 121 C 1 +ATOM 2658 O O . LEU C 3 121 ? 24.548 -12.403 15.561 1.00 98.16 121 C 1 +ATOM 2659 C CB . LEU C 3 121 ? 24.255 -9.311 15.092 1.00 98.47 121 C 1 +ATOM 2660 C CG . LEU C 3 121 ? 24.072 -8.064 14.207 1.00 98.01 121 C 1 +ATOM 2661 C CD1 . LEU C 3 121 ? 22.989 -7.172 14.813 1.00 96.46 121 C 1 +ATOM 2662 C CD2 . LEU C 3 121 ? 25.357 -7.243 14.085 1.00 96.06 121 C 1 +ATOM 2663 N N . GLY C 3 122 ? 26.419 -11.494 16.409 1.00 98.55 122 C 1 +ATOM 2664 C CA . GLY C 3 122 ? 26.607 -12.521 17.422 1.00 98.54 122 C 1 +ATOM 2665 C C . GLY C 3 122 ? 27.576 -12.079 18.511 1.00 98.66 122 C 1 +ATOM 2666 O O . GLY C 3 122 ? 28.590 -11.442 18.230 1.00 97.83 122 C 1 +ATOM 2667 N N . GLY C 3 123 ? 27.257 -12.431 19.759 1.00 98.66 123 C 1 +ATOM 2668 C CA . GLY C 3 123 ? 28.097 -12.104 20.902 1.00 98.60 123 C 1 +ATOM 2669 C C . GLY C 3 123 ? 27.586 -12.738 22.190 1.00 98.74 123 C 1 +ATOM 2670 O O . GLY C 3 123 ? 26.444 -13.183 22.275 1.00 98.29 123 C 1 +ATOM 2671 N N . VAL C 3 124 ? 28.456 -12.778 23.207 1.00 98.74 124 C 1 +ATOM 2672 C CA . VAL C 3 124 ? 28.132 -13.297 24.540 1.00 98.71 124 C 1 +ATOM 2673 C C . VAL C 3 124 ? 27.944 -12.132 25.498 1.00 98.70 124 C 1 +ATOM 2674 O O . VAL C 3 124 ? 28.806 -11.259 25.583 1.00 98.13 124 C 1 +ATOM 2675 C CB . VAL C 3 124 ? 29.211 -14.272 25.040 1.00 98.23 124 C 1 +ATOM 2676 C CG1 . VAL C 3 124 ? 28.896 -14.782 26.451 1.00 95.19 124 C 1 +ATOM 2677 C CG2 . VAL C 3 124 ? 29.329 -15.486 24.113 1.00 95.02 124 C 1 +ATOM 2678 N N . PHE C 3 125 ? 26.834 -12.141 26.235 1.00 98.50 125 C 1 +ATOM 2679 C CA . PHE C 3 125 ? 26.473 -11.082 27.171 1.00 98.45 125 C 1 +ATOM 2680 C C . PHE C 3 125 ? 25.959 -11.667 28.484 1.00 98.40 125 C 1 +ATOM 2681 O O . PHE C 3 125 ? 25.258 -12.681 28.491 1.00 97.86 125 C 1 +ATOM 2682 C CB . PHE C 3 125 ? 25.424 -10.164 26.531 1.00 98.35 125 C 1 +ATOM 2683 C CG . PHE C 3 125 ? 25.902 -9.465 25.275 1.00 98.26 125 C 1 +ATOM 2684 C CD1 . PHE C 3 125 ? 26.573 -8.233 25.361 1.00 97.00 125 C 1 +ATOM 2685 C CD2 . PHE C 3 125 ? 25.729 -10.066 24.020 1.00 97.07 125 C 1 +ATOM 2686 C CE1 . PHE C 3 125 ? 27.065 -7.606 24.209 1.00 96.43 125 C 1 +ATOM 2687 C CE2 . PHE C 3 125 ? 26.225 -9.446 22.860 1.00 96.49 125 C 1 +ATOM 2688 C CZ . PHE C 3 125 ? 26.894 -8.218 22.958 1.00 96.99 125 C 1 +ATOM 2689 N N . GLN C 3 126 ? 26.286 -11.009 29.596 1.00 97.38 126 C 1 +ATOM 2690 C CA . GLN C 3 126 ? 25.634 -11.240 30.878 1.00 97.01 126 C 1 +ATOM 2691 C C . GLN C 3 126 ? 24.257 -10.577 30.847 1.00 96.72 126 C 1 +ATOM 2692 O O . GLN C 3 126 ? 24.152 -9.375 30.605 1.00 95.86 126 C 1 +ATOM 2693 C CB . GLN C 3 126 ? 26.507 -10.679 32.015 1.00 96.54 126 C 1 +ATOM 2694 C CG . GLN C 3 126 ? 25.942 -10.986 33.421 1.00 93.09 126 C 1 +ATOM 2695 C CD . GLN C 3 126 ? 25.984 -12.473 33.784 1.00 89.92 126 C 1 +ATOM 2696 O OE1 . GLN C 3 126 ? 26.799 -13.233 33.292 1.00 82.02 126 C 1 +ATOM 2697 N NE2 . GLN C 3 126 ? 25.113 -12.925 34.655 1.00 79.06 126 C 1 +ATOM 2698 N N . LEU C 3 127 ? 23.213 -11.368 31.080 1.00 97.19 127 C 1 +ATOM 2699 C CA . LEU C 3 127 ? 21.831 -10.906 31.122 1.00 97.17 127 C 1 +ATOM 2700 C C . LEU C 3 127 ? 21.228 -11.176 32.497 1.00 96.95 127 C 1 +ATOM 2701 O O . LEU C 3 127 ? 21.670 -12.068 33.221 1.00 96.13 127 C 1 +ATOM 2702 C CB . LEU C 3 127 ? 21.010 -11.576 30.008 1.00 97.25 127 C 1 +ATOM 2703 C CG . LEU C 3 127 ? 21.531 -11.348 28.577 1.00 96.99 127 C 1 +ATOM 2704 C CD1 . LEU C 3 127 ? 20.615 -12.060 27.588 1.00 95.98 127 C 1 +ATOM 2705 C CD2 . LEU C 3 127 ? 21.583 -9.869 28.190 1.00 95.71 127 C 1 +ATOM 2706 N N . GLU C 3 128 ? 20.191 -10.410 32.829 1.00 96.64 128 C 1 +ATOM 2707 C CA . GLU C 3 128 ? 19.428 -10.537 34.063 1.00 96.30 128 C 1 +ATOM 2708 C C . GLU C 3 128 ? 18.036 -11.102 33.782 1.00 96.79 128 C 1 +ATOM 2709 O O . GLU C 3 128 ? 17.506 -11.030 32.667 1.00 96.37 128 C 1 +ATOM 2710 C CB . GLU C 3 128 ? 19.338 -9.178 34.774 1.00 95.03 128 C 1 +ATOM 2711 C CG . GLU C 3 128 ? 20.704 -8.679 35.272 1.00 88.37 128 C 1 +ATOM 2712 C CD . GLU C 3 128 ? 20.644 -7.292 35.942 1.00 76.66 128 C 1 +ATOM 2713 O OE1 . GLU C 3 128 ? 21.692 -6.862 36.466 1.00 68.17 128 C 1 +ATOM 2714 O OE2 . GLU C 3 128 ? 19.571 -6.636 35.891 1.00 66.37 128 C 1 +ATOM 2715 N N . LYS C 3 129 ? 17.403 -11.651 34.825 1.00 96.94 129 C 1 +ATOM 2716 C CA . LYS C 3 129 ? 16.026 -12.116 34.738 1.00 97.19 129 C 1 +ATOM 2717 C C . LYS C 3 129 ? 15.086 -10.965 34.380 1.00 97.04 129 C 1 +ATOM 2718 O O . LYS C 3 129 ? 15.050 -9.947 35.066 1.00 96.04 129 C 1 +ATOM 2719 C CB . LYS C 3 129 ? 15.629 -12.789 36.057 1.00 96.83 129 C 1 +ATOM 2720 C CG . LYS C 3 129 ? 14.174 -13.278 36.023 1.00 95.09 129 C 1 +ATOM 2721 C CD . LYS C 3 129 ? 13.817 -13.999 37.331 1.00 92.40 129 C 1 +ATOM 2722 C CE . LYS C 3 129 ? 12.359 -14.448 37.254 1.00 84.03 129 C 1 +ATOM 2723 N NZ . LYS C 3 129 ? 11.963 -15.186 38.480 1.00 77.16 129 C 1 +ATOM 2724 N N . GLY C 3 130 ? 14.252 -11.178 33.366 1.00 97.31 130 C 1 +ATOM 2725 C CA . GLY C 3 130 ? 13.258 -10.223 32.880 1.00 97.04 130 C 1 +ATOM 2726 C C . GLY C 3 130 ? 13.797 -9.190 31.893 1.00 97.15 130 C 1 +ATOM 2727 O O . GLY C 3 130 ? 13.014 -8.372 31.401 1.00 96.26 130 C 1 +ATOM 2728 N N . ASP C 3 131 ? 15.089 -9.226 31.575 1.00 97.19 131 C 1 +ATOM 2729 C CA . ASP C 3 131 ? 15.622 -8.429 30.477 1.00 97.30 131 C 1 +ATOM 2730 C C . ASP C 3 131 ? 14.873 -8.722 29.181 1.00 97.50 131 C 1 +ATOM 2731 O O . ASP C 3 131 ? 14.527 -9.868 28.878 1.00 97.11 131 C 1 +ATOM 2732 C CB . ASP C 3 131 ? 17.106 -8.712 30.248 1.00 97.05 131 C 1 +ATOM 2733 C CG . ASP C 3 131 ? 18.049 -8.031 31.228 1.00 96.34 131 C 1 +ATOM 2734 O OD1 . ASP C 3 131 ? 17.670 -7.038 31.880 1.00 94.15 131 C 1 +ATOM 2735 O OD2 . ASP C 3 131 ? 19.234 -8.417 31.211 1.00 93.71 131 C 1 +ATOM 2736 N N . ARG C 3 132 ? 14.654 -7.684 28.388 1.00 97.94 132 C 1 +ATOM 2737 C CA . ARG C 3 132 ? 14.033 -7.787 27.073 1.00 97.94 132 C 1 +ATOM 2738 C C . ARG C 3 132 ? 15.064 -7.527 25.991 1.00 98.07 132 C 1 +ATOM 2739 O O . ARG C 3 132 ? 15.787 -6.534 26.050 1.00 97.62 132 C 1 +ATOM 2740 C CB . ARG C 3 132 ? 12.838 -6.833 26.975 1.00 97.23 132 C 1 +ATOM 2741 C CG . ARG C 3 132 ? 11.704 -7.237 27.936 1.00 92.54 132 C 1 +ATOM 2742 C CD . ARG C 3 132 ? 10.527 -6.258 27.855 1.00 86.89 132 C 1 +ATOM 2743 N NE . ARG C 3 132 ? 10.853 -4.960 28.464 1.00 76.84 132 C 1 +ATOM 2744 C CZ . ARG C 3 132 ? 10.198 -3.817 28.283 1.00 69.19 132 C 1 +ATOM 2745 N NH1 . ARG C 3 132 ? 9.155 -3.742 27.504 1.00 62.06 132 C 1 +ATOM 2746 N NH2 . ARG C 3 132 ? 10.582 -2.739 28.902 1.00 60.52 132 C 1 +ATOM 2747 N N . LEU C 3 133 ? 15.097 -8.393 24.994 1.00 98.34 133 C 1 +ATOM 2748 C CA . LEU C 3 133 ? 15.993 -8.298 23.853 1.00 98.46 133 C 1 +ATOM 2749 C C . LEU C 3 133 ? 15.186 -8.059 22.581 1.00 98.44 133 C 1 +ATOM 2750 O O . LEU C 3 133 ? 14.265 -8.816 22.273 1.00 98.10 133 C 1 +ATOM 2751 C CB . LEU C 3 133 ? 16.837 -9.571 23.738 1.00 98.45 133 C 1 +ATOM 2752 C CG . LEU C 3 133 ? 17.666 -9.921 24.982 1.00 97.71 133 C 1 +ATOM 2753 C CD1 . LEU C 3 133 ? 18.292 -11.295 24.782 1.00 95.53 133 C 1 +ATOM 2754 C CD2 . LEU C 3 133 ? 18.776 -8.902 25.234 1.00 94.65 133 C 1 +ATOM 2755 N N . SER C 3 134 ? 15.535 -7.024 21.840 1.00 98.35 134 C 1 +ATOM 2756 C CA . SER C 3 134 ? 14.957 -6.725 20.530 1.00 98.23 134 C 1 +ATOM 2757 C C . SER C 3 134 ? 16.006 -6.890 19.440 1.00 98.49 134 C 1 +ATOM 2758 O O . SER C 3 134 ? 17.146 -6.469 19.623 1.00 98.08 134 C 1 +ATOM 2759 C CB . SER C 3 134 ? 14.363 -5.310 20.499 1.00 96.85 134 C 1 +ATOM 2760 O OG . SER C 3 134 ? 15.322 -4.324 20.830 1.00 80.39 134 C 1 +ATOM 2761 N N . ALA C 3 135 ? 15.612 -7.461 18.308 1.00 98.40 135 C 1 +ATOM 2762 C CA . ALA C 3 135 ? 16.399 -7.471 17.082 1.00 98.43 135 C 1 +ATOM 2763 C C . ALA C 3 135 ? 15.619 -6.722 15.998 1.00 98.22 135 C 1 +ATOM 2764 O O . ALA C 3 135 ? 14.537 -7.148 15.598 1.00 97.51 135 C 1 +ATOM 2765 C CB . ALA C 3 135 ? 16.727 -8.914 16.698 1.00 98.37 135 C 1 +ATOM 2766 N N . GLU C 3 136 ? 16.144 -5.599 15.562 1.00 98.04 136 C 1 +ATOM 2767 C CA . GLU C 3 136 ? 15.448 -4.638 14.712 1.00 97.98 136 C 1 +ATOM 2768 C C . GLU C 3 136 ? 16.293 -4.247 13.504 1.00 98.11 136 C 1 +ATOM 2769 O O . GLU C 3 136 ? 17.522 -4.352 13.499 1.00 97.85 136 C 1 +ATOM 2770 C CB . GLU C 3 136 ? 15.097 -3.385 15.529 1.00 97.47 136 C 1 +ATOM 2771 C CG . GLU C 3 136 ? 14.082 -3.638 16.656 1.00 95.52 136 C 1 +ATOM 2772 C CD . GLU C 3 136 ? 13.969 -2.418 17.587 1.00 93.10 136 C 1 +ATOM 2773 O OE1 . GLU C 3 136 ? 13.000 -2.287 18.363 1.00 84.53 136 C 1 +ATOM 2774 O OE2 . GLU C 3 136 ? 14.930 -1.609 17.650 1.00 85.83 136 C 1 +ATOM 2775 N N . ILE C 3 137 ? 15.611 -3.746 12.497 1.00 97.64 137 C 1 +ATOM 2776 C CA . ILE C 3 137 ? 16.204 -3.202 11.277 1.00 97.18 137 C 1 +ATOM 2777 C C . ILE C 3 137 ? 15.549 -1.865 10.939 1.00 96.91 137 C 1 +ATOM 2778 O O . ILE C 3 137 ? 14.419 -1.599 11.331 1.00 95.76 137 C 1 +ATOM 2779 C CB . ILE C 3 137 ? 16.080 -4.188 10.103 1.00 96.21 137 C 1 +ATOM 2780 C CG1 . ILE C 3 137 ? 14.601 -4.526 9.820 1.00 94.18 137 C 1 +ATOM 2781 C CG2 . ILE C 3 137 ? 16.926 -5.443 10.364 1.00 93.06 137 C 1 +ATOM 2782 C CD1 . ILE C 3 137 ? 14.426 -5.386 8.576 1.00 91.11 137 C 1 +ATOM 2783 N N . ASN C 3 138 ? 16.247 -1.028 10.182 1.00 94.66 138 C 1 +ATOM 2784 C CA . ASN C 3 138 ? 15.705 0.266 9.754 1.00 93.47 138 C 1 +ATOM 2785 C C . ASN C 3 138 ? 14.873 0.197 8.463 1.00 91.17 138 C 1 +ATOM 2786 O O . ASN C 3 138 ? 14.087 1.101 8.199 1.00 88.89 138 C 1 +ATOM 2787 C CB . ASN C 3 138 ? 16.861 1.257 9.608 1.00 94.10 138 C 1 +ATOM 2788 C CG . ASN C 3 138 ? 17.777 0.951 8.432 1.00 94.88 138 C 1 +ATOM 2789 O OD1 . ASN C 3 138 ? 18.061 -0.184 8.095 1.00 92.13 138 C 1 +ATOM 2790 N ND2 . ASN C 3 138 ? 18.260 1.970 7.761 1.00 91.73 138 C 1 +ATOM 2791 N N . ARG C 3 139 ? 15.083 -0.828 7.638 1.00 91.30 139 C 1 +ATOM 2792 C CA . ARG C 3 139 ? 14.472 -0.976 6.309 1.00 89.64 139 C 1 +ATOM 2793 C C . ARG C 3 139 ? 13.844 -2.361 6.148 1.00 88.67 139 C 1 +ATOM 2794 O O . ARG C 3 139 ? 14.388 -3.201 5.439 1.00 87.07 139 C 1 +ATOM 2795 C CB . ARG C 3 139 ? 15.517 -0.691 5.214 1.00 88.17 139 C 1 +ATOM 2796 C CG . ARG C 3 139 ? 16.031 0.759 5.171 1.00 84.58 139 C 1 +ATOM 2797 C CD . ARG C 3 139 ? 14.916 1.788 4.944 1.00 82.06 139 C 1 +ATOM 2798 N NE . ARG C 3 139 ? 14.229 1.585 3.656 1.00 79.55 139 C 1 +ATOM 2799 C CZ . ARG C 3 139 ? 14.547 2.107 2.484 1.00 74.77 139 C 1 +ATOM 2800 N NH1 . ARG C 3 139 ? 15.588 2.868 2.322 1.00 70.82 139 C 1 +ATOM 2801 N NH2 . ARG C 3 139 ? 13.798 1.881 1.457 1.00 70.92 139 C 1 +ATOM 2802 N N . PRO C 3 140 ? 12.712 -2.628 6.818 1.00 84.59 140 C 1 +ATOM 2803 C CA . PRO C 3 140 ? 11.994 -3.896 6.674 1.00 81.72 140 C 1 +ATOM 2804 C C . PRO C 3 140 ? 11.454 -4.125 5.260 1.00 80.68 140 C 1 +ATOM 2805 O O . PRO C 3 140 ? 11.239 -5.264 4.874 1.00 78.61 140 C 1 +ATOM 2806 C CB . PRO C 3 140 ? 10.871 -3.832 7.707 1.00 80.19 140 C 1 +ATOM 2807 C CG . PRO C 3 140 ? 10.598 -2.338 7.850 1.00 77.41 140 C 1 +ATOM 2808 C CD . PRO C 3 140 ? 11.986 -1.728 7.686 1.00 80.11 140 C 1 +ATOM 2809 N N . ASP C 3 141 ? 11.301 -3.057 4.485 1.00 76.10 141 C 1 +ATOM 2810 C CA . ASP C 3 141 ? 10.980 -3.119 3.069 1.00 73.55 141 C 1 +ATOM 2811 C C . ASP C 3 141 ? 12.031 -3.914 2.282 1.00 75.40 141 C 1 +ATOM 2812 O O . ASP C 3 141 ? 11.664 -4.748 1.462 1.00 75.67 141 C 1 +ATOM 2813 C CB . ASP C 3 141 ? 10.758 -1.694 2.534 1.00 70.97 141 C 1 +ATOM 2814 C CG . ASP C 3 141 ? 11.952 -0.745 2.662 1.00 68.33 141 C 1 +ATOM 2815 O OD1 . ASP C 3 141 ? 12.539 -0.612 3.756 1.00 64.61 141 C 1 +ATOM 2816 O OD2 . ASP C 3 141 ? 12.273 -0.056 1.671 1.00 63.32 141 C 1 +ATOM 2817 N N . TYR C 3 142 ? 13.317 -3.793 2.576 1.00 81.19 142 C 1 +ATOM 2818 C CA . TYR C 3 142 ? 14.359 -4.562 1.886 1.00 82.96 142 C 1 +ATOM 2819 C C . TYR C 3 142 ? 14.535 -6.013 2.375 1.00 84.68 142 C 1 +ATOM 2820 O O . TYR C 3 142 ? 15.430 -6.687 1.882 1.00 84.96 142 C 1 +ATOM 2821 C CB . TYR C 3 142 ? 15.686 -3.806 1.921 1.00 83.66 142 C 1 +ATOM 2822 C CG . TYR C 3 142 ? 15.726 -2.612 1.005 1.00 82.14 142 C 1 +ATOM 2823 C CD1 . TYR C 3 142 ? 15.957 -2.784 -0.373 1.00 79.00 142 C 1 +ATOM 2824 C CD2 . TYR C 3 142 ? 15.531 -1.323 1.517 1.00 79.41 142 C 1 +ATOM 2825 C CE1 . TYR C 3 142 ? 15.995 -1.675 -1.232 1.00 77.54 142 C 1 +ATOM 2826 C CE2 . TYR C 3 142 ? 15.563 -0.208 0.666 1.00 77.33 142 C 1 +ATOM 2827 C CZ . TYR C 3 142 ? 15.797 -0.389 -0.710 1.00 80.53 142 C 1 +ATOM 2828 O OH . TYR C 3 142 ? 15.829 0.704 -1.535 1.00 78.82 142 C 1 +ATOM 2829 N N . LEU C 3 143 ? 13.743 -6.513 3.324 1.00 85.22 143 C 1 +ATOM 2830 C CA . LEU C 3 143 ? 13.889 -7.895 3.784 1.00 84.95 143 C 1 +ATOM 2831 C C . LEU C 3 143 ? 13.613 -8.897 2.658 1.00 83.18 143 C 1 +ATOM 2832 O O . LEU C 3 143 ? 12.608 -8.812 1.949 1.00 81.16 143 C 1 +ATOM 2833 C CB . LEU C 3 143 ? 12.976 -8.187 4.982 1.00 85.62 143 C 1 +ATOM 2834 C CG . LEU C 3 143 ? 13.509 -7.696 6.334 1.00 84.02 143 C 1 +ATOM 2835 C CD1 . LEU C 3 143 ? 12.440 -7.938 7.399 1.00 78.25 143 C 1 +ATOM 2836 C CD2 . LEU C 3 143 ? 14.779 -8.437 6.762 1.00 78.68 143 C 1 +ATOM 2837 N N . ASP C 3 144 ? 14.475 -9.901 2.545 1.00 86.06 144 C 1 +ATOM 2838 C CA . ASP C 3 144 ? 14.234 -11.039 1.675 1.00 83.91 144 C 1 +ATOM 2839 C C . ASP C 3 144 ? 13.500 -12.145 2.431 1.00 82.27 144 C 1 +ATOM 2840 O O . ASP C 3 144 ? 14.053 -12.819 3.297 1.00 79.11 144 C 1 +ATOM 2841 C CB . ASP C 3 144 ? 15.531 -11.545 1.050 1.00 82.07 144 C 1 +ATOM 2842 C CG . ASP C 3 144 ? 15.258 -12.564 -0.060 1.00 80.78 144 C 1 +ATOM 2843 O OD1 . ASP C 3 144 ? 14.084 -12.684 -0.484 1.00 77.08 144 C 1 +ATOM 2844 O OD2 . ASP C 3 144 ? 16.229 -13.193 -0.525 1.00 75.92 144 C 1 +ATOM 2845 N N . PHE C 3 145 ? 12.242 -12.352 2.060 1.00 76.89 145 C 1 +ATOM 2846 C CA . PHE C 3 145 ? 11.400 -13.421 2.592 1.00 72.81 145 C 1 +ATOM 2847 C C . PHE C 3 145 ? 11.274 -14.620 1.637 1.00 71.11 145 C 1 +ATOM 2848 O O . PHE C 3 145 ? 10.491 -15.532 1.914 1.00 66.73 145 C 1 +ATOM 2849 C CB . PHE C 3 145 ? 10.029 -12.843 2.934 1.00 69.70 145 C 1 +ATOM 2850 C CG . PHE C 3 145 ? 10.039 -11.793 4.024 1.00 69.04 145 C 1 +ATOM 2851 C CD1 . PHE C 3 145 ? 10.314 -12.159 5.353 1.00 65.72 145 C 1 +ATOM 2852 C CD2 . PHE C 3 145 ? 9.732 -10.457 3.722 1.00 64.95 145 C 1 +ATOM 2853 C CE1 . PHE C 3 145 ? 10.255 -11.207 6.383 1.00 64.01 145 C 1 +ATOM 2854 C CE2 . PHE C 3 145 ? 9.669 -9.499 4.747 1.00 63.06 145 C 1 +ATOM 2855 C CZ . PHE C 3 145 ? 9.923 -9.875 6.079 1.00 62.83 145 C 1 +ATOM 2856 N N . ALA C 3 146 ? 11.988 -14.627 0.520 1.00 73.22 146 C 1 +ATOM 2857 C CA . ALA C 3 146 ? 11.862 -15.684 -0.481 1.00 69.59 146 C 1 +ATOM 2858 C C . ALA C 3 146 ? 12.351 -17.032 0.060 1.00 69.11 146 C 1 +ATOM 2859 O O . ALA C 3 146 ? 11.702 -18.060 -0.148 1.00 64.85 146 C 1 +ATOM 2860 C CB . ALA C 3 146 ? 12.630 -15.266 -1.736 1.00 64.94 146 C 1 +ATOM 2861 N N . GLU C 3 147 ? 13.457 -17.030 0.797 1.00 68.64 147 C 1 +ATOM 2862 C CA . GLU C 3 147 ? 13.993 -18.217 1.445 1.00 66.94 147 C 1 +ATOM 2863 C C . GLU C 3 147 ? 13.750 -18.180 2.957 1.00 68.68 147 C 1 +ATOM 2864 O O . GLU C 3 147 ? 14.231 -17.317 3.690 1.00 64.02 147 C 1 +ATOM 2865 C CB . GLU C 3 147 ? 15.470 -18.415 1.112 1.00 61.63 147 C 1 +ATOM 2866 C CG . GLU C 3 147 ? 15.687 -18.767 -0.368 1.00 53.43 147 C 1 +ATOM 2867 C CD . GLU C 3 147 ? 17.098 -19.295 -0.656 1.00 48.91 147 C 1 +ATOM 2868 O OE1 . GLU C 3 147 ? 17.303 -19.763 -1.797 1.00 42.65 147 C 1 +ATOM 2869 O OE2 . GLU C 3 147 ? 17.956 -19.281 0.263 1.00 43.07 147 C 1 +ATOM 2870 N N . SER C 3 148 ? 13.022 -19.183 3.443 1.00 64.44 148 C 1 +ATOM 2871 C CA . SER C 3 148 ? 12.908 -19.405 4.879 1.00 63.33 148 C 1 +ATOM 2872 C C . SER C 3 148 ? 14.268 -19.766 5.475 1.00 66.08 148 C 1 +ATOM 2873 O O . SER C 3 148 ? 14.995 -20.581 4.912 1.00 61.02 148 C 1 +ATOM 2874 C CB . SER C 3 148 ? 11.886 -20.509 5.167 1.00 58.03 148 C 1 +ATOM 2875 O OG . SER C 3 148 ? 12.315 -21.749 4.639 1.00 51.73 148 C 1 +ATOM 2876 N N . GLY C 3 149 ? 14.582 -19.226 6.653 1.00 77.38 149 C 1 +ATOM 2877 C CA . GLY C 3 149 ? 15.829 -19.527 7.365 1.00 79.51 149 C 1 +ATOM 2878 C C . GLY C 3 149 ? 16.949 -18.507 7.164 1.00 83.38 149 C 1 +ATOM 2879 O O . GLY C 3 149 ? 17.990 -18.632 7.805 1.00 80.78 149 C 1 +ATOM 2880 N N . GLN C 3 150 ? 16.727 -17.485 6.348 1.00 83.91 150 C 1 +ATOM 2881 C CA . GLN C 3 150 ? 17.675 -16.378 6.163 1.00 86.14 150 C 1 +ATOM 2882 C C . GLN C 3 150 ? 17.519 -15.252 7.192 1.00 89.98 150 C 1 +ATOM 2883 O O . GLN C 3 150 ? 18.441 -14.467 7.393 1.00 88.38 150 C 1 +ATOM 2884 C CB . GLN C 3 150 ? 17.510 -15.817 4.744 1.00 80.78 150 C 1 +ATOM 2885 C CG . GLN C 3 150 ? 17.837 -16.836 3.635 1.00 74.56 150 C 1 +ATOM 2886 C CD . GLN C 3 150 ? 19.308 -17.243 3.590 1.00 66.88 150 C 1 +ATOM 2887 O OE1 . GLN C 3 150 ? 20.175 -16.682 4.246 1.00 59.30 150 C 1 +ATOM 2888 N NE2 . GLN C 3 150 ? 19.633 -18.236 2.799 1.00 56.95 150 C 1 +ATOM 2889 N N . VAL C 3 151 ? 16.363 -15.171 7.847 1.00 93.43 151 C 1 +ATOM 2890 C CA . VAL C 3 151 ? 16.052 -14.114 8.818 1.00 94.20 151 C 1 +ATOM 2891 C C . VAL C 3 151 ? 15.622 -14.740 10.136 1.00 94.67 151 C 1 +ATOM 2892 O O . VAL C 3 151 ? 14.525 -15.291 10.252 1.00 94.12 151 C 1 +ATOM 2893 C CB . VAL C 3 151 ? 15.001 -13.124 8.286 1.00 93.79 151 C 1 +ATOM 2894 C CG1 . VAL C 3 151 ? 14.870 -11.935 9.242 1.00 91.65 151 C 1 +ATOM 2895 C CG2 . VAL C 3 151 ? 15.373 -12.581 6.899 1.00 91.20 151 C 1 +ATOM 2896 N N . TYR C 3 152 ? 16.493 -14.663 11.136 1.00 96.29 152 C 1 +ATOM 2897 C CA . TYR C 3 152 ? 16.282 -15.277 12.443 1.00 96.78 152 C 1 +ATOM 2898 C C . TYR C 3 152 ? 16.917 -14.469 13.575 1.00 97.32 152 C 1 +ATOM 2899 O O . TYR C 3 152 ? 17.832 -13.676 13.378 1.00 97.31 152 C 1 +ATOM 2900 C CB . TYR C 3 152 ? 16.802 -16.720 12.433 1.00 96.59 152 C 1 +ATOM 2901 C CG . TYR C 3 152 ? 18.251 -16.883 12.021 1.00 96.54 152 C 1 +ATOM 2902 C CD1 . TYR C 3 152 ? 18.568 -17.260 10.698 1.00 95.37 152 C 1 +ATOM 2903 C CD2 . TYR C 3 152 ? 19.294 -16.668 12.938 1.00 95.03 152 C 1 +ATOM 2904 C CE1 . TYR C 3 152 ? 19.904 -17.419 10.300 1.00 94.46 152 C 1 +ATOM 2905 C CE2 . TYR C 3 152 ? 20.638 -16.816 12.547 1.00 94.48 152 C 1 +ATOM 2906 C CZ . TYR C 3 152 ? 20.937 -17.194 11.226 1.00 95.26 152 C 1 +ATOM 2907 O OH . TYR C 3 152 ? 22.248 -17.337 10.840 1.00 93.94 152 C 1 +ATOM 2908 N N . PHE C 3 153 ? 16.435 -14.720 14.787 1.00 97.10 153 C 1 +ATOM 2909 C CA . PHE C 3 153 ? 16.952 -14.148 16.024 1.00 97.77 153 C 1 +ATOM 2910 C C . PHE C 3 153 ? 16.872 -15.194 17.126 1.00 97.75 153 C 1 +ATOM 2911 O O . PHE C 3 153 ? 15.871 -15.903 17.242 1.00 97.39 153 C 1 +ATOM 2912 C CB . PHE C 3 153 ? 16.147 -12.884 16.355 1.00 98.11 153 C 1 +ATOM 2913 C CG . PHE C 3 153 ? 16.368 -12.283 17.731 1.00 98.36 153 C 1 +ATOM 2914 C CD1 . PHE C 3 153 ? 15.264 -11.801 18.468 1.00 97.34 153 C 1 +ATOM 2915 C CD2 . PHE C 3 153 ? 17.659 -12.157 18.265 1.00 97.45 153 C 1 +ATOM 2916 C CE1 . PHE C 3 153 ? 15.458 -11.186 19.711 1.00 97.68 153 C 1 +ATOM 2917 C CE2 . PHE C 3 153 ? 17.856 -11.558 19.516 1.00 97.45 153 C 1 +ATOM 2918 C CZ . PHE C 3 153 ? 16.756 -11.067 20.237 1.00 98.25 153 C 1 +ATOM 2919 N N . GLY C 3 154 ? 17.916 -15.322 17.930 1.00 98.13 154 C 1 +ATOM 2920 C CA . GLY C 3 154 ? 17.935 -16.326 18.974 1.00 98.26 154 C 1 +ATOM 2921 C C . GLY C 3 154 ? 18.881 -16.025 20.120 1.00 98.58 154 C 1 +ATOM 2922 O O . GLY C 3 154 ? 19.783 -15.192 20.028 1.00 98.42 154 C 1 +ATOM 2923 N N . ILE C 3 155 ? 18.653 -16.754 21.215 1.00 98.38 155 C 1 +ATOM 2924 C CA . ILE C 3 155 ? 19.506 -16.747 22.403 1.00 98.39 155 C 1 +ATOM 2925 C C . ILE C 3 155 ? 19.717 -18.174 22.895 1.00 98.24 155 C 1 +ATOM 2926 O O . ILE C 3 155 ? 18.835 -19.025 22.776 1.00 97.74 155 C 1 +ATOM 2927 C CB . ILE C 3 155 ? 18.957 -15.830 23.518 1.00 98.20 155 C 1 +ATOM 2928 C CG1 . ILE C 3 155 ? 17.625 -16.336 24.119 1.00 96.83 155 C 1 +ATOM 2929 C CG2 . ILE C 3 155 ? 18.818 -14.392 23.000 1.00 95.38 155 C 1 +ATOM 2930 C CD1 . ILE C 3 155 ? 17.126 -15.504 25.315 1.00 95.23 155 C 1 +ATOM 2931 N N . ILE C 3 156 ? 20.886 -18.432 23.478 1.00 98.15 156 C 1 +ATOM 2932 C CA . ILE C 3 156 ? 21.242 -19.717 24.082 1.00 97.91 156 C 1 +ATOM 2933 C C . ILE C 3 156 ? 21.950 -19.437 25.403 1.00 98.23 156 C 1 +ATOM 2934 O O . ILE C 3 156 ? 23.003 -18.801 25.403 1.00 97.85 156 C 1 +ATOM 2935 C CB . ILE C 3 156 ? 22.135 -20.552 23.134 1.00 96.26 156 C 1 +ATOM 2936 C CG1 . ILE C 3 156 ? 21.493 -20.725 21.736 1.00 83.85 156 C 1 +ATOM 2937 C CG2 . ILE C 3 156 ? 22.438 -21.916 23.774 1.00 81.02 156 C 1 +ATOM 2938 C CD1 . ILE C 3 156 ? 22.374 -21.451 20.711 1.00 74.62 156 C 1 +ATOM 2939 N N . ALA C 3 157 ? 21.408 -19.922 26.517 1.00 97.99 157 C 1 +ATOM 2940 C CA . ALA C 3 157 ? 22.097 -19.866 27.804 1.00 97.90 157 C 1 +ATOM 2941 C C . ALA C 3 157 ? 23.344 -20.764 27.789 1.00 97.61 157 C 1 +ATOM 2942 O O . ALA C 3 157 ? 23.276 -21.936 27.399 1.00 96.19 157 C 1 +ATOM 2943 C CB . ALA C 3 157 ? 21.128 -20.259 28.920 1.00 97.36 157 C 1 +ATOM 2944 N N . LEU C 3 158 ? 24.481 -20.246 28.218 1.00 97.35 158 C 1 +ATOM 2945 C CA . LEU C 3 158 ? 25.757 -20.950 28.204 1.00 96.65 158 C 1 +ATOM 2946 C C . LEU C 3 158 ? 25.968 -21.858 29.431 1.00 94.63 158 C 1 +ATOM 2947 O O . LEU C 3 158 ? 25.466 -21.576 30.525 1.00 87.97 158 C 1 +ATOM 2948 C CB . LEU C 3 158 ? 26.910 -19.956 27.964 1.00 94.98 158 C 1 +ATOM 2949 C CG . LEU C 3 158 ? 26.864 -19.218 26.602 1.00 94.68 158 C 1 +ATOM 2950 C CD1 . LEU C 3 158 ? 28.067 -18.282 26.496 1.00 90.37 158 C 1 +ATOM 2951 C CD2 . LEU C 3 158 ? 26.909 -20.181 25.413 1.00 88.77 158 C 1 +ATOM 2952 O OXT . LEU C 3 158 ? 26.678 -22.887 29.246 1.00 85.00 158 C 1 +# diff --git a/test/fixtures/af3x_4g3y_bc_dsso/seed-30_sample-0/summary_confidences.json b/test/fixtures/af3x_4g3y_bc_dsso/seed-30_sample-0/summary_confidences.json new file mode 100644 index 00000000..656c74e8 --- /dev/null +++ b/test/fixtures/af3x_4g3y_bc_dsso/seed-30_sample-0/summary_confidences.json @@ -0,0 +1,51 @@ +{ + "chain_iptm": [ + 0.73, + 0.51, + 0.47 + ], + "chain_pair_iptm": [ + [ + 0.03, + 0.78, + 0.68 + ], + [ + 0.78, + 0.75, + 0.25 + ], + [ + 0.68, + 0.25, + 0.83 + ] + ], + "chain_pair_pae_min": [ + [ + 0.76, + 2.36, + 4.09 + ], + [ + 1.66, + 0.76, + 5.84 + ], + [ + 2.09, + 6.08, + 0.76 + ] + ], + "chain_ptm": [ + 0.03, + 0.75, + 0.83 + ], + "fraction_disordered": 0.05, + "has_clash": 0.0, + "iptm": 0.28, + "ptm": 0.57, + "ranking_score": 0.36 +} \ No newline at end of file diff --git a/test/test_af3x.py b/test/test_af3x.py new file mode 100644 index 00000000..0baf76e0 --- /dev/null +++ b/test/test_af3x.py @@ -0,0 +1,384 @@ +"""Regression coverage for AF3/AF3x mixtures of residue and ligand tokens.""" +from __future__ import annotations + +import csv +import json +import lzma +import shutil +from pathlib import Path + +import numpy as np +import pytest +from Bio.PDB import Atom, Chain, MMCIFIO, Model, Residue, Structure + +from alphajudge.complex import Complex +from alphajudge.confidence import Confidence +from alphajudge.meta_score import interface_meta_score +from alphajudge.parsers.af3 import AF3Parser +from alphajudge.runner import process + + +def _write_run(tmp_path: Path, chain_order=("A", "L", "B")): + """Two contacting proteins and an atom-tokenized ligand, with asymmetric PAE.""" + run_dir = tmp_path / "mixed" + model_dir = run_dir / "seed-1_sample-0" + model_dir.mkdir(parents=True) + structure = Structure.Structure("mixed") + model = Model.Model(0) + structure.add(model) + token_chains, token_resids, protein_indices = [], [], [] + for chain_id in chain_order: + chain = Chain.Chain(chain_id) + model.add(chain) + for number in range(1, 2 if chain_id == "L" else 3): + ligand = chain_id == "L" + residue = Residue.Residue( + ("H_LIG" if ligand else " ", number, " "), + "LIG" if ligand else "ALA", " ", + ) + chain.add(residue) + for atom_name in (["C1", "C2", "C3"] if ligand else ["CA"]): + residue.add(Atom.Atom( + atom_name, np.array([number * 2., 3. if chain_id == "B" else 0., 0.]), + 90., 1., " ", atom_name, len(token_chains) + 1, element="C", + )) + if not ligand: + protein_indices.append(len(token_chains)) + token_chains.append(chain_id) + token_resids.append(number) + writer = MMCIFIO() + writer.set_structure(structure) + writer.save(str(model_dir / "model.cif")) + n = len(token_chains) + pae = np.arange(n * n, dtype=float).reshape(n, n) / 2 + matrix = { + "pae": pae.tolist(), "contact_probs": (pae / (n * n)).tolist(), + "token_chain_ids": token_chains, "token_res_ids": token_resids, + } + summary = { + "iptm": 0.4, "ptm": 0.6, "ranking_score": 0.5, + "chain_pair_iptm": [[0.9, 0.12, 0.83], [0.12, 0.7, 0.34], [0.83, 0.34, 0.8]], + } + (model_dir / "confidences.json").write_text(json.dumps(matrix)) + (model_dir / "summary_confidences.json").write_text(json.dumps(summary)) + (run_dir / "ranking_scores.csv").write_text("seed,sample,ranking_score\n1,0,0.5\n") + return run_dir, matrix, protein_indices + + +@pytest.mark.parametrize("chain_order", [("A", "L", "B"), ("L", "A", "B"), ("A", "B", "L")]) +def test_af3x_parser_preserves_residue_pae_and_contact_probs(tmp_path, chain_order): + run_dir, matrix, keep = _write_run(tmp_path, chain_order) + _, conf = AF3Parser().parse_run(run_dir).load_model("seed-1_sample-0") + np.testing.assert_array_equal(conf.pae_matrix, np.asarray(matrix["pae"])[np.ix_(keep, keep)]) + np.testing.assert_array_equal(conf.contact_prob_matrix, np.asarray(matrix["contact_probs"])[np.ix_(keep, keep)]) + + +def test_af3x_unmappable_pae_is_rejected_instead_of_minimum_filled(tmp_path): + run_dir, matrix, _ = _write_run(tmp_path) + matrix["token_res_ids"][0] = 999 + path = run_dir / "seed-1_sample-0/confidences.json" + path.write_text(json.dumps(matrix)) + with pytest.raises(ValueError, match="align.*PAE|PAE.*align"): + AF3Parser().parse_run(run_dir).load_model("seed-1_sample-0") + + +def test_af3x_missing_residue_ids_with_extra_same_chain_tokens_is_rejected(tmp_path): + run_dir, matrix, _ = _write_run(tmp_path) + matrix.pop("token_res_ids") + matrix["token_chain_ids"] = ["A"] * 5 + ["B"] * 2 + (run_dir / "seed-1_sample-0/confidences.json").write_text(json.dumps(matrix)) + with pytest.raises(ValueError, match="align.*PAE|PAE.*align"): + AF3Parser().parse_run(run_dir).load_model("seed-1_sample-0") + + +def test_af3x_summary_minima_cannot_replace_missing_full_pae(tmp_path, caplog): + run_dir, _, _ = _write_run(tmp_path) + model_dir = run_dir / "seed-1_sample-0" + (model_dir / "confidences.json").unlink() + summary = json.loads((model_dir / "summary_confidences.json").read_text()) + summary["chain_pair_pae_min"] = [[1.] * 3] * 3 + (model_dir / "summary_confidences.json").write_text(json.dumps(summary)) + with pytest.raises(ValueError, match="residue-level PAE"): + AF3Parser().parse_run(run_dir).load_model("seed-1_sample-0") + output = process(str(run_dir), 8., 100., "best", skip_pae_png=True, skip_biophysical_scores=True) + assert output.read_text() == "" + assert "residue-level PAE" in caplog.text + + +@pytest.mark.parametrize("field", ["pae", "predicted_aligned_error"]) +def test_plain_af3_pae_is_unchanged_and_token_permutations_are_aligned(tmp_path, field): + run_dir, matrix, _ = _write_run(tmp_path, ("A", "B")) + expected = np.asarray(matrix.pop("pae")) + matrix[field] = expected.tolist() + model_dir = run_dir / "seed-1_sample-0" + summary = json.loads((model_dir / "summary_confidences.json").read_text()) + summary["chain_pair_iptm"] = [[.9, .83], [.83, .8]] + (model_dir / "summary_confidences.json").write_text(json.dumps(summary)) + for order in [[0, 1, 2, 3], [2, 3, 0, 1]]: + permuted = {**matrix, field: expected[np.ix_(order, order)].tolist(), + "token_chain_ids": [matrix["token_chain_ids"][i] for i in order], + "token_res_ids": [matrix["token_res_ids"][i] for i in order]} + (model_dir / "confidences.json").write_text(json.dumps(permuted)) + _, conf = AF3Parser().parse_run(run_dir).load_model("seed-1_sample-0") + np.testing.assert_array_equal(conf.pae_matrix, expected) + + +@pytest.mark.parametrize("residue_ids", [None, "token_residue_ids"]) +def test_af3x_legacy_chain_only_and_alternate_residue_ids(tmp_path, residue_ids): + run_dir, matrix, keep = _write_run(tmp_path) + ids = matrix.pop("token_res_ids") + if residue_ids: + matrix[residue_ids] = ids + (run_dir / "seed-1_sample-0/confidences.json").write_text(json.dumps(matrix)) + _, conf = AF3Parser().parse_run(run_dir).load_model("seed-1_sample-0") + np.testing.assert_array_equal(conf.pae_matrix, np.asarray(matrix["pae"])[np.ix_(keep, keep)]) + + +@pytest.mark.parametrize("bad_pae", [[1., 2.], [[1., 2.]], [], [[float("nan")]*7]*7]) +def test_af3x_malformed_pae_fails_explicitly(tmp_path, bad_pae): + run_dir, matrix, _ = _write_run(tmp_path) + matrix["pae"] = bad_pae + (run_dir / "seed-1_sample-0/confidences.json").write_text(json.dumps(matrix)) + with pytest.raises(ValueError, match="PAE"): + AF3Parser().parse_run(run_dir).load_model("seed-1_sample-0") + + +def test_af3x_duplicate_scored_residue_ids_are_rejected(tmp_path): + run_dir, matrix, _ = _write_run(tmp_path) + matrix["token_chain_ids"][2] = "A" + matrix["token_res_ids"][2] = 1 + (run_dir / "seed-1_sample-0/confidences.json").write_text(json.dumps(matrix)) + with pytest.raises(ValueError, match="unambiguously"): + AF3Parser().parse_run(run_dir).load_model("seed-1_sample-0") + + +@pytest.mark.parametrize("chain_order", [("A", "L", "B"), ("L", "A", "B"), ("A", "B", "L")]) +def test_af3x_pair_iptm_follows_summary_chain_order(tmp_path, chain_order): + run_dir, _, _ = _write_run(tmp_path, chain_order) + structure, conf = AF3Parser().parse_run(run_dir).load_model("seed-1_sample-0") + interface = Complex(structure, conf, 8., 100.).interfaces[0] + summary = json.loads((run_dir / "seed-1_sample-0/summary_confidences.json").read_text()) + assert interface.iptm_chainpair == summary["chain_pair_iptm"][chain_order.index("A")][chain_order.index("B")] + + +def test_af3x_pair_iptm_with_wrong_dimensions_is_dropped(tmp_path, caplog): + run_dir, _, _ = _write_run(tmp_path) + path = run_dir / "seed-1_sample-0/summary_confidences.json" + summary = json.loads(path.read_text()) + summary["chain_pair_iptm"] = [[.9, .83], [.83, .8]] + path.write_text(json.dumps(summary)) + structure, conf = AF3Parser().parse_run(run_dir).load_model("seed-1_sample-0") + assert conf.chain_pair_iptm is None + assert Complex(structure, conf, 8., 100.).interfaces[0].iptm_chainpair is None + assert "chain_pair_iptm dimensions" in caplog.text + + +def test_confidence_pair_iptm_reads_recorded_or_default_chain_order(): + base = dict(pae_matrix=np.zeros((1, 1)), max_pae=0., iptm=None, ptm=None, iptm_ptm=None, + confidence_score=None, plddt_residue=[]) + matrix = [[.9, .2, .6], [.2, .8, .3], [.6, .3, .7]] + recorded = Confidence(**base, chain_pair_iptm=matrix, chain_pair_iptm_chain_ids=["L", "A", "B"]) + assert recorded.pair_iptm("A", "B", ["A", "B"]) == .3 + positional = Confidence(**base, chain_pair_iptm=matrix) + assert positional.pair_iptm("A", "B", ["A", "B"]) == .2 + assert positional.pair_iptm("A", "X", ["A", "B"]) is None + ragged = Confidence(**base, chain_pair_iptm=[[.9], [.4, .8]]) + assert ragged.pair_iptm("A", "B", ["A", "B"]) == .4 + missing = Confidence(**base, chain_pair_iptm=[[.9, None], [None, .8]]) + assert missing.pair_iptm("A", "B", ["A", "B"]) is None + + +@pytest.mark.parametrize("chain_order, scope", [ + (("A", "L", "B"), "includes_excluded_tokens"), + (("A", "B"), "scored_residues"), +]) +def test_af3_global_confidence_scope_reports_excluded_tokens(tmp_path, chain_order, scope): + run_dir, _, _ = _write_run(tmp_path, chain_order) + _, conf = AF3Parser().parse_run(run_dir).load_model("seed-1_sample-0") + assert conf.global_confidence_scope == scope + + +def test_af3x_runner_preserves_global_values_but_excludes_them_from_metascore(tmp_path): + run_dir, _, _ = _write_run(tmp_path) + path = process(str(run_dir), 8., 100., "best", skip_pae_png=True, skip_biophysical_scores=True) + with path.open() as fh: + row = next(csv.DictReader(fh)) + assert row["global_confidence_scope"] == "includes_excluded_tokens" + assert row["iptm_scope"] == "chain_pair" + assert float(row["iptm"]) == 0.83 + assert float(row["ptm"]) == 0.6 + assert float(row["iptm_ptm"]) == pytest.approx(0.44) + assert float(row["confidence_score"]) == 0.5 + without_global = {k: v for k, v in row.items() if k != "confidence_score"} + assert float(row["interface_meta_score"]) == pytest.approx(interface_meta_score(without_global)) + + +def test_mixed_token_metascore_excludes_global_iptm_fallback(): + row = {"model_used": "seed-1_sample-0", "interface_LIS": .3, + "confidence_score": .9, "iptm": .9, "iptm_scope": "global", + "global_confidence_scope": "includes_excluded_tokens"} + expected = interface_meta_score({"model_used": row["model_used"], "interface_LIS": .3}) + assert interface_meta_score(row) == expected + row["iptm_scope"] = "chain_pair" + assert interface_meta_score(row) != expected + + +def test_mixed_token_report_does_not_show_global_confidence_percentile(): + from alphajudge.report import _feature_view, _row_meta_score + row = {"model_used": "seed-1_sample-0", "interface_LIS": .3, "confidence_score": .9, + "global_confidence_scope": "includes_excluded_tokens"} + assert _feature_view(row)["confidence_score"] == (.9, None) + assert _row_meta_score(row) == interface_meta_score({"model_used": row["model_used"], "interface_LIS": .3}) + + +def test_af3x_invalid_pair_iptm_uses_labelled_global_fallback(tmp_path, caplog): + run_dir, _, _ = _write_run(tmp_path) + path = run_dir / "seed-1_sample-0/summary_confidences.json" + summary = json.loads(path.read_text()) + summary["chain_pair_iptm"] = [[.9, .83], [.83, .8]] + path.write_text(json.dumps(summary)) + output = process(str(run_dir), 8., 100., "best", skip_pae_png=True, skip_biophysical_scores=True) + with output.open() as fh: + row = next(csv.DictReader(fh)) + assert row["iptm_scope"] == "global" + assert float(row["iptm"]) == .4 + assert "chain_pair_iptm dimensions" in caplog.text + expected = {k: v for k, v in row.items() if k not in {"confidence_score", "iptm"}} + assert float(row["interface_meta_score"]) == pytest.approx(interface_meta_score(expected)) + + +def test_af3x_report_does_not_restore_stale_metascore(): + from alphajudge.report import _row_meta_score + assert _row_meta_score({"confidence_score": .9, "interface_meta_score": .9, + "global_confidence_scope": "includes_excluded_tokens"}) is None + + +def test_plain_af3_global_confidence_still_contributes_to_metascore(): + row = {"model_used": "seed-1_sample-0", "interface_LIS": .3, "confidence_score": .9} + assert interface_meta_score({**row, "global_confidence_scope": "scored_residues"}) == interface_meta_score(row) + assert interface_meta_score(row) != interface_meta_score({"model_used": row["model_used"], "interface_LIS": .3}) + + +def test_cached_scores_without_scope_metadata_are_recomputed(tmp_path, monkeypatch): + from alphajudge import runner + stale = tmp_path / "interfaces.csv" + stale.write_text("jobs,interface_ccc,interface_expected_contacts\nold,1,2\n") + calls = [] + + def recompute(directory, *args, **kwargs): + calls.append(directory) + stale.write_text( + "jobs,interface_ccc,interface_expected_contacts,global_confidence_scope,iptm_scope\n" + "new,1,2,includes_excluded_tokens,chain_pair\n" + ) + return stale + + monkeypatch.setattr(runner, "process", recompute) + for _ in range(2): + _, rows = runner._process_one_run( + str(tmp_path), contact_thresh=8., pae_filter=100., models_to_analyse="best", + summary_csv="summary.csv", ipsae_pae_cutoff=10., force_recompute=False, + per_run_csv_name="interfaces.csv", skip_pae_png=True, skip_biophysical_scores=True, + ) + assert rows[0]["jobs"] == "new" + assert calls == [str(tmp_path)] + + +@pytest.mark.parametrize("ligand_first", [False, True]) +def test_real_af3x_prediction_matches_raw_confidences(tmp_path, ligand_first): + """A fresh AF3x inference, plus a reordered copy, guards the complete path.""" + fixture = Path(__file__).parent / "fixtures" / "af3x_4g3y_bc_dsso" + run_dir = tmp_path / "af3x" + shutil.copytree(fixture, run_dir) + model_dir = run_dir / "seed-30_sample-0" + with lzma.open(model_dir / "confidences.json.xz", "rt") as fh: + raw = json.load(fh) + summary_path = model_dir / "summary_confidences.json" + summary = json.loads(summary_path.read_text()) + chain_ids = list(dict.fromkeys(raw["token_chain_ids"])) + assert len(chain_ids) == 3 + if ligand_first: + # Reorder the confidence tensors and their summary consistently. The + # structure keeps its original order, so positional ipTM lookup fails. + chain_order = [2, 0, 1] + token_order = [i for c in chain_order for i, cid in enumerate(raw["token_chain_ids"]) + if cid == chain_ids[c]] + for key in ["pae", "contact_probs"]: + raw[key] = np.asarray(raw[key])[np.ix_(token_order, token_order)].tolist() + for key in ["token_chain_ids", "token_res_ids"]: + raw[key] = [raw[key][i] for i in token_order] + summary["chain_pair_iptm"] = np.asarray(summary["chain_pair_iptm"])[np.ix_(chain_order, chain_order)].tolist() + with lzma.open(model_dir / "confidences.json.xz", "wt") as fh: + json.dump(raw, fh) + summary_path.write_text(json.dumps(summary)) + chain_ids = [chain_ids[i] for i in chain_order] + + structure, confidence = AF3Parser().parse_run(run_dir).load_model("seed-30_sample-0") + # Independently extract the protein block from AF3x's original token matrix. + lookup = {(c, r): i for i, (c, r) in enumerate(zip(raw["token_chain_ids"], raw["token_res_ids"])) + if c in {"B", "C"}} + keep = [lookup[(chain, residue)] for chain, length in [("B", 226), ("C", 158)] + for residue in range(1, length + 1)] + expected_pae = np.asarray(raw["pae"])[np.ix_(keep, keep)] + expected_contacts = np.asarray(raw["contact_probs"])[np.ix_(keep, keep)] + assert len(raw["pae"]) > len(keep) == 384 + assert np.unique(expected_pae[:226, 226:]).size > 10 + np.testing.assert_array_equal(confidence.pae_matrix, expected_pae) + np.testing.assert_array_equal(confidence.contact_prob_matrix, expected_contacts) + assert confidence.global_confidence_scope == "includes_excluded_tokens" + complex_ = Complex(structure, confidence, 8., 100.) + assert len(complex_.interfaces) == 1 + interface = complex_.interfaces[0] + assert interface.iptm_chainpair == summary["chain_pair_iptm"][chain_ids.index("B")][chain_ids.index("C")] + + output = process(str(run_dir), 8., 100., "best", skip_pae_png=True, skip_biophysical_scores=True) + with output.open() as fh: + rows = list(csv.DictReader(fh)) + assert len(rows) == 1 + row = rows[0] + assert row["interface"] == "B_C" + assert row["iptm_scope"] == "chain_pair" + assert float(row["iptm"]) == interface.iptm_chainpair + assert float(row["confidence_score"]) == summary["ranking_score"] + token_pae = np.asarray(raw["pae"]) + contact_paes = [] + for res1, res2 in interface._pairs: + i = lookup[(res1.get_parent().id, res1.id[1])] + j = lookup[(res2.get_parent().id, res2.id[1])] + contact_paes.extend([token_pae[i, j], token_pae[j, i]]) + assert float(row["average_interface_pae"]) == pytest.approx(np.mean(contact_paes)) + assert float(row["interface_pDockQ2"]) == pytest.approx(interface.pDockQ2()[0]) + assert float(row["interface_ipSAE"]) == pytest.approx(interface.ipsae()) + assert float(row["interface_LIS"]) == pytest.approx(interface.lis()) + assert float(row["interface_ccc"]) == interface.ccc + assert float(row["interface_meta_score"]) == pytest.approx(interface_meta_score( + {k: v for k, v in row.items() if k != "confidence_score"} + )) + + +def test_af3_per_atom_modified_residue_uses_its_ca_token(tmp_path): + """AF3 tokenizes a modified residue per atom; its CA token carries the PAE.""" + run_dir, _, _ = _write_run(tmp_path, ("A", "B")) + model_dir = run_dir / "seed-1_sample-0" + structure, _ = AF3Parser().parse_run(run_dir).load_model("seed-1_sample-0") + chain = structure[0]["A"] + ca = chain[2]["CA"] + chain.detach_child(chain[2].id) + phosphoserine = Residue.Residue(("H_SEP", 2, " "), "SEP", " ") + atom_names = ["N", "CA", "C", "O", "CB", "OG", "P"] + for k, name in enumerate(atom_names): + phosphoserine.add(Atom.Atom(name, ca.coord + k * .3, 90., 1., " ", name, 100 + k, element=name[0])) + chain.add(phosphoserine) + writer = MMCIFIO() + writer.set_structure(structure) + writer.save(str(model_dir / "model.cif")) + token_chains = ["A"] * (1 + len(atom_names)) + ["B", "B"] + token_resids = [1] + [2] * len(atom_names) + [1, 2] + n = len(token_chains) + pae = np.arange(n * n, dtype=float).reshape(n, n) / 2 + (model_dir / "confidences.json").write_text(json.dumps( + {"pae": pae.tolist(), "token_chain_ids": token_chains, "token_res_ids": token_resids} + )) + _, conf = AF3Parser().parse_run(run_dir).load_model("seed-1_sample-0") + keep = [0, 1 + atom_names.index("CA"), n - 2, n - 1] + np.testing.assert_array_equal(conf.pae_matrix, pae[np.ix_(keep, keep)]) diff --git a/test/test_biophysics.py b/test/test_biophysics.py index 92574eb1..98913624 100644 --- a/test/test_biophysics.py +++ b/test/test_biophysics.py @@ -74,3 +74,26 @@ def test_pisa_style_buried_surface_area_is_positive_for_contacting_atoms(): ) assert buried_surface_area(residues_a, residues_b) > 0.0 + + +def test_interface_cache_distinguishes_models_with_identical_backbone_starts(): + """Two models of a chain pair whose residues start at the same N atoms are + still different structures; the cached ProSurf result must not be reused.""" + import copy + + from Bio.PDB import PDBParser + + from alphajudge.biophysics import buried_surface_area + + path = "test_data/af2/pos_dimers/Q9BUL8+Q13033/ranked_0.pdb" + structure = PDBParser(QUIET=True).get_structure("complex", path) + moved = copy.deepcopy(structure) + chain1, chain2 = (chain.id for chain in structure[0]) + for residue in moved[0][chain2]: + for atom in list(residue)[1:]: # keep each residue's first atom in place + atom.coord = atom.coord + 50.0 + + original = buried_surface_area(list(structure[0][chain1]), list(structure[0][chain2])) + shifted = buried_surface_area(list(moved[0][chain1]), list(moved[0][chain2])) + assert original > 100.0 + assert shifted < original diff --git a/test/test_boltz.py b/test/test_boltz.py new file mode 100644 index 00000000..d2ab92fd --- /dev/null +++ b/test/test_boltz.py @@ -0,0 +1,101 @@ +"""Boltz-2 confidence arrays are aligned to scored residues by token, not position.""" +from __future__ import annotations + +import csv +import json +from pathlib import Path + +import numpy as np +import pytest +from Bio.PDB import Atom, Chain, MMCIFIO, Model, Residue, Structure + +from alphajudge.parsers.boltz import Boltz2Parser +from alphajudge.runner import process + +MODEL = "toy_model_0" + + +def _write_run(tmp_path: Path, chain_order: tuple[str, ...]) -> tuple[Path, list[int], list[str]]: + """Two contacting two-residue proteins (A, B) and a three-atom ligand (L). + + Boltz-2 gives each standard residue one token and each ligand atom one + token, chain by chain, so the ligand's position in ``chain_order`` decides + where the protein tokens sit in the PAE and pLDDT arrays. + """ + run_dir = tmp_path / "boltz" + run_dir.mkdir() + structure = Structure.Structure("toy") + model = Model.Model(0) + structure.add(model) + protein_tokens, serial = [], 1 + for chain_id in chain_order: + chain = Chain.Chain(chain_id) + model.add(chain) + if chain_id == "L": + residue = Residue.Residue(("H_LIG", 1, " "), "LIG", " ") + chain.add(residue) + for k, name in enumerate(("C1", "C2", "O1")): + residue.add(Atom.Atom(name, np.array([20.0 + k, 20.0, 20.0]), 50.0, 1.0, " ", + name, serial, element=name[0])) + serial += 1 + continue + for number in (1, 2): + residue = Residue.Residue((" ", number, " "), "ALA", " ") + chain.add(residue) + y = 0.0 if chain_id == "A" else 5.0 + for name, dx in (("CA", 0.0), ("CB", 0.5)): + residue.add(Atom.Atom(name, np.array([3.8 * number + dx, y, 0.0]), 80.0, 1.0, " ", + name, serial, element="C")) + serial += 1 + n_tokens = 0 + for chain_id in chain_order: + size = 3 if chain_id == "L" else 2 + if chain_id != "L": + protein_tokens.extend(range(n_tokens, n_tokens + size)) + n_tokens += size + + writer = MMCIFIO() + writer.set_structure(structure) + writer.save(str(run_dir / f"{MODEL}.cif")) + pae = np.arange(n_tokens * n_tokens, dtype=float).reshape(n_tokens, n_tokens) / 4 + np.savez(run_dir / f"pae_{MODEL}.npz", pae=pae) + np.savez(run_dir / f"plddt_{MODEL}.npz", plddt=np.linspace(0.5, 0.9, n_tokens)) + pair = {str(i): {str(j): round(0.1 * (i + 1) + 0.01 * (j + 1), 3) for j in range(3)} for i in range(3)} + (run_dir / f"confidence_{MODEL}.json").write_text(json.dumps( + {"iptm": 0.4, "ptm": 0.6, "confidence_score": 0.5, "pair_chains_iptm": pair} + )) + return run_dir, protein_tokens, list(chain_order) + + +@pytest.mark.parametrize("chain_order", [("A", "B", "L"), ("L", "A", "B"), ("A", "L", "B")]) +def test_boltz2_arrays_follow_structure_tokens(tmp_path, chain_order): + run_dir, keep, order = _write_run(tmp_path, chain_order) + _, conf = Boltz2Parser().parse_run(run_dir).load_model(MODEL) + + pae = np.load(run_dir / f"pae_{MODEL}.npz")["pae"] + plddt = np.load(run_dir / f"plddt_{MODEL}.npz")["plddt"] + np.testing.assert_array_equal(conf.pae_matrix, pae[np.ix_(keep, keep)]) + np.testing.assert_array_equal(conf.plddt_residue, plddt[keep]) + + pair = json.loads((run_dir / f"confidence_{MODEL}.json").read_text())["pair_chains_iptm"] + expected = pair[str(order.index("A"))][str(order.index("B"))] + assert conf.pair_iptm("A", "B", ["A", "B"]) == expected + + out = process(str(run_dir), 8.0, 100.0, "best", skip_pae_png=True, skip_biophysical_scores=True) + with out.open() as fh: + (row,) = list(csv.DictReader(fh)) + assert row["interface"] == "A_B" + assert row["iptm_scope"] == "chain_pair" + assert float(row["iptm"]) == pytest.approx(expected) + + +def test_boltz2_pair_iptm_with_wrong_dimensions_is_dropped(tmp_path, caplog): + run_dir, _, _ = _write_run(tmp_path, ("L", "A", "B")) + confidence = run_dir / f"confidence_{MODEL}.json" + payload = json.loads(confidence.read_text()) + payload["pair_chains_iptm"] = {"0": {"0": 0.9, "1": 0.2}, "1": {"0": 0.2, "1": 0.8}} + confidence.write_text(json.dumps(payload)) + + _, conf = Boltz2Parser().parse_run(run_dir).load_model(MODEL) + assert conf.chain_pair_iptm is None + assert "pair_chains_iptm dimensions" in caplog.text diff --git a/test/test_ccp4_biophysics_reference.py b/test/test_ccp4_biophysics_reference.py index c8ab35d6..00c796a6 100644 --- a/test/test_ccp4_biophysics_reference.py +++ b/test/test_ccp4_biophysics_reference.py @@ -41,8 +41,9 @@ def test_pisa_area_and_bond_counts_against_ccp4_reference(reference: dict): pisa = reference["pisa"] assert buried_surface_area(residues1, residues2) == pytest.approx(pisa["area"], abs=0.1) + # PISA reports int_solv_en to three decimals. assert interface_solvation_energy(residues1, residues2) == pytest.approx( - pisa["int_solv_en"], abs=1.2 + pisa["int_solv_en"], abs=1e-3 ) assert salt_bridges(residues1, residues2) == pisa["sb"] assert disulfide_bonds(residues1, residues2) == pisa["ss"] diff --git a/test/test_parsers_and_runner.py b/test/test_parsers_and_runner.py index f076941f..89a4d4ad 100644 --- a/test/test_parsers_and_runner.py +++ b/test/test_parsers_and_runner.py @@ -4,6 +4,7 @@ import gzip import json import logging +import lzma import math import pickle import shutil @@ -14,7 +15,7 @@ import numpy as np import pytest -from alphajudge.parsers import pick_parser +from alphajudge.parsers import BaseParser, pick_parser from alphajudge.parsers.af2 import AF2Parser from alphajudge.parsers.af3 import AF3Parser from alphajudge.contact_probs import contact_probs_from_distogram @@ -33,6 +34,8 @@ "iptm", "ptm", "confidence_score", + "global_confidence_scope", + "iptm_scope", "pDockQ/mpDockQ", "average_interface_pae", "interface_average_plddt", @@ -66,6 +69,8 @@ "model_used", "interface", "interface_contact_prob_source", + "global_confidence_scope", + "iptm_scope", } @@ -572,7 +577,7 @@ def test_af3_job_prefix_from_ranking_file_handles_plain_prefixed_and_weird(): ) -def test_af3_pae_shape_warns_but_unknown_schema_raises(caplog: pytest.LogCaptureFixture): +def test_af3_pae_shape_mismatch_and_unknown_schema_raise(): class Chain: def __init__(self, chain_id: str): self.id = chain_id @@ -580,19 +585,12 @@ def __init__(self, chain_id: str): chains = [Chain("A"), Chain("B")] cid = {"A": [0], "B": [1]} - caplog.set_level(logging.WARNING, logger="alphajudge.parsers.af3") - pae, max_pae = AF3Parser._normalize_pae_af3( - {"predicted_aligned_error": [[3.0]], "max_predicted_aligned_error": 3.0}, - chains, - cid, - ) - - assert pae.shape == (2, 2) - assert np.all(pae == 100.0) - assert max_pae == 3.0 - assert "predicted_aligned_error shape" in caplog.text - - caplog.clear() + with pytest.raises(ValueError, match="Cannot align AF3 PAE"): + AF3Parser._normalize_pae_af3( + {"predicted_aligned_error": [[3.0]], "max_predicted_aligned_error": 3.0}, + chains, + cid, + ) with pytest.raises(ValueError, match="unknown AF3 confidences schema"): AF3Parser._normalize_pae_af3({"unexpected_schema": True}, chains, cid) @@ -674,14 +672,12 @@ def residue(chain: Chain, resseq: int, serial: int) -> None: residue(chain_b, 1, 3) token_matrix = np.arange(16, dtype=float).reshape(4, 4) - aligned = AF3Parser._align_token_pair_matrix_to_residues( - token_matrix, - ["A", "A", "A", "B"], - [1, 99, 2, 1], + residue_tokens = AF3Parser._residue_tokens_af3( + {"token_chain_ids": ["A", "A", "A", "B"], "token_res_ids": [1, 99, 2, 1]}, [chain_a, chain_b], {"A": [0, 1], "B": [2]}, - (3, 3), ) + aligned = residue_tokens.select(token_matrix) assert aligned is not None expected = token_matrix[np.ix_([0, 2, 3], [0, 2, 3])] @@ -1081,12 +1077,6 @@ def test_cli_recursive_single_directory_root(tmp_path: Path, af2_dir_src: Path): # Compressed-confidences reading (AlphaPulldown slim/minimal storage modes) # ------------------------- -import gzip -import lzma - -from alphajudge.parsers import BaseParser - - def test_read_json_reads_plain_xz_and_gz(tmp_path): payload = {"a": 1, "pae": [[0.0, 1.0], [1.0, 0.0]]} plain = tmp_path / "confidences.json" @@ -1277,3 +1267,35 @@ def test_confident_contacts_boundary_convention_is_selectable(): rep = ContactGeometry.REPRESENTATIVE_ATOM assert iface.confident_contacts(geometry=rep) == 0 # strict assert iface.confident_contacts(geometry=rep, inclusive=True) == 1 # inclusive + + +# ------------------------- +# AF3 model discovery and ranking +# ------------------------- + +@pytest.mark.parametrize("invalid_score", ["", "nan", "invalid", "inf", "-inf", "1e309", "-1e309"]) +def test_af3_ranking_order_puts_invalid_scores_last(tmp_path, invalid_score): + ranking = tmp_path / "ranking_scores.csv" + ranking.write_text( + "seed,sample,ranking_score\n" + f"1,0,{invalid_score}\n1,1,-0.4\n1,2,nan\n1,3,0.9\n1,4,0.6\n" + ) + order, scores = AF3Parser._read_csv_order(ranking) + assert order[:3] == ["seed-1_sample-3", "seed-1_sample-4", "seed-1_sample-1"] + assert order[3:] == ["seed-1_sample-0", "seed-1_sample-2"] + assert scores == {"seed-1_sample-3": 0.9, "seed-1_sample-4": 0.6, "seed-1_sample-1": -0.4} + + +def test_af3_flat_layout_does_not_confuse_sample_1_with_sample_10(tmp_path): + for sample in (1, 10): + (tmp_path / f"job_seed-1_sample-{sample}_model.cif").write_text("") + found = AF3Parser._guess_af3_struct(tmp_path, "seed-1_sample-1", None, False) + assert Path(found).name == "job_seed-1_sample-1_model.cif" + + +def test_best_model_run_without_ranked_models_writes_explained_empty_csv(tmp_path, caplog): + (tmp_path / "ranking_scores.csv").write_text("seed,sample,ranking_score\n") + caplog.set_level(logging.WARNING, logger="alphajudge.runner") + out = process(str(tmp_path), 8.0, 100.0, "best", skip_pae_png=True, skip_biophysical_scores=True) + assert out.read_text() == "" + assert "no model could be loaded" in caplog.text diff --git a/test/test_report.py b/test/test_report.py index 69b266c2..0f651a83 100644 --- a/test/test_report.py +++ b/test/test_report.py @@ -151,3 +151,70 @@ def test_slider_rows_show_ccc_after_full_benchmark_calibration(): # An unknown feature must not raise either. rep._metric_rows_for_slider_panel( row, include_overall=False, groups=(("af", ("not_a_real_feature",)),)) + + +@pytest.fixture +def drawn_text(monkeypatch: pytest.MonkeyPatch) -> list[str]: + """Every string the report draws, in order.""" + from matplotlib.axes import Axes + from matplotlib.figure import Figure + + seen: list[str] = [] + for cls in (Axes, Figure): + def record(self, x, y, s, *args, _original=cls.text, **kwargs): + seen.append(str(s)) + return _original(self, x, y, s, *args, **kwargs) + + monkeypatch.setattr(cls, "text", record) + return seen + + +def test_find_pae_png_tolerates_empty_and_glob_special_model_names(tmp_path: Path) -> None: + from alphajudge.report import _find_pae_png + + (tmp_path / "other_m1.png").write_bytes(b"") + # "[1]" is a character class to glob; the model name must match literally. + assert _find_pae_png(tmp_path, "m[1]") is None + (tmp_path / "pae_m[1].png").write_bytes(b"") + assert _find_pae_png(tmp_path, "m[1]") == tmp_path / "pae_m[1].png" + + # An empty model name used to raise ValueError ("**" glob) on Python < 3.13. + assert _find_pae_png(tmp_path, "") is None + fallback = tmp_path / "job_PAE_plot_ranked_0.png" + fallback.write_bytes(b"") + assert _find_pae_png(tmp_path, "") == fallback + + +def test_per_run_report_text_counts_features_and_numbers_appendices( + tmp_path: Path, drawn_text: list[str] +) -> None: + from alphajudge.meta_score import META_SCORE_FEATURES + + rows = [ + dict(_BASE_ROW), + {**_BASE_ROW, "interface": "A_C", "interface_LIS": "0.10"}, + {**_BASE_ROW, "model_used": "model_2_multimer_v3_pred_0", "interface_LIS": "0.05", + "iptm": "0.20"}, + ] + _write_csv(tmp_path / "interfaces.csv", rows) + assert generate_per_run_report(tmp_path) is not None + + assert any(f"across the {len(META_SCORE_FEATURES)} metascore features" in t for t in drawn_text) + assert "A.1" in drawn_text + assert "Appendix – model model_2_multimer_v3_pred_0" in drawn_text + + +def test_aggregate_cover_median_averages_the_middle_pair(tmp_path: Path, drawn_text: list[str]) -> None: + from alphajudge import report as rep + + rows = [ + {**_BASE_ROW, "jobs": f"JOB_{k}", "interface_LIS": lis} + for k, lis in enumerate(("0.05", "0.30", "0.55", "0.75")) + ] + summary = tmp_path / "summary.csv" + _write_csv(summary, rows) + assert generate_aggregate_report(summary, out_pdf=tmp_path / "agg.pdf") is not None + + scores = sorted(rep._row_meta_score(r) for r in rows) + median = (scores[1] + scores[2]) / 2 + assert f"median = {median:.3f}" in drawn_text