ó
´™xTc           @   sè   d  Z  d d l m Z d d l m Z d d l Z d d l Z d „  Z d „  Z e	 d „ Z
 e	 d „ Z e	 d	 „ Z d
 e f d „  ƒ  YZ d d d d d „ Z d d d d d d „ Z d d d d d d „ Z e	 d „ Z d „  Z d S(   sX   
Tools for analyzing backbone motion in ensembles and statically disordered
structures.
iÿÿÿÿ(   t   division(   t   slots_getstate_setstateNc         C   s  |  j  ƒ  } g  } x! t | ƒ D] } | j g  ƒ q Wx¬ t |  j ƒ  ƒ D]˜ \ } } x‰ | j ƒ  D]{ } | j ƒ  sz qb n  x` | j ƒ  D]R } | j ƒ  } | j	 d ƒ }	 |	 d  k	 rÈ | | j |	 ƒ q‡ | | j d  ƒ q‡ Wqb WqI Wx0 | D]( }
 t |
 ƒ t | d ƒ k sì t ‚ qì W| S(   Nt   CAi    (   t   models_sizet   ranget   appendt	   enumeratet   modelst   chainst
   is_proteint   residue_groupst   only_atom_groupt   get_atomt   Nonet   lent   AssertionError(   t   pdb_hierarchyt   n_modelst   calphast   nt   i_modt   modelt   chaint   residue_groupt
   atom_groupt   c_alphat   calphas_model(    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/backbone.pyt   get_calphas   s"      &c   
      C   s  |  j  ƒ  } g  g | } xÊ t |  j ƒ  ƒ D]¶ \ } } x§ | j ƒ  D]™ } | j ƒ  s] qE n  x~ | j ƒ  D]p } | j ƒ  } | j d ƒ } | d  k r© | j d ƒ } n  | d  k	 rÉ | | j	 | ƒ qj | | j	 d  ƒ qj WqE Wq, Wx0 | D]( }	 t
 |	 ƒ t
 | d ƒ k sí t ‚ qí W| S(   Nt   CBt   2HAi    (   R   R   R   R   R	   R
   R   R   R   R   R   R   (
   R   R   t   cbetasR   R   R   R   R   t   c_betat   cbetas_model(    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/backbone.pyt
   get_cbetas!   s"     &c         C   sÎ   t  |  ƒ d k s t ‚ d d l m } | sB |  d t j }  n  | j |  ƒ } d } } xY t t  |  ƒ ƒ D]E } t | |  | ƒ d } | d k r¥ d | } n  | | | 7} qn Wt j	 | t  |  ƒ ƒ S(   Ni    iÿÿÿÿ(   t   flexi´   ih  g     €f@g     €v@(
   R   R   t   scitbx.array_familyR"   t   matht   pit   meanR   t   abst   sqrt(   t   tt   degR"   R&   t   at   sat   i(    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/backbone.pyt   circ_stddev4   s    
c         C   sŸ   t  |  ƒ d k s t ‚ d d l m } | rB t j |  d }  n  | j | j |  ƒ ƒ t  |  ƒ } | j | j |  ƒ ƒ t  |  ƒ } t j	 | d | d ƒ S(   Ni    iÿÿÿÿ(   R"   i´   i   (
   R   R   R#   R"   R$   R%   t   sumt   cost   sinR(   (   R)   R*   R"   t   sxt   sy(    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/backbone.pyt   circ_lenC   s    ""c         C   sŸ   t  |  ƒ d k s t ‚ d d l m } | rB t j |  d }  n  | j | j |  ƒ ƒ t  |  ƒ } | j | j |  ƒ ƒ t  |  ƒ } t j	 t j
 | | ƒ ƒ S(   Ni    iÿÿÿÿ(   R"   i´   (   R   R   R#   R"   R$   R%   R/   R0   R1   t   degreest   atan2(   R)   R*   R"   R2   R3   (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/backbone.pyt	   circ_meanL   s    ""t   backrub_residuec           B   s;   e  Z d  d d d d d g Z d „  Z e j d d „ Z RS(	   t   id_strR   t   j_modt   rmsdt   backrub_anglet   xyzc         C   sU   | j  ƒ  j  ƒ  } | j ƒ  |  _ | |  _ | |  _ | |  _ | |  _ | j |  _ d  S(   N(   t   parentR9   R   R:   R;   R<   R=   (   t   selft   calphaR   R:   R;   R<   R   (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/backbone.pyt   __init__W   s    				t    c         C   s.   | | d |  j  |  j |  j |  j f IJd  S(   Ns   backrub %s (%s,%s): angle=%.1f(   R9   R   R:   R<   (   R?   t   outt   prefix(    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/backbone.pyt   show`   s    
