ó
´™xTc           @   s*  d  d l  m Z d  d l m Z d  d l m Z d  d l m Z d  d l m	 Z
 d  d l m Z m Z d  d l Z d  d l Z d e f d	 „  ƒ  YZ d
 e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d „  Z d „  Z d „  Z d „  Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d S(   iÿÿÿÿ(   t   division(   t   backbone(   t   flex(   t   col(   t   format_value(   t   Autot   slots_getstate_setstateNt   residue_group_proxyc           B   s;   e  Z d  Z d d d d g Z d „  Z d „  Z d „  Z RS(   s;   Pickle-able stand-in for iotbx.pdb.hierarchy.residue_group.t   resseqt   icodet   _atom_groupst   _id_strc         C   sa   | j  |  _  | j |  _ | j ƒ  |  _ g  |  _ x* | j ƒ  D] } |  j j t | ƒ ƒ q= Wd  S(   N(   R   R	   t   id_strR   R
   t   atom_groupst   appendt   atom_group_proxy(   t   selft   residue_groupt   ag(    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyt   __init__   s    	c         C   s   |  j  S(   N(   R   (   R   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyR      s    c         C   s   |  j  S(   N(   R
   (   R   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyR      s    (   t   __name__t
   __module__t   __doc__t	   __slots__R   R   R   (    (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyR      s
   		R   c           B   s/   e  Z d  Z d d d g Z d „  Z d „  Z RS(   s8   Pickle-able stand-in for iotbx.pdb.hierarchy.atom_group.t   resnamet   altloct   _atomsc         C   s1   | j  |  _  | j |  _ t | j ƒ  ƒ |  _ d  S(   N(   R   R   t   atoms_proxyt   atomsR   (   R   t
   atom_group(    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyR   #   s    c         C   s   |  j  S(   N(   R   (   R   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyR   (   s    (   R   R   R   R   R   R   (    (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyR       s   	R   c           B   s;   e  Z d  Z d g Z d „  Z d „  Z d „  Z d „  Z RS(   sh   
  Pickle-able stand-in for af::shared<atom> array, using the atom_with_labels
  objects as elements.
  R   c         C   s&   g  | D] } | j  ƒ  ^ q |  _ d  S(   N(   t   fetch_labelsR   (   R   R   t   a(    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyR   1   s    c         C   s   |  j  | S(   N(   R   (   R   t   idx(    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyt   __getitem__4   s    c         C   s&   t  j g  |  j D] } | j ^ q ƒ S(   N(   R   t   doubleR   t   occ(   R   R   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyt   extract_occ7   s    c         C   s&   t  j g  |  j D] } | j ^ q ƒ S(   N(   R   R"   R   t   b(   R   R   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyt	   extract_b:   s    (   R   R   R   R   R   R!   R$   R&   (    (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyR   +   s   				t   disordered_segmentc           B   sø   e  Z d  Z d „  Z d „  Z d e j d „ Z d d „ Z e	 e	 d d „ Z
 d	 „  Z d
 „  Z d „  Z e	 d „ Z d „  Z d „  Z d „  Z d d „ Z e d d „ Z d d „ Z d d „ Z d „  Z d d „ Z d d „ Z d „  Z d „  Z RS(   se   
  A group of one or more adjacent residues presumed to form continuous
  alternate conformations.
  c         C   s>   g  |  _  i  |  _ i  |  _ i  |  _ g  |  _ |  j | ƒ d  S(   N(   t   residue_groupst   outlierst   rotamerst   ramachandrant   backrubst   append_residue_group(   R   R   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyR   B   s    					c         C   sO   |  j  ƒ  d k r# |  j d j ƒ  Sd |  j d j ƒ  |  j d j ƒ  f Sd  S(   Ni   i    s	   %s --> %siÿÿÿÿ(   t
   n_residuesR(   R   (   R   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyt   __str__J   s    t    c         C   sš  |  j  ƒ  d k r@ | | d |  j d j ƒ  |  j ƒ  f IJnD | | d |  j  ƒ  |  j d j ƒ  |  j d j ƒ  |  j ƒ  f IJxt |  j ƒ D]þ\ } } | | d | j ƒ  IJx| j ƒ  D]} d  } } x? |  j j | j ƒ  g  ƒ D]" } | j	 | j	 k rñ | } Pqñ qñ Wx? |  j
 j | j ƒ  g  ƒ D]" } | j	 | j	 k r3| } Pq3q3W| | d d | j	 | j t j | j ƒ  j ƒ  ƒ t d	 t | d
 d  ƒ ƒ t d	 t | d d  ƒ ƒ t | d d  ƒ f IJqÅ Wt |  j | ƒ d k r$x2 |  j | D]  }	 |	 j d | d | d ƒ qýWn  |  j | j ƒ  }
 t |
 ƒ d k rZ| | d IJn  x5 |
 D]- } | | d t | ƒ j t | ƒ f IJqaWq” Wd  S(   Ni   s&   Segment: 1 residue (%s), %d conformersi    s/   Segment: %d residues (%s --> %s), %d conformersiÿÿÿÿs     residue_group=%ss       s7   atom_group=%1s %3s  occ=%.2f phi=%-6s psi=%-6s rot=%-7ss   %.1ft   phit   psit   rotamer_namet   outt   prefixs        MolProbity outliers:s          %s: %s(   R.   R(   R   t   n_confst	   enumerateR   t   NoneR+   t   getR   R*   R   R   t   meanR   R$   t   fvt   getattrt   lenR,   t   showR)   t   typeR   t   str(   R   R5   R4   t   i_rest   rgR   t   ramat   rotat   ot   backrubR)   t   outlier(    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyR>   Q   sF    
$
!
""!i    c         C   s`   |  j  d } d } xF | j ƒ  D]8 } | j j ƒ  d k r  | | k rK | S| d 7} q  q  Wd  S(   Niÿÿÿÿi    R0   i   (   R(   R   R   t   stripR8   (   R   t   indexRB   t   i_groupR   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyt   get_previous_conformerw   s    g       @c         C   s¾  | j  ƒ  } t | ƒ d k s$ t ‚ t | ƒ t |  j d j  ƒ  ƒ k rV | sV t Sn  d } x[| D]S} | j d k rc | j ƒ  } |  j d | ƒ }	 |	 d	 k r² | s® t ‚ Pn  | d 7} |	 j | j k rÒ t S|	 j ƒ  }
 |
 d j	 | d j	 k r| st Sn  d
 \ } } x* |
 D]" } | j
 d k r| j } PqqWx* | D]" } | j
 d k rE| j } PqEqEW| d	 k sƒ| d	 k r‡t St t | ƒ t | ƒ ƒ } | | k r¶t Sqc qc Wt S(   s—  
    Determine whether a residue_group object is part of the same continuous
    disordered segment.  The precise meaning of this can be adjusted depending
    on user preferences; by default a continuous segment must have the same
    number of conformers for each residue, and occupancies must be constrained
    for each conformation.  The latter assumption will probably be violated
    most often.
    i   iÿÿÿÿi    R0   RI   i   s    C  s    N  N(   NN(   R   R=   t   AssertionErrorR(   t   FalseR   R   RK   R8   R#   t   namet   xyzt   absR   t   True(   R   t   othert   ignore_inconsistent_occupancyt    ignore_inconsistent_n_conformerst*   max_peptide_bond_distance_within_conformert   other_groupsRJ   R   t   other_atomst
   prev_groupt
   prev_atomst   curr_nt   prev_ct   atomt   dist(    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyt   is_part_of_segment‚   sF    %
		c         C   s<   |  j  j t | ƒ ƒ t j d | ƒ } |  j j | ƒ d  S(   NR   (   R(   R   R   R   t   find_backrubsR,   (   R   RB   t   rg_backrubs(    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyR-   ²   s    c         C   s†   g  } xy |  j  D]n } t g  | j ƒ  D] } | j j ƒ  ^ q& ƒ } t | ƒ d k r | j | j ƒ  t t	 | ƒ ƒ f ƒ q q W| S(   sG   
    Find any residue groups with heterogeneous chemical identity.
    i   (
   R(   t   setR   R   t   upperR=   R   R   t   sortedt   list(   R   t
   disorderedRB   R   t   resnames(    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyt   detect_sequence_disorder·   s    .,c         C   s   t  |  j ƒ S(   N(   R=   R(   (   R   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyR.   Â   s    c         C   s•   d } xˆ |  j  D]} } xt | j ƒ  D]f } | j j ƒ  d k r# | r{ x> | j ƒ  D]# } | j d k rQ | d 7} PqQ qQ Wn
 | d 7} Pq# q# Wq W| S(   sK   
    Count the number of residues where not all atoms have alternates.
    i    R0   s    CA i   (   R(   R   R   RH   R   RN   (   R   t   join_at_calphat	   n_partialR   R   R\   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyt   n_partial_splitsÅ   s    

c         C   sž   g  } x] |  j  D]R } | j d ƒ x< | j ƒ  D]. } | j j ƒ  d k r0 | d c d 7<q0 q0 Wq Wt | ƒ } t | ƒ d k r” t t | ƒ ƒ S| j	 ƒ  S(   s˜   
    Count the number of alternate conformations.  Sometimes this may not be
    the same for all residue groups, in which case a list is returned.
    i    R0   iÿÿÿÿi   (
   R(   R   R   R   RH   Ra   R=   Rc   Rd   t   pop(   R   t   all_n_confsR   R   t   all_n_confs_uniq(    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyR6   ×   s    c         C   s)   |  j  ƒ  } t | t ƒ r | St | ƒ S(   N(   R6   t
   isinstancet   intt   max(   R   R6   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyt   n_confs_maxç   s    c   	      C   sÊ   d } x½ |  j  D]² } x© | j ƒ  D]› } | j ƒ  } d } d } xR | j ƒ  D]D } | j j ƒ  d k rN | j d k rN | | j 7} | d 7} qN qN W| d k r# | | } t | | ƒ } q# q# Wq W| S(   Ng      ð?i    t   Ht   Di   (   Rr   Rs   (   R(   R   R   t   elementRH   R#   t   min(	   R   t   occ_minRB   R   t   ag_atomst   totalt   n_non_hdR\   t   occ_mean_ag(    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyt   minimum_atom_group_occupancyí   s    $
c         C   su   |  j  ƒ  } t | t ƒ s! t ‚ g  } xG t | d ƒ D]5 } | | d g } | j |  j d | d | ƒ ƒ q8 W| S(   Ni   t   conformer_indicesR   (   R6   Rn   Ro   RL   t   rangeR   t   get_conformer_distances(   R   R   R6   t   pairwise_distancest   i_conft   indices(    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyt   get_all_conformer_distancesý   s    c         C   s  g  } xø|  j  D]í} d } | j ƒ  } | t k rw | d j j ƒ  d k rn t | ƒ d k re q qt d } q� d } n t | ƒ d k s� t ‚ | j ƒ  | d } | j ƒ  | d } | j j ƒ  d k r!| d d k r!t | ƒ d k r!| j ƒ  | d d } | j ƒ  | d d } n  xÙ | j ƒ  D]Ë }	 |	 j j ƒ  }
 |	 j	 j
 ƒ  j ƒ  } | d k rjq.n  | d k	 r¤| rˆ|
 d k s.| r¤|
 d k r¤q.q¤n  xR | j ƒ  D]D } |	 j | j k r±| j t t |	 j ƒ t | j ƒ ƒ ƒ q±q±Wq.Wq W| S(   s�   
    Calculate the distances between atoms in the specified pair of conformers
    (must be present for all residue groups).
    i    R0   i   i   i   Rr   Rs   t   Ct   CAt   Nt   O(   i   i   (   i    i   (   Rr   Rs   N(   Rƒ   R„   R…   R†   (   Rƒ   R„   R…   R†   (   R(   R   R   R   RH   R=   RL   R   RN   Rt   Rb   R8   R   RP   R   RO   (   R   R|   R   t	   distancesRB   t   i_agR   t   ag1t   ag2t   atom1RN   Rt   t   atom2(    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyR~     s>    			8c         C   sq   |  j  d | ƒ } g  } x6 | D]. } t | ƒ d k r | j t | ƒ ƒ q q Wt | ƒ d k rm t | ƒ Sd  S(   NR   i    (   R‚   R=   R   Rp   R8   (   R   R   t   paired_distancest
   paired_maxR‡   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyt   max_distance_between_conformers6  s    
c         C   sœ   |  j  d | ƒ } d  } x} | D]u } t | ƒ d k r= q n  t j t g  | D] } | d ^ qM ƒ t | ƒ ƒ } | d  k s‹ | | k r | } q q W| S(   NR   i    i   (   R‚   R8   R=   t   matht   sqrtt   sum(   R   R   R�   t   rmsd_maxR‡   t   dxyzt   rmsd(    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyt   max_rmsd_between_conformers@  s    6c         C   s  xú |  j  D]ï } g  |  j | j ƒ  <g  |  j | j ƒ  <g  |  j | j ƒ  <| j | ƒ } xž | j D]“ } | j ƒ  r‘ |  j | j ƒ  j | ƒ n  t | ƒ j	 d k rÃ |  j | j ƒ  j | ƒ qb t | ƒ j	 d k rb |  j | j ƒ  j | ƒ qb qb Wq
 Wd S(   sˆ   
    Find the matching validation result objects from the multi-criterion
    object (see mmtbx/validation/molprobity/__init__.py).
    t   rotamerR+   N(
   R(   R)   R   R*   R+   t   get_residue_group_datat
   is_outlierR   R?   R   (   R   t   multi_criterionRB   t   resultst   result(    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyt   extract_validation_resultsK  s    c         C   sÎ   d } xÁ |  j  D]¶ } t g  | j ƒ  D] } | j j ƒ  ^ q& ƒ } t | ƒ d k r\ q n* | d  k	 r† | j ƒ  | j ƒ  k r† q n  t |  j j	 | j
 ƒ  g  ƒ ƒ } t | ƒ d k r | d 7} q q W| S(   Ni    i   (   R(   Ra   R   R   Rb   R=   R8   Rk   R*   R9   R   (   R   R   t	   n_changesRB   R   Rf   R*   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyt   n_rotamer_changes]  s    .$!i–   c         C   sR   g  } xE |  j  D]: } t | ƒ } | | k r | j | j ƒ  | f ƒ q q W| S(   N(   R(   t   carbonyl_oxygen_angleR   R   (   R   t   angle_cutofft   residues_and_anglesRB   t   peptide_angle(    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyt   find_peptide_flipsj  s     c         C   s   |  j  d d ƒ S(   Nt   analysis_typet   cbeta(   t   n_outliers_of_type(   R   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyt   n_cbeta_outliersr  s    c         C   sx   d } xk |  j  D]` } |  j j | j ƒ  g  ƒ } x< | D]4 } t | ƒ j | k r8 | j ƒ  r8 | d 7} q8 q8 Wq W| S(   Ni    i   (   R(   R)   R9   R   R?   R   R™   (   R   R¥   t
   n_outliersRB   R›   Rœ   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyR§   u  s    !N(   R   R   R   R   R/   t   syst   stdoutR>   RK   RM   R^   R-   Rg   R.   Rj   R6   Rq   R{   R8   R‚   R   R~   R�   R–   R�   RŸ   R¤   R¨   R§   (    (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyR'   =   s2   		&-						,
		c         C   s]   xV |  j  ƒ  D]H } | j j ƒ  d k r x* | j ƒ  D] } | j d k r5 t Sq5 Wq q Wt S(   NR0   s    CA (   R   R   RH   R   RN   RQ   RM   (   R   R   R\   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyt   is_joined_at_calpha€  s    c         C   s-  g  } x© |  j  ƒ  D]› } d } } xb | j ƒ  D]T } | j j ƒ  d k r] t | j ƒ } q0 | j j ƒ  d k r0 t | j ƒ } q0 q0 Wd | | g k r | j | | ƒ q q Wt | ƒ d k r)g  } d } xL | t | ƒ d k  r| j | | j	 | | d d t
 ƒƒ | d 7} qÓ Wt | ƒ Sd S(   sª   
  Calculate angles between carbonyl oxygen (C=O) bonds in each pair of atom
  groups, and return the maximum value (or None if fewer than two such bonds
  are found).
  R†   Rƒ   i   i    i   t   degN(   R   R8   R   RN   RH   R   RO   R   R=   t   angleRQ   Rp   (   R   t   c_o_vectorsR   t   c_xyzt   o_xyzR\   t   anglesRˆ   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyR    ˆ  s$    
(
c         C   sO   xH |  j  ƒ  D]: } | j ƒ  } | j j ƒ  d k r | j d k r t Sq Wt S(   sÜ   
  Detect cases where the only alternate conformation is for the amide hydrogen,
  presumably because the previous residue was split and Reduce was used to
  add hydrogens.  These residues are ignored in our analyses.
  R0   s    H  (   R   R   R   RH   RN   RM   RQ   (   R   R\   t   labels(    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyt   only_amide_hydrogen_split¡  s
    $c         C   s~   t  |  j ƒ  ƒ d k r! d } nY xV |  j ƒ  j ƒ  D]B } | j ƒ  r4 | j ƒ  } t  | ƒ | k rv t  | ƒ } qv q4 q4 W| S(   s4   
  Count the number of conformers in a structure.
  i   iÿÿÿÿ(   R=   t   modelst
   only_modelt   chainst
   is_proteint
   conformers(   t   pdb_hierarchyR6   t   chaint   confs(    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyt
   get_nconfs®  s    	t   process_residue_groupsc           B   s/   e  Z d e e j d  „ Z d e j d „ Z RS(   c   	      C   sí  g  |  _  | j |  _ d |  _ d |  _ i  |  _ i  |  _ | j ƒ  sK t ‚ d  } xe| j
 ƒ  D]W} |  j d 7_ | j ƒ  } | d j } | |  j k r« d |  j | <n  |  j | c d 7<t | ƒ d k r¯|  j d 7_ t | ƒ r| d | j ƒ  IJd  } q^ qµ| |  j k r*d |  j | <n  |  j | c d 7<| d  k rht | ƒ } |  j  j | ƒ qµ| j d | d | ƒ r�| j | ƒ qµt | ƒ } |  j  j | ƒ q^ d  } q^ W| d  k	 réx! |  j  D] } | j | ƒ qÏWn  d  S(   Ni    i   s)       residue %s only has alt. confs. for HRR   RS   (   t   segmentst   idt   chain_idt   n_residue_groupst   n_disorderedt   residue_countst   disordered_residue_countsR¸   RL   R8   R(   R   R   R=   R´   R   R'   R   R^   R-   R�   (	   R   R»   t   multi_criterion_validationRS   t   logt   segmentR   R   t	   resname_1(    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyR   ¾  sJ    						
R0   c         C   sV   | | d |  j  |  j |  j f IJx+ |  j D]  } | j d | d | d ƒ q. Wd  S(   Ns&   Chain '%s': %d residues, %d disorderedR4   R5   s     (   RÁ   RÂ   RÃ   R¿   R>   (   R   R5   R4   RÈ   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyR>   ì  s    
N(   R   R   R8   RM   Rª   R«   R   R>   (    (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyR¾   ½  s   +t   process_pdb_hierarchyc           B   sS   e  Z e e j d  „ Z e d „  ƒ Z d d „ Z	 d d „ Z
 e j e d „ Z RS(   c   	   
   C   sC  g  |  _  d |  _ d |  _ g  |  _ | j j |  _ | j j |  _ | j	 j |  _
 d  } | d  k	 rr | j ƒ  } n  xÊ | j ƒ  j  ƒ  D]¶ } | j ƒ  r*| d | j IJt d | d | d | d | ƒ } |  j  j | ƒ |  j | j 7_ |  j | j 7_ x; | j D] } |  j j | j ƒ  ƒ qWq… | d | j IJq… Wd  S(   Ni    s     processing chain '%s'R»   RÆ   RS   RÇ   s!     skipping non-protein chain '%s'(   R·   RÂ   RÃ   t   sequence_disordert   ramalyzeR©   t   n_rama_outlierst   rotalyzet   n_rota_outlierst   cbetadevR¨   R8   t   as_multi_criterion_viewR¶   R¸   RÀ   R¾   R   R¿   t   extendRg   (	   R   Rº   t
   validationRS   RÇ   RÆ   R»   t
   chain_infoRÈ   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyR   ó  s.    					c         c   s1   x* |  j  D] } x | j D] } | Vq Wq
 Wd  S(   N(   R·   R¿   (   R   R»   RÈ   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyR¿     s    c         C   sa   d  } } xJ |  j D]? } | j d | ƒ } | d  k sD | | k r | } | } q q W| | f S(   NR   (   R8   R¿   R–   (   R   R   R“   t   segment_maxRÈ   R•   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyR–     s    
c         C   sa   d  } } xJ |  j D]? } | j d | ƒ } | d  k sD | | k r | } | } q q W| | f S(   NR   (   R8   R¿   R�   (   R   R   t   dist_maxRÕ   RÈ   R]   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyR�      s    
c      	   C   s  | d IJ| d t  |  j ƒ IJ| d |  j IJ| d |  j t g  |  j D] } t  | j ƒ ^ qL ƒ f IJt  |  j ƒ d k rÏ | d t  |  j ƒ IJx2 |  j D]$ \ } } d | d j | ƒ f GHq¤ Wn  d } } } g  }	 xZ |  j D]O }
 | |
 j ƒ  7} | |
 j	 ƒ  7} | |
 j
 d	 t ƒ 7} |	 j |
 j ƒ  ƒ qí W| d
 | IJ| d k rk| d | IJn  | d k rˆ| d | IJn  t  |	 ƒ d k rÒ| d IJx+ |	 D]  \ } } | d | | f IJq«Wn  |  j ƒ  \ } } |  j d t ƒ \ } } | d  k	 st ‚ | d IJ| d | | f IJ| d  k	 rO| d | | f IJn  |  j ƒ  \ } } |  j d t ƒ \ } } | d  k	 s‹t ‚ | d IJ| d | | f IJ| d  k	 rÌ| d | | f IJn  | rùx. |  j D] } | j d | ƒ qÜWn
 | d IJ| d IJd  S(   NR0   s   Overall: %d protein chain(s)s            %d residuess$            %d disorered in %d segmentsi    s   %d heterogeneous residues:s	     %s (%s)t   ,Rh   s-   %d disordered residues have multiple rotamerss1   %d disordered residues have a single C-alpha atoms-   %d disordered residues have C-beta deviationss   %d apparent peptide flips:s     %s (angle=%.1f)R   s   Max. RMSD between conformers:s     %6.3f (%s) [all non-H atoms]s     %6.3f (%s) [backbone only]s!   Max. distance between conformers:R4   s/   Run with --verbose to show per-residue results.(   R=   R·   RÂ   RÃ   R’   R¿   RË   t   joinRŸ   R¨   Rj   RQ   RÒ   R¤   R–   R8   RL   R�   R>   (   R   R4   t   verboset   ct   rg_idRf   RŸ   t   n_cbeta_devRj   t   peptide_flipsRÈ   t   residue_id_strR®   R“   RÕ   t   rmsd_mc_maxt   segment_mc_maxRÖ   t   dist_mc_maxR»   (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyR>   )  sf    
/


	

	


N(   R   R   RM   Rª   R«   R   t   propertyR¿   R8   R–   R�   RQ   R>   (    (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyRÊ   ò  s   		(   t
   __future__R    t   mmtbx.disorderR   t   scitbx.array_familyR   t   scitbx.matrixR   t   libtbx.str_utilsR   R;   t   libtbxR   R   R�   Rª   R   R   R   t   objectR'   R¬   R    R´   R½   R¾   RÊ   (    (    (    sJ   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/analyze_model.pyt   <module>   s$   ÿ D				5