(   t   __name__t
   __module__t	   __slots__RA   t   syst   stdoutRE   (    (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/backbone.pyR8   U   s   		g      @gš™™™™™¹?g      $@c         C   s—  t  |  ƒ t  | ƒ k o# d k n s. t ‚ d  |  k sF d  | k rJ d  SxB t d d ƒ D]1 } |  | j |  | d ƒ } | | k rZ d  SqZ Wd d l m } d d l m }	 d d l	 m
 }
 d d  l } | j g  d d d	 d g D] } |  | j ^ qä ƒ } | j g  d d d	 d g D] } | | j ^ qƒ } |	 j d
 | d | ƒ } | j ƒ  } | j | ƒ } |
 | d ƒ |
 | d ƒ d } |
 |  d j ƒ } | j ƒ  | d j } |
 | d ƒ |
 | d ƒ d } | j j d | j | j | j | j g d t ƒ } | | k r“t | ƒ | k r“t  | ƒ d k rb|  d j ƒ  j | d j ƒ  j f } n  t d |  d d | d d | d d | d | ƒ Sd  S(   Ni   i    i   i   iÿÿÿÿ(   R"   (   t	   superpose(   t   coli   t   reference_sitest   other_sitesi   t   sitesR*   R@   R   R:   R;   R<   (   R   R   R   R   t   distanceR#   R"   t   scitbx.mathRK   t   scitbx.matrixRL   t   vec3_doubleR=   t   least_squares_fitt   other_sites_best_fitt   rms_differencet   rtR$   t   dihedral_anglet   elemst   TrueR'   t   fetch_labelst   altlocR8   (   t	   calphas_At	   calphas_Bt   labelst   max_calpha_sept
   rmsd_limitt   backrub_angle_limitt   k_rest   distR"   RK   RL   t   scitbxt   kt   sites_At   sites_Bt   lsq_fitt   sites_B_newR;   t   ca2t   ca3rt   ca3mt   ca4R<   (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/backbone.pyt   evaluate_backrub_pair_impld   sJ    .55		""	


c   	      C   sþ   |  | g j  d  ƒ d k s! t ‚ | d  k	 rL t d | d | d | d | ƒ Sg  } x¥ |  j ƒ  j ƒ  D]‘ } | j ƒ  s} qe n  | j ƒ  } xj | d d !D][ } | j ƒ  d k rµ q— n  t d | d | d | d | ƒ } | d  k	 r— | j	 | ƒ q— q— Wqe W| S(   Ni   R   R`   Ra   Rb   i   iþÿÿÿ(
   t   countR   R   t   find_ensemble_backrubst
   only_modelR   R	   R
   t   atom_groups_sizet   extend(	   R   R   R`   Ra   Rb   t   backrubsR   R
   t   br(    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/backbone.pyt   find_backrubs‘   s.    !	c            s!  |  | g j  d  ƒ d k s! t ‚ d d l m } d d l m } d d l m } d d  l } | d  k	 rˆ t	 | ƒ }  |  d  k rˆ g  Sn  |  j
 ƒ  ‰  t ˆ  ƒ }	 |	 d k s² t ‚ t |  ƒ }
 t |
 ƒ |	 k sÖ t ‚ g  } ‡  f d †  } x/t d t |
 d ƒ d ƒ D]} xt |	 d ƒ D]õ } xì t | d |	 ƒ D]× } g  t | d | d	 ƒ D] } |
 | | ^ qX} g  t | d | d	 ƒ D] } |
 | | ^ qŠ} d  | k r:d  | k r:t d
 | d | d | | | ƒ d | d | d | ƒ } | d  k	 r| j | ƒ qq:q:Wq Wq	W| S(   Ni   iÿÿÿÿ(   R"   (   RK   (   RL   c            s$   ˆ  |  j  j ƒ  ˆ  | j  j ƒ  f S(   N(   t   idt   strip(   R   R:   (   R   (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/backbone.pyt
   get_labelsÄ   s    i   i    i   R]   R^   R_   R`   Ra   Rb   (   Rp   R   R   R#   R"   RQ   RK   RR   RL   t   extract_backrub_residue_groupsR   R   R   R   Ro   R   (   R   R   R`   Ra   Rb   R"   RK   RL   Re   R   R   Ru   Rz   Rc   R   R:   Rf   t	   calphas_it	   calphas_jRv   (    (   R   sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/backbone.pyRq   ¯   s@    !$22	c         C   s~  d d  l  } |  j ƒ  } | j ƒ  j ƒ  } t | j ƒ  ƒ d k sH t ‚ | j ƒ  } d  } x~ t | ƒ D]p \ } } | |  k rg | d k  s¡ | t | ƒ d k r¥ d  Sg  t | d | d ƒ D] }	 | |	 ^ q½ } Pqg qg W| d  k	 sí t ‚ | j	 j
 j ƒ  } | j	 j
 j ƒ  }
 | j |
 ƒ | j	 j
 j d | j ƒ } |
 j | ƒ x! | D] } | j | j ƒ  ƒ qMW| rzt | ƒ S| S(   Niÿÿÿÿi   i   i   Rx   (   t   iotbx.pdb.hierarchyR>   R   R   R   R
   R   R   R   t   pdbt	   hierarchyt   rootR   t   append_modelR   Rx   t   append_chaint   append_residue_groupt   detached_copyt*   alternate_conformations_as_multiple_models(   R   t   as_ensemblet   iotbxR   R�   R
   t   backrub_residuest   i_rest   other_rgRf   R   t	   new_chaint   rg(    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/backbone.pyR{   Ù   s.    ".
c            s  d d l  m } d d  l ‰  t ƒ  } xÊ |  j ƒ  j ƒ  D]¶ } | j ƒ  r^ | j ƒ  r^ q8 n  x� | j ƒ  D] ‰ ˆ j	 ƒ  } t
 | ƒ d k r» | d j j ƒ  d k r» | j ˆ ƒ q» n  | j t g  ˆ j	 ƒ  D] } | j ^ qÑ ƒ ƒ qk Wq8 Wd | k r| j d ƒ n  t
 | ƒ } | d k r*|  Sˆ  j j j ƒ  } t | ƒ } i  } xK t | ƒ D]= }	 ˆ  j j j d | |	 ƒ }
 |
 | | |	 <| j |
 ƒ q[Wxo|  j ƒ  j ƒ  D][} | j ƒ  rÕ| j ƒ  rÕq¯n  i  } xD | D]< } ˆ  j j j d | j ƒ } | | j | ƒ | | | <qâWxå | j ƒ  D]× ‰ ˆ j	 ƒ  } t
 | ƒ d k r~x° | D] } | | j ˆ j ƒ  ƒ qZWq/‡  ‡ f d †  } t ƒ  } x5 | D]- } | j } | | | | ƒ | j | ƒ q Wx2 | D]* } | | k rØ| | d | | ƒ qØqØWq/Wq¯W| S(   Niÿÿÿÿ(   t   altloc_remediatei   i    RB   Rx   c            sW   |  j  ƒ  } d | _ ˆ  j j j d ˆ j d ˆ j ƒ } | j | ƒ | j | ƒ d  S(   NRB   t   resseqt   icode(	   R…   R\   R   R€   R   R�   R�   t   append_atom_groupR„   (   t   agRŒ   t   new_agt   new_rg(   Rˆ   R   (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/backbone.pyt   add_atom_group  s    		(   t   mmtbx.command_lineRŽ   R~   t   setRr   R   R	   t   is_naR
   t   atom_groupsR   R\   Ry   t   spread_to_residuet   updatet   removeR   R€   R�   t   sortedR   R   R‚   R   Rx   Rƒ   R„   R…   t   add(   R   RŽ   t   altlocsR   R™   R+   t   n_confsR�   R   R   R   R   R\   RŒ   R•   t   have_altlocsR   (    (   Rˆ   R   sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/backbone.pyR†   ó   s^    	7 		$(    (   t   __doc__t
   __future__R    t   libtbxR   R$   RI   R   R!   RZ   R.   R4   R7   R8   Ro   R   Rw   Rq   R{   R†   (    (    (    sE   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/mmtbx/disorder/backbone.pyt   <module>   s4   				(&